diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index d392d9362..f6077d358 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -106,8 +106,12 @@ #define B_HP_BERRIES GEN_6 // In Gen4+, berries which restore hp activate immediately after hp drops to half. In gen3, the effect occurs at the end of the turn. #define B_BERRIES_INSTANT GEN_6 // In Gen4+, most berries activate on battle start/switch-in if applicable. In gen3, they only activate either at the move end or turn end. +// Flag settings. Replace the 0s with defined flags to be able to toggle the following features using those flags. +#define B_FLAG_INVERSE_BATTLE 0 // If the flag is set, the battle's type effectiveness are inversed. For example, fire is super effective against water. +#define B_FLAG_FORCE_DOUBLE_WILD 0 // If the flag is set, all wild battles will be double battles. + // Other -#define B_FLAG_INVERSE_BATTLE 0 // If this flag is set, the battle's type effectiveness are inversed. For example, fire is super effective against water. 0 disables the feature. +#define B_DOUBLE_WILD_CHANCE 0 // % chance of encountering two Pokémon in a Wild Encounter. #define B_FAST_INTRO TRUE // If set to TRUE, battle intro texts print at the same time as animation of a Pokémon, as opposing to waiting for the animation to end. #define B_SHOW_TARGETS TRUE // If set to TRUE, all available targets, for moves hitting 2 or 3 Pokémon, will be shown before selecting a move. #define B_SLEEP_TURNS GEN_6 // In Gen5+, sleep lasts for 1-3 turns instead of 2-5 turns. diff --git a/include/wild_encounter.h b/include/wild_encounter.h index 55bbaa7dd..200243170 100644 --- a/include/wild_encounter.h +++ b/include/wild_encounter.h @@ -40,5 +40,6 @@ void FishingWildEncounter(u8 rod); u16 GetLocalWildMon(bool8 *isWaterMon); u16 GetLocalWaterMon(void); bool8 UpdateRepelCounter(void); +bool8 TryDoDoubleWildBattle(void); #endif // GUARD_WILD_ENCOUNTER_H diff --git a/src/wild_encounter.c b/src/wild_encounter.c index 0ff3e08ab..0f2b44e3e 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -610,7 +610,7 @@ bool8 StandardWildEncounter(u16 currMetaTileBehavior, u16 previousMetaTileBehavi // try a regular wild land encounter if (TryGenerateWildMon(gWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, WILD_CHECK_REPEL | WILD_CHECK_KEEN_EYE) == TRUE) { - if (USE_BATTLE_DEBUG && !GetSafariZoneFlag() && GetMonsStateToDoubles() == PLAYER_HAS_TWO_USABLE_MONS) + if (TryDoDoubleWildBattle()) { struct Pokemon mon1 = gEnemyParty[0]; TryGenerateWildMon(gWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, WILD_CHECK_KEEN_EYE); @@ -652,7 +652,17 @@ bool8 StandardWildEncounter(u16 currMetaTileBehavior, u16 previousMetaTileBehavi { if (TryGenerateWildMon(gWildMonHeaders[headerId].waterMonsInfo, WILD_AREA_WATER, WILD_CHECK_REPEL | WILD_CHECK_KEEN_EYE) == TRUE) { - BattleSetup_StartWildBattle(); + if (TryDoDoubleWildBattle()) + { + struct Pokemon mon1 = gEnemyParty[0]; + TryGenerateWildMon(gWildMonHeaders[headerId].waterMonsInfo, WILD_AREA_WATER, WILD_CHECK_KEEN_EYE); + gEnemyParty[1] = mon1; + BattleSetup_StartDoubleWildBattle(); + } + else + { + BattleSetup_StartWildBattle(); + } return TRUE; } @@ -957,3 +967,16 @@ static void ApplyCleanseTagEncounterRateMod(u32 *encRate) if (GetMonData(&gPlayerParty[0], MON_DATA_HELD_ITEM) == ITEM_CLEANSE_TAG) *encRate = *encRate * 2 / 3; } + +bool8 TryDoDoubleWildBattle(void) +{ + if (GetSafariZoneFlag() || GetMonsStateToDoubles() != PLAYER_HAS_TWO_USABLE_MONS) + return FALSE; + else if (B_FLAG_FORCE_DOUBLE_WILD != 0 && FlagGet(B_FLAG_FORCE_DOUBLE_WILD)) + return TRUE; + #if B_DOUBLE_WILD_CHANCE != 0 + else if ((Random() % 100) + 1 < B_DOUBLE_WILD_CHANCE) + return TRUE; + #endif + return FALSE; +}