From a0bde704931d33b0619d5c906b511a1a11e10f74 Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 30 Nov 2020 10:55:46 -0500 Subject: [PATCH] z move effects --- data/battle_scripts_1.s | 104 ++++- data/maps/InsideOfTruck/scripts.inc | 5 +- include/battle.h | 7 +- include/battle_scripts.h | 8 +- include/battle_z_move.h | 1 + include/constants/battle_move_effects.h | 2 + include/constants/battle_string_ids.h | 18 +- src/battle_controller_player.c | 6 + src/battle_message.c | 31 +- src/battle_script_commands.c | 52 ++- src/battle_util.c | 24 +- src/battle_z_move.c | 159 ++++++- src/data/battle_moves.h | 18 +- src/data/items.h | 538 +++++++++++++++++++++++- src/data/pokemon/level_up_learnsets.h | 2 +- 15 files changed, 932 insertions(+), 43 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 14ef9e5c3d..7301e53ae8 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -365,6 +365,8 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectFairyLock .4byte BattleScript_EffectAllySwitch .4byte BattleScript_EffectSleepHit + .4byte BattleScript_EffectExtremeEvoboost + .4byte BattleScript_EffectTerrainHit BattleScript_EffectSleepHit: setmoveeffect MOVE_EFFECT_SLEEP @@ -7687,9 +7689,109 @@ BattleScript_PrintPlayerForfeitedLinkBattle:: waitmessage 0x40 end2 -BattleScript_ZMoveActivate:: +@ z moves / effects +BattleScript_ZMoveActivateDamaging:: printstring STRINGID_ZPOWERSURROUNDS playanimation BS_ATTACKER, B_ANIM_ZMOVE_ACTIVATE, NULL printstring STRINGID_ZMOVEUNLEASHED waitmessage 0x40 return + +BattleScript_ZMoveActivateStatus:: + printstring STRINGID_ZPOWERSURROUNDS + playanimation BS_ATTACKER, B_ANIM_ZMOVE_ACTIVATE, NULL + setzeffect + printstring STRINGID_ZMOVEUNLEASHED + waitmessage 0x40 + return + +BattleScript_ZEffectPrintString:: + printfromtable gZEffectStringIds + waitmessage 0x40 + return + +BattleScript_RecoverHPZMove:: + healthbarupdate BS_SCRIPTING + datahpupdate BS_SCRIPTING + printfromtable gZEffectStringIds + waitmessage 0x40 + return + +BattleScript_StatUpZMove:: + statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_StatUpZMoveEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x3, BattleScript_StatUpZMoveEnd + playanimation BS_SCRIPTING, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + printfromtable gZEffectStringIds + waitmessage 0x40 +BattleScript_StatUpZMoveEnd: + return + +BattleScript_EffectExtremeEvoboost:: + attackcanceler + attackstring + ppreduce + jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_ExtremeEvoboostAnim + jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_DEF, MAX_STAT_STAGE, BattleScript_ExtremeEvoboostAnim + jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPEED, MAX_STAT_STAGE, BattleScript_ExtremeEvoboostAnim + jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPATK, MAX_STAT_STAGE, BattleScript_ExtremeEvoboostAnim + jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_ExtremeEvoboostAnim + goto BattleScript_ButItFailed +BattleScript_ExtremeEvoboostAnim: + attackanimation + waitanimation +BattleScript_ExtremeEvoboostAtk:: + setbyte sSTAT_ANIM_PLAYED, FALSE + playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_SPEED | BIT_SPATK | BIT_SPDEF, 0x0 + setstatchanger STAT_ATK, 2, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_ExtremeEvoboostDef + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_ExtremeEvoboostDef:: + setstatchanger STAT_DEF, 2, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_ExtremeEvoboostSpeed + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_ExtremeEvoboostSpeed:: + setstatchanger STAT_SPEED, 2, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_ExtremeEvoboostSpAtk + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_ExtremeEvoboostSpAtk:: + setstatchanger STAT_SPATK, 2, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_ExtremeEvoboostSpDef + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_ExtremeEvoboostSpDef:: + setstatchanger STAT_SPDEF, 2, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_ExtremeEvoboostEnd + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_ExtremeEvoboostEnd:: + goto BattleScript_MoveEnd + +BattleScript_EffectTerrainHit: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + critcalc + damagecalc + adjustdamage + attackanimation + waitanimation + effectivenesssound + hitanimation BS_TARGET + waitstate + healthbarupdate BS_TARGET + datahpupdate BS_TARGET + critmessage + waitmessage 0x40 + resultmessage + waitmessage 0x40 + setterrain BattleScript_TryFaint +@@@ TODO - 'restore' bg @@@ + printfromtable gTerrainStringIds +BattleScript_TryFaint: + tryfaintmon BS_TARGET, FALSE, NULL + goto BattleScript_MoveEnd + diff --git a/data/maps/InsideOfTruck/scripts.inc b/data/maps/InsideOfTruck/scripts.inc index b70e9a7917..82a0141326 100644 --- a/data/maps/InsideOfTruck/scripts.inc +++ b/data/maps/InsideOfTruck/scripts.inc @@ -50,8 +50,9 @@ InsideOfTruck_EventScript_SetIntroFlagsFemale:: @ 823BF46 end InsideOfTruck_EventScript_MovingBox:: @ 823BF6C - givemon SPECIES_SNEASEL, 70, ITEM_DARKINIUM_Z - setwildbattle SPECIES_WALREIN, 53, 0 + givemon SPECIES_MEW, 55, ITEM_MEWNIUM_Z + givemon SPECIES_CHARIZARD, 50, ITEM_FIRIUM_Z + setwildbattle SPECIES_AGGRON, 40, 0 dowildbattle @msgbox InsideOfTruck_Text_BoxPrintedWithMonLogo, MSGBOX_SIGN end diff --git a/include/battle.h b/include/battle.h index 27a795f5bd..274577622c 100644 --- a/include/battle.h +++ b/include/battle.h @@ -433,11 +433,16 @@ struct ZMoveData u8 viewing:1; //if player is viewing the z move name instead of regular moves u8 split:2; u8 active:1; //is z move being used this turn - u8 zUnused:4; + u8 zStatusActive:1; + u8 healReplacement:1; //TODO: z-parting shot + u8 zUnused:2; /*0x02*/ u16 currZMove; //z move of cursor / selected z move /*0x04*/ u16 baseMove; //move turned into z move /*0x06*/ u8 triggerSpriteId; + u8 effect; u8 used[MAX_BATTLERS_COUNT]; //one per bank for multi-battles + u16 toBeUsed[MAX_BATTLERS_COUNT]; //TODO z moves per battler to be used + u8 splits[MAX_BATTLERS_COUNT]; }; /* size = 8 */ struct BattleStruct diff --git a/include/battle_scripts.h b/include/battle_scripts.h index db8452ad06..830fa9453a 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -349,6 +349,12 @@ extern const u8 BattleScript_EmergencyExitNoPopUp[]; extern const u8 BattleScript_EmergencyExitWild[]; extern const u8 BattleScript_EmergencyExitWildNoPopUp[]; extern const u8 BattleScript_CheekPouchActivates[]; -extern const u8 BattleScript_ZMoveActivate[]; +// zmoves +extern const u8 BattleScript_ZMoveActivateDamaging[]; +extern const u8 BattleScript_ZMoveActivateStatus[]; +extern const u8 BattleScript_ZEffectPrintString[]; +extern const u8 BattleScript_RecoverHPZMove[]; +extern const u8 BattleScript_StatUpZMove[]; +extern const u8 BattleScript_EffectExtremeEvoboost[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/battle_z_move.h b/include/battle_z_move.h index c87721f52b..a6c3921e56 100644 --- a/include/battle_z_move.h +++ b/include/battle_z_move.h @@ -19,5 +19,6 @@ bool32 IsZMoveTriggerSpriteActive(void); void DestroyZMoveTriggerSprite(void); bool32 MoveSelectionDisplayZMove(u16 zmove); const u8* GetZMoveName(u16 move); +void SetZEffect(void); #endif // GUARD_BATTLE_Z_MOVE_H \ No newline at end of file diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index b018429de4..f4ce80d607 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -351,5 +351,7 @@ #define EFFECT_FAIRY_LOCK 345 #define EFFECT_ALLY_SWITCH 346 #define EFFECT_SLEEP_HIT 347 // Relic Song +#define EFFECT_EXTREME_EVOBOOST 348 +#define EFFECT_DAMAGE_SET_TERRAIN 349 //genesis supernova #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 12b193f2d5..7286b86e7b 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -553,7 +553,23 @@ #define STRINGID_FERVENTWISHREACHED 549 #define STRINGID_ZPOWERSURROUNDS 550 #define STRINGID_ZMOVEUNLEASHED 551 +#define STRINGID_ZMOVERESETSSTATS 552 +#define STRINGID_ZMOVEALLSTATSUP 553 +#define STRINGID_ZMOVEZBOOSTCRIT 554 +#define STRINGID_ZMOVERESTOREHP 555 +#define STRINGID_ZMOVESTATUP 556 +#define STRINGID_ZMOVEHPTRAP 557 +#define STRINGID_TERRAINREMOVED 558 -#define BATTLESTRINGS_COUNT 552 +#define BATTLESTRINGS_COUNT 558 + +// z effects +#define MULTISTRING_Z_RESET_STATS 0 +#define MULTISTRING_Z_ALL_STATS_UP 1 +#define MULTISTRING_Z_BOOST_CRITS 2 +#define MULTISTRING_Z_FOLLOW_ME 3 +#define MULTISTRING_Z_RECOVER_HP 4 +#define MULTISTRING_Z_STAT_UP 5 +#define MULTISTRING_Z_HP_TRAP 6 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index b9b2337341..dd7511b20c 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -564,6 +564,12 @@ static void HandleInputChooseMove(void) if (gBattleStruct->zmove.viewing) { + u16 chosenMove = moveInfo->moves[gMoveSelectionCursor[gActiveBattler]]; + + //gBattleStruct->zmove.toBeUsed[gActiveBattler] = gBattleStruct->zmove.currZMove; + + gBattleStruct->zmove.baseMove = chosenMove; + gBattleStruct->zmove.split = GetBattleMoveSplit(chosenMove); gBattleStruct->zmove.active = TRUE; gBattleStruct->zmove.viewing = FALSE; if (gBattleMoves[moveInfo->moves[gMoveSelectionCursor[gActiveBattler]]].split != SPLIT_STATUS) diff --git a/src/battle_message.c b/src/battle_message.c index f15070959c..c634e16468 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -680,9 +680,24 @@ static const u8 sText_CloakedInAFreezingLight[] = _("{B_ATK_NAME_WITH_PREFIX} be static const u8 sText_StatWasNotLowered[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}\nwas not lowered!"); static const u8 sText_ZPowerSurrounds[] = _("{B_ATK_NAME_WITH_PREFIX} surrounds\nitself with its Z-Power!"); static const u8 sText_ZPowerUnleashed[] = _("{B_ATK_NAME_WITH_PREFIX} unleashes\nits full-force Z-Move!"); +static const u8 sText_ZMoveResetsStats[] = _(""); +static const u8 sText_ZMoveAllStatsUp[] = _(""); +static const u8 sText_ZMoveBoostCrit[] = _(""); +static const u8 sText_ZMoveRestoreHp[] = _(""); +static const u8 sText_ZMoveStatUp[] = _(""); +static const u8 sText_ZMoveHpSwitchInTrap[] = _(""); +static const u8 sText_TerrainReturnedToNormal[] = _("The terrain returned to\nnormal!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_ZPOWERSURROUNDS - 12] = sText_ZPowerSurrounds, + [STRINGID_ZMOVEUNLEASHED - 12] = sText_ZPowerUnleashed, + [STRINGID_ZMOVERESETSSTATS - 12] = sText_ZMoveResetsStats, + [STRINGID_ZMOVEALLSTATSUP - 12] = sText_ZMoveAllStatsUp, + [STRINGID_ZMOVEZBOOSTCRIT - 12] = sText_ZMoveBoostCrit, + [STRINGID_ZMOVERESTOREHP - 12] = sText_ZMoveRestoreHp, + [STRINGID_ZMOVESTATUP - 12] = sText_ZMoveStatUp, + [STRINGID_ZMOVEHPTRAP - 12] = sText_ZMoveHpSwitchInTrap, [STRINGID_STATWASNOTLOWERED - 12] = sText_StatWasNotLowered, [STRINGID_CLOAKEDINAFREEZINGLIGHT - 12] = sText_CloakedInAFreezingLight, [STRINGID_DESTINYKNOTACTIVATES - 12] = sText_DestinyKnotActivates, @@ -1221,13 +1236,23 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_GRASSYTERRAINHEALS - 12] = sText_GrassyTerrainHeals, [STRINGID_ELECTRICTERRAINPREVENTS - 12] = sText_ElectricTerrainPreventsSleep, [STRINGID_PSYCHICTERRAINPREVENTS - 12] = sText_PsychicTerrainPreventsPriority, - [STRINGID_ZPOWERSURROUNDS - 12] = sText_ZPowerSurrounds, - [STRINGID_ZMOVEUNLEASHED - 12] = sText_ZPowerUnleashed, + [STRINGID_TERRAINREMOVED - 12] = sText_TerrainReturnedToNormal, +}; + +const u16 gZEffectStringIds[] = +{ + [MULTISTRING_Z_RESET_STATS] = STRINGID_ZMOVERESETSSTATS, + [MULTISTRING_Z_ALL_STATS_UP]= STRINGID_ZMOVEALLSTATSUP, + [MULTISTRING_Z_BOOST_CRITS] = STRINGID_ZMOVEZBOOSTCRIT, + [MULTISTRING_Z_FOLLOW_ME] = STRINGID_PKMNCENTERATTENTION, + [MULTISTRING_Z_RECOVER_HP] = STRINGID_ZMOVERESTOREHP, + [MULTISTRING_Z_STAT_UP] = STRINGID_ZMOVESTATUP, + [MULTISTRING_Z_HP_TRAP] = STRINGID_ZMOVEHPTRAP, }; const u16 gTerrainStringIds[] = { - STRINGID_TERRAINBECOMESMISTY, STRINGID_TERRAINBECOMESGRASSY, STRINGID_TERRAINBECOMESELECTRIC, STRINGID_TERRAINBECOMESPSYCHIC + STRINGID_TERRAINBECOMESMISTY, STRINGID_TERRAINBECOMESGRASSY, STRINGID_TERRAINBECOMESELECTRIC, STRINGID_TERRAINBECOMESPSYCHIC, STRINGID_TERRAINREMOVED, }; const u16 gTerrainPreventsStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 86947e09f7..fc4ad5c906 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6,6 +6,7 @@ #include "battle_anim.h" #include "battle_ai_script_commands.h" #include "battle_scripts.h" +#include "battle_z_move.h" #include "constants/moves.h" #include "constants/abilities.h" #include "item.h" @@ -1469,6 +1470,12 @@ static bool32 AccuracyCalcHelper(u16 move) RecordAbilityBattle(gBattlerTarget, ABILITY_NO_GUARD); return TRUE; } + + if (gBattleStruct->zmove.active && !(gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE)) + { + JumpIfMoveFailed(7, move); + return TRUE; + } if ((gStatuses3[gBattlerTarget] & STATUS3_PHANTOM_FORCE) || (!(gBattleMoves[move].flags & FLAG_HIT_IN_AIR) && gStatuses3[gBattlerTarget] & STATUS3_ON_AIR) @@ -1628,13 +1635,6 @@ static void Cmd_ppreduce(void) if (gBattleControllerExecFlags) return; - if (gBattleStruct->zmove.active) - { - gHitMarker &= ~(HITMARKER_NO_PPDEDUCT); - gBattlescriptCurrInstr++; - return; - } - if (!gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure) { switch (gBattleMoves[gCurrentMove].target) @@ -6929,12 +6929,12 @@ static bool32 HasAttackerFaintedTarget(void) return FALSE; } -static void HandleTerrainMove(u32 moveEffect) +static void HandleTerrainMove(u16 move) { u32 statusFlag = 0; u8 *timer = NULL; - - switch (moveEffect) + + switch (gBattleMoves[move].effect) { case EFFECT_MISTY_TERRAIN: statusFlag = STATUS_FIELD_MISTY_TERRAIN, timer = &gFieldTimers.mistyTerrainTimer; @@ -6952,6 +6952,31 @@ static void HandleTerrainMove(u32 moveEffect) statusFlag = STATUS_FIELD_PSYCHIC_TERRAIN, timer = &gFieldTimers.psychicTerrainTimer; gBattleCommunication[MULTISTRING_CHOOSER] = 3; break; + case EFFECT_DAMAGE_SET_TERRAIN: + switch (gBattleMoves[move].argument) + { + case 0: //genesis supernova + statusFlag = STATUS_FIELD_PSYCHIC_TERRAIN, timer = &gFieldTimers.psychicTerrainTimer; + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + break; + case 1: //splintered stormshards + if (!(gFieldStatuses & (STATUS_FIELD_MISTY_TERRAIN | STATUS_FIELD_GRASSY_TERRAIN | STATUS_FIELD_ELECTRIC_TERRAIN | STATUS_FIELD_PSYCHIC_TERRAIN))) + { + //no terrain to remove -> jump to battle script pointer + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + } + else + { + // remove all terrain + gFieldStatuses &= ~(STATUS_FIELD_MISTY_TERRAIN | STATUS_FIELD_GRASSY_TERRAIN | STATUS_FIELD_ELECTRIC_TERRAIN | STATUS_FIELD_PSYCHIC_TERRAIN); + gBattleCommunication[MULTISTRING_CHOOSER] = 4; + gBattlescriptCurrInstr += 7; + } + return; + default: + break; + } + break; } if (gFieldStatuses & statusFlag || statusFlag == 0) @@ -7764,7 +7789,7 @@ static void Cmd_various(void) } break; case VARIOUS_SET_TERRAIN: - HandleTerrainMove(gBattleMoves[gCurrentMove].effect); + HandleTerrainMove(gCurrentMove); return; case VARIOUS_TRY_ME_FIRST: if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) @@ -8308,6 +8333,9 @@ static void Cmd_various(void) gBattlescriptCurrInstr += 7; } return; + case VARIOUS_SET_Z_EFFECT: + SetZEffect(); //handles battle script jumping internally + return; } gBattlescriptCurrInstr += 3; @@ -8817,7 +8845,7 @@ static void Cmd_setdrainedhp(void) gBattlescriptCurrInstr++; } -static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr) +u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr) { bool32 certain = FALSE; bool32 notProtectAffected = FALSE; diff --git a/src/battle_util.c b/src/battle_util.c index 8cb7c624b6..26f30d3c02 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3190,11 +3190,21 @@ u8 AtkCanceller_UnableToUseMove(void) if (gBattleStruct->zmove.active == TRUE) { RecordItemEffectBattle(gBattlerAttacker, HOLD_EFFECT_Z_CRYSTAL); - gBattleStruct->zmove.used[gBattlerAttacker] = TRUE; + gBattleStruct->zmove.used[gBattlerAttacker] = TRUE; //TODO - partner battles. gBattleScripting.battler = gBattlerAttacker; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ZMoveActivate; + + if (IS_MOVE_STATUS(gBattleStruct->zmove.baseMove)) + { + gBattleStruct->zmove.effect = gBattleMoves[gBattleStruct->zmove.baseMove].zMoveEffect; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ZMoveActivateStatus; + } + else + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ZMoveActivateDamaging; + } effect = 1; } gBattleStruct->atkCancellerTracker++; @@ -6390,6 +6400,9 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) u32 i; u16 basePower = gBattleMoves[move].power; u32 weight, hpFraction, speed; + + if (gBattleStruct->zmove.active) + return gBattleMoves[gBattleStruct->zmove.baseMove].zMovePower; switch (gBattleMoves[move].effect) { @@ -7794,7 +7807,10 @@ bool8 ShouldGetStatBadgeBoost(u16 badgeFlag, u8 battlerId) u8 GetBattleMoveSplit(u32 moveId) { - if (IS_MOVE_STATUS(moveId) || B_PHYSICAL_SPECIAL_SPLIT >= GEN_4) + //TODO - light that burns the sky, photon geyser + if (gBattleStruct->zmove.active && !IS_MOVE_STATUS(moveId)) + return gBattleStruct->zmove.split; + else if (IS_MOVE_STATUS(moveId) || B_PHYSICAL_SPECIAL_SPLIT >= GEN_4) return gBattleMoves[moveId].split; else if (gBattleMoves[moveId].type < TYPE_MYSTERY) return SPLIT_PHYSICAL; diff --git a/src/battle_z_move.c b/src/battle_z_move.c index fb8025d2f5..36cd326ea7 100644 --- a/src/battle_z_move.c +++ b/src/battle_z_move.c @@ -6,6 +6,7 @@ #include "battle_interface.h" #include "battle_message.h" #include "battle_z_move.h" +#include "battle_scripts.h" #include "graphics.h" #include "sprite.h" #include "window.h" @@ -35,6 +36,8 @@ #include "constants/items.h" #include "constants/species.h" #include "constants/hold_effects.h" +#include "constants/battle_string_ids.h" +#include "constants/battle_move_effects.h" // Function Declarations static void SpriteCB_ZMoveTrigger(struct Sprite *sprite); @@ -43,6 +46,7 @@ static u16 GetTypeBasedZMove(u16 move, u8 battler); static void ZMoveSelectionDisplayPpNumber(void); static void ZMoveSelectionDisplayPower(u16 move, u16 zMove); static void ShowZMoveTriggerSprite(void); +static bool32 AreMainStatsMaxed(u8 battlerId); // Const Data static const struct SignatureZMove sSignatureZMoves[] = @@ -84,6 +88,7 @@ static const struct SignatureZMove sSignatureZMoves[] = static const u8 sText_ResetStats[] = _("Reset Lowered Stats"); static const u8 sText_StatsPlus[] = _("+ All Stats"); +static const u8 sText_StatsPlus2[] = _("++ All Stats"); static const u8 sText_CritHitsPlus[] = _("+ Critical Hit Chance"); static const u8 sText_FollowMe[] = _("Follow Me"); static const u8 sText_RecoverHP[] = _("Recover HP"); @@ -387,19 +392,21 @@ bool32 MoveSelectionDisplayZMove(u16 zmove) BattlePutTextOnWindow(gDisplayedStringBattle, i + 3); } - if (zmove == MOVE_Z_SIGNATURE) + //if (zmove == MOVE_Z_SIGNATURE) + if (IS_MOVE_STATUS(move)) { u8 zEffect = gBattleMoves[move].zMoveEffect; - + + gDisplayedStringBattle[0] = EOS; + if (zEffect == Z_EFFECT_CURSE) { if (moveInfo->monType1 == TYPE_GHOST || moveInfo->monType2 == TYPE_GHOST || moveInfo->monType3 == TYPE_GHOST) zEffect = Z_EFFECT_RECOVER_HP; else zEffect = Z_EFFECT_ATK_UP_1; - } - - gDisplayedStringBattle[0] = EOS; + } + switch (zEffect) { case Z_EFFECT_RESET_STATS: @@ -469,6 +476,13 @@ bool32 MoveSelectionDisplayZMove(u16 zmove) gDisplayedStringBattle[1] = CHAR_HYPHEN; StringCopy(gDisplayedStringBattle + 2, gMoveNames[move]); } + else if (zmove == MOVE_EXTREME_EVOBOOST) + { + //damaging move -> status z move + StringCopy(gDisplayedStringBattle, sText_StatsPlus2); + BattlePutTextOnWindow(gDisplayedStringBattle, 5); //Slot of Move 3 + StringCopy(gDisplayedStringBattle, GetZMoveName(zmove)); + } else { ZMoveSelectionDisplayPower(move, zmove); @@ -524,3 +538,138 @@ const u8* GetZMoveName(u16 move) return gZMoveNames[0]; //failsafe } +#define Z_EFFECT_BS_LENGTH 3 +// This function kinda cheats by setting a return battle script to after the setzeffect various command +// and then jumping to a z effect script +void SetZEffect(void) +{ + u32 i; + + gBattleStruct->zmove.zStatusActive = TRUE; + if (gBattleStruct->zmove.effect == Z_EFFECT_CURSE) + { + if (IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST)) + gBattleStruct->zmove.effect = Z_EFFECT_RECOVER_HP; + else + gBattleStruct->zmove.effect = Z_EFFECT_ATK_UP_1; + } + + gBattleScripting.battler = gBattlerAttacker; + switch (gBattleStruct->zmove.effect) + { + case Z_EFFECT_RESET_STATS: + for (i = 0; i < NUM_BATTLE_STATS - 1; i++) + { + if (gBattleMons[gBattlerAttacker].statStages[i] < DEFAULT_STAT_STAGE) + gBattleMons[gBattlerAttacker].statStages[i] = DEFAULT_STAT_STAGE; + } + gBattleCommunication[MULTISTRING_CHOOSER] = MULTISTRING_Z_RESET_STATS; + BattleScriptPush(gBattlescriptCurrInstr + Z_EFFECT_BS_LENGTH); + gBattlescriptCurrInstr = BattleScript_ZEffectPrintString - Z_EFFECT_BS_LENGTH; + break; + case Z_EFFECT_ALL_STATS_UP_1: + if (!AreMainStatsMaxed(gBattlerAttacker)) + { + for (i = 0; i < STAT_ACC - 1; i++) //Doesn't increase Acc or Evsn + { + if (gBattleMons[gBattlerAttacker].statStages[i] < 12) + ++gBattleMons[gBattlerAttacker].statStages[i]; + } + gBattleCommunication[MULTISTRING_CHOOSER] = MULTISTRING_Z_ALL_STATS_UP; + BattleScriptPush(gBattlescriptCurrInstr + Z_EFFECT_BS_LENGTH); + gBattlescriptCurrInstr = BattleScript_ZEffectPrintString - Z_EFFECT_BS_LENGTH; + } + break; + case Z_EFFECT_BOOST_CRITS: + if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_FOCUS_ENERGY)) + { + gBattleMons[gBattlerAttacker].status2 |= STATUS2_FOCUS_ENERGY; + gBattleCommunication[MULTISTRING_CHOOSER] = MULTISTRING_Z_BOOST_CRITS; + BattleScriptPush(gBattlescriptCurrInstr + Z_EFFECT_BS_LENGTH); + gBattlescriptCurrInstr = BattleScript_ZEffectPrintString - Z_EFFECT_BS_LENGTH; + } + break; + case Z_EFFECT_FOLLOW_ME: + gSideTimers[GetBattlerSide(gBattlerAttacker)].followmeTimer = 1; + gSideTimers[GetBattlerSide(gBattlerAttacker)].followmeTarget = gBattlerAttacker; + gBattleCommunication[MULTISTRING_CHOOSER] = MULTISTRING_Z_FOLLOW_ME; + BattleScriptPush(gBattlescriptCurrInstr + Z_EFFECT_BS_LENGTH); + gBattlescriptCurrInstr = BattleScript_ZEffectPrintString - Z_EFFECT_BS_LENGTH; + break; + case Z_EFFECT_RECOVER_HP: + if (gBattleMons[gBattlerAttacker].hp != gBattleMons[gBattlerAttacker].maxHP) + { + gBattleMoveDamage = (-1) * gBattleMons[gBattlerAttacker].maxHP; + gBattleCommunication[MULTISTRING_CHOOSER] = MULTISTRING_Z_RECOVER_HP; + BattleScriptPush(gBattlescriptCurrInstr + Z_EFFECT_BS_LENGTH); + gBattlescriptCurrInstr = BattleScript_RecoverHPZMove - Z_EFFECT_BS_LENGTH; + } + break; + case Z_EFFECT_RESTORE_REPLACEMENT_HP: + gBattleStruct->zmove.healReplacement = TRUE; + BattleScriptPush(gBattlescriptCurrInstr + Z_EFFECT_BS_LENGTH); + gBattleCommunication[MULTISTRING_CHOOSER] = MULTISTRING_Z_HP_TRAP; + gBattlescriptCurrInstr = BattleScript_ZEffectPrintString - Z_EFFECT_BS_LENGTH; + break; + case Z_EFFECT_ATK_UP_1: + case Z_EFFECT_DEF_UP_1: + case Z_EFFECT_SPD_UP_1: + case Z_EFFECT_SPATK_UP_1: + case Z_EFFECT_SPDEF_UP_1: + case Z_EFFECT_ACC_UP_1: + case Z_EFFECT_EVSN_UP_1: + SET_STATCHANGER(gBattleStruct->zmove.effect - Z_EFFECT_ATK_UP_1 + 1, 1, FALSE); + gBattleScripting.animArg1 = 0xE + (gBattleStruct->zmove.effect - Z_EFFECT_ATK_UP_1 + 1); + gBattleScripting.animArg2 = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = MULTISTRING_Z_STAT_UP; + BattleScriptPush(gBattlescriptCurrInstr + Z_EFFECT_BS_LENGTH); + gBattlescriptCurrInstr = BattleScript_StatUpZMove - Z_EFFECT_BS_LENGTH; + break; + case Z_EFFECT_ATK_UP_2: + case Z_EFFECT_DEF_UP_2: + case Z_EFFECT_SPD_UP_2: + case Z_EFFECT_SPATK_UP_2: + case Z_EFFECT_SPDEF_UP_2: + case Z_EFFECT_ACC_UP_2: + case Z_EFFECT_EVSN_UP_2: + SET_STATCHANGER(gBattleStruct->zmove.effect - Z_EFFECT_ATK_UP_2 + 1, 2, FALSE); + gBattleScripting.animArg1 = 0xE + (gBattleStruct->zmove.effect - Z_EFFECT_ATK_UP_2 + 1); + gBattleScripting.animArg2 = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = MULTISTRING_Z_STAT_UP; + BattleScriptPush(gBattlescriptCurrInstr + Z_EFFECT_BS_LENGTH); + gBattlescriptCurrInstr = BattleScript_StatUpZMove - Z_EFFECT_BS_LENGTH; + break; + case Z_EFFECT_ATK_UP_3: + case Z_EFFECT_DEF_UP_3: + case Z_EFFECT_SPD_UP_3: + case Z_EFFECT_SPATK_UP_3: + case Z_EFFECT_SPDEF_UP_3: + case Z_EFFECT_ACC_UP_3: + case Z_EFFECT_EVSN_UP_3: + SET_STATCHANGER(gBattleStruct->zmove.effect - Z_EFFECT_ATK_UP_3 + 1, 3, FALSE); + gBattleScripting.animArg1 = 0xE + (gBattleStruct->zmove.effect - Z_EFFECT_ATK_UP_3 + 1); + gBattleScripting.animArg2 = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = MULTISTRING_Z_STAT_UP; + BattleScriptPush(gBattlescriptCurrInstr + Z_EFFECT_BS_LENGTH); + gBattlescriptCurrInstr = BattleScript_StatUpZMove - Z_EFFECT_BS_LENGTH; + break; + default: + gBattlescriptCurrInstr += 3; + break; + } + + gBattleStruct->zmove.zStatusActive = FALSE; +} + +#define STAT_STAGE(battler, stat) (gBattleMons[battler].statStages[stat - 1]) +static bool32 AreMainStatsMaxed(u8 battlerId) +{ + u32 i; + for (i = STAT_ATK; i <= STAT_SPDEF; i++) + { + if (STAT_STAGE(battlerId, i) < MAX_STAT_STAGE) + return FALSE; + } + return TRUE; +} + diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 3425ccdb44..0760c6160e 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -11132,7 +11132,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = }, [MOVE_10000000_VOLT_THUNDERBOLT] = { - .effect = EFFECT_HIT,//TODO: EFFECT_HIGH_CRITICAL, + .effect = EFFECT_HIT, .power = 195, .type = TYPE_ELECTRIC, .accuracy = 0, @@ -11140,14 +11140,14 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, + .flags = FLAG_HIGH_CRIT, .zMovePower = 0, .split = SPLIT_SPECIAL, .zMoveEffect = 0 }, [MOVE_STOKED_SPARKSURFER] = { - .effect = EFFECT_HIT, //EFFECT_PARALYZE_HIT, + .effect = EFFECT_PARALYZE_HIT, .power = 175, .type = TYPE_ELECTRIC, .accuracy = 0, @@ -11162,7 +11162,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = }, [MOVE_EXTREME_EVOBOOST] = { - .effect = EFFECT_HIT,//TODO: EFFECT_EXTREME_EVOBOOST, + .effect = EFFECT_EXTREME_EVOBOOST, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -11192,7 +11192,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = }, [MOVE_GENESIS_SUPERNOVA] = { - .effect = EFFECT_HIT,//TODO: EFFECT_DAMAGE_SET_TERRAIN, + .effect = EFFECT_DAMAGE_SET_TERRAIN, .power = 185, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -11203,6 +11203,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .flags = 0, .zMovePower = 0, .split = SPLIT_SPECIAL, + .argument = 0, //psychic terrain .zMoveEffect = 0 }, [MOVE_SINISTER_ARROW_RAID] = @@ -11252,7 +11253,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = }, [MOVE_SPLINTERED_STORMSHARDS] = { - .effect = EFFECT_HIT, //TODO removes terrain + .effect = EFFECT_DAMAGE_SET_TERRAIN, .power = 190, .type = TYPE_ROCK, .accuracy = 0, @@ -11263,6 +11264,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = .flags = 0, .zMovePower = 0, .split = SPLIT_PHYSICAL, + .argument = 1, //remove terrain .zMoveEffect = 0 }, [MOVE_LETS_SNUGGLE_FOREVER] = @@ -11282,7 +11284,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = }, [MOVE_CLANGOROUS_SOULBLAZE] = { - .effect = EFFECT_HIT,//TODO: EFFECT_ALL_STATS_UP_HIT, + .effect = EFFECT_ALL_STATS_UP_HIT, .power = 185, .type = TYPE_DRAGON, .accuracy = 0, @@ -11297,7 +11299,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = }, [MOVE_GUARDIAN_OF_ALOLA] = { - .effect = EFFECT_HIT,//TODO: EFFECT_SUPER_FANG, + .effect = EFFECT_SUPER_FANG, .power = 1, .type = TYPE_FAIRY, .accuracy = 0, diff --git a/src/data/items.h b/src/data/items.h index 61157f8069..c630d0427d 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -4885,18 +4885,548 @@ const struct Item gItems[] = .secondaryId = 0, }, - //TEST + [ITEM_NORMALIUM_Z] = + { + .name = _("Normalium Z"), + .itemId = ITEM_NORMALIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = TYPE_NORMAL + }, + [ITEM_FIGHTINIUM_Z] = + { + .name = _("Fightinium Z"), + .itemId = ITEM_FIGHTINIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = TYPE_FIGHTING + }, + [ITEM_FLYINIUM_Z] = + { + .name = _("Flyinium Z"), + .itemId = ITEM_FLYINIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = TYPE_FLYING + }, + [ITEM_POISONIUM_Z] = + { + .name = _("Poisinium Z"), + .itemId = ITEM_POISONIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = TYPE_POISON + }, + [ITEM_GROUNDIUM_Z] = + { + .name = _("Groundium Z"), + .itemId = ITEM_GROUNDIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = TYPE_GROUND + }, + [ITEM_ROCKIUM_Z] = + { + .name = _("Rockium Z"), + .itemId = ITEM_ROCKIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = TYPE_ROCK + }, + [ITEM_BUGINIUM_Z] = + { + .name = _("Buginium Z"), + .itemId = ITEM_BUGINIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = TYPE_BUG + }, + [ITEM_GHOSTIUM_Z] = + { + .name = _("Ghostium Z"), + .itemId = ITEM_GHOSTIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = TYPE_GHOST + }, + [ITEM_STEELIUM_Z] = + { + .name = _("Steelium Z"), + .itemId = ITEM_STEELIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = TYPE_STEEL + }, + [ITEM_FIRIUM_Z] = + { + .name = _("Firium Z"), + .itemId = ITEM_FIRIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = TYPE_FIRE + }, + [ITEM_WATERIUM_Z] = + { + .name = _("Waterium Z"), + .itemId = ITEM_WATERIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = TYPE_WATER + }, + [ITEM_GRASSIUM_Z] = + { + .name = _("Grassium Z"), + .itemId = ITEM_GRASSIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = TYPE_GRASS + }, + [ITEM_ELECTRIUM_Z] = + { + .name = _("Electrium Z"), + .itemId = ITEM_ELECTRIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = TYPE_ELECTRIC + }, + [ITEM_PSYCHIUM_Z] = + { + .name = _("Psychium Z"), + .itemId = ITEM_PSYCHIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = TYPE_PSYCHIC + }, + [ITEM_ICIUM_Z] = + { + .name = _("Icium Z"), + .itemId = ITEM_ICIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = TYPE_ICE + }, + [ITEM_DRAGONIUM_Z] = + { + .name = _("Dragonium Z"), + .itemId = ITEM_DRAGONIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = TYPE_DRAGON + }, [ITEM_DARKINIUM_Z] = { .name = _("Darkinium Z"), .itemId = ITEM_DARKINIUM_Z, .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, .description = sDummyDesc, - .importance = 1, - .pocket = POCKET_KEY_ITEMS, - .holdEffectParam = TYPE_DARK, + .importance = 0, + .pocket = POCKET_ITEMS, .type = 4, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = TYPE_DARK + }, + [ITEM_FAIRIUM_Z] = + { + .name = _("Fairium Z"), + .itemId = ITEM_FAIRIUM_Z, + .price = 0, .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = TYPE_FAIRY + }, + [ITEM_ALORAICHIUM_Z] = + { + .name = _("Aloraichium Z"), + .itemId = ITEM_ALORAICHIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 255 // signature z move + }, + [ITEM_DECIDIUM_Z] = + { + .name = _("Decidium Z"), + .itemId = ITEM_DECIDIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 255 // signature z move + }, + [ITEM_EEVIUM_Z] = + { + .name = _("Eevium Z"), + .itemId = ITEM_EEVIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 255 // signature z move + }, + [ITEM_INCINIUM_Z] = + { + .name = _("Incinium Z"), + .itemId = ITEM_INCINIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 255 // signature z move + }, + [ITEM_KOMMONIUM_Z] = + { + .name = _("Kommonium Z"), + .itemId = ITEM_KOMMONIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 255 // signature z move + }, + [ITEM_LUNALIUM_Z] = + { + .name = _("Lunalium Z"), + .itemId = ITEM_LUNALIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 255 // signature z move + }, + [ITEM_LYCANIUM_Z] = + { + .name = _("Lycanium Z"), + .itemId = ITEM_LYCANIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 255 // signature z move + }, + [ITEM_MARSHADIUM_Z] = + { + .name = _("Marshadium Z"), + .itemId = ITEM_MARSHADIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 255 // signature z move + }, + [ITEM_MEWNIUM_Z] = + { + .name = _("Mewnium Z"), + .itemId = ITEM_MEWNIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 255 // signature z move + }, + [ITEM_MIMIKIUM_Z] = + { + .name = _("Mimikium Z"), + .itemId = ITEM_MIMIKIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 255 // signature z move + }, + [ITEM_PIKANIUM_Z] = + { + .name = _("Pikanium Z"), + .itemId = ITEM_PIKANIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 255 // signature z move + }, + [ITEM_PIKASHUNIUM_Z] = + { + .name = _("Pikashunium Z"), + .itemId = ITEM_PIKASHUNIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 255 // signature z move + }, + [ITEM_PRIMARIUM_Z] = + { + .name = _("Primarium Z"), + .itemId = ITEM_PRIMARIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 255 // signature z move + }, + [ITEM_SNORLIUM_Z] = + { + .name = _("Snorlium Z"), + .itemId = ITEM_SNORLIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 255 // signature z move + }, + [ITEM_SOLGANIUM_Z] = + { + .name = _("Solganium Z"), + .itemId = ITEM_SOLGANIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 255 // signature z move + }, + [ITEM_TAPUNIUM_Z] = + { + .name = _("Tapunium Z"), + .itemId = ITEM_TAPUNIUM_Z, + .price = 0, + .holdEffect = HOLD_EFFECT_Z_CRYSTAL, + .holdEffectParam = 0, + .description = sDummyDesc, + .importance = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 255 //signature z move }, }; diff --git a/src/data/pokemon/level_up_learnsets.h b/src/data/pokemon/level_up_learnsets.h index 46c685572e..69742ac25f 100644 --- a/src/data/pokemon/level_up_learnsets.h +++ b/src/data/pokemon/level_up_learnsets.h @@ -440,7 +440,7 @@ static const struct LevelUpMove sPikachuLevelUpLearnset[] = { LEVEL_UP_MOVE( 5, MOVE_GROWL), LEVEL_UP_MOVE( 7, MOVE_PLAY_NICE), LEVEL_UP_MOVE(10, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(13, MOVE_ELECTRO_BALL), + LEVEL_UP_MOVE(13, MOVE_VOLT_TACKLE), LEVEL_UP_MOVE(18, MOVE_THUNDER_WAVE), LEVEL_UP_MOVE(21, MOVE_FEINT), LEVEL_UP_MOVE(23, MOVE_DOUBLE_TEAM),