Merge branch '_RHH/master' into _RHH/upcoming
@ -1674,6 +1674,11 @@
|
||||
callnative BS_FickleBeamDamageCalculation
|
||||
.endm
|
||||
|
||||
.macro trytarshot failInstr:req
|
||||
callnative BS_TryTarShot
|
||||
.4byte \failInstr
|
||||
.endm
|
||||
|
||||
.macro jumpifteainvulnerable battler:req, jumpInstr:req
|
||||
callnative BS_TeatimeInvul
|
||||
.byte \battler
|
||||
@ -2247,11 +2252,6 @@
|
||||
.4byte \failInstr
|
||||
.endm
|
||||
|
||||
.macro trytarshot battler:req, failInstr:req
|
||||
various \battler, VARIOUS_TRY_TAR_SHOT
|
||||
.4byte \failInstr
|
||||
.endm
|
||||
|
||||
.macro cantarshotwork battler:req, failInstr:req
|
||||
various \battler, VARIOUS_CAN_TAR_SHOT_WORK
|
||||
.4byte \failInstr
|
||||
|
||||
@ -902,7 +902,7 @@ BattleScript_EffectTarShot::
|
||||
printfromtable gStatDownStringIds
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
BattleScript_TryTarShot:
|
||||
trytarshot BS_TARGET, BattleScript_MoveEnd
|
||||
trytarshot BattleScript_MoveEnd
|
||||
printstring STRINGID_PKMNBECAMEWEAKERTOFIRE
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
goto BattleScript_MoveEnd
|
||||
|
||||
|
Before Width: | Height: | Size: 690 B After Width: | Height: | Size: 664 B |
|
Before Width: | Height: | Size: 599 B After Width: | Height: | Size: 530 B |
|
Before Width: | Height: | Size: 549 B After Width: | Height: | Size: 494 B |
|
Before Width: | Height: | Size: 561 B After Width: | Height: | Size: 568 B |
@ -3,17 +3,17 @@ JASC-PAL
|
||||
16
|
||||
128 128 128
|
||||
26 24 32
|
||||
135 128 162
|
||||
86 82 102
|
||||
145 127 199
|
||||
84 73 122
|
||||
8 8 14
|
||||
0 0 0
|
||||
37 37 62
|
||||
77 76 116
|
||||
255 255 255
|
||||
64 96 120
|
||||
96 144 160
|
||||
254 254 238
|
||||
121 83 136
|
||||
61 37 19
|
||||
175 175 175
|
||||
121 72 39
|
||||
136 136 136
|
||||
105 52 91
|
||||
193 190 180
|
||||
132 85 120
|
||||
97 97 85
|
||||
14 14 14
|
||||
15 15 15
|
||||
|
||||
@ -3,17 +3,17 @@ JASC-PAL
|
||||
16
|
||||
152 208 160
|
||||
32 48 64
|
||||
120 112 144
|
||||
80 72 104
|
||||
145 127 199
|
||||
84 73 122
|
||||
96 144 160
|
||||
16 16 16
|
||||
216 112 224
|
||||
200 176 192
|
||||
248 248 248
|
||||
144 96 88
|
||||
193 190 180
|
||||
254 254 238
|
||||
132 85 120
|
||||
64 96 120
|
||||
112 48 48
|
||||
128 104 128
|
||||
105 52 91
|
||||
97 97 85
|
||||
48 64 80
|
||||
0 0 0
|
||||
0 0 0
|
||||
|
||||
|
Before Width: | Height: | Size: 638 B After Width: | Height: | Size: 592 B |
@ -3,17 +3,17 @@ JASC-PAL
|
||||
16
|
||||
152 208 160
|
||||
32 48 64
|
||||
120 112 144
|
||||
145 127 199
|
||||
16 16 16
|
||||
80 72 104
|
||||
84 73 122
|
||||
96 144 160
|
||||
200 176 192
|
||||
248 248 248
|
||||
193 190 180
|
||||
254 254 238
|
||||
64 96 120
|
||||
144 96 88
|
||||
112 48 48
|
||||
132 85 120
|
||||
105 52 91
|
||||
40 176 224
|
||||
128 104 128
|
||||
97 97 85
|
||||
48 64 80
|
||||
0 0 0
|
||||
0 0 0
|
||||
|
||||
@ -1736,6 +1736,7 @@
|
||||
#define SPECIES_SANDSHREW_ALOLA SPECIES_SANDSHREW_ALOLAN
|
||||
#define SPECIES_SANDSLASH_ALOLA SPECIES_SANDSLASH_ALOLAN
|
||||
#define SPECIES_SHELLOS_EAST SPECIES_SHELLOS_EAST_SEA
|
||||
#define SPECIES_SIRFETCH_D SPECIES_SIRFETCHD
|
||||
#define SPECIES_SLIGGOO_HISUI SPECIES_SLIGGOO_HISUIAN
|
||||
#define SPECIES_SLOWBRO_GALAR SPECIES_SLOWBRO_GALARIAN
|
||||
#define SPECIES_SLOWKING_GALAR SPECIES_SLOWKING_GALARIAN
|
||||
|
||||
@ -24,5 +24,6 @@ u16 GetFrontierBrainMonMove(u8 monId, u8 moveSlotId);
|
||||
u8 GetFrontierBrainMonNature(u8 monId);
|
||||
u8 GetFrontierBrainMonEvs(u8 monId, u8 evStatId);
|
||||
s32 GetFronterBrainSymbol(void);
|
||||
void ClearEnemyPartyAfterChallenge(void);
|
||||
|
||||
#endif // GUARD_FRONTIER_UTIL_H
|
||||
|
||||
@ -3474,6 +3474,9 @@ $(POKEMONGFXDIR)/eiscue/overworld.4bpp: %.4bpp: %.png
|
||||
$(POKEMONGFXDIR)/indeedee/overworld.4bpp: %.4bpp: %.png
|
||||
$(GFX) $< $@ -mwidth 4 -mheight 4
|
||||
|
||||
$(POKEMONGFXDIR)/indeedee/female/overworld.4bpp: %.4bpp: %.png
|
||||
$(GFX) $< $@ -mwidth 4 -mheight 4
|
||||
|
||||
$(POKEMONGFXDIR)/morpeko/overworld.4bpp: %.4bpp: %.png
|
||||
$(GFX) $< $@ -mwidth 4 -mheight 4
|
||||
|
||||
|
||||
@ -891,7 +891,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
break;
|
||||
case ABILITY_WONDER_GUARD:
|
||||
if (effectiveness < AI_EFFECTIVENESS_x2)
|
||||
return 0;
|
||||
RETURN_SCORE_MINUS(20);
|
||||
break;
|
||||
case ABILITY_JUSTIFIED:
|
||||
if (moveType == TYPE_DARK && !IS_MOVE_STATUS(move))
|
||||
@ -1500,7 +1500,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
break;
|
||||
case EFFECT_OHKO:
|
||||
if (B_SHEER_COLD_IMMUNITY >= GEN_7 && move == MOVE_SHEER_COLD && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ICE))
|
||||
return 0;
|
||||
RETURN_SCORE_MINUS(20);
|
||||
if (!ShouldTryOHKO(battlerAtk, battlerDef, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], move))
|
||||
ADJUST_SCORE(-10);
|
||||
else if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX)
|
||||
@ -2510,7 +2510,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|
||||
if (IS_TARGETING_PARTNER(battlerAtk, battlerDef))
|
||||
{
|
||||
if (gStatuses3[battlerDef] & STATUS3_HEAL_BLOCK)
|
||||
return 0;
|
||||
return 0; // cannot even select
|
||||
if (AtMaxHp(battlerDef))
|
||||
ADJUST_SCORE(-10);
|
||||
else if (gBattleMons[battlerDef].hp > gBattleMons[battlerDef].maxHP / 2)
|
||||
|
||||
@ -529,6 +529,7 @@ static void SetArenaData(void)
|
||||
|
||||
static void SaveArenaChallenge(void)
|
||||
{
|
||||
ClearEnemyPartyAfterChallenge();
|
||||
gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005;
|
||||
VarSet(VAR_TEMP_CHALLENGE_STATUS, 0);
|
||||
gSaveBlock2Ptr->frontier.challengePaused = TRUE;
|
||||
|
||||
@ -887,7 +887,7 @@ void HandleInputChooseMove(u32 battler)
|
||||
}
|
||||
else if (JOY_NEW(START_BUTTON))
|
||||
{
|
||||
if (gBattleStruct->gimmick.usableGimmick[battler] != GIMMICK_NONE)
|
||||
if (gBattleStruct->gimmick.usableGimmick[battler] != GIMMICK_NONE && !HasTrainerUsedGimmick(battler, gBattleStruct->gimmick.usableGimmick[battler]))
|
||||
{
|
||||
gBattleStruct->gimmick.playerSelect ^= 1;
|
||||
ReloadMoveNames(battler);
|
||||
|
||||
@ -2593,6 +2593,7 @@ static void SetDomeOpponentGraphicsId(void)
|
||||
|
||||
static void SaveDomeChallenge(void)
|
||||
{
|
||||
ClearEnemyPartyAfterChallenge();
|
||||
gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005;
|
||||
VarSet(VAR_TEMP_CHALLENGE_STATUS, 0);
|
||||
gSaveBlock2Ptr->frontier.challengePaused = TRUE;
|
||||
|
||||
@ -406,7 +406,6 @@ static u8 GetMaxPowerTier(u32 move)
|
||||
case EFFECT_NATURAL_GIFT:
|
||||
case EFFECT_MIRROR_COAT:
|
||||
case EFFECT_FINAL_GAMBIT:
|
||||
//case EFFECT_DRAGON_DARTS:
|
||||
return MAX_POWER_TIER_2;
|
||||
case EFFECT_OHKO:
|
||||
case EFFECT_RETURN:
|
||||
|
||||
@ -268,6 +268,7 @@ static void SetBattleFactoryData(void)
|
||||
|
||||
static void SaveFactoryChallenge(void)
|
||||
{
|
||||
ClearEnemyPartyAfterChallenge();
|
||||
gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005;
|
||||
VarSet(VAR_TEMP_CHALLENGE_STATUS, 0);
|
||||
gSaveBlock2Ptr->frontier.challengePaused = TRUE;
|
||||
@ -430,9 +431,6 @@ static void SetPlayerAndOpponentParties(void)
|
||||
ivs = gSaveBlock2Ptr->frontier.rentalMons[i].ivs;
|
||||
|
||||
CreateFacilityMon(&gFacilityTrainerMons[monId], monLevel, ivs, OT_ID_PLAYER_ID, FLAG_FRONTIER_MON_FACTORY, &gPlayerParty[i]);
|
||||
SetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY,
|
||||
&gSaveBlock2Ptr->frontier.rentalMons[i].personality);
|
||||
CalculateMonStats(&gPlayerParty[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@ -444,12 +442,7 @@ static void SetPlayerAndOpponentParties(void)
|
||||
{
|
||||
monId = gSaveBlock2Ptr->frontier.rentalMons[i + FRONTIER_PARTY_SIZE].monId;
|
||||
ivs = gSaveBlock2Ptr->frontier.rentalMons[i + FRONTIER_PARTY_SIZE].ivs;
|
||||
CreateFacilityMon(&gFacilityTrainerMons[monId],
|
||||
monLevel, ivs, OT_ID_PLAYER_ID, FLAG_FRONTIER_MON_FACTORY,
|
||||
&gEnemyParty[i]);
|
||||
SetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY,
|
||||
&gSaveBlock2Ptr->frontier.rentalMons[i + FRONTIER_PARTY_SIZE].personality);
|
||||
CalculateMonStats(&gPlayerParty[i]);
|
||||
CreateFacilityMon(&gFacilityTrainerMons[monId], monLevel, ivs, OT_ID_PLAYER_ID, FLAG_FRONTIER_MON_FACTORY, &gEnemyParty[i]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@ -144,7 +144,8 @@ void CreateGimmickTriggerSprite(u32 battler)
|
||||
// Exit if there shouldn't be a sprite produced.
|
||||
if (GetBattlerSide(battler) == B_SIDE_OPPONENT
|
||||
|| gBattleStruct->gimmick.usableGimmick[battler] == GIMMICK_NONE
|
||||
|| gimmick->triggerSheet == NULL)
|
||||
|| gimmick->triggerSheet == NULL
|
||||
|| HasTrainerUsedGimmick(battler, gBattleStruct->gimmick.usableGimmick[battler]))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
@ -5615,9 +5615,14 @@ static void FreeResetData_ReturnToOvOrDoEvolutions(void)
|
||||
}
|
||||
|
||||
FreeAllWindowBuffers();
|
||||
if (gBattleStruct != NULL && !(gBattleTypeFlags & BATTLE_TYPE_LINK))
|
||||
if (!(gBattleTypeFlags & BATTLE_TYPE_LINK))
|
||||
{
|
||||
ZeroEnemyPartyMons();
|
||||
// To account for Battle Factory and Slateport Battle Tent, enemy parties are zeroed out in the facilitites respective src/xxx.c files
|
||||
// The ZeroEnemyPartyMons() call happens in SaveXXXChallenge function (eg. SaveFactoryChallenge)
|
||||
if (!(gBattleTypeFlags & BATTLE_TYPE_FRONTIER))
|
||||
{
|
||||
ZeroEnemyPartyMons();
|
||||
}
|
||||
ResetDynamicAiFunc();
|
||||
FreeMonSpritesGfx();
|
||||
FreeBattleResources();
|
||||
|
||||
@ -180,6 +180,7 @@ static void IncrementPalaceStreak(void)
|
||||
|
||||
static void SavePalaceChallenge(void)
|
||||
{
|
||||
ClearEnemyPartyAfterChallenge();
|
||||
gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005;
|
||||
VarSet(VAR_TEMP_CHALLENGE_STATUS, 0);
|
||||
gSaveBlock2Ptr->frontier.challengePaused = TRUE;
|
||||
|
||||
@ -707,6 +707,7 @@ static void ClearInWildMonRoom(void)
|
||||
|
||||
static void SavePikeChallenge(void)
|
||||
{
|
||||
ClearEnemyPartyAfterChallenge();
|
||||
gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005;
|
||||
VarSet(VAR_TEMP_CHALLENGE_STATUS, 0);
|
||||
gSaveBlock2Ptr->frontier.challengePaused = TRUE;
|
||||
|
||||
@ -2,6 +2,7 @@
|
||||
#include "battle_pyramid.h"
|
||||
#include "battle_pyramid_bag.h"
|
||||
#include "event_data.h"
|
||||
#include "frontier_util.h"
|
||||
#include "battle.h"
|
||||
#include "battle_setup.h"
|
||||
#include "battle_tower.h"
|
||||
@ -936,6 +937,7 @@ static void SetBattlePyramidData(void)
|
||||
|
||||
static void SavePyramidChallenge(void)
|
||||
{
|
||||
ClearEnemyPartyAfterChallenge();
|
||||
gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005;
|
||||
VarSet(VAR_TEMP_CHALLENGE_STATUS, 0);
|
||||
gSaveBlock2Ptr->frontier.challengePaused = TRUE;
|
||||
|
||||
@ -1728,6 +1728,13 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u
|
||||
gBattlescriptCurrInstr = failInstr;
|
||||
else if (!JumpIfMoveAffectedByProtect(gCurrentMove))
|
||||
gBattlescriptCurrInstr = nextInstr;
|
||||
if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_DYNAMAX)
|
||||
{
|
||||
if (gProtectStructs[gBattlerTarget].maxGuarded)
|
||||
gBattlescriptCurrInstr = nextInstr;
|
||||
else
|
||||
AbilityBattleEffects(ABILITYEFFECT_ABSORBING, gBattlerTarget, 0, 0, gCurrentMove);
|
||||
}
|
||||
}
|
||||
else if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_2ND_HIT
|
||||
|| (gSpecialStatuses[gBattlerAttacker].multiHitOn
|
||||
@ -6005,15 +6012,18 @@ static void Cmd_moveend(void)
|
||||
&& gMultiHitCounter
|
||||
&& !(gMovesInfo[gCurrentMove].effect == EFFECT_PRESENT && gBattleStruct->presentBasePower == 0)) // Silly edge case
|
||||
{
|
||||
gMultiHitCounter--;
|
||||
if (!IsBattlerAlive(gBattlerTarget) && gMovesInfo[gCurrentMove].effect != EFFECT_DRAGON_DARTS)
|
||||
gMultiHitCounter = 0;
|
||||
|
||||
gBattleScripting.multihitString[4]++;
|
||||
if (--gMultiHitCounter == 0)
|
||||
if (gMultiHitCounter == 0)
|
||||
{
|
||||
if (gMovesInfo[gCurrentMove].argument == MOVE_EFFECT_SCALE_SHOT && !NoAliveMonsForEitherParty())
|
||||
{
|
||||
BattleScriptPush(gBattlescriptCurrInstr + 1);
|
||||
gBattlescriptCurrInstr = BattleScript_DefDownSpeedUp;
|
||||
}
|
||||
|
||||
BattleScriptPushCursor();
|
||||
gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings;
|
||||
effect = TRUE;
|
||||
@ -10702,20 +10712,6 @@ static void Cmd_various(void)
|
||||
}
|
||||
return;
|
||||
}
|
||||
case VARIOUS_TRY_TAR_SHOT:
|
||||
{
|
||||
VARIOUS_ARGS(const u8 *failInstr);
|
||||
if (gDisableStructs[battler].tarShot)
|
||||
{
|
||||
gBattlescriptCurrInstr = cmd->failInstr;
|
||||
}
|
||||
else
|
||||
{
|
||||
gDisableStructs[battler].tarShot = TRUE;
|
||||
gBattlescriptCurrInstr = cmd->nextInstr;
|
||||
}
|
||||
return;
|
||||
}
|
||||
case VARIOUS_CAN_TAR_SHOT_WORK:
|
||||
{
|
||||
VARIOUS_ARGS(const u8 *failInstr);
|
||||
@ -15999,7 +15995,6 @@ static void TryUpdateRoundTurnOrder(void)
|
||||
for (i = 0; roundUsers[i] != 0xFF && i < 3; i++)
|
||||
{
|
||||
gBattlerByTurnOrder[currRounder] = roundUsers[i];
|
||||
gActionsByTurnOrder[currRounder] = gActionsByTurnOrder[roundUsers[i]];
|
||||
gProtectStructs[roundUsers[i]].quash = TRUE; // Make it so their turn order can't be changed again
|
||||
currRounder++;
|
||||
}
|
||||
@ -16008,7 +16003,6 @@ static void TryUpdateRoundTurnOrder(void)
|
||||
for (i = 0; nonRoundUsers[i] != 0xFF && i < 3; i++)
|
||||
{
|
||||
gBattlerByTurnOrder[currRounder] = nonRoundUsers[i];
|
||||
gActionsByTurnOrder[currRounder] = gActionsByTurnOrder[nonRoundUsers[i]];
|
||||
currRounder++;
|
||||
}
|
||||
}
|
||||
@ -17081,6 +17075,20 @@ void BS_FickleBeamDamageCalculation(void)
|
||||
}
|
||||
}
|
||||
|
||||
void BS_TryTarShot(void)
|
||||
{
|
||||
NATIVE_ARGS(const u8 *failInstr);
|
||||
if (gDisableStructs[gBattlerTarget].tarShot || GetActiveGimmick(gBattlerTarget) == GIMMICK_TERA)
|
||||
{
|
||||
gBattlescriptCurrInstr = cmd->failInstr;
|
||||
}
|
||||
else
|
||||
{
|
||||
gDisableStructs[gBattlerTarget].tarShot = TRUE;
|
||||
gBattlescriptCurrInstr = cmd->nextInstr;
|
||||
}
|
||||
}
|
||||
|
||||
void BS_TeatimeInvul(void)
|
||||
{
|
||||
NATIVE_ARGS(u8 battler, const u8 *jumpInstr);
|
||||
|
||||
@ -139,6 +139,7 @@ static void BufferVerdanturfTentTrainerIntro(void)
|
||||
|
||||
static void SaveVerdanturfTentChallenge(void)
|
||||
{
|
||||
ClearEnemyPartyAfterChallenge();
|
||||
gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005;
|
||||
VarSet(VAR_TEMP_CHALLENGE_STATUS, 0);
|
||||
gSaveBlock2Ptr->frontier.challengePaused = TRUE;
|
||||
@ -189,6 +190,7 @@ static void SetFallarborTentPrize(void)
|
||||
|
||||
static void SaveFallarborTentChallenge(void)
|
||||
{
|
||||
ClearEnemyPartyAfterChallenge();
|
||||
gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005;
|
||||
VarSet(VAR_TEMP_CHALLENGE_STATUS, 0);
|
||||
gSaveBlock2Ptr->frontier.challengePaused = TRUE;
|
||||
@ -244,6 +246,7 @@ static void SetSlateportTentPrize(void)
|
||||
|
||||
static void SaveSlateportTentChallenge(void)
|
||||
{
|
||||
ClearEnemyPartyAfterChallenge();
|
||||
gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005;
|
||||
VarSet(VAR_TEMP_CHALLENGE_STATUS, 0);
|
||||
gSaveBlock2Ptr->frontier.challengePaused = TRUE;
|
||||
|
||||
@ -2206,6 +2206,7 @@ static void SaveTowerChallenge(void)
|
||||
if (gSpecialVar_0x8005 == 0 && (challengeNum > 1 || gSaveBlock2Ptr->frontier.curChallengeBattleNum != 0))
|
||||
SaveBattleTowerRecord();
|
||||
|
||||
ClearEnemyPartyAfterChallenge();
|
||||
gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005;
|
||||
VarSet(VAR_TEMP_CHALLENGE_STATUS, 0);
|
||||
gSaveBlock2Ptr->frontier.challengePaused = TRUE;
|
||||
|
||||
@ -8818,6 +8818,9 @@ static inline u32 CalcMoveBasePower(u32 move, u32 battlerAtk, u32 battlerDef, u3
|
||||
if (GetActiveGimmick(battlerAtk) == GIMMICK_Z_MOVE)
|
||||
return GetZMovePower(gBattleStruct->zmove.baseMoves[battlerAtk]);
|
||||
|
||||
if (GetActiveGimmick(battlerAtk) == GIMMICK_DYNAMAX)
|
||||
return GetMaxMovePower(move);
|
||||
|
||||
switch (gMovesInfo[move].effect)
|
||||
{
|
||||
case EFFECT_PLEDGE:
|
||||
|
||||
@ -21713,7 +21713,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] =
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.priority = 0,
|
||||
.category = DAMAGE_CATEGORY_PHYSICAL,
|
||||
.argument = MAX_EFFECT_FIXED_POWER, //EFFECT TODO
|
||||
.argument = MAX_EFFECT_FIXED_POWER,
|
||||
.ignoresTargetAbility = TRUE,
|
||||
.battleAnimScript = Move_G_MAX_DRUM_SOLO,
|
||||
},
|
||||
@ -21730,7 +21730,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] =
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.priority = 0,
|
||||
.category = DAMAGE_CATEGORY_PHYSICAL,
|
||||
.argument = MAX_EFFECT_FIXED_POWER, //EFFECT TODO
|
||||
.argument = MAX_EFFECT_FIXED_POWER,
|
||||
.ignoresTargetAbility = TRUE,
|
||||
.battleAnimScript = Move_G_MAX_FIREBALL,
|
||||
},
|
||||
@ -21747,7 +21747,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] =
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.priority = 0,
|
||||
.category = DAMAGE_CATEGORY_PHYSICAL,
|
||||
.argument = MAX_EFFECT_FIXED_POWER, //EFFECT TODO
|
||||
.argument = MAX_EFFECT_FIXED_POWER,
|
||||
.ignoresTargetAbility = TRUE,
|
||||
.battleAnimScript = Move_G_MAX_HYDROSNIPE,
|
||||
},
|
||||
@ -21989,7 +21989,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] =
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.priority = 0,
|
||||
.category = DAMAGE_CATEGORY_PHYSICAL,
|
||||
.argument = MAX_EFFECT_BYPASS_PROTECT, //EFFECT TODO
|
||||
.argument = MAX_EFFECT_BYPASS_PROTECT,
|
||||
.battleAnimScript = Move_G_MAX_ONE_BLOW,
|
||||
},
|
||||
|
||||
@ -22005,7 +22005,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] =
|
||||
.target = MOVE_TARGET_SELECTED,
|
||||
.priority = 0,
|
||||
.category = DAMAGE_CATEGORY_PHYSICAL,
|
||||
.argument = MAX_EFFECT_BYPASS_PROTECT, //EFFECT TODO
|
||||
.argument = MAX_EFFECT_BYPASS_PROTECT,
|
||||
.battleAnimScript = Move_G_MAX_RAPID_FLOW,
|
||||
},
|
||||
|
||||
|
||||
@ -1063,7 +1063,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
|
||||
.eggGroups = MON_EGG_GROUPS(EGG_GROUP_FLYING),
|
||||
.abilities = { ABILITY_PRESSURE, ABILITY_UNNERVE, ABILITY_MIRROR_ARMOR },
|
||||
.bodyColor = BODY_COLOR_PURPLE,
|
||||
.speciesName = _("Corviknigh"),
|
||||
.speciesName = _("Corviknight"),
|
||||
.cryId = CRY_CORVIKNIGHT,
|
||||
.natDexNum = NATIONAL_DEX_CORVIKNIGHT,
|
||||
.categoryName = _("Raven"),
|
||||
@ -3605,7 +3605,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
|
||||
.eggGroups = MON_EGG_GROUPS(EGG_GROUP_BUG),
|
||||
.abilities = { ABILITY_FLASH_FIRE, ABILITY_WHITE_SMOKE, ABILITY_FLAME_BODY },
|
||||
.bodyColor = BODY_COLOR_RED,
|
||||
.speciesName = _("Centiskorc"),
|
||||
.speciesName = _("Centiskorch"),
|
||||
.cryId = CRY_CENTISKORCH,
|
||||
.natDexNum = NATIONAL_DEX_CENTISKORCH,
|
||||
.categoryName = _("Radiator"),
|
||||
@ -5280,6 +5280,14 @@ const struct SpeciesInfo gSpeciesInfoGen8[] =
|
||||
.iconSprite = gMonIcon_IndeedeeFemale,
|
||||
.iconPalIndex = 2,
|
||||
FOOTPRINT(Indeedee)
|
||||
OVERWORLD(
|
||||
sPicTable_IndeedeeFemale,
|
||||
SIZE_32x32,
|
||||
SHADOW_SIZE_M,
|
||||
TRACKS_FOOT,
|
||||
gOverworldPalette_IndeedeeFemale,
|
||||
gShinyOverworldPalette_IndeedeeFemale
|
||||
)
|
||||
.levelUpLearnset = sIndeedeeFemaleLevelUpLearnset,
|
||||
.teachableLearnset = sIndeedeeFemaleTeachableLearnset,
|
||||
.eggMoveLearnset = sIndeedeeFemaleEggMoveLearnset,
|
||||
|
||||
@ -2554,3 +2554,14 @@ static void CopyFrontierBrainText(bool8 playerWonText)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void ClearEnemyPartyAfterChallenge()
|
||||
{
|
||||
// We zero out the Enemy's party here when the player either wins or loses the challenge since we
|
||||
// can't do it the usual way in FreeResetData_ReturnToOvOrDoEvolutions() in battle_main.c due to the
|
||||
// way facilities like the Battle Factory and the Slateport Battle Tent work
|
||||
if (gSpecialVar_0x8005 == 0)
|
||||
{
|
||||
ZeroEnemyPartyMons();
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,9 +3,8 @@
|
||||
|
||||
SINGLE_BATTLE_TEST("Anger Point raises Attack stage to maximum after receiving a critical hit")
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_FROST_BREATH].alwaysCriticalHit);
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_FROST_BREATH].alwaysCriticalHit);
|
||||
PLAYER(SPECIES_PRIMEAPE) { Ability(ABILITY_ANGER_POINT); }
|
||||
OPPONENT(SPECIES_SNORUNT);
|
||||
} WHEN {
|
||||
@ -23,10 +22,9 @@ SINGLE_BATTLE_TEST("Anger Point raises Attack stage to maximum after receiving a
|
||||
|
||||
SINGLE_BATTLE_TEST("Anger Point does not trigger when already at maximum Attack stage")
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_FROST_BREATH].alwaysCriticalHit);
|
||||
ASSUME(gMovesInfo[MOVE_BELLY_DRUM].effect == EFFECT_BELLY_DRUM);
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_FROST_BREATH].alwaysCriticalHit);
|
||||
ASSUME(gMovesInfo[MOVE_BELLY_DRUM].effect == EFFECT_BELLY_DRUM);
|
||||
PLAYER(SPECIES_PRIMEAPE) { Ability(ABILITY_ANGER_POINT); Speed(2); }
|
||||
OPPONENT(SPECIES_SNORUNT) { Speed(1); }
|
||||
} WHEN {
|
||||
@ -51,10 +49,9 @@ TO_DO_BATTLE_TEST("Anger Point triggers when a substitute takes the hit (Gen4)")
|
||||
|
||||
SINGLE_BATTLE_TEST("Anger Point does not trigger when a substitute takes the hit (Gen5+)")
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_FROST_BREATH].alwaysCriticalHit);
|
||||
ASSUME(gMovesInfo[MOVE_SUBSTITUTE].effect == EFFECT_SUBSTITUTE);
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_FROST_BREATH].alwaysCriticalHit);
|
||||
ASSUME(gMovesInfo[MOVE_SUBSTITUTE].effect == EFFECT_SUBSTITUTE);
|
||||
PLAYER(SPECIES_PRIMEAPE) { Ability(ABILITY_ANGER_POINT); Speed(2); }
|
||||
OPPONENT(SPECIES_SNORUNT) { Speed(1); }
|
||||
} WHEN {
|
||||
|
||||
@ -28,10 +28,10 @@ SINGLE_BATTLE_TEST("Galvanize can not turn certain moves into Electric type move
|
||||
PARAMETRIZE { move = MOVE_WEATHER_BALL; }
|
||||
PARAMETRIZE { move = MOVE_MULTI_ATTACK; }
|
||||
|
||||
ASSUME(gMovesInfo[MOVE_HIDDEN_POWER].effect == EFFECT_HIDDEN_POWER);
|
||||
ASSUME(gMovesInfo[MOVE_WEATHER_BALL].effect == EFFECT_WEATHER_BALL);
|
||||
ASSUME(gMovesInfo[MOVE_MULTI_ATTACK].effect == EFFECT_CHANGE_TYPE_ON_ITEM);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_HIDDEN_POWER].effect == EFFECT_HIDDEN_POWER);
|
||||
ASSUME(gMovesInfo[MOVE_WEATHER_BALL].effect == EFFECT_WEATHER_BALL);
|
||||
ASSUME(gMovesInfo[MOVE_MULTI_ATTACK].effect == EFFECT_CHANGE_TYPE_ON_ITEM);
|
||||
PLAYER(SPECIES_KRABBY);
|
||||
OPPONENT(SPECIES_GEODUDE_ALOLAN) { Ability(ABILITY_GALVANIZE); }
|
||||
} WHEN {
|
||||
|
||||
@ -60,8 +60,8 @@ SINGLE_BATTLE_TEST("Harvest doesn't always restore a Berry if Cloud Nine/Air Loc
|
||||
|
||||
SINGLE_BATTLE_TEST("Harvest restores a Berry even after being switched out and back in")
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_PARTING_SHOT].effect == EFFECT_PARTING_SHOT);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_PARTING_SHOT].effect == EFFECT_PARTING_SHOT);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); MaxHP(500); HP(251); Item(ITEM_SITRUS_BERRY); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
@ -79,8 +79,8 @@ SINGLE_BATTLE_TEST("Harvest restores a Berry even after being switched out and b
|
||||
|
||||
SINGLE_BATTLE_TEST("Harvest restores a Berry consumed by Fling")
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_FLING].effect == EFFECT_FLING);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_FLING].effect == EFFECT_FLING);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); Item(ITEM_SITRUS_BERRY); }
|
||||
} WHEN {
|
||||
@ -96,8 +96,8 @@ SINGLE_BATTLE_TEST("Harvest restores a Berry consumed by Fling")
|
||||
|
||||
SINGLE_BATTLE_TEST("Harvest restores a Berry consumed by Natural Gift")
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_NATURAL_GIFT].effect == EFFECT_NATURAL_GIFT);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_NATURAL_GIFT].effect == EFFECT_NATURAL_GIFT);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); Item(ITEM_SITRUS_BERRY); }
|
||||
} WHEN {
|
||||
@ -116,8 +116,8 @@ TO_DO_BATTLE_TEST("Harvest only works once per turn"); // Check for berries that
|
||||
SINGLE_BATTLE_TEST("Harvest doesn't restore a Berry when destroyed by Incinerate")
|
||||
{
|
||||
PASSES_RANDOMLY(1, 1, RNG_HARVEST);
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_INCINERATE, MOVE_EFFECT_INCINERATE));
|
||||
GIVEN {
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_INCINERATE, MOVE_EFFECT_INCINERATE));
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); Item(ITEM_SITRUS_BERRY); }
|
||||
} WHEN {
|
||||
@ -134,8 +134,8 @@ SINGLE_BATTLE_TEST("Harvest doesn't restore a Berry when destroyed by Incinerate
|
||||
SINGLE_BATTLE_TEST("Harvest doesn't restore a Berry when knocked off by Knock Off")
|
||||
{
|
||||
PASSES_RANDOMLY(1, 1, RNG_HARVEST);
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_KNOCK_OFF, MOVE_EFFECT_KNOCK_OFF));
|
||||
GIVEN {
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_KNOCK_OFF, MOVE_EFFECT_KNOCK_OFF));
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); Item(ITEM_SITRUS_BERRY); }
|
||||
} WHEN {
|
||||
@ -152,8 +152,8 @@ SINGLE_BATTLE_TEST("Harvest doesn't restore a Berry when knocked off by Knock Of
|
||||
SINGLE_BATTLE_TEST("Harvest doesn't restore a Berry when eaten by Bug Bite/Pluck")
|
||||
{
|
||||
PASSES_RANDOMLY(1, 1, RNG_HARVEST);
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_BUG_BITE, MOVE_EFFECT_BUG_BITE));
|
||||
GIVEN {
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_BUG_BITE, MOVE_EFFECT_BUG_BITE));
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); Item(ITEM_SITRUS_BERRY); }
|
||||
} WHEN {
|
||||
@ -208,8 +208,8 @@ DOUBLE_BATTLE_TEST("Harvest order is affected by speed")
|
||||
|
||||
SINGLE_BATTLE_TEST("Harvest doesn't restore a Berry when transfered to another Pokémon")
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_TRICK].effect == EFFECT_TRICK);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TRICK].effect == EFFECT_TRICK);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); Item(ITEM_SITRUS_BERRY); }
|
||||
} WHEN {
|
||||
@ -225,8 +225,8 @@ SINGLE_BATTLE_TEST("Harvest doesn't restore a Berry when transfered to another P
|
||||
|
||||
SINGLE_BATTLE_TEST("Harvest can restore a Berry that was transferred from another Pokémon")
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_TRICK].effect == EFFECT_TRICK);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TRICK].effect == EFFECT_TRICK);
|
||||
PLAYER(SPECIES_TORKOAL) { Ability(ABILITY_DROUGHT); Item(ITEM_SITRUS_BERRY); }
|
||||
OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); HP(100); MaxHP(500); }
|
||||
} WHEN {
|
||||
@ -244,9 +244,9 @@ SINGLE_BATTLE_TEST("Harvest can restore a Berry that was transferred from anothe
|
||||
|
||||
SINGLE_BATTLE_TEST("Harvest can only restore the newest berry consumed that was transferred from another Pokémon instead of its original Berry")
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_TRICK].effect == EFFECT_TRICK);
|
||||
ASSUME(gItemsInfo[ITEM_APICOT_BERRY].holdEffect == HOLD_EFFECT_SP_DEFENSE_UP);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TRICK].effect == EFFECT_TRICK);
|
||||
ASSUME(gItemsInfo[ITEM_APICOT_BERRY].holdEffect == HOLD_EFFECT_SP_DEFENSE_UP);
|
||||
PLAYER(SPECIES_TORKOAL) { Ability(ABILITY_DROUGHT); Item(ITEM_SITRUS_BERRY); }
|
||||
OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); HP(100); MaxHP(500); Item(ITEM_APICOT_BERRY); }
|
||||
} WHEN {
|
||||
|
||||
@ -43,8 +43,8 @@ SINGLE_BATTLE_TEST("Pickup doesn't grant the user their item")
|
||||
|
||||
SINGLE_BATTLE_TEST("Pickup doesn't grant another Pokémon's popped Air Balloon")
|
||||
{
|
||||
ASSUME(gItemsInfo[ITEM_AIR_BALLOON].holdEffect == HOLD_EFFECT_AIR_BALLOON);
|
||||
GIVEN {
|
||||
ASSUME(gItemsInfo[ITEM_AIR_BALLOON].holdEffect == HOLD_EFFECT_AIR_BALLOON);
|
||||
PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_AIR_BALLOON); }
|
||||
} WHEN {
|
||||
@ -102,8 +102,8 @@ SINGLE_BATTLE_TEST("Pickup doesn't grant an item after its holder faints")
|
||||
|
||||
SINGLE_BATTLE_TEST("Pickup doesn't grant an used item if holder is replaced")
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_PARTING_SHOT].effect == EFFECT_PARTING_SHOT);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_PARTING_SHOT].effect == EFFECT_PARTING_SHOT);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { MaxHP(300); HP(151); Item(ITEM_SITRUS_BERRY); }
|
||||
@ -127,8 +127,8 @@ SINGLE_BATTLE_TEST("Pickup doesn't grant an used item if holder is replaced")
|
||||
|
||||
SINGLE_BATTLE_TEST("Pickup doesn't grant an item if it destroyed the item with Incinerate")
|
||||
{
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_INCINERATE, MOVE_EFFECT_INCINERATE));
|
||||
GIVEN {
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_INCINERATE, MOVE_EFFECT_INCINERATE));
|
||||
PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); }
|
||||
} WHEN {
|
||||
@ -146,8 +146,8 @@ SINGLE_BATTLE_TEST("Pickup doesn't grant an item if it destroyed the item with I
|
||||
|
||||
SINGLE_BATTLE_TEST("Pickup doesn't grant an item if it knocked off that item")
|
||||
{
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_KNOCK_OFF, MOVE_EFFECT_KNOCK_OFF));
|
||||
GIVEN {
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_KNOCK_OFF, MOVE_EFFECT_KNOCK_OFF));
|
||||
PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); }
|
||||
} WHEN {
|
||||
@ -165,8 +165,8 @@ SINGLE_BATTLE_TEST("Pickup doesn't grant an item if it knocked off that item")
|
||||
|
||||
SINGLE_BATTLE_TEST("Pickup doesn't grant an item if the user eats it with Bug Bite/Pluck")
|
||||
{
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_BUG_BITE, MOVE_EFFECT_BUG_BITE));
|
||||
GIVEN {
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_BUG_BITE, MOVE_EFFECT_BUG_BITE));
|
||||
PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); }
|
||||
} WHEN {
|
||||
@ -184,8 +184,8 @@ SINGLE_BATTLE_TEST("Pickup doesn't grant an item if the user eats it with Bug Bi
|
||||
|
||||
SINGLE_BATTLE_TEST("Pickup doesn't grant an used item if its user already restored it")
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_RECYCLE].effect == EFFECT_RECYCLE);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_RECYCLE].effect == EFFECT_RECYCLE);
|
||||
PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { MaxHP(100); HP(51); Item(ITEM_SITRUS_BERRY); }
|
||||
} WHEN {
|
||||
@ -204,8 +204,8 @@ SINGLE_BATTLE_TEST("Pickup doesn't grant an used item if its user already restor
|
||||
|
||||
SINGLE_BATTLE_TEST("Pickup restores an item that has been Flinged")
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_FLING].effect == EFFECT_FLING);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_FLING].effect == EFFECT_FLING);
|
||||
PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); }
|
||||
} WHEN {
|
||||
@ -221,8 +221,8 @@ SINGLE_BATTLE_TEST("Pickup restores an item that has been Flinged")
|
||||
|
||||
SINGLE_BATTLE_TEST("Pickup restores an item that was used by Natural Gift")
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_NATURAL_GIFT].effect == EFFECT_NATURAL_GIFT);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_NATURAL_GIFT].effect == EFFECT_NATURAL_GIFT);
|
||||
PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); }
|
||||
} WHEN {
|
||||
@ -258,8 +258,8 @@ DOUBLE_BATTLE_TEST("Pickup triggers based on Speed order")
|
||||
DOUBLE_BATTLE_TEST("Pickup grants a random item used by another Pokémon")
|
||||
{
|
||||
PASSES_RANDOMLY(1, 3, RNG_PICKUP);
|
||||
ASSUME(gItemsInfo[ITEM_WHITE_HERB].holdEffect == HOLD_EFFECT_RESTORE_STATS);
|
||||
GIVEN {
|
||||
ASSUME(gItemsInfo[ITEM_WHITE_HERB].holdEffect == HOLD_EFFECT_RESTORE_STATS);
|
||||
PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); }
|
||||
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_WHITE_HERB); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { MaxHP(100); HP(51); Item(ITEM_SITRUS_BERRY); }
|
||||
|
||||
@ -107,8 +107,8 @@ SINGLE_BATTLE_TEST("Wind Rider activates when it's no longer effected by Neutral
|
||||
|
||||
SINGLE_BATTLE_TEST("Wind Rider absorbs Wind moves and raises Attack by one stage")
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_GUST].windMove == TRUE);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_GUST].windMove == TRUE);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_BRAMBLIN) { Ability(ABILITY_WIND_RIDER); }
|
||||
} WHEN {
|
||||
|
||||
@ -11,12 +11,12 @@ SINGLE_BATTLE_TEST("Shaymin-Sky reverts to Shaymin-Land when frozen or frostbitt
|
||||
PARAMETRIZE { move = MOVE_POISON_STING; }
|
||||
PARAMETRIZE { move = MOVE_POISON_FANG; }
|
||||
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_POWDER_SNOW, MOVE_EFFECT_FREEZE_OR_FROSTBITE));
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_EMBER, MOVE_EFFECT_BURN));
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_THUNDERSHOCK, MOVE_EFFECT_PARALYSIS));
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_POISON_STING, MOVE_EFFECT_POISON));
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_POISON_FANG, MOVE_EFFECT_TOXIC));
|
||||
GIVEN {
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_POWDER_SNOW, MOVE_EFFECT_FREEZE_OR_FROSTBITE));
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_EMBER, MOVE_EFFECT_BURN));
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_THUNDERSHOCK, MOVE_EFFECT_PARALYSIS));
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_POISON_STING, MOVE_EFFECT_POISON));
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_POISON_FANG, MOVE_EFFECT_TOXIC));
|
||||
PLAYER(SPECIES_SHAYMIN_SKY);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@ -400,6 +400,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves deal 1/4 damage through protect", s16 da
|
||||
}
|
||||
}
|
||||
|
||||
// This test will fail if it's the first test a thread runs
|
||||
SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves don't bypass Max Guard")
|
||||
{
|
||||
GIVEN {
|
||||
@ -1463,8 +1464,8 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves don't execute effects on fainted battler
|
||||
|
||||
SINGLE_BATTLE_TEST("(DYNAMAX) Moxie clones can be triggered by Max Moves fainting opponents")
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_WATERFALL].power > 0);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_WATERFALL].power > 0);
|
||||
PLAYER(SPECIES_GYARADOS) { Ability(ABILITY_MOXIE); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { HP(1); }
|
||||
OPPONENT(SPECIES_WYNAUT);
|
||||
@ -1476,3 +1477,54 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Moxie clones can be triggered by Max Moves faintin
|
||||
MESSAGE("Gyarados's Moxie raised its Attack!");
|
||||
}
|
||||
}
|
||||
|
||||
// This test will fail if it's the first test a thread runs
|
||||
SINGLE_BATTLE_TEST("(DYNAMAX) Max Attacks prints a message when hitting into Max Guard")
|
||||
{
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_GROWL, gimmick: GIMMICK_DYNAMAX); MOVE(opponent, MOVE_TACKLE, gimmick: GIMMICK_DYNAMAX); }
|
||||
} SCENE {
|
||||
MESSAGE("Wobbuffet used Max Guard!");
|
||||
MESSAGE("Foe Wobbuffet used Max Strike!");
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves don't bypass absorbing abilities")
|
||||
{
|
||||
u32 move, ability, species;
|
||||
PARAMETRIZE { move = MOVE_SPARK; ability = ABILITY_VOLT_ABSORB; species = SPECIES_LANTURN; }
|
||||
PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_WATER_ABSORB; species = SPECIES_LANTURN; }
|
||||
PARAMETRIZE { move = MOVE_EMBER; ability = ABILITY_FLASH_FIRE; species = SPECIES_HEATRAN; }
|
||||
PARAMETRIZE { move = MOVE_SPARK; ability = ABILITY_LIGHTNING_ROD; species = SPECIES_PIKACHU; }
|
||||
PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_STORM_DRAIN; species = SPECIES_GASTRODON; }
|
||||
PARAMETRIZE { move = MOVE_EMBER; ability = ABILITY_WELL_BAKED_BODY; species = SPECIES_DACHSBUN; }
|
||||
PARAMETRIZE { move = MOVE_SPARK; ability = ABILITY_MOTOR_DRIVE; species = SPECIES_ELECTIVIRE; }
|
||||
PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_DRY_SKIN; species = SPECIES_PARASECT; }
|
||||
PARAMETRIZE { move = MOVE_MUD_BOMB; ability = ABILITY_EARTH_EATER; species = SPECIES_ORTHWORM; }
|
||||
PARAMETRIZE { move = MOVE_VINE_WHIP; ability = ABILITY_SAP_SIPPER; species = SPECIES_MILTANK; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_WATER_GUN].type == TYPE_WATER);
|
||||
ASSUME(gMovesInfo[MOVE_SPARK].type == TYPE_ELECTRIC);
|
||||
ASSUME(gMovesInfo[MOVE_EMBER].type == TYPE_FIRE);
|
||||
ASSUME(gMovesInfo[MOVE_MUD_BOMB].type == TYPE_GROUND);
|
||||
ASSUME(gMovesInfo[MOVE_VINE_WHIP].type == TYPE_GRASS);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(species) { Ability(ability); }
|
||||
} WHEN {
|
||||
TURN { MOVE(player, move, gimmick: GIMMICK_DYNAMAX); }
|
||||
} SCENE {
|
||||
NONE_OF {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_MAX_LIGHTNING, player);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_MAX_FLARE, player);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_MAX_GEYSER, player);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_MAX_QUAKE, player);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_MAX_OVERGROWTH, player);
|
||||
HP_BAR(opponent);
|
||||
}
|
||||
ABILITY_POPUP(opponent, ability);
|
||||
}
|
||||
}
|
||||
@ -85,11 +85,11 @@ DOUBLE_BATTLE_TEST("Turn order is determined randomly if priority and Speed tie
|
||||
PARAMETRIZE {} // Hack to make permutations legal.
|
||||
PASSES_RANDOMLY(24, 24, RNG_SPEED_TIE);
|
||||
|
||||
ASSUME(gMovesInfo[MOVE_ENDEAVOR].effect == EFFECT_ENDEAVOR);
|
||||
ASSUME(gMovesInfo[MOVE_LIFE_DEW].effect == EFFECT_JUNGLE_HEALING);
|
||||
ASSUME(gMovesInfo[MOVE_CRUSH_GRIP].effect == EFFECT_VARY_POWER_BASED_ON_HP);
|
||||
ASSUME(gMovesInfo[MOVE_SUPER_FANG].effect == EFFECT_SUPER_FANG);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_ENDEAVOR].effect == EFFECT_ENDEAVOR);
|
||||
ASSUME(gMovesInfo[MOVE_LIFE_DEW].effect == EFFECT_JUNGLE_HEALING);
|
||||
ASSUME(gMovesInfo[MOVE_CRUSH_GRIP].effect == EFFECT_VARY_POWER_BASED_ON_HP);
|
||||
ASSUME(gMovesInfo[MOVE_SUPER_FANG].effect == EFFECT_SUPER_FANG);
|
||||
PLAYER(SPECIES_WOBBUFFET) { MaxHP(480); HP(360); Defense(100); Speed(1); }
|
||||
PLAYER(SPECIES_WYNAUT) { Speed(1); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Attack(100); Speed(1); }
|
||||
@ -136,9 +136,9 @@ DOUBLE_BATTLE_TEST("Turn order is determined randomly if priority and Speed tie
|
||||
|
||||
SINGLE_BATTLE_TEST("Critical hits occur at a 1/24 rate")
|
||||
{
|
||||
ASSUME(B_CRIT_CHANCE >= GEN_7);
|
||||
PASSES_RANDOMLY(1, 24, RNG_CRITICAL_HIT);
|
||||
GIVEN {
|
||||
ASSUME(B_CRIT_CHANCE >= GEN_7);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
@ -150,10 +150,10 @@ SINGLE_BATTLE_TEST("Critical hits occur at a 1/24 rate")
|
||||
|
||||
SINGLE_BATTLE_TEST("Slash's critical hits occur at a 1/8 rate")
|
||||
{
|
||||
ASSUME(B_CRIT_CHANCE >= GEN_7);
|
||||
ASSUME(gMovesInfo[MOVE_SLASH].criticalHitStage == 1);
|
||||
PASSES_RANDOMLY(1, 8, RNG_CRITICAL_HIT);
|
||||
GIVEN {
|
||||
ASSUME(B_CRIT_CHANCE >= GEN_7);
|
||||
ASSUME(gMovesInfo[MOVE_SLASH].criticalHitStage == 1);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@ -26,8 +26,8 @@ SINGLE_BATTLE_TEST("Absorb recovers 50% of the damage dealt")
|
||||
|
||||
SINGLE_BATTLE_TEST("Absorb fails if Heal Block applies")
|
||||
{
|
||||
ASSUME(B_HEAL_BLOCKING >= GEN_6);
|
||||
GIVEN {
|
||||
ASSUME(B_HEAL_BLOCKING >= GEN_6);
|
||||
PLAYER(SPECIES_WOBBUFFET) { HP(1); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@ -8,9 +8,9 @@ ASSUMPTIONS
|
||||
|
||||
SINGLE_BATTLE_TEST("Sand Attack lowers Accuracy by 1 stage")
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_SCRATCH].accuracy == 100);
|
||||
PASSES_RANDOMLY(gMovesInfo[MOVE_SCRATCH].accuracy * 3 / 4, 100, RNG_ACCURACY);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_SCRATCH].accuracy == 100);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@ -39,8 +39,8 @@ SINGLE_BATTLE_TEST("Dream Eater fails on awake targets")
|
||||
|
||||
SINGLE_BATTLE_TEST("Dream Eater fails if Heal Block applies")
|
||||
{
|
||||
ASSUME(B_HEAL_BLOCKING >= GEN_6);
|
||||
GIVEN {
|
||||
ASSUME(B_HEAL_BLOCKING >= GEN_6);
|
||||
PLAYER(SPECIES_WOBBUFFET) { HP(1); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@ -8,9 +8,9 @@ ASSUMPTIONS
|
||||
|
||||
SINGLE_BATTLE_TEST("Double Team raises Evasion")
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_SCRATCH].accuracy == 100);
|
||||
PASSES_RANDOMLY(gMovesInfo[MOVE_SCRATCH].accuracy * 3 / 4, 100, RNG_ACCURACY);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_SCRATCH].accuracy == 100);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||
@ -158,9 +158,9 @@ SINGLE_BATTLE_TEST("Future Sight will miss timing if target faints by residual d
|
||||
|
||||
SINGLE_BATTLE_TEST("Future Sight breaks Focus Sash and doesn't make the holder endure another move")
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_PSYCHIC].power > 0);
|
||||
ASSUME(gItemsInfo[ITEM_FOCUS_SASH].holdEffect == HOLD_EFFECT_FOCUS_SASH);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_PSYCHIC].power > 0);
|
||||
ASSUME(gItemsInfo[ITEM_FOCUS_SASH].holdEffect == HOLD_EFFECT_FOCUS_SASH);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_PIDGEY) { Level(1); Item(ITEM_FOCUS_SASH); }
|
||||
} WHEN {
|
||||
|
||||
@ -88,9 +88,8 @@ SINGLE_BATTLE_TEST("Heal Bell cures inactive soundproof Pokemon")
|
||||
|
||||
SINGLE_BATTLE_TEST("Heal Bell cures a soundproof user")
|
||||
{
|
||||
ASSUME(B_HEAL_BELL_SOUNDPROOF == GEN_5 || B_HEAL_BELL_SOUNDPROOF >= GEN_8);
|
||||
|
||||
GIVEN {
|
||||
ASSUME(B_HEAL_BELL_SOUNDPROOF == GEN_5 || B_HEAL_BELL_SOUNDPROOF >= GEN_8);
|
||||
PLAYER(SPECIES_EXPLOUD) { Ability(ABILITY_SOUNDPROOF); Status1(STATUS1_POISON); }
|
||||
OPPONENT(SPECIES_WYNAUT);
|
||||
} WHEN {
|
||||
|
||||
@ -23,8 +23,8 @@ DOUBLE_BATTLE_TEST("Instruct fails if target hasn't made a move")
|
||||
|
||||
DOUBLE_BATTLE_TEST("Instruct fails if move is banned by Instruct")
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_BIDE].instructBanned == TRUE);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_BIDE].instructBanned == TRUE);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_BIDE); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
@ -59,8 +59,8 @@ DOUBLE_BATTLE_TEST("Instruct-called move targets the target of the move picked o
|
||||
|
||||
DOUBLE_BATTLE_TEST("Instruct doesn't bypass sleep")
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_SPORE].effect == EFFECT_SLEEP);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_SPORE].effect == EFFECT_SLEEP);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_GROWL); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
@ -78,8 +78,8 @@ DOUBLE_BATTLE_TEST("Instruct doesn't bypass sleep")
|
||||
|
||||
DOUBLE_BATTLE_TEST("Instruct fails if target doesn't know the last move it used")
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_DRAGON_DANCE].danceMove == TRUE);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_DRAGON_DANCE].danceMove == TRUE);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_ORICORIO) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_CELEBRATE); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
@ -99,8 +99,8 @@ DOUBLE_BATTLE_TEST("Instruct fails if target doesn't know the last move it used"
|
||||
|
||||
DOUBLE_BATTLE_TEST("Instruct-called move fails if it can only be used on the first turn but consumes PP")
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_FAKE_OUT].effect == EFFECT_FIRST_TURN_ONLY);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_FAKE_OUT].effect == EFFECT_FIRST_TURN_ONLY);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_FAKE_OUT); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
@ -118,8 +118,8 @@ DOUBLE_BATTLE_TEST("Instruct-called move fails if it can only be used on the fir
|
||||
|
||||
DOUBLE_BATTLE_TEST("Instruct-called move doesn't fail if tormented")
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_TORMENT].effect == EFFECT_TORMENT);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TORMENT].effect == EFFECT_TORMENT);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_FAKE_OUT); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
@ -136,9 +136,9 @@ DOUBLE_BATTLE_TEST("Instruct-called move doesn't fail if tormented")
|
||||
|
||||
DOUBLE_BATTLE_TEST("Instruct-called status moves don't fail if holding Assault Vest")
|
||||
{
|
||||
ASSUME(gItemsInfo[ITEM_ASSAULT_VEST].holdEffect == HOLD_EFFECT_ASSAULT_VEST);
|
||||
ASSUME(gMovesInfo[MOVE_TRICK].effect == EFFECT_TRICK);
|
||||
GIVEN {
|
||||
ASSUME(gItemsInfo[ITEM_ASSAULT_VEST].holdEffect == HOLD_EFFECT_ASSAULT_VEST);
|
||||
ASSUME(gMovesInfo[MOVE_TRICK].effect == EFFECT_TRICK);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_TRICK); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_ASSAULT_VEST); }
|
||||
@ -154,8 +154,8 @@ DOUBLE_BATTLE_TEST("Instruct-called status moves don't fail if holding Assault V
|
||||
|
||||
DOUBLE_BATTLE_TEST("Instruct-called status move fails if taunted")
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_TAUNT].effect == EFFECT_TAUNT);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_TAUNT].effect == EFFECT_TAUNT);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_GROWL); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
@ -180,8 +180,8 @@ DOUBLE_BATTLE_TEST("Instruct-called status move fails if taunted")
|
||||
|
||||
DOUBLE_BATTLE_TEST("Instruct-called moves fail if disabled")
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_DISABLE].effect == EFFECT_DISABLE);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_DISABLE].effect == EFFECT_DISABLE);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_GROWL); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
@ -200,9 +200,9 @@ DOUBLE_BATTLE_TEST("Instruct-called moves fail if disabled")
|
||||
|
||||
DOUBLE_BATTLE_TEST("Instruct-called moves keep their priority")
|
||||
{
|
||||
ASSUME(gMovesInfo[MOVE_QUICK_ATTACK].priority == 1);
|
||||
ASSUME(gMovesInfo[MOVE_PSYCHIC_TERRAIN].effect == EFFECT_PSYCHIC_TERRAIN);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_QUICK_ATTACK].priority == 1);
|
||||
ASSUME(gMovesInfo[MOVE_PSYCHIC_TERRAIN].effect == EFFECT_PSYCHIC_TERRAIN);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_QUICK_ATTACK); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
|
||||
@ -183,3 +183,51 @@ SINGLE_BATTLE_TEST("Endure does not prevent multiple hits and stat changes occur
|
||||
MESSAGE("Wobbuffet's Speed rose!");
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Scale Shot decreases defense and increases speed after the 4th hit of Loaded Dice")
|
||||
{
|
||||
PASSES_RANDOMLY(50, 100, RNG_LOADED_DICE);
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_SCALE_SHOT].effect == EFFECT_MULTI_HIT);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LOADED_DICE); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_SCALE_SHOT); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player);
|
||||
MESSAGE("Hit 4 time(s)!");
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
|
||||
MESSAGE("Wobbuffet's Defense fell!");
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
|
||||
MESSAGE("Wobbuffet's Speed rose!");
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Scale Shot decreases defense and increases speed after killing opposing with less then 4 hits")
|
||||
{
|
||||
u32 item;
|
||||
PARAMETRIZE { item = ITEM_NONE; }
|
||||
PARAMETRIZE { item = ITEM_LOADED_DICE; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(gMovesInfo[MOVE_SCALE_SHOT].effect == EFFECT_MULTI_HIT);
|
||||
PLAYER(SPECIES_BAGON) { Item(item); }
|
||||
OPPONENT(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_SCALE_SHOT); SEND_OUT(opponent, 1); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCALE_SHOT, player);
|
||||
MESSAGE("Foe Slugma fainted!");
|
||||
MESSAGE("Hit 3 time(s)!");
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
|
||||
MESSAGE("Bagon's Defense fell!");
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player);
|
||||
MESSAGE("Bagon's Speed rose!");
|
||||
}
|
||||
}
|
||||
|
||||
@ -88,11 +88,11 @@ SINGLE_BATTLE_TEST("Reflect Type does not affect any of Silvally's forms")
|
||||
|
||||
SINGLE_BATTLE_TEST("Reflect Type does not affect Pokémon with no types")
|
||||
{
|
||||
ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE);
|
||||
ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE);
|
||||
ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[0] == TYPE_WATER);
|
||||
ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[1] == TYPE_FIGHTING);
|
||||
GIVEN {
|
||||
ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE);
|
||||
ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE);
|
||||
ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[0] == TYPE_WATER);
|
||||
ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[1] == TYPE_FIGHTING);
|
||||
PLAYER(SPECIES_ARCANINE);
|
||||
OPPONENT(SPECIES_POLIWRATH);
|
||||
} WHEN {
|
||||
@ -109,11 +109,11 @@ SINGLE_BATTLE_TEST("Reflect Type does not affect Pokémon with no types")
|
||||
|
||||
SINGLE_BATTLE_TEST("Reflect Type copies a target's dual types")
|
||||
{
|
||||
ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE);
|
||||
ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE);
|
||||
ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[0] == TYPE_WATER);
|
||||
ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[1] == TYPE_FIGHTING);
|
||||
GIVEN {
|
||||
ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE);
|
||||
ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE);
|
||||
ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[0] == TYPE_WATER);
|
||||
ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[1] == TYPE_FIGHTING);
|
||||
PLAYER(SPECIES_ARCANINE);
|
||||
OPPONENT(SPECIES_POLIWRATH);
|
||||
} WHEN {
|
||||
@ -131,11 +131,11 @@ SINGLE_BATTLE_TEST("Reflect Type copies a target's dual types")
|
||||
|
||||
SINGLE_BATTLE_TEST("Reflect Type copies a target's pure type")
|
||||
{
|
||||
ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE);
|
||||
ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE);
|
||||
ASSUME(gSpeciesInfo[SPECIES_SUDOWOODO].types[0] == TYPE_ROCK);
|
||||
ASSUME(gSpeciesInfo[SPECIES_SUDOWOODO].types[1] == TYPE_ROCK);
|
||||
GIVEN {
|
||||
ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE);
|
||||
ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE);
|
||||
ASSUME(gSpeciesInfo[SPECIES_SUDOWOODO].types[0] == TYPE_ROCK);
|
||||
ASSUME(gSpeciesInfo[SPECIES_SUDOWOODO].types[1] == TYPE_ROCK);
|
||||
PLAYER(SPECIES_ARCANINE);
|
||||
OPPONENT(SPECIES_SUDOWOODO);
|
||||
} WHEN {
|
||||
@ -153,11 +153,11 @@ SINGLE_BATTLE_TEST("Reflect Type copies a target's pure type")
|
||||
|
||||
SINGLE_BATTLE_TEST("Reflect Type defaults to Normal type for the user's types[0] and types[1] if the target only has a 3rd type")
|
||||
{
|
||||
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC);
|
||||
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] == TYPE_PSYCHIC);
|
||||
ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE);
|
||||
ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE);
|
||||
GIVEN {
|
||||
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC);
|
||||
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] == TYPE_PSYCHIC);
|
||||
ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE);
|
||||
ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_ARCANINE);
|
||||
} WHEN {
|
||||
|
||||
@ -74,7 +74,6 @@ DOUBLE_BATTLE_TEST("Round still preserves the turn order outside of the other Ro
|
||||
}
|
||||
DOUBLE_BATTLE_TEST("Round still preserves the turn order outside of the other Round users moving immediately with switch")
|
||||
{
|
||||
KNOWN_FAILING; // #5148
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WYNAUT);
|
||||
|
||||
@ -42,3 +42,46 @@ SINGLE_BATTLE_TEST("Tar Shot doubles the effectiveness of Fire-type moves used o
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Tar Shot does not affect Pokemon that are Terastallized")
|
||||
{
|
||||
s16 damage[2];
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_NORMAL); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) ;
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_TERA); MOVE(opponent, MOVE_EMBER); }
|
||||
TURN { MOVE(opponent, MOVE_TAR_SHOT); }
|
||||
TURN { MOVE(opponent, MOVE_EMBER); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, opponent);
|
||||
HP_BAR(player, captureDamage: &damage[0]);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_TAR_SHOT, opponent);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, opponent);
|
||||
HP_BAR(player, captureDamage: &damage[1]);
|
||||
NOT MESSAGE("It's super effective!");
|
||||
} THEN {
|
||||
EXPECT_EQ(damage[0], damage[1]);
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Tar Shot does affect Pokemon that Terastallized after Tar Shot status was applied")
|
||||
{
|
||||
s16 damage[2];
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_NORMAL); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) ;
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, MOVE_EMBER); }
|
||||
TURN { MOVE(opponent, MOVE_TAR_SHOT); }
|
||||
TURN { MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_TERA); MOVE(opponent, MOVE_EMBER); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, opponent);
|
||||
HP_BAR(player, captureDamage: &damage[0]);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_TAR_SHOT, opponent);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, opponent);
|
||||
HP_BAR(player, captureDamage: &damage[1]);
|
||||
MESSAGE("It's super effective!");
|
||||
} THEN {
|
||||
EXPECT_MUL_EQ(damage[0], Q_4_12(2.0), damage[1]);
|
||||
}
|
||||
}
|
||||
|
||||
@ -46,10 +46,10 @@ SINGLE_BATTLE_TEST("Triple Arrows makes the foe flinch 30% of the time")
|
||||
|
||||
SINGLE_BATTLE_TEST("Triple Arrows lands a critical hit")
|
||||
{
|
||||
ASSUME(B_CRIT_CHANCE >= GEN_7);
|
||||
ASSUME(gMovesInfo[MOVE_TRIPLE_ARROWS].criticalHitStage == 1);
|
||||
PASSES_RANDOMLY(1, 8, RNG_CRITICAL_HIT);
|
||||
GIVEN {
|
||||
ASSUME(B_CRIT_CHANCE >= GEN_7);
|
||||
ASSUME(gMovesInfo[MOVE_TRIPLE_ARROWS].criticalHitStage == 1);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
||||