diff options
Diffstat (limited to 'src/battle_factory.c')
-rw-r--r-- | src/battle_factory.c | 161 |
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++) |