diff options
author | DizzyEggg <jajkodizzy@wp.pl> | 2018-11-11 16:44:27 +0100 |
---|---|---|
committer | DizzyEggg <jajkodizzy@wp.pl> | 2018-11-11 16:44:27 +0100 |
commit | 81410fee17547726e551204dcadc7271a9334aa2 (patch) | |
tree | d8dd292fd118f59af4f12b3328ead150d579abd8 /src | |
parent | 1437755cdd2b5ce0a6eae4b9f716bcca4fc00061 (diff) |
Factory done
Diffstat (limited to 'src')
-rw-r--r-- | src/battle_ai_script_commands.c | 9 | ||||
-rw-r--r-- | src/battle_arena.c | 292 | ||||
-rw-r--r-- | src/battle_dome.c | 36 | ||||
-rw-r--r-- | src/battle_factory.c | 4397 | ||||
-rw-r--r-- | src/battle_factory_screen.c | 4111 | ||||
-rw-r--r-- | src/battle_tent.c | 256 | ||||
-rw-r--r-- | src/battle_tower.c | 179 | ||||
-rw-r--r-- | src/frontier_util.c | 4 | ||||
-rw-r--r-- | src/pokemon.c | 2 |
9 files changed, 5115 insertions, 4171 deletions
diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index e89d308f5..ab850f4fb 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -4,13 +4,14 @@ #include "battle.h" #include "battle_setup.h" #include "recorded_battle.h" -#include "constants/species.h" -#include "constants/abilities.h" #include "random.h" #include "item.h" +#include "util.h" +#include "battle_factory.h" +#include "constants/species.h" +#include "constants/abilities.h" #include "constants/battle_move_effects.h" #include "constants/moves.h" -#include "util.h" #include "constants/battle_ai.h" #define AI_ACTION_DONE 0x0001 @@ -44,8 +45,6 @@ AI scripts. extern const u8 *const gBattleAI_ScriptsTable[]; -extern u32 GetAiScriptsInBattleFactory(); - static u8 ChooseMoveOrAction_Singles(void); static u8 ChooseMoveOrAction_Doubles(void); static void RecordLastUsedMoveByTarget(void); diff --git a/src/battle_arena.c b/src/battle_arena.c index 968a7e7e4..5ab71965b 100644 --- a/src/battle_arena.c +++ b/src/battle_arena.c @@ -9,18 +9,62 @@ #include "bg.h" #include "sound.h" #include "m4a.h" +#include "util.h" +#include "battle_setup.h" +#include "overworld.h" +#include "frontier_util.h" +#include "random.h" +#include "item.h" +#include "battle_tower.h" #include "constants/songs.h" +#include "constants/battle_string_ids.h" +#include "constants/battle_frontier.h" extern u16 gBattle_WIN0H; extern u16 gBattle_WIN0V; -extern void (* const gUnknown_08611F84[])(void); -extern const struct CompressedSpriteSheet gUnknown_08611F74[]; +extern const u32 gUnknown_08D854E8[]; extern const u16 gUnknown_08D855E8[]; extern const struct SpriteTemplate gUnknown_08611F5C; +extern const s8 gBattleArenaMoveMindRatings[]; // This file's functions. -void sub_81A5558(u8 x, u8 y, u8 arg2, u8 battler); +static void sub_81A58B4(void); +static void sub_81A5964(void); +static void sub_81A59FC(void); +static void sub_81A5AC4(void); +static void sub_81A5B08(void); +static void sub_81A5B88(void); +static void sub_81A5BE0(void); +static void sub_81A5558(u8 x, u8 y, u8 arg2, u8 battler); + +// Const rom data. +static const struct CompressedSpriteSheet gUnknown_08611F74[] = +{ + {gUnknown_08D854E8, 0x200, 0x3E8}, + {0} +}; + +static void (* const gUnknown_08611F84[])(void) = +{ + sub_81A58B4, + sub_81A5964, + sub_81A59FC, + sub_81A5AC4, + sub_81A5B08, + sub_81A5B88, + sub_81A5BE0, +}; + +static const u16 gUnknown_08611FA0[6] = +{ + 0x003f, 0x0040, 0x0041, 0x0043, 0x0042, 0x0046 +}; + +static const u16 gUnknown_08611FAC[9] = +{ + 0x00b3, 0x00b4, 0x00b7, 0x00c8, 0x00b9, 0x00bb, 0x00c4, 0x00c6, 0x00ba +}; // code void CallBattleArenaFunction(void) @@ -153,7 +197,7 @@ u8 sub_81A5258(u8 *state) return ret; } -void sub_81A5558(u8 x, u8 y, u8 arg2, u8 battler) +static void sub_81A5558(u8 x, u8 y, u8 arg2, u8 battler) { s32 animNum = 0; s32 r6 = 0; @@ -222,3 +266,243 @@ void sub_81A56B4(void) ptr3[0] = gBattleMons[0].hp; ptr3[1] = gBattleMons[1].hp; } + +void sub_81A56E8(u8 battler) +{ + s8 *ptr1 = gBattleStruct->field_298; + + ptr1[battler] += gBattleArenaMoveMindRatings[gCurrentMove]; +} + +void sub_81A5718(u8 battler) +{ + s8 *ptr2 = gBattleStruct->field_29A; + + if (gHitMarker & HITMARKER_OBEYS) + { + u8 *ptr4 = &gBattleStruct->field_2A2; + if (*ptr4 & gBitTable[battler]) + { + *ptr4 &= ~(gBitTable[battler]); + ptr2[battler] -= 2; + } + else if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + { + if (!(gMoveResultFlags & MOVE_RESULT_MISSED) || gBattleCommunication[6] != 1) + ptr2[battler] -= 2; + } + else if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE && gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE) + { + ptr2[battler] += 1; + } + else if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) + { + ptr2[battler] += 2; + } + else if (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE) + { + ptr2[battler] -= 1; + } + else if (!gProtectStructs[battler].protected) + { + ptr2[battler] += 1; + } + } +} + +void sub_81A57E4(u8 battler, u16 stringId) +{ + s8 *ptr2 = gBattleStruct->field_29A; + + switch (stringId) + { + case STRINGID_PKMNSXMADEYUSELESS: + case STRINGID_PKMNSXMADEITINEFFECTIVE: + case STRINGID_PKMNSXPREVENTSFLINCHING: + case STRINGID_PKMNSXBLOCKSY2: + case STRINGID_PKMNSXPREVENTSYLOSS: + case STRINGID_PKMNSXMADEYINEFFECTIVE: + case STRINGID_PKMNSXPREVENTSBURNS: + case STRINGID_PKMNSXBLOCKSY: + case STRINGID_PKMNPROTECTEDBY: + case STRINGID_PKMNPREVENTSUSAGE: + case STRINGID_PKMNRESTOREDHPUSING: + case STRINGID_PKMNPREVENTSPARALYSISWITH: + case STRINGID_PKMNPREVENTSROMANCEWITH: + case STRINGID_PKMNPREVENTSPOISONINGWITH: + case STRINGID_PKMNPREVENTSCONFUSIONWITH: + case STRINGID_PKMNRAISEDFIREPOWERWITH: + case STRINGID_PKMNANCHORSITSELFWITH: + case STRINGID_PKMNPREVENTSSTATLOSSWITH: + case STRINGID_PKMNSTAYEDAWAKEUSING: + ptr2[battler] -= 3; + break; + } +} + +void sub_81A586C(u8 battler) +{ + u16 *ptr3 = gBattleStruct->field_29C; + + ptr3[battler] = gBattleMons[battler].hp; + if (ptr3[BATTLE_OPPOSITE(battler)] > gBattleMons[BATTLE_OPPOSITE(battler)].hp) + ptr3[BATTLE_OPPOSITE(battler)] = gBattleMons[BATTLE_OPPOSITE(battler)].hp; +} + +static void sub_81A58B4(void) +{ + bool32 isCurrent; + u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + + gSaveBlock2Ptr->frontier.field_CA8 = 0; + gSaveBlock2Ptr->frontier.curChallengeBattleNum = 0; + gSaveBlock2Ptr->frontier.field_CA9_a = 0; + gSaveBlock2Ptr->frontier.field_CA9_b = 0; + if (lvlMode != FRONTIER_LVL_50) + isCurrent = gSaveBlock2Ptr->frontier.field_CDC & 0x80; + else + isCurrent = gSaveBlock2Ptr->frontier.field_CDC & 0x40; + + if (!isCurrent) + gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode] = 0; + + saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); + gTrainerBattleOpponent_A = 0; +} + +static void sub_81A5964(void) +{ + u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + + switch (gSpecialVar_0x8005) + { + case 0: + gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_DD8; + break; + case 1: + gSpecialVar_Result = gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode]; + break; + case 2: + if (lvlMode != FRONTIER_LVL_50) + gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_CDC & 0x80; + else + gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_CDC & 0x40; + break; + } +} + +static void sub_81A59FC(void) +{ + u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + + switch (gSpecialVar_0x8005) + { + case 0: + gSaveBlock2Ptr->frontier.field_DD8 = gSpecialVar_0x8006; + break; + case 1: + gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode] = gSpecialVar_0x8006; + break; + case 2: + if (lvlMode != FRONTIER_LVL_50) + { + if (gSpecialVar_0x8006) + gSaveBlock2Ptr->frontier.field_CDC |= 0x80; + else + gSaveBlock2Ptr->frontier.field_CDC &= ~(0x80); + } + else + { + if (gSpecialVar_0x8006) + gSaveBlock2Ptr->frontier.field_CDC |= 0x40; + else + gSaveBlock2Ptr->frontier.field_CDC &= ~(0x40); + } + break; + } +} + +static void sub_81A5AC4(void) +{ + gSaveBlock2Ptr->frontier.field_CA8 = gSpecialVar_0x8005; + VarSet(VAR_TEMP_0, 0); + gSaveBlock2Ptr->frontier.field_CA9_a = 1; + sub_81A4C30(); +} + +static void sub_81A5B08(void) +{ + u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + + if (gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode] > 41) + gSaveBlock2Ptr->frontier.field_DD8 = gUnknown_08611FAC[Random() % ARRAY_COUNT(gUnknown_08611FAC)]; + else + gSaveBlock2Ptr->frontier.field_DD8 = gUnknown_08611FA0[Random() % ARRAY_COUNT(gUnknown_08611FA0)]; +} + +static void sub_81A5B88(void) +{ + if (AddBagItem(gSaveBlock2Ptr->frontier.field_DD8, 1) == TRUE) + { + CopyItemName(gSaveBlock2Ptr->frontier.field_DD8, gStringVar1); + gSaveBlock2Ptr->frontier.field_DD8 = 0; + gSpecialVar_Result = TRUE; + } + else + { + gSpecialVar_Result = FALSE; + } +} + +static void sub_81A5BE0(void) +{ + GetFrontierTrainerName(gStringVar1, gTrainerBattleOpponent_A); +} + +void sub_81A5BF8(void) +{ + u8 width = 27; + u8 palNum = 7; + + FillBgTilemapBufferRect(0, 0, 254, 14, 1, 6, palNum); + FillBgTilemapBufferRect(0, 0, 32, 14, 1, 6, palNum); + FillBgTilemapBufferRect(0, 0x31, 0, 14, 1, 1, palNum); + FillBgTilemapBufferRect(0, 0x33, 1, 14, 1, 1, palNum); + FillBgTilemapBufferRect(0, 0x34, 2, 14, width, 1, palNum); + width++; + FillBgTilemapBufferRect(0, 0x35, 28, 14, 1, 1, palNum); + FillBgTilemapBufferRect(0, 0x36, 29, 14, 1, 1, palNum); + FillBgTilemapBufferRect(0, 0x37, 0, 15, 1, 5, palNum); + FillBgTilemapBufferRect(0, 0x39, 1, 15, width, 5, palNum); + FillBgTilemapBufferRect(0, 0x3A, 29, 15, 1, 5, palNum); + FillBgTilemapBufferRect(0, 0x831, 0, 19, 1, 1, palNum); + FillBgTilemapBufferRect(0, 0x833, 1, 19, 1, 1, palNum); + FillBgTilemapBufferRect(0, 0x834, 2, 19, width - 2, 1, palNum); + FillBgTilemapBufferRect(0, 0x835, 28, 19, 1, 1, palNum); + FillBgTilemapBufferRect(0, 0x836, 29, 19, 1, 1, palNum); +} + +void sub_81A5D44(void) +{ + u8 width; + u8 height; + u8 palNum = 0; + + FillBgTilemapBufferRect(0, 3, 0, 14, 1, 1, palNum); + height = 4; + FillBgTilemapBufferRect(0, 4, 1, 14, 1, 1, palNum); + width = 27; + FillBgTilemapBufferRect(0, 5, 2, 14, width, 1, palNum); + FillBgTilemapBufferRect(0, 6, 28, 14, 1, 1, palNum); + FillBgTilemapBufferRect(0, 7, 29, 14, 1, 1, palNum); + FillBgTilemapBufferRect(0, 8, 0, 15, 1, height, palNum); + FillBgTilemapBufferRect(0, 9, 1, 15, 1, height, palNum); + FillBgTilemapBufferRect(0, 0xA, 2, 15, width, height, palNum); + FillBgTilemapBufferRect(0, 0xB, 28, 15, 1, height, palNum); + FillBgTilemapBufferRect(0, 0xC, 29, 15, 1, height, palNum); + FillBgTilemapBufferRect(0, 0xD, 0, 19, 1, 1, palNum); + FillBgTilemapBufferRect(0, 0xE, 1, 19, 1, 1, palNum); + FillBgTilemapBufferRect(0, 0xF, 2, 19, width, 1, palNum); + FillBgTilemapBufferRect(0, 0x10, 28, 19, 1, 1, palNum); + FillBgTilemapBufferRect(0, 0x11, 29, 19, 1, 1, palNum); +} diff --git a/src/battle_dome.c b/src/battle_dome.c index b39162dda..2a77da180 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -2555,7 +2555,7 @@ static void InitDomeTrainers(void) s32 species[3]; s32 monTypesBits, monTypesCount; s32 trainerId; - s32 monTournamentId; + s32 monSetId; u16 *statSums; s32 *statValues; u8 ivs = 0; @@ -2618,20 +2618,20 @@ static void InitDomeTrainers(void) // Make sure the mon is valid. do { - monTournamentId = RandomizeFacilityTrainerMonId(trainerId); + monSetId = RandomizeFacilityTrainerMonSet(trainerId); for (k = 0; k < j; k++) { - s32 checkingMonId = gSaveBlock2Ptr->frontier.domeMonIds[i][k]; - if (checkingMonId == monTournamentId - || species[0] == gFacilityTrainerMons[monTournamentId].species - || species[1] == gFacilityTrainerMons[monTournamentId].species - || gFacilityTrainerMons[checkingMonId].itemTableId == gFacilityTrainerMons[monTournamentId].itemTableId) + s32 checkingMonSetId = gSaveBlock2Ptr->frontier.domeMonIds[i][k]; + if (checkingMonSetId == monSetId + || species[0] == gFacilityTrainerMons[monSetId].species + || species[1] == gFacilityTrainerMons[monSetId].species + || gFacilityTrainerMons[checkingMonSetId].itemTableId == gFacilityTrainerMons[monSetId].itemTableId) break; } } while (k != j); - gSaveBlock2Ptr->frontier.domeMonIds[i][j] = monTournamentId; - species[j] = gFacilityTrainerMons[monTournamentId].species; + gSaveBlock2Ptr->frontier.domeMonIds[i][j] = monSetId; + species[j] = gFacilityTrainerMons[monSetId].species; } gSaveBlock2Ptr->frontier.domeTrainers[i].isEliminated = 0; @@ -2828,7 +2828,7 @@ static void CreateDomeMon(u8 monPartyId, u16 tournamentTrainerId, u8 tournamentM u8 happiness = 0xFF; u8 fixedIv = GetDomeTrainerMonIvs(tournamentTrainerId); // BUG: Should be using trainerId instead of tournamentTrainerId. As a result, all Pokemon have ivs of 3. u8 level = SetFacilityPtrsGetLevel(); - CreateMonWithEVSpreadPersonalityOTID(&gEnemyParty[monPartyId], + CreateMonWithEVSpreadNatureOTID(&gEnemyParty[monPartyId], gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[tournamentTrainerId][tournamentMonId]].species, level, gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[tournamentTrainerId][tournamentMonId]].nature, @@ -6143,7 +6143,7 @@ static void sub_8194F58(void) s32 species[3]; s32 monTypesBits; s32 trainerId; - s32 monTournamentId; + s32 monSetId; u8 lvlMode; u16 *statSums; s32 *statValues; @@ -6190,20 +6190,20 @@ static void sub_8194F58(void) // Make sure the mon is valid. do { - monTournamentId = RandomizeFacilityTrainerMonId(trainerId); + monSetId = RandomizeFacilityTrainerMonSet(trainerId); for (k = 0; k < j; k++) { s32 checkingMonId = gSaveBlock2Ptr->frontier.domeMonIds[i][k]; - if (checkingMonId == monTournamentId - || species[0] == gFacilityTrainerMons[monTournamentId].species - || species[1] == gFacilityTrainerMons[monTournamentId].species - || gFacilityTrainerMons[checkingMonId].itemTableId == gFacilityTrainerMons[monTournamentId].itemTableId) + if (checkingMonId == monSetId + || species[0] == gFacilityTrainerMons[monSetId].species + || species[1] == gFacilityTrainerMons[monSetId].species + || gFacilityTrainerMons[checkingMonId].itemTableId == gFacilityTrainerMons[monSetId].itemTableId) break; } } while (k != j); - gSaveBlock2Ptr->frontier.domeMonIds[i][j] = monTournamentId; - species[j] = gFacilityTrainerMons[monTournamentId].species; + gSaveBlock2Ptr->frontier.domeMonIds[i][j] = monSetId; + species[j] = gFacilityTrainerMons[monSetId].species; } gSaveBlock2Ptr->frontier.domeTrainers[i].isEliminated = 0; gSaveBlock2Ptr->frontier.domeTrainers[i].eliminatedAt = 0; diff --git a/src/battle_factory.c b/src/battle_factory.c index d7a2939b3..703887ae5 100644 --- a/src/battle_factory.c +++ b/src/battle_factory.c @@ -1,4114 +1,861 @@ #include "global.h" #include "battle_factory.h" -#include "sprite.h" +#include "battle_factory_screen.h" #include "event_data.h" +#include "battle_setup.h" #include "overworld.h" -#include "random.h" +#include "frontier_util.h" #include "battle_tower.h" -#include "text.h" -#include "palette.h" -#include "task.h" -#include "main.h" -#include "malloc.h" -#include "bg.h" -#include "gpu_regs.h" -#include "string_util.h" -#include "international_string_util.h" -#include "window.h" -#include "data2.h" -#include "decompress.h" -#include "pokemon_summary_screen.h" -#include "sound.h" -#include "pokedex.h" -#include "util.h" -#include "trainer_pokemon_sprites.h" +#include "random.h" +#include "constants/species.h" +#include "constants/battle_ai.h" #include "constants/battle_frontier.h" -#include "constants/songs.h" -#include "constants/rgb.h" - -// Select_ refers to the first Pokemon selection screen where you choose 3 Pokemon. -// Swap_ refers to the consecutive selection screen where you can keep your Pokemon or swap one with beaten trainer's. - -#define MENU_SUMMARY 0 -#define MENU_RENT 1 -#define MENU_DESELECT 1 -#define MENU_OTHERS 2 -#define MENU_OPTIONS_COUNT 3 - -#define SELECTABLE_MONS_COUNT 6 +#include "constants/trainers.h" +#include "constants/moves.h" -#define TAG_PAL_BALL_GREY 0x64 -#define TAG_PAL_BALL_SELECTED 0x65 -#define TAG_PAL_66 0x66 -#define TAG_PAL_67 0x67 - -#define TAG_TILE_64 0x64 -#define TAG_TILE_65 0x65 -#define TAG_TILE_66 0x66 -#define TAG_TILE_67 0x67 -#define TAG_TILE_68 0x68 -#define TAG_TILE_69 0x69 -#define TAG_TILE_6A 0x6A -#define TAG_TILE_6B 0x6B -#define TAG_TILE_6C 0x6C -#define TAG_TILE_6D 0x6D - -struct FactorySelecteableMon -{ - u16 monSetId; - u16 spriteId; - u8 selectedId; // 0 - not selected, 1 - first pokemon, 2 - second pokemon, 3 - third pokemon - struct Pokemon monData; -}; +extern u8 gUnknown_03001288; +extern u16 gUnknown_03006298[]; -struct UnkFactoryStruct -{ - u8 field0; - u8 field1; -}; - -struct FactorySelectMonsStruct -{ - u8 menuCursorPos; - u8 menuCursor1SpriteId; - u8 menuCursor2SpriteId; - u8 cursorPos; - u8 cursorSpriteId; - u8 selectingMonsState; - bool8 fromSummaryScreen; - u8 yesNoCursorPos; - u8 unused8; - struct FactorySelecteableMon mons[SELECTABLE_MONS_COUNT]; - struct UnkFactoryStruct unk294[3]; - bool8 unk2A0; - u8 fadeSpeciesNameTaskId; - bool8 unk2A2; - u16 unk2A4; - bool8 unk2A6; - u8 unk2A7; - u8 unk2A8; - u8 unk2A9; -}; - -// 'Action' refers to the 3 Selectable mons, Cancel, Pknm for swap windows. -#define ACTIONS_PLAYER_SCREEN 0 -#define ACTIONS_ENEMY_SCREEN 1 - -struct SwapActionIdAndFunc -{ - u8 id; - void (*func)(u8 taskId); -}; - -struct FactorySwapMonsStruct -{ - u8 menuCursorPos; - u8 menuCursor1SpriteId; - u8 menuCursor2SpriteId; - u8 cursorPos; - u8 cursorSpriteId; - u8 ballSpriteIds[3]; - u8 unk8[2][3]; - u8 unkE[2][2]; - u8 playerMonId; - u8 enemyMonId; - bool8 inEnemyScreen; - bool8 fromSummaryScreen; - u8 yesNoCursorPos; - u8 actionsCount; - const struct SwapActionIdAndFunc *actionsData; - u8 unused1C[4]; - bool8 monSwapped; - u8 fadeSpeciesNameTaskId; - bool8 unk22; - u16 unk24; - bool8 unk26; - u8 unk27; - u8 unk28; - u8 unk29; - struct UnkFactoryStruct unk2C; - bool8 unk30; -}; - -extern u8 (*gUnknown_030062E8)(void); -extern u8 gUnknown_0203CF20; - -extern const u16 gBattleFrontierHeldItems[]; extern const struct FacilityMon gBattleFrontierMons[]; extern const struct FacilityMon gSlateportBattleTentMons[]; extern const struct BattleFrontierTrainer gBattleFrontierTrainers[]; -extern const u32 gUnknown_085B18AC[]; - -extern void SetMonMoveAvoidReturn(struct Pokemon *mon, u16 move, u8 moveSlot); -extern u8 sub_81A6F70(u8 battleMode, u8 lvlMode); -extern u8 sub_81A6CA8(u8 arg0, u8 arg1); +extern const u16 gBattleFrontierHeldItems[]; // This file's functions. -static void sub_819A44C(struct Sprite *sprite); -static void CB2_InitSelectScreen(void); -static void Select_SetWinRegs(s16 mWin0H, s16 nWin0H, s16 mWin0V, s16 nWin0V); -static void Select_InitMonsData(void); -static void Select_InitAllSprites(void); -static void Select_ShowSummaryMonSprite(void); -static void Select_PrintSelectMonString(void); -static void Select_PrintMonSpecies(void); -static void Select_PrintMonCategory(void); -static void Select_PrintRentalPkmnString(void); -static void Select_CopyMonsToPlayerParty(void); -static void sub_819C4B4(void); -static void Select_ShowYesNoOptions(void); -static void sub_819C568(void); -static void Select_ShowMenuOptions(void); -static void Select_PrintMenuOptions(void); -static void Select_PrintYesNoOptions(void); -static void Task_SelectFadeSpeciesName(u8 taskId); -static void sub_819C1D0(u8 taskId); -static void Task_HandleSelectionScreenChooseMons(u8 taskId); -static void Task_HandleSelectionScreenMenu(u8 taskId); -static void CreateFrontierFactorySelectableMons(u8 firstMonId); -static void CreateTentFactorySelectableMons(u8 firstMonId); -static void Select_SetBallSpritePaletteNum(u8 id); -static void sub_819F444(struct UnkFactoryStruct arg0, bool8 *arg1); -static void sub_819B958(u8 windowId); -static void sub_819F2B4(u8 *arg0, bool8 *arg1, bool8 swapScreen); -static void sub_819F3F8(struct UnkFactoryStruct arg0, bool8 *arg1, bool8 swapScreen); -static u8 Select_RunMenuOptionFunc(void); -static u8 sub_819BC9C(void); -static u8 Select_OptionSummary(void); -static u8 Select_OptionOthers(void); -static u8 Select_OptionRentDeselect(void); -static bool32 Select_AreSpeciesValid(u16 monSetId); -static void Swap_DestroyAllSprites(void); -static void Swap_ShowYesNoOptions(void); -static void sub_819E8EC(void); -static void sub_819EAC0(void); -static void Swap_UpdateYesNoCursorPosition(s8 direction); -static void Swap_UpdateMenuCursorPosition(s8 direction); -static void sub_819EA64(u8 windowId); -static void sub_819D770(u8 taskId); -static void Task_HandleSwapScreenChooseMons(u8 taskId); -static void sub_819D588(u8 taskId); -static void sub_819F7B4(u8 taskId); -static void Swap_PrintOnInfoWindow(const u8 *str); -static void Swap_ShowMenuOptions(void); -static void Swap_PrintMenuOptions(void); -static void Swap_PrintYesNoOptions(void); -static void Swap_PrintMonSpecies(void); -static void Swap_PrintMonSpecies2(void); -static void Swap_PrintMonSpecies3(void); -static void Swap_PrintMonCategory(void); -static void Swap_InitAllSprites(void); -static void Swap_PrintPkmnSwap(void); -static void sub_819EADC(void); -static void sub_819EAF8(void); -static void CB2_InitSwapScreen(void); -static void Swap_ShowSummaryMonSprite(void); -static void Swap_UpdateActionCursorPosition(s8 direction); -static void Swap_UpdateBallCursorPosition(s8 direction); -static void Swap_RunMenuOptionFunc(u8 taskId); -static void sub_819F0CC(u8 taskId); -static void sub_819F114(u8 taskId); -static void sub_819F134(u8 taskId); -static void Swap_RunActionFunc(u8 taskId); -static void sub_819F69C(u8 taskId); -static void Task_SwapCantHaveSameMons(u8 taskId); -static void Swap_ShowMonSprite(void); -static void Swap_PrintActionStrings(void); -static void Swap_PrintActionStrings2(void); -static void Swap_PrintOneActionString(u8 which); -static void Swap_InitActions(u8 id); -static void sub_819E838(u8 arg0); -static bool8 Swap_AlreadyHasSameSpecies(u8 monId); -static void sub_819F600(struct Sprite *sprite); -static void Swap_ActionMon(u8 taskId); -static void Swap_ActionCancel(u8 taskId); -static void Swap_ActionPkmnForSwap(u8 taskId); - -// Ewram variables -static EWRAM_DATA u8 *sSelectMenuTilesetBuffer = NULL; -static EWRAM_DATA u8 *sSelectMonCardBgTilesetBuffer = NULL; -static EWRAM_DATA u8 *sSelectMenuTilemapBuffer = NULL; -static EWRAM_DATA u8 *sSelectMonCardBgTilemapBuffer = NULL; -static EWRAM_DATA struct Pokemon *sFactorySelectMons = NULL; -static EWRAM_DATA u8 *sSwapMenuTilesetBuffer = NULL; -static EWRAM_DATA u8 *sSwapMonCardBgTilesetBuffer = NULL; -static EWRAM_DATA u8 *sSwapMenuTilemapBuffer = NULL; -static EWRAM_DATA u8 *sSwapMonCardBgTilemapBuffer = NULL; - -// IWRAM bss -static IWRAM_DATA struct FactorySelectMonsStruct *sFactorySelectScreen; -static IWRAM_DATA void (*sSwap_CurrentTableFunc)(u8 taskId); -static IWRAM_DATA struct FactorySwapMonsStruct *sFactorySwapScreen; +static void sub_81A5E94(void); +static void sub_81A5FA8(void); +static void sub_81A6054(void); +static void sub_81A613C(void); +static void nullsub_75(void); +static void nullsub_123(void); +static void sub_81A6188(void); +static void sub_81A6198(void); +static void sub_81A61A4(void); +static void sub_81A63CC(void); +static void sub_81A64C4(void); +static void sub_81A63B8(void); +static void sub_81A61B0(void); +static void sub_81A67EC(void); +static void sub_81A6A08(void); +static void sub_81A6AEC(void); +static void sub_81A6C1C(void); +static u16 GetMonSetId(u8 lvlMode, u8 challengeNum, bool8 arg2); +static u8 GetStyleForMove(u16 move); // Const rom data. -static const u16 gUnknown_0860F13C[] = INCBIN_U16("graphics/unknown/unknown_60F13C.gbapal"); -static const u16 gUnknown_0860F15C[] = INCBIN_U16("graphics/unknown/unknown_60F15C.gbapal"); -static const u16 gUnknown_0860F17C[] = INCBIN_U16("graphics/unknown/unknown_60F17C.gbapal"); -static const u8 gUnknown_0860F1BC[] = INCBIN_U8("graphics/unknown/unknown_60F1BC.4bpp"); -static const u8 gUnknown_0860F3BC[] = INCBIN_U8("graphics/unknown/unknown_60F3BC.4bpp"); -static const u8 gUnknown_0860F43C[] = INCBIN_U8("graphics/unknown/unknown_60F43C.4bpp"); -static const u8 gUnknown_0860F53C[] = INCBIN_U8("graphics/unknown/unknown_60F53C.4bpp"); -static const u8 gUnknown_0860F63C[] = INCBIN_U8("graphics/unknown/unknown_60F63C.4bpp"); -static const u8 gUnknown_0860F6BC[] = INCBIN_U8("graphics/unknown/unknown_60F6BC.4bpp"); -static const u8 gUnknown_0860F7BC[] = INCBIN_U8("graphics/unknown/unknown_60F7BC.4bpp"); -static const u8 gUnknown_0860F83C[] = INCBIN_U8("graphics/unknown/unknown_60F83C.4bpp"); -static const u8 gUnknown_0860F93C[] = INCBIN_U8("graphics/unknown/unknown_60F93C.4bpp"); -static const u8 gUnknown_0860FA3C[] = INCBIN_U8("graphics/unknown/unknown_60FA3C.4bpp"); -static const u8 gUnknown_0861023C[] = INCBIN_U8("graphics/unknown/unknown_61023C.bin"); -static const u8 gUnknown_0861033C[] = INCBIN_U8("graphics/unknown/unknown_61033C.4bpp"); -static const u16 gUnknown_0861039C[] = INCBIN_U16("graphics/unknown/unknown_61039C.gbapal"); - -static const struct SpriteSheet gUnknown_086103BC[] = -{ - {gUnknown_0860F3BC, sizeof(gUnknown_0860F3BC), TAG_TILE_65}, - {gUnknown_0860F43C, sizeof(gUnknown_0860F43C), TAG_TILE_66}, - {gUnknown_0860F53C, sizeof(gUnknown_0860F53C), TAG_TILE_67}, - {gUnknown_0860FA3C, sizeof(gUnknown_0860FA3C), TAG_TILE_6D}, - {}, -}; - -static const struct CompressedSpriteSheet gUnknown_086103E4[] = -{ - {gUnknown_085B18AC, 0x800, TAG_TILE_64}, - {}, -}; - -static const struct SpritePalette gUnknown_086103F4[] = -{ - {gUnknown_0860F13C, TAG_PAL_BALL_GREY}, - {gUnknown_0860F15C, TAG_PAL_BALL_SELECTED}, - {gUnknown_0860F17C, TAG_PAL_66}, - {gUnknown_0861039C, TAG_PAL_67}, - {}, -}; +static const u8 sRequiredMoveCounts[] = {3, 3, 3, 2, 2, 2, 2}; -u8 static (* const sSelect_MenuOptionFuncs[])(void) = +static const u16 sMoves_TotalPreparation[] = { - [MENU_SUMMARY] = Select_OptionSummary, - [MENU_RENT] /*Or Deselect*/ = Select_OptionRentDeselect, - [MENU_OTHERS] = Select_OptionOthers + MOVE_SWORDS_DANCE, MOVE_GROWTH, MOVE_MEDITATE, MOVE_AGILITY, MOVE_DOUBLE_TEAM, MOVE_HARDEN, + MOVE_MINIMIZE, MOVE_WITHDRAW, MOVE_DEFENSE_CURL, MOVE_BARRIER, MOVE_FOCUS_ENERGY, MOVE_AMNESIA, + MOVE_ACID_ARMOR, MOVE_SHARPEN, MOVE_CONVERSION, MOVE_CONVERSION_2, MOVE_BELLY_DRUM, MOVE_PSYCH_UP, + MOVE_CHARGE, MOVE_SNATCH, MOVE_TAIL_GLOW, MOVE_COSMIC_POWER, MOVE_IRON_DEFENSE, MOVE_HOWL, MOVE_BULK_UP, MOVE_CALM_MIND, MOVE_DRAGON_DANCE, + 0 }; -static const struct BgTemplate sSelect_BgTemplates[] = +static const u16 sMoves_ImpossibleToPredict[] = { - { - .bg = 0, - .charBaseIndex = 0, - .mapBaseIndex = 24, - .screenSize = 0, - .paletteMode = 0, - .priority = 0, - .baseTile = 0 - }, - { - .bg = 1, - .charBaseIndex = 1, - .mapBaseIndex = 25, - .screenSize = 0, - .paletteMode = 0, - .priority = 3, - .baseTile = 0 - }, - { - .bg = 3, - .charBaseIndex = 2, - .mapBaseIndex = 27, - .screenSize = 0, - .paletteMode = 0, - .priority = 2, - .baseTile = 0 - }, + MOVE_MIMIC, MOVE_METRONOME, MOVE_MIRROR_MOVE, MOVE_TRANSFORM, MOVE_SUBSTITUTE, MOVE_SKETCH, MOVE_CURSE, + MOVE_PRESENT, MOVE_FOLLOW_ME, MOVE_TRICK, MOVE_ROLE_PLAY, MOVE_ASSIST, MOVE_SKILL_SWAP, MOVE_CAMOUFLAGE, + 0 }; -static const struct WindowTemplate sSelect_WindowTemplates[] = +static const u16 sMoves_WeakeningTheFoe[] = { - { - .bg = 0, - .tilemapLeft = 0, - .tilemapTop = 2, - .width = 12, - .height = 2, - .paletteNum = 15, - .baseBlock = 0x0001, - }, - { - .bg = 0, - .tilemapLeft = 19, - .tilemapTop = 2, - .width = 11, - .height = 2, - .paletteNum = 14, - .baseBlock = 0x0019, - }, - { - .bg = 0, - .tilemapLeft = 0, - .tilemapTop = 15, - .width = 20, - .height = 3, - .paletteNum = 15, - .baseBlock = 0x002f, - }, - { - .bg = 0, - .tilemapLeft = 22, - .tilemapTop = 14, - .width = 8, - .height = 6, - .paletteNum = 15, - .baseBlock = 0x006b, - }, - { - .bg = 0, - .tilemapLeft = 22, - .tilemapTop = 14, - .width = 8, - .height = 4, - .paletteNum = 15, - .baseBlock = 0x009b, - }, - { - .bg = 0, - .tilemapLeft = 15, - .tilemapTop = 0, - .width = 15, - .height = 2, - .paletteNum = 15, - .baseBlock = 0x00bb, - }, - DUMMY_WIN_TEMPLATE, + MOVE_SAND_ATTACK, MOVE_TAIL_WHIP, MOVE_LEER, MOVE_GROWL, MOVE_STRING_SHOT, MOVE_SCREECH, MOVE_SMOKESCREEN, MOVE_KINESIS, + MOVE_FLASH, MOVE_COTTON_SPORE, MOVE_SPITE, MOVE_SCARY_FACE, MOVE_CHARM, MOVE_KNOCK_OFF, MOVE_SWEET_SCENT, MOVE_FEATHER_DANCE, + MOVE_FAKE_TEARS, MOVE_METAL_SOUND, MOVE_TICKLE, + 0 }; -static const u16 gUnknown_0861046C[] = INCBIN_U16("graphics/unknown/unknown_61046C.gbapal"); - -static const u8 gUnknown_08610476[] = {0x00, 0x02, 0x00}; -static const u8 gUnknown_08610479[] = {0x00, 0x04, 0x00}; - -static const struct OamData gUnknown_0861047C = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 2, - .tileNum = 0, - .priority = 3, - .paletteNum = 0, - .affineParam = 0, -}; - -static const struct OamData gUnknown_08610484 = +static const u16 sMoves_HighRiskHighReturn[] = { - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 3, - .paletteNum = 0, - .affineParam = 0, + MOVE_GUILLOTINE, MOVE_HORN_DRILL, MOVE_DOUBLE_EDGE, MOVE_HYPER_BEAM, MOVE_COUNTER, MOVE_FISSURE, + MOVE_BIDE, MOVE_SELF_DESTRUCT, MOVE_SKY_ATTACK, MOVE_EXPLOSION, MOVE_FLAIL, MOVE_REVERSAL, MOVE_DESTINY_BOND, + MOVE_PERISH_SONG, MOVE_PAIN_SPLIT, MOVE_MIRROR_COAT, MOVE_MEMENTO, MOVE_GRUDGE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_BLAST_BURN, MOVE_HYDRO_CANNON, MOVE_OVERHEAT, MOVE_FRENZY_PLANT, MOVE_PSYCHO_BOOST, MOVE_VOLT_TACKLE, + 0 }; -static const struct OamData gUnknown_0861048C = +static const u16 sMoves_Endurance[] = { - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 1, - .x = 0, - .matrixNum = 0, - .size = 2, - .tileNum = 0, - .priority = 2, - .paletteNum = 0, - .affineParam = 0, + MOVE_MIST, MOVE_RECOVER, MOVE_LIGHT_SCREEN, MOVE_HAZE, MOVE_REFLECT, MOVE_SOFT_BOILED, MOVE_REST, MOVE_PROTECT, + MOVE_DETECT, MOVE_ENDURE, MOVE_MILK_DRINK, MOVE_HEAL_BELL, MOVE_SAFEGUARD, MOVE_BATON_PASS, MOVE_MORNING_SUN, + MOVE_SYNTHESIS, MOVE_MOONLIGHT, MOVE_SWALLOW, MOVE_WISH, MOVE_INGRAIN, MOVE_MAGIC_COAT, MOVE_RECYCLE, MOVE_REFRESH, + MOVE_MUD_SPORT, MOVE_SLACK_OFF, MOVE_AROMATHERAPY, MOVE_WATER_SPORT, + 0 }; -static const struct OamData gUnknown_08610494 = +static const u16 sMoves_SlowAndSteady[] = { - .y = 0, - .affineMode = 3, - .objMode = 1, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 1, + MOVE_SING, MOVE_SUPERSONIC, MOVE_DISABLE, MOVE_LEECH_SEED, MOVE_POISON_POWDER, MOVE_STUN_SPORE, MOVE_SLEEP_POWDER, + MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_HYPNOSIS, MOVE_CONFUSE_RAY, MOVE_GLARE, MOVE_POISON_GAS, MOVE_LOVELY_KISS, MOVE_SPORE, + MOVE_SPIDER_WEB, MOVE_SWEET_KISS, MOVE_SPIKES, MOVE_SWAGGER, MOVE_MEAN_LOOK, MOVE_ATTRACT, MOVE_ENCORE, MOVE_TORMENT, + MOVE_FLATTER, MOVE_WILL_O_WISP, MOVE_TAUNT, MOVE_YAWN, MOVE_IMPRISON, MOVE_SNATCH, MOVE_TEETER_DANCE, MOVE_GRASS_WHISTLE, MOVE_BLOCK, + 0 }; -static const union AnimCmd gUnknown_0861049C[] = +static const u16 sMoves_DependsOnTheBattlesFlow[] = { - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, + MOVE_SANDSTORM, MOVE_RAIN_DANCE, MOVE_SUNNY_DAY, MOVE_HAIL, MOVE_WEATHER_BALL, + 0 }; -static const union AnimCmd gUnknown_086104A4[] = +static const u16 *const sMoveStyles[] = { - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, + sMoves_TotalPreparation, + sMoves_SlowAndSteady, + sMoves_Endurance, + sMoves_HighRiskHighReturn, + sMoves_WeakeningTheFoe, + sMoves_ImpossibleToPredict, + sMoves_DependsOnTheBattlesFlow, }; -static const union AnimCmd gUnknown_086104AC[] = +static void (* const gUnknown_08612120[])(void) = { - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, + sub_81A5E94, + sub_81A5FA8, + sub_81A6054, + sub_81A613C, + nullsub_75, + nullsub_123, + sub_81A6188, + sub_81A6198, + sub_81A61A4, + sub_81A63CC, + sub_81A64C4, + sub_81A63B8, + sub_81A61B0, + sub_81A67EC, + sub_81A6A08, + sub_81A6AEC, + sub_81A6C1C, }; -static const union AnimCmd gUnknown_086104B4[] = +static const u32 gUnknown_08612164[][2] = { - ANIMCMD_FRAME(16, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(32, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(16, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(32, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(0, 32), - ANIMCMD_FRAME(16, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(32, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(16, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(32, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, + {0x100, 0x200}, + {0x1000000, 0x2000000}, }; -static const union AnimCmd * const gUnknown_086104FC[] = +static const u32 gUnknown_08612174[][2] = { - gUnknown_0861049C, + {0xfffffeff, 0xfffffdff}, + {0xfeffffff, 0xfdffffff}, }; -static const union AnimCmd * const gUnknown_08610500[] = +static const u8 sFixedIVTable[][2] = { - gUnknown_086104A4, + {3, 6}, + {6, 9}, + {9, 12}, + {12, 15}, + {15, 18}, + {21, 31}, + {31, 31}, + {31, 31}, }; -static const union AnimCmd * const gUnknown_08610504[] = +static const u16 sMonsToChooseFrom[][2] = { - gUnknown_086104AC, - gUnknown_086104B4, + {0x006e, 0x00c7}, + {0x00a2, 0x010a}, + {0x010b, 0x0173}, + {0x0174, 0x01d3}, + {0x01d4, 0x0233}, + {0x0234, 0x0293}, + {0x0294, 0x02f3}, + {0x0174, 0x0351}, + {0x0174, 0x01d3}, + {0x01d4, 0x0233}, + {0x0234, 0x0293}, + {0x0294, 0x02f3}, + {0x0174, 0x0371}, + {0x0174, 0x0371}, + {0x0174, 0x0371}, + {0x0174, 0x0371}, }; -static const union AffineAnimCmd gUnknown_0861050C[] = -{ - AFFINEANIMCMD_FRAME(5, 5, 0, 0), - AFFINEANIMCMD_FRAME(0, 0, 0, 1), - AFFINEANIMCMD_FRAME(16, 5, 0, 0), - AFFINEANIMCMD_FRAME(0, 0, 0, 1), - AFFINEANIMCMD_FRAME(32, 5, 0, 0), - AFFINEANIMCMD_FRAME(0, 0, 0, 1), - AFFINEANIMCMD_FRAME(64, 5, 0, 0), - AFFINEANIMCMD_FRAME(0, 0, 0, 1), - AFFINEANIMCMD_FRAME(128, 5, 0, 0), - AFFINEANIMCMD_FRAME(0, 0, 0, 1), - AFFINEANIMCMD_FRAME(256, 5, 0, 0), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd gUnknown_0861056C[] = -{ - AFFINEANIMCMD_FRAME(128, 5, 0, 0), - AFFINEANIMCMD_FRAME(0, 0, 0, 1), - AFFINEANIMCMD_FRAME(64, 5, 0, 0), - AFFINEANIMCMD_FRAME(0, 0, 0, 1), - AFFINEANIMCMD_FRAME(32, 5, 0, 0), - AFFINEANIMCMD_FRAME(0, 0, 0, 1), - AFFINEANIMCMD_FRAME(16, 5, 0, 0), - AFFINEANIMCMD_FRAME(0, 0, 0, 1), - AFFINEANIMCMD_FRAME(5, 5, 0, 0), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd gUnknown_086105BC[] = -{ - AFFINEANIMCMD_FRAME(256, 256, 0, 0), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd * const gUnknown_086105CC[] = -{ - gUnknown_0861050C, - gUnknown_0861056C, - gUnknown_086105BC, -}; - -static const struct SpriteTemplate gUnknown_086105D8 = -{ - .tileTag = TAG_TILE_64, - .paletteTag = TAG_PAL_BALL_GREY, - .oam = &gUnknown_0861047C, - .anims = gUnknown_08610504, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_819A44C -}; - -static const struct SpriteTemplate gUnknown_086105F0 = -{ - .tileTag = TAG_TILE_65, - .paletteTag = TAG_PAL_66, - .oam = &gUnknown_08610484, - .anims = gUnknown_086104FC, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy -}; - -static const struct SpriteTemplate gUnknown_08610608 = -{ - .tileTag = TAG_TILE_66, - .paletteTag = TAG_PAL_66, - .oam = &gUnknown_0861048C, - .anims = gUnknown_086104FC, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy -}; - -static const struct SpriteTemplate gUnknown_08610620 = -{ - .tileTag = TAG_TILE_67, - .paletteTag = TAG_PAL_66, - .oam = &gUnknown_0861048C, - .anims = gUnknown_086104FC, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy -}; - -static const struct SpriteTemplate gUnknown_08610638 = -{ - .tileTag = TAG_TILE_6D, - .paletteTag = TAG_PAL_67, - .oam = &gUnknown_08610494, - .anims = gUnknown_08610500, - .images = NULL, - .affineAnims = gUnknown_086105CC, - .callback = SpriteCallbackDummy -}; - -static const struct SpriteSheet gUnknown_08610650[] = -{ - {gUnknown_0860F3BC, sizeof(gUnknown_0860F3BC), TAG_TILE_65}, - {gUnknown_0860F43C, sizeof(gUnknown_0860F43C), TAG_TILE_66}, - {gUnknown_0860F53C, sizeof(gUnknown_0860F53C), TAG_TILE_67}, - {gUnknown_0860F63C, sizeof(gUnknown_0860F63C), TAG_TILE_68}, - {gUnknown_0860F6BC, sizeof(gUnknown_0860F6BC), TAG_TILE_69}, - {gUnknown_0860F7BC, 0x100, TAG_TILE_6A}, - {gUnknown_0860F83C, sizeof(gUnknown_0860F83C), TAG_TILE_6B}, - {gUnknown_0860F93C, sizeof(gUnknown_0860F93C), TAG_TILE_6C}, - {gUnknown_0860FA3C, sizeof(gUnknown_0860FA3C), TAG_TILE_6D}, - {}, -}; - -static const struct CompressedSpriteSheet gUnknown_086106A0[] = -{ - {gUnknown_085B18AC, 0x800, TAG_TILE_64}, - {}, -}; - -static const struct SpritePalette gUnknown_086106B0[] = -{ - {gUnknown_0860F13C, TAG_PAL_BALL_GREY}, - {gUnknown_0860F15C, TAG_PAL_BALL_SELECTED}, - {gUnknown_0860F17C, TAG_PAL_66}, - {gUnknown_0861039C, TAG_PAL_67}, - {}, -}; - -static const struct OamData gUnknown_086106D8 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 2, - .tileNum = 0, - .priority = 3, - .paletteNum = 0, - .affineParam = 0, -}; - -static const struct OamData gUnknown_086106E0 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 3, - .paletteNum = 0, - .affineParam = 0, -}; - -static const struct OamData gUnknown_086106E8 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 1, - .x = 0, - .matrixNum = 0, - .size = 2, - .tileNum = 0, - .priority = 2, - .paletteNum = 0, - .affineParam = 0, -}; - -static const struct OamData gUnknown_086106F0 = -{ - .y = 0, - .affineMode = 3, - .objMode = 1, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 1, -}; - -static const union AnimCmd gUnknown_086106F8[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd gUnknown_08610700[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const union AnimCmd gUnknown_08610708[] = -{ - ANIMCMD_FRAME(0, 30), - ANIMCMD_END, -}; - -static const union AnimCmd gUnknown_08610710[] = -{ - ANIMCMD_FRAME(16, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(32, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(16, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(32, 4), - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(0, 32), - ANIMCMD_FRAME(16, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(32, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(16, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(32, 8), - ANIMCMD_FRAME(0, 8), - ANIMCMD_END, -}; - -static const union AnimCmd * const gUnknown_08610758[] = -{ - gUnknown_086106F8, -}; - -static const union AnimCmd * const gUnknown_0861075C[] = -{ - gUnknown_08610700, -}; - -static const union AnimCmd * const gUnknown_08610760[] = -{ - gUnknown_08610708, - gUnknown_08610710, -}; - -static const union AffineAnimCmd gUnknown_08610768[] = -{ - AFFINEANIMCMD_FRAME(5, 5, 0, 0), - AFFINEANIMCMD_FRAME(0, 0, 0, 1), - AFFINEANIMCMD_FRAME(16, 5, 0, 0), - AFFINEANIMCMD_FRAME(0, 0, 0, 1), - AFFINEANIMCMD_FRAME(32, 5, 0, 0), - AFFINEANIMCMD_FRAME(0, 0, 0, 1), - AFFINEANIMCMD_FRAME(64, 5, 0, 0), - AFFINEANIMCMD_FRAME(0, 0, 0, 1), - AFFINEANIMCMD_FRAME(128, 5, 0, 0), - AFFINEANIMCMD_FRAME(0, 0, 0, 1), - AFFINEANIMCMD_FRAME(256, 5, 0, 0), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd gUnknown_086107C8[] = -{ - AFFINEANIMCMD_FRAME(128, 5, 0, 0), - AFFINEANIMCMD_FRAME(0, 0, 0, 1), - AFFINEANIMCMD_FRAME(64, 5, 0, 0), - AFFINEANIMCMD_FRAME(0, 0, 0, 1), - AFFINEANIMCMD_FRAME(32, 5, 0, 0), - AFFINEANIMCMD_FRAME(0, 0, 0, 1), - AFFINEANIMCMD_FRAME(16, 5, 0, 0), - AFFINEANIMCMD_FRAME(0, 0, 0, 1), - AFFINEANIMCMD_FRAME(5, 5, 0, 0), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd gUnknown_08610818[] = -{ - AFFINEANIMCMD_FRAME(256, 256, 0, 0), - AFFINEANIMCMD_END, -}; - -static const union AffineAnimCmd * const gUnknown_08610828[] = -{ - gUnknown_08610768, - gUnknown_086107C8, - gUnknown_08610818, -}; - -static const struct SpriteTemplate gUnknown_08610834 = -{ - .tileTag = TAG_TILE_64, - .paletteTag = TAG_PAL_BALL_GREY, - .oam = &gUnknown_086106D8, - .anims = gUnknown_08610760, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_819A44C -}; - -static const struct SpriteTemplate gUnknown_0861084C = -{ - .tileTag = TAG_TILE_65, - .paletteTag = TAG_PAL_66, - .oam = &gUnknown_086106E0, - .anims = gUnknown_08610758, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy -}; - -static const struct SpriteTemplate gUnknown_08610864 = -{ - .tileTag = TAG_TILE_66, - .paletteTag = TAG_PAL_66, - .oam = &gUnknown_086106E8, - .anims = gUnknown_08610758, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy -}; - -static const struct SpriteTemplate gUnknown_0861087C = -{ - .tileTag = TAG_TILE_67, - .paletteTag = TAG_PAL_66, - .oam = &gUnknown_086106E8, - .anims = gUnknown_08610758, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy -}; - -static const struct SpriteTemplate gUnknown_08610894 = -{ - .tileTag = TAG_TILE_6D, - .paletteTag = TAG_PAL_67, - .oam = &gUnknown_086106F0, - .anims = gUnknown_0861075C, - .images = NULL, - .affineAnims = gUnknown_08610828, - .callback = SpriteCallbackDummy -}; - -void static (* const sSwap_MenuOptionFuncs[])(u8 taskId) = -{ - sub_819F114, - sub_819F0CC, - sub_819F134, -}; - -static const struct BgTemplate sSwap_BgTemplates[4] = -{ - { - .bg = 0, - .charBaseIndex = 0, - .mapBaseIndex = 24, - .screenSize = 0, - .paletteMode = 0, - .priority = 1, - .baseTile = 0 - }, - { - .bg = 1, - .charBaseIndex = 1, - .mapBaseIndex = 25, - .screenSize = 0, - .paletteMode = 0, - .priority = 3, - .baseTile = 0 - }, - { - .bg = 2, - .charBaseIndex = 2, - .mapBaseIndex = 26, - .screenSize = 0, - .paletteMode = 0, - .priority = 0, - .baseTile = 0 - }, - { - .bg = 3, - .charBaseIndex = 2, - .mapBaseIndex = 27, - .screenSize = 0, - .paletteMode = 0, - .priority = 2, - .baseTile = 0 - }, -}; - -static const struct WindowTemplate sSwap_WindowTemplates[] = -{ - { - .bg = 0, - .tilemapLeft = 0, - .tilemapTop = 2, - .width = 12, - .height = 2, - .paletteNum = 15, - .baseBlock = 0x0001, - }, - { - .bg = 2, - .tilemapLeft = 19, - .tilemapTop = 2, - .width = 11, - .height = 2, - .paletteNum = 14, - .baseBlock = 0x0019, - }, - { - .bg = 0, - .tilemapLeft = 0, - .tilemapTop = 15, - .width = 20, - .height = 3, - .paletteNum = 15, - .baseBlock = 0x002f, - }, - { - .bg = 0, - .tilemapLeft = 21, - .tilemapTop = 14, - .width = 9, - .height = 6, - .paletteNum = 15, - .baseBlock = 0x006b, - }, - { - .bg = 0, - .tilemapLeft = 22, - .tilemapTop = 14, - .width = 8, - .height = 4, - .paletteNum = 15, - .baseBlock = 0x00a1, - }, - { - .bg = 2, - .tilemapLeft = 21, - .tilemapTop = 15, - .width = 9, - .height = 5, - .paletteNum = 14, - .baseBlock = 0x006b, - }, - { - .bg = 2, - .tilemapLeft = 10, - .tilemapTop = 2, - .width = 4, - .height = 2, - .paletteNum = 14, - .baseBlock = 0x00c1, - }, - { - .bg = 0, - .tilemapLeft = 19, - .tilemapTop = 2, - .width = 11, - .height = 2, - .paletteNum = 15, - .baseBlock = 0x00c9, - }, - { - .bg = 0, - .tilemapLeft = 15, - .tilemapTop = 0, - .width = 15, - .height = 2, - .paletteNum = 15, - .baseBlock = 0x00df, - }, - DUMMY_WIN_TEMPLATE, -}; - -static const u16 gUnknown_08610918[] = {RGB_BLACK, RGB_BLACK, RGB_WHITE, RGB_BLACK, RGB_RED}; // Palette. -static const u8 gUnknown_08610922[] = {0x0, 0x02, 0x0}; -static const u8 gUnknown_08610925[] = {0x0, 0x04, 0x0}; - -static const struct SwapActionIdAndFunc sSwap_PlayerScreenActions[] = +// code +void CallBattleFactoryFunction(void) { - {1, Swap_ActionMon}, - {1, Swap_ActionMon}, - {1, Swap_ActionMon}, - {3, Swap_ActionCancel}, -}; + gUnknown_08612120[gSpecialVar_0x8004](); +} -static const struct SwapActionIdAndFunc sSwap_EnemyScreenActions[] = +static void sub_81A5E94(void) { - {1, Swap_ActionMon}, - {1, Swap_ActionMon}, - {1, Swap_ActionMon}, - {2, Swap_ActionPkmnForSwap}, - {3, Swap_ActionCancel}, -}; - -// gfx -extern const u8 gFrontierFactorySelectMenu_Gfx[]; -extern const u8 gFrontierFactorySelectMenu_Tilemap[]; -extern const u16 gFrontierFactorySelectMenu_Pal[]; - -// text -extern const u8 gText_RentalPkmn2[]; -extern const u8 gText_SelectFirstPkmn[]; -extern const u8 gText_SelectSecondPkmn[]; -extern const u8 gText_SelectThirdPkmn[]; -extern const u8 gText_TheseThreePkmnOkay[]; -extern const u8 gText_CantSelectSamePkmn[]; -extern const u8 gText_Summary[]; -extern const u8 gText_Rechoose[]; -extern const u8 gText_Deselect[]; -extern const u8 gText_Rent[]; -extern const u8 gText_Others2[]; -extern const u8 gText_Yes2[]; -extern const u8 gText_Yes3[]; -extern const u8 gText_No2[]; -extern const u8 gText_No3[]; -extern const u8 gText_QuitSwapping[]; -extern const u8 gText_AcceptThisPkmn[]; -extern const u8 gText_SelectPkmnToAccept[]; -extern const u8 gText_SelectPkmnToSwap[]; -extern const u8 gText_PkmnSwap[]; -extern const u8 gText_Swap[]; -extern const u8 gText_Summary2[]; -extern const u8 gText_PkmnForSwap[]; -extern const u8 gText_SamePkmnInPartyAlready[]; -extern const u8 gText_Cancel3[]; + u8 i; + u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); -// code -static void sub_819A44C(struct Sprite *sprite) -{ - if (sprite->oam.paletteNum == IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED)) + gSaveBlock2Ptr->frontier.field_CA8 = 0; + gSaveBlock2Ptr->frontier.curChallengeBattleNum = 0; + gSaveBlock2Ptr->frontier.field_CA9_a = 0; + gSaveBlock2Ptr->frontier.field_CA9_b = 0; + if (!(gSaveBlock2Ptr->frontier.field_CDC & gUnknown_08612164[battleMode][lvlMode])) { - if (sprite->animEnded) - { - if (sprite->data[0] != 0) - { - sprite->data[0]--; - } - else if (Random() % 5 == 0) - { - StartSpriteAnim(sprite, 0); - sprite->data[0] = 32; - } - else - { - StartSpriteAnim(sprite, 1); - } - } - else - { - StartSpriteAnimIfDifferent(sprite, 1); - } - } - else - { - StartSpriteAnimIfDifferent(sprite, 0); + gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] = 0; + gSaveBlock2Ptr->frontier.factoryRentsCount[battleMode][lvlMode] = 0; } -} - -static void Select_CB2(void) -{ - AnimateSprites(); - BuildOamBuffer(); - RunTextPrinters(); - UpdatePaletteFade(); - RunTasks(); -} -static void Select_VblankCb(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} + gUnknown_03001288 = 0; + for (i = 0; i < 6; i++) + gSaveBlock2Ptr->frontier.field_E70[i].monId |= 0xFFFF; + for (i = 0; i < 3; i++) + gUnknown_03006298[i] |= 0xFFFF; -void DoBattleFactorySelectScreen(void) -{ - sFactorySelectScreen = NULL; - SetMainCallback2(CB2_InitSelectScreen); + saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); + gTrainerBattleOpponent_A = 0; } -static void CB2_InitSelectScreen(void) +static void sub_81A5FA8(void) { - u8 taskId; + u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); - switch (gMain.state) + switch (gSpecialVar_0x8005) { - case 0: - if (sFactorySelectMons != NULL) - FREE_AND_SET_NULL(sFactorySelectMons); - SetHBlankCallback(NULL); - SetVBlankCallback(NULL); - CpuFill32(0, (void *)VRAM, VRAM_SIZE); - ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, sSelect_BgTemplates, ARRAY_COUNT(sSelect_BgTemplates)); - InitWindows(sSelect_WindowTemplates); - DeactivateAllTextPrinters(); - gMain.state++; - break; case 1: - sSelectMenuTilesetBuffer = Alloc(0x440); - sSelectMonCardBgTilesetBuffer = AllocZeroed(0x440); - sSelectMenuTilemapBuffer = Alloc(0x800); - sSelectMonCardBgTilemapBuffer = AllocZeroed(0x800); - ChangeBgX(0, 0, 0); - ChangeBgY(0, 0, 0); - ChangeBgX(1, 0, 0); - ChangeBgY(1, 0, 0); - ChangeBgX(3, 0, 0); - ChangeBgY(3, 0, 0); - SetGpuReg(REG_OFFSET_BLDCNT, 0); - SetGpuReg(REG_OFFSET_BLDALPHA, 0); - SetGpuReg(REG_OFFSET_BLDY, 0); - SetGpuReg(REG_OFFSET_MOSAIC, 0); - SetGpuReg(REG_OFFSET_WIN0H, 0); - SetGpuReg(REG_OFFSET_WIN0V, 0); - SetGpuReg(REG_OFFSET_WIN1H, 0); - SetGpuReg(REG_OFFSET_WIN1V, 0); - SetGpuReg(REG_OFFSET_WININ, 0); - SetGpuReg(REG_OFFSET_WINOUT, 0); - gMain.state++; + gSpecialVar_Result = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode]; break; case 2: - ResetPaletteFade(); - ResetSpriteData(); - ResetTasks(); - FreeAllSpritePalettes(); - CpuCopy16(gFrontierFactorySelectMenu_Gfx, sSelectMenuTilesetBuffer, 0x440); - CpuCopy16(gUnknown_0861033C, sSelectMonCardBgTilesetBuffer, 0x60); - LoadBgTiles(1, sSelectMenuTilesetBuffer, 0x440, 0); - LoadBgTiles(3, sSelectMonCardBgTilesetBuffer, 0x60, 0); - CpuCopy16(gFrontierFactorySelectMenu_Tilemap, sSelectMenuTilemapBuffer, 0x800); - LoadBgTilemap(1, sSelectMenuTilemapBuffer, 0x800, 0); - LoadPalette(gFrontierFactorySelectMenu_Pal, 0, 0x40); - LoadPalette(gUnknown_0861046C, 0xF0, 8); - LoadPalette(gUnknown_0861046C, 0xE0, 10); - if (sFactorySelectScreen->fromSummaryScreen == TRUE) - gPlttBufferUnfaded[228] = sFactorySelectScreen->unk2A4; - LoadPalette(gUnknown_0861039C, 0x20, 4); - gMain.state++; + gSpecialVar_Result = ((gSaveBlock2Ptr->frontier.field_CDC & gUnknown_08612164[battleMode][lvlMode]) != 0); break; case 3: - SetBgTilemapBuffer(3, sSelectMonCardBgTilemapBuffer); - CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 11, 4, 8, 8); - CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 2, 4, 8, 8); - CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 20, 4, 8, 8); - CopyBgTilemapBufferToVram(3); - gMain.state++; - break; - case 4: - LoadSpritePalettes(gUnknown_086103F4); - LoadSpriteSheets(gUnknown_086103BC); - LoadCompressedObjectPic(gUnknown_086103E4); - ShowBg(0); - ShowBg(1); - SetVBlankCallback(Select_VblankCb); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); - SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_1D_MAP); - if (sFactorySelectScreen->fromSummaryScreen == TRUE) - { - Select_SetWinRegs(88, 152, 32, 96); - ShowBg(3); - SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ); - SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4)); - } - else - { - HideBg(3); - } - gMain.state++; - break; - case 5: - if (sFactorySelectScreen->fromSummaryScreen == TRUE) - sFactorySelectScreen->cursorPos = gUnknown_0203CF20; - Select_InitMonsData(); - Select_InitAllSprites(); - if (sFactorySelectScreen->fromSummaryScreen == TRUE) - Select_ShowSummaryMonSprite(); - gMain.state++; - break; - case 6: - Select_PrintSelectMonString(); - PutWindowTilemap(2); - gMain.state++; - break; - case 7: - Select_PrintMonCategory(); - PutWindowTilemap(5); - gMain.state++; - break; - case 8: - Select_PrintMonSpecies(); - PutWindowTilemap(1); - gMain.state++; - break; - case 9: - Select_PrintRentalPkmnString(); - PutWindowTilemap(0); - gMain.state++; - break; - case 10: - sFactorySelectScreen->fadeSpeciesNameTaskId = CreateTask(Task_SelectFadeSpeciesName, 0); - if (!sFactorySelectScreen->fromSummaryScreen) - { - gTasks[sFactorySelectScreen->fadeSpeciesNameTaskId].data[0] = 0; - taskId = CreateTask(Task_HandleSelectionScreenChooseMons, 0); - gTasks[taskId].data[0] = 0; - } - else - { - gTasks[sFactorySelectScreen->fadeSpeciesNameTaskId].data[0] = 1; - sFactorySelectScreen->unk2A2 = FALSE; - taskId = CreateTask(Task_HandleSelectionScreenMenu, 0); - gTasks[taskId].data[0] = 13; - } - SetMainCallback2(Select_CB2); + gSpecialVar_Result = gSaveBlock2Ptr->frontier.factoryRentsCount[battleMode][lvlMode]; break; } } -static void Select_InitMonsData(void) -{ - u8 i; - - if (sFactorySelectScreen != NULL) - return; - - sFactorySelectScreen = AllocZeroed(sizeof(*sFactorySelectScreen)); - sFactorySelectScreen->cursorPos = 0; - sFactorySelectScreen->selectingMonsState = 1; - sFactorySelectScreen->fromSummaryScreen = FALSE; - for (i = 0; i < SELECTABLE_MONS_COUNT; i++) - sFactorySelectScreen->mons[i].selectedId = 0; - - if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_TENT) - CreateFrontierFactorySelectableMons(0); - else - CreateTentFactorySelectableMons(0); -} - -static void Select_InitAllSprites(void) -{ - u8 i, cursorPos; - s16 x; - - for (i = 0; i < SELECTABLE_MONS_COUNT; i++) - { - sFactorySelectScreen->mons[i].spriteId = CreateSprite(&gUnknown_086105D8, (35 * i) + 32, 64, 1); - gSprites[sFactorySelectScreen->mons[i].spriteId].data[0] = 0; - Select_SetBallSpritePaletteNum(i); - } - cursorPos = sFactorySelectScreen->cursorPos; - x = gSprites[sFactorySelectScreen->mons[cursorPos].spriteId].pos1.x; - sFactorySelectScreen->cursorSpriteId = CreateSprite(&gUnknown_086105F0, x, 88, 0); - sFactorySelectScreen->menuCursor1SpriteId = CreateSprite(&gUnknown_08610608, 176, 112, 0); - sFactorySelectScreen->menuCursor2SpriteId = CreateSprite(&gUnknown_08610620, 176, 144, 0); - - gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = TRUE; - gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = TRUE; - - gSprites[sFactorySelectScreen->menuCursor1SpriteId].centerToCornerVecX = 0; - gSprites[sFactorySelectScreen->menuCursor1SpriteId].centerToCornerVecY = 0; - gSprites[sFactorySelectScreen->menuCursor2SpriteId].centerToCornerVecX = 0; - gSprites[sFactorySelectScreen->menuCursor2SpriteId].centerToCornerVecY = 0; -} - -static void Select_DestroyAllSprites(void) -{ - u8 i; - - for (i = 0; i < SELECTABLE_MONS_COUNT; i++) - DestroySprite(&gSprites[sFactorySelectScreen->mons[i].spriteId]); - - DestroySprite(&gSprites[sFactorySelectScreen->cursorSpriteId]); - DestroySprite(&gSprites[sFactorySelectScreen->menuCursor1SpriteId]); - DestroySprite(&gSprites[sFactorySelectScreen->menuCursor2SpriteId]); -} - -static void Select_UpdateBallCursorPosition(s8 direction) -{ - u8 cursorPos; - if (direction > 0) // Move cursor right. - { - if (sFactorySelectScreen->cursorPos != SELECTABLE_MONS_COUNT - 1) - sFactorySelectScreen->cursorPos++; - else - sFactorySelectScreen->cursorPos = 0; - } - else // Move cursor left. - { - if (sFactorySelectScreen->cursorPos != 0) - sFactorySelectScreen->cursorPos--; - else - sFactorySelectScreen->cursorPos = SELECTABLE_MONS_COUNT - 1; - } - - cursorPos = sFactorySelectScreen->cursorPos; - gSprites[sFactorySelectScreen->cursorSpriteId].pos1.x = gSprites[sFactorySelectScreen->mons[cursorPos].spriteId].pos1.x; -} - -static void Select_UpdateMenuCursorPosition(s8 direction) -{ - if (direction > 0) // Move cursor down. - { - if (sFactorySelectScreen->menuCursorPos != MENU_OPTIONS_COUNT - 1) - sFactorySelectScreen->menuCursorPos++; - else - sFactorySelectScreen->menuCursorPos = 0; - } - else // Move cursor up. - { - if (sFactorySelectScreen->menuCursorPos != 0) - sFactorySelectScreen->menuCursorPos--; - else - sFactorySelectScreen->menuCursorPos = MENU_OPTIONS_COUNT - 1; - } - - gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.y = (sFactorySelectScreen->menuCursorPos * 16) + 112; - gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.y = (sFactorySelectScreen->menuCursorPos * 16) + 112; -} - -static void Select_UpdateYesNoCursorPosition(s8 direction) -{ - if (direction > 0) // Move cursor down. - { - if (sFactorySelectScreen->yesNoCursorPos != 1) - sFactorySelectScreen->yesNoCursorPos++; - else - sFactorySelectScreen->yesNoCursorPos = 0; - } - else // Move cursor up. - { - if (sFactorySelectScreen->yesNoCursorPos != 0) - sFactorySelectScreen->yesNoCursorPos--; - else - sFactorySelectScreen->yesNoCursorPos = 1; - } - - gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.y = (sFactorySelectScreen->yesNoCursorPos * 16) + 112; - gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.y = (sFactorySelectScreen->yesNoCursorPos * 16) + 112; -} - -static void Select_HandleMonSelectionChange(void) -{ - u8 i, paletteNum; - u8 cursorPos = sFactorySelectScreen->cursorPos; - if (sFactorySelectScreen->mons[cursorPos].selectedId) // Deselect a mon. - { - paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_GREY); - if (sFactorySelectScreen->selectingMonsState == 3 && sFactorySelectScreen->mons[cursorPos].selectedId == 1) - { - for (i = 0; i < SELECTABLE_MONS_COUNT; i++) - { - if (sFactorySelectScreen->mons[i].selectedId == 2) - break; - } - if (i == SELECTABLE_MONS_COUNT) - return; - else - sFactorySelectScreen->mons[i].selectedId = 1; - } - sFactorySelectScreen->mons[cursorPos].selectedId = 0; - sFactorySelectScreen->selectingMonsState--; - } - else // Select a mon. - { - paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED); - sFactorySelectScreen->mons[cursorPos].selectedId = sFactorySelectScreen->selectingMonsState; - sFactorySelectScreen->selectingMonsState++; - } - - gSprites[sFactorySelectScreen->mons[cursorPos].spriteId].oam.paletteNum = paletteNum; -} - -static void Select_SetBallSpritePaletteNum(u8 id) -{ - u8 palNum; - - if (sFactorySelectScreen->mons[id].selectedId) - palNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED); - else - palNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_GREY); - - gSprites[sFactorySelectScreen->mons[id].spriteId].oam.paletteNum = palNum; -} - -static void Task_FromSelectScreenToSummaryScreen(u8 taskId) +static void sub_81A6054(void) { - u8 i; - u8 currMonId; + u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); - switch (gTasks[taskId].data[0]) + switch (gSpecialVar_0x8005) { - case 6: - gPlttBufferUnfaded[228] = gPlttBufferFaded[228]; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); - gTasks[taskId].data[0] = 7; - break; - case 7: - if (!gPaletteFade.active) - { - DestroyTask(sFactorySelectScreen->fadeSpeciesNameTaskId); - sub_819F444(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0); - Select_DestroyAllSprites(); - FREE_AND_SET_NULL(sSelectMenuTilesetBuffer); - FREE_AND_SET_NULL(sSelectMonCardBgTilesetBuffer); - FREE_AND_SET_NULL(sSelectMenuTilemapBuffer); - FREE_AND_SET_NULL(sSelectMonCardBgTilemapBuffer); - FreeAllWindowBuffers(); - gTasks[taskId].data[0] = 8; - } - break; - case 8: - sFactorySelectScreen->unk2A4 = gPlttBufferUnfaded[228]; - DestroyTask(taskId); - sFactorySelectScreen->fromSummaryScreen = TRUE; - currMonId = sFactorySelectScreen->cursorPos; - sFactorySelectMons = AllocZeroed(sizeof(struct Pokemon) * SELECTABLE_MONS_COUNT); - for (i = 0; i < SELECTABLE_MONS_COUNT; i++) - sFactorySelectMons[i] = sFactorySelectScreen->mons[i].monData; - ShowPokemonSummaryScreen(1, sFactorySelectMons, currMonId, SELECTABLE_MONS_COUNT - 1, CB2_InitSelectScreen); + case 1: + gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] = gSpecialVar_0x8006; break; - } -} - -static void Task_CloseSelectionScreen(u8 taskId) -{ - if (sFactorySelectScreen->unk2A0 != TRUE) - { - switch (gTasks[taskId].data[0]) - { - case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); - gTasks[taskId].data[0]++; - break; - case 1: - if (!UpdatePaletteFade()) - { - Select_CopyMonsToPlayerParty(); - DestroyTask(sFactorySelectScreen->fadeSpeciesNameTaskId); - Select_DestroyAllSprites(); - FREE_AND_SET_NULL(sSelectMenuTilesetBuffer); - FREE_AND_SET_NULL(sSelectMenuTilemapBuffer); - FREE_AND_SET_NULL(sSelectMonCardBgTilemapBuffer); - FREE_AND_SET_NULL(sFactorySelectScreen); - FreeAllWindowBuffers(); - SetMainCallback2(CB2_ReturnToFieldContinueScript); - DestroyTask(taskId); - } - break; - } - } -} - -static void Task_HandleSelectionScreenYesNo(u8 taskId) -{ - if (sFactorySelectScreen->unk2A0 != TRUE) - { - switch (gTasks[taskId].data[0]) - { - case 10: - sub_819C4B4(); - gTasks[taskId].data[0] = 4; - break; - case 4: - Select_ShowYesNoOptions(); - gTasks[taskId].data[0] = 5; - break; - case 5: - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (sFactorySelectScreen->yesNoCursorPos == 0) - { - sub_819C568(); - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = Task_CloseSelectionScreen; - } - else - { - sub_819B958(4); - sub_819BC9C(); - sFactorySelectScreen->unk2A2 = TRUE; - gTasks[taskId].data[0] = 1; - gTasks[taskId].func = Task_HandleSelectionScreenChooseMons; - } - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - sub_819B958(4); - sub_819BC9C(); - sFactorySelectScreen->unk2A2 = TRUE; - gTasks[taskId].data[0] = 1; - gTasks[taskId].func = Task_HandleSelectionScreenChooseMons; - } - else if (gMain.newAndRepeatedKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - Select_UpdateYesNoCursorPosition(-1); - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - Select_UpdateYesNoCursorPosition(1); - } - break; - } - } -} - -static void Task_HandleSelectionScreenMenu(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { case 2: - if (!sFactorySelectScreen->fromSummaryScreen) - sub_819F2B4(&sFactorySelectScreen->unk294[1].field1, &sFactorySelectScreen->unk2A0, FALSE); - gTasks[taskId].data[0] = 9; - break; - case 9: - if (sFactorySelectScreen->unk2A0 != TRUE) - { - Select_ShowMenuOptions(); - sFactorySelectScreen->fromSummaryScreen = FALSE; - gTasks[taskId].data[0] = 3; - } + if (gSpecialVar_0x8006) + gSaveBlock2Ptr->frontier.field_CDC |= gUnknown_08612164[battleMode][lvlMode]; + else + gSaveBlock2Ptr->frontier.field_CDC &= gUnknown_08612174[battleMode][lvlMode]; break; case 3: - if (gMain.newKeys & A_BUTTON) + if (gUnknown_03001288 == 1) { - u8 retVal; - PlaySE(SE_SELECT); - retVal = Select_RunMenuOptionFunc(); - if (retVal == 1) - { - sFactorySelectScreen->unk2A2 = TRUE; - gTasks[taskId].data[0] = 1; - gTasks[taskId].func = Task_HandleSelectionScreenChooseMons; - } - else if (retVal == 2) - { - gTasks[taskId].data[0] = 10; - gTasks[taskId].func = Task_HandleSelectionScreenYesNo; - } - else if (retVal == 3) - { - gTasks[taskId].data[0] = 11; - gTasks[taskId].func = Task_HandleSelectionScreenChooseMons; - } - else - { - gTasks[taskId].data[0] = 6; - gTasks[taskId].func = Task_FromSelectScreenToSummaryScreen; - } - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE); - sub_819B958(3); - sFactorySelectScreen->unk2A2 = TRUE; - gTasks[taskId].data[0] = 1; - gTasks[taskId].func = Task_HandleSelectionScreenChooseMons; - } - else if (gMain.newAndRepeatedKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - Select_UpdateMenuCursorPosition(-1); - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - Select_UpdateMenuCursorPosition(1); + gSaveBlock2Ptr->frontier.factoryRentsCount[battleMode][lvlMode] = gSpecialVar_0x8006; + gUnknown_03001288 = 0; } break; - case 12: - if (!gPaletteFade.active) - { - if (sFactorySelectScreen->fromSummaryScreen == TRUE) - { - gPlttBufferFaded[228] = sFactorySelectScreen->unk2A4; - gPlttBufferUnfaded[228] = gPlttBufferUnfaded[244]; - } - sFactorySelectScreen->fromSummaryScreen = FALSE; - gTasks[taskId].data[0] = 3; - } - break; - case 13: - Select_ShowMenuOptions(); - gTasks[taskId].data[0] = 12; - break; } } -static void Task_HandleSelectionScreenChooseMons(u8 taskId) +static void sub_81A613C(void) { - if (sFactorySelectScreen->unk2A0 != TRUE) - { - switch (gTasks[taskId].data[0]) - { - case 0: - if (!gPaletteFade.active) - { - gTasks[taskId].data[0] = 1; - sFactorySelectScreen->unk2A2 = TRUE; - } - break; - case 1: - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - sFactorySelectScreen->unk2A2 = FALSE; - gTasks[taskId].data[0] = 2; - gTasks[taskId].func = Task_HandleSelectionScreenMenu; - } - else if (gMain.newAndRepeatedKeys & DPAD_LEFT) - { - PlaySE(SE_SELECT); - Select_UpdateBallCursorPosition(-1); - Select_PrintMonCategory(); - Select_PrintMonSpecies(); - } - else if (gMain.newAndRepeatedKeys & DPAD_RIGHT) - { - PlaySE(SE_SELECT); - Select_UpdateBallCursorPosition(1); - Select_PrintMonCategory(); - Select_PrintMonSpecies(); - } - break; - case 11: - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE); - Select_PrintSelectMonString(); - sFactorySelectScreen->unk2A2 = TRUE; - gTasks[taskId].data[0] = 1; - } - break; - } - } + gSaveBlock2Ptr->frontier.field_CA8 = gSpecialVar_0x8005; + VarSet(VAR_TEMP_0, 0); + gSaveBlock2Ptr->frontier.field_CA9_a = 1; + sub_81A4C30(); } -static void CreateFrontierFactorySelectableMons(u8 firstMonId) +static void nullsub_75(void) { - u8 i, j = 0; - u8 ivs = 0; - u8 level = 0; - u8 happiness = 0; - u32 otId = 0; - u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); - u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; - u8 var_2C = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / 7; - u8 var_28 = 0; - - gFacilityTrainerMons = gBattleFrontierMons; - if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_50) - level = 100; - else - level = 50; - - var_28 = sub_81A6F70(battleMode, lvlMode); - otId = T1_READ_32(gSaveBlock2Ptr->playerTrainerId); - for (i = 0; i < SELECTABLE_MONS_COUNT; i++) - { - u16 monSetId = gSaveBlock2Ptr->frontier.field_E70[i].monId; - sFactorySelectScreen->mons[i + firstMonId].monSetId = monSetId; - if (i < var_28) - ivs = sub_81A6CA8(var_2C + 1, 0); - else - ivs = sub_81A6CA8(var_2C, 0); - CreateMonWithEVSpreadPersonalityOTID(&sFactorySelectScreen->mons[i + firstMonId].monData, - gFacilityTrainerMons[monSetId].species, - level, - gFacilityTrainerMons[monSetId].nature, - ivs, - gFacilityTrainerMons[monSetId].evSpread, - otId); - happiness = 0; - for (j = 0; j < 4; j++) - SetMonMoveAvoidReturn(&sFactorySelectScreen->mons[i + firstMonId].monData, gFacilityTrainerMons[monSetId].moves[j], j); - SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_FRIENDSHIP, &happiness); - SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]); - } } -static void CreateTentFactorySelectableMons(u8 firstMonId) +static void nullsub_123(void) { - u8 i, j; - u8 ivs = 0; - u8 level = 30; - u8 happiness = 0; - u32 otId = 0; - - gFacilityTrainerMons = gSlateportBattleTentMons; - otId = T1_READ_32(gSaveBlock2Ptr->playerTrainerId); - for (i = 0; i < SELECTABLE_MONS_COUNT; i++) - { - u16 monSetId = gSaveBlock2Ptr->frontier.field_E70[i].monId; - sFactorySelectScreen->mons[i + firstMonId].monSetId = monSetId; - CreateMonWithEVSpreadPersonalityOTID(&sFactorySelectScreen->mons[i + firstMonId].monData, - gFacilityTrainerMons[monSetId].species, - level, - gFacilityTrainerMons[monSetId].nature, - ivs, - gFacilityTrainerMons[monSetId].evSpread, - otId); - happiness = 0; - for (j = 0; j < 4; j++) - SetMonMoveAvoidReturn(&sFactorySelectScreen->mons[i + firstMonId].monData, gFacilityTrainerMons[monSetId].moves[j], j); - SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_FRIENDSHIP, &happiness); - SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]); - } } -static void Select_CopyMonsToPlayerParty(void) +static void sub_81A6188(void) { - u8 i, j; - - for (i = 0; i < 3; i++) - { - for (j = 0; j < SELECTABLE_MONS_COUNT; j++) - { - if (sFactorySelectScreen->mons[j].selectedId == i + 1) - { - gPlayerParty[i] = sFactorySelectScreen->mons[j].monData; - gSaveBlock2Ptr->frontier.field_E70[i].monId = sFactorySelectScreen->mons[j].monSetId; - gSaveBlock2Ptr->frontier.field_E70[i].personality = GetMonData(&gPlayerParty[i].box, MON_DATA_PERSONALITY, NULL); - gSaveBlock2Ptr->frontier.field_E70[i].abilityBit = GetBoxMonData(&gPlayerParty[i].box, MON_DATA_ALT_ABILITY, NULL); - gSaveBlock2Ptr->frontier.field_E70[i].ivs = GetBoxMonData(&gPlayerParty[i].box, MON_DATA_ATK_IV, NULL); - break; - } - } - } - CalculatePlayerPartyCount(); + ZeroPlayerPartyMons(); + DoBattleFactorySelectScreen(); } -static void Select_ShowMenuOptions(void) +static void sub_81A6198(void) { - if (!sFactorySelectScreen->fromSummaryScreen) - sFactorySelectScreen->menuCursorPos = 0; - - gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.x = 176; - gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.y = (sFactorySelectScreen->menuCursorPos * 16) + 112; - gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.x = 208; - gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.y = (sFactorySelectScreen->menuCursorPos * 16) + 112; - - gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = FALSE; - gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = FALSE; - - Select_PrintMenuOptions(); -} - -static void Select_ShowYesNoOptions(void) -{ - sFactorySelectScreen->yesNoCursorPos = 0; - - gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.x = 176; - gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.y = 112; - gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.x = 208; - gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.y = 112; - - gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = FALSE; - gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = FALSE; - - Select_PrintYesNoOptions(); -} - -static void sub_819B958(u8 windowId) -{ - gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = TRUE; - gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = TRUE; - FillWindowPixelBuffer(windowId, 0); - CopyWindowToVram(windowId, 2); - ClearWindowTilemap(windowId); -} - -static void Select_PrintRentalPkmnString(void) -{ - FillWindowPixelBuffer(0, 0); - AddTextPrinterParameterized(0, 1, gText_RentalPkmn2, 2, 1, 0, NULL); - CopyWindowToVram(0, 3); -} - -static void Select_PrintMonSpecies(void) -{ - u16 species; - u8 x; - u8 monId = sFactorySelectScreen->cursorPos; - - FillWindowPixelBuffer(1, 0); - species = GetMonData(&sFactorySelectScreen->mons[monId].monData, MON_DATA_SPECIES, NULL); - StringCopy(gStringVar4, gSpeciesNames[species]); - x = GetStringRightAlignXOffset(1, gStringVar4, 86); - AddTextPrinterParameterized3(1, 1, x, 1, gUnknown_08610479, 0, gStringVar4); - CopyWindowToVram(1, 2); + DoBattleFactorySwapScreen(); } -static void Select_PrintSelectMonString(void) +static void sub_81A61A4(void) { - const u8 *str = NULL; - - FillWindowPixelBuffer(2, 0); - if (sFactorySelectScreen->selectingMonsState == 1) - str = gText_SelectFirstPkmn; - else if (sFactorySelectScreen->selectingMonsState == 2) - str = gText_SelectSecondPkmn; - else if (sFactorySelectScreen->selectingMonsState == 3) - str = gText_SelectThirdPkmn; - else - str = gText_TheseThreePkmnOkay; - - AddTextPrinterParameterized(2, 1, str, 2, 5, 0, NULL); - CopyWindowToVram(2, 2); -} - -static void Select_PrintCantSelectSameMon(void) -{ - FillWindowPixelBuffer(2, 0); - AddTextPrinterParameterized(2, 1, gText_CantSelectSamePkmn, 2, 5, 0, NULL); - CopyWindowToVram(2, 2); -} - -static void Select_PrintMenuOptions(void) -{ - u8 selectedId = sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].selectedId; - - PutWindowTilemap(3); - FillWindowPixelBuffer(3, 0); - AddTextPrinterParameterized3(3, 1, 7, 1, gUnknown_08610476, 0, gText_Summary); - if (selectedId != 0) - AddTextPrinterParameterized3(3, 1, 7, 17, gUnknown_08610476, 0, gText_Deselect); - else - AddTextPrinterParameterized3(3, 1, 7, 17, gUnknown_08610476, 0, gText_Rent); - - AddTextPrinterParameterized3(3, 1, 7, 33, gUnknown_08610476, 0, gText_Others2); - CopyWindowToVram(3, 3); + gUnknown_03001288 = 1; } -static void Select_PrintYesNoOptions(void) +static void sub_81A61B0(void) { - PutWindowTilemap(4); - FillWindowPixelBuffer(4, 0); - AddTextPrinterParameterized3(4, 1, 7, 1, gUnknown_08610476, 0, gText_Yes2); - AddTextPrinterParameterized3(4, 1, 7, 17, gUnknown_08610476, 0, gText_No2); - CopyWindowToVram(4, 3); -} + s32 i, j, k; + u16 species[3]; + u16 heldItems[3]; + s32 firstMonId = 0; + u16 trainerId = 0; + u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); + u32 winStreak = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode]; + u32 challengeNum = winStreak / 7; + gFacilityTrainers = gBattleFrontierTrainers; -static u8 Select_RunMenuOptionFunc(void) -{ - gUnknown_030062E8 = sSelect_MenuOptionFuncs[sFactorySelectScreen->menuCursorPos]; - return gUnknown_030062E8(); -} - -static u8 Select_OptionRentDeselect(void) -{ - u8 selectedId = sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].selectedId; - u16 monSetId = sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].monSetId; - if (selectedId == 0 && !Select_AreSpeciesValid(monSetId)) + do { - Select_PrintCantSelectSameMon(); - sub_819B958(3); - return 3; - } - else - { - sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE); - Select_HandleMonSelectionChange(); - Select_PrintSelectMonString(); - sub_819B958(3); - if (sFactorySelectScreen->selectingMonsState > 3) - return 2; - else - return 1; - } -} - -static u8 sub_819BC9C(void) -{ - sub_819C568(); - Select_HandleMonSelectionChange(); - Select_PrintSelectMonString(); - sub_819B958(3); - if (sFactorySelectScreen->selectingMonsState > 3) - return 2; - else - return 1; -} - -static u8 Select_OptionSummary(void) -{ - return 0; -} - -static u8 Select_OptionOthers(void) -{ - sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE); - sub_819B958(3); - return 1; -} - -static void Select_PrintMonCategory(void) -{ - u16 species; - u8 text[30]; - u8 x; - u8 monId = sFactorySelectScreen->cursorPos; - if (monId < SELECTABLE_MONS_COUNT) - { - PutWindowTilemap(5); - FillWindowPixelBuffer(5, 0); - species = GetMonData(&sFactorySelectScreen->mons[monId].monData, MON_DATA_SPECIES, NULL); - CopyMonCategoryText(SpeciesToNationalPokedexNum(species), text); - x = GetStringRightAlignXOffset(1, text, 0x76); - AddTextPrinterParameterized(5, 1, text, x, 1, 0, NULL); - CopyWindowToVram(5, 2); - } -} - -static void Summary_ShowMonSprite(void) -{ - u8 monId = sFactorySelectScreen->cursorPos; - struct Pokemon *mon = &sFactorySelectScreen->mons[monId].monData; - u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); - u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); - u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL); - - sFactorySelectScreen->unk294[1].field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 88, 32, 15, 0xFFFF); - gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecX = 0; - gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecY = 0; - - sFactorySelectScreen->unk2A0 = FALSE; -} - -static void sub_819BE20(bool8 arg0) -{ - sFactorySelectScreen->unk2A0 = arg0; -} - -static void Select_ShowSummaryMonSprite(void) -{ - struct Pokemon *mon; - u16 species; - u32 personality, otId; - - sFactorySelectScreen->unk294[1].field1 = CreateSprite(&gUnknown_08610638, 120, 64, 1); - StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[1].field1], 2); - - mon = &sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].monData; - species = GetMonData(mon, MON_DATA_SPECIES, NULL); - personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); - otId = GetMonData(mon, MON_DATA_OT_ID, NULL); - - sFactorySelectScreen->unk294[1].field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 88, 32, 15, 0xFFFF); - gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecX = 0; - gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecY = 0; - - gSprites[sFactorySelectScreen->unk294[1].field1].invisible = TRUE; -} - -static void Select_ShowChosenMonsSprites(void) -{ - u8 i, j; - - for (i = 0; i < 3; i++) - { - for (j = 0; j < SELECTABLE_MONS_COUNT; j++) + trainerId = sub_8162548(challengeNum, gSaveBlock2Ptr->frontier.curChallengeBattleNum); + for (i = 0; i < gSaveBlock2Ptr->frontier.curChallengeBattleNum; i++) { - if (sFactorySelectScreen->mons[j].selectedId == i + 1) - { - struct Pokemon *mon = &sFactorySelectScreen->mons[j].monData; - u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); - u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); - u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL); - - sFactorySelectScreen->unk294[i].field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, (i * 72) + 16, 32, i + 13, 0xFFFF); - gSprites[sFactorySelectScreen->unk294[i].field0].centerToCornerVecX = 0; - gSprites[sFactorySelectScreen->unk294[i].field0].centerToCornerVecY = 0; + if (gSaveBlock2Ptr->frontier.field_CB4[i] == trainerId) break; - } } - } - sFactorySelectScreen->unk2A0 = FALSE; -} - -static void sub_819C040(struct Sprite *sprite) -{ - u8 taskId; - - if (sprite->affineAnimEnded - && gSprites[sFactorySelectScreen->unk294[0].field1].affineAnimEnded - && gSprites[sFactorySelectScreen->unk294[2].field1].affineAnimEnded) - { - sprite->invisible = TRUE; - gSprites[sFactorySelectScreen->unk294[0].field1].invisible = TRUE; - gSprites[sFactorySelectScreen->unk294[2].field1].invisible = TRUE; - - taskId = CreateTask(sub_819C1D0, 1); - gTasks[taskId].func(taskId); - - sprite->callback = SpriteCallbackDummy; - } -} + } while (i != gSaveBlock2Ptr->frontier.curChallengeBattleNum); -static void sub_819C100(struct Sprite *sprite) -{ - if (sprite->affineAnimEnded - && gSprites[sFactorySelectScreen->unk294[0].field1].affineAnimEnded - && gSprites[sFactorySelectScreen->unk294[2].field1].affineAnimEnded) - { - FreeOamMatrix(sprite->oam.matrixNum); - FreeOamMatrix(gSprites[sFactorySelectScreen->unk294[0].field1].oam.matrixNum); - FreeOamMatrix(gSprites[sFactorySelectScreen->unk294[2].field1].oam.matrixNum); - - sFactorySelectScreen->unk2A0 = FALSE; + gTrainerBattleOpponent_A = trainerId; + if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < 6) + gSaveBlock2Ptr->frontier.field_CB4[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = trainerId; - DestroySprite(&gSprites[sFactorySelectScreen->unk294[0].field1]); - DestroySprite(&gSprites[sFactorySelectScreen->unk294[2].field1]); - DestroySprite(sprite); - } -} - -static void sub_819C1D0(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - switch (task->data[0]) + i = 0; + while (i != 3) { - case 0: - task->data[3] = 16; - task->data[24] = 224; // BUG: writing outside the array's bounds. - task->data[5] = 64; - task->data[8] = 65; - SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); - SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24])); - SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8])); - SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ); - SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ); - break; - case 1: - ShowBg(3); - SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ); - SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4)); - break; - case 2: - task->data[5] -= 4; - task->data[8] += 4; - if (task->data[5] <= 32 || task->data[8] >= 96) - { - task->data[5] = 32; - task->data[8] = 96; - ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); - } - SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8])); - if (task->data[5] != 32) - return; - break; - default: - DestroyTask(taskId); - Select_ShowChosenMonsSprites(); - return; - } - task->data[0]++; -} + u16 monSetId = GetMonSetId(lvlMode, challengeNum, FALSE); + if (gFacilityTrainerMons[monSetId].species == SPECIES_UNOWN) + continue; -static void sub_819C2D4(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - switch (task->data[0]) - { - default: - HideBg(3); - gSprites[sFactorySelectScreen->unk294[1].field1].invisible = FALSE; - gSprites[sFactorySelectScreen->unk294[1].field1].callback = sub_819C100; - gSprites[sFactorySelectScreen->unk294[0].field1].invisible = FALSE; - gSprites[sFactorySelectScreen->unk294[0].field1].callback = SpriteCallbackDummy; - gSprites[sFactorySelectScreen->unk294[2].field1].invisible = FALSE; - gSprites[sFactorySelectScreen->unk294[2].field1].callback = SpriteCallbackDummy; - StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[1].field1], 1); - StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[0].field1], 1); - StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[2].field1], 1); - ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); - DestroyTask(taskId); - break; - case 0: - task->data[3] = 16; - task->data[24] = 224; // BUG: writing outside the array's bounds. - task->data[5] = 32; - task->data[8] = 96; - SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); - SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24])); - SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8])); - SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ); - SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ); - task->data[0]++; - break; - case 1: - task->data[5] += 4; - task->data[8] -= 4; - if (task->data[5] >= 64 || task->data[8] <= 65) + for (j = 0; j < 6; j++) { - task->data[5] = 64; - task->data[8] = 65; + if (gFacilityTrainerMons[monSetId].species == gFacilityTrainerMons[gSaveBlock2Ptr->frontier.field_E70[j].monId].species) + break; } - SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8])); - if (task->data[5] == 64) - task->data[0]++; - break; - } -} + if (j != 6) + continue; -static void sub_819C4B4(void) -{ - sFactorySelectScreen->unk294[1].field1 = CreateSprite(&gUnknown_08610638, 120, 64, 1); - sFactorySelectScreen->unk294[0].field1 = CreateSprite(&gUnknown_08610638, 44, 64, 1); - sFactorySelectScreen->unk294[2].field1 = CreateSprite(&gUnknown_08610638, 196, 64, 1); - - gSprites[sFactorySelectScreen->unk294[1].field1].callback = sub_819C040; - gSprites[sFactorySelectScreen->unk294[0].field1].callback = SpriteCallbackDummy; - gSprites[sFactorySelectScreen->unk294[2].field1].callback = SpriteCallbackDummy; - - sFactorySelectScreen->unk2A0 = TRUE; -} - -static void sub_819C568(void) -{ - u8 taskId; - - FreeAndDestroyMonPicSprite(sFactorySelectScreen->unk294[0].field0); - FreeAndDestroyMonPicSprite(sFactorySelectScreen->unk294[1].field0); - FreeAndDestroyMonPicSprite(sFactorySelectScreen->unk294[2].field0); - - taskId = CreateTask(sub_819C2D4, 1); - gTasks[taskId].func(taskId); - - sFactorySelectScreen->unk2A0 = TRUE; -} + if (lvlMode == FRONTIER_LVL_50 && monSetId > 849) + continue; -static void Select_SetWinRegs(s16 mWin0H, s16 nWin0H, s16 mWin0V, s16 nWin0V) -{ - SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); - SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(mWin0H, nWin0H)); - SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(mWin0V, nWin0V)); - SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ); - SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ); -} - -static bool32 Select_AreSpeciesValid(u16 monSetId) -{ - u8 i, j; - u32 species = gFacilityTrainerMons[monSetId].species; - u8 selectState = sFactorySelectScreen->selectingMonsState; - - for (i = 1; i < selectState; i++) - { - for (j = 0; j < SELECTABLE_MONS_COUNT; j++) + for (k = firstMonId; k < firstMonId + i; k++) { - if (sFactorySelectScreen->mons[j].selectedId == i) - { - if (gFacilityTrainerMons[sFactorySelectScreen->mons[j].monSetId].species == species) - return FALSE; - + if (species[k] == gFacilityTrainerMons[monSetId].species) break; - } } - } + if (k != firstMonId + i) + continue; - return TRUE; -} - -static void Task_SelectFadeSpeciesName(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - case 0: - sFactorySelectScreen->unk2A7 = 0; - sFactorySelectScreen->unk2A8 = 0; - sFactorySelectScreen->unk2A6 = TRUE; - gTasks[taskId].data[0] = 1; - break; - case 1: - if (sFactorySelectScreen->unk2A2) + for (k = firstMonId; k < firstMonId + i; k++) { - if (sFactorySelectScreen->unk2A9) - { - gTasks[taskId].data[0] = 2; - } - else - { - sFactorySelectScreen->unk2A7++; - if (sFactorySelectScreen->unk2A7 > 6) - { - sFactorySelectScreen->unk2A7 = 0; - if (!sFactorySelectScreen->unk2A6) - sFactorySelectScreen->unk2A8--; - else - sFactorySelectScreen->unk2A8++; - } - BlendPalettes(0x4000, sFactorySelectScreen->unk2A8, 0); - if (sFactorySelectScreen->unk2A8 > 5) - { - sFactorySelectScreen->unk2A6 = FALSE; - } - else if (sFactorySelectScreen->unk2A8 == 0) - { - gTasks[taskId].data[0] = 2; - sFactorySelectScreen->unk2A6 = TRUE; - } - } - } - break; - case 2: - if (sFactorySelectScreen->unk2A9 > 14) - { - sFactorySelectScreen->unk2A9 = 0; - gTasks[taskId].data[0] = 1; - } - else - { - sFactorySelectScreen->unk2A9++; + if (heldItems[k] != 0 && heldItems[k] == gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]) + break; } - break; - } -} - -// Swap Screen's section begins here. - -static void Swap_CB2(void) -{ - AnimateSprites(); - BuildOamBuffer(); - RunTextPrinters(); - UpdatePaletteFade(); - RunTasks(); -} + if (k != firstMonId + i) + continue; -static void Swap_VblankCb(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); -} - -static void CopySwappedMonData(void) -{ - u8 happiness; - - gPlayerParty[sFactorySwapScreen->playerMonId] = gEnemyParty[sFactorySwapScreen->enemyMonId]; - happiness = 0; - SetMonData(&gPlayerParty[sFactorySwapScreen->playerMonId], MON_DATA_FRIENDSHIP, &happiness); - gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->playerMonId].monId = gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->enemyMonId + 3].monId; - gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->playerMonId].ivs = gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->enemyMonId + 3].ivs; - gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->playerMonId].personality = GetMonData(&gEnemyParty[sFactorySwapScreen->enemyMonId], MON_DATA_PERSONALITY, NULL); - gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->playerMonId].abilityBit = GetBoxMonData(&gEnemyParty[sFactorySwapScreen->enemyMonId].box, MON_DATA_ALT_ABILITY, NULL); -} - -static void Task_FromSwapScreenToSummaryScreen(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - case 6: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); - gTasks[taskId].data[0] = 7; - break; - case 7: - if (!gPaletteFade.active) - { - DestroyTask(sFactorySwapScreen->fadeSpeciesNameTaskId); - sub_819F444(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30); - Swap_DestroyAllSprites(); - FREE_AND_SET_NULL(sSwapMenuTilesetBuffer); - FREE_AND_SET_NULL(sSwapMonCardBgTilesetBuffer); - FREE_AND_SET_NULL(sSwapMenuTilemapBuffer); - FREE_AND_SET_NULL(sSwapMonCardBgTilemapBuffer); - FreeAllWindowBuffers(); - gTasks[taskId].data[0] = 8; - } - break; - case 8: - DestroyTask(taskId); - sFactorySwapScreen->fromSummaryScreen = TRUE; - sFactorySwapScreen->unk24 = gPlttBufferUnfaded[244]; - ShowPokemonSummaryScreen(0, gPlayerParty, sFactorySwapScreen->cursorPos, 3 - 1, CB2_InitSwapScreen); - break; + species[i] = gFacilityTrainerMons[monSetId].species; + heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]; + gUnknown_03006298[i] = monSetId; + i++; } } -static void Task_CloseSwapScreen(u8 taskId) +static void sub_81A63B8(void) { - if (sFactorySwapScreen->unk30 != TRUE) - { - switch (gTasks[taskId].data[0]) - { - case 0: - if (sFactorySwapScreen->monSwapped == TRUE) - { - gTasks[taskId].data[0]++; - gSpecialVar_Result = 0; - } - else - { - gTasks[taskId].data[0] = 2; - gSpecialVar_Result = 1; - } - break; - case 1: - if (sFactorySwapScreen->monSwapped == TRUE) - { - sFactorySwapScreen->enemyMonId = sFactorySwapScreen->cursorPos; - CopySwappedMonData(); - } - gTasks[taskId].data[0]++; - break; - case 2: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); - gTasks[taskId].data[0]++; - break; - case 3: - if (!UpdatePaletteFade()) - { - DestroyTask(sFactorySwapScreen->fadeSpeciesNameTaskId); - Swap_DestroyAllSprites(); - FREE_AND_SET_NULL(sSwapMenuTilesetBuffer); - FREE_AND_SET_NULL(sSwapMonCardBgTilesetBuffer); - FREE_AND_SET_NULL(sSwapMenuTilemapBuffer); - FREE_AND_SET_NULL(sSwapMonCardBgTilemapBuffer); - FREE_AND_SET_NULL(sFactorySwapScreen); - FreeAllWindowBuffers(); - SetMainCallback2(CB2_ReturnToFieldContinueScript); - DestroyTask(taskId); - } - break; - } - } + SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0); } -static void Task_HandleSwapScreenYesNo(u8 taskId) +static void sub_81A63CC(void) { - u16 loPtr, hiPtr; - - if (sFactorySwapScreen->unk30 != TRUE) - { - switch (gTasks[taskId].data[0]) - { - case 4: - Swap_ShowYesNoOptions(); - gTasks[taskId].data[0] = 5; - break; - case 5: - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - if (sFactorySwapScreen->yesNoCursorPos == 0) - { - gTasks[taskId].data[1] = 1; - hiPtr = gTasks[taskId].data[6]; - loPtr = gTasks[taskId].data[7]; - gTasks[taskId].func = (void*)((hiPtr << 16) | loPtr); - } - else - { - gTasks[taskId].data[1] = 0; - sub_819EA64(4); - hiPtr = gTasks[taskId].data[6]; - loPtr = gTasks[taskId].data[7]; - gTasks[taskId].func = (void*)((hiPtr << 16) | loPtr); - } - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - gTasks[taskId].data[1] = 0; - sub_819EA64(4); - hiPtr = gTasks[taskId].data[6]; - loPtr = gTasks[taskId].data[7]; - gTasks[taskId].func = (void*)((hiPtr << 16) | loPtr); - } - else if (gMain.newAndRepeatedKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - Swap_UpdateYesNoCursorPosition(-1); - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - Swap_UpdateYesNoCursorPosition(1); - } - break; - } - } -} + u8 i; -static void sub_819CBDC(u8 taskId) -{ - if (gTasks[taskId].data[1] == 1) - { - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = Task_CloseSwapScreen; - } + if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_TENT) + gFacilityTrainerMons = gBattleFrontierMons; else - { - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 16; - gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons); - gTasks[taskId].data[5] = 1; - gTasks[taskId].func = sub_819D770; - } -} + gFacilityTrainerMons = gSlateportBattleTentMons; -static void sub_819CC24(u8 taskId) -{ - if (gTasks[taskId].data[0] == 0) + for (i = 0; i < 3; i++) { - Swap_PrintOnInfoWindow(gText_QuitSwapping); - sFactorySwapScreen->monSwapped = FALSE; - gTasks[taskId].data[0] = 4; - gTasks[taskId].data[6] = (u32)(sub_819CBDC) >> 16; - gTasks[taskId].data[7] = (u32)(sub_819CBDC); - gTasks[taskId].func = Task_HandleSwapScreenYesNo; + gSaveBlock2Ptr->frontier.field_E70[i + 3].monId = gUnknown_03006298[i]; + gSaveBlock2Ptr->frontier.field_E70[i + 3].ivs = GetBoxMonData(&gEnemyParty[i].box, MON_DATA_ATK_IV, NULL); + gSaveBlock2Ptr->frontier.field_E70[i + 3].personality = GetMonData(&gEnemyParty[i], MON_DATA_PERSONALITY, NULL); + gSaveBlock2Ptr->frontier.field_E70[i + 3].abilityBit = GetBoxMonData(&gEnemyParty[i].box, MON_DATA_ALT_ABILITY, NULL); + SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[gUnknown_03006298[i]].itemTableId]); } } -static void sub_819CC74(u8 taskId) +static void sub_81A64C4(void) { - sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE); - if (gTasks[taskId].data[1] == 1) + s32 i, j, k; + s32 count = 0; + u8 bits = 0; + u8 monLevel; + u16 monSetId; + u16 evs; + u8 ivs; + u8 friendship; + + if (gSaveBlock2Ptr->frontier.lvlMode == FRONTIER_LVL_TENT) { - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = Task_CloseSwapScreen; + gFacilityTrainerMons = gSlateportBattleTentMons; + monLevel = 30; } else { - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 16; - gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons); - gTasks[taskId].data[5] = 1; - gTasks[taskId].func = sub_819D770; - } -} - -static void sub_819CCD4(u8 taskId) -{ - if (gTasks[taskId].data[0] == 0) - { - sub_819F2B4(&sFactorySwapScreen->unk2C.field1, &sFactorySwapScreen->unk30, TRUE); - Swap_PrintOnInfoWindow(gText_AcceptThisPkmn); - sFactorySwapScreen->monSwapped = TRUE; - gTasks[taskId].data[0] = 4; - gTasks[taskId].data[6] = (u32)(sub_819CC74) >> 16; - gTasks[taskId].data[7] = (u32)(sub_819CC74); - gTasks[taskId].func = Task_HandleSwapScreenYesNo; + gFacilityTrainerMons = gBattleFrontierMons; + if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_50) + monLevel = 100; + else + monLevel = 50; } -} -static void Task_HandleSwapScreenMenu(u8 taskId) -{ - switch (gTasks[taskId].data[0]) + if (gSpecialVar_0x8005 < 2) { - case 2: - if (!sFactorySwapScreen->fromSummaryScreen) - sub_819F2B4(&sFactorySwapScreen->unk2C.field1, &sFactorySwapScreen->unk30, TRUE); - gTasks[taskId].data[0] = 9; - break; - case 9: - if (sFactorySwapScreen->unk30 != TRUE) + ZeroPlayerPartyMons(); + for (i = 0; i < 3; i++) { - Swap_ShowMenuOptions(); - gTasks[taskId].data[0] = 3; - } - break; - case 3: - if (sFactorySwapScreen->unk30 != TRUE) - { - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - Swap_RunMenuOptionFunc(taskId); - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE); - sub_819EA64(3); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 16; - gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons); - gTasks[taskId].data[5] = 1; - gTasks[taskId].func = sub_819D770; - } - else if (gMain.newAndRepeatedKeys & DPAD_UP) - { - Swap_UpdateMenuCursorPosition(-1); - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - Swap_UpdateMenuCursorPosition(1); - } - } - break; - } -} + monSetId = gSaveBlock2Ptr->frontier.field_E70[i].monId; + ivs = gSaveBlock2Ptr->frontier.field_E70[i].ivs; + CreateMon(&gPlayerParty[i], + gFacilityTrainerMons[monSetId].species, + monLevel, + ivs, + TRUE, gSaveBlock2Ptr->frontier.field_E70[i].personality, + 0, 0); -static void Task_HandleSwapScreenChooseMons(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - case 0: - if (!gPaletteFade.active) - { - sFactorySwapScreen->unk22 = TRUE; - gTasks[taskId].data[0] = 1; - } - break; - case 1: - if (gMain.newKeys & A_BUTTON) - { - PlaySE(SE_SELECT); - sFactorySwapScreen->unk22 = FALSE; - Swap_PrintMonSpecies2(); - sub_819EAC0(); - Swap_RunActionFunc(taskId); - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - sFactorySwapScreen->unk22 = FALSE; - Swap_PrintMonSpecies2(); - sub_819EAC0(); - gTasks[taskId].data[6] = (u32)(sub_819CC24) >> 16; - gTasks[taskId].data[7] = (u32)(sub_819CC24); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[5] = 0; - gTasks[taskId].func = sub_819D588; - } - else if (gMain.newAndRepeatedKeys & DPAD_LEFT) - { - Swap_UpdateBallCursorPosition(-1); - Swap_PrintMonCategory(); - Swap_PrintMonSpecies(); - } - else if (gMain.newAndRepeatedKeys & DPAD_RIGHT) - { - Swap_UpdateBallCursorPosition(1); - Swap_PrintMonCategory(); - Swap_PrintMonSpecies(); - } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) - { - Swap_UpdateActionCursorPosition(1); - Swap_PrintMonCategory(); - Swap_PrintMonSpecies(); - } - else if (gMain.newAndRepeatedKeys & DPAD_UP) - { - Swap_UpdateActionCursorPosition(-1); - Swap_PrintMonCategory(); - Swap_PrintMonSpecies(); - } - break; - } -} - -static void Task_SwapFadeSpeciesName(u8 taskId) -{ - switch (gTasks[taskId].data[0]) - { - case 0: - sFactorySwapScreen->unk27 = 0; - sFactorySwapScreen->unk28 = 0; - sFactorySwapScreen->unk26 = TRUE; - gTasks[taskId].data[0] = 1; - break; - case 1: - if (sFactorySwapScreen->unk22) - { - if (sFactorySwapScreen->unk29) + count = 0; + bits = gFacilityTrainerMons[monSetId].evSpread; + for (j = 0; j < NUM_STATS; bits >>= 1, j++) { - gTasks[taskId].data[0] = 2; + if (bits & 1) + count++; } - else + + evs = MAX_TOTAL_EVS / count; + bits = 1; + for (j = 0; j < NUM_STATS; bits <<= 1, j++) { - sFactorySwapScreen->unk27++; - if (sFactorySwapScreen->unk27 > 6) - { - sFactorySwapScreen->unk27 = 0; - if (!sFactorySwapScreen->unk26) - sFactorySwapScreen->unk28--; - else - sFactorySwapScreen->unk28++; - } - BlendPalettes(0x4000, sFactorySwapScreen->unk28, 0); - if (sFactorySwapScreen->unk28 > 5) - { - sFactorySwapScreen->unk26 = FALSE; - } - else if (sFactorySwapScreen->unk28 == 0) - { - gTasks[taskId].data[0] = 2; - sFactorySwapScreen->unk26 = TRUE; - } + if (gFacilityTrainerMons[monSetId].evSpread & bits) + SetMonData(&gPlayerParty[i], MON_DATA_HP_EV + j, &evs); } + + CalculateMonStats(&gPlayerParty[i]); + friendship = 0; + for (k = 0; k < 4; k++) + SetMonMoveAvoidReturn(&gPlayerParty[i], gFacilityTrainerMons[monSetId].moves[k], k); + SetMonData(&gPlayerParty[i], MON_DATA_FRIENDSHIP, &friendship); + SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]); + SetMonData(&gPlayerParty[i], MON_DATA_ALT_ABILITY, &gSaveBlock2Ptr->frontier.field_E70[i].abilityBit); } - break; - case 2: - if (sFactorySwapScreen->unk29 > 14) - { - sFactorySwapScreen->unk29 = 0; - gTasks[taskId].data[0] = 1; - } - else - { - sFactorySwapScreen->unk29++; - } - break; } -} -static void Task_SwapFadeSpeciesName2(u8 taskId) -{ - switch (gTasks[taskId].data[0]) + switch (gSpecialVar_0x8005) { case 0: - sFactorySwapScreen->unk27 = 0; - gTasks[taskId].data[4] = 0; - gTasks[taskId].data[0]++; - break; - case 1: - LoadPalette(&gPlttBufferUnfaded[0xF0], 0xE0, 0xA); - gTasks[taskId].data[0]++; - break; case 2: - if (sFactorySwapScreen->unk28 > 15) + for (i = 0; i < 3; i++) { - gTasks[taskId].data[4] = 1; - gTasks[taskId].data[0]++; - } - sFactorySwapScreen->unk27++; - if (sFactorySwapScreen->unk27 > 3) - { - sFactorySwapScreen->unk27 = 0; - gPlttBufferUnfaded[244] = gPlttBufferFaded[228]; - sFactorySwapScreen->unk28++; - } - BlendPalettes(0x4000, sFactorySwapScreen->unk28, 0); - break; - } -} - -static void sub_819D12C(u8 taskId) -{ - s8 i; - u8 var_2C; - bool8 destroyTask; + monSetId = gSaveBlock2Ptr->frontier.field_E70[i + 3].monId; + ivs = gSaveBlock2Ptr->frontier.field_E70[i + 3].ivs; + CreateMon(&gEnemyParty[i], + gFacilityTrainerMons[monSetId].species, + monLevel, + ivs, + TRUE, gSaveBlock2Ptr->frontier.field_E70[i + 3].personality, + 0, 0); - switch (gTasks[taskId].data[0]) - { - case 0: - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[0] = 1; - break; - case 1: - var_2C = 0; - for (i = 2; i >= 0; i--) - { - if (i != 2) - { - u8 posX = var_2C - gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x; - if (posX == 16 || gTasks[taskId].data[i + 2] == 1) - { - var_2C = gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x; - gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x += 10; - } - else if (posX > 16) - { - gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x = gSprites[sFactorySwapScreen->ballSpriteIds[i + 1]].pos1.x - 48; - } - } - else + count = 0; + bits = gFacilityTrainerMons[monSetId].evSpread; + for (j = 0; j < NUM_STATS; bits >>= 1, j++) { - var_2C = gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x; - gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x += 10; + if (bits & 1) + count++; } - if (gTasks[taskId].data[i + 1] == 1) + evs = MAX_TOTAL_EVS / count; + bits = 1; + for (j = 0; j < NUM_STATS; bits <<= 1, j++) { - if (gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x > (i * 48) + 72) - { - gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x = (i * 48) + 72; - destroyTask = TRUE; - } - else if (gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x == (i * 48) + 72) - { - destroyTask = TRUE; - } - else - { - destroyTask = FALSE; - } - } - else - { - destroyTask = FALSE; + if (gFacilityTrainerMons[monSetId].evSpread & bits) + SetMonData(&gEnemyParty[i], MON_DATA_HP_EV + j, &evs); } - if (gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x - 16 > 240) - { - var_2C = gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x; - gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x = -16; - if (sFactorySwapScreen->inEnemyScreen == TRUE) - gSprites[sFactorySwapScreen->ballSpriteIds[i]].oam.paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED); - else - gSprites[sFactorySwapScreen->ballSpriteIds[i]].oam.paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_GREY); - - gTasks[taskId].data[i + 1] = 1; - } + CalculateMonStats(&gEnemyParty[i]); + for (k = 0; k < 4; k++) + SetMonMoveAvoidReturn(&gEnemyParty[i], gFacilityTrainerMons[monSetId].moves[k], k); + SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]); + SetMonData(&gEnemyParty[i], MON_DATA_ALT_ABILITY, &gSaveBlock2Ptr->frontier.field_E70[i + 3].abilityBit); } - if (destroyTask == TRUE) - DestroyTask(taskId); break; } } -static void sub_819D324(u8 taskId) +static void sub_81A67EC(void) { - u8 i, j; - s32 posX = 0; - s8 r4 = gTasks[taskId].data[3]; - bool8 r1; - s16 currPosX; - u8 taskId2; - - if (gTasks[taskId].data[2] == 1) - r4 *= -1; + s32 i, j; + u8 firstMonId; + u8 battleMode; + u8 lvlMode; + u8 challengeNum; + u8 factoryLvlMode; + u8 factoryBattleMode; + u8 var_40; + u16 monSetId; + u16 currSpecies; + u16 species[PARTY_SIZE]; + u16 monIds[PARTY_SIZE]; + u16 heldItems[PARTY_SIZE]; + + gFacilityTrainers = gBattleFrontierTrainers; + for (i = 0; i < PARTY_SIZE; i++) + { + species[i] = 0; + monIds[i] = 0; + heldItems[i] = 0; + } + lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); + challengeNum = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / 7; + if (VarGet(VAR_FRONTIER_BATTLE_MODE) == FRONTIER_MODE_DOUBLES) + factoryBattleMode = FRONTIER_MODE_DOUBLES; + else + factoryBattleMode = FRONTIER_MODE_SINGLES; - switch (gTasks[taskId].data[0]) + gFacilityTrainerMons = gBattleFrontierMons; + if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_50) { - case 0: - currPosX = gSprites[sFactorySwapScreen->unk8[0][0]].pos1.x; - if (!gTasks[taskId].data[2]) - { - if (currPosX + r4 < 240) - { - r1 = TRUE; - } - else - { - r1 = FALSE; - posX = 240; - } - } - else - { - if (currPosX + r4 > 160) - { - r1 = TRUE; - } - else - { - r1 = FALSE; - posX = 160; - } - } - - if (r1 == TRUE) - { - for (i = 0; i < 3; i++) - { - for (j = 0; j < 2; j++) - gSprites[sFactorySwapScreen->unk8[j][i]].pos1.x += r4; - } - } - else - { - for (j = 0; j < 2; j++) - { - gSprites[sFactorySwapScreen->unk8[j][0]].pos1.x = posX; - gSprites[sFactorySwapScreen->unk8[j][1]].pos1.x = posX + 16; - gSprites[sFactorySwapScreen->unk8[j][2]].pos1.x = posX + 48; - } - taskId2 = gTasks[taskId].data[1]; - gTasks[taskId2].data[3] = 1; - DestroyTask(taskId); - } - break; - case 1: - currPosX = gSprites[sFactorySwapScreen->unkE[0][0]].pos1.x; - if (!gTasks[taskId].data[2]) - { - if (currPosX + r4 < 240) - { - r1 = TRUE; - } - else - { - r1 = FALSE; - posX = 240; - } - } - else - { - if (currPosX + r4 > 192) - { - r1 = TRUE; - } - else - { - r1 = FALSE; - posX = 192; - } - } - - if (r1 == TRUE) - { - for (i = 0; i < 2; i++) - { - for (j = 0; j < 2; j++) - gSprites[sFactorySwapScreen->unkE[j][i]].pos1.x += r4; - } - } - else - { - for (j = 0; j < 2; j++) - { - gSprites[sFactorySwapScreen->unkE[j][0]].pos1.x = posX; - gSprites[sFactorySwapScreen->unkE[j][1]].pos1.x = posX + 16; - } - taskId2 = gTasks[taskId].data[1]; - gTasks[taskId2].data[4] = 1; - DestroyTask(taskId); - } - break; + factoryLvlMode = FRONTIER_LVL_OPEN; + firstMonId = 0; } -} - -static void sub_819D588(u8 taskId) -{ - u8 anotherTaskId; - u16 loPtr, hiPtr; - - switch (gTasks[taskId].data[0]) + else { - case 0: - LoadPalette(gUnknown_08610918, 0xE0, sizeof(gUnknown_08610918)); - Swap_PrintActionStrings(); - PutWindowTilemap(5); - gTasks[taskId].data[0]++; - break; - case 1: - sub_819EA64(3); - gTasks[taskId].data[0]++; - break; - case 2: - BeginNormalPaletteFade(0x4000, 0, 0, 0x10, gUnknown_0860F13C[37]); - gTasks[taskId].data[0]++; - break; - case 3: - if (!gPaletteFade.active) - { - FillWindowPixelBuffer(5, 0); - CopyWindowToVram(5, 2); - if (sFactorySwapScreen->inEnemyScreen == TRUE) - { - anotherTaskId = CreateTask(sub_819D324, 0); - gTasks[taskId].data[3] = 0; - gTasks[anotherTaskId].data[1] = taskId; - gTasks[anotherTaskId].data[0] = 0; - gTasks[anotherTaskId].data[2] = 0; - gTasks[anotherTaskId].data[3] = 6; - gTasks[taskId].data[2] = 5; - gTasks[taskId].data[0]++; - } - else - { - anotherTaskId = CreateTask(sub_819D324, 0); - gTasks[taskId].data[3] = 1; - gTasks[taskId].data[4] = 0; - gTasks[anotherTaskId].data[1] = taskId; - gTasks[anotherTaskId].data[0] = 1; - gTasks[anotherTaskId].data[2] = 0; - gTasks[anotherTaskId].data[3] = 6; - gTasks[taskId].data[0] += 2; - } - } - break; - case 4: - if (gTasks[taskId].data[2] == 0) - { - anotherTaskId = CreateTask(sub_819D324, 0); - gTasks[taskId].data[4] = 0; - gTasks[anotherTaskId].data[1] = taskId; - gTasks[anotherTaskId].data[0] = 1; - gTasks[anotherTaskId].data[2] = 0; - gTasks[anotherTaskId].data[3] = 6; - gTasks[taskId].data[0]++; - } - else - { - gTasks[taskId].data[2]--; - } - break; - case 5: - if (gTasks[taskId].data[3] == 1 && gTasks[taskId].data[4] == 1) - { - gTasks[taskId].data[0] = gTasks[taskId].data[5]; - loPtr = gTasks[taskId].data[6]; - hiPtr = gTasks[taskId].data[7]; - gTasks[taskId].func = (void *)((loPtr << 0x10) | (hiPtr)); - } - break; + factoryLvlMode = FRONTIER_LVL_50; + firstMonId = 0; } -} + var_40 = sub_81A6F70(factoryBattleMode, factoryLvlMode); -static void sub_819D770(u8 taskId) -{ - u8 anotherTaskId; - u16 loPtr, hiPtr; - if (sFactorySwapScreen->unk30 == TRUE) - return; - - switch (gTasks[taskId].data[0]) + currSpecies = 0; + i = 0; + while (i != PARTY_SIZE) { - case 0: - if (sFactorySwapScreen->inEnemyScreen == TRUE) - { - anotherTaskId = CreateTask(sub_819D324, 0); - gTasks[taskId].data[3] = 0; - gTasks[anotherTaskId].data[1] = taskId; - gTasks[anotherTaskId].data[0] = 0; - gTasks[anotherTaskId].data[2] = 1; - gTasks[anotherTaskId].data[3] = 6; - gTasks[taskId].data[2] = 10; - gTasks[taskId].data[0]++; - } - else - { - anotherTaskId = CreateTask(sub_819D324, 0); - gTasks[taskId].data[3] = 1; - gTasks[taskId].data[4] = 0; - gTasks[anotherTaskId].data[1] = taskId; - gTasks[anotherTaskId].data[0] = 1; - gTasks[anotherTaskId].data[2] = 1; - gTasks[anotherTaskId].data[3] = 6; - gTasks[taskId].data[0] += 2; - } - break; - case 1: - if (gTasks[taskId].data[2] == 0) - { - anotherTaskId = CreateTask(sub_819D324, 0); - gTasks[taskId].data[4] = 0; - gTasks[anotherTaskId].data[1] = taskId; - gTasks[anotherTaskId].data[0] = 1; - gTasks[anotherTaskId].data[2] = 1; - gTasks[anotherTaskId].data[3] = 6; - gTasks[taskId].data[0]++; - } + if (i < var_40) + monSetId = GetMonSetId(factoryLvlMode, challengeNum, TRUE); else - { - gTasks[taskId].data[2]--; - } - break; - case 2: - if (gTasks[taskId].data[3] == 1 && gTasks[taskId].data[4] == 1) - { - gPlttBufferFaded[226] = gUnknown_0860F13C[37]; - Swap_PrintActionStrings(); - PutWindowTilemap(5); - gTasks[taskId].data[0]++; - } - break; - case 3: - BeginNormalPaletteFade(0x4000, 0, 0x10, 0, gUnknown_0860F13C[37]); - gTasks[taskId].data[0]++; - break; - case 4: - if (!gPaletteFade.active) - { - Swap_PrintOneActionString(0); - gTasks[taskId].data[0]++; - } - break; - case 5: - Swap_PrintOneActionString(1); - PutWindowTilemap(3); - gTasks[taskId].data[0]++; - break; - case 6: - FillWindowPixelBuffer(5, 0); - CopyWindowToVram(5, 2); - gTasks[taskId].data[0]++; - break; - case 7: - if (!sFactorySwapScreen->inEnemyScreen) - Swap_PrintOnInfoWindow(gText_SelectPkmnToSwap); - else - Swap_PrintOnInfoWindow(gText_SelectPkmnToAccept); - if (sFactorySwapScreen->cursorPos < 3) - gSprites[sFactorySwapScreen->cursorSpriteId].invisible = FALSE; - Swap_PrintMonCategory(); - gTasks[taskId].data[0]++; - break; - case 8: - Swap_PrintMonSpecies3(); - sub_819EADC(); - sFactorySwapScreen->unk22 = TRUE; - gTasks[taskId].data[0] = gTasks[taskId].data[5]; - loPtr = gTasks[taskId].data[6]; - hiPtr = gTasks[taskId].data[7]; - gTasks[taskId].func = (void *)((loPtr << 0x10) | (hiPtr)); - break; - } -} + monSetId = GetMonSetId(factoryLvlMode, challengeNum, FALSE); -static void sub_819D9EC(u8 taskId) -{ - u8 i; - if (sFactorySwapScreen->unk30 == TRUE) - return; + if (gFacilityTrainerMons[monSetId].species == SPECIES_UNOWN) + continue; - switch (gTasks[taskId].data[0]) - { - case 0: - Swap_PrintMonSpecies3(); - gTasks[taskId].data[0]++; - break; - case 1: - sub_819EADC(); - gSprites[sFactorySwapScreen->cursorSpriteId].invisible = TRUE; - gTasks[taskId].data[0]++; - break; - case 2: - CreateTask(sub_819D12C, 0); - gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].func = Task_SwapFadeSpeciesName2; - gTasks[taskId].data[0]++; - break; - case 3: - if (!FuncIsActiveTask(sub_819D12C) && gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[4] == 1) + // Cannot have two pokemon of the same species. + for (j = firstMonId; j < firstMonId + i; j++) { - sub_819EAC0(); - if (!sFactorySwapScreen->inEnemyScreen) - { - Swap_InitActions(ACTIONS_ENEMY_SCREEN); - } - else + u16 monId = monIds[j]; + if (monId == monSetId) + break; + if (species[j] == gFacilityTrainerMons[monSetId].species) { - Swap_InitActions(ACTIONS_PLAYER_SCREEN); - for (i = 0; i < 3; i++) - gSprites[sFactorySwapScreen->unk8[1][i]].invisible = TRUE; + if (currSpecies == 0) + currSpecies = gFacilityTrainerMons[monSetId].species; + else + break; } - gSprites[sFactorySwapScreen->cursorSpriteId].pos1.x = gSprites[sFactorySwapScreen->ballSpriteIds[sFactorySwapScreen->cursorPos]].pos1.x; - gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].func = Task_SwapFadeSpeciesName; - sFactorySwapScreen->unk27 = 0; - sFactorySwapScreen->unk28 = 6; - sFactorySwapScreen->unk26 = FALSE; - gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[0] = 1; - gTasks[taskId].data[0]++; } - break; - case 4: - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 0x10; - gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons); - gTasks[taskId].data[5] = 1; - gTasks[taskId].func = sub_819D770; - break; - } -} - -static void Swap_InitStruct(void) -{ - if (sFactorySwapScreen == NULL) - { - sFactorySwapScreen = AllocZeroed(sizeof(*sFactorySwapScreen)); - sFactorySwapScreen->cursorPos = 0; - sFactorySwapScreen->unk30 = FALSE; - sFactorySwapScreen->fromSummaryScreen = FALSE; - } -} - -void DoBattleFactorySwapScreen(void) -{ - sFactorySwapScreen = NULL; - SetMainCallback2(CB2_InitSwapScreen); -} + if (j != firstMonId + i) + continue; -static void CB2_InitSwapScreen(void) -{ - u8 taskId; - - switch (gMain.state) - { - case 0: - SetHBlankCallback(NULL); - SetVBlankCallback(NULL); - CpuFill32(0, (void *)VRAM, VRAM_SIZE); - ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, sSwap_BgTemplates, ARRAY_COUNT(sSwap_BgTemplates)); - InitWindows(sSwap_WindowTemplates); - DeactivateAllTextPrinters(); - gMain.state++; - break; - case 1: - sSwapMenuTilesetBuffer = Alloc(0x440); - sSwapMonCardBgTilesetBuffer = AllocZeroed(0x440); - sSwapMenuTilemapBuffer = Alloc(0x800); - sSwapMonCardBgTilemapBuffer = AllocZeroed(0x800); - ChangeBgX(0, 0, 0); - ChangeBgY(0, 0, 0); - ChangeBgX(1, 0, 0); - ChangeBgY(1, 0, 0); - ChangeBgX(2, 0, 0); - ChangeBgY(2, 0, 0); - ChangeBgX(3, 0, 0); - ChangeBgY(3, 0, 0); - SetGpuReg(REG_OFFSET_BLDY, 0); - SetGpuReg(REG_OFFSET_MOSAIC, 0); - SetGpuReg(REG_OFFSET_WIN0H, 0); - SetGpuReg(REG_OFFSET_WIN0V, 0); - SetGpuReg(REG_OFFSET_WIN1H, 0); - SetGpuReg(REG_OFFSET_WIN1V, 0); - SetGpuReg(REG_OFFSET_WININ, 0); - SetGpuReg(REG_OFFSET_WINOUT, 0); - gMain.state++; - break; - case 2: - ResetPaletteFade(); - ResetSpriteData(); - ResetTasks(); - FreeAllSpritePalettes(); - ResetAllPicSprites(); - CpuCopy16(gFrontierFactorySelectMenu_Gfx, sSwapMenuTilesetBuffer, 0x440); - CpuCopy16(gUnknown_0861033C, sSwapMonCardBgTilesetBuffer, 0x60); - LoadBgTiles(1, sSwapMenuTilesetBuffer, 0x440, 0); - LoadBgTiles(3, sSwapMonCardBgTilesetBuffer, 0x60, 0); - CpuCopy16(gFrontierFactorySelectMenu_Tilemap, sSwapMenuTilemapBuffer, 0x800); - LoadBgTilemap(1, sSwapMenuTilemapBuffer, 0x800, 0); - LoadPalette(gFrontierFactorySelectMenu_Pal, 0, 0x40); - LoadPalette(gUnknown_08610918, 0xF0, sizeof(gUnknown_08610918)); - LoadPalette(gUnknown_08610918, 0xE0, sizeof(gUnknown_08610918)); - LoadPalette(gUnknown_0861039C, 0x20, 4); - gMain.state++; - break; - case 3: - SetBgTilemapBuffer(3, sSwapMonCardBgTilemapBuffer); - CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 11, 4, 8, 8); - CopyBgTilemapBufferToVram(3); - gMain.state++; - break; - case 4: - LoadSpritePalettes(gUnknown_086106B0); - LoadSpriteSheets(gUnknown_08610650); - LoadCompressedObjectPic(gUnknown_086106A0); - SetVBlankCallback(Swap_VblankCb); - gMain.state++; - break; - case 5: - if (sFactorySwapScreen->fromSummaryScreen == TRUE) - sFactorySwapScreen->cursorPos = gUnknown_0203CF20; - gMain.state++; - break; - case 6: - Swap_InitStruct(); - Swap_InitAllSprites(); - if (sFactorySwapScreen->fromSummaryScreen == TRUE) - Swap_ShowSummaryMonSprite(); - Swap_InitActions(ACTIONS_PLAYER_SCREEN); - gMain.state++; - break; - case 7: - Swap_PrintOnInfoWindow(gText_SelectPkmnToSwap); - PutWindowTilemap(2); - gMain.state++; - break; - case 8: - Swap_PrintMonCategory(); - PutWindowTilemap(8); - gMain.state++; - break; - case 9: - if (!sFactorySwapScreen->fromSummaryScreen) - Swap_PrintMonSpecies(); - PutWindowTilemap(1); - gMain.state++; - break; - case 10: - Swap_PrintPkmnSwap(); - PutWindowTilemap(0); - gMain.state++; - break; - case 11: - gMain.state++; - break; - case 12: - if (sFactorySwapScreen->fromSummaryScreen) - Swap_PrintMonSpecies2(); - gMain.state++; - break; - case 13: - Swap_PrintActionStrings2(); - PutWindowTilemap(3); - gMain.state++; - break; - case 14: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); - SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); - ShowBg(0); - ShowBg(1); - ShowBg(2); - if (sFactorySwapScreen->fromSummaryScreen == TRUE) + // Cannot have two same held items. + for (j = firstMonId; j < firstMonId + i; j++) { - ShowBg(3); - SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ); - SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4)); - } - else - { - HideBg(3); - } - gMain.state++; - break; - case 15: - sFactorySwapScreen->fadeSpeciesNameTaskId = CreateTask(Task_SwapFadeSpeciesName, 0); - if (!sFactorySwapScreen->fromSummaryScreen) - { - gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[0] = 0; - taskId = CreateTask(Task_HandleSwapScreenChooseMons, 0); - gTasks[taskId].data[0] = 0; - } - else - { - sub_819EAF8(); - gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[0] = 1; - sFactorySwapScreen->unk22 = FALSE; - taskId = CreateTask(Task_HandleSwapScreenMenu, 0); - gTasks[taskId].data[0] = 2; + if (heldItems[j] != 0 && heldItems[j] == gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]) + { + if (gFacilityTrainerMons[monSetId].species == currSpecies) + currSpecies = 0; + break; + } } - SetMainCallback2(Swap_CB2); - break; + if (j != firstMonId + i) + continue; + + gSaveBlock2Ptr->frontier.field_E70[i].monId = monSetId; + species[i] = gFacilityTrainerMons[monSetId].species; + heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]; + monIds[i] = monSetId; + i++; } } -static void Swap_InitAllSprites(void) +static void sub_81A6A08(void) { u8 i; - u8 x; - struct SpriteTemplate spriteTemplate; - - spriteTemplate = gUnknown_08610834; - spriteTemplate.paletteTag = TAG_PAL_BALL_SELECTED; + u8 typesCount[18]; + u8 usedType[2]; + gFacilityTrainerMons = gBattleFrontierMons; + for (i = 0; i < NUMBER_OF_MON_TYPES; i++) + typesCount[i] = 0; for (i = 0; i < 3; i++) { - sFactorySwapScreen->ballSpriteIds[i] = CreateSprite(&spriteTemplate, (48 * i) + 72, 64, 1); - gSprites[sFactorySwapScreen->ballSpriteIds[i]].data[0] = 0; - } - sFactorySwapScreen->cursorSpriteId = CreateSprite(&gUnknown_0861084C, gSprites[sFactorySwapScreen->ballSpriteIds[sFactorySwapScreen->cursorPos]].pos1.x, 88, 0); - sFactorySwapScreen->menuCursor1SpriteId = CreateSprite(&gUnknown_08610864, 176, 112, 0); - sFactorySwapScreen->menuCursor2SpriteId = CreateSprite(&gUnknown_0861087C, 176, 144, 0); - gSprites[sFactorySwapScreen->menuCursor1SpriteId].invisible = TRUE; - gSprites[sFactorySwapScreen->menuCursor2SpriteId].invisible = TRUE; - gSprites[sFactorySwapScreen->menuCursor1SpriteId].centerToCornerVecX = 0; - gSprites[sFactorySwapScreen->menuCursor1SpriteId].centerToCornerVecY = 0; - gSprites[sFactorySwapScreen->menuCursor2SpriteId].centerToCornerVecX = 0; - gSprites[sFactorySwapScreen->menuCursor2SpriteId].centerToCornerVecY = 0; - - if (sFactorySwapScreen->fromSummaryScreen == TRUE) - x = 240; - else - x = 192; - - spriteTemplate = gUnknown_0861084C; - spriteTemplate.tileTag = TAG_TILE_68; - sFactorySwapScreen->unk8[0][0] = CreateSprite(&spriteTemplate, 240, 120, 10); + u32 species = gFacilityTrainerMons[gUnknown_03006298[i]].species; - spriteTemplate = gUnknown_08610864; - spriteTemplate.tileTag = TAG_TILE_69; - sFactorySwapScreen->unk8[0][1] = CreateSprite(&spriteTemplate, 256, 120, 10); - sFactorySwapScreen->unk8[0][2] = CreateSprite(&spriteTemplate, 288, 120, 10); - - spriteTemplate = gUnknown_0861084C; - spriteTemplate.tileTag = TAG_TILE_6A; - sFactorySwapScreen->unk8[1][0] = CreateSprite(&spriteTemplate, 240, 120, 1); - - spriteTemplate = gUnknown_08610864; - spriteTemplate.tileTag = TAG_TILE_6B; - sFactorySwapScreen->unk8[1][1] = CreateSprite(&spriteTemplate, 256, 120, 1); - spriteTemplate.tileTag = TAG_TILE_6C; - sFactorySwapScreen->unk8[1][2] = CreateSprite(&spriteTemplate, 288, 120, 1); - - spriteTemplate = gUnknown_0861084C; - spriteTemplate.tileTag = TAG_TILE_68; - sFactorySwapScreen->unkE[0][0] = CreateSprite(&spriteTemplate, x, 144, 10); - - spriteTemplate = gUnknown_08610864; - spriteTemplate.tileTag = TAG_TILE_69; - sFactorySwapScreen->unkE[0][1] = CreateSprite(&spriteTemplate, x + 16, 144, 10); - - spriteTemplate = gUnknown_0861084C; - spriteTemplate.tileTag = TAG_TILE_6A; - sFactorySwapScreen->unkE[1][0] = CreateSprite(&spriteTemplate, x, 144, 1); - - spriteTemplate = gUnknown_08610864; - spriteTemplate.tileTag = TAG_TILE_6C; - sFactorySwapScreen->unkE[1][1] = CreateSprite(&spriteTemplate, x + 16, 144, 1); - - for (i = 0; i < 2; i++) - { - gSprites[sFactorySwapScreen->unk8[i][0]].centerToCornerVecX = 0; - gSprites[sFactorySwapScreen->unk8[i][0]].centerToCornerVecY = 0; - gSprites[sFactorySwapScreen->unk8[i][1]].centerToCornerVecX = 0; - gSprites[sFactorySwapScreen->unk8[i][1]].centerToCornerVecY = 0; - gSprites[sFactorySwapScreen->unk8[i][2]].centerToCornerVecX = 0; - gSprites[sFactorySwapScreen->unk8[i][2]].centerToCornerVecY = 0; - gSprites[sFactorySwapScreen->unkE[i][0]].centerToCornerVecX = 0; - gSprites[sFactorySwapScreen->unkE[i][0]].centerToCornerVecY = 0; - gSprites[sFactorySwapScreen->unkE[i][1]].centerToCornerVecX = 0; - gSprites[sFactorySwapScreen->unkE[i][1]].centerToCornerVecY = 0; - - gSprites[sFactorySwapScreen->unk8[i][0]].invisible = TRUE; - gSprites[sFactorySwapScreen->unk8[i][1]].invisible = TRUE; - gSprites[sFactorySwapScreen->unk8[i][2]].invisible = TRUE; - gSprites[sFactorySwapScreen->unkE[i][0]].invisible = TRUE; - gSprites[sFactorySwapScreen->unkE[i][1]].invisible = TRUE; + typesCount[gBaseStats[species].type1]++; + if (gBaseStats[species].type1 != gBaseStats[species].type2) + typesCount[gBaseStats[species].type2]++; } - gSprites[sFactorySwapScreen->unkE[0][0]].invisible = FALSE; - gSprites[sFactorySwapScreen->unkE[0][1]].invisible = FALSE; - gSprites[sFactorySwapScreen->unk8[0][0]].invisible = FALSE; - gSprites[sFactorySwapScreen->unk8[0][1]].invisible = FALSE; - gSprites[sFactorySwapScreen->unk8[0][2]].invisible = FALSE; -} - -static void Swap_DestroyAllSprites(void) -{ - u8 i, j; - - for (i = 0; i < 3; i++) - DestroySprite(&gSprites[sFactorySwapScreen->ballSpriteIds[i]]); - DestroySprite(&gSprites[sFactorySwapScreen->cursorSpriteId]); - DestroySprite(&gSprites[sFactorySwapScreen->menuCursor1SpriteId]); - DestroySprite(&gSprites[sFactorySwapScreen->menuCursor2SpriteId]); - for (i = 0; i < 2; i++) - { - for (j = 0; j < 3; j++) - DestroySprite(&gSprites[sFactorySwapScreen->unk8[i][j]]); - } - for (i = 0; i < 2; i++) + usedType[0] = 0; + usedType[1] = 0; + for (i = 1; i < NUMBER_OF_MON_TYPES; i++) { - for (j = 0; j < 2; j++) - DestroySprite(&gSprites[sFactorySwapScreen->unkE[i][j]]); + if (typesCount[usedType[0]] < typesCount[i]) + usedType[0] = i; + else if (typesCount[usedType[0]] == typesCount[i]) + usedType[1] = i; } -} -static void Swap_HandleActionCursorChange(u8 cursorId) -{ - if (cursorId < 3) - { - gSprites[sFactorySwapScreen->cursorSpriteId].invisible = FALSE; - sub_819E8EC(); - gSprites[sFactorySwapScreen->cursorSpriteId].pos1.x = gSprites[sFactorySwapScreen->ballSpriteIds[cursorId]].pos1.x; - } + gSpecialVar_Result = gSpecialVar_Result; // Needed to match. Don't ask me why. + if (typesCount[usedType[0]] != 0 && (typesCount[usedType[0]] > typesCount[usedType[1]] || usedType[0] == usedType[1])) + gSpecialVar_Result = usedType[0]; else - { - gSprites[sFactorySwapScreen->cursorSpriteId].invisible = TRUE; - sub_819E838(sFactorySwapScreen->actionsData[cursorId].id); - } -} - -static void Swap_UpdateBallCursorPosition(s8 direction) -{ - u8 cursorPos; - PlaySE(SE_SELECT); - if (direction > 0) // Move cursor right. - { - if (sFactorySwapScreen->cursorPos + 1 != sFactorySwapScreen->actionsCount) - sFactorySwapScreen->cursorPos++; - else - sFactorySwapScreen->cursorPos = 0; - } - else // Move cursor left. - { - if (sFactorySwapScreen->cursorPos != 0) - sFactorySwapScreen->cursorPos--; - else - sFactorySwapScreen->cursorPos = sFactorySwapScreen->actionsCount - 1; - } - - cursorPos = sFactorySwapScreen->cursorPos; - Swap_HandleActionCursorChange(cursorPos); -} - -static void Swap_UpdateActionCursorPosition(s8 direction) -{ - u8 cursorPos; - PlaySE(SE_SELECT); - if (direction > 0) // Move cursor down. - { - if (sFactorySwapScreen->cursorPos < 3) - sFactorySwapScreen->cursorPos = 3; - else if (sFactorySwapScreen->cursorPos + 1 != sFactorySwapScreen->actionsCount) - sFactorySwapScreen->cursorPos++; - else - sFactorySwapScreen->cursorPos = 0; - } - else // Move cursor up. - { - if (sFactorySwapScreen->cursorPos < 3) - sFactorySwapScreen->cursorPos = sFactorySwapScreen->actionsCount - 1; - else if (sFactorySwapScreen->cursorPos != 0) - sFactorySwapScreen->cursorPos--; - else - sFactorySwapScreen->cursorPos = sFactorySwapScreen->actionsCount - 1; - } - - cursorPos = sFactorySwapScreen->cursorPos; - Swap_HandleActionCursorChange(cursorPos); -} - -static void Swap_UpdateYesNoCursorPosition(s8 direction) -{ - if (direction > 0) // Move cursor down. - { - if (sFactorySwapScreen->yesNoCursorPos != 1) - sFactorySwapScreen->yesNoCursorPos++; - else - sFactorySwapScreen->yesNoCursorPos = 0; - } - else // Move cursor up. - { - if (sFactorySwapScreen->yesNoCursorPos != 0) - sFactorySwapScreen->yesNoCursorPos--; - else - sFactorySwapScreen->yesNoCursorPos = 1; - } - - gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.y = (sFactorySwapScreen->yesNoCursorPos * 16) + 112; - gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.y = (sFactorySwapScreen->yesNoCursorPos * 16) + 112; -} - -static void Swap_UpdateMenuCursorPosition(s8 direction) -{ - PlaySE(SE_SELECT); - if (direction > 0) // Move cursor down. - { - if (sFactorySwapScreen->menuCursorPos != MENU_OPTIONS_COUNT - 1) - sFactorySwapScreen->menuCursorPos++; - else - sFactorySwapScreen->menuCursorPos = 0; - } - else // Move cursor up. - { - if (sFactorySwapScreen->menuCursorPos != 0) - sFactorySwapScreen->menuCursorPos--; - else - sFactorySwapScreen->menuCursorPos = MENU_OPTIONS_COUNT - 1; - } - - gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.y = (sFactorySwapScreen->menuCursorPos * 16) + 112; - gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.y = (sFactorySwapScreen->menuCursorPos * 16) + 112; + gSpecialVar_Result = NUMBER_OF_MON_TYPES; } -static void sub_819E838(u8 arg0) +static void sub_81A6AEC(void) { - u8 i; + u8 i, j, count; + u8 stylePoints[8]; + count = 0; + gFacilityTrainerMons = gBattleFrontierMons; + for (i = 0; i < 8; i++) + stylePoints[i] = 0; for (i = 0; i < 3; i++) { - if (arg0 == 2) - { - gSprites[sFactorySwapScreen->unk8[1][i]].invisible = FALSE; - if (i < 2) - gSprites[sFactorySwapScreen->unkE[1][i]].invisible = TRUE; - } - else if (arg0 == 3) + u16 monSetId = gUnknown_03006298[i]; + for (j = 0; j < 4; j++) { - if (i < 2) - gSprites[sFactorySwapScreen->unkE[1][i]].invisible = FALSE; - gSprites[sFactorySwapScreen->unk8[1][i]].invisible = TRUE; + u8 id = GetStyleForMove(gFacilityTrainerMons[monSetId].moves[j]); + stylePoints[id]++; } } -} -static void sub_819E8EC(void) -{ - u8 i; - - for (i = 0; i < 3; i++) + gSpecialVar_Result = 0; + for (i = 1; i < 8; i++) { - gSprites[sFactorySwapScreen->unk8[1][i]].invisible = TRUE; - if (i < 2) - gSprites[sFactorySwapScreen->unkE[1][i]].invisible = TRUE; + if (stylePoints[i] >= sRequiredMoveCounts[i - 1]) + { + gSpecialVar_Result = i; + count++; + } } + if (count > 2) + gSpecialVar_Result = 8; } -static void Swap_ShowMenuOptions(void) -{ - if (sFactorySwapScreen->fromSummaryScreen == TRUE) - sFactorySwapScreen->fromSummaryScreen = FALSE; - else - sFactorySwapScreen->menuCursorPos = 0; - - gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.x = 176; - gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.y = (sFactorySwapScreen->menuCursorPos * 16) + 112; - gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.x = 208; - gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.y = (sFactorySwapScreen->menuCursorPos * 16) + 112; - - gSprites[sFactorySwapScreen->menuCursor1SpriteId].invisible = FALSE; - gSprites[sFactorySwapScreen->menuCursor2SpriteId].invisible = FALSE; - - Swap_PrintMenuOptions(); -} - -static void Swap_ShowYesNoOptions(void) -{ - sFactorySwapScreen->yesNoCursorPos = 0; - - gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.x = 176; - gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.y = 112; - gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.x = 208; - gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.y = 112; - - gSprites[sFactorySwapScreen->menuCursor1SpriteId].invisible = FALSE; - gSprites[sFactorySwapScreen->menuCursor2SpriteId].invisible = FALSE; - - Swap_PrintYesNoOptions(); -} - -static void sub_819EA64(u8 windowId) -{ - gSprites[sFactorySwapScreen->menuCursor1SpriteId].invisible = TRUE; - gSprites[sFactorySwapScreen->menuCursor2SpriteId].invisible = TRUE; - FillWindowPixelBuffer(windowId, 0); - CopyWindowToVram(windowId, 2); - ClearWindowTilemap(windowId); -} - -static void sub_819EAC0(void) +static u8 GetStyleForMove(u16 move) { - PutWindowTilemap(1); - FillWindowPixelBuffer(1, 0); - CopyWindowToVram(1, 2); -} - -static void sub_819EADC(void) -{ - PutWindowTilemap(7); - FillWindowPixelBuffer(7, 0); - CopyWindowToVram(7, 2); -} - -static void sub_819EAF8(void) -{ - sub_819EAC0(); - PutWindowTilemap(5); - FillWindowPixelBuffer(5, 0); - CopyWindowToVram(5, 2); -} - -static void Swap_PrintPkmnSwap(void) -{ - FillWindowPixelBuffer(0, 0x11); - AddTextPrinterParameterized(0, 1, gText_PkmnSwap, 2, 1, 0, NULL); - CopyWindowToVram(0, 3); -} - -static void Swap_PrintMonSpecies(void) -{ - u16 species; - u8 x; + const u16 *moves; + u8 i, j; - FillWindowPixelBuffer(1, 0); - if (sFactorySwapScreen->cursorPos > 2) + for (i = 0; i < ARRAY_COUNT(sMoveStyles); i++) { - CopyWindowToVram(1, 2); - } - else - { - u8 monId = sFactorySwapScreen->cursorPos; - if (!sFactorySwapScreen->inEnemyScreen) - species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL); - else - species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL); - StringCopy(gStringVar4, gSpeciesNames[species]); - x = GetStringRightAlignXOffset(1, gStringVar4, 86); - AddTextPrinterParameterized3(1, 1, x, 1, gUnknown_08610925, 0, gStringVar4); - CopyWindowToVram(1, 3); + for (j = 0, moves = sMoveStyles[i]; moves[j] != 0; j++) + { + if (moves[j] == move) + return i + 1; + } } + return 0; } -static void Swap_PrintOnInfoWindow(const u8 *str) -{ - FillWindowPixelBuffer(2, 0); - AddTextPrinterParameterized(2, 1, str, 2, 5, 0, NULL); - CopyWindowToVram(2, 2); -} - -static void Swap_PrintMenuOptions(void) -{ - PutWindowTilemap(3); - FillWindowPixelBuffer(3, 0); - AddTextPrinterParameterized3(3, 1, 15, 1, gUnknown_08610922, 0, gText_Summary2); - AddTextPrinterParameterized3(3, 1, 15, 17, gUnknown_08610922, 0, gText_Swap); - AddTextPrinterParameterized3(3, 1, 15, 33, gUnknown_08610922, 0, gText_Rechoose); - CopyWindowToVram(3, 3); -} - -static void Swap_PrintYesNoOptions(void) -{ - PutWindowTilemap(4); - FillWindowPixelBuffer(4, 0); - AddTextPrinterParameterized3(4, 1, 7, 1, gUnknown_08610922, 0, gText_Yes3); - AddTextPrinterParameterized3(4, 1, 7, 17, gUnknown_08610922, 0, gText_No3); - CopyWindowToVram(4, 3); -} - -static void Swap_PrintActionString(const u8 *str, u32 y, u32 windowId) +bool8 sub_81A6BF4(void) { - s32 x = GetStringRightAlignXOffset(0, str, 0x46); - AddTextPrinterParameterized3(windowId, 0, x, y, gUnknown_08610922, 0, str); + return (gMapHeader.mapLayoutId == 347 || gMapHeader.mapLayoutId == 348); } -static void Swap_PrintActionStrings(void) +static void sub_81A6C1C(void) { - FillWindowPixelBuffer(5, 0); - switch (sFactorySwapScreen->inEnemyScreen) - { - case TRUE: - Swap_PrintActionString(gText_PkmnForSwap, 0, 5); - case FALSE: - Swap_PrintActionString(gText_Cancel3, 24, 5); - break; - } - CopyWindowToVram(5, 3); -} + u8 i; -static void Swap_PrintActionStrings2(void) -{ - FillWindowPixelBuffer(3, 0); - switch (sFactorySwapScreen->inEnemyScreen) - { - case TRUE: - Swap_PrintActionString(gText_PkmnForSwap, 8, 3); - case FALSE: - Swap_PrintActionString(gText_Cancel3, 32, 3); - break; - } - CopyWindowToVram(3, 3); -} + if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_TENT) + gFacilityTrainerMons = gBattleFrontierMons; + else + gFacilityTrainerMons = gSlateportBattleTentMons; -static void Swap_PrintOneActionString(u8 which) -{ - switch (which) + for (i = 0; i < 3; i++) { - case 0: - if (sFactorySwapScreen->inEnemyScreen == TRUE) - Swap_PrintActionString(gText_PkmnForSwap, 8, 3); - break; - case 1: - Swap_PrintActionString(gText_Cancel3, 32, 3); - break; + SetMonData(&gPlayerParty[i], + MON_DATA_HELD_ITEM, + &gBattleFrontierHeldItems[gFacilityTrainerMons[gSaveBlock2Ptr->frontier.field_E70[i].monId].itemTableId]); } - CopyWindowToVram(3, 3); } -static void Swap_PrintMonSpecies2(void) +u8 GetFactoryMonFixedIV(u8 arg0, u8 arg1) { - u16 species; - u8 x; - u16 pal[5]; + u8 a1; + u8 a2 = (arg1 != 0) ? 1 : 0; - CpuCopy16(gUnknown_08610918, pal, 8); - if (!sFactorySwapScreen->fromSummaryScreen) - pal[4] = gPlttBufferFaded[228]; + if (arg0 > 8) + a1 = 7; else - pal[4] = sFactorySwapScreen->unk24; - LoadPalette(pal, 0xF0, 0xA); + a1 = arg0; - PutWindowTilemap(7); - FillWindowPixelBuffer(7, 0); - if (sFactorySwapScreen->cursorPos > 2) - { - CopyWindowToVram(7, 3); - } - else - { - u8 monId = sFactorySwapScreen->cursorPos; - if (!sFactorySwapScreen->inEnemyScreen) - species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL); - else - species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL); - StringCopy(gStringVar4, gSpeciesNames[species]); - x = GetStringRightAlignXOffset(1, gStringVar4, 86); - AddTextPrinterParameterized3(7, 1, x, 1, gUnknown_08610925, 0, gStringVar4); - CopyWindowToVram(7, 3); - } + return sFixedIVTable[a1][a2]; } -static void Swap_PrintMonSpecies3(void) +void FillFactoryBrainParty(void) { - u16 species; - u8 x; + s32 i, j, k; + u16 species[3]; + u16 heldItems[3]; + u8 friendship; + s32 monLevel; + u8 fixedIV; + u32 otId; - LoadPalette(gUnknown_08610918, 0xE0, sizeof(gUnknown_08610918)); - CpuCopy16(gPlttBufferUnfaded + 240, gPlttBufferFaded + 224, 10); + u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); + u8 challengeNum = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / 7; + fixedIV = GetFactoryMonFixedIV(challengeNum + 2, 0); + monLevel = SetFacilityPtrsGetLevel(); + i = 0; + otId = T1_READ_32(gSaveBlock2Ptr->playerTrainerId); - if (sFactorySwapScreen->cursorPos > 2) + while (i != 3) { - CopyWindowToVram(1, 2); - } - else - { - u8 monId = sFactorySwapScreen->cursorPos; - if (!sFactorySwapScreen->inEnemyScreen) - species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL); - else - species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL); - StringCopy(gStringVar4, gSpeciesNames[species]); - x = GetStringRightAlignXOffset(1, gStringVar4, 86); - AddTextPrinterParameterized3(1, 1, x, 1, gUnknown_08610925, 0, gStringVar4); - CopyWindowToVram(1, 3); - } -} - -static void Swap_PrintMonCategory(void) -{ - u16 species; - u8 text[30]; - u8 x; - u8 monId = sFactorySwapScreen->cursorPos; + u16 monSetId = GetMonSetId(lvlMode, challengeNum, FALSE); - FillWindowPixelBuffer(8, 0); - if (monId > 2) - { - CopyWindowToVram(8, 2); - } - else - { - PutWindowTilemap(8); - if (!sFactorySwapScreen->inEnemyScreen) - species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL); - else - species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL); - CopyMonCategoryText(SpeciesToNationalPokedexNum(species), text); - x = GetStringRightAlignXOffset(1, text, 0x76); - AddTextPrinterParameterized(8, 1, text, x, 1, 0, NULL); - CopyWindowToVram(8, 2); - } -} + if (gFacilityTrainerMons[monSetId].species == SPECIES_UNOWN) + continue; + if (monLevel == 50 && monSetId > 849) + continue; -static void Swap_InitActions(u8 id) -{ - if (sFactorySwapScreen->fromSummaryScreen != TRUE) - { - switch (id) + for (j = 0; j < 6; j++) { - case ACTIONS_PLAYER_SCREEN: - sFactorySwapScreen->inEnemyScreen = FALSE; - sFactorySwapScreen->cursorPos = 0; - sFactorySwapScreen->actionsCount = ARRAY_COUNT(sSwap_PlayerScreenActions); - sFactorySwapScreen->actionsData = sSwap_PlayerScreenActions; - break; - case ACTIONS_ENEMY_SCREEN: - sFactorySwapScreen->inEnemyScreen = TRUE; - sFactorySwapScreen->cursorPos = 0; - sFactorySwapScreen->actionsCount = ARRAY_COUNT(sSwap_EnemyScreenActions); - sFactorySwapScreen->actionsData = sSwap_EnemyScreenActions; - break; + if (monSetId == gSaveBlock2Ptr->frontier.field_E70[j].monId) + break; } - } -} - -static void Swap_RunMenuOptionFunc(u8 taskId) -{ - sSwap_CurrentTableFunc = sSwap_MenuOptionFuncs[sFactorySwapScreen->menuCursorPos]; - sSwap_CurrentTableFunc(taskId); -} - -static void sub_819F0CC(u8 taskId) -{ - sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE); - sFactorySwapScreen->playerMonId = sFactorySwapScreen->cursorPos; - sub_819EA64(3); - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = sub_819D9EC; -} + if (j != 6) + continue; -static void sub_819F114(u8 taskId) -{ - gTasks[taskId].data[0] = 6; - gTasks[taskId].func = Task_FromSwapScreenToSummaryScreen; -} - -static void sub_819F134(u8 taskId) -{ - sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE); - sub_819EA64(3); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 0x10; - gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons); - gTasks[taskId].data[5] = 1; - gTasks[taskId].func = sub_819D770; -} - -static void Swap_RunActionFunc(u8 taskId) -{ - sSwap_CurrentTableFunc = sFactorySwapScreen->actionsData[sFactorySwapScreen->cursorPos].func; - sSwap_CurrentTableFunc(taskId); -} + for (k = 0; k < i; k++) + { + if (species[k] == gFacilityTrainerMons[monSetId].species) + break; + } + if (k != i) + continue; -static void Swap_ActionCancel(u8 taskId) -{ - gTasks[taskId].data[6] = (u32)(sub_819CC24) >> 0x10; - gTasks[taskId].data[7] = (u32)(sub_819CC24); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[5] = 0; - gTasks[taskId].func = sub_819D588; -} + for (k = 0; k < i; k++) + { + if (heldItems[k] != 0 && heldItems[k] == gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]) + break; + } + if (k != i) + continue; -static void Swap_ActionPkmnForSwap(u8 taskId) -{ - gTasks[taskId].data[6] = (u32)(sub_819D9EC) >> 0x10; - gTasks[taskId].data[7] = (u32)(sub_819D9EC); - gTasks[taskId].data[5] = 0; - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = sub_819D588; -} + species[i] = gFacilityTrainerMons[monSetId].species; + heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]; + CreateMonWithEVSpreadNatureOTID(&gEnemyParty[i], + gFacilityTrainerMons[monSetId].species, + monLevel, + gFacilityTrainerMons[monSetId].nature, + fixedIV, + gFacilityTrainerMons[monSetId].evSpread, + otId); -static void Swap_ActionMon(u8 taskId) -{ - if (!sFactorySwapScreen->inEnemyScreen) - { - gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenMenu) >> 0x10; - gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenMenu); - gTasks[taskId].data[5] = 2; - } - else if (Swap_AlreadyHasSameSpecies(sFactorySwapScreen->cursorPos) == TRUE) - { - sub_819F2B4(&sFactorySwapScreen->unk2C.field1, &sFactorySwapScreen->unk30, TRUE); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[5] = 1; - gTasks[taskId].func = Task_SwapCantHaveSameMons; - return; - } - else - { - gTasks[taskId].data[6] = (u32)(sub_819CCD4) >> 0x10; - gTasks[taskId].data[7] = (u32)(sub_819CCD4); - gTasks[taskId].data[5] = 0; + friendship = 0; + for (k = 0; k < 4; k++) + SetMonMoveAvoidReturn(&gEnemyParty[i], gFacilityTrainerMons[monSetId].moves[k], k); + SetMonData(&gEnemyParty[i], MON_DATA_FRIENDSHIP, &friendship); + SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]); + i++; } - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = sub_819D588; -} - -static void sub_819F2B4(u8 *arg0, bool8 *arg1, bool8 swapScreen) -{ - *arg0 = CreateSprite(&gUnknown_08610894, 120, 64, 1); - gSprites[*arg0].callback = sub_819F600; - gSprites[*arg0].data[7] = swapScreen; - *arg1 = TRUE; } -static void Swap_ShowSummaryMonSprite(void) +static u16 GetMonSetId(u8 lvlMode, u8 challengeNum, bool8 arg2) { - struct Pokemon *mon; - u16 species; - u32 personality, otId; - - sFactorySwapScreen->unk2C.field1 = CreateSprite(&gUnknown_08610894, 120, 64, 1); - StartSpriteAffineAnim(&gSprites[sFactorySwapScreen->unk2C.field1], 2); - - mon = &gPlayerParty[sFactorySwapScreen->cursorPos]; - species = GetMonData(mon, MON_DATA_SPECIES, NULL); - personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); - otId = GetMonData(mon, MON_DATA_OT_ID, NULL); - - sFactorySwapScreen->unk2C.field0 = CreateMonPicSprite_HandleDeoxys(species, personality, otId, TRUE, 88, 32, 15, 0xFFFF); // BUG: otId and personality should be switched. - gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecX = 0; - gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecY = 0; - - gSprites[sFactorySwapScreen->unk2C.field1].invisible = TRUE; -} + u16 range, ret; + u16 adder; -static void sub_819F3F8(struct UnkFactoryStruct arg0, bool8 *arg1, bool8 swapScreen) -{ - u8 taskId; - - FreeAndDestroyMonPicSprite(arg0.field0); - taskId = CreateTask(sub_819F7B4, 1); - gTasks[taskId].data[7] = swapScreen; - gTasks[taskId].data[6] = arg0.field1; - gTasks[taskId].func(taskId); - *arg1 = TRUE; -} - -static void sub_819F444(struct UnkFactoryStruct arg0, bool8 *arg1) -{ - FreeAndDestroyMonPicSprite(arg0.field0); - FreeOamMatrix(gSprites[arg0.field1].oam.matrixNum); - DestroySprite(&gSprites[arg0.field1]); - *arg1 = FALSE; -} - -static void Task_SwapCantHaveSameMons(u8 taskId) -{ - if (sFactorySwapScreen->unk30 == TRUE) - return; + if (lvlMode == FRONTIER_LVL_50) + adder = 0; + else + adder = 8; - switch (gTasks[taskId].data[0]) + if (challengeNum < 7) { - case 0: - Swap_PrintOnInfoWindow(gText_SamePkmnInPartyAlready); - sFactorySwapScreen->monSwapped = FALSE; - gTasks[taskId].data[0]++; - break; - case 1: - if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) + if (arg2) { - PlaySE(SE_SELECT); - sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE); - gTasks[taskId].data[0]++; + range = (sMonsToChooseFrom[adder + challengeNum + 1][1] - sMonsToChooseFrom[adder + challengeNum + 1][0]) + 1; + ret = Random() % range; + ret += sMonsToChooseFrom[adder + challengeNum + 1][0]; } - break; - case 2: - if (sFactorySwapScreen->unk30 != TRUE) + else { - FillWindowPixelBuffer(5, 0); - CopyWindowToVram(5, 2); - gTasks[taskId].data[0]++; + range = (sMonsToChooseFrom[adder + challengeNum][1] - sMonsToChooseFrom[adder + challengeNum][0]) + 1; + ret = Random() % range; + ret += sMonsToChooseFrom[adder + challengeNum][0]; } - break; - case 3: - Swap_PrintOnInfoWindow(gText_SelectPkmnToAccept); - gTasks[taskId].data[0]++; - break; - case 4: - Swap_PrintMonSpecies3(); - sub_819EADC(); - sFactorySwapScreen->unk22 = TRUE; - gTasks[taskId].data[0] = gTasks[taskId].data[5]; - gTasks[taskId].func = Task_HandleSwapScreenChooseMons; - break; } -} - -static bool8 Swap_AlreadyHasSameSpecies(u8 monId) -{ - u8 i; - u16 species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL); - - for (i = 0; i < 3; i++) + else { - if (i != sFactorySwapScreen->playerMonId && (u16)(GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL)) == species) - return TRUE; + u16 num = challengeNum; + if (num != 7) + num = 7; + range = (sMonsToChooseFrom[adder + num][1] - sMonsToChooseFrom[adder + num][0]) + 1; + ret = Random() % range; + ret += sMonsToChooseFrom[adder + num][0]; } - return FALSE; + + return ret; } -static void sub_819F600(struct Sprite *sprite) +u8 sub_81A6F70(u8 battleMode, u8 lvlMode) { - u8 taskId; + u8 ret; + u8 rents = gSaveBlock2Ptr->frontier.factoryRentsCount[battleMode][lvlMode]; - if (sprite->affineAnimEnded) - { - sprite->invisible = TRUE; - taskId = CreateTask(sub_819F69C, 1); - gTasks[taskId].data[7] = sprite->data[7]; - gTasks[taskId].func(taskId); - sprite->callback = SpriteCallbackDummy; - } -} + if (rents < 15) + ret = 0; + else if (rents < 22) + ret = 1; + else if (rents < 29) + ret = 2; + else if (rents < 36) + ret = 3; + else if (rents < 43) + ret = 4; + else + ret = 5; -static void sub_819F654(struct Sprite *sprite) -{ - if (sprite->affineAnimEnded) - { - FreeOamMatrix(sprite->oam.matrixNum); - if (sprite->data[7] == TRUE) - sFactorySwapScreen->unk30 = FALSE; - else - sub_819BE20(FALSE); - DestroySprite(sprite); - } + return ret; } -static void sub_819F69C(u8 taskId) +u32 GetAiScriptsInBattleFactory(void) { - struct Task *task = &gTasks[taskId]; - switch (task->data[0]) + s32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + + if (lvlMode == FRONTIER_LVL_TENT) { - case 0: - task->data[3] = 88; - task->data[24] = 152; // BUG: writing outside the array's bounds. - task->data[5] = 64; - task->data[8] = 65; - SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); - SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24])); - SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8])); - SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ); - SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ); - break; - case 1: - ShowBg(3); - SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ); - SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4)); - break; - case 2: - task->data[5] -= 4; - task->data[8] += 4; - if (task->data[5] <= 32 || task->data[8] >= 96) - { - task->data[5] = 32; - task->data[8] = 96; - } - SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8])); - if (task->data[5] != 32) - return; - break; - default: - DestroyTask(taskId); - // UB: Should not use the task after it has been deleted. - if (gTasks[taskId].data[7] == TRUE) - Swap_ShowMonSprite(); - else - Summary_ShowMonSprite(); - return; + return 0; } - task->data[0]++; -} - -static void sub_819F7B4(u8 taskId) -{ - struct Task *task = &gTasks[taskId]; - switch (task->data[0]) + else { - default: - HideBg(3); - gSprites[task->data[6]].data[7] = task->data[7]; - gSprites[task->data[6]].invisible = FALSE; - gSprites[task->data[6]].callback = sub_819F654; - StartSpriteAffineAnim(&gSprites[task->data[6]], 1); - ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); - DestroyTask(taskId); - break; - case 0: - task->data[3] = 88; - task->data[24] = 152; // BUG: writing outside the array's bounds. - task->data[5] = 32; - task->data[8] = 96; - SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); - SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24])); - SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8])); - SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ); - SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ); - task->data[0]++; - break; - case 1: - task->data[5] += 4; - task->data[8] -= 4; - if (task->data[5] >= 64 || task->data[8] <= 65) - { - task->data[5] = 64; - task->data[8] = 65; - } - SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8])); - if (task->data[5] == 64) - task->data[0]++; - break; + s32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); + s32 challengeNum = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / 7; + + if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) + return AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY; + else if (challengeNum < 2) + return 0; + else if (challengeNum < 4) + return AI_SCRIPT_CHECK_BAD_MOVE; + else + return AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY; } } -static void Swap_ShowMonSprite(void) +void SetMonMoveAvoidReturn(struct Pokemon *mon, u16 moveArg, u8 moveSlot) { - struct Pokemon *mon; - u16 species; - u32 personality, otId; - - if (!sFactorySwapScreen->inEnemyScreen) - mon = &gPlayerParty[sFactorySwapScreen->cursorPos]; - else - mon = &gEnemyParty[sFactorySwapScreen->cursorPos]; - - species = GetMonData(mon, MON_DATA_SPECIES, NULL); - personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); - otId = GetMonData(mon, MON_DATA_OT_ID, NULL); - - sFactorySwapScreen->unk2C.field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 88, 32, 15, 0xFFFF); - gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecX = 0; - gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecY = 0; - - sFactorySwapScreen->unk30 = FALSE; + u16 move = moveArg; + if (moveArg == MOVE_RETURN) + move = MOVE_FRUSTRATION; + SetMonMoveSlot(mon, move, moveSlot); } diff --git a/src/battle_factory_screen.c b/src/battle_factory_screen.c new file mode 100644 index 000000000..255cf5aa1 --- /dev/null +++ b/src/battle_factory_screen.c @@ -0,0 +1,4111 @@ +#include "global.h" +#include "battle_factory_screen.h" +#include "battle_factory.h" +#include "sprite.h" +#include "event_data.h" +#include "overworld.h" +#include "random.h" +#include "battle_tower.h" +#include "text.h" +#include "palette.h" +#include "task.h" +#include "main.h" +#include "malloc.h" +#include "bg.h" +#include "gpu_regs.h" +#include "string_util.h" +#include "international_string_util.h" +#include "window.h" +#include "data2.h" +#include "decompress.h" +#include "pokemon_summary_screen.h" +#include "sound.h" +#include "pokedex.h" +#include "util.h" +#include "trainer_pokemon_sprites.h" +#include "constants/battle_frontier.h" +#include "constants/songs.h" +#include "constants/rgb.h" + +// Select_ refers to the first Pokemon selection screen where you choose 3 Pokemon. +// Swap_ refers to the consecutive selection screen where you can keep your Pokemon or swap one with beaten trainer's. + +#define MENU_SUMMARY 0 +#define MENU_RENT 1 +#define MENU_DESELECT 1 +#define MENU_OTHERS 2 +#define MENU_OPTIONS_COUNT 3 + +#define SELECTABLE_MONS_COUNT 6 + +#define TAG_PAL_BALL_GREY 0x64 +#define TAG_PAL_BALL_SELECTED 0x65 +#define TAG_PAL_66 0x66 +#define TAG_PAL_67 0x67 + +#define TAG_TILE_64 0x64 +#define TAG_TILE_65 0x65 +#define TAG_TILE_66 0x66 +#define TAG_TILE_67 0x67 +#define TAG_TILE_68 0x68 +#define TAG_TILE_69 0x69 +#define TAG_TILE_6A 0x6A +#define TAG_TILE_6B 0x6B +#define TAG_TILE_6C 0x6C +#define TAG_TILE_6D 0x6D + +struct FactorySelecteableMon +{ + u16 monSetId; + u16 spriteId; + u8 selectedId; // 0 - not selected, 1 - first pokemon, 2 - second pokemon, 3 - third pokemon + struct Pokemon monData; +}; + +struct UnkFactoryStruct +{ + u8 field0; + u8 field1; +}; + +struct FactorySelectMonsStruct +{ + u8 menuCursorPos; + u8 menuCursor1SpriteId; + u8 menuCursor2SpriteId; + u8 cursorPos; + u8 cursorSpriteId; + u8 selectingMonsState; + bool8 fromSummaryScreen; + u8 yesNoCursorPos; + u8 unused8; + struct FactorySelecteableMon mons[SELECTABLE_MONS_COUNT]; + struct UnkFactoryStruct unk294[3]; + bool8 unk2A0; + u8 fadeSpeciesNameTaskId; + bool8 unk2A2; + u16 unk2A4; + bool8 unk2A6; + u8 unk2A7; + u8 unk2A8; + u8 unk2A9; +}; + +// 'Action' refers to the 3 Selectable mons, Cancel, Pknm for swap windows. +#define ACTIONS_PLAYER_SCREEN 0 +#define ACTIONS_ENEMY_SCREEN 1 + +struct SwapActionIdAndFunc +{ + u8 id; + void (*func)(u8 taskId); +}; + +struct FactorySwapMonsStruct +{ + u8 menuCursorPos; + u8 menuCursor1SpriteId; + u8 menuCursor2SpriteId; + u8 cursorPos; + u8 cursorSpriteId; + u8 ballSpriteIds[3]; + u8 unk8[2][3]; + u8 unkE[2][2]; + u8 playerMonId; + u8 enemyMonId; + bool8 inEnemyScreen; + bool8 fromSummaryScreen; + u8 yesNoCursorPos; + u8 actionsCount; + const struct SwapActionIdAndFunc *actionsData; + u8 unused1C[4]; + bool8 monSwapped; + u8 fadeSpeciesNameTaskId; + bool8 unk22; + u16 unk24; + bool8 unk26; + u8 unk27; + u8 unk28; + u8 unk29; + struct UnkFactoryStruct unk2C; + bool8 unk30; +}; + +extern u8 (*gUnknown_030062E8)(void); +extern u8 gUnknown_0203CF20; + +extern const u16 gBattleFrontierHeldItems[]; +extern const struct FacilityMon gBattleFrontierMons[]; +extern const struct FacilityMon gSlateportBattleTentMons[]; +extern const struct BattleFrontierTrainer gBattleFrontierTrainers[]; +extern const u32 gUnknown_085B18AC[]; + +// This file's functions. +static void sub_819A44C(struct Sprite *sprite); +static void CB2_InitSelectScreen(void); +static void Select_SetWinRegs(s16 mWin0H, s16 nWin0H, s16 mWin0V, s16 nWin0V); +static void Select_InitMonsData(void); +static void Select_InitAllSprites(void); +static void Select_ShowSummaryMonSprite(void); +static void Select_PrintSelectMonString(void); +static void Select_PrintMonSpecies(void); +static void Select_PrintMonCategory(void); +static void Select_PrintRentalPkmnString(void); +static void Select_CopyMonsToPlayerParty(void); +static void sub_819C4B4(void); +static void Select_ShowYesNoOptions(void); +static void sub_819C568(void); +static void Select_ShowMenuOptions(void); +static void Select_PrintMenuOptions(void); +static void Select_PrintYesNoOptions(void); +static void Task_SelectFadeSpeciesName(u8 taskId); +static void sub_819C1D0(u8 taskId); +static void Task_HandleSelectionScreenChooseMons(u8 taskId); +static void Task_HandleSelectionScreenMenu(u8 taskId); +static void CreateFrontierFactorySelectableMons(u8 firstMonId); +static void CreateTentFactorySelectableMons(u8 firstMonId); +static void Select_SetBallSpritePaletteNum(u8 id); +static void sub_819F444(struct UnkFactoryStruct arg0, bool8 *arg1); +static void sub_819B958(u8 windowId); +static void sub_819F2B4(u8 *arg0, bool8 *arg1, bool8 swapScreen); +static void sub_819F3F8(struct UnkFactoryStruct arg0, bool8 *arg1, bool8 swapScreen); +static u8 Select_RunMenuOptionFunc(void); +static u8 sub_819BC9C(void); +static u8 Select_OptionSummary(void); +static u8 Select_OptionOthers(void); +static u8 Select_OptionRentDeselect(void); +static bool32 Select_AreSpeciesValid(u16 monSetId); +static void Swap_DestroyAllSprites(void); +static void Swap_ShowYesNoOptions(void); +static void sub_819E8EC(void); +static void sub_819EAC0(void); +static void Swap_UpdateYesNoCursorPosition(s8 direction); +static void Swap_UpdateMenuCursorPosition(s8 direction); +static void sub_819EA64(u8 windowId); +static void sub_819D770(u8 taskId); +static void Task_HandleSwapScreenChooseMons(u8 taskId); +static void sub_819D588(u8 taskId); +static void sub_819F7B4(u8 taskId); +static void Swap_PrintOnInfoWindow(const u8 *str); +static void Swap_ShowMenuOptions(void); +static void Swap_PrintMenuOptions(void); +static void Swap_PrintYesNoOptions(void); +static void Swap_PrintMonSpecies(void); +static void Swap_PrintMonSpecies2(void); +static void Swap_PrintMonSpecies3(void); +static void Swap_PrintMonCategory(void); +static void Swap_InitAllSprites(void); +static void Swap_PrintPkmnSwap(void); +static void sub_819EADC(void); +static void sub_819EAF8(void); +static void CB2_InitSwapScreen(void); +static void Swap_ShowSummaryMonSprite(void); +static void Swap_UpdateActionCursorPosition(s8 direction); +static void Swap_UpdateBallCursorPosition(s8 direction); +static void Swap_RunMenuOptionFunc(u8 taskId); +static void sub_819F0CC(u8 taskId); +static void sub_819F114(u8 taskId); +static void sub_819F134(u8 taskId); +static void Swap_RunActionFunc(u8 taskId); +static void sub_819F69C(u8 taskId); +static void Task_SwapCantHaveSameMons(u8 taskId); +static void Swap_ShowMonSprite(void); +static void Swap_PrintActionStrings(void); +static void Swap_PrintActionStrings2(void); +static void Swap_PrintOneActionString(u8 which); +static void Swap_InitActions(u8 id); +static void sub_819E838(u8 arg0); +static bool8 Swap_AlreadyHasSameSpecies(u8 monId); +static void sub_819F600(struct Sprite *sprite); +static void Swap_ActionMon(u8 taskId); +static void Swap_ActionCancel(u8 taskId); +static void Swap_ActionPkmnForSwap(u8 taskId); + +// Ewram variables +static EWRAM_DATA u8 *sSelectMenuTilesetBuffer = NULL; +static EWRAM_DATA u8 *sSelectMonCardBgTilesetBuffer = NULL; +static EWRAM_DATA u8 *sSelectMenuTilemapBuffer = NULL; +static EWRAM_DATA u8 *sSelectMonCardBgTilemapBuffer = NULL; +static EWRAM_DATA struct Pokemon *sFactorySelectMons = NULL; +static EWRAM_DATA u8 *sSwapMenuTilesetBuffer = NULL; +static EWRAM_DATA u8 *sSwapMonCardBgTilesetBuffer = NULL; +static EWRAM_DATA u8 *sSwapMenuTilemapBuffer = NULL; +static EWRAM_DATA u8 *sSwapMonCardBgTilemapBuffer = NULL; + +// IWRAM bss +static IWRAM_DATA struct FactorySelectMonsStruct *sFactorySelectScreen; +static IWRAM_DATA void (*sSwap_CurrentTableFunc)(u8 taskId); +static IWRAM_DATA struct FactorySwapMonsStruct *sFactorySwapScreen; + +// Const rom data. +static const u16 gUnknown_0860F13C[] = INCBIN_U16("graphics/unknown/unknown_60F13C.gbapal"); +static const u16 gUnknown_0860F15C[] = INCBIN_U16("graphics/unknown/unknown_60F15C.gbapal"); +static const u16 gUnknown_0860F17C[] = INCBIN_U16("graphics/unknown/unknown_60F17C.gbapal"); +static const u8 gUnknown_0860F1BC[] = INCBIN_U8("graphics/unknown/unknown_60F1BC.4bpp"); +static const u8 gUnknown_0860F3BC[] = INCBIN_U8("graphics/unknown/unknown_60F3BC.4bpp"); +static const u8 gUnknown_0860F43C[] = INCBIN_U8("graphics/unknown/unknown_60F43C.4bpp"); +static const u8 gUnknown_0860F53C[] = INCBIN_U8("graphics/unknown/unknown_60F53C.4bpp"); +static const u8 gUnknown_0860F63C[] = INCBIN_U8("graphics/unknown/unknown_60F63C.4bpp"); +static const u8 gUnknown_0860F6BC[] = INCBIN_U8("graphics/unknown/unknown_60F6BC.4bpp"); +static const u8 gUnknown_0860F7BC[] = INCBIN_U8("graphics/unknown/unknown_60F7BC.4bpp"); +static const u8 gUnknown_0860F83C[] = INCBIN_U8("graphics/unknown/unknown_60F83C.4bpp"); +static const u8 gUnknown_0860F93C[] = INCBIN_U8("graphics/unknown/unknown_60F93C.4bpp"); +static const u8 gUnknown_0860FA3C[] = INCBIN_U8("graphics/unknown/unknown_60FA3C.4bpp"); +static const u8 gUnknown_0861023C[] = INCBIN_U8("graphics/unknown/unknown_61023C.bin"); +static const u8 gUnknown_0861033C[] = INCBIN_U8("graphics/unknown/unknown_61033C.4bpp"); +static const u16 gUnknown_0861039C[] = INCBIN_U16("graphics/unknown/unknown_61039C.gbapal"); + +static const struct SpriteSheet gUnknown_086103BC[] = +{ + {gUnknown_0860F3BC, sizeof(gUnknown_0860F3BC), TAG_TILE_65}, + {gUnknown_0860F43C, sizeof(gUnknown_0860F43C), TAG_TILE_66}, + {gUnknown_0860F53C, sizeof(gUnknown_0860F53C), TAG_TILE_67}, + {gUnknown_0860FA3C, sizeof(gUnknown_0860FA3C), TAG_TILE_6D}, + {}, +}; + +static const struct CompressedSpriteSheet gUnknown_086103E4[] = +{ + {gUnknown_085B18AC, 0x800, TAG_TILE_64}, + {}, +}; + +static const struct SpritePalette gUnknown_086103F4[] = +{ + {gUnknown_0860F13C, TAG_PAL_BALL_GREY}, + {gUnknown_0860F15C, TAG_PAL_BALL_SELECTED}, + {gUnknown_0860F17C, TAG_PAL_66}, + {gUnknown_0861039C, TAG_PAL_67}, + {}, +}; + +u8 static (* const sSelect_MenuOptionFuncs[])(void) = +{ + [MENU_SUMMARY] = Select_OptionSummary, + [MENU_RENT] /*Or Deselect*/ = Select_OptionRentDeselect, + [MENU_OTHERS] = Select_OptionOthers +}; + +static const struct BgTemplate sSelect_BgTemplates[] = +{ + { + .bg = 0, + .charBaseIndex = 0, + .mapBaseIndex = 24, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0 + }, + { + .bg = 1, + .charBaseIndex = 1, + .mapBaseIndex = 25, + .screenSize = 0, + .paletteMode = 0, + .priority = 3, + .baseTile = 0 + }, + { + .bg = 3, + .charBaseIndex = 2, + .mapBaseIndex = 27, + .screenSize = 0, + .paletteMode = 0, + .priority = 2, + .baseTile = 0 + }, +}; + +static const struct WindowTemplate sSelect_WindowTemplates[] = +{ + { + .bg = 0, + .tilemapLeft = 0, + .tilemapTop = 2, + .width = 12, + .height = 2, + .paletteNum = 15, + .baseBlock = 0x0001, + }, + { + .bg = 0, + .tilemapLeft = 19, + .tilemapTop = 2, + .width = 11, + .height = 2, + .paletteNum = 14, + .baseBlock = 0x0019, + }, + { + .bg = 0, + .tilemapLeft = 0, + .tilemapTop = 15, + .width = 20, + .height = 3, + .paletteNum = 15, + .baseBlock = 0x002f, + }, + { + .bg = 0, + .tilemapLeft = 22, + .tilemapTop = 14, + .width = 8, + .height = 6, + .paletteNum = 15, + .baseBlock = 0x006b, + }, + { + .bg = 0, + .tilemapLeft = 22, + .tilemapTop = 14, + .width = 8, + .height = 4, + .paletteNum = 15, + .baseBlock = 0x009b, + }, + { + .bg = 0, + .tilemapLeft = 15, + .tilemapTop = 0, + .width = 15, + .height = 2, + .paletteNum = 15, + .baseBlock = 0x00bb, + }, + DUMMY_WIN_TEMPLATE, +}; + +static const u16 gUnknown_0861046C[] = INCBIN_U16("graphics/unknown/unknown_61046C.gbapal"); + +static const u8 gUnknown_08610476[] = {0x00, 0x02, 0x00}; +static const u8 gUnknown_08610479[] = {0x00, 0x04, 0x00}; + +static const struct OamData gUnknown_0861047C = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 3, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct OamData gUnknown_08610484 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 3, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct OamData gUnknown_0861048C = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 2, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct OamData gUnknown_08610494 = +{ + .y = 0, + .affineMode = 3, + .objMode = 1, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 1, +}; + +static const union AnimCmd gUnknown_0861049C[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_086104A4[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_086104AC[] = +{ + ANIMCMD_FRAME(0, 30), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_086104B4[] = +{ + ANIMCMD_FRAME(16, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(32, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(16, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(32, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(0, 32), + ANIMCMD_FRAME(16, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(32, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(16, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(32, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_END, +}; + +static const union AnimCmd * const gUnknown_086104FC[] = +{ + gUnknown_0861049C, +}; + +static const union AnimCmd * const gUnknown_08610500[] = +{ + gUnknown_086104A4, +}; + +static const union AnimCmd * const gUnknown_08610504[] = +{ + gUnknown_086104AC, + gUnknown_086104B4, +}; + +static const union AffineAnimCmd gUnknown_0861050C[] = +{ + AFFINEANIMCMD_FRAME(5, 5, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, 0, 1), + AFFINEANIMCMD_FRAME(16, 5, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, 0, 1), + AFFINEANIMCMD_FRAME(32, 5, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, 0, 1), + AFFINEANIMCMD_FRAME(64, 5, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, 0, 1), + AFFINEANIMCMD_FRAME(128, 5, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, 0, 1), + AFFINEANIMCMD_FRAME(256, 5, 0, 0), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd gUnknown_0861056C[] = +{ + AFFINEANIMCMD_FRAME(128, 5, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, 0, 1), + AFFINEANIMCMD_FRAME(64, 5, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, 0, 1), + AFFINEANIMCMD_FRAME(32, 5, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, 0, 1), + AFFINEANIMCMD_FRAME(16, 5, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, 0, 1), + AFFINEANIMCMD_FRAME(5, 5, 0, 0), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd gUnknown_086105BC[] = +{ + AFFINEANIMCMD_FRAME(256, 256, 0, 0), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd * const gUnknown_086105CC[] = +{ + gUnknown_0861050C, + gUnknown_0861056C, + gUnknown_086105BC, +}; + +static const struct SpriteTemplate gUnknown_086105D8 = +{ + .tileTag = TAG_TILE_64, + .paletteTag = TAG_PAL_BALL_GREY, + .oam = &gUnknown_0861047C, + .anims = gUnknown_08610504, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_819A44C +}; + +static const struct SpriteTemplate gUnknown_086105F0 = +{ + .tileTag = TAG_TILE_65, + .paletteTag = TAG_PAL_66, + .oam = &gUnknown_08610484, + .anims = gUnknown_086104FC, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate gUnknown_08610608 = +{ + .tileTag = TAG_TILE_66, + .paletteTag = TAG_PAL_66, + .oam = &gUnknown_0861048C, + .anims = gUnknown_086104FC, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate gUnknown_08610620 = +{ + .tileTag = TAG_TILE_67, + .paletteTag = TAG_PAL_66, + .oam = &gUnknown_0861048C, + .anims = gUnknown_086104FC, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate gUnknown_08610638 = +{ + .tileTag = TAG_TILE_6D, + .paletteTag = TAG_PAL_67, + .oam = &gUnknown_08610494, + .anims = gUnknown_08610500, + .images = NULL, + .affineAnims = gUnknown_086105CC, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteSheet gUnknown_08610650[] = +{ + {gUnknown_0860F3BC, sizeof(gUnknown_0860F3BC), TAG_TILE_65}, + {gUnknown_0860F43C, sizeof(gUnknown_0860F43C), TAG_TILE_66}, + {gUnknown_0860F53C, sizeof(gUnknown_0860F53C), TAG_TILE_67}, + {gUnknown_0860F63C, sizeof(gUnknown_0860F63C), TAG_TILE_68}, + {gUnknown_0860F6BC, sizeof(gUnknown_0860F6BC), TAG_TILE_69}, + {gUnknown_0860F7BC, 0x100, TAG_TILE_6A}, + {gUnknown_0860F83C, sizeof(gUnknown_0860F83C), TAG_TILE_6B}, + {gUnknown_0860F93C, sizeof(gUnknown_0860F93C), TAG_TILE_6C}, + {gUnknown_0860FA3C, sizeof(gUnknown_0860FA3C), TAG_TILE_6D}, + {}, +}; + +static const struct CompressedSpriteSheet gUnknown_086106A0[] = +{ + {gUnknown_085B18AC, 0x800, TAG_TILE_64}, + {}, +}; + +static const struct SpritePalette gUnknown_086106B0[] = +{ + {gUnknown_0860F13C, TAG_PAL_BALL_GREY}, + {gUnknown_0860F15C, TAG_PAL_BALL_SELECTED}, + {gUnknown_0860F17C, TAG_PAL_66}, + {gUnknown_0861039C, TAG_PAL_67}, + {}, +}; + +static const struct OamData gUnknown_086106D8 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 3, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct OamData gUnknown_086106E0 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 3, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct OamData gUnknown_086106E8 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 2, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct OamData gUnknown_086106F0 = +{ + .y = 0, + .affineMode = 3, + .objMode = 1, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 1, +}; + +static const union AnimCmd gUnknown_086106F8[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_08610700[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_08610708[] = +{ + ANIMCMD_FRAME(0, 30), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_08610710[] = +{ + ANIMCMD_FRAME(16, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(32, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(16, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(32, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(0, 32), + ANIMCMD_FRAME(16, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(32, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(16, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(32, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_END, +}; + +static const union AnimCmd * const gUnknown_08610758[] = +{ + gUnknown_086106F8, +}; + +static const union AnimCmd * const gUnknown_0861075C[] = +{ + gUnknown_08610700, +}; + +static const union AnimCmd * const gUnknown_08610760[] = +{ + gUnknown_08610708, + gUnknown_08610710, +}; + +static const union AffineAnimCmd gUnknown_08610768[] = +{ + AFFINEANIMCMD_FRAME(5, 5, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, 0, 1), + AFFINEANIMCMD_FRAME(16, 5, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, 0, 1), + AFFINEANIMCMD_FRAME(32, 5, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, 0, 1), + AFFINEANIMCMD_FRAME(64, 5, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, 0, 1), + AFFINEANIMCMD_FRAME(128, 5, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, 0, 1), + AFFINEANIMCMD_FRAME(256, 5, 0, 0), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd gUnknown_086107C8[] = +{ + AFFINEANIMCMD_FRAME(128, 5, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, 0, 1), + AFFINEANIMCMD_FRAME(64, 5, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, 0, 1), + AFFINEANIMCMD_FRAME(32, 5, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, 0, 1), + AFFINEANIMCMD_FRAME(16, 5, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, 0, 1), + AFFINEANIMCMD_FRAME(5, 5, 0, 0), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd gUnknown_08610818[] = +{ + AFFINEANIMCMD_FRAME(256, 256, 0, 0), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd * const gUnknown_08610828[] = +{ + gUnknown_08610768, + gUnknown_086107C8, + gUnknown_08610818, +}; + +static const struct SpriteTemplate gUnknown_08610834 = +{ + .tileTag = TAG_TILE_64, + .paletteTag = TAG_PAL_BALL_GREY, + .oam = &gUnknown_086106D8, + .anims = gUnknown_08610760, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_819A44C +}; + +static const struct SpriteTemplate gUnknown_0861084C = +{ + .tileTag = TAG_TILE_65, + .paletteTag = TAG_PAL_66, + .oam = &gUnknown_086106E0, + .anims = gUnknown_08610758, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate gUnknown_08610864 = +{ + .tileTag = TAG_TILE_66, + .paletteTag = TAG_PAL_66, + .oam = &gUnknown_086106E8, + .anims = gUnknown_08610758, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate gUnknown_0861087C = +{ + .tileTag = TAG_TILE_67, + .paletteTag = TAG_PAL_66, + .oam = &gUnknown_086106E8, + .anims = gUnknown_08610758, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate gUnknown_08610894 = +{ + .tileTag = TAG_TILE_6D, + .paletteTag = TAG_PAL_67, + .oam = &gUnknown_086106F0, + .anims = gUnknown_0861075C, + .images = NULL, + .affineAnims = gUnknown_08610828, + .callback = SpriteCallbackDummy +}; + +void static (* const sSwap_MenuOptionFuncs[])(u8 taskId) = +{ + sub_819F114, + sub_819F0CC, + sub_819F134, +}; + +static const struct BgTemplate sSwap_BgTemplates[4] = +{ + { + .bg = 0, + .charBaseIndex = 0, + .mapBaseIndex = 24, + .screenSize = 0, + .paletteMode = 0, + .priority = 1, + .baseTile = 0 + }, + { + .bg = 1, + .charBaseIndex = 1, + .mapBaseIndex = 25, + .screenSize = 0, + .paletteMode = 0, + .priority = 3, + .baseTile = 0 + }, + { + .bg = 2, + .charBaseIndex = 2, + .mapBaseIndex = 26, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0 + }, + { + .bg = 3, + .charBaseIndex = 2, + .mapBaseIndex = 27, + .screenSize = 0, + .paletteMode = 0, + .priority = 2, + .baseTile = 0 + }, +}; + +static const struct WindowTemplate sSwap_WindowTemplates[] = +{ + { + .bg = 0, + .tilemapLeft = 0, + .tilemapTop = 2, + .width = 12, + .height = 2, + .paletteNum = 15, + .baseBlock = 0x0001, + }, + { + .bg = 2, + .tilemapLeft = 19, + .tilemapTop = 2, + .width = 11, + .height = 2, + .paletteNum = 14, + .baseBlock = 0x0019, + }, + { + .bg = 0, + .tilemapLeft = 0, + .tilemapTop = 15, + .width = 20, + .height = 3, + .paletteNum = 15, + .baseBlock = 0x002f, + }, + { + .bg = 0, + .tilemapLeft = 21, + .tilemapTop = 14, + .width = 9, + .height = 6, + .paletteNum = 15, + .baseBlock = 0x006b, + }, + { + .bg = 0, + .tilemapLeft = 22, + .tilemapTop = 14, + .width = 8, + .height = 4, + .paletteNum = 15, + .baseBlock = 0x00a1, + }, + { + .bg = 2, + .tilemapLeft = 21, + .tilemapTop = 15, + .width = 9, + .height = 5, + .paletteNum = 14, + .baseBlock = 0x006b, + }, + { + .bg = 2, + .tilemapLeft = 10, + .tilemapTop = 2, + .width = 4, + .height = 2, + .paletteNum = 14, + .baseBlock = 0x00c1, + }, + { + .bg = 0, + .tilemapLeft = 19, + .tilemapTop = 2, + .width = 11, + .height = 2, + .paletteNum = 15, + .baseBlock = 0x00c9, + }, + { + .bg = 0, + .tilemapLeft = 15, + .tilemapTop = 0, + .width = 15, + .height = 2, + .paletteNum = 15, + .baseBlock = 0x00df, + }, + DUMMY_WIN_TEMPLATE, +}; + +static const u16 gUnknown_08610918[] = {RGB_BLACK, RGB_BLACK, RGB_WHITE, RGB_BLACK, RGB_RED}; // Palette. +static const u8 gUnknown_08610922[] = {0x0, 0x02, 0x0}; +static const u8 gUnknown_08610925[] = {0x0, 0x04, 0x0}; + +static const struct SwapActionIdAndFunc sSwap_PlayerScreenActions[] = +{ + {1, Swap_ActionMon}, + {1, Swap_ActionMon}, + {1, Swap_ActionMon}, + {3, Swap_ActionCancel}, +}; + +static const struct SwapActionIdAndFunc sSwap_EnemyScreenActions[] = +{ + {1, Swap_ActionMon}, + {1, Swap_ActionMon}, + {1, Swap_ActionMon}, + {2, Swap_ActionPkmnForSwap}, + {3, Swap_ActionCancel}, +}; + +// gfx +extern const u8 gFrontierFactorySelectMenu_Gfx[]; +extern const u8 gFrontierFactorySelectMenu_Tilemap[]; +extern const u16 gFrontierFactorySelectMenu_Pal[]; + +// text +extern const u8 gText_RentalPkmn2[]; +extern const u8 gText_SelectFirstPkmn[]; +extern const u8 gText_SelectSecondPkmn[]; +extern const u8 gText_SelectThirdPkmn[]; +extern const u8 gText_TheseThreePkmnOkay[]; +extern const u8 gText_CantSelectSamePkmn[]; +extern const u8 gText_Summary[]; +extern const u8 gText_Rechoose[]; +extern const u8 gText_Deselect[]; +extern const u8 gText_Rent[]; +extern const u8 gText_Others2[]; +extern const u8 gText_Yes2[]; +extern const u8 gText_Yes3[]; +extern const u8 gText_No2[]; +extern const u8 gText_No3[]; +extern const u8 gText_QuitSwapping[]; +extern const u8 gText_AcceptThisPkmn[]; +extern const u8 gText_SelectPkmnToAccept[]; +extern const u8 gText_SelectPkmnToSwap[]; +extern const u8 gText_PkmnSwap[]; +extern const u8 gText_Swap[]; +extern const u8 gText_Summary2[]; +extern const u8 gText_PkmnForSwap[]; +extern const u8 gText_SamePkmnInPartyAlready[]; +extern const u8 gText_Cancel3[]; + +// code +static void sub_819A44C(struct Sprite *sprite) +{ + if (sprite->oam.paletteNum == IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED)) + { + if (sprite->animEnded) + { + if (sprite->data[0] != 0) + { + sprite->data[0]--; + } + else if (Random() % 5 == 0) + { + StartSpriteAnim(sprite, 0); + sprite->data[0] = 32; + } + else + { + StartSpriteAnim(sprite, 1); + } + } + else + { + StartSpriteAnimIfDifferent(sprite, 1); + } + } + else + { + StartSpriteAnimIfDifferent(sprite, 0); + } +} + +static void Select_CB2(void) +{ + AnimateSprites(); + BuildOamBuffer(); + RunTextPrinters(); + UpdatePaletteFade(); + RunTasks(); +} + +static void Select_VblankCb(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void DoBattleFactorySelectScreen(void) +{ + sFactorySelectScreen = NULL; + SetMainCallback2(CB2_InitSelectScreen); +} + +static void CB2_InitSelectScreen(void) +{ + u8 taskId; + + switch (gMain.state) + { + case 0: + if (sFactorySelectMons != NULL) + FREE_AND_SET_NULL(sFactorySelectMons); + SetHBlankCallback(NULL); + SetVBlankCallback(NULL); + CpuFill32(0, (void *)VRAM, VRAM_SIZE); + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, sSelect_BgTemplates, ARRAY_COUNT(sSelect_BgTemplates)); + InitWindows(sSelect_WindowTemplates); + DeactivateAllTextPrinters(); + gMain.state++; + break; + case 1: + sSelectMenuTilesetBuffer = Alloc(0x440); + sSelectMonCardBgTilesetBuffer = AllocZeroed(0x440); + sSelectMenuTilemapBuffer = Alloc(0x800); + sSelectMonCardBgTilemapBuffer = AllocZeroed(0x800); + ChangeBgX(0, 0, 0); + ChangeBgY(0, 0, 0); + ChangeBgX(1, 0, 0); + ChangeBgY(1, 0, 0); + ChangeBgX(3, 0, 0); + ChangeBgY(3, 0, 0); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + SetGpuReg(REG_OFFSET_MOSAIC, 0); + SetGpuReg(REG_OFFSET_WIN0H, 0); + SetGpuReg(REG_OFFSET_WIN0V, 0); + SetGpuReg(REG_OFFSET_WIN1H, 0); + SetGpuReg(REG_OFFSET_WIN1V, 0); + SetGpuReg(REG_OFFSET_WININ, 0); + SetGpuReg(REG_OFFSET_WINOUT, 0); + gMain.state++; + break; + case 2: + ResetPaletteFade(); + ResetSpriteData(); + ResetTasks(); + FreeAllSpritePalettes(); + CpuCopy16(gFrontierFactorySelectMenu_Gfx, sSelectMenuTilesetBuffer, 0x440); + CpuCopy16(gUnknown_0861033C, sSelectMonCardBgTilesetBuffer, 0x60); + LoadBgTiles(1, sSelectMenuTilesetBuffer, 0x440, 0); + LoadBgTiles(3, sSelectMonCardBgTilesetBuffer, 0x60, 0); + CpuCopy16(gFrontierFactorySelectMenu_Tilemap, sSelectMenuTilemapBuffer, 0x800); + LoadBgTilemap(1, sSelectMenuTilemapBuffer, 0x800, 0); + LoadPalette(gFrontierFactorySelectMenu_Pal, 0, 0x40); + LoadPalette(gUnknown_0861046C, 0xF0, 8); + LoadPalette(gUnknown_0861046C, 0xE0, 10); + if (sFactorySelectScreen->fromSummaryScreen == TRUE) + gPlttBufferUnfaded[228] = sFactorySelectScreen->unk2A4; + LoadPalette(gUnknown_0861039C, 0x20, 4); + gMain.state++; + break; + case 3: + SetBgTilemapBuffer(3, sSelectMonCardBgTilemapBuffer); + CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 11, 4, 8, 8); + CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 2, 4, 8, 8); + CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 20, 4, 8, 8); + CopyBgTilemapBufferToVram(3); + gMain.state++; + break; + case 4: + LoadSpritePalettes(gUnknown_086103F4); + LoadSpriteSheets(gUnknown_086103BC); + LoadCompressedObjectPic(gUnknown_086103E4); + ShowBg(0); + ShowBg(1); + SetVBlankCallback(Select_VblankCb); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_1D_MAP); + if (sFactorySelectScreen->fromSummaryScreen == TRUE) + { + Select_SetWinRegs(88, 152, 32, 96); + ShowBg(3); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4)); + } + else + { + HideBg(3); + } + gMain.state++; + break; + case 5: + if (sFactorySelectScreen->fromSummaryScreen == TRUE) + sFactorySelectScreen->cursorPos = gUnknown_0203CF20; + Select_InitMonsData(); + Select_InitAllSprites(); + if (sFactorySelectScreen->fromSummaryScreen == TRUE) + Select_ShowSummaryMonSprite(); + gMain.state++; + break; + case 6: + Select_PrintSelectMonString(); + PutWindowTilemap(2); + gMain.state++; + break; + case 7: + Select_PrintMonCategory(); + PutWindowTilemap(5); + gMain.state++; + break; + case 8: + Select_PrintMonSpecies(); + PutWindowTilemap(1); + gMain.state++; + break; + case 9: + Select_PrintRentalPkmnString(); + PutWindowTilemap(0); + gMain.state++; + break; + case 10: + sFactorySelectScreen->fadeSpeciesNameTaskId = CreateTask(Task_SelectFadeSpeciesName, 0); + if (!sFactorySelectScreen->fromSummaryScreen) + { + gTasks[sFactorySelectScreen->fadeSpeciesNameTaskId].data[0] = 0; + taskId = CreateTask(Task_HandleSelectionScreenChooseMons, 0); + gTasks[taskId].data[0] = 0; + } + else + { + gTasks[sFactorySelectScreen->fadeSpeciesNameTaskId].data[0] = 1; + sFactorySelectScreen->unk2A2 = FALSE; + taskId = CreateTask(Task_HandleSelectionScreenMenu, 0); + gTasks[taskId].data[0] = 13; + } + SetMainCallback2(Select_CB2); + break; + } +} + +static void Select_InitMonsData(void) +{ + u8 i; + + if (sFactorySelectScreen != NULL) + return; + + sFactorySelectScreen = AllocZeroed(sizeof(*sFactorySelectScreen)); + sFactorySelectScreen->cursorPos = 0; + sFactorySelectScreen->selectingMonsState = 1; + sFactorySelectScreen->fromSummaryScreen = FALSE; + for (i = 0; i < SELECTABLE_MONS_COUNT; i++) + sFactorySelectScreen->mons[i].selectedId = 0; + + if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_TENT) + CreateFrontierFactorySelectableMons(0); + else + CreateTentFactorySelectableMons(0); +} + +static void Select_InitAllSprites(void) +{ + u8 i, cursorPos; + s16 x; + + for (i = 0; i < SELECTABLE_MONS_COUNT; i++) + { + sFactorySelectScreen->mons[i].spriteId = CreateSprite(&gUnknown_086105D8, (35 * i) + 32, 64, 1); + gSprites[sFactorySelectScreen->mons[i].spriteId].data[0] = 0; + Select_SetBallSpritePaletteNum(i); + } + cursorPos = sFactorySelectScreen->cursorPos; + x = gSprites[sFactorySelectScreen->mons[cursorPos].spriteId].pos1.x; + sFactorySelectScreen->cursorSpriteId = CreateSprite(&gUnknown_086105F0, x, 88, 0); + sFactorySelectScreen->menuCursor1SpriteId = CreateSprite(&gUnknown_08610608, 176, 112, 0); + sFactorySelectScreen->menuCursor2SpriteId = CreateSprite(&gUnknown_08610620, 176, 144, 0); + + gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = TRUE; + gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = TRUE; + + gSprites[sFactorySelectScreen->menuCursor1SpriteId].centerToCornerVecX = 0; + gSprites[sFactorySelectScreen->menuCursor1SpriteId].centerToCornerVecY = 0; + gSprites[sFactorySelectScreen->menuCursor2SpriteId].centerToCornerVecX = 0; + gSprites[sFactorySelectScreen->menuCursor2SpriteId].centerToCornerVecY = 0; +} + +static void Select_DestroyAllSprites(void) +{ + u8 i; + + for (i = 0; i < SELECTABLE_MONS_COUNT; i++) + DestroySprite(&gSprites[sFactorySelectScreen->mons[i].spriteId]); + + DestroySprite(&gSprites[sFactorySelectScreen->cursorSpriteId]); + DestroySprite(&gSprites[sFactorySelectScreen->menuCursor1SpriteId]); + DestroySprite(&gSprites[sFactorySelectScreen->menuCursor2SpriteId]); +} + +static void Select_UpdateBallCursorPosition(s8 direction) +{ + u8 cursorPos; + if (direction > 0) // Move cursor right. + { + if (sFactorySelectScreen->cursorPos != SELECTABLE_MONS_COUNT - 1) + sFactorySelectScreen->cursorPos++; + else + sFactorySelectScreen->cursorPos = 0; + } + else // Move cursor left. + { + if (sFactorySelectScreen->cursorPos != 0) + sFactorySelectScreen->cursorPos--; + else + sFactorySelectScreen->cursorPos = SELECTABLE_MONS_COUNT - 1; + } + + cursorPos = sFactorySelectScreen->cursorPos; + gSprites[sFactorySelectScreen->cursorSpriteId].pos1.x = gSprites[sFactorySelectScreen->mons[cursorPos].spriteId].pos1.x; +} + +static void Select_UpdateMenuCursorPosition(s8 direction) +{ + if (direction > 0) // Move cursor down. + { + if (sFactorySelectScreen->menuCursorPos != MENU_OPTIONS_COUNT - 1) + sFactorySelectScreen->menuCursorPos++; + else + sFactorySelectScreen->menuCursorPos = 0; + } + else // Move cursor up. + { + if (sFactorySelectScreen->menuCursorPos != 0) + sFactorySelectScreen->menuCursorPos--; + else + sFactorySelectScreen->menuCursorPos = MENU_OPTIONS_COUNT - 1; + } + + gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.y = (sFactorySelectScreen->menuCursorPos * 16) + 112; + gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.y = (sFactorySelectScreen->menuCursorPos * 16) + 112; +} + +static void Select_UpdateYesNoCursorPosition(s8 direction) +{ + if (direction > 0) // Move cursor down. + { + if (sFactorySelectScreen->yesNoCursorPos != 1) + sFactorySelectScreen->yesNoCursorPos++; + else + sFactorySelectScreen->yesNoCursorPos = 0; + } + else // Move cursor up. + { + if (sFactorySelectScreen->yesNoCursorPos != 0) + sFactorySelectScreen->yesNoCursorPos--; + else + sFactorySelectScreen->yesNoCursorPos = 1; + } + + gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.y = (sFactorySelectScreen->yesNoCursorPos * 16) + 112; + gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.y = (sFactorySelectScreen->yesNoCursorPos * 16) + 112; +} + +static void Select_HandleMonSelectionChange(void) +{ + u8 i, paletteNum; + u8 cursorPos = sFactorySelectScreen->cursorPos; + if (sFactorySelectScreen->mons[cursorPos].selectedId) // Deselect a mon. + { + paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_GREY); + if (sFactorySelectScreen->selectingMonsState == 3 && sFactorySelectScreen->mons[cursorPos].selectedId == 1) + { + for (i = 0; i < SELECTABLE_MONS_COUNT; i++) + { + if (sFactorySelectScreen->mons[i].selectedId == 2) + break; + } + if (i == SELECTABLE_MONS_COUNT) + return; + else + sFactorySelectScreen->mons[i].selectedId = 1; + } + sFactorySelectScreen->mons[cursorPos].selectedId = 0; + sFactorySelectScreen->selectingMonsState--; + } + else // Select a mon. + { + paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED); + sFactorySelectScreen->mons[cursorPos].selectedId = sFactorySelectScreen->selectingMonsState; + sFactorySelectScreen->selectingMonsState++; + } + + gSprites[sFactorySelectScreen->mons[cursorPos].spriteId].oam.paletteNum = paletteNum; +} + +static void Select_SetBallSpritePaletteNum(u8 id) +{ + u8 palNum; + + if (sFactorySelectScreen->mons[id].selectedId) + palNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED); + else + palNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_GREY); + + gSprites[sFactorySelectScreen->mons[id].spriteId].oam.paletteNum = palNum; +} + +static void Task_FromSelectScreenToSummaryScreen(u8 taskId) +{ + u8 i; + u8 currMonId; + + switch (gTasks[taskId].data[0]) + { + case 6: + gPlttBufferUnfaded[228] = gPlttBufferFaded[228]; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); + gTasks[taskId].data[0] = 7; + break; + case 7: + if (!gPaletteFade.active) + { + DestroyTask(sFactorySelectScreen->fadeSpeciesNameTaskId); + sub_819F444(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0); + Select_DestroyAllSprites(); + FREE_AND_SET_NULL(sSelectMenuTilesetBuffer); + FREE_AND_SET_NULL(sSelectMonCardBgTilesetBuffer); + FREE_AND_SET_NULL(sSelectMenuTilemapBuffer); + FREE_AND_SET_NULL(sSelectMonCardBgTilemapBuffer); + FreeAllWindowBuffers(); + gTasks[taskId].data[0] = 8; + } + break; + case 8: + sFactorySelectScreen->unk2A4 = gPlttBufferUnfaded[228]; + DestroyTask(taskId); + sFactorySelectScreen->fromSummaryScreen = TRUE; + currMonId = sFactorySelectScreen->cursorPos; + sFactorySelectMons = AllocZeroed(sizeof(struct Pokemon) * SELECTABLE_MONS_COUNT); + for (i = 0; i < SELECTABLE_MONS_COUNT; i++) + sFactorySelectMons[i] = sFactorySelectScreen->mons[i].monData; + ShowPokemonSummaryScreen(1, sFactorySelectMons, currMonId, SELECTABLE_MONS_COUNT - 1, CB2_InitSelectScreen); + break; + } +} + +static void Task_CloseSelectionScreen(u8 taskId) +{ + if (sFactorySelectScreen->unk2A0 != TRUE) + { + switch (gTasks[taskId].data[0]) + { + case 0: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); + gTasks[taskId].data[0]++; + break; + case 1: + if (!UpdatePaletteFade()) + { + Select_CopyMonsToPlayerParty(); + DestroyTask(sFactorySelectScreen->fadeSpeciesNameTaskId); + Select_DestroyAllSprites(); + FREE_AND_SET_NULL(sSelectMenuTilesetBuffer); + FREE_AND_SET_NULL(sSelectMenuTilemapBuffer); + FREE_AND_SET_NULL(sSelectMonCardBgTilemapBuffer); + FREE_AND_SET_NULL(sFactorySelectScreen); + FreeAllWindowBuffers(); + SetMainCallback2(CB2_ReturnToFieldContinueScript); + DestroyTask(taskId); + } + break; + } + } +} + +static void Task_HandleSelectionScreenYesNo(u8 taskId) +{ + if (sFactorySelectScreen->unk2A0 != TRUE) + { + switch (gTasks[taskId].data[0]) + { + case 10: + sub_819C4B4(); + gTasks[taskId].data[0] = 4; + break; + case 4: + Select_ShowYesNoOptions(); + gTasks[taskId].data[0] = 5; + break; + case 5: + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (sFactorySelectScreen->yesNoCursorPos == 0) + { + sub_819C568(); + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = Task_CloseSelectionScreen; + } + else + { + sub_819B958(4); + sub_819BC9C(); + sFactorySelectScreen->unk2A2 = TRUE; + gTasks[taskId].data[0] = 1; + gTasks[taskId].func = Task_HandleSelectionScreenChooseMons; + } + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_819B958(4); + sub_819BC9C(); + sFactorySelectScreen->unk2A2 = TRUE; + gTasks[taskId].data[0] = 1; + gTasks[taskId].func = Task_HandleSelectionScreenChooseMons; + } + else if (gMain.newAndRepeatedKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + Select_UpdateYesNoCursorPosition(-1); + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + Select_UpdateYesNoCursorPosition(1); + } + break; + } + } +} + +static void Task_HandleSelectionScreenMenu(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 2: + if (!sFactorySelectScreen->fromSummaryScreen) + sub_819F2B4(&sFactorySelectScreen->unk294[1].field1, &sFactorySelectScreen->unk2A0, FALSE); + gTasks[taskId].data[0] = 9; + break; + case 9: + if (sFactorySelectScreen->unk2A0 != TRUE) + { + Select_ShowMenuOptions(); + sFactorySelectScreen->fromSummaryScreen = FALSE; + gTasks[taskId].data[0] = 3; + } + break; + case 3: + if (gMain.newKeys & A_BUTTON) + { + u8 retVal; + PlaySE(SE_SELECT); + retVal = Select_RunMenuOptionFunc(); + if (retVal == 1) + { + sFactorySelectScreen->unk2A2 = TRUE; + gTasks[taskId].data[0] = 1; + gTasks[taskId].func = Task_HandleSelectionScreenChooseMons; + } + else if (retVal == 2) + { + gTasks[taskId].data[0] = 10; + gTasks[taskId].func = Task_HandleSelectionScreenYesNo; + } + else if (retVal == 3) + { + gTasks[taskId].data[0] = 11; + gTasks[taskId].func = Task_HandleSelectionScreenChooseMons; + } + else + { + gTasks[taskId].data[0] = 6; + gTasks[taskId].func = Task_FromSelectScreenToSummaryScreen; + } + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE); + sub_819B958(3); + sFactorySelectScreen->unk2A2 = TRUE; + gTasks[taskId].data[0] = 1; + gTasks[taskId].func = Task_HandleSelectionScreenChooseMons; + } + else if (gMain.newAndRepeatedKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + Select_UpdateMenuCursorPosition(-1); + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + Select_UpdateMenuCursorPosition(1); + } + break; + case 12: + if (!gPaletteFade.active) + { + if (sFactorySelectScreen->fromSummaryScreen == TRUE) + { + gPlttBufferFaded[228] = sFactorySelectScreen->unk2A4; + gPlttBufferUnfaded[228] = gPlttBufferUnfaded[244]; + } + sFactorySelectScreen->fromSummaryScreen = FALSE; + gTasks[taskId].data[0] = 3; + } + break; + case 13: + Select_ShowMenuOptions(); + gTasks[taskId].data[0] = 12; + break; + } +} + +static void Task_HandleSelectionScreenChooseMons(u8 taskId) +{ + if (sFactorySelectScreen->unk2A0 != TRUE) + { + switch (gTasks[taskId].data[0]) + { + case 0: + if (!gPaletteFade.active) + { + gTasks[taskId].data[0] = 1; + sFactorySelectScreen->unk2A2 = TRUE; + } + break; + case 1: + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + sFactorySelectScreen->unk2A2 = FALSE; + gTasks[taskId].data[0] = 2; + gTasks[taskId].func = Task_HandleSelectionScreenMenu; + } + else if (gMain.newAndRepeatedKeys & DPAD_LEFT) + { + PlaySE(SE_SELECT); + Select_UpdateBallCursorPosition(-1); + Select_PrintMonCategory(); + Select_PrintMonSpecies(); + } + else if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + { + PlaySE(SE_SELECT); + Select_UpdateBallCursorPosition(1); + Select_PrintMonCategory(); + Select_PrintMonSpecies(); + } + break; + case 11: + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE); + Select_PrintSelectMonString(); + sFactorySelectScreen->unk2A2 = TRUE; + gTasks[taskId].data[0] = 1; + } + break; + } + } +} + +static void CreateFrontierFactorySelectableMons(u8 firstMonId) +{ + u8 i, j = 0; + u8 ivs = 0; + u8 level = 0; + u8 happiness = 0; + u32 otId = 0; + u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); + u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + u8 challengeNum = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / 7; + u8 var_28 = 0; + + gFacilityTrainerMons = gBattleFrontierMons; + if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_50) + level = 100; + else + level = 50; + + var_28 = sub_81A6F70(battleMode, lvlMode); + otId = T1_READ_32(gSaveBlock2Ptr->playerTrainerId); + + for (i = 0; i < SELECTABLE_MONS_COUNT; i++) + { + u16 monSetId = gSaveBlock2Ptr->frontier.field_E70[i].monId; + sFactorySelectScreen->mons[i + firstMonId].monSetId = monSetId; + if (i < var_28) + ivs = GetFactoryMonFixedIV(challengeNum + 1, 0); + else + ivs = GetFactoryMonFixedIV(challengeNum, 0); + CreateMonWithEVSpreadNatureOTID(&sFactorySelectScreen->mons[i + firstMonId].monData, + gFacilityTrainerMons[monSetId].species, + level, + gFacilityTrainerMons[monSetId].nature, + ivs, + gFacilityTrainerMons[monSetId].evSpread, + otId); + happiness = 0; + for (j = 0; j < 4; j++) + SetMonMoveAvoidReturn(&sFactorySelectScreen->mons[i + firstMonId].monData, gFacilityTrainerMons[monSetId].moves[j], j); + SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_FRIENDSHIP, &happiness); + SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]); + } +} + +static void CreateTentFactorySelectableMons(u8 firstMonId) +{ + u8 i, j; + u8 ivs = 0; + u8 level = 30; + u8 happiness = 0; + u32 otId = 0; + + gFacilityTrainerMons = gSlateportBattleTentMons; + otId = T1_READ_32(gSaveBlock2Ptr->playerTrainerId); + + for (i = 0; i < SELECTABLE_MONS_COUNT; i++) + { + u16 monSetId = gSaveBlock2Ptr->frontier.field_E70[i].monId; + sFactorySelectScreen->mons[i + firstMonId].monSetId = monSetId; + CreateMonWithEVSpreadNatureOTID(&sFactorySelectScreen->mons[i + firstMonId].monData, + gFacilityTrainerMons[monSetId].species, + level, + gFacilityTrainerMons[monSetId].nature, + ivs, + gFacilityTrainerMons[monSetId].evSpread, + otId); + happiness = 0; + for (j = 0; j < 4; j++) + SetMonMoveAvoidReturn(&sFactorySelectScreen->mons[i + firstMonId].monData, gFacilityTrainerMons[monSetId].moves[j], j); + SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_FRIENDSHIP, &happiness); + SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]); + } +} + +static void Select_CopyMonsToPlayerParty(void) +{ + u8 i, j; + + for (i = 0; i < 3; i++) + { + for (j = 0; j < SELECTABLE_MONS_COUNT; j++) + { + if (sFactorySelectScreen->mons[j].selectedId == i + 1) + { + gPlayerParty[i] = sFactorySelectScreen->mons[j].monData; + gSaveBlock2Ptr->frontier.field_E70[i].monId = sFactorySelectScreen->mons[j].monSetId; + gSaveBlock2Ptr->frontier.field_E70[i].personality = GetMonData(&gPlayerParty[i].box, MON_DATA_PERSONALITY, NULL); + gSaveBlock2Ptr->frontier.field_E70[i].abilityBit = GetBoxMonData(&gPlayerParty[i].box, MON_DATA_ALT_ABILITY, NULL); + gSaveBlock2Ptr->frontier.field_E70[i].ivs = GetBoxMonData(&gPlayerParty[i].box, MON_DATA_ATK_IV, NULL); + break; + } + } + } + CalculatePlayerPartyCount(); +} + +static void Select_ShowMenuOptions(void) +{ + if (!sFactorySelectScreen->fromSummaryScreen) + sFactorySelectScreen->menuCursorPos = 0; + + gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.x = 176; + gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.y = (sFactorySelectScreen->menuCursorPos * 16) + 112; + gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.x = 208; + gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.y = (sFactorySelectScreen->menuCursorPos * 16) + 112; + + gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = FALSE; + gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = FALSE; + + Select_PrintMenuOptions(); +} + +static void Select_ShowYesNoOptions(void) +{ + sFactorySelectScreen->yesNoCursorPos = 0; + + gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.x = 176; + gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.y = 112; + gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.x = 208; + gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.y = 112; + + gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = FALSE; + gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = FALSE; + + Select_PrintYesNoOptions(); +} + +static void sub_819B958(u8 windowId) +{ + gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = TRUE; + gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = TRUE; + FillWindowPixelBuffer(windowId, 0); + CopyWindowToVram(windowId, 2); + ClearWindowTilemap(windowId); +} + +static void Select_PrintRentalPkmnString(void) +{ + FillWindowPixelBuffer(0, 0); + AddTextPrinterParameterized(0, 1, gText_RentalPkmn2, 2, 1, 0, NULL); + CopyWindowToVram(0, 3); +} + +static void Select_PrintMonSpecies(void) +{ + u16 species; + u8 x; + u8 monId = sFactorySelectScreen->cursorPos; + + FillWindowPixelBuffer(1, 0); + species = GetMonData(&sFactorySelectScreen->mons[monId].monData, MON_DATA_SPECIES, NULL); + StringCopy(gStringVar4, gSpeciesNames[species]); + x = GetStringRightAlignXOffset(1, gStringVar4, 86); + AddTextPrinterParameterized3(1, 1, x, 1, gUnknown_08610479, 0, gStringVar4); + CopyWindowToVram(1, 2); +} + +static void Select_PrintSelectMonString(void) +{ + const u8 *str = NULL; + + FillWindowPixelBuffer(2, 0); + if (sFactorySelectScreen->selectingMonsState == 1) + str = gText_SelectFirstPkmn; + else if (sFactorySelectScreen->selectingMonsState == 2) + str = gText_SelectSecondPkmn; + else if (sFactorySelectScreen->selectingMonsState == 3) + str = gText_SelectThirdPkmn; + else + str = gText_TheseThreePkmnOkay; + + AddTextPrinterParameterized(2, 1, str, 2, 5, 0, NULL); + CopyWindowToVram(2, 2); +} + +static void Select_PrintCantSelectSameMon(void) +{ + FillWindowPixelBuffer(2, 0); + AddTextPrinterParameterized(2, 1, gText_CantSelectSamePkmn, 2, 5, 0, NULL); + CopyWindowToVram(2, 2); +} + +static void Select_PrintMenuOptions(void) +{ + u8 selectedId = sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].selectedId; + + PutWindowTilemap(3); + FillWindowPixelBuffer(3, 0); + AddTextPrinterParameterized3(3, 1, 7, 1, gUnknown_08610476, 0, gText_Summary); + if (selectedId != 0) + AddTextPrinterParameterized3(3, 1, 7, 17, gUnknown_08610476, 0, gText_Deselect); + else + AddTextPrinterParameterized3(3, 1, 7, 17, gUnknown_08610476, 0, gText_Rent); + + AddTextPrinterParameterized3(3, 1, 7, 33, gUnknown_08610476, 0, gText_Others2); + CopyWindowToVram(3, 3); +} + +static void Select_PrintYesNoOptions(void) +{ + PutWindowTilemap(4); + FillWindowPixelBuffer(4, 0); + AddTextPrinterParameterized3(4, 1, 7, 1, gUnknown_08610476, 0, gText_Yes2); + AddTextPrinterParameterized3(4, 1, 7, 17, gUnknown_08610476, 0, gText_No2); + CopyWindowToVram(4, 3); +} + +static u8 Select_RunMenuOptionFunc(void) +{ + gUnknown_030062E8 = sSelect_MenuOptionFuncs[sFactorySelectScreen->menuCursorPos]; + return gUnknown_030062E8(); +} + +static u8 Select_OptionRentDeselect(void) +{ + u8 selectedId = sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].selectedId; + u16 monSetId = sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].monSetId; + if (selectedId == 0 && !Select_AreSpeciesValid(monSetId)) + { + Select_PrintCantSelectSameMon(); + sub_819B958(3); + return 3; + } + else + { + sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE); + Select_HandleMonSelectionChange(); + Select_PrintSelectMonString(); + sub_819B958(3); + if (sFactorySelectScreen->selectingMonsState > 3) + return 2; + else + return 1; + } +} + +static u8 sub_819BC9C(void) +{ + sub_819C568(); + Select_HandleMonSelectionChange(); + Select_PrintSelectMonString(); + sub_819B958(3); + if (sFactorySelectScreen->selectingMonsState > 3) + return 2; + else + return 1; +} + +static u8 Select_OptionSummary(void) +{ + return 0; +} + +static u8 Select_OptionOthers(void) +{ + sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE); + sub_819B958(3); + return 1; +} + +static void Select_PrintMonCategory(void) +{ + u16 species; + u8 text[30]; + u8 x; + u8 monId = sFactorySelectScreen->cursorPos; + if (monId < SELECTABLE_MONS_COUNT) + { + PutWindowTilemap(5); + FillWindowPixelBuffer(5, 0); + species = GetMonData(&sFactorySelectScreen->mons[monId].monData, MON_DATA_SPECIES, NULL); + CopyMonCategoryText(SpeciesToNationalPokedexNum(species), text); + x = GetStringRightAlignXOffset(1, text, 0x76); + AddTextPrinterParameterized(5, 1, text, x, 1, 0, NULL); + CopyWindowToVram(5, 2); + } +} + +static void Summary_ShowMonSprite(void) +{ + u8 monId = sFactorySelectScreen->cursorPos; + struct Pokemon *mon = &sFactorySelectScreen->mons[monId].monData; + u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); + u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL); + + sFactorySelectScreen->unk294[1].field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 88, 32, 15, 0xFFFF); + gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecX = 0; + gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecY = 0; + + sFactorySelectScreen->unk2A0 = FALSE; +} + +static void sub_819BE20(bool8 arg0) +{ + sFactorySelectScreen->unk2A0 = arg0; +} + +static void Select_ShowSummaryMonSprite(void) +{ + struct Pokemon *mon; + u16 species; + u32 personality, otId; + + sFactorySelectScreen->unk294[1].field1 = CreateSprite(&gUnknown_08610638, 120, 64, 1); + StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[1].field1], 2); + + mon = &sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].monData; + species = GetMonData(mon, MON_DATA_SPECIES, NULL); + personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); + otId = GetMonData(mon, MON_DATA_OT_ID, NULL); + + sFactorySelectScreen->unk294[1].field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 88, 32, 15, 0xFFFF); + gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecX = 0; + gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecY = 0; + + gSprites[sFactorySelectScreen->unk294[1].field1].invisible = TRUE; +} + +static void Select_ShowChosenMonsSprites(void) +{ + u8 i, j; + + for (i = 0; i < 3; i++) + { + for (j = 0; j < SELECTABLE_MONS_COUNT; j++) + { + if (sFactorySelectScreen->mons[j].selectedId == i + 1) + { + struct Pokemon *mon = &sFactorySelectScreen->mons[j].monData; + u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); + u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL); + + sFactorySelectScreen->unk294[i].field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, (i * 72) + 16, 32, i + 13, 0xFFFF); + gSprites[sFactorySelectScreen->unk294[i].field0].centerToCornerVecX = 0; + gSprites[sFactorySelectScreen->unk294[i].field0].centerToCornerVecY = 0; + break; + } + } + } + sFactorySelectScreen->unk2A0 = FALSE; +} + +static void sub_819C040(struct Sprite *sprite) +{ + u8 taskId; + + if (sprite->affineAnimEnded + && gSprites[sFactorySelectScreen->unk294[0].field1].affineAnimEnded + && gSprites[sFactorySelectScreen->unk294[2].field1].affineAnimEnded) + { + sprite->invisible = TRUE; + gSprites[sFactorySelectScreen->unk294[0].field1].invisible = TRUE; + gSprites[sFactorySelectScreen->unk294[2].field1].invisible = TRUE; + + taskId = CreateTask(sub_819C1D0, 1); + gTasks[taskId].func(taskId); + + sprite->callback = SpriteCallbackDummy; + } +} + +static void sub_819C100(struct Sprite *sprite) +{ + if (sprite->affineAnimEnded + && gSprites[sFactorySelectScreen->unk294[0].field1].affineAnimEnded + && gSprites[sFactorySelectScreen->unk294[2].field1].affineAnimEnded) + { + FreeOamMatrix(sprite->oam.matrixNum); + FreeOamMatrix(gSprites[sFactorySelectScreen->unk294[0].field1].oam.matrixNum); + FreeOamMatrix(gSprites[sFactorySelectScreen->unk294[2].field1].oam.matrixNum); + + sFactorySelectScreen->unk2A0 = FALSE; + + DestroySprite(&gSprites[sFactorySelectScreen->unk294[0].field1]); + DestroySprite(&gSprites[sFactorySelectScreen->unk294[2].field1]); + DestroySprite(sprite); + } +} + +static void sub_819C1D0(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + switch (task->data[0]) + { + case 0: + task->data[3] = 16; + task->data[24] = 224; // BUG: writing outside the array's bounds. + task->data[5] = 64; + task->data[8] = 65; + SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24])); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8])); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ); + break; + case 1: + ShowBg(3); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4)); + break; + case 2: + task->data[5] -= 4; + task->data[8] += 4; + if (task->data[5] <= 32 || task->data[8] >= 96) + { + task->data[5] = 32; + task->data[8] = 96; + ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); + } + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8])); + if (task->data[5] != 32) + return; + break; + default: + DestroyTask(taskId); + Select_ShowChosenMonsSprites(); + return; + } + task->data[0]++; +} + +static void sub_819C2D4(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + switch (task->data[0]) + { + default: + HideBg(3); + gSprites[sFactorySelectScreen->unk294[1].field1].invisible = FALSE; + gSprites[sFactorySelectScreen->unk294[1].field1].callback = sub_819C100; + gSprites[sFactorySelectScreen->unk294[0].field1].invisible = FALSE; + gSprites[sFactorySelectScreen->unk294[0].field1].callback = SpriteCallbackDummy; + gSprites[sFactorySelectScreen->unk294[2].field1].invisible = FALSE; + gSprites[sFactorySelectScreen->unk294[2].field1].callback = SpriteCallbackDummy; + StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[1].field1], 1); + StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[0].field1], 1); + StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[2].field1], 1); + ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); + DestroyTask(taskId); + break; + case 0: + task->data[3] = 16; + task->data[24] = 224; // BUG: writing outside the array's bounds. + task->data[5] = 32; + task->data[8] = 96; + SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24])); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8])); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ); + task->data[0]++; + break; + case 1: + task->data[5] += 4; + task->data[8] -= 4; + if (task->data[5] >= 64 || task->data[8] <= 65) + { + task->data[5] = 64; + task->data[8] = 65; + } + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8])); + if (task->data[5] == 64) + task->data[0]++; + break; + } +} + +static void sub_819C4B4(void) +{ + sFactorySelectScreen->unk294[1].field1 = CreateSprite(&gUnknown_08610638, 120, 64, 1); + sFactorySelectScreen->unk294[0].field1 = CreateSprite(&gUnknown_08610638, 44, 64, 1); + sFactorySelectScreen->unk294[2].field1 = CreateSprite(&gUnknown_08610638, 196, 64, 1); + + gSprites[sFactorySelectScreen->unk294[1].field1].callback = sub_819C040; + gSprites[sFactorySelectScreen->unk294[0].field1].callback = SpriteCallbackDummy; + gSprites[sFactorySelectScreen->unk294[2].field1].callback = SpriteCallbackDummy; + + sFactorySelectScreen->unk2A0 = TRUE; +} + +static void sub_819C568(void) +{ + u8 taskId; + + FreeAndDestroyMonPicSprite(sFactorySelectScreen->unk294[0].field0); + FreeAndDestroyMonPicSprite(sFactorySelectScreen->unk294[1].field0); + FreeAndDestroyMonPicSprite(sFactorySelectScreen->unk294[2].field0); + + taskId = CreateTask(sub_819C2D4, 1); + gTasks[taskId].func(taskId); + + sFactorySelectScreen->unk2A0 = TRUE; +} + +static void Select_SetWinRegs(s16 mWin0H, s16 nWin0H, s16 mWin0V, s16 nWin0V) +{ + SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(mWin0H, nWin0H)); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(mWin0V, nWin0V)); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ); +} + +static bool32 Select_AreSpeciesValid(u16 monSetId) +{ + u8 i, j; + u32 species = gFacilityTrainerMons[monSetId].species; + u8 selectState = sFactorySelectScreen->selectingMonsState; + + for (i = 1; i < selectState; i++) + { + for (j = 0; j < SELECTABLE_MONS_COUNT; j++) + { + if (sFactorySelectScreen->mons[j].selectedId == i) + { + if (gFacilityTrainerMons[sFactorySelectScreen->mons[j].monSetId].species == species) + return FALSE; + + break; + } + } + } + + return TRUE; +} + +static void Task_SelectFadeSpeciesName(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 0: + sFactorySelectScreen->unk2A7 = 0; + sFactorySelectScreen->unk2A8 = 0; + sFactorySelectScreen->unk2A6 = TRUE; + gTasks[taskId].data[0] = 1; + break; + case 1: + if (sFactorySelectScreen->unk2A2) + { + if (sFactorySelectScreen->unk2A9) + { + gTasks[taskId].data[0] = 2; + } + else + { + sFactorySelectScreen->unk2A7++; + if (sFactorySelectScreen->unk2A7 > 6) + { + sFactorySelectScreen->unk2A7 = 0; + if (!sFactorySelectScreen->unk2A6) + sFactorySelectScreen->unk2A8--; + else + sFactorySelectScreen->unk2A8++; + } + BlendPalettes(0x4000, sFactorySelectScreen->unk2A8, 0); + if (sFactorySelectScreen->unk2A8 > 5) + { + sFactorySelectScreen->unk2A6 = FALSE; + } + else if (sFactorySelectScreen->unk2A8 == 0) + { + gTasks[taskId].data[0] = 2; + sFactorySelectScreen->unk2A6 = TRUE; + } + } + } + break; + case 2: + if (sFactorySelectScreen->unk2A9 > 14) + { + sFactorySelectScreen->unk2A9 = 0; + gTasks[taskId].data[0] = 1; + } + else + { + sFactorySelectScreen->unk2A9++; + } + break; + } +} + +// Swap Screen's section begins here. + +static void Swap_CB2(void) +{ + AnimateSprites(); + BuildOamBuffer(); + RunTextPrinters(); + UpdatePaletteFade(); + RunTasks(); +} + +static void Swap_VblankCb(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void CopySwappedMonData(void) +{ + u8 happiness; + + gPlayerParty[sFactorySwapScreen->playerMonId] = gEnemyParty[sFactorySwapScreen->enemyMonId]; + happiness = 0; + SetMonData(&gPlayerParty[sFactorySwapScreen->playerMonId], MON_DATA_FRIENDSHIP, &happiness); + gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->playerMonId].monId = gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->enemyMonId + 3].monId; + gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->playerMonId].ivs = gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->enemyMonId + 3].ivs; + gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->playerMonId].personality = GetMonData(&gEnemyParty[sFactorySwapScreen->enemyMonId], MON_DATA_PERSONALITY, NULL); + gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->playerMonId].abilityBit = GetBoxMonData(&gEnemyParty[sFactorySwapScreen->enemyMonId].box, MON_DATA_ALT_ABILITY, NULL); +} + +static void Task_FromSwapScreenToSummaryScreen(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 6: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); + gTasks[taskId].data[0] = 7; + break; + case 7: + if (!gPaletteFade.active) + { + DestroyTask(sFactorySwapScreen->fadeSpeciesNameTaskId); + sub_819F444(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30); + Swap_DestroyAllSprites(); + FREE_AND_SET_NULL(sSwapMenuTilesetBuffer); + FREE_AND_SET_NULL(sSwapMonCardBgTilesetBuffer); + FREE_AND_SET_NULL(sSwapMenuTilemapBuffer); + FREE_AND_SET_NULL(sSwapMonCardBgTilemapBuffer); + FreeAllWindowBuffers(); + gTasks[taskId].data[0] = 8; + } + break; + case 8: + DestroyTask(taskId); + sFactorySwapScreen->fromSummaryScreen = TRUE; + sFactorySwapScreen->unk24 = gPlttBufferUnfaded[244]; + ShowPokemonSummaryScreen(0, gPlayerParty, sFactorySwapScreen->cursorPos, 3 - 1, CB2_InitSwapScreen); + break; + } +} + +static void Task_CloseSwapScreen(u8 taskId) +{ + if (sFactorySwapScreen->unk30 != TRUE) + { + switch (gTasks[taskId].data[0]) + { + case 0: + if (sFactorySwapScreen->monSwapped == TRUE) + { + gTasks[taskId].data[0]++; + gSpecialVar_Result = 0; + } + else + { + gTasks[taskId].data[0] = 2; + gSpecialVar_Result = 1; + } + break; + case 1: + if (sFactorySwapScreen->monSwapped == TRUE) + { + sFactorySwapScreen->enemyMonId = sFactorySwapScreen->cursorPos; + CopySwappedMonData(); + } + gTasks[taskId].data[0]++; + break; + case 2: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); + gTasks[taskId].data[0]++; + break; + case 3: + if (!UpdatePaletteFade()) + { + DestroyTask(sFactorySwapScreen->fadeSpeciesNameTaskId); + Swap_DestroyAllSprites(); + FREE_AND_SET_NULL(sSwapMenuTilesetBuffer); + FREE_AND_SET_NULL(sSwapMonCardBgTilesetBuffer); + FREE_AND_SET_NULL(sSwapMenuTilemapBuffer); + FREE_AND_SET_NULL(sSwapMonCardBgTilemapBuffer); + FREE_AND_SET_NULL(sFactorySwapScreen); + FreeAllWindowBuffers(); + SetMainCallback2(CB2_ReturnToFieldContinueScript); + DestroyTask(taskId); + } + break; + } + } +} + +static void Task_HandleSwapScreenYesNo(u8 taskId) +{ + u16 loPtr, hiPtr; + + if (sFactorySwapScreen->unk30 != TRUE) + { + switch (gTasks[taskId].data[0]) + { + case 4: + Swap_ShowYesNoOptions(); + gTasks[taskId].data[0] = 5; + break; + case 5: + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (sFactorySwapScreen->yesNoCursorPos == 0) + { + gTasks[taskId].data[1] = 1; + hiPtr = gTasks[taskId].data[6]; + loPtr = gTasks[taskId].data[7]; + gTasks[taskId].func = (void*)((hiPtr << 16) | loPtr); + } + else + { + gTasks[taskId].data[1] = 0; + sub_819EA64(4); + hiPtr = gTasks[taskId].data[6]; + loPtr = gTasks[taskId].data[7]; + gTasks[taskId].func = (void*)((hiPtr << 16) | loPtr); + } + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + gTasks[taskId].data[1] = 0; + sub_819EA64(4); + hiPtr = gTasks[taskId].data[6]; + loPtr = gTasks[taskId].data[7]; + gTasks[taskId].func = (void*)((hiPtr << 16) | loPtr); + } + else if (gMain.newAndRepeatedKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + Swap_UpdateYesNoCursorPosition(-1); + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + Swap_UpdateYesNoCursorPosition(1); + } + break; + } + } +} + +static void sub_819CBDC(u8 taskId) +{ + if (gTasks[taskId].data[1] == 1) + { + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = Task_CloseSwapScreen; + } + else + { + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 16; + gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons); + gTasks[taskId].data[5] = 1; + gTasks[taskId].func = sub_819D770; + } +} + +static void sub_819CC24(u8 taskId) +{ + if (gTasks[taskId].data[0] == 0) + { + Swap_PrintOnInfoWindow(gText_QuitSwapping); + sFactorySwapScreen->monSwapped = FALSE; + gTasks[taskId].data[0] = 4; + gTasks[taskId].data[6] = (u32)(sub_819CBDC) >> 16; + gTasks[taskId].data[7] = (u32)(sub_819CBDC); + gTasks[taskId].func = Task_HandleSwapScreenYesNo; + } +} + +static void sub_819CC74(u8 taskId) +{ + sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE); + if (gTasks[taskId].data[1] == 1) + { + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = Task_CloseSwapScreen; + } + else + { + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 16; + gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons); + gTasks[taskId].data[5] = 1; + gTasks[taskId].func = sub_819D770; + } +} + +static void sub_819CCD4(u8 taskId) +{ + if (gTasks[taskId].data[0] == 0) + { + sub_819F2B4(&sFactorySwapScreen->unk2C.field1, &sFactorySwapScreen->unk30, TRUE); + Swap_PrintOnInfoWindow(gText_AcceptThisPkmn); + sFactorySwapScreen->monSwapped = TRUE; + gTasks[taskId].data[0] = 4; + gTasks[taskId].data[6] = (u32)(sub_819CC74) >> 16; + gTasks[taskId].data[7] = (u32)(sub_819CC74); + gTasks[taskId].func = Task_HandleSwapScreenYesNo; + } +} + +static void Task_HandleSwapScreenMenu(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 2: + if (!sFactorySwapScreen->fromSummaryScreen) + sub_819F2B4(&sFactorySwapScreen->unk2C.field1, &sFactorySwapScreen->unk30, TRUE); + gTasks[taskId].data[0] = 9; + break; + case 9: + if (sFactorySwapScreen->unk30 != TRUE) + { + Swap_ShowMenuOptions(); + gTasks[taskId].data[0] = 3; + } + break; + case 3: + if (sFactorySwapScreen->unk30 != TRUE) + { + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + Swap_RunMenuOptionFunc(taskId); + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE); + sub_819EA64(3); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 16; + gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons); + gTasks[taskId].data[5] = 1; + gTasks[taskId].func = sub_819D770; + } + else if (gMain.newAndRepeatedKeys & DPAD_UP) + { + Swap_UpdateMenuCursorPosition(-1); + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + Swap_UpdateMenuCursorPosition(1); + } + } + break; + } +} + +static void Task_HandleSwapScreenChooseMons(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 0: + if (!gPaletteFade.active) + { + sFactorySwapScreen->unk22 = TRUE; + gTasks[taskId].data[0] = 1; + } + break; + case 1: + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + sFactorySwapScreen->unk22 = FALSE; + Swap_PrintMonSpecies2(); + sub_819EAC0(); + Swap_RunActionFunc(taskId); + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sFactorySwapScreen->unk22 = FALSE; + Swap_PrintMonSpecies2(); + sub_819EAC0(); + gTasks[taskId].data[6] = (u32)(sub_819CC24) >> 16; + gTasks[taskId].data[7] = (u32)(sub_819CC24); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[5] = 0; + gTasks[taskId].func = sub_819D588; + } + else if (gMain.newAndRepeatedKeys & DPAD_LEFT) + { + Swap_UpdateBallCursorPosition(-1); + Swap_PrintMonCategory(); + Swap_PrintMonSpecies(); + } + else if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + { + Swap_UpdateBallCursorPosition(1); + Swap_PrintMonCategory(); + Swap_PrintMonSpecies(); + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + Swap_UpdateActionCursorPosition(1); + Swap_PrintMonCategory(); + Swap_PrintMonSpecies(); + } + else if (gMain.newAndRepeatedKeys & DPAD_UP) + { + Swap_UpdateActionCursorPosition(-1); + Swap_PrintMonCategory(); + Swap_PrintMonSpecies(); + } + break; + } +} + +static void Task_SwapFadeSpeciesName(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 0: + sFactorySwapScreen->unk27 = 0; + sFactorySwapScreen->unk28 = 0; + sFactorySwapScreen->unk26 = TRUE; + gTasks[taskId].data[0] = 1; + break; + case 1: + if (sFactorySwapScreen->unk22) + { + if (sFactorySwapScreen->unk29) + { + gTasks[taskId].data[0] = 2; + } + else + { + sFactorySwapScreen->unk27++; + if (sFactorySwapScreen->unk27 > 6) + { + sFactorySwapScreen->unk27 = 0; + if (!sFactorySwapScreen->unk26) + sFactorySwapScreen->unk28--; + else + sFactorySwapScreen->unk28++; + } + BlendPalettes(0x4000, sFactorySwapScreen->unk28, 0); + if (sFactorySwapScreen->unk28 > 5) + { + sFactorySwapScreen->unk26 = FALSE; + } + else if (sFactorySwapScreen->unk28 == 0) + { + gTasks[taskId].data[0] = 2; + sFactorySwapScreen->unk26 = TRUE; + } + } + } + break; + case 2: + if (sFactorySwapScreen->unk29 > 14) + { + sFactorySwapScreen->unk29 = 0; + gTasks[taskId].data[0] = 1; + } + else + { + sFactorySwapScreen->unk29++; + } + break; + } +} + +static void Task_SwapFadeSpeciesName2(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 0: + sFactorySwapScreen->unk27 = 0; + gTasks[taskId].data[4] = 0; + gTasks[taskId].data[0]++; + break; + case 1: + LoadPalette(&gPlttBufferUnfaded[0xF0], 0xE0, 0xA); + gTasks[taskId].data[0]++; + break; + case 2: + if (sFactorySwapScreen->unk28 > 15) + { + gTasks[taskId].data[4] = 1; + gTasks[taskId].data[0]++; + } + sFactorySwapScreen->unk27++; + if (sFactorySwapScreen->unk27 > 3) + { + sFactorySwapScreen->unk27 = 0; + gPlttBufferUnfaded[244] = gPlttBufferFaded[228]; + sFactorySwapScreen->unk28++; + } + BlendPalettes(0x4000, sFactorySwapScreen->unk28, 0); + break; + } +} + +static void sub_819D12C(u8 taskId) +{ + s8 i; + u8 var_2C; + bool8 destroyTask; + + switch (gTasks[taskId].data[0]) + { + case 0: + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[0] = 1; + break; + case 1: + var_2C = 0; + for (i = 2; i >= 0; i--) + { + if (i != 2) + { + u8 posX = var_2C - gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x; + if (posX == 16 || gTasks[taskId].data[i + 2] == 1) + { + var_2C = gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x; + gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x += 10; + } + else if (posX > 16) + { + gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x = gSprites[sFactorySwapScreen->ballSpriteIds[i + 1]].pos1.x - 48; + } + } + else + { + var_2C = gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x; + gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x += 10; + } + + if (gTasks[taskId].data[i + 1] == 1) + { + if (gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x > (i * 48) + 72) + { + gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x = (i * 48) + 72; + destroyTask = TRUE; + } + else if (gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x == (i * 48) + 72) + { + destroyTask = TRUE; + } + else + { + destroyTask = FALSE; + } + } + else + { + destroyTask = FALSE; + } + + if (gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x - 16 > 240) + { + var_2C = gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x; + gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x = -16; + if (sFactorySwapScreen->inEnemyScreen == TRUE) + gSprites[sFactorySwapScreen->ballSpriteIds[i]].oam.paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED); + else + gSprites[sFactorySwapScreen->ballSpriteIds[i]].oam.paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_GREY); + + gTasks[taskId].data[i + 1] = 1; + } + } + if (destroyTask == TRUE) + DestroyTask(taskId); + break; + } +} + +static void sub_819D324(u8 taskId) +{ + u8 i, j; + s32 posX = 0; + s8 r4 = gTasks[taskId].data[3]; + bool8 r1; + s16 currPosX; + u8 taskId2; + + if (gTasks[taskId].data[2] == 1) + r4 *= -1; + + switch (gTasks[taskId].data[0]) + { + case 0: + currPosX = gSprites[sFactorySwapScreen->unk8[0][0]].pos1.x; + if (!gTasks[taskId].data[2]) + { + if (currPosX + r4 < 240) + { + r1 = TRUE; + } + else + { + r1 = FALSE; + posX = 240; + } + } + else + { + if (currPosX + r4 > 160) + { + r1 = TRUE; + } + else + { + r1 = FALSE; + posX = 160; + } + } + + if (r1 == TRUE) + { + for (i = 0; i < 3; i++) + { + for (j = 0; j < 2; j++) + gSprites[sFactorySwapScreen->unk8[j][i]].pos1.x += r4; + } + } + else + { + for (j = 0; j < 2; j++) + { + gSprites[sFactorySwapScreen->unk8[j][0]].pos1.x = posX; + gSprites[sFactorySwapScreen->unk8[j][1]].pos1.x = posX + 16; + gSprites[sFactorySwapScreen->unk8[j][2]].pos1.x = posX + 48; + } + taskId2 = gTasks[taskId].data[1]; + gTasks[taskId2].data[3] = 1; + DestroyTask(taskId); + } + break; + case 1: + currPosX = gSprites[sFactorySwapScreen->unkE[0][0]].pos1.x; + if (!gTasks[taskId].data[2]) + { + if (currPosX + r4 < 240) + { + r1 = TRUE; + } + else + { + r1 = FALSE; + posX = 240; + } + } + else + { + if (currPosX + r4 > 192) + { + r1 = TRUE; + } + else + { + r1 = FALSE; + posX = 192; + } + } + + if (r1 == TRUE) + { + for (i = 0; i < 2; i++) + { + for (j = 0; j < 2; j++) + gSprites[sFactorySwapScreen->unkE[j][i]].pos1.x += r4; + } + } + else + { + for (j = 0; j < 2; j++) + { + gSprites[sFactorySwapScreen->unkE[j][0]].pos1.x = posX; + gSprites[sFactorySwapScreen->unkE[j][1]].pos1.x = posX + 16; + } + taskId2 = gTasks[taskId].data[1]; + gTasks[taskId2].data[4] = 1; + DestroyTask(taskId); + } + break; + } +} + +static void sub_819D588(u8 taskId) +{ + u8 anotherTaskId; + u16 loPtr, hiPtr; + + switch (gTasks[taskId].data[0]) + { + case 0: + LoadPalette(gUnknown_08610918, 0xE0, sizeof(gUnknown_08610918)); + Swap_PrintActionStrings(); + PutWindowTilemap(5); + gTasks[taskId].data[0]++; + break; + case 1: + sub_819EA64(3); + gTasks[taskId].data[0]++; + break; + case 2: + BeginNormalPaletteFade(0x4000, 0, 0, 0x10, gUnknown_0860F13C[37]); + gTasks[taskId].data[0]++; + break; + case 3: + if (!gPaletteFade.active) + { + FillWindowPixelBuffer(5, 0); + CopyWindowToVram(5, 2); + if (sFactorySwapScreen->inEnemyScreen == TRUE) + { + anotherTaskId = CreateTask(sub_819D324, 0); + gTasks[taskId].data[3] = 0; + gTasks[anotherTaskId].data[1] = taskId; + gTasks[anotherTaskId].data[0] = 0; + gTasks[anotherTaskId].data[2] = 0; + gTasks[anotherTaskId].data[3] = 6; + gTasks[taskId].data[2] = 5; + gTasks[taskId].data[0]++; + } + else + { + anotherTaskId = CreateTask(sub_819D324, 0); + gTasks[taskId].data[3] = 1; + gTasks[taskId].data[4] = 0; + gTasks[anotherTaskId].data[1] = taskId; + gTasks[anotherTaskId].data[0] = 1; + gTasks[anotherTaskId].data[2] = 0; + gTasks[anotherTaskId].data[3] = 6; + gTasks[taskId].data[0] += 2; + } + } + break; + case 4: + if (gTasks[taskId].data[2] == 0) + { + anotherTaskId = CreateTask(sub_819D324, 0); + gTasks[taskId].data[4] = 0; + gTasks[anotherTaskId].data[1] = taskId; + gTasks[anotherTaskId].data[0] = 1; + gTasks[anotherTaskId].data[2] = 0; + gTasks[anotherTaskId].data[3] = 6; + gTasks[taskId].data[0]++; + } + else + { + gTasks[taskId].data[2]--; + } + break; + case 5: + if (gTasks[taskId].data[3] == 1 && gTasks[taskId].data[4] == 1) + { + gTasks[taskId].data[0] = gTasks[taskId].data[5]; + loPtr = gTasks[taskId].data[6]; + hiPtr = gTasks[taskId].data[7]; + gTasks[taskId].func = (void *)((loPtr << 0x10) | (hiPtr)); + } + break; + } +} + +static void sub_819D770(u8 taskId) +{ + u8 anotherTaskId; + u16 loPtr, hiPtr; + if (sFactorySwapScreen->unk30 == TRUE) + return; + + switch (gTasks[taskId].data[0]) + { + case 0: + if (sFactorySwapScreen->inEnemyScreen == TRUE) + { + anotherTaskId = CreateTask(sub_819D324, 0); + gTasks[taskId].data[3] = 0; + gTasks[anotherTaskId].data[1] = taskId; + gTasks[anotherTaskId].data[0] = 0; + gTasks[anotherTaskId].data[2] = 1; + gTasks[anotherTaskId].data[3] = 6; + gTasks[taskId].data[2] = 10; + gTasks[taskId].data[0]++; + } + else + { + anotherTaskId = CreateTask(sub_819D324, 0); + gTasks[taskId].data[3] = 1; + gTasks[taskId].data[4] = 0; + gTasks[anotherTaskId].data[1] = taskId; + gTasks[anotherTaskId].data[0] = 1; + gTasks[anotherTaskId].data[2] = 1; + gTasks[anotherTaskId].data[3] = 6; + gTasks[taskId].data[0] += 2; + } + break; + case 1: + if (gTasks[taskId].data[2] == 0) + { + anotherTaskId = CreateTask(sub_819D324, 0); + gTasks[taskId].data[4] = 0; + gTasks[anotherTaskId].data[1] = taskId; + gTasks[anotherTaskId].data[0] = 1; + gTasks[anotherTaskId].data[2] = 1; + gTasks[anotherTaskId].data[3] = 6; + gTasks[taskId].data[0]++; + } + else + { + gTasks[taskId].data[2]--; + } + break; + case 2: + if (gTasks[taskId].data[3] == 1 && gTasks[taskId].data[4] == 1) + { + gPlttBufferFaded[226] = gUnknown_0860F13C[37]; + Swap_PrintActionStrings(); + PutWindowTilemap(5); + gTasks[taskId].data[0]++; + } + break; + case 3: + BeginNormalPaletteFade(0x4000, 0, 0x10, 0, gUnknown_0860F13C[37]); + gTasks[taskId].data[0]++; + break; + case 4: + if (!gPaletteFade.active) + { + Swap_PrintOneActionString(0); + gTasks[taskId].data[0]++; + } + break; + case 5: + Swap_PrintOneActionString(1); + PutWindowTilemap(3); + gTasks[taskId].data[0]++; + break; + case 6: + FillWindowPixelBuffer(5, 0); + CopyWindowToVram(5, 2); + gTasks[taskId].data[0]++; + break; + case 7: + if (!sFactorySwapScreen->inEnemyScreen) + Swap_PrintOnInfoWindow(gText_SelectPkmnToSwap); + else + Swap_PrintOnInfoWindow(gText_SelectPkmnToAccept); + if (sFactorySwapScreen->cursorPos < 3) + gSprites[sFactorySwapScreen->cursorSpriteId].invisible = FALSE; + Swap_PrintMonCategory(); + gTasks[taskId].data[0]++; + break; + case 8: + Swap_PrintMonSpecies3(); + sub_819EADC(); + sFactorySwapScreen->unk22 = TRUE; + gTasks[taskId].data[0] = gTasks[taskId].data[5]; + loPtr = gTasks[taskId].data[6]; + hiPtr = gTasks[taskId].data[7]; + gTasks[taskId].func = (void *)((loPtr << 0x10) | (hiPtr)); + break; + } +} + +static void sub_819D9EC(u8 taskId) +{ + u8 i; + if (sFactorySwapScreen->unk30 == TRUE) + return; + + switch (gTasks[taskId].data[0]) + { + case 0: + Swap_PrintMonSpecies3(); + gTasks[taskId].data[0]++; + break; + case 1: + sub_819EADC(); + gSprites[sFactorySwapScreen->cursorSpriteId].invisible = TRUE; + gTasks[taskId].data[0]++; + break; + case 2: + CreateTask(sub_819D12C, 0); + gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].func = Task_SwapFadeSpeciesName2; + gTasks[taskId].data[0]++; + break; + case 3: + if (!FuncIsActiveTask(sub_819D12C) && gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[4] == 1) + { + sub_819EAC0(); + if (!sFactorySwapScreen->inEnemyScreen) + { + Swap_InitActions(ACTIONS_ENEMY_SCREEN); + } + else + { + Swap_InitActions(ACTIONS_PLAYER_SCREEN); + for (i = 0; i < 3; i++) + gSprites[sFactorySwapScreen->unk8[1][i]].invisible = TRUE; + } + gSprites[sFactorySwapScreen->cursorSpriteId].pos1.x = gSprites[sFactorySwapScreen->ballSpriteIds[sFactorySwapScreen->cursorPos]].pos1.x; + gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].func = Task_SwapFadeSpeciesName; + sFactorySwapScreen->unk27 = 0; + sFactorySwapScreen->unk28 = 6; + sFactorySwapScreen->unk26 = FALSE; + gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[0] = 1; + gTasks[taskId].data[0]++; + } + break; + case 4: + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 0x10; + gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons); + gTasks[taskId].data[5] = 1; + gTasks[taskId].func = sub_819D770; + break; + } +} + +static void Swap_InitStruct(void) +{ + if (sFactorySwapScreen == NULL) + { + sFactorySwapScreen = AllocZeroed(sizeof(*sFactorySwapScreen)); + sFactorySwapScreen->cursorPos = 0; + sFactorySwapScreen->unk30 = FALSE; + sFactorySwapScreen->fromSummaryScreen = FALSE; + } +} + +void DoBattleFactorySwapScreen(void) +{ + sFactorySwapScreen = NULL; + SetMainCallback2(CB2_InitSwapScreen); +} + +static void CB2_InitSwapScreen(void) +{ + u8 taskId; + + switch (gMain.state) + { + case 0: + SetHBlankCallback(NULL); + SetVBlankCallback(NULL); + CpuFill32(0, (void *)VRAM, VRAM_SIZE); + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, sSwap_BgTemplates, ARRAY_COUNT(sSwap_BgTemplates)); + InitWindows(sSwap_WindowTemplates); + DeactivateAllTextPrinters(); + gMain.state++; + break; + case 1: + sSwapMenuTilesetBuffer = Alloc(0x440); + sSwapMonCardBgTilesetBuffer = AllocZeroed(0x440); + sSwapMenuTilemapBuffer = Alloc(0x800); + sSwapMonCardBgTilemapBuffer = AllocZeroed(0x800); + ChangeBgX(0, 0, 0); + ChangeBgY(0, 0, 0); + ChangeBgX(1, 0, 0); + ChangeBgY(1, 0, 0); + ChangeBgX(2, 0, 0); + ChangeBgY(2, 0, 0); + ChangeBgX(3, 0, 0); + ChangeBgY(3, 0, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + SetGpuReg(REG_OFFSET_MOSAIC, 0); + SetGpuReg(REG_OFFSET_WIN0H, 0); + SetGpuReg(REG_OFFSET_WIN0V, 0); + SetGpuReg(REG_OFFSET_WIN1H, 0); + SetGpuReg(REG_OFFSET_WIN1V, 0); + SetGpuReg(REG_OFFSET_WININ, 0); + SetGpuReg(REG_OFFSET_WINOUT, 0); + gMain.state++; + break; + case 2: + ResetPaletteFade(); + ResetSpriteData(); + ResetTasks(); + FreeAllSpritePalettes(); + ResetAllPicSprites(); + CpuCopy16(gFrontierFactorySelectMenu_Gfx, sSwapMenuTilesetBuffer, 0x440); + CpuCopy16(gUnknown_0861033C, sSwapMonCardBgTilesetBuffer, 0x60); + LoadBgTiles(1, sSwapMenuTilesetBuffer, 0x440, 0); + LoadBgTiles(3, sSwapMonCardBgTilesetBuffer, 0x60, 0); + CpuCopy16(gFrontierFactorySelectMenu_Tilemap, sSwapMenuTilemapBuffer, 0x800); + LoadBgTilemap(1, sSwapMenuTilemapBuffer, 0x800, 0); + LoadPalette(gFrontierFactorySelectMenu_Pal, 0, 0x40); + LoadPalette(gUnknown_08610918, 0xF0, sizeof(gUnknown_08610918)); + LoadPalette(gUnknown_08610918, 0xE0, sizeof(gUnknown_08610918)); + LoadPalette(gUnknown_0861039C, 0x20, 4); + gMain.state++; + break; + case 3: + SetBgTilemapBuffer(3, sSwapMonCardBgTilemapBuffer); + CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 11, 4, 8, 8); + CopyBgTilemapBufferToVram(3); + gMain.state++; + break; + case 4: + LoadSpritePalettes(gUnknown_086106B0); + LoadSpriteSheets(gUnknown_08610650); + LoadCompressedObjectPic(gUnknown_086106A0); + SetVBlankCallback(Swap_VblankCb); + gMain.state++; + break; + case 5: + if (sFactorySwapScreen->fromSummaryScreen == TRUE) + sFactorySwapScreen->cursorPos = gUnknown_0203CF20; + gMain.state++; + break; + case 6: + Swap_InitStruct(); + Swap_InitAllSprites(); + if (sFactorySwapScreen->fromSummaryScreen == TRUE) + Swap_ShowSummaryMonSprite(); + Swap_InitActions(ACTIONS_PLAYER_SCREEN); + gMain.state++; + break; + case 7: + Swap_PrintOnInfoWindow(gText_SelectPkmnToSwap); + PutWindowTilemap(2); + gMain.state++; + break; + case 8: + Swap_PrintMonCategory(); + PutWindowTilemap(8); + gMain.state++; + break; + case 9: + if (!sFactorySwapScreen->fromSummaryScreen) + Swap_PrintMonSpecies(); + PutWindowTilemap(1); + gMain.state++; + break; + case 10: + Swap_PrintPkmnSwap(); + PutWindowTilemap(0); + gMain.state++; + break; + case 11: + gMain.state++; + break; + case 12: + if (sFactorySwapScreen->fromSummaryScreen) + Swap_PrintMonSpecies2(); + gMain.state++; + break; + case 13: + Swap_PrintActionStrings2(); + PutWindowTilemap(3); + gMain.state++; + break; + case 14: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); + ShowBg(0); + ShowBg(1); + ShowBg(2); + if (sFactorySwapScreen->fromSummaryScreen == TRUE) + { + ShowBg(3); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4)); + } + else + { + HideBg(3); + } + gMain.state++; + break; + case 15: + sFactorySwapScreen->fadeSpeciesNameTaskId = CreateTask(Task_SwapFadeSpeciesName, 0); + if (!sFactorySwapScreen->fromSummaryScreen) + { + gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[0] = 0; + taskId = CreateTask(Task_HandleSwapScreenChooseMons, 0); + gTasks[taskId].data[0] = 0; + } + else + { + sub_819EAF8(); + gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[0] = 1; + sFactorySwapScreen->unk22 = FALSE; + taskId = CreateTask(Task_HandleSwapScreenMenu, 0); + gTasks[taskId].data[0] = 2; + } + SetMainCallback2(Swap_CB2); + break; + } +} + +static void Swap_InitAllSprites(void) +{ + u8 i; + u8 x; + struct SpriteTemplate spriteTemplate; + + spriteTemplate = gUnknown_08610834; + spriteTemplate.paletteTag = TAG_PAL_BALL_SELECTED; + + for (i = 0; i < 3; i++) + { + sFactorySwapScreen->ballSpriteIds[i] = CreateSprite(&spriteTemplate, (48 * i) + 72, 64, 1); + gSprites[sFactorySwapScreen->ballSpriteIds[i]].data[0] = 0; + } + sFactorySwapScreen->cursorSpriteId = CreateSprite(&gUnknown_0861084C, gSprites[sFactorySwapScreen->ballSpriteIds[sFactorySwapScreen->cursorPos]].pos1.x, 88, 0); + sFactorySwapScreen->menuCursor1SpriteId = CreateSprite(&gUnknown_08610864, 176, 112, 0); + sFactorySwapScreen->menuCursor2SpriteId = CreateSprite(&gUnknown_0861087C, 176, 144, 0); + gSprites[sFactorySwapScreen->menuCursor1SpriteId].invisible = TRUE; + gSprites[sFactorySwapScreen->menuCursor2SpriteId].invisible = TRUE; + gSprites[sFactorySwapScreen->menuCursor1SpriteId].centerToCornerVecX = 0; + gSprites[sFactorySwapScreen->menuCursor1SpriteId].centerToCornerVecY = 0; + gSprites[sFactorySwapScreen->menuCursor2SpriteId].centerToCornerVecX = 0; + gSprites[sFactorySwapScreen->menuCursor2SpriteId].centerToCornerVecY = 0; + + if (sFactorySwapScreen->fromSummaryScreen == TRUE) + x = 240; + else + x = 192; + + spriteTemplate = gUnknown_0861084C; + spriteTemplate.tileTag = TAG_TILE_68; + sFactorySwapScreen->unk8[0][0] = CreateSprite(&spriteTemplate, 240, 120, 10); + + spriteTemplate = gUnknown_08610864; + spriteTemplate.tileTag = TAG_TILE_69; + sFactorySwapScreen->unk8[0][1] = CreateSprite(&spriteTemplate, 256, 120, 10); + sFactorySwapScreen->unk8[0][2] = CreateSprite(&spriteTemplate, 288, 120, 10); + + spriteTemplate = gUnknown_0861084C; + spriteTemplate.tileTag = TAG_TILE_6A; + sFactorySwapScreen->unk8[1][0] = CreateSprite(&spriteTemplate, 240, 120, 1); + + spriteTemplate = gUnknown_08610864; + spriteTemplate.tileTag = TAG_TILE_6B; + sFactorySwapScreen->unk8[1][1] = CreateSprite(&spriteTemplate, 256, 120, 1); + spriteTemplate.tileTag = TAG_TILE_6C; + sFactorySwapScreen->unk8[1][2] = CreateSprite(&spriteTemplate, 288, 120, 1); + + spriteTemplate = gUnknown_0861084C; + spriteTemplate.tileTag = TAG_TILE_68; + sFactorySwapScreen->unkE[0][0] = CreateSprite(&spriteTemplate, x, 144, 10); + + spriteTemplate = gUnknown_08610864; + spriteTemplate.tileTag = TAG_TILE_69; + sFactorySwapScreen->unkE[0][1] = CreateSprite(&spriteTemplate, x + 16, 144, 10); + + spriteTemplate = gUnknown_0861084C; + spriteTemplate.tileTag = TAG_TILE_6A; + sFactorySwapScreen->unkE[1][0] = CreateSprite(&spriteTemplate, x, 144, 1); + + spriteTemplate = gUnknown_08610864; + spriteTemplate.tileTag = TAG_TILE_6C; + sFactorySwapScreen->unkE[1][1] = CreateSprite(&spriteTemplate, x + 16, 144, 1); + + for (i = 0; i < 2; i++) + { + gSprites[sFactorySwapScreen->unk8[i][0]].centerToCornerVecX = 0; + gSprites[sFactorySwapScreen->unk8[i][0]].centerToCornerVecY = 0; + gSprites[sFactorySwapScreen->unk8[i][1]].centerToCornerVecX = 0; + gSprites[sFactorySwapScreen->unk8[i][1]].centerToCornerVecY = 0; + gSprites[sFactorySwapScreen->unk8[i][2]].centerToCornerVecX = 0; + gSprites[sFactorySwapScreen->unk8[i][2]].centerToCornerVecY = 0; + gSprites[sFactorySwapScreen->unkE[i][0]].centerToCornerVecX = 0; + gSprites[sFactorySwapScreen->unkE[i][0]].centerToCornerVecY = 0; + gSprites[sFactorySwapScreen->unkE[i][1]].centerToCornerVecX = 0; + gSprites[sFactorySwapScreen->unkE[i][1]].centerToCornerVecY = 0; + + gSprites[sFactorySwapScreen->unk8[i][0]].invisible = TRUE; + gSprites[sFactorySwapScreen->unk8[i][1]].invisible = TRUE; + gSprites[sFactorySwapScreen->unk8[i][2]].invisible = TRUE; + gSprites[sFactorySwapScreen->unkE[i][0]].invisible = TRUE; + gSprites[sFactorySwapScreen->unkE[i][1]].invisible = TRUE; + } + + gSprites[sFactorySwapScreen->unkE[0][0]].invisible = FALSE; + gSprites[sFactorySwapScreen->unkE[0][1]].invisible = FALSE; + gSprites[sFactorySwapScreen->unk8[0][0]].invisible = FALSE; + gSprites[sFactorySwapScreen->unk8[0][1]].invisible = FALSE; + gSprites[sFactorySwapScreen->unk8[0][2]].invisible = FALSE; +} + +static void Swap_DestroyAllSprites(void) +{ + u8 i, j; + + for (i = 0; i < 3; i++) + DestroySprite(&gSprites[sFactorySwapScreen->ballSpriteIds[i]]); + DestroySprite(&gSprites[sFactorySwapScreen->cursorSpriteId]); + DestroySprite(&gSprites[sFactorySwapScreen->menuCursor1SpriteId]); + DestroySprite(&gSprites[sFactorySwapScreen->menuCursor2SpriteId]); + for (i = 0; i < 2; i++) + { + for (j = 0; j < 3; j++) + DestroySprite(&gSprites[sFactorySwapScreen->unk8[i][j]]); + } + for (i = 0; i < 2; i++) + { + for (j = 0; j < 2; j++) + DestroySprite(&gSprites[sFactorySwapScreen->unkE[i][j]]); + } +} + +static void Swap_HandleActionCursorChange(u8 cursorId) +{ + if (cursorId < 3) + { + gSprites[sFactorySwapScreen->cursorSpriteId].invisible = FALSE; + sub_819E8EC(); + gSprites[sFactorySwapScreen->cursorSpriteId].pos1.x = gSprites[sFactorySwapScreen->ballSpriteIds[cursorId]].pos1.x; + } + else + { + gSprites[sFactorySwapScreen->cursorSpriteId].invisible = TRUE; + sub_819E838(sFactorySwapScreen->actionsData[cursorId].id); + } +} + +static void Swap_UpdateBallCursorPosition(s8 direction) +{ + u8 cursorPos; + PlaySE(SE_SELECT); + if (direction > 0) // Move cursor right. + { + if (sFactorySwapScreen->cursorPos + 1 != sFactorySwapScreen->actionsCount) + sFactorySwapScreen->cursorPos++; + else + sFactorySwapScreen->cursorPos = 0; + } + else // Move cursor left. + { + if (sFactorySwapScreen->cursorPos != 0) + sFactorySwapScreen->cursorPos--; + else + sFactorySwapScreen->cursorPos = sFactorySwapScreen->actionsCount - 1; + } + + cursorPos = sFactorySwapScreen->cursorPos; + Swap_HandleActionCursorChange(cursorPos); +} + +static void Swap_UpdateActionCursorPosition(s8 direction) +{ + u8 cursorPos; + PlaySE(SE_SELECT); + if (direction > 0) // Move cursor down. + { + if (sFactorySwapScreen->cursorPos < 3) + sFactorySwapScreen->cursorPos = 3; + else if (sFactorySwapScreen->cursorPos + 1 != sFactorySwapScreen->actionsCount) + sFactorySwapScreen->cursorPos++; + else + sFactorySwapScreen->cursorPos = 0; + } + else // Move cursor up. + { + if (sFactorySwapScreen->cursorPos < 3) + sFactorySwapScreen->cursorPos = sFactorySwapScreen->actionsCount - 1; + else if (sFactorySwapScreen->cursorPos != 0) + sFactorySwapScreen->cursorPos--; + else + sFactorySwapScreen->cursorPos = sFactorySwapScreen->actionsCount - 1; + } + + cursorPos = sFactorySwapScreen->cursorPos; + Swap_HandleActionCursorChange(cursorPos); +} + +static void Swap_UpdateYesNoCursorPosition(s8 direction) +{ + if (direction > 0) // Move cursor down. + { + if (sFactorySwapScreen->yesNoCursorPos != 1) + sFactorySwapScreen->yesNoCursorPos++; + else + sFactorySwapScreen->yesNoCursorPos = 0; + } + else // Move cursor up. + { + if (sFactorySwapScreen->yesNoCursorPos != 0) + sFactorySwapScreen->yesNoCursorPos--; + else + sFactorySwapScreen->yesNoCursorPos = 1; + } + + gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.y = (sFactorySwapScreen->yesNoCursorPos * 16) + 112; + gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.y = (sFactorySwapScreen->yesNoCursorPos * 16) + 112; +} + +static void Swap_UpdateMenuCursorPosition(s8 direction) +{ + PlaySE(SE_SELECT); + if (direction > 0) // Move cursor down. + { + if (sFactorySwapScreen->menuCursorPos != MENU_OPTIONS_COUNT - 1) + sFactorySwapScreen->menuCursorPos++; + else + sFactorySwapScreen->menuCursorPos = 0; + } + else // Move cursor up. + { + if (sFactorySwapScreen->menuCursorPos != 0) + sFactorySwapScreen->menuCursorPos--; + else + sFactorySwapScreen->menuCursorPos = MENU_OPTIONS_COUNT - 1; + } + + gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.y = (sFactorySwapScreen->menuCursorPos * 16) + 112; + gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.y = (sFactorySwapScreen->menuCursorPos * 16) + 112; +} + +static void sub_819E838(u8 arg0) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + if (arg0 == 2) + { + gSprites[sFactorySwapScreen->unk8[1][i]].invisible = FALSE; + if (i < 2) + gSprites[sFactorySwapScreen->unkE[1][i]].invisible = TRUE; + } + else if (arg0 == 3) + { + if (i < 2) + gSprites[sFactorySwapScreen->unkE[1][i]].invisible = FALSE; + gSprites[sFactorySwapScreen->unk8[1][i]].invisible = TRUE; + } + } +} + +static void sub_819E8EC(void) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + gSprites[sFactorySwapScreen->unk8[1][i]].invisible = TRUE; + if (i < 2) + gSprites[sFactorySwapScreen->unkE[1][i]].invisible = TRUE; + } +} + +static void Swap_ShowMenuOptions(void) +{ + if (sFactorySwapScreen->fromSummaryScreen == TRUE) + sFactorySwapScreen->fromSummaryScreen = FALSE; + else + sFactorySwapScreen->menuCursorPos = 0; + + gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.x = 176; + gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.y = (sFactorySwapScreen->menuCursorPos * 16) + 112; + gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.x = 208; + gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.y = (sFactorySwapScreen->menuCursorPos * 16) + 112; + + gSprites[sFactorySwapScreen->menuCursor1SpriteId].invisible = FALSE; + gSprites[sFactorySwapScreen->menuCursor2SpriteId].invisible = FALSE; + + Swap_PrintMenuOptions(); +} + +static void Swap_ShowYesNoOptions(void) +{ + sFactorySwapScreen->yesNoCursorPos = 0; + + gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.x = 176; + gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.y = 112; + gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.x = 208; + gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.y = 112; + + gSprites[sFactorySwapScreen->menuCursor1SpriteId].invisible = FALSE; + gSprites[sFactorySwapScreen->menuCursor2SpriteId].invisible = FALSE; + + Swap_PrintYesNoOptions(); +} + +static void sub_819EA64(u8 windowId) +{ + gSprites[sFactorySwapScreen->menuCursor1SpriteId].invisible = TRUE; + gSprites[sFactorySwapScreen->menuCursor2SpriteId].invisible = TRUE; + FillWindowPixelBuffer(windowId, 0); + CopyWindowToVram(windowId, 2); + ClearWindowTilemap(windowId); +} + +static void sub_819EAC0(void) +{ + PutWindowTilemap(1); + FillWindowPixelBuffer(1, 0); + CopyWindowToVram(1, 2); +} + +static void sub_819EADC(void) +{ + PutWindowTilemap(7); + FillWindowPixelBuffer(7, 0); + CopyWindowToVram(7, 2); +} + +static void sub_819EAF8(void) +{ + sub_819EAC0(); + PutWindowTilemap(5); + FillWindowPixelBuffer(5, 0); + CopyWindowToVram(5, 2); +} + +static void Swap_PrintPkmnSwap(void) +{ + FillWindowPixelBuffer(0, 0x11); + AddTextPrinterParameterized(0, 1, gText_PkmnSwap, 2, 1, 0, NULL); + CopyWindowToVram(0, 3); +} + +static void Swap_PrintMonSpecies(void) +{ + u16 species; + u8 x; + + FillWindowPixelBuffer(1, 0); + if (sFactorySwapScreen->cursorPos > 2) + { + CopyWindowToVram(1, 2); + } + else + { + u8 monId = sFactorySwapScreen->cursorPos; + if (!sFactorySwapScreen->inEnemyScreen) + species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL); + else + species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL); + StringCopy(gStringVar4, gSpeciesNames[species]); + x = GetStringRightAlignXOffset(1, gStringVar4, 86); + AddTextPrinterParameterized3(1, 1, x, 1, gUnknown_08610925, 0, gStringVar4); + CopyWindowToVram(1, 3); + } +} + +static void Swap_PrintOnInfoWindow(const u8 *str) +{ + FillWindowPixelBuffer(2, 0); + AddTextPrinterParameterized(2, 1, str, 2, 5, 0, NULL); + CopyWindowToVram(2, 2); +} + +static void Swap_PrintMenuOptions(void) +{ + PutWindowTilemap(3); + FillWindowPixelBuffer(3, 0); + AddTextPrinterParameterized3(3, 1, 15, 1, gUnknown_08610922, 0, gText_Summary2); + AddTextPrinterParameterized3(3, 1, 15, 17, gUnknown_08610922, 0, gText_Swap); + AddTextPrinterParameterized3(3, 1, 15, 33, gUnknown_08610922, 0, gText_Rechoose); + CopyWindowToVram(3, 3); +} + +static void Swap_PrintYesNoOptions(void) +{ + PutWindowTilemap(4); + FillWindowPixelBuffer(4, 0); + AddTextPrinterParameterized3(4, 1, 7, 1, gUnknown_08610922, 0, gText_Yes3); + AddTextPrinterParameterized3(4, 1, 7, 17, gUnknown_08610922, 0, gText_No3); + CopyWindowToVram(4, 3); +} + +static void Swap_PrintActionString(const u8 *str, u32 y, u32 windowId) +{ + s32 x = GetStringRightAlignXOffset(0, str, 0x46); + AddTextPrinterParameterized3(windowId, 0, x, y, gUnknown_08610922, 0, str); +} + +static void Swap_PrintActionStrings(void) +{ + FillWindowPixelBuffer(5, 0); + switch (sFactorySwapScreen->inEnemyScreen) + { + case TRUE: + Swap_PrintActionString(gText_PkmnForSwap, 0, 5); + case FALSE: + Swap_PrintActionString(gText_Cancel3, 24, 5); + break; + } + CopyWindowToVram(5, 3); +} + +static void Swap_PrintActionStrings2(void) +{ + FillWindowPixelBuffer(3, 0); + switch (sFactorySwapScreen->inEnemyScreen) + { + case TRUE: + Swap_PrintActionString(gText_PkmnForSwap, 8, 3); + case FALSE: + Swap_PrintActionString(gText_Cancel3, 32, 3); + break; + } + CopyWindowToVram(3, 3); +} + +static void Swap_PrintOneActionString(u8 which) +{ + switch (which) + { + case 0: + if (sFactorySwapScreen->inEnemyScreen == TRUE) + Swap_PrintActionString(gText_PkmnForSwap, 8, 3); + break; + case 1: + Swap_PrintActionString(gText_Cancel3, 32, 3); + break; + } + CopyWindowToVram(3, 3); +} + +static void Swap_PrintMonSpecies2(void) +{ + u16 species; + u8 x; + u16 pal[5]; + + CpuCopy16(gUnknown_08610918, pal, 8); + if (!sFactorySwapScreen->fromSummaryScreen) + pal[4] = gPlttBufferFaded[228]; + else + pal[4] = sFactorySwapScreen->unk24; + LoadPalette(pal, 0xF0, 0xA); + + PutWindowTilemap(7); + FillWindowPixelBuffer(7, 0); + if (sFactorySwapScreen->cursorPos > 2) + { + CopyWindowToVram(7, 3); + } + else + { + u8 monId = sFactorySwapScreen->cursorPos; + if (!sFactorySwapScreen->inEnemyScreen) + species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL); + else + species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL); + StringCopy(gStringVar4, gSpeciesNames[species]); + x = GetStringRightAlignXOffset(1, gStringVar4, 86); + AddTextPrinterParameterized3(7, 1, x, 1, gUnknown_08610925, 0, gStringVar4); + CopyWindowToVram(7, 3); + } +} + +static void Swap_PrintMonSpecies3(void) +{ + u16 species; + u8 x; + + LoadPalette(gUnknown_08610918, 0xE0, sizeof(gUnknown_08610918)); + CpuCopy16(gPlttBufferUnfaded + 240, gPlttBufferFaded + 224, 10); + + if (sFactorySwapScreen->cursorPos > 2) + { + CopyWindowToVram(1, 2); + } + else + { + u8 monId = sFactorySwapScreen->cursorPos; + if (!sFactorySwapScreen->inEnemyScreen) + species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL); + else + species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL); + StringCopy(gStringVar4, gSpeciesNames[species]); + x = GetStringRightAlignXOffset(1, gStringVar4, 86); + AddTextPrinterParameterized3(1, 1, x, 1, gUnknown_08610925, 0, gStringVar4); + CopyWindowToVram(1, 3); + } +} + +static void Swap_PrintMonCategory(void) +{ + u16 species; + u8 text[30]; + u8 x; + u8 monId = sFactorySwapScreen->cursorPos; + + FillWindowPixelBuffer(8, 0); + if (monId > 2) + { + CopyWindowToVram(8, 2); + } + else + { + PutWindowTilemap(8); + if (!sFactorySwapScreen->inEnemyScreen) + species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL); + else + species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL); + CopyMonCategoryText(SpeciesToNationalPokedexNum(species), text); + x = GetStringRightAlignXOffset(1, text, 0x76); + AddTextPrinterParameterized(8, 1, text, x, 1, 0, NULL); + CopyWindowToVram(8, 2); + } +} + +static void Swap_InitActions(u8 id) +{ + if (sFactorySwapScreen->fromSummaryScreen != TRUE) + { + switch (id) + { + case ACTIONS_PLAYER_SCREEN: + sFactorySwapScreen->inEnemyScreen = FALSE; + sFactorySwapScreen->cursorPos = 0; + sFactorySwapScreen->actionsCount = ARRAY_COUNT(sSwap_PlayerScreenActions); + sFactorySwapScreen->actionsData = sSwap_PlayerScreenActions; + break; + case ACTIONS_ENEMY_SCREEN: + sFactorySwapScreen->inEnemyScreen = TRUE; + sFactorySwapScreen->cursorPos = 0; + sFactorySwapScreen->actionsCount = ARRAY_COUNT(sSwap_EnemyScreenActions); + sFactorySwapScreen->actionsData = sSwap_EnemyScreenActions; + break; + } + } +} + +static void Swap_RunMenuOptionFunc(u8 taskId) +{ + sSwap_CurrentTableFunc = sSwap_MenuOptionFuncs[sFactorySwapScreen->menuCursorPos]; + sSwap_CurrentTableFunc(taskId); +} + +static void sub_819F0CC(u8 taskId) +{ + sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE); + sFactorySwapScreen->playerMonId = sFactorySwapScreen->cursorPos; + sub_819EA64(3); + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = sub_819D9EC; +} + +static void sub_819F114(u8 taskId) +{ + gTasks[taskId].data[0] = 6; + gTasks[taskId].func = Task_FromSwapScreenToSummaryScreen; +} + +static void sub_819F134(u8 taskId) +{ + sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE); + sub_819EA64(3); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 0x10; + gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons); + gTasks[taskId].data[5] = 1; + gTasks[taskId].func = sub_819D770; +} + +static void Swap_RunActionFunc(u8 taskId) +{ + sSwap_CurrentTableFunc = sFactorySwapScreen->actionsData[sFactorySwapScreen->cursorPos].func; + sSwap_CurrentTableFunc(taskId); +} + +static void Swap_ActionCancel(u8 taskId) +{ + gTasks[taskId].data[6] = (u32)(sub_819CC24) >> 0x10; + gTasks[taskId].data[7] = (u32)(sub_819CC24); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[5] = 0; + gTasks[taskId].func = sub_819D588; +} + +static void Swap_ActionPkmnForSwap(u8 taskId) +{ + gTasks[taskId].data[6] = (u32)(sub_819D9EC) >> 0x10; + gTasks[taskId].data[7] = (u32)(sub_819D9EC); + gTasks[taskId].data[5] = 0; + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = sub_819D588; +} + +static void Swap_ActionMon(u8 taskId) +{ + if (!sFactorySwapScreen->inEnemyScreen) + { + gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenMenu) >> 0x10; + gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenMenu); + gTasks[taskId].data[5] = 2; + } + else if (Swap_AlreadyHasSameSpecies(sFactorySwapScreen->cursorPos) == TRUE) + { + sub_819F2B4(&sFactorySwapScreen->unk2C.field1, &sFactorySwapScreen->unk30, TRUE); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[5] = 1; + gTasks[taskId].func = Task_SwapCantHaveSameMons; + return; + } + else + { + gTasks[taskId].data[6] = (u32)(sub_819CCD4) >> 0x10; + gTasks[taskId].data[7] = (u32)(sub_819CCD4); + gTasks[taskId].data[5] = 0; + } + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = sub_819D588; +} + +static void sub_819F2B4(u8 *arg0, bool8 *arg1, bool8 swapScreen) +{ + *arg0 = CreateSprite(&gUnknown_08610894, 120, 64, 1); + gSprites[*arg0].callback = sub_819F600; + gSprites[*arg0].data[7] = swapScreen; + *arg1 = TRUE; +} + +static void Swap_ShowSummaryMonSprite(void) +{ + struct Pokemon *mon; + u16 species; + u32 personality, otId; + + sFactorySwapScreen->unk2C.field1 = CreateSprite(&gUnknown_08610894, 120, 64, 1); + StartSpriteAffineAnim(&gSprites[sFactorySwapScreen->unk2C.field1], 2); + + mon = &gPlayerParty[sFactorySwapScreen->cursorPos]; + species = GetMonData(mon, MON_DATA_SPECIES, NULL); + personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); + otId = GetMonData(mon, MON_DATA_OT_ID, NULL); + + sFactorySwapScreen->unk2C.field0 = CreateMonPicSprite_HandleDeoxys(species, personality, otId, TRUE, 88, 32, 15, 0xFFFF); // BUG: otId and personality should be switched. + gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecX = 0; + gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecY = 0; + + gSprites[sFactorySwapScreen->unk2C.field1].invisible = TRUE; +} + +static void sub_819F3F8(struct UnkFactoryStruct arg0, bool8 *arg1, bool8 swapScreen) +{ + u8 taskId; + + FreeAndDestroyMonPicSprite(arg0.field0); + taskId = CreateTask(sub_819F7B4, 1); + gTasks[taskId].data[7] = swapScreen; + gTasks[taskId].data[6] = arg0.field1; + gTasks[taskId].func(taskId); + *arg1 = TRUE; +} + +static void sub_819F444(struct UnkFactoryStruct arg0, bool8 *arg1) +{ + FreeAndDestroyMonPicSprite(arg0.field0); + FreeOamMatrix(gSprites[arg0.field1].oam.matrixNum); + DestroySprite(&gSprites[arg0.field1]); + *arg1 = FALSE; +} + +static void Task_SwapCantHaveSameMons(u8 taskId) +{ + if (sFactorySwapScreen->unk30 == TRUE) + return; + + switch (gTasks[taskId].data[0]) + { + case 0: + Swap_PrintOnInfoWindow(gText_SamePkmnInPartyAlready); + sFactorySwapScreen->monSwapped = FALSE; + gTasks[taskId].data[0]++; + break; + case 1: + if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE); + gTasks[taskId].data[0]++; + } + break; + case 2: + if (sFactorySwapScreen->unk30 != TRUE) + { + FillWindowPixelBuffer(5, 0); + CopyWindowToVram(5, 2); + gTasks[taskId].data[0]++; + } + break; + case 3: + Swap_PrintOnInfoWindow(gText_SelectPkmnToAccept); + gTasks[taskId].data[0]++; + break; + case 4: + Swap_PrintMonSpecies3(); + sub_819EADC(); + sFactorySwapScreen->unk22 = TRUE; + gTasks[taskId].data[0] = gTasks[taskId].data[5]; + gTasks[taskId].func = Task_HandleSwapScreenChooseMons; + break; + } +} + +static bool8 Swap_AlreadyHasSameSpecies(u8 monId) +{ + u8 i; + u16 species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL); + + for (i = 0; i < 3; i++) + { + if (i != sFactorySwapScreen->playerMonId && (u16)(GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL)) == species) + return TRUE; + } + return FALSE; +} + +static void sub_819F600(struct Sprite *sprite) +{ + u8 taskId; + + if (sprite->affineAnimEnded) + { + sprite->invisible = TRUE; + taskId = CreateTask(sub_819F69C, 1); + gTasks[taskId].data[7] = sprite->data[7]; + gTasks[taskId].func(taskId); + sprite->callback = SpriteCallbackDummy; + } +} + +static void sub_819F654(struct Sprite *sprite) +{ + if (sprite->affineAnimEnded) + { + FreeOamMatrix(sprite->oam.matrixNum); + if (sprite->data[7] == TRUE) + sFactorySwapScreen->unk30 = FALSE; + else + sub_819BE20(FALSE); + DestroySprite(sprite); + } +} + +static void sub_819F69C(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + switch (task->data[0]) + { + case 0: + task->data[3] = 88; + task->data[24] = 152; // BUG: writing outside the array's bounds. + task->data[5] = 64; + task->data[8] = 65; + SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24])); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8])); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ); + break; + case 1: + ShowBg(3); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4)); + break; + case 2: + task->data[5] -= 4; + task->data[8] += 4; + if (task->data[5] <= 32 || task->data[8] >= 96) + { + task->data[5] = 32; + task->data[8] = 96; + } + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8])); + if (task->data[5] != 32) + return; + break; + default: + DestroyTask(taskId); + // UB: Should not use the task after it has been deleted. + if (gTasks[taskId].data[7] == TRUE) + Swap_ShowMonSprite(); + else + Summary_ShowMonSprite(); + return; + } + task->data[0]++; +} + +static void sub_819F7B4(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + switch (task->data[0]) + { + default: + HideBg(3); + gSprites[task->data[6]].data[7] = task->data[7]; + gSprites[task->data[6]].invisible = FALSE; + gSprites[task->data[6]].callback = sub_819F654; + StartSpriteAffineAnim(&gSprites[task->data[6]], 1); + ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); + DestroyTask(taskId); + break; + case 0: + task->data[3] = 88; + task->data[24] = 152; // BUG: writing outside the array's bounds. + task->data[5] = 32; + task->data[8] = 96; + SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24])); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8])); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ); + task->data[0]++; + break; + case 1: + task->data[5] += 4; + task->data[8] -= 4; + if (task->data[5] >= 64 || task->data[8] <= 65) + { + task->data[5] = 64; + task->data[8] = 65; + } + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8])); + if (task->data[5] == 64) + task->data[0]++; + break; + } +} + +static void Swap_ShowMonSprite(void) +{ + struct Pokemon *mon; + u16 species; + u32 personality, otId; + + if (!sFactorySwapScreen->inEnemyScreen) + mon = &gPlayerParty[sFactorySwapScreen->cursorPos]; + else + mon = &gEnemyParty[sFactorySwapScreen->cursorPos]; + + species = GetMonData(mon, MON_DATA_SPECIES, NULL); + personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); + otId = GetMonData(mon, MON_DATA_OT_ID, NULL); + + sFactorySwapScreen->unk2C.field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 88, 32, 15, 0xFFFF); + gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecX = 0; + gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecY = 0; + + sFactorySwapScreen->unk30 = FALSE; +} diff --git a/src/battle_tent.c b/src/battle_tent.c index f3aec1345..678222ff5 100644 --- a/src/battle_tent.c +++ b/src/battle_tent.c @@ -8,7 +8,7 @@ #include "battle_tower.h" #include "random.h" #include "item.h" -#include "battle_factory.h" +#include "battle_factory_screen.h" #include "frontier_util.h" #include "constants/items.h" #include "constants/region_map_sections.h" @@ -280,17 +280,17 @@ bool8 sub_81B9E94(void) && ((gMapHeader.mapLayoutId == 385) | (gMapHeader.mapLayoutId == 386))); } -// This function was written very...oddly. -#ifdef NONMATCHING static void sub_81B9EC0(void) { s32 i, j; - u16 currMonId = 0, currSpecies = 0; + u8 firstMonId; + u16 monSetId; + u16 currSpecies; u16 species[PARTY_SIZE]; u16 monIds[PARTY_SIZE]; u16 heldItems[PARTY_SIZE]; - s32 zero = 0; + firstMonId = 0; gFacilityTrainers = gSlateportBattleTentTrainers; for (i = 0; i < PARTY_SIZE; i++) { @@ -300,250 +300,56 @@ static void sub_81B9EC0(void) } gFacilityTrainerMons = gSlateportBattleTentMons; currSpecies = 0; - for (i = 0; i != PARTY_SIZE;) + i = 0; + while (i != PARTY_SIZE) { // Cannot have two pokemon of the same species. - currMonId = Random() % 70; - for (j = zero; j < i + zero; j++) + monSetId = Random() % 70; + for (j = firstMonId; j < firstMonId + i; j++) { - if (monIds[j] == currMonId) + u16 monId = monIds[j]; + if (monIds[j] == monSetId) break; - if (species[j] == gFacilityTrainerMons[currMonId].species) + if (species[j] == gFacilityTrainerMons[monSetId].species) { if (currSpecies == 0) - currSpecies = gFacilityTrainerMons[currMonId].species; + currSpecies = gFacilityTrainerMons[monSetId].species; else break; } } - if (j != i + zero) + if (j != i + firstMonId) continue; // Cannot have two same held items. - for (j = zero; j < i + zero; j++) + for (j = firstMonId; j < i + firstMonId; j++) { - if (heldItems[j] == 0) - continue; - if (heldItems[j] == gBattleFrontierHeldItems[gFacilityTrainerMons[currMonId].itemTableId]) + if (heldItems[j] != 0 && heldItems[j] == gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]) { - if (gFacilityTrainerMons[currMonId].species == currSpecies) + if (gFacilityTrainerMons[monSetId].species == currSpecies) currSpecies = 0; - else - break; + break; } } - if (j != i + zero) + if (j != i + firstMonId) continue; - gSaveBlock2Ptr->frontier.field_E70[i].monId = currMonId; - species[i] = gFacilityTrainerMons[currMonId].species; - heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[currMonId].itemTableId]; - monIds[i] = currMonId; + gSaveBlock2Ptr->frontier.field_E70[i].monId = monSetId; + species[i] = gFacilityTrainerMons[monSetId].species; + heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]; + monIds[i] = monSetId; i++; } } -#else -NAKED -static void sub_81B9EC0(void) -{ - asm_unified("\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x3C\n\ - ldr r1, =gFacilityTrainers\n\ - ldr r0, =gSlateportBattleTentTrainers\n\ - str r0, [r1]\n\ - add r0, sp, 0xC\n\ - mov r9, r0\n\ - mov r1, sp\n\ - adds r1, 0x18\n\ - str r1, [sp, 0x2C]\n\ - ldr r5, =gFacilityTrainerMons\n\ - ldr r4, =gSlateportBattleTentMons\n\ - movs r2, 0\n\ - adds r3, r1, 0\n\ - mov r1, r9\n\ - mov r0, sp\n\ - movs r6, 0x5\n\ - mov r8, r6\n\ -_081B9EEC:\n\ - strh r2, [r0]\n\ - strh r2, [r1]\n\ - strh r2, [r3]\n\ - adds r3, 0x2\n\ - adds r1, 0x2\n\ - adds r0, 0x2\n\ - movs r7, 0x1\n\ - negs r7, r7\n\ - add r8, r7\n\ - mov r6, r8\n\ - cmp r6, 0\n\ - bge _081B9EEC\n\ - str r4, [r5]\n\ - movs r7, 0\n\ - mov r10, r7\n\ - movs r0, 0\n\ - mov r8, r0\n\ - ldr r1, [sp, 0x2C]\n\ - str r1, [sp, 0x30]\n\ - mov r2, sp\n\ - str r2, [sp, 0x34]\n\ - lsls r6, r0, 1\n\ - str r6, [sp, 0x24]\n\ - add r6, r9\n\ - str r6, [sp, 0x28]\n\ -_081B9F1E:\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0x46\n\ - bl __umodsi3\n\ - lsls r0, 16\n\ - lsrs r5, r0, 16\n\ - movs r2, 0\n\ - mov r7, r8\n\ - adds r6, r2, r7\n\ - cmp r2, r6\n\ - bge _081B9F7C\n\ - ldr r1, [sp, 0x28]\n\ - ldrh r0, [r1]\n\ - cmp r0, r5\n\ - beq _081B9F7C\n\ - ldr r0, =gFacilityTrainerMons\n\ - ldr r1, [r0]\n\ - lsls r0, r5, 4\n\ - adds r4, r0, r1\n\ - ldrh r7, [r4]\n\ - mov r12, r7\n\ - lsls r3, r2, 1\n\ - ldr r1, [sp, 0x24]\n\ - add r1, sp\n\ - str r6, [sp, 0x38]\n\ -_081B9F56:\n\ - ldrh r0, [r1]\n\ - cmp r0, r12\n\ - bne _081B9F66\n\ - mov r0, r10\n\ - cmp r0, 0\n\ - bne _081B9F7C\n\ - ldrh r7, [r4]\n\ - mov r10, r7\n\ -_081B9F66:\n\ - adds r3, 0x2\n\ - adds r1, 0x2\n\ - adds r2, 0x1\n\ - ldr r0, [sp, 0x38]\n\ - cmp r2, r0\n\ - bge _081B9F7C\n\ - mov r7, r9\n\ - adds r0, r7, r3\n\ - ldrh r0, [r0]\n\ - cmp r0, r5\n\ - bne _081B9F56\n\ -_081B9F7C:\n\ - cmp r2, r6\n\ - bne _081BA01C\n\ - movs r2, 0\n\ - cmp r2, r6\n\ - bge _081B9FD4\n\ - ldr r0, =gBattleFrontierHeldItems\n\ - mov r12, r0\n\ - ldr r7, =gFacilityTrainerMons\n\ - ldr r1, [sp, 0x24]\n\ - ldr r0, [sp, 0x2C]\n\ - adds r4, r1, r0\n\ -_081B9F92:\n\ - ldrh r3, [r4]\n\ - cmp r3, 0\n\ - beq _081B9FCC\n\ - ldr r1, [r7]\n\ - lsls r0, r5, 4\n\ - adds r1, r0, r1\n\ - ldrb r0, [r1, 0xA]\n\ - lsls r0, 1\n\ - add r0, r12\n\ - ldrh r0, [r0]\n\ - cmp r3, r0\n\ - bne _081B9FCC\n\ - ldrh r0, [r1]\n\ - cmp r0, r10\n\ - bne _081B9FD4\n\ - movs r1, 0\n\ - mov r10, r1\n\ - b _081B9FD4\n\ - .pool\n\ -_081B9FCC:\n\ - adds r4, 0x2\n\ - adds r2, 0x1\n\ - cmp r2, r6\n\ - blt _081B9F92\n\ -_081B9FD4:\n\ - cmp r2, r6\n\ - bne _081BA01C\n\ - ldr r0, =gSaveBlock2Ptr\n\ - ldr r1, [r0]\n\ - mov r2, r8\n\ - lsls r3, r2, 1\n\ - adds r0, r3, r2\n\ - lsls r0, 2\n\ - adds r1, r0\n\ - movs r6, 0xE7\n\ - lsls r6, 4\n\ - adds r1, r6\n\ - strh r5, [r1]\n\ - ldr r0, =gFacilityTrainerMons\n\ - ldr r0, [r0]\n\ - lsls r1, r5, 4\n\ - adds r1, r0\n\ - ldrh r0, [r1]\n\ - ldr r7, [sp, 0x34]\n\ - strh r0, [r7]\n\ - ldr r2, =gBattleFrontierHeldItems\n\ - ldrb r0, [r1, 0xA]\n\ - lsls r0, 1\n\ - adds r0, r2\n\ - ldrh r0, [r0]\n\ - ldr r1, [sp, 0x30]\n\ - strh r0, [r1]\n\ - add r3, r9\n\ - strh r5, [r3]\n\ - adds r1, 0x2\n\ - str r1, [sp, 0x30]\n\ - adds r2, r7, 0\n\ - adds r2, 0x2\n\ - str r2, [sp, 0x34]\n\ - movs r6, 0x1\n\ - add r8, r6\n\ -_081BA01C:\n\ - mov r7, r8\n\ - cmp r7, 0x6\n\ - beq _081BA024\n\ - b _081B9F1E\n\ -_081BA024:\n\ - add sp, 0x3C\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .pool\n\ - "); -} -#endif // NONMATCHING static void sub_81BA040(void) { u16 trainerId; s32 i, j, k; - register const u16 *monSetsPool asm("r9"); // Fix me. Compiler insists on moving that variable into stack. + register const u16 *monSets asm("r9"); // Fix me. Compiler insists on moving that variable into stack. u16 species[3]; u16 heldItems[3]; - s32 monPoolCount = 0; + s32 setsCount = 0; gFacilityTrainers = gSlateportBattleTentTrainers; gFacilityTrainerMons = gSlateportBattleTentMons; @@ -561,21 +367,21 @@ static void sub_81BA040(void) } while (i != gSaveBlock2Ptr->frontier.curChallengeBattleNum); gTrainerBattleOpponent_A = trainerId; - while (gFacilityTrainers[gTrainerBattleOpponent_A].bfMonPool[monPoolCount] != 0xFFFF) - monPoolCount++; - if (monPoolCount > 8) + while (gFacilityTrainers[gTrainerBattleOpponent_A].monSets[setsCount] != 0xFFFF) + setsCount++; + if (setsCount > 8) break; - monPoolCount = 0; + setsCount = 0; } if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < 2) gSaveBlock2Ptr->frontier.field_CB4[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = gTrainerBattleOpponent_A; - monSetsPool = gFacilityTrainers[gTrainerBattleOpponent_A].bfMonPool; + monSets = gFacilityTrainers[gTrainerBattleOpponent_A].monSets; i = 0; while (i != 3) { - sRandMonSetId = monSetsPool[Random() % monPoolCount]; + sRandMonSetId = monSets[Random() % setsCount]; for (j = 0; j < 6; j++) { if (gFacilityTrainerMons[sRandMonSetId].species == gFacilityTrainerMons[gSaveBlock2Ptr->frontier.field_E70[j].monId].species) diff --git a/src/battle_tower.c b/src/battle_tower.c index e95eaf156..000a03a5b 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -21,6 +21,7 @@ #include "link.h" #include "field_message_box.h" #include "tv.h" +#include "battle_factory.h" #include "constants/battle_frontier.h" #include "constants/trainers.h" #include "constants/event_objects.h" @@ -29,19 +30,16 @@ extern u16 gUnknown_03006298[]; -extern void sub_81A6CD0(void); extern void sub_81A4C30(void); -extern u8 sub_81A6CA8(u8, u8); -extern void SetMonMoveAvoidReturn(struct Pokemon *mon, u16 move, u8 moveSlot); extern const u8 *const *const gUnknown_085DD690[]; extern const u16 gBattleFrontierHeldItems[]; extern const u8 sRubyFacilityClassToEmerald[82][2]; extern const u16 gUnknown_085DFA46[]; -extern const struct FacilityMon gBattleFrontierMons[]; extern const struct FacilityMon gSlateportBattleTentMons[]; extern const struct FacilityMon gVerdanturfBattleTentMons[]; extern const struct FacilityMon gFallarborBattleTentMons[]; +extern const struct FacilityMon gBattleFrontierMons[]; extern const struct BattleFrontierTrainer gBattleFrontierTrainers[]; extern const struct BattleFrontierTrainer gSlateportBattleTentTrainers[]; extern const struct BattleFrontierTrainer gVerdanturfBattleTentTrainers[]; @@ -983,14 +981,14 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount) u8 level = SetFacilityPtrsGetLevel(); u8 fixedIV = 0; u8 bfMonCount; - const u16 *bfMonPool = NULL; + const u16 *monSets = NULL; u32 otID = 0; if (trainerId < TRAINER_RECORD_MIXING_FRIEND) { // Normal battle frontier trainer. fixedIV = GetFrontierTrainerFixedIvs(trainerId); - bfMonPool = gFacilityTrainers[gTrainerBattleOpponent_A].bfMonPool; + monSets = gFacilityTrainers[gTrainerBattleOpponent_A].monSets; } else if (trainerId == TRAINER_EREADER) { @@ -1028,20 +1026,20 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount) // Attempt to fill the trainer's party with random Pokemon until 3 have been // successfully chosen. The trainer's party may not have duplicate pokemon species // or duplicate held items. - for (bfMonCount = 0; bfMonPool[bfMonCount] != 0xFFFF; bfMonCount++) + for (bfMonCount = 0; monSets[bfMonCount] != 0xFFFF; bfMonCount++) ; i = 0; otID = Random32(); while (i != monCount) { - u16 monPoolId = bfMonPool[Random() % bfMonCount]; - if ((level == 50 || level == 20) && monPoolId > 849) + u16 monSetId = monSets[Random() % bfMonCount]; + if ((level == 50 || level == 20) && monSetId > 849) continue; // Ensure this pokemon species isn't a duplicate. for (j = 0; j < i + firstMonId; j++) { - if (GetMonData(&gEnemyParty[j], MON_DATA_SPECIES, NULL) == gFacilityTrainerMons[monPoolId].species) + if (GetMonData(&gEnemyParty[j], MON_DATA_SPECIES, NULL) == gFacilityTrainerMons[monSetId].species) break; } if (j != i + firstMonId) @@ -1051,7 +1049,7 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount) for (j = 0; j < i + firstMonId; j++) { if (GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) != 0 - && GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) == gBattleFrontierHeldItems[gFacilityTrainerMons[monPoolId].itemTableId]) + && GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) == gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]) break; } if (j != i + firstMonId) @@ -1061,34 +1059,34 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount) // because the species and held items were already checked directly above. for (j = 0; j < i; j++) { - if (chosenMonIndices[j] == monPoolId) + if (chosenMonIndices[j] == monSetId) break; } if (j != i) continue; - chosenMonIndices[i] = monPoolId; + chosenMonIndices[i] = monSetId; // Place the chosen pokemon into the trainer's party. - CreateMonWithEVSpreadPersonalityOTID(&gEnemyParty[i + firstMonId], - gFacilityTrainerMons[monPoolId].species, + CreateMonWithEVSpreadNatureOTID(&gEnemyParty[i + firstMonId], + gFacilityTrainerMons[monSetId].species, level, - gFacilityTrainerMons[monPoolId].nature, + gFacilityTrainerMons[monSetId].nature, fixedIV, - gFacilityTrainerMons[monPoolId].evSpread, + gFacilityTrainerMons[monSetId].evSpread, otID); friendship = 255; // Give the chosen pokemon its specified moves. for (j = 0; j < 4; j++) { - SetMonMoveSlot(&gEnemyParty[i + firstMonId], gFacilityTrainerMons[monPoolId].moves[j], j); - if (gFacilityTrainerMons[monPoolId].moves[j] == MOVE_FRUSTRATION) + SetMonMoveSlot(&gEnemyParty[i + firstMonId], gFacilityTrainerMons[monSetId].moves[j], j); + if (gFacilityTrainerMons[monSetId].moves[j] == MOVE_FRUSTRATION) friendship = 0; // Frustration is more powerful the lower the pokemon's friendship is. } SetMonData(&gEnemyParty[i + firstMonId], MON_DATA_FRIENDSHIP, &friendship); - SetMonData(&gEnemyParty[i + firstMonId], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monPoolId].itemTableId]); + SetMonData(&gEnemyParty[i + firstMonId], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]); // The pokemon was successfully added to the trainer's party, so it's safe to move on to // the next party slot. @@ -1129,27 +1127,27 @@ static void Unused_CreateApprenticeMons(u16 trainerId, u8 firstMonId) } } -u16 RandomizeFacilityTrainerMonId(u16 trainerId) +u16 RandomizeFacilityTrainerMonSet(u16 trainerId) { u8 level = SetFacilityPtrsGetLevel(); - const u16 *bfMonPool = gFacilityTrainers[trainerId].bfMonPool; + const u16 *monSets = gFacilityTrainers[trainerId].monSets; u8 bfMonCount = 0; - u32 monPoolId = bfMonPool[bfMonCount]; + u32 monSetId = monSets[bfMonCount]; - while (monPoolId != 0xFFFF) + while (monSetId != 0xFFFF) { bfMonCount++; - monPoolId = bfMonPool[bfMonCount]; - if (monPoolId == 0xFFFF) + monSetId = monSets[bfMonCount]; + if (monSetId == 0xFFFF) break; } do { - monPoolId = bfMonPool[Random() % bfMonCount]; - } while((level == 50 || level == 20) && monPoolId > 849); + monSetId = monSets[Random() % bfMonCount]; + } while((level == 50 || level == 20) && monSetId > 849); - return monPoolId; + return monSetId; } static void FillFactoryTrainerParty(void) @@ -1175,9 +1173,9 @@ static void FillFactoryFrontierTrainerParty(u16 trainerId, u8 firstMonId) u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); u8 challengeNum = gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][0] / 7; if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < 6) - fixedIV = sub_81A6CA8(challengeNum, 0); + fixedIV = GetFactoryMonFixedIV(challengeNum, 0); else - fixedIV = sub_81A6CA8(challengeNum, 1); + fixedIV = GetFactoryMonFixedIV(challengeNum, 1); } else if (trainerId == TRAINER_EREADER) { @@ -1187,7 +1185,7 @@ static void FillFactoryFrontierTrainerParty(u16 trainerId, u8 firstMonId) } else if (trainerId == TRAINER_FRONTIER_BRAIN) { - sub_81A6CD0(); + FillFactoryBrainParty(); return; } else @@ -1195,26 +1193,25 @@ static void FillFactoryFrontierTrainerParty(u16 trainerId, u8 firstMonId) fixedIV = 31; } - level = SetFacilityPtrsGetLevel(); otID = T1_READ_32(gSaveBlock2Ptr->playerTrainerId); for (i = 0; i < 3; i++) { - u16 poolId = gUnknown_03006298[i]; - CreateMonWithEVSpreadPersonalityOTID(&gEnemyParty[firstMonId + i], - gFacilityTrainerMons[poolId].species, + u16 monSetId = gUnknown_03006298[i]; + CreateMonWithEVSpreadNatureOTID(&gEnemyParty[firstMonId + i], + gFacilityTrainerMons[monSetId].species, level, - gFacilityTrainerMons[poolId].nature, + gFacilityTrainerMons[monSetId].nature, fixedIV, - gFacilityTrainerMons[poolId].evSpread, + gFacilityTrainerMons[monSetId].evSpread, otID); friendship = 0; for (j = 0; j < 4; j++) - SetMonMoveAvoidReturn(&gEnemyParty[firstMonId + i], gFacilityTrainerMons[poolId].moves[j], j); + SetMonMoveAvoidReturn(&gEnemyParty[firstMonId + i], gFacilityTrainerMons[monSetId].moves[j], j); SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_FRIENDSHIP, &friendship); - SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[poolId].itemTableId]); + SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]); } } @@ -1228,25 +1225,25 @@ static void FillFactoryTentTrainerParty(u16 trainerId, u8 firstMonId) for (i = 0; i < 3; i++) { - u16 poolId = gUnknown_03006298[i]; - CreateMonWithEVSpreadPersonalityOTID(&gEnemyParty[firstMonId + i], - gFacilityTrainerMons[poolId].species, + u16 monSetId = gUnknown_03006298[i]; + CreateMonWithEVSpreadNatureOTID(&gEnemyParty[firstMonId + i], + gFacilityTrainerMons[monSetId].species, level, - gFacilityTrainerMons[poolId].nature, + gFacilityTrainerMons[monSetId].nature, fixedIV, - gFacilityTrainerMons[poolId].evSpread, + gFacilityTrainerMons[monSetId].evSpread, otID); friendship = 0; for (j = 0; j < 4; j++) { - SetMonMoveAvoidReturn(&gEnemyParty[firstMonId + i], gFacilityTrainerMons[poolId].moves[j], j); - if (gFacilityTrainerMons[poolId].moves[j] == MOVE_FRUSTRATION) + SetMonMoveAvoidReturn(&gEnemyParty[firstMonId + i], gFacilityTrainerMons[monSetId].moves[j], j); + if (gFacilityTrainerMons[monSetId].moves[j] == MOVE_FRUSTRATION) friendship = 0; } SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_FRIENDSHIP, &friendship); - SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[poolId].itemTableId]); + SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]); } } @@ -1609,7 +1606,7 @@ static void sub_81642A0(void) u32 spArray[5]; s32 r10; u16 trainerId; - u16 monPoolId; + u16 monSetId; u32 lvlMode, battleMode; s32 challengeNum; u32 species1, species2; @@ -1651,24 +1648,24 @@ static void sub_81642A0(void) { while (1) { - monPoolId = RandomizeFacilityTrainerMonId(trainerId); - if (j % 2 != 0 && gFacilityTrainerMons[gSaveBlock2Ptr->frontier.field_CB4[r10 - 1]].itemTableId == gFacilityTrainerMons[monPoolId].itemTableId) + monSetId = RandomizeFacilityTrainerMonSet(trainerId); + if (j % 2 != 0 && gFacilityTrainerMons[gSaveBlock2Ptr->frontier.field_CB4[r10 - 1]].itemTableId == gFacilityTrainerMons[monSetId].itemTableId) continue; for (k = 8; k < r10; k++) { - if (gFacilityTrainerMons[gSaveBlock2Ptr->frontier.field_CB4[k]].species == gFacilityTrainerMons[monPoolId].species) + if (gFacilityTrainerMons[gSaveBlock2Ptr->frontier.field_CB4[k]].species == gFacilityTrainerMons[monSetId].species) break; - if (species1 == gFacilityTrainerMons[monPoolId].species) + if (species1 == gFacilityTrainerMons[monSetId].species) break; - if (species2 == gFacilityTrainerMons[monPoolId].species) + if (species2 == gFacilityTrainerMons[monSetId].species) break; } if (k == r10) break; } - gSaveBlock2Ptr->frontier.field_CB4[r10] = monPoolId; + gSaveBlock2Ptr->frontier.field_CB4[r10] = monSetId; r10++; } } @@ -1749,7 +1746,7 @@ static void sub_81642A0(void) } } -static void sub_81646BC(u16 trainerId, u16 monPoolId) +static void sub_81646BC(u16 trainerId, u16 monSetId) { u16 move = 0; u16 species = 0; @@ -1759,8 +1756,8 @@ static void sub_81646BC(u16 trainerId, u16 monPoolId) { if (trainerId < TRAINER_RECORD_MIXING_FRIEND) { - move = gFacilityTrainerMons[monPoolId].moves[0]; - species = gFacilityTrainerMons[monPoolId].species; + move = gFacilityTrainerMons[monSetId].moves[0]; + species = gFacilityTrainerMons[monSetId].species; } else if (trainerId < TRAINER_RECORD_MIXING_APPRENTICE) { @@ -1787,7 +1784,7 @@ static void sub_81646BC(u16 trainerId, u16 monPoolId) static void sub_8164828(void) { s32 i, j, arrId; - s32 monPoolId; + s32 monSetId; s32 level = SetFacilityPtrsGetLevel(); u16 winStreak = GetCurrentFacilityWinStreak(); s32 challengeNum = winStreak / 7; @@ -1825,12 +1822,12 @@ static void sub_8164828(void) } break; case 1: - monPoolId = gSaveBlock2Ptr->frontier.field_CB4[8 + k * 2]; - sub_81646BC(trainerId, monPoolId); + monSetId = gSaveBlock2Ptr->frontier.field_CB4[8 + k * 2]; + sub_81646BC(trainerId, monSetId); break; case 2: - monPoolId = gSaveBlock2Ptr->frontier.field_CB4[9 + k * 2]; - sub_81646BC(trainerId, monPoolId); + monSetId = gSaveBlock2Ptr->frontier.field_CB4[9 + k * 2]; + sub_81646BC(trainerId, monSetId); break; case 3: gPartnerTrainerId = trainerId; @@ -2280,7 +2277,7 @@ static void FillPartnerParty(u16 trainerId) s32 i, j; u32 ivs, level; u32 friendship; - u16 monPoolId; + u16 monSetId; u32 otID; u8 trainerName[PLAYER_NAME_LENGTH + 1]; SetFacilityPtrsGetLevel(); @@ -2321,23 +2318,23 @@ static void FillPartnerParty(u16 trainerId) otID = Random32(); for (i = 0; i < 2; i++) { - monPoolId = gSaveBlock2Ptr->frontier.field_CB4[i + 18]; - CreateMonWithEVSpreadPersonalityOTID(&gPlayerParty[3 + i], - gFacilityTrainerMons[monPoolId].species, + monSetId = gSaveBlock2Ptr->frontier.field_CB4[i + 18]; + CreateMonWithEVSpreadNatureOTID(&gPlayerParty[3 + i], + gFacilityTrainerMons[monSetId].species, level, - gFacilityTrainerMons[monPoolId].nature, + gFacilityTrainerMons[monSetId].nature, ivs, - gFacilityTrainerMons[monPoolId].evSpread, + gFacilityTrainerMons[monSetId].evSpread, otID); friendship = 0xFF; for (j = 0; j < 4; j++) { - SetMonMoveSlot(&gPlayerParty[3 + i], gFacilityTrainerMons[monPoolId].moves[j], j); - if (gFacilityTrainerMons[monPoolId].moves[j] == MOVE_FRUSTRATION) + SetMonMoveSlot(&gPlayerParty[3 + i], gFacilityTrainerMons[monSetId].moves[j], j); + if (gFacilityTrainerMons[monSetId].moves[j] == MOVE_FRUSTRATION) friendship = 0; } SetMonData(&gPlayerParty[3 + i], MON_DATA_FRIENDSHIP, &friendship); - SetMonData(&gPlayerParty[3 + i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monPoolId].itemTableId]); + SetMonData(&gPlayerParty[3 + i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]); for (j = 0; j < PLAYER_NAME_LENGTH + 1; j++) trainerName[j] = gFacilityTrainers[trainerId].trainerName[j]; SetMonData(&gPlayerParty[3 + i], MON_DATA_OT_NAME, &trainerName); @@ -2689,19 +2686,19 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount) u8 level = SetTentPtrsGetLevel(); u8 fixedIV = 0; u8 bfMonCount; - const u16 *bfMonPool = NULL; + const u16 *monSets = NULL; u32 otID = 0; - u16 monPoolId; + u16 monSetId; - bfMonPool = gFacilityTrainers[gTrainerBattleOpponent_A].bfMonPool; + monSets = gFacilityTrainers[gTrainerBattleOpponent_A].monSets; bfMonCount = 0; - monPoolId = bfMonPool[bfMonCount]; - while (monPoolId != 0xFFFF) + monSetId = monSets[bfMonCount]; + while (monSetId != 0xFFFF) { bfMonCount++; - monPoolId = bfMonPool[bfMonCount]; - if (monPoolId == 0xFFFF) + monSetId = monSets[bfMonCount]; + if (monSetId == 0xFFFF) break; } @@ -2709,12 +2706,12 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount) otID = Random32(); while (i != monCount) { - u16 monPoolId = bfMonPool[Random() % bfMonCount]; + u16 monSetId = monSets[Random() % bfMonCount]; // Ensure this pokemon species isn't a duplicate. for (j = 0; j < i + firstMonId; j++) { - if (GetMonData(&gEnemyParty[j], MON_DATA_SPECIES, NULL) == gFacilityTrainerMons[monPoolId].species) + if (GetMonData(&gEnemyParty[j], MON_DATA_SPECIES, NULL) == gFacilityTrainerMons[monSetId].species) break; } if (j != i + firstMonId) @@ -2724,7 +2721,7 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount) for (j = 0; j < i + firstMonId; j++) { if (GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) != 0 - && GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) == gBattleFrontierHeldItems[gFacilityTrainerMons[monPoolId].itemTableId]) + && GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) == gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]) break; } if (j != i + firstMonId) @@ -2734,34 +2731,34 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount) // because the species and held items were already checked directly above. for (j = 0; j < i; j++) { - if (chosenMonIndices[j] == monPoolId) + if (chosenMonIndices[j] == monSetId) break; } if (j != i) continue; - chosenMonIndices[i] = monPoolId; + chosenMonIndices[i] = monSetId; // Place the chosen pokemon into the trainer's party. - CreateMonWithEVSpreadPersonalityOTID(&gEnemyParty[i + firstMonId], - gFacilityTrainerMons[monPoolId].species, + CreateMonWithEVSpreadNatureOTID(&gEnemyParty[i + firstMonId], + gFacilityTrainerMons[monSetId].species, level, - gFacilityTrainerMons[monPoolId].nature, + gFacilityTrainerMons[monSetId].nature, fixedIV, - gFacilityTrainerMons[monPoolId].evSpread, + gFacilityTrainerMons[monSetId].evSpread, otID); friendship = 255; // Give the chosen pokemon its specified moves. for (j = 0; j < 4; j++) { - SetMonMoveSlot(&gEnemyParty[i + firstMonId], gFacilityTrainerMons[monPoolId].moves[j], j); - if (gFacilityTrainerMons[monPoolId].moves[j] == MOVE_FRUSTRATION) + SetMonMoveSlot(&gEnemyParty[i + firstMonId], gFacilityTrainerMons[monSetId].moves[j], j); + if (gFacilityTrainerMons[monSetId].moves[j] == MOVE_FRUSTRATION) friendship = 0; // Frustration is more powerful the lower the pokemon's friendship is. } SetMonData(&gEnemyParty[i + firstMonId], MON_DATA_FRIENDSHIP, &friendship); - SetMonData(&gEnemyParty[i + firstMonId], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monPoolId].itemTableId]); + SetMonData(&gEnemyParty[i + firstMonId], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]); // The pokemon was successfully added to the trainer's party, so it's safe to move on to // the next party slot. diff --git a/src/frontier_util.c b/src/frontier_util.c index 39f472a60..a65d14784 100644 --- a/src/frontier_util.c +++ b/src/frontier_util.c @@ -336,7 +336,8 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][3] = }, [FRONTIER_FACILITY_FACTORY] = { - // Silver Symbol. + // Because Factory's pokemon are random, this facility's Brain also uses random pokemon. + // What is interesting, this team is actually the one Steven uses in the multi tag battle alongside the player. { { .species = SPECIES_METANG, @@ -363,7 +364,6 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][3] = .moves = {MOVE_THUNDERBOLT, MOVE_PROTECT, MOVE_SOLAR_BEAM, MOVE_DRAGON_CLAW}, }, }, - // Gold Symbol. { { .species = SPECIES_METANG, diff --git a/src/pokemon.c b/src/pokemon.c index b858ee925..2a17c8851 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -2904,7 +2904,7 @@ void CreateApprenticeMon(struct Pokemon *mon, const struct Apprentice *src, u8 m CalculateMonStats(mon); } -void CreateMonWithEVSpreadPersonalityOTID(struct Pokemon *mon, u16 species, u8 level, u8 nature, u8 fixedIV, u8 evSpread, u32 otId) +void CreateMonWithEVSpreadNatureOTID(struct Pokemon *mon, u16 species, u8 level, u8 nature, u8 fixedIV, u8 evSpread, u32 otId) { s32 i; s32 statCount = 0; |