summaryrefslogtreecommitdiff
path: root/src/battle_factory.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/battle_factory.c')
-rw-r--r--src/battle_factory.c4397
1 files changed, 573 insertions, 3824 deletions
diff --git a/src/battle_factory.c b/src/battle_factory.c
index d7a2939b3..37abf6add 100644
--- a/src/battle_factory.c
+++ b/src/battle_factory.c
@@ -1,4114 +1,863 @@
#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 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 const u16 gBattleFrontierHeldItems[];
-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);
+// IWRAM bss
+static IWRAM_DATA bool8 gUnknown_03001288;
// 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},
- {},
-};
-
-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 u8 sRequiredMoveCounts[] = {3, 3, 3, 2, 2, 2, 2};
-static const union AnimCmd gUnknown_086104A4[] =
+static const u16 sMoves_TotalPreparation[] =
{
- ANIMCMD_FRAME(0, 1),
- ANIMCMD_END,
+ 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 union AnimCmd gUnknown_086104AC[] =
+static const u16 sMoves_ImpossibleToPredict[] =
{
- ANIMCMD_FRAME(0, 30),
- ANIMCMD_END,
+ 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 union AnimCmd gUnknown_086104B4[] =
+static const u16 sMoves_WeakeningTheFoe[] =
{
- 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,
+ 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 union AnimCmd * const gUnknown_086104FC[] =
+static const u16 sMoves_HighRiskHighReturn[] =
{
- gUnknown_0861049C,
+ 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 union AnimCmd * const gUnknown_08610500[] =
+static const u16 sMoves_Endurance[] =
{
- gUnknown_086104A4,
+ 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 union AnimCmd * const gUnknown_08610504[] =
+static const u16 sMoves_SlowAndSteady[] =
{
- gUnknown_086104AC,
- gUnknown_086104B4,
+ 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 AffineAnimCmd gUnknown_0861050C[] =
+static const u16 sMoves_DependsOnTheBattlesFlow[] =
{
- 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,
+ MOVE_SANDSTORM, MOVE_RAIN_DANCE, MOVE_SUNNY_DAY, MOVE_HAIL, MOVE_WEATHER_BALL,
+ 0
};
-static const union AffineAnimCmd gUnknown_0861056C[] =
+static const u16 *const sMoveStyles[] =
{
- 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,
+ sMoves_TotalPreparation,
+ sMoves_SlowAndSteady,
+ sMoves_Endurance,
+ sMoves_HighRiskHighReturn,
+ sMoves_WeakeningTheFoe,
+ sMoves_ImpossibleToPredict,
+ sMoves_DependsOnTheBattlesFlow,
};
-static const union AffineAnimCmd gUnknown_086105BC[] =
+static void (* const gUnknown_08612120[])(void) =
{
- AFFINEANIMCMD_FRAME(256, 256, 0, 0),
- AFFINEANIMCMD_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 AffineAnimCmd * const gUnknown_086105CC[] =
+static const u32 gUnknown_08612164[][2] =
{
- gUnknown_0861050C,
- gUnknown_0861056C,
- gUnknown_086105BC,
+ {0x100, 0x200},
+ {0x1000000, 0x2000000},
};
-static const struct SpriteTemplate gUnknown_086105D8 =
+static const u32 gUnknown_08612174[][2] =
{
- .tileTag = TAG_TILE_64,
- .paletteTag = TAG_PAL_BALL_GREY,
- .oam = &gUnknown_0861047C,
- .anims = gUnknown_08610504,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_819A44C
+ {0xfffffeff, 0xfffffdff},
+ {0xfeffffff, 0xfdffffff},
};
-static const struct SpriteTemplate gUnknown_086105F0 =
+static const u8 sFixedIVTable[][2] =
{
- .tileTag = TAG_TILE_65,
- .paletteTag = TAG_PAL_66,
- .oam = &gUnknown_08610484,
- .anims = gUnknown_086104FC,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCallbackDummy
+ {3, 6},
+ {6, 9},
+ {9, 12},
+ {12, 15},
+ {15, 18},
+ {21, 31},
+ {31, 31},
+ {31, 31},
};
-static const struct SpriteTemplate gUnknown_08610608 =
+static const u16 sMonsToChooseFrom[][2] =
{
- .tileTag = TAG_TILE_66,
- .paletteTag = TAG_PAL_66,
- .oam = &gUnknown_0861048C,
- .anims = gUnknown_086104FC,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCallbackDummy
+ {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 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 = FALSE;
+ 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 == TRUE)
{
- 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 = FALSE;
}
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);
-}
-
-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);
+ DoBattleFactorySwapScreen();
}
-static void Select_PrintMenuOptions(void)
+static void sub_81A61A4(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 = TRUE;
}
-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);
+ gTrainerBattleOpponent_A = trainerId;
+ if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < 6)
+ gSaveBlock2Ptr->frontier.field_CB4[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = trainerId;
- 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])
+ 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;
+ if (lvlMode == FRONTIER_LVL_50 && monSetId > 849)
+ continue;
- 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++)
+ 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;
- }
}
- }
-
- return TRUE;
-}
+ if (k != firstMonId + i)
+ continue;
-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)
+ for (k = firstMonId; k < firstMonId + i; k++)
{
- 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();
-}
-
-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);
-}
+ if (k != firstMonId + i)
+ continue;
-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;
- }
-}
+ 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);
-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)
+ count = 0;
+ bits = gFacilityTrainerMons[monSetId].evSpread;
+ for (j = 0; j < NUM_STATS; bits >>= 1, j++)
{
- 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 (bits & 1)
+ count++;
}
- 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
+ evs = MAX_TOTAL_EVS / count;
+ bits = 1;
+ for (j = 0; j < NUM_STATS; bits <<= 1, j++)
{
- 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;
}
-}
-
-static void sub_819D770(u8 taskId)
-{
- u8 anotherTaskId;
- u16 loPtr, hiPtr;
- if (sFactorySwapScreen->unk30 == TRUE)
- return;
+ var_40 = sub_81A6F70(factoryBattleMode, factoryLvlMode);
- 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;
- }
-}
+ if (j != firstMonId + i)
+ continue;
-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)
+ // 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;
+ u32 species = gFacilityTrainerMons[gUnknown_03006298[i]].species;
- 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;
+ 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);
- }
+ gSpecialVar_Result = NUMBER_OF_MON_TYPES;
}
-static void Swap_UpdateBallCursorPosition(s8 direction)
+static void sub_81A6AEC(void)
{
- 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;
+ 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);
}