Skip to content

Commit

Permalink
Version 1.4.2 (#2847)
Browse files Browse the repository at this point in the history
Co-authored-by: DizzyEggg <[email protected]>
Co-authored-by: ghoulslash <[email protected]>
Co-authored-by: Alex <[email protected]>
Fix wrong Contrary message when affected by Intimidate (#2723)
Fixes certain moves preventing Z status moves. (#2791)
Fixes the check for speed on electrify (#2819)
Fixed score for Work up and Growth (#2813)
Fixed Wring Out's power (#2824)
Fixes #2823
  • Loading branch information
AsparagusEduardo authored Mar 27, 2023
1 parent 8bfd4d0 commit bdb5cfe
Show file tree
Hide file tree
Showing 8 changed files with 207 additions and 53 deletions.
47 changes: 25 additions & 22 deletions data/battle_scripts_1.s
Original file line number Diff line number Diff line change
Expand Up @@ -484,15 +484,13 @@ BattleScript_Teatimevul:
moveendcase MOVEEND_CLEAR_BITS
goto BattleScript_MoveEnd
BattleScript_Teatimesorb:
copybyte gBattlerAbility, gBattlerTarget
call BattleScript_AbilityPopUp
call BattleScript_AbilityPopUpTarget
moveendto MOVEEND_NEXT_TARGET
jumpifnexttargetvalid BattleScript_TeatimeLoop
moveendcase MOVEEND_CLEAR_BITS
goto BattleScript_MoveEnd
BattleScript_Teatimerod:
copybyte gBattlerAbility, gBattlerTarget
call BattleScript_AbilityPopUp
call BattleScript_AbilityPopUpTarget
playstatchangeanimation BS_TARGET, BIT_SPATK, STAT_CHANGE_BY_TWO
setstatchanger STAT_SPATK, 1, FALSE
statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TeatimeBuffer
Expand All @@ -504,8 +502,7 @@ BattleScript_Teatimerod:
moveendcase MOVEEND_CLEAR_BITS
goto BattleScript_MoveEnd
BattleScript_Teatimemotor:
copybyte gBattlerAbility, gBattlerTarget
call BattleScript_AbilityPopUp
call BattleScript_AbilityPopUpTarget
playstatchangeanimation BS_TARGET, BIT_SPEED, STAT_CHANGE_BY_TWO
setstatchanger STAT_SPEED, 1, FALSE
statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_TeatimeBuffer
Expand Down Expand Up @@ -3374,8 +3371,7 @@ BattleScript_EffectAbsorb::
setbyte cMULTISTRING_CHOOSER, B_MSG_ABSORB
goto BattleScript_AbsorbUpdateHp
BattleScript_AbsorbLiquidOoze::
copybyte gBattlerAbility, gBattlerTarget
call BattleScript_AbilityPopUp
call BattleScript_AbilityPopUpTarget
manipulatedamage DMG_CHANGE_SIGN
setbyte cMULTISTRING_CHOOSER, B_MSG_ABSORB_OOZE
BattleScript_AbsorbUpdateHp::
Expand Down Expand Up @@ -5479,9 +5475,8 @@ BattleScript_NotAffected::
goto BattleScript_MoveEnd

BattleScript_NotAffectedAbilityPopUp::
copybyte gBattlerAbility, gBattlerTarget
pause B_WAIT_TIME_SHORT
call BattleScript_AbilityPopUp
call BattleScript_AbilityPopUpTarget
orhalfword gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE
resultmessage
waitmessage B_WAIT_TIME_LONG
Expand Down Expand Up @@ -5970,8 +5965,7 @@ BattleScript_EffectSkillSwap:
attackanimation
waitanimation
.if B_ABILITY_POP_UP == TRUE
copybyte gBattlerAbility, gBattlerTarget
call BattleScript_AbilityPopUp
call BattleScript_AbilityPopUpTarget
pause 20
copybyte gBattlerAbility, gBattlerAttacker
call BattleScript_AbilityPopUp
Expand Down Expand Up @@ -7726,9 +7720,8 @@ BattleScript_EnduredMsg::
return

BattleScript_SturdiedMsg::
copybyte gBattlerAbility, gBattlerTarget
pause B_WAIT_TIME_SHORTEST
call BattleScript_AbilityPopUp
call BattleScript_AbilityPopUpTarget
printstring STRINGID_ENDUREDSTURDY
waitmessage B_WAIT_TIME_LONG
return
Expand Down Expand Up @@ -7869,8 +7862,7 @@ BattleScript_CudChewActivates::

BattleScript_TargetFormChange::
pause 5
copybyte gBattlerAbility, gBattlerTarget
call BattleScript_AbilityPopUp
call BattleScript_AbilityPopUpTarget
printstring STRINGID_EMPTYSTRING3
waitmessage 1
handleformchange BS_TARGET, 0
Expand All @@ -7882,8 +7874,7 @@ BattleScript_TargetFormChange::

BattleScript_TargetFormChangeWithString::
pause 5
copybyte gBattlerAbility, gBattlerTarget
call BattleScript_AbilityPopUp
call BattleScript_AbilityPopUpTarget
printstring STRINGID_EMPTYSTRING3
waitmessage 1
handleformchange BS_TARGET, 0
Expand Down Expand Up @@ -8346,6 +8337,8 @@ BattleScript_AbilityRaisesDefenderStat::
waitmessage B_WAIT_TIME_LONG
return

BattleScript_AbilityPopUpTarget:
copybyte gBattlerAbility, gBattlerTarget
BattleScript_AbilityPopUp:
.if B_ABILITY_POP_UP == TRUE
showabilitypopup BS_ABILITY_BATTLER
Expand Down Expand Up @@ -8586,8 +8579,10 @@ BattleScript_IntimidateEffect:
copybyte sBATTLER, gBattlerAttacker
statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_IntimidateLoopIncrement
setgraphicalstatchangevalues
jumpifability BS_TARGET, ABILITY_CONTRARY, BattleScript_IntimidateContrary
playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1
printstring STRINGID_PKMNCUTSATTACKWITH
BattleScript_IntimidateEffect_WaitString:
waitmessage B_WAIT_TIME_LONG
copybyte sBATTLER, gBattlerTarget
call BattleScript_TryAdrenalineOrb
Expand All @@ -8599,6 +8594,16 @@ BattleScript_IntimidateEnd:
pause B_WAIT_TIME_MED
end3

BattleScript_IntimidateContrary:
call BattleScript_AbilityPopUpTarget
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_IntimidateContrary_WontIncrease
playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1
printfromtable gStatUpStringIds
goto BattleScript_IntimidateEffect_WaitString
BattleScript_IntimidateContrary_WontIncrease:
printstring STRINGID_TARGETSTATWONTGOHIGHER
goto BattleScript_IntimidateEffect_WaitString

BattleScript_IntimidatePrevented:
call BattleScript_AbilityPopUp
pause B_WAIT_TIME_LONG
Expand All @@ -8612,8 +8617,7 @@ BattleScript_IntimidatePrevented_Item:

BattleScript_IntimidateInReverse:
copybyte sBATTLER, gBattlerTarget
copybyte gBattlerAbility, gBattlerTarget
call BattleScript_AbilityPopUp
call BattleScript_AbilityPopUpTarget
pause B_WAIT_TIME_SHORT
modifybattlerstatstage BS_TARGET, STAT_ATK, INCREASE, 1, BattleScript_IntimidateLoopIncrement, ANIM_ON
call BattleScript_TryAdrenalineOrb
Expand Down Expand Up @@ -8856,8 +8860,7 @@ BattleScript_SturdyPreventsOHKO::

BattleScript_DampStopsExplosion::
pause B_WAIT_TIME_SHORT
copybyte gBattlerAbility, gBattlerTarget
call BattleScript_AbilityPopUp
call BattleScript_AbilityPopUpTarget
printstring STRINGID_PKMNPREVENTSUSAGE
pause B_WAIT_TIME_LONG
moveendto MOVEEND_NEXT_TARGET
Expand Down
2 changes: 1 addition & 1 deletion data/scripts/debug.inc
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ Debug_FlagsNotSetMessage::
Debug_FlagsNotSetMessage_Text:
.string "Feature unavailable!\n"
.string "Please define a usable flag in:\l"
.string "'include/constants/overworld{UNDERSCORE}config.h'!$"
.string "'include/config/overworld.h'!$"

Debug_Script_1::
end
Expand Down
11 changes: 5 additions & 6 deletions src/battle_ai_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1117,10 +1117,9 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score)
break;
case EFFECT_GROWTH:
case EFFECT_ATTACK_SPATK_UP: // work up
if (!BattlerStatCanRise(battlerAtk, AI_DATA->abilities[battlerAtk], STAT_ATK) || !HasMoveWithSplit(battlerAtk, SPLIT_PHYSICAL))
if ((!BattlerStatCanRise(battlerAtk, AI_DATA->abilities[battlerAtk], STAT_ATK) && !BattlerStatCanRise(battlerAtk, AI_DATA->abilities[battlerAtk], STAT_SPATK))
|| (!HasDamagingMove(battlerAtk)))
score -= 10;
else if (!BattlerStatCanRise(battlerAtk, AI_DATA->abilities[battlerAtk], STAT_SPATK) || !HasMoveWithSplit(battlerAtk, SPLIT_SPECIAL))
score -= 8;
break;
case EFFECT_ROTOTILLER:
if (isDoubleBattle)
Expand Down Expand Up @@ -2447,7 +2446,7 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score)
}
break;
case EFFECT_ELECTRIFY:
if (AI_WhoStrikesFirst(battlerAtk, battlerDef, move) == AI_IS_FASTER
if (AI_WhoStrikesFirst(battlerAtk, battlerDef, move) == AI_IS_SLOWER
//|| GetMoveTypeSpecial(battlerDef, predictedMove) == TYPE_ELECTRIC // Move will already be electric type
|| PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, AI_DATA->partnerMove))
score -= 10;
Expand Down Expand Up @@ -2632,7 +2631,7 @@ static s16 AI_TryToFaint(u8 battlerAtk, u8 battlerDef, u16 move, s16 score)
if (CanIndexMoveFaintTarget(battlerAtk, battlerDef, AI_THINKING_STRUCT->movesetIndex, 0) && gBattleMoves[move].effect != EFFECT_EXPLOSION)
{
// this move can faint the target
if (!WillAIStrikeFirst() || GetMovePriority(battlerAtk, move) > 0)
if (WillAIStrikeFirst() || GetMovePriority(battlerAtk, move) > 0)
score += 4; // we go first or we're using priority move
else
score += 2;
Expand Down Expand Up @@ -4641,7 +4640,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score)
score += 2; // Give target more weaknesses
break;
case EFFECT_ELECTRIFY:
if (predictedMove != MOVE_NONE && gBattleMoves[predictedMove].type == TYPE_NORMAL
if (predictedMove != MOVE_NONE
&& (AI_DATA->abilities[battlerAtk] == ABILITY_VOLT_ABSORB
|| AI_DATA->abilities[battlerAtk] == ABILITY_MOTOR_DRIVE
|| AI_DATA->abilities[battlerAtk] == ABILITY_LIGHTNING_ROD))
Expand Down
7 changes: 6 additions & 1 deletion src/battle_ai_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -744,6 +744,10 @@ s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 *typeEffectiveness,
SetBattlerData(battlerDef);

gBattleStruct->dynamicMoveType = 0;

if (move == MOVE_NATURE_POWER)
move = GetNaturePowerMove();

SetTypeBeforeUsingMove(move, battlerAtk);
GET_MOVE_TYPE(move, moveType);

Expand Down Expand Up @@ -802,6 +806,7 @@ s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 *typeEffectiveness,
}
else
{
effectivenessMultiplier = CalcTypeEffectivenessMultiplier(move, moveType, battlerAtk, battlerDef, FALSE);
dmg = 0;
}

Expand Down Expand Up @@ -1166,7 +1171,7 @@ s32 AI_GetAbility(u32 battlerId)
// We've had ability overwritten by e.g. Worry Seed. It is not part of AI_PARTY in case of switching
if (gBattleStruct->overwrittenAbilities[battlerId])
return gBattleStruct->overwrittenAbilities[battlerId];

// The AI knows its own ability.
if (IsBattlerAIControlled(battlerId))
return knownAbility;
Expand Down
2 changes: 1 addition & 1 deletion src/battle_bg.c
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ static const struct WindowTemplate sStandardBattleWindowTemplates[] =
.bg = 0,
.tilemapLeft = 2,
.tilemapTop = 55,
.width = 12, //for z move names
.width = 16, //for z move names
.height = 2,
.paletteNum = 5,
.baseBlock = 0x0300,
Expand Down
44 changes: 24 additions & 20 deletions src/battle_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -1742,7 +1742,7 @@ u8 TrySetCantSelectMoveBattleScript(void)
u32 holdEffect = GetBattlerHoldEffect(gActiveBattler, TRUE);
u16 *choicedMove = &gBattleStruct->choicedMove[gActiveBattler];

if (gDisableStructs[gActiveBattler].disabledMove == move && move != MOVE_NONE)
if (gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && gDisableStructs[gActiveBattler].disabledMove == move && move != MOVE_NONE)
{
gBattleScripting.battler = gActiveBattler;
gCurrentMove = move;
Expand All @@ -1758,7 +1758,7 @@ u8 TrySetCantSelectMoveBattleScript(void)
}
}

if (move == gLastMoves[gActiveBattler] && move != MOVE_STRUGGLE && (gBattleMons[gActiveBattler].status2 & STATUS2_TORMENT))
if (gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && move == gLastMoves[gActiveBattler] && move != MOVE_STRUGGLE && (gBattleMons[gActiveBattler].status2 & STATUS2_TORMENT))
{
CancelMultiTurnMoves(gActiveBattler);
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
Expand All @@ -1773,7 +1773,7 @@ u8 TrySetCantSelectMoveBattleScript(void)
}
}

if (!gBattleStruct->zmove.active && gDisableStructs[gActiveBattler].tauntTimer != 0 && IS_MOVE_STATUS(move))
if (gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && gDisableStructs[gActiveBattler].tauntTimer != 0 && IS_MOVE_STATUS(move))
{
gCurrentMove = move;
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
Expand All @@ -1788,7 +1788,7 @@ u8 TrySetCantSelectMoveBattleScript(void)
}
}

if (!gBattleStruct->zmove.active && gDisableStructs[gActiveBattler].throatChopTimer != 0 && gBattleMoves[move].flags & FLAG_SOUND)
if (gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && gDisableStructs[gActiveBattler].throatChopTimer != 0 && gBattleMoves[move].flags & FLAG_SOUND)
{
gCurrentMove = move;
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
Expand All @@ -1803,7 +1803,7 @@ u8 TrySetCantSelectMoveBattleScript(void)
}
}

if (!gBattleStruct->zmove.active && GetImprisonedMovesCount(gActiveBattler, move))
if (gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && GetImprisonedMovesCount(gActiveBattler, move))
{
gCurrentMove = move;
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
Expand All @@ -1818,7 +1818,7 @@ u8 TrySetCantSelectMoveBattleScript(void)
}
}

if (!gBattleStruct->zmove.active && IsGravityPreventingMove(move))
if (gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && IsGravityPreventingMove(move))
{
gCurrentMove = move;
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
Expand All @@ -1833,7 +1833,7 @@ u8 TrySetCantSelectMoveBattleScript(void)
}
}

if (!gBattleStruct->zmove.active && IsHealBlockPreventingMove(gActiveBattler, move))
if (gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && IsHealBlockPreventingMove(gActiveBattler, move))
{
gCurrentMove = move;
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
Expand All @@ -1848,7 +1848,7 @@ u8 TrySetCantSelectMoveBattleScript(void)
}
}

if (!gBattleStruct->zmove.active && IsBelchPreventingMove(gActiveBattler, move))
if (gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && IsBelchPreventingMove(gActiveBattler, move))
{
gCurrentMove = move;
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
Expand Down Expand Up @@ -3534,7 +3534,7 @@ u8 AtkCanceller_UnableToUseMove(void)
gBattleStruct->atkCancellerTracker++;
break;
case CANCELLER_DISABLED: // disabled move
if (gDisableStructs[gBattlerAttacker].disabledMove == gCurrentMove && gDisableStructs[gBattlerAttacker].disabledMove != MOVE_NONE)
if (gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && gDisableStructs[gBattlerAttacker].disabledMove == gCurrentMove && gDisableStructs[gBattlerAttacker].disabledMove != MOVE_NONE)
{
gProtectStructs[gBattlerAttacker].usedDisabledMove = TRUE;
gBattleScripting.battler = gBattlerAttacker;
Expand All @@ -3546,7 +3546,7 @@ u8 AtkCanceller_UnableToUseMove(void)
gBattleStruct->atkCancellerTracker++;
break;
case CANCELLER_HEAL_BLOCKED:
if (gStatuses3[gBattlerAttacker] & STATUS3_HEAL_BLOCK && IsHealBlockPreventingMove(gBattlerAttacker, gCurrentMove))
if (gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && gStatuses3[gBattlerAttacker] & STATUS3_HEAL_BLOCK && IsHealBlockPreventingMove(gBattlerAttacker, gCurrentMove))
{
gProtectStructs[gBattlerAttacker].usedHealBlockedMove = TRUE;
gBattleScripting.battler = gBattlerAttacker;
Expand All @@ -3570,7 +3570,7 @@ u8 AtkCanceller_UnableToUseMove(void)
gBattleStruct->atkCancellerTracker++;
break;
case CANCELLER_TAUNTED: // taunt
if (gDisableStructs[gBattlerAttacker].tauntTimer && IS_MOVE_STATUS(gCurrentMove))
if (gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && gDisableStructs[gBattlerAttacker].tauntTimer && IS_MOVE_STATUS(gCurrentMove))
{
gProtectStructs[gBattlerAttacker].usedTauntedMove = TRUE;
CancelMultiTurnMoves(gBattlerAttacker);
Expand All @@ -3581,7 +3581,7 @@ u8 AtkCanceller_UnableToUseMove(void)
gBattleStruct->atkCancellerTracker++;
break;
case CANCELLER_IMPRISONED: // imprisoned
if (GetImprisonedMovesCount(gBattlerAttacker, gCurrentMove))
if (gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && GetImprisonedMovesCount(gBattlerAttacker, gCurrentMove))
{
gProtectStructs[gBattlerAttacker].usedImprisonedMove = TRUE;
CancelMultiTurnMoves(gBattlerAttacker);
Expand Down Expand Up @@ -3745,7 +3745,7 @@ u8 AtkCanceller_UnableToUseMove(void)
gBattleStruct->atkCancellerTracker++;
break;
case CANCELLER_THROAT_CHOP:
if (gDisableStructs[gBattlerAttacker].throatChopTimer && gBattleMoves[gCurrentMove].flags & FLAG_SOUND)
if (gBattleStruct->zmove.toBeUsed[gBattlerAttacker] == MOVE_NONE && gDisableStructs[gBattlerAttacker].throatChopTimer && gBattleMoves[gCurrentMove].flags & FLAG_SOUND)
{
gProtectStructs[gBattlerAttacker].usedThroatChopPreventedMove = TRUE;
CancelMultiTurnMoves(gBattlerAttacker);
Expand Down Expand Up @@ -9837,7 +9837,17 @@ static u16 CalcTypeEffectivenessMultiplierInternal(u16 move, u8 moveType, u8 bat
&& gBattleMons[battlerDef].type3 != gBattleMons[battlerDef].type1)
MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, gBattleMons[battlerDef].type3, battlerAtk, recordAbilities);

if (moveType == TYPE_GROUND && !IsBattlerGrounded2(battlerDef, TRUE) && !(gBattleMoves[move].flags & FLAG_DMG_UNGROUNDED_IGNORE_TYPE_IF_FLYING))
if (gBattleMoves[move].split == SPLIT_STATUS && move != MOVE_THUNDER_WAVE)
{
modifier = UQ_4_12(1.0);
#if B_GLARE_GHOST <= GEN_3
if (move == MOVE_GLARE && IS_BATTLER_OF_TYPE(battlerDef, TYPE_GHOST))
{
modifier = UQ_4_12(0.0);
}
#endif
}
else if (moveType == TYPE_GROUND && !IsBattlerGrounded2(battlerDef, TRUE) && !(gBattleMoves[move].flags & FLAG_DMG_UNGROUNDED_IGNORE_TYPE_IF_FLYING))
{
modifier = UQ_4_12(0.0);
if (recordAbilities && defAbility == ABILITY_LEVITATE)
Expand All @@ -9855,12 +9865,6 @@ static u16 CalcTypeEffectivenessMultiplierInternal(u16 move, u8 moveType, u8 bat
modifier = UQ_4_12(0.0);
}
#endif
#if B_GLARE_GHOST >= GEN_4
else if (move == MOVE_GLARE && IS_BATTLER_OF_TYPE(battlerDef, TYPE_GHOST))
{
modifier = UQ_4_12(1.0);
}
#endif

// Thousand Arrows ignores type modifiers for flying mons
if (!IsBattlerGrounded(battlerDef) && (gBattleMoves[move].flags & FLAG_DMG_UNGROUNDED_IGNORE_TYPE_IF_FLYING)
Expand Down
4 changes: 2 additions & 2 deletions src/data/battle_moves.h
Original file line number Diff line number Diff line change
Expand Up @@ -4847,7 +4847,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
[MOVE_NATURE_POWER] =
{
.effect = EFFECT_NATURE_POWER,
.power = 0,
.power = 1,
.type = TYPE_NORMAL,
.accuracy = 0,
.pp = 20,
Expand Down Expand Up @@ -6843,7 +6843,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] =
[MOVE_WRING_OUT] =
{
.effect = EFFECT_WRING_OUT,
.power = 0,
.power = 1,
.type = TYPE_NORMAL,
.accuracy = 100,
.pp = 5,
Expand Down
Loading

0 comments on commit bdb5cfe

Please sign in to comment.