diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 9cc0b5c149..3a43503719 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -2661,10 +2661,11 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_SOAK: { u32 types[3]; + u32 typeArg = GetMoveArgType(move); + GetBattlerTypes(battlerDef, FALSE, types); - // TODO: Use the type of the move like 'VARIOUS_TRY_SOAK'? if (PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove) - || (types[0] == TYPE_WATER && types[1] == TYPE_WATER && types[2] == TYPE_MYSTERY)) + || (types[0] == typeArg && types[1] == typeArg && types[2] == TYPE_MYSTERY)) ADJUST_SCORE(-10); // target is already water-only break; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1d7f2579e8..6002e795b4 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10592,16 +10592,16 @@ static void Cmd_various(void) VARIOUS_ARGS(const u8 *failInstr); u32 types[3]; GetBattlerTypes(gBattlerTarget, FALSE, types); - u32 moveType = GetMoveType(gCurrentMove); - if ((types[0] == moveType && types[1] == moveType) + u32 typeToSet = GetMoveArgType(gCurrentMove); + if ((types[0] == typeToSet && types[1] == typeToSet) || GetActiveGimmick(gBattlerTarget) == GIMMICK_TERA) { gBattlescriptCurrInstr = cmd->failInstr; } else { - SET_BATTLER_TYPE(gBattlerTarget, moveType); - PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); + SET_BATTLER_TYPE(gBattlerTarget, typeToSet); + PREPARE_TYPE_BUFFER(gBattleTextBuff1, typeToSet); gBattlescriptCurrInstr = cmd->nextInstr; } return; diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 532d4eb6bb..59bcab6fac 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -12571,6 +12571,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, + .argument = { .type = TYPE_WATER }, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, .magicCoatAffected = TRUE, .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, diff --git a/test/battle/move_effect/soak.c b/test/battle/move_effect/soak.c index 156e1f9558..307b4802db 100644 --- a/test/battle/move_effect/soak.c +++ b/test/battle/move_effect/soak.c @@ -1,4 +1,45 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Soak (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_SOAK) == EFFECT_SOAK); + ASSUME(GetMoveEffect(MOVE_MAGIC_POWDER) == EFFECT_SOAK); +} + +TO_DO_BATTLE_TEST("Soak/Magic Powder changes the target's type to pure Water/Psychic"); + +SINGLE_BATTLE_TEST("Soak/Magic Powder's type change is overwitten if the target changes form") +{ + u32 move; + PARAMETRIZE { move = MOVE_SOAK; } + PARAMETRIZE { move = MOVE_MAGIC_POWDER; } + GIVEN { + ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL); + PLAYER(SPECIES_MIMIKYU_DISGUISED) { Ability(ABILITY_DISGUISE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, move); } + TURN { MOVE(opponent, MOVE_SCRATCH); } + TURN { MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + // Turn 1 + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + switch (move) { + case MOVE_SOAK: MESSAGE("Mimikyu transformed into the Water type!"); break; + case MOVE_MAGIC_POWDER: MESSAGE("Mimikyu transformed into the Psychic type!"); break; + } + // Turn 2 + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); + NOT MESSAGE("It doesn't affect Mimikyu…"); + ABILITY_POPUP(player, ABILITY_DISGUISE); + // Turn 3 + MESSAGE("It doesn't affect Mimikyu…"); + } +} + +TO_DO_BATTLE_TEST("Soak/Magic Powder's type change overritten if the target transforms"); +TO_DO_BATTLE_TEST("(TERA) Soak/Magic Powder's type change overritten if the target Terastalizes"); +TO_DO_BATTLE_TEST("Soak/Magic Powder fails if the target is behind a Substitute"); +TO_DO_BATTLE_TEST("Soak/Magic Powder fails if the target is already Water/Psychic"); +TO_DO_BATTLE_TEST("Soak/Magic Powder fails if the target has Multitype or RKS System");