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.c161
1 files changed, 83 insertions, 78 deletions
diff --git a/src/battle_factory.c b/src/battle_factory.c
index bc47b1fda..913b1b1a0 100644
--- a/src/battle_factory.c
+++ b/src/battle_factory.c
@@ -10,7 +10,10 @@
#include "random.h"
#include "constants/species.h"
#include "constants/battle_ai.h"
+#include "constants/battle_factory.h"
#include "constants/battle_frontier.h"
+#include "constants/battle_frontier_mons.h"
+#include "constants/frontier_util.h"
#include "constants/layouts.h"
#include "constants/trainers.h"
#include "constants/moves.h"
@@ -22,7 +25,7 @@ static bool8 sPerformedRentalSwap;
static void InitFactoryChallenge(void);
static void GetBattleFactoryData(void);
static void SetBattleFactoryData(void);
-static void sub_81A613C(void);
+static void SaveFactoryChallenge(void);
static void nullsub_75(void);
static void nullsub_123(void);
static void SelectInitialRentalMons(void);
@@ -48,14 +51,14 @@ static const u16 sMoves_TotalPreparation[] =
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
+ MOVE_NONE
};
static const u16 sMoves_ImpossibleToPredict[] =
{
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
+ MOVE_NONE
};
static const u16 sMoves_WeakeningTheFoe[] =
@@ -63,7 +66,7 @@ static const u16 sMoves_WeakeningTheFoe[] =
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
+ MOVE_NONE
};
static const u16 sMoves_HighRiskHighReturn[] =
@@ -72,7 +75,7 @@ static const u16 sMoves_HighRiskHighReturn[] =
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
+ MOVE_NONE
};
static const u16 sMoves_Endurance[] =
@@ -81,7 +84,7 @@ static const u16 sMoves_Endurance[] =
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
+ MOVE_NONE
};
static const u16 sMoves_SlowAndSteady[] =
@@ -90,57 +93,58 @@ static const u16 sMoves_SlowAndSteady[] =
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
+ MOVE_NONE
};
static const u16 sMoves_DependsOnTheBattlesFlow[] =
{
MOVE_SANDSTORM, MOVE_RAIN_DANCE, MOVE_SUNNY_DAY, MOVE_HAIL, MOVE_WEATHER_BALL,
- 0
+ MOVE_NONE
};
-static const u16 *const sMoveStyles[] =
+// Excludes FACTORY_STYLE_NONE
+static const u16 *const sMoveStyles[FACTORY_NUM_STYLES - 1] =
{
- sMoves_TotalPreparation,
- sMoves_SlowAndSteady,
- sMoves_Endurance,
- sMoves_HighRiskHighReturn,
- sMoves_WeakeningTheFoe,
- sMoves_ImpossibleToPredict,
- sMoves_DependsOnTheBattlesFlow,
+ [FACTORY_STYLE_PREPARATION - 1] = sMoves_TotalPreparation,
+ [FACTORY_STYLE_SLOW_STEADY - 1] = sMoves_SlowAndSteady,
+ [FACTORY_STYLE_ENDURANCE - 1] = sMoves_Endurance,
+ [FACTORY_STYLE_HIGH_RISK - 1] = sMoves_HighRiskHighReturn,
+ [FACTORY_STYLE_WEAKENING - 1] = sMoves_WeakeningTheFoe,
+ [FACTORY_STYLE_UNPREDICTABLE - 1] = sMoves_ImpossibleToPredict,
+ [FACTORY_STYLE_WEATHER - 1] = sMoves_DependsOnTheBattlesFlow,
};
static void (* const sBattleFactoryFunctions[])(void) =
{
- InitFactoryChallenge,
- GetBattleFactoryData,
- SetBattleFactoryData,
- sub_81A613C,
- nullsub_75,
- nullsub_123,
- SelectInitialRentalMons,
- SwapRentalMons,
- SetPerformedRentalSwap,
- SetRentalsToOpponentParty,
- SetPlayerAndOpponentParties,
- SetOpponentGfxVar,
- GenerateOpponentMons,
- GenerateInitialRentalMons,
- GetOpponentMostCommonMonType,
- GetOpponentBattleStyle,
- RestorePlayerPartyHeldItems,
+ [BATTLE_FACTORY_FUNC_INIT] = InitFactoryChallenge,
+ [BATTLE_FACTORY_FUNC_GET_DATA] = GetBattleFactoryData,
+ [BATTLE_FACTORY_FUNC_SET_DATA] = SetBattleFactoryData,
+ [BATTLE_FACTORY_FUNC_SAVE] = SaveFactoryChallenge,
+ [BATTLE_FACTORY_FUNC_NULL] = nullsub_75,
+ [BATTLE_FACTORY_FUNC_NULL2] = nullsub_123,
+ [BATTLE_FACTORY_FUNC_SELECT_RENT_MONS] = SelectInitialRentalMons,
+ [BATTLE_FACTORY_FUNC_SWAP_RENT_MONS] = SwapRentalMons,
+ [BATTLE_FACTORY_FUNC_SET_SWAPPED] = SetPerformedRentalSwap,
+ [BATTLE_FACTORY_FUNC_SET_OPPONENT_MONS] = SetRentalsToOpponentParty,
+ [BATTLE_FACTORY_FUNC_SET_PARTIES] = SetPlayerAndOpponentParties,
+ [BATTLE_FACTORY_FUNC_SET_OPPONENT_GFX] = SetOpponentGfxVar,
+ [BATTLE_FACTORY_FUNC_GENERATE_OPPONENT_MONS] = GenerateOpponentMons,
+ [BATTLE_FACTORY_FUNC_GENERATE_RENTAL_MONS] = GenerateInitialRentalMons,
+ [BATTLE_FACTORY_FUNC_GET_OPPONENT_MON_TYPE] = GetOpponentMostCommonMonType,
+ [BATTLE_FACTORY_FUNC_GET_OPPONENT_STYLE] = GetOpponentBattleStyle,
+ [BATTLE_FACTORY_FUNC_RESET_HELD_ITEMS] = RestorePlayerPartyHeldItems,
};
-static const u32 gUnknown_08612164[][2] =
+static const u32 sWinStreakFlags[][2] =
{
- {0x100, 0x200},
- {0x1000000, 0x2000000},
+ {STREAK_FACTORY_SINGLES_50, STREAK_FACTORY_SINGLES_OPEN},
+ {STREAK_FACTORY_DOUBLES_50, STREAK_FACTORY_DOUBLES_OPEN},
};
-static const u32 gUnknown_08612174[][2] =
+static const u32 sWinStreakMasks[][2] =
{
- {0xfffffeff, 0xfffffdff},
- {0xfeffffff, 0xfdffffff},
+ {~(STREAK_FACTORY_SINGLES_50), ~(STREAK_FACTORY_SINGLES_OPEN)},
+ {~(STREAK_FACTORY_DOUBLES_50), ~(STREAK_FACTORY_DOUBLES_OPEN)},
};
static const u8 sFixedIVTable[][2] =
@@ -187,11 +191,11 @@ static void InitFactoryChallenge(void)
u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
- gSaveBlock2Ptr->frontier.field_CA8 = 0;
+ gSaveBlock2Ptr->frontier.challengeStatus = 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]))
+ gSaveBlock2Ptr->frontier.challengePaused = FALSE;
+ gSaveBlock2Ptr->frontier.disableRecordBattle = FALSE;
+ if (!(gSaveBlock2Ptr->frontier.winStreakActiveFlags & sWinStreakFlags[battleMode][lvlMode]))
{
gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] = 0;
gSaveBlock2Ptr->frontier.factoryRentsCount[battleMode][lvlMode] = 0;
@@ -200,7 +204,7 @@ static void InitFactoryChallenge(void)
sPerformedRentalSwap = FALSE;
for (i = 0; i < 6; i++)
gSaveBlock2Ptr->frontier.rentalMons[i].monId = 0xFFFF;
- for (i = 0; i < 3; i++)
+ for (i = 0; i < FRONTIER_PARTY_SIZE; i++)
gUnknown_03006298[i] = 0xFFFF;
SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
@@ -214,13 +218,13 @@ static void GetBattleFactoryData(void)
switch (gSpecialVar_0x8005)
{
- case 1:
+ case FACTORY_DATA_WIN_STREAK:
gSpecialVar_Result = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode];
break;
- case 2:
- gSpecialVar_Result = ((gSaveBlock2Ptr->frontier.field_CDC & gUnknown_08612164[battleMode][lvlMode]) != 0);
+ case FACTORY_DATA_WIN_STREAK_ACTIVE:
+ gSpecialVar_Result = ((gSaveBlock2Ptr->frontier.winStreakActiveFlags & sWinStreakFlags[battleMode][lvlMode]) != 0);
break;
- case 3:
+ case FACTORY_DATA_WIN_STREAK_SWAPS:
gSpecialVar_Result = gSaveBlock2Ptr->frontier.factoryRentsCount[battleMode][lvlMode];
break;
}
@@ -233,16 +237,16 @@ static void SetBattleFactoryData(void)
switch (gSpecialVar_0x8005)
{
- case 1:
+ case FACTORY_DATA_WIN_STREAK:
gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] = gSpecialVar_0x8006;
break;
- case 2:
+ case FACTORY_DATA_WIN_STREAK_ACTIVE:
if (gSpecialVar_0x8006)
- gSaveBlock2Ptr->frontier.field_CDC |= gUnknown_08612164[battleMode][lvlMode];
+ gSaveBlock2Ptr->frontier.winStreakActiveFlags |= sWinStreakFlags[battleMode][lvlMode];
else
- gSaveBlock2Ptr->frontier.field_CDC &= gUnknown_08612174[battleMode][lvlMode];
+ gSaveBlock2Ptr->frontier.winStreakActiveFlags &= sWinStreakMasks[battleMode][lvlMode];
break;
- case 3:
+ case FACTORY_DATA_WIN_STREAK_SWAPS:
if (sPerformedRentalSwap == TRUE)
{
gSaveBlock2Ptr->frontier.factoryRentsCount[battleMode][lvlMode] = gSpecialVar_0x8006;
@@ -252,12 +256,12 @@ static void SetBattleFactoryData(void)
}
}
-static void sub_81A613C(void)
+static void SaveFactoryChallenge(void)
{
- gSaveBlock2Ptr->frontier.field_CA8 = gSpecialVar_0x8005;
+ gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005;
VarSet(VAR_TEMP_0, 0);
- gSaveBlock2Ptr->frontier.field_CA9_a = 1;
- sub_81A4C30();
+ gSaveBlock2Ptr->frontier.challengePaused = TRUE;
+ SaveGameFrontier();
}
static void nullsub_75(void)
@@ -289,8 +293,8 @@ static void SetPerformedRentalSwap(void)
static void GenerateOpponentMons(void)
{
int i, j, k;
- u16 species[3];
- u16 heldItems[3];
+ u16 species[FRONTIER_PARTY_SIZE];
+ u16 heldItems[FRONTIER_PARTY_SIZE];
int firstMonId = 0;
u16 trainerId = 0;
u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
@@ -301,7 +305,7 @@ static void GenerateOpponentMons(void)
do
{
- trainerId = sub_8162548(challengeNum, gSaveBlock2Ptr->frontier.curChallengeBattleNum);
+ trainerId = GetRandomScaledFrontierTrainerId(challengeNum, gSaveBlock2Ptr->frontier.curChallengeBattleNum);
for (i = 0; i < gSaveBlock2Ptr->frontier.curChallengeBattleNum; i++)
{
if (gSaveBlock2Ptr->frontier.trainerIds[i] == trainerId)
@@ -314,7 +318,7 @@ static void GenerateOpponentMons(void)
gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = trainerId;
i = 0;
- while (i != 3)
+ while (i != FRONTIER_PARTY_SIZE)
{
u16 monSetId = GetMonSetId(lvlMode, challengeNum, FALSE);
if (gFacilityTrainerMons[monSetId].species == SPECIES_UNOWN)
@@ -328,7 +332,7 @@ static void GenerateOpponentMons(void)
if (j != 6)
continue;
- if (lvlMode == FRONTIER_LVL_50 && monSetId > 849)
+ if (lvlMode == FRONTIER_LVL_50 && monSetId > FRONTIER_MONS_HIGH_TIER)
continue;
for (k = firstMonId; k < firstMonId + i; k++)
@@ -368,7 +372,7 @@ static void SetRentalsToOpponentParty(void)
else
gFacilityTrainerMons = gSlateportBattleTentMons;
- for (i = 0; i < 3; i++)
+ for (i = 0; i < FRONTIER_PARTY_SIZE; i++)
{
gSaveBlock2Ptr->frontier.rentalMons[i + 3].monId = gUnknown_03006298[i];
gSaveBlock2Ptr->frontier.rentalMons[i + 3].ivs = GetBoxMonData(&gEnemyParty[i].box, MON_DATA_ATK_IV, NULL);
@@ -406,7 +410,7 @@ static void SetPlayerAndOpponentParties(void)
if (gSpecialVar_0x8005 < 2)
{
ZeroPlayerPartyMons();
- for (i = 0; i < 3; i++)
+ for (i = 0; i < FRONTIER_PARTY_SIZE; i++)
{
monSetId = gSaveBlock2Ptr->frontier.rentalMons[i].monId;
ivs = gSaveBlock2Ptr->frontier.rentalMons[i].ivs;
@@ -447,7 +451,7 @@ static void SetPlayerAndOpponentParties(void)
{
case 0:
case 2:
- for (i = 0; i < 3; i++)
+ for (i = 0; i < FRONTIER_PARTY_SIZE; i++)
{
monSetId = gSaveBlock2Ptr->frontier.rentalMons[i + 3].monId;
ivs = gSaveBlock2Ptr->frontier.rentalMons[i + 3].ivs;
@@ -587,7 +591,7 @@ static void GetOpponentMostCommonMonType(void)
gFacilityTrainerMons = gBattleFrontierMons;
for (i = 0; i < NUMBER_OF_MON_TYPES; i++)
typesCount[i] = 0;
- for (i = 0; i < 3; i++)
+ for (i = 0; i < FRONTIER_PARTY_SIZE; i++)
{
u32 species = gFacilityTrainerMons[gUnknown_03006298[i]].species;
@@ -616,14 +620,14 @@ static void GetOpponentMostCommonMonType(void)
static void GetOpponentBattleStyle(void)
{
u8 i, j, count;
- u8 stylePoints[8];
+ u8 stylePoints[FACTORY_NUM_STYLES];
count = 0;
gFacilityTrainerMons = gBattleFrontierMons;
- for (i = 0; i < 8; i++)
+ for (i = 0; i < FACTORY_NUM_STYLES; i++)
stylePoints[i] = 0;
- for (i = 0; i < 3; i++)
+ for (i = 0; i < FRONTIER_PARTY_SIZE; i++)
{
u16 monSetId = gUnknown_03006298[i];
for (j = 0; j < MAX_MON_MOVES; j++)
@@ -634,7 +638,7 @@ static void GetOpponentBattleStyle(void)
}
gSpecialVar_Result = 0;
- for (i = 1; i < 8; i++)
+ for (i = 1; i < FACTORY_NUM_STYLES; i++)
{
if (stylePoints[i] >= sRequiredMoveCounts[i - 1])
{
@@ -643,8 +647,9 @@ static void GetOpponentBattleStyle(void)
}
}
+ // Has no singular style
if (count > 2)
- gSpecialVar_Result = 8;
+ gSpecialVar_Result = FACTORY_NUM_STYLES;
}
static u8 GetMoveBattleStyle(u16 move)
@@ -654,13 +659,13 @@ static u8 GetMoveBattleStyle(u16 move)
for (i = 0; i < ARRAY_COUNT(sMoveStyles); i++)
{
- for (j = 0, moves = sMoveStyles[i]; moves[j] != 0; j++)
+ for (j = 0, moves = sMoveStyles[i]; moves[j] != MOVE_NONE; j++)
{
if (moves[j] == move)
return i + 1;
}
}
- return 0;
+ return FACTORY_STYLE_NONE;
}
bool8 InBattleFactory(void)
@@ -678,7 +683,7 @@ static void RestorePlayerPartyHeldItems(void)
else
gFacilityTrainerMons = gSlateportBattleTentMons;
- for (i = 0; i < 3; i++)
+ for (i = 0; i < FRONTIER_PARTY_SIZE; i++)
{
SetMonData(&gPlayerParty[i],
MON_DATA_HELD_ITEM,
@@ -702,8 +707,8 @@ u8 GetFactoryMonFixedIV(u8 arg0, u8 arg1)
void FillFactoryBrainParty(void)
{
int i, j, k;
- u16 species[3];
- u16 heldItems[3];
+ u16 species[FRONTIER_PARTY_SIZE];
+ u16 heldItems[FRONTIER_PARTY_SIZE];
u8 friendship;
int monLevel;
u8 fixedIV;
@@ -717,13 +722,13 @@ void FillFactoryBrainParty(void)
i = 0;
otId = T1_READ_32(gSaveBlock2Ptr->playerTrainerId);
- while (i != 3)
+ while (i != FRONTIER_PARTY_SIZE)
{
u16 monSetId = GetMonSetId(lvlMode, challengeNum, FALSE);
if (gFacilityTrainerMons[monSetId].species == SPECIES_UNOWN)
continue;
- if (monLevel == 50 && monSetId > 849)
+ if (monLevel == 50 && monSetId > FRONTIER_MONS_HIGH_TIER)
continue;
for (j = 0; j < 6; j++)