From f114534ae3f55a20ccc11ba5e1896834914986b7 Mon Sep 17 00:00:00 2001 From: Evan Date: Sat, 28 Nov 2020 13:09:43 -0500 Subject: [PATCH] z move anim/effect, black hole eclipse anim --- data/battle_anim_scripts.s | 144 +++++++++ data/battle_scripts_1.s | 10 +- include/battle_anim.h | 3 + include/battle_message.h | 2 +- include/battle_scripts.h | 3 +- include/battle_z_move.h | 1 + include/constants/moves.h | 2 +- src/battle_anim_fire.c | 7 +- src/battle_anim_new.c | 217 ++++++++++++- src/battle_anim_status_effects.c | 4 +- src/battle_controller_player.c | 8 +- src/battle_gfx_sfx_util.c | 2 +- src/battle_message.c | 13 +- src/battle_script_commands.c | 9 +- src/battle_util.c | 24 +- src/battle_z_move.c | 3 +- src/data/battle_moves.h | 529 ++++++++++++++++++++++++++++++- 17 files changed, 928 insertions(+), 53 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 281e88ddac..8654f5beda 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -24503,7 +24503,151 @@ Move_GIGAVOLT_HAVOC:: Move_SHATTERED_PSYCHE:: Move_SUBZERO_SLAMMER:: Move_DEVASTATING_DRAKE:: + goto Move_TACKLE + Move_BLACK_HOLE_ECLIPSE:: + loadspritegfx ANIM_TAG_FOCUS_ENERGY @focus energy + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @shock wave + loadspritegfx ANIM_TAG_SHADOW_BALL @shadow ball + loadspritegfx ANIM_TAG_THIN_RING @ring + loadspritegfx ANIM_TAG_ICE_CHUNK @blue + loadspritegfx ANIM_TAG_BLACK_BALL_2 @black + invisible ANIM_TARGET + launchtask AnimTask_AllBanksInvisibleExceptAttackerAndTarget 0xA 0x0 + waitforvisualfinish + playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER + call EndureEffect + delay 0x8 + launchtask AnimTask_BlendColorCycle 0x2 0x6 0x2 0x2 0x2 0x0 0xb 0x0000 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x0 0x1 0x0 0x20 0x1 + call EndureEffect + delay 0x8 + call EndureEffect + waitforvisualfinish + unloadspritegfx ANIM_TAG_FOCUS_ENERGY + playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER + launchtemplate gBlackHoleEclipseShockwaveSpriteTemplate 0x2 0x0 + waitforvisualfinish + unloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT + loadspritegfx ANIM_TAG_HANDS_AND_FEET @black + playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER + launchtemplate gBlackHoleEclipseHoleUserSpriteTemplate 0x2 0x4 0x0 0x0 ANIM_ATTACKER 0x0 + launchtemplate gBlackHoleEclipseBlueRingSpriteTemplate 0x3 0x4 0x0 0x0 0x0 0x0 + delay 0x8 + launchtemplate gBlackHoleEclipseBlackRingSpriteTemplate 0x3 0x4 0x0 0x0 0x0 0x0 + delay 0x8 + launchtemplate gBlackHoleEclipseBlueRingSpriteTemplate 0x3 0x4 0x0 0x0 0x0 0x0 + delay 0x8 + launchtemplate gBlackHoleEclipseBlackRingSpriteTemplate 0x3 0x4 0x0 0x0 0x0 0x0 + delay 0x8 + waitforvisualfinish + stopsound + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x07 0x0000 + loadspritegfx ANIM_TAG_WISP_ORB @will o wisp + invisible ANIM_ATTACKER + loopsewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET, 0x10, 0x5 + launchtemplate gBlackHoleEclipseWispSpriteTemplate 0x2 0x3 0x0 0x10 0x0 + delay 0x3 + launchtemplate gBlackHoleEclipseWispSpriteTemplate 0x3 0x3 0x0 0x10 0x1 + delay 0x3 + launchtemplate gBlackHoleEclipseWispSpriteTemplate 0x4 0x3 0x0 0x10 0x2 + delay 0x3 + launchtemplate gBlackHoleEclipseWispSpriteTemplate 0x4 0x3 0x0 0x10 0x3 + waitforvisualfinish + fadetobg BG_BLACKHOLE_ECLIPSE + playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET + loadspritegfx ANIM_TAG_VERTICAL_HEX @red + launchtemplate gBlackHoleEclipseRedRingSpriteTemplate 0x3 0x4 0x0 0x0 0x100 0x0 + delay 0x4 + launchtemplate gBlackHoleEclipseRedRingSpriteTemplate 0x3 0x4 0x0 0x0 0x100 0x0 + delay 0x4 + launchtemplate gBlackHoleEclipseRedRingSpriteTemplate 0x3 0x4 0x0 0x0 0x100 0x0 + waitbgfadeout + unloadspritegfx ANIM_TAG_WISP_ORB + launchtemplate gBlackHoleEclipseHoleSpriteTemplate 0x2 0x4 0x0 0x0 ANIM_TARGET 0x0 @ eclipse at target origin + delay 0x10 + launchtemplate gSlideMonToOffsetSpriteTemplate 0x2 0x5 ANIM_TARGET 0x35 0xffed 0x1 0x2 @ target down and left (instantaneously (last arg)) + delay 0x2 + visible ANIM_TARGET + loopsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET, 0xa, 0x5 + launchtask AnimTask_RotateMonSpriteToSide 0x2 0x4 0x50 0xfc00 ANIM_TARGET 0x0 @ spin target around (0x50 (time), -0x400 (rot speed)) + launchtemplate gBlackHoleEclipseBlueRingInwardsSpriteTemplate 0x28 0x4 0x0 0x0 ANIM_TARGET 0x0 + delay 0x8 + launchtemplate gBlackHoleEclipseRedRingInwardsSpriteTemplate 0x28 0x4 0x0 0x0 ANIM_TARGET 0x0 + delay 0x8 + launchtemplate gBlackHoleEclipseRedRingInwardsSpriteTemplate 0x28 0x4 0x0 0x0 ANIM_TARGET 0x0 + delay 0x8 + launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_TARGET 0x0 0x30 @ target back to origin (slowly) + launchtemplate gBlackHoleEclipseBlueRingInwardsSpriteTemplate 0x28 0x4 0x0 0x0 ANIM_TARGET 0x0 + delay 0x8 + launchtemplate gBlackHoleEclipseRedRingInwardsSpriteTemplate 0x28 0x4 0x0 0x0 ANIM_TARGET 0x0 + delay 0x8 + launchtemplate gBlackHoleEclipseRedRingInwardsSpriteTemplate 0x28 0x4 0x0 0x0 ANIM_TARGET 0x0 + delay 0x15 + invisible ANIM_TARGET + delay 0x8 + launchtemplate gBlackHoleEclipseBlueRingInwardsSpriteTemplate 0x28 0x4 0x0 0x0 ANIM_TARGET 0x0 + delay 0x8 + launchtemplate gBlackHoleEclipseRedRingInwardsSpriteTemplate 0x28 0x4 0x0 0x0 ANIM_TARGET 0x0 + delay 0x8 + launchtemplate gBlackHoleEclipseRedRingInwardsSpriteTemplate 0x28 0x4 0x0 0x0 ANIM_TARGET 0x0 + delay 0x8 + launchtemplate gBlackHoleEclipseHoleShrinkSpriteTemplate 0x2 0x4 0x0 0x0 ANIM_TARGET 0x0 + waitforvisualfinish + loadspritegfx ANIM_TAG_SPARKLE_4 @detect + launchtemplate gTargetTwinkleSpriteTemplate 0xd 0x3 0x0 0x0 ANIM_TARGET @detect star + delay 0x2 + unloadspritegfx ANIM_TAG_SHADOW_BALL + unloadspritegfx ANIM_TAG_THIN_RING + unloadspritegfx ANIM_TAG_ICE_CHUNK + unloadspritegfx ANIM_TAG_BLACK_BALL_2 + loadspritegfx ANIM_TAG_EXPLOSION_2 + call BlackHoleEclipseExplosion + launchtask AnimTask_BlendBattleAnimPal, 0xa, 0x5, ANIM_PAL_ALL_BATTLERS | ANIM_PAL_BG, 0x1, 0x0, 0x10, 0x7fff @ bg to white pal + call BlackHoleEclipseExplosion + waitforvisualfinish + delay 0x18 + invisible ANIM_TARGET + launchtask AnimTask_RotateMonSpriteToSide 0x2 0x4 0x1 0x0 ANIM_TARGET 0x1 @ fix rotation + invisible ANIM_TARGET + delay 0x1 + waitforvisualfinish + call ResetFromWhiteScreen + end + +BlackHoleEclipseExplosion: + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + launchtemplate gBlackHoleEclipseRedExplosionSpriteTemplate 0x3 0x4 0x0 0x0 ANIM_TARGET 0x1 + delay 0x6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + launchtemplate gBlackHoleEclipseRedExplosionSpriteTemplate 0x3 0x4 0x18 0xffe8 ANIM_TARGET 0x1 + delay 0x6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + launchtemplate gBlackHoleEclipseRedExplosionSpriteTemplate 0x3 0x4 0xfff0 0x10 ANIM_TARGET 0x1 + delay 0x6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + launchtemplate gBlackHoleEclipseRedExplosionSpriteTemplate 0x3 0x4 0xffe8 0xfff4 ANIM_TARGET 0x1 + delay 0x6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + launchtemplate gBlackHoleEclipseRedExplosionSpriteTemplate 0x3 0x4 0x10 0x10 ANIM_TARGET 0x1 + delay 0x6 + return + +ResetFromWhiteScreen: + launchtask AnimTask_AllBanksInvisible 0xA 0x0 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ALL_BATTLERS 0x2 0x0 0x0 0x7FFF @everything from white + restorebg + waitbgfadeout + setarg 0x7 0xffff + launchtask AnimTask_AllBanksVisible 0xA 0x0 + waitbgfadein + waitforvisualfinish + delay 0x5 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x0 0x0 0x0 0x7fff + waitforvisualfinish + return + Move_TWINKLE_TACKLE:: Move_CATASTROPIKA:: Move_10000000_VOLT_THUNDERBOLT:: diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index b595ca5d1c..14ef9e5c3d 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7687,15 +7687,7 @@ BattleScript_PrintPlayerForfeitedLinkBattle:: waitmessage 0x40 end2 -BattleScript_ZMoveActivateStatus:: - printstring STRINGID_ZPOWERSURROUNDS - playanimation BS_ATTACKER, B_ANIM_ZMOVE_ACTIVATE, NULL - setzeffect - printstring STRINGID_ZMOVEUNLEASHED - waitmessage 0x40 - return - -BattleScript_ZMoveActivateDamaging:: +BattleScript_ZMoveActivate:: printstring STRINGID_ZPOWERSURROUNDS playanimation BS_ATTACKER, B_ANIM_ZMOVE_ACTIVATE, NULL printstring STRINGID_ZMOVEUNLEASHED diff --git a/include/battle_anim.h b/include/battle_anim.h index 2f481c5f26..14e11dec35 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -206,6 +206,7 @@ u8 GetSubstituteSpriteDefault_Y(u8 battlerId); #define STAT_ANIM_MULTIPLE_MINUS1 57 #define STAT_ANIM_MULTIPLE_MINUS2 58 void LaunchStatusAnimation(u8 battlerId, u8 statusAnimId); +extern const union AnimCmd *const gSpriteAnimTable_853EE80[]; // battle_anim_ground.c void AnimTask_HorizontalShake(u8 taskId); @@ -476,7 +477,9 @@ extern const union AnimCmd *const gAnims_BlizzardIceCrystal[]; // battle_anim_fire.c void AnimFireSpread(struct Sprite *sprite); void AnimFireSpiralOutward(struct Sprite *sprite); +void AnimWillOWispOrb(struct Sprite *); extern const union AnimCmd *const gAnims_FireBlastCross[]; +extern const union AnimCmd *const gAnims_WillOWispOrb[]; // battle_anim_dragon.c extern const union AnimCmd *const gAnims_DragonBreathFire[]; diff --git a/include/battle_message.h b/include/battle_message.h index 2ebb3b837e..7dc17a4b16 100644 --- a/include/battle_message.h +++ b/include/battle_message.h @@ -1,7 +1,7 @@ #ifndef GUARD_BATTLE_MESSAGE_H #define GUARD_BATTLE_MESSAGE_H -#define TEXT_BUFF_ARRAY_COUNT 16 +#define TEXT_BUFF_ARRAY_COUNT 20 //expanded for z move names // for 0xFD #define B_TXT_BUFF1 0x0 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index bc1e84128b..db8452ad06 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -349,7 +349,6 @@ extern const u8 BattleScript_EmergencyExitNoPopUp[]; extern const u8 BattleScript_EmergencyExitWild[]; extern const u8 BattleScript_EmergencyExitWildNoPopUp[]; extern const u8 BattleScript_CheekPouchActivates[]; -extern const u8 BattleScript_ZMoveActivateStatus[]; -extern const u8 BattleScript_ZMoveActivateDamaging[]; +extern const u8 BattleScript_ZMoveActivate[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/battle_z_move.h b/include/battle_z_move.h index ab3f4ad1f6..c87721f52b 100644 --- a/include/battle_z_move.h +++ b/include/battle_z_move.h @@ -18,5 +18,6 @@ void HideZMoveTriggerSprite(void); bool32 IsZMoveTriggerSpriteActive(void); void DestroyZMoveTriggerSprite(void); bool32 MoveSelectionDisplayZMove(u16 zmove); +const u8* GetZMoveName(u16 move); #endif // GUARD_BATTLE_Z_MOVE_H \ No newline at end of file diff --git a/include/constants/moves.h b/include/constants/moves.h index 167a2936a2..4f00b4d436 100644 --- a/include/constants/moves.h +++ b/include/constants/moves.h @@ -809,7 +809,7 @@ #define MOVE_CLANGOROUS_SOULBLAZE 776 #define MOVE_GUARDIAN_OF_ALOLA 777 #define MOVE_SEARING_SUNRAZE_SMASH 778 -#define MOVE_MENACING_MOONRAZE_MAELSTROM 7979 +#define MOVE_MENACING_MOONRAZE_MAELSTROM 779 #define MOVE_LIGHT_THAT_BURNS_THE_SKY 780 #define MOVE_SOUL_STEALING_7_STAR_STRIKE 781 diff --git a/src/battle_anim_fire.c b/src/battle_anim_fire.c index df951ab1a4..b59701bad8 100644 --- a/src/battle_anim_fire.c +++ b/src/battle_anim_fire.c @@ -32,7 +32,6 @@ static void InitEruptionLaunchRockCoordData(struct Sprite *sprite, s16 x, s16 y) static void UpdateEruptionLaunchRockPos(struct Sprite *); static void AnimEruptionFallingRock(struct Sprite *); static void AnimEruptionFallingRock_Step(struct Sprite *); -static void AnimWillOWispOrb(struct Sprite *); static void AnimWillOWispOrb_Step(struct Sprite *); static void AnimWillOWispFire(struct Sprite *); static void AnimTask_MoveHeatWaveTargets_Step(u8 taskId); @@ -428,7 +427,7 @@ static const union AnimCmd sAnim_WillOWispOrb_3[] = ANIMCMD_END, }; -static const union AnimCmd *const sAnims_WillOWispOrb[] = +const union AnimCmd *const gAnims_WillOWispOrb[] = { sAnim_WillOWispOrb_0, sAnim_WillOWispOrb_1, @@ -441,7 +440,7 @@ const struct SpriteTemplate gWillOWispOrbSpriteTemplate = .tileTag = ANIM_TAG_WISP_ORB, .paletteTag = ANIM_TAG_WISP_ORB, .oam = &gOamData_AffineOff_ObjNormal_16x16, - .anims = sAnims_WillOWispOrb, + .anims = gAnims_WillOWispOrb, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimWillOWispOrb, @@ -1143,7 +1142,7 @@ static void AnimEruptionFallingRock_Step(struct Sprite *sprite) } } -static void AnimWillOWispOrb(struct Sprite *sprite) +void AnimWillOWispOrb(struct Sprite *sprite) { switch (sprite->data[0]) { diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c index 041c375295..2aef2b0a8d 100644 --- a/src/battle_anim_new.c +++ b/src/battle_anim_new.c @@ -54,6 +54,7 @@ static void AnimSkyDropBallUp(struct Sprite *sprite); static void SpriteCB_SearingShotRock(struct Sprite* sprite); static void AnimHappyHourCoinShower(struct Sprite *sprite); static void SpriteCB_Geyser(struct Sprite* sprite); +static void SpriteCB_TwinkleOnBattler(struct Sprite *sprite); //////// const data //// general @@ -4097,7 +4098,7 @@ const struct SpriteTemplate gBreakneckBlitzDanceSpriteTemplate = { .tileTag = ANIM_TAG_HOLLOW_ORB, .paletteTag = ANIM_TAG_FLAT_ROCK, - .oam = OAM_OFF_16x16, + .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, @@ -4128,9 +4129,9 @@ const struct SpriteTemplate gAllOutPummelingOnslaughtSpriteTemplate = { .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_IMPACT, - .oam = OAM_OFF_32x32, + .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = 0x83E66CC, - .images = 0x0, + .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = 0x80B0929 }; @@ -4151,7 +4152,7 @@ const struct SpriteTemplate gSupersonicSkystrikeFlySpriteTemplate = .paletteTag = ANIM_TAG_BIRD, .oam = OAM_NORMAL_64x64, .anims = gDummySpriteAnimTable, - .images = 0x0, + .images = NULL, .affineAnims = sSupersonicSkystrikeAffineAnimTable, .callback = 0x80B1C3D }; @@ -4162,7 +4163,7 @@ const struct SpriteTemplate gAcidDownpourReversalSpriteTemplate = .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = OAM_NORMAL_16x16, .anims = gDummySpriteAnimTable, - .images = 0x0, + .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = 0x80E0E95 }; @@ -4172,24 +4173,207 @@ const struct SpriteTemplate gAcidDownpourAuraSpriteTemplate = .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = OAM_NORMAL_16x16, .anims = gDummySpriteAnimTable, - .images = 0x0, + .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = 0x80B477D }; //tectonic rage const struct SpriteTemplate gTectonicRageBlastBurnSpriteTemplate = { -TEC_RAGE_BLAST_BURN: objtemplate ANIM_TAG_FIRE_PLUME ANIM_TAG_FIRE_PLUME OAM_OFF_32x32 0x83E5C50 0x0 gDummySpriteAffineAnimTable BLASTBURN_TARGET_ASM+1 +TEC_RAGE_BLAST_BURN: objtemplate ANIM_TAG_FIRE_PLUME ANIM_TAG_FIRE_PLUME &gOamData_AffineOff_ObjNormal_32x32 0x83E5C50 0x0 gDummySpriteAffineAnimTable BLASTBURN_TARGET_ASM+1 }; const struct SpriteTemplate gTectonicRageExplosionSpriteTemplate = { -TECTONIC_EXPLODE: objtemplate ANIM_TAG_UNUSED_EXPLOSION_2 ANIM_TAG_UNUSED_EXPLOSION_2 OAM_OFF_32x32 0x83E3F90 0x0 gDummySpriteAffineAnimTable SpriteCB_AnimSpriteOnMonPos +TECTONIC_EXPLODE: objtemplate ANIM_TAG_EXPLOSION_2 ANIM_TAG_EXPLOSION_2 &gOamData_AffineOff_ObjNormal_32x32 0x83E3F90 0x0 gDummySpriteAffineAnimTable AnimSpriteOnMonPos };*/ +// black hole eclipse +const struct SpriteTemplate gBlackHoleEclipseShockwaveSpriteTemplate = +{ + .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .paletteTag = ANIM_TAG_BLACK_BALL_2, + .oam = &gOamData_AffineNormal_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_GrowingElectricOrb, + .callback = AnimGrowingShockWaveOrb +}; +const struct SpriteTemplate gBlackHoleEclipseBlueRingSpriteTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_ICE_CHUNK, + .oam = &gOamData_AffineDouble_ObjNormal_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gThinRingExpandingAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; +const struct SpriteTemplate gBlackHoleEclipseBlackRingSpriteTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_HANDS_AND_FEET, + .oam = &gOamData_AffineDouble_ObjNormal_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gThinRingExpandingAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; +const struct SpriteTemplate gBlackHoleEclipseRedExplosionSpriteTemplate = +{ + .tileTag = ANIM_TAG_EXPLOSION_2, + .paletteTag = ANIM_TAG_VERTICAL_HEX, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gExplosionAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; +const struct SpriteTemplate gBlackHoleEclipseWispSpriteTemplate = +{ + .tileTag = ANIM_TAG_WISP_ORB, + .paletteTag = ANIM_TAG_HANDS_AND_FEET, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gAnims_WillOWispOrb, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimWillOWispOrb +}; +const struct SpriteTemplate gBlackHoleEclipseRedRingSpriteTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_VERTICAL_HEX, + .oam = &gOamData_AffineDouble_ObjNormal_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gThinRingExpandingAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; +const struct SpriteTemplate gBlackHoleEclipseBlueRingInwardsSpriteTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_ICE_CHUNK, + .oam = &gOamData_AffineDouble_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gThinRingShrinkingAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; +const struct SpriteTemplate gBlackHoleEclipseRedRingInwardsSpriteTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_VERTICAL_HEX, + .oam = &gOamData_AffineDouble_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gThinRingShrinkingAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; +static const union AffineAnimCmd gGrowingBackHoleTargetAffineCmds[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, -10, 0x88), + AFFINEANIMCMD_END, +}; +static const union AffineAnimCmd *const gGrowingBlackHoleTargetAffineAnimTable[] = { + gGrowingBackHoleTargetAffineCmds, +}; +const struct SpriteTemplate gBlackHoleEclipseHoleSpriteTemplate = +{ + .tileTag = ANIM_TAG_SHADOW_BALL, + .paletteTag = ANIM_TAG_VERTICAL_HEX, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gGrowingBlackHoleTargetAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; +static const union AffineAnimCmd gShrinkingBlackHoleAffineCmds[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(-0x10, -0x10, 0xf6, 8), + AFFINEANIMCMD_END_ALT(1), +}; +static const union AffineAnimCmd *const gShrinkingBlackHoleAffineAnimTable[] = { + gShrinkingBlackHoleAffineCmds, +}; +const struct SpriteTemplate gBlackHoleEclipseHoleShrinkSpriteTemplate = +{ + .tileTag = ANIM_TAG_SHADOW_BALL, + .paletteTag = ANIM_TAG_VERTICAL_HEX, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gShrinkingBlackHoleAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; +static const union AffineAnimCmd gGrowingBackHoleAffineCmds[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, -10, 0x48), + AFFINEANIMCMD_END, +}; +static const union AffineAnimCmd *const gGrowingBlackHoleAffineAnimTable[] = { + gGrowingBackHoleAffineCmds, +}; +const struct SpriteTemplate gBlackHoleEclipseHoleUserSpriteTemplate = +{ + .tileTag = ANIM_TAG_SHADOW_BALL, + .paletteTag = ANIM_TAG_HANDS_AND_FEET, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gGrowingBlackHoleAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; +const struct SpriteTemplate gTargetTwinkleSpriteTemplate = +{ + .tileTag = ANIM_TAG_SPARKLE_4, + .paletteTag = ANIM_TAG_SPARKLE_4, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gSpriteAnimTable_853EE80, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_TwinkleOnBattler +}; //// functions //general +void AnimTask_AllBanksInvisible(u8 taskId) +{ + u32 i; + for (i = 0; i < gBattlersCount; i++) + { + u8 spriteId = gBattlerSpriteIds[i]; + if (spriteId != 0xFF) + gSprites[spriteId].invisible = TRUE; + } + DestroyAnimVisualTask(taskId); +} + +void AnimTask_AllBanksVisible(u8 taskId) +{ + u32 i; + for (i = 0; i < gBattlersCount; i++) + { + u8 spriteId = gBattlerSpriteIds[i]; + if (spriteId != 0xFF) + gSprites[spriteId].invisible = FALSE; + } + DestroyAnimVisualTask(taskId); +} + +void AnimTask_AllBanksInvisibleExceptAttackerAndTarget(u8 taskId) +{ + u32 i; + for (i = 0; i < gBattlersCount; ++i) + { + u8 spriteId = gBattlerSpriteIds[i]; + if (spriteId == GetAnimBattlerSpriteId(ANIM_ATTACKER) || spriteId == GetAnimBattlerSpriteId(ANIM_TARGET)) + continue; + if (spriteId != 0xFF || !IsBattlerSpriteVisible(i)) //Pokemon that are already hidden + gSprites[spriteId].invisible = TRUE; + } + DestroyAnimVisualTask(taskId); +} + static u8 LoadBattleAnimTarget(u8 arg) { u8 battler; @@ -5145,3 +5329,20 @@ void AnimTask_TechnoBlast(u8 taskId) DestroyAnimVisualTask(taskId); } +// Z MOVES +//Creates a twinkle at the location the target was knocked too in Twinkle Tackle +static void SpriteCB_TwinkleOnBattler(struct Sprite *sprite) +{ + struct Sprite* monSprite; + + if (gBattleAnimArgs[2] == ANIM_TARGET) + monSprite = &gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)]; + else + monSprite = &gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)]; + + sprite->pos1 = monSprite->pos1; + sprite->pos2 = monSprite->pos2; + sprite->callback = RunStoredCallbackWhenAnimEnds; + StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); +} + diff --git a/src/battle_anim_status_effects.c b/src/battle_anim_status_effects.c index 56a8afa531..17bb916282 100644 --- a/src/battle_anim_status_effects.c +++ b/src/battle_anim_status_effects.c @@ -109,7 +109,7 @@ static const union AnimCmd sSpriteAnim_853EE68[] = ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_853EE80[] = +const union AnimCmd *const gSpriteAnimTable_853EE80[] = { sSpriteAnim_853EE68 }; @@ -119,7 +119,7 @@ const struct SpriteTemplate gSpinningSparkleSpriteTemplate = .tileTag = ANIM_TAG_SPARKLE_4, .paletteTag = ANIM_TAG_SPARKLE_4, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sSpriteAnimTable_853EE80, + .anims = gSpriteAnimTable_853EE80, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpinningSparkle, diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 3625fcefc8..b9b2337341 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -653,7 +653,7 @@ static void HandleInputChooseMove(void) } else if (JOY_NEW(DPAD_LEFT)) { - if (gMoveSelectionCursor[gActiveBattler] & 1) + if (!gBattleStruct->zmove.viewing && gMoveSelectionCursor[gActiveBattler] & 1) { MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]); gMoveSelectionCursor[gActiveBattler] ^= 1; @@ -666,7 +666,7 @@ static void HandleInputChooseMove(void) } else if (JOY_NEW(DPAD_RIGHT)) { - if (!(gMoveSelectionCursor[gActiveBattler] & 1) + if (!gBattleStruct->zmove.viewing && !(gMoveSelectionCursor[gActiveBattler] & 1) && (gMoveSelectionCursor[gActiveBattler] ^ 1) < gNumberOfMovesToChoose) { MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]); @@ -680,7 +680,7 @@ static void HandleInputChooseMove(void) } else if (JOY_NEW(DPAD_UP)) { - if (gMoveSelectionCursor[gActiveBattler] & 2) + if (!gBattleStruct->zmove.viewing && gMoveSelectionCursor[gActiveBattler] & 2) { MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]); gMoveSelectionCursor[gActiveBattler] ^= 2; @@ -693,7 +693,7 @@ static void HandleInputChooseMove(void) } else if (JOY_NEW(DPAD_DOWN)) { - if (!(gMoveSelectionCursor[gActiveBattler] & 2) + if (!gBattleStruct->zmove.viewing && !(gMoveSelectionCursor[gActiveBattler] & 2) && (gMoveSelectionCursor[gActiveBattler] ^ 2) < gNumberOfMovesToChoose) { MoveSelectionDestroyCursorAt(gMoveSelectionCursor[gActiveBattler]); diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 3d7222ffe8..5305b44392 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -525,7 +525,7 @@ static void Task_ClearBitWhenSpecialAnimDone(u8 taskId) // Great function to include newly added moves that don't have animation yet. bool8 IsMoveWithoutAnimation(u16 moveId, u8 animationTurn) { - if (moveId >= (MOVES_COUNT - 1)) + if (moveId >= (MOVES_COUNT_Z - 1)) return TRUE; else return FALSE; diff --git a/src/battle_message.c b/src/battle_message.c index b8503e67a0..f15070959c 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -5,6 +5,7 @@ #include "battle_message.h" #include "battle_setup.h" #include "battle_tower.h" +#include "battle_z_move.h" #include "data.h" #include "event_data.h" #include "frontier_util.h" @@ -2553,7 +2554,9 @@ void BufferStringBattle(u16 stringID) } break; case STRINGID_USEDMOVE: // pokemon used a move msg - if (gBattleMsgDataPtr->currentMove >= MOVES_COUNT) + if (gBattleStruct->zmove.active) + StringCopy(gBattleTextBuff3, GetZMoveName(gBattleMsgDataPtr->currentMove)); + else if (gBattleMsgDataPtr->currentMove >= MOVES_COUNT) StringCopy(gBattleTextBuff3, sATypeMove_Table[*(&gBattleStruct->stringMoveType)]); else StringCopy(gBattleTextBuff3, gMoveNames[gBattleMsgDataPtr->currentMove]); @@ -2982,13 +2985,17 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) HANDLE_NICKNAME_STRING_CASE(gBattleScripting.battler) break; case B_TXT_CURRENT_MOVE: // current move name - if (gBattleMsgDataPtr->currentMove >= MOVES_COUNT) + if (gBattleStruct->zmove.active) + toCpy = GetZMoveName(gBattleMsgDataPtr->currentMove); + else if (gBattleMsgDataPtr->currentMove >= MOVES_COUNT) toCpy = sATypeMove_Table[gBattleStruct->stringMoveType]; else toCpy = gMoveNames[gBattleMsgDataPtr->currentMove]; break; case B_TXT_LAST_MOVE: // originally used move name - if (gBattleMsgDataPtr->originallyUsedMove >= MOVES_COUNT) + if (gBattleStruct->zmove.active) + toCpy = GetZMoveName(gBattleMsgDataPtr->originallyUsedMove); + else if (gBattleMsgDataPtr->originallyUsedMove >= MOVES_COUNT) toCpy = sATypeMove_Table[gBattleStruct->stringMoveType]; else toCpy = gMoveNames[gBattleMsgDataPtr->originallyUsedMove]; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 7e975c3c5a..86947e09f7 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1627,7 +1627,14 @@ 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) diff --git a/src/battle_util.c b/src/battle_util.c index a015759468..8cb7c624b6 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -95,7 +95,7 @@ void HandleAction_UseMove(void) gCurrentMove = gChosenMove = gLockedMoves[gBattlerAttacker]; } // encore forces you to use the same move - else if (gDisableStructs[gBattlerAttacker].encoredMove != MOVE_NONE + else if (!gBattleStruct->zmove.active && gDisableStructs[gBattlerAttacker].encoredMove != MOVE_NONE && gDisableStructs[gBattlerAttacker].encoredMove == gBattleMons[gBattlerAttacker].moves[gDisableStructs[gBattlerAttacker].encoredMovePos]) { gCurrentMove = gChosenMove = gDisableStructs[gBattlerAttacker].encoredMove; @@ -103,7 +103,7 @@ void HandleAction_UseMove(void) *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, 0); } // check if the encored move wasn't overwritten - else if (gDisableStructs[gBattlerAttacker].encoredMove != MOVE_NONE + else if (!gBattleStruct->zmove.active && gDisableStructs[gBattlerAttacker].encoredMove != MOVE_NONE && gDisableStructs[gBattlerAttacker].encoredMove != gBattleMons[gBattlerAttacker].moves[gDisableStructs[gBattlerAttacker].encoredMovePos]) { gCurrMovePos = gChosenMovePos = gDisableStructs[gBattlerAttacker].encoredMovePos; @@ -122,6 +122,12 @@ void HandleAction_UseMove(void) { gCurrentMove = gChosenMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos]; } + + // check z move used + if (gBattleStruct->zmove.active) + { + gCurrentMove = gBattleStruct->zmove.currZMove; + } if (gBattleMons[gBattlerAttacker].hp != 0) { @@ -3187,18 +3193,8 @@ u8 AtkCanceller_UnableToUseMove(void) gBattleStruct->zmove.used[gBattlerAttacker] = TRUE; //TODO - partner battles. gBattleScripting.battler = gBattlerAttacker; - if (gBattleMoves[gCurrentMove].split == SPLIT_STATUS) - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ZMoveActivateStatus; - //gBattleStruct->zmove.effect = gBattleMoves[gCurrentMove].z_move_effect; - //gBattleStruct->zmove.effectApplied = TRUE; - } - else - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ZMoveActivateDamaging; - } + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ZMoveActivate; effect = 1; } gBattleStruct->atkCancellerTracker++; diff --git a/src/battle_z_move.c b/src/battle_z_move.c index 116c2c791c..cdaf38849b 100644 --- a/src/battle_z_move.c +++ b/src/battle_z_move.c @@ -42,7 +42,6 @@ static u16 GetSignatureZMove(u16 move, u16 species, u16 item); static u16 GetTypeBasedZMove(u16 move, u8 battler); static void ZMoveSelectionDisplayPpNumber(void); static void ZMoveSelectionDisplayPower(u16 move, u16 zMove); -static const u8* GetZMoveName(u16 move); static void ShowZMoveTriggerSprite(void); // Const Data @@ -517,7 +516,7 @@ static void ZMoveSelectionDisplayPpNumber(void) BattlePutTextOnWindow(gDisplayedStringBattle, 9); } -static const u8* GetZMoveName(u16 move) +const u8* GetZMoveName(u16 move) { if (IsZMove(move)) return gZMoveNames[move - MOVE_BREAKNECK_BLITZ]; diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 279e7b3284..3425ccdb44 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -1,4 +1,4 @@ -const struct BattleMove gBattleMoves[MOVES_COUNT] = +const struct BattleMove gBattleMoves[MOVES_COUNT_Z] = { [MOVE_NONE] = { @@ -10843,4 +10843,531 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .zMovePower = 120, .zMoveEffect = Z_EFFECT_NONE, }, + + // Z MOVES + [MOVE_BREAKNECK_BLITZ] = + { + .effect = EFFECT_HIT, + .power = 1, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_PHYSICAL, //determined from move type + .zMoveEffect = 0 + }, + [MOVE_ALL_OUT_PUMMELING] = + { + .effect = EFFECT_HIT, + .power = 1, + .type = TYPE_FIGHTING, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_PHYSICAL, + .zMoveEffect = 0 + }, + [MOVE_SUPERSONIC_SKYSTRIKE] = + { + .effect = EFFECT_HIT, + .power = 1, + .type = TYPE_FLYING, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_PHYSICAL, + .zMoveEffect = 0 + }, + [MOVE_ACID_DOWNPOUR] = + { + .effect = EFFECT_HIT, + .power = 1, + .type = TYPE_POISON, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_PHYSICAL, + .zMoveEffect = 0 + }, + [MOVE_TECTONIC_RAGE] = + { + .effect = EFFECT_HIT, + .power = 1, + .type = TYPE_GROUND, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_PHYSICAL, + .zMoveEffect = 0 + }, + [MOVE_CONTINENTAL_CRUSH] = + { + .effect = EFFECT_HIT, + .power = 1, + .type = TYPE_ROCK, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_PHYSICAL, + .zMoveEffect = 0 + }, + [MOVE_SAVAGE_SPIN_OUT] = + { + .effect = EFFECT_HIT, + .power = 1, + .type = TYPE_BUG, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_PHYSICAL, + .zMoveEffect = 0 + }, + [MOVE_NEVER_ENDING_NIGHTMARE] = + { + .effect = EFFECT_HIT, + .power = 1, + .type = TYPE_GHOST, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_PHYSICAL, + .zMoveEffect = 0 + }, + [MOVE_CORKSCREW_CRASH] = + { + .effect = EFFECT_HIT, + .power = 1, + .type = TYPE_STEEL, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_PHYSICAL, + .zMoveEffect = 0 + }, + [MOVE_INFERNO_OVERDRIVE] = + { + .effect = EFFECT_HIT, + .power = 1, + .type = TYPE_FIRE, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_PHYSICAL, + .zMoveEffect = 0 + }, + [MOVE_HYDRO_VORTEX] = + { + .effect = EFFECT_HIT, + .power = 1, + .type = TYPE_WATER, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_PHYSICAL, + .zMoveEffect = 0 + }, + [MOVE_BLOOM_DOOM] = + { + .effect = EFFECT_HIT, + .power = 1, + .type = TYPE_GRASS, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_PHYSICAL, + .zMoveEffect = 0 + }, + [MOVE_GIGAVOLT_HAVOC] = + { + .effect = EFFECT_HIT, + .power = 1, + .type = TYPE_ELECTRIC, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_PHYSICAL, + .zMoveEffect = 0 + }, + [MOVE_SHATTERED_PSYCHE] = + { + .effect = EFFECT_HIT, + .power = 1, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_PHYSICAL, + .zMoveEffect = 0 + }, + [MOVE_SUBZERO_SLAMMER] = + { + .effect = EFFECT_HIT, + .power = 1, + .type = TYPE_ICE, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_PHYSICAL, + .zMoveEffect = 0 + }, + [MOVE_DEVASTATING_DRAKE] = + { + .effect = EFFECT_HIT, + .power = 1, + .type = TYPE_DRAGON, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_PHYSICAL, + .zMoveEffect = 0 + }, + [MOVE_BLACK_HOLE_ECLIPSE] = + { + .effect = EFFECT_HIT, + .power = 1, + .type = TYPE_DARK, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_PHYSICAL, + .zMoveEffect = 0 + }, + [MOVE_TWINKLE_TACKLE] = + { + .effect = EFFECT_HIT, + .power = 1, + .type = TYPE_FAIRY, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_PHYSICAL, + .zMoveEffect = 0 + }, + [MOVE_CATASTROPIKA] = + { + .effect = EFFECT_HIT, + .power = 210, + .type = TYPE_ELECTRIC, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_PHYSICAL, + .zMoveEffect = 0 + }, + [MOVE_10000000_VOLT_THUNDERBOLT] = + { + .effect = EFFECT_HIT,//TODO: EFFECT_HIGH_CRITICAL, + .power = 195, + .type = TYPE_ELECTRIC, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_SPECIAL, + .zMoveEffect = 0 + }, + [MOVE_STOKED_SPARKSURFER] = + { + .effect = EFFECT_HIT, //EFFECT_PARALYZE_HIT, + .power = 175, + .type = TYPE_ELECTRIC, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_SPECIAL, + .zMoveEffect = 0 + }, + [MOVE_EXTREME_EVOBOOST] = + { + .effect = EFFECT_HIT,//TODO: EFFECT_EXTREME_EVOBOOST, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_STATUS, + .zMoveEffect = 0 + }, + [MOVE_PULVERIZING_PANCAKE] = + { + .effect = EFFECT_HIT, + .power = 210, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_PHYSICAL, + .zMoveEffect = 0 + }, + [MOVE_GENESIS_SUPERNOVA] = + { + .effect = EFFECT_HIT,//TODO: EFFECT_DAMAGE_SET_TERRAIN, + .power = 185, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_SPECIAL, + .zMoveEffect = 0 + }, + [MOVE_SINISTER_ARROW_RAID] = + { + .effect = EFFECT_HIT, + .power = 180, + .type = TYPE_GHOST, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_PHYSICAL, + .zMoveEffect = 0 + }, + [MOVE_MALICIOUS_MOONSAULT] = + { + .effect = EFFECT_HIT, + .power = 180, + .type = TYPE_DARK, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_PHYSICAL, + .zMoveEffect = 0 + }, + [MOVE_OCEANIC_OPERETTA] = + { + .effect = EFFECT_HIT, + .power = 195, + .type = TYPE_WATER, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_SPECIAL, + .zMoveEffect = 0 + }, + [MOVE_SPLINTERED_STORMSHARDS] = + { + .effect = EFFECT_HIT, //TODO removes terrain + .power = 190, + .type = TYPE_ROCK, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_PHYSICAL, + .zMoveEffect = 0 + }, + [MOVE_LETS_SNUGGLE_FOREVER] = + { + .effect = EFFECT_HIT, + .power = 190, + .type = TYPE_FAIRY, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_PHYSICAL, + .zMoveEffect = 0 + }, + [MOVE_CLANGOROUS_SOULBLAZE] = + { + .effect = EFFECT_HIT,//TODO: EFFECT_ALL_STATS_UP_HIT, + .power = 185, + .type = TYPE_DRAGON, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_BOTH, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_SPECIAL, + .zMoveEffect = 0 + }, + [MOVE_GUARDIAN_OF_ALOLA] = + { + .effect = EFFECT_HIT,//TODO: EFFECT_SUPER_FANG, + .power = 1, + .type = TYPE_FAIRY, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_SPECIAL, + .zMoveEffect = 0 + }, + [MOVE_SEARING_SUNRAZE_SMASH] = + { + .effect = EFFECT_HIT, + .power = 200, + .type = TYPE_STEEL, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_PHYSICAL, + .zMoveEffect = 0 + }, + [MOVE_MENACING_MOONRAZE_MAELSTROM] = + { + .effect = EFFECT_HIT, + .power = 200, + .type = TYPE_GHOST, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_SPECIAL, + .zMoveEffect = 0 + }, + [MOVE_LIGHT_THAT_BURNS_THE_SKY] = + { + .effect = EFFECT_HIT, + .power = 200, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_SPECIAL, + .zMoveEffect = 0 + }, + [MOVE_SOUL_STEALING_7_STAR_STRIKE] = + { + .effect = EFFECT_HIT, + .power = 195, + .type = TYPE_GHOST, + .accuracy = 0, + .pp = 1, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .zMovePower = 0, + .split = SPLIT_PHYSICAL, + .zMoveEffect = 0 + }, };