summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle_anim_80A5C6C.c32
-rw-r--r--src/battle_anim_80D51AC.c6
-rw-r--r--src/battle_bg.c22
-rw-r--r--src/battle_controller_link_opponent.c4
-rw-r--r--src/battle_controller_link_partner.c4
-rw-r--r--src/battle_controller_opponent.c4
-rw-r--r--src/battle_controller_player.c10
-rw-r--r--src/battle_controller_player_partner.c4
-rw-r--r--src/battle_controller_recorded_opponent.c4
-rw-r--r--src/battle_controller_recorded_player.c4
-rw-r--r--src/battle_controller_wally.c2
-rw-r--r--src/battle_dome.c16
-rw-r--r--src/battle_interface.c102
-rw-r--r--src/battle_main.c6
-rw-r--r--src/battle_message.c55
-rw-r--r--src/battle_pyramid.c6
-rw-r--r--src/bug.c317
-rw-r--r--src/cable_club.c12
-rw-r--r--src/contest_ai.c2
-rw-r--r--src/data/pokemon_graphics/back_pic_coordinates.h700
-rw-r--r--src/data/pokemon_graphics/front_pic_coordinates.h716
-rw-r--r--src/dragon.c269
-rw-r--r--src/effects_1.c4
-rw-r--r--src/fight.c681
-rw-r--r--src/frontier_util.c8
-rw-r--r--src/graphics.c6
-rw-r--r--src/ground.c655
-rw-r--r--src/poison.c154
-rw-r--r--src/pokeball.c4
-rw-r--r--src/rock.c615
-rw-r--r--src/rom_8011DC0.c6
-rwxr-xr-xsrc/script_pokemon_util_80F87D8.c707
32 files changed, 4189 insertions, 948 deletions
diff --git a/src/battle_anim_80A5C6C.c b/src/battle_anim_80A5C6C.c
index d8e422bb5..2ac6cca90 100644
--- a/src/battle_anim_80A5C6C.c
+++ b/src/battle_anim_80A5C6C.c
@@ -36,9 +36,7 @@ extern const union AffineAnimCmd *gUnknown_082FF6C0[];
// This file's functions.
void sub_80A64EC(struct Sprite *sprite);
void sub_80A653C(struct Sprite *sprite);
-void InitAnimLinearTranslation(struct Sprite *sprite);
void sub_80A6FB4(struct Sprite *sprite);
-void sub_80A6F98(struct Sprite *sprite);
void sub_80A7144(struct Sprite *sprite);
void sub_80A791C(struct Sprite *sprite);
void sub_80A8DFC(struct Sprite *sprite);
@@ -50,8 +48,6 @@ void sub_80A7AFC(u8 taskId);
void sub_80A8CAC(u8 taskId);
void AnimTask_BlendMonInAndOutStep(u8 taskId);
bool8 sub_80A7238(void);
-void sub_80A8048(s16 *bottom, s16 *top, const void *ptr);
-void *sub_80A8050(s16 bottom, s16 top);
u8 sub_80A82E4(u8 battlerId);
void sub_80A8D78(struct Task *task, u8 taskId);
@@ -532,7 +528,7 @@ void sub_80A6450(struct Sprite *sprite)
// Simply waits until the sprite's data[0] hits zero.
// This is used to let sprite anims or affine anims to run for a designated
// duration.
-void sub_80A64B0(struct Sprite *sprite)
+void WaitAnimForDuration(struct Sprite *sprite)
{
if (sprite->data[0] > 0)
sprite->data[0]--;
@@ -745,7 +741,7 @@ void sub_80A6864(struct Sprite *sprite, s16 a2)
}
}
-void sub_80A68D4(struct Sprite *sprite)
+void InitAnimArcTranslation(struct Sprite *sprite)
{
sprite->data[1] = sprite->pos1.x;
sprite->data[3] = sprite->pos1.y;
@@ -791,7 +787,7 @@ void sub_80A6980(struct Sprite *sprite, bool8 a2)
sprite->pos1.y += gBattleAnimArgs[1];
}
-void sub_80A69CC(struct Sprite *sprite, u8 a2)
+void InitAnimSpritePos(struct Sprite *sprite, u8 a2)
{
if (!a2)
{
@@ -1004,12 +1000,12 @@ void sub_80A6DEC(struct Sprite *sprite)
{
sprite->data[1] = sprite->pos1.x;
sprite->data[3] = sprite->pos1.y;
- sub_80A6E14(sprite);
+ InitSpriteDataForLinearTranslation(sprite);
sprite->callback = sub_80A65A8;
sprite->callback(sprite);
}
-void sub_80A6E14(struct Sprite *sprite)
+void InitSpriteDataForLinearTranslation(struct Sprite *sprite)
{
s16 x = (sprite->data[2] - sprite->data[1]) << 8;
s16 y = (sprite->data[4] - sprite->data[3]) << 8;
@@ -1047,7 +1043,7 @@ void InitAnimLinearTranslation(struct Sprite *sprite)
sprite->data[3] = 0;
}
-void sub_80A6EEC(struct Sprite *sprite)
+void StartAnimLinearTranslation(struct Sprite *sprite)
{
sprite->data[1] = sprite->pos1.x;
sprite->data[3] = sprite->pos1.y;
@@ -1476,7 +1472,7 @@ void sub_80A77C8(struct Sprite *sprite)
else
var = FALSE;
if (!gBattleAnimArgs[2])
- sub_80A69CC(sprite, var);
+ InitAnimSpritePos(sprite, var);
else
sub_80A6980(sprite, var);
sprite->data[0]++;
@@ -1511,27 +1507,27 @@ void TranslateAnimSpriteToTargetMonLocation(struct Sprite *sprite)
else
attributeId = BATTLER_COORD_Y;
- sub_80A69CC(sprite, v1);
+ InitAnimSpritePos(sprite, v1);
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
sprite->data[0] = gBattleAnimArgs[4];
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2];
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, attributeId) + gBattleAnimArgs[3];
- sprite->callback = sub_80A6EEC;
+ sprite->callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
}
void sub_80A78AC(struct Sprite *sprite)
{
- sub_80A69CC(sprite, 1);
+ InitAnimSpritePos(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];
- sub_80A68D4(sprite);
+ InitAnimArcTranslation(sprite);
sprite->callback = sub_80A791C;
}
@@ -1558,7 +1554,7 @@ void sub_80A7938(struct Sprite *sprite)
}
if (!gBattleAnimArgs[5])
{
- sub_80A69CC(sprite, r4);
+ InitAnimSpritePos(sprite, r4);
battlerId = gBattleAnimAttacker;
}
else
@@ -1572,7 +1568,7 @@ void sub_80A7938(struct Sprite *sprite)
sprite->data[0] = gBattleAnimArgs[4];
sprite->data[2] = GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2) + gBattleAnimArgs[2];
sprite->data[4] = GetBattlerSpriteCoord(battlerId, attributeId) + gBattleAnimArgs[3];
- sprite->callback = sub_80A6EEC;
+ sprite->callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
}
@@ -2454,6 +2450,6 @@ void sub_80A8EE4(struct Sprite *sprite)
sprite->pos1.x += x;
sprite->pos1.y = gBattleAnimArgs[5] - 80;
}
- sprite->callback = sub_80A6EEC;
+ sprite->callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
}
diff --git a/src/battle_anim_80D51AC.c b/src/battle_anim_80D51AC.c
index 1864a1a7a..25e07dc3a 100644
--- a/src/battle_anim_80D51AC.c
+++ b/src/battle_anim_80D51AC.c
@@ -442,7 +442,7 @@ void SlideMonToOriginalPos(struct Sprite *sprite)
sprite->data[2] = gSprites[monSpriteId].pos1.x;
sprite->data[3] = gSprites[monSpriteId].pos1.y + gSprites[monSpriteId].pos2.y;
sprite->data[4] = gSprites[monSpriteId].pos1.y;
- sub_80A6E14(sprite);
+ InitSpriteDataForLinearTranslation(sprite);
sprite->data[3] = 0;
sprite->data[4] = 0;
sprite->data[5] = gSprites[monSpriteId].pos2.x;
@@ -520,7 +520,7 @@ void SlideMonToOffset(struct Sprite *sprite)
sprite->data[2] = gSprites[monSpriteId].pos1.x + gBattleAnimArgs[1];
sprite->data[3] = gSprites[monSpriteId].pos1.y;
sprite->data[4] = gSprites[monSpriteId].pos1.y + gBattleAnimArgs[2];
- sub_80A6E14(sprite);
+ InitSpriteDataForLinearTranslation(sprite);
sprite->data[3] = 0;
sprite->data[4] = 0;
sprite->data[5] = monSpriteId;
@@ -556,7 +556,7 @@ void sub_80D5B48(struct Sprite *sprite)
sprite->data[2] = sprite->data[1] + gBattleAnimArgs[1];
sprite->data[3] = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y;
sprite->data[4] = sprite->data[3] + gBattleAnimArgs[2];
- sub_80A6E14(sprite);
+ InitSpriteDataForLinearTranslation(sprite);
sprite->data[3] = gSprites[spriteId].pos2.x << 8;
sprite->data[4] = gSprites[spriteId].pos2.y << 8;
sprite->data[5] = spriteId;
diff --git a/src/battle_bg.c b/src/battle_bg.c
index 51138040c..bb66a41fd 100644
--- a/src/battle_bg.c
+++ b/src/battle_bg.c
@@ -157,9 +157,9 @@ const struct BgTemplate gBattleBgTemplates[] =
},
};
-static const struct WindowTemplate gUnknown_0831AA18[] =
+static const struct WindowTemplate gStandardBattleWindowTemplates[] =
{
- {
+ { // 0 Standard battle message
.bg = 0,
.tilemapLeft = 2,
.tilemapTop = 15,
@@ -168,7 +168,7 @@ static const struct WindowTemplate gUnknown_0831AA18[] =
.paletteNum = 0,
.baseBlock = 0x0090,
},
- {
+ { // 1 "What will (pokemon) do?"
.bg = 0,
.tilemapLeft = 1,
.tilemapTop = 35,
@@ -177,7 +177,7 @@ static const struct WindowTemplate gUnknown_0831AA18[] =
.paletteNum = 0,
.baseBlock = 0x01c0,
},
- {
+ { // 2 "Fight/Pokemon/Bag/Run"
.bg = 0,
.tilemapLeft = 17,
.tilemapTop = 35,
@@ -186,7 +186,7 @@ static const struct WindowTemplate gUnknown_0831AA18[] =
.paletteNum = 5,
.baseBlock = 0x0190,
},
- {
+ { // 3 Top left move
.bg = 0,
.tilemapLeft = 2,
.tilemapTop = 55,
@@ -195,7 +195,7 @@ static const struct WindowTemplate gUnknown_0831AA18[] =
.paletteNum = 5,
.baseBlock = 0x0300,
},
- {
+ { // 4 Top right move
.bg = 0,
.tilemapLeft = 11,
.tilemapTop = 55,
@@ -204,7 +204,7 @@ static const struct WindowTemplate gUnknown_0831AA18[] =
.paletteNum = 5,
.baseBlock = 0x0310,
},
- {
+ { // 5 Bottom left move
.bg = 0,
.tilemapLeft = 2,
.tilemapTop = 57,
@@ -213,7 +213,7 @@ static const struct WindowTemplate gUnknown_0831AA18[] =
.paletteNum = 5,
.baseBlock = 0x0320,
},
- {
+ { // 6 Bottom right move
.bg = 0,
.tilemapLeft = 11,
.tilemapTop = 57,
@@ -378,7 +378,7 @@ static const struct WindowTemplate gUnknown_0831AA18[] =
DUMMY_WIN_TEMPLATE
};
-static const struct WindowTemplate gUnknown_0831AAE0[] =
+static const struct WindowTemplate gBattleArenaWindowTemplates[] =
{
{
.bg = 0,
@@ -592,8 +592,8 @@ static const struct WindowTemplate gUnknown_0831AAE0[] =
const struct WindowTemplate * const gBattleWindowTemplates[] =
{
- gUnknown_0831AA18,
- gUnknown_0831AAE0,
+ gStandardBattleWindowTemplates,
+ gBattleArenaWindowTemplates,
};
static const struct BattleBackground gBattleTerrainTable[] =
diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c
index 7589eb962..0cec046e4 100644
--- a/src/battle_controller_link_opponent.c
+++ b/src/battle_controller_link_opponent.c
@@ -1344,7 +1344,7 @@ static void LinkOpponentHandleTrainerSlideBack(void)
gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 280;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
- gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy);
gBattlerControllerFuncs[gActiveBattler] = sub_8064470;
}
@@ -1706,7 +1706,7 @@ static void LinkOpponentHandleIntroTrainerBallThrow(void)
gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 280;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
- gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], sub_80676FC);
diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c
index 04554a81b..04a3784da 100644
--- a/src/battle_controller_link_partner.c
+++ b/src/battle_controller_link_partner.c
@@ -1166,7 +1166,7 @@ static void LinkPartnerHandleTrainerSlideBack(void)
gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
- gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy);
gBattlerControllerFuncs[gActiveBattler] = sub_814AF54;
}
@@ -1532,7 +1532,7 @@ static void LinkPartnerHandleIntroTrainerBallThrow(void)
gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 50;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
- gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gActiveBattler;
StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], sub_805CC00);
diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c
index 72dfb7e6b..403cc5eed 100644
--- a/src/battle_controller_opponent.c
+++ b/src/battle_controller_opponent.c
@@ -1381,7 +1381,7 @@ static void OpponentHandleTrainerSlideBack(void)
gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 280;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
- gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy);
gBattlerControllerFuncs[gActiveBattler] = sub_805F240;
}
@@ -1855,7 +1855,7 @@ static void OpponentHandleIntroTrainerBallThrow(void)
gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 280;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
- gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], sub_806280C);
diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c
index 3fabf25f8..49629198c 100644
--- a/src/battle_controller_player.c
+++ b/src/battle_controller_player.c
@@ -114,7 +114,7 @@ static void MoveSelectionDisplayPpNumber(void);
static void MoveSelectionDisplayPpString(void);
static void MoveSelectionDisplayMoveType(void);
static void MoveSelectionDisplayMoveNames(void);
-static void HandleMoveSwitchting(void);
+static void HandleMoveSwitching(void);
static void sub_8058FC0(void);
static void WaitForMonSelection(void);
static void CompleteWhenChoseItem(void);
@@ -617,7 +617,7 @@ static void HandleInputChooseMove(void)
MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 27);
BattlePutTextOnWindow(gText_BattleSwitchWhich, 0xB);
- gBattlerControllerFuncs[gActiveBattler] = HandleMoveSwitchting;
+ gBattlerControllerFuncs[gActiveBattler] = HandleMoveSwitching;
}
}
}
@@ -672,7 +672,7 @@ u32 sub_8057FBC(void) // unused
return var;
}
-static void HandleMoveSwitchting(void)
+static void HandleMoveSwitching(void)
{
u8 perMovePPBonuses[4];
struct ChooseMoveStruct moveStruct;
@@ -2385,7 +2385,7 @@ static void PlayerHandleTrainerSlideBack(void)
gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 50;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
- gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy);
StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1);
gBattlerControllerFuncs[gActiveBattler] = sub_80588B4;
@@ -2930,7 +2930,7 @@ static void PlayerHandleIntroTrainerBallThrow(void)
gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 50;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
- gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gActiveBattler;
StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], sub_805CC00);
diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c
index 0790cbbff..bd892c922 100644
--- a/src/battle_controller_player_partner.c
+++ b/src/battle_controller_player_partner.c
@@ -1361,7 +1361,7 @@ static void PlayerPartnerHandleTrainerSlideBack(void)
gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
- gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy);
gBattlerControllerFuncs[gActiveBattler] = sub_81BAE98;
}
@@ -1785,7 +1785,7 @@ static void PlayerPartnerHandleIntroTrainerBallThrow(void)
gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 50;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
- gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gActiveBattler;
StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], sub_805CC00);
diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c
index 83c4965ea..b54e61255 100644
--- a/src/battle_controller_recorded_opponent.c
+++ b/src/battle_controller_recorded_opponent.c
@@ -1275,7 +1275,7 @@ static void RecordedOpponentHandleTrainerSlideBack(void)
gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 280;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
- gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy);
gBattlerControllerFuncs[gActiveBattler] = sub_81865C8;
}
@@ -1649,7 +1649,7 @@ static void RecordedOpponentHandleIntroTrainerBallThrow(void)
gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 280;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
- gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], sub_818962C);
diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c
index cbb46a940..17b115caa 100644
--- a/src/battle_controller_recorded_player.c
+++ b/src/battle_controller_recorded_player.c
@@ -1276,7 +1276,7 @@ static void RecordedPlayerHandleTrainerSlideBack(void)
gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
- gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy);
gBattlerControllerFuncs[gActiveBattler] = sub_81899F0;
}
@@ -1671,7 +1671,7 @@ static void RecordedPlayerHandleIntroTrainerBallThrow(void)
gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 50;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
- gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gActiveBattler;
StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], sub_805CC00);
diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c
index 922c5d80b..1a3a2d53d 100644
--- a/src/battle_controller_wally.c
+++ b/src/battle_controller_wally.c
@@ -1435,7 +1435,7 @@ static void WallyHandleIntroTrainerBallThrow(void)
gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 50;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y;
- gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_80A6EEC;
+ gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gActiveBattler;
StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], sub_805CC00);
diff --git a/src/battle_dome.c b/src/battle_dome.c
index c4cb24204..152a11ae8 100644
--- a/src/battle_dome.c
+++ b/src/battle_dome.c
@@ -63,9 +63,9 @@ extern u8 GetFrontierBrainMonNature(u8);
extern void sub_81A4C30(void);
extern u8 sub_81A3610(void);
extern u16 GetFrontierBrainMonSpecies(u8);
-extern void ReducePlayerPartyToThree(void);
+extern void ReducePlayerPartyToSelectedMons(void);
-extern u8 gUnknown_0203CEF8[];
+extern u8 gSelectedOrderFromParty[];
extern const u16 gBattleFrontierHeldItems[];
extern const struct FacilityMon gBattleFrontierMons[];
@@ -2465,8 +2465,8 @@ static void sub_818EA84(void)
break;
case 8:
sub_81B8558();
- gUnknown_0203CEF8[0] = gSaveBlock2Ptr->frontier.field_CB0;
- gUnknown_0203CEF8[1] = gSaveBlock2Ptr->frontier.field_CB0 >> 8;
+ gSelectedOrderFromParty[0] = gSaveBlock2Ptr->frontier.field_CB0;
+ gSelectedOrderFromParty[1] = gSaveBlock2Ptr->frontier.field_CB0 >> 8;
break;
case 9:
gSpecialVar_Result = (gSaveBlock2Ptr->frontier.field_D0A * 2) - 3 + gSaveBlock2Ptr->frontier.field_D0B;
@@ -2535,7 +2535,7 @@ static void sub_818ED28(void)
}
break;
case 8:
- gSaveBlock2Ptr->frontier.field_CB0 = T1_READ_16(gUnknown_0203CEF8);
+ gSaveBlock2Ptr->frontier.field_CB0 = T1_READ_16(gSelectedOrderFromParty);
break;
}
}
@@ -6070,7 +6070,7 @@ static void sub_8194D68(void)
for (i = 0; i < 2; i++)
{
- s32 playerMonId = gSaveBlock2Ptr->frontier.selectedPartyMons[gUnknown_0203CEF8[i] - 1] - 1;
+ s32 playerMonId = gSaveBlock2Ptr->frontier.selectedPartyMons[gSelectedOrderFromParty[i] - 1] - 1;
s32 count;
for (moveSlot = 0; moveSlot < 4; moveSlot++)
@@ -6096,7 +6096,7 @@ static void sub_8194E44(void)
for (i = 0; i < 2; i++)
{
- s32 playerMonId = gSaveBlock2Ptr->frontier.selectedPartyMons[gUnknown_0203CEF8[i] - 1] - 1;
+ s32 playerMonId = gSaveBlock2Ptr->frontier.selectedPartyMons[gSelectedOrderFromParty[i] - 1] - 1;
u16 item = GetMonData(&gSaveBlock1Ptr->playerParty[playerMonId], MON_DATA_HELD_ITEM, NULL);
SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &item);
}
@@ -6104,7 +6104,7 @@ static void sub_8194E44(void)
static void sub_8194EB4(void)
{
- ReducePlayerPartyToThree();
+ ReducePlayerPartyToSelectedMons();
}
static void sub_8194EC0(void)
diff --git a/src/battle_interface.c b/src/battle_interface.c
index ec8a06094..c7eb11293 100644
--- a/src/battle_interface.c
+++ b/src/battle_interface.c
@@ -168,15 +168,15 @@ extern const u8 gText_DynColor1Female[];
// this file's functions
static const u8 *GetHealthboxElementGfxPtr(u8 elementId);
-static u8* AddTextPrinterAndCreateWindowOnHealthbox(const u8 *str, u32 x, u32 y, u32 arg3, u32 *windowId);
+static u8* AddTextPrinterAndCreateWindowOnHealthbox(const u8 *str, u32 x, u32 y, u32 bgColor, u32 *windowId);
static void RemoveWindowOnHealthbox(u32 windowId);
static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent);
static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId);
-static void TextIntoHealthboxObject(void *dest, u8 *windowTileData, s32 arg2);
-static void SafariTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 arg2);
-static void HpTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 arg2);
+static void TextIntoHealthboxObject(void *dest, u8 *windowTileData, s32 windowWidth);
+static void SafariTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 windowWidth);
+static void HpTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 windowWidth);
static void FillHealthboxObject(void *dest, u32 arg1, u32 arg2);
static void sub_8073E08(u8 taskId);
@@ -965,7 +965,7 @@ u8 CreateBattlerHealthboxSprites(u8 battlerId)
healthBarSpritePtr->subspriteMode = 2;
healthBarSpritePtr->oam.priority = 1;
- CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_1), (void*)(OBJ_VRAM0 + healthBarSpritePtr->oam.tileNum * 32), 64);
+ CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_1), (void*)(OBJ_VRAM0 + healthBarSpritePtr->oam.tileNum * TILE_SIZE_4BPP), 64);
gSprites[healthboxLeftSpriteId].hMain_HealthBarSpriteId = healthbarSpriteId;
gSprites[healthboxLeftSpriteId].hMain_Battler = battlerId;
@@ -1154,7 +1154,7 @@ static void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl)
xPos += var1;
windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, xPos, 3, 2, &windowId);
- spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32;
+ spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * TILE_SIZE_4BPP;
if (GetBattlerSide(gSprites[healthboxSpriteId].hMain_Battler) == B_SIDE_PLAYER)
{
@@ -1182,7 +1182,7 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent)
if (GetBattlerSide(gSprites[healthboxSpriteId].hMain_Battler) == B_SIDE_PLAYER && !IsDoubleBattle())
{
- spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32;
+ spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * TILE_SIZE_4BPP;
if (maxOrCurrent != HP_CURRENT) // singles, max
{
ConvertIntToDecimalStringN(text, value, STR_CONV_MODE_RIGHT_ALIGN, 3);
@@ -1243,7 +1243,7 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent)
for (i = 0; i < 3; i++)
{
CpuCopy32(&gMonSpritesGfxPtr->barFontGfx[i * 64 + 32],
- (void*)((OBJ_VRAM0) + 32 * (gSprites[healthboxSpriteId].oam.tileNum + var + i)),
+ (void*)((OBJ_VRAM0) + TILE_SIZE_4BPP * (gSprites[healthboxSpriteId].oam.tileNum + var + i)),
0x20);
}
}
@@ -1261,7 +1261,7 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8
{
if (gBattleSpritesDataPtr->battlerData[gSprites[healthboxSpriteId].data[6]].hpNumbersNoBars) // don't print text if only bars are visible
{
- spriteTileNum = gSprites[gSprites[healthboxSpriteId].data[5]].oam.tileNum * 32;
+ spriteTileNum = gSprites[gSprites[healthboxSpriteId].data[5]].oam.tileNum * TILE_SIZE_4BPP;
objVram = (void*)(OBJ_VRAM0) + spriteTileNum;
if (maxOrCurrent != HP_CURRENT) // doubles, max hp
@@ -1271,7 +1271,7 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8
HpTextIntoHealthboxObject((void*)(OBJ_VRAM0) + spriteTileNum + 0xC0, windowTileData, 2);
RemoveWindowOnHealthbox(windowId);
CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_116),
- (void*)(OBJ_VRAM0 + 0x680) + (gSprites[healthboxSpriteId].oam.tileNum * 32),
+ (void*)(OBJ_VRAM0 + 0x680) + (gSprites[healthboxSpriteId].oam.tileNum * TILE_SIZE_4BPP),
0x20);
}
else
@@ -1328,16 +1328,16 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8
if (maxOrCurrent == HP_CURRENT)
{
CpuCopy32(&gMonSpritesGfxPtr->barFontGfx[224],
- (void*)((OBJ_VRAM0) + ((gSprites[r7].oam.tileNum + 4) * 32)),
+ (void*)((OBJ_VRAM0) + ((gSprites[r7].oam.tileNum + 4) * TILE_SIZE_4BPP)),
0x20);
- CpuFill32(0, (void*)((OBJ_VRAM0) + (gSprites[r7].oam.tileNum * 32)), 0x20);
+ CpuFill32(0, (void*)((OBJ_VRAM0) + (gSprites[r7].oam.tileNum * TILE_SIZE_4BPP)), 0x20);
}
else
{
if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) // Impossible to reach part, because the battlerId is from the opponent's side.
{
CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_116),
- (void*)(OBJ_VRAM0) + ((gSprites[healthboxSpriteId].oam.tileNum + 52) * 32),
+ (void*)(OBJ_VRAM0) + ((gSprites[healthboxSpriteId].oam.tileNum + 52) * TILE_SIZE_4BPP),
0x20);
}
}
@@ -1349,7 +1349,7 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8
static void PrintSafariMonInfo(u8 healthboxSpriteId, struct Pokemon *mon)
{
u8 text[20];
- s32 j, var2;
+ s32 j, spriteTileNum;
u8 *barFontGfx;
u8 i, var, nature, healthBarSpriteId;
@@ -1376,12 +1376,12 @@ static void PrintSafariMonInfo(u8 healthboxSpriteId, struct Pokemon *mon)
for (j = 1; j < var + 1; j++)
{
- var2 = (gSprites[healthboxSpriteId].oam.tileNum + (j - (j / 8 * 8)) + (j / 8 * 64)) * 32;
- CpuCopy32(barFontGfx, (void*)(OBJ_VRAM0) + (var2), 0x20);
+ spriteTileNum = (gSprites[healthboxSpriteId].oam.tileNum + (j - (j / 8 * 8)) + (j / 8 * 64)) * TILE_SIZE_4BPP;
+ CpuCopy32(barFontGfx, (void*)(OBJ_VRAM0) + (spriteTileNum), 0x20);
barFontGfx += 0x20;
- var2 = (8 + gSprites[healthboxSpriteId].oam.tileNum + (j - (j / 8 * 8)) + (j / 8 * 64)) * 32;
- CpuCopy32(barFontGfx, (void*)(OBJ_VRAM0) + (var2), 0x20);
+ spriteTileNum = (8 + gSprites[healthboxSpriteId].oam.tileNum + (j - (j / 8 * 8)) + (j / 8 * 64)) * TILE_SIZE_4BPP;
+ CpuCopy32(barFontGfx, (void*)(OBJ_VRAM0) + (spriteTileNum), 0x20);
barFontGfx += 0x20;
}
@@ -1398,13 +1398,13 @@ static void PrintSafariMonInfo(u8 healthboxSpriteId, struct Pokemon *mon)
if (j <= 1)
{
CpuCopy32(&gMonSpritesGfxPtr->barFontGfx[0x40 * j + 0x20],
- (void*)(OBJ_VRAM0) + (gSprites[healthBarSpriteId].oam.tileNum + 2 + j) * 32,
+ (void*)(OBJ_VRAM0) + (gSprites[healthBarSpriteId].oam.tileNum + 2 + j) * TILE_SIZE_4BPP,
32);
}
else
{
CpuCopy32(&gMonSpritesGfxPtr->barFontGfx[0x40 * j + 0x20],
- (void*)(OBJ_VRAM0 + 0xC0) + (j + gSprites[healthBarSpriteId].oam.tileNum) * 32,
+ (void*)(OBJ_VRAM0 + 0xC0) + (j + gSprites[healthBarSpriteId].oam.tileNum) * TILE_SIZE_4BPP,
32);
}
}
@@ -1436,7 +1436,7 @@ void SwapHpBarsWithHpText(void)
{
healthBarSpriteId = gSprites[gHealthboxSpriteIds[i]].hMain_HealthBarSpriteId;
- CpuFill32(0, (void*)(OBJ_VRAM0 + gSprites[healthBarSpriteId].oam.tileNum * 32), 0x100);
+ CpuFill32(0, (void*)(OBJ_VRAM0 + gSprites[healthBarSpriteId].oam.tileNum * TILE_SIZE_4BPP), 0x100);
UpdateHpTextInHealthboxInDoubles(gHealthboxSpriteIds[i], GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_HP), HP_CURRENT);
UpdateHpTextInHealthboxInDoubles(gHealthboxSpriteIds[i], GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_MAX_HP), HP_MAX);
}
@@ -1444,7 +1444,7 @@ void SwapHpBarsWithHpText(void)
{
UpdateStatusIconInHealthbox(gHealthboxSpriteIds[i]);
UpdateHealthboxAttribute(gHealthboxSpriteIds[i], &gPlayerParty[gBattlerPartyIndexes[i]], HEALTHBOX_HEALTH_BAR);
- CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_117), (void*)(OBJ_VRAM0 + 0x680 + gSprites[gHealthboxSpriteIds[i]].oam.tileNum * 32), 32);
+ CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_117), (void*)(OBJ_VRAM0 + 0x680 + gSprites[gHealthboxSpriteIds[i]].oam.tileNum * TILE_SIZE_4BPP), 32);
}
}
else
@@ -1970,7 +1970,7 @@ static void UpdateNickInHealthbox(u8 healthboxSpriteId, struct Pokemon *mon)
break;
}
- spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32;
+ spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * TILE_SIZE_4BPP;
if (GetBattlerSide(gSprites[healthboxSpriteId].data[6]) == B_SIDE_PLAYER)
{
@@ -2008,9 +2008,9 @@ static void TryAddPokeballIconToHealthbox(u8 healthboxSpriteId, bool8 noStatus)
healthBarSpriteId = gSprites[healthboxSpriteId].hMain_HealthBarSpriteId;
if (noStatus)
- CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_70), (void*)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 8) * 32), 32);
+ CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_70), (void*)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 8) * TILE_SIZE_4BPP), 32);
else
- CpuFill32(0, (void*)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 8) * 32), 32);
+ CpuFill32(0, (void*)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 8) * TILE_SIZE_4BPP), 32);
}
static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId)
@@ -2068,10 +2068,10 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId)
statusGfxPtr = GetHealthboxElementGfxPtr(HEALTHBOX_GFX_39);
for (i = 0; i < 3; i++)
- CpuCopy32(statusGfxPtr, (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId].oam.tileNum + tileNumAdder + i) * 32), 32);
+ CpuCopy32(statusGfxPtr, (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId].oam.tileNum + tileNumAdder + i) * TILE_SIZE_4BPP), 32);
if (!gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars)
- CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_1), (void *)(OBJ_VRAM0 + gSprites[healthBarSpriteId].oam.tileNum * 32), 64);
+ CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_1), (void *)(OBJ_VRAM0 + gSprites[healthBarSpriteId].oam.tileNum * TILE_SIZE_4BPP), 64);
TryAddPokeballIconToHealthbox(healthboxSpriteId, TRUE);
return;
@@ -2082,13 +2082,13 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId)
FillPalette(sStatusIconColors[statusPalId], pltAdder + 0x100, 2);
CpuCopy16(gPlttBufferUnfaded + 0x100 + pltAdder, (void*)(OBJ_PLTT + pltAdder * 2), 2);
- CpuCopy32(statusGfxPtr, (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId].oam.tileNum + tileNumAdder) * 32), 96);
+ CpuCopy32(statusGfxPtr, (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId].oam.tileNum + tileNumAdder) * TILE_SIZE_4BPP), 96);
if (IsDoubleBattle() == TRUE || GetBattlerSide(battlerId) == B_SIDE_OPPONENT)
{
if (!gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars)
{
- CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_0), (void*)(OBJ_VRAM0 + gSprites[healthBarSpriteId].oam.tileNum * 32), 32);
- CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_65), (void*)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 1) * 32), 32);
+ CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_0), (void*)(OBJ_VRAM0 + gSprites[healthBarSpriteId].oam.tileNum * TILE_SIZE_4BPP), 32);
+ CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_65), (void*)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 1) * TILE_SIZE_4BPP), 32);
}
}
TryAddPokeballIconToHealthbox(healthboxSpriteId, FALSE);
@@ -2160,7 +2160,7 @@ static void UpdateSafariBallsTextOnHealthbox(u8 healthboxSpriteId)
u8 *windowTileData;
windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(gText_SafariBalls, 0, 3, 2, &windowId);
- spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32;
+ spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * TILE_SIZE_4BPP;
TextIntoHealthboxObject((void*)(OBJ_VRAM0 + 0x40) + spriteTileNum, windowTileData, 6);
TextIntoHealthboxObject((void*)(OBJ_VRAM0 + 0x800) + spriteTileNum, windowTileData + 0xC0, 2);
RemoveWindowOnHealthbox(windowId);
@@ -2177,7 +2177,7 @@ static void UpdateLeftNoOfBallsTextOnHealthbox(u8 healthboxSpriteId)
ConvertIntToDecimalStringN(txtPtr, gNumSafariBalls, STR_CONV_MODE_LEFT_ALIGN, 2);
windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, GetStringRightAlignXOffset(0, text, 0x2F), 3, 2, &windowId);
- spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32;
+ spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * TILE_SIZE_4BPP;
SafariTextIntoHealthboxObject((void*)(OBJ_VRAM0 + 0x2C0) + spriteTileNum, windowTileData, 2);
SafariTextIntoHealthboxObject((void*)(OBJ_VRAM0 + 0xA00) + spriteTileNum, windowTileData + 0x40, 4);
RemoveWindowOnHealthbox(windowId);
@@ -2323,10 +2323,10 @@ static void MoveBattleBarGraphically(u8 battlerId, u8 whichBar)
u8 healthbarSpriteId = gSprites[gBattleSpritesDataPtr->battleBars[battlerId].healthboxSpriteId].hMain_HealthBarSpriteId;
if (i < 2)
CpuCopy32(GetHealthboxElementGfxPtr(barElementId) + array[i] * 32,
- (void*)(OBJ_VRAM0 + (gSprites[healthbarSpriteId].oam.tileNum + 2 + i) * 32), 32);
+ (void*)(OBJ_VRAM0 + (gSprites[healthbarSpriteId].oam.tileNum + 2 + i) * TILE_SIZE_4BPP), 32);
else
CpuCopy32(GetHealthboxElementGfxPtr(barElementId) + array[i] * 32,
- (void*)(OBJ_VRAM0 + 64 + (i + gSprites[healthbarSpriteId].oam.tileNum) * 32), 32);
+ (void*)(OBJ_VRAM0 + 64 + (i + gSprites[healthbarSpriteId].oam.tileNum) * TILE_SIZE_4BPP), 32);
}
break;
case EXP_BAR:
@@ -2345,10 +2345,10 @@ static void MoveBattleBarGraphically(u8 battlerId, u8 whichBar)
{
if (i < 4)
CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_12) + array[i] * 32,
- (void*)(OBJ_VRAM0 + (gSprites[gBattleSpritesDataPtr->battleBars[battlerId].healthboxSpriteId].oam.tileNum + 0x24 + i) * 32), 32);
+ (void*)(OBJ_VRAM0 + (gSprites[gBattleSpritesDataPtr->battleBars[battlerId].healthboxSpriteId].oam.tileNum + 0x24 + i) * TILE_SIZE_4BPP), 32);
else
CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_12) + array[i] * 32,
- (void*)(OBJ_VRAM0 + 0xB80 + (i + gSprites[gBattleSpritesDataPtr->battleBars[battlerId].healthboxSpriteId].oam.tileNum) * 32), 32);
+ (void*)(OBJ_VRAM0 + 0xB80 + (i + gSprites[gBattleSpritesDataPtr->battleBars[battlerId].healthboxSpriteId].oam.tileNum) * TILE_SIZE_4BPP), 32);
}
break;
}
@@ -2571,16 +2571,16 @@ u8 GetHPBarLevel(s16 hp, s16 maxhp)
return result;
}
-static u8* AddTextPrinterAndCreateWindowOnHealthbox(const u8 *str, u32 x, u32 y, u32 arg3, u32 *windowId)
+static u8* AddTextPrinterAndCreateWindowOnHealthbox(const u8 *str, u32 x, u32 y, u32 bgColor, u32 *windowId)
{
u16 winId;
u8 color[3];
struct WindowTemplate winTemplate = sHealthboxWindowTemplate;
winId = AddWindow(&winTemplate);
- FillWindowPixelBuffer(winId, (arg3 << 4) | (arg3));
+ FillWindowPixelBuffer(winId, (bgColor << 4) | (bgColor));
- color[0] = arg3;
+ color[0] = bgColor;
color[1] = 1;
color[2] = 3;
@@ -2597,31 +2597,31 @@ static void RemoveWindowOnHealthbox(u32 windowId)
static void FillHealthboxObject(void *dest, u32 arg1, u32 arg2)
{
- CpuFill32(0x11111111 * arg1, dest, arg2 * 32);
+ CpuFill32(0x11111111 * arg1, dest, arg2 * TILE_SIZE_4BPP);
}
-static void HpTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 arg2)
+static void HpTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 windowWidth)
{
- CpuCopy32(windowTileData + 256, dest, arg2 * 32);
+ CpuCopy32(windowTileData + 256, dest, windowWidth * TILE_SIZE_4BPP);
}
-static void TextIntoHealthboxObject(void *dest, u8 *windowTileData, s32 arg2)
+static void TextIntoHealthboxObject(void *dest, u8 *windowTileData, s32 windowWidth)
{
- CpuCopy32(windowTileData + 256, dest + 256, arg2 * 32);
-
- if (arg2 > 0)
+ CpuCopy32(windowTileData + 256, dest + 256, windowWidth * TILE_SIZE_4BPP);
+// + 256 as that prevents the top 4 blank rows of sHealthboxWindowTemplate from being copied
+ if (windowWidth > 0)
{
do
{
CpuCopy32(windowTileData + 20, dest + 20, 12);
dest += 32, windowTileData += 32;
- arg2--;
- } while (arg2 != 0);
+ windowWidth--;
+ } while (windowWidth != 0);
}
}
-static void SafariTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 arg2)
+static void SafariTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 windowWidth)
{
- CpuCopy32(windowTileData, dest, arg2 * 32);
- CpuCopy32(windowTileData + 256, dest + 256, arg2 * 32);
+ CpuCopy32(windowTileData, dest, windowWidth * TILE_SIZE_4BPP);
+ CpuCopy32(windowTileData + 256, dest + 256, windowWidth * TILE_SIZE_4BPP);
}
diff --git a/src/battle_main.c b/src/battle_main.c
index 116f5963a..8bdd2220b 100644
--- a/src/battle_main.c
+++ b/src/battle_main.c
@@ -166,7 +166,7 @@ static void HandleAction_WatchesCarefully(void);
static void HandleAction_SafariZoneBallThrow(void);
static void HandleAction_ThrowPokeblock(void);
static void HandleAction_GoNear(void);
-static void HandleAction_SafriZoneRun(void);
+static void HandleAction_SafariZoneRun(void);
static void HandleAction_WallyBallThrow(void);
static void HandleAction_Action11(void);
static void HandleAction_NothingIsFainted(void);
@@ -515,7 +515,7 @@ static void (* const sTurnActionsFuncsTable[])(void) =
HandleAction_SafariZoneBallThrow, // B_ACTION_SAFARI_BALL
HandleAction_ThrowPokeblock, // B_ACTION_SAFARI_POKEBLOCK
HandleAction_GoNear, // B_ACTION_SAFARI_GO_NEAR
- HandleAction_SafriZoneRun, // B_ACTION_SAFARI_RUN
+ HandleAction_SafariZoneRun, // B_ACTION_SAFARI_RUN
HandleAction_WallyBallThrow, // B_ACTION_WALLY_THROW
HandleAction_RunBattleScript, // B_ACTION_EXEC_SCRIPT
HandleAction_Action11, // not sure about this one
@@ -5783,7 +5783,7 @@ static void HandleAction_GoNear(void)
gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;
}
-static void HandleAction_SafriZoneRun(void)
+static void HandleAction_SafariZoneRun(void)
{
gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber];
PlaySE(SE_NIGERU);
diff --git a/src/battle_message.c b/src/battle_message.c
index 44ea5d7d7..47c4cbe1d 100644
--- a/src/battle_message.c
+++ b/src/battle_message.c
@@ -1,25 +1,25 @@
#include "global.h"
#include "battle.h"
+#include "battle_controllers.h"
#include "battle_message.h"
-#include "constants/battle_string_ids.h"
-#include "constants/moves.h"
-#include "text.h"
-#include "string_util.h"
-#include "constants/items.h"
-#include "constants/trainers.h"
+#include "battle_setup.h"
+#include "battle_tower.h"
+#include "data2.h"
#include "event_data.h"
-#include "link.h"
+#include "frontier_util.h"
+#include "international_string_util.h"
#include "item.h"
-#include "window.h"
-#include "palette.h"
-#include "battle_controllers.h"
-#include "battle_setup.h"
+#include "link.h"
#include "menu.h"
+#include "palette.h"
#include "recorded_battle.h"
-#include "international_string_util.h"
-#include "frontier_util.h"
-#include "battle_tower.h"
-#include "data2.h"
+#include "string_util.h"
+#include "text.h"
+#include "window.h"
+#include "constants/battle_string_ids.h"
+#include "constants/items.h"
+#include "constants/moves.h"
+#include "constants/trainers.h"
struct BattleWindowText
{
@@ -1367,7 +1367,8 @@ static const u8 sDummyWeirdStatusString[] = {EOS, EOS, EOS, EOS, EOS, EOS, EOS,
static const struct BattleWindowText sTextOnWindowsInfo_Normal[] =
{
- { // 0
+// The corresponding WindowTemplate is gStandardBattleWindowTemplates[] within src/battle_bg.c
+ { // 0 Standard battle message
.fillValue = 0xFF,
.fontId = 1,
.x = 0,
@@ -1379,7 +1380,7 @@ static const struct BattleWindowText sTextOnWindowsInfo_Normal[] =
.bgColor = 15,
.shadowColor = 6,
},
- { // 1
+ { // 1 "What will (pokemon) do?"
.fillValue = 0xFF,
.fontId = 1,
.x = 1,
@@ -1391,7 +1392,7 @@ static const struct BattleWindowText sTextOnWindowsInfo_Normal[] =
.bgColor = 15,
.shadowColor = 6,
},
- { // 2
+ { // 2 "Fight/Pokemon/Bag/Run"
.fillValue = 0xEE,
.fontId = 1,
.x = 0,
@@ -1403,7 +1404,7 @@ static const struct BattleWindowText sTextOnWindowsInfo_Normal[] =
.bgColor = 14,
.shadowColor = 15,
},
- { // 3
+ { // 3 Top left move
.fillValue = 0xEE,
.fontId = 7,
.x = 0,
@@ -1415,7 +1416,7 @@ static const struct BattleWindowText sTextOnWindowsInfo_Normal[] =
.bgColor = 14,
.shadowColor = 15,
},
- { // 4
+ { // 4 Top right move
.fillValue = 0xEE,
.fontId = 7,
.x = 0,
@@ -1427,7 +1428,7 @@ static const struct BattleWindowText sTextOnWindowsInfo_Normal[] =
.bgColor = 14,
.shadowColor = 15,
},
- { // 5
+ { // 5 Bottom left move
.fillValue = 0xEE,
.fontId = 7,
.x = 0,
@@ -1439,7 +1440,7 @@ static const struct BattleWindowText sTextOnWindowsInfo_Normal[] =
.bgColor = 14,
.shadowColor = 15,
},
- { // 6
+ { // 6 Bottom right move
.fillValue = 0xEE,
.fontId = 7,
.x = 0,
@@ -1451,7 +1452,7 @@ static const struct BattleWindowText sTextOnWindowsInfo_Normal[] =
.bgColor = 14,
.shadowColor = 15,
},
- { // 7
+ { // 7 "PP"
.fillValue = 0xEE,
.fontId = 7,
.x = 0,
@@ -1475,7 +1476,7 @@ static const struct BattleWindowText sTextOnWindowsInfo_Normal[] =
.bgColor = 14,
.shadowColor = 15,
},
- { // 9
+ { // 9 PP remaining
.fillValue = 0xEE,
.fontId = 1,
.x = 2,
@@ -1487,7 +1488,7 @@ static const struct BattleWindowText sTextOnWindowsInfo_Normal[] =
.bgColor = 14,
.shadowColor = 11,
},
- { // 10
+ { // 10 "type"
.fillValue = 0xEE,
.fontId = 7,
.x = 0,
@@ -1499,7 +1500,7 @@ static const struct BattleWindowText sTextOnWindowsInfo_Normal[] =
.bgColor = 14,
.shadowColor = 15,
},
- { // 11
+ { // 11 "switch which?"
.fillValue = 0xEE,
.fontId = 7,
.x = 0,
@@ -1511,7 +1512,7 @@ static const struct BattleWindowText sTextOnWindowsInfo_Normal[] =
.bgColor = 14,
.shadowColor = 15,
},
- { // 12
+ { // 12 "gText_BattleYesNoChoice"
.fillValue = 0xEE,
.fontId = 1,
.x = 0,
diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c
index 01f138925..4bbc74dee 100644
--- a/src/battle_pyramid.c
+++ b/src/battle_pyramid.c
@@ -29,7 +29,7 @@
#include "constants/maps.h"
#include "constants/moves.h"
-extern u8 gUnknown_0203CEF8[3];
+extern u8 gSelectedOrderFromParty[3];
extern void door_upload_tiles(void);
extern const struct MapLayout *const gMapLayouts[];
@@ -550,14 +550,14 @@ static void sub_81A9834(void)
SetMonMoveSlot(&gPlayerParty[j], MOVE_SKETCH, k);
}
gSaveBlock1Ptr->playerParty[id] = gPlayerParty[j];
- gUnknown_0203CEF8[j] = id + 1;
+ gSelectedOrderFromParty[j] = id + 1;
break;
}
}
}
for (i = 0; i < 3; i++)
- gSaveBlock2Ptr->frontier.selectedPartyMons[i] = gUnknown_0203CEF8[i];
+ gSaveBlock2Ptr->frontier.selectedPartyMons[i] = gSelectedOrderFromParty[i];
}
static u8 sub_81A9998(s32 *arg0, u8 arg1, u8 arg2)
diff --git a/src/bug.c b/src/bug.c
index a14ec2226..59b31b37d 100644
--- a/src/bug.c
+++ b/src/bug.c
@@ -1,15 +1,22 @@
#include "global.h"
#include "battle_anim.h"
+#include "gpu_regs.h"
+#include "trig.h"
#include "constants/rgb.h"
-extern void sub_8110368(struct Sprite *);
-extern void sub_8110438(struct Sprite *);
-extern void sub_81104E4(struct Sprite *);
-extern void sub_81105B4(struct Sprite *);
-extern void sub_811067C(struct Sprite *);
-extern void sub_8110720(struct Sprite *);
-extern void sub_8110850(struct Sprite *);
-extern void sub_8110994(struct Sprite *);
+void sub_8110368(struct Sprite *);
+void sub_8110438(struct Sprite *);
+void sub_81104E4(struct Sprite *);
+void sub_81105B4(struct Sprite *);
+void sub_811067C(struct Sprite *);
+void AnimTranslateStinger(struct Sprite *);
+void AnimMissileArc(struct Sprite *);
+void sub_8110994(struct Sprite *);
+static void sub_811057C(struct Sprite *);
+static void sub_8110630(struct Sprite *);
+static void sub_81106A4(struct Sprite *);
+static void sub_8110700(struct Sprite *);
+static void AnimMissileArcStep(struct Sprite *);
const union AffineAnimCmd gUnknown_08596938[] =
{
@@ -136,7 +143,7 @@ const struct SpriteTemplate gLinearStingerSpriteTemplate =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_8110720,
+ .callback = AnimTranslateStinger,
};
const struct SpriteTemplate gPinMissileSpriteTemplate =
@@ -147,7 +154,7 @@ const struct SpriteTemplate gPinMissileSpriteTemplate =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_8110850,
+ .callback = AnimMissileArc,
};
const struct SpriteTemplate gIcicleSpearSpriteTemplate =
@@ -158,7 +165,7 @@ const struct SpriteTemplate gIcicleSpearSpriteTemplate =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_8110850,
+ .callback = AnimMissileArc,
};
const union AffineAnimCmd gUnknown_08596A8C[] =
@@ -187,3 +194,291 @@ const struct SpriteTemplate gUnknown_08596AC8 =
.affineAnims = gUnknown_08596AC4,
.callback = sub_8110994,
};
+
+void sub_8110368(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);
+}
+
+void sub_8110438(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);
+}
+
+void sub_81104E4(struct Sprite *sprite)
+{
+ if (IsContest())
+ gBattleAnimArgs[2] /= 2;
+
+ InitAnimSpritePos(sprite, 1);
+ 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_80A6FD4(sprite);
+ sprite->data[5] = gBattleAnimArgs[3];
+ sprite->callback = sub_811057C;
+}
+
+static void sub_811057C(struct Sprite *sprite)
+{
+ if (TranslateAnimLinear(sprite))
+ {
+ DestroyAnimSprite(sprite);
+ return;
+ }
+
+ sprite->pos2.x += Sin(sprite->data[6], sprite->data[5]);
+ sprite->data[6] = (sprite->data[6] + 13) & 0xFF;
+}
+
+void sub_81105B4(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_8110630;
+}
+
+static void sub_8110630(struct Sprite *sprite)
+{
+ if (++sprite->data[0] == 3)
+ {
+ sprite->data[0] = 0;
+ sprite->invisible ^= 1;
+ }
+
+ if (++sprite->data[1] == 51)
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void sub_811067C(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_81106A4;
+}
+
+static void sub_81106A4(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_8110700;
+ }
+ }
+}
+
+static void sub_8110700(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
+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;
+ }
+ }
+
+ InitAnimSpritePos(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;
+ sub_80A73E0(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
+void AnimMissileArc(struct Sprite *sprite)
+{
+ InitAnimSpritePos(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 (TranslateAnimArc(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;
+ int i;
+
+ for (i = 0; i < 8; i++)
+ tempData[i] = data[i];
+
+ x2 += x1;
+ y2 += y1;
+
+ if (!TranslateAnimArc(sprite))
+ {
+ u16 rotation = ArcTan2Neg(sprite->pos1.x + sprite->pos2.x - x2,
+ sprite->pos1.y + sprite->pos2.y - y2);
+ rotation += 0xC000;
+ sub_80A73E0(sprite, FALSE, 0x100, 0x100, rotation);
+
+ for (i = 0; i < 8; i++)
+ data[i] = tempData[i];
+ }
+ }
+}
+
+void sub_8110994(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, move_anim_8074EE0);
+ sprite->callback = sub_80A67BC;
+}
diff --git a/src/cable_club.c b/src/cable_club.c
index b0e5f0500..56154d5bf 100644
--- a/src/cable_club.c
+++ b/src/cable_club.c
@@ -31,7 +31,7 @@
#include "constants/songs.h"
extern u8 gUnknown_02032298[2];
-extern u8 gUnknown_0203CEF8[];
+extern u8 gSelectedOrderFromParty[];
static const struct WindowTemplate gUnknown_08550594 = {
.bg = 0,
@@ -358,8 +358,8 @@ static void sub_80B2918(u8 taskId)
sub_800AA04(gFieldLinkPlayerCount);
card = (struct TrainerCard *)gBlockSendBuffer;
TrainerCard_GenerateCardForPlayer(card);
- card->monSpecies[0] = GetMonData(&gPlayerParty[gUnknown_0203CEF8[0] - 1], MON_DATA_SPECIES, NULL);
- card->monSpecies[1] = GetMonData(&gPlayerParty[gUnknown_0203CEF8[1] - 1], MON_DATA_SPECIES, NULL);
+ card->monSpecies[0] = GetMonData(&gPlayerParty[gSelectedOrderFromParty[0] - 1], MON_DATA_SPECIES, NULL);
+ card->monSpecies[1] = GetMonData(&gPlayerParty[gSelectedOrderFromParty[1] - 1], MON_DATA_SPECIES, NULL);
gTasks[taskId].func = sub_80B2C30;
}
}
@@ -405,8 +405,8 @@ static void sub_80B2A08(u8 taskId)
sub_800AA04(gFieldLinkPlayerCount);
card = (struct TrainerCard *)gBlockSendBuffer;
TrainerCard_GenerateCardForPlayer(card);
- card->monSpecies[0] = GetMonData(&gPlayerParty[gUnknown_0203CEF8[0] - 1], MON_DATA_SPECIES, NULL);
- card->monSpecies[1] = GetMonData(&gPlayerParty[gUnknown_0203CEF8[1] - 1], MON_DATA_SPECIES, NULL);
+ card->monSpecies[0] = GetMonData(&gPlayerParty[gSelectedOrderFromParty[0] - 1], MON_DATA_SPECIES, NULL);
+ card->monSpecies[1] = GetMonData(&gPlayerParty[gSelectedOrderFromParty[1] - 1], MON_DATA_SPECIES, NULL);
gTasks[taskId].func = sub_80B2C30;
sub_800A4D8(2);
}
@@ -800,7 +800,7 @@ static void sub_80B3260(int a0)
gBattleTypeFlags = BATTLE_TYPE_DOUBLE | BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER;
break;
case 5:
- ReducePlayerPartyToThree();
+ ReducePlayerPartyToSelectedMons();
gBattleTypeFlags = BATTLE_TYPE_DOUBLE | BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER | BATTLE_TYPE_MULTI;
break;
case 9:
diff --git a/src/contest_ai.c b/src/contest_ai.c
index 3324ddf87..1342ea102 100644
--- a/src/contest_ai.c
+++ b/src/contest_ai.c
@@ -4,8 +4,6 @@
#include "contest_ai.h"
#include "contest_effect.h"
-extern u16 gContestMonConditions[];
-
extern const u8 *gAIScriptPtr;
extern const u8 *gContestAIs[];
diff --git a/src/data/pokemon_graphics/back_pic_coordinates.h b/src/data/pokemon_graphics/back_pic_coordinates.h
index 877bf3475..29d0ff32e 100644
--- a/src/data/pokemon_graphics/back_pic_coordinates.h
+++ b/src/data/pokemon_graphics/back_pic_coordinates.h
@@ -47,211 +47,212 @@ const struct MonCoords gMonBackPicCoords[] =
{0x66, 0x0a}, // SPECIES_GLOOM
{0x87, 0x07}, // SPECIES_VILEPLUME
{0x63, 0x14}, // SPECIES_PARAS
- {0x87, 0x07}, // SPECIES_VENONAT
- {0x77, 0x06}, // SPECIES_VENOMOTH
- {0x77, 0x04}, // SPECIES_DIGLETT
- {0x54, 0x10}, // SPECIES_DUGTRIO
- {0x66, 0x0b}, // SPECIES_MEOWTH
- {0x65, 0x0c}, // SPECIES_PERSIAN
- {0x87, 0x07}, // SPECIES_PSYDUCK
- {0x67, 0x07}, // SPECIES_GOLDUCK
- {0x77, 0x05}, // SPECIES_MANKEY
- {0x76, 0x0b}, // SPECIES_PRIMEAPE
- {0x77, 0x07}, // SPECIES_GROWLITHE
- {0x66, 0x08}, // SPECIES_ARCANINE
- {0x87, 0x06}, // SPECIES_POLIWAG
- {0x74, 0x10}, // SPECIES_POLIWHIRL
- {0x65, 0x0c}, // SPECIES_POLIWRATH
- {0x86, 0x0b}, // SPECIES_ABRA
- {0x66, 0x0b}, // SPECIES_KADABRA
- {0x76, 0x08}, // SPECIES_ALAKAZAM
- {0x67, 0x05}, // SPECIES_MACHOP
- {0x65, 0x0c}, // SPECIES_MACHOKE
- {0x76, 0x09}, // SPECIES_MACHAMP
- {0x67, 0x04}, // SPECIES_BELLSPROUT
- {0x66, 0x0a}, // SPECIES_WEEPINBELL
- {0x66, 0x09}, // SPECIES_VICTREEBEL
- {0x87, 0x06}, // SPECIES_TENTACOOL
- {0x56, 0x0a}, // SPECIES_TENTACRUEL
- {0x86, 0x0b}, // SPECIES_GEODUDE
- {0x66, 0x0b}, // SPECIES_GRAVELER
- {0x75, 0x0c}, // SPECIES_GOLEM
- {0x84, 0x10}, // SPECIES_PONYTA
- {0x66, 0x09}, // SPECIES_RAPIDASH
- {0x87, 0x05}, // SPECIES_SLOWPOKE
- {0x85, 0x0e}, // SPECIES_SLOWBRO
- {0x86, 0x0a}, // SPECIES_MAGNEMITE
- {0x43, 0x14}, // SPECIES_MAGNETON
+ {0x87, 0x07}, // SPECIES_PARASECT
+ {0x77, 0x06}, // SPECIES_VENONAT
+ {0x77, 0x04}, // SPECIES_VENOMOTH
+ {0x54, 0x10}, // SPECIES_DIGLETT
+ {0x66, 0x0b}, // SPECIES_DUGTRIO
+ {0x65, 0x0c}, // SPECIES_MEOWTH
+ {0x87, 0x07}, // SPECIES_PERSIAN
+ {0x67, 0x07}, // SPECIES_PSYDUCK
+ {0x77, 0x05}, // SPECIES_GOLDUCK
+ {0x76, 0x0b}, // SPECIES_MANKEY
+ {0x77, 0x07}, // SPECIES_PRIMEAPE
+ {0x66, 0x08}, // SPECIES_GROWLITHE
+ {0x87, 0x06}, // SPECIES_ARCANINE
+ {0x74, 0x10}, // SPECIES_POLIWAG
+ {0x65, 0x0c}, // SPECIES_POLIWHIRL
+ {0x86, 0x0b}, // SPECIES_POLIWRATH
+ {0x66, 0x0b}, // SPECIES_ABRA
+ {0x76, 0x08}, // SPECIES_KADABRA
+ {0x67, 0x05}, // SPECIES_ALAKAZAM
+ {0x65, 0x0c}, // SPECIES_MACHOP
+ {0x76, 0x09}, // SPECIES_MACHOKE
+ {0x67, 0x04}, // SPECIES_MACHAMP
+ {0x66, 0x0a}, // SPECIES_BELLSPROUT
+ {0x66, 0x09}, // SPECIES_WEEPINBELL
+ {0x87, 0x06}, // SPECIES_VICTREEBEL
+ {0x56, 0x0a}, // SPECIES_TENTACOOL
+ {0x86, 0x0b}, // SPECIES_TENTACRUEL
+ {0x66, 0x0b}, // SPECIES_GEODUDE
+ {0x75, 0x0c}, // SPECIES_GRAVELER
+ {0x84, 0x10}, // SPECIES_GOLEM
+ {0x66, 0x09}, // SPECIES_PONYTA
+ {0x87, 0x05}, // SPECIES_RAPIDASH
+ {0x85, 0x0e}, // SPECIES_SLOWPOKE
+ {0x86, 0x0a}, // SPECIES_SLOWBRO
+ {0x43, 0x14}, // SPECIES_MAGNEMITE
+ {0x66, 0x0a}, // SPECIES_MAGNETON
{0x66, 0x0a}, // SPECIES_FARFETCHD
- {0x66, 0x0a}, // SPECIES_DODUO
- {0x66, 0x08}, // SPECIES_DODRIO
- {0x88, 0x01}, // SPECIES_SEEL
- {0x66, 0x0a}, // SPECIES_DEWGONG
- {0x77, 0x05}, // SPECIES_GRIMER
- {0x75, 0x0c}, // SPECIES_MUK
- {0x87, 0x05}, // SPECIES_SHELLDER
- {0x76, 0x0b}, // SPECIES_CLOYSTER
- {0x87, 0x06}, // SPECIES_GASTLY
- {0x85, 0x0e}, // SPECIES_HAUNTER
- {0x76, 0x08}, // SPECIES_GENGAR
- {0x76, 0x09}, // SPECIES_ONIX
- {0x78, 0x00}, // SPECIES_DROWZEE
- {0x65, 0x0d}, // SPECIES_HYPNO
- {0x66, 0x09}, // SPECIES_KRABBY
- {0x66, 0x0a}, // SPECIES_KINGLER
- {0x77, 0x04}, // SPECIES_VOLTORB
- {0x55, 0x0e}, // SPECIES_ELECTRODE
+ {0x66, 0x08}, // SPECIES_DODUO
+ {0x88, 0x01}, // SPECIES_DODRIO
+ {0x66, 0x0a}, // SPECIES_SEEL
+ {0x77, 0x05}, // SPECIES_DEWGONG
+ {0x75, 0x0c}, // SPECIES_GRIMER
+ {0x87, 0x05}, // SPECIES_MUK
+ {0x76, 0x0b}, // SPECIES_SHELLDER
+ {0x87, 0x06}, // SPECIES_CLOYSTER
+ {0x85, 0x0e}, // SPECIES_GASTLY
+ {0x76, 0x08}, // SPECIES_HAUNTER
+ {0x76, 0x09}, // SPECIES_GENGAR
+ {0x78, 0x00}, // SPECIES_ONIX
+ {0x65, 0x0d}, // SPECIES_DROWZEE
+ {0x66, 0x09}, // SPECIES_HYPNO
+ {0x66, 0x0a}, // SPECIES_KRABBY
+ {0x77, 0x04}, // SPECIES_KINGLER
+ {0x55, 0x0e}, // SPECIES_VOLTORB
+ {0x65, 0x0d}, // SPECIES_ELECTRODE
{0x65, 0x0d}, // SPECIES_EXEGGCUTE
- {0x65, 0x0d}, // SPECIES_EXEGGUTOR
- {0x87, 0x04}, // SPECIES_CUBONE
- {0x66, 0x0a}, // SPECIES_MAROWAK
- {0x66, 0x08}, // SPECIES_HITMONLEE
+ {0x87, 0x04}, // SPECIES_EXEGGUTOR
+ {0x66, 0x0a}, // SPECIES_CUBONE
+ {0x66, 0x08}, // SPECIES_MAROWAK
+ {0x65, 0x0c}, // SPECIES_HITMONLEE
{0x65, 0x0c}, // SPECIES_HITMONCHAN
- {0x65, 0x0c}, // SPECIES_LICKITUNG
- {0x65, 0x0e}, // SPECIES_KOFFING
- {0x66, 0x09}, // SPECIES_WEEZING
- {0x77, 0x06}, // SPECIES_RHYHORN
- {0x85, 0x0c}, // SPECIES_RHYDON
- {0x88, 0x03}, // SPECIES_CHANSEY
- {0x86, 0x0b}, // SPECIES_TANGELA
- {0x85, 0x0e}, // SPECIES_KANGASKHAN
- {0x77, 0x05}, // SPECIES_HORSEA
- {0x66, 0x09}, // SPECIES_SEADRA
+ {0x65, 0x0e}, // SPECIES_LICKITUNG
+ {0x66, 0x09}, // SPECIES_KOFFING
+ {0x77, 0x06}, // SPECIES_WEEZING
+ {0x85, 0x0c}, // SPECIES_RHYHORN
+ {0x88, 0x03}, // SPECIES_RHYDON
+ {0x86, 0x0b}, // SPECIES_CHANSEY
+ {0x85, 0x0e}, // SPECIES_TANGELA
+ {0x77, 0x05}, // SPECIES_KANGASKHAN
+ {0x66, 0x09}, // SPECIES_HORSEA
+ {0x66, 0x08}, // SPECIES_SEADRA
{0x66, 0x08}, // SPECIES_GOLDEEN
- {0x66, 0x08}, // SPECIES_SEAKING
- {0x76, 0x0b}, // SPECIES_STARYU
- {0x65, 0x0d}, // SPECIES_STARMIE
- {0x85, 0x0e}, // SPECIES_MR_MIME
- {0x85, 0x0d}, // SPECIES_SCYTHER
- {0x77, 0x07}, // SPECIES_JYNX
- {0x86, 0x0a}, // SPECIES_ELECTABUZZ
+ {0x76, 0x0b}, // SPECIES_SEAKING
+ {0x65, 0x0d}, // SPECIES_STARYU
+ {0x85, 0x0e}, // SPECIES_STARMIE
+ {0x85, 0x0d}, // SPECIES_MR_MIME
+ {0x77, 0x07}, // SPECIES_SCYTHER
+ {0x86, 0x0a}, // SPECIES_JYNX
+ {0x66, 0x08}, // SPECIES_ELECTABUZZ
{0x66, 0x08}, // SPECIES_MAGMAR
- {0x66, 0x08}, // SPECIES_PINSIR
- {0x66, 0x09}, // SPECIES_TAUROS
- {0x85, 0x0d}, // SPECIES_MAGIKARP
- {0x76, 0x09}, // SPECIES_GYARADOS
- {0x78, 0x00}, // SPECIES_LAPRAS
- {0x77, 0x04}, // SPECIES_DITTO
- {0x54, 0x11}, // SPECIES_EEVEE
+ {0x66, 0x09}, // SPECIES_PINSIR
+ {0x85, 0x0d}, // SPECIES_TAUROS
+ {0x76, 0x09}, // SPECIES_MAGIKARP
+ {0x78, 0x00}, // SPECIES_GYARADOS
+ {0x77, 0x04}, // SPECIES_LAPRAS
+ {0x54, 0x11}, // SPECIES_DITTO
+ {0x66, 0x0a}, // SPECIES_EEVEE
{0x66, 0x0a}, // SPECIES_VAPOREON
- {0x66, 0x0a}, // SPECIES_JOLTEON
- {0x87, 0x06}, // SPECIES_FLAREON
- {0x67, 0x05}, // SPECIES_PORYGON
- {0x65, 0x0d}, // SPECIES_OMANYTE
- {0x66, 0x0a}, // SPECIES_OMASTAR
- {0x66, 0x08}, // SPECIES_KABUTO
- {0x65, 0x0d}, // SPECIES_KABUTOPS
- {0x77, 0x05}, // SPECIES_AERODACTYL
- {0x86, 0x08}, // SPECIES_SNORLAX
- {0x86, 0x0b}, // SPECIES_ARTICUNO
- {0x65, 0x0c}, // SPECIES_ZAPDOS
- {0x76, 0x0b}, // SPECIES_MOLTRES
- {0x87, 0x04}, // SPECIES_DRATINI
- {0x66, 0x09}, // SPECIES_DRAGONAIR
- {0x78, 0x00}, // SPECIES_DRAGONITE
- {0x87, 0x06}, // SPECIES_MEWTWO
- {0x78, 0x01}, // SPECIES_MEW
- {0x66, 0x08}, // SPECIES_CHIKORITA
- {0x56, 0x0a}, // SPECIES_BAYLEEF
- {0x66, 0x08}, // SPECIES_MEGANIUM
- {0x78, 0x00}, // SPECIES_CYNDAQUIL
- {0x76, 0x09}, // SPECIES_QUILAVA
+ {0x87, 0x06}, // SPECIES_JOLTEON
+ {0x67, 0x05}, // SPECIES_FLAREON
+ {0x65, 0x0d}, // SPECIES_PORYGON
+ {0x66, 0x0a}, // SPECIES_OMANYTE
+ {0x66, 0x08}, // SPECIES_OMASTAR
+ {0x65, 0x0d}, // SPECIES_KABUTO
+ {0x77, 0x05}, // SPECIES_KABUTOPS
+ {0x86, 0x08}, // SPECIES_AERODACTYL
+ {0x86, 0x0b}, // SPECIES_SNORLAX
+ {0x65, 0x0c}, // SPECIES_ARTICUNO
+ {0x76, 0x0b}, // SPECIES_ZAPDOS
+ {0x87, 0x04}, // SPECIES_MOLTRES
+ {0x66, 0x09}, // SPECIES_DRATINI
+ {0x78, 0x00}, // SPECIES_DRAGONAIR
+ {0x87, 0x06}, // SPECIES_DRAGONITE
+ {0x78, 0x01}, // SPECIES_MEWTWO
+ {0x66, 0x08}, // SPECIES_MEW
+ {0x56, 0x0a}, // SPECIES_CHIKORITA
+ {0x66, 0x08}, // SPECIES_BAYLEEF
+ {0x78, 0x00}, // SPECIES_MEGANIUM
+ {0x76, 0x09}, // SPECIES_CYNDAQUIL
+ {0x87, 0x04}, // SPECIES_QUILAVA
{0x87, 0x04}, // SPECIES_TYPHLOSION
- {0x87, 0x04}, // SPECIES_TOTODILE
- {0x66, 0x0b}, // SPECIES_CROCONAW
- {0x67, 0x07}, // SPECIES_FERALIGATR
- {0x88, 0x01}, // SPECIES_SENTRET
- {0x67, 0x05}, // SPECIES_FURRET
+ {0x66, 0x0b}, // SPECIES_TOTODILE
+ {0x67, 0x07}, // SPECIES_CROCONAW
+ {0x88, 0x01}, // SPECIES_FERALIGATR
+ {0x67, 0x05}, // SPECIES_SENTRET
+ {0x66, 0x08}, // SPECIES_FURRET
{0x66, 0x08}, // SPECIES_HOOTHOOT
- {0x66, 0x08}, // SPECIES_NOCTOWL
- {0x68, 0x03}, // SPECIES_LEDYBA
- {0x76, 0x0b}, // SPECIES_LEDIAN
- {0x77, 0x07}, // SPECIES_SPINARAK
- {0x73, 0x15}, // SPECIES_ARIADOS
- {0x86, 0x0b}, // SPECIES_CROBAT
- {0x87, 0x05}, // SPECIES_CHINCHOU
+ {0x68, 0x03}, // SPECIES_NOCTOWL
+ {0x76, 0x0b}, // SPECIES_LEDYBA
+ {0x77, 0x07}, // SPECIES_LEDIAN
+ {0x73, 0x15}, // SPECIES_SPINARAK
+ {0x86, 0x0b}, // SPECIES_ARIADOS
+ {0x87, 0x05}, // SPECIES_CROBAT
+ {0x86, 0x08}, // SPECIES_CHINCHOU
{0x86, 0x08}, // SPECIES_LANTURN
- {0x86, 0x08}, // SPECIES_PICHU
- {0x66, 0x0b}, // SPECIES_CLEFFA
- {0x65, 0x0f}, // SPECIES_IGGLYBUFF
- {0x66, 0x0b}, // SPECIES_TOGEPI
- {0x54, 0x10}, // SPECIES_TOGETIC
- {0x66, 0x08}, // SPECIES_NATU
- {0x54, 0x11}, // SPECIES_XATU
- {0x76, 0x08}, // SPECIES_MAREEP
+ {0x66, 0x0b}, // SPECIES_PICHU
+ {0x65, 0x0f}, // SPECIES_CLEFFA
+ {0x66, 0x0b}, // SPECIES_IGGLYBUFF
+ {0x54, 0x10}, // SPECIES_TOGEPI
+ {0x66, 0x08}, // SPECIES_TOGETIC
+ {0x54, 0x11}, // SPECIES_NATU
+ {0x76, 0x08}, // SPECIES_XATU
+ {0x66, 0x09}, // SPECIES_MAREEP
{0x66, 0x09}, // SPECIES_FLAAFFY
- {0x66, 0x09}, // SPECIES_AMPHAROS
- {0x88, 0x01}, // SPECIES_BELLOSSOM
- {0x66, 0x0b}, // SPECIES_MARILL
- {0x75, 0x0c}, // SPECIES_AZUMARILL
- {0x86, 0x08}, // SPECIES_SUDOWOODO
- {0x66, 0x08}, // SPECIES_POLITOED
- {0x66, 0x09}, // SPECIES_HOPPIP
- {0x66, 0x0b}, // SPECIES_SKIPLOOM
- {0x65, 0x0d}, // SPECIES_JUMPLUFF
- {0x87, 0x04}, // SPECIES_AIPOM
- {0x66, 0x09}, // SPECIES_SUNKERN
- {0x56, 0x0a}, // SPECIES_SUNFLORA
- {0x66, 0x08}, // SPECIES_YANMA
- {0x77, 0x04}, // SPECIES_WOOPER
- {0x85, 0x0f}, // SPECIES_QUAGSIRE
- {0x76, 0x08}, // SPECIES_ESPEON
- {0x76, 0x0b}, // SPECIES_UMBREON
- {0x87, 0x04}, // SPECIES_MURKROW
- {0x66, 0x09}, // SPECIES_SLOWKING
- {0x66, 0x08}, // SPECIES_MISDREAVUS
- {0x66, 0x0a}, // SPECIES_UNOWN
- {0x36, 0x08}, // SPECIES_WOBBUFFET
- {0x75, 0x0c}, // SPECIES_GIRAFARIG
- {0x87, 0x05}, // SPECIES_PINECO
- {0x65, 0x0f}, // SPECIES_FORRETRESS
- {0x84, 0x10}, // SPECIES_DUNSPARCE
- {0x85, 0x0f}, // SPECIES_GLIGAR
- {0x87, 0x05}, // SPECIES_STEELIX
- {0x88, 0x00}, // SPECIES_SNUBBULL
- {0x76, 0x0a}, // SPECIES_GRANBULL
- {0x87, 0x05}, // SPECIES_QWILFISH
- {0x77, 0x07}, // SPECIES_SCIZOR
- {0x77, 0x04}, // SPECIES_SHUCKLE
- {0x56, 0x0b}, // SPECIES_HERACROSS
- {0x77, 0x04}, // SPECIES_SNEASEL
+ {0x88, 0x01}, // SPECIES_AMPHAROS
+ {0x66, 0x0b}, // SPECIES_BELLOSSOM
+ {0x75, 0x0c}, // SPECIES_MARILL
+ {0x86, 0x08}, // SPECIES_AZUMARILL
+ {0x66, 0x08}, // SPECIES_SUDOWOODO
+ {0x66, 0x09}, // SPECIES_POLITOED
+ {0x66, 0x0b}, // SPECIES_HOPPIP
+ {0x65, 0x0d}, // SPECIES_SKIPLOOM
+ {0x87, 0x04}, // SPECIES_JUMPLUFF
+ {0x66, 0x09}, // SPECIES_AIPOM
+ {0x56, 0x0a}, // SPECIES_SUNKERN
+ {0x66, 0x08}, // SPECIES_SUNFLORA
+ {0x77, 0x04}, // SPECIES_YANMA
+ {0x85, 0x0f}, // SPECIES_WOOPER
+ {0x76, 0x08}, // SPECIES_QUAGSIRE
+ {0x76, 0x0b}, // SPECIES_ESPEON
+ {0x87, 0x04}, // SPECIES_UMBREON
+ {0x66, 0x09}, // SPECIES_MURKROW
+ {0x66, 0x08}, // SPECIES_SLOWKING
+ {0x66, 0x0a}, // SPECIES_MISDREAVUS
+ {0x36, 0x08}, // SPECIES_UNOWN
+ {0x75, 0x0c}, // SPECIES_WOBBUFFET
+ {0x87, 0x05}, // SPECIES_GIRAFARIG
+ {0x65, 0x0f}, // SPECIES_PINECO
+ {0x84, 0x10}, // SPECIES_FORRETRESS
+ {0x85, 0x0f}, // SPECIES_DUNSPARCE
+ {0x87, 0x05}, // SPECIES_GLIGAR
+ {0x88, 0x00}, // SPECIES_STEELIX
+ {0x76, 0x0a}, // SPECIES_SNUBBULL
+ {0x87, 0x05}, // SPECIES_GRANBULL
+ {0x77, 0x07}, // SPECIES_QWILFISH
+ {0x77, 0x04}, // SPECIES_SCIZOR
+ {0x56, 0x0b}, // SPECIES_SHUCKLE
+ {0x77, 0x04}, // SPECIES_HERACROSS
+ {0x66, 0x08}, // SPECIES_SNEASEL
{0x66, 0x08}, // SPECIES_TEDDIURSA
- {0x66, 0x08}, // SPECIES_URSARING
- {0x88, 0x03}, // SPECIES_SLUGMA
- {0x66, 0x08}, // SPECIES_MAGCARGO
- {0x76, 0x09}, // SPECIES_SWINUB
- {0x63, 0x15}, // SPECIES_PILOSWINE
- {0x75, 0x0d}, // SPECIES_CORSOLA
- {0x65, 0x0c}, // SPECIES_REMORAID
- {0x75, 0x0d}, // SPECIES_OCTILLERY
- {0x66, 0x0a}, // SPECIES_DELIBIRD
- {0x67, 0x06}, // SPECIES_MANTINE
- {0x87, 0x07}, // SPECIES_SKARMORY
- {0x87, 0x04}, // SPECIES_HOUNDOUR
- {0x55, 0x0c}, // SPECIES_HOUNDOOM
- {0x87, 0x07}, // SPECIES_KINGDRA
- {0x87, 0x06}, // SPECIES_PHANPY
- {0x65, 0x0e}, // SPECIES_DONPHAN
- {0x85, 0x0d}, // SPECIES_PORYGON2
- {0x76, 0x0a}, // SPECIES_STANTLER
- {0x78, 0x03}, // SPECIES_SMEARGLE
- {0x76, 0x0a}, // SPECIES_TYROGUE
- {0x66, 0x08}, // SPECIES_HITMONTOP
- {0x87, 0x05}, // SPECIES_SMOOCHUM
- {0x56, 0x09}, // SPECIES_ELEKID
- {0x66, 0x08}, // SPECIES_MAGBY
- {0x66, 0x0b}, // SPECIES_MILTANK
- {0x87, 0x07}, // SPECIES_BLISSEY
- {0x85, 0x0d}, // SPECIES_RAIKOU
- {0x86, 0x0a}, // SPECIES_ENTEI
- {0x87, 0x06}, // SPECIES_SUICUNE
- {0x88, 0x03}, // SPECIES_LARVITAR
- {0x66, 0x08}, // SPECIES_PUPITAR
- {0x67, 0x05}, // SPECIES_TYRANITAR
- {0x88, 0x00}, // SPECIES_LUGIA
+ {0x88, 0x03}, // SPECIES_URSARING
+ {0x66, 0x08}, // SPECIES_SLUGMA
+ {0x76, 0x09}, // SPECIES_MAGCARGO
+ {0x63, 0x15}, // SPECIES_SWINUB
+ {0x75, 0x0d}, // SPECIES_PILOSWINE
+ {0x65, 0x0c}, // SPECIES_CORSOLA
+ {0x75, 0x0d}, // SPECIES_REMORAID
+ {0x66, 0x0a}, // SPECIES_OCTILLERY
+ {0x67, 0x06}, // SPECIES_DELIBIRD
+ {0x87, 0x07}, // SPECIES_MANTINE
+ {0x87, 0x04}, // SPECIES_SKARMORY
+ {0x55, 0x0c}, // SPECIES_HOUNDOUR
+ {0x87, 0x07}, // SPECIES_HOUNDOOM
+ {0x87, 0x06}, // SPECIES_KINGDRA
+ {0x65, 0x0e}, // SPECIES_PHANPY
+ {0x85, 0x0d}, // SPECIES_DONPHAN
+ {0x76, 0x0a}, // SPECIES_PORYGON2
+ {0x78, 0x03}, // SPECIES_STANTLER
+ {0x76, 0x0a}, // SPECIES_SMEARGLE
+ {0x66, 0x08}, // SPECIES_TYROGUE
+ {0x87, 0x05}, // SPECIES_HITMONTOP
+ {0x56, 0x09}, // SPECIES_SMOOCHUM
+ {0x66, 0x08}, // SPECIES_ELEKID
+ {0x66, 0x0b}, // SPECIES_MAGBY
+ {0x87, 0x07}, // SPECIES_MILTANK
+ {0x85, 0x0d}, // SPECIES_BLISSEY
+ {0x86, 0x0a}, // SPECIES_RAIKOU
+ {0x87, 0x06}, // SPECIES_ENTEI
+ {0x88, 0x03}, // SPECIES_SUICUNE
+ {0x66, 0x08}, // SPECIES_LARVITAR
+ {0x67, 0x05}, // SPECIES_PUPITAR
+ {0x88, 0x00}, // SPECIES_TYRANITAR
+ {0x88, 0x01}, // SPECIES_LUGIA
{0x88, 0x01}, // SPECIES_HO_OH
- {0x88, 0x01}, // SPECIES_CELEBI
- {0x66, 0x08}, // SPECIES_OLD_UNOWN_B
+ {0x66, 0x08}, // SPECIES_CELEBI
+ {0x88, 0x02}, // SPECIES_OLD_UNOWN_B
{0x88, 0x02}, // SPECIES_OLD_UNOWN_C
{0x88, 0x02}, // SPECIES_OLD_UNOWN_D
{0x88, 0x02}, // SPECIES_OLD_UNOWN_E
@@ -276,168 +277,167 @@ const struct MonCoords gMonBackPicCoords[] =
{0x88, 0x02}, // SPECIES_OLD_UNOWN_X
{0x88, 0x02}, // SPECIES_OLD_UNOWN_Y
{0x88, 0x02}, // SPECIES_OLD_UNOWN_Z
- {0x88, 0x02}, // SPECIES_TREECKO
- {0x87, 0x06}, // SPECIES_GROVYLE
- {0x86, 0x08}, // SPECIES_SCEPTILE
- {0x88, 0x01}, // SPECIES_TORCHIC
- {0x67, 0x05}, // SPECIES_COMBUSKEN
+ {0x87, 0x06}, // SPECIES_TREECKO
+ {0x86, 0x08}, // SPECIES_GROVYLE
+ {0x88, 0x01}, // SPECIES_SCEPTILE
+ {0x67, 0x05}, // SPECIES_TORCHIC
+ {0x88, 0x00}, // SPECIES_COMBUSKEN
{0x88, 0x00}, // SPECIES_BLAZIKEN
- {0x88, 0x00}, // SPECIES_MUDKIP
- {0x77, 0x05}, // SPECIES_MARSHTOMP
- {0x87, 0x04}, // SPECIES_SWAMPERT
- {0x87, 0x05}, // SPECIES_POOCHYENA
- {0x76, 0x09}, // SPECIES_MIGHTYENA
- {0x87, 0x04}, // SPECIES_ZIGZAGOON
- {0x76, 0x0b}, // SPECIES_LINOONE
- {0x85, 0x0f}, // SPECIES_WURMPLE
- {0x76, 0x0b}, // SPECIES_SILCOON
- {0x83, 0x15}, // SPECIES_BEAUTIFLY
- {0x88, 0x00}, // SPECIES_CASCOON
- {0x73, 0x14}, // SPECIES_DUSTOX
- {0x83, 0x14}, // SPECIES_LOTAD
- {0x75, 0x0f}, // SPECIES_LOMBRE
- {0x86, 0x08}, // SPECIES_LUDICOLO
- {0x86, 0x0a}, // SPECIES_SEEDOT
- {0x86, 0x09}, // SPECIES_NUZLEAF
- {0x76, 0x0a}, // SPECIES_SHIFTRY
- {0x86, 0x08}, // SPECIES_NINCADA
- {0x83, 0x14}, // SPECIES_NINJASK
- {0x86, 0x08}, // SPECIES_SHEDINJA
- {0x77, 0x06}, // SPECIES_TAILLOW
- {0x64, 0x11}, // SPECIES_SWELLOW
- {0x86, 0x08}, // SPECIES_SHROOMISH
- {0x85, 0x0d}, // SPECIES_BRELOOM
- {0x87, 0x04}, // SPECIES_SPINDA
- {0x77, 0x04}, // SPECIES_WINGULL
- {0x85, 0x0e}, // SPECIES_PELIPPER
- {0x87, 0x06}, // SPECIES_SURSKIT
- {0x86, 0x0b}, // SPECIES_MASQUERAIN
- {0x88, 0x00}, // SPECIES_WAILMER
- {0x83, 0x15}, // SPECIES_WAILORD
- {0x83, 0x16}, // SPECIES_SKITTY
- {0x86, 0x0a}, // SPECIES_DELCATTY
- {0x86, 0x08}, // SPECIES_KECLEON
- {0x87, 0x06}, // SPECIES_BALTOY
- {0x86, 0x08}, // SPECIES_CLAYDOL
- {0x87, 0x07}, // SPECIES_NOSEPASS
- {0x85, 0x0c}, // SPECIES_TORKOAL
- {0x86, 0x0a}, // SPECIES_SABLEYE
- {0x76, 0x08}, // SPECIES_BARBOACH
- {0x66, 0x0a}, // SPECIES_WHISCASH
- {0x86, 0x0a}, // SPECIES_LUVDISC
- {0x46, 0x0a}, // SPECIES_CORPHISH
- {0x77, 0x07}, // SPECIES_CRAWDAUNT
- {0x87, 0x05}, // SPECIES_FEEBAS
- {0x67, 0x07}, // SPECIES_MILOTIC
- {0x68, 0x02}, // SPECIES_CARVANHA
- {0x87, 0x07}, // SPECIES_SHARPEDO
- {0x88, 0x02}, // SPECIES_TRAPINCH
- {0x75, 0x0e}, // SPECIES_VIBRAVA
- {0x74, 0x11}, // SPECIES_FLYGON
- {0x88, 0x02}, // SPECIES_MAKUHITA
- {0x76, 0x0b}, // SPECIES_HARIYAMA
- {0x87, 0x07}, // SPECIES_ELECTRIKE
- {0x84, 0x10}, // SPECIES_MANECTRIC
- {0x87, 0x04}, // SPECIES_NUMEL
- {0x86, 0x0b}, // SPECIES_CAMERUPT
- {0x84, 0x13}, // SPECIES_SPHEAL
- {0x64, 0x12}, // SPECIES_SEALEO
- {0x86, 0x0a}, // SPECIES_WALREIN
- {0x87, 0x06}, // SPECIES_CACNEA
- {0x85, 0x0f}, // SPECIES_CACTURNE
- {0x87, 0x07}, // SPECIES_SNORUNT
- {0x76, 0x0a}, // SPECIES_GLALIE
- {0x85, 0x0c}, // SPECIES_LUNATONE
+ {0x77, 0x05}, // SPECIES_MUDKIP
+ {0x87, 0x04}, // SPECIES_MARSHTOMP
+ {0x87, 0x05}, // SPECIES_SWAMPERT
+ {0x76, 0x09}, // SPECIES_POOCHYENA
+ {0x87, 0x04}, // SPECIES_MIGHTYENA
+ {0x76, 0x0b}, // SPECIES_ZIGZAGOON
+ {0x85, 0x0f}, // SPECIES_LINOONE
+ {0x76, 0x0b}, // SPECIES_WURMPLE
+ {0x83, 0x15}, // SPECIES_SILCOON
+ {0x88, 0x00}, // SPECIES_BEAUTIFLY
+ {0x73, 0x14}, // SPECIES_CASCOON
+ {0x83, 0x14}, // SPECIES_DUSTOX
+ {0x75, 0x0f}, // SPECIES_LOTAD
+ {0x86, 0x08}, // SPECIES_LOMBRE
+ {0x86, 0x0a}, // SPECIES_LUDICOLO
+ {0x86, 0x09}, // SPECIES_SEEDOT
+ {0x76, 0x0a}, // SPECIES_NUZLEAF
+ {0x86, 0x08}, // SPECIES_SHIFTRY
+ {0x83, 0x14}, // SPECIES_NINCADA
+ {0x86, 0x08}, // SPECIES_NINJASK
+ {0x77, 0x06}, // SPECIES_SHEDINJA
+ {0x64, 0x11}, // SPECIES_TAILLOW
+ {0x86, 0x08}, // SPECIES_SWELLOW
+ {0x85, 0x0d}, // SPECIES_SHROOMISH
+ {0x87, 0x04}, // SPECIES_BRELOOM
+ {0x77, 0x04}, // SPECIES_SPINDA
+ {0x85, 0x0e}, // SPECIES_WINGULL
+ {0x87, 0x06}, // SPECIES_PELIPPER
+ {0x86, 0x0b}, // SPECIES_SURSKIT
+ {0x88, 0x00}, // SPECIES_MASQUERAIN
+ {0x83, 0x15}, // SPECIES_WAILMER
+ {0x83, 0x16}, // SPECIES_WAILORD
+ {0x86, 0x0a}, // SPECIES_SKITTY
+ {0x86, 0x08}, // SPECIES_DELCATTY
+ {0x87, 0x06}, // SPECIES_KECLEON
+ {0x86, 0x08}, // SPECIES_BALTOY
+ {0x87, 0x07}, // SPECIES_CLAYDOL
+ {0x85, 0x0c}, // SPECIES_NOSEPASS
+ {0x86, 0x0a}, // SPECIES_TORKOAL
+ {0x76, 0x08}, // SPECIES_SABLEYE
+ {0x66, 0x0a}, // SPECIES_BARBOACH
+ {0x86, 0x0a}, // SPECIES_WHISCASH
+ {0x46, 0x0a}, // SPECIES_LUVDISC
+ {0x77, 0x07}, // SPECIES_CORPHISH
+ {0x87, 0x05}, // SPECIES_CRAWDAUNT
+ {0x67, 0x07}, // SPECIES_FEEBAS
+ {0x68, 0x02}, // SPECIES_MILOTIC
+ {0x87, 0x07}, // SPECIES_CARVANHA
+ {0x88, 0x02}, // SPECIES_SHARPEDO
+ {0x75, 0x0e}, // SPECIES_TRAPINCH
+ {0x74, 0x11}, // SPECIES_VIBRAVA
+ {0x88, 0x02}, // SPECIES_FLYGON
+ {0x76, 0x0b}, // SPECIES_MAKUHITA
+ {0x87, 0x07}, // SPECIES_HARIYAMA
+ {0x84, 0x10}, // SPECIES_ELECTRIKE
+ {0x87, 0x04}, // SPECIES_MANECTRIC
+ {0x86, 0x0b}, // SPECIES_NUMEL
+ {0x84, 0x13}, // SPECIES_CAMERUPT
+ {0x64, 0x12}, // SPECIES_SPHEAL
+ {0x86, 0x0a}, // SPECIES_SEALEO
+ {0x87, 0x06}, // SPECIES_WALREIN
+ {0x85, 0x0f}, // SPECIES_CACNEA
+ {0x87, 0x07}, // SPECIES_CACTURNE
+ {0x76, 0x0a}, // SPECIES_SNORUNT
+ {0x85, 0x0c}, // SPECIES_GLALIE
+ {0x87, 0x05}, // SPECIES_LUNATONE
{0x87, 0x05}, // SPECIES_SOLROCK
- {0x87, 0x05}, // SPECIES_AZURILL
- {0x86, 0x0a}, // SPECIES_SPOINK
- {0x56, 0x0b}, // SPECIES_GRUMPIG
- {0x87, 0x04}, // SPECIES_PLUSLE
+ {0x86, 0x0a}, // SPECIES_AZURILL
+ {0x56, 0x0b}, // SPECIES_SPOINK
+ {0x87, 0x04}, // SPECIES_GRUMPIG
+ {0x76, 0x08}, // SPECIES_PLUSLE
{0x76, 0x08}, // SPECIES_MINUN
- {0x76, 0x08}, // SPECIES_MAWILE
- {0x87, 0x04}, // SPECIES_MEDITITE
- {0x76, 0x0b}, // SPECIES_MEDICHAM
- {0x68, 0x03}, // SPECIES_SWABLU
- {0x86, 0x09}, // SPECIES_ALTARIA
- {0x87, 0x06}, // SPECIES_WYNAUT
- {0x77, 0x07}, // SPECIES_DUSKULL
- {0x66, 0x0b}, // SPECIES_DUSCLOPS
+ {0x87, 0x04}, // SPECIES_MAWILE
+ {0x76, 0x0b}, // SPECIES_MEDITITE
+ {0x68, 0x03}, // SPECIES_MEDICHAM
+ {0x86, 0x09}, // SPECIES_SWABLU
+ {0x87, 0x06}, // SPECIES_ALTARIA
+ {0x77, 0x07}, // SPECIES_WYNAUT
+ {0x66, 0x0b}, // SPECIES_DUSKULL
+ {0x86, 0x08}, // SPECIES_DUSCLOPS
{0x86, 0x08}, // SPECIES_ROSELIA
- {0x86, 0x08}, // SPECIES_SLAKOTH
- {0x85, 0x0f}, // SPECIES_VIGOROTH
- {0x86, 0x0a}, // SPECIES_SLAKING
- {0x86, 0x08}, // SPECIES_GULPIN
- {0x66, 0x0b}, // SPECIES_SWALOT
- {0x77, 0x06}, // SPECIES_TROPIUS
- {0x87, 0x07}, // SPECIES_WHISMUR
- {0x85, 0x0d}, // SPECIES_LOUDRED
- {0x86, 0x09}, // SPECIES_EXPLOUD
- {0x88, 0x03}, // SPECIES_CLAMPERL
- {0x85, 0x0d}, // SPECIES_HUNTAIL
- {0x68, 0x02}, // SPECIES_GOREBYSS
- {0x77, 0x05}, // SPECIES_ABSOL
- {0x78, 0x03}, // SPECIES_SHUPPET
- {0x77, 0x06}, // SPECIES_BANETTE
- {0x65, 0x0c}, // SPECIES_SEVIPER
- {0x88, 0x03}, // SPECIES_ZANGOOSE
- {0x88, 0x01}, // SPECIES_RELICANTH
- {0x86, 0x0a}, // SPECIES_ARON
- {0x54, 0x11}, // SPECIES_LAIRON
- {0x84, 0x11}, // SPECIES_AGGRON
- {0x87, 0x07}, // SPECIES_CASTFORM
- {0x45, 0x0d}, // SPECIES_VOLBEAT
- {0x76, 0x08}, // SPECIES_ILLUMISE
- {0x67, 0x06}, // SPECIES_LILEEP
- {0x86, 0x09}, // SPECIES_CRADILY
- {0x77, 0x04}, // SPECIES_ANORITH
- {0x83, 0x17}, // SPECIES_ARMALDO
- {0x77, 0x05}, // SPECIES_RALTS
- {0x45, 0x0d}, // SPECIES_KIRLIA
- {0x57, 0x06}, // SPECIES_GARDEVOIR
- {0x77, 0x04}, // SPECIES_BAGON
- {0x66, 0x08}, // SPECIES_SHELGON
- {0x85, 0x0d}, // SPECIES_SALAMENCE
- {0x77, 0x06}, // SPECIES_BELDUM
- {0x66, 0x0a}, // SPECIES_METANG
- {0x84, 0x10}, // SPECIES_METAGROSS
- {0x83, 0x14}, // SPECIES_REGIROCK
- {0x86, 0x0a}, // SPECIES_REGICE
+ {0x85, 0x0f}, // SPECIES_SLAKOTH
+ {0x86, 0x0a}, // SPECIES_VIGOROTH
+ {0x86, 0x08}, // SPECIES_SLAKING
+ {0x66, 0x0b}, // SPECIES_GULPIN
+ {0x77, 0x06}, // SPECIES_SWALOT
+ {0x87, 0x07}, // SPECIES_TROPIUS
+ {0x85, 0x0d}, // SPECIES_WHISMUR
+ {0x86, 0x09}, // SPECIES_LOUDRED
+ {0x88, 0x03}, // SPECIES_EXPLOUD
+ {0x85, 0x0d}, // SPECIES_CLAMPERL
+ {0x68, 0x02}, // SPECIES_HUNTAIL
+ {0x77, 0x05}, // SPECIES_GOREBYSS
+ {0x78, 0x03}, // SPECIES_ABSOL
+ {0x77, 0x06}, // SPECIES_SHUPPET
+ {0x65, 0x0c}, // SPECIES_BANETTE
+ {0x88, 0x03}, // SPECIES_SEVIPER
+ {0x88, 0x01}, // SPECIES_ZANGOOSE
+ {0x86, 0x0a}, // SPECIES_RELICANTH
+ {0x54, 0x11}, // SPECIES_ARON
+ {0x84, 0x11}, // SPECIES_LAIRON
+ {0x87, 0x07}, // SPECIES_AGGRON
+ {0x45, 0x0d}, // SPECIES_CASTFORM
+ {0x76, 0x08}, // SPECIES_VOLBEAT
+ {0x67, 0x06}, // SPECIES_ILLUMISE
+ {0x86, 0x09}, // SPECIES_LILEEP
+ {0x77, 0x04}, // SPECIES_CRADILY
+ {0x83, 0x17}, // SPECIES_ANORITH
+ {0x77, 0x05}, // SPECIES_ARMALDO
+ {0x45, 0x0d}, // SPECIES_RALTS
+ {0x57, 0x06}, // SPECIES_KIRLIA
+ {0x77, 0x04}, // SPECIES_GARDEVOIR
+ {0x66, 0x08}, // SPECIES_BAGON
+ {0x85, 0x0d}, // SPECIES_SHELGON
+ {0x77, 0x06}, // SPECIES_SALAMENCE
+ {0x66, 0x0a}, // SPECIES_BELDUM
+ {0x84, 0x10}, // SPECIES_METANG
+ {0x83, 0x14}, // SPECIES_METAGROSS
+ {0x86, 0x0a}, // SPECIES_REGIROCK
+ {0x85, 0x0e}, // SPECIES_REGICE
{0x85, 0x0e}, // SPECIES_REGISTEEL
- {0x85, 0x0e}, // SPECIES_KYOGRE
- {0x84, 0x13}, // SPECIES_GROUDON
- {0x87, 0x07}, // SPECIES_RAYQUAZA
- {0x78, 0x00}, // SPECIES_LATIAS
- {0x88, 0x02}, // SPECIES_LATIOS
- {0x88, 0x03}, // SPECIES_JIRACHI
- {0x87, 0x05}, // SPECIES_DEOXYS
- {0x86, 0x09}, // SPECIES_CHIMECHO
- {0x47, 0x07}, // SPECIES_EGG
- {0x36, 0x0a}, // SPECIES_UNOWN_B
- {0x56, 0x09}, // SPECIES_UNOWN_C
- {0x67, 0x06}, // SPECIES_UNOWN_D
- {0x56, 0x08}, // SPECIES_UNOWN_E
- {0x56, 0x0a}, // SPECIES_UNOWN_F
- {0x66, 0x0a}, // SPECIES_UNOWN_G
- {0x57, 0x05}, // SPECIES_UNOWN_H
- {0x66, 0x08}, // SPECIES_UNOWN_I
- {0x37, 0x07}, // SPECIES_UNOWN_J
- {0x46, 0x09}, // SPECIES_UNOWN_K
- {0x57, 0x07}, // SPECIES_UNOWN_L
- {0x46, 0x0a}, // SPECIES_UNOWN_M
+ {0x84, 0x13}, // SPECIES_KYOGRE
+ {0x87, 0x07}, // SPECIES_GROUDON
+ {0x78, 0x00}, // SPECIES_RAYQUAZA
+ {0x88, 0x02}, // SPECIES_LATIAS
+ {0x88, 0x03}, // SPECIES_LATIOS
+ {0x87, 0x05}, // SPECIES_JIRACHI
+ {0x86, 0x09}, // SPECIES_DEOXYS
+ {0x47, 0x07}, // SPECIES_CHIMECHO
+ {0x36, 0x0a}, // SPECIES_EGG
+ {0x56, 0x09}, // SPECIES_UNOWN_B
+ {0x67, 0x06}, // SPECIES_UNOWN_C
+ {0x56, 0x08}, // SPECIES_UNOWN_D
+ {0x56, 0x0a}, // SPECIES_UNOWN_E
+ {0x66, 0x0a}, // SPECIES_UNOWN_F
+ {0x57, 0x05}, // SPECIES_UNOWN_G
+ {0x66, 0x08}, // SPECIES_UNOWN_H
+ {0x37, 0x07}, // SPECIES_UNOWN_I
+ {0x46, 0x09}, // SPECIES_UNOWN_J
+ {0x57, 0x07}, // SPECIES_UNOWN_K
+ {0x46, 0x0a}, // SPECIES_UNOWN_L
+ {0x65, 0x0d}, // SPECIES_UNOWN_M
{0x65, 0x0d}, // SPECIES_UNOWN_N
- {0x65, 0x0d}, // SPECIES_UNOWN_O
- {0x66, 0x08}, // SPECIES_UNOWN_P
- {0x46, 0x0a}, // SPECIES_UNOWN_Q
- {0x55, 0x0f}, // SPECIES_UNOWN_R
- {0x45, 0x0c}, // SPECIES_UNOWN_S
- {0x57, 0x04}, // SPECIES_UNOWN_T
- {0x45, 0x0d}, // SPECIES_UNOWN_U
- {0x65, 0x0d}, // SPECIES_UNOWN_V
- {0x56, 0x0b}, // SPECIES_UNOWN_W
- {0x55, 0x0d}, // SPECIES_UNOWN_X
- {0x55, 0x0f}, // SPECIES_UNOWN_Y
+ {0x66, 0x08}, // SPECIES_UNOWN_O
+ {0x46, 0x0a}, // SPECIES_UNOWN_P
+ {0x55, 0x0f}, // SPECIES_UNOWN_Q
+ {0x45, 0x0c}, // SPECIES_UNOWN_R
+ {0x57, 0x04}, // SPECIES_UNOWN_S
+ {0x45, 0x0d}, // SPECIES_UNOWN_T
+ {0x65, 0x0d}, // SPECIES_UNOWN_U
+ {0x56, 0x0b}, // SPECIES_UNOWN_V
+ {0x55, 0x0d}, // SPECIES_UNOWN_W
+ {0x55, 0x0f}, // SPECIES_UNOWN_X
+ {0x46, 0x0a}, // SPECIES_UNOWN_Y
{0x46, 0x0a}, // SPECIES_UNOWN_Z
- {0x46, 0x0a}, // SPECIES_UNOWN_EMARK
- {0x37, 0x06}, // SPECIES_UNOWN_QMARK
- {0x47, 0x06},
+ {0x37, 0x06}, // SPECIES_UNOWN_EMARK
+ {0x47, 0x06}, // SPECIES_UNOWN_QMARK
};
diff --git a/src/data/pokemon_graphics/front_pic_coordinates.h b/src/data/pokemon_graphics/front_pic_coordinates.h
index fde423570..923df2cde 100644
--- a/src/data/pokemon_graphics/front_pic_coordinates.h
+++ b/src/data/pokemon_graphics/front_pic_coordinates.h
@@ -47,211 +47,212 @@ const struct MonCoords gMonFrontPicCoords[] =
{0x66, 0x0a}, // SPECIES_GLOOM
{0x77, 0x06}, // SPECIES_VILEPLUME
{0x55, 0x0f}, // SPECIES_PARAS
- {0x86, 0x08}, // SPECIES_VENONAT
- {0x66, 0x08}, // SPECIES_VENOMOTH
- {0x88, 0x02}, // SPECIES_DIGLETT
- {0x54, 0x12}, // SPECIES_DUGTRIO
- {0x75, 0x0d}, // SPECIES_MEOWTH
- {0x55, 0x0c}, // SPECIES_PERSIAN
- {0x77, 0x07}, // SPECIES_PSYDUCK
- {0x56, 0x09}, // SPECIES_GOLDUCK
- {0x78, 0x02}, // SPECIES_MANKEY
- {0x65, 0x0e}, // SPECIES_PRIMEAPE
- {0x77, 0x07}, // SPECIES_GROWLITHE
- {0x66, 0x0b}, // SPECIES_ARCANINE
- {0x88, 0x02}, // SPECIES_POLIWAG
- {0x74, 0x13}, // SPECIES_POLIWHIRL
- {0x76, 0x0a}, // SPECIES_POLIWRATH
- {0x76, 0x08}, // SPECIES_ABRA
- {0x66, 0x0b}, // SPECIES_KADABRA
- {0x77, 0x05}, // SPECIES_ALAKAZAM
- {0x87, 0x04}, // SPECIES_MACHOP
- {0x56, 0x0b}, // SPECIES_MACHOKE
- {0x67, 0x06}, // SPECIES_MACHAMP
- {0x88, 0x01}, // SPECIES_BELLSPROUT
- {0x65, 0x0f}, // SPECIES_WEEPINBELL
- {0x66, 0x0b}, // SPECIES_VICTREEBEL
- {0x77, 0x05}, // SPECIES_TENTACOOL
- {0x46, 0x09}, // SPECIES_TENTACRUEL
- {0x87, 0x04}, // SPECIES_GEODUDE
- {0x54, 0x12}, // SPECIES_GRAVELER
- {0x87, 0x04}, // SPECIES_GOLEM
- {0x77, 0x05}, // SPECIES_PONYTA
- {0x66, 0x08}, // SPECIES_RAPIDASH
- {0x88, 0x01}, // SPECIES_SLOWPOKE
- {0x66, 0x0b}, // SPECIES_SLOWBRO
- {0x86, 0x08}, // SPECIES_MAGNEMITE
- {0x43, 0x15}, // SPECIES_MAGNETON
- {0x76, 0x08}, // SPECIES_FARFETCHD
- {0x66, 0x09}, // SPECIES_DODUO
- {0x57, 0x05}, // SPECIES_DODRIO
- {0x88, 0x00}, // SPECIES_SEEL
- {0x76, 0x0a}, // SPECIES_DEWGONG
- {0x87, 0x07}, // SPECIES_GRIMER
- {0x65, 0x0c}, // SPECIES_MUK
- {0x87, 0x04}, // SPECIES_SHELLDER
- {0x55, 0x10}, // SPECIES_CLOYSTER
- {0x87, 0x05}, // SPECIES_GASTLY
- {0x77, 0x06}, // SPECIES_HAUNTER
+ {0x86, 0x08}, // SPECIES_PARASECT
+ {0x66, 0x08}, // SPECIES_VENONAT
+ {0x88, 0x02}, // SPECIES_VENOMOTH
+ {0x54, 0x12}, // SPECIES_DIGLETT
+ {0x75, 0x0d}, // SPECIES_DUGTRIO
+ {0x55, 0x0c}, // SPECIES_MEOWTH
+ {0x77, 0x07}, // SPECIES_PERSIAN
+ {0x56, 0x09}, // SPECIES_PSYDUCK
+ {0x78, 0x02}, // SPECIES_GOLDUCK
+ {0x65, 0x0e}, // SPECIES_MANKEY
+ {0x77, 0x07}, // SPECIES_PRIMEAPE
+ {0x66, 0x0b}, // SPECIES_GROWLITHE
+ {0x88, 0x02}, // SPECIES_ARCANINE
+ {0x74, 0x13}, // SPECIES_POLIWAG
+ {0x76, 0x0a}, // SPECIES_POLIWHIRL
+ {0x76, 0x08}, // SPECIES_POLIWRATH
+ {0x66, 0x0b}, // SPECIES_ABRA
+ {0x77, 0x05}, // SPECIES_KADABRA
+ {0x87, 0x04}, // SPECIES_ALAKAZAM
+ {0x56, 0x0b}, // SPECIES_MACHOP
+ {0x67, 0x06}, // SPECIES_MACHOKE
+ {0x88, 0x01}, // SPECIES_MACHAMP
+ {0x65, 0x0f}, // SPECIES_BELLSPROUT
+ {0x66, 0x0b}, // SPECIES_WEEPINBELL
+ {0x77, 0x05}, // SPECIES_VICTREEBEL
+ {0x46, 0x09}, // SPECIES_TENTACOOL
+ {0x87, 0x04}, // SPECIES_TENTACRUEL
+ {0x54, 0x12}, // SPECIES_GEODUDE
+ {0x87, 0x04}, // SPECIES_GRAVELER
+ {0x77, 0x05}, // SPECIES_GOLEM
+ {0x66, 0x08}, // SPECIES_PONYTA
+ {0x88, 0x01}, // SPECIES_RAPIDASH
+ {0x66, 0x0b}, // SPECIES_SLOWPOKE
+ {0x86, 0x08}, // SPECIES_SLOWBRO
+ {0x43, 0x15}, // SPECIES_MAGNEMITE
+ {0x76, 0x08}, // SPECIES_MAGNETON
+ {0x66, 0x09}, // SPECIES_FARFETCHD
+ {0x57, 0x05}, // SPECIES_DODUO
+ {0x88, 0x00}, // SPECIES_DODRIO
+ {0x76, 0x0a}, // SPECIES_SEEL
+ {0x87, 0x07}, // SPECIES_DEWGONG
+ {0x65, 0x0c}, // SPECIES_GRIMER
+ {0x87, 0x04}, // SPECIES_MUK
+ {0x55, 0x10}, // SPECIES_SHELLDER
+ {0x87, 0x05}, // SPECIES_CLOYSTER
+ {0x77, 0x06}, // SPECIES_GASTLY
+ {0x77, 0x05}, // SPECIES_HAUNTER
{0x77, 0x05}, // SPECIES_GENGAR
- {0x77, 0x05}, // SPECIES_ONIX
- {0x78, 0x02}, // SPECIES_DROWZEE
- {0x77, 0x07}, // SPECIES_HYPNO
- {0x77, 0x04}, // SPECIES_KRABBY
- {0x65, 0x0d}, // SPECIES_KINGLER
- {0x88, 0x03}, // SPECIES_VOLTORB
- {0x44, 0x13}, // SPECIES_ELECTRODE
- {0x55, 0x0e}, // SPECIES_EXEGGCUTE
- {0x87, 0x07}, // SPECIES_EXEGGUTOR
- {0x88, 0x00}, // SPECIES_CUBONE
- {0x55, 0x0f}, // SPECIES_MAROWAK
- {0x76, 0x0b}, // SPECIES_HITMONLEE
- {0x87, 0x04}, // SPECIES_HITMONCHAN
- {0x67, 0x04}, // SPECIES_LICKITUNG
- {0x86, 0x08}, // SPECIES_KOFFING
- {0x66, 0x08}, // SPECIES_WEEZING
- {0x88, 0x02}, // SPECIES_RHYHORN
- {0x76, 0x09}, // SPECIES_RHYDON
- {0x88, 0x02}, // SPECIES_CHANSEY
- {0x76, 0x09}, // SPECIES_TANGELA
- {0x67, 0x07}, // SPECIES_KANGASKHAN
- {0x88, 0x00}, // SPECIES_HORSEA
- {0x45, 0x0f}, // SPECIES_SEADRA
- {0x67, 0x07}, // SPECIES_GOLDEEN
- {0x66, 0x0a}, // SPECIES_SEAKING
- {0x77, 0x04}, // SPECIES_STARYU
- {0x66, 0x0a}, // SPECIES_STARMIE
- {0x77, 0x06}, // SPECIES_MR_MIME
- {0x66, 0x08}, // SPECIES_SCYTHER
- {0x88, 0x00}, // SPECIES_JYNX
- {0x77, 0x04}, // SPECIES_ELECTABUZZ
- {0x78, 0x02}, // SPECIES_MAGMAR
+ {0x78, 0x02}, // SPECIES_ONIX
+ {0x77, 0x07}, // SPECIES_DROWZEE
+ {0x77, 0x04}, // SPECIES_HYPNO
+ {0x65, 0x0d}, // SPECIES_KRABBY
+ {0x88, 0x03}, // SPECIES_KINGLER
+ {0x44, 0x13}, // SPECIES_VOLTORB
+ {0x55, 0x0e}, // SPECIES_ELECTRODE
+ {0x87, 0x07}, // SPECIES_EXEGGCUTE
+ {0x88, 0x00}, // SPECIES_EXEGGUTOR
+ {0x55, 0x0f}, // SPECIES_CUBONE
+ {0x76, 0x0b}, // SPECIES_MAROWAK
+ {0x87, 0x04}, // SPECIES_HITMONLEE
+ {0x67, 0x04}, // SPECIES_HITMONCHAN
+ {0x86, 0x08}, // SPECIES_LICKITUNG
+ {0x66, 0x08}, // SPECIES_KOFFING
+ {0x88, 0x02}, // SPECIES_WEEZING
+ {0x76, 0x09}, // SPECIES_RHYHORN
+ {0x88, 0x02}, // SPECIES_RHYDON
+ {0x76, 0x09}, // SPECIES_CHANSEY
+ {0x67, 0x07}, // SPECIES_TANGELA
+ {0x88, 0x00}, // SPECIES_KANGASKHAN
+ {0x45, 0x0f}, // SPECIES_HORSEA
+ {0x67, 0x07}, // SPECIES_SEADRA
+ {0x66, 0x0a}, // SPECIES_GOLDEEN
+ {0x77, 0x04}, // SPECIES_SEAKING
+ {0x66, 0x0a}, // SPECIES_STARYU
+ {0x77, 0x06}, // SPECIES_STARMIE
+ {0x66, 0x08}, // SPECIES_MR_MIME
+ {0x88, 0x00}, // SPECIES_SCYTHER
+ {0x77, 0x04}, // SPECIES_JYNX
+ {0x78, 0x02}, // SPECIES_ELECTABUZZ
+ {0x77, 0x04}, // SPECIES_MAGMAR
{0x77, 0x04}, // SPECIES_PINSIR
- {0x77, 0x04}, // SPECIES_TAUROS
- {0x78, 0x00}, // SPECIES_MAGIKARP
- {0x67, 0x06}, // SPECIES_GYARADOS
- {0x88, 0x08}, // SPECIES_LAPRAS
- {0x85, 0x0d}, // SPECIES_DITTO
- {0x54, 0x11}, // SPECIES_EEVEE
- {0x56, 0x09}, // SPECIES_VAPOREON
- {0x67, 0x06}, // SPECIES_JOLTEON
- {0x76, 0x09}, // SPECIES_FLAREON
- {0x66, 0x0a}, // SPECIES_PORYGON
- {0x55, 0x0d}, // SPECIES_OMANYTE
- {0x45, 0x0f}, // SPECIES_OMASTAR
- {0x67, 0x07}, // SPECIES_KABUTO
- {0x54, 0x11}, // SPECIES_KABUTOPS
- {0x88, 0x03}, // SPECIES_AERODACTYL
- {0x88, 0x01}, // SPECIES_SNORLAX
- {0x87, 0x05}, // SPECIES_ARTICUNO
- {0x88, 0x03}, // SPECIES_ZAPDOS
- {0x87, 0x04}, // SPECIES_MOLTRES
- {0x88, 0x00}, // SPECIES_DRATINI
- {0x75, 0x0e}, // SPECIES_DRAGONAIR
- {0x87, 0x06}, // SPECIES_DRAGONITE
+ {0x78, 0x00}, // SPECIES_TAUROS
+ {0x67, 0x06}, // SPECIES_MAGIKARP
+ {0x88, 0x08}, // SPECIES_GYARADOS
+ {0x85, 0x0d}, // SPECIES_LAPRAS
+ {0x54, 0x11}, // SPECIES_DITTO
+ {0x56, 0x09}, // SPECIES_EEVEE
+ {0x67, 0x06}, // SPECIES_VAPOREON
+ {0x76, 0x09}, // SPECIES_JOLTEON
+ {0x66, 0x0a}, // SPECIES_FLAREON
+ {0x55, 0x0d}, // SPECIES_PORYGON
+ {0x45, 0x0f}, // SPECIES_OMANYTE
+ {0x67, 0x07}, // SPECIES_OMASTAR
+ {0x54, 0x11}, // SPECIES_KABUTO
+ {0x88, 0x03}, // SPECIES_KABUTOPS
+ {0x88, 0x01}, // SPECIES_AERODACTYL
+ {0x87, 0x05}, // SPECIES_SNORLAX
+ {0x88, 0x03}, // SPECIES_ARTICUNO
+ {0x87, 0x04}, // SPECIES_ZAPDOS
+ {0x88, 0x00}, // SPECIES_MOLTRES
+ {0x75, 0x0e}, // SPECIES_DRATINI
+ {0x87, 0x06}, // SPECIES_DRAGONAIR
+ {0x88, 0x00}, // SPECIES_DRAGONITE
{0x88, 0x00}, // SPECIES_MEWTWO
- {0x88, 0x00}, // SPECIES_MEW
- {0x55, 0x0d}, // SPECIES_CHIKORITA
- {0x75, 0x0d}, // SPECIES_BAYLEEF
- {0x77, 0x04}, // SPECIES_MEGANIUM
- {0x88, 0x00}, // SPECIES_CYNDAQUIL
- {0x55, 0x0e}, // SPECIES_QUILAVA
- {0x76, 0x08}, // SPECIES_TYPHLOSION
- {0x78, 0x00}, // SPECIES_TOTODILE
- {0x55, 0x0f}, // SPECIES_CROCONAW
- {0x67, 0x06}, // SPECIES_FERALIGATR
- {0x88, 0x00}, // SPECIES_SENTRET
- {0x47, 0x04}, // SPECIES_FURRET
- {0x67, 0x07}, // SPECIES_HOOTHOOT
- {0x55, 0x0d}, // SPECIES_NOCTOWL
- {0x58, 0x03}, // SPECIES_LEDYBA
- {0x56, 0x0c}, // SPECIES_LEDIAN
- {0x67, 0x04}, // SPECIES_SPINARAK
- {0x54, 0x13}, // SPECIES_ARIADOS
- {0x87, 0x05}, // SPECIES_CROBAT
- {0x88, 0x00}, // SPECIES_CHINCHOU
- {0x75, 0x10}, // SPECIES_LANTURN
- {0x87, 0x0b}, // SPECIES_PICHU
- {0x45, 0x0c}, // SPECIES_CLEFFA
- {0x44, 0x14}, // SPECIES_IGGLYBUFF
- {0x44, 0x12}, // SPECIES_TOGEPI
- {0x34, 0x14}, // SPECIES_TOGETIC
- {0x46, 0x09}, // SPECIES_NATU
- {0x44, 0x14}, // SPECIES_XATU
- {0x47, 0x07}, // SPECIES_MAREEP
- {0x55, 0x10}, // SPECIES_FLAAFFY
- {0x56, 0x0a}, // SPECIES_AMPHAROS
- {0x77, 0x05}, // SPECIES_BELLOSSOM
- {0x45, 0x0e}, // SPECIES_MARILL
- {0x65, 0x0e}, // SPECIES_AZUMARILL
- {0x76, 0x09}, // SPECIES_SUDOWOODO
+ {0x55, 0x0d}, // SPECIES_MEW
+ {0x75, 0x0d}, // SPECIES_CHIKORITA
+ {0x77, 0x04}, // SPECIES_BAYLEEF
+ {0x88, 0x00}, // SPECIES_MEGANIUM
+ {0x55, 0x0e}, // SPECIES_CYNDAQUIL
+ {0x76, 0x08}, // SPECIES_QUILAVA
+ {0x78, 0x00}, // SPECIES_TYPHLOSION
+ {0x55, 0x0f}, // SPECIES_TOTODILE
+ {0x67, 0x06}, // SPECIES_CROCONAW
+ {0x88, 0x00}, // SPECIES_FERALIGATR
+ {0x47, 0x04}, // SPECIES_SENTRET
+ {0x67, 0x07}, // SPECIES_FURRET
+ {0x55, 0x0d}, // SPECIES_HOOTHOOT
+ {0x58, 0x03}, // SPECIES_NOCTOWL
+ {0x56, 0x0c}, // SPECIES_LEDYBA
+ {0x67, 0x04}, // SPECIES_LEDIAN
+ {0x54, 0x13}, // SPECIES_SPINARAK
+ {0x87, 0x05}, // SPECIES_ARIADOS
+ {0x88, 0x00}, // SPECIES_CROBAT
+ {0x75, 0x10}, // SPECIES_CHINCHOU
+ {0x87, 0x0b}, // SPECIES_LANTURN
+ {0x45, 0x0c}, // SPECIES_PICHU
+ {0x44, 0x14}, // SPECIES_CLEFFA
+ {0x44, 0x12}, // SPECIES_IGGLYBUFF
+ {0x34, 0x14}, // SPECIES_TOGEPI
+ {0x46, 0x09}, // SPECIES_TOGETIC
+ {0x44, 0x14}, // SPECIES_NATU
+ {0x47, 0x07}, // SPECIES_XATU
+ {0x55, 0x10}, // SPECIES_MAREEP
+ {0x56, 0x0a}, // SPECIES_FLAAFFY
+ {0x77, 0x05}, // SPECIES_AMPHAROS
+ {0x45, 0x0e}, // SPECIES_BELLOSSOM
+ {0x65, 0x0e}, // SPECIES_MARILL
+ {0x76, 0x09}, // SPECIES_AZUMARILL
+ {0x67, 0x06}, // SPECIES_SUDOWOODO
{0x67, 0x06}, // SPECIES_POLITOED
- {0x67, 0x06}, // SPECIES_HOPPIP
- {0x66, 0x0a}, // SPECIES_SKIPLOOM
- {0x55, 0x0f}, // SPECIES_JUMPLUFF
- {0x77, 0x07}, // SPECIES_AIPOM
- {0x58, 0x03}, // SPECIES_SUNKERN
- {0x44, 0x10}, // SPECIES_SUNFLORA
- {0x56, 0x08}, // SPECIES_YANMA
- {0x86, 0x0a}, // SPECIES_WOOPER
- {0x54, 0x10}, // SPECIES_QUAGSIRE
- {0x77, 0x07}, // SPECIES_ESPEON
- {0x66, 0x08}, // SPECIES_UMBREON
- {0x67, 0x08}, // SPECIES_MURKROW
- {0x66, 0x0b}, // SPECIES_SLOWKING
- {0x58, 0x01}, // SPECIES_MISDREAVUS
- {0x55, 0x0c}, // SPECIES_UNOWN
- {0x35, 0x0f}, // SPECIES_WOBBUFFET
- {0x77, 0x06}, // SPECIES_GIRAFARIG
- {0x88, 0x03}, // SPECIES_PINECO
- {0x56, 0x0a}, // SPECIES_FORRETRESS
- {0x76, 0x09}, // SPECIES_DUNSPARCE
- {0x74, 0x11}, // SPECIES_GLIGAR
- {0x78, 0x03}, // SPECIES_STEELIX
- {0x88, 0x00}, // SPECIES_SNUBBULL
- {0x55, 0x0d}, // SPECIES_GRANBULL
- {0x57, 0x06}, // SPECIES_QWILFISH
- {0x56, 0x0a}, // SPECIES_SCIZOR
- {0x88, 0x00}, // SPECIES_SHUCKLE
- {0x66, 0x09}, // SPECIES_HERACROSS
- {0x88, 0x03}, // SPECIES_SNEASEL
- {0x67, 0x05}, // SPECIES_TEDDIURSA
- {0x45, 0x0d}, // SPECIES_URSARING
- {0x78, 0x01}, // SPECIES_SLUGMA
- {0x45, 0x0d}, // SPECIES_MAGCARGO
- {0x57, 0x0d}, // SPECIES_SWINUB
- {0x43, 0x14}, // SPECIES_PILOSWINE
- {0x66, 0x08}, // SPECIES_CORSOLA
- {0x65, 0x0c}, // SPECIES_REMORAID
- {0x55, 0x0e}, // SPECIES_OCTILLERY
- {0x66, 0x0a}, // SPECIES_DELIBIRD
- {0x56, 0x08}, // SPECIES_MANTINE
- {0x88, 0x01}, // SPECIES_SKARMORY
- {0x88, 0x00}, // SPECIES_HOUNDOUR
- {0x56, 0x0b}, // SPECIES_HOUNDOOM
- {0x77, 0x05}, // SPECIES_KINGDRA
- {0x78, 0x04}, // SPECIES_PHANPY
- {0x54, 0x10}, // SPECIES_DONPHAN
- {0x86, 0x08}, // SPECIES_PORYGON2
- {0x55, 0x0f}, // SPECIES_STANTLER
- {0x88, 0x00}, // SPECIES_SMEARGLE
- {0x77, 0x06}, // SPECIES_TYROGUE
- {0x46, 0x09}, // SPECIES_HITMONTOP
- {0x67, 0x05}, // SPECIES_SMOOCHUM
- {0x35, 0x0f}, // SPECIES_ELEKID
- {0x76, 0x0a}, // SPECIES_MAGBY
- {0x45, 0x0d}, // SPECIES_MILTANK
- {0x77, 0x04}, // SPECIES_BLISSEY
- {0x77, 0x06}, // SPECIES_RAIKOU
+ {0x66, 0x0a}, // SPECIES_HOPPIP
+ {0x55, 0x0f}, // SPECIES_SKIPLOOM
+ {0x77, 0x07}, // SPECIES_JUMPLUFF
+ {0x58, 0x03}, // SPECIES_AIPOM
+ {0x44, 0x10}, // SPECIES_SUNKERN
+ {0x56, 0x08}, // SPECIES_SUNFLORA
+ {0x86, 0x0a}, // SPECIES_YANMA
+ {0x54, 0x10}, // SPECIES_WOOPER
+ {0x77, 0x07}, // SPECIES_QUAGSIRE
+ {0x66, 0x08}, // SPECIES_ESPEON
+ {0x67, 0x08}, // SPECIES_UMBREON
+ {0x66, 0x0b}, // SPECIES_MURKROW
+ {0x58, 0x01}, // SPECIES_SLOWKING
+ {0x55, 0x0c}, // SPECIES_MISDREAVUS
+ {0x35, 0x0f}, // SPECIES_UNOWN
+ {0x77, 0x06}, // SPECIES_WOBBUFFET
+ {0x88, 0x03}, // SPECIES_GIRAFARIG
+ {0x56, 0x0a}, // SPECIES_PINECO
+ {0x76, 0x09}, // SPECIES_FORRETRESS
+ {0x74, 0x11}, // SPECIES_DUNSPARCE
+ {0x78, 0x03}, // SPECIES_GLIGAR
+ {0x88, 0x00}, // SPECIES_STEELIX
+ {0x55, 0x0d}, // SPECIES_SNUBBULL
+ {0x57, 0x06}, // SPECIES_GRANBULL
+ {0x56, 0x0a}, // SPECIES_QWILFISH
+ {0x88, 0x00}, // SPECIES_SCIZOR
+ {0x66, 0x09}, // SPECIES_SHUCKLE
+ {0x88, 0x03}, // SPECIES_HERACROSS
+ {0x67, 0x05}, // SPECIES_SNEASEL
+ {0x45, 0x0d}, // SPECIES_TEDDIURSA
+ {0x78, 0x01}, // SPECIES_URSARING
+ {0x45, 0x0d}, // SPECIES_SLUGMA
+ {0x57, 0x0d}, // SPECIES_MAGCARGO
+ {0x43, 0x14}, // SPECIES_SWINUB
+ {0x66, 0x08}, // SPECIES_PILOSWINE
+ {0x65, 0x0c}, // SPECIES_CORSOLA
+ {0x55, 0x0e}, // SPECIES_REMORAID
+ {0x66, 0x0a}, // SPECIES_OCTILLERY
+ {0x56, 0x08}, // SPECIES_DELIBIRD
+ {0x88, 0x01}, // SPECIES_MANTINE
+ {0x88, 0x00}, // SPECIES_SKARMORY
+ {0x56, 0x0b}, // SPECIES_HOUNDOUR
+ {0x77, 0x05}, // SPECIES_HOUNDOOM
+ {0x78, 0x04}, // SPECIES_KINGDRA
+ {0x54, 0x10}, // SPECIES_PHANPY
+ {0x86, 0x08}, // SPECIES_DONPHAN
+ {0x55, 0x0f}, // SPECIES_PORYGON2
+ {0x88, 0x00}, // SPECIES_STANTLER
+ {0x77, 0x06}, // SPECIES_SMEARGLE
+ {0x46, 0x09}, // SPECIES_TYROGUE
+ {0x67, 0x05}, // SPECIES_HITMONTOP
+ {0x35, 0x0f}, // SPECIES_SMOOCHUM
+ {0x76, 0x0a}, // SPECIES_ELEKID
+ {0x45, 0x0d}, // SPECIES_MAGBY
+ {0x77, 0x04}, // SPECIES_MILTANK
+ {0x77, 0x06}, // SPECIES_BLISSEY
+ {0x88, 0x00}, // SPECIES_RAIKOU
{0x88, 0x00}, // SPECIES_ENTEI
{0x88, 0x00}, // SPECIES_SUICUNE
- {0x88, 0x00}, // SPECIES_LARVITAR
- {0x46, 0x09}, // SPECIES_PUPITAR
- {0x56, 0x09}, // SPECIES_TYRANITAR
+ {0x46, 0x09}, // SPECIES_LARVITAR
+ {0x56, 0x09}, // SPECIES_PUPITAR
+ {0x88, 0x00}, // SPECIES_TYRANITAR
{0x88, 0x00}, // SPECIES_LUGIA
{0x88, 0x00}, // SPECIES_HO_OH
- {0x88, 0x00}, // SPECIES_CELEBI
- {0x55, 0x0e}, // SPECIES_OLD_UNOWN_B
+ {0x55, 0x0e}, // SPECIES_CELEBI
+ {0x87, 0x04}, // SPECIES_OLD_UNOWN_B
{0x87, 0x04}, // SPECIES_OLD_UNOWN_C
{0x87, 0x04}, // SPECIES_OLD_UNOWN_D
{0x87, 0x04}, // SPECIES_OLD_UNOWN_E
@@ -276,168 +277,167 @@ const struct MonCoords gMonFrontPicCoords[] =
{0x87, 0x04}, // SPECIES_OLD_UNOWN_X
{0x87, 0x04}, // SPECIES_OLD_UNOWN_Y
{0x87, 0x04}, // SPECIES_OLD_UNOWN_Z
- {0x87, 0x04}, // SPECIES_TREECKO
- {0x66, 0x08}, // SPECIES_GROVYLE
- {0x87, 0x04}, // SPECIES_SCEPTILE
- {0x88, 0x00}, // SPECIES_TORCHIC
- {0x56, 0x08}, // SPECIES_COMBUSKEN
- {0x88, 0x01}, // SPECIES_BLAZIKEN
- {0x88, 0x00}, // SPECIES_MUDKIP
- {0x56, 0x0c}, // SPECIES_MARSHTOMP
- {0x67, 0x06}, // SPECIES_SWAMPERT
- {0x88, 0x00}, // SPECIES_POOCHYENA
- {0x55, 0x0c}, // SPECIES_MIGHTYENA
- {0x87, 0x04}, // SPECIES_ZIGZAGOON
- {0x85, 0x0f}, // SPECIES_LINOONE
- {0x78, 0x03}, // SPECIES_WURMPLE
- {0x45, 0x0e}, // SPECIES_SILCOON
- {0x75, 0x11}, // SPECIES_BEAUTIFLY
- {0x86, 0x09}, // SPECIES_CASCOON
- {0x74, 0x10}, // SPECIES_DUSTOX
- {0x86, 0x0f}, // SPECIES_LOTAD
- {0x65, 0x0e}, // SPECIES_LOMBRE
- {0x66, 0x09}, // SPECIES_LUDICOLO
- {0x88, 0x00}, // SPECIES_SEEDOT
- {0x46, 0x10}, // SPECIES_NUZLEAF
- {0x56, 0x08}, // SPECIES_SHIFTRY
- {0x88, 0x02}, // SPECIES_NINCADA
- {0x74, 0x12}, // SPECIES_NINJASK
- {0x86, 0x0a}, // SPECIES_SHEDINJA
- {0x66, 0x0a}, // SPECIES_TAILLOW
- {0x64, 0x10}, // SPECIES_SWELLOW
- {0x87, 0x06}, // SPECIES_SHROOMISH
- {0x54, 0x10}, // SPECIES_BRELOOM
- {0x77, 0x04}, // SPECIES_SPINDA
- {0x68, 0x08}, // SPECIES_WINGULL
- {0x84, 0x18}, // SPECIES_PELIPPER
- {0x77, 0x04}, // SPECIES_SURSKIT
- {0x65, 0x0f}, // SPECIES_MASQUERAIN
- {0x88, 0x01}, // SPECIES_WAILMER
- {0x75, 0x0f}, // SPECIES_WAILORD
- {0x87, 0x0a}, // SPECIES_SKITTY
- {0x66, 0x0b}, // SPECIES_DELCATTY
- {0x66, 0x08}, // SPECIES_KECLEON
- {0x67, 0x07}, // SPECIES_BALTOY
- {0x55, 0x10}, // SPECIES_CLAYDOL
- {0x78, 0x06}, // SPECIES_NOSEPASS
- {0x56, 0x0c}, // SPECIES_TORKOAL
- {0x88, 0x02}, // SPECIES_SABLEYE
- {0x66, 0x09}, // SPECIES_BARBOACH
- {0x46, 0x0b}, // SPECIES_WHISCASH
- {0x76, 0x09}, // SPECIES_LUVDISC
- {0x46, 0x18}, // SPECIES_CORPHISH
- {0x66, 0x0c}, // SPECIES_CRAWDAUNT
- {0x88, 0x01}, // SPECIES_FEEBAS
- {0x46, 0x0d}, // SPECIES_MILOTIC
- {0x88, 0x00}, // SPECIES_CARVANHA
- {0x67, 0x06}, // SPECIES_SHARPEDO
- {0x78, 0x03}, // SPECIES_TRAPINCH
- {0x54, 0x10}, // SPECIES_VIBRAVA
- {0x86, 0x0c}, // SPECIES_FLYGON
- {0x88, 0x01}, // SPECIES_MAKUHITA
- {0x65, 0x0c}, // SPECIES_HARIYAMA
- {0x88, 0x01}, // SPECIES_ELECTRIKE
- {0x64, 0x12}, // SPECIES_MANECTRIC
- {0x67, 0x04}, // SPECIES_NUMEL
- {0x65, 0x0f}, // SPECIES_CAMERUPT
- {0x87, 0x09}, // SPECIES_SPHEAL
- {0x65, 0x10}, // SPECIES_SEALEO
- {0x86, 0x0a}, // SPECIES_WALREIN
- {0x88, 0x01}, // SPECIES_CACNEA
- {0x74, 0x10}, // SPECIES_CACTURNE
- {0x88, 0x00}, // SPECIES_SNORUNT
- {0x56, 0x0b}, // SPECIES_GLALIE
- {0x76, 0x0a}, // SPECIES_LUNATONE
- {0x66, 0x09}, // SPECIES_SOLROCK
- {0x88, 0x01}, // SPECIES_AZURILL
- {0x55, 0x0f}, // SPECIES_SPOINK
- {0x46, 0x09}, // SPECIES_GRUMPIG
- {0x77, 0x05}, // SPECIES_PLUSLE
- {0x56, 0x0e}, // SPECIES_MINUN
- {0x66, 0x0c}, // SPECIES_MAWILE
- {0x76, 0x08}, // SPECIES_MEDITITE
- {0x65, 0x0c}, // SPECIES_MEDICHAM
- {0x68, 0x01}, // SPECIES_SWABLU
- {0x76, 0x11}, // SPECIES_ALTARIA
- {0x88, 0x02}, // SPECIES_WYNAUT
- {0x55, 0x0c}, // SPECIES_DUSKULL
- {0x66, 0x0a}, // SPECIES_DUSCLOPS
- {0x77, 0x05}, // SPECIES_ROSELIA
- {0x76, 0x08}, // SPECIES_SLAKOTH
- {0x74, 0x12}, // SPECIES_VIGOROTH
- {0x78, 0x00}, // SPECIES_SLAKING
- {0x86, 0x08}, // SPECIES_GULPIN
- {0x55, 0x12}, // SPECIES_SWALOT
- {0x66, 0x08}, // SPECIES_TROPIUS
- {0x88, 0x00}, // SPECIES_WHISMUR
- {0x55, 0x0e}, // SPECIES_LOUDRED
- {0x78, 0x03}, // SPECIES_EXPLOUD
- {0x88, 0x01}, // SPECIES_CLAMPERL
- {0x55, 0x0e}, // SPECIES_HUNTAIL
- {0x78, 0x03}, // SPECIES_GOREBYSS
- {0x86, 0x0b}, // SPECIES_ABSOL
- {0x68, 0x00}, // SPECIES_SHUPPET
- {0x56, 0x0e}, // SPECIES_BANETTE
- {0x55, 0x0c}, // SPECIES_SEVIPER
- {0x77, 0x08}, // SPECIES_ZANGOOSE
- {0x87, 0x05}, // SPECIES_RELICANTH
- {0x77, 0x0b}, // SPECIES_ARON
- {0x43, 0x14}, // SPECIES_LAIRON
- {0x75, 0x0d}, // SPECIES_AGGRON
- {0x88, 0x00}, // SPECIES_CASTFORM
- {0x34, 0x11}, // SPECIES_VOLBEAT
- {0x66, 0x08}, // SPECIES_ILLUMISE
- {0x56, 0x08}, // SPECIES_LILEEP
- {0x67, 0x07}, // SPECIES_CRADILY
- {0x78, 0x00}, // SPECIES_ANORITH
- {0x66, 0x08}, // SPECIES_ARMALDO
- {0x88, 0x00}, // SPECIES_RALTS
- {0x35, 0x0f}, // SPECIES_KIRLIA
- {0x47, 0x06}, // SPECIES_GARDEVOIR
- {0x78, 0x01}, // SPECIES_BAGON
- {0x56, 0x0b}, // SPECIES_SHELGON
- {0x66, 0x09}, // SPECIES_SALAMENCE
- {0x87, 0x04}, // SPECIES_BELDUM
- {0x55, 0x0f}, // SPECIES_METANG
- {0x87, 0x07}, // SPECIES_METAGROSS
- {0x87, 0x06}, // SPECIES_REGIROCK
- {0x78, 0x04}, // SPECIES_REGICE
- {0x88, 0x02}, // SPECIES_REGISTEEL
- {0x88, 0x03}, // SPECIES_KYOGRE
- {0x87, 0x04}, // SPECIES_GROUDON
- {0x88, 0x01}, // SPECIES_RAYQUAZA
- {0x88, 0x00}, // SPECIES_LATIAS
- {0x88, 0x01}, // SPECIES_LATIOS
- {0x88, 0x02}, // SPECIES_JIRACHI
- {0x66, 0x0d}, // SPECIES_DEOXYS
- {0x88, 0x01}, // SPECIES_CHIMECHO
- {0x37, 0x06}, // SPECIES_EGG
- {0x33, 0x14}, // SPECIES_UNOWN_B
- {0x34, 0x10}, // SPECIES_UNOWN_C
+ {0x66, 0x08}, // SPECIES_TREECKO
+ {0x87, 0x04}, // SPECIES_GROVYLE
+ {0x88, 0x00}, // SPECIES_SCEPTILE
+ {0x56, 0x08}, // SPECIES_TORCHIC
+ {0x88, 0x01}, // SPECIES_COMBUSKEN
+ {0x88, 0x00}, // SPECIES_BLAZIKEN
+ {0x56, 0x0c}, // SPECIES_MUDKIP
+ {0x67, 0x06}, // SPECIES_MARSHTOMP
+ {0x88, 0x00}, // SPECIES_SWAMPERT
+ {0x55, 0x0c}, // SPECIES_POOCHYENA
+ {0x87, 0x04}, // SPECIES_MIGHTYENA
+ {0x85, 0x0f}, // SPECIES_ZIGZAGOON
+ {0x78, 0x03}, // SPECIES_LINOONE
+ {0x45, 0x0e}, // SPECIES_WURMPLE
+ {0x75, 0x11}, // SPECIES_SILCOON
+ {0x86, 0x09}, // SPECIES_BEAUTIFLY
+ {0x74, 0x10}, // SPECIES_CASCOON
+ {0x86, 0x0f}, // SPECIES_DUSTOX
+ {0x65, 0x0e}, // SPECIES_LOTAD
+ {0x66, 0x09}, // SPECIES_LOMBRE
+ {0x88, 0x00}, // SPECIES_LUDICOLO
+ {0x46, 0x10}, // SPECIES_SEEDOT
+ {0x56, 0x08}, // SPECIES_NUZLEAF
+ {0x88, 0x02}, // SPECIES_SHIFTRY
+ {0x74, 0x12}, // SPECIES_NINCADA
+ {0x86, 0x0a}, // SPECIES_NINJASK
+ {0x66, 0x0a}, // SPECIES_SHEDINJA
+ {0x64, 0x10}, // SPECIES_TAILLOW
+ {0x87, 0x06}, // SPECIES_SWELLOW
+ {0x54, 0x10}, // SPECIES_SHROOMISH
+ {0x77, 0x04}, // SPECIES_BRELOOM
+ {0x68, 0x08}, // SPECIES_SPINDA
+ {0x84, 0x18}, // SPECIES_WINGULL
+ {0x77, 0x04}, // SPECIES_PELIPPER
+ {0x65, 0x0f}, // SPECIES_SURSKIT
+ {0x88, 0x01}, // SPECIES_MASQUERAIN
+ {0x75, 0x0f}, // SPECIES_WAILMER
+ {0x87, 0x0a}, // SPECIES_WAILORD
+ {0x66, 0x0b}, // SPECIES_SKITTY
+ {0x66, 0x08}, // SPECIES_DELCATTY
+ {0x67, 0x07}, // SPECIES_KECLEON
+ {0x55, 0x10}, // SPECIES_BALTOY
+ {0x78, 0x06}, // SPECIES_CLAYDOL
+ {0x56, 0x0c}, // SPECIES_NOSEPASS
+ {0x88, 0x02}, // SPECIES_TORKOAL
+ {0x66, 0x09}, // SPECIES_SABLEYE
+ {0x46, 0x0b}, // SPECIES_BARBOACH
+ {0x76, 0x09}, // SPECIES_WHISCASH
+ {0x46, 0x18}, // SPECIES_LUVDISC
+ {0x66, 0x0c}, // SPECIES_CORPHISH
+ {0x88, 0x01}, // SPECIES_CRAWDAUNT
+ {0x46, 0x0d}, // SPECIES_FEEBAS
+ {0x88, 0x00}, // SPECIES_MILOTIC
+ {0x67, 0x06}, // SPECIES_CARVANHA
+ {0x78, 0x03}, // SPECIES_SHARPEDO
+ {0x54, 0x10}, // SPECIES_TRAPINCH
+ {0x86, 0x0c}, // SPECIES_VIBRAVA
+ {0x88, 0x01}, // SPECIES_FLYGON
+ {0x65, 0x0c}, // SPECIES_MAKUHITA
+ {0x88, 0x01}, // SPECIES_HARIYAMA
+ {0x64, 0x12}, // SPECIES_ELECTRIKE
+ {0x67, 0x04}, // SPECIES_MANECTRIC
+ {0x65, 0x0f}, // SPECIES_NUMEL
+ {0x87, 0x09}, // SPECIES_CAMERUPT
+ {0x65, 0x10}, // SPECIES_SPHEAL
+ {0x86, 0x0a}, // SPECIES_SEALEO
+ {0x88, 0x01}, // SPECIES_WALREIN
+ {0x74, 0x10}, // SPECIES_CACNEA
+ {0x88, 0x00}, // SPECIES_CACTURNE
+ {0x56, 0x0b}, // SPECIES_SNORUNT
+ {0x76, 0x0a}, // SPECIES_GLALIE
+ {0x66, 0x09}, // SPECIES_LUNATONE
+ {0x88, 0x01}, // SPECIES_SOLROCK
+ {0x55, 0x0f}, // SPECIES_AZURILL
+ {0x46, 0x09}, // SPECIES_SPOINK
+ {0x77, 0x05}, // SPECIES_GRUMPIG
+ {0x56, 0x0e}, // SPECIES_PLUSLE
+ {0x66, 0x0c}, // SPECIES_MINUN
+ {0x76, 0x08}, // SPECIES_MAWILE
+ {0x65, 0x0c}, // SPECIES_MEDITITE
+ {0x68, 0x01}, // SPECIES_MEDICHAM
+ {0x76, 0x11}, // SPECIES_SWABLU
+ {0x88, 0x02}, // SPECIES_ALTARIA
+ {0x55, 0x0c}, // SPECIES_WYNAUT
+ {0x66, 0x0a}, // SPECIES_DUSKULL
+ {0x77, 0x05}, // SPECIES_DUSCLOPS
+ {0x76, 0x08}, // SPECIES_ROSELIA
+ {0x74, 0x12}, // SPECIES_SLAKOTH
+ {0x78, 0x00}, // SPECIES_VIGOROTH
+ {0x86, 0x08}, // SPECIES_SLAKING
+ {0x55, 0x12}, // SPECIES_GULPIN
+ {0x66, 0x08}, // SPECIES_SWALOT
+ {0x88, 0x00}, // SPECIES_TROPIUS
+ {0x55, 0x0e}, // SPECIES_WHISMUR
+ {0x78, 0x03}, // SPECIES_LOUDRED
+ {0x88, 0x01}, // SPECIES_EXPLOUD
+ {0x55, 0x0e}, // SPECIES_CLAMPERL
+ {0x78, 0x03}, // SPECIES_HUNTAIL
+ {0x86, 0x0b}, // SPECIES_GOREBYSS
+ {0x68, 0x00}, // SPECIES_ABSOL
+ {0x56, 0x0e}, // SPECIES_SHUPPET
+ {0x55, 0x0c}, // SPECIES_BANETTE
+ {0x77, 0x08}, // SPECIES_SEVIPER
+ {0x87, 0x05}, // SPECIES_ZANGOOSE
+ {0x77, 0x0b}, // SPECIES_RELICANTH
+ {0x43, 0x14}, // SPECIES_ARON
+ {0x75, 0x0d}, // SPECIES_LAIRON
+ {0x88, 0x00}, // SPECIES_AGGRON
+ {0x34, 0x11}, // SPECIES_CASTFORM
+ {0x66, 0x08}, // SPECIES_VOLBEAT
+ {0x56, 0x08}, // SPECIES_ILLUMISE
+ {0x67, 0x07}, // SPECIES_LILEEP
+ {0x78, 0x00}, // SPECIES_CRADILY
+ {0x66, 0x08}, // SPECIES_ANORITH
+ {0x88, 0x00}, // SPECIES_ARMALDO
+ {0x35, 0x0f}, // SPECIES_RALTS
+ {0x47, 0x06}, // SPECIES_KIRLIA
+ {0x78, 0x01}, // SPECIES_GARDEVOIR
+ {0x56, 0x0b}, // SPECIES_BAGON
+ {0x66, 0x09}, // SPECIES_SHELGON
+ {0x87, 0x04}, // SPECIES_SALAMENCE
+ {0x55, 0x0f}, // SPECIES_BELDUM
+ {0x87, 0x07}, // SPECIES_METANG
+ {0x87, 0x06}, // SPECIES_METAGROSS
+ {0x78, 0x04}, // SPECIES_REGIROCK
+ {0x88, 0x02}, // SPECIES_REGICE
+ {0x88, 0x03}, // SPECIES_REGISTEEL
+ {0x87, 0x04}, // SPECIES_KYOGRE
+ {0x88, 0x01}, // SPECIES_GROUDON
+ {0x88, 0x00}, // SPECIES_RAYQUAZA
+ {0x88, 0x01}, // SPECIES_LATIAS
+ {0x88, 0x02}, // SPECIES_LATIOS
+ {0x66, 0x0d}, // SPECIES_JIRACHI
+ {0x88, 0x01}, // SPECIES_DEOXYS
+ {0x37, 0x06}, // SPECIES_CHIMECHO
+ {0x33, 0x14}, // SPECIES_EGG
+ {0x34, 0x10}, // SPECIES_UNOWN_B
+ {0x44, 0x10}, // SPECIES_UNOWN_C
{0x44, 0x10}, // SPECIES_UNOWN_D
- {0x44, 0x10}, // SPECIES_UNOWN_E
+ {0x44, 0x11}, // SPECIES_UNOWN_E
{0x44, 0x11}, // SPECIES_UNOWN_F
- {0x44, 0x11}, // SPECIES_UNOWN_G
- {0x35, 0x0e}, // SPECIES_UNOWN_H
- {0x44, 0x10}, // SPECIES_UNOWN_I
- {0x34, 0x10}, // SPECIES_UNOWN_J
- {0x34, 0x11}, // SPECIES_UNOWN_K
- {0x44, 0x11}, // SPECIES_UNOWN_L
- {0x34, 0x13}, // SPECIES_UNOWN_M
- {0x44, 0x13}, // SPECIES_UNOWN_N
- {0x43, 0x14}, // SPECIES_UNOWN_O
- {0x44, 0x10}, // SPECIES_UNOWN_P
- {0x34, 0x13}, // SPECIES_UNOWN_Q
- {0x43, 0x15}, // SPECIES_UNOWN_R
- {0x34, 0x13}, // SPECIES_UNOWN_S
- {0x45, 0x0c}, // SPECIES_UNOWN_T
- {0x34, 0x12}, // SPECIES_UNOWN_U
+ {0x35, 0x0e}, // SPECIES_UNOWN_G
+ {0x44, 0x10}, // SPECIES_UNOWN_H
+ {0x34, 0x10}, // SPECIES_UNOWN_I
+ {0x34, 0x11}, // SPECIES_UNOWN_J
+ {0x44, 0x11}, // SPECIES_UNOWN_K
+ {0x34, 0x13}, // SPECIES_UNOWN_L
+ {0x44, 0x13}, // SPECIES_UNOWN_M
+ {0x43, 0x14}, // SPECIES_UNOWN_N
+ {0x44, 0x10}, // SPECIES_UNOWN_O
+ {0x34, 0x13}, // SPECIES_UNOWN_P
+ {0x43, 0x15}, // SPECIES_UNOWN_Q
+ {0x34, 0x13}, // SPECIES_UNOWN_R
+ {0x45, 0x0c}, // SPECIES_UNOWN_S
+ {0x34, 0x12}, // SPECIES_UNOWN_T
+ {0x44, 0x12}, // SPECIES_UNOWN_U
{0x44, 0x12}, // SPECIES_UNOWN_V
- {0x44, 0x12}, // SPECIES_UNOWN_W
- {0x44, 0x13}, // SPECIES_UNOWN_X
- {0x33, 0x15}, // SPECIES_UNOWN_Y
- {0x34, 0x11}, // SPECIES_UNOWN_Z
- {0x34, 0x10}, // SPECIES_UNOWN_EMARK
- {0x35, 0x0f}, // SPECIES_UNOWN_QMARK
- {0x35, 0x0d},
+ {0x44, 0x13}, // SPECIES_UNOWN_W
+ {0x33, 0x15}, // SPECIES_UNOWN_X
+ {0x34, 0x11}, // SPECIES_UNOWN_Y
+ {0x34, 0x10}, // SPECIES_UNOWN_Z
+ {0x35, 0x0f}, // SPECIES_UNOWN_EMARK
+ {0x35, 0x0d}, // SPECIES_UNOWN_QMARK
};
diff --git a/src/dragon.c b/src/dragon.c
index 20ef357a0..49f1b57c8 100644
--- a/src/dragon.c
+++ b/src/dragon.c
@@ -1,13 +1,21 @@
#include "global.h"
#include "battle_anim.h"
+#include "scanline_effect.h"
+#include "task.h"
+#include "trig.h"
#include "constants/rgb.h"
-extern void sub_8113064(struct Sprite *);
-extern void sub_8113224(struct Sprite *);
-extern void sub_81131B4(struct Sprite *);
-extern void sub_8113224(struct Sprite *);
-extern void sub_8113250(struct Sprite *);
-extern void sub_81135EC(struct Sprite *);
+extern u16 gUnknown_0203A100[];
+
+void sub_8113064(struct Sprite *);
+void sub_81131B4(struct Sprite *);
+void sub_8113224(struct Sprite *);
+void sub_8113250(struct Sprite *);
+void sub_81135EC(struct Sprite *);
+static void sub_81132E0(struct Sprite *);
+static void sub_81134B8(u8);
+static void sub_8113574(struct Task *);
+static void sub_811369C(struct Sprite *);
const union AnimCmd gUnknown_08596E60[] =
{
@@ -178,3 +186,252 @@ const struct SpriteTemplate gUnknown_08596FB0 =
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_81135EC,
};
+
+void sub_8113064(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 = 1;
+ StoreSpriteCallbackInData6(sprite, move_anim_8074EE0);
+ sprite->callback = sub_80A66DC;
+}
+
+static void sub_8113100(struct Sprite *sprite)
+{
+ sub_80A6838(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, move_anim_8074EE0);
+}
+
+void sub_81131B4(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);
+ }
+
+ sub_80A6864(sprite, gBattleAnimArgs[1]);
+ sprite->pos1.y += gBattleAnimArgs[2];
+ sprite->callback = sub_80A67D8;
+ StoreSpriteCallbackInData6(sprite, move_anim_8074EE0);
+}
+
+void sub_8113224(struct Sprite *sprite)
+{
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ StartSpriteAffineAnim(sprite, 1);
+
+ sub_8113100(sprite);
+}
+
+void sub_8113250(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 = sub_80A861C(gBattlerAttacker, 0);
+ r0 = sub_80A861C(gBattlerAttacker, 1);
+ 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_81132E0;
+}
+
+static void sub_81132E0(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_81133E8(u8 taskId)
+{
+ struct ScanlineEffectParams sp;
+ struct Task *task = &gTasks[taskId];
+ u16 i;
+ u8 r1;
+ if (sub_80A8364(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_81134B8;
+}
+
+static void sub_81134B8(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_8113574(task);
+ break;
+ case 1:
+ if (++task->data[1] > 0x3C)
+ task->data[0]++;
+ sub_8113574(task);
+ break;
+ case 2:
+ if (++task->data[7] > 1)
+ {
+ task->data[7] = 0;
+ if (--task->data[6] == 0)
+ task->data[0]++;
+ }
+ sub_8113574(task);
+ break;
+ case 3:
+ gScanlineEffect.state = 3;
+ task->data[0]++;
+ break;
+ case 4:
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+static void sub_8113574(struct Task *task)
+{
+ u16 r3 = task->data[5];
+ u16 i;
+ 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;
+}
+
+void sub_81135EC(struct Sprite *sprite)
+{
+ int r6 = (gBattleAnimArgs[2] * 3) / 5;
+ int i;
+ 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_811369C;
+ for (i = 0; i < 7; i++)
+ gUnknown_0203A100[i] = sprite->data[i];
+}
+
+static void sub_811369C(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);
+}
diff --git a/src/effects_1.c b/src/effects_1.c
index 36676b70d..a8687bc38 100644
--- a/src/effects_1.c
+++ b/src/effects_1.c
@@ -13,7 +13,7 @@ extern void sub_80FED28(struct Sprite *);
extern void sub_80FEE78(struct Sprite *);
extern void sub_80FEF44(struct Sprite *);
extern void sub_80FEFFC(struct Sprite *);
-extern void sub_80FF268(struct Sprite *);
+extern void AnimMoveTwisterParticle(struct Sprite *);
extern void sub_80FF0F4(struct Sprite *);
extern void sub_80FF374(struct Sprite *);
extern void sub_80FF698(struct Sprite *);
@@ -437,7 +437,7 @@ const struct SpriteTemplate gUnknown_085923A8 =
.anims = gUnknown_08592388,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_80FF268,
+ .callback = AnimMoveTwisterParticle,
};
const union AnimCmd gUnknown_085923C0[] =
diff --git a/src/fight.c b/src/fight.c
index 89fe5900b..c9000fae4 100644
--- a/src/fight.c
+++ b/src/fight.c
@@ -1,25 +1,42 @@
#include "global.h"
#include "battle_anim.h"
+#include "gpu_regs.h"
+#include "random.h"
+#include "task.h"
+#include "trig.h"
#include "constants/rgb.h"
-extern void unc_080B08A0(struct Sprite *);
-extern void sub_810CE68(struct Sprite *);
-extern void sub_810CEB4(struct Sprite *);
-extern void sub_810CEE0(struct Sprite *);
-extern void sub_810CF30(struct Sprite *);
-extern void sub_810D10C(struct Sprite *);
-extern void sub_810D1B4(struct Sprite *);
-extern void sub_810D278(struct Sprite *);
-extern void sub_810D2E4(struct Sprite *);
-extern void sub_810D37C(struct Sprite *);
-extern void sub_810D40C(struct Sprite *);
-extern void sub_810D4F4(struct Sprite *);
-extern void sub_810D608(struct Sprite *);
-extern void sub_810D714(struct Sprite *);
-extern void sub_810D874(struct Sprite *);
-extern void sub_810D984(struct Sprite *);
-extern void sub_810DA10(struct Sprite *);
-extern void sub_810DA7C(struct Sprite *);
+void unc_080B08A0(struct Sprite *);
+void sub_810CE68(struct Sprite *);
+void sub_810CEB4(struct Sprite *);
+void AnimBasicFistOrFoot(struct Sprite *);
+void sub_810CF30(struct Sprite *);
+void sub_810D10C(struct Sprite *);
+void sub_810D1B4(struct Sprite *);
+void AnimSpinningKickOrPunch(struct Sprite *);
+void AnimStompFoot(struct Sprite *);
+void sub_810D37C(struct Sprite *);
+void sub_810D40C(struct Sprite *);
+void sub_810D4F4(struct Sprite *);
+void sub_810D608(struct Sprite *);
+void sub_810D714(struct Sprite *);
+void sub_810D874(struct Sprite *);
+void sub_810D984(struct Sprite *);
+void sub_810DA10(struct Sprite *);
+void sub_810DA7C(struct Sprite *);
+static void sub_810D0B8(struct Sprite *);
+static void sub_810D164(struct Sprite *);
+static void sub_810D240(struct Sprite *);
+static void AnimSpinningKickOrPunchFinish(struct Sprite *);
+static void AnimStompFootStep(struct Sprite *);
+static void AnimStompFootEnd(struct Sprite *);
+static void sub_810D47C(struct Sprite *);
+static void sub_810D5DC(struct Sprite *);
+static void sub_810D6A8(struct Sprite *);
+static void sub_810D770(struct Sprite *);
+static void sub_810D830(struct Sprite *);
+
+extern struct SpriteTemplate gBasicHitSplatSpriteTemplate;
const struct SpriteTemplate gUnknown_08595E14 =
{
@@ -109,7 +126,7 @@ const struct SpriteTemplate gFistFootSpriteTemplate =
.anims = gUnknown_08595E54,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_810CEE0,
+ .callback = AnimBasicFistOrFoot,
};
const struct SpriteTemplate gUnknown_08595EB0 =
@@ -165,7 +182,7 @@ const struct SpriteTemplate gUnknown_08595F14 =
.anims = gUnknown_08595E54,
.images = NULL,
.affineAnims = gUnknown_08595F10,
- .callback = sub_810D278,
+ .callback = AnimSpinningKickOrPunch,
};
const union AffineAnimCmd gUnknown_08595F2C[] =
@@ -188,7 +205,7 @@ const struct SpriteTemplate gMegaPunchKickSpriteTemplate =
.anims = gUnknown_08595E54,
.images = NULL,
.affineAnims = gUnknown_08595F44,
- .callback = sub_810D278,
+ .callback = AnimSpinningKickOrPunch,
};
const struct SpriteTemplate gUnknown_08595F60 =
@@ -199,7 +216,7 @@ const struct SpriteTemplate gUnknown_08595F60 =
.anims = gUnknown_08595E58,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_810D2E4,
+ .callback = AnimStompFoot,
};
const struct SpriteTemplate gUnknown_08595F78 =
@@ -396,3 +413,623 @@ const struct SpriteTemplate gUnknown_08596104 =
.affineAnims = gUnknown_08596100,
.callback = sub_810DA7C,
};
+
+void unc_080B08A0(struct Sprite *sprite)
+{
+ sub_80A6864(sprite, gBattleAnimArgs[0]);
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[0] = 15;
+ sprite->callback = WaitAnimForDuration;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+}
+
+void sub_810CE68(struct Sprite *sprite)
+{
+ if (gBattleAnimArgs[7] == 1 && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ {
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ gBattleAnimArgs[3] = -gBattleAnimArgs[3];
+ }
+
+ StartSpriteAnim(sprite, gBattleAnimArgs[6]);
+ gBattleAnimArgs[6] = 0;
+ sub_80A7938(sprite);
+}
+
+void sub_810CEB4(struct Sprite *sprite)
+{
+ if (IsContest())
+ {
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ gBattleAnimArgs[3] = -gBattleAnimArgs[3];
+ }
+
+ sub_810CE68(sprite);
+}
+
+// Displays a basic fist or foot sprite for a given duration.
+// Used by many fighting moves (and elemental "punch" moves).
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: duration
+// arg 3: ? (todo: related to initial pixel offsets)
+// arg 4: anim num
+void AnimBasicFistOrFoot(struct Sprite *sprite)
+{
+ StartSpriteAnim(sprite, gBattleAnimArgs[4]);
+
+ if (gBattleAnimArgs[3] == 0)
+ InitAnimSpritePos(sprite, 1);
+ else
+ sub_80A6980(sprite, TRUE);
+
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->callback = WaitAnimForDuration;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+}
+
+void sub_810CF30(struct Sprite *sprite)
+{
+ u8 battler;
+ s16 xMod, yMod;
+ s16 x, y;
+
+ if (gBattleAnimArgs[0] == 0)
+ battler = gBattleAnimAttacker;
+ else
+ battler = gBattleAnimTarget;
+
+ if (gBattleAnimArgs[2] < 0)
+ gBattleAnimArgs[2] = Random2() % 5;
+
+ StartSpriteAnim(sprite, gBattleAnimArgs[2]);
+ sprite->pos1.x = GetBattlerSpriteCoord(battler, 2);
+ sprite->pos1.y = GetBattlerSpriteCoord(battler, 3);
+
+ xMod = sub_80A861C(battler, 1) / 2;
+ yMod = sub_80A861C(battler, 0) / 4;
+
+ x = Random2() % xMod;
+ y = Random2() % yMod;
+
+ if (Random2() & 1)
+ x *= -1;
+ if (Random2() & 1)
+ y *= -1;
+
+ if ((gBattlerPositions[battler] & BIT_SIDE) == B_SIDE_PLAYER)
+ y += 0xFFF0;
+
+ sprite->pos1.x += x;
+ sprite->pos1.y += y;
+
+ sprite->data[0] = gBattleAnimArgs[1];
+ sprite->data[7] = CreateSprite(&gBasicHitSplatSpriteTemplate, sprite->pos1.x, sprite->pos1.y, sprite->subpriority + 1);
+ if (sprite->data[7] != 64)
+ {
+ StartSpriteAffineAnim(&gSprites[sprite->data[7]], 0);
+ gSprites[sprite->data[7]].callback = SpriteCallbackDummy;
+ }
+
+ sprite->callback = sub_810D0B8;
+}
+
+static void sub_810D0B8(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ if (sprite->data[7] != 64)
+ {
+ FreeOamMatrix(gSprites[sprite->data[7]].oam.matrixNum);
+ DestroySprite(&gSprites[sprite->data[7]]);
+ }
+
+ DestroyAnimSprite(sprite);
+ }
+ else
+ {
+ sprite->data[0]--;
+ }
+}
+
+void sub_810D10C(struct Sprite *sprite)
+{
+ sub_80A6980(sprite, TRUE);
+ sprite->data[0] = 30;
+
+ if (gBattleAnimArgs[2] == 0)
+ {
+ sprite->data[2] = sprite->pos1.x - 20;
+ }
+ else
+ {
+ sprite->data[2] = sprite->pos1.x + 20;
+ sprite->hFlip = 1;
+ }
+
+ sprite->data[4] = sprite->pos1.y - 20;
+ sprite->callback = StartAnimLinearTranslation;
+ StoreSpriteCallbackInData6(sprite, sub_810D164);
+}
+
+static void sub_810D164(struct Sprite *sprite)
+{
+ if (++sprite->data[5] == 11)
+ {
+ sprite->data[2] = sprite->pos1.x - sprite->pos2.x;
+ sprite->data[4] = sprite->pos1.y - sprite->pos2.y;
+ sprite->data[0] = 8;
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+
+ sprite->callback = StartAnimLinearTranslation;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+ }
+}
+
+void sub_810D1B4(struct Sprite *sprite)
+{
+ if (BATTLE_PARTNER(gBattleAnimAttacker) == gBattleAnimTarget && GetBattlerPosition(gBattleAnimTarget) < B_POSITION_PLAYER_RIGHT)
+ gBattleAnimArgs[0] *= -1;
+
+ sub_80A6980(sprite, TRUE);
+
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+
+ sprite->data[0] = gBattleAnimArgs[3];
+ 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;
+
+ InitAnimLinearTranslation(sprite);
+
+ sprite->data[5] = gBattleAnimArgs[5];
+ sprite->data[6] = gBattleAnimArgs[4];
+ sprite->data[7] = 0;
+
+ sprite->callback = sub_810D240;
+}
+
+static void sub_810D240(struct Sprite *sprite)
+{
+ if (!TranslateAnimLinear(sprite))
+ {
+ sprite->pos2.y += Sin(sprite->data[7] >> 8, sprite->data[5]);
+ sprite->data[7] += sprite->data[6];
+ }
+ else
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
+
+// Animates the spinning, shrinking kick or punch, which then
+// reappears at full size. Used by moves such as MOVE_MEGA_PUNCH and MOVE_MEGA_KICK.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: anim num
+// arg 3: spin duration
+void AnimSpinningKickOrPunch(struct Sprite *sprite)
+{
+ sub_80A6980(sprite, TRUE);
+ StartSpriteAnim(sprite, gBattleAnimArgs[2]);
+ sprite->data[0] = gBattleAnimArgs[3];
+
+ sprite->callback = WaitAnimForDuration;
+ StoreSpriteCallbackInData6(sprite, AnimSpinningKickOrPunchFinish);
+}
+
+static void AnimSpinningKickOrPunchFinish(struct Sprite *sprite)
+{
+ StartSpriteAffineAnim(sprite, 0);
+ sprite->affineAnimPaused = 1;
+ sprite->data[0] = 20;
+
+ sprite->callback = WaitAnimForDuration;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+}
+
+// Animates MOVE_STOMP's foot that slides downward.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: initial wait duration
+void AnimStompFoot(struct Sprite *sprite)
+{
+ sub_80A6980(sprite, TRUE);
+ sprite->data[0] = gBattleAnimArgs[2];
+
+ sprite->callback = AnimStompFootStep;
+}
+
+static void AnimStompFootStep(struct Sprite *sprite)
+{
+ if (--sprite->data[0] == -1)
+ {
+ sprite->data[0] = 6;
+ sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
+ sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
+
+ sprite->callback = StartAnimLinearTranslation;
+ StoreSpriteCallbackInData6(sprite, AnimStompFootEnd);
+ }
+}
+
+static void AnimStompFootEnd(struct Sprite *sprite)
+{
+ sprite->data[0] = 15;
+
+ sprite->callback = WaitAnimForDuration;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+}
+
+void sub_810D37C(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sub_80A6980(sprite, TRUE);
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->data[2] = gBattleAnimArgs[3];
+ sprite->data[0]++;
+ }
+ else
+ {
+ sprite->data[4] += sprite->data[1];
+ sprite->pos2.x = sprite->data[4] >> 8;
+ sprite->pos2.y = Sin(sprite->data[3], sprite->data[2]);
+ sprite->data[3] = (sprite->data[3] + 3) & 0xFF;
+
+ if (sprite->data[3] > 100)
+ sprite->invisible = sprite->data[3] % 2;
+
+ if (sprite->data[3] > 120)
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void sub_810D40C(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);
+ }
+
+ sprite->pos1.x += gBattleAnimArgs[1];
+ sprite->pos1.y += gBattleAnimArgs[2];
+
+ sprite->data[0] = 0;
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->data[2] = gBattleAnimArgs[4];
+ sprite->data[3] = 0;
+ sprite->callback = sub_810D47C;
+}
+
+static void sub_810D47C(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ if (--sprite->data[1] == 0)
+ {
+ if (sprite->data[2] == 0)
+ DestroyAnimSprite(sprite);
+ else
+ sprite->data[0]++;
+ }
+ break;
+ case 1:
+ if (++sprite->data[1] > 1)
+ {
+ sprite->data[1] = 0;
+ sprite->data[3]++;
+ if (sprite->data[3] & 1)
+ sprite->pos2.x = 2;
+ else
+ sprite->pos2.x = -2;
+ }
+
+ if (--sprite->data[2] == 0)
+ DestroyAnimSprite(sprite);
+ break;
+ }
+}
+
+void sub_810D4F4(struct Sprite *sprite)
+{
+ if (gBattleAnimArgs[0] == 0)
+ {
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0) + gBattleAnimArgs[2];
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1) + gBattleAnimArgs[3];
+ }
+ else
+ {
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 0) + gBattleAnimArgs[2];
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 1) + gBattleAnimArgs[3];
+ }
+
+ sprite->oam.tileNum += gBattleAnimArgs[1] * 16;
+ sprite->data[0] = 0;
+
+ switch (gBattleAnimArgs[1])
+ {
+ case 0:
+ sprite->data[6] = -3;
+ sprite->data[7] = -3;
+ break;
+ case 1:
+ sprite->data[6] = 3;
+ sprite->data[7] = -3;
+ break;
+ case 2:
+ sprite->data[6] = -3;
+ sprite->data[7] = 3;
+ break;
+ case 3:
+ sprite->data[6] = 3;
+ sprite->data[7] = 3;
+ break;
+ default:
+ DestroyAnimSprite(sprite);
+ return;
+ }
+
+ sprite->callback = sub_810D5DC;
+}
+
+static void sub_810D5DC(struct Sprite *sprite)
+{
+ sprite->pos1.x += sprite->data[6];
+ sprite->pos1.y += sprite->data[7];
+
+ if (++sprite->data[0] > 40)
+ DestroyAnimSprite(sprite);
+}
+
+void sub_810D608(struct Sprite *sprite)
+{
+ if (gBattleAnimArgs[0] == 0)
+ {
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattlerAttacker, 2);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattlerAttacker, 3);
+ sprite->oam.priority = sub_80A8328(gBattleAnimAttacker);
+ sprite->data[7] = gBattleAnimTarget;
+ }
+ else
+ {
+ sprite->oam.priority = sub_80A8328(gBattleAnimTarget);
+ sprite->data[7] = gBattleAnimAttacker;
+ }
+
+ sprite->data[0] = 0;
+ sprite->data[1] = 12;
+ sprite->data[2] = 8;
+ sprite->callback = sub_810D6A8;
+}
+
+static void sub_810D6A8(struct Sprite *sprite)
+{
+ if (++sprite->data[0] == 180)
+ {
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+
+ sprite->data[0] = 16;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = GetBattlerSpriteCoord(sprite->data[7], 2);
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = GetBattlerSpriteCoord(sprite->data[7], 3);
+
+ InitAnimLinearTranslation(sprite);
+ StoreSpriteCallbackInData6(sprite, move_anim_8074EE0);
+ sprite->callback = sub_80A6F98;
+ }
+}
+
+void sub_810D714(struct Sprite *sprite)
+{
+ sprite->pos1.x = gBattleAnimArgs[0];
+ sprite->pos1.y = 120;
+
+ sprite->data[0] = gBattleAnimArgs[3];
+ sub_80A8048(&sprite->data[4], &sprite->data[5], (void *)(sprite->pos1.y << 8));
+
+ sprite->data[6] = gBattleAnimArgs[1];
+ sprite->oam.tileNum += gBattleAnimArgs[2] * 4;
+
+ sprite->callback = sub_810D770;
+}
+
+static void sub_810D770(struct Sprite *sprite)
+{
+ void *var0;
+
+ if (sprite->data[0] != 0)
+ {
+ var0 = sub_80A8050(sprite->data[4], sprite->data[5]);
+ var0 -= sprite->data[6];
+ sub_80A8048(&sprite->data[4], &sprite->data[5], var0);
+
+ var0 = (void *)(((intptr_t)var0) >> 8);
+ sprite->pos1.y = (intptr_t)var0;
+ if (sprite->pos1.y < -8)
+ DestroyAnimSprite(sprite);
+ else
+ sprite->data[0]--;
+ }
+ else
+ {
+ s16 pos0 = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
+ s16 pos1 = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
+ s16 pos2 = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
+ s16 pos3 = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
+
+ sprite->data[0] = pos2 - pos0;
+ sprite->data[1] = pos3 - pos1;
+ sprite->data[2] = sprite->pos1.x << 4;
+ sprite->data[3] = sprite->pos1.y << 4;
+
+ sprite->callback = sub_810D830;
+ }
+}
+
+static void sub_810D830(struct Sprite *sprite)
+{
+ u16 edgeX;
+
+ sprite->data[2] += sprite->data[0];
+ sprite->data[3] += sprite->data[1];
+ sprite->pos1.x = sprite->data[2] >> 4;
+ sprite->pos1.y = sprite->data[3] >> 4;
+
+ edgeX = sprite->pos1.x + 8;
+ if (edgeX > 256 || sprite->pos1.y < -8 || sprite->pos1.y > 120)
+ DestroyAnimSprite(sprite);
+}
+
+void sub_810D874(struct Sprite *sprite)
+{
+ u8 battler;
+
+ if (gBattleAnimArgs[0] == 0)
+ {
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattlerAttacker, 2);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattlerAttacker, 3);
+ battler = gBattleAnimTarget;
+ sprite->oam.priority = sub_80A8328(gBattleAnimAttacker);
+ }
+ else
+ {
+ battler = gBattleAnimAttacker;
+ sprite->oam.priority = sub_80A8328(gBattleAnimTarget);
+ }
+
+ if (IsContest())
+ sprite->oam.matrixNum |= 0x8;
+ else if (GetBattlerSide(battler) == B_SIDE_PLAYER)
+ sprite->oam.matrixNum |= 0x18;
+
+ sprite->data[0] = 16;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = GetBattlerSpriteCoord(battler, 2);
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = GetBattlerSpriteCoord(battler, 3);
+
+ InitAnimLinearTranslation(sprite);
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+ sprite->callback = sub_80A6F98;
+}
+
+static void sub_810D960(struct Sprite *sprite)
+{
+ if (sprite->data[0] == sprite->data[4])
+ DestroyAnimSprite(sprite);
+
+ sprite->data[0]++;
+}
+
+void sub_810D984(struct Sprite *sprite)
+{
+ u8 turn;
+
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->data[2] = gBattleAnimArgs[0];
+ sprite->data[3] = gBattleAnimArgs[1];
+ sprite->data[4] = gBattleAnimArgs[2];
+
+ turn = gAnimMoveTurn;
+ if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
+ turn++;
+
+ if (turn & 1)
+ {
+ sprite->data[2] = -sprite->data[2];
+ sprite->data[1]++;
+ }
+
+ StartSpriteAnim(sprite, sprite->data[1]);
+ sprite->pos2.x = sprite->data[2];
+ sprite->pos2.y = sprite->data[3];
+ sprite->callback = sub_810D960;
+}
+
+void sub_810DA10(struct Sprite *sprite)
+{
+ if (gBattleAnimArgs[2] == 0)
+ InitAnimSpritePos(sprite, 0);
+ else
+ sub_80A6980(sprite, FALSE);
+
+ if (IsContest())
+ {
+ StartSpriteAnim(sprite, 2);
+ }
+ else if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ {
+ StartSpriteAnim(sprite, 1);
+ }
+
+ sprite->callback = sub_80A67D8;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+}
+
+void sub_810DA7C(struct Sprite *sprite)
+{
+ if (sprite->affineAnimEnded)
+ {
+ sprite->data[1] = (sprite->data[1] + 40) & 0xFF;
+ sprite->pos2.x = Sin(sprite->data[1], 2);
+ if (++sprite->data[0] > 40)
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void sub_810DABC(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ sub_80A6DAC(0);
+ task->data[8] = gBattleAnimArgs[0];
+ task->data[0]++;
+ break;
+ case 1:
+ if (--task->data[8] == -1)
+ task->data[0]++;
+ break;
+ case 2:
+ default:
+ task->data[9] += 1280;
+ break;
+ }
+
+ task->data[10] += 2816;
+
+ if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
+ gBattle_BG3_X += task->data[9] >> 8;
+ else
+ gBattle_BG3_X -= task->data[9] >> 8;
+
+ gBattle_BG3_Y += task->data[10] >> 8;
+ task->data[9] &= 0xFF;
+ task->data[10] &= 0xFF;
+
+ if (gBattleAnimArgs[7] == -1)
+ {
+ gBattle_BG3_X = 0;
+ gBattle_BG3_Y = 0;
+ sub_80A6DAC(1);
+ DestroyAnimVisualTask(taskId);
+ }
+}
diff --git a/src/frontier_util.c b/src/frontier_util.c
index 846d8076e..a35088f6f 100644
--- a/src/frontier_util.c
+++ b/src/frontier_util.c
@@ -36,7 +36,7 @@
#include "constants/items.h"
#include "constants/event_objects.h"
-extern u8 gUnknown_0203CEF8[];
+extern u8 gSelectedOrderFromParty[];
struct FrontierBrainMon
{
@@ -779,7 +779,7 @@ static void sub_81A1968(void)
break;
case 4:
for (i = 0; i < 4; i++)
- gSaveBlock2Ptr->frontier.selectedPartyMons[i] = gUnknown_0203CEF8[i];
+ gSaveBlock2Ptr->frontier.selectedPartyMons[i] = gSelectedOrderFromParty[i];
break;
case 6:
gSaveBlock2Ptr->frontier.field_CA9_b = gSpecialVar_0x8006;
@@ -796,8 +796,8 @@ static void sub_81A1AD4(void)
sub_81B8558();
for (i = 0; i < gSpecialVar_0x8005; i++)
- gUnknown_0203CEF8[i] = gSaveBlock2Ptr->frontier.selectedPartyMons[i];
- ReducePlayerPartyToThree();
+ gSelectedOrderFromParty[i] = gSaveBlock2Ptr->frontier.selectedPartyMons[i];
+ ReducePlayerPartyToSelectedMons();
}
static void DoSoftReset_(void)
diff --git a/src/graphics.c b/src/graphics.c
index 7c28aa7b6..2a21b610a 100644
--- a/src/graphics.c
+++ b/src/graphics.c
@@ -1,8 +1,8 @@
#include "global.h"
-const u32 gBattleTextboxTiles[] = INCBIN_U32("graphics/interface/menu.4bpp.lz");
-const u32 gBattleTextboxPalette[] = INCBIN_U32("graphics/interface/menu.gbapal.lz");
-const u32 gBattleTextboxTilemap[] = INCBIN_U32("graphics/interface/menu_map.bin.lz");
+const u32 gBattleTextboxTiles[] = INCBIN_U32("graphics/battle_interface/textbox.4bpp.lz");
+const u32 gBattleTextboxPalette[] = INCBIN_U32("graphics/battle_interface/textbox.gbapal.lz");
+const u32 gBattleTextboxTilemap[] = INCBIN_U32("graphics/battle_interface/textbox_map.bin.lz");
const u32 gMonStillFrontPic_CircledQuestionMark[] = INCBIN_U32("graphics/pokemon/front_pics/circled_question_mark_still_front_pic.4bpp.lz");
const u32 gMonBackPic_CircledQuestionMark[] = INCBIN_U32("graphics/pokemon/back_pics/circled_question_mark_back_pic.4bpp.lz");
diff --git a/src/ground.c b/src/ground.c
index 33eb3660a..6cb7b8557 100644
--- a/src/ground.c
+++ b/src/ground.c
@@ -1,14 +1,31 @@
#include "global.h"
#include "battle_anim.h"
+#include "random.h"
+#include "scanline_effect.h"
+#include "task.h"
+#include "trig.h"
#include "constants/rgb.h"
-extern void sub_8114994(struct Sprite *);
-extern void sub_8114A7C(struct Sprite *);
-extern void sub_8114AF0(struct Sprite *);
-extern void sub_8114AF0(struct Sprite *);
-extern void sub_8114B80(struct Sprite *);
-extern void sub_81151A0(struct Sprite *);
-extern void sub_8115244(struct Sprite *);
+void AnimBonemerangProjectile(struct Sprite *);
+void AnimBoneHitProjectile(struct Sprite *);
+void AnimDirtScatter(struct Sprite *);
+void AnimMudSportDirt(struct Sprite *);
+void AnimFissureDirtPlumeParticle(struct Sprite *);
+void AnimDigDirtMound(struct Sprite *);
+static void AnimBonemerangProjectileStep(struct Sprite *);
+static void AnimBonemerangProjectileEnd(struct Sprite *);
+static void AnimMudSportDirtRising(struct Sprite *);
+static void AnimMudSportDirtFalling(struct Sprite *);
+static void sub_8114CFC(u8);
+static void sub_8114EB4(u8);
+static void sub_8114F54(u8);
+static void sub_8114FD8(u8);
+static void sub_81150E0(u8, s16, s16);
+static void AnimFissureDirtPlumeParticleStep(struct Sprite *);
+static void sub_81153AC(u8);
+static void sub_81154A4(u8);
+static void sub_8115588(struct Task *);
+static void sub_81156D0(u8);
const union AffineAnimCmd gUnknown_08597150[] =
{
@@ -40,7 +57,7 @@ const struct SpriteTemplate gUnknown_08597178 =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_08597170,
- .callback = sub_8114994,
+ .callback = AnimBonemerangProjectile,
};
const struct SpriteTemplate gUnknown_08597190 =
@@ -51,7 +68,7 @@ const struct SpriteTemplate gUnknown_08597190 =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_08597174,
- .callback = sub_8114A7C,
+ .callback = AnimBoneHitProjectile,
};
const struct SpriteTemplate gUnknown_085971A8 =
@@ -62,7 +79,7 @@ const struct SpriteTemplate gUnknown_085971A8 =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_8114AF0,
+ .callback = AnimDirtScatter,
};
const union AnimCmd gUnknown_085971C0[] =
@@ -84,7 +101,7 @@ const struct SpriteTemplate gUnknown_085971CC =
.anims = gUnknown_085971C8,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_8114AF0,
+ .callback = AnimDirtScatter,
};
const struct SpriteTemplate gUnknown_085971E4 =
@@ -95,7 +112,7 @@ const struct SpriteTemplate gUnknown_085971E4 =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_8114B80,
+ .callback = AnimMudSportDirt,
};
const struct SpriteTemplate gUnknown_085971FC =
@@ -106,7 +123,7 @@ const struct SpriteTemplate gUnknown_085971FC =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_81151A0,
+ .callback = AnimFissureDirtPlumeParticle,
};
const struct SpriteTemplate gUnknown_08597214 =
@@ -117,5 +134,615 @@ const struct SpriteTemplate gUnknown_08597214 =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_8115244,
+ .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.
+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 (TranslateAnimArc(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 (TranslateAnimArc(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
+void AnimBoneHitProjectile(struct Sprite *sprite)
+{
+ sub_80A6980(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
+void AnimDirtScatter(struct Sprite *sprite)
+{
+ u8 targetXPos, targetYPos;
+ s16 xOffset, yOffset;
+
+ InitAnimSpritePos(sprite, 1);
+
+ targetXPos = GetBattlerSpriteCoord2(gBattleAnimTarget, 2);
+ targetYPos = GetBattlerSpriteCoord2(gBattleAnimTarget, 3);
+
+ xOffset = Random2() & 0x1F;
+ yOffset = Random2() & 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, 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
+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_8114CBC(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ if (gBattleAnimArgs[0] == 0)
+ task->func = sub_8114CFC;
+ else
+ task->func = sub_8114EB4;
+
+ task->func(taskId);
+}
+
+static void sub_8114CFC(u8 taskId)
+{
+ u8 var0;
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[10] = GetAnimBattlerSpriteId(0);
+ task->data[11] = sub_80A8364(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 = 1;
+ task->data[0]++;
+ break;
+ case 1:
+ sub_81150E0(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_8114EB4(u8 taskId)
+{
+ u8 spriteId = GetAnimBattlerSpriteId(0);
+ gSprites[spriteId].invisible = 1;
+ gSprites[spriteId].pos2.x = 0;
+ gSprites[spriteId].pos2.y = 0;
+
+ if (sub_80A8364(gBattleAnimAttacker) == 1)
+ gBattle_BG1_Y = 0;
+ else
+ gBattle_BG2_Y = 0;
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_8114F14(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ if (gBattleAnimArgs[0] == 0)
+ task->func = sub_8114F54;
+ else
+ task->func = sub_8114FD8;
+
+ task->func(taskId);
+}
+
+static void sub_8114F54(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_8114FD8(u8 taskId)
+{
+ u8 var0;
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[10] = GetAnimBattlerSpriteId(0);
+ task->data[11] = sub_80A8364(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_81150E0(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_81150E0(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
+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 (TranslateAnimArc(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
+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_81152DC(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_81153AC;
+ 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_81154A4;
+ break;
+ default:
+ task->data[9] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
+ if (task->data[9] == 0xFF)
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+ else
+ {
+ task->data[13] = 1;
+ task->func = sub_81154A4;
+ }
+
+ break;
+ }
+}
+
+static void sub_81153AC(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_81154A4(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_8115588(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_8115588(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_8115588(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 AnimTask_IsPowerOver99(u8 taskId)
+{
+ gBattleAnimArgs[15] = gAnimMovePower > 99;
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_8115628(u8 taskId)
+{
+ struct Task *newTask;
+ u8 battler = (gBattleAnimArgs[0] & 1) ? gBattleAnimTarget : gBattleAnimAttacker;
+
+ if (gBattleAnimArgs[0] > 1)
+ battler ^= 2;
+
+ newTask = &gTasks[CreateTask(sub_81156D0, 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_81156D0(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/poison.c b/src/poison.c
index f0d8ec553..efa89ec13 100644
--- a/src/poison.c
+++ b/src/poison.c
@@ -1,14 +1,19 @@
#include "global.h"
#include "battle_anim.h"
+#include "trig.h"
#include "constants/rgb.h"
extern void sub_80A77C8(struct Sprite *);
-extern void sub_810DBAC(struct Sprite *);
-extern void sub_810DC2C(struct Sprite *);
-extern void sub_810DCD0(struct Sprite *);
-extern void sub_810DD50(struct Sprite *);
-extern void sub_810DDC4(struct Sprite *);
-extern void sub_810DDC4(struct Sprite *);
+
+void sub_810DBAC(struct Sprite *);
+void sub_810DC2C(struct Sprite *);
+void sub_810DCD0(struct Sprite *);
+void sub_810DD50(struct Sprite *);
+void AnimBubbleEffect(struct Sprite *);
+static void sub_810DC10(struct Sprite *);
+static void sub_810DCB4(struct Sprite *);
+static void sub_810DD24(struct Sprite *);
+static void AnimBubbleEffectStep(struct Sprite *);
extern const union AnimCmd *const gUnknown_08595200[];
@@ -170,7 +175,7 @@ const struct SpriteTemplate gPoisonBubbleSpriteTemplate =
.anims = gUnknown_08596164,
.images = NULL,
.affineAnims = gUnknown_0859623C,
- .callback = sub_810DDC4,
+ .callback = AnimBubbleEffect,
};
const struct SpriteTemplate gWaterBubbleSpriteTemplate =
@@ -181,5 +186,138 @@ const struct SpriteTemplate gWaterBubbleSpriteTemplate =
.anims = gUnknown_08595200,
.images = NULL,
.affineAnims = gUnknown_0859623C,
- .callback = sub_810DDC4,
+ .callback = AnimBubbleEffect,
};
+
+void sub_810DBAC(struct Sprite *sprite)
+{
+ if (!gBattleAnimArgs[3])
+ StartSpriteAnim(sprite, 2);
+
+ InitAnimSpritePos(sprite, 1);
+
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
+ sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
+ sprite->data[5] = -30;
+
+ InitAnimArcTranslation(sprite);
+
+ sprite->callback = sub_810DC10;
+}
+
+static void sub_810DC10(struct Sprite *sprite)
+{
+ if (TranslateAnimArc(sprite))
+ DestroyAnimSprite(sprite);
+}
+
+void sub_810DC2C(struct Sprite *sprite)
+{
+ s16 l1, l2;
+ if (!gBattleAnimArgs[3])
+ StartSpriteAnim(sprite, 2);
+
+ InitAnimSpritePos(sprite, 1);
+ SetAverageBattlerPositions(gBattleAnimTarget, 1, &l1, &l2);
+
+ if (GetBattlerSide(gBattleAnimAttacker))
+ gBattleAnimArgs[4] = -gBattleAnimArgs[4];
+
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[2] = l1 + gBattleAnimArgs[4];
+ sprite->data[4] = l2 + gBattleAnimArgs[5];
+ sprite->data[5] = -30;
+
+ InitAnimArcTranslation(sprite);
+
+ sprite->callback = sub_810DCB4;
+}
+
+static void sub_810DCB4(struct Sprite *sprite)
+{
+ if (TranslateAnimArc(sprite))
+ DestroyAnimSprite(sprite);
+}
+
+void sub_810DCD0(struct Sprite *sprite)
+{
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[0];
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[1];
+
+ InitSpriteDataForLinearTranslation(sprite);
+
+ sprite->data[5] = sprite->data[1] / gBattleAnimArgs[2];
+ sprite->data[6] = sprite->data[2] / gBattleAnimArgs[2];
+
+ sprite->callback = sub_810DD24;
+}
+
+static void sub_810DD24(struct Sprite *sprite)
+{
+ sub_80A656C(sprite);
+
+ sprite->data[1] -= sprite->data[5];
+ sprite->data[2] -= sprite->data[6];
+
+ if (!sprite->data[0])
+ DestroyAnimSprite(sprite);
+}
+
+void sub_810DD50(struct Sprite *sprite)
+{
+ SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &sprite->pos1.x, &sprite->pos1.y);
+
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ gBattleAnimArgs[0] = -gBattleAnimArgs[0];
+
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2];
+ sprite->data[4] = sprite->pos1.y + sprite->data[0];
+
+ sprite->callback = StartAnimLinearTranslation;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+}
+
+// Animates a bubble by rising upward, swaying side to side, and
+// enlarging the sprite. This is used as an after-effect by poison-type
+// moves, along with MOVE_BUBBLE, and MOVE_BUBBLEBEAM.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: 0 = single-target, 1 = multi-target
+void AnimBubbleEffect(struct Sprite *sprite)
+{
+ if (!gBattleAnimArgs[2])
+ {
+ sub_80A6980(sprite, TRUE);
+ }
+ else
+ {
+ SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &sprite->pos1.x, &sprite->pos1.y);
+
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ gBattleAnimArgs[0] = -gBattleAnimArgs[0];
+
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ }
+
+ sprite->callback = AnimBubbleEffectStep;
+}
+
+static void AnimBubbleEffectStep(struct Sprite *sprite)
+{
+ sprite->data[0] = (sprite->data[0] + 0xB) & 0xFF;
+ sprite->pos2.x = Sin(sprite->data[0], 4);
+ sprite->data[1] += 0x30;
+ sprite->pos2.y = -(sprite->data[1] >> 8);
+
+ if (sprite->affineAnimEnded)
+ DestroyAnimSprite(sprite);
+}
diff --git a/src/pokeball.c b/src/pokeball.c
index 09e7ac639..ad839e6af 100644
--- a/src/pokeball.c
+++ b/src/pokeball.c
@@ -402,7 +402,7 @@ static void Task_DoPokeballSendOutAnim(u8 taskId)
gSprites[ballSpriteId].data[2] = GetBattlerSpriteCoord(gBattlerTarget, BATTLER_COORD_X);
gSprites[ballSpriteId].data[4] = GetBattlerSpriteCoord(gBattlerTarget, BATTLER_COORD_Y) - 16;
gSprites[ballSpriteId].data[5] = -40;
- sub_80A68D4(&gSprites[ballSpriteId]);
+ InitAnimArcTranslation(&gSprites[ballSpriteId]);
gSprites[ballSpriteId].oam.affineParam = taskId;
gTasks[taskId].tOpponentBattler = gBattlerTarget;
gTasks[taskId].func = TaskDummy;
@@ -898,7 +898,7 @@ static void SpriteCB_PlayerMonSendOut_1(struct Sprite *sprite)
sprite->data[4] = GetBattlerSpriteCoord(sprite->sBattler, 3) + 24;
sprite->data[5] = -30;
sprite->oam.affineParam = sprite->sBattler;
- sub_80A68D4(sprite);
+ InitAnimArcTranslation(sprite);
sprite->callback = SpriteCB_PlayerMonSendOut_2;
}
diff --git a/src/rock.c b/src/rock.c
index 83af52865..3b8e505d8 100644
--- a/src/rock.c
+++ b/src/rock.c
@@ -1,22 +1,37 @@
#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/rgb.h"
-
-extern void sub_81109F0(struct Sprite *);
-extern void sub_8110AB4(struct Sprite *);
-extern void sub_8110B38(struct Sprite *);
-extern void sub_8110E4C(struct Sprite *);
-extern void sub_8110F30(struct Sprite *);
-extern void sub_811131C(struct Sprite *);
-extern void sub_8111388(struct Sprite *);
-extern void sub_8111418(struct Sprite *);
-extern void sub_8111444(struct Sprite *);
-extern void sub_80FF268(struct Sprite *);
-extern void sub_80A8EE4(struct Sprite *);
+#include "constants/songs.h"
extern const union AnimCmd *const gUnknown_085950E0[];
extern const union AnimCmd *const gUnknown_085954D0[];
+extern void AnimMoveTwisterParticle(struct Sprite *);
+
+void sub_81109F0(struct Sprite *);
+void sub_8110AB4(struct Sprite *);
+void AnimDirtParticleAcrossScreen(struct Sprite *);
+void AnimRaiseSprite(struct Sprite *);
+void sub_81110A4(u8 taskId);
+void sub_811131C(struct Sprite *);
+void sub_8111388(struct Sprite *);
+void sub_8111418(struct Sprite *);
+void sub_8111444(struct Sprite *);
+void sub_8110B38(struct Sprite *);
+static void sub_8110A70(struct Sprite *);
+static void sub_8110B80(struct Sprite *sprite);
+static void sub_8110CB0(u8 taskId);
+static void sub_8111214(struct Task *task);
+static u8 sub_811135C(void);
+static void sub_81113C8(struct Sprite *sprite);
+static void sub_811149C(struct Sprite *sprite);
+
const union AnimCmd gUnknown_08596AE0[] =
{
ANIMCMD_FRAME(32, 1),
@@ -118,7 +133,7 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_8596BA0 =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_8110E4C,
+ .callback = AnimDirtParticleAcrossScreen,
};
const struct Subsprite gUnknown_08596BB8[] =
@@ -194,7 +209,7 @@ const struct SpriteTemplate gUnknown_08596C10 =
.anims = gUnknown_08596BF8,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_8110F30,
+ .callback = AnimRaiseSprite,
};
const struct SpriteTemplate gUnknown_08596C28 =
@@ -278,7 +293,7 @@ const struct SpriteTemplate gUnknown_08596CC8 =
.anims = gUnknown_08596C08,
.images = NULL,
.affineAnims = gUnknown_08596C90,
- .callback = sub_80FF268,
+ .callback = AnimMoveTwisterParticle,
};
const struct SpriteTemplate gUnknown_08596CE0 =
@@ -291,3 +306,573 @@ const struct SpriteTemplate gUnknown_08596CE0 =
.affineAnims = gUnknown_08596C90,
.callback = sub_80A8EE4,
};
+
+void sub_81109F0(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_8110A70);
+ sprite->callback = sub_80A6450;
+ sprite->callback(sprite);
+}
+
+static void sub_8110A70(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, move_anim_8074EE0);
+ sprite->callback = sub_80A6450;
+ sprite->callback(sprite);
+}
+
+void sub_8110AB4(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 = sub_80A656C;
+ StoreSpriteCallbackInData6(sprite, move_anim_8074EE0);
+}
+
+void sub_8110B38(struct Sprite *sprite)
+{
+ if (gBattleAnimArgs[6] == 0)
+ InitAnimSpritePos(sprite, 0);
+ else
+ sub_80A6980(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_8110B80;
+}
+
+static void sub_8110B80(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)
+{
+ int var0;
+ struct UnknownAnimStruct2 unknownStruct;
+
+ 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_80A6B30(&unknownStruct);
+ sub_80A6CC0(unknownStruct.bgId, gUnknown_08D8D58C, unknownStruct.tilesOffset);
+ sub_80A6D60(&unknownStruct, gUnknown_08D8D410, 0);
+ LoadCompressedPalette(&gBattleAnimSpritePalette_261, unknownStruct.unk8 * 16, 32);
+
+ if (gBattleAnimArgs[0] && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ var0 = 1;
+
+ gTasks[taskId].data[0] = var0;
+ gTasks[taskId].func = sub_8110CB0;
+}
+
+static void sub_8110CB0(u8 taskId)
+{
+ struct UnknownAnimStruct2 unknownStruct;
+
+ 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_80A6B30(&unknownStruct);
+ sub_80A6C68(unknownStruct.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)
+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 = 8;
+ }
+ else
+ {
+ sprite->pos1.x = -64;
+ }
+
+ sprite->pos1.y = gBattleAnimArgs[0];
+ SetSubspriteTables(sprite, gUnknown_08596BC0);
+ 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]
+void AnimRaiseSprite(struct Sprite *sprite)
+{
+ StartSpriteAnim(sprite, gBattleAnimArgs[4]);
+ InitAnimSpritePos(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_8110F74(u8 taskId)
+{
+ u16 var0, var1, var2, var3;
+ u8 var4;
+ int 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_811135C();
+ 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(-64);
+ pan2 = BattleAnimAdjustPanning(63);
+
+ task->data[13] = pan1;
+ task->data[14] = (pan2 - pan1) / task->data[8];
+ task->data[1] = var4;
+ task->data[15] = GetAnimBattlerSpriteId(0);
+
+ task->func = sub_81110A4;
+}
+
+void sub_81110A4(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_8111214(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_8111214(struct Task *task)
+{
+ const struct SpriteTemplate *spriteTemplate;
+ int var0;
+ u16 x, y;
+ u8 spriteId;
+
+ switch (task->data[1])
+ {
+ case 1:
+ spriteTemplate = &gUnknown_08596C28;
+ var0 = 0;
+ break;
+ case 2:
+ case 3:
+ spriteTemplate = &gUnknown_08596C40;
+ var0 = 80;
+ break;
+ case 4:
+ spriteTemplate = &gUnknown_08596C40;
+ var0 = 64;
+ break;
+ case 5:
+ spriteTemplate = &gUnknown_08596C40;
+ 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;
+}
+
+void sub_811131C(struct Sprite *sprite)
+{
+ if (TranslateAnimArc(sprite))
+ {
+ u8 taskId = FindTaskIdByFunc(sub_81110A4);
+ if (taskId != 0xFF)
+ gTasks[taskId].data[11]--;
+
+ DestroySprite(sprite);
+ }
+}
+
+static u8 sub_811135C(void)
+{
+ u8 retVal = gAnimDisableStructPtr->rolloutTimerStartValue - gAnimDisableStructPtr->rolloutTimer;
+ u8 var0 = retVal - 1;
+ if (var0 > 4)
+ retVal = 1;
+
+ return retVal;
+}
+
+void sub_8111388(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_81113C8;
+ sprite->invisible = 1;
+}
+
+static void sub_81113C8(struct Sprite *sprite)
+{
+ sprite->invisible = 0;
+ 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);
+ }
+}
+
+void sub_8111418(struct Sprite *sprite)
+{
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)
+ StartSpriteAffineAnim(sprite, 1);
+
+ TranslateAnimSpriteToTargetMonLocation(sprite);
+}
+
+void sub_8111444(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_811149C;
+}
+
+static void sub_811149C(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_811152C(u8 taskId)
+{
+ if (gTasks[taskId].data[0] == 0)
+ {
+ sub_80A6DAC(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_80A6DAC(1);
+ DestroyAnimVisualTask(taskId);
+ }
+
+ gTasks[taskId].data[0]++;
+}
+
+void sub_8111590(u8 taskId)
+{
+ if (gTasks[taskId].data[0] == 0)
+ {
+ sub_80A6DAC(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_80A6DAC(1);
+ DestroyAnimVisualTask(taskId);
+ }
+}
diff --git a/src/rom_8011DC0.c b/src/rom_8011DC0.c
index bf16a20fc..b7ca087fd 100644
--- a/src/rom_8011DC0.c
+++ b/src/rom_8011DC0.c
@@ -1784,7 +1784,7 @@ void sub_801440C(u8 taskId)
ScriptContext2_Disable();
}
-extern u8 gUnknown_0203CEF8[];
+extern u8 gSelectedOrderFromParty[];
void sub_8014790(u8 taskId)
{
@@ -1802,8 +1802,8 @@ void sub_8014790(u8 taskId)
gLinkPlayers[0].linkType = 0x2211;
gLinkPlayers[0].id = 0;
gLinkPlayers[1].id = 2;
- sendBuff[0] = GetMonData(&gPlayerParty[gUnknown_0203CEF8[0] - 1], MON_DATA_SPECIES);
- sendBuff[1] = GetMonData(&gPlayerParty[gUnknown_0203CEF8[1] - 1], MON_DATA_SPECIES, NULL);
+ sendBuff[0] = GetMonData(&gPlayerParty[gSelectedOrderFromParty[0] - 1], MON_DATA_SPECIES);
+ sendBuff[1] = GetMonData(&gPlayerParty[gSelectedOrderFromParty[1] - 1], MON_DATA_SPECIES, NULL);
gMain.savedCallback = NULL;
data[0] = 4;
sub_800E3A8();
diff --git a/src/script_pokemon_util_80F87D8.c b/src/script_pokemon_util_80F87D8.c
new file mode 100755
index 000000000..7fc61f953
--- /dev/null
+++ b/src/script_pokemon_util_80F87D8.c
@@ -0,0 +1,707 @@
+#include "global.h"
+#include "battle.h"
+#include "battle_gfx_sfx_util.h"
+#include "berry.h"
+#include "contest.h"
+#include "contest_link_80F57C4.h"
+#include "contest_painting.h"
+#include "daycare.h"
+#include "decompress.h"
+#include "event_data.h"
+#include "event_object_movement.h"
+#include "international_string_util.h"
+#include "link.h"
+#include "link_rfu.h"
+#include "main.h"
+#include "menu.h"
+#include "overworld.h"
+#include "palette.h"
+#include "party_menu.h"
+#include "pokedex.h"
+#include "pokemon.h"
+#include "random.h"
+#include "script.h"
+#include "script_menu.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "tv.h"
+#include "constants/event_objects.h"
+#include "constants/items.h"
+#include "constants/species.h"
+#include "constants/vars.h"
+
+extern const u16 gEventObjectPalette8[];
+extern const u16 gEventObjectPalette17[];
+extern const u16 gEventObjectPalette33[];
+extern const u16 gEventObjectPalette34[];
+extern const struct CompressedSpriteSheet gMonFrontPicTable[];
+
+extern u8 gSelectedOrderFromParty[];
+
+static const u8 gUnknown_0858D8EC[] = { 3, 4, 5, 14 };
+
+static void sub_80F8EE8(u8 taskId);
+static void sub_80F9088(u8 taskId);
+static void sub_80F9460(void);
+static void sub_80F94B8(void);
+
+void SetContestTrainerGfxIds(void)
+{
+ gSaveBlock1Ptr->vars[VAR_OBJ_GFX_ID_0 - VARS_START] = gContestMons[0].trainerGfxId;
+ gSaveBlock1Ptr->vars[VAR_OBJ_GFX_ID_1 - VARS_START] = gContestMons[1].trainerGfxId;
+ gSaveBlock1Ptr->vars[VAR_OBJ_GFX_ID_2 - VARS_START] = gContestMons[2].trainerGfxId;
+}
+
+void sub_80F8814(void)
+{
+ u16 var1;
+ u8 var0 = gSpecialVar_0x8005;
+ switch (var0)
+ {
+ case 0:
+ var1 = 3;
+ break;
+ case 1:
+ var1 = 4;
+ break;
+ case 2:
+ var1 = 5;
+ break;
+ default:
+ var1 = 100;
+ break;
+ }
+
+ gSpecialVar_0x8004 = var1;
+}
+
+void sub_80F8850(void)
+{
+ sub_80F8264();
+ sub_80F8290();
+ sub_80F8438();
+}
+
+void sub_80F8864(void)
+{
+ int contestWinner;
+ switch (gSpecialVar_ContestCategory)
+ {
+ case CONTEST_CATEGORY_COOL:
+ contestWinner = 8;
+ break;
+ case CONTEST_CATEGORY_BEAUTY:
+ contestWinner = 9;
+ break;
+ case CONTEST_CATEGORY_CUTE:
+ contestWinner = 10;
+ break;
+ case CONTEST_CATEGORY_SMART:
+ contestWinner = 11;
+ break;
+ case CONTEST_CATEGORY_TOUGH:
+ default:
+ contestWinner = 12;
+ break;
+ }
+
+ if (!gSaveBlock1Ptr->contestWinners[contestWinner].species)
+ gSpecialVar_0x8004 = 0;
+ else
+ gSpecialVar_0x8004 = 1;
+}
+
+void sub_80F88DC(void)
+{
+ sub_80DEDA8(0xFF);
+}
+
+void sub_80F88E8(void)
+{
+ if (gContestFinalStandings[gContestPlayerMonIndex] == 0
+ && gSpecialVar_ContestRank == 3
+ && gUnknown_02039F08[gContestPlayerMonIndex] >= 800)
+ {
+ gSpecialVar_0x8004 = 1;
+ }
+ else
+ {
+ gSpecialVar_0x8004 = 0;
+ }
+}
+
+u8 sub_80F8940(void)
+{
+ int i;
+ u8 var0 = 0;
+
+ for (i = 0; i < 5; i++)
+ {
+ if (gSaveBlock1Ptr->contestWinners[8 + i].species)
+ var0++;
+ }
+
+ return var0;
+}
+
+void sub_80F8970(void)
+{
+ s16 sp[4];
+ int i, j;
+ s16 condition;
+ s8 var0;
+ u8 var2;
+ u8 r8;
+ u8 r7;
+
+ for (i = 0; i < 4; i++)
+ sp[i] = gContestMonConditions[i];
+
+ for (i = 0; i < 3; i++)
+ {
+ for (j = 3; j > i; j--)
+ {
+ if (sp[j - 1] < sp[j])
+ {
+ int temp = sp[j];
+ sp[j] = sp[j - 1];
+ sp[j - 1] = temp;
+ }
+ }
+ }
+
+ condition = sp[gSpecialVar_0x8006];
+ var0 = 0;
+ r8 = 0;
+ for (i = 0; i < 4; i++)
+ {
+ if (sp[i] == condition)
+ {
+ var0++;
+ if (i == gSpecialVar_0x8006)
+ r8 = var0;
+ }
+ }
+
+ for (i = 0; i < 4; i++)
+ {
+ if (sp[i] == condition)
+ break;
+ }
+
+ r7 = i;
+ var2 = r8;
+ for (i = 0; i < 4; i++)
+ {
+ if (condition == gContestMonConditions[i])
+ {
+ if (var2 == 1)
+ break;
+ var2--;
+ }
+ }
+
+ StringCopy(gStringVar1, gContestMons[i].nickname);
+ StringCopy(gStringVar2, gContestMons[i].trainerName);
+ sub_81DB5AC(gStringVar2);
+
+ if (var0 == 1)
+ gSpecialVar_0x8006 = r7;
+ else if (r8 == var0)
+ gSpecialVar_0x8006 = r7;
+ else
+ gSpecialVar_0x8006 = r7 + 4;
+}
+
+static void ShowContestWinnerCleanup(void)
+{
+ SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
+}
+
+void ShowContestWinner(void)
+{
+ SetMainCallback2(sub_812FDEC);
+ gMain.savedCallback = ShowContestWinnerCleanup;
+}
+
+void sub_80F8AFC(void)
+{
+ int i;
+
+ if (gIsLinkContest & 1)
+ {
+ for (i = 0; i < gUnknown_02039F30; i++)
+ {
+ int version = (u8)gLinkPlayers[i].version;
+ if (version == VERSION_RUBY || version == VERSION_SAPPHIRE)
+ {
+ if (gLinkPlayers[i].gender == MALE)
+ gContestMons[i].trainerGfxId = EVENT_OBJ_GFX_LINK_RS_BRENDAN;
+ else
+ gContestMons[i].trainerGfxId = EVENT_OBJ_GFX_LINK_RS_MAY;
+ }
+ }
+
+ VarSet(VAR_OBJ_GFX_ID_0, gContestMons[0].trainerGfxId);
+ VarSet(VAR_OBJ_GFX_ID_1, gContestMons[1].trainerGfxId);
+ VarSet(VAR_OBJ_GFX_ID_2, gContestMons[2].trainerGfxId);
+ VarSet(VAR_OBJ_GFX_ID_3, gContestMons[3].trainerGfxId);
+ }
+}
+
+void sub_80F8B94(void)
+{
+ int i;
+ u8 eventObjectId;
+ int version;
+ struct Sprite *sprite;
+
+ gReservedSpritePaletteCount = 12;
+ if (gIsLinkContest & 1)
+ {
+ for (i = 0; i < gUnknown_02039F30; i++)
+ {
+ eventObjectId = GetEventObjectIdByLocalIdAndMap(gUnknown_0858D8EC[i], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
+ sprite = &gSprites[gEventObjects[eventObjectId].spriteId];
+ sprite->oam.paletteNum = 6 + i;
+ version = (u8)gLinkPlayers[i].version;
+ if (version == VERSION_RUBY || version == VERSION_SAPPHIRE)
+ {
+ if (gLinkPlayers[i].gender == MALE)
+ LoadPalette(gEventObjectPalette33, 0x160 + i * 0x10, 0x20);
+ else
+ LoadPalette(gEventObjectPalette34, 0x160 + i * 0x10, 0x20);
+ }
+ else
+ {
+ if (gLinkPlayers[i].gender == MALE)
+ LoadPalette(gEventObjectPalette8, 0x160 + i * 0x10, 0x20);
+ else
+ LoadPalette(gEventObjectPalette17, 0x160 + i * 0x10, 0x20);
+ }
+ }
+ }
+}
+
+u8 GiveMonArtistRibbon(void)
+{
+ u8 hasArtistRibbon;
+
+ hasArtistRibbon = GetMonData(&gPlayerParty[gUnknown_02039F24], MON_DATA_ARTIST_RIBBON);
+ if (!hasArtistRibbon && gContestFinalStandings[gContestPlayerMonIndex] == 0 && gSpecialVar_ContestRank == 3
+ && gUnknown_02039F08[gContestPlayerMonIndex] >= 800)
+ {
+ hasArtistRibbon = 1;
+ SetMonData(&gPlayerParty[gUnknown_02039F24], MON_DATA_ARTIST_RIBBON, &hasArtistRibbon);
+ if (GetRibbonCount(&gPlayerParty[gUnknown_02039F24]) > 4)
+ sub_80EE4DC(&gPlayerParty[gUnknown_02039F24], MON_DATA_ARTIST_RIBBON);
+
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+u8 sub_80F8D24(void)
+{
+ return 0;
+}
+
+void ShowContestEntryMonPic(void)
+{
+ const struct CompressedSpritePalette *palette;
+ u32 personality, otId;
+ u16 species;
+ u8 spriteId;
+ u8 taskId;
+ u8 left, top;
+
+ if (FindTaskIdByFunc(sub_80F8EE8) == 0xFF)
+ {
+ AllocateMonSpritesGfx();
+ left = 10;
+ top = 3;
+ species = gContestMons[gSpecialVar_0x8006].species;
+ personality = gContestMons[gSpecialVar_0x8006].personality;
+ otId = gContestMons[gSpecialVar_0x8006].otId;
+ taskId = CreateTask(sub_80F8EE8, 0x50);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = species;
+ if (gSpecialVar_0x8006 == gContestPlayerMonIndex)
+ HandleLoadSpecialPokePic_2(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[1], species, personality);
+ else
+ HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[1], species, personality);
+
+ palette = GetMonSpritePalStructFromOtIdPersonality(species, otId, personality);
+ LoadCompressedObjectPalette(palette);
+ SetMultiuseSpriteTemplateToPokemon(species, 1);
+ gMultiuseSpriteTemplate.paletteTag = palette->tag;
+ spriteId = CreateSprite(&gMultiuseSpriteTemplate, (left + 1) * 8 + 32, (top * 8) + 40, 0);
+
+ if (gIsLinkContest & 1)
+ {
+ if (!(gIsLinkContest & 4))
+ DoMonFrontSpriteAnimation(&gSprites[spriteId], species, FALSE, 0);
+ }
+ else
+ {
+ DoMonFrontSpriteAnimation(&gSprites[spriteId], species, FALSE, 0);
+ }
+
+ gTasks[taskId].data[2] = spriteId;
+ gTasks[taskId].data[3] = left;
+ gTasks[taskId].data[4] = top;
+ gSprites[spriteId].callback = SpriteCallbackDummy;
+ gSprites[spriteId].oam.priority = 0;
+ }
+}
+
+void sub_80F8EB8(void)
+{
+ u8 taskId = FindTaskIdByFunc(sub_80F8EE8);
+ if (taskId != 0xFF)
+ {
+ gTasks[taskId].data[0]++;
+ FreeMonSpritesGfx();
+ }
+}
+
+static void sub_80F8EE8(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ struct Sprite *sprite;
+
+ switch(task->data[0])
+ {
+ case 0:
+ task->data[0]++;
+ break;
+ case 1:
+ task->data[5] = CreateWindowFromRect(10, 3, 8, 8);
+ SetStandardWindowBorderStyle(task->data[5], 1);
+ task->data[0]++;
+ break;
+ case 2:
+ break;
+ case 3:
+ sprite = &gSprites[task->data[2]];
+ FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum));
+
+ if(sprite->oam.affineMode)
+ FreeOamMatrix(sprite->oam.matrixNum);
+
+ DestroySprite(sprite);
+ task->data[0]++;
+ break;
+ case 4:
+ sub_80E2A78(gTasks[taskId].data[5]);
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+void ScriptGetMultiplayerId(void)
+{
+ if ((gIsLinkContest & 1) && gUnknown_02039F30 == 4 && !(gIsLinkContest & 2))
+ gSpecialVar_Result = GetMultiplayerId();
+ else
+ gSpecialVar_Result = 4;
+}
+
+void ScriptRandom(void)
+{
+ u16 random;
+ u16 *scriptPtr;
+
+ if (gIsLinkContest & 1)
+ {
+ gContestRngValue = 1103515245 * gContestRngValue + 24691;
+ random = gContestRngValue >> 16;
+ scriptPtr = &gSpecialVar_Result;
+ }
+ else
+ {
+ scriptPtr = &gSpecialVar_Result;
+ random = Random();
+ }
+ *scriptPtr = random % *scriptPtr;
+}
+
+u16 sub_80F903C(void)
+{
+ gContestRngValue = 1103515245 * gContestRngValue + 24691;
+ return gContestRngValue >> 16;
+}
+
+u8 sub_80F905C(void)
+{
+ if (gIsLinkContest & 2)
+ {
+ CreateTask(sub_80F9088, 5);
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+static void sub_80F9088(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (sub_800A520())
+ {
+ sub_800ADF8();
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 1:
+ gTasks[taskId].data[0]++;
+ break;
+ default:
+ if (sub_800A520() == 1)
+ {
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void sub_80F90DC(void)
+{
+ if (gIsLinkContest & 2)
+ {
+ if (gReceivedRemoteLinkPlayers)
+ {
+ sub_800E0E8();
+ CreateWirelessStatusIndicatorSprite(8, 8);
+ }
+ }
+}
+
+void sub_80F910C(void)
+{
+ if (gIsLinkContest & 2)
+ {
+ if (gReceivedRemoteLinkPlayers)
+ sub_800E084();
+ }
+}
+
+u8 sub_80F9134(void)
+{
+ if (gIsLinkContest & 4)
+ return 1;
+ else
+ return 0;
+}
+
+void sub_80F9154(void)
+{
+ gIsLinkContest = 0;
+}
+
+u8 sub_80F9160(void)
+{
+ if (gIsLinkContest & 2)
+ return 1;
+ else
+ return 0;
+}
+
+void HealPlayerParty(void)
+{
+ u8 i, j;
+ u8 ppBonuses;
+ u8 arg[4];
+
+ // restore HP.
+ for(i = 0; i < gPlayerPartyCount; i++)
+ {
+ u16 maxHP = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP);
+ arg[0] = maxHP;
+ arg[1] = maxHP >> 8;
+ SetMonData(&gPlayerParty[i], MON_DATA_HP, arg);
+ ppBonuses = GetMonData(&gPlayerParty[i], MON_DATA_PP_BONUSES);
+
+ // restore PP.
+ for(j = 0; j < 4; j++)
+ {
+ arg[0] = CalculatePPWithBonus(GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + j), ppBonuses, j);
+ SetMonData(&gPlayerParty[i], MON_DATA_PP1 + j, arg);
+ }
+
+ // since status is u32, the four 0 assignments here are probably for safety to prevent undefined data from reaching SetMonData.
+ arg[0] = 0;
+ arg[1] = 0;
+ arg[2] = 0;
+ arg[3] = 0;
+ SetMonData(&gPlayerParty[i], MON_DATA_STATUS, arg);
+ }
+}
+
+u8 ScriptGiveMon(u16 species, u8 level, u16 item, u32 unused1, u32 unused2, u8 unused3)
+{
+ u16 nationalDexNum;
+ int sentToPc;
+ u8 heldItem[2];
+ struct Pokemon mon;
+
+ CreateMon(&mon, species, level, 32, 0, 0, 0, 0);
+ heldItem[0] = item;
+ heldItem[1] = item >> 8;
+ SetMonData(&mon, MON_DATA_HELD_ITEM, heldItem);
+ sentToPc = GiveMonToPlayer(&mon);
+ nationalDexNum = SpeciesToNationalPokedexNum(species);
+
+ switch(sentToPc)
+ {
+ case 0:
+ case 1:
+ GetSetPokedexFlag(nationalDexNum, 2);
+ GetSetPokedexFlag(nationalDexNum, 3);
+ break;
+ }
+ return sentToPc;
+}
+
+u8 ScriptGiveEgg(u16 species)
+{
+ struct Pokemon mon;
+ u8 isEgg;
+
+ CreateEgg(&mon, species, TRUE);
+ isEgg = TRUE;
+ SetMonData(&mon, MON_DATA_IS_EGG, &isEgg);
+
+ return GiveMonToPlayer(&mon);
+}
+
+void HasEnoughMonsForDoubleBattle(void)
+{
+ switch (GetMonsStateToDoubles())
+ {
+ case 0:
+ gSpecialVar_Result = 0;
+ break;
+ case 1:
+ gSpecialVar_Result = 1;
+ break;
+ case 2:
+ gSpecialVar_Result = 2;
+ break;
+ }
+}
+
+static bool8 CheckPartyMonHasHeldItem(u16 item)
+{
+ int i;
+
+ for(i = 0; i < PARTY_SIZE; i++)
+ {
+ u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
+ if (species != SPECIES_NONE && species != SPECIES_EGG && GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM) == item)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_80F9370(void)
+{
+ bool8 hasItem = CheckPartyMonHasHeldItem(ITEM_ENIGMA_BERRY);
+ if (hasItem == TRUE)
+ GetBerryNameByBerryType(ItemIdToBerryType(ITEM_ENIGMA_BERRY), gStringVar1);
+
+ return hasItem;
+}
+
+void CreateScriptedWildMon(u16 species, u8 level, u16 item)
+{
+ u8 heldItem[2];
+
+ ZeroEnemyPartyMons();
+ CreateMon(&gEnemyParty[0], species, level, 0x20, 0, 0, 0, 0);
+ if (item)
+ {
+ heldItem[0] = item;
+ heldItem[1] = item >> 8;
+ SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, heldItem);
+ }
+}
+
+void ScriptSetMonMoveSlot(u8 monIndex, u16 move, u8 slot)
+{
+ if (monIndex > PARTY_SIZE)
+ monIndex = gPlayerPartyCount - 1;
+
+ SetMonMoveSlot(&gPlayerParty[monIndex], move, slot);
+}
+
+void sub_80F9438(void)
+{
+ gMain.savedCallback = sub_80F9460;
+ VarSet(VAR_FRONTIER_FACILITY, 9); // this isn't a valid frontier facility id (??)
+ sub_81B8518(0);
+}
+
+static void sub_80F9460(void)
+{
+ switch (gSelectedOrderFromParty[0])
+ {
+ case 0:
+ gSpecialVar_Result = 0;
+ break;
+ default:
+ gSpecialVar_Result = 1;
+ break;
+ }
+
+ SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
+}
+
+void sub_80F9490(void)
+{
+ gMain.savedCallback = sub_80F94B8;
+ sub_81B8518(gSpecialVar_0x8004 + 1);
+}
+
+static void sub_80F94B8(void)
+{
+ switch (gSelectedOrderFromParty[0])
+ {
+ case 0:
+ gSpecialVar_Result = 0;
+ break;
+ default:
+ gSpecialVar_Result = 1;
+ break;
+ }
+
+ SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
+}
+
+void ReducePlayerPartyToSelectedMons(void)
+{
+ struct Pokemon party[4];
+ int i;
+
+ CpuFill32(0, party, sizeof party);
+
+ // copy the selected pokemon according to the order.
+ for (i = 0; i < 4; i++)
+ if (gSelectedOrderFromParty[i]) // as long as the order keeps going (did the player select 1 mon? 2? 3?), do not stop
+ party[i] = gPlayerParty[gSelectedOrderFromParty[i] - 1]; // index is 0 based, not literal
+
+ CpuFill32(0, gPlayerParty, sizeof gPlayerParty);
+
+ // overwrite the first 4 with the order copied to.
+ for (i = 0; i < 4; i++)
+ gPlayerParty[i] = party[i];
+
+ CalculatePlayerPartyCount();
+}