Merge branch 'master' into trade
This commit is contained in:
@@ -92,7 +92,7 @@ const struct SpriteTemplate gUnknown_83D4EB4 =
|
||||
// arg 4: frame delay
|
||||
void AnimTask_ShakeMon(u8 taskId)
|
||||
{
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
|
||||
u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
|
||||
|
||||
if (spriteId == 0xFF)
|
||||
DestroyAnimVisualTask(taskId);
|
||||
@@ -150,7 +150,7 @@ void AnimTask_ShakeMon2(u8 taskId)
|
||||
|
||||
if (gBattleAnimArgs[0] < MAX_BATTLERS_COUNT)
|
||||
{
|
||||
spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
|
||||
spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
|
||||
if (spriteId == 0xFF)
|
||||
abort = TRUE;
|
||||
}
|
||||
@@ -228,7 +228,7 @@ static void AnimTask_ShakeMon2Step(u8 taskId)
|
||||
// arg 4: delay
|
||||
void AnimTask_ShakeMonInPlace(u8 taskId)
|
||||
{
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
|
||||
u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
|
||||
|
||||
if (spriteId == 0xFF)
|
||||
DestroyAnimVisualTask(taskId);
|
||||
@@ -290,7 +290,7 @@ static void AnimTask_ShakeMonInPlaceStep(u8 taskId)
|
||||
// arg 4: duration
|
||||
void AnimTask_ShakeAndSinkMon(u8 taskId)
|
||||
{
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
|
||||
u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
|
||||
|
||||
gSprites[spriteId].pos2.x = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[0] = spriteId;
|
||||
@@ -331,7 +331,7 @@ void AnimTask_TranslateMonElliptical(u8 taskId)
|
||||
{
|
||||
u8 wavePeriod = 1;
|
||||
u8 i;
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
|
||||
u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
|
||||
if (gBattleAnimArgs[4] > 5)
|
||||
gBattleAnimArgs[4] = 5;
|
||||
for (i = 0; i < gBattleAnimArgs[4]; i++)
|
||||
@@ -414,7 +414,7 @@ static void DoVerticalDip(struct Sprite * sprite)
|
||||
{
|
||||
u8 spriteId;
|
||||
sprite->invisible = TRUE;
|
||||
spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]);
|
||||
spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[2]);
|
||||
sprite->data[0] = gBattleAnimArgs[0];
|
||||
sprite->data[1] = 0;
|
||||
sprite->data[2] = gBattleAnimArgs[1];
|
||||
@@ -581,7 +581,7 @@ void AnimTask_WindUpLunge(u8 taskId)
|
||||
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
|
||||
gBattleAnimArgs[5] = -gBattleAnimArgs[5];
|
||||
}
|
||||
gTasks[taskId].data[0] = GetAnimBankSpriteId(gBattleAnimArgs[0]);
|
||||
gTasks[taskId].data[0] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[1] * 256 / gBattleAnimArgs[3];
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].data[3] = gBattleAnimArgs[3];
|
||||
@@ -627,7 +627,7 @@ void sub_80995FC(u8 taskId)
|
||||
{
|
||||
case 0:
|
||||
case 1:
|
||||
spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
|
||||
spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
|
||||
break;
|
||||
case 2:
|
||||
if (!IsBattlerSpriteVisible(gBattleAnimAttacker ^ BIT_FLANK))
|
||||
@@ -678,7 +678,7 @@ void AnimTask_SwayMon(u8 taskId)
|
||||
u8 spriteId;
|
||||
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
|
||||
spriteId = GetAnimBankSpriteId(gBattleAnimArgs[4]);
|
||||
spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[4]);
|
||||
gTasks[taskId].data[0] = gBattleAnimArgs[0];
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[2];
|
||||
@@ -735,7 +735,7 @@ static void AnimTask_SwayMonStep(u8 taskId)
|
||||
// arg 4: sprite object mode
|
||||
void AnimTask_ScaleMonAndRestore(u8 taskId)
|
||||
{
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[3]);
|
||||
u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[3]);
|
||||
PrepareBattlerSpriteForRotScale(spriteId, gBattleAnimArgs[4]);
|
||||
gTasks[taskId].data[0] = gBattleAnimArgs[0];
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[1];
|
||||
@@ -773,7 +773,7 @@ static void AnimTask_ScaleMonAndRestoreStep(u8 taskId)
|
||||
|
||||
void sub_8099980(u8 taskId)
|
||||
{
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]);
|
||||
u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[2]);
|
||||
PrepareBattlerSpriteForRotScale(spriteId, 0);
|
||||
gTasks[taskId].data[1] = 0;
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[0];
|
||||
@@ -806,7 +806,7 @@ void sub_8099980(u8 taskId)
|
||||
|
||||
void sub_8099A78(u8 taskId)
|
||||
{
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]);
|
||||
u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[2]);
|
||||
PrepareBattlerSpriteForRotScale(spriteId, 0);
|
||||
gTasks[taskId].data[1] = 0;
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[0];
|
||||
@@ -844,7 +844,7 @@ static void sub_8099B54(u8 taskId)
|
||||
gTasks[taskId].data[3] += gTasks[taskId].data[4];
|
||||
SetSpriteRotScale(gTasks[taskId].data[5], 0x100, 0x100, gTasks[taskId].data[3]);
|
||||
if (gTasks[taskId].data[7])
|
||||
sub_80759DC(gTasks[taskId].data[5]);
|
||||
SetBattlerSpriteYOffsetFromRotation(gTasks[taskId].data[5]);
|
||||
if (++gTasks[taskId].data[1] >= gTasks[taskId].data[2])
|
||||
{
|
||||
switch (gTasks[taskId].data[6])
|
||||
@@ -888,7 +888,7 @@ void sub_8099BD4(u8 taskId)
|
||||
gTasks[taskId].data[12] = 0;
|
||||
gTasks[taskId].data[10] = gBattleAnimArgs[3];
|
||||
gTasks[taskId].data[11] = gBattleAnimArgs[4];
|
||||
gTasks[taskId].data[7] = GetAnimBankSpriteId(1);
|
||||
gTasks[taskId].data[7] = GetAnimBattlerSpriteId(1);
|
||||
gTasks[taskId].data[8] = gSprites[gTasks[taskId].data[7]].pos2.x;
|
||||
gTasks[taskId].data[9] = gSprites[gTasks[taskId].data[7]].pos2.y;
|
||||
gTasks[taskId].data[0] = 0;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,313 @@
|
||||
#include "global.h"
|
||||
#include "battle.h"
|
||||
#include "battle_anim.h"
|
||||
#include "sound.h"
|
||||
#include "task.h"
|
||||
#include "constants/battle_anim.h"
|
||||
#include "constants/species.h"
|
||||
|
||||
static void sub_80DCE78(u8 taskId);
|
||||
static void sub_80DCEE4(u8 taskId);
|
||||
static void sub_80DCFE8(u8 taskId);
|
||||
static void sub_80DD270(u8 taskId);
|
||||
static void sub_80DD390(u8 taskId);
|
||||
static void sub_80DD4D4(u8 taskId);
|
||||
|
||||
void sub_80DCE10(u8 taskId)
|
||||
{
|
||||
s8 pan1, pan2, panIncrement;
|
||||
|
||||
gTasks[taskId].data[0] = gBattleAnimArgs[0];
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[1];
|
||||
pan1 = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER);
|
||||
pan2 = BattleAnimAdjustPanning(SOUND_PAN_TARGET);
|
||||
panIncrement = CalculatePanIncrement(pan1, pan2, 2);
|
||||
gTasks[taskId].data[2] = pan1;
|
||||
gTasks[taskId].data[3] = pan2;
|
||||
gTasks[taskId].data[4] = panIncrement;
|
||||
gTasks[taskId].data[10] = 10;
|
||||
gTasks[taskId].func = sub_80DCE78;
|
||||
}
|
||||
|
||||
static void sub_80DCE78(u8 taskId)
|
||||
{
|
||||
s16 pan = gTasks[taskId].data[2];
|
||||
s8 panIncrement = gTasks[taskId].data[4];
|
||||
|
||||
if (++gTasks[taskId].data[11] == 111)
|
||||
{
|
||||
gTasks[taskId].data[10] = 5;
|
||||
gTasks[taskId].data[11] = 0;
|
||||
gTasks[taskId].func = sub_80DCEE4;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (++gTasks[taskId].data[10] == 11)
|
||||
{
|
||||
gTasks[taskId].data[10] = 0;
|
||||
PlaySE12WithPanning(gTasks[taskId].data[0], pan);
|
||||
}
|
||||
pan += panIncrement;
|
||||
gTasks[taskId].data[2] = KeepPanInRange(pan, panIncrement);
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80DCEE4(u8 taskId)
|
||||
{
|
||||
if (++gTasks[taskId].data[10] == 6)
|
||||
{
|
||||
s8 pan;
|
||||
|
||||
gTasks[taskId].data[10] = 0;
|
||||
pan = BattleAnimAdjustPanning(SOUND_PAN_TARGET);
|
||||
PlaySE12WithPanning(gTasks[taskId].data[1], pan);
|
||||
if (++gTasks[taskId].data[11] == 2)
|
||||
DestroyAnimSoundTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void mas_80DCF38(u8 taskId)
|
||||
{
|
||||
u16 songId = gBattleAnimArgs[0];
|
||||
s8 targetPan = gBattleAnimArgs[2];
|
||||
s8 panIncrement = gBattleAnimArgs[3];
|
||||
u8 r10 = gBattleAnimArgs[4];
|
||||
u8 r7 = gBattleAnimArgs[5];
|
||||
u8 r9 = gBattleAnimArgs[6];
|
||||
s8 sourcePan = BattleAnimAdjustPanning(gBattleAnimArgs[1]);
|
||||
|
||||
targetPan = BattleAnimAdjustPanning(targetPan);
|
||||
panIncrement = CalculatePanIncrement(sourcePan, targetPan, panIncrement);
|
||||
gTasks[taskId].data[0] = songId;
|
||||
gTasks[taskId].data[1] = sourcePan;
|
||||
gTasks[taskId].data[2] = targetPan;
|
||||
gTasks[taskId].data[3] = panIncrement;
|
||||
gTasks[taskId].data[4] = r10;
|
||||
gTasks[taskId].data[5] = r7;
|
||||
gTasks[taskId].data[6] = r9;
|
||||
gTasks[taskId].data[10] = 0;
|
||||
gTasks[taskId].data[11] = sourcePan;
|
||||
gTasks[taskId].data[12] = r9;
|
||||
gTasks[taskId].func = sub_80DCFE8;
|
||||
sub_80DCFE8(taskId);
|
||||
}
|
||||
|
||||
static void sub_80DCFE8(u8 taskId)
|
||||
{
|
||||
if (gTasks[taskId].data[12]++ == gTasks[taskId].data[6])
|
||||
{
|
||||
gTasks[taskId].data[12] = 0;
|
||||
PlaySE12WithPanning(gTasks[taskId].data[0], gTasks[taskId].data[11]);
|
||||
if (--gTasks[taskId].data[4] == 0)
|
||||
{
|
||||
DestroyAnimSoundTask(taskId);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (gTasks[taskId].data[10]++ == gTasks[taskId].data[5])
|
||||
{
|
||||
u16 dPan, oldPan;
|
||||
|
||||
gTasks[taskId].data[10] = 0;
|
||||
dPan = gTasks[taskId].data[3];
|
||||
oldPan = gTasks[taskId].data[11];
|
||||
gTasks[taskId].data[11] = dPan + oldPan;
|
||||
gTasks[taskId].data[11] = KeepPanInRange(gTasks[taskId].data[11], oldPan);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80DD06C(u8 taskId)
|
||||
{
|
||||
u16 species = SPECIES_NONE;
|
||||
u8 battlerId;
|
||||
s8 pan = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER);
|
||||
|
||||
// Get wanted battler.
|
||||
if (gBattleAnimArgs[0] == ANIM_ATTACKER)
|
||||
battlerId = gBattleAnimAttacker;
|
||||
else if (gBattleAnimArgs[0] == ANIM_TARGET)
|
||||
battlerId = gBattleAnimTarget;
|
||||
else if (gBattleAnimArgs[0] == ANIM_ATK_PARTNER)
|
||||
battlerId = BATTLE_PARTNER(gBattleAnimAttacker);
|
||||
else
|
||||
battlerId = BATTLE_PARTNER(gBattleAnimTarget);
|
||||
// Check if battler is visible.
|
||||
if ((gBattleAnimArgs[0] == ANIM_TARGET || gBattleAnimArgs[0] == ANIM_DEF_PARTNER)
|
||||
&& !IsBattlerSpriteVisible(battlerId))
|
||||
{
|
||||
DestroyAnimVisualTask(taskId);
|
||||
return;
|
||||
}
|
||||
if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)
|
||||
species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);
|
||||
else
|
||||
species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);
|
||||
if (species != SPECIES_NONE)
|
||||
PlayCry3(species, pan, 3);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80DD148(u8 taskId)
|
||||
{
|
||||
u16 species = SPECIES_NONE;
|
||||
u8 battlerId;
|
||||
s8 pan = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER);
|
||||
|
||||
// Get wanted battler.
|
||||
if (gBattleAnimArgs[0] == ANIM_ATTACKER)
|
||||
battlerId = gBattleAnimAttacker;
|
||||
else if (gBattleAnimArgs[0] == ANIM_TARGET)
|
||||
battlerId = gBattleAnimTarget;
|
||||
else if (gBattleAnimArgs[0] == ANIM_ATK_PARTNER)
|
||||
battlerId = BATTLE_PARTNER(gBattleAnimAttacker);
|
||||
else
|
||||
battlerId = BATTLE_PARTNER(gBattleAnimTarget);
|
||||
// Check if battler is visible.
|
||||
if ((gBattleAnimArgs[0] == ANIM_TARGET || gBattleAnimArgs[0] == ANIM_DEF_PARTNER)
|
||||
&& !IsBattlerSpriteVisible(battlerId))
|
||||
{
|
||||
DestroyAnimVisualTask(taskId);
|
||||
return;
|
||||
}
|
||||
if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)
|
||||
species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);
|
||||
else
|
||||
species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);
|
||||
gTasks[taskId].data[0] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[1] = species;
|
||||
gTasks[taskId].data[2] = pan;
|
||||
if (species != SPECIES_NONE)
|
||||
{
|
||||
if (gBattleAnimArgs[1] == TASK_NONE)
|
||||
PlayCry3(species, pan, 9);
|
||||
else
|
||||
PlayCry3(species, pan, 7);
|
||||
gTasks[taskId].func = sub_80DD270;
|
||||
}
|
||||
else
|
||||
{
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80DD270(u8 taskId)
|
||||
{
|
||||
u16 species = gTasks[taskId].data[1];
|
||||
s8 pan = gTasks[taskId].data[2];
|
||||
|
||||
if (gTasks[taskId].data[9] < 2)
|
||||
{
|
||||
++gTasks[taskId].data[9];
|
||||
}
|
||||
else if (gTasks[taskId].data[0] == TASK_NONE)
|
||||
{
|
||||
if (!IsCryPlaying())
|
||||
{
|
||||
PlayCry3(species, pan, 10);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
else if (!IsCryPlaying())
|
||||
{
|
||||
PlayCry3(species, pan, 8);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80DD2F4(u8 taskId)
|
||||
{
|
||||
if (gTasks[taskId].data[9] < 2)
|
||||
++gTasks[taskId].data[9];
|
||||
else if (!IsCryPlaying())
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80DD334(u8 taskId)
|
||||
{
|
||||
u16 species;
|
||||
s8 pan;
|
||||
|
||||
pan = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER);
|
||||
species = gAnimBattlerSpecies[gBattleAnimAttacker];
|
||||
gTasks[taskId].data[1] = species;
|
||||
gTasks[taskId].data[2] = pan;
|
||||
if (species != SPECIES_NONE)
|
||||
{
|
||||
PlayCry3(species, pan, 4);
|
||||
gTasks[taskId].func = sub_80DD390;
|
||||
}
|
||||
else
|
||||
{
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80DD390(u8 taskId)
|
||||
{
|
||||
|
||||
if (gTasks[taskId].data[9] < 2)
|
||||
{
|
||||
++gTasks[taskId].data[9];
|
||||
}
|
||||
else if (!IsCryPlaying())
|
||||
{
|
||||
u16 species = gTasks[taskId].data[1];
|
||||
s8 pan = gTasks[taskId].data[2];
|
||||
|
||||
PlayCry3(species, pan, 6);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80DD3DC(u8 taskId)
|
||||
{
|
||||
u16 songId = gBattleAnimArgs[0];
|
||||
s8 pan = BattleAnimAdjustPanning(gBattleAnimArgs[1]);
|
||||
|
||||
PlaySE1WithPanning(songId, pan);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80DD410(u8 taskId)
|
||||
{
|
||||
u16 songId = gBattleAnimArgs[0];
|
||||
s8 pan = BattleAnimAdjustPanning(gBattleAnimArgs[1]);
|
||||
|
||||
PlaySE2WithPanning(songId, pan);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80DD444(u8 taskId)
|
||||
{
|
||||
s8 targetPan = gBattleAnimArgs[1];
|
||||
s8 panIncrement = gBattleAnimArgs[2];
|
||||
u16 r9 = gBattleAnimArgs[3];
|
||||
s8 sourcePan = BattleAnimAdjustPanning(gBattleAnimArgs[0]);
|
||||
|
||||
targetPan = BattleAnimAdjustPanning(targetPan);
|
||||
panIncrement = CalculatePanIncrement(sourcePan, targetPan, panIncrement);
|
||||
gTasks[taskId].data[1] = sourcePan;
|
||||
gTasks[taskId].data[2] = targetPan;
|
||||
gTasks[taskId].data[3] = panIncrement;
|
||||
gTasks[taskId].data[5] = r9;
|
||||
gTasks[taskId].data[10] = 0;
|
||||
gTasks[taskId].data[11] = sourcePan;
|
||||
gTasks[taskId].func = sub_80DD4D4;
|
||||
sub_80DD4D4(taskId);
|
||||
}
|
||||
|
||||
static void sub_80DD4D4(u8 taskId)
|
||||
{
|
||||
u16 oldPan, panIncrement = gTasks[taskId].data[3];
|
||||
|
||||
if (gTasks[taskId].data[10]++ == gTasks[taskId].data[5])
|
||||
{
|
||||
gTasks[taskId].data[10] = 0;
|
||||
oldPan = gTasks[taskId].data[11];
|
||||
gTasks[taskId].data[11] = panIncrement + oldPan;
|
||||
gTasks[taskId].data[11] = KeepPanInRange(gTasks[taskId].data[11], oldPan);
|
||||
}
|
||||
gUnknown_2037F24 = gTasks[taskId].data[11];
|
||||
if (gTasks[taskId].data[11] == gTasks[taskId].data[2])
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
@@ -0,0 +1,946 @@
|
||||
#include "global.h"
|
||||
#include "battle.h"
|
||||
#include "battle_anim.h"
|
||||
#include "gpu_regs.h"
|
||||
#include "graphics.h"
|
||||
#include "malloc.h"
|
||||
#include "palette.h"
|
||||
#include "sound.h"
|
||||
#include "sprite.h"
|
||||
#include "task.h"
|
||||
#include "util.h"
|
||||
#include "constants/songs.h"
|
||||
|
||||
struct AnimStatsChangeData
|
||||
{
|
||||
u8 battler1;
|
||||
u8 battler2;
|
||||
u8 higherPriority;
|
||||
s16 data[8];
|
||||
u16 species;
|
||||
};
|
||||
|
||||
static void StartBlendAnimSpriteColor(u8 taskId, u32 selectedPalettes);
|
||||
static void AnimTask_BlendSpriteColor_Step2(u8 taskId);
|
||||
static void sub_80BAB78(u8 taskId);
|
||||
static void sub_80BABD0(u8 taskId);
|
||||
static void sub_80BACA8(struct Sprite *sprite);
|
||||
static void sub_80BAF38(u8 taskId);
|
||||
static void sub_80BB0D8(u8 taskId);
|
||||
static void sub_80BB2A0(u8 taskId);
|
||||
static void sub_80BB4B8(u8 taskId);
|
||||
static void sub_80BB6CC(u8 taskId);
|
||||
static void sub_80BB790(u32 selectedPalettes, u16 color);
|
||||
static void sub_80BB8A4(u8 taskId);
|
||||
static void sub_80BBC2C(u8 taskId);
|
||||
static void sub_80BC19C(u8 taskId);
|
||||
|
||||
static EWRAM_DATA struct AnimStatsChangeData *sAnimStatsChangeData = NULL;
|
||||
|
||||
static const u16 gUnknown_83E7CC8[] = { RGB(31, 31, 31) };
|
||||
const u8 gUnknown_83E7CCA[] = { REG_OFFSET_BG0CNT, REG_OFFSET_BG1CNT, REG_OFFSET_BG2CNT, REG_OFFSET_BG3CNT };
|
||||
const u8 gUnknown_83E7CCE[] = { REG_OFFSET_BG0CNT, REG_OFFSET_BG1CNT, REG_OFFSET_BG2CNT, REG_OFFSET_BG3CNT };
|
||||
|
||||
void sub_80BA7F8(u8 taskId)
|
||||
{
|
||||
u32 selectedPalettes = UnpackSelectedBattleAnimPalettes(gBattleAnimArgs[0]);
|
||||
|
||||
selectedPalettes |= sub_8075CB8((gBattleAnimArgs[0] >> 7) & 1,
|
||||
(gBattleAnimArgs[0] >> 8) & 1,
|
||||
(gBattleAnimArgs[0] >> 9) & 1,
|
||||
(gBattleAnimArgs[0] >> 10) & 1);
|
||||
StartBlendAnimSpriteColor(taskId, selectedPalettes);
|
||||
}
|
||||
|
||||
void sub_80BA83C(u8 taskId)
|
||||
{
|
||||
u8 battler;
|
||||
u32 selectedPalettes;
|
||||
u8 animBattlers[2];
|
||||
|
||||
animBattlers[1] = 0xFF;
|
||||
selectedPalettes = UnpackSelectedBattleAnimPalettes(1);
|
||||
switch (gBattleAnimArgs[0])
|
||||
{
|
||||
case 2:
|
||||
selectedPalettes = 0;
|
||||
// fall through
|
||||
case 0:
|
||||
animBattlers[0] = gBattleAnimAttacker;
|
||||
break;
|
||||
case 3:
|
||||
selectedPalettes = 0;
|
||||
// fall through
|
||||
case 1:
|
||||
animBattlers[0] = gBattleAnimTarget;
|
||||
break;
|
||||
case 4:
|
||||
animBattlers[0] = gBattleAnimAttacker;
|
||||
animBattlers[1] = gBattleAnimTarget;
|
||||
break;
|
||||
case 5:
|
||||
animBattlers[0] = 0xFF;
|
||||
break;
|
||||
case 6:
|
||||
selectedPalettes = 0;
|
||||
animBattlers[0] = BATTLE_PARTNER(gBattleAnimAttacker);
|
||||
break;
|
||||
case 7:
|
||||
selectedPalettes = 0;
|
||||
animBattlers[0] = BATTLE_PARTNER(gBattleAnimTarget);
|
||||
break;
|
||||
}
|
||||
for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler)
|
||||
{
|
||||
if (battler != animBattlers[0]
|
||||
&& battler != animBattlers[1]
|
||||
&& IsBattlerSpriteVisible(battler))
|
||||
selectedPalettes |= 0x10000 << sub_8075D80(battler);
|
||||
}
|
||||
StartBlendAnimSpriteColor(taskId, selectedPalettes);
|
||||
}
|
||||
|
||||
void AnimTask_SetCamouflageBlend(u8 taskId)
|
||||
{
|
||||
u32 selectedPalettes = UnpackSelectedBattleAnimPalettes(gBattleAnimArgs[0]);
|
||||
|
||||
switch (gBattleTerrain)
|
||||
{
|
||||
case BATTLE_TERRAIN_GRASS:
|
||||
gBattleAnimArgs[4] = RGB(12, 24, 2);
|
||||
break;
|
||||
case BATTLE_TERRAIN_LONG_GRASS:
|
||||
gBattleAnimArgs[4] = RGB(0, 15, 2);
|
||||
break;
|
||||
case BATTLE_TERRAIN_SAND:
|
||||
gBattleAnimArgs[4] = RGB(30, 24, 11);
|
||||
break;
|
||||
case BATTLE_TERRAIN_UNDERWATER:
|
||||
gBattleAnimArgs[4] = RGB(0, 0, 18);
|
||||
break;
|
||||
case BATTLE_TERRAIN_WATER:
|
||||
gBattleAnimArgs[4] = RGB(11, 22, 31);
|
||||
break;
|
||||
case BATTLE_TERRAIN_POND:
|
||||
gBattleAnimArgs[4] = RGB(11, 22, 31);
|
||||
break;
|
||||
case BATTLE_TERRAIN_MOUNTAIN:
|
||||
gBattleAnimArgs[4] = RGB(22, 16, 10);
|
||||
break;
|
||||
case BATTLE_TERRAIN_CAVE:
|
||||
gBattleAnimArgs[4] = RGB(14, 9, 3);
|
||||
break;
|
||||
case BATTLE_TERRAIN_BUILDING:
|
||||
gBattleAnimArgs[4] = RGB(31, 31, 31);
|
||||
break;
|
||||
case BATTLE_TERRAIN_PLAIN:
|
||||
gBattleAnimArgs[4] = RGB(31, 31, 31);
|
||||
break;
|
||||
}
|
||||
StartBlendAnimSpriteColor(taskId, selectedPalettes);
|
||||
}
|
||||
|
||||
void AnimTask_BlendParticle(u8 taskId)
|
||||
{
|
||||
u8 paletteIndex = IndexOfSpritePaletteTag(gBattleAnimArgs[0]);
|
||||
u32 selectedPalettes = 1 << (paletteIndex + 16);
|
||||
|
||||
StartBlendAnimSpriteColor(taskId, selectedPalettes);
|
||||
}
|
||||
|
||||
static void StartBlendAnimSpriteColor(u8 taskId, u32 selectedPalettes)
|
||||
{
|
||||
gTasks[taskId].data[0] = selectedPalettes;
|
||||
gTasks[taskId].data[1] = selectedPalettes >> 16;
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[3] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].data[4] = gBattleAnimArgs[3];
|
||||
gTasks[taskId].data[5] = gBattleAnimArgs[4];
|
||||
gTasks[taskId].data[10] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].func = AnimTask_BlendSpriteColor_Step2;
|
||||
gTasks[taskId].func(taskId);
|
||||
}
|
||||
|
||||
static void AnimTask_BlendSpriteColor_Step2(u8 taskId)
|
||||
{
|
||||
u32 selectedPalettes;
|
||||
u16 singlePaletteMask = 0;
|
||||
|
||||
if (gTasks[taskId].data[9] == gTasks[taskId].data[2])
|
||||
{
|
||||
gTasks[taskId].data[9] = 0;
|
||||
selectedPalettes = gTasks[taskId].data[0] | (gTasks[taskId].data[1] << 16);
|
||||
while (selectedPalettes)
|
||||
{
|
||||
if (selectedPalettes & 1)
|
||||
BlendPalette(singlePaletteMask, 16, gTasks[taskId].data[10], gTasks[taskId].data[5]);
|
||||
singlePaletteMask += 0x10;
|
||||
selectedPalettes >>= 1;
|
||||
}
|
||||
if (gTasks[taskId].data[10] < gTasks[taskId].data[4])
|
||||
++gTasks[taskId].data[10];
|
||||
else if (gTasks[taskId].data[10] > gTasks[taskId].data[4])
|
||||
--gTasks[taskId].data[10];
|
||||
else
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
else
|
||||
{
|
||||
++gTasks[taskId].data[9];
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80BAB38(u8 taskId)
|
||||
{
|
||||
BeginHardwarePaletteFade(gBattleAnimArgs[0],
|
||||
gBattleAnimArgs[1],
|
||||
gBattleAnimArgs[2],
|
||||
gBattleAnimArgs[3],
|
||||
gBattleAnimArgs[4]);
|
||||
gTasks[taskId].func = sub_80BAB78;
|
||||
}
|
||||
|
||||
static void sub_80BAB78(u8 taskId)
|
||||
{
|
||||
if (!gPaletteFade.active)
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80BAB98(u8 taskId)
|
||||
{
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
task->data[0] = gBattleAnimArgs[0];
|
||||
task->data[1] = 0;
|
||||
task->data[2] = gBattleAnimArgs[1];
|
||||
task->data[3] = gBattleAnimArgs[2];
|
||||
task->data[4] = gBattleAnimArgs[3];
|
||||
task->data[5] = 0;
|
||||
task->func = sub_80BABD0;
|
||||
}
|
||||
static void sub_80BABD0(u8 taskId)
|
||||
{
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
if (task->data[4])
|
||||
{
|
||||
if (task->data[1])
|
||||
{
|
||||
--task->data[1];
|
||||
}
|
||||
else
|
||||
{
|
||||
task->data[6] = CloneBattlerSpriteWithBlend(task->data[0]);
|
||||
if (task->data[6] >= 0)
|
||||
{
|
||||
gSprites[task->data[6]].oam.priority = task->data[0] ? 1 : 2;
|
||||
gSprites[task->data[6]].data[0] = task->data[3];
|
||||
gSprites[task->data[6]].data[1] = taskId;
|
||||
gSprites[task->data[6]].data[2] = 5;
|
||||
gSprites[task->data[6]].callback = sub_80BACA8;
|
||||
++task->data[5];
|
||||
}
|
||||
--task->data[4];
|
||||
task->data[1] = task->data[2];
|
||||
}
|
||||
}
|
||||
else if (task->data[5] == 0)
|
||||
{
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80BACA8(struct Sprite *sprite)
|
||||
{
|
||||
if (sprite->data[0])
|
||||
{
|
||||
--sprite->data[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
--gTasks[sprite->data[1]].data[sprite->data[2]];
|
||||
obj_delete_but_dont_free_vram(sprite);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80BACEC(u8 taskId)
|
||||
{
|
||||
u16 species;
|
||||
s32 newSpriteId;
|
||||
u16 var0;
|
||||
u16 bg1Cnt;
|
||||
u8 spriteId;
|
||||
struct BattleAnimBgData animBgData;
|
||||
|
||||
var0 = 0;
|
||||
gBattle_WIN0H = 0;
|
||||
gBattle_WIN0V = 0;
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR
|
||||
| WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR
|
||||
| WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);
|
||||
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON);
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 12));
|
||||
bg1Cnt = GetGpuReg(REG_OFFSET_BG1CNT);
|
||||
((struct BgCnt *)&bg1Cnt)->priority = 0;
|
||||
((struct BgCnt *)&bg1Cnt)->screenSize = 0;
|
||||
SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt);
|
||||
if (!IsContest())
|
||||
{
|
||||
((struct BgCnt *)&bg1Cnt)->charBaseBlock = 1;
|
||||
SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt);
|
||||
}
|
||||
if (IsDoubleBattle() && !IsContest())
|
||||
{
|
||||
if (GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_OPPONENT_RIGHT
|
||||
|| GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_PLAYER_LEFT)
|
||||
{
|
||||
if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)) == TRUE)
|
||||
{
|
||||
gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority -= 1;
|
||||
((struct BgCnt *)&bg1Cnt)->priority = 1;
|
||||
SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt);
|
||||
var0 = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES);
|
||||
else
|
||||
species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES);
|
||||
spriteId = GetAnimBattlerSpriteId(0);
|
||||
newSpriteId = sub_8076E34(gBattleAnimAttacker, spriteId, species);
|
||||
sub_80752A0(&animBgData);
|
||||
AnimLoadCompressedBgTilemap(animBgData.bgId, gFile_graphics_battle_anims_masks_curse_tilemap);
|
||||
if (IsContest())
|
||||
sub_80730C0(animBgData.paletteId, animBgData.bgTilemap, 0, 0);
|
||||
AnimLoadCompressedBgGfx(animBgData.bgId, gFile_graphics_battle_anims_masks_curse_sheet, animBgData.tilesOffset);
|
||||
LoadPalette(gUnknown_83E7CC8, animBgData.paletteId * 16 + 1, 2);
|
||||
gBattle_BG1_X = -gSprites[spriteId].pos1.x + 32;
|
||||
gBattle_BG1_Y = -gSprites[spriteId].pos1.y + 32;
|
||||
gTasks[taskId].data[0] = newSpriteId;
|
||||
gTasks[taskId].data[6] = var0;
|
||||
gTasks[taskId].func = sub_80BAF38;
|
||||
}
|
||||
|
||||
static void sub_80BAF38(u8 taskId)
|
||||
{
|
||||
struct BattleAnimBgData animBgData;
|
||||
struct Sprite *sprite;
|
||||
u16 bg1Cnt;
|
||||
|
||||
gTasks[taskId].data[10] += 4;
|
||||
gBattle_BG1_Y -= 4;
|
||||
if (gTasks[taskId].data[10] == 64)
|
||||
{
|
||||
gTasks[taskId].data[10] = 0;
|
||||
gBattle_BG1_Y += 64;
|
||||
if (++gTasks[taskId].data[11] == 4)
|
||||
{
|
||||
sub_8073128(0);
|
||||
gBattle_WIN0H = 0;
|
||||
gBattle_WIN0V = 0;
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR
|
||||
| WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR
|
||||
| WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);
|
||||
if (!IsContest())
|
||||
{
|
||||
bg1Cnt = GetGpuReg(REG_OFFSET_BG1CNT);
|
||||
((struct BgCnt *)&bg1Cnt)->charBaseBlock = 0;
|
||||
SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt);
|
||||
}
|
||||
SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON);
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, 0);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
|
||||
sprite = &gSprites[GetAnimBattlerSpriteId(0)]; // unused
|
||||
sprite = &gSprites[gTasks[taskId].data[0]];
|
||||
DestroySprite(sprite);
|
||||
sub_80752A0(&animBgData);
|
||||
sub_8075358(animBgData.bgId);
|
||||
if (gTasks[taskId].data[6] == 1)
|
||||
++gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority;
|
||||
gBattle_BG1_Y = 0;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80BB088(u8 taskId)
|
||||
{
|
||||
u8 i;
|
||||
|
||||
sAnimStatsChangeData = AllocZeroed(sizeof(struct AnimStatsChangeData));
|
||||
for (i = 0; i < 8; ++i)
|
||||
sAnimStatsChangeData->data[i] = gBattleAnimArgs[i];
|
||||
gTasks[taskId].func = sub_80BB0D8;
|
||||
}
|
||||
|
||||
static void sub_80BB0D8(u8 taskId)
|
||||
{
|
||||
if (sAnimStatsChangeData->data[2] == 0)
|
||||
sAnimStatsChangeData->battler1 = gBattleAnimAttacker;
|
||||
else
|
||||
sAnimStatsChangeData->battler1 = gBattleAnimTarget;
|
||||
sAnimStatsChangeData->battler2 = BATTLE_PARTNER(sAnimStatsChangeData->battler1);
|
||||
if (IsContest() || (sAnimStatsChangeData->data[3] && !IsBattlerSpriteVisible(sAnimStatsChangeData->battler2)))
|
||||
sAnimStatsChangeData->data[3] = 0;
|
||||
gBattle_WIN0H = 0;
|
||||
gBattle_WIN0V = 0;
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR
|
||||
| WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR
|
||||
| WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);
|
||||
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON);
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));
|
||||
SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 0);
|
||||
SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0);
|
||||
if (!IsContest())
|
||||
SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);
|
||||
if (IsDoubleBattle() && sAnimStatsChangeData->data[3] == 0)
|
||||
{
|
||||
if (GetBattlerPosition(sAnimStatsChangeData->battler1) == B_POSITION_OPPONENT_RIGHT
|
||||
|| GetBattlerPosition(sAnimStatsChangeData->battler1) == B_POSITION_PLAYER_LEFT)
|
||||
{
|
||||
if (IsBattlerSpriteVisible(sAnimStatsChangeData->battler2) == TRUE)
|
||||
{
|
||||
gSprites[gBattlerSpriteIds[sAnimStatsChangeData->battler2]].oam.priority -= 1;
|
||||
SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
|
||||
sAnimStatsChangeData->higherPriority = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (GetBattlerSide(sAnimStatsChangeData->battler1) != B_SIDE_PLAYER)
|
||||
sAnimStatsChangeData->species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[sAnimStatsChangeData->battler1]], MON_DATA_SPECIES);
|
||||
else
|
||||
sAnimStatsChangeData->species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[sAnimStatsChangeData->battler1]], MON_DATA_SPECIES);
|
||||
gTasks[taskId].func = sub_80BB2A0;
|
||||
}
|
||||
|
||||
static void sub_80BB2A0(u8 taskId)
|
||||
{
|
||||
struct BattleAnimBgData animBgData;
|
||||
u8 spriteId, newSpriteId = 0;
|
||||
u8 battlerSpriteId;
|
||||
|
||||
battlerSpriteId = gBattlerSpriteIds[sAnimStatsChangeData->battler1];
|
||||
spriteId = sub_8076E34(sAnimStatsChangeData->battler1, battlerSpriteId, sAnimStatsChangeData->species);
|
||||
if (sAnimStatsChangeData->data[3])
|
||||
{
|
||||
battlerSpriteId = gBattlerSpriteIds[sAnimStatsChangeData->battler2];
|
||||
newSpriteId = sub_8076E34(sAnimStatsChangeData->battler2, battlerSpriteId, sAnimStatsChangeData->species);
|
||||
}
|
||||
sub_80752A0(&animBgData);
|
||||
if (sAnimStatsChangeData->data[0] == 0)
|
||||
AnimLoadCompressedBgTilemap(animBgData.bgId, gBattleStatMask1_Tilemap);
|
||||
else
|
||||
AnimLoadCompressedBgTilemap(animBgData.bgId, gBattleStatMask2_Tilemap);
|
||||
if (IsContest())
|
||||
sub_80730C0(animBgData.paletteId, animBgData.bgTilemap, 0, 0);
|
||||
AnimLoadCompressedBgGfx(animBgData.bgId, gBattleStatMask_Gfx, animBgData.tilesOffset);
|
||||
switch (sAnimStatsChangeData->data[1])
|
||||
{
|
||||
case 0:
|
||||
LoadCompressedPalette(gBattleStatMask2_Pal, animBgData.paletteId * 16, 32);
|
||||
break;
|
||||
case 1:
|
||||
LoadCompressedPalette(gBattleStatMask1_Pal, animBgData.paletteId * 16, 32);
|
||||
break;
|
||||
case 2:
|
||||
LoadCompressedPalette(gBattleStatMask3_Pal, animBgData.paletteId * 16, 32);
|
||||
break;
|
||||
case 3:
|
||||
LoadCompressedPalette(gBattleStatMask4_Pal, animBgData.paletteId * 16, 32);
|
||||
break;
|
||||
case 4:
|
||||
LoadCompressedPalette(gBattleStatMask6_Pal, animBgData.paletteId * 16, 32);
|
||||
break;
|
||||
case 5:
|
||||
LoadCompressedPalette(gBattleStatMask7_Pal, animBgData.paletteId * 16, 32);
|
||||
break;
|
||||
case 6:
|
||||
LoadCompressedPalette(gBattleStatMask8_Pal, animBgData.paletteId * 16, 32);
|
||||
break;
|
||||
default:
|
||||
LoadCompressedPalette(gBattleStatMask5_Pal, animBgData.paletteId * 16, 32);
|
||||
break;
|
||||
}
|
||||
gBattle_BG1_X = 0;
|
||||
gBattle_BG1_Y = 0;
|
||||
if (sAnimStatsChangeData->data[0] == 1)
|
||||
{
|
||||
gBattle_BG1_X = 64;
|
||||
gTasks[taskId].data[1] = -3;
|
||||
}
|
||||
else
|
||||
{
|
||||
gTasks[taskId].data[1] = 3;
|
||||
}
|
||||
|
||||
if (sAnimStatsChangeData->data[4] == 0)
|
||||
{
|
||||
gTasks[taskId].data[4] = 10;
|
||||
gTasks[taskId].data[5] = 20;
|
||||
}
|
||||
else
|
||||
{
|
||||
gTasks[taskId].data[4] = 13;
|
||||
gTasks[taskId].data[5] = 30;
|
||||
}
|
||||
gTasks[taskId].data[0] = spriteId;
|
||||
gTasks[taskId].data[2] = sAnimStatsChangeData->data[3];
|
||||
gTasks[taskId].data[3] = newSpriteId;
|
||||
gTasks[taskId].data[6] = sAnimStatsChangeData->higherPriority;
|
||||
gTasks[taskId].data[7] = gBattlerSpriteIds[sAnimStatsChangeData->battler2];
|
||||
gTasks[taskId].func = sub_80BB4B8;
|
||||
if (sAnimStatsChangeData->data[0] == 0)
|
||||
PlaySE12WithPanning(SE_W287, BattleAnimAdjustPanning2(PAN_SIDE_PLAYER));
|
||||
else
|
||||
PlaySE12WithPanning(SE_W287B, BattleAnimAdjustPanning2(PAN_SIDE_PLAYER));
|
||||
}
|
||||
|
||||
static void sub_80BB4B8(u8 taskId)
|
||||
{
|
||||
gBattle_BG1_Y += gTasks[taskId].data[1];
|
||||
switch (gTasks[taskId].data[15])
|
||||
{
|
||||
case 0:
|
||||
if (gTasks[taskId].data[11]++ > 0)
|
||||
{
|
||||
gTasks[taskId].data[11] = 0;
|
||||
++gTasks[taskId].data[12];
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[12], 16 - gTasks[taskId].data[12]));
|
||||
if (gTasks[taskId].data[12] == gTasks[taskId].data[4])
|
||||
++gTasks[taskId].data[15];
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (++gTasks[taskId].data[10] == gTasks[taskId].data[5])
|
||||
++gTasks[taskId].data[15];
|
||||
break;
|
||||
case 2:
|
||||
if (gTasks[taskId].data[11]++ > 0)
|
||||
{
|
||||
gTasks[taskId].data[11] = 0;
|
||||
--gTasks[taskId].data[12];
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[12], 16 - gTasks[taskId].data[12]));
|
||||
if (gTasks[taskId].data[12] == 0)
|
||||
{
|
||||
sub_8073128(0);
|
||||
++gTasks[taskId].data[15];
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
gBattle_WIN0H = 0;
|
||||
gBattle_WIN0V = 0;
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR
|
||||
| WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR
|
||||
| WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);
|
||||
if (!IsContest())
|
||||
SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0);
|
||||
SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON);
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, 0);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
|
||||
DestroySprite(&gSprites[gTasks[taskId].data[0]]);
|
||||
if (gTasks[taskId].data[2])
|
||||
DestroySprite(&gSprites[gTasks[taskId].data[3]]);
|
||||
if (gTasks[taskId].data[6] == 1)
|
||||
++gSprites[gTasks[taskId].data[7]].oam.priority;
|
||||
Free(sAnimStatsChangeData);
|
||||
sAnimStatsChangeData = NULL;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80BB660(u8 taskId)
|
||||
{
|
||||
u32 selectedPalettes = sub_8075CB8(1, 1, 1, 1);
|
||||
|
||||
sub_80BB790(selectedPalettes, 0);
|
||||
gTasks[taskId].data[14] = selectedPalettes >> 16;
|
||||
selectedPalettes = sub_8075BE8(1, 0, 0, 0, 0, 0, 0) & 0xFFFF;
|
||||
sub_80BB790(selectedPalettes, 0xFFFF);
|
||||
gTasks[taskId].data[15] = selectedPalettes;
|
||||
gTasks[taskId].data[0] = 0;
|
||||
gTasks[taskId].data[1] = 0;
|
||||
gTasks[taskId].func = sub_80BB6CC;
|
||||
}
|
||||
|
||||
static void sub_80BB6CC(u8 taskId)
|
||||
{
|
||||
u16 i;
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
switch (task->data[0])
|
||||
{
|
||||
case 0:
|
||||
if (++task->data[1] > 6)
|
||||
{
|
||||
task->data[1] = 0;
|
||||
task->data[2] = 16;
|
||||
++task->data[0];
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (++task->data[1] > 1)
|
||||
{
|
||||
task->data[1] = 0;
|
||||
--task->data[2];
|
||||
for (i = 0; i < 16; ++i)
|
||||
{
|
||||
if ((task->data[15] >> i) & 1)
|
||||
{
|
||||
u16 paletteOffset = i * 16;
|
||||
BlendPalette(paletteOffset, 16, task->data[2], 0xFFFF);
|
||||
}
|
||||
|
||||
if ((task->data[14] >> i) & 1)
|
||||
{
|
||||
u16 paletteOffset = i * 16 + 0x100;
|
||||
BlendPalette(paletteOffset, 16, task->data[2], 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (task->data[2] == 0)
|
||||
++task->data[0];
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
DestroyAnimVisualTask(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80BB790(u32 selectedPalettes, u16 color)
|
||||
{
|
||||
u16 i, curOffset, paletteOffset;
|
||||
|
||||
for (i = 0; i < 32; selectedPalettes >>= 1, ++i)
|
||||
if (selectedPalettes & 1)
|
||||
for (curOffset = i * 16, paletteOffset = curOffset; curOffset < paletteOffset + 16; ++curOffset)
|
||||
gPlttBufferFaded[curOffset] = color;
|
||||
}
|
||||
|
||||
void sub_80BB7DC(u8 taskId)
|
||||
{
|
||||
s32 j;
|
||||
u32 battler, selectedPalettes = 0;
|
||||
|
||||
for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler)
|
||||
if (gBattleAnimAttacker != battler)
|
||||
selectedPalettes |= 1 << (battler + 16);
|
||||
for (j = 5; j != 0; --j)
|
||||
gBattleAnimArgs[j] = gBattleAnimArgs[j - 1];
|
||||
StartBlendAnimSpriteColor(taskId, selectedPalettes);
|
||||
}
|
||||
|
||||
void sub_80BB82C(u8 taskId)
|
||||
{
|
||||
u8 newTaskId;
|
||||
|
||||
sub_8075458(0);
|
||||
newTaskId = CreateTask(sub_80BB8A4, 5);
|
||||
if (gBattleAnimArgs[2] && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
{
|
||||
gBattleAnimArgs[0] = -gBattleAnimArgs[0];
|
||||
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
|
||||
}
|
||||
gTasks[newTaskId].data[1] = gBattleAnimArgs[0];
|
||||
gTasks[newTaskId].data[2] = gBattleAnimArgs[1];
|
||||
gTasks[newTaskId].data[3] = gBattleAnimArgs[3];
|
||||
++gTasks[newTaskId].data[0];
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
static void sub_80BB8A4(u8 taskId)
|
||||
{
|
||||
gTasks[taskId].data[10] += gTasks[taskId].data[1];
|
||||
gTasks[taskId].data[11] += gTasks[taskId].data[2];
|
||||
gBattle_BG3_X += gTasks[taskId].data[10] >> 8;
|
||||
gBattle_BG3_Y += gTasks[taskId].data[11] >> 8;
|
||||
gTasks[taskId].data[10] &= 0xFF;
|
||||
gTasks[taskId].data[11] &= 0xFF;
|
||||
if (gBattleAnimArgs[7] == gTasks[taskId].data[3])
|
||||
{
|
||||
gBattle_BG3_X = 0;
|
||||
gBattle_BG3_Y = 0;
|
||||
sub_8075458(1);
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void AnimTask_GetAttackerSide(u8 taskId)
|
||||
{
|
||||
gBattleAnimArgs[7] = GetBattlerSide(gBattleAnimAttacker);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void AnimTask_GetTargetSide(u8 taskId)
|
||||
{
|
||||
gBattleAnimArgs[7] = GetBattlerSide(gBattleAnimTarget);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void AnimTask_GetTargetIsAttackerPartner(u8 taskId)
|
||||
{
|
||||
gBattleAnimArgs[7] = BATTLE_PARTNER(gBattleAnimAttacker) == gBattleAnimTarget;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80BB9B0(u8 taskId)
|
||||
{
|
||||
u16 battler;
|
||||
|
||||
for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler)
|
||||
if (battler != gBattleAnimAttacker && IsBattlerSpriteVisible(battler))
|
||||
gSprites[gBattlerSpriteIds[battler]].invisible = gBattleAnimArgs[0];
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80BBA20(u8 taskId, s32 unused, u16 arg2, u8 battler1, u8 arg4, u8 arg5, u8 arg6, u8 arg7, const u32 *gfx, const u32 *tilemap, const u32 *palette)
|
||||
{
|
||||
u16 species;
|
||||
u8 spriteId, newSpriteId = 0;
|
||||
u16 bg1Cnt;
|
||||
struct BattleAnimBgData animBgData;
|
||||
u8 battler2 = BATTLE_PARTNER(battler1);
|
||||
|
||||
if (IsContest() || (arg4 && !IsBattlerSpriteVisible(battler2)))
|
||||
arg4 = 0;
|
||||
gBattle_WIN0H = 0;
|
||||
gBattle_WIN0V = 0;
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR
|
||||
| WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR
|
||||
| WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);
|
||||
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON);
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));
|
||||
bg1Cnt = GetGpuReg(REG_OFFSET_BG1CNT);
|
||||
((vBgCnt *)&bg1Cnt)->priority = 0;
|
||||
((vBgCnt *)&bg1Cnt)->screenSize = 0;
|
||||
((vBgCnt *)&bg1Cnt)->areaOverflowMode = 1;
|
||||
if (!IsContest())
|
||||
((vBgCnt *)&bg1Cnt)->charBaseBlock = 1;
|
||||
SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt);
|
||||
if (GetBattlerSide(battler1) != B_SIDE_PLAYER)
|
||||
species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler1]], MON_DATA_SPECIES);
|
||||
else
|
||||
species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler1]], MON_DATA_SPECIES);
|
||||
spriteId = sub_8076E34(battler1, gBattlerSpriteIds[battler1], species);
|
||||
if (arg4)
|
||||
newSpriteId = sub_8076E34(battler2, gBattlerSpriteIds[battler2], species);
|
||||
sub_80752A0(&animBgData);
|
||||
AnimLoadCompressedBgTilemap(animBgData.bgId, tilemap);
|
||||
if (IsContest())
|
||||
sub_80730C0(animBgData.paletteId, animBgData.bgTilemap, 0, 0);
|
||||
AnimLoadCompressedBgGfx(animBgData.bgId, gfx, animBgData.tilesOffset);
|
||||
LoadCompressedPalette(palette, animBgData.paletteId * 16, 32);
|
||||
gBattle_BG1_X = 0;
|
||||
gBattle_BG1_Y = 0;
|
||||
gTasks[taskId].data[1] = arg2;
|
||||
gTasks[taskId].data[4] = arg5;
|
||||
gTasks[taskId].data[5] = arg7;
|
||||
gTasks[taskId].data[6] = arg6;
|
||||
gTasks[taskId].data[0] = spriteId;
|
||||
gTasks[taskId].data[2] = arg4;
|
||||
gTasks[taskId].data[3] = newSpriteId;
|
||||
gTasks[taskId].func = sub_80BBC2C;
|
||||
}
|
||||
|
||||
static void sub_80BBC2C(u8 taskId)
|
||||
{
|
||||
gTasks[taskId].data[13] += gTasks[taskId].data[1] < 0 ? -gTasks[taskId].data[1] : gTasks[taskId].data[1];
|
||||
if (gTasks[taskId].data[1] < 0)
|
||||
gBattle_BG1_Y -= gTasks[taskId].data[13] >> 8;
|
||||
else
|
||||
gBattle_BG1_Y += gTasks[taskId].data[13] >> 8;
|
||||
gTasks[taskId].data[13] &= 0xFF;
|
||||
switch (gTasks[taskId].data[15])
|
||||
{
|
||||
case 0:
|
||||
if (gTasks[taskId].data[11]++ >= gTasks[taskId].data[6])
|
||||
{
|
||||
gTasks[taskId].data[11] = 0;
|
||||
++gTasks[taskId].data[12];
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[12], 16 - gTasks[taskId].data[12]));
|
||||
if (gTasks[taskId].data[12] == gTasks[taskId].data[4])
|
||||
++gTasks[taskId].data[15];
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (++gTasks[taskId].data[10] == gTasks[taskId].data[5])
|
||||
++gTasks[taskId].data[15];
|
||||
break;
|
||||
case 2:
|
||||
if (gTasks[taskId].data[11]++ >= gTasks[taskId].data[6])
|
||||
{
|
||||
gTasks[taskId].data[11] = 0;
|
||||
--gTasks[taskId].data[12];
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[12], 16 - gTasks[taskId].data[12]));
|
||||
if (gTasks[taskId].data[12] == 0)
|
||||
{
|
||||
sub_8073128(0);
|
||||
gBattle_WIN0H = 0;
|
||||
gBattle_WIN0V = 0;
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR
|
||||
| WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR
|
||||
| WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);
|
||||
if (!IsContest())
|
||||
{
|
||||
u16 bg1Cnt = GetGpuReg(REG_OFFSET_BG1CNT);
|
||||
((vBgCnt *)&bg1Cnt)->charBaseBlock = 0;
|
||||
SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt);
|
||||
}
|
||||
SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON);
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, 0);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
|
||||
DestroySprite(&gSprites[gTasks[taskId].data[0]]);
|
||||
if (gTasks[taskId].data[2])
|
||||
DestroySprite(&gSprites[gTasks[taskId].data[3]]);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void AnimTask_GetBattleTerrain(u8 taskId)
|
||||
{
|
||||
gBattleAnimArgs[0] = gBattleTerrain;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80BBE10(u8 taskId)
|
||||
{
|
||||
gMonSpritesGfxPtr->field_17C = AllocZeroed(0x2000);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80BBE3C(u8 taskId)
|
||||
{
|
||||
FREE_AND_SET_NULL(gMonSpritesGfxPtr->field_17C);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80BBE6C(u8 taskId)
|
||||
{
|
||||
u32 selectedPalettes;
|
||||
s32 paletteIndex = 0;
|
||||
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
for (selectedPalettes = sub_8075BE8(1, 0, 0, 0, 0, 0, 0);
|
||||
(selectedPalettes & 1) == 0;
|
||||
++paletteIndex)
|
||||
selectedPalettes >>= 1;
|
||||
else if (gBattleAnimArgs[0] == 1)
|
||||
paletteIndex = gBattleAnimAttacker + 16;
|
||||
else if (gBattleAnimArgs[0] == 2)
|
||||
paletteIndex = gBattleAnimTarget + 16;
|
||||
memcpy(&gMonSpritesGfxPtr->field_17C[gBattleAnimArgs[1] * 16], &gPlttBufferUnfaded[paletteIndex * 16], 32);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80BBF08(u8 taskId)
|
||||
{
|
||||
u32 selectedPalettes;
|
||||
s32 paletteIndex = 0;
|
||||
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
for (selectedPalettes = sub_8075BE8(1, 0, 0, 0, 0, 0, 0);
|
||||
(selectedPalettes & 1) == 0;
|
||||
++paletteIndex)
|
||||
selectedPalettes >>= 1;
|
||||
else if (gBattleAnimArgs[0] == 1)
|
||||
paletteIndex = gBattleAnimAttacker + 16;
|
||||
else if (gBattleAnimArgs[0] == 2)
|
||||
paletteIndex = gBattleAnimTarget + 16;
|
||||
memcpy(&gPlttBufferUnfaded[paletteIndex * 16], &gMonSpritesGfxPtr->field_17C[gBattleAnimArgs[1] * 16], 32);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80BBFA4(u8 taskId)
|
||||
{
|
||||
u32 selectedPalettes;
|
||||
s32 paletteIndex = 0;
|
||||
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
for (selectedPalettes = sub_8075BE8(1, 0, 0, 0, 0, 0, 0);
|
||||
(selectedPalettes & 1) == 0;
|
||||
++paletteIndex)
|
||||
selectedPalettes >>= 1;
|
||||
else if (gBattleAnimArgs[0] == 1)
|
||||
paletteIndex = gBattleAnimAttacker + 16;
|
||||
else if (gBattleAnimArgs[0] == 2)
|
||||
paletteIndex = gBattleAnimTarget + 16;
|
||||
memcpy(&gPlttBufferUnfaded[paletteIndex * 16], &gPlttBufferFaded[paletteIndex * 16], 32);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void AnimTask_IsContest(u8 taskId)
|
||||
{
|
||||
if (IsContest())
|
||||
gBattleAnimArgs[7] = 1;
|
||||
else
|
||||
gBattleAnimArgs[7] = 0;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80BC060(u8 taskId)
|
||||
{
|
||||
gBattleAnimAttacker = gBattlerTarget;
|
||||
gBattleAnimTarget = gEffectBattler;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void AnimTask_IsTargetSameSide(u8 taskId)
|
||||
{
|
||||
if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))
|
||||
gBattleAnimArgs[7] = 1;
|
||||
else
|
||||
gBattleAnimArgs[7] = 0;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80BC0DC(u8 taskId)
|
||||
{
|
||||
gBattleAnimTarget = gBattlerTarget;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80BC0FC(u8 taskId)
|
||||
{
|
||||
gBattleAnimAttacker = gBattlerAttacker;
|
||||
gBattleAnimTarget = gEffectBattler;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80BC12C(u8 taskId)
|
||||
{
|
||||
if (IsContest())
|
||||
{
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
else
|
||||
{
|
||||
gTasks[taskId].data[0] = gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].invisible;
|
||||
gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].invisible = 1;
|
||||
gTasks[taskId].func = sub_80BC19C;
|
||||
--gAnimVisualTaskCount;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80BC19C(u8 taskId)
|
||||
{
|
||||
if (gBattleAnimArgs[7] == 0x1000)
|
||||
{
|
||||
gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].invisible = (u8)gTasks[taskId].data[0] & 1;
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
}
|
||||
@@ -1191,7 +1191,7 @@ static void sub_80303A8(u8 taskId)
|
||||
{
|
||||
s16 *data = gTasks[taskId].data;
|
||||
u8 battlerId = tExpTask_battler;
|
||||
u16 v5 = sub_80768B0(battlerId);
|
||||
u16 v5 = GetBattlerSpriteBGPriorityRank(battlerId);
|
||||
bool32 v6 = ((v5 ^ BIT_SIDE)) != B_SIDE_PLAYER;
|
||||
struct Sprite *sprite = &gSprites[gBattlerSpriteIds[battlerId]];
|
||||
|
||||
@@ -1222,7 +1222,7 @@ static void sub_80303A8(u8 taskId)
|
||||
u32 battlerIdAlt = battlerId;
|
||||
bool32 v6Alt = v6;
|
||||
|
||||
sub_8072E48(battlerIdAlt, v6Alt);
|
||||
MoveBattlerSpriteToBG(battlerIdAlt, v6Alt);
|
||||
}
|
||||
++data[15];
|
||||
break;
|
||||
|
||||
@@ -0,0 +1,495 @@
|
||||
#include "global.h"
|
||||
#include "battle.h"
|
||||
#include "battle_anim.h"
|
||||
#include "battle_setup.h"
|
||||
#include "bg.h"
|
||||
#include "gpu_regs.h"
|
||||
#include "main.h"
|
||||
#include "scanline_effect.h"
|
||||
#include "task.h"
|
||||
#include "trig.h"
|
||||
#include "constants/trainers.h"
|
||||
|
||||
static EWRAM_DATA u16 sBgCnt = 0;
|
||||
|
||||
extern const u8 gUnknown_83E7CCA[];
|
||||
extern const u8 gUnknown_83E7CCE[];
|
||||
|
||||
static void BattleIntroSlide1(u8 taskId);
|
||||
static void BattleIntroSlide2(u8 taskId);
|
||||
static void BattleIntroSlide3(u8 taskId);
|
||||
static void BattleIntroSlideLink(u8 taskId);
|
||||
|
||||
static const TaskFunc sBattleIntroSlideFuncs[] =
|
||||
{
|
||||
BattleIntroSlide1, // BATTLE_TERRAIN_GRASS
|
||||
BattleIntroSlide1, // BATTLE_TERRAIN_LONG_GRASS
|
||||
BattleIntroSlide2, // BATTLE_TERRAIN_SAND
|
||||
BattleIntroSlide2, // BATTLE_TERRAIN_UNDERWATER
|
||||
BattleIntroSlide2, // BATTLE_TERRAIN_WATER
|
||||
BattleIntroSlide1, // BATTLE_TERRAIN_POND
|
||||
BattleIntroSlide1, // BATTLE_TERRAIN_MOUNTAIN
|
||||
BattleIntroSlide1, // BATTLE_TERRAIN_CAVE
|
||||
BattleIntroSlide3, // BATTLE_TERRAIN_BUILDING
|
||||
BattleIntroSlide3, // BATTLE_TERRAIN_PLAIN
|
||||
};
|
||||
|
||||
void SetAnimBgAttribute(u8 bgId, u8 attributeId, u8 value)
|
||||
{
|
||||
if (bgId < 4)
|
||||
{
|
||||
sBgCnt = GetGpuReg(gUnknown_83E7CCA[bgId]);
|
||||
switch (attributeId)
|
||||
{
|
||||
case BG_ANIM_SCREEN_SIZE:
|
||||
((struct BgCnt *)&sBgCnt)->screenSize = value;
|
||||
break;
|
||||
case BG_ANIM_AREA_OVERFLOW_MODE:
|
||||
((struct BgCnt *)&sBgCnt)->areaOverflowMode = value;
|
||||
break;
|
||||
case BG_ANIM_MOSAIC:
|
||||
((struct BgCnt *)&sBgCnt)->mosaic = value;
|
||||
break;
|
||||
case BG_ANIM_CHAR_BASE_BLOCK:
|
||||
((struct BgCnt *)&sBgCnt)->charBaseBlock = value;
|
||||
break;
|
||||
case BG_ANIM_PRIORITY:
|
||||
((struct BgCnt *)&sBgCnt)->priority = value;
|
||||
break;
|
||||
case BG_ANIM_PALETTES_MODE:
|
||||
((struct BgCnt *)&sBgCnt)->palettes = value;
|
||||
break;
|
||||
case BG_ANIM_SCREEN_BASE_BLOCK:
|
||||
((struct BgCnt *)&sBgCnt)->screenBaseBlock = value;
|
||||
break;
|
||||
}
|
||||
SetGpuReg(gUnknown_83E7CCA[bgId], sBgCnt);
|
||||
}
|
||||
}
|
||||
|
||||
s32 GetAnimBgAttribute(u8 bgId, u8 attributeId)
|
||||
{
|
||||
u16 bgCnt;
|
||||
|
||||
if (bgId < 4)
|
||||
{
|
||||
bgCnt = GetGpuReg(gUnknown_83E7CCE[bgId]);
|
||||
switch (attributeId)
|
||||
{
|
||||
case BG_ANIM_SCREEN_SIZE:
|
||||
return ((struct BgCnt *)&bgCnt)->screenSize;
|
||||
case BG_ANIM_AREA_OVERFLOW_MODE:
|
||||
return ((struct BgCnt *)&bgCnt)->areaOverflowMode;
|
||||
case BG_ANIM_MOSAIC:
|
||||
return ((struct BgCnt *)&bgCnt)->mosaic;
|
||||
case BG_ANIM_CHAR_BASE_BLOCK:
|
||||
return ((struct BgCnt *)&bgCnt)->charBaseBlock;
|
||||
case BG_ANIM_PRIORITY:
|
||||
return ((struct BgCnt *)&bgCnt)->priority;
|
||||
case BG_ANIM_PALETTES_MODE:
|
||||
return ((struct BgCnt *)&bgCnt)->palettes;
|
||||
case BG_ANIM_SCREEN_BASE_BLOCK:
|
||||
return ((struct BgCnt *)&bgCnt)->screenBaseBlock;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void HandleIntroSlide(u8 terrain)
|
||||
{
|
||||
u8 taskId;
|
||||
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
|
||||
{
|
||||
taskId = CreateTask(BattleIntroSlideLink, 0);
|
||||
}
|
||||
else if ((gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) && gGameVersion != VERSION_RUBY)
|
||||
{
|
||||
terrain = BATTLE_TERRAIN_UNDERWATER;
|
||||
taskId = CreateTask(BattleIntroSlide2, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
taskId = CreateTask(sBattleIntroSlideFuncs[terrain], 0);
|
||||
}
|
||||
gTasks[taskId].data[0] = 0;
|
||||
gTasks[taskId].data[1] = terrain;
|
||||
gTasks[taskId].data[2] = 0;
|
||||
gTasks[taskId].data[3] = 0;
|
||||
gTasks[taskId].data[4] = 0;
|
||||
gTasks[taskId].data[5] = 0;
|
||||
gTasks[taskId].data[6] = 0;
|
||||
}
|
||||
|
||||
void sub_80BC41C(u8 taskId)
|
||||
{
|
||||
DestroyTask(taskId);
|
||||
gBattle_BG1_X = 0;
|
||||
gBattle_BG1_Y = 0;
|
||||
gBattle_BG2_X = 0;
|
||||
gBattle_BG2_Y = 0;
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, 0);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
|
||||
SetGpuReg(REG_OFFSET_BLDY, 0);
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);
|
||||
}
|
||||
|
||||
static void BattleIntroSlide1(u8 taskId)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
gBattle_BG1_X += 6;
|
||||
switch (gTasks[taskId].data[0])
|
||||
{
|
||||
case 0:
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
|
||||
{
|
||||
gTasks[taskId].data[2] = 16;
|
||||
++gTasks[taskId].data[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
gTasks[taskId].data[2] = 1;
|
||||
++gTasks[taskId].data[0];
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (--gTasks[taskId].data[2] == 0)
|
||||
{
|
||||
++gTasks[taskId].data[0];
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
gBattle_WIN0V -= 0xFF;
|
||||
if ((gBattle_WIN0V & 0xFF00) == 0x3000)
|
||||
{
|
||||
++gTasks[taskId].data[0];
|
||||
gTasks[taskId].data[2] = 240;
|
||||
gTasks[taskId].data[3] = 32;
|
||||
gIntroSlideFlags &= ~1;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if (gTasks[taskId].data[3])
|
||||
{
|
||||
--gTasks[taskId].data[3];
|
||||
}
|
||||
else
|
||||
{
|
||||
if (gTasks[taskId].data[1] == 1)
|
||||
{
|
||||
if (gBattle_BG1_Y != 0xFFB0)
|
||||
gBattle_BG1_Y -= 2;
|
||||
}
|
||||
else if (gBattle_BG1_Y != 0xFFC8)
|
||||
{
|
||||
gBattle_BG1_Y -= 1;
|
||||
}
|
||||
}
|
||||
if (gBattle_WIN0V & 0xFF00)
|
||||
gBattle_WIN0V -= 0x3FC;
|
||||
if (gTasks[taskId].data[2])
|
||||
gTasks[taskId].data[2] -= 2;
|
||||
// Scanline settings have already been set in CB2_InitBattleInternal
|
||||
for (i = 0; i < 80; ++i)
|
||||
gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gTasks[taskId].data[2];
|
||||
while (i < 160)
|
||||
gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i++] = -gTasks[taskId].data[2];
|
||||
if (!gTasks[taskId].data[2])
|
||||
{
|
||||
gScanlineEffect.state = 3;
|
||||
++gTasks[taskId].data[0];
|
||||
CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE);
|
||||
SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0);
|
||||
SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0);
|
||||
SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512);
|
||||
SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256);
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
sub_80BC41C(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void BattleIntroSlide2(u8 taskId)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
switch (gTasks[taskId].data[1])
|
||||
{
|
||||
case 2:
|
||||
case 4:
|
||||
gBattle_BG1_X += 8;
|
||||
break;
|
||||
case 3:
|
||||
gBattle_BG1_X += 6;
|
||||
break;
|
||||
}
|
||||
if (gTasks[taskId].data[1] == 4)
|
||||
{
|
||||
gBattle_BG1_Y = Cos2(gTasks[taskId].data[6]) / 512 - 8;
|
||||
if (gTasks[taskId].data[6] < 180)
|
||||
gTasks[taskId].data[6] += 4;
|
||||
else
|
||||
gTasks[taskId].data[6] += 6;
|
||||
if (gTasks[taskId].data[6] == 360)
|
||||
gTasks[taskId].data[6] = 0;
|
||||
}
|
||||
switch (gTasks[taskId].data[0])
|
||||
{
|
||||
case 0:
|
||||
gTasks[taskId].data[4] = 16;
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
|
||||
{
|
||||
gTasks[taskId].data[2] = 16;
|
||||
++gTasks[taskId].data[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
gTasks[taskId].data[2] = 1;
|
||||
++gTasks[taskId].data[0];
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (--gTasks[taskId].data[2] == 0)
|
||||
{
|
||||
++gTasks[taskId].data[0];
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
gBattle_WIN0V -= 0xFF;
|
||||
if ((gBattle_WIN0V & 0xFF00) == 0x3000)
|
||||
{
|
||||
++gTasks[taskId].data[0];
|
||||
gTasks[taskId].data[2] = 240;
|
||||
gTasks[taskId].data[3] = 32;
|
||||
gTasks[taskId].data[5] = 1;
|
||||
gIntroSlideFlags &= ~1;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if (gTasks[taskId].data[3])
|
||||
{
|
||||
if (--gTasks[taskId].data[3] == 0)
|
||||
{
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(15, 0));
|
||||
SetGpuReg(REG_OFFSET_BLDY, 0);
|
||||
}
|
||||
}
|
||||
else if ((gTasks[taskId].data[4] & 0x1F) && --gTasks[taskId].data[5] == 0)
|
||||
{
|
||||
gTasks[taskId].data[4] += 0xFF;
|
||||
gTasks[taskId].data[5] = 4;
|
||||
}
|
||||
if (gBattle_WIN0V & 0xFF00)
|
||||
gBattle_WIN0V -= 0x3FC;
|
||||
|
||||
if (gTasks[taskId].data[2])
|
||||
gTasks[taskId].data[2] -= 2;
|
||||
// Scanline settings have already been set in CB2_InitBattleInternal()
|
||||
for (i = 0; i < 80; ++i)
|
||||
gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gTasks[taskId].data[2];
|
||||
while (i < 160)
|
||||
gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i++] = -gTasks[taskId].data[2];
|
||||
if (!gTasks[taskId].data[2])
|
||||
{
|
||||
gScanlineEffect.state = 3;
|
||||
++gTasks[taskId].data[0];
|
||||
CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE);
|
||||
SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0);
|
||||
SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0);
|
||||
SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512);
|
||||
SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256);
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
sub_80BC41C(taskId);
|
||||
break;
|
||||
}
|
||||
if (gTasks[taskId].data[0] != 4)
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[4], 0));
|
||||
}
|
||||
|
||||
static void BattleIntroSlide3(u8 taskId)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
gBattle_BG1_X += 8;
|
||||
switch (gTasks[taskId].data[0])
|
||||
{
|
||||
case 0:
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 8));
|
||||
SetGpuReg(REG_OFFSET_BLDY, 0);
|
||||
gTasks[taskId].data[4] = BLDALPHA_BLEND(8, 8);
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
|
||||
{
|
||||
gTasks[taskId].data[2] = 16;
|
||||
++gTasks[taskId].data[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
gTasks[taskId].data[2] = 1;
|
||||
++gTasks[taskId].data[0];
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (--gTasks[taskId].data[2] == 0)
|
||||
{
|
||||
++gTasks[taskId].data[0];
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
gBattle_WIN0V -= 0xFF;
|
||||
if ((gBattle_WIN0V & 0xFF00) == 0x3000)
|
||||
{
|
||||
++gTasks[taskId].data[0];
|
||||
gTasks[taskId].data[2] = 240;
|
||||
gTasks[taskId].data[3] = 32;
|
||||
gTasks[taskId].data[5] = 1;
|
||||
gIntroSlideFlags &= ~1;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if (gTasks[taskId].data[3])
|
||||
{
|
||||
--gTasks[taskId].data[3];
|
||||
}
|
||||
else if ((gTasks[taskId].data[4] & 0xF) && --gTasks[taskId].data[5] == 0)
|
||||
{
|
||||
gTasks[taskId].data[4] += 0xFF;
|
||||
gTasks[taskId].data[5] = 6;
|
||||
}
|
||||
if (gBattle_WIN0V & 0xFF00)
|
||||
gBattle_WIN0V -= 0x3FC;
|
||||
if (gTasks[taskId].data[2])
|
||||
gTasks[taskId].data[2] -= 2;
|
||||
// Scanline settings have already been set in CB2_InitBattleInternal()
|
||||
for (i = 0; i < 80; ++i)
|
||||
gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gTasks[taskId].data[2];
|
||||
while (i < 160)
|
||||
gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i++] = -gTasks[taskId].data[2];
|
||||
if (!gTasks[taskId].data[2])
|
||||
{
|
||||
gScanlineEffect.state = 3;
|
||||
++gTasks[taskId].data[0];
|
||||
CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE);
|
||||
SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0);
|
||||
SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0);
|
||||
SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512);
|
||||
SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256);
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
sub_80BC41C(taskId);
|
||||
break;
|
||||
}
|
||||
if (gTasks[taskId].data[0] != 4)
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[4], 0));
|
||||
}
|
||||
|
||||
static void BattleIntroSlideLink(u8 taskId)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
if (gTasks[taskId].data[0] > 1 && !gTasks[taskId].data[4])
|
||||
{
|
||||
u16 var0 = gBattle_BG1_X & 0x8000;
|
||||
|
||||
if (var0 || gBattle_BG1_X < 80)
|
||||
{
|
||||
gBattle_BG1_X += 3;
|
||||
gBattle_BG2_X -= 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE);
|
||||
CpuFill32(0, (void *)BG_SCREEN_ADDR(30), BG_SCREEN_SIZE);
|
||||
gTasks[taskId].data[4] = 1;
|
||||
}
|
||||
}
|
||||
switch (gTasks[taskId].data[0])
|
||||
{
|
||||
case 0:
|
||||
gTasks[taskId].data[2] = 32;
|
||||
++gTasks[taskId].data[0];
|
||||
break;
|
||||
case 1:
|
||||
if (--gTasks[taskId].data[2] == 0)
|
||||
{
|
||||
++gTasks[taskId].data[0];
|
||||
gSprites[gBattleStruct->linkBattleVsSpriteId_V].oam.objMode = ST_OAM_OBJ_WINDOW;
|
||||
gSprites[gBattleStruct->linkBattleVsSpriteId_V].callback = sub_801182C;
|
||||
gSprites[gBattleStruct->linkBattleVsSpriteId_S].oam.objMode = ST_OAM_OBJ_WINDOW;
|
||||
gSprites[gBattleStruct->linkBattleVsSpriteId_S].callback = sub_801182C;
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
gBattle_WIN0V -= 0xFF;
|
||||
if ((gBattle_WIN0V & 0xFF00) == 0x3000)
|
||||
{
|
||||
++gTasks[taskId].data[0];
|
||||
gTasks[taskId].data[2] = 240;
|
||||
gTasks[taskId].data[3] = 32;
|
||||
gIntroSlideFlags &= ~1;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if (gBattle_WIN0V & 0xFF00)
|
||||
gBattle_WIN0V -= 0x3FC;
|
||||
if (gTasks[taskId].data[2])
|
||||
gTasks[taskId].data[2] -= 2;
|
||||
// Scanline settings have already been set in CB2_InitBattleInternal()
|
||||
for (i = 0; i < 80; ++i)
|
||||
gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gTasks[taskId].data[2];
|
||||
while (i < 160)
|
||||
gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i++] = -gTasks[taskId].data[2];
|
||||
if (!gTasks[taskId].data[2])
|
||||
{
|
||||
gScanlineEffect.state = 3;
|
||||
++gTasks[taskId].data[0];
|
||||
SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0);
|
||||
SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0);
|
||||
SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512);
|
||||
SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256);
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
sub_80BC41C(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80BCEF4(s32 bgId, u8 arg1, u8 arg2, u8 battlerPosition, u8 arg4, u8 *arg5, u16 *arg6, u16 tilesOffset)
|
||||
{
|
||||
s32 i, j;
|
||||
u8 battler = GetBattlerAtPosition(battlerPosition);
|
||||
s32 offset = tilesOffset;
|
||||
|
||||
CpuCopy16(gMonSpritesGfxPtr->sprites[battlerPosition] + BG_SCREEN_SIZE * gBattleMonForms[battler], arg5, BG_SCREEN_SIZE);
|
||||
LoadBgTiles(bgId, arg5, 0x1000, tilesOffset);
|
||||
for (i = arg2; i < arg2 + 8; ++i)
|
||||
for (j = arg1; j < arg1 + 8; ++j)
|
||||
arg6[i * 32 + j] = offset++ | (arg4 << 12);
|
||||
LoadBgTilemap(bgId, arg6, BG_SCREEN_SIZE, 0);
|
||||
}
|
||||
|
||||
// not used
|
||||
static void sub_80BCFCC(u8 arg0, u8 arg1, u8 battlerPosition, u8 arg3, u8 arg4, u16 arg5, u8 arg6, u8 arg7)
|
||||
{
|
||||
s32 i, j, offset;
|
||||
|
||||
DmaCopy16(3, gMonSpritesGfxPtr->sprites[battlerPosition] + BG_SCREEN_SIZE * arg3, (void *)BG_SCREEN_ADDR(0) + arg5, BG_SCREEN_SIZE);
|
||||
offset = (arg5 >> 5) - (arg7 << 9);
|
||||
for (i = arg1; i < arg1 + 8; ++i)
|
||||
for (j = arg0; j < arg0 + 8; ++j)
|
||||
*((u16 *)(BG_VRAM) + (i * 32) + (j + (arg6 << 10))) = offset++ | (arg4 << 12);
|
||||
}
|
||||
+40
-42
@@ -857,14 +857,14 @@ static bool8 BT_Phase2BigPokeball_Init(struct Task *task)
|
||||
task->tEva = 0;
|
||||
task-> tTheta = 0;
|
||||
task-> tAmplitude = 0x4000;
|
||||
sTransitionStructPtr->winIn = 0x3F;
|
||||
sTransitionStructPtr->winIn = WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR;
|
||||
sTransitionStructPtr->winOut = 0;
|
||||
sTransitionStructPtr->win0H = 240;
|
||||
sTransitionStructPtr->win0V = 160;
|
||||
sTransitionStructPtr->win0H = WIN_RANGE(0, 0xF0);
|
||||
sTransitionStructPtr->win0V = WIN_RANGE(0, 0xA0);
|
||||
sTransitionStructPtr->bldCnt = BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD;
|
||||
sTransitionStructPtr->bldAlpha = (task->tEvb << 8) | task->tEva;
|
||||
for (i = 0; i < 160; ++i)
|
||||
gScanlineEffectRegBuffers[1][i] = 240;
|
||||
gScanlineEffectRegBuffers[1][i] = 0xF0;
|
||||
SetVBlankCallback(VBCB_BT_Phase2BigPokeball1);
|
||||
BT_GetBg0TilemapAndTilesetBase(&tilemapAddr, &tilesetAddr);
|
||||
CpuFill16(0, tilemapAddr, 0x800);
|
||||
@@ -897,7 +897,7 @@ static bool8 BT_Phase2BigPokeball_UpdateWave1IncEva(struct Task *task)
|
||||
++task->tEva;
|
||||
task->tInterval = 1; // Broken logic. This makes the condition always TRUE.
|
||||
}
|
||||
sTransitionStructPtr->bldAlpha = (task->tEvb << 8) | task->tEva;
|
||||
sTransitionStructPtr->bldAlpha = BLDALPHA_BLEND(task->tEva, task->tEvb);
|
||||
// Increment eva until it reaches 50% coeff
|
||||
if (task->tEva > 15)
|
||||
++task->tState;
|
||||
@@ -1148,13 +1148,11 @@ static bool8 BT_Phase2ClockwiseBlackFade_Init(struct Task *task)
|
||||
BT_InitCtrlBlk();
|
||||
ScanlineEffect_Clear();
|
||||
sTransitionStructPtr->winIn = 0;
|
||||
sTransitionStructPtr->winOut = 0x3F;
|
||||
sTransitionStructPtr->win0H = 0xF0F1;
|
||||
sTransitionStructPtr->win0V = 0x00A0;
|
||||
sTransitionStructPtr->winOut = WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR;
|
||||
sTransitionStructPtr->win0H = WIN_RANGE(0xF0, 0xF1);
|
||||
sTransitionStructPtr->win0V = WIN_RANGE(0, 0xA0);
|
||||
for (i = 0; i < 160; ++i)
|
||||
{
|
||||
gScanlineEffectRegBuffers[1][i] = 0xF3F4;
|
||||
}
|
||||
gScanlineEffectRegBuffers[1][i] = WIN_RANGE(0xF3, 0xF4);
|
||||
SetVBlankCallback(VBCB_BT_Phase2ClockwiseBlackFade);
|
||||
sTransitionStructPtr->trEndPtX = 120;
|
||||
++task->tState;
|
||||
@@ -1167,7 +1165,7 @@ static bool8 BT_Phase2ClockwiseBlackFade_Step1(struct Task *task)
|
||||
BT_DiagonalSegment_InitParams(sTransitionStructPtr->data, 120, 80, sTransitionStructPtr->trEndPtX, -1, 1, 1);
|
||||
do
|
||||
{
|
||||
gScanlineEffectRegBuffers[0][sTransitionStructPtr->trCurrentPtY] = (sTransitionStructPtr->trCurrentPtX + 1) | 0x7800;
|
||||
gScanlineEffectRegBuffers[0][sTransitionStructPtr->trCurrentPtY] = WIN_RANGE(0x78, sTransitionStructPtr->trCurrentPtX + 1);
|
||||
}
|
||||
while (!BT_DiagonalSegment_ComputePointOnSegment(sTransitionStructPtr->data, TRUE, TRUE));
|
||||
|
||||
@@ -1197,7 +1195,7 @@ static bool8 BT_Phase2ClockwiseBlackFade_Step2(struct Task *task)
|
||||
left = sTransitionStructPtr->trCurrentPtX;
|
||||
right = 240;
|
||||
}
|
||||
gScanlineEffectRegBuffers[0][sTransitionStructPtr->trCurrentPtY] = right | (left << 8);
|
||||
gScanlineEffectRegBuffers[0][sTransitionStructPtr->trCurrentPtY] = WIN_RANGE2(left, right);
|
||||
if (finished)
|
||||
break;
|
||||
finished = BT_DiagonalSegment_ComputePointOnSegment(sTransitionStructPtr->data, TRUE, TRUE);
|
||||
@@ -1211,7 +1209,7 @@ static bool8 BT_Phase2ClockwiseBlackFade_Step2(struct Task *task)
|
||||
else
|
||||
{
|
||||
while (sTransitionStructPtr->trCurrentPtY < sTransitionStructPtr->trEndPtY)
|
||||
gScanlineEffectRegBuffers[0][++sTransitionStructPtr->trCurrentPtY] = right | (left << 8);
|
||||
gScanlineEffectRegBuffers[0][++sTransitionStructPtr->trCurrentPtY] = WIN_RANGE2(left, right);
|
||||
}
|
||||
++sTransitionStructPtr->vblankDma;
|
||||
return FALSE;
|
||||
@@ -1265,7 +1263,7 @@ static bool8 BT_Phase2ClockwiseBlackFade_Step4(struct Task *task)
|
||||
left = 120;
|
||||
right = sTransitionStructPtr->trCurrentPtX;
|
||||
}
|
||||
win0H = right | (left << 8);
|
||||
win0H = WIN_RANGE2(left, right);
|
||||
gScanlineEffectRegBuffers[0][sTransitionStructPtr->trCurrentPtY] = win0H;
|
||||
if (finished)
|
||||
break;
|
||||
@@ -1280,7 +1278,7 @@ static bool8 BT_Phase2ClockwiseBlackFade_Step4(struct Task *task)
|
||||
else
|
||||
{
|
||||
while (sTransitionStructPtr->trCurrentPtY > sTransitionStructPtr->trEndPtY)
|
||||
gScanlineEffectRegBuffers[0][--sTransitionStructPtr->trCurrentPtY] = right | (left << 8);
|
||||
gScanlineEffectRegBuffers[0][--sTransitionStructPtr->trCurrentPtY] = WIN_RANGE2(left, right);
|
||||
}
|
||||
++sTransitionStructPtr->vblankDma;
|
||||
return FALSE;
|
||||
@@ -1301,7 +1299,7 @@ static bool8 BT_Phase2ClockwiseBlackFade_Step5(struct Task *task)
|
||||
left = 0;
|
||||
right = 240;
|
||||
}
|
||||
gScanlineEffectRegBuffers[0][sTransitionStructPtr->trCurrentPtY] = right | (left << 8);
|
||||
gScanlineEffectRegBuffers[0][sTransitionStructPtr->trCurrentPtY] = WIN_RANGE2(left, right);
|
||||
}
|
||||
while (!BT_DiagonalSegment_ComputePointOnSegment(sTransitionStructPtr->data, TRUE, TRUE));
|
||||
sTransitionStructPtr->trEndPtX += 32;
|
||||
@@ -1431,12 +1429,12 @@ static bool8 BT_Phase2BlackWaveToRight_Init(struct Task *task)
|
||||
|
||||
BT_InitCtrlBlk();
|
||||
ScanlineEffect_Clear();
|
||||
sTransitionStructPtr->winIn = 0x3F;
|
||||
sTransitionStructPtr->winIn = WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR;
|
||||
sTransitionStructPtr->winOut = 0;
|
||||
sTransitionStructPtr->win0H = 240;
|
||||
sTransitionStructPtr->win0V = 160;
|
||||
sTransitionStructPtr->win0H = WIN_RANGE(0, 0xF0);
|
||||
sTransitionStructPtr->win0V = WIN_RANGE(0, 0xA0);
|
||||
for (i = 0; i < 160; ++i)
|
||||
gScanlineEffectRegBuffers[1][i] = 242;
|
||||
gScanlineEffectRegBuffers[1][i] = WIN_RANGE(0, 0xF2);
|
||||
SetVBlankCallback(VBCB_BT_Phase2BlackWaveToRight);
|
||||
++task->tState;
|
||||
return TRUE;
|
||||
@@ -1460,7 +1458,7 @@ static bool8 BT_Phase2BlackWaveToRight_UpdateWave(struct Task *task)
|
||||
left = 0;
|
||||
if (left > 240)
|
||||
left = 240;
|
||||
*winVal = (left << 8) | (0xF1);
|
||||
*winVal = WIN_RANGE(left, 0xF1);
|
||||
if (left < 240)
|
||||
nextFunc = FALSE;
|
||||
}
|
||||
@@ -2529,10 +2527,10 @@ static bool8 BT_Phase2AntiClockwiseSpiral_Init(struct Task *task)
|
||||
BT_InitCtrlBlk();
|
||||
ScanlineEffect_Clear();
|
||||
sTransitionStructPtr->winIn = 0;
|
||||
sTransitionStructPtr->winOut = 0x3F;
|
||||
sTransitionStructPtr->win0H = 0x7878;
|
||||
sTransitionStructPtr->win0V = 0x3070;
|
||||
sTransitionStructPtr->win1V = 0x1090;
|
||||
sTransitionStructPtr->winOut = WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR;
|
||||
sTransitionStructPtr->win0H = WIN_RANGE(0x78, 0x78);
|
||||
sTransitionStructPtr->win0V = WIN_RANGE(0x30, 0x70);
|
||||
sTransitionStructPtr->win1V = WIN_RANGE(0x10, 0x90);
|
||||
sTransitionStructPtr->counter = 0;
|
||||
sub_80D1F64(0, 0, FALSE);
|
||||
sub_80D1F64(0, 0, TRUE);
|
||||
@@ -2665,11 +2663,11 @@ static bool8 BT_Phase2Mugshot_Init(struct Task *task)
|
||||
task->tTheta = 0;
|
||||
task->tbg0HOfsOpponent = 1;
|
||||
task->tbg0HOfsPlayer = 239;
|
||||
sTransitionStructPtr->winIn = 0x3F;
|
||||
sTransitionStructPtr->winOut = 0x3E;
|
||||
sTransitionStructPtr->win0V = 160;
|
||||
sTransitionStructPtr->winIn = WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR;
|
||||
sTransitionStructPtr->winOut = WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR;
|
||||
sTransitionStructPtr->win0V = WIN_RANGE(0, 0xA0);
|
||||
for (i = 0; i < 160; ++i)
|
||||
gScanlineEffectRegBuffers[1][i] = 0xF0F1;
|
||||
gScanlineEffectRegBuffers[1][i] = WIN_RANGE(0xF0, 0xF1);
|
||||
SetVBlankCallback(VBCB_BT_Phase2Mugshot1_Slide);
|
||||
++task->tState;
|
||||
return FALSE;
|
||||
@@ -2784,7 +2782,7 @@ static bool8 BT_Phase2Mugshot_WaitForPlayerInPlace(struct Task *task)
|
||||
DmaStop(0);
|
||||
memset(gScanlineEffectRegBuffers[0], 0, 320);
|
||||
memset(gScanlineEffectRegBuffers[1], 0, 320);
|
||||
SetGpuReg(REG_OFFSET_WIN0H, 0xF0);
|
||||
SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 0xF0));
|
||||
SetGpuReg(REG_OFFSET_BLDY, 0);
|
||||
++task->tState;
|
||||
task->tCounter = 0;
|
||||
@@ -3026,9 +3024,9 @@ static bool8 BT_Phase2SlicedScreen_Init(struct Task *task)
|
||||
ScanlineEffect_Clear();
|
||||
task->tAcc = 256;
|
||||
task->tJerk = 1;
|
||||
sTransitionStructPtr->winIn = 0x3F;
|
||||
sTransitionStructPtr->winIn = WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR;
|
||||
sTransitionStructPtr->winOut = 0;
|
||||
sTransitionStructPtr->win0V = 160;
|
||||
sTransitionStructPtr->win0V = WIN_RANGE(0, 0xA0);
|
||||
for (i = 0; i < 160; ++i)
|
||||
{
|
||||
gScanlineEffectRegBuffers[1][i] = sTransitionStructPtr->bg123HOfs;
|
||||
@@ -3065,7 +3063,7 @@ static bool8 BT_Phase2SlicedScreen_UpdateOffsets(struct Task *task)
|
||||
else
|
||||
{
|
||||
*ofsBuffer = sTransitionStructPtr->bg123HOfs - task->tSpeed;
|
||||
*win0HBuffer = (task->tSpeed << 8) | 0xF1;
|
||||
*win0HBuffer = WIN_RANGE(task->tSpeed, 0xF1);
|
||||
}
|
||||
}
|
||||
if (task->tSpeed > 0xEF)
|
||||
@@ -3126,9 +3124,9 @@ static bool8 BT_Phase2WhiteFadeInStripes_Init(struct Task *task)
|
||||
ScanlineEffect_Clear();
|
||||
sTransitionStructPtr->bldCnt = BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_LIGHTEN;
|
||||
sTransitionStructPtr->bldY = 0;
|
||||
sTransitionStructPtr->winIn = 0x1E;
|
||||
sTransitionStructPtr->winOut = 0x3F;
|
||||
sTransitionStructPtr->win0V = 160;
|
||||
sTransitionStructPtr->winIn = WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ;
|
||||
sTransitionStructPtr->winOut = WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WININ_WIN0_CLR;
|
||||
sTransitionStructPtr->win0V = WIN_RANGE(0, 0xA0);
|
||||
for (i = 0; i < 160; ++i)
|
||||
{
|
||||
gScanlineEffectRegBuffers[1][i] = 0;
|
||||
@@ -3180,7 +3178,7 @@ static bool8 BT_Phase2WhiteFadeInStripes_Stop(struct Task *task)
|
||||
sTransitionStructPtr->win0H = 240;
|
||||
sTransitionStructPtr->bldY = 0;
|
||||
sTransitionStructPtr->bldCnt = BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN;
|
||||
sTransitionStructPtr->winIn = 0x3F;
|
||||
sTransitionStructPtr->winIn = WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WININ_WIN0_CLR;
|
||||
sTransitionStructPtr->counter = 0;
|
||||
SetVBlankCallback(VBCB_BT_Phase2WhiteFadeInStripes2);
|
||||
++task->tState;
|
||||
@@ -3351,11 +3349,11 @@ static bool8 BT_Phase2BlackDoodles_Init(struct Task *task)
|
||||
|
||||
BT_InitCtrlBlk();
|
||||
ScanlineEffect_Clear();
|
||||
sTransitionStructPtr->winIn = 0x3F;
|
||||
sTransitionStructPtr->winIn = WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR;
|
||||
sTransitionStructPtr->winOut = 0;
|
||||
sTransitionStructPtr->win0V = 0xA0;
|
||||
sTransitionStructPtr->win0V = WIN_RANGE(0, 0xA0);
|
||||
for (i = 0; i < 160; ++i)
|
||||
gScanlineEffectRegBuffers[0][i] = 0x00F0;
|
||||
gScanlineEffectRegBuffers[0][i] = WIN_RANGE(0, 0xF0);
|
||||
CpuSet(gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 160);
|
||||
SetVBlankCallback(VBCB_BT_Phase2BlackDoodles);
|
||||
++task->tState;
|
||||
@@ -3394,7 +3392,7 @@ static bool8 BT_Phase2BlackDoodles_DrawSingleBrush(struct Task *task)
|
||||
if (right <= left)
|
||||
right = left;
|
||||
}
|
||||
gScanlineEffectRegBuffers[0][sTransitionStructPtr->trCurrentPtY] = right | (left << 8);
|
||||
gScanlineEffectRegBuffers[0][sTransitionStructPtr->trCurrentPtY] = WIN_RANGE2(left, right);
|
||||
if (nextFunc)
|
||||
{
|
||||
++task->tState;
|
||||
|
||||
@@ -356,7 +356,6 @@ void ResetBgsAndClearDma3BusyFlags(bool32 enableWindowTileAutoAlloc)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef NONMATCHING
|
||||
void InitBgsFromTemplates(u8 bgMode, const struct BgTemplate *templates, u8 numTemplates)
|
||||
{
|
||||
int i;
|
||||
@@ -390,121 +389,6 @@ void InitBgsFromTemplates(u8 bgMode, const struct BgTemplate *templates, u8 numT
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
NAKED
|
||||
void InitBgsFromTemplates(u8 bgMode, const struct BgTemplate *templates, u8 numTemplates)
|
||||
{
|
||||
asm(".syntax unified\n\
|
||||
push {r4-r7,lr}\n\
|
||||
mov r7, r10\n\
|
||||
mov r6, r9\n\
|
||||
mov r5, r8\n\
|
||||
push {r5-r7}\n\
|
||||
sub sp, 0x10\n\
|
||||
adds r5, r1, 0\n\
|
||||
lsls r0, 24\n\
|
||||
lsrs r0, 24\n\
|
||||
lsls r2, 24\n\
|
||||
lsrs r4, r2, 24\n\
|
||||
bl SetBgModeInternal\n\
|
||||
bl ResetBgControlStructs\n\
|
||||
cmp r4, 0\n\
|
||||
beq _08001712\n\
|
||||
movs r7, 0\n\
|
||||
ldr r0, _08001724 @ =sGpuBgConfigs2\n\
|
||||
mov r9, r0\n\
|
||||
adds r6, r5, 0\n\
|
||||
ldr r2, _08001728 @ =gpu_tile_allocation_map_bg\n\
|
||||
mov r10, r2\n\
|
||||
mov r8, r4\n\
|
||||
_08001688:\n\
|
||||
ldr r4, [r6]\n\
|
||||
lsls r0, r4, 30\n\
|
||||
lsrs r5, r0, 30\n\
|
||||
cmp r5, 0x3\n\
|
||||
bhi _08001704\n\
|
||||
lsls r1, r4, 28\n\
|
||||
lsrs r1, 30\n\
|
||||
lsls r2, r4, 23\n\
|
||||
lsrs r2, 27\n\
|
||||
lsls r3, r4, 21\n\
|
||||
lsrs r3, 30\n\
|
||||
lsls r0, r4, 20\n\
|
||||
lsrs r0, 31\n\
|
||||
str r0, [sp]\n\
|
||||
lsls r0, r4, 18\n\
|
||||
lsrs r0, 30\n\
|
||||
str r0, [sp, 0x4]\n\
|
||||
str r7, [sp, 0x8]\n\
|
||||
str r7, [sp, 0xC]\n\
|
||||
adds r0, r5, 0\n\
|
||||
bl SetBgControlAttributes\n\
|
||||
lsls r4, r5, 4\n\
|
||||
mov r5, r9\n\
|
||||
adds r3, r4, r5\n\
|
||||
ldr r2, [r6]\n\
|
||||
lsls r2, 8\n\
|
||||
lsrs r2, 22\n\
|
||||
ldrh r0, [r3]\n\
|
||||
ldr r5, _0800172C @ =0xfffffc00\n\
|
||||
adds r1, r5, 0\n\
|
||||
ands r0, r1\n\
|
||||
orrs r0, r2\n\
|
||||
strh r0, [r3]\n\
|
||||
ldrb r0, [r3, 0x1]\n\
|
||||
movs r2, 0x3D\n\
|
||||
negs r2, r2\n\
|
||||
adds r1, r2, 0\n\
|
||||
ands r0, r1\n\
|
||||
strb r0, [r3, 0x1]\n\
|
||||
ldr r0, [r3]\n\
|
||||
ldr r1, _08001730 @ =0x00003fff\n\
|
||||
ands r0, r1\n\
|
||||
str r0, [r3]\n\
|
||||
mov r0, r9\n\
|
||||
adds r0, 0x4\n\
|
||||
adds r0, r4, r0\n\
|
||||
str r7, [r0]\n\
|
||||
mov r0, r9\n\
|
||||
adds r0, 0x8\n\
|
||||
adds r0, r4, r0\n\
|
||||
str r7, [r0]\n\
|
||||
ldr r5, _08001734 @ =sGpuBgConfigs2 + 0xC\n\
|
||||
adds r4, r5\n\
|
||||
str r7, [r4]\n\
|
||||
ldr r0, [r6]\n\
|
||||
lsls r0, 28\n\
|
||||
lsrs r0, 30\n\
|
||||
lsls r0, 6\n\
|
||||
add r0, r10\n\
|
||||
movs r1, 0x1\n\
|
||||
strb r1, [r0]\n\
|
||||
_08001704:\n\
|
||||
adds r6, 0x4\n\
|
||||
movs r0, 0x1\n\
|
||||
negs r0, r0\n\
|
||||
add r8, r0\n\
|
||||
mov r2, r8\n\
|
||||
cmp r2, 0\n\
|
||||
bne _08001688\n\
|
||||
_08001712:\n\
|
||||
add sp, 0x10\n\
|
||||
pop {r3-r5}\n\
|
||||
mov r8, r3\n\
|
||||
mov r9, r4\n\
|
||||
mov r10, r5\n\
|
||||
pop {r4-r7}\n\
|
||||
pop {r0}\n\
|
||||
bx r0\n\
|
||||
.align 2, 0\n\
|
||||
_08001724: .4byte sGpuBgConfigs2\n\
|
||||
_08001728: .4byte gpu_tile_allocation_map_bg\n\
|
||||
_0800172C: .4byte 0xfffffc00\n\
|
||||
_08001730: .4byte 0x00003fff\n\
|
||||
_08001734: .4byte sGpuBgConfigs2 + 0xC\n\
|
||||
.syntax divided");
|
||||
}
|
||||
#endif // NONMATCHING
|
||||
|
||||
void InitBgFromTemplate(const struct BgTemplate *template)
|
||||
{
|
||||
|
||||
@@ -0,0 +1,462 @@
|
||||
#include "global.h"
|
||||
#include "battle_anim.h"
|
||||
#include "gpu_regs.h"
|
||||
#include "trig.h"
|
||||
|
||||
static void sub_80B3FAC(struct Sprite *sprite);
|
||||
static void sub_80B407C(struct Sprite *sprite);
|
||||
static void AnimTranslateWebThread(struct Sprite *sprite);
|
||||
static void sub_80B41F8(struct Sprite *sprite);
|
||||
static void sub_80B42C0(struct Sprite *sprite);
|
||||
static void AnimTranslateStinger(struct Sprite *sprite);
|
||||
static void AnimMissileArc(struct Sprite *sprite);
|
||||
static void sub_80B45D8(struct Sprite *sprite);
|
||||
static void sub_80B41C0(struct Sprite *sprite);
|
||||
static void sub_80B4274(struct Sprite *sprite);
|
||||
static void sub_80B42E8(struct Sprite *sprite);
|
||||
static void sub_80B4344(struct Sprite *sprite);
|
||||
static void AnimMissileArcStep(struct Sprite *sprite);
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E71E8[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x100, 0x100, 30, 0),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E71F8[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x100, 0x100, -99, 0),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7208[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x100, 0x100, 94, 0),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd *const gUnknown_83E7218[] =
|
||||
{
|
||||
gUnknown_83E71E8,
|
||||
gUnknown_83E71F8,
|
||||
gUnknown_83E7208,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7224 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_HORN_HIT_2,
|
||||
.paletteTag = ANIM_TAG_HORN_HIT_2,
|
||||
.oam = &gOamData_83ACAB8,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7218,
|
||||
.callback = sub_80B3FAC,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E723C[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, -33, 1),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E724C[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, 96, 1),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E725C[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, -96, 1),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd *const gUnknown_83E726C[] =
|
||||
{
|
||||
gUnknown_83E723C,
|
||||
gUnknown_83E724C,
|
||||
gUnknown_83E725C,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7278 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_NEEDLE,
|
||||
.paletteTag = ANIM_TAG_NEEDLE,
|
||||
.oam = &gOamData_83ACA30,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E726C,
|
||||
.callback = sub_80B407C,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gWebThreadSpriteTemplate =
|
||||
{
|
||||
.tileTag = ANIM_TAG_WEB_THREAD,
|
||||
.paletteTag = ANIM_TAG_WEB_THREAD,
|
||||
.oam = &gOamData_83AC9C8,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = AnimTranslateWebThread,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E72A8 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_STRING,
|
||||
.paletteTag = ANIM_TAG_STRING,
|
||||
.oam = &gOamData_83ACA00,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B41F8,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E72C0[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0),
|
||||
AFFINEANIMCMD_FRAME(0x6, 0x6, 0, 1),
|
||||
AFFINEANIMCMD_JUMP(1),
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd *const gUnknown_83E72D8[] =
|
||||
{
|
||||
gUnknown_83E72C0,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gSpiderWebSpriteTemplate =
|
||||
{
|
||||
.tileTag = ANIM_TAG_SPIDER_WEB,
|
||||
.paletteTag = ANIM_TAG_SPIDER_WEB,
|
||||
.oam = &gOamData_83ACBC0,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E72D8,
|
||||
.callback = sub_80B42C0,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gLinearStingerSpriteTemplate =
|
||||
{
|
||||
.tileTag = ANIM_TAG_NEEDLE,
|
||||
.paletteTag = ANIM_TAG_NEEDLE,
|
||||
.oam = &gOamData_83ACA30,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = AnimTranslateStinger,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gPinMissileSpriteTemplate =
|
||||
{
|
||||
.tileTag = ANIM_TAG_NEEDLE,
|
||||
.paletteTag = ANIM_TAG_NEEDLE,
|
||||
.oam = &gOamData_83ACA30,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = AnimMissileArc,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gIcicleSpearSpriteTemplate =
|
||||
{
|
||||
.tileTag = ANIM_TAG_ICICLE_SPEAR,
|
||||
.paletteTag = ANIM_TAG_ICICLE_SPEAR,
|
||||
.oam = &gOamData_83ACA38,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = AnimMissileArc,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E733C[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0),
|
||||
AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 18),
|
||||
AFFINEANIMCMD_LOOP(0),
|
||||
AFFINEANIMCMD_FRAME(0xFFFB, 0xFFFB, 0, 8),
|
||||
AFFINEANIMCMD_FRAME(0x5, 0x5, 0, 8),
|
||||
AFFINEANIMCMD_LOOP(5),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd *const gUnknown_83E7374[] =
|
||||
{
|
||||
gUnknown_83E733C,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7378 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_CIRCLE_OF_LIGHT,
|
||||
.paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT,
|
||||
.oam = &gOamData_83ACB60,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7374,
|
||||
.callback = sub_80B45D8,
|
||||
};
|
||||
|
||||
static void sub_80B3FAC(struct Sprite *sprite)
|
||||
{
|
||||
if (IsContest())
|
||||
{
|
||||
StartSpriteAffineAnim(sprite, 2);
|
||||
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
|
||||
gBattleAnimArgs[0] = -gBattleAnimArgs[0];
|
||||
}
|
||||
else if (!GetBattlerSide(gBattleAnimTarget))
|
||||
{
|
||||
StartSpriteAffineAnim(sprite, 1);
|
||||
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
|
||||
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
|
||||
gBattleAnimArgs[3] = -gBattleAnimArgs[3];
|
||||
gBattleAnimArgs[0] = -gBattleAnimArgs[0];
|
||||
}
|
||||
sprite->pos1.x = GetBattlerSpriteCoord2(gBattleAnimTarget, 2) + gBattleAnimArgs[0];
|
||||
sprite->pos1.y = GetBattlerSpriteCoord2(gBattleAnimTarget, 3) + gBattleAnimArgs[1];
|
||||
sprite->data[0] = gBattleAnimArgs[4];
|
||||
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + gBattleAnimArgs[2];
|
||||
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[3];
|
||||
sprite->callback = StartAnimLinearTranslation;
|
||||
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
|
||||
}
|
||||
|
||||
static void sub_80B407C(struct Sprite *sprite)
|
||||
{
|
||||
if (IsContest())
|
||||
{
|
||||
gBattleAnimArgs[0] = -gBattleAnimArgs[0];
|
||||
StartSpriteAffineAnim(sprite, 2);
|
||||
}
|
||||
else if (!GetBattlerSide(gBattleAnimTarget))
|
||||
{
|
||||
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
|
||||
gBattleAnimArgs[0] = -gBattleAnimArgs[0];
|
||||
}
|
||||
sprite->pos1.x = GetBattlerSpriteCoord2(gBattleAnimTarget, 2) + gBattleAnimArgs[0];
|
||||
sprite->pos1.y = GetBattlerSpriteCoord2(gBattleAnimTarget, 3) + gBattleAnimArgs[1];
|
||||
sprite->data[0] = gBattleAnimArgs[2];
|
||||
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
|
||||
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
|
||||
sprite->callback = StartAnimLinearTranslation;
|
||||
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
|
||||
}
|
||||
|
||||
// Creates a single web thread that travels from attacker to target.
|
||||
// Used by MOVE_STRING_SHOT and MOVE_SPIDER_WEB in their first move phase.
|
||||
// arg 0: x
|
||||
// arg 1: y
|
||||
// arg 2: controls the left-to-right movement
|
||||
// arg 3: amplitude
|
||||
// arg 4: if targets both opponents
|
||||
static void AnimTranslateWebThread(struct Sprite *sprite)
|
||||
{
|
||||
if (IsContest())
|
||||
gBattleAnimArgs[2] /= 2;
|
||||
InitSpritePosToAnimAttacker(sprite, TRUE);
|
||||
sprite->data[0] = gBattleAnimArgs[2];
|
||||
sprite->data[1] = sprite->pos1.x;
|
||||
sprite->data[3] = sprite->pos1.y;
|
||||
if (!gBattleAnimArgs[4])
|
||||
{
|
||||
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
|
||||
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->data[2], &sprite->data[4]);
|
||||
}
|
||||
sub_8075678(sprite);
|
||||
sprite->data[5] = gBattleAnimArgs[3];
|
||||
sprite->callback = sub_80B41C0;
|
||||
}
|
||||
|
||||
static void sub_80B41C0(struct Sprite *sprite)
|
||||
{
|
||||
if (AnimTranslateLinear(sprite))
|
||||
{
|
||||
DestroyAnimSprite(sprite);
|
||||
return;
|
||||
}
|
||||
sprite->pos2.x += Sin(sprite->data[6], sprite->data[5]);
|
||||
sprite->data[6] = (sprite->data[6] + 13) & 0xFF;
|
||||
}
|
||||
|
||||
static void sub_80B41F8(struct Sprite *sprite)
|
||||
{
|
||||
SetAverageBattlerPositions(gBattleAnimTarget, 0, &sprite->pos1.x, &sprite->pos1.y);
|
||||
if (GetBattlerSide(gBattleAnimAttacker))
|
||||
sprite->pos1.x -= gBattleAnimArgs[0];
|
||||
else
|
||||
sprite->pos1.x += gBattleAnimArgs[0];
|
||||
sprite->pos1.y += gBattleAnimArgs[1];
|
||||
if (!GetBattlerSide(gBattleAnimTarget))
|
||||
sprite->pos1.y += 8;
|
||||
sprite->callback = sub_80B4274;
|
||||
}
|
||||
|
||||
static void sub_80B4274(struct Sprite *sprite)
|
||||
{
|
||||
if (++sprite->data[0] == 3)
|
||||
{
|
||||
sprite->data[0] = 0;
|
||||
sprite->invisible ^= 1;
|
||||
}
|
||||
if (++sprite->data[1] == 51)
|
||||
{
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B42C0(struct Sprite *sprite)
|
||||
{
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));
|
||||
sprite->data[0] = 16;
|
||||
sprite->callback = sub_80B42E8;
|
||||
}
|
||||
|
||||
static void sub_80B42E8(struct Sprite *sprite)
|
||||
{
|
||||
if (sprite->data[2] < 20)
|
||||
{
|
||||
++sprite->data[2];
|
||||
}
|
||||
else if (sprite->data[1]++ & 1)
|
||||
{
|
||||
--sprite->data[0];
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[0], 16 - sprite->data[0]));
|
||||
|
||||
if (sprite->data[0] == 0)
|
||||
{
|
||||
sprite->invisible = TRUE;
|
||||
sprite->callback = sub_80B4344;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B4344(struct Sprite *sprite)
|
||||
{
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, 0);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
|
||||
// Translates a stinger sprite linearly to a destination location. The sprite is
|
||||
// initially rotated so that it appears to be traveling in a straight line.
|
||||
// arg 0: initial x pixel offset
|
||||
// arg 1: initial y pixel offset
|
||||
// arg 2: target x pixel offset
|
||||
// arg 3: target y pixel offset
|
||||
// arg 4: duration
|
||||
static void AnimTranslateStinger(struct Sprite *sprite)
|
||||
{
|
||||
s16 lVarX, lVarY;
|
||||
u16 rot;
|
||||
|
||||
if (IsContest())
|
||||
{
|
||||
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
|
||||
}
|
||||
else if (GetBattlerSide(gBattleAnimAttacker))
|
||||
{
|
||||
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
|
||||
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
|
||||
gBattleAnimArgs[3] = -gBattleAnimArgs[3];
|
||||
}
|
||||
if (!IsContest() && GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))
|
||||
{
|
||||
if (GetBattlerPosition(gBattleAnimTarget) == B_POSITION_PLAYER_LEFT
|
||||
|| GetBattlerPosition(gBattleAnimTarget) == B_POSITION_OPPONENT_LEFT)
|
||||
{
|
||||
s16 temp1, temp2;
|
||||
|
||||
temp1 = gBattleAnimArgs[2];
|
||||
gBattleAnimArgs[2] = -temp1;
|
||||
|
||||
temp2 = gBattleAnimArgs[0];
|
||||
gBattleAnimArgs[0] = -temp2;
|
||||
}
|
||||
}
|
||||
InitSpritePosToAnimAttacker(sprite, 1);
|
||||
lVarX = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + gBattleAnimArgs[2];
|
||||
lVarY = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[3];
|
||||
rot = ArcTan2Neg(lVarX - sprite->pos1.x, lVarY - sprite->pos1.y);
|
||||
rot += 0xC000;
|
||||
TrySetSpriteRotScale(sprite, FALSE, 0x100, 0x100, rot);
|
||||
sprite->data[0] = gBattleAnimArgs[4];
|
||||
sprite->data[2] = lVarX;
|
||||
sprite->data[4] = lVarY;
|
||||
sprite->callback = StartAnimLinearTranslation;
|
||||
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
|
||||
}
|
||||
|
||||
// Rotates sprite and moves it in an arc, so that it appears like a missle or arrow traveling.
|
||||
// arg 0: initial x pixel offset
|
||||
// arg 1: initial y pixel offset
|
||||
// arg 2: target x pixel offset
|
||||
// arg 3: target y pixel offset
|
||||
// arg 4: duration
|
||||
// arg 5: wave amplitude
|
||||
static void AnimMissileArc(struct Sprite *sprite)
|
||||
{
|
||||
InitSpritePosToAnimAttacker(sprite, 1);
|
||||
if (GetBattlerSide(gBattleAnimAttacker))
|
||||
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
|
||||
sprite->data[0] = gBattleAnimArgs[4];
|
||||
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + gBattleAnimArgs[2];
|
||||
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[3];
|
||||
sprite->data[5] = gBattleAnimArgs[5];
|
||||
InitAnimArcTranslation(sprite);
|
||||
sprite->callback = AnimMissileArcStep;
|
||||
sprite->invisible = TRUE;
|
||||
}
|
||||
|
||||
static void AnimMissileArcStep(struct Sprite *sprite)
|
||||
{
|
||||
sprite->invisible = FALSE;
|
||||
|
||||
if (TranslateAnimHorizontalArc(sprite))
|
||||
{
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
else
|
||||
{
|
||||
s16 tempData[8];
|
||||
u16 *data = sprite->data;
|
||||
u16 x1 = sprite->pos1.x;
|
||||
s16 x2 = sprite->pos2.x;
|
||||
u16 y1 = sprite->pos1.y;
|
||||
s16 y2 = sprite->pos2.y;
|
||||
s32 i;
|
||||
|
||||
for (i = 0; i < 8; ++i)
|
||||
tempData[i] = data[i];
|
||||
x2 += x1;
|
||||
y2 += y1;
|
||||
if (!TranslateAnimHorizontalArc(sprite))
|
||||
{
|
||||
u16 rotation = ArcTan2Neg(sprite->pos1.x + sprite->pos2.x - x2,
|
||||
sprite->pos1.y + sprite->pos2.y - y2);
|
||||
|
||||
rotation += 0xC000;
|
||||
TrySetSpriteRotScale(sprite, FALSE, 0x100, 0x100, rotation);
|
||||
for (i = 0; i < 8; ++i)
|
||||
data[i] = tempData[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B45D8(struct Sprite *sprite)
|
||||
{
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
{
|
||||
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
|
||||
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + 18;
|
||||
}
|
||||
else
|
||||
{
|
||||
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
|
||||
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + 18;
|
||||
}
|
||||
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
|
||||
sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
|
||||
}
|
||||
+921
@@ -0,0 +1,921 @@
|
||||
#include "global.h"
|
||||
#include "battle_anim.h"
|
||||
#include "gpu_regs.h"
|
||||
#include "graphics.h"
|
||||
#include "palette.h"
|
||||
#include "scanline_effect.h"
|
||||
#include "trig.h"
|
||||
#include "util.h"
|
||||
|
||||
static void sub_80B7ACC(struct Sprite *sprite);
|
||||
static void sub_80B7BD4(struct Sprite *sprite);
|
||||
static void sub_80B7C88(struct Sprite *sprite);
|
||||
static void sub_80B86B0(struct Sprite *sprite);
|
||||
static void sub_80B7954(u8 taskId);
|
||||
static void sub_80B7A14(u8 taskId);
|
||||
static void sub_80B7B48(struct Sprite *sprite);
|
||||
static void sub_80B7C10(struct Sprite *sprite);
|
||||
static void sub_80B7C50(struct Sprite *sprite);
|
||||
static void sub_80B7D88(struct Sprite *sprite);
|
||||
static void sub_80B856C(u8 priority);
|
||||
static void sub_80B7F58(u8 taskId);
|
||||
static void sub_80B843C(struct Task *task);
|
||||
static void sub_80B82C0(u8 taskId);
|
||||
static void sub_80B8920(u8 taskId);
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7878 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_TIED_BAG,
|
||||
.paletteTag = ANIM_TAG_TIED_BAG,
|
||||
.oam = &gOamData_83AC9D0,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B7ACC,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7890[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E78A0[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, 32, 1),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E78B0[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, 64, 1),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E78C0[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, 96, 1),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E78D0[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, -128, 1),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E78E0[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, -96, 1),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E78F0[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, -64, 1),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7900[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, -32, 1),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd *const gUnknown_83E7910[] =
|
||||
{
|
||||
gUnknown_83E7890,
|
||||
gUnknown_83E78A0,
|
||||
gUnknown_83E78B0,
|
||||
gUnknown_83E78C0,
|
||||
gUnknown_83E78D0,
|
||||
gUnknown_83E78E0,
|
||||
gUnknown_83E78F0,
|
||||
gUnknown_83E7900,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7930 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_SHARP_TEETH,
|
||||
.paletteTag = ANIM_TAG_SHARP_TEETH,
|
||||
.oam = &gOamData_83ACB60,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7910,
|
||||
.callback = sub_80B7BD4,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7948 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_CLAMP,
|
||||
.paletteTag = ANIM_TAG_CLAMP,
|
||||
.oam = &gOamData_83ACB60,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7910,
|
||||
.callback = sub_80B7BD4,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7960[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0xC0, 0xC0, 80, 0),
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, -2, 8),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7978[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0xC0, 0xC0, -80, 0),
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, 2, 8),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd *const gUnknown_83E7990[] =
|
||||
{
|
||||
gUnknown_83E7960,
|
||||
gUnknown_83E7978,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7998 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_SMALL_BUBBLES,
|
||||
.paletteTag = ANIM_TAG_SMALL_BUBBLES,
|
||||
.oam = &gOamData_83ACA30,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7990,
|
||||
.callback = sub_80B7C88,
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E79B0[] =
|
||||
{
|
||||
ANIMCMD_FRAME(0, 4),
|
||||
ANIMCMD_FRAME(16, 4),
|
||||
ANIMCMD_FRAME(32, 4),
|
||||
ANIMCMD_FRAME(48, 4),
|
||||
ANIMCMD_FRAME(64, 4),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E79C8[] =
|
||||
{
|
||||
ANIMCMD_FRAME(0, 4, .hFlip = TRUE),
|
||||
ANIMCMD_FRAME(16, 4, .hFlip = TRUE),
|
||||
ANIMCMD_FRAME(32, 4, .hFlip = TRUE),
|
||||
ANIMCMD_FRAME(48, 4, .hFlip = TRUE),
|
||||
ANIMCMD_FRAME(64, 4, .hFlip = TRUE),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd *const gUnknown_83E79E0[] =
|
||||
{
|
||||
gUnknown_83E79B0,
|
||||
gUnknown_83E79C8,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E79E8 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_CLAW_SLASH,
|
||||
.paletteTag = ANIM_TAG_CLAW_SLASH,
|
||||
.oam = &gOamData_83AC9D8,
|
||||
.anims = gUnknown_83E79E0,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B86B0,
|
||||
};
|
||||
|
||||
void sub_80B78E0(u8 taskId)
|
||||
{
|
||||
s32 battler;
|
||||
|
||||
gTasks[taskId].data[0] = gBattleAnimArgs[0];
|
||||
battler = gBattleAnimAttacker;
|
||||
gTasks[taskId].data[1] = 16;
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));
|
||||
if (GetBattlerSpriteBGPriorityRank(battler) == 1)
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);
|
||||
else
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2);
|
||||
gTasks[taskId].func = sub_80B7954;
|
||||
}
|
||||
|
||||
static void sub_80B7954(u8 taskId)
|
||||
{
|
||||
u8 blendA = gTasks[taskId].data[1] >> 8;
|
||||
u8 blendB = gTasks[taskId].data[1];
|
||||
|
||||
if (gTasks[taskId].data[2] == (u8)gTasks[taskId].data[0])
|
||||
{
|
||||
++blendA;
|
||||
--blendB;
|
||||
gTasks[taskId].data[1] = BLDALPHA_BLEND(blendB, blendA);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, gTasks[taskId].data[1]);
|
||||
gTasks[taskId].data[2] = 0;
|
||||
if (blendA == 16)
|
||||
{
|
||||
gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].invisible = TRUE;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
++gTasks[taskId].data[2];
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80B79DC(u8 taskId)
|
||||
{
|
||||
gTasks[taskId].data[0] = gBattleAnimArgs[0];
|
||||
gTasks[taskId].data[1] = BLDALPHA_BLEND(0, 16);
|
||||
gTasks[taskId].func = sub_80B7A14;
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, gTasks[taskId].data[1]);
|
||||
}
|
||||
|
||||
static void sub_80B7A14(u8 taskId)
|
||||
{
|
||||
u8 blendA = gTasks[taskId].data[1] >> 8;
|
||||
u8 blendB = gTasks[taskId].data[1];
|
||||
|
||||
if (gTasks[taskId].data[2] == (u8)gTasks[taskId].data[0])
|
||||
{
|
||||
--blendA;
|
||||
++blendB;
|
||||
gTasks[taskId].data[1] = (blendA << 8) | blendB;
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, gTasks[taskId].data[1]);
|
||||
gTasks[taskId].data[2] = 0;
|
||||
if (blendA == 0)
|
||||
{
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, 0);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
++gTasks[taskId].data[2];
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80B7A80(u8 taskId)
|
||||
{
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));
|
||||
if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1)
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);
|
||||
else
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
static void sub_80B7ACC(struct Sprite *sprite)
|
||||
{
|
||||
sprite->data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
|
||||
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
|
||||
sprite->data[3] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
|
||||
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
|
||||
sprite->data[0] = 0x7E;
|
||||
InitSpriteDataForLinearTranslation(sprite);
|
||||
sprite->data[3] = -sprite->data[1];
|
||||
sprite->data[4] = -sprite->data[2];
|
||||
sprite->data[6] = 0xFFD8;
|
||||
sprite->callback = sub_80B7B48;
|
||||
sprite->callback(sprite);
|
||||
}
|
||||
|
||||
static void sub_80B7B48(struct Sprite *sprite)
|
||||
{
|
||||
sprite->data[3] += sprite->data[1];
|
||||
sprite->data[4] += sprite->data[2];
|
||||
sprite->pos2.x = sprite->data[3] >> 8;
|
||||
sprite->pos2.y = sprite->data[4] >> 8;
|
||||
if (sprite->data[7] == 0)
|
||||
{
|
||||
sprite->data[3] += sprite->data[1];
|
||||
sprite->data[4] += sprite->data[2];
|
||||
sprite->pos2.x = sprite->data[3] >> 8;
|
||||
sprite->pos2.y = sprite->data[4] >> 8;
|
||||
--sprite->data[0];
|
||||
}
|
||||
sprite->pos2.y += Sin(sprite->data[5], sprite->data[6]);
|
||||
sprite->data[5] = (sprite->data[5] + 3) & 0xFF;
|
||||
if (sprite->data[5] > 0x7F)
|
||||
{
|
||||
sprite->data[5] = 0;
|
||||
sprite->data[6] += 20;
|
||||
++sprite->data[7];
|
||||
}
|
||||
if (--sprite->data[0] == 0)
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
|
||||
static void sub_80B7BD4(struct Sprite *sprite)
|
||||
{
|
||||
sprite->pos1.x += gBattleAnimArgs[0];
|
||||
sprite->pos1.y += gBattleAnimArgs[1];
|
||||
StartSpriteAffineAnim(sprite, gBattleAnimArgs[2]);
|
||||
sprite->data[0] = gBattleAnimArgs[3];
|
||||
sprite->data[1] = gBattleAnimArgs[4];
|
||||
sprite->data[2] = gBattleAnimArgs[5];
|
||||
sprite->callback = sub_80B7C10;
|
||||
}
|
||||
|
||||
static void sub_80B7C10(struct Sprite *sprite)
|
||||
{
|
||||
sprite->data[4] += sprite->data[0];
|
||||
sprite->data[5] += sprite->data[1];
|
||||
sprite->pos2.x = sprite->data[4] >> 8;
|
||||
sprite->pos2.y = sprite->data[5] >> 8;
|
||||
if (++sprite->data[3] == sprite->data[2])
|
||||
sprite->callback = sub_80B7C50;
|
||||
}
|
||||
|
||||
static void sub_80B7C50(struct Sprite *sprite)
|
||||
{
|
||||
sprite->data[4] -= sprite->data[0];
|
||||
sprite->data[5] -= sprite->data[1];
|
||||
sprite->pos2.x = sprite->data[4] >> 8;
|
||||
sprite->pos2.y = sprite->data[5] >> 8;
|
||||
if (--sprite->data[3] == 0)
|
||||
DestroySpriteAndMatrix(sprite);
|
||||
}
|
||||
|
||||
static void sub_80B7C88(struct Sprite *sprite)
|
||||
{
|
||||
u8 battler;
|
||||
s8 xOffset;
|
||||
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
battler = gBattleAnimAttacker;
|
||||
else
|
||||
battler = gBattleAnimTarget;
|
||||
xOffset = 20;
|
||||
sprite->oam.tileNum += 4;
|
||||
switch (gBattleAnimArgs[1])
|
||||
{
|
||||
case 0:
|
||||
sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_RIGHT) - 8;
|
||||
sprite->pos1.y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP) + 8;
|
||||
break;
|
||||
case 1:
|
||||
sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_RIGHT) - 14;
|
||||
sprite->pos1.y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP) + 16;
|
||||
break;
|
||||
case 2:
|
||||
sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) + 8;
|
||||
sprite->pos1.y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP) + 8;
|
||||
StartSpriteAffineAnim(sprite, 1);
|
||||
xOffset = -20;
|
||||
break;
|
||||
case 3:
|
||||
sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) + 14;
|
||||
sprite->pos1.y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP) + 16;
|
||||
StartSpriteAffineAnim(sprite, 1);
|
||||
xOffset = -20;
|
||||
break;
|
||||
}
|
||||
sprite->data[0] = 32;
|
||||
sprite->data[2] = sprite->pos1.x + xOffset;
|
||||
sprite->data[4] = sprite->pos1.y + 12;
|
||||
sprite->data[5] = -12;
|
||||
InitAnimArcTranslation(sprite);
|
||||
sprite->callback = sub_80B7D88;
|
||||
}
|
||||
|
||||
static void sub_80B7D88(struct Sprite *sprite)
|
||||
{
|
||||
if (TranslateAnimHorizontalArc(sprite))
|
||||
DestroySpriteAndMatrix(sprite);
|
||||
}
|
||||
|
||||
void sub_80B7DA4(u8 taskId)
|
||||
{
|
||||
struct ScanlineEffectParams scanlineParams;
|
||||
struct BattleAnimBgData animBg;
|
||||
u16 i;
|
||||
u8 pos;
|
||||
s32 var0;
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
task->data[7] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 31;
|
||||
task->data[6] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_TOP) - 7;
|
||||
task->data[5] = task->data[7];
|
||||
task->data[4] = task->data[6];
|
||||
task->data[13] = (task->data[7] - task->data[6]) << 8;
|
||||
pos = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
|
||||
task->data[14] = pos - 32;
|
||||
task->data[15] = pos + 32;
|
||||
if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
|
||||
task->data[8] = -12;
|
||||
else
|
||||
task->data[8] = -64;
|
||||
task->data[3] = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker);
|
||||
if (task->data[3] == 1)
|
||||
{
|
||||
sub_80752A0(&animBg);
|
||||
task->data[10] = gBattle_BG1_Y;
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);
|
||||
FillPalette(0, animBg.paletteId * 16, 32);
|
||||
scanlineParams.dmaDest = ®_BG1VOFS;
|
||||
var0 = WINOUT_WIN01_BG1;
|
||||
if (!IsContest())
|
||||
gBattle_BG2_X += 240;
|
||||
}
|
||||
else
|
||||
{
|
||||
task->data[10] = gBattle_BG2_Y;
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2);
|
||||
FillPalette(0, 144, 32);
|
||||
scanlineParams.dmaDest = ®_BG2VOFS;
|
||||
var0 = WINOUT_WIN01_BG2;
|
||||
if (!IsContest())
|
||||
gBattle_BG1_X += 240;
|
||||
}
|
||||
scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;
|
||||
scanlineParams.initState = 1;
|
||||
scanlineParams.unused9 = 0;
|
||||
task->data[11] = 0;
|
||||
task->data[12] = 16;
|
||||
task->data[0] = 0;
|
||||
task->data[1] = 0;
|
||||
task->data[2] = 0;
|
||||
sub_80B856C(3);
|
||||
for (i = 0; i < 112; ++i)
|
||||
{
|
||||
gScanlineEffectRegBuffers[0][i] = task->data[10];
|
||||
gScanlineEffectRegBuffers[1][i] = task->data[10];
|
||||
}
|
||||
ScanlineEffect_SetParams(scanlineParams);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | (var0 ^ (WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR)));
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
|
||||
gBattle_WIN0H = (task->data[14] << 8) | task->data[15];
|
||||
gBattle_WIN0V = 160;
|
||||
|
||||
task->func = sub_80B7F58;
|
||||
}
|
||||
|
||||
static void sub_80B7F58(u8 taskId)
|
||||
{
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
switch (task->data[0])
|
||||
{
|
||||
case 0:
|
||||
if (++task->data[1] > 1)
|
||||
{
|
||||
task->data[1] = 0;
|
||||
if (++task->data[2] & 1)
|
||||
{
|
||||
if (task->data[11] != 12)
|
||||
++task->data[11];
|
||||
}
|
||||
else if (task->data[12] != 8)
|
||||
{
|
||||
--task->data[12];
|
||||
}
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[11], task->data[12]));
|
||||
if (task->data[11] == 12 && task->data[12] == 8)
|
||||
++task->data[0];
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
task->data[4] -= 8;
|
||||
sub_80B843C(task);
|
||||
if (task->data[4] < task->data[8])
|
||||
++task->data[0];
|
||||
break;
|
||||
case 2:
|
||||
task->data[4] -= 8;
|
||||
sub_80B843C(task);
|
||||
task->data[14] += 4;
|
||||
task->data[15] -= 4;
|
||||
if (task->data[14] >= task->data[15])
|
||||
task->data[14] = task->data[15];
|
||||
gBattle_WIN0H = (task->data[14] << 8) | task->data[15];
|
||||
if (task->data[14] == task->data[15])
|
||||
++task->data[0];
|
||||
break;
|
||||
case 3:
|
||||
gScanlineEffect.state = 3;
|
||||
++task->data[0];
|
||||
break;
|
||||
case 4:
|
||||
DestroyAnimVisualTask(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80B8070(u8 taskId)
|
||||
{
|
||||
struct BattleAnimBgData animBg;
|
||||
struct ScanlineEffectParams scanlineParams;
|
||||
u8 x;
|
||||
u16 i;
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
switch (task->data[0])
|
||||
{
|
||||
case 0:
|
||||
if (IsContest() == TRUE)
|
||||
{
|
||||
gBattle_WIN0H = 0;
|
||||
gBattle_WIN0V = 0;
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
else
|
||||
{
|
||||
task->data[3] = GetBattlerSpriteBGPriorityRank(gBattleAnimTarget);
|
||||
if (task->data[3] == 1)
|
||||
{
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);
|
||||
gBattle_BG2_X += 240;
|
||||
}
|
||||
else
|
||||
{
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2);
|
||||
gBattle_BG1_X += 240;
|
||||
}
|
||||
++task->data[0];
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (task->data[3] == 1)
|
||||
{
|
||||
sub_80752A0(&animBg);
|
||||
task->data[10] = gBattle_BG1_Y;
|
||||
FillPalette(0, animBg.paletteId * 16, 32);
|
||||
}
|
||||
else
|
||||
{
|
||||
task->data[10] = gBattle_BG2_Y;
|
||||
FillPalette(0, 9 * 16, 32);
|
||||
}
|
||||
sub_80B856C(3);
|
||||
++task->data[0];
|
||||
break;
|
||||
case 2:
|
||||
task->data[7] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 31;
|
||||
task->data[6] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_TOP) - 7;
|
||||
task->data[13] = (task->data[7] - task->data[6]) << 8;
|
||||
x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
|
||||
task->data[14] = x - 4;
|
||||
task->data[15] = x + 4;
|
||||
if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
|
||||
task->data[8] = -12;
|
||||
else
|
||||
task->data[8] = -64;
|
||||
task->data[4] = task->data[8];
|
||||
task->data[5] = task->data[8];
|
||||
task->data[11] = 12;
|
||||
task->data[12] = 8;
|
||||
++task->data[0];
|
||||
break;
|
||||
case 3:
|
||||
if (task->data[3] == 1)
|
||||
scanlineParams.dmaDest = ®_BG1VOFS;
|
||||
else
|
||||
scanlineParams.dmaDest = ®_BG2VOFS;
|
||||
for (i = 0; i < 112; ++i)
|
||||
{
|
||||
gScanlineEffectRegBuffers[0][i] = task->data[10] + (159 - i);
|
||||
gScanlineEffectRegBuffers[1][i] = task->data[10] + (159 - i);
|
||||
}
|
||||
scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;
|
||||
scanlineParams.initState = 1;
|
||||
scanlineParams.unused9 = 0;
|
||||
ScanlineEffect_SetParams(scanlineParams);
|
||||
++task->data[0];
|
||||
break;
|
||||
case 4:
|
||||
if (task->data[3] == 1)
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);
|
||||
else
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
|
||||
gBattle_WIN0H = (task->data[14] << 8) | task->data[15];
|
||||
gBattle_WIN0V = 160;
|
||||
task->data[0] = 0;
|
||||
task->data[1] = 0;
|
||||
task->data[2] = 0;
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 8));
|
||||
task->func = sub_80B82C0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B82C0(u8 taskId)
|
||||
{
|
||||
u8 pos;
|
||||
u16 i;
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
switch (task->data[0])
|
||||
{
|
||||
case 0:
|
||||
task->data[5] += 8;
|
||||
if (task->data[5] >= task->data[7])
|
||||
task->data[5] = task->data[7];
|
||||
sub_80B843C(task);
|
||||
if (task->data[5] == task->data[7])
|
||||
++task->data[0];
|
||||
break;
|
||||
case 1:
|
||||
if (task->data[15] - task->data[14] < 0x40)
|
||||
{
|
||||
task->data[14] -= 4;
|
||||
task->data[15] += 4;
|
||||
}
|
||||
else
|
||||
{
|
||||
task->data[1] = 1;
|
||||
}
|
||||
gBattle_WIN0H = (task->data[14] << 8) | task->data[15];
|
||||
task->data[4] += 8;
|
||||
if (task->data[4] >= task->data[6])
|
||||
task->data[4] = task->data[6];
|
||||
sub_80B843C(task);
|
||||
if (task->data[4] == task->data[6] && task->data[1])
|
||||
{
|
||||
task->data[1] = 0;
|
||||
++task->data[0];
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (++task->data[1] > 1)
|
||||
{
|
||||
task->data[1] = 0;
|
||||
++task->data[2];
|
||||
if (task->data[2] & 1)
|
||||
{
|
||||
if (task->data[11])
|
||||
--task->data[11];
|
||||
}
|
||||
else if (task->data[12] < 16)
|
||||
{
|
||||
++task->data[12];
|
||||
}
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[11], task->data[12]));
|
||||
if (task->data[11] == 0 && task->data[12] == 16)
|
||||
++task->data[0];
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
gScanlineEffect.state = 3;
|
||||
++task->data[0];
|
||||
break;
|
||||
case 4:
|
||||
gBattle_WIN0H = 0;
|
||||
gBattle_WIN0V = 0;
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B843C(struct Task *task)
|
||||
{
|
||||
s32 var0, var1, var4;
|
||||
s16 var2, i;
|
||||
|
||||
var2 = task->data[5] - task->data[4];
|
||||
if (var2 != 0)
|
||||
{
|
||||
var0 = task->data[13] / var2;
|
||||
var1 = task->data[6] << 8;
|
||||
for (i = 0; i < task->data[4]; ++i)
|
||||
gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[10] - (i - 159);
|
||||
for (i = task->data[4]; i <= task->data[5]; ++i)
|
||||
{
|
||||
if (i >= 0)
|
||||
{
|
||||
s16 var3 = (var1 >> 8) - i;
|
||||
|
||||
gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = var3 + task->data[10];
|
||||
}
|
||||
var1 += var0;
|
||||
}
|
||||
var4 = task->data[10] - (i - 159);
|
||||
for (; i < task->data[7]; ++i)
|
||||
if (i >= 0)
|
||||
gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = var4--;
|
||||
}
|
||||
else
|
||||
{
|
||||
var4 = task->data[10] + 159;
|
||||
for (i = 0; i < 112; ++i)
|
||||
{
|
||||
gScanlineEffectRegBuffers[0][i] = var4;
|
||||
gScanlineEffectRegBuffers[1][i] = var4;
|
||||
--var4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B856C(u8 priority)
|
||||
{
|
||||
u16 i;
|
||||
|
||||
for (i = 0; i < MAX_BATTLERS_COUNT; ++i)
|
||||
{
|
||||
u8 spriteId = GetAnimBattlerSpriteId(i);
|
||||
|
||||
if (spriteId != 0xFF)
|
||||
gSprites[spriteId].oam.priority = priority;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80B85B8(u8 taskId)
|
||||
{
|
||||
bool8 toBG2 = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) ^ 1 ? TRUE : FALSE;
|
||||
|
||||
MoveBattlerSpriteToBG(gBattleAnimAttacker, toBG2);
|
||||
gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].invisible = FALSE;
|
||||
if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)))
|
||||
{
|
||||
MoveBattlerSpriteToBG(gBattleAnimAttacker ^ 2, toBG2 ^ 1);
|
||||
gSprites[gBattlerSpriteIds[gBattleAnimAttacker ^ 2]].invisible = FALSE;
|
||||
}
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80B8664(u8 taskId)
|
||||
{
|
||||
bool8 toBG2 = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) ^ 1 ? TRUE : FALSE;
|
||||
|
||||
sub_8073128(toBG2);
|
||||
if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)))
|
||||
sub_8073128(toBG2 ^ 1);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
static void sub_80B86B0(struct Sprite *sprite)
|
||||
{
|
||||
sprite->pos1.x += gBattleAnimArgs[0];
|
||||
sprite->pos1.y += gBattleAnimArgs[1];
|
||||
StartSpriteAnim(sprite, gBattleAnimArgs[2]);
|
||||
sprite->callback = RunStoredCallbackWhenAnimEnds;
|
||||
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
|
||||
}
|
||||
|
||||
// Makes the attacker metallic and shining.
|
||||
// Used by MOVE_HARDEN and MOVE_IRON_DEFENSE.
|
||||
// arg0: if true won't change battler's palette back
|
||||
// arg1: if true, use custom color
|
||||
// arg2: custom color
|
||||
// Custom color argument is used in MOVE_POISON_TAIL to make the mon turn purplish/pinkish as if became cloaked in poison.
|
||||
void AnimTask_MetallicShine(u8 taskId)
|
||||
{
|
||||
u16 species;
|
||||
u8 spriteId, newSpriteId;
|
||||
u16 paletteNum;
|
||||
struct BattleAnimBgData animBg;
|
||||
bool32 priorityChanged = FALSE;
|
||||
|
||||
gBattle_WIN0H = 0;
|
||||
gBattle_WIN0V = 0;
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);
|
||||
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON);
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 12));
|
||||
SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 0);
|
||||
SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0);
|
||||
if (!IsContest())
|
||||
SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);
|
||||
if (IsDoubleBattle() && !IsContest())
|
||||
{
|
||||
if (GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_OPPONENT_RIGHT || GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_PLAYER_LEFT)
|
||||
{
|
||||
if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)) == TRUE)
|
||||
{
|
||||
gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority--;
|
||||
SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
|
||||
priorityChanged = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES);
|
||||
else
|
||||
species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES);
|
||||
spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
|
||||
newSpriteId = sub_8076E34(gBattleAnimAttacker, spriteId, species);
|
||||
sub_80752A0(&animBg);
|
||||
AnimLoadCompressedBgTilemap(animBg.bgId, gMetalShineTilemap);
|
||||
AnimLoadCompressedBgGfx(animBg.bgId, gMetalShineGfx, animBg.tilesOffset);
|
||||
LoadCompressedPalette(gMetalShinePalette, animBg.paletteId * 16, 32);
|
||||
gBattle_BG1_X = -gSprites[spriteId].pos1.x + 96;
|
||||
gBattle_BG1_Y = -gSprites[spriteId].pos1.y + 32;
|
||||
paletteNum = 16 + gSprites[spriteId].oam.paletteNum;
|
||||
if (gBattleAnimArgs[1] == 0)
|
||||
SetGreyscaleOrOriginalPalette(paletteNum, FALSE);
|
||||
else
|
||||
BlendPalette(paletteNum * 16, 16, 11, gBattleAnimArgs[2]);
|
||||
gTasks[taskId].data[0] = newSpriteId;
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[0];
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[3] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].data[6] = priorityChanged;
|
||||
gTasks[taskId].func = sub_80B8920;
|
||||
}
|
||||
|
||||
static void sub_80B8920(u8 taskId)
|
||||
{
|
||||
struct BattleAnimBgData animBg;
|
||||
u16 paletteNum;
|
||||
u8 spriteId;
|
||||
|
||||
gTasks[taskId].data[10] += 4;
|
||||
gBattle_BG1_X -= 4;
|
||||
if (gTasks[taskId].data[10] == 128)
|
||||
{
|
||||
gTasks[taskId].data[10] = 0;
|
||||
gBattle_BG1_X += 128;
|
||||
gTasks[taskId].data[11]++;
|
||||
if (gTasks[taskId].data[11] == 2)
|
||||
{
|
||||
spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
|
||||
paletteNum = 16 + gSprites[spriteId].oam.paletteNum;
|
||||
if (gTasks[taskId].data[1] == 0)
|
||||
SetGreyscaleOrOriginalPalette(paletteNum, 1);
|
||||
DestroySprite(&gSprites[gTasks[taskId].data[0]]);
|
||||
sub_80752A0(&animBg);
|
||||
sub_8075358(animBg.bgId);
|
||||
if (gTasks[taskId].data[6] == 1)
|
||||
gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority++;
|
||||
}
|
||||
else if (gTasks[taskId].data[11] == 3)
|
||||
{
|
||||
gBattle_WIN0H = 0;
|
||||
gBattle_WIN0V = 0;
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);
|
||||
if (!IsContest())
|
||||
SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0);
|
||||
SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON);
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, 0);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Changes battler's palette to either greyscale or original.
|
||||
// arg0: which battler
|
||||
// arg1: 0 grayscale, 1 original
|
||||
void AnimTask_SetGreyscaleOrOriginalPal(u8 taskId)
|
||||
{
|
||||
u8 spriteId, battler;
|
||||
bool8 calcSpriteId = FALSE;
|
||||
u8 position = B_POSITION_PLAYER_LEFT;
|
||||
|
||||
switch (gBattleAnimArgs[0])
|
||||
{
|
||||
case 0:
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
|
||||
break;
|
||||
case 4:
|
||||
position = B_POSITION_PLAYER_LEFT;
|
||||
calcSpriteId = TRUE;
|
||||
break;
|
||||
case 5:
|
||||
position = B_POSITION_PLAYER_RIGHT;
|
||||
calcSpriteId = TRUE;
|
||||
break;
|
||||
case 6:
|
||||
position = B_POSITION_OPPONENT_LEFT;
|
||||
calcSpriteId = TRUE;
|
||||
break;
|
||||
case 7:
|
||||
position = B_POSITION_OPPONENT_RIGHT;
|
||||
calcSpriteId = TRUE;
|
||||
break;
|
||||
default:
|
||||
spriteId = 0xFF;
|
||||
break;
|
||||
}
|
||||
if (calcSpriteId)
|
||||
{
|
||||
battler = GetBattlerAtPosition(position);
|
||||
if (IsBattlerSpriteVisible(battler))
|
||||
spriteId = gBattlerSpriteIds[battler];
|
||||
else
|
||||
spriteId = 0xFF;
|
||||
}
|
||||
if (spriteId != 0xFF)
|
||||
SetGreyscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, gBattleAnimArgs[1]);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80B8B38(u8 taskId)
|
||||
{
|
||||
if (gAnimMoveTurn < 2)
|
||||
gBattleAnimArgs[7] = 0;
|
||||
if (gAnimMoveTurn == 2)
|
||||
gBattleAnimArgs[7] = 1;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
+2
-2
@@ -2087,7 +2087,7 @@ struct UnkStruct_82349CC
|
||||
u8 field_3;
|
||||
};
|
||||
|
||||
extern const struct UnkStruct_82349CC gUnknown_82349CC[NUM_SPECIES];
|
||||
extern const struct UnkStruct_82349CC gMonFrontPicCoords[NUM_SPECIES];
|
||||
|
||||
static void SpriteCB_Egg_2(struct Sprite* sprite)
|
||||
{
|
||||
@@ -2101,7 +2101,7 @@ static void SpriteCB_Egg_2(struct Sprite* sprite)
|
||||
sprite->data[0] = 0;
|
||||
species = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_SPECIES);
|
||||
gSprites[sEggHatchData->pokeSpriteID].pos2.x = 0;
|
||||
gSprites[sEggHatchData->pokeSpriteID].pos2.y = gUnknown_82349CC[species].field_1;
|
||||
gSprites[sEggHatchData->pokeSpriteID].pos2.y = gMonFrontPicCoords[species].field_1;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
+431
@@ -0,0 +1,431 @@
|
||||
#include "global.h"
|
||||
#include "battle_anim.h"
|
||||
#include "scanline_effect.h"
|
||||
#include "task.h"
|
||||
#include "trig.h"
|
||||
|
||||
static void sub_80B725C(struct Sprite *sprite);
|
||||
static void sub_80B741C(struct Sprite *sprite);
|
||||
static void sub_80B73AC(struct Sprite *sprite);
|
||||
static void sub_80B7448(struct Sprite *sprite);
|
||||
static void sub_80B77E4(struct Sprite *sprite);
|
||||
static void sub_80B74D8(struct Sprite *sprite);
|
||||
static void sub_80B76B0(u8 taskId);
|
||||
static void sub_80B776C(struct Task *task);
|
||||
static void sub_80B7894(struct Sprite *sprite);
|
||||
|
||||
static EWRAM_DATA u16 gUnknown_20399A4[7] = {0};
|
||||
|
||||
static const union AnimCmd gUnknown_83E7710[] =
|
||||
{
|
||||
ANIMCMD_FRAME(0, 4),
|
||||
ANIMCMD_FRAME(16, 4),
|
||||
ANIMCMD_FRAME(32, 4),
|
||||
ANIMCMD_FRAME(48, 4),
|
||||
ANIMCMD_FRAME(64, 4),
|
||||
ANIMCMD_JUMP(0),
|
||||
};
|
||||
|
||||
static const union AnimCmd *const gUnknown_83E7728[] =
|
||||
{
|
||||
gUnknown_83E7710,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E772C =
|
||||
{
|
||||
.tileTag = ANIM_TAG_SMALL_EMBER,
|
||||
.paletteTag = ANIM_TAG_SMALL_EMBER,
|
||||
.oam = &gOamData_83AC9D8,
|
||||
.anims = gUnknown_83E7728,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B725C,
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E7744[] =
|
||||
{
|
||||
ANIMCMD_FRAME(16, 3),
|
||||
ANIMCMD_FRAME(32, 3),
|
||||
ANIMCMD_FRAME(48, 3),
|
||||
ANIMCMD_JUMP(0),
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E7754[] =
|
||||
{
|
||||
ANIMCMD_FRAME(16, 3, .vFlip = TRUE, .hFlip = TRUE),
|
||||
ANIMCMD_FRAME(32, 3, .vFlip = TRUE, .hFlip = TRUE),
|
||||
ANIMCMD_FRAME(48, 3, .vFlip = TRUE, .hFlip = TRUE),
|
||||
ANIMCMD_JUMP(0),
|
||||
};
|
||||
|
||||
static const union AnimCmd *const gUnknown_83E7764[] =
|
||||
{
|
||||
gUnknown_83E7744,
|
||||
gUnknown_83E7754,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E776C[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x50, 0x50, 127, 0),
|
||||
AFFINEANIMCMD_FRAME(0xD, 0xD, 0, 100),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7784[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x50, 0x50, 0, 0),
|
||||
AFFINEANIMCMD_FRAME(0xD, 0xD, 0, 100),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd *const gUnknown_83E779C[] =
|
||||
{
|
||||
gUnknown_83E776C,
|
||||
gUnknown_83E7784,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E77A4 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_SMALL_EMBER,
|
||||
.paletteTag = ANIM_TAG_SMALL_EMBER,
|
||||
.oam = &gOamData_83ACA98,
|
||||
.anims = gUnknown_83E7764,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E779C,
|
||||
.callback = sub_80B741C,
|
||||
};
|
||||
|
||||
const union AnimCmd gUnknown_83E77BC[] =
|
||||
{
|
||||
ANIMCMD_FRAME(0, 5),
|
||||
ANIMCMD_FRAME(16, 5),
|
||||
ANIMCMD_FRAME(32, 5),
|
||||
ANIMCMD_FRAME(48, 5),
|
||||
ANIMCMD_FRAME(64, 5),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd *const gUnknown_83E77D4[] =
|
||||
{
|
||||
gUnknown_83E77BC,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E77D8 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_FIRE_PLUME,
|
||||
.paletteTag = ANIM_TAG_FIRE_PLUME,
|
||||
.oam = &gOamData_83AC9D8,
|
||||
.anims = gUnknown_83E77D4,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B73AC,
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E77F0[] =
|
||||
{
|
||||
ANIMCMD_FRAME(16, 3),
|
||||
ANIMCMD_FRAME(32, 3),
|
||||
ANIMCMD_FRAME(48, 3),
|
||||
ANIMCMD_JUMP(0),
|
||||
};
|
||||
|
||||
static const union AnimCmd *const gUnknown_83E7800[] =
|
||||
{
|
||||
gUnknown_83E77F0,
|
||||
gUnknown_83E77F0,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7808[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x64, 0x64, 127, 1),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7818[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x64, 0x64, 0, 1),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd *const gUnknown_83E7828[] =
|
||||
{
|
||||
gUnknown_83E7808,
|
||||
gUnknown_83E7818,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7830 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_SMALL_EMBER,
|
||||
.paletteTag = ANIM_TAG_SMALL_EMBER,
|
||||
.oam = &gOamData_83ACA98,
|
||||
.anims = gUnknown_83E7800,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7828,
|
||||
.callback = sub_80B741C,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7848 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_HOLLOW_ORB,
|
||||
.paletteTag = ANIM_TAG_HOLLOW_ORB,
|
||||
.oam = &gOamData_83AC9D0,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B7448,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7860 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_SMALL_EMBER,
|
||||
.paletteTag = ANIM_TAG_SMALL_EMBER,
|
||||
.oam = &gOamData_83AC9D8,
|
||||
.anims = gUnknown_83E7728,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B77E4,
|
||||
};
|
||||
|
||||
static void sub_80B725C(struct Sprite *sprite)
|
||||
{
|
||||
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
|
||||
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
|
||||
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
{
|
||||
sprite->pos1.x -= gBattleAnimArgs[0];
|
||||
gBattleAnimArgs[3] = -gBattleAnimArgs[3];
|
||||
gBattleAnimArgs[4] = -gBattleAnimArgs[4];
|
||||
}
|
||||
else
|
||||
{
|
||||
sprite->pos1.x += gBattleAnimArgs[0];
|
||||
}
|
||||
sprite->pos1.y += gBattleAnimArgs[1];
|
||||
sprite->data[0] = gBattleAnimArgs[2];
|
||||
sprite->data[1] = gBattleAnimArgs[3];
|
||||
sprite->data[3] = gBattleAnimArgs[4];
|
||||
sprite->data[5] = gBattleAnimArgs[5];
|
||||
sprite->invisible = TRUE;
|
||||
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
|
||||
sprite->callback = TranslateSpriteLinearAndFlicker;
|
||||
}
|
||||
|
||||
static void sub_80B72F8(struct Sprite *sprite)
|
||||
{
|
||||
SetSpriteCoordsToAnimAttackerCoords(sprite);
|
||||
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
|
||||
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
|
||||
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
{
|
||||
sprite->pos1.x -= gBattleAnimArgs[1];
|
||||
sprite->pos1.y += gBattleAnimArgs[1];
|
||||
sprite->data[2] -= gBattleAnimArgs[2];
|
||||
sprite->data[4] += gBattleAnimArgs[3];
|
||||
}
|
||||
else
|
||||
{
|
||||
sprite->pos1.x += gBattleAnimArgs[0];
|
||||
sprite->pos1.y += gBattleAnimArgs[1];
|
||||
sprite->data[2] += gBattleAnimArgs[2];
|
||||
sprite->data[4] += gBattleAnimArgs[3];
|
||||
StartSpriteAnim(sprite, 1);
|
||||
}
|
||||
sprite->data[0] = gBattleAnimArgs[4];
|
||||
sprite->callback = StartAnimLinearTranslation;
|
||||
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
|
||||
}
|
||||
|
||||
static void sub_80B73AC(struct Sprite *sprite)
|
||||
{
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
{
|
||||
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0);
|
||||
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 0);
|
||||
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 1);
|
||||
}
|
||||
SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[1]);
|
||||
sprite->pos1.y += gBattleAnimArgs[2];
|
||||
sprite->callback = RunStoredCallbackWhenAnimEnds;
|
||||
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
|
||||
}
|
||||
|
||||
static void sub_80B741C(struct Sprite *sprite)
|
||||
{
|
||||
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
StartSpriteAffineAnim(sprite, 1);
|
||||
sub_80B72F8(sprite);
|
||||
}
|
||||
|
||||
static void sub_80B7448(struct Sprite *sprite)
|
||||
{
|
||||
u16 r5;
|
||||
u16 r0;
|
||||
|
||||
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
|
||||
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
|
||||
sprite->data[4] = 0;
|
||||
sprite->data[5] = 1;
|
||||
sprite->data[6] = gBattleAnimArgs[0];
|
||||
r5 = GetBattlerSpriteCoordAttr(gBattlerAttacker, BATTLER_COORD_ATTR_HEIGHT);
|
||||
r0 = GetBattlerSpriteCoordAttr(gBattlerAttacker, BATTLER_COORD_ATTR_WIDTH);
|
||||
if (r5 > r0)
|
||||
sprite->data[7] = r5 / 2;
|
||||
else
|
||||
sprite->data[7] = r0 / 2;
|
||||
sprite->pos2.x = Cos(sprite->data[6], sprite->data[7]);
|
||||
sprite->pos2.y = Sin(sprite->data[6], sprite->data[7]);
|
||||
sprite->callback = sub_80B74D8;
|
||||
}
|
||||
|
||||
static void sub_80B74D8(struct Sprite *sprite)
|
||||
{
|
||||
switch (sprite->data[0])
|
||||
{
|
||||
case 0:
|
||||
sprite->data[6] = (sprite->data[6] - sprite->data[5]) & 0xFF;
|
||||
sprite->pos2.x = Cos(sprite->data[6], sprite->data[7]);
|
||||
sprite->pos2.y = Sin(sprite->data[6], sprite->data[7]);
|
||||
if (++sprite->data[4] > 5)
|
||||
{
|
||||
sprite->data[4] = 0;
|
||||
if (sprite->data[5] <= 15 && ++sprite->data[5] > 15)
|
||||
sprite->data[5] = 16;
|
||||
}
|
||||
if (++sprite->data[3] > 0x3C)
|
||||
{
|
||||
sprite->data[3] = 0;
|
||||
++sprite->data[0];
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
sprite->data[6] = (sprite->data[6] - sprite->data[5]) & 0xFF;
|
||||
if (sprite->data[7] <= 0x95 && (sprite->data[7] += 8) > 0x95)
|
||||
sprite->data[7] = 0x96;
|
||||
sprite->pos2.x = Cos(sprite->data[6], sprite->data[7]);
|
||||
sprite->pos2.y = Sin(sprite->data[6], sprite->data[7]);
|
||||
if (++sprite->data[4] > 5)
|
||||
{
|
||||
sprite->data[4] = 0;
|
||||
if (sprite->data[5] <= 15 && ++sprite->data[5] > 15)
|
||||
sprite->data[5] = 16;
|
||||
}
|
||||
if (++sprite->data[3] > 20)
|
||||
DestroyAnimSprite(sprite);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80B75E0(u8 taskId)
|
||||
{
|
||||
struct ScanlineEffectParams sp;
|
||||
struct Task *task = &gTasks[taskId];
|
||||
u16 i;
|
||||
u8 r1;
|
||||
|
||||
if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1)
|
||||
{
|
||||
sp.dmaDest = ®_BG1HOFS;
|
||||
task->data[2] = gBattle_BG1_X;
|
||||
}
|
||||
else
|
||||
{
|
||||
sp.dmaDest = ®_BG2HOFS;
|
||||
task->data[2] = gBattle_BG2_X;
|
||||
}
|
||||
sp.dmaControl = 0xA2600001;
|
||||
sp.initState = 1;
|
||||
sp.unused9 = 0;
|
||||
r1 = GetBattlerYCoordWithElevation(gBattleAnimAttacker);
|
||||
task->data[3] = r1 - 32;
|
||||
task->data[4] = r1 + 32;
|
||||
if (task->data[3] < 0)
|
||||
task->data[3] = 0;
|
||||
for (i = task->data[3]; i <= task->data[4]; ++i)
|
||||
{
|
||||
gScanlineEffectRegBuffers[0][i] = task->data[2];
|
||||
gScanlineEffectRegBuffers[1][i] = task->data[2];
|
||||
}
|
||||
ScanlineEffect_SetParams(sp);
|
||||
task->func = sub_80B76B0;
|
||||
}
|
||||
|
||||
static void sub_80B76B0(u8 taskId)
|
||||
{
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
switch (task->data[0])
|
||||
{
|
||||
case 0:
|
||||
if (++task->data[7] > 1)
|
||||
{
|
||||
task->data[7] = 0;
|
||||
if (++task->data[6] == 3)
|
||||
++task->data[0];
|
||||
}
|
||||
sub_80B776C(task);
|
||||
break;
|
||||
case 1:
|
||||
if (++task->data[1] > 0x3C)
|
||||
++task->data[0];
|
||||
sub_80B776C(task);
|
||||
break;
|
||||
case 2:
|
||||
if (++task->data[7] > 1)
|
||||
{
|
||||
task->data[7] = 0;
|
||||
if (--task->data[6] == 0)
|
||||
++task->data[0];
|
||||
}
|
||||
sub_80B776C(task);
|
||||
break;
|
||||
case 3:
|
||||
gScanlineEffect.state = 3;
|
||||
++task->data[0];
|
||||
break;
|
||||
case 4:
|
||||
DestroyAnimVisualTask(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B776C(struct Task *task)
|
||||
{
|
||||
u16 i, r3 = task->data[5];
|
||||
|
||||
for (i = task->data[3]; i <= task->data[4]; ++i)
|
||||
{
|
||||
gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = ((gSineTable[r3] * task->data[6]) >> 7) + task->data[2];
|
||||
r3 = (r3 + 8) & 0xFF;
|
||||
}
|
||||
task->data[5] = (task->data[5] + 9) & 0xFF;
|
||||
}
|
||||
|
||||
static void sub_80B77E4(struct Sprite *sprite)
|
||||
{
|
||||
s32 i, r6 = (gBattleAnimArgs[2] * 3) / 5;
|
||||
|
||||
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
|
||||
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + gBattleAnimArgs[4];
|
||||
sprite->data[1] = Cos(gBattleAnimArgs[1], gBattleAnimArgs[2]);
|
||||
sprite->data[2] = Sin(gBattleAnimArgs[1], r6);
|
||||
sprite->pos1.x += sprite->data[1] * gBattleAnimArgs[0];
|
||||
sprite->pos1.y += sprite->data[2] * gBattleAnimArgs[0];
|
||||
sprite->data[3] = gBattleAnimArgs[3];
|
||||
sprite->callback = sub_80B7894;
|
||||
for (i = 0; i < 7; ++i)
|
||||
gUnknown_20399A4[i] = sprite->data[i];
|
||||
}
|
||||
|
||||
static void sub_80B7894(struct Sprite *sprite)
|
||||
{
|
||||
sprite->data[4] += sprite->data[1];
|
||||
sprite->data[5] += sprite->data[2];
|
||||
sprite->pos2.x = sprite->data[4] / 10;
|
||||
sprite->pos2.y = sprite->data[5] / 10;
|
||||
if (++sprite->data[0] > sprite->data[3])
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
+2
-2
@@ -552,7 +552,7 @@ static void Task_TopMenuHandleInput(u8 taskId)
|
||||
if (FindTaskIdByFunc(Task_FCOpenOrCloseInfoBox) == 0xFF)
|
||||
{
|
||||
RunTextPrinters();
|
||||
if ((JOY_NEW(SELECT_BUTTON)) && !sFameCheckerData->inPickMode && sFameCheckerData->savedCallback != ReturnToBagFromKeyItem)
|
||||
if ((JOY_NEW(SELECT_BUTTON)) && !sFameCheckerData->inPickMode && sFameCheckerData->savedCallback != CB2_BagMenuFromStartMenu)
|
||||
task->func = Task_StartToCloseFameChecker;
|
||||
else if (JOY_NEW(START_BUTTON))
|
||||
{
|
||||
@@ -802,7 +802,7 @@ static void WipeMsgBoxAndTransfer(void)
|
||||
|
||||
static void Setup_DrawMsgAndListBoxes(void)
|
||||
{
|
||||
sub_80F6E9C();
|
||||
LoadStdWindowFrameGfx();
|
||||
DrawDialogueFrame(FCWINDOWID_MSGBOX, TRUE);
|
||||
FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_MSGBOX);
|
||||
FC_PutWindowTilemapAndCopyWindowToVramMode3(FCWINDOWID_LIST);
|
||||
|
||||
@@ -475,25 +475,25 @@ static void sub_807E31C(u8 taskId)
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_807E378(u8 taskId)
|
||||
static void Task_WaitFadeAndCreateStartMenuTask(u8 taskId)
|
||||
{
|
||||
if (sub_807E418() == TRUE)
|
||||
{
|
||||
DestroyTask(taskId);
|
||||
CreateTask(sub_806F1F0, 80);
|
||||
CreateTask(Task_StartMenuHandleInput, 80);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_807E3A0(void)
|
||||
void FadeTransition_FadeInOnReturnToStartMenu(void)
|
||||
{
|
||||
sub_807DC00();
|
||||
CreateTask(sub_807E378, 80);
|
||||
CreateTask(Task_WaitFadeAndCreateStartMenuTask, 80);
|
||||
ScriptContext2_Enable();
|
||||
}
|
||||
|
||||
bool32 sub_807E3BC(void)
|
||||
bool8 FieldCB2_ReturnToStartMenuInit(void)
|
||||
{
|
||||
sub_806F1D4();
|
||||
SetUpReturnToStartMenu();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -522,7 +522,7 @@ static bool32 sub_807E40C(void)
|
||||
|
||||
bool32 sub_807E418(void)
|
||||
{
|
||||
if (sub_807AA70() == TRUE && sub_80F83B0())
|
||||
if (field_weather_is_fade_finished() == TRUE && sub_80F83B0())
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
|
||||
+1289
File diff suppressed because it is too large
Load Diff
+1484
File diff suppressed because it is too large
Load Diff
+724
@@ -0,0 +1,724 @@
|
||||
#include "global.h"
|
||||
#include "battle_anim.h"
|
||||
#include "random.h"
|
||||
#include "scanline_effect.h"
|
||||
#include "task.h"
|
||||
#include "trig.h"
|
||||
|
||||
static void AnimBonemerangProjectile(struct Sprite *sprite);
|
||||
static void AnimBoneHitProjectile(struct Sprite *sprite);
|
||||
static void AnimDirtScatter(struct Sprite *sprite);
|
||||
static void AnimMudSportDirt(struct Sprite *sprite);
|
||||
static void AnimFissureDirtPlumeParticle(struct Sprite *sprite);
|
||||
static void AnimDigDirtMound(struct Sprite *sprite);
|
||||
static void AnimBonemerangProjectileStep(struct Sprite *sprite);
|
||||
static void AnimBonemerangProjectileEnd(struct Sprite *sprite);
|
||||
static void AnimMudSportDirtRising(struct Sprite *sprite);
|
||||
static void AnimMudSportDirtFalling(struct Sprite *sprite);
|
||||
static void sub_80B8ED4(u8 taskId);
|
||||
static void sub_80B908C(u8 taskId);
|
||||
static void sub_80B92B8(u8 useBg1, s16 y, s16 endY);
|
||||
static void sub_80B912C(u8 taskId);
|
||||
static void sub_80B91B0(u8 taskId);
|
||||
static void AnimFissureDirtPlumeParticleStep(struct Sprite *sprite);
|
||||
static void sub_80B9584(u8 taskId);
|
||||
static void sub_80B967C(u8 taskId);
|
||||
static void sub_80B9760(struct Task *task);
|
||||
static void sub_80B98A8(u8 taskId);
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7A00[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, 15, 1),
|
||||
AFFINEANIMCMD_JUMP(0),
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7A10[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, 20, 1),
|
||||
AFFINEANIMCMD_JUMP(0),
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd *const gUnknown_83E7A20[] =
|
||||
{
|
||||
gUnknown_83E7A00,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd *const gUnknown_83E7A24[] =
|
||||
{
|
||||
gUnknown_83E7A10,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7A28 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_BONE,
|
||||
.paletteTag = ANIM_TAG_BONE,
|
||||
.oam = &gOamData_83ACA38,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7A20,
|
||||
.callback = AnimBonemerangProjectile,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7A40 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_BONE,
|
||||
.paletteTag = ANIM_TAG_BONE,
|
||||
.oam = &gOamData_83ACA38,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7A24,
|
||||
.callback = AnimBoneHitProjectile,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7A58 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_MUD_SAND,
|
||||
.paletteTag = ANIM_TAG_MUD_SAND,
|
||||
.oam = &gOamData_83AC9C8,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = AnimDirtScatter,
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E7A70[] =
|
||||
{
|
||||
ANIMCMD_FRAME(1, 1),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd *const gUnknown_83E7A78[] =
|
||||
{
|
||||
gUnknown_83E7A70,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7A7C =
|
||||
{
|
||||
.tileTag = ANIM_TAG_MUD_SAND,
|
||||
.paletteTag = ANIM_TAG_MUD_SAND,
|
||||
.oam = &gOamData_83AC9D0,
|
||||
.anims = gUnknown_83E7A78,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = AnimDirtScatter,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7A94 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_MUD_SAND,
|
||||
.paletteTag = ANIM_TAG_MUD_SAND,
|
||||
.oam = &gOamData_83AC9D0,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = AnimMudSportDirt,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7AAC =
|
||||
{
|
||||
.tileTag = ANIM_TAG_MUD_SAND,
|
||||
.paletteTag = ANIM_TAG_MUD_SAND,
|
||||
.oam = &gOamData_83AC9C8,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = AnimFissureDirtPlumeParticle,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7AC4 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_DIRT_MOUND,
|
||||
.paletteTag = ANIM_TAG_DIRT_MOUND,
|
||||
.oam = &gOamData_83AC9F8,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = AnimDigDirtMound,
|
||||
};
|
||||
|
||||
// Moves a bone projectile towards the target mon, which moves like
|
||||
// a boomerang. After hitting the target mon, it comes back to the user.
|
||||
static void AnimBonemerangProjectile(struct Sprite *sprite)
|
||||
{
|
||||
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
|
||||
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
|
||||
sprite->data[0] = 20;
|
||||
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
|
||||
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
|
||||
sprite->data[5] = -40;
|
||||
InitAnimArcTranslation(sprite);
|
||||
sprite->callback = AnimBonemerangProjectileStep;
|
||||
}
|
||||
|
||||
static void AnimBonemerangProjectileStep(struct Sprite *sprite)
|
||||
{
|
||||
if (TranslateAnimHorizontalArc(sprite))
|
||||
{
|
||||
sprite->pos1.x += sprite->pos2.x;
|
||||
sprite->pos1.y += sprite->pos2.y;
|
||||
sprite->pos2.y = 0;
|
||||
sprite->pos2.x = 0;
|
||||
sprite->data[0] = 20;
|
||||
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
|
||||
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
|
||||
sprite->data[5] = 40;
|
||||
InitAnimArcTranslation(sprite);
|
||||
sprite->callback = AnimBonemerangProjectileEnd;
|
||||
}
|
||||
}
|
||||
|
||||
static void AnimBonemerangProjectileEnd(struct Sprite *sprite)
|
||||
{
|
||||
if (TranslateAnimHorizontalArc(sprite))
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
|
||||
// Moves a bone projectile towards the target mon, starting right next to
|
||||
// the target mon.
|
||||
// arg 0: initial x pixel offset
|
||||
// arg 1: initial y pixel offset
|
||||
// arg 2: target x pixel offset
|
||||
// arg 3: target y pixel offset
|
||||
// arg 4: duration
|
||||
static void AnimBoneHitProjectile(struct Sprite *sprite)
|
||||
{
|
||||
InitSpritePosToAnimTarget(sprite, TRUE);
|
||||
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
|
||||
sprite->data[0] = gBattleAnimArgs[4];
|
||||
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + gBattleAnimArgs[2];
|
||||
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[3];
|
||||
sprite->callback = StartAnimLinearTranslation;
|
||||
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
|
||||
}
|
||||
|
||||
// Moves a small dirt projectile towards the target mon.
|
||||
// arg 0: initial x pixel offset
|
||||
// arg 1: initial y pixel offset
|
||||
// arg 2: duration
|
||||
// arg 3: target x pixel offset
|
||||
// arg 4: target y pixel offset
|
||||
static void AnimDirtScatter(struct Sprite *sprite)
|
||||
{
|
||||
u8 targetXPos, targetYPos;
|
||||
s16 xOffset, yOffset;
|
||||
|
||||
InitSpritePosToAnimAttacker(sprite, 1);
|
||||
targetXPos = GetBattlerSpriteCoord2(gBattleAnimTarget, 2);
|
||||
targetYPos = GetBattlerSpriteCoord2(gBattleAnimTarget, 3);
|
||||
xOffset = Random() & 0x1F;
|
||||
yOffset = Random() & 0x1F;
|
||||
if (xOffset > 16)
|
||||
xOffset = 16 - xOffset;
|
||||
if (yOffset > 16)
|
||||
yOffset = 16 - yOffset;
|
||||
sprite->data[0] = gBattleAnimArgs[2];
|
||||
sprite->data[2] = targetXPos + xOffset;
|
||||
sprite->data[4] = targetYPos + yOffset;
|
||||
sprite->callback = StartAnimLinearTranslation;
|
||||
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
|
||||
}
|
||||
|
||||
// Moves a particle of dirt in the Mud Sport animation.
|
||||
// The dirt can either be rising upward, or falling down.
|
||||
// arg 0: 0 = dirt is rising into the air, 1 = dirt is falling down
|
||||
// arg 1: initial x pixel offset
|
||||
// arg 2: initial y pixel offset
|
||||
static void AnimMudSportDirt(struct Sprite *sprite)
|
||||
{
|
||||
++sprite->oam.tileNum;
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
{
|
||||
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) + gBattleAnimArgs[1];
|
||||
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + gBattleAnimArgs[2];
|
||||
sprite->data[0] = gBattleAnimArgs[1] > 0 ? 1 : -1;
|
||||
sprite->callback = AnimMudSportDirtRising;
|
||||
}
|
||||
else
|
||||
{
|
||||
sprite->pos1.x = gBattleAnimArgs[1];
|
||||
sprite->pos1.y = gBattleAnimArgs[2];
|
||||
sprite->pos2.y = -gBattleAnimArgs[2];
|
||||
sprite->callback = AnimMudSportDirtFalling;
|
||||
}
|
||||
}
|
||||
|
||||
static void AnimMudSportDirtRising(struct Sprite *sprite)
|
||||
{
|
||||
if (++sprite->data[1] > 1)
|
||||
{
|
||||
sprite->data[1] = 0;
|
||||
sprite->pos1.x += sprite->data[0];
|
||||
}
|
||||
sprite->pos1.y -= 4;
|
||||
if (sprite->pos1.y < -4)
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
|
||||
static void AnimMudSportDirtFalling(struct Sprite *sprite)
|
||||
{
|
||||
switch (sprite->data[0])
|
||||
{
|
||||
case 0:
|
||||
sprite->pos2.y += 4;
|
||||
if (sprite->pos2.y >= 0)
|
||||
{
|
||||
sprite->pos2.y = 0;
|
||||
++sprite->data[0];
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (++sprite->data[1] > 0)
|
||||
{
|
||||
sprite->data[1] = 0;
|
||||
sprite->invisible ^= 1;
|
||||
if (++sprite->data[2] == 10)
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80B8E94(u8 taskId)
|
||||
{
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
task->func = sub_80B8ED4;
|
||||
else
|
||||
task->func = sub_80B908C;
|
||||
task->func(taskId);
|
||||
}
|
||||
|
||||
static void sub_80B8ED4(u8 taskId)
|
||||
{
|
||||
u8 var0;
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
switch (task->data[0])
|
||||
{
|
||||
case 0:
|
||||
task->data[10] = GetAnimBattlerSpriteId(0);
|
||||
task->data[11] = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker);
|
||||
if (task->data[11] == 1)
|
||||
{
|
||||
task->data[12] = gBattle_BG1_X;
|
||||
task->data[13] = gBattle_BG1_Y;
|
||||
}
|
||||
else
|
||||
{
|
||||
task->data[12] = gBattle_BG2_X;
|
||||
task->data[13] = gBattle_BG2_Y;
|
||||
}
|
||||
var0 = GetBattlerYCoordWithElevation(gBattleAnimAttacker);
|
||||
task->data[14] = var0 - 32;
|
||||
task->data[15] = var0 + 32;
|
||||
if (task->data[14] < 0)
|
||||
task->data[14] = 0;
|
||||
gSprites[task->data[10]].invisible = TRUE;
|
||||
++task->data[0];
|
||||
break;
|
||||
case 1:
|
||||
sub_80B92B8(task->data[11], task->data[14], task->data[15]);
|
||||
++task->data[0];
|
||||
break;
|
||||
case 2:
|
||||
task->data[2] = (task->data[2] + 6) & 0x7F;
|
||||
if (++task->data[4] > 2)
|
||||
{
|
||||
task->data[4] = 0;
|
||||
++task->data[3];
|
||||
}
|
||||
task->data[5] = task->data[3] + (gSineTable[task->data[2]] >> 4);
|
||||
if (task->data[11] == 1)
|
||||
gBattle_BG1_Y = task->data[13] - task->data[5];
|
||||
else
|
||||
gBattle_BG2_Y = task->data[13] - task->data[5];
|
||||
|
||||
if (task->data[5] > 63)
|
||||
{
|
||||
task->data[5] = 120 - task->data[14];
|
||||
if (task->data[11] == 1)
|
||||
gBattle_BG1_Y = task->data[13] - task->data[5];
|
||||
else
|
||||
gBattle_BG2_Y = task->data[13] - task->data[5];
|
||||
|
||||
gSprites[task->data[10]].pos2.x = 272 - gSprites[task->data[10]].pos1.x;
|
||||
++task->data[0];
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
gScanlineEffect.state = 3;
|
||||
++task->data[0];
|
||||
break;
|
||||
case 4:
|
||||
DestroyAnimVisualTask(taskId);
|
||||
gSprites[task->data[10]].invisible = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B908C(u8 taskId)
|
||||
{
|
||||
u8 spriteId = GetAnimBattlerSpriteId(0);
|
||||
|
||||
gSprites[spriteId].invisible = TRUE;
|
||||
gSprites[spriteId].pos2.x = 0;
|
||||
gSprites[spriteId].pos2.y = 0;
|
||||
if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1)
|
||||
gBattle_BG1_Y = 0;
|
||||
else
|
||||
gBattle_BG2_Y = 0;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80B90EC(u8 taskId)
|
||||
{
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
task->func = sub_80B912C;
|
||||
else
|
||||
task->func = sub_80B91B0;
|
||||
|
||||
task->func(taskId);
|
||||
}
|
||||
|
||||
static void sub_80B912C(u8 taskId)
|
||||
{
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
switch (task->data[0])
|
||||
{
|
||||
case 0:
|
||||
task->data[10] = GetAnimBattlerSpriteId(0);
|
||||
gSprites[task->data[10]].invisible = FALSE;
|
||||
gSprites[task->data[10]].pos2.x = 0;
|
||||
gSprites[task->data[10]].pos2.y = 160 - gSprites[task->data[10]].pos1.y;
|
||||
++task->data[0];
|
||||
break;
|
||||
case 1:
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B91B0(u8 taskId)
|
||||
{
|
||||
u8 var0;
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
switch (task->data[0])
|
||||
{
|
||||
case 0:
|
||||
task->data[10] = GetAnimBattlerSpriteId(0);
|
||||
task->data[11] = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker);
|
||||
if (task->data[11] == 1)
|
||||
task->data[12] = gBattle_BG1_X;
|
||||
else
|
||||
task->data[12] = gBattle_BG2_X;
|
||||
|
||||
var0 = GetBattlerYCoordWithElevation(gBattleAnimAttacker);
|
||||
task->data[14] = var0 - 32;
|
||||
task->data[15] = var0 + 32;
|
||||
++task->data[0];
|
||||
break;
|
||||
case 1:
|
||||
sub_80B92B8(task->data[11], 0, task->data[15]);
|
||||
++task->data[0];
|
||||
break;
|
||||
case 2:
|
||||
gSprites[task->data[10]].pos2.y = 96;
|
||||
++task->data[0];
|
||||
break;
|
||||
case 3:
|
||||
gSprites[task->data[10]].pos2.y -= 8;
|
||||
if (gSprites[task->data[10]].pos2.y == 0)
|
||||
{
|
||||
gScanlineEffect.state = 3;
|
||||
++task->data[0];
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
DestroyAnimVisualTask(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B92B8(u8 useBG1, s16 y, s16 endY)
|
||||
{
|
||||
s16 bgX;
|
||||
struct ScanlineEffectParams scanlineParams;
|
||||
|
||||
if (useBG1 == 1)
|
||||
{
|
||||
bgX = gBattle_BG1_X;
|
||||
scanlineParams.dmaDest = ®_BG1HOFS;
|
||||
}
|
||||
else
|
||||
{
|
||||
bgX = gBattle_BG2_X;
|
||||
scanlineParams.dmaDest = ®_BG2HOFS;
|
||||
}
|
||||
if (y < 0)
|
||||
y = 0;
|
||||
while (y < endY)
|
||||
{
|
||||
gScanlineEffectRegBuffers[0][y] = bgX;
|
||||
gScanlineEffectRegBuffers[1][y] = bgX;
|
||||
++y;
|
||||
}
|
||||
while (y < 160)
|
||||
{
|
||||
gScanlineEffectRegBuffers[0][y] = bgX + 240;
|
||||
gScanlineEffectRegBuffers[1][y] = bgX + 240;
|
||||
++y;
|
||||
}
|
||||
scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;
|
||||
scanlineParams.initState = 1;
|
||||
scanlineParams.unused9 = 0;
|
||||
ScanlineEffect_SetParams(scanlineParams);
|
||||
}
|
||||
|
||||
// Moves a particle of dirt in a plume of dirt. Used in Fissure and Dig.
|
||||
// arg 0: which mon (0 = attacker, 1 = target)
|
||||
// arg 1: which side of mon (0 = left, 1 = right)
|
||||
// arg 2: target x offset
|
||||
// arg 3: target y offset
|
||||
// arg 4: wave amplitude
|
||||
// arg 5: duration
|
||||
static void AnimFissureDirtPlumeParticle(struct Sprite *sprite)
|
||||
{
|
||||
s8 battler;
|
||||
s16 xOffset;
|
||||
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
battler = gBattleAnimAttacker;
|
||||
else
|
||||
battler = gBattleAnimTarget;
|
||||
xOffset = 24;
|
||||
if (gBattleAnimArgs[1] == 1)
|
||||
{
|
||||
xOffset *= -1;
|
||||
gBattleAnimArgs[2] *= -1;
|
||||
}
|
||||
sprite->pos1.x = GetBattlerSpriteCoord(battler, 2) + xOffset;
|
||||
sprite->pos1.y = GetBattlerYCoordWithElevation(battler) + 30;
|
||||
sprite->data[0] = gBattleAnimArgs[5];
|
||||
sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2];
|
||||
sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[3];
|
||||
sprite->data[5] = gBattleAnimArgs[4];
|
||||
InitAnimArcTranslation(sprite);
|
||||
sprite->callback = AnimFissureDirtPlumeParticleStep;
|
||||
}
|
||||
|
||||
static void AnimFissureDirtPlumeParticleStep(struct Sprite *sprite)
|
||||
{
|
||||
if (TranslateAnimHorizontalArc(sprite))
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
|
||||
// Displays the dirt mound seen in the move Dig for set duration.
|
||||
// The dirt mound image is too large for a single sprite, so two
|
||||
// sprites are lined up next to each other.
|
||||
// arg 0: which mon (0 = attacker, 1 = target)
|
||||
// arg 1: oam tile num (0 = left half of image, 1 = right half of image)
|
||||
// arg 2: duration
|
||||
static void AnimDigDirtMound(struct Sprite *sprite)
|
||||
{
|
||||
s8 battler;
|
||||
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
battler = gBattleAnimAttacker;
|
||||
else
|
||||
battler = gBattleAnimTarget;
|
||||
sprite->pos1.x = GetBattlerSpriteCoord(battler, 0) - 16 + (gBattleAnimArgs[1] * 32);
|
||||
sprite->pos1.y = GetBattlerYCoordWithElevation(battler) + 32;
|
||||
sprite->oam.tileNum += gBattleAnimArgs[1] * 8;
|
||||
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
|
||||
sprite->data[0] = gBattleAnimArgs[2];
|
||||
sprite->callback = WaitAnimForDuration;
|
||||
}
|
||||
|
||||
void sub_80B94B4(u8 taskId)
|
||||
{
|
||||
u16 i;
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
if (gBattleAnimArgs[1])
|
||||
task->data[14] = task->data[15] = gBattleAnimArgs[1] + 3;
|
||||
else
|
||||
task->data[14] = task->data[15] = (gAnimMovePower / 10) + 3;
|
||||
|
||||
task->data[3] = gBattleAnimArgs[2];
|
||||
switch (gBattleAnimArgs[0])
|
||||
{
|
||||
case 5:
|
||||
task->data[13] = gBattle_BG3_X;
|
||||
task->func = sub_80B9584;
|
||||
break;
|
||||
case 4:
|
||||
task->data[13] = 0;
|
||||
for (i = 0; i < MAX_BATTLERS_COUNT; ++i)
|
||||
{
|
||||
if (IsBattlerSpriteVisible(i))
|
||||
{
|
||||
task->data[task->data[13] + 9] = gBattlerSpriteIds[i];
|
||||
++task->data[13];
|
||||
}
|
||||
}
|
||||
task->func = sub_80B967C;
|
||||
break;
|
||||
default:
|
||||
task->data[9] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
|
||||
if (task->data[9] == 0xFF)
|
||||
{
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
else
|
||||
{
|
||||
task->data[13] = 1;
|
||||
task->func = sub_80B967C;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B9584(u8 taskId)
|
||||
{
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
switch (task->data[0])
|
||||
{
|
||||
case 0:
|
||||
if (++task->data[1] > 1)
|
||||
{
|
||||
task->data[1] = 0;
|
||||
if ((task->data[2] & 1) == 0)
|
||||
gBattle_BG3_X = task->data[13] + task->data[15];
|
||||
else
|
||||
gBattle_BG3_X = task->data[13] - task->data[15];
|
||||
|
||||
if (++task->data[2] == task->data[3])
|
||||
{
|
||||
task->data[2] = 0;
|
||||
--task->data[14];
|
||||
++task->data[0];
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (++task->data[1] > 1)
|
||||
{
|
||||
task->data[1] = 0;
|
||||
if ((task->data[2] & 1) == 0)
|
||||
gBattle_BG3_X = task->data[13] + task->data[14];
|
||||
else
|
||||
gBattle_BG3_X = task->data[13] - task->data[14];
|
||||
|
||||
if (++task->data[2] == 4)
|
||||
{
|
||||
task->data[2] = 0;
|
||||
if (--task->data[14] == 0)
|
||||
++task->data[0];
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
gBattle_BG3_X = task->data[13];
|
||||
DestroyAnimVisualTask(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B967C(u8 taskId)
|
||||
{
|
||||
u16 i;
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
switch (task->data[0])
|
||||
{
|
||||
case 0:
|
||||
if (++task->data[1] > 1)
|
||||
{
|
||||
task->data[1] = 0;
|
||||
sub_80B9760(task);
|
||||
if (++task->data[2] == task->data[3])
|
||||
{
|
||||
task->data[2] = 0;
|
||||
--task->data[14];
|
||||
++task->data[0];
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (++task->data[1] > 1)
|
||||
{
|
||||
task->data[1] = 0;
|
||||
sub_80B9760(task);
|
||||
if (++task->data[2] == 4)
|
||||
{
|
||||
task->data[2] = 0;
|
||||
if (--task->data[14] == 0)
|
||||
++task->data[0];
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
for (i = 0; i < task->data[13]; ++i)
|
||||
gSprites[task->data[9 + i]].pos2.x = 0;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B9760(struct Task *task)
|
||||
{
|
||||
u16 i, xOffset;
|
||||
|
||||
if ((task->data[2] & 1) == 0)
|
||||
xOffset = (task->data[14] / 2) + (task->data[14] & 1);
|
||||
else
|
||||
xOffset = -(task->data[14] / 2);
|
||||
for (i = 0; i < task->data[13]; ++i)
|
||||
gSprites[task->data[9 + i]].pos2.x = xOffset;
|
||||
}
|
||||
|
||||
void AnimTask_IsPowerOver99(u8 taskId)
|
||||
{
|
||||
gBattleAnimArgs[15] = gAnimMovePower > 99;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80B9800(u8 taskId)
|
||||
{
|
||||
struct Task *newTask;
|
||||
u8 battler = (gBattleAnimArgs[0] & 1) ? gBattleAnimTarget : gBattleAnimAttacker;
|
||||
|
||||
if (gBattleAnimArgs[0] > 1)
|
||||
battler ^= BIT_FLANK;
|
||||
newTask = &gTasks[CreateTask(sub_80B98A8, gBattleAnimArgs[1])];
|
||||
newTask->data[1] = (32 - GetBattlerSpriteCoord(battler, 2)) & 0x1FF;
|
||||
newTask->data[2] = (64 - GetBattlerSpriteCoord(battler, 3)) & 0xFF;
|
||||
gBattle_BG3_X = newTask->data[1];
|
||||
gBattle_BG3_Y = newTask->data[2];
|
||||
newTask->data[3] = gBattleAnimArgs[2];
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
static void sub_80B98A8(u8 taskId)
|
||||
{
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
if (gBattleAnimArgs[7] == task->data[3])
|
||||
{
|
||||
gBattle_BG3_X = 0;
|
||||
gBattle_BG3_Y = 0;
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
else
|
||||
{
|
||||
gBattle_BG3_X = task->data[1];
|
||||
gBattle_BG3_Y = task->data[2];
|
||||
}
|
||||
}
|
||||
+31
-31
@@ -16,13 +16,13 @@
|
||||
#include "constants/maps.h"
|
||||
#include "constants/songs.h"
|
||||
|
||||
static EWRAM_DATA u16 gUnknown_203B0EC = 0;
|
||||
static EWRAM_DATA u16 sSomeVariable = 0;
|
||||
static EWRAM_DATA u8 gUnknown_203B0EE = 0;
|
||||
|
||||
u8 gUnknown_3005E9C[4];
|
||||
u16 gUnknown_3005EA0;
|
||||
u16 gSomeVariableBackup;
|
||||
|
||||
static bool32 sub_812B27C(const u16 * mapIdxs);
|
||||
static bool32 IsCurrentMapInArray(const u16 * mapIdxs);
|
||||
static void sub_812B520(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
|
||||
static void sub_812B614(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
|
||||
static bool8 sub_812B754(void);
|
||||
@@ -824,7 +824,7 @@ static const u8 gUnknown_845C4B6[][6] = {
|
||||
{0, 0, 0, 0, 0, 0}
|
||||
};
|
||||
|
||||
static const u16 gUnknown_845C594[] = {
|
||||
static const u16 sMartMaps[] = {
|
||||
MAP_VIRIDIAN_CITY_MART,
|
||||
MAP_PEWTER_CITY_MART,
|
||||
MAP_CERULEAN_CITY_MART,
|
||||
@@ -847,7 +847,7 @@ static const u16 gUnknown_845C594[] = {
|
||||
MAP_UNDEFINED
|
||||
};
|
||||
|
||||
static const u16 gUnknown_845C5BC[] = {
|
||||
static const u16 sGymMaps[] = {
|
||||
MAP_PEWTER_CITY_GYM,
|
||||
MAP_CERULEAN_CITY_GYM,
|
||||
MAP_VERMILION_CITY_GYM,
|
||||
@@ -859,7 +859,7 @@ static const u16 gUnknown_845C5BC[] = {
|
||||
MAP_UNDEFINED
|
||||
};
|
||||
|
||||
static const u8 gUnknown_845C5CE[][3] = {
|
||||
static const u8 sDungeonMaps[][3] = {
|
||||
{ MAP_GROUP(VIRIDIAN_FOREST), MAP_NUM(VIRIDIAN_FOREST), 1 },
|
||||
{ MAP_GROUP(MT_MOON_1F), MAP_NUM(MT_MOON_1F), 3 },
|
||||
{ MAP_GROUP(ROCK_TUNNEL_1F), MAP_NUM(ROCK_TUNNEL_1F), 2 },
|
||||
@@ -878,14 +878,14 @@ static const u8 gUnknown_845C5CE[][3] = {
|
||||
{ MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER), MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER), 7 }
|
||||
};
|
||||
|
||||
void sub_812B1E0(u8 a0)
|
||||
void HelpSystem_SetSomeVariable(u8 a0)
|
||||
{
|
||||
gUnknown_203B0EC = a0;
|
||||
sSomeVariable = a0;
|
||||
}
|
||||
|
||||
void HelpSystem_SetSomeVariable2(u8 a0)
|
||||
{
|
||||
switch (gUnknown_203B0EC)
|
||||
switch (sSomeVariable)
|
||||
{
|
||||
case 23:
|
||||
case 24:
|
||||
@@ -895,37 +895,37 @@ void HelpSystem_SetSomeVariable2(u8 a0)
|
||||
break;
|
||||
// fallthrough
|
||||
default:
|
||||
gUnknown_203B0EC = a0;
|
||||
sSomeVariable = a0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_812B220(void)
|
||||
void Special_SetSomeVariable(void)
|
||||
{
|
||||
gUnknown_203B0EC = gSpecialVar_0x8004;
|
||||
sSomeVariable = gSpecialVar_0x8004;
|
||||
}
|
||||
|
||||
void sub_812B234(void)
|
||||
void HelpSystem_BackupSomeVariable(void)
|
||||
{
|
||||
gUnknown_3005EA0 = gUnknown_203B0EC;
|
||||
gSomeVariableBackup = sSomeVariable;
|
||||
}
|
||||
|
||||
void sub_812B248(void)
|
||||
void HelpSystem_RestoreSomeVariable(void)
|
||||
{
|
||||
gUnknown_203B0EC = gUnknown_3005EA0;
|
||||
sSomeVariable = gSomeVariableBackup;
|
||||
}
|
||||
|
||||
static bool32 sub_812B25C(void)
|
||||
static bool32 IsInMartMap(void)
|
||||
{
|
||||
return sub_812B27C(gUnknown_845C594);
|
||||
return IsCurrentMapInArray(sMartMaps);
|
||||
}
|
||||
|
||||
static bool32 sub_812B26C(void)
|
||||
static bool32 IsInGymMap(void)
|
||||
{
|
||||
return sub_812B27C(gUnknown_845C5BC);
|
||||
return IsCurrentMapInArray(sGymMaps);
|
||||
}
|
||||
|
||||
static bool32 sub_812B27C(const u16 * mapIdxs)
|
||||
static bool32 IsCurrentMapInArray(const u16 * mapIdxs)
|
||||
{
|
||||
u16 mapIdx = (gSaveBlock1Ptr->location.mapGroup << 8) + gSaveBlock1Ptr->location.mapNum;
|
||||
s32 i;
|
||||
@@ -939,18 +939,18 @@ static bool32 sub_812B27C(const u16 * mapIdxs)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static bool8 sub_812B2C4(void)
|
||||
static bool8 IsInDungeonMap(void)
|
||||
{
|
||||
u8 i, j;
|
||||
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
for (j = 0; j < gUnknown_845C5CE[i][2]; j++)
|
||||
for (j = 0; j < sDungeonMaps[i][2]; j++)
|
||||
{
|
||||
if (
|
||||
gUnknown_845C5CE[i][0] == gSaveBlock1Ptr->location.mapGroup
|
||||
&& gUnknown_845C5CE[i][1] + j == gSaveBlock1Ptr->location.mapNum
|
||||
&& (i != 15 || FlagGet(FLAG_0x849) == TRUE)
|
||||
sDungeonMaps[i][0] == gSaveBlock1Ptr->location.mapGroup
|
||||
&& sDungeonMaps[i][1] + j == gSaveBlock1Ptr->location.mapNum
|
||||
&& (i != 15 /* TANOBY */ || FlagGet(FLAG_0x849) == TRUE)
|
||||
)
|
||||
return TRUE;
|
||||
}
|
||||
@@ -964,7 +964,7 @@ void sub_812B35C(void)
|
||||
sub_812B4B8();
|
||||
if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))
|
||||
HelpSystem_SetSomeVariable2(0x16);
|
||||
else if (sub_812B2C4())
|
||||
else if (IsInDungeonMap())
|
||||
HelpSystem_SetSomeVariable2(0x15);
|
||||
else if (is_light_level_8_or_9(gMapHeader.mapType))
|
||||
{
|
||||
@@ -974,9 +974,9 @@ void sub_812B35C(void)
|
||||
HelpSystem_SetSomeVariable2(0x0F);
|
||||
else if (IsCurMapPokeCenter() == TRUE)
|
||||
HelpSystem_SetSomeVariable2(0x10);
|
||||
else if (sub_812B25C() == TRUE)
|
||||
else if (IsInMartMap() == TRUE)
|
||||
HelpSystem_SetSomeVariable2(0x11);
|
||||
else if (sub_812B26C() == TRUE)
|
||||
else if (IsInGymMap() == TRUE)
|
||||
HelpSystem_SetSomeVariable2(0x12);
|
||||
else
|
||||
HelpSystem_SetSomeVariable2(0x13);
|
||||
@@ -1055,7 +1055,7 @@ static void sub_812B520(struct HelpSystemListMenu * a0, struct ListMenuItem * a1
|
||||
u8 r4 = 0;
|
||||
for (i = 0; i < 6; i++)
|
||||
{
|
||||
if (gUnknown_845C4B6[gUnknown_203B0EC][gUnknown_845C4B0[i]] == 1)
|
||||
if (gUnknown_845C4B6[sSomeVariable][gUnknown_845C4B0[i]] == 1)
|
||||
{
|
||||
a1[r4].label = gUnknown_845B080[gUnknown_845C4B0[i]];
|
||||
a1[r4].index = gUnknown_845C4B0[i];
|
||||
@@ -1085,7 +1085,7 @@ static void sub_812B5A8(struct HelpSystemListMenu * a0, struct ListMenuItem * a1
|
||||
static void sub_812B614(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
|
||||
{
|
||||
u8 r6 = 0;
|
||||
const u8 * r3 = gUnknown_845B9E0[gUnknown_203B0EC * 5 + gUnknown_3005E9C[1]];
|
||||
const u8 * r3 = gUnknown_845B9E0[sSomeVariable * 5 + gUnknown_3005E9C[1]];
|
||||
u8 i;
|
||||
for (i = 0; r3[i] != 0xFF; i++)
|
||||
{
|
||||
|
||||
+8
-8
@@ -117,7 +117,7 @@ void sub_80A1084(void)
|
||||
|
||||
void sub_80A109C(u8 taskId)
|
||||
{
|
||||
if (sub_807AA70() == TRUE)
|
||||
if (field_weather_is_fade_finished() == TRUE)
|
||||
{
|
||||
sItemUseOnFieldCB(taskId);
|
||||
}
|
||||
@@ -172,7 +172,7 @@ bool8 sub_80A1194(void)
|
||||
|
||||
void sub_80A11C0(u8 taskId)
|
||||
{
|
||||
if (sub_807AA70() == TRUE)
|
||||
if (field_weather_is_fade_finished() == TRUE)
|
||||
{
|
||||
UnfreezeMapObjects();
|
||||
ScriptContext2_Disable();
|
||||
@@ -191,7 +191,7 @@ void sub_80A1208(void)
|
||||
struct MailStruct mail;
|
||||
|
||||
mail.itemId = gSpecialVar_ItemId;
|
||||
sub_80BEBEC(&mail, ReturnToBagFromKeyItem, 0);
|
||||
sub_80BEBEC(&mail, CB2_BagMenuFromStartMenu, 0);
|
||||
}
|
||||
|
||||
void FieldUseFunc_MachBike(u8 taskId)
|
||||
@@ -404,7 +404,7 @@ void FieldUseFunc_TmCase(u8 taskId)
|
||||
|
||||
void InitTMCaseFromBag(void)
|
||||
{
|
||||
InitTMCase(0, ReturnToBagFromKeyItem, 0);
|
||||
InitTMCase(0, CB2_BagMenuFromStartMenu, 0);
|
||||
}
|
||||
|
||||
void Task_InitTMCaseFromField(u8 taskId)
|
||||
@@ -435,7 +435,7 @@ void FieldUseFunc_BerryPouch(u8 taskId)
|
||||
|
||||
void InitBerryPouchFromBag(void)
|
||||
{
|
||||
InitBerryPouch(BERRYPOUCH_FROMFIELD, ReturnToBagFromKeyItem, 0);
|
||||
InitBerryPouch(BERRYPOUCH_FROMFIELD, CB2_BagMenuFromStartMenu, 0);
|
||||
}
|
||||
|
||||
void Task_InitBerryPouchFromField(u8 taskId)
|
||||
@@ -478,7 +478,7 @@ void FieldUseFunc_TeachyTv(u8 taskId)
|
||||
|
||||
void InitTeachyTvFromBag(void)
|
||||
{
|
||||
InitTeachyTvController(0, ReturnToBagFromKeyItem);
|
||||
InitTeachyTvController(0, CB2_BagMenuFromStartMenu);
|
||||
}
|
||||
|
||||
void Task_InitTeachyTvFromField(u8 taskId)
|
||||
@@ -608,7 +608,7 @@ void FieldUseFunc_TownMap(u8 taskId)
|
||||
|
||||
void sub_80A1CAC(void)
|
||||
{
|
||||
sub_80BFF50(0, ReturnToBagFromKeyItem);
|
||||
sub_80BFF50(0, CB2_BagMenuFromStartMenu);
|
||||
}
|
||||
|
||||
void sub_80A1CC0(u8 taskId)
|
||||
@@ -640,7 +640,7 @@ void FieldUseFunc_FameChecker(u8 taskId)
|
||||
|
||||
void sub_80A1D58(void)
|
||||
{
|
||||
UseFameChecker(ReturnToBagFromKeyItem);
|
||||
UseFameChecker(CB2_BagMenuFromStartMenu);
|
||||
}
|
||||
|
||||
void sub_80A1D68(u8 taskId)
|
||||
|
||||
+5
-5
@@ -94,10 +94,10 @@ static void ItemPrintFunc(u8 windowId, s32 itemId, u8 y)
|
||||
}
|
||||
}
|
||||
|
||||
u8 MailboxPC_InitListMenu(struct PlayerPC_Unk_203AAC4 * playerPcStruct)
|
||||
u8 MailboxPC_InitListMenu(struct PlayerPCItemPageStruct * playerPcStruct)
|
||||
{
|
||||
u16 i;
|
||||
for (i = 0; i < playerPcStruct->unk_5; i++)
|
||||
for (i = 0; i < playerPcStruct->count; i++)
|
||||
{
|
||||
sListMenuItems[i].label = sString_Dummy;
|
||||
sListMenuItems[i].index = i;
|
||||
@@ -106,7 +106,7 @@ u8 MailboxPC_InitListMenu(struct PlayerPC_Unk_203AAC4 * playerPcStruct)
|
||||
sListMenuItems[i].index = -2;
|
||||
|
||||
gMultiuseListMenuTemplate.items = sListMenuItems;
|
||||
gMultiuseListMenuTemplate.totalItems = playerPcStruct->unk_5 + 1;
|
||||
gMultiuseListMenuTemplate.totalItems = playerPcStruct->count + 1;
|
||||
gMultiuseListMenuTemplate.windowId = sWindowIds[1];
|
||||
gMultiuseListMenuTemplate.header_X = 0;
|
||||
gMultiuseListMenuTemplate.item_X = GetMenuCursorDimensionByFont(2, 0);
|
||||
@@ -132,9 +132,9 @@ static void MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu * list)
|
||||
PlaySE(SE_SELECT);
|
||||
}
|
||||
|
||||
void MailboxPC_AddScrollIndicatorArrows(struct PlayerPC_Unk_203AAC4 * playerPcStruct)
|
||||
void MailboxPC_AddScrollIndicatorArrows(struct PlayerPCItemPageStruct * playerPcStruct)
|
||||
{
|
||||
playerPcStruct->unk_A = AddScrollIndicatorArrowPairParameterized(2, 0xC2, 0xC, 0x94, playerPcStruct->unk_5 - playerPcStruct->unk_4 + 1, 110, 110, &playerPcStruct->scrollOffset);
|
||||
playerPcStruct->scrollIndicatorId = AddScrollIndicatorArrowPairParameterized(2, 0xC2, 0xC, 0x94, playerPcStruct->count - playerPcStruct->pageItems + 1, 110, 110, &playerPcStruct->scrollOffset);
|
||||
}
|
||||
|
||||
void MailboxPC_DestroyListMenuBuffer(void)
|
||||
|
||||
@@ -495,7 +495,7 @@ static void sub_80F83D0(u8 taskId)
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (sub_807AA70())
|
||||
if (field_weather_is_fade_finished())
|
||||
{
|
||||
Overworld_PlaySpecialMapMusic();
|
||||
data[0]++;
|
||||
|
||||
+1
-1
@@ -485,7 +485,7 @@ void AddTextPrinterParameterized5(u8 windowId, u8 fontId, const u8 *str, u8 x, u
|
||||
AddTextPrinter(&printer, speed, callback);
|
||||
}
|
||||
|
||||
void sub_812E6DC(u8 windowId, const u8 * src, u16 x, u16 y)
|
||||
void Menu_PrintFormatIntlPlayerName(u8 windowId, const u8 * src, u16 x, u16 y)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
|
||||
@@ -247,7 +247,7 @@ bool8 MEScrCmd_givepokemon(struct ScriptContext *ctx)
|
||||
if (species == SPECIES_EGG)
|
||||
StringCopyN(gStringVar1, gText_EggNickname, POKEMON_NAME_LENGTH + 1);
|
||||
else
|
||||
StringCopyN(gStringVar1, gText_Pokemon, POKEMON_NAME_LENGTH + 1);
|
||||
StringCopyN(gStringVar1, gStartMenuText_Pokemon, POKEMON_NAME_LENGTH + 1);
|
||||
|
||||
if (gPlayerPartyCount == PARTY_SIZE)
|
||||
{
|
||||
|
||||
@@ -395,7 +395,7 @@ void ResetBg0(void)
|
||||
ChangeBgX(0, 0, 0);
|
||||
ChangeBgY(0, 0, 0);
|
||||
DeactivateAllTextPrinters();
|
||||
sub_80F6E9C();
|
||||
LoadStdWindowFrameGfx();
|
||||
}
|
||||
|
||||
u16 RunTextPrinters_CheckPrinter0Active(void)
|
||||
@@ -452,7 +452,7 @@ void AddTextPrinterWithCustomSpeedForMessage(bool8 allowSkippingDelayWithButtonP
|
||||
AddTextPrinterParameterized2(0, 2, gStringVar4, speed, NULL, 2, 1, 3);
|
||||
}
|
||||
|
||||
void sub_80F6E9C(void)
|
||||
void LoadStdWindowFrameGfx(void)
|
||||
{
|
||||
if (gUnknown_203ADFA == 2)
|
||||
{
|
||||
@@ -644,7 +644,7 @@ static u16 GetStdPalColor(u8 colorNum)
|
||||
|
||||
void DisplayItemMessageOnField(u8 taskId, u8 bgId, const u8 *string, TaskFunc callback)
|
||||
{
|
||||
sub_80F6E9C();
|
||||
LoadStdWindowFrameGfx();
|
||||
DisplayMessageAndContinueTask(taskId, 0, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM, bgId, GetTextSpeedSetting(), string, callback);
|
||||
CopyWindowToVram(0, 3);
|
||||
}
|
||||
@@ -667,7 +667,7 @@ u8 GetTextSpeedSetting(void)
|
||||
return gUnknown_841F428[gSaveBlock2Ptr->optionsTextSpeed];
|
||||
}
|
||||
|
||||
u8 sub_80F78E0(u8 height)
|
||||
u8 CreateStartMenuWindow(u8 height)
|
||||
{
|
||||
if (sStartMenuWindowId == 0xFF)
|
||||
{
|
||||
@@ -702,15 +702,15 @@ u16 GetStdWindowBaseTileNum(void)
|
||||
return STD_WINDOW_BASE_TILE_NUM;
|
||||
}
|
||||
|
||||
void sub_80F7974(const u8 * text)
|
||||
void DrawHelpMessageWindowWithText(const u8 * text)
|
||||
{
|
||||
sub_814FE6C(sub_8112EB4(), DLG_WINDOW_BASE_TILE_NUM, 0x10 * DLG_WINDOW_PALETTE_NUM);
|
||||
sub_8113018(text, 2);
|
||||
sub_814FE6C(CreateHelpMessageWindow(), DLG_WINDOW_BASE_TILE_NUM, 0x10 * DLG_WINDOW_PALETTE_NUM);
|
||||
PrintTextOnHelpMessageWindow(text, 2);
|
||||
}
|
||||
|
||||
void sub_80F7998(void)
|
||||
void DestroyHelpMessageWindow_(void)
|
||||
{
|
||||
sub_8112EDC(2);
|
||||
DestroyHelpMessageWindow(2);
|
||||
}
|
||||
|
||||
void sub_80F79A4(void)
|
||||
|
||||
+916
@@ -0,0 +1,916 @@
|
||||
#include "global.h"
|
||||
#include "battle_anim.h"
|
||||
#include "palette.h"
|
||||
#include "random.h"
|
||||
#include "task.h"
|
||||
#include "trig.h"
|
||||
|
||||
static void AnimConfusionDuck(struct Sprite *sprite);
|
||||
static void AnimSimplePaletteBlend(struct Sprite *sprite);
|
||||
static void sub_80B9A7C(struct Sprite *sprite);
|
||||
static void sub_80B9B8C(struct Sprite *sprite);
|
||||
static void sub_80BA27C(struct Sprite *sprite);
|
||||
static void sub_80BA560(struct Sprite *sprite);
|
||||
static void sub_80BA5F8(struct Sprite *sprite);
|
||||
static void sub_80BA630(struct Sprite *sprite);
|
||||
static void sub_80BA6C8(struct Sprite *sprite);
|
||||
static void sub_80BA738(struct Sprite *sprite);
|
||||
static void sub_80BA780(struct Sprite *sprite);
|
||||
static void sub_80BA5A8(struct Sprite *sprite);
|
||||
static void AnimConfusionDuckStep(struct Sprite *sprite);
|
||||
static void AnimSimplePaletteBlendStep(struct Sprite *sprite);
|
||||
static void sub_80B9AD0(struct Sprite *sprite);
|
||||
static void sub_80B9B5C(struct Sprite *sprite);
|
||||
static void sub_80B9C2C(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount);
|
||||
static void sub_80B9C7C(u8 taskId);
|
||||
static void sub_80B9DA0(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount);
|
||||
static void sub_80B9DF0(u8 taskId);
|
||||
static void sub_80B9EA8(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount);
|
||||
static void sub_80B9F04(u8 taskId);
|
||||
static void sub_80B9FD8(u8 taskId);
|
||||
static void sub_80BA090(u8 taskId);
|
||||
static void sub_80BA3CC(void);
|
||||
static void sub_80BA320(struct Sprite *sprite);
|
||||
static void sub_80BA4D0(u8 taskId);
|
||||
static void sub_80BA7BC(struct Sprite *sprite);
|
||||
|
||||
|
||||
static const union AnimCmd gUnknown_83E7ADC[] =
|
||||
{
|
||||
ANIMCMD_FRAME(0, 8),
|
||||
ANIMCMD_FRAME(4, 8),
|
||||
ANIMCMD_FRAME(0, 8, .hFlip = TRUE),
|
||||
ANIMCMD_FRAME(8, 8),
|
||||
ANIMCMD_JUMP(0),
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E7AF0[] =
|
||||
{
|
||||
ANIMCMD_FRAME(0, 8, .hFlip = TRUE),
|
||||
ANIMCMD_FRAME(4, 8),
|
||||
ANIMCMD_FRAME(0, 8),
|
||||
ANIMCMD_FRAME(8, 8),
|
||||
ANIMCMD_JUMP(0),
|
||||
};
|
||||
|
||||
static const union AnimCmd *const gUnknown_83E7B04[] =
|
||||
{
|
||||
gUnknown_83E7ADC,
|
||||
gUnknown_83E7AF0,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gConfusionDuckSpriteTemplate =
|
||||
{
|
||||
.tileTag = ANIM_TAG_DUCK,
|
||||
.paletteTag = ANIM_TAG_DUCK,
|
||||
.oam = &gOamData_83AC9D0,
|
||||
.anims = gUnknown_83E7B04,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = AnimConfusionDuck,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gSimplePaletteBlendSpriteTemplate =
|
||||
{
|
||||
.tileTag = 0,
|
||||
.paletteTag = 0,
|
||||
.oam = &gDummyOamData,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = AnimSimplePaletteBlend,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gComplexPaletteBlendSpriteTemplate =
|
||||
{
|
||||
.tileTag = 0,
|
||||
.paletteTag = 0,
|
||||
.oam = &gDummyOamData,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B9A7C,
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E7B54[] =
|
||||
{
|
||||
ANIMCMD_FRAME(0, 3),
|
||||
ANIMCMD_FRAME(16, 3),
|
||||
ANIMCMD_FRAME(32, 3),
|
||||
ANIMCMD_FRAME(48, 3),
|
||||
ANIMCMD_FRAME(64, 3),
|
||||
ANIMCMD_JUMP(0),
|
||||
};
|
||||
|
||||
static const union AnimCmd *const gUnknown_83E7B6C[] =
|
||||
{
|
||||
gUnknown_83E7B54,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7B70 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_SPARKLE_4,
|
||||
.paletteTag = ANIM_TAG_SPARKLE_4,
|
||||
.oam = &gOamData_83AC9D8,
|
||||
.anims = gUnknown_83E7B6C,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B9B8C,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7B88 =
|
||||
{
|
||||
.tileTag = 0,
|
||||
.paletteTag = 0,
|
||||
.oam = &gDummyOamData,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80BA27C,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7BA0[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7BB0[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0xD8, 0xD8, 0, 0),
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7BC8[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0xB0, 0xB0, 0, 0),
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7BE0[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0),
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd *const gUnknown_83E7BF8[] =
|
||||
{
|
||||
gUnknown_83E7BA0,
|
||||
gUnknown_83E7BB0,
|
||||
gUnknown_83E7BC8,
|
||||
gUnknown_83E7BE0,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gBasicHitSplatSpriteTemplate =
|
||||
{
|
||||
.tileTag = ANIM_TAG_IMPACT,
|
||||
.paletteTag = ANIM_TAG_IMPACT,
|
||||
.oam = &gOamData_83ACB58,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7BF8,
|
||||
.callback = sub_80BA560,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7C20 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_IMPACT,
|
||||
.paletteTag = ANIM_TAG_IMPACT,
|
||||
.oam = &gOamData_83ACB58,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7BF8,
|
||||
.callback = sub_80BA5F8,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7C38 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_WATER_IMPACT,
|
||||
.paletteTag = ANIM_TAG_WATER_IMPACT,
|
||||
.oam = &gOamData_83ACB58,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7BF8,
|
||||
.callback = sub_80BA560,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7C50 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_IMPACT,
|
||||
.paletteTag = ANIM_TAG_IMPACT,
|
||||
.oam = &gOamData_83ACB58,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7BF8,
|
||||
.callback = sub_80BA630,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7C68 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_IMPACT,
|
||||
.paletteTag = ANIM_TAG_IMPACT,
|
||||
.oam = &gOamData_83ACB58,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7BF8,
|
||||
.callback = sub_80BA6C8,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7C80 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_CROSS_IMPACT,
|
||||
.paletteTag = ANIM_TAG_CROSS_IMPACT,
|
||||
.oam = &gOamData_83ACAF8,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80BA738,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7C98 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_IMPACT,
|
||||
.paletteTag = ANIM_TAG_IMPACT,
|
||||
.oam = &gOamData_83ACA38,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7BF8,
|
||||
.callback = sub_80BA780,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7CB0 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_IMPACT,
|
||||
.paletteTag = ANIM_TAG_IMPACT,
|
||||
.oam = &gOamData_83ACB58,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7BF8,
|
||||
.callback = sub_80BA5A8,
|
||||
};
|
||||
|
||||
// Moves a spinning duck around the mon's head.
|
||||
// arg 0: initial x pixel offset
|
||||
// arg 1: initial y pixel offset
|
||||
// arg 2: initial wave offset
|
||||
// arg 3: wave period (higher means faster wave)
|
||||
// arg 4: duration
|
||||
static void AnimConfusionDuck(struct Sprite *sprite)
|
||||
{
|
||||
sprite->pos1.x += gBattleAnimArgs[0];
|
||||
sprite->pos1.y += gBattleAnimArgs[1];
|
||||
sprite->data[0] = gBattleAnimArgs[2];
|
||||
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
{
|
||||
sprite->data[1] = -gBattleAnimArgs[3];
|
||||
sprite->data[4] = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
sprite->data[1] = gBattleAnimArgs[3];
|
||||
sprite->data[4] = 0;
|
||||
StartSpriteAnim(sprite, 1);
|
||||
}
|
||||
sprite->data[3] = gBattleAnimArgs[4];
|
||||
sprite->callback = AnimConfusionDuckStep;
|
||||
sprite->callback(sprite);
|
||||
}
|
||||
|
||||
static void AnimConfusionDuckStep(struct Sprite *sprite)
|
||||
{
|
||||
sprite->pos2.x = Cos(sprite->data[0], 30);
|
||||
sprite->pos2.y = Sin(sprite->data[0], 10);
|
||||
if ((u16)sprite->data[0] < 128)
|
||||
sprite->oam.priority = 1;
|
||||
else
|
||||
sprite->oam.priority = 3;
|
||||
sprite->data[0] = (sprite->data[0] + sprite->data[1]) & 0xFF;
|
||||
if (++sprite->data[2] == sprite->data[3])
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
|
||||
// Performs a simple color blend on a specified sprite.
|
||||
// arg 0: palette selector
|
||||
// arg 1: delay
|
||||
// arg 2: start blend amount
|
||||
// arg 3: end blend amount
|
||||
// arg 4: blend color
|
||||
static void AnimSimplePaletteBlend(struct Sprite *sprite)
|
||||
{
|
||||
u32 selectedPalettes = UnpackSelectedBattleAnimPalettes(gBattleAnimArgs[0]);
|
||||
|
||||
BeginNormalPaletteFade(selectedPalettes, gBattleAnimArgs[1], gBattleAnimArgs[2], gBattleAnimArgs[3], gBattleAnimArgs[4]);
|
||||
sprite->invisible = TRUE;
|
||||
sprite->callback = AnimSimplePaletteBlendStep;
|
||||
}
|
||||
|
||||
// Unpacks a bitfield and returns a bitmask of its selected palettes.
|
||||
// Bits 0-6 of the selector parameter result in the following palettes being selected:
|
||||
// 0: battle background palettes (BG palettes 1, 2, and 3)
|
||||
// 1: gBattleAnimAttacker OBJ palette
|
||||
// 2: gBattleAnimTarget OBJ palette
|
||||
// 3: gBattleAnimAttacker partner OBJ palette
|
||||
// 4: gBattleAnimTarget partner OBJ palette
|
||||
// 5: BG palette 4
|
||||
// 6: BG palette 5
|
||||
u32 UnpackSelectedBattleAnimPalettes(s16 selector)
|
||||
{
|
||||
u8 battleBackground = selector & 1;
|
||||
u8 attacker = (selector >> 1) & 1;
|
||||
u8 target = (selector >> 2) & 1;
|
||||
u8 attackerPartner = (selector >> 3) & 1;
|
||||
u8 targetPartner = (selector >> 4) & 1;
|
||||
u8 arg5 = (selector >> 5) & 1;
|
||||
u8 arg6 = (selector >> 6) & 1;
|
||||
|
||||
return sub_8075BE8(battleBackground, attacker, target, attackerPartner, targetPartner, arg5, arg6);
|
||||
}
|
||||
|
||||
static void AnimSimplePaletteBlendStep(struct Sprite *sprite)
|
||||
{
|
||||
if (!gPaletteFade.active)
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
|
||||
static void sub_80B9A7C(struct Sprite *sprite)
|
||||
{
|
||||
u32 selectedPalettes;
|
||||
|
||||
sprite->data[0] = gBattleAnimArgs[1];
|
||||
sprite->data[1] = gBattleAnimArgs[1];
|
||||
sprite->data[2] = gBattleAnimArgs[2];
|
||||
sprite->data[3] = gBattleAnimArgs[3];
|
||||
sprite->data[4] = gBattleAnimArgs[4];
|
||||
sprite->data[5] = gBattleAnimArgs[5];
|
||||
sprite->data[6] = gBattleAnimArgs[6];
|
||||
sprite->data[7] = gBattleAnimArgs[0];
|
||||
selectedPalettes = UnpackSelectedBattleAnimPalettes(sprite->data[7]);
|
||||
BlendPalettes(selectedPalettes, gBattleAnimArgs[4], gBattleAnimArgs[3]);
|
||||
sprite->invisible = TRUE;
|
||||
sprite->callback = sub_80B9AD0;
|
||||
}
|
||||
|
||||
static void sub_80B9AD0(struct Sprite *sprite)
|
||||
{
|
||||
u32 selectedPalettes;
|
||||
|
||||
if (sprite->data[0] > 0)
|
||||
{
|
||||
--sprite->data[0];
|
||||
return;
|
||||
}
|
||||
if (gPaletteFade.active)
|
||||
return;
|
||||
if (sprite->data[2] == 0)
|
||||
{
|
||||
sprite->callback = sub_80B9B5C;
|
||||
return;
|
||||
}
|
||||
selectedPalettes = UnpackSelectedBattleAnimPalettes(sprite->data[7]);
|
||||
if (sprite->data[1] & 0x100)
|
||||
BlendPalettes(selectedPalettes, sprite->data[4], sprite->data[3]);
|
||||
else
|
||||
BlendPalettes(selectedPalettes, sprite->data[6], sprite->data[5]);
|
||||
sprite->data[1] ^= 0x100;
|
||||
sprite->data[0] = sprite->data[1] & 0xFF;
|
||||
--sprite->data[2];
|
||||
}
|
||||
|
||||
static void sub_80B9B5C(struct Sprite *sprite)
|
||||
{
|
||||
u32 selectedPalettes;
|
||||
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
selectedPalettes = UnpackSelectedBattleAnimPalettes(sprite->data[7]);
|
||||
BlendPalettes(selectedPalettes, 0, 0);
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B9B8C(struct Sprite *sprite)
|
||||
{
|
||||
sprite->pos1.x += gBattleAnimArgs[0];
|
||||
sprite->pos1.y += gBattleAnimArgs[1];
|
||||
sprite->data[0] = 0;
|
||||
sprite->data[1] = 10;
|
||||
sprite->data[2] = 8;
|
||||
sprite->data[3] = 40;
|
||||
sprite->data[4] = 112;
|
||||
sprite->data[5] = 0;
|
||||
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
|
||||
sprite->callback = TranslateSpriteInGrowingCircleOverDuration;
|
||||
sprite->callback(sprite);
|
||||
}
|
||||
|
||||
void sub_80B9BDC(u8 taskId)
|
||||
{
|
||||
gTasks[taskId].data[0] = gBattleAnimArgs[0];
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].data[3] = gBattleAnimArgs[3];
|
||||
gTasks[taskId].data[4] = gBattleAnimArgs[4];
|
||||
gTasks[taskId].data[5] = gBattleAnimArgs[5];
|
||||
gTasks[taskId].data[8] = 0;
|
||||
sub_80B9C2C(taskId, 0, gTasks[taskId].data[4]);
|
||||
gTasks[taskId].func = sub_80B9C7C;
|
||||
}
|
||||
|
||||
static void sub_80B9C2C(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount)
|
||||
{
|
||||
u32 selectedPalettes = UnpackSelectedBattleAnimPalettes(gTasks[taskId].data[0]);
|
||||
|
||||
BeginNormalPaletteFade(selectedPalettes,
|
||||
gTasks[taskId].data[1],
|
||||
initialBlendAmount,
|
||||
targetBlendAmount,
|
||||
gTasks[taskId].data[5]);
|
||||
--gTasks[taskId].data[2];
|
||||
gTasks[taskId].data[8] ^= 1;
|
||||
}
|
||||
|
||||
static void sub_80B9C7C(u8 taskId)
|
||||
{
|
||||
u8 initialBlendAmount, targetBlendAmount;
|
||||
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
if (gTasks[taskId].data[2] > 0)
|
||||
{
|
||||
if (gTasks[taskId].data[8] == 0)
|
||||
{
|
||||
initialBlendAmount = gTasks[taskId].data[3];
|
||||
targetBlendAmount = gTasks[taskId].data[4];
|
||||
}
|
||||
else
|
||||
{
|
||||
initialBlendAmount = gTasks[taskId].data[4];
|
||||
targetBlendAmount = gTasks[taskId].data[3];
|
||||
}
|
||||
if (gTasks[taskId].data[2] == 1)
|
||||
targetBlendAmount = 0;
|
||||
sub_80B9C2C(taskId, initialBlendAmount, targetBlendAmount);
|
||||
}
|
||||
else
|
||||
{
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80B9CE4(u8 taskId)
|
||||
{
|
||||
s32 battler;
|
||||
u32 selectedPalettes = 0;
|
||||
|
||||
gTasks[taskId].data[0] = gBattleAnimArgs[0];
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].data[3] = gBattleAnimArgs[3];
|
||||
gTasks[taskId].data[4] = gBattleAnimArgs[4];
|
||||
gTasks[taskId].data[5] = gBattleAnimArgs[5];
|
||||
gTasks[taskId].data[8] = 0;
|
||||
for (battler = 0; battler < gBattlersCount; ++battler)
|
||||
if (battler != gBattleAnimAttacker && battler != gBattleAnimTarget)
|
||||
selectedPalettes |= 1 << (battler + 16);
|
||||
if (gBattleAnimArgs[0] == 1)
|
||||
selectedPalettes |= 0xE;
|
||||
gTasks[taskId].data[9] = selectedPalettes >> 16;
|
||||
gTasks[taskId].data[10] = selectedPalettes & 0xFF;
|
||||
sub_80B9DA0(taskId, 0, gTasks[taskId].data[4]);
|
||||
gTasks[taskId].func = sub_80B9DF0;
|
||||
}
|
||||
|
||||
static void sub_80B9DA0(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount)
|
||||
{
|
||||
u32 selectedPalettes = ((u16)gTasks[taskId].data[9] << 16) | (u16)gTasks[taskId].data[10];
|
||||
|
||||
BeginNormalPaletteFade(selectedPalettes,
|
||||
gTasks[taskId].data[1],
|
||||
initialBlendAmount,
|
||||
targetBlendAmount,
|
||||
gTasks[taskId].data[5]);
|
||||
--gTasks[taskId].data[2];
|
||||
gTasks[taskId].data[8] ^= 1;
|
||||
}
|
||||
|
||||
static void sub_80B9DF0(u8 taskId)
|
||||
{
|
||||
u8 initialBlendAmount, targetBlendAmount;
|
||||
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
if (gTasks[taskId].data[2] > 0)
|
||||
{
|
||||
if (gTasks[taskId].data[8] == 0)
|
||||
{
|
||||
initialBlendAmount = gTasks[taskId].data[3];
|
||||
targetBlendAmount = gTasks[taskId].data[4];
|
||||
}
|
||||
else
|
||||
{
|
||||
initialBlendAmount = gTasks[taskId].data[4];
|
||||
targetBlendAmount = gTasks[taskId].data[3];
|
||||
}
|
||||
|
||||
if (gTasks[taskId].data[2] == 1)
|
||||
targetBlendAmount = 0;
|
||||
sub_80B9DA0(taskId, initialBlendAmount, targetBlendAmount);
|
||||
}
|
||||
else
|
||||
{
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80B9E58(u8 taskId)
|
||||
{
|
||||
u8 paletteIndex;
|
||||
|
||||
gTasks[taskId].data[0] = gBattleAnimArgs[0];
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].data[3] = gBattleAnimArgs[3];
|
||||
gTasks[taskId].data[4] = gBattleAnimArgs[4];
|
||||
gTasks[taskId].data[5] = gBattleAnimArgs[5];
|
||||
gTasks[taskId].data[8] = 0;
|
||||
sub_80B9EA8(taskId, 0, gTasks[taskId].data[4]);
|
||||
gTasks[taskId].func = sub_80B9F04;
|
||||
}
|
||||
|
||||
static void sub_80B9EA8(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount)
|
||||
{
|
||||
u8 paletteIndex = IndexOfSpritePaletteTag(gTasks[taskId].data[0]);
|
||||
|
||||
BeginNormalPaletteFade(1 << (paletteIndex + 16),
|
||||
gTasks[taskId].data[1],
|
||||
initialBlendAmount,
|
||||
targetBlendAmount,
|
||||
gTasks[taskId].data[5]);
|
||||
--gTasks[taskId].data[2];
|
||||
gTasks[taskId].data[8] ^= 1;
|
||||
}
|
||||
|
||||
static void sub_80B9F04(u8 taskId)
|
||||
{
|
||||
u8 initialBlendAmount, targetBlendAmount;
|
||||
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
if (gTasks[taskId].data[2] > 0)
|
||||
{
|
||||
if (gTasks[taskId].data[8] == 0)
|
||||
{
|
||||
initialBlendAmount = gTasks[taskId].data[3];
|
||||
targetBlendAmount = gTasks[taskId].data[4];
|
||||
}
|
||||
else
|
||||
{
|
||||
initialBlendAmount = gTasks[taskId].data[4];
|
||||
targetBlendAmount = gTasks[taskId].data[3];
|
||||
}
|
||||
|
||||
if (gTasks[taskId].data[2] == 1)
|
||||
targetBlendAmount = 0;
|
||||
sub_80B9EA8(taskId, initialBlendAmount, targetBlendAmount);
|
||||
}
|
||||
else
|
||||
{
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80B9F6C(u8 taskId)
|
||||
{
|
||||
u8 paletteIndex;
|
||||
|
||||
gTasks[taskId].data[0] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].data[3] = gBattleAnimArgs[3];
|
||||
gTasks[taskId].data[4] = gBattleAnimArgs[4];
|
||||
gTasks[taskId].data[5] = gBattleAnimArgs[5];
|
||||
gTasks[taskId].data[6] = gBattleAnimArgs[6];
|
||||
gTasks[taskId].data[7] = gBattleAnimArgs[0];
|
||||
paletteIndex = IndexOfSpritePaletteTag(gBattleAnimArgs[0]);
|
||||
BeginNormalPaletteFade(1 << (paletteIndex + 16),
|
||||
0,
|
||||
gBattleAnimArgs[4],
|
||||
gBattleAnimArgs[4],
|
||||
gBattleAnimArgs[3]);
|
||||
gTasks[taskId].func = sub_80B9FD8;
|
||||
}
|
||||
|
||||
static void sub_80B9FD8(u8 taskId)
|
||||
{
|
||||
u32 selectedPalettes;
|
||||
|
||||
if (gTasks[taskId].data[0] > 0)
|
||||
{
|
||||
--gTasks[taskId].data[0];
|
||||
return;
|
||||
}
|
||||
if (gPaletteFade.active)
|
||||
return;
|
||||
if (gTasks[taskId].data[2] == 0)
|
||||
{
|
||||
gTasks[taskId].func = sub_80BA090;
|
||||
return;
|
||||
}
|
||||
selectedPalettes = 1 << (IndexOfSpritePaletteTag(gTasks[taskId].data[7]) + 16);
|
||||
if (gTasks[taskId].data[1] & 0x100)
|
||||
BeginNormalPaletteFade(selectedPalettes,
|
||||
0,
|
||||
gTasks[taskId].data[4],
|
||||
gTasks[taskId].data[4],
|
||||
gTasks[taskId].data[3]);
|
||||
else
|
||||
BeginNormalPaletteFade(selectedPalettes,
|
||||
0,
|
||||
gTasks[taskId].data[6],
|
||||
gTasks[taskId].data[6],
|
||||
gTasks[taskId].data[5]);
|
||||
gTasks[taskId].data[1] ^= 0x100;
|
||||
gTasks[taskId].data[0] = gTasks[taskId].data[1] & 0xFF;
|
||||
--gTasks[taskId].data[2];
|
||||
}
|
||||
|
||||
static void sub_80BA090(u8 taskId)
|
||||
{
|
||||
u32 selectedPalettes;
|
||||
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
selectedPalettes = 1 << (IndexOfSpritePaletteTag(gTasks[taskId].data[7]) + 16);
|
||||
BeginNormalPaletteFade(selectedPalettes, 0, 0, 0, RGB(0, 0, 0));
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80BA0E8(u8 taskId)
|
||||
{
|
||||
u32 selectedPalettes = 0;
|
||||
u8 attackerBattler = gBattleAnimAttacker;
|
||||
u8 targetBattler = gBattleAnimTarget;
|
||||
|
||||
if (gBattleAnimArgs[0] & 0x100)
|
||||
selectedPalettes = sub_8075BE8(1, 0, 0, 0, 0, 0, 0);
|
||||
if (gBattleAnimArgs[1] & 0x100)
|
||||
selectedPalettes |= (0x10000 << attackerBattler);
|
||||
if (gBattleAnimArgs[2] & 0x100)
|
||||
selectedPalettes |= (0x10000 << targetBattler);
|
||||
InvertPlttBuffer(selectedPalettes);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
// not used
|
||||
static void sub_80BA16C(u8 taskId)
|
||||
{
|
||||
u8 attackerBattler;
|
||||
u8 targetBattler;
|
||||
u8 paletteIndex;
|
||||
u32 selectedPalettes = 0;
|
||||
|
||||
if (gTasks[taskId].data[0] == 0)
|
||||
{
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[0];
|
||||
gTasks[taskId].data[3] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[4] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[3];
|
||||
gTasks[taskId].data[5] = gBattleAnimArgs[4];
|
||||
gTasks[taskId].data[6] = gBattleAnimArgs[5];
|
||||
gTasks[taskId].data[7] = gBattleAnimArgs[6];
|
||||
}
|
||||
++gTasks[taskId].data[0];
|
||||
attackerBattler = gBattleAnimAttacker;
|
||||
targetBattler = gBattleAnimTarget;
|
||||
if (gTasks[taskId].data[2] & 0x100)
|
||||
selectedPalettes = 0x0000FFFF;
|
||||
if (gTasks[taskId].data[2] & 0x1)
|
||||
{
|
||||
paletteIndex = IndexOfSpritePaletteTag(gSprites[gHealthboxSpriteIds[attackerBattler]].template->paletteTag);
|
||||
selectedPalettes |= (1 << paletteIndex) << 16;
|
||||
}
|
||||
if (gTasks[taskId].data[3] & 0x100)
|
||||
selectedPalettes |= (1 << attackerBattler) << 16;
|
||||
if (gTasks[taskId].data[4] & 0x100)
|
||||
selectedPalettes |= (1 << targetBattler) << 16;
|
||||
TintPlttBuffer(selectedPalettes, gTasks[taskId].data[5], gTasks[taskId].data[6], gTasks[taskId].data[7]);
|
||||
if (gTasks[taskId].data[0] == gTasks[taskId].data[1])
|
||||
{
|
||||
UnfadePlttBuffer(selectedPalettes);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80BA27C(struct Sprite *sprite)
|
||||
{
|
||||
u16 var0;
|
||||
|
||||
sprite->invisible = TRUE;
|
||||
sprite->data[0] = -gBattleAnimArgs[0];
|
||||
sprite->data[1] = gBattleAnimArgs[1];
|
||||
sprite->data[2] = gBattleAnimArgs[1];
|
||||
sprite->data[3] = gBattleAnimArgs[2];
|
||||
|
||||
switch (gBattleAnimArgs[3])
|
||||
{
|
||||
case 0:
|
||||
StoreSpriteCallbackInData6(sprite, (void *)&gBattle_BG3_X);
|
||||
break;
|
||||
case 1:
|
||||
StoreSpriteCallbackInData6(sprite, (void *)&gBattle_BG3_Y);
|
||||
break;
|
||||
case 2:
|
||||
StoreSpriteCallbackInData6(sprite, (void *)&gSpriteCoordOffsetX);
|
||||
break;
|
||||
default:
|
||||
StoreSpriteCallbackInData6(sprite, (void *)&gSpriteCoordOffsetY);
|
||||
break;
|
||||
}
|
||||
sprite->data[4] = *(u16 *)(sprite->data[6] | (sprite->data[7] << 16));
|
||||
sprite->data[5] = gBattleAnimArgs[3];
|
||||
var0 = sprite->data[5] - 2;
|
||||
if (var0 < 2)
|
||||
sub_80BA3CC();
|
||||
sprite->callback = sub_80BA320;
|
||||
}
|
||||
|
||||
static void sub_80BA320(struct Sprite *sprite)
|
||||
{
|
||||
u8 i;
|
||||
u16 var0;
|
||||
|
||||
if (sprite->data[3] > 0)
|
||||
{
|
||||
--sprite->data[3];
|
||||
if (sprite->data[1] > 0)
|
||||
{
|
||||
--sprite->data[1];
|
||||
}
|
||||
else
|
||||
{
|
||||
sprite->data[1] = sprite->data[2];
|
||||
*(u16 *)(sprite->data[6] | (sprite->data[7] << 16)) += sprite->data[0];
|
||||
sprite->data[0] = -sprite->data[0];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
*(u16 *)(sprite->data[6] | (sprite->data[7] << 16)) = sprite->data[4];
|
||||
var0 = sprite->data[5] - 2;
|
||||
if (var0 < 2)
|
||||
for (i = 0; i < gBattlersCount; ++i)
|
||||
gSprites[gBattlerSpriteIds[i]].coordOffsetEnabled = 0;
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80BA3CC(void)
|
||||
{
|
||||
gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].coordOffsetEnabled = 0;
|
||||
gSprites[gBattlerSpriteIds[gBattleAnimTarget]].coordOffsetEnabled = 0;
|
||||
if (gBattleAnimArgs[4] == 2)
|
||||
{
|
||||
gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].coordOffsetEnabled = 1;
|
||||
gSprites[gBattlerSpriteIds[gBattleAnimTarget]].coordOffsetEnabled = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (gBattleAnimArgs[4] == 0)
|
||||
gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].coordOffsetEnabled = 1;
|
||||
else
|
||||
gSprites[gBattlerSpriteIds[gBattleAnimTarget]].coordOffsetEnabled = 1;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80BA47C(u8 taskId)
|
||||
{
|
||||
gTasks[taskId].data[0] = gBattleAnimArgs[0];
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].data[3] = gBattleAnimArgs[3];
|
||||
gTasks[taskId].data[8] = gBattleAnimArgs[3];
|
||||
gBattle_BG3_X = gBattleAnimArgs[0];
|
||||
gBattle_BG3_Y = gBattleAnimArgs[1];
|
||||
gTasks[taskId].func = sub_80BA4D0;
|
||||
gTasks[taskId].func(taskId);
|
||||
}
|
||||
|
||||
static void sub_80BA4D0(u8 taskId)
|
||||
{
|
||||
if (gTasks[taskId].data[3] == 0)
|
||||
{
|
||||
if (gBattle_BG3_X == gTasks[taskId].data[0])
|
||||
gBattle_BG3_X = -gTasks[taskId].data[0];
|
||||
else
|
||||
gBattle_BG3_X = gTasks[taskId].data[0];
|
||||
|
||||
if (gBattle_BG3_Y == -gTasks[taskId].data[1])
|
||||
gBattle_BG3_Y = 0;
|
||||
else
|
||||
gBattle_BG3_Y = -gTasks[taskId].data[1];
|
||||
|
||||
gTasks[taskId].data[3] = gTasks[taskId].data[8];
|
||||
if (--gTasks[taskId].data[2] == 0)
|
||||
{
|
||||
gBattle_BG3_X = 0;
|
||||
gBattle_BG3_Y = 0;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
--gTasks[taskId].data[3];
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80BA560(struct Sprite *sprite)
|
||||
{
|
||||
StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]);
|
||||
if (gBattleAnimArgs[2] == 0)
|
||||
InitSpritePosToAnimAttacker(sprite, 1);
|
||||
else
|
||||
InitSpritePosToAnimTarget(sprite, TRUE);
|
||||
sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
|
||||
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
|
||||
}
|
||||
|
||||
static void sub_80BA5A8(struct Sprite *sprite)
|
||||
{
|
||||
StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]);
|
||||
if (gBattleAnimArgs[2] == 0)
|
||||
InitSpritePosToAnimAttacker(sprite, 1);
|
||||
else
|
||||
InitSpritePosToAnimTarget(sprite, TRUE);
|
||||
sprite->data[0] = gBattleAnimArgs[4];
|
||||
sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
|
||||
StoreSpriteCallbackInData6(sprite, sub_80B1D3C);
|
||||
}
|
||||
|
||||
static void sub_80BA5F8(struct Sprite *sprite)
|
||||
{
|
||||
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER && !IsContest())
|
||||
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
|
||||
sub_80BA560(sprite);
|
||||
}
|
||||
|
||||
static void sub_80BA630(struct Sprite *sprite)
|
||||
{
|
||||
if (gBattleAnimArgs[1] == -1)
|
||||
gBattleAnimArgs[1] = Random() & 3;
|
||||
StartSpriteAffineAnim(sprite, gBattleAnimArgs[1]);
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
InitSpritePosToAnimAttacker(sprite, 0);
|
||||
else
|
||||
InitSpritePosToAnimTarget(sprite, FALSE);
|
||||
sprite->pos2.x += (Random() % 48) - 24;
|
||||
sprite->pos2.y += (Random() % 24) - 12;
|
||||
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
|
||||
sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
|
||||
}
|
||||
|
||||
static void sub_80BA6C8(struct Sprite *sprite)
|
||||
{
|
||||
sprite->data[0] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
|
||||
sprite->pos1.x = gSprites[sprite->data[0]].pos1.x + gSprites[sprite->data[0]].pos2.x;
|
||||
sprite->pos1.y = gSprites[sprite->data[0]].pos1.y + gSprites[sprite->data[0]].pos2.y;
|
||||
sprite->pos2.x = gBattleAnimArgs[1];
|
||||
sprite->pos2.y = gBattleAnimArgs[2];
|
||||
StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]);
|
||||
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
|
||||
sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
|
||||
}
|
||||
|
||||
static void sub_80BA738(struct Sprite *sprite)
|
||||
{
|
||||
if (gBattleAnimArgs[2] == 0)
|
||||
InitSpritePosToAnimAttacker(sprite, 1);
|
||||
else
|
||||
InitSpritePosToAnimTarget(sprite, TRUE);
|
||||
sprite->data[0] = gBattleAnimArgs[3];
|
||||
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
|
||||
sprite->callback = WaitAnimForDuration;
|
||||
}
|
||||
|
||||
static void sub_80BA780(struct Sprite *sprite)
|
||||
{
|
||||
StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]);
|
||||
if (gBattleAnimArgs[2] == 0)
|
||||
InitSpritePosToAnimAttacker(sprite, 1);
|
||||
else
|
||||
InitSpritePosToAnimTarget(sprite, TRUE);
|
||||
sprite->callback = sub_80BA7BC;
|
||||
}
|
||||
|
||||
static void sub_80BA7BC(struct Sprite *sprite)
|
||||
{
|
||||
sprite->invisible ^= 1;
|
||||
if (sprite->data[0]++ > 12)
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
+741
@@ -0,0 +1,741 @@
|
||||
#include "global.h"
|
||||
#include "palette.h"
|
||||
#include "item.h"
|
||||
#include "task.h"
|
||||
#include "menu_indicators.h"
|
||||
#include "new_menu_helpers.h"
|
||||
#include "strings.h"
|
||||
#include "menu.h"
|
||||
#include "mail.h"
|
||||
#include "mail_data.h"
|
||||
#include "help_system.h"
|
||||
#include "sound.h"
|
||||
#include "overworld.h"
|
||||
#include "script.h"
|
||||
#include "mailbox_pc.h"
|
||||
#include "player_pc.h"
|
||||
#include "field_weather.h"
|
||||
#include "event_scripts.h"
|
||||
#include "field_fadetransition.h"
|
||||
#include "string_util.h"
|
||||
#include "item_menu.h"
|
||||
#include "item_pc.h"
|
||||
#include "party_menu.h"
|
||||
#include "constants/items.h"
|
||||
#include "constants/songs.h"
|
||||
|
||||
#define PC_ITEM_ID 0
|
||||
#define PC_QUANTITY 1
|
||||
#define NEW_GAME_PC_ITEMS(i, type) (((u16 *)gNewGamePCItems + type)[i * 2])
|
||||
|
||||
#define tCount data[2]
|
||||
#define tPageItems data[4]
|
||||
#define tItemPcParam data[6]
|
||||
#define tWindowId data[10]
|
||||
#define tListMenuTaskId data[11]
|
||||
|
||||
static EWRAM_DATA const u8 *sItemOrder = NULL;
|
||||
static EWRAM_DATA u8 sTopMenuItemCount = 0;
|
||||
EWRAM_DATA struct PlayerPCItemPageStruct gPlayerPcMenuManager = {};
|
||||
|
||||
#define SELECTED_MAIL (gSaveBlock1Ptr->mail[PC_MAIL_NUM(gPlayerPcMenuManager.scrollOffset) + gPlayerPcMenuManager.selectedRow])
|
||||
|
||||
static void Task_DrawPlayerPcTopMenu(u8 taskId);
|
||||
static void Task_TopMenuHandleInput(u8 taskId);
|
||||
static void Task_PlayerPcItemStorage(u8 taskId);
|
||||
static void Task_PlayerPcMailbox(u8 taskId);
|
||||
static void Task_PlayerPcTurnOff(u8 taskId);
|
||||
static void Task_CreateItemStorageSubmenu(u8 taskId, u8 cursorPos);
|
||||
static void PrintStringOnWindow0WithDialogueFrame(const u8 *str);
|
||||
static void Task_TopMenu_ItemStorageSubmenu_HandleInput(u8 taskId);
|
||||
static void Task_PlayerPcDepositItem(u8 taskId);
|
||||
static void Task_DepositItem_WaitFadeAndGoToBag(u8 taskId);
|
||||
static void CB2_ReturnFromDepositMenu(void);
|
||||
static void Task_PlayerPcWithdrawItem(u8 taskId);
|
||||
static void CB2_ReturnFromWithdrawMenu(void);
|
||||
static void Task_WithdrawItemBeginFade(u8 taskId);
|
||||
static void Task_PlayerPcCancel(u8 taskId);
|
||||
static void Task_SetPageItemVars(u8 taskId);
|
||||
static u8 CountPCMail(void);
|
||||
static void PCMailCompaction(void);
|
||||
static void Task_DrawMailboxPcMenu(u8 taskId);
|
||||
static void Task_MailboxPcHandleInput(u8 taskId);
|
||||
static void Task_PrintWhatToDoWithSelectedMail(u8 taskId);
|
||||
static void Task_DestroyMailboxPcViewAndCancel(u8 taskId);
|
||||
static void Task_DrawMailSubmenu(u8 taskId);
|
||||
static void Task_MailSubmenuHandleInput(u8 taskId);
|
||||
static void Task_PlayerPcReadMail(u8 taskId);
|
||||
static void Task_WaitFadeAndReadSelectedMail(u8 taskId);
|
||||
static void CB2_SetCbToReturnToMailbox(void);
|
||||
static void Task_PlayerPcMoveMailToBag(u8 taskId);
|
||||
static void Task_DrawYesNoMenuToConfirmMoveToBag(u8 taskId);
|
||||
static void Task_MoveToBagYesNoMenuHandleInput(u8 taskId);
|
||||
static void Task_TryPutMailInBag_DestroyMsgIfSuccessful(u8 taskId);
|
||||
static void Task_DeclinedMoveMailToBag(u8 taskId);
|
||||
static void Task_PlayerPcGiveMailToMon(u8 taskId);
|
||||
static void Task_WaitFadeAndGoToPartyMenu(u8 taskId);
|
||||
static void Task_Error_NoPokemon(u8 taskId);
|
||||
static void Task_PlayerPcExitMailSubmenu(u8 taskId);
|
||||
|
||||
static const u8 *const sItemStorageActionDescriptionPtrs[] = {
|
||||
gText_TakeOutItemsFromThePC,
|
||||
gText_StoreItemsInThePC,
|
||||
gText_GoBackToThePreviousMenu
|
||||
};
|
||||
|
||||
static const struct MenuAction sMenuActions_TopMenu[] = {
|
||||
{gText_ItemStorage, Task_PlayerPcItemStorage},
|
||||
{gText_Mailbox, Task_PlayerPcMailbox},
|
||||
{gText_TurnOff, Task_PlayerPcTurnOff}
|
||||
};
|
||||
|
||||
static const u8 gUnknown_8402200[] = { 0, 1, 2 };
|
||||
static const u8 gUnknown_8402203[] = { 0, 1, 2 };
|
||||
|
||||
static const struct MenuAction sMenuActions_ItemPc[] = {
|
||||
{gText_WithdrawItem2, Task_PlayerPcWithdrawItem},
|
||||
{gText_DepositItem2, Task_PlayerPcDepositItem},
|
||||
{gFameCheckerText_Cancel, Task_PlayerPcCancel}
|
||||
};
|
||||
|
||||
static const struct ItemSlot gNewGamePCItems[] = {
|
||||
{ ITEM_POTION, 1 },
|
||||
{ ITEM_NONE, 0 }
|
||||
};
|
||||
|
||||
static const struct MenuAction sMenuActions_MailSubmenu[] = {
|
||||
{gOtherText_Read, Task_PlayerPcReadMail},
|
||||
{gOtherText_MoveToBag, Task_PlayerPcMoveMailToBag},
|
||||
{gOtherText_Give2, Task_PlayerPcGiveMailToMon},
|
||||
{gOtherText_Exit, Task_PlayerPcExitMailSubmenu}
|
||||
};
|
||||
|
||||
static const struct WindowTemplate sWindowTemplate_TopMenu_3Items = {
|
||||
.bg = 0,
|
||||
.tilemapLeft = 1,
|
||||
.tilemapTop = 1,
|
||||
.width = 13,
|
||||
.height = 6,
|
||||
.paletteNum = 15,
|
||||
.baseBlock = 0x008
|
||||
};
|
||||
|
||||
static const struct WindowTemplate sWindowTemplate_TopMenu_4Items = {
|
||||
.bg = 0,
|
||||
.tilemapLeft = 1,
|
||||
.tilemapTop = 1,
|
||||
.width = 13,
|
||||
.height = 8,
|
||||
.paletteNum = 15,
|
||||
.baseBlock = 0x008
|
||||
};
|
||||
|
||||
static const struct WindowTemplate sWindowTemplate_ItemStorageSubmenu = {
|
||||
.bg = 0,
|
||||
.tilemapLeft = 1,
|
||||
.tilemapTop = 1,
|
||||
.width = 14,
|
||||
.height = 6,
|
||||
.paletteNum = 15,
|
||||
.baseBlock = 0x008
|
||||
};
|
||||
|
||||
void NewGameInitPCItems(void)
|
||||
{
|
||||
u8 i;
|
||||
|
||||
for (i = 0, ClearPCItemSlots(); NEW_GAME_PC_ITEMS(i, PC_ITEM_ID) && NEW_GAME_PC_ITEMS(i, PC_QUANTITY) &&
|
||||
AddPCItem(NEW_GAME_PC_ITEMS(i, PC_ITEM_ID), NEW_GAME_PC_ITEMS(i, PC_QUANTITY)) == TRUE; i++)
|
||||
;
|
||||
}
|
||||
|
||||
void sub_80EB6AC(void)
|
||||
{
|
||||
u8 taskId;
|
||||
|
||||
gPlayerPcMenuManager.unk_9 = 0;
|
||||
HelpSystem_BackupSomeVariable();
|
||||
sItemOrder = gUnknown_8402200;
|
||||
sTopMenuItemCount = 3;
|
||||
taskId = CreateTask(TaskDummy, 0);
|
||||
DisplayItemMessageOnField(taskId, 2, gText_WhatWouldYouLikeToDo, Task_DrawPlayerPcTopMenu);
|
||||
}
|
||||
|
||||
void sub_80EB6FC(void)
|
||||
{
|
||||
u8 taskId;
|
||||
|
||||
gPlayerPcMenuManager.unk_9 = 1;
|
||||
HelpSystem_BackupSomeVariable();
|
||||
sItemOrder = gUnknown_8402203;
|
||||
sTopMenuItemCount = 3;
|
||||
taskId = CreateTask(TaskDummy, 0);
|
||||
DisplayItemMessageOnField(taskId, 2, gText_WhatWouldYouLikeToDo, Task_DrawPlayerPcTopMenu);
|
||||
}
|
||||
|
||||
static void Task_DrawPlayerPcTopMenu(u8 taskId)
|
||||
{
|
||||
s16 *data = gTasks[taskId].data;
|
||||
if (sTopMenuItemCount == 3)
|
||||
tWindowId = AddWindow(&sWindowTemplate_TopMenu_3Items);
|
||||
else
|
||||
tWindowId = AddWindow(&sWindowTemplate_TopMenu_4Items);
|
||||
SetStdWindowBorderStyle(tWindowId, 0);
|
||||
AddItemMenuActionTextPrinters(tWindowId, 2, GetMenuCursorDimensionByFont(2, 0), 2, GetFontAttribute(2, FONTATTR_LETTER_SPACING), 16, sTopMenuItemCount, sMenuActions_TopMenu, sItemOrder);
|
||||
Menu_InitCursor(tWindowId, 2, 0, 2, 16, sTopMenuItemCount, 0);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
gTasks[taskId].func = Task_TopMenuHandleInput;
|
||||
}
|
||||
|
||||
static void Task_TopMenuHandleInput(u8 taskId)
|
||||
{
|
||||
s16 *data = gTasks[taskId].data;
|
||||
s8 input = Menu_ProcessInputNoWrapAround();
|
||||
switch (input)
|
||||
{
|
||||
case -2:
|
||||
break;
|
||||
case -1:
|
||||
PlaySE(SE_SELECT);
|
||||
ClearStdWindowAndFrameToTransparent(tWindowId, FALSE);
|
||||
ClearWindowTilemap(tWindowId);
|
||||
RemoveWindow(tWindowId);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
gTasks[taskId].func = Task_PlayerPcTurnOff;
|
||||
break;
|
||||
default:
|
||||
ClearStdWindowAndFrameToTransparent(tWindowId, FALSE);
|
||||
ClearWindowTilemap(tWindowId);
|
||||
RemoveWindow(tWindowId);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
gTasks[taskId].func = sMenuActions_TopMenu[sItemOrder[input]].func.void_u8;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void Task_ReturnToTopMenu(u8 taskId)
|
||||
{
|
||||
HelpSystem_RestoreSomeVariable();
|
||||
DisplayItemMessageOnField(taskId, 2, gText_WhatWouldYouLikeToDo, Task_DrawPlayerPcTopMenu);
|
||||
}
|
||||
|
||||
static void Task_PlayerPcItemStorage(u8 taskId)
|
||||
{
|
||||
Task_CreateItemStorageSubmenu(taskId, FALSE);
|
||||
gTasks[taskId].func = Task_TopMenu_ItemStorageSubmenu_HandleInput;
|
||||
}
|
||||
|
||||
static void Task_PlayerPcMailbox(u8 taskId)
|
||||
{
|
||||
gPlayerPcMenuManager.count = CountPCMail();
|
||||
if (gPlayerPcMenuManager.count == 0)
|
||||
{
|
||||
DisplayItemMessageOnField(taskId, 2, gText_TheresNoMailHere, Task_ReturnToTopMenu);
|
||||
}
|
||||
else
|
||||
{
|
||||
gPlayerPcMenuManager.selectedRow = 0;
|
||||
gPlayerPcMenuManager.scrollOffset = 0;
|
||||
PCMailCompaction();
|
||||
Task_SetPageItemVars(taskId);
|
||||
if (gPlayerPcMenuManager.unk_9 == 0)
|
||||
HelpSystem_SetSomeVariable2(34);
|
||||
else
|
||||
HelpSystem_SetSomeVariable2(30);
|
||||
if (MailboxPC_InitBuffers(gPlayerPcMenuManager.count) == TRUE)
|
||||
{
|
||||
ClearDialogWindowAndFrame(0, FALSE);
|
||||
Task_DrawMailboxPcMenu(taskId);
|
||||
gTasks[taskId].func = Task_MailboxPcHandleInput;
|
||||
}
|
||||
else
|
||||
{
|
||||
DisplayItemMessageOnField(taskId, 2, gText_TheresNoMailHere, Task_ReturnToTopMenu);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void Task_PlayerPcTurnOff(u8 taskId)
|
||||
{
|
||||
if (gPlayerPcMenuManager.unk_9 == 0)
|
||||
ScriptContext1_SetupScript(EventScript_PalletTown_PlayersHouse_2F_ShutDownPC);
|
||||
else
|
||||
EnableBothScriptContexts();
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
|
||||
static void Task_CreateItemStorageSubmenu(u8 taskId, u8 cursorPos)
|
||||
{
|
||||
s16 *data = gTasks[taskId].data;
|
||||
if (gPlayerPcMenuManager.unk_9 == 0)
|
||||
HelpSystem_SetSomeVariable2(33);
|
||||
else
|
||||
HelpSystem_SetSomeVariable2(29);
|
||||
tWindowId = AddWindow(&sWindowTemplate_ItemStorageSubmenu);
|
||||
SetStdWindowBorderStyle(tWindowId, FALSE);
|
||||
PrintTextArray(tWindowId, 2, GetMenuCursorDimensionByFont(2, 0), 2, 16, 3, sMenuActions_ItemPc);
|
||||
Menu_InitCursor(tWindowId, 2, 0, 2, 16, 3, cursorPos);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
PrintStringOnWindow0WithDialogueFrame(sItemStorageActionDescriptionPtrs[cursorPos]);
|
||||
}
|
||||
|
||||
static void PrintStringOnWindow0WithDialogueFrame(const u8 *str)
|
||||
{
|
||||
DrawDialogueFrame(0, FALSE);
|
||||
AddTextPrinterParameterized(0, 2, str, 0, 1, 0, NULL);
|
||||
}
|
||||
|
||||
static void Task_TopMenu_ItemStorageSubmenu_HandleInput(u8 taskId)
|
||||
{
|
||||
if (JOY_REPT(DPAD_UP))
|
||||
{
|
||||
if (Menu_GetCursorPos() != 0)
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
Menu_MoveCursor(-1);
|
||||
PrintStringOnWindow0WithDialogueFrame(sItemStorageActionDescriptionPtrs[Menu_GetCursorPos()]);
|
||||
}
|
||||
}
|
||||
else if (JOY_REPT(DPAD_DOWN))
|
||||
{
|
||||
if (Menu_GetCursorPos() != 2)
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
Menu_MoveCursor(+1);
|
||||
PrintStringOnWindow0WithDialogueFrame(sItemStorageActionDescriptionPtrs[Menu_GetCursorPos()]);
|
||||
}
|
||||
}
|
||||
else if (JOY_NEW(A_BUTTON))
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
sMenuActions_ItemPc[Menu_GetCursorPos()].func.void_u8(taskId);
|
||||
}
|
||||
else if (JOY_NEW(B_BUTTON))
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
sMenuActions_ItemPc[2].func.void_u8(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
static void Task_DepositItem_WaitFadeAndGoToBag(u8 taskId)
|
||||
{
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
CleanupOverworldWindowsAndTilemaps();
|
||||
sub_8107DB4(3, POCKET_ITEMS - 1, CB2_ReturnToField);
|
||||
gFieldCallback = CB2_ReturnFromDepositMenu;
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
static void Task_PlayerPcDepositItem(u8 taskId)
|
||||
{
|
||||
gTasks[taskId].func = Task_DepositItem_WaitFadeAndGoToBag;
|
||||
fade_screen(1, 0);
|
||||
}
|
||||
|
||||
static void Task_ReturnToItemStorageSubmenu(u8 taskId)
|
||||
{
|
||||
if (field_weather_is_fade_finished() == TRUE)
|
||||
gTasks[taskId].func = Task_TopMenu_ItemStorageSubmenu_HandleInput;
|
||||
}
|
||||
|
||||
static void CB2_ReturnFromDepositMenu(void)
|
||||
{
|
||||
u8 taskId;
|
||||
LoadStdWindowFrameGfx();
|
||||
DrawDialogueFrame(0, TRUE);
|
||||
taskId = CreateTask(Task_ReturnToItemStorageSubmenu, 0);
|
||||
Task_CreateItemStorageSubmenu(taskId, 1);
|
||||
sub_807DC00();
|
||||
}
|
||||
|
||||
static void Task_PlayerPcWithdrawItem(u8 taskId)
|
||||
{
|
||||
s16 *data = gTasks[taskId].data;
|
||||
tCount = CountItemsInPC();
|
||||
if (tCount != 0)
|
||||
{
|
||||
tItemPcParam = 0;
|
||||
gTasks[taskId].func = Task_WithdrawItemBeginFade;
|
||||
gFieldCallback = CB2_ReturnFromWithdrawMenu;
|
||||
}
|
||||
else
|
||||
{
|
||||
ClearStdWindowAndFrameToTransparent(tWindowId, FALSE);
|
||||
ClearWindowTilemap(tWindowId);
|
||||
RemoveWindow(tWindowId);
|
||||
DisplayItemMessageOnField(taskId, 2, gText_ThereAreNoItems, Task_PlayerPcItemStorage);
|
||||
}
|
||||
}
|
||||
|
||||
static void CB2_ReturnFromWithdrawMenu(void)
|
||||
{
|
||||
u8 taskId;
|
||||
LoadStdWindowFrameGfx();
|
||||
DrawDialogueFrame(0, TRUE);
|
||||
taskId = CreateTask(Task_ReturnToItemStorageSubmenu, 0);
|
||||
Task_CreateItemStorageSubmenu(taskId, 0);
|
||||
sub_807DC00();
|
||||
}
|
||||
|
||||
static void Task_WithdrawItem_WaitFadeAndGoToItemStorage(u8 taskId)
|
||||
{
|
||||
s16 *data = gTasks[taskId].data;
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
CleanupOverworldWindowsAndTilemaps();
|
||||
ItemPc_Init(tItemPcParam, CB2_ReturnToField);
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
static void Task_WithdrawItemBeginFade(u8 taskId)
|
||||
{
|
||||
gTasks[taskId].func = Task_WithdrawItem_WaitFadeAndGoToItemStorage;
|
||||
ItemPc_SetInitializedFlag(0);
|
||||
fade_screen(1, 0);
|
||||
}
|
||||
|
||||
static void Task_PlayerPcCancel(u8 taskId)
|
||||
{
|
||||
s16 *data = gTasks[taskId].data;
|
||||
ClearStdWindowAndFrameToTransparent(tWindowId, FALSE);
|
||||
ClearWindowTilemap(tWindowId);
|
||||
CopyWindowToVram(tWindowId, 1);
|
||||
RemoveWindow(tWindowId);
|
||||
Task_ReturnToTopMenu(taskId);
|
||||
}
|
||||
|
||||
static void Task_SetPageItemVars(u8 taskId)
|
||||
{
|
||||
s16 *data = gTasks[taskId].data;
|
||||
if (tCount >= 8)
|
||||
tPageItems = 8;
|
||||
else
|
||||
tPageItems = tCount + 1;
|
||||
if (gPlayerPcMenuManager.count >= 8)
|
||||
gPlayerPcMenuManager.pageItems = 8;
|
||||
else
|
||||
gPlayerPcMenuManager.pageItems = gPlayerPcMenuManager.count + 1;
|
||||
}
|
||||
|
||||
static u8 CountPCMail(void)
|
||||
{
|
||||
u8 count = 0;
|
||||
u8 i;
|
||||
|
||||
for (i = PC_MAIL_NUM(0); i < MAIL_COUNT; i++)
|
||||
{
|
||||
if (gSaveBlock1Ptr->mail[i].itemId != ITEM_NONE)
|
||||
count++;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
static void PCMailCompaction(void)
|
||||
{
|
||||
u8 i;
|
||||
u8 j;
|
||||
for (i = PC_MAIL_NUM(0); i < MAIL_COUNT - 1; i++)
|
||||
{
|
||||
for (j = i + 1; j < MAIL_COUNT; j++)
|
||||
{
|
||||
if (gSaveBlock1Ptr->mail[i].itemId == ITEM_NONE)
|
||||
{
|
||||
struct MailStruct mail = gSaveBlock1Ptr->mail[i];
|
||||
gSaveBlock1Ptr->mail[i] = gSaveBlock1Ptr->mail[j];
|
||||
gSaveBlock1Ptr->mail[j] = mail;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void Task_DrawMailboxPcMenu(u8 taskId)
|
||||
{
|
||||
u8 windowId = MailboxPC_GetAddWindow(0);
|
||||
s32 width = GetStringWidth(2, gText_Mailbox, 0);
|
||||
MailboxPC_GetAddWindow(1);
|
||||
AddTextPrinterParameterized(windowId, 2, gText_Mailbox, (80 - width) / 2, 2, 0, NULL);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
gTasks[taskId].tListMenuTaskId = MailboxPC_InitListMenu(&gPlayerPcMenuManager);
|
||||
MailboxPC_AddScrollIndicatorArrows(&gPlayerPcMenuManager);
|
||||
}
|
||||
|
||||
static void Task_MailboxPcHandleInput(u8 taskId)
|
||||
{
|
||||
s16 *data = gTasks[taskId].data;
|
||||
s32 input;
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
input = ListMenu_ProcessInput(tListMenuTaskId);
|
||||
ListMenuGetScrollAndRow(tListMenuTaskId, &gPlayerPcMenuManager.scrollOffset, &gPlayerPcMenuManager.selectedRow);
|
||||
switch (input)
|
||||
{
|
||||
case -1:
|
||||
break;
|
||||
case -2:
|
||||
PlaySE(SE_SELECT);
|
||||
RemoveScrollIndicatorArrowPair(gPlayerPcMenuManager.scrollIndicatorId);
|
||||
Task_DestroyMailboxPcViewAndCancel(taskId);
|
||||
break;
|
||||
default:
|
||||
PlaySE(SE_SELECT);
|
||||
MailboxPC_RemoveWindow(0);
|
||||
MailboxPC_RemoveWindow(1);
|
||||
DestroyListMenuTask(tListMenuTaskId, &gPlayerPcMenuManager.scrollOffset, &gPlayerPcMenuManager.selectedRow);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
RemoveScrollIndicatorArrowPair(gPlayerPcMenuManager.scrollIndicatorId);
|
||||
gTasks[taskId].func = Task_PrintWhatToDoWithSelectedMail;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void Task_PrintWhatToDoWithSelectedMail(u8 taskId)
|
||||
{
|
||||
s32 length;
|
||||
s32 i;
|
||||
u8 *ptr;
|
||||
StringCopy(gStringVar1, SELECTED_MAIL.playerName);
|
||||
length = StringLength(gStringVar1);
|
||||
if (length > 5)
|
||||
{
|
||||
for (ptr = gStringVar1 + length - 1; ptr >= gStringVar1; ptr--)
|
||||
{
|
||||
if (*ptr)
|
||||
break;
|
||||
*ptr = EOS;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ConvertInternationalString(gStringVar1, LANGUAGE_JAPANESE);
|
||||
}
|
||||
StringExpandPlaceholders(gStringVar4, gText_WhatWouldYouLikeToDoWithPlayersMail);
|
||||
DisplayItemMessageOnField(taskId, 2, gStringVar4, Task_DrawMailSubmenu);
|
||||
}
|
||||
|
||||
static void Task_DestroyMailboxPcViewAndCancel(u8 taskId)
|
||||
{
|
||||
s16 *data = gTasks[taskId].data;
|
||||
MailboxPC_RemoveWindow(0);
|
||||
MailboxPC_RemoveWindow(1);
|
||||
DestroyListMenuTask(tListMenuTaskId, NULL, NULL);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
MailboxPC_DestroyListMenuBuffer();
|
||||
Task_ReturnToTopMenu(taskId);
|
||||
}
|
||||
|
||||
static void Task_DrawMailSubmenu(u8 taskId)
|
||||
{
|
||||
u8 windowId = MailboxPC_GetAddWindow(2);
|
||||
PrintTextArray(windowId, 2, GetMenuCursorDimensionByFont(2, 0), 2, 16, 4, sMenuActions_MailSubmenu);
|
||||
Menu_InitCursor(windowId, 2, 0, 2, 16, 4, 0);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
gTasks[taskId].func = Task_MailSubmenuHandleInput;
|
||||
}
|
||||
|
||||
static void Task_MailSubmenuHandleInput(u8 taskId)
|
||||
{
|
||||
s8 input = Menu_ProcessInput_other();
|
||||
switch (input)
|
||||
{
|
||||
case -1:
|
||||
PlaySE(SE_SELECT);
|
||||
Task_PlayerPcExitMailSubmenu(taskId);
|
||||
break;
|
||||
case -2:
|
||||
break;
|
||||
default:
|
||||
PlaySE(SE_SELECT);
|
||||
sMenuActions_MailSubmenu[input].func.void_u8(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void Task_PlayerPcReadMail(u8 taskId)
|
||||
{
|
||||
fade_screen(1, 0);
|
||||
gTasks[taskId].func = Task_WaitFadeAndReadSelectedMail;
|
||||
}
|
||||
|
||||
static void Task_WaitFadeAndReadSelectedMail(u8 taskId)
|
||||
{
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
MailboxPC_DestroyListMenuBuffer();
|
||||
CleanupOverworldWindowsAndTilemaps();
|
||||
sub_80BEBEC(&SELECTED_MAIL, CB2_SetCbToReturnToMailbox, 1);
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
static void Task_WaitFadeAndReturnToMailboxPcInputHandler(u8 taskId)
|
||||
{
|
||||
if (field_weather_is_fade_finished() == TRUE)
|
||||
gTasks[taskId].func = Task_MailboxPcHandleInput;
|
||||
}
|
||||
|
||||
static void CB2_ReturnToMailbox(void)
|
||||
{
|
||||
u8 taskId;
|
||||
if (gPlayerPcMenuManager.unk_9 == 0)
|
||||
HelpSystem_SetSomeVariable2(34);
|
||||
else
|
||||
HelpSystem_SetSomeVariable2(30);
|
||||
LoadStdWindowFrameGfx();
|
||||
taskId = CreateTask(Task_WaitFadeAndReturnToMailboxPcInputHandler, 0);
|
||||
if (MailboxPC_InitBuffers(gPlayerPcMenuManager.count) == TRUE)
|
||||
Task_DrawMailboxPcMenu(taskId);
|
||||
else
|
||||
DestroyTask(taskId);
|
||||
sub_807DC00();
|
||||
}
|
||||
|
||||
static void CB2_SetCbToReturnToMailbox(void)
|
||||
{
|
||||
gFieldCallback = CB2_ReturnToMailbox;
|
||||
SetMainCallback2(CB2_ReturnToField);
|
||||
}
|
||||
|
||||
static void Task_PlayerPcMoveMailToBag(u8 taskId)
|
||||
{
|
||||
DisplayItemMessageOnField(taskId, 2, gText_MessageWillBeLost, Task_DrawYesNoMenuToConfirmMoveToBag);
|
||||
}
|
||||
|
||||
static void Task_DrawYesNoMenuToConfirmMoveToBag(u8 taskId)
|
||||
{
|
||||
DisplayYesNoMenuDefaultYes();
|
||||
gTasks[taskId].func = Task_MoveToBagYesNoMenuHandleInput;
|
||||
}
|
||||
|
||||
static void Task_MoveToBagYesNoMenuHandleInput(u8 taskId)
|
||||
{
|
||||
switch (Menu_ProcessInputNoWrapClearOnChoose())
|
||||
{
|
||||
case -2:
|
||||
break;
|
||||
case 0:
|
||||
Task_TryPutMailInBag_DestroyMsgIfSuccessful(taskId);
|
||||
break;
|
||||
case -1:
|
||||
PlaySE(SE_SELECT);
|
||||
// fallthrough
|
||||
case 1:
|
||||
Task_DeclinedMoveMailToBag(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void Task_TryPutMailInBag_DestroyMsgIfSuccessful(u8 taskId)
|
||||
{
|
||||
struct MailStruct * mail = &SELECTED_MAIL;
|
||||
if (!AddBagItem(mail->itemId, 1))
|
||||
{
|
||||
DisplayItemMessageOnField(taskId, 2, gText_BagIsFull, Task_PlayerPcExitMailSubmenu);
|
||||
}
|
||||
else
|
||||
{
|
||||
DisplayItemMessageOnField(taskId, 2, gText_MailReturnedToBagMessageErased, Task_PlayerPcExitMailSubmenu);
|
||||
ClearMailStruct(mail);
|
||||
PCMailCompaction();
|
||||
gPlayerPcMenuManager.count--;
|
||||
if (gPlayerPcMenuManager.count < gPlayerPcMenuManager.pageItems + gPlayerPcMenuManager.scrollOffset)
|
||||
{
|
||||
if (gPlayerPcMenuManager.scrollOffset != 0)
|
||||
gPlayerPcMenuManager.scrollOffset--;
|
||||
}
|
||||
Task_SetPageItemVars(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
static void Task_DeclinedMoveMailToBag(u8 taskId)
|
||||
{
|
||||
Task_PlayerPcExitMailSubmenu(taskId);
|
||||
}
|
||||
|
||||
static void Task_PlayerPcGiveMailToMon(u8 taskId)
|
||||
{
|
||||
if (CalculatePlayerPartyCount() == 0)
|
||||
{
|
||||
Task_Error_NoPokemon(taskId);
|
||||
}
|
||||
else
|
||||
{
|
||||
fade_screen(1, 0);
|
||||
gTasks[taskId].func = Task_WaitFadeAndGoToPartyMenu;
|
||||
}
|
||||
}
|
||||
|
||||
static void Task_WaitFadeAndGoToPartyMenu(u8 taskId)
|
||||
{
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
MailboxPC_DestroyListMenuBuffer();
|
||||
CleanupOverworldWindowsAndTilemaps();
|
||||
PartyMenuInit_FromPlayerPc();
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
static void CB2_ReturnToMailboxPc_UpdateScrollVariables(void)
|
||||
{
|
||||
u8 taskId;
|
||||
u8 count;
|
||||
if (gPlayerPcMenuManager.unk_9 == 0)
|
||||
HelpSystem_SetSomeVariable2(34);
|
||||
else
|
||||
HelpSystem_SetSomeVariable2(30);
|
||||
taskId = CreateTask(Task_WaitFadeAndReturnToMailboxPcInputHandler, 0);
|
||||
count = gPlayerPcMenuManager.count;
|
||||
gPlayerPcMenuManager.count = CountPCMail();
|
||||
PCMailCompaction();
|
||||
if (count != gPlayerPcMenuManager.count)
|
||||
{
|
||||
if (gPlayerPcMenuManager.count < gPlayerPcMenuManager.pageItems + gPlayerPcMenuManager.scrollOffset)
|
||||
{
|
||||
if (gPlayerPcMenuManager.scrollOffset != 0)
|
||||
gPlayerPcMenuManager.scrollOffset--;
|
||||
}
|
||||
}
|
||||
Task_SetPageItemVars(taskId);
|
||||
LoadStdWindowFrameGfx();
|
||||
if (MailboxPC_InitBuffers(gPlayerPcMenuManager.count) == TRUE)
|
||||
Task_DrawMailboxPcMenu(taskId);
|
||||
else
|
||||
DestroyTask(taskId);
|
||||
sub_807DC00();
|
||||
}
|
||||
|
||||
void CB2_PlayerPC_ReturnFromPartyMenu(void)
|
||||
{
|
||||
gFieldCallback = CB2_ReturnToMailboxPc_UpdateScrollVariables;
|
||||
SetMainCallback2(CB2_ReturnToField);
|
||||
}
|
||||
|
||||
static void Task_Error_NoPokemon(u8 taskId)
|
||||
{
|
||||
DisplayItemMessageOnField(taskId, 2, gText_ThereIsNoPokemon, Task_PlayerPcExitMailSubmenu);
|
||||
}
|
||||
|
||||
static void Task_RedrawPlayerPcMailboxAndSetUpInputHandler(u8 taskId)
|
||||
{
|
||||
ClearDialogWindowAndFrame(0, FALSE);
|
||||
Task_DrawMailboxPcMenu(taskId);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
gTasks[taskId].func = Task_MailboxPcHandleInput;
|
||||
}
|
||||
|
||||
static void Task_PlayerPcExitMailSubmenu(u8 taskId)
|
||||
{
|
||||
MailboxPC_RemoveWindow(2);
|
||||
ScheduleBgCopyTilemapToVram(0);
|
||||
gTasks[taskId].func = Task_RedrawPlayerPcMailboxAndSetUpInputHandler;
|
||||
}
|
||||
|
||||
#undef tListMenuTaskId
|
||||
#undef tWindowId
|
||||
#undef tItemPcParam
|
||||
#undef tPageItems
|
||||
#undef tCount
|
||||
@@ -13,7 +13,6 @@
|
||||
#include "event_data.h"
|
||||
#include "util.h"
|
||||
#include "pokemon_storage_system.h"
|
||||
#include "data.h"
|
||||
#include "battle_gfx_sfx_util.h"
|
||||
#include "battle_controllers.h"
|
||||
#include "evolution_scene.h"
|
||||
|
||||
+1083
File diff suppressed because it is too large
Load Diff
+369
-372
File diff suppressed because it is too large
Load Diff
+830
@@ -0,0 +1,830 @@
|
||||
#include "global.h"
|
||||
#include "battle_anim.h"
|
||||
#include "gpu_regs.h"
|
||||
#include "graphics.h"
|
||||
#include "palette.h"
|
||||
#include "sound.h"
|
||||
#include "task.h"
|
||||
#include "trig.h"
|
||||
#include "constants/songs.h"
|
||||
|
||||
static void sub_80B4634(struct Sprite *sprite);
|
||||
static void sub_80B46F8(struct Sprite *sprite);
|
||||
static void AnimDirtParticleAcrossScreen(struct Sprite *sprite);
|
||||
static void AnimRaiseSprite(struct Sprite *sprite);
|
||||
static void sub_80B4D00(u8 taskId);
|
||||
static void sub_80B4F78(struct Sprite *sprite);
|
||||
static void sub_80B4FE4(struct Sprite *sprite);
|
||||
static void sub_80B5074(struct Sprite *sprite);
|
||||
static void sub_80B50A0(struct Sprite *sprite);
|
||||
static void sub_80B477C(struct Sprite *sprite);
|
||||
static void sub_80B46B4(struct Sprite *sprite);
|
||||
static void sub_80B47C4(struct Sprite *sprite);
|
||||
static void sub_80B490C(u8 taskId);
|
||||
static void sub_80B4E70(struct Task *task);
|
||||
static u8 sub_80B4FB8(void);
|
||||
static void sub_80B5024(struct Sprite *sprite);
|
||||
static void sub_80B50F8(struct Sprite *sprite);
|
||||
|
||||
static const union AnimCmd gUnknown_83E7390[] =
|
||||
{
|
||||
ANIMCMD_FRAME(32, 1),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E7398[] =
|
||||
{
|
||||
ANIMCMD_FRAME(48, 1),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E73A0[] =
|
||||
{
|
||||
ANIMCMD_FRAME(64, 1),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd *const gUnknown_83E73A8[] =
|
||||
{
|
||||
gUnknown_83E7390,
|
||||
gUnknown_83E7398,
|
||||
gUnknown_83E73A0,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E73B4 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_ROCKS,
|
||||
.paletteTag = ANIM_TAG_ROCKS,
|
||||
.oam = &gOamData_83AC9D8,
|
||||
.anims = gUnknown_83E73A8,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B4634,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E73CC =
|
||||
{
|
||||
.tileTag = ANIM_TAG_ROCKS,
|
||||
.paletteTag = ANIM_TAG_ROCKS,
|
||||
.oam = &gOamData_83AC9D8,
|
||||
.anims = gUnknown_83E73A8,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B46F8,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E73E4 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_MUD_SAND,
|
||||
.paletteTag = ANIM_TAG_MUD_SAND,
|
||||
.oam = &gOamData_83AC9C8,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B477C,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E73FC[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0xC0, 0xC0, 0, 0),
|
||||
AFFINEANIMCMD_FRAME(0x2, 0xFFFD, 0, 5),
|
||||
AFFINEANIMCMD_FRAME(0xFFFE, 0x3, 0, 5),
|
||||
AFFINEANIMCMD_JUMP(1),
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd *const gUnknown_83E741C[] =
|
||||
{
|
||||
gUnknown_83E73FC,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7420 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_WATER_ORB,
|
||||
.paletteTag = ANIM_TAG_WATER_ORB,
|
||||
.oam = &gOamData_83ACB50,
|
||||
.anims = gUnknown_83E5958,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E741C,
|
||||
.callback = sub_80B477C,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7438 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_SMALL_EMBER,
|
||||
.paletteTag = ANIM_TAG_SMALL_EMBER,
|
||||
.oam = &gOamData_83AC9D8,
|
||||
.anims = gUnknown_83E5D48,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B477C,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7450 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_FLYING_DIRT,
|
||||
.paletteTag = ANIM_TAG_FLYING_DIRT,
|
||||
.oam = &gOamData_83AC9F8,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = AnimDirtParticleAcrossScreen,
|
||||
};
|
||||
|
||||
static const struct Subsprite gUnknown_83E7468[] =
|
||||
{
|
||||
{
|
||||
.x = -16,
|
||||
.y = 0,
|
||||
.shape = ST_OAM_H_RECTANGLE,
|
||||
.size = 2,
|
||||
.tileOffset = 0,
|
||||
.priority = 1,
|
||||
},
|
||||
{
|
||||
.x = 16,
|
||||
.y = 0,
|
||||
.shape = ST_OAM_H_RECTANGLE,
|
||||
.size = 2,
|
||||
.tileOffset = 8,
|
||||
.priority = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct SubspriteTable gUnknown_83E7470[] =
|
||||
{
|
||||
{ ARRAY_COUNT(gUnknown_83E7468), gUnknown_83E7468 },
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E7478[] =
|
||||
{
|
||||
ANIMCMD_FRAME(0, 1),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E7480[] =
|
||||
{
|
||||
ANIMCMD_FRAME(16, 1),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E7488[] =
|
||||
{
|
||||
ANIMCMD_FRAME(32, 1),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E7490[] =
|
||||
{
|
||||
ANIMCMD_FRAME(48, 1),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E7498[] =
|
||||
{
|
||||
ANIMCMD_FRAME(64, 1),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E74A0[] =
|
||||
{
|
||||
ANIMCMD_FRAME(80, 1),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd *const gUnknown_83E74A8[] =
|
||||
{
|
||||
gUnknown_83E7478,
|
||||
gUnknown_83E7480,
|
||||
};
|
||||
|
||||
static const union AnimCmd *const gUnknown_83E74B0[] =
|
||||
{
|
||||
gUnknown_83E7488,
|
||||
gUnknown_83E7490,
|
||||
};
|
||||
|
||||
static const union AnimCmd *const gUnknown_83E74B8[] =
|
||||
{
|
||||
gUnknown_83E7498,
|
||||
gUnknown_83E74A0,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E74C0 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_ROCKS,
|
||||
.paletteTag = ANIM_TAG_ROCKS,
|
||||
.oam = &gOamData_83AC9D8,
|
||||
.anims = gUnknown_83E74A8,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = AnimRaiseSprite,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E74D8 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_MUD_SAND,
|
||||
.paletteTag = ANIM_TAG_MUD_SAND,
|
||||
.oam = &gOamData_83AC9C8,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B4F78,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E74F0 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_ROCKS,
|
||||
.paletteTag = ANIM_TAG_ROCKS,
|
||||
.oam = &gOamData_83AC9D8,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B4F78,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7508 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_ROCKS,
|
||||
.paletteTag = ANIM_TAG_ROCKS,
|
||||
.oam = &gOamData_83AC9D8,
|
||||
.anims = gUnknown_83E74A8,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B4FE4,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7520[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, -5, 5),
|
||||
AFFINEANIMCMD_JUMP(0),
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7530[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, 5, 5),
|
||||
AFFINEANIMCMD_JUMP(0),
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd *const gUnknown_83E7540[] =
|
||||
{
|
||||
gUnknown_83E7520,
|
||||
gUnknown_83E7530,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7548 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_ROCKS,
|
||||
.paletteTag = ANIM_TAG_ROCKS,
|
||||
.oam = &gOamData_83ACA38,
|
||||
.anims = gUnknown_83E74A8,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7540,
|
||||
.callback = sub_80B5074,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7560 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_ROCKS,
|
||||
.paletteTag = ANIM_TAG_ROCKS,
|
||||
.oam = &gOamData_83ACA38,
|
||||
.anims = gUnknown_83E74A8,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7540,
|
||||
.callback = sub_80B50A0,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7578 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_ROCKS,
|
||||
.paletteTag = ANIM_TAG_ROCKS,
|
||||
.oam = &gOamData_83AC9D8,
|
||||
.anims = gUnknown_83E74B8,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7540,
|
||||
.callback = AnimMoveTwisterParticle,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7590 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_ROCKS,
|
||||
.paletteTag = ANIM_TAG_ROCKS,
|
||||
.oam = &gOamData_83ACA38,
|
||||
.anims = gUnknown_83E74B0,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7540,
|
||||
.callback = sub_8077350,
|
||||
};
|
||||
|
||||
static void sub_80B4634(struct Sprite *sprite)
|
||||
{
|
||||
if (gBattleAnimArgs[3] != 0)
|
||||
SetAverageBattlerPositions(gBattleAnimTarget, 0, &sprite->pos1.x, &sprite->pos1.y);
|
||||
sprite->pos1.x += gBattleAnimArgs[0];
|
||||
sprite->pos1.y += 14;
|
||||
StartSpriteAnim(sprite, gBattleAnimArgs[1]);
|
||||
AnimateSprite(sprite);
|
||||
sprite->data[0] = 0;
|
||||
sprite->data[1] = 0;
|
||||
sprite->data[2] = 4;
|
||||
sprite->data[3] = 16;
|
||||
sprite->data[4] = -70;
|
||||
sprite->data[5] = gBattleAnimArgs[2];
|
||||
StoreSpriteCallbackInData6(sprite, sub_80B46B4);
|
||||
sprite->callback = TranslateSpriteInEllipseOverDuration;
|
||||
sprite->callback(sprite);
|
||||
}
|
||||
|
||||
static void sub_80B46B4(struct Sprite *sprite)
|
||||
{
|
||||
sprite->pos1.x += sprite->data[5];
|
||||
sprite->data[0] = 192;
|
||||
sprite->data[1] = sprite->data[5];
|
||||
sprite->data[2] = 4;
|
||||
sprite->data[3] = 32;
|
||||
sprite->data[4] = -24;
|
||||
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
|
||||
sprite->callback = TranslateSpriteInEllipseOverDuration;
|
||||
sprite->callback(sprite);
|
||||
}
|
||||
|
||||
static void sub_80B46F8(struct Sprite *sprite)
|
||||
{
|
||||
StartSpriteAnim(sprite, gBattleAnimArgs[5]);
|
||||
AnimateSprite(sprite);
|
||||
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
sprite->pos1.x -= gBattleAnimArgs[0];
|
||||
else
|
||||
sprite->pos1.x += gBattleAnimArgs[0];
|
||||
sprite->pos1.y += gBattleAnimArgs[1];
|
||||
sprite->data[0] = gBattleAnimArgs[4];
|
||||
sprite->data[1] = sprite->pos1.x;
|
||||
sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2];
|
||||
sprite->data[3] = sprite->pos1.y;
|
||||
sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[3];
|
||||
InitSpriteDataForLinearTranslation(sprite);
|
||||
sprite->data[3] = 0;
|
||||
sprite->data[4] = 0;
|
||||
sprite->callback = TranslateSpriteLinearFixedPoint;
|
||||
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
|
||||
}
|
||||
|
||||
static void sub_80B477C(struct Sprite *sprite)
|
||||
{
|
||||
if (gBattleAnimArgs[6] == 0)
|
||||
InitSpritePosToAnimAttacker(sprite, 0);
|
||||
else
|
||||
InitSpritePosToAnimTarget(sprite, FALSE);
|
||||
sprite->data[0] = gBattleAnimArgs[3];
|
||||
sprite->data[1] = gBattleAnimArgs[2];
|
||||
sprite->data[2] = gBattleAnimArgs[4];
|
||||
sprite->data[3] = gBattleAnimArgs[5];
|
||||
sprite->callback = sub_80B47C4;
|
||||
}
|
||||
|
||||
static void sub_80B47C4(struct Sprite *sprite)
|
||||
{
|
||||
sprite->data[4] += sprite->data[1];
|
||||
sprite->pos2.y = -(sprite->data[4] >> 8);
|
||||
sprite->pos2.x = Sin(sprite->data[5], sprite->data[3]);
|
||||
sprite->data[5] = (sprite->data[5] + sprite->data[2]) & 0xFF;
|
||||
if (--sprite->data[0] == -1)
|
||||
{
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
}
|
||||
|
||||
void AnimTask_LoadSandstormBackground(u8 taskId)
|
||||
{
|
||||
s32 var0;
|
||||
struct BattleAnimBgData animBg;
|
||||
|
||||
var0 = 0;
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));
|
||||
SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
|
||||
SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0);
|
||||
if (!IsContest())
|
||||
SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);
|
||||
gBattle_BG1_X = 0;
|
||||
gBattle_BG1_Y = 0;
|
||||
SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X);
|
||||
SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);
|
||||
sub_80752A0(&animBg);
|
||||
AnimLoadCompressedBgTilemap(animBg.bgId, gFile_graphics_battle_anims_backgrounds_sandstorm_brew_tilemap);
|
||||
AnimLoadCompressedBgGfx(animBg.bgId, gFile_graphics_battle_anims_backgrounds_sandstorm_brew_sheet, animBg.tilesOffset);
|
||||
LoadCompressedPalette(gBattleAnimSpritePal_FlyingDirt, animBg.paletteId * 16, 32);
|
||||
if (IsContest())
|
||||
sub_80730C0(animBg.paletteId, animBg.bgTilemap, 0, 0);
|
||||
if (gBattleAnimArgs[0] && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
var0 = 1;
|
||||
gTasks[taskId].data[0] = var0;
|
||||
gTasks[taskId].func = sub_80B490C;
|
||||
}
|
||||
|
||||
static void sub_80B490C(u8 taskId)
|
||||
{
|
||||
struct BattleAnimBgData animBg;
|
||||
|
||||
if (gTasks[taskId].data[0] == 0)
|
||||
gBattle_BG1_X += -6;
|
||||
else
|
||||
gBattle_BG1_X += 6;
|
||||
gBattle_BG1_Y += -1;
|
||||
switch (gTasks[taskId].data[12])
|
||||
{
|
||||
case 0:
|
||||
if (++gTasks[taskId].data[10] == 4)
|
||||
{
|
||||
gTasks[taskId].data[10] = 0;
|
||||
++gTasks[taskId].data[11];
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11]));
|
||||
if (gTasks[taskId].data[11] == 7)
|
||||
{
|
||||
++gTasks[taskId].data[12];
|
||||
gTasks[taskId].data[11] = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (++gTasks[taskId].data[11] == 101)
|
||||
{
|
||||
gTasks[taskId].data[11] = 7;
|
||||
++gTasks[taskId].data[12];
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (++gTasks[taskId].data[10] == 4)
|
||||
{
|
||||
gTasks[taskId].data[10] = 0;
|
||||
--gTasks[taskId].data[11];
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11]));
|
||||
if (gTasks[taskId].data[11] == 0)
|
||||
{
|
||||
++gTasks[taskId].data[12];
|
||||
gTasks[taskId].data[11] = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
sub_80752A0(&animBg);
|
||||
sub_8075358(animBg.bgId);
|
||||
++gTasks[taskId].data[12];
|
||||
break;
|
||||
case 4:
|
||||
if (!IsContest())
|
||||
SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0);
|
||||
gBattle_BG1_X = 0;
|
||||
gBattle_BG1_Y = 0;
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, 0);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
|
||||
SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Animates the sprites that fly diagonally across the screen
|
||||
// in Sandstorm and Heat Wave.
|
||||
// arg 0: initial y pixel offset
|
||||
// arg 1: projectile speed
|
||||
// arg 2: y pixel drop
|
||||
// arg 3: ??? unknown (possibly a color bit)
|
||||
static void AnimDirtParticleAcrossScreen(struct Sprite *sprite)
|
||||
{
|
||||
if (sprite->data[0] == 0)
|
||||
{
|
||||
if (gBattleAnimArgs[3] != 0 && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
{
|
||||
sprite->pos1.x = 304;
|
||||
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
|
||||
sprite->data[5] = 1;
|
||||
sprite->oam.matrixNum = ST_OAM_HFLIP;
|
||||
}
|
||||
else
|
||||
{
|
||||
sprite->pos1.x = -64;
|
||||
}
|
||||
sprite->pos1.y = gBattleAnimArgs[0];
|
||||
SetSubspriteTables(sprite, gUnknown_83E7470);
|
||||
sprite->data[1] = gBattleAnimArgs[1];
|
||||
sprite->data[2] = gBattleAnimArgs[2];
|
||||
++sprite->data[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
sprite->data[3] += sprite->data[1];
|
||||
sprite->data[4] += sprite->data[2];
|
||||
sprite->pos2.x += (sprite->data[3] >> 8);
|
||||
sprite->pos2.y += (sprite->data[4] >> 8);
|
||||
sprite->data[3] &= 0xFF;
|
||||
sprite->data[4] &= 0xFF;
|
||||
if (sprite->data[5] == 0)
|
||||
{
|
||||
if (sprite->pos1.x + sprite->pos2.x > 272)
|
||||
{
|
||||
sprite->callback = DestroyAnimSprite;
|
||||
}
|
||||
}
|
||||
else if (sprite->pos1.x + sprite->pos2.x < -32)
|
||||
{
|
||||
sprite->callback = DestroyAnimSprite;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Animates the rising rocks in Ancient Power.
|
||||
// arg 0: initial x pixel offset
|
||||
// arg 1: initial y pixel offset
|
||||
// arg 2: terminal y offset
|
||||
// arg 3: duration
|
||||
// arg 4: sprite size [1,5]
|
||||
static void AnimRaiseSprite(struct Sprite *sprite)
|
||||
{
|
||||
StartSpriteAnim(sprite, gBattleAnimArgs[4]);
|
||||
InitSpritePosToAnimAttacker(sprite, 0);
|
||||
sprite->data[0] = gBattleAnimArgs[3];
|
||||
sprite->data[2] = sprite->pos1.x;
|
||||
sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[2];
|
||||
sprite->callback = StartAnimLinearTranslation;
|
||||
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
|
||||
}
|
||||
|
||||
void sub_80B4BD0(u8 taskId)
|
||||
{
|
||||
u16 var0, var1, var2, var3;
|
||||
u8 var4;
|
||||
s32 var5;
|
||||
s16 pan1, pan2;
|
||||
struct Task *task;
|
||||
|
||||
task = &gTasks[taskId];
|
||||
var0 = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
|
||||
var1 = GetBattlerSpriteCoord(gBattleAnimAttacker, 1) + 24;
|
||||
var2 = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
|
||||
var3 = GetBattlerSpriteCoord(gBattleAnimTarget, 1) + 24;
|
||||
if (BATTLE_PARTNER(gBattleAnimAttacker) == gBattleAnimTarget)
|
||||
var3 = var1;
|
||||
var4 = sub_80B4FB8();
|
||||
if (var4 == 1)
|
||||
task->data[8] = 32;
|
||||
else
|
||||
task->data[8] = 48 - (var4 * 8);
|
||||
task->data[0] = 0;
|
||||
task->data[11] = 0;
|
||||
task->data[9] = 0;
|
||||
task->data[12] = 1;
|
||||
var5 = task->data[8];
|
||||
if (var5 < 0)
|
||||
var5 += 7;
|
||||
task->data[10] = (var5 >> 3) - 1;
|
||||
task->data[2] = var0 * 8;
|
||||
task->data[3] = var1 * 8;
|
||||
task->data[4] = ((var2 - var0) * 8) / task->data[8];
|
||||
task->data[5] = ((var3 - var1) * 8) / task->data[8];
|
||||
task->data[6] = 0;
|
||||
task->data[7] = 0;
|
||||
pan1 = BattleAnimAdjustPanning(PAN_SIDE_PLAYER);
|
||||
pan2 = BattleAnimAdjustPanning(PAN_SIDE_OPPONENT);
|
||||
task->data[13] = pan1;
|
||||
task->data[14] = (pan2 - pan1) / task->data[8];
|
||||
task->data[1] = var4;
|
||||
task->data[15] = GetAnimBattlerSpriteId(0);
|
||||
task->func = sub_80B4D00;
|
||||
}
|
||||
|
||||
static void sub_80B4D00(u8 taskId)
|
||||
{
|
||||
struct Task *task;
|
||||
|
||||
task = &gTasks[taskId];
|
||||
switch (task->data[0])
|
||||
{
|
||||
case 0:
|
||||
task->data[6] -= task->data[4];
|
||||
task->data[7] -= task->data[5];
|
||||
gSprites[task->data[15]].pos2.x = task->data[6] >> 3;
|
||||
gSprites[task->data[15]].pos2.y = task->data[7] >> 3;
|
||||
if (++task->data[9] == 10)
|
||||
{
|
||||
task->data[11] = 20;
|
||||
++task->data[0];
|
||||
}
|
||||
PlaySE12WithPanning(SE_W029, task->data[13]);
|
||||
break;
|
||||
case 1:
|
||||
if (--task->data[11] == 0)
|
||||
++task->data[0];
|
||||
break;
|
||||
case 2:
|
||||
if (--task->data[9] != 0)
|
||||
{
|
||||
task->data[6] += task->data[4];
|
||||
task->data[7] += task->data[5];
|
||||
}
|
||||
else
|
||||
{
|
||||
task->data[6] = 0;
|
||||
task->data[7] = 0;
|
||||
++task->data[0];
|
||||
}
|
||||
gSprites[task->data[15]].pos2.x = task->data[6] >> 3;
|
||||
gSprites[task->data[15]].pos2.y = task->data[7] >> 3;
|
||||
break;
|
||||
case 3:
|
||||
task->data[2] += task->data[4];
|
||||
task->data[3] += task->data[5];
|
||||
if (++task->data[9] >= task->data[10])
|
||||
{
|
||||
task->data[9] = 0;
|
||||
sub_80B4E70(task);
|
||||
task->data[13] += task->data[14];
|
||||
PlaySE12WithPanning(SE_W091, task->data[13]);
|
||||
}
|
||||
if (--task->data[8] == 0)
|
||||
{
|
||||
++task->data[0];
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if (task->data[11] == 0)
|
||||
DestroyAnimVisualTask(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B4E70(struct Task *task)
|
||||
{
|
||||
const struct SpriteTemplate *spriteTemplate;
|
||||
s32 var0;
|
||||
u16 x, y;
|
||||
u8 spriteId;
|
||||
|
||||
switch (task->data[1])
|
||||
{
|
||||
case 1:
|
||||
spriteTemplate = &gUnknown_83E74D8;
|
||||
var0 = 0;
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
spriteTemplate = &gUnknown_83E74F0;
|
||||
var0 = 80;
|
||||
break;
|
||||
case 4:
|
||||
spriteTemplate = &gUnknown_83E74F0;
|
||||
var0 = 64;
|
||||
break;
|
||||
case 5:
|
||||
spriteTemplate = &gUnknown_83E74F0;
|
||||
var0 = 48;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
x = task->data[2] >> 3;
|
||||
y = task->data[3] >> 3;
|
||||
x += (task->data[12] * 4);
|
||||
spriteId = CreateSprite(spriteTemplate, x, y, 35);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
{
|
||||
gSprites[spriteId].data[0] = 18;
|
||||
gSprites[spriteId].data[2] = ((task->data[12] * 20) + x) + (task->data[1] * 3);
|
||||
gSprites[spriteId].data[4] = y;
|
||||
gSprites[spriteId].data[5] = -16 - (task->data[1] * 2);
|
||||
gSprites[spriteId].oam.tileNum += var0;
|
||||
InitAnimArcTranslation(&gSprites[spriteId]);
|
||||
++task->data[11];
|
||||
}
|
||||
task->data[12] *= -1;
|
||||
}
|
||||
|
||||
static void sub_80B4F78(struct Sprite *sprite)
|
||||
{
|
||||
if (TranslateAnimHorizontalArc(sprite))
|
||||
{
|
||||
u8 taskId = FindTaskIdByFunc(sub_80B4D00);
|
||||
|
||||
if (taskId != TASK_NONE)
|
||||
--gTasks[taskId].data[11];
|
||||
DestroySprite(sprite);
|
||||
}
|
||||
}
|
||||
|
||||
static u8 sub_80B4FB8(void)
|
||||
{
|
||||
u8 retVal = gAnimDisableStructPtr->rolloutTimerStartValue - gAnimDisableStructPtr->rolloutTimer;
|
||||
u8 var0 = retVal - 1;
|
||||
|
||||
if (var0 > 4)
|
||||
retVal = 1;
|
||||
return retVal;
|
||||
}
|
||||
|
||||
static void sub_80B4FE4(struct Sprite *sprite)
|
||||
{
|
||||
StartSpriteAnim(sprite, gBattleAnimArgs[4]);
|
||||
sprite->pos2.x = gBattleAnimArgs[0];
|
||||
sprite->data[2] = gBattleAnimArgs[1];
|
||||
sprite->data[3] -= gBattleAnimArgs[2];
|
||||
sprite->data[0] = 3;
|
||||
sprite->data[1] = gBattleAnimArgs[3];
|
||||
sprite->callback = sub_80B5024;
|
||||
sprite->invisible = TRUE;
|
||||
}
|
||||
|
||||
static void sub_80B5024(struct Sprite *sprite)
|
||||
{
|
||||
sprite->invisible = FALSE;
|
||||
if (sprite->data[3] != 0)
|
||||
{
|
||||
sprite->pos2.y = sprite->data[2] + sprite->data[3];
|
||||
sprite->data[3] += sprite->data[0];
|
||||
++sprite->data[0];
|
||||
if (sprite->data[3] > 0)
|
||||
{
|
||||
sprite->data[3] = 0;
|
||||
}
|
||||
}
|
||||
else if (--sprite->data[1] == 0)
|
||||
{
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B5074(struct Sprite *sprite)
|
||||
{
|
||||
if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)
|
||||
StartSpriteAffineAnim(sprite, 1);
|
||||
TranslateAnimSpriteToTargetMonLocation(sprite);
|
||||
}
|
||||
|
||||
static void sub_80B50A0(struct Sprite *sprite)
|
||||
{
|
||||
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 0);
|
||||
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 1);
|
||||
sprite->pos1.x += gBattleAnimArgs[0];
|
||||
sprite->pos1.y += gBattleAnimArgs[1];
|
||||
sprite->data[1] = gBattleAnimArgs[0];
|
||||
sprite->data[2] = gBattleAnimArgs[1];
|
||||
sprite->data[5] = gBattleAnimArgs[2];
|
||||
StartSpriteAnim(sprite, gBattleAnimArgs[3]);
|
||||
sprite->callback = sub_80B50F8;
|
||||
}
|
||||
|
||||
static void sub_80B50F8(struct Sprite *sprite)
|
||||
{
|
||||
sprite->data[0] += 8;
|
||||
sprite->data[3] += sprite->data[1];
|
||||
sprite->data[4] += sprite->data[2];
|
||||
sprite->pos2.x += sprite->data[3] / 40;
|
||||
sprite->pos2.y -= Sin(sprite->data[0], sprite->data[5]);
|
||||
if (sprite->data[0] > 140)
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
|
||||
void AnimTask_GetSeismicTossDamageLevel(u8 taskId)
|
||||
{
|
||||
if (gAnimMoveDmg < 33)
|
||||
gBattleAnimArgs[7] = 0;
|
||||
if ((u32)gAnimMoveDmg - 33 < 33)
|
||||
gBattleAnimArgs[7] = 1;
|
||||
if (gAnimMoveDmg > 65)
|
||||
gBattleAnimArgs[7] = 2;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80B5188(u8 taskId)
|
||||
{
|
||||
if (gTasks[taskId].data[0] == 0)
|
||||
{
|
||||
sub_8075458(0);
|
||||
gTasks[taskId].data[1] = 200;
|
||||
}
|
||||
gBattle_BG3_Y += gTasks[taskId].data[1] / 10;
|
||||
gTasks[taskId].data[1] -= 3;
|
||||
if (gTasks[taskId].data[0] == 120)
|
||||
{
|
||||
sub_8075458(1);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
++gTasks[taskId].data[0];
|
||||
}
|
||||
|
||||
void sub_80B51EC(u8 taskId)
|
||||
{
|
||||
if (gTasks[taskId].data[0] == 0)
|
||||
{
|
||||
sub_8075458(0);
|
||||
++gTasks[taskId].data[0];
|
||||
gTasks[taskId].data[2] = gBattle_BG3_Y;
|
||||
}
|
||||
gTasks[taskId].data[1] += 80;
|
||||
gTasks[taskId].data[1] &= 0xFF;
|
||||
gBattle_BG3_Y = gTasks[taskId].data[2] + Cos(4, gTasks[taskId].data[1]);
|
||||
if (gBattleAnimArgs[7] == 0xFFF)
|
||||
{
|
||||
gBattle_BG3_Y = 0;
|
||||
sub_8075458(1);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
+3
-3
@@ -85,7 +85,7 @@ u16 gSaveUnusedVar;
|
||||
u16 gSaveFileStatus;
|
||||
void (*gGameContinueCallback)(void);
|
||||
struct SaveBlockChunk gRamSaveSectionLocations[0xE];
|
||||
u16 gUnknown_3005420;
|
||||
u16 gSaveSucceeded;
|
||||
|
||||
EWRAM_DATA struct SaveSection gSaveDataBuffer = {0};
|
||||
EWRAM_DATA u32 gSaveUnusedVar2 = 0;
|
||||
@@ -702,11 +702,11 @@ u8 TrySavingData(u8 saveType)
|
||||
else
|
||||
goto OK; // really?
|
||||
}
|
||||
gUnknown_3005420 = 0xFF;
|
||||
gSaveSucceeded = 0xFF;
|
||||
return 0xFF;
|
||||
|
||||
OK:
|
||||
gUnknown_3005420 = 1;
|
||||
gSaveSucceeded = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -1284,14 +1284,14 @@ bool8 ScrCmd_loadhelp(struct ScriptContext *ctx)
|
||||
|
||||
if (msg == NULL)
|
||||
msg = (const u8 *)ctx->data[0];
|
||||
sub_80F7974(msg);
|
||||
DrawHelpMessageWindowWithText(msg);
|
||||
CopyWindowToVram(GetStartMenuWindowId(), 1);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool8 ScrCmd_unloadhelp(struct ScriptContext *ctx)
|
||||
{
|
||||
sub_80F7998();
|
||||
DestroyHelpMessageWindow_();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -1566,7 +1566,7 @@ bool8 ScrCmd_braillemessage(struct ScriptContext *ctx)
|
||||
if (ptr == NULL)
|
||||
ptr = (u8 *)ctx->data[0];
|
||||
|
||||
sub_80F6E9C();
|
||||
LoadStdWindowFrameGfx();
|
||||
DrawDialogueFrame(0, 1);
|
||||
AddTextPrinterParameterized(0, 6, ptr, 0, 1, 0, NULL);
|
||||
return FALSE;
|
||||
|
||||
+1008
File diff suppressed because it is too large
Load Diff
+2
-2
@@ -510,7 +510,7 @@ static void TeachyTvMainCallback(void)
|
||||
ScheduleBgCopyTilemapToVram(1);
|
||||
ScheduleBgCopyTilemapToVram(2);
|
||||
ScheduleBgCopyTilemapToVram(3);
|
||||
sub_812B1E0(9); // help system something
|
||||
HelpSystem_SetSomeVariable(9); // help system something
|
||||
BlendPalettes(0xFFFFFFFF, 0x10, 0);
|
||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
|
||||
SetVBlankCallback(TeachyTvVblankHandler);
|
||||
@@ -736,7 +736,7 @@ static void TeachyTvOptionListController(u8 taskId)
|
||||
{
|
||||
input = ListMenu_ProcessInput(data[0]);
|
||||
ListMenuGetScrollAndRow(data[0], &sStaticResources.scrollOffset, &sStaticResources.selectedRow);
|
||||
if ((JOY_NEW(SELECT_BUTTON) && sStaticResources.callback != ReturnToBagFromKeyItem))
|
||||
if ((JOY_NEW(SELECT_BUTTON) && sStaticResources.callback != CB2_BagMenuFromStartMenu))
|
||||
{
|
||||
PlaySE(SE_SELECT);
|
||||
TeachyTvQuitBeginFade(taskId);
|
||||
|
||||
+917
@@ -137,6 +137,7 @@ void sub_804C718(void)
|
||||
SetMainCallback2(sub_804C728);
|
||||
}
|
||||
|
||||
#ifdef NONMATCHING
|
||||
void sub_804C728(void)
|
||||
{
|
||||
int i;
|
||||
@@ -319,6 +320,10 @@ void sub_804C728(void)
|
||||
CreateSprite(&temp, xPos + gTradeUnknownSpriteCoords[LANGUAGE_ENGLISH - 1][0] + (i * 32), gTradeUnknownSpriteCoords[LANGUAGE_ENGLISH - 1][1], 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* These three lines are a pain to match due to register alloc and
|
||||
* pointer arithmetic misbehavior.
|
||||
*/
|
||||
id = GetMultiplayerId();
|
||||
id ^= 1;
|
||||
width = GetStringWidth(1, gLinkPlayers[id].name, 0);
|
||||
@@ -406,3 +411,915 @@ void sub_804C728(void)
|
||||
BuildOamBuffer();
|
||||
UpdatePaletteFade();
|
||||
}
|
||||
#else
|
||||
NAKED
|
||||
void sub_804C728(void)
|
||||
{
|
||||
asm_unified("\tpush {r4-r7,lr}\n"
|
||||
"\tmov r7, r8\n"
|
||||
"\tpush {r7}\n"
|
||||
"\tsub sp, 0x28\n"
|
||||
"\tldr r1, _0804C74C @ =gMain\n"
|
||||
"\tmovs r2, 0x87\n"
|
||||
"\tlsls r2, 3\n"
|
||||
"\tadds r0, r1, r2\n"
|
||||
"\tldrb r0, [r0]\n"
|
||||
"\tadds r3, r1, 0\n"
|
||||
"\tcmp r0, 0x16\n"
|
||||
"\tbls _0804C742\n"
|
||||
"\tb _0804CEE6\n"
|
||||
"_0804C742:\n"
|
||||
"\tlsls r0, 2\n"
|
||||
"\tldr r1, _0804C750 @ =_0804C754\n"
|
||||
"\tadds r0, r1\n"
|
||||
"\tldr r0, [r0]\n"
|
||||
"\tmov pc, r0\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0804C74C: .4byte gMain\n"
|
||||
"_0804C750: .4byte _0804C754\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0804C754:\n"
|
||||
"\t.4byte _0804C7B0\n"
|
||||
"\t.4byte _0804C7FC\n"
|
||||
"\t.4byte _0804C8C8\n"
|
||||
"\t.4byte _0804C8F4\n"
|
||||
"\t.4byte _0804C950\n"
|
||||
"\t.4byte _0804C9B0\n"
|
||||
"\t.4byte _0804C9F0\n"
|
||||
"\t.4byte _0804CA10\n"
|
||||
"\t.4byte _0804CB50\n"
|
||||
"\t.4byte _0804CB78\n"
|
||||
"\t.4byte _0804CB9C\n"
|
||||
"\t.4byte _0804CC30\n"
|
||||
"\t.4byte _0804CC3E\n"
|
||||
"\t.4byte _0804CD10\n"
|
||||
"\t.4byte _0804CDE0\n"
|
||||
"\t.4byte _0804CE20\n"
|
||||
"\t.4byte _0804CE3A\n"
|
||||
"\t.4byte _0804CE48\n"
|
||||
"\t.4byte _0804CE5C\n"
|
||||
"\t.4byte _0804CE7C\n"
|
||||
"\t.4byte _0804CE9C\n"
|
||||
"\t.4byte _0804CEB0\n"
|
||||
"\t.4byte _0804CED0\n"
|
||||
"_0804C7B0:\n"
|
||||
"\tldr r4, _0804C7E8 @ =gUnknown_2031DA8\n"
|
||||
"\tldr r0, _0804C7EC @ =0x000010f0\n"
|
||||
"\tbl AllocZeroed\n"
|
||||
"\tstr r0, [r4]\n"
|
||||
"\tbl sub_804C600\n"
|
||||
"\tldr r4, _0804C7F0 @ =gUnknown_2031C90\n"
|
||||
"\tmovs r0, 0xE0\n"
|
||||
"\tlsls r0, 4\n"
|
||||
"\tbl AllocZeroed\n"
|
||||
"\tstr r0, [r4]\n"
|
||||
"\tmovs r6, 0\n"
|
||||
"\tldr r2, _0804C7F4 @ =gUnknown_2031C94\n"
|
||||
"_0804C7CE:\n"
|
||||
"\tlsls r1, r6, 8\n"
|
||||
"\tldr r0, [r4]\n"
|
||||
"\tadds r0, r1\n"
|
||||
"\tstm r2!, {r0}\n"
|
||||
"\tadds r6, 0x1\n"
|
||||
"\tcmp r6, 0xD\n"
|
||||
"\tble _0804C7CE\n"
|
||||
"\tldr r1, _0804C7F8 @ =gMain\n"
|
||||
"\tmovs r3, 0x87\n"
|
||||
"\tlsls r3, 3\n"
|
||||
"\tadds r1, r3\n"
|
||||
"\tb _0804CEC2\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0804C7E8: .4byte gUnknown_2031DA8\n"
|
||||
"_0804C7EC: .4byte 0x000010f0\n"
|
||||
"_0804C7F0: .4byte gUnknown_2031C90\n"
|
||||
"_0804C7F4: .4byte gUnknown_2031C94\n"
|
||||
"_0804C7F8: .4byte gMain\n"
|
||||
"_0804C7FC:\n"
|
||||
"\tldr r2, _0804C864 @ =gPaletteFade\n"
|
||||
"\tldrb r1, [r2, 0x8]\n"
|
||||
"\tmovs r0, 0x7F\n"
|
||||
"\tands r0, r1\n"
|
||||
"\tstrb r0, [r2, 0x8]\n"
|
||||
"\tmovs r6, 0\n"
|
||||
"\tmovs r4, 0\n"
|
||||
"_0804C80A:\n"
|
||||
"\tmovs r0, 0x64\n"
|
||||
"\tmuls r0, r6\n"
|
||||
"\tldr r1, _0804C868 @ =gEnemyParty\n"
|
||||
"\tadds r0, r1\n"
|
||||
"\tstr r4, [sp]\n"
|
||||
"\tstr r4, [sp, 0x4]\n"
|
||||
"\tstr r4, [sp, 0x8]\n"
|
||||
"\tstr r4, [sp, 0xC]\n"
|
||||
"\tmovs r1, 0\n"
|
||||
"\tmovs r2, 0\n"
|
||||
"\tmovs r3, 0x20\n"
|
||||
"\tbl CreateMon\n"
|
||||
"\tadds r6, 0x1\n"
|
||||
"\tcmp r6, 0x5\n"
|
||||
"\tble _0804C80A\n"
|
||||
"\tmovs r0, 0\n"
|
||||
"\tbl sub_804F5BC\n"
|
||||
"\tmovs r0, 0\n"
|
||||
"\tbl ShowBg\n"
|
||||
"\tldr r0, _0804C86C @ =gReceivedRemoteLinkPlayers\n"
|
||||
"\tldrb r2, [r0]\n"
|
||||
"\tcmp r2, 0\n"
|
||||
"\tbne _0804C8B4\n"
|
||||
"\tldr r1, _0804C870 @ =gLinkType\n"
|
||||
"\tldr r5, _0804C874 @ =0x00001122\n"
|
||||
"\tadds r0, r5, 0\n"
|
||||
"\tstrh r0, [r1]\n"
|
||||
"\tldr r0, _0804C878 @ =gUnknown_2031DA8\n"
|
||||
"\tldr r0, [r0]\n"
|
||||
"\tadds r0, 0xA8\n"
|
||||
"\tstrb r2, [r0]\n"
|
||||
"\tldr r0, _0804C87C @ =gWirelessCommType\n"
|
||||
"\tldrb r0, [r0]\n"
|
||||
"\tcmp r0, 0\n"
|
||||
"\tbeq _0804C880\n"
|
||||
"\tbl sub_800B1F4\n"
|
||||
"\tbl OpenLink\n"
|
||||
"\tbl sub_80FBB20\n"
|
||||
"\tb _0804C892\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0804C864: .4byte gPaletteFade\n"
|
||||
"_0804C868: .4byte gEnemyParty\n"
|
||||
"_0804C86C: .4byte gReceivedRemoteLinkPlayers\n"
|
||||
"_0804C870: .4byte gLinkType\n"
|
||||
"_0804C874: .4byte 0x00001122\n"
|
||||
"_0804C878: .4byte gUnknown_2031DA8\n"
|
||||
"_0804C87C: .4byte gWirelessCommType\n"
|
||||
"_0804C880:\n"
|
||||
"\tbl OpenLink\n"
|
||||
"\tldr r1, _0804C8A8 @ =gMain\n"
|
||||
"\tmovs r7, 0x87\n"
|
||||
"\tlsls r7, 3\n"
|
||||
"\tadds r1, r7\n"
|
||||
"\tldrb r0, [r1]\n"
|
||||
"\tadds r0, 0x1\n"
|
||||
"\tstrb r0, [r1]\n"
|
||||
"_0804C892:\n"
|
||||
"\tldr r0, _0804C8AC @ =gWirelessCommType\n"
|
||||
"\tldrb r0, [r0]\n"
|
||||
"\tcmp r0, 0\n"
|
||||
"\tbeq _0804C89C\n"
|
||||
"\tb _0804CEE6\n"
|
||||
"_0804C89C:\n"
|
||||
"\tldr r0, _0804C8B0 @ =sub_8081A90\n"
|
||||
"\tmovs r1, 0x1\n"
|
||||
"\tbl CreateTask\n"
|
||||
"\tb _0804CEE6\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0804C8A8: .4byte gMain\n"
|
||||
"_0804C8AC: .4byte gWirelessCommType\n"
|
||||
"_0804C8B0: .4byte sub_8081A90\n"
|
||||
"_0804C8B4:\n"
|
||||
"\tldr r0, _0804C8C4 @ =gMain\n"
|
||||
"\tmovs r1, 0x87\n"
|
||||
"\tlsls r1, 3\n"
|
||||
"\tadds r0, r1\n"
|
||||
"\tmovs r1, 0x4\n"
|
||||
"\tstrb r1, [r0]\n"
|
||||
"\tb _0804CEE6\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0804C8C4: .4byte gMain\n"
|
||||
"_0804C8C8:\n"
|
||||
"\tldr r2, _0804C8F0 @ =gUnknown_2031DA8\n"
|
||||
"\tldr r1, [r2]\n"
|
||||
"\tadds r1, 0xA8\n"
|
||||
"\tldrb r0, [r1]\n"
|
||||
"\tadds r0, 0x1\n"
|
||||
"\tstrb r0, [r1]\n"
|
||||
"\tldr r0, [r2]\n"
|
||||
"\tadds r1, r0, 0\n"
|
||||
"\tadds r1, 0xA8\n"
|
||||
"\tldrb r0, [r1]\n"
|
||||
"\tcmp r0, 0xB\n"
|
||||
"\tbhi _0804C8E2\n"
|
||||
"\tb _0804CEE6\n"
|
||||
"_0804C8E2:\n"
|
||||
"\tmovs r0, 0\n"
|
||||
"\tstrb r0, [r1]\n"
|
||||
"\tmovs r2, 0x87\n"
|
||||
"\tlsls r2, 3\n"
|
||||
"\tadds r1, r3, r2\n"
|
||||
"\tb _0804CEC2\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0804C8F0: .4byte gUnknown_2031DA8\n"
|
||||
"_0804C8F4:\n"
|
||||
"\tbl GetLinkPlayerCount_2\n"
|
||||
"\tadds r4, r0, 0\n"
|
||||
"\tbl GetSavedPlayerCount\n"
|
||||
"\tlsls r4, 24\n"
|
||||
"\tlsls r0, 24\n"
|
||||
"\tcmp r4, r0\n"
|
||||
"\tbcs _0804C908\n"
|
||||
"\tb _0804CEE6\n"
|
||||
"_0804C908:\n"
|
||||
"\tbl IsLinkMaster\n"
|
||||
"\tlsls r0, 24\n"
|
||||
"\tcmp r0, 0\n"
|
||||
"\tbeq _0804C940\n"
|
||||
"\tldr r0, _0804C938 @ =gUnknown_2031DA8\n"
|
||||
"\tldr r1, [r0]\n"
|
||||
"\tadds r1, 0xA8\n"
|
||||
"\tldrb r0, [r1]\n"
|
||||
"\tadds r0, 0x1\n"
|
||||
"\tstrb r0, [r1]\n"
|
||||
"\tlsls r0, 24\n"
|
||||
"\tlsrs r0, 24\n"
|
||||
"\tcmp r0, 0x1E\n"
|
||||
"\tbhi _0804C928\n"
|
||||
"\tb _0804CEE6\n"
|
||||
"_0804C928:\n"
|
||||
"\tbl CheckShouldAdvanceLinkState\n"
|
||||
"\tldr r1, _0804C93C @ =gMain\n"
|
||||
"\tmovs r3, 0x87\n"
|
||||
"\tlsls r3, 3\n"
|
||||
"\tadds r1, r3\n"
|
||||
"\tb _0804CEC2\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0804C938: .4byte gUnknown_2031DA8\n"
|
||||
"_0804C93C: .4byte gMain\n"
|
||||
"_0804C940:\n"
|
||||
"\tldr r1, _0804C94C @ =gMain\n"
|
||||
"\tmovs r5, 0x87\n"
|
||||
"\tlsls r5, 3\n"
|
||||
"\tadds r1, r5\n"
|
||||
"\tb _0804CEC2\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0804C94C: .4byte gMain\n"
|
||||
"_0804C950:\n"
|
||||
"\tldr r0, _0804C9A0 @ =gReceivedRemoteLinkPlayers\n"
|
||||
"\tldrb r0, [r0]\n"
|
||||
"\tcmp r0, 0x1\n"
|
||||
"\tbeq _0804C95A\n"
|
||||
"\tb _0804CEE6\n"
|
||||
"_0804C95A:\n"
|
||||
"\tbl IsLinkPlayerDataExchangeComplete\n"
|
||||
"\tlsls r0, 24\n"
|
||||
"\tlsrs r0, 24\n"
|
||||
"\tcmp r0, 0x1\n"
|
||||
"\tbeq _0804C968\n"
|
||||
"\tb _0804CEE6\n"
|
||||
"_0804C968:\n"
|
||||
"\tbl sub_80FBB4C\n"
|
||||
"\tbl CalculatePlayerPartyCount\n"
|
||||
"\tldr r1, _0804C9A4 @ =gMain\n"
|
||||
"\tmovs r7, 0x87\n"
|
||||
"\tlsls r7, 3\n"
|
||||
"\tadds r1, r7\n"
|
||||
"\tldrb r0, [r1]\n"
|
||||
"\tadds r0, 0x1\n"
|
||||
"\tmovs r2, 0\n"
|
||||
"\tstrb r0, [r1]\n"
|
||||
"\tldr r0, _0804C9A8 @ =gUnknown_2031DA8\n"
|
||||
"\tldr r0, [r0]\n"
|
||||
"\tadds r0, 0xA8\n"
|
||||
"\tstrb r2, [r0]\n"
|
||||
"\tldr r0, _0804C9AC @ =gWirelessCommType\n"
|
||||
"\tldrb r0, [r0]\n"
|
||||
"\tcmp r0, 0\n"
|
||||
"\tbne _0804C992\n"
|
||||
"\tb _0804CEE6\n"
|
||||
"_0804C992:\n"
|
||||
"\tmovs r0, 0x1\n"
|
||||
"\tbl sub_80FA484\n"
|
||||
"\tbl sub_800AB9C\n"
|
||||
"\tb _0804CEE6\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0804C9A0: .4byte gReceivedRemoteLinkPlayers\n"
|
||||
"_0804C9A4: .4byte gMain\n"
|
||||
"_0804C9A8: .4byte gUnknown_2031DA8\n"
|
||||
"_0804C9AC: .4byte gWirelessCommType\n"
|
||||
"_0804C9B0:\n"
|
||||
"\tldr r0, _0804C9E0 @ =gWirelessCommType\n"
|
||||
"\tldrb r0, [r0]\n"
|
||||
"\tcmp r0, 0\n"
|
||||
"\tbeq _0804C9E8\n"
|
||||
"\tbl IsRfuTaskFinished\n"
|
||||
"\tlsls r0, 24\n"
|
||||
"\tcmp r0, 0\n"
|
||||
"\tbne _0804C9C4\n"
|
||||
"\tb _0804CEE6\n"
|
||||
"_0804C9C4:\n"
|
||||
"\tldr r1, _0804C9E4 @ =gMain\n"
|
||||
"\tmovs r0, 0x87\n"
|
||||
"\tlsls r0, 3\n"
|
||||
"\tadds r1, r0\n"
|
||||
"\tldrb r0, [r1]\n"
|
||||
"\tadds r0, 0x1\n"
|
||||
"\tstrb r0, [r1]\n"
|
||||
"\tbl LoadWirelessStatusIndicatorSpriteGfx\n"
|
||||
"\tmovs r0, 0\n"
|
||||
"\tmovs r1, 0\n"
|
||||
"\tbl CreateWirelessStatusIndicatorSprite\n"
|
||||
"\tb _0804CEE6\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0804C9E0: .4byte gWirelessCommType\n"
|
||||
"_0804C9E4: .4byte gMain\n"
|
||||
"_0804C9E8:\n"
|
||||
"\tmovs r2, 0x87\n"
|
||||
"\tlsls r2, 3\n"
|
||||
"\tadds r1, r3, r2\n"
|
||||
"\tb _0804CEC2\n"
|
||||
"_0804C9F0:\n"
|
||||
"\tbl shedinja_maker_maybe\n"
|
||||
"\tlsls r0, 24\n"
|
||||
"\tcmp r0, 0\n"
|
||||
"\tbne _0804C9FC\n"
|
||||
"\tb _0804CEE6\n"
|
||||
"_0804C9FC:\n"
|
||||
"\tbl sub_804F9D8\n"
|
||||
"\tldr r1, _0804CA0C @ =gMain\n"
|
||||
"\tmovs r3, 0x87\n"
|
||||
"\tlsls r3, 3\n"
|
||||
"\tadds r1, r3\n"
|
||||
"\tb _0804CEC2\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0804CA0C: .4byte gMain\n"
|
||||
"_0804CA10:\n"
|
||||
"\tbl CalculateEnemyPartyCount\n"
|
||||
"\tmovs r0, 0\n"
|
||||
"\tmovs r1, 0\n"
|
||||
"\tbl SetGpuReg\n"
|
||||
"\tmovs r0, 0x50\n"
|
||||
"\tmovs r1, 0\n"
|
||||
"\tbl SetGpuReg\n"
|
||||
"\tldr r2, _0804CB2C @ =gUnknown_2031DA8\n"
|
||||
"\tldr r0, [r2]\n"
|
||||
"\tldr r1, _0804CB30 @ =gPlayerPartyCount\n"
|
||||
"\tldrb r1, [r1]\n"
|
||||
"\tadds r0, 0x36\n"
|
||||
"\tstrb r1, [r0]\n"
|
||||
"\tldr r0, [r2]\n"
|
||||
"\tldr r1, _0804CB34 @ =gEnemyPartyCount\n"
|
||||
"\tldrb r1, [r1]\n"
|
||||
"\tadds r0, 0x37\n"
|
||||
"\tstrb r1, [r0]\n"
|
||||
"\tmovs r6, 0\n"
|
||||
"\tldr r0, [r2]\n"
|
||||
"\tadds r0, 0x36\n"
|
||||
"\tldrb r0, [r0]\n"
|
||||
"\tcmp r6, r0\n"
|
||||
"\tbge _0804CAA8\n"
|
||||
"\tmov r8, r2\n"
|
||||
"\tldr r7, _0804CB38 @ =gTradeMonSpriteCoords\n"
|
||||
"_0804CA4A:\n"
|
||||
"\tmovs r0, 0x64\n"
|
||||
"\tadds r4, r6, 0\n"
|
||||
"\tmuls r4, r0\n"
|
||||
"\tldr r0, _0804CB3C @ =gPlayerParty\n"
|
||||
"\tadds r4, r0\n"
|
||||
"\tadds r0, r4, 0\n"
|
||||
"\tmovs r1, 0x41\n"
|
||||
"\tbl GetMonData\n"
|
||||
"\tadds r5, r0, 0\n"
|
||||
"\tlsls r5, 16\n"
|
||||
"\tlsrs r5, 16\n"
|
||||
"\tadds r0, r4, 0\n"
|
||||
"\tmovs r1, 0\n"
|
||||
"\tbl GetMonData\n"
|
||||
"\tldrb r2, [r7]\n"
|
||||
"\tlsls r2, 19\n"
|
||||
"\tmovs r1, 0xE0\n"
|
||||
"\tlsls r1, 12\n"
|
||||
"\tadds r2, r1\n"
|
||||
"\tasrs r2, 16\n"
|
||||
"\tldrb r3, [r7, 0x1]\n"
|
||||
"\tlsls r3, 19\n"
|
||||
"\tldr r1, _0804CB40 @ =0xfff40000\n"
|
||||
"\tadds r3, r1\n"
|
||||
"\tasrs r3, 16\n"
|
||||
"\tmovs r1, 0x1\n"
|
||||
"\tstr r1, [sp]\n"
|
||||
"\tstr r0, [sp, 0x4]\n"
|
||||
"\tstr r1, [sp, 0x8]\n"
|
||||
"\tadds r0, r5, 0\n"
|
||||
"\tldr r1, _0804CB44 @ =sub_809718C\n"
|
||||
"\tbl CreateMonIcon\n"
|
||||
"\tmov r2, r8\n"
|
||||
"\tldr r1, [r2]\n"
|
||||
"\tadds r1, 0x28\n"
|
||||
"\tadds r1, r6\n"
|
||||
"\tstrb r0, [r1]\n"
|
||||
"\tadds r7, 0x2\n"
|
||||
"\tadds r6, 0x1\n"
|
||||
"\tldr r0, [r2]\n"
|
||||
"\tadds r0, 0x36\n"
|
||||
"\tldrb r0, [r0]\n"
|
||||
"\tcmp r6, r0\n"
|
||||
"\tblt _0804CA4A\n"
|
||||
"_0804CAA8:\n"
|
||||
"\tmovs r6, 0\n"
|
||||
"\tldr r1, _0804CB2C @ =gUnknown_2031DA8\n"
|
||||
"\tldr r0, [r1]\n"
|
||||
"\tadds r0, 0x37\n"
|
||||
"\tldrb r0, [r0]\n"
|
||||
"\tcmp r6, r0\n"
|
||||
"\tbge _0804CB20\n"
|
||||
"\tldr r0, _0804CB38 @ =gTradeMonSpriteCoords\n"
|
||||
"\tmov r8, r1\n"
|
||||
"\tadds r7, r0, 0\n"
|
||||
"\tadds r7, 0xC\n"
|
||||
"_0804CABE:\n"
|
||||
"\tmovs r0, 0x64\n"
|
||||
"\tadds r4, r6, 0\n"
|
||||
"\tmuls r4, r0\n"
|
||||
"\tldr r0, _0804CB48 @ =gEnemyParty\n"
|
||||
"\tadds r4, r0\n"
|
||||
"\tadds r0, r4, 0\n"
|
||||
"\tmovs r1, 0x41\n"
|
||||
"\tmovs r2, 0\n"
|
||||
"\tbl GetMonData\n"
|
||||
"\tadds r5, r0, 0\n"
|
||||
"\tlsls r5, 16\n"
|
||||
"\tlsrs r5, 16\n"
|
||||
"\tadds r0, r4, 0\n"
|
||||
"\tmovs r1, 0\n"
|
||||
"\tbl GetMonData\n"
|
||||
"\tldrb r2, [r7]\n"
|
||||
"\tlsls r2, 19\n"
|
||||
"\tmovs r3, 0xE0\n"
|
||||
"\tlsls r3, 12\n"
|
||||
"\tadds r2, r3\n"
|
||||
"\tasrs r2, 16\n"
|
||||
"\tldrb r3, [r7, 0x1]\n"
|
||||
"\tlsls r3, 19\n"
|
||||
"\tldr r1, _0804CB40 @ =0xfff40000\n"
|
||||
"\tadds r3, r1\n"
|
||||
"\tasrs r3, 16\n"
|
||||
"\tmovs r1, 0x1\n"
|
||||
"\tstr r1, [sp]\n"
|
||||
"\tstr r0, [sp, 0x4]\n"
|
||||
"\tmovs r0, 0\n"
|
||||
"\tstr r0, [sp, 0x8]\n"
|
||||
"\tadds r0, r5, 0\n"
|
||||
"\tldr r1, _0804CB44 @ =sub_809718C\n"
|
||||
"\tbl CreateMonIcon\n"
|
||||
"\tmov r2, r8\n"
|
||||
"\tldr r1, [r2]\n"
|
||||
"\tadds r1, 0x2E\n"
|
||||
"\tadds r1, r6\n"
|
||||
"\tstrb r0, [r1]\n"
|
||||
"\tadds r7, 0x2\n"
|
||||
"\tadds r6, 0x1\n"
|
||||
"\tldr r0, [r2]\n"
|
||||
"\tadds r0, 0x37\n"
|
||||
"\tldrb r0, [r0]\n"
|
||||
"\tcmp r6, r0\n"
|
||||
"\tblt _0804CABE\n"
|
||||
"_0804CB20:\n"
|
||||
"\tldr r1, _0804CB4C @ =gMain\n"
|
||||
"\tmovs r3, 0x87\n"
|
||||
"\tlsls r3, 3\n"
|
||||
"\tadds r1, r3\n"
|
||||
"\tb _0804CEC2\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0804CB2C: .4byte gUnknown_2031DA8\n"
|
||||
"_0804CB30: .4byte gPlayerPartyCount\n"
|
||||
"_0804CB34: .4byte gEnemyPartyCount\n"
|
||||
"_0804CB38: .4byte gTradeMonSpriteCoords\n"
|
||||
"_0804CB3C: .4byte gPlayerParty\n"
|
||||
"_0804CB40: .4byte 0xfff40000\n"
|
||||
"_0804CB44: .4byte sub_809718C\n"
|
||||
"_0804CB48: .4byte gEnemyParty\n"
|
||||
"_0804CB4C: .4byte gMain\n"
|
||||
"_0804CB50:\n"
|
||||
"\tbl LoadHeldItemIcons\n"
|
||||
"\tldr r0, _0804CB70 @ =gUnknown_2031DA8\n"
|
||||
"\tldr r1, [r0]\n"
|
||||
"\tadds r0, r1, 0\n"
|
||||
"\tadds r0, 0x36\n"
|
||||
"\tadds r1, 0x28\n"
|
||||
"\tmovs r2, 0\n"
|
||||
"\tbl sub_812256C\n"
|
||||
"\tldr r1, _0804CB74 @ =gMain\n"
|
||||
"\tmovs r5, 0x87\n"
|
||||
"\tlsls r5, 3\n"
|
||||
"\tadds r1, r5\n"
|
||||
"\tb _0804CEC2\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0804CB70: .4byte gUnknown_2031DA8\n"
|
||||
"_0804CB74: .4byte gMain\n"
|
||||
"_0804CB78:\n"
|
||||
"\tldr r0, _0804CB94 @ =gUnknown_2031DA8\n"
|
||||
"\tldr r1, [r0]\n"
|
||||
"\tadds r0, r1, 0\n"
|
||||
"\tadds r0, 0x36\n"
|
||||
"\tadds r1, 0x28\n"
|
||||
"\tmovs r2, 0x1\n"
|
||||
"\tbl sub_812256C\n"
|
||||
"\tldr r1, _0804CB98 @ =gMain\n"
|
||||
"\tmovs r7, 0x87\n"
|
||||
"\tlsls r7, 3\n"
|
||||
"\tadds r1, r7\n"
|
||||
"\tb _0804CEC2\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0804CB94: .4byte gUnknown_2031DA8\n"
|
||||
"_0804CB98: .4byte gMain\n"
|
||||
"_0804CB9C:\n"
|
||||
"\tldr r0, _0804CC14 @ =gSaveBlock2Ptr\n"
|
||||
"\tldr r0, [r0]\n"
|
||||
"\tldr r6, _0804CC18 @ =gUnknown_2031C94\n"
|
||||
"\tldr r1, [r6]\n"
|
||||
"\tldr r5, _0804CC1C @ =gDecompressionBuffer\n"
|
||||
"\tstr r5, [sp]\n"
|
||||
"\tmovs r4, 0x3\n"
|
||||
"\tstr r4, [sp, 0x4]\n"
|
||||
"\tmovs r2, 0\n"
|
||||
"\tmovs r3, 0\n"
|
||||
"\tbl sub_808BEB4\n"
|
||||
"\tbl GetMultiplayerId\n"
|
||||
"\tlsls r0, 24\n"
|
||||
"\tmovs r1, 0x80\n"
|
||||
"\tlsls r1, 17\n"
|
||||
"\teors r1, r0\n"
|
||||
"\tlsrs r1, 24\n"
|
||||
"\tlsls r0, r1, 3\n"
|
||||
"\tsubs r0, r1\n"
|
||||
"\tlsls r0, 2\n"
|
||||
"\tldr r1, _0804CC20 @ =gLinkPlayers + 8\n"
|
||||
"\tadds r0, r1\n"
|
||||
"\tldr r1, [r6, 0xC]\n"
|
||||
"\tstr r5, [sp]\n"
|
||||
"\tstr r4, [sp, 0x4]\n"
|
||||
"\tmovs r2, 0\n"
|
||||
"\tmovs r3, 0\n"
|
||||
"\tbl sub_808BEB4\n"
|
||||
"\tldr r4, _0804CC24 @ =gUnknown_8261ECC\n"
|
||||
"\tldr r0, [r4]\n"
|
||||
"\tldr r1, [r6, 0x18]\n"
|
||||
"\tstr r5, [sp]\n"
|
||||
"\tmovs r2, 0x2\n"
|
||||
"\tstr r2, [sp, 0x4]\n"
|
||||
"\tmovs r2, 0\n"
|
||||
"\tmovs r3, 0\n"
|
||||
"\tbl sub_808BEB4\n"
|
||||
"\tldr r0, [r4, 0x4]\n"
|
||||
"\tldr r1, [r6, 0x20]\n"
|
||||
"\tmovs r2, 0x18\n"
|
||||
"\tbl sub_804F728\n"
|
||||
"\tldr r1, _0804CC28 @ =gMain\n"
|
||||
"\tmovs r0, 0x87\n"
|
||||
"\tlsls r0, 3\n"
|
||||
"\tadds r1, r0\n"
|
||||
"\tldrb r0, [r1]\n"
|
||||
"\tadds r0, 0x1\n"
|
||||
"\tmovs r2, 0\n"
|
||||
"\tstrb r0, [r1]\n"
|
||||
"\tldr r0, _0804CC2C @ =gUnknown_2031DA8\n"
|
||||
"\tldr r0, [r0]\n"
|
||||
"\tadds r0, 0xA8\n"
|
||||
"\tstrb r2, [r0]\n"
|
||||
"\tb _0804CEE6\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0804CC14: .4byte gSaveBlock2Ptr\n"
|
||||
"_0804CC18: .4byte gUnknown_2031C94\n"
|
||||
"_0804CC1C: .4byte gDecompressionBuffer\n"
|
||||
"_0804CC20: .4byte gLinkPlayers + 8\n"
|
||||
"_0804CC24: .4byte gUnknown_8261ECC\n"
|
||||
"_0804CC28: .4byte gMain\n"
|
||||
"_0804CC2C: .4byte gUnknown_2031DA8\n"
|
||||
"_0804CC30:\n"
|
||||
"\tbl sub_804F610\n"
|
||||
"\tlsls r0, 24\n"
|
||||
"\tcmp r0, 0\n"
|
||||
"\tbne _0804CC3C\n"
|
||||
"\tb _0804CEE6\n"
|
||||
"_0804CC3C:\n"
|
||||
"\tb _0804CEBA\n"
|
||||
"_0804CC3E:\n"
|
||||
"\tldr r0, _0804CCFC @ =gSaveBlock2Ptr\n"
|
||||
"\tldr r1, [r0]\n"
|
||||
"\tmovs r0, 0x1\n"
|
||||
"\tmovs r2, 0\n"
|
||||
"\tbl GetStringWidth\n"
|
||||
"\tadds r1, r0, 0\n"
|
||||
"\tmovs r0, 0x38\n"
|
||||
"\tsubs r0, r1\n"
|
||||
"\tlsrs r1, r0, 31\n"
|
||||
"\tadds r0, r1\n"
|
||||
"\tmovs r6, 0\n"
|
||||
"\tadd r5, sp, 0x10\n"
|
||||
"\tldr r3, _0804CD00 @ =gTradeUnknownSpriteCoords\n"
|
||||
"\tmov r8, r3\n"
|
||||
"\tasrs r0, 1\n"
|
||||
"\tldrb r7, [r3, 0x4]\n"
|
||||
"\tadds r4, r0, r7\n"
|
||||
"_0804CC62:\n"
|
||||
"\tadd r1, sp, 0x10\n"
|
||||
"\tldr r0, _0804CD04 @ =gUnknown_8261CC8\n"
|
||||
"\tldm r0!, {r2,r3,r7}\n"
|
||||
"\tstm r1!, {r2,r3,r7}\n"
|
||||
"\tldm r0!, {r2,r3,r7}\n"
|
||||
"\tstm r1!, {r2,r3,r7}\n"
|
||||
"\tldrh r0, [r5]\n"
|
||||
"\tadds r0, r6\n"
|
||||
"\tstrh r0, [r5]\n"
|
||||
"\tlsls r1, r4, 16\n"
|
||||
"\tasrs r1, 16\n"
|
||||
"\tadd r0, sp, 0x10\n"
|
||||
"\tmov r3, r8\n"
|
||||
"\tldrb r2, [r3, 0x5]\n"
|
||||
"\tmovs r3, 0x1\n"
|
||||
"\tbl CreateSprite\n"
|
||||
"\tadds r4, 0x20\n"
|
||||
"\tadds r6, 0x1\n"
|
||||
"\tcmp r6, 0x2\n"
|
||||
"\tble _0804CC62\n"
|
||||
"\tbl GetMultiplayerId\n"
|
||||
"\tlsls r0, 24\n"
|
||||
"\tmovs r1, 0x80\n"
|
||||
"\tlsls r1, 17\n"
|
||||
"\teors r1, r0\n"
|
||||
"\tlsrs r1, 24\n"
|
||||
"\tlsls r0, r1, 3\n"
|
||||
"\tsubs r0, r1\n"
|
||||
"\tlsls r0, 2\n"
|
||||
"\tldr r1, _0804CD08 @ =gLinkPlayers + 8\n"
|
||||
"\tadds r1, r0, r1\n"
|
||||
"\tmovs r0, 0x1\n"
|
||||
"\tmovs r2, 0\n"
|
||||
"\tbl GetStringWidth\n"
|
||||
"\tadds r1, r0, 0\n"
|
||||
"\tmovs r0, 0x38\n"
|
||||
"\tsubs r0, r1\n"
|
||||
"\tlsrs r1, r0, 31\n"
|
||||
"\tadds r0, r1\n"
|
||||
"\tmovs r6, 0\n"
|
||||
"\tadd r5, sp, 0x10\n"
|
||||
"\tldr r7, _0804CD00 @ =gTradeUnknownSpriteCoords\n"
|
||||
"\tmov r8, r7\n"
|
||||
"\tasrs r0, 1\n"
|
||||
"\tmov r1, r8\n"
|
||||
"\tldrb r1, [r1, 0x6]\n"
|
||||
"\tadds r4, r0, r1\n"
|
||||
"_0804CCC6:\n"
|
||||
"\tadd r1, sp, 0x10\n"
|
||||
"\tldr r0, _0804CD04 @ =gUnknown_8261CC8\n"
|
||||
"\tldm r0!, {r2,r3,r7}\n"
|
||||
"\tstm r1!, {r2,r3,r7}\n"
|
||||
"\tldm r0!, {r2,r3,r7}\n"
|
||||
"\tstm r1!, {r2,r3,r7}\n"
|
||||
"\tadds r0, r6, 0x3\n"
|
||||
"\tldrh r1, [r5]\n"
|
||||
"\tadds r0, r1\n"
|
||||
"\tstrh r0, [r5]\n"
|
||||
"\tlsls r1, r4, 16\n"
|
||||
"\tasrs r1, 16\n"
|
||||
"\tadd r0, sp, 0x10\n"
|
||||
"\tmov r3, r8\n"
|
||||
"\tldrb r2, [r3, 0x7]\n"
|
||||
"\tmovs r3, 0x1\n"
|
||||
"\tbl CreateSprite\n"
|
||||
"\tadds r4, 0x20\n"
|
||||
"\tadds r6, 0x1\n"
|
||||
"\tcmp r6, 0x2\n"
|
||||
"\tble _0804CCC6\n"
|
||||
"\tldr r1, _0804CD0C @ =gMain\n"
|
||||
"\tmovs r5, 0x87\n"
|
||||
"\tlsls r5, 3\n"
|
||||
"\tadds r1, r5\n"
|
||||
"\tb _0804CEC2\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0804CCFC: .4byte gSaveBlock2Ptr\n"
|
||||
"_0804CD00: .4byte gTradeUnknownSpriteCoords\n"
|
||||
"_0804CD04: .4byte gUnknown_8261CC8\n"
|
||||
"_0804CD08: .4byte gLinkPlayers + 8\n"
|
||||
"_0804CD0C: .4byte gMain\n"
|
||||
"_0804CD10:\n"
|
||||
"\tldr r4, _0804CDCC @ =gUnknown_8261CC8\n"
|
||||
"\tadd r1, sp, 0x10\n"
|
||||
"\tadds r0, r4, 0\n"
|
||||
"\tldm r0!, {r2,r3,r7}\n"
|
||||
"\tstm r1!, {r2,r3,r7}\n"
|
||||
"\tldm r0!, {r2,r5,r7}\n"
|
||||
"\tstm r1!, {r2,r5,r7}\n"
|
||||
"\tadd r1, sp, 0x10\n"
|
||||
"\tadds r0, r1, 0\n"
|
||||
"\tldrh r0, [r0]\n"
|
||||
"\tadds r0, 0x6\n"
|
||||
"\tstrh r0, [r1]\n"
|
||||
"\tadds r0, r1, 0\n"
|
||||
"\tmovs r1, 0xD7\n"
|
||||
"\tmovs r2, 0x97\n"
|
||||
"\tmovs r3, 0x1\n"
|
||||
"\tbl CreateSprite\n"
|
||||
"\tadd r0, sp, 0x10\n"
|
||||
"\tldm r4!, {r3,r5,r7}\n"
|
||||
"\tstm r0!, {r3,r5,r7}\n"
|
||||
"\tldm r4!, {r1-r3}\n"
|
||||
"\tstm r0!, {r1-r3}\n"
|
||||
"\tadd r1, sp, 0x10\n"
|
||||
"\tadds r0, r1, 0\n"
|
||||
"\tldrh r0, [r0]\n"
|
||||
"\tadds r0, 0x7\n"
|
||||
"\tstrh r0, [r1]\n"
|
||||
"\tadds r0, r1, 0\n"
|
||||
"\tmovs r1, 0xF7\n"
|
||||
"\tmovs r2, 0x97\n"
|
||||
"\tmovs r3, 0x1\n"
|
||||
"\tbl CreateSprite\n"
|
||||
"\tmovs r6, 0\n"
|
||||
"\tadd r4, sp, 0x10\n"
|
||||
"\tmovs r5, 0xC0\n"
|
||||
"\tlsls r5, 13\n"
|
||||
"_0804CD5C:\n"
|
||||
"\tadd r1, sp, 0x10\n"
|
||||
"\tldr r0, _0804CDCC @ =gUnknown_8261CC8\n"
|
||||
"\tldm r0!, {r2,r3,r7}\n"
|
||||
"\tstm r1!, {r2,r3,r7}\n"
|
||||
"\tldm r0!, {r2,r3,r7}\n"
|
||||
"\tstm r1!, {r2,r3,r7}\n"
|
||||
"\tadds r0, r6, 0\n"
|
||||
"\tadds r0, 0x8\n"
|
||||
"\tldrh r7, [r4]\n"
|
||||
"\tadds r0, r7\n"
|
||||
"\tstrh r0, [r4]\n"
|
||||
"\tasrs r1, r5, 16\n"
|
||||
"\tadd r0, sp, 0x10\n"
|
||||
"\tmovs r2, 0x96\n"
|
||||
"\tmovs r3, 0x1\n"
|
||||
"\tbl CreateSprite\n"
|
||||
"\tmovs r0, 0x80\n"
|
||||
"\tlsls r0, 14\n"
|
||||
"\tadds r5, r0\n"
|
||||
"\tadds r6, 0x1\n"
|
||||
"\tcmp r6, 0x5\n"
|
||||
"\tble _0804CD5C\n"
|
||||
"\tldr r0, _0804CDD0 @ =gUnknown_8261CB0\n"
|
||||
"\tldr r2, _0804CDD4 @ =gTradeMonSpriteCoords\n"
|
||||
"\tldrb r1, [r2]\n"
|
||||
"\tlsls r1, 19\n"
|
||||
"\tmovs r3, 0x80\n"
|
||||
"\tlsls r3, 14\n"
|
||||
"\tadds r1, r3\n"
|
||||
"\tasrs r1, 16\n"
|
||||
"\tldrb r2, [r2, 0x1]\n"
|
||||
"\tlsls r2, 3\n"
|
||||
"\tmovs r3, 0x2\n"
|
||||
"\tbl CreateSprite\n"
|
||||
"\tldr r2, _0804CDD8 @ =gUnknown_2031DA8\n"
|
||||
"\tldr r1, [r2]\n"
|
||||
"\tadds r1, 0x34\n"
|
||||
"\tmovs r3, 0\n"
|
||||
"\tstrb r0, [r1]\n"
|
||||
"\tldr r0, [r2]\n"
|
||||
"\tadds r0, 0x35\n"
|
||||
"\tstrb r3, [r0]\n"
|
||||
"\tldr r1, _0804CDDC @ =gMain\n"
|
||||
"\tmovs r5, 0x87\n"
|
||||
"\tlsls r5, 3\n"
|
||||
"\tadds r1, r5\n"
|
||||
"\tldrb r0, [r1]\n"
|
||||
"\tadds r0, 0x1\n"
|
||||
"\tstrb r0, [r1]\n"
|
||||
"\tmovs r0, 0\n"
|
||||
"\tbl rbox_fill_rectangle\n"
|
||||
"\tb _0804CEE6\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0804CDCC: .4byte gUnknown_8261CC8\n"
|
||||
"_0804CDD0: .4byte gUnknown_8261CB0\n"
|
||||
"_0804CDD4: .4byte gTradeMonSpriteCoords\n"
|
||||
"_0804CDD8: .4byte gUnknown_2031DA8\n"
|
||||
"_0804CDDC: .4byte gMain\n"
|
||||
"_0804CDE0:\n"
|
||||
"\tmovs r0, 0\n"
|
||||
"\tbl sub_804F748\n"
|
||||
"\tmovs r0, 0\n"
|
||||
"\tbl sub_804F020\n"
|
||||
"\tldr r2, _0804CE14 @ =gUnknown_2031DA8\n"
|
||||
"\tldr r0, [r2]\n"
|
||||
"\tmovs r1, 0\n"
|
||||
"\tstrb r1, [r0]\n"
|
||||
"\tldr r0, [r2]\n"
|
||||
"\tstrb r1, [r0, 0x1]\n"
|
||||
"\tbl sub_804D764\n"
|
||||
"\tldr r1, _0804CE18 @ =gMain\n"
|
||||
"\tmovs r7, 0x87\n"
|
||||
"\tlsls r7, 3\n"
|
||||
"\tadds r1, r7\n"
|
||||
"\tldrb r0, [r1]\n"
|
||||
"\tadds r0, 0x1\n"
|
||||
"\tstrb r0, [r1]\n"
|
||||
"\tldr r0, _0804CE1C @ =0x00000111\n"
|
||||
"\tbl PlayBGM\n"
|
||||
"\tb _0804CEE6\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0804CE14: .4byte gUnknown_2031DA8\n"
|
||||
"_0804CE18: .4byte gMain\n"
|
||||
"_0804CE1C: .4byte 0x00000111\n"
|
||||
"_0804CE20:\n"
|
||||
"\tmovs r0, 0x1\n"
|
||||
"\tbl sub_804F748\n"
|
||||
"\tmovs r0, 0x1\n"
|
||||
"\tbl sub_804F020\n"
|
||||
"\tldr r1, _0804CE44 @ =gMain\n"
|
||||
"\tmovs r0, 0x87\n"
|
||||
"\tlsls r0, 3\n"
|
||||
"\tadds r1, r0\n"
|
||||
"\tldrb r0, [r1]\n"
|
||||
"\tadds r0, 0x1\n"
|
||||
"\tstrb r0, [r1]\n"
|
||||
"_0804CE3A:\n"
|
||||
"\tmovs r0, 0\n"
|
||||
"\tbl sub_804D694\n"
|
||||
"\tb _0804CEBA\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0804CE44: .4byte gMain\n"
|
||||
"_0804CE48:\n"
|
||||
"\tmovs r0, 0x1\n"
|
||||
"\tbl sub_804D694\n"
|
||||
"\tldr r1, _0804CE58 @ =gMain\n"
|
||||
"\tmovs r3, 0x87\n"
|
||||
"\tlsls r3, 3\n"
|
||||
"\tadds r1, r3\n"
|
||||
"\tb _0804CEC2\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0804CE58: .4byte gMain\n"
|
||||
"_0804CE5C:\n"
|
||||
"\tmovs r0, 0x1\n"
|
||||
"\tnegs r0, r0\n"
|
||||
"\tmovs r1, 0\n"
|
||||
"\tstr r1, [sp]\n"
|
||||
"\tmovs r2, 0x10\n"
|
||||
"\tmovs r3, 0\n"
|
||||
"\tbl BeginNormalPaletteFade\n"
|
||||
"\tldr r1, _0804CE78 @ =gMain\n"
|
||||
"\tmovs r5, 0x87\n"
|
||||
"\tlsls r5, 3\n"
|
||||
"\tadds r1, r5\n"
|
||||
"\tb _0804CEC2\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0804CE78: .4byte gMain\n"
|
||||
"_0804CE7C:\n"
|
||||
"\tmovs r1, 0x82\n"
|
||||
"\tlsls r1, 5\n"
|
||||
"\tmovs r0, 0\n"
|
||||
"\tbl SetGpuReg\n"
|
||||
"\tmovs r0, 0x2\n"
|
||||
"\tbl sub_804D694\n"
|
||||
"\tldr r1, _0804CE98 @ =gMain\n"
|
||||
"\tmovs r7, 0x87\n"
|
||||
"\tlsls r7, 3\n"
|
||||
"\tadds r1, r7\n"
|
||||
"\tb _0804CEC2\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0804CE98: .4byte gMain\n"
|
||||
"_0804CE9C:\n"
|
||||
"\tmovs r0, 0\n"
|
||||
"\tbl sub_804F890\n"
|
||||
"\tldr r1, _0804CEAC @ =gMain\n"
|
||||
"\tmovs r0, 0x87\n"
|
||||
"\tlsls r0, 3\n"
|
||||
"\tadds r1, r0\n"
|
||||
"\tb _0804CEC2\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0804CEAC: .4byte gMain\n"
|
||||
"_0804CEB0:\n"
|
||||
"\tmovs r0, 0x1\n"
|
||||
"\tbl sub_804F890\n"
|
||||
"\tbl sub_804F964\n"
|
||||
"_0804CEBA:\n"
|
||||
"\tldr r1, _0804CECC @ =gMain\n"
|
||||
"\tmovs r2, 0x87\n"
|
||||
"\tlsls r2, 3\n"
|
||||
"\tadds r1, r2\n"
|
||||
"_0804CEC2:\n"
|
||||
"\tldrb r0, [r1]\n"
|
||||
"\tadds r0, 0x1\n"
|
||||
"\tstrb r0, [r1]\n"
|
||||
"\tb _0804CEE6\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0804CECC: .4byte gMain\n"
|
||||
"_0804CED0:\n"
|
||||
"\tldr r0, _0804CF08 @ =gPaletteFade\n"
|
||||
"\tldrb r1, [r0, 0x7]\n"
|
||||
"\tmovs r0, 0x80\n"
|
||||
"\tands r0, r1\n"
|
||||
"\tcmp r0, 0\n"
|
||||
"\tbne _0804CEE6\n"
|
||||
"\tldr r0, _0804CF0C @ =sub_804DFF0\n"
|
||||
"\tstr r0, [r3]\n"
|
||||
"\tldr r0, _0804CF10 @ =sub_804D638\n"
|
||||
"\tbl SetMainCallback2\n"
|
||||
"_0804CEE6:\n"
|
||||
"\tbl RunTextPrinters\n"
|
||||
"\tbl RunTasks\n"
|
||||
"\tbl AnimateSprites\n"
|
||||
"\tbl BuildOamBuffer\n"
|
||||
"\tbl UpdatePaletteFade\n"
|
||||
"\tadd sp, 0x28\n"
|
||||
"\tpop {r3}\n"
|
||||
"\tmov r8, r3\n"
|
||||
"\tpop {r4-r7}\n"
|
||||
"\tpop {r0}\n"
|
||||
"\tbx r0\n"
|
||||
"\t.align 2, 0\n"
|
||||
"_0804CF08: .4byte gPaletteFade\n"
|
||||
"_0804CF0C: .4byte sub_804DFF0\n"
|
||||
"_0804CF10: .4byte sub_804D638");
|
||||
}
|
||||
#endif //NONMATCHING
|
||||
|
||||
+1
-1
@@ -1278,7 +1278,7 @@ void sub_815E720(void)
|
||||
|
||||
sub_815EC0C();
|
||||
windowId = AddWindow(gUnknown_847A218);
|
||||
sub_80F6E9C();
|
||||
LoadStdWindowFrameGfx();
|
||||
DrawStdWindowFrame(windowId, FALSE);
|
||||
AddTextPrinterParameterized(windowId, 2, gUnknown_83FE982, 0x4A, 0, 0xFF, NULL);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user