diff options
Diffstat (limited to 'src')
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) @@ -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 = ®_BG1HOFS; + task->data[2] = gBattle_BG1_X; + } + else + { + sp.dmaDest = ®_BG2HOFS; + task->data[2] = gBattle_BG2_X; + } + + sp.dmaControl = 0xA2600001; + sp.initState = 1; + sp.unused9 = 0; + r1 = GetBattlerYCoordWithElevation(gBattleAnimAttacker); + task->data[3] = r1 - 32; + task->data[4] = r1 + 32; + if (task->data[3] < 0) + task->data[3] = 0; + + for (i = task->data[3]; i <= task->data[4]; i++) + { + gScanlineEffectRegBuffers[0][i] = task->data[2]; + gScanlineEffectRegBuffers[1][i] = task->data[2]; + } + + ScanlineEffect_SetParams(sp); + task->func = sub_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 = ®_BG1HOFS; + } + else + { + bgX = gBattle_BG2_X; + scanlineParams.dmaDest = ®_BG2HOFS; + } + + if (y < 0) + y = 0; + + while (y < endY) + { + gScanlineEffectRegBuffers[0][y] = bgX; + gScanlineEffectRegBuffers[1][y] = bgX; + y++; + } + + while (y < 160) + { + gScanlineEffectRegBuffers[0][y] = bgX + 240; + gScanlineEffectRegBuffers[1][y] = bgX + 240; + y++; + } + + scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; + scanlineParams.initState = 1; + scanlineParams.unused9 = 0; + ScanlineEffect_SetParams(scanlineParams); +} + +// Moves a particle of dirt in a plume of dirt. Used in Fissure and Dig. +// arg 0: which mon (0 = attacker, 1 = target) +// arg 1: which side of mon (0 = left, 1 = right) +// arg 2: target x offset +// arg 3: target y offset +// arg 4: wave amplitude +// arg 5: duration +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(); +} |