Fix Forewarn edge cases and random selection (#9049)
This commit is contained in:
parent
dd21d8fae4
commit
4198a5cb85
@ -167,6 +167,7 @@ enum RandomTag
|
|||||||
RNG_QUICK_DRAW,
|
RNG_QUICK_DRAW,
|
||||||
RNG_QUICK_CLAW,
|
RNG_QUICK_CLAW,
|
||||||
RNG_TRACE,
|
RNG_TRACE,
|
||||||
|
RNG_FOREWARN,
|
||||||
RNG_FICKLE_BEAM,
|
RNG_FICKLE_BEAM,
|
||||||
RNG_AI_ABILITY,
|
RNG_AI_ABILITY,
|
||||||
RNG_AI_SWITCH_HASBADODDS,
|
RNG_AI_SWITCH_HASBADODDS,
|
||||||
|
|||||||
@ -3335,12 +3335,43 @@ static void ForewarnChooseMove(u32 battler)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (bestId = 0, i = 1; i < count; i++)
|
if (count == 0)
|
||||||
{
|
{
|
||||||
if (data[i].power > data[bestId].power)
|
Free(data);
|
||||||
bestId = i;
|
return;
|
||||||
else if (data[i].power == data[bestId].power && Random() & 1)
|
}
|
||||||
|
|
||||||
|
u32 tieCount = 1;
|
||||||
|
u8 bestPower = data[0].power;
|
||||||
|
|
||||||
|
bestId = 0;
|
||||||
|
for (i = 1; i < count; i++)
|
||||||
|
{
|
||||||
|
if (data[i].power > bestPower)
|
||||||
|
{
|
||||||
|
bestPower = data[i].power;
|
||||||
bestId = i;
|
bestId = i;
|
||||||
|
tieCount = 1;
|
||||||
|
}
|
||||||
|
else if (data[i].power == bestPower)
|
||||||
|
{
|
||||||
|
tieCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tieCount > 1)
|
||||||
|
{
|
||||||
|
u32 tieIndex = RandomUniform(RNG_FOREWARN, 0, tieCount - 1);
|
||||||
|
for (i = 0, bestId = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
if (data[i].power != bestPower)
|
||||||
|
continue;
|
||||||
|
if (tieIndex-- == 0)
|
||||||
|
{
|
||||||
|
bestId = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gEffectBattler = data[bestId].battler;
|
gEffectBattler = data[bestId].battler;
|
||||||
@ -4155,7 +4186,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab
|
|||||||
}
|
}
|
||||||
return effect; // Note: It returns effect as to not record the ability if Frisk does not activate.
|
return effect; // Note: It returns effect as to not record the ability if Frisk does not activate.
|
||||||
case ABILITY_FOREWARN:
|
case ABILITY_FOREWARN:
|
||||||
if (!gSpecialStatuses[battler].switchInAbilityDone)
|
if (!gSpecialStatuses[battler].switchInAbilityDone && !IsOpposingSideEmpty(battler))
|
||||||
{
|
{
|
||||||
ForewarnChooseMove(battler);
|
ForewarnChooseMove(battler);
|
||||||
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_FOREWARN;
|
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_FOREWARN;
|
||||||
|
|||||||
@ -1,4 +1,84 @@
|
|||||||
#include "global.h"
|
#include "global.h"
|
||||||
#include "test/battle.h"
|
#include "test/battle.h"
|
||||||
|
|
||||||
TO_DO_BATTLE_TEST("TODO: Write Forewarn (Ability) test titles")
|
DOUBLE_BATTLE_TEST("Forewarn warns about the highest power move among all opposing battlers")
|
||||||
|
{
|
||||||
|
GIVEN {
|
||||||
|
PLAYER(SPECIES_MUSHARNA) { Ability(ABILITY_FOREWARN); }
|
||||||
|
PLAYER(SPECIES_WYNAUT);
|
||||||
|
OPPONENT(SPECIES_ZUBAT) { Moves(MOVE_CRUNCH, MOVE_CELEBRATE); }
|
||||||
|
OPPONENT(SPECIES_EXCADRILL) { Moves(MOVE_FISSURE, MOVE_CELEBRATE); }
|
||||||
|
} WHEN {
|
||||||
|
TURN {}
|
||||||
|
} SCENE {
|
||||||
|
ABILITY_POPUP(playerLeft, ABILITY_FOREWARN);
|
||||||
|
MESSAGE("Forewarn alerted Musharna to the opposing Excadrill's Fissure!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SINGLE_BATTLE_TEST("Forewarn randomly chooses between same-power moves on one opponent")
|
||||||
|
{
|
||||||
|
PASSES_RANDOMLY(1, 3, RNG_FOREWARN);
|
||||||
|
GIVEN {
|
||||||
|
ASSUME(GetMovePower(MOVE_TACKLE) == GetMovePower(MOVE_POUND));
|
||||||
|
ASSUME(GetMovePower(MOVE_TACKLE) == GetMovePower(MOVE_SCRATCH));
|
||||||
|
PLAYER(SPECIES_MUSHARNA) { Ability(ABILITY_FOREWARN); }
|
||||||
|
OPPONENT(SPECIES_ZUBAT) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_SCRATCH, MOVE_CELEBRATE); }
|
||||||
|
} WHEN {
|
||||||
|
TURN {}
|
||||||
|
} SCENE {
|
||||||
|
ABILITY_POPUP(player, ABILITY_FOREWARN);
|
||||||
|
MESSAGE("Forewarn alerted Musharna to the opposing Zubat's Tackle!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DOUBLE_BATTLE_TEST("Forewarn randomly chooses between opponents with same-power moves")
|
||||||
|
{
|
||||||
|
PASSES_RANDOMLY(1, 4, RNG_FOREWARN);
|
||||||
|
GIVEN {
|
||||||
|
ASSUME(GetMovePower(MOVE_TACKLE) == GetMovePower(MOVE_POUND));
|
||||||
|
ASSUME(GetMovePower(MOVE_TACKLE) == GetMovePower(MOVE_SCRATCH));
|
||||||
|
ASSUME(GetMovePower(MOVE_TACKLE) == GetMovePower(MOVE_QUICK_ATTACK));
|
||||||
|
PLAYER(SPECIES_MUSHARNA) { Ability(ABILITY_FOREWARN); }
|
||||||
|
PLAYER(SPECIES_WYNAUT);
|
||||||
|
OPPONENT(SPECIES_ZUBAT) { Moves(MOVE_TACKLE, MOVE_POUND, MOVE_PECK, MOVE_CELEBRATE); }
|
||||||
|
OPPONENT(SPECIES_EXCADRILL) { Moves(MOVE_SCRATCH, MOVE_QUICK_ATTACK, MOVE_ABSORB, MOVE_CELEBRATE); }
|
||||||
|
} WHEN {
|
||||||
|
TURN {}
|
||||||
|
} SCENE {
|
||||||
|
ABILITY_POPUP(playerLeft, ABILITY_FOREWARN);
|
||||||
|
MESSAGE("Forewarn alerted Musharna to the opposing Zubat's Tackle!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DOUBLE_BATTLE_TEST("Forewarn does not trigger if a mon switches in while the opposing field is empty")
|
||||||
|
{
|
||||||
|
GIVEN {
|
||||||
|
ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE);
|
||||||
|
ASSUME(GetMoveEffect(MOVE_HEALING_WISH) == EFFECT_HEALING_WISH);
|
||||||
|
PLAYER(SPECIES_WYNAUT);
|
||||||
|
PLAYER(SPECIES_WOBBUFFET);
|
||||||
|
PLAYER(SPECIES_MUSHARNA) { Ability(ABILITY_FOREWARN); }
|
||||||
|
OPPONENT(SPECIES_WYNAUT) { HP(1); }
|
||||||
|
OPPONENT(SPECIES_WOBBUFFET);
|
||||||
|
OPPONENT(SPECIES_TREECKO);
|
||||||
|
OPPONENT(SPECIES_TORCHIC);
|
||||||
|
} WHEN {
|
||||||
|
TURN {
|
||||||
|
MOVE(opponentRight, MOVE_HEALING_WISH);
|
||||||
|
MOVE(playerLeft, MOVE_U_TURN, target: opponentLeft);
|
||||||
|
SEND_OUT(playerLeft, 2);
|
||||||
|
SEND_OUT(opponentLeft, 2);
|
||||||
|
SEND_OUT(opponentRight, 3);
|
||||||
|
}
|
||||||
|
} SCENE {
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_HEALING_WISH, opponentRight);
|
||||||
|
ANIMATION(ANIM_TYPE_MOVE, MOVE_U_TURN, playerLeft);
|
||||||
|
HP_BAR(opponentLeft);
|
||||||
|
NOT ABILITY_POPUP(playerLeft, ABILITY_FOREWARN);
|
||||||
|
MESSAGE("2 sent out Treecko!");
|
||||||
|
MESSAGE("2 sent out Torchic!");
|
||||||
|
NOT ABILITY_POPUP(playerLeft, ABILITY_FOREWARN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user