summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle/anim/battle_intro.c7
-rw-r--r--src/battle/anim/flying.c291
-rw-r--r--src/battle/anim/ground.c704
-rw-r--r--src/battle/battle_2.c12
-rw-r--r--src/battle/battle_4.c4
-rw-r--r--src/battle/battle_anim.c8
-rw-r--r--src/battle/battle_anim_812C144.c479
-rw-r--r--src/battle/battle_controller_linkopponent.c4
-rw-r--r--src/battle/battle_controller_linkpartner.c4
-rw-r--r--src/battle/battle_controller_opponent.c4
-rw-r--r--src/battle/battle_controller_player.c12
-rw-r--r--src/battle/battle_controller_safari.c2
-rw-r--r--src/battle/battle_controller_wally.c2
-rw-r--r--src/battle/contest_link_80C2020.c1044
-rw-r--r--src/battle/reshow_battle_screen.c8
-rw-r--r--src/contest.c31
-rw-r--r--src/contest_ai.c4
-rw-r--r--src/debug/matsuda_debug_menu.c10
-rw-r--r--src/evolution_scene.c8
-rw-r--r--src/pokemon_size_record.c2
-rw-r--r--src/pokemon_summary_screen.c6
-rw-r--r--src/tv.c27
22 files changed, 2507 insertions, 166 deletions
diff --git a/src/battle/anim/battle_intro.c b/src/battle/anim/battle_intro.c
index d96dc7ea8..a189b1425 100644
--- a/src/battle/anim/battle_intro.c
+++ b/src/battle/anim/battle_intro.c
@@ -12,11 +12,6 @@
#include "trig.h"
extern u16 gBattleTypeFlags;
-extern u16 gBattle_BG1_X;
-extern u16 gBattle_BG1_Y;
-extern u16 gBattle_BG2_X;
-extern u16 gBattle_BG2_Y;
-extern u16 gBattle_WIN0V;
extern u16 gUnknown_02024DE8;
extern u8 gBattleMonForms[];
@@ -376,7 +371,7 @@ static void BattleIntroTask_ScrollAndFadeScenery(u8 taskId)
REG_BLDALPHA = gTasks[taskId].data[4];
}
-// Seems to only be used for link battles.
+// Seems to only be used for link battles.
static void BattleIntroTask_80E4C34(u8 taskId)
{
s32 i;
diff --git a/src/battle/anim/flying.c b/src/battle/anim/flying.c
index ec40e26c4..e8c50816c 100644
--- a/src/battle/anim/flying.c
+++ b/src/battle/anim/flying.c
@@ -1,17 +1,26 @@
#include "global.h"
-#include "rom_8077ABC.h"
+#include "battle.h"
#include "battle_anim.h"
+#include "palette.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
extern s16 gBattleAnimArgs[];
extern u8 gAnimBankAttacker;
extern u8 gAnimBankTarget;
+extern u8 gAnimVisualTaskCount;
+void sub_80785E4(struct Sprite *sprite);
void sub_80DA034(struct Sprite *sprite);
+void sub_80DA05C(struct Sprite *sprite);
void sub_80DA16C(struct Sprite *sprite);
+void sub_80DA1EC(struct Sprite *sprite);
void sub_80DA208(struct Sprite *sprite);
void sub_80DA300(struct Sprite *sprite);
+void sub_80DA348(struct Sprite *sprite);
void sub_80DA38C(struct Sprite *sprite);
void sub_80DA4D8(struct Sprite *sprite);
+void sub_80DA410(struct Sprite *sprite);
void sub_80DAD30(struct Sprite *sprite);
void sub_80DAD84(struct Sprite *sprite);
void sub_80DB000(struct Sprite *sprite);
@@ -23,6 +32,8 @@ void sub_80DB458(struct Sprite *sprite);
void sub_80DB564(struct Sprite *sprite);
void sub_80DB5E4(struct Sprite *sprite);
+void sub_80DA0DC(u8 taskId);
+
const struct SpriteTemplate gBattleAnimSpriteTemplate_83DA380 =
{
.tileTag = 10009,
@@ -344,3 +355,281 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_83DA65C =
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80DB5E4,
};
+
+void sub_80DA034(struct Sprite *sprite)
+{
+ sub_8078764(sprite, 0);
+ sprite->pos1.y += 20;
+ sprite->data[1] = 0xBF;
+ sprite->callback = sub_80DA05C;
+ sub_80DA05C(sprite);
+}
+
+void sub_80DA05C(struct Sprite *sprite)
+{
+ sprite->pos2.x = Sin(sprite->data[1], 0x20);
+ sprite->pos2.y = Cos(sprite->data[1], 0x8);
+ sprite->data[1] = (sprite->data[1] + 5) & 0xFF;
+ if(++sprite->data[0] == 0x47)
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void sub_80DA09C(u8 taskId)
+{
+ gTasks[taskId].data[0] = gBattleAnimArgs[1];
+ gTasks[taskId].data[1] = gBattleAnimArgs[0];
+ gTasks[taskId].data[2] = IndexOfSpritePaletteTag(0x2719);
+ gTasks[taskId].func = sub_80DA0DC;
+}
+
+#ifdef NONMATCHING
+void sub_80DA0DC(u8 taskId)
+{
+ gTasks[taskId].data[10]++;
+ if(gTasks[taskId].data[10] == gTasks[taskId].data[1])
+ {
+ u16 r0;
+ u16 r2;
+ s32 i;
+
+ gTasks[taskId].data[10] = 0;
+ r0 = gTasks[taskId].data[2];
+ r2 = gPlttBufferFaded[r0 * 8];
+ for(i = 0; i < 8; i++)
+ gPlttBufferFaded[r0 * 8 + i + 0x107] = gPlttBufferFaded[r0 * 8 + i + 0x107];
+ gTasks[taskId].data[2] = ((r0 + 0x101) * 2) + r2;
+ }
+ gTasks[taskId].data[0] = gTasks[taskId].data[0] * 32;
+ if(gTasks[taskId].data[0] == 0)
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+}
+#else
+NAKED
+void sub_80DA0DC(u8 taskId)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ ldr r2, _080DA15C @ =gTasks\n\
+ lsls r0, r5, 2\n\
+ adds r0, r5\n\
+ lsls r0, 3\n\
+ adds r3, r0, r2\n\
+ ldrh r0, [r3, 0x1C]\n\
+ adds r1, r0, 0x1\n\
+ strh r1, [r3, 0x1C]\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ movs r4, 0xA\n\
+ ldrsh r1, [r3, r4]\n\
+ adds r7, r2, 0\n\
+ cmp r0, r1\n\
+ bne _080DA13A\n\
+ movs r0, 0\n\
+ strh r0, [r3, 0x1C]\n\
+ ldrb r0, [r3, 0xC]\n\
+ ldr r2, _080DA160 @ =gPlttBufferFaded\n\
+ lsls r0, 4\n\
+ movs r3, 0x84\n\
+ lsls r3, 1\n\
+ adds r1, r0, r3\n\
+ lsls r1, 1\n\
+ adds r1, r2\n\
+ ldrh r6, [r1]\n\
+ movs r4, 0x7\n\
+ mov r12, r0\n\
+ ldr r0, _080DA164 @ =0x00000107\n\
+ add r0, r12\n\
+ lsls r0, 1\n\
+ adds r3, r0, r2\n\
+_080DA122:\n\
+ ldrh r0, [r3]\n\
+ strh r0, [r1]\n\
+ subs r3, 0x2\n\
+ subs r1, 0x2\n\
+ subs r4, 0x1\n\
+ cmp r4, 0\n\
+ bgt _080DA122\n\
+ ldr r0, _080DA168 @ =0x00000101\n\
+ add r0, r12\n\
+ lsls r0, 1\n\
+ adds r0, r2\n\
+ strh r6, [r0]\n\
+_080DA13A:\n\
+ lsls r0, r5, 2\n\
+ adds r0, r5\n\
+ lsls r0, 3\n\
+ adds r0, r7\n\
+ ldrh r1, [r0, 0x8]\n\
+ subs r1, 0x1\n\
+ strh r1, [r0, 0x8]\n\
+ lsls r1, 16\n\
+ cmp r1, 0\n\
+ bne _080DA154\n\
+ adds r0, r5, 0\n\
+ bl DestroyAnimVisualTask\n\
+_080DA154:\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080DA15C: .4byte gTasks\n\
+_080DA160: .4byte gPlttBufferFaded\n\
+_080DA164: .4byte 0x00000107\n\
+_080DA168: .4byte 0x00000101\n\
+ .syntax divided\n");
+}
+#endif
+
+void sub_80DA16C(struct Sprite *sprite)
+{
+ InitAnimSpritePos(sprite, 1);
+ if (GetBattlerSide(gAnimBankAttacker) != B_SIDE_PLAYER)
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2) + gBattleAnimArgs[2];
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3) + gBattleAnimArgs[3];
+ InitAnimSpriteTranslationDeltas(sprite);
+ sprite->callback = sub_80785E4;
+ StoreSpriteCallbackInData(sprite, sub_80DA1EC);
+}
+
+void sub_80DA1EC(struct Sprite *sprite)
+{
+ if (TranslateAnimSpriteByDeltas(sprite) != 0)
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void sub_80DA208(struct Sprite *sprite)
+{
+ if (GetBattlerSide(gAnimBankAttacker) != B_SIDE_PLAYER)
+ {
+ gBattleAnimArgs[0] = -gBattleAnimArgs[0];
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+ gBattleAnimArgs[3] = -gBattleAnimArgs[3];
+ }
+
+ if (IsContest())
+ {
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ gBattleAnimArgs[3] = -gBattleAnimArgs[3];
+ }
+
+ sprite->pos1.x = GetBattlerSpriteCoord(gAnimBankAttacker, 2);
+ sprite->pos1.y = GetBattlerSpriteCoord(gAnimBankAttacker, 3);
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[0] = gBattleAnimArgs[4];
+
+ if (gBattleAnimArgs[6] == 0)
+ {
+ sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2);
+ sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3);
+ }
+ else
+ {
+ SetAverageBattlerPositions(gAnimBankTarget, 1, &sprite->data[2], &sprite->data[4]);
+ }
+
+ sprite->data[2] = sprite->data[2] + gBattleAnimArgs[2];
+ sprite->data[4] = sprite->data[4] + gBattleAnimArgs[3];
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
+
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+ SeekSpriteAnim(sprite, gBattleAnimArgs[5]);
+}
+
+void sub_80DA300(struct Sprite *sprite)
+{
+ InitAnimSpritePos(sprite, 1);
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->callback = sub_80DA348;
+ gSprites[GetAnimBattlerSpriteId(0)].invisible = 1;
+}
+
+void sub_80DA348(struct Sprite *sprite)
+{
+ if (sprite->data[0] > 0)
+ {
+ sprite->data[0]--;
+ }
+ else
+ {
+ sprite->data[2] += sprite->data[1];
+ sprite->pos2.y -= (sprite->data[2] >> 8);
+ }
+
+ if (sprite->pos1.y + sprite->pos2.y < -32)
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void sub_80DA38C(struct Sprite *sprite)
+{
+ if (GetBattlerSide(gAnimBankAttacker) != B_SIDE_PLAYER)
+ {
+ sprite->pos1.x = 272;
+ sprite->pos1.y = -32;
+ StartSpriteAffineAnim(sprite, 1);
+ }
+ else
+ {
+ sprite->pos1.x = -32;
+ sprite->pos1.y = -32;
+ }
+
+ sprite->data[0] = gBattleAnimArgs[0];
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2);
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3);
+
+ InitAnimSpriteTranslationDeltas(sprite);
+ sprite->callback = sub_80DA410;
+}
+
+void sub_80DA410(struct Sprite *sprite)
+{
+ sprite->data[0] = 1;
+ TranslateAnimSpriteByDeltas(sprite);
+
+ if (((u16)sprite->data[3] >> 8) > 200)
+ {
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos2.x = 0;
+ sprite->data[3] &= 0xFF;
+ }
+
+ if ((u32)(sprite->pos1.x + sprite->pos2.x + 32) > 304 || sprite->pos1.y + sprite->pos2.y > 160)
+ {
+ gSprites[GetAnimBattlerSpriteId(0)].invisible = 0;
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void sub_80DA48C(struct Sprite *sprite)
+{
+ if (sprite->data[0]-- <= 0)
+ {
+ if (sprite->oam.affineMode & 1)
+ {
+ FreeOamMatrix(sprite->oam.matrixNum);
+ sprite->oam.affineMode = 0;
+ }
+
+ DestroySprite(sprite);
+ gAnimVisualTaskCount--;
+ }
+}
diff --git a/src/battle/anim/ground.c b/src/battle/anim/ground.c
index a523df20e..67b4c9c9c 100644
--- a/src/battle/anim/ground.c
+++ b/src/battle/anim/ground.c
@@ -1,64 +1,90 @@
#include "global.h"
-#include "rom_8077ABC.h"
+#include "battle.h"
#include "battle_anim.h"
+#include "scanline_effect.h"
+#include "random.h"
+#include "rom_8077ABC.h"
+#include "task.h"
+#include "trig.h"
extern s16 gBattleAnimArgs[];
extern u8 gAnimBankAttacker;
extern u8 gAnimBankTarget;
+extern u16 gBattle_BG1_X;
+extern u16 gBattle_BG1_Y;
+extern u16 gBattle_BG2_X;
+extern u16 gBattle_BG2_Y;
+extern u16 gBattle_BG3_X;
+extern u16 gBattle_BG3_Y;
+extern u16 gAnimMovePower;
+extern u8 gBankSpriteIds[];
-void sub_80E0F1C(struct Sprite *sprite);
-void sub_80E1004(struct Sprite *sprite);
-void sub_80E1078(struct Sprite *sprite);
-void sub_80E1078(struct Sprite *sprite);
-void sub_80E1108(struct Sprite *sprite);
-void sub_80E1728(struct Sprite *sprite);
-void sub_80E17CC(struct Sprite *sprite);
+static void AnimBonemerangProjectile(struct Sprite *sprite);
+static void AnimBonemerangProjectileStep(struct Sprite *sprite);
+static void AnimBonemerangProjectileEnd(struct Sprite *sprite);
+static void AnimBoneHitProjectile(struct Sprite *sprite);
+static void AnimDirtScatter(struct Sprite *sprite);
+static void AnimMudSportDirt(struct Sprite *sprite);
+static void AnimMudSportDirtRising(struct Sprite *sprite);
+static void AnimMudSportDirtFalling(struct Sprite *sprite);
+static void sub_80E1284(u8 taskId);
+static void sub_80E1668(u8, s16, s16);
+static void sub_80E143C(u8 taskId);
+static void sub_80E14DC(u8 taskId);
+static void sub_80E1560(u8 taskId);
+static void AnimFissureDirtPlumeParticle(struct Sprite *sprite);
+static void AnimFissureDirtPlumeParticleStep(struct Sprite *sprite);
+static void AnimDigDirtMound(struct Sprite *sprite);
+static void sub_80E1934(u8 taskId);
+static void sub_80E1A2C(u8 taskId);
+static void sub_80E1B10(struct Task *task);
+static void sub_80E1C58(u8 taskId);
-const union AffineAnimCmd gSpriteAffineAnim_83DB2A0[] =
+const union AffineAnimCmd gBonemerangSpriteAffineAnim[] =
{
AFFINEANIMCMD_FRAME(0x0, 0x0, 15, 1),
AFFINEANIMCMD_JUMP(0),
};
-const union AffineAnimCmd gSpriteAffineAnim_83DB2B0[] =
+const union AffineAnimCmd gBoneHitSpriteAffineAnim[] =
{
AFFINEANIMCMD_FRAME(0x0, 0x0, 20, 1),
AFFINEANIMCMD_JUMP(0),
};
-const union AffineAnimCmd *const gSpriteAffineAnimTable_83DB2C0[] =
+const union AffineAnimCmd *const gBonemerangSpriteAffineAnimTable[] =
{
- gSpriteAffineAnim_83DB2A0,
+ gBonemerangSpriteAffineAnim,
};
-const union AffineAnimCmd *const gSpriteAffineAnimTable_83DB2C4[] =
+const union AffineAnimCmd *const gBoneHitSpriteAffineAnimTable[] =
{
- gSpriteAffineAnim_83DB2B0,
+ gBoneHitSpriteAffineAnim,
};
-const struct SpriteTemplate gBattleAnimSpriteTemplate_83DB2C8 =
+const struct SpriteTemplate gBonemerangSpriteTemplate =
{
.tileTag = 10000,
.paletteTag = 10000,
.oam = &gOamData_837DF94,
.anims = gDummySpriteAnimTable,
.images = NULL,
- .affineAnims = gSpriteAffineAnimTable_83DB2C0,
- .callback = sub_80E0F1C,
+ .affineAnims = gBonemerangSpriteAffineAnimTable,
+ .callback = AnimBonemerangProjectile,
};
-const struct SpriteTemplate gBattleAnimSpriteTemplate_83DB2E0 =
+const struct SpriteTemplate gBoneHitSpriteTemplate =
{
.tileTag = 10000,
.paletteTag = 10000,
.oam = &gOamData_837DF94,
.anims = gDummySpriteAnimTable,
.images = NULL,
- .affineAnims = gSpriteAffineAnimTable_83DB2C4,
- .callback = sub_80E1004,
+ .affineAnims = gBoneHitSpriteAffineAnimTable,
+ .callback = AnimBoneHitProjectile,
};
-const struct SpriteTemplate gBattleAnimSpriteTemplate_83DB2F8 =
+const struct SpriteTemplate gSandAttackDirtSpriteTemplate =
{
.tileTag = 10074,
.paletteTag = 10074,
@@ -66,32 +92,32 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_83DB2F8 =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_80E1078,
+ .callback = AnimDirtScatter,
};
-const union AnimCmd gSpriteAnim_83DB310[] =
+const union AnimCmd gMudSlapDirtSpriteAnim[] =
{
ANIMCMD_FRAME(1, 1),
ANIMCMD_END,
};
-const union AnimCmd *const gSpriteAnimTable_83DB318[] =
+const union AnimCmd *const gMudSlapDirtSpriteAnimTable[] =
{
- gSpriteAnim_83DB310,
+ gMudSlapDirtSpriteAnim,
};
-const struct SpriteTemplate gBattleAnimSpriteTemplate_83DB31C =
+const struct SpriteTemplate gMudSlapDirtSpriteTemplate =
{
.tileTag = 10074,
.paletteTag = 10074,
.oam = &gOamData_837DF2C,
- .anims = gSpriteAnimTable_83DB318,
+ .anims = gMudSlapDirtSpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_80E1078,
+ .callback = AnimDirtScatter,
};
-const struct SpriteTemplate gBattleAnimSpriteTemplate_83DB334 =
+const struct SpriteTemplate gMudSportDirtSpriteTemplate =
{
.tileTag = 10074,
.paletteTag = 10074,
@@ -99,10 +125,10 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_83DB334 =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_80E1108,
+ .callback = AnimMudSportDirt,
};
-const struct SpriteTemplate gBattleAnimSpriteTemplate_83DB34C =
+const struct SpriteTemplate gDirtPlumeSpriteTemplate =
{
.tileTag = 10074,
.paletteTag = 10074,
@@ -110,10 +136,10 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_83DB34C =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_80E1728,
+ .callback = AnimFissureDirtPlumeParticle,
};
-const struct SpriteTemplate gBattleAnimSpriteTemplate_83DB364 =
+const struct SpriteTemplate gDigDirtMoundSpriteTemplate =
{
.tileTag = 10281,
.paletteTag = 10281,
@@ -121,5 +147,615 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_83DB364 =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_80E17CC,
+ .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(gAnimBankAttacker, 2);
+ sprite->pos1.y = GetBattlerSpriteCoord(gAnimBankAttacker, 3);
+ sprite->data[0] = 20;
+ sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2);
+ sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3);
+ sprite->data[5] = -40;
+ InitAnimSpriteTranslationOverDuration(sprite);
+ sprite->callback = AnimBonemerangProjectileStep;
+}
+
+static void AnimBonemerangProjectileStep(struct Sprite *sprite)
+{
+ if (TranslateAnimSpriteLinearAndSine(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(gAnimBankAttacker, 2);
+ sprite->data[4] = GetBattlerSpriteCoord(gAnimBankAttacker, 3);
+ sprite->data[5] = 40;
+ InitAnimSpriteTranslationOverDuration(sprite);
+ sprite->callback = AnimBonemerangProjectileEnd;
+ }
+}
+
+static void AnimBonemerangProjectileEnd(struct Sprite *sprite)
+{
+ if (TranslateAnimSpriteLinearAndSine(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)
+{
+ sub_8078764(sprite, 1);
+ if (GetBattlerSide(gAnimBankAttacker) != B_SIDE_PLAYER)
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2) + gBattleAnimArgs[2];
+ sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3) + gBattleAnimArgs[3];
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
+ StoreSpriteCallbackInData(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;
+
+ InitAnimSpritePos(sprite, 1);
+
+ targetXPos = sub_8077EE4(gAnimBankTarget, 2);
+ targetYPos = sub_8077EE4(gAnimBankTarget, 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 = StartTranslateAnimSpriteByDeltas;
+ StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
+}
+
+// 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(gAnimBankAttacker, 2) + gBattleAnimArgs[1];
+ sprite->pos1.y = GetBattlerSpriteCoord(gAnimBankAttacker, 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_80E1244(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ if (gBattleAnimArgs[0] == 0)
+ task->func = sub_80E1284;
+ else
+ task->func = sub_80E143C;
+
+ task->func(taskId);
+}
+
+static void sub_80E1284(u8 taskId)
+{
+ u8 var0;
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[10] = GetAnimBattlerSpriteId(0);
+ task->data[11] = GetBattlerPosition_permutated(gAnimBankAttacker);
+ 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 = sub_8077FC0(gAnimBankAttacker);
+ task->data[14] = var0 - 32;
+ task->data[15] = var0 + 32;
+ if (task->data[14] < 0)
+ task->data[14] = 0;
+
+ gSprites[task->data[10]].invisible = 1;
+ task->data[0]++;
+ break;
+ case 1:
+ sub_80E1668(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 = 1;
+ break;
+ }
+}
+
+static void sub_80E143C(u8 taskId)
+{
+ u8 spriteId = GetAnimBattlerSpriteId(0);
+ gSprites[spriteId].invisible = 1;
+ gSprites[spriteId].pos2.x = 0;
+ gSprites[spriteId].pos2.y = 0;
+
+ if (GetBattlerPosition_permutated(gAnimBankAttacker) == 1)
+ gBattle_BG1_Y = 0;
+ else
+ gBattle_BG2_Y = 0;
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_80E149C(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ if (gBattleAnimArgs[0] == 0)
+ task->func = sub_80E14DC;
+ else
+ task->func = sub_80E1560;
+
+ task->func(taskId);
+}
+
+static void sub_80E14DC(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[10] = GetAnimBattlerSpriteId(0);
+ gSprites[task->data[10]].invisible = 0;
+ 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_80E1560(u8 taskId)
+{
+ u8 var0;
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[10] = GetAnimBattlerSpriteId(0);
+ task->data[11] = GetBattlerPosition_permutated(gAnimBankAttacker);
+ if (task->data[11] == 1)
+ task->data[12] = gBattle_BG1_X;
+ else
+ task->data[12] = gBattle_BG2_X;
+
+ var0 = sub_8077FC0(gAnimBankAttacker);
+ task->data[14] = var0 - 32;
+ task->data[15] = var0 + 32;
+ task->data[0]++;
+ break;
+ case 1:
+ sub_80E1668(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_80E1668(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 = gAnimBankAttacker;
+ else
+ battler = gAnimBankTarget;
+
+ xOffset = 24;
+ if (gBattleAnimArgs[1] == 1)
+ {
+ xOffset *= -1;
+ gBattleAnimArgs[2] *= -1;
+ }
+
+ sprite->pos1.x = GetBattlerSpriteCoord(battler, 2) + xOffset;
+ sprite->pos1.y = sub_8077FC0(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];
+ InitAnimSpriteTranslationOverDuration(sprite);
+ sprite->callback = AnimFissureDirtPlumeParticleStep;
+}
+
+static void AnimFissureDirtPlumeParticleStep(struct Sprite *sprite)
+{
+ if (TranslateAnimSpriteLinearAndSine(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 = gAnimBankAttacker;
+ else
+ battler = gAnimBankTarget;
+
+ sprite->pos1.x = GetBattlerSpriteCoord(battler, 0) - 16 + (gBattleAnimArgs[1] * 32);
+ sprite->pos1.y = sub_8077FC0(battler) + 32;
+ sprite->oam.tileNum += gBattleAnimArgs[1] * 8;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->callback = WaitAnimForDuration;
+}
+
+void sub_80E1864(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_80E1934;
+ break;
+ case 4:
+ task->data[13] = 0;
+ for (i = 0; i < 4; i++)
+ {
+ if (IsAnimBankSpriteVisible(i))
+ {
+ task->data[task->data[13] + 9] = gBankSpriteIds[i];
+ task->data[13]++;
+ }
+ }
+ task->func = sub_80E1A2C;
+ break;
+ default:
+ task->data[9] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
+ if (task->data[9] == 0xFF)
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+ else
+ {
+ task->data[13] = 1;
+ task->func = sub_80E1A2C;
+ }
+
+ break;
+ }
+}
+
+static void sub_80E1934(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_80E1A2C(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_80E1B10(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_80E1B10(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_80E1B10(struct Task *task)
+{
+ u16 i;
+ u16 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 sub_80E1B88(u8 taskId)
+{
+ gBattleAnimArgs[15] = gAnimMovePower > 99;
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_80E1BB0(u8 taskId)
+{
+ struct Task *newTask;
+ u8 battler = (gBattleAnimArgs[0] & 1) ? gAnimBankTarget : gAnimBankAttacker;
+
+ if (gBattleAnimArgs[0] > 1)
+ battler ^= 2;
+
+ newTask = &gTasks[CreateTask(sub_80E1C58, 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_80E1C58(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];
+ }
+}
diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c
index 11ddd6b71..7b6004ce0 100644
--- a/src/battle/battle_2.c
+++ b/src/battle/battle_2.c
@@ -121,22 +121,10 @@ extern u16 gUnknown_02024DE8;
extern u8 gActionSelectionCursor[];
extern u8 gMoveSelectionCursor[];
extern u8 gUnknown_02038470[];
-extern u16 gBattle_BG3_X;
-extern u16 gBattle_BG1_Y;
-extern u16 gBattle_BG3_Y;
extern struct Window gUnknown_030041D0;
-extern u16 gBattle_WIN1H;
extern struct Window gUnknown_03004210;
-extern u16 gBattle_WIN1V;
extern struct Window gUnknown_03004250;
-extern u16 gBattle_WIN0V;
-extern u16 gBattle_BG2_Y;
extern u32 gUnknown_03004284;
-extern u16 gBattle_BG2_X;
-extern u16 gBattle_BG0_Y;
-extern u16 gBattle_BG0_X;
-extern u16 gBattle_BG1_X;
-extern u16 gBattle_WIN0H;
extern MainCallback gPreBattleCallback1;
extern void (*gBattleMainFunc)(void);
extern u8 gLeveledUpInBattle;
diff --git a/src/battle/battle_4.c b/src/battle/battle_4.c
index d1435d8ea..54cacd0cb 100644
--- a/src/battle/battle_4.c
+++ b/src/battle/battle_4.c
@@ -164,7 +164,6 @@ extern u16 gChosenMove; //last used move in battle
extern u8 gBankInMenu;
extern u8 gActionForBanks[4];
extern u16 gUnknown_02024C2C[4]; //last used moves 2, used by sketch
-extern u16 gBattle_BG3_X;
extern u16 gUnknown_02024C4C[4]; //last used moves by banks, another one
extern u8 gCurrentTurnActionNumber;
extern u16 gTrappingMoves[];
@@ -1991,7 +1990,7 @@ static void atk0B_healthbarupdate(void)
healthValue = currDmg;
else
healthValue = maxPossibleDmgValue;
-
+
EmitHealthBarUpdate(0, healthValue);
*/
@@ -5544,6 +5543,7 @@ static void atk23_getexp(void)
gBattleResources_statsBeforeLvlUp->spDef = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPDEF);
gActiveBattler = gBattleStruct->expGetterBank;
+
EmitExpBarUpdate(0, gBattleStruct->expGetterID, gBattleMoveDamage);
MarkBufferBankForExecution(gActiveBattler);
}
diff --git a/src/battle/battle_anim.c b/src/battle/battle_anim.c
index ebfe2401d..8b729d2ab 100644
--- a/src/battle/battle_anim.c
+++ b/src/battle/battle_anim.c
@@ -1311,14 +1311,6 @@ EWRAM_DATA u8 gAnimBankAttacker = 0;
EWRAM_DATA u8 gAnimBankTarget = 0;
EWRAM_DATA u16 gAnimSpeciesByBanks[4] = {0};
EWRAM_DATA u8 gUnknown_0202F7D2 = 0; // some global pan variable
-extern u16 gBattle_BG1_Y;
-extern u16 gBattle_WIN1H;
-extern u16 gBattle_WIN0V;
-extern u16 gBattle_WIN1V;
-extern u16 gBattle_BG2_Y;
-extern u16 gBattle_BG2_X;
-extern u16 gBattle_BG1_X;
-extern u16 gBattle_WIN0H;
u16 gSoundAnimFramesToWait;
s16 gBattleAnimArgs[ANIM_ARGS_COUNT];
diff --git a/src/battle/battle_anim_812C144.c b/src/battle/battle_anim_812C144.c
index cef1fb97c..eeb2c3514 100644
--- a/src/battle/battle_anim_812C144.c
+++ b/src/battle/battle_anim_812C144.c
@@ -36,10 +36,14 @@ extern const union AffineAnimCmd gUnknown_084024B0[];
extern const union AffineAnimCmd gUnknown_08402518[];
extern const union AffineAnimCmd gUnknown_08402540[];
extern const union AffineAnimCmd gUnknown_08402590[];
+extern const union AffineAnimCmd gUnknown_08402610[];
extern const u32 gUnknown_08D2AA98[];
extern const u32 gUnknown_08D2A9E0[];
extern const u16 gUnknown_08D2AA80[];
extern const s8 gUnknown_084025C0[];
+extern const s8 gUnknown_08402604[];
+extern const u8 gUnknown_08402608[];
+extern const struct SpriteTemplate gBattleAnimSpriteTemplate_84025EC;
extern u8 gBattleMonForms[];
extern u8 gBankSpriteIds[];
@@ -65,6 +69,12 @@ static void sub_812D06C(u8 taskId);
static void sub_812D254(struct Sprite *sprite);
static void sub_812D4EC(struct Sprite *sprite);
static void sub_812D5E8(struct Sprite *sprite);
+static void sub_812DFEC(struct Sprite *sprite);
+static void sub_812E09C(struct Sprite *sprite);
+static void sub_812E0F8(struct Sprite *sprite);
+static void sub_812E638(u8 taskId);
+static void sub_812E7F0(struct Sprite *sprite);
+static void sub_812E8B4(u8 taskId);
void sub_812C144(struct Sprite *sprite)
@@ -1362,3 +1372,472 @@ void sub_812DB84(u8 taskId)
break;
}
}
+
+void sub_812DEAC(struct Sprite *sprite)
+{
+ s16 var0;
+ u8 spriteId1;
+ u8 spriteId2;
+
+ var0 = Random();
+ var0 &= 0x3F;
+ if (var0 > 31)
+ var0 = 32 - var0;
+
+ sprite->pos1.x = GetBattlerSpriteCoord(gAnimBankAttacker, 0) + var0;
+ sprite->pos1.y = GetBattlerSpriteCoord(gAnimBankAttacker, 1) + 32;
+ sprite->data[1] = gBattleAnimArgs[0];
+ sprite->data[2] = gBattleAnimArgs[1];
+
+ spriteId1 = CreateSprite(&gBattleAnimSpriteTemplate_84025EC, sprite->pos1.x, sprite->pos1.y, sprite->subpriority + 1);
+ spriteId2 = CreateSprite(&gBattleAnimSpriteTemplate_84025EC, sprite->pos1.x, sprite->pos1.y, sprite->subpriority + 1);
+ StartSpriteAnim(&gSprites[spriteId1], 1);
+ StartSpriteAnim(&gSprites[spriteId2], 2);
+
+ gSprites[spriteId1].data[1] = gBattleAnimArgs[0];
+ gSprites[spriteId1].data[2] = gBattleAnimArgs[1];
+ gSprites[spriteId2].data[1] = gBattleAnimArgs[0];
+ gSprites[spriteId2].data[2] = gBattleAnimArgs[1];
+ gSprites[spriteId1].data[7] = -1;
+ gSprites[spriteId2].data[7] = -1;
+ gSprites[spriteId1].invisible = 1;
+ gSprites[spriteId2].invisible = 1;
+ gSprites[spriteId1].callback = sub_812E0F8;
+ gSprites[spriteId2].callback = sub_812E0F8;
+
+ sprite->data[6] = spriteId1;
+ sprite->data[7] = spriteId2;
+ sprite->callback = sub_812DFEC;
+}
+
+static void sub_812DFEC(struct Sprite *sprite)
+{
+ int var0;
+ s8 var1;
+
+ var0 = (u16)sprite->data[2] + (u16)sprite->data[3];
+ var1 = var0 >> 8;
+ sprite->pos2.y -= var1;
+ sprite->data[3] = var0 & 0xFF;
+ if (sprite->data[4] == 0 && sprite->pos2.y < -8)
+ {
+ gSprites[sprite->data[6]].invisible = 0;
+ sprite->data[4]++;
+ }
+
+ if (sprite->data[4] == 1 && sprite->pos2.y < -16)
+ {
+ gSprites[sprite->data[7]].invisible = 0;
+ sprite->data[4]++;
+ }
+
+ if (--sprite->data[1] == -1)
+ {
+ sprite->invisible = 1;
+ sprite->callback = sub_812E09C;
+ }
+}
+
+static void sub_812E09C(struct Sprite *sprite)
+{
+ if (gSprites[sprite->data[6]].callback == SpriteCallbackDummy
+ && gSprites[sprite->data[7]].callback == SpriteCallbackDummy)
+ {
+ DestroySprite(&gSprites[sprite->data[6]]);
+ DestroySprite(&gSprites[sprite->data[7]]);
+ DestroyAnimSprite(sprite);
+ }
+}
+
+static void sub_812E0F8(struct Sprite *sprite)
+{
+ u16 d2;
+ register u16 d3 asm("r1");
+ int var0;
+ s8 var1;
+
+ if (!sprite->invisible)
+ {
+ d2 = sprite->data[2];
+ d3 = sprite->data[3];
+ var0 = d2 + d3;
+ var1 = var0 >> 8;
+ sprite->pos2.y -= var1;
+ sprite->data[3] = var0 & 0xFF;
+ if (--sprite->data[1] == -1)
+ {
+ sprite->invisible = 1;
+ sprite->callback = SpriteCallbackDummy;
+ }
+ }
+}
+
+void sub_812E14C(u8 taskId)
+{
+ struct Struct_sub_8078914 subStruct;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ REG_BLDCNT = BLDCNT_TGT2_BD | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1
+ | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1;
+ REG_BLDALPHA = 0xD03;
+ REG_BG1CNT_BITFIELD.screenSize = 0;
+ REG_BG1CNT_BITFIELD.priority = 1;
+
+ if (!IsContest())
+ REG_BG1CNT_BITFIELD.charBaseBlock = 1;
+
+ sub_8078914(&subStruct);
+ DmaClear32(3, subStruct.field_4, 0x1000);
+ LZDecompressVram(gUnknown_08D2AA98, subStruct.field_4);
+ LZDecompressVram(gUnknown_08D2A9E0, subStruct.field_0);
+ LoadCompressedPalette(gUnknown_08D2AA80, subStruct.field_8 * 16, 32);
+
+ if (IsContest())
+ {
+ sub_80763FC(subStruct.field_8, (u16 *)subStruct.field_4, 0, 0);
+ gBattle_BG1_X = -56;
+ gBattle_BG1_Y = 0;
+ }
+ else
+ {
+ u8 position = GetBattlerPosition(gAnimBankTarget);
+ if (IsDoubleBattle() == TRUE)
+ {
+ if (position == B_POSITION_OPPONENT_LEFT)
+ gBattle_BG1_X = -155;
+ if (position == B_POSITION_OPPONENT_RIGHT)
+ gBattle_BG1_X = -115;
+ if (position == B_POSITION_PLAYER_LEFT)
+ gBattle_BG1_X = 14;
+ if (position == B_POSITION_PLAYER_RIGHT)
+ gBattle_BG1_X = -20;
+ }
+ else
+ {
+ if (position == B_POSITION_OPPONENT_LEFT)
+ gBattle_BG1_X = -135;
+ if (position == B_POSITION_PLAYER_LEFT)
+ gBattle_BG1_X = -10;
+ }
+
+ gBattle_BG1_Y = 0;
+ }
+
+ gTasks[taskId].data[10] = gBattle_BG1_X;
+ gTasks[taskId].data[11] = gBattle_BG1_Y;
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ gTasks[taskId].data[3] = 0;
+ if (GetBattlerSide(gAnimBankTarget) == B_SIDE_OPPONENT)
+ gBattle_BG1_X = gTasks[taskId].data[10] + gUnknown_08402604[gTasks[taskId].data[2]];
+ else
+ gBattle_BG1_X = gTasks[taskId].data[10] - gUnknown_08402604[gTasks[taskId].data[2]];
+
+ if (++gTasks[taskId].data[2] == 5)
+ gTasks[taskId].data[0] = 5;
+ else
+ gTasks[taskId].data[0]++;
+ break;
+ case 2:
+ if (--gTasks[taskId].data[1] <= 4)
+ gTasks[taskId].data[1] = 5;
+
+ REG_BLDALPHA = (gTasks[taskId].data[1] << 8) | 3;
+ if (gTasks[taskId].data[1] == 5)
+ gTasks[taskId].data[0]++;
+ break;
+ case 3:
+ if (++gTasks[taskId].data[3] > gUnknown_08402608[gTasks[taskId].data[2]])
+ gTasks[taskId].data[0]++;
+ break;
+ case 4:
+ if (++gTasks[taskId].data[1] > 13)
+ gTasks[taskId].data[1] = 13;
+
+ REG_BLDALPHA = (gTasks[taskId].data[1] << 8) | 3;
+ if (gTasks[taskId].data[1] == 13)
+ gTasks[taskId].data[0] = 1;
+ break;
+ case 5:
+ sub_8078914(&subStruct);
+ DmaClear32(3, subStruct.field_4, 0x800);
+
+ if (!IsContest())
+ REG_BG1CNT_BITFIELD.charBaseBlock = 0;
+
+ REG_BG1CNT_BITFIELD.priority = 1;
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+void sub_812E498(u8 taskId)
+{
+ if (gTasks[taskId].data[0] == 0)
+ {
+ sub_80798F4(&gTasks[taskId], GetAnimBattlerSpriteId(0), &gUnknown_08402610);
+ gTasks[taskId].data[0]++;
+ }
+ else
+ {
+ if (!sub_807992C(&gTasks[taskId]))
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+}
+
+void sub_812E4F0(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ InitAnimSpritePos(sprite, 0);
+ sprite->data[0]++;
+ }
+ else if (sprite->data[0]++ > 20)
+ {
+ sprite->data[1] += 160;
+ sprite->data[2] += 128;
+
+ if (GetBattlerSide(gAnimBankAttacker) != B_SIDE_PLAYER)
+ sprite->pos2.x = -(sprite->data[1] >> 8);
+ else
+ sprite->pos2.x = sprite->data[1] >> 8;
+
+ sprite->pos2.y += sprite->data[2] >> 8;
+ if (sprite->pos2.y > 64)
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void sub_812E568(u8 taskId)
+{
+ u8 side;
+ struct Task *task = &gTasks[taskId];
+
+ if (gBattleAnimArgs[1] == 0)
+ {
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+
+ if (gBattleAnimArgs[2] < 0)
+ gBattleAnimArgs[2] = 0;
+ if (gBattleAnimArgs[2] > 2)
+ gBattleAnimArgs[2] = 2;
+
+ task->data[0] = 0;
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = 8 - (2 * gBattleAnimArgs[2]);
+ task->data[4] = 0x100 + (gBattleAnimArgs[2] * 128);
+ task->data[5] = gBattleAnimArgs[2] + 2;
+ task->data[6] = gBattleAnimArgs[1] - 1;
+ task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
+
+ if (gBattleAnimArgs[0] == 0)
+ side = GetBattlerSide(gAnimBankAttacker);
+ else
+ side = GetBattlerSide(gAnimBankTarget);
+
+ if (side == B_SIDE_OPPONENT)
+ {
+ task->data[4] *= -1;
+ task->data[5] *= -1;
+ }
+
+ sub_8078E70(task->data[15], 0);
+ task->func = sub_812E638;
+}
+
+static void sub_812E638(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ gSprites[task->data[15]].pos2.x += task->data[5];
+ task->data[2] -= task->data[4];
+ obj_id_set_rotscale(task->data[15], 0x100, 0x100, task->data[2]);
+ sub_8078F9C(task->data[15]);
+ if (++task->data[1] >= task->data[3])
+ {
+ task->data[1] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 1:
+ gSprites[task->data[15]].pos2.x -= task->data[5];
+ task->data[2] += task->data[4];
+ obj_id_set_rotscale(task->data[15], 0x100, 0x100, task->data[2]);
+ sub_8078F9C(task->data[15]);
+ if (++task->data[1] >= task->data[3] * 2)
+ {
+ task->data[1] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 2:
+ gSprites[task->data[15]].pos2.x += task->data[5];
+ task->data[2] -= task->data[4];
+ obj_id_set_rotscale(task->data[15], 0x100, 0x100, task->data[2]);
+ sub_8078F9C(task->data[15]);
+ if (++task->data[1] >= task->data[3])
+ {
+ if (task->data[6])
+ {
+ task->data[6]--;
+ task->data[1] = 0;
+ task->data[0] = 0;
+ }
+ else
+ {
+ task->data[0]++;
+ }
+ }
+ break;
+ case 3:
+ sub_8078F40(task->data[15]);
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+void sub_812E7A0(struct Sprite *sprite)
+{
+ if (GetBattlerSide(gAnimBankAttacker) == B_SIDE_PLAYER)
+ {
+ sprite->pos1.x = 0;
+ sprite->pos1.y = gBattleAnimArgs[0];
+ }
+ else
+ {
+ sprite->pos1.x = 240;
+ sprite->pos1.y = gBattleAnimArgs[0] - 30;
+ }
+
+ sprite->data[2] = gBattleAnimArgs[2];
+ StartSpriteAnim(sprite, gBattleAnimArgs[1]);
+ sprite->callback = sub_812E7F0;
+}
+
+static void sub_812E7F0(struct Sprite *sprite)
+{
+ sprite->data[0] += 3;
+ if (GetBattlerSide(gAnimBankAttacker) == B_SIDE_PLAYER)
+ {
+ sprite->pos1.x += 5;
+ sprite->pos1.y -= 1;
+
+ if (sprite->pos1.x > 240)
+ DestroyAnimSprite(sprite);
+
+ sprite->pos2.y = Sin(sprite->data[0] & 0xFF, 16);
+ }
+ else
+ {
+ sprite->pos1.x -= 5;
+ sprite->pos1.y += 1;
+
+ if (sprite->pos1.x < 0)
+ DestroyAnimSprite(sprite);
+
+ sprite->pos2.y = Cos(sprite->data[0] & 0xFF, 16);
+ }
+}
+
+void sub_812E860(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ task->data[0] = 0;
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[12] = 0x20;
+ task->data[13] = 0x40;
+ task->data[14] = 0x800;
+ task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
+
+ sub_8078E70(task->data[15], 0);
+ task->func = sub_812E8B4;
+}
+
+static void sub_812E8B4(u8 taskId)
+{
+ int temp;
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[2] += 0x200;
+ if (task->data[2] >= task->data[14])
+ {
+ s16 diff = task->data[14] - task->data[2];
+ s16 div = diff / (task->data[14] * 2);
+ s16 mod = diff % (task->data[14] * 2);
+
+ if ((div & 1) == 0)
+ {
+ task->data[2] = task->data[14] - mod;
+ task->data[0] = 1;
+ }
+ else
+ {
+ task->data[2] = mod - task->data[14];
+ }
+ }
+ break;
+ case 1:
+ task->data[2] -= 0x200;
+ if (task->data[2] <= -task->data[14])
+ {
+ s16 diff = task->data[14] - task->data[2];
+ s16 div = diff / (task->data[14] * 2);
+ s16 mod = diff % (task->data[14] * 2);
+
+ if ((1 & div) == 0)
+ {
+ task->data[2] = mod - task->data[14];
+ task->data[0] = 0;
+ }
+ else
+ {
+ task->data[2] = task->data[14] - mod;
+ }
+ }
+ break;
+ case 2:
+ sub_8078F40(task->data[15]);
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+
+ obj_id_set_rotscale(task->data[15], 0x100, 0x100, task->data[2]);
+ sub_8078F9C(task->data[15]);
+ gSprites[task->data[15]].pos2.x = -(((temp = task->data[2]) >= 0 ? task->data[2] : temp + 63) >> 6);
+
+ if (++task->data[1] > 8)
+ {
+ if (task->data[12])
+ {
+ task->data[12]--;
+ task->data[14] -= task->data[13];
+ if (task->data[14] < 16)
+ task->data[14] = 16;
+ }
+ else
+ {
+ task->data[0] = 2;
+ }
+ }
+}
diff --git a/src/battle/battle_controller_linkopponent.c b/src/battle/battle_controller_linkopponent.c
index 62df190a5..a759822cd 100644
--- a/src/battle/battle_controller_linkopponent.c
+++ b/src/battle/battle_controller_linkopponent.c
@@ -48,8 +48,6 @@ extern u8 gUnknown_02024E68[];
extern struct SpriteTemplate gUnknown_02024E8C;
extern u8 gAnimMoveTurn;
extern struct Window gUnknown_03004210;
-extern u16 gBattle_BG0_Y;
-extern u16 gBattle_BG0_X;
extern u8 gUnknown_0300434C[];
extern u32 gBattleExecBuffer;
extern MainCallback gPreBattleCallback1;
@@ -1143,7 +1141,7 @@ void LinkOpponentHandlecmd3(void)
u8 *dst;
u8 i;
- MEMSET_ALT(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1],
+ MEMSET_ALT(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1],
gBattleBufferA[gActiveBattler][3 + i], gBattleBufferA[gActiveBattler][2], i, dst);
LinkOpponentBufferExecCompleted();
diff --git a/src/battle/battle_controller_linkpartner.c b/src/battle/battle_controller_linkpartner.c
index 12eb62a2b..16aef5791 100644
--- a/src/battle/battle_controller_linkpartner.c
+++ b/src/battle/battle_controller_linkpartner.c
@@ -48,8 +48,6 @@ extern u8 gAnimFriendship;
extern u16 gWeatherMoveAnim;
extern u8 gAnimMoveTurn;
extern struct Window gUnknown_03004210;
-extern u16 gBattle_BG0_Y;
-extern u16 gBattle_BG0_X;
extern MainCallback gPreBattleCallback1;
extern void (*gBattleBankFunc[])(void);
extern u8 gHealthboxIDs[];
@@ -1091,7 +1089,7 @@ void LinkPartnerHandlecmd3(void)
u8 *dst;
u8 i;
- MEMSET_ALT(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1],
+ MEMSET_ALT(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1],
gBattleBufferA[gActiveBattler][3 + i], gBattleBufferA[gActiveBattler][2], i, dst);
LinkPartnerBufferExecCompleted();
diff --git a/src/battle/battle_controller_opponent.c b/src/battle/battle_controller_opponent.c
index f6e7f92a7..d8760e21f 100644
--- a/src/battle/battle_controller_opponent.c
+++ b/src/battle/battle_controller_opponent.c
@@ -52,8 +52,6 @@ extern u8 gAnimMoveTurn;
extern u8 gAnimScriptActive;
extern void (*gAnimScriptCallback)(void);
extern struct Window gUnknown_03004210;
-extern u16 gBattle_BG0_Y;
-extern u16 gBattle_BG0_X;
extern u8 gDisplayedStringBattle[];
extern u8 gBankTarget;
extern u8 gAbsentBattlerFlags;
@@ -1115,7 +1113,7 @@ void OpponentHandlecmd3(void)
u8 *dst;
u8 i;
- MEMSET_ALT(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][3 + i],
+ MEMSET_ALT(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][3 + i],
gBattleBufferA[gActiveBattler][2], i, dst);
OpponentBufferExecCompleted();
}
diff --git a/src/battle/battle_controller_player.c b/src/battle/battle_controller_player.c
index d1dcf8bf4..a83946554 100644
--- a/src/battle/battle_controller_player.c
+++ b/src/battle/battle_controller_player.c
@@ -35,9 +35,6 @@ struct MovePpInfo
#define SUB_803037C_TILE_DATA_OFFSET 444
#endif
-extern u16 gBattle_BG0_X;
-extern u16 gBattle_BG0_Y;
-
extern struct Window gUnknown_03004210;
extern void (*gBattleBankFunc[])(void);
@@ -71,13 +68,6 @@ extern u8 gUnknown_02024E68[];
extern struct SpriteTemplate gUnknown_02024E8C;
extern u8 gAnimMoveTurn;
extern u8 gUnknown_02038470[];
-extern u16 gBattle_BG3_X;
-extern u16 gBattle_BG1_Y;
-extern u16 gBattle_BG3_Y;
-extern u16 gBattle_BG2_Y;
-extern u16 gBattle_BG2_X;
-extern u16 gBattle_BG0_X;
-extern u16 gBattle_BG1_X;
extern u8 gUnknown_03004344;
extern u8 gUnknown_0300434C[];
@@ -151,8 +141,6 @@ extern u8 gAbsentBattlerFlags;
extern u8 gUnknown_03004344;
extern u8 gBattlersCount;
extern u16 gBattlerPartyIndexes[];
-extern u16 gBattle_BG0_Y;
-extern u16 gBattle_BG0_X;
extern struct Window gUnknown_03004210;
extern const u8 BattleText_SwitchWhich[];
extern u8 gUnknown_03004348;
diff --git a/src/battle/battle_controller_safari.c b/src/battle/battle_controller_safari.c
index 6bc56c19b..72054ee6b 100644
--- a/src/battle/battle_controller_safari.c
+++ b/src/battle/battle_controller_safari.c
@@ -24,8 +24,6 @@ extern u8 gActiveBattler;
extern const u8 BattleText_MenuOptionsSafari[];
extern void *gBattleBankFunc[];
-extern u16 gBattle_BG0_Y;
-extern u16 gBattle_BG0_X;
extern u8 gBattleBufferA[][0x200];
extern bool8 gDoingBattleAnim;
extern u8 gBankSpriteIds[];
diff --git a/src/battle/battle_controller_wally.c b/src/battle/battle_controller_wally.c
index 3f88d4c72..ed4eadee6 100644
--- a/src/battle/battle_controller_wally.c
+++ b/src/battle/battle_controller_wally.c
@@ -53,8 +53,6 @@ extern u8 gUnknown_02024E68[];
extern struct SpriteTemplate gUnknown_02024E8C;
extern u8 gAnimMoveTurn;
extern struct Window gUnknown_03004210;
-extern u16 gBattle_BG0_Y;
-extern u16 gBattle_BG0_X;
extern u8 gUnknown_0300434C[];
extern const u8 BattleText_WallyMenu[];
extern const u8 BattleText_MenuOptions[];
diff --git a/src/battle/contest_link_80C2020.c b/src/battle/contest_link_80C2020.c
new file mode 100644
index 000000000..10702b142
--- /dev/null
+++ b/src/battle/contest_link_80C2020.c
@@ -0,0 +1,1044 @@
+#include "global.h"
+#include "data2.h"
+#include "util.h"
+#include "overworld.h"
+#include "constants/songs.h"
+#include "ewram.h"
+#include "main.h"
+#include "scanline_effect.h"
+#include "decompress.h"
+#include "palette.h"
+#include "blend_palette.h"
+#include "graphics.h"
+#include "strings2.h"
+#include "text.h"
+#include "string_util.h"
+#include "menu.h"
+#include "sound.h"
+#include "pokedex.h"
+#include "pokemon_icon.h"
+#include "tv.h"
+#include "battle.h"
+#include "contest.h"
+#include "link.h"
+#include "field_effect.h"
+#include "field_specials.h"
+#include "contest_link_80C857C.h"
+#include "contest_link_80C2020.h"
+
+#define ABS(x) ((x) < 0 ? -(x) : (x))
+
+#define GET_CONTEST_WINNER(var) { \
+ for ((var) = 0; (var) < 4; (var)++) \
+ { \
+ if (gContestFinalStandings[i] == 0) \
+ break; \
+ } \
+}
+
+struct UnkEwramStruct18000 {
+ u8 unk_00;
+ u8 filler_01[1];
+ u8 unk_02;
+ u8 unk_03;
+ u8 unk_04;
+ u8 unk_05;
+ u8 unk_06;
+ u8 filler_07[1];
+ u8 unk_08;
+ u8 unk_09;
+ u8 unk_0a;
+ u8 filler_0b[9];
+ u8 unk_14;
+};
+
+struct UnkEwramStruct18018 {
+ u8 filler_00[0x50];
+};
+
+#define eContestLink80C2020Struct2018000 (*(struct UnkEwramStruct18000 *)(gSharedMem + 0x18000))
+#define eContestLink80C2020Struct2018018 (*(struct UnkEwramStruct18018 *)(gSharedMem + 0x18018))
+#define eContestLink80C2020Struct2018068 (gSharedMem + 0x18068)
+
+static void sub_80C2430(void);
+static void sub_80C2448(void);
+static void sub_80C24F4(u8 taskId);
+static void sub_80C255C(u8 taskId);
+static void sub_80C25A4(u8 taskId);
+static void sub_80C25C0(u8 taskId);
+static void sub_80C2600(u8 taskId);
+static void sub_80C26E4(u8 taskId);
+static void sub_80C2770(u8 taskId);
+static void sub_80C27EC(u8 taskId);
+static void sub_80C2878(u8 taskId);
+static void sub_80C2A8C(u8 taskId);
+static void sub_80C2D1C(u8 taskId);
+static void sub_80C2D80(u8 taskId);
+static void sub_80C2DD8(u8 taskId);
+static void sub_80C2E14(u8 taskId);
+static void sub_80C2EA0(u8 taskId);
+static void sub_80C2F28(u8 taskId);
+static void sub_80C2F64(u8 taskId);
+static void LoadAllContestMonIcons(u8 srcOffset, bool8 useDmaNow);
+void sub_80C310C(void);
+void sub_80C3158(const u8 *string, u8 spriteId);
+void sub_80C33DC(void);
+u16 sub_80C34AC(const u8 *string);
+void sub_80C34CC(s16 data4, s16 pos0y, u16 data5, s16 data6);
+void sub_80C3520(u16 a0);
+void sub_80C3698(const u8 *string);
+void sub_80C3764(void);
+void sub_80C37E4(void);
+u8 sub_80C3990(u8 a0, u8 a1);
+s8 sub_80C39E4(u8 a0, u8 a1);
+void sub_80C3A5C(u8 taskId);
+void sub_80C3B30(u8 taskId);
+void sub_80C3C44(struct Sprite *sprite);
+void sub_80C3CB8(struct Sprite *sprite);
+void sub_80C3D04(u8 taskId);
+void sub_80C3DF0(struct Sprite *sprite);
+void sub_80C3E60(u8 a0, u8 a1);
+void sub_80C3F00(void);
+void sub_80C40D4(u8 a0, u8 a1);
+
+const u16 gUnknown_083D1624[] = INCBIN_U16("graphics/unknown/unknown_3D1624/0.4bpp");
+const u16 gUnknown_083D1644[] = INCBIN_U16("graphics/unknown/unknown_3D1624/1.4bpp");
+const u16 gUnknown_083D1664[] = INCBIN_U16("graphics/unknown/unknown_3D1624/2.4bpp");
+const u16 gUnknown_083D1684[] = INCBIN_U16("graphics/unknown/unknown_3D1624/3.4bpp");
+const u16 gUnknown_083D16A4[] = INCBIN_U16("graphics/unknown/unknown_3D1624/4.4bpp");
+const u16 gUnknown_083D16C4[] = INCBIN_U16("graphics/unknown/unknown_3D1624/5.4bpp");
+const u16 gUnknown_083D16E4[] = INCBIN_U16("graphics/unknown/unknown_3D1624/6.4bpp");
+const u16 gUnknown_083D1704[] = INCBIN_U16("graphics/unknown/unknown_3D1624/7.4bpp");
+const u16 gMiscBlank_Pal[] = INCBIN_U16("graphics/interface/blank.gbapal");
+
+const struct OamData gOamData_83D1744 = {
+ .shape = ST_OAM_H_RECTANGLE,
+ .size = 3,
+ .priority = 3,
+ .paletteNum = 2
+};
+
+const struct SpriteTemplate gSpriteTemplate_83D174C = {
+ 0xbc1,
+ 0xbc1,
+ &gOamData_83D1744,
+ gDummySpriteAnimTable,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ SpriteCallbackDummy
+};
+
+const struct SpriteSheet gUnknown_083D1764[] = {
+ {gMiscBlank_Gfx, 0x400, 0xbc1},
+ {gMiscBlank_Gfx, 0x400, 0xbc2},
+ {gMiscBlank_Gfx, 0x400, 0xbc3},
+ {gMiscBlank_Gfx, 0x400, 0xbc4},
+ {gMiscBlank_Gfx, 0x400, 0xbc5},
+ {gMiscBlank_Gfx, 0x400, 0xbc6},
+ {gMiscBlank_Gfx, 0x400, 0xbc7},
+ {gMiscBlank_Gfx, 0x400, 0xbc8},
+};
+
+const struct SpritePalette gUnknown_083D17A4 = {
+ gMiscBlank_Pal, 0xbc1
+};
+
+const struct OamData gOamData_83D17AC = {};
+
+const struct SpriteTemplate gSpriteTemplate_83D17B4 = {
+ 0xbc9,
+ 0xbc9,
+ &gOamData_83D17AC,
+ gDummySpriteAnimTable,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ sub_80C3DF0
+};
+
+const struct CompressedSpriteSheet gUnknown_083D17CC = {gContestConfetti_Gfx, 0x220, 0xbc9};
+
+const struct CompressedSpritePalette gUnknown_083D17D4 = {gContestConfetti_Pal, 0xbc9};
+
+const u8 gUnknown_083D17DC[] = _("{COLOR RED}");
+const u8 gUnknown_083D17E0[] = _("/");
+const u8 gUnknown_083D17E2[] = _("{SIZE 3}{COLOR_HIGHLIGHT_SHADOW WHITE2 DARK_GREY LIGHT_BLUE}");
+
+void sub_80C2020(void)
+{
+ REG_DISPCNT = DISPCNT_OBJ_1D_MAP;
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6FA0);
+ Text_InitWindowWithTemplate(&gMenuWindow, &gWindowTemplate_81E6FA0);
+ REG_BG0CNT = BGCNT_WRAP | BGCNT_SCREENBASE(30);
+ REG_BG1CNT = BGCNT_PRIORITY(3) | BGCNT_SCREENBASE(24);
+ REG_BG2CNT = BGCNT_PRIORITY(3) | BGCNT_SCREENBASE(28);
+ REG_BG3CNT = BGCNT_WRAP | BGCNT_PRIORITY(3) | BGCNT_SCREENBASE(26);
+ REG_MOSAIC = 0;
+ REG_WININ = 0x3f3f;
+ REG_WINOUT = 0x3f2e;
+ REG_WIN0H = 0;
+ REG_WIN0V = 0;
+ REG_WIN1H = 0;
+ REG_WIN1V = 0;
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ REG_BLDY = 0;
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG2HOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG3HOFS = 0;
+ REG_BG3VOFS = 0;
+ REG_DISPCNT |= DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON | DISPCNT_WIN1_ON;
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ gBattle_BG2_X = 0;
+ gBattle_BG2_Y = 0;
+ gBattle_BG3_X = 0;
+ gBattle_BG3_Y = 0;
+ gBattle_WIN0H = 0;
+ gBattle_WIN0V = 0;
+ gBattle_WIN1H = 0;
+ gBattle_WIN1V = 0;
+}
+
+void sub_80C2144(void)
+{
+ int i;
+ int j;
+ s8 r7;
+ s8 r4;
+ u16 r6;
+ u16 r3;
+
+ DmaFill32Large(3, 0, VRAM, VRAM_SIZE, 0x1000);
+ LZDecompressVram(gUnknown_08D1977C, BG_SCREEN_ADDR(0));
+ LZDecompressVram(gUnknown_08D1A490, BG_SCREEN_ADDR(26));
+ LZDecompressVram(gUnknown_08D1A364, BG_SCREEN_ADDR(28));
+ LZDecompressVram(gUnknown_08D1A250, BG_SCREEN_ADDR(30));
+ sub_80C37E4();
+ LoadCompressedPalette(gUnknown_08D1A618, 0, 0x200);
+ LoadFontDefaultPalette(&gWindowTemplate_81E6FA0);
+ for (i = 0; i < 4; i++)
+ {
+ r7 = sub_80C3990(i, 1);
+ r4 = sub_80C39E4(i, 1);
+ for (j = 0; j < 10; j++)
+ {
+ r6 = 0x60b2;
+ if (j < r7)
+ r6 = 0x60b4;
+ if (j < ABS(r4))
+ {
+ r3 = 0x60a4;
+ if (r4 < 0)
+ r3 = 0x60a6;
+ }
+ else
+ r3 = 0x60a2;
+ ((u16 *)BG_VRAM)[i * 0x60 + j + 0x60b3] = r6;
+ ((u16 *)BG_VRAM)[i * 0x60 + j + 0x60d3] = r3;
+ }
+ }
+}
+
+void sub_80C226C(u8 a0)
+{
+ u8 *strbuf;
+
+ if (a0 == gContestPlayerMonIndex)
+ strbuf = StringCopy(gDisplayedStringBattle, gUnknown_083D17DC);
+ else
+ strbuf = gDisplayedStringBattle;
+ strbuf[0] = EXT_CTRL_CODE_BEGIN;
+ strbuf[1] = 0x06;
+ strbuf[2] = 0x04;
+ strbuf += 3;
+ strbuf = StringCopy(strbuf, gContestMons[a0].nickname);
+ strbuf[0] = EXT_CTRL_CODE_BEGIN;
+ strbuf[1] = 0x13;
+ strbuf[2] = 0x32;
+ strbuf += 3;
+ strbuf = StringCopy(strbuf, gUnknown_083D17E0);
+ if (gIsLinkContest & 1)
+ StringCopy(strbuf, gLinkPlayers[a0].name);
+ else
+ StringCopy(strbuf, gContestMons[a0].trainerName);
+ Text_InitWindowAndPrintText(&gMenuWindow, gDisplayedStringBattle, a0 * 36 + 770, 7, a0 * 3 + 4);
+}
+
+void sub_80C2340(void)
+{
+ int i;
+
+ for (i = 0; i < 4; i++)
+ sub_80C226C(i);
+}
+
+void sub_80C2358(void)
+{
+ gPaletteFade.bufferTransferDisabled = TRUE;
+ SetVBlankCallback(NULL);
+ sub_80C2020();
+ ScanlineEffect_Clear();
+ ResetPaletteFade();
+ ResetSpriteData();
+ ResetTasks();
+ FreeAllSpritePalettes();
+ sub_80C2144();
+ sub_80C310C();
+ LoadAllContestMonIcons(0, TRUE);
+ sub_80C2340();
+ eContestLink80C2020Struct2018000 = (struct UnkEwramStruct18000){};
+ eContestLink80C2020Struct2018018 = (struct UnkEwramStruct18018){};
+ sub_80C33DC();
+ BeginNormalPaletteFade(0xffffffff, 0, 16, 0, 0);
+ gPaletteFade.bufferTransferDisabled = FALSE;
+ eContestLink80C2020Struct2018000.unk_02 = CreateTask(sub_80C24F4, 5);
+ SetMainCallback2(sub_80C2430);
+ gBattle_WIN1H = 0xf0;
+ gBattle_WIN1V = 0x80a0;
+ CreateTask(sub_80C2F28, 20);
+ sub_80C3F00();
+ PlayBGM(MUS_CON_K);
+ SetVBlankCallback(sub_80C2448);
+}
+
+static void sub_80C2430(void)
+{
+ AnimateSprites();
+ BuildOamBuffer();
+ RunTasks();
+ UpdatePaletteFade();
+}
+
+static void sub_80C2448(void)
+{
+ REG_BG0HOFS = gBattle_BG0_X;
+ REG_BG0VOFS = gBattle_BG0_Y;
+ REG_BG1HOFS = gBattle_BG1_X;
+ REG_BG1VOFS = gBattle_BG1_Y;
+ REG_BG2HOFS = gBattle_BG2_X;
+ REG_BG2VOFS = gBattle_BG2_Y;
+ REG_BG3HOFS = gBattle_BG3_X;
+ REG_BG3VOFS = gBattle_BG3_Y;
+ REG_WIN0H = gBattle_WIN0H;
+ REG_WIN0V = gBattle_WIN0V;
+ REG_WIN1H = gBattle_WIN1H;
+ REG_WIN1V = gBattle_WIN1V;
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ ScanlineEffect_InitHBlankDmaTransfer();
+}
+
+static void sub_80C24F4(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ if (gIsLinkContest & 1)
+ {
+ sub_80C3698(gOtherText_LinkStandby);
+ gTasks[taskId].func = sub_80C255C;
+ }
+ else
+ {
+ gTasks[taskId].func = sub_80C2600;
+ }
+ }
+}
+
+static void sub_80C255C(u8 taskId)
+{
+ if (gReceivedRemoteLinkPlayers && GetLinkPlayerCount() == MAX_LINK_PLAYERS)
+ {
+ CreateTask(sub_80C25A4, 0);
+ gTasks[taskId].func = TaskDummy;
+ }
+}
+
+static void sub_80C25A4(u8 taskId)
+{
+ SetTaskFuncWithFollowupFunc(taskId, sub_80C89DC, sub_80C25C0);
+}
+
+static void sub_80C25C0(u8 taskId)
+{
+ if (IsLinkTaskFinished())
+ {
+ DestroyTask(taskId);
+ gTasks[eContestLink80C2020Struct2018000.unk_02].func = sub_80C2600;
+ sub_80C3764();
+ }
+}
+
+static void sub_80C2600(u8 taskId)
+{
+ if (gTasks[taskId].data[0] == 0)
+ {
+ CreateTask(sub_80C2F64, 20);
+ sub_80C3158(gContestText_AnnounceResults, eContestLink80C2020Struct2018000.unk_00);
+ sub_80C34CC(sub_80C34AC(gContestText_AnnounceResults), 0x90, 0x78, 0x440);
+ gTasks[taskId].data[0]++;
+ }
+ else if (gTasks[taskId].data[0] == 1)
+ {
+ if (eContestLink80C2020Struct2018000.unk_04 == 0)
+ {
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[0]++;
+ }
+ }
+ else if (gTasks[taskId].data[0] == 2)
+ {
+ if (++gTasks[taskId].data[1] == 0x15)
+ {
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[0]++;
+ }
+ }
+ else if (gTasks[taskId].data[0] == 3)
+ {
+ sub_80C3158(gContestText_PreliminaryResults, eContestLink80C2020Struct2018000.unk_00);
+ sub_80C34CC(sub_80C34AC(gContestText_PreliminaryResults), 0x90, 0xffff, 0x440);
+ gTasks[taskId].data[0]++;
+ }
+ else if (gTasks[taskId].data[0] == 4)
+ {
+ if (eContestLink80C2020Struct2018000.unk_04 == 2)
+ {
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_80C26E4;
+ }
+ }
+}
+
+static void sub_80C26E4(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (eContestLink80C2020Struct2018000.unk_0a == 0)
+ {
+ sub_80C40D4(0, gTasks[taskId].data[2]++);
+ if (eContestLink80C2020Struct2018000.unk_14 == 0)
+ {
+ gTasks[taskId].data[0] = 2;
+ }
+ else
+ {
+ gTasks[taskId].data[0]++;
+ }
+ }
+ break;
+ case 1:
+ if (eContestLink80C2020Struct2018000.unk_14 == 0)
+ {
+ gTasks[taskId].data[0] = 0;
+ }
+ break;
+ case 2:
+ sub_80C3520(0x440);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].func = sub_80C2770;
+ break;
+ }
+}
+
+static void sub_80C2770(u8 taskId)
+{
+ if (eContestLink80C2020Struct2018000.unk_04 == 0)
+ {
+ if (++gTasks[taskId].data[1] == 21)
+ {
+ gTasks[taskId].data[1] = 0;
+ sub_80C3158(gContestText_Round2Results, eContestLink80C2020Struct2018000.unk_00);
+ sub_80C34CC(sub_80C34AC(gContestText_Round2Results), 0x90, 0xffff, 0x440);
+ }
+ }
+ else if (eContestLink80C2020Struct2018000.unk_04 == 2)
+ {
+ gTasks[taskId].func = sub_80C27EC;
+ }
+}
+
+static void sub_80C27EC(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (eContestLink80C2020Struct2018000.unk_0a == 0)
+ {
+ sub_80C40D4(1, gTasks[taskId].data[2]++);
+ if (eContestLink80C2020Struct2018000.unk_14 == 0)
+ {
+ gTasks[taskId].data[0] = 2;
+ }
+ else
+ {
+ gTasks[taskId].data[0]++;
+ }
+ }
+ break;
+ case 1:
+ if (eContestLink80C2020Struct2018000.unk_14 == 0)
+ {
+ gTasks[taskId].data[0] = 0;
+ }
+ break;
+ case 2:
+ sub_80C3520(0x440);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_80C2878;
+ break;
+ }
+}
+
+static void sub_80C2878(u8 taskId)
+{
+ int i;
+ u8 taskId2;
+ u8 strbuf[100];
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (eContestLink80C2020Struct2018000.unk_04 == 0)
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ if (++gTasks[taskId].data[1] == 31)
+ {
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 2:
+ for (i = 0; i < 4; i++)
+ {
+ taskId2 = CreateTask(sub_80C3A5C, 10);
+ gTasks[taskId2].data[0] = gContestFinalStandings[i];
+ gTasks[taskId2].data[1] = i;
+ }
+ gTasks[taskId].data[0]++;
+ break;
+ case 3:
+ if (eContestLink80C2020Struct2018000.unk_05 == 4)
+ {
+ if (++gTasks[taskId].data[1] == 31)
+ {
+ gTasks[taskId].data[1] = 0;
+ CreateTask(sub_80C3B30, 10);
+ gTasks[taskId].data[0]++;
+ GET_CONTEST_WINNER(i);
+ sub_80C3E60(i, 14);
+ }
+ }
+ break;
+ case 4:
+ if (++gTasks[taskId].data[1] == 21)
+ {
+ gTasks[taskId].data[1] = 0;
+ GET_CONTEST_WINNER(i);
+ if (gIsLinkContest & 1)
+ {
+ StringCopy(gStringVar1, gLinkPlayers[i].name);
+ }
+ else
+ {
+ StringCopy(gStringVar1, gContestMons[i].trainerName);
+ }
+ StringCopy(gStringVar2, gContestMons[i].nickname);
+ StringExpandPlaceholders(strbuf, gContestText_PokeWon);
+ sub_80C3158(strbuf, eContestLink80C2020Struct2018000.unk_00);
+ sub_80C34CC(sub_80C34AC(strbuf), 0x90, 0xffff, 0x440);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 5:
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_80C2A8C;
+ break;
+ }
+}
+
+static void sub_80C2A8C(u8 taskId)
+{
+ int i;
+ u8 spriteId;
+ u16 species;
+ u32 personality;
+ u32 otId;
+ const struct CompressedSpritePalette *monPal;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ gBattle_WIN0H = 0xf0;
+ gBattle_WIN0V = 0x5050;
+ GET_CONTEST_WINNER(i);
+ species = gContestMons[i].species;
+ personality = gContestMons[i].personality;
+ otId = gContestMons[i].otId;
+ HandleLoadSpecialPokePic(gMonFrontPicTable + species, gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, (intptr_t)gSharedMem, gUnknown_081FAF4C[1], species, personality);
+ monPal = GetMonSpritePalStructFromOtIdPersonality(species, otId, personality);
+ LoadCompressedObjectPalette(monPal);
+ GetMonSpriteTemplate_803C56C(species, 1);
+ gUnknown_02024E8C.paletteTag = monPal->tag;
+ spriteId = CreateSprite(&gUnknown_02024E8C, 0x110, 0x50, 10);
+ gSprites[spriteId].data[1] = species;
+ gSprites[spriteId].oam.priority = 0;
+ gSprites[spriteId].callback = sub_80C3C44;
+ eContestLink80C2020Struct2018000.unk_08 = spriteId;
+ LoadCompressedObjectPic(&gUnknown_083D17CC);
+ LoadCompressedObjectPalette(&gUnknown_083D17D4);
+ CreateTask(sub_80C3D04, 10);
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ if (++gTasks[taskId].data[3] == 1)
+ {
+ u8 win0v;
+ gTasks[taskId].data[3] = 0;
+ gTasks[taskId].data[2] += 2;
+ if (gTasks[taskId].data[2] > 0x20)
+ gTasks[taskId].data[2] = 0x20;
+ win0v = gTasks[taskId].data[2];
+ gBattle_WIN0V = ((0x50 - win0v) << 8) | (0x50 + win0v);
+ if (win0v == 0x20)
+ {
+ gTasks[taskId].data[0]++;
+ }
+ }
+ break;
+ case 2:
+ if (eContestLink80C2020Struct2018000.unk_06 == 1)
+ {
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 3:
+ if (++gTasks[taskId].data[1] == 121)
+ {
+ gTasks[taskId].data[1] = 0;
+ gSprites[eContestLink80C2020Struct2018000.unk_08].callback = sub_80C3CB8;
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 4:
+ if (eContestLink80C2020Struct2018000.unk_06 == 2)
+ {
+ u8 win0v = (gBattle_WIN0V >> 8);
+ win0v += 2;
+ if (win0v > 0x50)
+ win0v = 0x50;
+ gBattle_WIN0V = (win0v << 8) | (0xa0 - win0v);
+ if (win0v == 0x50)
+ {
+ gTasks[taskId].data[0]++;
+ }
+ }
+ break;
+ case 5:
+ if (eContestLink80C2020Struct2018000.unk_06 == 2)
+ {
+ eContestLink80C2020Struct2018000.unk_09 = 1;
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_80C2D1C;
+ }
+ break;
+ }
+}
+
+static void sub_80C2D1C(u8 taskId)
+{
+ int i;
+
+ if (gMain.newKeys & A_BUTTON)
+ {
+ if (!(gIsLinkContest & 1))
+ {
+ for (i = 0; i < 4; i++)
+ {
+ GetSetPokedexFlag(SpeciesToNationalPokedexNum(gContestMons[i].species), FLAG_SET_SEEN);
+ }
+ }
+ gTasks[taskId].func = sub_80C2D80;
+ }
+}
+
+static void sub_80C2D80(u8 taskId)
+{
+ if (gIsLinkContest & 1)
+ {
+ sub_80C3698(gOtherText_LinkStandby);
+ sub_800832C();
+ gTasks[taskId].func = sub_80C2DD8;
+ }
+ else
+ {
+ gTasks[taskId].func = sub_80C2E14;
+ }
+}
+
+static void sub_80C2DD8(u8 taskId)
+{
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ gIsLinkContest = 0;
+ sub_80C3764();
+ gTasks[taskId].func = sub_80C2E14;
+ }
+}
+
+static void sub_80C2E14(u8 taskId)
+{
+ sub_80BE284(gContestFinalStandings[gContestPlayerMonIndex]);
+ sub_810FB10(2);
+ Contest_SaveWinner(gSpecialVar_ContestRank);
+ Contest_SaveWinner(0xFE);
+ ewram15DDF = 1;
+ ewram15DDE = sub_80B2C4C(0xfe, 0);
+ BeginHardwarePaletteFade(0xff, 0, 0, 16, 0);
+ gTasks[taskId].func = sub_80C2EA0;
+}
+
+static void sub_80C2EA0(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ if (gTasks[taskId].data[1] == 0)
+ {
+ DestroyTask(eContestLink80C2020Struct2018000.unk_03);
+ BlendPalettes(0x0000ffff, 16, 0);
+ gTasks[taskId].data[1]++;
+ }
+ else if (gTasks[taskId].data[1] == 1)
+ {
+ BlendPalettes(0xffff0000, 16, 0);
+ gTasks[taskId].data[1]++;
+ }
+ else
+ {
+ REG_BLDCNT = 0;
+ REG_BLDY = 0;
+ DestroyTask(taskId);
+ SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
+ }
+ }
+}
+
+static void sub_80C2F28(u8 taskId)
+{
+ gBattle_BG3_X += 2;
+ gBattle_BG3_Y++;
+ if (gBattle_BG3_X > 0xff)
+ gBattle_BG3_X -= 0xff;
+ if (gBattle_BG3_Y > 0xff)
+ gBattle_BG3_Y -= 0xff;
+}
+
+static void sub_80C2F64(u8 taskId)
+{
+ if (++gTasks[taskId].data[0] == 2)
+ {
+ gTasks[taskId].data[0] = 0;
+ if (gTasks[taskId].data[2] == 0)
+ gTasks[taskId].data[1]++;
+ else
+ gTasks[taskId].data[1]--;
+ if (gTasks[taskId].data[1] == 16)
+ gTasks[taskId].data[2] = 1;
+ else if (gTasks[taskId].data[1] == 0)
+ gTasks[taskId].data[2] = 0;
+ BlendPalette(0x6b, 0x01, gTasks[taskId].data[1], RGB(30, 22, 11));
+ BlendPalette(0x68, 0x01, gTasks[taskId].data[1], RGB(31, 31, 31));
+ BlendPalette(0x6e, 0x01, gTasks[taskId].data[1], RGB(30, 29, 29));
+ }
+ if (gTasks[taskId].data[1] == 0)
+ eContestLink80C2020Struct2018000.unk_0a = 0;
+ else
+ eContestLink80C2020Struct2018000.unk_0a = 1;
+}
+
+#ifdef NONMATCHING
+void sub_80C3024(u16 species, u8 destOffset, u8 srcOffset, bool8 useDmaNow, u32 personality)
+{
+ int i;
+ int j;
+ u16 tile;
+ u16 offset;
+ int vOffset;
+
+ if (useDmaNow)
+ {
+ DmaCopy32Defvars(3, GetMonIconPtr(species, personality) + (srcOffset << 9) + 0x80, BG_CHAR_ADDR(1) + (destOffset << 9), 0x180);
+ tile = ((destOffset + 10) << 12);
+ tile |= (destOffset * 16 + 0x200);
+ offset = destOffset * 0x60 + 0x83;
+ for (i = 0; i < 3; i++)
+ {
+ vOffset = (i << 5) + offset;
+ for (j = 0; j < 4; j++)
+ {
+ ((u16 *)BG_CHAR_ADDR(3))[vOffset + j] = tile;
+ tile++;
+ }
+ }
+ }
+ else
+ {
+ RequestSpriteCopy(GetMonIconPtr(species, personality) + (srcOffset << 9) + 0x80, BG_CHAR_ADDR(1) + (destOffset << 9), 0x180);
+ }
+}
+#else
+__attribute__((naked)) void sub_80C3024(u16 species, u8 destOffset, u8 srcOffset, bool8 useDmaNow, u32 personality)
+{
+ asm_unified("\tpush {r4-r6,lr}\n"
+ "\tldr r6, [sp, 0x10]\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tlsls r1, 24\n"
+ "\tlsrs r4, r1, 24\n"
+ "\tlsls r2, 24\n"
+ "\tlsrs r5, r2, 24\n"
+ "\tlsls r3, 24\n"
+ "\tcmp r3, 0\n"
+ "\tbeq _080C30B0\n"
+ "\tadds r1, r6, 0\n"
+ "\tbl GetMonIconPtr\n"
+ "\tlsls r1, r5, 9\n"
+ "\tadds r0, r1\n"
+ "\tadds r0, 0x80\n"
+ "\tlsls r1, r4, 9\n"
+ "\tldr r2, _080C30A0 @ =0x06004000\n"
+ "\tadds r1, r2\n"
+ "\tldr r2, _080C30A4 @ =0x040000d4\n"
+ "\tstr r0, [r2]\n"
+ "\tstr r1, [r2, 0x4]\n"
+ "\tldr r0, _080C30A8 @ =0x84000060\n"
+ "\tstr r0, [r2, 0x8]\n"
+ "\tldr r0, [r2, 0x8]\n"
+ "\tadds r1, r4, 0\n"
+ "\tadds r1, 0xA\n"
+ "\tlsls r1, 28\n"
+ "\tlsls r0, r4, 20\n"
+ "\tmovs r2, 0x80\n"
+ "\tlsls r2, 18\n"
+ "\tadds r0, r2\n"
+ "\torrs r0, r1\n"
+ "\tlsrs r1, r0, 16\n"
+ "\tlsls r0, r4, 1\n"
+ "\tadds r0, r4\n"
+ "\tlsls r0, 21\n"
+ "\tmovs r2, 0x83\n"
+ "\tlsls r2, 16\n"
+ "\tadds r0, r2\n"
+ "\tlsrs r5, r0, 16\n"
+ "\tmovs r2, 0\n"
+ "\tldr r6, _080C30AC @ =0x0600c000\n"
+ "_080C307C:\n"
+ "\tlsls r0, r2, 5\n"
+ "\tadds r4, r2, 0x1\n"
+ "\tadds r0, r5\n"
+ "\tmovs r3, 0x3\n"
+ "\tlsls r0, 1\n"
+ "\tadds r2, r0, r6\n"
+ "_080C3088:\n"
+ "\tstrh r1, [r2]\n"
+ "\tadds r0, r1, 0x1\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r1, r0, 16\n"
+ "\tadds r2, 0x2\n"
+ "\tsubs r3, 0x1\n"
+ "\tcmp r3, 0\n"
+ "\tbge _080C3088\n"
+ "\tadds r2, r4, 0\n"
+ "\tcmp r2, 0x2\n"
+ "\tble _080C307C\n"
+ "\tb _080C30CA\n"
+ "\t.align 2, 0\n"
+ "_080C30A0: .4byte 0x06004000\n"
+ "_080C30A4: .4byte 0x040000d4\n"
+ "_080C30A8: .4byte 0x84000060\n"
+ "_080C30AC: .4byte 0x0600c000\n"
+ "_080C30B0:\n"
+ "\tadds r1, r6, 0\n"
+ "\tbl GetMonIconPtr\n"
+ "\tlsls r1, r5, 9\n"
+ "\tadds r0, r1\n"
+ "\tadds r0, 0x80\n"
+ "\tlsls r1, r4, 9\n"
+ "\tldr r2, _080C30D0 @ =0x06004000\n"
+ "\tadds r1, r2\n"
+ "\tmovs r2, 0xC0\n"
+ "\tlsls r2, 1\n"
+ "\tbl RequestSpriteCopy\n"
+ "_080C30CA:\n"
+ "\tpop {r4-r6}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+ "_080C30D0: .4byte 0x06004000");
+}
+#endif
+
+static void LoadAllContestMonIcons(u8 srcOffset, bool8 useDmaNow)
+{
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ sub_80C3024(gContestMons[i].species, i, srcOffset, useDmaNow, gContestMons[i].personality);
+ }
+}
+
+#ifdef NONMATCHING
+void sub_80C310C(void)
+{
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ u16 species = mon_icon_convert_unown_species_id(gContestMons[i].species, 0);
+ LoadPalette(gMonIconPalettes[gMonIconPaletteIndices[species]], 0xa0 + 0x10 * i, 0x20);
+ }
+}
+#else
+__attribute__((naked)) void sub_80C310C(void)
+{
+ asm_unified("\tpush {r4-r6,lr}\n"
+ "\tmovs r4, 0\n"
+ "\tldr r6, _080C314C @ =gMonIconPaletteIndices\n"
+ "\tmovs r5, 0xA0\n"
+ "\tlsls r5, 16\n"
+ "_080C3116:\n"
+ "\tldr r1, _080C3150 @ =gContestMons\n"
+ "\tlsls r0, r4, 6\n"
+ "\tadds r0, r1\n"
+ "\tldrh r0, [r0]\n"
+ "\tmovs r1, 0\n"
+ "\tbl mon_icon_convert_unown_species_id\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tadds r0, r6\n"
+ "\tldrb r0, [r0]\n"
+ "\tlsls r0, 5\n"
+ "\tldr r1, _080C3154 @ =gMonIconPalettes\n"
+ "\tadds r0, r1\n"
+ "\tlsrs r1, r5, 16\n"
+ "\tmovs r2, 0x20\n"
+ "\tbl LoadPalette\n"
+ "\tmovs r0, 0x80\n"
+ "\tlsls r0, 13\n"
+ "\tadds r5, r0\n"
+ "\tadds r4, 0x1\n"
+ "\tcmp r4, 0x3\n"
+ "\tble _080C3116\n"
+ "\tpop {r4-r6}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+ "_080C314C: .4byte gMonIconPaletteIndices\n"
+ "_080C3150: .4byte gContestMons\n"
+ "_080C3154: .4byte gMonIconPalettes");
+}
+#endif
+
+// void sub_80C3158(const u8 *string, u8 spriteId)
+// {
+// int i, j;
+// u8 width;
+// u8 * displayedStringBattle;
+// void * dest;
+// u8 * d1;
+// u8 * d2;
+// void *d3;
+// void *d4;
+// void *d5;
+// void *d6;
+// int w;
+// u16 sp00[4];
+// struct Sprite *sprite = &gSprites[spriteId];
+// sp00[0] = gSprites[spriteId].oam.tileNum;
+// sp00[1] = gSprites[sprite->data[0]].oam.tileNum;
+// sp00[2] = gSprites[sprite->data[1]].oam.tileNum;
+// sp00[3] = gSprites[sprite->data[2]].oam.tileNum;
+
+// for (i = 0; i < 4; i++)
+// {
+// DmaClear32(3, (void *)VRAM + 0x10000 + 32 * sp00[i], 0x400);
+// }
+
+// width = Text_GetStringWidthFromWindowTemplate(&gWindowTemplate_81E7278, string);
+// displayedStringBattle = gDisplayedStringBattle;
+// displayedStringBattle = StringCopy(displayedStringBattle, gUnknown_083D17E2);
+// if ((~width + 1) & 7)
+// {
+// displayedStringBattle[0] = EXT_CTRL_CODE_BEGIN;
+// displayedStringBattle[1] = 0x11;
+// displayedStringBattle[2] = ((~width + 1) & 7) / 2;
+// displayedStringBattle += 3;
+// }
+
+// width += -8 & (width + 7);
+// displayedStringBattle = StringCopy(displayedStringBattle, string);
+
+// displayedStringBattle[0] = EXT_CTRL_CODE_BEGIN;
+// displayedStringBattle[1] = 0x13;
+// displayedStringBattle[2] = width;
+// displayedStringBattle[3] = EOS;
+
+// sub_80034D4(eContestLink80C2020Struct2018068, gDisplayedStringBattle);
+
+// CpuSet(&gUnknown_083D1624[0x0], (void *)0x6010000 + 32 * sp00[0], 0x4000008);
+// CpuSet(&gUnknown_083D1624[0x40], (void *)0x6010000 + 32 * sp00[0] + 0x100, 0x4000008);
+// CpuSet(&gUnknown_083D1624[0x40], (void *)0x6010000 + 32 * sp00[0] + 0x200, 0x4000008);
+// CpuSet(&gUnknown_083D1624[0x20], (void *)0x6010000 + 32 * sp00[0] + 0x300, 0x4000008);
+
+// w = width / 8;
+// j = 0;
+// if (j <= w)
+// {
+// d2 = eContestLink80C2020Struct2018068 + 0x20;
+// d1 = eContestLink80C2020Struct2018068;
+// d3 = (void *)VRAM + 0x0FD20;
+// d4 = (void *)VRAM + 0x0FE20;
+// d5 = (void *)VRAM + 0x0FF20;
+// d6 = (void *)VRAM + 0x10020;
+// while (j <= w)
+// {
+// if (j < 7)
+// dest = 32 * sp00[0] + d6;
+// else if (j < 15)
+// dest = 32 * sp00[1] + d5;
+// else if (j < 23)
+// dest = 32 * sp00[2] + d4;
+// else
+// dest = 32 * sp00[3] + d3;
+
+// if (j == w)
+// break;
+
+// CpuSet(gUnknown_083D16E4, dest, 0x4000008);
+// CpuSet(gUnknown_083D16E4 + 0x10, dest + 0x300, 0x4000008);
+// CpuSet(j * 0x40 + d2, dest + 0x100, 0x4000008);
+// CpuSet(j * 0x40 + d1, dest + 0x200, 0x4000008);
+
+// d3 += 0x20;
+// d4 += 0x20;
+// d5 += 0x20;
+// d6 += 0x20;
+// j++;
+// }
+// }
+
+// CpuSet(gUnknown_083D1644, dest, 0x4000008);
+// CpuSet(gUnknown_083D1644 + 0x40, dest + 0x100, 0x4000008);
+// CpuSet(gUnknown_083D1644 + 0x40, dest + 0x200, 0x4000008);
+// CpuSet(gUnknown_083D1644 + 0x20, dest + 0x300, 0x4000008);
+// }
diff --git a/src/battle/reshow_battle_screen.c b/src/battle/reshow_battle_screen.c
index f602d4835..bc4d394f0 100644
--- a/src/battle/reshow_battle_screen.c
+++ b/src/battle/reshow_battle_screen.c
@@ -11,14 +11,6 @@
extern struct SpriteTemplate gUnknown_02024E8C;
extern struct Window gUnknown_03004210;
-extern u16 gBattle_BG2_Y;
-extern u16 gBattle_BG2_X;
-extern u16 gBattle_BG0_X;
-extern u16 gBattle_BG1_X;
-extern u16 gBattle_BG3_X;
-extern u16 gBattle_BG1_Y;
-extern u16 gBattle_BG3_Y;
-extern u16 gBattle_BG0_Y;
extern u8 gReservedSpritePaletteCount;
extern u8 gActionSelectionCursor[4];
extern u8 gBankInMenu;
diff --git a/src/contest.c b/src/contest.c
index 9dff08ea7..78e2da3c0 100644
--- a/src/contest.c
+++ b/src/contest.c
@@ -48,23 +48,10 @@ extern u8 gBankAttacker;
extern u8 gBankTarget;
extern u8 gBanksBySide[];
extern u8 gBankSpriteIds[];
-extern u16 gBattle_BG3_X;
-extern s16 gBattle_BG1_Y;
-extern u16 gBattle_BG3_Y;
-extern u16 gBattle_WIN1H;
extern struct Window gUnknown_03004210;
-extern u16 gBattle_WIN0V;
-extern u16 gBattle_WIN1V;
-extern u16 gBattle_BG2_Y;
-extern u16 gBattle_BG2_X;
-extern u16 gBattle_BG0_Y;
-extern u16 gBattle_BG0_X;
-extern u16 gBattle_BG1_X;
-extern u16 gBattle_WIN0H;
+extern u32 gContestRngValue;
extern struct SpriteTemplate gUnknown_02024E8C;
-
-
extern const struct ContestPokemon gContestOpponents[60];
extern const u8 gUnknown_083CA308[][2];
extern const u8 gUnknown_083CA310[][2];
@@ -583,8 +570,7 @@ void sub_80AB9A0(u8 taskId)
gTasks[taskId].data[0]++;
break;
case 1:
- gBattle_BG1_Y += 7;
- if (gBattle_BG1_Y <= 160)
+ if ((s16)(gBattle_BG1_Y += 7) <= 160)
break;
gTasks[taskId].data[0]++;
break;
@@ -2021,10 +2007,9 @@ void sub_80ADE54(u8 taskId)
void sub_80ADEAC(u8 taskId)
{
- gBattle_BG1_Y -= 7;
- if (gBattle_BG1_Y < 0)
+ if ((s16)(gBattle_BG1_Y -= 7) < 0)
gBattle_BG1_Y = 0;
- if (*(u16 *)&gBattle_BG1_Y == 0) // Why cast?
+ if (gBattle_BG1_Y == 0) // Why cast?
{
gTasks[taskId].func = sub_80ADEEC;
gTasks[taskId].data[0] = 0;
@@ -5177,10 +5162,9 @@ void sub_80B237C(u8 taskId)
void sub_80B23BC(u8 taskId)
{
- gBattle_BG1_Y -= 7;
- if (gBattle_BG1_Y < 0)
+ if ((s16)(gBattle_BG1_Y -= 7) < 0)
gBattle_BG1_Y = 0;
- if (*(u16 *)&gBattle_BG1_Y == 0) // Why cast?
+ if (gBattle_BG1_Y == 0) // Why cast?
{
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[1] = 0;
@@ -5240,8 +5224,7 @@ void sub_80B2400(u8 taskId)
void sub_80B2508(u8 taskId)
{
- gBattle_BG1_Y += 7;
- if (gBattle_BG1_Y > DISPLAY_HEIGHT)
+ if ((s16)(gBattle_BG1_Y += 7) > DISPLAY_HEIGHT)
gTasks[taskId].func = sub_80ADCDC;
}
diff --git a/src/contest_ai.c b/src/contest_ai.c
index e570dbafb..a6dde8afe 100644
--- a/src/contest_ai.c
+++ b/src/contest_ai.c
@@ -1115,7 +1115,7 @@ static void ContestAICmd_check_would_finish_combo(void)
if(sContestantStatus[eContestAI->unk41].prevMove)
result = AreMovesContestCombo(sContestantStatus[eContestAI->unk41].prevMove, move);
-
+
if(result)
result = 1;
@@ -1723,7 +1723,7 @@ static void ContestAICmd_unk_85(void)
int result = 0;
int i;
u16 arg = T1_READ_16(gAIScriptPtr + 1);
-
+
for(i = 0; i < 4; i++)
{
u16 move = gContestMons[eContestAI->unk41].moves[i];
diff --git a/src/debug/matsuda_debug_menu.c b/src/debug/matsuda_debug_menu.c
index f914163b2..e24868787 100644
--- a/src/debug/matsuda_debug_menu.c
+++ b/src/debug/matsuda_debug_menu.c
@@ -1,5 +1,6 @@
#include "global.h"
#include "matsuda_debug_menu.h"
+#include "battle.h"
#include "contest.h"
#include "contest_link_80C2020.h"
#include "contest_link_80C857C.h"
@@ -22,15 +23,6 @@ extern u8 gUnknown_02038694;
extern u16 gSpecialVar_ContestCategory;
extern u16 gSpecialVar_ContestRank;
-extern u16 gBattle_BG0_X;
-extern u16 gBattle_BG0_Y;
-extern u16 gBattle_BG1_X;
-extern u16 gBattle_BG1_Y;
-extern u16 gBattle_BG2_X;
-extern u16 gBattle_BG2_Y;
-extern u16 gBattle_BG3_X;
-extern u16 gBattle_BG3_Y;
-
extern u8 (*gMenuCallback)(void);
static bool8 sub_80A9B78(void);
diff --git a/src/evolution_scene.c b/src/evolution_scene.c
index 182f85d8d..a855efb1b 100644
--- a/src/evolution_scene.c
+++ b/src/evolution_scene.c
@@ -65,14 +65,6 @@ void nullsub_6(void);
bool32 IsHMMove2(u16 move);
extern struct Window gUnknown_03004210;
-extern u16 gBattle_BG0_X;
-extern u16 gBattle_BG0_Y;
-extern u16 gBattle_BG1_X;
-extern u16 gBattle_BG1_Y;
-extern u16 gBattle_BG2_X;
-extern u16 gBattle_BG2_Y;
-extern u16 gBattle_BG3_X;
-extern u16 gBattle_BG3_Y;
extern u8 gBattleTerrain;
extern u8 gReservedSpritePaletteCount;
extern u16 gMoveToLearn;
diff --git a/src/pokemon_size_record.c b/src/pokemon_size_record.c
index 43ad39e6f..6a7ee69b3 100644
--- a/src/pokemon_size_record.c
+++ b/src/pokemon_size_record.c
@@ -8,6 +8,8 @@
#include "strings2.h"
#include "text.h"
+const u16 Unknown_083D17EC[] = INCBIN_U16("graphics/unknown/unknown_3D17EC.gbapal");
+
struct UnknownStruct
{
u16 unk0;
diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c
index 7fc422125..aabacbe2f 100644
--- a/src/pokemon_summary_screen.c
+++ b/src/pokemon_summary_screen.c
@@ -123,12 +123,6 @@ extern u8 StorageSystemGetNextMonIndex(struct BoxPokemon *, u8, u8, u8);
extern struct MusicPlayerInfo gMPlay_BGM;
extern u8 gUnknown_08208238[];
-extern u16 gBattle_BG3_Y;
-extern u16 gBattle_BG2_Y;
-extern u16 gBattle_BG1_Y;
-extern u16 gBattle_BG1_X;
-extern u16 gBattle_BG2_X;
-extern u16 gBattle_BG3_X;
extern TaskFunc gUnknown_03005CF0;
extern struct SpriteTemplate gUnknown_02024E8C;
diff --git a/src/tv.c b/src/tv.c
index f95a73bea..fd6b7c62f 100644
--- a/src/tv.c
+++ b/src/tv.c
@@ -1,6 +1,7 @@
#include "global.h"
#include "tv.h"
#include "battle_tower.h"
+#include "contest.h"
#include "contest_painting.h"
#include "data2.h"
#include "easy_chat.h"
@@ -68,10 +69,9 @@ struct UnkTvStruct gUnknown_03005D38;
extern u16 gSpecialVar_LastTalked;
-extern u8 gSpecialVar_ContestCategory;
-extern u8 gSpecialVar_ContestRank;
+extern u16 gSpecialVar_ContestCategory;
+extern u16 gSpecialVar_ContestRank;
extern u8 gBattleOutcome;
-
extern u16 gLastUsedItem;
static EWRAM_DATA u16 gUnknown_020387E0 = 0;
@@ -444,9 +444,6 @@ void ClearTVShowData(void)
bool8 sub_80BF1B4(u8);
void sub_80BF20C(void);
-extern u8 gSpecialVar_ContestCategory;
-extern u8 gSpecialVar_ContestRank;
-extern u8 gBattleOutcome;
void InterviewBefore_FanClubLetter(void);
void InterviewBefore_RecentHappenings(void);
@@ -456,21 +453,9 @@ void InterviewBefore_NameRater(void);
void InterviewBefore_BravoTrainerPkmnProfile(void);
void InterviewBefore_BravoTrainerBTProfile(void);
-void sub_80BE028(void);
-void sub_80BE074(void);
-void sub_80BE778(void);
-void sub_80BEB20(void);
u8 GetTVChannelByShowType(u8);
-s8 sub_80BF74C(TVShow tvShow[]);
-
-void sub_80BF55C(TVShow tvShow[], u8 showidx);
-void sub_80BEA88(void);
-
-void sub_80BE138(TVShow *show);
-void sub_80BE160(TVShow *show);
-extern u16 gLastUsedItem;
void InterviewAfter_FanClubLetter(void);
void InterviewAfter_RecentHappenings(void);
@@ -980,16 +965,16 @@ void sub_80BE23C(u16 a0)
}
}
-void sub_80BE284(u8 a0)
+void sub_80BE284(u8 contestResult)
{
struct TVShowBravoTrainerPokemonProfiles *bravoTrainer = &gSaveBlock1.tvShows[24].bravoTrainer;
gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows);
if (gUnknown_03005D38.var0 != -1)
{
- bravoTrainer->contestResult = a0;
+ bravoTrainer->contestResult = contestResult;
bravoTrainer->contestCategory = gSpecialVar_ContestCategory;
- bravoTrainer->contestRank = gSpecialVar_ContestRank;
+ bravoTrainer->contestRank = (u8)gSpecialVar_ContestRank;
bravoTrainer->species = GetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_SPECIES, NULL);
GetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_NICKNAME, bravoTrainer->pokemonNickname);
}