Triple Arrows redo

Sorry, Lunos
This commit is contained in:
Nephrite 2023-11-20 19:39:13 +09:00
parent 45d8491148
commit 1dadc79b8b
12 changed files with 61 additions and 64 deletions

View file

@ -425,7 +425,7 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectRevivalBlessing @ EFFECT_REVIVAL_BLESSING
.4byte BattleScript_EffectFrostbiteHit @ EFFECT_FROSTBITE_HIT
.4byte BattleScript_EffectSnow @ EFFECT_SNOWSCAPE
.4byte BattleScript_EffectTripleArrows @ EFFECT_TRIPLE_ARROWS
.4byte BattleScript_EffectHit @ EFFECT_UNUSED_399
.4byte BattleScript_EffectInfernalParade @ EFFECT_INFERNAL_PARADE
.4byte BattleScript_EffectTakeHeart @ EFFECT_TAKE_HEART
.4byte BattleScript_EffectAxeKick @ EFFECT_AXE_KICK
@ -565,10 +565,6 @@ BattleScript_EffectTakeHeart::
jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_CalmMindStatRaise
goto BattleScript_CantRaiseMultipleStats
BattleScript_EffectTripleArrows::
setmoveeffect MOVE_EFFECT_TRIPLE_ARROWS
goto BattleScript_EffectHit
BattleScript_EffectRevivalBlessing::
attackcanceler
attackstring

View file

@ -221,6 +221,7 @@ void CopyMonAbilityAndTypesToBattleMon(u32 battler, struct Pokemon *mon);
void RecalcBattlerStats(u32 battler, struct Pokemon *mon);
bool32 IsAlly(u32 battlerAtk, u32 battlerDef);
bool32 IsGen6ExpShareEnabled(void);
bool32 MoveHasMoveEffect(u16 move, u16 moveEffect);
// Ability checks
bool32 IsRolePlayBannedAbilityAtk(u16 ability);

View file

@ -385,10 +385,9 @@
#define MOVE_EFFECT_DIRE_CLAW 74
#define MOVE_EFFECT_STEALTH_ROCK 75
#define MOVE_EFFECT_SPIKES 76
#define MOVE_EFFECT_TRIPLE_ARROWS 77
#define MOVE_EFFECT_SYRUP_BOMB 78
#define MOVE_EFFECT_SYRUP_BOMB 77
#define NUM_MOVE_EFFECTS 79
#define NUM_MOVE_EFFECTS 78
#define MOVE_EFFECT_AFFECTS_USER 0x4000
#define MOVE_EFFECT_CERTAIN 0x8000

View file

@ -402,7 +402,7 @@
#define EFFECT_REVIVAL_BLESSING 396
#define EFFECT_FROSTBITE_HIT 397
#define EFFECT_SNOWSCAPE 398
#define EFFECT_TRIPLE_ARROWS 399
#define EFFECT_UNUSED_399 399
#define EFFECT_INFERNAL_PARADE 400
#define EFFECT_TAKE_HEART 401
#define EFFECT_AXE_KICK 402

View file

@ -96,8 +96,6 @@ enum RandomTag
RNG_STATIC,
RNG_STENCH,
RNG_TRI_ATTACK,
RNG_TRIPLE_ARROWS_DEFENSE_DOWN,
RNG_TRIPLE_ARROWS_FLINCH,
RNG_QUICK_DRAW,
};

View file

@ -4881,10 +4881,11 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
break;
} // move effect checks
// check move additional effects
// check move additional effects that are certain/100% likely to happen
for (i = 0; i < gBattleMoves[move].numAdditionalEffects; i++)
{
if (gBattleMoves[move].additionalEffects[i].self)
if (gBattleMoves[move].additionalEffects[i].self
|| gBattleMoves[move].additionalEffects[i].chance % 100)
continue;
switch (gBattleMoves[move].additionalEffects[i].moveEffect)

View file

@ -843,6 +843,22 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3
u32 abilityDef = AI_DATA->abilities[battlerDef];
u32 abilityAtk = AI_DATA->abilities[battlerAtk];
// check ADDITIONAL_EFFECTS
for (i = 0; i < gBattleMoves[move].numAdditionalEffects; i++)
{
// Obviously ignore moves that target self
if (gBattleMoves[move].additionalEffects[i].self)
continue;
switch (gBattleMoves[move].additionalEffects[i].moveEffect)
{
case MOVE_EFFECT_PARALYSIS:
if (AI_CanParalyze(battlerAtk, battlerDef, abilityDef, move, MOVE_NONE))
return TRUE;
break;
}
}
switch (gBattleMoves[move].effect)
{
case EFFECT_HIT:
@ -947,22 +963,6 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3
}
return FALSE;
// check ADDITIONAL_EFFECTS
for (i = 0; i < gBattleMoves[move].numAdditionalEffects; i++)
{
// Obviously ignore moves that target self
if (gBattleMoves[move].additionalEffects[i].self)
continue;
switch (gBattleMoves[move].additionalEffects[i].moveEffect)
{
case MOVE_EFFECT_PARALYSIS:
if (AI_CanParalyze(battlerAtk, battlerDef, abilityDef, move, MOVE_NONE))
return TRUE;
break;
}
}
}
static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s32 noOfHitsToKo)

View file

@ -3078,13 +3078,17 @@ void SetMoveEffect(bool32 primary, u32 certain)
}
break;
case MOVE_EFFECT_FLINCH:
if (battlerAbility == ABILITY_INNER_FOCUS
&& (primary == TRUE || certain == MOVE_EFFECT_CERTAIN))
if (battlerAbility == ABILITY_INNER_FOCUS)
{
gLastUsedAbility = ABILITY_INNER_FOCUS;
gBattlerAbility = gEffectBattler;
RecordAbilityBattle(gEffectBattler, ABILITY_INNER_FOCUS);
gBattlescriptCurrInstr = BattleScript_FlinchPrevention;
// Inner Focus ALWAYS prevents flinching but only activates
// on a move that's supposed to flinch, like Fake Out
if (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)
{
gLastUsedAbility = ABILITY_INNER_FOCUS;
gBattlerAbility = gEffectBattler;
RecordAbilityBattle(gEffectBattler, ABILITY_INNER_FOCUS);
gBattlescriptCurrInstr = BattleScript_FlinchPrevention;
}
}
else if (GetBattlerTurnOrderNum(gEffectBattler) > gCurrentTurnActionNumber
&& !IsDynamaxed(gEffectBattler))
@ -3595,26 +3599,6 @@ void SetMoveEffect(bool32 primary, u32 certain)
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_SpikesActivates;
}
break;
case MOVE_EFFECT_TRIPLE_ARROWS:
{
u8 randomLowerDefenseChance = RandomPercentage(RNG_TRIPLE_ARROWS_DEFENSE_DOWN, CalcSecondaryEffectChance(gBattlerAttacker, 50));
u8 randomFlinchChance = RandomPercentage(RNG_TRIPLE_ARROWS_FLINCH, CalcSecondaryEffectChance(gBattlerAttacker, 30));
if (randomFlinchChance && battlerAbility != ABILITY_INNER_FOCUS && GetBattlerTurnOrderNum(gEffectBattler) > gCurrentTurnActionNumber)
gBattleMons[gEffectBattler].status2 |= sStatusFlagsForMoveEffects[MOVE_EFFECT_FLINCH];
if (randomLowerDefenseChance)
{
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_DefDown;
}
else
{
gBattlescriptCurrInstr++;
}
}
break;
case MOVE_EFFECT_SYRUP_BOMB:
if (!(gStatuses4[gEffectBattler] & STATUS4_SYRUP_BOMB))
@ -3669,12 +3653,15 @@ static void Cmd_seteffectwithchance(void)
// In reverse array order so that effects are applied in correct order
for (i = gBattleMoves[gCurrentMove].numAdditionalEffects; i > 0; i--)
{
percentChance = gBattleMoves[gCurrentMove].additionalEffects[i - 1].chance;
percentChance = CalcSecondaryEffectChance(
gBattlerAttacker,
gBattleMoves[gCurrentMove].additionalEffects[i - 1].chance
);
// Each effect needs its own RNG_SECONDARY_EFFECT tag
if ((percentChance == 0) || RandomPercentage(RNG_SECONDARY_EFFECT + i - 1, percentChance))
{
gBattleScripting.moveEffect = gBattleMoves[gCurrentMove].additionalEffects[i - 1].moveEffect;
SetMoveEffect((percentChance == 0), 0);
SetMoveEffect((percentChance == 0), gBattleMoves[gCurrentMove].additionalEffects[i - 1].chance == 100);
}
}
}

View file

@ -5680,7 +5680,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
&& !IS_MOVE_STATUS(move)
&& gBattleMoves[gCurrentMove].effect != EFFECT_FLINCH_HIT
&& gBattleMoves[gCurrentMove].effect != EFFECT_FLINCH_STATUS
&& gBattleMoves[gCurrentMove].effect != EFFECT_TRIPLE_ARROWS)
&& !MoveHasMoveEffect(gCurrentMove, MOVE_EFFECT_FLINCH))
{
gBattleScripting.moveEffect = MOVE_EFFECT_FLINCH;
BattleScriptPushCursor();
@ -11136,6 +11136,17 @@ bool32 IsGen6ExpShareEnabled(void)
#endif
}
bool32 MoveHasMoveEffect(u16 move, u16 moveEffect)
{
u8 i;
for (i = 0; i < gBattleMoves[move].numAdditionalEffects; i++)
{
if (gBattleMoves[move].additionalEffects[i].moveEffect == moveEffect)
return TRUE;
}
return FALSE;
}
u8 GetBattlerType(u32 battler, u8 typeIndex)
{

View file

@ -13385,16 +13385,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.power = 50,
.pp = 15,
#endif
.effect = EFFECT_TRIPLE_ARROWS,
.effect = EFFECT_HIT,
.type = TYPE_FIGHTING,
.accuracy = 100,
.secondaryEffectChance = 100, // 50% Defense down, 30% Flinch. Can be modified in 'SetMoveEffect'
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_PHYSICAL,
.zMoveEffect = Z_EFFECT_NONE,
.highCritRatio = TRUE,
.sheerForceBoost = TRUE,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT(MOVE_EFFECT_DEF_MINUS_1, 50),
SECONDARY_EFFECT(MOVE_EFFECT_FLINCH, 30)
)
},
[MOVE_INFERNAL_PARADE] =

View file

@ -21,7 +21,7 @@ SINGLE_BATTLE_TEST("Accuracy controls the proportion of misses")
}
}
SINGLE_BATTLE_TEST("AdditionalEffect.effect controls the proportion of secondary effects")
SINGLE_BATTLE_TEST("AdditionalEffect.chance controls the proportion of secondary effects")
{
u32 move;
PARAMETRIZE { move = MOVE_THUNDER_SHOCK; }

View file

@ -3,7 +3,8 @@
ASSUMPTIONS
{
ASSUME(gBattleMoves[MOVE_TRIPLE_ARROWS].effect == EFFECT_TRIPLE_ARROWS);
ASSUME(gBattleMoves[MOVE_TRIPLE_ARROWS].additionalEffects[0].moveEffect == MOVE_EFFECT_DEF_MINUS_1);
ASSUME(gBattleMoves[MOVE_TRIPLE_ARROWS].additionalEffects[1].moveEffect == MOVE_EFFECT_FLINCH);
}
SINGLE_BATTLE_TEST("Triple Arrows may lower Defense by one stage")
@ -12,7 +13,7 @@ SINGLE_BATTLE_TEST("Triple Arrows may lower Defense by one stage")
u32 chance;
PARAMETRIZE { ability = ABILITY_HUSTLE; chance = 50; }
PARAMETRIZE { ability = ABILITY_SERENE_GRACE; chance = 100; }
PASSES_RANDOMLY(chance, 100, RNG_TRIPLE_ARROWS_DEFENSE_DOWN);
PASSES_RANDOMLY(chance, 100, RNG_SECONDARY_EFFECT);
GIVEN {
PLAYER(SPECIES_TOGEPI) { Ability(ability); }
OPPONENT(SPECIES_WOBBUFFET);
@ -31,7 +32,7 @@ SINGLE_BATTLE_TEST("Triple Arrows makes the foe flinch 30% of the time")
u32 chance;
PARAMETRIZE { ability = ABILITY_HUSTLE; chance = 30; }
PARAMETRIZE { ability = ABILITY_SERENE_GRACE; chance = 60; }
PASSES_RANDOMLY(chance, 100, RNG_TRIPLE_ARROWS_FLINCH);
PASSES_RANDOMLY(chance, 100, RNG_SECONDARY_EFFECT_2);
GIVEN {
PLAYER(SPECIES_TOGEPI) { Ability(ability); }
OPPONENT(SPECIES_WOBBUFFET);