Merge branch 'master' into trade

This commit is contained in:
PikalaxALT
2019-10-14 10:41:27 -04:00
145 changed files with 17677 additions and 37125 deletions
+14 -14
View File
@@ -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
+313
View File
@@ -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);
}
+946
View File
@@ -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);
}
}
+2 -2
View File
@@ -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;
+495
View File
@@ -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
View File
@@ -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;
-116
View File
@@ -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)
{
+462
View File
@@ -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
View File
@@ -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 = &REG_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 = &REG_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 = &REG_BG1VOFS;
else
scanlineParams.dmaDest = &REG_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
View File
@@ -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
View File
@@ -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 = &REG_BG1HOFS;
task->data[2] = gBattle_BG1_X;
}
else
{
sp.dmaDest = &REG_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
View File
@@ -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);
+7 -7
View File
@@ -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
View File
File diff suppressed because it is too large Load Diff
+1484
View File
File diff suppressed because it is too large Load Diff
+724
View File
@@ -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 = &REG_BG1HOFS;
}
else
{
bgX = gBattle_BG2_X;
scanlineParams.dmaDest = &REG_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
View File
@@ -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
View File
@@ -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
View File
@@ -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)
+1 -1
View File
@@ -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
View File
@@ -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;
+1 -1
View File
@@ -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)
{
+9 -9
View File
@@ -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
View File
@@ -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
View File
@@ -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
-1
View File
@@ -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
View File
File diff suppressed because it is too large Load Diff
+369 -372
View File
File diff suppressed because it is too large Load Diff
+830
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -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
View File
@@ -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
View File
@@ -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);