mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2024-12-26 19:54:21 +01:00
Adds Mortal Spin and Population Bomb (#3178)
This commit is contained in:
commit
fc66a8c476
@ -14883,7 +14883,6 @@ Move_CORROSIVE_GAS::
|
|||||||
clearmonbg ANIM_ATTACKER
|
clearmonbg ANIM_ATTACKER
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@Credits to Skeli
|
@Credits to Skeli
|
||||||
Move_COACHING::
|
Move_COACHING::
|
||||||
playsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER
|
playsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER
|
||||||
|
@ -436,6 +436,17 @@ gBattleScriptsForMoveEffects::
|
|||||||
.4byte BattleScript_EffectSpinOut @ EFFECT_SPIN_OUT
|
.4byte BattleScript_EffectSpinOut @ EFFECT_SPIN_OUT
|
||||||
.4byte BattleScript_EffectMakeItRain @ EFFECT_MAKE_IT_RAIN
|
.4byte BattleScript_EffectMakeItRain @ EFFECT_MAKE_IT_RAIN
|
||||||
.4byte BattleScript_EffectCorrosiveGas @ EFFECT_CORROSIVE_GAS
|
.4byte BattleScript_EffectCorrosiveGas @ EFFECT_CORROSIVE_GAS
|
||||||
|
.4byte BattleScript_EffectHit @ EFFECT_POPULATION_BOMB
|
||||||
|
.4byte BattleScript_EffectMortalSpin @ EFFECT_MORTAL_SPIN
|
||||||
|
|
||||||
|
BattleScript_EffectMortalSpin:
|
||||||
|
call BattleScript_EffectHit_Ret
|
||||||
|
rapidspinfree
|
||||||
|
setmoveeffect MOVE_EFFECT_POISON
|
||||||
|
seteffectwithchance
|
||||||
|
tryfaintmon BS_TARGET
|
||||||
|
moveendall
|
||||||
|
end
|
||||||
|
|
||||||
BattleScript_EffectCorrosiveGas:
|
BattleScript_EffectCorrosiveGas:
|
||||||
attackcanceler
|
attackcanceler
|
||||||
|
@ -413,7 +413,9 @@
|
|||||||
#define EFFECT_SPIN_OUT 407
|
#define EFFECT_SPIN_OUT 407
|
||||||
#define EFFECT_MAKE_IT_RAIN 408
|
#define EFFECT_MAKE_IT_RAIN 408
|
||||||
#define EFFECT_CORROSIVE_GAS 409
|
#define EFFECT_CORROSIVE_GAS 409
|
||||||
|
#define EFFECT_POPULATION_BOMB 410
|
||||||
|
#define EFFECT_MORTAL_SPIN 411
|
||||||
|
|
||||||
#define NUM_BATTLE_MOVE_EFFECTS 410
|
#define NUM_BATTLE_MOVE_EFFECTS 412
|
||||||
|
|
||||||
#endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H
|
#endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H
|
||||||
|
@ -3571,6 +3571,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score)
|
|||||||
case EFFECT_TOXIC:
|
case EFFECT_TOXIC:
|
||||||
case EFFECT_POISON:
|
case EFFECT_POISON:
|
||||||
case EFFECT_BARB_BARRAGE:
|
case EFFECT_BARB_BARRAGE:
|
||||||
|
case EFFECT_MORTAL_SPIN:
|
||||||
IncreasePoisonScore(battlerAtk, battlerDef, move, &score);
|
IncreasePoisonScore(battlerAtk, battlerDef, move, &score);
|
||||||
break;
|
break;
|
||||||
case EFFECT_LIGHT_SCREEN:
|
case EFFECT_LIGHT_SCREEN:
|
||||||
@ -4246,6 +4247,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case MOVE_RAPID_SPIN:
|
case MOVE_RAPID_SPIN:
|
||||||
|
case MOVE_MORTAL_SPIN:
|
||||||
if (gStatuses3[battlerAtk] & STATUS3_LEECHSEED || gBattleMons[battlerAtk].status2 & STATUS2_WRAPPED)
|
if (gStatuses3[battlerAtk] & STATUS3_LEECHSEED || gBattleMons[battlerAtk].status2 & STATUS2_WRAPPED)
|
||||||
score += 3;
|
score += 3;
|
||||||
break;
|
break;
|
||||||
|
@ -865,7 +865,7 @@ s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 *typeEffectiveness,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Handle other multi-strike moves
|
// Handle other multi-strike moves
|
||||||
if (gBattleMoves[move].strikeCount > 1)
|
if (gBattleMoves[move].strikeCount > 1 && gBattleMoves[move].effect != EFFECT_TRIPLE_KICK)
|
||||||
dmg *= gBattleMoves[move].strikeCount;
|
dmg *= gBattleMoves[move].strikeCount;
|
||||||
else if (move == MOVE_WATER_SHURIKEN && gBattleMons[battlerAtk].species == SPECIES_GRENINJA_ASH)
|
else if (move == MOVE_WATER_SHURIKEN && gBattleMons[battlerAtk].species == SPECIES_GRENINJA_ASH)
|
||||||
dmg *= 3;
|
dmg *= 3;
|
||||||
|
@ -1747,6 +1747,8 @@ static void Cmd_accuracycheck(void)
|
|||||||
|
|
||||||
u16 type, move = cmd->move;
|
u16 type, move = cmd->move;
|
||||||
u16 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, move);
|
u16 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, move);
|
||||||
|
u16 gBattlerAttackerAbility = GetBattlerAbility(gBattlerAttacker);
|
||||||
|
u8 gBattlerAttackerHoldEffect = GetBattlerHoldEffect(gBattlerAttacker, TRUE);
|
||||||
|
|
||||||
if (move == ACC_CURR_MOVE)
|
if (move == ACC_CURR_MOVE)
|
||||||
move = gCurrentMove;
|
move = gCurrentMove;
|
||||||
@ -1761,10 +1763,11 @@ static void Cmd_accuracycheck(void)
|
|||||||
gBattlescriptCurrInstr = cmd->nextInstr;
|
gBattlescriptCurrInstr = cmd->nextInstr;
|
||||||
}
|
}
|
||||||
else if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_2ND_HIT
|
else if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_2ND_HIT
|
||||||
|| (gSpecialStatuses[gBattlerAttacker].multiHitOn && (gBattleMoves[move].effect != EFFECT_TRIPLE_KICK
|
|| (gSpecialStatuses[gBattlerAttacker].multiHitOn
|
||||||
|| GetBattlerAbility(gBattlerAttacker) == ABILITY_SKILL_LINK)))
|
&& (gBattlerAttackerAbility == ABILITY_SKILL_LINK || gBattlerAttackerHoldEffect == HOLD_EFFECT_LOADED_DICE
|
||||||
|
|| !(gBattleMoves[move].effect == EFFECT_TRIPLE_KICK || gBattleMoves[move].effect == EFFECT_POPULATION_BOMB))))
|
||||||
{
|
{
|
||||||
// No acc checks for second hit of Parental Bond or multi hit moves, except Triple Kick/Triple Axel
|
// No acc checks for second hit of Parental Bond or multi hit moves, except Triple Kick/Triple Axel/Population Bomb
|
||||||
gBattlescriptCurrInstr = cmd->nextInstr;
|
gBattlescriptCurrInstr = cmd->nextInstr;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1781,16 +1784,16 @@ static void Cmd_accuracycheck(void)
|
|||||||
gBattlerAttacker,
|
gBattlerAttacker,
|
||||||
gBattlerTarget,
|
gBattlerTarget,
|
||||||
move,
|
move,
|
||||||
GetBattlerAbility(gBattlerAttacker),
|
gBattlerAttackerAbility,
|
||||||
GetBattlerAbility(gBattlerTarget),
|
GetBattlerAbility(gBattlerTarget),
|
||||||
GetBattlerHoldEffect(gBattlerAttacker, TRUE),
|
gBattlerAttackerHoldEffect,
|
||||||
GetBattlerHoldEffect(gBattlerTarget, TRUE)
|
GetBattlerHoldEffect(gBattlerTarget, TRUE)
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!RandomPercentage(RNG_ACCURACY, accuracy))
|
if (!RandomPercentage(RNG_ACCURACY, accuracy))
|
||||||
{
|
{
|
||||||
gMoveResultFlags |= MOVE_RESULT_MISSED;
|
gMoveResultFlags |= MOVE_RESULT_MISSED;
|
||||||
if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_BLUNDER_POLICY)
|
if (gBattlerAttackerHoldEffect == HOLD_EFFECT_BLUNDER_POLICY)
|
||||||
gBattleStruct->blunderPolicy = TRUE; // Only activates from missing through acc/evasion checks
|
gBattleStruct->blunderPolicy = TRUE; // Only activates from missing through acc/evasion checks
|
||||||
|
|
||||||
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE &&
|
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE &&
|
||||||
|
@ -3741,14 +3741,16 @@ u8 AtkCanceller_UnableToUseMove(u32 moveType)
|
|||||||
PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0)
|
PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0)
|
||||||
}
|
}
|
||||||
else if (gBattleMoves[gCurrentMove].strikeCount > 1)
|
else if (gBattleMoves[gCurrentMove].strikeCount > 1)
|
||||||
|
{
|
||||||
|
if (gBattleMoves[gCurrentMove].effect == EFFECT_POPULATION_BOMB && GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LOADED_DICE)
|
||||||
|
{
|
||||||
|
gMultiHitCounter = RandomUniform(RNG_LOADED_DICE, 4, 10);
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
gMultiHitCounter = gBattleMoves[gCurrentMove].strikeCount;
|
gMultiHitCounter = gBattleMoves[gCurrentMove].strikeCount;
|
||||||
PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 3, 0)
|
PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 3, 0)
|
||||||
}
|
}
|
||||||
else if (gBattleMoves[gCurrentMove].effect == EFFECT_TRIPLE_KICK)
|
|
||||||
{
|
|
||||||
gMultiHitCounter = 3;
|
|
||||||
PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0)
|
|
||||||
}
|
}
|
||||||
#if B_BEAT_UP >= GEN_5
|
#if B_BEAT_UP >= GEN_5
|
||||||
else if (gBattleMoves[gCurrentMove].effect == EFFECT_BEAT_UP)
|
else if (gBattleMoves[gCurrentMove].effect == EFFECT_BEAT_UP)
|
||||||
|
@ -2886,6 +2886,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
|||||||
.split = SPLIT_PHYSICAL,
|
.split = SPLIT_PHYSICAL,
|
||||||
.zMoveEffect = Z_EFFECT_NONE,
|
.zMoveEffect = Z_EFFECT_NONE,
|
||||||
.makesContact = TRUE,
|
.makesContact = TRUE,
|
||||||
|
.strikeCount = 3,
|
||||||
},
|
},
|
||||||
|
|
||||||
[MOVE_THIEF] =
|
[MOVE_THIEF] =
|
||||||
@ -12357,6 +12358,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
|||||||
.split = SPLIT_PHYSICAL,
|
.split = SPLIT_PHYSICAL,
|
||||||
.zMoveEffect = Z_EFFECT_NONE,
|
.zMoveEffect = Z_EFFECT_NONE,
|
||||||
.makesContact = TRUE,
|
.makesContact = TRUE,
|
||||||
|
.strikeCount = 3,
|
||||||
},
|
},
|
||||||
|
|
||||||
[MOVE_DUAL_WINGBEAT] =
|
[MOVE_DUAL_WINGBEAT] =
|
||||||
@ -13152,7 +13154,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
|||||||
|
|
||||||
[MOVE_POPULATION_BOMB] =
|
[MOVE_POPULATION_BOMB] =
|
||||||
{
|
{
|
||||||
.effect = EFFECT_PLACEHOLDER, // EFFECT_MULTI_HIT maybe?
|
.effect = EFFECT_POPULATION_BOMB,
|
||||||
.power = 20,
|
.power = 20,
|
||||||
.type = TYPE_NORMAL,
|
.type = TYPE_NORMAL,
|
||||||
.accuracy = 90,
|
.accuracy = 90,
|
||||||
@ -13165,6 +13167,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
|||||||
.makesContact = TRUE,
|
.makesContact = TRUE,
|
||||||
.slicingMove = TRUE,
|
.slicingMove = TRUE,
|
||||||
.metronomeBanned = TRUE,
|
.metronomeBanned = TRUE,
|
||||||
|
.strikeCount = 10,
|
||||||
},
|
},
|
||||||
|
|
||||||
[MOVE_ICE_SPINNER] =
|
[MOVE_ICE_SPINNER] =
|
||||||
@ -13246,12 +13249,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
|
|||||||
|
|
||||||
[MOVE_MORTAL_SPIN] =
|
[MOVE_MORTAL_SPIN] =
|
||||||
{
|
{
|
||||||
.effect = EFFECT_PLACEHOLDER, // EFFECT_MORTAL_SPIN
|
.effect = EFFECT_MORTAL_SPIN,
|
||||||
.power = 30,
|
.power = 30,
|
||||||
.type = TYPE_POISON,
|
.type = TYPE_POISON,
|
||||||
.accuracy = 100,
|
.accuracy = 100,
|
||||||
.pp = 15,
|
.pp = 15,
|
||||||
.secondaryEffectChance = 0,
|
.secondaryEffectChance = 100,
|
||||||
.target = MOVE_TARGET_BOTH,
|
.target = MOVE_TARGET_BOTH,
|
||||||
.priority = 0,
|
.priority = 0,
|
||||||
.split = SPLIT_PHYSICAL,
|
.split = SPLIT_PHYSICAL,
|
||||||
|
24
test/move_effect_mortal_spin.c
Normal file
24
test/move_effect_mortal_spin.c
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#include "global.h"
|
||||||
|
#include "test_battle.h"
|
||||||
|
|
||||||
|
ASSUMPTIONS
|
||||||
|
{
|
||||||
|
ASSUME(gBattleMoves[MOVE_MORTAL_SPIN].effect == EFFECT_MORTAL_SPIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
SINGLE_BATTLE_TEST("Mortal Spin blows away hazards and poisons foe")
|
||||||
|
{
|
||||||
|
GIVEN {
|
||||||
|
PLAYER(SPECIES_WOBBUFFET);
|
||||||
|
OPPONENT(SPECIES_WOBBUFFET);
|
||||||
|
} WHEN {
|
||||||
|
TURN { MOVE(opponent, MOVE_STEALTH_ROCK); MOVE(player, MOVE_MORTAL_SPIN); }
|
||||||
|
} SCENE {
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_STEALTH_ROCK, opponent);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_MORTAL_SPIN, player);
|
||||||
|
MESSAGE("Wobbuffet blew away Stealth Rock!");
|
||||||
|
MESSAGE("Foe Wobbuffet was poisoned!");
|
||||||
|
STATUS_ICON(opponent, poison: TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
135
test/move_effect_multi_hit.c
Normal file
135
test/move_effect_multi_hit.c
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
#include "global.h"
|
||||||
|
#include "test_battle.h"
|
||||||
|
|
||||||
|
ASSUMPTIONS
|
||||||
|
{
|
||||||
|
ASSUME(gBattleMoves[MOVE_BULLET_SEED].effect == EFFECT_MULTI_HIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
SINGLE_BATTLE_TEST("Multi hit Moves hit the maximum amount with Skill Link")
|
||||||
|
{
|
||||||
|
PASSES_RANDOMLY(100, 100, RNG_HITS);
|
||||||
|
|
||||||
|
GIVEN {
|
||||||
|
PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_SKILL_LINK); };
|
||||||
|
OPPONENT(SPECIES_WOBBUFFET);
|
||||||
|
} WHEN {
|
||||||
|
TURN { MOVE(player, MOVE_BULLET_SEED); }
|
||||||
|
} SCENE {
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
MESSAGE("Hit 5 time(s)!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SINGLE_BATTLE_TEST("Multi hit Moves hit twice 35 Percent of the time")
|
||||||
|
{
|
||||||
|
PASSES_RANDOMLY(35, 100, RNG_HITS);
|
||||||
|
|
||||||
|
GIVEN {
|
||||||
|
PLAYER(SPECIES_WOBBUFFET);
|
||||||
|
OPPONENT(SPECIES_WOBBUFFET);
|
||||||
|
} WHEN {
|
||||||
|
TURN { MOVE(player, MOVE_BULLET_SEED); }
|
||||||
|
} SCENE {
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
MESSAGE("Hit 2 time(s)!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SINGLE_BATTLE_TEST("Multi hit Moves hit thrice 35 Percent of the time")
|
||||||
|
{
|
||||||
|
PASSES_RANDOMLY(35, 100, RNG_HITS);
|
||||||
|
|
||||||
|
GIVEN {
|
||||||
|
PLAYER(SPECIES_WOBBUFFET);
|
||||||
|
OPPONENT(SPECIES_WOBBUFFET);
|
||||||
|
} WHEN {
|
||||||
|
TURN { MOVE(player, MOVE_BULLET_SEED); }
|
||||||
|
} SCENE {
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
MESSAGE("Hit 3 time(s)!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SINGLE_BATTLE_TEST("Multi hit Moves hit four times 35 Percent of the time")
|
||||||
|
{
|
||||||
|
PASSES_RANDOMLY(15, 100, RNG_HITS);
|
||||||
|
|
||||||
|
GIVEN {
|
||||||
|
PLAYER(SPECIES_WOBBUFFET);
|
||||||
|
OPPONENT(SPECIES_WOBBUFFET);
|
||||||
|
} WHEN {
|
||||||
|
TURN { MOVE(player, MOVE_BULLET_SEED); }
|
||||||
|
} SCENE {
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
MESSAGE("Hit 4 time(s)!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SINGLE_BATTLE_TEST("Multi hit Moves hit four times 35 Percent of the time")
|
||||||
|
{
|
||||||
|
PASSES_RANDOMLY(15, 100, RNG_HITS);
|
||||||
|
|
||||||
|
GIVEN {
|
||||||
|
PLAYER(SPECIES_WOBBUFFET);
|
||||||
|
OPPONENT(SPECIES_WOBBUFFET);
|
||||||
|
} WHEN {
|
||||||
|
TURN { MOVE(player, MOVE_BULLET_SEED); }
|
||||||
|
} SCENE {
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
MESSAGE("Hit 5 time(s)!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SINGLE_BATTLE_TEST("Multi hit Moves hit at least four times with Loaded Dice")
|
||||||
|
{
|
||||||
|
PASSES_RANDOMLY(50, 100, RNG_LOADED_DICE);
|
||||||
|
|
||||||
|
GIVEN {
|
||||||
|
ASSUME(gItems[ITEM_LOADED_DICE].holdEffect == HOLD_EFFECT_LOADED_DICE);
|
||||||
|
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LOADED_DICE); }
|
||||||
|
OPPONENT(SPECIES_WOBBUFFET);
|
||||||
|
} WHEN {
|
||||||
|
TURN { MOVE(player, MOVE_BULLET_SEED); }
|
||||||
|
} SCENE {
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
MESSAGE("Hit 4 time(s)!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SINGLE_BATTLE_TEST("Multi hit Moves hit five times 50 Percent of the time with Loaded Dice")
|
||||||
|
{
|
||||||
|
PASSES_RANDOMLY(50, 100, RNG_LOADED_DICE);
|
||||||
|
|
||||||
|
GIVEN {
|
||||||
|
ASSUME(gItems[ITEM_LOADED_DICE].holdEffect == HOLD_EFFECT_LOADED_DICE);
|
||||||
|
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LOADED_DICE); }
|
||||||
|
OPPONENT(SPECIES_WOBBUFFET);
|
||||||
|
} WHEN {
|
||||||
|
TURN { MOVE(player, MOVE_BULLET_SEED); }
|
||||||
|
} SCENE {
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_BULLET_SEED, player);
|
||||||
|
MESSAGE("Hit 5 time(s)!");
|
||||||
|
}
|
||||||
|
}
|
29
test/move_effect_population_bomb.c
Normal file
29
test/move_effect_population_bomb.c
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#include "global.h"
|
||||||
|
#include "test_battle.h"
|
||||||
|
|
||||||
|
SINGLE_BATTLE_TEST("Population Bomb can hit ten times")
|
||||||
|
{
|
||||||
|
GIVEN {
|
||||||
|
ASSUME(gBattleMoves[MOVE_POPULATION_BOMB].strikeCount == 10);
|
||||||
|
PLAYER(SPECIES_WOBBUFFET);
|
||||||
|
OPPONENT(SPECIES_WOBBUFFET);
|
||||||
|
} WHEN {
|
||||||
|
TURN { MOVE(player, MOVE_POPULATION_BOMB); }
|
||||||
|
} SCENE {
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_POPULATION_BOMB, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_POPULATION_BOMB, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_POPULATION_BOMB, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_POPULATION_BOMB, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_POPULATION_BOMB, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_POPULATION_BOMB, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_POPULATION_BOMB, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_POPULATION_BOMB, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_POPULATION_BOMB, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_POPULATION_BOMB, player);
|
||||||
|
MESSAGE("Hit 10 time(s)!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TO_DO_BATTLE_TEST("Accuracy for Population Bomb is checked independently for each hit")
|
||||||
|
TO_DO_BATTLE_TEST("Accuracy for Population Bomb is only checked for the first hit with Skill Link")
|
||||||
|
TO_DO_BATTLE_TEST("Accuracy for Population Bomb is only checked for the first hit with Loaded Dice")
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
ASSUMPTIONS
|
ASSUMPTIONS
|
||||||
{
|
{
|
||||||
ASSUME(gBattleMoves[MOVE_TRIPLE_KICK].effect & EFFECT_TRIPLE_KICK);
|
ASSUME(gBattleMoves[MOVE_TRIPLE_KICK].effect == EFFECT_TRIPLE_KICK);
|
||||||
}
|
}
|
||||||
|
|
||||||
SINGLE_BATTLE_TEST("Triple Kick damage is increased by its base damage for each hit")
|
SINGLE_BATTLE_TEST("Triple Kick damage is increased by its base damage for each hit")
|
||||||
@ -29,3 +29,7 @@ SINGLE_BATTLE_TEST("Triple Kick damage is increased by its base damage for each
|
|||||||
EXPECT_MUL_EQ(firstHit, Q_4_12(3.0), thirdHit);
|
EXPECT_MUL_EQ(firstHit, Q_4_12(3.0), thirdHit);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TO_DO_BATTLE_TEST("Accuracy for Triple Kick is checked independently for each hit")
|
||||||
|
TO_DO_BATTLE_TEST("Accuracy for Triple Kick is only checked for the first hit with Skill Link")
|
||||||
|
TO_DO_BATTLE_TEST("Accuracy for Triple Kick is only checked for the first hit with Loaded Dice")
|
||||||
|
@ -1,7 +1,22 @@
|
|||||||
#include "global.h"
|
#include "global.h"
|
||||||
#include "test_battle.h"
|
#include "test_battle.h"
|
||||||
|
|
||||||
SINGLE_BATTLE_TEST("Three-strike flag turns a move into a 3-hit move")
|
SINGLE_BATTLE_TEST("Two strike count turns a move into a 2-hit move")
|
||||||
|
{
|
||||||
|
GIVEN {
|
||||||
|
ASSUME(gBattleMoves[MOVE_DOUBLE_KICK].strikeCount == 2);
|
||||||
|
PLAYER(SPECIES_WOBBUFFET);
|
||||||
|
OPPONENT(SPECIES_WOBBUFFET);
|
||||||
|
} WHEN {
|
||||||
|
TURN { MOVE(player, MOVE_DOUBLE_KICK); }
|
||||||
|
} SCENE {
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_DOUBLE_KICK, player);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_DOUBLE_KICK, player);
|
||||||
|
MESSAGE("Hit 2 time(s)!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SINGLE_BATTLE_TEST("Three strike count turns a move into a 3-hit move")
|
||||||
{
|
{
|
||||||
s16 firstHit;
|
s16 firstHit;
|
||||||
s16 secondHit;
|
s16 secondHit;
|
Loading…
Reference in New Issue
Block a user