diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 7ad110ab11..42d452c6dd 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -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 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index b41d58cac3..b3e5528078 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -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 diff --git a/graphics/pokemon/cinderace/gigantamax/back.png b/graphics/pokemon/cinderace/gigantamax/back.png index b9e6b813de..d07be68143 100644 Binary files a/graphics/pokemon/cinderace/gigantamax/back.png and b/graphics/pokemon/cinderace/gigantamax/back.png differ diff --git a/graphics/pokemon/indeedee/back.png b/graphics/pokemon/indeedee/back.png index 9fcfda9f9b..8008cd6fb4 100644 Binary files a/graphics/pokemon/indeedee/back.png and b/graphics/pokemon/indeedee/back.png differ diff --git a/graphics/pokemon/indeedee/female/back.png b/graphics/pokemon/indeedee/female/back.png index 425cfe3689..d0a6a32c03 100644 Binary files a/graphics/pokemon/indeedee/female/back.png and b/graphics/pokemon/indeedee/female/back.png differ diff --git a/graphics/pokemon/indeedee/female/overworld.png b/graphics/pokemon/indeedee/female/overworld.png index 609039c70d..22a525089a 100644 Binary files a/graphics/pokemon/indeedee/female/overworld.png and b/graphics/pokemon/indeedee/female/overworld.png differ diff --git a/graphics/pokemon/indeedee/female/overworld_shiny.pal b/graphics/pokemon/indeedee/female/overworld_shiny.pal index d258b99c8d..f52cf28ea6 100644 --- a/graphics/pokemon/indeedee/female/overworld_shiny.pal +++ b/graphics/pokemon/indeedee/female/overworld_shiny.pal @@ -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 diff --git a/graphics/pokemon/indeedee/female/shiny.pal b/graphics/pokemon/indeedee/female/shiny.pal index 7f45b6bf6c..369076f8d4 100644 --- a/graphics/pokemon/indeedee/female/shiny.pal +++ b/graphics/pokemon/indeedee/female/shiny.pal @@ -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 diff --git a/graphics/pokemon/indeedee/front.png b/graphics/pokemon/indeedee/front.png index 26b082b61b..b93a3fad73 100644 Binary files a/graphics/pokemon/indeedee/front.png and b/graphics/pokemon/indeedee/front.png differ diff --git a/graphics/pokemon/indeedee/shiny.pal b/graphics/pokemon/indeedee/shiny.pal index 6bb5eca576..2b0aa6197b 100644 --- a/graphics/pokemon/indeedee/shiny.pal +++ b/graphics/pokemon/indeedee/shiny.pal @@ -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 diff --git a/include/constants/species.h b/include/constants/species.h index 895e444d51..a0cce51398 100644 --- a/include/constants/species.h +++ b/include/constants/species.h @@ -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 diff --git a/include/frontier_util.h b/include/frontier_util.h index 637b7f91bb..0d617782a3 100644 --- a/include/frontier_util.h +++ b/include/frontier_util.h @@ -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 diff --git a/spritesheet_rules.mk b/spritesheet_rules.mk index 649995a5cb..3dfea83037 100644 --- a/spritesheet_rules.mk +++ b/spritesheet_rules.mk @@ -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 diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index cf650f1c14..b622cf273a 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -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) diff --git a/src/battle_arena.c b/src/battle_arena.c index f9a51ac652..b292ff8837 100644 --- a/src/battle_arena.c +++ b/src/battle_arena.c @@ -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; diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 5992a03ee6..209a40e751 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -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); diff --git a/src/battle_dome.c b/src/battle_dome.c index 49a5902787..1d79333290 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -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; diff --git a/src/battle_dynamax.c b/src/battle_dynamax.c index cdcf05f7db..073e2c55bc 100644 --- a/src/battle_dynamax.c +++ b/src/battle_dynamax.c @@ -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: diff --git a/src/battle_factory.c b/src/battle_factory.c index b5645368c2..8edd9a2ddf 100644 --- a/src/battle_factory.c +++ b/src/battle_factory.c @@ -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; } diff --git a/src/battle_gimmick.c b/src/battle_gimmick.c index 815fd5fc3e..057619aec1 100644 --- a/src/battle_gimmick.c +++ b/src/battle_gimmick.c @@ -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; } diff --git a/src/battle_main.c b/src/battle_main.c index d6a8d7ef0e..319c26bcfa 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -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(); diff --git a/src/battle_palace.c b/src/battle_palace.c index a521acea2b..fdcb8d3903 100644 --- a/src/battle_palace.c +++ b/src/battle_palace.c @@ -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; diff --git a/src/battle_pike.c b/src/battle_pike.c index 3869531d20..3ce3cd443a 100644 --- a/src/battle_pike.c +++ b/src/battle_pike.c @@ -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; diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c index aa3c63ef82..a184c9160f 100644 --- a/src/battle_pyramid.c +++ b/src/battle_pyramid.c @@ -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; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 103819bb45..231afefc1f 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -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); diff --git a/src/battle_tent.c b/src/battle_tent.c index 8c6a94509a..49df90ffd6 100644 --- a/src/battle_tent.c +++ b/src/battle_tent.c @@ -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; diff --git a/src/battle_tower.c b/src/battle_tower.c index 51200512f1..72858a854c 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -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; diff --git a/src/battle_util.c b/src/battle_util.c index 514714ac0f..d6279dc317 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -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: diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 99217808ac..0213161f0d 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -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, }, diff --git a/src/data/pokemon/species_info/gen_8_families.h b/src/data/pokemon/species_info/gen_8_families.h index ca1791caa0..a95f171fb0 100644 --- a/src/data/pokemon/species_info/gen_8_families.h +++ b/src/data/pokemon/species_info/gen_8_families.h @@ -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, diff --git a/src/frontier_util.c b/src/frontier_util.c index 7cadbf364b..b9d4f29e32 100644 --- a/src/frontier_util.c +++ b/src/frontier_util.c @@ -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(); + } +} diff --git a/test/battle/ability/anger_point.c b/test/battle/ability/anger_point.c index 270d66f28e..ddfa3c841d 100644 --- a/test/battle/ability/anger_point.c +++ b/test/battle/ability/anger_point.c @@ -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 { diff --git a/test/battle/ability/galvanize.c b/test/battle/ability/galvanize.c index 55dfd7287a..7f604f3dac 100644 --- a/test/battle/ability/galvanize.c +++ b/test/battle/ability/galvanize.c @@ -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 { diff --git a/test/battle/ability/harvest.c b/test/battle/ability/harvest.c index f19e0715de..03e13b394e 100644 --- a/test/battle/ability/harvest.c +++ b/test/battle/ability/harvest.c @@ -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 { diff --git a/test/battle/ability/pickup.c b/test/battle/ability/pickup.c index 57f6429feb..927e1b3468 100644 --- a/test/battle/ability/pickup.c +++ b/test/battle/ability/pickup.c @@ -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); } diff --git a/test/battle/ability/wind_rider.c b/test/battle/ability/wind_rider.c index 57e6f0d275..cd4dbeed1f 100644 --- a/test/battle/ability/wind_rider.c +++ b/test/battle/ability/wind_rider.c @@ -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 { diff --git a/test/battle/form_change/status.c b/test/battle/form_change/status.c index 0b94202bbd..612c125497 100644 --- a/test/battle/form_change/status.c +++ b/test/battle/form_change/status.c @@ -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 { diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index b865ef2f1c..f9865f7b6c 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -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); + } +} \ No newline at end of file diff --git a/test/battle/move.c b/test/battle/move.c index 081a91712d..655895da77 100644 --- a/test/battle/move.c +++ b/test/battle/move.c @@ -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 { diff --git a/test/battle/move_effect/absorb.c b/test/battle/move_effect/absorb.c index b0140a7a65..698ea41091 100644 --- a/test/battle/move_effect/absorb.c +++ b/test/battle/move_effect/absorb.c @@ -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 { diff --git a/test/battle/move_effect/accuracy_down.c b/test/battle/move_effect/accuracy_down.c index a4a8ad49bf..8a015c4a67 100644 --- a/test/battle/move_effect/accuracy_down.c +++ b/test/battle/move_effect/accuracy_down.c @@ -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 { diff --git a/test/battle/move_effect/dream_eater.c b/test/battle/move_effect/dream_eater.c index 4ce749b5d2..f0fd113d2b 100644 --- a/test/battle/move_effect/dream_eater.c +++ b/test/battle/move_effect/dream_eater.c @@ -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 { diff --git a/test/battle/move_effect/evasion_up.c b/test/battle/move_effect/evasion_up.c index 4dcd92c7b3..7058694e9d 100644 --- a/test/battle/move_effect/evasion_up.c +++ b/test/battle/move_effect/evasion_up.c @@ -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 { diff --git a/test/battle/move_effect/future_sight.c b/test/battle/move_effect/future_sight.c index fa78461a9d..778895ba58 100644 --- a/test/battle/move_effect/future_sight.c +++ b/test/battle/move_effect/future_sight.c @@ -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 { diff --git a/test/battle/move_effect/heal_bell.c b/test/battle/move_effect/heal_bell.c index 743af905ce..c098886a98 100644 --- a/test/battle/move_effect/heal_bell.c +++ b/test/battle/move_effect/heal_bell.c @@ -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 { diff --git a/test/battle/move_effect/instruct.c b/test/battle/move_effect/instruct.c index 4521969920..59772ea944 100644 --- a/test/battle/move_effect/instruct.c +++ b/test/battle/move_effect/instruct.c @@ -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); diff --git a/test/battle/move_effect/multi_hit.c b/test/battle/move_effect/multi_hit.c index af3a9bc0f4..df9cfea807 100644 --- a/test/battle/move_effect/multi_hit.c +++ b/test/battle/move_effect/multi_hit.c @@ -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!"); + } +} diff --git a/test/battle/move_effect/reflect_type.c b/test/battle/move_effect/reflect_type.c index 32ed9520c8..0b610efe6e 100644 --- a/test/battle/move_effect/reflect_type.c +++ b/test/battle/move_effect/reflect_type.c @@ -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 { diff --git a/test/battle/move_effect/round.c b/test/battle/move_effect/round.c index c911c96b63..09209c79a2 100644 --- a/test/battle/move_effect/round.c +++ b/test/battle/move_effect/round.c @@ -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); diff --git a/test/battle/move_effect/tar_shot.c b/test/battle/move_effect/tar_shot.c index 61aca1bec1..2b780577ec 100644 --- a/test/battle/move_effect/tar_shot.c +++ b/test/battle/move_effect/tar_shot.c @@ -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]); + } +} diff --git a/test/battle/move_effects_combined/triple_arrows.c b/test/battle/move_effects_combined/triple_arrows.c index 4286a9ba07..383fce6cbf 100644 --- a/test/battle/move_effects_combined/triple_arrows.c +++ b/test/battle/move_effects_combined/triple_arrows.c @@ -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 {