Master to upcoming, 2025-09-06 (#7702)

Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com>
Co-authored-by: Eduardo Quezada <eduardo602002@gmail.com>
Co-authored-by: Hedara <hedara90@gmail.com>
Co-authored-by: Martin Griffin <martinrgriffin@gmail.com>
Co-authored-by: grintoul <166724814+grintoul1@users.noreply.github.com>
Co-authored-by: surskitty <surskitty@gmail.com>
This commit is contained in:
Alex 2025-09-06 20:25:27 +02:00 committed by GitHub
commit cb2754a186
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
41 changed files with 539 additions and 97 deletions

View File

@ -43,9 +43,10 @@ body:
label: Version
description: What version of pokeemerald-expansion are you using?
options:
- 1.13.0 (Latest release)
- 1.13.1 (Latest release)
- master (default, unreleased bugfixes)
- upcoming (Edge)
- 1.13.0
- 1.12.3
- 1.12.2
- 1.12.1

View File

@ -43,9 +43,10 @@ body:
label: Version
description: What version of pokeemerald-expansion are you using?
options:
- 1.13.0 (Latest release)
- 1.13.1 (Latest release)
- master (default, unreleased bugfixes)
- upcoming (Edge)
- 1.13.0
- 1.12.3
- 1.12.2
- 1.12.1

View File

@ -43,9 +43,10 @@ body:
label: Version
description: What version of pokeemerald-expansion are you using?
options:
- 1.13.0 (Latest release)
- 1.13.1 (Latest release)
- master (default, unreleased bugfixes)
- upcoming (Edge)
- 1.13.0
- 1.12.3
- 1.12.2
- 1.12.1

View File

@ -17,7 +17,7 @@
If you use **`pokeemerald-expansion`**, please credit **RHH (Rom Hacking Hideout)**. Optionally, include the version number for clarity.
```
Based off RHH's pokeemerald-expansion 1.13.0 https://github.com/rh-hideout/pokeemerald-expansion/
Based off RHH's pokeemerald-expansion 1.13.1 https://github.com/rh-hideout/pokeemerald-expansion/
```
Please consider [crediting all contributors](CREDITS.md) involved in the project!

View File

@ -2514,3 +2514,10 @@
callnative BS_TryBoosterEnergy
.byte \onFieldStatus
.endm
.macro jumpifgenconfiglowerthan tag:req, gen:req, jumpInstr:req
callnative BS_JumpIfGenConfigLowerThan
.2byte \tag
.byte \gen
.4byte \jumpInstr
.endm

View File

@ -14,6 +14,7 @@
#include "constants/game_stat.h"
#include "constants/trainers.h"
#include "constants/species.h"
#include "constants/generational_changes.h"
.include "asm/macros.inc"
.include "asm/macros/battle_script.inc"
.include "constants/constants.inc"
@ -2096,7 +2097,11 @@ BattleScript_EffectHealingWish::
setatkhptozero
tryfaintmon BS_ATTACKER
storehealingwish BS_ATTACKER
.if B_HEALING_WISH_SWITCH <= GEN_4
jumpifgenconfiglowerthan GEN_CONFIG_HEALING_WISH_SWITCH, GEN_5, BattleScript_EffectHealingWishGen4
BattleScript_EffectHealingWishEnd:
moveendall
end
BattleScript_EffectHealingWishGen4:
openpartyscreen BS_ATTACKER, BattleScript_EffectHealingWishEnd
waitstate
switchhandleorder BS_ATTACKER, 2
@ -2110,10 +2115,7 @@ BattleScript_EffectHealingWish::
switchinanim BS_ATTACKER, FALSE, TRUE
waitstate
switchineffects BS_ATTACKER
.endif
BattleScript_EffectHealingWishEnd:
moveendall
end
goto BattleScript_EffectHealingWishEnd
BattleScript_HealingWishActivates::
setbyte cMULTISTRING_CHOOSER, 0
@ -3792,12 +3794,13 @@ BattleScript_EffectFutureSight::
goto BattleScript_MoveEnd
BattleScript_EffectTeleport::
.if B_TELEPORT_BEHAVIOR >= GEN_8
jumpifgenconfiglowerthan GEN_CONFIG_TELEPORT_BEHAVIOR, GEN_8, BattleScript_EffectTeleportGen7
jumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_EffectBatonPass
jumpifside BS_ATTACKER, B_SIDE_PLAYER, BattleScript_EffectBatonPass
.else
goto BattleScript_DoEffectTeleport
BattleScript_EffectTeleportGen7::
jumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_FailedFromAtkCanceler
.endif
BattleScript_DoEffectTeleport::
attackcanceler
isrunningimpossible
jumpifbyte CMP_EQUAL, gBattleCommunication, BATTLE_RUN_FORBIDDEN, BattleScript_ButItFailed
@ -6022,10 +6025,10 @@ BattleScript_CudChewActivates::
end3
BattleScript_ApplyDisguiseFormChangeHPLoss::
.if B_DISGUISE_HP_LOSS >= GEN_8
jumpifgenconfiglowerthan GEN_CONFIG_DISGUISE_HP_LOSS, GEN_8, BattleScript_ApplyDisguiseFormChangeHPLossReturn
healthbarupdate BS_SCRIPTING
datahpupdate BS_SCRIPTING
.endif
BattleScript_ApplyDisguiseFormChangeHPLossReturn:
return
BattleScript_TargetFormChangeNoPopup:

View File

@ -20,6 +20,7 @@
- [Day/Night System FAQ](tutorials/dns.md)
- [Changelog](./CHANGELOG.md)
- [1.13.x]()
- [Version 1.13.1](changelogs/1.13.x/1.13.1.md)
- [Version 1.13.0](changelogs/1.13.x/1.13.0.md)
- [1.12.x]()
- [Version 1.12.3](changelogs/1.12.x/1.12.3.md)

View File

@ -0,0 +1,44 @@
```md
## How to update
- If you haven't set up a remote, run the command `git remote add RHH https://github.com/rh-hideout/pokeemerald-expansion`.
- Once you have your remote set up, run the command `git pull RHH expansion/1.13.1
`.
```
## 🧬 General 🧬
### Fixed
* Added sortType to Douse Drive by @fdeblasio in [#7664](https://github.com/rh-hideout/pokeemerald-expansion/pull/7664)
## 🐉 Pokémon 🐉
### Fixed
* Fixed disabled cross-evolutions still being possible by @AsparagusEduardo in [#7678](https://github.com/rh-hideout/pokeemerald-expansion/pull/7678)
## ⚔️ Battle General ⚔️
### Changed
* Replace boolean multiplications with ternaries by @hedara90 in [#7653](https://github.com/rh-hideout/pokeemerald-expansion/pull/7653)
## 🤖 Battle AI 🤖
### Fixed
* Helping Hand bugfix; used FOE instead of BATTLE_OPPOSITE. by @surskitty in [#7659](https://github.com/rh-hideout/pokeemerald-expansion/pull/7659)
## 🧹 Other Cleanup 🧹
* Replace boolean multiplications with ternaries by @hedara90 in [#7653](https://github.com/rh-hideout/pokeemerald-expansion/pull/7653)
* Fix Rage Fist test name by @AlexOn1ine in [#7681](https://github.com/rh-hideout/pokeemerald-expansion/pull/7681)
## 🧪 Test Runner 🧪
### Changed
* Fix Rage Fist test name by @AlexOn1ine in [#7681](https://github.com/rh-hideout/pokeemerald-expansion/pull/7681)
### Fixed
* Fix crashing tests duplicating tests from another thread by @hedara90 in [#7683](https://github.com/rh-hideout/pokeemerald-expansion/pull/7683)
## 📚 Documentation 📚
* Update README.md by @Bassoonian in [#7639](https://github.com/rh-hideout/pokeemerald-expansion/pull/7639)
**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.13.0...expansion/1.13.1
<!--Last PR: 7678-->
<!--Used to keep track of the last PR merged in case new ones come in before the changelog is done.-->

View File

@ -1,7 +1,7 @@
#ifndef GUARD_CONSTANTS_EXPANSION_H
#define GUARD_CONSTANTS_EXPANSION_H
// Last version: 1.13.0
// Last version: 1.13.1
#define EXPANSION_VERSION_MAJOR 1
#define EXPANSION_VERSION_MINOR 14
#define EXPANSION_VERSION_PATCH 0

View File

@ -30,6 +30,11 @@ enum GenConfigTag
GEN_ALLY_SWITCH_FAIL_CHANCE,
GEN_DREAM_EATER_LIQUID_OOZE,
GEN_CONFIG_TRANSISTOR_BOOST,
GEN_CONFIG_RECALC_TURN_AFTER_ACTIONS,
GEN_CONFIG_UPDATED_INTIMIDATE,
GEN_CONFIG_DISGUISE_HP_LOSS,
GEN_CONFIG_AFTER_YOU_TURN_ORDER,
GEN_CONFIG_HEALING_WISH_SWITCH,
GEN_CONFIG_COUNT
};

View File

@ -33,6 +33,11 @@ static const u8 sGenerationalChanges[GEN_CONFIG_COUNT] =
[GEN_ALLY_SWITCH_FAIL_CHANCE] = B_ALLY_SWITCH_FAIL_CHANCE,
[GEN_DREAM_EATER_LIQUID_OOZE] = B_DREAM_EATER_LIQUID_OOZE,
[GEN_CONFIG_TRANSISTOR_BOOST] = B_TRANSISTOR_BOOST,
[GEN_CONFIG_RECALC_TURN_AFTER_ACTIONS] = B_RECALC_TURN_AFTER_ACTIONS,
[GEN_CONFIG_UPDATED_INTIMIDATE] = B_UPDATED_INTIMIDATE,
[GEN_CONFIG_DISGUISE_HP_LOSS] = B_DISGUISE_HP_LOSS,
[GEN_CONFIG_AFTER_YOU_TURN_ORDER] = B_AFTER_YOU_TURN_ORDER,
[GEN_CONFIG_HEALING_WISH_SWITCH] = B_HEALING_WISH_SWITCH,
};
#if TESTING

View File

@ -19,6 +19,7 @@ SECTIONS {
{
__ewram_start = .;
*(.ewram*)
. = ALIGN(4);
__ewram_end = .;
} > EWRAM

View File

@ -1700,7 +1700,9 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
case EFFECT_TOXIC_THREAD:
if (!CanLowerStat(battlerAtk, battlerDef, aiData, STAT_SPEED))
ADJUST_SCORE(-1); // may still want to just poison
//fallthrough
if (!AI_CanPoison(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, aiData->partnerMove))
ADJUST_SCORE(-10);
break;
case EFFECT_LIGHT_SCREEN:
if (gSideStatuses[GetBattlerSide(battlerAtk)] & (SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL)
|| (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)))

View File

@ -1560,7 +1560,8 @@ bool32 CanTargetMoveFaintAi(u32 move, u32 battlerDef, u32 battlerAtk, u32 nHits)
u32 indexSlot = GetMoveSlot(GetMovesArray(battlerDef), move);
if (indexSlot < MAX_MON_MOVES)
{
if (GetNoOfHitsToKO(AI_GetDamage(battlerDef, battlerAtk, indexSlot, AI_DEFENDING, gAiLogicData), gBattleMons[battlerAtk].hp) <= nHits)
u32 hitsToKO = GetNoOfHitsToKO(AI_GetDamage(battlerDef, battlerAtk, indexSlot, AI_DEFENDING, gAiLogicData), gBattleMons[battlerAtk].hp);
if (hitsToKO <= nHits && hitsToKO != 0 && !(CanEndureHit(battlerDef, battlerAtk, move) && hitsToKO == 1))
return TRUE;
}
return FALSE;
@ -1589,8 +1590,15 @@ bool32 CanTargetFaintAiWithMod(u32 battlerDef, u32 battlerAtk, s32 hpMod, s32 dm
if (dmgMod)
dmg *= dmgMod;
if (dmg >= hpCheck)
// Applies modified HP percent to AI data for consideration when running CanEndureHit
gAiLogicData->hpPercents[battlerAtk] = (hpCheck/gBattleMons[battlerAtk].maxHP)*100;
if (dmg >= hpCheck && !(CanEndureHit(battlerDef, battlerAtk, moves[moveIndex]) && (dmgMod <= 1)))
{
gAiLogicData->hpPercents[battlerAtk] = (gBattleMons[battlerAtk].hp / gBattleMons[battlerAtk].maxHP) * 100;
return TRUE;
}
gAiLogicData->hpPercents[battlerAtk] = (gBattleMons[battlerAtk].hp / gBattleMons[battlerAtk].maxHP) * 100;
}
return FALSE;
@ -2776,7 +2784,7 @@ bool32 IsSwitchOutEffect(enum BattleMoveEffects effect)
switch (effect)
{
case EFFECT_TELEPORT:
if (B_TELEPORT_BEHAVIOR >= GEN_8)
if (GetGenConfig(GEN_CONFIG_TELEPORT_BEHAVIOR) >= GEN_8)
return TRUE;
case EFFECT_HIT_ESCAPE:
case EFFECT_PARTING_SHOT:

View File

@ -2288,7 +2288,7 @@ static void Cmd_datahpupdate(void)
gBattleMons[battler].species = SPECIES_MIMIKYU_BUSTED_TOTEM;
else
gBattleMons[battler].species = SPECIES_MIMIKYU_BUSTED;
if (B_DISGUISE_HP_LOSS >= GEN_8)
if (GetGenConfig(GEN_CONFIG_DISGUISE_HP_LOSS) >= GEN_8)
gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8;
BattleScriptPush(cmd->nextInstr);
gBattlescriptCurrInstr = BattleScript_TargetFormChange;
@ -7682,7 +7682,7 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler)
// Healing Wish activates before hazards.
// Starting from Gen8 - it heals only pokemon which can be healed. In gens 5,6,7 the effect activates anyways.
else if ((gBattleStruct->battlerState[battler].storedHealingWish || gBattleStruct->battlerState[battler].storedLunarDance)
&& (gBattleMons[battler].hp != gBattleMons[battler].maxHP || gBattleMons[battler].status1 != 0 || B_HEALING_WISH_SWITCH < GEN_8))
&& (gBattleMons[battler].hp != gBattleMons[battler].maxHP || gBattleMons[battler].status1 != 0 || GetGenConfig(GEN_CONFIG_HEALING_WISH_SWITCH) < GEN_8))
{
gBattlerAttacker = battler;
if (gBattleStruct->battlerState[battler].storedHealingWish)
@ -9379,7 +9379,7 @@ static bool32 ChangeOrderTargetAfterAttacker(void)
if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget))
return FALSE;
if (GetBattlerTurnOrderNum(gBattlerAttacker) + 1 == GetBattlerTurnOrderNum(gBattlerTarget))
return B_AFTER_YOU_TURN_ORDER >= GEN_8;
return GetGenConfig(GEN_CONFIG_AFTER_YOU_TURN_ORDER) >= GEN_8;
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
@ -16257,7 +16257,7 @@ void BS_JumpIfIntimidateAbilityPrevented(void)
case ABILITY_SCRAPPY:
case ABILITY_OWN_TEMPO:
case ABILITY_OBLIVIOUS:
if (B_UPDATED_INTIMIDATE >= GEN_8)
if (GetGenConfig(GEN_CONFIG_UPDATED_INTIMIDATE) >= GEN_8)
{
hasAbility = TRUE;
gBattlescriptCurrInstr = BattleScript_IntimidatePrevented;
@ -18015,3 +18015,12 @@ void BS_BattlerItemToLastUsedItem(void)
gBattleMons[gBattlerTarget].item = gLastUsedItem;
gBattlescriptCurrInstr = cmd->nextInstr;
}
void BS_JumpIfGenConfigLowerThan(void)
{
NATIVE_ARGS(u16 tag, u8 gen, const u8 *jumpInstr);
if (GetGenConfig(cmd->tag) < cmd->gen)
gBattlescriptCurrInstr = cmd->jumpInstr;
else
gBattlescriptCurrInstr = cmd->nextInstr;
}

View File

@ -925,7 +925,7 @@ void HandleAction_ActionFinished(void)
gBattleResources->battleScriptsStack->size = 0;
gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_NONE;
if (B_RECALC_TURN_AFTER_ACTIONS >= GEN_8 && !afterYouActive && !gBattleStruct->pledgeMove && !IsPursuitTargetSet())
if (GetGenConfig(GEN_CONFIG_RECALC_TURN_AFTER_ACTIONS) >= GEN_8 && !afterYouActive && !gBattleStruct->pledgeMove && !IsPursuitTargetSet())
{
// i starts at `gCurrentTurnActionNumber` because we don't want to recalculate turn order for mon that have already
// taken action. It's been previously increased, which we want in order to not recalculate the turn of the mon that just finished its action
@ -1206,7 +1206,9 @@ void PrepareStringBattle(enum StringID stringId, u32 battler)
else
SET_STATCHANGER(STAT_SPATK, 2, FALSE);
}
else if (B_UPDATED_INTIMIDATE >= GEN_8 && stringId == STRINGID_PKMNCUTSATTACKWITH && targetAbility == ABILITY_RATTLED
else if (GetGenConfig(GEN_CONFIG_UPDATED_INTIMIDATE) >= GEN_8
&& stringId == STRINGID_PKMNCUTSATTACKWITH
&& targetAbility == ABILITY_RATTLED
&& CompareStat(gBattlerTarget, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN))
{
gBattlerAbility = gBattlerTarget;

View File

@ -5730,7 +5730,9 @@ const struct SpeciesInfo gSpeciesInfoGen1[] =
)
.levelUpLearnset = sGolbatLevelUpLearnset,
.teachableLearnset = sGolbatTeachableLearnset,
#if P_GEN_2_CROSS_EVOS
.evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_CROBAT, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}),
#endif
},
#if P_GEN_2_CROSS_EVOS
@ -5979,8 +5981,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] =
)
.levelUpLearnset = sGloomLevelUpLearnset,
.teachableLearnset = sGloomTeachableLearnset,
.evolutions = EVOLUTION({EVO_ITEM, ITEM_LEAF_STONE, SPECIES_VILEPLUME},
{EVO_ITEM, ITEM_SUN_STONE, SPECIES_BELLOSSOM}),
.evolutions = EVOLUTION({EVO_ITEM, ITEM_LEAF_STONE, SPECIES_VILEPLUME}
#if P_GEN_2_CROSS_EVOS
,{EVO_ITEM, ITEM_SUN_STONE, SPECIES_BELLOSSOM}
#endif
),
},
[SPECIES_VILEPLUME] =
@ -7577,7 +7582,9 @@ const struct SpeciesInfo gSpeciesInfoGen1[] =
)
.levelUpLearnset = sPrimeapeLevelUpLearnset,
.teachableLearnset = sPrimeapeTeachableLearnset,
#if P_GEN_9_CROSS_EVOS
.evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_ANNIHILAPE, CONDITIONS({IF_USED_MOVE_X_TIMES, MOVE_RAGE_FIST, 20})}),
#endif
},
#if P_GEN_9_CROSS_EVOS
@ -8064,9 +8071,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] =
)
.levelUpLearnset = sPoliwhirlLevelUpLearnset,
.teachableLearnset = sPoliwhirlTeachableLearnset,
.evolutions = EVOLUTION({EVO_ITEM, ITEM_WATER_STONE, SPECIES_POLIWRATH},
{EVO_TRADE, 0, SPECIES_POLITOED, CONDITIONS({IF_HOLD_ITEM, ITEM_KINGS_ROCK})},
{EVO_ITEM, ITEM_KINGS_ROCK, SPECIES_POLITOED}),
.evolutions = EVOLUTION({EVO_ITEM, ITEM_WATER_STONE, SPECIES_POLIWRATH}
#if P_GEN_2_CROSS_EVOS
,{EVO_TRADE, 0, SPECIES_POLITOED, CONDITIONS({IF_HOLD_ITEM, ITEM_KINGS_ROCK})},
{EVO_ITEM, ITEM_KINGS_ROCK, SPECIES_POLITOED}
#endif
),
},
[SPECIES_POLIWRATH] =
@ -10045,9 +10055,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] =
.teachableLearnset = sSlowpokeTeachableLearnset,
.eggMoveLearnset = sSlowpokeEggMoveLearnset,
.formSpeciesIdTable = sSlowpokeFormSpeciesIdTable,
.evolutions = EVOLUTION({EVO_LEVEL, 37, SPECIES_SLOWBRO},
{EVO_TRADE, 0, SPECIES_SLOWKING, CONDITIONS({IF_HOLD_ITEM, ITEM_KINGS_ROCK})},
{EVO_ITEM, ITEM_KINGS_ROCK, SPECIES_SLOWKING}),
.evolutions = EVOLUTION({EVO_LEVEL, 37, SPECIES_SLOWBRO}
#if P_GEN_2_CROSS_EVOS
,{EVO_TRADE, 0, SPECIES_SLOWKING, CONDITIONS({IF_HOLD_ITEM, ITEM_KINGS_ROCK})},
{EVO_ITEM, ITEM_KINGS_ROCK, SPECIES_SLOWKING}
#endif
),
},
[SPECIES_SLOWBRO] =
@ -10326,8 +10339,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] =
.teachableLearnset = sSlowpokeGalarTeachableLearnset,
.eggMoveLearnset = sSlowpokeGalarEggMoveLearnset,
.formSpeciesIdTable = sSlowpokeFormSpeciesIdTable,
.evolutions = EVOLUTION({EVO_ITEM, ITEM_GALARICA_CUFF, SPECIES_SLOWBRO_GALAR},
{EVO_ITEM, ITEM_GALARICA_WREATH, SPECIES_SLOWKING_GALAR}),
.evolutions = EVOLUTION({EVO_ITEM, ITEM_GALARICA_CUFF, SPECIES_SLOWBRO_GALAR}
#if P_GEN_2_CROSS_EVOS
,{EVO_ITEM, ITEM_GALARICA_WREATH, SPECIES_SLOWKING_GALAR}
#endif
),
},
[SPECIES_SLOWBRO_GALAR] =
@ -10609,8 +10625,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] =
)
.levelUpLearnset = sMagnetonLevelUpLearnset,
.teachableLearnset = sMagnetonTeachableLearnset,
#if P_GEN_4_CROSS_EVOS
.evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_MAGNEZONE, CONDITIONS({IF_IN_MAPSEC, MAPSEC_NEW_MAUVILLE})},
{EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_MAGNEZONE}),
#endif
},
#if P_GEN_4_CROSS_EVOS
@ -12107,8 +12125,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] =
.levelUpLearnset = sOnixLevelUpLearnset,
.teachableLearnset = sOnixTeachableLearnset,
.eggMoveLearnset = sOnixEggMoveLearnset,
#if P_GEN_2_CROSS_EVOS
.evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_STEELIX, CONDITIONS({IF_HOLD_ITEM, ITEM_METAL_COAT})},
{EVO_ITEM, ITEM_METAL_COAT, SPECIES_STEELIX}),
#endif
},
#if P_GEN_2_CROSS_EVOS
@ -13805,7 +13825,9 @@ const struct SpeciesInfo gSpeciesInfoGen1[] =
.levelUpLearnset = sLickitungLevelUpLearnset,
.teachableLearnset = sLickitungTeachableLearnset,
.eggMoveLearnset = sLickitungEggMoveLearnset,
#if P_GEN_4_CROSS_EVOS
.evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_LICKILICKY, CONDITIONS({IF_KNOWS_MOVE, MOVE_ROLLOUT})}),
#endif
},
#if P_GEN_4_CROSS_EVOS
@ -14274,8 +14296,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] =
)
.levelUpLearnset = sRhydonLevelUpLearnset,
.teachableLearnset = sRhydonTeachableLearnset,
#if P_GEN_4_CROSS_EVOS
.evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_RHYPERIOR, CONDITIONS({IF_HOLD_ITEM, ITEM_PROTECTOR})},
{EVO_ITEM, ITEM_PROTECTOR, SPECIES_RHYPERIOR}),
#endif
},
#if P_GEN_4_CROSS_EVOS
@ -14510,7 +14534,9 @@ const struct SpeciesInfo gSpeciesInfoGen1[] =
.levelUpLearnset = sChanseyLevelUpLearnset,
.teachableLearnset = sChanseyTeachableLearnset,
.eggMoveLearnset = sChanseyEggMoveLearnset,
#if P_GEN_2_CROSS_EVOS
.evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_BLISSEY, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}),
#endif
},
#if P_GEN_2_CROSS_EVOS
@ -14655,7 +14681,9 @@ const struct SpeciesInfo gSpeciesInfoGen1[] =
.levelUpLearnset = sTangelaLevelUpLearnset,
.teachableLearnset = sTangelaTeachableLearnset,
.eggMoveLearnset = sTangelaEggMoveLearnset,
#if P_GEN_4_CROSS_EVOS
.evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_TANGROWTH, CONDITIONS({IF_KNOWS_MOVE, MOVE_ANCIENT_POWER})}),
#endif
},
#if P_GEN_4_CROSS_EVOS
@ -15037,8 +15065,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] =
)
.levelUpLearnset = sSeadraLevelUpLearnset,
.teachableLearnset = sSeadraTeachableLearnset,
#if P_GEN_2_CROSS_EVOS
.evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_KINGDRA, CONDITIONS({IF_HOLD_ITEM, ITEM_DRAGON_SCALE})},
{EVO_ITEM, ITEM_DRAGON_SCALE, SPECIES_KINGDRA}),
#endif
},
#if P_GEN_2_CROSS_EVOS
@ -15826,9 +15856,20 @@ const struct SpeciesInfo gSpeciesInfoGen1[] =
.levelUpLearnset = sScytherLevelUpLearnset,
.teachableLearnset = sScytherTeachableLearnset,
.eggMoveLearnset = sScytherEggMoveLearnset,
.evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_SCIZOR, CONDITIONS({IF_HOLD_ITEM, ITEM_METAL_COAT})},
{EVO_ITEM, ITEM_BLACK_AUGURITE, SPECIES_KLEAVOR},
{EVO_ITEM, ITEM_METAL_COAT, SPECIES_SCIZOR}),
#if P_GEN_2_CROSS_EVOS || P_GEN_8_CROSS_EVOS
.evolutions = EVOLUTION(
#if P_GEN_2_CROSS_EVOS
{EVO_TRADE, 0, SPECIES_SCIZOR, CONDITIONS({IF_HOLD_ITEM, ITEM_METAL_COAT})},
{EVO_ITEM, ITEM_METAL_COAT, SPECIES_SCIZOR}
#if P_GEN_8_CROSS_EVOS
,
#endif
#endif
#if P_GEN_8_CROSS_EVOS
{EVO_ITEM, ITEM_BLACK_AUGURITE, SPECIES_KLEAVOR}
#endif
),
#endif
},
#if P_GEN_2_CROSS_EVOS
@ -16346,8 +16387,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] =
)
.levelUpLearnset = sElectabuzzLevelUpLearnset,
.teachableLearnset = sElectabuzzTeachableLearnset,
#if P_GEN_4_CROSS_EVOS
.evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_ELECTIVIRE, CONDITIONS({IF_HOLD_ITEM, ITEM_ELECTIRIZER})},
{EVO_ITEM, ITEM_ELECTIRIZER, SPECIES_ELECTIVIRE}),
#endif
},
#if P_GEN_4_CROSS_EVOS
@ -16567,8 +16610,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] =
)
.levelUpLearnset = sMagmarLevelUpLearnset,
.teachableLearnset = sMagmarTeachableLearnset,
#if P_GEN_4_CROSS_EVOS
.evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_MAGMORTAR, CONDITIONS({IF_HOLD_ITEM, ITEM_MAGMARIZER})},
{EVO_ITEM, ITEM_MAGMARIZER, SPECIES_MAGMORTAR}),
#endif
},
#if P_GEN_4_CROSS_EVOS
@ -17609,14 +17654,21 @@ const struct SpeciesInfo gSpeciesInfoGen1[] =
.formChangeTable = sEeveeFormChangeTable,
.evolutions = EVOLUTION({EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_JOLTEON},
{EVO_ITEM, ITEM_WATER_STONE, SPECIES_VAPOREON},
{EVO_ITEM, ITEM_FIRE_STONE, SPECIES_FLAREON},
{EVO_LEVEL, 0, SPECIES_SYLVEON, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD}, {IF_KNOWS_MOVE_TYPE, TYPE_FAIRY})},
{EVO_LEVEL, 0, SPECIES_ESPEON, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD}, {IF_NOT_TIME, TIME_NIGHT})},
{EVO_LEVEL, 0, SPECIES_UMBREON, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD}, {IF_TIME, TIME_NIGHT})},
{EVO_LEVEL, 0, SPECIES_LEAFEON, CONDITIONS({IF_IN_MAP, MAP_PETALBURG_WOODS})},
{EVO_ITEM, ITEM_FIRE_STONE, SPECIES_FLAREON}
#if P_GEN_6_CROSS_EVOS
,{EVO_LEVEL, 0, SPECIES_SYLVEON, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD}, {IF_KNOWS_MOVE_TYPE, TYPE_FAIRY})}
#endif
#if P_GEN_2_CROSS_EVOS
,{EVO_LEVEL, 0, SPECIES_ESPEON, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD}, {IF_NOT_TIME, TIME_NIGHT})},
{EVO_LEVEL, 0, SPECIES_UMBREON, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD}, {IF_TIME, TIME_NIGHT})}
#endif
#if P_GEN_4_CROSS_EVOS
,{EVO_LEVEL, 0, SPECIES_LEAFEON, CONDITIONS({IF_IN_MAP, MAP_PETALBURG_WOODS})},
{EVO_ITEM, ITEM_LEAF_STONE, SPECIES_LEAFEON},
{EVO_LEVEL, 0, SPECIES_GLACEON, CONDITIONS({IF_IN_MAP, MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM})},
{EVO_ITEM, ITEM_ICE_STONE, SPECIES_GLACEON}),
{EVO_ITEM, ITEM_ICE_STONE, SPECIES_GLACEON}
#endif
),
},
#if P_GIGANTAMAX_FORMS
@ -18366,8 +18418,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] =
)
.levelUpLearnset = sPorygonLevelUpLearnset,
.teachableLearnset = sPorygonTeachableLearnset,
#if P_GEN_2_CROSS_EVOS
.evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_PORYGON2, CONDITIONS({IF_HOLD_ITEM, ITEM_UPGRADE})},
{EVO_ITEM, ITEM_UPGRADE, SPECIES_PORYGON2}),
#endif
},
#if P_GEN_2_CROSS_EVOS
@ -18443,8 +18497,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] =
)
.levelUpLearnset = sPorygon2LevelUpLearnset,
.teachableLearnset = sPorygon2TeachableLearnset,
#if P_GEN_4_CROSS_EVOS
.evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_PORYGON_Z, CONDITIONS({IF_HOLD_ITEM, ITEM_DUBIOUS_DISC})},
{EVO_ITEM, ITEM_DUBIOUS_DISC, SPECIES_PORYGON_Z}),
#endif
},
#if P_GEN_4_CROSS_EVOS

View File

@ -1619,7 +1619,9 @@ const struct SpeciesInfo gSpeciesInfoGen2[] =
)
.levelUpLearnset = sTogeticLevelUpLearnset,
.teachableLearnset = sTogeticTeachableLearnset,
#if P_GEN_4_CROSS_EVOS
.evolutions = EVOLUTION({EVO_ITEM, ITEM_SHINY_STONE, SPECIES_TOGEKISS}),
#endif
},
#if P_GEN_4_CROSS_EVOS
@ -2868,7 +2870,9 @@ const struct SpeciesInfo gSpeciesInfoGen2[] =
.levelUpLearnset = sAipomLevelUpLearnset,
.teachableLearnset = sAipomTeachableLearnset,
.eggMoveLearnset = sAipomEggMoveLearnset,
#if P_GEN_4_CROSS_EVOS
.evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_AMBIPOM, CONDITIONS({IF_KNOWS_MOVE, MOVE_DOUBLE_HIT})}),
#endif
},
#if P_GEN_4_CROSS_EVOS
@ -3191,7 +3195,9 @@ const struct SpeciesInfo gSpeciesInfoGen2[] =
.levelUpLearnset = sYanmaLevelUpLearnset,
.teachableLearnset = sYanmaTeachableLearnset,
.eggMoveLearnset = sYanmaEggMoveLearnset,
#if P_GEN_4_CROSS_EVOS
.evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_YANMEGA, CONDITIONS({IF_KNOWS_MOVE, MOVE_ANCIENT_POWER})}),
#endif
},
#if P_GEN_4_CROSS_EVOS
@ -3669,7 +3675,9 @@ const struct SpeciesInfo gSpeciesInfoGen2[] =
.levelUpLearnset = sMurkrowLevelUpLearnset,
.teachableLearnset = sMurkrowTeachableLearnset,
.eggMoveLearnset = sMurkrowEggMoveLearnset,
#if P_GEN_4_CROSS_EVOS
.evolutions = EVOLUTION({EVO_ITEM, ITEM_DUSK_STONE, SPECIES_HONCHKROW}),
#endif
},
#if P_GEN_4_CROSS_EVOS
@ -3819,7 +3827,9 @@ const struct SpeciesInfo gSpeciesInfoGen2[] =
.levelUpLearnset = sMisdreavusLevelUpLearnset,
.teachableLearnset = sMisdreavusTeachableLearnset,
.eggMoveLearnset = sMisdreavusEggMoveLearnset,
#if P_GEN_4_CROSS_EVOS
.evolutions = EVOLUTION({EVO_ITEM, ITEM_DUSK_STONE, SPECIES_MISMAGIUS}),
#endif
},
#if P_GEN_4_CROSS_EVOS
@ -4239,7 +4249,9 @@ const struct SpeciesInfo gSpeciesInfoGen2[] =
.levelUpLearnset = sGirafarigLevelUpLearnset,
.teachableLearnset = sGirafarigTeachableLearnset,
.eggMoveLearnset = sGirafarigEggMoveLearnset,
#if P_GEN_9_CROSS_EVOS
.evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_FARIGIRAF, CONDITIONS({IF_KNOWS_MOVE, MOVE_TWIN_BEAM})}),
#endif
},
#if P_GEN_9_CROSS_EVOS
@ -4527,8 +4539,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] =
.levelUpLearnset = sDunsparceLevelUpLearnset,
.teachableLearnset = sDunsparceTeachableLearnset,
.eggMoveLearnset = sDunsparceEggMoveLearnset,
#if P_GEN_9_CROSS_EVOS
.evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_DUDUNSPARCE_TWO_SEGMENT, CONDITIONS({IF_KNOWS_MOVE, MOVE_HYPER_DRILL}, {IF_PID_MODULO_100_GT, 0})},
{EVO_LEVEL, 0, SPECIES_DUDUNSPARCE_THREE_SEGMENT, CONDITIONS({IF_KNOWS_MOVE, MOVE_HYPER_DRILL}, {IF_PID_MODULO_100_EQ, 0})}),
#endif
},
#if P_GEN_9_CROSS_EVOS
@ -4742,8 +4756,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] =
.levelUpLearnset = sGligarLevelUpLearnset,
.teachableLearnset = sGligarTeachableLearnset,
.eggMoveLearnset = sGligarEggMoveLearnset,
.evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_GLISCOR, CONDITIONS({IF_TIME, TIME_NIGHT}, {IF_HOLD_ITEM, ITEM_RAZOR_FANG})},
#if P_GEN_4_CROSS_EVOS
.evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_GLISCOR, CONDITIONS({IF_TIME, TIME_NIGHT}, {IF_HOLD_ITEM, ITEM_RAZOR_FANG})},
{EVO_ITEM, ITEM_RAZOR_FANG, SPECIES_GLISCOR, CONDITIONS({IF_TIME, TIME_NIGHT})}),
#endif
},
#if P_GEN_4_CROSS_EVOS
@ -5506,8 +5522,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] =
.teachableLearnset = sSneaselTeachableLearnset,
.eggMoveLearnset = sSneaselEggMoveLearnset,
.formSpeciesIdTable = sSneaselFormSpeciesIdTable,
.evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_WEAVILE, CONDITIONS({IF_TIME, TIME_NIGHT}, {IF_HOLD_ITEM, ITEM_RAZOR_CLAW})},
#if P_GEN_4_CROSS_EVOS
.evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_WEAVILE, CONDITIONS({IF_TIME, TIME_NIGHT}, {IF_HOLD_ITEM, ITEM_RAZOR_CLAW})},
{EVO_ITEM, ITEM_RAZOR_CLAW, SPECIES_WEAVILE, CONDITIONS({IF_TIME, TIME_NIGHT})}),
#endif
},
#if P_GEN_4_CROSS_EVOS
@ -5672,7 +5690,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] =
.levelUpLearnset = sSneaselHisuiLevelUpLearnset,
.teachableLearnset = sSneaselHisuiTeachableLearnset,
.formSpeciesIdTable = sSneaselFormSpeciesIdTable,
.evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_SNEASLER, CONDITIONS({IF_NOT_TIME, TIME_NIGHT}, {IF_HOLD_ITEM, ITEM_RAZOR_CLAW})},
.evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_SNEASLER, CONDITIONS({IF_NOT_TIME, TIME_NIGHT}, {IF_HOLD_ITEM, ITEM_RAZOR_CLAW})},
{EVO_ITEM, ITEM_RAZOR_CLAW, SPECIES_SNEASLER, CONDITIONS({IF_NOT_TIME, TIME_NIGHT})}),
},
@ -5897,8 +5915,10 @@ const struct SpeciesInfo gSpeciesInfoGen2[] =
)
.levelUpLearnset = sUrsaringLevelUpLearnset,
.teachableLearnset = sUrsaringTeachableLearnset,
#if P_GEN_8_CROSS_EVOS
.evolutions = EVOLUTION({EVO_ITEM, ITEM_PEAT_BLOCK, SPECIES_URSALUNA, CONDITIONS({IF_TIME, TIME_NIGHT})},
{EVO_NONE, 0, SPECIES_URSALUNA_BLOODMOON}),
#endif
},
#if P_GEN_8_CROSS_EVOS
@ -6330,7 +6350,9 @@ const struct SpeciesInfo gSpeciesInfoGen2[] =
)
.levelUpLearnset = sPiloswineLevelUpLearnset,
.teachableLearnset = sPiloswineTeachableLearnset,
#if P_GEN_4_CROSS_EVOS
.evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_MAMOSWINE, CONDITIONS({IF_KNOWS_MOVE, MOVE_ANCIENT_POWER})}),
#endif
},
#if P_GEN_4_CROSS_EVOS
@ -7534,7 +7556,9 @@ const struct SpeciesInfo gSpeciesInfoGen2[] =
.levelUpLearnset = sStantlerLevelUpLearnset,
.teachableLearnset = sStantlerTeachableLearnset,
.eggMoveLearnset = sStantlerEggMoveLearnset,
#if P_GEN_8_CROSS_EVOS
.evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_WYRDEER, CONDITIONS({IF_USED_MOVE_X_TIMES, MOVE_PSYSHIELD_BASH, 20})}),
#endif
},
#if P_GEN_8_CROSS_EVOS

View File

@ -2801,8 +2801,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] =
)
.levelUpLearnset = sKirliaLevelUpLearnset,
.teachableLearnset = sKirliaTeachableLearnset,
.evolutions = EVOLUTION({EVO_LEVEL, 30, SPECIES_GARDEVOIR},
{EVO_ITEM, ITEM_DAWN_STONE, SPECIES_GALLADE, CONDITIONS({IF_GENDER, MON_MALE})}),
.evolutions = EVOLUTION({EVO_LEVEL, 30, SPECIES_GARDEVOIR}
#if P_GEN_4_CROSS_EVOS
,{EVO_ITEM, ITEM_DAWN_STONE, SPECIES_GALLADE, CONDITIONS({IF_GENDER, MON_MALE})}
#endif
),
},
[SPECIES_GARDEVOIR] =
@ -4314,8 +4317,10 @@ const struct SpeciesInfo gSpeciesInfoGen3[] =
.levelUpLearnset = sNosepassLevelUpLearnset,
.teachableLearnset = sNosepassTeachableLearnset,
.eggMoveLearnset = sNosepassEggMoveLearnset,
#if P_GEN_4_CROSS_EVOS
.evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_PROBOPASS, CONDITIONS({IF_IN_MAPSEC, MAPSEC_NEW_MAUVILLE})},
{EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_PROBOPASS}),
#endif
},
#if P_GEN_4_CROSS_EVOS
@ -6069,7 +6074,9 @@ const struct SpeciesInfo gSpeciesInfoGen3[] =
.levelUpLearnset = sRoseliaLevelUpLearnset,
.teachableLearnset = sRoseliaTeachableLearnset,
.eggMoveLearnset = sRoseliaEggMoveLearnset,
#if P_GEN_4_CROSS_EVOS
.evolutions = EVOLUTION({EVO_ITEM, ITEM_SHINY_STONE, SPECIES_ROSERADE}),
#endif
},
#if P_GEN_4_CROSS_EVOS
@ -9900,8 +9907,10 @@ const struct SpeciesInfo gSpeciesInfoGen3[] =
)
.levelUpLearnset = sDusclopsLevelUpLearnset,
.teachableLearnset = sDusclopsTeachableLearnset,
#if P_GEN_4_CROSS_EVOS
.evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_DUSKNOIR, CONDITIONS({IF_HOLD_ITEM, ITEM_REAPER_CLOTH})},
{EVO_ITEM, ITEM_REAPER_CLOTH, SPECIES_DUSKNOIR}),
#endif
},
#if P_GEN_4_CROSS_EVOS
@ -10459,8 +10468,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] =
.levelUpLearnset = sSnoruntLevelUpLearnset,
.teachableLearnset = sSnoruntTeachableLearnset,
.eggMoveLearnset = sSnoruntEggMoveLearnset,
.evolutions = EVOLUTION({EVO_LEVEL, 42, SPECIES_GLALIE},
{EVO_ITEM, ITEM_DAWN_STONE, SPECIES_FROSLASS, CONDITIONS({IF_GENDER, MON_FEMALE})}),
.evolutions = EVOLUTION({EVO_LEVEL, 42, SPECIES_GLALIE}
#if P_GEN_4_CROSS_EVOS
,{EVO_ITEM, ITEM_DAWN_STONE, SPECIES_FROSLASS, CONDITIONS({IF_GENDER, MON_FEMALE})}
#endif
),
},
[SPECIES_GLALIE] =

View File

@ -11107,7 +11107,9 @@ const struct SpeciesInfo gSpeciesInfoGen5[] =
)
.levelUpLearnset = sBisharpLevelUpLearnset,
.teachableLearnset = sBisharpTeachableLearnset,
#if P_GEN_9_CROSS_EVOS
.evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_KINGAMBIT, CONDITIONS({IF_DEFEAT_X_WITH_ITEMS, SPECIES_BISHARP, ITEM_LEADERS_CREST, 3})}),
#endif
},
#if P_GEN_9_CROSS_EVOS

View File

@ -2466,8 +2466,11 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
.teachableLearnset = sApplinTeachableLearnset,
.eggMoveLearnset = sApplinEggMoveLearnset,
.evolutions = EVOLUTION({EVO_ITEM, ITEM_TART_APPLE, SPECIES_FLAPPLE},
{EVO_ITEM, ITEM_SWEET_APPLE, SPECIES_APPLETUN},
{EVO_ITEM, ITEM_SYRUPY_APPLE, SPECIES_DIPPLIN}),
{EVO_ITEM, ITEM_SWEET_APPLE, SPECIES_APPLETUN}
#if P_GEN_9_CROSS_EVOS
,{EVO_ITEM, ITEM_SYRUPY_APPLE, SPECIES_DIPPLIN}
#endif
),
},
[SPECIES_FLAPPLE] =
@ -6405,7 +6408,9 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
.eggMoveLearnset = sDuraludonEggMoveLearnset,
.formSpeciesIdTable = sDuraludonFormSpeciesIdTable,
.formChangeTable = sDuraludonFormChangeTable,
#if P_GEN_9_CROSS_EVOS
.evolutions = EVOLUTION({EVO_ITEM, ITEM_METAL_ALLOY, SPECIES_ARCHALUDON}),
#endif
},
#if P_GIGANTAMAX_FORMS

View File

@ -6,11 +6,30 @@ ASSUMPTIONS
ASSUME(GetMoveCategory(MOVE_AERIAL_ACE) == DAMAGE_CATEGORY_PHYSICAL);
}
SINGLE_BATTLE_TEST("Disguised Mimikyu will lose 1/8 of its max HP upon changing to its busted form")
SINGLE_BATTLE_TEST("Disguised Mimikyu doesn't lose 1/8 of its max HP upon changing to its busted form (Gen7)")
{
GIVEN {
WITH_CONFIG(GEN_CONFIG_DISGUISE_HP_LOSS, GEN_7);
PLAYER(SPECIES_MIMIKYU_DISGUISED) { Ability(ABILITY_DISGUISE); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(opponent, MOVE_AERIAL_ACE); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_AERIAL_ACE, opponent);
NOT HP_BAR(player);
ABILITY_POPUP(player, ABILITY_DISGUISE);
} THEN {
EXPECT_EQ(player->species, SPECIES_MIMIKYU_BUSTED);
EXPECT_EQ(player->hp, player->maxHP);
}
}
SINGLE_BATTLE_TEST("Disguised Mimikyu will lose 1/8 of its max HP upon changing to its busted form (Gen8+)")
{
s16 disguiseDamage;
GIVEN {
WITH_CONFIG(GEN_CONFIG_DISGUISE_HP_LOSS, GEN_8);
PLAYER(SPECIES_MIMIKYU_DISGUISED) { Ability(ABILITY_DISGUISE); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {

View File

@ -1,13 +1,40 @@
#include "global.h"
#include "test/battle.h"
SINGLE_BATTLE_TEST("Inner Focus prevents intimidate")
SINGLE_BATTLE_TEST("Inner Focus doesn't prevent intimidate (Gen3-7)")
{
s16 turnOneHit;
s16 turnTwoHit;
GIVEN {
ASSUME(B_UPDATED_INTIMIDATE >= GEN_8);
WITH_CONFIG(GEN_CONFIG_UPDATED_INTIMIDATE, GEN_7);
PLAYER(SPECIES_EKANS) { Ability(ABILITY_SHED_SKIN); };
PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); };
OPPONENT(SPECIES_ZUBAT) { Ability(ABILITY_INNER_FOCUS); };
} WHEN {
TURN { MOVE(opponent, MOVE_SCRATCH); }
TURN { SWITCH(player, 1); MOVE(opponent, MOVE_SCRATCH); }
} SCENE {
// Turn 1
HP_BAR(player, captureDamage: &turnOneHit);
ABILITY_POPUP(player, ABILITY_INTIMIDATE);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent);
MESSAGE("Ekans's Intimidate cuts the opposing Zubat's Attack!");
// Turn 2
HP_BAR(player, captureDamage: &turnTwoHit);
} THEN {
EXPECT_GT(turnOneHit, turnTwoHit);
}
}
SINGLE_BATTLE_TEST("Inner Focus prevents intimidate (Gen8+)")
{
s16 turnOneHit;
s16 turnTwoHit;
GIVEN {
WITH_CONFIG(GEN_CONFIG_UPDATED_INTIMIDATE, GEN_8);
PLAYER(SPECIES_EKANS) { Ability(ABILITY_SHED_SKIN); };
PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); };
OPPONENT(SPECIES_ZUBAT) { Ability(ABILITY_INNER_FOCUS); };
@ -18,7 +45,7 @@ SINGLE_BATTLE_TEST("Inner Focus prevents intimidate")
} SCENE {
HP_BAR(player, captureDamage: &turnOneHit);
ABILITY_POPUP(player, ABILITY_INTIMIDATE);
NONE_OF { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); }
NONE_OF { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); }
ABILITY_POPUP(opponent, ABILITY_INNER_FOCUS);
MESSAGE("The opposing Zubat's Inner Focus prevents stat loss!");
HP_BAR(player, captureDamage: &turnTwoHit);

View File

@ -50,10 +50,30 @@ SINGLE_BATTLE_TEST("Oblivious prevents Taunt")
}
}
SINGLE_BATTLE_TEST("Oblivious prevents Intimidate")
SINGLE_BATTLE_TEST("Oblivious doesn't prevent Intimidate (Gen3-7)")
{
GIVEN {
ASSUME(B_UPDATED_INTIMIDATE >= GEN_8);
WITH_CONFIG(GEN_CONFIG_UPDATED_INTIMIDATE, GEN_7);
PLAYER(SPECIES_SLOWPOKE) { Ability(ABILITY_OBLIVIOUS); }
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); }
} WHEN {
TURN { SWITCH(opponent, 1); }
} SCENE {
ABILITY_POPUP(opponent, ABILITY_INTIMIDATE);
NONE_OF {
ABILITY_POPUP(player, ABILITY_OBLIVIOUS);
MESSAGE("Slowpoke's Oblivious prevents stat loss!");
}
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
MESSAGE("The opposing Ekans's Intimidate cuts Slowpoke's Attack!");
}
}
SINGLE_BATTLE_TEST("Oblivious prevents Intimidate (Gen8+)")
{
GIVEN {
WITH_CONFIG(GEN_CONFIG_UPDATED_INTIMIDATE, GEN_8);
PLAYER(SPECIES_SLOWPOKE) { Ability(ABILITY_OBLIVIOUS); }
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); }

View File

@ -1,10 +1,28 @@
#include "global.h"
#include "test/battle.h"
SINGLE_BATTLE_TEST("Own Tempo prevents Intimidate but no other stat down changes")
SINGLE_BATTLE_TEST("Own Tempo doesn't prevent Intimidate (Gen3-7)")
{
GIVEN {
ASSUME(B_UPDATED_INTIMIDATE >= GEN_8);
WITH_CONFIG(GEN_CONFIG_UPDATED_INTIMIDATE, GEN_7);
ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE);
PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); };
OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); };
} WHEN {
TURN { }
} SCENE {
ABILITY_POPUP(player, ABILITY_INTIMIDATE);
NONE_OF {
ABILITY_POPUP(opponent, ABILITY_OWN_TEMPO);
MESSAGE("The opposing Slowpoke's Own Tempo prevents stat loss!");
}
}
}
SINGLE_BATTLE_TEST("Own Tempo prevents Intimidate but no other stat down changes (Gen8+)")
{
GIVEN {
WITH_CONFIG(GEN_CONFIG_UPDATED_INTIMIDATE, GEN_8);
ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE);
PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); };
OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); };

View File

@ -52,10 +52,30 @@ SINGLE_BATTLE_TEST("Rattled boosts speed by 1 when hit by Bug, Dark or Ghost typ
}
}
SINGLE_BATTLE_TEST("Rattled boosts speed by 1 when affected by Intimidate")
SINGLE_BATTLE_TEST("Rattled does not boost speed by 1 when affected by Intimidate (Gen5-7)")
{
GIVEN {
ASSUME(B_UPDATED_INTIMIDATE >= GEN_8);
WITH_CONFIG(GEN_CONFIG_UPDATED_INTIMIDATE, GEN_7);
PLAYER(SPECIES_GYARADOS) {Ability(ABILITY_INTIMIDATE); }
OPPONENT(SPECIES_SUDOWOODO) {Ability(ABILITY_RATTLED); }
} WHEN {
TURN {}
} SCENE {
ABILITY_POPUP(player, ABILITY_INTIMIDATE);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent);
MESSAGE("Gyarados's Intimidate cuts the opposing Sudowoodo's Attack!");
NONE_OF {
ABILITY_POPUP(opponent, ABILITY_RATTLED);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent);
MESSAGE("The opposing Sudowoodo's Speed rose!");
}
}
}
SINGLE_BATTLE_TEST("Rattled boosts speed by 1 when affected by Intimidate (Gen8+)")
{
GIVEN {
WITH_CONFIG(GEN_CONFIG_UPDATED_INTIMIDATE, GEN_8);
PLAYER(SPECIES_GYARADOS) {Ability(ABILITY_INTIMIDATE); }
OPPONENT(SPECIES_SUDOWOODO) {Ability(ABILITY_RATTLED); }
} WHEN {

View File

@ -1,13 +1,13 @@
#include "global.h"
#include "test/battle.h"
SINGLE_BATTLE_TEST("Scrappy prevents intimidate")
SINGLE_BATTLE_TEST("Scrappy doesn't prevent Intimidate (Gen4-7)")
{
s16 turnOneHit;
s16 turnTwoHit;
GIVEN {
ASSUME(B_UPDATED_INTIMIDATE >= GEN_8);
WITH_CONFIG(GEN_CONFIG_UPDATED_INTIMIDATE, GEN_7);
PLAYER(SPECIES_EKANS) { Ability(ABILITY_SHED_SKIN); };
PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); };
OPPONENT(SPECIES_KANGASKHAN) { Ability(ABILITY_SCRAPPY); };
@ -18,7 +18,35 @@ SINGLE_BATTLE_TEST("Scrappy prevents intimidate")
} SCENE {
HP_BAR(player, captureDamage: &turnOneHit);
ABILITY_POPUP(player, ABILITY_INTIMIDATE);
NONE_OF { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); }
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent);
NONE_OF {
ABILITY_POPUP(opponent, ABILITY_SCRAPPY);
MESSAGE("The opposing Kangaskhan's Scrappy prevents stat loss!");
}
HP_BAR(player, captureDamage: &turnTwoHit);
} THEN {
EXPECT_GT(turnOneHit, turnTwoHit);
}
}
SINGLE_BATTLE_TEST("Scrappy prevents Intimidate (Gen8+)")
{
s16 turnOneHit;
s16 turnTwoHit;
GIVEN {
WITH_CONFIG(GEN_CONFIG_UPDATED_INTIMIDATE, GEN_8);
PLAYER(SPECIES_EKANS) { Ability(ABILITY_SHED_SKIN); };
PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); };
OPPONENT(SPECIES_KANGASKHAN) { Ability(ABILITY_SCRAPPY); };
} WHEN {
TURN { MOVE(opponent, MOVE_SCRATCH); }
TURN { SWITCH(player, 1); MOVE(opponent, MOVE_SCRATCH); }
} SCENE {
HP_BAR(player, captureDamage: &turnOneHit);
ABILITY_POPUP(player, ABILITY_INTIMIDATE);
NONE_OF { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); }
ABILITY_POPUP(opponent, ABILITY_SCRAPPY);
MESSAGE("The opposing Kangaskhan's Scrappy prevents stat loss!");
HP_BAR(player, captureDamage: &turnTwoHit);

View File

@ -567,7 +567,6 @@ static inline bool32 IsMoveSheerForceBoosted(u32 move)
case MOVE_POWDER_SNOW:
case MOVE_PSYSHIELD_BASH:
case MOVE_PYRO_BALL:
case MOVE_RAPID_SPIN:
case MOVE_RELIC_SONG:
case MOVE_ROLLING_KICK:
case MOVE_SACRED_FIRE:
@ -605,6 +604,8 @@ static inline bool32 IsMoveSheerForceBoosted(u32 move)
case MOVE_ELECTRO_SHOT:
case MOVE_PSYCHIC_NOISE:
return TRUE;
case MOVE_RAPID_SPIN:
return B_SPEED_BUFFING_RAPID_SPIN >= GEN_8;
}
return FALSE;
}

View File

@ -88,12 +88,12 @@ SINGLE_BATTLE_TEST("Shield Dust does not block self-targeting effects, primary o
{
u16 move;
PARAMETRIZE { move = MOVE_POWER_UP_PUNCH; }
PARAMETRIZE { move = MOVE_RAPID_SPIN; }
PARAMETRIZE { move = MOVE_FLAME_CHARGE; }
PARAMETRIZE { move = MOVE_LEAF_STORM; }
PARAMETRIZE { move = MOVE_METEOR_ASSAULT; }
GIVEN {
ASSUME(GetMoveEffect(MOVE_RAPID_SPIN) == EFFECT_RAPID_SPIN);
ASSUME(MoveHasAdditionalEffectSelf(MOVE_FLAME_CHARGE, MOVE_EFFECT_SPD_PLUS_1) == TRUE);
ASSUME(MoveHasAdditionalEffectSelf(MOVE_POWER_UP_PUNCH, MOVE_EFFECT_ATK_PLUS_1) == TRUE);
ASSUME(MoveHasAdditionalEffectSelf(MOVE_LEAF_STORM, MOVE_EFFECT_SP_ATK_MINUS_2) == TRUE);
ASSUME(MoveHasAdditionalEffectSelf(MOVE_METEOR_ASSAULT, MOVE_EFFECT_RECHARGE) == TRUE);
@ -110,7 +110,7 @@ SINGLE_BATTLE_TEST("Shield Dust does not block self-targeting effects, primary o
switch (move)
{
case MOVE_POWER_UP_PUNCH:
case MOVE_RAPID_SPIN:
case MOVE_FLAME_CHARGE:
case MOVE_LEAF_STORM:
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
break;

View File

@ -11,7 +11,8 @@ AI_SINGLE_BATTLE_TEST("AI will not further increase Attack / Sp. Atk stat if it
GIVEN {
ASSUME(GetMovePower(MOVE_SKY_UPPERCUT) == 85);
ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY);
ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP
|| GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY);
ASSUME(GetMoveEffect(MOVE_CALM_MIND) == EFFECT_CALM_MIND);
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT);
PLAYER(SPECIES_COMBUSKEN) { Speed(15); Moves(MOVE_SKY_UPPERCUT, MOVE_CELEBRATE); };
@ -31,7 +32,8 @@ AI_SINGLE_BATTLE_TEST("AI will not further increase Attack / Sp. Atk stat if it
GIVEN {
ASSUME(GetMovePower(MOVE_SKY_UPPERCUT) == 85);
ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY);
ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP
|| GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY);
ASSUME(GetMoveEffect(MOVE_CALM_MIND) == EFFECT_CALM_MIND);
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT);
PLAYER(SPECIES_COMBUSKEN) { Speed(20); Moves(MOVE_DOUBLE_KICK, MOVE_CELEBRATE); };
@ -63,7 +65,8 @@ AI_SINGLE_BATTLE_TEST("AI will not waste a turn setting up if it knows target ca
GIVEN {
ASSUME(GetMovePower(MOVE_SKY_UPPERCUT) == 85);
ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY);
ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP
|| GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY);
ASSUME(GetMoveEffect(MOVE_CALM_MIND) == EFFECT_CALM_MIND);
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT);
PLAYER(SPECIES_COMBUSKEN) { Speed(15); Moves(MOVE_SKY_UPPERCUT, MOVE_DOUBLE_KICK, MOVE_FLAME_WHEEL, MOVE_CELEBRATE); };

View File

@ -839,10 +839,9 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has an
PARAMETRIZE { aiMon = SPECIES_BRONZONG; absorbingAbility = ABILITY_LEVITATE; move = MOVE_EARTHQUAKE;}
PARAMETRIZE { aiMon = SPECIES_ELECTRODE; absorbingAbility = ABILITY_SOUNDPROOF; move = MOVE_HYPER_VOICE;}
PARAMETRIZE { aiMon = SPECIES_CHESNAUGHT; absorbingAbility = ABILITY_BULLETPROOF; move = MOVE_SLUDGE_BOMB;}
PARAMETRIZE { aiMon = SPECIES_SHIFTRY; absorbingAbility = ABILITY_WIND_RIDER; move = MOVE_HURRICANE;}
PARAMETRIZE { aiMon = SPECIES_BRAMBLEGHAST; absorbingAbility = ABILITY_WIND_RIDER; move = MOVE_HURRICANE;}
GIVEN {
ASSUME(B_REDIRECT_ABILITY_IMMUNITY >= GEN_5);
ASSUME(P_UPDATED_ABILITIES >= GEN_9); //For the predicted ability for Shiftry
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING);
PLAYER(SPECIES_ZIGZAGOON) { Moves(move); }
OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SCRATCH); }

View File

@ -92,12 +92,12 @@ SINGLE_BATTLE_TEST("Covert Cloak does not block self-targeting effects, primary
{
u16 move;
PARAMETRIZE { move = MOVE_POWER_UP_PUNCH; }
PARAMETRIZE { move = MOVE_RAPID_SPIN; }
PARAMETRIZE { move = MOVE_FLAME_CHARGE; }
PARAMETRIZE { move = MOVE_LEAF_STORM; }
PARAMETRIZE { move = MOVE_METEOR_ASSAULT; }
GIVEN {
ASSUME(GetMoveEffect(MOVE_RAPID_SPIN) == EFFECT_RAPID_SPIN);
ASSUME(MoveHasAdditionalEffectSelf(MOVE_FLAME_CHARGE, MOVE_EFFECT_SPD_PLUS_1) == TRUE);
ASSUME(MoveHasAdditionalEffectSelf(MOVE_POWER_UP_PUNCH, MOVE_EFFECT_ATK_PLUS_1) == TRUE);
ASSUME(MoveHasAdditionalEffectSelf(MOVE_LEAF_STORM, MOVE_EFFECT_SP_ATK_MINUS_2) == TRUE);
ASSUME(MoveHasAdditionalEffectSelf(MOVE_METEOR_ASSAULT, MOVE_EFFECT_RECHARGE) == TRUE);
@ -113,7 +113,7 @@ SINGLE_BATTLE_TEST("Covert Cloak does not block self-targeting effects, primary
HP_BAR(opponent);
switch (move) {
case MOVE_POWER_UP_PUNCH:
case MOVE_RAPID_SPIN:
case MOVE_FLAME_CHARGE:
case MOVE_LEAF_STORM:
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
break;

View File

@ -86,10 +86,35 @@ DOUBLE_BATTLE_TEST("After You calculates correct turn order if only one Pokémon
}
}
DOUBLE_BATTLE_TEST("After You fails if the turn order remains the same after After You (Gen5-7)")
{
GIVEN {
WITH_CONFIG(GEN_CONFIG_AFTER_YOU_TURN_ORDER, GEN_7);
PLAYER(SPECIES_WOBBUFFET) { Speed(4); }
PLAYER(SPECIES_WYNAUT) { Speed(1); }
OPPONENT(SPECIES_WOBBUFFET) { Speed(2); }
OPPONENT(SPECIES_WYNAUT) { Speed(3); }
} WHEN {
TURN {
MOVE(playerLeft, MOVE_CELEBRATE);
MOVE(playerRight, MOVE_CELEBRATE);
MOVE(opponentLeft, MOVE_CELEBRATE);
MOVE(opponentRight, MOVE_AFTER_YOU, target: opponentLeft);
}
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft);
MESSAGE("The opposing Wynaut used After You!");
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_AFTER_YOU, opponentRight);
MESSAGE("But it failed!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentLeft);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight);
}
}
DOUBLE_BATTLE_TEST("After You doesn't fail if the turn order remains the same after After You (Gen8+)")
{
GIVEN {
ASSUME(B_AFTER_YOU_TURN_ORDER >= GEN_8);
WITH_CONFIG(GEN_CONFIG_AFTER_YOU_TURN_ORDER, GEN_8);
PLAYER(SPECIES_WOBBUFFET) { Speed(4); }
PLAYER(SPECIES_WYNAUT) { Speed(1); }
OPPONENT(SPECIES_WOBBUFFET) { Speed(2); }

View File

@ -1,17 +1,14 @@
#include "global.h"
#include "test/battle.h"
ASSUMPTIONS
{
ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY);
}
SINGLE_BATTLE_TEST("Howl raises user's Attack by 1 stage", s16 damage)
{
bool32 raiseAttack;
PARAMETRIZE { raiseAttack = FALSE; }
PARAMETRIZE { raiseAttack = TRUE; }
GIVEN {
ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP
|| GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY);
ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
@ -37,6 +34,7 @@ DOUBLE_BATTLE_TEST("Howl raises user's and partner's Attack by 1 stage", s16 dam
PARAMETRIZE { raiseAttack = FALSE; }
PARAMETRIZE { raiseAttack = TRUE; }
GIVEN {
ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY);
ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL);
PLAYER(SPECIES_WOBBUFFET) { Speed(15); }
PLAYER(SPECIES_WYNAUT) { Speed(10); }
@ -69,6 +67,7 @@ DOUBLE_BATTLE_TEST("Howl does not work on partner if it has Soundproof")
s16 damage[2];
GIVEN {
ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY);
ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL);
PLAYER(SPECIES_WOBBUFFET) { Speed(15); }
PLAYER(SPECIES_VOLTORB) { Speed(10); Ability(ABILITY_SOUNDPROOF); }

View File

@ -49,10 +49,28 @@ DOUBLE_BATTLE_TEST("Lunar Dance causes the user to faint and fully heals the rep
}
}
SINGLE_BATTLE_TEST("Healing Wish effect activates only if the switched Pokémon can be healed")
SINGLE_BATTLE_TEST("Healing Wish effect activates even if the the switched Pokémon can't be healed (Gen4-7)")
{
GIVEN {
ASSUME(B_HEALING_WISH_SWITCH >= GEN_8);
WITH_CONFIG(GEN_CONFIG_HEALING_WISH_SWITCH, GEN_7);
PLAYER(SPECIES_GARDEVOIR) { Speed(300); }
PLAYER(SPECIES_NINJASK) { Speed(400); }
OPPONENT(SPECIES_WOBBUFFET) { Speed(50); }
} WHEN {
TURN { MOVE(player, MOVE_HEALING_WISH); SEND_OUT(player, 1); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_HEALING_WISH, player);
HP_BAR(player, hp: 0);
MESSAGE("Gardevoir fainted!");
MESSAGE("The healing wish came true for Ninjask!");
MESSAGE("Ninjask regained health!");
}
}
SINGLE_BATTLE_TEST("Healing Wish effect activates only if the switched Pokémon can be healed (Gen8+)")
{
GIVEN {
WITH_CONFIG(GEN_CONFIG_HEALING_WISH_SWITCH, GEN_8);
PLAYER(SPECIES_GARDEVOIR) { Speed(300); }
PLAYER(SPECIES_NINJASK) { Speed(400); }
PLAYER(SPECIES_WYNAUT) { HP(50); MaxHP(100); Status1(STATUS1_PARALYSIS); Speed(50); }
@ -65,8 +83,8 @@ SINGLE_BATTLE_TEST("Healing Wish effect activates only if the switched Pokémon
HP_BAR(player, hp: 0);
MESSAGE("Gardevoir fainted!");
NONE_OF {
MESSAGE("The healing wish came true for Wynaut!");
MESSAGE("Wynaut's HP was restored.");
MESSAGE("The healing wish came true for Ninjask!");
MESSAGE("Ninjask regained health!");
}
ANIMATION(ANIM_TYPE_MOVE, MOVE_U_TURN, player);
MESSAGE("The healing wish came true for Wynaut!");

View File

@ -51,6 +51,7 @@ DOUBLE_BATTLE_TEST("Pursuit doesn't attack a foe using Teleport / Baton Pass to
PARAMETRIZE { move = MOVE_TELEPORT; }
PARAMETRIZE { move = MOVE_BATON_PASS; }
GIVEN {
WITH_CONFIG(GEN_CONFIG_TELEPORT_BEHAVIOR, GEN_8);
ASSUME(GetMoveEffect(MOVE_QUASH) == EFFECT_QUASH);
ASSUME(GetMoveEffect(MOVE_TELEPORT) == EFFECT_TELEPORT);
ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS);

View File

@ -26,7 +26,7 @@ DOUBLE_BATTLE_TEST("Quash-affected target will move last in the priority bracket
DOUBLE_BATTLE_TEST("Quash is not affected by dynamic speed")
{
GIVEN {
ASSUME(B_RECALC_TURN_AFTER_ACTIONS >= GEN_8);
WITH_CONFIG(GEN_CONFIG_RECALC_TURN_AFTER_ACTIONS, GEN_8);
ASSUME(GetMoveEffect(MOVE_TAILWIND) == EFFECT_TAILWIND);
PLAYER(SPECIES_VOLBEAT) { Speed(10); Ability(ABILITY_PRANKSTER); }
PLAYER(SPECIES_WOBBUFFET) { Speed(30); }
@ -112,7 +112,7 @@ DOUBLE_BATTLE_TEST("Quash-affected targets move from fastest to slowest (Gen 8+)
DOUBLE_BATTLE_TEST("Quash-affected mon that acted early via After You is not affected by dynamic speed")
{
GIVEN {
ASSUME(B_RECALC_TURN_AFTER_ACTIONS >= GEN_8);
WITH_CONFIG(GEN_CONFIG_RECALC_TURN_AFTER_ACTIONS, GEN_8);
ASSUME(GetMoveEffect(MOVE_TAILWIND) == EFFECT_TAILWIND);
ASSUME(GetMoveEffect(MOVE_AFTER_YOU) == EFFECT_AFTER_YOU);
PLAYER(SPECIES_VOLBEAT) { Speed(20); Ability(ABILITY_PRANKSTER); }

View File

@ -249,7 +249,35 @@ SINGLE_BATTLE_TEST("Rage Fist base power is not increased if move had no affect"
}
}
SINGLE_BATTLE_TEST("Rage Fist base power is increased if Disguise breaks")
SINGLE_BATTLE_TEST("Rage Fist base power is increased if Disguise breaks (Gen7)")
{
KNOWN_FAILING;
s16 timesGotHit[2];
u16 species = SPECIES_NONE;
PARAMETRIZE { species = SPECIES_MIMIKYU_DISGUISED; }
PARAMETRIZE { species = SPECIES_MIMIKYU_TOTEM_DISGUISED; }
GIVEN {
WITH_CONFIG(GEN_CONFIG_DISGUISE_HP_LOSS, GEN_7);
PLAYER(species) { Ability(ABILITY_DISGUISE); }
OPPONENT(SPECIES_REGIROCK);
} WHEN {
TURN { MOVE(player, MOVE_RAGE_FIST); MOVE(opponent, MOVE_ROCK_THROW); }
TURN { MOVE(player, MOVE_RAGE_FIST); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_RAGE_FIST, player);
HP_BAR(opponent, captureDamage: &timesGotHit[0]);
ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_THROW, opponent);
ABILITY_POPUP(player, ABILITY_DISGUISE);
ANIMATION(ANIM_TYPE_MOVE, MOVE_RAGE_FIST, player);
HP_BAR(opponent, captureDamage: &timesGotHit[1]);
} THEN {
EXPECT_MUL_EQ(timesGotHit[0], Q_4_12(2.0), timesGotHit[1]);
}
}
SINGLE_BATTLE_TEST("Rage Fist base power is increased if Disguise breaks (Gen8+)")
{
s16 timesGotHit[2];
u16 species = SPECIES_NONE;
@ -258,6 +286,7 @@ SINGLE_BATTLE_TEST("Rage Fist base power is increased if Disguise breaks")
PARAMETRIZE { species = SPECIES_MIMIKYU_TOTEM_DISGUISED; }
GIVEN {
WITH_CONFIG(GEN_CONFIG_DISGUISE_HP_LOSS, GEN_8);
PLAYER(species) { Ability(ABILITY_DISGUISE); }
OPPONENT(SPECIES_REGIROCK);
} WHEN {
@ -343,7 +372,7 @@ SINGLE_BATTLE_TEST("Rage Fist doesn't get increased power if Substitute is hit")
}
}
SINGLE_BATTLE_TEST("Rage Fist - X")
SINGLE_BATTLE_TEST("Rage Fist counter will be updated correctly after absorb move")
{
s16 timesGotHit[2];

View File

@ -36,10 +36,28 @@ SINGLE_BATTLE_TEST("Tailwind applies for 4 turns")
}
}
DOUBLE_BATTLE_TEST("Tailwind affects partner on first turn")
DOUBLE_BATTLE_TEST("Tailwind doesn't affect the partner on the same turn it's used (Gen4-7)")
{
GIVEN {
ASSUME(B_RECALC_TURN_AFTER_ACTIONS);
WITH_CONFIG(GEN_CONFIG_RECALC_TURN_AFTER_ACTIONS, GEN_7);
PLAYER(SPECIES_WOBBUFFET) { Speed(20); }
PLAYER(SPECIES_WYNAUT) { Speed(10); }
OPPONENT(SPECIES_WOBBUFFET) { Speed(15); }
OPPONENT(SPECIES_WYNAUT) { Speed(14); }
} WHEN {
TURN { MOVE(playerLeft, MOVE_TAILWIND); }
} SCENE {
MESSAGE("Wobbuffet used Tailwind!");
MESSAGE("The opposing Wobbuffet used Celebrate!");
MESSAGE("The opposing Wynaut used Celebrate!");
MESSAGE("Wynaut used Celebrate!");
}
}
DOUBLE_BATTLE_TEST("Tailwind affects the partner on the same turn it's used (Gen8+)")
{
GIVEN {
WITH_CONFIG(GEN_CONFIG_RECALC_TURN_AFTER_ACTIONS, GEN_8);
PLAYER(SPECIES_WOBBUFFET) { Speed(20); }
PLAYER(SPECIES_WYNAUT) { Speed(10); }
OPPONENT(SPECIES_WOBBUFFET) { Speed(15); }

View File

@ -6,9 +6,10 @@ ASSUMPTIONS
ASSUME(GetMoveEffect(MOVE_TELEPORT) == EFFECT_TELEPORT);
}
SINGLE_BATTLE_TEST("Teleport fails when there is no Pokémon to switch in")
SINGLE_BATTLE_TEST("Teleport fails to switch out when there is no Pokémon to switch in (Gen 8+)")
{
GIVEN {
WITH_CONFIG(GEN_CONFIG_TELEPORT_BEHAVIOR, GEN_8);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
@ -18,9 +19,10 @@ SINGLE_BATTLE_TEST("Teleport fails when there is no Pokémon to switch in")
}
}
SINGLE_BATTLE_TEST("Teleport fails when there no alive Pokémon left")
SINGLE_BATTLE_TEST("Teleport fails to switch out the user when there no alive Pokémon left (Gen 8+)")
{
GIVEN {
WITH_CONFIG(GEN_CONFIG_TELEPORT_BEHAVIOR, GEN_8);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WYNAUT) { HP(0); }
@ -31,9 +33,29 @@ SINGLE_BATTLE_TEST("Teleport fails when there no alive Pokémon left")
}
}
SINGLE_BATTLE_TEST("Teleport forces the Pokémon to switch out")
SINGLE_BATTLE_TEST("Teleport fails in Trainer Battles (Gen 1-7)")
{
GIVEN {
WITH_CONFIG(GEN_CONFIG_TELEPORT_BEHAVIOR, GEN_7);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WYNAUT);
} WHEN {
TURN { MOVE(opponent, MOVE_TELEPORT); }
} SCENE {
MESSAGE("The opposing Wobbuffet used Teleport!");
NONE_OF {
ANIMATION(ANIM_TYPE_MOVE, MOVE_TELEPORT, opponent);
MESSAGE("2 sent out Wynaut!");
}
MESSAGE("But it failed!");
}
}
SINGLE_BATTLE_TEST("Teleport forces the Pokémon to switch out in Trainer Battles (Gen 8+)")
{
GIVEN {
WITH_CONFIG(GEN_CONFIG_TELEPORT_BEHAVIOR, GEN_8);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WYNAUT);
@ -48,6 +70,7 @@ SINGLE_BATTLE_TEST("Teleport forces the Pokémon to switch out")
SINGLE_BATTLE_TEST("Teleport does not fail if the user is trapped")
{
GIVEN {
WITH_CONFIG(GEN_CONFIG_TELEPORT_BEHAVIOR, GEN_8);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WYNAUT);

View File

@ -446,6 +446,11 @@ top:
case STATE_EXIT:
MgbaExit_(gTestRunnerState.exitCode);
break;
default:
MgbaOpen_();
Test_MgbaPrintf("\e[31mInvalid TestRunner state, exiting\e[0m");
gTestRunnerState.exitCode = 1;
gTestRunnerState.state = STATE_EXIT;
}
if (gMain.callback2 == CB2_TestRunner)