diff --git a/asm/macros/battle_ai_script.inc b/asm/macros/battle_ai_script.inc index 4c7646d6f6..88acc34b69 100644 --- a/asm/macros/battle_ai_script.inc +++ b/asm/macros/battle_ai_script.inc @@ -227,15 +227,15 @@ .byte \battler .endm - .macro if_equal_ param0:req, param1:req + .macro if_equal_u32 param0:req, param1:req .byte 0x26 - .byte \param0 + .4byte \param0 .4byte \param1 .endm - .macro if_not_equal_ param0:req, param1:req + .macro if_not_equal_u32 param0:req, param1:req .byte 0x27 - .byte \param0 + .4byte \param0 .4byte \param1 .endm @@ -245,10 +245,10 @@ .4byte \param1 .endm - .macro if_user_doesnt_go param0:req, param1:req + .macro if_cant_use_belch battler:req, ptr:req .byte 0x29 - .byte \param0 - .4byte \param1 + .byte \battler + .4byte \ptr .endm .macro nullsub_2A @@ -315,13 +315,13 @@ .macro if_effect param0:req, param1:req .byte 0x37 - .byte \param0 + .2byte \param0 .4byte \param1 .endm .macro if_not_effect param0:req, param1:req .byte 0x38 - .byte \param0 + .2byte \param0 .4byte \param1 .endm @@ -467,24 +467,32 @@ .byte \battler .endm - .macro nullsub_52 + .macro if_move_flag flag jumpptr .byte 0x52 + .4byte \flag + .4byte \jumpptr .endm - .macro nullsub_53 + .macro if_field_status flag jumpptr .byte 0x53 + .4byte \flag + .4byte \jumpptr .endm - .macro nullsub_54 + .macro get_move_accuracy .byte 0x54 .endm - .macro nullsub_55 + .macro call_if_eq value, ptr .byte 0x55 + .2byte \value + .4byte \ptr .endm - .macro nullsub_56 - .byte 0x56 + .macro call_if_move_flag flag ptr + .byte 0x52 + .4byte \flag + .4byte \ptr .endm .macro nullsub_57 @@ -551,7 +559,158 @@ .4byte \param2 .endm + .macro get_ally_chosen_move + .byte 0x63 + .endm + + .macro if_has_no_attacking_moves battler:req, param1:req + .byte 0x64 + .byte \battler + .4byte \param1 + .endm + + .macro get_hazards_count battler:req, effect:req + .byte 0x65 + .byte \battler + .2byte \effect + .endm + + .macro if_doesnt_hold_berry battler:req, ptr:req + .byte 0x66 + .byte \battler + .4byte \ptr + .endm + + .macro if_share_type battler1:req, battler2:req, ptr:req + .byte 0x67 + .byte \battler1 + .byte \battler2 + .4byte \ptr + .endm + + .macro if_cant_use_last_resort battler:req, ptr:req + .byte 0x68 + .byte \battler + .4byte \ptr + .endm + + .macro if_has_move_with_split battler:req, split:req, ptr:req + .byte 0x69 + .byte \battler + .byte \split + .4byte \ptr + .endm + + .macro if_has_no_move_with_split battler:req, split:req, ptr:req + .byte 0x6A + .byte \battler + .byte \split + .4byte \ptr + .endm + + .macro if_physical_moves_unusable attacker:req, target:req, ptr:req + .byte 0x6B + .byte \attacker + .byte \target + .4byte \ptr + .endm + + .macro if_ai_can_go_down ptr:req + .byte 0x6C + .4byte \ptr + .endm + + .macro if_has_move_with_type battler:req, type:req, ptr:req + .byte 0x6D + .byte \battler + .byte \type + .4byte \ptr + .endm + + .macro if_no_move_used battler:req, ptr:req + .byte 0x6E + .byte \battler + .4byte \ptr + .endm + + .macro if_has_move_with_flag battler:req, flag:req, ptr:req + .byte 0x6F + .byte \battler + .4byte \flag + .4byte \ptr + .endm + + .macro if_battler_absent battler:req, ptr:req + .byte 0x70 + .byte \battler + .4byte \ptr + .endm + + .macro if_grounded battler:req, ptr:req + .byte 0x71 + .byte \battler + .4byte \ptr + .endm + + .macro get_best_dmg_hp_percent + .byte 0x72 + .endm + + .macro get_curr_dmg_hp_percent + .byte 0x73 + .endm + + .macro get_move_split_from_result + .byte 0x74 + .endm + + .macro get_considered_move_split + .byte 0x75 + .endm + + .macro get_considered_move_target + .byte 0x76 + .endm + + .macro compare_speeds battler1:req, battler2:req + .byte 0x77 + .byte \battler1 + .byte \battler2 + .endm + + .macro is_wakeup_turn battler:req + .byte 0x78 + .byte \battler + .endm + + .macro if_has_move_with_accuracy_lt battler:req, value:req, ptr:req + .byte 0x79 + .byte \battler + .byte \value + .4byte \ptr + .endm + @ useful script macros + .macro if_has_physical_move battler:req, ptr:req + if_has_move_with_split \battler, SPLIT_PHYSICAL, \ptr + .endm + + .macro if_has_no_physical_move battler:req, ptr:req + if_has_no_move_with_split \battler, SPLIT_PHYSICAL, \ptr + .endm + + .macro if_has_special_move battler:req, ptr:req + if_has_move_with_split \battler, SPLIT_SPECIAL, \ptr + .endm + + .macro if_has_no_special_move battler:req, ptr:req + if_has_no_move_with_split \battler, SPLIT_SPECIAL, \ptr + .endm + + .macro if_holds_no_item battler, ptr:req + if_holds_item \battler, 0, \ptr + .endm + .macro get_curr_move_type get_type AI_TYPE_MOVE .endm @@ -617,3 +776,8 @@ .macro if_any_move_encored battler:req, ptr:req if_any_move_disabled_or_encored \battler, 1, \ptr .endm + + .macro call_if_always_hit ptr:req + get_move_accuracy + call_if_eq 0, \ptr + .endm diff --git a/asm/macros/battle_anim_script.inc b/asm/macros/battle_anim_script.inc index 5426cdfba3..c54845e005 100644 --- a/asm/macros/battle_anim_script.inc +++ b/asm/macros/battle_anim_script.inc @@ -283,3 +283,48 @@ .macro jumpretfalse ptr:req jumpreteq FALSE, \ptr .endm + + .macro jumpifdoublebattle ptr:req + createvisualtask AnimTask_IsDoubleBattle, 0 + jumprettrue \ptr + .endm + +@ keep CFRU macros cause I'm lazy. todo: update to createsprite and createvisualtask, respectively +.macro launchtemplate launchtemplatePtr launchtemplatePriority launchtemplateArgsNo launchtemplatearg0 launchtemplatearg1 launchtemplatearg2 launchtemplatearg3 launchtemplatearg4 launchtemplatearg5 launchtemplatearg6 launchtemplatearg7 launchtemplatearg8 + .byte 0x2 + .word \launchtemplatePtr + .byte \launchtemplatePriority + .byte \launchtemplateArgsNo + .hword \launchtemplatearg0 + .hword \launchtemplatearg1 + .hword \launchtemplatearg2 + .hword \launchtemplatearg3 + .hword \launchtemplatearg4 + .hword \launchtemplatearg5 + .hword \launchtemplatearg6 + .hword \launchtemplatearg7 + .hword \launchtemplatearg8 + .endm + +.macro launchtask launchtaskPtr launchtaskPriority launchtaskArgsNo launchtaskarg0 launchtaskarg1 launchtaskarg2 launchtaskarg3 launchtaskarg4 launchtaskarg5 launchtaskarg6 launchtaskarg7 launchtaskarg8 + .byte 0x3 + .word \launchtaskPtr + .byte \launchtaskPriority + .byte \launchtaskArgsNo + .hword \launchtaskarg0 + .hword \launchtaskarg1 + .hword \launchtaskarg2 + .hword \launchtaskarg3 + .hword \launchtaskarg4 + .hword \launchtaskarg5 + .hword \launchtaskarg6 + .hword \launchtaskarg7 + .hword \launchtaskarg8 + .endm + +.macro setblends setblends_value +.byte 0xC +.hword \setblends_value +.endm + + diff --git a/asm/macros/battle_frontier/battle_tower.inc b/asm/macros/battle_frontier/battle_tower.inc index 71e795b1d1..f399a5c9c0 100644 --- a/asm/macros/battle_frontier/battle_tower.inc +++ b/asm/macros/battle_frontier/battle_tower.inc @@ -89,3 +89,77 @@ setvar VAR_0x8004, BATTLE_TOWER_FUNC_SET_INTERVIEW_DATA special CallBattleTowerFunc .endm + + @Custom multi-battle commands + + .macro choose_mons + fadescreen 1 + special ChooseHalfPartyForBattle @ choose 3 mons for battle + waitstate + .endm + + .macro multi_do type:req, partnerId:req, partnerPicId:req + special ReducePlayerPartyToSelectedMons + setvar VAR_0x8004, FRONTIER_UTIL_FUNC_SET_DATA + setvar VAR_0x8005, FRONTIER_DATA_SELECTED_MON_ORDER + special CallFrontierUtilFunc @ saves the mon order, so the non-selected mons get restored afterwards + setvar VAR_0x8004, SPECIAL_BATTLE_MULTI + setvar VAR_0x8005, \type | MULTI_BATTLE_CHOOSE_MONS + setvar VAR_0x8006, \partnerId + setvar VAR_0x8007, \partnerPicId + special DoSpecialTrainerBattle + waitstate + setvar VAR_0x8004, FRONTIER_UTIL_FUNC_SAVE_PARTY + special CallFrontierUtilFunc + special LoadPlayerParty + .endm + + .macro multi_2_vs_2 trainer1Id:req, trainer1LoseText:req, trainer2Id:req, trainer2LoseText:req, partnerId:req, partnerPicId:req + special SavePlayerParty + trainerbattle TRAINER_BATTLE_SET_TRAINER_A, \trainer1Id, 0, NULL, \trainer1LoseText @ set first trainer mons + trainerbattle TRAINER_BATTLE_SET_TRAINER_B, \trainer2Id, 0, NULL, \trainer2LoseText @ set second trainer mons + multi_do MULTI_BATTLE_2_VS_2, \partnerId, \partnerPicId + .endm + + .macro multi_2_vs_1 trainer1Id:req, trainer1LoseText:req, partnerId:req, partnerPicId:req + special SavePlayerParty + trainerbattle TRAINER_BATTLE_SET_TRAINER_A, \trainer1Id, 0, NULL, \trainer1LoseText @ set first trainer mons + multi_do MULTI_BATTLE_2_VS_1, \partnerId, \partnerPicId + .endm + + @ Wild mons need to be assigned to gEnemyParty 0 and 3 slots, other slots need to be cleared out. + .macro multi_wild partnerId:req, partnerPicId:req + special SavePlayerParty + multi_do MULTI_BATTLE_2_VS_WILD, \partnerId, \partnerPicId + .endm + + .macro multi_do_fixed type:req, partnerId:req, partnerPicId:req + setvar VAR_0x8004, SPECIAL_BATTLE_MULTI + setvar VAR_0x8005, \type + setvar VAR_0x8006, \partnerId + setvar VAR_0x8007, \partnerPicId + special DoSpecialTrainerBattle + waitstate + setvar VAR_0x8004, FRONTIER_UTIL_FUNC_SAVE_PARTY + special CallFrontierUtilFunc + special LoadPlayerParty + .endm + + .macro multi_fixed_2_vs_2 trainer1Id:req, trainer1LoseText:req, trainer2Id:req, trainer2LoseText:req, partnerId:req, partnerPicId:req + special SavePlayerParty + trainerbattle TRAINER_BATTLE_SET_TRAINER_A, \trainer1Id, 0, NULL, \trainer1LoseText @ set first trainer mons + trainerbattle TRAINER_BATTLE_SET_TRAINER_B, \trainer2Id, 0, NULL, \trainer2LoseText @ set second trainer mons + multi_do_fixed MULTI_BATTLE_2_VS_2, \partnerId, \partnerPicId + .endm + + .macro multi_fixed_2_vs_1 trainer1Id:req, trainer1LoseText:req, partnerId:req, partnerPicId:req + special SavePlayerParty + trainerbattle TRAINER_BATTLE_SET_TRAINER_A, \trainer1Id, 0, NULL, \trainer1LoseText @ set first trainer mons + multi_do_fixed MULTI_BATTLE_2_VS_1, \partnerId, \partnerPicId + .endm + + @ Wild mons need to be assigned to gEnemyParty 0 and 3 slots, other slots need to be cleared out. + .macro multi_fixed_wild partnerId:req, partnerPicId:req + special SavePlayerParty + multi_do_fixed MULTI_BATTLE_2_VS_WILD, \partnerId, \partnerPicId + .endm diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 37548f410a..41a51efeb7 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -29,11 +29,11 @@ .byte 0x6 .endm - .macro adjustnormaldamage + .macro adjustdamage .byte 0x7 .endm - .macro adjustnormaldamage2 + .macro multihitresultmessage .byte 0x8 .endm @@ -150,7 +150,7 @@ .macro jumpifsideaffecting battler:req, sidestatus:req, ptr:req .byte 0x1f .byte \battler - .2byte \sidestatus + .4byte \sidestatus .4byte \ptr .endm @@ -171,12 +171,21 @@ .4byte \ptr .endm - .macro jumpiftype battler:req, type:req, ptr:req + .macro jumpbasedontype battler:req, type:req, case:req, ptr:req .byte 0x22 .byte \battler .byte \type + .byte \case .4byte \ptr .endm + + .macro jumpiftype battler:req, type:req, ptr:req + jumpbasedontype \battler, \type, 1, \ptr + .endm + + .macro jumpifnottype battler:req, type:req, ptr:req + jumpbasedontype \battler, \type, 0, \ptr + .endm .macro getexp battler:req .byte 0x23 @@ -356,11 +365,8 @@ .4byte \ptr .endm - .macro jumpiftype2 battler:req, type:req, ptr:req + .macro setroost .byte 0x42 - .byte \battler - .byte \type - .4byte \ptr .endm .macro jumpifabilitypresent ability:req, ptr:req @@ -436,8 +442,9 @@ moveend 2, \to .endm - .macro typecalc2 + .macro sethealblock ptr .byte 0x4a + .4byte \ptr .endm .macro returnatktoball @@ -593,8 +600,9 @@ .byte 0x68 .endm - .macro adjustsetdamage + .macro setgravity ptr .byte 0x69 + .4byte \ptr .endm .macro removeitem battler:req @@ -623,7 +631,7 @@ .byte \battler .endm - .macro recordlastability battler:req + .macro recordability battler:req .byte 0x70 .byte \battler .endm @@ -711,8 +719,9 @@ .4byte \ptr .endm - .macro nop + .macro setmiracleeye ptr .byte 0x83 + .4byte \ptr .endm .macro jumpifcantmakeasleep param0:req @@ -720,8 +729,9 @@ .4byte \param0 .endm - .macro stockpile + .macro stockpile id:req .byte 0x85 + .byte \id .endm .macro stockpiletobasedamage param0:req @@ -734,13 +744,13 @@ .4byte \param0 .endm - .macro negativedamage + .macro setdrainedhp .byte 0x88 .endm .macro statbuffchange flags:req, jumpptr:req .byte 0x89 - .byte \flags + .2byte \flags .4byte \jumpptr .endm @@ -895,8 +905,9 @@ .byte 0xab .endm - .macro remaininghptopower + .macro settailwind ptr:req .byte 0xac + .4byte \ptr .endm .macro tryspiteppreduce param0:req @@ -927,7 +938,7 @@ .4byte \param0 .endm - .macro rolloutdamagecalculation + .macro handlerollout .byte 0xb3 .endm @@ -937,12 +948,13 @@ .4byte \ptr .endm - .macro furycuttercalc + .macro handlefurycutter .byte 0xb5 .endm - .macro happinesstodamagecalculation + .macro setembargo ptr .byte 0xb6 + .4byte \ptr .endm .macro presentdamagecalculation @@ -989,8 +1001,9 @@ .4byte \param0 .endm - .macro hiddenpowercalc + .macro setstickyweb ptr .byte 0xc1 + .4byte \ptr .endm .macro selectfirstvalidtarget @@ -1082,13 +1095,14 @@ .4byte \param1 .endm - .macro trysetroots param0:req + .macro settoxicspikes ptr:req .byte 0xd5 - .4byte \param0 + .4byte \ptr .endm - .macro doubledamagedealtifdamaged + .macro setgastroacid ptr .byte 0xd6 + .4byte \ptr .endm .macro setyawn param0:req @@ -1101,7 +1115,7 @@ .4byte \param0 .endm - .macro scaledamagebyhealthratio + .macro setroom .byte 0xd9 .endm @@ -1115,13 +1129,15 @@ .4byte \param0 .endm - .macro trysetgrudge param0:req + .macro setstealthrock ptr:req .byte 0xdc - .4byte \param0 + .4byte \ptr .endm - .macro weightdamagecalculation + .macro setuserstatus3 flags ptr .byte 0xdd + .4byte \flags + .4byte \ptr .endm .macro assistattackselect param0:req @@ -1176,8 +1192,9 @@ .4byte \param0 .endm - .macro setweatherballtype + .macro jumpifsubstituteblocks ptr .byte 0xe9 + .4byte \ptr .endm .macro tryrecycleitem param0:req @@ -1246,6 +1263,41 @@ .byte \param0 .endm + .macro settelekinesis ptr:req + .byte 0xf9 + .4byte \ptr + .endm + + .macro swapstatstages stat:req + .byte 0xfa + .byte \stat + .endm + + .macro averagestats stat:req + .byte 0xfb + .byte \stat + .endm + + .macro jumpifoppositegenders ptr:req + .byte 0xfc + .4byte \ptr + .endm + + .macro trygetbaddreamstarget ptr:req + .byte 0xfd + .4byte \ptr + .endm + + .macro tryworryseed ptr:req + .byte 0xfe + .4byte \ptr + .endm + + .macro metalburstdamagecalculator ptr:req + .byte 0xff + .4byte \ptr + .endm + @ various command changed to more readable macros .macro cancelmultiturnmoves battler:req various \battler, VARIOUS_CANCEL_MULTI_TURN_MOVES @@ -1355,13 +1407,363 @@ various \battler, VARIOUS_PLAY_TRAINER_DEFEATED_MUSIC .endm + .macro stattextbuffer battler:req + various \battler, VARIOUS_STAT_TEXT_BUFFER + .endm + + .macro switchinabilities battler:req + various \battler, VARIOUS_SWITCHIN_ABILITIES + .endm + + .macro savetarget + various BS_TARGET, VARIOUS_SAVE_TARGET + .endm + + .macro restoretarget + various BS_TARGET, VARIOUS_RESTORE_TARGET + .endm + + .macro instanthpdrop battler:req + various \battler, VARIOUS_INSTANT_HP_DROP + .endm + + .macro clearstatus battler:req + various \battler, VARIOUS_CLEAR_STATUS + .endm + + .macro restorepp battler:req + various \battler, VARIOUS_RESTORE_PP + .endm + + .macro tryactivatemoxie battler:req + various \battler, VARIOUS_TRY_ACTIVATE_MOXIE + .endm + + .macro tryactivatebeastboost battler:req + various \battler, VARIOUS_TRY_ACTIVATE_BEAST_BOOST + .endm + + .macro tryactivatereceiver battler:req + various \battler, VARIOUS_TRY_ACTIVATE_RECEIVER + .endm + + .macro tryactivatesoulheart + various BS_ATTACKER, VARIOUS_TRY_ACTIVATE_SOULHEART + .endm + + .macro tryactivatefellstinger battler:req + various \battler, VARIOUS_TRY_ACTIVATE_FELL_STINGER + .endm + + .macro playmoveanimation battler:req, move:req + various \battler, VARIOUS_PLAY_MOVE_ANIMATION + .2byte \move + .endm + + .macro setluckychant battler:req, ptr:req + various \battler VARIOUS_SET_LUCKY_CHANT + .4byte \ptr + .endm + + .macro suckerpunchcheck ptr:req + various BS_ATTACKER, VARIOUS_SUCKER_PUNCH_CHECK + .4byte \ptr + .endm + + .macro setabilitysimple battler:req, ptr:req + various \battler VARIOUS_SET_SIMPLE_BEAM + .4byte \ptr + .endm + + .macro tryentrainment ptr:req + various BS_ATTACKER, VARIOUS_TRY_ENTRAINMENT + .4byte \ptr + .endm + + .macro setlastusedability battler:req + various \battler, VARIOUS_SET_LAST_USED_ABILITY + .endm + + .macro tryhealpulse battler:req, ptr:req + various \battler, VARIOUS_TRY_HEAL_PULSE + .4byte \ptr + .endm + + .macro tryquash ptr:req + various BS_ATTACKER, VARIOUS_TRY_QUASH + .4byte \ptr + .endm + + .macro tryafteryou ptr:req + various BS_ATTACKER, VARIOUS_AFTER_YOU + .4byte \ptr + .endm + + .macro trybestow ptr:req + various BS_ATTACKER, VARIOUS_BESTOW + .4byte \ptr + .endm + + .macro invertstatstages battler:req + various \battler, VARIOUS_INVERT_STAT_STAGES + .endm + + .macro setterrain ptr:req + various BS_ATTACKER, VARIOUS_SET_TERRAIN + .4byte \ptr + .endm + + .macro trymefirst ptr:req + various BS_ATTACKER, VARIOUS_TRY_ME_FIRST + .4byte \ptr + .endm + + .macro jumpifbattleend ptr:req + various BS_ATTACKER, VARIOUS_JUMP_IF_BATTLE_END + .4byte \ptr + .endm + + .macro tryelectrify ptr:req + various BS_ATTACKER, VARIOUS_TRY_ELECTRIFY + .4byte \ptr + .endm + + .macro tryreflecttype ptr:req + various BS_ATTACKER, VARIOUS_TRY_REFLECT_TYPE + .4byte \ptr + .endm + + .macro trysoak ptr:req + various BS_ATTACKER, VARIOUS_TRY_SOAK + .4byte \ptr + .endm + + .macro handlemegaevo battler:req, case:req + various \battler, VARIOUS_HANDLE_MEGA_EVO + .byte \case + .endm + + .macro handleformchange battler:req, case:req + various \battler, VARIOUS_HANDLE_FORM_CHANGE + .byte \case + .endm + + .macro jumpifcantuselastresort battler:req, ptr:req + various \battler, VARIOUS_TRY_LAST_RESORT + .4byte \ptr + .endm + + .macro argumentstatuseffect + various BS_ATTACKER, VARIOUS_ARGUMENT_STATUS_EFFECT + .endm + + .macro tryhitswitchtarget ptr:req + various BS_ATTACKER, VARIOUS_TRY_HIT_SWITCH_TARGET + .4byte \ptr + .endm + + .macro tryautotomize battler:req, ptr:req + various \battler, VARIOUS_TRY_AUTOTOMIZE + .4byte \ptr + .endm + + .macro jumpifcantusesynchronoise ptr:req + various BS_ATTACKER, VARIOUS_TRY_SYNCHRONOISE + .4byte \ptr + .endm + + .macro trycopycat ptr:req + various BS_ATTACKER, VARIOUS_TRY_COPYCAT + .4byte \ptr + .endm + + .macro showabilitypopup battler:req + various \battler, VARIOUS_ABILITY_POPUP + .endm + + .macro defogclear battler:req, clear:req, ptr:req + various \battler, VARIOUS_DEFOG + .byte \clear + .4byte \ptr + .endm + + .macro jumpiftargetally ptr:req + various BS_ATTACKER, VARIOUS_JUMP_IF_TARGET_ALLY + .4byte \ptr + .endm + + .macro trypsychoshift ptr:req + various BS_ATTACKER, VARIOUS_PSYCHO_SHIFT + .4byte \ptr + .endm + + .macro curestatus battler:req + various \battler, VARIOUS_CURE_STATUS + .endm + + .macro powertrick battler:req + various \battler, VARIOUS_POWER_TRICK + .endm + + .macro argumenttomoveeffect + various BS_ATTACKER, VARIOUS_ARGUMENT_TO_MOVE_EFFECT + .endm + + .macro jumpifnotgrounded battler:req, ptr:req + various \battler, VARIOUS_JUMP_IF_NOT_GROUNDED + .4byte \ptr + .endm + + .macro handletrainerslidemsg battler:req, field:req + various \battler, VARIOUS_HANDLE_TRAINER_SLIDE_MSG + .byte \field + .endm + + .macro trytrainerslidefirstdownmsg battler:req + various \battler, VARIOUS_TRY_TRAINER_SLIDE_MSG_FIRST_OFF + .endm + + .macro trytrainerslidelastonmsg battler:req + various \battler, VARIOUS_TRY_TRAINER_SLIDE_MSG_LAST_ON + .endm + + .macro setauroraveil battler:req + various \battler, VARIOUS_SET_AURORA_VEIL + .endm + + .macro trysetthirdtype battler:req, ptr:req + various \battler, VARIOUS_TRY_THIRD_TYPE + .4byte \ptr + .endm + + .macro tryaccupressure battler:req, ptr:req + various \battler, VARIOUS_ACUPRESSURE + .4byte \ptr + .endm + + .macro setpowder battler:req + various \battler, VARIOUS_SET_POWDER + .endm + + .macro spectralthiefprintstats + various BS_ATTACKER, VARIOUS_SPECTRAL_THIEF + .endm + + .macro bringdownairbornebattler battler:req + various \battler, VARIOUS_GRAVITY_ON_AIRBORNE_MONS + .endm + + .macro checkgrassyterrainheal battler:req, ptr:req + various \battler, VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS + .4byte \ptr + .endm + + .macro jumpifnotberry battler:req, ptr:req + various \battler, VARIOUS_JUMP_IF_NOT_BERRY + .4byte \ptr + .endm + + .macro jumpifroarfails ptr:req + various BS_ATTACKER, VARIOUS_JUMP_IF_ROAR_FAILS + .4byte \ptr + .endm + + .macro tryinstruct ptr:req + various BS_ATTACKER, VARIOUS_TRY_INSTRUCT + .4byte \ptr + .endm + + .macro settracedability battler:req + various \battler, VARIOUS_TRACE_ABILITY + .endm + + .macro updatenick battler:req + various \battler, VARIOUS_UPDATE_NICK + .endm + + .macro tryillusionoff battler:req + various \battler, VARIOUS_TRY_ILLUSION_OFF + .endm + + .macro spriteignore0hp val:req + various BS_ATTACKER, VARIOUS_SET_SPRITEIGNORE0HP + .byte \val + .endm + + .macro getstatvalue battler:req, statId:req + various \battler, VARIOUS_GET_STAT_VALUE + .byte \statId + .endm + + .macro jumpiffullhp battler:req, ptr:req + various \battler, VARIOUS_JUMP_IF_FULL_HP + .4byte \ptr + .endm + + .macro losetype battler:req, type:req + various \battler, VARIOUS_LOSE_TYPE + .byte \type + .endm + + .macro tryfriskmsg battler:req + various \battler, VARIOUS_TRY_FRISK + .endm + + .macro jumpifshieldsdown battler:req, ptr:req + various \battler, VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED + .4byte \ptr + .endm + + .macro trypoisontype attacker:req, target:req, ptr:req + various \attacker, VARIOUS_POISON_TYPE_IMMUNITY + .byte \target + .4byte \ptr + .endm + + .macro tryparalyzetype attacker:req, target:req, ptr:req + various \attacker, VARIOUS_PARALYZE_TYPE_IMMUNITY + .byte \target + .4byte \ptr + .endm + + .macro trysetfairylock ptr:req + various BS_ATTACKER, VARIOUS_TRY_FAIRY_LOCK + .4byte \ptr + .endm + + .macro jumpifnoally battler:req, ptr:req + various \battler, VARIOUS_JUMP_IF_NO_ALLY + .4byte \ptr + .endm + + .macro jumpifnoholdeffect battler:req, holdEffet:req, ptr:req + various \battler, VARIOUS_JUMP_IF_NO_HOLD_EFFECT + .byte \holdEffet + .4byte \ptr + .endm + + .macro infatuatewithbattler battler1:req, battler2:req + various \battler1, VARIOUS_INFATUATE_WITH_BATTLER + .byte \battler2 + .endm + + .macro setlastuseditem battler:req + various \battler, VARIOUS_SET_LAST_USED_ITEM + .endm + + .macro jumpifabsent battler:req, ptr:req + various \battler, VARIOUS_JUMP_IF_ABSENT + .4byte \ptr + .endm + @ helpful macros .macro setstatchanger stat:req, stages:req, down:req - setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7 + setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 .endm .macro setmoveeffect effect:req - setbyte cEFFECT_CHOOSER \effect + sethword sMOVE_EFFECT \effect + sethword sSAVED_MOVE_EFFECT \effect .endm .macro chosenstatus1animation battler:req, status:req @@ -1411,8 +1813,12 @@ .macro jumpifnotmove move:req, jumpptr:req jumpifhalfword CMP_NOT_EQUAL, gCurrentMove, \move, \jumpptr .endm - - .macro jumpifstatus3 battler:req, status:req, jumpptr:req + + .macro jumpifnotchosenmove move:req, jumpptr:req + jumpifhalfword CMP_NOT_EQUAL, gChosenMove, \move, \jumpptr + .endm + + .macro jumpifstatus3 battler, status:req, jumpptr:req jumpifstatus3condition \battler, \status, 0x0, \jumpptr .endm @@ -1431,3 +1837,47 @@ .macro jumpifnotbattletype flags:req, jumpptr:req jumpifword CMP_NO_COMMON_BITS, gBattleTypeFlags, \flags, \jumpptr .endm + + .macro dmg_1_8_targethp + manipulatedamage DMG_1_8_TARGET_HP + .endm + + .macro dmgtomaxattackerhp + manipulatedamage DMG_FULL_ATTACKER_HP + .endm + + .macro dmgtocurrattackerhp + manipulatedamage DMG_CURR_ATTACKER_HP + .endm + + .macro dmg_1_2_attackerhp + manipulatedamage DMG_1_2_ATTACKER_HP + .endm + + .macro jumpifflowerveil jumpptr:req + jumpifnottype BS_TARGET, TYPE_GRASS, 1f + jumpifability BS_TARGET_SIDE, ABILITY_FLOWER_VEIL, \jumpptr + 1: + .endm + + .macro setallytonexttarget jumpptr:req + jumpifbyte CMP_GREATER_THAN, gBattlerTarget, 0x1, 1f + addbyte gBattlerTarget, 0x2 + goto \jumpptr + 1: + subbyte gBattlerTarget, 0x2 + goto \jumpptr + .endm + + .macro jumpifleafguard jumpptr:req + jumpifhalfword CMP_NO_COMMON_BITS, gBattleWeather, WEATHER_SUN_ANY, 1f + jumpifability BS_TARGET, ABILITY_LEAF_GUARD, \jumpptr + 1: + .endm + + .macro jumpifsafeguard jumpptr:req + jumpifability BS_ATTACKER, ABILITY_INFILTRATOR, 1f + jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, \jumpptr + 1: + .endm + diff --git a/charmap.txt b/charmap.txt index ca4db0fc73..567e389418 100644 --- a/charmap.txt +++ b/charmap.txt @@ -400,6 +400,15 @@ B_TRAINER2_WIN_TEXT = FD 31 B_PARTNER_CLASS = FD 32 B_PARTNER_NAME = FD 33 B_BUFF3 = FD 34 +B_ATK_TRAINER_NAME = FD 35 +B_ATK_TRAINER_CLASS = FD 36 +B_ATK_TEAM1 = FD 37 +B_ATK_TEAM2 = FD 38 +B_DEF_NAME = FD 39 +B_DEF_TEAM1 = FD 3A +B_DEF_TEAM2 = FD 3B +B_ACTIVE_NAME = FD 3C +B_ACTIVE_NAME2 = FD 3D @ no Illusion check @ indicates the end of a town/city name (before " TOWN" or " CITY") NAME_END = FC 00 diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 1c7bff51c8..17238670d0 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -47,60 +47,61 @@ gBattleAI_ScriptsTable:: @ 82DBEF8 AI_CheckBadMove: if_target_is_ally AI_Ret - if_move MOVE_FISSURE, AI_CBM_CheckIfNegatesType - if_move MOVE_HORN_DRILL, AI_CBM_CheckIfNegatesType - get_how_powerful_move_is - if_equal 0, AI_CheckBadMove_CheckSoundproof +@ Check powder moves + if_move_flag FLAG_POWDER, AI_CBM_PowderMoves + goto AI_CBM_CheckIfNegatesType +AI_CBM_PowderMoves: + if_type AI_TARGET, TYPE_GRASS, Score_Minus10 + if_ability AI_TARGET, ABILITY_OVERCOAT, Score_Minus10 + get_hold_effect AI_TARGET + if_equal HOLD_EFFECT_SAFETY_GOOGLES Score_Minus10 -AI_CBM_CheckIfNegatesType: @ 82DBF92 +AI_CBM_CheckIfNegatesType: if_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10 + get_ability AI_USER + if_equal ABILITY_MOLD_BREAKER, AI_CheckBadMove_CheckEffect + if_equal ABILITY_TERAVOLT, AI_CheckBadMove_CheckEffect + if_equal ABILITY_TURBOBLAZE, AI_CheckBadMove_CheckEffect get_ability AI_TARGET if_equal ABILITY_VOLT_ABSORB, CheckIfVoltAbsorbCancelsElectric + if_equal ABILITY_LIGHTNING_ROD, CheckIfVoltAbsorbCancelsElectric + if_equal ABILITY_MOTOR_DRIVE, CheckIfVoltAbsorbCancelsElectric if_equal ABILITY_WATER_ABSORB, CheckIfWaterAbsorbCancelsWater + if_equal ABILITY_STORM_DRAIN, CheckIfWaterAbsorbCancelsWater + if_equal ABILITY_DRY_SKIN, CheckIfWaterAbsorbCancelsWater if_equal ABILITY_FLASH_FIRE, CheckIfFlashFireCancelsFire if_equal ABILITY_WONDER_GUARD, CheckIfWonderGuardCancelsMove if_equal ABILITY_LEVITATE, CheckIfLevitateCancelsGroundMove - goto AI_CheckBadMove_CheckSoundproof_ + if_equal ABILITY_SOUNDPROOF, CheckIfSoundproofCancelsMove + goto AI_CheckBadMove_CheckEffect + +CheckIfSoundproofCancelsMove: + if_move_flag FLAG_SOUND, Score_Minus10 + goto AI_CheckBadMove_CheckEffect CheckIfVoltAbsorbCancelsElectric: @ 82DBFBD get_curr_move_type - if_equal_ TYPE_ELECTRIC, Score_Minus12 - goto AI_CheckBadMove_CheckSoundproof_ + if_equal TYPE_ELECTRIC, Score_Minus12 + goto AI_CheckBadMove_CheckEffect CheckIfWaterAbsorbCancelsWater: @ 82DBFCA get_curr_move_type - if_equal_ TYPE_WATER, Score_Minus12 - goto AI_CheckBadMove_CheckSoundproof_ + if_equal TYPE_WATER, Score_Minus12 + goto AI_CheckBadMove_CheckEffect CheckIfFlashFireCancelsFire: @ 82DBFD7 get_curr_move_type - if_equal_ TYPE_FIRE, Score_Minus12 - goto AI_CheckBadMove_CheckSoundproof_ + if_equal TYPE_FIRE, Score_Minus12 + goto AI_CheckBadMove_CheckEffect CheckIfWonderGuardCancelsMove: @ 82DBFE4 - if_type_effectiveness AI_EFFECTIVENESS_x2, AI_CheckBadMove_CheckSoundproof_ + if_type_effectiveness AI_EFFECTIVENESS_x2, AI_CheckBadMove_CheckEffect + if_type_effectiveness AI_EFFECTIVENESS_x4, AI_CheckBadMove_CheckEffect goto Score_Minus10 CheckIfLevitateCancelsGroundMove: @ 82DBFEF get_curr_move_type - if_equal_ TYPE_GROUND, Score_Minus10 - -AI_CheckBadMove_CheckSoundproof_: @ 82DBFF7 - get_how_powerful_move_is - if_equal 0, AI_CheckBadMove_CheckSoundproof - -AI_CheckBadMove_CheckSoundproof: @ 82DBFFE - get_ability AI_TARGET - if_not_equal ABILITY_SOUNDPROOF, AI_CheckBadMove_CheckEffect - if_move MOVE_GROWL, Score_Minus10 - if_move MOVE_ROAR, Score_Minus10 - if_move MOVE_SING, Score_Minus10 - if_move MOVE_SUPERSONIC, Score_Minus10 - if_move MOVE_SCREECH, Score_Minus10 - if_move MOVE_SNORE, Score_Minus10 - if_move MOVE_UPROAR, Score_Minus10 - if_move MOVE_METAL_SOUND, Score_Minus10 - if_move MOVE_GRASS_WHISTLE, Score_Minus10 + if_equal TYPE_GROUND, Score_Minus10 AI_CheckBadMove_CheckEffect: @ 82DC045 if_effect EFFECT_SLEEP, AI_CBM_Sleep @@ -126,7 +127,6 @@ AI_CheckBadMove_CheckEffect: @ 82DC045 if_effect EFFECT_TOXIC, AI_CBM_Toxic if_effect EFFECT_LIGHT_SCREEN, AI_CBM_LightScreen if_effect EFFECT_OHKO, AI_CBM_OneHitKO - if_effect EFFECT_RAZOR_WIND, AI_CBM_HighRiskForDamage if_effect EFFECT_SUPER_FANG, AI_CBM_HighRiskForDamage if_effect EFFECT_MIST, AI_CBM_Mist if_effect EFFECT_FOCUS_ENERGY, AI_CBM_FocusEnergy @@ -169,6 +169,7 @@ AI_CheckBadMove_CheckEffect: @ 82DC045 if_effect EFFECT_SANDSTORM, AI_CBM_Sandstorm if_effect EFFECT_SWAGGER, AI_CBM_Confuse if_effect EFFECT_ATTRACT, AI_CBM_Attract + if_effect EFFECT_CAPTIVATE, AI_CBM_Captivate if_effect EFFECT_RETURN, AI_CBM_HighRiskForDamage if_effect EFFECT_PRESENT, AI_CBM_HighRiskForDamage if_effect EFFECT_FRUSTRATION, AI_CBM_HighRiskForDamage @@ -212,8 +213,322 @@ AI_CheckBadMove_CheckEffect: @ 82DC045 if_effect EFFECT_WATER_SPORT, AI_CBM_WaterSport if_effect EFFECT_CALM_MIND, AI_CBM_CalmMind if_effect EFFECT_DRAGON_DANCE, AI_CBM_DragonDance + if_effect EFFECT_STICKY_WEB, AI_CBM_StickyWeb + if_effect EFFECT_STEALTH_ROCK, AI_CBM_StealthRock + if_effect EFFECT_TOXIC_SPIKES, AI_CBM_ToxicSpikes + if_effect EFFECT_AQUA_RING, AI_CBM_AquaRing + if_effect EFFECT_GRAVITY, AI_CBM_Gravity + if_effect EFFECT_EMBARGO, AI_CBM_Embargo + if_effect EFFECT_LUCKY_CHANT, AI_CBM_LuckyChant + if_effect EFFECT_HEAL_PULSE, Score_Minus5 + if_effect EFFECT_QUASH, AI_CBM_Quash + if_effect EFFECT_GASTRO_ACID, AI_CBM_GastroAcid + if_effect EFFECT_HEAL_BLOCK, AI_CBM_HealBlock + if_effect EFFECT_WORRY_SEED, AI_CBM_WorrySeed + if_effect EFFECT_MIRACLE_EYE, AI_CBM_MiracleEye + if_effect EFFECT_MAGNET_RISE, AI_CBM_MagnetRise + if_effect EFFECT_TELEKINESIS, AI_CBM_Telekinesis + if_effect EFFECT_MISTY_TERRAIN, AI_CBM_MistyTerrain + if_effect EFFECT_GRASSY_TERRAIN, AI_CBM_GrassyTerrain + if_effect EFFECT_ELECTRIC_TERRAIN, AI_CBM_ElectricTerrain + if_effect EFFECT_PSYCHIC_TERRAIN, AI_CBM_PsychicTerrain + if_effect EFFECT_QUIVER_DANCE, AI_CBM_QuiverDance + if_effect EFFECT_COIL, AI_CBM_Coil + if_effect EFFECT_TAILWIND, AI_CBM_Tailwind + if_effect EFFECT_SIMPLE_BEAM, AI_CBM_SimpleBeam + if_effect EFFECT_NATURAL_GIFT, AI_CBM_NaturalGift + if_effect EFFECT_FLING, AI_CBM_Fling + if_effect EFFECT_ATTACK_ACCURACY_UP, AI_CBM_AtkAccUp + if_effect EFFECT_ATTACK_SPATK_UP, AI_CBM_AtkSpAtkUp + if_effect EFFECT_GROWTH, AI_CBM_AtkSpAtkUp + if_effect EFFECT_AROMATIC_MIST, AI_CBM_AromaticMist + if_effect EFFECT_ACUPRESSURE, AI_CBM_Acupressure + if_effect EFFECT_BESTOW, AI_CBM_Bestow + if_effect EFFECT_PSYCHO_SHIFT, AI_CBM_PsychicShift + if_effect EFFECT_DEFOG, AI_CBM_Defog + if_effect EFFECT_SYNCHRONOISE, AI_CBM_Synchronoise + if_effect EFFECT_AUTOTOMIZE, AI_CBM_SpeedUp + if_effect EFFECT_TOXIC_THREAD, AI_CBM_ToxicThread + if_effect EFFECT_VENOM_DRENCH, AI_CBM_VenomDrench + if_effect EFFECT_DEFENSE_UP_3, AI_CBM_DefenseUp + if_effect EFFECT_SHIFT_GEAR, AI_CBM_DragonDance + if_effect EFFECT_NOBLE_ROAR, AI_CBM_NobleRoar + if_effect EFFECT_SHELL_SMASH, AI_CBM_ShellSmash + if_effect EFFECT_LAST_RESORT, AI_CBM_LastResort + if_effect EFFECT_BELCH, AI_CBM_Belch + if_effect EFFECT_DO_NOTHING, Score_Minus8 + if_effect EFFECT_POWDER, AI_CBM_Powder + if_effect EFFECT_PROTECT, AI_CBM_Protect + if_effect EFFECT_TAUNT, AI_CBM_Taunt + if_effect EFFECT_HEAL_BELL, AI_CBM_HealBell + if_effect EFFECT_FOLLOW_ME, AI_CBM_FollowMe + if_effect EFFECT_GEOMANCY, AI_CBM_QuiverDance + if_effect EFFECT_FAIRY_LOCK, AI_CBM_FairyLock + if_effect EFFECT_ALLY_SWITCH, AI_CBM_HelpingHand + if_effect EFFECT_TRICK_ROOM, AI_CBM_TrickRoom + if_effect EFFECT_WONDER_ROOM, AI_CBM_WonderRoom + if_effect EFFECT_MAGIC_ROOM, AI_CBM_MagicRoom + if_effect EFFECT_SOAK, AI_CBM_Soak + if_effect EFFECT_LOCK_ON, AI_CBM_LockOn end + +AI_CBM_LockOn: + if_status3 AI_TARGET, STATUS3_ALWAYS_HITS, Score_Minus10 + if_ability AI_TARGET, ABILITY_NO_GUARD, Score_Minus10 + if_ability AI_USER, ABILITY_NO_GUARD, Score_Minus10 + end + +AI_CBM_Soak: + if_type AI_TARGET, TYPE_WATER, Score_Minus10 + end + +AI_CBM_TrickRoom: + if_field_status STATUS_FIELD_TRICK_ROOM, Score_Minus10 + end + +AI_CBM_WonderRoom: + if_field_status STATUS_FIELD_WONDER_ROOM, Score_Minus10 + end + +AI_CBM_MagicRoom: + if_field_status STATUS_FIELD_MAGIC_ROOM, Score_Minus10 + end + +AI_CBM_FairyLock: + if_field_status STATUS_FIELD_FAIRY_LOCK, Score_Minus10 + if_status2 AI_TARGET, STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED, Score_Minus10 + end + +AI_CBM_Geomancy: + call AI_CBM_QuiverDance + end + +AI_CBM_FollowMe: + if_not_double_battle Score_Minus10 + if_battler_absent AI_USER_PARTNER, Score_Minus10 + end + +AI_CBM_HealBell: + if_status AI_TARGET, STATUS1_ANY, AI_CBM_HealBell_End + if_status_in_party AI_TARGET, STATUS1_ANY, AI_CBM_HealBell_End + score -5 +AI_CBM_HealBell_End: + end + +AI_CBM_Taunt: + if_target_taunted Score_Minus10 + end + +AI_CBM_Protect: + get_protect_count AI_USER + if_more_than 2, Score_Minus10 + if_status AI_TARGET, STATUS1_SLEEP | STATUS1_FREEZE, Score_Minus8 + end + +AI_CBM_Powder: + if_type AI_TARGET, TYPE_FIRE, AI_Ret + if_has_move_with_type AI_TARGET, TYPE_FIRE, AI_Ret + score -5 + end + +AI_CBM_Belch: + if_cant_use_belch AI_USER, Score_Minus10 + end + +AI_CBM_LastResort: + if_cant_use_last_resort AI_USER, Score_Minus10 + end + +AI_CBM_ShellSmash: + if_ability AI_USER, ABILITY_CONTRARY, AI_CBM_ShellSmashContrary + if_stat_level_not_equal AI_USER, STAT_SPATK, 12, AI_Ret + if_stat_level_not_equal AI_USER, STAT_SPEED, 12, AI_Ret + if_stat_level_equal AI_USER, STAT_ATK, 12, Score_Minus10 + end +AI_CBM_ShellSmashContrary: + if_stat_level_not_equal AI_USER, STAT_DEF, 12, AI_Ret + if_stat_level_equal AI_USER, STAT_SPDEF, 12, Score_Minus10 + end + +AI_CBM_NobleRoar: + if_stat_level_not_equal AI_TARGET, STAT_SPATK, 12, AI_Ret + if_stat_level_equal AI_TARGET, STAT_ATK, 12, Score_Minus10 + end + +AI_CBM_VenomDrench: + if_not_status AI_TARGET, STATUS1_PSN_ANY, Score_Minus10 + if_stat_level_not_equal AI_TARGET, STAT_SPEED, 12, AI_Ret + if_stat_level_not_equal AI_TARGET, STAT_SPATK, 12, AI_Ret + if_stat_level_equal AI_TARGET, STAT_ATK, 12, Score_Minus10 + end + +AI_CBM_ToxicThread: + if_stat_level_not_equal AI_TARGET, STAT_SPEED, 12, AI_Ret + goto AI_CBM_Toxic + +AI_CBM_Synchronoise: + if_share_type AI_USER, AI_TARGET AI_Ret + goto Score_Minus10 + +AI_CBM_Defog: + if_side_affecting AI_USER, SIDE_STATUS_SPIKES | SIDE_STATUS_STEALTH_ROCK | SIDE_STATUS_TOXIC_SPIKES | SIDE_STATUS_STICKY_WEB, AI_Ret + goto AI_CBM_EvasionDown + +AI_CBM_PsychicShift: + if_not_status AI_USER, STATUS1_ANY, Score_Minus10 + if_status AI_TARGET, STATUS1_ANY, Score_Minus10 + if_status AI_USER, STATUS1_PARALYSIS, AI_CBM_Paralyze + if_status AI_USER, STATUS1_PSN_ANY, AI_CBM_Toxic + if_status AI_USER, STATUS1_BURN, AI_CBM_WillOWisp + if_status AI_USER, STATUS1_SLEEP, AI_CBM_Sleep + end + +AI_CBM_Bestow: + if_holds_no_item AI_USER, Score_Minus10 + end + +AI_CBM_Acupressure: + if_double_battle AI_Ret + if_stat_level_not_equal AI_USER, STAT_ATK, 12, AI_Ret + if_stat_level_not_equal AI_USER, STAT_DEF, 12, AI_Ret + if_stat_level_not_equal AI_USER, STAT_SPATK, 12, AI_Ret + if_stat_level_not_equal AI_USER, STAT_SPDEF, 12, AI_Ret + if_stat_level_not_equal AI_USER, STAT_SPEED, 12, AI_Ret + if_stat_level_not_equal AI_USER, STAT_ACC, 12, AI_Ret + if_stat_level_equal AI_USER, STAT_EVASION, 12, Score_Minus10 + end + +AI_CBM_AromaticMist: + if_target_is_ally AI_Ret + goto Score_Minus10 + +AI_CBM_AtkAccUp: + if_stat_level_not_equal AI_USER, STAT_ATK, 12, AI_Ret + if_stat_level_equal AI_USER, STAT_ACC, 12, Score_Minus10 + end + +AI_CBM_AtkSpAtkUp: + if_stat_level_not_equal AI_USER, STAT_ATK, 12, AI_Ret + if_stat_level_equal AI_USER, STAT_SPATK, 12, Score_Minus10 + end + +AI_CBM_Fling: + if_holds_no_item AI_USER, Score_Minus10 + if_ability AI_USER, ABILITY_KLUTZ, Score_Minus10 + if_status3 AI_USER, STATUS3_EMBARGO, Score_Minus10 + if_field_status STATUS_FIELD_MAGIC_ROOM, Score_Minus10 + end + +AI_CBM_NaturalGift: + if_doesnt_hold_berry AI_USER, Score_Minus10 + if_ability AI_USER, ABILITY_KLUTZ, Score_Minus10 + if_status3 AI_USER, STATUS3_EMBARGO, Score_Minus10 + if_field_status STATUS_FIELD_MAGIC_ROOM, Score_Minus10 + end + +AI_CBM_SimpleBeam: + if_ability AI_TARGET, ABILITY_SIMPLE, Score_Minus10 + end + +AI_CBM_Tailwind: + if_side_affecting AI_USER, SIDE_STATUS_TAILWIND, Score_Minus10 + end + +AI_CBM_QuiverDance: + if_stat_level_not_equal AI_USER, STAT_SPATK, 12, AI_Ret + if_stat_level_not_equal AI_USER, STAT_SPDEF, 12, AI_Ret + if_stat_level_equal AI_USER, STAT_SPEED, 12, Score_Minus10 + end + +AI_CBM_Coil: + if_stat_level_not_equal AI_USER, STAT_ATK, 12, AI_Ret + if_stat_level_not_equal AI_USER, STAT_DEF, 12, AI_Ret + if_stat_level_equal AI_USER, STAT_ACC, 12, Score_Minus10 + end + +AI_CBM_MistyTerrain: + if_field_status STATUS_FIELD_MISTY_TERRAIN, Score_Minus10 + end + +AI_CBM_GrassyTerrain: + if_field_status STATUS_FIELD_GRASSY_TERRAIN, Score_Minus10 + end + +AI_CBM_ElectricTerrain: + if_field_status STATUS_FIELD_ELECTRIC_TERRAIN, Score_Minus10 + end + +AI_CBM_PsychicTerrain: + if_field_status STATUS_FIELD_PSYCHIC_TERRAIN, Score_Minus10 + end + +AI_CBM_Quash: + if_not_double_battle Score_Minus10 + end + +AI_CBM_Telekinesis: + if_status3 AI_TARGET, STATUS3_TELEKINESIS, Score_Minus10 + end + +AI_CBM_MagnetRise: + if_status3 AI_USER, STATUS3_MAGNET_RISE, Score_Minus10 + end + +AI_CBM_MiracleEye: + if_status3 AI_TARGET, STATUS3_MIRACLE_EYED, Score_Minus10 + if_status2 AI_TARGET, STATUS2_FORESIGHT, Score_Minus10 + end + +AI_CBM_WorrySeed: + get_ability AI_TARGET + if_equal ABILITY_INSOMNIA, Score_Minus10 + if_equal ABILITY_VITAL_SPIRIT, Score_Minus10 + end + +AI_CBM_HealBlock: + if_status3 AI_TARGET, STATUS3_HEAL_BLOCK, Score_Minus10 + end + +AI_CBM_GastroAcid: + if_status3 AI_TARGET, STATUS3_GASTRO_ACID, Score_Minus10 + end + +AI_CBM_AquaRing: + if_status3 AI_USER, STATUS3_AQUA_RING, Score_Minus10 + end + +AI_CBM_LuckyChant: + if_side_affecting AI_USER, SIDE_STATUS_LUCKY_CHANT, Score_Minus10 + end + +AI_CBM_Embargo: + if_status3 AI_TARGET, STATUS3_EMBARGO, Score_Minus10 + end + +AI_CBM_Gravity: + if_field_status STATUS_FIELD_GRAVITY, Score_Minus10 + end + +@ Don't use hazards if target side has no mons to switch +AI_CBM_Hazards: + count_usable_party_mons AI_TARGET + if_equal 0, Score_Minus10 + end + +AI_CBM_ToxicSpikes: + if_not_side_affecting AI_TARGET, SIDE_STATUS_TOXIC_SPIKES, AI_Ret + get_hazards_count AI_TARGET, EFFECT_TOXIC_SPIKES + if_equal 2, Score_Minus10 + goto AI_CBM_Hazards + +AI_CBM_StealthRock: + if_side_affecting AI_TARGET, SIDE_STATUS_STEALTH_ROCK, Score_Minus10 + goto AI_CBM_Hazards +AI_CBM_StickyWeb: + if_side_affecting AI_TARGET, SIDE_STATUS_STICKY_WEB, Score_Minus10 + goto AI_CBM_Hazards + AI_CBM_Sleep: @ 82DC2D4 get_ability AI_TARGET if_equal ABILITY_INSOMNIA, Score_Minus10 @@ -249,7 +564,10 @@ AI_CBM_BellyDrum: @ 82DC341 if_hp_less_than AI_USER, 51, Score_Minus10 AI_CBM_AttackUp: @ 82DC348 - if_stat_level_equal AI_USER, STAT_ATK, MAX_STAT_STAGE, Score_Minus10 + if_stat_level_equal AI_USER, STAT_ATK, 12, Score_Minus10 + @ Do not raise attack if has no physical moves + if_has_move_with_effect AI_USER, EFFECT_BATON_PASS, AI_Ret + if_has_no_physical_move AI_USER, Score_Minus10 end AI_CBM_DefenseUp: @ 82DC351 @@ -261,7 +579,10 @@ AI_CBM_SpeedUp: @ 82DC35A end AI_CBM_SpAtkUp: @ 82DC363 - if_stat_level_equal AI_USER, STAT_SPATK, MAX_STAT_STAGE, Score_Minus10 + if_stat_level_equal AI_USER, STAT_SPATK, 12, Score_Minus10 + @ Do not raise sp. attack if has no special moves + if_has_move_with_effect AI_USER, EFFECT_BATON_PASS, AI_Ret + if_has_no_special_move AI_USER, Score_Minus10 end AI_CBM_SpDefUp: @ 82DC36C @@ -283,7 +604,9 @@ AI_CBM_AttackDown: @ 82DC387 goto CheckIfAbilityBlocksStatChange AI_CBM_DefenseDown: @ 82DC39C - if_stat_level_equal AI_TARGET, STAT_DEF, MIN_STAT_STAGE, Score_Minus10 + if_stat_level_equal AI_TARGET, STAT_DEF, 0, Score_Minus10 + get_ability AI_TARGET + if_equal ABILITY_BIG_PECKS, Score_Minus10 goto CheckIfAbilityBlocksStatChange AI_CBM_SpeedDown: @ 82DC3A9 @@ -350,6 +673,7 @@ AI_CBM_Toxic: @ 82DC48C if_equal TYPE_POISON, Score_Minus10 get_ability AI_TARGET if_equal ABILITY_IMMUNITY, Score_Minus10 + if_equal ABILITY_TOXIC_BOOST, Score_Minus10 if_status AI_TARGET, STATUS1_ANY, Score_Minus10 if_side_affecting AI_TARGET, SIDE_STATUS_SAFEGUARD, Score_Minus10 end @@ -413,18 +737,17 @@ AI_CBM_Substitute: @ 82DC568 AI_CBM_LeechSeed: @ 82DC57A if_status3 AI_TARGET, STATUS3_LEECHSEED, Score_Minus10 - get_target_type1 - if_equal TYPE_GRASS, Score_Minus10 - get_target_type2 - if_equal TYPE_GRASS, Score_Minus10 + if_type AI_TARGET, TYPE_GRASS, Score_Minus10 end AI_CBM_Disable: @ 82DC595 if_any_move_disabled AI_TARGET, Score_Minus8 + if_no_move_used AI_TARGET, Score_Minus8 end AI_CBM_Encore: @ 82DC59D if_any_move_encored AI_TARGET, Score_Minus8 + if_no_move_used AI_TARGET, Score_Minus8 end AI_CBM_DamageDuringSleep: @ 82DC5A5 @@ -441,11 +764,15 @@ AI_CBM_Curse: @ 82DC5BB end AI_CBM_Spikes: @ 82DC5CC - if_side_affecting AI_TARGET, SIDE_STATUS_SPIKES, Score_Minus10 + call AI_CBM_Hazards + if_not_side_affecting AI_TARGET, SIDE_STATUS_SPIKES, AI_Ret + get_hazards_count AI_TARGET, EFFECT_SPIKES + if_equal 3, Score_Minus10 end AI_CBM_Foresight: @ 82DC5D7 if_status2 AI_TARGET, STATUS2_FORESIGHT, Score_Minus10 + if_status3 AI_TARGET, STATUS3_MIRACLE_EYED, Score_Minus10 end AI_CBM_PerishSong: @ 82DC5E2 @@ -456,26 +783,33 @@ AI_CBM_Sandstorm: @ 82DC5ED get_weather if_equal AI_WEATHER_SANDSTORM, Score_Minus8 end - -AI_CBM_Attract: @ 82DC5F5 - if_status2 AI_TARGET, STATUS2_INFATUATION, Score_Minus10 + +AI_IsOppositeGender: get_ability AI_TARGET if_equal ABILITY_OBLIVIOUS, Score_Minus10 get_gender AI_USER - if_equal 0, AI_CBM_Attract_CheckIfTargetIsFemale - if_equal 254, AI_CBM_Attract_CheckIfTargetIsMale + if_equal 0, AI_IsOppositeGenderFemale + if_equal 254, AI_IsOppositeGenderMale goto Score_Minus10 - -AI_CBM_Attract_CheckIfTargetIsFemale: @ 82DC61A +AI_IsOppositeGenderFemale: @ 82DC61A get_gender AI_TARGET if_equal 254, AI_CBM_Attract_End goto Score_Minus10 - -AI_CBM_Attract_CheckIfTargetIsMale: @ 82DC627 +AI_IsOppositeGenderMale: @ 82DC627 get_gender AI_TARGET if_equal 0, AI_CBM_Attract_End goto Score_Minus10 + end + +AI_CBM_Captivate: + call AI_IsOppositeGender + goto AI_CBM_SpAtkDown +AI_CBM_Attract: @ 82DC5F5 + if_status2 AI_TARGET, STATUS2_INFATUATION, Score_Minus10 + call AI_IsOppositeGender + end + AI_CBM_Attract_End: @ 82DC634 end @@ -536,15 +870,16 @@ AI_CBM_Torment: @ 82DC6A9 AI_CBM_WillOWisp: @ 82DC6B4 get_ability AI_TARGET if_equal ABILITY_WATER_VEIL, Score_Minus10 + if_equal ABILITY_FLARE_BOOST, Score_Minus10 + if_equal ABILITY_FLASH_FIRE, Score_Minus10 if_status AI_TARGET, STATUS1_ANY, Score_Minus10 - if_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10 - if_type_effectiveness AI_EFFECTIVENESS_x0_5, Score_Minus10 - if_type_effectiveness AI_EFFECTIVENESS_x0_25, Score_Minus10 + if_type AI_TARGET, TYPE_FIRE, Score_Minus10 if_side_affecting AI_TARGET, SIDE_STATUS_SAFEGUARD, Score_Minus10 end AI_CBM_HelpingHand: @ 82DC6E3 if_not_double_battle Score_Minus10 + if_battler_absent AI_USER_PARTNER, Score_Minus10 end AI_CBM_TrickAndKnockOff: @ 82DC6EB @@ -570,7 +905,7 @@ AI_CBM_Refresh: @ 82DC713 end AI_CBM_MudSport: @ 82DC71E - if_status3 AI_USER, STATUS3_MUDSPORT, Score_Minus10 + if_field_status STATUS_FIELD_MUDSPORT, Score_Minus10 end AI_CBM_Tickle: @ 82DC729 @@ -589,7 +924,7 @@ AI_CBM_BulkUp: @ 82DC74B end AI_CBM_WaterSport: @ 82DC75C - if_status3 AI_USER, STATUS3_WATERSPORT, Score_Minus10 + if_field_status STATUS_FIELD_WATERSPORT, Score_Minus10 end AI_CBM_CalmMind: @ 82DC767 @@ -653,9 +988,61 @@ Score_Plus5: Score_Plus10: score +10 end + +@ omae wa mou shindeiru +@ Basically a scenario where the players mon is faster, able to hit and able to OHKO +@ In which, it would be best to use a priority move to deal any damage +AI_CheckIfAlreadyDead: + if_status2 AI_TARGET, STATUS2_RECHARGE | STATUS2_BIDE, AI_Ret + if_ai_can_go_down AI_CheckIfAlreadyDeadPriorities + end +AI_CheckIfAlreadyDeadPriorities: + if_target_faster Score_Minus1 + if_random_less_than 126, AI_Ret + score +1 + end + +@ The purpose is to use a move effect that hits the hardest or similar +AI_CV_DmgMove: + get_considered_move_power + if_equal 0, AI_Ret + get_how_powerful_move_is + if_equal MOVE_POWER_WEAK, Score_Minus1 + end + +@ If move deals shit damage, and there are other mons to switch in, use support moves instead +AI_WeakDmg: + get_considered_move_power + if_equal 0, AI_Ret + if_has_no_move_with_split AI_USER, SPLIT_STATUS, AI_Ret + get_curr_dmg_hp_percent + if_more_than 30, AI_Ret + if_more_than 20, Score_Minus1 + get_how_powerful_move_is + if_equal MOVE_POWER_BEST, Score_Minus2 + score -3 + end + +AI_DiscourageMagicGuard: + if_no_ability AI_TARGET, ABILITY_MAGIC_GUARD, AI_DiscourageMagicGuardEnd + if_effect EFFECT_POISON, Score_Minus5 + if_effect EFFECT_WILL_O_WISP, Score_Minus5 + if_effect EFFECT_TOXIC, Score_Minus5 + if_effect EFFECT_LEECH_SEED, Score_Minus5 + if_no_type AI_TARGET, TYPE_GHOST, AI_DiscourageMagicGuardEnd + if_effect EFFECT_CURSE, Score_Minus5 +AI_DiscourageMagicGuardEnd: + end AI_CheckViability: if_target_is_ally AI_Ret + call_if_always_hit AI_CV_AlwaysHit + call_if_move_flag FLAG_HIGH_CRIT, AI_CV_HighCrit + call AI_CheckIfAlreadyDead + call AI_CV_DmgMove + call AI_WeakDmg + call AI_DiscourageMagicGuard + if_effect EFFECT_HIT, AI_CV_Hit if_effect EFFECT_SLEEP, AI_CV_Sleep if_effect EFFECT_ABSORB, AI_CV_Absorb if_effect EFFECT_EXPLOSION, AI_CV_SelfKO @@ -668,7 +1055,6 @@ AI_CheckViability: if_effect EFFECT_SPECIAL_DEFENSE_UP, AI_CV_SpDefUp if_effect EFFECT_ACCURACY_UP, AI_CV_AccuracyUp if_effect EFFECT_EVASION_UP, AI_CV_EvasionUp - if_effect EFFECT_ALWAYS_HIT, AI_CV_AlwaysHit if_effect EFFECT_ATTACK_DOWN, AI_CV_AttackDown if_effect EFFECT_DEFENSE_DOWN, AI_CV_DefenseDown if_effect EFFECT_SPEED_DOWN, AI_CV_SpeedDown @@ -681,15 +1067,17 @@ AI_CheckViability: if_effect EFFECT_ROAR, AI_CV_Roar if_effect EFFECT_CONVERSION, AI_CV_Conversion if_effect EFFECT_RESTORE_HP, AI_CV_Heal + if_effect EFFECT_SOFTBOILED, AI_CV_Heal + if_effect EFFECT_SWALLOW, AI_CV_Heal + if_effect EFFECT_ROOST, AI_CV_Heal if_effect EFFECT_TOXIC, AI_CV_Toxic if_effect EFFECT_LIGHT_SCREEN, AI_CV_LightScreen if_effect EFFECT_REST, AI_CV_Rest if_effect EFFECT_OHKO, AI_CV_OneHitKO - if_effect EFFECT_RAZOR_WIND, AI_CV_ChargeUpMove if_effect EFFECT_SUPER_FANG, AI_CV_SuperFang if_effect EFFECT_TRAP, AI_CV_Trap - if_effect EFFECT_HIGH_CRITICAL, AI_CV_HighCrit if_effect EFFECT_CONFUSE, AI_CV_Confuse + if_effect EFFECT_FOCUS_ENERGY, AI_CV_FocusEnergy if_effect EFFECT_ATTACK_UP_2, AI_CV_AttackUp if_effect EFFECT_DEFENSE_UP_2, AI_CV_DefenseUp if_effect EFFECT_SPEED_UP_2, AI_CV_SpeedUp @@ -705,22 +1093,24 @@ AI_CheckViability: if_effect EFFECT_ACCURACY_DOWN_2, AI_CV_AccuracyDown if_effect EFFECT_EVASION_DOWN_2, AI_CV_EvasionDown if_effect EFFECT_REFLECT, AI_CV_Reflect + if_effect EFFECT_AURORA_VEIL, AI_CV_AuroraVeil if_effect EFFECT_POISON, AI_CV_Poison + if_effect EFFECT_TOXIC_THREAD, AI_CV_ToxicThread if_effect EFFECT_PARALYZE, AI_CV_Paralyze if_effect EFFECT_SWAGGER, AI_CV_Swagger if_effect EFFECT_SPEED_DOWN_HIT, AI_CV_SpeedDownFromChance - if_effect EFFECT_SKY_ATTACK, AI_CV_ChargeUpMove + if_effect EFFECT_TWO_TURNS_ATTACK, AI_CV_ChargeUpMove if_effect EFFECT_VITAL_THROW, AI_CV_VitalThrow if_effect EFFECT_SUBSTITUTE, AI_CV_Substitute if_effect EFFECT_RECHARGE, AI_CV_Recharge - if_effect EFFECT_LEECH_SEED, AI_CV_Toxic + if_effect EFFECT_LEECH_SEED, AI_CV_LeechSeed if_effect EFFECT_DISABLE, AI_CV_Disable if_effect EFFECT_COUNTER, AI_CV_Counter if_effect EFFECT_ENCORE, AI_CV_Encore if_effect EFFECT_PAIN_SPLIT, AI_CV_PainSplit - if_effect EFFECT_SNORE, AI_CV_Snore if_effect EFFECT_LOCK_ON, AI_CV_LockOn if_effect EFFECT_SLEEP_TALK, AI_CV_SleepTalk + if_effect EFFECT_SNORE, AI_CV_SleepTalk if_effect EFFECT_DESTINY_BOND, AI_CV_DestinyBond if_effect EFFECT_FLAIL, AI_CV_Flail if_effect EFFECT_HEAL_BELL, AI_CV_HealBell @@ -736,6 +1126,7 @@ AI_CheckViability: if_effect EFFECT_MORNING_SUN, AI_CV_HealWeather if_effect EFFECT_SYNTHESIS, AI_CV_HealWeather if_effect EFFECT_MOONLIGHT, AI_CV_HealWeather + if_effect EFFECT_SHORE_UP, AI_CV_Heal if_effect EFFECT_RAIN_DANCE, AI_CV_RainDance if_effect EFFECT_SUNNY_DAY, AI_CV_SunnyDay if_effect EFFECT_BELLY_DRUM, AI_CV_BellyDrum @@ -743,12 +1134,13 @@ AI_CheckViability: if_effect EFFECT_MIRROR_COAT, AI_CV_MirrorCoat if_effect EFFECT_SKULL_BASH, AI_CV_ChargeUpMove if_effect EFFECT_SOLARBEAM, AI_CV_ChargeUpMove + if_effect EFFECT_GEOMANCY, AI_CV_Geomancy if_effect EFFECT_SEMI_INVULNERABLE, AI_CV_SemiInvulnerable if_effect EFFECT_SOFTBOILED, AI_CV_Heal if_effect EFFECT_FAKE_OUT, AI_CV_FakeOut if_effect EFFECT_SPIT_UP, AI_CV_SpitUp - if_effect EFFECT_SWALLOW, AI_CV_Heal - if_effect EFFECT_HAIL, AI_CV_Hail + if_effect EFFECT_HAIL, AI_CV_Sandstorm + if_effect EFFECT_SANDSTORM, AI_CV_Sandstorm if_effect EFFECT_FLATTER, AI_CV_Flatter if_effect EFFECT_MEMENTO, AI_CV_SelfKO if_effect EFFECT_FACADE, AI_CV_Facade @@ -768,16 +1160,109 @@ AI_CheckViability: if_effect EFFECT_IMPRISON, AI_CV_Imprison if_effect EFFECT_REFRESH, AI_CV_Refresh if_effect EFFECT_SNATCH, AI_CV_Snatch - if_effect EFFECT_BLAZE_KICK, AI_CV_HighCrit if_effect EFFECT_MUD_SPORT, AI_CV_MudSport if_effect EFFECT_OVERHEAT, AI_CV_Overheat if_effect EFFECT_TICKLE, AI_CV_DefenseDown if_effect EFFECT_COSMIC_POWER, AI_CV_SpDefUp if_effect EFFECT_BULK_UP, AI_CV_DefenseUp - if_effect EFFECT_POISON_TAIL, AI_CV_HighCrit if_effect EFFECT_WATER_SPORT, AI_CV_WaterSport if_effect EFFECT_CALM_MIND, AI_CV_SpDefUp if_effect EFFECT_DRAGON_DANCE, AI_CV_DragonDance + if_effect EFFECT_POWDER, AI_CV_Powder + if_effect EFFECT_MISTY_TERRAIN, AI_CV_MistyTerrain + if_effect EFFECT_GRASSY_TERRAIN, AI_CV_GrassyTerrain + if_effect EFFECT_ELECTRIC_TERRAIN, AI_CV_ElectricTerrain + if_effect EFFECT_PSYCHIC_TERRAIN, AI_CV_PsychicTerrain + if_effect EFFECT_STEALTH_ROCK, AI_CV_Hazards + if_effect EFFECT_SPIKES, AI_CV_Hazards + if_effect EFFECT_STICKY_WEB, AI_CV_Hazards + if_effect EFFECT_TOXIC_SPIKES, AI_CV_Hazards + if_effect EFFECT_PERISH_SONG, AI_CV_PerishSong + end + +AI_CV_PerishSong: + get_ability AI_USER + if_equal ABILITY_ARENA_TRAP, AI_CV_PerishSong_ArenaTrap + if_equal ABILITY_MAGNET_PULL, AI_CV_PerishSong_MagnetPull + if_equal ABILITY_SHADOW_TAG, AI_CV_PerishSong_ShadowTag +AI_CV_PerishSongCheckTrap: + if_status2 AI_TARGET, STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION, Score_Plus3 + @ If has a move that can trap, use it first, then use Perish Song + if_double_battle AI_Ret + if_has_move_with_effect AI_USER, EFFECT_TRAP, Score_Minus5 + if_has_move_with_effect AI_USER, EFFECT_MEAN_LOOK, Score_Minus5 + end +AI_CV_PerishSong_ArenaTrap: + if_grounded AI_TARGET, Score_Plus2 + goto AI_CV_PerishSongCheckTrap +AI_CV_PerishSong_MagnetPull: + if_type AI_TARGET, TYPE_STEEL, Score_Plus2 + goto AI_CV_PerishSongCheckTrap +AI_CV_PerishSong_ShadowTag: + if_no_ability AI_TARGET, ABILITY_SHADOW_TAG, Score_Plus2 + goto AI_CV_PerishSongCheckTrap + +AI_CV_Hazards: + if_ability AI_TARGET, ABILITY_MAGIC_BOUNCE, AI_CV_HzardsEnd + is_first_turn_for AI_USER + if_equal 0, AI_CV_HzardsEnd + score +2 +AI_CV_HzardsEnd: + end +AI_CV_StealthRock2: + score -2 + goto AI_CV_HzardsEnd + +AI_CV_MistyTerrain: + call AI_CV_TerrainExpander + end + +AI_CV_GrassyTerrain: + call AI_CV_TerrainExpander + end + +AI_CV_ElectricTerrain: + call AI_CV_TerrainExpander + end + +AI_CV_PsychicTerrain: + call AI_CV_TerrainExpander + end + +AI_CV_TerrainExpander: + get_hold_effect AI_USER + if_equal HOLD_EFFECT_TERRAIN_EXTENDER, Score_Plus2 + end + +AI_CV_Powder: + if_type AI_TARGET, TYPE_FIRE, AI_CV_Powder2 + if_has_move_with_type AI_TARGET, TYPE_FIRE, AI_CV_Powder2 + score -2 + end +AI_CV_Powder2: + is_first_turn_for AI_TARGET + if_equal 0, AI_CV_Powder3 + if_random_less_than 100, AI_CV_Powder3 + score +1 +AI_CV_Powder3: + if_type AI_USER, TYPE_BUG, AI_CV_Powder4 + if_type AI_USER, TYPE_GRASS, AI_CV_Powder4 + if_no_type AI_USER, TYPE_STEEL, AI_CV_Powder5 +AI_CV_Powder4: + score +1 +AI_CV_Powder5: + get_last_used_bank_move AI_USER + if_equal_u32 MOVE_POWDER, AI_CV_Powder6 + if_random_less_than 150, Score_Minus1 + if_random_less_than 200, AI_Ret + score +2 + end +AI_CV_Powder6: + if_random_less_than 136, Score_Minus2 + score +1 + end + +AI_CV_Hit: end AI_CV_Sleep: @ 82DCA92 @@ -863,6 +1348,7 @@ AI_CV_MirrorMove2: @ 82DCB58 AI_CV_MirrorMove_End: @ 82DCB6B end +.align 1 AI_CV_MirrorMove_EncouragedMovesToMirror: @ 82DCB6C .2byte MOVE_SLEEP_POWDER .2byte MOVE_LOVELY_KISS @@ -906,6 +1392,7 @@ AI_CV_MirrorMove_EncouragedMovesToMirror: @ 82DCB6C .2byte -1 AI_CV_AttackUp: @ 82DCBBC + if_physical_moves_unusable AI_USER, AI_TARGET, Score_Minus8 if_stat_level_less_than AI_USER, STAT_ATK, 9, AI_CV_AttackUp2 if_random_less_than 100, AI_CV_AttackUp3 score -1 @@ -948,8 +1435,8 @@ AI_CV_DefenseUp4: @ 82DCC28 get_move_power_from_result if_equal 0, AI_CV_DefenseUp5 get_last_used_bank_move AI_TARGET - get_move_type_from_result - if_not_in_bytes AI_CV_DefenseUp_PhysicalTypes, AI_CV_DefenseUp_ScoreDown2 + get_move_split_from_result + if_not_equal SPLIT_PHYSICAL, AI_CV_DefenseUp_ScoreDown2 if_random_less_than 60, AI_CV_DefenseUp_End AI_CV_DefenseUp5: @ 82DCC4A @@ -961,18 +1448,6 @@ AI_CV_DefenseUp_ScoreDown2: @ 82DCC50 AI_CV_DefenseUp_End: @ 82DCC52 end -AI_CV_DefenseUp_PhysicalTypes: @ 82DCC53 - .byte TYPE_NORMAL - .byte TYPE_FIGHTING - .byte TYPE_POISON - .byte TYPE_GROUND - .byte TYPE_FLYING - .byte TYPE_ROCK - .byte TYPE_BUG - .byte TYPE_GHOST - .byte TYPE_STEEL - .byte -1 - AI_CV_SpeedUp: @ 82DCC5D if_target_faster AI_CV_SpeedUp2 score -3 @@ -1028,8 +1503,8 @@ AI_CV_SpDefUp4: @ 82DCCDF get_move_power_from_result if_equal 0, AI_CV_SpDefUp5 get_last_used_bank_move AI_TARGET - get_move_type_from_result - if_in_bytes AI_CV_SpDefUp_PhysicalTypes, AI_CV_SpDefUp_ScoreDown2 + get_move_split_from_result + if_not_equal SPLIT_SPECIAL, AI_CV_SpDefUp_ScoreDown2 if_random_less_than 60, AI_CV_SpDefUp_End AI_CV_SpDefUp5: @ 82DCD01 @@ -1041,18 +1516,6 @@ AI_CV_SpDefUp_ScoreDown2: @ 82DCD07 AI_CV_SpDefUp_End: @ 82DCD09 end -AI_CV_SpDefUp_PhysicalTypes: @ 82DCD0A - .byte TYPE_NORMAL - .byte TYPE_FIGHTING - .byte TYPE_POISON - .byte TYPE_GROUND - .byte TYPE_FLYING - .byte TYPE_ROCK - .byte TYPE_BUG - .byte TYPE_GHOST - .byte TYPE_STEEL - .byte -1 - AI_CV_AccuracyUp: if_stat_level_less_than AI_USER, STAT_ACC, 9, AI_CV_AccuracyUp2 if_random_less_than 50, AI_CV_AccuracyUp2 @@ -1189,11 +1652,9 @@ AI_CV_SpeedDown: @ 82DCE81 if_target_faster AI_CV_SpeedDown2 score -3 goto AI_CV_SpeedDown_End - AI_CV_SpeedDown2: @ 82DCE8E if_random_less_than 70, AI_CV_SpeedDown_End score +2 - AI_CV_SpeedDown_End: @ 82DCE96 end @@ -1298,17 +1759,24 @@ AI_CV_AccuracyDown_End: AI_CV_EvasionDown: if_hp_less_than AI_USER, 70, AI_CV_EvasionDown2 if_stat_level_more_than AI_TARGET, STAT_EVASION, 3, AI_CV_EvasionDown3 - AI_CV_EvasionDown2: if_random_less_than 50, AI_CV_EvasionDown3 score -2 - AI_CV_EvasionDown3: - if_hp_more_than AI_TARGET, 70, AI_CV_EvasionDown_End + if_hp_more_than AI_TARGET, 70, AI_CV_EvasionDown_4 score -2 - +AI_CV_EvasionDown_4: + if_stat_level_less_than AI_USER, STAT_ACC, 6, AI_CV_EvasionDown_5 + if_stat_level_less_than AI_TARGET, STAT_EVASION, 7, AI_CV_EvasionDown_6 + if_ability AI_USER, ABILITY_NO_GUARD, AI_CV_EvasionDown_6 AI_CV_EvasionDown_End: end +AI_CV_EvasionDown_5: + score +1 + goto AI_CV_EvasionDown_End +AI_CV_EvasionDown_6: + score -2 + goto AI_CV_EvasionDown_End AI_CV_Haze: if_stat_level_more_than AI_USER, STAT_ATK, 8, AI_CV_Haze2 @@ -1425,41 +1893,46 @@ AI_CV_Heal6: AI_CV_Heal_End: end + +EncouragePsnVenoshock: + if_doesnt_have_move_with_effect AI_USER, EFFECT_VENOSHOCK, EncouragePsnVenoshockEnd + score +1 + if_random_less_than 128, EncouragePsnVenoshockEnd + score +1 +EncouragePsnVenoshockEnd: + end AI_CV_Toxic: + call EncouragePsnVenoshock +AI_CV_LeechSeed: if_user_has_no_attacking_moves AI_CV_Toxic3 if_hp_more_than AI_USER, 50, AI_CV_Toxic2 if_random_less_than 50, AI_CV_Toxic2 score -3 - AI_CV_Toxic2: if_hp_more_than AI_TARGET, 50, AI_CV_Toxic3 if_random_less_than 50, AI_CV_Toxic3 score -3 - AI_CV_Toxic3: if_has_move_with_effect AI_USER, EFFECT_SPECIAL_DEFENSE_UP, AI_CV_Toxic4 if_has_move_with_effect AI_USER, EFFECT_PROTECT, AI_CV_Toxic4 goto AI_CV_Toxic_End - AI_CV_Toxic4: if_random_less_than 60, AI_CV_Toxic_End score +2 - AI_CV_Toxic_End: end AI_CV_LightScreen: + call EncourageLightClay if_hp_less_than AI_USER, 50, AI_CV_LightScreen_ScoreDown2 get_target_type1 if_in_bytes AI_CV_LightScreen_SpecialTypeList, AI_CV_LightScreen_End get_target_type2 if_in_bytes AI_CV_LightScreen_SpecialTypeList, AI_CV_LightScreen_End if_random_less_than 50, AI_CV_LightScreen_End - AI_CV_LightScreen_ScoreDown2: score -2 - AI_CV_LightScreen_End: end @@ -1510,6 +1983,7 @@ AI_CV_Rest_End: end AI_CV_OneHitKO: + if_status3 AI_TARGET, STATUS3_ALWAYS_HITS, Score_Plus5 end AI_CV_SuperFang: @@ -1518,19 +1992,33 @@ AI_CV_SuperFang: AI_CV_SuperFang_End: end - + AI_CV_Trap: + if_status2 AI_TARGET, STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION, AI_CV_TrapEnd + if_status3 AI_TARGET, STATUS3_PERISH_SONG, AI_CV_Trap5 + if_doesnt_have_move_with_effect AI_USER, EFFECT_PERISH_SONG, AI_CV_Trap1 + score +3 +AI_CV_Trap1: if_status AI_TARGET, STATUS1_TOXIC_POISON, AI_CV_Trap2 - if_status2 AI_TARGET, STATUS2_CURSED, AI_CV_Trap2 - if_status3 AI_TARGET, STATUS3_PERISH_SONG, AI_CV_Trap2 - if_status2 AI_TARGET, STATUS2_INFATUATION, AI_CV_Trap2 - goto AI_CV_Trap_End - + if_status2 AI_TARGET, STATUS2_CURSED | STATUS2_INFATUATION, AI_CV_Trap2 + goto AI_CV_TrapItem +AI_CV_Trap5: + score +2 + goto AI_CV_TrapItem AI_CV_Trap2: - if_random_less_than 128, AI_CV_Trap_End + if_random_less_than 128, AI_CV_TrapItem score +1 - -AI_CV_Trap_End: +AI_CV_TrapItem: + get_considered_move_power + if_equal 0, AI_CV_TrapEnd + if_status2 AI_TARGET, STATUS2_WRAPPED, AI_CV_TrapEnd + get_hold_effect AI_USER + if_equal HOLD_EFFECT_GRIP_CLAW AI_CV_Trap4 + if_equal HOLD_EFFECT_BINDING_BAND AI_CV_Trap4 + goto AI_CV_TrapEnd +AI_CV_Trap4: + score +2 +AI_CV_TrapEnd: end AI_CV_HighCrit: @@ -1547,7 +2035,22 @@ AI_CV_HighCrit2: AI_CV_HighCrit_End: end +AI_CV_FocusEnergy: + if_has_move_with_flag AI_USER, FLAG_HIGH_CRIT, AI_CV_FocusEnergy2 +AI_CV_FocusEnergy3: + get_hold_effect AI_USER + if_not_equal HOLD_EFFECT_SCOPE_LENS, AI_CV_FocusEnergyEnd + score +1 +AI_CV_FocusEnergyEnd: + end +AI_CV_FocusEnergy2: + score +1 + goto AI_CV_FocusEnergy3 + AI_CV_Swagger: + if_doesnt_have_move_with_effect AI_USER, EFFECT_FOUL_PLAY, AI_CV_Swagger2 + score +1 +AI_CV_Swagger2: if_has_move AI_USER, MOVE_PSYCH_UP, AI_CV_SwaggerHasPsychUp AI_CV_Flatter: @@ -1581,18 +2084,30 @@ AI_CV_SwaggerHasPsychUp_Minus5: AI_CV_SwaggerHasPsychUp_End: end + +EncourageLightClay: + get_hold_effect AI_USER + if_not_equal HOLD_EFFECT_LIGHT_CLAY, EncourageLightClayEnd + score +1 + if_random_less_than 111, EncourageLightClayEnd + score +1 +EncourageLightClayEnd: + end + +AI_CV_AuroraVeil: + call EncourageLightClay + end AI_CV_Reflect: + call EncourageLightClay if_hp_less_than AI_USER, 50, AI_CV_Reflect_ScoreDown2 get_target_type1 if_in_bytes AI_CV_Reflect_PhysicalTypeList, AI_CV_Reflect_End get_target_type2 if_in_bytes AI_CV_Reflect_PhysicalTypeList, AI_CV_Reflect_End if_random_less_than 50, AI_CV_Reflect_End - AI_CV_Reflect_ScoreDown2: score -2 - AI_CV_Reflect_End: end @@ -1608,13 +2123,26 @@ AI_CV_Reflect_PhysicalTypeList: .byte TYPE_STEEL .byte -1 +AI_CV_ToxicThread: + if_status AI_TARGET, STATUS1_ANY, AI_CV_ToxicThreadSpd + call EncouragePsnVenoshock +AI_CV_ToxicThreadSpd: + if_target_faster AI_CV_ToxicThread2 + if_not_status AI_TARGET, STATUS1_ANY, AI_CV_ToxicThread3 + score -1 + goto AI_CV_ToxicThread3 +AI_CV_ToxicThread2: + score +1 +AI_CV_ToxicThread3: + goto AI_CV_Poison2 + AI_CV_Poison: + call EncouragePsnVenoshock +AI_CV_Poison2: if_hp_less_than AI_USER, 50, AI_CV_Poison_ScoreDown1 if_hp_more_than AI_TARGET, 50, AI_CV_Poison_End - AI_CV_Poison_ScoreDown1: score -1 - AI_CV_Poison_End: end @@ -1645,20 +2173,27 @@ AI_CV_VitalThrow_End: end AI_CV_Substitute: + if_not_status2 AI_TARGET, STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION, AI_CV_Substitute1 + if_status3 AI_TARGET, STATUS3_PERISH_SONG, AI_CV_SubstitutePlus3Continue + if_status AI_TARGET, STATUS1_BURN | STATUS1_PSN_ANY, AI_CV_SubstitutePlus1Continue + goto AI_CV_Substitute1 +AI_CV_SubstitutePlus1Continue: + score +1 + goto AI_CV_Substitute1 +AI_CV_SubstitutePlus3Continue: + score +3 +AI_CV_Substitute1: if_hp_more_than AI_USER, 90, AI_CV_Substitute4 if_hp_more_than AI_USER, 70, AI_CV_Substitute3 if_hp_more_than AI_USER, 50, AI_CV_Substitute2 if_random_less_than 100, AI_CV_Substitute2 score -1 - AI_CV_Substitute2: if_random_less_than 100, AI_CV_Substitute3 score -1 - AI_CV_Substitute3: if_random_less_than 100, AI_CV_Substitute4 score -1 - AI_CV_Substitute4: if_target_faster AI_CV_Substitute_End get_last_used_bank_move AI_TARGET @@ -1671,22 +2206,17 @@ AI_CV_Substitute4: if_equal EFFECT_CONFUSE, AI_CV_Substitute6 if_equal EFFECT_LEECH_SEED, AI_CV_Substitute7 goto AI_CV_Substitute_End - AI_CV_Substitute5: if_not_status AI_TARGET, STATUS1_ANY, AI_CV_Substitute8 goto AI_CV_Substitute_End - AI_CV_Substitute6: if_not_status2 AI_TARGET, STATUS2_CONFUSION, AI_CV_Substitute8 goto AI_CV_Substitute_End - AI_CV_Substitute7: if_status3 AI_TARGET, STATUS3_LEECHSEED, AI_CV_Substitute_End - AI_CV_Substitute8: if_random_less_than 100, AI_CV_Substitute_End score +1 - AI_CV_Substitute_End: end @@ -1745,8 +2275,8 @@ AI_CV_Counter3: AI_CV_Counter4: get_last_used_bank_move AI_TARGET - get_move_type_from_result - if_not_in_bytes AI_CV_Counter_PhysicalTypeList, AI_CV_Counter_ScoreDown1 + get_move_split_from_result + if_not_equal SPLIT_PHYSICAL, AI_CV_Counter_ScoreDown1 if_random_less_than 100, AI_CV_Counter_End score +1 goto AI_CV_Counter_End @@ -1757,10 +2287,7 @@ AI_CV_Counter5: score +1 AI_CV_Counter6: - get_target_type1 - if_in_bytes AI_CV_Counter_PhysicalTypeList, AI_CV_Counter_End - get_target_type2 - if_in_bytes AI_CV_Counter_PhysicalTypeList, AI_CV_Counter_End + if_has_no_physical_move AI_TARGET, AI_CV_Counter_ScoreDown1 if_random_less_than 50, AI_CV_Counter_End AI_CV_Counter7: @@ -1776,18 +2303,6 @@ AI_CV_Counter_ScoreDown1: AI_CV_Counter_End: end -AI_CV_Counter_PhysicalTypeList: - .byte TYPE_NORMAL - .byte TYPE_FIGHTING - .byte TYPE_FLYING - .byte TYPE_POISON - .byte TYPE_GROUND - .byte TYPE_ROCK - .byte TYPE_BUG - .byte TYPE_GHOST - .byte TYPE_STEEL - .byte -1 - AI_CV_Encore: if_any_move_disabled AI_TARGET, AI_CV_Encore2 if_target_faster AI_CV_Encore_ScoreDown2 @@ -1824,7 +2339,7 @@ AI_CV_Encore_EncouragedMovesToEncore: .byte EFFECT_POISON .byte EFFECT_PARALYZE .byte EFFECT_LEECH_SEED - .byte EFFECT_SPLASH + .byte EFFECT_DO_NOTHING .byte EFFECT_ATTACK_UP_2 .byte EFFECT_ENCORE .byte EFFECT_CONVERSION_2 @@ -1888,19 +2403,39 @@ AI_CV_PainSplit_ScoreDown1: AI_CV_PainSplit_End: end - -AI_CV_Snore: - score +2 + +AI_EncourageIfHasOHKO: + if_level_cond 1, AI_EncourageIfHasOHKORet + if_has_move_with_effect AI_USER, EFFECT_OHKO, Score_Plus3 +AI_EncourageIfHasOHKORet: end + +AI_EncourageIfHasLowAccuracyMove: + if_ability AI_USER, ABILITY_COMPOUND_EYES, AI_EncourageIfHasVeryLowAccuracyMove + get_hold_effect AI_USER + if_equal HOLD_EFFECT_WIDE_LENS, AI_EncourageIfHasVeryLowAccuracyMove + if_equal HOLD_EFFECT_ZOOM_LENS, AI_EncourageIfHasVeryLowAccuracyMove + if_has_move_with_accuracy_lt AI_USER, 86, Score_Plus3 + if_has_move_with_accuracy_lt AI_USER, 91, Score_Plus1 + goto Score_Minus1 +AI_EncourageIfHasVeryLowAccuracyMove: + if_has_move_with_accuracy_lt AI_USER, 81, Score_Plus3 + if_has_move_with_accuracy_lt AI_USER, 86, Score_Plus1 + goto Score_Minus1 AI_CV_LockOn: + call AI_EncourageIfHasOHKO + call AI_EncourageIfHasLowAccuracyMove +AI_CV_LockOn2: if_random_less_than 128, AI_CV_LockOn_End - score +2 + score +1 AI_CV_LockOn_End: end AI_CV_SleepTalk: + is_wakeup_turn AI_USER + if_equal 1, Score_Minus5 if_status AI_USER, STATUS1_SLEEP, Score_Plus10 score -5 end @@ -1950,14 +2485,17 @@ AI_CV_Flail_ScoreDown1: AI_CV_Flail_End: end - + AI_CV_HealBell: - if_status AI_TARGET, STATUS1_ANY, AI_CV_HealBell_End - if_status_in_party AI_TARGET, STATUS1_ANY, AI_CV_HealBell_End - score -5 - -AI_CV_HealBell_End: + if_move MOVE_HEAL_BELL AI_CV_HealBell2 +AI_CV_HealBellEnd: end +@ Don't use Heal Bell to heal a partner that has Soundproof +AI_CV_HealBell2: + if_status AI_USER, STATUS1_ANY, AI_CV_HealBellEnd + if_not_status AI_USER_PARTNER, STATUS1_ANY, AI_CV_HealBellEnd + if_ability AI_USER_PARTNER, ABILITY_SOUNDPROOF, Score_Minus3 + goto AI_CV_HealBellEnd AI_CV_Thief: get_hold_effect AI_TARGET @@ -1983,61 +2521,53 @@ AI_CV_Thief_EncourageItemsToSteal: .byte -1 AI_CV_Curse: - get_user_type1 - if_equal TYPE_GHOST, AI_CV_Curse4 - get_user_type2 - if_equal TYPE_GHOST, AI_CV_Curse4 - if_stat_level_more_than AI_USER, STAT_DEF, 9, AI_CV_Curse_End + if_type AI_USER, TYPE_GHOST, AI_CV_CurseGhost + if_stat_level_more_than AI_USER, STAT_DEF, 9, AI_CV_Curse2 if_random_less_than 128, AI_CV_Curse2 score +1 - AI_CV_Curse2: - if_stat_level_more_than AI_USER, STAT_DEF, 7, AI_CV_Curse_End + if_stat_level_more_than AI_USER, STAT_ATK, 9, AI_CV_Curse3 if_random_less_than 128, AI_CV_Curse3 score +1 - AI_CV_Curse3: - if_stat_level_more_than AI_USER, STAT_DEF, DEFAULT_STAT_STAGE, AI_CV_Curse_End - if_random_less_than 128, AI_CV_Curse_End + if_stat_level_more_than AI_USER, STAT_DEF, 6, AI_CV_Curse4 + if_random_less_than 98, AI_CV_Curse4 score +1 - goto AI_CV_Curse_End - AI_CV_Curse4: + if_stat_level_more_than AI_USER, STAT_ATK, 6, AI_CV_Curse5 + if_random_less_than 99, AI_CV_Curse5 + score +1 +AI_CV_Curse5: + get_hold_effect AI_USER + if_not_equal HOLD_EFFECT_RESTORE_STATS, AI_CV_Curse_End + score +2 + goto AI_CV_Curse_End +AI_CV_CurseGhost: if_hp_more_than AI_USER, 80, AI_CV_Curse_End score -1 - AI_CV_Curse_End: end AI_CV_Protect: get_protect_count AI_USER if_more_than 1, AI_CV_Protect_ScoreDown2 - if_status AI_USER, STATUS1_TOXIC_POISON, AI_CV_Protect3 - if_status2 AI_USER, STATUS2_CURSED, AI_CV_Protect3 - if_status3 AI_USER, STATUS3_PERISH_SONG, AI_CV_Protect3 - if_status2 AI_USER, STATUS2_INFATUATION, AI_CV_Protect3 - if_status3 AI_USER, STATUS3_LEECHSEED, AI_CV_Protect3 - if_status3 AI_USER, STATUS3_YAWN, AI_CV_Protect3 + if_status AI_USER, STATUS1_PSN_ANY | STATUS1_BURN, AI_CV_ProtectUserStatused + if_status2 AI_USER, STATUS2_CURSED | STATUS2_INFATUATION, AI_CV_ProtectUserStatused + if_status3 AI_USER, STATUS3_PERISH_SONG | STATUS3_LEECHSEED | STATUS3_YAWN, AI_CV_ProtectUserStatused if_has_move_with_effect AI_TARGET, EFFECT_RESTORE_HP, AI_CV_Protect3 if_has_move_with_effect AI_TARGET, EFFECT_DEFENSE_CURL, AI_CV_Protect3 - if_status AI_TARGET, STATUS1_TOXIC_POISON, AI_CV_Protect_ScoreUp2 - if_status2 AI_TARGET, STATUS2_CURSED, AI_CV_Protect_ScoreUp2 - if_status3 AI_TARGET, STATUS3_PERISH_SONG, AI_CV_Protect_ScoreUp2 - if_status2 AI_TARGET, STATUS2_INFATUATION, AI_CV_Protect_ScoreUp2 - if_status3 AI_TARGET, STATUS3_LEECHSEED, AI_CV_Protect_ScoreUp2 - if_status3 AI_TARGET, STATUS3_YAWN, AI_CV_Protect_ScoreUp2 + if_status AI_TARGET, STATUS1_TOXIC_POISON, AI_CV_Protect_ScoreUp2 + if_status2 AI_TARGET, STATUS2_CURSED | STATUS2_INFATUATION, AI_CV_Protect_ScoreUp2 + if_status3 AI_TARGET, STATUS3_PERISH_SONG | STATUS3_LEECHSEED | STATUS3_YAWN, AI_CV_Protect_ScoreUp2 get_last_used_bank_move AI_TARGET get_move_effect_from_result if_not_equal EFFECT_LOCK_ON, AI_CV_Protect_ScoreUp2 goto AI_CV_Protect2 - AI_CV_Protect_ScoreUp2: score +2 - AI_CV_Protect2: if_random_less_than 128, AI_CV_Protect4 score -1 - AI_CV_Protect4: get_protect_count AI_USER if_equal 0, AI_CV_Protect_End @@ -2045,49 +2575,57 @@ AI_CV_Protect4: if_random_less_than 128, AI_CV_Protect_End score -1 goto AI_CV_Protect_End - +AI_CV_ProtectUserStatused: + score -1 + if_double_battle AI_CV_Protect4 + score -1 + goto AI_CV_Protect4 AI_CV_Protect3: get_last_used_bank_move AI_TARGET get_move_effect_from_result if_not_equal EFFECT_LOCK_ON, AI_CV_Protect_End - AI_CV_Protect_ScoreDown2: score -2 - AI_CV_Protect_End: end AI_CV_Foresight: - get_user_type1 - if_equal TYPE_GHOST, AI_CV_Foresight2 - get_user_type2 - if_equal TYPE_GHOST, AI_CV_Foresight2 + if_has_move_with_type AI_USER, TYPE_NORMAL, AI_CV_ForesightGhost + if_has_move_with_type AI_USER, TYPE_FIGHTING, AI_CV_ForesightGhost + goto AI_CV_ForesightEvs +AI_CV_ForesightGhost: + if_type AI_USER, TYPE_GHOST, AI_CV_Foresight2 +AI_CV_ForesightEvs: if_stat_level_more_than AI_USER, STAT_EVASION, 8, AI_CV_Foresight3 - score -2 + score -3 goto AI_CV_Foresight_End - AI_CV_Foresight2: if_random_less_than 80, AI_CV_Foresight_End - AI_CV_Foresight3: if_random_less_than 80, AI_CV_Foresight_End score +2 - AI_CV_Foresight_End: end AI_CV_Endure: - if_hp_less_than AI_USER, 4, AI_CV_Endure2 + get_protect_count AI_USER + if_more_than 1, AI_CV_Endure2 + if_hp_less_than AI_USER, 8, AI_CV_Endure2 + if_hp_less_than AI_USER, 14, AI_CV_Endure4 if_hp_less_than AI_USER, 35, AI_CV_Endure3 - + if_doesnt_have_move_with_effect AI_USER, EFFECT_FLAIL, AI_CV_Endure2 + score +1 + goto AI_CV_Endure_End AI_CV_Endure2: + score -3 + goto AI_CV_Endure_End +AI_CV_Endure4: score -1 goto AI_CV_Endure_End - AI_CV_Endure3: + if_has_move_with_effect AI_USER, EFFECT_FLAIL, Score_Plus2 if_random_less_than 70, AI_CV_Endure_End score +1 - AI_CV_Endure_End: end @@ -2098,20 +2636,16 @@ AI_CV_BatonPass: if_stat_level_more_than AI_USER, STAT_SPDEF, 8, AI_CV_BatonPass2 if_stat_level_more_than AI_USER, STAT_EVASION, 8, AI_CV_BatonPass2 goto AI_CV_BatonPass5 - AI_CV_BatonPass2: if_target_faster AI_CV_BatonPass3 - if_hp_more_than AI_USER, 60, AI_CV_BatonPass_End + if_hp_more_than AI_USER, 60, AI_CV_BatonPass_Last goto AI_CV_BatonPass4 - AI_CV_BatonPass3: - if_hp_more_than AI_USER, 70, AI_CV_BatonPass_End - + if_hp_more_than AI_USER, 70, AI_CV_BatonPass_Last AI_CV_BatonPass4: - if_random_less_than 80, AI_CV_BatonPass_End + if_random_less_than 80, AI_CV_BatonPass_Last score +2 - goto AI_CV_BatonPass_End - + goto AI_CV_BatonPass_Last AI_CV_BatonPass5: if_stat_level_more_than AI_USER, STAT_ATK, 7, AI_CV_BatonPass7 if_stat_level_more_than AI_USER, STAT_DEF, 7, AI_CV_BatonPass7 @@ -2119,18 +2653,38 @@ AI_CV_BatonPass5: if_stat_level_more_than AI_USER, STAT_SPDEF, 7, AI_CV_BatonPass7 if_stat_level_more_than AI_USER, STAT_EVASION, 7, AI_CV_BatonPass7 goto AI_CV_BatonPass_ScoreDown2 - AI_CV_BatonPass7: if_target_faster AI_CV_BatonPass8 + if_ai_can_go_down AI_CV_BatonPass4 if_hp_more_than AI_USER, 60, AI_CV_BatonPass_ScoreDown2 - goto AI_CV_BatonPass_End - + goto AI_CV_BatonPass_Last AI_CV_BatonPass8: - if_hp_less_than AI_USER, 70, AI_CV_BatonPass_End - + if_ai_can_go_down AI_CV_BatonPass_ScoreDown2 + if_hp_less_than AI_USER, 70, AI_CV_BatonPass_Last + goto AI_CV_BatonPass_ScoreDown2 +AI_CV_BatonPass9: + if_stat_level_more_than AI_USER, STAT_ATK, 6, AI_CV_BatonPass10 + if_stat_level_more_than AI_USER, STAT_DEF, 6, AI_CV_BatonPass10 + if_stat_level_more_than AI_USER, STAT_SPATK, 6, AI_CV_BatonPass10 + if_stat_level_more_than AI_USER, STAT_SPDEF, 6, AI_CV_BatonPass10 + if_stat_level_more_than AI_USER, STAT_EVASION, 6, AI_CV_BatonPass10 + goto AI_CV_BatonPass_ScoreDown2 +AI_CV_BatonPass10: + if_target_faster AI_CV_BatonPass11 + if_ai_can_go_down AI_CV_BatonPass4 + if_hp_more_than AI_USER, 60, AI_CV_BatonPass_ScoreDown2 + goto AI_CV_BatonPass_Last +AI_CV_BatonPass11: + if_ai_can_go_down AI_CV_BatonPass_ScoreDown2 + if_hp_less_than AI_USER, 70, AI_CV_BatonPass_Last + goto AI_CV_BatonPass_ScoreDown2 AI_CV_BatonPass_ScoreDown2: score -2 - + end +AI_CV_BatonPass_Last: + get_best_dmg_hp_percent + if_less_than 10, Score_Plus2 + if_less_than 20, Score_Plus1 AI_CV_BatonPass_End: end @@ -2155,45 +2709,96 @@ AI_CV_Pursuit_End: end AI_CV_RainDance: + get_weather + if_equal AI_WEATHER_RAIN, AI_CV_RainDance_End if_user_faster AI_CV_RainDance2 get_ability AI_USER if_equal ABILITY_SWIFT_SWIM, AI_CV_RainDance3 - + get_ability AI_USER_PARTNER + if_equal ABILITY_SWIFT_SWIM, AI_CV_RainDance3 AI_CV_RainDance2: if_hp_less_than AI_USER, 40, AI_CV_RainDance_ScoreDown1 get_weather if_equal AI_WEATHER_HAIL, AI_CV_RainDance3 if_equal AI_WEATHER_SUN, AI_CV_RainDance3 if_equal AI_WEATHER_SANDSTORM, AI_CV_RainDance3 - get_ability AI_USER - if_equal ABILITY_RAIN_DISH, AI_CV_RainDance3 - goto AI_CV_RainDance_End - + if_ability AI_USER, ABILITY_RAIN_DISH, AI_CV_RainDance3 + if_ability AI_USER_PARTNER, ABILITY_RAIN_DISH, AI_CV_RainDance3 + if_ability AI_USER, ABILITY_HYDRATION, AI_CV_Hydration + if_no_ability AI_USER_PARTNER, ABILITY_HYDRATION, AI_CV_RainDance_Rock +AI_CV_Hydration: + if_status AI_USER, STATUS1_ANY, AI_CV_RainDance3 + if_status AI_USER_PARTNER, STATUS1_ANY, AI_CV_RainDance3 + goto AI_CV_RainDance_Rock AI_CV_RainDance3: score +1 - goto AI_CV_RainDance_End - + goto AI_CV_RainDance_Rock AI_CV_RainDance_ScoreDown1: score -1 - +AI_CV_RainDance_Rock: + get_hold_effect AI_USER + if_not_equal HOLD_EFFECT_DAMP_ROCK, AI_CV_RainDance_Opponent + score +2 +AI_CV_RainDance_Opponent: + if_has_move_with_type AI_TARGET, TYPE_FIRE, AI_CV_RainDance_OpponentPlus + if_no_type AI_TARGET, TYPE_FIRE, AI_CV_RainDance_End +AI_CV_RainDance_OpponentPlus: + score +1 AI_CV_RainDance_End: end AI_CV_SunnyDay: + get_weather + if_equal AI_WEATHER_SUN, AI_CV_SunnyDay_End if_hp_less_than AI_USER, 40, AI_CV_SunnyDay_ScoreDown1 get_weather if_equal AI_WEATHER_HAIL, AI_CV_SunnyDay2 if_equal AI_WEATHER_RAIN, AI_CV_SunnyDay2 if_equal AI_WEATHER_SANDSTORM, AI_CV_SunnyDay2 - goto AI_CV_SunnyDay_End - + goto AI_CV_SunnyDay_Rock AI_CV_SunnyDay2: score +1 - goto AI_CV_SunnyDay_End - + goto AI_CV_SunnyDay_Rock AI_CV_SunnyDay_ScoreDown1: score -1 - +AI_CV_SunnyDay_Rock: + get_hold_effect AI_USER + if_not_equal HOLD_EFFECT_HEAT_ROCK, AI_CV_SunnyDay_Moves + score +2 +AI_CV_SunnyDay_Moves: + if_has_move_with_effect AI_USER, EFFECT_SOLARBEAM, AI_CV_SunnyDay_MovesPlus + if_has_move_with_effect AI_USER, EFFECT_SYNTHESIS, AI_CV_SunnyDay_MovesPlus + if_has_move_with_effect AI_USER_PARTNER, EFFECT_SOLARBEAM, AI_CV_SunnyDay_MovesPlus + if_has_move_with_effect AI_USER_PARTNER, EFFECT_SYNTHESIS, AI_CV_SunnyDay_MovesPlus + if_has_move_with_type AI_USER, TYPE_FIRE, AI_CV_SunnyDay_MovesPlus + goto AI_CV_SunnyDay_Abilities +AI_CV_SunnyDay_MovesPlus: + score +1 +AI_CV_SunnyDay_Abilities: + if_user_faster AI_CV_SunnyDay_Abilities2 + if_ability AI_USER, ABILITY_CHLOROPHYLL, AI_CV_SunnyDay_AbilitiesPlus + get_ability AI_USER_PARTNER + if_not_equal ABILITY_CHLOROPHYLL, AI_CV_SunnyDay_Abilities2 +AI_CV_SunnyDay_AbilitiesPlus: + score +1 +AI_CV_SunnyDay_Abilities2: + if_ability AI_USER, ABILITY_LEAF_GUARD, AI_CV_SunnyDay_Abilities2Plus + get_ability AI_USER_PARTNER + if_not_equal ABILITY_LEAF_GUARD, AI_CV_SunnyDay_Opponent +AI_CV_SunnyDay_Abilities2Plus: + score + 1 +@ If target is fire type, giving him a sunny day boost may not be a good idea +AI_CV_SunnyDay_Opponent: + if_ability AI_USER, ABILITY_FLASH_FIRE, AI_CV_SunnyDay_Opponent2 + if_has_move_with_type AI_TARGET, TYPE_FIRE, AI_CV_SunnyDay_OpponentMinus + if_no_type AI_TARGET, TYPE_FIRE, AI_CV_SunnyDay_Opponent2 +AI_CV_SunnyDay_OpponentMinus: + score -1 +AI_CV_SunnyDay_Opponent2: + if_has_move_with_type AI_TARGET, TYPE_WATER, AI_CV_SunnyDay_Opponent2Plus + if_no_type AI_TARGET, TYPE_WATER, AI_CV_SunnyDay_End +AI_CV_SunnyDay_Opponent2Plus: + score +1 AI_CV_SunnyDay_End: end @@ -2261,8 +2866,8 @@ AI_CV_MirrorCoat3: AI_CV_MirrorCoat4: get_last_used_bank_move AI_TARGET - get_move_type_from_result - if_not_in_bytes AI_CV_MirrorCoat_SpecialTypeList, AI_CV_MirrorCoat_ScoreDown1 + get_move_split_from_result + if_not_equal SPLIT_SPECIAL, AI_CV_MirrorCoat_ScoreDown1 if_random_less_than 100, AI_CV_MirrorCoat_End score +1 goto AI_CV_MirrorCoat_End @@ -2273,10 +2878,7 @@ AI_CV_MirrorCoat5: score +1 AI_CV_MirrorCoat6: - get_target_type1 - if_in_bytes AI_CV_MirrorCoat_SpecialTypeList, AI_CV_MirrorCoat_End - get_target_type2 - if_in_bytes AI_CV_MirrorCoat_SpecialTypeList, AI_CV_MirrorCoat_End + if_has_no_special_move AI_TARGET, AI_CV_MirrorCoat_ScoreDown1 if_random_less_than 50, AI_CV_MirrorCoat_End AI_CV_MirrorCoat_ScoreUp4: @@ -2291,19 +2893,15 @@ AI_CV_MirrorCoat_ScoreDown1: AI_CV_MirrorCoat_End: end - -AI_CV_MirrorCoat_SpecialTypeList: - .byte TYPE_FIRE - .byte TYPE_WATER - .byte TYPE_GRASS - .byte TYPE_ELECTRIC - .byte TYPE_PSYCHIC - .byte TYPE_ICE - .byte TYPE_DRAGON - .byte TYPE_DARK - .byte -1 + +AI_CV_Geomancy: + get_hold_effect AI_USER + if_equal HOLD_EFFECT_POWER_HERB, AI_CV_ChargeUpMove_ScoreUp2 + end AI_CV_ChargeUpMove: + get_hold_effect AI_USER + if_equal HOLD_EFFECT_POWER_HERB, AI_CV_ChargeUpMove_ScoreUp2 if_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_ChargeUpMove_ScoreDown2 if_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_ChargeUpMove_ScoreDown2 if_has_move_with_effect AI_TARGET, EFFECT_PROTECT, AI_CV_ChargeUpMove_ScoreDown2 @@ -2316,22 +2914,24 @@ AI_CV_ChargeUpMove_ScoreDown2: AI_CV_ChargeUpMove_End: end +AI_CV_ChargeUpMove_ScoreUp2: + score +2 + goto AI_CV_ChargeUpMove_End AI_CV_SemiInvulnerable: + get_hold_effect AI_USER + if_equal HOLD_EFFECT_POWER_HERB, AI_CV_ChargeUpMove_ScoreUp2 if_doesnt_have_move_with_effect AI_TARGET, EFFECT_PROTECT, AI_CV_SemiInvulnerable2 score -1 goto AI_CV_SemiInvulnerable_End -@ BUG: The scripts for checking type-resistance to weather for semi-invulnerable moves are swapped -@ The result is that the AI is encouraged to stall while taking damage from weather -@ To fix, swap _CheckSandstormTypes/_CheckIceType in the below script AI_CV_SemiInvulnerable2: if_status AI_TARGET, STATUS1_TOXIC_POISON, AI_CV_SemiInvulnerable_TryEncourage if_status2 AI_TARGET, STATUS2_CURSED, AI_CV_SemiInvulnerable_TryEncourage if_status3 AI_TARGET, STATUS3_LEECHSEED, AI_CV_SemiInvulnerable_TryEncourage get_weather - if_equal AI_WEATHER_HAIL, AI_CV_SemiInvulnerable_CheckSandstormTypes - if_equal AI_WEATHER_SANDSTORM, AI_CV_SemiInvulnerable_CheckIceType + if_equal AI_WEATHER_HAIL, AI_CV_SemiInvulnerable_CheckIceType + if_equal AI_WEATHER_SANDSTORM, AI_CV_SemiInvulnerable_CheckSandstormTypes goto AI_CV_SemiInvulnerable5 AI_CV_SemiInvulnerable_CheckSandstormTypes: @@ -2339,6 +2939,8 @@ AI_CV_SemiInvulnerable_CheckSandstormTypes: if_in_bytes AI_CV_SandstormResistantTypes, AI_CV_SemiInvulnerable_TryEncourage get_user_type2 if_in_bytes AI_CV_SandstormResistantTypes, AI_CV_SemiInvulnerable_TryEncourage + get_ability AI_USER + if_in_bytes AI_SandstormResistantAbilities, AI_CV_SemiInvulnerable_TryEncourage goto AI_CV_SemiInvulnerable5 AI_CV_SemiInvulnerable_CheckIceType: @@ -2346,6 +2948,8 @@ AI_CV_SemiInvulnerable_CheckIceType: if_equal TYPE_ICE, AI_CV_SemiInvulnerable_TryEncourage get_user_type2 if_equal TYPE_ICE, AI_CV_SemiInvulnerable_TryEncourage + get_ability AI_USER + if_in_bytes AI_HailResistantAbilities, AI_CV_SemiInvulnerable_TryEncourage AI_CV_SemiInvulnerable5: if_target_faster AI_CV_SemiInvulnerable_End @@ -2366,9 +2970,30 @@ AI_CV_SandstormResistantTypes: .byte TYPE_ROCK .byte TYPE_STEEL .byte -1 + +AI_SandstormResistantAbilities: + .byte ABILITY_SAND_VEIL + .byte ABILITY_SAND_FORCE + .byte ABILITY_SAND_RUSH + .byte ABILITY_OVERCOAT + .byte ABILITY_MAGIC_GUARD + .byte -1 + +AI_HailResistantAbilities: + .byte ABILITY_ICE_BODY + .byte ABILITY_SNOW_CLOAK + .byte ABILITY_OVERCOAT + .byte ABILITY_MAGIC_GUARD + .byte -1 AI_CV_FakeOut: + if_ability AI_TARGET, ABILITY_INNER_FOCUS, AI_CV_FakeOut_End + if_double_battle AI_CV_FakeOut_Double + score +5 + end +AI_CV_FakeOut_Double: score +2 +AI_CV_FakeOut_End: end AI_CV_SpitUp: @@ -2386,21 +3011,61 @@ AI_CV_Hail: if_equal AI_WEATHER_SUN, AI_CV_Hail2 if_equal AI_WEATHER_RAIN, AI_CV_Hail2 if_equal AI_WEATHER_SANDSTORM, AI_CV_Hail2 - goto AI_CV_Hail_End - + goto AI_CV_Hail_Rock AI_CV_Hail2: score +1 - goto AI_CV_Hail_End - + goto AI_CV_Hail_Rock AI_CV_Hail_ScoreDown1: score -1 - +AI_CV_Hail_Rock: + get_hold_effect AI_USER + if_not_equal HOLD_EFFECT_ICY_ROCK, AI_CV_Hail_Ability + score +2 +AI_CV_Hail_Ability: + get_ability AI_USER + if_equal ABILITY_ICE_BODY, AI_CV_Hail_AbilityPlus + if_equal ABILITY_SNOW_CLOAK, AI_CV_Hail_AbilityPlus + if_equal ABILITY_SLUSH_RUSH, AI_CV_Hail_AbilityPlus + if_not_equal ABILITY_FORECAST, AI_CV_Hail_Move +AI_CV_Hail_AbilityPlus: + score +1 +AI_CV_Hail_Move: + if_has_move AI_USER, MOVE_BLIZZARD, AI_CV_Hail_MovePlus + if_has_move AI_USER_PARTNER, MOVE_BLIZZARD, AI_CV_Hail_MovePlus + goto AI_CV_Hail_End +AI_CV_Hail_MovePlus: + score +1 AI_CV_Hail_End: end + +AI_CV_Sandstorm: + if_hp_less_than AI_USER, 40, AI_CV_Sandstorm_ScoreDown1 + get_weather + if_equal AI_WEATHER_SUN, AI_CV_Sandstorm2 + if_equal AI_WEATHER_RAIN, AI_CV_Sandstorm2 + if_equal AI_WEATHER_HAIL, AI_CV_Sandstorm2 + goto AI_CV_Sandstorm_End +AI_CV_Sandstorm2: + score +1 + goto AI_CV_Sandstorm_End +AI_CV_Sandstorm_ScoreDown1: + score -1 +AI_CV_Sandstorm_Rock: + get_hold_effect AI_USER + if_not_equal HOLD_EFFECT_SMOOTH_ROCK, AI_CV_Sandstorm_Ability + score +2 +AI_CV_Sandstorm_Ability: + get_ability AI_USER + if_equal ABILITY_SAND_VEIL, AI_CV_Sandstorm_AbilityPlus + if_equal ABILITY_SAND_RUSH, AI_CV_Sandstorm_AbilityPlus + if_not_equal ABILITY_SAND_VEIL, AI_CV_Sandstorm_End +AI_CV_Sandstorm_AbilityPlus: + score +1, +AI_CV_Sandstorm_End: + end -@ BUG: Facade score is increased if the target is statused, but should be if the user is. Replace AI_TARGET with AI_USER AI_CV_Facade: - if_not_status AI_TARGET, STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON, AI_CV_Facade_End + if_not_status AI_USER, STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON, AI_CV_Facade_End score +1 AI_CV_Facade_End: end @@ -2761,115 +3426,145 @@ AI_CV_DragonDance_End: AI_TryToFaint: if_target_is_ally AI_Ret - if_can_faint AI_TryToFaint_TryToEncourageQuickAttack + if_can_faint AI_TryToFaint_Can get_how_powerful_move_is - if_equal MOVE_NOT_MOST_POWERFUL, Score_Minus1 + if_equal MOVE_POWER_DISCOURAGED, Score_Minus1 +AI_TryToFaint2: if_type_effectiveness AI_EFFECTIVENESS_x4, AI_TryToFaint_DoubleSuperEffective - end - + goto AI_TryToFaint_CheckIfDanger AI_TryToFaint_DoubleSuperEffective: - if_random_less_than 80, AI_TryToFaint_End + if_random_less_than 80, AI_TryToFaint_CheckIfDanger score +2 - end - -AI_TryToFaint_TryToEncourageQuickAttack: - if_effect EFFECT_EXPLOSION, AI_TryToFaint_End - if_not_effect EFFECT_QUICK_ATTACK, AI_TryToFaint_ScoreUp4 + goto AI_TryToFaint_CheckIfDanger +AI_TryToFaint_Can: + if_effect EFFECT_EXPLOSION, AI_TryToFaint_CheckIfDanger + if_user_faster AI_TryToFaint_ScoreUp4 + if_move_flag FLAG_HIGH_CRIT, AI_TryToFaint_ScoreUp4 score +2 - + goto AI_TryToFaint_CheckIfDanger AI_TryToFaint_ScoreUp4: score +4 - +AI_TryToFaint_CheckIfDanger: + if_user_faster AI_TryToFaint_End + if_ai_can_go_down AI_TryToFaint_Danger AI_TryToFaint_End: end +AI_TryToFaint_Danger: + get_how_powerful_move_is + if_not_equal MOVE_POWER_BEST, Score_Minus1 + score +1 + goto AI_TryToFaint_End AI_SetupFirstTurn: if_target_is_ally AI_Ret get_turn_count if_not_equal 0, AI_SetupFirstTurn_End get_considered_move_effect - if_not_in_bytes AI_SetupFirstTurn_SetupEffectsToEncourage, AI_SetupFirstTurn_End - if_random_less_than 80, AI_SetupFirstTurn_End + if_not_in_hwords AI_SetupFirstTurn_SetupEffectsToEncourage, AI_SetupFirstTurn_End score +2 - AI_SetupFirstTurn_End: end +.align 1 AI_SetupFirstTurn_SetupEffectsToEncourage: - .byte EFFECT_ATTACK_UP - .byte EFFECT_DEFENSE_UP - .byte EFFECT_SPEED_UP - .byte EFFECT_SPECIAL_ATTACK_UP - .byte EFFECT_SPECIAL_DEFENSE_UP - .byte EFFECT_ACCURACY_UP - .byte EFFECT_EVASION_UP - .byte EFFECT_ATTACK_DOWN - .byte EFFECT_DEFENSE_DOWN - .byte EFFECT_SPEED_DOWN - .byte EFFECT_SPECIAL_ATTACK_DOWN - .byte EFFECT_SPECIAL_DEFENSE_DOWN - .byte EFFECT_ACCURACY_DOWN - .byte EFFECT_EVASION_DOWN - .byte EFFECT_CONVERSION - .byte EFFECT_LIGHT_SCREEN - .byte EFFECT_SPECIAL_DEFENSE_UP_2 - .byte EFFECT_FOCUS_ENERGY - .byte EFFECT_CONFUSE - .byte EFFECT_ATTACK_UP_2 - .byte EFFECT_DEFENSE_UP_2 - .byte EFFECT_SPEED_UP_2 - .byte EFFECT_SPECIAL_ATTACK_UP_2 - .byte EFFECT_SPECIAL_DEFENSE_UP_2 - .byte EFFECT_ACCURACY_UP_2 - .byte EFFECT_EVASION_UP_2 - .byte EFFECT_ATTACK_DOWN_2 - .byte EFFECT_DEFENSE_DOWN_2 - .byte EFFECT_SPEED_DOWN_2 - .byte EFFECT_SPECIAL_ATTACK_DOWN_2 - .byte EFFECT_SPECIAL_DEFENSE_DOWN_2 - .byte EFFECT_ACCURACY_DOWN_2 - .byte EFFECT_EVASION_DOWN_2 - .byte EFFECT_REFLECT - .byte EFFECT_POISON - .byte EFFECT_PARALYZE - .byte EFFECT_SUBSTITUTE - .byte EFFECT_LEECH_SEED - .byte EFFECT_MINIMIZE - .byte EFFECT_CURSE - .byte EFFECT_SWAGGER - .byte EFFECT_CAMOUFLAGE - .byte EFFECT_YAWN - .byte EFFECT_DEFENSE_CURL - .byte EFFECT_TORMENT - .byte EFFECT_FLATTER - .byte EFFECT_WILL_O_WISP - .byte EFFECT_INGRAIN - .byte EFFECT_IMPRISON - .byte EFFECT_TEETER_DANCE - .byte EFFECT_TICKLE - .byte EFFECT_COSMIC_POWER - .byte EFFECT_BULK_UP - .byte EFFECT_CALM_MIND - .byte EFFECT_CAMOUFLAGE - .byte -1 + .2byte EFFECT_ATTACK_UP + .2byte EFFECT_DEFENSE_UP + .2byte EFFECT_SPEED_UP + .2byte EFFECT_SPECIAL_ATTACK_UP + .2byte EFFECT_SPECIAL_DEFENSE_UP + .2byte EFFECT_ACCURACY_UP + .2byte EFFECT_EVASION_UP + .2byte EFFECT_ATTACK_DOWN + .2byte EFFECT_DEFENSE_DOWN + .2byte EFFECT_SPEED_DOWN + .2byte EFFECT_SPECIAL_ATTACK_DOWN + .2byte EFFECT_SPECIAL_DEFENSE_DOWN + .2byte EFFECT_ACCURACY_DOWN + .2byte EFFECT_EVASION_DOWN + .2byte EFFECT_CONVERSION + .2byte EFFECT_LIGHT_SCREEN + .2byte EFFECT_SPECIAL_DEFENSE_UP_2 + .2byte EFFECT_FOCUS_ENERGY + .2byte EFFECT_CONFUSE + .2byte EFFECT_ATTACK_UP_2 + .2byte EFFECT_DEFENSE_UP_2 + .2byte EFFECT_SPEED_UP_2 + .2byte EFFECT_SPECIAL_ATTACK_UP_2 + .2byte EFFECT_SPECIAL_DEFENSE_UP_2 + .2byte EFFECT_ACCURACY_UP_2 + .2byte EFFECT_EVASION_UP_2 + .2byte EFFECT_ATTACK_DOWN_2 + .2byte EFFECT_DEFENSE_DOWN_2 + .2byte EFFECT_SPEED_DOWN_2 + .2byte EFFECT_SPECIAL_ATTACK_DOWN_2 + .2byte EFFECT_SPECIAL_DEFENSE_DOWN_2 + .2byte EFFECT_ACCURACY_DOWN_2 + .2byte EFFECT_EVASION_DOWN_2 + .2byte EFFECT_REFLECT + .2byte EFFECT_POISON + .2byte EFFECT_PARALYZE + .2byte EFFECT_SUBSTITUTE + .2byte EFFECT_LEECH_SEED + .2byte EFFECT_MINIMIZE + .2byte EFFECT_CURSE + .2byte EFFECT_SWAGGER + .2byte EFFECT_CAMOUFLAGE + .2byte EFFECT_YAWN + .2byte EFFECT_DEFENSE_CURL + .2byte EFFECT_TORMENT + .2byte EFFECT_FLATTER + .2byte EFFECT_WILL_O_WISP + .2byte EFFECT_INGRAIN + .2byte EFFECT_IMPRISON + .2byte EFFECT_TEETER_DANCE + .2byte EFFECT_TICKLE + .2byte EFFECT_COSMIC_POWER + .2byte EFFECT_BULK_UP + .2byte EFFECT_CALM_MIND + .2byte EFFECT_ACUPRESSURE + .2byte EFFECT_AUTOTOMIZE + .2byte EFFECT_SHIFT_GEAR + .2byte EFFECT_SHELL_SMASH + .2byte EFFECT_GROWTH + .2byte EFFECT_QUIVER_DANCE + .2byte EFFECT_ATTACK_SPATK_UP + .2byte EFFECT_ATTACK_ACCURACY_UP + .2byte EFFECT_PSYCHIC_TERRAIN + .2byte EFFECT_GRASSY_TERRAIN + .2byte EFFECT_ELECTRIC_TERRAIN + .2byte EFFECT_MISTY_TERRAIN + .2byte EFFECT_STEALTH_ROCK + .2byte EFFECT_TOXIC_SPIKES + .2byte EFFECT_TRICK_ROOM + .2byte EFFECT_WONDER_ROOM + .2byte EFFECT_MAGIC_ROOM + .2byte EFFECT_TAILWIND + .2byte EFFECT_DRAGON_DANCE + .2byte EFFECT_STICKY_WEB + .2byte EFFECT_RAIN_DANCE + .2byte EFFECT_SUNNY_DAY + .2byte EFFECT_SANDSTORM + .2byte EFFECT_HAIL + .2byte EFFECT_GEOMANCY + .2byte -1 AI_PreferStrongestMove: if_target_is_ally AI_Ret get_how_powerful_move_is - if_not_equal 0, AI_PreferStrongestMove_End + if_not_equal MOVE_POWER_BEST, AI_PreferStrongestMove_End if_random_less_than 100, AI_PreferStrongestMove_End score +2 - AI_PreferStrongestMove_End: end AI_Risky: if_target_is_ally AI_Ret get_considered_move_effect + if_move_flag FLAG_HIGH_CRIT, AI_Risky_RandChance if_not_in_bytes AI_Risky_EffectsToEncourage, AI_Risky_End +AI_Risky_RandChance: if_random_less_than 128, AI_Risky_End score +2 - AI_Risky_End: end @@ -2878,7 +3573,6 @@ AI_Risky_EffectsToEncourage: .byte EFFECT_EXPLOSION .byte EFFECT_MIRROR_MOVE .byte EFFECT_OHKO - .byte EFFECT_HIGH_CRITICAL .byte EFFECT_CONFUSE .byte EFFECT_METRONOME .byte EFFECT_PSYWAVE @@ -2894,42 +3588,59 @@ AI_Risky_EffectsToEncourage: .byte EFFECT_REVENGE .byte EFFECT_TEETER_DANCE .byte -1 + +.align 1 +sMovesTable_ProtectMoves: + .2byte MOVE_PROTECT + .2byte MOVE_DETECT + .2byte -1 + +.align 1 +sEffectsStatRaise: + .2byte EFFECT_ATTACK_UP + .2byte EFFECT_ATTACK_UP_2 + .2byte EFFECT_DEFENSE_UP + .2byte EFFECT_DEFENSE_UP_2 + .2byte EFFECT_SPEED_UP + .2byte EFFECT_SPEED_UP_2 + .2byte EFFECT_SPECIAL_ATTACK_UP + .2byte EFFECT_SPECIAL_ATTACK_UP_2 + .2byte EFFECT_SPECIAL_DEFENSE_UP + .2byte EFFECT_SPECIAL_DEFENSE_UP_2 + .2byte EFFECT_CALM_MIND + .2byte EFFECT_DRAGON_DANCE + .2byte EFFECT_ACUPRESSURE + .2byte EFFECT_SHELL_SMASH + .2byte EFFECT_SHIFT_GEAR + .2byte EFFECT_ATTACK_ACCURACY_UP + .2byte EFFECT_ATTACK_SPATK_UP + .2byte EFFECT_GROWTH + .2byte EFFECT_COIL + .2byte EFFECT_QUIVER_DANCE + .2byte -1 AI_PreferBatonPass: if_target_is_ally AI_Ret count_usable_party_mons AI_USER if_equal 0, AI_PreferBatonPassEnd get_how_powerful_move_is - if_not_equal 0, AI_PreferBatonPassEnd - if_has_move_with_effect AI_USER, EFFECT_BATON_PASS, AI_PreferBatonPass_GoForBatonPass - if_random_less_than 80, AI_Risky_End - -AI_PreferBatonPass_GoForBatonPass: - if_move MOVE_SWORDS_DANCE, AI_PreferBatonPass2 - if_move MOVE_DRAGON_DANCE, AI_PreferBatonPass2 - if_move MOVE_CALM_MIND, AI_PreferBatonPass2 - if_effect EFFECT_PROTECT, AI_PreferBatonPass_End + if_not_equal MOVE_POWER_DISCOURAGED, AI_PreferBatonPassEnd + if_doesnt_have_move_with_effect AI_USER, EFFECT_BATON_PASS, AI_PreferBatonPassEnd + get_considered_move_effect + if_in_hwords sEffectsStatRaise, AI_PreferBatonPass2 + if_effect EFFECT_PROTECT, AI_PreferBatonPass3 if_move MOVE_BATON_PASS, AI_PreferBatonPass_EncourageIfHighStats - if_random_less_than 20, AI_Risky_End - score +3 - + end AI_PreferBatonPass2: get_turn_count if_equal 0, Score_Plus5 if_hp_less_than AI_USER, 60, Score_Minus10 goto Score_Plus1 - -AI_PreferBatonPass_End: +AI_PreferBatonPass3: get_last_used_bank_move AI_USER if_in_hwords sMovesTable_ProtectMoves, Score_Minus2 score +2 end - -sMovesTable_ProtectMoves: - .2byte MOVE_PROTECT - .2byte MOVE_DETECT - .2byte -1 - AI_PreferBatonPass_EncourageIfHighStats: get_turn_count if_equal 0, Score_Minus2 @@ -2940,11 +3651,80 @@ AI_PreferBatonPass_EncourageIfHighStats: if_stat_level_more_than AI_USER, STAT_SPATK, DEFAULT_STAT_STAGE + 1, Score_Plus2 if_stat_level_more_than AI_USER, STAT_SPATK, DEFAULT_STAT_STAGE, Score_Plus1 end - AI_PreferBatonPassEnd: end - + +AI_ConsiderAllyChosenMove: + get_ally_chosen_move + if_equal 0, AI_ConsiderAllyChosenMoveRet + get_move_effect_from_result + if_equal EFFECT_HELPING_HAND, AI_PartnerChoseHelpingHand + if_equal EFFECT_PERISH_SONG, AI_PartnerChosePerishSong + if_equal EFFECT_ALWAYS_CRIT, AI_PartnerChoseAlwaysCrit +AI_ConsiderAllyChosenMoveRet: + end + +@ Ally decided to use Frost Breath on us. we must have Anger Point as our ability +AI_PartnerChoseAlwaysCrit: + if_no_ability AI_USER, ABILITY_ANGER_POINT, AI_PartnerChoseAlwaysCritEnd + @frost breath user should be faster + compare_speeds AI_USER, AI_USER_PARTNER + if_not_equal 1, AI_PartnerChoseAlwaysCritEnd + get_considered_move_effect + if_in_hwords sEffectsAtkRaise, Score_Minus3 + @encourage moves hitting multiple opponents + get_considered_move_power + if_equal 0, AI_PartnerChoseAlwaysCritEnd + get_considered_move_target + if_equal MOVE_TARGET_BOTH, Score_Plus3 + if_equal MOVE_TARGET_FOES_AND_ALLY, Score_Plus3 +AI_PartnerChoseAlwaysCritEnd: + end + +.align 1 +sEffectsAtkRaise: + .2byte EFFECT_ATTACK_ACCURACY_UP + .2byte EFFECT_ATTACK_UP + .2byte EFFECT_ATTACK_UP_2 + .2byte EFFECT_DRAGON_DANCE + .2byte EFFECT_COIL + .2byte EFFECT_BELLY_DRUM + .2byte EFFECT_BULK_UP + .2byte -1 + +AI_PartnerChoseHelpingHand: + @ Do not use a status move if you know your move's power will be boosted + get_considered_move_power + if_equal 0, Score_Minus5 + end + +AI_PartnerChosePerishSong: + if_status2 AI_TARGET, STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED, AI_Ret + get_considered_move_effect + if_equal EFFECT_MEAN_LOOK, Score_Plus1 + if_equal EFFECT_TRAP, Score_Plus1 + end + +AI_ConsiderAllyKnownMoves: + @ If ally already chose a move, there is nothing to do here. + get_ally_chosen_move + if_not_equal 0, AI_Ret + if_move MOVE_HELPING_HAND, AI_HelpingHandInDoubles + if_move MOVE_PERISH_SONG, AI_PerishSongInDoubles + end + +AI_HelpingHandInDoubles: + if_has_no_attacking_moves AI_USER_PARTNER, Score_Minus5 + end + +AI_PerishSongInDoubles: + if_has_move_with_effect AI_USER_PARTNER, EFFECT_MEAN_LOOK, Score_Plus1 + if_has_move_with_effect AI_USER_PARTNER, EFFECT_TRAP, Score_Plus1 + end + AI_DoubleBattle: + call AI_ConsiderAllyChosenMove + call AI_ConsiderAllyKnownMoves if_target_is_ally AI_TryOnAlly if_move MOVE_SKILL_SWAP, AI_DoubleBattleSkillSwap get_curr_move_type @@ -2959,7 +3739,7 @@ AI_DoubleBattle: AI_DoubleBattlePartnerHasHelpingHand: get_how_powerful_move_is - if_not_equal 0, Score_Plus1 + if_not_equal MOVE_POWER_DISCOURAGED, Score_Plus1 end AI_DoubleBattleCheckUserStatus: @@ -2970,7 +3750,7 @@ AI_DoubleBattleCheckUserStatus2: get_how_powerful_move_is if_equal MOVE_POWER_DISCOURAGED, Score_Minus5 score +1 - if_equal MOVE_MOST_POWERFUL, Score_Plus2 + if_equal MOVE_POWER_BEST, Score_Plus2 end AI_DoubleBattleAllHittingGroundMove: @@ -3008,20 +3788,30 @@ AI_DoubleBattleFireMove2: AI_TryOnAlly: get_how_powerful_move_is - if_equal 0, AI_TryStatusMoveOnAlly + if_equal MOVE_POWER_DISCOURAGED, AI_TryStatusMoveOnAlly get_curr_move_type if_equal TYPE_FIRE, AI_TryFireMoveOnAlly - + if_effect EFFECT_ALWAYS_CRIT, AI_TryCritAngerPointAlly AI_DiscourageOnAlly: goto Score_Minus30 AI_TryFireMoveOnAlly: if_ability AI_USER_PARTNER, ABILITY_FLASH_FIRE, AI_TryFireMoveOnAlly_FlashFire goto AI_DiscourageOnAlly - AI_TryFireMoveOnAlly_FlashFire: if_flash_fired AI_USER_PARTNER, AI_DiscourageOnAlly goto Score_Plus3 + +AI_TryCritAngerPointAlly: + get_ability AI_USER_PARTNER + if_not_equal ABILITY_ANGER_POINT, AI_DiscourageOnAlly + if_stat_level_more_than AI_USER_PARTNER, STAT_ATK, 8, AI_DiscourageOnAlly + if_status2 AI_USER_PARTNER, STATUS2_SUBSTITUTE, AI_DiscourageOnAlly + if_has_no_move_with_split AI_USER_PARTNER, SPLIT_PHYSICAL, AI_DiscourageOnAlly + get_curr_dmg_hp_percent + if_more_than 34,AI_DiscourageOnAlly + if_hp_less_than AI_USER_PARTNER, 60, AI_DiscourageOnAlly + goto Score_Plus3 AI_TryStatusMoveOnAlly: if_move MOVE_SKILL_SWAP, AI_TrySkillSwapOnAlly @@ -3029,7 +3819,7 @@ AI_TryStatusMoveOnAlly: if_move MOVE_TOXIC, AI_TryStatusOnAlly if_move MOVE_HELPING_HAND, AI_TryHelpingHandOnAlly if_move MOVE_SWAGGER, AI_TrySwaggerOnAlly - goto Score_Minus30_ + goto Score_Minus30 AI_TrySkillSwapOnAlly: get_ability AI_TARGET @@ -3037,7 +3827,7 @@ AI_TrySkillSwapOnAlly: get_ability AI_USER if_not_equal ABILITY_LEVITATE, AI_TrySkillSwapOnAlly2 get_ability AI_TARGET - if_equal ABILITY_LEVITATE, Score_Minus30_ + if_equal ABILITY_LEVITATE, Score_Minus30 get_target_type1 if_not_equal TYPE_ELECTRIC, AI_TrySkillSwapOnAlly2 score +1 @@ -3047,7 +3837,7 @@ AI_TrySkillSwapOnAlly: end AI_TrySkillSwapOnAlly2: - if_not_equal ABILITY_COMPOUND_EYES, Score_Minus30_ + if_not_equal ABILITY_COMPOUND_EYES, Score_Minus30 if_has_move AI_USER_PARTNER, MOVE_FIRE_BLAST, AI_TrySkillSwapOnAllyPlus3 if_has_move AI_USER_PARTNER, MOVE_THUNDER, AI_TrySkillSwapOnAllyPlus3 if_has_move AI_USER_PARTNER, MOVE_CROSS_CHOP, AI_TrySkillSwapOnAllyPlus3 @@ -3055,16 +3845,16 @@ AI_TrySkillSwapOnAlly2: if_has_move AI_USER_PARTNER, MOVE_DYNAMIC_PUNCH, AI_TrySkillSwapOnAllyPlus3 if_has_move AI_USER_PARTNER, MOVE_BLIZZARD, AI_TrySkillSwapOnAllyPlus3 if_has_move AI_USER_PARTNER, MOVE_MEGAHORN, AI_TrySkillSwapOnAllyPlus3 - goto Score_Minus30_ + goto Score_Minus30 AI_TrySkillSwapOnAllyPlus3: goto Score_Plus3 AI_TryStatusOnAlly: get_ability AI_TARGET - if_not_equal ABILITY_GUTS, Score_Minus30_ - if_status AI_TARGET, STATUS1_ANY, Score_Minus30_ - if_hp_less_than AI_USER, 91, Score_Minus30_ + if_not_equal ABILITY_GUTS, Score_Minus30 + if_status AI_TARGET, STATUS1_ANY, Score_Minus30 + if_hp_less_than AI_USER, 91, Score_Minus30 goto Score_Plus5 AI_TryHelpingHandOnAlly: @@ -3072,8 +3862,10 @@ AI_TryHelpingHandOnAlly: goto Score_Plus2 AI_TrySwaggerOnAlly: + if_has_no_physical_move AI_USER_PARTNER, Score_Minus30 if_holds_item AI_TARGET, ITEM_PERSIM_BERRY, AI_TrySwaggerOnAlly2 - goto Score_Minus30_ + if_ability AI_USER_PARTNER, ABILITY_OWN_TEMPO, AI_TrySwaggerOnAlly2 + goto Score_Minus30 AI_TrySwaggerOnAlly2: if_stat_level_more_than AI_TARGET, STAT_ATK, 7, AI_TrySwaggerOnAlly_End @@ -3082,10 +3874,6 @@ AI_TrySwaggerOnAlly2: AI_TrySwaggerOnAlly_End: end -Score_Minus30_: - score -30 - end - AI_HPAware: if_target_is_ally AI_TryOnAlly if_hp_more_than AI_USER, 70, AI_HPAware_UserHasHighHP @@ -3096,7 +3884,7 @@ AI_HPAware: AI_HPAware_UserHasHighHP: get_considered_move_effect - if_in_bytes AI_HPAware_DiscouragedEffectsWhenHighHP, AI_HPAware_TryToDiscourage + if_in_hwords AI_HPAware_DiscouragedEffectsWhenHighHP, AI_HPAware_TryToDiscourage goto AI_HPAware_ConsiderTarget AI_HPAware_UserHasMediumHP: @@ -3132,21 +3920,24 @@ AI_HPAware_TargetTryToDiscourage: AI_HPAware_End: end +.align 1 AI_HPAware_DiscouragedEffectsWhenHighHP: @ 82DE21F - .byte EFFECT_EXPLOSION - .byte EFFECT_RESTORE_HP - .byte EFFECT_REST - .byte EFFECT_DESTINY_BOND - .byte EFFECT_FLAIL - .byte EFFECT_ENDURE - .byte EFFECT_MORNING_SUN - .byte EFFECT_SYNTHESIS - .byte EFFECT_MOONLIGHT - .byte EFFECT_SOFTBOILED - .byte EFFECT_MEMENTO - .byte EFFECT_GRUDGE - .byte EFFECT_OVERHEAT - .byte -1 + .2byte EFFECT_EXPLOSION + .2byte EFFECT_RESTORE_HP + .2byte EFFECT_REST + .2byte EFFECT_DESTINY_BOND + .2byte EFFECT_FLAIL + .2byte EFFECT_ENDURE + .2byte EFFECT_MORNING_SUN + .2byte EFFECT_SYNTHESIS + .2byte EFFECT_MOONLIGHT + .2byte EFFECT_SHORE_UP + .2byte EFFECT_SOFTBOILED + .2byte EFFECT_ROOST + .2byte EFFECT_MEMENTO + .2byte EFFECT_GRUDGE + .2byte EFFECT_OVERHEAT + .2byte -1 AI_HPAware_DiscouragedEffectsWhenMediumHP: @ 82DE22D .byte EFFECT_EXPLOSION @@ -3310,7 +4101,6 @@ AI_HPAware_DiscouragedEffectsWhenTargetLowHP: @ 82DE2B1 .byte EFFECT_TOXIC .byte EFFECT_LIGHT_SCREEN .byte EFFECT_OHKO - .byte EFFECT_SUPER_FANG //Maybe supposed to be EFFECT_RAZOR_WIND .byte EFFECT_SUPER_FANG .byte EFFECT_MIST .byte EFFECT_FOCUS_ENERGY diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index b4bb339931..d7353fe6e8 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -370,6 +370,365 @@ gBattleAnims_Moves:: .4byte Move_WATER_PULSE .4byte Move_DOOM_DESIRE .4byte Move_PSYCHO_BOOST + .4byte Move_ROOST + .4byte Move_GRAVITY + .4byte Move_MIRACLE_EYE + .4byte Move_WAKE_UP_SLAP + .4byte Move_HAMMER_ARM + .4byte Move_GYRO_BALL + .4byte Move_HEALING_WISH + .4byte Move_BRINE + .4byte Move_NATURAL_GIFT + .4byte Move_FEINT + .4byte Move_PLUCK + .4byte Move_TAILWIND + .4byte Move_ACUPRESSURE + .4byte Move_METAL_BURST + .4byte Move_U_TURN + .4byte Move_CLOSE_COMBAT + .4byte Move_PAYBACK + .4byte Move_ASSURANCE + .4byte Move_EMBARGO + .4byte Move_FLING + .4byte Move_PSYCHO_SHIFT + .4byte Move_TRUMP_CARD + .4byte Move_HEAL_BLOCK + .4byte Move_WRING_OUT + .4byte Move_POWER_TRICK + .4byte Move_GASTRO_ACID + .4byte Move_LUCKY_CHANT + .4byte Move_ME_FIRST + .4byte Move_COPYCAT + .4byte Move_POWER_SWAP + .4byte Move_GUARD_SWAP + .4byte Move_PUNISHMENT + .4byte Move_LAST_RESORT + .4byte Move_WORRY_SEED + .4byte Move_SUCKER_PUNCH + .4byte Move_TOXIC_SPIKES + .4byte Move_HEART_SWAP + .4byte Move_AQUA_RING + .4byte Move_MAGNET_RISE + .4byte Move_FLARE_BLITZ + .4byte Move_FORCE_PALM + .4byte Move_AURA_SPHERE + .4byte Move_ROCK_POLISH + .4byte Move_POISON_JAB + .4byte Move_DARK_PULSE + .4byte Move_NIGHT_SLASH + .4byte Move_AQUA_TAIL + .4byte Move_SEED_BOMB + .4byte Move_AIR_SLASH + .4byte Move_XSCISSOR + .4byte Move_BUG_BUZZ + .4byte Move_DRAGON_PULSE + .4byte Move_DRAGON_RUSH + .4byte Move_POWER_GEM + .4byte Move_DRAIN_PUNCH + .4byte Move_VACUUM_WAVE + .4byte Move_FOCUS_BLAST + .4byte Move_ENERGY_BALL + .4byte Move_BRAVE_BIRD + .4byte Move_EARTH_POWER + .4byte Move_SWITCHEROO + .4byte Move_GIGA_IMPACT + .4byte Move_NASTY_PLOT + .4byte Move_BULLET_PUNCH + .4byte Move_AVALANCHE + .4byte Move_ICE_SHARD + .4byte Move_SHADOW_CLAW + .4byte Move_THUNDER_FANG + .4byte Move_ICE_FANG + .4byte Move_FIRE_FANG + .4byte Move_SHADOW_SNEAK + .4byte Move_MUD_BOMB + .4byte Move_PSYCHO_CUT + .4byte Move_ZEN_HEADBUTT + .4byte Move_MIRROR_SHOT + .4byte Move_FLASH_CANNON + .4byte Move_ROCK_CLIMB + .4byte Move_DEFOG + .4byte Move_TRICK_ROOM + .4byte Move_DRACO_METEOR + .4byte Move_DISCHARGE + .4byte Move_LAVA_PLUME + .4byte Move_LEAF_STORM + .4byte Move_POWER_WHIP + .4byte Move_ROCK_WRECKER + .4byte Move_CROSS_POISON + .4byte Move_GUNK_SHOT + .4byte Move_IRON_HEAD + .4byte Move_MAGNET_BOMB + .4byte Move_STONE_EDGE + .4byte Move_CAPTIVATE + .4byte Move_STEALTH_ROCK + .4byte Move_GRASS_KNOT + .4byte Move_CHATTER + .4byte Move_JUDGMENT + .4byte Move_BUG_BITE + .4byte Move_CHARGE_BEAM + .4byte Move_WOOD_HAMMER + .4byte Move_AQUA_JET + .4byte Move_ATTACK_ORDER + .4byte Move_DEFEND_ORDER + .4byte Move_HEAL_ORDER + .4byte Move_HEAD_SMASH + .4byte Move_DOUBLE_HIT + .4byte Move_ROAR_OF_TIME + .4byte Move_SPECIAL_REND + .4byte Move_LUNAR_DANCE + .4byte Move_CRUSH_GRIP + .4byte Move_MAGMA_STORM + .4byte Move_DARK_VOID + .4byte Move_SEED_FLARE + .4byte Move_OMINOUS_WIND + .4byte Move_SHADOW_FORCE + .4byte Move_HONE_CLAWS + .4byte Move_WIDE_GUARD + .4byte Move_GUARD_SPLIT + .4byte Move_POWER_SPLIT + .4byte Move_WONDER_ROOM + .4byte Move_PSYSHOCK + .4byte Move_VENOSHOCK + .4byte Move_AUTOTOMIZE + .4byte Move_RAGE_POWDER + .4byte Move_TELEKINESIS + .4byte Move_MAGIC_ROOM + .4byte Move_SMACK_DOWN + .4byte Move_STORM_THROW + .4byte Move_FLAME_BURST + .4byte Move_SLUDGE_WAVE + .4byte Move_QUIVER_DANCE + .4byte Move_HEAVY_SLAM + .4byte Move_SYCHRONOISE + .4byte Move_ELECTRO_BALL + .4byte Move_SOAK + .4byte Move_FLAME_CHARGE + .4byte Move_COIL + .4byte Move_LOW_SWEEP + .4byte Move_ACID_SPRAY + .4byte Move_FOUL_PLAY + .4byte Move_SIMPLE_BEAM + .4byte Move_ENTRAINMENT + .4byte Move_AFTER_YOU + .4byte Move_ROUND + .4byte Move_ECHOED_VOICE + .4byte Move_CHIP_AWAY + .4byte Move_CLEAR_SMOG + .4byte Move_STORED_POWER + .4byte Move_QUICK_GUARD + .4byte Move_ALLY_SWITCH + .4byte Move_SCALD + .4byte Move_SHELL_SMASH + .4byte Move_HEAL_PULSE + .4byte Move_HEX + .4byte Move_SKY_DROP + .4byte Move_SHIFT_GEAR + .4byte Move_CIRCLE_THROW + .4byte Move_INCINERATE + .4byte Move_QUASH + .4byte Move_ACROBATICS + .4byte Move_REFLECT_TYPE + .4byte Move_RETALITATE + .4byte Move_FINAL_GAMBIT + .4byte Move_BESTOW + .4byte Move_INFERNO + .4byte Move_WATER_PLEDGE + .4byte Move_FIRE_PLEDGE + .4byte Move_GRASS_PLEDGE + .4byte Move_VOLT_SWITCH + .4byte Move_STRUGGLE_BUG + .4byte Move_BULLDOZE + .4byte Move_FROST_BREATH + .4byte Move_DRAGON_TAIL + .4byte Move_WORK_UP + .4byte Move_ELECTROWEB + .4byte Move_WILD_CHARGE + .4byte Move_DRILL_RUN + .4byte Move_DUAL_CHOP + .4byte Move_HEART_STAMP + .4byte Move_HORN_LEECH + .4byte Move_SACRED_SWORD + .4byte Move_RAZOR_SHELL + .4byte Move_HEAT_CRASH + .4byte Move_LEAF_TORNADO + .4byte Move_STEAMROLLER + .4byte Move_COTTON_GUARD + .4byte Move_NIGHT_DAZE + .4byte Move_PSYSTRIKE + .4byte Move_TAIL_SLAP + .4byte Move_HURRICANE + .4byte Move_HEAD_CHARGE + .4byte Move_GEAR_GRIND + .4byte Move_SEARING_SHOT + .4byte Move_TECHNO_BLAST + .4byte Move_RELIC_SONG + .4byte Move_SECRET_SWORD + .4byte Move_GLACIATE + .4byte Move_BOLT_STRIKE + .4byte Move_BLUE_FLARE + .4byte Move_FIERY_DANCE + .4byte Move_FREEZE_SHOCK + .4byte Move_ICE_BURN + .4byte Move_SNARL + .4byte Move_ICICLE_CRASH + .4byte Move_V_CREATE + .4byte Move_FUSION_FLARE + .4byte Move_FUSION_BOLT + .4byte Move_FLYING_PRESS + .4byte Move_MAT_BLOCK + .4byte Move_BELCH + .4byte Move_ROTOTILLER + .4byte Move_STICKY_WEB + .4byte Move_FELL_STINGER + .4byte Move_PHANTOM_FORCE + .4byte Move_TRICK_OR_TREAT + .4byte Move_NOBLE_ROAR + .4byte Move_ION_DELUGE + .4byte Move_PARABOLIC_CHARGE + .4byte Move_FORESTS_CURSE + .4byte Move_PETAL_BLIZZARD + .4byte Move_FREEZE_DRY + .4byte Move_DISARMING_VOICE + .4byte Move_PARTING_SHOT + .4byte Move_TOPSY_TURVY + .4byte Move_DRAINING_KISS + .4byte Move_CRAFTY_SHIELD + .4byte Move_FLOWER_SHIELD + .4byte Move_GRASSY_TERRAIN + .4byte Move_MISTY_TERRAIN + .4byte Move_ELECTRIFY + .4byte Move_PLAY_ROUGH + .4byte Move_FAIRY_WIND + .4byte Move_MOONBLAST + .4byte Move_BOOMBURST + .4byte Move_FAIRY_LOCK + .4byte Move_KINGS_SHIELD + .4byte Move_PLAY_NICE + .4byte Move_CONFIDE + .4byte Move_DIAMOND_STORM + .4byte Move_STEAM_ERUPTION + .4byte Move_HYPERSPACE_HOLE + .4byte Move_WATER_SHURIKEN + .4byte Move_MYSTICAL_FIRE + .4byte Move_SPIKY_SHIELD + .4byte Move_AROMATIC_MIST + .4byte Move_EERIE_IMPULSE + .4byte Move_VENOM_DRENCH + .4byte Move_POWDER + .4byte Move_GEOMANCY + .4byte Move_MAGNETIC_FLUX + .4byte Move_HAPPY_HOUR + .4byte Move_ELECTRIC_TERRAIN + .4byte Move_DAZZLING_GLEAM + .4byte Move_CELEBRATE + .4byte Move_HOLD_HANDS + .4byte Move_BABY_DOLL_EYES + .4byte Move_NUZZLE + .4byte Move_HOLD_BACK + .4byte Move_INFESTATION + .4byte Move_POWER_UP_PUNCH + .4byte Move_OBLIVION_WING + .4byte Move_THOUSAND_ARROWS + .4byte Move_THOUSAND_WAVES + .4byte Move_LANDS_WRATH + .4byte Move_LIGHT_OF_RUIN + .4byte Move_ORIGIN_PULSE + .4byte Move_PRECIPICE_BLADES + .4byte Move_DRAGON_ASCENT + .4byte Move_HYPERSPACE_FURY +@@@@@@@@@@@@ GEN 7 @@@@@@@@@@@@ + .4byte Move_SHORE_UP + .4byte Move_FIRST_IMPRESSION + .4byte Move_BANEFUL_BUNKER + .4byte Move_SPIRIT_SHACKLE + .4byte Move_DARKEST_LARIAT + .4byte Move_SPARKLING_ARIA + .4byte Move_ICE_HAMMER + .4byte Move_FLORAL_HEALING + .4byte Move_HIGH_HORSEPOWER + .4byte Move_STRENGTH_SAP + .4byte Move_SOLAR_BLADE + .4byte Move_LEAFAGE + .4byte Move_SPOTLIGHT + .4byte Move_TOXIC_THREAD + .4byte Move_LASER_FOCUS + .4byte Move_GEAR_UP + .4byte Move_THROAT_CHOP + .4byte Move_POLLEN_PUFF + .4byte Move_ANCHOR_SHOT + .4byte Move_PSYCHIC_TERRAIN + .4byte Move_LUNGE + .4byte Move_FIRE_LASH + .4byte Move_POWER_TRIP + .4byte Move_BURN_UP + .4byte Move_SPEED_SWAP + .4byte Move_SMART_STRIKE + .4byte Move_PURIFY + .4byte Move_REVELATION_DANCE + .4byte Move_CORE_ENFORCER + .4byte Move_TROP_KICK + .4byte Move_INSTRUCT + .4byte Move_BEAK_BLAST + .4byte Move_CLANGING_SCALES + .4byte Move_DRAGON_HAMMER + .4byte Move_BRUTAL_SWING + .4byte Move_AURORA_VEIL + .4byte Move_SHELL_TRAP + .4byte Move_FLEUR_CANNON + .4byte Move_PSYCHIC_FANGS + .4byte Move_STOMPING_TANTRUM + .4byte Move_SHADOW_BONE + .4byte Move_ACCELEROCK + .4byte Move_LIQUIDATION + .4byte Move_PRISMATIC_LASER + .4byte Move_SPECTRAL_THIEF + .4byte Move_SUNSTEEL_STRIKE + .4byte Move_MOONGEIST_BEAM + .4byte Move_TEARFUL_LOOK + .4byte Move_ZING_ZAP + .4byte Move_NATURES_MADNESS + .4byte Move_MULTI_ATTACK + .4byte Move_MIND_BLOWN + .4byte Move_PLASMA_FISTS + .4byte Move_PHOTON_GEYSER + .4byte Move_DOUBLE_IRON_BASH +@@@@@@@@@@@@ GEN 8 @@@@@@@@@@@@ + .4byte Move_DYNAMAX_CANNON + .4byte Move_SNIPE_SHOT + .4byte Move_JAW_LOCK + .4byte Move_STUFF_CHEEKS + .4byte Move_NO_RETREAT + .4byte Move_TAR_SHOT + .4byte Move_MAGIC_POWDER + .4byte Move_DRAGON_DARTS + .4byte Move_TEA_TIME + .4byte Move_OCTOLOCK + .4byte Move_BOLT_BEAK + .4byte Move_FISHIOUS_REND + .4byte Move_COURT_CHANGE + .4byte Move_CLANGOROUS_SOUL + .4byte Move_BODY_PRESS + .4byte Move_DECORATE + .4byte Move_DRUM_BEATING + .4byte Move_SNAP_TRAP + .4byte Move_PYRO_BALL + .4byte Move_BEHEMOTH_BLADE + .4byte Move_BEHEMOTH_BASH + .4byte Move_AURA_WHEEL + .4byte Move_BREAKING_SWIPE + .4byte Move_BRANCH_POKE + .4byte Move_OVERDRIVE + .4byte Move_APPLE_ACID + .4byte Move_GRAV_APPLE + .4byte Move_SPIRIT_BREAK + .4byte Move_STRANGE_STEAM + .4byte Move_LIFE_DEW + .4byte Move_OBSTRUCT + .4byte Move_FALSE_SURRENDER + .4byte Move_METEOR_ASSAULT + .4byte Move_ETERNA_BEAM + .4byte Move_STEEL_BEAM .4byte Move_COUNT @ cannot be reached, because last move is Psycho Boost .align 2 @@ -383,7 +742,8 @@ gBattleAnims_StatusConditions:: .4byte Status_Freeze .4byte Status_Curse .4byte Status_Nightmare - + .4byte Status_Powder + .align 2 gBattleAnims_General:: .4byte General_CastformChange @@ -409,6 +769,14 @@ gBattleAnims_General:: .4byte General_FocusPunchSetUp .4byte General_IngrainHeal .4byte General_WishHeal + .4byte General_MegaEvolution + .4byte General_TerrainMisty + .4byte General_TerrainGrassy + .4byte General_TerrainElectric + .4byte General_TerrainPsychic + .4byte General_IllusionOff + .4byte General_FormChange + .4byte General_SlideOffScreen .align 2 gBattleAnims_Special:: @@ -419,7 +787,13268 @@ gBattleAnims_Special:: .4byte Special_BallThrowWithTrainer @ B_ANIM_BALL_THROW_WITH_TRAINER .4byte Special_SubstituteToMon @ B_ANIM_SUBSTITUTE_TO_MON .4byte Special_MonToSubstitute @ B_ANIM_MON_TO_SUBSTITUTE + .4byte Special_CriticalCaptureBallThrow @ B_ANIM_CRITICAL_CAPTURE_THROW +Move_ROOST: + loadspritegfx ANIM_TAG_WHITE_FEATHER + loadspritegfx ANIM_TAG_BLUE_STAR + monbg ANIM_ATTACKER + monbgprio_29 + playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_TARGET + delay 0 + createsprite gFallingFeatherSpriteTemplate, ANIM_ATTACKER, 0, 0, -16, 64, 2, 104, 11304, 32, 1 + delay 6 + createsprite gFallingFeatherSpriteTemplate, ANIM_ATTACKER, 0, 0, -16, 32, 2, 104, 11304, 32, 1 + createsprite gFallingFeatherSpriteTemplate, ANIM_ATTACKER, 0, 0, -16, 0, 2, 104, 11304, 32, 1 + delay 6 + createsprite gFallingFeatherSpriteTemplate, ANIM_ATTACKER, 0, 0, -16, 224, 2, 104, 11304, 32, 1 + createsprite gFallingFeatherSpriteTemplate, ANIM_ATTACKER, 0, 0, -16, 128, 2, 104, 11304, 32, 1 + delay 6 + createsprite gFallingFeatherSpriteTemplate, ANIM_ATTACKER, 0, 0, -16, 192, 2, 104, 11304, 32, 1 + createsprite gFallingFeatherSpriteTemplate, ANIM_ATTACKER, 0, 0, -16, 160, 2, 104, 11304, 32, 1 + delay 6 + createsprite gFallingFeatherSpriteTemplate, ANIM_ATTACKER, 0, 0, -16, 96, 2, 104, 11304, 32, 1 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + call HealingEffect + waitforvisualfinish + end + +Move_GRAVITY: + fadetobg BG_COSMIC + waitbgfadein + playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER + createvisualtask AnimTask_ShakeAndSinkMon, 5, ANIM_ATTACKER, 2, 0, 96, 30 + createvisualtask AnimTask_ShakeAndSinkMon, 5, ANIM_DEF_PARTNER, 2, 0, 96, 30 + createvisualtask AnimTask_ShakeAndSinkMon, 5, ANIM_ATK_PARTNER, 2, 0, 96, 30 + createvisualtask AnimTask_ShakeAndSinkMon, 5, ANIM_TARGET, 2, 0, 96, 30 + waitforvisualfinish + restorebg + waitbgfadeout + createvisualtask AnimTask_ShakeMon, 2, ANIM_ATTACKER, 3, 0, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_ATK_PARTNER, 3, 0, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 3, 0, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 1, 1 + setarg 0x7, 0xffff + waitbgfadein + waitforvisualfinish + end + +Move_MIRACLE_EYE: + loadspritegfx ANIM_TAG_TEAL_ALERT + loadspritegfx ANIM_TAG_OPENING_EYE + loadspritegfx ANIM_TAG_ROUND_WHITE_HALO + monbg ANIM_DEF_PARTNER + call SetPsychicBackground + playsewithpan SE_M_CONFUSE_RAY, SOUND_PAN_TARGET + createsprite gOpeningEyeSpriteTemplate, ANIM_ATTACKER, 5, 0, 0, 1, 0 + createsprite gWhiteHaloSpriteTemplate, ANIM_ATTACKER, 5 + delay 40 + playsewithpan SE_M_LEER, SOUND_PAN_TARGET + createvisualtask AnimTask_BlendColorCycle, 2, 1, 1, 2, 0, 10, RGB_BLACK + call MindReaderEyeSpikeEffect + waitforvisualfinish + call UnsetPsychicBg + clearmonbg ANIM_DEF_PARTNER + end + +Move_WAKE_UP_SLAP: + loadspritegfx ANIM_TAG_HANDS_AND_FEET + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_SMELLINGSALT_EFFECT + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET + createsprite gKarateChopSpriteTemplate, ANIM_ATTACKER, 2, -16, 0, 0, 0, 10, 1, 3, 0 + waitforvisualfinish + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTCKER, 3, 0, 0, 1, 2 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 2 + waitforvisualfinish + createsprite gSmellingSaltExclamationSpriteTemplate, ANIM_TARGET, 2, 1, 8, 3 + loopsewithpan SE_M_SWAGGER2, +63, 16, 3 + clearmonbg ANIM_DEF_PARTNER + blendoff + end + +Move_HAMMER_ARM: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_ROCKS + loadspritegfx ANIM_TAG_SLAM_HIT + monbg ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_ATTACKER + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 3, 0, 4 + delay 1 + createsprite gSlamHitSpriteTemplate, ANIM_ATTCKER, 2, 0, 0 + delay 3 + setarg 7, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 10, -8, 1, 1 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 5, 1 + createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, -12, 32, 3, 4 + createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, 8, 31, 2, 2 + createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, -4, 28, 2, 3 + createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, 12, 30, 4, 3 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_TARGET, 2, 0, 0, 5 + clearmonbg ANIM_TARGET + blendoff + end + +Move_GYRO_BALL: + loadspritegfx ANIM_TAG_IMPACT + loopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 28, 2 + createvisualtask AnimTask_MetallicShine, 5, 0, 0, 0 + waitforvisualfinish + playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER + waitplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 8 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 2, 4 + waitforvisualfinish + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + delay 3 + waitforvisualfinish + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, 1, 0 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -32, 0, 0, 3 + waitforvisualfinish + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, 0, 0 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, 1, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 4, 0, 12, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 + waitforvisualfinish + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, 0, 1 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, 1, 1 + waitforvisualfinish + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 + delay 3 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7 + waitforvisualfinish + end + +Move_HEALING_WISH: + loadspritegfx ANIM_TAG_GREEN_SPARKLE + setalpha 0, 16 + createvisualtask AnimTask_AlphaFadeIn, 3, 0, 16, 16, 0, 1 + playsewithpan SE_M_MOONLIGHT, 0 + delay 30 + createsprite gMoonlightSparkleSpriteTemplate, ANIM_ATTACKER, 40, -12, 0 + delay 30 + createsprite gMoonlightSparkleSpriteTemplate, ANIM_ATTACKER, 40, -24, 0 + delay 30 + createsprite gMoonlightSparkleSpriteTemplate, ANIM_ATTACKER, 40, 21, 0 + delay 30 + createsprite gMoonlightSparkleSpriteTemplate, ANIM_ATTACKER, 40, 0, 0 + delay 30 + createsprite gMoonlightSparkleSpriteTemplate, ANIM_ATTACKER, 40, 10, 0 + delay 20 + createvisualtask AnimTask_MoonlightEndFade, 2 + waitforvisualfinish + end + +Move_BRINE: + loadspritegfx ANIM_TAG_GLOWY_BLUE_ORB + loadspritegfx ANIM_TAG_WATER_IMPACT + monbg ANIM_DEF_PARTNER + setalpha 12, 8 + playsewithpan SE_M_DIVE, -64 + waitforvisualfinish + delay 16 + createvisualtask AnimTask_WaterSpoutRain, 5 + playsewithpan SE_M_SURF, +63 + clearmonbg ANIM_DEF_PARTNER + blendoff + end + +Move_NATURAL_GIFT: + loadspritegfx ANIM_TAG_SPARKLE_2 + loadspritegfx ANIM_TAG_HOLLOW_ORB + monbg ANIM_ATTACKER + monbgprio_28 ANIM_ATTACKER + createvisualtask AnimTask_BlendColorCycle, 2, 2, 2, 2, 0, 16, RGB(27, 31, 18) + playsewithpan SE_M_MEGA_KICK, -64 + call GrantingStarsEffect + waitforvisualfinish + delay 1 + createvisualtask AnimTask_DragonDanceWaver, 5 + playsewithpan SE_M_TELEPORT, -64 + delay 8 + createvisualtask AnimTask_BlendPalInAndOutByTag, 5, 10249, 19456, 14, 0, 3 + createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 0 + createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 43 + createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 85 + createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 128 + createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 170 + createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 213 + delay 30 + playsewithpan SE_M_TELEPORT, -64 + delay 30 + playsewithpan SE_M_TELEPORT, -64 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + delay 1 + end + +Move_FEINT: + loadspritegfx ANIM_TAG_FEINT + createsprite gFeintSwipeSpriteTemplate, ANIM_ATTACKER, 10, -32, 0, 15 + playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER + delay 15 + playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER + delay 15 + waitforvisualfinish + delay 5 + createsprite gFeintZoomSpriteTemplate, ANIM_ATTACKER, 10, 0, 0 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + waitforvisualfinish + end + +Move_PLUCK: + loadspritegfx ANIM_TAG_SEED_BROWN + loadspritegfx ANIM_TAG_IMPACT + playsewithpan SE_M_POISON_POWDER, SOUND_PAN_ATTACKER + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 40, -10, -5, 1, 2 + createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 40, 3, 0, 20, 2, 1 + createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 40, 7, 1, 20, 1, 1 + createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 40, -3, 5, 25, 2, -1 + createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 40, 4, -4, 30, 3, -1 + delay 30 + playsewithpan SE_M_POISON_POWDER, SOUND_PAN_ATTACKER + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 40, 5, 10, 1, 2 + createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 40, 3, -4, 20, 1, 1 + createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 40, 7, -6, 20, 0, 1 + createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 40, -3, -9, 25, 1, -1 + createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 40, 4, -4, 30, 2, -1 + delay 30 + playsewithpan SE_M_POISON_POWDER, SOUND_PAN_ATTACKER + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 40, 0, 0, 1, 2 + createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 40, -3, -4, 20, 1, 1 + createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 40, 7, -6, 25, 0, 1 + createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 40, -4, -10, 25, 1, 1 + createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 40, 4, -4, 25, 1, 2 + waitforvisualfinish + end + +Move_TAILWIND: + loadspritegfx ANIM_TAG_FLYING_DIRT + playsewithpan SE_M_GUST, SOUND_PAN_ATTACKER + call SetHighSpeedBg + monbg ANIM_ATK_PARTNER + setalpha 12, 8 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 4, 4 + createvisualtask AnimTask_TraceMonBlended, 2, 0, 4, 7, 10 + playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 10, 2304, 96, 0 + delay 12 + playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 90, 2048, 96, 0 + delay 12 + playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 50, 2560, 96, 0 + delay 12 + playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 20, 2304, 96, 0 + delay 12 + playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 70, 1984, 96, 0 + delay 12 + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 0, 2816, 96, 0 + delay 10 + createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 60, 2560, 96, 0 + waitforvisualfinish + stopsound + call UnsetHighSpeedBg + clearmonbg ANIM_ATK_PARTNER + blendoff + delay 1 + end + +Move_ACUPRESSURE: + loadspritegfx ANIM_TAG_ACCUPRESSURE + loadspritegfx ANIM_TAG_SPARK_2 + createsprite gAccupressureSpriteTemplate, ANIM_ATTACKER, 40, 0, -40, 40 + waitforvisualfinish + call ElectricityEffect + end + +Move_METAL_BURST: + loadspritegfx ANIM_TAG_ECLIPSING_ORB + loadspritegfx ANIM_TAG_RED_ORB + loopsewithpan SE_M_TRI_ATTACK, -64, 18, 3 + createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, ANIM_ATTACKER, 0 + createvisualtask AnimTask_DefenseCurlDeformMon, 5 + waitforvisualfinish + setarg 7, -1 + playsewithpan SE_M_REFLECT, -64 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0 + createsprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 0 + createsprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 32 + createsprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 64 + createsprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 96 + createsprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 128 + createsprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 160 + createsprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 20, 192 + createsprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 224 + waitforvisualfinish + createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, ANIM_ATTACKER, 1 + waitforvisualfinish + end + +Move_U_TURN: + loadspritegfx ANIM_TAG_ROUND_SHADOW + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_DEF_PARTNER + setalpha 12, 8 + playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER + createsprite gFlyBallUpSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 13, 336 + playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER + createvisualtask AnimTask_CanBattlerSwitch, 1, ANIM_ATTACKER + jumpretfalse UTurnVisible + createsprite gFlyBallAttackSpriteTemplate, ANIM_ATTACKER, 2, 20, TRUE +UTurnContinue: + delay 20 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 0 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + createvisualtask AnimTask_CanBattlerSwitch, 1, ANIM_ATTACKER + jumpretfalse UTurnLast + invisible ANIM_ATTACKER +UTurnLast: + blendoff + waitforvisualfinish + end +UTurnVisible: + createsprite gFlyBallAttackSpriteTemplate, ANIM_ATTACKER, 2, 20, FALSE + goto UTurnContinue + +Move_CLOSE_COMBAT: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_HANDS_AND_FEET + call SetHighSpeedBg + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 + playsewithpan SE_M_COMET_PUNCH, +63 + delay 10 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 + playsewithpan SE_M_VITAL_THROW2, +63 + delay 10 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 + playsewithpan SE_M_MEGA_KICK2, +63 + delay 10 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 + playsewithpan SE_M_COMET_PUNCH, +63 + delay 10 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 + playsewithpan SE_M_VITAL_THROW2, +63 + delay 10 + createsprite gFistFootRandomPosSpriteTemplate, ANIM_TARGET, 3, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 + playsewithpan SE_M_MEGA_KICK2, +63 + delay 10 + call UnsetHighSpeedBg + clearmonbg ANIM_TARGET + blendoff + delay 1 + setarg 7, 0x1000 + delay 1 + end + +Move_PAYBACK: + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_TARGET + fadetobg BG_DARK + waitbgfadein + delay 0 + setalpha 12, 8 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 30, 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 0 + playsewithpan SE_M_COMET_PUNCH, +63 + delay 5 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 24, 8, 1, 0 + playsewithpan SE_M_COMET_PUNCH, +63 + delay 5 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -24, -16, 1, 0 + playsewithpan SE_M_COMET_PUNCH, +63 + delay 5 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 8, 4, 1, 0 + playsewithpan SE_M_COMET_PUNCH, +63 + delay 5 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -16, 19, 1, 0 + playsewithpan SE_M_COMET_PUNCH, +63 + delay 5 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 18, -18, 1, 0 + playsewithpan SE_M_COMET_PUNCH, +63 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + restorebg + waitbgfadein + end + +Move_ASSURANCE: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_PURPLE_HAND_OUTLINE + monbg ANIM_TARGET + fadetobg BG_DARK + waitbgfadein + delay 0 + setalpha 12, 8 + createsprite gPalmSpriteTemplate, ANIM_TARGET, 3, 0, 0, 8, 1, 0 + playsewithpan SE_M_VITAL_THROW2, -64 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, 1, 1 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + delay 0 + restorebg + waitbgfadein + end + +Move_EMBARGO: + loadspritegfx ANIM_TAG_RED_ORB + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + loopsewithpan SE_M_POISON_POWDER, +63, 18, 10 + call EmbargoOrbs1 + call EmbargoOrbs1 + call EmbargoOrbs1 + waitforvisualfinish + createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 10, 1 + playsewithpan SE_M_NIGHTMARE, +63 + clearmonbg ANIM_DEF_PARTNER + end +EmbargoOrbs1: + createsprite gPowerOrbs_Float, ANIM_ATTACKER, 2, 0, -20, 85, 80, 0 + delay 12 + createsprite gPowerOrbs_Float, ANIM_ATTACKER, 2, 0, -10, 170, 80, 0 + delay 12 + createsprite gPowerOrbs_Float, ANIM_ATTACKER, 2, 0, -15, 0, 80, 0 + delay 12 + return + +Move_FLING: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_BLACK_BALL + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + createsprite gBlackBallSpriteTemplate, ANIM_TARGET, 2, 20, 0, 0, 0, 35, -25 + playsewithpan SE_M_SWAGGER, -64 + waitforvisualfinish + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_VITAL_THROW, +63 + clearmonbg ANIM_DEF_PARTNER + blendoff + end + +Move_PSYCHO_SHIFT: + loadspritegfx ANIM_TAG_ELECTRIC_ORBS + loadspritegfx ANIM_TAG_HOLLOW_ORB + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT + loadspritegfx ANIM_TAG_THIN_RING + monbg ANIM_ATTACKER + setalpha 12, 8 + playsewithpan SE_M_MEGA_KICK, -64 + createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 0 + delay 30 + waitforvisualfinish + createsprite gThinRingShrinkingSpriteTemplate, ANIM_ATTACKER, 40, 0, 0, 1, 0 + playsewithpan SE_M_SUPERSONIC, -64 + delay 14 + createsprite gThinRingShrinkingSpriteTemplate, ANIM_ATTACKER, 40, 0, 0, 1, 0 + playsewithpan SE_M_SUPERSONIC, -64 + delay 14 + createsprite gThinRingShrinkingSpriteTemplate, ANIM_ATTACKER, 40, 0, 0, 1, 0 + playsewithpan SE_M_SUPERSONIC, -64 + waitforvisualfinish + clearmonbg ANIM_ATK_PARTNER + end + clearmonbg ANIM_ATTACKER + blendoff + end + +Move_TRUMP_CARD: + loadspritegfx ANIM_TAG_TRUMP_CARD + loadspritegfx ANIM_TAG_CUT + loadspritegfx ANIM_TAG_TRUMP_CARD_PARTICLES + monbg ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_TARGET + createsprite gTrumpCardSpriteTemplate, ANIM_ATTACKER, 40, 40, 0, 0, 32 + delay 2 + createsprite gTrumpCardSpriteTemplate, ANIM_ATTACKER, 40, 40, 0, 1, 32 + delay 2 + playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_TARGET + createsprite gTrumpCardSpriteTemplate, ANIM_ATTACKER, 40, 40, 0, 0, 32 + delay 2 + createsprite gTrumpCardSpriteTemplate, ANIM_ATTACKER, 40, 40, 0, 2, 32 + delay 2 + playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_TARGET + createsprite gTrumpCardSpriteTemplate, ANIM_ATTACKER, 40, 40, 0, 2, 32 + delay 2 + createsprite gTrumpCardSpriteTemplate, ANIM_ATTACKER, 40, 40, 0, 2, 32 + delay 2 + playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_TARGET + playsewithpan SE_M_CUT, SOUND_PAN_TARGET + createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 0 + createsprite gTrumpCardSpriteTemplate, ANIM_ATTACKER, 40, 40, 0, 1, 32 + delay 2 + createsprite gTrumpCardSpriteTemplate, ANIM_ATTACKER, 40, 40, 0, 1, 32 + delay 3 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1 + createsprite gTrumpCardParticleSpriteTempalte, ANIM_ATTACKER, 40, 0, 0, 1, 12, -5, -4, 0 + createsprite gTrumpCardParticleSpriteTempalte, ANIM_ATTACKER, 40, 0, 0, 0, 13, 5, 4, 1 + createsprite gTrumpCardParticleSpriteTempalte, ANIM_ATTACKER, 40, 0, 0, 1, 8, -3, 0, 2 + createsprite gTrumpCardParticleSpriteTempalte, ANIM_ATTACKER, 40, 0, 0, 2, 12, -5, 4, 3 + delay 2 + createsprite gTrumpCardParticleSpriteTempalte, ANIM_ATTACKER, 40, 0, 0, 1, 10, 1, -4, 4 + createsprite gTrumpCardParticleSpriteTempalte, ANIM_ATTACKER, 40, 0, 0, 0, 13, 5, 6, 1 + createsprite gTrumpCardParticleSpriteTempalte, ANIM_ATTACKER, 40, 0, 0, 1, 12, -2, 1, 3 + createsprite gTrumpCardParticleSpriteTempalte, ANIM_ATTACKER, 40, 0, 0, 2, 13, -2, 1, 2 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + waitforvisualfinish + end + +Move_HEAL_BLOCK: + loadspritegfx ANIM_TAG_BLUE_STAR + monbg ANIM_TARGET + createsoundtask SoundTask_PlaySeChangingVolume, SE_M_ABSORB_2, SOUND_PAN_TARGET, 256, -16, 0, 2 + createsprite gHealingBlueStarSpriteTemplate, ANIM_TARGET, 2, 0, -5, 1, 0 + delay 7 + createsprite gHealingBlueStarSpriteTemplate, ANIM_TARGET, 2, -15, 10, 1, 0 + delay 7 + createvisualtask AnimTask_BlendBattleAnimPal, 10, 1 | 4, 4, 2, 12, 0, RGB_BLACK + createsprite gHealingBlueStarSpriteTemplate, ANIM_TARGET, 2, 0, -5, 1, 0 + delay 7 + createsprite gHealingBlueStarSpriteTemplate, ANIM_TARGET, 2, -15, 10, 1, 0 + delay 7 + createsprite gHealingBlueStarSpriteTemplate, ANIM_TARGET, 2, -15, -15, 1, 0 + delay 7 + createsprite gHealingBlueStarSpriteTemplate, ANIM_TARGET, 2, 10, -5, 1, 0 + delay 7 + waitforvisualfinish + delay 11 + createvisualtask AnimTask_BlendBattleAnimPal, 10, 1 | 4, 4, 2, 0, 12, RGB_BLACK + waitforvisualfinish + clearmonbg ANIM_TARGET + end + +Move_WRING_OUT: + loadspritegfx ANIM_TAG_WRING_OUT + monbg ANIM_TARGET + setalpha 12, 8 + createsprite gWringOutHandSpriteTemplate, ANIM_TARGET, 40, 0, 0, 48, 3, 32, FALSE + delay 3 + createsprite gWringOutHandSpriteTemplate, ANIM_TARGET, 40, 0, 0, 48, 3, 32, TRUE + delay 3 + createsprite gWringOutHandSpriteTemplate, ANIM_TARGET, 40, 0, 0, 48, 3, 32, TRUE + delay 3 + createsprite gWringOutHandSpriteTemplate, ANIM_TARGET, 40, 0, 0, 48, 3, 32, TRUE + delay 3 + createsprite gWringOutHandSpriteTemplate, ANIM_TARGET, 40, 0, 0, 48, 3, 32, TRUE + delay 3 + createsprite gWringOutHandSpriteTemplate, ANIM_TARGET, 40, 0, 0, 48, 3, 32, TRUE + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + waitforvisualfinish + end + +Move_POWER_TRICK: + loadspritegfx ANIM_TAG_THIN_RING + monbg ANIM_ATK_PARTNER + waitforvisualfinish + createsprite gThinRingShrinkingSpriteTemplate, ANIM_ATTACKER, 40, 0, 0, 0, 0 + playsewithpan SE_M_SUPERSONIC, -64 + delay 14 + createsprite gThinRingShrinkingSpriteTemplate, ANIM_ATTACKER, 40, 0, 0, 0, 0 + playsewithpan SE_M_SUPERSONIC, -64 + delay 14 + createsprite gThinRingShrinkingSpriteTemplate, ANIM_ATTACKER, 40, 0, 0, 0, 0 + playsewithpan SE_M_SUPERSONIC, -64 + waitforvisualfinish + createvisualtask AnimTask_SetAllNonAttackersInvisiblity, 5, 0 + waitforvisualfinish + clearmonbg ANIM_ATK_PARTNER + end + +Move_GASTRO_ACID: + loadspritegfx ANIM_TAG_GREEN_POISON_BUBBLE + monbg ANIM_DEF_PARTNER + createsprite gGreenPoisonBubble, ANIM_TARGET, 2, 20, 0, 40, 1, 0, 0, FALSE + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + delay 5 + createsprite gGreenPoisonBubble, ANIM_TARGET, 2, 20, 0, 40, 1, 24, 0, FALSE + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + delay 5 + createsprite gGreenPoisonBubble, ANIM_TARGET, 2, 20, 0, 40, 1, -24, 0, FALSE + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + delay 15 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 10, 1 + createvisualtask AnimTask_BlendColorCycle, 2, ANIM_PAL_DEF, 2, 2, 0, 12, RGB(30, 0, 31) + createsprite gGreenPoisonDrip, ANIM_TARGET, 2, 0, -22, 0, 15, 55, FALSE + playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET + delay 10 + createsprite gGreenPoisonDrip, ANIM_TARGET, 2, -26, -24, 0, 15, 55, FALSE + playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET + delay 10 + createsprite gGreenPoisonDrip, ANIM_TARGET, 2, 15, -27, 0, 15, 50, FALSE + playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET + delay 10 + createsprite gGreenPoisonDrip, ANIM_TARGET, 2, -15, -17, 0, 10, 45, FALSE + playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET + delay 10 + createsprite gGreenPoisonDrip, ANIM_TARGET, 2, 27, -22, 0, 15, 50, FALSE + playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + end + +Move_LUCKY_CHANT: + loadspritegfx ANIM_TAG_GOLD_STARS + monbg ANIM_DEF_PARTNER + setalpha 12, 8 + playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER + createsprite gLuckyChantBigStarsSpriteTemplate, 2, 4, 0, -18, 8, 140 + createsprite gLuckyChantSmallStarsSpriteTemplate, 2, 4, 16, -18, 8, 100 + createsprite gLuckyChantSmallStarsSpriteTemplate, 2, 4, -16, -18, 8, 100 + delay 15 + createsprite gLuckyChantBigStarsSpriteTemplate 2, 4, 0, -18, 8, 140 + createsprite gLuckyChantSmallStarsSpriteTemplate, 2, 4, 32, -18, 8, 100 + createsprite gLuckyChantSmallStarsSpriteTemplate, 2, 4, -32, -18, 8, 100 + delay 15 + createsprite gLuckyChantBigStarsSpriteTemplate 2, 4, 0, -18, 8, 140 + createsprite gLuckyChantSmallStarsSpriteTemplate, 2, 4, 24, -18, 8, 100 + createsprite gLuckyChantSmallStarsSpriteTemplate, 2, 4, -18, -18, 8, 100 + delay 30 + createsprite gLuckyChantSmallStarsSpriteTemplate, 2, 4, 16, -18, 0, 100 + createsprite gLuckyChantSmallStarsSpriteTemplate, 2, 4, -16, -18, 0, 100 + delay 30 + createsprite gLuckyChantSmallStarsSpriteTemplate, 2, 4, 20, -16, 14, 80 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + unloadspritegfx ANIM_TAG_GOLD_STARS + end + +Move_ME_FIRST: + end + +Move_COPYCAT: + loadspritegfx ANIM_TAG_GRAY_ORB + loadspritegfx ANIM_TAG_THIN_RING + playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER + createvisualtask AnimTask_BlendColorCycle, 2, 2, 8, 1, 0, 12, RGB_WHITE + createvisualtask AnimTask_StockpileDeformMon, 5 + call StockpileAbsorb + call StockpileAbsorb + waitforvisualfinish + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 2, 0, 12, 0, RGB_WHITE + waitforvisualfinish + createsprite gThinRingShrinkingSpriteTemplate, ANIM_ATTACKER, 40, 0, 0, 0, 0 + playsewithpan SE_M_SUPERSONIC, -64 + delay 14 + createsprite gThinRingShrinkingSpriteTemplate, ANIM_ATTACKER, 40, 0, 0, 0, 0 + playsewithpan SE_M_SUPERSONIC, -64 + delay 14 + createsprite gThinRingShrinkingSpriteTemplate, ANIM_ATTACKER, 40, 0, 0, 0, 0 + playsewithpan SE_M_SUPERSONIC, -64 + waitforvisualfinish + end + +Move_POWER_SWAP: + loadspritegfx ANIM_TAG_COLORED_ORBS + playsewithpan SE_M_DOUBLE_TEAM, 0 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 0, 0, 42, -32 + delay 2 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 0, 42, -32 + delay 2 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 0, 42, -32 + delay 2 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 0, 42, -32 + delay 2 + playsewithpan SE_M_DOUBLE_TEAM, 0 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 0, 1, 42, 32 + delay 2 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 1, 42, 32 + delay 2 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 1, 42, 32 + delay 2 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 1, 42, 32 + + waitforvisualfinish + playsewithpan SE_M_DOUBLE_TEAM, 0 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 0, 0, 42, -32 + delay 2 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 0, 42, -32 + delay 2 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 0, 42, -32 + delay 2 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 0, 42, -32 + delay 2 + playsewithpan SE_M_DOUBLE_TEAM, 0 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 0, 1, 42, 32 + delay 2 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 1, 42, 32 + delay 2 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 1, 42, 32 + delay 2 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 1, 42, 32 + delay 2 + waitforvisualfinish + end + +Move_GUARD_SWAP: + loadspritegfx ANIM_TAG_COLORED_ORBS + playsewithpan SE_M_DOUBLE_TEAM, 0 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 2, 0, 42, -32 + delay 2 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 3, 0, 42, -32 + delay 2 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 3, 0, 42, -32 + delay 2 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 3, 0, 42, -32 + delay 2 + playsewithpan SE_M_DOUBLE_TEAM, 0 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 2, 1, 42, 32 + delay 2 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 3, 1, 42, 32 + delay 2 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 3, 1, 42, 32 + delay 2 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 3, 1, 42, 32 + + waitforvisualfinish + playsewithpan SE_M_DOUBLE_TEAM, 0 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 2, 0, 42, -32 + delay 2 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 3, 0, 42, -32 + delay 2 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 3, 0, 42, -32 + delay 2 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 3, 0, 42, -32 + delay 2 + playsewithpan SE_M_DOUBLE_TEAM, 0 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 2, 1, 42, 32 + delay 2 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 3, 1, 42, 32 + delay 2 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 3, 1, 42, 32 + delay 2 + createsprite gPowerSwapGuardSwapSpriteTemplate, ANIM_TARGET, 3, 0, 0, 3, 1, 42, 32 + delay 2 + waitforvisualfinish + end + +Move_PUNISHMENT: + loadspritegfx ANIM_TAG_SCRATCH + loadspritegfx ANIM_TAG_POISON_BUBBLE + monbg ANIM_TARGET + setalpha 12, 8 + playsewithpan 155, SOUND_PAN_TARGET + createsprite gPunishmentSpriteTemplate, 2, 4, 0, 0, 1, 0 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + waitforvisualfinish + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + createsprite gPunishmentImpactSpriteTemplate 2, 4, 0, 0, 1, 2 + createvisualtask AnimTask_ShakeMon 2, ANIM_TARGET, 3, 0, 6, 1 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end + +Move_LAST_RESORT: + fadetobg BG_COSMIC + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 2, 4, 0, 128, 0, -1 + waitbgfadein + loadspritegfx ANIM_TAG_IMPACT + playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER + createsprite gComplexPaletteBlendSpriteTemplate, 2, 7, 2, 4, 2, RGB(31, 31, 31), 10, 0, 0 + waitforvisualfinish + delay 10 + playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER + waitplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 8 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, 0, 18, 6, 2, 4 + waitforvisualfinish + createsprite gSimplePaletteBlendSpriteTemplate, 2, 5, 1, 0, 16, 16, RGB(31, 31, 31) + createsprite gSlideMonToOffsetSpriteTemplate, 2, 5, 0, 20, 0, 0, 4 + delay 3 + waitforvisualfinish + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, 132, 4, -10, 0, 1, 0 + createsprite gSlideMonToOffsetSpriteTemplate, 2, 5, 1, -32, 0, 0, 3 + waitforvisualfinish + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 4, 8, -256, 0, 0 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 4, 8, -256, 1, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, 5, 0, 4, 0, 12, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, 5, 1, 4, 0, 12, 1 + createsprite gSimplePaletteBlendSpriteTemplate, 2, 5, 1, 2, 16, 0, RGB(31, 31, 31) + waitforvisualfinish + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 4, 8, -256, 0, 1 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 4, 8, -256, 1, 1 + waitforvisualfinish + createsprite gSlideMonToOriginalPosSpriteTemplate, 2, 3, 0, 0, 5 + delay 3 + createsprite gSlideMonToOriginalPosSpriteTemplate, 2, 3, 1, 0, 7 + waitforvisualfinish + call UnsetHighSpeedBg + end + +Move_WORRY_SEED: + loadspritegfx ANIM_TAG_WORRY_SEED + loadspritegfx ANIM_TAG_SMALL_CLOUD + playsewithpan SE_M_POISON_POWDER, SOUND_PAN_ATTACKER + createsprite gWorrySeedSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 32, -32 + waitforvisualfinish + playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_TARGET + createsprite gSmallCloudTemplate, ANIM_ATTACKER, 3, -2, -1, 0, -1, -1 + createsprite gSmallCloudTemplate, ANIM_ATTACKER, 3, 3, 1, 1, 2, -1 + createsprite gSmallCloudTemplate, ANIM_ATTACKER, 3, -2, 1, 2, 1, -2 + createsprite gSmallCloudTemplate, ANIM_ATTACKER, 3, 3, -2, 1, -1, -2 + waitforvisualfinish + end + +Move_SUCKER_PUNCH: + loadspritegfx ANIM_TAG_POISON_JAB + loadspritegfx ANIM_TAG_IMPACT + createsprite gSlideMonToOffsetSpriteTemplate, 2, 5, 0, 20, 0, 0, 4 + createsprite gSuckerPunchSpriteTemplate, 130, 6, -18, 5, 40, 8, 160, 0 + delay 4 + createsprite gBasicHitSplatSpriteTemplate, 130, 4, -8, 8, 1, 2 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 4, 6, 384, 1, 2 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + waitforvisualfinish + createsprite gSlideMonToOriginalPosSpriteTemplate, 2, 3, 0, 1, 4 + end + +Move_TOXIC_SPIKES: + loadspritegfx ANIM_TAG_TOXIC_SPIKES + loadspritegfx ANIM_TAG_POISON_BUBBLE + monbg ANIM_DEF_PARTNER + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + waitplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET, 28 + createsprite gToxicSpikesSpriteTemplate, ANIM_TARGET, 2, 20, 0, 0, 24, 30 + delay 10 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + waitplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET, 28 + createsprite gToxicSpikesSpriteTemplate, ANIM_TARGET, 2, 20, 0, -24, 24, 30 + delay 10 + waitplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET, 28 + createsprite gToxicSpikesSpriteTemplate, ANIM_TARGET, 2, 20, 0, 24, 24, 30 + delay 40 + call PoisonBubblesEffect + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + end + +Move_HEART_SWAP: + end + +Move_AQUA_RING: + loadspritegfx ANIM_TAG_BLUE_STAR + loadspritegfx ANIM_TAG_SMALL_BUBBLES + loadspritegfx ANIM_TAG_ICE_CRYSTALS + loadspritegfx ANIM_TAG_GUARD_RING + monbg ANIM_ATK_PARTNER + setalpha 12, 8 + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 23, 1 + delay 5 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + createsprite gSmallBubblePairSpriteTemplate, 2, 4, 10, 10, 25, 0 + delay 4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + createsprite gSmallBubblePairSpriteTemplate, 2, 4, -15, 0, 25, 0 + delay 4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + createsprite gSmallBubblePairSpriteTemplate, 2, 4, 20, 10, 25, 0 + delay 4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + createsprite gSmallBubblePairSpriteTemplate, 2, 4, 0, -10, 25, 0 + delay 4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + createsprite gSmallBubblePairSpriteTemplate, 2, 4, -10, 15, 25, 0 + delay 4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + createsprite gSmallBubblePairSpriteTemplate, 2, 4, 25, 20, 25, 0 + delay 4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + createsprite gSmallBubblePairSpriteTemplate, 2, 4, -20, 20, 25, 0 + delay 4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + createsprite gSmallBubblePairSpriteTemplate, 2, 4, 12, 0, 25, 0 + setalpha 8, 8 + playsewithpan SE_M_MILK_DRINK, SOUND_PAN_ATTACKER, + createsprite gGuardRingSpriteTemplate, 2, 0 + delay 4 + createsprite gGuardRingSpriteTemplate, 2, 0 + delay 4 + createsprite gGuardRingSpriteTemplate, 2, 0 + waitforvisualfinish + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + createvisualtask AnimTask_BlendColorCycle, 2, 10, 0, 2, 10, RGB(31, 31, 31) + waitforvisualfinish + clearmonbg ANIM_ATK_PARTNER + blendoff + delay 1 + call HealingEffect + waitforvisualfinish + end + +Move_MAGNET_RISE: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_SPARK_2 + delay 0 + createvisualtask AnimTask_BlendColorCycle 2, 31, -31, 1, 5, 5, RGB(31, 31, 20) + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + createvisualtask AnimTask_WindUpLunge, 5, 7, 0, -12, 4, 10, 10, 12, 6 + createsprite gSparkElectricitySpriteTemplate, 0, 7, 32, 24, 190, 12, 0, 1, 0 + delay 0 + createsprite gSparkElectricitySpriteTemplate, 0, 7, 80, 24, 22, 12, 0, 1, 0 + createsprite gSparkElectricitySpriteTemplate, 0, 7, 156, 24, 121, 13, 0, 1, 1 + delay 0 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + delay 4 + createsprite gSparkElectricitySpriteTemplate, 0, 7, 100, 24, 60, 10, 0, 1, 0 + createsprite gSparkElectricitySpriteTemplate, 0, 7, 170, 24, 42, 11, 0, 1, 1 + delay 0 + createsprite gSparkElectricitySpriteTemplate, 0, 7, 238, 24, 165, 10, 0, 1, 1 + delay 0 + createsprite gSparkElectricitySpriteTemplate, 0, 7, 32, 24, 190, 12, 0, 1, 0 + delay 0 + createsprite gSparkElectricitySpriteTemplate, 0, 7, 80, 24, 22, 12, 0, 1, 0 + createsprite gSparkElectricitySpriteTemplate, 0, 7, 156, 24, 121, 13, 0, 1, 1 + delay 0 + createsprite gSparkElectricitySpriteTemplate, 0, 7, 100, 24, 60, 10, 0, 1, 0 + createsprite gSparkElectricitySpriteTemplate, 0, 7, 170, 24, 42, 11, 0, 1, 1 + delay 0 + createsprite gSparkElectricitySpriteTemplate, 0, 7, 238, 24, 165, 10, 0, 1, 1 + delay 0 + createvisualtask AnimTask_BlendColorCycle, 2, 31, -31, 1, 0, 0, RGB(31, 31, 20) + delay 20 + createvisualtask AnimTask_BlendColorCycle, 2, 31, -31, 1, 7, 7, RGB(31, 31, 20) + waitforvisualfinish + createvisualtask AnimTask_BlendColorCycle, 2, 31, -31, 1, 0, 0, RGB(31, 31, 20) + waitforvisualfinish + end + +Move_FLARE_BLITZ: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_HANDS_AND_FEET + loadspritegfx ANIM_TAG_SMALL_EMBER + monbg ANIM_TARGET + monbgprio_2A ANIM_TARGET + setalpha 12, 8 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 0 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 2 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 4 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 6 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 8 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 10 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 56, 12 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 2 + waitforvisualfinish + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 4, 1, 4 + waitforvisualfinish + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, 0, 0, 6 + waitforvisualfinish + call SetImpactBackground + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 22, 1 + createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB_RED, 12, 1, 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 0 + createsprite gFireSpreadSpriteTemplate, 0x81, 0, 10, 192, 176, 40 + playsewithpan SE_M_COMET_PUNCH, +63 + delay 5 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 24, 8, 1, 0 + createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB_RED, 12, 1, 1 + createsprite gFireSpreadSpriteTemplate, 0x81, 0, 10, -192, 240, 40 + playsewithpan SE_M_COMET_PUNCH, +63 + delay 5 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -24, -16, 1, 0 + createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB_RED, 12, 1, 1 + createsprite gFireSpreadSpriteTemplate, 0x81, 0, 10, 192, -160, 40 + playsewithpan SE_M_COMET_PUNCH, +63 + delay 5 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 8, 4, 1, 0 + createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB_RED, 12, 1, 1 + createsprite gFireSpreadSpriteTemplate, 0x81, 0, 10, -192, -112, 40 + playsewithpan SE_M_COMET_PUNCH, +63 + delay 5 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -16, 19, 1, 0 + createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB_RED, 12, 1, 1 + createsprite gFireSpreadSpriteTemplate, 0x81, 0, 10, 160, 48, 40 + playsewithpan SE_M_COMET_PUNCH, +63 + delay 5 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 18, -18, 1, 0 + createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB_RED, 12, 1, 1 + createsprite gFireSpreadSpriteTemplate, 0x81, 0, 10, -224, -32, 40 + createsprite gFireSpreadSpriteTemplate, 0x81, 0, 10, 112, -128, 40 + playsewithpan SE_M_COMET_PUNCH, +63 + createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 0, 0, RGB_BLACK + playsewithpan SE_M_COMET_PUNCH, +63 + waitforvisualfinish + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 9 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + delay 2 + restorebg + waitbgfadein + end + +Move_FORCE_PALM: + loadspritegfx ANIM_TAG_SHADOW_BALL + loadspritegfx ANIM_TAG_HANDS_AND_FEET + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET + createsprite gKarateChopSpriteTemplate, 2, 8, -16, 0, 0, 0, 10, 1, 3, 0 + waitforvisualfinish + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + createsprite gForcePalmSpriteTemplate 3, 4, 0, 0, 1, 2 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + end + +Move_AURA_SPHERE: + loadspritegfx ANIM_TAG_METEOR + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT + monbg ANIM_ATK_PARTNER + monbgprio_28 ANIM_ATTACKER + setalpha 12, 8 + call SetHighSpeedBg + playsewithpan SE_M_SKY_UPPERCUT, 0 + delay 60 + createsprite gAuraSphereBlast, ANIM_TARGET, 3, 0 + playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER + delay 16 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 8, 0, 16, 1 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + waitforvisualfinish + call UnsetHighSpeedBg + clearmonbg ANIM_ATK_PARTNER + blendoff + delay 1 + end + +Move_ROCK_POLISH: + loadspritegfx ANIM_TAG_WHITE_STREAK + loadspritegfx ANIM_TAG_SPARKLE_3 + setalpha 12, 8 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, 1, 3, 0, 12, RGB_BLACK + waitforvisualfinish + loopsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER, 10, 7 + createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, -10, 3 + delay 1 + createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, 24, -19 + delay 1 + createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, -28, -15 + delay 2 + createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, -6, -30 + delay 1 + createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, -20, 6 + delay 1 + createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, 28, 2 + delay 2 + createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, -14, -25 + delay 1 + createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, 9, -2 + delay 2 + createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, -1, 0 + delay 1 + createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, 21, 4 + delay 2 + createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, 28, 20 + delay 2 + createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, -7, 24 + delay 2 + createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, -11, 1 + delay 2 + createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, 12, -18 + delay 2 + createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, -21, -14 + delay 1 + createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, -29, 7 + delay 2 + createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, 15, 28 + delay 1 + createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, -21, -16 + delay 2 + waitforvisualfinish + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + createsprite gRockPolishSparkleSpriteTemplate, ANIM_ATTACKER, 2, -20, 9 + createsprite gRockPolishSparkleSpriteTemplate, ANIM_ATTACKER, 2, -10, -15 + createsprite gRockPolishSparkleSpriteTemplate, ANIM_ATTACKER, 2, 1, 17 + delay 1 + createsprite gRockPolishSparkleSpriteTemplate, ANIM_ATTACKER, 2, -23, -16 + createsprite gRockPolishSparkleSpriteTemplate, ANIM_ATTACKER, 2, 10, -6 + delay 1 + createsprite gRockPolishSparkleSpriteTemplate, ANIM_ATTACKER, 2, -16, -7 + delay 1 + createsprite gRockPolishSparkleSpriteTemplate, ANIM_ATTACKER, 2, 22, -7 + delay 1 + createsprite gRockPolishSparkleSpriteTemplate, ANIM_ATTACKER, 2, -19, 11 + delay 1 + createsprite gRockPolishSparkleSpriteTemplate, ANIM_ATTACKER, 2, 12, 12 + delay 1 + createsprite gRockPolishSparkleSpriteTemplate, ANIM_ATTACKER, 2, 0, -17 + waitforvisualfinish + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, 1, 3, 12, 0, RGB_BLACK + waitforvisualfinish + blendoff + end + +Move_POISON_JAB: + loadspritegfx ANIM_TAG_PURPLE_JAB + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_POISON_BUBBLE + setalpha 12, 8 + createsprite gPoisonJabProjectileSpriteTemplate, ANIM_TARGET, 2, 3, -31, 10 + delay 2 + createsprite gPoisonJabProjectileSpriteTemplate, ANIM_TARGET, 2, -18, -25, 10 + delay 2 + createsprite gPoisonJabProjectileSpriteTemplate, ANIM_TARGET, 2, 27, 17, 10 + delay 2 + createsprite gPoisonJabProjectileSpriteTemplate, ANIM_TARGET, 2, -26, 18, 10 + delay 2 + createsprite gPoisonJabProjectileSpriteTemplate, ANIM_TARGET, 2, 10, 30, 10 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -7, 4, 1, 3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + createsprite gPoisonJabProjectileSpriteTemplate, ANIM_TARGET, 2, -17, -27, 10 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -4, -6, 1, 3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + createsprite gPoisonJabProjectileSpriteTemplate, ANIM_TARGET, 2, 2, 31, 10 + createvisualtask AnimTask_SwayMon, 5, 0, 3, 0x2000, 6, ANIM_TARGET + createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_TARGET, RGB(16, 0, 16), 12, 0, 1 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 6, 4, 1, 3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + createsprite gPoisonJabProjectileSpriteTemplate, ANIM_TARGET, 2, 15, -27, 10 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -6, 8, 1, 3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + createsprite gPoisonJabProjectileSpriteTemplate, ANIM_TARGET, 2, -31, -2, 10 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 12, 6, 1, 3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + createsprite gPoisonJabProjectileSpriteTemplate, ANIM_TARGET, 2, -26, -18, 10 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -6, -8, 1, 3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 8, 1, 3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -8, 0, 1, 3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -7, -5, 1, 3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + waitforvisualfinish + call PoisonBubblesEffect + waitforvisualfinish + blendoff + end + +Move_DARK_PULSE: + loadspritegfx ANIM_TAG_THIN_RING + monbg ANIM_TARGET + fadetobg BG_DARK + waitbgfadein + delay 0 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1D09, 12 + createvisualtask AnimTask_SpiteTargetShadow, 2 + loopsewithpan SE_M_PSYBEAM, SOUND_PAN_TARGET, 20, 3 + delay 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1D09, 12 + delay 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1D09, 12 + delay 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1D09, 12 + delay 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1D09, 12 + delay 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1D09, 12 + delay 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1D09, 12 + waitforvisualfinish + clearmonbg ANIM_TARGET + delay 1 + restorebg + waitbgfadein + end + +Move_NIGHT_SLASH: + loadspritegfx ANIM_TAG_SLASH + createvisualtask AnimTask_BlendNightSlash, 2, ANIM_TARGET, 2, 0, 8, 1 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, 1, 3, 0, 12, RGB_BLACK + waitforvisualfinish + createsprite gNightSlashLeftSpriteTemplate, ANIM_TARGET, 2, 1, -8, 0 + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + delay 4 + createsprite gNightSlashLeftSpriteTemplate, ANIM_TARGET, 2, 1, 8, 0 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1 + delay 40 + createsprite gNightSlashRightSpriteTemplate, ANIM_TARGET, 2, 1, -8, 0 + createsprite gNightSlashRightSpriteTemplate, ANIM_TARGET, 2, 1, 8, 0 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 18, 1 + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + waitforvisualfinish + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, 1, 3, 12, 0, RGB_BLACK + waitforvisualfinish + end + +Move_AQUA_TAIL: + loadspritegfx ANIM_TAG_WATER_IMPACT + loadspritegfx ANIM_TAG_SMALL_BUBBLES + loadspritegfx ANIM_TAG_ICE_CRYSTALS + monbg ANIM_DEF_PARTNER + setalpha 12, 8 + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 23, 1 + delay 5 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + createsprite gSmallBubblePairSpriteTemplate, 2, 4, 10, 10, 25, 0 + delay 4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + createsprite gSmallBubblePairSpriteTemplate, 2, 4, -16, 0, 25, 0 + delay 4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + createsprite gSmallBubblePairSpriteTemplate, 2, 4, 20, 10, 25, 0 + delay 4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + createsprite gSmallBubblePairSpriteTemplate, 2, 4, 0, -10, 25, 0 + delay 4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + createsprite gSmallBubblePairSpriteTemplate, 2, 4, -10, 15, 25, 0 + delay 4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + createsprite gSmallBubblePairSpriteTemplate, 2, 4, 25, 20, 25, 0 + delay 4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + createsprite gSmallBubblePairSpriteTemplate, 2, 4, -20, 20, 25, 0 + delay 4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + createsprite gSmallBubblePairSpriteTemplate, 2, 4, 12, 0, 25, 0 + waitforvisualfinish + loadspritegfx ANIM_TAG_SLAM_HIT_2 + loadspritegfx ANIM_TAG_IMPACT + createsprite gHorizontalLungeSpriteTemplate, 2, 2, 4, 6 + delay 4 + playsewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET + createsprite gAquaTailKnockOffSpriteTemplate, 130, 2, -16, -16 + delay 8 + createsprite gComplexPaletteBlendSpriteTemplate, 2, 7, 31, 5, 1, RGB(31, 31, 31), 10, 0, 0 + createsprite gAquaTailHitSpriteTemplate, 131, 4, 0, 0, 1, 2 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + createsprite gSlideMonToOffsetSpriteTemplate, 2, 5, 1, -12, 10, 0, 3 + createsprite gSlideMonToOriginalPosSpriteTemplate, 2, 3, 0, 0, 5 + delay 3 + createvisualtask AnimTask_ShakeMonInPlace, 2, 5, 1, 0, 3, 6, 1 + delay 5 + createsprite gSlideMonToOriginalPosSpriteTemplate, 2, 3, 1, 0, 6 + delay 10 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + end + +Move_SEED_BOMB: + loadspritegfx ANIM_TAG_SEED + loadspritegfx ANIM_TAG_EXPLOSION + createsprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0 + delay 5 + createsprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0 + delay 5 + createsprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0 + delay 5 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 30, 1 + createsprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, 6, 5, 1, 0 + delay 6 + createsprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, -16, -15, 1, 0 + delay 6 + createsprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, 16, -5, 1, 0 + delay 6 + createsprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, -12, 18, 1, 0 + delay 6 + createsprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, 0, 5, 1, 0 + delay 6 + createsprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, 6, 5, 1, 0 + delay 6 + createsprite gBulletSeedSpriteTemplate, ANIM_TARGET, 2, 20, 0 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, -16, -15, 1, 0 + delay 6 + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, 16, -5, 1, 0 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + delay 6 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, -12, 18, 1, 0 + delay 6 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, 0, 5, 1, 0 + waitforvisualfinish + end + +Move_AIR_SLASH: + loadspritegfx ANIM_TAG_SLASH + call SetSkyBg + createsprite gSlashSliceSpriteTemplate, ANIM_TARGET, 2, 1, -8, 0 + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + delay 4 + createsprite gSlashSliceSpriteTemplate, ANIM_TARGET, 2, 1, 8, 0 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 18, 1 + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + waitforvisualfinish + call UnsetSkyBg + end + +Move_XSCISSOR: + loadspritegfx ANIM_TAG_CUT + monbg ANIM_TARGET + setalpha 12, 8 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 1, 5 + createvisualtask AnimTask_TraceMonBlended, 2, 0, 4, 7, 3 + createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 0 + createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 1 + playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER + delay 5 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1 + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, RGB_BLACK, 10, 0, 0 + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end + +Move_BUG_BUZZ: + loadspritegfx ANIM_TAG_JAGGED_MUSIC_NOTE + loadspritegfx ANIM_TAG_THIN_RING + monbg ANIM_DEF_PARTNER + call SetBugBg + createvisualtask AnimTask_UproarDistortion, 2, 0 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8 + playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER + createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 29, -12, 0 + createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -12, -29, 1 + delay 16 + createvisualtask AnimTask_UproarDistortion, 2, 0 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8 + playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER + createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 12, -29, 1 + createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -29, -12, 0 + delay 16 + createvisualtask AnimTask_UproarDistortion, 2, 0 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8 + playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER + createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, -24, 1 + createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, -24, 0 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + call UnsetBugBg + end + +Move_DRAGON_PULSE: + loadspritegfx ANIM_TAG_DRAGON_PULSE + monbg ANIM_TARGET + setalpha 12, 8 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 0, 7, RGB_BLACK + waitforvisualfinish + playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER + createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_PSYBEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 3, 4, 0, 15 + call DragonPulseParticle + call DragonPulseParticle + createvisualtask AnimTask_SwayMon, 5, 0, 6, 51200, 4, ANIM_TARGET + createvisualtask AnimTask_BlendColorCycle, 2, 4, 2, 2, 0, 12, RGB(30, 10, 13) + call DragonPulseParticle + call DragonPulseParticle + call DragonPulseParticle + call DragonPulseParticle + call DragonPulseParticle + call DragonPulseParticle + call DragonPulseParticle + call DragonPulseParticle + call DragonPulseParticle + waitforvisualfinish + delay 1 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 7, 0, RGB_BLACK + waitforvisualfinish + blendoff + clearmonbg ANIM_TARGET + end +DragonPulseParticle: + createsprite gDragonPulseSpriteTemplate, 130, 6, 16, 0, 0, 0, 13, 0 + delay 4 + return + +Move_DRAGON_RUSH: + loadspritegfx ANIM_TAG_SLAM_HIT_2 + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_ROCKS + loadspritegfx ANIM_TAG_RED_HEART + createsprite gHorizontalLungeSpriteTemplate, 2, 2, 4, 6 + delay 4 + playsewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET + createsprite gDragonRushSpriteTemplate, 131, 2, -16, -16 + delay 8 + createsprite gComplexPaletteBlendSpriteTemplate, 2, 7, 31, 5, 1, RGB(31, 31, 31), 10, 0, 0 + createsprite gBasicHitSplatSpriteTemplate, 3, 4, 0, 0, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1 + waitforvisualfinish + playsewithpan 131, SOUND_PAN_TARGET + createsprite gRockFragmentSpriteTemplate, 2, 6, 0, 0, 20, 24, 14, 2 + createsprite gRockFragmentSpriteTemplate, 2, 6, 5, 0, -20, 24, 14, 1 + createsprite gRockFragmentSpriteTemplate, 2, 6, 0, 5, 20, -24, 14, 2 + createsprite gRockFragmentSpriteTemplate, 2, 6, -5, 0, 20, 24, 14, 2 + createsprite gRockFragmentSpriteTemplate, 2, 6, 0, -5, 30, 18, 8, 2 + createsprite gRockFragmentSpriteTemplate, 2, 6, 0, 0, 30, -18, 8, 2 + createsprite gRockFragmentSpriteTemplate, 2, 6, 0, 0, -30, 18, 8, 2 + createsprite gRockFragmentSpriteTemplate, 2, 6, 0, 0, -30, -18, 8, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 7, 1 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + end + +Move_POWER_GEM: @ Copy of Hidden Power with background blackened + loadspritegfx ANIM_TAG_POWER_GEM + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, 1, 1, 0, 7, RGB_BLACK + waitforvisualfinish + playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER + createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0 + waitforvisualfinish + delay 30 + createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB_WHITE, 12, 5, 1 + delay 4 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + createsprite gPowerGemOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 0 + createsprite gPowerGemOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 42 + createsprite gPowerGemOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 84 + createsprite gPowerGemOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 126 + createsprite gPowerGemOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 168 + createsprite gPowerGemOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 210 + delay 52 + setarg 7, -1 + playsewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER + createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0 + createsprite gPowerGemOrbScatterSpriteTemplate, ANIM_TARGET, 2, 0 + createsprite gPowerGemOrbScatterSpriteTemplate, ANIM_TARGET, 2, 32 + createsprite gPowerGemOrbScatterSpriteTemplate, ANIM_TARGET, 2, 64 + createsprite gPowerGemOrbScatterSpriteTemplate, ANIM_TARGET, 2, 96 + createsprite gPowerGemOrbScatterSpriteTemplate, ANIM_TARGET, 2, 128 + createsprite gPowerGemOrbScatterSpriteTemplate, ANIM_TARGET, 2, 160 + createsprite gPowerGemOrbScatterSpriteTemplate, ANIM_TARGET, 2, 192 + createsprite gPowerGemOrbScatterSpriteTemplate, ANIM_TARGET, 2, 224 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, 1, 1, 7, 0, RGB_BLACK + waitforvisualfinish + end + +Move_DRAIN_PUNCH: + loadspritegfx ANIM_TAG_HANDS_AND_FEET + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_BLUE_STAR + loadspritegfx ANIM_TAG_ORBS + monbg ANIM_DEF_PARTNER + setalpha 12, 8 + playsewithpan SE_M_VITAL_THROW2, -64 + createsprite gFistFootSpriteTemplate, ANIM_TARGET, 3, 0, 0, 8, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 + delay 20 + call MegaDrainAbsorbEffect + waitforvisualfinish + delay 15 + call HealingEffect + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + end + +Move_VACUUM_WAVE: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_HANDS_AND_FEET + loadspritegfx ANIM_TAG_THIN_RING + monbg ANIM_TARGET + setalpha 12, 8 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 8, -8, 1, 2 + createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 8, 0, 8, 1, 0 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 0, 0x7FFF, 3 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end + +Move_FOCUS_BLAST: + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT + loadspritegfx ANIM_TAG_METEOR + loadspritegfx ANIM_TAG_FLAT_ROCK + monbg ANIM_TARGET + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + call SetHighSpeedBg + createsprite gSuperpowerOrbSpriteTemplate, ANIM_TARGET, 2, 0 + playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER + waitforvisualfinish + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 8, 0, 16, 1 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + waitforvisualfinish + call UnsetHighSpeedBg + clearmonbg ANIM_TARGET + blendoff + delay 1 + end + +Move_ENERGY_BALL: + loadspritegfx ANIM_TAG_ENERGY_BALL + monbg ANIM_TARGET + setalpha 12, 8 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 0, 8, RGB_BLACK + waitforvisualfinish + delay 15 + createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_MIST, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 5, 5, 0, 5 + createsprite gEnergyBallSpriteTemplate, ANIM_TARGET, 2, 12, 4, 8 + waitforvisualfinish + playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 8, 1 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 8, 0, RGB_BLACK + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end + +Move_BRAVE_BIRD: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_BIRD + call SetSkyBg + monbg ANIM_ATTACKER + createvisualtask AnimTask_BlendBattleAnimPal, 10, 2, 0, 0, 16, RGB_WHITE + delay 4 + createvisualtask AnimTask_AttackerFadeToInvisible, 5, 0 + waitforvisualfinish + createvisualtask SoundTask_PlaySE2WithPanning, 5, 238, SOUND_PAN_ATTACKER + createsprite gSkyAttackBirdSpriteTemplate, ANIM_TARGET, 2 + delay 14 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 10, 0, 18, 1 + createvisualtask SoundTask_PlaySE1WithPanning, 5, 141, SOUND_PAN_TARGET + delay 20 + createvisualtask AnimTask_AttackerFadeFromInvisible, 5, 1 + delay 2 + createvisualtask AnimTask_BlendBattleAnimPal, 10, 2, 0, 15, 0, RGB_WHITE + waitforvisualfinish + clearmonbg ANIM_ATTACKER + call UnsetSkyBg + end + +Move_EARTH_POWER: + loadspritegfx ANIM_TAG_SMALL_EMBER + loadspritegfx ANIM_TAG_FIRE_PLUME + createvisualtask AnimTask_HorizontalShake, 3, 5, 10, 50 + createvisualtask AnimTask_HorizontalShake, 3, 1, 10, 50 + playsewithpan SE_M_EARTHQUAKE, SOUND_PAN_TARGET + delay 40 + loopsewithpan 145, SOUND_PAN_TARGET 11, 3 + createvisualtask AnimTask_ShakeMon 5, 5, ANIM_TARGET, 0, 3, 25, 1 + createsprite gDragonRageFirePlumeSpriteTemplate, 194, 3, 1, 5, 0 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, 194, 3, 1, -10, -15 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, 130, 3, 1, 0, 25 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, 194, 3, 1, 15, 5 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, 194, 3, 1, -25, 0 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, 130, 3, 1, 30, 30 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, 130, 3, 1, -27, 25 + delay 1 + createsprite gDragonRageFirePlumeSpriteTemplate, 194, 3, 1, 0, 8 + waitforvisualfinish + createsprite gSlideMonToOriginalPosSpriteTemplate, 194, 3, 0, 0, 4 + waitforvisualfinish + end + +Move_SWITCHEROO: + fadetobg BG_DARK + waitbgfadein + loadspritegfx ANIM_TAG_ITEM_BAG + loadspritegfx ANIM_TAG_SPEED_DUST + createsprite gTrickBagSpriteTemplate, 2, 2, -39, 80 + createsprite gTrickBagSpriteTemplate, 2, 2, -39, 208 + delay 16 + playsewithpan SE_M_SKETCH, 0 + createvisualtask AnimTask_StretchTargetUp, 3, 0 + createvisualtask AnimTask_StretchAttackerUp, 3, 0 + delay 30 + playsewithpan SE_M_DOUBLE_TEAM, 0 + delay 24 + playsewithpan SE_M_DOUBLE_TEAM, 0 + delay 16 + playsewithpan SE_M_DOUBLE_TEAM, 0 + delay 16 + playsewithpan SE_M_DOUBLE_TEAM, 0 + delay 16 + playsewithpan SE_M_DOUBLE_TEAM, 0 + delay 16 + playsewithpan SE_M_DOUBLE_TEAM, 0 + delay 16 + playsewithpan SE_M_ATTRACT, 0 + createvisualtask AnimTask_ShakeMon, 3, ANIM_ATTACKER, 5, 0, 7, 2 + createvisualtask AnimTask_ShakeMon, 3, ANIM_TARGET, 5, 0, 7, 2 + waitforvisualfinish + restorebg + waitbgfadein + end + +Move_GIGA_IMPACT: + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_DEF_PARTNER + setalpha 12, 8 + playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER + createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, ANIM_ATTACKER + waitforvisualfinish + delay 11 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 26, 0, 0, 5 + delay 6 + @monbg ANIM_DEF_PARTNER + @setalpha 12, 8 + @createvisualtask AnimTask_WindUpLunge, 5, 7, 0, -18, 8, 23, 10, 40, 10 + @delay 35 + createsprite gComplexPaletteBlendSpriteTemplate, 2, 7, 31, 3, 1, 0, 10, 0, 0 + createsprite gBasicHitSplatSpriteTemplate, 4, 4, -10, 0, 1, 0 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + call SetImpactBackground + delay 1 + createsprite gSlideMonToOffsetSpriteTemplate 2, 5, 1, -16, 0, 0, 4 + waitforvisualfinish + createvisualtask AnimTask_ShakeMonInPlace 2, 5, 1, 4, 0, 12, 1 + waitforvisualfinish + delay 2 + createsprite gSlideMonToOriginalPosSpriteTemplate 2, 3, 0, 0, 5 + delay 3 + createsprite gSlideMonToOriginalPosSpriteTemplate 2, 3, 1, 0, 6 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + restorebg + waitbgfadein + end + +Move_NASTY_PLOT: + loadspritegfx ANIM_TAG_AMNESIA + fadetobg BG_DARK + waitbgfadeout + createvisualtask AnimTask_FadeScreenToWhite, 5 + waitbgfadein + delay 8 + createsprite gQuestionMarkSpriteTemplate, 20, 0 + playsewithpan SE_M_METRONOME, SOUND_PAN_ATTACKER, + delay 54 + loopsewithpan SE_M_METRONOME, SOUND_PAN_ATTACKER, 16, 3 + waitforvisualfinish + call UnsetPsychicBg + end + +Move_BULLET_PUNCH: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_HANDS_AND_FEET + monbg ANIM_TARGET + setalpha 12, 8 + createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, -8, 0, 8, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, 1, 2 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 2 + createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, -16, 8, 8, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -16, 8, 1, 2 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 2 + createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 8, -16, 8, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -16, 8, 1, 2 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 2 + createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 16, 16, 8, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 16, 8, 1, 2 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 2 + createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 8, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 2 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 2 + createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 24, 0, 8, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 24, 0, 1, 2 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 2 + createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 24, 16, 8, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 24, 16, 1, 2 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 2 + createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, -24, 16, 8, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -24, 16, 1, 2 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 2 + createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, -24, -8, 8, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -24, -8, 1, 2 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 2 + createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, -24, 8, 8, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -24, 8, 1, 2 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 2 + waitforvisualfinish + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 9, 0, 8, 1 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + waitforvisualfinish + + clearmonbg ANIM_TARGET + blendoff + end + +Move_AVALANCHE: + loadspritegfx ANIM_TAG_ROCKS + loadspritegfx ANIM_TAG_ICE_CHUNK + monbg ANIM_DEF_PARTNER + createsprite gShakeMonOrTerrainSpriteTemplate, 2, 4, 7, 1, 11, 1 + createsprite gAvalancheSpriteTemplate, 130, 4, -5, 1, -5, 1 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + delay 2 + createsprite gAvalancheSpriteTemplate, 130, 4, 5, 0, 6, 1 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + delay 2 + createsprite gAvalancheSpriteTemplate, 130, 4, 19, 1, 10, 1 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + delay 2 + createsprite gAvalancheSpriteTemplate 130, 4, -17, 2, -20, 1 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 5, 50, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 0, 5, 50, 1 + delay 2 + call SnowSlide1 + call SnowSlide1 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + end +SnowSlide1: + createsprite gAvalancheSpriteTemplate, ANIM_TARGET, 2, -20, 0, -10, 1 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + delay 2 + createsprite gAvalancheSpriteTemplate, ANIM_TARGET, 2, 28, 1, 10, 1 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + delay 2 + createsprite gAvalancheSpriteTemplate, ANIM_TARGET, 2, -10, 1, -5, 1 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + delay 2 + createsprite gAvalancheSpriteTemplate, ANIM_TARGET, 2, 10, 0, 6, 1 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + delay 2 + createsprite gAvalancheSpriteTemplate, ANIM_TARGET, 2, 24, 1, 10, 1 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + delay 2 + createsprite gAvalancheSpriteTemplate, ANIM_TARGET, 2, -32, 2, -10, 1 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + delay 2 + createsprite gAvalancheSpriteTemplate, ANIM_TARGET, 2, -20, 0, -10, 1 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + delay 2 + createsprite gAvalancheSpriteTemplate, ANIM_TARGET, 2, 30, 2, 10, 1 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + delay 2 + return + +Move_ICE_SHARD: + monbg ANIM_TARGET + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + loadspritegfx ANIM_TAG_ICE_CRYSTALS + fadetobg BG_ICE + waitbgfadein + createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_BUBBLE_BEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 4, 4, 0, 10 + createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, -20, 70, 0, 42, 35 + createsprite gIceBeamInnerCrystalSpriteTemplate, ANIM_ATTACKER, 2, -20, 58, 0, 30, 35 + createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, -20, -12, 0, 22, 40 + createsprite gIceBeamInnerCrystalSpriteTemplate, ANIM_ATTACKER, 2, -20, 0, 0, 10, 40 + delay 5 + createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, -10, -30, 10, -12, 45 + createsprite gIceBeamInnerCrystalSpriteTemplate, ANIM_ATTACKER, 2, -10, -42, 10, -24, 45 + createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, -10, -20, 10, -36, 45 + createsprite gIceBeamInnerCrystalSpriteTemplate, ANIM_ATTACKER, 2, -10, -32, 10, -24, 45 + delay 5 + createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, 0, 10, 20, 22, 45 + createsprite gIceBeamInnerCrystalSpriteTemplate, ANIM_ATTACKER, 2, 0, -2, 20, 10, 45 + createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 20, -2, 30 + createsprite gIceBeamInnerCrystalSpriteTemplate, ANIM_ATTACKER, 2, 0, 8, 20, 10, 30 + delay 1 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 4, -31, 0, 7, RGB(0, 20, 31) + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 25, 1 + waitforvisualfinish + delay 20 + call IceCrystalEffectShort + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 4, 5, 7, 0, RGB(0, 20, 31) + waitforvisualfinish + restorebg + waitbgfadein + clearmonbg ANIM_TARGET + blendoff + end + +Move_SHADOW_CLAW: + loadspritegfx ANIM_TAG_BLUE_LIGHT_WALL + loadspritegfx ANIM_TAG_CLAW_SLASH + loadspritegfx ANIM_TAG_TORN_METAL + fadetobg BG_GHOST + waitbgfadein + monbg ANIM_TARGET + setalpha 12, 8 + createsprite gHorizontalLungeSpriteTemplate ANIM_ATTACKER, 2, 6, 4 + delay 4 + createvisualtask AnimTask_ShakeMon2 2, ANIM_TARGET, 2, 0, 18, 1 + createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, -10, -10, 0 + createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, -10, 10, 0 + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + delay 12, + createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, 10, -10, 1 + createsprite gClawSlashSpriteTemplate, ANIM_TARGET, 2, 10, 10, 1 + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + waitforvisualfinish + restorebg + waitbgfadein + waitforvisualfinish + blendoff + clearmonbg ANIM_TARGET + end + +Move_THUNDER_FANG: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_LIGHTNING + loadspritegfx ANIM_TAG_SHARP_TEETH + monbg ANIM_TARGET + setalpha 12, 8 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 2, 0, 16, RGB_BLACK + waitforvisualfinish + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 + delay 1 + createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -48 + delay 1 + createsprite gLightningSpriteTemplate, ANIM_ATTACKER, 2, 0, -16 + delay 1 + createsprite gLightningSpriteTemplate, ANIM_ATTACKER, 2, 0, 16 + delay 1 + playsewithpan SE_M_BITE, SOUND_PAN_TARGET + createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0, -32, 0, 0, 819, 10 + createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, 4, 0, -819, 10 + delay 1 + playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 + delay 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 2 + delay 1 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 2, 16, 0, RGB_BLACK + delay 20 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + delay 1 + end + +Move_ICE_FANG: + monbg ANIM_TARGET + setalpha 12, 8 + loadspritegfx ANIM_TAG_ICE_CRYSTALS + loadspritegfx ANIM_TAG_SHARP_TEETH + loadspritegfx ANIM_TAG_IMPACT + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 0, 7, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 0, 9, RGB(12, 26, 31) + delay 20 + playsewithpan SE_M_STRING_SHOT, SOUND_PAN_TARGET + createsprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 0 + createsprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 64 + createsprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 128 + createsprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 192 + delay 5 + createsprite gIceCrystalSpiralInwardLarge, ANIM_ATTACKER, 2, 32 + createsprite gIceCrystalSpiralInwardLarge, ANIM_ATTACKER, 2, 96 + createsprite gIceCrystalSpiralInwardLarge, ANIM_ATTACKER, 2, 160 + createsprite gIceCrystalSpiralInwardLarge, ANIM_ATTACKER, 2, 224 + playsewithpan SE_M_BITE, SOUND_PAN_TARGET + createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0, -32, 0, 0, 819, 10 + createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, 4, 0, -819, 10 + waitforvisualfinish + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 2 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 4, 7, 1 + delay 15 + call IceCrystalEffectShort + delay 5 + createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 9, 0, RGB(12, 26, 31) + waitforvisualfinish + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7, 0, RGB_BLACK + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + delay 1 + end + +Move_FIRE_FANG: + loadspritegfx ANIM_TAG_SMALL_EMBER + loadspritegfx ANIM_TAG_SHARP_TEETH + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_TARGET + setalpha 12, 8 + createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 0, 9, RGB_RED + createsprite gFireSpiralInwardSpriteTemplate, ANIM_TARGET, 1, 0 + createsprite gFireSpiralInwardSpriteTemplate, ANIM_TARGET, 1, 64 + createsprite gFireSpiralInwardSpriteTemplate, ANIM_TARGET, 1, 128 + createsprite gFireSpiralInwardSpriteTemplate, ANIM_TARGET, 1, 196 + createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0, -32, 0, 0, 819, 10 + createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, 4, 0, -819, 10 + playsewithpan SE_M_BITE, SOUND_PAN_TARGET + delay 10 + waitforvisualfinish + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 2 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 4, 7, 1 + call FireSpreadEffect + delay 4 + playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 0, 9, 0, RGB_RED + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + delay 1 + end + +Move_SHADOW_SNEAK: + loadspritegfx ANIM_TAG_LICK + setalpha 0, 16 + delay 1 + createvisualtask AnimTask_InitMementoShadow, 2 + delay 1 + createvisualtask AnimTask_MoveAttackerMementoShadow, 5 + playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER + delay 48 + playsewithpan SE_M_PSYBEAM2, SOUND_PAN_ATTACKER + waitforvisualfinish + createvisualtask sub_8114470, 2 + setalpha 0, 16 + delay 1 + playsewithpan SE_M_LICK, SOUND_PAN_TARGET + createsprite gLickSpriteTemplate, ANIM_TARGET, 2, 0, 0 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 16, 1 + waitforvisualfinish + clearmonbg_23 ANIM_TARGET + delay 1 + blendoff + delay 1 + end + +Move_MUD_BOMB: + loadspritegfx ANIM_TAG_MUD_SAND + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + createsprite gMudBombToss, ANIM_TARGET, 2, 20, 0, 0, 0, 35, -25 + delay 5 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + createsprite gMudBombToss, ANIM_TARGET, 2, 20, 0, 0, 0, 35, -25 + delay 5 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + createsprite gMudBombToss, ANIM_TARGET, 2, 20, 0, 0, 0, 35, -25 + delay 5 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + createsprite gMudBombToss, ANIM_TARGET, 2, 20, 0, 0, 0, 35, -25 + delay 11 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 5, 1 + createsprite gMudBombSplash, ANIM_TARGET, 2, 42, 27, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, 42, 27, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, -27, 44, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, 39, -28, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, -42, -42, 20 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 5 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 5, 1 + createsprite gMudBombSplash, ANIM_TARGET, 2, 0, 40, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, -8, -44, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, -46, -28, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, 46, 9, 20 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + delay 5 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 5, 1 + createsprite gMudBombSplash, ANIM_TARGET, 2, 42, 0, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, -43, -12, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, 16, -46, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, -16, 44, 20 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + delay 5 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 5, 1 + createsprite gMudBombSplash, ANIM_TARGET, 2, 0, 40, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, -8, -44, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, -46, -28, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, 46, 9, 20 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + delay 5 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 5, 1 + createsprite gMudBombSplash, ANIM_TARGET, 2, 42, 0, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, -43, -12, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, 16, -46, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, -16, 44, 20 + waitforvisualfinish + end + +Move_PSYCHO_CUT: + loadspritegfx ANIM_TAG_SPIRAL + loadspritegfx ANIM_TAG_PSYCHO_CUT + monbg ANIM_ATK_PARTNER + createsprite gPsychoCutSpiralSpriteTemplate, 2, 4, 0, 0, 0, 0 + createvisualtask AnimTask_BlendBattleAnimPal, 1, 1, 2, 0, 4, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 1, 2, 2, 0, 10, RGB(20, 12, 23) + delay 30 + clearmonbg ANIM_ATK_PARTNER + waitforvisualfinish + monbg ANIM_TARGET + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER, + createsprite gPsychoCutSpriteTemplate, 130, 5, 20, 0, -8, 0, 20 + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal, 1, 1, 2, 4, 0, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 1, 2, 2, 10, 0, RGB(20, 12, 23) + clearmonbg ANIM_TARGET + blendoff + waitforvisualfinish + end + +Move_ZEN_HEADBUTT: + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT + loadspritegfx ANIM_TAG_WATER_IMPACT + monbg ANIM_ATTACKER + setalpha 12, 8 + createsprite gSimplePaletteBlendSpriteTemplate, 2, 5, 1, 2, 0, 4, 0 + waitforvisualfinish + createsprite gZenHeadbuttSpriteTemplate, 66, 1, 0 + delay 18, + playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER + waitforvisualfinish + delay 2, + playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER + loadspritegfx ANIM_TAG_IMPACT + createsprite gBowMonSpriteTemplate, 2, 1, 0 + playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER + waitforvisualfinish + delay 2 + createsprite gBowMonSpriteTemplate, 2, 1, 1 + waitforvisualfinish + createvisualtask AnimTask_ShakeMonInPlace, 2, 5, 0, 2, 0, 4, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 + createsprite gBowMonSpriteTemplate, 2, 1, 2 + createsprite gAquaTailHitSpriteTemplate, 131, 4, 0, 0, 1, 1 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + waitforvisualfinish + createsprite gSimplePaletteBlendSpriteTemplate, 2, 5, 1, 4, 4, 0, 0 + clearmonbg ANIM_ATTACKER + blendoff + delay 1 + end + +Move_MIRROR_SHOT: + loopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 28, 2 + createvisualtask AnimTask_MetallicShine, 5, 1, 0, 0 + waitforvisualfinish + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_WHITE_CIRCLE_OF_LIGHT + createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 10, RGB_WHITEALPHA + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 12, 12, RGB(21, 21, 21) + waitforvisualfinish + createsprite gRandomPosHitSplatSpriteTemplate, 131, 2, 1, 2 + createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 3 + createsprite gRandomPosHitSplatSpriteTemplate, 131, 2, 1, 2 + createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 3 + createsprite gRandomPosHitSplatSpriteTemplate, 131, 2, 1, 2 + createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 3 + createsprite gRandomPosHitSplatSpriteTemplate, 131, 2, 1, 2 + createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 3 + createsprite gRandomPosHitSplatSpriteTemplate, 131, 2, 1, 2 + createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 3 + createsprite gRandomPosHitSplatSpriteTemplate, 131, 2, 1, 2 + createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_M_VITAL_THROW2, SOUND_PAN_TARGET + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 10, 0, RGB_WHITEALPHA + createvisualtask AnimTask_HorizontalShake, 5, 1, 5, 14 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + blendoff + end + +Move_FLASH_CANNON: + loadspritegfx ANIM_TAG_HANDS_AND_FEET + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT + loadspritegfx ANIM_TAG_ELECTRIC_ORBS + loadspritegfx ANIM_TAG_GUST + loadspritegfx ANIM_TAG_FLASH_CANNON_BALL + monbg ANIM_ATTACKER + setalpha 13, 8 + createvisualtask AnimTask_ElectricChargingParticles, 2, 0, 60, 2, 12 + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + delay 30 + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + delay 30 + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + createsprite gFlashCannonGrayChargeTemplate, ANIM_ATTACKER, 2, 0 + delay 25 + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + delay 20 + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + delay 15 + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + delay 10 + delay 6 + loopsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER, 6, 5 + waitforvisualfinish + playsewithpan SE_M_PAY_DAY, SOUND_PAN_ATTACKER + createsprite gFlashCannonBallMovementTemplate, ANIM_TARGET, 2, 0, 0, 0x15 + clearmonbg ANIM_ATTACKER + waitforvisualfinish + playsewithpan SE_M_LEER, SOUND_PAN_ATTACKER + createvisualtask AnimTask_Flash, 2 + createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 1, 16, 0, 0x1f + createvisualtask AnimTask_ShakeMon2, 2, 1, 2, 0, 15, 1 + waitforvisualfinish + clearmonbg ANIM_TARGET + end + +Move_ROCK_CLIMB: + createvisualtask AnimTask_Splash, 2, 2, ANIM_ATTACKER, 3 + delay 8 + loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 38, 3 + waitforvisualfinish + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_MUD_SAND + loadspritegfx ANIM_TAG_ROCKS + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + createvisualtask AnimTask_Rollout, 2, 0 + waitforvisualfinish + createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, 5, 0, 1, 30, 1, RGB(0, 16, 1) + createsprite gBasicHitSplatSpriteTemplate, 131, 4, -15, 8, 1, 1 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 1 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, 131, 4, -5, -12, 1, 1 + delay 1 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, 131, 4, 0, -32, 1, 1 + delay 1 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, 131, 4, 5, -52, 1, 1 + createsprite gSlideMonToOffsetSpriteTemplate, 2, 5, 1, -25, 16, 1, 4 + delay 4 + createvisualtask AnimTask_ShakeMonInPlace, 2, 5, 1, 0, 3, 6, 1 + delay 30 + createsprite gSlideMonToOriginalPosSpriteTemplate, 2, 3, 0, 0, 6 + delay 4 + createsprite gSlideMonToOriginalPosSpriteTemplate, 2, 3, 1, 0, 6 + clearmonbg ANIM_DEF_PARTNER + blendoff + end + +Move_DEFOG: + loadspritegfx ANIM_TAG_WHITE_CIRCLE_OF_LIGHT + monbg ANIM_ATTACKER + setalpha 12, 8 + playsewithpan SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER + createsprite gLusterPurgeCircleSpriteTemplate, ANIM_ATTACKER, 41, 0, 0, 0, 0 + delay 20 + createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, -1 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_WHITE_CIRCLE_OF_LIGHT, 2, 0, 16, -1 + waitforvisualfinish + waitforvisualfinish + delay 16 + createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, -1 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + blendoff + end + +Move_TRICK_ROOM:: + call InitRoomAnimation + fadetobg BG_TRICK_ROOM + waitbgfadein + delay 0x40 + restorebg + waitbgfadein + blendoff + end +InitRoomAnimation: + setalpha 8, 8 + playsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET + launchtask AnimTask_ScaleMonAndRestore 5 5 0xfffa 0xfffa 15, 1 1 + return + +Move_DRACO_METEOR: + loadspritegfx ANIM_TAG_WARM_ROCK + loadspritegfx ANIM_TAG_GOLD_STARS + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_ICE_SPIKES + playsewithpan SE_M_CHARGE, SOUND_PAN_TARGET + fadetobg BG_COSMIC + waitbgfadein + waitforvisualfinish + createsprite gDracoMeteorSmashSpriteTemplate, 131, 5, -47, -63, 72, 32, 30 + delay 10 + createsprite gDracoMeteorSmashSpriteTemplate, 131, 5, -111, -63, 8, 32, 30 + delay 40 + createsprite gDracoMetorSpriteTemplate, 131, 4, 0, 0, 0, 30 + createsprite gDracoMeteorSmashSpriteTemplate, 131, 5, -79, -63, 40, 32, 30 + delay 20 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + delay 10 + restorebg + waitbgfadein + waitforvisualfinish + end + +Move_DISCHARGE: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_SPARK_2 + delay 0 + createvisualtask AnimTask_BlendColorCycle, 2, 3, -31, 1, 5, 5, RGB(31, 31, 20) + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 24, 190, 12, 0, 1, 0 + delay 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 24, 22, 12, 0, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 24, 121, 13, 0, 1, 1 + delay 0 + createvisualtask AnimTask_BlendColorCycle, 2, 3, -31, 1, 0, 0, RGB(31, 31, 20) + delay 10 + createvisualtask AnimTask_BlendColorCycle 2, 3, -31, 1, 5, 5, RGB(31, 31, 20) + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 24, 60, 10, 0, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 24, 42, 11, 0, 1, 1 + loadspritegfx ANIM_TAG_WHITE_CIRCLE_OF_LIGHT + loadspritegfx ANIM_TAG_IMPACT + waitbgfadein + monbg ANIM_ATTACKER + setalpha 12, 8 + playsewithpan SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER + createsprite gLusterPurgeCircleSpriteTemplate, ANIM_ATTACKER, 41, 0, 0, 0, 0 + delay 20 + createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_WHITE_CIRCLE_OF_LIGHT, 2, 0, 16, RGB_WHITEALPHA + waitforvisualfinish + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 12, 12, RGB(0, 0, 23) + waitforvisualfinish + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 + createvisualtask SoundTask_PlaySE1WithPanning, 5, 215, SOUND_PAN_TARGET + delay 3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_DEF_PARTNER, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_ATK_PARTNER, 2 + createvisualtask SoundTask_PlaySE1WithPanning, 5, 215, SOUND_PAN_TARGET + delay 3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_DEF_PARTNER, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_ATK_PARTNER, 2 + createvisualtask SoundTask_PlaySE1WithPanning, 5, 215, SOUND_PAN_TARGET + delay 3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_DEF_PARTNER, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_ATK_PARTNER, 2 + createvisualtask SoundTask_PlaySE1WithPanning, 5, 215, SOUND_PAN_TARGET + delay 3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_DEF_PARTNER, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_ATK_PARTNER, 2 + createvisualtask SoundTask_PlaySE1WithPanning, 5, 215, SOUND_PAN_TARGET + delay 3 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_DEF_PARTNER, 2 + createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_ATK_PARTNER, 2 + createvisualtask SoundTask_PlaySE1WithPanning, 5, 215, SOUND_PAN_TARGET + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA + createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_DEF_PARTNER, 5, 14 + createvisualtask AnimTask_HorizontalShake, 5, ANIM_ATK_PARTNER, 5, 14 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + blendoff + call DischargeElectrify + waitforvisualfinish + end +DischargeElectrify: + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 5, 0, 5, 0, ANIM_TARGET + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 5, 0, 5, 0, ANIM_DEF_PARTNER + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 5, 0, 5, 0, ANIM_ATK_PARTNER + delay 2 + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -5, 10, 5, 1, ANIM_TARGET + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -5, 10, 5, 1, ANIM_DEF_PARTNER + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -5, 10, 5, 1, ANIM_ATK_PARTNER + delay 2 + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 15, 20, 5, 2, ANIM_TARGET + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 15, 20, 5, 2, ANIM_DEF_PARTNER + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 15, 20, 5, 2, ANIM_ATK_PARTNER + delay 2 + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -15, -10, 5, 0, ANIM_TARGET + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -15, -10, 5, 0, ANIM_DEF_PARTNER + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -15, -10, 5, 0, ANIM_ATK_PARTNER + delay 2 + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 25, 0, 5, 1, ANIM_TARGET + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 25, 0, 5, 1, ANIM_DEF_PARTNER + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 25, 0, 5, 1, ANIM_ATK_PARTNER + delay 2 + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -8, 8, 5, 2, ANIM_TARGET + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -8, 8, 5, 2, ANIM_DEF_PARTNER + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -8, 8, 5, 2, ANIM_ATK_PARTNER + delay 2 + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 2, -8, 5, 0, ANIM_TARGET + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 2, -8, 5, 0, ANIM_DEF_PARTNER + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 2, -8, 5, 0, ANIM_ATK_PARTNER + delay 2 + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -20, 15, 5, 1, ANIM_TARGET + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -20, 15, 5, 1, ANIM_DEF_PARTNER + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -20, 15, 5, 1, ANIM_ATK_PARTNER + return + +Move_LAVA_PLUME: + loadspritegfx ANIM_TAG_FIRE_PLUME + loopsewithpan 152, SOUND_PAN_ATTACKER, 9, 2 + createvisualtask AnimTask_BlendColorCycle, 2, 2, 2, 2, 0, 11, RGB_RED + createvisualtask AnimTask_ShakeMon2 2, ANIM_TARGET, 1, 0, 32, 1 + createvisualtask AnimTask_ShakeMon2 2, ANIM_DEF_PARTNER, 1, 0, 32, 1 + createvisualtask AnimTask_ShakeMon2 2, ANIM_ATK_PARTNER, 1, 0, 32, 1 + waitforvisualfinish + createsprite gLavaPlumeSpriteTemplate, 130, 1, 0 + createsprite gLavaPlumeSpriteTemplate, 130, 1, 32 + createsprite gLavaPlumeSpriteTemplate, 130, 1, 64 + createsprite gLavaPlumeSpriteTemplate, 130, 1, 96 + createsprite gLavaPlumeSpriteTemplate, 130, 1, 128 + createsprite gLavaPlumeSpriteTemplate, 130, 1, 160 + createsprite gLavaPlumeSpriteTemplate, 130, 1, 192 + createsprite gLavaPlumeSpriteTemplate, 130, 1, 224 + playsewithpan SE_M_SACRED_FIRE, SOUND_PAN_ATTACKER + waitforvisualfinish + end + +Move_LEAF_STORM: + loadspritegfx ANIM_TAG_RAZOR_LEAF + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_LEAF + monbg ANIM_DEF_PARTNER + monbgprio_2A ANIM_TARGET + setalpha 12, 8 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 0, 12, RGB(13, 31, 12) + waitforvisualfinish + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 14, -12, 0, -12, 15, 0, 0 + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 26, 8, 12, 8, 15, 0, 0 + delay 3 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 14, -12, 0, -16, 19, 0, 0 + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 26, 8, 12, 12, 19, 0, 0 + delay 3 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 14, -12, 0, -20, 23, 0, 0 + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 26, 8, 12, 16, 23, 0, 0 + delay 3 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 5, 0, 50, 1 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 14, -12, 0, -24, 27, 0, 0 + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 26, 8, 12, 20, 27, 0, 0 + delay 3 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 14, -12, 0, -24, 27, 0, 0 + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 26, 8, 12, 20, 27, 0, 0 + delay 3 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 14, -12, 0, -20, 23, 0, 0 + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 26, 8, 12, 16, 23, 0, 0 + delay 3 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 14, -12, 0, -16, 19, 0, 0 + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 26, 8, 12, 12, 19, 0, 0 + delay 3 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 14, -12, 0, -12, 15, 0, 0 + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 26, 8, 12, 8, 15, 0, 0 + delay 3 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 14, -12, 0, -8, 11, 0, 0 + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 26, 8, 12, 8, 15, 0, 0 + delay 3 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 14, -12, 0, -16, 19, 0, 0 + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 26, 8, 12, 12, 19, 0, 0 + delay 3 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 14, -12, 0, -20, 23, 0, 0 + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 26, 8, 12, 16, 23, 0, 0 + delay 3 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 14, -12, 0, -24, 27, 0, 0 + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 26, 8, 12, 20, 27, 0, 0 + delay 3 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 14, -12, 0, -24, 27, 0, 0 + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 26, 8, 12, 20, 27, 0, 0 + delay 3 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 14, -12, 0, -20, 23, 0, 0 + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 26, 8, 12, 16, 23, 0, 0 + delay 3 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 14, -12, 0, -16, 19, 0, 0 + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 26, 8, 12, 12, 19, 0, 0 + delay 3 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 14, -12, 0, -12, 15, 0, 0 + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 26, 8, 12, 8, 15, 0, 0 + delay 3 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 14, -12, 0, -16, 19, 0, 0 + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 26, 8, 12, 12, 19, 0, 0 + delay 3 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 14, -12, 0, -20, 23, 0, 0 + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 26, 8, 12, 16, 23, 0, 0 + delay 3 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 14, -12, 0, -24, 27, 0, 0 + createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 26, 8, 12, 20, 27, 0, 0 + delay 3 + waitforvisualfinish + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, 1, 0 + createsprite gBattleAnimSpriteTemplate_LeafStorm2, ANIM_TARGET, 2, 1, 1, 0, -36, 10 + createsprite gBattleAnimSpriteTemplate_LeafStorm2, ANIM_TARGET, 2, 1, 1, 24, -12, 10 + createsprite gBattleAnimSpriteTemplate_LeafStorm2, ANIM_TARGET, 2, 1, 1, 24, 12, 10 + createsprite gBattleAnimSpriteTemplate_LeafStorm2, ANIM_TARGET, 2, 1, 1, 0, 36, 10 + createsprite gBattleAnimSpriteTemplate_LeafStorm2, ANIM_TARGET, 2, 1, 1, -24, 12, 10 + createsprite gBattleAnimSpriteTemplate_LeafStorm2, ANIM_TARGET, 2, 1, 1, -24, -12, 10 + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + delay 2 + createsprite gBattleAnimSpriteTemplate_LeafStorm2, ANIM_TARGET, 2, 1, 1, 36, 0, 10 + createsprite gBattleAnimSpriteTemplate_LeafStorm2, ANIM_TARGET, 2, 1, 1, 12, -24, 10 + createsprite gBattleAnimSpriteTemplate_LeafStorm2, ANIM_TARGET, 2, 1, 1, 12, 24, 10 + createsprite gBattleAnimSpriteTemplate_LeafStorm2, ANIM_TARGET, 2, 1, 1, -36, 0, 10 + createsprite gBattleAnimSpriteTemplate_LeafStorm2, ANIM_TARGET, 2, 1, 1, -12, 24, 10 + createsprite gBattleAnimSpriteTemplate_LeafStorm2, ANIM_TARGET, 2, 1, 1, -12, -24, 10 + waitforvisualfinish + blendoff + delay 0 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 12, 0, RGB(13, 31, 12) + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + end + +Move_POWER_WHIP: + loadspritegfx ANIM_TAG_WHIP_HIT + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 10 + delay 6 + playsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET + createsprite gVineWhipSpriteTemplate, ANIM_TARGET, 2, 0, 0 + delay 6 + call SetImpactBackground + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 8, 1 + restorebg + waitbgfadein + end + +Move_ROCK_WRECKER: + jumpargeq 7, 1, RockWrecker_1 + fadetobg BG_ROCK_WRECKER + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, -1024, 0, 1, -1 + goto RockWrecker_2 +RockWrecker_1: + fadetobg BG_ROCK_WRECKER + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, -1024, 0, 0, -1 + loadspritegfx ANIM_TAG_ROCKS + loadspritegfx ANIM_TAG_IMPACT + createsprite gHorizontalLungeSpriteTemplate, 2, 2, 4, 6 + delay 3 + playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER + createsprite gRockBlastRockSpriteTemplate, 130, 6, 16, 0, 0, 0, 25, 257 + waitforvisualfinish + createsprite gBasicHitSplatSpriteTemplate, 131, 4, 0, 0, 1, 1 + playsewithpan SE_M_ROCK_THROW SOUND_PAN_TARGET + createsprite gRockFragmentSpriteTemplate, 130, 6, 0, 0, 20, 24, 14, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1 + createsprite gRockFragmentSpriteTemplate, 130, 6, 5, 0, -20, 24, 14, 1 + createsprite gRockFragmentSpriteTemplate, 130, 6, 0, 5, 20, -18, 14, 2 + createsprite gRockFragmentSpriteTemplate, 130, 6, -5, 0, -20, -18, 14, 2 + waitforvisualfinish + call UnsetPsychicBg + end +RockWrecker_2: + loadspritegfx ANIM_TAG_ROCKS + loadspritegfx ANIM_TAG_IMPACT + createsprite gHorizontalLungeSpriteTemplate, 2, 2, 4, 6 + delay 3 + playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER + createsprite gRockBlastRockSpriteTemplate, 130, 6, 16, 0, 0, 0, 25, 257 + waitforvisualfinish + createsprite gBasicHitSplatSpriteTemplate, 131, 4, 0, 0, 1, 1 + playsewithpan SE_M_ROCK_THROW SOUND_PAN_TARGET + createsprite gRockFragmentSpriteTemplate 130, 6, 0, 0, 20, 24, 14, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1 + createsprite gRockFragmentSpriteTemplate 130, 6, 5, 0, -20, 24, 14, 1 + createsprite gRockFragmentSpriteTemplate 130, 6, 0, 5, 20, -18, 14, 2 + createsprite gRockFragmentSpriteTemplate 130, 6, -5, 0, -20, -18, 14, 2 + waitforvisualfinish + call UnsetPsychicBg + end + +Move_CROSS_POISON: + loadspritegfx ANIM_TAG_POISON_BUBBLE + loadspritegfx ANIM_TAG_CROSS_IMPACT + monbg ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, RGB_WHITE, 10, 0, 10 + createsprite gCrossImpactSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 20 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 7, 0, 9, 1 + waitforvisualfinish + call PoisonBubblesEffect + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end + +Move_GUNK_SHOT: + loadspritegfx ANIM_TAG_WATER_ORB + loadspritegfx ANIM_TAG_POISON_BUBBLE + loadspritegfx ANIM_TAG_WATER_IMPACT + loadspritegfx ANIM_TAG_POISON_BUBBLE + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + createvisualtask AnimTask_ShakeMon 5, 5, ANIM_ATTACKER, 0, 2, 40, 1 + delay 6 + panse_1B SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 2, 0 + createvisualtask AnimTask_StartSinAnimTimer, 5, 1, 100 + call GunkShotParticles + call GunkShotParticles + call GunkShotParticles + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 27, 1 + loopsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET, 3, 15 + call GunkShotImpact + call GunkShotParticles + call GunkShotParticles + call GunkShotImpact + call GunkShotParticles + call GunkShotParticles + call GunkShotImpact + call GunkShotParticles + call GunkShotParticles + call GunkShotImpact + call GunkShotParticles + call GunkShotParticles + call GunkShotImpact + delay 1 + delay 1 + call GunkShotImpact + call PoisonBubblesEffect + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + end +GunkShotParticles: + createsprite gGunkShoParticlesSpriteTemplate, 3, 4, 10, 10, 0, 16 + createsprite gGunkShoParticlesSpriteTemplate, 3, 4, 10, 10, 0, -16 + delay 1 + createsprite gGunkShoParticlesSpriteTemplate, 3, 4, 10, 10, 0, 16 + createsprite gGunkShoParticlesSpriteTemplate, 3, 4, 10, 10, 0, -16 + delay 1 + return +GunkShotImpact: + createsprite gGunkShotImpactSpriteTemplate, 4, 4, 0, 15, 1, 1 + createsprite gGunkShotImpactSpriteTemplate, 4, 4, 0, -15, 1, 1 + return + +Move_IRON_HEAD: + loadspritegfx ANIM_TAG_GUST + loadspritegfx ANIM_TAG_IMPACT + loopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 28, 2 + createvisualtask AnimTask_MetallicShine, 5, 1, 0, 0 + waitforvisualfinish + createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0 + playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER + waitforvisualfinish + delay 2 + createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 1 + waitforvisualfinish + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 4, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 7, 1 + createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 2 + createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 1 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + waitforvisualfinish + createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, ANIM_ATTACKER, 1 + waitforvisualfinish + end + +Move_MAGNET_BOMB: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_SPARK_2 + delay 0 + playsewithpan 119, 192 + createsprite gSparkElectricitySpriteTemplate, 0, 7, 32, 24, 190, 12, 0, 1, 0 + delay 0 + createsprite gSparkElectricitySpriteTemplate, 0, 7, 80, 24, 22, 12, 0, 1, 0 + createsprite gSparkElectricitySpriteTemplate, 0, 7, 156, 24, 121, 13, 0, 1, 1 + delay 0 + playsewithpan 119, 192 + createsprite gSparkElectricitySpriteTemplate 0, 7, 100, 24, 60, 10, 0, 1, 0 + createsprite gSparkElectricitySpriteTemplate 0, 7, 170, 24, 42, 11, 0, 1, 1 + delay 0 + createsprite gSparkElectricitySpriteTemplate 0, 7, 238, 24, 165, 10, 0, 1, 1 + delay 0 + loadspritegfx ANIM_TAG_RED_ORB + playsewithpan 152, SOUND_PAN_ATTACKER + createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0 + waitforvisualfinish + delay 30 + createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB(19, 31, 31), 12, 5, 1 + delay 4 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0 + playsewithpan 217, SOUND_PAN_ATTACKER + createsprite gHiddenPowerOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 0 + createsprite gHiddenPowerOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 42 + createsprite gHiddenPowerOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 84 + createsprite gHiddenPowerOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 126 + createsprite gHiddenPowerOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 168 + createsprite gHiddenPowerOrbSpriteTemplate, ANIM_ATTACKER, 2, 26, 210 + delay 52 + setarg 7, -1 + playsewithpan 207, SOUND_PAN_ATTACKER + createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0 + createsprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 0 + createsprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 32 + createsprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 64 + createsprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 96 + createsprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 128 + createsprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 160 + createsprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 192 + createsprite gHiddenPowerOrbScatterSpriteTemplate, ANIM_TARGET, 2, 224 + loadspritegfx ANIM_TAG_GRAY_SMOKE + loadspritegfx ANIM_TAG_BLACK_BALL + playsewithpan 177, 63 + createsprite gOctazookaSmokeSpriteTemplate, 130, 4, 8, 8, 1, 0 + delay 2 + createsprite gOctazookaSmokeSpriteTemplate, 130, 4, -8, -8, 1, 0 + delay 2 + createsprite gOctazookaSmokeSpriteTemplate, 130, 4, 8, -8, 1, 0 + delay 2 + createsprite gOctazookaSmokeSpriteTemplate, 130, 4, -8, 8, 1, 0 + waitforvisualfinish + playsewithpan 177, 63 + createsprite gOctazookaSmokeSpriteTemplate, 130, 4, 8, 8, 1, 0 + delay 2 + createsprite gOctazookaSmokeSpriteTemplate, 130, 4, -8, -8, 1, 0 + delay 2 + createsprite gOctazookaSmokeSpriteTemplate, 130, 4, 8, -8, 1, 0 + delay 2 + createsprite gOctazookaSmokeSpriteTemplate, 130, 4, -8, 8, 1, 0 + waitforvisualfinish + end + +Move_STONE_EDGE: + loadspritegfx ANIM_TAG_STONE_EDGE + loadspritegfx ANIM_TAG_IMPACT + playsewithpan SE_M_ROCK_THROW SOUND_PAN_TARGET + createsprite gStoneEdgeSpriteTemplate, 130, 7, 0, 28, 528, 30, 13, 50, 1 + delay 2 + createsprite gStoneEdgeSpriteTemplate, 130, 7, 0, 32, 480, 20, 16, -46, 1 + delay 2 + loopsewithpan 131, SOUND_PAN_TARGET 24, 3 + createsprite gStoneEdgeSpriteTemplate, 130, 7, 0, 33, 576, 20, 8, 42, 1 + delay 2 + createsprite gStoneEdgeSpriteTemplate, 130, 7, 0, 31, 400, 25, 11, -42, 1 + delay 2 + createsprite gStoneEdgeSpriteTemplate, 130, 7, 0, 28, 512, 25, 16, 46, 1 + delay 2 + createsprite gStoneEdgeSpriteTemplate, 130, 7, 0, 33, 464, 30, 15, 49, 1 + delay 2 + createsprite gStoneEdgeSpriteTemplate, 130, 7, 0, 28, 528, 30, 13, 50, 1 + delay 2 + createsprite gStoneEdgeSpriteTemplate, 130, 7, 0, 32, 480, 20, 16, -46, 1 + delay 2 + createsprite gStoneEdgeSpriteTemplate, 130, 7, 0, 33, 576, 20, 8, 42, 1 + delay 2 + createsprite gStoneEdgeSpriteTemplate, 130, 7, 0, 31, 400, 25, 11, -42, 1 + delay 2 + createsprite gStoneEdgeSpriteTemplate, 130, 7, 0, 28, 512, 25, 16, 46, 1 + delay 2 + createsprite gStoneEdgeSpriteTemplate, 130, 7, 0, 33, 464, 30, 15, 49, 1 + delay 2 + createsprite gStoneEdgeSpriteTemplate, 130, 7, 0, 28, 528, 30, 13, 50, 1 + delay 2 + createsprite gStoneEdgeSpriteTemplate, 130, 7, 0, 32, 480, 20, 16, -46, 1 + delay 2 + createsprite gStoneEdgeSpriteTemplate, 130, 7, 0, 33, 576, 20, 8, 42, 1 + delay 2 + createsprite gStoneEdgeSpriteTemplate, 130, 7, 0, 31, 400, 25, 11, -42, 1 + delay 2 + createsprite gStoneEdgeSpriteTemplate, 130, 7, 0, 28, 512, 25, 16, 46, 1 + delay 2 + createsprite gStoneEdgeSpriteTemplate, 130, 7, 0, 33, 464, 30, 15, 49, 1 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, 131, 4, -32, -16, 1, 3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMonInPlace, 2, 5, 1, 3, 0, 12, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, 5, 3, 3, 0, 12, 1 + delay 4 + createsprite gRandomPosHitSplatSpriteTemplate, 131, 2, 1, 3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 4 + createsprite gRandomPosHitSplatSpriteTemplate, 131, 2, 1, 3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 4 + createsprite gBasicHitSplatSpriteTemplate, 131, 4, 32, 20, 1, 3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + end + +Move_CAPTIVATE: + loadspritegfx ANIM_TAG_MAGENTA_HEART + loadspritegfx ANIM_TAG_SPARKLE_2 + createvisualtask AnimTask_RockMonBackAndForth, 5, 3, 0, 2, 0 + createsprite gMagentaHeartSpriteTemplate, 3, 2, 0, 20 + playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER + delay 15 + createsprite gMagentaHeartSpriteTemplate, 3, 2, -20, 20 + playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER + delay 15 + createsprite gMagentaHeartSpriteTemplate, 3, 2, 20, 20 + playsewithpan 228, SOUND_PAN_ATTACKER, + call GrantingStarsEffect + waitforvisualfinish + end + +Move_STEALTH_ROCK: + loadspritegfx ANIM_TAG_STEALTH_ROCK + monbg ANIM_DEF_PARTNER + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + waitplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET, 28 + createsprite gStealthRockSpriteTemplate, ANIM_TARGET, 2, 20, 0, 0, 24, 30 + delay 10 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + waitplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET, 28 + createsprite gStealthRockSpriteTemplate, ANIM_TARGET, 2, 20, 0, -24, 24, 30 + delay 10 + waitplaysewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET, 28 + createsprite gStealthRockSpriteTemplate, ANIM_TARGET, 2, 20, 0, 24, 24, 30 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + end + +Move_GRASS_KNOT: + loadspritegfx ANIM_TAG_RAZOR_LEAF + loadspritegfx ANIM_TAG_IMPACT + createsprite gSlideMonToOffsetSpriteTemplate, 2, 5, 0, 20, 0, 0, 4 + createsprite gGrassKnotSpriteTemplate, 130, 6, -18, 19, 40, 8, 160, 0 + delay 4 + createsprite gBasicHitSplatSpriteTemplate, 130, 4, -8, 8, 1, 2 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 4, 6, 384, 1, 2 + playsewithpan SE_M_VITAL_THROW2 SOUND_PAN_TARGET + waitforvisualfinish + createsprite gSlideMonToOriginalPosSpriteTemplate, 2, 3, 0, 1, 4 + end + +Move_CHATTER: + loadspritegfx ANIM_TAG_JAGGED_MUSIC_NOTE + loadspritegfx ANIM_TAG_THIN_RING + loadspritegfx ANIM_TAG_MUSIC_NOTES + monbg ANIM_DEF_PARTNER + createvisualtask AnimTask_UproarDistortion, 2, 0 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1f, 8 + createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, 0xff + createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 0x1d, -12, 0 + createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, -12, 0xffe3, 1 + delay 16 + createvisualtask AnimTask_UproarDistortion, 2, 0 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1f, 8 + createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, 0xff + createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 12, 0xffe3, 1 + createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 0xffe3, -12, 0 + delay 16 + createvisualtask AnimTask_UproarDistortion, 2, 0 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x1f, 8 + createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, 0xff + createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 0x18, 0xffe8, 1 + createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0, 0xffe8, 0xffe8, 0 + waitforvisualfinish + loadspritegfx ANIM_TAG_ICE_CRYSTALS @FreezingCrystalsSingleBattle particles + createsprite gChatterSingNotesTemplate, ANIM_TARGET, 2, -10, -10, 0 + delay 4 + createsprite gChatterSingNotesTemplate, ANIM_TARGET, 2, 10, 20, 0 + delay 4 + createsprite gChatterSingNotesTemplate, ANIM_TARGET, 2, 0xfffb, 10, 0 + delay 4 + createsprite gChatterSingNotesTemplate, ANIM_TARGET, 2, 0x11, -12, 0 + delay 4 + createsprite gChatterSingNotesTemplate, ANIM_TARGET, 2, 0xfff1, 15, 0 + delay 4 + createsprite gChatterSingNotesTemplate, ANIM_TARGET, 2, 0, 0, 0 + delay 4 + createsprite gChatterSingNotesTemplate, ANIM_TARGET, 2, 20, 2, 0 + clearmonbg ANIM_DEF_PARTNER + end + +Move_JUDGMENT: + loadspritegfx ANIM_TAG_HANDS_AND_FEET + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT + loadspritegfx ANIM_TAG_GREEN_SPIKE + loadspritegfx ANIM_TAG_GUST + loadspritegfx ANIM_TAG_ORBS + loadspritegfx ANIM_TAG_ELECTRICITY + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_GUST, 0, 14, 14, 0 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HANDS_AND_FEET, 0, 10, 10, 0 + monbg ANIM_TARGET + createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 0, 15, 32767 + waitforvisualfinish + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 83, 1 + createsprite gJudgmentBlackChargeTemplate, ANIM_TARGET, 1, 1, ANIM_TARGET + playsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET + call JudgmentInwardSpikes + delay 5 + call JudgmentInwardSpikes2 + delay 5 + call JudgmentInwardSpikes + delay 5 + call JudgmentInwardSpikes2 + delay 5 + call JudgmentInwardSpikes + delay 5 + call JudgmentInwardSpikes2 + delay 5 + call JudgmentInwardSpikes2 + delay 0x2F + call JudgmentOutwardSpikes + delay 5 + call JudgmentOutwardSpikes2 + delay 5 + call JudgmentOutwardSpikes + delay 5 + call JudgmentOutwardSpikes2 + delay 5 + call JudgmentOutwardSpikes + delay 5 + call JudgmentOutwardSpikes2 + delay 5 + call JudgmentOutwardSpikes + delay 5 + call JudgmentOutwardSpikes2 + delay 5 + call JudgmentOutwardSpikes + delay 5 + call JudgmentOutwardSpikes2 + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 15, 0, 32767 + waitforvisualfinish + clearmonbg ANIM_TARGET + end +JudgmentOutwardSpikes: + createsprite gJudgmentGrayOutwardSpikesTemplate, ANIM_TARGET, 2, 1, 1, 0, 0xFF90, 16 @up + createsprite gJudgmentGrayOutwardSpikesTemplate, ANIM_TARGET, 2, 1, 1, 95, 0xFF9D, 16 @upper right + createsprite gJudgmentGrayOutwardSpikesTemplate, ANIM_TARGET, 2, 1, 1, 0x73, 0, 16 @right + createsprite gJudgmentGrayOutwardSpikesTemplate, ANIM_TARGET, 2, 1, 1, 0x4F, 0x37, 16 @lower right + createsprite gJudgmentGrayOutwardSpikesTemplate, ANIM_TARGET, 2, 1, 1, 0, 0x53, 16 @down + createsprite gJudgmentGrayOutwardSpikesTemplate, ANIM_TARGET, 2, 1, 1, 0xFFB0, 0x43, 16 @lower left + createsprite gJudgmentGrayOutwardSpikesTemplate, ANIM_TARGET, 2, 1, 1, 0xFF60, 0, 16 @left + createsprite gJudgmentGrayOutwardSpikesTemplate, ANIM_TARGET, 2, 1, 1, 0xFFAA, 0xFF94, 16 @upper left + playsewithpan SE_M_MIST, SOUND_PAN_ATTACKER + return +JudgmentOutwardSpikes2: + createsprite gJudgmentGrayOutwardSpikesTemplate, ANIM_TARGET, 2, 1, 1, 0x2D, 0xFF9D, 16 @between up and upper right + createsprite gJudgmentGrayOutwardSpikesTemplate, ANIM_TARGET, 2, 1, 1, 0xDF, 0xFF9D, 16 @between right and upper right + createsprite gJudgmentGrayOutwardSpikesTemplate, ANIM_TARGET, 2, 1, 1, 0x9F, 0x37, 16 @between right and lower right + createsprite gJudgmentGrayOutwardSpikesTemplate, ANIM_TARGET, 2, 1, 1, 0x1F, 0x37, 16 @between lower right and down + createsprite gJudgmentGrayOutwardSpikesTemplate, ANIM_TARGET, 2, 1, 1, 0xFFE0, 0x43, 16 @between lower left and down + createsprite gJudgmentGrayOutwardSpikesTemplate, ANIM_TARGET, 2, 1, 1, 0xFF60, 0x43, 16 @between left and lower left + createsprite gJudgmentGrayOutwardSpikesTemplate, ANIM_TARGET, 2, 1, 1, 0xFF2A, 0xFFAA, 16 @between left and upper left + createsprite gJudgmentGrayOutwardSpikesTemplate, ANIM_TARGET, 2, 1, 1, 0xFFDA, 0xFF94, 16 @between up and upper left + playsewithpan SE_M_MIST, SOUND_PAN_ATTACKER + return +JudgmentInwardSpikes: + createsprite gJudgmentGrayInwardOrbsTemplate, ANIM_TARGET, 2, 1, 0, 0, 0xFF90, 16 @up + createsprite gJudgmentGrayInwardOrbsTemplate, ANIM_TARGET, 2, 1, 0, 95, 0xFF9D, 16 @upper right + createsprite gJudgmentGrayInwardOrbsTemplate, ANIM_TARGET, 2, 1, 0, 0x73, 0, 16 @right + createsprite gJudgmentGrayInwardOrbsTemplate, ANIM_TARGET, 2, 1, 0, 0x4F, 0x37, 16 @lower right + createsprite gJudgmentGrayInwardOrbsTemplate, ANIM_TARGET, 2, 1, 0, 0, 0x53, 16 @down + createsprite gJudgmentGrayInwardOrbsTemplate, ANIM_TARGET, 2, 1, 0, 0xFFB0, 0x43, 16 @lower left + createsprite gJudgmentGrayInwardOrbsTemplate, ANIM_TARGET, 2, 1, 0, 0xFF60, 0, 16 @left + createsprite gJudgmentGrayInwardOrbsTemplate, ANIM_TARGET, 2, 1, 0, 0xFFAA, 0xFF94, 16 @upper left + return +JudgmentInwardSpikes2: + createsprite gJudgmentGrayInwardOrbsTemplate, ANIM_TARGET, 2, 1, 0, 0x2D, 0xFF9D, 16 @between up and upper right + createsprite gJudgmentGrayInwardOrbsTemplate, ANIM_TARGET, 2, 1, 0, 0xDF, 0xFF9D, 16 @between right and upper right + createsprite gJudgmentGrayInwardOrbsTemplate, ANIM_TARGET, 2, 1, 0, 0x9F, 0x37, 16 @between right and lower right + createsprite gJudgmentGrayInwardOrbsTemplate, ANIM_TARGET, 2, 1, 0, 0x1F, 0x37, 16 @between lower right and down + createsprite gJudgmentGrayInwardOrbsTemplate, ANIM_TARGET, 2, 1, 0, 0xFFE0, 0x43, 16 @between lower left and down + createsprite gJudgmentGrayInwardOrbsTemplate, ANIM_TARGET, 2, 1, 0, 0xFF60, 0x43, 16 @between left and lower left + createsprite gJudgmentGrayInwardOrbsTemplate, ANIM_TARGET, 2, 1, 0, 0xFF2A, 0xFFAA, 16 @between left and upper left + createsprite gJudgmentGrayInwardOrbsTemplate, ANIM_TARGET, 2, 1, 0, 0xFFDA, 0xFF94, 16 @between up and upper left + return + +Move_BUG_BITE: + loadspritegfx ANIM_TAG_ROCKS + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_HANDS_AND_FEET + monbg ANIM_TARGET + setalpha 12, 8 + delay 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1 + waitforvisualfinish + playsewithpan SE_M_BITE, SOUND_PAN_TARGET + createsprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 20, 24, 14, 2 + createsprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, 5, 0, -20, 24, 14, 2 + createsprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, 0, 5, 20, -24, 14, 2 + createsprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, -5, 0, -20, -24, 14, 2 + createsprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, 0, -5, 30, 18, 8, 2 + createsprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 30, -18, 8, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 7, 1 + delay 8 + playsewithpan SE_M_BITE, SOUND_PAN_TARGET + createsprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, 10, 5, 30, 29, 14, 2 + createsprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, 15, 5, -10, 29, 14, 2 + createsprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, 10, 10, 30, -19, 14, 2 + createsprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, 5, 5, -30, -19, 14, 2 + createsprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, 10, 0, 40, 23, 8, 2 + createsprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, 10, 5, 40, -13, 8, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 7, 1 + delay 8 + playsewithpan SE_M_BITE, SOUND_PAN_TARGET + createsprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, -10, -5, 10, 19, 14, 2 + createsprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, -5, -5, -30, 19, 14, 2 + createsprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, -10, 0, 10, -29, 14, 2 + createsprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, -15, -5, -30, -29, 14, 2 + createsprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, -10, -10, 20, 13, 8, 2 + createsprite gRockFragmentSpriteTemplate, ANIM_ATTACKER, 2, -10, -5, 20, -23, 8, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 7, 1 + delay 8 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end + +Move_CHARGE_BEAM: + loadspritegfx ANIM_TAG_BLACK_BALL_2 + loadspritegfx ANIM_TAG_SPARK_2 + delay 0 + createvisualtask AnimTask_BlendColorCycle, 2, 3, -31, 1, 5, 5, RGB(31, 31, 22) + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 24, 190, 12, 0, 1, 0 + delay 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 24, 22, 12, 0, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 24, 121, 13, 0, 1, 1 + delay 0 + createvisualtask AnimTask_BlendColorCycle, 2, 3, -31, 1, 0, 0, RGB(31, 31, 22) + delay 10 + createvisualtask AnimTask_BlendColorCycle, 2, 3, -31, 1, 5, 5, RGB(31, 31, 22) + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 24, 60, 10, 0, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 24, 42, 11, 0, 1, 1 + delay 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 24, 165, 10, 0, 1, 1 + delay 0 + createvisualtask AnimTask_BlendColorCycle, 2, 3, -31, 1, 0, 0, RGB(31, 31, 22) + delay 20 + createvisualtask AnimTask_BlendColorCycle, 2, 3, -31, 1, 7, 7, RGB(31, 31, 22) + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 0, 20, 0, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 64, 20, 1, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 128, 20, 0, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 32, 12, 192, 20, 2, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 32, 20, 0, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 96, 20, 1, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 160, 20, 0, 0 + createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 16, 12, 224, 20, 2, 0 + delay 4 + waitforvisualfinish + createvisualtask AnimTask_BlendColorCycle, 2, 3, -31, 1, 0, 0, RGB(31, 31, 22) + playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_ATTACKER + createsprite gZapCannonBallSpriteTemplate, ANIM_TARGET, 3, 10, 0, 0, 0, 30, 0 + createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 16, 30, 0, 40, 0 + createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 16, 30, 64, 40, 1 + createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 16, 30, 128, 40, 0 + createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 16, 30, 192, 40, 2 + createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 8, 30, 32, 40, 0 + createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 8, 30, 96, 40, 1 + createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 8, 30, 160, 40, 0 + createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 10, 0, 8, 30, 224, 40, 2 + waitforvisualfinish + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 5, 1 + delay 15 + waitplaysewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET, 19 + call ElectricityEffect + waitforvisualfinish + end + +Move_WOOD_HAMMER: + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 2, 4 + waitforvisualfinish + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + delay 3 + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, 0, 10, 0, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, 1, 0 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + delay 1 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -16, 0, 0, 4 + waitforvisualfinish + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 + waitforvisualfinish + delay 2 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 + delay 3 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end + +Move_AQUA_JET: + loadspritegfx ANIM_TAG_SPARKLE_6 + loadspritegfx ANIM_TAG_ROUND_SHADOW + loadspritegfx ANIM_TAG_SPLASH + playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER + createsprite gDiveBallSpriteTemplate, 2, 4, 0, 0, 13, 336 + waitforvisualfinish + playsewithpan SE_M_DIVE, SOUND_PAN_ATTACKER + createsprite gDiveWaterSplashSpriteTemplate, 3, 1, 0 + call DiveSetUpWaterDroplets + call DiveSetUpWaterDroplets + call DiveSetUpWaterDroplets + call DiveSetUpWaterDroplets + call DiveSetUpWaterDroplets + loadspritegfx ANIM_TAG_WATER_IMPACT + loadspritegfx ANIM_TAG_SMALL_BUBBLES + monbg ANIM_DEF_PARTNER + setalpha 12, 8 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET + createsprite gDiveWaterSplashSpriteTemplate, 131, 1, 1 + call DiveAttackWaterDroplets + call DiveAttackWaterDroplets + call DiveAttackWaterDroplets + call DiveAttackWaterDroplets + call DiveAttackWaterDroplets + delay 12 + call RisingWaterHitEffect + waitforvisualfinish + visible 0 + clearmonbg ANIM_DEF_PARTNER + blendoff + end + +Move_ATTACK_ORDER: + loadspritegfx ANIM_TAG_ATTACK_ORDER + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_ROCKS + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + playsewithpan SE_M_SWEET_SCENT, SOUND_PAN_TARGET + createsprite gAttackOrderParticleSpriteTemplate, ANIM_TARGET, 5, 120, 70, 5, 70, 30 + delay 1 + createsprite gAttackOrderParticleSpriteTemplate, ANIM_TARGET, 5, 120, 55, 6, 60, 25 + delay 1 + createsprite gAttackOrderParticleSpriteTemplate, ANIM_TARGET, 5, 120, 60, 7, 60, 30 + createsprite gAttackOrderParticleSpriteTemplate, ANIM_TARGET, 5, 120, 55, 10, 60, 30 + delay 3 + createsprite gAttackOrderParticleSpriteTemplate, ANIM_TARGET, 5, 100, 50, 4, 50, 26 + delay 1 + createsprite gAttackOrderParticleSpriteTemplate, ANIM_TARGET, 5, 105, 25, 8, 60, 20 + delay 1 + createsprite gAttackOrderParticleSpriteTemplate, ANIM_TARGET, 5, 120, 40, 10, 48, 30 + delay 3 + createsprite gAttackOrderParticleSpriteTemplate, ANIM_TARGET, 5, 120, 30, 6, 45, 25 + createsprite gAttackOrderParticleSpriteTemplate, ANIM_TARGET, 5, 120, 35, 10, 60, 30 + delay 3 + createsprite gAttackOrderParticleSpriteTemplate, ANIM_TARGET, 5, 105, 20, 8, 40, 0 + delay 3 + createsprite gAttackOrderParticleSpriteTemplate, ANIM_TARGET, 5, 20, 255, 15, 32, 0 + createsprite gAttackOrderParticleSpriteTemplate, ANIM_TARGET, 5, 110, 10, 8, 32, 20 + waitforvisualfinish + createsprite gBasicHitSplatSpriteTemplate 131, 4, -32, -16, 1, 3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMonInPlace, 2, 5, 1, 3, 0, 12, 1 + createvisualtask AnimTask_ShakeMonInPlace, 2, 5, 1, 3, 0, 12, 1 + delay 4 + createsprite gRandomPosHitSplatSpriteTemplate 131, 2, 1, 3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 4 + createsprite gRandomPosHitSplatSpriteTemplate 131, 2, 1, 3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 4 + createsprite gBasicHitSplatSpriteTemplate 131, 4, 32, 20, 1, 3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + end + +Move_DEFEND_ORDER: + loadspritegfx ANIM_TAG_ATTACK_ORDER + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_ROCKS + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + playsewithpan SE_M_SWEET_SCENT, SOUND_PAN_TARGET + createsprite gAttackOrderParticleSpriteTemplate, 130, 5, 120, 70, 5, 70, 30 + delay 1 + createsprite gAttackOrderParticleSpriteTemplate, 130, 5, 115, 55, 6, 60, 25 + delay 1 + createsprite gAttackOrderParticleSpriteTemplate, 130, 5, 115, 60, 7, 60, 30 + createsprite gAttackOrderParticleSpriteTemplate, 130, 5, 115, 55, 10, 60, 30 + delay 3 + createsprite gAttackOrderParticleSpriteTemplate, 130, 5, 100, 50, 4, 50, 26 + delay 1 + createsprite gAttackOrderParticleSpriteTemplate, 130, 5, 105, 25, 8, 60, 20 + delay 1 + createsprite gAttackOrderParticleSpriteTemplate, 130, 5, 115, 40, 10, 48, 30 + delay 3 + createsprite gAttackOrderParticleSpriteTemplate, 130, 5, 120, 30, 6, 45, 25 + createsprite gAttackOrderParticleSpriteTemplate, 130, 5, 115, 35, 10, 60, 30 + delay 3 + createsprite gAttackOrderParticleSpriteTemplate, 130, 5, 105, 20, 8, 40, 0 + delay 3 + createsprite gAttackOrderParticleSpriteTemplate, 130, 5, 20, 255, 15, 32, 0 + createsprite gAttackOrderParticleSpriteTemplate, 130, 5, 110, 10, 8, 32, 20 + waitforvisualfinish + loadspritegfx ANIM_TAG_BLUE_STAR + waitforvisualfinish + clearmonbg ANIM_ATK_PARTNER + blendoff + delay 1 + call BideSetUp + waitforvisualfinish + end + +Move_HEAL_ORDER: + loadspritegfx ANIM_TAG_ATTACK_ORDER + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_ROCKS + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + playsewithpan SE_M_SWEET_SCENT, SOUND_PAN_TARGET + createsprite gAttackOrderParticleSpriteTemplate, 130, 5, 120, 70, 5, 70, 30 + delay 1 + createsprite gAttackOrderParticleSpriteTemplate, 130, 5, 115, 55, 6, 60, 25 + delay 1 + createsprite gAttackOrderParticleSpriteTemplate, 130, 5, 115, 60, 7, 60, 30 + createsprite gAttackOrderParticleSpriteTemplate, 130, 5, 115, 55, 10, 60, 30 + delay 3 + createsprite gAttackOrderParticleSpriteTemplate, 130, 5, 100, 50, 4, 50, 26 + delay 1 + createsprite gAttackOrderParticleSpriteTemplate, 130, 5, 105, 25, 8, 60, 20 + delay 1 + createsprite gAttackOrderParticleSpriteTemplate, 130, 5, 115, 40, 10, 48, 30 + delay 3 + createsprite gAttackOrderParticleSpriteTemplate, 130, 5, 120, 30, 6, 45, 25 + createsprite gAttackOrderParticleSpriteTemplate, 130, 5, 115, 35, 10, 60, 30 + delay 3 + createsprite gAttackOrderParticleSpriteTemplate, 130, 5, 105, 20, 8, 40, 0 + delay 3 + createsprite gAttackOrderParticleSpriteTemplate, 130, 5, 20, 255, 15, 32, 0 + createsprite gAttackOrderParticleSpriteTemplate, 130, 5, 110, 10, 8, 32, 20 + waitforvisualfinish + loadspritegfx ANIM_TAG_BLUE_STAR + waitforvisualfinish + clearmonbg ANIM_ATK_PARTNER + blendoff + delay 1 + call HealingEffect + waitforvisualfinish + end + +Move_HEAD_SMASH: + loadspritegfx ANIM_TAG_IMPACT + call SetImpactBackground + createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 0 + playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER + waitforvisualfinish + delay 2 + createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 1 + waitforvisualfinish + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 4, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 + createsprite gBowMonSpriteTemplate, ANIM_ATTACKER, 2, 2 + createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 1 + loopsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET, 8, 3 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + delay 2 + restorebg + waitbgfadein + end + +Move_DOUBLE_HIT: + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_TARGET + setalpha 12, 8 + createsprite gHorizontalLungeSpriteTemplate, 2, 2, 4, 4 + delay 6 + createsprite gBasicHitSplatSpriteTemplate, 2, 4, 0, 0, 1, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 8 + waitforvisualfinish + createsprite gHorizontalLungeSpriteTemplate, 2, 2, 4, 4 + delay 6 + createsprite gBasicHitSplatSpriteTemplate, 2, 4, 0, 0, 1, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 8 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end + +Move_ROAR_OF_TIME: + loadspritegfx ANIM_TAG_ORBS + loadspritegfx ANIM_TAG_EXPLOSION + loadspritegfx ANIM_TAG_WATER_GUN + createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 0, 16, 0 + delay 0x20 + monbg ANIM_ATK_PARTNER + setalpha 0xc, 0x8 + loopsewithpan 133, SOUND_PAN_ATTACKER 13 3 + call RecoverAbsorbEffect + waitforvisualfinish + clearmonbg ANIM_ATK_PARTNER + blendoff + createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 16, 0, 0 + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 0, 16, -1 + createvisualtask SoundTask_PlayDoubleCry, 2, ANIM_ATTACKER, 0xff + delay 0x20 + createvisualtask AnimTask_ShakeMonInPlace, 2, 1, 10, 0, 20, 1 + playsewithpan 170, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 1 + delay 6 + playsewithpan 170, SOUND_PAN_TARGET + createsprite gRoarOfTimeBombTemplate, ANIM_ATTACKER, 3, 0x18, 0xffe8, 1, 1 + delay 6 + playsewithpan 170, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0xfff0, 16, 1, 1 + delay 6 + playsewithpan 170, SOUND_PAN_TARGET + createsprite gRoarOfTimeBombTemplate, ANIM_ATTACKER, 3, 0xffe8, -12, 1, 1 + delay 6 + playsewithpan 170, SOUND_PAN_TARGET + createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 16, 16, 1, 1 + delay 6 + playsewithpan 170, SOUND_PAN_TARGET + createsprite gRoarOfTimeBombTemplate, ANIM_ATTACKER, 3, 0xffe8, 0x18, 1, 1 + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 16, 0, -1 + waitforvisualfinish + end + +Move_SPECIAL_REND: + loadspritegfx ANIM_TAG_PUNISHMENT_BLADES + loadspritegfx ANIM_TAG_PINK_HEART_2 @ANIM_TAG_BERRY_EATEN + monbg ANIM_ATK_PARTNER + setalpha 12, 8 + createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 0, 16, 0 + loopsewithpan 133, SOUND_PAN_ATTACKER 13 2 + createsprite gSpacialRendBladesTemplate, ANIM_ATTACKER, 3, 0, 0, 0x38, 0 + delay 2 + createsprite gSpacialRendBladesTemplate, ANIM_ATTACKER, 3, 0, 0, 0x38, 4 + delay 2 + createsprite gSpacialRendBladesTemplate, ANIM_ATTACKER, 3, 0, 0, 0x38, 8 + delay 2 + createsprite gSpacialRendBladesTemplate, ANIM_ATTACKER, 3, 0, 0, 0x38, 12 + waitforvisualfinish + fadetobgfromset BG_SPACIAL_REND_ON_OPPONENT BG_SPACIAL_REND_ON_PLAYER BG_SPACIAL_REND_ON_OPPONENT + waitbgfadein + loopsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET, 3, 5 + createsprite gSpacialRendBladesTemplate2, ANIM_TARGET, 1, 0, 10, SOUND_PAN_ATTACKER, 0xb0, 0x28 + createsprite gSpacialRendBladesTemplate2, ANIM_TARGET, 1, 5, 0, 10, 0xff40, 0xf0, 0x28 + createsprite gSpacialRendBladesTemplate2, ANIM_TARGET, 1, 5, 0, 10, SOUND_PAN_ATTACKER, 0xff60, 0x28 + createsprite gSpacialRendBladesTemplate2, ANIM_TARGET, 1, 5, 0, 10, 0xff40, 0xff90, 0x28 + createsprite gSpacialRendBladesTemplate2, ANIM_TARGET, 1, 5, 0, 10, 0xa0, 0x30, 0x28 + createsprite gSpacialRendBladesTemplate2, ANIM_TARGET, 1, 5, 0, 10, 0xff20, 0xffe0, 0x28 + createsprite gSpacialRendBladesTemplate2, ANIM_TARGET, 1, 5, 0, 10, 0x70, 0xff80, 0x28 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 + waitforvisualfinish + restorebg + waitbgfadein + createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 0, 0, 0 + clearmonbg ANIM_ATK_PARTNER + blendoff + end + +Move_LUNAR_DANCE: + loadspritegfx ANIM_TAG_MOON + loadspritegfx ANIM_TAG_GREEN_SPARKLE + loadspritegfx ANIM_TAG_HOLLOW_ORB + setalpha 0, 16 + createsprite gSimplePaletteBlendSpriteTemplate, 2, 5, 1, 1, 0, 16, 0 + waitforvisualfinish + createsprite gMoonSpriteTemplate, 2, 2, 120, 56 + createvisualtask AnimTask_AlphaFadeIn, 3, 5, 0, 16, 16, 0, 1 + playsewithpan 211, 0 + delay 30 + createsprite gMoonlightSparkleSpriteTemplate, 40, 2, -12, 0 + delay 30 + createsprite gMoonlightSparkleSpriteTemplate, 40, 2, -18, 0 + delay 30 + createsprite gMoonlightSparkleSpriteTemplate, 40, 2, 21, 0 + delay 30 + createsprite gMoonlightSparkleSpriteTemplate, 40, 2, 0, 0 + delay 30 + createsprite gMoonlightSparkleSpriteTemplate, 40, 2, 10, 0 + delay 20 + createvisualtask AnimTask_MoonlightEndFade, 2, 0 + createvisualtask AnimTask_DragonDanceWaver, 5, 0 + playsewithpan 203, SOUND_PAN_ATTACKER + delay 8 + createvisualtask AnimTask_BlendPalInAndOutByTag, 5, 5, ANIM_TAG_HOLLOW_ORB, RGB(0, 0, 19), 14, 0, 3 + createsprite gDragonDanceOrbSpriteTemplate, 2, 1, 0 + createsprite gDragonDanceOrbSpriteTemplate, 2, 1, 43 + createsprite gDragonDanceOrbSpriteTemplate, 2, 1, 85 + createsprite gDragonDanceOrbSpriteTemplate, 2, 1, 128 + createsprite gDragonDanceOrbSpriteTemplate, 2, 1, 170 + createsprite gDragonDanceOrbSpriteTemplate, 2, 1, 213 + delay 30 + playsewithpan 203, SOUND_PAN_ATTACKER + delay 30 + playsewithpan 203, SOUND_PAN_ATTACKER + waitforvisualfinish + clearmonbg ANIM_ATTACKER + delay 1 + end + +Move_CRUSH_GRIP: + loadspritegfx ANIM_TAG_EXPLOSION + loadspritegfx ANIM_TAG_ACCUPRESSURE + loadspritegfx ANIM_TAG_PURPLE_HAND_OUTLINE + setalpha 15, 0 + createsprite gCrushGripHandTemplate, ANIM_TARGET, 2, 16, 0, 0, 0, 25, 0x101 + waitforvisualfinish + createvisualtask AnimTask_CompressTargetHorizontally, 2 + createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, 0, 0, 1, 1 + delay 3 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, 0x18, 0xffe8, 1, 1 + delay 3 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, 0xfff0, 16, 1, 1 + delay 3 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, 0xffe8, -12, 1, 1 + delay 3 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, 16, 16, 1, 1 + waitforvisualfinish + blendoff + end + +Move_MAGMA_STORM: + loadspritegfx ANIM_TAG_SMALL_EMBER + fadetobg BG_MAGMA_STORM @Add new bg + waitbgfadeout + createvisualtask AnimTask_MoveSeismicTossBg, 3 + playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET + loopsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET, 5, 8 + createvisualtask AnimTask_SeismicTossBgAccelerateDownAtEnd, 3 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 47, 1 + createvisualtask AnimTask_BlendColorCycle, 2, 6, 4, 2, 2, 0, 12, RGB(22, 9, 7) + call FireSpinEffect + call FireSpinEffect + createvisualtask AnimTask_BlendColorCycle, 2, 6, 4, 2, 2, 0, 12, RGB(22, 9, 7) + call FireSpinEffect + call FireSpinEffect + createvisualtask AnimTask_BlendColorCycle, 2, 6, 4, 2, 2, 0, 12, RGB(22, 9, 7) + call FireSpinEffect + restorebg + waitbgfadeout + setarg 7, 0xFFF + waitbgfadein + clearmonbg ANIM_DEF_PARTNER + blendoff + end + +Move_DARK_VOID: + loadspritegfx ANIM_TAG_WHITE_SHADOW @Destiny Bond + loadspritegfx ANIM_TAG_QUICK_GUARD_HAND @Black Colour + loadspritegfx ANIM_TAG_SPARKLE_2 @Healing Stars + loadspritegfx ANIM_TAG_POISON_BUBBLE @Poison + fadetobg BG_DARK_VOID + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 0, 0xFFA0, 1, 0xffff + waitbgfadein + createvisualtask AnimTask_DestinyBondWhiteShadow, 5, 0, 0x30 + loopsewithpan SE_M_CONFUSE_RAY, SOUND_PAN_ATTACKER, 5, 2 + delay 0x30 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xfd00, 0x15, 0, 0x70 @Last is speed + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_DEF_PARTNER, 0xfd00, 0x15, 0, 0x70 @Last is speed + delay 0x40 + invisible ANIM_TARGET + invisible ANIM_DEF_PARTNER + createsprite gDarkVoidPurpleStarsTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 0, 0x20, 0x3c + waitforvisualfinish + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, 16 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_DEF_PARTNER, 0, 16 + delay 0x20 + call UnsetPsychicBg + visible ANIM_TARGET + visible ANIM_DEF_PARTNER + end + +Move_SEED_FLARE: + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge animation + loadspritegfx ANIM_TAG_LEAF @green color + loadspritegfx ANIM_TAG_RAZOR_LEAF @green color 2 + loadspritegfx ANIM_TAG_ORBS @charging circles + loadspritegfx ANIM_TAG_FLYING_DIRT @heat wave animation + monbg ANIM_ATTACKER + setalpha 14, 8 + createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 0, 12, 32767 + waitforvisualfinish + playsewithpan 133, SOUND_PAN_ATTACKER + createsprite gSeedFlareGreenCirclesTemplate, ANIM_ATTACKER, 2, 0x28, 0x28, 16 + delay 2 + createsprite gSeedFlareGreenCirclesTemplate, ANIM_ATTACKER, 2, 0xffd8, 0xffd8, 16 + delay 2 + createsprite gSeedFlareGreenCirclesTemplate, ANIM_ATTACKER, 2, 0, 0x28, 16 + delay 2 + createsprite gSeedFlareGreenCirclesTemplate, ANIM_ATTACKER, 2, 0, 0xffd8, 16 + delay 2 + createsprite gSeedFlareGreenCirclesTemplate, ANIM_ATTACKER, 2, 0x28, -20, 16 + delay 2 + createsprite gSeedFlareGreenCirclesTemplate, ANIM_ATTACKER, 2, 0x28, 20, 16 + delay 2 + createsprite gSeedFlareGreenCirclesTemplate, ANIM_ATTACKER, 2, 0xffd8, -20, 16 + delay 2 + createsprite gSeedFlareGreenChargeTemplate, ANIM_ATTACKER 2, 0 + createsprite gSeedFlareGreenCirclesTemplate, ANIM_ATTACKER, 2, 0xffd8, 20, 16 + delay 2 + createsprite gSeedFlareGreenCirclesTemplate, ANIM_ATTACKER, 2, -20, 30, 16 + delay 2 + createsprite gSeedFlareGreenCirclesTemplate, ANIM_ATTACKER, 2, 20, 0xffe2, 16 + delay 2 + createsprite gSeedFlareGreenCirclesTemplate, ANIM_ATTACKER, 2, -20, 0xffe2, 16 + delay 2 + createsprite gSeedFlareGreenCirclesTemplate, ANIM_ATTACKER, 2, 20, 30, 16 + delay 2 + createsprite gSeedFlareGreenCirclesTemplate, ANIM_ATTACKER, 2, 0xffd8, 0, 16 + delay 2 + createsprite gSeedFlareGreenCirclesTemplate, ANIM_ATTACKER, 2, 0x28, 0, 16 + delay 2 + createsprite gSeedFlareGreenCirclesTemplate, ANIM_ATTACKER, 2, 0x28, 0x28, 16 + delay 2 + createsprite gSeedFlareGreenCirclesTemplate, ANIM_ATTACKER, 2, 0xffd8, 0xffd8, 16 + delay 2 + createsprite gSeedFlareGreenCirclesTemplate, ANIM_ATTACKER, 2, 0, 0x28, 16 + delay 2 + createsprite gSeedFlareGreenCirclesTemplate, ANIM_ATTACKER, 2, 0, 0xffd8, 16 + delay 2 + createsprite gSeedFlareGreenCirclesTemplate, ANIM_ATTACKER, 2, 0x28, -20, 16 + delay 2 + createsprite gSeedFlareGreenCirclesTemplate, ANIM_ATTACKER, 2, 0x28, 20, 16 + delay 2 + createsprite gSeedFlareGreenCirclesTemplate, ANIM_ATTACKER, 2, 0xffd8, -20, 16 + delay 30 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 0x28, 1 + createsprite gSeedFlareGreenWavesTemplate, ANIM_ATTACKER, 0x28, 10, 0x900, 0x60, 1 + createsprite gRazorLeafCutterSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 0x16, 20, 1 + createsprite gRazorLeafCutterSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 0x16, -20, 1 + delay 2 + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + createsprite gSeedFlareGreenWavesTemplate, ANIM_ATTACKER, 0x28, 0x5a, 0x800, 0x60, 1 + delay 8 + createsprite gSeedFlareGreenWavesTemplate, ANIM_ATTACKER, 0x28, 0x32, 0xa00, 0x60, 1 + createsprite gRazorLeafCutterSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 0x16, 20, 1 + createsprite gRazorLeafCutterSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 0x16, -20, 1 + delay 2 + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + createsprite gSeedFlareGreenWavesTemplate, ANIM_ATTACKER, 0x28, 20, 0x900, 0x60, 1 + delay 8 + createsprite gSeedFlareGreenWavesTemplate, ANIM_ATTACKER, 0x28, 0x46, 0x7c0, 0x60, 1 + createsprite gRazorLeafCutterSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 0x16, 20, 1 + createsprite gRazorLeafCutterSpriteTemplate, ANIM_TARGET, 3, 20, -10, 20, 0, 0x16, -20, 1 + delay 2 + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + delay 8 + createsprite gSeedFlareGreenWavesTemplate, ANIM_ATTACKER, 0x28, 0, 0xb00, 0x60, 1 + delay 10 + createsprite gSeedFlareGreenWavesTemplate, ANIM_ATTACKER, 0x28, 0x3c, 0xa00, 0x60, 1 + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 1, 12, 0, 32767 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + blendoff + end + +Move_OMINOUS_WIND: + loadspritegfx ANIM_TAG_SPARKLE_6 + panse_1B 132, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET 2, 0 + playsewithpan 228, 0 + delay 0 + monbg ANIM_DEF_PARTNER + @bankBG_over_partnerBG + delay 0 + createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, 5, 1, 0, 0, 0, 0 + delay 0 + createvisualtask AnimTask_GetAttackerSide, 2, 0 + jumpargeq 7, 1, OminousWindFadeToBg + fadetobg BG_GHOST + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, RGB(0, 16, 1), 0, 0, -1 + goto OminousWindHit +OminousWindFadeToBg: + fadetobg BG_GHOST + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, -1535, 0, 0, -1 + goto OminousWindHit +OminousWindHit: + delay 0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 0, 4, 4, RGB_BLACK + waitbgfadein + createsprite gSilverWindBigSparkSpriteTemplate, ANIM_TARGET, 66, -32, 16, 0, 6, 2, 3, 1 + createsprite gSilverWindBigSparkSpriteTemplate, ANIM_TARGET, 66, -8, 18, 64, 3, 2, 2, 1 + createsprite gSilverWindBigSparkSpriteTemplate, ANIM_ATTACKER, 120, -24, 18, 90, 5, 1, 2, 1 + createsprite gSilverWindBigSparkSpriteTemplate, ANIM_ATTACKER, 120, -40, 14, 128, 4, 1, 2, 1 + delay 0 + createsprite gSilverWindMediumSparkSpriteTemplate, ANIM_TARGET, 66, -32, 16, 0, 6, 2, 3, 1 + createsprite gSilverWindMediumSparkSpriteTemplate, ANIM_TARGET, 66, -8, 18, 64, 3, 2, 2, 1 + createsprite gSilverWindMediumSparkSpriteTemplate, ANIM_ATTACKER, 120, -24, 18, 90, 5, 1, 2, 1 + createsprite gSilverWindMediumSparkSpriteTemplate, ANIM_ATTACKER, 120, -40, 14, 128, 4, 1, 2, 1 + delay 0 + createsprite gSilverWindSmallSparkSpriteTemplate, ANIM_TARGET, 66, -32, 16, 0, 6, 2, 3, 1 + createsprite gSilverWindSmallSparkSpriteTemplate, ANIM_TARGET, 66, -8, 18, 64, 3, 2, 2, 1 + createsprite gSilverWindSmallSparkSpriteTemplate, ANIM_ATTACKER, 120, -24, 18, 90, 5, 1, 2, 1 + createsprite gSilverWindSmallSparkSpriteTemplate, ANIM_ATTACKER, 120, -40, 14, 128, 4, 1, 2, 1 + delay 6 + createsprite gSilverWindBigSparkSpriteTemplate, ANIM_TARGET, 66, -4, 16, 0, 6, 1, 2, 1 + createsprite gSilverWindBigSparkSpriteTemplate, ANIM_TARGET, 66, -16, 12, 192, 5, 2, 3, 1 + delay 0 + createsprite gSilverWindMediumSparkSpriteTemplate, ANIM_TARGET, 66, -4, 16, 0, 6, 1, 2, 1 + createsprite gSilverWindMediumSparkSpriteTemplate, ANIM_TARGET, 66, -16, 12, 192, 5, 2, 3, 1 + delay 0 + createsprite gSilverWindSmallSparkSpriteTemplate, ANIM_TARGET, 66, -4, 16, 0, 6, 1, 2, 1 + createsprite gSilverWindSmallSparkSpriteTemplate, ANIM_TARGET, 66, -16, 12, 192, 5, 2, 3, 1 + waitforvisualfinish + playsewithpan SE_M_GUST2, SOUND_PAN_TARGET + clearmonbg ANIM_DEF_PARTNER + delay 0 + restorebg + waitbgfadeout + createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, 1, 0, 4, 0, RGB_BLACK + setarg 7, -1 + waitbgfadein + end + +Move_SHADOW_FORCE: + loadspritegfx ANIM_TAG_ROUND_SHADOW + loadspritegfx ANIM_TAG_IMPACT + choosetwoturnanim ShadowForcePrep ShadowForceAttack +ShadowForceWaitEnd: + waitforvisualfinish + end +ShadowForcePrep: + monbg ANIM_ATTACKER + playsewithpan SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER, + createsprite gSimplePaletteBlendSpriteTemplate ANIM_ATTACKER, 2, 1, 3, 0, 16, RGB_BLACK + createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, ANIM_TARGET, 0 + createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, ANIM_ATTACKER, 0 + createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, ANIM_ATK_PARTNER, 0 + createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, ANIM_DEF_PARTNER, 0 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 1, 3 + createvisualtask AnimTask_AttackerFadeToInvisible, 2, 1 + delay 80 + createsprite gSimplePaletteBlendSpriteTemplate ANIM_ATTACKER, 2, 1, 3, 16, 0, RGB_BLACK + createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, ANIM_TARGET, 1 + createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, ANIM_ATTACKER, 1 + createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, ANIM_ATK_PARTNER, 1 + createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, ANIM_DEF_PARTNER, 1 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + invisible 0 + delay 1 + goto ShadowForceWaitEnd +ShadowForceAttack: + monbg ANIM_ATTACKER + monbgprio_28 ANIM_ATTACKER + playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER + call ShadowForceBg + waitbgfadein + delay 10 + playsewithpan SOUND_PAN_ATTACKER, 192 + createvisualtask AnimTask_NightShadeClone, 5, 85 + delay 70 + createvisualtask AnimTask_ShakeMon2 2, 1, 2, 0, 12, 1 + createvisualtask AnimTask_BlendColorCycle 2, 4, 0, 2, 0, 13, 0 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + delay 1 + call UnsetPsychicBg + waitbgfadein + goto ShadowForceWaitEnd +ShadowForceBg: + fadetobg BG_DARK + waitbgfadeout + createvisualtask AnimTask_FadeScreenToWhite, 5 + waitbgfadein + return + +Move_HONE_CLAWS: + loadspritegfx ANIM_TAG_SWIPE + call HoneClawsAnim + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SWIPE, 0, 6, 6, RGB_BLACK + call HoneClawsAnim + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SWIPE, 0, 10, 10, RGB_BLACK + call HoneClawsAnim + end +HoneClawsAnim: + createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 2, 2 + delay 4 + playsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET + createsprite gFurySwipesSpriteTemplate, ANIM_TARGET, 2, 16, 0, 1 + delay 10 + createsprite gHorizontalLungeSpriteTemplate, ANIM_TARGET, 2, 2, 2 + delay 4 + playsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET + createsprite gFurySwipesSpriteTemplate, ANIM_TARGET, 2, -16, 0, 0 + delay 10 + return + + +Move_WIDE_GUARD: + loadspritegfx ANIM_TAG_ICE_SPIKES @motion from icy wind + loadspritegfx ANIM_TAG_PINK_PETAL @pink color + loadspritegfx ANIM_TAG_SMALL_EMBER @yellow color + loadspritegfx ANIM_TAG_ROCKS @brown color + loadspritegfx ANIM_TAG_CONVERSION @conversion + loadspritegfx ANIM_TAG_WATER_ORB @blue color + monbg ANIM_ATTACKER + setalpha 12, 8 + createvisualtask AnimTask_RockMonBackAndForth, 0x5, 0x0, 0x3, 0x0 + waitplaysewithpan SE_M_PSYBEAM2, SOUND_PAN_ATTACKER, 0x10 + createsprite gWideGuardBlueConversionTemplate, ANIM_ATTACKER, 0x2, 0xffe8, 0xffe8 + delay 3 + createsprite gWideGuardBlueConversionTemplate, ANIM_ATTACKER, 0x2, 0xfff8, 0xffe8 + delay 3 + createsprite gWideGuardBlueConversionTemplate, ANIM_ATTACKER, 0x2, 0x8, 0xffe8 + delay 3 + createsprite gWideGuardBlueConversionTemplate, ANIM_ATTACKER, 0x2, 0x18, 0xffe8 + delay 3 + createsprite gWideGuardBlueConversionTemplate, ANIM_ATTACKER, 0x2, 0xffe8, 0xfff8 + delay 3 + createsprite gWideGuardBlueConversionTemplate, ANIM_ATTACKER, 0x2, 0xfff8, 0xfff8 + delay 3 + createsprite gWideGuardBlueConversionTemplate, ANIM_ATTACKER, 0x2, 0x8, 0xfff8 + delay 3 + createsprite gWideGuardBlueConversionTemplate, ANIM_ATTACKER, 0x2, 0x18, 0xfff8 + delay 3 + createsprite gWideGuardBlueConversionTemplate, ANIM_ATTACKER, 0x2, 0xffe8, 0x8 + delay 3 + createsprite gWideGuardBlueConversionTemplate, ANIM_ATTACKER, 0x2, 0xfff8, 0x8 + delay 3 + createsprite gWideGuardBlueConversionTemplate, ANIM_ATTACKER, 0x2, 0x8, 0x8 + delay 3 + createsprite gWideGuardBlueConversionTemplate, ANIM_ATTACKER, 0x2, 0x18, 0x8 + delay 3 + createsprite gWideGuardBlueConversionTemplate, ANIM_ATTACKER, 0x2, 0xffe8, 0x18 + delay 3 + createsprite gWideGuardBlueConversionTemplate, ANIM_ATTACKER, 0x2, 0xfff8, 0x18 + delay 3 + createsprite gWideGuardBlueConversionTemplate, ANIM_ATTACKER, 0x2, 0x8, 0x18 + delay 3 + createsprite gWideGuardBlueConversionTemplate, ANIM_ATTACKER, 0x2, 0x18, 0x18 + delay 0x14 + playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET + createvisualtask AnimTask_ConversionAlphaBlend, 5 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + blendoff + end + + +Move_GUARD_SPLIT:: + loadspritegfx ANIM_TAG_BLUEGREEN_ORB + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 0x1, 0x0, 0xC, 0x0 + loopsewithpan SE_M_LOCK_ON, SOUND_PAN_ATTACKER, 0x18, 0x3 + call GuardSplitLaunch + call GuardSplitLaunch + call GuardSplitLaunch + call GuardSplitLaunch + call GuardSplitLaunch + call GuardSplitLaunch + call GuardSplitLaunch + call GuardSplitLaunch + call GuardSplitLaunch + call GuardSplitLaunch + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 0x1, 0xC, 0x0, 0x0 + waitforvisualfinish + end +GuardSplitLaunch: + createsprite gGuardSwapOrbs1Template, ANIM_TARGET, 2, 0xfff4, 0x0 + createsprite gGuardSwapOrbs2Template, ANIM_TARGET, 0, 0x0, 0x0, 0x0, 0x0, 0x1E, 0x0 + delay 0x5 + return + + +Move_POWER_SPLIT:: + loadspritegfx ANIM_TAG_RED_HEART + loadspritegfx ANIM_TAG_BLUEGREEN_ORB + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 0x1, 0x0, 0xC, 0x0 + loopsewithpan SE_M_LOCK_ON, SOUND_PAN_ATTACKER, 0x18, 0x3 + call PowerSplitLaunch + call PowerSplitLaunch + call PowerSplitLaunch + call PowerSplitLaunch + call PowerSplitLaunch + call PowerSplitLaunch + call PowerSplitLaunch + call PowerSplitLaunch + call PowerSplitLaunch + call PowerSplitLaunch + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 0x1, 0xC, 0x0, 0x0 + waitforvisualfinish + end +PowerSplitLaunch: + createsprite gPowerSplitOrbs1Template, ANIM_TARGET, 2, 0xfff4, 0x0 + createsprite gPowerSplitOrbs2Template, ANIM_TARGET, 0, 0x0, 0x0, 0x0, 0x0, 0x1E, 0x0 + delay 5 + return + + +Move_WONDER_ROOM:: + call InitRoomAnimation + fadetobg BG_WONDER_ROOM + waitbgfadein + delay 0x40 + restorebg + waitbgfadein + blendoff + end + + +Move_PSYSHOCK: + monbg ANIM_TARGET + setalpha 8, 8 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 10, 1 + createvisualtask AnimTask_BlendColorCycle, 2, 2, 0, 2, 0, 8, 767 + waitforvisualfinish + loopsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET, 10, 3 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 15, 1 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -6, -6, 15, ANIM_TARGET, 1 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end + +Move_VENOSHOCK: + loadspritegfx ANIM_TAG_POISON_BUBBLE + loadspritegfx ANIM_TAG_TOXIC_BUBBLE + createsprite gToxicBubbleSpriteTemplate, ANIM_TARGET, 2, -24, 16, 1, 1 + playsewithpan SE_M_TOXIC, SOUND_PAN_TARGET + delay 5 + createsprite gToxicBubbleSpriteTemplate, ANIM_TARGET, 2, -16, 16, 1, 1 + playsewithpan SE_M_TOXIC, SOUND_PAN_TARGET + delay 5 + createsprite gToxicBubbleSpriteTemplate, ANIM_TARGET, 2, -8, 16, 1, 1 + playsewithpan SE_M_TOXIC, SOUND_PAN_TARGET + delay 5 + createsprite gToxicBubbleSpriteTemplate, ANIM_TARGET, 2, 0, 16, 1, 1 + playsewithpan SE_M_TOXIC, SOUND_PAN_TARGET + delay 5 + createsprite gToxicBubbleSpriteTemplate, ANIM_TARGET, 2, 8, 16, 1, 1 + playsewithpan SE_M_TOXIC, SOUND_PAN_TARGET + delay 5 + createsprite gToxicBubbleSpriteTemplate, ANIM_TARGET, 2, 16, 16, 1, 1 + playsewithpan SE_M_TOXIC, SOUND_PAN_TARGET + delay 5 + createsprite gToxicBubbleSpriteTemplate, ANIM_TARGET, 2, 24, 16, 1, 1 + playsewithpan SE_M_TOXIC, SOUND_PAN_TARGET + delay 5 + waitforvisualfinish + delay 15 + end + + +Move_AUTOTOMIZE: + loadspritegfx ANIM_TAG_METAL_BITS @Metal Bits + setalpha 12, 8 + monbg ANIM_ATK_PARTNER + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 0x2, 0x0, 0x18, 0x6, 0x4, 0x4 + createvisualtask AnimTask_TraceMonBlended 0x2, 0x0, 0x4, 0x7, 0xa + playsewithpan SE_ELEVATOR, SOUND_PAN_ATTACKER + createsprite gAutotomizeMetalShardsTemplate, ANIM_ATTACKER, 0x2, 0x0, 0x0 + createsprite gAutotomizeMetalShardsTemplate, ANIM_ATTACKER, 0x2, 0x0, 0x1 + delay 0xc + createsprite gAutotomizeMetalShardsTemplate, ANIM_ATTACKER, 0x2, 0x0, 0x2 + createsprite gAutotomizeMetalShardsTemplate, ANIM_ATTACKER, 0x2, 0x0, 0x3 + delay 0xc + createsprite gAutotomizeMetalShardsTemplate, ANIM_ATTACKER, 0x2, 0x0, 0x0 + createsprite gAutotomizeMetalShardsTemplate, ANIM_ATTACKER, 0x2, 0x0, 0x1 + delay 0xc + createsprite gAutotomizeMetalShardsTemplate, ANIM_ATTACKER, 0x2, 0x0, 0x2 + createsprite gAutotomizeMetalShardsTemplate, ANIM_ATTACKER, 0x2, 0x0, 0x3 + delay 0x18 + waitforvisualfinish + stopsound + clearmonbg ANIM_ATK_PARTNER + blendoff + end + + +Move_RAGE_POWDER:: + loadspritegfx ANIM_TAG_SPORE @Powder + loadspritegfx ANIM_TAG_HEART_STAMP @Red Colour + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + loopsewithpan SE_M_POISON_POWDER, SOUND_PAN_TARGET, 0x12, 0xa + call RagePowderSprinkle + call RagePowderSprinkle + call RagePowderSprinkle + createvisualtask AnimTask_BlendColorCycle, ANIM_ATTACKER, 0x2, ANIM_PAL_ATK, 0x2, 0x2, 0x0, 0xb, 0x1f + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + end +RagePowderSprinkle: + createsprite gRagePowderRedPowderTemplate, ANIM_ATTACKER, 0x2, 0x0, 0xffec, 0x55, 0x50, 0x0 + delay 0xc + createsprite gRagePowderRedPowderTemplate, ANIM_ATTACKER, 0x2, 0x0, 0xfff6, 0xaa, 0x50, 0x0 + delay 0xc + createsprite gRagePowderRedPowderTemplate, ANIM_ATTACKER, 0x2, 0x0, 0xfff1, 0x0, 0x50, 0x0 + delay 0xc + return + + +Move_TELEKINESIS:: + loadspritegfx ANIM_TAG_SPARKLE_4 @detect + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 0x1, 0x0, 0x9, 0x0 + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_ATK, 0x1, 0x0, 0x9, 0x7fff + delay 0x12 + playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER + createsprite gSpinningSparkleSpriteTemplate, ANIM_ATTACKER, 0xd, 0x14, 0xffec + waitforvisualfinish + loopsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET, 0xa, 0x3 + createvisualtask AnimTask_SwayMon, 0x5, 0x1, 0x18, 0xD0, 0x1, ANIM_TARGET + waitforvisualfinish + delay 0xA + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 0x1, 0x9, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_ATK, 0x2, 0x9, 0x0, 0x7fff + waitforvisualfinish + end + + +Move_MAGIC_ROOM:: + call InitRoomAnimation + fadetobg BG_MAGIC_ROOM + waitbgfadein + delay 0x40 + restorebg + waitbgfadein + blendoff + end + + +Move_SMACK_DOWN:: + loadspritegfx ANIM_TAG_BLACK_BALL + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_ROCKS + playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER + createsprite gRockBlastRockSpriteTemplate, ANIM_TARGET, 2, 0x14, 0x0, 0x0, 0x0, 0x15, 0xffe7 + waitforvisualfinish + createvisualtask AnimTask_SmokescreenImpact, 0x8, 0x400, 0x1902 + fadetobg BG_IN_AIR + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 0x0, 0x0, 0x0, 0xffff + createvisualtask AnimTask_SeismicTossBgAccelerateDownAtEnd, 3 + goto SeismicTossWeak + + +Move_STORM_THROW: + call StormThorwAnim + call StormThorwAnim + call StormThorwAnim + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET + delay 1 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 10, 0xC00, 1, 2 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 3 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 7 + waitforvisualfinish + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 4 + waitforvisualfinish + end +StormThorwAnim: + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET + delay 6 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 7 + delay 8 + return + +Move_FLAME_BURST: + loadspritegfx ANIM_TAG_SMALL_EMBER + loadspritegfx ANIM_TAG_EXPLOSION + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + createsprite gDragonBreathFireSpriteTemplate, ANIM_TARGET, 2, 0, 0, 0, 0, 20 + delay 18 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 16, 1 + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, 0, 0, 1, 0 + createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 0, 192, 76, 70 + createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 0, -192, 76, 70 + createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 0, 20, 140, 70 + createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 0, -20, 140, 70 + createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 0, 192, -160, 70 + createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 0, -192, -160, 70 + createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 0, 82, -112, 70 + createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 0, -82, -112, 70 + createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 0, 160, -52, 70 + createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 0, -160, -52, 70 + createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 0, 224, -32, 70 + createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 0, -224, -32, 70 + createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 0, 112, -128, 70 + createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 0, -112, -128, 70 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + delay 3 + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, 14, -14, 1, 0 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + waitforvisualfinish + end + +Move_SLUDGE_WAVE: + panse_1B SE_M_WHIRLPOOL, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 + createvisualtask AnimTask_CreateSurfWave, 0x2, ANIM_SURF_PAL_SLUDGE_WAVE + waitforvisualfinish + end + + +Move_QUIVER_DANCE: + loadspritegfx ANIM_TAG_HOLLOW_ORB + monbg ANIM_ATTACKER + call SetBugBg + createvisualtask AnimTask_DragonDanceWaver, 5 + playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER + delay 8 + createvisualtask AnimTask_BlendPalInAndOutByTag, 5, ANIM_TAG_HOLLOW_ORB, RGB_GREEN, 14, 0, 3 + createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 0 + createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 43 + createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 85 + createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 128 + createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 170 + createsprite gDragonDanceOrbSpriteTemplate, ANIM_ATTACKER, 2, 213 + delay 30 + playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER + delay 30 + playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER + waitforvisualfinish + clearmonbg ANIM_ATTACKER + call UnsetBugBg + end + +Move_HEAVY_SLAM: + loadspritegfx ANIM_TAG_CLAW_SLASH + loadspritegfx ANIM_TAG_IMPACT + loopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 28, 2 + createvisualtask AnimTask_MetallicShine, 5, 0, 0, 0 + waitforvisualfinish + monbg ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER + createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, ANIM_ATTACKER + waitforvisualfinish + delay 11 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 26, 0, 0, 5 + delay 6 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, 1, 0 + loopsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET, 10, 2 + delay 1 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -28, 0, 0, 3 + waitforvisualfinish + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 + waitforvisualfinish + delay 10 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 6 + delay 5 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 6 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end + +Move_SYCHRONOISE: + loadspritegfx ANIM_TAG_THIN_RING @hypervoice ring + loadspritegfx ANIM_TAG_SPARK_2 @yellow color + loadspritegfx ANIM_TAG_WATER_ORB @blue color + loadspritegfx ANIM_TAG_POISON_BUBBLE @violet color + loadspritegfx ANIM_TAG_SMALL_EMBER @flame wheel particle + loadspritegfx ANIM_TAG_AIR_WAVE_2 @aero particles + monbg ANIM_DEF_PARTNER + monbgprio_2A 0x1 + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 0x1, 0x0, 0xC, 0x0 @Darken + waitforvisualfinish + panse_1B SE_M_SCREECH, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 + createsprite gSynchronoiseVioletRingTemplate, ANIM_ATTACKER, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 + delay 0x1 + createsprite gSynchronoiseBlueRingTemplate, ANIM_ATTACKER, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 + delay 0x1 + createsprite gSynchronoiseYellowRingTemplate, ANIM_ATTACKER, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 + delay 0x25 + panse_1B SE_M_SCREECH, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 + createsprite gSynchronoiseBlueRingTemplate, ANIM_ATTACKER, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 + delay 0x1 + createsprite gSynchronoiseVioletRingTemplate, ANIM_ATTACKER, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 + delay 0x1 + createsprite gSynchronoiseYellowRingTemplate, ANIM_ATTACKER, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 + waitforvisualfinish + loopsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET, 0x3, 0x5 + createsprite gSynchronoiseAeroWheelTemplate, ANIM_TARGET, 1, 0x0, 0xffef, SOUND_PAN_ATTACKER, 0xb0, 0x28 + createsprite gSynchronoiseAeroWheelTemplate, ANIM_TARGET, 1, 0x0, 0xffef, 0xff40, 0xf0, 0x28 + createsprite gSynchronoiseAeroWheelTemplate, ANIM_TARGET, 1, 0x0, 0xffef, SOUND_PAN_ATTACKER, 0xff60, 0x28 + createsprite gSynchronoiseAeroWheelTemplate, ANIM_TARGET, 1, 0x0, 0xffef, 0xff40, 0xff90, 0x28 + createsprite gSynchronoiseAeroWheelTemplate, ANIM_TARGET, 1, 0x0, 0xffef, 0xa0, 0x30, 0x28 + createsprite gSynchronoiseAeroWheelTemplate, ANIM_TARGET, 1, 0x0, 0xffef, 0xff20, 0xffe0, 0x28 + createsprite gSynchronoiseAeroWheelTemplate, ANIM_TARGET, 1, 0x0, 0xffef, 0x70, 0xff80, 0x28 + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 0x1, 0xC, 0x0, 0x0 @Darken + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + end + + +Move_ELECTRO_BALL: + loadspritegfx ANIM_TAG_SPARK_2 @yelow + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge + loadspritegfx ANIM_TAG_FLASH_CANNON_BALL @ball + monbg ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + createsprite gGrowingChargeOrb2SpriteTemplate, ANIM_ATTACKER, 2, 0 + delay 0x19 + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + delay 0x14 + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + delay 0xF + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + delay 0x6 + loopsewithpan SE_M_CHARGE, 0xC, 0x6, 0x5 + waitforvisualfinish + createsprite gElectroBallCannonBallTemplate, ANIM_TARGET, 2, 16, 16, 8 + waitforvisualfinish + playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon2, 0x2, ANIM_TARGET, 0x4, 0x0, 0x8, 0x1 + call ElectricityEffect + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end + +Move_SOAK: + loadspritegfx ANIM_TAG_SMALL_BUBBLES + loadspritegfx ANIM_TAG_WATER_IMPACT + monbg ANIM_TARGET + monbgprio_28 1 + setalpha 12, 8 + createsprite gWaterGunProjectileSpriteTemplate, ANIM_ATTACKER, 2, 20, 0, 0, 0, 40, -25 + playsewithpan SE_M_BUBBLE, 192 + delay 2 + createsprite gWaterGunProjectileSpriteTemplate, ANIM_ATTACKER, 2, 20, 0, 5, 0, 40, -25 + playsewithpan SE_M_BUBBLE, 192 + delay 2 + createsprite gWaterGunProjectileSpriteTemplate, ANIM_ATTACKER, 2, 20, 0, -5, 0, 40, -25 + playsewithpan SE_M_BUBBLE, 192 + delay 30 + playsewithpan SE_M_WATERFALL, 63 + createvisualtask AnimTask_ShakeMon2, 5, 1, 4, 0, 17, 1 + createvisualtask AnimTask_BlendColorCycle, 2, 4, 1, 2, 0, 12, RGB_BLUE + createsprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 1 + createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, 0 + createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 0, 0 + delay 2 + createsprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 5, 0, 1, 1 + createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 5, 0 + createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, 5, 0 + delay 2 + createsprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -5, 0, 1, 1 + createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, -5, 0 + createsprite gSmallDriftingBubblesSpriteTemplate, ANIM_ATTACKER, 4, -5, 0 + delay 2 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end + +Move_FLAME_CHARGE: + loadspritegfx ANIM_TAG_SMALL_EMBER + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_TARGET + loopsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER, 0x20, 0x6 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 0x2, 0x0, 0xc, 0x6, 0x6, 0x3 + call FlameChargeSwirl + delay 0x9 + call FlameChargeSwirl + delay 0x9 + call FlameChargeSwirl + delay 0x9 + call FlameChargeSwirl + delay 0x9 + call FlameChargeSwirl + waitforvisualfinish + launchtemplate gSlideMonToOffsetSpriteTemplate 0x2 0x5 ANIM_ATTACKER 0x18 0x0 0x0 0x5 + delay 0x3 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + launchtemplate gBasicHitSplatSpriteTemplate 0x3 0x4 0x0 0x0 0x1 0x0 + createvisualtask AnimTask_ShakeMon, 0x2, 0x1, 0x6, 0x0, 0x8, 0x1 + call FireSpreadEffect + playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_ATTACKER + waitforvisualfinish + delay 0x8 + launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_ATTACKER 0x0 0x7 + waitforvisualfinish + clearmonbg ANIM_TARGET + end +FlameChargeSwirl: + launchtemplate gFlameChargeEmberTemplate 0x2 0x4 0x0 0xffe8 0x8 0x8c + return + + +Move_COIL: + loadspritegfx ANIM_TAG_TENDRILS + loopsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET, 0x6, 0x4 + launchtemplate gConstrictBindingSpriteTemplate 0x84, 0x4, 0x0 0x10 0x0 0x2 + delay 0x7 + launchtemplate gConstrictBindingSpriteTemplate 0x83 0x4 0x0 0x0 0x0 0x2 + launchtemplate gConstrictBindingSpriteTemplate 0x82, 0x4, 0x0 0x8 0x1 0x2 + delay 0x7 + launchtemplate gConstrictBindingSpriteTemplate 0x83 0x4 0x0 0xfff8 0x1 0x2 + delay 0x8 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0x3 0x0 0x6 0x1 + delay 0x14 + launchtask AnimTask_ShakeMon2 0x83 0x5 0x1 0x4 0x0 0x5 0x1 + launchtask AnimTask_StretchTargetUp 0x3 0x0 + playsewithpan SE_M_BIND, SOUND_PAN_TARGET + setarg 0x7 0xffff + waitforvisualfinish + end + + +Move_LOW_SWEEP: + loadspritegfx ANIM_TAG_HANDS_AND_FEET + loadspritegfx ANIM_TAG_IMPACT + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + createsprite gSlidingKickSpriteTemplate, ANIM_TARGET, 2, -24, 14, 40, 8, 160, 0 + delay 4 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -8, 8, 1, 2 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + waitforvisualfinish + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 4 + end + +Move_ACID_SPRAY: + loadspritegfx ANIM_TAG_POISON_BUBBLE + monbg ANIM_TARGET + createsprite gAcidPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, 20, 0, 40, 1, 0, -20, FALSE + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + delay 33 + createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 10, 1 + createvisualtask AnimTask_BlendColorCycle, 2, 4, 2, 2, 0, 12, RGB(30, 0, 31) + playsewithpan SE_M_DIVE, SOUND_PAN_ATTACKER + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -20, 10, 15, 55, FALSE + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -20, -20, 15, 55, FALSE + delay 3 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -20, 5, 15, 55, FALSE + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -20, -10, 15, 55, FALSE + delay 3 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -20, 30, 15, 55, FALSE + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -20, -30, 15, 55, FALSE + delay 3 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -20, 2, 15, 55, FALSE + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -20, -5, 15, 55, FALSE + delay 3 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -20, 20, 15, 55, FALSE + waitforvisualfinish + clearmonbg ANIM_TARGET + end + +Move_FOUL_PLAY: + loadspritegfx ANIM_TAG_POISON_BUBBLE + loadspritegfx ANIM_TAG_THIN_RING + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_HANDS_AND_FEET @Black colour + monbg ANIM_TARGET + setalpha 12, 8 + launchtemplate gHorizontalLungeSpriteTemplate 0x2 0x2 0x4 0x4 + delay 0x6 + launchtemplate gFoulPlayImpactTemplate 0x2 0x4 0x0 0x0 0x1 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 0x1 0x3 0x0 0x6 0x1 + playsewithpan SE_M_VITAL_THROW SOUND_PAN_TARGET + launchtask AnimTask_BlendBattleAnimPal, 0xa, 0x5, (ANIM_PAL_BG | ANIM_PAL_ALL_BATTLERS), 0x3, 0xa, 0x0, 0x0 + launchtemplate gFoulPlayRingTemplate 0x3 0x4 0x0 0x0 0x100 0x0 + delay 0x8 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + launchtask AnimTask_BlendBattleAnimPal, 0xa, 0x5, (ANIM_PAL_BG | ANIM_PAL_ALL_BATTLERS), 0x3, 0xa, 0x0, 0x0 + launchtemplate gFoulPlayRingTemplate 0x3 0x4 0x0 0x0 0x100 0x0 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end + + +Move_SIMPLE_BEAM: + loadspritegfx ANIM_TAG_GOLD_RING @psybeam + loadspritegfx ANIM_TAG_ROCKS @brown color + loadspritegfx ANIM_TAG_PINK_PETAL @pink color + loadspritegfx ANIM_TAG_THIN_RING @ring + setalpha 8, 8 + monbg ANIM_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + playsewithpan SE_M_BUBBLE_BEAM, SOUND_PAN_ATTACKER + call SimpleBeamsRegular + call SimpleBeamsRegular + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0x0 0x9 0x7FFF + launchtask AnimTask_SwayMon 0x5 0x5 0x0 0x6 0x800 0x4 ANIM_TARGET + call SimpleBeamWithRings + call SimpleBeamWithRings + call SimpleBeamWithRings + call SimpleBeamWithRings + call SimpleBeamWithRings + launchtemplate gSimpleBeamBrownRingTemplate 0x3 0x6 0x0 0x0 0x1 0x0 0x1F 0x8 + delay 0x2 + launchtemplate gSimpleBeamPinkRingTemplate 0x3 0x6 0x0 0x0 0x1 0x0 0x1F 0x8 + delay 0x2 + stopsound + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0x9 0x0 0x7FFF + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end +SimpleBeamsRegular: + launchtemplate gSimpleBeamBrownTemplate 0x82 0x6 0x10 0x0 0x0 0x0 0xd 0x0 + delay 0x2 + launchtemplate gSimpleBeamPinkTemplate 0x82 0x6 0x10 0x0 0x0 0x0 0xd 0x0 + delay 0x2 + return +SimpleBeamWithRings: + launchtemplate gSimpleBeamBrownTemplate 0x82 0x6 0x10 0x0 0x0 0x0 0xd 0x0 + launchtemplate gSimpleBeamBrownRingTemplate 0x3 0x6 0x0 0x0 0x1 0x0 0x1F 0x8 + delay 0x2 + launchtemplate gSimpleBeamPinkTemplate 0x82 0x6 0x10 0x0 0x0 0x0 0xd 0x0 + launchtemplate gSimpleBeamPinkRingTemplate 0x3 0x6 0x0 0x0 0x1 0x0 0x1F 0x8 + delay 0x2 + return + + +Move_ENTRAINMENT: + createvisualtask AnimTask_TeeterDanceMovement, 5 + playsewithpan SE_M_TEETER_DANCE, SOUND_PAN_ATTACKER + delay 0x18 + playsewithpan SE_M_TEETER_DANCE, SOUND_PAN_ATTACKER + delay 0x18 + playsewithpan SE_M_TEETER_DANCE, SOUND_PAN_ATTACKER + delay 0x18 + playsewithpan SE_M_TEETER_DANCE, SOUND_PAN_ATTACKER + delay 0x18 + playsewithpan SE_M_TEETER_DANCE, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x3 0x0 0x1f 0x1 + waitforvisualfinish + end + + +Move_AFTER_YOU: + loadspritegfx ANIM_TAG_ANGER @rage + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @green color + launchtask AnimTask_SwayMon 0x5 0x5 0x1 0xF 0x600 0x2 ANIM_ATTACKER + delay 0x1 + launchtemplate gAfterYouGreenRageTemplate 0x2 0x3 0x0 0xffec 0xffe0 + launchtemplate gAfterYouGreenRageTemplate 0x2 0x3 0x0 0xfffb 0xffe5 + playsewithpan SE_M_SWAGGER2, SOUND_PAN_ATTACKER + delay 0x14 + launchtemplate gAfterYouGreenRageTemplate 0x2 0x3 0x0 0x14 0xffe0 + launchtemplate gAfterYouGreenRageTemplate 0x2 0x3 0x0 0x23 0xffe5 + playsewithpan SE_M_SWAGGER2, SOUND_PAN_ATTACKER + waitforvisualfinish + end + + +Move_ROUND: + loadspritegfx ANIM_TAG_MUSIC_NOTES + createvisualtask AnimTask_MusicNotesRainbowBlend, 2 + waitforvisualfinish + monbg ANIM_TARGET + createvisualtask SoundTask_PlayCryHighPitch, 2, 0, 255 + createvisualtask AnimTask_UproarDistortion, 2, 0 + createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 7, 0, 12 + delay 5 + createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 6, 1, 12 + delay 5 + createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 1, 2, 12 + delay 5 + createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 2, 3, 12 + delay 20 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 13, 1 + waitforvisualfinish + clearmonbg ANIM_TARGET + createvisualtask AnimTask_MusicNotesClearRainbowBlend, 2 + waitforvisualfinish + end + +Move_ECHOED_VOICE: + loadspritegfx ANIM_TAG_METAL_SOUND_WAVES + monbg ANIM_DEF_PARTNER + monbgprio_2A 0x1 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x0 0x2 0x0 0x8 0x1 + call MetalSoundPlayNote + call MetalSoundPlayNote + call MetalSoundPlayNote + call MetalSoundPlayNote + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + delay 0x0 + waitforvisualfinish + end +MetalSoundPlayNote: + panse_1B SE_M_UPROAR, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 2, 0 + launchtemplate gMetalSoundSpriteTemplate 0x82 0x6 0x10 0x0 0x0 0x0 0x1e 0x0 + delay 0x2 + return + +Move_CHIP_AWAY: + loadspritegfx ANIM_TAG_IMPACT + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x2 0x0 0x9 0x7FFF + waitforvisualfinish + monbg ANIM_ATK_PARTNER + setalpha 12, 8 + launchtask AnimTask_TranslateMonEllipticalRespectSide 0x2 0x5 0x0 0x18 0x6 0x1 0x5 + delay 0x4 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x5 0x0 0x6 0x1 + launchtemplate gBasicHitSplatSpriteTemplate 0x84, 0x4, 0x0 0x0 0x1 0x1 + playsewithpan SE_M_VITAL_THROW2 SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg ANIM_ATK_PARTNER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x2 0x9 0x0 0x7FFF + waitforvisualfinish + blendoff + end + +Move_CLEAR_SMOG: + loadspritegfx ANIM_TAG_MIST_CLOUD + monbg ANIM_TARGET + monbgprio_29 + setalpha 12, 8 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_MIST_CLOUD, 0, 6, 6, RGB(26, 0, 26) + loopsewithpan SE_M_MIST, SOUND_PAN_TARGET, 17, 10 + call ClearSmogCloud + call ClearSmogCloud + call ClearSmogCloud + call ClearSmogCloud + call ClearSmogCloud + call ClearSmogCloud + call ClearSmogCloud + delay 120 + loopsewithpan SE_M_TOXIC, SOUND_PAN_TARGET, 18, 2 + createvisualtask AnimTask_BlendColorCycle, 2, 4, 2, 2, 0, 12, RGB_WHITE + delay 10 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 15, 1 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end +ClearSmogCloud: + createsprite gMistCloudSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, 48, 240, 1, 0 + delay 7 + return + +Move_STORED_POWER: + loadspritegfx ANIM_TAG_RED_ORB_2 + loadspritegfx ANIM_TAG_IMPACT + call SetPsychicBackground + playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER + createvisualtask AnimTask_SpitUpDeformMon, 5 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 8, 2 + delay 45 + playsewithpan SE_M_SPIT_UP, SOUND_PAN_ATTACKER + delay 3 + createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 0, 12 + createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 32, 12 + createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 64, 12 + createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 96, 12 + createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 128, 12 + createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 160, 12 + createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 192, 12 + createsprite gSpitUpOrbSpriteTemplate, ANIM_ATTACKER, 2, 224, 12 + delay 10 + createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, 0, 1, 8, 1, 0 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -12, 10, 1, 1 + delay 5 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 12, -10, 1, 1 + waitforvisualfinish + call UnsetPsychicBg + waitforvisualfinish + end + +Move_QUICK_GUARD: + loadspritegfx ANIM_TAG_QUICK_GUARD_HAND @hand + loadspritegfx ANIM_TAG_SPARKLE_4 @sparkles + setalpha 12, 8 + launchtask AnimTask_BlendColorCycle 0x2 0x6 ANIM_PAL_ATK 0x0 0x2 0x0 0xa 0x7FFF + delay 0x10 + monbg ANIM_ATTACKER + launchtemplate gQuickGuardArmImpactTemplate 0x83 0x5 0xE 0x0 0x8 0x0 0x0 + launchtemplate gQuickGuardArmImpactTemplate 0x83 0x5 0xfff2 0x0 0x8 0x0 0x0 + delay 0x1 + launchtemplate gQuickGuardArmImpactTemplate 0x83 0x5 0xE 0x0 0x8 0x0 0x0 + launchtemplate gQuickGuardArmImpactTemplate 0x83 0x5 0xfff2 0x0 0x8 0x0 0x0 + delay 0x1 + launchtemplate gQuickGuardArmImpactTemplate 0x83 0x5 0xE 0x0 0x8 0x0 0x0 + launchtemplate gQuickGuardArmImpactTemplate 0x83 0x5 0xfff2 0x0 0x8 0x0 0x0 + waitforvisualfinish + playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER + launchtemplate gSpinningSparkleSpriteTemplate 0xd 0x2 0x0 0xffe3 @up + launchtemplate gSpinningSparkleSpriteTemplate 0xd 0x2 0x16 0xffec @upper right + launchtemplate gSpinningSparkleSpriteTemplate 0xd 0x2 0x1D 0x0 @right + launchtemplate gSpinningSparkleSpriteTemplate 0xd 0x2 0xffe9 0xffec @upper left + launchtemplate gSpinningSparkleSpriteTemplate 0xd 0x2 0xffe2 0x0 @left + launchtemplate gSpinningSparkleSpriteTemplate 0xd 0x2 0x0 0x1c @down + launchtemplate gSpinningSparkleSpriteTemplate 0xd 0x2 0x16 0x13 @lower left + launchtemplate gSpinningSparkleSpriteTemplate 0xd 0x2 0xffea 0x13 @lower right + waitforvisualfinish + blendoff + clearmonbg ANIM_ATTACKER + end + + +Move_ALLY_SWITCH: + end + + +Move_SCALD: + loadspritegfx ANIM_TAG_WATER_ORB + loadspritegfx ANIM_TAG_WATER_IMPACT + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 40, 1 + delay 6 + panse_1B SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 + createvisualtask AnimTask_StartSinAnimTimer, 5, 100 + call ScaldBeams + call ScaldBeams + call ScaldBeams + createvisualtask AnimTask_BlendColorCycle, 2, 4, 2, 2, 0, 11, RGB_RED + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 37, 1 + call ScaldHitSplats + call ScaldBeams + call ScaldBeams + call ScaldHitSplats + call ScaldBeams + call ScaldBeams + call ScaldHitSplats + call ScaldBeams + call ScaldBeams + call ScaldHitSplats + call ScaldBeams + call ScaldBeams + call ScaldHitSplats + delay 2 + call ScaldHitSplats + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + end + +ScaldBeams: + createsprite gHydroPumpOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, 10, 0, 0 + delay 1 + createsprite gHydroPumpOrbSpriteTemplate, ANIM_ATTACKER, 3, 10, 10, 0, 0 + delay 1 + return + +ScaldHitSplats: + createsprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, ANIM_TARGET, 1 + return + +Move_SHELL_SMASH: + end + +Move_HEAL_PULSE: + loadspritegfx ANIM_TAG_GREEN_SPARKLE + loadspritegfx ANIM_TAG_BLUE_STAR + loadspritegfx ANIM_TAG_THIN_RING + playsewithpan SE_M_MORNING_SUN, SOUND_PAN_TARGET + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 13293, 8 + createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -16, 32, -3, 1 + delay 3 + createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, 16, 32, -3, -1 + delay 3 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 13293, 8 + createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, 32, 32, -3, 1 + delay 3 + createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -32, 32, -3, 1 + delay 3 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 13293, 8 + createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, 0, 32, -3, 1 + delay 3 + createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -8, 32, -3, 1 + delay 3 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 13293, 8 + createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -8, 32, -3, 1 + delay 3 + createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, 24, 32, -3, 1 + delay 3 + createsprite gPresentHealParticleSpriteTemplate, ANIM_TARGET, 4, -24, 32, -3, 1 + waitforvisualfinish + waitsound + call HealingEffect2 + end + +Move_HEX: + loadspritegfx ANIM_TAG_PURPLE_FLAME + loadspritegfx ANIM_TAG_GHOSTLY_SPIRIT + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x0 0x0 0x10 0x4C4A @;Deep purple + waitforvisualfinish + monbg ANIM_TARGET + monbgprio_29 + playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER + waitbgfadein + launchtask AnimTask_PurpleFlamesOnTarget 0x3 0x0 + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_TARGET 0x2 0x0 0x25 0x1 + playsewithpan SE_M_NIGHTMARE, SOUND_PAN_TARGET + delay 0x20 + launchtask AnimTask_BlendColorCycle 0x2 0x6 ANIM_PAL_DEF 0x2 0x2 0x0 0xc 0x4C4A @;Deep purple + launchtemplate gCurseGhostSpriteTemplate 0x84, 0x0 + waitforvisualfinish + clearmonbg ANIM_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x0 0x10 0x0 0x4C4A @;Deep purple + waitforvisualfinish + end + +Move_SKY_DROP: + loadspritegfx ANIM_TAG_ROUND_SHADOW + loadspritegfx ANIM_TAG_IMPACT + choosetwoturnanim SkyDropSetup SkyDropUnleash + end +SkyDropSetup: + invisible ANIM_ATTACKER + loadspritegfx ANIM_TAG_SMALL_BUBBLES @mist ball + loadspritegfx ANIM_TAG_WHITE_FEATHER + loadspritegfx ANIM_TAG_ROUND_SHADOW @fly + delay 0x0 + playsewithpan SE_M_STRING_SHOT, SOUND_PAN_ATTACKER + launchtemplate gSkyDropFlyBallTemplate 0x80 0x6 0x0 0x0 0x0 0x0 0x1e 0x0 + waitforvisualfinish + invisible ANIM_TARGET + playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER + launchtemplate gSkyDropTargetFlyingTemplate 0x2 0x4 0x0 0x0 0xd 0x150 + end +SkyDropUnleash: + visible ANIM_TARGET + monbg ANIM_DEF_PARTNER + setalpha 12, 8 + playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET + launchtemplate gBounceBallLandSpriteTemplate 0x83 0x0 + delay 0x7 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + launchtemplate gBasicHitSplatSpriteTemplate 0x82, 0x4, 0x0 0x0 0x1 0x0 + launchtask AnimTask_ShakeMon 0x5 0x5 0x1 0x0 0x5 0xb 0x1 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + end + +Move_SHIFT_GEAR: + loadspritegfx ANIM_TAG_GEAR @Gear + monbg ANIM_ATTACKER + playsewithpan SE_ESCALATOR, SOUND_PAN_ATTACKER + launchtemplate gShiftGearGearsTemplate 0x2 0x5 ANIM_ATTACKER 0xFFF3 0x8 0x65 0xa + launchtemplate gShiftGearGearsTemplate 0x2 0x5 ANIM_ATTACKER 0xE 0xFFF8 0x65 0xa + waitforvisualfinish + clearmonbg ANIM_ATTACKER + end + + +Move_CIRCLE_THROW: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_THIN_RING + loadspritegfx ANIM_TAG_ICE_CHUNK + monbg ANIM_DEF_PARTNER + setalpha 12, 8 + playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER + launchtask AnimTask_TranslateMonEllipticalRespectSide 0x2 0x5 0x0 0xc 0x4 0x1 0x2 + waitforvisualfinish + launchtemplate gSlideMonToOffsetSpriteTemplate 0x2 0x5 ANIM_ATTACKER 0x14 0x0 0x0 0x4 + delay 0x2 + launchtemplate gBasicHitSplatSpriteTemplate 0x3 0x4 0x0 0x0 0x1 0x1 + launchtemplate gCircleThrowRingTemplate 0x3 0x4 0x0 0x0 0x100 0x0 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 0x1 + launchtemplate gSlideMonToOffsetSpriteTemplate 0x2 0x5 ANIM_TARGET 0xffe8 0x0 0x0 0x4 + launchtemplate gCircleThrowRingTemplate 0x3 0x4 0x0 0x0 0x100 0x0 + waitforvisualfinish + delay 0x3 + launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_ATTACKER 0x0 0x7 + delay 0xb + launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_TARGET 0x0 0xa + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + end + + +Move_INCINERATE: + loadspritegfx ANIM_TAG_SMALL_EMBER + monbg ANIM_TARGET + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + delay 1 + createsprite gIncinerateSpriteTemplate, ANIM_TARGET, 2, 6, 20, 0, -16, 24, 20 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + createvisualtask AnimTask_SwayMon, 5, 0, 3, 0xc00, 8, ANIM_TARGET + createvisualtask AnimTask_SwayMon, 5, 0, 3, 0xc00, 8, ANIM_DEF_PARTNER + delay 3 + createsprite gIncinerateSpriteTemplate, ANIM_TARGET, 2, 6, 20, 0, -16, 24, 20 + delay 3 + createsprite gIncinerateSpriteTemplate, ANIM_TARGET, 2, 6, 20, 0, -16, 24, 20 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 3 + createsprite gIncinerateSpriteTemplate, ANIM_TARGET, 2, 6, 20, 0, -16, 24, 20 + delay 3 + createsprite gIncinerateSpriteTemplate, ANIM_TARGET, 2, 6, 20, 0, -16, 24, 20 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 3 + createsprite gIncinerateSpriteTemplate, ANIM_TARGET, 2, 6, 20, 0, -16, 24, 20 + delay 3 + createsprite gIncinerateSpriteTemplate, ANIM_TARGET, 2, 6, 20, 0, -16, 24, 20 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 3 + createsprite gIncinerateSpriteTemplate, ANIM_TARGET, 2, 6, 20, 0, -16, 24, 20 + delay 5 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 8, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 0, 8, 1 + createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_TARGET, RGB_RED, 12, 1, 1 + createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_DEF_PARTNER, RGB_RED, 12, 1, 1 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 5 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 0, 9 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end + +Move_QUASH: + loadspritegfx ANIM_TAG_ASSURANCE_HAND @hand + fadetobg BG_DARK + waitbgfadein + setalpha 12, 8 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + launchtemplate gQuashArmHitTemplate 0x83, 0x3 0x0 0xffe0 0xf + delay 0x13 + playsewithpan SE_M_MINIMIZE, SOUND_PAN_ATTACKER + launchtask AnimTask_SquishTarget 0x2 0x0 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + restorebg + waitbgfadein + end + +Move_ACROBATICS: + loadspritegfx ANIM_TAG_ROUND_SHADOW + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER + createsprite gFlyBallUpSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 13, 336 + waitforvisualfinish + playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET + createsprite gBounceBallLandSpriteTemplate, ANIM_TARGET, 3 + delay 7 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, 1, 0 + createvisualtask AnimTask_ShakeMon, 5, 1, 0, 5, 11, 1 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end + +Move_REFLECT_TYPE: + loadspritegfx ANIM_TAG_GUARD_RING @ring around user + loadspritegfx ANIM_TAG_ICE_CHUNK @blue green color + loadspritegfx ANIM_TAG_PURPLE_FLAME @violet color + loadspritegfx ANIM_TAG_PINK_PETAL @pink color + monbg ANIM_TARGET + setalpha 8, 8 + playsewithpan SE_M_STRING_SHOT2, SOUND_PAN_TARGET + launchtemplate gReflectTypeBlueStringTemplate 0x82 0x2 0x0 0xa + delay 0x4 + launchtemplate gReflectTypeVioletStringTemplate 0x82 0x2 0x0 0xfffe + delay 0x4 + launchtemplate gReflectTypeWhiteStringTemplate 0x82 0x2 0x0 0x16 + waitforvisualfinish + clearmonbg ANIM_TARGET + delay 0x1F + monbg ANIM_ATTACKER + playsewithpan SE_M_MILK_DRINK, SOUND_PAN_ATTACKER + launchtemplate gReflectTypeWhiteRingTemplate 0x2 0x0 + delay 0x1 + launchtemplate gReflectTypePinkRingTemplate 0x2 0x0 + delay 0x1 + launchtemplate gReflectTypeVioletRingTemplate 0x2 0x0 + delay 0x1 + launchtemplate gReflectTypeBlueRingTemplate 0x2 0x0 + delay 0x1 + launchtemplate gReflectTypeWhiteRingTemplate 0x2 0x0 + delay 0x1 + launchtemplate gReflectTypePinkRingTemplate 0x2 0x0 + delay 0x1 + launchtemplate gReflectTypeVioletRingTemplate 0x2 0x0 + delay 0x1 + launchtemplate gReflectTypeBlueRingTemplate 0x2 0x0 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + blendoff + end + + +Move_RETALITATE: + loadspritegfx ANIM_TAG_CUT @Cut + monbg ANIM_DEF_PARTNER + setalpha 9, 8 + launchtask AnimTask_AttackerPunchWithTrace 0x2 0x2 0x7128 0xa + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x10 0x0 + waitforvisualfinish + playsewithpan SE_M_CUT, SOUND_PAN_TARGET + launchtemplate gGuillotineSpriteTemplate 0x2 0x1 0x0 + launchtemplate gGuillotineSpriteTemplate 0x2 0x1 0x1 + delay 0x38 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x10 0x10 0x43D + waitforvisualfinish + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0 0x3 0xf 0x1 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x10 0x0 0x043D + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + end + + +Move_FINAL_GAMBIT: + loadspritegfx ANIM_TAG_PINK_CLOUD @yawn animation + loadspritegfx ANIM_TAG_WATER_IMPACT @blue colour + loadspritegfx ANIM_TAG_EXPLOSION @explosion animation + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 @Darken + waitforvisualfinish + launchtask AnimTask_ShakeMon2 0x2 0x5 0x0 0x1 0x0 0xa 0x1 + launchtask AnimTask_BlendColorCycle 0x2 0x6 ANIM_PAL_ATK 0x0 0x2 0x0 0x8 0x7fff + waitforvisualfinish + playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_ATTACKER + launchtemplate gFinalGambitBlueYawnTemplate 0x2 0x3 0x0 0x0 0x25 + delay 0x4 + waitforvisualfinish + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x3 0x0 0xf 0x1 + launchtask AnimTask_ScaleMonAndRestore 0x5 0x5 0xfffc 0xfffc 0xf 0x1 0x1 + waitforvisualfinish + monbg ANIM_TARGET + delay 0x1 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + launchtemplate gFinalGambitExplosionTemplate 0x3 0x4 0x0 0x0 0x1 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0 0x3 0xf 0x1 + waitforvisualfinish + clearmonbg ANIM_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 + waitforvisualfinish + end + + +Move_BESTOW: + monbg ANIM_TARGET + monbgprio_28 ANIM_TARGET + panse_1B SE_M_METRONOME, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 + launchtask AnimTask_CreateBestowItem 0x2 0x6 0x14 0x0 0x0 0x0 0x28 0xffe7 + waitforvisualfinish + unloadspritegfx ANIM_TAG_ITEM_BAG @;The generated item sprite uses this tag + clearmonbg ANIM_TARGET + end + + +Move_INFERNO: + loadspritegfx ANIM_TAG_SMALL_EMBER + call SetImpactBackground + loopsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET, 40, 4 + createvisualtask AnimTask_ShakeMon, 5, 1, 0, 2, 94, 1 + createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 1, 0, 9, RGB_RED + call InfernoAnim + call InfernoAnim + call InfernoAnim + call InfernoAnim + call InfernoAnim + call InfernoAnim + createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 1, 9, 0, RGB_RED + restorebg + waitbgfadein + waitforvisualfinish + end +InfernoAnim: + createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0, 28, 528, 30, 13, 50, 1 + delay 1 + createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0, 33, 464, 30, 15, -25, 1 + delay 1 + createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0, 32, 480, 20, 16, -46, 1 + delay 1 + createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0, 28, 512, 25, 16, 23, 1 + delay 1 + createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0, 33, 576, 20, 8, 42, 1 + delay 1 + createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0, 31, 400, 25, 11, -21, 1 + delay 1 + createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0, 31, 400, 25, 11, -42, 1 + delay 1 + createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0, 33, 576, 20, 8, 21, 1 + delay 1 + createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0, 28, 512, 25, 16, 46, 1 + delay 1 + createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0, 32, 480, 20, 16, -23, 1 + delay 1 + createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0, 33, 464, 30, 15, -50, 1 + delay 1 + createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0, 28, 528, 30, 13, 25, 1 + delay 1 + return + +Move_WATER_PLEDGE: + loadspritegfx ANIM_TAG_WATER_ORB + loadspritegfx ANIM_TAG_WATER_IMPACT + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + +@left fountain + + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 40, 1 + delay 6 + panse_1B SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 + + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + + createsprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -16, 0, ANIM_TARGET, 1 + + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + + createsprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -16, 0, ANIM_TARGET, 1 + + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + +@middle fountain (also continues left fountain) + + panse_1B SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 + + createvisualtask AnimTask_BlendColorCycle, 2, 4, 2, 2, 0, 11, RGB_BLUE + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 37, 1 + + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + + createsprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 + + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + + createsprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 + + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + +@right fountain (also continues middle and left fountains) + + panse_1B SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 + + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, 24, 10, -40, 2 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, 24, 10, -40, 2 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, 24, 10, -40, 2 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + + createsprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 16, 0, ANIM_TARGET, 1 + + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, 24, 10, -40, 2 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, 24, 10, -40, 2 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, 24, 10, -40, 2 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, 24, 10, -40, 2 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + + createsprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 16, 0, ANIM_TARGET, 1 + + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, 24, 10, -40, 2 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gWaterPledgeOrbSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + end + +Move_FIRE_PLEDGE: + loadspritegfx ANIM_TAG_SMALL_EMBER + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + +@left fountain + + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 40, 1 + delay 6 + panse_1B SE_M_FLAMETHROWER, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 + + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + +@middle fountain (also continues left fountain) + + panse_1B SE_M_FLAMETHROWER, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 + + createvisualtask AnimTask_BlendColorCycle, 2, 4, 2, 2, 0, 11, RGB_RED + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 37, 1 + + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + +@right fountain (also continues middle and left fountains) + + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, 24, 10, -40, 2 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, 24, 10, -40, 2 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, 24, 10, -40, 2 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, 24, 10, -40, 2 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, 24, 10, -40, 2 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, 24, 10, -40, 2 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, 24, 10, -40, 2 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, 24, 10, -40, 2 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gFirePledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + end + +Move_GRASS_PLEDGE: + loadspritegfx ANIM_TAG_LEAF + loadspritegfx ANIM_TAG_WHIP_HIT + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 40, 1 + delay 6 + playsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET + createsprite gVineWhipSpriteTemplate, ANIM_TARGET, 2, -16, 0 + + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + +@middle fountain (also continues left fountain) + + playsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET + createsprite gVineWhipSpriteTemplate, ANIM_TARGET, 2, 0, 0 + + createvisualtask AnimTask_BlendColorCycle, 2, 4, 2, 2, 0, 11, RGB_GREEN + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 37, 1 + + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + +@right fountain (also continues middle and left fountains) + + playsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET + createsprite gVineWhipSpriteTemplate, ANIM_TARGET, 2, 16, 0 + + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, 24, 10, -40, 2 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, 24, 10, -40, 2 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, 24, 10, -40, 2 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, 24, 10, -40, 2 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, 24, 10, -40, 2 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, 24, 10, -40, 2 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, 24, 10, -40, 2 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, 24, 10, -40, 2 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, 0, 10, -40, 2 + createsprite gGrassPledgeSpriteTemplate, ANIM_TARGET, 3, -24, 10, -40, 2 + delay 4 + + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + end + +Move_VOLT_SWITCH: + loadspritegfx ANIM_TAG_SPARK + loadspritegfx ANIM_TAG_SPARK_2 + loadspritegfx ANIM_TAG_THIN_RING + monbg ANIM_ATTACKER + setalpha 12, 8 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x3BDF, 8 + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + delay 4 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x3BDF, 8 + delay 4 + createvisualtask AnimTask_ShakeMon, 5, 1, 0, 3, 45, 1 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x3BDF, 8 + delay 4 + createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 0, 0, 0x3BDF, 8 + delay 4 + call ElectricityEffect + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + createvisualtask AnimTask_CanBattlerSwitch 1, ANIM_ATTACKER + jumpretfalse VoltSwitchContinue + createvisualtask AnimTask_IsTargetSameSide 1 + jumprettrue VoltSwitchAgainstPartner + createvisualtask AnimTask_SlideOffScreen, 5, ANIM_ATTACKER, -2 +VoltSwitchContinue: + waitforvisualfinish + clearmonbg ANIM_ATTACKER + blendoff + createvisualtask AnimTask_CanBattlerSwitch 1, ANIM_ATTACKER + jumpretfalse VoltSwitchLast + invisible ANIM_ATTACKER +VoltSwitchLast: + delay 8 + end +@ Attacking the same side requires a change of direction +@ why would you attack your partner though?! +VoltSwitchAgainstPartner: + createvisualtask AnimTask_SlideOffScreen, 5, ANIM_ATTACKER, +2 + goto VoltSwitchContinue + +Move_STRUGGLE_BUG: + loadspritegfx ANIM_TAG_MOVEMENT_WAVES + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_TARGET + setalpha 12, 8 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x2 0x0 0x9 0x0a1f + waitforvisualfinish + launchtask AnimTask_FlailMovement 0x2 0x1 0x0 + launchtemplate gMovementWavesSpriteTemplate 0x2 0x3 0x0 0x0 0x2 + launchtemplate gMovementWavesSpriteTemplate 0x2 0x3 0x0 0x1 0x2 + loopsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER, 0x8, 0x2 + waitforvisualfinish + launchtemplate gRandomPosHitSplatSpriteTemplate 0x83 0x2 0x1 0x3 + launchtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg 0x2 0x5 0x0 0x1 0x1e 0x1 0x0 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x2 0x9 0x0 0x0a1f + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end + + +Move_BULLDOZE: + launchtask AnimTask_Splash 0x2 0x2 0x0 0x3 + delay 0x8 + goto Move_EARTHQUAKE + + +Move_FROST_BREATH: + loadspritegfx ANIM_TAG_ICE_CHUNK + loadspritegfx ANIM_TAG_SMALL_EMBER + loadspritegfx ANIM_TAG_FIRE_PLUME + fadetobg BG_ICE + waitbgfadeout + launchtask AnimTask_StartSlidingBg 0x5 0x4 0x300 0x0 0x0 0xffff + waitbgfadein + playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x5 0x5 0x0 0x0 0x2 0x28 0x1 + waitforvisualfinish + launchtemplate gSlideMonToOffsetSpriteTemplate 0x82 0x5 0x0 0xf 0x0 0x0 0x4 + waitforvisualfinish + launchtemplate gFrostBreathBlueBreathTemplate 0x82 0x5 0x1e 0xf 0x0 0xa 0xa + waitforvisualfinish + loopsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET, 0xb, 0x3 + launchtask AnimTask_ShakeMon 0x5 0x5 0x1 0x0 0x3 0x19 0x1 + launchtemplate gFrostBreathBlueRageTemplate 0xc2 0x3 0x1 0x5 0x0 + delay 0x1 + launchtemplate gFrostBreathBlueRageTemplate 0xc2 0x3 0x1 0xfff6 0xfff1 + delay 0x1 + launchtemplate gFrostBreathBlueRageTemplate 0x82, 0x3, 0x1 0x0 0x19 + delay 0x1 + launchtemplate gFrostBreathBlueRageTemplate 0xc2 0x3 0x1 0xf 0x5 + delay 0x1 + launchtemplate gFrostBreathBlueRageTemplate 0xc2 0x3 0x1 0xffe7 0x0 + delay 0x1 + launchtemplate gFrostBreathBlueRageTemplate 0x82, 0x3, 0x1 0x1e 0x1e + delay 0x1 + launchtemplate gFrostBreathBlueRageTemplate 0x82, 0x3, 0x1 0xffe5 0x19 + delay 0x1 + launchtemplate gFrostBreathBlueRageTemplate 0xc2 0x3 0x1 0x0 0x8 + waitforvisualfinish + launchtemplate gSlideMonToOriginalPosSpriteTemplate 0xc2 0x3 0x0 0x0 0x4 + waitforvisualfinish + call UnsetPsychicBg + end + + +Move_DRAGON_TAIL: + loadspritegfx ANIM_TAG_ROCKS + loadspritegfx ANIM_TAG_SLAM_HIT + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_TARGET + createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_SLAM_HIT, 0x2, 0xD, 0xD, 0x5CAE + waitforvisualfinish + setalpha 12, 8 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_ATTACKER + launchtemplate gSlideMonToOffsetSpriteTemplate 0x2 0x5 ANIM_ATTACKER 0x14 0x3 0x0 0x4 + delay 0x1 + launchtemplate gSlamHitSpriteTemplate 0x2 0x2 0x0 0x0 + delay 0x3 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + launchtemplate gBasicHitSplatSpriteTemplate 0x3 0x4 0x0 0x0 0x1 0x1 + launchtemplate gSlideMonToOffsetSpriteTemplate 0x2 0x5 ANIM_TARGET 0xfff4 0xa 0x0 0x3 + launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_ATTACKER 0x0 0x5 + call TailWhackDown + delay 0x3 + launchtask AnimTask_ShakeMonInPlace 0x2 0x5 0x1 0x0 0x3 0x6 0x1 + waitforvisualfinish + delay 0x5 + launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_TARGET 0x0 0x6 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end +TailWhackDown: + launchtemplate gBasicHitSplatSpriteTemplate 0x83 4 0xfff6 0xfff8 1 1 + playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET + launchtemplate gRockScatterSpriteTemplate, 0x82, 4, -12, 0x1b, 2, 3 + launchtemplate gRockScatterSpriteTemplate, 0x82, 4, 8, 28, 3, 4 + launchtemplate gRockScatterSpriteTemplate, 0x82, 4, -4, 30, 2, 3 + launchtemplate gRockScatterSpriteTemplate, 0x82, 4, 12, 25, 4, 4 + return + + +Move_WORK_UP: + loadspritegfx ANIM_TAG_FOCUS_ENERGY + playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER + createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, -28, 26, 2 + createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, 28, 26, 2 + delay 5 + createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, -23, 10, 2 + createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, 23, 10, 2 + delay 5 + createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, -18, 26, 3 + createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, 18, 26, 3 + delay 14 + createvisualtask AnimTask_BlendColorCycle, 2, 2, 2, 2, 0, 11, RGB(31, 2, 4) + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 32, 1 + createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, -13, 26, 2 + createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, 13, 26, 2 + delay 5 + createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, -8, 10, 2 + createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, 8, 10, 2 + delay 5 + createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, -3, 26, 3 + createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, 3, 26, 3 + delay 14 + createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, -2, 26, 2 + createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, 2, 26, 2 + delay 5 + createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, -7, 10, 2 + createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, 7, 10, 2 + delay 5 + createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, -12, 26, 3 + createsprite gEndureEnergySpriteTemplate, ANIM_ATTACKER, 2, 0, 12, 26, 3 + waitforvisualfinish + end + +Move_ELECTROWEB: + loadspritegfx ANIM_TAG_SPIDER_WEB + loadspritegfx ANIM_TAG_WEB_THREAD + loadspritegfx ANIM_TAG_SPARK_2 + monbg ANIM_DEF_PARTNER + delay 0 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPIDER_WEB, 0, 6, 6, RGB(31, 30, 1) + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, 1, 2, 0, 9, RGB_BLACK + waitforvisualfinish + monbgprio_28 ANIM_TARGET + waitforvisualfinish + playsewithpan SE_M_STRING_SHOT2, SOUND_PAN_TARGET + createsprite gSpiderWebSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, TRUE + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + delay 1 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, 1, 2, 9, 0, RGB_BLACK + + @ ElectricityEffect looks ugly against both opponents, to do later + jumpifdoublebattle Move_ELECTROWEB_Wait + + call ElectricityEffect +Move_ELECTROWEB_Wait: + waitforvisualfinish + end + +Move_WILD_CHARGE: + loadspritegfx ANIM_TAG_SPARK_2 + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + launchtemplate gGrowingShockWaveOrbSpriteTemplate 0x2 0x0 @electric circle + delay 0x1e + waitforvisualfinish + loopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 0x1c, 0x2 + call ScreenFlash + waitforvisualfinish + call ScreenFlash + waitforvisualfinish + playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER + launchtemplate gVerticalDipSpriteTemplate 0x2 0x3 0x6 0x1 0x0 + waitforvisualfinish + delay 0xb + launchtemplate gSlideMonToOffsetSpriteTemplate 0x2 0x5 ANIM_ATTACKER 0x1a 0x0 0x0 0x5 + delay 0x6 + launchtemplate gBasicHitSplatSpriteTemplate 0x4 0x4 0xfff6 0x0 0x1 0x0 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0 0x3 0x10 0x1 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + call ElectricityEffect + waitforvisualfinish + launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_ATTACKER 0x0 0x5 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end +ScreenFlash: + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x07FE + return + +Move_DRILL_RUN: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_HORN_HIT + setalpha 12, 8 + fadetobg BG_FISSURE + waitbgfadeout + launchtask AnimTask_PositionFissureBgOnBattler 0x5 0x3 0x1 0x5 0xffff + launchtemplate gBowMonSpriteTemplate 0x2 0x1 0x0 + playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER + waitforvisualfinish + delay 0x2 + launchtemplate gBowMonSpriteTemplate 0x2 0x1 0x1 + launchtemplate gHornHitSpriteTemplate 0x84 0x3 0x0 0x0 0xc + waitforvisualfinish + playse 0x14 + launchtask AnimTask_ShakeMonInPlace 0x2 0x5 0x0 0x2 0x0 0x28 0x1 + launchtask AnimTask_ShakeMonInPlace 0x2 0x5 0x1 0xa 0x0 0x28 0x1 + launchtemplate gFlashingHitSplatSpriteTemplate 0x83 0x4 0x0 0x0 0x1 0x3 + playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gFlashingHitSplatSpriteTemplate 0x83 0x4 0x0 0x2 0x1 0x3 + playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gFlashingHitSplatSpriteTemplate 0x83 0x4 0xfffc 0x3 0x1 0x3 + playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gFlashingHitSplatSpriteTemplate 0x83 0x4 0xfff8 0xfffb 0x1 0x3 + playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gFlashingHitSplatSpriteTemplate 0x83 0x4 0x4 0xfff4 0x1 0x3 + playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gFlashingHitSplatSpriteTemplate 0x83 0x4 0x10 0x0 0x1 0x3 + playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gFlashingHitSplatSpriteTemplate 0x83 0x4 0x5 0x12 0x1 0x3 + playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gFlashingHitSplatSpriteTemplate 0x83 0x4 0xffef 0xc 0x1 0x2 + playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gFlashingHitSplatSpriteTemplate 0x83 0x4 0xffeb 0xfff1 0x1 0x2 + playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gFlashingHitSplatSpriteTemplate 0x83 0x4 0x8 0xffe5 0x1 0x2 + playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gFlashingHitSplatSpriteTemplate 0x83 0x4 0x20 0x0 0x1 0x2 + playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gBowMonSpriteTemplate 0x2 0x1 0x2 + waitforvisualfinish + call UnsetPsychicBg + end + + +Move_DUAL_CHOP: + loadspritegfx ANIM_TAG_HANDS_AND_FEET @hand + loadspritegfx ANIM_TAG_IMPACT @hit + loadspritegfx ANIM_TAG_POISON_BUBBLE @purple + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + launchtemplate gHorizontalLungeSpriteTemplate 0x2 0x2 0x4 0x4 + delay 0x6 + launchtask AnimTask_ShakeMon 0x2 0x5 0x1 0x5 0x0 0x6 0x1 + launchtemplate gKarateChopSpriteTemplate 0x2 0x8 0xffe0 0x0 0x0 0x0 0xa 0x1 0x3 0x0 @left + launchtemplate gKarateChopSpriteTemplate 0x2 0x8 0x0515 0x0 0x0 0x0 0xa 0x1 0x3 0x0 @right + waitforvisualfinish + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + launchtemplate gDualChopImpactTemplate 0x3 0x4 0x0 0x0 0x1 0x2 + launchtask AnimTask_ShakeMon 0x5 0x5 0x1 0x4 0x0 0x6 0x1 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + end + + +Move_HEART_STAMP: + loadspritegfx ANIM_TAG_HEART_STAMP + monbg ANIM_TARGET + loopsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER, 0xc, 0x3 + launchtemplate gHeartStampSpinningHeartTemplate, 0x80, 0x4 0x0 0x0 0x1 0x1e + delay 0x1E + clearmonbg ANIM_TARGET + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMon2 0x83 0x5 0x1 0x4 0x0 0x5 0x1 + launchtask AnimTask_StretchTargetUp 0x3 0x0 + waitforvisualfinish + end + + +Move_HORN_LEECH: + loadspritegfx ANIM_TAG_HORN_LEECH @Horn + loadspritegfx ANIM_TAG_IMPACT @hit + loadspritegfx ANIM_TAG_ORBS + loadspritegfx ANIM_TAG_BLUE_STAR + playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER + launchtemplate gHornLeechHornTemplate 0x82, 0x3, 0x0 0x0 0x25 + waitforvisualfinish + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x5 0x0 0x6 0x1 + launchtemplate gFlashingHitSplatSpriteTemplate 0x83 0x4 0x0 0x0 0x1 0x1 + playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET + call GigaDrainAbsorbEffect + waitforvisualfinish + call HealingEffect + waitforvisualfinish + end + + +Move_SACRED_SWORD: + loadspritegfx ANIM_TAG_CUT @Cut + loadspritegfx ANIM_TAG_SWORD @Sword + loadspritegfx ANIM_TAG_HYDRO_PUMP @Blue Colour + loadspritegfx ANIM_TAG_PUNISHMENT_BLADES @Punishment Blade + monbg ANIM_ATTACKER + setalpha 12, 8 + playsewithpan SE_M_SWORDS_DANCE, SOUND_PAN_ATTACKER + launchtemplate gSwordsDanceBladeSpriteTemplate 0x2 0x2 0x0 0x0 + delay 0x16 + launchtask AnimTask_FlashAnimTagWithColor 0x2 0x7 0x2715 0x2 0x2 0x7ff2 0x10 0x0 0x0 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + delay 0x1 + monbg ANIM_TARGET + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + launchtemplate gSacredSwordBladesTemplate 0x81 0x5 0x0 0xa 0x0 0xFF00 0xA + launchtemplate gSacredSwordCutTemplate 0x2 0x3 0x28 0xffe0 0x0 + delay 0x5 + launchtask AnimTask_ShakeMon 0x2 0x5 0x1 0x0 0x3 0xa 0x1 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + waitforvisualfinish + end + + +Move_RAZOR_SHELL: + loadspritegfx ANIM_TAG_RAZOR_SHELL + loadspritegfx ANIM_TAG_CUT + monbg ANIM_TARGET + launchtemplate gRazorShellTemplate 0x2 0x5 ANIM_TARGET 0x0 0x0 25 0 + playsewithpan SE_M_CUT, SOUND_PAN_TARGET + launchtemplate gCuttingSliceSpriteTemplate 0x1 0x3 0x28 0xffe0 0x0 + delay 0x5 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0 0x3 0xa 0x1 + waitforvisualfinish + clearmonbg ANIM_TARGET + waitforvisualfinish + end + + +Move_HEAT_CRASH: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_WARM_ROCK + loadspritegfx ANIM_TAG_ROCKS + monbg ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_SUCCESS, SOUND_PAN_TARGET + launchtemplate gHeatCrashEruptionRockTemplate 0x3 0x3 0x0 0xffe0 0xf + delay 0x13 + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0x0 0xfff8 0x1 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0 0x4 0x9 0x1 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + delay 0x5 + launchtemplate gBasicHitSplatSpriteTemplate 0x83 0x4 0xa 0xfff8 0x1 0x1 + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0 0x3 0x5 0x1 + launchtemplate gRockScatterSpriteTemplate 0x82, 0x4, 0xfff4 0x20 0x3 0x4 + launchtemplate gRockScatterSpriteTemplate 0x82, 0x4, 0x8 0x1f 0x2 0x2 + launchtemplate gRockScatterSpriteTemplate 0x82, 0x4, 0xfffc 0x1c 0x2 0x3 + launchtemplate gRockScatterSpriteTemplate 0x82, 0x4, 0xc 0x1e 0x4 0x3 + clearmonbg ANIM_TARGET + blendoff + end + + +Move_LEAF_TORNADO: + loadspritegfx ANIM_TAG_GUST @Gust + loadspritegfx ANIM_TAG_LEAF @Leaves + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + playsewithpan SE_M_GUST, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMon 0x5 0x5 0x1 0x0 0x2 0x2f 0x1 + launchtemplate gEllipticalGustSpriteTemplate 0x2 0x2 0x0 0xfff0 + launchtask AnimTask_AnimateGustTornadoPalette 0x5 0x2 0x1 0x46 + call LeafTornadoVortex + call LeafTornadoVortex + call LeafTornadoVortex + waitforvisualfinish + stopsound + clearmonbg ANIM_TARGET + end +LeafTornadoVortex: + launchtemplate gLeafTornadoVortexTemplate 0x82 0x7 0x0 0x1c 0x210 0x1e 0xd 0x32 0x1 + delay 0x2 + launchtemplate gLeafTornadoVortexTemplate 0x82 0x7 0x0 0x20 0x1e0 0x14 0x10 0xffd2 0x1 + delay 0x2 + launchtemplate gLeafTornadoVortexTemplate 0x82 0x7 0x0 0x21 0x240 0x14 0x8 0x2a 0x1 + delay 0x2 + launchtemplate gLeafTornadoVortexTemplate 0x82 0x7 0x0 0x1f 0x190 0x19 0xb 0xffd6 0x1 + delay 0x2 + launchtemplate gLeafTornadoVortexTemplate 0x82 0x7 0x0 0x1c 0x200 0x19 0x10 0x2e 0x1 + delay 0x2 + launchtemplate gLeafTornadoVortexTemplate 0x82 0x7 0x0 0x21 0x1d0 0x1e 0xf 0xffce 0x1 + delay 0x2 + return + + +Move_STEAMROLLER: + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_TARGET + setalpha 12, 8 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 26, 0, 0, 5 + delay 6 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, 1, 0 + loopsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET, 6, 3 + delay 1 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -28, 0, 0, 3 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0, 3, 1, 0 + delay 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 10, 6, 1, 0 + delay 1 + waitforvisualfinish + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 + waitforvisualfinish + delay 10 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 6 + delay 5 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 6 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end + +Move_COTTON_GUARD: + loadspritegfx ANIM_TAG_SPORE + monbg ANIM_ATK_PARTNER + setalpha 12, 8 + loopsewithpan SE_M_POISON_POWDER, SOUND_PAN_TARGET 0x12 0x6 + call CreateCottonSpores + call CottonSporesSpiralInward + call CottonSporesSpiralInward + call CottonSporesSpiralInward + waitforvisualfinish + clearmonbg ANIM_ATK_PARTNER + blendoff + end +CottonSporesSpiralInward: + launchtemplate gCottonGuardSporeTemplate 0x2 0x3 0x28 0xfff6 0xd + delay 0x3 + launchtemplate gCottonGuardSporeTemplate 0x2 0x3 0xffdd 0xfff6 0xd + delay 0x3 + launchtemplate gCottonGuardSporeTemplate 0x2 0x3 0xf 0xffd8 0xd + delay 0x3 + launchtemplate gCottonGuardSporeTemplate 0x2 0x3 0xfff6 0xffe0 0xd + delay 0x3 + launchtemplate gCottonGuardSporeTemplate 0x2 0x3 0x19 0xffec 0xd + delay 0x3 + launchtemplate gCottonGuardSporeTemplate 0x2 0x3 0xffd8 0xffec 0xd + delay 0x3 + launchtemplate gCottonGuardSporeTemplate 0x2 0x3 0x5 0xffd8 0xd + delay 0x3 + return + + +Move_NIGHT_DAZE: + loadspritegfx ANIM_TAG_THIN_RING @uproar + loadspritegfx ANIM_TAG_PURPLE_FLAME @dark violet color + loadspritegfx ANIM_TAG_RED_ORB @circles + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + playsewithpan SE_ORB, SOUND_PAN_ATTACKER + launchtemplate gNightDazeVioletRingsTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1F 0x8 + launchtemplate gNightDazeVioletCirclesTemplate 0x82 0x1 0x0 + launchtemplate gNightDazeVioletCirclesTemplate 0x82 0x1 0x20 + launchtemplate gNightDazeVioletCirclesTemplate 0x82 0x1 0x40 + launchtemplate gNightDazeVioletCirclesTemplate 0x82 0x1 0x60 + launchtemplate gNightDazeVioletCirclesTemplate 0x82 0x1 0x80 + launchtemplate gNightDazeVioletCirclesTemplate 0x82 0x1 0xa0 + launchtemplate gNightDazeVioletCirclesTemplate 0x82 0x1 0x0 + launchtemplate gNightDazeVioletCirclesTemplate 0x82 0x1 0xe0 + delay 0x1 + launchtemplate gNightDazeVioletRingsTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1F 0x8 + delay 0x1 + launchtemplate gNightDazeVioletRingsTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1F 0x8 + delay 0xF + launchtemplate gNightDazeVioletRingsTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1F 0x8 + delay 0x1 + launchtemplate gNightDazeVioletRingsTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1F 0x8 + delay 0x1 + launchtemplate gNightDazeVioletRingsTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1F 0x8 + waitforvisualfinish + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x3 0x0 0x1f 0x1 + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 ANIM_PAL_DEF 0x2 0x0 0x9 0x2002 + delay 0x6 + playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 ANIM_PAL_DEF 0x2 0x9 0x0 0x2002 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 + waitforvisualfinish + end + + +Move_PSYSTRIKE: + monbg ANIM_TARGET + setalpha 8, 8 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 10, 1 + createvisualtask AnimTask_BlendColorCycle, 2, 2, 0, 2, 0, 8, RGB_RED + waitforvisualfinish + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 + loopsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET, 10, 3 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 15, 1 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -9, -9, 15, ANIM_TARGET, 1 + waitforvisualfinish + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end + +Move_TAIL_SLAP: + loadspritegfx ANIM_TAG_IMPACT @Hit + loadspritegfx ANIM_TAG_AIR_WAVE_2 @Aeroblast + loadspritegfx ANIM_TAG_PUNISHMENT_BLADES @Punishment Blades + monbg ANIM_TARGET + setalpha 12, 8 + choosetwoturnanim TailSlapRight TailSlapLeft +TailSlapContinue: + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x3 0x0 0x6 0x1 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end +TailSlapRight: + launchtemplate gTailSlapTemplate 0x2 0x4 0xfff8 0x0 0x1 0x0 + goto TailSlapContinue +TailSlapLeft: + launchtemplate gTailSlapTemplate 0x2 0x4 0x8 0x0 0x1 0x0 + goto TailSlapContinue + + +Move_HURRICANE: + loadspritegfx ANIM_TAG_GUST + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + fadetobg BG_HIGH_SPEED + waitbgfadeout + launchtask AnimTask_StartSlidingBg 0x5 0x4 0x1000 0x0 0x1 0xffff + waitbgfadein + playsewithpan SE_M_GUST, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0 0x3 0x40 0x1 + call HurricaneGust + delay 0xA + call HurricaneGust + delay 0xA + call HurricaneGust + delay 0xA + call HurricaneGust + delay 0xA + call HurricaneGust + delay 0xA + call HurricaneGust + waitforvisualfinish + stopsound + clearmonbg ANIM_DEF_PARTNER + blendoff + call UnsetPsychicBg + end +HurricaneGust: + launchtemplate gPoisonBubbleSpriteTemplate 0x82, 2 0 0xfff0 + launchtask AnimTask_AnimateGustTornadoPalette 5 2 1 0x46 + return + + +Move_HEAD_CHARGE: + loadspritegfx ANIM_TAG_IMPACT + fadetobgfromset BG_GIGA_IMPACT_OPPONENT, BG_GIGA_IMPACT_PLAYER, BG_GIGA_IMPACT_OPPONENT + waitbgfadein + launchtemplate gBowMonSpriteTemplate 0x2 0x1 0x0 + playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER + waitforvisualfinish + delay 0x2 + launchtemplate gBowMonSpriteTemplate 0x2 0x1 0x1 + waitforvisualfinish + launchtask AnimTask_ShakeMon 0x2 0x5 0x0 0x2 0x0 0x4 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x5 0x0 0x6 0x1 + launchtemplate gBowMonSpriteTemplate 0x2 0x1 0x2 + launchtemplate gFlashingHitSplatSpriteTemplate 0x83 0x4 0x0 0x0 0x1 0x1 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + waitforvisualfinish + restorebg + waitbgfadeout + end + + +Move_GEAR_GRIND: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_GEAR @Gear + monbg ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_ESCALATOR, SOUND_PAN_ATTACKER + launchtemplate gGearGrindTemplate 0x2 0x6 0xffe0 0xffe0 0x0 0x333 0x333 0xa + launchtemplate gGearGrindTemplate 0x2 0x6 0x20 0x20 0x0 0xfccd 0xfccd 0xa + delay 0xa + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0xfff8 0x0 0x1 0x1 + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_TARGET 0x0 0x7 0x5 0x2 + waitforvisualfinish + launchtemplate gGearGrindTemplate 0x2 0x6 0x20 0xffe0 0x0 0xfccd 0x333 0xa + launchtemplate gGearGrindTemplate 0x2 0x6 0xffe0 0x20 0x0 0x333 0xfccd 0xa + delay 0xa + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0x8 0x0 0x1 0x1 + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_TARGET 0x0 0x8 0x4 0x2 + waitforvisualfinish + stopsound + clearmonbg ANIM_TARGET + blendoff + end + + +Move_SEARING_SHOT: + loadspritegfx ANIM_TAG_SPARK_2 @yellow color + loadspritegfx ANIM_TAG_JAGGED_MUSIC_NOTE @red color + loadspritegfx ANIM_TAG_ELECTRIC_ORBS @charge + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge + loadspritegfx ANIM_TAG_WARM_ROCK @eruption + createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_ELECTRIC_ORBS, 0x0, 0xC, 0xC, 0x0E3E @Orange + createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_WARM_ROCK, 0x0, 0xB, 0xB, 0x01BE @Orange + monbg ANIM_ATTACKER + setalpha 8, 8 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x10 0x0 + waitforvisualfinish + launchtask AnimTask_ElectricChargingParticles 0x2 0x4 0x0 0x3c 0x2 0xc + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 ANIM_PAL_ATK 0x2 0x0 0x9 0x1F + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + delay 0x1e + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + delay 0x1e + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + launchtemplate gSearingShotRedChargeTemplate 0x2 0x1 0x0 + delay 0x19 + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + delay 0x14 + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + delay 0xf + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + waitforvisualfinish + playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER + launchtemplate gSearingShotEruptionRockTemplate 0x2 0x5 0x1 0x0 0x1e 0x19 0xffec + launchtemplate gSearingShotEruptionRockTemplate 0x2 0x5 0x1 0x20 0x1e 0x19 0xffec + launchtemplate gSearingShotEruptionRockTemplate 0x2 0x5 0x1 0x40 0x1e 0x19 0xffec + delay 0x2 + launchtemplate gSearingShotEruptionRockTemplate 0x2 0x5 0x1 0x60 0x1e 0x19 0xffec + launchtemplate gSearingShotEruptionRockTemplate 0x2 0x5 0x1 0x80 0x1e 0x19 0xffec + delay 0x2 + launchtemplate gSearingShotEruptionRockTemplate 0x42 0x5 0x1 0xa0 0x1e 0x19 0xffec + launchtemplate gSearingShotEruptionRockTemplate 0x42 0x5 0x1 SOUND_PAN_ATTACKER 0x1e 0x19 0xffec + delay 0x2 + launchtemplate gSearingShotEruptionRockTemplate 0x42 0x5 0x1 0xe0 0x1e 0x19 0xffec + delay 0xF + playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER + launchtemplate gSearingShotEruptionRockTemplate 0x2 0x5 0x1 0x0 0x1e 0x19 0x0 + delay 0x2 + launchtemplate gSearingShotEruptionRockTemplate 0x2 0x5 0x1 0x20 0x1e 0x19 0x0 + launchtemplate gSearingShotEruptionRockTemplate 0x2 0x5 0x1 0x40 0x1e 0x19 0x0 + launchtemplate gSearingShotEruptionRockTemplate 0x2 0x5 0x1 0x60 0x1e 0x19 0x0 + delay 0x2 + launchtemplate gSearingShotEruptionRockTemplate 0x2 0x5 0x1 0x80 0x1e 0x19 0x0 + delay 0x2 + launchtemplate gSearingShotEruptionRockTemplate 0x42 0x5 0x1 0xa0 0x1e 0x19 0x0 + launchtemplate gSearingShotEruptionRockTemplate 0x42 0x5 0x1 SOUND_PAN_ATTACKER 0x1e 0x19 0x0 + delay 0x2 + launchtemplate gSearingShotEruptionRockTemplate 0x42 0x5 0x1 0xe0 0x1e 0x19 0x0 + delay 0x15 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 ANIM_PAL_ATK 0x2 0x9 0x0 0x1F + clearmonbg ANIM_ATTACKER + fadetobg BG_FIRE + waitbgfadeout + launchtask AnimTask_StartSlidingBg 0x5 0x4 0xA00 0x0 0x1 0xffff + waitbgfadein + delay 0x1E + monbg ANIM_ATK_PARTNER + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 ANIM_PAL_ATK_PARTNER | ANIM_PAL_DEF | ANIM_PAL_DEF_PARTNER 0x2 0x0 0x9 0x1F + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x3 0x0 0x1B 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_DEF_PARTNER 0x3 0x0 0x1B 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_ATK_PARTNER 0x3 0x0 0x1B 0x1 + playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET + launchtemplate gSearingShotEruptionImpactTemplate 0x83 0x5, -5, -5, 0x1 0x1E ANIM_TARGET + launchtemplate gSearingShotEruptionImpactTemplate 0x83 0x5, 5, 10, 0x1 0x1E ANIM_TARGET + launchtemplate gSearingShotEruptionImpactTemplate 0x83 0x5, -5, -5, 0x1 0x1E ANIM_DEF_PARTNER + launchtemplate gSearingShotEruptionImpactTemplate 0x83 0x5, 5, 10, 0x1 0x1E ANIM_DEF_PARTNER + launchtemplate gSearingShotEruptionImpactTemplate 0x83 0x5, -5, -5, 0x1 0x1E ANIM_ATK_PARTNER + launchtemplate gSearingShotEruptionImpactTemplate 0x83 0x5, 5, 10, 0x1 0x1E ANIM_ATK_PARTNER + delay 0x1E + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 ANIM_PAL_ATK_PARTNER | ANIM_PAL_DEF | ANIM_PAL_DEF_PARTNER 0x2 0x9 0x0 0x1F + delay 0x1E + call UnsetPsychicBg + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x0 0x0 + clearmonbg ANIM_ATK_PARTNER + blendoff + end + + +Move_TECHNO_BLAST: + launchtask AnimTask_TechnoBlast 0x5 0x0 + jumpargeq 0x0, 10, TechnoBlastFire + jumpargeq 0x0, 11, TechnoBlastWater + jumpargeq 0x0, 13, TechnoBlastElectric + jumpargeq 0x0, 15, TechnoBlastIce +TechnoBlastNormal: + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge animation + loadspritegfx ANIM_TAG_ORBS @circles + loadspritegfx ANIM_TAG_AIR_WAVE_2 @white/gray color + loadspritegfx ANIM_TAG_BLACK_BALL_2 @blast + loadspritegfx ANIM_TAG_SPARK_2 @blast particles + loadspritegfx ANIM_TAG_GRAY_SMOKE @dispersal + monbg ANIM_ATTACKER + setblends 0x80E + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + loopsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER, 0xE, 0x8 + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0x28 0x28 0x10 + delay 0x2 + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0xffd8 0xffd8 0x10 + delay 0x2 + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0x0 0x28 0x10 + delay 0x2 + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0x0 0xffd8 0x10 + delay 0x2 + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0x28 0xffec 0x10 + delay 0x2 + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0x28 0x14 0x10 + delay 0x2 + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0xffd8 0xffec 0x10 + delay 0x2 + launchtemplate gTechnoBlastWhiteChargeTemplate 0x2 0x1 0x0 + call TechnoBlastWhiteCircles + call TechnoBlastWhiteCircles + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0x28 0x28 0x10 + delay 0x2 + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0xffd8 0xffd8 0x10 + delay 0x2 + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0x0 0x28 0x10 + delay 0x2 + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0x0 0xffd8 0x10 + delay 0x2 + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0x28 0xffec 0x10 + delay 0x2 + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0x28 0x14 0x10 + delay 0x2 + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0xffd8 0xffec 0x10 + delay 0x2 + waitforvisualfinish + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastWhiteBlastTemplate 0x83 0x6 0xa 0x0 0x0 0x0 0x1e 0x0 + launchtemplate gTechnoBlastWhiteSparkTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x0 0x28 0x0 + launchtemplate gTechnoBlastWhiteSparkTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x40 0x28 0x1 + launchtemplate gTechnoBlastWhiteSparkTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x80 0x28 0x0 + launchtemplate gTechnoBlastWhiteSparkTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x0 0x28 0x2 + launchtemplate gTechnoBlastWhiteSparkTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0x20 0x28 0x0 + launchtemplate gTechnoBlastWhiteSparkTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0x60 0x28 0x1 + launchtemplate gTechnoBlastWhiteSparkTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0xa0 0x28 0x0 + launchtemplate gTechnoBlastWhiteSparkTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0xe0 0x28 0x2 + waitforvisualfinish + playsewithpan SE_M_EMBER, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0x4 0x0 0x5 0x1 + launchtemplate gTechnoBlastWhiteSmokeTemplate 0x82, 0x4, 0x8 0x8 0x1 0x0 + delay 0x2 + launchtemplate gTechnoBlastWhiteSmokeTemplate 0x82, 0x4, 0xfff8 0xfff8 0x1 0x0 + delay 0x2 + launchtemplate gTechnoBlastWhiteSmokeTemplate 0x82, 0x4, 0x8 0xfff8 0x1 0x0 + delay 0x2 + launchtemplate gTechnoBlastWhiteSmokeTemplate 0x82, 0x4, 0xfff8 0x8 0x1 0x0 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 + waitforvisualfinish + blendoff + clearmonbg ANIM_ATTACKER + end +TechnoBlastWhiteCircles: + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0xffd8 0x14 0x10 + delay 0x2 + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0xffec 0x1e 0x10 + delay 0x2 + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0x14 0xffe2 0x10 + delay 0x2 + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0xffec 0xffe2 0x10 + delay 0x2 + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0x14 0x1e 0x10 + delay 0x2 + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0xffd8 0x0 0x10 + delay 0x2 + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0x28 0x0 0x10 + delay 0x2 + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0x28 0x28 0x10 + delay 0x2 + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0xffd8 0xffd8 0x10 + delay 0x2 + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0x0 0x28 0x10 + delay 0x2 + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0x0 0xffd8 0x10 + delay 0x2 + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0x28 0xffec 0x10 + delay 0x2 + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0x28 0x14 0x10 + delay 0x2 + launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0xffd8 0xffec 0x10 + delay 0x2 + return + +TechnoBlastElectric: + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge animation + loadspritegfx ANIM_TAG_ORBS @circles + loadspritegfx ANIM_TAG_BLACK_BALL_2 @blast + loadspritegfx ANIM_TAG_SPARK_2 @blast particles + loadspritegfx ANIM_TAG_GRAY_SMOKE @dispersal + monbg ANIM_ATTACKER + setblends 0x80E + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + loopsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER, 0xE, 0x8 + launchtemplate gGrowingChargeOrbSpriteTemplate 0x2 0x1 0x0 + call TechnoBlastCharging1 + delay 0xF + call TechnoBlastCharging2 + delay 0xF + call TechnoBlastCharging1 + delay 0xF + call TechnoBlastCharging2 + delay 0xF + call TechnoBlastCharging1 + delay 0xF + call TechnoBlastCharging2 + delay 0xF + call TechnoBlastCharging1 + delay 0xF + call TechnoBlastCharging2 + delay 0xF + waitforvisualfinish + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastYellowBlastTemplate 0x83 0x6 0xa 0x0 0x0 0x0 0x1e 0x0 + launchtemplate gTechnoBlastYellowSparkTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x0 0x28 0x0 + launchtemplate gTechnoBlastYellowSparkTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x40 0x28 0x1 + launchtemplate gTechnoBlastYellowSparkTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x80 0x28 0x0 + launchtemplate gTechnoBlastYellowSparkTemplate 0x84 0x7 0xa 0x0 0x10 0x1e SOUND_PAN_ATTACKER 0x28 0x2 + launchtemplate gTechnoBlastYellowSparkTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0x20 0x28 0x0 + launchtemplate gTechnoBlastYellowSparkTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0x60 0x28 0x1 + launchtemplate gTechnoBlastYellowSparkTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0xa0 0x28 0x0 + launchtemplate gTechnoBlastYellowSparkTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0xe0 0x28 0x2 + waitforvisualfinish + playsewithpan SE_M_EMBER, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0x4 0x0 0x5 0x1 + launchtemplate gTechnoBlastYellowSmokeTemplate 0x82, 0x4, 0x8 0x8 0x1 0x0 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0x5 0x0 0x5 0x0, ANIM_TARGET + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfffb 0xa 0x5 0x1, ANIM_TARGET + delay 0x2 + launchtemplate gTechnoBlastYellowSmokeTemplate 0x82, 0x4, 0xfff8 0xfff8 0x1 0x0 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xf 0x14 0x5 0x2, ANIM_TARGET + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfff1 0xfff6 0x5 0x0, ANIM_TARGET + delay 0x2 + launchtemplate gTechnoBlastYellowSmokeTemplate 0x82, 0x4, 0x8 0xfff8 0x1 0x0 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0x19 0x0 0x5 0x1, ANIM_TARGET + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfff8 0x8 0x5 0x2, ANIM_TARGET + delay 0x2 + launchtemplate gTechnoBlastYellowSmokeTemplate 0x82, 0x4, 0xfff8 0x8 0x1 0x0 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0x2 0xfff8 0x5 0x0, ANIM_TARGET + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xffec 0xf 0x5 0x1, ANIM_TARGET + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 + waitforvisualfinish + blendoff + clearmonbg ANIM_ATTACKER + end +TechnoBlastCharging1: + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x20 0x18 0xbe 0xc 0x0 0x1 0x0 + delay 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x50 0x18 0x16 0xc 0x0 0x1 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x9c 0x18 0x79 0xd 0x0 0x1 0x1 + return +TechnoBlastCharging2: + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x64 0x18 0x3c 0xa 0x0 0x1 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0xaa 0x18 0x2a 0xb 0x0 0x1 0x1 + delay 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0xee 0x18 0xa5 0xa 0x0 0x1 0x1 + return + +TechnoBlastWater: + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge animation + loadspritegfx ANIM_TAG_WATER_ORB @blue color + loadspritegfx ANIM_TAG_BLACK_BALL_2 @blast + loadspritegfx ANIM_TAG_SPARK_2 @blast particles + loadspritegfx ANIM_TAG_GRAY_SMOKE @dispersal + loadspritegfx ANIM_TAG_BUBBLE @bubbles + monbg ANIM_ATTACKER + setblends 0x80E + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x1 + waitforvisualfinish + launchtemplate gTechnoBlastBlueChargeTemplate 0x2 0x1 0x0 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xa 0xa 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xfff1 0x0 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0x14 0xa 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0x0 0xfff6 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xfff6 0xf 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0x19 0x14 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xffec 0x14 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xc 0x0 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xa 0xa 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xfff1 0x0 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0x14 0xa 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0x0 0xfff6 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xfff6 0xf 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0x19 0x14 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xffec 0x14 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xc 0x0 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xa 0xa 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xfff1 0x0 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0x14 0xa 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0x0 0xfff6 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xfff6 0xf 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0x19 0x14 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xffec 0x14 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xc 0x0 0x19 0x0 + waitforvisualfinish + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBlastTemplate 0x83 0x6 0xa 0x0 0x0 0x0 0x1e 0x0 + launchtemplate gTechnoBlastBlueSparkTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x0 0x28 0x0 + launchtemplate gTechnoBlastBlueSparkTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x40 0x28 0x1 + launchtemplate gTechnoBlastBlueSparkTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x80 0x28 0x0 + launchtemplate gTechnoBlastBlueSparkTemplate 0x84 0x7 0xa 0x0 0x10 0x1e SOUND_PAN_ATTACKER 0x28 0x2 + launchtemplate gTechnoBlastBlueSparkTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0x20 0x28 0x0 + launchtemplate gTechnoBlastBlueSparkTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0x60 0x28 0x1 + launchtemplate gTechnoBlastBlueSparkTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0xa0 0x28 0x0 + launchtemplate gTechnoBlastBlueSparkTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0xe0 0x28 0x2 + waitforvisualfinish + playsewithpan SE_M_EMBER, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0x4 0x0 0x5 0x1 + launchtemplate gTechnoBlastBlueSmokeTemplate 0x82, 0x4, 0x8 0x8 0x1 0x0 + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xa 0xa 0x19 0x1 + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xfff1 0x0 0x19 0x1 + delay 0x2 + launchtemplate gTechnoBlastBlueSmokeTemplate 0x82, 0x4, 0xfff8 0xfff8 0x1 0x0 + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0x14 0xa 0x19 0x1 + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0x0 0xfff6 0x19 0x1 + delay 0x2 + launchtemplate gTechnoBlastBlueSmokeTemplate 0x82, 0x4, 0x8 0xfff8 0x1 0x0 + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xfff6 0xf 0x19 0x1 + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0x19 0x14 0x19 0x1 + delay 0x2 + launchtemplate gTechnoBlastBlueSmokeTemplate 0x82, 0x4, 0xfff8 0x8 0x1 0x0 + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xffec 0x14 0x19 0x1 + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xc 0x0 0x19 0x1 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 + waitforvisualfinish + blendoff + clearmonbg ANIM_ATTACKER + end + +TechnoBlastFire: + loadspritegfx ANIM_TAG_JAGGED_MUSIC_NOTE @red color + loadspritegfx ANIM_TAG_SMALL_RED_EYE @another red color + loadspritegfx ANIM_TAG_SMALL_EMBER @fire + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge animation + loadspritegfx ANIM_TAG_BLACK_BALL_2 @blast + loadspritegfx ANIM_TAG_SPARK_2 @blast particles + loadspritegfx ANIM_TAG_GRAY_SMOKE @dispersal + monbg ANIM_ATTACKER + setblends 0x80E + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + launchtemplate gTechnoBlastRedChargeTemplate 0x2 0x1 0x0 + delay 0x5 + call TechnoBlastFireSpiral + call TechnoBlastFireSpiral + call TechnoBlastFireSpiral + waitforvisualfinish + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastRedBlastTemplate 0x83 0x6 0xa 0x0 0x0 0x0 0x1e 0x0 + launchtemplate gTechnoBlastRedSparkTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x0 0x28 0x0 + launchtemplate gTechnoBlastRedSparkTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x40 0x28 0x1 + launchtemplate gTechnoBlastRedSparkTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x80 0x28 0x0 + launchtemplate gTechnoBlastRedSparkTemplate 0x84 0x7 0xa 0x0 0x10 0x1e SOUND_PAN_ATTACKER 0x28 0x2 + launchtemplate gTechnoBlastRedSparkTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0x20 0x28 0x0 + launchtemplate gTechnoBlastRedSparkTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0x60 0x28 0x1 + launchtemplate gTechnoBlastRedSparkTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0xa0 0x28 0x0 + launchtemplate gTechnoBlastRedSparkTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0xe0 0x28 0x2 + waitforvisualfinish + playsewithpan SE_M_EMBER, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0x4 0x0 0x5 0x1 + launchtemplate gTechnoBlastRedSmokeTemplate 0x82, 0x4, 0x8 0x8 0x1 0x0 + launchtemplate gFireSpreadSpriteTemplate 0x81 0x5 0x0 0xa SOUND_PAN_ATTACKER 0xb0 0x28 + launchtemplate gFireSpreadSpriteTemplate 0x81 0x5 0x0 0xa 0xff40 0xf0 0x28 + launchtemplate gFireSpreadSpriteTemplate 0x81 0x5 0x0 0xa SOUND_PAN_ATTACKER 0xff60 0x28 + launchtemplate gFireSpreadSpriteTemplate 0x81 0x5 0x0 0xa 0xff40 0xff90 0x28 + launchtemplate gFireSpreadSpriteTemplate 0x81 0x5 0x0 0xa 0xa0 0x30 0x28 + launchtemplate gFireSpreadSpriteTemplate 0x81 0x5 0x0 0xa 0xff20 0xffe0 0x28 + launchtemplate gFireSpreadSpriteTemplate 0x81 0x5 0x0 0xa 0x70 0xff80 0x28 + delay 0x2 + launchtemplate gTechnoBlastRedSmokeTemplate 0x82, 0x4, 0xfff8 0xfff8 0x1 0x0 + delay 0x2 + launchtemplate gTechnoBlastRedSmokeTemplate 0x82, 0x4, 0x8 0xfff8 0x1 0x0 + delay 0x2 + launchtemplate gTechnoBlastRedSmokeTemplate 0x82, 0x4, 0xfff8 0x8 0x1 0x0 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 + waitforvisualfinish + blendoff + clearmonbg ANIM_ATTACKER + end +TechnoBlastFireSpiral: + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x0 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x4 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x8 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0xc + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x10 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x14 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x18 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 0x2 + return + +TechnoBlastIce: + loadspritegfx ANIM_TAG_ICE_CRYSTALS @ice + loadspritegfx ANIM_TAG_ICE_CHUNK @ice color + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge animation + loadspritegfx ANIM_TAG_BLACK_BALL_2 @blast + loadspritegfx ANIM_TAG_SPARK_2 @blast particles + loadspritegfx ANIM_TAG_GRAY_SMOKE @dispersal + monbg ANIM_ATTACKER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + launchtemplate gTechnoBlastIceChargeTemplate 0x2 0x1 0x0 + delay 0x5 + call TechnoBlastIceChargeParticles + call TechnoBlastIceChargeParticles + call TechnoBlastIceChargeParticles + launchtemplate gTechnoBlastIceCrystalsTemplate 0x2 0x4 0xfff6 0xfff6 0x0 0x2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gTechnoBlastIceCrystalsTemplate 0x2 0x4 0xa 0x14 0x0 0x2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gTechnoBlastIceCrystalsTemplate 0x2 0x4 0xfffb 0xa 0x0 0x2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gTechnoBlastIceCrystalsTemplate 0x2 0x4 0x11 0xfff4 0x0 0x2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + waitforvisualfinish + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastIceBlastTemplate 0x83 0x6 0xa 0x0 0x0 0x0 0x1e 0x0 + launchtemplate gTechnoBlastIceSparkTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x0 0x28 0x0 + launchtemplate gTechnoBlastIceSparkTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x40 0x28 0x1 + launchtemplate gTechnoBlastIceSparkTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x80 0x28 0x0 + launchtemplate gTechnoBlastIceSparkTemplate 0x84 0x7 0xa 0x0 0x10 0x1e SOUND_PAN_ATTACKER 0x28 0x2 + launchtemplate gTechnoBlastIceSparkTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0x20 0x28 0x0 + launchtemplate gTechnoBlastIceSparkTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0x60 0x28 0x1 + launchtemplate gTechnoBlastIceSparkTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0xa0 0x28 0x0 + launchtemplate gTechnoBlastIceSparkTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0xe0 0x28 0x2 + waitforvisualfinish + playsewithpan SE_M_EMBER, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0x4 0x0 0x5 0x1 + launchtemplate gTechnoBlastIceSmokeTemplate 0x82, 0x4, 0x8 0x8 0x1 0x0 + launchtemplate gIceCrystalHitLargeSpriteTemplate 0x82, 0x3, 0xfff6 0xfff6 0x0 + delay 0x2 + launchtemplate gTechnoBlastIceSmokeTemplate 0x82, 0x4, 0xfff8 0xfff8 0x1 0x0 + launchtemplate gIceCrystalHitSmallSpriteTemplate 0x82, 0x3, 0xa 0x14 0x0 + launchtemplate gIceCrystalHitLargeSpriteTemplate 0x82, 0x3, 0xfffb 0xa 0x0 + delay 0x2 + launchtemplate gTechnoBlastIceSmokeTemplate 0x82, 0x4, 0x8 0xfff8 0x1 0x0 + launchtemplate gIceCrystalHitSmallSpriteTemplate 0x82, 0x3, 0x11 0xfff4 0x0 + launchtemplate gIceCrystalHitSmallSpriteTemplate 0x82, 0x3, 0xfff1 0xf 0x0 + delay 0x2 + launchtemplate gTechnoBlastIceSmokeTemplate 0x82, 0x4, 0xfff8 0x8 0x1 0x0 + launchtemplate gIceCrystalHitSmallSpriteTemplate 0x82, 0x3, 0x0 0x0 0x0 + launchtemplate gIceCrystalHitLargeSpriteTemplate 0x82, 0x3, 0x14 0x2 0x0 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + end +TechnoBlastIceChargeParticles: + launchtemplate gTechnoBlastIceCrystalsTemplate 0x2 0x4 0xfff6 0xfff6 0x0 0x2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gTechnoBlastIceCrystalsTemplate 0x2 0x4 0xa 0x14 0x0 0x2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gTechnoBlastIceCrystalsTemplate 0x2 0x4 0xfffb 0xa 0x0 0x2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gTechnoBlastIceCrystalsTemplate 0x2 0x4 0x11 0xfff4 0x0 0x2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gTechnoBlastIceCrystalsTemplate 0x2 0x4 0xfff1 0xf 0x0 0x2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gTechnoBlastIceCrystalsTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gTechnoBlastIceCrystalsTemplate 0x2 0x4 0x14 0x2 0x0 0x2 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x4 + return + + +Move_RELIC_SONG: + loadspritegfx ANIM_TAG_JAGGED_MUSIC_NOTE + loadspritegfx ANIM_TAG_THIN_RING + loadspritegfx ANIM_TAG_MUSIC_NOTES + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_DEF_PARTNER + launchtask AnimTask_MusicNotesRainbowBlend 0x2 0x0 + waitforvisualfinish + panse_1B 0x1DF, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 @ ??? + launchtask AnimTask_UproarDistortion 0x2 0x1 0x0 + launchtemplate gUproarRingSpriteTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1f 0x8 + launchtemplate gJaggedMusicNoteSpriteTemplate 0x2 0x4 0x0 0x1d 0xfff4 0x0 + launchtemplate gJaggedMusicNoteSpriteTemplate 0x2 0x4 0x0 0xfff4 0xffe3 0x1 + launchtemplate gWavyMusicNotesSpriteTemplate 0x82, 0x3, 0x7 0x0 0xc + delay 0x5 + launchtemplate gWavyMusicNotesSpriteTemplate 0x82, 0x3, 0x6 0x1 0xc + delay 0x5 + launchtask AnimTask_UproarDistortion 0x2 0x1 0x0 + launchtemplate gUproarRingSpriteTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1f 0x8 + launchtemplate gJaggedMusicNoteSpriteTemplate 0x2 0x4 0x0 0xc 0xffe3 0x1 + launchtemplate gJaggedMusicNoteSpriteTemplate 0x2 0x4 0x0 0xffe3 0xfff4 0x0 + launchtemplate gWavyMusicNotesSpriteTemplate 0x82, 0x3, 0x1 0x2 0xc + delay 0x5 + launchtemplate gWavyMusicNotesSpriteTemplate 0x82, 0x3, 0x2 0x3 0xc + delay 0x5 + launchtask AnimTask_UproarDistortion 0x2 0x1 0x0 + launchtemplate gUproarRingSpriteTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1f 0x8 + launchtemplate gJaggedMusicNoteSpriteTemplate 0x2 0x4 0x0 0x18 0xffe8 0x1 + launchtemplate gJaggedMusicNoteSpriteTemplate 0x2 0x4 0x0 0xffe8 0xffe8 0x0 + launchtemplate gWavyMusicNotesSpriteTemplate 0x82, 0x3, 0x3 0x0 0xc + delay 0x5 + launchtemplate gWavyMusicNotesSpriteTemplate 0x82, 0x3, 0x2 0x1 0xc + delay 0x5 + launchtask AnimTask_UproarDistortion 0x2 0x1 0x0 + launchtemplate gUproarRingSpriteTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1f 0x8 + launchtemplate gJaggedMusicNoteSpriteTemplate 0x2 0x4 0x0 0x1d 0xfff4 0x0 + launchtemplate gJaggedMusicNoteSpriteTemplate 0x2 0x4 0x0 0xfff4 0xffe3 0x1 + launchtemplate gWavyMusicNotesSpriteTemplate 0x82, 0x3, 0x5 0x2 0xc + delay 0x5 + launchtemplate gWavyMusicNotesSpriteTemplate 0x82, 0x3, 0x6 0x3 0xc + delay 0x5 + launchtask AnimTask_UproarDistortion 0x2 0x1 0x0 + launchtemplate gUproarRingSpriteTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1f 0x8 + launchtemplate gJaggedMusicNoteSpriteTemplate 0x2 0x4 0x0 0xc 0xffe3 0x1 + launchtemplate gJaggedMusicNoteSpriteTemplate 0x2 0x4 0x0 0xffe3 0xfff4 0x0 + launchtemplate gWavyMusicNotesSpriteTemplate 0x82, 0x3, 0x2 0x0 0xc + delay 0x5 + launchtemplate gWavyMusicNotesSpriteTemplate 0x82, 0x3, 0x2 0x1 0xc + delay 0x5 + launchtask AnimTask_UproarDistortion 0x2 0x1 0x0 + launchtemplate gUproarRingSpriteTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1f 0x8 + launchtemplate gJaggedMusicNoteSpriteTemplate 0x2 0x4 0x0 0x18 0xffe8 0x1 + launchtemplate gJaggedMusicNoteSpriteTemplate 0x2 0x4 0x0 0xffe8 0xffe8 0x0 + launchtemplate gWavyMusicNotesSpriteTemplate 0x82, 0x3, 0x1 0x2 0xc + delay 0x5 + launchtemplate gWavyMusicNotesSpriteTemplate 0x82, 0x3, 0x5 0x3 0xc + delay 0x5 + launchtask AnimTask_UproarDistortion 0x2 0x1 0x0 + launchtemplate gUproarRingSpriteTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1f 0x8 + launchtemplate gJaggedMusicNoteSpriteTemplate 0x2 0x4 0x0 0x1d 0xfff4 0x0 + launchtemplate gJaggedMusicNoteSpriteTemplate 0x2 0x4 0x0 0xfff4 0xffe3 0x1 + waitforvisualfinish + launchtemplate gBasicHitSplatSpriteTemplate 0x83 0x4 0xffe0 0xfff0 0x1 0x3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMonInPlace 0x2 0x5 0x1 0x3 0x0 0xc 0x1 + launchtask AnimTask_ShakeMonInPlace 0x2 0x5 0x3 0x3 0x0 0xc 0x1 + delay 0x5 + launchtemplate gRandomPosHitSplatSpriteTemplate 0x83 0x2 0x1 0x3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 0x5 + launchtemplate gRandomPosHitSplatSpriteTemplate 0x83 0x2 0x1 0x3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 0x5 + launchtemplate gBasicHitSplatSpriteTemplate 0x83 0x4 0x20 0x14 0x1 0x3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + launchtask AnimTask_MusicNotesClearRainbowBlend 0x2 0x0 + waitforvisualfinish + end + + +Move_SECRET_SWORD: + loadspritegfx ANIM_TAG_CUT @Cut + loadspritegfx ANIM_TAG_SWORD @Sword + loadspritegfx ANIM_TAG_HYDRO_PUMP @Blue Colour + loadspritegfx ANIM_TAG_PUNISHMENT_BLADES @Punishment Blade + monbg ANIM_ATTACKER + setalpha 12, 8 + playsewithpan SE_M_SWORDS_DANCE, SOUND_PAN_ATTACKER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x0 0x0 0x10 0x0 + launchtemplate gSwordsDanceBladeSpriteTemplate 0x2 0x2 0x0 0x0 + delay 0x16 + launchtask AnimTask_FlashAnimTagWithColor 0x2 0x7 0x2715 0x2 0x2 0x7ff2 0x10 0x0 0x0 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + delay 0x1 + monbg ANIM_TARGET + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + launchtemplate gSecretSwordBladesTemplate 0x81 0x5 0x0 0xa 0x0 0xFF00 0xA + launchtemplate gCuttingSliceSpriteTemplate 0x2 0x3 0x28 0xffe0 0x0 + delay 0x5 + launchtask AnimTask_ShakeMon 0x2 0x5 0x1 0x0 0x3 0xa 0x1 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x0 0x10 0x0 0x0 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + waitforvisualfinish + end + + +Move_GLACIATE: + loadspritegfx ANIM_TAG_ICE_CRYSTALS @ice + loadspritegfx ANIM_TAG_BLACK_SMOKE @smoke + loadspritegfx ANIM_TAG_ICE_CHUNK @White Colour + monbg ANIM_DEF_PARTNER + setalpha 12, 8 + fadetobg BG_ICE + waitbgfadeout + playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_TARGET + launchtemplate gGlaciateSmokeTemplate 0x84 0x5 0x0 0xfff4 0x68 0x0 0x4b + launchtemplate gGlaciateSmokeTemplate 0x84 0x5 0x0 0xfff4 0x48 0x1 0x4b + launchtemplate gGlaciateSmokeTemplate 0x84 0x5 0x0 0xfffa 0x38 0x1 0x4b + launchtemplate gGlaciateSmokeTemplate 0x84 0x5 0x0 0xfffa 0x58 0x0 0x4b + launchtemplate gGlaciateSmokeTemplate 0x84 0x5 0x0 0x0 0x38 0x0 0x4b + launchtemplate gGlaciateSmokeTemplate 0x84 0x5 0x0 0x0 0x58 0x1 0x4b + launchtemplate gGlaciateSmokeTemplate 0x84 0x5 0x0 0x6 0x48 0x0 0x4b + launchtemplate gGlaciateSmokeTemplate 0x84 0x5 0x0 0x6 0x68 0x1 0x4b + launchtemplate gGlaciateSmokeTemplate 0x84 0x5 0x0 0xc 0x48 0x0 0x4b + launchtemplate gGlaciateSmokeTemplate 0x84 0x5 0x0 0xc 0x38 0x1 0x4b + launchtemplate gGlaciateSmokeTemplate 0x84 0x5 0x0 0x12 0x50 0x0 0x4b + launchtemplate gGlaciateSmokeTemplate 0x84 0x5 0x0 0x12 0x48 0x1 0x4b + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal, 10, (ANIM_PAL_DEF | ANIM_PAL_DEF_PARTNER), 0x2, 0x0, 0xA, 0x7FFF + call IceCrystalEffectLong + createvisualtask AnimTask_BlendBattleAnimPal, 10, (ANIM_PAL_DEF | ANIM_PAL_DEF_PARTNER), 0x2, 0xA, 0x0, 0x7FFF + waitforvisualfinish + blendoff + clearmonbg ANIM_DEF_PARTNER + call UnsetPsychicBg + end + + +Move_BOLT_STRIKE:: + loadspritegfx ANIM_TAG_SPARK_2 @Electricity + loadspritegfx ANIM_TAG_IMPACT @Hit + loadspritegfx ANIM_TAG_ELECTRIC_ORBS @Electric Balls + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @Electric Circle + monbg ANIM_ATTACKER + setalpha 12, 8 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x10 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x2 0x0 0x9 0x07FE + launchtask AnimTask_ElectricChargingParticles 0x2 0x4 0x0 0x40 0x0 0x2 + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + delay 0xc + launchtemplate gGrowingShockWaveOrbSpriteTemplate 0x2 0x0 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER + waitplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 0x8 + launchtask AnimTask_TranslateMonEllipticalRespectSide 0x2 0x5 0x0 0x12 0x6 0x2 0x4 + delay 0xA + fadetobg BG_BOLT_STRIKE + waitbgfadeout + waitforvisualfinish + monbg ANIM_TARGET + launchtemplate gSlideMonToOffsetSpriteTemplate 0x2 0x5 ANIM_ATTACKER 0x1a 0x0 0x0 0x5 + delay 0x6 + launchtemplate gBasicHitSplatSpriteTemplate 0x4 0x4 0xfff6 0x0 0x1 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0x0 0x9 0x07FE + launchtask AnimTask_ShakeMon2 0x2 0x5 ANIM_TARGET 0x2 0x0 0x20 0x1 + playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET + call ElectricityEffect + launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_ATTACKER 0x0 0x5 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x2 0x9 0x0 0x07FE + playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET + call ElectricityEffect + waitforvisualfinish + clearmonbg ANIM_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0x9 0x0 0x07FE + call UnsetPsychicBg + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x0 0x0 + blendoff + waitforvisualfinish + end + + +Move_BLUE_FLARE:: + loadspritegfx ANIM_TAG_SMALL_EMBER @Fire + loadspritegfx ANIM_TAG_METAL_BITS @Blue Flare Colour + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x0 0x0 0x10 0x0 + loopsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER, 0x7, 0x9 + launchtemplate gBlueFlareFlameJabTemplate 0x82 0x5 0x1 0x0 0x0 0xffe0 0x10 + delay 0x2 + launchtemplate gBlueFlareFlameJabTemplate 0x82 0x5 0x1 0x0 0x16 0xffea 0x10 + delay 0x2 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 0x4 0x1 0x0 0x9 0x1F + launchtemplate gBlueFlareFlameJabTemplate 0x82 0x5 0x1 0x0 0x1e 0x0 0x10 + delay 0x2 + launchtemplate gBlueFlareFlameJabTemplate 0x82 0x5 0x1 0x0 0x14 0x14 0x10 + delay 0x2 + launchtemplate gBlueFlareFlameJabTemplate 0x82 0x5 0x1 0x0 0x0 0x1c 0x10 + delay 0x2 + launchtemplate gBlueFlareFlameJabTemplate 0x82 0x5 0x1 0x0 0xffed 0x13 0x10 + delay 0x2 + launchtemplate gBlueFlareFlameJabTemplate 0x82 0x5 0x1 0x0 0xffe5 0x0 0x10 + delay 0x2 + launchtemplate gBlueFlareFlameJabTemplate 0x82 0x5 0x1 0x0 0xffee 0xffee 0x10 + delay 0x2 + launchtemplate gBlueFlareFlameJabTemplate 0x82 0x5 0x1 0x0 0x0 0xffe7 0x10 + delay 0x2 + launchtemplate gBlueFlareFlameJabTemplate 0x82 0x5 0x1 0x0 0x11 0xffef 0x10 + delay 0x2 + launchtemplate gBlueFlareFlameJabTemplate 0x82 0x5 0x1 0x0 0x17 0x0 0x10 + delay 0x2 + launchtemplate gBlueFlareFlameJabTemplate 0x82 0x5 0x1 0x0 0x10 0x10 0x10 + waitforvisualfinish + playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET + call BlueFlareFireSpin + call BlueFlareFireSpin + call BlueFlareFireSpin + fadetobg BG_FIRE_2 + waitbgfadeout + launchtask AnimTask_StartSlidingBg 0x5 0x4 0x1000 0x0 0x0 0xFFFF + waitbgfadein + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + call BlueFlareFlameSpreadEffect + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x0 0x0 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 0x4 0x1 0x9 0x0 0x1f + call UnsetPsychicBg + waitforvisualfinish + end +BlueFlareFireSpin: + launchtemplate gBlueFlareFlameSwirlTemplate 0x82 0x7 0x0 0x1c 0x210 0x1e 0xd 0x32 0x1 + delay 0x2 + launchtemplate gBlueFlareFlameSwirlTemplate 0x82 0x7 0x0 0x20 0x1e0 0x14 0x10 0xffd2 0x1 + delay 0x2 + launchtemplate gBlueFlareFlameSwirlTemplate 0x82 0x7 0x0 0x21 0x240 0x14 0x8 0x2a 0x1 + delay 0x2 + launchtemplate gBlueFlareFlameSwirlTemplate 0x82 0x7 0x0 0x1f 0x190 0x19 0xb 0xffd6 0x1 + delay 0x2 + launchtemplate gBlueFlareFlameSwirlTemplate 0x82 0x7 0x0 0x1c 0x200 0x19 0x10 0x2e 0x1 + delay 0x2 + launchtemplate gBlueFlareFlameSwirlTemplate 0x82 0x7 0x0 0x21 0x1d0 0x1e 0xf 0xffce 0x1 + delay 0x2 + return +BlueFlareFlameSpreadEffect: + launchtemplate gBlueFlareBurnTemplate 0x81 0x5 0x0 0xa 0x0 0xb0 0x28 + launchtemplate gBlueFlareBurnTemplate 0x81 0x5 0x0 0xa 0xff40 0xf0 0x28 + launchtemplate gBlueFlareBurnTemplate 0x81 0x5 0x0 0xa 0x0 0xff60 0x28 + launchtemplate gBlueFlareBurnTemplate 0x81 0x5 0x0 0xa 0xff40 0xff90 0x28 + launchtemplate gBlueFlareBurnTemplate 0x81 0x5 0x0 0xa 0xa0 0x30 0x28 + launchtemplate gBlueFlareBurnTemplate 0x81 0x5 0x0 0xa 0xff20 0xffe0 0x28 + launchtemplate gBlueFlareBurnTemplate 0x81 0x5 0x0 0xa 0x70 0xff80 0x28 + return + + +Move_FIERY_DANCE:: + loadspritegfx ANIM_TAG_SMALL_EMBER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xc 0x14be + waitforvisualfinish + playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_TARGET 0x0 0x2 0x40 0x1 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x1 0x0 0x9 0x1f + call FireSpinEffect + call FireSpinEffect + call FireSpinEffect + playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET + call FireSpinEffect + call FireSpinEffect + call FireSpinEffect + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x1 0x9 0x0 0x1f + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xc 0x0 0x14be + waitforvisualfinish + end + + +Move_FREEZE_SHOCK:: + loadspritegfx ANIM_TAG_SPARK + loadspritegfx ANIM_TAG_SPARK_2 + loadspritegfx ANIM_TAG_ICE_CHUNK @Ice Ball + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @Electric Circle + choosetwoturnanim FreezeShockCharge FreezeShockAttack +FreezeShockCharge: + launchtask AnimTask_HorizontalShake 0x5 0x3 0x0 0x2 0x10 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x1 0x0 0xf 0x7fff + launchtemplate gFreezeShockCircleTemplate 0x2 0x0 @electric circle + delay 0x14 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x1 0xf 0x0 0x7fff + waitforvisualfinish + end +FreezeShockAttack: + loopsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET, 0x5, 0x5 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x10 0x0 + monbg ANIM_TARGET + waitforvisualfinish + playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_ATTACKER + launchtemplate gFreezeShockIceBallTemplate 0x83 0x6 0xa 0x0 0x0 0x0 0x1e 0x0 + launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x0 0x28 0x0 + launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x40 0x28 0x1 + launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x80 0x28 0x0 + launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x0 0x28 0x2 + launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0x20 0x28 0x0 + launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0x60 0x28 0x1 + launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0xa0 0x28 0x0 + launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0xe0 0x28 0x2 + waitforvisualfinish + launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0x4 0x0 0x5 0x1 + delay 0xf + waitplaysewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET, 0x13 + call ElectricityEffect + waitforvisualfinish + clearmonbg ANIM_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x10 0x0 0x0 + waitforvisualfinish + end + + +Move_ICE_BURN:: + loadspritegfx ANIM_TAG_BLACK_SMOKE @smoke + loadspritegfx ANIM_TAG_ICE_CHUNK @white color + loadspritegfx ANIM_TAG_ICE_CRYSTALS @ice + loadspritegfx ANIM_TAG_SMALL_EMBER + choosetwoturnanim IceBurnCharge, IceBurnUnleash + waitforvisualfinish + end +IceBurnCharge: + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + loopsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET, 0x4, 0x3 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x1 0x8 0x0 0x0 + launchtask AnimTask_HorizontalShake 0x5 0x3 0x0 0x2 0x10 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x1 0x0 0xf 0x7fff + delay 0x14 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x1 0xf 0x0 0x7fff + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 + waitforvisualfinish + end +IceBurnUnleash: + monbg ANIM_TARGET + fadetobg BG_ICE + waitbgfadeout + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0x0 0x9 0x7fff + launchtemplate gIceCrystalHitLargeSpriteTemplate 0x82, 0x3, 0xfff6 0xfff6 0x0 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + launchtemplate gIceBurnSmokeTemplate 0x84 0x5 0x0 0xfff4 0x68 0x0 0x4b + launchtemplate gIceBurnSmokeTemplate 0x84 0x5 0x0 0xfff4 0x48 0x1 0x4b + launchtemplate gIceBurnSmokeTemplate 0x84 0x5 0x0 0xfffa 0x38 0x1 0x4b + launchtemplate gIceBurnSmokeTemplate 0x84 0x5 0x0 0xfffa 0x58 0x0 0x4b + launchtemplate gIceBurnSmokeTemplate 0x84 0x5 0x0 0x0 0x38 0x0 0x4b + launchtemplate gIceBurnSmokeTemplate 0x84 0x5 0x0 0x0 0x58 0x1 0x4b + launchtemplate gIceBurnSmokeTemplate 0x84 0x5 0x0 0x6 0x48 0x0 0x4b + launchtemplate gIceBurnSmokeTemplate 0x84 0x5 0x0 0x6 0x68 0x1 0x4b + launchtemplate gIceBurnSmokeTemplate 0x84 0x5 0x0 0xc 0x48 0x0 0x4b + launchtemplate gIceBurnSmokeTemplate 0x84 0x5 0x0 0xc 0x38 0x1 0x4b + launchtemplate gIceBurnSmokeTemplate 0x84 0x5 0x0 0x12 0x50 0x0 0x4b + launchtemplate gIceBurnSmokeTemplate 0x84 0x5 0x0 0x12 0x48 0x1 0x4b + call FireSpreadEffect + playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gIceCrystalHitSmallSpriteTemplate 0x82, 0x3, 0xa 0x14 0x0 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gIceCrystalHitLargeSpriteTemplate 0x82, 0x3, 0xfffb 0xa 0x0 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gIceCrystalHitSmallSpriteTemplate 0x82, 0x3, 0x11 0xfff4 0x0 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gIceCrystalHitSmallSpriteTemplate 0x82, 0x3, 0xfff1 0xf 0x0 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gIceCrystalHitSmallSpriteTemplate 0x82, 0x3, 0x0 0x0 0x0 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gIceCrystalHitLargeSpriteTemplate 0x82, 0x3, 0x14 0x2 0x0 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0x9 0x0 0x7fff + waitforvisualfinish + restorebg + clearmonbg ANIM_TARGET + end + + +Move_SNARL:: + loadspritegfx ANIM_TAG_JAGGED_MUSIC_NOTE + loadspritegfx ANIM_TAG_THIN_RING + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_DEF_PARTNER + fadetobg BG_DARK + waitbgfadeout + launchtask AnimTask_UproarDistortion 0x2 0x1 0x0 + launchtemplate gUproarRingSpriteTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1f 0x8 + playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER + launchtemplate gJaggedMusicNoteSpriteTemplate 0x2 0x4 0x0 0x1d 0xfff4 0x0 + launchtemplate gJaggedMusicNoteSpriteTemplate 0x2 0x4 0x0 0xfff4 0xffe3 0x1 + delay 0x10 + launchtask AnimTask_UproarDistortion 0x2 0x1 0x0 + launchtemplate gUproarRingSpriteTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1f 0x8 + playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER + launchtemplate gJaggedMusicNoteSpriteTemplate 0x2 0x4 0x0 0xc 0xffe3 0x1 + launchtemplate gJaggedMusicNoteSpriteTemplate 0x2 0x4 0x0 0xffe3 0xfff4 0x0 + delay 0x10 + launchtask AnimTask_UproarDistortion 0x2 0x1 0x0 + launchtemplate gUproarRingSpriteTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1f 0x8 + playsewithpan SE_M_UPROAR, SOUND_PAN_ATTACKER + launchtemplate gJaggedMusicNoteSpriteTemplate 0x2 0x4 0x0 0x18 0xffe8 0x1 + launchtemplate gJaggedMusicNoteSpriteTemplate 0x2 0x4 0x0 0xffe8 0xffe8 0x0 + waitforvisualfinish + launchtemplate gBasicHitSplatSpriteTemplate 0x83 0x4 0xffe0 0xfff0 0x1 0x3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMonInPlace 0x2 0x5 0x1 0x3 0x0 0xc 0x1 + launchtask AnimTask_ShakeMonInPlace 0x2 0x5 0x3 0x3 0x0 0xc 0x1 + delay 0x4 + launchtemplate gRandomPosHitSplatSpriteTemplate 0x83 0x2 0x1 0x3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gRandomPosHitSplatSpriteTemplate 0x83 0x2 0x1 0x3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gBasicHitSplatSpriteTemplate 0x83 0x4 0x20 0x14 0x1 0x3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + waitforvisualfinish + call UnsetPsychicBg + clearmonbg ANIM_DEF_PARTNER + blendoff + end + + +Move_ICICLE_CRASH:: + loadspritegfx ANIM_TAG_ICICLE_SPEAR @Icicle + fadetobg BG_ICE + waitbgfadein + monbg ANIM_DEF_PARTNER + launchtemplate gIcicleCrashSpearTemplate 0x82, 0x4, 0xfffb 0x0 0xfffb 0x0 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gIcicleCrashSpearTemplate 0x82, 0x4, 0x5 0x0 0x6 0x1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gIcicleCrashSpearTemplate 0x82, 0x4, 0x13 0x0 0xa 0x01 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gIcicleCrashSpearTemplate 0x82, 0x4, 0xffe9 0x0 0xfff6 0x1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0 0x5 0x32 0x1 + delay 0x2 + call LaunchIcicleCrashSpear + call LaunchIcicleCrashSpear + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + restorebg + waitbgfadeout + end +LaunchIcicleCrashSpear: + launchtemplate gIcicleCrashSpearTemplate 0x82, 0x4, 0xffec 0x0 0xfff6 0x0 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gIcicleCrashSpearTemplate 0x82, 0x4, 0x1c 0x0 0xa 0x0 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gIcicleCrashSpearTemplate 0x82, 0x4, 0xfff6 0x0 0xfffb 0x0 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gIcicleCrashSpearTemplate 0x82, 0x4, 0xa 0x0 0x6 0x0 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gIcicleCrashSpearTemplate 0x82, 0x4, 0x18 0x0 0xa 0x0 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gIcicleCrashSpearTemplate 0x82, 0x4, 0xffe0 0x0 0xfff6 0x0 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gIcicleCrashSpearTemplate 0x82, 0x4, 0xffec 0x0 0xfff6 0x0 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gIcicleCrashSpearTemplate 0x82, 0x4, 0x1e 0x0 0xa 0x0 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x2 + return + + +Move_V_CREATE:: + loadspritegfx ANIM_TAG_SMALL_EMBER @fire blast flame + loadspritegfx ANIM_TAG_THIN_RING @calm mind animation + loadspritegfx ANIM_TAG_JAGGED_MUSIC_NOTE @red color + loadspritegfx ANIM_TAG_ECLIPSING_ORB @defense curl animation + monbg ANIM_ATK_PARTNER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 @Darken + launchtemplate gVCreateRedOrbTemplate 0x2 0x4 0x0 0x11 0x0 0x1 + playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gVCreateRedRingTemplate 0x28 0x4 0x0 0x0 0x0 0x0 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x2 0x0 0x9 0x1f + playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET + call VCreateFlames + call VCreateFlames + call VCreateFlames + call VCreateFlames + call VCreateFlames + call VCreateFlames + call VCreateFlames + call VCreateFlames + call VCreateFlames + call VCreateFlames + waitforvisualfinish + unloadspritegfx ANIM_TAG_SMALL_EMBER + unloadspritegfx ANIM_TAG_THIN_RING + unloadspritegfx ANIM_TAG_JAGGED_MUSIC_NOTE + unloadspritegfx ANIM_TAG_ECLIPSING_ORB + loadspritegfx ANIM_TAG_EXPLOSION @explosion animation + loadspritegfx ANIM_TAG_CLAW_SLASH @dragon claw animation + clearmonbg ANIM_ATK_PARTNER + fadetobg BG_FIRE @Mr. DS Fire + waitbgfadeout + launchtask AnimTask_StartSlidingBg 0x5 0x4 0xA00 0x0 0x1 0xffff + waitbgfadein + playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER + launchtask AnimTask_WindUpLunge 0x5 0x7 0x0 0xffe8 0x8 0x17 0xa 0x28 0xa + delay 0x23 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0 0x5 0x32 0x1 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0x0 0x9 0x1f + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + launchtemplate gExplosionSpriteTemplate 0x3 0x4 0x0 0x0 0x1 0x1 + delay 0x6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + launchtemplate gExplosionSpriteTemplate 0x3 0x4 0x18 0xffe8 0x1 0x1 + delay 0x6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + launchtemplate gExplosionSpriteTemplate 0x3 0x4 0xfff0 0x10 0x1 0x1 + delay 0x6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + launchtemplate gExplosionSpriteTemplate 0x3 0x4 0xffe8 0xfff4 0x1 0x1 + delay 0x6 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + launchtemplate gExplosionSpriteTemplate 0x3 0x4 0x10 0x10 0x1 0x1 + waitforvisualfinish + launchtemplate gHorizontalLungeSpriteTemplate 0x2 0x2 0x4 0x4 + launchtemplate gClawSlashSpriteTemplate 0x82, 0x3, 0xfff6 0xfff6 0x0 + launchtemplate gClawSlashSpriteTemplate 0x82, 0x3, 0xa 0xfff6 0x1 + waitforvisualfinish + launchtask AnimTask_ShakeMonInPlace 0x2 0x5 0x1 0x4 0x0 0xc 0x1 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x2 0x9 0x0 0x1f + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0x9 0x0 0x1f + delay 0x2 + launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_ATTACKER 0x0 0x5 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + call UnsetPsychicBg + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x0 0xffff + waitforvisualfinish + end +VCreateFlames: + launchtemplate gVCreateFlameTemplate 0x82 0x5 0x0 0x1 0x16 0xFFEA 0x10 @upperright + launchtemplate gVCreateFlameTemplate 0x82 0x5 0x0 0x1 0xFFEE 0xFFEE 0x10 @upperleft + delay 0x3 + return + + + +Move_FUSION_FLARE:: + loadspritegfx ANIM_TAG_FOCUS_ENERGY @focus energy + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @ball + loadspritegfx ANIM_TAG_VERTICAL_HEX @ball palette + loadspritegfx ANIM_TAG_JAGGED_MUSIC_NOTE @flame palette + loadspritegfx ANIM_TAG_SMALL_BUBBLES @particles + loadspritegfx ANIM_TAG_THIN_RING @ring + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SMALL_BUBBLES, 0x0, 0xD, 0xD, 0x015B @Reddish Orange + monbg ANIM_TARGET + setalpha 12, 8 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER + call FusionFlareBuff + delay 0x8 + launchtask AnimTask_BlendColorCycle 0x2 0x6 ANIM_PAL_ATK 0x2 0x2 0x0 0xb 0x1F + launchtask AnimTask_ShakeMon2 0x2 0x5 0x0 0x1 0x0 0x20 0x1 + launchtemplate gVerticalDipSpriteTemplate 0x2 0x3 0x8 0x1 0x0 + delay 0x8 + playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER + launchtemplate gFusionFlareRedBallUpTemplate 0x2 0x0 + delay 0x20 + launchtemplate gFusionFlareRedBallTemplate 0x3 0x3 0x0 0xffA0 0x2F + launchtemplate gFusionFlareRedBubblesTemplate 0x42 0x7 0x64 0x64 0x8 0x1 0x14 0x28 0x0 + launchtemplate gFusionFlareRedBubblesTemplate 0x42 0x7 0x14 0x64 0x10 0x2 0xa 0x23 0x1 + launchtemplate gFusionFlareRedBubblesTemplate 0x42 0x7 0xc8 0x50 0x8 0x1 0x28 0x14 0x0 + launchtemplate gFusionFlareRedBubblesTemplate 0x42 0x7 0x50 0x3c 0xa 0x3 0x14 0x32 0x0 + launchtemplate gFusionFlareRedBubblesTemplate 0x42 0x7 0x8c 0x64 0x10 0x1 0x14 0x1e 0x1 + delay 0x29 + launchtask AnimTask_BlendColorCycle 0x2 0x6 ANIM_PAL_DEF 0x2 0x2 0x0 0xb 0x1F + delay 0x5 + launchtemplate gFusionFlareRedRingTemplate 0x3 0x6 0x1 0x1 0x1 0x1 0x1F 0x8 + launchtemplate gFusionFlareRedBubblesTemplate 0x42 0x7 0x64 0x64 0x8 0x1 0x14 0x28 0x0 + launchtemplate gFusionFlareRedBubblesTemplate 0x42 0x7 0x14 0x64 0x10 0x2 0xa 0x23 0x1 + launchtemplate gFusionFlareRedBubblesTemplate 0x42 0x7 0xc8 0x50 0x8 0x1 0x28 0x14 0x0 + launchtemplate gFusionFlareRedBubblesTemplate 0x42 0x7 0x50 0x3c 0xa 0x3 0x14 0x32 0x0 + launchtemplate gFusionFlareRedBubblesTemplate 0x42 0x7 0x8c 0x64 0x10 0x1 0x14 0x1e 0x1 + launchtask AnimTask_HorizontalShake 0x5 0x3 0x1 0x2 0x10 + delay 0x5 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end +FusionFlareBuff: + launchtemplate gEndureEnergySpriteTemplate 0x2 0x4 0x0 0xffe8 0x1a 0x2 + delay 0x4 + launchtemplate gEndureEnergySpriteTemplate 0x2 0x4 0x0 0xe 0x1c 0x1 + delay 0x4 + launchtemplate gEndureEnergySpriteTemplate 0x2 0x4 0x0 0xfffb 0xa 0x2 + delay 0x4 + launchtemplate gEndureEnergySpriteTemplate 0x2 0x4 0x0 0x1c 0x1a 0x3 + delay 0x4 + launchtemplate gEndureEnergySpriteTemplate 0x2 0x4 0x0 0xfff4 0x0 0x1 + return + + +Move_FUSION_BOLT:: + loadspritegfx ANIM_TAG_SPARK + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT + loadspritegfx ANIM_TAG_ELECTRICITY + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK, 0x0, 0xC, 0xC, 0x7960 @Blue Electricity + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0x0, 0xC, 0xC, 0x7960 @Blue Electricity + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRICITY, 0x0, 0xC, 0xC, 0x7960 @Blue Electricity + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 0x0, 0x0, 0xE, 0x0 + waitforvisualfinish + launchtemplate gVoltTackleOrbSlideSpriteTemplate 0x1 0x0 + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + invisible ANIM_ATTACKER + waitforvisualfinish + delay 0x8 + launchtask AnimTask_VoltTackleBolt 0x5 0x1 0x0 + playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_ATTACKER + waitforvisualfinish + launchtask AnimTask_VoltTackleBolt 0x5 0x1 0x1 + playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_TARGET + waitforvisualfinish + launchtask AnimTask_VoltTackleBolt 0x5 0x1 0x2 + playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_ATTACKER + waitforvisualfinish + launchtask AnimTask_VoltTackleBolt 0x5 0x1 0x3 + playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_TARGET + waitforvisualfinish + launchtemplate gFusionBoltBallTemplate 0x82 0x1 0x10 + playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_ATTACKER + delay 0x8 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0xa 0x0 0x12 0x1 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + launchtemplate gElectricPuffSpriteTemplate 0x2 0x3 0x1 0x10 0x10 + delay 0x2 + launchtemplate gElectricPuffSpriteTemplate 0x2 0x3 0x1 0xfff0 0xfff0 + delay 0x8 + launchtask AnimTask_VoltTackleAttackerReappear 0x5 0x0 + waitforvisualfinish + launchtask AnimTask_ShakeMon2 0x2 0x5 0x0 0x3 0x0 0x9 0x1 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + launchtemplate gElectricPuffSpriteTemplate 0x2 0x3 0x0 0x10 0x10 + delay 0x2 + launchtemplate gElectricPuffSpriteTemplate 0x2 0x3 0x0 0xfff0 0xfff0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x0 0xE 0x0 0x0 + waitforvisualfinish + end + + +@@@@@@@@@@@@@@@@@@@@@@@ GEN 6 @@@@@@@@@@@@@@@@@@@@@@@ +Move_FLYING_PRESS:: + loadspritegfx ANIM_TAG_ROUND_SHADOW @fly/bounce + loadspritegfx ANIM_TAG_GRAY_SMOKE @smoke + setblends 0xF + playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER + launchtemplate gFlyBallUpSpriteTemplate 0x2 0x4 0x0 0x0 0xd 0x150 + waitforvisualfinish + delay 0xF + playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET + launchtemplate gBounceBallLandSpriteTemplate 0x83 0x0 + delay 0x2 + launchtask AnimTask_SquishTarget 0x2 0x0 + delay 0x5 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + launchtemplate gOctazookaSmokeSpriteTemplate 0x80 0x4 0x8 0x8 0x1 0x0 + delay 0x2 + launchtemplate gOctazookaSmokeSpriteTemplate 0x80 0x4 0xfff8 0xfff8 0x1 0x0 + delay 0x2 + launchtemplate gOctazookaSmokeSpriteTemplate 0x80 0x4 0x8 0xfff8 0x1 0x0 + delay 0x2 + launchtemplate gOctazookaSmokeSpriteTemplate 0x80 0x4 0xfff8 0x8 0x1 0x0 + delay 0x2 + launchtemplate gOctazookaSmokeSpriteTemplate 0x80 0x4 0x8 0x8 0x1 0x0 + delay 0x2 + launchtemplate gOctazookaSmokeSpriteTemplate 0x80 0x4 0xfff8 0xfff8 0x1 0x0 + delay 0x2 + launchtemplate gOctazookaSmokeSpriteTemplate 0x80 0x4 0x8 0xfff8 0x1 0x0 + delay 0x2 + launchtemplate gOctazookaSmokeSpriteTemplate 0x80 0x4 0xfff8 0x8 0x1 0x0 + waitforvisualfinish + blendoff + end + + +Move_MAT_BLOCK:: + loadspritegfx ANIM_TAG_CONVERSION + loadspritegfx ANIM_TAG_GREEN_LIGHT_WALL @green color + monbg ANIM_ATK_PARTNER + monbgprio_28 ANIM_ATTACKER + setblends 0x10 + delay 0x0 + playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER + launchtemplate gMatBlockGreenConversionTemplate 0x2 0x2 0xfff8 0x18 + launchtemplate gMatBlockGreenConversionTemplate 0x2 0x2 0x8 0x18 + delay 0x3 + playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER + launchtemplate gMatBlockGreenConversionTemplate 0x2 0x2 0xfff8 0x8 + launchtemplate gMatBlockGreenConversionTemplate 0x2 0x2 0x8 0x8 + delay 0x3 + playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER + launchtemplate gMatBlockGreenConversionTemplate 0x2 0x2 0xfff8 0xfff8 + launchtemplate gMatBlockGreenConversionTemplate 0x2 0x2 0x8 0xfff8 + delay 0x3 + playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER + launchtemplate gMatBlockGreenConversionTemplate 0x2 0x2 0xfff8 0xffe8 + launchtemplate gMatBlockGreenConversionTemplate 0x2 0x2 0x8 0xffe8 + delay 0x14 + launchtask AnimTask_ConversionAlphaBlend 0x5 0x0 + waitforvisualfinish + delay 0x1 + clearmonbg ANIM_ATK_PARTNER + blendoff + end + + +Move_BELCH:: + loadspritegfx ANIM_TAG_BERRY_NORMAL + loadspritegfx ANIM_TAG_EXPLOSION @Explosion + monbg ANIM_TARGET + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_SUCCESS, SOUND_PAN_ATTACKER + launchtemplate gBelchBerryTemplate 0x2 0x6 0x14 0xfff8 0xfff8 0xfff8 0x14 0xffe0 + delay 0x13 + launchtask AnimTask_ShakeMonInPlace 0x2 0x5 0x1 0xa 0x0 0x14 0x1 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + launchtemplate gExplosionSpriteTemplate 0x3 0x4 0x0 0x0 0x1 0x1 + delay 0x6 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + launchtemplate gExplosionSpriteTemplate 0x3 0x4 0x18 0xffe8 0x1 0x1 + delay 0x6 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + launchtemplate gExplosionSpriteTemplate 0x3 0x4 0xfff0 0x10 0x1 0x1 + delay 0x6 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + launchtemplate gExplosionSpriteTemplate 0x3 0x4 0xffe8 0xfff4 0x1 0x1 + delay 0x6 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + launchtemplate gExplosionSpriteTemplate 0x3 0x4 0x10 0x10 0x1 0x1 + delay 0x6 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + launchtemplate gExplosionSpriteTemplate 0x3 0x4 0xffe8 0x18 0x1 0x1 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end + + +Move_ROTOTILLER:: + loadspritegfx ANIM_TAG_MUD_SAND + loadspritegfx ANIM_TAG_DIRT_MOUND + loadspritegfx ANIM_TAG_GREEN_SPARKLE + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x10 0x112C + waitforvisualfinish + launchtemplate gDirtMoundSpriteTemplate 0x1 0x3 0x0 0x0 0xb4 + launchtemplate gDirtMoundSpriteTemplate 0x1 0x3 0x0 0x1 0xb4 + launchtask AnimTask_TranslateMonEllipticalRespectSide 0x2 0x5 0x0 0x6 0x4 0x2 0x4 + call DigThrowDirt + call DigThrowDirt + launchtask AnimTask_TranslateMonEllipticalRespectSide 0x2 0x5 0x0 0x6 0x4 0x2 0x4 + call DigThrowDirt + call DigThrowDirt + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x10 0x0 0x112C + waitforvisualfinish + end + + +Move_STICKY_WEB: + loadspritegfx ANIM_TAG_SPIDER_WEB + loadspritegfx ANIM_TAG_WEB_THREAD + monbg ANIM_DEF_PARTNER + delay 0 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, 1, 2, 0, 9, RGB_BLACK + waitforvisualfinish + monbgprio_28 ANIM_TARGET + loopsewithpan SE_M_STRING_SHOT, SOUND_PAN_ATTACKER, 9, 6 + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + waitforvisualfinish + playsewithpan SE_M_STRING_SHOT2, SOUND_PAN_TARGET + createsprite gSpiderWebSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, TRUE + delay 50 + playsewithpan SE_M_STRING_SHOT2, SOUND_PAN_TARGET + createsprite gSpiderWebSpriteTemplate, ANIM_ATTACKER, 2, -30, 30, TRUE + delay 50 + playsewithpan SE_M_STRING_SHOT2, SOUND_PAN_TARGET + createsprite gSpiderWebSpriteTemplate, ANIM_ATTACKER, 2, 30, -30, TRUE + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + delay 1 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, 1, 2, 9, 0, RGB_BLACK + end + +Move_FELL_STINGER: + loadspritegfx ANIM_TAG_NEEDLE + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_TARGET + monbgprio_28 ANIM_TARGET + fadetobg BG_DARK + waitbgfadein + delay 0 + playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER + createsprite gLinearStingerSpriteTemplate, ANIM_TARGET, 2, 20, 0, -8, 0, 20 + waitforvisualfinish + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 5, 1 + playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET + waitforvisualfinish + delay 1 + restorebg + waitbgfadein + clearmonbg ANIM_TARGET + end + +Move_PHANTOM_FORCE: + choosetwoturnanim PhantomForceSetUp, PhantomForceUnleash +PhantomForceEnd: + end +PhantomForceSetUp: + invisible ANIM_ATTACKER + goto PhantomForceEnd +PhantomForceUnleash: + visible ANIM_ATTACKER + goto PhantomForceEnd + +Move_TRICK_OR_TREAT: + end + +Move_NOBLE_ROAR: + loadspritegfx ANIM_TAG_NOISE_LINE + monbg ANIM_ATTACKER + monbgprio_28 0 + setalpha 8, 8 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 0, 8, RGB(4, 0, 0) + waitforvisualfinish + createvisualtask SoundTask_PlayCryHighPitch, 2, ANIM_ATTACKER, 2 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -5, -5, 10, ANIM_ATTACKER, 1 + call RoarEffect + delay 10 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 9, 1 + delay 10 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 8, 0, RGB(4, 0, 0) + waitforvisualfinish + clearmonbg ANIM_ATTACKER + blendoff + waitforvisualfinish + delay 20 + end + +Move_ION_DELUGE: + end + +Move_PARABOLIC_CHARGE: + loadspritegfx ANIM_TAG_ELECTRIC_ORBS + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT + loadspritegfx ANIM_TAG_SPARK + loadspritegfx ANIM_TAG_LIGHTNING + loadspritegfx ANIM_TAG_ORBS + loadspritegfx ANIM_TAG_BLUE_STAR + monbg ANIM_ATTACKER + setalpha 12, 8 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 0, 6, RGB(18, 16, 3) + waitforvisualfinish + createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 3, 20, 20 + playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER + delay 12 + createsprite gGrowingShockWaveOrbSpriteTemplate, ANIM_ATTACKER, 2 + delay 30 + jumpifdoublebattle ParabolicChargeDouble + createvisualtask AnimTask_ShockWaveProgressingBolt, 5, ANIM_TARGET + delay 12 + waitforvisualfinish + createvisualtask AnimTask_ShockWaveLightning, 5, ANIM_TARGET + playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET + waitforvisualfinish + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 6, 18, 1 + createvisualtask AnimTask_BlendBattleAnimPal, 5, 4, 0, 16, 16, RGB_BLACK + delay 4 + createvisualtask AnimTask_BlendBattleAnimPal, 5, 4, 0, 0, 0, RGB_BLACK +ParabolicChargeHeal: + waitforvisualfinish + clearmonbg ANIM_ATTACKER + waitforvisualfinish + call HealingEffect + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 6, 0, RGB(18, 16, 3) + waitforvisualfinish + blendoff + end +ParabolicChargeDouble: + createvisualtask AnimTask_ShockWaveProgressingBolt, 5, ANIM_TARGET + createvisualtask AnimTask_ShockWaveProgressingBolt, 5, ANIM_DEF_PARTNER + createvisualtask AnimTask_ShockWaveProgressingBolt, 5, ANIM_ATK_PARTNER + delay 12 + waitforvisualfinish + createvisualtask AnimTask_ShockWaveLightning, 5, ANIM_TARGET + createvisualtask AnimTask_ShockWaveLightning, 5, ANIM_DEF_PARTNER + createvisualtask AnimTask_ShockWaveLightning, 5, ANIM_ATK_PARTNER + playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET + waitforvisualfinish + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 6, 18, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 0, 6, 18, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_ATK_PARTNER, 0, 6, 18, 1 + createvisualtask AnimTask_BlendBattleAnimPal, 5, 4 | 8 | 0x10, 0, 16, 16, RGB_BLACK + delay 4 + createvisualtask AnimTask_BlendBattleAnimPal, 5, 4 | 8 | 0x10, 0, 0, 0, RGB_BLACK + goto ParabolicChargeHeal; + +Move_FORESTS_CURSE: + loadspritegfx ANIM_TAG_ROOTS @frenzy plant + loadspritegfx ANIM_TAG_GHOSTLY_SPIRIT @curse + monbg ANIM_ATTACKER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x10 0x0 + waitforvisualfinish + playsewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0x0 0x8 0x02E3 + launchtemplate gForestsCurseIngrainTemplate 0x42 0x7 0x64 0x64 0x8 0x1 0x14 0x28 0x0 + launchtemplate gForestsCurseIngrainTemplate 0x42 0x7 0x14 0x64 0x10 0x2 0xa 0x23 0x1 + launchtemplate gForestsCurseIngrainTemplate 0x42 0x7 0xc8 0x50 0x8 0x1 0x28 0x14 0x0 + launchtemplate gForestsCurseIngrainTemplate 0x42 0x7 0x50 0x3c 0xa 0x3 0x14 0x32 0x0 + launchtemplate gForestsCurseIngrainTemplate 0x42 0x7 0x8c 0x64 0x10 0x1 0x14 0x1e 0x1 + waitforvisualfinish + playsewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER + launchtemplate gForestsCurseIngrainTemplate 0x42 0x7 0x64 0x64 0x8 0x1 0x14 0x28 0x0 + launchtemplate gForestsCurseIngrainTemplate 0x42 0x7 0x14 0x64 0x10 0x2 0xa 0x23 0x1 + launchtemplate gForestsCurseIngrainTemplate 0x42 0x7 0xc8 0x50 0x8 0x1 0x28 0x14 0x0 + launchtemplate gForestsCurseIngrainTemplate 0x42 0x7 0x50 0x3c 0xa 0x3 0x14 0x32 0x0 + launchtemplate gForestsCurseIngrainTemplate 0x42 0x7 0x8c 0x64 0x10 0x1 0x14 0x1e 0x1 + waitforvisualfinish + playsewithpan SE_M_SCRATCH, SOUND_PAN_ATTACKER + launchtemplate gForestsCurseIngrainTemplate 0x42 0x7 0x64 0x64 0x8 0x1 0x14 0x28 0x0 + launchtemplate gForestsCurseIngrainTemplate 0x42 0x7 0x14 0x64 0x10 0x2 0xa 0x23 0x1 + launchtemplate gForestsCurseIngrainTemplate 0x42 0x7 0xc8 0x50 0x8 0x1 0x28 0x14 0x0 + launchtemplate gForestsCurseIngrainTemplate 0x42 0x7 0x50 0x3c 0xa 0x3 0x14 0x32 0x0 + launchtemplate gForestsCurseIngrainTemplate 0x42 0x7 0x8c 0x64 0x10 0x1 0x14 0x1e 0x1 + waitforvisualfinish + launchtemplate gCurseGhostSpriteTemplate 0x82 0x0 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0x2 0x0 0xe 0x1 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0x8 0x0 0x02E3 + delay 0x3 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x10 0x0 0x0 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + end + + +Move_PETAL_BLIZZARD:: + loadspritegfx ANIM_TAG_LEAF + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_FLOWER + monbg 0x3 + monbgprio_28 0x1 + playsewithpan SE_M_TWISTER, SOUND_PAN_TARGET + createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 120, 70, 5, 70, 30 + delay 0x1 + createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 0x73, 0x37, 0x6, 0x3c, 0x19 + delay 0x1 + createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 0x73, 0x3c, 0x7, 0x3c, 0x1e + launchtemplate gPetalBlizzardTwister1Template 0x82 0x5 0x73 0x37 0xA 0x3c 0x1e + delay 0x3 + launchtemplate gPetalBlizzardTwister1Template 0x82 0x5 0x64 0x32 0x4 0x32 0x1A + delay 0x1 + launchtemplate gPetalBlizzardTwister1Template 0x82 0x5 0x69 0x19 0x8 0x3c 0x14 + delay 0x1 + launchtemplate gPetalBlizzardTwister1Template 0x82 0x5 0x73 0x28 0xA 0x30 0x1E + delay 0x3 + launchtemplate gPetalBlizzardTwister1Template 0x82 0x5 0x78 0x1E 0x6 0x2d 0x19 + createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 0x73, 0x23, 0xA, 0x3c, 0x1e + delay 0x3 + launchtemplate gPetalBlizzardTwister2Template 0x82 0x5 0x69 0x14 0x8 0x28 0x0 + delay 0x3 + createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 0x14, 0xff, 0xf, 0x20, 0x0 + createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 0x6e, 0xA, 0x8, 0x20, 0x14 + waitforvisualfinish + launchtemplate gBasicHitSplatSpriteTemplate 0x83 0x4 0xffe0 0xfff0 0x1 0x3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMonInPlace 0x2 0x5 ANIM_TARGET 0x3 0x0 0xC 0x1 + launchtask AnimTask_ShakeMonInPlace 0x2 0x5 ANIM_DEF_PARTNER 0x3 0x0 0xC 0x1 + launchtask AnimTask_ShakeMonInPlace 0x2 0x5 ANIM_ATK_PARTNER 0x3 0x0 0xC 0x1 + delay 0x4 + launchtemplate gRandomPosHitSplatSpriteTemplate 0x83 0x2 0x1 0x3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gRandomPosHitSplatSpriteTemplate 0x83 0x2 0x1 0x3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gBasicHitSplatSpriteTemplate 0x83 0x4 0x20 0x14 0x1 0x3 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg 0x3 + blendoff + end + + +Move_FREEZE_DRY:: + monbg ANIM_DEF_PARTNER + setalpha 12, 8 + loadspritegfx ANIM_TAG_ICE_CRYSTALS + loadspritegfx ANIM_TAG_IMPACT + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 0, 7, RGB_BLACK + createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 0, 9, RGB(12, 26, 31) + delay 20 + playsewithpan SE_M_STRING_SHOT, SOUND_PAN_TARGET + createsprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 0 + createsprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 64 + createsprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 128 + createsprite gIceCrystalSpiralInwardSmall, ANIM_ATTACKER, 2, 192 + delay 5 + createsprite gIceCrystalSpiralInwardLarge, ANIM_ATTACKER, 2, 32 + createsprite gIceCrystalSpiralInwardLarge, ANIM_ATTACKER, 2, 96 + createsprite gIceCrystalSpiralInwardLarge, ANIM_ATTACKER, 2, 160 + createsprite gIceCrystalSpiralInwardLarge, ANIM_ATTACKER, 2, 224 + delay 17 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 3, 1 + waitforvisualfinish + delay 15 + call IceCrystalEffectShort + delay 5 + loadspritegfx ANIM_TAG_ICE_CUBE + createvisualtask AnimTask_FrozenIceCube, 2 + waitplaysewithpan SE_M_HAIL, SOUND_PAN_TARGET, 17 + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 9, 0, RGB(12, 26, 31) + waitforvisualfinish + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7, 0, RGB_BLACK + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + end + + +Move_DISARMING_VOICE:: + loadspritegfx ANIM_TAG_NOISE_LINE + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x8 0x6e7d + waitforvisualfinish + launchtask SoundTask_PlayDoubleCry 0x2 0x2 0x0 0xff + call RoarEffect + delay 0xA + launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0x1 0x0 0x1A 0x1 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x3 0x1 0x0 0x1A 0x1 + waitforvisualfinish + launchtask SoundTask_WaitForCry 0x5 0x0 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x8 0x0 0x6e7d + waitforvisualfinish + end + + +Move_PARTING_SHOT: + loadspritegfx ANIM_TAG_NOISE_LINE + fadetobg BG_DARK + waitbgfadein + delay 0 + createvisualtask SoundTask_PlayDoubleCry, 2, 0, 255 + call RoarEffect + delay 10 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 9, 1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 9, 1 + waitforvisualfinish + createvisualtask SoundTask_WaitForCry, 5 + waitforvisualfinish + delay 1 + restorebg + waitbgfadein + end + +Move_TOPSY_TURVY: + loadspritegfx ANIM_TAG_SWEAT_DROP + setalpha 12, 8 + createsprite gSimplePaletteBlendSpriteTemplate ANIM_TARGET, 2, 1, 2, 0, 4, RGB_BLACK + waitforvisualfinish + createvisualtask AnimTask_RotateVertically, 2, ANIM_TARGET, 768 + createsprite gSimplePaletteBlendSpriteTemplate ANIM_TARGET, 2, 4, 5, 0, 8, RGB(9, 0, 16) + playsewithpan SE_ROTATING_GATE, SOUND_PAN_TARGET + delay 116 + createsprite gSimplePaletteBlendSpriteTemplate ANIM_TARGET, 2, 4, 5, 8, 0, RGB(9, 0, 16) + playsewithpan SE_FALL, SOUND_PAN_TARGET + waitforvisualfinish + createsprite gSimplePaletteBlendSpriteTemplate ANIM_TARGET, 2, 1, 2, 4, 0, RGB_BLACK + waitforvisualfinish + blendoff + end + +Move_DRAINING_KISS: + loadspritegfx ANIM_TAG_ORBS + loadspritegfx ANIM_TAG_BLUE_STAR + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_RED_HEART + loopsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER, 12, 3 + createvisualtask AnimTask_SwayMon, 5, 0, 12, 4096, 4, ANIM_ATTACKER + delay 15 + createsprite gRedHeartProjectileSpriteTemplate, ANIM_TARGET, 3, 20, -8 + waitforvisualfinish + playsewithpan SE_M_ATTRACT, SOUND_PAN_TARGET + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 160, -32 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -256, -40 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 128, -16 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, 416, -38 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -128, -22 + createsprite gRedHeartBurstSpriteTemplate, ANIM_TARGET, 3, -384, -31 + waitforvisualfinish + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 + delay 5 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 5, 1 + waitforvisualfinish + delay 3 + call AbsorbEffect + waitforvisualfinish + delay 15 + call HealingEffect + waitforvisualfinish + end + +Move_CRAFTY_SHIELD:: + loadspritegfx ANIM_TAG_CRAFTY_SHIELD + monbg ANIM_ATK_PARTNER + monbgprio_28 ANIM_ATTACKER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x5 0x4DBF + setblends 0x10 + delay 0x0 + playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER + launchtemplate gCraftyShieldPinkConversionTemplate 0x2 0x2 0xffe8 0xffe8 + delay 0x3 + launchtemplate gCraftyShieldPinkConversionTemplate 0x2 0x2 0xfff8 0xffe8 + delay 0x3 + launchtemplate gCraftyShieldPinkConversionTemplate 0x2 0x2 0x8 0xffe8 + delay 0x3 + launchtemplate gCraftyShieldPinkConversionTemplate 0x2 0x2 0x18 0xffe8 + delay 0x3 + playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER + launchtemplate gCraftyShieldPinkConversionTemplate 0x2 0x2 0xffe8 0xfff8 + delay 0x3 + launchtemplate gCraftyShieldPinkConversionTemplate 0x2 0x2 0xfff8 0xfff8 + delay 0x3 + launchtemplate gCraftyShieldPinkConversionTemplate 0x2 0x2 0x8 0xfff8 + delay 0x3 + launchtemplate gCraftyShieldPinkConversionTemplate 0x2 0x2 0x18 0xfff8 + delay 0x3 + playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER + launchtemplate gCraftyShieldPinkConversionTemplate 0x2 0x2 0xffe8 0x8 + delay 0x3 + launchtemplate gCraftyShieldPinkConversionTemplate 0x2 0x2 0xfff8 0x8 + delay 0x3 + launchtemplate gCraftyShieldPinkConversionTemplate 0x2 0x2 0x8 0x8 + delay 0x3 + launchtemplate gCraftyShieldPinkConversionTemplate 0x2 0x2 0x18 0x8 + delay 0x3 + playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER + launchtemplate gCraftyShieldPinkConversionTemplate 0x2 0x2 0xffe8 0x18 + delay 0x3 + launchtemplate gCraftyShieldPinkConversionTemplate 0x2 0x2 0xfff8 0x18 + delay 0x3 + launchtemplate gCraftyShieldPinkConversionTemplate 0x2 0x2 0x8 0x18 + delay 0x3 + launchtemplate gCraftyShieldPinkConversionTemplate 0x2 0x2 0x18 0x18 + delay 0x14 + playsewithpan SE_M_BARRIER, SOUND_PAN_ATTACKER + launchtask AnimTask_FlashAnimTagWithColor 0x2 0x7 0x2722 0x1 0x1 0x37ff 0xc 0x0 0x0 + delay 0x6 + launchtask AnimTask_ConversionAlphaBlend 0x5 0x0 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x5 0x0 0x4DBF + waitforvisualfinish + delay 0x1 + clearmonbg ANIM_ATK_PARTNER + blendoff + end + + +Move_FLOWER_SHIELD:: + loadspritegfx ANIM_TAG_FLOWER + loadspritegfx ANIM_TAG_IMPACT + setalpha 12, 8 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x8 0x6e7d + waitforvisualfinish + playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER + launchtemplate gPetalDanceBigFlowerSpriteTemplate 0x2 0x4 0x0 0xffe8 0x8 0x8c + launchtemplate gPetalDanceSmallFlowerSpriteTemplate 0x2 0x4 0x10 0xffe8 0x8 0x64 + launchtemplate gPetalDanceSmallFlowerSpriteTemplate 0x2 0x4 0xfff0 0xffe8 0x8 0x64 + delay 0xf + launchtemplate gPetalDanceBigFlowerSpriteTemplate 0x2 0x4 0x0 0xffe8 0x8 0x8c + launchtemplate gPetalDanceSmallFlowerSpriteTemplate 0x2 0x4 0x20 0xffe8 0x8 0x64 + launchtemplate gPetalDanceSmallFlowerSpriteTemplate 0x2 0x4 0xffe0 0xffe8 0x8 0x64 + delay 0xf + launchtemplate gPetalDanceBigFlowerSpriteTemplate 0x2 0x4 0x0 0xffe8 0x8 0x8c + launchtemplate gPetalDanceSmallFlowerSpriteTemplate 0x2 0x4 0x18 0xffe8 0x8 0x64 + launchtemplate gPetalDanceSmallFlowerSpriteTemplate 0x2 0x4 0xffe8 0xffe8 0x8 0x64 + delay 0x1e + launchtemplate gPetalDanceSmallFlowerSpriteTemplate 0x2 0x4 0x10 0xffe8 0x0 0x64 + launchtemplate gPetalDanceSmallFlowerSpriteTemplate 0x2 0x4 0xfff0 0xffe8 0x0 0x64 + delay 0x1e + launchtemplate gPetalDanceSmallFlowerSpriteTemplate 0x2 0x4 0x14 0xfff0 0xe 0x50 + launchtemplate gPetalDanceSmallFlowerSpriteTemplate 0x2 0x4 0xffec 0xfff2 0x10 0x50 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x8 0x0 0x6e7d + waitforvisualfinish + blendoff + end + + +Move_GRASSY_TERRAIN:: + loadspritegfx ANIM_TAG_ORBS @Recover Ball + loadspritegfx ANIM_TAG_GREEN_SPARKLE @Green Star + playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER + createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0 + waitforvisualfinish + delay 30 + createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB(11, 26, 11), 12, 5, 1 + delay 4 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + createsprite gGrassyTerrainOrbsTemplate, ANIM_ATTACKER, 2, 26, 0 + createsprite gGrassyTerrainOrbsTemplate, ANIM_ATTACKER, 2, 26, 42 + createsprite gGrassyTerrainOrbsTemplate, ANIM_ATTACKER, 2, 26, 84 + createsprite gGrassyTerrainOrbsTemplate, ANIM_ATTACKER, 2, 26, 126 + createsprite gGrassyTerrainOrbsTemplate, ANIM_ATTACKER, 2, 26, 168 + createsprite gGrassyTerrainOrbsTemplate, ANIM_ATTACKER, 2, 26, 210 + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 3, 0, 4, RGB(11, 26, 11) + delay 52 + setarg 7, 0xFFFF + playsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER + createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0 + createsprite gGrassyTerrainStarTemplate, ANIM_TARGET, 2, 0 + createsprite gGrassyTerrainStarTemplate, ANIM_TARGET, 2, 32 + createsprite gGrassyTerrainStarTemplate, ANIM_TARGET, 2, 64 + createsprite gGrassyTerrainStarTemplate, ANIM_TARGET, 2, 96 + createsprite gGrassyTerrainStarTemplate, ANIM_TARGET, 2, 128 + createsprite gGrassyTerrainStarTemplate, ANIM_TARGET, 2, 160 + createsprite gGrassyTerrainStarTemplate, ANIM_TARGET, 2, 192 + createsprite gGrassyTerrainStarTemplate, ANIM_TARGET, 2, 224 + panse_26 SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +1, 0x0 + waitforvisualfinish + delay 4 + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 3, 4, 0, RGB(31, 24, 31) + waitforvisualfinish + end + +Move_MISTY_TERRAIN:: + loadspritegfx ANIM_TAG_ORBS @Recover Ball + loadspritegfx ANIM_TAG_WATER_GUN @Light Blue Colour + loadspritegfx ANIM_TAG_GREEN_SPARKLE + playsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER + createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0 + waitforvisualfinish + delay 30 + createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB(31, 24, 31), 12, 5, 1 + delay 4 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + createsprite gMistyTerrainOrbsTemplate, ANIM_ATTACKER, 2, 26, 0 + createsprite gMistyTerrainOrbsTemplate, ANIM_ATTACKER, 2, 26, 42 + createsprite gMistyTerrainOrbsTemplate, ANIM_ATTACKER, 2, 26, 84 + createsprite gMistyTerrainOrbsTemplate, ANIM_ATTACKER, 2, 26, 126 + createsprite gMistyTerrainOrbsTemplate, ANIM_ATTACKER, 2, 26, 168 + createsprite gMistyTerrainOrbsTemplate, ANIM_ATTACKER, 2, 26, 210 + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 3, 0, 7, RGB(31, 24, 31) + delay 52 + setarg 7, 0xFFFF + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0 + createsprite gMistyTerrainStarTemplate, ANIM_TARGET, 2, 0 + createsprite gMistyTerrainStarTemplate, ANIM_TARGET, 2, 32 + createsprite gMistyTerrainStarTemplate, ANIM_TARGET, 2, 64 + playse SE_M_COSMIC_POWER + createsprite gMistyTerrainStarTemplate, ANIM_TARGET, 2, 96 + createsprite gMistyTerrainStarTemplate, ANIM_TARGET, 2, 128 + createsprite gMistyTerrainStarTemplate, ANIM_TARGET, 2, 160 + createsprite gMistyTerrainStarTemplate, ANIM_TARGET, 2, 192 + createsprite gMistyTerrainStarTemplate, ANIM_TARGET, 2, 224 + waitforvisualfinish + delay 4 + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 3, 7, 0, RGB(31, 24, 31) + waitforvisualfinish + end + + +Move_ELECTRIFY:: + loadspritegfx ANIM_TAG_GUARD_RING @ring around user + loadspritegfx ANIM_TAG_SPARK_2 @yellow color + loadspritegfx ANIM_TAG_SMALL_EMBER @yellow color + loadspritegfx ANIM_TAG_SPARK @electric travel + loadspritegfx ANIM_TAG_THIN_RING @ring + monbg ANIM_ATTACKER + loopsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET 0xa 0x4 + launchtemplate gElectrifyRingTemplate 0x2 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x20 0x18 0xbe 0xc 0x0 0x1 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x50 0x18 0x16 0xc 0x0 0x1 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x9c 0x18 0x79 0xd 0x0 0x1 0x1 + delay 0x4 + launchtemplate gElectrifyRingTemplate 0x2 0x0 + delay 0x4 + launchtemplate gElectrifyRingTemplate 0x2 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x64 0x18 0x3c 0xa 0x0 0x1 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0xaa 0x18 0x2a 0xb 0x0 0x1 0x1 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0xee 0x18 0xa5 0xa 0x0 0x1 0x1 + waitforvisualfinish + playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_ATTACKER + launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x0 0x28 0x0 + launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x40 0x28 0x1 + launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x80 0x28 0x0 + launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0 0x28 0x2 + launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0x20 0x28 0x0 + launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0x60 0x28 0x1 + launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0xa0 0x28 0x0 + launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0xe0 0x28 0x2 + delay 0xA + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 ANIM_PAL_DEF 0x2 0x0 0xB 0x039B + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x3 0x039B + delay 0x4 + clearmonbg ANIM_ATTACKER + delay 0x1 + monbg ANIM_DEF_PARTNER + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET + launchtemplate gElectrifyYellowRingTemplate 0x3 0x6 0x0 0x0 0x1 0x0 0x1f 0x8 + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_TARGET 0x4 0x0 0x6 0x1 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0x5 0x0 0x5 0x0, ANIM_TARGET + delay 0x1 + launchtemplate gElectrifyYellowRingTemplate 0x3 0x6 0x0 0x0 0x1 0x0 0x1f 0x8 + delay 0x1 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfffb 0xa 0x5 0x1, ANIM_TARGET + launchtemplate gElectrifyYellowRingTemplate 0x3 0x6 0x0 0x0 0x1 0x0 0x1f 0x8 + delay 0x1 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xf 0x14 0x5 0x2, ANIM_TARGET + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfff1 0xfff6 0x5 0x0, ANIM_TARGET + delay 0x2 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0x19 0x0 0x5 0x1, ANIM_TARGET + delay 0x2 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfff8 0x8 0x5 0x2, ANIM_TARGET + delay 0x2 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0x2 0xfff8 0x5 0x0, ANIM_TARGET + delay 0x2 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xffec 0xf 0x5 0x1, ANIM_TARGET + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 ANIM_PAL_DEF 0x2 0xB 0x0 0x039B + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x3 0x0 0x039B + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + end + + +Move_PLAY_ROUGH:: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_PINK_HEART + loadspritegfx ANIM_TAG_DUCK + monbg 0x3 + setalpha 12, 8 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + waitplaysewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET, 0xa + waitplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER, 0x14 + waitplaysewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET, 0x1e + waitplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER, 0x28 + waitplaysewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET, 0x32 + waitplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER, 0x3c + waitplaysewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET, 0x46 + waitplaysewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER, 0x50 + waitplaysewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET, 0x5a + launchtask AnimTask_TranslateMonElliptical 0x2 0x5 0x0 0xffee 0x6 0x6 0x4 + launchtask AnimTask_TranslateMonElliptical 0x2 0x5 0x1 0x12 0x6 0x6 0x4 + launchtemplate gPinkHeartSpriteTemplate 0x83 0x2 0xff00 0xffd6 + launchtemplate gPinkHeartSpriteTemplate 0x83 0x2 0x80 0xfff2 + launchtemplate gPinkHeartSpriteTemplate 0x83 0x2 0x1a0 0xffda + launchtemplate gPinkHeartSpriteTemplate 0x83 0x2 0xff80 0xffea + delay 0x0 + call SubmissionHit + playsewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET + launchtemplate gDizzyPunchDuckSpriteTemplate 0x83 0x4 0x10 0x8 0xa0 0xffe0 + launchtemplate gDizzyPunchDuckSpriteTemplate 0x83 0x4 0x10 0x8 0xff00 0xffd8 + launchtemplate gDizzyPunchDuckSpriteTemplate 0x83 0x4 0x10 0x8 0x80 0xfff0 + launchtemplate gDizzyPunchDuckSpriteTemplate 0x83 0x4 0x10 0x8 0x1a0 0xffda + launchtemplate gDizzyPunchDuckSpriteTemplate 0x83 0x4 0x10 0x8 0xff80 0xffea + launchtemplate gDizzyPunchDuckSpriteTemplate 0x83 0x4 0x10 0x8 0xfe80 0xffe1 + delay 0x0 + call SubmissionHit + playsewithpan SE_M_DIVE, SOUND_PAN_TARGET + launchtemplate gPinkHeartSpriteTemplate 0x83 0x2 0xff00 0xffd6 + launchtemplate gPinkHeartSpriteTemplate 0x83 0x2 0x80 0xfff2 + launchtemplate gPinkHeartSpriteTemplate 0x83 0x2 0x1a0 0xffda + launchtemplate gPinkHeartSpriteTemplate 0x83 0x2 0xff80 0xffea + delay 0x0 + playsewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET + launchtemplate gDizzyPunchDuckSpriteTemplate 0x83 0x4 0x10 0x8 0xa0 0xffe0 + launchtemplate gDizzyPunchDuckSpriteTemplate 0x83 0x4 0x10 0x8 0xff00 0xffd8 + launchtemplate gDizzyPunchDuckSpriteTemplate 0x83 0x4 0x10 0x8 0x80 0xfff0 + launchtemplate gDizzyPunchDuckSpriteTemplate 0x83 0x4 0x10 0x8 0x1a0 0xffda + launchtemplate gDizzyPunchDuckSpriteTemplate 0x83 0x4 0x10 0x8 0xff80 0xffea + launchtemplate gDizzyPunchDuckSpriteTemplate 0x83 0x4 0x10 0x8 0xfe80 0xffe1 + delay 0x0 + call SubmissionHit + waitforvisualfinish + delay 0xD + stopsound + clearmonbg 0x3 + blendoff + waitforvisualfinish + end + + +Move_FAIRY_WIND:: + loadspritegfx ANIM_TAG_PINK_CLOUD + monbg ANIM_DEF_PARTNER + setalpha 12, 8 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x8 0x6e7d + waitforvisualfinish + playsewithpan SE_M_GUST, SOUND_PAN_TARGET + launchtemplate gFairyWindCloudTemplate 0x83 0x7 0x14 0xfff6 0x14 0x0 0x16 0x14 0x1 + delay 0x5 + launchtemplate gFairyWindCloudTemplate 0x83 0x7 0x14 0xfff6 0x14 0x5 0x16 0xffee 0x1 + delay 0x5 + launchtemplate gFairyWindCloudTemplate 0x83 0x7 0x14 0xfff6 0x14 0xfff6 0x16 0xf 0x1 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0x2 0x0 0x12 0x1 + delay 0x5 + launchtemplate gFairyWindCloudTemplate 0x83 0x7 0x14 0xfff6 0x14 0x0 0x16 0xffec 0x1 + delay 0x5 + launchtemplate gFairyWindCloudTemplate 0x83 0x7 0x14 0xfff6 0x14 0x0 0x16 0xc 0x1 + delay 0x5 + waitforvisualfinish + stopsound + playsewithpan SE_M_GUST2, SOUND_PAN_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x8 0x0 0x6e7d + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + end + + +Move_MOONBLAST: + loadspritegfx ANIM_TAG_SMALL_BUBBLES + loadspritegfx ANIM_TAG_MOON + loadspritegfx ANIM_TAG_GREEN_SPARKLE + loadspritegfx ANIM_TAG_BLUE_STAR + setalpha 0, 16 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 0, 16, 0 + waitforvisualfinish + createsprite gMoonSpriteTemplate, ANIM_ATTACKER, 2, 120, 56 + createvisualtask AnimTask_AlphaFadeIn, 3, 0, 16, 16, 0, 1 + panse_1B SE_M_BARRIER, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 3, 0 + delay 40 + playsewithpan SE_M_STRING_SHOT, SOUND_PAN_ATTACKER + createsprite gMistBallSpriteTemplate, ANIM_ATTACKER, 5, 0, 0, 0, 0, 30, 0 + delay 30 + loopsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET, 5, 4 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 10, 0 + delay 4 + createvisualtask AnimTask_MoonlightEndFade, 2 + waitforvisualfinish + blendoff + end + +Move_BOOMBURST: + loadspritegfx ANIM_TAG_EXPLOSION + loadspritegfx ANIM_TAG_THIN_RING + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x4 | 0x8 | 0x10 + createvisualtask SoundTask_PlayCryWithEcho, 5 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -5, -5, 5, ANIM_ATTACKER, 0 + createsprite gHyperVoiceRingSpriteTemplate, ANIM_ATTACKER, 0, 45, 0, 0, 0, 0, 0, 1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 6, 1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_DEF_PARTNER, 1, 0, 6, 1 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATK_PARTNER, 1, 0, 6, 1 + createvisualtask SoundTask_WaitForCry, 2, 1, 0, 6, 1 + delay 20 + jumpifdoublebattle Boomburst_Doubles + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 1 + delay 4 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 24, -24, 1, 1 + delay 4 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -16, 16, 1, 1 + delay 4 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -24, -12, 1, 1 + delay 4 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 16, 16, 1, 1 +Boomburst_Last: + delay 4 + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x4 | 0x8 | 0x10 + waitforvisualfinish + end +Boomburst_Doubles: + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 1 + createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 2, 1 + delay 4 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 24, -24, 1, 1 + delay 4 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -16, 16, 1, 1 + delay 4 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -24, -12, 1, 1 + createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -24, -12, 2, 1 + delay 4 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 16, 16, 1, 1 + goto Boomburst_Last + +Move_FAIRY_LOCK:: + loadspritegfx ANIM_TAG_CHAIN_LINK @Chain Colour + loadspritegfx ANIM_TAG_FAIRY_LOCK_CHAINS @Fairy Lock Chain + setalpha 8, 8 + monbg ANIM_ATK_PARTNER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x8 0x6B1F + waitforvisualfinish + loopsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET, 0x6, 0x4 + launchtask AnimTask_VoltTackleBolt 0x5 0x1 0x7 + launchtask AnimTask_VoltTackleBolt 0x5 0x1 0x33 + launchtask AnimTask_VoltTackleBolt 0x5 0x1 0x2 + waitforvisualfinish + launchtask AnimTask_VoltTackleBolt 0x5 0x1 0x32 + launchtask AnimTask_VoltTackleBolt 0x5 0x1 0x6 + launchtask AnimTask_VoltTackleBolt 0x5 0x1 0x35 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x8 0x0 0x6B1F + waitforvisualfinish + clearmonbg ANIM_ATK_PARTNER + blendoff + end + + +Move_KINGS_SHIELD:: + loadspritegfx ANIM_TAG_PROTECT @protect + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PROTECT, 0x0, 0xC, 0xC, 0x318C @Gray + goto Move_PROTECT + + +Move_PLAY_NICE:: + loadspritegfx ANIM_TAG_RED_HEART + loopsewithpan SE_M_SANDSTORM, SOUND_PAN_ATTACKER, 0xc, 0x3 + launchtask AnimTask_SwayMon 0x5 0x5 0x0 0xc 0x1000 0x4 0x0 + delay 0xF + launchtemplate gRedHeartProjectileSpriteTemplate 0x83 0x2 0x14 0xfff8 + end + +Move_CONFIDE:: + loadspritegfx ANIM_TAG_CONFIDE @Confide Bubble + launchtask AnimTask_Splash 0x2 0x2 ANIM_ATTACKER 0x3 + launchtemplate gConfideBubbleTemplate 0xb 0x2 0x0 0x64 + playsewithpan SE_M_METRONOME, SOUND_PAN_ATTACKER + waitforvisualfinish + end + + +Move_DIAMOND_STORM:: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_ICE_CRYSTALS + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xF 0x1888 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ICE_CRYSTALS, 0, 0xD, 0xD, 0x7DDE @Pink + waitforvisualfinish + panse_1B SE_M_BLIZZARD, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 + launchtemplate gSwirlingSnowballSpriteTemplate 0x28 0x6 0x0 0xfff6 0x0 0xfff6 0x48 0x1 + launchtemplate gDiamondStormBlizzardTemplate 0x28 0x8 0x0 0x0 0x0 0x0 0x50 0x0 0x0 0x1 + delay 0x3 + launchtemplate gSwirlingSnowballSpriteTemplate 0x28 0x6 0x0 0xfff1 0x0 0xfff1 0x48 0x1 + launchtemplate gDiamondStormBlizzardTemplate 0x28 0x8 0x0 0xfff6 0x0 0xfff6 0x50 0x0 0x0 0x1 + delay 0x3 + launchtemplate gSwirlingSnowballSpriteTemplate 0x28 0x6 0x0 0xfffb 0x0 0xfffb 0x48 0x1 + launchtemplate gDiamondStormBlizzardTemplate 0x28 0x8 0x0 0xa 0x0 0xa 0x50 0x0 0x0 0x1 + delay 0x3 + launchtemplate gSwirlingSnowballSpriteTemplate 0x28 0x6 0x0 0xfff6 0x0 0xfff6 0x48 0x1 + launchtemplate gDiamondStormBlizzardTemplate 0x28 0x8 0x0 0xffec 0x0 0xffec 0x50 0x0 0x0 0x1 + delay 0x3 + launchtemplate gSwirlingSnowballSpriteTemplate 0x28 0x6 0x0 0xffec 0x0 0xffec 0x48 0x1 + launchtemplate gDiamondStormBlizzardTemplate 0x28 0x8 0x0 0xf 0x0 0xf 0x50 0x0 0x0 0x1 + delay 0x3 + launchtemplate gSwirlingSnowballSpriteTemplate 0x28 0x6 0x0 0xfff1 0x0 0xfff1 0x48 0x1 + launchtemplate gDiamondStormBlizzardTemplate 0x28 0x8 0x0 0xffec 0x0 0xffec 0x50 0x0 0x0 0x1 + delay 0x3 + launchtemplate gSwirlingSnowballSpriteTemplate 0x28 0x6 0x0 0xffe7 0x0 0xffe7 0x48 0x1 + launchtemplate gDiamondStormBlizzardTemplate 0x28 0x8 0x0 0x14 0x0 0x14 0x50 0x0 0x0 0x1 + delay 0x3 + playsewithpan SE_M_TWISTER, SOUND_PAN_TARGET + launchtemplate gDiamondStormDiamondsTemplate 0x82 0x5 0x78 0x46 0x5 0x46 0x1e + delay 0x1 + launchtemplate gDiamondStormDiamondsTemplate 0x82 0x5 0x73 0x37 0x6 0x3c 0x19 + delay 0x1 + launchtemplate gDiamondStormDiamondsTemplate 0x82 0x5 0x73 0x3c 0x7 0x3c 0x1e + launchtemplate gDiamondStormDiamondsTemplate 0x82 0x5 0x73 0x37 0xa 0x3c 0x1e + delay 0x3 + launchtemplate gDiamondStormDiamondsTemplate 0x82 0x5 0x64 0x32 0x4 0x32 0x1a + delay 0x1 + launchtemplate gDiamondStormDiamondsTemplate 0x82 0x5 0x69 0x19 0x8 0x3c 0x14 + delay 0x1 + launchtemplate gDiamondStormDiamondsTemplate 0x82 0x5 0x73 0x28 0xa 0x30 0x1e + delay 0x3 + launchtemplate gDiamondStormDiamondsTemplate 0x82 0x5 0x78 0x1e 0x6 0x2d 0x19 + launchtemplate gDiamondStormDiamondsTemplate 0x82 0x5 0x73 0x23 0xa 0x3c 0x1e + delay 0x3 + launchtemplate gDiamondStormDiamondsTemplate 0x82 0x5 0x69 0x14 0x8 0x28 0x0 + delay 0x3 + launchtemplate gDiamondStormDiamondsTemplate 0x82 0x5 0x14 0xff 0xf 0x20 0x0 + launchtemplate gDiamondStormDiamondsTemplate 0x82 0x5 0x6e 0xa 0x8 0x20 0x14 + waitforvisualfinish + @this is the buffet part + launchtemplate gBasicHitSplatSpriteTemplate 0x83 0x4 0xffe0 0xfff0 0x1 0x3 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMonInPlace 0x2 0x5 0x1 0x3 0x0 0xc 0x1 + launchtask AnimTask_ShakeMonInPlace 0x2 0x5 0x3 0x3 0x0 0xc 0x1 + delay 0x4 + launchtemplate gRandomPosHitSplatSpriteTemplate 0x83 0x2 0x1 0x3 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gRandomPosHitSplatSpriteTemplate 0x83 0x2 0x1 0x3 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gBasicHitSplatSpriteTemplate 0x83 0x4 0x20 0x14 0x1 0x3 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xF 0x0 0x1888 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + end + + +Move_STEAM_ERUPTION:: + loadspritegfx ANIM_TAG_STEAM_ERUPTION @Steam Eruption Particle + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x7 0x043D + delay 0x20 + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + panse_1B SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 + call SteamEruptionBreath + call SteamEruptionBreath + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x1 0x0 0x9 0x1f + call SteamEruptionBreath + delay 0x2 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0x2 0x0 0x15 0x1 + call SteamEruptionBreath + call SteamEruptionBreath + call SteamEruptionBreath + call SteamEruptionBreath + call SteamEruptionBreath + call SteamEruptionBreath + call SteamEruptionBreath + call SteamEruptionBreath + call SteamEruptionBreath + call SteamEruptionBreath + call SteamEruptionBreath + call SteamEruptionBreath + call SteamEruptionBreath + call SteamEruptionBreath + call SteamEruptionBreath + call SteamEruptionBreath + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x1 0x9 0x0 0x1f + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x7 0x0 0x043D + waitforvisualfinish + end +SteamEruptionBreath: + launchtemplate gSteamEruptionBreathTemplate 0x82 0x5 0x0 0x5 0x0 0x5 0x14 + delay 0x1 + return + + +Move_HYPERSPACE_HOLE:: + loadspritegfx ANIM_TAG_IMPACT @Hits + loadspritegfx ANIM_TAG_WHITE_SHADOW @Destiny Bond + loadspritegfx ANIM_TAG_QUICK_GUARD_HAND @Black Colour + loadspritegfx ANIM_TAG_POISON_BUBBLE @Poison Colour + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x10 0x7FFF + waitforvisualfinish + playsewithpan SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER + invisible ANIM_ATTACKER + delay 0x1 + visible ANIM_ATTACKER + delay 0x1 + invisible ANIM_ATTACKER + delay 0x1 + visible ANIM_ATTACKER + delay 0x1 + invisible ANIM_ATTACKER + waitsound + launchtask AnimTask_DestinyBondWhiteShadow 0x5 0x2 0x0 0x30 + delay 0x17 + launchtask AnimTask_IsTargetSameSide 0x2 0x0 + launchtask AnimTask_SnatchOpposingMonMove 0x2 0x0 + delay 0x19 + visible ANIM_ATTACKER + invisible ANIM_ATTACKER + delay 0x5 + launchtemplate gHyperspaceHoleImpactTemplate 0x82, 0x3, 0xfff6 0xfff6 0x0 + call HyperspaceHoleMovement + launchtemplate gHyperspaceHoleImpactTemplate 0x82, 0x3, 0xa 0x14 0x0 + call HyperspaceHoleMovement + launchtemplate gHyperspaceHoleImpactTemplate 0x82, 0x3, 0xfffb 0xa 0x0 + call HyperspaceHoleMovement + launchtemplate gHyperspaceHoleImpactTemplate 0x82, 0x3, 0x11 0xfff4 0x0 + call HyperspaceHoleMovement + waitforvisualfinish + visible ANIM_ATTACKER + delay 0x1 + invisible ANIM_ATTACKER + delay 0x1 + visible ANIM_ATTACKER + delay 0x1 + invisible ANIM_ATTACKER + delay 0x1 + visible ANIM_ATTACKER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x10 0x0 0x7FFF + waitforvisualfinish + end +HyperspaceHoleMovement: + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMon2 0x2 0x5 ANIM_TARGET 0x3 0x0 0xf 0x1 + delay 0x4 + return + + +Move_WATER_SHURIKEN:: + loadspritegfx ANIM_TAG_WATER_ORB @blue color + loadspritegfx ANIM_TAG_YELLOW_STAR @swift + loadspritegfx ANIM_TAG_BLUE_RING_2 @rings + loadspritegfx ANIM_TAG_SMALL_BUBBLES @bubbles + loadspritegfx ANIM_TAG_IMPACT @hydro pump hit + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + createsoundtask SoundTask_LoopSEAdjustPanning, 0x7, 0x87, 0xffc0, SOUND_PAN_TARGET, 0x5, 0x5, 0x0, 0x5 + launchtemplate gWaterShurikenStarTemplate 0x82, 0x3, 0x0 0x0 0x27 + delay 0x8 + launchtemplate gWaterShurikenRingTemplate 0x82, 0x4, 0x0 0x0 0x28 0xf + delay 0x5 + launchtemplate gWaterShurikenRingTemplate 0x82, 0x4, 0x0 0x0 0x28 0xf + delay 0x5 + launchtemplate gWaterShurikenRingTemplate 0x82, 0x4, 0x0 0x0 0x28 0xf + delay 0xC + playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_TARGET + launchtemplate gWaterShurikenImpactTemplate 0x2 0x4 0x0 0x0 0x1 0x2 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + end + +Move_MYSTICAL_FIRE:: + call SetPsychicBackground + loadspritegfx ANIM_TAG_FIRE + setalpha 8, 8 + playse 0xb1 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x0 0x1 0x0 0xa 0x1 + launchtask AnimTask_BlendColorCycle 0x2 0x6 0x2 0x0 0x2 0x0 0x8 0x7fff + waitforvisualfinish + waitsound + blendoff + launchtemplate gLargeFlameScatterSpriteTemplate 0x82 0x6 0x0 0x0 0x1e 0x1e 0xffff 0x0 + delay 0x1 + launchtemplate gLargeFlameScatterSpriteTemplate 0x82 0x6 0x0 0x0 0x1e 0x1e 0x0 0x1 + delay 0x1 + launchtemplate gLargeFlameScatterSpriteTemplate 0x82 0x6 0x0 0x0 0x1e 0x1e 0xffff 0xffff + delay 0x1 + launchtemplate gLargeFlameScatterSpriteTemplate 0x82 0x6 0x0 0x0 0x1e 0x1e 0x2 0x1 + delay 0x1 + launchtemplate gLargeFlameScatterSpriteTemplate 0x82 0x6 0x0 0x0 0x1e 0x1e 0x1 0xffff + delay 0x1 + launchtemplate gLargeFlameScatterSpriteTemplate 0x82 0x6 0x0 0x0 0x1e 0x1e 0xffff 0x1 + delay 0x1 + launchtemplate gLargeFlameScatterSpriteTemplate 0x82 0x6 0x0 0x0 0x1e 0x1e 0x1 0xfffe + delay 0x1 + launchtemplate gLargeFlameScatterSpriteTemplate 0x82 0x6 0x0 0x0 0x1e 0x1e 0x3 0x1 + playse 0x8c + waitforvisualfinish + call UnsetPsychicBg + end + + +Move_SPIKY_SHIELD:: + loadspritegfx ANIM_TAG_PROTECT + loadspritegfx ANIM_TAG_GREEN_SPIKE + monbg ANIM_ATK_PARTNER + monbgprio_28 ANIM_ATTACKER + waitplaysewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER, 0x10 + launchtemplate gProtectSpriteTemplate 0x2 0x3 0x18 0x0 0x5a + delay 0xF + launchtemplate gNeedleArmSpikeSpriteTemplate 0x82 0x5 0x0 0x1 0x0 0xFFE0 0x10 + delay 0x2 + launchtemplate gNeedleArmSpikeSpriteTemplate 0x82 0x5 0x0 0x1 0x16 0xFFEA 0x10 + delay 0x2 + launchtemplate gNeedleArmSpikeSpriteTemplate 0x82 0x5 0x0 0x1 0x1E 0x0 0x10 + delay 0x2 + launchtemplate gNeedleArmSpikeSpriteTemplate 0x82 0x5 0x0 0x1 0x14 0x14 0x10 + delay 0x2 + launchtemplate gNeedleArmSpikeSpriteTemplate 0x82 0x5 0x0 0x1 0x0 0x1C 0x10 + delay 0x2 + launchtemplate gNeedleArmSpikeSpriteTemplate 0x82 0x5 0x0 0x1 0xFFED 0x13 0x10 + delay 0x2 + launchtemplate gNeedleArmSpikeSpriteTemplate 0x82 0x5 0x0 0x1 0xFFE5 0x0 0x10 + delay 0x2 + launchtemplate gNeedleArmSpikeSpriteTemplate 0x82 0x5 0x0 0x1 0xFFEE 0xFFEE 0x10 + delay 0x2 + launchtemplate gNeedleArmSpikeSpriteTemplate 0x82 0x5 0x0 0x1 0x0 0xFFE7 0x10 + delay 0x2 + launchtemplate gNeedleArmSpikeSpriteTemplate 0x82 0x5 0x0 0x1 0x11 0xFFEF 0x10 + delay 0x2 + launchtemplate gNeedleArmSpikeSpriteTemplate 0x82 0x5 0x0 0x1 0x17 0x0 0x10 + delay 0x2 + launchtemplate gNeedleArmSpikeSpriteTemplate 0x82 0x5 0x0 0x1 0x10 0x10 0x10 + waitforvisualfinish + clearmonbg ANIM_ATK_PARTNER + end + + +Move_AROMATIC_MIST:: + loadspritegfx ANIM_TAG_PINK_PETAL + playsewithpan SE_M_SWEET_SCENT, SOUND_PAN_ATTACKER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x8 0x6E7D + launchtemplate gSweetScentPetalSpriteTemplate 0x2 0x3 0x64 0x0 0x64 + delay 0x19 + setpan 0x0 + call SweetScentEffect + launchtemplate gSweetScentPetalSpriteTemplate 0x2 0x2 0x37 0x0 + setpan SOUND_PAN_TARGET + createvisualtask AnimTask_BlendColorCycle, 2, (ANIM_PAL_DEF | ANIM_PAL_DEF_PARTNER), 1, 5, 5, 13, 0x56bf + call SweetScentEffect + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x8 0x0 0x6E7D + waitforvisualfinish + end + + +Move_EERIE_IMPULSE:: + loadspritegfx ANIM_TAG_THIN_RING @hypervoice circle + loadspritegfx ANIM_TAG_SPARK @electric particles + loadspritegfx ANIM_TAG_SPARK_2 @electric particles + loadspritegfx ANIM_TAG_BLUE_STAR @heal particles + loadspritegfx ANIM_TAG_SPARK_H @lighter yellow particle + loadspritegfx ANIM_TAG_GOLD_RING @psybeam ring + monbg ANIM_DEF_PARTNER + waitplaysewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET 0x13 + delay 0x4 + launchtemplate gEerieImpulseRingTemplate 0x0 0x7 0x2d 0x0 0x0 0x0 0x0 0x0 0x1 + delay 0xB + launchtemplate gZapCannonSparkSpriteTemplate, ANIM_TARGET, 7, 10, 0, 16, 30, 0, 40, 0 + launchtemplate gZapCannonSparkSpriteTemplate, ANIM_TARGET, 7, 10, 0, 16, 30, 0, 40, 1 + launchtemplate gZapCannonSparkSpriteTemplate, ANIM_TARGET, 7, 10, 0, 16, 30, 0, 40, 0 + launchtemplate gZapCannonSparkSpriteTemplate, ANIM_TARGET, 7, 10, 0, 16, 30, SOUND_PAN_ATTACKER, 40, 2 + launchtemplate gZapCannonSparkSpriteTemplate, ANIM_TARGET, 7, 10, 0, 32, 30, 0, 40, 0 + launchtemplate gZapCannonSparkSpriteTemplate, ANIM_TARGET, 7, 10, 0, 32, 30, 0, 40, 1 + launchtemplate gZapCannonSparkSpriteTemplate, ANIM_TARGET, 7, 10, 0, 32, 30, 0, 40, 0 + launchtemplate gZapCannonSparkSpriteTemplate, ANIM_TARGET, 7, 10, 0, 32, 30, SOUND_PAN_ATTACKER, 40, 2 + launchtemplate gZapCannonSparkSpriteTemplate, ANIM_TARGET, 7, 10, 0, 48, 30, 0, 40, 0 + launchtemplate gZapCannonSparkSpriteTemplate, ANIM_TARGET, 7, 10, 0, 48, 30, 0, 40, 1 + launchtemplate gZapCannonSparkSpriteTemplate, ANIM_TARGET, 7, 10, 0, 48, 30, 0, 40, 0 + launchtemplate gZapCannonSparkSpriteTemplate, ANIM_TARGET, 7, 10, 0, 48, 30, 0, 40, 2 + waitforvisualfinish + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + launchtemplate gEerieImpulseImpactTemplate 0x2 0x6 0x0 0xfffb 0x1 0x0 0x20 0x10 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0x5 0x0 0x5 0x0, ANIM_TARGET + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfffb 0xa 0x5 0x1, ANIM_TARGET + delay 0x7 + launchtemplate gEerieImpulseImpactTemplate 0x2 0x6 0xfff1 0xa 0x1 0x0 0x20 0x10 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xf 0x14 0x5 0x2, ANIM_TARGET + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfff1 0xfff6 0x5 0x0, ANIM_TARGET + delay 0x7 + launchtemplate gEerieImpulseImpactTemplate 0x2 0x6 0xfff1 0xfff1 0x1 0x0 0x20 0x10 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0x19 0x0 0x5 0x1, ANIM_TARGET + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfff8 0x8 0x5 0x2, ANIM_TARGET + delay 0x7 + launchtemplate gEerieImpulseImpactTemplate 0x2 0x6 0xa 0xfffb 0x1 0x0 0x20 0x10 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0x2 0xfff8 0x5 0x0, ANIM_TARGET + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xffec 0xf 0x5 0x1, ANIM_TARGET + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + end + + +Move_VENOM_DRENCH:: + loadspritegfx ANIM_TAG_POISON_BUBBLE + monbg ANIM_DEF_PARTNER + launchtemplate gVenomDrenchAcidTemplate 0x82, 0x4, 0xfffb 0x1 0xfffb 0x0 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gVenomDrenchAcidTemplate 0x82, 0x4, 0x5 0x0 0x6 0x0 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gVenomDrenchAcidTemplate 0x82, 0x4, 0x13 0x1 0xa 0x0 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gVenomDrenchAcidTemplate 0x82, 0x4, 0xffe9 0x2 0xfff6 0x0 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET + delay 0x2 + call AcidDrench + call AcidDrench + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + end +AcidDrench: + launchtemplate gVenomDrenchAcidTemplate 0x82, 0x4, 0xffec 0x0 0xfff6 0x0 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gVenomDrenchAcidTemplate 0x82, 0x4, 0x1c 0x1 0xa 0x0 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gVenomDrenchAcidTemplate 0x82, 0x4, 0xfff6 0x1 0xfffb 0x0 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gVenomDrenchAcidTemplate 0x82, 0x4, 0xa 0x0 0x6 0x0 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gVenomDrenchAcidTemplate 0x82, 0x4, 0x18 0x1 0xa 0x0 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gVenomDrenchAcidTemplate 0x82, 0x4, 0xffe0 0x2 0xfff6 0x0 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gVenomDrenchAcidTemplate 0x82, 0x4, 0xffec 0x0 0xfff6 0x0 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gVenomDrenchAcidTemplate 0x82, 0x4, 0x1e 0x2 0xa 0x0 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_TARGET + delay 0x2 + return + + +Move_POWDER:: + loadspritegfx ANIM_TAG_HANDS_AND_FEET @black color + loadspritegfx ANIM_TAG_SPORE @powder + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + loopsewithpan SE_M_POISON_POWDER, SOUND_PAN_TARGET, 0x12, 0xa + call POWDER_SPORE + call POWDER_SPORE + call POWDER_SPORE + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + end +POWDER_SPORE: + launchtemplate gPowderBlackSporeTemplate 0x2 0x5 0x0 0xffec 0x55 0x50 0x0 + delay 0xc + launchtemplate gPowderBlackSporeTemplate 0x2 0x5 0x0 0xfff6 0xaa 0x50 0x0 + delay 0xc + launchtemplate gPowderBlackSporeTemplate 0x2 0x5 0x0 0xfff1 0x0 0x50 0x0 + delay 0xc + return + + +Move_GEOMANCY:: + loadspritegfx ANIM_TAG_ZYGARDE_HEXES @Hex + loadspritegfx ANIM_TAG_GUARD_RING @safeguard + loadspritegfx ANIM_TAG_PAW_PRINT @yellow color + loadspritegfx ANIM_TAG_WHIP_HIT @green color + loadspritegfx ANIM_TAG_SWEAT_BEAD @blue color + loadspritegfx ANIM_TAG_SMALL_EMBER @dragon claw buff / red color + monbg ANIM_ATK_PARTNER + setalpha 8, 8 + choosetwoturnanim GeomancyChargeUp GeomancyUnleash +GeomancyChargeUp: + loadspritegfx ANIM_TAG_FOCUS_ENERGY @endure buff effect + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + playsewithpan SE_M_COSMIC_POWER, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_ATTACKER 0x0 0x2 0x5f 0x1 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x2 0x0 0x5 0x1F + call GeomancyRingBuff + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x2 0x0 0x5 0x2C0 + call GeomancyRingBuff + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x2 0x0 0x5 0x7C60 + call GeomancyRingBuff + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x8 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x2 0x5 0x0 0x7C60 + waitforvisualfinish + blendoff + clearmonbg ANIM_ATK_PARTNER + end +GeomancyRingBuff: + launchtemplate gGeomancyRedCellVortexTemplate 0x2 0x7 0x0 0x1c 0x210 0x1e 0xd 0x32 0x0 + launchtemplate gEndureEnergySpriteTemplate 0x2 0x4 0x0 0xffe8 0x1a 0x2 + launchtemplate gGeomancyRingTemplate 0x2 0x0 + delay 0x1 + launchtemplate gGeomancyRingTemplate 0x2 0x0 + delay 0x1 + launchtemplate gGeomancyGreenCellVortexTemplate 0x2 0x7 0x0 0x20 0x1e0 0x14 0x10 0xffd2 0x0 + launchtemplate gGeomancyRingTemplate 0x2 0x0 + delay 0x1 + launchtemplate gGeomancyRingTemplate 0x2 0x0 + delay 0x1 + launchtemplate gGeomancyBlueCellVortexTemplate 0x2 0x7 0x0 0x21 0x240 0x14 0x8 0x2a 0x0 + launchtemplate gEndureEnergySpriteTemplate 0x2 0x4 0x0 0xe 0x1c 0x1 + delay 0x2 + launchtemplate gGeomancyRedCellVortexTemplate 0x2 0x7 0x0 0x1f 0x190 0x19 0xb 0xffd6 0x0 + delay 0x2 + launchtemplate gGeomancyGreenCellVortexTemplate 0x2 0x7 0x0 0x1c 0x200 0x19 0x10 0x2e 0x0 + launchtemplate gEndureEnergySpriteTemplate 0x2 0x4 0x0 0xfffb 0xa 0x2 + launchtemplate gGeomancyRingTemplate 0x2 0x0 + delay 0x1 + launchtemplate gGeomancyRingTemplate 0x2 0x0 + delay 0x1 + launchtemplate gGeomancyBlueCellVortexTemplate 0x2 0x7 0x0 0x21 0x1d0 0x1e 0xf 0xffce 0x0 + launchtemplate gGeomancyRingTemplate 0x2 0x0 + delay 0x1 + launchtemplate gGeomancyRingTemplate 0x2 0x0 + delay 0x1 + launchtemplate gGeomancyRedCellVortexTemplate 0x2 0x7 0x0 0x1c 0x210 0x1e 0xd 0x32 0x0 + launchtemplate gEndureEnergySpriteTemplate 0x2 0x4 0x0 0x1c 0x1a 0x3 + delay 0x2 + launchtemplate gGeomancyGreenCellVortexTemplate 0x2 0x7 0x0 0x20 0x1e0 0x14 0x10 0xffd2 0x0 + delay 0x2 + launchtemplate gGeomancyBlueCellVortexTemplate 0x2 0x7 0x0 0x21 0x240 0x14 0x8 0x2a 0x0 + launchtemplate gEndureEnergySpriteTemplate 0x2 0x4 0x0 0xfff4 0x0 0x1 + launchtemplate gGeomancyRingTemplate 0x2 0x0 + delay 0x1 + launchtemplate gGeomancyRingTemplate 0x2 0x0 + delay 0x1 + launchtemplate gGeomancyRedCellVortexTemplate 0x2 0x7 0x0 0x1f 0x190 0x19 0xb 0xffd6 0x0 + launchtemplate gGeomancyRingTemplate 0x2 0x0 + delay 0x1 + launchtemplate gGeomancyRingTemplate 0x2 0x0 + delay 0x1 + launchtemplate gGeomancyGreenCellVortexTemplate 0x2 0x7 0x0 0x1c 0x200 0x19 0x10 0x2e 0x0 + delay 0x2 + return +GeomancyUnleash: + loadspritegfx ANIM_TAG_FIRE_PLUME @dragon rage + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x10 0x24CF + playsewithpan SE_M_MILK_DRINK, SOUND_PAN_ATTACKER + launchtemplate gGeomancyRingTemplate 0x2 0x0 + delay 0x1 + launchtemplate gGeomancyRingTemplate 0x2 0x0 + delay 0x1 + launchtemplate gGeomancyRingTemplate 0x2 0x0 + delay 0x1 + launchtemplate gGeomancyRingTemplate 0x2 0x0 + delay 0x1 + launchtemplate gGeomancyRingTemplate 0x2 0x0 + delay 0x1 + launchtemplate gGeomancyRingTemplate 0x2 0x0 + waitforvisualfinish + playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x10 0x10 0x4D01 + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_ATTACKER 0x0 0x2 0x25 0x1 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x2 0x0 0x5 0x1F + launchtemplate gGeomancyRedCellRaiseTemplate 0x2 0x5 0x14 0x20 0xffd0 0x32 0x1 + launchtemplate gGeomancyGreenCellRaiseTemplate 0x2 0x5 0x0 0x20 0xffda 0x19 0x1 + launchtemplate gGeomancyBlueCellRaiseTemplate 0x2 0x5 0x20 0x20 0xffe4 0x28 0x1 + launchtemplate gGeomancyRedCellRaiseTemplate 0x2 0x5 0xffec 0x20 0xffd0 0x32 0x1 + launchtemplate gGeomancyGreenCellRaiseTemplate 0x2 0x5 0x14 0x20 0xffe4 0x3c 0x1 + launchtemplate gGeomancyBlueCellRaiseTemplate 0x2 0x5 0x0 0x20 0xffe4 0x1e 0x1 + call GeomancyRageBuff + call GeomancyRageBuff + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x10 0x0 0x4D01 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x2 0x5 0x0 0x1F + waitforvisualfinish + blendoff + clearmonbg ANIM_ATK_PARTNER + end +GeomancyRageBuff: + launchtemplate gGeomancyYellowRageTemplate 0xc2 0x3 0x0 0x5 0x0 + delay 0x1 + launchtemplate gGeomancyYellowRageTemplate 0xc2 0x3 0x0 0xfff6 0xfff1 + delay 0x1 + launchtemplate gGeomancyYellowRageTemplate 0x82, 0x3, 0x0 0x0 0x19 + delay 0x1 + launchtemplate gGeomancyYellowRageTemplate 0xc2 0x3 0x0 0xf 0x5 + delay 0x1 + launchtemplate gGeomancyYellowRageTemplate 0xc2 0x3 0x0 0xffe7 0x0 + delay 0x1 + launchtemplate gGeomancyYellowRageTemplate 0x82, 0x3, 0x0 0x1e 0x1e + delay 0x1 + launchtemplate gGeomancyYellowRageTemplate 0x82, 0x3, 0x0 0xffe5 0x19 + delay 0x1 + launchtemplate gGeomancyYellowRageTemplate 0xc2 0x3 0x0 0x0 0x8 + delay 0x1 + return + + +Move_MAGNETIC_FLUX:: + loadspritegfx ANIM_TAG_THIN_RING @uproar + loadspritegfx ANIM_TAG_SPARK_2 @ElectricityEffect + loadspritegfx ANIM_TAG_SMALL_EMBER @yellow color + createvisualtask AnimTask_BlendBattleAnimPal 10, (ANIM_PAL_DEF | ANIM_PAL_ATK), 2, 0, 9, 0x243B + createvisualtask AnimTask_BlendBattleAnimPal 10, (ANIM_PAL_DEF | ANIM_PAL_ATK_PARTNER), 2, 0, 9, 0x243B + loopsewithpan SE_M_TRI_ATTACK, SOUND_PAN_ATTACKER, 0x12, 0x3 + launchtask AnimTask_DefenseCurlDeformMon 0x5 0x0 + call MagneticFluxSparks1 + delay 0xA + call MagneticFluxSparks2 + delay 0xA + call MagneticFluxSparks1 + delay 0xA + launchtemplate gMagneticFluxUproarTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1f 0x8 + call MagneticFluxSparks2 + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal 10, (ANIM_PAL_DEF | ANIM_PAL_ATK), 2, 9, 0, 0x243B + createvisualtask AnimTask_BlendBattleAnimPal 10, (ANIM_PAL_DEF | ANIM_PAL_ATK_PARTNER), 2, 9, 0, 0x243B + waitforvisualfinish + end +MagneticFluxSparks1: + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x20 0x18 0xbe 0xc 0x0 0x1 0x0 + delay 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x50 0x18 0x16 0xc 0x0 0x1 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x9c 0x18 0x79 0xd 0x0 0x1 0x1 + return +MagneticFluxSparks2: + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x64 0x18 0x3c 0xa 0x0 0x1 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0xaa 0x18 0x2a 0xb 0x0 0x1 0x1 + delay 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0xee 0x18 0xa5 0xa 0x0 0x1 0x1 + return + + +Move_HAPPY_HOUR:: + loadspritegfx ANIM_TAG_COIN + monbg ANIM_ATTACKER + loopsewithpan SE_M_PAY_DAY, SOUND_PAN_TARGET, 0x8, 10 + launchtemplate gHappyHourCoinShowerTemplate 0x82, 0x4, 0xfffb 0x0 0xfffb 0x1 + delay 0x2 + launchtemplate gHappyHourCoinShowerTemplate 0x82, 0x4, 0x5 0x0 0x6 0x1 + delay 0x2 + launchtemplate gHappyHourCoinShowerTemplate 0x82, 0x4, 0x13 0x0 0xa 0x1 + delay 0x2 + launchtemplate gHappyHourCoinShowerTemplate 0x82, 0x4, 0xffe9 0x0 0xfff6 0x1 + delay 0x2 + call CoinShower + call CoinShower + waitforvisualfinish + clearmonbg ANIM_ATTACKER + end +CoinShower: + launchtemplate gHappyHourCoinShowerTemplate 0x82, 0x4, 0xffec 0x0 0xfff6 0x1 + delay 0x2 + launchtemplate gHappyHourCoinShowerTemplate 0x82, 0x4, 0x1c 0x0 0xa 0x1 + delay 0x2 + launchtemplate gHappyHourCoinShowerTemplate 0x82, 0x4, 0xfff6 0x0 0xfffb 0x1 + delay 0x2 + launchtemplate gHappyHourCoinShowerTemplate 0x82, 0x4, 0xa 0x0 0x6 0x1 + delay 0x2 + launchtemplate gHappyHourCoinShowerTemplate 0x82, 0x4, 0x18 0x0 0xa 0x1 + delay 0x2 + launchtemplate gHappyHourCoinShowerTemplate 0x82, 0x4, 0xffe0 0x0 0xfff6 0x1 + delay 0x2 + launchtemplate gHappyHourCoinShowerTemplate 0x82, 0x4, 0xffec 0x0 0xfff6 0x1 + delay 0x2 + launchtemplate gHappyHourCoinShowerTemplate 0x82, 0x4, 0x1e 0x0 0xa 0x1 + delay 0x2 + return + + +Move_ELECTRIC_TERRAIN:: + loadspritegfx ANIM_TAG_ELECTRIC_ORBS + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0 + waitforvisualfinish + delay 30 + createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB(27, 27, 0), 12, 5, 1 + delay 4 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + createsprite gElectricTerrainOrbsTemplate, ANIM_ATTACKER, 2, 26, 0 + createsprite gElectricTerrainOrbsTemplate, ANIM_ATTACKER, 2, 26, 42 + createsprite gElectricTerrainOrbsTemplate, ANIM_ATTACKER, 2, 26, 84 + createsprite gElectricTerrainOrbsTemplate, ANIM_ATTACKER, 2, 26, 126 + createsprite gElectricTerrainOrbsTemplate, ANIM_ATTACKER, 2, 26, 168 + createsprite gElectricTerrainOrbsTemplate, ANIM_ATTACKER, 2, 26, 210 + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 3, 0, 4, RGB(28, 28, 0) + delay 52 + setarg 7, 0xFFFF + playsewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER + createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0 + createsprite gElectricTerrainFlyingBallTemplate, ANIM_TARGET, 2, 0 + createsprite gElectricTerrainFlyingBallTemplate, ANIM_TARGET, 2, 32 + createsprite gElectricTerrainFlyingBallTemplate, ANIM_TARGET, 2, 64 + createsprite gElectricTerrainFlyingBallTemplate, ANIM_TARGET, 2, 96 + createsprite gElectricTerrainFlyingBallTemplate, ANIM_TARGET, 2, 128 + createsprite gElectricTerrainFlyingBallTemplate, ANIM_TARGET, 2, 160 + createsprite gElectricTerrainFlyingBallTemplate, ANIM_TARGET, 2, 192 + createsprite gElectricTerrainFlyingBallTemplate, ANIM_TARGET, 2, 224 + loopsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET, 0x16, 0x3 + waitforvisualfinish + delay 2 + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 3, 4, 0, RGB(28, 28, 0) + waitforvisualfinish + end + + +Move_DAZZLING_GLEAM:: + loadspritegfx ANIM_TAG_SPARKLE_2 + loadspritegfx ANIM_TAG_BLUE_STAR + launchtemplate gSimplePaletteBlendSpriteTemplate 0x2 0x5 0x1 0x2 0x0 0xd 0x7fff + playsewithpan SE_M_TWISTER, SOUND_PAN_ATTACKER + @call 0x081D56B3 -> middle of GrantingStarsEffect + createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, 12, -5, 0, 0, 32, 60 + delay 8 + waitforvisualfinish + launchtask AnimTask_BlendColorCycle 0x2 0x6 0x2 0x0 0x3 0x0 0x10 0x7fff + delay 0x4 + playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_ATTACKER + waitforvisualfinish + launchtemplate gSimplePaletteBlendSpriteTemplate 0x2 0x5 0x1 0x0 0xd 0x0 0x7fff + waitforvisualfinish + clearmonbg 0x0 + blendoff + end + + +Move_CELEBRATE:: + loadspritegfx ANIM_TAG_ITEM_BAG + launchtemplate gCelebrateBagTemplate 0x2 0x1 0x0 + playsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER + delay 0x12 + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + delay 0x47 + loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER 0x16 0x3 + end + + +Move_HOLD_HANDS:: + loadspritegfx ANIM_TAG_TAG_HAND @hand + loadspritegfx ANIM_TAG_MAGENTA_HEART @charm + loadspritegfx ANIM_TAG_VERTICAL_HEX @red + playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER + launchtask AnimTask_TranslateMonEllipticalRespectSide 0x2 0x5 0x0 0xc 0x6 0x6 0x3 + launchtemplate gHoldHandsHeartTemplate 0x2 0x4 0x0 0xffe8 0x8 0x8c + delay 0x8 + launchtemplate gHoldHandsHeartTemplate 0x2 0x4 0x0 0xffe8 0x8 0x8c + delay 0x8 + launchtemplate gHoldHandsHeartTemplate 0x2 0x4 0x0 0xffe8 0x8 0x8c + delay 0x8 + launchtemplate gHoldHandsHeartTemplate 0x2 0x4 0x0 0xffe8 0x8 0x8c + delay 0x8 + launchtemplate gHoldHandsHeartTemplate 0x2 0x4 0x0 0xffe8 0x8 0x8c + delay 0x8 + launchtemplate gHoldHandsHeartTemplate 0x2 0x4 0x0 0xffe8 0x8 0x8c + delay 0x8 + launchtemplate gHoldHandsHeartTemplate 0x2 0x4 0x0 0xffe8 0x8 0x8c + delay 0x8 + launchtemplate gHoldHandsHeartTemplate 0x2 0x4 0x0 0xffe8 0x8 0x8c + delay 0x8 + launchtemplate gHoldHandsHeartTemplate 0x2 0x4 0x0 0xffe8 0x8 0x8c + delay 0x8 + launchtemplate gHoldHandsHeartTemplate 0x2 0x4 0x0 0xffe8 0x8 0x8c + waitforvisualfinish + launchtask AnimTask_HelpingHandAttackerMovement 0x5 0x0 + launchtemplate gHelpingHandClapSpriteTemplate 0x28 0x1 0x0 + launchtemplate gHelpingHandClapSpriteTemplate 0x28 0x1 0x1 + delay 0x13 + playsewithpan SE_M_ENCORE, 0x0 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x2 0x2 0x0 0x5 0x1 + delay 0xe + playsewithpan SE_M_ENCORE, 0x0 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x2 0x2 0x0 0x5 0x1 + delay 0x14 + playsewithpan SE_M_ENCORE, 0x0 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x2 0x3 0x0 0xa 0x1 + launchtask AnimTask_BlendMonInAndOut 0x2 0x5 0x2 0x3ff 0xc 0x1 0x1 + end + + +Move_BABY_DOLL_EYES:: + loadspritegfx ANIM_TAG_LEER + loadspritegfx ANIM_TAG_PINK_CLOUD + loadspritegfx ANIM_TAG_OPENING_EYE @eye + setalpha 8, 8 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x0 0x0 0xA 0x7FFF + waitforvisualfinish + launchtemplate gOpeningEyeSpriteTemplate 0x5 0x4 0x0 0x0 0x1 0x0 + delay 0x20 + playsewithpan SE_M_LEER, SOUND_PAN_ATTACKER + launchtask AnimTask_ScaleMonAndRestore 0x5 0x5 0xfffb 0xfffb 0xa 0x0 0x1 + waitforvisualfinish + delay 0xa + launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0x1 0x0 0x9 0x1 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x3 0x1 0x0 0x9 0x1 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x0 0xA 0x0 0x7FFF + waitforvisualfinish + blendoff + end + + +Move_NUZZLE:: + loadspritegfx ANIM_TAG_MAGENTA_HEART + loadspritegfx ANIM_TAG_ITEM_BAG + loadspritegfx ANIM_TAG_SPARK_2 + loadspritegfx ANIM_TAG_IMPACT + launchtask AnimTask_RockMonBackAndForth 0x5 0x3 0x0 0x2 0x0 + launchtemplate gMagentaHeartSpriteTemplate 0x3 0x2 0x0 0x14 + playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER + delay 0xf + launchtemplate gMagentaHeartSpriteTemplate 0x3 0x2 0xffec 0x14 + playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER + delay 0xf + launchtemplate gMagentaHeartSpriteTemplate 0x3 0x2 0x14 0x14 + playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER + waitforvisualfinish + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0x0 0x0 0x1 0x2 + call ElectricityEffectNoSound + waitforvisualfinish + end + + +Move_HOLD_BACK:: + loadspritegfx ANIM_TAG_PAW_PRINT @ yellow/brown + loadspritegfx ANIM_TAG_IMPACT @ hit + loadspritegfx ANIM_TAG_PURPLE_SWIPE @ swipe + loadspritegfx ANIM_TAG_THIN_RING @ ring + loadspritegfx ANIM_TAG_DUCK @ dizzy punch + loadspritegfx ANIM_TAG_PAIN_SPLIT @ pain split + monbg ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET + launchtemplate gHoldBackSwipeTemplate 0x82, 0x3, 0x0 0x0 0x1 + waitforvisualfinish + launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0x3 0x0 0xa 0x1 + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0x0 0x0 0x1 0x2 + launchtemplate gHoldBackRingTemplate 0x3 0x4 0x0 0x0 0x100 0x0 + launchtemplate gHoldBackStarsTemplate 0x83 0x4 0xfff0 0xfff8 0xa0 0xffe0 + launchtemplate gHoldBackStarsTemplate 0x83 0x4 0xfff0 0xfff8 0xff00 0xffd8 + launchtemplate gHoldBackStarsTemplate 0x83 0x4 0xfff0 0xfff8 0x80 0xfff0 + launchtemplate gHoldBackStarsTemplate 0x83 0x4 0xfff0 0xfff8 0x1a0 0xffda + launchtemplate gHoldBackStarsTemplate 0x83 0x4 0xfff0 0xfff8 0xff80 0xffea + launchtemplate gHoldBackStarsTemplate 0x83 0x4 0xfff0 0xfff8 0xfe80 0xffe1 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end + + +Move_INFESTATION:: + loadspritegfx ANIM_TAG_HANDS_AND_FEET @black color + loadspritegfx ANIM_TAG_SMALL_BUBBLES @circle particles + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_DEF, 0x2, 0x0, 0x9, 0x7320 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x3 0x0 0x4f 0x1 + loopsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER, 0x0, 0x4F + call InfestationVortex + call InfestationVortex + call InfestationVortex + call InfestationVortex + call InfestationVortex + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 ANIM_PAL_DEF 0x2 0x9 0x0 0x7320 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + end +InfestationVortex: + launchtemplate gInfestationBubbleTemplate 0x82 0x7 0x0 0x1c 0x210 0x1e 0xd 0x32 0x1 + delay 0x1 + launchtemplate gInfestationBubbleTemplate 0x82 0x7 0x0 0x20 0x1e0 0x14 0x10 0xffd2 0x1 + delay 0x1 + launchtemplate gInfestationBubbleTemplate 0x82 0x7 0x0 0x21 0x240 0x14 0x8 0x2a 0x1 + delay 0x1 + launchtemplate gInfestationBubbleTemplate 0x82 0x7 0x0 0x1f 0x190 0x19 0xb 0xffd6 0x1 + delay 0x1 + launchtemplate gInfestationBubbleTemplate 0x82 0x7 0x0 0x1c 0x200 0x19 0x10 0x2e 0x1 + delay 0x1 + launchtemplate gInfestationBubbleTemplate 0x82 0x7 0x0 0x21 0x1d0 0x1e 0xf 0xffce 0x1 + delay 0x1 + return + + +Move_POWER_UP_PUNCH: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_HANDS_AND_FEET + loadspritegfx ANIM_TAG_BREATH + monbg ANIM_TARGET + setalpha 12, 8 + createvisualtask AnimTask_GrowAndShrink, 2, + playsewithpan SE_M_METRONOME, SOUND_PAN_ATTACKER + waitforvisualfinish + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end + +Move_OBLIVION_WING:: + loadspritegfx ANIM_TAG_HYDRO_PUMP + loadspritegfx ANIM_TAG_ROUND_SHADOW + loadspritegfx ANIM_TAG_BLUE_STAR + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HYDRO_PUMP, 0x0, 0xC, 0xC, 0x289F @Pinkish Red + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ROUND_SHADOW, 0x0, 0xD, 0xD, 0x289F @Pinkish Red + playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER + launchtemplate gFlyBallUpSpriteTemplate 0x2 0x4 0x0 0x0 0xd 0x150 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xE 0x0 @Black + waitforvisualfinish + createsoundtask SoundTask_LoopSEAdjustPanning, 0x7, 0xf0, 0xffc0, SOUND_PAN_TARGET, 0x1, 0xf, 0x0, 0x5 + call OblivionWingBeam + call OblivionWingBeam + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0 0x3 40 0x1 + launchtask AnimTask_BlendColorCycle 0x2 0x6 ANIM_PAL_DEF 0x2 0x4 0x0 0xc 0x289F @Pinkish Red + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + call OblivionWingBeam + delay 15 + visible ANIM_ATTACKER + call HealingEffect + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xE 0x0 0x0 @From black + waitforvisualfinish + end +OblivionWingBeam: + launchtemplate gOblivionWingBeamTemplate 0x82, 0x6, 0, -90, 0, 20, 0x15 0x0 + delay 0x2 + launchtemplate gOblivionWingBeamTemplate 0x82, 0x6, 0, -90, 0, 20, 0x15 0x0 + delay 0x2 + return + + +Move_THOUSAND_ARROWS:: + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge animation + loadspritegfx ANIM_TAG_ELECTRICITY @charge animation + loadspritegfx ANIM_TAG_LEAF @green color + loadspritegfx ANIM_TAG_RAZOR_LEAF @green color 2 + loadspritegfx ANIM_TAG_ZYGARDE_HEXES @hexagon + loadspritegfx ANIM_TAG_VERTICAL_HEX @arrow + loadspritegfx ANIM_TAG_NEEDLE @sting + monbg ANIM_ATTACKER + setblends 0x80e + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + launchtemplate gThousandArrowsGreenChargeTemplate 0x2 0x1 0x0 + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + delay 0x18 + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + delay 0x18 + call ThousandArrowsHexes + call ThousandArrowsHexes + call ThousandArrowsHexes + call ThousandArrowsHexes + call ThousandArrowsHexes + call ThousandArrowsHexes + call ThousandArrowsHexes + launchtemplate gThousandArrowsGreenDischargeTemplate 0x2 0x3 0x0 0x10 0x10 + delay 0x2 + launchtemplate gThousandArrowsGreenDischargeTemplate 0x2 0x3 0x0 0xfff0 0xfff0 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + waitforvisualfinish + delay 0x30 + launchtask AnimTask_HorizontalShake 0x5 0x3 0x5 0xa 0x32 + launchtask AnimTask_HorizontalShake 0x5 0x3 0x4 0xa 0x32 + call ThousandArrowsDown + call ThousandArrowsDown + call ThousandArrowsDown + call ThousandArrowsDown + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0xffff + waitforvisualfinish + clearmonbg ANIM_ATTACKER + blendoff + end +ThousandArrowsHexes: + launchtemplate gThousandArrowsGreenHexTemplate 0x82, 0x3, 0x0 0xfffc 0xfff0 + playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gThousandArrowsGreenHexTemplate 0x82, 0x3, 0x0 0x100D 0xfff0 + playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gThousandArrowsGreenHexTemplate 0x82, 0x3, 0x0 0x4 0xfff4 + playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gThousandArrowsGreenHexTemplate 0x82, 0x3, 0x0 0xfff0 0xfff0 + playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER + delay 0x2 + return +ThousandArrowsDown: + launchtemplate gThousandArrowsGreenArrowTemplate 0x82, 0x3, 0x1 0xdc 0x3c + playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gThousandArrowsGreenArrowTemplate 0x82, 0x3, 0x1 0x3c 0x64 + playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gThousandArrowsGreenArrowTemplate 0x82, 0x3, 0x1 0x8c 0x37 + playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gThousandArrowsGreenArrowTemplate 0x82, 0x3, 0x1 0xb4 0x32 + playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gThousandArrowsGreenArrowTemplate 0x82, 0x3, 0x1 0x14 0x5a + playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gThousandArrowsGreenArrowTemplate 0x82, 0x3, 0x1 0x5a 0x5a + playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gThousandArrowsGreenArrowTemplate 0x82, 0x3, 0x1 0xa0 0x3c + playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gThousandArrowsGreenArrowTemplate 0x82, 0x3, 0x1 0x1e 0x5a + playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gThousandArrowsGreenArrowTemplate 0x82, 0x3, 0x1 0x78 0x3c + playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gThousandArrowsGreenArrowTemplate 0x82, 0x3, 0x1 0xc8 0x28 + playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER + return + + +Move_THOUSAND_WAVES:: + loadspritegfx ANIM_TAG_ZYGARDE_HEXES @Hex + loadspritegfx ANIM_TAG_FLYING_DIRT @heat wave animation + loadspritegfx ANIM_TAG_LEAF @green color + loadspritegfx ANIM_TAG_IMPACT @pound hits + monbg ANIM_ATK_PARTNER + setalpha 8, 8 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER + launchtemplate gThousandWavesGreenWheelTemplate 0x2 0x1 0x0 + launchtemplate gThousandWavesGreenWheelTemplate 0x2 0x1 0x2b + launchtemplate gThousandWavesGreenWheelTemplate 0x2 0x1 0x55 + launchtemplate gThousandWavesGreenWheelTemplate 0x2 0x1 0x80 + launchtemplate gThousandWavesGreenWheelTemplate 0x2 0x1 0xaa + launchtemplate gThousandWavesGreenWheelTemplate 0x2 0x1 0xd5 + waitforvisualfinish + clearmonbg ANIM_ATK_PARTNER @I placed this one here, because it ruins the teleport animation + loopsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET, 0x3, 0x15 + call ThousandWavesRecover + launchtemplate gThousandWavesGreenRecoverTemplate 0x2 0x3 0x28 0xfff6 0xd + delay 0x3 + launchtemplate gThousandWavesGreenRecoverTemplate 0x2 0x3 0xffdd 0x8 0xd + delay 0x3 + launchtemplate gThousandWavesGreenRecoverTemplate 0x2 0x3 0xffdd 0xfff6 0xd + delay 0x3 + launchtemplate gThousandWavesGreenRecoverTemplate 0x2 0x3 0x28 0x8 0xd + delay 0x3 + launchtemplate gThousandWavesGreenRecoverTemplate 0x2 0x3 0xf 0xffd8 0xd + delay 0x3 + launchtemplate gThousandWavesGreenRecoverTemplate 0x2 0x3 0xfff6 0xffe0 0xd + delay 0x3 + launchtemplate gThousandWavesGreenRecoverTemplate 0x2 0x3 0x5 0x27 0xd + delay 0x3 + launchtemplate gThousandWavesGreenRecoverTemplate 0x2 0x3 0x19 0xffec 0xd + delay 0x3 + launchtemplate gThousandWavesGreenRecoverTemplate 0x2 0x3 0xffd8 0xffec 0xd + delay 0x3 + launchtask AnimTask_AttackerStretchAndDisappear 0x2 0x0 + playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER + launchtemplate gThousandWavesGreenRecoverTemplate 0x2 0x3 0x5 0xffd8 0xd + waitforvisualfinish + panse_1B SE_M_HYPER_BEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 + delay 0x4 + launchtask AnimTask_MoveHeatWaveTargets 0x5 0x0 + delay 0xc + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + launchtemplate gThousandWavesGreenWaveTemplate 0x28 0x4 0xa 0x900 0x60 0x1 + delay 0x2 + launchtemplate gThousandWavesGreenWaveTemplate 0x28 0x4 0x5a 0x800 0x60 0x1 + delay 0x2 + launchtemplate gThousandWavesGreenWaveTemplate 0x28 0x4 0x32 0xa00 0x60 0x1 + delay 0x2 + launchtemplate gThousandWavesGreenWaveTemplate 0x28 0x4 0x14 0x900 0x60 0x1 + delay 0x2 + call ThousandWavesRotatingImpact + call ThousandWavesRotatingImpact + waitforvisualfinish + launchtask AnimTask_ExtremeSpeedMonReappear 0x2 0x0 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0xffff + waitforvisualfinish + blendoff + clearmonbg ANIM_DEF_PARTNER + end +ThousandWavesRecover: + launchtemplate gThousandWavesGreenRecoverTemplate 0x2 0x3 0x28 0x28 0x10 + delay 0x2 + launchtemplate gThousandWavesGreenRecoverTemplate 0x2 0x3 0xffd8 0xffd8 0x10 + delay 0x2 + launchtemplate gThousandWavesGreenRecoverTemplate 0x2 0x3 0x0 0x28 0x10 + delay 0x2 + launchtemplate gThousandWavesGreenRecoverTemplate 0x2 0x3 0x0 0xffd8 0x10 + delay 0x2 + launchtemplate gThousandWavesGreenRecoverTemplate 0x2 0x3 0x28 0xffec 0x10 + delay 0x2 + launchtemplate gThousandWavesGreenRecoverTemplate 0x2 0x3 0x28 0x14 0x10 + delay 0x2 + launchtemplate gThousandWavesGreenRecoverTemplate 0x2 0x3 0xffd8 0xffec 0x10 + delay 0x2 + launchtemplate gThousandWavesGreenRecoverTemplate 0x2 0x3 0xffd8 0x14 0x10 + delay 0x2 + launchtemplate gThousandWavesGreenRecoverTemplate 0x2 0x3 0xffec 0x1e 0x10 + delay 0x2 + launchtemplate gThousandWavesGreenRecoverTemplate 0x2 0x3 0x14 0xffe2 0x10 + delay 0x2 + launchtemplate gThousandWavesGreenRecoverTemplate 0x2 0x3 0xffec 0xffe2 0x10 + delay 0x2 + launchtemplate gThousandWavesGreenRecoverTemplate 0x2 0x3 0x14 0x1e 0x10 + delay 0x2 + launchtemplate gThousandWavesGreenRecoverTemplate 0x2 0x3 0xffd8 0x0 0x10 + delay 0x2 + launchtemplate gThousandWavesGreenRecoverTemplate 0x2 0x3 0x28 0x0 0x10 + delay 0x2 + return +ThousandWavesRotatingImpact: + launchtemplate gThousandWavesRotatingImpactTemplate 0x82 0x7 0x23 0x1c 0x180 0x32 0x8 0x32 0x1 @1 + launchtemplate gThousandWavesGreenWaveTemplate 0x28 0x4 0x46 0x7c0 0x60 0x1 + delay 0x2 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + launchtemplate gThousandWavesPoundImpactTemplate 0x82, 0x4, 0x1 0x0 0x0 0x3 + launchtemplate gThousandWavesRotatingImpactTemplate 0x82 0x7 0x23 0x20 0xf0 0x28 0xb 0xffd2 0x1 @2 + launchtemplate gThousandWavesGreenWaveTemplate 0x28 0x4 0x0 0xb00 0x60 0x1 + delay 0x2 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + launchtemplate gThousandWavesPoundImpactTemplate 0x82, 0x4, 0x1 0x5 0xfff4 0x3 + launchtemplate gThousandWavesRotatingImpactTemplate 0x82 0x7 0x23 0x21 0x1a0 0x28 0x4 0x2a 0x1 @3 + launchtemplate gThousandWavesGreenWaveTemplate 0x28 0x4 0x3c 0xa00 0x60 0x1 + delay 0x2 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + launchtemplate gThousandWavesPoundImpactTemplate 0x82, 0x4, 0x1 0xfffa 0x9 0x3 + launchtemplate gThousandWavesRotatingImpactTemplate 0x82 0x7 0x23 0x1f 0x120 0x2d 0x6 0xffd6 0x1 @4 + launchtemplate gThousandWavesGreenWaveTemplate 0x28 0x4 0xa 0x900 0x60 0x1 + delay 0x2 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + launchtemplate gThousandWavesPoundImpactTemplate 0x82, 0x4, 0x1 0xfffa 0xfff4 0x3 + launchtemplate gThousandWavesRotatingImpactTemplate 0x82 0x7 0x23 0x1c 0x1c0 0x2d 0xb 0x2e 0x1 @5 + launchtemplate gThousandWavesGreenWaveTemplate 0x28 0x4 0x5a 0x800 0x60 0x1 + delay 0x2 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + launchtemplate gThousandWavesPoundImpactTemplate 0x82, 0x4, 0x1 0x5 0x9 0x3 + launchtemplate gThousandWavesRotatingImpactTemplate 0x82 0x7 0x23 0x21 0x1d0 0x32 0xa 0xffce 0x1 @6 + launchtemplate gThousandWavesGreenWaveTemplate 0x28 0x4 0x32 0xa00 0x60 0x1 + delay 0x2 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + launchtemplate gThousandWavesPoundImpactTemplate 0x82, 0x4, 0x1 0xfffa 0x0 0x3 + return + + +Move_LANDS_WRATH:: + loadspritegfx ANIM_TAG_WATER_ORB @whirl motion + loadspritegfx ANIM_TAG_SPARK_2 @yellow color + monbg ANIM_ATTACKER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xE 0x0 + waitforvisualfinish + call LandsWrathVortex + call LandsWrathVortex + call LandsWrathVortex + call LandsWrathVortex + waitforvisualfinish + fadetobg BG_FISSURE + waitbgfadeout + playsewithpan SE_M_EARTHQUAKE, 0x0 + launchtask AnimTask_HorizontalShake 0x5 0x3 0x5 0xa 0x32 + launchtask AnimTask_HorizontalShake 0x5 0x3 0x4 0xa 0x32 + launchtask AnimTask_PositionFissureBgOnBattler 0x5 0x3 0x1 0x5 0xffff + waitbgfadein + waitforvisualfinish + call UnsetPsychicBg + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x0 0x0 + clearmonbg ANIM_ATTACKER + end +LandsWrathVortex: + playsewithpan SE_M_SACRED_FIRE2 SOUND_PAN_TARGET + launchtemplate gLandsWrathVortexTemplate 0x82 0x7 0x0 0x1c 0x180 0x32 0x8 0x32 0x0 + delay 0x2 + launchtemplate gLandsWrathVortexTemplate 0x82 0x7 0x0 0x20 0xf0 0x28 0xb 0xffd2 0x0 + delay 0x2 + launchtemplate gLandsWrathVortexTemplate 0x82 0x7 0x0 0x21 0x1a0 0x28 0x4 0x2a 0x0 + delay 0x2 + launchtemplate gLandsWrathVortexTemplate 0x82 0x7 0x0 0x1f 0x120 0x2d 0x6 0xffd6 0x0 + delay 0x2 + launchtemplate gLandsWrathVortexTemplate 0x82 0x7 0x0 0x1c 0x1c0 0x2d 0xb 0x2e 0x0 + delay 0x2 + launchtemplate gLandsWrathVortexTemplate 0x82 0x7 0x0 0x21 0x1d0 0x32 0xa 0xffce 0x0 + delay 0x2 + return + + +Move_LIGHT_OF_RUIN:: + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge + loadspritegfx ANIM_TAG_ELECTRIC_ORBS @launchtask particles + loadspritegfx ANIM_TAG_ORBS @beam particles + loadspritegfx ANIM_TAG_ELECTRICITY @discharge + loadspritegfx ANIM_TAG_PINK_PETAL @pink color + loadspritegfx ANIM_TAG_EXPLOSION @explosion + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRIC_ORBS, 0, 0xC, 0xC, 0x6DDE @Pink + waitforvisualfinish + launchtask AnimTask_ElectricChargingParticles 0x2 0x4 0x0 0x14 0x0 0x2 + panse_1B SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xF 0x6B1F + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_ATTACKER 0x0 0x4 0x32 0x1 + createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_ORBS, 1, 12, 0x1f, 0x10, 0, 0 + call LightOfRuinBeam + call LightOfRuinBeam + call LightOfRuinBeam + call LightOfRuinBeam + call LightOfRuinBeam + launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0x4 0x0 0x32 0x1 + call LightOfRuinBeam + call LightOfRuinBeam + call LightOfRuinBeam + call LightOfRuinBeam + call LightOfRuinBeam + call LightOfRuinBeam + call LightOfRuinBeam + call LightOfRuinBeam + call LightOfRuinBeam + call LightOfRuinBeam + call LightOfRuinBeam + call LightOfRuinBeam + call LightOfRuinBeam + call LightOfRuinBeam + call LightOfRuinBeam + call LightOfRuinBeam + call LightOfRuinBeam + call LightOfRuinBeam + call LightOfRuinBeam + call LightOfRuinBeam + call LightOfRuinBeam + delay 0x20 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + launchtemplate gLightOfRuinPinkDischargeTemplate 0x2 0x3 0x1 0x10 0x10 + delay 0x2 + launchtemplate gLightOfRuinPinkDischargeTemplate 0x2 0x3 0x1 0xfff0 0xfff0 + delay 0x5 + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_TARGET 0x0 0x5 0xb 0x1 + launchtemplate gLightOfRuinPinkExplosionTemplate 0x3 0x4 0x0 0x0 0x1 0x1 + delay 0x10 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x10 0x0 0x7FFF + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ALL_BATTLERS 0x1 0x0 0x0 0x0 + waitforvisualfinish + end +LightOfRuinBeam: + launchtemplate gLightOfRuinPinkOrbsTemplate 0x82 0x0 + launchtemplate gLightOfRuinPinkOrbsTemplate 0x82 0x0 + delay 0x1 + return + + +Move_ORIGIN_PULSE:: + loadspritegfx ANIM_TAG_THIN_RING @uproar + loadspritegfx ANIM_TAG_WATER_ORB @blue color + loadspritegfx ANIM_TAG_ORBS @circles + loadspritegfx ANIM_TAG_GREEN_SPIKE @inward + loadspritegfx ANIM_TAG_IMPACT @hits + setalpha 8, 8 + fadetobg BG_WATER + waitbgfadeout + launchtask AnimTask_StartSlidingBg 0x5 0x4 0x400 0x0 0x1 0xffff + waitbgfadein + launchtemplate gOriginPulseRingTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1F 0x8 + playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER + delay 0x10 + launchtemplate gOriginPulseRingTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1F 0x8 + delay 0x10 + launchtemplate gOriginPulseRingTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1F 0x8 + playsewithpan SE_INTRO_BLAST, SOUND_PAN_ATTACKER + waitforvisualfinish + launchtemplate gOriginPulseOrbTemplate 0x2 0x1 0x0 + launchtemplate gOriginPulseOrbTemplate 0x2 0x1 0x2b + launchtemplate gOriginPulseOrbTemplate 0x2 0x1 0x55 + launchtemplate gOriginPulseOrbTemplate 0x2 0x1 0x80 + launchtemplate gOriginPulseOrbTemplate 0x2 0x1 0xaa + launchtemplate gOriginPulseOrbTemplate 0x2 0x1 0xd5 + delay 0x35 + launchtemplate gOriginPulseRingTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1F 0x8 + delay 0x10 + launchtemplate gOriginPulseRingTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1F 0x8 + waitforvisualfinish + delay 0x2F + launchtemplate gOriginPulseOrbInwardTemplate 0x82 0x5 0x1 0x0 0x0 0xFF90 0x10 @up + launchtemplate gOriginPulseOrbInwardTemplate 0x82 0x5 0x1 0x0 0x5F 0xFF9D 0x10 @upper right + launchtemplate gOriginPulseOrbInwardTemplate 0x82 0x5 0x1 0x0 0x73 0x0 0x10 @right + launchtemplate gOriginPulseOrbInwardTemplate 0x82 0x5 0x1 0x0 0x4F 0x37 0x10 @lower right + launchtemplate gOriginPulseOrbInwardTemplate 0x82 0x5 0x1 0x0 0x0 0x53 0x10 @down + launchtemplate gOriginPulseOrbInwardTemplate 0x82 0x5 0x1 0x0 0xFFB0 0x43 0x10 @lower left + launchtemplate gOriginPulseOrbInwardTemplate 0x82 0x5 0x1 0x0 0xFF60 0x0 0x10 @left + launchtemplate gOriginPulseOrbInwardTemplate 0x82 0x5 0x1 0x0 0xFFAA 0xFF94 0x10 @upper left + delay 0x5 + launchtemplate gOriginPulseOrbInwardTemplate 0x82 0x5 0x1 0x0 0x2D 0xFF9D 0x10 @between up and upper right + launchtemplate gOriginPulseOrbInwardTemplate 0x82 0x5 0x1 0x0 0xDF 0xFF9D 0x10 @between right and upper right + launchtemplate gOriginPulseOrbInwardTemplate 0x82 0x5 0x1 0x0 0x9F 0x37 0x10 @between right and lower right + launchtemplate gOriginPulseOrbInwardTemplate 0x82 0x5 0x1 0x0 0x1F 0x37 0x10 @between lower right and down + launchtemplate gOriginPulseOrbInwardTemplate 0x82 0x5 0x1 0x0 0xFFE0 0x43 0x10 @between lower left and down + launchtemplate gOriginPulseOrbInwardTemplate 0x82 0x5 0x1 0x0 0xFF60 0x43 0x10 @between left and lower left + launchtemplate gOriginPulseOrbInwardTemplate 0x82 0x5 0x1 0x0 0xFF2A 0xFFAA 0x10 @between left and upper left + launchtemplate gOriginPulseOrbInwardTemplate 0x82 0x5 0x1 0x0 0xFFDA 0xFF94 0x10 @between up and upper left + waitforvisualfinish + monbg ANIM_DEF_PARTNER + launchtemplate gOriginPulseBasicSplatTemplate 0x83 0x4 0xffb0 0xfff0 0x1 0x1 + stopsound + playsewithpan SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER + delay 0x5 + launchtemplate gOriginPulseBlueImpactTemplate 0x83 0x2 0x1 0x1 + delay 0x5 + launchtemplate gOriginPulseBasicSplatTemplate 0x83 0x4 0x0 0x0 0x1 0x1 + delay 0x5 + launchtemplate gOriginPulseBlueImpactTemplate 0x83 0x2 0x1 0x1 + delay 0x5 + launchtemplate gOriginPulseBasicSplatTemplate 0x83 0x4 0xffc0 0x14 0x1 0x1 + delay 0x5 + launchtemplate gOriginPulseBlueImpactTemplate 0x83 0x2 0x1 0x1 + delay 0x5 + launchtemplate gOriginPulseBasicSplatTemplate 0x83 0x4 0xffe0 0x5 0x1 0x1 + waitsound + call UnsetPsychicBg + clearmonbg ANIM_DEF_PARTNER + blendoff + end + + +Move_PRECIPICE_BLADES:: + loadspritegfx ANIM_TAG_LARGE_SPIKE + loadspritegfx ANIM_TAG_FIRE_PLUME + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_LARGE_SPIKE, 0, 10, 10, 0x159F @Blood orange + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + fadetobg 0x15 + waitbgfadeout + launchtask AnimTask_PositionFissureBgOnBattler 0x5 0x3 0x1 0x5 0xffff + launchtask AnimTask_HorizontalShake 0x5 0x3 0x5 0xa 0x5 + launchtask AnimTask_HorizontalShake 0x5 0x3 0x4 0xa 0x5 + playsewithpan SE_M_EARTHQUAKE, 0x0 + launchtask AnimTask_IsTargetPlayerSide 0x2 0x0 + jumpargeq 0x7, ANIM_TARGET, PrecipiceBladesOpponent +PrecipiceBladesPlayer: + launchtemplate gPrecipiceBladesSpikeTemplate 3, 0x5, ANIM_ATTACKER, -45, 5, 145 0x0 + delay 10 + launchtemplate gPrecipiceBladesSpikeTemplate 3, 0x5, ANIM_ATTACKER, 10, 7, 135 0x0 + delay 10 + launchtemplate gPrecipiceBladesSpikeTemplate 4, 0x5, ANIM_ATTACKER, -30, 15, 125 0x0 + delay 5 + launchtemplate gPrecipiceBladesSpikeTemplate 5, 0x5, ANIM_ATTACKER, -10, 17, 120 0x0 +PrecipiceBladesContinue: + delay 0x10 + launchtemplate gPrecipiceBladesPlumeTemplate 0x82, 0x3, -15, 18, ANIM_TARGET + launchtemplate gPrecipiceBladesPlumeTemplate 0x82, 0x3, -15, 18, ANIM_DEF_PARTNER + delay 0x20 + launchtemplate gPrecipiceBladesPlumeTemplate 0x82, 0x3, 15, 18, ANIM_TARGET + launchtemplate gPrecipiceBladesPlumeTemplate 0x82, 0x3, 15, 18, ANIM_DEF_PARTNER + delay 0x20 + stopsound + playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET + launchtemplate gPrecipiceBladesLargeSpikeTemplate 0x82, 0x5, ANIM_TARGET, 0, -25, 40, 0x0 + launchtemplate gPrecipiceBladesLargeSpikeTemplate 0x82, 0x5, ANIM_DEF_PARTNER, 0, -25, 40, 0x0 + delay 0x6 + launchtemplate gSlideMonToOffsetSpriteTemplate 0x82, 0x5, ANIM_TARGET, -20 0 0x6 0x1 + launchtemplate gSlideMonToOffsetSpriteTemplate 0x82, 0x5, ANIM_DEF_PARTNER, -20 0 0x6 0x1 + delay 0x22 + launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x82, 0x3 ANIM_TARGET 0x0 0x6 + launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x82, 0x3 ANIM_DEF_PARTNER 0x0 0x6 + waitforvisualfinish + call UnsetPsychicBg + clearmonbg ANIM_DEF_PARTNER + blendoff + end +PrecipiceBladesOpponent: + launchtemplate gPrecipiceBladesSpikeTemplate 0x43, 0x5, ANIM_ATTACKER, 35, -5, 145 0x0 + delay 10 + launchtemplate gPrecipiceBladesSpikeTemplate 0x43, 0x5, ANIM_ATTACKER, -20, -7, 135 0x0 + delay 10 + launchtemplate gPrecipiceBladesSpikeTemplate 0x44, 0x5, ANIM_ATTACKER, 20, -15, 125 0x0 + delay 5 + launchtemplate gPrecipiceBladesSpikeTemplate 0x45, 0x5, ANIM_ATTACKER, 0, -17, 120 0x0 + goto PrecipiceBladesContinue + + +Move_DRAGON_ASCENT:: + loadspritegfx ANIM_TAG_DRAGON_ASCENT + loadspritegfx ANIM_TAG_IMPACT + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 11, 11, RGB(16, 31, 16) + fadetobg BG_COSMIC + waitbgfadeout + launchtask AnimTask_StartSlidingBg, 0x2 0x4, 0, 128, 0, -1 + waitbgfadein + playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER + invisible ANIM_ATTACKER + launchtemplate gDragonAscentFlyUpTemplate 0x2 0x7 0x0 0x0 0x400 0x24 0x15 0x1 ANIM_ATTACKER + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal, 0xa 0x5, (ANIM_PAL_ATK | ANIM_PAL_BG | ANIM_PAL_BG_4 | ANIM_PAL_BG_5), 4, 0, 14, RGB(21, 31, 27) + playsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER + waitforvisualfinish + playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER + launchtask AnimTask_StartSlidingBg, 0x5 0x4, -7304, -784, 1, -1 + delay 2 + launchtask AnimTask_BlendBattleAnimPal, 0xa 0x5, (ANIM_PAL_ATK | ANIM_PAL_BG | ANIM_PAL_BG_4 | ANIM_PAL_BG_5), 0, 14, 0, RGB(21, 31, 27) + waitforvisualfinish + delay 1 + monbg ANIM_DEF_PARTNER + setalpha 12, 8 + playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER + launchtemplate gDragonAscentDrakeTemplate, 2, 0x1 5 + delay 1 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + launchtemplate gBasicHitSplatSpriteTemplate, 0x84, 0x4, -10, 0, 1, 0 + launchtemplate gSlideMonToOffsetSpriteTemplate, 2, 0x5, 0x1, -32, 0, 0, 3 + launchtask AnimTask_ShakeMonInPlace, 0x2 0x5, ANIM_TARGET, 6, 0, 12, 1 + launchtask AnimTask_BlendBattleAnimPal, 0xa 0x5, (ANIM_PAL_ATK | ANIM_PAL_BG | ANIM_PAL_BG_4 | ANIM_PAL_BG_5), 2, 16, 0, RGB(26, 31, 0) + waitforvisualfinish + delay 3 + launchtemplate gSlideMonToOriginalPosSpriteTemplate, 2, 0x3, 1, 0, 7 + waitforvisualfinish + blendoff + clearmonbg ANIM_DEF_PARTNER + call UnsetPsychicBg + end + + +Move_HYPERSPACE_FURY:: + loadspritegfx ANIM_TAG_HOOPA_HAND @Hoopa Hand + loadspritegfx ANIM_TAG_HOOPA_RING @Hoopa Ring + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_POISON_BUBBLE + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xA 0x0 + waitforvisualfinish + playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER + launchtemplate gHyperspaceFuryRingTemplate 0x3 0x4 0x0 0x0 0x38 0x0 + delay 0x5 + launchtemplate gHyperspaceFuryRingTemplate 0x3 0x4 0x0 0x0 0x38 0x4 + delay 0x5 + launchtemplate gHyperspaceFuryRingTemplate 0x3 0x4 0x0 0x0 0x38 0x8 + delay 0x5 + launchtemplate gHyperspaceFuryRingTemplate 0x3 0x4 0x0 0x0 0x38 0xc + delay 0x5 + launchtemplate gHyperspaceFuryRingTemplate 0x3 0x4 0x0 0x0 0x38 0x10 + delay 0x15 + invisible ANIM_ATTACKER + waitforvisualfinish + fadetobg BG_HYPERSPACE_FURY + waitbgfadeout + launchtask AnimTask_SetPsychicBackground 0x5 0x0 + waitbgfadein + loopsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET, 0x2, 0x10 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0 0x3 0x20 0x1 + launchtemplate gHyperspaceFuryHandTemplate 0x82 0x5 0x1 0x0 0x0 0xffe0 0x10 + call HyperspaceFuryRandomImpact + delay 0x2 + launchtemplate gHyperspaceFuryHandTemplate 0x82 0x5 0x1 0x0 0x16 0xffea 0x10 + call HyperspaceFuryRandomImpact + delay 0x2 + launchtemplate gHyperspaceFuryHandTemplate 0x82 0x5 0x1 0x0 0x1e 0x0 0x10 + call HyperspaceFuryRandomImpact + delay 0x2 + launchtask AnimTask_IsTargetSameSide 0x2 0x0 + launchtask AnimTask_SnatchOpposingMonMove 0x2 0x0 + launchtemplate gHyperspaceFuryHandTemplate 0x82 0x5 0x1 0x0 0x14 0x14 0x10 + call HyperspaceFuryRandomImpact + delay 0x2 + launchtemplate gHyperspaceFuryHandTemplate 0x82 0x5 0x1 0x0 0x0 0x1c 0x10 + call HyperspaceFuryRandomImpact + delay 0x2 + launchtemplate gHyperspaceFuryHandTemplate 0x82 0x5 0x1 0x0 0xffed 0x13 0x10 + call HyperspaceFuryRandomImpact + delay 0x2 + launchtemplate gHyperspaceFuryHandTemplate 0x82 0x5 0x1 0x0 0xffe5 0x0 0x10 + call HyperspaceFuryRandomImpact + delay 0x2 + launchtemplate gHyperspaceFuryHandTemplate 0x82 0x5 0x1 0x0 0xffee 0xffee 0x10 + call HyperspaceFuryRandomImpact + delay 0x2 + launchtemplate gHyperspaceFuryHandTemplate 0x82 0x5 0x1 0x0 0x0 0xffe7 0x10 + call HyperspaceFuryRandomImpact + delay 0x2 + launchtemplate gHyperspaceFuryHandTemplate 0x82 0x5 0x1 0x0 0x11 0xffef 0x10 + call HyperspaceFuryRandomImpact + delay 0x2 + launchtemplate gHyperspaceFuryHandTemplate 0x82 0x5 0x1 0x0 0x17 0x0 0x10 + call HyperspaceFuryRandomImpact + delay 0x2 + launchtemplate gHyperspaceFuryHandTemplate 0x82 0x5 0x1 0x0 0x10 0x10 0x10 + call HyperspaceFuryRandomImpact + delay 0x7 + launchtask SoundTask_PlayDoubleCry 0x2 0x2 ANIM_ATTACKER 0xff + visible ANIM_ATTACKER + launchtask AnimTask_ShakeMon2 0x2 0x5 ANIM_TARGET 0x0 0x3 0x20 0x1 + playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET + invisible ANIM_ATTACKER + call UnsetPsychicBg + waitforvisualfinish + visible ANIM_ATTACKER + delay 0x1 + invisible ANIM_ATTACKER + delay 0x1 + visible ANIM_ATTACKER + delay 0x1 + invisible ANIM_ATTACKER + delay 0x1 + visible ANIM_ATTACKER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x0 0x0 + end +HyperspaceFuryRandomImpact: + launchtemplate gHyperspaceFuryImpactTemplate 0x83 0x2 0x1 0x1 + return + + +@@@@@@@@@@@@@@@@@@@@@@@ GEN 7 @@@@@@@@@@@@@@@@@@@@@@@ +Move_SHORE_UP:: + loadspritegfx ANIM_TAG_FLYING_DIRT @sandstorm + loadspritegfx ANIM_TAG_BLUE_STAR @heal2 + playsewithpan SE_M_SANDSTORM, 0x0 + launchtask AnimTask_LoadSandstormBackground 0x5 0x1 0x0 + delay 0x10 + launchtemplate gFlyingSandCrescentSpriteTemplate 0x28 0x4 0xa 0x900 0x60 0x0 + delay 0xa + launchtemplate gFlyingSandCrescentSpriteTemplate 0x28 0x4 0x5a 0x800 0x60 0x0 + delay 0xa + launchtemplate gFlyingSandCrescentSpriteTemplate 0x28 0x4 0x32 0xa00 0x60 0x0 + delay 0xa + launchtemplate gFlyingSandCrescentSpriteTemplate 0x28 0x4 0x14 0x900 0x60 0x0 + delay 0xa + launchtemplate gFlyingSandCrescentSpriteTemplate 0x28 0x4 0x46 0x7c0 0x60 0x0 + delay 0xa + launchtemplate gFlyingSandCrescentSpriteTemplate 0x28 0x4 0x0 0xb00 0x60 0x0 + delay 0xa + launchtemplate gFlyingSandCrescentSpriteTemplate 0x28 0x4 0x3c 0xa00 0x60 0x0 + call HealingEffect + waitforvisualfinish + end + + +Move_FIRST_IMPRESSION:: + loadspritegfx ANIM_TAG_SWEAT_BEAD @astonish + loadspritegfx ANIM_TAG_IMPACT @pound hit + loadspritegfx ANIM_TAG_RAZOR_LEAF @green + launchtemplate gSprayWaterDropletSpriteTemplate 0x85 0x2 0x0 0x1 + playsewithpan SE_M_SKETCH, SOUND_PAN_TARGET + launchtemplate gSprayWaterDropletSpriteTemplate 0x85 0x2 0x1 0x1 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0x4 0x0 0x5 0x1 + launchtask AnimTask_StretchTargetUp 0x3 0x0 + waitforvisualfinish + delay 0x19 + launchtemplate gHorizontalLungeSpriteTemplate 0x2 0x2 0x4 0x6 + waitforvisualfinish + monbg ANIM_TARGET @This is placed here on purpose (to not ruin astonishs animation) + delay 0x1 + launchtemplate gFirstImpressionPoundTemplate 0x4 0x4 0xfff6 0x0 0x1 0x0 + loopsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET 0xA 0x2 + delay 0x1 + launchtemplate gSlideMonToOffsetSpriteTemplate 0x2 0x5 ANIM_TARGET 0xffe4 0x0 0x0 0x3 + waitforvisualfinish + launchtask AnimTask_ShakeMonInPlace 0x2 0x5 0x1 0x4 0x0 0xc 0x1 + waitforvisualfinish + delay 0xa + launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_ATTACKER 0x0 0x6 + delay 0x5 + launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_TARGET 0x0 0x6 + waitforvisualfinish + clearmonbg ANIM_TARGET + end + + +Move_BANEFUL_BUNKER:: + loadspritegfx ANIM_TAG_PROTECT @protect + loadspritegfx ANIM_TAG_POISON_BUBBLE @poison + monbg ANIM_ATK_PARTNER + monbgprio_28 ANIM_ATTACKER + waitplaysewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER 0x10 + launchtemplate gProtectSpriteTemplate 0x2 0x3 0x18 0x0 0x5a + launchtemplate gBanefulBunkerPoisonBubbleTemplate 0x2 0x4 0xa 0xa 0x19 0x0 + delay 0x4 + launchtemplate gBanefulBunkerPoisonBubbleTemplate 0x2 0x4 0xfff1 0x0 0x19 0x0 + delay 0x4 + launchtemplate gBanefulBunkerPoisonBubbleTemplate 0x2 0x4 0x14 0xa 0x19 0x0 + delay 0x4 + launchtemplate gBanefulBunkerPoisonBubbleTemplate 0x2 0x4 0x0 0xfff6 0x19 0x0 + delay 0x4 + launchtemplate gBanefulBunkerPoisonBubbleTemplate 0x2 0x4 0xfff6 0xf 0x19 0x0 + delay 0x4 + launchtemplate gBanefulBunkerPoisonBubbleTemplate 0x2 0x4 0x19 0x14 0x19 0x0 + delay 0x4 + launchtemplate gBanefulBunkerPoisonBubbleTemplate 0x2 0x4 0xffec 0x14 0x19 0x0 + delay 0x4 + launchtemplate gBanefulBunkerPoisonBubbleTemplate 0x2 0x4 0xc 0x0 0x19 0x0 + waitforvisualfinish + clearmonbg ANIM_ATK_PARTNER + end + + +Move_SPIRIT_SHACKLE:: + loadspritegfx ANIM_TAG_SPIRIT_ARROW @Arrow + loadspritegfx ANIM_TAG_CHAIN_LINK @Chain + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x10 0x0 + waitforvisualfinish + playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER + launchtemplate gSpiritShackleArrowTemplate 0x82 0x5 0x10 0x0 0x0 0x0 0xf + delay 0x8 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x3 0x0 0xa 0x1 + waitforvisualfinish + loopsewithpan SE_SHINY, SOUND_PAN_ATTACKER, 0x1c, 0x2 + launchtemplate gSpiritShackleChainTemplate 0x82 0x2 0xfff0 0xfff0 + delay 0x4 + launchtemplate gSpiritShackleChainTemplate 0x82 0x2 0xfff0 0x0 + delay 0x4 + launchtemplate gSpiritShackleChainTemplate 0x82 0x2 0xfff0 0x10 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x10 0x0 0x0 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + end + + +Move_DARKEST_LARIAT:: + fadetobg BG_DARK + waitbgfadeout + launchtask AnimTask_StartSlidingBg 0x5 0x4 0x0 0x0 0x0 0xffff + waitbgfadein + loadspritegfx ANIM_TAG_IMPACT @hit + loadspritegfx ANIM_TAG_POISON_BUBBLE @purple color + monbg ANIM_DEF_PARTNER + setalpha 12, 8 + playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER + waitplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET, 0xa + waitplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER, 0x14 + waitplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET, 0x1e + waitplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER, 0x28 + waitplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET, 0x32 + waitplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER, 0x3c + waitplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET, 0x46 + waitplaysewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER, 0x50 + waitplaysewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET, 0x5a + launchtask AnimTask_TranslateMonElliptical 0x2 0x5 0x0 0xffee 0x6 0x6 0x4 + launchtask AnimTask_TranslateMonElliptical 0x2 0x5 0x1 0x12 0x6 0x6 0x4 + call DarkestLariatImpact + call DarkestLariatImpact + call DarkestLariatImpact + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + call UnsetPsychicBg + end +DarkestLariatImpact: + launchtemplate gDarkestLariatImpactTemplate 0x3 0x4 0x0 0xfff4 0x1 0x1 + delay 0x8 + launchtemplate gDarkestLariatImpactTemplate 0x3 0x4 0xfff4 0x8 0x1 0x1 + delay 0x8 + launchtemplate gDarkestLariatImpactTemplate 0x3 0x4 0xc 0x0 0x1 0x1 + delay 0x8 + return + + +Move_SPARKLING_ARIA:: + loadspritegfx ANIM_TAG_WATER_ORB @blue color + loadspritegfx ANIM_TAG_BUBBLE @circles + loadspritegfx ANIM_TAG_HYDRO_PUMP @hydro pump + monbg ANIM_ATTACKER + setblends 0x80E + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xE 0x0 + waitforvisualfinish + launchtemplate gSparklingAriaBlueChargeTemplate 0x2 0x1 0x0 + call SparklingAriaCharge + call SparklingAriaCharge + call SparklingAriaCharge + waitforvisualfinish + delay 0x1E + playsewithpan SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER + call SparklingAriaRain + call SparklingAriaRain + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xE 0x0 0x0 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + blendoff + end +SparklingAriaRain: + launchtemplate gSparklingAriaRainTemplate 0x82, 0x3, 0x1 0xdc 0x3c + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x3 0x0 0x6 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_DEF_PARTNER 0x3 0x0 0x6 0x1 + delay 0x2 + launchtemplate gSparklingAriaBubbleRainTemplate 0x82, 0x3, 0x1 0x3c 0x64 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x3 0x0 0x6 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_DEF_PARTNER 0x3 0x0 0x6 0x1 + delay 0x2 + launchtemplate gSparklingAriaRainTemplate 0x82, 0x3, 0x1 0x8c 0x37 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x3 0x0 0x6 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_DEF_PARTNER 0x3 0x0 0x6 0x1 + delay 0x2 + launchtemplate gSparklingAriaRainTemplate 0x82, 0x3, 0x1 0xb4 0x32 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x3 0x0 0x6 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_DEF_PARTNER 0x3 0x0 0x6 0x1 + delay 0x2 + launchtemplate gSparklingAriaRainTemplate 0x82, 0x3, 0x1 0x14 0x5a + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x3 0x0 0x6 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_DEF_PARTNER 0x3 0x0 0x6 0x1 + delay 0x2 + launchtemplate gSparklingAriaBubbleRainTemplate 0x82, 0x3, 0x1 0x5a 0x5a + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x3 0x0 0x6 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_DEF_PARTNER 0x3 0x0 0x6 0x1 + delay 0x2 + launchtemplate gSparklingAriaRainTemplate 0x82, 0x3, 0x1 0xa0 0x3c + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x3 0x0 0x6 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_DEF_PARTNER 0x3 0x0 0x6 0x1 + delay 0x2 + launchtemplate gSparklingAriaRainTemplate 0x82, 0x3, 0x1 0x1e 0x5a + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x3 0x0 0x6 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_DEF_PARTNER 0x3 0x0 0x6 0x1 + delay 0x2 + launchtemplate gSparklingAriaRainTemplate 0x82, 0x3, 0x1 0x78 0x3c + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x3 0x0 0x6 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_DEF_PARTNER 0x3 0x0 0x6 0x1 + delay 0x2 + launchtemplate gSparklingAriaBubbleRainTemplate 0x82, 0x3, 0x1 0xc8 0x28 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x3 0x0 0x6 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_DEF_PARTNER 0x3 0x0 0x6 0x1 + delay 0x2 + return +SparklingAriaCharge: + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gSparklingAriaBubblesTemplate 0x2 0x4 0xa 0xa 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gSparklingAriaBubblesTemplate 0x2 0x4 0xfff1 0x0 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gSparklingAriaBubblesTemplate 0x2 0x4 0x14 0xa 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gSparklingAriaBubblesTemplate 0x2 0x4 0x0 0xfff6 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gSparklingAriaBubblesTemplate 0x2 0x4 0xfff6 0xf 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gSparklingAriaBubblesTemplate 0x2 0x4 0x19 0x14 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gSparklingAriaBubblesTemplate 0x2 0x4 0xffec 0x14 0x19 0x0 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_ATTACKER + launchtemplate gSparklingAriaBubblesTemplate 0x2 0x4 0xc 0x0 0x19 0x0 + delay 0x4 + return + + +Move_ICE_HAMMER:: + loadspritegfx ANIM_TAG_HORSESHOE_SIDE_FIST @punch + loadspritegfx ANIM_TAG_ICE_CRYSTALS @ice + loadspritegfx ANIM_TAG_ECLIPSING_ORB @gray color + loadspritegfx ANIM_TAG_BLACK_SMOKE @smoke + setalpha 12, 8 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET + launchtemplate gIceHammerPunchStompTemplate 0x83, 0x3 0x0 0xffe0 0xf + delay 0x13 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + launchtask AnimTask_SquishTarget 0x2 0x0 + launchtemplate gIceHammerSmokesTemplate 0x84, 0x5 0x0 0xfff4 0x68 0x0 0x4b + launchtemplate gIceHammerSmokesTemplate 0x84, 0x5 0x0 0xfff4 0x48 0x1 0x4b + launchtemplate gIceHammerSmokesTemplate 0x84, 0x5 0x0 0xfffa 0x38 0x1 0x4b + launchtemplate gIceHammerSmokesTemplate 0x84, 0x5 0x0 0xfffa 0x58 0x0 0x4b + launchtemplate gIceHammerSmokesTemplate 0x84, 0x5 0x0 0x0 0x38 0x0 0x4b + launchtemplate gIceHammerSmokesTemplate 0x84, 0x5 0x0 0x0 0x58 0x1 0x4b + launchtemplate gIceHammerSmokesTemplate 0x84, 0x5 0x0 0x6 0x48 0x0 0x4b + launchtemplate gIceHammerSmokesTemplate 0x84, 0x5 0x0 0x6 0x68 0x1 0x4b + launchtemplate gIceHammerSmokesTemplate 0x84, 0x5 0x0 0xc 0x48 0x0 0x4b + launchtemplate gIceHammerSmokesTemplate 0x84, 0x5 0x0 0xc 0x38 0x1 0x4b + launchtemplate gIceHammerSmokesTemplate 0x84, 0x5 0x0 0x12 0x50 0x0 0x4b + launchtemplate gIceHammerSmokesTemplate 0x84, 0x5 0x0 0x12 0x48 0x1 0x4b + call IceCrystalEffectShort + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 + waitforvisualfinish + blendoff + end + + +Move_FLORAL_HEALING:: + loadspritegfx ANIM_TAG_SPARKLE_2 @heal + loadspritegfx ANIM_TAG_FLOWER @flowers + loadspritegfx ANIM_TAG_LEAF @leaves + loadspritegfx ANIM_TAG_ORBS @circles + loadspritegfx ANIM_TAG_PINK_PETAL @pink particles + monbg ANIM_ATTACKER + monbg ANIM_TARGET + playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER + call CIRCLES_LEAVES + call CIRCLES_LEAVES + waitforvisualfinish + panse_1B SE_M_COMET_PUNCH, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 + playsewithpan SE_M_TWISTER, 0x0 + launchtemplate gSweetScentPetalSpriteTemplate 0x2 0x3 0x46 0x1 0x40 + delay 0x2 + launchtemplate gFloralHealingWindLeavesTemplate 0x2 0x3 0x3c 0x0 0x40 + delay 0x2 + launchtemplate gSweetScentPetalSpriteTemplate 0x2 0x3 0x50 0x1 0x40 + delay 0x2 + launchtemplate gFloralHealingWindLeavesTemplate 0x2 0x3 0x3a 0x0 0x78 + delay 0x2 + launchtemplate gSweetScentPetalSpriteTemplate 0x2 0x3 0x64 0x0 0x78 + delay 0x2 + launchtemplate gFloralHealingWindLeavesTemplate 0x2 0x3 0x5a 0x0 0x40 + delay 0x2 + launchtemplate gSweetScentPetalSpriteTemplate 0x2 0x3 0x30 0x0 0x40 @2 + delay 0x2 + launchtemplate gFloralHealingWindLeavesTemplate 0x2 0x3 0x5f 0x1 0x50 + delay 0x2 + launchtemplate gSweetScentPetalSpriteTemplate 0x2 0x3 0x64 0x0 0x78 + delay 0x2 + launchtemplate gFloralHealingWindLeavesTemplate 0x2 0x3 0x4b 0x1 0x40 + delay 0x2 + launchtemplate gSweetScentPetalSpriteTemplate 0x2 0x3 0x55 0x0 0x78 + delay 0x2 + loopsewithpan SE_M_POISON_POWDER, SOUND_PAN_TARGET, 0x12, 0xa + call FloralHealingSpores + call FloralHealingSpores + call FloralHealingSpores + waitforvisualfinish + playsewithpan SE_M_ABSORB_2, SOUND_PAN_ATTACKER + launchtemplate gGrantingStarsSpriteTemplate 0x10 0x7 0xfff1 0x0 0x1 0x0 0x20 0x3c 0x1 + delay 0x8 + launchtemplate gGrantingStarsSpriteTemplate 0x10 0x7 0xc 0xfffb 0x1 0x0 0x20 0x3c 0x1 + waitforvisualfinish + clearmonbg ANIM_TARGET + clearmonbg ANIM_ATTACKER + end +FloralHealingSpores: + launchtemplate gFloralHealingFlowerTemplate 0x2 0x5 0x0 0xffec 0x55 0x50 0x0 + launchtemplate gSweetScentPetalSpriteTemplate 0x2 0x3 0x46 0x1 0x40 + delay 0x2 + launchtemplate gFloralHealingWindLeavesTemplate 0x2 0x3 0x3c 0x0 0x40 + delay 0x2 + launchtemplate gSweetScentPetalSpriteTemplate 0x2 0x3 0x50 0x1 0x40 + delay 0x2 + launchtemplate gFloralHealingWindLeavesTemplate 0x2 0x3 0x3a 0x0 0x78 + delay 0x2 + launchtemplate gSweetScentPetalSpriteTemplate 0x2 0x3 0x64 0x0 0x78 + delay 0x2 + launchtemplate gFloralHealingWindLeavesTemplate 0x2 0x3 0x5a 0x0 0x40 + delay 0x3 + launchtemplate gFloralHealingFlowerTemplate 0x2 0x5 0x0 0xfff6 0xaa 0x50 0x0 + launchtemplate gSweetScentPetalSpriteTemplate 0x2 0x3 0x30 0x0 0x40 + delay 0x2 + launchtemplate gFloralHealingWindLeavesTemplate 0x2 0x3 0x5f 0x1 0x50 + delay 0x2 + launchtemplate gSweetScentPetalSpriteTemplate 0x2 0x3 0x64 0x0 0x78 + delay 0x2 + launchtemplate gFloralHealingWindLeavesTemplate 0x2 0x3 0x4b 0x1 0x40 + delay 0x2 + launchtemplate gSweetScentPetalSpriteTemplate 0x2 0x3 0x55 0x0 0x78 + delay 0x2 + launchtemplate gFloralHealingWindLeavesTemplate 0x2 0x3 0x46 0x1 0x40 + delay 0x3 + launchtemplate gFloralHealingFlowerTemplate 0x2 0x5 0x0 0xfff1 0x0 0x50 0x0 + launchtemplate gFloralHealingWindLeavesTemplate 0x2 0x3 0x3c 0x0 0x40 + delay 0x2 + launchtemplate gSweetScentPetalSpriteTemplate 0x2 0x3 0x50 0x1 0x40 + delay 0x2 + launchtemplate gFloralHealingWindLeavesTemplate 0x2 0x3 0x3a 0x0 0x78 + delay 0x2 + launchtemplate gSweetScentPetalSpriteTemplate 0x2 0x3 0x64 0x0 0x78 + delay 0x2 + launchtemplate gFloralHealingWindLeavesTemplate 0x2 0x3 0x5a 0x0 0x40 + delay 0x2 + launchtemplate gSweetScentPetalSpriteTemplate 0x2 0x3 0x30 0x0 0x40 + delay 0x3 + return +CIRCLES_LEAVES: + launchtemplate gFloralHealingOrbsTemplate 0x82 0x7 0x0 0x1c 0x180 0x32 0x8 0x32 0x0 + delay 0x2 + launchtemplate gFloralHealingLeavesTemplate 0x82 0x7 0x0 0x20 0xf0 0x28 0xb 0xffd2 0x0 + delay 0x2 + launchtemplate gFloralHealingOrbsTemplate 0x82 0x7 0x0 0x21 0x1a0 0x28 0x4 0x2a 0x0 + delay 0x2 + launchtemplate gFloralHealingLeavesTemplate 0x82 0x7 0x0 0x1f 0x120 0x2d 0x6 0xffd6 0x0 + delay 0x2 + launchtemplate gFloralHealingOrbsTemplate 0x82 0x7 0x0 0x1c 0x1c0 0x2d 0xb 0x2e 0x0 + delay 0x2 + launchtemplate gFloralHealingLeavesTemplate 0x82 0x7 0x0 0x21 0x1d0 0x32 0xa 0xffce 0x0 + delay 0x2 + return + + +Move_HIGH_HORSEPOWER:: + loadspritegfx ANIM_TAG_IMPACT @hit + loadspritegfx ANIM_TAG_HORSESHOE_SIDE_FIST @horseshoe + monbg ANIM_TARGET + delay 0x2 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x0 0x0 0x10 0x0 + setalpha 12, 8 + playsewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET + launchtemplate gHighHorsepowerHorseshoeTemplate 0x3 0x4 0x0 0x0 0x1 0x32 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0x0 0x7 0x7fff + delay 0x32 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + call SetImpactBackground + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0x0 0x0 0x1 0x0 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0x4 0x0 0x16 0x1 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0x0 0x0 0x7fff + launchtemplate gComplexPaletteBlendSpriteTemplate 0x2 0x7 0x1f 0x3 0x1 0x0 0x8 0x0 0x0 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + delay 0x2 + restorebg + waitbgfadein + end + + +Move_STRENGTH_SAP:: + loadspritegfx ANIM_TAG_GRAY_SMOKE @smoke + loadspritegfx ANIM_TAG_TEAL_ALERT @inward + loadspritegfx ANIM_TAG_RED_HEART @heart color + loadspritegfx ANIM_TAG_PINK_PETAL @pink color + loadspritegfx ANIM_TAG_ORBS @absorb + loadspritegfx ANIM_TAG_SPARKLE_2 @stars + monbg ANIM_DEF_PARTNER + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + launchtemplate gStrengthSapRedSmokeTemplate 0x82, 0x4, 0x8 0x3 0x1 0x0 + launchtemplate gStrengthSapRedInwardTemplate 0x4 0x3 0x46 0x0 0x6 + launchtemplate gStrengthSapRedInwardTemplate 0x4 0x3 0x28 0x28 0x6 + launchtemplate gStrengthSapRedInwardTemplate 0x4 0x3 0xa 0xffc4 0x6 + launchtemplate gStrengthSapRedInwardTemplate 0x4 0x3 0xffce 0xffd8 0x6 + launchtemplate gStrengthSapRedInwardTemplate 0x4 0x3 0xffd8 0x28 0x6 + launchtemplate gStrengthSapRedInwardTemplate 0x4 0x3 0x32 0xffce 0x6 + delay 0x2 + launchtemplate gStrengthSapRedSmokeTemplate 0x82, 0x4, 0xfff8 0xfff8 0x1 0x0 + launchtemplate gStrengthSapRedInwardTemplate 0x4 0x3 0x32 0xffe2 0x6 + launchtemplate gStrengthSapRedInwardTemplate 0x4 0x3 0x3c 0xa 0x6 + launchtemplate gStrengthSapRedInwardTemplate 0x4 0x3 0x0 0x3c 0x6 + launchtemplate gStrengthSapRedInwardTemplate 0x4 0x3 0x0 0xffd8 0x6 + launchtemplate gStrengthSapRedInwardTemplate 0x4 0x3 0xffc4 0x14 0x6 + launchtemplate gStrengthSapRedInwardTemplate 0x4 0x3 0xffc4 0xffe2 0x6 + delay 0x2 + launchtemplate gStrengthSapRedSmokeTemplate 0x82, 0x4, 0x8 0xfff8 0x1 0x0 + launchtemplate gStrengthSapRedInwardTemplate 0x4 0x3 0xffce 0x32 0x6 + launchtemplate gStrengthSapRedInwardTemplate 0x4 0x3 0xffc4 0x14 0x6 + launchtemplate gStrengthSapRedInwardTemplate 0x4 0x3 0xffd8 0xffd8 0x6 + launchtemplate gStrengthSapRedInwardTemplate 0x4 0x3 0x14 0xffc4 0x6 + launchtemplate gStrengthSapRedInwardTemplate 0x4 0x3 0x32 0xffce 0x6 + launchtemplate gStrengthSapRedInwardTemplate 0x4 0x3 0x23 0x28 0x6 + delay 0x2 + launchtemplate gStrengthSapRedSmokeTemplate 0x82, 0x4, 0xfff8 0x8 0x1 0x0 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x3 0x07FD + delay 0x5 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET + launchtemplate gStrengthSapAbsorbTemplate 0x3 0x4 0x0 0x5 0x8 0x1a + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET + launchtemplate gStrengthSapAbsorbTemplate 0x3 0x4 0xa 0xfffb 0xfff8 0x1a + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET + launchtemplate gStrengthSapAbsorbTemplate 0x3 0x4 0xfffb 0xf 0x10 0x21 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET + launchtemplate gStrengthSapAbsorbTemplate 0x3 0x4 0x0 0xfff1 0xfff0 0x24 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET + launchtemplate gStrengthSapAbsorbTemplate 0x3 0x4 0x0 0x5 0x8 0x1a + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET + launchtemplate gStrengthSapAbsorbTemplate 0x3 0x4 0xa 0xfffb 0xfff8 0x1a + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET + launchtemplate gStrengthSapAbsorbTemplate 0x3 0x4 0xfff6 0x14 0x14 0x27 + delay 0x4 + playsewithpan SE_M_CRABHAMMER, SOUND_PAN_TARGET + launchtemplate gStrengthSapAbsorbTemplate 0x3 0x4 0x5 0xffee 0xffec 0x23 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x3 0x0 0x07FD + loopsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER, 0x10, 0x3 + call GrantingStarsEffect + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + end + + +Move_SOLAR_BLADE:: + loadspritegfx ANIM_TAG_ORBS + choosetwoturnanim SolarBeamSetUp SolarBladeUnleash +SolarBladeUnleash: + loadspritegfx ANIM_TAG_SWORD @swords dance + loadspritegfx ANIM_TAG_CLAW_SLASH @blade hit + loadspritegfx ANIM_TAG_SPARK_2 @yellow color + loadspritegfx ANIM_TAG_SUNLIGHT @sun rays + monbg ANIM_ATTACKER + setblends 0x30d + createvisualtask AnimTask_BlendBattleAnimPal 10, (ANIM_PAL_BG | ANIM_PAL_ALL_BATTLERS), 1, 0, 6, 0x7fff + waitforvisualfinish + playsewithpan SE_M_SWORDS_DANCE, SOUND_PAN_ATTACKER + launchtask AnimTask_TranslateMonEllipticalRespectSide 0x2 0x5 0x0 0x10 0x6 0x1 0x4 + launchtemplate gSwordsDanceBladeSpriteTemplate 0x2 0x2 0x0 0x0 + call SolarBladeSunRays + call SolarBladeSunRays + call SolarBladeSunRays + call SolarBladeSunRays + launchtask AnimTask_FlashAnimTagWithColor 0x2 0x7 0x2715 0x2 0x2 0x7ff2 0x10 0x0 0x0 + waitforvisualfinish + call SetSolarbeamBg + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + launchtemplate gSolarBladeImpactTemplate 0x82, 0x3, 0x0 0x0 0x1 + delay 0x2 + launchtask AnimTask_ShakeMon2 0x2 0x5 ANIM_TARGET 0x2 0x0 0xC 0x1 + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal 10, (ANIM_PAL_BG | ANIM_PAL_ALL_BATTLERS), 1, 6, 0, 0x7fff + waitforvisualfinish + call UnsetPsychicBg + clearmonbg ANIM_ATTACKER + blendoff + end +SolarBladeSunRays: + launchtemplate gSunlightRaySpriteTemplate 0x28 0x0 + delay 0x6 + return + + +Move_LEAFAGE:: + loadspritegfx ANIM_TAG_RAZOR_LEAF @leaf + loadspritegfx ANIM_TAG_IMPACT @hit + monbg ANIM_DEF_PARTNER + playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER + launchtemplate gRazorLeafCutterSpriteTemplate 0x83 0x7 0x14 0xfff6 0x14 0x0 0x16 0x14 0x1 + launchtemplate gRazorLeafCutterSpriteTemplate 0x83 0x7 0x14 0xfff6 0x14 0x0 0x16 0xffec 0x1 + launchtemplate gRazorLeafCutterSpriteTemplate 0x83 0x7 0x14 0xfff6 0x14 0x0 0x16 0x0 0x1 + delay 0x14 + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + launchtemplate gLeafageImpactTemplate 0x2 0x4 0x0 0x0 0x1 0x2 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + end + + +Move_SPOTLIGHT:: + loadspritegfx ANIM_TAG_SPOTLIGHT + loadspritegfx ANIM_TAG_TAG_HAND + launchtask AnimTask_CreateSpotlight 0x2 0x0 + launchtask AnimTask_HardwarePaletteFade 0x2 0x5 0xf8 0x3 0x0 0xa 0x0 + waitforvisualfinish + playsewithpan SE_CONTEST_ICON_CHANGE, SOUND_PAN_ATTACKER + launchtemplate gSpotlightSpriteTemplate 0x82 0x2 0x0 0xfff8 + delay 0x40 + launchtask AnimTask_HardwarePaletteFade 0x2 0x5 0xf8 0x3 0xa 0x0 0x1 + waitforvisualfinish + launchtask AnimTask_RemoveSpotlight 0x2 0x0 + end + + +Move_TOXIC_THREAD:: + loadspritegfx ANIM_TAG_STRING + loadspritegfx ANIM_TAG_WEB_THREAD + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_STRING, 0, 0xA, 0xA, 0x6038 @Purple + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_WEB_THREAD, 0x0, 0xA, 0xA, 0x6038 @Purple + monbg ANIM_DEF_PARTNER + delay 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x9 0x0 + waitforvisualfinish + loopsewithpan SE_M_STRING_SHOT, SOUND_PAN_ATTACKER, 0x9, 0x6 + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + call SpiderWebThread + waitforvisualfinish + playsewithpan SE_M_STRING_SHOT2, SOUND_PAN_TARGET + launchtemplate gToxicThreadString 0x82 0x2 0x0 0xa + delay 0x4 + launchtemplate gToxicThreadString 0x82 0x2 0x0 0xfffe + delay 0x4 + launchtemplate gToxicThreadString 0x82 0x2 0x0 0x16 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + delay 0x1 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x9 0x0 0x0 + end + + +Move_LASER_FOCUS:: + loadspritegfx ANIM_TAG_EYE_SPARKLE @red + loadspritegfx ANIM_TAG_OPENING_EYE @eyes + loadspritegfx ANIM_TAG_LEER @leer + monbg ANIM_ATTACKER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + launchtemplate gLaserFocusRedEyesTemplate 0x5 0x4 0x0 0x0 0x0 0x0 + waitforvisualfinish + playsewithpan SE_M_LEER, SOUND_PAN_ATTACKER + launchtemplate gLeerSpriteTemplate 0x2 0x2 0x18 0xfff4 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + end + + +Move_GEAR_UP:: + loadspritegfx ANIM_TAG_GEAR + loadspritegfx ANIM_TAG_SPARK_2 @sparks + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 ANIM_PAL_ATK 0x2 0x0 0x9 0x039B + launchtemplate gGearUpGearsTemplate 0x2 0x4 0x0 0xffe8 0x8 0x8c + playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x20 0x18 0xbe 0xc 0x0 0x1 0x0 + delay 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x50 0x18 0x16 0xc 0x0 0x1 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x9c 0x18 0x79 0xd 0x0 0x1 0x1 + delay 0xF + playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER + launchtemplate gGearUpGearsTemplate 0x2 0x4 0x0 0xffe8 0x8 0x8c + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x64 0x18 0x3c 0xa 0x0 0x1 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0xaa 0x18 0x2a 0xb 0x0 0x1 0x1 + delay 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0xee 0x18 0xa5 0xa 0x0 0x1 0x1 + delay 0xF + playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER + launchtemplate gGearUpGearsTemplate 0x2 0x4 0x0 0xffe8 0x8 0x8c + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x20 0x18 0xbe 0xc 0x0 0x1 0x0 + delay 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x50 0x18 0x16 0xc 0x0 0x1 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x9c 0x18 0x79 0xd 0x0 0x1 0x1 + delay 0xF + playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER + call GearUpSparks + call GearUpSparks + call GearUpSparks + playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x20 0x18 0xbe 0xc 0x0 0x1 0x0 + delay 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x50 0x18 0x16 0xc 0x0 0x1 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x9c 0x18 0x79 0xd 0x0 0x1 0x1 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 ANIM_PAL_ATK 0x2 0x9 0x0 0x039B + waitforvisualfinish + end +GearUpSparks: + playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x20 0x18 0xbe 0xc 0x0 0x1 0x0 + delay 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x50 0x18 0x16 0xc 0x0 0x1 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x9c 0x18 0x79 0xd 0x0 0x1 0x1 + delay 0xF + playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x64 0x18 0x3c 0xa 0x0 0x1 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0xaa 0x18 0x2a 0xb 0x0 0x1 0x1 + delay 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0xee 0x18 0xa5 0xa 0x0 0x1 0x1 + delay 0xF + return + + +Move_THROAT_CHOP:: + loadspritegfx ANIM_TAG_HANDS_AND_FEET @karate chop + loadspritegfx ANIM_TAG_IMPACT @hit + loadspritegfx ANIM_TAG_SMALL_RED_EYE @red color + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET + launchtemplate gKarateChopSpriteTemplate 0x2 0x8 0xfff0 0x0 0x0 0x0 0xa 0x1 0x3 0x0 + waitforvisualfinish + launchtask AnimTask_InvertScreenColor 0x2 0x3 0x101 0x101 0x101 + launchtemplate gThroatChopRedImpactTemplate 0x3 0x4 0x0 0x0 0x1 0x2 + delay 0x3 + launchtemplate gThroatChopRedImpactTemplate 0x3 0x4 0x0 0x0 0x1 0x2 + delay 0x3 + launchtemplate gThroatChopRedImpactTemplate 0x3 0x4 0x0 0x0 0x1 0x2 + delay 0x3 + launchtemplate gThroatChopRedImpactTemplate 0x3 0x4 0x0 0x0 0x1 0x2 + delay 0x3 + launchtemplate gThroatChopRedImpactTemplate 0x3 0x4 0x0 0x0 0x1 0x2 + delay 0x3 + launchtemplate gThroatChopRedImpactTemplate 0x3 0x4 0x0 0x0 0x1 0x2 + delay 0x3 + launchtemplate gThroatChopRedImpactTemplate 0x3 0x4 0x0 0x0 0x1 0x2 + delay 0x3 + launchtemplate gThroatChopRedImpactTemplate 0x3 0x4 0x0 0x0 0x1 0x2 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_TARGET 0x4 0x0 0x6 0x1 + waitforvisualfinish + launchtask AnimTask_InvertScreenColor 0x2 0x3 0x101 0x101 0x101 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + end + + +Move_POLLEN_PUFF:: + launchtask AnimTask_IsTargetSameSide 0x5 0x0 + jumpargeq 0x0, 0x1, PollenPuffAlly +PollenPuffOpponent: + loadspritegfx ANIM_TAG_SPARKLE_2 @stars + loadspritegfx ANIM_TAG_PINK_PETAL @pink color + loadspritegfx ANIM_TAG_BLACK_BALL_2 @circle launch + loadspritegfx ANIM_TAG_SMALL_EMBER @yellow color + loadspritegfx ANIM_TAG_SPORE @ball + loadspritegfx ANIM_TAG_FLAT_ROCK @brown color + loadspritegfx ANIM_TAG_ORBS @hit + monbg ANIM_ATTACKER + setalpha 12, 8 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x8 0x0 + waitforvisualfinish + launchtask AnimTask_RockMonBackAndForth 0x5 0x3 0x0 0x2 0x0 + launchtemplate gPollenPuffPinkStarTemplate 0x2 0x4 0xa 0xa 0x19 0x0 + playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER + delay 0xD + launchtemplate gPollenPuffPinkStarTemplate 0x2 0x4 0xfff1 0x0 0x19 0x0 + playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER + delay 0xD + launchtemplate gPollenPuffPinkStarTemplate 0x2 0x4 0xa 0xa 0x19 0x0 + playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER + delay 0xD + launchtemplate gPollenPuffPinkStarTemplate 0x2 0x4 0xfff1 0x0 0x19 0x0 + playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER + clearmonbg ANIM_ATTACKER + waitforvisualfinish + stopsound + monbg ANIM_TARGET + launchtemplate gPollenPuffPinkSparkleTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0xA0 0x28 0x0 + launchtemplate gPollenPuffPinkSparkleTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x110 0x28 0x0 + launchtemplate gPollenPuffPinkSparkleTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0xB0 0x28 0x0 + launchtemplate gPollenPuffPinkSparkleTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0x100 0x28 0x0 + launchtemplate gPollenPuffYellowSparkleTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x90 0x28 0x0 + launchtemplate gPollenPuffYellowSparkleTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x110 0x28 0x0 + launchtemplate gPollenPuffYellowSparkleTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0xB0 0x28 0x0 + launchtemplate gPollenPuffYellowSparkleTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0x100 0x28 0x0 + delay 0x1 + playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_TARGET + launchtemplate gPollenPuffSporeTemplate 0x82 0x6 0xa 0x0 0x0 0x0 0x19 0xffe0 + waitforvisualfinish + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + launchtemplate gPollenPuffImpactTemplates 0x82 0x5 0x1 0x1 0x0 0xFFE0 0x10 @up + launchtemplate gPollenPuffImpactTemplates 0x82 0x5 0x1 0x1 0xFFEE 0xFFEE 0x10 @upperleft + launchtemplate gPollenPuffImpactTemplates 0x82 0x5 0x1 0x1 0x0 0x1C 0x10 @down + delay 0x4 + launchtemplate gPollenPuffImpactTemplates 0x82 0x5 0x1 0x1 0xFFE5 0x0 0x10 @left + launchtemplate gPollenPuffImpactTemplates 0x82 0x5 0x1 0x1 0x14 0x14 0x10 @lowerright + launchtemplate gPollenPuffImpactTemplates 0x82 0x5 0x1 0x1 0xFFED 0x13 0x10 @lowerleft + delay 0x4 + launchtemplate gPollenPuffImpactTemplates 0x82 0x5 0x1 0x1 0x1E 0x0 0x10 @right + launchtemplate gPollenPuffImpactTemplates 0x82 0x5 0x1 0x1 0x16 0xFFEA 0x10 @upperright + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x8 0x0 0x0 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end +PollenPuffAlly: + loadspritegfx ANIM_TAG_SPARKLE_2 @stars + loadspritegfx ANIM_TAG_PINK_PETAL @pink color + loadspritegfx ANIM_TAG_BLACK_BALL_2 @circle launch + loadspritegfx ANIM_TAG_SMALL_EMBER @yellow color + loadspritegfx ANIM_TAG_SPORE @ball + monbg ANIM_ATTACKER + setalpha 12, 8 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x8 0x0 + waitforvisualfinish + launchtask AnimTask_RockMonBackAndForth 0x5 0x3 0x0 0x2 0x0 + launchtemplate gPollenPuffPinkStarTemplate 0x2 0x4 0xa 0xa 0x19 0x0 + playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER + delay 0xD + launchtemplate gPollenPuffPinkStarTemplate 0x2 0x4 0xfff1 0x0 0x19 0x0 + playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER + delay 0xD + launchtemplate gPollenPuffPinkStarTemplate 0x2 0x4 0xa 0xa 0x19 0x0 + playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER + delay 0xD + launchtemplate gPollenPuffPinkStarTemplate 0x2 0x4 0xfff1 0x0 0x19 0x0 + playsewithpan SE_M_ABSORB_2, SOUND_PAN_ATTACKER + clearmonbg ANIM_ATTACKER + waitforvisualfinish + stopsound + playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_ATTACKER + monbg ANIM_TARGET + launchtemplate gPollenPuffPinkSparkleTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0xa0 0x28 0x0 + launchtemplate gPollenPuffPinkSparkleTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x120 0x28 0x0 + launchtemplate gPollenPuffPinkSparkleTemplate 0x84 0x7 0xa 0x0 0x8 0x1e SOUND_PAN_ATTACKER 0x28 0x0 + launchtemplate gPollenPuffPinkSparkleTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0x110 0x28 0x0 + launchtemplate gPollenPuffYellowSparkleTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0xa0 0x28 0x0 + launchtemplate gPollenPuffYellowSparkleTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x120 0x28 0x0 + launchtemplate gPollenPuffYellowSparkleTemplate 0x84 0x7 0xa 0x0 0x8 0x1e SOUND_PAN_ATTACKER 0x28 0x0 + launchtemplate gPollenPuffYellowSparkleTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0x110 0x28 0x0 + delay 0x1 + launchtemplate gPollenPuffSporeTemplate 0x82 0x6 0xa 0x0 0x0 0x0 0x19 0xffe0 + waitforvisualfinish + unloadspritegfx ANIM_TAG_SPARKLE_2 @stars + loadspritegfx ANIM_TAG_BLUE_STAR @heal + playsewithpan SE_M_ABSORB_2, SOUND_PAN_ATTACKER + launchtemplate gPollenPuffHealTemplate 0x2 0x4 0x0 0xfffb 0x1 0x0 + delay 0x7 + launchtemplate gPollenPuffHealTemplate 0x2 0x4 0xfff1 0xa 0x1 0x0 + delay 0x7 + launchtemplate gPollenPuffHealTemplate 0x2 0x4 0xfff1 0xfff1 0x1 0x0 + delay 0x7 + launchtemplate gPollenPuffHealTemplate 0x2 0x4 0xa 0xfffb 0x1 0x0 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x8 0x1 0x0 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end + + +Move_ANCHOR_SHOT:: + loadspritegfx ANIM_TAG_CHAIN_LINK + loadspritegfx ANIM_TAG_ANCHOR + playsewithpan SE_FALL SOUND_PAN_TARGET + monbg ANIM_TARGET + launchtemplate gAnchorShotAngledAnchorTemplate 0x2 0x3 0x0 0x0 0x35 + waitforvisualfinish + launchtemplate gAnchorShotAnchorTemplate 0x3 0x3 0x0 0xffe0 0xf + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0 0x3 0xf 0x1 + delay 0x25 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0 0x3 0xf 0x1 + waitforvisualfinish + loopsewithpan SE_SHINY, SOUND_PAN_ATTACKER 0x1c 0x2 + launchtemplate gAnchorShotChainTemplate 0x82 0x2 0xfff0 0xfff0 + delay 0x4 + launchtemplate gAnchorShotChainTemplate 0x82 0x2 0xfff0 0x0 + delay 0x4 + launchtemplate gAnchorShotChainTemplate 0x82 0x2 0xfff0 0x10 + waitforvisualfinish + clearmonbg ANIM_TARGET + end + + +Move_PSYCHIC_TERRAIN:: + loadspritegfx ANIM_TAG_ORBS @Recover Ball + loadspritegfx ANIM_TAG_GREEN_SPARKLE @Green Star + loadspritegfx ANIM_TAG_POISON_BUBBLE @Purple Colour + playsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER + createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0 + waitforvisualfinish + delay 30 + createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB(27, 0, 13), 12, 5, 1 + delay 4 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0 + playsewithpan SE_M_REVERSAL, SOUND_PAN_ATTACKER + createsprite gPsychicTerrainOrbsTemplate, ANIM_ATTACKER, 2, 26, 0 + createsprite gPsychicTerrainOrbsTemplate, ANIM_ATTACKER, 2, 26, 42 + createsprite gPsychicTerrainOrbsTemplate, ANIM_ATTACKER, 2, 26, 84 + createsprite gPsychicTerrainOrbsTemplate, ANIM_ATTACKER, 2, 26, 126 + createsprite gPsychicTerrainOrbsTemplate, ANIM_ATTACKER, 2, 26, 168 + createsprite gPsychicTerrainOrbsTemplate, ANIM_ATTACKER, 2, 26, 210 + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 3, 0, 4, RGB(27, 0, 13) + delay 52 + setarg 7, 0xFFFF + playsewithpan SE_M_ATTRACT, SOUND_PAN_ATTACKER + createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0 + createsprite gPsychicTerrainStarTemplate, ANIM_TARGET, 2, 0 + createsprite gPsychicTerrainStarTemplate, ANIM_TARGET, 2, 32 + createsprite gPsychicTerrainStarTemplate, ANIM_TARGET, 2, 64 + createsprite gPsychicTerrainStarTemplate, ANIM_TARGET, 2, 96 + createsprite gPsychicTerrainStarTemplate, ANIM_TARGET, 2, 128 + createsprite gPsychicTerrainStarTemplate, ANIM_TARGET, 2, 160 + createsprite gPsychicTerrainStarTemplate, ANIM_TARGET, 2, 192 + createsprite gPsychicTerrainStarTemplate, ANIM_TARGET, 2, 224 + loopsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET, 0xa, 0x3 + waitforvisualfinish + delay 4 + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 3, 4, 0, RGB(27, 0, 13) + waitforvisualfinish + end + +Move_LUNGE:: + loadspritegfx ANIM_TAG_IMPACT @hit + loadspritegfx ANIM_TAG_TEAL_ALERT @hit particles + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @psycho boost charge + loadspritegfx ANIM_TAG_LEAF @green + loadspritegfx ANIM_TAG_RAZOR_LEAF @green + loadspritegfx ANIM_TAG_SMALL_BUBBLES @ball + monbg ANIM_ATK_PARTNER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_ATTACKER 0x3 0x0 0xf0 0x0 + loopsewithpan SE_M_PSYBEAM2, SOUND_PAN_ATTACKER, 0xe, 0xa + launchtemplate gLungeGreenChargeTemplate 0x2 0x0 + delay 0x6e + delay 0x3e + playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER + delay 0x15 + clearmonbg ANIM_ATK_PARTNER + invisible ANIM_ATTACKER + waitforvisualfinish + playsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER + launchtemplate gLungeGreenBubbleTemplate 0x82 0x6 0xa 0x0 0x0 0x0 0x19 0xffe0 + delay 0xF + monbg ANIM_DEF_PARTNER + delay 0x1 + launchtemplate gTealAlertSpriteTemplate 0x4 0x3 0x46 0x0 0x6 + launchtemplate gTealAlertSpriteTemplate 0x4 0x3 0x28 0x28 0x6 + launchtemplate gTealAlertSpriteTemplate 0x4 0x3 0xa 0xffc4 0x6 + launchtemplate gTealAlertSpriteTemplate 0x4 0x3 0xffce 0xffd8 0x6 + launchtemplate gTealAlertSpriteTemplate 0x4 0x3 0xffd8 0x28 0x6 + launchtemplate gTealAlertSpriteTemplate 0x4 0x3 0x32 0xffce 0x6 + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_TARGET 0x0 0x5 0xb 0x1 + delay 0x2 + launchtemplate gTealAlertSpriteTemplate 0x4 0x3 0x32 0xffe2 0x6 + launchtemplate gTealAlertSpriteTemplate 0x4 0x3 0x3c 0xa 0x6 + launchtemplate gTealAlertSpriteTemplate 0x4 0x3 0x0 0x3c 0x6 + launchtemplate gTealAlertSpriteTemplate 0x4 0x3 0x0 0xffd8 0x6 + launchtemplate gTealAlertSpriteTemplate 0x4 0x3 0xffc4 0x14 0x6 + launchtemplate gTealAlertSpriteTemplate 0x4 0x3 0xffc4 0xffe2 0x6 + delay 0x2 + launchtemplate gTealAlertSpriteTemplate 0x4 0x3 0xffce 0x32 0x6 + launchtemplate gTealAlertSpriteTemplate 0x4 0x3 0xffc4 0x14 0x6 + launchtemplate gTealAlertSpriteTemplate 0x4 0x3 0xffd8 0xffd8 0x6 + launchtemplate gTealAlertSpriteTemplate 0x4 0x3 0x14 0xffc4 0x6 + launchtemplate gTealAlertSpriteTemplate 0x4 0x3 0x32 0xffce 0x6 + launchtemplate gTealAlertSpriteTemplate 0x4 0x3 0x23 0x28 0x6 + waitforvisualfinish + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + launchtemplate gLungeGreenImpactTemplate 0x2 0x4 0x0 0x0 0x1 0x2 + waitforvisualfinish + visible ANIM_ATTACKER + clearmonbg ANIM_DEF_PARTNER + end + + +Move_FIRE_LASH:: + loadspritegfx ANIM_TAG_SMALL_EMBER + monbg ANIM_DEF_PARTNER + monbgprio_2A ANIM_TARGET + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x0 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x4 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x8 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0xc + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x10 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x14 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x18 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + waitforvisualfinish + launchtemplate gSlideMonToOffsetSpriteTemplate 0x2 0x5 ANIM_ATTACKER 0x18 0x0 0x0 0x6 + delay 0x4 + launchtask AnimTask_ShakeMon 0x2 0x5 0x1 0x5 0x0 0x8 0x1 + launchtask AnimTask_BlendMonInAndOut 0x3 0x5 0x1 0x1f 0xc 0x1 0x1 + playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET + loadspritegfx ANIM_TAG_SLASH + launchtemplate gSlashSliceSpriteTemplate 0x82, 0x3, 0x1 0xfff8 0x0 + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gSlashSliceSpriteTemplate 0x82, 0x3, 0x1 0x8 0x0 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0x4 0x0 0x12 0x1 + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + delay 0x7 + launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_ATTACKER 0x0 0x9 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + end + + +Move_POWER_TRIP:: + loadspritegfx ANIM_TAG_FOCUS_ENERGY @focus energy + loadspritegfx ANIM_TAG_HANDS_AND_FEET @black color + loadspritegfx ANIM_TAG_PURPLE_FLAME @dark violet color + loadspritegfx ANIM_TAG_IMPACT @hit + monbg ANIM_DEF_PARTNER + playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER + call PowerTripBuffUp + delay 0x8 + launchtask AnimTask_BlendColorCycle 0x2 0x6 ANIM_PAL_ATK 0x2 0x2 0x0 0xb 0x0 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x0 0x1 0x0 0x20 0x1 + call PowerTripBuffUp + delay 0x8 + call PowerTripBuffUp + waitforvisualfinish + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + launchtemplate gPowerTripImpactTemplate 0x2 0x4 0xFFF5 0xA 0x1 0x2 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x5 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + launchtemplate gPowerTripImpactTemplate 0x2 0x4 0x0 0xFFF5 0x1 0x2 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x5 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + launchtemplate gPowerTripImpactTemplate 0x2 0x4 0xA 0x0 0x1 0x2 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + end +PowerTripBuffUp: + launchtemplate gPowerTripFocusEnergyTemplate 0x2 0x4 0x0 0xffe8 0x1a 0x2 + delay 0x4 + launchtemplate gPowerTripFocusEnergyTemplate 0x2 0x4 0x0 0xe 0x1c 0x1 + delay 0x4 + launchtemplate gPowerTripFocusEnergyTemplate 0x2 0x4 0x0 0xfffb 0xa 0x2 + delay 0x4 + launchtemplate gPowerTripFocusEnergyTemplate 0x2 0x4 0x0 0x1c 0x1a 0x3 + delay 0x4 + launchtemplate gPowerTripFocusEnergyTemplate 0x2 0x4 0x0 0xfff4 0x0 0x1 + return + + +Move_BURN_UP:: + loadspritegfx ANIM_TAG_THIN_RING @ring + loadspritegfx ANIM_TAG_SMALL_RED_EYE @red color + loadspritegfx ANIM_TAG_PINK_CLOUD @yawn + loadspritegfx ANIM_TAG_SMALL_EMBER @fire + monbg ANIM_DEF_PARTNER + setblends 0x120C + fadetobg BG_FIRE + waitbgfadeout + launchtask AnimTask_StartSlidingBg 0x5 0x4 0xA00 0x0 0x1 0xffff + waitbgfadein + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x5 0x1c + waitforvisualfinish + launchtask AnimTask_AllocBackupPalBuffer 0x5 0x0 + waitforvisualfinish + launchtask AnimTask_CopyPalUnfadedToBackup 0x5 0x2 0x0 0x1 + delay 0x1 + launchtask AnimTask_CopyPalFadedToUnfaded 0x5 0x1 0x0 + delay 0x1 + loopsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER 0x9 0x2 + launchtask AnimTask_CopyPalUnfadedToBackup 0x5 0x2 0x1 0x0 + delay 0x1 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x1 0x0 0xd 0x1c + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_ATTACKER 0x2 0x0 0xf 0x1 + waitforvisualfinish + delay 0x1E + launchtemplate gUproarRingSpriteTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1f 0x8 + waitforvisualfinish + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + launchtemplate gBurnUpRedYawnTemplate 0x80, 0x6 0x0 0x0 0x0 0x0 0x1e 0x0 + delay 0x1 + launchtask AnimTask_CopyPalFadedToUnfaded 0x5 0x1 0x1 + delay 0x1 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x0 0x0 0xd 0x4a52 + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_ATTACKER 0x3 0x0 0xf 0x1 + delay 0xF + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 ANIM_PAL_DEF 0x2 0x0 0xC 0x1C + delay 0x1 + launchtask AnimTask_CopyPalUnfadedFromBackup 0x5 0x2 0x0 0x1 + delay 0x1 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x5 0x0 0x1c + delay 0x1 + launchtask AnimTask_CopyPalUnfadedFromBackup 0x5 0x2 0x1 0x0 + delay 0x1 + playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_TARGET 0x2 0x0 0xf 0x1 + call FireSpreadEffect + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x0 0xd 0x0 0x4a52 + delay 0x1 + launchtask AnimTask_FreeBackupPalBuffer 0x5 0x0 + delay 0x1 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 ANIM_PAL_DEF 0x2 0xC 0x0 0x1C + waitforvisualfinish + call UnsetPsychicBg + clearmonbg ANIM_DEF_PARTNER + blendoff + end + + +Move_SPEED_SWAP:: + loadspritegfx ANIM_TAG_THIN_RING @ring + loadspritegfx ANIM_TAG_ICE_CHUNK @blue green + loadspritegfx ANIM_TAG_ORBS @circle + monbg ANIM_TARGET + panse_1B SE_M_MINIMIZE, SOUND_PAN_TARGET, SOUND_PAN_ATTACKER, 0xfd, 0x0 + delay 0xf + launchtemplate gSpeedSwapCircleTemplate 0x82 0x2 0xfff4 0x18 + delay 0x5 + launchtemplate gSpeedSwapRingTemplate 0x28 0x4 0x0 0x0 0x1 0x0 + launchtemplate gSpeedSwapOrbTemplate 0x82 0x5 0x1 0x0 0x0 0xFFE0 0x10 + launchtemplate gSpeedSwapOrbTemplate 0x82 0x5 0x1 0x0 0x16 0xFFEA 0x10 + launchtemplate gSpeedSwapOrbTemplate 0x82 0x5 0x1 0x0 0x1E 0x0 0x10 + launchtemplate gSpeedSwapOrbTemplate 0x82 0x5 0x1 0x0 0x14 0x14 0x10 + launchtemplate gSpeedSwapOrbTemplate 0x82 0x5 0x1 0x0 0x0 0x1C 0x10 + launchtemplate gSpeedSwapOrbTemplate 0x82 0x5 0x1 0x0 0xFFED 0x13 0x10 + launchtemplate gSpeedSwapOrbTemplate 0x82 0x5 0x1 0x0 0xFFE5 0x0 0x10 + launchtemplate gSpeedSwapOrbTemplate 0x82 0x5 0x1 0x0 0xFFEE 0xFFEE 0x10 + waitforvisualfinish + panse_1B SE_M_MINIMIZE, SOUND_PAN_TARGET, SOUND_PAN_ATTACKER, 0xfd, 0x0 + launchtemplate gSpeedSwapOrbMissileTemplate 0x80 0x6 0x0 0x0 0x0 0x0 0x1e 0x0 + launchtemplate gSpeedSwapRingTemplate 0x28 0x4 0x0 0x0 0x0 0x0 + launchtemplate gSpeedSwapOrbTemplate 0x82 0x5 0x0 0x0 0x0 0xFFE0 0x10 + launchtemplate gSpeedSwapOrbTemplate 0x82 0x5 0x0 0x0 0x16 0xFFEA 0x10 + launchtemplate gSpeedSwapOrbTemplate 0x82 0x5 0x0 0x0 0x1E 0x0 0x10 + launchtemplate gSpeedSwapOrbTemplate 0x82 0x5 0x0 0x0 0x14 0x14 0x10 + launchtemplate gSpeedSwapOrbTemplate 0x82 0x5 0x0 0x0 0x0 0x1C 0x10 + launchtemplate gSpeedSwapOrbTemplate 0x82 0x5 0x0 0x0 0xFFED 0x13 0x10 + launchtemplate gSpeedSwapOrbTemplate 0x82 0x5 0x0 0x0 0xFFE5 0x0 0x10 + launchtemplate gSpeedSwapOrbTemplate 0x82 0x5 0x0 0x0 0xFFEE 0xFFEE 0x10 + waitforvisualfinish + clearmonbg ANIM_TARGET + end + + +Move_SMART_STRIKE:: + loadspritegfx ANIM_TAG_POWER_GEM @gem + loadspritegfx ANIM_TAG_AIR_WAVE @sonicboom + loadspritegfx ANIM_TAG_IMPACT @hit + loadspritegfx ANIM_TAG_FLASH_CANNON_BALL @ball + loadspritegfx ANIM_TAG_LOCK_ON + launchtemplate gLockOnTargetSpriteTemplate 0x28 0x0 + launchtemplate gLockOnMoveTargetSpriteTemplate 0x28 0x1 0x1 + launchtemplate gLockOnMoveTargetSpriteTemplate 0x28 0x1 0x2 + launchtemplate gLockOnMoveTargetSpriteTemplate 0x28 0x1 0x3 + launchtemplate gLockOnMoveTargetSpriteTemplate 0x28 0x1 0x4 + delay 0x78 + setarg 0x7 0xffff + waitforvisualfinish + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + call SonicBoomProjectile + launchtask AnimTask_ShakeMon 0x2 0x5 0x1 0x3 0x0 0xa 0x1 + loadspritegfx ANIM_TAG_FLASH_CANNON_BALL + launchtemplate gSmartStrikeImpactTemplate 0x84 0x5 0x0 0x0 0x8 0x1 0x0 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + launchtemplate gSmartStrikeGemTemplate 0x82 0x5 0x1 0x1 0x0 0xffe8 0xa + launchtemplate gSmartStrikeGemTemplate 0x82 0x5 0x1 0x1 0x11 0xffef 0xa + launchtemplate gSmartStrikeGemTemplate 0x82 0x5 0x1 0x1 0x18 0x0 0xa + launchtemplate gSmartStrikeGemTemplate 0x82 0x5 0x1 0x1 0x11 0x11 0xa + launchtemplate gSmartStrikeGemTemplate 0x82 0x5 0x1 0x1 0x0 0x18 0xa + launchtemplate gSmartStrikeGemTemplate 0x82 0x5 0x1 0x1 0xffef 0x11 0xa + launchtemplate gSmartStrikeGemTemplate 0x82 0x5 0x1 0x1 0xffe8 0x0 0xa + launchtemplate gSmartStrikeGemTemplate 0x82 0x5 0x1 0x1 0xffef 0xffef 0xa + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + waitforvisualfinish + clearmonbg ANIM_ATTACKER + blendoff + waitforvisualfinish + end + + +Move_PURIFY:: + loadspritegfx ANIM_TAG_FLASH_CANNON_BALL @Ball + loadspritegfx ANIM_TAG_BLACK_SMOKE @smoke + loadspritegfx ANIM_TAG_ICE_CHUNK @White Colour + monbg ANIM_TARGET + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER + launchtemplate gPurifyWhiteBallTemplate 0x2 0x6 0x14 0xfff8 0xfff8 0xfff8 0x14 0xffe0 + delay 0x13 + playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_TARGET + launchtemplate gPurifySmokeTemplate 0x84 0x5 0x0 0xfff4 0x68 0x0 0x4b + launchtemplate gPurifySmokeTemplate 0x84 0x5 0x0 0xfff4 0x48 0x1 0x4b + launchtemplate gPurifySmokeTemplate 0x84 0x5 0x0 0xfffa 0x38 0x1 0x4b + launchtemplate gPurifySmokeTemplate 0x84 0x5 0x0 0xfffa 0x58 0x0 0x4b + launchtemplate gPurifySmokeTemplate 0x84 0x5 0x0 0x0 0x38 0x0 0x4b + launchtemplate gPurifySmokeTemplate 0x84 0x5 0x0 0x0 0x58 0x1 0x4b + launchtemplate gPurifySmokeTemplate 0x84 0x5 0x0 0x6 0x48 0x0 0x4b + launchtemplate gPurifySmokeTemplate 0x84 0x5 0x0 0x6 0x68 0x1 0x4b + launchtemplate gPurifySmokeTemplate 0x84 0x5 0x0 0xc 0x48 0x0 0x4b + launchtemplate gPurifySmokeTemplate 0x84 0x5 0x0 0xc 0x38 0x1 0x4b + launchtemplate gPurifySmokeTemplate 0x84 0x5 0x0 0x12 0x50 0x0 0x4b + launchtemplate gPurifySmokeTemplate 0x84 0x5 0x0 0x12 0x48 0x1 0x4b + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end + + +Move_REVELATION_DANCE:: + loadspritegfx ANIM_TAG_ORBS @circles + loadspritegfx ANIM_TAG_FLOWER @particles + loadspritegfx ANIM_TAG_JAGGED_MUSIC_NOTE @another yellow + loadspritegfx ANIM_TAG_AIR_WAVE @sonicboom + loadspritegfx ANIM_TAG_THIN_RING @ring + monbg ANIM_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xF 0x0 + waitforvisualfinish + playsewithpan SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER + launchtask AnimTask_RockMonBackAndForth 0x5 0x3 0x0 0x2 0x0 + launchtemplate gRevelationDanceYellowOrbsTemplate 0x2 0x4 0x0 0xffe8 0x8 0x8c + launchtemplate gRevelationDanceYellowFlowerTemplate 0x2 0x4 0x10 0xffe8 0x8 0x64 + launchtemplate gRevelationDanceYellowFlowerTemplate 0x2 0x4 0xfff0 0xffe8 0x8 0x64 + delay 0xf + launchtemplate gRevelationDanceYellowOrbsTemplate 0x2 0x4 0x0 0xffe8 0x8 0x8c + launchtemplate gRevelationDanceYellowFlowerTemplate 0x2 0x4 0x20 0xffe8 0x8 0x64 + launchtemplate gRevelationDanceYellowFlowerTemplate 0x2 0x4 0xffe0 0xffe8 0x8 0x64 + delay 0xf + launchtemplate gRevelationDanceYellowOrbsTemplate 0x2 0x4 0x0 0xffe8 0x8 0x8c + launchtemplate gRevelationDanceYellowFlowerTemplate 0x2 0x4 0x18 0xffe8 0x8 0x64 + launchtemplate gRevelationDanceYellowFlowerTemplate 0x2 0x4 0xffe8 0xffe8 0x8 0x64 + delay 0x1e + launchtemplate gRevelationDanceYellowFlowerTemplate 0x2 0x4 0x10 0xffe8 0x0 0x64 + launchtemplate gRevelationDanceYellowFlowerTemplate 0x2 0x4 0xfff0 0xffe8 0x0 0x64 + delay 0x1e + launchtask AnimTask_RockMonBackAndForth 0x5 0x3 0x0 0x2 0x0 + launchtemplate gRevelationDanceYellowFlowerTemplate 0x2 0x4 0x14 0xfff0 0xe 0x50 + launchtemplate gRevelationDanceYellowFlowerTemplate 0x2 0x4 0xffec 0xfff2 0x10 0x50 + waitforvisualfinish + unloadspritegfx ANIM_TAG_FLOWER @particles + loadspritegfx ANIM_TAG_IMPACT @hit + loadspritegfx ANIM_TAG_SMALL_EMBER @light yellow + playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER + launchtemplate gRevelationDanceYellowAirWaveTemplate 0x82 0x5 0x10 0x0 0x0 0x0 0xf + waitforvisualfinish + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + launchtemplate gRevelationDanceYellowImpactTemplate 0x2 0x4 0x0 0x0 0x1 0x2 + launchtemplate gRevelationDanceYellowRingTemplate 0x3 0x6 0x0 0x0 0x1 0x0 0x1f 0x8 + launchtemplate gRevelationDanceYellowDispersalTemplate 0x81 0x5 0x0 0xa 0x0 0xb0 0x28 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_ATTACKER + launchtemplate gRevelationDanceYellowDispersalTemplate 0x81 0x5 0x0 0xa 0xff40 0xf0 0x28 + launchtemplate gRevelationDanceYellowDispersalTemplate 0x81 0x5 0x0 0xa 0x0 0xff60 0x28 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_ATTACKER + launchtemplate gRevelationDanceYellowDispersalTemplate 0x81 0x5 0x0 0xa 0xff40 0xff90 0x28 + launchtemplate gRevelationDanceYellowDispersalTemplate 0x81 0x5 0x0 0xa 0xa0 0x30 0x28 + launchtemplate gRevelationDanceYellowDispersalTemplate 0x81 0x5 0x0 0xa 0xff20 0xffe0 0x28 + launchtemplate gRevelationDanceYellowDispersalTemplate 0x81 0x5 0x0 0xa 0x70 0xff80 0x28 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xF 0x0 0x0 + waitforvisualfinish + clearmonbg ANIM_TARGET + end + + +Move_CORE_ENFORCER:: + loadspritegfx ANIM_TAG_SPARK_2 @yellow color + loadspritegfx ANIM_TAG_LEAF @green color + loadspritegfx ANIM_TAG_RAZOR_LEAF @another green color + loadspritegfx ANIM_TAG_WATER_ORB @blue color + loadspritegfx ANIM_TAG_THIN_RING @rings + loadspritegfx ANIM_TAG_SHOCK_3 @circle from thunderbolt + monbg ANIM_ATTACKER + setalpha 12, 8 + fadetobg BG_COSMIC + waitbgfadeout + launchtask AnimTask_StartSlidingBg 0x5 0x4 0x0 0xFC00 0x1 0xffff + waitbgfadein + loopsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER 0xd 0xA + launchtemplate gCoreEnforcerCircleChargeTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + launchtemplate gCoreEnforcerBlueRingTemplate 0x28 0x4 0x0 0x0 0x0 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x20 0x18 0xbe 0xc 0x0 0x1 0x0 + delay 0x0 + launchtemplate gCoreEnforcerBlueSparkTemplate 0x0 0x7 0x50 0x18 0x16 0xc 0x0 0x1 0x0 + launchtemplate gCoreEnforcerGreenChargeTemplate 0x0 0x7 0x9c 0x18 0x79 0xd 0x0 0x1 0x1 + delay 0x5 + launchtemplate gCoreEnforcerGreenChargeTemplate 0x0 0x7 0x64 0x18 0x3c 0xa 0x0 0x1 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0xaa 0x18 0x2a 0xb 0x0 0x1 0x1 + delay 0x0 + launchtemplate gCoreEnforcerBlueSparkTemplate 0x0 0x7 0xee 0x18 0xa5 0xa 0x0 0x1 0x1 + delay 0x5 + launchtemplate gCoreEnforcerBlueSparkTemplate 0x0 0x7 0x20 0x18 0xbe 0xc 0x0 0x1 0x0 + delay 0x0 + launchtemplate gCoreEnforcerGreenChargeTemplate 0x0 0x7 0x50 0x18 0x16 0xc 0x0 0x1 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x9c 0x18 0x79 0xd 0x0 0x1 0x1 + waitforvisualfinish + launchtemplate gCoreEnforcerCircleChargeTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x64 0x18 0x3c 0xa 0x0 0x1 0x0 + launchtemplate gCoreEnforcerBlueSparkTemplate 0x0 0x7 0xaa 0x18 0x2a 0xb 0x0 0x1 0x1 + delay 0x0 + launchtemplate gCoreEnforcerGreenChargeTemplate 0x0 0x7 0xee 0x18 0xa5 0xa 0x0 0x1 0x1 + delay 0x5 + launchtemplate gCoreEnforcerGreenChargeTemplate 0x0 0x7 0x20 0x18 0xbe 0xc 0x0 0x1 0x0 + delay 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x50 0x18 0x16 0xc 0x0 0x1 0x0 + launchtemplate gCoreEnforcerBlueSparkTemplate 0x0 0x7 0x9c 0x18 0x79 0xd 0x0 0x1 0x1 + delay 0x5 + launchtemplate gCoreEnforcerBlueSparkTemplate 0x0 0x7 0x64 0x18 0x3c 0xa 0x0 0x1 0x0 + launchtemplate gCoreEnforcerGreenChargeTemplate 0x0 0x7 0xaa 0x18 0x2a 0xb 0x0 0x1 0x1 + delay 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0xee 0x18 0xa5 0xa 0x0 0x1 0x1 + waitforvisualfinish + launchtemplate gCoreEnforcerCircleChargeTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + launchtemplate gCoreEnforcerYellowRingTemplate 0x28 0x4 0x0 0x0 0x0 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x20 0x18 0xbe 0xc 0x0 0x1 0x0 + delay 0x0 + launchtemplate gCoreEnforcerBlueSparkTemplate 0x0 0x7 0x50 0x18 0x16 0xc 0x0 0x1 0x0 + launchtemplate gCoreEnforcerGreenChargeTemplate 0x0 0x7 0x9c 0x18 0x79 0xd 0x0 0x1 0x1 + delay 0x5 + launchtemplate gCoreEnforcerGreenChargeTemplate 0x0 0x7 0x64 0x18 0x3c 0xa 0x0 0x1 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0xaa 0x18 0x2a 0xb 0x0 0x1 0x1 + delay 0x0 + launchtemplate gCoreEnforcerBlueSparkTemplate 0x0 0x7 0xee 0x18 0xa5 0xa 0x0 0x1 0x1 + delay 0x5 + launchtemplate gCoreEnforcerBlueSparkTemplate 0x0 0x7 0x20 0x18 0xbe 0xc 0x0 0x1 0x0 + delay 0x0 + launchtemplate gCoreEnforcerGreenChargeTemplate 0x0 0x7 0x50 0x18 0x16 0xc 0x0 0x1 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x9c 0x18 0x79 0xd 0x0 0x1 0x1 + waitforvisualfinish + launchtemplate gCoreEnforcerCircleChargeTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x64 0x18 0x3c 0xa 0x0 0x1 0x0 + launchtemplate gCoreEnforcerBlueSparkTemplate 0x0 0x7 0xaa 0x18 0x2a 0xb 0x0 0x1 0x1 + delay 0x0 + launchtemplate gCoreEnforcerGreenChargeTemplate 0x0 0x7 0xee 0x18 0xa5 0xa 0x0 0x1 0x1 + delay 0x5 + launchtemplate gCoreEnforcerGreenChargeTemplate 0x0 0x7 0x20 0x18 0xbe 0xc 0x0 0x1 0x0 + delay 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x50 0x18 0x16 0xc 0x0 0x1 0x0 + launchtemplate gCoreEnforcerBlueSparkTemplate 0x0 0x7 0x9c 0x18 0x79 0xd 0x0 0x1 0x1 + delay 0x5 + launchtemplate gCoreEnforcerBlueSparkTemplate 0x0 0x7 0x64 0x18 0x3c 0xa 0x0 0x1 0x0 + launchtemplate gCoreEnforcerGreenChargeTemplate 0x0 0x7 0xaa 0x18 0x2a 0xb 0x0 0x1 0x1 + delay 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0xee 0x18 0xa5 0xa 0x0 0x1 0x1 + waitforvisualfinish + launchtemplate gCoreEnforcerCircleChargeTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + launchtemplate gCoreEnforcerGreenRingTemplate 0x28 0x4 0x0 0x0 0x0 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x20 0x18 0xbe 0xc 0x0 0x1 0x0 + delay 0x0 + launchtemplate gCoreEnforcerBlueSparkTemplate 0x0 0x7 0x50 0x18 0x16 0xc 0x0 0x1 0x0 + launchtemplate gCoreEnforcerGreenChargeTemplate 0x0 0x7 0x9c 0x18 0x79 0xd 0x0 0x1 0x1 + delay 0x5 + launchtemplate gCoreEnforcerGreenChargeTemplate 0x0 0x7 0x64 0x18 0x3c 0xa 0x0 0x1 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0xaa 0x18 0x2a 0xb 0x0 0x1 0x1 + delay 0x0 + launchtemplate gCoreEnforcerBlueSparkTemplate 0x0 0x7 0xee 0x18 0xa5 0xa 0x0 0x1 0x1 + delay 0x5 + launchtemplate gCoreEnforcerBlueSparkTemplate 0x0 0x7 0x20 0x18 0xbe 0xc 0x0 0x1 0x0 + delay 0x0 + launchtemplate gCoreEnforcerGreenChargeTemplate 0x0 0x7 0x50 0x18 0x16 0xc 0x0 0x1 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x9c 0x18 0x79 0xd 0x0 0x1 0x1 + waitforvisualfinish + launchtemplate gCoreEnforcerCircleChargeTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x64 0x18 0x3c 0xa 0x0 0x1 0x0 + launchtemplate gCoreEnforcerBlueSparkTemplate 0x0 0x7 0xaa 0x18 0x2a 0xb 0x0 0x1 0x1 + delay 0x0 + launchtemplate gCoreEnforcerGreenChargeTemplate 0x0 0x7 0xee 0x18 0xa5 0xa 0x0 0x1 0x1 + delay 0x5 + launchtemplate gCoreEnforcerGreenChargeTemplate 0x0 0x7 0x20 0x18 0xbe 0xc 0x0 0x1 0x0 + delay 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x50 0x18 0x16 0xc 0x0 0x1 0x0 + launchtemplate gCoreEnforcerBlueSparkTemplate 0x0 0x7 0x9c 0x18 0x79 0xd 0x0 0x1 0x1 + delay 0x5 + launchtemplate gCoreEnforcerBlueSparkTemplate 0x0 0x7 0x64 0x18 0x3c 0xa 0x0 0x1 0x0 + launchtemplate gCoreEnforcerGreenChargeTemplate 0x0 0x7 0xaa 0x18 0x2a 0xb 0x0 0x1 0x1 + delay 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0xee 0x18 0xa5 0xa 0x0 0x1 0x1 + delay 0x5 + launchtemplate gCoreEnforcerCircleChargeTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + waitforvisualfinish + unloadspritegfx ANIM_TAG_SPARK_2 @yellow color + unloadspritegfx ANIM_TAG_LEAF @green color + unloadspritegfx ANIM_TAG_RAZOR_LEAF @another green color + unloadspritegfx ANIM_TAG_WATER_ORB @blue color + unloadspritegfx ANIM_TAG_THIN_RING @rings + unloadspritegfx ANIM_TAG_SHOCK_3 @circle from thunderbolt + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_ORBS @charging particles + loadspritegfx ANIM_TAG_SNORE_Z + loadspritegfx ANIM_TAG_EXPLOSION + clearmonbg ANIM_ATTACKER + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 0xD, 0xD, 0x079F @Yellow + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ORBS, 0, 0xA, 0xA, 0x7501 @Royal Blue + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SNORE_Z, 0, 0xA, 0xA, 0x0688 @Green + delay 0x10 + monbg ANIM_TARGET + launchtask AnimTask_CreateSmallSolarbeamOrbs 0x5 0x0 + panse_1B SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 + launchtask AnimTask_ShakeMon2 0x5 0x5 ANIM_TARGET 0x2 0x0 0x41 0x1 + launchtask AnimTask_ShakeMon2 0x5 0x5 ANIM_DEF_PARTNER 0x2 0x0 0x41 0x1 + launchtemplate gCoreEnforcerBeamTemplate 0x83 0x4 0xf 0x0 0x14 0x0 + launchtemplate gCoreEnforcerImpactTemplate 0x83 0x4 0xfff5 0xffe2 0x1 0x3 + delay 0x1 + launchtemplate gCoreEnforcerImpactTemplate 0x83 0x4 0xfffa 0xffe2 0x1 0x3 + delay 0x1 + launchtemplate gCoreEnforcerImpactTemplate 0x83 0x4 0xffff 0xffe2 0x1 0x3 + delay 0x1 + launchtemplate gCoreEnforcerImpactTemplate 0x83 0x4 0x5 0xffe2 0x1 0x3 + delay 0x1 + launchtemplate gCoreEnforcerBeamTemplate 0x83 0x4 0xf 0x0 0x14 0x1 + launchtemplate gCoreEnforcerImpactTemplate 0x83 0x4 0xA 0xffe2 0x1 0x3 + delay 0x1 + launchtemplate gCoreEnforcerImpactTemplate 0x83 0x4 0xF 0xffe2 0x1 0x3 + delay 0x1 + launchtemplate gCoreEnforcerImpactTemplate 0x83 0x4 0x14 0xffe2 0x1 0x3 + delay 0x1 + launchtemplate gCoreEnforcerImpactTemplate 0x83 0x4 0xF 0xffe7 0x1 0x3 + delay 0x1 + launchtemplate gCoreEnforcerBeamTemplate 0x83 0x4 0xf 0x0 0x14 0x2 + launchtemplate gCoreEnforcerImpactTemplate 0x83 0x4 0xC 0xffea 0x1 0x3 + delay 0x1 + launchtemplate gCoreEnforcerImpactTemplate 0x83 0x4 0x9 0xffed 0x1 0x3 + delay 0x1 + launchtemplate gCoreEnforcerImpactTemplate 0x83 0x4 0x6 0xfff0 0x1 0x3 + delay 0x1 + launchtemplate gCoreEnforcerImpactTemplate 0x83 0x4 0x3 0xfff3 0x1 0x3 + delay 0x1 + launchtemplate gCoreEnforcerBeamTemplate 0x83 0x4 0xf 0x0 0x14 0x3 + launchtemplate gCoreEnforcerImpactTemplate 0x83 0x4 0x0 0xfff6 0x1 0x3 + delay 0x1 + launchtemplate gCoreEnforcerImpactTemplate 0x83 0x4 0xfffc 0xfff9 0x1 0x3 + delay 0x1 + launchtemplate gCoreEnforcerImpactTemplate 0x83 0x4 0xfff9 0xfffc 0x1 0x3 + delay 0x1 + launchtemplate gCoreEnforcerImpactTemplate 0x83 0x4 0xfff6 0xffff 0x1 0x3 + delay 0x1 + launchtemplate gCoreEnforcerBeamTemplate 0x83 0x4 0xf 0x0 0x14 0x4 + launchtemplate gCoreEnforcerImpactTemplate 0x83 0x4 0xfff3 0x3 0x1 0x3 + delay 0x1 + launchtemplate gCoreEnforcerImpactTemplate 0x83 0x4 0xfff8 0x3 0x1 0x3 + delay 0x1 + launchtemplate gCoreEnforcerImpactTemplate 0x83 0x4 0xfffd 0x3 0x1 0x3 + delay 0x1 + launchtemplate gCoreEnforcerImpactTemplate 0x83 0x4 0x2 0x3 0x1 0x3 + delay 0x1 + launchtemplate gCoreEnforcerBeamTemplate 0x83 0x4 0xf 0x0 0x14 0x5 + launchtemplate gCoreEnforcerImpactTemplate 0x83 0x4 0x7 0x3 0x1 0x3 + delay 0x1 + launchtemplate gCoreEnforcerImpactTemplate 0x83 0x4 0xC 0x3 0x1 0x3 + delay 0x1 + launchtemplate gCoreEnforcerImpactTemplate 0x83 0x4 0x11 0x3 0x1 0x3 + delay 0x1 + launchtemplate gCoreEnforcerImpactTemplate 0x83 0x4 0x16 0x3 0x1 0x3 + delay 0x1 + launchtemplate gCoreEnforcerBeamTemplate 0x83 0x4 0xf 0x0 0x14 0x6 + delay 0x7 + launchtemplate gCoreEnforcerSnoreTemplate 0x2 0x2 0x0 0x0 + launchtask AnimTask_ShakeMon2 0x2 0x5 ANIM_TARGET 0x2 0x0 0x1e 0x1 + launchtask AnimTask_ShakeMon2 0x2 0x5 ANIM_DEF_PARTNER 0x2 0x0 0x1e 0x1 + launchtask AnimTask_ShakeMon2 0x2 0x5 ANIM_ATK_PARTNER 0x2 0x0 0x1e 0x1 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + launchtemplate gCoreEnforcerExplosionTemplate 0x3 0x4 0x0 0x0 ANIM_TARGET 0x1 + delay 0x6 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + launchtemplate gCoreEnforcerExplosionTemplate 0x3 0x4 0x18 0xffe8 ANIM_TARGET 0x1 + delay 0x6 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + launchtemplate gCoreEnforcerExplosionTemplate 0x3 0x4 0xfff0 0x10 ANIM_TARGET 0x1 + delay 0x6 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + launchtemplate gCoreEnforcerExplosionTemplate 0x3 0x4 0xffe8 0xfff4 ANIM_TARGET 0x1 + delay 0x6 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + launchtemplate gCoreEnforcerExplosionTemplate 0x3 0x4 0x10 0x10 ANIM_TARGET 0x1 + delay 0x6 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + launchtemplate gCoreEnforcerExplosionTemplate 0x3 0x4 0xffe8 0x18 ANIM_TARGET 0x1 + waitforvisualfinish + call UnsetPsychicBg + clearmonbg ANIM_TARGET + blendoff + end + + +Move_TROP_KICK:: + loadspritegfx ANIM_TAG_HANDS_AND_FEET @kick + loadspritegfx ANIM_TAG_LEAF @leaves + loadspritegfx ANIM_TAG_FLOWER @flowers + monbg ANIM_DEF_PARTNER + launchtemplate gTropKickGreenFootTemplate 0x2 0x8 0xfff0 0x8 0x0 0x0 0xa 0x1 0x1 0x1 + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_TARGET 0x4 0x0 0x6 0x1 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + delay 0xA + playsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER + launchtemplate gTropKickLeavesTemplate, ANIM_TARGET, 5, 0, 10, 192, 176, 40 + launchtemplate gTropKickLeavesTemplate, ANIM_TARGET, 5, 0, 10, -192, 240, 40 + launchtemplate gTropKickFlowerTemplate, ANIM_TARGET, 5, 0, 10, 192, -160, 40 + launchtemplate gTropKickFlowerTemplate, ANIM_TARGET, 5, 0, 10, -192, -112, 40 + launchtemplate gTropKickFlowerTemplate, ANIM_TARGET, 5, 0, 10, 160, 48, 40 + launchtemplate gTropKickLeavesTemplate, ANIM_TARGET, 5, 0, 10, -224, -32, 40 + launchtemplate gTropKickLeavesTemplate, ANIM_TARGET, 5, 0, 10, 112, -128, 40 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + end + + +Move_INSTRUCT:: + loadspritegfx ANIM_TAG_FINGER @finger + loadspritegfx ANIM_TAG_SPOTLIGHT @spotlight + setalpha 12, 8 + launchtemplate gMetronomeFingerSpriteTemplate 0xc 0x1 0x0 + delay 0x18 + loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 0x16, 0x3 + waitforvisualfinish + launchtask AnimTask_HardwarePaletteFade 0x2 0x5 0xf8 0x3 0x0 0xa 0x0 + waitforvisualfinish + launchtemplate gSpotlightSpriteTemplate 0x82 0x2 0x0 0xfff8 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0x0 0x8 0x7DB9 + delay 0x4 + monbg ANIM_TARGET + launchtask AnimTask_BlendMonInAndOut 0x5 0x5 0x0 0x37b 0xc 0x1 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x3 0x0 0x29 0x1 + playsewithpan SE_M_BIND, SOUND_PAN_TARGET + delay 0x1A + launchtask AnimTask_BlendMonInAndOut 0x5 0x5 0x0 0x37b 0xc 0x1 0x1 + playsewithpan SE_M_BIND, SOUND_PAN_TARGET + delay 0x1A + launchtask AnimTask_BlendMonInAndOut 0x5 0x5 0x0 0x37b 0xc 0x1 0x1 + playsewithpan SE_M_BIND, SOUND_PAN_TARGET + delay 0x1D + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0x8 0x0 0x7DB9 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end + + +Move_BEAK_BLAST:: + loadspritegfx ANIM_TAG_SMALL_EMBER @Fire + playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER + delay 0x3 + launchtask AnimTask_BlendColorCycle 0x2 0x6 ANIM_PAL_ATK 0x2 0x2 0x0 0xb 0x1f + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x0 + waitforvisualfinish + end +BeakBlastUnleash: + loadspritegfx ANIM_TAG_IMPACT + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 ANIM_PAL_ATK 0x2 0x0 0x9 0x1F + waitforvisualfinish + launchtemplate gBowMonSpriteTemplate 0x2 0x1 0x0 + playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER + waitforvisualfinish + delay 0x2 + launchtemplate gBowMonSpriteTemplate 0x2 0x1 0x1 + delay 0x2 + loopsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET 0x4 0x8 + launchtask AnimTask_DrillPeckHitSplats 0x5 0x0 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0x4 0x0 0x12 0x1 + waitforvisualfinish + launchtemplate gBowMonSpriteTemplate 0x2 0x1 0x2 + waitforvisualfinish + launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_ATTACKER 0x0 0x6 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 ANIM_PAL_ATK 0x2 0x9 0x0 0x1F + waitforvisualfinish + end + + +Move_CLANGING_SCALES:: + loadspritegfx ANIM_TAG_METAL_SOUND_WAVES @metal sound + loadspritegfx ANIM_TAG_POISON_BUBBLE @purple color + monbg ANIM_DEF_PARTNER + monbgprio_2A 0x1 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x2002 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_METAL_SOUND_WAVES, 0, 10, 10, 0x642D + waitforvisualfinish + launchtask AnimTask_ShakeMon2 0x2 0x5 0x0 0x2 0x0 0x8 0x1 + call ClangingScalesMetalSound + call ClangingScalesMetalSound + call ClangingScalesMetalSound + call ClangingScalesMetalSound + delay 0x5 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0 0x3 0xf 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_DEF_PARTNER 0x0 0x3 0xf 0x1 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + delay 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x2002 + waitforvisualfinish + end +ClangingScalesMetalSound: + panse_1B SE_M_SCREECH, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 + launchtemplate gClangingScalesPurpleMetalSoundTemplate 0x82 0x7 0x10 0x0 0x0 0x0 0x1e 0x0 ANIM_TARGET + launchtemplate gClangingScalesPurpleMetalSoundTemplate 0x82 0x7 0x10 0x0 0x0 0x0 0x1e 0x0 ANIM_DEF_PARTNER + delay 0x2 + return + + +Move_DRAGON_HAMMER:: + loadspritegfx ANIM_TAG_ROUND_SHADOW + loadspritegfx ANIM_TAG_GRAY_SMOKE + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ROUND_SHADOW, 0, 12, 12, 0x7D7F @Pinkish purple + fadetobg BG_COSMIC + waitbgfadeout + launchtask AnimTask_StartSlidingBg 0x5 0x4 0x0, -500, 0x0 0xffff + waitbgfadein + setblends 0xF + launchtemplate gSlideMonToOffsetSpriteTemplate 0x2 0x5 ANIM_ATTACKER 0x1a 0x0 0x0 0x5 + delay 0x6 + playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET + launchtemplate gBounceBallLandSpriteTemplate 0x83 0x0 + delay 0x2 + launchtask AnimTask_SquishTarget 0x2 0x0 + delay 0x5 + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 2, 8, 8, 1, 0 + delay 2 + createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 2, -8, -8, 1, 0 + delay 2 + createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 2, 8, -8, 1, 0 + delay 2 + createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 2, -8, 8, 1, 0 + delay 2 + createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 2, 8, 8, 1, 0 + delay 2 + createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 2, -8, -8, 1, 0 + delay 2 + createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 2, 8, -8, 1, 0 + delay 2 + createsprite gOctazookaSmokeSpriteTemplate, ANIM_TARGET, 2, -8, 8, 1, 0 + delay 51 + launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_ATTACKER 0x0 0x5 + waitforvisualfinish + call UnsetPsychicBg + blendoff + end + + +Move_BRUTAL_SWING:: + loadspritegfx ANIM_TAG_IMPACT @hits + loadspritegfx ANIM_TAG_HANDS_AND_FEET @black color + monbg ANIM_TARGET + setalpha 12, 8 + fadetobg BG_DARK + waitbgfadeout + playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER + launchtemplate gVerticalDipSpriteTemplate 0x2 0x3 0x6 0x1 0x0 + waitforvisualfinish + delay 0xb + launchtemplate gSlideMonToOffsetSpriteTemplate 0x2 0x5 ANIM_ATTACKER 0x1a 0x0 0x0 0x5 + delay 0x6 + launchtemplate gBrutalSwingBasicImpactTemplate 0x83 0x4 0xffe0 0xfff0 0x1 0x1 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0 0x3 0x15 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_DEF_PARTNER 0x0 0x3 0x15 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_ATK_PARTNER 0x0 0x3 0x15 0x1 + delay 0x4 + launchtemplate gBrutalSwingRandomImpactTemplate 0x83 0x2 0x1 0x1 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gBrutalSwingRandomImpactTemplate 0x83 0x2 0x1 0x1 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gBrutalSwingBasicImpactTemplate 0x83 0x4 0x20 0x14 0x1 0x1 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + waitsound + launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_ATTACKER 0x0 0x6 + waitforvisualfinish + restorebg + blendoff + clearmonbg ANIM_TARGET + end + + +Move_AURORA_VEIL:: + loadspritegfx ANIM_TAG_GUARD_RING + fadetobg BG_AURORA + waitbgfadeout + launchtask AnimTask_StartSlidingBg 0x5 0x4 0x400 0x0 0x0 0xffff + waitbgfadein + monbg ANIM_ATK_PARTNER + setalpha 8, 8 + playsewithpan SE_M_MILK_DRINK, SOUND_PAN_ATTACKER + launchtemplate gAuroraVeilRingTemplate 0x2 0x0 + delay 0x4 + launchtemplate gAuroraVeilRingTemplate 0x2 0x0 + delay 0x4 + launchtemplate gAuroraVeilRingTemplate 0x2 0x0 + waitforvisualfinish + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + launchtask AnimTask_BlendColorCycle 0x2 0x6 0xa 0x0 0x2 0x0 0xa 0x7fff + waitforvisualfinish + call UnsetPsychicBg + waitforvisualfinish + clearmonbg ANIM_ATK_PARTNER + blendoff + end + + +Move_SHELL_TRAP:: +ShellTrapChargeUp: + loadspritegfx ANIM_TAG_SMALL_EMBER + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_TARGET + setalpha 12, 8 + call FireSpreadEffect + delay 0x4 + playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET + delay 0x15 + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0x0 0x0 0x1 0x2 + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0x0 0xA 0x1 0x2 + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0xA 0x0 0x1 0x2 + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0xA 0xA 0x1 0x2 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end +ShellTrapUnleash: + loadspritegfx ANIM_TAG_IMPACT @pound + loadspritegfx ANIM_TAG_SMALL_RED_EYE @red + loadspritegfx ANIM_TAG_SMALL_EMBER @fire + loadspritegfx ANIM_TAG_ICE_CRYSTALS @fire launches + loadspritegfx ANIM_TAG_JAGGED_MUSIC_NOTE @red + monbg ANIM_TARGET + waitplaysewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER, 0x10 + delay 0x6 + launchtemplate gShellTrapYellowImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + delay 0x5 + launchtemplate gShellTrapYellowImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + delay 0x5 + launchtemplate gShellTrapYellowImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + delay 0x5 + launchtemplate gShellTrapYellowImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + delay 0x5 + launchtemplate gShellTrapYellowImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + delay 0x5 + launchtemplate gShellTrapYellowImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + delay 0x5 + launchtemplate gShellTrapYellowImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + delay 0x5 + launchtemplate gShellTrapYellowImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + delay 0x5 + launchtemplate gShellTrapYellowImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + delay 0x5 + launchtemplate gShellTrapRedImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + delay 0x5 + launchtemplate gShellTrapRedImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + delay 0x5 + launchtemplate gShellTrapRedImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + delay 0x5 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x0 + launchtemplate gShellTrapRedImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x4 + launchtemplate gShellTrapRedImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x8 + launchtemplate gShellTrapRedImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0xc + launchtemplate gShellTrapRedImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x10 + launchtemplate gShellTrapRedImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x14 + launchtemplate gShellTrapRedImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x18 + launchtemplate gShellTrapRedImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + launchtemplate gShellTrapRedImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + delay 0x5 + launchtemplate gShellTrapRedImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + delay 0x5 + launchtemplate gShellTrapRedImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + delay 0x5 + launchtemplate gShellTrapRedImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + delay 0x5 + launchtemplate gShellTrapRedImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + delay 0x5 + launchtemplate gShellTrapRedImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + delay 0x5 + launchtemplate gShellTrapRedImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + delay 0x5 + launchtemplate gShellTrapRedImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + delay 0x5 + launchtemplate gShellTrapRedImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + delay 0x5 + waitforvisualfinish + call ShellTrapFireLaunch1 + launchtemplate gShellTrapFireHitsTemplate 0x28 0x8 0x0 0x0 0x0 0x0 0x38 0x4 0x4 0x1 + delay 0x3 + launchtemplate gShellTrapFireHitsTemplate 0x28 0x8 0x0 0xfff6 0x0 0xfff6 0x38 0x4 0x4 0x1 + delay 0x3 + launchtemplate gShellTrapFireHitsTemplate 0x28 0x8 0x0 0xa 0x0 0xa 0x38 0xfffc 0x3 0x1 + delay 0x3 + launchtemplate gShellTrapFireHitsTemplate 0x28 0x8 0x0 0xffec 0x0 0xffec 0x38 0xfffc 0x5 0x1 + delay 0x3 + call ShellTrapFireLaunch2 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x3 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x3 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x3 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x3 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x3 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x3 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x3 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x3 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x3 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x3 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x3 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x3 + waitforvisualfinish + clearmonbg ANIM_TARGET + end +ShellTrapFireLaunch1: + launchtemplate gShellTrapFireHitsTemplate 0x28 0x8 0x0 0x0 0x0 0x0 0x38 0x4 0x4 0x1 + delay 0x3 + launchtemplate gShellTrapFireHitsTemplate 0x28 0x8 0x0 0xfff6 0x0 0xfff6 0x38 0x4 0x4 0x1 + delay 0x3 + launchtemplate gShellTrapFireHitsTemplate 0x28 0x8 0x0 0xa 0x0 0xa 0x38 0xfffc 0x3 0x1 + delay 0x3 + launchtemplate gShellTrapFireHitsTemplate 0x28 0x8 0x0 0xffec 0x0 0xffec 0x38 0xfffc 0x5 0x1 + delay 0x3 + launchtemplate gShellTrapFireHitsTemplate 0x28 0x8 0x0 0xf 0x0 0xf 0x38 0x4 0x4 0x1 + delay 0x3 + launchtemplate gShellTrapFireHitsTemplate 0x28 0x8 0x0 0xffec 0x0 0xffec 0x38 0x4 0x4 0x1 + delay 0x3 + launchtemplate gShellTrapFireHitsTemplate 0x28 0x8 0x0 0x14 0x0 0x14 0x38 0x4 0x4 0x1 + delay 0x3 + return +ShellTrapFireLaunch2: + launchtemplate gShellTrapFireHitsTemplate 0x28 0x8 0x0 0x0 0x0 0x0 0x38 0x4 0x4 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 0x3 + launchtemplate gShellTrapFireHitsTemplate 0x28 0x8 0x0 0xfff6 0x0 0xfff6 0x38 0x4 0x4 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 0x3 + launchtemplate gShellTrapFireHitsTemplate 0x28 0x8 0x0 0xa 0x0 0xa 0x38 0xfffc 0x3 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 0x3 + launchtemplate gShellTrapFireHitsTemplate 0x28 0x8 0x0 0xffec 0x0 0xffec 0x38 0xfffc 0x5 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 0x3 + launchtemplate gShellTrapFireHitsTemplate 0x28 0x8 0x0 0xf 0x0 0xf 0x38 0x4 0x4 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 0x3 + launchtemplate gShellTrapFireHitsTemplate 0x28 0x8 0x0 0xffec 0x0 0xffec 0x38 0x4 0x4 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 0x3 + launchtemplate gShellTrapFireHitsTemplate 0x28 0x8 0x0 0x14 0x0 0x14 0x38 0x4 0x4 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER + delay 0x3 + return + + +Move_FLEUR_CANNON:: + loadspritegfx ANIM_TAG_ORBS @beam particles + loadspritegfx ANIM_TAG_ELECTRICITY @discharge + loadspritegfx ANIM_TAG_PINK_PETAL @pink color + loadspritegfx ANIM_TAG_PINK_HEART @pink color + setalpha 12, 8 + monbg ANIM_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xF 0x7440 + waitforvisualfinish + panse_1B SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_ATTACKER 0x0 0x4 0x32 0x1 + createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_ORBS, 1, 12, 0x1f, 16, 0, 0 + call FleurCannonBeam + call FleurCannonBeam + call FleurCannonBeam + launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0x4 0x0 0x32 0x1 + call FleurCannonBeam + call FleurCannonBeam + call FleurCannonBeam + call FleurCannonBeam + call FleurCannonBeam + call FleurCannonBeam + call FleurCannonBeam + call FleurCannonBeam + call FleurCannonBeam + call FleurCannonBeam + call FleurCannonBeam + call FleurCannonBeam + call FleurCannonBeam + call FleurCannonBeam + call FleurCannonBeam + call FleurCannonBeam + call FleurCannonBeam + call FleurCannonBeam + delay 0x20 + launchtemplate gFleurCannonDischargeTemplate 0x2 0x3 0x1 0x10 0x10 + delay 0x2 + launchtemplate gFleurCannonDischargeTemplate 0x2 0x3 0x1 0xfff0 0xfff0 + delay 0x5 + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_TARGET 0x0 0x5 0xb 0x1 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x10 0x0 0x7440 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end +FleurCannonBeam: + launchtemplate gFleurCannonOrbTemplate 0x82 0x0 + launchtemplate gFleurCannonOrbTemplate 0x82 0x0 + delay 0x1 + launchtemplate gFleurCannonOrbTemplate 0x82 0x0 + launchtemplate gFleurCannonOrbTemplate 0x82 0x0 + delay 0x1 + return + + +Move_PSYCHIC_FANGS:: + loadspritegfx ANIM_TAG_SHARP_TEETH @Teeth + loadspritegfx ANIM_TAG_IMPACT @Hit + loadspritegfx ANIM_TAG_BLUE_LIGHT_WALL @Screen + loadspritegfx ANIM_TAG_TORN_METAL @Broken Screen + monbg ANIM_TARGET + call SetPsychicBackground + setalpha 12, 8 + choosetwoturnanim PsychicFangsRegular PsychicFangsDestroyWall +PsychicFangsRegular: + playsewithpan SE_M_BITE, SOUND_PAN_TARGET + launchtemplate gSharpTeethSpriteTemplate 0x2 0x6 0xffe0 0xffe0 0x1 0x333 0x333 0xa + launchtemplate gSharpTeethSpriteTemplate 0x2 0x6 0x20 0x20 0x5 0xfccd 0xfccd 0xa + delay 0xa + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0xfff8 0x0 0x1 0x1 + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_TARGET 0x0 0x7 0x5 0x2 + delay 0x10 + playsewithpan SE_M_BITE, SOUND_PAN_TARGET + launchtemplate gSharpTeethSpriteTemplate 0x2 0x6 0x20 0xffe0 0x7 0xfccd 0x333 0xa + launchtemplate gSharpTeethSpriteTemplate 0x2 0x6 0xffe0 0x20 0x3 0x333 0xfccd 0xa + delay 0xa + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0x8 0x0 0x1 0x1 + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_TARGET 0x0 0x8 0x4 0x2 +PsychicFangsEnd: + playsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + call UnsetPsychicBg + end +PsychicFangsDestroyWall: + launchtemplate gBrickBreakWallSpriteTemplate 0x3 0x5 0x1 0x0 0x0 0x21 0xa + playsewithpan SE_M_BITE, SOUND_PAN_TARGET + launchtemplate gSharpTeethSpriteTemplate 0x2 0x6 0xffe0 0xffe0 0x1 0x333 0x333 0xa + launchtemplate gSharpTeethSpriteTemplate 0x2 0x6 0x20 0x20 0x5 0xfccd 0xfccd 0xa + delay 0xa + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0xfff8 0x0 0x1 0x1 + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_TARGET 0x0 0x7 0x5 0x2 + delay 0x10 + playsewithpan SE_M_BITE, SOUND_PAN_TARGET + launchtemplate gSharpTeethSpriteTemplate 0x2 0x6 0x20 0xffe0 0x7 0xfccd 0x333 0xa + launchtemplate gSharpTeethSpriteTemplate 0x2 0x6 0xffe0 0x20 0x3 0x333 0xfccd 0xa + delay 0xa + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0x8 0x0 0x1 0x1 + launchtemplate gBrickBreakWallShardSpriteTemplate 0x2 0x4 0x1 0x0 0xfff8 0xfff4 + launchtemplate gBrickBreakWallShardSpriteTemplate 0x2 0x4 0x1 0x1 0x8 0xfff4 + launchtemplate gBrickBreakWallShardSpriteTemplate 0x2 0x4 0x1 0x2 0xfff8 0xc + launchtemplate gBrickBreakWallShardSpriteTemplate 0x2 0x4 0x1 0x3 0x8 0xc + playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_TARGET 0x0 0x8 0x4 0x2 + delay 0x10 + goto PsychicFangsEnd + + +Move_STOMPING_TANTRUM:: + loadspritegfx ANIM_TAG_ROCKS @rock colour + loadspritegfx ANIM_TAG_SMALL_ROCK @small rock + loadspritegfx ANIM_TAG_IMPACT @pound hit + loadspritegfx ANIM_TAG_SMALL_EMBER @hit color + monbg ANIM_TARGET + launchtask AnimTask_Splash 0x2 0x2 ANIM_ATTACKER 0x3 + delay 0x5 + launchtask AnimTask_HorizontalShake 0x5 0x3 0x5 0xa 0x5 + launchtask AnimTask_HorizontalShake 0x5 0x3 0x4 0xa 0x5 + launchtemplate gStompingTantrumRockTemplate 0x2 0x2 0x0 0x0 + launchtemplate gStompingTantrumRockTemplate 0x2 0x2 0x0 0x1 + launchtemplate gStompingTantrumRockTemplate 0x2 0x2 0x0 0x2 + launchtemplate gStompingTantrumRockTemplate 0x2 0x2 0x0 0x3 + call StompingTantrumImpact + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + delay 0x25 + launchtemplate gStompingTantrumRockTemplate 0x2 0x2 0x0 0x0 + launchtemplate gStompingTantrumRockTemplate 0x2 0x2 0x0 0x1 + launchtemplate gStompingTantrumRockTemplate 0x2 0x2 0x0 0x2 + launchtemplate gStompingTantrumRockTemplate 0x2 0x2 0x0 0x3 + call StompingTantrumImpact + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + delay 0x25 + launchtemplate gStompingTantrumRockTemplate 0x2 0x2 0x0 0x0 + launchtemplate gStompingTantrumRockTemplate 0x2 0x2 0x0 0x1 + launchtemplate gStompingTantrumRockTemplate 0x2 0x2 0x0 0x2 + launchtemplate gStompingTantrumRockTemplate 0x2 0x2 0x0 0x3 + call StompingTantrumImpact + playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg ANIM_TARGET + end +StompingTantrumImpact: + launchtemplate gRandomPosHitSplatSpriteTemplate 0x83 0x2 0x1 0x1 + return + + +Move_SHADOW_BONE:: + loadspritegfx ANIM_TAG_BONE + loadspritegfx ANIM_TAG_IMPACT + fadetobg BG_NIGHTMARE + waitbgfadein + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_M_BONEMERANG, SOUND_PAN_TARGET + launchtemplate gSpinningBoneSpriteTemplate 0x2 0x5 0xffd6 0xffe7 0x0 0x0 0xf + delay 0xc + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0x0 0x0 0x1 0x1 + launchtask AnimTask_ShakeMon 0x5 0x5 0x1 0x0 0x5 0x5 0x1 + launchtemplate gComplexPaletteBlendSpriteTemplate 0x2 0x7 0x7 0x5 0x1 0x0 0xa 0x0 0x0 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + waitforvisualfinish + launchtask AnimTask_NightmareClone 0x2 0x0 + launchtask AnimTask_ShakeMon 0x2 0x5 0x1 0x3 0x0 0x28 0x1 + playsewithpan SE_M_NIGHTMARE, SOUND_PAN_TARGET + waitforvisualfinish + restorebg + waitbgfadein + clearmonbg 0x3 + blendoff + end + + +Move_ACCELEROCK:: + loadspritegfx ANIM_TAG_ROCKS + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_ATK_PARTNER + setalpha 12, 8 + launchtask AnimTask_TranslateMonEllipticalRespectSide 0x2 0x5 0x0 0x18 0x6 0x1 0x5 + launchtask AnimTask_TraceMonBlended 0x2 0x4 0x0 0x4 0x7 0x3 + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + delay 0x4 + launchtask AnimTask_ShakeMon 0x2 0x5 0x1 0x5 0x0 0x6 0x1 + launchtemplate gBasicHitSplatSpriteTemplate 0x84, 0x4, 0x0 0x0 0x1 0x1 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + launchtemplate gHorizontalLungeSpriteTemplate 0x2 0x5 0x1 0x3 0x0 0x5 0x1 + launchtemplate gRockFragmentSpriteTemplate 0x82 0x6 0x5 0x0 0xffec 0x18 0xe 0x1 + launchtemplate gRockFragmentSpriteTemplate 0x82 0x6 0x0 0x5 0x14 0xffe8 0xe 0x2 + launchtemplate gRockFragmentSpriteTemplate 0x82 0x6 0xfffb 0x0 0xffec 0xffe8 0xe 0x2 + launchtemplate gHorizontalLungeSpriteTemplate 0x2 0x5 0x1 0x3 0x0 0x5 0x1 + waitforvisualfinish + clearmonbg ANIM_ATK_PARTNER + blendoff + waitforvisualfinish + end + + +Move_LIQUIDATION:: + loadspritegfx ANIM_TAG_WATER_IMPACT + loadspritegfx ANIM_TAG_SMALL_BUBBLES + loadspritegfx ANIM_TAG_ICE_CRYSTALS + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_TARGET + setalpha 12, 8 + launchtemplate gHorizontalLungeSpriteTemplate 0x2 0x2 0x4 0x4 + delay 0x6 + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0x0 0x0 0x1 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 0x1 0x3 0x0 0x6 0x1 + playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET + waitforvisualfinish + call RisingWaterHitEffect + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + end + + +Move_PRISMATIC_LASER:: + loadspritegfx ANIM_TAG_ICE_CHUNK @blue green color + loadspritegfx ANIM_TAG_SPARK_H @yellow color + loadspritegfx ANIM_TAG_JAGGED_MUSIC_NOTE @red color + loadspritegfx ANIM_TAG_RAZOR_LEAF @green color + loadspritegfx ANIM_TAG_POISON_BUBBLE @violet color + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge animation + loadspritegfx ANIM_TAG_TEAL_ALERT @straight lines + loadspritegfx ANIM_TAG_GREEN_SPIKE @needle arm animation + loadspritegfx ANIM_TAG_NEEDLE @sting + monbg ANIM_ATTACKER + setblends 0x80E + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x10 0x0 + playsewithpan SE_ELEVATOR, SOUND_PAN_ATTACKER + launchtemplate gPrismaticLaserChargeTemplate 0x2 0x1 0x0 + call PrismaticLaserInwardSpikes + playsewithpan SE_ELEVATOR, SOUND_PAN_ATTACKER + call PrismaticLaserInwardSpikes + playsewithpan SE_ELEVATOR, SOUND_PAN_ATTACKER + call PrismaticLaserInwardSpikes + playsewithpan SE_ELEVATOR, SOUND_PAN_ATTACKER + call PrismaticLaserInwardSpikes + playsewithpan SE_ELEVATOR, SOUND_PAN_ATTACKER + delay 0x1E + call PrismaticLaserOutwardSpikes + delay 0x5 + call PrismaticLaserOutwardSpikes2 + delay 0x5 + call PrismaticLaserOutwardSpikes + delay 0x5 + call PrismaticLaserOutwardSpikes2 + delay 0x5 + call PrismaticLaserOutwardSpikes + waitforvisualfinish + unloadspritegfx ANIM_TAG_TEAL_ALERT + unloadspritegfx ANIM_TAG_GREEN_SPIKE + unloadspritegfx ANIM_TAG_ICE_CHUNK + unloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT + delay 0x1E + launchtask AnimTask_HorizontalShake 0x5 0x3 0x5 0xa 0x32 + launchtask AnimTask_HorizontalShake 0x5 0x3 0x4 0xa 0x32 + playsewithpan SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER + call PrismaticLaserRain + call PrismaticLaserRain + call PrismaticLaserRain + call PrismaticLaserRain + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x10 0x0 0x0 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + blendoff + end +PrismaticLaserOutwardSpikes: + launchtemplate gPrismaticLaserRedOutwardTemplate 0x82 0x5 0x0 0x1 0x0 0xFF90 0x10 @up + launchtemplate gPrismaticLaserGreenOutwardTemplate 0x82 0x5 0x0 0x1 0x5F 0xFF9D 0x10 @upper right + launchtemplate gPrismaticLaserYellowOutwardTemplate 0x82 0x5 0x0 0x1 0x73 0x0 0x10 @right + launchtemplate gPrismaticLaserVioletOutwardTemplate 0x82 0x5 0x0 0x1 0x4F 0x37 0x10 @lower right + launchtemplate gPrismaticLaserRedOutwardTemplate 0x82 0x5 0x0 0x1 0x0 0x53 0x10 @down + launchtemplate gPrismaticLaserGreenOutwardTemplate 0x82 0x5 0x0 0x1 0xFFB0 0x43 0x10 @lower left + launchtemplate gPrismaticLaserYellowOutwardTemplate 0x82 0x5 0x0 0x1 0xFF60 0x0 0x10 @left + launchtemplate gPrismaticLaserVioletOutwardTemplate 0x82 0x5 0x0 0x1 0xFFAA 0xFF94 0x10 @upper left + playsewithpan SE_M_MIST, SOUND_PAN_ATTACKER + return +PrismaticLaserOutwardSpikes2: + launchtemplate gPrismaticLaserVioletOutwardTemplate 0x82 0x5 0x0 0x1 0xFFE0 0x43 0x10 @between lower left and down + launchtemplate gPrismaticLaserYellowOutwardTemplate 0x82 0x5 0x0 0x1 0x1F 0x37 0x10 @between lower right and down + launchtemplate gPrismaticLaserYellowOutwardTemplate 0x82 0x5 0x0 0x1 0xFFDA 0xFF94 0x10 @between up and upper left + launchtemplate gPrismaticLaserRedOutwardTemplate 0x82 0x5 0x0 0x1 0xFF60 0x43 0x10 @between left and lower left + launchtemplate gPrismaticLaserGreenOutwardTemplate 0x82 0x5 0x0 0x1 0xFF2A 0xFFAA 0x10 @between left and upper left + launchtemplate gPrismaticLaserVioletOutwardTemplate 0x82 0x5 0x0 0x1 0x2D 0xFF9D 0x10 @between up and upper right + launchtemplate gPrismaticLaserRedOutwardTemplate 0x82 0x5 0x0 0x1 0xDF 0xFF9D 0x10 @between right and upper right + launchtemplate gPrismaticLaserGreenOutwardTemplate 0x82 0x5 0x0 0x1 0x9F 0x37 0x10 @between right and lower right + playsewithpan SE_M_MIST, SOUND_PAN_ATTACKER + return +PrismaticLaserInwardSpikes: + launchtemplate gPrismaticLaserRedInwardTemplate 0x82 0x5 0x0 0x0 0x0 0xFF90 0x10 @up + launchtemplate gPrismaticLaserVioletInwardTemplate 0x82 0x5 0x0 0x0 0xFFE0 0x43 0x10 @between lower left and down + delay 0x1 + launchtemplate gPrismaticLaserGreenInwardTemplate 0x82 0x5 0x0 0x0 0x5F 0xFF9D 0x10 @upper right + launchtemplate gPrismaticLaserYellowInwardTemplate 0x82 0x5 0x0 0x0 0x1F 0x37 0x10 @between lower right and down + launchtemplate gPrismaticLaserYellowInwardTemplate 0x82 0x5 0x0 0x0 0xFFDA 0xFF94 0x10 @between up and upper left + delay 0x1 + launchtemplate gPrismaticLaserYellowInwardTemplate 0x82 0x5 0x0 0x0 0x73 0x0 0x10 @right + launchtemplate gPrismaticLaserRedInwardTemplate 0x82 0x5 0x0 0x0 0xFF60 0x43 0x10 @between left and lower left + delay 0x1 + launchtemplate gPrismaticLaserVioletInwardTemplate 0x82 0x5 0x0 0x0 0x4F 0x37 0x10 @lower right + launchtemplate gPrismaticLaserGreenInwardTemplate 0x82 0x5 0x0 0x0 0xFF2A 0xFFAA 0x10 @between left and upper left + delay 0x1 + launchtemplate gPrismaticLaserRedInwardTemplate 0x82 0x5 0x0 0x0 0x0 0x53 0x10 @down + launchtemplate gPrismaticLaserVioletInwardTemplate 0x82 0x5 0x0 0x0 0x2D 0xFF9D 0x10 @between up and upper right + delay 0x1 + launchtemplate gPrismaticLaserGreenInwardTemplate 0x82 0x5 0x0 0x0 0xFFB0 0x43 0x10 @lower left + launchtemplate gPrismaticLaserRedInwardTemplate 0x82 0x5 0x0 0x0 0xDF 0xFF9D 0x10 @between right and upper right + delay 0x1 + launchtemplate gPrismaticLaserYellowInwardTemplate 0x82 0x5 0x0 0x0 0xFF60 0x0 0x10 @left + launchtemplate gPrismaticLaserGreenInwardTemplate 0x82 0x5 0x0 0x0 0x9F 0x37 0x10 @between right and lower right + delay 0x1 + launchtemplate gPrismaticLaserVioletInwardTemplate 0x82 0x5 0x0 0x0 0xFFAA 0xFF94 0x10 @upper left + delay 0x1 + return +PrismaticLaserRain: + launchtemplate gPrismaticLaserYellowRainTemplate 0x82, 0x4, 35, 0x3c, 4, ANIM_TARGET + delay 0x2 + launchtemplate gPrismaticLaserGreenRainTemplate 0x82, 0x4, -30, 0x44, 4, ANIM_TARGET + delay 0x2 + launchtemplate gPrismaticLaserRedRainTemplate 0x82, 0x4, 27, 0x37, 4, ANIM_TARGET + delay 0x2 + launchtemplate gPrismaticLaserVioletRainTemplate 0x82, 0x4, -20, 0x32, 4, ANIM_TARGET + delay 0x2 + launchtemplate gPrismaticLaserYellowRainTemplate 0x82, 0x4, 33, 0x3a, 4, ANIM_TARGET + delay 0x2 + launchtemplate gPrismaticLaserGreenRainTemplate 0x82, 0x4, -12, 0x3a, 4, ANIM_TARGET + delay 0x2 + launchtemplate gPrismaticLaserRedRainTemplate 0x82, 0x4, 19, 0x3c, 4, ANIM_TARGET + delay 0x2 + launchtemplate gPrismaticLaserVioletRainTemplate 0x82, 0x4, -38, 0x3a, 4, ANIM_TARGET + delay 0x2 + launchtemplate gPrismaticLaserYellowRainTemplate 0x82, 0x4, 5, 0x3c, 4, ANIM_TARGET + delay 0x2 + launchtemplate gPrismaticLaserGreenRainTemplate 0x82, 0x4, -23, 0x28, 4, ANIM_TARGET + return + + +Move_SPECTRAL_THIEF:: + choosetwoturnanim SpectralThiefSteal SpectralThiefUnleash +SpectralThiefUnleash: + loadspritegfx ANIM_TAG_HANDS_AND_FEET @Black Colour + loadspritegfx ANIM_TAG_QUICK_GUARD_HAND @Black Colour + loadspritegfx ANIM_TAG_GRAY_SMOKE @smoke + loadspritegfx ANIM_TAG_WHITE_SHADOW @destiny bond + loadspritegfx ANIM_TAG_IMPACT @hits + loadspritegfx ANIM_TAG_POISON_BUBBLE + fadetobg BG_GHOST + waitbgfadein + delay 0x5 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + launchtemplate gSpectralThiefBlackSmokeTemplate 0x82, 0x4, 0x8 0x8 0x0 0x0 + invisible 0x0 + delay 0x2 + launchtemplate gSpectralThiefBlackSmokeTemplate 0x82, 0x4, 0xfff8 0xfff8 0x0 0x0 + delay 0x2 + launchtemplate gSpectralThiefBlackSmokeTemplate 0x82, 0x4, 0x8 0xfff8 0x0 0x0 + delay 0x2 + launchtemplate gSpectralThiefBlackSmokeTemplate 0x82, 0x4, 0xfff8 0x8 0x0 0x0 + delay 0x2 + launchtemplate gSpectralThiefBlackSmokeTemplate 0x82, 0x4, 0x8 0x8 0x0 0x0 + delay 0x2 + launchtemplate gSpectralThiefBlackSmokeTemplate 0x82, 0x4, 0xfff8 0xfff8 0x0 0x0 + delay 0x2 + launchtemplate gSpectralThiefBlackSmokeTemplate 0x82, 0x4, 0x8 0xfff8 0x0 0x0 + delay 0x2 + launchtemplate gSpectralThiefBlackSmokeTemplate 0x82, 0x4, 0xfff8 0x8 0x0 0x0 + waitforvisualfinish + playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER + waitforvisualfinish + launchtask AnimTask_DestinyBondWhiteShadow 0x5 0x2 0x0 0x30 + delay 0x30 + launchtask AnimTask_ShakeMonInPlace 0x2 0x5 0x0 0x2 0x0 0x18 0x1 + launchtask AnimTask_BlendBattleAnimPalExclude 0x2 0x5 0x6 0x1 0x0 0xc 0x77bd + delay 0x18 + launchtask AnimTask_BlendBattleAnimPalExclude 0x2 0x5 0x6 0x1 0xc 0x0 0x77bd + waitforvisualfinish + setblends 0x1000 + delay 0x1 + monbg_22 ANIM_TARGET + launchtask AnimTask_MoveTargetMementoShadow 0x5 0x0 + playsewithpan SE_M_PSYBEAM, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg_23 ANIM_TARGET + delay 0x1 + blendoff + delay 0x1 + setalpha 12, 8 + monbg ANIM_TARGET + delay 0x1 + launchtemplate gSpectralThiefThiefImpactTemplate 0x82, 0x3, 0xfff6 0xfff6 0x0 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x4 + launchtemplate gSpectralThiefThiefImpactTemplate 0x82, 0x3, 0xa 0x14 0x0 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x4 + launchtemplate gSpectralThiefThiefImpactTemplate 0x82, 0x3, 0xfffb 0xa 0x0 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x4 + launchtemplate gSpectralThiefThiefImpactTemplate 0x82, 0x3, 0x11 0xfff4 0x0 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x4 + launchtemplate gSpectralThiefThiefImpactTemplate 0x82, 0x3, 0xfff1 0xf 0x0 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x4 + launchtemplate gSpectralThiefThiefImpactTemplate 0x82, 0x3, 0x0 0x0 0x0 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x4 + launchtemplate gSpectralThiefThiefImpactTemplate 0x82, 0x3, 0x14 0x2 0x0 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + waitforvisualfinish + visible 0x0 + delay 0x2 + restorebg + waitbgfadein + clearmonbg ANIM_TARGET + blendoff + end +SpectralThiefSteal: + loadspritegfx ANIM_TAG_HANDS_AND_FEET @black color + loadspritegfx ANIM_TAG_ORBS @mimic + loadspritegfx ANIM_TAG_FOCUS_ENERGY @focus energy + setblends 0x50b + monbgprio_29 + panse_1B SE_M_MINIMIZE, SOUND_PAN_TARGET, SOUND_PAN_ATTACKER, 0xfd, 0x0 + delay 0xf + launchtemplate gSpectralThiefBlackOrbsTemplate 0x82 0x2 0xfff4 0x18 + delay 0xB + setarg 0x7 0xffff + waitforvisualfinish + playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER + call SpectralThiefBuffUp + delay 0x8 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x0 0x1 0x0 0x20 0x1 + call SpectralThiefBuffUp + delay 0x8 + call SpectralThiefBuffUp + waitforvisualfinish + blendoff + end +SpectralThiefBuffUp: + launchtemplate gSpectralThiefBlackBuffTemplate 0x2 0x4 0x0 0xffe8 0x1a 0x2 + delay 0x4 + launchtemplate gSpectralThiefBlackBuffTemplate 0x2 0x4 0x0 0xe 0x1c 0x1 + delay 0x4 + launchtemplate gSpectralThiefBlackBuffTemplate 0x2 0x4 0x0 0xfffb 0xa 0x2 + delay 0x4 + launchtemplate gSpectralThiefBlackBuffTemplate 0x2 0x4 0x0 0x1c 0x1a 0x3 + delay 0x4 + launchtemplate gSpectralThiefBlackBuffTemplate 0x2 0x4 0x0 0xfff4 0x0 0x1 + return + + +Move_SUNSTEEL_STRIKE:: + loadspritegfx ANIM_TAG_ROUND_SHADOW @fly + loadspritegfx ANIM_TAG_AIR_WAVE_2 @black color + loadspritegfx ANIM_TAG_ROCKS @rock colour + loadspritegfx ANIM_TAG_SMALL_ROCK @small rock + monbg ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET + launchtemplate gSunsteelStrikeBlackFlyBallTemplate 0x2 0x4 0x0 0x0 0xd 0x150 + launchtask AnimTask_HorizontalShake 0x5 0x3 0x4 0x1 0x1A + delay 0x18 + launchtemplate gSunsteelStrikeRocksTemplate 0x2 0x2 0x0 0x0 @The rock particles mess up the fly animation + launchtemplate gSunsteelStrikeRocksTemplate 0x2 0x2 0x0 0x1 + launchtemplate gSunsteelStrikeRocksTemplate 0x2 0x2 0x0 0x2 + launchtemplate gSunsteelStrikeRocksTemplate 0x2 0x2 0x0 0x3 + waitforvisualfinish + unloadspritegfx ANIM_TAG_ROUND_SHADOW @fly + unloadspritegfx ANIM_TAG_AIR_WAVE_2 @black color + loadspritegfx ANIM_TAG_METEOR @superpower + loadspritegfx ANIM_TAG_GOLD_RING @beam + loadspritegfx ANIM_TAG_SMALL_RED_EYE @red color + loadspritegfx ANIM_TAG_IMPACT @hit + playsewithpan SE_ORB, SOUND_PAN_ATTACKER + createvisualtask AnimTask_BlendBattleAnimPal, 10, (ANIM_PAL_BG | ANIM_PAL_ATK), 3, 0, 15, 0 + waitforvisualfinish + call SunsteelStrikeBeam + call SunsteelStrikeBeam + call SunsteelStrikeBeam + call SunsteelStrikeBeam + call SunsteelStrikeBeam + call SunsteelStrikeBeam + call SunsteelStrikeBeam + call SunsteelStrikeBeam + call SunsteelStrikeBeam + call SunsteelStrikeBeam + stopsound + playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET + launchtemplate gSunsteelStrikeSuperpowerTemplate 0x82 0x1 0x14 + delay 0x14 + launchtemplate gSunsteelStrikeRedImpactTemplate 0x2 0x4 0x0 0x0 0x1 0x0 + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_TARGET 0x6 0x0 0x8 0x1 + waitforvisualfinish + unloadspritegfx ANIM_TAG_METEOR @superpower + unloadspritegfx ANIM_TAG_GOLD_RING @beam + unloadspritegfx ANIM_TAG_SMALL_RED_EYE @red color + unloadspritegfx ANIM_TAG_IMPACT @hit + loadspritegfx ANIM_TAG_SMALL_EMBER @FireSpreadEffect + call FireSpreadEffect + delay 0x4 + playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET + waitforvisualfinish + visible ANIM_ATTACKER + createvisualtask AnimTask_BlendBattleAnimPal, 10, (ANIM_PAL_BG | ANIM_PAL_ATK), 3, 15, 0, 0 + waitforvisualfinish + blendoff + clearmonbg ANIM_TARGET + end +SunsteelStrikeBeam: + launchtemplate gSunsteelStrikeYellowBeamTemplate 0x82 0x1 0x14 + delay 0x1 + launchtemplate gSunsteelStrikeRedBeamTemplate 0x82 0x1 0x14 + delay 0x1 + return + + +Move_MOONGEIST_BEAM:: + loadspritegfx ANIM_TAG_MOON + loadspritegfx ANIM_TAG_ELECTRIC_ORBS + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT + loadspritegfx ANIM_TAG_ORBS @hyper beam + loadspritegfx ANIM_TAG_WATER_GUN @water gun colour + loadspritegfx ANIM_TAG_ASSURANCE_HAND @purple colour + setalpha 8, 8 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x10 0x0 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRIC_ORBS, 0, 15, 15, 0x7FFF @White + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_CIRCLE_OF_LIGHT, 0, 15, 15, 0x7FFC @Light Blue + waitforvisualfinish + playsewithpan SE_M_MEGA_KICK, SOUND_PAN_TARGET + launchtemplate gMoonSpriteTemplate 0x80 0x2 0x20 0x15 + launchtask AnimTask_AlphaFadeIn 0x3 0x5 0x0 0x10 0x10 0x0 0x1 + call MoongeistBeamCharge + call MoongeistBeamCharge + call MoongeistBeamCharge + call MoongeistBeamCharge + launchtemplate gGrowingChargeOrbSpriteTemplate 0x2 0x1 0x0 @;Charge circle + call MoongeistBeamCharge + delay 0x20 + createsoundtask SoundTask_LoopSEAdjustPanning, 0x7, 0xCC, 0xffc0, SOUND_PAN_TARGET, 0x1, 0xf, 0x0, 0x5 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_ATTACKER 0x0 0x4 0x32 0x1 + createvisualtask AnimTask_FlashAnimTagWithColor, 2, ANIM_TAG_ORBS, 1, 12, 0x1f, 0x10, 0, 0 + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0x4 0x0 0x32 0x1 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0x0 0xb 0x6739 + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + call MoongeistBeamOrbs + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0xb 0x0 0x6739 + delay 0x1A + stopsound + launchtask AnimTask_MoonlightEndFade 0x2 0x0 + end +MoongeistBeamCharge: + launchtemplate gMoongeistBeamChargeTemplate 0, 0x6, 40, 0, 0, 0, 30, 10 @From right + launchtemplate gMoongeistBeamChargeTemplate 0, 0x6, -40, 0, 0, 0, 30, -10 @From left + launchtemplate gMoongeistBeamChargeTemplate 0, 0x6, -25, -40, 0, 0, 30, -20 @From top left + launchtemplate gMoongeistBeamChargeTemplate 0, 0x6, 25, -40, 0, 0, 30, 20 @From top right + launchtemplate gMoongeistBeamChargeTemplate 0, 0x6, 25, 20, 0, 0, 30, 20 @From bottom right + launchtemplate gMoongeistBeamChargeTemplate 0, 0x6, -25, 40, 0, 0, 30, -20 @From bottom left + delay 0x5 + return +MoongeistBeamOrbs: + launchtemplate gMoongeistBeamBlueOrbsTemplate 0x82 0x0 + launchtemplate gMoongeistBeamPurpleOrbsTemplate 0x82 0x0 + delay 0x1 + return + + +Move_TEARFUL_LOOK:: + loadspritegfx ANIM_TAG_SMALL_BUBBLES @tears + loadspritegfx ANIM_TAG_OPENING_EYE @eye + monbg ANIM_DEF_PARTNER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x5 0x7DE0 + waitforvisualfinish + playsewithpan SE_M_CONFUSE_RAY, SOUND_PAN_TARGET + launchtemplate gOpeningEyeSpriteTemplate 0x5 0x4 0x0 0x0 0x1 0x0 + delay 0x35 + loopsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER, 0xC, 0x2 + delay 0x8 + launchtemplate gTearDropSpriteTemplate 0x2 0x2 0x1 0x0 + launchtemplate gTearDropSpriteTemplate 0x2 0x2 0x1 0x1 + launchtemplate gTearDropSpriteTemplate 0x2 0x2 0x1 0x2 + launchtemplate gTearDropSpriteTemplate 0x2 0x2 0x1 0x3 + delay 0x8 + launchtemplate gTearDropSpriteTemplate 0x2 0x2 0x1 0x0 + launchtemplate gTearDropSpriteTemplate 0x2 0x2 0x1 0x1 + launchtemplate gTearDropSpriteTemplate 0x2 0x2 0x1 0x2 + launchtemplate gTearDropSpriteTemplate 0x2 0x2 0x1 0x3 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x5 0x0 0x7DE0 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + end + + +Move_ZING_ZAP:: + loadspritegfx ANIM_TAG_SPARK_2 @sparks + loadspritegfx ANIM_TAG_YELLOW_BALL @ball + loadspritegfx ANIM_TAG_THIN_RING @ring + loadspritegfx ANIM_TAG_SPARK_H @yellow color + loadspritegfx ANIM_TAG_SMALL_EMBER @yellow color + monbg ANIM_TARGET + call ZingZapSparks1 + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_ATTACKER 0x4 0x0 0x6 0x1 + delay 0xA + call ZingZapSparks2 + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_ATTACKER 0x4 0x0 0x6 0x1 + delay 0xA + call ZingZapSparks1 + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_ATTACKER 0x4 0x0 0x6 0x1 + delay 0xA + call ZingZapSparks2 + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_ATTACKER 0x4 0x0 0x6 0x1 + delay 0xA + launchtask AnimTask_TranslateMonEllipticalRespectSide 0x2 0x5 0x0 0x18 0x6 0x1 0x5 + delay 0x4 + call ZingZapSparks1 + invisible 0x0 + launchtemplate gZingZapYellowBallTemplate 0x82, 0x3, 0x0 0x0 0xF + delay 0xA + call ZingZapSparks2 + delay 0x5 + stopsound + playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER + waitforvisualfinish + launchtemplate gZingZapRingTemplate 0x3 0x6 0x0 0x0 0x1 0x0 0x1f 0x8 + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_TARGET 0x4 0x0 0x6 0x1 + call ElectricityEffect + visible 0x0 + waitforvisualfinish + clearmonbg ANIM_TARGET + end +ZingZapSparks1: + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x20 0x18 0xbe 0xc 0x0 0x1 0x0 + delay 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x50 0x18 0x16 0xc 0x0 0x1 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x9c 0x18 0x79 0xd 0x0 0x1 0x1 + return +ZingZapSparks2: + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x64 0x18 0x3c 0xa 0x0 0x1 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0xaa 0x18 0x2a 0xb 0x0 0x1 0x1 + delay 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0xee 0x18 0xa5 0xa 0x0 0x1 0x1 + return + + +Move_NATURES_MADNESS:: + loadspritegfx ANIM_TAG_ICE_CRYSTALS @small circles + loadspritegfx ANIM_TAG_THIN_RING @ring + loadspritegfx ANIM_TAG_SPARKLE_2 @stars + loadspritegfx ANIM_TAG_PINK_PETAL @pink + loadspritegfx ANIM_TAG_ICE_CHUNK @blue green + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge + loadspritegfx ANIM_TAG_TEAL_ALERT @charge particles + loadspritegfx ANIM_TAG_ECLIPSING_ORB @blue green + monbg ANIM_ATTACKER + setblends 0x80E + delay 0x1 + loopsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER, 0x10, 0x3 + launchtemplate gNaturesMadnessPinkStarsTemplate 0x2 0x4 0xa 0xa 0x19 0x0 + launchtemplate gNaturesMadnessCrystalsTemplate 0x2 0x4 0xa 0xa 0x19 0x0 + delay 0x4 + launchtemplate gNaturesMadnessPinkRingTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1F 0x8 + launchtemplate gNaturesMadnessPinkStarsTemplate 0x2 0x4 0xfff1 0x0 0x19 0x0 + launchtemplate gNaturesMadnessCrystalsTemplate 0x2 0x4 0xfff1 0x0 0x19 0x0 + delay 0x4 + launchtemplate gNaturesMadnessPinkStarsTemplate 0x2 0x4 0x14 0xa 0x19 0x0 + launchtemplate gNaturesMadnessCrystalsTemplate 0x2 0x4 0x14 0xa 0x19 0x0 + delay 0x4 + launchtemplate gNaturesMadnessPinkRingTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1F 0x8 + launchtemplate gNaturesMadnessPinkStarsTemplate 0x2 0x4 0x0 0xfff6 0x19 0x0 + launchtemplate gNaturesMadnessCrystalsTemplate 0x2 0x4 0x0 0xfff6 0x19 0x0 + delay 0x4 + launchtemplate gNaturesMadnessPinkStarsTemplate 0x2 0x4 0xfff6 0xf 0x19 0x0 + launchtemplate gNaturesMadnessCrystalsTemplate 0x2 0x4 0xfff6 0xf 0x19 0x0 + delay 0x4 + launchtemplate gNaturesMadnessPinkRingTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1F 0x8 + launchtemplate gNaturesMadnessPinkStarsTemplate 0x2 0x4 0x19 0x14 0x19 0x0 + launchtemplate gNaturesMadnessCrystalsTemplate 0x2 0x4 0x19 0x14 0x19 0x0 + delay 0x4 + launchtemplate gNaturesMadnessPinkStarsTemplate 0x2 0x4 0xffec 0x14 0x19 0x0 + launchtemplate gNaturesMadnessCrystalsTemplate 0x2 0x4 0xffec 0x14 0x19 0x0 + delay 0x4 + launchtemplate gNaturesMadnessPinkRingTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1F 0x8 + launchtemplate gNaturesMadnessPinkStarsTemplate 0x2 0x4 0xc 0x0 0x19 0x0 + launchtemplate gNaturesMadnessCrystalsTemplate 0x2 0x4 0xc 0x0 0x19 0x0 + clearmonbg ANIM_ATTACKER + delay 0x1 + monbg ANIM_TARGET + waitforvisualfinish + launchtemplate gNaturesMadnessGrayRingTemplate 0x28 0x4 0x0 0x0 0x1 0x0 + playsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER + delay 0xe + launchtemplate gNaturesMadnessGrayRingTemplate 0x28 0x4 0x0 0x0 0x1 0x0 + playsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER + delay 0xe + launchtemplate gNaturesMadnessGrayRingTemplate 0x28 0x4 0x0 0x0 0x1 0x0 + playsewithpan SE_M_HEAL_BELL, SOUND_PAN_ATTACKER + waitforvisualfinish + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + launchtemplate gNaturesMadnessPinkRingTemplate 0x3 0x6 0x0 0x0 0x1 0x0 0x1F 0x8 + launchtemplate gNaturesMadnessPinkStarsTemplate 0x2 0x4 0xa 0xa 0x19 0x1 + launchtemplate gNaturesMadnessPinkStarsTemplate 0x2 0x4 0xfff1 0x0 0x19 0x1 + launchtemplate gNaturesMadnessPinkStarsTemplate 0x2 0x4 0x14 0xa 0x19 0x1 + launchtemplate gNaturesMadnessPinkStarsTemplate 0x2 0x4 0x0 0xfff6 0x19 0x1 + launchtemplate gNaturesMadnessPinkStarsTemplate 0x2 0x4 0xfff6 0xf 0x19 0x1 + launchtemplate gNaturesMadnessPinkStarsTemplate 0x2 0x4 0x19 0x14 0x19 0x1 + launchtemplate gNaturesMadnessPinkStarsTemplate 0x2 0x4 0xffec 0x14 0x19 0x1 + launchtemplate gNaturesMadnessPinkStarsTemplate 0x2 0x4 0xc 0x0 0x19 0x1 + launchtemplate gNaturesMadnessCrystalsTemplate 0x2 0x4 0xa 0xa 0x19 0x1 + launchtemplate gNaturesMadnessCrystalsTemplate 0x2 0x4 0xfff1 0x0 0x19 0x1 + launchtemplate gNaturesMadnessCrystalsTemplate 0x2 0x4 0x14 0xa 0x19 0x1 + launchtemplate gNaturesMadnessCrystalsTemplate 0x2 0x4 0x0 0xfff6 0x19 0x1 + launchtemplate gNaturesMadnessCrystalsTemplate 0x2 0x4 0xfff6 0xf 0x19 0x1 + launchtemplate gNaturesMadnessCrystalsTemplate 0x2 0x4 0x19 0x14 0x19 0x1 + launchtemplate gNaturesMadnessCrystalsTemplate 0x2 0x4 0xffec 0x14 0x19 0x1 + launchtemplate gNaturesMadnessCrystalsTemplate 0x2 0x4 0xc 0x0 0x19 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x5 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x5 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end + + +Move_MULTI_ATTACK:: + loadspritegfx ANIM_TAG_FOCUS_ENERGY @focus energy + loadspritegfx ANIM_TAG_CUT @cut + monbg ANIM_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER + call MultiAttackBuff + delay 0x8 + launchtask AnimTask_BlendColorCycle 0x2 0x6 ANIM_PAL_ATK 0x2 0x2 0x0 0xb 0x7fff + launchtask AnimTask_ShakeMon2 0x2 0x5 0x0 0x1 0x0 0x20 0x1 + call MultiAttackBuff + delay 0x8 + call MultiAttackBuff + waitforvisualfinish + delay 0xF + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + launchtemplate gCuttingSliceSpriteTemplate 0x2 0x3 0x28 0xffe0 0x0 + launchtemplate gCuttingSliceSpriteTemplate 0x2 0x3 0x28 0xffd0 0x0 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0 0x3 0xf 0x1 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 + waitforvisualfinish + clearmonbg ANIM_TARGET + end +MultiAttackBuff: + launchtemplate gEndureEnergySpriteTemplate 0x2 0x4 0x0 0xffe8 0x1a 0x2 + delay 0x4 + launchtemplate gEndureEnergySpriteTemplate 0x2 0x4 0x0 0xe 0x1c 0x1 + delay 0x4 + launchtemplate gEndureEnergySpriteTemplate 0x2 0x4 0x0 0xfffb 0xa 0x2 + delay 0x4 + launchtemplate gEndureEnergySpriteTemplate 0x2 0x4 0x0 0x1c 0x1a 0x3 + delay 0x4 + launchtemplate gEndureEnergySpriteTemplate 0x2 0x4 0x0 0xfff4 0x0 0x1 + return + + +Move_MIND_BLOWN:: + loadspritegfx ANIM_TAG_PINK_HEART @pink color + loadspritegfx ANIM_TAG_SMALL_BUBBLES @blue color + loadspritegfx ANIM_TAG_BLACEPHALON_HEAD @head + loadspritegfx ANIM_TAG_ORBS @circles + loadspritegfx ANIM_TAG_IMPACT @hit + monbg ANIM_TARGET + setalpha 12, 8 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + playsewithpan SE_FALL, SOUND_PAN_TARGET + launchtemplate gMindBlownHeadTemplate 0x82, 0x3, 0x0 0x0 0x25 + waitforvisualfinish + launchtask AnimTask_ShakeMon2 0x2 0x5 ANIM_TARGET 0x2 0x0 0xf 0x1 + launchtask AnimTask_ShakeMon2 0x2 0x5 ANIM_DEF_PARTNER 0x2 0x0 0xf 0x1 + launchtask AnimTask_ShakeMon2 0x2 0x5 ANIM_ATK_PARTNER 0x2 0x0 0xf 0x1 + delay 0x1 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + launchtemplate gMindBlownBlueImpactTemplate 0x83 0x2 0x1 0x0 + launchtemplate gMindBlownPinkImpactTemplate 0x83 0x2 0x1 0x0 + call MindBlownBlueOrbs + delay 0x1 + call MindBlownPinkOrbs + delay 0x1 + call MindBlownBlueOrbs + delay 0x1 + call MindBlownPinkOrbs + delay 0x1 + call MindBlownBlueOrbs + delay 0x1 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 + waitforvisualfinish + blendoff + clearmonbg ANIM_TARGET + end +MindBlownBlueOrbs: + launchtemplate gMindBlownBlueOrbsTemplate 0x82 0x5 0x1 0x1 0x0 0xFF90 0x8 @up + launchtemplate gMindBlownBlueOrbsTemplate 0x82 0x5 0x1 0x1 0x5F 0xFF9D 0x8 @upper right + launchtemplate gMindBlownBlueOrbsTemplate 0x82 0x5 0x1 0x1 0x73 0x0 0x8 @right + launchtemplate gMindBlownBlueOrbsTemplate 0x82 0x5 0x1 0x1 0x4F 0x37 0x8 @lower right + launchtemplate gMindBlownBlueOrbsTemplate 0x82 0x5 0x1 0x1 0x0 0x53 0x8 @down + launchtemplate gMindBlownBlueOrbsTemplate 0x82 0x5 0x1 0x1 0xFFB0 0x43 0x8 @lower left + launchtemplate gMindBlownBlueOrbsTemplate 0x82 0x5 0x1 0x1 0xFF60 0x0 0x8 @left + launchtemplate gMindBlownBlueOrbsTemplate 0x82 0x5 0x1 0x1 0xFFAA 0xFF94 0x8 @upper left + return +MindBlownPinkOrbs: + launchtemplate gMindBlownPinkOrbsTemplate 0x82 0x5 0x1 0x1 0x2D 0xFF9D 0x8 @between up and upper right + launchtemplate gMindBlownPinkOrbsTemplate 0x82 0x5 0x1 0x1 0xDF 0xFF9D 0x8 @between right and upper right + launchtemplate gMindBlownPinkOrbsTemplate 0x82 0x5 0x1 0x1 0x9F 0x37 0x8 @between right and lower right + launchtemplate gMindBlownPinkOrbsTemplate 0x82 0x5 0x1 0x1 0x1F 0x37 0x8 @between lower right and down + launchtemplate gMindBlownPinkOrbsTemplate 0x82 0x5 0x1 0x1 0xFFE0 0x43 0x8 @between lower left and down + launchtemplate gMindBlownPinkOrbsTemplate 0x82 0x5 0x1 0x1 0xFF60 0x43 0x8 @between left and lower left + launchtemplate gMindBlownPinkOrbsTemplate 0x82 0x5 0x1 0x1 0xFF2A 0xFFAA 0x8 @between left and upper left + launchtemplate gMindBlownPinkOrbsTemplate 0x82 0x5 0x1 0x1 0xFFDA 0xFF94 0x8 @between up and upper left + return + + +Move_PLASMA_FISTS:: + loadspritegfx ANIM_TAG_SHOCK_3 @charge + loadspritegfx ANIM_TAG_SPARK_2 @ElectricityEffect + loadspritegfx ANIM_TAG_SPARK @shock wave + loadspritegfx ANIM_TAG_IMPACT @thunder punch + loadspritegfx ANIM_TAG_HANDS_AND_FEET @thunder punch + loadspritegfx ANIM_TAG_LIGHTNING @thunder punch + monbg ANIM_ATTACKER + setalpha 12, 8 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x10 0x0 + waitforvisualfinish + launchtemplate gPlasmaFistsChargeTemplate 0x2 0x1 0x0 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_ATTACKER 0x0 0x3 0x5c 0x1 + call PlasmaFistSpark1 + delay 0xA + call PlasmaFistSpark2 + delay 0xA + call PlasmaFistSpark1 + delay 0xA + call PlasmaFistSpark2 + delay 0xA + call PlasmaFistSpark1 + delay 0xA + call PlasmaFistSpark2 + delay 0xA + call PlasmaFistSpark1 + delay 0xA + call PlasmaFistSpark2 + delay 0xA + call PlasmaFistSpark1 + delay 0xA + call PlasmaFistSpark2 + delay 0xA + call PlasmaFistSpark1 + delay 0xA + call PlasmaFistSpark2 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + launchtask AnimTask_ShockWaveProgressingBolt 0x5 0x0 + waitforvisualfinish + monbg ANIM_TARGET + call PlasmaFistsImpact + waitforvisualfinish + call PlasmaFistsImpact + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end +PlasmaFistSpark1: + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + launchtask AnimTask_BlendColorCycle 0x2 0x6 ANIM_PAL_ATK 0x0 0x2 0x0 0xb 0x5bff + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x20 0x18 0xbe 0xc 0x0 0x1 0x0 + delay 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x50 0x18 0x16 0xc 0x0 0x1 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x9c 0x18 0x79 0xd 0x0 0x1 0x1 + return +PlasmaFistSpark2: + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x64 0x18 0x3c 0xa 0x0 0x1 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0xaa 0x18 0x2a 0xb 0x0 0x1 0x1 + delay 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0xee 0x18 0xa5 0xa 0x0 0x1 0x1 + return +PlasmaFistsImpact: + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + launchtemplate gFistFootSpriteTemplate 0x84 0x5 0x0 0x0 0x8 0x1 0x0 + launchtemplate gBasicHitSplatSpriteTemplate 0x83 0x4 0x0 0x0 0x1 0x1 + delay 0x1 + launchtask AnimTask_InvertScreenColor 0x2 0x3 0x101 0x101 0x101 + delay 0x1 + launchtemplate gLightningSpriteTemplate 0x82 0x2 0x0 0xffd0 + delay 0x1 + launchtemplate gLightningSpriteTemplate 0x2 0x2 0x0 0xfff0 + delay 0x1 + launchtemplate gLightningSpriteTemplate 0x2 0x2 0x0 0x10 + delay 0x1 + playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET + launchtask AnimTask_InvertScreenColor 0x2 0x3 0x101 0x101 0x101 + delay 0x2 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0 0x3 0xf 0x1 + launchtemplate gBasicHitSplatSpriteTemplate 0x3 0x4 0x0 0x0 0x1 0x2 + return + + +Move_PHOTON_GEYSER:: + loadspritegfx ANIM_TAG_SHOCK_3 @charge + loadspritegfx ANIM_TAG_SPARK_2 @ElectricityEffect + loadspritegfx ANIM_TAG_SMALL_RED_EYE @red color + loadspritegfx ANIM_TAG_THIN_RING @calm mind + loadspritegfx ANIM_TAG_SMALL_EMBER @yellow color + loadspritegfx ANIM_TAG_ORBS @recover + monbg ANIM_ATTACKER + setalpha 12, 8 + launchtemplate gPhotonGeyserChargeTemplate 0x2 0x1 0x0 + call PhotonGeyserSparks1 + launchtemplate gPowerAbsorptionOrbSpriteTemplate 0x2 0x3 0xffd8 0xffd8 0x10 + launchtemplate gPowerAbsorptionOrbSpriteTemplate 0x2 0x3 0x0 0x28 0x10 + delay 0xA + call PhotonGeyserSparks2 + delay 0xA + call PhotonGeyserSparks1 + delay 0xA + call PhotonGeyserSparks2 + delay 0xA + call PhotonGeyserSparks1 + launchtemplate gPowerAbsorptionOrbSpriteTemplate 0x2 0x3 0x0 0xffd8 0x10 + launchtemplate gPowerAbsorptionOrbSpriteTemplate 0x2 0x3 0x28 0x14 0x10 + delay 0xA + call PhotonGeyserSparks2 + delay 0xA + call PhotonGeyserSparks1 + delay 0xA + call PhotonGeyserSparks2 + delay 0xA + call PhotonGeyserSparks1 + launchtemplate gPowerAbsorptionOrbSpriteTemplate 0x2 0x3 0xffd8 0x0 0x10 + launchtemplate gPowerAbsorptionOrbSpriteTemplate 0x2 0x3 0x28 0x0 0x10 + delay 0xA + call PhotonGeyserSparks2 + delay 0xA + call PhotonGeyserSparks1 + delay 0xA + call PhotonGeyserSparks2 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xF 0x0 + clearmonbg ANIM_ATTACKER + playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_ATTACKER + unloadspritegfx ANIM_TAG_ORBS @recover + unloadspritegfx ANIM_TAG_SHOCK_3 @charge + loadspritegfx ANIM_TAG_YELLOW_BALL @confuse ray (for zap cannon) + loadspritegfx ANIM_TAG_BLACK_BALL_2 @zap cannon + loadspritegfx ANIM_TAG_AIR_WAVE_2 @white/gray color + launchtemplate gPhotonGeyserWhiteRingTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1f 0x8 + launchtemplate gPhotonGeyserZapBallTemplate 0x83 0x6 0xa 0x0 0x0 0x0 0x1e 0x0 + launchtemplate gPhotonGeyserZapCannonSparkTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x0 0x28 0x0 + launchtemplate gPhotonGeyserZapCannonSparkTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x40 0x28 0x1 + launchtemplate gPhotonGeyserZapCannonSparkTemplate 0x84 0x7 0xa 0x0 0x10 0x1e 0x80 0x28 0x0 + launchtemplate gPhotonGeyserZapCannonSparkTemplate 0x84 0x7 0xa 0x0 0x10 0x1e SOUND_PAN_ATTACKER 0x28 0x2 + launchtemplate gPhotonGeyserZapCannonSparkTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0x20 0x28 0x0 + launchtemplate gPhotonGeyserZapCannonSparkTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0x60 0x28 0x1 + launchtemplate gPhotonGeyserZapCannonSparkTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0xa0 0x28 0x0 + launchtemplate gPhotonGeyserZapCannonSparkTemplate 0x84 0x7 0xa 0x0 0x8 0x1e 0xe0 0x28 0x2 + waitforvisualfinish + monbg ANIM_TARGET + launchtemplate gPhotonGeyserYellowRingTemplate 0x3 0x6 0x0 0x0 0x1 0x0 0x1f 0x8 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0x4 0x0 0x5 0x1 + playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER + unloadspritegfx ANIM_TAG_YELLOW_BALL @confuse ray (for zap cannon) + unloadspritegfx ANIM_TAG_BLACK_BALL_2 @zap cannon + unloadspritegfx ANIM_TAG_AIR_WAVE_2 @white/gray color + @Shoot beam to the sky + loadspritegfx ANIM_TAG_STRAIGHT_BEAM + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x6 0x0 0x10 0x43FF @Light yellow + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x4 0x0 0x60 0x1 + panse_1B SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 + call PhotonGeyserBeam + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x1 0x10 0x0 0x43FF @Light yellow + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xF 0x0 0x0 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end +PhotonGeyserSparks1: + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + launchtemplate gThinRingShrinkingSpriteTemplate 0x28 0x4 0x0 0x0 0x0 0x0 + launchtemplate gPhotonGeyserSparkTemplate 0x0 0x7 0x20 0x18 0xbe 0xc 0x0 0x1 0x0 + delay 0x0 + launchtemplate gPhotonGeyserSparkTemplate 0x0 0x7 0x50 0x18 0x16 0xc 0x0 0x1 0x0 + launchtemplate gPhotonGeyserSparkTemplate 0x0 0x7 0x9c 0x18 0x79 0xd 0x0 0x1 0x1 + return +PhotonGeyserSparks2: + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + launchtemplate gPhotonGeyserSparkTemplate 0x0 0x7 0x64 0x18 0x3c 0xa 0x0 0x1 0x0 + launchtemplate gPhotonGeyserSparkTemplate 0x0 0x7 0xaa 0x18 0x2a 0xb 0x0 0x1 0x1 + delay 0x0 + launchtemplate gPhotonGeyserSparkTemplate 0x0 0x7 0xee 0x18 0xa5 0xa 0x0 0x1 0x1 + return +PhotonGeyserBeam: + launchtemplate gPhotonGeyserBeam 0x83, 0x6, 0, 19, ANIM_TARGET, 180, 2, 6 + delay 0x1 + launchtemplate gPhotonGeyserBeam 0x83, 0x6, 0, 3, ANIM_TARGET, 180, 2, 5 + delay 0x1 + launchtemplate gPhotonGeyserBeam 0x83, 0x6, 0, -13, ANIM_TARGET, 180, 2, 4 + delay 0x1 + launchtemplate gPhotonGeyserBeam 0x83, 0x6, 0, -29, ANIM_TARGET, 180, 2, 3 + delay 0x1 + launchtemplate gPhotonGeyserBeam 0x83, 0x6, 0, -45, ANIM_TARGET, 180, 2, 2 + delay 0x1 + launchtemplate gPhotonGeyserBeam 0x83, 0x6, 0, -61, ANIM_TARGET, 180, 2, 1 + delay 0x1 + launchtemplate gPhotonGeyserBeam 0x83, 0x6, 0, -77, ANIM_TARGET, 180, 2, 0 + return + + +Move_DOUBLE_IRON_BASH:: + loadspritegfx ANIM_TAG_GUST + loadspritegfx ANIM_TAG_IMPACT + loopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 0x1c, 0x2 + launchtask AnimTask_MetallicShine 0x5 0x3 0x0 0x0 0x0 + waitforvisualfinish + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + loopsewithpan SE_M_WING_ATTACK, SOUND_PAN_ATTACKER, 0x14, 0x2 + launchtask AnimTask_TranslateMonElliptical 0x2 0x5 0x0 0xc 0x4 0x1 0x4 + launchtask AnimTask_AnimateGustTornadoPalette 0x5 0x2 0x1 0x46 + launchtemplate gGustToTargetSpriteTemplate 0x2 0x5 0xffe7 0x0 0x0 0x0 0x0 @wing attack + launchtemplate gGustToTargetSpriteTemplate 0x2 0x5 0x19 0x0 0x0 0x0 0x0 @wing attack + delay 0x18 + launchtemplate gSlideMonToOffsetSpriteTemplate 0x2 0x5 ANIM_ATTACKER 0x18 0x0 0x0 0x9 + delay 0x11 + launchtemplate gBasicHitSplatSpriteTemplate 0x84, 0x4, 0x0 0x0 0x1 0x1 + launchtemplate gSlideMonToOffsetSpriteTemplate 0x2 0x5 ANIM_TARGET 0xffe0 0x0 0x0 0x3 + waitforvisualfinish + playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET + waitforvisualfinish + launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_ATTACKER 0x0 0xb + waitforvisualfinish + delay 0x3 + launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_TARGET 0x0 0x7 + clearmonbg ANIM_DEF_PARTNER + blendoff + end + +@@@@@@@@@@@@@@@@@@@@@@@ GEN 8 @@@@@@@@@@@@@@@@@@@@@@@ +Move_DYNAMAX_CANNON:: + goto Move_HYPER_BEAM + + +Move_SNIPE_SHOT:: + loadspritegfx ANIM_TAG_IMPACT_2 + loadspritegfx ANIM_TAG_LEER + launchtask AnimTask_BlendBattleAnimPal 10 5 ANIM_PAL_BG 0 0 16, 0 @;Black + waitforvisualfinish + launchtemplate gLeerSpriteTemplate 0x82, 2 0x18 -12 + playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER + waitforvisualfinish + delay 0x20 + playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET + launchtemplate gSnipeShotBallTemplate 0x82, 3, 0 0 16, + waitforvisualfinish + launchtask AnimTask_ShakeMon2 2 5 1 4 0 8, 1 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 10 5 ANIM_PAL_BG 0 16, 0 0 @;Black + waitforvisualfinish + end + + +Move_JAW_LOCK:: + loadspritegfx ANIM_TAG_SHARP_TEETH + loadspritegfx ANIM_TAG_IMPACT + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SHARP_TEETH, 0, 10, 10, 0x0B1D @Light orange + monbg ANIM_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x7 0x0 @Black + waitforvisualfinish + playsewithpan SE_M_BITE, SOUND_PAN_TARGET + launchtemplate gJawLockTeethTemplate 0x2 0x7 0xffe0 0xffe0 0x1 0x333 0x333 0xa 15 + launchtemplate gJawLockTeethTemplate 0x2 0x7 0x20 0x20 0x5 0xfccd 0xfccd 0xa 15 + delay 0xa + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0xfff8 0x0 0x1 0x1 + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_TARGET 0x0 0x7 0xA 0x2 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x7 0x0 0x0 @;Black + waitforvisualfinish + clearmonbg ANIM_TARGET + delay 0x1 + end + + +Move_STUFF_CHEEKS:: + loadspritegfx ANIM_TAG_BERRY_NORMAL + loadspritegfx ANIM_TAG_SHARP_TEETH + loadspritegfx ANIM_TAG_THIN_RING + loadspritegfx ANIM_TAG_SPARKLE_2 + playsewithpan SE_M_METRONOME, 0xc0 + launchtemplate gFloatingBerryTemplate 1 0x1 0x0 + delay 0x45 + launchtask AnimTask_IsTargetPlayerSide 0x2 0x0 + jumpargeq 0x7 0x1 BERRYEAT_ON_PLAYER +BerryEatingOpponent: + call BiteOpponent + delay 0x10 + call BiteOpponent + delay 0xA + goto POST_BERRY_EAT +BERRYEAT_ON_PLAYER: + call BitePlayer + delay 0x10 + call BitePlayer + delay 0xA +POST_BERRY_EAT: + playsewithpan SE_SHINY, 0xc0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 0x2 0x3 0x7 0x0 0x67f1 + launchtemplate gThinRingExpandingSpriteTemplate 3 0x4 0x0 0x0 0x0 0x0 + waitforvisualfinish + end +BitePlayer: + playsewithpan SE_M_BITE, 0x3f + launchtemplate gSharpTeethSpriteTemplate 2 0x6 0x27 0xffD0 0x0 0x0 0x333 0xa + launchtemplate gSharpTeethSpriteTemplate 2 0x6 0x27 0x10 0x4 0x0 0xfccd 0xa + return +BiteOpponent: + playsewithpan SE_M_BITE, 0x3f + launchtemplate gSharpTeethSpriteTemplate 2 0x6 0xffDF 0xffD0 0x0 0x0 0x333 0xa + launchtemplate gSharpTeethSpriteTemplate 2 0x6 0xffDF 0x10 0x4 0x0 0xfccd 0xa + return + + +Move_NO_RETREAT:: + loadspritegfx ANIM_TAG_SMALL_EMBER + loopsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER 0x7 0x12 + launchtemplate gNoRetreatFlameTemplate 2, 0x5 ANIM_ATTACKER, 20, 10, 0xA0, 0 + launchtemplate gNoRetreatFlameTemplate 2, 0x5 ANIM_ATTACKER, -20, 10, 0xA0, 0 + launchtask AnimTask_TeeterDanceMovement 0x5 0x0 + waitforvisualfinish + end + + +Move_TAR_SHOT:: + loadspritegfx ANIM_TAG_POISON_BUBBLE + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_POISON_BUBBLE, 0, 15, 15, 0 @Black + monbg ANIM_TARGET + launchtemplate gAppleAcidLaunchTemplate 0x82, 0x6 0x14 0x0 0x28 0x1 0x0 0x0 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + delay 0x5 + launchtemplate gAppleAcidLaunchTemplate 0x82, 0x6 0x14 0x0 0x28 0x1 0xffe8 0x0 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + delay 0xf + launchtask AnimTask_ShakeMon2 0x5 0x5 ANIM_TARGET 0x2 0x0 0xa 0x1 + launchtask AnimTask_BlendColorCycle 0x2 0x6 ANIM_PAL_DEF 0x2 0x2 0x0 0x10 0x0 @;Black + launchtemplate gAppleAcidDripTemplate 0x82, 0x5 0xffe6 0xffe8 0x0 0xf 0x37 + playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET + delay 0xa + launchtemplate gAppleAcidDripTemplate 0x82, 0x5 0xf 0xffe5 0x0 0xC 0x32 + playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET + delay 0xa + launchtemplate gAppleAcidDripTemplate 0x82, 0x5 0xfff1 0xffef 0x0 0xa 0x2d + playsewithpan SE_M_BUBBLE SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg ANIM_TARGET + end + + +Move_MAGIC_POWDER:: + loadspritegfx ANIM_TAG_POISON_POWDER + loadspritegfx ANIM_TAG_WATER_GUN + loopsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER 0xE 0x8 + launchtemplate gPoisonPowderParticleSpriteTemplate 0x82 0x6 0xffe2 0xffea 0x75 0x50 0x5 0x1 + launchtemplate gMagicPowderBluePowderTemplate 0x82 0x6 0xa 0xffea 0x75 0x50 0xfffb 0x1 + launchtemplate gPoisonPowderParticleSpriteTemplate 0x82 0x6 0xffe7 0xffea 0x75 0x70 0x5 0x3 + delay 0xf + launchtemplate gMagicPowderBluePowderTemplate 0x82 0x6 0xfffb 0xffea 0x75 0x50 0xfffb 0x1 + launchtemplate gPoisonPowderParticleSpriteTemplate 0x82 0x6 0x5 0xffea 0x75 0x60 0x5 0x1 + launchtemplate gMagicPowderBluePowderTemplate 0x82 0x6 0x0 0xffea 0x75 0x45 0xfffb 0x1 + launchtemplate gPoisonPowderParticleSpriteTemplate 0x82 0x6 0xfff1 0xffea 0x75 0x70 0x5 0x2 + delay 0x1e + launchtemplate gMagicPowderBluePowderTemplate 0x82 0x6 0xfff1 0xffea 0x75 0x70 0x5 0x2 + launchtemplate gPoisonPowderParticleSpriteTemplate 0x82 0x6 0xf 0xffea 0x75 0x50 0xfffb 0x1 + launchtemplate gMagicPowderBluePowderTemplate 0x82 0x6 0xfff6 0xffea 0x75 0x60 0x7 0x2 + launchtemplate gPoisonPowderParticleSpriteTemplate 0x82 0x6 0xfffb 0xffea 0x75 0x5a 0xfff8 0x0 + delay 0x14 + launchtemplate gMagicPowderBluePowderTemplate 0x82 0x6 0xfff6 0xffea 0x75 0x50 0xfffb 0x1 + launchtemplate gPoisonPowderParticleSpriteTemplate 0x82 0x6 0x0 0xffea 0x75 0x59 0x5 0x2 + launchtemplate gMagicPowderBluePowderTemplate 0x82 0x6 0x14 0xffea 0x75 0x70 0xfff8 0x2 + launchtemplate gPoisonPowderParticleSpriteTemplate 0x82 0x6 0x5 0xffea 0x75 0x50 0x5 0x1 + waitforvisualfinish + playsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET + launchtask AnimTask_ScaleMonAndRestore 0x5 0x5 0xfffa 0xfffa 0xf 0x1 0x1 + waitforvisualfinish + end + + +Move_DRAGON_DARTS:: + loadspritegfx ANIM_TAG_DREEPY + loadspritegfx ANIM_TAG_EXPLOSION + playsewithpan SE_FALL, SOUND_PAN_ATTACKER + launchtemplate gDreepyMissileTemplate 0x82, 0x3, 0x0 0x0 0x19 + delay 0x19 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x3 0x0 0x10 0x1 + launchtemplate gExplosionSpriteTemplate, 0x83, 0x4 0x0 0x0 0x1 0x1 + waitforvisualfinish + end + + +Move_TEA_TIME:: + goto Move_MILK_DRINK + + +Move_OCTOLOCK:: + loadspritegfx ANIM_TAG_TENDRILS + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_TENDRILS, 0, 12, 12, 0x3D98 @Pinkish Red + loopsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET 0x6 0x4 + launchtemplate gConstrictBindingSpriteTemplate 0x84, 0x4, 0x0 0x10 0x0 0x2 + delay 0x7 + launchtemplate gConstrictBindingSpriteTemplate 0x83 0x4 0x0 0x0 0x0 0x2 + launchtemplate gConstrictBindingSpriteTemplate 0x82, 0x4, 0x0 0x8 0x1 0x2 + delay 0x7 + launchtemplate gConstrictBindingSpriteTemplate 0x83 0x4 0x0 0xfff8 0x1 0x2 + delay 0x8 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0x3 0x0 0x6 0x1 + delay 0x14 + launchtask AnimTask_BlendColorCycle 0x2 0x6 ANIM_PAL_DEF 0x2 0x2 0x0 0x8 0x1f + playsewithpan SE_M_BIND, SOUND_PAN_TARGET + setarg 0x7 0xffff + waitforvisualfinish + end + + +Move_BOLT_BEAK:: + loadspritegfx ANIM_TAG_HORN_HIT + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_SPARK_2 + loadspritegfx ANIM_TAG_ELECTRICITY + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRICITY, 0, 12, 12, 0x76E1 @Blue Electricity + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HORN_HIT, 0, 12, 12, 0x079D @Yellow + call BoltBeakSparks + waitforvisualfinish + launchtask AnimTask_BlendColorCycle 0x2 0x6 0x3 0xffe1 0x1 0x0 0x0 0x5bff + launchtemplate gHorizontalLungeSpriteTemplate 0x2 0x2 0x4 0x4 + delay 0x4 + launchtemplate gHornHitSpriteTemplate 0x84 0x3 0x8 0x8 0xa + waitforvisualfinish + launchtemplate gFlashingHitSplatSpriteTemplate 0x83 0x4 0x0 0x0 0x1 0x1 + playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMon 0x2 0x5 0x1 0x3 0x0 0x6 0x1 + waitforvisualfinish + launchtask AnimTask_BlendColorCycle 0x2 0x6 0x4 0xffe1 0x2 0x0 0x6 0x5bff + call ElectricityEffect + waitforvisualfinish + end +BoltBeakSparks: + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x20 0x18 0xbe 0xc 0x0 0x1 0x0 + delay 0x0 + launchtemplate gBoltBeakBlueSparkTemplate 0x0 0x7 0x50 0x18 0x16 0xc 0x0 0x1 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x9c 0x18 0x79 0xd 0x0 0x1 0x1 + delay 0x0 + launchtask AnimTask_BlendColorCycle 0x2 0x6 0x3 0xffe1 0x1 0x0 0x0 0x5bff + delay 0xa + launchtask AnimTask_BlendColorCycle 0x2 0x6 0x3 0xffe1 0x1 0x5 0x5 0x5bff + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + launchtemplate gBoltBeakBlueSparkTemplate 0x0 0x7 0x64 0x18 0x3c 0xa 0x0 0x1 0x0 + launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0xaa 0x18 0x2a 0xb 0x0 0x1 0x1 + delay 0x0 + launchtemplate gBoltBeakBlueSparkTemplate 0x0 0x7 0xee 0x18 0xa5 0xa 0x0 0x1 0x1 + delay 0x0 + launchtask AnimTask_BlendColorCycle 0x2 0x6 0x3 0xffe1 0x1 0x0 0x0 0x76E1 + delay 0x14 + launchtask AnimTask_BlendColorCycle 0x2 0x6 0x3 0xffe1 0x1 0x4 0x4 0x76E1 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + launchtemplate gSparkElectricityFlashingSpriteTemplate 0x4 0x8 0x0 0x0 0x20 0xc 0x0 0x14 0x0 0x0 + launchtemplate gBoltBeakBlueFlashingSparkTemplate 0x4 0x8 0x0 0x0 0x20 0xc 0x40 0x14 0x1 0x0 + launchtemplate gSparkElectricityFlashingSpriteTemplate 0x4 0x8 0x0 0x0 0x20 0xc 0x80 0x14 0x0 0x0 + launchtemplate gBoltBeakBlueFlashingSparkTemplate 0x4 0x8 0x0 0x0 0x20 0xc SOUND_PAN_ATTACKER 0x14 0x2 0x0 + launchtemplate gSparkElectricityFlashingSpriteTemplate 0x4 0x8 0x0 0x0 0x10 0xc 0x20 0x14 0x0 0x0 + launchtemplate gBoltBeakBlueFlashingSparkTemplate 0x4 0x8 0x0 0x0 0x10 0xc 0x60 0x14 0x1 0x0 + launchtemplate gSparkElectricityFlashingSpriteTemplate 0x4 0x8 0x0 0x0 0x10 0xc 0xa0 0x14 0x0 0x0 + launchtemplate gBoltBeakBlueFlashingSparkTemplate 0x4 0x8 0x0 0x0 0x10 0xc 0xe0 0x14 0x2 0x0 + delay 0x4 + return + + +Move_FISHIOUS_REND:: + loadspritegfx ANIM_TAG_SHARP_TEETH @Teeth + loadspritegfx ANIM_TAG_SMALL_BUBBLES + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SHARP_TEETH, 0, 10, 10, 0x726A @Blue Teeth + playsewithpan SE_M_WATERFALL, SOUND_PAN_TARGET + launchtemplate gFishiousRendTeethTemplate, 0x80, 0x2, 50, 4 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x4 0x0 0xC 0x2 + call FishousRendBubbles + waitforvisualfinish + end +FishousRendBubbles: + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0xF 0x0 + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0xF 0x0 + delay 0x2 + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0xA 0x0 + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0xA 0x0 + delay 0x2 + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0x5 0x0 + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0x5 0x0 + delay 0x2 + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0x0 0x0 + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0x0 0x0 + delay 0x2 + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0xfffb 0x0 + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0xfffb 0x0 + delay 0x2 + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0xfff6 0x0 + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0xfff6 0x0 + delay 0x2 + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0xfff1 0x0 + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0xfff1 0x0 + delay 0x2 + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0xffec 0x0 + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0xffec 0x0 + delay 0x2 + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0xfff1 0x0 + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0xfff1 0x0 + delay 0x2 + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0xfff6 0x0 + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0xfff6 0x0 + delay 0x2 + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0xfffb 0x0 + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0xfffb 0x0 + delay 0x2 + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0x0 0x0 + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0x0 0x0 + delay 0x2 + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0x5 0x0 + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0x5 0x0 + delay 0x2 + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0xA 0x0 + launchtemplate gSmallDriftingBubblesSpriteTemplate 0x4 0x2 0xA 0x0 + return + + +Move_COURT_CHANGE:: + goto Move_TRICK_ROOM + + +Move_CLANGOROUS_SOUL:: + loadspritegfx ANIM_TAG_FOCUS_ENERGY @focus energy + loadspritegfx ANIM_TAG_WATER_ORB @blue + loadspritegfx ANIM_TAG_POISON_BUBBLE @purple + loadspritegfx ANIM_TAG_AIR_WAVE_2 @white/grey + loadspritegfx ANIM_TAG_SPARKLE_2 @stars + launchtask AnimTask_RockMonBackAndForth 0x5 0x3 0x0 0x2 0x0 + call ClangorousSoulStarBuffEffect + call ClangorousSoulStarBuffEffect + call ClangorousSoulStarBuffEffect + waitforvisualfinish + loadspritegfx ANIM_TAG_VERTICAL_HEX @red + loadspritegfx ANIM_TAG_HORSESHOE_SIDE_FIST @fist + createsprite gClangorousSoulRedFistTemplate, ANIM_ATTACKER, 2, 0xfff0, 0, 0, 0, 10, ANIM_ATTACKER, ANIM_RIGHT_FIST, 1 + createsprite gClangorousSoulRedFistTemplate, ANIM_ATTACKER, 2, 0x10, 0, 0, 0, 10, ANIM_ATTACKER, ANIM_LEFT_FIST, 1 + playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET + waitforvisualfinish + loadspritegfx ANIM_TAG_THIN_RING @ring + playsewithpan SE_SHINY, SOUND_PAN_ATTACKER + launchtemplate gClangorousSoulRedRingTemplate 0x3 0x4 0x0 0x0 0x0 0x0 + waitforvisualfinish + end +ClangorousSoulStarBuffEffect: + playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER + launchtemplate gClangorousSoulBlueBuffTemplate 0x2 0x4 0x0 0xffe8 0x1a 0x2 + delay 0x4 + launchtemplate gEndureEnergySpriteTemplate 0x2 0x4 0x0 0xe 0x1c 0x1 + delay 0x4 + launchtemplate gClangorousSoulPurpleBuffTemplate 0x2 0x4 0x0 0xfffb 0xa 0x2 + launchtemplate gGrantingStarsSpriteTemplate 0x2 0x6 0xfff1 0x0 0x0 0x0 0x20 0x3c + delay 0x4 + launchtemplate gClangorousSoulWhiteBuffTemplate 0x2 0x4 0x0 0x1c 0x1a 0x3 + delay 0x4 + launchtemplate gGrantingStarsSpriteTemplate 0x2 0x6 0xc 0xfffb 0x0 0x0 0x20 0x3c + return + + +Move_BODY_PRESS:: + loadspritegfx ANIM_TAG_ROUND_SHADOW @fly and bounce animation + loadspritegfx ANIM_TAG_GRAY_SMOKE @smoke + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ROUND_SHADOW, 0, 0xD, 0xD, 0x1E5D @Orange + playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER + launchtemplate gVerticalDipSpriteTemplate 0x2 0x3 0x6 0x1 0x0 + delay 0x7 + launchtemplate gFlyBallUpSpriteTemplate 0x2 0x4 0x0 0x0 0xd 0x150 @Fly up + waitforvisualfinish + delay 0x2F + launchtemplate gBounceBallLandSpriteTemplate 0x83 0x0 @Bounce down + delay 0x2 + playsewithpan SE_M_MINIMIZE, SOUND_PAN_ATTACKER + launchtask AnimTask_SquishTarget 0x2 0x0 + waitforvisualfinish + end + + +Move_DECORATE:: + end @to do: + + +Move_DRUM_BEATING:: + loadspritegfx ANIM_TAG_MUSIC_NOTES + loadspritegfx ANIM_TAG_PURPLE_HAND_OUTLINE + loadspritegfx ANIM_TAG_ROOTS + loadspritegfx ANIM_TAG_IMPACT + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_MUSIC_NOTES, 0, 0xD, 0xD, 0x03AC @Green + monbg ANIM_TARGET + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + call BellyDrumRight + launchtemplate gSlowFlyingMusicNotesSpriteTemplate 0x2 0x4 0x0 0x0 0x0 0x0 + playsewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER + delay 0xf + call BellyDrumLeft + launchtemplate gSlowFlyingMusicNotesSpriteTemplate 0x2 0x4 0x1 0x1 0x1 0x0 + playsewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER + delay 0xf + call BellyDrumRight + launchtemplate gSlowFlyingMusicNotesSpriteTemplate 0x2 0x4 0x0 0x3 0x3 0x80 + playsewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER + delay 0x7 + call BellyDrumLeft + launchtemplate gSlowFlyingMusicNotesSpriteTemplate 0x2 0x4 0x1 0x2 0x0 0x80 + playsewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER + delay 0x7 + call BellyDrumRight + launchtemplate gSlowFlyingMusicNotesSpriteTemplate 0x2 0x4 0x0 0x1 0x1 0x0 + playsewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER + delay 0x7 + call BellyDrumLeft + launchtemplate gSlowFlyingMusicNotesSpriteTemplate 0x2 0x4 0x1 0x0 0x3 0x0 + playsewithpan SE_M_BELLY_DRUM, SOUND_PAN_ATTACKER + launchtemplate gFrenzyPlantRootSpriteTemplate 0x2 0x6 0x55 0x10 0x6 0x0 0x3 0x50 + playsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET + delay 0x5 + launchtemplate gFrenzyPlantRootSpriteTemplate 0x2 0x6 0x55 0xfff0 0xfffa 0x0 0x2 0x4b + playsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET + delay 0x5 + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0xfff6 0xfff6 0x1 0x3 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMon 0x3 0x5 ANIM_TARGET 0x8 0x0 0x14 0x1 + delay 0x3 + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0xa 0x8 0x1 0x3 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + delay 0x3 + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0xa 0xfffd 0x1 0x2 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + delay 0x3 + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0xfffd 0x1 0x1 0x2 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0xfff6 0x1 0x1 0x1 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0x0 0xa 0x1 0x1 + playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end + + +Move_SNAP_TRAP:: + end @ to do: + + +Move_PYRO_BALL:: + loadspritegfx ANIM_TAG_FLAT_ROCK + loadspritegfx ANIM_TAG_SMALL_EMBER + playsewithpan SE_LEDGE, SOUND_PAN_ATTACKER @;Hop + launchtemplate gPyroBallRockTemplate, 2, 0x3, 0, 0, 0 + delay 0x19 + playsewithpan SE_LEDGE, SOUND_PAN_ATTACKER @;Hop + delay 0x19 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x3 0x0 0x7 0x043D + launchtemplate gPyroBallBurningRockTemplate, 2, 0x3, 0, 0, 0 + delay 0x19 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET + delay 0x19 + playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET + launchtemplate gPyroBallFlamesUpTemplate, 2, 0x3, 0, 0, 1 + delay 0x19 + playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET + launchtemplate gPyroBallEmberBallTemplate, 2, 0x6, 0, 10, 0, 5, 20, -20 + waitforvisualfinish + launchtask AnimTask_BlendColorCycle 0x2 0x6 ANIM_PAL_DEF 0x2 0x2 0x0 0xc 0x1f + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0 0x3 0xf 0x1 + call FireSpreadEffect + delay 0x20 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x7 0x0 0x043D + waitforvisualfinish + end + + +Move_BEHEMOTH_BLADE:: + goto Move_SACRED_SWORD + + +Move_BEHEMOTH_BASH:: + goto Move_SUNSTEEL_STRIKE + + +Move_AURA_WHEEL:: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_SPARK + loadspritegfx ANIM_TAG_SPARK_2 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK, 0x0, 0xC, 0xC, 0x303B @Pinkish-Red Electricity + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK_2, 0x0, 0xC, 0xC, 0x76E1 @Blue Electricity + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0x0, 0xA, 0xA, 0x303B @Pinkish-Red + setalpha 12, 8 + monbg ANIM_DEF_PARTNER + monbgprio_2A 0x1 + launchtemplate gAuraWheelBlueElectricityTemplate 3, 0x4 0x0 0x0 0x38 0x0 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gAuraWheelRedElectricityTemplate 3, 0x4 0x0 0x0 0x38 0x4 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gAuraWheelBlueElectricityTemplate 3, 0x4 0x0 0x0 0x38 0x8 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gAuraWheelRedElectricityTemplate 3, 0x4 0x0 0x0 0x38 0xc + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gAuraWheelBlueElectricityTemplate 3, 0x4 0x0 0x0 0x38 0x10 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gAuraWheelRedElectricityTemplate 3, 0x4 0x0 0x0 0x38 0x14 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gAuraWheelBlueElectricityTemplate 3, 0x4 0x0 0x0 0x38 0x18 + playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER + waitforvisualfinish + launchtemplate gSlideMonToOffsetSpriteTemplate 2, 0x5 0x0 0x18 0x0 0x0 0x6 + delay 0x4 + playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x5 0x0 0x17 0x1 + launchtemplate gBasicHitSplatSpriteTemplate 0x4 0x4 0xfff6 0x0 0x1 0x0 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK_2, 2, 12, 0, 0x76E1 @Revert blue Electricity + launchtemplate gSparkElectricityFlashingSpriteTemplate 0x84, 0x8 0x0 0x0 0x30 0x2c 0x0 0x28 0x0 0x8003 + launchtemplate gSparkElectricityFlashingSpriteTemplate 0x84, 0x8 0x0 0x0 0x30 0x2c 0x40 0x28 0x1 0x8003 + launchtemplate gSparkElectricityFlashingSpriteTemplate 0x84, 0x8 0x0 0x0 0x30 0x2c 0x80 0x28 0x0 0x8003 + launchtemplate gSparkElectricityFlashingSpriteTemplate 0x84, 0x8 0x0 0x0 0x30 0x2c 0xc0 0x28 0x2 0x8003 + delay 0x7 + launchtemplate gSlideMonToOriginalPosSpriteTemplate 2, 0x3 0x0 0x0 0x9 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + end + + +Move_BREAKING_SWIPE:: + loadspritegfx ANIM_TAG_IMPACT @hits + loadspritegfx ANIM_TAG_SPARK_2 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 12, 12, 0x001F @Red + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK_2, 0, 12, 12, 0x001F @Red + monbg ANIM_TARGET + setalpha 12, 8 + launchtemplate gBasicHitSplatSpriteTemplate 0x83 0x4 0xffe0 0xfff0 0x1 0x1 + launchtemplate gBreakingSwipeCenteredElectricity 0x82, 0x4, 0x5 0x0 0x5 0x0 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0 0x3 0x15 0x1 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_DEF_PARTNER 0x0 0x3 0x15 0x1 + delay 0x4 + launchtemplate gRandomPosHitSplatSpriteTemplate 0x83 0x2 0x1 0x1 + launchtemplate gBreakingSwipeCenteredElectricity 0x82, 0x4, 0xfff1 0xfff6 0x5 0x0 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gRandomPosHitSplatSpriteTemplate 0x83 0x2 0x1 0x1 + launchtemplate gBreakingSwipeCenteredElectricity 0x82, 0x4, 0xfff8 0x8 0x5 0x2 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gBasicHitSplatSpriteTemplate 0x83 0x4 0x20 0x14 0x1 0x1 + launchtemplate gBreakingSwipeCenteredElectricity 0x82, 0x4, 0xffec 0xf 0x5 0x1 + playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET + waitsound + waitforvisualfinish + blendoff + clearmonbg ANIM_TARGET + end + + +Move_BRANCH_POKE:: + loadspritegfx ANIM_TAG_BRANCH + loadspritegfx ANIM_TAG_IMPACT + playsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER + launchtemplate gBranchPokeBranchTemplate, 0x82, 0x3 0x0 0x0 0x25 + waitforvisualfinish + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x5 0x0 0x6 0x1 + launchtemplate gFlashingHitSplatSpriteTemplate, 0x83, 0x4 0x0 0x0 0x1 0x1 + playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET + waitforvisualfinish + end + +Move_OVERDRIVE:: + loadspritegfx ANIM_TAG_THIN_RING + loadspritegfx ANIM_TAG_SPARK_2 + loadspritegfx ANIM_TAG_ELECTRICITY + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRICITY, 0, 12, 12, 0x76E1 @Blue Electricity + call BoltBeakSparks + waitforvisualfinish + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_THIN_RING, 0, 12, 12, 0x17BF @Yellow Electricity + call OverdriveRings + delay 0x8 + call OverdriveRings + delay 0x10 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_THIN_RING, 0, 0, 12, 0x76E1 @Blue Electricity + waitforvisualfinish + end +OverdriveRings: + playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_TARGET + launchtemplate gSimplePaletteBlendSpriteTemplate 0x2 0x5 0x1f 0x3 0x8 0x0 0x3ff + launchtask AnimTask_ScaleMonAndRestore 0x5 0x5 0xfffb 0xfffb 0x5 0x0 0x0 + launchtemplate gHyperVoiceRingSpriteTemplate 0x0 0x7 0x2d 0x0 0x0 0x0 0x0 0x0 0x1 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0x1 0x0 0x6 0x1 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x3 0x1 0x0 0x6 0x1 + launchtask AnimTask_ShakeBattleTerrain 0x2 0x4 0x1 0x0 0x6 0x1 + launchtask SoundTask_WaitForCry 0x5 0x0 + return + + +Move_APPLE_ACID:: + loadspritegfx ANIM_TAG_APPLE + loadspritegfx ANIM_TAG_POISON_BUBBLE + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_POISON_BUBBLE, 0, 12, 12, 0x061D @Orange + playsewithpan SE_M_METRONOME, SOUND_PAN_ATTACKER + launchtemplate gAppleAcidFloatingAppleTemplate 0xc 0x1 0x0 + delay 0x30 + monbg ANIM_TARGET + launchtemplate gAppleAcidLaunchTemplate 0x82, 0x6 0x14 0x0 0x28 0x1 0x0 0x0 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + delay 0x5 + launchtemplate gAppleAcidLaunchTemplate 0x82, 0x6 0x14 0x0 0x28 0x1 0x18 0x0 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + delay 0x5 + launchtemplate gAppleAcidLaunchTemplate 0x82, 0x6 0x14 0x0 0x28 0x1 0xffe8 0x0 + playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER + delay 0xf + launchtask AnimTask_ShakeMon2 0x5 0x5 ANIM_TARGET 0x2 0x0 0xa 0x1 + launchtemplate gAppleAcidDripTemplate 0x82, 0x5 0x0 0xffea 0x0 0xf 0x37 + playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET + delay 0xa + launchtemplate gAppleAcidDripTemplate 0x82, 0x5 0xffe6 0xffe8 0x0 0xf 0x37 + playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET + delay 0xa + launchtemplate gAppleAcidDripTemplate 0x82, 0x5 0xf 0xffe5 0x0 0xf 0x32 + playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET + delay 0xa + launchtemplate gAppleAcidDripTemplate 0x82, 0x5 0xfff1 0xffef 0x0 0xa 0x2d + playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET + delay 0xa + launchtemplate gAppleAcidDripTemplate 0x82, 0x5 0x1b 0xffea 0x0 0xf 0x32 + playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg ANIM_TARGET + end + + +Move_GRAV_APPLE:: + loadspritegfx ANIM_TAG_APPLE + fadetobg BG_IN_AIR + waitbgfadeout + launchtask AnimTask_StartSlidingBg 0x5 0x4 0x0 0xf800 0x0 0xffff + waitbgfadein + call SmallAppleShower + call SmallAppleShower + launchtemplate gGravAppleLargeApple, 0x82, 0x4, 0x0, 0x3c, 4, ANIM_TARGET + delay 0x7 + playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET + launchtemplate gSlideMonToOffsetSpriteTemplate 0x2 0x5 ANIM_TARGET 0 0x15 0x0 0x4 + delay 0x30 + launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_TARGET 0x0 0x10 + waitforvisualfinish + call UnsetPsychicBg + end +SmallAppleShower: + launchtemplate gGravAppleSmallApple, 0x82, 0x4, 35, 0x3c, 4, ANIM_TARGET + playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound + delay 0x2 + launchtemplate gGravAppleSmallApple, 0x82, 0x4, -30, 0x44, 4, ANIM_TARGET + playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound + delay 0x2 + launchtemplate gGravAppleSmallApple, 0x82, 0x4, 27, 0x37, 4, ANIM_TARGET + playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound + delay 0x2 + launchtemplate gGravAppleSmallApple, 0x82, 0x4, -20, 0x32, 4, ANIM_TARGET + playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound + delay 0x2 + launchtemplate gGravAppleSmallApple, 0x82, 0x4, 33, 0x3a, 4, ANIM_TARGET + playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound + delay 0x2 + launchtemplate gGravAppleSmallApple, 0x82, 0x4, -12, 0x3a, 4, ANIM_TARGET + playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound + delay 0x2 + launchtemplate gGravAppleSmallApple, 0x82, 0x4, 19, 0x3c, 4, ANIM_TARGET + playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound + delay 0x2 + launchtemplate gGravAppleSmallApple, 0x82, 0x4, -38, 0x3a, 4, ANIM_TARGET + playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound + delay 0x2 + launchtemplate gGravAppleSmallApple, 0x82, 0x4, 5, 0x3c, 4, ANIM_TARGET + playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound + delay 0x2 + launchtemplate gGravAppleSmallApple, 0x82, 0x4, -23, 0x28, 4, ANIM_TARGET + playsewithpan SE_FALL, SOUND_PAN_ATTACKER @;Falling sound + delay 0x2 + return + + +Move_SPIRIT_BREAK:: + goto Move_PSYCHIC + + +Move_STRANGE_STEAM:: + loadspritegfx ANIM_TAG_PINK_CLOUD + loadspritegfx ANIM_TAG_FINGER + loadspritegfx ANIM_TAG_WATER_GUN @blue colour + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_FINGER, 0, 10, 10, 0x4798 @Green + monbg ANIM_DEF_PARTNER + monbgprio_28 ANIM_TARGET + loopsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER, 0x4, 0xA + call StrangeSteamCloud + call StrangeSteamCloud + call StrangeSteamCloud + launchtask AnimTask_ShakeMon2 0x2 0x5 ANIM_TARGET 0x2 0x0 0x2A 0x1 + call StrangeSteamCloud + call StrangeSteamCloud + call StrangeSteamCloud + call StrangeSteamCloud + call StrangeSteamCloud + call StrangeSteamCloud + call StrangeSteamCloud + call StrangeSteamCloud + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + end +StrangeSteamCloud: + launchtemplate gStrangeSteamPinkCloudTemplate 0x82 0x5 0xf 0xf 0x14 0x0 0x0 + launchtemplate gStrangeSteamGreenCloudTemplate 0x82 0x5 0xf 0xf 0x14 0xa 0x5 + launchtemplate gStrangeSteamPinkCloudTemplate 0x82 0x5 0xf 0xf 0x14 0xfff6 0xfffb + launchtemplate gStrangeSteamGreenCloudTemplate 0x82 0x5 0xf 0xf 0x14 0x14 0xa + launchtemplate gStrangeSteamBlueCloudTemplate 0x82 0x5 0xf 0xf 0x14 0xffec 0xfff6 + delay 0x2 + return + +Move_LIFE_DEW:: + loadspritegfx ANIM_TAG_WATER_DROPLET + loadspritegfx ANIM_TAG_BLUE_STAR + monbg ANIM_ATK_PARTNER + launchtemplate gLifeDewDropletTemplate, 2, 0x3, 0, 0, ANIM_ATTACKER + launchtemplate gLifeDewDropletTemplate, 2, 0x3, 0, 0, ANIM_ATK_PARTNER + delay 0x15 + playsewithpan SE_M_BUBBLE, SOUND_PAN_ATTACKER + waitforvisualfinish + playsewithpan SE_M_ABSORB_2, SOUND_PAN_ATTACKER + launchtemplate gLifeDewSpecialOrbsTemplate, 2, 0x4, 0, -5, ANIM_ATTACKER, FALSE + launchtemplate gLifeDewSpecialOrbsTemplate, 2, 0x4, 0, -5, ANIM_ATK_PARTNER, FALSE + delay 0x7 + launchtemplate gLifeDewSpecialOrbsTemplate, 2, 0x4, -15, 10, ANIM_ATTACKER, FALSE + launchtemplate gLifeDewSpecialOrbsTemplate, 2, 0x4, -15, 10, ANIM_ATK_PARTNER, FALSE + delay 0x7 + launchtemplate gLifeDewSpecialOrbsTemplate, 2, 0x4, -15, -15, ANIM_ATTACKER, FALSE + launchtemplate gLifeDewSpecialOrbsTemplate, 2, 0x4, -15, -15, ANIM_ATK_PARTNER, FALSE + delay 0x7 + launchtemplate gLifeDewSpecialOrbsTemplate, 2, 0x4, 10, -5, ANIM_ATTACKER, FALSE + launchtemplate gLifeDewSpecialOrbsTemplate, 2, 0x4, 10, -5, ANIM_ATK_PARTNER, FALSE + delay 0x7 + waitforvisualfinish + clearmonbg ANIM_ATK_PARTNER + end + + +Move_OBSTRUCT:: + loadspritegfx ANIM_TAG_NOISE_LINE @growl + loadspritegfx ANIM_TAG_PROTECT + loadspritegfx ANIM_TAG_OBSTRUCT_CROSS + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_NOISE_LINE, 0, 10, 10, 0 @Black + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_PROTECT, 0, 10, 10, 0 @Black + launchtask SoundTask_PlayDoubleCry 0x2 0x2 ANIM_ATTACKER 0xff + call RoarEffect + waitforvisualfinish + delay 0x10 + monbg ANIM_ATK_PARTNER + monbgprio_28 ANIM_ATTACKER + waitplaysewithpan SE_M_REFLECT, SOUND_PAN_ATTACKER, 0x10 + launchtemplate gProtectSpriteTemplate, 2, 0x3 0x18 0x0 0x5a @;Protect + waitforvisualfinish + launchtemplate gObstructCrossTemplate, 2, 0x4 0x0 0x0 0x1 0x24 + playsewithpan SE_M_LEER, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg ANIM_ATK_PARTNER + end + + +Move_FALSE_SURRENDER:: + goto Move_FEINT + + +Move_METEOR_ASSAULT:: + loadspritegfx ANIM_TAG_ELECTRIC_ORBS + loadspritegfx ANIM_TAG_METEOR + loadspritegfx ANIM_TAG_EXPLOSION + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRIC_ORBS, 0, 12, 12, 0x0B1D @Light orange + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_ATK, 1, 0, 9, 0x0B1D @Light orange + launchtask AnimTask_ElectricChargingParticles 0x2 0x4 0x0 0x30 0x0 0x4 + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + waitforvisualfinish + invisible ANIM_ATTACKER + launchtemplate gGrowingSuperpowerTemplate, 0x83, 0x1 0x0 + playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER + delay 0xF + createvisualtask AnimTask_BlendBattleAnimPal, 10, (ANIM_PAL_ATK | ANIM_PAL_BG), 1, 0x10, 0x10, 0x7FFF @Screen flash white + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0 0x5 0x20 0x1 + call BasicExplosion + call BasicExplosion + waitforvisualfinish + visible ANIM_ATTACKER + createvisualtask AnimTask_BlendBattleAnimPal, 10, (ANIM_PAL_ATK | ANIM_PAL_BG), 1, 0x10, 0, 0x7FFF @Screen revert from white + waitforvisualfinish + end +BasicExplosion: + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + launchtemplate gExplosionSpriteTemplate, 0x83, 0x4 0x0 0x0 0x1 0x1 + delay 0x3 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + launchtemplate gExplosionSpriteTemplate, 0x83, 0x4 0x18 0xffe8 0x1 0x1 + delay 0x3 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + launchtemplate gExplosionSpriteTemplate, 0x83, 0x4 0xfff0 0x10 0x1 0x1 + delay 0x3 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + launchtemplate gExplosionSpriteTemplate, 0x83, 0x4 0xffe8 0xfff4 0x1 0x1 + delay 0x3 + playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET + launchtemplate gExplosionSpriteTemplate, 0x83, 0x4 0x10 0x10 0x1 0x1 + return + + +Move_ETERNA_BEAM:: + goto Move_HYPER_BEAM + + +Move_STEEL_BEAM:: + loadspritegfx ANIM_TAG_ELECTRIC_ORBS + loadspritegfx ANIM_TAG_GUST + loadspritegfx ANIM_TAG_SPIKES + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x0 0x0 0x10 0x6B59 @To gray + launchtask AnimTask_ElectricChargingParticles 0x2 0x4 0x0 0x14 0x0 0x2 + playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER + delay 0x14 + loopsewithpan SE_M_HARDEN, SOUND_PAN_ATTACKER, 0x9, 15 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_ATTACKER 0x0 0x4 72 0x1 + call SteelBeamShards + call SteelBeamShards + launchtemplate gSlideMonToOffsetSpriteTemplate 0x2 0x5 ANIM_TARGET, -30, 0x0 TRUE 145 + call SteelBeamShards + call SteelBeamShards + call SteelBeamShards + call SteelBeamShards + call SteelBeamShards + call SteelBeamShards + call SteelBeamShards + call SteelBeamShards + call SteelBeamShards + call SteelBeamShards + call SteelBeamShards + call SteelBeamShards + call SteelBeamShards + call SteelBeamShards + call SteelBeamShards + call SteelBeamShards + waitforvisualfinish + launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_TARGET 0x0 0x6 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xE 0x0 0x6B59 @From gray + waitforvisualfinish + end +SteelBeamShards: + launchtemplate gSteelBeamSpikeShardTemplate 0x80, 0x5 0xf 0xf 0x14 0x0 0x0 + launchtemplate gSteelBeamSpikeShardTemplate 0x80, 0x5 0xf 0xf 0x14 0xa 0x5 + launchtemplate gSteelBeamSpikeShardTemplate 0x80, 0x5 0xf 0xf 0x14 0xfff6 0xfffb + delay 0x2 + launchtemplate gSteelBeamSpikeShardTemplate 0x80, 0x5 0xf 0xf 0x14 0x14 0xa + launchtemplate gSteelBeamSpikeShardTemplate 0x80, 0x5 0xf 0xf 0x14 0xffec 0xfff6 + delay 0x2 + +@@@@@@@@@@@@@@@@@@@@@@@ GEN 1-3 @@@@@@@@@@@@@@@@@@@@@@@ Move_NONE: Move_MIRROR_MOVE: Move_POUND: @@ -935,6 +14564,25 @@ EmberFireHit: delay 4 return +SetImpactBackground: + delay 2 + createvisualtask AnimTask_IsContest, 2 + jumprettrue SetImpactContestsBG + createvisualtask AnimTask_IsTargetPlayerSide, 2 + jumpretfalse SetImpactOpponentBG + jumprettrue SetImpactPlayerBG +SetImpactBackgroundRet: + return +SetImpactOpponentBG: + changebg BG_IMPACT_OPPONENT + goto SetImpactBackgroundRet +SetImpactPlayerBG: + changebg BG_IMPACT_PLAYER + goto SetImpactBackgroundRet +SetImpactContestsBG: + changebg BG_IMPACT_CONTESTS + goto SetImpactBackgroundRet + Move_MEGA_PUNCH: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_HANDS_AND_FEET @@ -959,24 +14607,6 @@ Move_MEGA_PUNCH: restorebg waitbgfadein end -SetImpactBackground: - delay 2 - createvisualtask AnimTask_IsContest, 2 - jumprettrue SetImpactContestsBG - createvisualtask AnimTask_IsTargetPlayerSide, 2 - jumpretfalse SetImpactOpponentBG - jumprettrue SetImpactPlayerBG -SetImpactBackgroundRet: - return -SetImpactOpponentBG: - changebg BG_IMPACT_OPPONENT - goto SetImpactBackgroundRet -SetImpactPlayerBG: - changebg BG_IMPACT_PLAYER - goto SetImpactBackgroundRet -SetImpactContestsBG: - changebg BG_IMPACT_CONTESTS - goto SetImpactBackgroundRet Move_MEGA_KICK: loadspritegfx ANIM_TAG_IMPACT @@ -2703,7 +16333,7 @@ Move_MEDITATE: delay 16 playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER waitforvisualfinish - call UnsetPsychicBackground + call UnsetPsychicBg end Move_AGILITY: @@ -2770,7 +16400,7 @@ Move_TELEPORT: createvisualtask AnimTask_Teleport, 2 playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER delay 15 - call UnsetPsychicBackground + call UnsetPsychicBg waitforvisualfinish end @@ -2863,7 +16493,7 @@ Move_AMNESIA: delay 54 loopsewithpan SE_M_METRONOME, SOUND_PAN_ATTACKER, 16, 3 waitforvisualfinish - call UnsetPsychicBackground + call UnsetPsychicBg end Move_KINESIS: @@ -2882,7 +16512,7 @@ Move_KINESIS: delay 70 playsewithpan SE_M_SWAGGER2, SOUND_PAN_ATTACKER waitforvisualfinish - call UnsetPsychicBackground + call UnsetPsychicBg end Move_GLARE: @@ -3120,18 +16750,32 @@ Move_SPITE: waitbgfadein clearmonbg ANIM_TARGET end + +SetHighSpeedBg: + createvisualtask AnimTask_GetAttackerSide, 2 + jumprettrue SetHighSpeedBgPlayer + fadetobg BG_HIGHSPEED_OPPONENT + goto SetHighSpeedBgFade +SetHighSpeedBgPlayer: + fadetobg BG_HIGHSPEED_PLAYER +SetHighSpeedBgFade: + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, -2304, 0, 1, -1 + waitbgfadein + return + +UnsetHighSpeedBg: + restorebg + waitbgfadeout + setarg 7, -1 + waitbgfadein + return Move_MACH_PUNCH: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_HANDS_AND_FEET monbg ANIM_ATK_PARTNER - createvisualtask AnimTask_GetAttackerSide, 2 - jumprettrue MachPunchAgainstPlayer - fadetobg BG_HIGHSPEED_OPPONENT -MachPunchContinue: - waitbgfadeout - createvisualtask AnimTask_StartSlidingBg, 5, -2304, 0, 1, -1 - waitbgfadein + call SetHighSpeedBg delay 0 setalpha 9, 8 createvisualtask AnimTask_AttackerPunchWithTrace, 2, RGB(8, 9, 28), 10 @@ -3144,14 +16788,8 @@ MachPunchContinue: waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff - restorebg - waitbgfadeout - setarg 7, 0xFFFF - waitbgfadein + call UnsetHighSpeedBg end -MachPunchAgainstPlayer: - fadetobg BG_HIGHSPEED_PLAYER - goto MachPunchContinue Move_FORESIGHT: loadspritegfx ANIM_TAG_MAGNIFYING_GLASS @@ -3385,13 +17023,7 @@ Move_MOONLIGHT: Move_EXTREME_SPEED: loadspritegfx ANIM_TAG_SPEED_DUST loadspritegfx ANIM_TAG_IMPACT - createvisualtask AnimTask_GetAttackerSide, 2 - jumprettrue ExtremeSpeedAgainstPlayer - fadetobg BG_HIGHSPEED_OPPONENT -ExtremeSpeedContinue: - waitbgfadeout - createvisualtask AnimTask_StartSlidingBg, 5, -2304, 0, 1, -1 - waitbgfadein + call SetHighSpeedBg createvisualtask AnimTask_AttackerStretchAndDisappear, 2 loopsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER, 8, 3 waitforvisualfinish @@ -3416,19 +17048,13 @@ ExtremeSpeedContinue: createvisualtask AnimTask_ExtremeSpeedMonReappear, 2 loopsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER, 8, 4 waitforvisualfinish - restorebg - waitbgfadeout - setarg 7, 0xFFFF - waitbgfadein + call UnsetHighSpeedBg clearmonbg ANIM_TARGET blendoff delay 1 setarg 7, 0x1000 delay 1 end -ExtremeSpeedAgainstPlayer: - fadetobg BG_HIGHSPEED_PLAYER - goto ExtremeSpeedContinue Move_UPROAR: loadspritegfx ANIM_TAG_JAGGED_MUSIC_NOTE @@ -3830,7 +17456,7 @@ Move_SKILL_SWAP: createvisualtask AnimTask_SkillSwap, 3, ANIM_ATTACKER createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB_WHITE, 12, 3, 1 waitforvisualfinish - call UnsetPsychicBackground + call UnsetPsychicBg end Move_IMPRISON: @@ -3847,7 +17473,7 @@ Move_IMPRISON: createvisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 1, 10 playsewithpan SE_M_HYPER_BEAM, SOUND_PAN_ATTACKER clearmonbg ANIM_DEF_PARTNER - call UnsetPsychicBackground + call UnsetPsychicBg end Move_GRUDGE: @@ -3942,7 +17568,7 @@ Move_LUSTER_PURGE: waitforvisualfinish clearmonbg ANIM_ATTACKER blendoff - call UnsetPsychicBackground + call UnsetPsychicBg end Move_MIST_BALL: @@ -4337,7 +17963,7 @@ Move_EXTRASENSORY: waitforvisualfinish blendoff clearmonbg ANIM_DEF_PARTNER - call UnsetPsychicBackground + call UnsetPsychicBg end Move_AERIAL_ACE: @@ -4553,10 +18179,10 @@ Move_SHOCK_WAVE: delay 12 createsprite gGrowingShockWaveOrbSpriteTemplate, ANIM_ATTACKER, 2 delay 30 - createvisualtask AnimTask_ShockWaveProgressingBolt, 5 + createvisualtask AnimTask_ShockWaveProgressingBolt, 5, ANIM_TARGET delay 12 waitforvisualfinish - createvisualtask AnimTask_ShockWaveLightning, 5 + createvisualtask AnimTask_ShockWaveLightning, 5, ANIM_TARGET playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 6, 18, 1 @@ -4720,7 +18346,7 @@ Move_CONFUSION: clearmonbg ANIM_DEF_PARTNER blendoff delay 1 - call UnsetPsychicBackground + call UnsetPsychicBg end Move_PSYCHIC: @@ -4737,7 +18363,7 @@ Move_PSYCHIC: clearmonbg ANIM_DEF_PARTNER blendoff delay 1 - call UnsetPsychicBackground + call UnsetPsychicBg end Move_FUTURE_SIGHT: @@ -4745,7 +18371,7 @@ Move_FUTURE_SIGHT: FutureSightContinue: waitforvisualfinish delay 1 - call UnsetPsychicBackground + call UnsetPsychicBg end FutureSight: monbg ANIM_ATK_PARTNER @@ -4768,7 +18394,7 @@ Move_THUNDER: waitbgfadein createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 2, 0, 16, RGB_BLACK delay 16 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 16, -36 @@ -4785,7 +18411,7 @@ Move_THUNDER: createsprite gLightningSpriteTemplate, ANIM_TARGET, 6, -16, 16 playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_TARGET delay 5 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 24, -32 delay 1 @@ -4793,9 +18419,9 @@ Move_THUNDER: delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 24, 16 delay 30 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 delay 5 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -32 playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET @@ -4804,11 +18430,11 @@ Move_THUNDER: delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, 16 delay 10 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 delay 1 createvisualtask AnimTask_ShakeTargetInPattern, 2, 30, 3, TRUE, 0 delay 2 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 delay 1 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_TARGET, 2, 1, 2, 16, 0, RGB_BLACK waitforvisualfinish @@ -4830,7 +18456,7 @@ Move_THUNDER_PUNCH: createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0, 0, 8, 1, 0 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 delay 1 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -48 delay 1 @@ -4839,7 +18465,7 @@ Move_THUNDER_PUNCH: createsprite gLightningSpriteTemplate, ANIM_ATTACKER, 2, 0, 16 delay 1 playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 delay 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2 @@ -4867,12 +18493,12 @@ Move_SACRED_FIRE: delay 1 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 20, 10, 50, 5, 1, 1 delay 1 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 delay 1 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 16, 50, 5, 0, 1 delay 1 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -20, 10, 50, 5, -1, 1 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 delay 1 waitforvisualfinish playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET @@ -4884,10 +18510,10 @@ Move_SACRED_FIRE: playsewithpan SE_M_SACRED_FIRE2, SOUND_PAN_TARGET createsprite gLargeFlameSpriteTemplate, ANIM_TARGET, 2, 16, 0, 80, 16, 0, 1 delay 1 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 delay 1 waitforvisualfinish - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 delay 1 playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_TARGET createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, -1, 0 @@ -5519,13 +19145,7 @@ SolarBeamUnleash1: Move_BLIZZARD: loadspritegfx ANIM_TAG_ICE_CRYSTALS monbg ANIM_DEF_PARTNER - createvisualtask AnimTask_GetAttackerSide, 2 - jumprettrue BlizzardAgainstPlayer - fadetobg BG_HIGHSPEED_OPPONENT -BlizzardContinue: - waitbgfadeout - createvisualtask AnimTask_StartSlidingBg, 5, -2304, 0, 1, -1 - waitbgfadein + call SetHighSpeedBg waitforvisualfinish panse_1B SE_M_BLIZZARD, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 call BlizzardIceCrystals @@ -5535,10 +19155,7 @@ BlizzardContinue: call IceCrystalEffectLong waitforvisualfinish delay 20 - restorebg - waitbgfadeout - setarg 7, 0xFFFF - waitbgfadein + call UnsetHighSpeedBg clearmonbg ANIM_DEF_PARTNER end BlizzardIceCrystals: @@ -5564,9 +19181,6 @@ BlizzardIceCrystals: createsprite gBlizzardIceCrystalSpriteTemplate, ANIM_ATTACKER, 40, 0, 20, 0, 20, 80, 0, 0, 1 delay 3 return -BlizzardAgainstPlayer: - fadetobg BG_HIGHSPEED_PLAYER - goto BlizzardContinue Move_POWDER_SNOW: loadspritegfx ANIM_TAG_ICE_CRYSTALS @@ -5998,31 +19612,31 @@ SludgeBombProjectile: Move_ACID: loadspritegfx ANIM_TAG_POISON_BUBBLE monbg ANIM_DEF_PARTNER - createsprite gAcidPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, 20, 0, 40, 1, 0, 0 + createsprite gAcidPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, 20, 0, 40, 1, 0, 0, TRUE playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER delay 5 - createsprite gAcidPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, 20, 0, 40, 1, 24, 0 + createsprite gAcidPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, 20, 0, 40, 1, 24, 0, TRUE playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER delay 5 - createsprite gAcidPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, 20, 0, 40, 1, -24, 0 + createsprite gAcidPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, 20, 0, 40, 1, -24, 0, TRUE playsewithpan SE_M_BUBBLE3, SOUND_PAN_ATTACKER delay 15 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 10, 1 createvisualtask AnimTask_ShakeMon2, 5, ANIM_DEF_PARTNER, 2, 0, 10, 1 createvisualtask AnimTask_BlendColorCycle, 2, 20, 2, 2, 0, 12, RGB(30, 0, 31) - createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -22, 0, 15, 55 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 0, -22, 0, 15, 55, TRUE playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET delay 10 - createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, -26, -24, 0, 15, 55 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, -26, -24, 0, 15, 55, TRUE playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET delay 10 - createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 15, -27, 0, 15, 50 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 15, -27, 0, 15, 50, TRUE playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET delay 10 - createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, -15, -17, 0, 10, 45 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, -15, -17, 0, 10, 45, TRUE playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET delay 10 - createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 27, -22, 0, 15, 50 + createsprite gAcidPoisonDropletSpriteTemplate, ANIM_TARGET, 2, 27, -22, 0, 15, 50, TRUE playsewithpan SE_M_BUBBLE, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -6295,7 +19909,7 @@ Move_CRABHAMMER: end Move_SURF: - createvisualtask AnimTask_CreateSurfWave, 2, FALSE + createvisualtask AnimTask_CreateSurfWave, 2, ANIM_SURF_PAL_SURF delay 24 panse_1B SE_M_SURF, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 waitforvisualfinish @@ -6405,7 +20019,7 @@ FlyUnleash: monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER - createsprite gFlyBallAttackSpriteTemplate, ANIM_ATTACKER, 2, 20 + createsprite gFlyBallAttackSpriteTemplate, ANIM_ATTACKER, 2, 20, FALSE delay 20 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 @@ -6967,7 +20581,7 @@ Move_FIRE_PUNCH: createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 call FireSpreadEffect delay 4 - playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET + playsewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 0, 9, 0, RGB_RED waitforvisualfinish @@ -7026,7 +20640,7 @@ Move_DREAM_EATER: clearmonbg ANIM_DEF_PARTNER blendoff delay 1 - call UnsetPsychicBackground + call UnsetPsychicBg end DreamEaterAbsorb: playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET @@ -7144,7 +20758,7 @@ Move_PSYBEAM: call PsybeamRings waitforvisualfinish delay 1 - call UnsetPsychicBackground + call UnsetPsychicBg end PsybeamRings: createsprite gGoldRingSpriteTemplate, ANIM_TARGET, 2, 16, 0, 0, 0, 13, 0 @@ -7160,7 +20774,7 @@ Move_HYPNOSIS: createvisualtask AnimTask_BlendColorCycle, 2, 4, 2, 2, 0, 12, RGB(31, 18, 31) waitforvisualfinish delay 1 - call UnsetPsychicBackground + call UnsetPsychicBg end HypnosisRings: playsewithpan SE_M_SUPERSONIC, SOUND_PAN_ATTACKER @@ -7184,7 +20798,7 @@ Move_PSYWAVE: call PsywaveRings waitforvisualfinish delay 1 - call UnsetPsychicBackground + call UnsetPsychicBg end PsywaveRings: createsprite gPsywaveRingSpriteTemplate, ANIM_TARGET, 3, 10, 10, 0, 16 @@ -7493,7 +21107,7 @@ Move_SPIDER_WEB: call SpiderWebThread waitforvisualfinish playsewithpan SE_M_STRING_SHOT2, SOUND_PAN_TARGET - createsprite gSpiderWebSpriteTemplate, ANIM_ATTACKER, 2 + createsprite gSpiderWebSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, FALSE waitforvisualfinish clearmonbg ANIM_DEF_PARTNER delay 1 @@ -8048,7 +21662,7 @@ Move_TRI_ATTACK: createvisualtask AnimTask_ShakeTargetInPattern, 2, 20, 3, TRUE, 1 waitforvisualfinish loadspritegfx ANIM_TAG_LIGHTNING - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -48 delay 1 @@ -8058,7 +21672,7 @@ Move_TRI_ATTACK: delay 20 createvisualtask AnimTask_ShakeTargetInPattern, 2, 20, 3, TRUE, 0 delay 2 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 waitforvisualfinish loadspritegfx ANIM_TAG_ICE_CRYSTALS call IceCrystalEffectShort @@ -8277,7 +21891,7 @@ Move_TRANSFORM: monbg ANIM_ATTACKER playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER waitplaysewithpan SE_M_MINIMIZE, SOUND_PAN_ATTACKER, 48 - createvisualtask AnimTask_TransformMon, 2, 0 + createvisualtask AnimTask_TransformMon, 2, 0, 0 waitforvisualfinish clearmonbg ANIM_ATTACKER end @@ -8486,7 +22100,7 @@ Move_BLAZE_KICK: createsprite gSpinningHandOrFootSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 30 createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 0, 7, RGB_WHITE delay 30 - playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET + playsewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 14, 1 createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 0, 0, RGB_WHITE @@ -8592,7 +22206,7 @@ ArmThrustLeft: Move_MUDDY_WATER: panse_1B SE_M_WHIRLPOOL, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 - createvisualtask AnimTask_CreateSurfWave, 2, TRUE + createvisualtask AnimTask_CreateSurfWave, 2, ANIM_SURF_PAL_MUDDY_WATER waitforvisualfinish end @@ -9100,7 +22714,7 @@ Move_BLAST_BURN: createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 40, 20, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -40, 20, 24, 0, 0, 0 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 delay 25 playsewithpan SE_M_FLAME_WHEEL2, SOUND_PAN_ATTACKER createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -96, 0, 24, 0, 0, 0 @@ -9114,7 +22728,7 @@ Move_BLAST_BURN: createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 66, 60, 30, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, 0, 48, 24, 0, 0, 0 createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -60, 30, 24, 0, 0, 0 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff @@ -9151,6 +22765,32 @@ Move_ROCK_TOMB: createvisualtask AnimTask_ShakeBattleTerrain, 2, 2, 0, 10, 1 waitforvisualfinish end + +SetBugBg: + createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, 1, 0, 0, 4, RGB_BLACK + createvisualtask AnimTask_GetAttackerSide, 2 + jumprettrue SetBugBgPlayer + fadetobg BG_BUG_OPPONENT + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, 1536, 0, 0, -1 + goto SetBugBgFade +SetBugBgPlayer: + fadetobg BG_BUG_PLAYER + waitbgfadeout + createvisualtask AnimTask_StartSlidingBg, 5, -1536, 0, 0, -1 +SetBugBgFade: + delay 0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 0, 4, 4, RGB_BLACK + waitbgfadein + return + +UnsetBugBg: + restorebg + waitbgfadeout + createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, 1, 0, 4, 0, RGB_BLACK + setarg 7, -1 + waitbgfadein + return Move_SILVER_WIND: loadspritegfx ANIM_TAG_SPARKLE_6 @@ -9160,16 +22800,7 @@ Move_SILVER_WIND: monbg ANIM_DEF_PARTNER monbgprio_29 delay 0 - createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, ANIM_TARGET, 0, 0, 4, RGB_BLACK - createvisualtask AnimTask_GetTargetSide, 2 - jumprettrue SilverWindOnPlayer - fadetobg BG_BUG_OPPONENT - waitbgfadeout - createvisualtask AnimTask_StartSlidingBg, 5, 1536, 0, 0, -1 -SilverWindContinue: - delay 0 - createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 0, 4, 4, RGB_BLACK - waitbgfadein + call SetBugBg createsprite gSilverWindBigSparkSpriteTemplate, ANIM_TARGET, 66, -32, 16, 0, 6, 2, 3, 1 createsprite gSilverWindBigSparkSpriteTemplate, ANIM_TARGET, 66, -8, 18, 64, 3, 2, 2, 1 createsprite gSilverWindBigSparkSpriteTemplate, ANIM_ATTACKER, 120, -24, 18, 90, 5, 1, 2, 1 @@ -9197,17 +22828,8 @@ SilverWindContinue: playsewithpan SE_M_GUST2, SOUND_PAN_TARGET clearmonbg ANIM_DEF_PARTNER delay 0 - restorebg - waitbgfadeout - createvisualtask AnimTask_BlendBattleAnimPalExclude, 10, ANIM_TARGET, 0, 4, 0, RGB_BLACK - setarg 7, 0xFFFF - waitbgfadein + call UnsetBugBg end -SilverWindOnPlayer: - fadetobg BG_BUG_PLAYER - waitbgfadeout - createvisualtask AnimTask_StartSlidingBg, 5, -1536, 0, 0, -1 - goto SilverWindContinue Move_SNATCH: playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER @@ -9326,17 +22948,17 @@ Move_OVERHEAT: delay 5 waitforvisualfinish createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -5, 3, ANIM_TARGET, 0 - playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET + playsewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 10, 0, 25, 1 delay 6 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 8, -5, ANIM_TARGET, 0 - playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET + playsewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET delay 8 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 10, 10, ANIM_TARGET, 0 - playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET + playsewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET delay 8 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 0 - playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET + playsewithpan SE_M_FLAMETHROWER, SOUND_PAN_TARGET createvisualtask AnimTask_CopyPalFadedToUnfaded, 5, 1 delay 1 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 2, -1, 0, 13, RGB(18, 18, 18) @@ -9366,7 +22988,7 @@ Move_HYDRO_CANNON: playsewithpan SE_M_SURF, SOUND_PAN_ATTACKER createsprite gHydroCannonChargeSpriteTemplate, ANIM_TARGET, 2 delay 10 - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 delay 30 panse_1B SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 call HydroCannonBeam @@ -9383,7 +23005,7 @@ Move_HYDRO_CANNON: call HydroCannonBeam createsprite gWaterHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0 waitforvisualfinish - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff @@ -9545,7 +23167,7 @@ Move_PSYCHO_BOOST: waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff - call UnsetPsychicBackground + call UnsetPsychicBg end Move_KNOCK_OFF: @@ -10128,21 +23750,22 @@ WaterBubblesEffectLong: ElectricityEffect: playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET - createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 5, 0, 5, 0 +ElectricityEffectNoSound: + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 5, 0, 5, 0, ANIM_TARGET delay 2 - createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -5, 10, 5, 1 + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -5, 10, 5, 1, ANIM_TARGET delay 2 - createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 15, 20, 5, 2 + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 15, 20, 5, 2, ANIM_TARGET delay 2 - createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -15, -10, 5, 0 + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -15, -10, 5, 0, ANIM_TARGET delay 2 - createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 25, 0, 5, 1 + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 25, 0, 5, 1, ANIM_TARGET delay 2 - createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -8, 8, 5, 2 + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -8, 8, 5, 2, ANIM_TARGET delay 2 - createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 2, -8, 5, 0 + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 2, -8, 5, 0, ANIM_TARGET delay 2 - createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -20, 15, 5, 1 + createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -20, 15, 5, 1, ANIM_TARGET return ConfusionEffect: @@ -10161,7 +23784,7 @@ SetPsychicBackground: waitbgfadein return -UnsetPsychicBackground: +UnsetPsychicBg: restorebg waitbgfadeout setarg 7, 0xFFFF @@ -10293,6 +23916,9 @@ Status_Nightmare: waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end + +Status_Powder: + end General_CastformChange: createvisualtask AnimTask_IsMonInvisible, 2 @@ -10302,7 +23928,7 @@ CastformChangeContinue: monbg ANIM_ATTACKER playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER waitplaysewithpan SE_M_MINIMIZE, SOUND_PAN_ATTACKER, 48 - createvisualtask AnimTask_TransformMon, 2, 1 + createvisualtask AnimTask_TransformMon, 2, 1, 0 waitforvisualfinish clearmonbg ANIM_ATTACKER end @@ -10587,7 +24213,7 @@ General_FutureSightHit: blendoff waitforvisualfinish delay 1 - call UnsetPsychicBackground + call UnsetPsychicBg end General_DoomDesireHit: @@ -10669,6 +24295,83 @@ General_WishHeal: waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 3, 10, 0, RGB_BLACK end + +General_IllusionOff: + monbg ANIM_TARGET + createvisualtask AnimTask_TransformMon, 2, 0, 1 + waitforvisualfinish + clearmonbg ANIM_TARGET + end + +General_FormChange: + monbg ANIM_ATTACKER + createvisualtask AnimTask_TransformMon, 2, 0, 1 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + end + +General_SlideOffScreen: + createvisualtask AnimTask_SlideOffScreen, 5, ANIM_TARGET, +3 + waitforvisualfinish + createvisualtask AnimTask_SetInvisible, 1, ANIM_TARGET, TRUE + waitforvisualfinish + end + +General_MegaEvolution: + loadspritegfx ANIM_TAG_MEGA_STONE + loadspritegfx ANIM_TAG_MEGA_PARTICLES + loadspritegfx ANIM_TAG_MEGA_SYMBOL + monbg ANIM_ATTACKER + setalpha 12, 8 + loopsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER, 13, 3 + createvisualtask AnimTask_BlendColorCycle, 2, 2, 0, 6, 0, 11, RGB(31, 31, 11) + call MegaEvolutionParticles + call MegaEvolutionParticles + call MegaEvolutionParticles + waitforvisualfinish + playsewithpan SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER + createsprite gMegaStoneSpriteTemplate, ANIM_ATTACKER, 41, 0, 0, 0, 0 + delay 20 + createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA + waitforvisualfinish + createvisualtask AnimTask_TransformMon, 2, 0, 1 + createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA + createvisualtask AnimTask_HorizontalShake, 5, 1, 5, 14 + waitforvisualfinish + createsprite gMegaSymbolSpriteTemplate ANIM_ATTACKER, 2 + waitforvisualfinish + clearmonbg ANIM_ATK_PARTNER + blendoff + end + +MegaEvolutionParticles: + createsprite gMegaParticlesSpriteTemplate, ANIM_ATTACKER, 2, 40, -10, 13 + delay 3 + createsprite gMegaParticlesSpriteTemplate, ANIM_ATTACKER, 2, -35, -10, 13 + delay 3 + createsprite gMegaParticlesSpriteTemplate, ANIM_ATTACKER, 2, 15, -40, 13 + delay 3 + createsprite gMegaParticlesSpriteTemplate, ANIM_ATTACKER, 2, -10, -32, 13 + delay 3 + createsprite gMegaParticlesSpriteTemplate, ANIM_ATTACKER, 2, 25, -20, 13 + delay 3 + createsprite gMegaParticlesSpriteTemplate, ANIM_ATTACKER, 2, -40, -20, 13 + delay 3 + createsprite gMegaParticlesSpriteTemplate, ANIM_ATTACKER, 2, 5, -40, 13 + delay 3 + return + +General_TerrainMisty: + end + +General_TerrainGrassy: + end + +General_TerrainElectric: + end + +General_TerrainPsychic: + end SnatchMoveTrySwapFromSubstitute: createvisualtask AnimTask_IsAttackerBehindSubstitute, 2 @@ -10753,3 +24456,13 @@ Special_SubstituteToMon: Special_MonToSubstitute: createvisualtask AnimTask_SwapMonSpriteToFromSubstitute, 2, FALSE end + +Special_CriticalCaptureBallThrow: + createvisualtask AnimTask_LoadBallGfx, 2 + delay 0 + playsewithpan SE_FALL, 0 + createvisualtask AnimTask_ThrowBall, 2 + createvisualtask AnimTask_IsBallBlockedByTrainer, 2 + jumpreteq -1, BallThrowTrainerBlock + goto BallThrowEnd + diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 873425c638..6eb1c89bb2 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4,6 +4,7 @@ #include "constants/battle_anim.h" #include "constants/battle_string_ids.h" #include "constants/abilities.h" +#include "constants/hold_effects.h" #include "constants/moves.h" #include "constants/songs.h" #include "constants/game_stat.h" @@ -32,7 +33,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectSpecialDefenseUp .4byte BattleScript_EffectAccuracyUp .4byte BattleScript_EffectEvasionUp - .4byte BattleScript_EffectAlwaysHit + .4byte BattleScript_EffectSpecialAttackUp3 .4byte BattleScript_EffectAttackDown .4byte BattleScript_EffectDefenseDown .4byte BattleScript_EffectSpeedDown @@ -54,16 +55,16 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectTriAttack .4byte BattleScript_EffectRest .4byte BattleScript_EffectOHKO - .4byte BattleScript_EffectRazorWind + .4byte BattleScript_EffectFusionCombo .4byte BattleScript_EffectSuperFang .4byte BattleScript_EffectDragonRage .4byte BattleScript_EffectTrap - .4byte BattleScript_EffectHighCritical + .4byte BattleScript_EffectHealBlock .4byte BattleScript_EffectDoubleHit .4byte BattleScript_EffectRecoilIfMiss .4byte BattleScript_EffectMist .4byte BattleScript_EffectFocusEnergy - .4byte BattleScript_EffectRecoil + .4byte BattleScript_EffectRecoil25 .4byte BattleScript_EffectConfuse .4byte BattleScript_EffectAttackUp2 .4byte BattleScript_EffectDefenseUp2 @@ -90,7 +91,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectSpecialDefenseDownHit .4byte BattleScript_EffectAccuracyDownHit .4byte BattleScript_EffectEvasionDownHit - .4byte BattleScript_EffectSkyAttack + .4byte BattleScript_EffectTwoTurnsAttack .4byte BattleScript_EffectConfuseHit .4byte BattleScript_EffectTwineedle .4byte BattleScript_EffectVitalThrow @@ -100,7 +101,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectMimic .4byte BattleScript_EffectMetronome .4byte BattleScript_EffectLeechSeed - .4byte BattleScript_EffectSplash + .4byte BattleScript_EffectDoNothing .4byte BattleScript_EffectDisable .4byte BattleScript_EffectLevelDamage .4byte BattleScript_EffectPsywave @@ -111,21 +112,21 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectConversion2 .4byte BattleScript_EffectLockOn .4byte BattleScript_EffectSketch - .4byte BattleScript_EffectUnused60//Thaw + .4byte BattleScript_EffectHammerArm .4byte BattleScript_EffectSleepTalk .4byte BattleScript_EffectDestinyBond .4byte BattleScript_EffectFlail .4byte BattleScript_EffectSpite .4byte BattleScript_EffectFalseSwipe .4byte BattleScript_EffectHealBell - .4byte BattleScript_EffectQuickAttack + .4byte BattleScript_EffectAlwaysCrit .4byte BattleScript_EffectTripleKick .4byte BattleScript_EffectThief .4byte BattleScript_EffectMeanLook .4byte BattleScript_EffectNightmare .4byte BattleScript_EffectMinimize .4byte BattleScript_EffectCurse - .4byte BattleScript_EffectUnused6e + .4byte BattleScript_EffectHealingWish .4byte BattleScript_EffectProtect .4byte BattleScript_EffectSpikes .4byte BattleScript_EffectForesight @@ -146,7 +147,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectPursuit .4byte BattleScript_EffectRapidSpin .4byte BattleScript_EffectSonicboom - .4byte BattleScript_EffectUnused83 + .4byte BattleScript_EffectCaptivate .4byte BattleScript_EffectMorningSun .4byte BattleScript_EffectSynthesis .4byte BattleScript_EffectMoonlight @@ -156,7 +157,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectDefenseUpHit .4byte BattleScript_EffectAttackUpHit .4byte BattleScript_EffectAllStatsUpHit - .4byte BattleScript_EffectUnused8d + .4byte BattleScript_EffectFellStinger .4byte BattleScript_EffectBellyDrum .4byte BattleScript_EffectPsychUp .4byte BattleScript_EffectMirrorCoat @@ -178,7 +179,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectStockpile .4byte BattleScript_EffectSpitUp .4byte BattleScript_EffectSwallow - .4byte BattleScript_EffectUnusedA3 + .4byte BattleScript_EffectWorrySeed .4byte BattleScript_EffectHail .4byte BattleScript_EffectTorment .4byte BattleScript_EffectFlatter @@ -213,9 +214,9 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectSnatch .4byte BattleScript_EffectLowKick .4byte BattleScript_EffectSecretPower - .4byte BattleScript_EffectDoubleEdge + .4byte BattleScript_EffectRecoil33 .4byte BattleScript_EffectTeeterDance - .4byte BattleScript_EffectBlazeKick + .4byte BattleScript_EffectHitEscape .4byte BattleScript_EffectMudSport .4byte BattleScript_EffectPoisonFang .4byte BattleScript_EffectWeatherBall @@ -224,39 +225,1832 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectCosmicPower .4byte BattleScript_EffectSkyUppercut .4byte BattleScript_EffectBulkUp - .4byte BattleScript_EffectPoisonTail + .4byte BattleScript_EffectPlaceholder .4byte BattleScript_EffectWaterSport .4byte BattleScript_EffectCalmMind .4byte BattleScript_EffectDragonDance .4byte BattleScript_EffectCamouflage + .4byte BattleScript_EffectPledge + .4byte BattleScript_EffectFling + .4byte BattleScript_EffectNaturalGift + .4byte BattleScript_EffectWakeUpSlap + .4byte BattleScript_EffectWringOut + .4byte BattleScript_EffectHex + .4byte BattleScript_EffectAssurance + .4byte BattleScript_EffectTrump_card + .4byte BattleScript_EffectAcrobatics + .4byte BattleScript_EffectHeatCrash + .4byte BattleScript_EffectPunishment + .4byte BattleScript_EffectStoredPower + .4byte BattleScript_EffectElectroBall + .4byte BattleScript_EffectGyroBall + .4byte BattleScript_EffectEchoedVoice + .4byte BattleScript_EffectPayback + .4byte BattleScript_EffectRound + .4byte BattleScript_EffectBrine + .4byte BattleScript_EffectVenoshock + .4byte BattleScript_EffectRetalitate + .4byte BattleScript_EffectBulldoze + .4byte BattleScript_EffectFoulPlay + .4byte BattleScript_EffectPsyshock + .4byte BattleScript_EffectRoost + .4byte BattleScript_EffectGravity + .4byte BattleScript_EffectMircleEye + .4byte BattleScript_EffectTailwind + .4byte BattleScript_EffectEmbargo + .4byte BattleScript_EffectAquaRing + .4byte BattleScript_EffectTrickRoom + .4byte BattleScript_EffectWonderRoom + .4byte BattleScript_EffectMagicRoom + .4byte BattleScript_EffectMagnetRise + .4byte BattleScript_EffectToxicSpikes + .4byte BattleScript_EffectGastroAcid + .4byte BattleScript_EffectStealthRock + .4byte BattleScript_EffectTelekinesis + .4byte BattleScript_EffectPowerSwap + .4byte BattleScript_EffectGuardSwap + .4byte BattleScript_EffectHeartSwap + .4byte BattleScript_EffectPowerSplit + .4byte BattleScript_EffectGuardSplit + .4byte BattleScript_EffectStickyWeb + .4byte BattleScript_EffectMetalBurst + .4byte BattleScript_EffectLuckyChant + .4byte BattleScript_EffectSuckerPunch + .4byte BattleScript_EffectSpecialDefenseDownHit2 + .4byte BattleScript_EffectSimpleBeam + .4byte BattleScript_EffectEntrainment + .4byte BattleScript_EffectHealPulse + .4byte BattleScript_EffectQuash + .4byte BattleScript_EffectIonDeluge + .4byte BattleScript_EffectFreezeDry + .4byte BattleScript_EffectTopsyTurvy + .4byte BattleScript_EffectMistyTerrain + .4byte BattleScript_EffectGrassyTerrain + .4byte BattleScript_EffectElectricTerrain + .4byte BattleScript_EffectPsychicTerrain + .4byte BattleScript_EffectAttackAccUp + .4byte BattleScript_EffectAttackSpAttackUp + .4byte BattleScript_EffectHurricane + .4byte BattleScript_EffectTwoTypedMove + .4byte BattleScript_EffectMeFirst + .4byte BattleScript_EffectSpeedUpHit + .4byte BattleScript_EffectQuiverDance + .4byte BattleScript_EffectCoil + .4byte BattleScript_EffectElectrify + .4byte BattleScript_EffectScald + .4byte BattleScript_EffectReflectType + .4byte BattleScript_EffectSoak + .4byte BattleScript_EffectGrowth + .4byte BattleScript_EffectCloseCombat + .4byte BattleScript_EffectLastResort + .4byte BattleScript_EffectRecoil33WithStatus + .4byte BattleScript_EffectFlinchWithStatus + .4byte BattleScript_EffectRecoil50 + .4byte BattleScript_EffectShellSmash + .4byte BattleScript_EffectShiftGear + .4byte BattleScript_EffectDefenseUp3 + .4byte BattleScript_EffectNobleRoar + .4byte BattleScript_EffectVenomDrench + .4byte BattleScript_EffectToxicThread + .4byte BattleScript_EffectClearSmog + .4byte BattleScript_EffectHitSwitchTarget + .4byte BattleScript_EffectFinalGambit + .4byte BattleScript_EffectTechnoBlast + .4byte BattleScript_EffectJudgment + .4byte BattleScript_EffectAutotomize + .4byte BattleScript_EffectCopycat + .4byte BattleScript_EffectDefog + .4byte BattleScript_EffectHitEnemyHealAlly + .4byte BattleScript_EffectSmackDown + .4byte BattleScript_EffectSynchronoise + .4byte BattleScript_EffectPsychoShift + .4byte BattleScript_EffectPowerTrick + .4byte BattleScript_EffectFlameBurst + .4byte BattleScript_EffectAfterYou + .4byte BattleScript_EffectBestow + .4byte BattleScript_EffectRototiller + .4byte BattleScript_EffectFlowerShield + .4byte BattleScript_EffectHitPreventEscape + .4byte BattleScript_EffectSpeedSwap + .4byte BattleScript_EffectDefenseUp2Hit + .4byte BattleScript_EffectRevelationDance + .4byte BattleScript_EffectAuroraVeil + .4byte BattleScript_EffectThirdType + .4byte BattleScript_EffectFeint + .4byte BattleScript_EffectSparklingAria + .4byte BattleScript_EffectAcupressure + .4byte BattleScript_EffectAromaticMist + .4byte BattleScript_EffectPowder + .4byte BattleScript_EffectSpAtkUpHit + .4byte BattleScript_EffectBelch + .4byte BattleScript_EffectPartingShot + .4byte BattleScript_EffectSpectralThief + .4byte BattleScript_EffectVCreate + .4byte BattleScript_EffectMatBlock + .4byte BattleScript_EffectStompingTantrum + .4byte BattleScript_EffectCoreEnforcer + .4byte BattleScript_EffectInstruct + .4byte BattleScript_EffectThroatChop + .4byte BattleScript_EffectLaserFocus + .4byte BattleScript_EffectMagneticFlux + .4byte BattleScript_EffectGearUp + .4byte BattleScript_EffectIncinerate + .4byte BattleScript_EffectBugBite + .4byte BattleScript_EffectStrengthSap + .4byte BattleScript_EffectMindBlown + .4byte BattleScript_EffectPurify + .4byte BattleScript_EffectBurnUp + .4byte BattleScript_EffectShoreUp + .4byte BattleScript_EffectGeomancy + .4byte BattleScript_EffectFairyLock + .4byte BattleScript_EffectAllySwitch + .4byte BattleScript_EffectSleepHit -BattleScript_EffectSpeedUp:: -BattleScript_EffectSpecialDefenseUp:: -BattleScript_EffectAccuracyUp:: -BattleScript_EffectAlwaysHit:: -BattleScript_EffectSpecialAttackDown:: -BattleScript_EffectSpecialDefenseDown:: -BattleScript_EffectHighCritical:: -BattleScript_EffectAccuracyUp2:: -BattleScript_EffectEvasionUp2:: -BattleScript_EffectSpecialAttackDown2:: -BattleScript_EffectAccuracyDown2:: -BattleScript_EffectEvasionDown2:: -BattleScript_EffectEvasionDownHit:: -BattleScript_EffectVitalThrow:: -BattleScript_EffectUnused60:: -BattleScript_EffectFalseSwipe:: -BattleScript_EffectQuickAttack:: -BattleScript_EffectUnused6e:: -BattleScript_EffectPursuit:: -BattleScript_EffectUnused83:: -BattleScript_EffectUnused8d:: -BattleScript_EffectUnusedA3:: +BattleScript_EffectSleepHit: + setmoveeffect MOVE_EFFECT_SLEEP + goto BattleScript_EffectHit + +BattleScript_EffectAllySwitch: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + jumpifnoally BS_ATTACKER, BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_ALLYSWITCHPOSITION + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectFairyLock: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + trysetfairylock BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_NOONEWILLBEABLETORUNAWAY + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectBurnUp: + attackcanceler + attackstring + ppreduce + jumpiftype BS_ATTACKER, TYPE_FIRE, BattleScript_BurnUpWorks + goto BattleScript_ButItFailed +BattleScript_BurnUpWorks: + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + critcalc + damagecalc + adjustdamage + attackanimation + waitanimation + effectivenesssound + hitanimation BS_TARGET + waitstate + healthbarupdate BS_TARGET + datahpupdate BS_TARGET + critmessage + waitmessage 0x40 + resultmessage + waitmessage 0x40 + losetype BS_ATTACKER, TYPE_FIRE + printstring STRINGID_ATTACKERLOSTFIRETYPE + waitmessage 0x40 + tryfaintmon BS_TARGET, FALSE, NULL + goto BattleScript_MoveEnd + +BattleScript_EffectPurify: + attackcanceler + attackstring + ppreduce + accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON + jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_PurifyWorks + goto BattleScript_ButItFailed +BattleScript_PurifyWorks: + attackanimation + waitanimation + curestatus BS_TARGET + updatestatusicon BS_TARGET + printstring STRINGID_ATTACKERCUREDTARGETSTATUS + waitmessage 0x40 + tryhealhalfhealth BattleScript_AlreadyAtFullHp, BS_ATTACKER + goto BattleScript_RestoreHp + +BattleScript_EffectStrengthSap: + setstatchanger STAT_ATK, 1, TRUE + attackcanceler + jumpifsubstituteblocks BattleScript_ButItFailedAtkStringPpReduce + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_ATK, 0, BattleScript_StrengthSapTryLower + pause 0x20 + statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_MoveEnd + printfromtable gStatDownStringIds + waitmessage 0x40 + goto BattleScript_MoveEnd +BattleScript_StrengthSapTryLower: + getstatvalue BS_TARGET, STAT_ATK + jumpiffullhp BS_ATTACKER, BattleScript_StrengthSapMustLower + attackanimation + waitanimation + statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_StrengthSapHp + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x3, BattleScript_StrengthSapHp +BattleScript_StrengthSapLower: + setgraphicalstatchangevalues + playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + printfromtable gStatDownStringIds + waitmessage 0x40 + goto BattleScript_StrengthSapHp +@ Drain HP without lowering a stat +BattleScript_StrengthSapTryHp: + jumpiffullhp BS_ATTACKER, BattleScript_ButItFailed + attackanimation + waitanimation +BattleScript_StrengthSapHp: + jumpiffullhp BS_ATTACKER, BattleScript_MoveEnd + manipulatedamage DMG_BIG_ROOT + healthbarupdate BS_ATTACKER + datahpupdate BS_ATTACKER + printstring STRINGID_PKMNENERGYDRAINED + waitmessage 0x40 + goto BattleScript_MoveEnd +BattleScript_StrengthSapMustLower: + statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_MoveEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x3, BattleScript_MoveEnd + attackanimation + waitanimation + goto BattleScript_StrengthSapLower + +BattleScript_EffectBugBite: + setmoveeffect MOVE_EFFECT_BUG_BITE | MOVE_EFFECT_CERTAIN + goto BattleScript_EffectHit + +BattleScript_EffectIncinerate: + setmoveeffect MOVE_EFFECT_INCINERATE | MOVE_EFFECT_CERTAIN + goto BattleScript_EffectHit + +BattleScript_MoveEffectIncinerate:: + printstring STRINGID_INCINERATEBURN + waitmessage 0x40 + return + +BattleScript_MoveEffectBugBite:: + printstring STRINGID_BUGBITE + waitmessage 0x40 + return + +BattleScript_EffectCoreEnforcer: + setmoveeffect MOVE_EFFECT_CORE_ENFORCER | MOVE_EFFECT_CERTAIN + goto BattleScript_EffectHit + +BattleScript_MoveEffectCoreEnforcer:: + setgastroacid BattleScript_CoreEnforcerRet + printstring STRINGID_PKMNSABILITYSUPPRESSED + waitmessage 0x40 +BattleScript_CoreEnforcerRet: + return + +BattleScript_EffectLaserFocus: + attackcanceler + attackstring + ppreduce + setuserstatus3 STATUS3_LASER_FOCUS, BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_LASERFOCUS + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectVCreate: + setmoveeffect MOVE_EFFECT_V_CREATE | MOVE_EFFECT_AFFECTS_USER + goto BattleScript_EffectHit + +BattleScript_VCreateStatLoss:: + jumpifstat BS_ATTACKER, CMP_GREATER_THAN, STAT_DEF, 0x0, BattleScript_VCreateStatAnim + jumpifstat BS_ATTACKER, CMP_GREATER_THAN, STAT_SPDEF, 0x0, BattleScript_VCreateStatAnim + jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPEED, 0x0, BattleScript_VCreateStatLossRet +BattleScript_VCreateStatAnim: + setbyte sSTAT_ANIM_PLAYED, FALSE + playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF | BIT_SPEED, STAT_CHANGE_NEGATIVE | STAT_CHANGE_CANT_PREVENT + setstatchanger STAT_DEF, 1, TRUE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_VCreateTrySpDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_VCreateTrySpDef + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_VCreateTrySpDef: + setstatchanger STAT_SPDEF, 1, TRUE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_VCreateTrySpeed + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_VCreateTrySpeed + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_VCreateTrySpeed: + setstatchanger STAT_SPEED, 1, TRUE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_VCreateStatLossRet + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_VCreateStatLossRet + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_VCreateStatLossRet: + return + +BattleScript_SpectralThiefSteal:: + printstring STRINGID_SPECTRALTHIEFSTEAL + waitmessage 0x40 + setbyte sB_ANIM_ARG2, 0 + playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + spectralthiefprintstats + return + +BattleScript_EffectSpectralThief: + setmoveeffect MOVE_EFFECT_SPECTRAL_THIEF + goto BattleScript_EffectHit + +BattleScript_EffectPartingShot:: + attackcanceler + attackstring + ppreduce + jumpifstat BS_TARGET, CMP_GREATER_THAN, STAT_ATK, 0x0, BattleScript_EffectPartingShotTryAtk + jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPATK, 0x0, BattleScript_CantLowerMultipleStats +BattleScript_EffectPartingShotTryAtk: + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackanimation + waitanimation + setbyte sSTAT_ANIM_PLAYED, FALSE + playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_ONLY_MULTIPLE + playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_NEGATIVE + setstatchanger STAT_ATK, 1, TRUE + statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_EffectPartingShotTrySpAtk + printfromtable gStatDownStringIds + waitmessage 0x40 +BattleScript_EffectPartingShotTrySpAtk: + playstatchangeanimation BS_TARGET, BIT_SPATK, STAT_CHANGE_NEGATIVE + setstatchanger STAT_SPATK, 1, TRUE + statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_EffectPartingShotSwitch + printfromtable gStatDownStringIds + waitmessage 0x40 +BattleScript_EffectPartingShotSwitch: + moveendall + jumpifbattletype BATTLE_TYPE_ARENA, BattleScript_PartingShotEnd + jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_PartingShotEnd + openpartyscreen 0x1, BattleScript_PartingShotEnd + switchoutabilities BS_ATTACKER + waitstate + switchhandleorder BS_ATTACKER, 0x2 + returntoball BS_ATTACKER + getswitchedmondata BS_ATTACKER + switchindataupdate BS_ATTACKER + hpthresholds BS_ATTACKER + printstring STRINGID_SWITCHINMON + switchinanim BS_ATTACKER, TRUE + waitstate + switchineffects BS_ATTACKER +BattleScript_PartingShotEnd: + end + +BattleScript_EffectSpAtkUpHit: + setmoveeffect MOVE_EFFECT_SP_ATK_PLUS_1 | MOVE_EFFECT_AFFECTS_USER + goto BattleScript_EffectHit + +BattleScript_EffectPowder: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, NO_ACC_CALC_CHECK_LOCK_ON + attackstring + ppreduce + jumpifstatus2 BS_TARGET, STATUS2_POWDER, BattleScript_ButItFailed + setpowder BS_TARGET + attackanimation + waitanimation + printstring STRINGID_COVEREDINPOWDER + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectAromaticMist: + attackcanceler + attackstring + ppreduce + jumpifbyteequal gBattlerTarget, gBattlerAttacker, BattleScript_ButItFailed + jumpiftargetally BattleScript_EffectAromaticMistWorks + goto BattleScript_ButItFailed +BattleScript_EffectAromaticMistWorks: + setstatchanger STAT_SPDEF, 1, FALSE + statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_EffectAromaticMistEnd + jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_AromaticMistAnim + pause 0x10 + printstring STRINGID_TARGETSTATWONTGOHIGHER + waitmessage 0x40 + goto BattleScript_EffectAromaticMistEnd +BattleScript_AromaticMistAnim: + attackanimation + waitanimation + setgraphicalstatchangevalues + playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_EffectAromaticMistEnd: + goto BattleScript_MoveEnd + +BattleScript_EffectMagneticFlux:: + attackcanceler + attackstring + ppreduce + setbyte gBattleCommunication, 0x0 +BattleScript_EffectMagneticFluxStart: + jumpifability BS_TARGET, ABILITY_MINUS, BattleScript_EffectMagneticFluxCheckStats + jumpifability BS_TARGET, ABILITY_PLUS, BattleScript_EffectMagneticFluxCheckStats + goto BattleScript_EffectMagneticFluxLoop +BattleScript_EffectMagneticFluxCheckStats: + jumpifstat BS_TARGET, CMP_LESS_THAN, STAT_DEF, 0xC, BattleScript_EffectMagneticFluxTryDef + jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPDEF, 0xC, BattleScript_EffectMagneticFluxLoop +BattleScript_EffectMagneticFluxTryDef: + jumpifbyte CMP_NOT_EQUAL, gBattleCommunication, 0x0, BattleScript_EffectMagneticFluxSkipAnim + attackanimation + waitanimation +BattleScript_EffectMagneticFluxSkipAnim: + setbyte sSTAT_ANIM_PLAYED, FALSE + playstatchangeanimation BS_TARGET, BIT_DEF | BIT_SPDEF, 0x0 + setstatchanger STAT_DEF, 1, FALSE + statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_EffectMagneticFluxTrySpDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_EffectMagneticFluxTrySpDef + addbyte gBattleCommunication, 0x1 + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_EffectMagneticFluxTrySpDef: + setstatchanger STAT_SPDEF, 1, FALSE + statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_EffectMagneticFluxLoop + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_EffectMagneticFluxLoop + addbyte gBattleCommunication, 0x1 + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_EffectMagneticFluxLoop: + jumpifbytenotequal gBattlerTarget, gBattlerAttacker, BattleScript_EffectMagneticFluxEnd + setallytonexttarget BattleScript_EffectMagneticFluxStart +BattleScript_EffectMagneticFluxEnd: + jumpifbyte CMP_NOT_EQUAL, gBattleCommunication, 0x0, BattleScript_MoveEnd + goto BattleScript_ButItFailed + +BattleScript_EffectGearUp:: + attackcanceler + attackstring + ppreduce + setbyte gBattleCommunication, 0x0 +BattleScript_EffectGearUpStart: + jumpifability BS_TARGET, ABILITY_MINUS, BattleScript_EffectGearUpCheckStats + jumpifability BS_TARGET, ABILITY_PLUS, BattleScript_EffectGearUpCheckStats + goto BattleScript_EffectGearUpLoop +BattleScript_EffectGearUpCheckStats: + jumpifstat BS_TARGET, CMP_LESS_THAN, STAT_ATK, 0xC, BattleScript_EffectGearUpTryAtk + jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPATK, 0xC, BattleScript_EffectGearUpLoop +BattleScript_EffectGearUpTryAtk: + jumpifbyte CMP_NOT_EQUAL, gBattleCommunication, 0x0, BattleScript_EffectGearUpSkipAnim + attackanimation + waitanimation +BattleScript_EffectGearUpSkipAnim: + setbyte sSTAT_ANIM_PLAYED, FALSE + playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, 0x0 + setstatchanger STAT_ATK, 1, FALSE + statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_EffectGearUpTrySpAtk + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_EffectGearUpTrySpAtk + addbyte gBattleCommunication, 0x1 + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_EffectGearUpTrySpAtk: + setstatchanger STAT_SPATK, 1, FALSE + statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_EffectGearUpLoop + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_EffectGearUpLoop + addbyte gBattleCommunication, 0x1 + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_EffectGearUpLoop: + jumpifbytenotequal gBattlerTarget, gBattlerAttacker, BattleScript_EffectGearUpEnd + setallytonexttarget BattleScript_EffectGearUpStart +BattleScript_EffectGearUpEnd: + jumpifbyte CMP_NOT_EQUAL, gBattleCommunication, 0x0, BattleScript_MoveEnd + goto BattleScript_ButItFailed + +BattleScript_EffectAcupressure: + attackcanceler + jumpifbyteequal gBattlerTarget, gBattlerAttacker, BattleScript_EffectAcupressureTry + jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_PrintMoveMissed +BattleScript_EffectAcupressureTry: + attackstring + ppreduce + tryaccupressure BS_TARGET, BattleScript_ButItFailed + attackanimation + waitanimation + setgraphicalstatchangevalues + playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + statbuffchange MOVE_EFFECT_CERTAIN, BattleScript_MoveEnd + printstring STRINGID_PKMNSSTATCHANGED2 + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_MoveEffectFeint:: + printstring STRINGID_FELLFORFEINT + waitmessage 0x40 + return + +BattleScript_EffectFeint: + setmoveeffect MOVE_EFFECT_FEINT + goto BattleScript_EffectHit + +BattleScript_EffectThirdType: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + trysetthirdtype BS_TARGET, BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_THIRDTYPEADDED + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectDefenseUp2Hit: + setmoveeffect MOVE_EFFECT_DEF_PLUS_2 | MOVE_EFFECT_AFFECTS_USER + goto BattleScript_EffectHit + +BattleScript_EffectFlowerShield: + attackcanceler + attackstring + ppreduce + selectfirstvalidtarget +BattleScript_FlowerShieldIsAnyGrass: + jumpiftype BS_TARGET, TYPE_GRASS, BattleScript_FlowerShieldLoopStart + jumpifnexttargetvalid BattleScript_FlowerShieldIsAnyGrass + goto BattleScript_ButItFailed +BattleScript_FlowerShieldLoopStart: + selectfirstvalidtarget +BattleScript_FlowerShieldLoop: + movevaluescleanup + jumpiftype BS_TARGET, TYPE_GRASS, BattleScript_FlowerShieldLoop2 + goto BattleScript_FlowerShieldMoveTargetEnd +BattleScript_FlowerShieldLoop2: + setstatchanger STAT_DEF, 1, FALSE + statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_FlowerShieldMoveTargetEnd + jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, 0x2, BattleScript_FlowerShieldDoAnim + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x3, BattleScript_FlowerShieldMoveTargetEnd + pause 0x15 + goto BattleScript_FlowerShieldString +BattleScript_FlowerShieldDoAnim: + attackanimation + waitanimation + setgraphicalstatchangevalues + playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 +BattleScript_FlowerShieldString: + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_FlowerShieldMoveTargetEnd: + moveendto MOVEEND_NEXT_TARGET + jumpifnexttargetvalid BattleScript_FlowerShieldLoop + end + +BattleScript_EffectRototiller: + attackcanceler + attackstring + ppreduce + selectfirstvalidtarget +BattleScript_RototillerLoop: + movevaluescleanup + jumpifnotgrounded BS_TARGET, BattleScript_RototillerNoEffect + jumpiftype BS_TARGET, TYPE_GRASS, BattleScript_RototillerLoop2 +BattleScript_RototillerNoEffect: + pause 0x20 + printstring STRINGID_NOEFFECTONTARGET + waitmessage 0x40 + goto BattleScript_RototillerMoveTargetEnd +BattleScript_RototillerLoop2: + jumpifstat BS_TARGET, CMP_LESS_THAN, STAT_ATK, 0xC, BattleScript_RototillerDoMoveAnim + jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPATK, 0xC, BattleScript_RototillerCantRaiseMultipleStats +BattleScript_RototillerDoMoveAnim:: + attackanimation + waitanimation + setbyte sSTAT_ANIM_PLAYED, FALSE + playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, 0x0 + setstatchanger STAT_ATK, 1, FALSE + statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_RototillerTrySpAtk + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_RototillerTrySpAtk + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_RototillerTrySpAtk:: + setstatchanger STAT_SPATK, 1, FALSE + statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_RototillerMoveTargetEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_RototillerMoveTargetEnd + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_RototillerMoveTargetEnd: + moveendto MOVEEND_NEXT_TARGET + jumpifnexttargetvalid BattleScript_RototillerLoop + end +BattleScript_RototillerCantRaiseMultipleStats: + printstring STRINGID_STATSWONTINCREASE2 + waitmessage 0x40 + goto BattleScript_RototillerMoveTargetEnd + +BattleScript_EffectBestow: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, NO_ACC_CALC_CHECK_LOCK_ON + attackstring + ppreduce + jumpifsubstituteblocks BattleScript_ButItFailed + trybestow BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_BESTOWITEMGIVING + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectAfterYou: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + tryafteryou BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_KINDOFFER + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectFlameBurst: + setmoveeffect MOVE_EFFECT_FLAME_BURST | MOVE_EFFECT_AFFECTS_USER + goto BattleScript_EffectHit + +BattleScript_MoveEffectFlameBurst:: + tryfaintmon BS_TARGET, FALSE, NULL + printstring STRINGID_BURSTINGFLAMESHIT + waitmessage 0x40 + savetarget + copybyte gBattlerTarget, sBATTLER + healthbarupdate BS_TARGET + datahpupdate BS_TARGET + tryfaintmon BS_TARGET, FALSE, NULL + restoretarget + goto BattleScript_MoveEnd + +BattleScript_EffectPowerTrick: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + powertrick BS_ATTACKER + attackanimation + waitanimation + printstring STRINGID_PKMNSWITCHEDATKANDDEF + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectPsychoShift: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + jumpifstatus BS_ATTACKER, STATUS1_ANY, BattleScript_EffectPsychoShiftCanWork + goto BattleScript_ButItFailed +BattleScript_EffectPsychoShiftCanWork: + jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed + jumpifsafeguard BattleScript_SafeguardProtected + trypsychoshift BattleScript_MoveEnd + attackanimation + waitanimation + copybyte gEffectBattler, gBattlerTarget + printfromtable gStatusConditionsStringIds + waitmessage 0x40 + statusanimation BS_TARGET + updatestatusicon BS_TARGET + curestatus BS_ATTACKER + printstring STRINGID_PKMNSTATUSNORMAL + waitmessage 0x40 + updatestatusicon BS_ATTACKER + goto BattleScript_MoveEnd + +BattleScript_EffectSynchronoise: + attackcanceler + attackstring + ppreduce + selectfirstvalidtarget +BattleScript_SynchronoiseLoop: + movevaluescleanup + jumpifcantusesynchronoise BattleScript_SynchronoiseNoEffect + accuracycheck BattleScript_SynchronoiseMissed, ACC_CURR_MOVE + critcalc + damagecalc + adjustdamage + attackanimation + waitanimation + effectivenesssound + hitanimation BS_TARGET + waitstate + healthbarupdate BS_TARGET + datahpupdate BS_TARGET + critmessage + waitmessage 0x40 + resultmessage + waitmessage 0x40 + printstring STRINGID_EMPTYSTRING3 + waitmessage 0x1 + tryfaintmon BS_TARGET, FALSE, NULL +BattleScript_SynchronoiseMoveTargetEnd: + moveendto MOVEEND_NEXT_TARGET + jumpifnexttargetvalid BattleScript_SynchronoiseLoop + end +BattleScript_SynchronoiseMissed: + pause 0x20 + resultmessage + waitmessage 0x40 + goto BattleScript_SynchronoiseMoveTargetEnd +BattleScript_SynchronoiseNoEffect: + pause 0x20 + printstring STRINGID_NOEFFECTONTARGET + waitmessage 0x40 + goto BattleScript_SynchronoiseMoveTargetEnd + +BattleScript_EffectSmackDown: + setmoveeffect MOVE_EFFECT_SMACK_DOWN + goto BattleScript_EffectHit + +BattleScript_MoveEffectSmackDown:: + printstring STRINGID_FELLSTRAIGHTDOWN + waitmessage 0x40 + return + +BattleScript_EffectHitEnemyHealAlly: + jumpiftargetally BattleScript_EffectHealPulse + goto BattleScript_EffectHit + +BattleScript_EffectDefog: + setstatchanger STAT_EVASION, 1, TRUE + attackcanceler + jumpifsubstituteblocks BattleScript_DefogIfCanClearHazards + jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_EVASION, 0x0, BattleScript_DefogWorks +BattleScript_DefogIfCanClearHazards: + defogclear BS_ATTACKER, FALSE, BattleScript_ButItFailedAtkStringPpReduce +BattleScript_DefogWorks: + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_DefogTryHazardsWithAnim + jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, 0x2, BattleScript_DefogDoAnim + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x3, BattleScript_DefogTryHazardsWithAnim + pause 0x20 + goto BattleScript_DefogPrintString +BattleScript_DefogDoAnim:: + attackanimation + waitanimation + setgraphicalstatchangevalues + playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 +BattleScript_DefogPrintString:: + printfromtable gStatDownStringIds + waitmessage 0x40 +BattleScript_DefogTryHazards:: + copybyte gEffectBattler, gBattlerAttacker + defogclear BS_ATTACKER, TRUE, NULL + copybyte gBattlerAttacker, gEffectBattler + goto BattleScript_MoveEnd +BattleScript_DefogTryHazardsWithAnim: + attackanimation + waitanimation + goto BattleScript_DefogTryHazards + +BattleScript_EffectCopycat: + attackcanceler + attackstring + pause 0x5 + trycopycat BattleScript_CopycatFail + attackanimation + waitanimation + jumptocalledmove TRUE +BattleScript_CopycatFail: + ppreduce + goto BattleScript_ButItFailed + +BattleScript_EffectInstruct: + attackcanceler + attackstring + ppreduce + pause 0x5 + tryinstruct BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_USEDINSTRUCTEDMOVE + waitmessage 0x40 + setbyte sB_ANIM_TURN, 0x0 + setbyte sB_ANIM_TARGETS_HIT, 0x0 + jumptocalledmove TRUE + +BattleScript_EffectAutotomize: + setstatchanger STAT_SPEED, 2, FALSE + attackcanceler + attackstring + ppreduce + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_AutotomizeWeightLoss + jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_AutotomizeAttackAnim + pause 0x20 + goto BattleScript_AutotomizePrintString +BattleScript_AutotomizeAttackAnim:: + attackanimation + waitanimation +BattleScript_AutotomizeDoAnim:: + setgraphicalstatchangevalues + playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 +BattleScript_AutotomizePrintString:: + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_AutotomizeWeightLoss:: + jumpifmovehadnoeffect BattleScript_MoveEnd + tryautotomize BS_ATTACKER, BattleScript_MoveEnd + printstring STRINGID_BECAMENIMBLE + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectFinalGambit: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + critcalc + typecalc + bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE + dmgtocurrattackerhp + adjustdamage + attackanimation + waitanimation + effectivenesssound + hitanimation BS_TARGET + waitstate + healthbarupdate BS_TARGET + datahpupdate BS_TARGET + critmessage + waitmessage 0x40 + resultmessage + waitmessage 0x40 + seteffectwithchance + tryfaintmon BS_TARGET, FALSE, NULL + jumpifmovehadnoeffect BattleScript_MoveEnd + healthbarupdate BS_ATTACKER + datahpupdate BS_ATTACKER + tryfaintmon BS_ATTACKER, FALSE, NULL + goto BattleScript_MoveEnd + +BattleScript_EffectHitSwitchTarget: + 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 + tryfaintmon BS_TARGET, FALSE, NULL + jumpifability BS_TARGET, ABILITY_SUCTION_CUPS, BattleScript_AbilityPreventsPhasingOut + jumpifstatus3 BS_TARGET, STATUS3_ROOTED, BattleScript_PrintMonIsRooted + tryhitswitchtarget BattleScript_EffectHitSwitchTargetMoveEnd +BattleScript_EffectHitSwitchTargetMoveEnd: + moveendall + end + +BattleScript_EffectClearSmog: + setmoveeffect MOVE_EFFECT_CLEAR_SMOG + goto BattleScript_EffectHit + +BattleScript_EffectToxicThread: + setstatchanger STAT_SPEED, 2, TRUE + attackcanceler + jumpifsubstituteblocks BattleScript_ButItFailedAtkStringPpReduce + jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_SPEED, 0x0, BattleScript_ToxicThreadWorks + jumpifstatus BS_TARGET, STATUS1_PSN_ANY, BattleScript_ButItFailedAtkStringPpReduce +BattleScript_ToxicThreadWorks: + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_ToxicThreadTryPsn + jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, 0x2, BattleScript_ToxicThreadDoAnim + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x3, BattleScript_ToxicThreadTryPsn + pause 0x20 + goto BattleScript_ToxicThreadPrintString +BattleScript_ToxicThreadDoAnim:: + attackanimation + waitanimation + setgraphicalstatchangevalues + playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 +BattleScript_ToxicThreadPrintString:: + printfromtable gStatDownStringIds + waitmessage 0x40 +BattleScript_ToxicThreadTryPsn:: + setmoveeffect MOVE_EFFECT_POISON + seteffectprimary + goto BattleScript_MoveEnd + +BattleScript_EffectVenomDrench: + attackcanceler + attackstring + ppreduce + jumpifstatus BS_TARGET, STATUS1_PSN_ANY, BattleScript_EffectVenomDrenchCanBeUsed + goto BattleScript_ButItFailed +BattleScript_EffectVenomDrenchCanBeUsed: + jumpifstat BS_TARGET, CMP_GREATER_THAN, STAT_ATK, 0x0, BattleScript_VenomDrenchDoMoveAnim + jumpifstat BS_TARGET, CMP_GREATER_THAN, STAT_SPATK, 0x0, BattleScript_VenomDrenchDoMoveAnim + jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPEED, 0x0, BattleScript_CantLowerMultipleStats +BattleScript_VenomDrenchDoMoveAnim:: + accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE + attackanimation + waitanimation + setbyte sSTAT_ANIM_PLAYED, FALSE + playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK | BIT_SPEED, STAT_CHANGE_NEGATIVE | STAT_CHANGE_ONLY_MULTIPLE + playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_NEGATIVE + setstatchanger STAT_ATK, 1, TRUE + statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_VenomDrenchTryLowerSpAtk + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_VenomDrenchTryLowerSpAtk + printfromtable gStatDownStringIds + waitmessage 0x40 +BattleScript_VenomDrenchTryLowerSpAtk:: + playstatchangeanimation BS_TARGET, BIT_SPATK, STAT_CHANGE_NEGATIVE + setstatchanger STAT_SPATK, 1, TRUE + statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_VenomDrenchTryLowerSpeed + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_VenomDrenchTryLowerSpeed + printfromtable gStatDownStringIds + waitmessage 0x40 +BattleScript_VenomDrenchTryLowerSpeed:: + playstatchangeanimation BS_TARGET, BIT_SPEED, STAT_CHANGE_NEGATIVE + setstatchanger STAT_SPEED, 1, TRUE + statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_VenomDrenchEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_VenomDrenchEnd + printfromtable gStatDownStringIds + waitmessage 0x40 +BattleScript_VenomDrenchEnd:: + goto BattleScript_MoveEnd + +BattleScript_EffectNobleRoar: + attackcanceler + attackstring + ppreduce + jumpifstat BS_TARGET, CMP_GREATER_THAN, STAT_ATK, 0x0, BattleScript_NobleRoarDoMoveAnim + jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPATK, 0x0, BattleScript_CantLowerMultipleStats +BattleScript_NobleRoarDoMoveAnim:: + accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE + attackanimation + waitanimation + setbyte sSTAT_ANIM_PLAYED, FALSE + playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_ONLY_MULTIPLE + playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_NEGATIVE + setstatchanger STAT_ATK, 1, TRUE + statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_NobleRoarTryLowerSpAtk + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_NobleRoarTryLowerSpAtk + printfromtable gStatDownStringIds + waitmessage 0x40 +BattleScript_NobleRoarTryLowerSpAtk:: + playstatchangeanimation BS_TARGET, BIT_SPATK, STAT_CHANGE_NEGATIVE + setstatchanger STAT_SPATK, 1, TRUE + statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_NobleRoarEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_NobleRoarEnd + printfromtable gStatDownStringIds + waitmessage 0x40 +BattleScript_NobleRoarEnd:: + goto BattleScript_MoveEnd + +BattleScript_EffectShellSmash: + attackcanceler + attackstring + ppreduce + jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, 0xC, BattleScript_ShellSmashTryDef + jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPATK, 0xC, BattleScript_ShellSmashTryDef + jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPEED, 0xC, BattleScript_ShellSmashTryDef + jumpifstat BS_ATTACKER, CMP_GREATER_THAN, STAT_DEF, 0, BattleScript_ShellSmashTryDef + jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPDEF, 0, BattleScript_ButItFailed +BattleScript_ShellSmashTryDef:: + attackanimation + waitanimation + setbyte sSTAT_ANIM_PLAYED, FALSE + playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_CANT_PREVENT + setstatchanger STAT_DEF, 1, TRUE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_ShellSmashTrySpDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_ShellSmashTrySpDef + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_ShellSmashTrySpDef: + setstatchanger STAT_SPDEF, 1, TRUE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_ShellSmashTryAttack + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_ShellSmashTryAttack + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_ShellSmashTryAttack: + setbyte sSTAT_ANIM_PLAYED, FALSE + playstatchangeanimation BS_ATTACKER, BIT_SPATK | BIT_ATK | BIT_SPEED, STAT_CHANGE_BY_TWO + setstatchanger STAT_ATK, 2, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_ShellSmashTrySpAtk + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_ShellSmashTrySpAtk + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_ShellSmashTrySpAtk: + setstatchanger STAT_SPATK, 2, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_ShellSmashTrySpeed + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_ShellSmashTrySpeed + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_ShellSmashTrySpeed: + setstatchanger STAT_SPEED, 2, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_ShellSmashEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_ShellSmashEnd + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_ShellSmashEnd: + goto BattleScript_MoveEnd + +BattleScript_EffectLastResort: + attackcanceler + attackstring + ppreduce + jumpifcantuselastresort BS_ATTACKER, BattleScript_ButItFailed + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + goto BattleScript_HitFromCritCalc + +BattleScript_EffectGrowth: + attackcanceler + attackstring + ppreduce + jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, 0xC, BattleScript_GrowthDoMoveAnim + jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPATK, 0xC, BattleScript_CantRaiseMultipleStats +BattleScript_GrowthDoMoveAnim:: + attackanimation + waitanimation + setbyte sSTAT_ANIM_PLAYED, FALSE + playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_SPATK, 0x0 + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_SUN_ANY, BattleScript_GrowthAtk2 + setstatchanger STAT_ATK, 1, FALSE + goto BattleScript_GrowthAtk +BattleScript_GrowthAtk2: + setstatchanger STAT_ATK, 2, FALSE +BattleScript_GrowthAtk: + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_GrowthTrySpAtk + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_GrowthTrySpAtk + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_GrowthTrySpAtk:: + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, WEATHER_SUN_ANY, BattleScript_GrowthSpAtk2 + setstatchanger STAT_SPATK, 1, FALSE + goto BattleScript_GrowthSpAtk +BattleScript_GrowthSpAtk2: + setstatchanger STAT_SPATK, 2, FALSE +BattleScript_GrowthSpAtk: + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_GrowthEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_GrowthEnd + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_GrowthEnd: + goto BattleScript_MoveEnd + +BattleScript_EffectSoak: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + jumpifability BS_TARGET, ABILITY_MULTITYPE, BattleScript_ButItFailed + jumpifability BS_TARGET, ABILITY_RKS_SYSTEM, BattleScript_ButItFailed + jumpifsubstituteblocks BattleScript_ButItFailed + attackanimation + waitanimation + trysoak BattleScript_ButItFailed + printstring STRINGID_TRANSFORMEDINTOWATERTYPE + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectReflectType: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + tryreflecttype BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_REFLECTTARGETSTYPE + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectElectrify: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + tryelectrify BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_TARGETELECTRIFIED + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectShiftGear: + attackcanceler + attackstring + ppreduce + jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPEED, 0xC, BattleScript_ShiftGearDoMoveAnim + jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_ATK, 0xC, BattleScript_CantRaiseMultipleStats +BattleScript_ShiftGearDoMoveAnim: + attackanimation + waitanimation + setbyte sSTAT_ANIM_PLAYED, FALSE + jumpifstat BS_ATTACKER, CMP_GREATER_THAN, STAT_SPEED, 0xA, BattleScript_ShiftGearSpeedBy1 + playstatchangeanimation BS_ATTACKER, BIT_SPEED | BIT_ATK, STAT_CHANGE_BY_TWO + setstatchanger STAT_SPEED, 2, FALSE + goto BattleScript_ShiftGearDoSpeed +BattleScript_ShiftGearSpeedBy1: + playstatchangeanimation BS_ATTACKER, BIT_SPEED | BIT_ATK, 0x0 + setstatchanger STAT_SPEED, 1, FALSE +BattleScript_ShiftGearDoSpeed: + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_ShiftGearTryAtk + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_ShiftGearTryAtk + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_ShiftGearTryAtk: + setstatchanger STAT_ATK, 1, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_ShiftGearEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_ShiftGearEnd + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_ShiftGearEnd: + goto BattleScript_MoveEnd + +BattleScript_EffectCoil: + attackcanceler + attackstring + ppreduce + jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, 0xC, BattleScript_CoilDoMoveAnim + jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_DEF, 0xC, BattleScript_CoilDoMoveAnim + jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_ACC, 0xC, BattleScript_CantRaiseMultipleStats +BattleScript_CoilDoMoveAnim: + attackanimation + waitanimation + setbyte sSTAT_ANIM_PLAYED, FALSE + playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_ACC, 0x0 + setstatchanger STAT_ATK, 1, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_CoilTryDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_CoilTryDef + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_CoilTryDef: + setstatchanger STAT_DEF, 1, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_CoilTryAcc + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_CoilTryAcc + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_CoilTryAcc: + setstatchanger STAT_ACC, 1, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_CoilEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_CoilEnd + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_CoilEnd: + goto BattleScript_MoveEnd + +BattleScript_EffectQuiverDance: + attackcanceler + attackstring + ppreduce + jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPATK, 0xC, BattleScript_QuiverDanceDoMoveAnim + jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPDEF, 0xC, BattleScript_QuiverDanceDoMoveAnim + jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPEED, 0xC, BattleScript_CantRaiseMultipleStats +BattleScript_QuiverDanceDoMoveAnim:: + attackanimation + waitanimation + setbyte sSTAT_ANIM_PLAYED, FALSE + playstatchangeanimation BS_ATTACKER, BIT_SPATK | BIT_SPDEF | BIT_SPEED, 0x0 + setstatchanger STAT_SPATK, 1, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_QuiverDanceTrySpDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_QuiverDanceTrySpDef + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_QuiverDanceTrySpDef:: + setstatchanger STAT_SPDEF, 1, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_QuiverDanceTrySpeed + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_QuiverDanceTrySpeed + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_QuiverDanceTrySpeed:: + setstatchanger STAT_SPEED, 1, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_QuiverDanceEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_QuiverDanceEnd + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_QuiverDanceEnd:: + goto BattleScript_MoveEnd + +BattleScript_EffectSpeedUpHit: + setmoveeffect MOVE_EFFECT_SPD_PLUS_1 | MOVE_EFFECT_AFFECTS_USER + goto BattleScript_EffectHit + +BattleScript_EffectMeFirst: + attackcanceler + attackstring + trymefirst BattleScript_ButItFailedPpReduce + attackanimation + waitanimation + setbyte sB_ANIM_TURN, 0x0 + setbyte sB_ANIM_TARGETS_HIT, 0x0 + jumptocalledmove TRUE + +BattleScript_EffectAttackSpAttackUp: + attackcanceler + attackstring + ppreduce + jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, 0xC, BattleScript_AttackSpAttackUpDoMoveAnim + jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPATK, 0xC, BattleScript_CantRaiseMultipleStats +BattleScript_AttackSpAttackUpDoMoveAnim:: + attackanimation + waitanimation + setbyte sSTAT_ANIM_PLAYED, FALSE + playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_SPATK, 0x0 + setstatchanger STAT_ATK, 1, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_AttackSpAttackUpTrySpAtk + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_AttackSpAttackUpTrySpAtk + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_AttackSpAttackUpTrySpAtk:: + setstatchanger STAT_SPATK, 1, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_AttackSpAttackUpEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_AttackSpAttackUpEnd + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_AttackSpAttackUpEnd: + goto BattleScript_MoveEnd + +BattleScript_EffectAttackAccUp: + attackcanceler + attackstring + ppreduce + jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, 0xC, BattleScript_AttackAccUpDoMoveAnim + jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_ACC, 0xC, BattleScript_CantRaiseMultipleStats +BattleScript_AttackAccUpDoMoveAnim:: + attackanimation + waitanimation + setbyte sSTAT_ANIM_PLAYED, FALSE + playstatchangeanimation BS_ATTACKER, BIT_SPATK | BIT_SPDEF, 0x0 + setstatchanger STAT_ATK, 1, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_AttackAccUpTrySpDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_AttackAccUpTrySpDef + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_AttackAccUpTrySpDef:: + setstatchanger STAT_ACC, 1, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_AttackAccUpEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_AttackAccUpEnd + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_AttackAccUpEnd: + goto BattleScript_MoveEnd + +BattleScript_EffectMistyTerrain: +BattleScript_EffectGrassyTerrain: +BattleScript_EffectElectricTerrain: +BattleScript_EffectPsychicTerrain: + attackcanceler + attackstring + ppreduce + setterrain BattleScript_ButItFailed + attackanimation + waitanimation + printfromtable gTerrainStringIds + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectTopsyTurvy: + attackcanceler + attackstring + ppreduce + accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON + jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_ATK, 6, BattleScript_EffectTopsyTurvyWorks + jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_DEF, 6, BattleScript_EffectTopsyTurvyWorks + jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_SPATK, 6, BattleScript_EffectTopsyTurvyWorks + jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_SPDEF, 6, BattleScript_EffectTopsyTurvyWorks + jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_SPEED, 6, BattleScript_EffectTopsyTurvyWorks + jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_ACC, 6, BattleScript_EffectTopsyTurvyWorks + jumpifstat BS_TARGET, CMP_EQUAL, STAT_EVASION, 6, BattleScript_ButItFailed +BattleScript_EffectTopsyTurvyWorks: + attackanimation + waitanimation + invertstatstages BS_TARGET + printstring STRINGID_TOPSYTURVYSWITCHEDSTATS + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectIonDeluge: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + orword gFieldStatuses, STATUS_FIELD_ION_DELUGE + attackanimation + waitanimation + printstring STRINGID_IONDELUGEON + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectQuash: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + tryquash BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_QUASHSUCCESS + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectHealPulse: + attackcanceler + attackstring + ppreduce + accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON + jumpifsubstituteblocks BattleScript_ButItFailed + tryhealpulse BS_TARGET, BattleScript_AlreadyAtFullHp + attackanimation + waitanimation + healthbarupdate BS_TARGET + datahpupdate BS_TARGET + printstring STRINGID_PKMNREGAINEDHEALTH + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectEntrainment: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + tryentrainment BattleScript_ButItFailed + attackanimation + waitanimation + setlastusedability BS_TARGET + printstring STRINGID_PKMNACQUIREDABILITY + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectSimpleBeam: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + setabilitysimple BS_TARGET, BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_PKMNACQUIREDSIMPLE + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectSuckerPunch: + attackcanceler + suckerpunchcheck BattleScript_ButItFailedAtkStringPpReduce + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + goto BattleScript_HitFromAtkString + +BattleScript_EffectLuckyChant: + attackcanceler + attackstring + ppreduce + setluckychant BS_ATTACKER, BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_SHIELDEDFROMCRITICALHITS + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectMetalBurst: + attackcanceler + metalburstdamagecalculator BattleScript_ButItFailedAtkStringPpReduce + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + typecalc + bichalfword gMoveResultFlags, MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE + adjustdamage + goto BattleScript_HitFromAtkAnimation + +BattleScript_EffectHealingWish: + attackcanceler + jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_ButItFailedAtkStringPpReduce + attackstring + ppreduce + attackanimation + waitanimation + instanthpdrop BS_ATTACKER + setatkhptozero + tryfaintmon BS_ATTACKER, FALSE, NULL + openpartyscreen 0x1, BattleScript_EffectHealingWishEnd + switchoutabilities BS_ATTACKER + waitstate + switchhandleorder BS_ATTACKER, 0x2 + returnatktoball + getswitchedmondata BS_ATTACKER + switchindataupdate BS_ATTACKER + hpthresholds BS_ATTACKER + printstring STRINGID_SWITCHINMON + switchinanim BS_ATTACKER, TRUE + waitstate + setbyte cMULTISTRING_CHOOSER 0 + jumpifnotchosenmove MOVE_LUNAR_DANCE BattleScript_EffectHealingWishNewMon + setbyte cMULTISTRING_CHOOSER 1 + restorepp BS_ATTACKER +BattleScript_EffectHealingWishNewMon: + printfromtable gHealingWishStringIds + waitmessage 0x40 + playanimation BS_ATTACKER, B_ANIM_WISH_HEAL, NULL + waitanimation + dmgtomaxattackerhp + manipulatedamage DMG_CHANGE_SIGN + healthbarupdate BS_ATTACKER + datahpupdate BS_ATTACKER + clearstatus BS_ATTACKER + waitstate + updatestatusicon BS_ATTACKER + waitstate + printstring STRINGID_HEALINGWISHHEALED + waitmessage 0x40 + switchineffects BS_ATTACKER +BattleScript_EffectHealingWishEnd: + moveendall + end + +BattleScript_EffectWorrySeed: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + tryworryseed BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_PKMNACQUIREDABILITY + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectPowerSplit: + attackcanceler + attackstring + ppreduce + accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON + averagestats STAT_ATK + averagestats STAT_SPATK + attackanimation + waitanimation + printstring STRINGID_SHAREDITSPOWER + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectGuardSplit: + attackcanceler + attackstring + ppreduce + accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON + averagestats STAT_DEF + averagestats STAT_SPDEF + attackanimation + waitanimation + printstring STRINGID_SHAREDITSGUARD + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectHeartSwap: + attackcanceler + attackstring + ppreduce + accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON + swapstatstages STAT_ATK + swapstatstages STAT_DEF + swapstatstages STAT_SPEED + swapstatstages STAT_SPATK + swapstatstages STAT_SPDEF + swapstatstages STAT_EVASION + swapstatstages STAT_ACC + attackanimation + waitanimation + printstring STRINGID_PKMNSWITCHEDSTATCHANGES + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectPowerSwap: + attackcanceler + attackstring + ppreduce + accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON + swapstatstages STAT_ATK + swapstatstages STAT_SPATK + attackanimation + waitanimation + printstring STRINGID_PKMNSWITCHEDSTATCHANGES + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectGuardSwap: + attackcanceler + attackstring + ppreduce + accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON + swapstatstages STAT_DEF + swapstatstages STAT_SPDEF + attackanimation + waitanimation + printstring STRINGID_PKMNSWITCHEDSTATCHANGES + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectSpeedSwap: + attackcanceler + attackstring + ppreduce + accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON + swapstatstages STAT_SPEED + attackanimation + waitanimation + printstring STRINGID_PKMNSWITCHEDSTATCHANGES + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectTelekinesis: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, NO_ACC_CALC_CHECK_LOCK_ON + attackstring + ppreduce + settelekinesis BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_PKMNIDENTIFIED + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectStealthRock: + attackcanceler + attackstring + ppreduce + setstealthrock BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_POINTEDSTONESFLOAT + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectStickyWeb: + attackcanceler + attackstring + ppreduce + setstickyweb BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_STICKYWEBUSED + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectGastroAcid: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + setgastroacid BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_PKMNSABILITYSUPPRESSED + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectToxicSpikes: + attackcanceler + attackstring + ppreduce + settoxicspikes BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_POISONSPIKESSCATTERED + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectMagnetRise: + attackcanceler + attackstring + ppreduce + setuserstatus3 STATUS3_MAGNET_RISE, BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_PKMNLEVITATEDONELECTROMAGNETISM + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectTrickRoom: +BattleScript_EffectWonderRoom: +BattleScript_EffectMagicRoom: + attackcanceler + attackstring + ppreduce + setroom + attackanimation + waitanimation + printfromtable gRoomsStringIds + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectAquaRing: + attackcanceler + attackstring + ppreduce + setuserstatus3 STATUS3_AQUA_RING, BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_PKMNSURROUNDEDWITHVEILOFWATER + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectEmbargo: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + setembargo BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_PKMNCANTUSEITEMSANYMORE + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectTailwind: + attackcanceler + attackstring + ppreduce + settailwind BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_TAILWINDBLEW + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectMircleEye: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + setmiracleeye BattleScript_ButItFailed + goto BattleScript_IdentifiedFoe + +BattleScript_EffectGravity: + attackcanceler + attackstring + ppreduce + setgravity BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_GRAVITYINTENSIFIED + waitmessage 0x40 + selectfirstvalidtarget +BattleScript_GravityLoop: + movevaluescleanup + jumpifstatus3 BS_TARGET, STATUS3_ON_AIR | STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS, BattleScript_GravityLoopDrop + goto BattleScript_GravityLoopEnd +BattleScript_GravityLoopDrop: + bringdownairbornebattler BS_TARGET + printstring STRINGID_GRAVITYGROUNDING + waitmessage 0x40 +BattleScript_GravityLoopEnd: + moveendto MOVEEND_NEXT_TARGET + jumpifnexttargetvalid BattleScript_GravityLoop + end + +BattleScript_EffectRoost: + attackcanceler + attackstring + ppreduce + tryhealhalfhealth BattleScript_AlreadyAtFullHp, BS_TARGET + setroost + goto BattleScript_PresentHealTarget + +BattleScript_EffectCaptivate: + setstatchanger STAT_SPATK, 2, TRUE + attackcanceler + jumpifsubstituteblocks BattleScript_ButItFailedAtkStringPpReduce + jumpifoppositegenders BattleScript_CaptivateCheckAcc + goto BattleScript_ButItFailedAtkStringPpReduce +BattleScript_CaptivateCheckAcc: + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + goto BattleScript_StatDownFromAttackString + +BattleScript_EffectHealBlock: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects + sethealblock BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_PKMNPREVENTEDFROMHEALING + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_EffectThroatChop: + jumpifsubstituteblocks BattleScript_EffectHit + setmoveeffect MOVE_EFFECT_THROAT_CHOP | MOVE_EFFECT_CERTAIN + goto BattleScript_EffectHit + +BattleScript_EffectHitEscape: + 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 + jumpifmovehadnoeffect BattleScript_MoveEnd + seteffectwithchance + tryfaintmon BS_TARGET, FALSE, NULL + moveendto MOVEEND_ATTACKER_VISIBLE + moveendfrom MOVEEND_TARGET_VISIBLE + jumpifbattleend BattleScript_HitEscapeEnd + jumpifbyte CMP_NOT_EQUAL gBattleOutcome 0, BattleScript_HitEscapeEnd + jumpifbattletype BATTLE_TYPE_ARENA, BattleScript_HitEscapeEnd + jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_HitEscapeEnd + openpartyscreen BS_ATTACKER, BattleScript_HitEscapeEnd + switchoutabilities BS_ATTACKER + waitstate + switchhandleorder BS_ATTACKER, 0x2 + returntoball BS_ATTACKER + getswitchedmondata BS_ATTACKER + switchindataupdate BS_ATTACKER + hpthresholds BS_ATTACKER + printstring STRINGID_SWITCHINMON + switchinanim BS_ATTACKER, TRUE + waitstate + switchineffects BS_ATTACKER +BattleScript_HitEscapeEnd: + end + +BattleScript_EffectPlaceholder: + attackcanceler + attackstring + ppreduce + pause 0x5 + printstring STRINGID_NOTDONEYET + goto BattleScript_MoveEnd + +BattleScript_EffectStompingTantrum: +BattleScript_EffectEvasionDownHit: +BattleScript_EffectVitalThrow: +BattleScript_EffectFalseSwipe: +BattleScript_EffectAlwaysCrit: +BattleScript_EffectPursuit: +BattleScript_EffectFellStinger: BattleScript_EffectHit:: - jumpifnotmove MOVE_SURF, BattleScript_HitFromAtkCanceler - jumpifnostatus3 BS_TARGET, STATUS3_UNDERWATER, BattleScript_HitFromAtkCanceler - orword gHitMarker, HITMARKER_IGNORE_UNDERWATER - setbyte sDMG_MULTIPLIER, 0x2 +BattleScript_EffectLowKick: +BattleScript_EffectFlail: +BattleScript_EffectFacade: +BattleScript_EffectRevenge: +BattleScript_EffectReturn: +BattleScript_EffectFrustration: +BattleScript_EffectEruption: +BattleScript_EffectPledge: +BattleScript_EffectFling: +BattleScript_EffectWringOut: +BattleScript_EffectHex: +BattleScript_EffectAssurance: +BattleScript_EffectTrump_card: +BattleScript_EffectAcrobatics: +BattleScript_EffectHeatCrash: +BattleScript_EffectPunishment: +BattleScript_EffectStoredPower: +BattleScript_EffectElectroBall: +BattleScript_EffectGyroBall: +BattleScript_EffectEchoedVoice: +BattleScript_EffectPayback: +BattleScript_EffectRound: +BattleScript_EffectBrine: +BattleScript_EffectVenoshock: +BattleScript_EffectRetalitate: +BattleScript_EffectFoulPlay: +BattleScript_EffectPsyshock: +BattleScript_EffectWeatherBall: +BattleScript_EffectHiddenPower: +BattleScript_EffectTwoTypedMove: +BattleScript_EffectTechnoBlast: +BattleScript_EffectJudgment: +BattleScript_EffectFusionCombo: +BattleScript_EffectRevelationDance: +BattleScript_EffectBelch: + BattleScript_HitFromAtkCanceler:: attackcanceler BattleScript_HitFromAccCheck:: @@ -267,8 +2061,7 @@ BattleScript_HitFromAtkString:: BattleScript_HitFromCritCalc:: critcalc damagecalc - typecalc - adjustnormaldamage + adjustdamage BattleScript_HitFromAtkAnimation:: attackanimation waitanimation @@ -287,8 +2080,38 @@ BattleScript_MoveEnd:: moveendall end +BattleScript_EffectNaturalGift: + attackcanceler + attackstring + ppreduce + jumpifnotberry BS_ATTACKER, BattleScript_ButItFailed + jumpifword CMP_COMMON_BITS, gFieldStatuses, STATUS_FIELD_MAGIC_ROOM, BattleScript_ButItFailed + jumpifability BS_ATTACKER, ABILITY_KLUTZ, BattleScript_ButItFailed + jumpifstatus3 BS_ATTACKER, STATUS3_EMBARGO, BattleScript_ButItFailed + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + critcalc + damagecalc + adjustdamage + attackanimation + waitanimation + effectivenesssound + hitanimation BS_TARGET + waitstate + healthbarupdate BS_TARGET + datahpupdate BS_TARGET + critmessage + waitmessage 0x40 + resultmessage + waitmessage 0x40 + seteffectwithchance + jumpifmovehadnoeffect BattleScript_EffectNaturalGiftEnd + removeitem BS_ATTACKER +BattleScript_EffectNaturalGiftEnd: + tryfaintmon BS_TARGET, FALSE, NULL + goto BattleScript_MoveEnd + BattleScript_MakeMoveMissed:: - orbyte gMoveResultFlags, MOVE_RESULT_MISSED + orhalfword gMoveResultFlags, MOVE_RESULT_MISSED BattleScript_PrintMoveMissed:: attackstring ppreduce @@ -304,18 +2127,71 @@ BattleScript_EffectSleep:: attackcanceler attackstring ppreduce - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + jumpifsubstituteblocks BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_AlreadyAsleep jumpifcantmakeasleep BattleScript_CantMakeAsleep + jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects + jumpifflowerveil BattleScript_FlowerVeilProtects + jumpifability BS_TARGET_SIDE, ABILITY_SWEET_VEIL, BattleScript_SweetVeilProtects + jumpifleafguard BattleScript_LeafGuardProtects + jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE - jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected + jumpifsafeguard BattleScript_SafeguardProtected attackanimation waitanimation setmoveeffect MOVE_EFFECT_SLEEP seteffectprimary goto BattleScript_MoveEnd +BattleScript_FlowerVeilProtectsRet:: + pause 0x20 + call BattleScript_AbilityPopUp + printstring STRINGID_FLOWERVEILPROTECTED + waitmessage 0x40 + return + +BattleScript_FlowerVeilProtects: + call BattleScript_FlowerVeilProtectsRet + orhalfword gMoveResultFlags, MOVE_RESULT_FAILED + goto BattleScript_MoveEnd + +BattleScript_SweetVeilProtectsRet:: + pause 0x20 + call BattleScript_AbilityPopUp + printstring STRINGID_FLOWERVEILPROTECTED + waitmessage 0x40 + return + +BattleScript_SweetVeilProtects: + call BattleScript_SweetVeilProtectsRet + orhalfword gMoveResultFlags, MOVE_RESULT_FAILED + goto BattleScript_MoveEnd + +BattleScript_AromaVeilProtectsRet:: + pause 0x20 + call BattleScript_AbilityPopUp + printstring STRINGID_AROMAVEILPROTECTED + waitmessage 0x40 + return + +BattleScript_AromaVeilProtects: + call BattleScript_AromaVeilProtectsRet + orhalfword gMoveResultFlags, MOVE_RESULT_FAILED + goto BattleScript_MoveEnd + +BattleScript_LeafGuardProtectsRet:: + pause 0x20 + call BattleScript_AbilityPopUp + printstring STRINGID_ITDOESNTAFFECT + waitmessage 0x40 + return + +BattleScript_LeafGuardProtects: + call BattleScript_LeafGuardProtectsRet + orhalfword gMoveResultFlags, MOVE_RESULT_FAILED + goto BattleScript_MoveEnd + BattleScript_AlreadyAsleep:: setalreadystatusedmoveattempt BS_ATTACKER pause 0x20 @@ -335,8 +2211,7 @@ BattleScript_CantMakeAsleep:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectPoisonHit:: -BattleScript_EffectPoisonTail:: +BattleScript_EffectPoisonHit: setmoveeffect MOVE_EFFECT_POISON goto BattleScript_EffectHit @@ -347,8 +2222,7 @@ BattleScript_EffectAbsorb:: ppreduce critcalc damagecalc - typecalc - adjustnormaldamage + adjustdamage attackanimation waitanimation effectivenesssound @@ -360,12 +2234,14 @@ BattleScript_EffectAbsorb:: waitmessage 0x40 resultmessage waitmessage 0x40 - negativedamage + setdrainedhp orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE jumpifability BS_TARGET, ABILITY_LIQUID_OOZE, BattleScript_AbsorbLiquidOoze setbyte cMULTISTRING_CHOOSER, 0x0 goto BattleScript_AbsorbUpdateHp BattleScript_AbsorbLiquidOoze:: + copybyte gBattlerAbility, gBattlerTarget + call BattleScript_AbilityPopUp manipulatedamage DMG_CHANGE_SIGN setbyte cMULTISTRING_CHOOSER, 0x1 BattleScript_AbsorbUpdateHp:: @@ -381,9 +2257,11 @@ BattleScript_AbsorbTryFainting:: BattleScript_EffectBurnHit:: BattleScript_EffectBlazeKick:: +BattleScript_EffectScald: setmoveeffect MOVE_EFFECT_BURN goto BattleScript_EffectHit +BattleScript_EffectFreezeDry: BattleScript_EffectFreezeHit:: setmoveeffect MOVE_EFFECT_FREEZE goto BattleScript_EffectHit @@ -409,8 +2287,7 @@ BattleScript_ExplosionLoop: movevaluescleanup critcalc damagecalc - typecalc - adjustnormaldamage + adjustdamage accuracycheck BattleScript_ExplosionMissed, ACC_CURR_MOVE effectivenesssound hitanimation BS_TARGET @@ -425,6 +2302,7 @@ BattleScript_ExplosionLoop: moveendto MOVEEND_NEXT_TARGET jumpifnexttargetvalid BattleScript_ExplosionLoop tryfaintmon BS_ATTACKER, FALSE, NULL + moveendcase MOVEEND_CLEAR_BITS end BattleScript_ExplosionMissed: effectivenesssound @@ -435,17 +2313,31 @@ BattleScript_ExplosionMissed: tryfaintmon BS_ATTACKER, FALSE, NULL end +BattleScript_EffectMindBlown:: + attackcanceler + attackstring + ppreduce + faintifabilitynotdamp + dmg_1_2_attackerhp + healthbarupdate BS_ATTACKER + datahpupdate BS_ATTACKER + waitstate + jumpifbyte CMP_NO_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_MISSED, BattleScript_ExplosionDoAnimStartLoop + call BattleScript_PreserveMissedBitDoMoveAnim + goto BattleScript_ExplosionLoop + BattleScript_PreserveMissedBitDoMoveAnim: - bicbyte gMoveResultFlags, MOVE_RESULT_MISSED + bichalfword gMoveResultFlags, MOVE_RESULT_MISSED attackanimation waitanimation - orbyte gMoveResultFlags, MOVE_RESULT_MISSED + orhalfword gMoveResultFlags, MOVE_RESULT_MISSED return BattleScript_EffectDreamEater:: attackcanceler - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_DreamEaterNoEffect + jumpifsubstituteblocks BattleScript_DreamEaterNoEffect jumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_DreamEaterWorked + jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_DreamEaterWorked BattleScript_DreamEaterNoEffect: attackstring ppreduce @@ -457,8 +2349,7 @@ BattleScript_DreamEaterWorked: ppreduce critcalc damagecalc - typecalc - adjustnormaldamage + adjustdamage attackanimation waitanimation effectivenesssound @@ -470,7 +2361,7 @@ BattleScript_DreamEaterWorked: waitmessage 0x40 resultmessage waitmessage 0x40 - negativedamage + setdrainedhp orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER @@ -487,7 +2378,7 @@ BattleScript_EffectMirrorMove:: pause 0x40 trymirrormove ppreduce - orbyte gMoveResultFlags, MOVE_RESULT_FAILED + orhalfword gMoveResultFlags, MOVE_RESULT_FAILED printstring STRINGID_MIRRORMOVEFAILED waitmessage 0x40 goto BattleScript_MoveEnd @@ -504,6 +2395,18 @@ BattleScript_EffectSpecialAttackUp:: setstatchanger STAT_SPATK, 1, FALSE goto BattleScript_EffectStatUp +BattleScript_EffectSpeedUp: + setstatchanger STAT_SPEED, 1, FALSE + goto BattleScript_EffectStatUp + +BattleScript_EffectSpecialDefenseUp: + setstatchanger STAT_SPDEF, 1, FALSE + goto BattleScript_EffectStatUp + +BattleScript_EffectAccuracyUp: + setstatchanger STAT_ACC, 1, FALSE + goto BattleScript_EffectStatUp + BattleScript_EffectEvasionUp:: setstatchanger STAT_EVASION, 1, FALSE BattleScript_EffectStatUp:: @@ -529,32 +2432,42 @@ BattleScript_StatUpEnd:: BattleScript_StatUp:: playanimation BS_EFFECT_BATTLER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 +BattleScript_StatUpMsg:: printfromtable gStatUpStringIds waitmessage 0x40 return -BattleScript_EffectAttackDown:: +BattleScript_EffectAttackDown: setstatchanger STAT_ATK, 1, TRUE goto BattleScript_EffectStatDown -BattleScript_EffectDefenseDown:: +BattleScript_EffectDefenseDown: setstatchanger STAT_DEF, 1, TRUE goto BattleScript_EffectStatDown -BattleScript_EffectSpeedDown:: +BattleScript_EffectSpeedDown: setstatchanger STAT_SPEED, 1, TRUE goto BattleScript_EffectStatDown -BattleScript_EffectAccuracyDown:: +BattleScript_EffectAccuracyDown: setstatchanger STAT_ACC, 1, TRUE goto BattleScript_EffectStatDown -BattleScript_EffectEvasionDown:: +BattleScript_EffectSpecialAttackDown: + setstatchanger STAT_SPATK, 1, TRUE + goto BattleScript_EffectStatDown + +BattleScript_EffectSpecialDefenseDown: + setstatchanger STAT_SPDEF, 1, TRUE + goto BattleScript_EffectStatDown + +BattleScript_EffectEvasionDown: setstatchanger STAT_EVASION, 1, TRUE -BattleScript_EffectStatDown:: +BattleScript_EffectStatDown: attackcanceler - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailedAtkStringPpReduce + jumpifsubstituteblocks BattleScript_ButItFailedAtkStringPpReduce accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE +BattleScript_StatDownFromAttackString: attackstring ppreduce statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_StatDownEnd @@ -614,11 +2527,13 @@ BattleScript_EffectRoar:: attackcanceler attackstring ppreduce + jumpifroarfails BattleScript_ButItFailed jumpifability BS_TARGET, ABILITY_SUCTION_CUPS, BattleScript_AbilityPreventsPhasingOut jumpifstatus3 BS_TARGET, STATUS3_ROOTED, BattleScript_PrintMonIsRooted accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE jumpifbattletype BATTLE_TYPE_ARENA, BattleScript_ButItFailed +BattleScript_ForceRandomSwitch:: forcerandomswitch BattleScript_ButItFailed BattleScript_EffectMultiHit:: @@ -628,7 +2543,7 @@ BattleScript_EffectMultiHit:: ppreduce setmultihitcounter 0x0 initmultihitstring - setbyte sMULTIHIT_EFFECT, 0x0 + sethword sMULTIHIT_EFFECT, 0x0 BattleScript_MultiHitLoop:: jumpifhasnohp BS_ATTACKER, BattleScript_MultiHitEnd jumpifhasnohp BS_TARGET, BattleScript_MultiHitPrintStrings @@ -636,12 +2551,11 @@ BattleScript_MultiHitLoop:: jumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_MultiHitPrintStrings BattleScript_DoMultiHit:: movevaluescleanup - copybyte cEFFECT_CHOOSER, sMULTIHIT_EFFECT + copyhword sMOVE_EFFECT, sMULTIHIT_EFFECT critcalc damagecalc - typecalc jumpifmovehadnoeffect BattleScript_MultiHitNoMoreHits - adjustnormaldamage + adjustdamage attackanimation waitanimation effectivenesssound @@ -651,6 +2565,7 @@ BattleScript_DoMultiHit:: datahpupdate BS_TARGET critmessage waitmessage 0x40 + multihitresultmessage printstring STRINGID_EMPTYSTRING3 waitmessage 0x1 addbyte sMULTIHIT_STRING + 4, 0x1 @@ -671,7 +2586,7 @@ BattleScript_MultiHitEnd:: seteffectwithchance tryfaintmon BS_TARGET, FALSE, NULL moveendcase MOVEEND_SYNCHRONIZE_TARGET - moveendfrom MOVEEND_IMMUNITY_ABILITIES + moveendfrom MOVEEND_STATUS_IMMUNITY_ABILITIES end BattleScript_EffectConversion:: @@ -689,6 +2604,31 @@ BattleScript_EffectFlinchHit:: setmoveeffect MOVE_EFFECT_FLINCH goto BattleScript_EffectHit +BattleScript_EffectFlinchWithStatus: + setmoveeffect MOVE_EFFECT_FLINCH + 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 + seteffectwithchance + argumentstatuseffect + tryfaintmon BS_TARGET, FALSE, NULL + goto BattleScript_MoveEnd + BattleScript_EffectRestoreHp:: attackcanceler attackstring @@ -696,6 +2636,7 @@ BattleScript_EffectRestoreHp:: tryhealhalfhealth BattleScript_AlreadyAtFullHp, BS_ATTACKER attackanimation waitanimation +BattleScript_RestoreHp: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER @@ -708,14 +2649,16 @@ BattleScript_EffectToxic:: attackstring ppreduce jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed - jumpifstatus BS_TARGET, STATUS1_POISON, BattleScript_AlreadyPoisoned - jumpifstatus BS_TARGET, STATUS1_TOXIC_POISON, BattleScript_AlreadyPoisoned + jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects + jumpifflowerveil BattleScript_FlowerVeilProtects + jumpifleafguard BattleScript_LeafGuardProtects + jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects + jumpifsubstituteblocks BattleScript_ButItFailed + jumpifstatus BS_TARGET, STATUS1_POISON | STATUS1_TOXIC_POISON, BattleScript_AlreadyPoisoned jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed - jumpiftype BS_TARGET, TYPE_POISON, BattleScript_NotAffected - jumpiftype BS_TARGET, TYPE_STEEL, BattleScript_NotAffected + trypoisontype BS_ATTACKER, BS_TARGET, BattleScript_NotAffected accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE - jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected + jumpifsafeguard BattleScript_SafeguardProtected attackanimation waitanimation setmoveeffect MOVE_EFFECT_TOXIC @@ -741,6 +2684,13 @@ BattleScript_EffectPayDay:: setmoveeffect MOVE_EFFECT_PAYDAY goto BattleScript_EffectHit +BattleScript_EffectAuroraVeil: + attackcanceler + attackstring + ppreduce + setauroraveil BS_ATTACKER + goto BattleScript_PrintReflectLightScreenSafeguardString + BattleScript_EffectLightScreen:: attackcanceler attackstring @@ -757,6 +2707,7 @@ BattleScript_EffectRest:: attackstring ppreduce jumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_RestIsAlreadyAsleep + jumpifability BS_ATTACKER, ABILITY_COMATOSE, BattleScript_RestIsAlreadyAsleep jumpifcantmakeasleep BattleScript_RestCantSleep trysetrest BattleScript_AlreadyAtFullHp pause 0x20 @@ -795,21 +2746,13 @@ BattleScript_KOFail:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectRazorWind:: - jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_TwoTurnMovesSecondTurn - jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING, BattleScript_TwoTurnMovesSecondTurn - setbyte sTWOTURN_STRINGID, 0 - call BattleScriptFirstChargingTurn - goto BattleScript_MoveEnd - BattleScript_TwoTurnMovesSecondTurn:: attackcanceler setmoveeffect MOVE_EFFECT_CHARGING setbyte sB_ANIM_TURN, 0x1 clearstatusfromeffect BS_ATTACKER orword gHitMarker, HITMARKER_NO_PPDEDUCT - jumpifnotmove MOVE_SKY_ATTACK, BattleScript_HitFromAccCheck - setmoveeffect MOVE_EFFECT_FLINCH + argumenttomoveeffect goto BattleScript_HitFromAccCheck BattleScriptFirstChargingTurn:: @@ -832,7 +2775,7 @@ BattleScript_EffectSuperFang:: attackstring ppreduce typecalc - bicbyte gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE + bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE damagetohalftargethp goto BattleScript_HitFromAtkAnimation @@ -842,17 +2785,12 @@ BattleScript_EffectDragonRage:: attackstring ppreduce typecalc - bicbyte gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE + bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE setword gBattleMoveDamage, 40 - adjustsetdamage + adjustdamage goto BattleScript_HitFromAtkAnimation BattleScript_EffectTrap:: - jumpifnotmove MOVE_WHIRLPOOL, BattleScript_DoWrapEffect - jumpifnostatus3 BS_TARGET, STATUS3_UNDERWATER, BattleScript_DoWrapEffect - orword gHitMarker, HITMARKER_IGNORE_UNDERWATER - setbyte sDMG_MULTIPLIER, 0x2 -BattleScript_DoWrapEffect:: setmoveeffect MOVE_EFFECT_WRAP goto BattleScript_EffectHit @@ -863,7 +2801,7 @@ BattleScript_EffectDoubleHit:: ppreduce setmultihitcounter 0x2 initmultihitstring - setbyte sMULTIHIT_EFFECT, 0x0 + sethword sMULTIHIT_EFFECT, 0x0 goto BattleScript_MultiHitLoop BattleScript_EffectRecoilIfMiss:: @@ -871,6 +2809,7 @@ BattleScript_EffectRecoilIfMiss:: accuracycheck BattleScript_MoveMissedDoDamage, ACC_CURR_MOVE goto BattleScript_HitFromAtkString BattleScript_MoveMissedDoDamage:: + jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_PrintMoveMissed attackstring ppreduce pause 0x40 @@ -881,14 +2820,14 @@ BattleScript_MoveMissedDoDamage:: waitmessage 0x40 damagecalc typecalc - adjustnormaldamage + adjustdamage manipulatedamage DMG_RECOIL_FROM_MISS - bicbyte gMoveResultFlags, MOVE_RESULT_MISSED + bichalfword gMoveResultFlags, MOVE_RESULT_MISSED orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER tryfaintmon BS_ATTACKER, FALSE, NULL - orbyte gMoveResultFlags, MOVE_RESULT_MISSED + orhalfword gMoveResultFlags, MOVE_RESULT_MISSED goto BattleScript_MoveEnd BattleScript_EffectMist:: @@ -902,7 +2841,7 @@ BattleScript_EffectMist:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectFocusEnergy:: +BattleScript_EffectFocusEnergy: attackcanceler attackstring ppreduce @@ -914,21 +2853,15 @@ BattleScript_EffectFocusEnergy:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectRecoil:: - setmoveeffect MOVE_EFFECT_RECOIL_25 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN - jumpifnotmove MOVE_STRUGGLE, BattleScript_EffectHit - incrementgamestat GAME_STAT_USED_STRUGGLE - goto BattleScript_EffectHit - -BattleScript_EffectConfuse:: +BattleScript_EffectConfuse: attackcanceler attackstring ppreduce jumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_OwnTempoPrevents - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + jumpifsubstituteblocks BattleScript_ButItFailed jumpifstatus2 BS_TARGET, STATUS2_CONFUSION, BattleScript_AlreadyConfused accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE - jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected + jumpifsafeguard BattleScript_SafeguardProtected attackanimation waitanimation setmoveeffect MOVE_EFFECT_CONFUSION @@ -952,6 +2885,10 @@ BattleScript_EffectDefenseUp2:: setstatchanger STAT_DEF, 2, FALSE goto BattleScript_EffectStatUp +BattleScript_EffectDefenseUp3: + setstatchanger STAT_DEF, 3, FALSE + goto BattleScript_EffectStatUp + BattleScript_EffectSpeedUp2:: setstatchanger STAT_SPEED, 2, FALSE goto BattleScript_EffectStatUp @@ -960,10 +2897,22 @@ BattleScript_EffectSpecialAttackUp2:: setstatchanger STAT_SPATK, 2, FALSE goto BattleScript_EffectStatUp +BattleScript_EffectSpecialAttackUp3:: + setstatchanger STAT_SPATK, 3, FALSE + goto BattleScript_EffectStatUp + BattleScript_EffectSpecialDefenseUp2:: setstatchanger STAT_SPDEF, 2, FALSE goto BattleScript_EffectStatUp +BattleScript_EffectAccuracyUp2: + setstatchanger STAT_ACC, 2, FALSE + goto BattleScript_EffectStatUp + +BattleScript_EffectEvasionUp2: + setstatchanger STAT_EVASION, 2, FALSE + goto BattleScript_EffectStatUp + BattleScript_EffectTransform:: attackcanceler attackstring @@ -975,22 +2924,34 @@ BattleScript_EffectTransform:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectAttackDown2:: +BattleScript_EffectAttackDown2: setstatchanger STAT_ATK, 2, TRUE goto BattleScript_EffectStatDown -BattleScript_EffectDefenseDown2:: +BattleScript_EffectDefenseDown2: setstatchanger STAT_DEF, 2, TRUE goto BattleScript_EffectStatDown -BattleScript_EffectSpeedDown2:: +BattleScript_EffectSpeedDown2: setstatchanger STAT_SPEED, 2, TRUE goto BattleScript_EffectStatDown -BattleScript_EffectSpecialDefenseDown2:: +BattleScript_EffectSpecialDefenseDown2: setstatchanger STAT_SPDEF, 2, TRUE goto BattleScript_EffectStatDown +BattleScript_EffectSpecialAttackDown2: + setstatchanger STAT_SPATK, 2, TRUE + goto BattleScript_EffectStatDown + +BattleScript_EffectAccuracyDown2: + setstatchanger STAT_ACC, 2, TRUE + goto BattleScript_EffectStatDown + +BattleScript_EffectEvasionDown2: + setstatchanger STAT_EVASION, 2, TRUE + goto BattleScript_EffectStatDown + BattleScript_EffectReflect:: attackcanceler attackstring @@ -1008,14 +2969,17 @@ BattleScript_EffectPoison:: attackstring ppreduce jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects + jumpifflowerveil BattleScript_FlowerVeilProtects + jumpifleafguard BattleScript_LeafGuardProtects + jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects + jumpifsubstituteblocks BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_POISON, BattleScript_AlreadyPoisoned jumpifstatus BS_TARGET, STATUS1_TOXIC_POISON, BattleScript_AlreadyPoisoned - jumpiftype BS_TARGET, TYPE_POISON, BattleScript_NotAffected - jumpiftype BS_TARGET, TYPE_STEEL, BattleScript_NotAffected + trypoisontype BS_ATTACKER, BS_TARGET, BattleScript_NotAffected jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE - jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected + jumpifsafeguard BattleScript_SafeguardProtected attackanimation waitanimation setmoveeffect MOVE_EFFECT_POISON @@ -1024,18 +2988,24 @@ BattleScript_EffectPoison:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectParalyze:: +BattleScript_EffectParalyze: attackcanceler attackstring ppreduce jumpifability BS_TARGET, ABILITY_LIMBER, BattleScript_LimberProtected - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects + jumpifflowerveil BattleScript_FlowerVeilProtects + jumpifleafguard BattleScript_LeafGuardProtects + jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects + jumpifsubstituteblocks BattleScript_ButItFailed typecalc jumpifmovehadnoeffect BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_PARALYSIS, BattleScript_AlreadyParalyzed + tryparalyzetype BS_ATTACKER, BS_TARGET, BattleScript_NotAffected jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE - jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected + jumpifsafeguard BattleScript_SafeguardProtected + bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE attackanimation waitanimation setmoveeffect MOVE_EFFECT_PARALYSIS @@ -1044,7 +3014,7 @@ BattleScript_EffectParalyze:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_AlreadyParalyzed:: +BattleScript_AlreadyParalyzed: setalreadystatusedmoveattempt BS_ATTACKER pause 0x20 printstring STRINGID_PKMNISALREADYPARALYZED @@ -1077,15 +3047,87 @@ BattleScript_EffectSpecialDefenseDownHit:: setmoveeffect MOVE_EFFECT_SP_DEF_MINUS_1 goto BattleScript_EffectHit +BattleScript_EffectSpecialDefenseDownHit2:: + setmoveeffect MOVE_EFFECT_SP_DEF_MINUS_2 + goto BattleScript_EffectHit + BattleScript_EffectAccuracyDownHit:: setmoveeffect MOVE_EFFECT_ACC_MINUS_1 goto BattleScript_EffectHit + +BattleScript_PowerHerbActivation: + playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, NULL + printstring STRINGID_POWERHERB + waitmessage 0x40 + removeitem BS_ATTACKER + return -BattleScript_EffectSkyAttack:: +BattleScript_EffectTwoTurnsAttack:: jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_TwoTurnMovesSecondTurn jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING, BattleScript_TwoTurnMovesSecondTurn - setbyte sTWOTURN_STRINGID, 3 + jumpifmove MOVE_SKY_ATTACK, BattleScript_EffectTwoTurnsAttackSkyAttack + jumpifmove MOVE_RAZOR_WIND, BattleScript_EffectTwoTurnsAttackRazorWind + jumpifmove MOVE_ICE_BURN, BattleScript_EffectTwoTurnsAttackIceBurn + jumpifmove MOVE_FREEZE_SHOCK, BattleScript_EffectTwoTurnsAttackFreezeShock + setbyte sTWOTURN_STRINGID, 0x0 +BattleScript_EffectTwoTurnsAttackContinue: call BattleScriptFirstChargingTurn + jumpifnoholdeffect BS_ATTACKER, HOLD_EFFECT_POWER_HERB, BattleScript_MoveEnd + call BattleScript_PowerHerbActivation + goto BattleScript_TwoTurnMovesSecondTurn +BattleScript_EffectTwoTurnsAttackSkyAttack: + setbyte sTWOTURN_STRINGID, 0x3 + goto BattleScript_EffectTwoTurnsAttackContinue +BattleScript_EffectTwoTurnsAttackRazorWind: + setbyte sTWOTURN_STRINGID, 0x0 + goto BattleScript_EffectTwoTurnsAttackContinue +BattleScript_EffectTwoTurnsAttackIceBurn: + setbyte sTWOTURN_STRINGID, 0x0 + goto BattleScript_EffectTwoTurnsAttackContinue +BattleScript_EffectTwoTurnsAttackFreezeShock: + setbyte sTWOTURN_STRINGID, 0xa + goto BattleScript_EffectTwoTurnsAttackContinue + +BattleScript_EffectGeomancy: + jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_GeomancySecondTurn + jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING, BattleScript_GeomancySecondTurn + setbyte sTWOTURN_STRINGID, 0x9 + call BattleScriptFirstChargingTurn + jumpifnoholdeffect BS_ATTACKER, HOLD_EFFECT_POWER_HERB, BattleScript_MoveEnd + call BattleScript_PowerHerbActivation +BattleScript_GeomancySecondTurn: + attackcanceler + setmoveeffect MOVE_EFFECT_CHARGING + setbyte sB_ANIM_TURN, 0x1 + clearstatusfromeffect BS_ATTACKER + orword gHitMarker, HITMARKER_NO_PPDEDUCT + attackstring + jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPATK, 0xC, BattleScript_GeomancyDoMoveAnim + jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPDEF, 0xC, BattleScript_GeomancyDoMoveAnim + jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPEED, 0xC, BattleScript_CantRaiseMultipleStats +BattleScript_GeomancyDoMoveAnim:: + attackanimation + waitanimation + setbyte sSTAT_ANIM_PLAYED, FALSE + playstatchangeanimation BS_ATTACKER, BIT_SPATK | BIT_SPDEF | BIT_SPEED, 0x0 + setstatchanger STAT_SPATK, 2, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_GeomancyTrySpDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_GeomancyTrySpDef + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_GeomancyTrySpDef:: + setstatchanger STAT_SPDEF, 2, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_GeomancyTrySpeed + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_GeomancyTrySpeed + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_GeomancyTrySpeed:: + setstatchanger STAT_SPEED, 2, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_GeomancyEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_GeomancyEnd + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_GeomancyEnd:: goto BattleScript_MoveEnd BattleScript_EffectConfuseHit:: @@ -1095,7 +3137,7 @@ BattleScript_EffectConfuseHit:: BattleScript_EffectTwineedle:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - setbyte sMULTIHIT_EFFECT, MOVE_EFFECT_POISON + sethword sMULTIHIT_EFFECT, MOVE_EFFECT_POISON attackstring ppreduce setmultihitcounter 0x2 @@ -1155,7 +3197,7 @@ BattleScript_EffectMimic:: attackcanceler attackstring ppreduce - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + jumpifsubstituteblocks BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON mimicattackcopy BattleScript_ButItFailed attackanimation @@ -1179,7 +3221,7 @@ BattleScript_EffectLeechSeed:: attackstring pause 0x20 ppreduce - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + jumpifsubstituteblocks BattleScript_ButItFailed accuracycheck BattleScript_DoLeechSeed, ACC_CURR_MOVE BattleScript_DoLeechSeed:: setseeded @@ -1189,21 +3231,39 @@ BattleScript_DoLeechSeed:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectSplash:: +BattleScript_EffectDoNothing:: attackcanceler attackstring ppreduce + jumpifmove MOVE_HOLD_HANDS, BattleScript_EffectHoldHands attackanimation waitanimation + jumpifmove MOVE_CELEBRATE, BattleScript_EffectCelebrate + jumpifmove MOVE_HAPPY_HOUR, BattleScript_EffectHappyHour incrementgamestat GAME_STAT_USED_SPLASH printstring STRINGID_BUTNOTHINGHAPPENED waitmessage 0x40 goto BattleScript_MoveEnd +BattleScript_EffectHoldHands: + jumpifsideaffecting BS_TARGET, SIDE_STATUS_CRAFTY_SHIELD, BattleScript_ButItFailed + jumpifbyteequal gBattlerTarget, gBattlerAttacker, BattleScript_ButItFailed + attackanimation + waitanimation + goto BattleScript_MoveEnd +BattleScript_EffectCelebrate: + printstring STRINGID_CELEBRATEMESSAGE + waitmessage 0x40 + goto BattleScript_MoveEnd +BattleScript_EffectHappyHour: + setmoveeffect MOVE_EFFECT_HAPPY_HOUR + seteffectprimary + goto BattleScript_MoveEnd BattleScript_EffectDisable:: attackcanceler attackstring ppreduce + jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE disablelastusedattack BattleScript_ButItFailed attackanimation @@ -1218,9 +3278,9 @@ BattleScript_EffectLevelDamage:: attackstring ppreduce typecalc - bicbyte gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE + bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE dmgtolevel - adjustsetdamage + adjustdamage goto BattleScript_HitFromAtkAnimation BattleScript_EffectPsywave:: @@ -1229,9 +3289,9 @@ BattleScript_EffectPsywave:: attackstring ppreduce typecalc - bicbyte gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE + bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE psywavedamageeffect - adjustsetdamage + adjustdamage goto BattleScript_HitFromAtkAnimation BattleScript_EffectCounter:: @@ -1240,8 +3300,9 @@ BattleScript_EffectCounter:: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce - typecalc2 - adjustsetdamage + typecalc + bichalfword gMoveResultFlags, MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE + adjustdamage goto BattleScript_HitFromAtkAnimation BattleScript_EffectEncore:: @@ -1249,6 +3310,7 @@ BattleScript_EffectEncore:: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce + jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects trysetencore BattleScript_ButItFailed attackanimation waitanimation @@ -1276,6 +3338,7 @@ BattleScript_EffectPainSplit:: BattleScript_EffectSnore:: attackcanceler + jumpifability BS_ATTACKER, ABILITY_COMATOSE, BattleScript_SnoreIsAsleep jumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_SnoreIsAsleep attackstring ppreduce @@ -1307,7 +3370,7 @@ BattleScript_EffectLockOn:: attackcanceler attackstring ppreduce - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + jumpifsubstituteblocks BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE setalwayshitflag attackanimation @@ -1320,7 +3383,6 @@ BattleScript_EffectSketch:: attackcanceler attackstring ppreduce - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed copymovepermanently BattleScript_ButItFailed attackanimation waitanimation @@ -1330,6 +3392,7 @@ BattleScript_EffectSketch:: BattleScript_EffectSleepTalk:: attackcanceler + jumpifability BS_ATTACKER, ABILITY_COMATOSE, BattleScript_SleepTalkIsAsleep jumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_SleepTalkIsAsleep attackstring ppreduce @@ -1362,10 +3425,6 @@ BattleScript_EffectDestinyBond:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectFlail:: - remaininghptopower - goto BattleScript_EffectHit - BattleScript_EffectSpite:: attackcanceler attackstring @@ -1418,11 +3477,9 @@ BattleScript_DoTripleKickAttack:: movevaluescleanup addbyte sTRIPLE_KICK_POWER, 10 addbyte sMULTIHIT_STRING + 4, 0x1 - copyhword gDynamicBasePower, sTRIPLE_KICK_POWER critcalc damagecalc - typecalc - adjustnormaldamage + adjustdamage jumpifmovehadnoeffect BattleScript_TripleKickNoMoreHits attackanimation waitanimation @@ -1442,7 +3499,7 @@ BattleScript_DoTripleKickAttack:: BattleScript_TripleKickNoMoreHits:: pause 0x20 jumpifbyte CMP_EQUAL, sMULTIHIT_STRING + 4, 0x0, BattleScript_TripleKickPrintStrings - bicbyte gMoveResultFlags, MOVE_RESULT_MISSED + bichalfword gMoveResultFlags, MOVE_RESULT_MISSED BattleScript_TripleKickPrintStrings:: resultmessage waitmessage 0x40 @@ -1461,13 +3518,17 @@ BattleScript_EffectThief:: setmoveeffect MOVE_EFFECT_STEAL_ITEM goto BattleScript_EffectHit +BattleScript_EffectHitPreventEscape: + setmoveeffect MOVE_EFFECT_PREVENT_ESCAPE + goto BattleScript_EffectHit + BattleScript_EffectMeanLook:: attackcanceler attackstring ppreduce - accuracycheck BattleScript_ButItFailed, NO_ACC_CALC + accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifstatus2 BS_TARGET, STATUS2_ESCAPE_PREVENTION, BattleScript_ButItFailed - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + jumpifsubstituteblocks BattleScript_ButItFailed attackanimation waitanimation setmoveeffect MOVE_EFFECT_PREVENT_ESCAPE @@ -1480,9 +3541,10 @@ BattleScript_EffectNightmare:: attackcanceler attackstring ppreduce - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + jumpifsubstituteblocks BattleScript_ButItFailed jumpifstatus2 BS_TARGET, STATUS2_NIGHTMARE, BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_NightmareWorked + jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_NightmareWorked goto BattleScript_ButItFailed BattleScript_NightmareWorked:: attackanimation @@ -1500,7 +3562,7 @@ BattleScript_EffectMinimize:: goto BattleScript_EffectStatUpAfterAtkCanceler BattleScript_EffectCurse:: - jumpiftype2 BS_ATTACKER, TYPE_GHOST, BattleScript_GhostCurse + jumpiftype BS_ATTACKER, TYPE_GHOST, BattleScript_GhostCurse attackcanceler attackstring ppreduce @@ -1535,7 +3597,6 @@ BattleScript_DoGhostCurse:: attackcanceler attackstring ppreduce - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON cursetarget BattleScript_ButItFailed orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE @@ -1549,9 +3610,15 @@ BattleScript_DoGhostCurse:: tryfaintmon BS_ATTACKER, FALSE, NULL goto BattleScript_MoveEnd +BattleScript_EffectMatBlock:: + attackcanceler + jumpifnotfirstturn BattleScript_ButItFailedAtkStringPpReduce + goto BattleScript_ProtectLikeAtkString + BattleScript_EffectProtect:: BattleScript_EffectEndure:: attackcanceler +BattleScript_ProtectLikeAtkString: attackstring ppreduce setprotectlike @@ -1572,12 +3639,14 @@ BattleScript_EffectSpikes:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectForesight:: +BattleScript_EffectForesight: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce + accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON + jumpifstatus2 BS_TARGET, STATUS2_FORESIGHT, BattleScript_ButItFailed setforesight +BattleScript_IdentifiedFoe: attackanimation waitanimation printstring STRINGID_PKMNIDENTIFIED @@ -1621,13 +3690,13 @@ BattleScript_EffectRollout:: BattleScript_RolloutCheckAccuracy:: accuracycheck BattleScript_RolloutHit, ACC_CURR_MOVE BattleScript_RolloutHit:: - typecalc2 - rolloutdamagecalculation + typecalc + handlerollout goto BattleScript_HitFromCritCalc BattleScript_EffectSwagger:: attackcanceler - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_MakeMoveMissed + jumpifsubstituteblocks BattleScript_MakeMoveMissed accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce @@ -1641,46 +3710,64 @@ BattleScript_EffectSwagger:: playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printfromtable gStatUpStringIds waitmessage 0x40 -BattleScript_SwaggerTryConfuse:: +BattleScript_SwaggerTryConfuse: jumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_OwnTempoPrevents - jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected + jumpifsafeguard BattleScript_SafeguardProtected setmoveeffect MOVE_EFFECT_CONFUSION seteffectprimary goto BattleScript_MoveEnd -BattleScript_EffectFuryCutter:: +BattleScript_EffectFuryCutter: attackcanceler attackstring ppreduce accuracycheck BattleScript_FuryCutterHit, ACC_CURR_MOVE -BattleScript_FuryCutterHit:: - furycuttercalc +BattleScript_FuryCutterHit: + handlefurycutter critcalc damagecalc - typecalc jumpifmovehadnoeffect BattleScript_FuryCutterHit - adjustnormaldamage + adjustdamage goto BattleScript_HitFromAtkAnimation + +BattleScript_TryDestinyKnotTarget: + jumpifnoholdeffect BS_ATTACKER, HOLD_EFFECT_DESTINY_KNOT, BattleScript_TryDestinyKnotTargetRet + infatuatewithbattler BS_TARGET, BS_ATTACKER + playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, NULL + waitanimation + status2animation BS_TARGET, STATUS2_INFATUATION + waitanimation + printstring STRINGID_DESTINYKNOTACTIVATES + waitmessage 0x40 +BattleScript_TryDestinyKnotTargetRet: + return + +BattleScript_TryDestinyKnotAttacker: + jumpifnoholdeffect BS_TARGET, HOLD_EFFECT_DESTINY_KNOT, BattleScript_TryDestinyKnotAttackerRet + infatuatewithbattler BS_ATTACKER, BS_TARGET + playanimation BS_TARGET, B_ANIM_HELD_ITEM_EFFECT, NULL + waitanimation + status2animation BS_ATTACKER, STATUS2_INFATUATION + waitanimation + printstring STRINGID_DESTINYKNOTACTIVATES + waitmessage 0x40 +BattleScript_TryDestinyKnotAttackerRet: + return BattleScript_EffectAttract:: attackcanceler attackstring ppreduce accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE + jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects tryinfatuating BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNFELLINLOVE waitmessage 0x40 + call BattleScript_TryDestinyKnotAttacker goto BattleScript_MoveEnd -BattleScript_EffectReturn:: -BattleScript_EffectFrustration:: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - happinesstodamagecalculation - goto BattleScript_HitFromAtkString - BattleScript_EffectPresent:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -1701,15 +3788,17 @@ BattleScript_EffectThawHit:: goto BattleScript_EffectHit BattleScript_EffectMagnitude:: + jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING | HITMARKER_NO_PPDEDUCT, BattleScript_EffectMagnitudeTarget attackcanceler attackstring ppreduce - selectfirstvalidtarget magnitudedamagecalculation pause 0x20 printstring STRINGID_MAGNITUDESTRENGTH waitmessage 0x40 - goto BattleScript_HitsAllWithUndergroundBonusLoop +BattleScript_EffectMagnitudeTarget: + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + goto BattleScript_HitFromCritCalc BattleScript_EffectBatonPass:: attackcanceler @@ -1719,7 +3808,7 @@ BattleScript_EffectBatonPass:: jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_ButItFailed attackanimation waitanimation - openpartyscreen 0x1, BattleScript_ButItFailed + openpartyscreen BS_ATTACKER, BattleScript_ButItFailed switchoutabilities BS_ATTACKER waitstate switchhandleorder BS_ATTACKER, 0x2 @@ -1743,24 +3832,21 @@ BattleScript_EffectSonicboom:: attackstring ppreduce typecalc - bicbyte gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE + bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE setword gBattleMoveDamage, 20 - adjustsetdamage + adjustdamage goto BattleScript_HitFromAtkAnimation BattleScript_EffectMorningSun:: BattleScript_EffectSynthesis:: BattleScript_EffectMoonlight:: +BattleScript_EffectShoreUp:: attackcanceler attackstring ppreduce recoverbasedonsunlight BattleScript_AlreadyAtFullHp goto BattleScript_PresentHealTarget -BattleScript_EffectHiddenPower:: - hiddenpowercalc - goto BattleScript_EffectHit - BattleScript_EffectRainDance:: attackcanceler attackstring @@ -1824,8 +3910,9 @@ BattleScript_EffectMirrorCoat:: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce - typecalc2 - adjustsetdamage + typecalc + bichalfword gMoveResultFlags, MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE + adjustdamage goto BattleScript_HitFromAtkAnimation BattleScript_EffectSkullBash:: @@ -1841,62 +3928,20 @@ BattleScript_EffectSkullBash:: printfromtable gStatUpStringIds waitmessage 0x40 BattleScript_SkullBashEnd:: - goto BattleScript_MoveEnd + jumpifnoholdeffect BS_ATTACKER, HOLD_EFFECT_POWER_HERB, BattleScript_MoveEnd + call BattleScript_PowerHerbActivation + goto BattleScript_TwoTurnMovesSecondTurn -BattleScript_EffectTwister:: - jumpifnostatus3 BS_TARGET, STATUS3_ON_AIR, BattleScript_FlinchEffect - orword gHitMarker, HITMARKER_IGNORE_ON_AIR - setbyte sDMG_MULTIPLIER, 0x2 -BattleScript_FlinchEffect:: +BattleScript_EffectTwister: +BattleScript_FlinchEffect: +BattleScript_EffectStomp: setmoveeffect MOVE_EFFECT_FLINCH goto BattleScript_EffectHit -BattleScript_EffectEarthquake:: - attackcanceler - attackstring - ppreduce - selectfirstvalidtarget -BattleScript_HitsAllWithUndergroundBonusLoop:: - movevaluescleanup - jumpifnostatus3 BS_TARGET, STATUS3_UNDERGROUND, BattleScript_HitsAllNoUndergroundBonus - orword gHitMarker, HITMARKER_IGNORE_UNDERGROUND - setbyte sDMG_MULTIPLIER, 0x2 - goto BattleScript_DoHitAllWithUndergroundBonus -BattleScript_HitsAllNoUndergroundBonus:: - bicword gHitMarker, HITMARKER_IGNORE_UNDERGROUND - setbyte sDMG_MULTIPLIER, 0x1 -BattleScript_DoHitAllWithUndergroundBonus:: - accuracycheck BattleScript_HitAllWithUndergroundBonusMissed, ACC_CURR_MOVE - critcalc - damagecalc - typecalc - adjustnormaldamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage 0x40 - resultmessage - waitmessage 0x40 - printstring STRINGID_EMPTYSTRING3 - waitmessage 0x1 - tryfaintmon BS_TARGET, FALSE, NULL - moveendto MOVEEND_NEXT_TARGET - jumpifnexttargetvalid BattleScript_HitsAllWithUndergroundBonusLoop - end -BattleScript_HitAllWithUndergroundBonusMissed:: - pause 0x20 - typecalc - effectivenesssound - resultmessage - waitmessage 0x40 - moveendto MOVEEND_NEXT_TARGET - jumpifnexttargetvalid BattleScript_HitsAllWithUndergroundBonusLoop - end +BattleScript_EffectBulldoze: + setmoveeffect MOVE_EFFECT_SPD_MINUS_1 +BattleScript_EffectEarthquake: + goto BattleScript_EffectHit BattleScript_EffectFutureSight:: attackcanceler @@ -1910,16 +3955,8 @@ BattleScript_EffectFutureSight:: goto BattleScript_MoveEnd BattleScript_EffectGust:: - jumpifnostatus3 BS_TARGET, STATUS3_ON_AIR, BattleScript_EffectHit - orword gHitMarker, HITMARKER_IGNORE_ON_AIR - setbyte sDMG_MULTIPLIER, 0x2 goto BattleScript_EffectHit -BattleScript_EffectStomp:: - jumpifnostatus3 BS_TARGET, STATUS3_MINIMIZED, BattleScript_FlinchEffect - setbyte sDMG_MULTIPLIER, 0x2 - goto BattleScript_FlinchEffect - BattleScript_EffectSolarbeam:: jumpifabilitypresent ABILITY_CLOUD_NINE, BattleScript_SolarbeamDecideTurn jumpifabilitypresent ABILITY_AIR_LOCK, BattleScript_SolarbeamDecideTurn @@ -1929,7 +3966,9 @@ BattleScript_SolarbeamDecideTurn:: jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING, BattleScript_TwoTurnMovesSecondTurn setbyte sTWOTURN_STRINGID, 1 call BattleScriptFirstChargingTurn - goto BattleScript_MoveEnd + jumpifnoholdeffect BS_ATTACKER, HOLD_EFFECT_POWER_HERB, BattleScript_MoveEnd + call BattleScript_PowerHerbActivation + goto BattleScript_TwoTurnMovesSecondTurn BattleScript_SolarbeamOnFirstTurn:: orword gHitMarker, HITMARKER_CHARGING setmoveeffect MOVE_EFFECT_CHARGING | MOVE_EFFECT_AFFECTS_USER @@ -1937,12 +3976,15 @@ BattleScript_SolarbeamOnFirstTurn:: ppreduce goto BattleScript_TwoTurnMovesSecondTurn -BattleScript_EffectThunder:: +BattleScript_EffectThunder: setmoveeffect MOVE_EFFECT_PARALYSIS - orword gHitMarker, HITMARKER_IGNORE_ON_AIR goto BattleScript_EffectHit -BattleScript_EffectTeleport:: +BattleScript_EffectHurricane: + setmoveeffect MOVE_EFFECT_CONFUSION + goto BattleScript_EffectHit + +BattleScript_EffectTeleport: attackcanceler attackstring ppreduce @@ -1969,10 +4011,10 @@ BattleScript_BeatUpLoop:: trydobeatup BattleScript_BeatUpEnd, BattleScript_ButItFailed printstring STRINGID_PKMNATTACK critcalc - jumpifbyte CMP_NOT_EQUAL, gCritMultiplier, 0x2, BattleScript_BeatUpAttack + jumpifbyte CMP_NOT_EQUAL, gIsCriticalHit, TRUE, BattleScript_BeatUpAttack manipulatedamage DMG_DOUBLED BattleScript_BeatUpAttack:: - adjustnormaldamage + adjustdamage attackanimation waitanimation effectivenesssound @@ -1996,32 +4038,33 @@ BattleScript_EffectSemiInvulnerable:: jumpifmove MOVE_FLY, BattleScript_FirstTurnFly jumpifmove MOVE_DIVE, BattleScript_FirstTurnDive jumpifmove MOVE_BOUNCE, BattleScript_FirstTurnBounce - setbyte sTWOTURN_STRINGID, 5 + jumpifmove MOVE_PHANTOM_FORCE, BattleScript_FirstTurnPhantomForce + jumpifmove MOVE_SHADOW_FORCE, BattleScript_FirstTurnPhantomForce + setbyte sTWOTURN_STRINGID, 0x5 goto BattleScript_FirstTurnSemiInvulnerable - BattleScript_FirstTurnBounce:: setbyte sTWOTURN_STRINGID, 7 goto BattleScript_FirstTurnSemiInvulnerable - BattleScript_FirstTurnDive:: setbyte sTWOTURN_STRINGID, 6 goto BattleScript_FirstTurnSemiInvulnerable - +BattleScript_FirstTurnPhantomForce: + setbyte sTWOTURN_STRINGID, 0x8 + goto BattleScript_FirstTurnSemiInvulnerable BattleScript_FirstTurnFly:: setbyte sTWOTURN_STRINGID, 4 BattleScript_FirstTurnSemiInvulnerable:: call BattleScriptFirstChargingTurn setsemiinvulnerablebit - goto BattleScript_MoveEnd - + jumpifnoholdeffect BS_ATTACKER, HOLD_EFFECT_POWER_HERB, BattleScript_MoveEnd + call BattleScript_PowerHerbActivation BattleScript_SecondTurnSemiInvulnerable:: attackcanceler setmoveeffect MOVE_EFFECT_CHARGING setbyte sB_ANIM_TURN, 0x1 clearstatusfromeffect BS_ATTACKER orword gHitMarker, HITMARKER_NO_PPDEDUCT - jumpifnotmove MOVE_BOUNCE, BattleScript_SemiInvulnerableTryHit - setmoveeffect MOVE_EFFECT_PARALYSIS + argumenttomoveeffect BattleScript_SemiInvulnerableTryHit:: accuracycheck BattleScript_SemiInvulnerableMiss, ACC_CURR_MOVE clearsemiinvulnerablebit @@ -2068,7 +4111,7 @@ BattleScript_AlreadyAtFullHp:: BattleScript_EffectFakeOut:: attackcanceler jumpifnotfirstturn BattleScript_ButItFailedAtkStringPpReduce - setmoveeffect MOVE_EFFECT_FLINCH | MOVE_EFFECT_CERTAIN + setmoveeffect MOVE_EFFECT_FLINCH goto BattleScript_EffectHit BattleScript_ButItFailedAtkStringPpReduce:: @@ -2077,14 +4120,14 @@ BattleScript_ButItFailedPpReduce:: ppreduce BattleScript_ButItFailed:: pause 0x20 - orbyte gMoveResultFlags, MOVE_RESULT_FAILED + orhalfword gMoveResultFlags, MOVE_RESULT_FAILED resultmessage waitmessage 0x40 goto BattleScript_MoveEnd BattleScript_NotAffected:: pause 0x20 - orbyte gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE + orhalfword gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE resultmessage waitmessage 0x40 goto BattleScript_MoveEnd @@ -2097,18 +4140,36 @@ BattleScript_EffectUproar:: jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_UproarHit ppreduce BattleScript_UproarHit:: - nop goto BattleScript_HitFromCritCalc BattleScript_EffectStockpile:: attackcanceler attackstring ppreduce - stockpile + stockpile 0 attackanimation waitanimation printfromtable gStockpileUsedStringIds waitmessage 0x40 + jumpifmovehadnoeffect BattleScript_EffectStockpileEnd + jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_DEF, 0xC, BattleScript_EffectStockpileDef + jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPDEF, 0xC, BattleScript_EffectStockpileEnd +BattleScript_EffectStockpileDef: + setbyte sSTAT_ANIM_PLAYED, FALSE + playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF, 0x0 + setstatchanger STAT_DEF, 1, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_EffectStockpileSpDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_EffectStockpileSpDef + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_EffectStockpileSpDef:: + setstatchanger STAT_SPDEF, 1, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_EffectStockpileEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_EffectStockpileEnd + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_EffectStockpileEnd: + stockpile 1 goto BattleScript_MoveEnd BattleScript_EffectSpitUp:: @@ -2117,9 +4178,10 @@ BattleScript_EffectSpitUp:: attackstring ppreduce accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + setbyte gIsCriticalHit, FALSE + damagecalc + adjustdamage stockpiletobasedamage BattleScript_SpitUpFail - typecalc - adjustsetdamage goto BattleScript_HitFromAtkAnimation BattleScript_SpitUpFail:: pause 0x20 @@ -2161,6 +4223,7 @@ BattleScript_EffectTorment:: attackstring ppreduce accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE + jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects settorment BattleScript_ButItFailed attackanimation waitanimation @@ -2170,7 +4233,7 @@ BattleScript_EffectTorment:: BattleScript_EffectFlatter:: attackcanceler - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_MakeMoveMissed + jumpifsubstituteblocks BattleScript_MakeMoveMissed accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce @@ -2186,7 +4249,7 @@ BattleScript_EffectFlatter:: waitmessage 0x40 BattleScript_FlatterTryConfuse:: jumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_OwnTempoPrevents - jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected + jumpifsafeguard BattleScript_SafeguardProtected setmoveeffect MOVE_EFFECT_CONFUSION seteffectprimary goto BattleScript_MoveEnd @@ -2195,13 +4258,17 @@ BattleScript_EffectWillOWisp:: attackcanceler attackstring ppreduce - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + jumpifsubstituteblocks BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_BURN, BattleScript_AlreadyBurned jumpiftype BS_TARGET, TYPE_FIRE, BattleScript_NotAffected jumpifability BS_TARGET, ABILITY_WATER_VEIL, BattleScript_WaterVeilPrevents + jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects + jumpifflowerveil BattleScript_FlowerVeilProtects + jumpifleafguard BattleScript_LeafGuardProtects + jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE - jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected + jumpifsafeguard BattleScript_SafeguardProtected attackanimation waitanimation setmoveeffect MOVE_EFFECT_BURN @@ -2230,9 +4297,9 @@ BattleScript_EffectMemento:: setatkhptozero attackanimation waitanimation - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_EffectMementoPrintNoEffect + jumpifsubstituteblocks BattleScript_EffectMementoPrintNoEffect setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_BY_TWO | STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_BY_TWO | STAT_CHANGE_ONLY_MULTIPLE playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_NEGATIVE | STAT_CHANGE_BY_TWO setstatchanger STAT_ATK, 2, TRUE statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_EffectMementoTrySpAtk @@ -2266,14 +4333,6 @@ BattleScript_82DA15A: tryfaintmon BS_ATTACKER, FALSE, NULL goto BattleScript_MoveEnd -BattleScript_EffectFacade:: - jumpifstatus BS_ATTACKER, STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON, BattleScript_FacadeDoubleDmg - goto BattleScript_EffectHit - -BattleScript_FacadeDoubleDmg:: - setbyte sDMG_MULTIPLIER, 0x2 - goto BattleScript_EffectHit - BattleScript_EffectFocusPunch:: attackcanceler jumpifnodamage BattleScript_HitFromAccCheck @@ -2282,13 +4341,11 @@ BattleScript_EffectFocusPunch:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectSmellingsalt:: - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_EffectHit - setmoveeffect MOVE_EFFECT_REMOVE_PARALYSIS | MOVE_EFFECT_CERTAIN - jumpifstatus BS_TARGET, STATUS1_PARALYSIS, BattleScript_SmellingsaltDoubleDmg - goto BattleScript_EffectHit -BattleScript_SmellingsaltDoubleDmg: - setbyte sDMG_MULTIPLIER, 0x2 +BattleScript_EffectSmellingsalt: +BattleScript_EffectWakeUpSlap: +BattleScript_EffectSparklingAria: + jumpifsubstituteblocks BattleScript_EffectHit + setmoveeffect MOVE_EFFECT_REMOVE_STATUS | MOVE_EFFECT_CERTAIN goto BattleScript_EffectHit BattleScript_EffectFollowMe:: @@ -2318,6 +4375,14 @@ BattleScript_EffectCharge:: setcharge attackanimation waitanimation + setstatchanger STAT_SPDEF, 1, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_EffectChargeString + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_EffectChargeString + setgraphicalstatchangevalues + playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_EffectChargeString: printstring STRINGID_PKMNCHARGINGPOWER waitmessage 0x40 goto BattleScript_MoveEnd @@ -2326,6 +4391,7 @@ BattleScript_EffectTaunt:: attackcanceler attackstring ppreduce + jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE settaunt BattleScript_ButItFailed attackanimation @@ -2349,7 +4415,7 @@ BattleScript_EffectTrick:: attackcanceler attackstring ppreduce - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + jumpifsubstituteblocks BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE tryswapitems BattleScript_ButItFailed attackanimation @@ -2381,7 +4447,7 @@ BattleScript_EffectWish:: waitanimation goto BattleScript_MoveEnd -BattleScript_EffectAssist:: +BattleScript_EffectAssist: attackcanceler attackstring assistattackselect BattleScript_ButItFailedPpReduce @@ -2391,22 +4457,26 @@ BattleScript_EffectAssist:: setbyte sB_ANIM_TARGETS_HIT, 0x0 jumptocalledmove TRUE -BattleScript_EffectIngrain:: +BattleScript_EffectIngrain: attackcanceler attackstring ppreduce - trysetroots BattleScript_ButItFailed + setuserstatus3 STATUS3_ROOTED, BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNPLANTEDROOTS waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectSuperpower:: +BattleScript_EffectSuperpower: setmoveeffect MOVE_EFFECT_ATK_DEF_DOWN | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN goto BattleScript_EffectHit -BattleScript_EffectMagicCoat:: +BattleScript_EffectCloseCombat: + setmoveeffect MOVE_EFFECT_DEF_SPDEF_DOWN | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN + goto BattleScript_EffectHit + +BattleScript_EffectMagicCoat: attackcanceler trysetmagiccoat BattleScript_ButItFailedAtkStringPpReduce attackstring @@ -2428,10 +4498,6 @@ BattleScript_EffectRecycle:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectRevenge:: - doubledamagedealtifdamaged - goto BattleScript_EffectHit - BattleScript_EffectBrickBreak:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -2440,10 +4506,9 @@ BattleScript_EffectBrickBreak:: removelightscreenreflect critcalc damagecalc - typecalc - adjustnormaldamage + adjustdamage jumpifbyte CMP_EQUAL, sB_ANIM_TURN, 0x0, BattleScript_BrickBreakAnim - bicbyte gMoveResultFlags, MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE + bichalfword gMoveResultFlags, MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE BattleScript_BrickBreakAnim:: attackanimation waitanimation @@ -2451,7 +4516,7 @@ BattleScript_BrickBreakAnim:: printstring STRINGID_THEWALLSHATTERED waitmessage 0x40 BattleScript_BrickBreakDoHit:: - typecalc2 + typecalc effectivenesssound hitanimation BS_TARGET waitstate @@ -2471,8 +4536,12 @@ BattleScript_EffectYawn:: ppreduce jumpifability BS_TARGET, ABILITY_VITAL_SPIRIT, BattleScript_PrintBankAbilityMadeIneffective jumpifability BS_TARGET, ABILITY_INSOMNIA, BattleScript_PrintBankAbilityMadeIneffective - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed - jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected + jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_PrintBankAbilityMadeIneffective + jumpifflowerveil BattleScript_FlowerVeilProtects + jumpifleafguard BattleScript_LeafGuardProtects + jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects + jumpifsubstituteblocks BattleScript_ButItFailed + jumpifsafeguard BattleScript_SafeguardProtected accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifcantmakeasleep BattleScript_ButItFailed setyawn BattleScript_ButItFailed @@ -2482,7 +4551,7 @@ BattleScript_EffectYawn:: waitmessage 0x40 goto BattleScript_MoveEnd BattleScript_PrintBankAbilityMadeIneffective:: - copybyte sBATTLER, sBATTLER_WITH_ABILITY + copybyte sBATTLER, gBattlerAbility BattleScript_PrintAbilityMadeIneffective:: pause 0x20 printstring STRINGID_PKMNSXMADEITINEFFECTIVE @@ -2502,16 +4571,12 @@ BattleScript_EffectEndeavor:: accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE typecalc jumpifmovehadnoeffect BattleScript_HitFromAtkAnimation - bicbyte gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE + bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE copyword gBattleMoveDamage, gHpDealt - adjustsetdamage + adjustdamage goto BattleScript_HitFromAtkAnimation -BattleScript_EffectEruption:: - scaledamagebyhealthratio - goto BattleScript_EffectHit - -BattleScript_EffectSkillSwap:: +BattleScript_EffectSkillSwap: attackcanceler attackstring ppreduce @@ -2534,7 +4599,7 @@ BattleScript_EffectImprison:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectRefresh:: +BattleScript_EffectRefresh: attackcanceler attackstring ppreduce @@ -2546,18 +4611,18 @@ BattleScript_EffectRefresh:: updatestatusicon BS_ATTACKER goto BattleScript_MoveEnd -BattleScript_EffectGrudge:: +BattleScript_EffectGrudge: attackcanceler attackstring ppreduce - trysetgrudge BattleScript_ButItFailed + setuserstatus3 STATUS3_GRUDGE, BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNWANTSGRUDGE waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectSnatch:: +BattleScript_EffectSnatch: attackcanceler trysetsnatch BattleScript_ButItFailedAtkStringPpReduce attackstring @@ -2569,22 +4634,28 @@ BattleScript_EffectSnatch:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectLowKick:: - attackcanceler - attackstring - ppreduce - weightdamagecalculation - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - goto BattleScript_HitFromCritCalc - BattleScript_EffectSecretPower:: getsecretpowereffect goto BattleScript_EffectHit -BattleScript_EffectDoubleEdge:: +BattleScript_EffectRecoil25: + setmoveeffect MOVE_EFFECT_RECOIL_25 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN + jumpifnotmove MOVE_STRUGGLE, BattleScript_EffectHit + incrementgamestat GAME_STAT_USED_STRUGGLE + goto BattleScript_EffectHit + +BattleScript_EffectRecoil33:: setmoveeffect MOVE_EFFECT_RECOIL_33 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN goto BattleScript_EffectHit +BattleScript_EffectRecoil33WithStatus: + setmoveeffect MOVE_EFFECT_RECOIL_33_STATUS | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN + goto BattleScript_EffectHit + +BattleScript_EffectRecoil50: + setmoveeffect MOVE_EFFECT_RECOIL_50 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN + goto BattleScript_EffectHit + BattleScript_EffectTeeterDance:: attackcanceler attackstring @@ -2595,11 +4666,11 @@ BattleScript_TeeterDanceLoop:: setmoveeffect MOVE_EFFECT_CONFUSION jumpifbyteequal gBattlerAttacker, gBattlerTarget, BattleScript_TeeterDanceLoopIncrement jumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_TeeterDanceOwnTempoPrevents - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_TeeterDanceSubstitutePrevents + jumpifsubstituteblocks BattleScript_TeeterDanceSubstitutePrevents jumpifstatus2 BS_TARGET, STATUS2_CONFUSION, BattleScript_TeeterDanceAlreadyConfused jumpifhasnohp BS_TARGET, BattleScript_TeeterDanceLoopIncrement accuracycheck BattleScript_TeeterDanceMissed, ACC_CURR_MOVE - jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_TeeterDanceSafeguardProtected + jumpifsafeguard BattleScript_TeeterDanceSafeguardProtected attackanimation waitanimation seteffectprimary @@ -2658,14 +4729,14 @@ BattleScript_EffectPoisonFang:: setmoveeffect MOVE_EFFECT_TOXIC goto BattleScript_EffectHit -BattleScript_EffectWeatherBall:: - setweatherballtype - goto BattleScript_EffectHit - BattleScript_EffectOverheat:: setmoveeffect MOVE_EFFECT_SP_ATK_TWO_DOWN | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN goto BattleScript_EffectHit +BattleScript_EffectHammerArm:: + setmoveeffect MOVE_EFFECT_SPD_MINUS_1 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN + goto BattleScript_EffectHit + BattleScript_EffectTickle:: attackcanceler attackstring @@ -2677,7 +4748,7 @@ BattleScript_TickleDoMoveAnim:: attackanimation waitanimation setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_TARGET, BIT_ATK | BIT_DEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_TARGET, BIT_ATK | BIT_DEF, STAT_CHANGE_NEGATIVE | STAT_CHANGE_ONLY_MULTIPLE playstatchangeanimation BS_TARGET, BIT_ATK, STAT_CHANGE_NEGATIVE setstatchanger STAT_ATK, 1, TRUE statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_TickleTryLowerDef @@ -2696,7 +4767,7 @@ BattleScript_TickleEnd:: BattleScript_CantLowerMultipleStats:: pause 0x20 - orbyte gMoveResultFlags, MOVE_RESULT_FAILED + orhalfword gMoveResultFlags, MOVE_RESULT_FAILED printstring STRINGID_STATSWONTDECREASE2 waitmessage 0x40 goto BattleScript_MoveEnd @@ -2727,7 +4798,6 @@ BattleScript_CosmicPowerEnd:: goto BattleScript_MoveEnd BattleScript_EffectSkyUppercut:: - orword gHitMarker, HITMARKER_IGNORE_ON_AIR goto BattleScript_EffectHit BattleScript_EffectBulkUp:: @@ -2782,7 +4852,7 @@ BattleScript_CalmMindEnd:: BattleScript_CantRaiseMultipleStats:: pause 0x20 - orbyte gMoveResultFlags, MOVE_RESULT_FAILED + orhalfword gMoveResultFlags, MOVE_RESULT_FAILED printstring STRINGID_STATSWONTINCREASE2 waitmessage 0x40 goto BattleScript_MoveEnd @@ -2824,30 +4894,42 @@ BattleScript_EffectCamouflage:: goto BattleScript_MoveEnd BattleScript_FaintAttacker:: + tryillusionoff BS_ATTACKER playfaintcry BS_ATTACKER pause 0x40 dofaintanimation BS_ATTACKER - cleareffectsonfaint BS_ATTACKER printstring STRINGID_ATTACKERFAINTED + cleareffectsonfaint BS_ATTACKER + tryactivatesoulheart + tryactivatereceiver BS_ATTACKER + trytrainerslidefirstdownmsg BS_ATTACKER return BattleScript_FaintTarget:: + tryillusionoff BS_TARGET playfaintcry BS_TARGET pause 0x40 dofaintanimation BS_TARGET - cleareffectsonfaint BS_TARGET printstring STRINGID_TARGETFAINTED + cleareffectsonfaint BS_TARGET + tryactivatefellstinger BS_ATTACKER + tryactivatesoulheart + tryactivatereceiver BS_TARGET + tryactivatemoxie BS_ATTACKER + tryactivatebeastboost BS_ATTACKER + trytrainerslidefirstdownmsg BS_TARGET return BattleScript_GiveExp:: setbyte sGIVEEXP_STATE, 0x0 getexp BS_TARGET end2 - + BattleScript_HandleFaintedMon:: + setbyte sSHIFT_SWITCHED, 0x0 atk24 BattleScript_82DA8F6 jumpifbyte CMP_NOT_EQUAL, gBattleOutcome, 0, BattleScript_FaintedMonEnd - jumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_FaintedMonTryChooseAnother + jumpifbattletype BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE, BattleScript_FaintedMonTryChooseAnother jumpifword CMP_NO_COMMON_BITS, gHitMarker, HITMARKER_x400000, BattleScript_FaintedMonTryChooseAnother printstring STRINGID_USENEXTPKMN setbyte gBattleCommunication, 0x0 @@ -2855,7 +4937,7 @@ BattleScript_HandleFaintedMon:: jumpifbyte CMP_EQUAL, gBattleCommunication + 1, 0x0, BattleScript_FaintedMonTryChooseAnother jumpifplayerran BattleScript_FaintedMonEnd printstring STRINGID_CANTESCAPE2 -BattleScript_FaintedMonTryChooseAnother:: +BattleScript_FaintedMonTryChooseAnother: openpartyscreen 0x3, BattleScript_FaintedMonEnd switchhandleorder BS_FAINTED, 0x2 jumpifnotbattletype BATTLE_TYPE_TRAINER, BattleScript_FaintedMonChooseAnother @@ -2866,6 +4948,7 @@ BattleScript_FaintedMonTryChooseAnother:: jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_x400000, BattleScript_FaintedMonChooseAnother jumpifbyte CMP_EQUAL, sBATTLE_STYLE, 0x1, BattleScript_FaintedMonChooseAnother jumpifcantswitch BS_PLAYER1, BattleScript_FaintedMonChooseAnother + setbyte sILLUSION_NICK_HACK, 1 printstring STRINGID_ENEMYABOUTTOSWITCHPKMN setbyte gBattleCommunication, 0x0 yesnobox @@ -2890,9 +4973,8 @@ BattleScript_FaintedMonTryChooseAnother:: hidepartystatussummary BS_ATTACKER switchinanim BS_ATTACKER, 0x0 waitstate - switchineffects BS_ATTACKER - resetsentmonsvalue -BattleScript_FaintedMonChooseAnother:: + setbyte sSHIFT_SWITCHED, 0x1 +BattleScript_FaintedMonChooseAnother: drawpartystatussummary BS_FAINTED getswitchedmondata BS_FAINTED switchindataupdate BS_FAINTED @@ -2902,11 +4984,20 @@ BattleScript_FaintedMonChooseAnother:: switchinanim BS_FAINTED, FALSE waitstate various7 BS_ATTACKER + trytrainerslidelastonmsg BS_FAINTED + jumpifbytenotequal sSHIFT_SWITCHED, sZero, BattleScript_FaintedMonShiftSwitched +BattleScript_FaintedMonChooseAnotherEnd: switchineffects BS_FAINTED jumpifbattletype BATTLE_TYPE_DOUBLE, BattleScript_FaintedMonEnd cancelallactions BattleScript_FaintedMonEnd:: end2 +BattleScript_FaintedMonShiftSwitched: + copybyte sSAVED_BATTLER, gBattlerTarget + switchineffects BS_ATTACKER + resetsentmonsvalue + copybyte gBattlerTarget, sSAVED_BATTLER + goto BattleScript_FaintedMonChooseAnotherEnd BattleScript_82DA8F6:: openpartyscreen 0x5, BattleScript_82DA8FC @@ -3100,7 +5191,6 @@ BattleScript_PrintFullBox:: BattleScript_ActionSwitch:: hpthresholds2 BS_ATTACKER printstring STRINGID_RETURNMON - setbyte sDMG_MULTIPLIER, 0x2 jumpifbattletype BATTLE_TYPE_DOUBLE, BattleScript_PursuitSwitchDmgSetMultihit setmultihit 0x1 goto BattleScript_PursuitSwitchDmgLoop @@ -3128,7 +5218,7 @@ BattleScript_DoSwitchOut:: switchinanim BS_ATTACKER, FALSE waitstate switchineffects BS_ATTACKER - moveendcase MOVEEND_IMMUNITY_ABILITIES + moveendcase MOVEEND_STATUS_IMMUNITY_ABILITIES moveendcase MOVEEND_MIRROR_MOVE end2 @@ -3138,8 +5228,7 @@ BattleScript_PursuitDmgOnSwitchOut:: ppreduce critcalc damagecalc - typecalc - adjustnormaldamage + adjustdamage attackanimation waitanimation effectivenesssound @@ -3152,9 +5241,9 @@ BattleScript_PursuitDmgOnSwitchOut:: resultmessage waitmessage 0x40 tryfaintmon BS_TARGET, FALSE, NULL - moveendfromto MOVEEND_ON_DAMAGE_ABILITIES, MOVEEND_CHOICE_MOVE + moveendfromto MOVEEND_ABILITIES, MOVEEND_CHOICE_MOVE getbattlerfainted BS_TARGET - jumpifbyte CMP_EQUAL, gBattleCommunication, FALSE, BattleScript_PursuitDmgOnSwitchOutRet + jumpifbyte CMP_EQUAL, gBattleCommunication, 0x0, BattleScript_PursuitDmgOnSwitchOutRet setbyte sGIVEEXP_STATE, 0x0 getexp BS_TARGET BattleScript_PursuitDmgOnSwitchOutRet: @@ -3218,11 +5307,18 @@ BattleScript_DamagingWeatherLoop:: copyarraywithindex gBattlerAttacker, gBattlerByTurnOrder, gBattleCommunication, 0x1 weatherdamage jumpifword CMP_EQUAL, gBattleMoveDamage, 0x0, BattleScript_DamagingWeatherLoopIncrement + jumpifword CMP_COMMON_BITS gBattleMoveDamage, 1 << 31, BattleScript_DamagingWeatherHeal printfromtable gSandStormHailDmgStringIds waitmessage 0x40 - orword gHitMarker, HITMARKER_x20 | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 | HITMARKER_GRUDGE effectivenesssound hitanimation BS_ATTACKER + goto BattleScript_DamagingWeatherHpChange +BattleScript_DamagingWeatherHeal: + call BattleScript_AbilityPopUp + printstring STRINGID_ICEBODYHPGAIN + waitmessage 0x40 +BattleScript_DamagingWeatherHpChange: + orword gHitMarker, HITMARKER_x20 | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 | HITMARKER_GRUDGE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER tryfaintmon BS_ATTACKER, FALSE, NULL @@ -3262,6 +5358,71 @@ BattleScript_SideStatusWoreOff:: waitmessage 0x40 end2 +BattleScript_SideStatusWoreOffReturn:: + printstring STRINGID_PKMNSXWOREOFF + waitmessage 0x40 + return + +BattleScript_LuckyChantEnds:: + printstring STRINGID_LUCKYCHANTENDS + waitmessage 0x40 + end2 + +BattleScript_TailwindEnds:: + printstring STRINGID_TAILWINDENDS + waitmessage 0x40 + end2 + +BattleScript_TrickRoomEnds:: + printstring STRINGID_TRICKROOMENDS + waitmessage 0x40 + end2 + +BattleScript_WonderRoomEnds:: + printstring STRINGID_WONDERROOMENDS + waitmessage 0x40 + end2 + +BattleScript_MagicRoomEnds:: + printstring STRINGID_MAGICROOMENDS + waitmessage 0x40 + end2 + +BattleScript_ElectricTerrainEnds:: + printstring STRINGID_ELECTRICTERRAINENDS + waitmessage 0x40 + end2 + +BattleScript_MistyTerrainEnds:: + printstring STRINGID_MISTYTERRAINENDS + waitmessage 0x40 + end2 + +BattleScript_GrassyTerrainEnds:: + printstring STRINGID_GRASSYTERRAINENDS + waitmessage 0x40 + end2 + +BattleScript_PsychicTerrainEnds:: + printstring STRINGID_PSYCHICTERRAINENDS + waitmessage 0x40 + end2 + +BattleScript_MudSportEnds:: + printstring STRINGID_MUDSPORTENDS + waitmessage 0x40 + end2 + +BattleScript_WaterSportEnds:: + printstring STRINGID_WATERSPORTENDS + waitmessage 0x40 + end2 + +BattleScript_GravityEnds:: + printstring STRINGID_GRAVITYENDS + waitmessage 0x40 + end2 + BattleScript_SafeguardProtected:: pause 0x20 printstring STRINGID_PKMNUSEDSAFEGUARD @@ -3281,10 +5442,13 @@ BattleScript_LeechSeedTurnDrain:: datahpupdate BS_ATTACKER copyword gBattleMoveDamage, gHpDealt jumpifability BS_ATTACKER, ABILITY_LIQUID_OOZE, BattleScript_LeechSeedTurnPrintLiquidOoze - manipulatedamage DMG_CHANGE_SIGN setbyte cMULTISTRING_CHOOSER, 0x3 + jumpifstatus3 BS_TARGET, STATUS3_HEAL_BLOCK, BattleScript_LeechSeedHealBlock + manipulatedamage DMG_BIG_ROOT goto BattleScript_LeechSeedTurnPrintAndUpdateHp BattleScript_LeechSeedTurnPrintLiquidOoze:: + copybyte gBattlerAbility, gBattlerAttacker + call BattleScript_AbilityPopUp setbyte cMULTISTRING_CHOOSER, 0x4 BattleScript_LeechSeedTurnPrintAndUpdateHp:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 @@ -3295,6 +5459,9 @@ BattleScript_LeechSeedTurnPrintAndUpdateHp:: tryfaintmon BS_ATTACKER, FALSE, NULL tryfaintmon BS_TARGET, FALSE, NULL end2 +BattleScript_LeechSeedHealBlock: + setword gBattleMoveDamage, 0 + goto BattleScript_LeechSeedTurnPrintAndUpdateHp BattleScript_BideStoringEnergy:: printstring STRINGID_PKMNSTORINGENERGY @@ -3309,9 +5476,9 @@ BattleScript_BideAttack:: waitmessage 0x40 accuracycheck BattleScript_MoveMissed, ACC_CURR_MOVE typecalc - bicbyte gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE + bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE copyword gBattleMoveDamage, sBIDE_DMG - adjustsetdamage + adjustdamage setbyte sB_ANIM_TURN, 0x1 attackanimation waitanimation @@ -3333,17 +5500,8 @@ BattleScript_BideNoEnergyToAttack:: waitmessage 0x40 goto BattleScript_ButItFailed -BattleScript_SuccessForceOut:: - attackanimation - waitanimation - switchoutabilities BS_TARGET - returntoball BS_TARGET - waitstate - jumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_TrainerBattleForceOut - setoutcomeonteleport BS_ATTACKER - finishaction - -BattleScript_TrainerBattleForceOut:: +BattleScript_RoarSuccessSwitch:: + call BattleScript_RoarSuccessRet getswitchedmondata BS_TARGET switchindataupdate BS_TARGET switchinanim BS_TARGET, FALSE @@ -3352,6 +5510,59 @@ BattleScript_TrainerBattleForceOut:: switchineffects BS_TARGET goto BattleScript_MoveEnd +BattleScript_RoarSuccessEndBattle:: + call BattleScript_RoarSuccessRet + setoutcomeonteleport BS_ATTACKER + finishaction + +BattleScript_RoarSuccessRet: + attackanimation + waitanimation + switchoutabilities BS_TARGET + returntoball BS_TARGET + waitstate + return + +BattleScript_WeaknessPolicy:: + copybyte sBATTLER, gBattlerTarget + jumpifstat BS_TARGET, CMP_LESS_THAN, STAT_ATK, 0xC, BattleScript_WeaknessPolicyAtk + jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPATK, 0xC, BattleScript_WeaknessPolicyEnd +BattleScript_WeaknessPolicyAtk: + playanimation BS_TARGET, B_ANIM_HELD_ITEM_EFFECT, NULL + waitanimation + setbyte sSTAT_ANIM_PLAYED, FALSE + playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, STAT_CHANGE_BY_TWO + setstatchanger STAT_ATK, 2, FALSE + statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_WeaknessPolicySpAtk + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_WeaknessPolicySpAtk + printstring STRINGID_USINGXTHEYOFZN + waitmessage 0x40 +BattleScript_WeaknessPolicySpAtk: + setstatchanger STAT_SPATK, 2, FALSE + statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_WeaknessPolicyRemoveItem + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_WeaknessPolicyRemoveItem + printstring STRINGID_USINGXTHEYOFZN + waitmessage 0x40 +BattleScript_WeaknessPolicyRemoveItem: + removeitem BS_TARGET +BattleScript_WeaknessPolicyEnd: + return + +BattleScript_TargetItemStatRaise:: + copybyte sBATTLER, gBattlerTarget + statbuffchange 0, BattleScript_TargetItemStatRaiseRemoveItemRet + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_TargetItemStatRaiseRemoveItemRet + playanimation BS_TARGET, B_ANIM_HELD_ITEM_EFFECT, NULL + waitanimation + setgraphicalstatchangevalues + playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + waitanimation + printstring STRINGID_USINGXTHEYOFZN + waitmessage 0x40 + removeitem BS_TARGET +BattleScript_TargetItemStatRaiseRemoveItemRet: + return + BattleScript_MistProtected:: pause 0x20 printstring STRINGID_PKMNPROTECTEDBYMIST @@ -3397,56 +5608,89 @@ BattleScript_DestinyBondTakesLife:: tryfaintmon BS_ATTACKER, FALSE, NULL return -BattleScript_SpikesOnAttacker:: +BattleScript_DmgHazardsOnAttacker:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER - call BattleScript_PrintHurtBySpikes + call BattleScript_PrintHurtByDmgHazards tryfaintmon BS_ATTACKER, FALSE, NULL - tryfaintmon BS_ATTACKER, TRUE, BattleScript_SpikesOnAttackerFainted + tryfaintmon BS_ATTACKER, TRUE, BattleScript_DmgHazardsOnAttackerFainted return -BattleScript_SpikesOnAttackerFainted:: +BattleScript_DmgHazardsOnAttackerFainted:: setbyte sGIVEEXP_STATE, 0x0 getexp BS_ATTACKER moveendall goto BattleScript_HandleFaintedMon -BattleScript_SpikesOnTarget:: +BattleScript_DmgHazardsOnTarget:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 healthbarupdate BS_TARGET datahpupdate BS_TARGET - call BattleScript_PrintHurtBySpikes + call BattleScript_PrintHurtByDmgHazards tryfaintmon BS_TARGET, FALSE, NULL - tryfaintmon BS_TARGET, TRUE, BattleScript_SpikesOnTargetFainted + tryfaintmon BS_TARGET, TRUE, BattleScript_DmgHazardsOnTargetFainted return -BattleScript_SpikesOnTargetFainted:: +BattleScript_DmgHazardsOnTargetFainted:: setbyte sGIVEEXP_STATE, 0x0 getexp BS_TARGET moveendall goto BattleScript_HandleFaintedMon -BattleScript_SpikesOnFaintedBattler:: +BattleScript_DmgHazardsOnFaintedBattler:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 healthbarupdate BS_FAINTED datahpupdate BS_FAINTED - call BattleScript_PrintHurtBySpikes + call BattleScript_PrintHurtByDmgHazards tryfaintmon BS_FAINTED, FALSE, NULL - tryfaintmon BS_FAINTED, TRUE, BattleScript_SpikesOnFaintedBattlerFainted + tryfaintmon BS_FAINTED, TRUE, BattleScript_DmgHazardsOnFaintedBattlerFainted return -BattleScript_SpikesOnFaintedBattlerFainted:: +BattleScript_DmgHazardsOnFaintedBattlerFainted:: setbyte sGIVEEXP_STATE, 0x0 getexp BS_FAINTED moveendall goto BattleScript_HandleFaintedMon -BattleScript_PrintHurtBySpikes:: - printstring STRINGID_PKMNHURTBYSPIKES +BattleScript_PrintHurtByDmgHazards:: + printfromtable gDmgHazardsStringIds waitmessage 0x40 return +BattleScript_ToxicSpikesAbsorbed:: + printstring STRINGID_TOXICSPIKESABSORBED + waitmessage 0x40 + return + +BattleScript_ToxicSpikesPoisoned:: + printstring STRINGID_TOXICSPIKESPOISONED + waitmessage 0x40 + statusanimation BS_SCRIPTING + updatestatusicon BS_SCRIPTING + waitstate + return + +BattleScript_StickyWebOnSwitchIn:: + savetarget + copybyte gBattlerTarget, sBATTLER + printstring STRINGID_STICKYWEBSWITCHIN + waitmessage 0x40 + statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_StickyWebOnSwitchInEnd + jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, 0x2, BattleScript_StickyWebOnSwitchInStatAnim + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x3, BattleScript_StickyWebOnSwitchInEnd + pause 0x20 + goto BattleScript_StickyWebOnSwitchInPrintStatMsg +BattleScript_StickyWebOnSwitchInStatAnim: + setgraphicalstatchangevalues + playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 +BattleScript_StickyWebOnSwitchInPrintStatMsg: + printfromtable gStatDownStringIds + waitmessage 0x40 +BattleScript_StickyWebOnSwitchInEnd: + restoretarget + return + BattleScript_PerishSongTakesLife:: printstring STRINGID_PKMNPERISHCOUNTFELL waitmessage 0x40 @@ -3517,6 +5761,21 @@ BattleScript_SpikesFree:: waitmessage 0x40 return +BattleScript_ToxicSpikesFree:: + printstring STRINGID_PKMNBLEWAWAYTOXICSPIKES + waitmessage 0x40 + return + +BattleScript_StickyWebFree:: + printstring STRINGID_PKMNBLEWAWAYSTICKYWEB + waitmessage 0x40 + return + +BattleScript_StealthRockFree:: + printstring STRINGID_PKMNBLEWAWAYSTEALTHROCK + waitmessage 0x40 + return + BattleScript_MonTookFutureAttack:: printstring STRINGID_PKMNTOOKATTACK waitmessage 0x40 @@ -3526,7 +5785,10 @@ BattleScript_MonTookFutureAttack:: BattleScript_CheckDoomDesireMiss:: accuracycheck BattleScript_FutureAttackMiss, MOVE_DOOM_DESIRE BattleScript_FutureAttackAnimate:: - adjustnormaldamage2 + critcalc + damagecalc + adjustdamage + jumpifmovehadnoeffect BattleScript_DoFutureAttackResult jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, 0x0, BattleScript_FutureHitAnimDoomDesire playanimation BS_ATTACKER, B_ANIM_FUTURE_SIGHT_HIT, NULL goto BattleScript_DoFutureAttackHit @@ -3538,6 +5800,9 @@ BattleScript_DoFutureAttackHit:: waitstate healthbarupdate BS_TARGET datahpupdate BS_TARGET + critmessage + waitmessage 0x40 +BattleScript_DoFutureAttackResult: resultmessage waitmessage 0x40 tryfaintmon BS_TARGET, FALSE, NULL @@ -3547,14 +5812,12 @@ BattleScript_FutureAttackEnd:: moveendfromto MOVEEND_ITEM_EFFECTS_ALL, MOVEEND_UPDATE_LAST_MOVES setbyte gMoveResultFlags, 0 end2 - BattleScript_FutureAttackMiss:: pause 0x20 - setbyte gMoveResultFlags, 0 - orbyte gMoveResultFlags, MOVE_RESULT_FAILED + sethword gMoveResultFlags, MOVE_RESULT_FAILED resultmessage waitmessage 0x40 - setbyte gMoveResultFlags, 0 + sethword gMoveResultFlags, 0 end2 BattleScript_NoMovesLeft:: @@ -3598,6 +5861,66 @@ BattleScript_SelectingNotAllowedMoveTauntInPalace:: printstring STRINGID_PKMNCANTUSEMOVETAUNT goto BattleScript_SelectingUnusableMoveInPalace +BattleScript_SelectingNotAllowedMoveThroatChop:: + printselectionstring STRINGID_PKMNCANTUSEMOVETHROATCHOP + endselectionscript + +BattleScript_MoveUsedIsThroatChopPrevented:: + printstring STRINGID_PKMNCANTUSEMOVETHROATCHOP + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_SelectingNotAllowedMoveThroatChopInPalace:: + printstring STRINGID_PKMNCANTUSEMOVETHROATCHOP + goto BattleScript_SelectingUnusableMoveInPalace + +BattleScript_ThroatChopEndTurn:: + printstring STRINGID_THROATCHOPENDS + waitmessage 0x40 + end2 + +BattleScript_SlowStartEnds:: + pause 0x5 + copybyte gBattlerAbility, gBattlerAttacker + call BattleScript_AbilityPopUp + printstring STRINGID_SLOWSTARTEND + waitmessage 0x40 + end2 + +BattleScript_SelectingNotAllowedMoveGravity:: + printselectionstring STRINGID_GRAVITYPREVENTSUSAGE + endselectionscript + +BattleScript_SelectingNotAllowedBelch:: + printselectionstring STRINGID_BELCHCANTSELECT + endselectionscript + +BattleScript_SelectingNotAllowedBelchInPalace:: + printstring STRINGID_BELCHCANTSELECT + goto BattleScript_SelectingUnusableMoveInPalace + +BattleScript_MoveUsedGravityPrevents:: + printstring STRINGID_GRAVITYPREVENTSUSAGE + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_SelectingNotAllowedMoveGravityInPalace:: + printstring STRINGID_GRAVITYPREVENTSUSAGE + goto BattleScript_SelectingUnusableMoveInPalace + +BattleScript_SelectingNotAllowedMoveHealBlock:: + printselectionstring STRINGID_HEALBLOCKPREVENTSUSAGE + endselectionscript + +BattleScript_MoveUsedHealBlockPrevents:: + printstring STRINGID_HEALBLOCKPREVENTSUSAGE + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_SelectingNotAllowedMoveHealBlockInPalace:: + printstring STRINGID_HEALBLOCKPREVENTSUSAGE + goto BattleScript_SelectingUnusableMoveInPalace + BattleScript_WishComesTrue:: trywish 0x1, BattleScript_WishButFullHp playanimation BS_TARGET, B_ANIM_WISH_HEAL, NULL @@ -3621,12 +5944,18 @@ BattleScript_WishButFullHp:: BattleScript_IngrainTurnHeal:: playanimation BS_ATTACKER, B_ANIM_INGRAIN_HEAL, NULL printstring STRINGID_PKMNABSORBEDNUTRIENTS +BattleScript_TurnHeal: waitmessage 0x40 orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER end2 +BattleScript_AquaRingHeal:: + playanimation BS_ATTACKER, B_ANIM_INGRAIN_HEAL, NULL + printstring STRINGID_AQUARINGHEAL + goto BattleScript_TurnHeal + BattleScript_PrintMonIsRooted:: pause 0x20 printstring STRINGID_PKMNANCHOREDITSELF @@ -3635,21 +5964,40 @@ BattleScript_PrintMonIsRooted:: BattleScript_AtkDefDown:: setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_ATK, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE | STAT_CHANGE_MULTIPLE_STATS + playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_ATK, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE | STAT_CHANGE_ONLY_MULTIPLE playstatchangeanimation BS_ATTACKER, BIT_ATK, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE setstatchanger STAT_ATK, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_BUFF_ALLOW_PTR, BattleScript_AtkDefDown_TryDef - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_AtkDefDown_TryDef + statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_BUFF_ALLOW_PTR, BattleScript_AtkDefDownTryDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_AtkDefDownTryDef printfromtable gStatDownStringIds waitmessage 0x40 -BattleScript_AtkDefDown_TryDef:: +BattleScript_AtkDefDownTryDef: playstatchangeanimation BS_ATTACKER, BIT_DEF, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE setstatchanger STAT_DEF, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_BUFF_ALLOW_PTR, BattleScript_AtkDefDown_End - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_AtkDefDown_End + statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_BUFF_ALLOW_PTR, BattleScript_AtkDefDownRet + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_AtkDefDownRet printfromtable gStatDownStringIds waitmessage 0x40 -BattleScript_AtkDefDown_End:: +BattleScript_AtkDefDownRet: + return + +BattleScript_DefSpDefDown:: + setbyte sSTAT_ANIM_PLAYED, FALSE + playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE | STAT_CHANGE_ONLY_MULTIPLE + playstatchangeanimation BS_ATTACKER, BIT_DEF, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE + setstatchanger STAT_DEF, 1, TRUE + statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_BUFF_ALLOW_PTR, BattleScript_DefSpDefDownTrySpDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_DefSpDefDownTrySpDef + printfromtable gStatDownStringIds + waitmessage 0x40 +BattleScript_DefSpDefDownTrySpDef:: + playstatchangeanimation BS_ATTACKER, BIT_SPDEF, STAT_CHANGE_CANT_PREVENT | STAT_CHANGE_NEGATIVE + setstatchanger STAT_SPDEF, 1, TRUE + statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_BUFF_ALLOW_PTR, BattleScript_DefSpDefDownRet + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_DefSpDefDownRet + printfromtable gStatDownStringIds + waitmessage 0x40 +BattleScript_DefSpDefDownRet:: return BattleScript_KnockedOff:: @@ -3680,7 +6028,7 @@ BattleScript_MagicCoatBounce:: attackstring ppreduce pause 0x20 - printstring STRINGID_PKMNMOVEBOUNCED + printfromtable gMagicCoatBounceStringIds waitmessage 0x40 orword gHitMarker, HITMARKER_ATTACKSTRING_PRINTED | HITMARKER_NO_PPDEDUCT | HITMARKER_x800000 setmagiccoattarget BS_ATTACKER @@ -3702,6 +6050,14 @@ BattleScript_EnduredMsg:: waitmessage 0x40 return +BattleScript_SturdiedMsg:: + copybyte gBattlerAbility, gBattlerTarget + pause 0x10 + call BattleScript_AbilityPopUp + printstring STRINGID_ENDUREDSTURDY + waitmessage 0x40 + return + BattleScript_OneHitKOMsg:: printstring STRINGID_ONEHITKO waitmessage 0x40 @@ -3718,6 +6074,11 @@ BattleScript_SAtkDown2:: BattleScript_SAtkDown2End:: return +BattleScript_MoveEffectClearSmog:: + printstring STRINGID_RESETSTARGETSSTATLEVELS + waitmessage 0x40 + return + BattleScript_FocusPunchSetUp:: printstring STRINGID_EMPTYSTRING3 waitmessage 0x1 @@ -3726,6 +6087,79 @@ BattleScript_FocusPunchSetUp:: waitmessage 0x40 end2 +BattleScript_MegaEvolution:: + printstring STRINGID_MEGAEVOREACTING + waitmessage 0x40 + setbyte gIsCriticalHit, 0 + handlemegaevo BS_ATTACKER, 0 + handlemegaevo BS_ATTACKER, 1 + playanimation BS_ATTACKER, B_ANIM_MEGA_EVOLUTION, NULL + waitanimation + handlemegaevo BS_ATTACKER, 2 + printstring STRINGID_MEGAEVOEVOLVED + waitmessage 0x40 + switchinabilities BS_ATTACKER + end2 + +BattleScript_AttackerFormChange:: + pause 0x5 + copybyte gBattlerAbility, gBattlerAttacker + call BattleScript_AbilityPopUp + printstring STRINGID_EMPTYSTRING3 + waitmessage 0x1 + handleformchange BS_ATTACKER, 0 + handleformchange BS_ATTACKER, 1 + playanimation BS_ATTACKER, B_ANIM_FORM_CHANGE, NULL + waitanimation + handleformchange BS_ATTACKER, 2 + return + +BattleScript_AttackerFormChangeEnd3:: + call BattleScript_AttackerFormChange + end3 + +BattleScript_TargetFormChange:: + pause 0x5 + copybyte gBattlerAbility, gBattlerTarget + call BattleScript_AbilityPopUp + printstring STRINGID_EMPTYSTRING3 + waitmessage 0x1 + handleformchange BS_TARGET, 0 + handleformchange BS_TARGET, 1 + playanimation BS_TARGET, B_ANIM_FORM_CHANGE, NULL + waitanimation + handleformchange BS_TARGET, 2 + return + +BattleScript_IllusionOff:: + spriteignore0hp TRUE + playanimation BS_TARGET, B_ANIM_ILLUSION_OFF, NULL + waitanimation + updatenick BS_TARGET + waitstate + spriteignore0hp FALSE + printstring STRINGID_ILLUSIONWOREOFF + waitmessage 0x40 + return + +BattleScript_AnticipationActivates:: + pause 0x5 + call BattleScript_AbilityPopUp + printstring STRINGID_ANTICIPATIONACTIVATES + waitmessage 0x40 + return + +BattleScript_AftermathDmg:: + pause 0x20 + call BattleScript_AbilityPopUp + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + healthbarupdate BS_ATTACKER + datahpupdate BS_ATTACKER + printstring STRINGID_AFTERMATHDMG + waitmessage 0x40 + tryfaintmon BS_ATTACKER, FALSE, NULL + return + BattleScript_MoveUsedIsAsleep:: printstring STRINGID_PKMNFASTASLEEP waitmessage 0x40 @@ -3750,13 +6184,23 @@ BattleScript_PoisonTurnDmg:: waitmessage 0x40 BattleScript_DoStatusTurnDmg:: statusanimation BS_ATTACKER -BattleScript_DoTurnDmg:: +BattleScript_DoTurnDmg: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER tryfaintmon BS_ATTACKER, FALSE, NULL atk24 BattleScript_DoTurnDmgEnd -BattleScript_DoTurnDmgEnd:: +BattleScript_DoTurnDmgEnd: + end2 + +BattleScript_PoisonHealActivates:: + printstring STRINGID_POISONHEALHPUP + waitmessage 0x40 + recordability BS_ATTACKER + statusanimation BS_ATTACKER + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + healthbarupdate BS_ATTACKER + datahpupdate BS_ATTACKER end2 BattleScript_BurnTurnDmg:: @@ -3789,10 +6233,43 @@ BattleScript_MoveUsedIsParalyzed:: cancelmultiturnmoves BS_ATTACKER goto BattleScript_MoveEnd +BattleScript_PowderMoveNoEffect:: + attackstring + ppreduce + pause 0x20 + jumpiftype BS_TARGET, TYPE_GRASS, BattleScript_PowderMoveNoEffectPrint + jumpifability BS_TARGET, ABILITY_OVERCOAT, BattleScript_PowderMoveNoEffectOvercoat + printstring STRINGID_SAFETYGOOGLESPROTECTED + goto BattleScript_PowderMoveNoEffectWaitMsg +BattleScript_PowderMoveNoEffectOvercoat: + call BattleScript_AbilityPopUp +BattleScript_PowderMoveNoEffectPrint: + printstring STRINGID_ITDOESNTAFFECT +BattleScript_PowderMoveNoEffectWaitMsg: + waitmessage 0x40 + cancelmultiturnmoves BS_ATTACKER + sethword gMoveResultFlags, MOVE_RESULT_FAILED + goto BattleScript_MoveEnd + BattleScript_MoveUsedFlinched:: printstring STRINGID_PKMNFLINCHED waitmessage 0x40 + jumpifability BS_ATTACKER ABILITY_STEADFAST BattleScript_TryActivateSteadFast +BattleScript_MoveUsedFlinchedEnd: goto BattleScript_MoveEnd +BattleScript_TryActivateSteadFast: + setstatchanger STAT_SPEED, 1, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_MoveUsedFlinchedEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_MoveUsedFlinchedEnd + copybyte gBattlerAbility, gBattlerAttacker + call BattleScript_AbilityPopUp + setgraphicalstatchangevalues + playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + setbyte gBattleCommunication STAT_SPEED + stattextbuffer BS_ATTACKER + printstring STRINGID_ATTACKERABILITYSTATRAISE + waitmessage 0x40 + goto BattleScript_MoveUsedFlinchedEnd BattleScript_PrintUproarOverTurns:: printfromtable gUproarOverTurnStringIds @@ -3812,7 +6289,7 @@ BattleScript_MoveUsedIsConfused:: jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x0, BattleScript_MoveUsedIsConfusedRet BattleScript_DoSelfConfusionDmg:: cancelmultiturnmoves BS_ATTACKER - adjustnormaldamage2 + adjustdamage printstring STRINGID_ITHURTCONFUSION waitmessage 0x40 effectivenesssound @@ -3828,6 +6305,25 @@ BattleScript_DoSelfConfusionDmg:: BattleScript_MoveUsedIsConfusedRet:: return +BattleScript_MoveUsedPowder:: + bicword gHitMarker, HITMARKER_NO_ATTACKSTRING | HITMARKER_ATTACKSTRING_PRINTED + attackstring + ppreduce + pause 0x20 + cancelmultiturnmoves BS_ATTACKER + status2animation BS_ATTACKER, STATUS2_POWDER + waitanimation + effectivenesssound + hitanimation BS_ATTACKER + waitstate + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + healthbarupdate BS_ATTACKER + datahpupdate BS_ATTACKER + printstring STRINGID_POWDEREXPLODES + waitmessage 0x40 + tryfaintmon BS_ATTACKER, FALSE, NULL + goto BattleScript_MoveEnd + BattleScript_MoveUsedIsConfusedNoMore:: printstring STRINGID_PKMNHEALEDCONFUSION waitmessage 0x40 @@ -3839,6 +6335,7 @@ BattleScript_PrintPayDayMoneyString:: return BattleScript_WrapTurnDmg:: + jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_DoTurnDmgEnd playanimation BS_ATTACKER, B_ANIM_TURN_TRAP, sB_ANIM_ARG1 printstring STRINGID_PKMNHURTBY waitmessage 0x40 @@ -3896,6 +6393,33 @@ BattleScript_YawnMakesAsleep:: makevisible BS_EFFECT_BATTLER end2 +BattleScript_EmbargoEndTurn:: + printstring STRINGID_EMBARGOENDS + waitmessage 0x40 + end2 + +BattleScript_TelekinesisEndTurn:: + printstring STRINGID_TELEKINESISENDS + waitmessage 0x40 + end2 + +BattleScript_BufferEndTurn:: + printstring STRINGID_BUFFERENDS + waitmessage 0x40 + end2 + +BattleScript_ToxicOrb:: + setbyte cMULTISTRING_CHOOSER, 0 + copybyte gEffectBattler, gBattlerAttacker + call BattleScript_MoveEffectToxic + end2 + +BattleScript_FlameOrb:: + setbyte cMULTISTRING_CHOOSER, 0 + copybyte gEffectBattler, gBattlerAttacker + call BattleScript_MoveEffectBurn + end2 + BattleScript_MoveEffectPoison:: statusanimation BS_EFFECT_BATTLER printfromtable gGotPoisonedStringIds @@ -3947,6 +6471,9 @@ BattleScript_MoveEffectConfusion:: waitmessage 0x40 return +BattleScript_MoveEffectRecoilWithStatus:: + argumentstatuseffect + copyword gBattleMoveDamage, sSAVED_DMG BattleScript_MoveEffectRecoil:: jumpifmove MOVE_STRUGGLE, BattleScript_DoRecoil jumpifability BS_ATTACKER, ABILITY_ROCK_HEAD, BattleScript_RecoilEnd @@ -3960,6 +6487,10 @@ BattleScript_DoRecoil:: BattleScript_RecoilEnd:: return +BattleScript_EffectWithChance:: + seteffectwithchance + return + BattleScript_ItemSteal:: playanimation BS_TARGET, B_ANIM_ITEM_STEAL, NULL printstring STRINGID_PKMNSTOLEITEM @@ -3968,34 +6499,162 @@ BattleScript_ItemSteal:: BattleScript_DrizzleActivates:: pause 0x20 + call BattleScript_AbilityPopUp printstring STRINGID_PKMNMADEITRAIN waitstate playanimation BS_BATTLER_0, B_ANIM_RAIN_CONTINUES, NULL call BattleScript_WeatherFormChanges end3 +BattleScript_DefiantActivates:: + pause 0x20 + call BattleScript_AbilityPopUp + statbuffchange 0, NULL + setgraphicalstatchangevalues + playanimation BS_ABILITY_BATTLER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + printstring STRINGID_PKMNSSTATCHANGED2 + waitmessage 0x40 + return + +BattleScript_AbilityPopUp: + showabilitypopup BS_ABILITY_BATTLER + recordability BS_ABILITY_BATTLER + pause 0x10 + return + BattleScript_SpeedBoostActivates:: + call BattleScript_AbilityPopUp playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printstring STRINGID_PKMNRAISEDSPEED waitmessage 0x40 end3 + +@ Can't compare directly to a value, have to compare to value at pointer +sZero: +.byte 0 + +BattleScript_MoodyActivates:: + call BattleScript_AbilityPopUp + jumpifbyteequal sSTATCHANGER, sZero, BattleScript_MoodyLower + statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_BUFF_NOT_PROTECT_AFFECTED, BattleScript_MoodyLower + jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, 0x1, BattleScript_MoodyLower + setgraphicalstatchangevalues + playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_MoodyLower: + jumpifbyteequal sSAVED_STAT_CHANGER, sZero, BattleScript_MoodyEnd + copybyte sSTATCHANGER, sSAVED_STAT_CHANGER + statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | STAT_BUFF_NOT_PROTECT_AFFECTED, BattleScript_MoodyEnd + jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, 0x1, BattleScript_MoodyEnd + setgraphicalstatchangevalues + playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + printfromtable gStatDownStringIds + waitmessage 0x40 +BattleScript_MoodyEnd: + end3 + +BattleScript_EmergencyExit:: + pause 0x5 + call BattleScript_AbilityPopUp + pause 0x40 +BattleScript_EmergencyExitNoPopUp:: + playanimation BS_TARGET, B_ANIM_SLIDE_OFFSCREEN, NULL + waitanimation + openpartyscreen BS_TARGET, BattleScript_EmergencyExitRet + switchoutabilities BS_TARGET + waitstate + switchhandleorder BS_TARGET, 2 + returntoball BS_TARGET + getswitchedmondata BS_TARGET + switchindataupdate BS_TARGET + hpthresholds BS_TARGET + printstring STRINGID_SWITCHINMON + switchinanim BS_TARGET, TRUE + waitstate + switchineffects BS_TARGET +BattleScript_EmergencyExitRet: + return + +BattleScript_EmergencyExitWild:: + pause 0x5 + call BattleScript_AbilityPopUp + pause 0x40 +BattleScript_EmergencyExitWildNoPopUp:: + playanimation BS_TARGET, B_ANIM_SLIDE_OFFSCREEN, NULL + waitanimation + setoutcomeonteleport BS_TARGET + finishaction + return BattleScript_TraceActivates:: pause 0x20 + call BattleScript_AbilityPopUp printstring STRINGID_PKMNTRACED waitmessage 0x40 + settracedability BS_SCRIPTING + switchinabilities BS_SCRIPTING + return + +BattleScript_TraceActivatesEnd3:: + call BattleScript_TraceActivates end3 -BattleScript_RainDishActivates:: +BattleScript_ReceiverActivates:: + call BattleScript_AbilityPopUp + printstring STRINGID_RECEIVERABILITYTAKEOVER + waitmessage 0x40 + settracedability BS_ABILITY_BATTLER + return + +BattleScript_AbilityHpHeal: + call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXRESTOREDHPALITTLE2 waitmessage 0x40 orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER + return + +BattleScript_RainDishActivates:: + call BattleScript_AbilityHpHeal + end3 + +BattleScript_CheekPouchActivates:: + copybyte sSAVED_BATTLER, gBattlerAttacker + copybyte gBattlerAttacker, gBattlerAbility + call BattleScript_AbilityHpHeal + copybyte gBattlerAttacker, sSAVED_BATTLER + return + +BattleScript_HarvestActivates:: + pause 0x5 + call BattleScript_AbilityPopUp + printstring STRINGID_HARVESTBERRY + waitmessage 0x40 + end3 + +BattleScript_SolarPowerActivates:: + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + call BattleScript_AbilityPopUp + healthbarupdate BS_ATTACKER + datahpupdate BS_ATTACKER + printstring STRINGID_SOLARPOWERHPDROP + waitmessage 0x40 + tryfaintmon BS_ATTACKER, FALSE, NULL + end3 + +BattleScript_HealerActivates:: + call BattleScript_AbilityPopUp + curestatus BS_SCRIPTING + updatestatusicon BS_SCRIPTING + printstring STRINGID_HEALERCURE + waitmessage 0x40 end3 BattleScript_SandstreamActivates:: pause 0x20 + call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXWHIPPEDUPSANDSTORM waitstate playanimation BS_BATTLER_0, B_ANIM_SANDSTORM_CONTINUES, NULL @@ -4003,6 +6662,7 @@ BattleScript_SandstreamActivates:: end3 BattleScript_ShedSkinActivates:: + call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXCUREDYPROBLEM waitmessage 0x40 updatestatusicon BS_ATTACKER @@ -4021,11 +6681,29 @@ BattleScript_CastformChange:: end3 BattleScript_DoCastformChange:: + copybyte gBattlerAbility, sBATTLER + call BattleScript_AbilityPopUp docastformchangeanimation waitstate printstring STRINGID_PKMNTRANSFORMED waitmessage 0x40 return + +BattleScript_TryAdrenalineOrb: + jumpifnoholdeffect BS_TARGET, HOLD_EFFECT_ADRENALINE_ORB, BattleScript_TryAdrenalineOrbRet + jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPEED, 12, BattleScript_TryAdrenalineOrbRet + setstatchanger STAT_SPEED, 1, FALSE + statbuffchange STAT_BUFF_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN | STAT_BUFF_ALLOW_PTR, BattleScript_TryAdrenalineOrbRet + playanimation BS_TARGET, B_ANIM_HELD_ITEM_EFFECT, NULL + setgraphicalstatchangevalues + playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + copybyte sBATTLER, gBattlerTarget + setlastuseditem BS_TARGET + printstring STRINGID_USINGXTHEYOFZN + waitmessage 0x40 + removeitem BS_TARGET +BattleScript_TryAdrenalineOrbRet: + return BattleScript_IntimidateActivatesEnd3:: call BattleScript_PauseIntimidateActivates @@ -4035,8 +6713,9 @@ BattleScript_PauseIntimidateActivates: pause 0x20 BattleScript_IntimidateActivates:: setbyte gBattlerTarget, 0x0 - setstatchanger STAT_ATK, 1, TRUE + call BattleScript_AbilityPopUp BattleScript_IntimidateActivatesLoop: + setstatchanger STAT_ATK, 1, TRUE trygetintimidatetarget BattleScript_IntimidateActivatesReturn jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_IntimidateActivatesLoopIncrement jumpifability BS_TARGET, ABILITY_CLEAR_BODY, BattleScript_IntimidatePrevented @@ -4048,6 +6727,7 @@ BattleScript_IntimidateActivatesLoop: playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printstring STRINGID_PKMNCUTSATTACKWITH waitmessage 0x40 + call BattleScript_TryAdrenalineOrb BattleScript_IntimidateActivatesLoopIncrement: addbyte gBattlerTarget, 0x1 goto BattleScript_IntimidateActivatesLoop @@ -4057,16 +6737,79 @@ BattleScript_IntimidatePrevented: pause 0x20 printstring STRINGID_PREVENTEDFROMWORKING waitmessage 0x40 + call BattleScript_TryAdrenalineOrb goto BattleScript_IntimidateActivatesLoopIncrement - + BattleScript_DroughtActivates:: pause 0x20 + call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXINTENSIFIEDSUN waitstate playanimation BS_BATTLER_0, B_ANIM_SUN_CONTINUES, NULL call BattleScript_WeatherFormChanges end3 +BattleScript_SnowWarningActivates:: + pause 0x20 + call BattleScript_AbilityPopUp + printstring STRINGID_SNOWWARNINGHAIL + waitstate + playanimation BS_BATTLER_0, B_ANIM_HAIL_CONTINUES, NULL + call BattleScript_WeatherFormChanges + end3 + +BattleScript_ElectricSurgeActivates:: + pause 0x20 + call BattleScript_AbilityPopUp + printstring STRINGID_TERRAINBECOMESELECTRIC + waitstate + playanimation BS_SCRIPTING, B_ANIM_TERRAIN_ELECTRIC, NULL + end3 + +BattleScript_MistySurgeActivates:: + pause 0x20 + call BattleScript_AbilityPopUp + printstring STRINGID_TERRAINBECOMESMISTY + waitstate + playanimation BS_SCRIPTING, B_ANIM_TERRAIN_MISTY, NULL + end3 + +BattleScript_GrassySurgeActivates:: + pause 0x20 + call BattleScript_AbilityPopUp + printstring STRINGID_TERRAINBECOMESGRASSY + waitstate + playanimation BS_SCRIPTING, B_ANIM_TERRAIN_GRASSY, NULL + end3 + +BattleScript_PsychicSurgeActivates:: + pause 0x20 + call BattleScript_AbilityPopUp + printstring STRINGID_TERRAINBECOMESPSYCHIC + waitstate + playanimation BS_SCRIPTING, B_ANIM_TERRAIN_PSYCHIC, NULL + end3 + +BattleScript_BadDreamsActivates:: + setbyte gBattlerTarget, 0 + call BattleScript_AbilityPopUp +BattleScript_BadDreamsLoop: + trygetbaddreamstarget BattleScript_BadDreamsEnd + dmg_1_8_targethp + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + printstring STRINGID_BADDREAMSDMG + waitmessage 0x40 + jumpifability BS_TARGET, ABILITY_MAGIC_GUARD, BattleScript_BadDreamsIncrement + healthbarupdate BS_TARGET + datahpupdate BS_TARGET + tryfaintmon BS_TARGET, FALSE, NULL + atk24 BattleScript_BadDreamsIncrement +BattleScript_BadDreamsIncrement: + addbyte gBattlerTarget, 1 + goto BattleScript_BadDreamsLoop +BattleScript_BadDreamsEnd: + end3 + BattleScript_TookAttack:: attackstring pause 0x20 @@ -4077,27 +6820,46 @@ BattleScript_TookAttack:: BattleScript_SturdyPreventsOHKO:: pause 0x20 + call BattleScript_AbilityPopUp printstring STRINGID_PKMNPROTECTEDBY pause 0x40 goto BattleScript_MoveEnd BattleScript_DampStopsExplosion:: pause 0x20 + copybyte gBattlerAbility, gBattlerTarget + call BattleScript_AbilityPopUp printstring STRINGID_PKMNPREVENTSUSAGE pause 0x40 - goto BattleScript_MoveEnd + moveendto MOVEEND_NEXT_TARGET + moveendcase MOVEEND_CLEAR_BITS + end BattleScript_MoveHPDrain_PPLoss:: ppreduce BattleScript_MoveHPDrain:: attackstring pause 0x20 + call BattleScript_AbilityPopUp orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_TARGET datahpupdate BS_TARGET printstring STRINGID_PKMNRESTOREDHPUSING waitmessage 0x40 - orbyte gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE + orhalfword gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE + goto BattleScript_MoveEnd + +BattleScript_MoveStatDrain_PPLoss:: + ppreduce +BattleScript_MoveStatDrain:: + attackstring + pause 0x20 + call BattleScript_AbilityPopUp + setgraphicalstatchangevalues + playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + waitanimation + printstring STRINGID_TARGETABILITYSTATRAISE + waitmessage 0x40 goto BattleScript_MoveEnd BattleScript_MonMadeMoveUseless_PPLoss:: @@ -4105,9 +6867,10 @@ BattleScript_MonMadeMoveUseless_PPLoss:: BattleScript_MonMadeMoveUseless:: attackstring pause 0x20 + call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXMADEYUSELESS waitmessage 0x40 - orbyte gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE + orhalfword gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE goto BattleScript_MoveEnd BattleScript_FlashFireBoost_PPLoss:: @@ -4115,18 +6878,21 @@ BattleScript_FlashFireBoost_PPLoss:: BattleScript_FlashFireBoost:: attackstring pause 0x20 + call BattleScript_AbilityPopUp printfromtable gFlashFireStringIds waitmessage 0x40 goto BattleScript_MoveEnd BattleScript_AbilityPreventsPhasingOut:: pause 0x20 + call BattleScript_AbilityPopUp printstring STRINGID_PKMNANCHORSITSELFWITH waitmessage 0x40 goto BattleScript_MoveEnd BattleScript_AbilityNoStatLoss:: pause 0x20 + call BattleScript_AbilityPopUp printstring STRINGID_PKMNPREVENTSSTATLOSSWITH waitmessage 0x40 return @@ -4151,18 +6917,21 @@ BattleScript_PSNPrevention:: BattleScript_ObliviousPreventsAttraction:: pause 0x20 + call BattleScript_AbilityPopUp printstring STRINGID_PKMNPREVENTSROMANCEWITH waitmessage 0x40 goto BattleScript_MoveEnd BattleScript_FlinchPrevention:: pause 0x20 + call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXPREVENTSFLINCHING waitmessage 0x40 goto BattleScript_MoveEnd BattleScript_OwnTempoPrevents:: pause 0x20 + call BattleScript_AbilityPopUp printstring STRINGID_PKMNPREVENTSCONFUSIONWITH waitmessage 0x40 goto BattleScript_MoveEnd @@ -4171,12 +6940,47 @@ BattleScript_SoundproofProtected:: attackstring ppreduce pause 0x20 + call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXBLOCKSY waitmessage 0x40 goto BattleScript_MoveEnd +BattleScript_DazzlingProtected:: + attackstring + ppreduce + pause 0x20 + call BattleScript_AbilityPopUp + printstring STRINGID_POKEMONCANNOTUSEMOVE + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_MoveUsedPsychicTerrainPrevents:: + printstring STRINGID_POKEMONCANNOTUSEMOVE + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_GrassyTerrainHeals:: + setbyte gBattleCommunication, 0 +BattleScript_GrassyTerrainLoop: + copyarraywithindex gBattlerAttacker, gBattlerByTurnOrder, gBattleCommunication, 0x1 + checkgrassyterrainheal BS_ATTACKER, BattleScript_GrassyTerrainLoopIncrement + printstring STRINGID_GRASSYTERRAINHEALS + waitmessage 0x40 +BattleScript_GrassyTerrainHpChange: + orword gHitMarker, HITMARKER_x20 | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + healthbarupdate BS_ATTACKER + datahpupdate BS_ATTACKER +BattleScript_GrassyTerrainLoopIncrement:: + addbyte gBattleCommunication, 0x1 + jumpifbytenotequal gBattleCommunication, gBattlersCount, BattleScript_GrassyTerrainLoop +BattleScript_GrassyTerrainLoopEnd:: + bicword gHitMarker, HITMARKER_x20 | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + jumpifbyte CMP_EQUAL, gFieldTimers + 5, 0x0, BattleScript_GrassyTerrainEnds + end2 + BattleScript_AbilityNoSpecificStatLoss:: pause 0x20 + call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXPREVENTSYLOSS waitmessage 0x40 setbyte cMULTISTRING_CHOOSER, 0x3 @@ -4184,16 +6988,152 @@ BattleScript_AbilityNoSpecificStatLoss:: BattleScript_StickyHoldActivates:: pause 0x20 + call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXMADEYINEFFECTIVE waitmessage 0x40 goto BattleScript_MoveEnd BattleScript_ColorChangeActivates:: + call BattleScript_AbilityPopUp printstring STRINGID_PKMNCHANGEDTYPEWITH waitmessage 0x40 return -BattleScript_RoughSkinActivates:: +BattleScript_ProteanActivates:: + call BattleScript_AbilityPopUp + printstring STRINGID_PKMNCHANGEDTYPE + waitmessage 0x40 + return + +BattleScript_CursedBodyActivates:: + call BattleScript_AbilityPopUp + printstring STRINGID_CUSEDBODYDISABLED + waitmessage 0x40 + return + +BattleScript_MummyActivates:: + call BattleScript_AbilityPopUp + printstring STRINGID_ATTACKERACQUIREDABILITY + waitmessage 0x40 + return + +BattleScript_AngryPointActivates:: + call BattleScript_AbilityPopUp + statbuffchange STAT_BUFF_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, NULL + setgraphicalstatchangevalues + playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + printstring STRINGID_ANGRYPOINTACTIVATES + waitmessage 0x40 + return + +BattleScript_TargetAbilityStatRaise:: + call BattleScript_AbilityPopUp + statbuffchange STAT_BUFF_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, NULL + setgraphicalstatchangevalues + playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + waitanimation + printstring STRINGID_TARGETABILITYSTATRAISE + waitmessage 0x40 + return + +BattleScript_ScriptingAbilityStatRaise:: + copybyte gBattlerAbility, sBATTLER + call BattleScript_AbilityPopUp + copybyte sSAVED_DMG, gBattlerAttacker + copybyte gBattlerAttacker, sBATTLER + statbuffchange STAT_BUFF_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, NULL + setgraphicalstatchangevalues + playanimation BS_SCRIPTING, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + waitanimation + printstring STRINGID_ATTACKERABILITYSTATRAISE + waitmessage 0x40 + copybyte gBattlerAttacker, sSAVED_DMG + return + +BattleScript_WeakArmorActivates:: + call BattleScript_AbilityPopUp + setstatchanger STAT_DEF, 1, TRUE + statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_WeakArmorActivatesSpeed + jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, 0x2, BattleScript_WeakArmorDefAnim + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x3, BattleScript_WeakArmorActivatesSpeed + pause 0x10 + printfromtable gStatDownStringIds + waitmessage 0x40 + goto BattleScript_WeakArmorActivatesSpeed +BattleScript_WeakArmorDefAnim: + setgraphicalstatchangevalues + playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + printstring STRINGID_TARGETABILITYSTATLOWER + waitmessage 0x40 +BattleScript_WeakArmorActivatesSpeed: + setstatchanger STAT_SPEED, 2, FALSE + statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_WeakArmorActivatesEnd + jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, 0x2, BattleScript_WeakArmorSpeedAnim + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x3, BattleScript_WeakArmorActivatesEnd + pause 0x10 + printstring STRINGID_TARGETSTATWONTGOHIGHER + waitmessage 0x40 + goto BattleScript_WeakArmorActivatesEnd +BattleScript_WeakArmorSpeedAnim: + setgraphicalstatchangevalues + playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + printstring STRINGID_TARGETABILITYSTATRAISE + waitmessage 0x40 +BattleScript_WeakArmorActivatesEnd: + return + +BattleScript_AttackerAbilityStatRaise:: + copybyte gBattlerAbility, gBattlerAttacker + call BattleScript_AbilityPopUp + setgraphicalstatchangevalues + playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + waitanimation + printstring STRINGID_ATTACKERABILITYSTATRAISE + waitmessage 0x40 + return + +BattleScript_FellStingerRaisesStat:: + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_FellStingerRaisesAtkEnd + jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, 0x1, BattleScript_FellStingerRaisesAtkEnd + setgraphicalstatchangevalues + playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_FellStingerRaisesAtkEnd: + return + +BattleScript_AttackerAbilityStatRaiseEnd3:: + call BattleScript_AttackerAbilityStatRaise + end3 + +BattleScript_SwitchInAbilityMsg:: + call BattleScript_AbilityPopUp + printfromtable gSwitchInAbilityStringIds + waitmessage 0x40 + end3 + +BattleScript_FriskMsgWithPopup:: + copybyte gBattlerAbility, gBattlerAttacker + call BattleScript_AbilityPopUp +BattleScript_FriskMsg:: + printstring STRINGID_FRISKACTIVATES + waitmessage 0x40 + return + +BattleScript_FriskActivates:: + tryfriskmsg BS_ATTACKER + end3 + +BattleScript_ImposterActivates:: + transformdataexecution + call BattleScript_AbilityPopUp + playmoveanimation BS_ATTACKER, MOVE_TRANSFORM + waitanimation + printstring STRINGID_IMPOSTERTRANSFORM + waitmessage 0x40 + end3 + +BattleScript_HurtAttacker: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER @@ -4202,19 +7142,72 @@ BattleScript_RoughSkinActivates:: tryfaintmon BS_ATTACKER, FALSE, NULL return +BattleScript_RoughSkinActivates:: + call BattleScript_AbilityPopUp + call BattleScript_HurtAttacker + return + +BattleScript_RockyHelmetActivates:: + @ don't play the animation for a fainted mon + jumpifabsent BS_TARGET, BattleScript_RockyHelmetActivatesDmg + playanimation BS_TARGET, B_ANIM_HELD_ITEM_EFFECT, NULL + waitanimation +BattleScript_RockyHelmetActivatesDmg: + call BattleScript_HurtAttacker + return + +BattleScript_SpikyShieldEffect:: + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT + healthbarupdate BS_ATTACKER + datahpupdate BS_ATTACKER + printstring STRINGID_PKMNHURTSWITH + waitmessage 0x40 + tryfaintmon BS_ATTACKER, FALSE, NULL + return + +BattleScript_KingsShieldEffect:: + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT + seteffectsecondary + setmoveeffect 0 + copybyte sBATTLER, gBattlerTarget + copybyte gBattlerTarget, gBattlerAttacker + copybyte gBattlerAttacker, sBATTLER + return + +BattleScript_BanefulBunkerEffect:: + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_SAFEGUARD | HITMARKER_x100000 + bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT + seteffectsecondary + setmoveeffect 0 + return + BattleScript_CuteCharmActivates:: + call BattleScript_AbilityPopUp status2animation BS_ATTACKER, STATUS2_INFATUATION printstring STRINGID_PKMNSXINFATUATEDY waitmessage 0x40 + call BattleScript_TryDestinyKnotTarget return -BattleScript_ApplySecondaryEffect:: +BattleScript_AbilityStatusEffect:: waitstate + call BattleScript_AbilityPopUp seteffectsecondary return +BattleScript_DancerActivates:: + call BattleScript_AbilityPopUp + waitmessage 0x20 + setbyte sB_ANIM_TURN, 0x0 + setbyte sB_ANIM_TARGETS_HIT, 0x0 + orword gHitMarker, HITMARKER_x800000 + jumptocalledmove TRUE + BattleScript_SynchronizeActivates:: waitstate + call BattleScript_AbilityPopUp seteffectprimary return @@ -4225,6 +7218,7 @@ BattleScript_NoItemSteal:: return BattleScript_AbilityCuredStatus:: + call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXCUREDITSYPROBLEM waitmessage 0x40 updatestatusicon BS_SCRIPTING @@ -4242,6 +7236,7 @@ BattleScript_IgnoresAndUsesRandomMove:: jumptocalledmove FALSE BattleScript_MoveUsedLoafingAround:: + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x0, BattleScript_82DB6C7 jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, 0x4, BattleScript_82DB6C7 setbyte gBattleCommunication, 0x0 various24 BS_ATTACKER @@ -4250,7 +7245,10 @@ BattleScript_82DB6C7:: printfromtable gInobedientStringIds waitmessage 0x40 moveendto MOVEEND_NEXT_TARGET - end + end +BattleScript_TruantLoafingAround:: + call BattleScript_AbilityPopUp + goto BattleScript_82DB6C7 BattleScript_IgnoresAndFallsAsleep:: printstring STRINGID_PKMNBEGANTONAP @@ -4330,6 +7328,27 @@ BattleScript_BerryCureSlpRet:: removeitem BS_SCRIPTING return +BattleScript_GemActivates:: + playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, NULL + waitanimation + printstring STRINGID_GEMACTIVATES + waitmessage 0x40 + removeitem BS_ATTACKER + return + +BattleScript_BerryReduceDmg:: + playanimation BS_TARGET, B_ANIM_HELD_ITEM_EFFECT, NULL + waitanimation + printstring STRINGID_TARGETATEITEM + waitmessage 0x40 + removeitem BS_TARGET + return + +BattleScript_PrintBerryReduceString:: + waitmessage 0x40 + printstring STRINGID_BERRYDMGREDUCES + return + BattleScript_BerryCureConfusionEnd2:: call BattleScript_BerryCureConfusionRet end2 @@ -4363,8 +7382,17 @@ BattleScript_WhiteHerbRet:: waitmessage 0x40 removeitem BS_SCRIPTING return - -BattleScript_ItemHealHP_RemoveItem:: + +BattleScript_ItemHealHP_RemoveItemRet:: + playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT, NULL + printstring STRINGID_PKMNSITEMRESTOREDHEALTH + waitmessage 0x40 + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE + healthbarupdate BS_SCRIPTING + datahpupdate BS_SCRIPTING + removeitem BS_SCRIPTING + return +BattleScript_ItemHealHP_RemoveItemEnd2:: playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, NULL printstring STRINGID_PKMNSITEMRESTOREDHEALTH waitmessage 0x40 @@ -4385,6 +7413,32 @@ BattleScript_ItemHealHP_End2:: call BattleScript_ItemHealHP_Ret end2 +BattleScript_AirBaloonMsgIn:: + printstring STRINGID_AIRBALLOONFLOAT + waitmessage 0x40 + end3 + +BattleScript_AirBaloonMsgPop:: + printstring STRINGID_AIRBALLOONPOP + waitmessage 0x40 + removeitem BS_TARGET + return + +BattleScript_ItemHurtRet:: + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + healthbarupdate BS_ATTACKER + datahpupdate BS_ATTACKER + printstring STRINGID_HURTBYITEM + waitmessage 0x40 + tryfaintmon BS_ATTACKER, FALSE, NULL + return + +BattleScript_ItemHurtEnd2:: + playanimation BS_ATTACKER, B_ANIM_MON_HIT, NULL + waitanimation + call BattleScript_ItemHurtRet + end2 + BattleScript_ItemHealHP_Ret:: playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, NULL printstring STRINGID_PKMNSITEMRESTOREDHPALITTLE @@ -4398,10 +7452,17 @@ BattleScript_SelectingNotAllowedMoveChoiceItem:: printselectionstring STRINGID_ITEMALLOWSONLYYMOVE endselectionscript -BattleScript_FocusBandActivates:: - playanimation BS_TARGET, B_ANIM_FOCUS_BAND, NULL +BattleScript_SelectingNotAllowedMoveAssaultVest:: + printselectionstring STRINGID_ASSAULTVESTDOESNTALLOW + endselectionscript + +BattleScript_HangedOnMsg:: + playanimation BS_TARGET, B_ANIM_HANGED_ON, NULL printstring STRINGID_PKMNHUNGONWITHX waitmessage 0x40 + jumpifnoholdeffect BS_TARGET, HOLD_EFFECT_FOCUS_SASH, BattleScript_HangedOnMsgRet + removeitem BS_TARGET +BattleScript_HangedOnMsgRet: return BattleScript_BerryConfuseHealEnd2:: @@ -4469,7 +7530,7 @@ BattleScript_ArenaTurnBeginning:: various15 BS_ATTACKER volumeup end2 - + BattleScript_82DB8E0:: @ Unused battlescript playse SE_DING_DONG various14 BS_ATTACKER diff --git a/data/battle_scripts_2.s b/data/battle_scripts_2.s index caa6cddac9..88c81928db 100644 --- a/data/battle_scripts_2.s +++ b/data/battle_scripts_2.s @@ -2,6 +2,7 @@ #include "constants/battle_script_commands.h" #include "constants/battle_anim.h" #include "constants/battle_string_ids.h" +#include "constants/battle_config.h" #include "constants/items.h" #include "constants/songs.h" #include "constants/game_stat.h" @@ -62,10 +63,16 @@ BattleScript_SafariBallThrow:: handleballthrow BattleScript_SuccessBallThrow:: + setbyte sMON_CAUGHT, TRUE jumpifhalfword CMP_EQUAL, gLastUsedItem, ITEM_SAFARI_BALL, BattleScript_PrintCaughtMonInfo incrementgamestat GAME_STAT_POKEMON_CAPTURES BattleScript_PrintCaughtMonInfo:: printstring STRINGID_GOTCHAPKMNCAUGHT + jumpifbyte CMP_NOT_EQUAL, sEXP_CATCH, TRUE, BattleScript_TryPrintCaughtMonInfo + setbyte sGIVEEXP_STATE, 0x0 + getexp BS_TARGET + sethword gBattle_BG2_X, 0x0 +BattleScript_TryPrintCaughtMonInfo: trysetcaughtmondexflags BattleScript_TryNicknameCaughtMon printstring STRINGID_PKMNDATAADDEDTODEX waitstate @@ -121,6 +128,7 @@ BattleScript_OpponentUsesHealItem:: playse SE_USE_ITEM printstring STRINGID_TRAINER1USEDITEM waitmessage 0x40 + bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT useitemonopponent orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_ATTACKER @@ -205,3 +213,17 @@ BattleScript_ActionWallyThrow: printstring STRINGID_YOUTHROWABALLNOWRIGHT waitmessage 0x40 end2 + +BattleScript_TrainerSlideMsgRet:: + handletrainerslidemsg BS_SCRIPTING, 0 + trainerslidein 1 + handletrainerslidemsg BS_SCRIPTING, 1 + waitstate + trainerslideout 1 + handletrainerslidemsg BS_SCRIPTING, 2 + waitstate + return + +BattleScript_TrainerSlideMsgEnd2:: + call BattleScript_TrainerSlideMsgRet + end2 diff --git a/graphics/battle_anims/backgrounds/dark_void.bin b/graphics/battle_anims/backgrounds/dark_void.bin new file mode 100644 index 0000000000..922b72bc74 Binary files /dev/null and b/graphics/battle_anims/backgrounds/dark_void.bin differ diff --git a/graphics/battle_anims/backgrounds/dark_void.pal b/graphics/battle_anims/backgrounds/dark_void.pal new file mode 100644 index 0000000000..f4cf0f09d3 --- /dev/null +++ b/graphics/battle_anims/backgrounds/dark_void.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +131 131 131 +123 123 123 +115 115 115 +106 106 106 +98 98 98 +82 82 82 +65 65 65 +49 49 49 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/dark_void.png b/graphics/battle_anims/backgrounds/dark_void.png new file mode 100644 index 0000000000..2922f89d3f Binary files /dev/null and b/graphics/battle_anims/backgrounds/dark_void.png differ diff --git a/graphics/battle_anims/backgrounds/giga_impact.pal b/graphics/battle_anims/backgrounds/giga_impact.pal new file mode 100644 index 0000000000..944174076e --- /dev/null +++ b/graphics/battle_anims/backgrounds/giga_impact.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +255 214 0 +255 197 0 +255 173 0 +255 165 0 +148 90 222 +255 107 0 +255 132 0 +255 148 0 +255 156 41 +0 0 0 +0 90 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/magma_storm.pal b/graphics/battle_anims/backgrounds/magma_storm.pal new file mode 100644 index 0000000000..944174076e --- /dev/null +++ b/graphics/battle_anims/backgrounds/magma_storm.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +255 214 0 +255 197 0 +255 173 0 +255 165 0 +148 90 222 +255 107 0 +255 132 0 +255 148 0 +255 156 41 +0 0 0 +0 90 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/aeroblast.pal b/graphics/battle_anims/backgrounds/new/aeroblast.pal new file mode 100644 index 0000000000..e0b1af5bfb --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/aeroblast.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +172 222 230 +164 213 230 +148 205 222 +131 205 222 +123 197 213 +115 189 205 +98 180 197 +90 180 197 +82 172 189 +74 164 180 +65 156 180 +57 131 156 +49 115 131 +41 82 106 +24 74 82 diff --git a/graphics/battle_anims/backgrounds/new/aeroblast_map.bin b/graphics/battle_anims/backgrounds/new/aeroblast_map.bin new file mode 100644 index 0000000000..a7275a0747 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/aeroblast_map.bin differ diff --git a/graphics/battle_anims/backgrounds/new/aeroblast_tiles.png b/graphics/battle_anims/backgrounds/new/aeroblast_tiles.png new file mode 100644 index 0000000000..33af8f4826 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/aeroblast_tiles.png differ diff --git a/graphics/battle_anims/backgrounds/new/aura_sphere.pal b/graphics/battle_anims/backgrounds/new/aura_sphere.pal new file mode 100644 index 0000000000..238493462b --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/aura_sphere.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +246 205 82 +238 205 74 +238 205 57 +246 222 123 +238 205 57 +238 197 49 +230 189 24 +246 213 82 +255 222 131 +255 213 115 +255 213 106 +255 213 90 +246 213 82 +255 230 156 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/blackhole_eclipse.bin b/graphics/battle_anims/backgrounds/new/blackhole_eclipse.bin new file mode 100644 index 0000000000..27457c9a16 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/blackhole_eclipse.bin differ diff --git a/graphics/battle_anims/backgrounds/new/blackhole_eclipse.png b/graphics/battle_anims/backgrounds/new/blackhole_eclipse.png new file mode 100644 index 0000000000..3cfd58625e Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/blackhole_eclipse.png differ diff --git a/graphics/battle_anims/backgrounds/new/bloom_doom.bin b/graphics/battle_anims/backgrounds/new/bloom_doom.bin new file mode 100644 index 0000000000..3d27e56272 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/bloom_doom.bin differ diff --git a/graphics/battle_anims/backgrounds/new/bloom_doom.pal b/graphics/battle_anims/backgrounds/new/bloom_doom.pal new file mode 100644 index 0000000000..834088c8fa --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/bloom_doom.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 0 +131 230 255 +106 213 255 +98 205 255 +57 156 180 +8 115 123 +180 189 172 +156 180 164 +115 164 131 +74 131 106 +49 106 65 +0 106 74 +0 90 49 +0 82 24 +0 65 0 +0 32 0 diff --git a/graphics/battle_anims/backgrounds/new/bloom_doom.png b/graphics/battle_anims/backgrounds/new/bloom_doom.png new file mode 100644 index 0000000000..de5553ec6e Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/bloom_doom.png differ diff --git a/graphics/battle_anims/backgrounds/new/bolt_strike.bin b/graphics/battle_anims/backgrounds/new/bolt_strike.bin new file mode 100644 index 0000000000..7a42421cfe Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/bolt_strike.bin differ diff --git a/graphics/battle_anims/backgrounds/new/bolt_strike.pal b/graphics/battle_anims/backgrounds/new/bolt_strike.pal new file mode 100644 index 0000000000..4c3d1dcf10 --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/bolt_strike.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 8 8 +255 255 255 +222 246 246 +189 230 230 +156 213 213 +131 205 205 +115 189 189 +90 172 172 +65 156 156 +49 139 139 +32 123 123 +16 98 98 +0 74 74 +0 49 49 +0 32 32 +0 16 16 diff --git a/graphics/battle_anims/backgrounds/new/bolt_strike.png b/graphics/battle_anims/backgrounds/new/bolt_strike.png new file mode 100644 index 0000000000..4d5f8c6d99 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/bolt_strike.png differ diff --git a/graphics/battle_anims/backgrounds/new/clangorous_soulblaze.bin b/graphics/battle_anims/backgrounds/new/clangorous_soulblaze.bin new file mode 100644 index 0000000000..20e82ac1a3 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/clangorous_soulblaze.bin differ diff --git a/graphics/battle_anims/backgrounds/new/clangorous_soulblaze.pal b/graphics/battle_anims/backgrounds/new/clangorous_soulblaze.pal new file mode 100644 index 0000000000..3470d8818f --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/clangorous_soulblaze.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 255 +246 189 49 +246 172 41 +238 156 32 +222 131 24 +205 115 8 +197 65 0 +180 57 0 +172 90 65 +156 74 49 +148 65 24 +139 74 49 +123 65 32 +98 49 32 +82 32 16 +74 24 8 diff --git a/graphics/battle_anims/backgrounds/new/clangorous_soulblaze.png b/graphics/battle_anims/backgrounds/new/clangorous_soulblaze.png new file mode 100644 index 0000000000..abaf8576d8 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/clangorous_soulblaze.png differ diff --git a/graphics/battle_anims/backgrounds/new/dark_void.bin b/graphics/battle_anims/backgrounds/new/dark_void.bin new file mode 100644 index 0000000000..922b72bc74 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/dark_void.bin differ diff --git a/graphics/battle_anims/backgrounds/new/dark_void.pal b/graphics/battle_anims/backgrounds/new/dark_void.pal new file mode 100644 index 0000000000..f4cf0f09d3 --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/dark_void.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +131 131 131 +123 123 123 +115 115 115 +106 106 106 +98 98 98 +82 82 82 +65 65 65 +49 49 49 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/dark_void.png b/graphics/battle_anims/backgrounds/new/dark_void.png new file mode 100644 index 0000000000..2922f89d3f Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/dark_void.png differ diff --git a/graphics/battle_anims/backgrounds/new/dynamax_cannon.pal b/graphics/battle_anims/backgrounds/new/dynamax_cannon.pal new file mode 100644 index 0000000000..64a2e4566b --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/dynamax_cannon.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 164 255 +255 106 139 +255 131 222 +255 139 230 +255 164 238 +255 189 255 +255 205 255 +246 230 255 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/electric_terrain.bin b/graphics/battle_anims/backgrounds/new/electric_terrain.bin new file mode 100644 index 0000000000..2c3c757cd2 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/electric_terrain.bin differ diff --git a/graphics/battle_anims/backgrounds/new/electric_terrain.pal b/graphics/battle_anims/backgrounds/new/electric_terrain.pal new file mode 100644 index 0000000000..5a56667e40 --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/electric_terrain.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +238 24 32 +255 246 205 +246 246 222 +246 238 189 +238 238 213 +238 238 205 +238 230 197 +230 230 180 +230 222 164 +230 222 172 +222 213 139 +213 205 123 +213 205 115 +205 197 106 +197 189 106 +57 49 65 diff --git a/graphics/battle_anims/backgrounds/new/electric_terrain.png b/graphics/battle_anims/backgrounds/new/electric_terrain.png new file mode 100644 index 0000000000..c84ecaccdf Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/electric_terrain.png differ diff --git a/graphics/battle_anims/backgrounds/new/fire1.bin b/graphics/battle_anims/backgrounds/new/fire1.bin new file mode 100644 index 0000000000..9b0c40159a Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/fire1.bin differ diff --git a/graphics/battle_anims/backgrounds/new/fire1.pal b/graphics/battle_anims/backgrounds/new/fire1.pal new file mode 100644 index 0000000000..505606066c --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/fire1.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +255 255 0 +255 156 0 +255 98 0 +255 49 0 +246 57 16 +238 65 16 +180 65 24 +123 49 24 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/fire1.png b/graphics/battle_anims/backgrounds/new/fire1.png new file mode 100644 index 0000000000..5f29e792fa Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/fire1.png differ diff --git a/graphics/battle_anims/backgrounds/new/fire2.pal b/graphics/battle_anims/backgrounds/new/fire2.pal new file mode 100644 index 0000000000..36b1870d1a --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/fire2.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +104 168 168 +88 144 160 +72 112 160 +64 64 120 +56 80 152 +64 80 144 +72 64 104 +72 56 96 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/focus_blast.bin b/graphics/battle_anims/backgrounds/new/focus_blast.bin new file mode 100644 index 0000000000..42bed6c96f Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/focus_blast.bin differ diff --git a/graphics/battle_anims/backgrounds/new/focus_blast.pal b/graphics/battle_anims/backgrounds/new/focus_blast.pal new file mode 100644 index 0000000000..308f63fa25 --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/focus_blast.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +255 98 74 +255 90 65 +255 82 57 +255 139 123 +255 74 49 +255 65 41 +255 57 32 +255 106 90 +255 148 139 +255 131 123 +255 123 115 +255 115 106 +255 106 98 +255 164 164 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/focus_blast.png b/graphics/battle_anims/backgrounds/new/focus_blast.png new file mode 100644 index 0000000000..8720658a78 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/focus_blast.png differ diff --git a/graphics/battle_anims/backgrounds/new/garbage_falls.pal b/graphics/battle_anims/backgrounds/new/garbage_falls.pal new file mode 100644 index 0000000000..16a76f920b --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/garbage_falls.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +180 172 148 +159 156 129 +137 140 110 +115 123 90 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/giga_impact_opponent.bin b/graphics/battle_anims/backgrounds/new/giga_impact_opponent.bin new file mode 100644 index 0000000000..8eb8e48cd2 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/giga_impact_opponent.bin differ diff --git a/graphics/battle_anims/backgrounds/new/giga_impact_opponent.pal b/graphics/battle_anims/backgrounds/new/giga_impact_opponent.pal new file mode 100644 index 0000000000..2fdba24f6f --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/giga_impact_opponent.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +41 49 49 +106 139 189 +246 131 180 +255 0 255 +255 16 98 +238 98 164 +230 65 131 +222 0 57 +222 24 90 +205 41 74 +205 32 82 +189 0 49 +172 16 65 +156 0 41 +148 16 49 +131 8 32 diff --git a/graphics/battle_anims/backgrounds/new/giga_impact_opponent.png b/graphics/battle_anims/backgrounds/new/giga_impact_opponent.png new file mode 100644 index 0000000000..cfa8c07c8d Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/giga_impact_opponent.png differ diff --git a/graphics/battle_anims/backgrounds/new/giga_impact_player.bin b/graphics/battle_anims/backgrounds/new/giga_impact_player.bin new file mode 100644 index 0000000000..bae8961e2e Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/giga_impact_player.bin differ diff --git a/graphics/battle_anims/backgrounds/new/giga_impact_player.pal b/graphics/battle_anims/backgrounds/new/giga_impact_player.pal new file mode 100644 index 0000000000..ea01813a95 --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/giga_impact_player.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +255 255 255 +255 0 255 +255 16 98 +246 131 180 +238 98 164 +230 65 131 +222 0 57 +222 24 90 +205 32 82 +205 41 74 +189 0 49 +172 16 65 +156 0 41 +148 16 49 +131 8 32 diff --git a/graphics/battle_anims/backgrounds/new/giga_impact_player.png b/graphics/battle_anims/backgrounds/new/giga_impact_player.png new file mode 100644 index 0000000000..b258035e34 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/giga_impact_player.png differ diff --git a/graphics/battle_anims/backgrounds/new/grassy_terrain.bin b/graphics/battle_anims/backgrounds/new/grassy_terrain.bin new file mode 100644 index 0000000000..be2421aaf1 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/grassy_terrain.bin differ diff --git a/graphics/battle_anims/backgrounds/new/grassy_terrain.pal b/graphics/battle_anims/backgrounds/new/grassy_terrain.pal new file mode 100644 index 0000000000..4ad8369ab5 --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/grassy_terrain.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +238 24 32 +230 255 238 +172 255 205 +222 255 230 +205 255 222 +180 255 205 +172 255 197 +213 255 230 +197 255 213 +164 255 197 +189 255 213 +213 255 222 +156 246 189 +148 246 180 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/grassy_terrain.png b/graphics/battle_anims/backgrounds/new/grassy_terrain.png new file mode 100644 index 0000000000..7cdc534afc Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/grassy_terrain.png differ diff --git a/graphics/battle_anims/backgrounds/new/gunk_shot.pal b/graphics/battle_anims/backgrounds/new/gunk_shot.pal new file mode 100644 index 0000000000..256db53029 --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/gunk_shot.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +205 98 255 +197 90 255 +197 82 255 +213 148 255 +197 72 255 +197 64 255 +189 56 255 +205 106 255 +222 156 255 +205 139 255 +205 131 255 +205 123 255 +205 115 255 +230 180 255 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/high_speed.bin b/graphics/battle_anims/backgrounds/new/high_speed.bin new file mode 100644 index 0000000000..52f7a9c51a Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/high_speed.bin differ diff --git a/graphics/battle_anims/backgrounds/new/high_speed.pal b/graphics/battle_anims/backgrounds/new/high_speed.pal new file mode 100644 index 0000000000..00659f350a --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/high_speed.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +197 255 255 +139 222 246 +115 213 255 +106 205 255 +98 197 255 +90 180 246 +74 164 238 +65 156 238 +49 148 230 +41 139 230 +41 115 213 +32 131 222 +32 98 205 +32 90 197 +41 74 180 diff --git a/graphics/battle_anims/backgrounds/new/high_speed.png b/graphics/battle_anims/backgrounds/new/high_speed.png new file mode 100644 index 0000000000..08bb2b0de3 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/high_speed.png differ diff --git a/graphics/battle_anims/backgrounds/new/hydro_cannon.bin b/graphics/battle_anims/backgrounds/new/hydro_cannon.bin new file mode 100644 index 0000000000..0d5168cd78 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/hydro_cannon.bin differ diff --git a/graphics/battle_anims/backgrounds/new/hydro_cannon.pal b/graphics/battle_anims/backgrounds/new/hydro_cannon.pal new file mode 100644 index 0000000000..a543926c3d --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/hydro_cannon.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +255 255 255 +197 230 255 +139 205 246 +82 172 238 +57 131 205 +32 82 164 +16 41 123 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/hydro_cannon.png b/graphics/battle_anims/backgrounds/new/hydro_cannon.png new file mode 100644 index 0000000000..b2012c0a8a Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/hydro_cannon.png differ diff --git a/graphics/battle_anims/backgrounds/new/hydro_pump.bin b/graphics/battle_anims/backgrounds/new/hydro_pump.bin new file mode 100644 index 0000000000..0f7e6a5d91 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/hydro_pump.bin differ diff --git a/graphics/battle_anims/backgrounds/new/hydro_pump.pal b/graphics/battle_anims/backgrounds/new/hydro_pump.pal new file mode 100644 index 0000000000..8f759c28c3 --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/hydro_pump.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +255 255 255 +222 246 255 +189 230 255 +148 213 246 +123 205 255 +90 180 238 +65 164 230 +41 139 222 +24 123 213 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/hydro_pump.png b/graphics/battle_anims/backgrounds/new/hydro_pump.png new file mode 100644 index 0000000000..89a0f99f6d Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/hydro_pump.png differ diff --git a/graphics/battle_anims/backgrounds/new/hyper_beam.pal b/graphics/battle_anims/backgrounds/new/hyper_beam.pal new file mode 100644 index 0000000000..e17c826a6c --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/hyper_beam.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 164 255 +255 255 255 +246 197 222 +230 148 180 +205 98 139 +156 82 106 +90 57 74 +41 32 41 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/hyperspace_fury.pal b/graphics/battle_anims/backgrounds/new/hyperspace_fury.pal new file mode 100644 index 0000000000..4249177213 --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/hyperspace_fury.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +197 0 65 +160 0 0 +80 0 0 +0 0 0 +189 139 0 +80 0 112 +120 0 168 +255 32 106 +0 164 90 +65 0 213 +49 0 123 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/inferno_overdrive.bin b/graphics/battle_anims/backgrounds/new/inferno_overdrive.bin new file mode 100644 index 0000000000..d9a955d592 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/inferno_overdrive.bin differ diff --git a/graphics/battle_anims/backgrounds/new/inferno_overdrive.pal b/graphics/battle_anims/backgrounds/new/inferno_overdrive.pal new file mode 100644 index 0000000000..032fe053c0 --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/inferno_overdrive.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 255 +255 255 230 +255 255 172 +255 255 139 +255 255 106 +255 238 82 +255 230 65 +255 197 32 +255 172 16 +255 148 8 +238 115 0 +222 82 0 +197 49 0 +156 24 0 +98 8 0 +57 0 0 diff --git a/graphics/battle_anims/backgrounds/new/inferno_overdrive.png b/graphics/battle_anims/backgrounds/new/inferno_overdrive.png new file mode 100644 index 0000000000..9d4c57fcde Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/inferno_overdrive.png differ diff --git a/graphics/battle_anims/backgrounds/new/leaf_storm.bin b/graphics/battle_anims/backgrounds/new/leaf_storm.bin new file mode 100644 index 0000000000..02a43683a6 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/leaf_storm.bin differ diff --git a/graphics/battle_anims/backgrounds/new/leaf_storm.pal b/graphics/battle_anims/backgrounds/new/leaf_storm.pal new file mode 100644 index 0000000000..06e048750c --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/leaf_storm.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +255 255 255 +238 246 230 +205 238 180 +213 238 189 +197 230 180 +197 230 172 +172 222 148 +189 222 164 +164 213 139 +156 205 131 +131 197 106 +139 197 115 +123 189 98 +98 180 65 +65 172 32 diff --git a/graphics/battle_anims/backgrounds/new/leaf_storm.png b/graphics/battle_anims/backgrounds/new/leaf_storm.png new file mode 100644 index 0000000000..6438ea6dca Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/leaf_storm.png differ diff --git a/graphics/battle_anims/backgrounds/new/magic_room.pal b/graphics/battle_anims/backgrounds/new/magic_room.pal new file mode 100644 index 0000000000..2613d5ee1a --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/magic_room.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +164 156 24 +156 148 24 +197 189 32 +172 164 32 +115 106 16 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/malicious_moonsault.bin b/graphics/battle_anims/backgrounds/new/malicious_moonsault.bin new file mode 100644 index 0000000000..37874dd0bf Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/malicious_moonsault.bin differ diff --git a/graphics/battle_anims/backgrounds/new/malicious_moonsault.pal b/graphics/battle_anims/backgrounds/new/malicious_moonsault.pal new file mode 100644 index 0000000000..57fe14de30 --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/malicious_moonsault.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 255 0 +255 74 74 +238 24 24 +222 65 65 +164 41 41 +164 16 16 +106 32 32 +106 8 8 +65 16 16 +32 24 222 +98 65 222 +24 16 131 +0 0 65 +32 8 8 +8 0 0 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/malicious_moonsault.png b/graphics/battle_anims/backgrounds/new/malicious_moonsault.png new file mode 100644 index 0000000000..34bc5ecc82 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/malicious_moonsault.png differ diff --git a/graphics/battle_anims/backgrounds/new/max_lightning.bin b/graphics/battle_anims/backgrounds/new/max_lightning.bin new file mode 100644 index 0000000000..43511aa724 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/max_lightning.bin differ diff --git a/graphics/battle_anims/backgrounds/new/max_lightning.pal b/graphics/battle_anims/backgrounds/new/max_lightning.pal new file mode 100644 index 0000000000..679758e697 --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/max_lightning.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +238 24 32 +115 115 139 +90 90 106 +74 74 98 +65 65 82 +57 57 74 +49 49 57 +41 41 49 +32 32 41 +24 24 32 +16 16 24 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/max_lightning.png b/graphics/battle_anims/backgrounds/new/max_lightning.png new file mode 100644 index 0000000000..57919d5617 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/max_lightning.png differ diff --git a/graphics/battle_anims/backgrounds/new/misty_terrain.bin b/graphics/battle_anims/backgrounds/new/misty_terrain.bin new file mode 100644 index 0000000000..6276967546 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/misty_terrain.bin differ diff --git a/graphics/battle_anims/backgrounds/new/misty_terrain.pal b/graphics/battle_anims/backgrounds/new/misty_terrain.pal new file mode 100644 index 0000000000..927973cbec --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/misty_terrain.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +238 24 32 +255 246 246 +255 238 238 +255 230 230 +255 222 230 +255 222 222 +255 213 222 +255 205 213 +255 205 205 +255 197 205 +255 197 197 +255 189 189 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/misty_terrain.png b/graphics/battle_anims/backgrounds/new/misty_terrain.png new file mode 100644 index 0000000000..1427c5cf02 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/misty_terrain.png differ diff --git a/graphics/battle_anims/backgrounds/new/neverending_nightmare.bin b/graphics/battle_anims/backgrounds/new/neverending_nightmare.bin new file mode 100644 index 0000000000..e450f14415 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/neverending_nightmare.bin differ diff --git a/graphics/battle_anims/backgrounds/new/neverending_nightmare.pal b/graphics/battle_anims/backgrounds/new/neverending_nightmare.pal new file mode 100644 index 0000000000..0edeeac58a --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/neverending_nightmare.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 0 +0 41 98 +0 41 90 +0 32 82 +0 32 74 +0 24 74 +0 24 65 +0 24 57 +0 16 57 +0 16 49 +0 8 41 +0 8 32 +0 0 24 +0 0 16 +0 0 8 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/neverending_nightmare.png b/graphics/battle_anims/backgrounds/new/neverending_nightmare.png new file mode 100644 index 0000000000..2b2ae414b6 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/neverending_nightmare.png differ diff --git a/graphics/battle_anims/backgrounds/new/nightmare.bin b/graphics/battle_anims/backgrounds/new/nightmare.bin new file mode 100644 index 0000000000..c4b8b45a7c Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/nightmare.bin differ diff --git a/graphics/battle_anims/backgrounds/new/nightmare.pal b/graphics/battle_anims/backgrounds/new/nightmare.pal new file mode 100644 index 0000000000..71c950736a --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/nightmare.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +98 49 74 +90 32 65 +82 32 65 +82 32 57 +74 24 57 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/nightmare.png b/graphics/battle_anims/backgrounds/new/nightmare.png new file mode 100644 index 0000000000..e3aaab9a15 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/nightmare.png differ diff --git a/graphics/battle_anims/backgrounds/new/poison_falls.pal b/graphics/battle_anims/backgrounds/new/poison_falls.pal new file mode 100644 index 0000000000..cc7799696c --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/poison_falls.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +180 106 255 +180 82 246 +148 65 205 +115 24 205 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/psychic.pal b/graphics/battle_anims/backgrounds/new/psychic.pal new file mode 100644 index 0000000000..1fef60a1a5 --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/psychic.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +19 0 82 +38 0 98 +58 0 114 +78 0 131 +97 0 147 +117 0 164 +137 0 180 +156 0 196 +176 0 213 +196 0 229 +216 0 246 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/psychic_terrain.bin b/graphics/battle_anims/backgrounds/new/psychic_terrain.bin new file mode 100644 index 0000000000..a661ab77aa Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/psychic_terrain.bin differ diff --git a/graphics/battle_anims/backgrounds/new/psychic_terrain.pal b/graphics/battle_anims/backgrounds/new/psychic_terrain.pal new file mode 100644 index 0000000000..09230dffe9 --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/psychic_terrain.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +238 24 32 +246 222 255 +238 213 255 +238 205 246 +230 197 246 +230 180 246 +222 172 246 +222 164 246 +222 156 246 +213 148 246 +205 139 238 +197 115 238 +189 98 238 +189 90 230 +180 74 230 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/psychic_terrain.png b/graphics/battle_anims/backgrounds/new/psychic_terrain.png new file mode 100644 index 0000000000..359870e4c9 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/psychic_terrain.png differ diff --git a/graphics/battle_anims/backgrounds/new/rock_wrecker.bin b/graphics/battle_anims/backgrounds/new/rock_wrecker.bin new file mode 100644 index 0000000000..58410f9bdc Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/rock_wrecker.bin differ diff --git a/graphics/battle_anims/backgrounds/new/rock_wrecker.pal b/graphics/battle_anims/backgrounds/new/rock_wrecker.pal new file mode 100644 index 0000000000..f17343c316 --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/rock_wrecker.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +255 246 0 +255 238 0 +255 222 0 +255 205 0 +255 189 0 +255 172 0 +255 156 8 +255 139 8 +255 123 8 +255 106 8 +255 90 8 +255 74 8 +255 49 8 +255 41 8 +246 24 0 diff --git a/graphics/battle_anims/backgrounds/new/rock_wrecker.png b/graphics/battle_anims/backgrounds/new/rock_wrecker.png new file mode 100644 index 0000000000..97cf4b73af Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/rock_wrecker.png differ diff --git a/graphics/battle_anims/backgrounds/new/shattered_psyche.bin b/graphics/battle_anims/backgrounds/new/shattered_psyche.bin new file mode 100644 index 0000000000..225d8e95f3 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/shattered_psyche.bin differ diff --git a/graphics/battle_anims/backgrounds/new/shattered_psyche.pal b/graphics/battle_anims/backgrounds/new/shattered_psyche.pal new file mode 100644 index 0000000000..f121cd887a --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/shattered_psyche.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +222 164 255 +238 139 255 +213 139 255 +189 139 255 +213 115 255 +197 90 255 +189 115 246 +172 148 238 +180 90 230 +172 90 213 +156 131 213 +148 82 205 +123 139 197 +131 90 180 +115 123 172 diff --git a/graphics/battle_anims/backgrounds/new/shattered_psyche.png b/graphics/battle_anims/backgrounds/new/shattered_psyche.png new file mode 100644 index 0000000000..90b0cc4eef Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/shattered_psyche.png differ diff --git a/graphics/battle_anims/backgrounds/new/sky_afternoon.pal b/graphics/battle_anims/backgrounds/new/sky_afternoon.pal new file mode 100644 index 0000000000..c7c5805fa7 --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/sky_afternoon.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +246 230 180 +255 222 139 +255 230 123 +255 222 106 +255 213 98 +255 197 57 +255 180 32 +255 172 8 +255 156 8 +230 131 8 +222 123 8 +205 106 8 +205 90 8 +197 74 8 +189 57 8 diff --git a/graphics/battle_anims/backgrounds/new/sky_day.bin b/graphics/battle_anims/backgrounds/new/sky_day.bin new file mode 100644 index 0000000000..8b34d893cd Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/sky_day.bin differ diff --git a/graphics/battle_anims/backgrounds/new/sky_day.pal b/graphics/battle_anims/backgrounds/new/sky_day.pal new file mode 100644 index 0000000000..c0ea00a0ae --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/sky_day.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +211 216 222 +198 208 221 +184 199 218 +170 191 215 +156 181 212 +142 172 207 +128 162 203 +117 154 198 +104 147 199 +101 141 189 +89 137 194 +82 127 179 +77 128 190 +63 117 184 +52 106 169 diff --git a/graphics/battle_anims/backgrounds/new/sky_day.png b/graphics/battle_anims/backgrounds/new/sky_day.png new file mode 100644 index 0000000000..c03ce283bb Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/sky_day.png differ diff --git a/graphics/battle_anims/backgrounds/new/sky_night.pal b/graphics/battle_anims/backgrounds/new/sky_night.pal new file mode 100644 index 0000000000..4c0622ac52 --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/sky_night.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +139 90 222 +131 65 230 +106 41 230 +98 32 230 +98 16 255 +65 8 255 +49 8 205 +41 8 180 +24 0 172 +24 0 156 +32 0 148 +32 0 131 +32 0 115 +24 0 106 +24 0 98 diff --git a/graphics/battle_anims/backgrounds/new/sludge_wave.pal b/graphics/battle_anims/backgrounds/new/sludge_wave.pal new file mode 100644 index 0000000000..5cf1a102f6 --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/sludge_wave.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +175 128 139 +167 70 255 +184 86 255 +208 111 255 +233 136 255 +249 160 255 +255 185 255 +255 210 255 +255 235 255 +167 70 255 +184 86 255 +255 177 255 +255 218 255 +255 235 255 +69 0 0 +69 0 0 diff --git a/graphics/battle_anims/backgrounds/new/snuggle_forever.bin b/graphics/battle_anims/backgrounds/new/snuggle_forever.bin new file mode 100644 index 0000000000..a4bcc4440d Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/snuggle_forever.bin differ diff --git a/graphics/battle_anims/backgrounds/new/snuggle_forever.pal b/graphics/battle_anims/backgrounds/new/snuggle_forever.pal new file mode 100644 index 0000000000..21a4f95fea --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/snuggle_forever.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 255 0 +41 57 16 +115 106 74 +41 74 24 +24 24 24 +32 49 16 +57 57 16 +156 156 123 +74 74 32 +57 98 32 +139 131 98 +123 123 82 +74 115 41 +90 90 49 +90 131 41 +24 32 8 diff --git a/graphics/battle_anims/backgrounds/new/snuggle_forever.png b/graphics/battle_anims/backgrounds/new/snuggle_forever.png new file mode 100644 index 0000000000..364ee1e067 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/snuggle_forever.png differ diff --git a/graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.bin b/graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.bin new file mode 100644 index 0000000000..44eb2f82d3 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.bin differ diff --git a/graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.pal b/graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.pal new file mode 100644 index 0000000000..8d44d7916b --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 0 +57 197 172 +49 180 164 +49 180 156 +41 180 148 +41 164 148 +41 164 139 +32 164 131 +41 156 139 +24 156 106 +32 148 131 +32 139 131 +24 131 98 +32 123 115 +24 115 98 +24 98 90 diff --git a/graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.png b/graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.png new file mode 100644 index 0000000000..709860ae00 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.png differ diff --git a/graphics/battle_anims/backgrounds/new/spacial_rend_opponent.bin b/graphics/battle_anims/backgrounds/new/spacial_rend_opponent.bin new file mode 100644 index 0000000000..e6227db9c9 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/spacial_rend_opponent.bin differ diff --git a/graphics/battle_anims/backgrounds/new/spacial_rend_opponent.pal b/graphics/battle_anims/backgrounds/new/spacial_rend_opponent.pal new file mode 100644 index 0000000000..7f1f61789b --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/spacial_rend_opponent.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 0 +222 156 230 +222 180 246 +213 123 205 +213 189 246 +205 115 205 +213 164 230 +213 131 213 +222 197 255 +222 189 255 +213 139 222 +213 172 238 +213 106 197 +222 131 213 +213 115 205 +205 106 197 diff --git a/graphics/battle_anims/backgrounds/new/spacial_rend_opponent.png b/graphics/battle_anims/backgrounds/new/spacial_rend_opponent.png new file mode 100644 index 0000000000..637b9cf5a9 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/spacial_rend_opponent.png differ diff --git a/graphics/battle_anims/backgrounds/new/spacial_rend_player.bin b/graphics/battle_anims/backgrounds/new/spacial_rend_player.bin new file mode 100644 index 0000000000..cae5112e00 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/spacial_rend_player.bin differ diff --git a/graphics/battle_anims/backgrounds/new/spacial_rend_player.pal b/graphics/battle_anims/backgrounds/new/spacial_rend_player.pal new file mode 100644 index 0000000000..846d3e7035 --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/spacial_rend_player.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 0 +213 156 230 +222 180 246 +213 123 205 +213 189 246 +213 131 213 +205 115 205 +213 164 230 +222 197 255 +213 139 222 +222 189 255 +213 172 238 +213 106 197 +213 115 205 +222 156 230 +205 106 197 diff --git a/graphics/battle_anims/backgrounds/new/spacial_rend_player.png b/graphics/battle_anims/backgrounds/new/spacial_rend_player.png new file mode 100644 index 0000000000..993b3d8a69 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/spacial_rend_player.png differ diff --git a/graphics/battle_anims/backgrounds/new/tectonic_rage.bin b/graphics/battle_anims/backgrounds/new/tectonic_rage.bin new file mode 100644 index 0000000000..914a9deb9a Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/tectonic_rage.bin differ diff --git a/graphics/battle_anims/backgrounds/new/tectonic_rage.pal b/graphics/battle_anims/backgrounds/new/tectonic_rage.pal new file mode 100644 index 0000000000..bc3621477e --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/tectonic_rage.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +88 0 0 +184 168 0 +192 144 0 +208 120 0 +224 96 0 +240 72 0 +248 232 0 +248 232 0 +248 184 0 +248 152 0 +248 152 0 +248 112 0 +248 72 0 +248 40 0 +88 0 0 +88 0 0 diff --git a/graphics/battle_anims/backgrounds/new/trick_room.bin b/graphics/battle_anims/backgrounds/new/trick_room.bin new file mode 100644 index 0000000000..197f57922a Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/trick_room.bin differ diff --git a/graphics/battle_anims/backgrounds/new/trick_room.pal b/graphics/battle_anims/backgrounds/new/trick_room.pal new file mode 100644 index 0000000000..5e0aae212c --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/trick_room.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +106 123 139 +90 106 139 +123 139 164 +123 139 197 +65 74 115 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/trick_room.png b/graphics/battle_anims/backgrounds/new/trick_room.png new file mode 100644 index 0000000000..aac1ddc88a Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/trick_room.png differ diff --git a/graphics/battle_anims/backgrounds/new/twinkle_tackle.bin b/graphics/battle_anims/backgrounds/new/twinkle_tackle.bin new file mode 100644 index 0000000000..afdb6bdb58 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/twinkle_tackle.bin differ diff --git a/graphics/battle_anims/backgrounds/new/twinkle_tackle.pal b/graphics/battle_anims/backgrounds/new/twinkle_tackle.pal new file mode 100644 index 0000000000..9d86dfc8cc --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/twinkle_tackle.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +230 139 255 +197 106 255 +197 131 255 +164 98 255 +148 90 255 +172 123 255 +131 82 255 +123 90 255 +115 90 255 +106 82 255 +98 82 255 +90 82 255 +90 90 255 +82 115 255 +82 139 255 diff --git a/graphics/battle_anims/backgrounds/new/twinkle_tackle.png b/graphics/battle_anims/backgrounds/new/twinkle_tackle.png new file mode 100644 index 0000000000..c689f90096 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/twinkle_tackle.png differ diff --git a/graphics/battle_anims/backgrounds/new/water_pulse.bin b/graphics/battle_anims/backgrounds/new/water_pulse.bin new file mode 100644 index 0000000000..0982424c63 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/water_pulse.bin differ diff --git a/graphics/battle_anims/backgrounds/new/water_pulse.pal b/graphics/battle_anims/backgrounds/new/water_pulse.pal new file mode 100644 index 0000000000..f27e22541f --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/water_pulse.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 0 +49 57 131 +41 49 115 +32 41 106 +24 32 90 +24 24 82 +32 32 74 +32 24 65 +49 49 74 +49 49 65 +41 41 57 +41 41 49 +41 41 41 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/water_pulse.png b/graphics/battle_anims/backgrounds/new/water_pulse.png new file mode 100644 index 0000000000..0237efc286 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/water_pulse.png differ diff --git a/graphics/battle_anims/backgrounds/new/waterfall.bin b/graphics/battle_anims/backgrounds/new/waterfall.bin new file mode 100644 index 0000000000..0fbe00ac63 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/waterfall.bin differ diff --git a/graphics/battle_anims/backgrounds/new/waterfall.pal b/graphics/battle_anims/backgrounds/new/waterfall.pal new file mode 100644 index 0000000000..1ae2f0ef99 --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/waterfall.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +131 205 230 +123 180 213 +115 156 205 +115 139 164 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/waterfall.png b/graphics/battle_anims/backgrounds/new/waterfall.png new file mode 100644 index 0000000000..2fa27759f3 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/waterfall.png differ diff --git a/graphics/battle_anims/backgrounds/new/wonder_room.pal b/graphics/battle_anims/backgrounds/new/wonder_room.pal new file mode 100644 index 0000000000..a1792d0173 --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/wonder_room.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +214 55 93 +199 40 78 +222 91 123 +223 96 127 +158 31 62 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/zmove_activate.bin b/graphics/battle_anims/backgrounds/new/zmove_activate.bin new file mode 100644 index 0000000000..b089a822d3 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/zmove_activate.bin differ diff --git a/graphics/battle_anims/backgrounds/new/zmove_activate.pal b/graphics/battle_anims/backgrounds/new/zmove_activate.pal new file mode 100644 index 0000000000..58d03f19f0 --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/zmove_activate.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +213 197 255 +189 189 255 +164 189 255 +139 172 246 +115 156 238 +139 222 255 +115 230 255 +90 213 238 +98 180 246 +82 172 222 +90 148 222 +65 148 205 +65 123 189 +41 98 172 +32 82 148 diff --git a/graphics/battle_anims/backgrounds/new/zmove_activate.png b/graphics/battle_anims/backgrounds/new/zmove_activate.png new file mode 100644 index 0000000000..6f5cb77e7a Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/zmove_activate.png differ diff --git a/graphics/battle_anims/backgrounds/new/zmove_mountain.bin b/graphics/battle_anims/backgrounds/new/zmove_mountain.bin new file mode 100644 index 0000000000..74f6bdbae5 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/zmove_mountain.bin differ diff --git a/graphics/battle_anims/backgrounds/new/zmove_mountain.pal b/graphics/battle_anims/backgrounds/new/zmove_mountain.pal new file mode 100644 index 0000000000..d351f72e76 --- /dev/null +++ b/graphics/battle_anims/backgrounds/new/zmove_mountain.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 0 +74 24 0 +65 24 0 +65 32 8 +57 24 0 +57 24 8 +49 24 8 +49 24 0 +49 16 0 +41 16 0 +41 8 0 +32 8 0 +24 0 0 +16 0 0 +8 0 0 +0 0 0 diff --git a/graphics/battle_anims/backgrounds/new/zmove_mountain.png b/graphics/battle_anims/backgrounds/new/zmove_mountain.png new file mode 100644 index 0000000000..83a9f22ff5 Binary files /dev/null and b/graphics/battle_anims/backgrounds/new/zmove_mountain.png differ diff --git a/graphics/battle_anims/backgrounds/rock_wrecker.png b/graphics/battle_anims/backgrounds/rock_wrecker.png new file mode 100644 index 0000000000..ca50da7b76 Binary files /dev/null and b/graphics/battle_anims/backgrounds/rock_wrecker.png differ diff --git a/graphics/battle_anims/backgrounds/rock_wrecker_map.bin b/graphics/battle_anims/backgrounds/rock_wrecker_map.bin new file mode 100644 index 0000000000..d5e97d7d0e Binary files /dev/null and b/graphics/battle_anims/backgrounds/rock_wrecker_map.bin differ diff --git a/graphics/battle_anims/backgrounds/spacial_rend_opponent.bin b/graphics/battle_anims/backgrounds/spacial_rend_opponent.bin new file mode 100644 index 0000000000..e6227db9c9 Binary files /dev/null and b/graphics/battle_anims/backgrounds/spacial_rend_opponent.bin differ diff --git a/graphics/battle_anims/backgrounds/spacial_rend_opponent.pal b/graphics/battle_anims/backgrounds/spacial_rend_opponent.pal new file mode 100644 index 0000000000..7f1f61789b --- /dev/null +++ b/graphics/battle_anims/backgrounds/spacial_rend_opponent.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 0 +222 156 230 +222 180 246 +213 123 205 +213 189 246 +205 115 205 +213 164 230 +213 131 213 +222 197 255 +222 189 255 +213 139 222 +213 172 238 +213 106 197 +222 131 213 +213 115 205 +205 106 197 diff --git a/graphics/battle_anims/backgrounds/spacial_rend_opponent.png b/graphics/battle_anims/backgrounds/spacial_rend_opponent.png new file mode 100644 index 0000000000..637b9cf5a9 Binary files /dev/null and b/graphics/battle_anims/backgrounds/spacial_rend_opponent.png differ diff --git a/graphics/battle_anims/backgrounds/spacial_rend_player.bin b/graphics/battle_anims/backgrounds/spacial_rend_player.bin new file mode 100644 index 0000000000..cae5112e00 Binary files /dev/null and b/graphics/battle_anims/backgrounds/spacial_rend_player.bin differ diff --git a/graphics/battle_anims/backgrounds/spacial_rend_player.pal b/graphics/battle_anims/backgrounds/spacial_rend_player.pal new file mode 100644 index 0000000000..846d3e7035 --- /dev/null +++ b/graphics/battle_anims/backgrounds/spacial_rend_player.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 0 +213 156 230 +222 180 246 +213 123 205 +213 189 246 +213 131 213 +205 115 205 +213 164 230 +222 197 255 +213 139 222 +222 189 255 +213 172 238 +213 106 197 +213 115 205 +222 156 230 +205 106 197 diff --git a/graphics/battle_anims/backgrounds/spacial_rend_player.png b/graphics/battle_anims/backgrounds/spacial_rend_player.png new file mode 100644 index 0000000000..993b3d8a69 Binary files /dev/null and b/graphics/battle_anims/backgrounds/spacial_rend_player.png differ diff --git a/graphics/battle_anims/backgrounds/trick_room.png b/graphics/battle_anims/backgrounds/trick_room.png new file mode 100644 index 0000000000..99eda69bff Binary files /dev/null and b/graphics/battle_anims/backgrounds/trick_room.png differ diff --git a/graphics/battle_anims/backgrounds/trick_room_map.bin b/graphics/battle_anims/backgrounds/trick_room_map.bin new file mode 100644 index 0000000000..3d0041baaa Binary files /dev/null and b/graphics/battle_anims/backgrounds/trick_room_map.bin differ diff --git a/graphics/battle_anims/sprites/accupressure.png b/graphics/battle_anims/sprites/accupressure.png new file mode 100644 index 0000000000..0da836ff3f Binary files /dev/null and b/graphics/battle_anims/sprites/accupressure.png differ diff --git a/graphics/battle_anims/sprites/attack_order.png b/graphics/battle_anims/sprites/attack_order.png new file mode 100644 index 0000000000..18531b8304 Binary files /dev/null and b/graphics/battle_anims/sprites/attack_order.png differ diff --git a/graphics/battle_anims/sprites/colored_orbs.png b/graphics/battle_anims/sprites/colored_orbs.png new file mode 100644 index 0000000000..3bd3a55dd3 Binary files /dev/null and b/graphics/battle_anims/sprites/colored_orbs.png differ diff --git a/graphics/battle_anims/sprites/dragon_pulse.png b/graphics/battle_anims/sprites/dragon_pulse.png new file mode 100644 index 0000000000..cc6e28bc32 Binary files /dev/null and b/graphics/battle_anims/sprites/dragon_pulse.png differ diff --git a/graphics/battle_anims/sprites/energy_ball.png b/graphics/battle_anims/sprites/energy_ball.png new file mode 100644 index 0000000000..b3b26d6068 Binary files /dev/null and b/graphics/battle_anims/sprites/energy_ball.png differ diff --git a/graphics/battle_anims/sprites/feint_punch.png b/graphics/battle_anims/sprites/feint_punch.png new file mode 100644 index 0000000000..5769415193 Binary files /dev/null and b/graphics/battle_anims/sprites/feint_punch.png differ diff --git a/graphics/battle_anims/sprites/flash_cannon_ball.png b/graphics/battle_anims/sprites/flash_cannon_ball.png new file mode 100644 index 0000000000..b08d1d39f4 Binary files /dev/null and b/graphics/battle_anims/sprites/flash_cannon_ball.png differ diff --git a/graphics/battle_anims/sprites/mega_particles.png b/graphics/battle_anims/sprites/mega_particles.png new file mode 100644 index 0000000000..6fdf09d96e Binary files /dev/null and b/graphics/battle_anims/sprites/mega_particles.png differ diff --git a/graphics/battle_anims/sprites/mega_stone.png b/graphics/battle_anims/sprites/mega_stone.png new file mode 100644 index 0000000000..e3350bbb54 Binary files /dev/null and b/graphics/battle_anims/sprites/mega_stone.png differ diff --git a/graphics/battle_anims/sprites/mega_symbol.png b/graphics/battle_anims/sprites/mega_symbol.png new file mode 100644 index 0000000000..7ca305a137 Binary files /dev/null and b/graphics/battle_anims/sprites/mega_symbol.png differ diff --git a/graphics/battle_anims/sprites/new/ability_pop_up.png b/graphics/battle_anims/sprites/new/ability_pop_up.png new file mode 100644 index 0000000000..12b976a49e Binary files /dev/null and b/graphics/battle_anims/sprites/new/ability_pop_up.png differ diff --git a/graphics/battle_anims/sprites/new/acupressure_finger.png b/graphics/battle_anims/sprites/new/acupressure_finger.png new file mode 100644 index 0000000000..50b1d92801 Binary files /dev/null and b/graphics/battle_anims/sprites/new/acupressure_finger.png differ diff --git a/graphics/battle_anims/sprites/new/alpha_stone.png b/graphics/battle_anims/sprites/new/alpha_stone.png new file mode 100644 index 0000000000..334aed6062 Binary files /dev/null and b/graphics/battle_anims/sprites/new/alpha_stone.png differ diff --git a/graphics/battle_anims/sprites/new/anchor.png b/graphics/battle_anims/sprites/new/anchor.png new file mode 100644 index 0000000000..71cc11b8b9 Binary files /dev/null and b/graphics/battle_anims/sprites/new/anchor.png differ diff --git a/graphics/battle_anims/sprites/new/apple.png b/graphics/battle_anims/sprites/new/apple.png new file mode 100644 index 0000000000..a9cd54d4d6 Binary files /dev/null and b/graphics/battle_anims/sprites/new/apple.png differ diff --git a/graphics/battle_anims/sprites/new/arrows.png b/graphics/battle_anims/sprites/new/arrows.png new file mode 100644 index 0000000000..a0f58a097e Binary files /dev/null and b/graphics/battle_anims/sprites/new/arrows.png differ diff --git a/graphics/battle_anims/sprites/new/assurance_hand.png b/graphics/battle_anims/sprites/new/assurance_hand.png new file mode 100644 index 0000000000..45dc9a626c Binary files /dev/null and b/graphics/battle_anims/sprites/new/assurance_hand.png differ diff --git a/graphics/battle_anims/sprites/new/aura_sphere.png b/graphics/battle_anims/sprites/new/aura_sphere.png new file mode 100644 index 0000000000..04c5030245 Binary files /dev/null and b/graphics/battle_anims/sprites/new/aura_sphere.png differ diff --git a/graphics/battle_anims/sprites/new/avalanche_rocks.pal b/graphics/battle_anims/sprites/new/avalanche_rocks.pal new file mode 100644 index 0000000000..246940cc27 --- /dev/null +++ b/graphics/battle_anims/sprites/new/avalanche_rocks.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +205 189 230 +106 180 180 +106 180 180 +115 213 213 +131 230 230 +131 230 230 +139 238 238 +148 246 246 +164 246 246 +189 255 255 +205 255 255 +222 255 255 +238 255 255 +238 255 255 +255 255 255 +255 255 255 diff --git a/graphics/battle_anims/sprites/new/baton_pass_ball.png b/graphics/battle_anims/sprites/new/baton_pass_ball.png new file mode 100644 index 0000000000..e32e595296 Binary files /dev/null and b/graphics/battle_anims/sprites/new/baton_pass_ball.png differ diff --git a/graphics/battle_anims/sprites/new/bee.png b/graphics/battle_anims/sprites/new/bee.png new file mode 100644 index 0000000000..448935c10a Binary files /dev/null and b/graphics/battle_anims/sprites/new/bee.png differ diff --git a/graphics/battle_anims/sprites/new/berry_eaten.png b/graphics/battle_anims/sprites/new/berry_eaten.png new file mode 100644 index 0000000000..2a49e6e0ec Binary files /dev/null and b/graphics/battle_anims/sprites/new/berry_eaten.png differ diff --git a/graphics/battle_anims/sprites/new/berry_normal.png b/graphics/battle_anims/sprites/new/berry_normal.png new file mode 100644 index 0000000000..53ed3361dc Binary files /dev/null and b/graphics/battle_anims/sprites/new/berry_normal.png differ diff --git a/graphics/battle_anims/sprites/new/big_rock.png b/graphics/battle_anims/sprites/new/big_rock.png new file mode 100644 index 0000000000..248fbc36e2 Binary files /dev/null and b/graphics/battle_anims/sprites/new/big_rock.png differ diff --git a/graphics/battle_anims/sprites/new/blacephalon_head.png b/graphics/battle_anims/sprites/new/blacephalon_head.png new file mode 100644 index 0000000000..4dae3ec968 Binary files /dev/null and b/graphics/battle_anims/sprites/new/blacephalon_head.png differ diff --git a/graphics/battle_anims/sprites/new/blue_flare.pal b/graphics/battle_anims/sprites/new/blue_flare.pal new file mode 100644 index 0000000000..3b224c3459 --- /dev/null +++ b/graphics/battle_anims/sprites/new/blue_flare.pal @@ -0,0 +1,259 @@ +JASC-PAL +0100 +256 +0 0 0 +248 248 248 +205 248 255 +139 180 255 +106 230 255 +57 238 255 +24 238 255 +24 172 255 +57 156 255 +16 96 255 +8 48 255 +0 0 255 +0 0 156 +238 238 238 +189 189 189 +156 164 164 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/sprites/new/branch.png b/graphics/battle_anims/sprites/new/branch.png new file mode 100644 index 0000000000..edd1a50e89 Binary files /dev/null and b/graphics/battle_anims/sprites/new/branch.png differ diff --git a/graphics/battle_anims/sprites/new/brine.png b/graphics/battle_anims/sprites/new/brine.png new file mode 100644 index 0000000000..b585513ca9 Binary files /dev/null and b/graphics/battle_anims/sprites/new/brine.png differ diff --git a/graphics/battle_anims/sprites/new/cacoon.png b/graphics/battle_anims/sprites/new/cacoon.png new file mode 100644 index 0000000000..55b17ce8ae Binary files /dev/null and b/graphics/battle_anims/sprites/new/cacoon.png differ diff --git a/graphics/battle_anims/sprites/new/chain_link.png b/graphics/battle_anims/sprites/new/chain_link.png new file mode 100644 index 0000000000..bf54b11cf2 Binary files /dev/null and b/graphics/battle_anims/sprites/new/chain_link.png differ diff --git a/graphics/battle_anims/sprites/new/chop.png b/graphics/battle_anims/sprites/new/chop.png new file mode 100644 index 0000000000..2afff2b3f2 Binary files /dev/null and b/graphics/battle_anims/sprites/new/chop.png differ diff --git a/graphics/battle_anims/sprites/new/confide.png b/graphics/battle_anims/sprites/new/confide.png new file mode 100644 index 0000000000..adb65b8052 Binary files /dev/null and b/graphics/battle_anims/sprites/new/confide.png differ diff --git a/graphics/battle_anims/sprites/new/crafty_shield.png b/graphics/battle_anims/sprites/new/crafty_shield.png new file mode 100644 index 0000000000..091047fd10 Binary files /dev/null and b/graphics/battle_anims/sprites/new/crafty_shield.png differ diff --git a/graphics/battle_anims/sprites/new/curse_nail.png b/graphics/battle_anims/sprites/new/curse_nail.png new file mode 100644 index 0000000000..0e0e6654e2 Binary files /dev/null and b/graphics/battle_anims/sprites/new/curse_nail.png differ diff --git a/graphics/battle_anims/sprites/new/draco_meteor.pal b/graphics/battle_anims/sprites/new/draco_meteor.pal new file mode 100644 index 0000000000..b2689acd4b --- /dev/null +++ b/graphics/battle_anims/sprites/new/draco_meteor.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +189 0 189 +0 0 0 +18 18 18 +27 27 27 +35 35 35 +48 48 48 +53 53 53 +65 65 65 +74 74 74 +89 89 89 +98 98 98 +108 108 108 +119 119 119 +121 121 121 +137 137 137 +151 151 151 diff --git a/graphics/battle_anims/sprites/new/dragon_pulse_ring.png b/graphics/battle_anims/sprites/new/dragon_pulse_ring.png new file mode 100644 index 0000000000..44495f64b6 Binary files /dev/null and b/graphics/battle_anims/sprites/new/dragon_pulse_ring.png differ diff --git a/graphics/battle_anims/sprites/new/dreepy_missile.png b/graphics/battle_anims/sprites/new/dreepy_missile.png new file mode 100644 index 0000000000..73fe2d2f21 Binary files /dev/null and b/graphics/battle_anims/sprites/new/dreepy_missile.png differ diff --git a/graphics/battle_anims/sprites/new/drill.png b/graphics/battle_anims/sprites/new/drill.png new file mode 100644 index 0000000000..a97eeaaf50 Binary files /dev/null and b/graphics/battle_anims/sprites/new/drill.png differ diff --git a/graphics/battle_anims/sprites/new/embers.png b/graphics/battle_anims/sprites/new/embers.png new file mode 100644 index 0000000000..8bf2dd5aa6 Binary files /dev/null and b/graphics/battle_anims/sprites/new/embers.png differ diff --git a/graphics/battle_anims/sprites/new/energy_ball.png b/graphics/battle_anims/sprites/new/energy_ball.png new file mode 100644 index 0000000000..361d7ff71a Binary files /dev/null and b/graphics/battle_anims/sprites/new/energy_ball.png differ diff --git a/graphics/battle_anims/sprites/new/fairy_lock_chains.png b/graphics/battle_anims/sprites/new/fairy_lock_chains.png new file mode 100644 index 0000000000..8db2c26694 Binary files /dev/null and b/graphics/battle_anims/sprites/new/fairy_lock_chains.png differ diff --git a/graphics/battle_anims/sprites/new/fishies.png b/graphics/battle_anims/sprites/new/fishies.png new file mode 100644 index 0000000000..4abdbb9007 Binary files /dev/null and b/graphics/battle_anims/sprites/new/fishies.png differ diff --git a/graphics/battle_anims/sprites/new/flash_cannon_ball.png b/graphics/battle_anims/sprites/new/flash_cannon_ball.png new file mode 100644 index 0000000000..b08d1d39f4 Binary files /dev/null and b/graphics/battle_anims/sprites/new/flash_cannon_ball.png differ diff --git a/graphics/battle_anims/sprites/new/fly.png b/graphics/battle_anims/sprites/new/fly.png new file mode 100644 index 0000000000..dd1149de99 Binary files /dev/null and b/graphics/battle_anims/sprites/new/fly.png differ diff --git a/graphics/battle_anims/sprites/new/fusion_flare.pal b/graphics/battle_anims/sprites/new/fusion_flare.pal new file mode 100644 index 0000000000..7143d0fb4a --- /dev/null +++ b/graphics/battle_anims/sprites/new/fusion_flare.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +248 88 0 +248 0 16 +200 0 8 +144 0 0 +128 0 0 +112 0 0 +96 0 0 +80 0 0 +0 0 0 +0 0 0 +128 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/sprites/new/garbage_poison_column.pal b/graphics/battle_anims/sprites/new/garbage_poison_column.pal new file mode 100644 index 0000000000..e9ce028df0 --- /dev/null +++ b/graphics/battle_anims/sprites/new/garbage_poison_column.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 0 +255 255 255 +236 239 234 +216 222 212 +197 206 191 +177 189 169 +157 173 147 +138 156 126 +118 140 104 +98 123 82 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/sprites/new/gear.png b/graphics/battle_anims/sprites/new/gear.png new file mode 100644 index 0000000000..30f670c80c Binary files /dev/null and b/graphics/battle_anims/sprites/new/gear.png differ diff --git a/graphics/battle_anims/sprites/new/gigavolt_havoc_spear.png b/graphics/battle_anims/sprites/new/gigavolt_havoc_spear.png new file mode 100644 index 0000000000..7abc0bab58 Binary files /dev/null and b/graphics/battle_anims/sprites/new/gigavolt_havoc_spear.png differ diff --git a/graphics/battle_anims/sprites/new/golden_apple.png b/graphics/battle_anims/sprites/new/golden_apple.png new file mode 100644 index 0000000000..0898d7c6a0 Binary files /dev/null and b/graphics/battle_anims/sprites/new/golden_apple.png differ diff --git a/graphics/battle_anims/sprites/new/green_drake.pal b/graphics/battle_anims/sprites/new/green_drake.pal new file mode 100644 index 0000000000..697da896bc --- /dev/null +++ b/graphics/battle_anims/sprites/new/green_drake.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +164 148 139 +0 205 0 +0 180 0 +0 156 0 +0 123 16 +0 106 16 +0 82 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/sprites/new/green_star.png b/graphics/battle_anims/sprites/new/green_star.png new file mode 100644 index 0000000000..21218ceb6d Binary files /dev/null and b/graphics/battle_anims/sprites/new/green_star.png differ diff --git a/graphics/battle_anims/sprites/new/heart_stamp.png b/graphics/battle_anims/sprites/new/heart_stamp.png new file mode 100644 index 0000000000..4938e7e9ee Binary files /dev/null and b/graphics/battle_anims/sprites/new/heart_stamp.png differ diff --git a/graphics/battle_anims/sprites/new/hexes.png b/graphics/battle_anims/sprites/new/hexes.png new file mode 100644 index 0000000000..7f00eeaf1d Binary files /dev/null and b/graphics/battle_anims/sprites/new/hexes.png differ diff --git a/graphics/battle_anims/sprites/new/hoopa_hand.png b/graphics/battle_anims/sprites/new/hoopa_hand.png new file mode 100644 index 0000000000..02aaccf13c Binary files /dev/null and b/graphics/battle_anims/sprites/new/hoopa_hand.png differ diff --git a/graphics/battle_anims/sprites/new/hoopa_ring.png b/graphics/battle_anims/sprites/new/hoopa_ring.png new file mode 100644 index 0000000000..bc49e1ce31 Binary files /dev/null and b/graphics/battle_anims/sprites/new/hoopa_ring.png differ diff --git a/graphics/battle_anims/sprites/new/horn.png b/graphics/battle_anims/sprites/new/horn.png new file mode 100644 index 0000000000..9bdf61d7d9 Binary files /dev/null and b/graphics/battle_anims/sprites/new/horn.png differ diff --git a/graphics/battle_anims/sprites/new/horn_leech.png b/graphics/battle_anims/sprites/new/horn_leech.png new file mode 100644 index 0000000000..572079ee69 Binary files /dev/null and b/graphics/battle_anims/sprites/new/horn_leech.png differ diff --git a/graphics/battle_anims/sprites/new/horseshoe_fist.png b/graphics/battle_anims/sprites/new/horseshoe_fist.png new file mode 100644 index 0000000000..b8010530e2 Binary files /dev/null and b/graphics/battle_anims/sprites/new/horseshoe_fist.png differ diff --git a/graphics/battle_anims/sprites/new/hydro_pump.png b/graphics/battle_anims/sprites/new/hydro_pump.png new file mode 100644 index 0000000000..79e5b9d9cb Binary files /dev/null and b/graphics/battle_anims/sprites/new/hydro_pump.png differ diff --git a/graphics/battle_anims/sprites/new/ice_rock.png b/graphics/battle_anims/sprites/new/ice_rock.png new file mode 100644 index 0000000000..d5ecc19d6d Binary files /dev/null and b/graphics/battle_anims/sprites/new/ice_rock.png differ diff --git a/graphics/battle_anims/sprites/new/impact.pal b/graphics/battle_anims/sprites/new/impact.pal new file mode 100644 index 0000000000..644d27307c --- /dev/null +++ b/graphics/battle_anims/sprites/new/impact.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +255 0 0 +255 99 0 +255 156 0 +255 197 0 +255 214 99 +255 239 197 +0 0 0 +214 214 214 +99 140 99 +197 197 197 +230 230 230 +132 132 132 +165 165 165 +206 206 206 +247 247 247 diff --git a/graphics/battle_anims/sprites/new/large_spike.png b/graphics/battle_anims/sprites/new/large_spike.png new file mode 100644 index 0000000000..6af8634c57 Binary files /dev/null and b/graphics/battle_anims/sprites/new/large_spike.png differ diff --git a/graphics/battle_anims/sprites/new/leaves.png b/graphics/battle_anims/sprites/new/leaves.png new file mode 100644 index 0000000000..4ced398dae Binary files /dev/null and b/graphics/battle_anims/sprites/new/leaves.png differ diff --git a/graphics/battle_anims/sprites/new/leech_seed.png b/graphics/battle_anims/sprites/new/leech_seed.png new file mode 100644 index 0000000000..a0246870f8 Binary files /dev/null and b/graphics/battle_anims/sprites/new/leech_seed.png differ diff --git a/graphics/battle_anims/sprites/new/lightning_rain.png b/graphics/battle_anims/sprites/new/lightning_rain.png new file mode 100644 index 0000000000..c2d81405d0 Binary files /dev/null and b/graphics/battle_anims/sprites/new/lightning_rain.png differ diff --git a/graphics/battle_anims/sprites/new/mean_look.png b/graphics/battle_anims/sprites/new/mean_look.png new file mode 100644 index 0000000000..30e6eb5eea Binary files /dev/null and b/graphics/battle_anims/sprites/new/mean_look.png differ diff --git a/graphics/battle_anims/sprites/new/metal_bits.png b/graphics/battle_anims/sprites/new/metal_bits.png new file mode 100644 index 0000000000..637149e5d6 Binary files /dev/null and b/graphics/battle_anims/sprites/new/metal_bits.png differ diff --git a/graphics/battle_anims/sprites/new/mud_bomb.png b/graphics/battle_anims/sprites/new/mud_bomb.png new file mode 100644 index 0000000000..ebb03dfe49 Binary files /dev/null and b/graphics/battle_anims/sprites/new/mud_bomb.png differ diff --git a/graphics/battle_anims/sprites/new/mushroom.png b/graphics/battle_anims/sprites/new/mushroom.png new file mode 100644 index 0000000000..413503c26c Binary files /dev/null and b/graphics/battle_anims/sprites/new/mushroom.png differ diff --git a/graphics/battle_anims/sprites/new/natural_gift_ring.pal b/graphics/battle_anims/sprites/new/natural_gift_ring.pal new file mode 100644 index 0000000000..10ac6cb7ec --- /dev/null +++ b/graphics/battle_anims/sprites/new/natural_gift_ring.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +255 255 255 +214 255 181 +197 255 156 +189 255 132 +173 255 115 +173 255 107 +165 255 99 +156 255 82 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/sprites/new/necrozma_star.png b/graphics/battle_anims/sprites/new/necrozma_star.png new file mode 100644 index 0000000000..ffd7246600 Binary files /dev/null and b/graphics/battle_anims/sprites/new/necrozma_star.png differ diff --git a/graphics/battle_anims/sprites/new/obstruct.png b/graphics/battle_anims/sprites/new/obstruct.png new file mode 100644 index 0000000000..79400e6e15 Binary files /dev/null and b/graphics/battle_anims/sprites/new/obstruct.png differ diff --git a/graphics/battle_anims/sprites/new/omega_stone.png b/graphics/battle_anims/sprites/new/omega_stone.png new file mode 100644 index 0000000000..d9aa568bee Binary files /dev/null and b/graphics/battle_anims/sprites/new/omega_stone.png differ diff --git a/graphics/battle_anims/sprites/new/pink_diamond.png b/graphics/battle_anims/sprites/new/pink_diamond.png new file mode 100644 index 0000000000..120848fa16 Binary files /dev/null and b/graphics/battle_anims/sprites/new/pink_diamond.png differ diff --git a/graphics/battle_anims/sprites/new/poison_column.png b/graphics/battle_anims/sprites/new/poison_column.png new file mode 100644 index 0000000000..dfe0bb27ec Binary files /dev/null and b/graphics/battle_anims/sprites/new/poison_column.png differ diff --git a/graphics/battle_anims/sprites/new/poison_jab.png b/graphics/battle_anims/sprites/new/poison_jab.png new file mode 100644 index 0000000000..02bbf1b857 Binary files /dev/null and b/graphics/battle_anims/sprites/new/poison_jab.png differ diff --git a/graphics/battle_anims/sprites/new/power_gem.png b/graphics/battle_anims/sprites/new/power_gem.png new file mode 100644 index 0000000000..5523bb8a75 Binary files /dev/null and b/graphics/battle_anims/sprites/new/power_gem.png differ diff --git a/graphics/battle_anims/sprites/new/power_trick.png b/graphics/battle_anims/sprites/new/power_trick.png new file mode 100644 index 0000000000..53f9927634 Binary files /dev/null and b/graphics/battle_anims/sprites/new/power_trick.png differ diff --git a/graphics/battle_anims/sprites/new/punishment.png b/graphics/battle_anims/sprites/new/punishment.png new file mode 100644 index 0000000000..9215b6ec07 Binary files /dev/null and b/graphics/battle_anims/sprites/new/punishment.png differ diff --git a/graphics/battle_anims/sprites/new/purple_drake.png b/graphics/battle_anims/sprites/new/purple_drake.png new file mode 100644 index 0000000000..372f9a3789 Binary files /dev/null and b/graphics/battle_anims/sprites/new/purple_drake.png differ diff --git a/graphics/battle_anims/sprites/new/quick_guard.png b/graphics/battle_anims/sprites/new/quick_guard.png new file mode 100644 index 0000000000..71d343eeb5 Binary files /dev/null and b/graphics/battle_anims/sprites/new/quick_guard.png differ diff --git a/graphics/battle_anims/sprites/new/razor_shell.png b/graphics/battle_anims/sprites/new/razor_shell.png new file mode 100644 index 0000000000..fa39b37fa6 Binary files /dev/null and b/graphics/battle_anims/sprites/new/razor_shell.png differ diff --git a/graphics/battle_anims/sprites/new/rock_small.png b/graphics/battle_anims/sprites/new/rock_small.png new file mode 100644 index 0000000000..1ec3be87a4 Binary files /dev/null and b/graphics/battle_anims/sprites/new/rock_small.png differ diff --git a/graphics/battle_anims/sprites/new/rocks.png b/graphics/battle_anims/sprites/new/rocks.png new file mode 100644 index 0000000000..4393817a77 Binary files /dev/null and b/graphics/battle_anims/sprites/new/rocks.png differ diff --git a/graphics/battle_anims/sprites/new/shell_left.png b/graphics/battle_anims/sprites/new/shell_left.png new file mode 100644 index 0000000000..fda9142ad0 Binary files /dev/null and b/graphics/battle_anims/sprites/new/shell_left.png differ diff --git a/graphics/battle_anims/sprites/new/shell_right.png b/graphics/battle_anims/sprites/new/shell_right.png new file mode 100644 index 0000000000..70f5235a77 Binary files /dev/null and b/graphics/battle_anims/sprites/new/shell_right.png differ diff --git a/graphics/battle_anims/sprites/new/spacial_rend_slices.pal b/graphics/battle_anims/sprites/new/spacial_rend_slices.pal new file mode 100644 index 0000000000..7a8b9dd554 --- /dev/null +++ b/graphics/battle_anims/sprites/new/spacial_rend_slices.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +99 41 255 +0 0 0 +206 115 206 +214 123 206 +222 181 247 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/sprites/new/spikes.png b/graphics/battle_anims/sprites/new/spikes.png new file mode 100644 index 0000000000..33080420ec Binary files /dev/null and b/graphics/battle_anims/sprites/new/spikes.png differ diff --git a/graphics/battle_anims/sprites/new/spirit_shackle_arrow.png b/graphics/battle_anims/sprites/new/spirit_shackle_arrow.png new file mode 100644 index 0000000000..ff86f33d21 Binary files /dev/null and b/graphics/battle_anims/sprites/new/spirit_shackle_arrow.png differ diff --git a/graphics/battle_anims/sprites/new/stealth_rock.png b/graphics/battle_anims/sprites/new/stealth_rock.png new file mode 100644 index 0000000000..6ade3bb879 Binary files /dev/null and b/graphics/battle_anims/sprites/new/stealth_rock.png differ diff --git a/graphics/battle_anims/sprites/new/steam_eruption.png b/graphics/battle_anims/sprites/new/steam_eruption.png new file mode 100644 index 0000000000..2eb8535654 Binary files /dev/null and b/graphics/battle_anims/sprites/new/steam_eruption.png differ diff --git a/graphics/battle_anims/sprites/new/steamroller.png b/graphics/battle_anims/sprites/new/steamroller.png new file mode 100644 index 0000000000..8abdef6692 Binary files /dev/null and b/graphics/battle_anims/sprites/new/steamroller.png differ diff --git a/graphics/battle_anims/sprites/new/stone_edge.png b/graphics/battle_anims/sprites/new/stone_edge.png new file mode 100644 index 0000000000..8e27efb9a2 Binary files /dev/null and b/graphics/battle_anims/sprites/new/stone_edge.png differ diff --git a/graphics/battle_anims/sprites/new/stone_pillar.png b/graphics/battle_anims/sprites/new/stone_pillar.png new file mode 100644 index 0000000000..8ee5d4a2fa Binary files /dev/null and b/graphics/battle_anims/sprites/new/stone_pillar.png differ diff --git a/graphics/battle_anims/sprites/new/straight_beam.png b/graphics/battle_anims/sprites/new/straight_beam.png new file mode 100644 index 0000000000..c13ae95d0b Binary files /dev/null and b/graphics/battle_anims/sprites/new/straight_beam.png differ diff --git a/graphics/battle_anims/sprites/new/substitute_back.png b/graphics/battle_anims/sprites/new/substitute_back.png new file mode 100644 index 0000000000..fd31e1063c Binary files /dev/null and b/graphics/battle_anims/sprites/new/substitute_back.png differ diff --git a/graphics/battle_anims/sprites/new/substitute_front.png b/graphics/battle_anims/sprites/new/substitute_front.png new file mode 100644 index 0000000000..5d563900c0 Binary files /dev/null and b/graphics/battle_anims/sprites/new/substitute_front.png differ diff --git a/graphics/battle_anims/sprites/new/surf_new.pal b/graphics/battle_anims/sprites/new/surf_new.pal new file mode 100644 index 0000000000..c81c2ec9e8 --- /dev/null +++ b/graphics/battle_anims/sprites/new/surf_new.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +104 144 136 +65 164 213 +74 172 238 +82 180 255 +98 197 255 +123 189 230 +131 213 255 +156 230 255 +248 248 248 +65 164 213 +74 172 238 +131 205 246 +222 255 255 +248 248 248 +0 0 0 +0 0 0 diff --git a/graphics/battle_anims/sprites/new/sword.png b/graphics/battle_anims/sprites/new/sword.png new file mode 100644 index 0000000000..9d037b9a94 Binary files /dev/null and b/graphics/battle_anims/sprites/new/sword.png differ diff --git a/graphics/battle_anims/sprites/new/teeth.png b/graphics/battle_anims/sprites/new/teeth.png new file mode 100644 index 0000000000..53b3bce279 Binary files /dev/null and b/graphics/battle_anims/sprites/new/teeth.png differ diff --git a/graphics/battle_anims/sprites/new/thrash.png b/graphics/battle_anims/sprites/new/thrash.png new file mode 100644 index 0000000000..c225cac60c Binary files /dev/null and b/graphics/battle_anims/sprites/new/thrash.png differ diff --git a/graphics/battle_anims/sprites/new/tornado.png b/graphics/battle_anims/sprites/new/tornado.png new file mode 100644 index 0000000000..30372e33d0 Binary files /dev/null and b/graphics/battle_anims/sprites/new/tornado.png differ diff --git a/graphics/battle_anims/sprites/new/water_gun.png b/graphics/battle_anims/sprites/new/water_gun.png new file mode 100644 index 0000000000..4f30b2133d Binary files /dev/null and b/graphics/battle_anims/sprites/new/water_gun.png differ diff --git a/graphics/battle_anims/sprites/new/wood.png b/graphics/battle_anims/sprites/new/wood.png new file mode 100644 index 0000000000..1b64a647f5 Binary files /dev/null and b/graphics/battle_anims/sprites/new/wood.png differ diff --git a/graphics/battle_anims/sprites/new/z_move_symbol.png b/graphics/battle_anims/sprites/new/z_move_symbol.png new file mode 100644 index 0000000000..bcb3098754 Binary files /dev/null and b/graphics/battle_anims/sprites/new/z_move_symbol.png differ diff --git a/graphics/battle_anims/sprites/poison_jab.png b/graphics/battle_anims/sprites/poison_jab.png new file mode 100644 index 0000000000..e7871a2c9d Binary files /dev/null and b/graphics/battle_anims/sprites/poison_jab.png differ diff --git a/graphics/battle_anims/sprites/power_gem.png b/graphics/battle_anims/sprites/power_gem.png new file mode 100644 index 0000000000..8d9ad469e3 Binary files /dev/null and b/graphics/battle_anims/sprites/power_gem.png differ diff --git a/graphics/battle_anims/sprites/psycho_cut.png b/graphics/battle_anims/sprites/psycho_cut.png new file mode 100644 index 0000000000..3eb1de7d2a Binary files /dev/null and b/graphics/battle_anims/sprites/psycho_cut.png differ diff --git a/graphics/battle_anims/sprites/punishment.png b/graphics/battle_anims/sprites/punishment.png new file mode 100644 index 0000000000..9215b6ec07 Binary files /dev/null and b/graphics/battle_anims/sprites/punishment.png differ diff --git a/graphics/battle_anims/sprites/purple_jab.png b/graphics/battle_anims/sprites/purple_jab.png new file mode 100644 index 0000000000..2c15153b93 Binary files /dev/null and b/graphics/battle_anims/sprites/purple_jab.png differ diff --git a/graphics/battle_anims/sprites/quick_guard.png b/graphics/battle_anims/sprites/quick_guard.png new file mode 100644 index 0000000000..71d343eeb5 Binary files /dev/null and b/graphics/battle_anims/sprites/quick_guard.png differ diff --git a/graphics/battle_anims/sprites/seed_new.png b/graphics/battle_anims/sprites/seed_new.png new file mode 100644 index 0000000000..74f42d7aba Binary files /dev/null and b/graphics/battle_anims/sprites/seed_new.png differ diff --git a/graphics/battle_anims/sprites/small_cloud.png b/graphics/battle_anims/sprites/small_cloud.png new file mode 100644 index 0000000000..2733a71dca Binary files /dev/null and b/graphics/battle_anims/sprites/small_cloud.png differ diff --git a/graphics/battle_anims/sprites/stealth_rock.png b/graphics/battle_anims/sprites/stealth_rock.png new file mode 100644 index 0000000000..8b38ae1c17 Binary files /dev/null and b/graphics/battle_anims/sprites/stealth_rock.png differ diff --git a/graphics/battle_anims/sprites/stone_edge.png b/graphics/battle_anims/sprites/stone_edge.png new file mode 100644 index 0000000000..44f678d8db Binary files /dev/null and b/graphics/battle_anims/sprites/stone_edge.png differ diff --git a/graphics/battle_anims/sprites/toxic_spikes.png b/graphics/battle_anims/sprites/toxic_spikes.png new file mode 100644 index 0000000000..3102949fd5 Binary files /dev/null and b/graphics/battle_anims/sprites/toxic_spikes.png differ diff --git a/graphics/battle_anims/sprites/trump_card_particles.png b/graphics/battle_anims/sprites/trump_card_particles.png new file mode 100644 index 0000000000..cec1a463cd Binary files /dev/null and b/graphics/battle_anims/sprites/trump_card_particles.png differ diff --git a/graphics/battle_anims/sprites/trump_cards.png b/graphics/battle_anims/sprites/trump_cards.png new file mode 100644 index 0000000000..64c3b00167 Binary files /dev/null and b/graphics/battle_anims/sprites/trump_cards.png differ diff --git a/graphics/battle_anims/sprites/water_gun.png b/graphics/battle_anims/sprites/water_gun.png new file mode 100644 index 0000000000..4f30b2133d Binary files /dev/null and b/graphics/battle_anims/sprites/water_gun.png differ diff --git a/graphics/battle_anims/sprites/white_streak.png b/graphics/battle_anims/sprites/white_streak.png new file mode 100644 index 0000000000..7328ff1512 Binary files /dev/null and b/graphics/battle_anims/sprites/white_streak.png differ diff --git a/graphics/battle_anims/sprites/wood_hammer.png b/graphics/battle_anims/sprites/wood_hammer.png new file mode 100644 index 0000000000..5768605f80 Binary files /dev/null and b/graphics/battle_anims/sprites/wood_hammer.png differ diff --git a/graphics/battle_anims/sprites/worry_seed.png b/graphics/battle_anims/sprites/worry_seed.png new file mode 100644 index 0000000000..2f6d68b294 Binary files /dev/null and b/graphics/battle_anims/sprites/worry_seed.png differ diff --git a/graphics/battle_anims/sprites/wring_out.png b/graphics/battle_anims/sprites/wring_out.png new file mode 100644 index 0000000000..b96ffdbd2e Binary files /dev/null and b/graphics/battle_anims/sprites/wring_out.png differ diff --git a/graphics/battle_interface/ability_pop_up.png b/graphics/battle_interface/ability_pop_up.png new file mode 100644 index 0000000000..4b549b1b53 Binary files /dev/null and b/graphics/battle_interface/ability_pop_up.png differ diff --git a/graphics/battle_interface/mega_indicator.png b/graphics/battle_interface/mega_indicator.png new file mode 100644 index 0000000000..93e113ded4 Binary files /dev/null and b/graphics/battle_interface/mega_indicator.png differ diff --git a/graphics/battle_interface/mega_trigger.pal b/graphics/battle_interface/mega_trigger.pal new file mode 100644 index 0000000000..2672d1f10a --- /dev/null +++ b/graphics/battle_interface/mega_trigger.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +185 207 163 +77 105 97 +199 159 199 +221 177 207 +57 151 117 +139 221 253 +247 161 133 +255 255 255 +153 87 67 +233 233 125 +129 255 223 +149 147 247 +195 207 201 +123 151 135 +0 0 0 +0 0 0 diff --git a/graphics/battle_interface/mega_trigger.png b/graphics/battle_interface/mega_trigger.png new file mode 100644 index 0000000000..a269ee738c Binary files /dev/null and b/graphics/battle_interface/mega_trigger.png differ diff --git a/graphics/interface/split_icons.png b/graphics/interface/split_icons.png new file mode 100644 index 0000000000..1c7d63c9eb Binary files /dev/null and b/graphics/interface/split_icons.png differ diff --git a/graphics/items/icon_palettes/acro_bike.pal b/graphics/items/icon_palettes/acro_bike.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/aguav_berry.pal b/graphics/items/icon_palettes/aguav_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/amulet_coin.pal b/graphics/items/icon_palettes/amulet_coin.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/antidote.pal b/graphics/items/icon_palettes/antidote.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/apicot_berry.pal b/graphics/items/icon_palettes/apicot_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/aspear_berry.pal b/graphics/items/icon_palettes/aspear_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/aurora_ticket.pal b/graphics/items/icon_palettes/aurora_ticket.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/awakening.pal b/graphics/items/icon_palettes/awakening.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/bead_mail.pal b/graphics/items/icon_palettes/bead_mail.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/belue_berry.pal b/graphics/items/icon_palettes/belue_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/berry_juice.pal b/graphics/items/icon_palettes/berry_juice.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/berry_pouch.pal b/graphics/items/icon_palettes/berry_pouch.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/bicycle.pal b/graphics/items/icon_palettes/bicycle.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/bike_voucher.pal b/graphics/items/icon_palettes/bike_voucher.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/black_flute.pal b/graphics/items/icon_palettes/black_flute.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/black_type_enhancing_item.pal b/graphics/items/icon_palettes/black_type_enhancing_item.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/blue_flute.pal b/graphics/items/icon_palettes/blue_flute.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/blue_orb.pal b/graphics/items/icon_palettes/blue_orb.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/blue_scarf.pal b/graphics/items/icon_palettes/blue_scarf.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/blue_shard.pal b/graphics/items/icon_palettes/blue_shard.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/bluk_berry.pal b/graphics/items/icon_palettes/bluk_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/bright_powder.pal b/graphics/items/icon_palettes/bright_powder.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/burn_heal.pal b/graphics/items/icon_palettes/burn_heal.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/calcium.pal b/graphics/items/icon_palettes/calcium.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/carbos.pal b/graphics/items/icon_palettes/carbos.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/card_key.pal b/graphics/items/icon_palettes/card_key.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/charcoal.pal b/graphics/items/icon_palettes/charcoal.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/cheri_berry.pal b/graphics/items/icon_palettes/cheri_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/chesto_berry.pal b/graphics/items/icon_palettes/chesto_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/choice_band.pal b/graphics/items/icon_palettes/choice_band.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/cleanse_tag.pal b/graphics/items/icon_palettes/cleanse_tag.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/coin_case.pal b/graphics/items/icon_palettes/coin_case.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/contest_pass.pal b/graphics/items/icon_palettes/contest_pass.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/cornn_berry.pal b/graphics/items/icon_palettes/cornn_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/dark_tm_hm.pal b/graphics/items/icon_palettes/dark_tm_hm.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/deep_sea_scale.pal b/graphics/items/icon_palettes/deep_sea_scale.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/deep_sea_tooth.pal b/graphics/items/icon_palettes/deep_sea_tooth.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/devon_goods.pal b/graphics/items/icon_palettes/devon_goods.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/devon_scope.pal b/graphics/items/icon_palettes/devon_scope.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/dire_hit.pal b/graphics/items/icon_palettes/dire_hit.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/dive_ball.pal b/graphics/items/icon_palettes/dive_ball.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/dragon_fang.pal b/graphics/items/icon_palettes/dragon_fang.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/dragon_scale.pal b/graphics/items/icon_palettes/dragon_scale.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/dragon_tm_hm.pal b/graphics/items/icon_palettes/dragon_tm_hm.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/dream_mail.pal b/graphics/items/icon_palettes/dream_mail.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/durin_berry.pal b/graphics/items/icon_palettes/durin_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/electric_tm_hm.pal b/graphics/items/icon_palettes/electric_tm_hm.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/elixir.pal b/graphics/items/icon_palettes/elixir.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/energy_powder.pal b/graphics/items/icon_palettes/energy_powder.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/energy_root.pal b/graphics/items/icon_palettes/energy_root.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/enigma_berry.pal b/graphics/items/icon_palettes/enigma_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/eon_ticket.pal b/graphics/items/icon_palettes/eon_ticket.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/escape_rope.pal b/graphics/items/icon_palettes/escape_rope.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/ether.pal b/graphics/items/icon_palettes/ether.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/everstone.pal b/graphics/items/icon_palettes/everstone.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/exp_share.pal b/graphics/items/icon_palettes/exp_share.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/fab_mail.pal b/graphics/items/icon_palettes/fab_mail.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/fame_checker.pal b/graphics/items/icon_palettes/fame_checker.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/fighting_tm_hm.pal b/graphics/items/icon_palettes/fighting_tm_hm.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/figy_berry.pal b/graphics/items/icon_palettes/figy_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/fire_stone.pal b/graphics/items/icon_palettes/fire_stone.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/fire_tm_hm.pal b/graphics/items/icon_palettes/fire_tm_hm.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/fluffy_tail.pal b/graphics/items/icon_palettes/fluffy_tail.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/flying_tm_hm.pal b/graphics/items/icon_palettes/flying_tm_hm.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/focus_band.pal b/graphics/items/icon_palettes/focus_band.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/fresh_water.pal b/graphics/items/icon_palettes/fresh_water.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/full_heal.pal b/graphics/items/icon_palettes/full_heal.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/full_restore.pal b/graphics/items/icon_palettes/full_restore.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/ganlon_berry.pal b/graphics/items/icon_palettes/ganlon_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/ghost_tm_hm.pal b/graphics/items/icon_palettes/ghost_tm_hm.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/glitter_mail.pal b/graphics/items/icon_palettes/glitter_mail.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/go_goggles.pal b/graphics/items/icon_palettes/go_goggles.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/gold_teeth.pal b/graphics/items/icon_palettes/gold_teeth.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/good_rod.pal b/graphics/items/icon_palettes/good_rod.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/grass_tm_hm.pal b/graphics/items/icon_palettes/grass_tm_hm.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/great_ball.pal b/graphics/items/icon_palettes/great_ball.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/green_scarf.pal b/graphics/items/icon_palettes/green_scarf.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/green_shard.pal b/graphics/items/icon_palettes/green_shard.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/grepa_berry.pal b/graphics/items/icon_palettes/grepa_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/ground_tm_hm.pal b/graphics/items/icon_palettes/ground_tm_hm.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/guard_spec.pal b/graphics/items/icon_palettes/guard_spec.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/harbor_mail.pal b/graphics/items/icon_palettes/harbor_mail.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/hard_stone.pal b/graphics/items/icon_palettes/hard_stone.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/heal_powder.pal b/graphics/items/icon_palettes/heal_powder.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/heart_scale.pal b/graphics/items/icon_palettes/heart_scale.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/hoenn_fossil.pal b/graphics/items/icon_palettes/hoenn_fossil.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/hondew_berry.pal b/graphics/items/icon_palettes/hondew_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/hp_up.pal b/graphics/items/icon_palettes/hp_up.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/hyper_potion.pal b/graphics/items/icon_palettes/hyper_potion.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/iapapa_berry.pal b/graphics/items/icon_palettes/iapapa_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/ice_heal.pal b/graphics/items/icon_palettes/ice_heal.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/ice_tm_hm.pal b/graphics/items/icon_palettes/ice_tm_hm.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/iron.pal b/graphics/items/icon_palettes/iron.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/itemfinder.pal b/graphics/items/icon_palettes/itemfinder.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/kanto_fossil.pal b/graphics/items/icon_palettes/kanto_fossil.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/kelpsy_berry.pal b/graphics/items/icon_palettes/kelpsy_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/key.pal b/graphics/items/icon_palettes/key.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/kings_rock.pal b/graphics/items/icon_palettes/kings_rock.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/lansat_berry.pal b/graphics/items/icon_palettes/lansat_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/lava_cookie_and_letter.pal b/graphics/items/icon_palettes/lava_cookie_and_letter.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/lax_incense.pal b/graphics/items/icon_palettes/lax_incense.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/leaf_stone.pal b/graphics/items/icon_palettes/leaf_stone.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/leftovers.pal b/graphics/items/icon_palettes/leftovers.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/lemonade.pal b/graphics/items/icon_palettes/lemonade.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/leppa_berry.pal b/graphics/items/icon_palettes/leppa_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/liechi_berry.pal b/graphics/items/icon_palettes/liechi_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/light_ball.pal b/graphics/items/icon_palettes/light_ball.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/lucky_egg.pal b/graphics/items/icon_palettes/lucky_egg.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/lucky_punch.pal b/graphics/items/icon_palettes/lucky_punch.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/lum_berry.pal b/graphics/items/icon_palettes/lum_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/luxury_ball.pal b/graphics/items/icon_palettes/luxury_ball.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/mach_bike.pal b/graphics/items/icon_palettes/mach_bike.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/macho_brace.pal b/graphics/items/icon_palettes/macho_brace.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/magma_emblem.pal b/graphics/items/icon_palettes/magma_emblem.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/magnet.pal b/graphics/items/icon_palettes/magnet.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/mago_berry.pal b/graphics/items/icon_palettes/mago_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/magost_berry.pal b/graphics/items/icon_palettes/magost_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/master_ball.pal b/graphics/items/icon_palettes/master_ball.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/max_elixir.pal b/graphics/items/icon_palettes/max_elixir.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/max_ether.pal b/graphics/items/icon_palettes/max_ether.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/max_potion.pal b/graphics/items/icon_palettes/max_potion.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/max_repel.pal b/graphics/items/icon_palettes/max_repel.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/mech_mail.pal b/graphics/items/icon_palettes/mech_mail.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/mental_herb.pal b/graphics/items/icon_palettes/mental_herb.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/metal_coat.pal b/graphics/items/icon_palettes/metal_coat.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/metal_powder.pal b/graphics/items/icon_palettes/metal_powder.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/meteorite.pal b/graphics/items/icon_palettes/meteorite.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/miracle_seed.pal b/graphics/items/icon_palettes/miracle_seed.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/moomoo_milk.pal b/graphics/items/icon_palettes/moomoo_milk.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/moon_stone.pal b/graphics/items/icon_palettes/moon_stone.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/mushroom.pal b/graphics/items/icon_palettes/mushroom.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/mystic_ticket.pal b/graphics/items/icon_palettes/mystic_ticket.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/mystic_water.pal b/graphics/items/icon_palettes/mystic_water.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/nanab_berry.pal b/graphics/items/icon_palettes/nanab_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/nest_ball.pal b/graphics/items/icon_palettes/nest_ball.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/net_ball.pal b/graphics/items/icon_palettes/net_ball.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/never_melt_ice.pal b/graphics/items/icon_palettes/never_melt_ice.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/nomel_berry.pal b/graphics/items/icon_palettes/nomel_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/normal_tm_hm.pal b/graphics/items/icon_palettes/normal_tm_hm.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/nugget.pal b/graphics/items/icon_palettes/nugget.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/oaks_parcel.pal b/graphics/items/icon_palettes/oaks_parcel.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/old_amber.pal b/graphics/items/icon_palettes/old_amber.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/old_key.pal b/graphics/items/icon_palettes/old_key.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/old_rod.pal b/graphics/items/icon_palettes/old_rod.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/old_sea_map.pal b/graphics/items/icon_palettes/old_sea_map.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/oran_berry.pal b/graphics/items/icon_palettes/oran_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/orange_mail.pal b/graphics/items/icon_palettes/orange_mail.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/pamtre_berry.pal b/graphics/items/icon_palettes/pamtre_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/paralyze_heal.pal b/graphics/items/icon_palettes/paralyze_heal.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/pearl.pal b/graphics/items/icon_palettes/pearl.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/pecha_berry.pal b/graphics/items/icon_palettes/pecha_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/persim_berry.pal b/graphics/items/icon_palettes/persim_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/petaya_berry.pal b/graphics/items/icon_palettes/petaya_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/pinap_berry.pal b/graphics/items/icon_palettes/pinap_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/pink_scarf.pal b/graphics/items/icon_palettes/pink_scarf.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/poison_barb.pal b/graphics/items/icon_palettes/poison_barb.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/poison_tm_hm.pal b/graphics/items/icon_palettes/poison_tm_hm.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/poke_ball.pal b/graphics/items/icon_palettes/poke_ball.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/poke_doll.pal b/graphics/items/icon_palettes/poke_doll.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/poke_flute.pal b/graphics/items/icon_palettes/poke_flute.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/pokeblock_case.pal b/graphics/items/icon_palettes/pokeblock_case.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/pomeg_berry.pal b/graphics/items/icon_palettes/pomeg_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/potion.pal b/graphics/items/icon_palettes/potion.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/powder_jar.pal b/graphics/items/icon_palettes/powder_jar.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/pp_max.pal b/graphics/items/icon_palettes/pp_max.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/pp_up.pal b/graphics/items/icon_palettes/pp_up.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/protein.pal b/graphics/items/icon_palettes/protein.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/psychic_tm_hm.pal b/graphics/items/icon_palettes/psychic_tm_hm.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/qualot_berry.pal b/graphics/items/icon_palettes/qualot_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/question_mark.pal b/graphics/items/icon_palettes/question_mark.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/quick_claw.pal b/graphics/items/icon_palettes/quick_claw.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/rabuta_berry.pal b/graphics/items/icon_palettes/rabuta_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/rainbow_pass.pal b/graphics/items/icon_palettes/rainbow_pass.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/rare_candy.pal b/graphics/items/icon_palettes/rare_candy.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/rawst_berry.pal b/graphics/items/icon_palettes/rawst_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/razz_berry.pal b/graphics/items/icon_palettes/razz_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/red_flute.pal b/graphics/items/icon_palettes/red_flute.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/red_orb.pal b/graphics/items/icon_palettes/red_orb.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/red_scarf.pal b/graphics/items/icon_palettes/red_scarf.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/red_shard.pal b/graphics/items/icon_palettes/red_shard.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/repeat_ball.pal b/graphics/items/icon_palettes/repeat_ball.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/repel.pal b/graphics/items/icon_palettes/repel.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/retro_mail.pal b/graphics/items/icon_palettes/retro_mail.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/return_to_field_arrow.pal b/graphics/items/icon_palettes/return_to_field_arrow.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/revival_herb.pal b/graphics/items/icon_palettes/revival_herb.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/revive.pal b/graphics/items/icon_palettes/revive.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/rock_tm_hm.pal b/graphics/items/icon_palettes/rock_tm_hm.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/ruby.pal b/graphics/items/icon_palettes/ruby.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/sacred_ash.pal b/graphics/items/icon_palettes/sacred_ash.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/safari_ball.pal b/graphics/items/icon_palettes/safari_ball.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/salac_berry.pal b/graphics/items/icon_palettes/salac_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/sapphire.pal b/graphics/items/icon_palettes/sapphire.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/scanner.pal b/graphics/items/icon_palettes/scanner.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/scope_lens.pal b/graphics/items/icon_palettes/scope_lens.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/sea_incense.pal b/graphics/items/icon_palettes/sea_incense.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/secret_key.pal b/graphics/items/icon_palettes/secret_key.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/shadow_mail.pal b/graphics/items/icon_palettes/shadow_mail.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/sharp_beak.pal b/graphics/items/icon_palettes/sharp_beak.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/shell.pal b/graphics/items/icon_palettes/shell.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/shoal_salt.pal b/graphics/items/icon_palettes/shoal_salt.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/silk_scarf.pal b/graphics/items/icon_palettes/silk_scarf.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/silph_scope.pal b/graphics/items/icon_palettes/silph_scope.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/silver_powder.pal b/graphics/items/icon_palettes/silver_powder.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/sitrus_berry.pal b/graphics/items/icon_palettes/sitrus_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/smoke_ball.pal b/graphics/items/icon_palettes/smoke_ball.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/soda_pop.pal b/graphics/items/icon_palettes/soda_pop.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/soft_sand.pal b/graphics/items/icon_palettes/soft_sand.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/soot_sack.pal b/graphics/items/icon_palettes/soot_sack.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/soothe_bell.pal b/graphics/items/icon_palettes/soothe_bell.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/soul_dew.pal b/graphics/items/icon_palettes/soul_dew.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/spell_tag.pal b/graphics/items/icon_palettes/spell_tag.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/spelon_berry.pal b/graphics/items/icon_palettes/spelon_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/ss_ticket.pal b/graphics/items/icon_palettes/ss_ticket.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/star.pal b/graphics/items/icon_palettes/star.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/starf_berry.pal b/graphics/items/icon_palettes/starf_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/steel_tm_hm.pal b/graphics/items/icon_palettes/steel_tm_hm.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/stick.pal b/graphics/items/icon_palettes/stick.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/sun_stone.pal b/graphics/items/icon_palettes/sun_stone.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/super_potion.pal b/graphics/items/icon_palettes/super_potion.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/super_repel.pal b/graphics/items/icon_palettes/super_repel.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/super_rod.pal b/graphics/items/icon_palettes/super_rod.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/tamato_berry.pal b/graphics/items/icon_palettes/tamato_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/tea.pal b/graphics/items/icon_palettes/tea.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/teachy_tv.pal b/graphics/items/icon_palettes/teachy_tv.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/thick_club.pal b/graphics/items/icon_palettes/thick_club.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/thunder_stone.pal b/graphics/items/icon_palettes/thunder_stone.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/tm_case.pal b/graphics/items/icon_palettes/tm_case.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/town_map.pal b/graphics/items/icon_palettes/town_map.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/tri_pass.pal b/graphics/items/icon_palettes/tri_pass.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/tropic_mail.pal b/graphics/items/icon_palettes/tropic_mail.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/twisted_spoon.pal b/graphics/items/icon_palettes/twisted_spoon.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/ultra_ball.pal b/graphics/items/icon_palettes/ultra_ball.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/up_grade.pal b/graphics/items/icon_palettes/up_grade.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/vs_seeker.pal b/graphics/items/icon_palettes/vs_seeker.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/wailmer_pail.pal b/graphics/items/icon_palettes/wailmer_pail.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/water_stone.pal b/graphics/items/icon_palettes/water_stone.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/water_tm_hm.pal b/graphics/items/icon_palettes/water_tm_hm.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/watmel_berry.pal b/graphics/items/icon_palettes/watmel_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/wave_mail.pal b/graphics/items/icon_palettes/wave_mail.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/wepear_berry.pal b/graphics/items/icon_palettes/wepear_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/white_flute.pal b/graphics/items/icon_palettes/white_flute.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/white_herb.pal b/graphics/items/icon_palettes/white_herb.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/wiki_berry.pal b/graphics/items/icon_palettes/wiki_berry.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/wood_mail.pal b/graphics/items/icon_palettes/wood_mail.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/x_accuracy.pal b/graphics/items/icon_palettes/x_accuracy.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/x_attack.pal b/graphics/items/icon_palettes/x_attack.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/x_defend.pal b/graphics/items/icon_palettes/x_defend.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/x_special.pal b/graphics/items/icon_palettes/x_special.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/x_speed.pal b/graphics/items/icon_palettes/x_speed.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/yellow_flute.pal b/graphics/items/icon_palettes/yellow_flute.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/yellow_scarf.pal b/graphics/items/icon_palettes/yellow_scarf.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/yellow_shard.pal b/graphics/items/icon_palettes/yellow_shard.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/zinc.pal b/graphics/items/icon_palettes/zinc.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icons/acro_bike.png b/graphics/items/icons/acro_bike.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/aguav_berry.png b/graphics/items/icons/aguav_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/amulet_coin.png b/graphics/items/icons/amulet_coin.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/antidote.png b/graphics/items/icons/antidote.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/apicot_berry.png b/graphics/items/icons/apicot_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/aspear_berry.png b/graphics/items/icons/aspear_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/aurora_ticket.png b/graphics/items/icons/aurora_ticket.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/basement_key.png b/graphics/items/icons/basement_key.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/battle_stat_item.png b/graphics/items/icons/battle_stat_item.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/bead_mail.png b/graphics/items/icons/bead_mail.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/belue_berry.png b/graphics/items/icons/belue_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/berry_juice.png b/graphics/items/icons/berry_juice.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/berry_pouch.png b/graphics/items/icons/berry_pouch.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/bicycle.png b/graphics/items/icons/bicycle.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/big_mushroom.png b/graphics/items/icons/big_mushroom.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/big_pearl.png b/graphics/items/icons/big_pearl.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/bike_voucher.png b/graphics/items/icons/bike_voucher.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/black_belt.png b/graphics/items/icons/black_belt.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/black_glasses.png b/graphics/items/icons/black_glasses.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/bluk_berry.png b/graphics/items/icons/bluk_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/bright_powder.png b/graphics/items/icons/bright_powder.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/card_key.png b/graphics/items/icons/card_key.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/charcoal.png b/graphics/items/icons/charcoal.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/cheri_berry.png b/graphics/items/icons/cheri_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/chesto_berry.png b/graphics/items/icons/chesto_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/choice_band.png b/graphics/items/icons/choice_band.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/claw_fossil.png b/graphics/items/icons/claw_fossil.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/cleanse_tag.png b/graphics/items/icons/cleanse_tag.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/coin_case.png b/graphics/items/icons/coin_case.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/contest_pass.png b/graphics/items/icons/contest_pass.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/cornn_berry.png b/graphics/items/icons/cornn_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/deep_sea_scale.png b/graphics/items/icons/deep_sea_scale.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/deep_sea_tooth.png b/graphics/items/icons/deep_sea_tooth.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/devon_goods.png b/graphics/items/icons/devon_goods.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/devon_scope.png b/graphics/items/icons/devon_scope.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/dive_ball.png b/graphics/items/icons/dive_ball.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/dome_fossil.png b/graphics/items/icons/dome_fossil.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/dragon_fang.png b/graphics/items/icons/dragon_fang.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/dragon_scale.png b/graphics/items/icons/dragon_scale.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/dream_mail.png b/graphics/items/icons/dream_mail.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/durin_berry.png b/graphics/items/icons/durin_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/energy_root.png b/graphics/items/icons/energy_root.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/enigma_berry.png b/graphics/items/icons/enigma_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/eon_ticket.png b/graphics/items/icons/eon_ticket.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/escape_rope.png b/graphics/items/icons/escape_rope.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/ether.png b/graphics/items/icons/ether.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/everstone.png b/graphics/items/icons/everstone.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/exp_share.png b/graphics/items/icons/exp_share.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/fab_mail.png b/graphics/items/icons/fab_mail.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/fame_checker.png b/graphics/items/icons/fame_checker.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/figy_berry.png b/graphics/items/icons/figy_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/fire_stone.png b/graphics/items/icons/fire_stone.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/fluffy_tail.png b/graphics/items/icons/fluffy_tail.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/flute.png b/graphics/items/icons/flute.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/focus_band.png b/graphics/items/icons/focus_band.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/fresh_water.png b/graphics/items/icons/fresh_water.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/full_heal.png b/graphics/items/icons/full_heal.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/ganlon_berry.png b/graphics/items/icons/ganlon_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/gem.png b/graphics/items/icons/gem.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/glitter_mail.png b/graphics/items/icons/glitter_mail.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/go_goggles.png b/graphics/items/icons/go_goggles.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/gold_teeth.png b/graphics/items/icons/gold_teeth.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/good_rod.png b/graphics/items/icons/good_rod.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/great_ball.png b/graphics/items/icons/great_ball.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/grepa_berry.png b/graphics/items/icons/grepa_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/harbor_mail.png b/graphics/items/icons/harbor_mail.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/hard_stone.png b/graphics/items/icons/hard_stone.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/heart_scale.png b/graphics/items/icons/heart_scale.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/helix_fossil.png b/graphics/items/icons/helix_fossil.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/hm.png b/graphics/items/icons/hm.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/hondew_berry.png b/graphics/items/icons/hondew_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/hp_up.png b/graphics/items/icons/hp_up.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/iapapa_berry.png b/graphics/items/icons/iapapa_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/in_battle_herb.png b/graphics/items/icons/in_battle_herb.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/itemfinder.png b/graphics/items/icons/itemfinder.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/kelpsy_berry.png b/graphics/items/icons/kelpsy_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/kings_rock.png b/graphics/items/icons/kings_rock.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/lansat_berry.png b/graphics/items/icons/lansat_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/large_potion.png b/graphics/items/icons/large_potion.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/lava_cookie.png b/graphics/items/icons/lava_cookie.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/lax_incense.png b/graphics/items/icons/lax_incense.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/leaf_stone.png b/graphics/items/icons/leaf_stone.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/leftovers.png b/graphics/items/icons/leftovers.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/lemonade.png b/graphics/items/icons/lemonade.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/leppa_berry.png b/graphics/items/icons/leppa_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/letter.png b/graphics/items/icons/letter.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/liechi_berry.png b/graphics/items/icons/liechi_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/lift_key.png b/graphics/items/icons/lift_key.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/light_ball.png b/graphics/items/icons/light_ball.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/lucky_egg.png b/graphics/items/icons/lucky_egg.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/lucky_punch.png b/graphics/items/icons/lucky_punch.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/lum_berry.png b/graphics/items/icons/lum_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/luxury_ball.png b/graphics/items/icons/luxury_ball.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/mach_bike.png b/graphics/items/icons/mach_bike.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/macho_brace.png b/graphics/items/icons/macho_brace.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/magma_emblem.png b/graphics/items/icons/magma_emblem.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/magnet.png b/graphics/items/icons/magnet.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/mago_berry.png b/graphics/items/icons/mago_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/magost_berry.png b/graphics/items/icons/magost_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/master_ball.png b/graphics/items/icons/master_ball.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/max_revive.png b/graphics/items/icons/max_revive.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/mech_mail.png b/graphics/items/icons/mech_mail.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/metal_coat.png b/graphics/items/icons/metal_coat.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/metal_powder.png b/graphics/items/icons/metal_powder.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/meteorite.png b/graphics/items/icons/meteorite.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/miracle_seed.png b/graphics/items/icons/miracle_seed.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/moomoo_milk.png b/graphics/items/icons/moomoo_milk.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/moon_stone.png b/graphics/items/icons/moon_stone.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/mystic_ticket.png b/graphics/items/icons/mystic_ticket.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/mystic_water.png b/graphics/items/icons/mystic_water.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/nanab_berry.png b/graphics/items/icons/nanab_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/nest_ball.png b/graphics/items/icons/nest_ball.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/net_ball.png b/graphics/items/icons/net_ball.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/never_melt_ice.png b/graphics/items/icons/never_melt_ice.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/nomel_berry.png b/graphics/items/icons/nomel_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/nugget.png b/graphics/items/icons/nugget.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/oaks_parcel.png b/graphics/items/icons/oaks_parcel.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/old_amber.png b/graphics/items/icons/old_amber.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/old_rod.png b/graphics/items/icons/old_rod.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/old_sea_map.png b/graphics/items/icons/old_sea_map.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/oran_berry.png b/graphics/items/icons/oran_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/orange_mail.png b/graphics/items/icons/orange_mail.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/orb.png b/graphics/items/icons/orb.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/pamtre_berry.png b/graphics/items/icons/pamtre_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/pearl.png b/graphics/items/icons/pearl.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/pecha_berry.png b/graphics/items/icons/pecha_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/persim_berry.png b/graphics/items/icons/persim_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/petaya_berry.png b/graphics/items/icons/petaya_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/pinap_berry.png b/graphics/items/icons/pinap_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/poison_barb.png b/graphics/items/icons/poison_barb.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/poke_ball.png b/graphics/items/icons/poke_ball.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/poke_doll.png b/graphics/items/icons/poke_doll.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/poke_flute.png b/graphics/items/icons/poke_flute.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/pokeblock_case.png b/graphics/items/icons/pokeblock_case.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/pomeg_berry.png b/graphics/items/icons/pomeg_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/potion.png b/graphics/items/icons/potion.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/powder.png b/graphics/items/icons/powder.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/powder_jar.png b/graphics/items/icons/powder_jar.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/pp_max.png b/graphics/items/icons/pp_max.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/pp_up.png b/graphics/items/icons/pp_up.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/premier_ball.png b/graphics/items/icons/premier_ball.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/qualot_berry.png b/graphics/items/icons/qualot_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/question_mark.png b/graphics/items/icons/question_mark.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/quick_claw.png b/graphics/items/icons/quick_claw.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/rabuta_berry.png b/graphics/items/icons/rabuta_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/rainbow_pass.png b/graphics/items/icons/rainbow_pass.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/rare_candy.png b/graphics/items/icons/rare_candy.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/rawst_berry.png b/graphics/items/icons/rawst_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/razz_berry.png b/graphics/items/icons/razz_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/repeat_ball.png b/graphics/items/icons/repeat_ball.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/repel.png b/graphics/items/icons/repel.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/retro_mail.png b/graphics/items/icons/retro_mail.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/return_to_field_arrow.png b/graphics/items/icons/return_to_field_arrow.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/revival_herb.png b/graphics/items/icons/revival_herb.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/revive.png b/graphics/items/icons/revive.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/room1_key.png b/graphics/items/icons/room1_key.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/room2_key.png b/graphics/items/icons/room2_key.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/room4_key.png b/graphics/items/icons/room4_key.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/room6_key.png b/graphics/items/icons/room6_key.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/root_fossil.png b/graphics/items/icons/root_fossil.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/sacred_ash.png b/graphics/items/icons/sacred_ash.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/safari_ball.png b/graphics/items/icons/safari_ball.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/salac_berry.png b/graphics/items/icons/salac_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/scanner.png b/graphics/items/icons/scanner.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/scarf.png b/graphics/items/icons/scarf.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/scope_lens.png b/graphics/items/icons/scope_lens.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/sea_incense.png b/graphics/items/icons/sea_incense.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/secret_key.png b/graphics/items/icons/secret_key.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/shadow_mail.png b/graphics/items/icons/shadow_mail.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/shard.png b/graphics/items/icons/shard.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/sharp_beak.png b/graphics/items/icons/sharp_beak.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/shell_bell.png b/graphics/items/icons/shell_bell.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/shoal_shell.png b/graphics/items/icons/shoal_shell.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/silk_scarf.png b/graphics/items/icons/silk_scarf.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/silph_scope.png b/graphics/items/icons/silph_scope.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/silver_powder.png b/graphics/items/icons/silver_powder.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/sitrus_berry.png b/graphics/items/icons/sitrus_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/smoke_ball.png b/graphics/items/icons/smoke_ball.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/soda_pop.png b/graphics/items/icons/soda_pop.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/soft_sand.png b/graphics/items/icons/soft_sand.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/soot_sack.png b/graphics/items/icons/soot_sack.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/soothe_bell.png b/graphics/items/icons/soothe_bell.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/soul_dew.png b/graphics/items/icons/soul_dew.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/spell_tag.png b/graphics/items/icons/spell_tag.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/spelon_berry.png b/graphics/items/icons/spelon_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/ss_ticket.png b/graphics/items/icons/ss_ticket.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/star_piece.png b/graphics/items/icons/star_piece.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/stardust.png b/graphics/items/icons/stardust.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/starf_berry.png b/graphics/items/icons/starf_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/status_heal.png b/graphics/items/icons/status_heal.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/stick.png b/graphics/items/icons/stick.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/storage_key.png b/graphics/items/icons/storage_key.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/sun_stone.png b/graphics/items/icons/sun_stone.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/super_rod.png b/graphics/items/icons/super_rod.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/tamato_berry.png b/graphics/items/icons/tamato_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/tea.png b/graphics/items/icons/tea.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/teachy_tv.png b/graphics/items/icons/teachy_tv.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/thick_club.png b/graphics/items/icons/thick_club.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/thunder_stone.png b/graphics/items/icons/thunder_stone.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/timer_ball.png b/graphics/items/icons/timer_ball.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/tiny_mushroom.png b/graphics/items/icons/tiny_mushroom.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/tm.png b/graphics/items/icons/tm.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/tm_case.png b/graphics/items/icons/tm_case.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/town_map.png b/graphics/items/icons/town_map.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/tri_pass.png b/graphics/items/icons/tri_pass.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/tropic_mail.png b/graphics/items/icons/tropic_mail.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/twisted_spoon.png b/graphics/items/icons/twisted_spoon.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/ultra_ball.png b/graphics/items/icons/ultra_ball.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/up_grade.png b/graphics/items/icons/up_grade.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/vitamin.png b/graphics/items/icons/vitamin.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/vs_seeker.png b/graphics/items/icons/vs_seeker.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/wailmer_pail.png b/graphics/items/icons/wailmer_pail.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/water_stone.png b/graphics/items/icons/water_stone.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/watmel_berry.png b/graphics/items/icons/watmel_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/wave_mail.png b/graphics/items/icons/wave_mail.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/wepear_berry.png b/graphics/items/icons/wepear_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/wiki_berry.png b/graphics/items/icons/wiki_berry.png old mode 100644 new mode 100755 diff --git a/graphics/items/icons/wood_mail.png b/graphics/items/icons/wood_mail.png old mode 100644 new mode 100755 diff --git a/graphics/types/fairy.png b/graphics/types/fairy.png new file mode 100644 index 0000000000..d8170f64f5 Binary files /dev/null and b/graphics/types/fairy.png differ diff --git a/graphics_file_rules.mk b/graphics_file_rules.mk index 630aaa3fc1..c800134d18 100644 --- a/graphics_file_rules.mk +++ b/graphics_file_rules.mk @@ -18,7 +18,7 @@ PSSGFXDIR := graphics/pokemon_storage OBJEVENTGFXDIR := graphics/object_events MISCGFXDIR := graphics/misc -types := normal fight flying poison ground rock bug ghost steel mystery fire water grass electric psychic ice dragon dark +types := normal fight flying poison ground rock bug ghost steel mystery fire water grass electric psychic ice dragon dark fairy contest_types := cool beauty cute smart tough diff --git a/include/battle.h b/include/battle.h index e4b7730892..f20e250196 100644 --- a/include/battle.h +++ b/include/battle.h @@ -11,6 +11,7 @@ #include "battle_gfx_sfx_util.h" #include "battle_util2.h" #include "battle_bg.h" +#include "battle_debug.h" #define GET_BATTLER_POSITION(battler) (gBattlerPositions[battler]) #define GET_BATTLER_SIDE(battler) (GetBattlerPosition(battler) & BIT_SIDE) @@ -34,6 +35,7 @@ #define B_ACTION_CANCEL_PARTNER 12 // when choosing an action #define B_ACTION_NOTHING_FAINTED 13 // when choosing an action +#define B_ACTION_DEBUG 20 #define B_ACTION_NONE 0xFF #define MAX_TRAINER_ITEMS 4 @@ -44,21 +46,11 @@ #define TASK_ID 0x1 // task Id and cursor position share the same field #define SPRITES_INIT_STATE1 0x1 // shares the Id as well #define SPRITES_INIT_STATE2 0x2 -#define MOVE_EFFECT_BYTE 0x3 #define ACTIONS_CONFIRMED_COUNT 0x4 #define MULTISTRING_CHOOSER 0x5 #define MSG_DISPLAY 0x7 #define BATTLE_COMMUNICATION_ENTRIES_COUNT 0x8 -#define MOVE_TARGET_SELECTED 0x0 -#define MOVE_TARGET_DEPENDS 0x1 -#define MOVE_TARGET_USER_OR_SELECTED 0x2 -#define MOVE_TARGET_RANDOM 0x4 -#define MOVE_TARGET_BOTH 0x8 -#define MOVE_TARGET_USER 0x10 -#define MOVE_TARGET_FOES_AND_ALLY 0x20 -#define MOVE_TARGET_OPPONENTS_FIELD 0x40 - #define BATTLE_BUFFER_LINK_SIZE 0x1000 struct ResourceFlags @@ -66,7 +58,12 @@ struct ResourceFlags u32 flags[4]; }; -#define RESOURCE_FLAG_FLASH_FIRE 1 +#define RESOURCE_FLAG_FLASH_FIRE 0x1 +#define RESOURCE_FLAG_ROOST 0x2 +#define RESOURCE_FLAG_UNBURDEN 0x4 +#define RESOURCE_FLAG_INTIMIDATED 0x8 +#define RESOURCE_FLAG_TRACED 0x10 +#define RESOURCE_FLAG_EMERGENCY_EXIT 0x20 struct DisableStruct { @@ -75,11 +72,14 @@ struct DisableStruct u16 encoredMove; u8 protectUses; u8 stockpileCounter; + s8 stockpileDef; + s8 stockpileSpDef; + s8 stockpileBeforeDef; + s8 stockpileBeforeSpDef; u8 substituteHP; u8 disableTimer:4; u8 disableTimerStartValue:4; u8 encoredMovePos; - u8 filler_D; // Unused field. u8 encoreTimer:4; u8 encoreTimerStartValue:4; u8 perishSongTimer:4; @@ -94,23 +94,33 @@ struct DisableStruct u8 battlerPreventingEscape; u8 battlerWithSureHit; u8 isFirstTurn; - u8 filler_17; // Unused field. u8 truantCounter:1; u8 truantSwitchInHack:1; - u8 filler_18_2:2; // Unused field. u8 mimickedMoves:4; u8 rechargeTimer; + u8 autotomizeCount; + u8 slowStartTimer; + u8 embargoTimer; + u8 magnetRiseTimer; + u8 telekinesisTimer; + u8 healBlockTimer; + u8 laserFocusTimer; + u8 throatChopTimer; + u8 usedMoves:4; + u8 wrapTurns; }; struct ProtectStruct { u32 protected:1; + u32 spikyShielded:1; + u32 kingsShielded:1; + u32 banefulBunkered:1; u32 endured:1; u32 noValidMoves:1; u32 helpingHand:1; u32 bounceMove:1; u32 stealMove:1; - u32 flag0Unknown:1; // Only set to 0 once. u32 prlzImmobility:1; u32 confusionSelfDmg:1; u32 targetNotAffected:1; @@ -124,6 +134,11 @@ struct ProtectStruct u32 flinchImmobility:1; u32 notFirstStrike:1; u32 palaceUnableToUseMove:1; + u32 usesBouncedMove:1; + u32 usedHealBlockedMove:1; + u32 usedGravityPreventedMove:1; + u32 powderSelfDmg:1; + u32 usedThroatChopPreventedMove:1; s32 physicalDmg; s32 specialDmg; u8 physicalBattlerId; @@ -132,19 +147,32 @@ struct ProtectStruct struct SpecialStatus { - u32 statLowered:1; - u32 lightningRodRedirected:1; - u32 restoredBattlerSprite: 1; - u32 intimidatedMon:1; - u32 traced:1; - u32 ppNotAffectedByPressure:1; - u32 flag40:1; - u32 focusBanded:1; + u8 statLowered:1; + u8 lightningRodRedirected:1; + u8 restoredBattlerSprite: 1; + u8 intimidatedMon:1; + u8 traced:1; + u8 ppNotAffectedByPressure:1; + u8 flag40:1; + u8 focusBanded:1; + u8 focusSashed:1; + u8 sturdied:1; + u8 stormDrainRedirected:1; + u8 switchInAbilityDone:1; + u8 switchInItemDone:1; + u8 instructedChosenTarget:3; + u8 berryReduced:1; + u8 gemBoost:1; + u8 gemParam; + u8 damagedMons:4; // Mons that have been damaged directly by using a move, includes substitute. + u8 dancerUsedMove:1; + u8 dancerOriginalTarget:3; s32 dmg; s32 physicalDmg; s32 specialDmg; u8 physicalBattlerId; u8 specialBattlerId; + u8 changedStatsBattlerId; // Battler that was responsible for the latest stat change. Can be self. }; struct SideTimer @@ -160,13 +188,37 @@ struct SideTimer u8 followmeTimer; u8 followmeTarget; u8 spikesAmount; + u8 toxicSpikesAmount; + u8 stealthRockAmount; + u8 stickyWebAmount; + u8 auroraVeilTimer; + u8 auroraVeilBattlerId; + u8 tailwindTimer; + u8 tailwindBattlerId; + u8 luckyChantTimer; + u8 luckyChantBattlerId; +}; + +struct FieldTimer +{ + u8 mudSportTimer; + u8 waterSportTimer; + u8 wonderRoomTimer; + u8 magicRoomTimer; + u8 trickRoomTimer; + u8 grassyTerrainTimer; + u8 mistyTerrainTimer; + u8 electricTerrainTimer; + u8 psychicTerrainTimer; + u8 echoVoiceCounter; + u8 gravityTimer; + u8 fairyLockTimer; }; struct WishFutureKnock { u8 futureSightCounter[MAX_BATTLERS_COUNT]; u8 futureSightAttacker[MAX_BATTLERS_COUNT]; - s32 futureSightDmg[MAX_BATTLERS_COUNT]; u16 futureSightMove[MAX_BATTLERS_COUNT]; u8 wishCounter[MAX_BATTLERS_COUNT]; u8 wishMonId[MAX_BATTLERS_COUNT]; @@ -174,6 +226,14 @@ struct WishFutureKnock u8 knockedOffMons[2]; // Each battler is represented by a bit. The array entry is dependent on the battler's side. }; +struct AI_SavedBattleMon +{ + u8 ability; + u16 moves[MAX_MON_MOVES]; + u16 heldItem; + u16 species; +}; + struct AI_ThinkingStruct { u8 aiState; @@ -184,21 +244,20 @@ struct AI_ThinkingStruct u32 aiFlags; u8 aiAction; u8 aiLogicId; - u8 filler12[6]; - u8 simulatedRNG[MAX_MON_MOVES]; + s32 simulatedDmg[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT][MAX_MON_MOVES]; // attacker, target, move + struct AI_SavedBattleMon saved[4]; + bool8 switchMon; // Because all available moves have no/little effect. }; -struct UsedMoves -{ - u16 moves[MAX_MON_MOVES]; - u16 unknown[MAX_MON_MOVES]; -}; +#define AI_MOVE_HISTORY_COUNT 3 struct BattleHistory { - struct UsedMoves usedMoves[MAX_BATTLERS_COUNT]; u8 abilities[MAX_BATTLERS_COUNT]; u8 itemEffects[MAX_BATTLERS_COUNT]; + u16 usedMoves[MAX_BATTLERS_COUNT][MAX_MON_MOVES]; + u16 moveHistory[MAX_BATTLERS_COUNT][AI_MOVE_HISTORY_COUNT]; // 3 last used moves for each battler + u8 moveHistoryIndex[MAX_BATTLERS_COUNT]; u16 trainerItems[MAX_BATTLERS_COUNT]; u8 itemsNo; }; @@ -230,6 +289,8 @@ struct BattleResources struct AI_ThinkingStruct *ai; struct BattleHistory *battleHistory; struct BattleScriptsStack *AI_ScriptsStack; + u8 bufferA[MAX_BATTLERS_COUNT][0x200]; + u8 bufferB[MAX_BATTLERS_COUNT][0x200]; }; struct BattleResults @@ -343,16 +404,35 @@ struct BattleTvMovePoints s16 points[2][PARTY_SIZE * 4]; }; +struct MegaEvolutionData +{ + u8 toEvolve; // As flags using gBitTable. + u8 evolvedPartyIds[2]; // As flags using gBitTable; + bool8 alreadyEvolved[4]; // Array id is used for mon position. + u16 evolvedSpecies[MAX_BATTLERS_COUNT]; + u16 playerEvolvedSpecies; + u8 battlerId; + bool8 playerSelect; + u8 triggerSpriteId; +}; + +struct Illusion +{ + u8 on; + u8 set; + u8 broken; + u8 partyId; + struct Pokemon *mon; +}; + struct BattleStruct { u8 turnEffectsTracker; u8 turnEffectsBattlerId; - u8 unused_0; u8 turnCountersTracker; - u8 wrappedMove[MAX_BATTLERS_COUNT * 2]; // Leftover from Ruby's ewram access. + u16 wrappedMove[MAX_BATTLERS_COUNT]; u8 moveTarget[MAX_BATTLERS_COUNT]; u8 expGetterMonId; - u8 unused_1; u8 wildVictorySong; u8 dynamicMoveType; u8 wrappedBy[MAX_BATTLERS_COUNT]; @@ -373,7 +453,6 @@ struct BattleStruct u8 field_60[4][3]; u8 runTries; u8 caughtMonNick[POKEMON_NAME_LENGTH + 1]; - u8 unused_2; u8 safariGoNearCounter; u8 safariPkblThrowCounter; u8 safariEscapeFactor; @@ -383,12 +462,9 @@ struct BattleStruct u8 formToChangeInto; u8 chosenMovePositions[MAX_BATTLERS_COUNT]; u8 stateIdAfterSelScript[MAX_BATTLERS_COUNT]; - u8 unused_3[3]; u8 field_8B; // related to player's pokemon switching - u8 unused_4[2]; u8 stringMoveType; u8 expGetterBattlerId; - u8 unused_5; u8 field_91; // related to gAbsentBattlerFlags, possibly absent flags turn ago? u8 palaceFlags; // First 4 bits are "is < 50% HP and not asleep" for each battler, last 4 bits are selected moves to pass to AI u8 field_93; // related to choosing pokemon? @@ -396,16 +472,16 @@ struct BattleStruct u8 wallyMovesState; u8 wallyWaitFrames; u8 wallyMoveFrames; - u8 lastTakenMove[MAX_BATTLERS_COUNT * 2 * 2]; // Last move that a battler was hit with. This field seems to erroneously take 16 bytes instead of 8. + u16 lastTakenMove[MAX_BATTLERS_COUNT]; // Last move that a battler was hit with. u16 hpOnSwitchout[2]; u32 savedBattleTypeFlags; u8 abilityPreventingSwitchout; u8 hpScale; - u8 synchronizeMoveEffect; + u16 synchronizeMoveEffect; bool8 anyMonHasTransformed; void (*savedCallback)(void); u16 usedHeldItems[MAX_BATTLERS_COUNT]; - u8 chosenItem[MAX_BATTLERS_COUNT]; // why is this an u8? + u16 chosenItem[MAX_BATTLERS_COUNT]; u8 AI_itemType[2]; u8 AI_itemFlags[2]; u16 choicedMove[MAX_BATTLERS_COUNT]; @@ -414,9 +490,8 @@ struct BattleStruct u8 switchInItemsCounter; u8 arenaTurnCounter; u8 turnSideTracker; - u8 unused_6[3]; u8 givenExpMons; // Bits for enemy party's pokemon that gave exp to player's party. - u8 lastTakenMoveFrom[MAX_BATTLERS_COUNT * MAX_BATTLERS_COUNT * 2]; // a 3-D array [target][attacker][byte] + u16 lastTakenMoveFrom[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT]; // a 2-D array [target][attacker] u16 castformPalette[MAX_BATTLERS_COUNT][16]; u8 field_180; // weird field, used in battle_main.c, once accessed as an array of u32 overwriting the field below u8 field_181; @@ -429,7 +504,6 @@ struct BattleStruct u8 atkCancellerTracker; struct BattleTvMovePoints tvMovePoints; struct BattleTv tv; - u8 unused_7[0x28]; u8 AI_monToSwitchIntoId[MAX_BATTLERS_COUNT]; s8 arenaMindPoints[2]; s8 arenaSkillPoints[2]; @@ -437,6 +511,34 @@ struct BattleStruct u8 arenaLostPlayerMons; // Bits for party member, lost as in referee's decision, not by fainting. u8 arenaLostOpponentMons; u8 alreadyStatusedMoveAttempt; // As bits for battlers; For example when using Thunder Wave on an already paralyzed pokemon. + u8 debugBattler; + u8 magnitudeBasePower; + u8 presentBasePower; + u8 roostTypes[MAX_BATTLERS_COUNT][3]; + u8 savedBattlerTarget; + bool8 ateBoost[MAX_BATTLERS_COUNT]; + u8 activeAbilityPopUps; // as bits for each battler + bool8 throwingPokeBall; + struct MegaEvolutionData mega; + const u8 *trainerSlideMsg; + bool8 trainerSlideLowHpMsgDone; + u8 introState; + u8 ateBerry[2]; // array id determined by side, each party pokemon as bit + u8 stolenStats[NUM_BATTLE_STATS]; // hp byte is used for which stats to raise, other inform about by how many stages + u8 lastMoveFailed; // as bits for each battler, for the sake of Stomping Tantrum + u8 lastMoveTarget[MAX_BATTLERS_COUNT]; // The last target on which each mon used a move, for the sake of Instruct + u8 debugHoldEffects[MAX_BATTLERS_COUNT]; // These override actual items' hold effects. + u8 tracedAbility[MAX_BATTLERS_COUNT]; + u16 hpBefore[MAX_BATTLERS_COUNT]; // Hp of battlers before using a move. For Berserk + bool8 spriteIgnore0Hp; + struct Illusion illusion[MAX_BATTLERS_COUNT]; + s8 aiFinalScore[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT][MAX_MON_MOVES]; // AI, target, moves to make debugging easier + u8 soulheartBattlerId; + u8 friskedBattler; // Frisk needs to identify 2 battlers in double battles. + bool8 friskedAbility; // If identifies two mons, show the ability pop-up only once. + u8 sameMoveTurns[MAX_BATTLERS_COUNT]; // For Metronome, number of times the same moves has been SUCCESFULLY used. + u16 moveEffect2; // For Knock Off + u16 changedSpecies[PARTY_SIZE]; // For Zygarde or future forms when multiple mons can change into the same pokemon. }; #define GET_MOVE_TYPE(move, typeArg) \ @@ -447,40 +549,43 @@ struct BattleStruct typeArg = gBattleMoves[move].type; \ } -#define IS_TYPE_PHYSICAL(moveType)(moveType < TYPE_MYSTERY) -#define IS_TYPE_SPECIAL(moveType)(moveType > TYPE_MYSTERY) +#define IS_MOVE_PHYSICAL(move)(gBattleMoves[move].split == SPLIT_PHYSICAL) +#define IS_MOVE_SPECIAL(move)(gBattleMoves[move].split == SPLIT_SPECIAL) +#define BATTLER_MAX_HP(battlerId)(gBattleMons[battlerId].hp == gBattleMons[battlerId].maxHP) #define TARGET_TURN_DAMAGED ((gSpecialStatuses[gBattlerTarget].physicalDmg != 0 || gSpecialStatuses[gBattlerTarget].specialDmg != 0)) -#define IS_BATTLER_OF_TYPE(battlerId, type)((gBattleMons[battlerId].type1 == type || gBattleMons[battlerId].type2 == type)) -#define SET_BATTLER_TYPE(battlerId, type) \ -{ \ - gBattleMons[battlerId].type1 = type; \ - gBattleMons[battlerId].type2 = type; \ +#define IS_BATTLER_OF_TYPE(battlerId, type)((gBattleMons[battlerId].type1 == type || gBattleMons[battlerId].type2 == type || gBattleMons[battlerId].type3 == type)) +#define SET_BATTLER_TYPE(battlerId, type) \ +{ \ + gBattleMons[battlerId].type1 = type; \ + gBattleMons[battlerId].type2 = type; \ + gBattleMons[battlerId].type3 = TYPE_MYSTERY; \ } -#define GET_STAT_BUFF_ID(n)((n & 0xF)) // first four bits 0x1, 0x2, 0x4, 0x8 -#define GET_STAT_BUFF_VALUE2(n)((n & 0xF0)) -#define GET_STAT_BUFF_VALUE(n)(((n >> 4) & 7)) // 0x10, 0x20, 0x40 +#define GET_STAT_BUFF_ID(n)((n & 7)) // first three bits 0x1, 0x2, 0x4 +#define GET_STAT_BUFF_VALUE_WITH_SIGN(n)((n & 0xF8)) +#define GET_STAT_BUFF_VALUE(n)(((n >> 3) & 0xF)) // 0x8, 0x10, 0x20, 0x40 #define STAT_BUFF_NEGATIVE 0x80 // 0x80, the sign bit -#define SET_STAT_BUFF_VALUE(n)((((n) << 4) & 0xF0)) +#define SET_STAT_BUFF_VALUE(n)((((n) << 3) & 0xF8)) -#define SET_STATCHANGER(statId, stage, goesDown)(gBattleScripting.statChanger = (statId) + (stage << 4) + (goesDown << 7)) +#define SET_STATCHANGER(statId, stage, goesDown)(gBattleScripting.statChanger = (statId) + ((stage) << 3) + (goesDown << 7)) +#define SET_STATCHANGER2(dst, statId, stage, goesDown)(dst = (statId) + ((stage) << 3) + (goesDown << 7)) struct BattleScripting { s32 painSplitHp; s32 bideDmg; u8 multihitString[6]; - u8 dmgMultiplier; + bool8 expOnCatch; u8 twoTurnsMoveStringId; u8 animArg1; u8 animArg2; u16 tripleKickPower; u8 moveendState; - u8 battlerWithAbility; - u8 multihitMoveEffect; + u8 savedStatChanger; // For further use, if attempting to change stat two times(ex. Moody) + u8 shiftSwitched; // When the game tells you the next enemy's pokemon and you switch. Option for noobs but oh well. u8 battler; u8 animTurn; u8 animTargetsHit; @@ -490,13 +595,19 @@ struct BattleScripting u8 battleStyle; u8 drawlvlupboxState; u8 learnMoveState; - u8 field_20; + u8 savedBattler; u8 reshowMainState; u8 reshowHelperState; u8 levelUpHP; u8 windowsType; // 0 - normal, 1 - battle arena u8 multiplayerId; u8 specialTrainerBattleType; + bool8 monCaught; + s32 savedDmg; + u16 savedMoveEffect; // For moves hitting multiple targets. + u16 moveEffect; + u16 multihitMoveEffect; + u8 illusionNickHack; // To properly display nick in STRINGID_ENEMYABOUTTOSWITCHPKMN. }; // rom_80A5C6C @@ -521,7 +632,9 @@ struct BattleAnimationInfo u8 field_5; u8 field_6; u8 field_7; - u8 ballThrowCaseId; + u8 ballThrowCaseId:6; + u8 isCriticalCapture:1; + u8 criticalCaptureSuccess:1; u8 field_9_x1:1; u8 wildMonInvisible:1; u8 field_9_x1C:3; @@ -606,7 +719,7 @@ extern u16 gBattle_WIN0H; extern u16 gBattle_WIN0V; extern u16 gBattle_WIN1H; extern u16 gBattle_WIN1V; -extern u8 gDisplayedStringBattle[300]; +extern u8 gDisplayedStringBattle[400]; extern u8 gBattleTextBuff1[TEXT_BUFF_ARRAY_COUNT]; extern u8 gBattleTextBuff2[TEXT_BUFF_ARRAY_COUNT]; extern u8 gBattleTextBuff3[TEXT_BUFF_ARRAY_COUNT]; @@ -615,8 +728,6 @@ extern u8 gBattleTerrain; extern u32 gUnknown_02022FF4; extern u8 *gUnknown_0202305C; extern u8 *gUnknown_02023060; -extern u8 gBattleBufferA[MAX_BATTLERS_COUNT][0x200]; -extern u8 gBattleBufferB[MAX_BATTLERS_COUNT][0x200]; extern u8 gActiveBattler; extern u32 gBattleControllerExecFlags; extern u8 gBattlersCount; @@ -644,10 +755,9 @@ extern u8 gBattlerFainted; extern u8 gEffectBattler; extern u8 gPotentialItemEffectBattler; extern u8 gAbsentBattlerFlags; -extern u8 gCritMultiplier; +extern u8 gIsCriticalHit; extern u8 gMultiHitCounter; extern const u8 *gBattlescriptCurrInstr; -extern u32 gUnusedBattleMainVar; extern u8 gChosenActionByBattler[MAX_BATTLERS_COUNT]; extern const u8 *gSelectionBattleScripts[MAX_BATTLERS_COUNT]; extern const u8 *gPalaceSelectionBattleScripts[MAX_BATTLERS_COUNT]; @@ -657,13 +767,14 @@ extern u16 gLastLandedMoves[MAX_BATTLERS_COUNT]; extern u16 gLastHitByType[MAX_BATTLERS_COUNT]; extern u16 gLastResultingMoves[MAX_BATTLERS_COUNT]; extern u16 gLockedMoves[MAX_BATTLERS_COUNT]; +extern u16 gLastUsedMove; extern u8 gLastHitBy[MAX_BATTLERS_COUNT]; extern u16 gChosenMoveByBattler[MAX_BATTLERS_COUNT]; -extern u8 gMoveResultFlags; +extern u16 gMoveResultFlags; extern u32 gHitMarker; extern u8 gTakenDmgByBattler[MAX_BATTLERS_COUNT]; extern u8 gUnknown_0202428C; -extern u16 gSideStatuses[2]; +extern u32 gSideStatuses[2]; extern struct SideTimer gSideTimers[2]; extern u32 gStatuses3[MAX_BATTLERS_COUNT]; extern struct DisableStruct gDisableStructs[MAX_BATTLERS_COUNT]; @@ -678,7 +789,6 @@ extern u16 gBattleWeather; extern struct WishFutureKnock gWishFutureKnock; extern u16 gIntroSlideFlags; extern u8 gSentPokesToOpponent[2]; -extern u16 gDynamicBasePower; extern u16 gExpShareExp; extern struct BattleEnigmaBerry gEnigmaBerries[MAX_BATTLERS_COUNT]; extern struct BattleScripting gBattleScripting; @@ -700,6 +810,10 @@ extern struct BattleHealthboxInfo *gUnknown_020244DC; extern u16 gBattleMovePower; extern u16 gMoveToLearn; extern u8 gBattleMonForms[MAX_BATTLERS_COUNT]; +extern u32 gFieldStatuses; +extern struct FieldTimer gFieldTimers; +extern u8 gBattlerAbility; +extern u16 gPartnerSpriteId; extern void (*gPreBattleCallback1)(void); extern void (*gBattleMainFunc)(void); diff --git a/include/battle_ai_script_commands.h b/include/battle_ai_script_commands.h index d23ad048a5..bd990d77ae 100644 --- a/include/battle_ai_script_commands.h +++ b/include/battle_ai_script_commands.h @@ -5,11 +5,20 @@ // 0 - 3 are move idx #define AI_CHOICE_FLEE 4 #define AI_CHOICE_WATCH 5 +#define AI_CHOICE_SWITCH 7 -void BattleAI_HandleItemUseBeforeAISetup(u8 defaultScoreMoves); +s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef); +s32 AI_CalcPartyMonDamage(u16 move, u8 battlerAtk, u8 battlerDef, struct Pokemon *mon); +u16 AI_GetTypeEffectiveness(u16 move, u8 battlerAtk, u8 battlerDef); +void BattleAI_SetupItems(void); +void BattleAI_SetupFlags(void); void BattleAI_SetupAIData(u8 defaultScoreMoves); u8 BattleAI_ChooseMoveOrAction(void); +bool32 IsTruantMonVulnerable(u32 battlerAI, u32 opposingBattler); +bool32 IsBattlerAIControlled(u32 battlerId); void ClearBattlerMoveHistory(u8 battlerId); +void RecordLastUsedMoveBy(u32 battlerId, u32 move); +void RecordKnownMove(u8 battlerId, u32 move); void RecordAbilityBattle(u8 battlerId, u8 abilityId); void ClearBattlerAbilityHistory(u8 battlerId); void RecordItemEffectBattle(u8 battlerId, u8 itemEffect); diff --git a/include/battle_ai_switch_items.h b/include/battle_ai_switch_items.h index 0a230e7f6e..9780fae705 100644 --- a/include/battle_ai_switch_items.h +++ b/include/battle_ai_switch_items.h @@ -11,6 +11,7 @@ enum AI_ITEM_NOT_RECOGNIZABLE }; +void GetAIPartyIndexes(u32 battlerId, s32 *firstId, s32 *lastId); void AI_TrySwitchOrUseItem(void); u8 GetMostSuitableMonToSwitchInto(void); diff --git a/include/battle_anim.h b/include/battle_anim.h index 096d533e25..2f481c5f26 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -50,6 +50,7 @@ extern u8 gBattleAnimAttacker; extern u8 gBattleAnimTarget; extern u16 gAnimBattlerSpecies[MAX_BATTLERS_COUNT]; extern u8 gAnimCustomPanning; +extern u16 gAnimMoveIndex; void ClearBattleAnimationVars(void); void DoMoveAnim(u16 move); @@ -57,6 +58,7 @@ void LaunchBattleAnimation(const u8 *const animsTable[], u16 tableId, bool8 isMo void DestroyAnimSprite(struct Sprite *sprite); void DestroyAnimVisualTask(u8 taskId); void DestroyAnimSoundTask(u8 taskId); +u8 GetAnimBattlerId(u8 wantedBattler); bool8 IsBattlerSpriteVisible(u8 battlerId); void MoveBattlerSpriteToBG(u8 battlerId, bool8 toBG_2, bool8 setSpriteInvisible); bool8 IsContest(void); @@ -85,6 +87,7 @@ void DestroySpriteAndMatrix(struct Sprite *sprite); void TranslateSpriteLinearFixedPoint(struct Sprite *sprite); void InitSpritePosToAnimAttacker(struct Sprite *sprite, bool8 respectMonPicOffsets); void InitSpritePosToAnimTarget(struct Sprite *sprite, bool8 respectMonPicOffsets); +bool32 InitSpritePosToAnimBattler(u32 animBattlerId, struct Sprite *sprite, bool8 respectMonPicOffsets); void StartAnimLinearTranslation(struct Sprite *sprite); void InitAnimArcTranslation(struct Sprite *sprite); bool8 AnimTranslateLinear(struct Sprite *sprite); @@ -206,12 +209,17 @@ void LaunchStatusAnimation(u8 battlerId, u8 statusAnimId); // battle_anim_ground.c void AnimTask_HorizontalShake(u8 taskId); +void AnimMudSportDirt(struct Sprite *sprite); +void AnimDirtScatter(struct Sprite *sprite); +void AnimMudSportDirtRising(struct Sprite *sprite); +extern const union AffineAnimCmd *const gAffineAnims_SpinningBone[]; // battle_anim_throw.c void TryShinyAnimation(u8 battler, struct Pokemon *mon); u8 ItemIdToBallId(u16 itemId); u8 AnimateBallOpenParticles(u8 x, u8 y, u8 priority, u8 subpriority, u8 ballId); u8 LaunchBallFadeMonTask(bool8 unFadeLater, u8 battlerId, u32 selectedPalettes, u8 ballId); +bool32 IsCriticalCapture(void); // battle_anim_utility_funcs.c void sub_8116EB4(u8); @@ -221,12 +229,113 @@ void sub_8117854(u8 taskId, int unused, u16 arg2, u8 battler1, u8 arg4, u8 arg5, void SetSpriteNextToMonHead(u8 battler, struct Sprite* sprite); void AnimMoveTwisterParticle(struct Sprite* sprite); void AnimParticleBurst(struct Sprite *); +void AnimPowerAbsorptionOrb(struct Sprite* sprite); +void AnimNeedleArmSpike(struct Sprite *); +void AnimTask_CompressTargetHorizontally(u8 taskId); +void AnimSporeParticle(struct Sprite* sprite); +void AnimAbsorptionOrb(struct Sprite* sprite); +void AnimPetalDanceSmallFlower(struct Sprite* sprite); +void AnimPetalDanceBigFlower(struct Sprite* sprite); +void AnimEndureEnergy(struct Sprite* sprite); +void AnimMimicOrb(struct Sprite* sprite); +void AnimSolarbeamBigOrb(struct Sprite* sprite); +void AnimHyperBeamOrb(struct Sprite* sprite); +void AnimNeedleArmSpike_Step(struct Sprite* sprite); +void AnimMovePowderParticle(struct Sprite* sprite); +void AnimMetronomeFinger(struct Sprite* sprite); +void AnimConversion(struct Sprite* sprite); +void AnimCuttingSlice(struct Sprite* sprite); +void AnimThoughtBubble(struct Sprite* sprite); +void AnimTranslateLinearSingleSineWave(struct Sprite* sprite); +void AnimGrantingStars(struct Sprite* sprite); +void AnimFollowMeFinger(struct Sprite* sprite); +extern const union AnimCmd *const gRazorLeafParticleAnimTable[]; +extern const union AnimCmd *const gPowerAbsorptionOrbAnimTable[]; +extern const union AffineAnimCmd *const gPowerAbsorptionOrbAffineAnimTable[]; +extern const union AnimCmd *const gMusicNotesAnimTable[]; +extern const union AffineAnimCmd *const gMimicOrbAffineAnimTable[]; +extern const union AnimCmd *const gSolarbeamBigOrbAnimTable[]; +extern const union AnimCmd *const gPowderParticlesAnimTable[]; +extern const union AffineAnimCmd *const gMetronomeFingerAffineAnimTable[]; +extern const union AnimCmd *const gPetalDanceBigFlowerAnimTable[]; +extern const union AnimCmd *const gOctazookaAnimTable[]; +extern const union AffineAnimCmd *const gAbsorptionOrbAffineAnimTable[]; +extern const union AnimCmd *const gGrantingStarsAnimTable[]; +extern const union AnimCmd *const gSporeParticleAnimTable[]; +extern const union AnimCmd *const gHealingBlueStarAnimTable[]; +extern const union AnimCmd *const gMoonlightSparkleAnimTable[]; +extern const union AnimCmd *const gEndureEnergyAnimTable[]; +extern const union AnimCmd *const gPetalDanceSmallFlowerAnimTable[]; +extern const union AnimCmd *const gConversionAnimTable[]; +extern const union AffineAnimCmd *const gConversionAffineAnimTable[]; +extern const union AnimCmd *const gCuttingSliceAnimTable[]; +extern const union AnimCmd *const gScratchAnimTable[]; +extern const union AnimCmd *const gIngrainRootAnimTable[]; +extern const union AffineAnimCmd *const gSwiftStarAffineAnimTable[]; +extern const union AnimCmd *const gMetronomeThroughtBubbleAnimTable[]; + +// battle_anim_effects_2.c +void AnimUproarRing(struct Sprite *sprite); +void AnimSonicBoomProjectile(struct Sprite *sprite); +void AnimOrbitFast(struct Sprite *sprite); +void AnimOrbitScatter(struct Sprite *sprite); +void AnimAngerMark(struct Sprite *sprite); +void AnimHyperVoiceRing(struct Sprite *sprite); +extern const union AffineAnimCmd *const gThinRingShrinkingAffineAnimTable[]; +extern const union AffineAnimCmd *const gThinRingExpandingAffineAnimTable[]; +extern const union AnimCmd *const gExplosionAnimTable[]; +extern const union AffineAnimCmd *const gGuardRingAffineAnimTable[]; +extern const union AffineAnimCmd *const gAngerMarkAffineAnimTable[]; +extern const union AffineAnimCmd *const gWaterPulseRingAffineAnimTable[]; +extern const union AffineAnimCmd *const gHyperVoiceRingAffineAnimTable[]; +extern const union AnimCmd *const gCoinAnimTable[]; +extern const union AffineAnimCmd *const gHiddenPowerOrbAffineAnimTable[]; + +// battle_anim_effects_3.c +void AnimBlackSmoke(struct Sprite *sprite); +void AnimSweetScentPetal(struct Sprite *sprite); +void AnimTealAlert(struct Sprite *sprite); +void AnimBlockX(struct Sprite *sprite); +extern const union AnimCmd *const gOpeningEyeAnimTable[]; +extern const union AnimCmd *const gEclipsingOrbAnimTable[]; // battle_anim_water.c void AnimWaterPulseRing(struct Sprite *sprite); +void AnimSmallBubblePair(struct Sprite *sprite); +void AnimWaterPulseBubble(struct Sprite *sprite); +extern const union AnimCmd *const gAnims_WaterBubbleProjectile[]; +extern const union AnimCmd *const gAnims_FlamethrowerFlame[]; +extern const union AnimCmd *const gAnims_WaterPulseBubble[]; // battle_anim_flying.c void DestroyAnimSpriteAfterTimer(struct Sprite *sprite); +void sub_810E2C8(struct Sprite *sprite); +void AnimAirWaveCrescent(struct Sprite *sprite); +void AnimFlyBallUp(struct Sprite *sprite); +void AnimFlyBallAttack(struct Sprite *sprite); +void AnimFlyBallAttack_Step(struct Sprite *sprite); +void AnimFlyBallUp_Step(struct Sprite *sprite); +extern const union AnimCmd *const gAffineAnims_AirWaveCrescent[]; +extern const union AffineAnimCmd *const gAffineAnims_FlyBallUp[]; +extern const union AffineAnimCmd *const gAffineAnims_FlyBallAttack[]; + +// battle_anim_poison.c +void AnimSludgeBombHitParticle(struct Sprite *); +void AnimAcidPoisonBubble_Step(struct Sprite *sprite); +extern const union AffineAnimCmd *const gAffineAnims_PoisonProjectile[]; +extern const union AnimCmd *const gAnims_PoisonProjectile[]; +extern const union AnimCmd *const gAnims_AcidPoisonDroplet[]; + +// battle_anim_ghost.c +void AnimGhostStatusSprite(struct Sprite *sprite); +void AnimShadowBall(struct Sprite *sprite); +void AnimTask_GrudgeFlames_Step(u8 taskId); +extern const union AffineAnimCmd *const gAffineAnims_ShadowBall[]; + +// battle_anim_psychic.c +extern const union AffineAnimCmd *const gAffineAnims_PsychoBoostOrb[]; +extern const union AffineAnimCmd *const gAffineAnims_LusterPurgeCircle[]; +void AnimPsychoBoost(struct Sprite *sprite); // battle_anim_smokescreen.c u8 SmokescreenImpact(s16 x, s16 y, u8 a3); @@ -279,6 +388,7 @@ extern const struct OamData gOamData_AffineDouble_ObjNormal_32x16; extern const struct OamData gOamData_AffineOff_ObjNormal_64x32; extern const struct OamData gOamData_AffineOff_ObjBlend_64x32; extern const struct OamData gOamData_AffineOff_ObjBlend_16x32; +extern const struct OamData gOamData_AffineDouble_ObjBlend_32x8; extern const struct CompressedSpriteSheet gBattleAnimPicTable[]; extern const struct CompressedSpritePalette gBattleAnimPaletteTable[]; @@ -293,4 +403,93 @@ extern const union AnimCmd *const gAnims_SmallBubblePair[]; extern const union AnimCmd *const gAnims_WaterBubble[]; extern const union AffineAnimCmd *const gAffineAnims_Bite[]; +// battle_anim_normal.c +extern const union AffineAnimCmd *const gAffineAnims_HitSplat[]; +void AnimHitSplatBasic(struct Sprite *sprite); +void AnimFlashingHitSplat(struct Sprite *sprite); +void AnimFlashingHitSplat_Step(struct Sprite *sprite); +void AnimHitSplatRandom(struct Sprite *sprite); +void AnimCrossImpact(struct Sprite *sprite); +void AnimHitSplatOnMonEdge(struct Sprite *sprite); + +// battle_anim_electric.c +void AnimThunderWave(struct Sprite *sprite); +void AnimGrowingChargeOrb(struct Sprite *sprite); +void AnimZapCannonSpark(struct Sprite *sprite); +void AnimSparkElectricity(struct Sprite *sprite); +void AnimElectricPuff(struct Sprite *sprite); +void AnimSparkElectricityFlashing(struct Sprite *sprite); +void AnimGrowingShockWaveOrb(struct Sprite *sprite); +extern const union AffineAnimCmd *const gAffineAnims_GrowingElectricOrb[]; +extern const union AffineAnimCmd *const gAffineAnims_FlashingSpark[]; +extern const union AnimCmd *const gAnims_ThunderboltOrb[]; +extern const union AnimCmd *const gAnims_ElectricPuff[]; +extern const union AnimCmd *const gAnims_ElectricChargingParticles[]; + +// battle_anim_fight.c +void AnimStompFoot(struct Sprite *sprite); +void AnimSpinningKickOrPunch(struct Sprite *sprite); +void AnimBrickBreakWall_Step(struct Sprite *sprite); +void AnimJumpKick(struct Sprite *sprite); +void AnimBasicFistOrFoot(struct Sprite *sprite); +void AnimSpinningKickOrPunchFinish(struct Sprite *sprite); +void AnimRevengeScratch(struct Sprite *sprite); +void AnimDizzyPunchDuck(struct Sprite *sprite); +extern const union AnimCmd *const gAnims_HandOrFoot[]; +extern const union AffineAnimCmd *const gAffineAnims_MegaPunchKick[]; +extern const union AffineAnimCmd *const gAffineAnims_SpinningHandOrFoot[]; +extern const union AnimCmd *const gAnims_RevengeBigScratch[]; + +// battle_anim_rock.c +extern const union AffineAnimCmd *const gAffineAnims_Whirlpool[]; +extern const union AffineAnimCmd *const gAffineAnims_BasicRock[]; +void AnimParticleInVortex(struct Sprite *sprite); +void AnimFallingRock(struct Sprite *sprite); +void AnimRaiseSprite(struct Sprite *sprite); +void AnimFallingRock_Step(struct Sprite *sprite); +void AnimFlyingSandCrescent(struct Sprite *sprite); + +// battle_anim_dark.c +void AnimClawSlash(struct Sprite *sprite); +void AnimTearDrop(struct Sprite *sprite); +void AnimBite(struct Sprite *sprite); +extern const union AnimCmd *const gAnims_ClawSlash[]; +extern const union AffineAnimCmd *const gAffineAnims_TearDrop[]; + +// battle_anim_bug.c +void AnimStringWrap_Step(struct Sprite *sprite); +void AnimMissileArc(struct Sprite *sprite); +void AnimSpiderWeb(struct Sprite *sprite); +void AnimMissileArc_Step(struct Sprite *sprite); + +// battle_anim_ice.c +void AnimThrowMistBall(struct Sprite *sprite); +void AnimMoveParticleBeyondTarget(struct Sprite *sprite); +void AnimIceEffectParticle(struct Sprite *sprite); +void AnimSwirlingSnowball_Step1(struct Sprite *sprite); +extern const union AnimCmd *const gAnims_Snowball[]; +extern const union AffineAnimCmd *const gAffineAnims_IceCrystalHit[]; +extern const union AnimCmd *const gAnims_IceCrystalLarge[]; +extern const union AnimCmd *const gAnims_IceBallChunk[]; +extern const union AnimCmd *const gAnims_BlizzardIceCrystal[]; + +// battle_anim_fire.c +void AnimFireSpread(struct Sprite *sprite); +void AnimFireSpiralOutward(struct Sprite *sprite); +extern const union AnimCmd *const gAnims_FireBlastCross[]; + +// battle_anim_dragon.c +extern const union AnimCmd *const gAnims_DragonBreathFire[]; +extern const union AnimCmd *const gAnims_DragonRageFirePlume[]; +extern const union AffineAnimCmd *const gAffineAnims_DragonRageFire[]; +extern const union AnimCmd *const gAnims_DragonRageFire[]; +extern const union AffineAnimCmd *const gAffineAnims_DragonBreathFire[]; +void AnimDragonRageFirePlume(struct Sprite *sprite); +void AnimDragonFireToTarget(struct Sprite *sprite); +void AnimDragonDanceOrb(struct Sprite *sprite); +void AnimOverheatFlame(struct Sprite *sprite); + +// battle_anim_new.c +void CoreEnforcerLoadBeamTarget(struct Sprite* sprite); + #endif // GUARD_BATTLE_ANIM_H diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 32918fefba..bbaa40ca80 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -82,6 +82,7 @@ enum // Special return values in gBattleBufferB from Battle Controller functions. #define RET_VALUE_LEVELED_UP 11 +#define RET_MEGA_EVOLUTION 0x80 struct UnusedControllerStruct { @@ -110,6 +111,8 @@ struct ChooseMoveStruct u16 species; u8 monType1; u8 monType2; + u8 monType3; + struct MegaEvolutionData mega; }; enum @@ -170,6 +173,7 @@ enum CONTROLLER_LINKSTANDBYMSG, CONTROLLER_RESETACTIONMOVESELECTION, CONTROLLER_55, + CONTROLLER_DEBUGMENU, /*new controllers should go here*/ CONTROLLER_TERMINATOR_NOP, CONTROLLER_CMDS_COUNT @@ -241,6 +245,7 @@ void BtlController_EmitBattleAnimation(u8 bufferId, u8 animationId, u16 argument void BtlController_EmitLinkStandbyMsg(u8 bufferId, u8 arg1, bool32 arg2); void BtlController_EmitResetActionMoveSelection(u8 bufferId, u8 caseId); void BtlController_EmitCmd55(u8 bufferId, u8 battleOutcome); +void BtlController_EmitDebugMenu(u8 bufferId); // player controller void SetControllerToPlayer(void); diff --git a/include/battle_debug.h b/include/battle_debug.h new file mode 100644 index 0000000000..271f875538 --- /dev/null +++ b/include/battle_debug.h @@ -0,0 +1,8 @@ +#ifndef GUARD_BATTLE_DEBUG_H +#define GUARD_BATTLE_DEBUG_H + +#define USE_BATTLE_DEBUG TRUE + +void CB2_BattleDebugMenu(void); + +#endif // GUARD_BATTLE_DEBUG_H diff --git a/include/battle_gfx_sfx_util.h b/include/battle_gfx_sfx_util.h index 16253e760e..546683ebac 100644 --- a/include/battle_gfx_sfx_util.h +++ b/include/battle_gfx_sfx_util.h @@ -27,7 +27,7 @@ bool8 BattleInitAllSprites(u8 *state1, u8 *battlerId); void ClearSpritesHealthboxAnimData(void); void CopyAllBattleSpritesInvisibilities(void); void CopyBattleSpriteInvisibility(u8 battlerId); -void HandleSpeciesGfxDataChange(u8 attacker, u8 target, bool8 notTransform); +void HandleSpeciesGfxDataChange(u8 attacker, u8 target, bool8 notTransform, bool32 megaEvo); void BattleLoadSubstituteOrMonSpriteGfx(u8 battlerId, bool8 loadMonSprite); void LoadBattleMonGfxAndAnimate(u8 battlerId, bool8 loadMonSprite, u8 spriteId); void TrySetBehindSubstituteSpriteBit(u8 battlerId, u16 move); diff --git a/include/battle_interface.h b/include/battle_interface.h index 3145939d0c..32c679285c 100644 --- a/include/battle_interface.h +++ b/include/battle_interface.h @@ -39,11 +39,17 @@ enum #define TAG_STATUS_SUMMARY_BAR_TILE 0xD70C #define TAG_STATUS_SUMMARY_BALLS_TILE 0xD714 +#define TAG_MEGA_TRIGGER_TILE 0xD777 +#define TAG_MEGA_INDICATOR_TILE 0xD778 + #define TAG_HEALTHBOX_PAL 0xD6FF #define TAG_HEALTHBAR_PAL 0xD704 #define TAG_STATUS_SUMMARY_BAR_PAL 0xD710 #define TAG_STATUS_SUMMARY_BALLS_PAL 0xD712 +#define TAG_MEGA_TRIGGER_PAL 0xD777 +#define TAG_MEGA_INDICATOR_PAL 0xD778 + enum { HEALTHBOX_ALL, @@ -60,6 +66,7 @@ enum HEALTHBOX_SAFARI_BALLS_TEXT }; +u8 GetMegaIndicatorSpriteId(u32 healthboxSpriteId); u8 CreateBattlerHealthboxSprites(u8 battler); u8 CreateSafariPlayerHealthboxSprites(void); void SetBattleBarStruct(u8 battler, u8 healthboxSpriteId, s32 maxVal, s32 currVal, s32 receivedValue); @@ -71,11 +78,19 @@ void UpdateOamPriorityInAllHealthboxes(u8 priority); void InitBattlerHealthboxCoords(u8 battler); void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent); void SwapHpBarsWithHpText(void); +void ChangeMegaTriggerSprite(u8 spriteId, u8 animId); +void CreateMegaTriggerSprite(u8 battlerId, u8 palId); +bool32 IsMegaTriggerSpriteActive(void); +void HideMegaTriggerSprite(void); +void DestroyMegaTriggerSprite(void); +u32 CreateMegaIndicatorSprite(u32 battlerId, u32 which); +void DestroyMegaIndicatorSprite(u32 healthboxSpriteId); u8 CreatePartyStatusSummarySprites(u8 battler, struct HpAndStatus *partyInfo, u8 arg2, bool8 isBattleStart); void Task_HidePartyStatusSummary(u8 taskId); void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elementId); s32 MoveBattleBar(u8 battler, u8 healthboxSpriteId, u8 whichBar, u8 arg3); u8 GetScaledHPFraction(s16 hp, s16 maxhp, u8 scale); u8 GetHPBarLevel(s16 hp, s16 maxhp); +void CreateAbilityPopUp(u8 battlerId, u32 ability, bool32 isDoubleBattle); #endif // GUARD_BATTLE_INTERFACE_H diff --git a/include/battle_main.h b/include/battle_main.h index 0176f7f244..c0b8e6c0fd 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -24,21 +24,6 @@ struct UnknownPokemonStruct4 #define TYPE_NAME_LENGTH 6 #define ABILITY_NAME_LENGTH 12 -// defines for the u8 array gTypeEffectiveness -#define TYPE_EFFECT_ATK_TYPE(i)((gTypeEffectiveness[i + 0])) -#define TYPE_EFFECT_DEF_TYPE(i)((gTypeEffectiveness[i + 1])) -#define TYPE_EFFECT_MULTIPLIER(i)((gTypeEffectiveness[i + 2])) - -// defines for the gTypeEffectiveness multipliers -#define TYPE_MUL_NO_EFFECT 0 -#define TYPE_MUL_NOT_EFFECTIVE 5 -#define TYPE_MUL_NORMAL 10 -#define TYPE_MUL_SUPER_EFFECTIVE 20 - -// special type table Ids -#define TYPE_FORESIGHT 0xFE -#define TYPE_ENDTABLE 0xFF - // defines for the 'DoBounceEffect' function #define BOUNCE_MON 0x0 #define BOUNCE_HEALTHBOX 0x1 @@ -77,18 +62,21 @@ void BattleTurnPassed(void); u8 IsRunningFromBattleImpossible(void); void SwitchPartyOrder(u8 battlerId); void SwapTurnOrder(u8 id1, u8 id2); +u32 GetBattlerTotalSpeedStat(u8 battlerId); +s8 GetChosenMovePriority(u32 battlerId); +s8 GetMovePriority(u32 battlerId, u16 move); u8 GetWhoStrikesFirst(u8 battlerId1, u8 battlerId2, bool8 ignoreChosenMoves); void RunBattleScriptCommands_PopCallbacksStack(void); void RunBattleScriptCommands(void); bool8 TryRunFromBattle(u8 battlerId); void SpecialStatusesClear(void); +void SetTypeBeforeUsingMove(u16 move, u8 battlerAtk); extern struct UnknownPokemonStruct4 gMultiPartnerParty[MULTI_PARTY_SIZE]; extern const struct SpriteTemplate gUnknown_0831AC88; extern const struct OamData gOamData_831ACA8; extern const struct OamData gOamData_831ACB0; -extern const u8 gTypeEffectiveness[336]; extern const u8 gTypeNames[NUMBER_OF_MON_TYPES][TYPE_NAME_LENGTH + 1]; extern const struct TrainerMoney gTrainerMoneyTable[]; extern const u8 gAbilityNames[][ABILITY_NAME_LENGTH + 1]; diff --git a/include/battle_message.h b/include/battle_message.h index af090a06cf..1de80c0b90 100644 --- a/include/battle_message.h +++ b/include/battle_message.h @@ -57,6 +57,15 @@ #define B_TXT_PARTNER_CLASS 0x32 #define B_TXT_PARTNER_NAME 0x33 #define B_TXT_BUFF3 0x34 +#define B_TXT_ATK_TRAINER_NAME 0x35 +#define B_TXT_ATK_TRAINER_CLASS 0x36 +#define B_TXT_ATK_TEAM1 0x37 // Your/The opposing +#define B_TXT_ATK_TEAM2 0x38 // your/the opposing +#define B_TXT_DEF_NAME 0x39 +#define B_TXT_DEF_TEAM1 0x3A // Your/The opposing +#define B_TXT_DEF_TEAM2 0x3B // your/the opposing +#define B_TXT_ACTIVE_NAME 0x3C +#define B_TXT_ACTIVE_NAME2 0x3D // no Illusion check // for B_TXT_BUFF1, B_TXT_BUFF2 and B_TXT_BUFF3 @@ -210,12 +219,20 @@ struct BattleMsgData u8 textBuffs[3][TEXT_BUFF_ARRAY_COUNT]; }; +enum +{ + TRAINER_SLIDE_LAST_SWITCHIN, + TRAINER_SLIDE_LAST_LOW_HP, + TRAINER_SLIDE_FIRST_DOWN, +}; + void BufferStringBattle(u16 stringID); u32 BattleStringExpandPlaceholdersToDisplayedString(const u8* src); u32 BattleStringExpandPlaceholders(const u8* src, u8* dst); void BattlePutTextOnWindow(const u8* text, u8 windowId); void SetPpNumbersPaletteInMoveSelection(void); u8 GetCurrentPpToMaxPpState(u8 currentPp, u8 maxPp); +bool32 ShouldDoTrainerSlide(u32 battlerId, u32 trainerId, u32 which); extern struct BattleMsgData *gBattleMsgDataPtr; @@ -291,6 +308,7 @@ extern const u8 gText_BattleRecordedOnPass[]; extern const u8 gText_BattleTourney[]; extern const u16 gMissStringIds[]; +extern const u16 gStatUpStringIds[]; extern const u16 gTrappingMoves[]; #endif // GUARD_BATTLE_MESSAGE_H diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index ee36764630..454b6ab345 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -6,16 +6,26 @@ #define WINDOW_CLEAR 0x1 #define WINDOW_x80 0x80 -void AI_CalcDmg(u8 battlerIdAtk, u8 battlerIdDef); -u8 TypeCalc(u16 move, u8 battlerIdAtk, u8 battlerIdDef); -u8 AI_TypeCalc(u16 move, u16 targetSpecies, u8 targetAbility); +s32 CalcCritChanceStage(u8 battlerAtk, u8 battlerDef, u32 move, bool32 recordAbility); +u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move); u8 GetBattlerTurnOrderNum(u8 battlerId); -void SetMoveEffect(bool8 primary, u8 certain); +bool32 NoAliveMonsForEitherParty(void); +void SetMoveEffect(bool32 primary, u32 certain); +bool32 CanBattlerSwitch(u32 battlerId); void BattleDestroyYesNoCursorAt(u8 cursorPosition); void BattleCreateYesNoCursorAt(u8 cursorPosition); void BufferMoveToLearnIntoBattleTextBuff2(void); void HandleBattleWindow(u8 xStart, u8 yStart, u8 xEnd, u8 yEnd, u8 flags); bool8 UproarWakeUpCheck(u8 battlerId); +bool32 DoesSubstituteBlockMove(u8 battlerAtk, u8 battlerDef, u32 move); +bool32 DoesDisguiseBlockMove(u8 battlerAtk, u8 battlerDef, u32 move); +bool32 CanPoisonType(u8 battlerAttacker, u8 battlerTarget); +bool32 CanParalyzeType(u8 battlerAttacker, u8 battlerTarget); +bool32 CanUseLastResort(u8 battlerId); +u32 IsFlowerVeilProtected(u32 battler); +u32 IsLeafGuardProtected(u32 battler); +bool32 IsShieldsDownProtected(u32 battler); +u32 IsAbilityStatusProtected(u32 battler); extern void (* const gBattleScriptingCommandsTable[])(void); extern const u8 gBattlePalaceNatureToMoveGroupLikelihood[NUM_NATURES][4]; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 706d410977..cb2e0f9158 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -1,12 +1,14 @@ #ifndef GUARD_BATTLE_SCRIPTS_H #define GUARD_BATTLE_SCRIPTS_H +extern const u8 BattleScript_NotAffected[]; extern const u8 BattleScript_HitFromCritCalc[]; extern const u8 BattleScript_MoveEnd[]; extern const u8 BattleScript_MakeMoveMissed[]; extern const u8 BattleScript_PrintMoveMissed[]; extern const u8 BattleScript_MoveMissedPause[]; extern const u8 BattleScript_MoveMissed[]; +extern const u8 BattleScript_ButItFailedAtkStringPpReduce[]; extern const u8 BattleScript_ButItFailed[]; extern const u8 BattleScript_StatUp[]; extern const u8 BattleScript_StatDown[]; @@ -53,7 +55,8 @@ extern const u8 BattleScript_LeechSeedTurnDrain[]; extern const u8 BattleScript_BideStoringEnergy[]; extern const u8 BattleScript_BideAttack[]; extern const u8 BattleScript_BideNoEnergyToAttack[]; -extern const u8 BattleScript_SuccessForceOut[]; +extern const u8 BattleScript_RoarSuccessSwitch[]; +extern const u8 BattleScript_RoarSuccessEndBattle[]; extern const u8 BattleScript_MistProtected[]; extern const u8 BattleScript_RageIsBuilding[]; extern const u8 BattleScript_MoveUsedIsDisabled[]; @@ -63,9 +66,9 @@ extern const u8 BattleScript_SelectingDisabledMoveInPalace[]; extern const u8 BattleScript_SelectingUnusableMoveInPalace[]; extern const u8 BattleScript_EncoredNoMore[]; extern const u8 BattleScript_DestinyBondTakesLife[]; -extern const u8 BattleScript_SpikesOnAttacker[]; -extern const u8 BattleScript_SpikesOnTarget[]; -extern const u8 BattleScript_SpikesOnFaintedBattler[]; +extern const u8 BattleScript_DmgHazardsOnAttacker[]; +extern const u8 BattleScript_DmgHazardsOnTarget[]; +extern const u8 BattleScript_DmgHazardsOnFaintedBattler[]; extern const u8 BattleScript_PerishSongTakesLife[]; extern const u8 BattleScript_PerishSongCountGoesDown[]; extern const u8 BattleScript_AllStatsUp[]; @@ -86,6 +89,7 @@ extern const u8 BattleScript_SelectingNotAllowedMoveTauntInPalace[]; extern const u8 BattleScript_WishComesTrue[]; extern const u8 BattleScript_IngrainTurnHeal[]; extern const u8 BattleScript_AtkDefDown[]; +extern const u8 BattleScript_DefSpDefDown[]; extern const u8 BattleScript_KnockedOff[]; extern const u8 BattleScript_MoveUsedIsImprisoned[]; extern const u8 BattleScript_SelectingImprisonedMove[]; @@ -137,6 +141,7 @@ extern const u8 BattleScript_ItemSteal[]; extern const u8 BattleScript_DrizzleActivates[]; extern const u8 BattleScript_SpeedBoostActivates[]; extern const u8 BattleScript_TraceActivates[]; +extern const u8 BattleScript_TraceActivatesEnd3[]; extern const u8 BattleScript_RainDishActivates[]; extern const u8 BattleScript_SandstreamActivates[]; extern const u8 BattleScript_ShedSkinActivates[]; @@ -168,13 +173,14 @@ extern const u8 BattleScript_StickyHoldActivates[]; extern const u8 BattleScript_ColorChangeActivates[]; extern const u8 BattleScript_RoughSkinActivates[]; extern const u8 BattleScript_CuteCharmActivates[]; -extern const u8 BattleScript_ApplySecondaryEffect[]; +extern const u8 BattleScript_AbilityStatusEffect[]; extern const u8 BattleScript_SynchronizeActivates[]; extern const u8 BattleScript_NoItemSteal[]; extern const u8 BattleScript_AbilityCuredStatus[]; extern const u8 BattleScript_IgnoresWhileAsleep[]; extern const u8 BattleScript_IgnoresAndUsesRandomMove[]; extern const u8 BattleScript_MoveUsedLoafingAround[]; +extern const u8 BattleScript_TruantLoafingAround[]; extern const u8 BattleScript_IgnoresAndFallsAsleep[]; extern const u8 BattleScript_IgnoresAndHitsItself[]; extern const u8 BattleScript_SubstituteFade[]; @@ -194,12 +200,13 @@ extern const u8 BattleScript_BerryCureChosenStatusEnd2[]; extern const u8 BattleScript_BerryCureChosenStatusRet[]; extern const u8 BattleScript_WhiteHerbEnd2[]; extern const u8 BattleScript_WhiteHerbRet[]; -extern const u8 BattleScript_ItemHealHP_RemoveItem[]; +extern const u8 BattleScript_ItemHealHP_RemoveItemRet[]; +extern const u8 BattleScript_ItemHealHP_RemoveItemEnd2[]; extern const u8 BattleScript_BerryPPHealEnd2[]; extern const u8 BattleScript_ItemHealHP_End2[]; extern const u8 BattleScript_ItemHealHP_Ret[]; extern const u8 BattleScript_SelectingNotAllowedMoveChoiceItem[]; -extern const u8 BattleScript_FocusBandActivates[]; +extern const u8 BattleScript_HangedOnMsg[]; extern const u8 BattleScript_BerryConfuseHealEnd2[]; extern const u8 BattleScript_BerryStatRaiseEnd2[]; extern const u8 BattleScript_BerryFocusEnergyEnd2[]; @@ -222,5 +229,124 @@ extern const u8 BattleScript_RunByUsingItem[]; extern const u8 BattleScript_ActionWatchesCarefully[]; extern const u8 BattleScript_ActionGetNear[]; extern const u8 BattleScript_ActionThrowPokeblock[]; +extern const u8 BattleScript_EmbargoEndTurn[]; +extern const u8 BattleScript_TelekinesisEndTurn[]; +extern const u8 BattleScript_BufferEndTurn[]; +extern const u8 BattleScript_AquaRingHeal[]; +extern const u8 BattleScript_AuroraVeilEnds[]; +extern const u8 BattleScript_LuckyChantEnds[]; +extern const u8 BattleScript_TailwindEnds[]; +extern const u8 BattleScript_TrickRoomEnds[]; +extern const u8 BattleScript_WonderRoomEnds[]; +extern const u8 BattleScript_MagicRoomEnds[]; +extern const u8 BattleScript_ElectricTerrainEnds[]; +extern const u8 BattleScript_MistyTerrainEnds[]; +extern const u8 BattleScript_GrassyTerrainEnds[]; +extern const u8 BattleScript_PsychicTerrainEnds[]; +extern const u8 BattleScript_MudSportEnds[]; +extern const u8 BattleScript_WaterSportEnds[]; +extern const u8 BattleScript_SturdiedMsg[]; +extern const u8 BattleScript_GravityEnds[]; +extern const u8 BattleScript_MoveStatDrain[]; +extern const u8 BattleScript_MoveStatDrain_PPLoss[]; +extern const u8 BattleScript_TargetAbilityStatRaise[]; +extern const u8 BattleScript_AngryPointActivates[]; +extern const u8 BattleScript_AttackerAbilityStatRaise[]; +extern const u8 BattleScript_AttackerAbilityStatRaiseEnd3[]; +extern const u8 BattleScript_PoisonHealActivates[]; +extern const u8 BattleScript_BadDreamsActivates[]; +extern const u8 BattleScript_SwitchInAbilityMsg[]; +extern const u8 BattleScript_ToxicSpikesPoisoned[]; +extern const u8 BattleScript_ToxicSpikesAbsorbed[]; +extern const u8 BattleScript_StickyWebOnSwitchIn[]; +extern const u8 BattleScript_SolarPowerActivates[]; +extern const u8 BattleScript_CursedBodyActivates[]; +extern const u8 BattleScript_MummyActivates[]; +extern const u8 BattleScript_WeakArmorActivates[]; +extern const u8 BattleScript_FellStingerRaisesStat[]; +extern const u8 BattleScript_SnowWarningActivates[]; +extern const u8 BattleScript_HarvestActivates[]; +extern const u8 BattleScript_ImposterActivates[]; +extern const u8 BattleScript_SelectingNotAllowedMoveAssaultVest[]; +extern const u8 BattleScript_SelectingNotAllowedMoveGravity[]; +extern const u8 BattleScript_MoveUsedGravityPrevents[]; +extern const u8 BattleScript_SelectingNotAllowedMoveGravityInPalace[]; +extern const u8 BattleScript_SelectingNotAllowedMoveHealBlock[]; +extern const u8 BattleScript_MoveUsedHealBlockPrevents[]; +extern const u8 BattleScript_SelectingNotAllowedMoveHealBlockInPalace[]; +extern const u8 BattleScript_ToxicSpikesFree[]; +extern const u8 BattleScript_StickyWebFree[]; +extern const u8 BattleScript_StealthRockFree[]; +extern const u8 BattleScript_MegaEvolution[]; +extern const u8 BattleScript_MoveEffectRecoilWithStatus[]; +extern const u8 BattleScript_EffectWithChance[]; +extern const u8 BattleScript_MoveEffectClearSmog[]; +extern const u8 BattleScript_ForceRandomSwitch[]; +extern const u8 BattleScript_SideStatusWoreOffReturn[]; +extern const u8 BattleScript_MoveEffectSmackDown[]; +extern const u8 BattleScript_MoveEffectFlameBurst[]; +extern const u8 BattleScript_TrainerSlideMsgRet[]; +extern const u8 BattleScript_TrainerSlideMsgEnd2[]; +extern const u8 BattleScript_MoveEffectFeint[]; +extern const u8 BattleScript_ProteanActivates[]; +extern const u8 BattleScript_DazzlingProtected[]; +extern const u8 BattleScript_MoveUsedPsychicTerrainPrevents[]; +extern const u8 BattleScript_MoveUsedPowder[]; +extern const u8 BattleScript_SelectingNotAllowedBelch[]; +extern const u8 BattleScript_SelectingNotAllowedBelchInPalace[]; +extern const u8 BattleScript_PsychicSurgeActivates[]; +extern const u8 BattleScript_GrassySurgeActivates[]; +extern const u8 BattleScript_MistySurgeActivates[]; +extern const u8 BattleScript_ElectricSurgeActivates[]; +extern const u8 BattleScript_SpectralThiefSteal[]; +extern const u8 BattleScript_StatUpMsg[]; +extern const u8 BattleScript_DefiantActivates[]; +extern const u8 BattleScript_PowderMoveNoEffect[]; +extern const u8 BattleScript_GrassyTerrainHeals[]; +extern const u8 BattleScript_VCreateStatLoss[]; +extern const u8 BattleScript_SpikyShieldEffect[]; +extern const u8 BattleScript_KingsShieldEffect[]; +extern const u8 BattleScript_BanefulBunkerEffect[]; +extern const u8 BattleScript_FlowerVeilProtectsRet[]; +extern const u8 BattleScript_SweetVeilProtectsRet[]; +extern const u8 BattleScript_MoveEffectCoreEnforcer[]; +extern const u8 BattleScript_SelectingNotAllowedMoveThroatChop[]; +extern const u8 BattleScript_MoveUsedIsThroatChopPrevented[]; +extern const u8 BattleScript_SelectingNotAllowedMoveThroatChopInPalace[]; +extern const u8 BattleScript_ThroatChopEndTurn[]; +extern const u8 BattleScript_GemActivates[]; +extern const u8 BattleScript_BerryReduceDmg[]; +extern const u8 BattleScript_PrintBerryReduceString[]; +extern const u8 BattleScript_WeaknessPolicy[]; +extern const u8 BattleScript_TargetItemStatRaise[]; +extern const u8 BattleScript_RockyHelmetActivates[]; +extern const u8 BattleScript_ItemHurtEnd2[]; +extern const u8 BattleScript_AirBaloonMsgIn[]; +extern const u8 BattleScript_AirBaloonMsgPop[]; +extern const u8 BattleScript_ItemHurtRet[]; +extern const u8 BattleScript_ToxicOrb[]; +extern const u8 BattleScript_FlameOrb[]; +extern const u8 BattleScript_MoveEffectIncinerate[]; +extern const u8 BattleScript_MoveEffectBugBite[]; +extern const u8 BattleScript_IllusionOff[]; +extern const u8 BattleScript_DancerActivates[]; +extern const u8 BattleScript_AftermathDmg[]; +extern const u8 BattleScript_AttackerFormChange[]; +extern const u8 BattleScript_AttackerFormChangeEnd3[]; +extern const u8 BattleScript_TargetFormChange[]; +extern const u8 BattleScript_AnticipationActivates[]; +extern const u8 BattleScript_SlowStartEnds[]; +extern const u8 BattleScript_HealerActivates[]; +extern const u8 BattleScript_ScriptingAbilityStatRaise[]; +extern const u8 BattleScript_ReceiverActivates[]; +extern const u8 BattleScript_FriskActivates[]; +extern const u8 BattleScript_FriskMsg[]; +extern const u8 BattleScript_FriskMsgWithPopup[]; +extern const u8 BattleScript_MoodyActivates[]; +extern const u8 BattleScript_EmergencyExit[]; +extern const u8 BattleScript_EmergencyExitNoPopUp[]; +extern const u8 BattleScript_EmergencyExitWild[]; +extern const u8 BattleScript_EmergencyExitWildNoPopUp[]; +extern const u8 BattleScript_CheekPouchActivates[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/battle_setup.h b/include/battle_setup.h index 7fa0457a89..1d1a35fa19 100644 --- a/include/battle_setup.h +++ b/include/battle_setup.h @@ -19,6 +19,7 @@ extern u16 gTrainerBattleOpponent_B; extern u16 gPartnerTrainerId; void BattleSetup_StartWildBattle(void); +void BattleSetup_StartDoubleWildBattle(void); void BattleSetup_StartBattlePikeWildBattle(void); void BattleSetup_StartRoamerBattle(void); void StartWallyTutorialBattle(void); @@ -28,6 +29,8 @@ void BattleSetup_StartLegendaryBattle(void); void StartGroudonKyogreBattle(void); void StartRegiBattle(void); u8 BattleSetup_GetTerrainId(void); +u8 GetWildBattleTransition(void); +u8 GetTrainerBattleTransition(void); u8 GetSpecialBattleTransition(s32 arg0); void ChooseStarter(void); void ResetTrainerOpponentIds(void); diff --git a/include/battle_util.h b/include/battle_util.h index 81443f4631..2bd6c8cb13 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -6,40 +6,44 @@ #define MOVE_LIMITATION_DISABLED (1 << 2) #define MOVE_LIMITATION_TORMENTED (1 << 3) #define MOVE_LIMITATION_TAUNT (1 << 4) -#define MOVE_LIMITATION_IMPRISON (1 << 5) +#define MOVE_LIMITATION_IMPRISON (1 << 5) #define ABILITYEFFECT_ON_SWITCHIN 0x0 #define ABILITYEFFECT_ENDTURN 0x1 #define ABILITYEFFECT_MOVES_BLOCK 0x2 #define ABILITYEFFECT_ABSORBING 0x3 -#define ABILITYEFFECT_ON_DAMAGE 0x4 -#define ABILITYEFFECT_IMMUNITY 0x5 -#define ABILITYEFFECT_FORECAST 0x6 -#define ABILITYEFFECT_SYNCHRONIZE 0x7 -#define ABILITYEFFECT_ATK_SYNCHRONIZE 0x8 -#define ABILITYEFFECT_INTIMIDATE1 0x9 -#define ABILITYEFFECT_INTIMIDATE2 0xA -#define ABILITYEFFECT_TRACE 0xB -#define ABILITYEFFECT_CHECK_OTHER_SIDE 0xC -#define ABILITYEFFECT_CHECK_BATTLER_SIDE 0xD -#define ABILITYEFFECT_FIELD_SPORT 0xE -#define ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER 0xF -#define ABILITYEFFECT_COUNT_OTHER_SIDE 0x10 -#define ABILITYEFFECT_COUNT_BATTLER_SIDE 0x11 -#define ABILITYEFFECT_COUNT_ON_FIELD 0x12 -#define ABILITYEFFECT_CHECK_ON_FIELD 0x13 +#define ABILITYEFFECT_MOVE_END_ATTACKER 0x4 +#define ABILITYEFFECT_MOVE_END 0x5 +#define ABILITYEFFECT_IMMUNITY 0x6 +#define ABILITYEFFECT_FORECAST 0x7 +#define ABILITYEFFECT_SYNCHRONIZE 0x8 +#define ABILITYEFFECT_ATK_SYNCHRONIZE 0x9 +#define ABILITYEFFECT_INTIMIDATE1 0xA +#define ABILITYEFFECT_INTIMIDATE2 0xB +#define ABILITYEFFECT_TRACE1 0xC +#define ABILITYEFFECT_TRACE2 0xD +#define ABILITYEFFECT_MOVE_END_OTHER 0xE #define ABILITYEFFECT_SWITCH_IN_WEATHER 0xFF -#define ABILITY_ON_OPPOSING_FIELD(battlerId, abilityId)(AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, battlerId, abilityId, 0, 0)) -#define ABILITY_ON_FIELD(abilityId)(AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, abilityId, 0, 0)) -#define ABILITY_ON_FIELD2(abilityId)(AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, abilityId, 0, 0)) - #define ITEMEFFECT_ON_SWITCH_IN 0x0 #define ITEMEFFECT_MOVE_END 0x3 #define ITEMEFFECT_KINGSROCK_SHELLBELL 0x4 +#define ITEMEFFECT_TARGET 0x5 +#define ITEMEFFECT_ORBS 0x6 -#define WEATHER_HAS_EFFECT ((!ABILITY_ON_FIELD(ABILITY_CLOUD_NINE) && !ABILITY_ON_FIELD(ABILITY_AIR_LOCK))) -#define WEATHER_HAS_EFFECT2 ((!ABILITY_ON_FIELD2(ABILITY_CLOUD_NINE) && !ABILITY_ON_FIELD2(ABILITY_AIR_LOCK))) +#define WEATHER_HAS_EFFECT ((!IsAbilityOnField(ABILITY_CLOUD_NINE) && !IsAbilityOnField(ABILITY_AIR_LOCK))) + +#define IS_WHOLE_SIDE_ALIVE(battler)((IsBattlerAlive(battler) && IsBattlerAlive(BATTLE_PARTNER(battler)))) + +// for Natural Gift and Fling +struct TypePower +{ + u8 type; + u8 power; + u16 effect; +}; + +extern const struct TypePower gNaturalGiftTable[]; void HandleAction_UseMove(void); void HandleAction_Switch(void); @@ -59,6 +63,7 @@ void PressurePPLose(u8 target, u8 attacker, u16 move); void PressurePPLoseOnUsingPerishSong(u8 attacker); void PressurePPLoseOnUsingImprison(u8 attacker); void MarkAllBattlersForControllerExec(void); // unused +bool32 IsBattlerMarkedForControllerExec(u8 battlerId); void MarkBattlerForControllerExec(u8 battlerId); void sub_803F850(u8 arg0); void CancelMultiTurnMoves(u8 battlerId); @@ -75,20 +80,52 @@ u8 CheckMoveLimitations(u8 battlerId, u8 unusableMoves, u8 check); bool8 AreAllMovesUnusable(void); u8 GetImprisonedMovesCount(u8 battlerId, u16 move); u8 DoFieldEndTurnEffects(void); +s32 GetDrainedBigRootHp(u32 battler, s32 hp); u8 DoBattlerEndTurnEffects(void); bool8 HandleWishPerishSongOnTurnEnd(void); bool8 HandleFaintedMonActions(void); -void TryClearRageStatuses(void); +void TryClearRageAndFuryCutter(void); u8 AtkCanceller_UnableToUseMove(void); +u8 AtkCanceller_UnableToUseMove2(void); bool8 HasNoMonsToSwitch(u8 battlerId, u8 r1, u8 r2); -u8 CastformDataTypeChange(u8 battlerId); +u8 TryWeatherFormChange(u8 battlerId); +bool32 TryChangeBattleWeather(u8 battler, u32 weatherEnumId, bool32 viaAbility); u8 AbilityBattleEffects(u8 caseID, u8 battlerId, u8 ability, u8 special, u16 moveArg); +u32 GetBattlerAbility(u8 battlerId); +u32 IsAbilityOnSide(u32 battlerId, u32 ability); +u32 IsAbilityOnOpposingSide(u32 battlerId, u32 ability); +u32 IsAbilityOnField(u32 ability); +u32 IsAbilityOnFieldExcept(u32 battlerId, u32 ability); +u32 IsAbilityPreventingEscape(u32 battlerId); +bool32 CanBattlerEscape(u32 battlerId); // no ability check void BattleScriptExecute(const u8* BS_ptr); void BattleScriptPushCursorAndCallback(const u8* BS_ptr); u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn); void ClearFuryCutterDestinyBondGrudge(u8 battlerId); void HandleAction_RunBattleScript(void); +u32 SetRandomTarget(u32 battlerId); u8 GetMoveTarget(u16 move, u8 setTarget); u8 IsMonDisobedient(void); +u32 GetBattlerHoldEffect(u8 battlerId, bool32 checkNegating); +u32 GetBattlerHoldEffectParam(u8 battlerId); +bool32 IsMoveMakingContact(u16 move, u8 battlerAtk); +bool32 IsBattlerGrounded(u8 battlerId); +bool32 IsBattlerAlive(u8 battlerId); +u8 GetBattleMonMoveSlot(struct BattlePokemon *battleMon, u16 move); +u32 GetBattlerWeight(u8 battlerId); +s32 CalculateMoveDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, s32 fixedBasePower, bool32 isCrit, bool32 randomFactor, bool32 updateFlags); +u16 CalcTypeEffectivenessMultiplier(u16 move, u8 moveType, u8 battlerAtk, u8 battlerDef, bool32 recordAbilities); +u16 CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u8 abilityDef); +u16 GetTypeModifier(u8 atkType, u8 defType); +s32 GetStealthHazardDamage(u8 hazardType, u8 battlerId); +u16 GetMegaEvolutionSpecies(u16 preEvoSpecies, u16 heldItemId); +bool32 CanMegaEvolve(u8 battlerId); +void UndoMegaEvolution(u32 monId); +void UndoFormChange(u32 monId, u32 side); +bool32 DoBattlersShareType(u32 battler1, u32 battler2); +bool32 CanBattlerGetOrLoseItem(u8 battlerId, u16 itemId); +struct Pokemon *GetIllusionMonPtr(u32 battlerId); +void ClearIllusionMon(u32 battlerId); +bool32 SetIllusionMon(struct Pokemon *mon, u32 battlerId); #endif // GUARD_BATTLE_UTIL_H diff --git a/include/constants/abilities.h b/include/constants/abilities.h index 4ad54c86fa..fdb5233f02 100644 --- a/include/constants/abilities.h +++ b/include/constants/abilities.h @@ -80,6 +80,181 @@ #define ABILITY_CACOPHONY 76 #define ABILITY_AIR_LOCK 77 -#define ABILITIES_COUNT 78 +#define ABILITIES_COUNT_GEN3 78 + +// Gen4 abilities. +#define ABILITY_TANGLED_FEET 78 +#define ABILITY_MOTOR_DRIVE 79 +#define ABILITY_RIVALRY 80 +#define ABILITY_STEADFAST 81 +#define ABILITY_SNOW_CLOAK 82 +#define ABILITY_GLUTTONY 83 +#define ABILITY_ANGER_POINT 84 +#define ABILITY_UNBURDEN 85 +#define ABILITY_HEATPROOF 86 +#define ABILITY_SIMPLE 87 +#define ABILITY_DRY_SKIN 88 +#define ABILITY_DOWNLOAD 89 +#define ABILITY_IRON_FIST 90 +#define ABILITY_POISON_HEAL 91 +#define ABILITY_ADAPTABILITY 92 +#define ABILITY_SKILL_LINK 93 +#define ABILITY_HYDRATION 94 +#define ABILITY_SOLAR_POWER 95 +#define ABILITY_QUICK_FEET 96 +#define ABILITY_NORMALIZE 97 +#define ABILITY_SNIPER 98 +#define ABILITY_MAGIC_GUARD 99 +#define ABILITY_NO_GUARD 100 +#define ABILITY_STALL 101 +#define ABILITY_TECHNICIAN 102 +#define ABILITY_LEAF_GUARD 103 +#define ABILITY_KLUTZ 104 +#define ABILITY_MOLD_BREAKER 105 +#define ABILITY_SUPER_LUCK 106 +#define ABILITY_AFTERMATH 107 +#define ABILITY_ANTICIPATION 108 +#define ABILITY_FOREWARN 109 +#define ABILITY_UNAWARE 110 +#define ABILITY_TINTED_LENS 111 +#define ABILITY_FILTER 112 +#define ABILITY_SLOW_START 113 +#define ABILITY_SCRAPPY 114 +#define ABILITY_STORM_DRAIN 115 +#define ABILITY_ICE_BODY 116 +#define ABILITY_SOLID_ROCK 117 +#define ABILITY_SNOW_WARNING 118 +#define ABILITY_HONEY_GATHER 119 +#define ABILITY_FRISK 120 +#define ABILITY_RECKLESS 121 +#define ABILITY_MULTITYPE 122 +#define ABILITY_FLOWER_GIFT 123 +#define ABILITY_BAD_DREAMS 124 + +#define ABILITIES_COUNT_GEN4 125 + +// Gen5 abilities. +#define ABILITY_PICKPOCKET 125 +#define ABILITY_SHEER_FORCE 126 +#define ABILITY_CONTRARY 127 +#define ABILITY_UNNERVE 128 +#define ABILITY_DEFIANT 129 +#define ABILITY_DEFEATIST 130 +#define ABILITY_CURSED_BODY 131 +#define ABILITY_HEALER 132 +#define ABILITY_FRIEND_GUARD 133 +#define ABILITY_WEAK_ARMOR 134 +#define ABILITY_HEAVY_METAL 135 +#define ABILITY_LIGHT_METAL 136 +#define ABILITY_MULTISCALE 137 +#define ABILITY_TOXIC_BOOST 138 +#define ABILITY_FLARE_BOOST 139 +#define ABILITY_HARVEST 140 +#define ABILITY_TELEPATHY 141 +#define ABILITY_MOODY 142 +#define ABILITY_OVERCOAT 143 +#define ABILITY_POISON_TOUCH 144 +#define ABILITY_REGENERATOR 145 +#define ABILITY_BIG_PECKS 146 +#define ABILITY_SAND_RUSH 147 +#define ABILITY_WONDER_SKIN 148 +#define ABILITY_ANALYTIC 149 +#define ABILITY_ILLUSION 150 +#define ABILITY_IMPOSTER 151 +#define ABILITY_INFILTRATOR 152 +#define ABILITY_MUMMY 153 +#define ABILITY_MOXIE 154 +#define ABILITY_JUSTIFIED 155 +#define ABILITY_RATTLED 156 +#define ABILITY_MAGIC_BOUNCE 157 +#define ABILITY_SAP_SIPPER 158 +#define ABILITY_PRANKSTER 159 +#define ABILITY_SAND_FORCE 160 +#define ABILITY_IRON_BARBS 161 +#define ABILITY_ZEN_MODE 162 +#define ABILITY_VICTORY_STAR 163 +#define ABILITY_TURBOBLAZE 164 +#define ABILITY_TERAVOLT 165 + +#define ABILITIES_COUNT_GEN5 166 + +// Gen6 abilities. +#define ABILITY_AROMA_VEIL 166 +#define ABILITY_FLOWER_VEIL 167 +#define ABILITY_CHEEK_POUCH 168 +#define ABILITY_PROTEAN 169 +#define ABILITY_FUR_COAT 170 +#define ABILITY_MAGICIAN 171 +#define ABILITY_BULLETPROOF 172 +#define ABILITY_COMPETITIVE 173 +#define ABILITY_STRONG_JAW 174 +#define ABILITY_REFRIGERATE 175 +#define ABILITY_SWEET_VEIL 176 +#define ABILITY_STANCE_CHANGE 177 +#define ABILITY_GALE_WINGS 178 +#define ABILITY_MEGA_LAUNCHER 179 +#define ABILITY_GRASS_PELT 180 +#define ABILITY_SYMBIOSIS 181 +#define ABILITY_TOUGH_CLAWS 182 +#define ABILITY_PIXILATE 183 +#define ABILITY_GOOEY 184 +#define ABILITY_AERILATE 185 +#define ABILITY_PARENTAL_BOND 186 +#define ABILITY_DARK_AURA 187 +#define ABILITY_FAIRY_AURA 188 +#define ABILITY_AURA_BREAK 189 +#define ABILITY_PRIMORDIAL_SEA 190 +#define ABILITY_DESOLATE_LAND 191 +#define ABILITY_DELTA_STREAM 192 + +#define ABILITIES_COUNT_GEN6 193 + +// Gen7 abilities. +#define ABILITY_STAMINA 193 +#define ABILITY_WIMP_OUT 194 +#define ABILITY_EMERGENCY_EXIT 195 +#define ABILITY_WATER_COMPACTION 196 +#define ABILITY_MERCILESS 197 +#define ABILITY_SHIELDS_DOWN 198 +#define ABILITY_STAKEOUT 199 +#define ABILITY_WATER_BUBBLE 200 +#define ABILITY_STEELWORKER 201 +#define ABILITY_BERSERK 202 +#define ABILITY_SLUSH_RUSH 203 +#define ABILITY_LONG_REACH 204 +#define ABILITY_LIQUID_VOICE 205 +#define ABILITY_TRIAGE 206 +#define ABILITY_GALVANIZE 207 +#define ABILITY_SURGE_SURFER 208 +#define ABILITY_SCHOOLING 209 +#define ABILITY_DISGUISE 210 +#define ABILITY_BATTLE_BOND 211 +#define ABILITY_POWER_CONSTRUCT 212 +#define ABILITY_CORROSION 213 +#define ABILITY_COMATOSE 214 +#define ABILITY_QUEENLY_MAJESTY 215 +#define ABILITY_INNARDS_OUT 216 +#define ABILITY_DANCER 217 +#define ABILITY_BATTERY 218 +#define ABILITY_FLUFFY 219 +#define ABILITY_DAZZLING 220 +#define ABILITY_SOUL_HEART 221 +#define ABILITY_TANGLING_HAIR 222 +#define ABILITY_RECEIVER 223 +#define ABILITY_POWER_OF_ALCHEMY 224 +#define ABILITY_BEAST_BOOST 225 +#define ABILITY_RKS_SYSTEM 226 +#define ABILITY_ELECTRIC_SURGE 227 +#define ABILITY_PSYCHIC_SURGE 228 +#define ABILITY_MISTY_SURGE 229 +#define ABILITY_GRASSY_SURGE 230 +#define ABILITY_FULL_METAL_BODY 231 +#define ABILITY_SHADOW_SHIELD 232 +#define ABILITY_PRISM_ARMOR 233 +#define ABILITY_NEUROFORCE 234 + +#define ABILITIES_COUNT_GEN7 235 + +#define ABILITIES_COUNT ABILITIES_COUNT_GEN7 #endif // GUARD_CONSTANTS_ABILITIES_H diff --git a/include/constants/battle.h b/include/constants/battle.h index fa8f422c4b..2c573dcbed 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -79,6 +79,9 @@ #define BATTLE_TYPE_FRONTIER (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_DOME | BATTLE_TYPE_PALACE | BATTLE_TYPE_ARENA | BATTLE_TYPE_FACTORY | BATTLE_TYPE_PIKE | BATTLE_TYPE_PYRAMID) #define BATTLE_TYPE_FRONTIER_NO_PYRAMID (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_DOME | BATTLE_TYPE_PALACE | BATTLE_TYPE_ARENA | BATTLE_TYPE_FACTORY | BATTLE_TYPE_PIKE) +#define WILD_DOUBLE_BATTLE ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER)))) +#define BATTLE_TWO_VS_ONE_OPPONENT ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gTrainerBattleOpponent_B == 0xFFFF)) + // Battle Outcome defines #define B_OUTCOME_WON 1 #define B_OUTCOME_LOST 2 @@ -120,8 +123,8 @@ #define STATUS2_LOCK_CONFUSE (1 << 10 | 1 << 11) // e.g. Thrash #define STATUS2_LOCK_CONFUSE_TURN(num)((num) << 10) #define STATUS2_MULTIPLETURNS (1 << 12) -#define STATUS2_WRAPPED (1 << 13 | 1 << 14 | 1 << 15) -#define STATUS2_WRAPPED_TURN(num) ((num) << 13) +#define STATUS2_WRAPPED (1 << 13) +#define STATUS2_POWDER (1 << 14) #define STATUS2_INFATUATION (1 << 16 | 1 << 17 | 1 << 18 | 1 << 19) // 4 bits, one for every battler #define STATUS2_INFATUATED_WITH(battler) (gBitTable[battler] << 16) #define STATUS2_FOCUS_ENERGY (1 << 20) @@ -137,7 +140,6 @@ #define STATUS2_DEFENSE_CURL (1 << 30) #define STATUS2_TORMENT (1 << 31) -// Seems like per-battler statuses. Not quite sure how to categorize these #define STATUS3_LEECHSEED_BATTLER (1 << 0 | 1 << 1) // The battler to receive HP from Leech Seed #define STATUS3_LEECHSEED (1 << 2) #define STATUS3_ALWAYS_HITS (1 << 3 | 1 << 4) @@ -153,14 +155,24 @@ #define STATUS3_IMPRISONED_OTHERS (1 << 13) #define STATUS3_GRUDGE (1 << 14) #define STATUS3_CANT_SCORE_A_CRIT (1 << 15) -#define STATUS3_MUDSPORT (1 << 16) -#define STATUS3_WATERSPORT (1 << 17) +#define STATUS3_GASTRO_ACID (1 << 16) +#define STATUS3_EMBARGO (1 << 17) #define STATUS3_UNDERWATER (1 << 18) #define STATUS3_INTIMIDATE_POKES (1 << 19) #define STATUS3_TRACE (1 << 20) -#define STATUS3_SEMI_INVULNERABLE (STATUS3_UNDERGROUND | STATUS3_ON_AIR | STATUS3_UNDERWATER) +#define STATUS3_SMACKED_DOWN (1 << 21) +#define STATUS3_ME_FIRST (1 << 22) +#define STATUS3_TELEKINESIS (1 << 23) +#define STATUS3_PHANTOM_FORCE (1 << 24) +#define STATUS3_MIRACLE_EYED (1 << 25) +#define STATUS3_MAGNET_RISE (1 << 26) +#define STATUS3_HEAL_BLOCK (1 << 27) +#define STATUS3_AQUA_RING (1 << 28) +#define STATUS3_LASER_FOCUS (1 << 29) +#define STATUS3_ELECTRIFIED (1 << 30) +#define STATUS3_POWER_TRICK (1 << 31) +#define STATUS3_SEMI_INVULNERABLE (STATUS3_UNDERGROUND | STATUS3_ON_AIR | STATUS3_UNDERWATER | STATUS3_PHANTOM_FORCE) -// Not really sure what a "hitmarker" is. #define HITMARKER_x10 (1 << 4) #define HITMARKER_x20 (1 << 5) #define HITMARKER_DESTINYBOND (1 << 6) @@ -173,9 +185,7 @@ #define HITMARKER_IGNORE_SAFEGUARD (1 << 13) #define HITMARKER_SYNCHRONISE_EFFECT (1 << 14) #define HITMARKER_RUN (1 << 15) -#define HITMARKER_IGNORE_ON_AIR (1 << 16) -#define HITMARKER_IGNORE_UNDERGROUND (1 << 17) -#define HITMARKER_IGNORE_UNDERWATER (1 << 18) +// 3 free spots because of change in handling of UNDERGROUND/UNDERGWATER/ON AIR #define HITMARKER_UNABLE_TO_USE_MOVE (1 << 19) #define HITMARKER_x100000 (1 << 20) #define HITMARKER_x200000 (1 << 21) @@ -189,14 +199,40 @@ #define HITMARKER_FAINTED2(battler) ((1 << 28) << battler) // Per-side statuses that affect an entire party -#define SIDE_STATUS_REFLECT (1 << 0) -#define SIDE_STATUS_LIGHTSCREEN (1 << 1) -#define SIDE_STATUS_X4 (1 << 2) -#define SIDE_STATUS_SPIKES (1 << 4) -#define SIDE_STATUS_SAFEGUARD (1 << 5) -#define SIDE_STATUS_FUTUREATTACK (1 << 6) -#define SIDE_STATUS_MIST (1 << 8) -#define SIDE_STATUS_SPIKES_DAMAGED (1 << 9) +#define SIDE_STATUS_REFLECT (1 << 0) +#define SIDE_STATUS_LIGHTSCREEN (1 << 1) +#define SIDE_STATUS_STICKY_WEB (1 << 2) +#define SIDE_STATUS_SPIKES (1 << 4) +#define SIDE_STATUS_SAFEGUARD (1 << 5) +#define SIDE_STATUS_FUTUREATTACK (1 << 6) +#define SIDE_STATUS_MIST (1 << 8) +#define SIDE_STATUS_SPIKES_DAMAGED (1 << 9) +#define SIDE_STATUS_TAILWIND (1 << 10) +#define SIDE_STATUS_AURORA_VEIL (1 << 11) +#define SIDE_STATUS_LUCKY_CHANT (1 << 12) +#define SIDE_STATUS_TOXIC_SPIKES (1 << 13) +#define SIDE_STATUS_STEALTH_ROCK (1 << 14) +#define SIDE_STATUS_STEALTH_ROCK_DAMAGED (1 << 15) +#define SIDE_STATUS_TOXIC_SPIKES_DAMAGED (1 << 16) +#define SIDE_STATUS_STICKY_WEB_DAMAGED (1 << 17) +#define SIDE_STATUS_QUICK_GUARD (1 << 18) +#define SIDE_STATUS_WIDE_GUARD (1 << 19) +#define SIDE_STATUS_CRAFTY_SHIELD (1 << 20) +#define SIDE_STATUS_MAT_BLOCK (1 << 21) + +// Field affecting statuses. +#define STATUS_FIELD_MAGIC_ROOM 0x1 +#define STATUS_FIELD_TRICK_ROOM 0x2 +#define STATUS_FIELD_WONDER_ROOM 0x4 +#define STATUS_FIELD_MUDSPORT 0x8 +#define STATUS_FIELD_WATERSPORT 0x10 +#define STATUS_FIELD_GRAVITY 0x20 +#define STATUS_FIELD_GRASSY_TERRAIN 0x40 +#define STATUS_FIELD_MISTY_TERRAIN 0x80 +#define STATUS_FIELD_ELECTRIC_TERRAIN 0x100 +#define STATUS_FIELD_PSYCHIC_TERRAIN 0x200 +#define STATUS_FIELD_ION_DELUGE 0x400 +#define STATUS_FIELD_FAIRY_LOCK 0x800 // Flags describing move's result #define MOVE_RESULT_MISSED (1 << 0) @@ -207,6 +243,7 @@ #define MOVE_RESULT_FAILED (1 << 5) #define MOVE_RESULT_FOE_ENDURED (1 << 6) #define MOVE_RESULT_FOE_HUNG_ON (1 << 7) +#define MOVE_RESULT_STURDIED (1 << 8) #define MOVE_RESULT_NO_EFFECT (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED) // Battle Weather flags @@ -220,75 +257,93 @@ #define WEATHER_SUN_TEMPORARY (1 << 5) #define WEATHER_SUN_PERMANENT (1 << 6) #define WEATHER_SUN_ANY (WEATHER_SUN_TEMPORARY | WEATHER_SUN_PERMANENT) -#define WEATHER_HAIL (1 << 7) -#define WEATHER_HAIL_ANY (WEATHER_HAIL) +#define WEATHER_HAIL_TEMPORARY (1 << 7) +#define WEATHER_HAIL_PERMANENT (1 << 8) +#define WEATHER_HAIL_ANY (WEATHER_HAIL_TEMPORARY | WEATHER_HAIL_PERMANENT) #define WEATHER_ANY (WEATHER_RAIN_ANY | WEATHER_SANDSTORM_ANY | WEATHER_SUN_ANY | WEATHER_HAIL_ANY) -// Move Effects -#define MOVE_EFFECT_SLEEP 1 -#define MOVE_EFFECT_POISON 2 -#define MOVE_EFFECT_BURN 3 -#define MOVE_EFFECT_FREEZE 4 -#define MOVE_EFFECT_PARALYSIS 5 -#define MOVE_EFFECT_TOXIC 6 -#define PRIMARY_STATUS_MOVE_EFFECT MOVE_EFFECT_TOXIC // All above move effects apply primary status -#define MOVE_EFFECT_CONFUSION 7 -#define MOVE_EFFECT_FLINCH 8 -#define MOVE_EFFECT_TRI_ATTACK 9 -#define MOVE_EFFECT_UPROAR 10 -#define MOVE_EFFECT_PAYDAY 11 -#define MOVE_EFFECT_CHARGING 12 -#define MOVE_EFFECT_WRAP 13 -#define MOVE_EFFECT_RECOIL_25 14 -#define MOVE_EFFECT_ATK_PLUS_1 15 -#define MOVE_EFFECT_DEF_PLUS_1 16 -#define MOVE_EFFECT_SPD_PLUS_1 17 -#define MOVE_EFFECT_SP_ATK_PLUS_1 18 -#define MOVE_EFFECT_SP_DEF_PLUS_1 19 -#define MOVE_EFFECT_ACC_PLUS_1 20 -#define MOVE_EFFECT_EVS_PLUS_1 21 -#define MOVE_EFFECT_ATK_MINUS_1 22 -#define MOVE_EFFECT_DEF_MINUS_1 23 -#define MOVE_EFFECT_SPD_MINUS_1 24 -#define MOVE_EFFECT_SP_ATK_MINUS_1 25 -#define MOVE_EFFECT_SP_DEF_MINUS_1 26 -#define MOVE_EFFECT_ACC_MINUS_1 27 -#define MOVE_EFFECT_EVS_MINUS_1 28 -#define MOVE_EFFECT_RECHARGE 29 -#define MOVE_EFFECT_RAGE 30 -#define MOVE_EFFECT_STEAL_ITEM 31 -#define MOVE_EFFECT_PREVENT_ESCAPE 32 -#define MOVE_EFFECT_NIGHTMARE 33 -#define MOVE_EFFECT_ALL_STATS_UP 34 -#define MOVE_EFFECT_RAPIDSPIN 35 -#define MOVE_EFFECT_REMOVE_PARALYSIS 36 -#define MOVE_EFFECT_ATK_DEF_DOWN 37 -#define MOVE_EFFECT_RECOIL_33 38 -#define MOVE_EFFECT_ATK_PLUS_2 39 -#define MOVE_EFFECT_DEF_PLUS_2 40 -#define MOVE_EFFECT_SPD_PLUS_2 41 -#define MOVE_EFFECT_SP_ATK_PLUS_2 42 -#define MOVE_EFFECT_SP_DEF_PLUS_2 43 -#define MOVE_EFFECT_ACC_PLUS_2 44 -#define MOVE_EFFECT_EVS_PLUS_2 45 -#define MOVE_EFFECT_ATK_MINUS_2 46 -#define MOVE_EFFECT_DEF_MINUS_2 47 -#define MOVE_EFFECT_SPD_MINUS_2 48 -#define MOVE_EFFECT_SP_ATK_MINUS_2 49 -#define MOVE_EFFECT_SP_DEF_MINUS_2 50 -#define MOVE_EFFECT_ACC_MINUS_2 51 -#define MOVE_EFFECT_EVS_MINUS_2 52 -#define MOVE_EFFECT_THRASH 53 -#define MOVE_EFFECT_KNOCK_OFF 54 -#define MOVE_EFFECT_NOTHING_37 55 -#define MOVE_EFFECT_NOTHING_38 56 -#define MOVE_EFFECT_NOTHING_39 57 -#define MOVE_EFFECT_NOTHING_3A 58 -#define MOVE_EFFECT_SP_ATK_TWO_DOWN 59 -#define NUM_MOVE_EFFECTS 60 +// Battle Weather as enum +#define ENUM_WEATHER_NONE 0 +#define ENUM_WEATHER_RAIN 1 +#define ENUM_WEATHER_SUN 2 +#define ENUM_WEATHER_SANDSTORM 3 +#define ENUM_WEATHER_HAIL 4 -#define MOVE_EFFECT_AFFECTS_USER (1 << 6) // 64 -#define MOVE_EFFECT_CERTAIN (1 << 7) // 128 +// Move Effects +#define MOVE_EFFECT_SLEEP 0x1 +#define MOVE_EFFECT_POISON 0x2 +#define MOVE_EFFECT_BURN 0x3 +#define MOVE_EFFECT_FREEZE 0x4 +#define MOVE_EFFECT_PARALYSIS 0x5 +#define MOVE_EFFECT_TOXIC 0x6 +#define PRIMARY_STATUS_MOVE_EFFECT MOVE_EFFECT_TOXIC // All above move effects apply primary status +#define MOVE_EFFECT_CONFUSION 0x7 +#define MOVE_EFFECT_FLINCH 0x8 +#define MOVE_EFFECT_TRI_ATTACK 0x9 +#define MOVE_EFFECT_UPROAR 0xA +#define MOVE_EFFECT_PAYDAY 0xB +#define MOVE_EFFECT_CHARGING 0xC +#define MOVE_EFFECT_WRAP 0xD +#define MOVE_EFFECT_RECOIL_25 0xE +#define MOVE_EFFECT_ATK_PLUS_1 0xF +#define MOVE_EFFECT_DEF_PLUS_1 0x10 +#define MOVE_EFFECT_SPD_PLUS_1 0x11 +#define MOVE_EFFECT_SP_ATK_PLUS_1 0x12 +#define MOVE_EFFECT_SP_DEF_PLUS_1 0x13 +#define MOVE_EFFECT_ACC_PLUS_1 0x14 +#define MOVE_EFFECT_EVS_PLUS_1 0x15 +#define MOVE_EFFECT_ATK_MINUS_1 0x16 +#define MOVE_EFFECT_DEF_MINUS_1 0x17 +#define MOVE_EFFECT_SPD_MINUS_1 0x18 +#define MOVE_EFFECT_SP_ATK_MINUS_1 0x19 +#define MOVE_EFFECT_SP_DEF_MINUS_1 0x1A +#define MOVE_EFFECT_ACC_MINUS_1 0x1B +#define MOVE_EFFECT_EVS_MINUS_1 0x1C +#define MOVE_EFFECT_RECHARGE 0x1D +#define MOVE_EFFECT_RAGE 0x1E +#define MOVE_EFFECT_STEAL_ITEM 0x1F +#define MOVE_EFFECT_PREVENT_ESCAPE 0x20 +#define MOVE_EFFECT_NIGHTMARE 0x21 +#define MOVE_EFFECT_ALL_STATS_UP 0x22 +#define MOVE_EFFECT_RAPIDSPIN 0x23 +#define MOVE_EFFECT_REMOVE_STATUS 0x24 +#define MOVE_EFFECT_ATK_DEF_DOWN 0x25 +#define MOVE_EFFECT_RECOIL_33 0x26 +#define MOVE_EFFECT_ATK_PLUS_2 0x27 +#define MOVE_EFFECT_DEF_PLUS_2 0x28 +#define MOVE_EFFECT_SPD_PLUS_2 0x29 +#define MOVE_EFFECT_SP_ATK_PLUS_2 0x2A +#define MOVE_EFFECT_SP_DEF_PLUS_2 0x2B +#define MOVE_EFFECT_ACC_PLUS_2 0x2C +#define MOVE_EFFECT_EVS_PLUS_2 0x2D +#define MOVE_EFFECT_ATK_MINUS_2 0x2E +#define MOVE_EFFECT_DEF_MINUS_2 0x2F +#define MOVE_EFFECT_SPD_MINUS_2 0x30 +#define MOVE_EFFECT_SP_ATK_MINUS_2 0x31 +#define MOVE_EFFECT_SP_DEF_MINUS_2 0x32 +#define MOVE_EFFECT_ACC_MINUS_2 0x33 +#define MOVE_EFFECT_EVS_MINUS_2 0x34 +#define MOVE_EFFECT_THRASH 0x35 +#define MOVE_EFFECT_KNOCK_OFF 0x36 +#define MOVE_EFFECT_DEF_SPDEF_DOWN 0x37 +#define MOVE_EFFECT_RECOIL_33_STATUS 0x38 +#define MOVE_EFFECT_RECOIL_50 0x39 +#define MOVE_EFFECT_CLEAR_SMOG 0x3A +#define MOVE_EFFECT_SP_ATK_TWO_DOWN 0x3B +#define MOVE_EFFECT_SMACK_DOWN 0x3C +#define MOVE_EFFECT_FLAME_BURST 0x3D +#define MOVE_EFFECT_FEINT 0x3E +#define MOVE_EFFECT_SPECTRAL_THIEF 0x3F +#define MOVE_EFFECT_V_CREATE 0x40 +#define MOVE_EFFECT_HAPPY_HOUR 0x41 +#define MOVE_EFFECT_CORE_ENFORCER 0x42 +#define MOVE_EFFECT_THROAT_CHOP 0x43 +#define MOVE_EFFECT_INCINERATE 0x44 +#define MOVE_EFFECT_BUG_BITE 0x45 +#define NUM_MOVE_EFFECTS 0x46 + +#define MOVE_EFFECT_AFFECTS_USER 0x4000 +#define MOVE_EFFECT_CERTAIN 0x8000 // Battle terrain defines for gBattleTerrain. #define BATTLE_TERRAIN_GRASS 0 @@ -302,4 +357,15 @@ #define BATTLE_TERRAIN_BUILDING 8 #define BATTLE_TERRAIN_PLAIN 9 +// Move targets +#define MOVE_TARGET_SELECTED 0x0 +#define MOVE_TARGET_DEPENDS 0x1 +#define MOVE_TARGET_USER_OR_SELECTED 0x2 +#define MOVE_TARGET_RANDOM 0x4 +#define MOVE_TARGET_BOTH 0x8 +#define MOVE_TARGET_USER 0x10 +#define MOVE_TARGET_FOES_AND_ALLY 0x20 +#define MOVE_TARGET_OPPONENTS_FIELD 0x40 +#define MOVE_TARGET_ALLY 0x80 + #endif // GUARD_CONSTANTS_BATTLE_H diff --git a/include/constants/battle_ai.h b/include/constants/battle_ai.h index 4c3a45dc6c..974ef2b770 100644 --- a/include/constants/battle_ai.h +++ b/include/constants/battle_ai.h @@ -23,15 +23,17 @@ #define AI_EFFECTIVENESS_x0 0 // ai weather -#define AI_WEATHER_SUN 0 -#define AI_WEATHER_RAIN 1 -#define AI_WEATHER_SANDSTORM 2 -#define AI_WEATHER_HAIL 3 +#define AI_WEATHER_NONE 0 +#define AI_WEATHER_SUN 1 +#define AI_WEATHER_RAIN 2 +#define AI_WEATHER_SANDSTORM 3 +#define AI_WEATHER_HAIL 4 // get_how_powerful_move_is #define MOVE_POWER_DISCOURAGED 0 -#define MOVE_NOT_MOST_POWERFUL 1 -#define MOVE_MOST_POWERFUL 2 +#define MOVE_POWER_BEST 1 +#define MOVE_POWER_GOOD 2 // Similar dmg range with best. +#define MOVE_POWER_WEAK 3 // Significantly lower than best and good. // script's table id to bit #define AI_SCRIPT_CHECK_BAD_MOVE (1 << 0) diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index ebc422b18e..871aa1e351 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -296,6 +296,101 @@ #define ANIM_TAG_SLASH_2 (ANIM_SPRITES_START + 286) #define ANIM_TAG_WHIP_HIT (ANIM_SPRITES_START + 287) #define ANIM_TAG_BLUE_RING_2 (ANIM_SPRITES_START + 288) +//new particles +#define ANIM_TAG_WHITE_STREAK (ANIM_SPRITES_START + 289) +#define ANIM_TAG_PURPLE_JAB (ANIM_SPRITES_START + 290) +#define ANIM_TAG_TOXIC_SPIKES (ANIM_SPRITES_START + 291) +#define ANIM_TAG_ENERGY_BALL (ANIM_SPRITES_START + 292) +#define ANIM_TAG_SEED_BROWN (ANIM_SPRITES_START + 293) +#define ANIM_TAG_FEINT (ANIM_SPRITES_START + 294) +#define ANIM_TAG_MEGA_STONE (ANIM_SPRITES_START + 295) +#define ANIM_TAG_MEGA_SYMBOL (ANIM_SPRITES_START + 296) +#define ANIM_TAG_MEGA_PARTICLES (ANIM_SPRITES_START + 297) +#define ANIM_TAG_TRUMP_CARD (ANIM_SPRITES_START + 298) +#define ANIM_TAG_TRUMP_CARD_PARTICLES (ANIM_SPRITES_START + 299) +#define ANIM_TAG_ACCUPRESSURE (ANIM_SPRITES_START + 300) +#define ANIM_TAG_WRING_OUT (ANIM_SPRITES_START + 301) +#define ANIM_TAG_COLORED_ORBS (ANIM_SPRITES_START + 302) +#define ANIM_TAG_WORRY_SEED (ANIM_SPRITES_START + 303) +#define ANIM_TAG_SMALL_CLOUD (ANIM_SPRITES_START + 304) +#define ANIM_TAG_ATTACK_ORDER (ANIM_SPRITES_START + 305) +#define ANIM_TAG_DRAGON_PULSE (ANIM_SPRITES_START + 306) +#define ANIM_TAG_WOOD_HAMMER (ANIM_SPRITES_START + 307) +#define ANIM_TAG_PSYCHO_CUT (ANIM_SPRITES_START + 308) +#define ANIM_TAG_POWER_GEM (ANIM_SPRITES_START + 309) +#define ANIM_TAG_STONE_EDGE (ANIM_SPRITES_START + 310) +#define ANIM_TAG_STEALTH_ROCK (ANIM_SPRITES_START + 311) +#define ANIM_TAG_POISON_JAB (ANIM_SPRITES_START + 312) +#define ANIM_TAG_GREEN_POISON_BUBBLE (ANIM_SPRITES_START + 313) +#define ANIM_TAG_FLASH_CANNON_BALL (ANIM_SPRITES_START + 314) +#define ANIM_TAG_WATER_GUN (ANIM_SPRITES_START + 315) +#define ANIM_TAG_PUNISHMENT_BLADES (ANIM_SPRITES_START + 316) +#define ANIM_TAG_QUICK_GUARD_HAND (ANIM_SPRITES_START + 317) + +#define ANIM_TAG_SHELL_RIGHT (ANIM_SPRITES_START + 318) +#define ANIM_TAG_SHELL_LEFT (ANIM_SPRITES_START + 319) +#define ANIM_TAG_RAZOR_SHELL (ANIM_SPRITES_START + 320) +#define ANIM_TAG_HYDRO_PUMP (ANIM_SPRITES_START + 321) +#define ANIM_TAG_BRINE (ANIM_SPRITES_START + 322) +#define ANIM_TAG_GEAR (ANIM_SPRITES_START + 323) +#define ANIM_TAG_ASSURANCE_HAND (ANIM_SPRITES_START + 324) +#define ANIM_TAG_ACUPRESSURE_FINGER (ANIM_SPRITES_START + 325) +#define ANIM_TAG_WISHIWASHI_FISH (ANIM_SPRITES_START + 326) +#define ANIM_TAG_ZYGARDE_HEXES (ANIM_SPRITES_START + 327) +#define ANIM_TAG_AURA_SPHERE (ANIM_SPRITES_START + 328) +#define ANIM_TAG_OMEGA_STONE (ANIM_SPRITES_START + 329) +#define ANIM_TAG_ALPHA_STONE (ANIM_SPRITES_START + 330) +#define ANIM_TAG_BERRY_NORMAL (ANIM_SPRITES_START + 331) +#define ANIM_TAG_BERRY_EATEN (ANIM_SPRITES_START + 332) +#define ANIM_TAG_DRAGON_ASCENT (ANIM_SPRITES_START + 333) +#define ANIM_TAG_PINK_DIAMOND (ANIM_SPRITES_START + 334) +#define ANIM_TAG_STEAM_ERUPTION (ANIM_SPRITES_START + 335) +#define ANIM_TAG_CONFIDE (ANIM_SPRITES_START + 336) +#define ANIM_TAG_VERTICAL_HEX (ANIM_SPRITES_START + 337) +#define ANIM_TAG_UNAVAILABLE_1 (ANIM_SPRITES_START + 338) //0x2862.. supposedly used elsewhere? +#define ANIM_TAG_UNAVAILABLE_2 (ANIM_SPRITES_START + 339) +#define ANIM_TAG_POWER_TRICK (ANIM_SPRITES_START + 340) +#define ANIM_TAG_CHAIN_LINK (ANIM_SPRITES_START + 341) +#define ANIM_TAG_ANCHOR (ANIM_SPRITES_START + 342) +#define ANIM_TAG_HORSESHOE_SIDE_FIST (ANIM_SPRITES_START + 343) +#define ANIM_TAG_DRAGON_ASCENT_FOE (ANIM_SPRITES_START + 344) +#define ANIM_TAG_CRAFTY_SHIELD (ANIM_SPRITES_START + 345) +#define ANIM_TAG_BLACEPHALON_HEAD (ANIM_SPRITES_START + 346) +#define ANIM_TAG_FAIRY_LOCK_CHAINS (ANIM_SPRITES_START + 347) +#define ANIM_TAG_IONS (ANIM_SPRITES_START + 348) +#define ANIM_TAG_CHOP (ANIM_SPRITES_START + 349) +#define ANIM_TAG_HEART_STAMP (ANIM_SPRITES_START + 350) +#define ANIM_TAG_HORN_LEECH (ANIM_SPRITES_START + 351) +#define ANIM_TAG_STEAMROLLER (ANIM_SPRITES_START + 352) +#define ANIM_TAG_HOOPA_HAND (ANIM_SPRITES_START + 353) +#define ANIM_TAG_HOOPA_RING (ANIM_SPRITES_START + 354) +#define ANIM_TAG_METAL_BITS (ANIM_SPRITES_START + 355) +#define ANIM_TAG_SMALL_ROCK (ANIM_SPRITES_START + 356) +#define ANIM_TAG_SPIRIT_ARROW (ANIM_SPRITES_START + 357) +#define ANIM_TAG_ULTRA_BURST_SYMBOL (ANIM_SPRITES_START + 358) +#define ANIM_TAG_Z_MOVE_SYMBOL (ANIM_SPRITES_START + 359) +#define ANIM_TAG_REALLY_BIG_ROCK (ANIM_SPRITES_START + 360) +#define ANIM_TAG_COCOON (ANIM_SPRITES_START + 361) +#define ANIM_TAG_CORKSCREW (ANIM_SPRITES_START + 362) +#define ANIM_TAG_HAVOC_SPEAR (ANIM_SPRITES_START + 363) +#define ANIM_TAG_PURPLE_DRAKE (ANIM_SPRITES_START + 364) +#define ANIM_TAG_MUD_BOMB (ANIM_SPRITES_START + 365) +#define ANIM_TAG_BRANCH (ANIM_SPRITES_START + 366) +#define ANIM_TAG_APPLE (ANIM_SPRITES_START + 367) +#define ANIM_TAG_OBSTRUCT_CROSS (ANIM_SPRITES_START + 368) +#define ANIM_TAG_POISON_COLUMN (ANIM_SPRITES_START + 369) +#define ANIM_TAG_GARBAGE_COLUMN (ANIM_SPRITES_START + 370) +#define ANIM_TAG_LARGE_SPIKE (ANIM_SPRITES_START + 371) +#define ANIM_TAG_DRAGON_PULSE_RING (ANIM_SPRITES_START + 372) +#define ANIM_TAG_STONE_PILLAR (ANIM_SPRITES_START + 373) +#define ANIM_TAG_MUSHROOM (ANIM_SPRITES_START + 374) +#define ANIM_TAG_GOLDEN_APPLE (ANIM_SPRITES_START + 375) +#define ANIM_TAG_ICE_ROCK (ANIM_SPRITES_START + 376) +#define ANIM_TAG_TORNADO (ANIM_SPRITES_START + 377) +#define ANIM_TAG_STRAIGHT_BEAM (ANIM_SPRITES_START + 378) +#define ANIM_TAG_DREEPY (ANIM_SPRITES_START + 379) +#define ANIM_TAG_ICE_ROCK_SINGLE (ANIM_SPRITES_START + 380) +#define ANIM_TAG_STONE_PILLAR_MULTI (ANIM_SPRITES_START + 381) // battlers #define ANIM_ATTACKER 0 @@ -345,6 +440,58 @@ #define BG_SOLARBEAM_OPPONENT 24 #define BG_SOLARBEAM_PLAYER 25 #define BG_SOLARBEAM_CONTESTS 26 +#define BG_MAGMA_STORM 27 +#define BG_GIGA_IMPACT_OPPONENT 28 +#define BG_GIGA_IMPACT_PLAYER 29 +#define BG_GIGA_IMPACT_CONTEST 30 +#define BG_TRICK_ROOM 31 +#define BG_ROCK_WRECKER 32 +#define BG_SPACIAL_REND_ON_OPPONENT 33 +#define BG_SPACIAL_REND_ON_PLAYER 34 +#define BG_DARK_VOID 35 + +#define BG_WATER 36 +#define BG_NIGHTMARE 37 +#define BG_LEAF_STORM 38 +#define BG_FIRE 39 +#define BG_FIRE_2 40 +#define BG_WATER_2 41 +#define BG_POISON 42 +#define BG_AEROBLAST 43 +#define BG_HIGH_SPEED 44 //hurricane, close combat +#define BG_ELECTRIC_TERRAIN 45 +#define BG_GRASSY_TERRAIN 46 +#define BG_MISTY_TERRAIN 47 +#define BG_PSYCHIC_TERRAIN 48 +#define BG_FOCUS_BLAST 49 +#define BG_GUNK_SHOT 50 +#define BG_HYDRO_CANNON 51 +#define BG_WONDER_ROOM 52 +#define BG_MAGIC_ROOM 53 +#define BG_HYPERSPACE_FURY 54 +#define BG_BOLT_STRIKE 55 +#define BG_ZMOVE_ACTIVATE 56 +#define BG_TECTONIC_RAGE 57 +#define BG_BLUE_SKY_DAY 58 +#define BG_BLUE_SKY_AFTERNOON 59 +#define BG_BLUE_SKY_NIGHT 60 +#define BG_ZMOVE_MOUNTAIN 61 +#define BG_NEVERENDING_NIGHTMARE 62 +#define BG_WATER_PULSE 63 +#define BG_INFERNO_OVERDRIVE 64 +#define BG_BLOOM_DOOM 65 +#define BG_SHATTERED_PSYCHE 66 +#define BG_TWINKLE_TACKLE 67 +#define BG_BLACKHOLE_ECLIPSE 68 +#define BG_SOULSTEALING_7STAR_STRIKE 69 +#define BG_MALICIOUS_MOONSAULT 70 +#define BG_CLANGOROUS_SOULBLAZE 71 +#define BG_SNUGGLE_FOREVER 72 +#define BG_MAX_LIGHTNING 73 +#define BG_GARBAGE_FALLS 74 +#define BG_HYPER_BEAM 75 +#define BG_DYNAMAX_CANNON 76 +#define BG_AURA_SPHERE 77 // table ids for general animations #define B_ANIM_CASTFORM_CHANGE 0x0 @@ -356,7 +503,7 @@ #define B_ANIM_TURN_TRAP 0x6 #define B_ANIM_HELD_ITEM_EFFECT 0x7 #define B_ANIM_SMOKEBALL_ESCAPE 0x8 -#define B_ANIM_FOCUS_BAND 0x9 +#define B_ANIM_HANGED_ON 0x9 #define B_ANIM_RAIN_CONTINUES 0xA #define B_ANIM_SUN_CONTINUES 0xB #define B_ANIM_SANDSTORM_CONTINUES 0xC @@ -370,6 +517,14 @@ #define B_ANIM_FOCUS_PUNCH_SETUP 0x14 #define B_ANIM_INGRAIN_HEAL 0x15 #define B_ANIM_WISH_HEAL 0x16 +#define B_ANIM_MEGA_EVOLUTION 0x17 +#define B_ANIM_TERRAIN_MISTY 0x18 +#define B_ANIM_TERRAIN_GRASSY 0x19 +#define B_ANIM_TERRAIN_ELECTRIC 0x1A +#define B_ANIM_TERRAIN_PSYCHIC 0x1B +#define B_ANIM_ILLUSION_OFF 0x1C +#define B_ANIM_FORM_CHANGE 0x1D +#define B_ANIM_SLIDE_OFFSCREEN 0x1E // for Emergency Exit // special animations table #define B_ANIM_LVL_UP 0x0 @@ -379,6 +534,7 @@ #define B_ANIM_BALL_THROW_WITH_TRAINER 0x4 #define B_ANIM_SUBSTITUTE_TO_MON 0x5 #define B_ANIM_MON_TO_SUBSTITUTE 0x6 +#define B_ANIM_CRITICAL_CAPTURE_THROW 0x7 // status animation table #define B_ANIM_STATUS_PSN 0x0 @@ -438,5 +594,29 @@ #define BACK_ANIM_FADE_GREEN_WITH_SHAKE 0x18 #define BACK_ANIM_FADE_BLUE_WITH_SHAKE 0x19 +// mon pal blend +#define ANIM_PAL_BG 0x1 +#define ANIM_PAL_ATK 0x2 +#define ANIM_PAL_DEF 0x4 +#define ANIM_PAL_ATK_PARTNER 0x8 +#define ANIM_PAL_DEF_PARTNER 0x10 +#define ANIM_PAL_ALL 0x1f +#define ANIM_PAL_BG_4 0x20 +#define ANIM_PAL_BG_5 0x40 +#define ANIM_PAL_ALL_BATTLERS 0x780 +#define ANIM_PAL_PLAYER1 0x80 +#define ANIM_PAL_PLAYER2 0x100 +#define ANIM_PAL_OPPONENT1 0x200 +#define ANIM_PAL_OPPONENT2 0x400 + +// horseshoe/fist frames +#define ANIM_RIGHT_FIST 0 +#define ANIM_LEFT_FIST 2 + +// surf wave palettes +#define ANIM_SURF_PAL_SURF 0 +#define ANIM_SURF_PAL_MUDDY_WATER 1 +#define ANIM_SURF_PAL_SLUDGE_WAVE 2 + #endif // GUARD_CONSTANTS_BATTLE_ANIM_H diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h new file mode 100644 index 0000000000..73f528b2d9 --- /dev/null +++ b/include/constants/battle_config.h @@ -0,0 +1,125 @@ +#ifndef GUARD_CONSTANTS_BATTLE_CONFIG_H +#define GUARD_CONSTANTS_BATTLE_CONFIG_H + +// Species with peculiar battle effects. Remove them if they're properly placed in constant/species.h +#define SPECIES_DIALGA 0 +#define SPECIES_PALKIA 0 +#define SPECIES_GIRATINA 0 +#define SPECIES_CHERRIM 0 +#define SPECIES_ARCEUS 0 +#define SPECIES_SILVALLY 0 +#define SPECIES_GENESECT 0 +#define SPECIES_AEGISLASH 0 +#define SPECIES_AEGISLASH_BLADE 10000 +#define SPECIES_MIMIKYU 0 +#define SPECIES_MIMIKYU_BUSTED 10001 +#define SPECIES_DARMANITAN 0 +#define SPECIES_DARMANITAN_ZEN 10002 +#define SPECIES_MINIOR_CORE 0 +#define SPECIES_MINIOR 10003 +#define SPECIES_WISHIWASHI 0 +#define SPECIES_WISHIWASHI_SCHOOL 10004 +#define SPECIES_ZYGARDE 0 // 50% +#define SPECIES_ZYGARDE_10 10005 // 10 % +#define SPECIES_ZYGARDE_COMPLETE 10006 // 100 % + +// Items with peculiar battle effects. Remove them if they're properly placed in constant/items.h +#define ITEM_GRISEOUS_ORB 0 +#define ITEM_OCCA_BERRY 204 +#define ITEM_PASSHO_BERRY 205 +#define ITEM_WACAN_BERRY 206 +#define ITEM_RINDO_BERRY 207 +#define ITEM_YACHE_BERRY 208 +#define ITEM_CHOPLE_BERRY 177 +#define ITEM_KEBIA_BERRY 178 +#define ITEM_SHUCA_BERRY 179 +#define ITEM_COBA_BERRY 180 +#define ITEM_PAYAPA_BERRY 181 +#define ITEM_TANGA_BERRY 182 +#define ITEM_CHARTI_BERRY 183 +#define ITEM_KASIB_BERRY 184 +#define ITEM_HABAN_BERRY 185 +#define ITEM_COLBUR_BERRY 186 +#define ITEM_BABIRI_BERRY 187 +#define ITEM_CHILAN_BERRY 188 +#define ITEM_ROSELI_BERRY 189 +#define ITEM_MICLE_BERRY 197 +#define ITEM_CUSTAP_BERRY 199 +#define ITEM_JABOCA_BERRY 200 +#define ITEM_ROWAP_BERRY 201 +#define ITEM_KEE_BERRY 202 +#define ITEM_MARANGA_BERRY 203 + +#define GEN_3 0 +#define GEN_4 1 +#define GEN_5 2 +#define GEN_6 3 +#define GEN_7 4 +#define GEN_8 5 + +// Calculation settings +#define B_CRIT_CHANCE GEN_6 // Chances of a critical hit landing. See CalcCritChanceStage. +#define B_CRIT_MULTIPLIER GEN_6 // In Gen6+, critical hits multiply damage by 1.5 instead of 2. +#define B_EXP_CATCH GEN_6 // In Gen6+, Pokémon get experience from catching. +#define B_TRAINER_EXP_MULTIPLIER GEN_6 // In Gen7+, trainer battles no longer give a 1.5 multiplier to exp gain. +#define B_BURN_DAMAGE GEN_6 // In Gen7+, burn damage is 1/16th of max HP instead of 1/8th. +#define B_PARALYSIS_SPEED GEN_6 // In Gen7+, speed is decreased by 50% instead of 75%. +#define B_TERRAIN_TYPE_BOOST GEN_6 // In Gen8+, speed is boosted by 30% instead of 50%. +#define B_BINDING_DAMAGE GEN_6 // In Gen6+, binding damage is 1/8 of max HP instead of 1/16. (With Binding Band, 1/6 and 1/8 respectively.) +#define B_CONFUSION_SELF_DMG_CHANCE GEN_6 // In Gen7+, confusion has a 33.3% of self-damage, instead of 50%. +#define B_MULTI_HIT_CHANCE GEN_6 // In Gen5+, multi-hit moves have different %. See Cmd_setmultihitcounter for values. +#define B_RECOIL_IF_MISS_DMG GEN_6 // In Gen5+, Jump Kick and Hi Jump Kick will always do half of the user's max HP when missing. +#define B_PSYWAVE_DMG GEN_6 // Psywave's damage formula. See Cmd_psywavedamageeffect. + +// Move settings +#define B_FELL_STINGER_STAT_RAISE GEN_6 // In Gen7+, it raises Atk by 3 stages instead of 2 if it causes the target to faint. +#define B_SOUND_SUBSTITUTE GEN_6 // In Gen6+, sound moves bypass Substitute. +#define B_TOXIC_NEVER_MISS GEN_6 // In Gen6+, if Toxic is used by a Poison type, it will never miss. +#define B_PAYBACK_SWITCH_BOOST GEN_6 // In Gen5+, if the opponent switches out, Payback's damage will no longer be doubled. +#define B_KINGS_SHIELD_LOWER_ATK GEN_6 // In Gen7+, it lowers Atk by 1 stage instead of 2 of oponents that hit it. +#define B_BINDING_TURNS GEN_6 // In Gen5+, binding moves last for 4-5 turns instead of 2-5 turns. (With Grip Claw, 7 and 5 turns respectively.) +#define B_UPROAR_TURNS GEN_6 // In Gen5+, Uproar lasts for 3 turns instead of 2-5 turns. +#define B_DISABLE_TURNS GEN_6 // Disable's turns. See Cmd_disablelastusedattack. +#define B_INCINERATE_GEMS GEN_6 // In Gen6+, Incinerate can destroy Gems. +#define B_MINIMIZE_DMG_ACC GEN_6 // In Gen6+, moves that causes double damage to minimized Pokémon will also skip accuracy checks. + +// Ability settings +#define B_ABILITY_POP_UP GEN_6 // In Gen5+, the Pokémon abilities are displayed in a pop-up, when they activate in battle. +#define B_ABILITY_WEATHER GEN_6 // In Gen5+, weather caused by abilities lasts the same amount of turns as induced from a move. Before, they lasted till the battle's end or weather change by a move. +#define B_GALE_WINGS GEN_6 // In Gen7+ requires full HP to trigger. +#define B_STANCE_CHANGE_FAIL GEN_7 // In Gen7+, Aegislash's form change does not happen, if the Pokémon cannot use a move, because of confusion, paralysis, etc. In gen6, the form change occurs despite not being able to move. +#define B_GHOSTS_ESCAPE GEN_6 // In Gen6+, ghosts can escape even when blocked by abilities such as Shadow Tag. +#define B_MOODY_ACC_EVASION GEN_6 // In Gen8+, Moody CANNOT raise Accuray and Evasion any more. +#define B_FLASH_FIRE_FROZEN GEN_6 // In Gen5+, Flash Fire can trigger even when frozen, when it couldn't before. +#define B_SYNCHRONIZE_NATURE GEN_6 // In Gen8+, if the Pokémon with Synchronize is leading the party, it's 100% guaranteed that wild Pokémon will have the same ability, as opposed to 50% previously. + +// Item settings +#define B_HP_BERRIES GEN_6 // In Gen4+, berries which restore hp activate immediately after hp drops to half. In gen3, the effect occurs at the end of the turn. +#define B_BERRIES_INSTANT GEN_6 // In Gen4+, most berries activate on battle start/switch-in if applicable. In gen3, they only activate either at the move end or turn end. + +// Other +#define B_FLAG_INVERSE_BATTLE 0 // If this flag is set, the battle's type effectiveness are inversed. For example, fire is super effective against water. 0 disables the feature. +#define B_FAST_INTRO TRUE // If set to TRUE, battle intro texts print at the same time as animation of a Pokémon, as opposing to waiting for the animation to end. +#define B_SHOW_TARGETS TRUE // If set to TRUE, all available targets, for moves hitting 2 or 3 Pokémon, will be shown before selecting a move. +#define B_SLEEP_TURNS GEN_6 // In Gen5+, sleep lasts for 1-3 turns instead of 2-5 turns. +#define B_PARALYZE_ELECTRIC GEN_6 // In Gen6+, Electric type Pokémon can't be paralyzed. +#define B_POWDER_GRASS GEN_6 // In Gen6+, Grass type Pokémon are immune to powder and spore moves. + +// Animation Settings +#define NEW_SWORD_PARTICLE TRUE // update swords dance particle +#define NEW_LEECH_SEED_PARTICLE TRUE //update leech seed's animation particle +#define NEW_HORN_ATTACK_PARTICLE TRUE //update horn attack's horn +#define NEW_LEAF_PARTICLE TRUE // update leaf particle +#define NEW_EMBER_PARTICLES TRUE //updates ember fire particle +#define NEW_MEAN_LOOK_PARTICLE TRUE //update mean look eye +#define NEW_TEETH_PARTICLE TRUE //update bite/crunch teeth particle +#define NEW_HANDS_FEET_PARTICLE TRUE //update chop/kick/punch particles +#define NEW_SPIKES_PARTICLE TRUE //update spikes particle +#define NEW_FLY_BUBBLE_PARTICLE TRUE //update fly 'bubble' particle +#define NEW_CURSE_NAIL_PARTICLE TRUE //updates curse nail +#define NEW_BATON_PASS_BALL_PARTICLE TRUE //update baton pass pokeball sprite +#define NEW_MORNING_SUN_STAR_PARTICLE TRUE //updates morning sun star particles +#define NEW_IMPACT_PALETTE TRUE //updates the basic 'hit' particle +#define NEW_SURF_PARTICLE_PALETTE TRUE //updates the surf wave palette + +#endif // GUARD_CONSTANTS_BATTLE_CONFIG_H diff --git a/include/constants/battle_frontier.h b/include/constants/battle_frontier.h index 1a60714e8b..6fe1e2c58d 100644 --- a/include/constants/battle_frontier.h +++ b/include/constants/battle_frontier.h @@ -47,6 +47,7 @@ #define SPECIAL_BATTLE_STEVEN 8 #define SPECIAL_BATTLE_PIKE_DOUBLE 9 #define SPECIAL_BATTLE_PYRAMID 10 +#define SPECIAL_BATTLE_MULTI 11 #define MAX_BATTLE_FRONTIER_POINTS 9999 #define MAX_STREAK 9999 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index b54f013538..abdd193771 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -18,12 +18,12 @@ #define EFFECT_SPECIAL_DEFENSE_UP 14 #define EFFECT_ACCURACY_UP 15 #define EFFECT_EVASION_UP 16 -#define EFFECT_ALWAYS_HIT 17 +#define EFFECT_SPECIAL_ATTACK_UP_3 17 #define EFFECT_ATTACK_DOWN 18 #define EFFECT_DEFENSE_DOWN 19 #define EFFECT_SPEED_DOWN 20 -#define EFFECT_SPECIAL_ATTACK_DOWN 21 // unused -#define EFFECT_SPECIAL_DEFENSE_DOWN 22 // unused +#define EFFECT_SPECIAL_ATTACK_DOWN 21 +#define EFFECT_SPECIAL_DEFENSE_DOWN 22 #define EFFECT_ACCURACY_DOWN 23 #define EFFECT_EVASION_DOWN 24 #define EFFECT_HAZE 25 @@ -40,16 +40,16 @@ #define EFFECT_TRI_ATTACK 36 #define EFFECT_REST 37 #define EFFECT_OHKO 38 -#define EFFECT_RAZOR_WIND 39 +#define EFFECT_FUSION_COMBO 39 #define EFFECT_SUPER_FANG 40 #define EFFECT_DRAGON_RAGE 41 #define EFFECT_TRAP 42 -#define EFFECT_HIGH_CRITICAL 43 +#define EFFECT_HEAL_BLOCK 43 #define EFFECT_DOUBLE_HIT 44 #define EFFECT_RECOIL_IF_MISS 45 #define EFFECT_MIST 46 #define EFFECT_FOCUS_ENERGY 47 -#define EFFECT_RECOIL 48 +#define EFFECT_RECOIL_25 48 #define EFFECT_CONFUSE 49 #define EFFECT_ATTACK_UP_2 50 #define EFFECT_DEFENSE_UP_2 51 @@ -76,7 +76,7 @@ #define EFFECT_SPECIAL_DEFENSE_DOWN_HIT 72 #define EFFECT_ACCURACY_DOWN_HIT 73 #define EFFECT_EVASION_DOWN_HIT 74 -#define EFFECT_SKY_ATTACK 75 +#define EFFECT_TWO_TURNS_ATTACK 75 #define EFFECT_CONFUSE_HIT 76 #define EFFECT_TWINEEDLE 77 #define EFFECT_VITAL_THROW 78 @@ -86,7 +86,7 @@ #define EFFECT_MIMIC 82 #define EFFECT_METRONOME 83 #define EFFECT_LEECH_SEED 84 -#define EFFECT_SPLASH 85 +#define EFFECT_DO_NOTHING 85 #define EFFECT_DISABLE 86 #define EFFECT_LEVEL_DAMAGE 87 #define EFFECT_PSYWAVE 88 @@ -97,21 +97,21 @@ #define EFFECT_CONVERSION_2 93 #define EFFECT_LOCK_ON 94 #define EFFECT_SKETCH 95 -#define EFFECT_UNUSED_60 96 // thaw +#define EFFECT_HAMMER_ARM 96 #define EFFECT_SLEEP_TALK 97 #define EFFECT_DESTINY_BOND 98 #define EFFECT_FLAIL 99 #define EFFECT_SPITE 100 #define EFFECT_FALSE_SWIPE 101 #define EFFECT_HEAL_BELL 102 -#define EFFECT_QUICK_ATTACK 103 +#define EFFECT_ALWAYS_CRIT 103 #define EFFECT_TRIPLE_KICK 104 #define EFFECT_THIEF 105 #define EFFECT_MEAN_LOOK 106 #define EFFECT_NIGHTMARE 107 #define EFFECT_MINIMIZE 108 #define EFFECT_CURSE 109 -#define EFFECT_UNUSED_6E 110 +#define EFFECT_HEALING_WISH 110 #define EFFECT_PROTECT 111 #define EFFECT_SPIKES 112 #define EFFECT_FORESIGHT 113 @@ -132,7 +132,7 @@ #define EFFECT_PURSUIT 128 #define EFFECT_RAPID_SPIN 129 #define EFFECT_SONICBOOM 130 -#define EFFECT_UNUSED_83 131 +#define EFFECT_CAPTIVATE 131 #define EFFECT_MORNING_SUN 132 #define EFFECT_SYNTHESIS 133 #define EFFECT_MOONLIGHT 134 @@ -142,7 +142,7 @@ #define EFFECT_DEFENSE_UP_HIT 138 #define EFFECT_ATTACK_UP_HIT 139 #define EFFECT_ALL_STATS_UP_HIT 140 -#define EFFECT_UNUSED_8D 141 // incomplete fake out in gen 2 +#define EFFECT_FELL_STINGER 141 #define EFFECT_BELLY_DRUM 142 #define EFFECT_PSYCH_UP 143 #define EFFECT_MIRROR_COAT 144 @@ -151,7 +151,7 @@ #define EFFECT_EARTHQUAKE 147 #define EFFECT_FUTURE_SIGHT 148 #define EFFECT_GUST 149 -#define EFFECT_FLINCH_MINIMIZE_HIT 150 // STOMP ASTONISH EXTRASENSORY NEEDLE_ARM +#define EFFECT_FLINCH_MINIMIZE_HIT 150 #define EFFECT_SOLARBEAM 151 #define EFFECT_THUNDER 152 #define EFFECT_TELEPORT 153 @@ -164,7 +164,7 @@ #define EFFECT_STOCKPILE 160 #define EFFECT_SPIT_UP 161 #define EFFECT_SWALLOW 162 -#define EFFECT_UNUSED_A3 163 +#define EFFECT_WORRY_SEED 163 #define EFFECT_HAIL 164 #define EFFECT_TORMENT 165 #define EFFECT_FLATTER 166 @@ -199,9 +199,9 @@ #define EFFECT_SNATCH 195 #define EFFECT_LOW_KICK 196 #define EFFECT_SECRET_POWER 197 -#define EFFECT_DOUBLE_EDGE 198 +#define EFFECT_RECOIL_33 198 #define EFFECT_TEETER_DANCE 199 -#define EFFECT_BLAZE_KICK 200 +#define EFFECT_HIT_ESCAPE 200 #define EFFECT_MUD_SPORT 201 #define EFFECT_POISON_FANG 202 #define EFFECT_WEATHER_BALL 203 @@ -210,10 +210,147 @@ #define EFFECT_COSMIC_POWER 206 #define EFFECT_SKY_UPPERCUT 207 #define EFFECT_BULK_UP 208 -#define EFFECT_POISON_TAIL 209 +#define EFFECT_PLACEHOLDER 209 #define EFFECT_WATER_SPORT 210 #define EFFECT_CALM_MIND 211 #define EFFECT_DRAGON_DANCE 212 #define EFFECT_CAMOUFLAGE 213 +// New move effects +#define EFFECT_PLEDGE 214 +#define EFFECT_FLING 215 +#define EFFECT_NATURAL_GIFT 216 +#define EFFECT_WAKE_UP_SLAP 217 +#define EFFECT_WRING_OUT 218 +#define EFFECT_HEX 219 +#define EFFECT_ASSURANCE 220 +#define EFFECT_TRUMP_CARD 221 +#define EFFECT_ACROBATICS 222 +#define EFFECT_HEAT_CRASH 223 +#define EFFECT_PUNISHMENT 224 +#define EFFECT_STORED_POWER 225 +#define EFFECT_ELECTRO_BALL 226 +#define EFFECT_GYRO_BALL 227 +#define EFFECT_ECHOED_VOICE 228 +#define EFFECT_PAYBACK 229 +#define EFFECT_ROUND 230 +#define EFFECT_BRINE 231 +#define EFFECT_VENOSHOCK 232 +#define EFFECT_RETALITATE 233 +#define EFFECT_BULLDOZE 234 +#define EFFECT_FOUL_PLAY 235 +#define EFFECT_PSYSHOCK 236 +#define EFFECT_ROOST 237 +#define EFFECT_GRAVITY 238 +#define EFFECT_MIRACLE_EYE 239 +#define EFFECT_TAILWIND 240 +#define EFFECT_EMBARGO 241 +#define EFFECT_AQUA_RING 242 +#define EFFECT_TRICK_ROOM 243 +#define EFFECT_WONDER_ROOM 244 +#define EFFECT_MAGIC_ROOM 245 +#define EFFECT_MAGNET_RISE 246 +#define EFFECT_TOXIC_SPIKES 247 +#define EFFECT_GASTRO_ACID 248 +#define EFFECT_STEALTH_ROCK 249 +#define EFFECT_TELEKINESIS 250 +#define EFFECT_POWER_SWAP 251 +#define EFFECT_GUARD_SWAP 252 +#define EFFECT_HEART_SWAP 253 +#define EFFECT_POWER_SPLIT 254 +#define EFFECT_GUARD_SPLIT 255 +#define EFFECT_STICKY_WEB 256 +#define EFFECT_METAL_BURST 257 +#define EFFECT_LUCKY_CHANT 258 +#define EFFECT_SUCKER_PUNCH 259 +#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2 260 +#define EFFECT_SIMPLE_BEAM 261 +#define EFFECT_ENTRAINMENT 262 +#define EFFECT_HEAL_PULSE 263 +#define EFFECT_QUASH 264 +#define EFFECT_ION_DELUGE 265 +#define EFFECT_FREEZE_DRY 266 +#define EFFECT_TOPSY_TURVY 267 +#define EFFECT_MISTY_TERRAIN 268 +#define EFFECT_GRASSY_TERRAIN 269 +#define EFFECT_ELECTRIC_TERRAIN 270 +#define EFFECT_PSYCHIC_TERRAIN 271 +#define EFFECT_ATTACK_ACCURACY_UP 272 +#define EFFECT_ATTACK_SPATK_UP 273 +#define EFFECT_HURRICANE 274 +#define EFFECT_TWO_TYPED_MOVE 275 +#define EFFECT_ME_FIRST 276 +#define EFFECT_SPEED_UP_HIT 277 +#define EFFECT_QUIVER_DANCE 278 +#define EFFECT_COIL 279 +#define EFFECT_ELECTRIFY 280 +#define EFFECT_SCALD 281 +#define EFFECT_REFLECT_TYPE 282 +#define EFFECT_SOAK 283 +#define EFFECT_GROWTH 284 +#define EFFECT_CLOSE_COMBAT 285 +#define EFFECT_LAST_RESORT 286 +#define EFFECT_RECOIL_33_STATUS 287 +#define EFFECT_FLINCH_STATUS 288 +#define EFFECT_RECOIL_50 289 +#define EFFECT_SHELL_SMASH 290 +#define EFFECT_SHIFT_GEAR 291 +#define EFFECT_DEFENSE_UP_3 292 +#define EFFECT_NOBLE_ROAR 293 // Atk and Sp atk down by 1 +#define EFFECT_VENOM_DRENCH 294 +#define EFFECT_TOXIC_THREAD 295 +#define EFFECT_CLEAR_SMOG 296 +#define EFFECT_HIT_SWITCH_TARGET 297 +#define EFFECT_FINAL_GAMBIT 298 +#define EFFECT_TECHNO_BLAST 299 +#define EFFECT_JUDGMENT 300 +#define EFFECT_AUTOTOMIZE 301 +#define EFFECT_COPYCAT 302 +#define EFFECT_DEFOG 303 +#define EFFECT_HIT_ENEMY_HEAL_ALLY 304 // Pollen Puff +#define EFFECT_SMACK_DOWN 305 +#define EFFECT_SYNCHRONOISE 306 +#define EFFECT_PSYCHO_SHIFT 307 +#define EFFECT_POWER_TRICK 308 +#define EFFECT_FLAME_BURST 309 +#define EFFECT_AFTER_YOU 310 +#define EFFECT_BESTOW 311 +#define EFFECT_ROTOTILLER 312 +#define EFFECT_FLOWER_SHIELD 313 +#define EFFECT_HIT_PREVENT_ESCAPE 314 +#define EFFECT_SPEED_SWAP 315 +#define EFFECT_DEFENSE_UP2_HIT 316 +#define EFFECT_REVELATION_DANCE 317 +#define EFFECT_AURORA_VEIL 318 +#define EFFECT_THIRD_TYPE 319 +#define EFFECT_FEINT 320 +#define EFFECT_SPARKLING_ARIA 321 +#define EFFECT_ACUPRESSURE 322 +#define EFFECT_AROMATIC_MIST 323 +#define EFFECT_POWDER 324 +#define EFFECT_SP_ATTACK_UP_HIT 325 +#define EFFECT_BELCH 326 +#define EFFECT_PARTING_SHOT 327 +#define EFFECT_SPECTRAL_THIEF 328 +#define EFFECT_V_CREATE 329 +#define EFFECT_MAT_BLOCK 330 +#define EFFECT_STOMPING_TANTRUM 331 +#define EFFECT_CORE_ENFORCER 332 +#define EFFECT_INSTRUCT 333 +#define EFFECT_THROAT_CHOP 334 +#define EFFECT_LASER_FOCUS 335 +#define EFFECT_MAGNETIC_FLUX 336 +#define EFFECT_GEAR_UP 337 +#define EFFECT_INCINERATE 338 +#define EFFECT_BUG_BITE 339 +#define EFFECT_STRENGTH_SAP 340 +#define EFFECT_MIND_BLOWN 341 +#define EFFECT_PURIFY 342 +#define EFFECT_BURN_UP 343 +#define EFFECT_SHORE_UP 344 +#define EFFECT_GEOMANCY 345 +#define EFFECT_FAIRY_LOCK 346 +#define EFFECT_ALLY_SWITCH 347 +#define EFFECT_SLEEP_HIT 348 // Relic Song + #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 9372377c45..b081907ec3 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -5,14 +5,14 @@ #define sPAINSPLIT_HP gBattleScripting #define sBIDE_DMG gBattleScripting + 4 #define sMULTIHIT_STRING gBattleScripting + 8 -#define sDMG_MULTIPLIER gBattleScripting + 0xE +#define sEXP_CATCH gBattleScripting + 0xE #define sTWOTURN_STRINGID gBattleScripting + 0xF #define sB_ANIM_ARG1 gBattleScripting + 0x10 #define sB_ANIM_ARG2 gBattleScripting + 0x11 #define sTRIPLE_KICK_POWER gBattleScripting + 0x12 #define sMOVEEND_STATE gBattleScripting + 0x14 -#define sBATTLER_WITH_ABILITY gBattleScripting + 0x15 -#define sMULTIHIT_EFFECT gBattleScripting + 0x16 +#define sSAVED_STAT_CHANGER gBattleScripting + 0x15 +#define sSHIFT_SWITCHED gBattleScripting + 0x16 #define sBATTLER gBattleScripting + 0x17 #define sB_ANIM_TURN gBattleScripting + 0x18 #define sB_ANIM_TARGETS_HIT gBattleScripting + 0x19 @@ -22,15 +22,20 @@ #define sBATTLE_STYLE gBattleScripting + 0x1D #define sLVLBOX_STATE gBattleScripting + 0x1E #define sLEARNMOVE_STATE gBattleScripting + 0x1F -#define sFIELD_20 gBattleScripting + 0x20 +#define sSAVED_BATTLER gBattleScripting + 0x20 #define sRESHOW_MAIN_STATE gBattleScripting + 0x21 #define sRESHOW_HELPER_STATE gBattleScripting + 0x22 #define sFIELD_23 gBattleScripting + 0x23 #define sWINDOWS_TYPE gBattleScripting + 0x24 #define sMULTIPLAYER_ID gBattleScripting + 0x25 #define sSPECIAL_TRAINER_BATTLE_TYPE gBattleScripting + 0x26 +#define sMON_CAUGHT gBattleScripting + 0x27 +#define sSAVED_DMG gBattleScripting + 0x28 +#define sSAVED_MOVE_EFFECT gBattleScripting + 0x2C +#define sMOVE_EFFECT gBattleScripting + 0x2E +#define sMULTIHIT_EFFECT gBattleScripting + 0x30 +#define sILLUSION_NICK_HACK gBattleScripting + 0x32 -#define cEFFECT_CHOOSER gBattleCommunication + 3 #define cMULTISTRING_CHOOSER gBattleCommunication + 5 // Battle Script defines for getting the wanted battler @@ -41,15 +46,15 @@ #define BS_BATTLER_0 7 #define BS_ATTACKER_WITH_PARTNER 4 // for Cmd_updatestatusicon #define BS_ATTACKER_SIDE 8 // for Cmd_jumpifability -#define BS_NOT_ATTACKER_SIDE 9 // for Cmd_jumpifability +#define BS_TARGET_SIDE 9 // for Cmd_jumpifability #define BS_SCRIPTING 10 #define BS_PLAYER1 11 #define BS_OPPONENT1 12 #define BS_PLAYER2 13 #define BS_OPPONENT2 14 +#define BS_ABILITY_BATTLER 15 // Cmd_accuracycheck -#define NO_ACC_CALC 0xFFFE #define NO_ACC_CALC_CHECK_LOCK_ON 0xFFFF #define ACC_CURR_MOVE 0 @@ -85,11 +90,91 @@ #define VARIOUS_SET_ALREADY_STATUS_MOVE_ATTEMPT 23 #define VARIOUS_SET_TELEPORT_OUTCOME 25 #define VARIOUS_PLAY_TRAINER_DEFEATED_MUSIC 26 +#define VARIOUS_STAT_TEXT_BUFFER 27 +#define VARIOUS_SWITCHIN_ABILITIES 28 +#define VARIOUS_SAVE_TARGET 29 +#define VARIOUS_RESTORE_TARGET 30 +#define VARIOUS_INSTANT_HP_DROP 31 +#define VARIOUS_CLEAR_STATUS 32 +#define VARIOUS_RESTORE_PP 33 +#define VARIOUS_TRY_ACTIVATE_MOXIE 34 +#define VARIOUS_TRY_ACTIVATE_FELL_STINGER 35 +#define VARIOUS_PLAY_MOVE_ANIMATION 36 +#define VARIOUS_SET_LUCKY_CHANT 37 +#define VARIOUS_SUCKER_PUNCH_CHECK 38 +#define VARIOUS_SET_SIMPLE_BEAM 39 +#define VARIOUS_TRY_ENTRAINMENT 40 +#define VARIOUS_SET_LAST_USED_ABILITY 41 +#define VARIOUS_TRY_HEAL_PULSE 42 +#define VARIOUS_TRY_QUASH 43 +#define VARIOUS_INVERT_STAT_STAGES 44 +#define VARIOUS_SET_TERRAIN 45 +#define VARIOUS_TRY_ME_FIRST 46 +#define VARIOUS_JUMP_IF_BATTLE_END 47 +#define VARIOUS_TRY_ELECTRIFY 48 +#define VARIOUS_TRY_REFLECT_TYPE 49 +#define VARIOUS_TRY_SOAK 50 +#define VARIOUS_HANDLE_MEGA_EVO 51 +#define VARIOUS_TRY_LAST_RESORT 52 +#define VARIOUS_ARGUMENT_STATUS_EFFECT 53 +#define VARIOUS_TRY_HIT_SWITCH_TARGET 54 +#define VARIOUS_TRY_AUTOTOMIZE 55 +#define VARIOUS_TRY_COPYCAT 56 +#define VARIOUS_ABILITY_POPUP 57 +#define VARIOUS_DEFOG 58 +#define VARIOUS_JUMP_IF_TARGET_ALLY 59 +#define VARIOUS_TRY_SYNCHRONOISE 60 +#define VARIOUS_PSYCHO_SHIFT 61 +#define VARIOUS_CURE_STATUS 62 +#define VARIOUS_POWER_TRICK 63 +#define VARIOUS_AFTER_YOU 64 +#define VARIOUS_BESTOW 65 +#define VARIOUS_ARGUMENT_TO_MOVE_EFFECT 66 +#define VARIOUS_JUMP_IF_NOT_GROUNDED 67 +#define VARIOUS_HANDLE_TRAINER_SLIDE_MSG 68 +#define VARIOUS_TRY_TRAINER_SLIDE_MSG_FIRST_OFF 69 +#define VARIOUS_TRY_TRAINER_SLIDE_MSG_LAST_ON 70 +#define VARIOUS_SET_AURORA_VEIL 71 +#define VARIOUS_TRY_THIRD_TYPE 72 +#define VARIOUS_ACUPRESSURE 73 +#define VARIOUS_SET_POWDER 74 +#define VARIOUS_SPECTRAL_THIEF 75 +#define VARIOUS_GRAVITY_ON_AIRBORNE_MONS 76 +#define VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS 77 +#define VARIOUS_JUMP_IF_ROAR_FAILS 78 +#define VARIOUS_TRY_INSTRUCT 79 +#define VARIOUS_JUMP_IF_NOT_BERRY 80 +#define VARIOUS_TRACE_ABILITY 81 +#define VARIOUS_UPDATE_NICK 82 +#define VARIOUS_TRY_ILLUSION_OFF 83 +#define VARIOUS_SET_SPRITEIGNORE0HP 84 +#define VARIOUS_HANDLE_FORM_CHANGE 85 +#define VARIOUS_GET_STAT_VALUE 86 +#define VARIOUS_JUMP_IF_FULL_HP 87 +#define VARIOUS_LOSE_TYPE 88 +#define VARIOUS_TRY_ACTIVATE_SOULHEART 89 +#define VARIOUS_TRY_ACTIVATE_RECEIVER 90 +#define VARIOUS_TRY_ACTIVATE_BEAST_BOOST 91 +#define VARIOUS_TRY_FRISK 92 +#define VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED 93 +#define VARIOUS_TRY_FAIRY_LOCK 94 +#define VARIOUS_JUMP_IF_NO_ALLY 95 +#define VARIOUS_POISON_TYPE_IMMUNITY 96 +#define VARIOUS_JUMP_IF_NO_HOLD_EFFECT 97 +#define VARIOUS_INFATUATE_WITH_BATTLER 98 +#define VARIOUS_SET_LAST_USED_ITEM 99 +#define VARIOUS_PARALYZE_TYPE_IMMUNITY 100 +#define VARIOUS_JUMP_IF_ABSENT 101 -// Cmd_manipulatedmg +// Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 #define DMG_RECOIL_FROM_MISS 1 #define DMG_DOUBLED 2 +#define DMG_1_8_TARGET_HP 3 +#define DMG_FULL_ATTACKER_HP 4 +#define DMG_CURR_ATTACKER_HP 5 +#define DMG_BIG_ROOT 6 +#define DMG_1_2_ATTACKER_HP 7 // Cmd_jumpifcantswitch #define SWITCH_IGNORE_ESCAPE_PREVENTION 0x80 @@ -99,10 +184,38 @@ #define STAT_BUFF_NOT_PROTECT_AFFECTED 0x20 // stat change flags for Cmd_playstatchangeanimation -#define STAT_CHANGE_NEGATIVE 0x1 -#define STAT_CHANGE_BY_TWO 0x2 -#define STAT_CHANGE_MULTIPLE_STATS 0x4 -#define STAT_CHANGE_CANT_PREVENT 0x8 +#define STAT_CHANGE_NEGATIVE 0x1 +#define STAT_CHANGE_BY_TWO 0x2 +#define STAT_CHANGE_ONLY_MULTIPLE 0x4 +#define STAT_CHANGE_CANT_PREVENT 0x8 + +// cases for Cmd_moveend +#define MOVEEND_PROTECT_LIKE_EFFECT 0 +#define MOVEEND_RAGE 1 +#define MOVEEND_DEFROST 2 +#define MOVEEND_SYNCHRONIZE_TARGET 3 +#define MOVEEND_ABILITIES 4 +#define MOVEEND_ABILITIES_ATTACKER 5 +#define MOVEEND_STATUS_IMMUNITY_ABILITIES 6 +#define MOVEEND_SYNCHRONIZE_ATTACKER 7 +#define MOVEEND_CHOICE_MOVE 8 +#define MOVEEND_CHANGED_ITEMS 9 +#define MOVEEND_ATTACKER_INVISIBLE 10 +#define MOVEEND_ATTACKER_VISIBLE 11 +#define MOVEEND_TARGET_VISIBLE 12 +#define MOVEEND_ITEM_EFFECTS_TARGET 13 +#define MOVEEND_MOVE_EFFECTS2 14 +#define MOVEEND_ITEM_EFFECTS_ALL 15 +#define MOVEEND_KINGSROCK_SHELLBELL 16 +#define MOVEEND_SUBSTITUTE 17 +#define MOVEEND_UPDATE_LAST_MOVES 18 +#define MOVEEND_MIRROR_MOVE 19 +#define MOVEEND_NEXT_TARGET 20 +#define MOVEEND_LIFE_ORB 21 +#define MOVEEND_DANCER 22 +#define MOVEEND_EMERGENCY_EXIT 23 +#define MOVEEND_CLEAR_BITS 24 +#define MOVEEND_COUNT 25 // stat flags for Cmd_playstatchangeanimation #define BIT_HP 0x1 @@ -114,24 +227,4 @@ #define BIT_ACC 0x40 #define BIT_EVASION 0x80 -// cases for Cmd_moveend -#define MOVEEND_RAGE 0 -#define MOVEEND_DEFROST 1 -#define MOVEEND_SYNCHRONIZE_TARGET 2 -#define MOVEEND_ON_DAMAGE_ABILITIES 3 -#define MOVEEND_IMMUNITY_ABILITIES 4 -#define MOVEEND_SYNCHRONIZE_ATTACKER 5 -#define MOVEEND_CHOICE_MOVE 6 -#define MOVEEND_CHANGED_ITEMS 7 -#define MOVEEND_ATTACKER_INVISIBLE 8 -#define MOVEEND_ATTACKER_VISIBLE 9 -#define MOVEEND_TARGET_VISIBLE 10 -#define MOVEEND_ITEM_EFFECTS_ALL 11 -#define MOVEEND_KINGSROCK_SHELLBELL 12 -#define MOVEEND_SUBSTITUTE 13 -#define MOVEEND_UPDATE_LAST_MOVES 14 -#define MOVEEND_MIRROR_MOVE 15 -#define MOVEEND_NEXT_TARGET 16 -#define MOVEEND_COUNT 17 - #endif // GUARD_CONSTANTS_BATTLE_SCRIPT_COMMANDS_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 9e0d8e0be4..2f66f97f91 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -1,8 +1,6 @@ #ifndef GUARD_CONSTANTS_BATTLE_STRING_IDS_H #define GUARD_CONSTANTS_BATTLE_STRING_IDS_H -#define BATTLESTRINGS_COUNT 369 - #define BATTLESTRINGS_ID_ADDER 12 // all battlestrings have its ID + 12, because first 5 are reserved #define STRINGID_INTROMSG 0 @@ -11,6 +9,7 @@ #define STRINGID_SWITCHINMON 3 #define STRINGID_USEDMOVE 4 #define STRINGID_BATTLEEND 5 +#define STRINGID_TRAINERSLIDE 6 // todo: make some of those names less vague: attacker/target vs pkmn, etc. #define STRINGID_TRAINER1LOSETEXT 12 @@ -383,4 +382,174 @@ #define STRINGID_TRAINER1WINTEXT 379 #define STRINGID_TRAINER2WINTEXT 380 +#define STRINGID_ENDUREDSTURDY 381 +#define STRINGID_POWERHERB 382 +#define STRINGID_HURTBYITEM 383 +#define STRINGID_PSNBYITEM 384 +#define STRINGID_BRNBYITEM 385 +#define STRINGID_DEFABILITYIN 386 +#define STRINGID_GRAVITYINTENSIFIED 387 +#define STRINGID_TARGETIDENTIFIED 388 +#define STRINGID_TARGETWOKEUP 389 +#define STRINGID_PKMNSTOLEANDATEITEM 390 +#define STRINGID_TAILWINDBLEW 391 +#define STRINGID_PKMNWENTBACK 392 +#define STRINGID_PKMNCANTUSEITEMSANYMORE 393 +#define STRINGID_PKMNFLUNG 394 +#define STRINGID_PKMNPREVENTEDFROMHEALING 395 +#define STRINGID_PKMNSWITCHEDATKANDDEF 396 +#define STRINGID_PKMNSABILITYSUPPRESSED 397 +#define STRINGID_SHIELDEDFROMCRITICALHITS 398 +#define STRINGID_SWITCHEDATKANDSPATK 399 +#define STRINGID_SWITCHEDDEFANDSPDEF 400 +#define STRINGID_PKMNACQUIREDABILITY 401 +#define STRINGID_POISONSPIKESSCATTERED 402 +#define STRINGID_PKMNSWITCHEDSTATCHANGES 403 +#define STRINGID_PKMNSURROUNDEDWITHVEILOFWATER 404 +#define STRINGID_PKMNLEVITATEDONELECTROMAGNETISM 405 +#define STRINGID_PKMNTWISTEDDIMENSIONS 406 +#define STRINGID_POINTEDSTONESFLOAT 407 +#define STRINGID_CLOAKEDINMYSTICALMOONLIGHT 408 +#define STRINGID_TRAPPERBYSWIRLINGMAGMA 409 +#define STRINGID_VANISHEDINSTANTLY 410 +#define STRINGID_PROTECTEDTEAM 411 +#define STRINGID_SHAREDITSGUARD 412 +#define STRINGID_SHAREDITSPOWER 413 +#define STRINGID_SWAPSDEFANDSPDEFOFALLPOKEMON 414 +#define STRINGID_BECAMENIMBLE 415 +#define STRINGID_HURLEDINTOTHEAIR 416 +#define STRINGID_HELDITEMSLOSEEFFECTS 417 +#define STRINGID_FELLSTRAIGHTDOWN 418 +#define STRINGID_TRANSFORMEDINTOWATERTYPE 419 +#define STRINGID_PKMNACQUIREDSIMPLE 420 +#define STRINGID_EMPTYSTRING5 421 +#define STRINGID_KINDOFFER 422 +#define STRINGID_RESETSTARGETSSTATLEVELS 423 +#define STRINGID_EMPTYSTRING6 424 +#define STRINGID_ALLYSWITCHPOSITION 425 +#define STRINGID_RESTORETARGETSHEALTH 426 +#define STRINGID_TOOKPJMNINTOTHESKY 427 +#define STRINGID_FREEDFROMSKYDROP 428 +#define STRINGID_POSTPONETARGETMOVE 429 +#define STRINGID_REFLECTTARGETSTYPE 430 +#define STRINGID_TRANSFERHELDITEM 431 +#define STRINGID_EMBARGOENDS 432 +#define STRINGID_ELECTROMAGNETISM 433 +#define STRINGID_BUFFERENDS 434 +#define STRINGID_TELEKINESISENDS 435 +#define STRINGID_TAILWINDENDS 436 +#define STRINGID_LUCKYCHANTENDS 437 +#define STRINGID_TRICKROOMENDS 438 +#define STRINGID_WONDERROOMENDS 439 +#define STRINGID_MAGICROOMENDS 440 +#define STRINGID_MUDSPORTENDS 441 +#define STRINGID_WATERSPORTENDS 442 +#define STRINGID_GRAVITYENDS 443 +#define STRINGID_AQUARINGHEAL 444 +#define STRINGID_AURORAVEILENDS 445 +#define STRINGID_ELECTRICTERRAINENDS 446 +#define STRINGID_MISTYTERRAINENDS 447 +#define STRINGID_PSYCHICTERRAINENDS 448 +#define STRINGID_GRASSYTERRAINENDS 449 +#define STRINGID_TARGETABILITYSTATRAISE 450 +#define STRINGID_ANGRYPOINTACTIVATES 451 +#define STRINGID_ATTACKERABILITYSTATRAISE 452 +#define STRINGID_POISONHEALHPUP 453 +#define STRINGID_BADDREAMSDMG 454 +#define STRINGID_MOLDBREAKERENTERS 455 +#define STRINGID_TERAVOLTENTERS 456 +#define STRINGID_TURBOBLAZEENTERS 457 +#define STRINGID_SLOWSTARTENTERS 458 +#define STRINGID_SLOWSTARTEND 459 +#define STRINGID_SOLARPOWERHPDROP 460 +#define STRINGID_AFTERMATHDMG 461 +#define STRINGID_ANTICIPATIONACTIVATES 462 +#define STRINGID_FOREWARNACTIVATES 463 +#define STRINGID_ICEBODYHPGAIN 464 +#define STRINGID_SNOWWARNINGHAIL 465 +#define STRINGID_FRISKACTIVATES 466 +#define STRINGID_UNNERVEENTERS 467 +#define STRINGID_HARVESTBERRY 468 +#define STRINGID_MOXIEATKRISE 469 +#define STRINGID_MAGICBOUNCEACTIVATES 470 +#define STRINGID_PROTEANTYPECHANGE 471 +#define STRINGID_SYMBIOSISITEMPASS 472 +#define STRINGID_STEALTHROCKDMG 473 +#define STRINGID_TOXICSPIKESABSORBED 474 +#define STRINGID_TOXICSPIKESPOISONED 475 +#define STRINGID_STICKYWEBSWITCHIN 476 +#define STRINGID_HEALINGWISHCAMETRUE 477 +#define STRINGID_HEALINGWISHHEALED 478 +#define STRINGID_LUNARDANCECAMETRUE 479 +#define STRINGID_CUSEDBODYDISABLED 480 +#define STRINGID_ATTACKERACQUIREDABILITY 481 +#define STRINGID_TARGETABILITYSTATLOWER 482 +#define STRINGID_TARGETSTATWONTGOHIGHER 483 +#define STRINGID_PKMNMOVEBOUNCEDABILITY 484 +#define STRINGID_IMPOSTERTRANSFORM 485 +#define STRINGID_ASSAULTVESTDOESNTALLOW 486 +#define STRINGID_GRAVITYPREVENTSUSAGE 487 +#define STRINGID_HEALBLOCKPREVENTSUSAGE 488 +#define STRINGID_NOTDONEYET 489 +#define STRINGID_STICKYWEBUSED 490 +#define STRINGID_QUASHSUCCESS 491 +#define STRINGID_PKMNBLEWAWAYTOXICSPIKES 492 +#define STRINGID_PKMNBLEWAWAYSTICKYWEB 493 +#define STRINGID_PKMNBLEWAWAYSTEALTHROCK 494 +#define STRINGID_IONDELUGEON 495 +#define STRINGID_TOPSYTURVYSWITCHEDSTATS 496 +#define STRINGID_TERRAINBECOMESMISTY 497 +#define STRINGID_TERRAINBECOMESGRASSY 498 +#define STRINGID_TERRAINBECOMESELECTRIC 499 +#define STRINGID_TERRAINBECOMESPSYCHIC 500 +#define STRINGID_TARGETELECTRIFIED 501 +#define STRINGID_MEGAEVOREACTING 502 +#define STRINGID_MEGAEVOEVOLVED 503 +#define STRINGID_DRASTICALLY 504 +#define STRINGID_SEVERELY 505 +#define STRINGID_INFESTATION 506 +#define STRINGID_NOEFFECTONTARGET 507 +#define STRINGID_BURSTINGFLAMESHIT 508 +#define STRINGID_BESTOWITEMGIVING 509 +#define STRINGID_THIRDTYPEADDED 510 +#define STRINGID_FELLFORFEINT 511 +#define STRINGID_POKEMONCANNOTUSEMOVE 512 +#define STRINGID_COVEREDINPOWDER 513 +#define STRINGID_POWDEREXPLODES 514 +#define STRINGID_BELCHCANTSELECT 515 +#define STRINGID_SPECTRALTHIEFSTEAL 516 +#define STRINGID_GRAVITYGROUNDING 517 +#define STRINGID_MISTYTERRAINPREVENTS 518 +#define STRINGID_GRASSYTERRAINHEALS 519 +#define STRINGID_ELECTRICTERRAINPREVENTS 520 +#define STRINGID_PSYCHICTERRAINPREVENTS 521 +#define STRINGID_SAFETYGOOGLESPROTECTED 522 +#define STRINGID_FLOWERVEILPROTECTED 523 +#define STRINGID_SWEETVEILPROTECTED 524 +#define STRINGID_AROMAVEILPROTECTED 525 +#define STRINGID_CELEBRATEMESSAGE 526 +#define STRINGID_USEDINSTRUCTEDMOVE 527 +#define STRINGID_THROATCHOPENDS 528 +#define STRINGID_PKMNCANTUSEMOVETHROATCHOP 529 +#define STRINGID_LASERFOCUS 530 +#define STRINGID_GEMACTIVATES 531 +#define STRINGID_BERRYDMGREDUCES 532 +#define STRINGID_TARGETATEITEM 533 +#define STRINGID_AIRBALLOONFLOAT 534 +#define STRINGID_AIRBALLOONPOP 535 +#define STRINGID_INCINERATEBURN 536 +#define STRINGID_BUGBITE 537 +#define STRINGID_ILLUSIONWOREOFF 538 +#define STRINGID_ATTACKERCUREDTARGETSTATUS 539 +#define STRINGID_ATTACKERLOSTFIRETYPE 540 +#define STRINGID_HEALERCURE 541 +#define STRINGID_SCRIPTINGABILITYSTATRAISE 542 +#define STRINGID_RECEIVERABILITYTAKEOVER 543 +#define STRINGID_PKNMABSORBINGPOWER 544 +#define STRINGID_NOONEWILLBEABLETORUNAWAY 545 +#define STRINGID_DESTINYKNOTACTIVATES 546 +#define STRINGID_CLOAKEDINAFREEZINGLIGHT 547 + +#define BATTLESTRINGS_COUNT 548 + #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/include/constants/battle_tower.h b/include/constants/battle_tower.h index b372c3ad5c..c453e90a69 100644 --- a/include/constants/battle_tower.h +++ b/include/constants/battle_tower.h @@ -38,4 +38,10 @@ #define BATTLE_TOWER_LINKSTAT_PARTNER_RETIRE 2 #define BATTLE_TOWER_LINKSTAT_PLAYER_RETIRE 3 +// Ids for special multi battle types +#define MULTI_BATTLE_2_VS_2 0 +#define MULTI_BATTLE_2_VS_WILD 1 +#define MULTI_BATTLE_2_VS_1 2 +#define MULTI_BATTLE_CHOOSE_MONS 0x80 + #endif //GUARD_CONSTANTS_BATTLE_TOWER_H diff --git a/include/constants/contest.h b/include/constants/contest.h index 9eb6b26e41..bb3b4ef039 100644 --- a/include/constants/contest.h +++ b/include/constants/contest.h @@ -143,67 +143,89 @@ #define CONTEST_EFFECT_TYPE_SPECIAL_APPEAL 5 #define CONTEST_EFFECT_TYPE_TURN_ORDER 6 -#define COMBO_STARTER_RAIN_DANCE 1 -#define COMBO_STARTER_RAGE 2 -#define COMBO_STARTER_FOCUS_ENERGY 3 -#define COMBO_STARTER_HYPNOSIS 4 -#define COMBO_STARTER_ENDURE 5 -#define COMBO_STARTER_HORN_ATTACK 6 -#define COMBO_STARTER_SWORDS_DANCE 7 -#define COMBO_STARTER_STOCKPILE 8 -#define COMBO_STARTER_SUNNY_DAY 9 -#define COMBO_STARTER_REST 10 -#define COMBO_STARTER_VICE_GRIP 11 -#define COMBO_STARTER_DEFENSE_CURL 12 -#define COMBO_STARTER_CHARGE 13 -#define COMBO_STARTER_ROCK_THROW 14 -#define COMBO_STARTER_YAWN 15 -#define COMBO_STARTER_SCARY_FACE 16 -#define COMBO_STARTER_POWDER_SNOW 17 -#define COMBO_STARTER_LOCK_ON 18 -#define COMBO_STARTER_SOFT_BOILED 19 -#define COMBO_STARTER_MEAN_LOOK 20 -#define COMBO_STARTER_SCRATCH 21 -#define COMBO_STARTER_GROWTH 22 -#define COMBO_STARTER_HAIL 23 -#define COMBO_STARTER_SANDSTORM 24 -#define COMBO_STARTER_BELLY_DRUM 25 -#define COMBO_STARTER_MIND_READER 26 -#define COMBO_STARTER_DRAGON_BREATH 27 -#define COMBO_STARTER_DRAGON_RAGE 28 -#define COMBO_STARTER_DRAGON_DANCE 29 -#define COMBO_STARTER_SURF 30 -#define COMBO_STARTER_DIVE 31 -#define COMBO_STARTER_STRING_SHOT 32 -#define COMBO_STARTER_LEER 33 -#define COMBO_STARTER_TAUNT 34 -#define COMBO_STARTER_CHARM 35 -#define COMBO_STARTER_HARDEN 36 -#define COMBO_STARTER_SING 37 -#define COMBO_STARTER_EARTHQUAKE 38 -#define COMBO_STARTER_DOUBLE_TEAM 39 -#define COMBO_STARTER_CURSE 40 -#define COMBO_STARTER_SWEET_SCENT 41 -#define COMBO_STARTER_SLUDGE 42 -#define COMBO_STARTER_SLUDGE_BOMB 43 -#define COMBO_STARTER_THUNDER_PUNCH 44 -#define COMBO_STARTER_FIRE_PUNCH 45 -#define COMBO_STARTER_ICE_PUNCH 46 -#define COMBO_STARTER_PECK 47 -#define COMBO_STARTER_METAL_SOUND 48 -#define COMBO_STARTER_MUD_SPORT 49 -#define COMBO_STARTER_WATER_SPORT 50 -#define COMBO_STARTER_BONE_CLUB 51 -#define COMBO_STARTER_BONEMERANG 52 -#define COMBO_STARTER_BONE_RUSH 53 -#define COMBO_STARTER_SAND_ATTACK 54 -#define COMBO_STARTER_MUD_SLAP 55 -#define COMBO_STARTER_FAKE_OUT 56 -#define COMBO_STARTER_PSYCHIC 57 -#define COMBO_STARTER_KINESIS 58 -#define COMBO_STARTER_CONFUSION 59 -#define COMBO_STARTER_POUND 60 -#define COMBO_STARTER_SMOG 61 -#define COMBO_STARTER_CALM_MIND 62 +#define COMBO_STARTER_POUND 1 +#define COMBO_STARTER_FIRE_PUNCH 2 +#define COMBO_STARTER_ICE_PUNCH 3 +#define COMBO_STARTER_THUNDER_PUNCH 4 +#define COMBO_STARTER_SCRATCH 5 +#define COMBO_STARTER_VICE_GRIP 6 +#define COMBO_STARTER_SWORDS_DANCE 7 +#define COMBO_STARTER_SAND_ATTACK 8 +#define COMBO_STARTER_HORN_ATTACK 9 +#define COMBO_STARTER_LEER 10 +#define COMBO_STARTER_SING 11 +#define COMBO_STARTER_SURF 12 +#define COMBO_STARTER_PECK 13 +#define COMBO_STARTER_LEECH_SEED 14 +#define COMBO_STARTER_GROWTH 15 +#define COMBO_STARTER_STRING_SHOT 16 +#define COMBO_STARTER_DRAGON_RAGE 17 +#define COMBO_STARTER_ROCK_THROW 18 +#define COMBO_STARTER_EARTHQUAKE 19 +#define COMBO_STARTER_TOXIC 20 +#define COMBO_STARTER_CONFUSION 21 +#define COMBO_STARTER_PSYCHIC 22 +#define COMBO_STARTER_HYPNOSIS 23 +#define COMBO_STARTER_RAGE 24 +#define COMBO_STARTER_DOUBLE_TEAM 25 +#define COMBO_STARTER_HARDEN 26 +#define COMBO_STARTER_DEFENSE_CURL 27 +#define COMBO_STARTER_FOCUS_ENERGY 28 +#define COMBO_STARTER_SMOG 29 +#define COMBO_STARTER_SLUDGE 30 +#define COMBO_STARTER_BONE_CLUB 31 +#define COMBO_STARTER_KINESIS 32 +#define COMBO_STARTER_SOFT_BOILED 33 +#define COMBO_STARTER_BONEMERANG 34 +#define COMBO_STARTER_REST 35 +#define COMBO_STARTER_MIND_READER 36 +#define COMBO_STARTER_CURSE 37 +#define COMBO_STARTER_POWDER_SNOW 38 +#define COMBO_STARTER_SCARY_FACE 39 +#define COMBO_STARTER_BELLY_DRUM 40 +#define COMBO_STARTER_SLUDGE_BOMB 41 +#define COMBO_STARTER_MUD_SLAP 42 +#define COMBO_STARTER_BONE_RUSH 43 +#define COMBO_STARTER_LOCK_ON 44 +#define COMBO_STARTER_SANDSTORM 45 +#define COMBO_STARTER_ENDURE 46 +#define COMBO_STARTER_CHARM 47 +#define COMBO_STARTER_MEAN_LOOK 48 +#define COMBO_STARTER_HEAL_BELL 49 +#define COMBO_STARTER_DRAGON_BREATH 50 +#define COMBO_STARTER_SWEET_SCENT 51 +#define COMBO_STARTER_RAIN_DANCE 52 +#define COMBO_STARTER_SUNNY_DAY 53 +#define COMBO_STARTER_FAKE_OUT 54 +#define COMBO_STARTER_STOCKPILE 55 +#define COMBO_STARTER_HAIL 56 +#define COMBO_STARTER_CHARGE 57 +#define COMBO_STARTER_TAUNT 58 +#define COMBO_STARTER_REVENGE 59 +#define COMBO_STARTER_YAWN 60 +#define COMBO_STARTER_DIVE 61 +#define COMBO_STARTER_MUD_SPORT 62 +#define COMBO_STARTER_METAL_SOUND 63 +#define COMBO_STARTER_WATER_SPORT 64 +#define COMBO_STARTER_CALM_MIND 65 +#define COMBO_STARTER_DRAGON_DANCE 66 +#define COMBO_STARTER_PAYBACK 67 +#define COMBO_STARTER_LUCKY_CHANT 68 +#define COMBO_STARTER_WORRY_SEED 69 +#define COMBO_STARTER_DRAGON_RUSH 70 +#define COMBO_STARTER_BRAVE_BIRD 71 +#define COMBO_STARTER_THUNDER_FANG 72 +#define COMBO_STARTER_ICE_FANG 73 +#define COMBO_STARTER_FIRE_FANG 74 +#define COMBO_STARTER_ATTACK_ORDER 75 +#define COMBO_STARTER_DEFEND_ORDER 76 +#define COMBO_STARTER_HEAL_ORDER 77 +#define COMBO_STARTER_SCALD 78 +#define COMBO_STARTER_DRAGON_TAIL 79 +#define COMBO_STARTER_HYPERSPACE_HOLE 80 +#define COMBO_STARTER_THOUSAND_ARROWS 81 +#define COMBO_STARTER_THOUSAND_WAVES 82 +#define COMBO_STARTER_HYPERSPACE_FURY 83 +#define COMBO_STARTER_SHADOW_BONE 84 #endif // GUARD_CONSTANTS_CONTEST_H diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index b653f5a92f..bdf042d637 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -69,4 +69,72 @@ #define HOLD_EFFECT_THICK_CLUB 65 #define HOLD_EFFECT_STICK 66 +// Gen4 hold effects. +#define HOLD_EFFECT_CHOICE_SCARF 67 +#define HOLD_EFFECT_CHOICE_SPECS 68 +#define HOLD_EFFECT_DAMP_ROCK 69 +#define HOLD_EFFECT_GRIP_CLAW 70 +#define HOLD_EFFECT_HEAT_ROCK 71 +#define HOLD_EFFECT_ICY_ROCK 72 +#define HOLD_EFFECT_LIGHT_CLAY 73 +#define HOLD_EFFECT_SMOOTH_ROCK 74 +#define HOLD_EFFECT_POWER_HERB 75 +#define HOLD_EFFECT_BIG_ROOT 76 +#define HOLD_EFFECT_EXPERT_BELT 77 +#define HOLD_EFFECT_LIFE_ORB 78 +#define HOLD_EFFECT_METRONOME 79 +#define HOLD_EFFECT_MUSCLE_BAND 80 +#define HOLD_EFFECT_WIDE_LENS 81 +#define HOLD_EFFECT_WISE_GLASSES 82 +#define HOLD_EFFECT_ZOOM_LENS 83 +#define HOLD_EFFECT_LAGGING_TAIL 84 +#define HOLD_EFFECT_FOCUS_SASH 85 +#define HOLD_EFFECT_FLAME_ORB 86 +#define HOLD_EFFECT_TOXIC_ORB 87 +#define HOLD_EFFECT_STICKY_BARB 88 +#define HOLD_EFFECT_IRON_BALL 89 +#define HOLD_EFFECT_BLACK_SLUDGE 90 +#define HOLD_EFFECT_DESTINY_KNOT 91 +#define HOLD_EFFECT_SHED_SHELL 92 +#define HOLD_EFFECT_QUICK_POWDER 93 +#define HOLD_EFFECT_ADAMANT_ORB 94 +#define HOLD_EFFECT_LUSTROUS_ORB 95 +#define HOLD_EFFECT_GRISEOUS_ORB 96 +#define HOLD_EFFECT_GRACIDEA 97 +#define HOLD_EFFECT_RESIST_BERRY 98 +#define HOLD_EFFECT_EV_BOOST 99 +#define HOLD_EFFECT_RESTORE_PCT_HP 100 + +// Gen5 hold effects +#define HOLD_EFFECT_FLOAT_STONE 115 +#define HOLD_EFFECT_EVIOLITE 116 +#define HOLD_EFFECT_ASSAULT_VEST 117 +#define HOLD_EFFECT_DRIVE 118 +#define HOLD_EFFECT_GEMS 119 +#define HOLD_EFFECT_ROCKY_HELMET 120 +#define HOLD_EFFECT_AIR_BALLOON 121 +#define HOLD_EFFECT_RED_CARD 122 +#define HOLD_EFFECT_RING_TARGET 123 +#define HOLD_EFFECT_BINDING_BAND 124 +#define HOLD_EFFECT_EJECT_BUTTON 125 +#define HOLD_EFFECT_ABSORB_BULB 126 +#define HOLD_EFFECT_CELL_BATTERY 127 + +// Gen6 hold effects +#define HOLD_EFFECT_FAIRY_POWER 129 +#define HOLD_EFFECT_MEGA_STONE 130 +#define HOLD_EFFECT_SAFETY_GOOGLES 131 +#define HOLD_EFFECT_LUMINOUS_MOSS 132 +#define HOLD_EFFECT_SNOWBALL 133 +#define HOLD_EFFECT_WEAKNESS_POLICY 134 + +// Gen7 hold effects +#define HOLD_EFFECT_PROTECTIVE_PADS 149 +#define HOLD_EFFECT_TERRAIN_EXTENDER 150 +#define HOLD_EFFECT_SEEDS 151 +#define HOLD_EFFECT_ADRENALINE_ORB 152 +#define HOLD_EFFECT_MEMORY 153 + +#define HOLD_EFFECT_CHOICE(holdEffect)((holdEffect == HOLD_EFFECT_CHOICE_BAND || holdEffect == HOLD_EFFECT_CHOICE_SCARF || holdEffect == HOLD_EFFECT_CHOICE_SPECS)) + #endif // GUARD_HOLD_EFFECTS_H diff --git a/include/constants/moves.h b/include/constants/moves.h index 85c02e3da5..e3438f5f20 100644 --- a/include/constants/moves.h +++ b/include/constants/moves.h @@ -357,6 +357,385 @@ #define MOVE_DOOM_DESIRE 353 #define MOVE_PSYCHO_BOOST 354 -#define MOVES_COUNT 355 +#define MOVES_COUNT_GEN3 355 + +// Gen4 moves. +#define MOVE_ROOST 355 +#define MOVE_GRAVITY 356 +#define MOVE_MIRACLE_EYE 357 +#define MOVE_WAKE_UP_SLAP 358 +#define MOVE_HAMMER_ARM 359 +#define MOVE_GYRO_BALL 360 +#define MOVE_HEALING_WISH 361 +#define MOVE_BRINE 362 +#define MOVE_NATURAL_GIFT 363 +#define MOVE_FEINT 364 +#define MOVE_PLUCK 365 +#define MOVE_TAILWIND 366 +#define MOVE_ACUPRESSURE 367 +#define MOVE_METAL_BURST 368 +#define MOVE_U_TURN 369 +#define MOVE_CLOSE_COMBAT 370 +#define MOVE_PAYBACK 371 +#define MOVE_ASSURANCE 372 +#define MOVE_EMBARGO 373 +#define MOVE_FLING 374 +#define MOVE_PSYCHO_SHIFT 375 +#define MOVE_TRUMP_CARD 376 +#define MOVE_HEAL_BLOCK 377 +#define MOVE_WRING_OUT 378 +#define MOVE_POWER_TRICK 379 +#define MOVE_GASTRO_ACID 380 +#define MOVE_LUCKY_CHANT 381 +#define MOVE_ME_FIRST 382 +#define MOVE_COPYCAT 383 +#define MOVE_POWER_SWAP 384 +#define MOVE_GUARD_SWAP 385 +#define MOVE_PUNISHMENT 386 +#define MOVE_LAST_RESORT 387 +#define MOVE_WORRY_SEED 388 +#define MOVE_SUCKER_PUNCH 389 +#define MOVE_TOXIC_SPIKES 390 +#define MOVE_HEART_SWAP 391 +#define MOVE_AQUA_RING 392 +#define MOVE_MAGNET_RISE 393 +#define MOVE_FLARE_BLITZ 394 +#define MOVE_FORCE_PALM 395 +#define MOVE_AURA_SPHERE 396 +#define MOVE_ROCK_POLISH 397 +#define MOVE_POISON_JAB 398 +#define MOVE_DARK_PULSE 399 +#define MOVE_NIGHT_SLASH 400 +#define MOVE_AQUA_TAIL 401 +#define MOVE_SEED_BOMB 402 +#define MOVE_AIR_SLASH 403 +#define MOVE_X_SCISSOR 404 +#define MOVE_BUG_BUZZ 405 +#define MOVE_DRAGON_PULSE 406 +#define MOVE_DRAGON_RUSH 407 +#define MOVE_POWER_GEM 408 +#define MOVE_DRAIN_PUNCH 409 +#define MOVE_VACUUM_WAVE 410 +#define MOVE_FOCUS_BLAST 411 +#define MOVE_ENERGY_BALL 412 +#define MOVE_BRAVE_BIRD 413 +#define MOVE_EARTH_POWER 414 +#define MOVE_SWITCHEROO 415 +#define MOVE_GIGA_IMPACT 416 +#define MOVE_NASTY_PLOT 417 +#define MOVE_BULLET_PUNCH 418 +#define MOVE_AVALANCHE 419 +#define MOVE_ICE_SHARD 420 +#define MOVE_SHADOW_CLAW 421 +#define MOVE_THUNDER_FANG 422 +#define MOVE_ICE_FANG 423 +#define MOVE_FIRE_FANG 424 +#define MOVE_SHADOW_SNEAK 425 +#define MOVE_MUD_BOMB 426 +#define MOVE_PSYCHO_CUT 427 +#define MOVE_ZEN_HEADBUTT 428 +#define MOVE_MIRROR_SHOT 429 +#define MOVE_FLASH_CANNON 430 +#define MOVE_ROCK_CLIMB 431 +#define MOVE_DEFOG 432 +#define MOVE_TRICK_ROOM 433 +#define MOVE_DRACO_METEOR 434 +#define MOVE_DISCHARGE 435 +#define MOVE_LAVA_PLUME 436 +#define MOVE_LEAF_STORM 437 +#define MOVE_POWER_WHIP 438 +#define MOVE_ROCK_WRECKER 439 +#define MOVE_CROSS_POISON 440 +#define MOVE_GUNK_SHOT 441 +#define MOVE_IRON_HEAD 442 +#define MOVE_MAGNET_BOMB 443 +#define MOVE_STONE_EDGE 444 +#define MOVE_CAPTIVATE 445 +#define MOVE_STEALTH_ROCK 446 +#define MOVE_GRASS_KNOT 447 +#define MOVE_CHATTER 448 +#define MOVE_JUDGMENT 449 +#define MOVE_BUG_BITE 450 +#define MOVE_CHARGE_BEAM 451 +#define MOVE_WOOD_HAMMER 452 +#define MOVE_AQUA_JET 453 +#define MOVE_ATTACK_ORDER 454 +#define MOVE_DEFEND_ORDER 455 +#define MOVE_HEAL_ORDER 456 +#define MOVE_HEAD_SMASH 457 +#define MOVE_DOUBLE_HIT 458 +#define MOVE_ROAR_OF_TIME 459 +#define MOVE_SPACIAL_REND 460 +#define MOVE_LUNAR_DANCE 461 +#define MOVE_CRUSH_GRIP 462 +#define MOVE_MAGMA_STORM 463 +#define MOVE_DARK_VOID 464 +#define MOVE_SEED_FLARE 465 +#define MOVE_OMINOUS_WIND 466 +#define MOVE_SHADOW_FORCE 467 + +#define MOVES_COUNT_GEN4 468 + +// Gen5 moves. +#define MOVE_HONE_CLAWS 468 +#define MOVE_WIDE_GUARD 469 +#define MOVE_GUARD_SPLIT 470 +#define MOVE_POWER_SPLIT 471 +#define MOVE_WONDER_ROOM 472 +#define MOVE_PSYSHOCK 473 +#define MOVE_VENOSHOCK 474 +#define MOVE_AUTOTOMIZE 475 +#define MOVE_RAGE_POWDER 476 +#define MOVE_TELEKINESIS 477 +#define MOVE_MAGIC_ROOM 478 +#define MOVE_SMACK_DOWN 479 +#define MOVE_STORM_THROW 480 +#define MOVE_FLAME_BURST 481 +#define MOVE_SLUDGE_WAVE 482 +#define MOVE_QUIVER_DANCE 483 +#define MOVE_HEAVY_SLAM 484 +#define MOVE_SYNCHRONOISE 485 +#define MOVE_ELECTRO_BALL 486 +#define MOVE_SOAK 487 +#define MOVE_FLAME_CHARGE 488 +#define MOVE_COIL 489 +#define MOVE_LOW_SWEEP 490 +#define MOVE_ACID_SPRAY 491 +#define MOVE_FOUL_PLAY 492 +#define MOVE_SIMPLE_BEAM 493 +#define MOVE_ENTRAINMENT 494 +#define MOVE_AFTER_YOU 495 +#define MOVE_ROUND 496 +#define MOVE_ECHOED_VOICE 497 +#define MOVE_CHIP_AWAY 498 +#define MOVE_CLEAR_SMOG 499 +#define MOVE_STORED_POWER 500 +#define MOVE_QUICK_GUARD 501 +#define MOVE_ALLY_SWITCH 502 +#define MOVE_SCALD 503 +#define MOVE_SHELL_SMASH 504 +#define MOVE_HEAL_PULSE 505 +#define MOVE_HEX 506 +#define MOVE_SKY_DROP 507 +#define MOVE_SHIFT_GEAR 508 +#define MOVE_CIRCLE_THROW 509 +#define MOVE_INCINERATE 510 +#define MOVE_QUASH 511 +#define MOVE_ACROBATICS 512 +#define MOVE_REFLECT_TYPE 513 +#define MOVE_RETALIATE 514 +#define MOVE_FINAL_GAMBIT 515 +#define MOVE_BESTOW 516 +#define MOVE_INFERNO 517 +#define MOVE_WATER_PLEDGE 518 +#define MOVE_FIRE_PLEDGE 519 +#define MOVE_GRASS_PLEDGE 520 +#define MOVE_VOLT_SWITCH 521 +#define MOVE_STRUGGLE_BUG 522 +#define MOVE_BULLDOZE 523 +#define MOVE_FROST_BREATH 524 +#define MOVE_DRAGON_TAIL 525 +#define MOVE_WORK_UP 526 +#define MOVE_ELECTROWEB 527 +#define MOVE_WILD_CHARGE 528 +#define MOVE_DRILL_RUN 529 +#define MOVE_DUAL_CHOP 530 +#define MOVE_HEART_STAMP 531 +#define MOVE_HORN_LEECH 532 +#define MOVE_SACRED_SWORD 533 +#define MOVE_RAZOR_SHELL 534 +#define MOVE_HEAT_CRASH 535 +#define MOVE_LEAF_TORNADO 536 +#define MOVE_STEAMROLLER 537 +#define MOVE_COTTON_GUARD 538 +#define MOVE_NIGHT_DAZE 539 +#define MOVE_PSYSTRIKE 540 +#define MOVE_TAIL_SLAP 541 +#define MOVE_HURRICANE 542 +#define MOVE_HEAD_CHARGE 543 +#define MOVE_GEAR_GRIND 544 +#define MOVE_SEARING_SHOT 545 +#define MOVE_TECHNO_BLAST 546 +#define MOVE_RELIC_SONG 547 +#define MOVE_SECRET_SWORD 548 +#define MOVE_GLACIATE 549 +#define MOVE_BOLT_STRIKE 550 +#define MOVE_BLUE_FLARE 551 +#define MOVE_FIERY_DANCE 552 +#define MOVE_FREEZE_SHOCK 553 +#define MOVE_ICE_BURN 554 +#define MOVE_SNARL 555 +#define MOVE_ICICLE_CRASH 556 +#define MOVE_V_CREATE 557 +#define MOVE_FUSION_FLARE 558 +#define MOVE_FUSION_BOLT 559 + +#define MOVES_COUNT_GEN5 560 + +// Gen6 moves. +#define MOVE_FLYING_PRESS 560 +#define MOVE_MAT_BLOCK 561 +#define MOVE_BELCH 562 +#define MOVE_ROTOTILLER 563 +#define MOVE_STICKY_WEB 564 +#define MOVE_FELL_STINGER 565 +#define MOVE_PHANTOM_FORCE 566 +#define MOVE_TRICK_OR_TREAT 567 +#define MOVE_NOBLE_ROAR 568 +#define MOVE_ION_DELUGE 569 +#define MOVE_PARABOLIC_CHARGE 570 +#define MOVE_FORESTS_CURSE 571 +#define MOVE_PETAL_BLIZZARD 572 +#define MOVE_FREEZE_DRY 573 +#define MOVE_DISARMING_VOICE 574 +#define MOVE_PARTING_SHOT 575 +#define MOVE_TOPSY_TURVY 576 +#define MOVE_DRAINING_KISS 577 +#define MOVE_CRAFTY_SHIELD 578 +#define MOVE_FLOWER_SHIELD 579 +#define MOVE_GRASSY_TERRAIN 580 +#define MOVE_MISTY_TERRAIN 581 +#define MOVE_ELECTRIFY 582 +#define MOVE_PLAY_ROUGH 583 +#define MOVE_FAIRY_WIND 584 +#define MOVE_MOONBLAST 585 +#define MOVE_BOOMBURST 586 +#define MOVE_FAIRY_LOCK 587 +#define MOVE_KINGS_SHIELD 588 +#define MOVE_PLAY_NICE 589 +#define MOVE_CONFIDE 590 +#define MOVE_DIAMOND_STORM 591 +#define MOVE_STEAM_ERUPTION 592 +#define MOVE_HYPERSPACE_HOLE 593 +#define MOVE_WATER_SHURIKEN 594 +#define MOVE_MYSTICAL_FIRE 595 +#define MOVE_SPIKY_SHIELD 596 +#define MOVE_AROMATIC_MIST 597 +#define MOVE_EERIE_IMPULSE 598 +#define MOVE_VENOM_DRENCH 599 +#define MOVE_POWDER 600 +#define MOVE_GEOMANCY 601 +#define MOVE_MAGNETIC_FLUX 602 +#define MOVE_HAPPY_HOUR 603 +#define MOVE_ELECTRIC_TERRAIN 604 +#define MOVE_DAZZLING_GLEAM 605 +#define MOVE_CELEBRATE 606 +#define MOVE_HOLD_HANDS 607 +#define MOVE_BABY_DOLL_EYES 608 +#define MOVE_NUZZLE 609 +#define MOVE_HOLD_BACK 610 +#define MOVE_INFESTATION 611 +#define MOVE_POWER_UP_PUNCH 612 +#define MOVE_OBLIVION_WING 613 +#define MOVE_THOUSAND_ARROWS 614 +#define MOVE_THOUSAND_WAVES 615 +#define MOVE_LANDS_WRATH 616 +#define MOVE_LIGHT_OF_RUIN 617 +#define MOVE_ORIGIN_PULSE 618 +#define MOVE_PRECIPICE_BLADES 619 +#define MOVE_DRAGON_ASCENT 620 +#define MOVE_HYPERSPACE_FURY 621 + +#define MOVES_COUNT_GEN6 622 + +// Gen7 moves. +#define MOVE_SHORE_UP 622 +#define MOVE_FIRST_IMPRESSION 623 +#define MOVE_BANEFUL_BUNKER 624 +#define MOVE_SPIRIT_SHACKLE 625 +#define MOVE_DARKEST_LARIAT 626 +#define MOVE_SPARKLING_ARIA 627 +#define MOVE_ICE_HAMMER 628 +#define MOVE_FLORAL_HEALING 629 +#define MOVE_HIGH_HORSEPOWER 630 +#define MOVE_STRENGTH_SAP 631 +#define MOVE_SOLAR_BLADE 632 +#define MOVE_LEAFAGE 633 +#define MOVE_SPOTLIGHT 634 +#define MOVE_TOXIC_THREAD 635 +#define MOVE_LASER_FOCUS 636 +#define MOVE_GEAR_UP 637 +#define MOVE_THROAT_CHOP 638 +#define MOVE_POLLEN_PUFF 639 +#define MOVE_ANCHOR_SHOT 640 +#define MOVE_PSYCHIC_TERRAIN 641 +#define MOVE_LUNGE 642 +#define MOVE_FIRE_LASH 643 +#define MOVE_POWER_TRIP 644 +#define MOVE_BURN_UP 645 +#define MOVE_SPEED_SWAP 646 +#define MOVE_SMART_STRIKE 647 +#define MOVE_PURIFY 648 +#define MOVE_REVELATION_DANCE 649 +#define MOVE_CORE_ENFORCER 650 +#define MOVE_TROP_KICK 651 +#define MOVE_INSTRUCT 652 +#define MOVE_BEAK_BLAST 653 +#define MOVE_CLANGING_SCALES 654 +#define MOVE_DRAGON_HAMMER 655 +#define MOVE_BRUTAL_SWING 656 +#define MOVE_AURORA_VEIL 657 +#define MOVE_SHELL_TRAP 658 +#define MOVE_FLEUR_CANNON 659 +#define MOVE_PSYCHIC_FANGS 660 +#define MOVE_STOMPING_TANTRUM 661 +#define MOVE_SHADOW_BONE 662 +#define MOVE_ACCELEROCK 663 +#define MOVE_LIQUIDATION 664 +#define MOVE_PRISMATIC_LASER 665 +#define MOVE_SPECTRAL_THIEF 666 +#define MOVE_SUNSTEEL_STRIKE 667 +#define MOVE_MOONGEIST_BEAM 668 +#define MOVE_TEARFUL_LOOK 669 +#define MOVE_ZING_ZAP 670 +#define MOVE_NATURES_MADNESS 671 +#define MOVE_MULTI_ATTACK 672 +#define MOVE_MIND_BLOWN 673 +#define MOVE_PLASMA_FISTS 674 +#define MOVE_PHOTON_GEYSER 675 +#define MOVE_DOUBLE_IRON_BASH 676 + +#define MOVES_COUNT_GEN7 677 + +// Gen 8 moves. +#define MOVE_DYNAMAX_CANNON (MOVES_COUNT_GEN7 + 0) +#define MOVE_SNIPE_SHOT (MOVES_COUNT_GEN7 + 1) +#define MOVE_JAW_LOCK (MOVES_COUNT_GEN7 + 2) +#define MOVE_STUFF_CHEEKS (MOVES_COUNT_GEN7 + 3) +#define MOVE_NO_RETREAT (MOVES_COUNT_GEN7 + 4) +#define MOVE_TAR_SHOT (MOVES_COUNT_GEN7 + 5) +#define MOVE_MAGIC_POWDER (MOVES_COUNT_GEN7 + 6) +#define MOVE_DRAGON_DARTS (MOVES_COUNT_GEN7 + 7) +#define MOVE_TEATIME (MOVES_COUNT_GEN7 + 8) +#define MOVE_OCTOLOCK (MOVES_COUNT_GEN7 + 9) +#define MOVE_BOLT_BEAK (MOVES_COUNT_GEN7 + 10) +#define MOVE_FISHIOUS_REND (MOVES_COUNT_GEN7 + 11) +#define MOVE_COURT_CHANGE (MOVES_COUNT_GEN7 + 12) +#define MOVE_CLANGOROUS_SOUL (MOVES_COUNT_GEN7 + 13) +#define MOVE_BODY_PRESS (MOVES_COUNT_GEN7 + 14) +#define MOVE_DECORATE (MOVES_COUNT_GEN7 + 15) +#define MOVE_DRUM_BEATING (MOVES_COUNT_GEN7 + 16) +#define MOVE_SNAP_TRAP (MOVES_COUNT_GEN7 + 17) +#define MOVE_PYRO_BALL (MOVES_COUNT_GEN7 + 18) +#define MOVE_BEHEMOTH_BLADE (MOVES_COUNT_GEN7 + 19) +#define MOVE_BEHEMOTH_BASH (MOVES_COUNT_GEN7 + 20) +#define MOVE_AURA_WHEEL (MOVES_COUNT_GEN7 + 21) +#define MOVE_BREAKING_SWIPE (MOVES_COUNT_GEN7 + 22) +#define MOVE_BRANCH_POKE (MOVES_COUNT_GEN7 + 23) +#define MOVE_OVERDRIVE (MOVES_COUNT_GEN7 + 24) +#define MOVE_APPLE_ACID (MOVES_COUNT_GEN7 + 25) +#define MOVE_GRAV_APPLE (MOVES_COUNT_GEN7 + 26) +#define MOVE_SPIRIT_BREAK (MOVES_COUNT_GEN7 + 27) +#define MOVE_STRANGE_STEAM (MOVES_COUNT_GEN7 + 28) +#define MOVE_LIFE_DEW (MOVES_COUNT_GEN7 + 29) +#define MOVE_OBSTRUCT (MOVES_COUNT_GEN7 + 30) +#define MOVE_FALSE_SURRENDER (MOVES_COUNT_GEN7 + 31) +#define MOVE_METEOR_ASSAULT (MOVES_COUNT_GEN7 + 32) +#define MOVE_ETERNABEAM (MOVES_COUNT_GEN7 + 33) +#define MOVE_STEEL_BEAM (MOVES_COUNT_GEN7 + 34) + +#define MOVES_COUNT_GEN8 (MOVES_COUNT_GEN7 + 35) + +#define MOVES_COUNT MOVES_COUNT_GEN8 #endif // GUARD_CONSTANTS_MOVES_H diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 4cf0bd4f03..480a37f03a 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -21,7 +21,8 @@ #define TYPE_ICE 15 #define TYPE_DRAGON 16 #define TYPE_DARK 17 -#define NUMBER_OF_MON_TYPES 18 +#define TYPE_FAIRY 18 +#define NUMBER_OF_MON_TYPES 19 // Pokemon egg groups #define EGG_GROUP_NONE 0 @@ -245,6 +246,29 @@ #define FLAG_SNATCH_AFFECTED (1 << 3) #define FLAG_MIRROR_MOVE_AFFECTED (1 << 4) #define FLAG_KINGSROCK_AFFECTED (1 << 5) +#define FLAG_HIGH_CRIT (1 << 6) +#define FLAG_RECKLESS_BOOST (1 << 7) +#define FLAG_IRON_FIST_BOOST (1 << 8) +#define FLAG_SHEER_FORCE_BOOST (1 << 9) +#define FLAG_STRONG_JAW_BOOST (1 << 10) +#define FLAG_MEGA_LAUNCHER_BOOST (1 << 11) +#define FLAG_STAT_STAGES_IGNORED (1 << 12) +#define FLAG_DMG_MINIMIZE (1 << 13) +#define FLAG_DMG_UNDERGROUND (1 << 14) +#define FLAG_DMG_UNDERWATER (1 << 15) +#define FLAG_SOUND (1 << 16) +#define FLAG_BALLISTIC (1 << 17) +#define FLAG_PROTECTION_MOVE (1 << 18) +#define FLAG_POWDER (1 << 19) +#define FLAG_TARGET_ABILITY_IGNORED (1 << 20) +#define FLAG_DANCE (1 << 21) +#define FLAG_DMG_IN_AIR (1 << 22) // X2 dmg on air, always hits target on air +#define FLAG_HIT_IN_AIR (1 << 23) // dmg is normal, always hits target on air + +// Split defines. +#define SPLIT_PHYSICAL 0x0 +#define SPLIT_SPECIAL 0x1 +#define SPLIT_STATUS 0x2 // Growth rates #define GROWTH_MEDIUM_FAST 0 @@ -269,21 +293,22 @@ #define F_SUMMARY_SCREEN_FLIP_SPRITE 0x80 // Evolution types -#define EVO_FRIENDSHIP 1 // Pokémon levels up with friendship ≥ 220 -#define EVO_FRIENDSHIP_DAY 2 // Pokémon levels up during the day with friendship ≥ 220 -#define EVO_FRIENDSHIP_NIGHT 3 // Pokémon levels up at night with friendship ≥ 220 -#define EVO_LEVEL 4 // Pokémon reaches the specified level -#define EVO_TRADE 5 // Pokémon is traded -#define EVO_TRADE_ITEM 6 // Pokémon is traded while it's holding the specified item -#define EVO_ITEM 7 // specified item is used on Pokémon -#define EVO_LEVEL_ATK_GT_DEF 8 // Pokémon reaches the specified level with attack > defense -#define EVO_LEVEL_ATK_EQ_DEF 9 // Pokémon reaches the specified level with attack = defense -#define EVO_LEVEL_ATK_LT_DEF 10 // Pokémon reaches the specified level with attack < defense -#define EVO_LEVEL_SILCOON 11 // Pokémon reaches the specified level with a Silcoon personality value -#define EVO_LEVEL_CASCOON 12 // Pokémon reaches the specified level with a Cascoon personality value -#define EVO_LEVEL_NINJASK 13 // Pokémon reaches the specified level (special value for Ninjask) -#define EVO_LEVEL_SHEDINJA 14 // Pokémon reaches the specified level (special value for Shedinja) -#define EVO_BEAUTY 15 // Pokémon levels up with beauty ≥ specified value +#define EVO_MEGA_EVOLUTION 0xffff // Not an actual evolution, used to temporarily mega evolve in battle. +#define EVO_FRIENDSHIP 1 // Pokémon levels up with friendship ≥ 220 +#define EVO_FRIENDSHIP_DAY 2 // Pokémon levels up during the day with friendship ≥ 220 +#define EVO_FRIENDSHIP_NIGHT 3 // Pokémon levels up at night with friendship ≥ 220 +#define EVO_LEVEL 4 // Pokémon reaches the specified level +#define EVO_TRADE 5 // Pokémon is traded +#define EVO_TRADE_ITEM 6 // Pokémon is traded while it's holding the specified item +#define EVO_ITEM 7 // specified item is used on Pokémon +#define EVO_LEVEL_ATK_GT_DEF 8 // Pokémon reaches the specified level with attack > defense +#define EVO_LEVEL_ATK_EQ_DEF 9 // Pokémon reaches the specified level with attack = defense +#define EVO_LEVEL_ATK_LT_DEF 10 // Pokémon reaches the specified level with attack < defense +#define EVO_LEVEL_SILCOON 11 // Pokémon reaches the specified level with a Silcoon personality value +#define EVO_LEVEL_CASCOON 12 // Pokémon reaches the specified level with a Cascoon personality value +#define EVO_LEVEL_NINJASK 13 // Pokémon reaches the specified level (special value for Ninjask) +#define EVO_LEVEL_SHEDINJA 14 // Pokémon reaches the specified level (special value for Shedinja) +#define EVO_BEAUTY 15 // Pokémon levels up with beauty ≥ specified value #define EVOS_PER_MON 5 diff --git a/include/constants/trainers.h b/include/constants/trainers.h index 3f22c7cef5..0c8503f7b5 100644 --- a/include/constants/trainers.h +++ b/include/constants/trainers.h @@ -15,6 +15,7 @@ #define TRAINER_LINK_OPPONENT 2048 #define TRAINER_UNION_ROOM 3072 #define TRAINER_STEVEN_PARTNER 3075 +#define TRAINER_CUSTOM_PARTNER 3076 #define TRAINER_PIC_HIKER 0 #define TRAINER_PIC_AQUA_GRUNT_M 1 diff --git a/include/contest_effect.h b/include/contest_effect.h index 0474cb38cc..9089207acd 100644 --- a/include/contest_effect.h +++ b/include/contest_effect.h @@ -1,12 +1,13 @@ #ifndef GUARD_CONTEST_EFFECT_H #define GUARD_CONTEST_EFFECT_H +#define MAX_COMBO_MOVES 5 struct ContestMove { u8 effect; u8 contestCategory:3; u8 comboStarterId; - u8 comboMoves[4]; + u8 comboMoves[MAX_COMBO_MOVES]; }; struct ContestEffect diff --git a/include/global.h b/include/global.h index f5781bcb4d..b9ec85adec 100644 --- a/include/global.h +++ b/include/global.h @@ -53,6 +53,7 @@ // Converts a number to Q4.12 fixed-point format #define Q_4_12(n) ((s16)((n) * 4096)) +#define UQ_4_12(n) ((u16)((n) * 4096)) // Converts a number to Q24.8 fixed-point format #define Q_24_8(n) ((s32)((n) << 8)) @@ -62,10 +63,17 @@ // Converts a Q4.12 fixed-point format number to a regular integer #define Q_4_12_TO_INT(n) ((int)((n) / 4096)) +#define UQ_4_12_TO_INT(n) ((int)((n) / 4096)) // Converts a Q24.8 fixed-point format number to a regular integer #define Q_24_8_TO_INT(n) ((int)((n) >> 8)) +// Rounding value for Q4.12 fixed-point format +#define Q_4_12_ROUND ((1) << (12 - 1)) +#define UQ_4_12_ROUND ((1) << (12 - 1)) + +#define POKEMON_SLOTS_NUMBER 412 + #define min(a, b) ((a) < (b) ? (a) : (b)) #define max(a, b) ((a) >= (b) ? (a) : (b)) diff --git a/include/graphics.h b/include/graphics.h index 32268d6dbd..1e6c5b522a 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -4152,6 +4152,8 @@ extern const u32 gBattleAnimSpriteGfx_AirWave[]; extern const u32 gBattleAnimSpriteGfx_Orb[]; extern const u32 gBattleAnimSpriteGfx_Sword[]; extern const u32 gBattleAnimSpriteGfx_Seed[]; +extern const u32 gBattleAnimSpriteGfx_SeedBrown[]; +extern const u32 gBattleAnimSpriteGfx_Feint[]; extern const u32 gBattleAnimSpriteGfx_Explosion6[]; extern const u32 gBattleAnimSpriteGfx_PinkOrb[]; extern const u32 gBattleAnimSpriteGfx_Gust[]; @@ -4424,6 +4426,21 @@ extern const u32 gBattleAnimBgTilemap_ScaryFaceOpponent[]; extern const u32 gBattleAnimBgTilemap_ScaryFaceContest[]; extern const u32 gBattleAnimSpriteGfx_Bird[]; extern const u32 gBattleAnimSpriteGfx_CrossImpact[]; +extern const u32 gBattleAnimSpriteGfx_TrumpCard[]; +extern const u32 gBattleAnimSpriteGfx_TrumpCardParticles[]; +extern const u32 gBattleAnimSpriteGfx_Accupressure[]; +extern const u32 gBattleAnimSpriteGfx_WringOut[]; +extern const u32 gBattleAnimSpriteGfx_ColoredOrbs[]; +extern const u32 gBattleAnimSpriteGfx_WorrySeed[]; +extern const u32 gBattleAnimSpriteGfx_SmallCloud[]; +extern const u32 gBattleAnimSpriteGfx_AttackOrder[]; +extern const u32 gBattleAnimSpriteGfx_DragonPulse[]; +extern const u32 gBattleAnimSpriteGfx_WoodHammer[]; +extern const u32 gBattleAnimSpriteGfx_PsychoCut[]; +extern const u32 gBattleAnimSpriteGfx_PowerGem[]; +extern const u32 gBattleAnimSpriteGfx_StoneEdge[]; +extern const u32 gBattleAnimSpriteGfx_StealthRock[]; +extern const u32 gBattleAnimSpriteGfx_PoisonJab[]; extern const u32 gBattleAnimSpritePal_Bone[]; extern const u32 gBattleAnimSpritePal_Spark[]; @@ -4432,6 +4449,8 @@ extern const u32 gBattleAnimSpritePal_AirWave[]; extern const u32 gBattleAnimSpritePal_Orb[]; extern const u32 gBattleAnimSpritePal_Sword[]; extern const u32 gBattleAnimSpritePal_Seed[]; +extern const u32 gBattleAnimSpritePal_SeedBrown[]; +extern const u32 gBattleAnimSpritePal_Feint[]; extern const u32 gBattleAnimSpritePal_Explosion6[]; extern const u32 gBattleAnimSpritePal_PinkOrb[]; extern const u32 gBattleAnimSpritePal_Gust[]; @@ -4707,6 +4726,196 @@ extern const u32 gBattleAnimSpritePal_CrossImpact[]; extern const u32 gBattleAnimSpritePal_Slash2[]; extern const u32 gBattleAnimSpritePal_WhipHit[]; extern const u32 gBattleAnimSpritePal_BlueRing2[]; +extern const u32 gBattleAnimSpritePal_TrumpCard[]; +extern const u32 gBattleAnimSpritePal_TrumpCardParticles[]; +extern const u32 gBattleAnimSpritePal_Accupressure[]; +extern const u32 gBattleAnimSpritePal_WringOut[]; +extern const u32 gBattleAnimSpritePal_ColoredOrbs[]; +extern const u32 gBattleAnimSpritePal_WorrySeed[]; +extern const u32 gBattleAnimSpritePal_SmallCloud[]; +extern const u32 gBattleAnimSpritePal_AttackOrder[]; +extern const u32 gBattleAnimSpritePal_DragonPulse[]; +extern const u32 gBattleAnimSpritePal_WoodHammer[]; +extern const u32 gBattleAnimSpritePal_PsychoCut[]; +extern const u32 gBattleAnimSpritePal_PowerGem[]; +extern const u32 gBattleAnimSpritePal_StoneEdge[]; +extern const u32 gBattleAnimSpritePal_StealthRock[]; +extern const u32 gBattleAnimSpritePal_PoisonJab[]; +// New Battle Anim Particles +extern const u32 gBattleAnimSpriteGfx_WhiteStreak[]; +extern const u32 gBattleAnimSpritePal_WhiteStreak[]; +extern const u32 gBattleAnimSpriteGfx_PurpleJab[]; +extern const u32 gBattleAnimSpritePal_PurpleJab[]; +extern const u32 gBattleAnimSpritePal_ToxicSpikes[]; +extern const u32 gBattleAnimSpriteGfx_EnergyBall[]; +extern const u32 gBattleAnimSpritePal_EnergyBall[]; +extern const u32 gBattleAnimSpriteGfx_MegaStone[]; +extern const u32 gBattleAnimSpritePal_MegaStone[]; +extern const u32 gBattleAnimSpriteGfx_MegaParticles[]; +extern const u32 gBattleAnimSpritePal_MegaParticles[]; +extern const u32 gBattleAnimSpriteGfx_MegaSymbol[]; +extern const u32 gBattleAnimSpritePal_MegaSymbol[]; +extern const u32 gBattleAnimSpriteGfx_FlashCannonBall[]; +extern const u32 gBattleAnimSpritePal_FlashCannonBall[]; +extern const u32 gBattleAnimSpriteGfx_WaterGun[]; +extern const u32 gBattleAnimSpritePal_WaterGun[]; +extern const u32 gBattleAnimSpriteGfx_Punishment[]; +extern const u32 gBattleAnimSpritePal_Punishment[]; +extern const u32 gBattleAnimSpriteGfx_QuickGuard[]; +extern const u32 gBattleAnimSpritePal_QuickGuard[]; + +// New Battle Anim Particles +extern const u32 gBattleAnimSpriteGfx_AcupressureFinger[]; +extern const u32 gBattleAnimSpritePal_AcupressureFinger[]; +extern const u32 gBattleAnimSpriteGfx_AlphaStone[]; +extern const u32 gBattleAnimSpritePal_AlphaStone[]; +extern const u32 gBattleAnimSpriteGfx_Anchor[]; +extern const u32 gBattleAnimSpriteGfx_Apple[]; +extern const u32 gBattleAnimSpritePal_Apple[]; +extern const u32 gBattleAnimSpriteGfx_Arrows[]; +extern const u32 gBattleAnimSpriteGfx_AssuranceHand[]; +extern const u32 gBattleAnimSpritePal_AssuranceHand[]; +extern const u32 gBattleAnimSpriteGfx_AuraSphere[]; +extern const u32 gBattleAnimSpritePal_AuraSphere[]; +extern const u32 gBattleAnimSpritePal_AvalancheRocks[]; +extern const u32 gBattleAnimSpriteGfx_NewPokeball[]; +extern const u32 gBattleAnimSpritePal_NewPokeball[]; +extern const u32 gBattleAnimSpriteGfx_BerryEaten[]; +extern const u32 gBattleAnimSpritePal_BerryEaten[]; +extern const u32 gBattleAnimSpriteGfx_BerryNormal[]; +extern const u32 gBattleAnimSpritePal_BerryNormal[]; +extern const u32 gBattleAnimSpriteGfx_BigRock[]; +extern const u32 gBattleAnimSpritePal_BigRock[]; +extern const u32 gBattleAnimSpriteGfx_BlacephalonHead[]; +extern const u32 gBattleAnimSpritePal_BlacephalonHead[]; +extern const u32 gBattleAnimSpritePal_BlueFlare[]; +extern const u32 gBattleAnimSpriteGfx_Branch[]; +extern const u32 gBattleAnimSpritePal_Branch[]; +extern const u32 gBattleAnimSpriteGfx_Brine[]; +extern const u32 gBattleAnimSpritePal_Brine[]; +extern const u32 gBattleAnimSpriteGfx_ChainLink[]; +extern const u32 gBattleAnimSpritePal_ChainLink[]; +extern const u32 gBattleAnimSpriteGfx_Chop[]; +extern const u32 gBattleAnimSpritePal_Chop[]; +extern const u32 gBattleAnimSpriteGfx_Cacoon[]; +extern const u32 gBattleAnimSpritePal_Cacoon[]; +extern const u32 gBattleAnimSpriteGfx_Confide[]; +extern const u32 gBattleAnimSpritePal_Confide[]; +extern const u32 gBattleAnimSpriteGfx_CraftyShield[]; +extern const u32 gBattleAnimSpritePal_CraftyShield[]; +extern const u32 gBattleAnimSpriteGfx_NewNail[]; +extern const u32 gBattleAnimSpritePal_NewNail[]; +extern const u32 gBattleAnimSpritePal_DracoMeteor[]; +extern const u32 gBattleAnimSpriteGfx_DragonPulseRing[]; +extern const u32 gBattleAnimSpritePal_DragonPulseRing[]; +extern const u32 gBattleAnimSpriteGfx_DreepyMissile[]; +extern const u32 gBattleAnimSpritePal_DreepyMissile[]; +extern const u32 gBattleAnimSpriteGfx_Drill[]; +extern const u32 gBattleAnimSpritePal_Drill[]; +extern const u32 gBattleAnimSpriteGfx_NewEmbers[]; +extern const u32 gBattleAnimSpritePal_NewEmbers[]; +extern const u32 gBattleAnimSpriteGfx_FairyLockChains[]; +extern const u32 gBattleAnimSpriteGfx_Fishies[]; +extern const u32 gBattleAnimSpritePal_Fishies[]; +extern const u32 gBattleAnimSpriteGfx_NewFly[]; +extern const u32 gBattleAnimSpritePal_NewFly[]; +extern const u32 gBattleAnimSpritePal_FusionFlare[]; +extern const u32 gBattleAnimSpritePal_GarbagePoisonPillar[]; +extern const u32 gBattleAnimSpriteGfx_Gear[]; +extern const u32 gBattleAnimSpritePal_Gear[]; +extern const u32 gBattleAnimSpriteGfx_GigavoltHavocSpear[]; +extern const u32 gBattleAnimSpritePal_GigavoltHavocSpear[]; +extern const u32 gBattleAnimSpriteGfx_GoldenApple[]; +extern const u32 gBattleAnimSpritePal_GoldenApple[]; +extern const u32 gBattleAnimSpritePal_GreenDrake[]; +extern const u32 gBattleAnimSpriteGfx_NewGreenStar[]; +extern const u32 gBattleAnimSpritePal_NewGreenStar[]; +extern const u32 gBattleAnimSpriteGfx_HeartStamp[]; +extern const u32 gBattleAnimSpritePal_HeartStamp[]; +extern const u32 gBattleAnimSpriteGfx_ZygardeHexes[]; +extern const u32 gBattleAnimSpritePal_ZygardeHexes[]; +extern const u32 gBattleAnimSpriteGfx_HoopaHand[]; +extern const u32 gBattleAnimSpritePal_HoopaHand[]; +extern const u32 gBattleAnimSpriteGfx_HoopaRing[]; +extern const u32 gBattleAnimSpritePal_HoopaRing[]; +extern const u32 gBattleAnimSpriteGfx_NewHornHit[]; +extern const u32 gBattleAnimSpritePal_NewHornHit[]; +extern const u32 gBattleAnimSpriteGfx_HornLeech[]; +extern const u32 gBattleAnimSpritePal_HornLeech[]; +extern const u32 gBattleAnimSpriteGfx_HorseshoeFist[]; +extern const u32 gBattleAnimSpritePal_HorseshoeFist[]; +extern const u32 gBattleAnimSpriteGfx_HydroPump[]; +extern const u32 gBattleAnimSpritePal_HydroPump[]; +extern const u32 gBattleAnimSpriteGfx_IceRock[]; +extern const u32 gBattleAnimSpritePal_IceRock[]; +extern const u32 gBattleAnimSpriteGfx_LargeSpike[]; +extern const u32 gBattleAnimSpritePal_LargeSpike[]; +extern const u32 gBattleAnimSpriteGfx_NewLeaf[]; +extern const u32 gBattleAnimSpritePal_NewLeaf[]; +extern const u32 gBattleAnimSpriteGfx_NewLeechSeed[]; +extern const u32 gBattleAnimSpritePal_NewLeechSeed[]; +extern const u32 gBattleAnimSpriteGfx_LightningRain[]; +extern const u32 gBattleAnimSpritePal_LightningRain[]; +extern const u32 gBattleAnimSpriteGfx_NewEye[]; +extern const u32 gBattleAnimSpritePal_NewEye[]; +extern const u32 gBattleAnimSpriteGfx_MetalBits[]; +extern const u32 gBattleAnimSpriteGfx_MudBomb[]; +extern const u32 gBattleAnimSpritePal_MudBomb[]; +extern const u32 gBattleAnimSpriteGfx_Mushroom[]; +extern const u32 gBattleAnimSpritePal_Mushroom[]; +extern const u32 gBattleAnimSpritePal_NaturalGiftRing[]; +extern const u32 gBattleAnimSpriteGfx_NecrozmaStar[]; +extern const u32 gBattleAnimSpritePal_NecrozmaStar[]; +extern const u32 gBattleAnimSpritePal_NewImpact[]; +extern const u32 gBattleAnimSpriteGfx_Obstruct[]; +extern const u32 gBattleAnimSpritePal_Obstruct[]; +extern const u32 gBattleAnimSpriteGfx_OmegaStone[]; +extern const u32 gBattleAnimSpritePal_OmegaStone[]; +extern const u32 gBattleAnimSpriteGfx_PinkDiamond[]; +extern const u32 gBattleAnimSpritePal_PinkDiamond[]; +extern const u32 gBattleAnimSpriteGfx_PoisonColumn[]; +extern const u32 gBattleAnimSpritePal_PoisonColumn[]; +extern const u32 gBattleAnimSpriteGfx_PowerTrick[]; +extern const u32 gBattleAnimSpritePal_PowerTrick[]; +extern const u32 gBattleAnimSpriteGfx_PurpleDrake[]; +extern const u32 gBattleAnimSpritePal_PurpleDrake[]; +extern const u32 gBattleAnimSpriteGfx_QuickGuard[]; +extern const u32 gBattleAnimSpritePal_QuickGuard[]; +extern const u32 gBattleAnimSpriteGfx_RazorShell[]; +extern const u32 gBattleAnimSpritePal_RazorShell[]; +extern const u32 gBattleAnimSpriteGfx_RocksSmall[]; +extern const u32 gBattleAnimSpriteGfx_NewRocks[]; +extern const u32 gBattleAnimSpritePal_NewRocks[]; +extern const u32 gBattleAnimSpriteGfx_ShellLeft[]; +extern const u32 gBattleAnimSpritePal_ShellLeft[]; +extern const u32 gBattleAnimSpriteGfx_ShellRight[]; +extern const u32 gBattleAnimSpritePal_SpacialRendSlices[]; +extern const u32 gBattleAnimSpriteGfx_NewSpikes[]; +extern const u32 gBattleAnimSpritePal_NewSpikes[]; +extern const u32 gBattleAnimSpriteGfx_SpiritShackleArrow[]; +extern const u32 gBattleAnimSpritePal_SpiritShackleArrow[]; +extern const u32 gBattleAnimSpriteGfx_SteamEruption[]; +extern const u32 gBattleAnimSpritePal_SteamEruption[]; +extern const u32 gBattleAnimSpriteGfx_Steamroller[]; +extern const u32 gBattleAnimSpritePal_Steamroller[]; +extern const u32 gBattleAnimSpriteGfx_StonePillar[]; +extern const u32 gBattleAnimSpritePal_StonePillar[]; +extern const u32 gBattleAnimSpriteGfx_StraightBeam[]; +extern const u32 gBattleAnimSpritePal_StraightBeam[]; +extern const u32 gBattleAnimSpriteGfx_SubstituteBack[]; +extern const u32 gBattleAnimSpriteGfx_SubstituteFront[]; +extern const u32 gBattleAnimSpritePal_SubstituteFront[]; +extern const u32 gBattleAnimSpritePal_NewSurf[]; +extern const u32 gBattleAnimSpriteGfx_NewSword[]; +extern const u32 gBattleAnimSpritePal_NewSword[]; +extern const u32 gBattleAnimSpriteGfx_NewTeeth[]; +extern const u32 gBattleAnimSpritePal_NewTeeth[]; +extern const u32 gBattleAnimSpriteGfx_NewHandsAndFeet[]; +extern const u32 gBattleAnimSpritePal_NewHandsAndFeet[]; +extern const u32 gBattleAnimSpriteGfx_Tornado[]; +extern const u32 gBattleAnimSpritePal_Tornado[]; +extern const u32 gBattleAnimSpriteGfx_ZMoveSymbol[]; +extern const u32 gBattleAnimSpritePal_ZMoveSymbol[]; extern const u32 gBattleAnimBgImage_Dark[]; extern const u32 gBattleAnimBgImage_Ghost[]; @@ -4721,6 +4930,17 @@ extern const u32 gBattleAnimBgImage_Cosmic[]; extern const u32 gBattleAnimBgImage_InAir[]; extern const u32 gBattleAnimBgImage_Aurora[]; extern const u32 gBattleAnimBgImage_Fissure[]; +extern const u32 gBattleAnimBgImage_TrickRoom[]; +extern const u32 gBattleAnimBgImage_RockWrecker[]; +extern const u32 gBattleAnimBgImage_SpacialRendOpponent[]; +extern const u32 gBattleAnimBgPalette_SpacialRendOpponent[]; +extern const u32 gBattleAnimBgTilemap_SpacialRendOpponent[]; +extern const u32 gBattleAnimBgImage_SpacialRendPlayer[]; +extern const u32 gBattleAnimBgPalette_SpacialRendPlayer[]; +extern const u32 gBattleAnimBgTilemap_SpacialRendPlayer[]; +extern const u32 gBattleAnimBgImage_DarkVoid[]; +extern const u32 gBattleAnimBgPalette_DarkVoid[]; +extern const u32 gBattleAnimBgTilemap_DarkVoid[]; extern const u32 gBattleAnimBgPalette_Dark[]; extern const u32 gBattleAnimBgPalette_Ghost[]; extern const u32 gBattleAnimBgPalette_Psychic[]; @@ -4737,6 +4957,10 @@ extern const u32 gBattleAnimBgPalette_Aurora[]; extern const u32 gBattleAnimBgPalette_Fissure[]; extern const u32 gBattleAnimBgPalette_Bug[]; extern const u32 gBattleAnimBgPalette_Solarbeam[]; +extern const u32 gBattleAnimBgPalette_MagmaStorm[]; +extern const u32 gBattleAnimBgPalette_GigaImpact[]; +extern const u32 gBattleAnimBgPalette_TrickRoom[]; +extern const u32 gBattleAnimBgPalette_RockWrecker[]; extern const u32 gBattleAnimBgTilemap_Dark[]; extern const u32 gBattleAnimBgTilemap_Ghost[]; extern const u32 gBattleAnimBgTilemap_Psychic[]; @@ -4747,6 +4971,8 @@ extern const u32 gBattleAnimBgTilemap_Drill[]; extern const u32 gBattleAnimBgTilemap_DrillContests[]; extern const u32 gBattleAnimBgTilemap_HighspeedOpponent[]; extern const u32 gBattleAnimBgTilemap_HighspeedPlayer[]; +extern const u32 gBattleAnimBgTilemap_TrickRoom[]; +extern const u32 gBattleAnimBgTilemap_RockWrecker[]; extern const u32 gBattleAnimMaskImage_LightBeam[]; extern const u32 gBattleAnimMaskPalette_LightBeam[]; extern const u32 gBattleAnimMaskTilemap_LightBeam[]; @@ -4759,6 +4985,109 @@ extern const u32 gBattleAnimBgTilemap_Cosmic[]; extern const u32 gBattleAnimBgTilemap_InAir[]; extern const u32 gBattleAnimBgTilemap_Aurora[]; extern const u32 gBattleAnimBgTilemap_Fissure[]; +extern const u32 gBattleAnimBgPalette_SludgeWave[]; +extern const u32 gBattleAnimBgImage_Aeroblast[]; +extern const u32 gBattleAnimBgPalette_Aeroblast[]; +extern const u32 gBattleAnimBgTilemap_Aeroblast[]; +extern const u32 gBattleAnimBgPalette_AuraSphere[]; +extern const u32 gBattleAnimBgImage_BlackholeEclipse[]; +extern const u32 gBattleAnimBgPalette_BlackholeEclipse[]; +extern const u32 gBattleAnimBgTilemap_BlackholeEclipse[]; +extern const u32 gBattleAnimBgImage_BloomDoom[]; +extern const u32 gBattleAnimBgPalette_BloomDoom[]; +extern const u32 gBattleAnimBgTilemap_BloomDoom[]; +extern const u32 gBattleAnimBgImage_BoltStrike[]; +extern const u32 gBattleAnimBgPalette_BoltStrike[]; +extern const u32 gBattleAnimBgTilemap_BoltStrike[]; +extern const u32 gBattleAnimBgImage_ClangorousSoulblaze[]; +extern const u32 gBattleAnimBgPalette_ClangorousSoulblaze[]; +extern const u32 gBattleAnimBgTilemap_ClangorousSoulblaze[]; +extern const u32 gBattleAnimBgPalette_DynamaxCannon[]; +extern const u32 gBattleAnimBgImage_ElectricTerrain[]; +extern const u32 gBattleAnimBgPalette_ElectricTerrain[]; +extern const u32 gBattleAnimBgTilemap_ElectricTerrain[]; +extern const u32 gBattleAnimBgImage_Fire1[]; +extern const u32 gBattleAnimBgPalette_Fire1[]; +extern const u32 gBattleAnimBgTilemap_Fire1[]; +extern const u32 gBattleAnimBgPalette_Fire2[]; +extern const u32 gBattleAnimBgImage_FocusBlast[]; +extern const u32 gBattleAnimBgPalette_FocusBlast[]; +extern const u32 gBattleAnimBgTilemap_FocusBlast[]; +extern const u32 gBattleAnimBgPalette_GarbageFalls[]; +extern const u32 gBattleAnimBgImage_GrassyTerrain[]; +extern const u32 gBattleAnimBgPalette_GrassyTerrain[]; +extern const u32 gBattleAnimBgTilemap_GrassyTerrain[]; +extern const u32 gBattleAnimBgPalette_GunkShot[]; +extern const u32 gBattleAnimBgImage_HighSpeed[]; +extern const u32 gBattleAnimBgPalette_HighSpeed[]; +extern const u32 gBattleAnimBgTilemap_HighSpeed[]; +extern const u32 gBattleAnimBgImage_HydroCannon[]; +extern const u32 gBattleAnimBgPalette_HydroCannon[]; +extern const u32 gBattleAnimBgTilemap_HydroCannon[]; +extern const u32 gBattleAnimBgImage_HydroPump[]; +extern const u32 gBattleAnimBgPalette_HydroPump[]; +extern const u32 gBattleAnimBgTilemap_HydroPump[]; +extern const u32 gBattleAnimBgPalette_HyperBeam[]; +extern const u32 gBattleAnimBgPalette_HyperspaceFury[]; +extern const u32 gBattleAnimBgImage_InfernoOverdrive[]; +extern const u32 gBattleAnimBgPalette_InfernoOverdrive[]; +extern const u32 gBattleAnimBgTilemap_InfernoOverdrive[]; +extern const u32 gBattleAnimBgImage_LeafStorm[]; +extern const u32 gBattleAnimBgPalette_LeafStorm[]; +extern const u32 gBattleAnimBgTilemap_LeafStorm[]; +extern const u32 gBattleAnimBgPalette_MagicRoom[]; +extern const u32 gBattleAnimBgImage_MaliciousMoonsault[]; +extern const u32 gBattleAnimBgPalette_MaliciousMoonsault[]; +extern const u32 gBattleAnimBgTilemap_MaliciousMoonsault[]; +extern const u32 gBattleAnimBgImage_MaxLightning[]; +extern const u32 gBattleAnimBgPalette_MaxLightning[]; +extern const u32 gBattleAnimBgTilemap_MaxLightning[]; +extern const u32 gBattleAnimBgImage_MistyTerrain[]; +extern const u32 gBattleAnimBgPalette_MistyTerrain[]; +extern const u32 gBattleAnimBgTilemap_MistyTerrain[]; +extern const u32 gBattleAnimBgImage_NeverendingNightmare[]; +extern const u32 gBattleAnimBgPalette_NeverendingNightmare[]; +extern const u32 gBattleAnimBgTilemap_NeverendingNightmare[]; +extern const u32 gBattleAnimBgImage_Nightmare[]; +extern const u32 gBattleAnimBgPalette_Nightmare[]; +extern const u32 gBattleAnimBgTilemap_Nightmare[]; +extern const u32 gBattleAnimBgPalette_PoisonFalls[]; +extern const u32 gBattleAnimBgPalette_PsychicNew[]; +extern const u32 gBattleAnimBgImage_PsychicTerrain[]; +extern const u32 gBattleAnimBgPalette_PsychicTerrain[]; +extern const u32 gBattleAnimBgTilemap_PsychicTerrain[]; +extern const u32 gBattleAnimBgImage_ShatteredPsyche[]; +extern const u32 gBattleAnimBgPalette_ShatteredPsyche[]; +extern const u32 gBattleAnimBgTilemap_ShatteredPsyche[]; +extern const u32 gBattleAnimBgImage_SkyDay[]; +extern const u32 gBattleAnimBgPalette_SkyDay[]; +extern const u32 gBattleAnimBgTilemap_SkyDay[]; +extern const u32 gBattleAnimBgPalette_SkyAfternoon[]; +extern const u32 gBattleAnimBgPalette_SkyNight[]; +extern const u32 gBattleAnimBgImage_SnuggleForever[]; +extern const u32 gBattleAnimBgPalette_SnuggleForever[]; +extern const u32 gBattleAnimBgTilemap_SnuggleForever[]; +extern const u32 gBattleAnimBgImage_SoulStealing7StarStrike[]; +extern const u32 gBattleAnimBgPalette_SoulStealing7StarStrike[]; +extern const u32 gBattleAnimBgTilemap_SoulStealing7StarStrike[]; +extern const u32 gBattleAnimBgPalette_TectonicRage[]; +extern const u32 gBattleAnimBgImage_TwinkleTackle[]; +extern const u32 gBattleAnimBgPalette_TwinkleTackle[]; +extern const u32 gBattleAnimBgTilemap_TwinkleTackle[]; +extern const u32 gBattleAnimBgImage_WaterPulse[]; +extern const u32 gBattleAnimBgPalette_WaterPulse[]; +extern const u32 gBattleAnimBgTilemap_WaterPulse[]; +extern const u32 gBattleAnimBgImage_Waterfall[]; +extern const u32 gBattleAnimBgPalette_Waterfall[]; +extern const u32 gBattleAnimBgTilemap_Waterfall[]; +extern const u32 gBattleAnimBgPalette_WonderRoom[]; +extern const u32 gBattleAnimBgImage_ZMoveActivate[]; +extern const u32 gBattleAnimBgPalette_ZMoveActivate[]; +extern const u32 gBattleAnimBgTilemap_ZMoveActivate[]; +extern const u32 gBattleAnimBgImage_ZMoveMountain[]; +extern const u32 gBattleAnimBgPalette_ZMoveMountain[]; +extern const u32 gBattleAnimBgTilemap_ZMoveMountain[]; + extern const u32 gMetalShineGfx[]; extern const u32 gMetalShinePalette[]; diff --git a/include/pokemon.h b/include/pokemon.h index 81c17f545b..d7dd3d9c5c 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -150,13 +150,12 @@ struct BattlePokemon /*0x15*/ u32 speedIV:5; /*0x16*/ u32 spAttackIV:5; /*0x17*/ u32 spDefenseIV:5; - /*0x17*/ u32 isEgg:1; - /*0x17*/ u32 abilityNum:1; + /*0x17*/ u32 abilityNum:2; /*0x18*/ s8 statStages[NUM_BATTLE_STATS]; /*0x20*/ u8 ability; /*0x21*/ u8 type1; /*0x22*/ u8 type2; - /*0x23*/ u8 unknown; + /*0x23*/ u8 type3; /*0x24*/ u8 pp[MAX_MON_MOVES]; /*0x28*/ u16 hp; /*0x2A*/ u8 level; @@ -207,7 +206,7 @@ struct BaseStats struct BattleMove { - u8 effect; + u16 effect; u8 power; u8 type; u8 accuracy; @@ -215,7 +214,9 @@ struct BattleMove u8 secondaryEffectChance; u8 target; s8 priority; - u8 flags; + u32 flags; + u8 split; + u8 argument; }; struct SpindaSpot @@ -224,10 +225,10 @@ struct SpindaSpot u16 image[16]; }; -struct __attribute__((packed)) LevelUpMove +struct LevelUpMove { - u16 move:9; - u16 level:7; + u16 move; + u16 level; }; struct Evolution @@ -250,7 +251,7 @@ extern const struct BaseStats gBaseStats[]; extern const u8 *const gItemEffectTable[]; extern const struct Evolution gEvolutionTable[][EVOS_PER_MON]; extern const u32 gExperienceTables[][MAX_LEVEL + 1]; -extern const u16 *const gLevelUpLearnsets[]; +extern const struct LevelUpMove *const gLevelUpLearnsets[]; extern const u8 gPPUpGetMask[]; extern const u8 gPPUpSetMask[]; extern const u8 gPPUpAddMask[]; @@ -295,7 +296,6 @@ void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon); u16 MonTryLearningNewMove(struct Pokemon *mon, bool8 firstMove); void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move); void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move); -s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 sideStatus, u16 powerOverride, u8 typeOverride, u8 bankAtk, u8 bankDef); u8 CountAliveMonsInBattle(u8 caseId); #define BATTLE_ALIVE_EXCEPT_ACTIVE 0 @@ -337,6 +337,7 @@ void GetSpeciesName(u8 *name, u16 species); u8 CalculatePPWithBonus(u16 move, u8 ppBonuses, u8 moveIndex); void RemoveMonPPBonus(struct Pokemon *mon, u8 moveIndex); void RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex); +void PokemonToBattleMon(struct Pokemon *src, struct BattlePokemon *dst); void CopyPlayerPartyMonToBattleData(u8 battlerId, u8 partyIndex); bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex); bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex, u8 e); diff --git a/include/reset_rtc_screen.h b/include/reset_rtc_screen.h index 5807dec992..7c251377d5 100644 --- a/include/reset_rtc_screen.h +++ b/include/reset_rtc_screen.h @@ -1,6 +1,9 @@ #ifndef GUARD_RESET_RTC_SCREEN_H #define GUARD_RESET_RTC_SCREEN_H +extern const struct SpritePalette gSpritePalette_RtcArrow; +extern const struct SpriteTemplate gSpriteTemplate_RtcArrow; + void CB2_InitResetRtcScreen(void); #endif // GUARD_RESET_RTC_SCREEN_H diff --git a/ld_script.txt b/ld_script.txt index 0b8702d966..091b6e693c 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -94,6 +94,7 @@ SECTIONS { src/battle_controller_opponent.o(.text); src/battle_ai_switch_items.o(.text); src/battle_controller_link_opponent.o(.text); + src/battle_debug.o(.text); src/pokemon.o(.text); src/trig.o(.text); src/random.o(.text); @@ -197,6 +198,7 @@ SECTIONS { src/battle_anim_ground.o(.text); src/battle_anim_normal.o(.text); src/battle_anim_utility_funcs.o(.text); + src/battle_anim_new.o(.text); src/battle_intro.o(.text); src/bike.o(.text); src/easy_chat.o(.text); @@ -478,6 +480,7 @@ SECTIONS { src/battle_controller_opponent.o(.rodata); src/battle_ai_switch_items.o(.rodata); src/battle_controller_link_opponent.o(.rodata); + src/battle_debug.o(.rodata); src/pokemon.o(.rodata); src/trig.o(.rodata); src/util.o(.rodata); @@ -570,6 +573,7 @@ SECTIONS { src/battle_anim_ground.o(.rodata); src/battle_anim_normal.o(.rodata); src/battle_anim_utility_funcs.o(.rodata); + src/battle_anim_new.o(.rodata); src/battle_intro.o(.rodata); src/bike.o(.rodata); src/easy_chat.o(.rodata); diff --git a/src/apprentice.c b/src/apprentice.c index ad157f301e..41facf7add 100644 --- a/src/apprentice.c +++ b/src/apprentice.c @@ -48,7 +48,7 @@ * - Asking which move a mon should use, which they will ask at most 5 times * - Asking what held item to give to a mon, which they will ask at most 3 times (once for each mon) * - Asking what they should say when they win a battle, which will always be their final question before departing - * + * * ## After departing * After telling them what they should say when they win a battle they will leave the lobby for a final time * They will then be replaced by a new random Apprentice (they can repeat) @@ -274,7 +274,7 @@ static void SetRandomQuestionData(void) for (i = 0; i < ARRAY_COUNT(questionOrder); i++) questionOrder[i] = sQuestionPossibilities[i]; - + // Shuffle the questions an arbitrary 50 times for (i = 0; i < 50; i++) { @@ -342,7 +342,7 @@ static u16 GetRandomAlternateMove(u8 monId) u8 id; u8 numLearnsetMoves; u16 species; - const u16 *learnset; + const struct LevelUpMove *learnset; bool32 needTMs = FALSE; u16 moveId = MOVE_NONE; bool32 shouldUseMove; @@ -367,9 +367,9 @@ static u16 GetRandomAlternateMove(u8 monId) else // == APPRENTICE_LVL_MODE_OPEN level = 60; - for (j = 0; learnset[j] != LEVEL_UP_END; j++) + for (j = 0; learnset[j].move != LEVEL_UP_END; j++) { - if ((learnset[j] & LEVEL_UP_MOVE_LV) > (level << 9)) + if (learnset[j].level > level) break; } @@ -406,7 +406,7 @@ static u16 GetRandomAlternateMove(u8 monId) for (; j < numLearnsetMoves; j++) { // Keep looking for TMs until one not in the level up learnset is found - if ((learnset[j] & LEVEL_UP_MOVE_ID) == moveId) + if ((learnset[j].move) == moveId) { shouldUseMove = FALSE; break; @@ -430,13 +430,13 @@ static u16 GetRandomAlternateMove(u8 monId) { // Get a random move excluding the 4 it would know at max level u8 learnsetId = Random() % (numLearnsetMoves - MAX_MON_MOVES); - moveId = learnset[learnsetId] & LEVEL_UP_MOVE_ID; + moveId = learnset[learnsetId].move; shouldUseMove = TRUE; for (j = numLearnsetMoves - MAX_MON_MOVES; j < numLearnsetMoves; j++) { // Keep looking for moves until one not in the last 4 is found - if ((learnset[j] & LEVEL_UP_MOVE_ID) == moveId) + if ((learnset[j].move) == moveId) { shouldUseMove = FALSE; break; @@ -476,7 +476,7 @@ static void GetLatestLearnedMoves(u16 species, u16 *moves) { u8 i, j; u8 level, numLearnsetMoves; - const u16 *learnset; + const struct LevelUpMove *learnset; if (PLAYER_APPRENTICE.lvlMode == APPRENTICE_LVL_MODE_50) level = 50; @@ -484,9 +484,9 @@ static void GetLatestLearnedMoves(u16 species, u16 *moves) level = 60; learnset = gLevelUpLearnsets[species]; - for (i = 0; learnset[i] != LEVEL_UP_END; i++) + for (i = 0; learnset[i].move != LEVEL_UP_END; i++) { - if ((learnset[i] & LEVEL_UP_MOVE_LV) > (level << 9)) + if (learnset[i].level > level) break; } @@ -495,7 +495,7 @@ static void GetLatestLearnedMoves(u16 species, u16 *moves) numLearnsetMoves = MAX_MON_MOVES; for (j = 0; j < numLearnsetMoves; j++) - moves[j] = learnset[(i - 1) - j] & LEVEL_UP_MOVE_ID; + moves[j] = learnset[(i - 1) - j].move; } // Get the level up move or previously suggested move to be the first move choice @@ -801,7 +801,7 @@ static void GetNumApprenticePartyMonsAssigned(void) static void IsFinalQuestion(void) { s32 questionNum = CURRENT_QUESTION_NUM; - + if (questionNum < 0) { // Not finished asking initial questions @@ -954,7 +954,7 @@ static void ApprenticeGetQuestion(void) gSpecialVar_Result = APPRENTICE_QUESTION_WHICH_FIRST; break; default: - //case QUESTION_ID_WIN_SPEECH: + //case QUESTION_ID_WIN_SPEECH: gSpecialVar_Result = APPRENTICE_QUESTION_WIN_SPEECH; break; } diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 1fd0642ad1..d9230d6d06 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -1,4 +1,5 @@ #include "global.h" +#include "malloc.h" #include "battle.h" #include "battle_anim.h" #include "battle_ai_script_commands.h" @@ -13,6 +14,7 @@ #include "constants/abilities.h" #include "constants/battle_ai.h" #include "constants/battle_move_effects.h" +#include "constants/hold_effects.h" #include "constants/moves.h" #define AI_ACTION_DONE 0x0001 @@ -52,6 +54,8 @@ static void RecordLastUsedMoveByTarget(void); static void BattleAI_DoAIProcessing(void); static void AIStackPushVar(const u8 *); static bool8 AIStackPop(void); +static s32 CountUsablePartyMons(u8 battlerId); +static s32 AI_GetAbility(u32 battlerId, bool32 guess); static void Cmd_if_random_less_than(void); static void Cmd_if_random_greater_than(void); @@ -91,10 +95,10 @@ static void Cmd_get_type(void); static void Cmd_get_considered_move_power(void); static void Cmd_get_how_powerful_move_is(void); static void Cmd_get_last_used_battler_move(void); -static void Cmd_if_equal_(void); -static void Cmd_if_not_equal_(void); +static void Cmd_if_equal_u32(void); +static void Cmd_if_not_equal_u32(void); static void Cmd_if_user_goes(void); -static void Cmd_if_user_doesnt_go(void); +static void Cmd_if_cant_use_belch(void); static void Cmd_nullsub_2A(void); static void Cmd_nullsub_2B(void); static void Cmd_count_usable_party_mons(void); @@ -135,11 +139,11 @@ static void Cmd_get_move_type_from_result(void); static void Cmd_get_move_power_from_result(void); static void Cmd_get_move_effect_from_result(void); static void Cmd_get_protect_count(void); -static void Cmd_nullsub_52(void); -static void Cmd_nullsub_53(void); -static void Cmd_nullsub_54(void); -static void Cmd_nullsub_55(void); -static void Cmd_nullsub_56(void); +static void Cmd_if_move_flag(void); +static void Cmd_if_field_status(void); +static void Cmd_get_move_accuracy(void); +static void Cmd_call_if_eq(void); +static void Cmd_call_if_move_flag(void); static void Cmd_nullsub_57(void); static void Cmd_call(void); static void Cmd_goto(void); @@ -152,6 +156,29 @@ static void Cmd_is_of_type(void); static void Cmd_if_target_is_ally(void); static void Cmd_if_flash_fired(void); static void Cmd_if_holds_item(void); +static void Cmd_get_ally_chosen_move(void); +static void Cmd_if_has_no_attacking_moves(void); +static void Cmd_get_hazards_count(void); +static void Cmd_if_doesnt_hold_berry(void); +static void Cmd_if_share_type(void); +static void Cmd_if_cant_use_last_resort(void); +static void Cmd_if_has_move_with_split(void); +static void Cmd_if_has_no_move_with_split(void); +static void Cmd_if_physical_moves_unusable(void); +static void Cmd_if_ai_can_go_down(void); +static void Cmd_if_has_move_with_type(void); +static void Cmd_if_no_move_used(void); +static void Cmd_if_has_move_with_flag(void); +static void Cmd_if_battler_absent(void); +static void Cmd_is_grounded(void); +static void Cmd_get_best_dmg_hp_percent(void); +static void Cmd_get_curr_dmg_hp_percent(void); +static void Cmd_get_move_split_from_result(void); +static void Cmd_get_considered_move_split(void); +static void Cmd_get_considered_move_target(void); +static void Cmd_compare_speeds(void); +static void Cmd_is_wakeup_turn(void); +static void Cmd_if_has_move_with_accuracy_lt(void); // ewram EWRAM_DATA const u8 *gAIScriptPtr = NULL; @@ -200,10 +227,10 @@ static const BattleAICmdFunc sBattleAICmdTable[] = Cmd_get_considered_move_power, // 0x23 Cmd_get_how_powerful_move_is, // 0x24 Cmd_get_last_used_battler_move, // 0x25 - Cmd_if_equal_, // 0x26 - Cmd_if_not_equal_, // 0x27 + Cmd_if_equal_u32, // 0x26 + Cmd_if_not_equal_u32, // 0x27 Cmd_if_user_goes, // 0x28 - Cmd_if_user_doesnt_go, // 0x29 + Cmd_if_cant_use_belch, // 0x29 Cmd_nullsub_2A, // 0x2A Cmd_nullsub_2B, // 0x2B Cmd_count_usable_party_mons, // 0x2C @@ -244,11 +271,11 @@ static const BattleAICmdFunc sBattleAICmdTable[] = Cmd_get_move_power_from_result, // 0x4F Cmd_get_move_effect_from_result, // 0x50 Cmd_get_protect_count, // 0x51 - Cmd_nullsub_52, // 0x52 - Cmd_nullsub_53, // 0x53 - Cmd_nullsub_54, // 0x54 - Cmd_nullsub_55, // 0x55 - Cmd_nullsub_56, // 0x56 + Cmd_if_move_flag, // 0x52 + Cmd_if_field_status, // 0x53 + Cmd_get_move_accuracy, // 0x54 + Cmd_call_if_eq, // 0x55 + Cmd_call_if_move_flag, // 0x56 Cmd_nullsub_57, // 0x57 Cmd_call, // 0x58 Cmd_goto, // 0x59 @@ -261,14 +288,35 @@ static const BattleAICmdFunc sBattleAICmdTable[] = Cmd_check_ability, // 0x60 Cmd_if_flash_fired, // 0x61 Cmd_if_holds_item, // 0x62 + Cmd_get_ally_chosen_move, // 0x63 + Cmd_if_has_no_attacking_moves, // 0x64 + Cmd_get_hazards_count, // 0x65 + Cmd_if_doesnt_hold_berry, // 0x66 + Cmd_if_share_type, // 0x67 + Cmd_if_cant_use_last_resort, // 0x68 + Cmd_if_has_move_with_split, // 0x69 + Cmd_if_has_no_move_with_split, // 0x6A + Cmd_if_physical_moves_unusable, // 0x6B + Cmd_if_ai_can_go_down, // 0x6C + Cmd_if_has_move_with_type, // 0x6D + Cmd_if_no_move_used, // 0x6E + Cmd_if_has_move_with_flag, // 0x6F + Cmd_if_battler_absent, // 0x70 + Cmd_is_grounded, // 0x71 + Cmd_get_best_dmg_hp_percent, // 0x72 + Cmd_get_curr_dmg_hp_percent, // 0x73 + Cmd_get_move_split_from_result, // 0x74 + Cmd_get_considered_move_split, // 0x75 + Cmd_get_considered_move_target, // 0x76 + Cmd_compare_speeds, // 0x77 + Cmd_is_wakeup_turn, // 0x78 + Cmd_if_has_move_with_accuracy_lt, // 0x79 }; static const u16 sDiscouragedPowerfulMoveEffects[] = { EFFECT_EXPLOSION, EFFECT_DREAM_EATER, - EFFECT_RAZOR_WIND, - EFFECT_SKY_ATTACK, EFFECT_RECHARGE, EFFECT_SKULL_BASH, EFFECT_SOLARBEAM, @@ -277,11 +325,12 @@ static const u16 sDiscouragedPowerfulMoveEffects[] = EFFECT_SUPERPOWER, EFFECT_ERUPTION, EFFECT_OVERHEAT, + EFFECT_MIND_BLOWN, 0xFFFF }; // code -void BattleAI_HandleItemUseBeforeAISetup(u8 defaultScoreMoves) +void BattleAI_SetupItems(void) { s32 i; u8 *data = (u8 *)BATTLE_HISTORY; @@ -306,19 +355,40 @@ void BattleAI_HandleItemUseBeforeAISetup(u8 defaultScoreMoves) } } } +} - BattleAI_SetupAIData(defaultScoreMoves); +void BattleAI_SetupFlags(void) +{ + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) + AI_THINKING_STRUCT->aiFlags = GetAiScriptsInRecordedBattle(); + else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_SAFARI; + else if (gBattleTypeFlags & BATTLE_TYPE_ROAMER) + AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_ROAMING; + else if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) + AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_FIRST_BATTLE; + else if (gBattleTypeFlags & BATTLE_TYPE_FACTORY) + AI_THINKING_STRUCT->aiFlags = GetAiScriptsInBattleFactory(); + else if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_TRAINER_HILL | BATTLE_TYPE_SECRET_BASE)) + AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_CHECK_VIABILITY | AI_SCRIPT_TRY_TO_FAINT; + else if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent_A].aiFlags | gTrainers[gTrainerBattleOpponent_B].aiFlags; + else + AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent_A].aiFlags; + + if (gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS) || gTrainers[gTrainerBattleOpponent_A].doubleBattle) + AI_THINKING_STRUCT->aiFlags |= AI_SCRIPT_DOUBLE_BATTLE; // Act smart in doubles and don't attack your partner. } void BattleAI_SetupAIData(u8 defaultScoreMoves) { - s32 i; - u8 *data = (u8 *)AI_THINKING_STRUCT; + s32 i, move, dmg; u8 moveLimitations; - // Clear AI data. - for (i = 0; i < sizeof(struct AI_ThinkingStruct); i++) - data[i] = 0; + // Clear AI data but preserve the flags. + u32 flags = AI_THINKING_STRUCT->aiFlags; + memset(AI_THINKING_STRUCT, 0, sizeof(struct AI_ThinkingStruct)); + AI_THINKING_STRUCT->aiFlags = flags; // Conditional score reset, unlike Ruby. for (i = 0; i < MAX_MON_MOVES; i++) @@ -338,51 +408,37 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves) { if (gBitTable[i] & moveLimitations) AI_THINKING_STRUCT->score[i] = 0; - - AI_THINKING_STRUCT->simulatedRNG[i] = 100 - (Random() % 16); } gBattleResources->AI_ScriptsStack->size = 0; sBattler_AI = gActiveBattler; - // Decide a random target battlerId in doubles. - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + // Simulate dmg for all AI moves against all opposing targets + for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++) { - gBattlerTarget = (Random() & BIT_FLANK) + (GetBattlerSide(gActiveBattler) ^ BIT_SIDE); - if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) - gBattlerTarget ^= BIT_FLANK; - } - // There's only one choice in single battles. - else - { - gBattlerTarget = sBattler_AI ^ BIT_SIDE; + if (GET_BATTLER_SIDE2(sBattler_AI) == GET_BATTLER_SIDE2(gBattlerTarget)) + continue; + for (i = 0; i < MAX_MON_MOVES; i++) + { + dmg = 0; + move = gBattleMons[sBattler_AI].moves[i]; + if (gBattleMoves[move].power != 0 && !(moveLimitations & gBitTable[i])) + { + dmg = AI_CalcDamage(move, sBattler_AI, gBattlerTarget) * (100 - (Random() % 10)) / 100; + if (dmg == 0) + dmg = 1; + } + + AI_THINKING_STRUCT->simulatedDmg[sBattler_AI][gBattlerTarget][i] = dmg; + } } - // Choose proper trainer ai scripts. - if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) - AI_THINKING_STRUCT->aiFlags = GetAiScriptsInRecordedBattle(); - else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_SAFARI; - else if (gBattleTypeFlags & BATTLE_TYPE_ROAMER) - AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_ROAMING; - else if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) - AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_FIRST_BATTLE; - else if (gBattleTypeFlags & BATTLE_TYPE_FACTORY) - AI_THINKING_STRUCT->aiFlags = GetAiScriptsInBattleFactory(); - else if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_TRAINER_HILL | BATTLE_TYPE_SECRET_BASE)) - AI_THINKING_STRUCT->aiFlags = AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_CHECK_VIABILITY | AI_SCRIPT_TRY_TO_FAINT; - else if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) - AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent_A].aiFlags | gTrainers[gTrainerBattleOpponent_B].aiFlags; - else - AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent_A].aiFlags; - - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - AI_THINKING_STRUCT->aiFlags |= AI_SCRIPT_DOUBLE_BATTLE; // act smart in doubles and don't attack your partner + gBattlerTarget = SetRandomTarget(sBattler_AI); } u8 BattleAI_ChooseMoveOrAction(void) { - u16 savedCurrentMove = gCurrentMove; + u32 savedCurrentMove = gCurrentMove; u8 ret; if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) @@ -394,33 +450,104 @@ u8 BattleAI_ChooseMoveOrAction(void) return ret; } +static u32 GetTotalBaseStat(u32 species) +{ + return gBaseStats[species].baseHP + + gBaseStats[species].baseAttack + + gBaseStats[species].baseDefense + + gBaseStats[species].baseSpeed + + gBaseStats[species].baseSpAttack + + gBaseStats[species].baseSpDefense; +} + +bool32 IsTruantMonVulnerable(u32 battlerAI, u32 opposingBattler) +{ + int i; + + for (i = 0; i < MAX_MON_MOVES; i++) + { + u32 move = gBattleResources->battleHistory->usedMoves[opposingBattler][i]; + if (gBattleMoves[move].effect == EFFECT_PROTECT && move != MOVE_ENDURE) + return TRUE; + if (gBattleMoves[move].effect == EFFECT_SEMI_INVULNERABLE && GetWhoStrikesFirst(battlerAI, opposingBattler, TRUE) == 1) + return TRUE; + } + return FALSE; +} + static u8 ChooseMoveOrAction_Singles(void) { u8 currentMoveArray[MAX_MON_MOVES]; u8 consideredMoveArray[MAX_MON_MOVES]; - u8 numOfBestMoves; - s32 i; + u32 numOfBestMoves; + s32 i, id; + u32 flags = AI_THINKING_STRUCT->aiFlags; RecordLastUsedMoveByTarget(); - while (AI_THINKING_STRUCT->aiFlags != 0) + while (flags != 0) { - if (AI_THINKING_STRUCT->aiFlags & 1) + if (flags & 1) { AI_THINKING_STRUCT->aiState = AIState_SettingUp; BattleAI_DoAIProcessing(); } - AI_THINKING_STRUCT->aiFlags >>= 1; + flags >>= 1; AI_THINKING_STRUCT->aiLogicId++; AI_THINKING_STRUCT->movesetIndex = 0; } + for (i = 0; i < MAX_MON_MOVES; i++) + gBattleStruct->aiFinalScore[sBattler_AI][gBattlerTarget][i] = AI_THINKING_STRUCT->score[i]; + // Check special AI actions. if (AI_THINKING_STRUCT->aiAction & AI_ACTION_FLEE) return AI_CHOICE_FLEE; if (AI_THINKING_STRUCT->aiAction & AI_ACTION_WATCH) return AI_CHOICE_WATCH; + gActiveBattler = sBattler_AI; + // If can switch. + if (CountUsablePartyMons(sBattler_AI) >= 1 + && !IsAbilityPreventingEscape(sBattler_AI) + && !(gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) + && !(gStatuses3[gActiveBattler] & STATUS3_ROOTED) + && !(gBattleTypeFlags & (BATTLE_TYPE_ARENA | BATTLE_TYPE_PALACE)) + && AI_THINKING_STRUCT->aiFlags & (AI_SCRIPT_CHECK_VIABILITY | AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_PREFER_BATON_PASS)) + { + // Consider switching if all moves are worthless to use. + if (GetTotalBaseStat(gBattleMons[sBattler_AI].species) >= 310 // Mon is not weak. + && gBattleMons[sBattler_AI].hp >= gBattleMons[sBattler_AI].maxHP / 2) + { + s32 cap = AI_THINKING_STRUCT->aiFlags & (AI_SCRIPT_CHECK_VIABILITY) ? 95 : 93; + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (AI_THINKING_STRUCT->score[i] > cap) + break; + } + + if (i == MAX_MON_MOVES && GetMostSuitableMonToSwitchInto() != PARTY_SIZE) + { + AI_THINKING_STRUCT->switchMon = TRUE; + return AI_CHOICE_SWITCH; + } + } + + // Consider switching if your mon with truant is bodied by Protect spam. + // Or is using a double turn semi invulnerable move(such as Fly) and is faster. + if (GetBattlerAbility(sBattler_AI) == ABILITY_TRUANT + && IsTruantMonVulnerable(sBattler_AI, gBattlerTarget) + && gDisableStructs[sBattler_AI].truantCounter + && gBattleMons[sBattler_AI].hp >= gBattleMons[sBattler_AI].maxHP / 2) + { + if (GetMostSuitableMonToSwitchInto() != PARTY_SIZE) + { + AI_THINKING_STRUCT->switchMon = TRUE; + return AI_CHOICE_SWITCH; + } + } + } + numOfBestMoves = 1; currentMoveArray[0] = AI_THINKING_STRUCT->score[0]; consideredMoveArray[0] = 0; @@ -448,9 +575,8 @@ static u8 ChooseMoveOrAction_Singles(void) static u8 ChooseMoveOrAction_Doubles(void) { - s32 i; - s32 j; - s32 scriptsToRun; + s32 i, j; + u32 flags; s16 bestMovePointsForTarget[MAX_BATTLERS_COUNT]; s8 mostViableTargetsArray[MAX_BATTLERS_COUNT]; u8 actionOrMoveIndex[MAX_BATTLERS_COUNT]; @@ -481,15 +607,15 @@ static u8 ChooseMoveOrAction_Doubles(void) AI_THINKING_STRUCT->aiLogicId = 0; AI_THINKING_STRUCT->movesetIndex = 0; - scriptsToRun = AI_THINKING_STRUCT->aiFlags; - while (scriptsToRun != 0) + flags = AI_THINKING_STRUCT->aiFlags; + while (flags != 0) { - if (scriptsToRun & 1) + if (flags & 1) { AI_THINKING_STRUCT->aiState = AIState_SettingUp; BattleAI_DoAIProcessing(); } - scriptsToRun >>= 1; + flags >>= 1; AI_THINKING_STRUCT->aiLogicId++; AI_THINKING_STRUCT->movesetIndex = 0; } @@ -535,6 +661,9 @@ static u8 ChooseMoveOrAction_Doubles(void) mostViableMovesScores[0] = mostViableMovesScores[0]; // Needed to match. } } + + for (j = 0; j < MAX_MON_MOVES; j++) + gBattleStruct->aiFinalScore[sBattler_AI][gBattlerTarget][j] = AI_THINKING_STRUCT->score[j]; } } @@ -609,27 +738,54 @@ static void BattleAI_DoAIProcessing(void) static void RecordLastUsedMoveByTarget(void) { - s32 i; + RecordKnownMove(gBattlerTarget, gLastMoves[gBattlerTarget]); +} - for (i = 0; i < MAX_MON_MOVES; i++) +bool32 IsBattlerAIControlled(u32 battlerId) +{ + switch (GetBattlerPosition(battlerId)) { - if (BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] == gLastMoves[gBattlerTarget]) - break; - if (BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] != gLastMoves[gBattlerTarget] // HACK: This redundant condition is a hack to make the asm match. - && BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] == MOVE_NONE) - { - BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] = gLastMoves[gBattlerTarget]; - break; - } + case B_POSITION_PLAYER_LEFT: + default: + return FALSE; + case B_POSITION_OPPONENT_LEFT: + return TRUE; + case B_POSITION_PLAYER_RIGHT: + return ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) != 0); + case B_POSITION_OPPONENT_RIGHT: + return TRUE; } } void ClearBattlerMoveHistory(u8 battlerId) { - s32 i; + memset(BATTLE_HISTORY->usedMoves[battlerId], 0, sizeof(BATTLE_HISTORY->usedMoves[battlerId])); + memset(BATTLE_HISTORY->moveHistory[battlerId], 0, sizeof(BATTLE_HISTORY->moveHistory[battlerId])); + BATTLE_HISTORY->moveHistoryIndex[battlerId] = 0; +} +void RecordLastUsedMoveBy(u32 battlerId, u32 move) +{ + u8 *index = &BATTLE_HISTORY->moveHistoryIndex[battlerId]; + + if (++(*index) >= AI_MOVE_HISTORY_COUNT) + *index = 0; + BATTLE_HISTORY->moveHistory[battlerId][*index] = move; +} + +void RecordKnownMove(u8 battlerId, u32 move) +{ + s32 i; for (i = 0; i < MAX_MON_MOVES; i++) - BATTLE_HISTORY->usedMoves[battlerId].moves[i] = MOVE_NONE; + { + if (BATTLE_HISTORY->usedMoves[battlerId][i] == move) + break; + if (BATTLE_HISTORY->usedMoves[battlerId][i] == MOVE_NONE) + { + BATTLE_HISTORY->usedMoves[battlerId][i] = move; + break; + } + } } void RecordAbilityBattle(u8 battlerId, u8 abilityId) @@ -652,6 +808,164 @@ void ClearBattlerItemEffectHistory(u8 battlerId) BATTLE_HISTORY->itemEffects[battlerId] = 0; } +static void SaveBattlerData(u8 battlerId) +{ + if (!IsBattlerAIControlled(battlerId)) + { + u32 i; + + AI_THINKING_STRUCT->saved[battlerId].ability = gBattleMons[battlerId].ability; + AI_THINKING_STRUCT->saved[battlerId].heldItem = gBattleMons[battlerId].item; + AI_THINKING_STRUCT->saved[battlerId].species = gBattleMons[battlerId].species; + for (i = 0; i < 4; i++) + AI_THINKING_STRUCT->saved[battlerId].moves[i] = gBattleMons[battlerId].moves[i]; + } +} + +static void SetBattlerData(u8 battlerId) +{ + if (!IsBattlerAIControlled(battlerId)) + { + struct Pokemon *illusionMon; + u32 i; + + // Use the known battler's ability. + if (BATTLE_HISTORY->abilities[battlerId] != ABILITY_NONE) + gBattleMons[battlerId].ability = BATTLE_HISTORY->abilities[battlerId]; + // Check if mon can only have one ability. + else if (gBaseStats[gBattleMons[battlerId].species].abilities[1] == ABILITY_NONE + || gBaseStats[gBattleMons[battlerId].species].abilities[1] == gBaseStats[gBattleMons[battlerId].species].abilities[0]) + gBattleMons[battlerId].ability = gBaseStats[gBattleMons[battlerId].species].abilities[0]; + // The ability is unknown. + else + gBattleMons[battlerId].ability = ABILITY_NONE; + + if (BATTLE_HISTORY->itemEffects[battlerId] == 0) + gBattleMons[battlerId].item = 0; + + for (i = 0; i < 4; i++) + { + if (BATTLE_HISTORY->usedMoves[battlerId][i] == 0) + gBattleMons[battlerId].moves[i] = 0; + } + + // Simulate Illusion + if ((illusionMon = GetIllusionMonPtr(battlerId)) != NULL) + gBattleMons[battlerId].species = GetMonData(illusionMon, MON_DATA_SPECIES2); + } +} + +static void RestoreBattlerData(u8 battlerId) +{ + if (!IsBattlerAIControlled(battlerId)) + { + u32 i; + + gBattleMons[battlerId].ability = AI_THINKING_STRUCT->saved[battlerId].ability; + gBattleMons[battlerId].item = AI_THINKING_STRUCT->saved[battlerId].heldItem; + gBattleMons[battlerId].species = AI_THINKING_STRUCT->saved[battlerId].species; + for (i = 0; i < 4; i++) + gBattleMons[battlerId].moves[i] = AI_THINKING_STRUCT->saved[battlerId].moves[i]; + } +} + +static bool32 AI_GetIfCrit(u32 move, u8 battlerAtk, u8 battlerDef) +{ + bool32 isCrit; + + switch (CalcCritChanceStage(battlerAtk, battlerDef, move, FALSE)) + { + case -1: + case 0: + default: + isCrit = FALSE; + break; + case 1: + if (gBattleMoves[move].flags & FLAG_HIGH_CRIT && (Random() % 5 == 0)) + isCrit = TRUE; + else + isCrit = FALSE; + break; + case 2: + if (gBattleMoves[move].flags & FLAG_HIGH_CRIT && (Random() % 2 == 0)) + isCrit = TRUE; + else if (!(gBattleMoves[move].flags & FLAG_HIGH_CRIT) && (Random() % 4) == 0) + isCrit = TRUE; + else + isCrit = FALSE; + break; + case -2: + case 3: + case 4: + isCrit = TRUE; + break; + } + + return isCrit; +} + +s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef) +{ + s32 dmg, moveType; + + SaveBattlerData(battlerAtk); + SaveBattlerData(battlerDef); + + SetBattlerData(battlerAtk); + SetBattlerData(battlerDef); + + gBattleStruct->dynamicMoveType = 0; + SetTypeBeforeUsingMove(move, battlerAtk); + GET_MOVE_TYPE(move, moveType); + dmg = CalculateMoveDamage(move, battlerAtk, battlerDef, moveType, 0, AI_GetIfCrit(move, battlerAtk, battlerDef), FALSE, FALSE); + + RestoreBattlerData(battlerAtk); + RestoreBattlerData(battlerDef); + + return dmg; +} + +s32 AI_CalcPartyMonDamage(u16 move, u8 battlerAtk, u8 battlerDef, struct Pokemon *mon) +{ + s32 dmg; + u32 i; + struct BattlePokemon *battleMons = Alloc(sizeof(struct BattlePokemon) * MAX_BATTLERS_COUNT); + + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + battleMons[i] = gBattleMons[i]; + + PokemonToBattleMon(mon, &gBattleMons[battlerAtk]); + dmg = AI_CalcDamage(move, battlerAtk, battlerDef); + + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + gBattleMons[i] = battleMons[i]; + + Free(battleMons); + + return dmg; +} + +u16 AI_GetTypeEffectiveness(u16 move, u8 battlerAtk, u8 battlerDef) +{ + u16 typeEffectiveness, moveType; + + SaveBattlerData(battlerAtk); + SaveBattlerData(battlerDef); + + SetBattlerData(battlerAtk); + SetBattlerData(battlerDef); + + gBattleStruct->dynamicMoveType = 0; + SetTypeBeforeUsingMove(move, battlerAtk); + GET_MOVE_TYPE(move, moveType); + typeEffectiveness = CalcTypeEffectivenessMultiplier(move, moveType, battlerAtk, battlerDef, FALSE); + + RestoreBattlerData(battlerAtk); + RestoreBattlerData(battlerDef); + + return typeEffectiveness; +} + static void Cmd_if_random_less_than(void) { u16 random = Random(); @@ -702,14 +1016,25 @@ static void Cmd_score(void) gAIScriptPtr += 2; // AI return. } +static u8 BattleAI_GetWantedBattler(u8 wantedBattler) +{ + switch (wantedBattler) + { + case AI_USER: + return sBattler_AI; + case AI_TARGET: + default: + return gBattlerTarget; + case AI_USER_PARTNER: + return sBattler_AI ^ BIT_FLANK; + case AI_TARGET_PARTNER: + return gBattlerTarget ^ BIT_FLANK; + } +} + static void Cmd_if_hp_less_than(void) { - u16 battlerId; - - if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; - else - battlerId = gBattlerTarget; + u16 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) < gAIScriptPtr[2]) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); @@ -719,12 +1044,7 @@ static void Cmd_if_hp_less_than(void) static void Cmd_if_hp_more_than(void) { - u16 battlerId; - - if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; - else - battlerId = gBattlerTarget; + u16 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) > gAIScriptPtr[2]) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); @@ -734,12 +1054,7 @@ static void Cmd_if_hp_more_than(void) static void Cmd_if_hp_equal(void) { - u16 battlerId; - - if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; - else - battlerId = gBattlerTarget; + u16 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) == gAIScriptPtr[2]) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); @@ -749,12 +1064,7 @@ static void Cmd_if_hp_equal(void) static void Cmd_if_hp_not_equal(void) { - u16 battlerId; - - if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; - else - battlerId = gBattlerTarget; + u16 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) != gAIScriptPtr[2]) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); @@ -764,15 +1074,8 @@ static void Cmd_if_hp_not_equal(void) static void Cmd_if_status(void) { - u16 battlerId; - u32 status; - - if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; - else - battlerId = gBattlerTarget; - - status = T1_READ_32(gAIScriptPtr + 2); + u16 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + u32 status = T1_READ_32(gAIScriptPtr + 2); if (gBattleMons[battlerId].status1 & status) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); @@ -782,15 +1085,8 @@ static void Cmd_if_status(void) static void Cmd_if_not_status(void) { - u16 battlerId; - u32 status; - - if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; - else - battlerId = gBattlerTarget; - - status = T1_READ_32(gAIScriptPtr + 2); + u16 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + u32 status = T1_READ_32(gAIScriptPtr + 2); if (!(gBattleMons[battlerId].status1 & status)) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); @@ -800,15 +1096,8 @@ static void Cmd_if_not_status(void) static void Cmd_if_status2(void) { - u16 battlerId; - u32 status; - - if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; - else - battlerId = gBattlerTarget; - - status = T1_READ_32(gAIScriptPtr + 2); + u16 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + u32 status = T1_READ_32(gAIScriptPtr + 2); if ((gBattleMons[battlerId].status2 & status)) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); @@ -818,15 +1107,8 @@ static void Cmd_if_status2(void) static void Cmd_if_not_status2(void) { - u16 battlerId; - u32 status; - - if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; - else - battlerId = gBattlerTarget; - - status = T1_READ_32(gAIScriptPtr + 2); + u16 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + u32 status = T1_READ_32(gAIScriptPtr + 2); if (!(gBattleMons[battlerId].status2 & status)) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); @@ -836,15 +1118,8 @@ static void Cmd_if_not_status2(void) static void Cmd_if_status3(void) { - u16 battlerId; - u32 status; - - if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; - else - battlerId = gBattlerTarget; - - status = T1_READ_32(gAIScriptPtr + 2); + u16 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + u32 status = T1_READ_32(gAIScriptPtr + 2); if (gStatuses3[battlerId] & status) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); @@ -854,15 +1129,8 @@ static void Cmd_if_status3(void) static void Cmd_if_not_status3(void) { - u16 battlerId; - u32 status; - - if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; - else - battlerId = gBattlerTarget; - - status = T1_READ_32(gAIScriptPtr + 2); + u16 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + u32 status = T1_READ_32(gAIScriptPtr + 2); if (!(gStatuses3[battlerId] & status)) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); @@ -872,16 +1140,9 @@ static void Cmd_if_not_status3(void) static void Cmd_if_side_affecting(void) { - u16 battlerId; - u32 side, status; - - if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; - else - battlerId = gBattlerTarget; - - side = GET_BATTLER_SIDE(battlerId); - status = T1_READ_32(gAIScriptPtr + 2); + u16 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + u32 status = T1_READ_32(gAIScriptPtr + 2); + u32 side = GET_BATTLER_SIDE(battlerId); if (gSideStatuses[side] & status) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); @@ -891,16 +1152,9 @@ static void Cmd_if_side_affecting(void) static void Cmd_if_not_side_affecting(void) { - u16 battlerId; - u32 side, status; - - if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; - else - battlerId = gBattlerTarget; - - side = GET_BATTLER_SIDE(battlerId); - status = T1_READ_32(gAIScriptPtr + 2); + u16 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + u32 status = T1_READ_32(gAIScriptPtr + 2); + u32 side = GET_BATTLER_SIDE(battlerId); if (!(gSideStatuses[side] & status)) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); @@ -1129,22 +1383,6 @@ static void Cmd_get_type(void) gAIScriptPtr += 2; } -static u8 BattleAI_GetWantedBattler(u8 wantedBattler) -{ - switch (wantedBattler) - { - case AI_USER: - return sBattler_AI; - case AI_TARGET: - default: - return gBattlerTarget; - case AI_USER_PARTNER: - return sBattler_AI ^ BIT_FLANK; - case AI_TARGET_PARTNER: - return gBattlerTarget ^ BIT_FLANK; - } -} - static void Cmd_is_of_type(void) { u8 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); @@ -1163,9 +1401,67 @@ static void Cmd_get_considered_move_power(void) gAIScriptPtr += 1; } +// Checks if one of the moves has side effects or perks +static u32 WhichMoveBetter(u32 move1, u32 move2) +{ + s32 defAbility = AI_GetAbility(gBattlerTarget, FALSE); + + // Check if physical moves hurt. + if (GetBattlerHoldEffect(sBattler_AI, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS + && (BATTLE_HISTORY->itemEffects[gBattlerTarget] == HOLD_EFFECT_ROCKY_HELMET + || defAbility == ABILITY_IRON_BARBS || defAbility == ABILITY_ROUGH_SKIN)) + { + if (IS_MOVE_PHYSICAL(move1) && !IS_MOVE_PHYSICAL(move2)) + return 1; + if (IS_MOVE_PHYSICAL(move2) && !IS_MOVE_PHYSICAL(move1)) + return 0; + } + // Check recoil + if (GetBattlerAbility(sBattler_AI) != ABILITY_ROCK_HEAD) + { + if (((gBattleMoves[move1].effect == EFFECT_RECOIL_25 + || gBattleMoves[move1].effect == EFFECT_RECOIL_IF_MISS + || gBattleMoves[move1].effect == EFFECT_RECOIL_50 + || gBattleMoves[move1].effect == EFFECT_RECOIL_33 + || gBattleMoves[move1].effect == EFFECT_RECOIL_33_STATUS) + && (gBattleMoves[move2].effect != EFFECT_RECOIL_25 + && gBattleMoves[move2].effect != EFFECT_RECOIL_IF_MISS + && gBattleMoves[move2].effect != EFFECT_RECOIL_50 + && gBattleMoves[move2].effect != EFFECT_RECOIL_33 + && gBattleMoves[move2].effect != EFFECT_RECOIL_33_STATUS + && gBattleMoves[move2].effect != EFFECT_RECHARGE))) + return 1; + + if (((gBattleMoves[move2].effect == EFFECT_RECOIL_25 + || gBattleMoves[move2].effect == EFFECT_RECOIL_IF_MISS + || gBattleMoves[move2].effect == EFFECT_RECOIL_50 + || gBattleMoves[move2].effect == EFFECT_RECOIL_33 + || gBattleMoves[move2].effect == EFFECT_RECOIL_33_STATUS) + && (gBattleMoves[move1].effect != EFFECT_RECOIL_25 + && gBattleMoves[move1].effect != EFFECT_RECOIL_IF_MISS + && gBattleMoves[move1].effect != EFFECT_RECOIL_50 + && gBattleMoves[move1].effect != EFFECT_RECOIL_33 + && gBattleMoves[move1].effect != EFFECT_RECOIL_33_STATUS + && gBattleMoves[move1].effect != EFFECT_RECHARGE))) + return 0; + } + // Check recharge + if (gBattleMoves[move1].effect == EFFECT_RECHARGE && gBattleMoves[move2].effect != EFFECT_RECHARGE) + return 1; + if (gBattleMoves[move2].effect == EFFECT_RECHARGE && gBattleMoves[move1].effect != EFFECT_RECHARGE) + return 0; + // Check additional effect. + if (gBattleMoves[move1].effect == 0 && gBattleMoves[move2].effect != 0) + return 1; + if (gBattleMoves[move2].effect == 0 && gBattleMoves[move1].effect != 0) + return 0; + + return 2; +} + static void Cmd_get_how_powerful_move_is(void) { - s32 i, checkedMove; + s32 i, checkedMove, bestId, currId, hp; s32 moveDmgs[MAX_MON_MOVES]; for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++) @@ -1174,15 +1470,9 @@ static void Cmd_get_how_powerful_move_is(void) break; } - if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power > 1 + if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power != 0 && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF) { - gDynamicBasePower = 0; - *(&gBattleStruct->dynamicMoveType) = 0; - gBattleScripting.dmgMultiplier = 1; - gMoveResultFlags = 0; - gCritMultiplier = 1; - for (checkedMove = 0; checkedMove < MAX_MON_MOVES; checkedMove++) { for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++) @@ -1193,14 +1483,9 @@ static void Cmd_get_how_powerful_move_is(void) if (gBattleMons[sBattler_AI].moves[checkedMove] != MOVE_NONE && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF - && gBattleMoves[gBattleMons[sBattler_AI].moves[checkedMove]].power > 1) + && gBattleMoves[gBattleMons[sBattler_AI].moves[checkedMove]].power != 0) { - gCurrentMove = gBattleMons[sBattler_AI].moves[checkedMove]; - AI_CalcDmg(sBattler_AI, gBattlerTarget); - TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget); - moveDmgs[checkedMove] = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[checkedMove] / 100; - if (moveDmgs[checkedMove] == 0) - moveDmgs[checkedMove] = 1; + moveDmgs[checkedMove] = AI_THINKING_STRUCT->simulatedDmg[sBattler_AI][gBattlerTarget][checkedMove]; } else { @@ -1208,16 +1493,42 @@ static void Cmd_get_how_powerful_move_is(void) } } - for (checkedMove = 0; checkedMove < MAX_MON_MOVES; checkedMove++) + hp = gBattleMons[gBattlerTarget].hp + (20 * gBattleMons[gBattlerTarget].hp / 100); // 20 % add to make sure the battler is always fainted + // If a move can faint battler, it doesn't matter how much damage it does + for (i = 0; i < MAX_MON_MOVES; i++) { - if (moveDmgs[checkedMove] > moveDmgs[AI_THINKING_STRUCT->movesetIndex]) - break; + if (moveDmgs[i] > hp) + moveDmgs[i] = hp; } - if (checkedMove == MAX_MON_MOVES) - AI_THINKING_STRUCT->funcResult = MOVE_MOST_POWERFUL; // Is the most powerful. + for (bestId = 0, i = 1; i < MAX_MON_MOVES; i++) + { + if (moveDmgs[i] > moveDmgs[bestId]) + bestId = i; + if (moveDmgs[i] == moveDmgs[bestId]) + { + switch (WhichMoveBetter(gBattleMons[sBattler_AI].moves[bestId], gBattleMons[sBattler_AI].moves[i])) + { + case 2: + if (Random() & 1) + break; + case 1: + bestId = i; + break; + } + } + } + + currId = AI_THINKING_STRUCT->movesetIndex; + if (currId == bestId) + AI_THINKING_STRUCT->funcResult = MOVE_POWER_BEST; + // Compare percentage difference. + else if ((moveDmgs[currId] >= hp || moveDmgs[bestId] < hp) // If current move can faint as well, or if neither can + && (moveDmgs[bestId] * 100 / hp) - (moveDmgs[currId] * 100 / hp) <= 30 + && WhichMoveBetter(gBattleMons[sBattler_AI].moves[bestId], gBattleMons[sBattler_AI].moves[currId]) != 0) + AI_THINKING_STRUCT->funcResult = MOVE_POWER_GOOD; else - AI_THINKING_STRUCT->funcResult = MOVE_NOT_MOST_POWERFUL; // Not the most powerful. + AI_THINKING_STRUCT->funcResult = MOVE_POWER_WEAK; } else { @@ -1229,44 +1540,70 @@ static void Cmd_get_how_powerful_move_is(void) static void Cmd_get_last_used_battler_move(void) { - if (gAIScriptPtr[1] == AI_USER) - AI_THINKING_STRUCT->funcResult = gLastMoves[sBattler_AI]; - else - AI_THINKING_STRUCT->funcResult = gLastMoves[gBattlerTarget]; - + AI_THINKING_STRUCT->funcResult = gLastMoves[BattleAI_GetWantedBattler(gAIScriptPtr[1])]; gAIScriptPtr += 2; } -static void Cmd_if_equal_(void) // Same as if_equal. +static void Cmd_if_equal_u32(void) { - if (gAIScriptPtr[1] == AI_THINKING_STRUCT->funcResult) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); + if (T1_READ_32(&gAIScriptPtr[1]) == AI_THINKING_STRUCT->funcResult) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5); else - gAIScriptPtr += 6; + gAIScriptPtr += 9; } -static void Cmd_if_not_equal_(void) // Same as if_not_equal. +static void Cmd_if_not_equal_u32(void) { - if (gAIScriptPtr[1] != AI_THINKING_STRUCT->funcResult) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); + if (T1_READ_32(&gAIScriptPtr[1]) != AI_THINKING_STRUCT->funcResult) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5); else - gAIScriptPtr += 6; + gAIScriptPtr += 9; } static void Cmd_if_user_goes(void) { - if (GetWhoStrikesFirst(sBattler_AI, gBattlerTarget, TRUE) == gAIScriptPtr[1]) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; -} + u32 fasterAI = 0, fasterPlayer = 0, i; + s8 prioAI, prioPlayer; -static void Cmd_if_user_doesnt_go(void) -{ - if (GetWhoStrikesFirst(sBattler_AI, gBattlerTarget, TRUE) != gAIScriptPtr[1]) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); + // Check move priorities first. + prioAI = GetMovePriority(sBattler_AI, AI_THINKING_STRUCT->moveConsidered); + SaveBattlerData(gBattlerTarget); + SetBattlerData(gBattlerTarget); + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (gBattleMons[gBattlerTarget].moves[i] == 0 || gBattleMons[gBattlerTarget].moves[i] == 0xFFFF) + continue; + + prioPlayer = GetMovePriority(gBattlerTarget, gBattleMons[gBattlerTarget].moves[i]); + if (prioAI > prioPlayer) + fasterAI++; + else if (prioPlayer > prioAI) + fasterPlayer++; + } + RestoreBattlerData(gBattlerTarget); + + if (fasterAI > fasterPlayer) + { + if (gAIScriptPtr[1] == 0) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; + } + else if (fasterAI < fasterPlayer) + { + if (gAIScriptPtr[1] == 1) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; + } else - gAIScriptPtr += 6; + { + // Priorities are the same(at least comparing to moves the AI is aware of), decide by speed. + if (GetWhoStrikesFirst(sBattler_AI, gBattlerTarget, TRUE) == gAIScriptPtr[1]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; + } } static void Cmd_nullsub_2A(void) @@ -1277,19 +1614,10 @@ static void Cmd_nullsub_2B(void) { } -static void Cmd_count_usable_party_mons(void) +static s32 CountUsablePartyMons(u8 battlerId) { - u8 battlerId; - u8 battlerOnField1, battlerOnField2; + s32 battlerOnField1, battlerOnField2, i, ret; struct Pokemon *party; - s32 i; - - AI_THINKING_STRUCT->funcResult = 0; - - if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; - else - battlerId = gBattlerTarget; if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) party = gPlayerParty; @@ -1298,10 +1626,8 @@ static void Cmd_count_usable_party_mons(void) if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { - u8 position; battlerOnField1 = gBattlerPartyIndexes[battlerId]; - position = GetBattlerPosition(battlerId) ^ BIT_FLANK; - battlerOnField2 = gBattlerPartyIndexes[GetBattlerAtPosition(position)]; + battlerOnField2 = gBattlerPartyIndexes[GetBattlerAtPosition(GetBattlerPosition(battlerId) ^ BIT_FLANK)]; } else // In singles there's only one battlerId by side. { @@ -1309,6 +1635,7 @@ static void Cmd_count_usable_party_mons(void) battlerOnField2 = gBattlerPartyIndexes[battlerId]; } + ret = 0; for (i = 0; i < PARTY_SIZE; i++) { if (i != battlerOnField1 && i != battlerOnField2 @@ -1316,10 +1643,16 @@ static void Cmd_count_usable_party_mons(void) && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG) { - AI_THINKING_STRUCT->funcResult++; + ret++; } } + return ret; +} + +static void Cmd_count_usable_party_mons(void) +{ + AI_THINKING_STRUCT->funcResult = CountUsablePartyMons(BattleAI_GetWantedBattler(gAIScriptPtr[1])); gAIScriptPtr += 2; } @@ -1335,114 +1668,49 @@ static void Cmd_get_considered_move_effect(void) gAIScriptPtr += 1; } -static void Cmd_get_ability(void) +static s32 AI_GetAbility(u32 battlerId, bool32 guess) { - u8 battlerId; + // The AI knows its own ability. + if (IsBattlerAIControlled(battlerId)) + return gBattleMons[battlerId].ability; - if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; - else - battlerId = gBattlerTarget; + if (BATTLE_HISTORY->abilities[battlerId] != 0) + return BATTLE_HISTORY->abilities[battlerId]; - if (gActiveBattler != battlerId) + // Abilities that prevent fleeing. + if (gBattleMons[battlerId].ability == ABILITY_SHADOW_TAG + || gBattleMons[battlerId].ability == ABILITY_MAGNET_PULL + || gBattleMons[battlerId].ability == ABILITY_ARENA_TRAP) + return gBattleMons[battlerId].ability; + + if (gBaseStats[gBattleMons[battlerId].species].abilities[0] != ABILITY_NONE) { - if (BATTLE_HISTORY->abilities[battlerId] != 0) + if (gBaseStats[gBattleMons[battlerId].species].abilities[1] != ABILITY_NONE) { - AI_THINKING_STRUCT->funcResult = BATTLE_HISTORY->abilities[battlerId]; - gAIScriptPtr += 2; - return; - } - - // abilities that prevent fleeing. - if (gBattleMons[battlerId].ability == ABILITY_SHADOW_TAG - || gBattleMons[battlerId].ability == ABILITY_MAGNET_PULL - || gBattleMons[battlerId].ability == ABILITY_ARENA_TRAP) - { - AI_THINKING_STRUCT->funcResult = gBattleMons[battlerId].ability; - gAIScriptPtr += 2; - return; - } - - if (gBaseStats[gBattleMons[battlerId].species].abilities[0] != ABILITY_NONE) - { - if (gBaseStats[gBattleMons[battlerId].species].abilities[1] != ABILITY_NONE) - { - // AI has no knowledge of opponent, so it guesses which ability. - if (Random() & 1) - AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[battlerId].species].abilities[0]; - else - AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[battlerId].species].abilities[1]; - } - else - { - AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[battlerId].species].abilities[0]; // It's definitely ability 1. - } + // AI has no knowledge of opponent, so it guesses which ability. + if (guess) + return gBaseStats[gBattleMons[battlerId].species].abilities[Random() & 1]; } else { - AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[battlerId].species].abilities[1]; // AI can't actually reach this part since no pokemon has ability 2 and no ability 1. + return gBaseStats[gBattleMons[battlerId].species].abilities[0]; // It's definitely ability 1. } } - else - { - // The AI knows its own ability. - AI_THINKING_STRUCT->funcResult = gBattleMons[battlerId].ability; - } + return -1; // Unknown. +} +static void Cmd_get_ability(void) +{ + AI_THINKING_STRUCT->funcResult = AI_GetAbility(BattleAI_GetWantedBattler(gAIScriptPtr[1]), TRUE); gAIScriptPtr += 2; } static void Cmd_check_ability(void) { u32 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); - u32 ability = gAIScriptPtr[2]; + u32 ability = AI_GetAbility(battlerId, FALSE); - if (gAIScriptPtr[1] == AI_TARGET || gAIScriptPtr[1] == AI_TARGET_PARTNER) - { - if (BATTLE_HISTORY->abilities[battlerId] != ABILITY_NONE) - { - ability = BATTLE_HISTORY->abilities[battlerId]; - AI_THINKING_STRUCT->funcResult = ability; - } - // Abilities that prevent fleeing. - else if (gBattleMons[battlerId].ability == ABILITY_SHADOW_TAG - || gBattleMons[battlerId].ability == ABILITY_MAGNET_PULL - || gBattleMons[battlerId].ability == ABILITY_ARENA_TRAP) - { - ability = gBattleMons[battlerId].ability; - } - else if (gBaseStats[gBattleMons[battlerId].species].abilities[0] != ABILITY_NONE) - { - if (gBaseStats[gBattleMons[battlerId].species].abilities[1] != ABILITY_NONE) - { - u8 abilityDummyVariable = ability; // Needed to match. - if (gBaseStats[gBattleMons[battlerId].species].abilities[0] != abilityDummyVariable - && gBaseStats[gBattleMons[battlerId].species].abilities[1] != abilityDummyVariable) - { - ability = gBaseStats[gBattleMons[battlerId].species].abilities[0]; - } - else - { - ability = ABILITY_NONE; - } - } - else - { - ability = gBaseStats[gBattleMons[battlerId].species].abilities[0]; - } - } - else - { - ability = gBaseStats[gBattleMons[battlerId].species].abilities[1]; // AI can't actually reach this part since no pokemon has ability 2 and no ability 1. - } - } - else - { - // The AI knows its own or partner's ability. - ability = gBattleMons[battlerId].ability; - } - - if (ability == 0) + if (ability == -1) AI_THINKING_STRUCT->funcResult = 2; // Unable to answer. else if (ability == gAIScriptPtr[2]) AI_THINKING_STRUCT->funcResult = 1; // Pokemon has the ability we wanted to check. @@ -1455,36 +1723,38 @@ static void Cmd_check_ability(void) static void Cmd_get_highest_type_effectiveness(void) { s32 i; - u8 *dynamicMoveType; - gDynamicBasePower = 0; - dynamicMoveType = &gBattleStruct->dynamicMoveType; - *dynamicMoveType = 0; - gBattleScripting.dmgMultiplier = 1; gMoveResultFlags = 0; - gCritMultiplier = 1; AI_THINKING_STRUCT->funcResult = 0; - for (i = 0; i < MAX_MON_MOVES; i++) { - gBattleMoveDamage = 40; gCurrentMove = gBattleMons[sBattler_AI].moves[i]; - if (gCurrentMove != MOVE_NONE) { - TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget); + u32 effectivenessMultiplier = AI_GetTypeEffectiveness(gCurrentMove, sBattler_AI, gBattlerTarget); - if (gBattleMoveDamage == 120) // Super effective STAB. - gBattleMoveDamage = AI_EFFECTIVENESS_x2; - if (gBattleMoveDamage == 240) - gBattleMoveDamage = AI_EFFECTIVENESS_x4; - if (gBattleMoveDamage == 30) // Not very effective STAB. - gBattleMoveDamage = AI_EFFECTIVENESS_x0_5; - if (gBattleMoveDamage == 15) - gBattleMoveDamage = AI_EFFECTIVENESS_x0_25; - - if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) + switch (effectivenessMultiplier) + { + case UQ_4_12(0.0): + default: gBattleMoveDamage = AI_EFFECTIVENESS_x0; + break; + case UQ_4_12(0.25): + gBattleMoveDamage = AI_EFFECTIVENESS_x0_25; + break; + case UQ_4_12(0.5): + gBattleMoveDamage = AI_EFFECTIVENESS_x0_5; + break; + case UQ_4_12(1.0): + gBattleMoveDamage = AI_EFFECTIVENESS_x1; + break; + case UQ_4_12(2.0): + gBattleMoveDamage = AI_EFFECTIVENESS_x2; + break; + case UQ_4_12(4.0): + gBattleMoveDamage = AI_EFFECTIVENESS_x4; + break; + } if (AI_THINKING_STRUCT->funcResult < gBattleMoveDamage) AI_THINKING_STRUCT->funcResult = gBattleMoveDamage; @@ -1497,32 +1767,33 @@ static void Cmd_get_highest_type_effectiveness(void) static void Cmd_if_type_effectiveness(void) { u8 damageVar; + u32 effectivenessMultiplier; - gDynamicBasePower = 0; - gBattleStruct->dynamicMoveType = 0; - gBattleScripting.dmgMultiplier = 1; gMoveResultFlags = 0; - gCritMultiplier = 1; - - gBattleMoveDamage = AI_EFFECTIVENESS_x1; gCurrentMove = AI_THINKING_STRUCT->moveConsidered; - - TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget); - - if (gBattleMoveDamage == 120) // Super effective STAB. - gBattleMoveDamage = AI_EFFECTIVENESS_x2; - if (gBattleMoveDamage == 240) - gBattleMoveDamage = AI_EFFECTIVENESS_x4; - if (gBattleMoveDamage == 30) // Not very effective STAB. - gBattleMoveDamage = AI_EFFECTIVENESS_x0_5; - if (gBattleMoveDamage == 15) - gBattleMoveDamage = AI_EFFECTIVENESS_x0_25; - - if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) - gBattleMoveDamage = AI_EFFECTIVENESS_x0; - - // Store gBattleMoveDamage in a u8 variable because gAIScriptPtr[1] is a u8. - damageVar = gBattleMoveDamage; + effectivenessMultiplier = AI_GetTypeEffectiveness(gCurrentMove, sBattler_AI, gBattlerTarget); + switch (effectivenessMultiplier) + { + case UQ_4_12(0.0): + default: + damageVar = AI_EFFECTIVENESS_x0; + break; + case UQ_4_12(0.25): + damageVar = AI_EFFECTIVENESS_x0_25; + break; + case UQ_4_12(0.5): + damageVar = AI_EFFECTIVENESS_x0_5; + break; + case UQ_4_12(1.0): + damageVar = AI_EFFECTIVENESS_x1; + break; + case UQ_4_12(2.0): + damageVar = AI_EFFECTIVENESS_x2; + break; + case UQ_4_12(4.0): + damageVar = AI_EFFECTIVENESS_x4; + break; + } if (damageVar == gAIScriptPtr[1]) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); @@ -1543,17 +1814,7 @@ static void Cmd_if_status_in_party(void) struct Pokemon *party; s32 i; u32 statusToCompareTo; - u8 battlerId; - - switch (gAIScriptPtr[1]) - { - case AI_USER: - battlerId = sBattler_AI; - break; - default: - battlerId = gBattlerTarget; - break; - } + u8 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); party = (GetBattlerSide(battlerId) == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty; @@ -1580,17 +1841,7 @@ static void Cmd_if_status_not_in_party(void) struct Pokemon *party; s32 i; u32 statusToCompareTo; - u8 battlerId; - - switch(gAIScriptPtr[1]) - { - case 1: - battlerId = sBattler_AI; - break; - default: - battlerId = gBattlerTarget; - break; - } + u8 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); party = (GetBattlerSide(battlerId) == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty; @@ -1604,8 +1855,8 @@ static void Cmd_if_status_not_in_party(void) if (species != SPECIES_NONE && species != SPECIES_EGG && hp != 0 && status == statusToCompareTo) { - gAIScriptPtr += 10; // UB: Still bugged in Emerald. Uncomment the return statement to fix. - // return; + gAIScriptPtr += 10; + return; } } @@ -1616,30 +1867,32 @@ static void Cmd_get_weather(void) { if (gBattleWeather & WEATHER_RAIN_ANY) AI_THINKING_STRUCT->funcResult = AI_WEATHER_RAIN; - if (gBattleWeather & WEATHER_SANDSTORM_ANY) + else if (gBattleWeather & WEATHER_SANDSTORM_ANY) AI_THINKING_STRUCT->funcResult = AI_WEATHER_SANDSTORM; - if (gBattleWeather & WEATHER_SUN_ANY) + else if (gBattleWeather & WEATHER_SUN_ANY) AI_THINKING_STRUCT->funcResult = AI_WEATHER_SUN; - if (gBattleWeather & WEATHER_HAIL_ANY) + else if (gBattleWeather & WEATHER_HAIL_ANY) AI_THINKING_STRUCT->funcResult = AI_WEATHER_HAIL; + else + AI_THINKING_STRUCT->funcResult = AI_WEATHER_NONE; gAIScriptPtr += 1; } static void Cmd_if_effect(void) { - if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == gAIScriptPtr[1]) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); + if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == T1_READ_16(gAIScriptPtr + 1)) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); else - gAIScriptPtr += 6; + gAIScriptPtr += 7; } static void Cmd_if_not_effect(void) { - if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect != gAIScriptPtr[1]) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); + if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect != T1_READ_16(gAIScriptPtr + 1)) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); else - gAIScriptPtr += 6; + gAIScriptPtr += 7; } static void Cmd_if_stat_level_less_than(void) @@ -1704,28 +1957,16 @@ static void Cmd_if_stat_level_not_equal(void) static void Cmd_if_can_faint(void) { - if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power < 2) + s32 dmg; + + if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power == 0) { gAIScriptPtr += 5; return; } - gDynamicBasePower = 0; - gBattleStruct->dynamicMoveType = 0; - gBattleScripting.dmgMultiplier = 1; - gMoveResultFlags = 0; - gCritMultiplier = 1; - gCurrentMove = AI_THINKING_STRUCT->moveConsidered; - AI_CalcDmg(sBattler_AI, gBattlerTarget); - TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget); - - gBattleMoveDamage = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100; - - // Moves always do at least 1 damage. - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - - if (gBattleMons[gBattlerTarget].hp <= gBattleMoveDamage) + dmg = AI_THINKING_STRUCT->simulatedDmg[sBattler_AI][gBattlerTarget][AI_THINKING_STRUCT->movesetIndex]; + if (gBattleMons[gBattlerTarget].hp <= dmg) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); else gAIScriptPtr += 5; @@ -1733,26 +1974,16 @@ static void Cmd_if_can_faint(void) static void Cmd_if_cant_faint(void) { + s32 dmg; + if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power < 2) { gAIScriptPtr += 5; return; } - gDynamicBasePower = 0; - gBattleStruct->dynamicMoveType = 0; - gBattleScripting.dmgMultiplier = 1; - gMoveResultFlags = 0; - gCritMultiplier = 1; - gCurrentMove = AI_THINKING_STRUCT->moveConsidered; - AI_CalcDmg(sBattler_AI, gBattlerTarget); - TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget); - - gBattleMoveDamage = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100; - - // This macro is missing the damage 0 = 1 assumption. - - if (gBattleMons[gBattlerTarget].hp > gBattleMoveDamage) + dmg = AI_THINKING_STRUCT->simulatedDmg[sBattler_AI][gBattlerTarget][AI_THINKING_STRUCT->movesetIndex]; + if (gBattleMons[gBattlerTarget].hp > dmg) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); else gAIScriptPtr += 5; @@ -1799,7 +2030,7 @@ static void Cmd_if_has_move(void) case AI_TARGET_PARTNER: for (i = 0; i < MAX_MON_MOVES; i++) { - if (BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] == *movePtr) + if (BATTLE_HISTORY->usedMoves[gBattlerTarget][i] == *movePtr) break; } if (i == MAX_MON_MOVES) @@ -1833,7 +2064,7 @@ static void Cmd_if_doesnt_have_move(void) case AI_TARGET_PARTNER: for (i = 0; i < MAX_MON_MOVES; i++) { - if (BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] == *movePtr) + if (BATTLE_HISTORY->usedMoves[gBattlerTarget][i] == *movePtr) break; } if (i != MAX_MON_MOVES) @@ -1866,8 +2097,7 @@ static void Cmd_if_has_move_with_effect(void) case AI_TARGET_PARTNER: for (i = 0; i < MAX_MON_MOVES; i++) { - // UB: checks sBattler_AI instead of gBattlerTarget. - if (gBattleMons[sBattler_AI].moves[i] != 0 && gBattleMoves[BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i]].effect == gAIScriptPtr[2]) + if (gBattleMons[gBattlerTarget].moves[i] != 0 && gBattleMoves[BATTLE_HISTORY->usedMoves[gBattlerTarget][i]].effect == gAIScriptPtr[2]) break; } if (i == MAX_MON_MOVES) @@ -1900,7 +2130,7 @@ static void Cmd_if_doesnt_have_move_with_effect(void) case AI_TARGET_PARTNER: for (i = 0; i < MAX_MON_MOVES; i++) { - if (BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] && gBattleMoves[BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i]].effect == gAIScriptPtr[2]) + if (BATTLE_HISTORY->usedMoves[gBattlerTarget][i] && gBattleMoves[BATTLE_HISTORY->usedMoves[gBattlerTarget][i]].effect == gAIScriptPtr[2]) break; } if (i != MAX_MON_MOVES) @@ -1984,17 +2214,12 @@ static void Cmd_watch(void) static void Cmd_get_hold_effect(void) { - u8 battlerId; + u32 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); - if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; + if (!IsBattlerAIControlled(battlerId)) + AI_THINKING_STRUCT->funcResult = BATTLE_HISTORY->itemEffects[battlerId]; else - battlerId = gBattlerTarget; - - if (gActiveBattler != battlerId) - AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(BATTLE_HISTORY->itemEffects[battlerId]); - else - AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(gBattleMons[battlerId].item); + AI_THINKING_STRUCT->funcResult = GetBattlerHoldEffect(battlerId, FALSE); gAIScriptPtr += 2; } @@ -2003,18 +2228,13 @@ static void Cmd_if_holds_item(void) { u8 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); u16 item; - u8 var1, var2; if ((battlerId & BIT_SIDE) == (sBattler_AI & BIT_SIDE)) item = gBattleMons[battlerId].item; else item = BATTLE_HISTORY->itemEffects[battlerId]; - // UB: doesn't properly read an unaligned u16 - var2 = gAIScriptPtr[2]; - var1 = gAIScriptPtr[3]; - - if ((var1 | var2) == item) + if (T1_READ_16(gAIScriptPtr + 2) == item) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); else gAIScriptPtr += 8; @@ -2078,12 +2298,7 @@ static void Cmd_get_used_held_item(void) else battlerId = gBattlerTarget; - // This is likely a leftover from Ruby's code and its ugly ewram access. - #ifdef NONMATCHING - AI_THINKING_STRUCT->funcResult = gBattleStruct->usedHeldItems[battlerId]; - #else - AI_THINKING_STRUCT->funcResult = *(u8*)((u8*)(gBattleStruct) + offsetof(struct BattleStruct, usedHeldItems) + (battlerId * 2)); - #endif // NONMATCHING + AI_THINKING_STRUCT->funcResult = gBattleStruct->usedHeldItems[battlerId]; gAIScriptPtr += 2; } @@ -2123,24 +2338,59 @@ static void Cmd_get_protect_count(void) gAIScriptPtr += 2; } -static void Cmd_nullsub_52(void) +static void Cmd_if_move_flag(void) { + u32 flag = T1_READ_32(gAIScriptPtr + 1); + + if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].flags & flag) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5); + else + gAIScriptPtr += 9; } -static void Cmd_nullsub_53(void) +static void Cmd_if_field_status(void) { + u32 fieldFlags = T1_READ_32(gAIScriptPtr + 1); + + if (gFieldStatuses & fieldFlags) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5); + else + gAIScriptPtr += 9; } -static void Cmd_nullsub_54(void) +static void Cmd_get_move_accuracy(void) { + AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].accuracy; + + gAIScriptPtr++; } -static void Cmd_nullsub_55(void) +static void Cmd_call_if_eq(void) { + if (AI_THINKING_STRUCT->funcResult == T1_READ_16(gAIScriptPtr + 1)) + { + AIStackPushVar(gAIScriptPtr + 7); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); + } + else + { + gAIScriptPtr += 7; + } } -static void Cmd_nullsub_56(void) +static void Cmd_call_if_move_flag(void) { + u32 flag = T1_READ_32(gAIScriptPtr + 1); + + if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].flags & flag) + { + AIStackPushVar(gAIScriptPtr + 9); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5); + } + else + { + gAIScriptPtr += 9; + } } static void Cmd_nullsub_57(void) @@ -2246,3 +2496,376 @@ static bool8 AIStackPop(void) return FALSE; } } + +static void Cmd_get_ally_chosen_move(void) +{ + u8 partnerBattler = BATTLE_PARTNER(sBattler_AI); + if (!IsBattlerAlive(partnerBattler) || !IsBattlerAIControlled(partnerBattler)) + AI_THINKING_STRUCT->funcResult = 0; + else if (partnerBattler > sBattler_AI) // Battler with the lower id chooses the move first. + AI_THINKING_STRUCT->funcResult = 0; + else + AI_THINKING_STRUCT->funcResult = gBattleMons[partnerBattler].moves[gBattleStruct->chosenMovePositions[partnerBattler]]; + + gAIScriptPtr++; +} + +static void Cmd_if_has_no_attacking_moves(void) +{ + s32 i; + u8 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + if (IsBattlerAIControlled(battlerId)) + { + for (i = 0; i < 4; i++) + { + if (gBattleMons[battlerId].moves[i] != 0 && gBattleMoves[gBattleMons[battlerId].moves[i]].power != 0) + break; + } + } + else + { + for (i = 0; i < 4; i++) + { + if (BATTLE_HISTORY->usedMoves[battlerId][i] != 0 && gBattleMoves[BATTLE_HISTORY->usedMoves[battlerId][i]].power != 0) + break; + } + } + + if (i == 4) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void Cmd_get_hazards_count(void) +{ + u8 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + u8 side = GetBattlerSide(battlerId); + + switch (T1_READ_16(gAIScriptPtr + 2)) + { + case EFFECT_SPIKES: + AI_THINKING_STRUCT->funcResult = gSideTimers[side].spikesAmount; + break; + case EFFECT_TOXIC_SPIKES: + AI_THINKING_STRUCT->funcResult = gSideTimers[side].toxicSpikesAmount; + break; + } + + gAIScriptPtr += 4; +} + +static void Cmd_if_doesnt_hold_berry(void) +{ + u8 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + u16 item; + + if (IsBattlerAIControlled(battlerId)) + item = gBattleMons[battlerId].item; + else + item = BATTLE_HISTORY->itemEffects[battlerId]; + + if (ItemId_GetPocket(item) == POCKET_BERRIES) + gAIScriptPtr += 6; + else + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); +} + +static void Cmd_if_share_type(void) +{ + u8 battler1 = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + u8 battler2 = BattleAI_GetWantedBattler(gAIScriptPtr[2]); + + if (DoBattlersShareType(battler1, battler2)) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); + else + gAIScriptPtr += 7; +} + +static void Cmd_if_cant_use_last_resort(void) +{ + u8 battler = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + + if (CanUseLastResort(battler)) + gAIScriptPtr += 6; + else + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); +} + +static u16 *GetMovesArray(u32 battler) +{ + if (IsBattlerAIControlled(battler) || IsBattlerAIControlled(BATTLE_PARTNER(battler))) + return gBattleMons[battler].moves; + else + return gBattleResources->battleHistory->usedMoves[battler]; +} + +static bool32 HasMoveWithSplit(u32 battler, u32 split) +{ + s32 i; + u16 *moves = GetMovesArray(battler); + + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (moves[i] != MOVE_NONE && moves[i] != 0xFFFF && gBattleMoves[moves[i]].split == split) + return TRUE; + } + + return FALSE; +} + +static void Cmd_if_has_move_with_split(void) +{ + if (HasMoveWithSplit(BattleAI_GetWantedBattler(gAIScriptPtr[1]), gAIScriptPtr[2])) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); + else + gAIScriptPtr += 7; +} + +static void Cmd_if_has_no_move_with_split(void) +{ + if (!HasMoveWithSplit(BattleAI_GetWantedBattler(gAIScriptPtr[1]), gAIScriptPtr[2])) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); + else + gAIScriptPtr += 7; +} + +// This function checks if all physical/special moves are either unusable or unreasonable to use. +// Consider a pokemon boosting their attack against a ghost pokemon having only normal-type physical attacks. +static bool32 MovesWithSplitUnusable(u32 attacker, u32 target, u32 split) +{ + s32 i, moveType; + u32 usable = 0; + u32 unusable = CheckMoveLimitations(attacker, 0, 0xFF); + u16 *moves = GetMovesArray(attacker); + + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (moves[i] != MOVE_NONE + && moves[i] != 0xFFFF + && gBattleMoves[moves[i]].split == split + && !(unusable & gBitTable[i])) + { + SetTypeBeforeUsingMove(moves[i], attacker); + GET_MOVE_TYPE(moves[i], moveType); + if (CalcTypeEffectivenessMultiplier(moves[i], moveType, attacker, target, FALSE) != 0) + usable |= gBitTable[i]; + } + } + + return (usable == 0); +} + +static void Cmd_if_physical_moves_unusable(void) +{ + if (MovesWithSplitUnusable(BattleAI_GetWantedBattler(gAIScriptPtr[1]), BattleAI_GetWantedBattler(gAIScriptPtr[2]), SPLIT_PHYSICAL)) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); + else + gAIScriptPtr += 7; +} + +// Check if target has means to faint ai mon. +static void Cmd_if_ai_can_go_down(void) +{ + s32 i, dmg; + u32 unusable = CheckMoveLimitations(gBattlerTarget, 0, 0xFF & ~MOVE_LIMITATION_PP); + u16 *moves = gBattleResources->battleHistory->usedMoves[gBattlerTarget]; + + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (moves[i] != MOVE_NONE && moves[i] != 0xFFFF && !(unusable & gBitTable[i]) + && AI_CalcDamage(moves[i], gBattlerTarget, sBattler_AI) >= gBattleMons[sBattler_AI].hp) + { + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + return; + } + } + + gAIScriptPtr += 5; +} + +static void Cmd_if_cant_use_belch(void) +{ + u32 battler = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + + if (gBattleStruct->ateBerry[battler & BIT_SIDE] & gBitTable[gBattlerPartyIndexes[battler]]) + gAIScriptPtr += 6; + else + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); +} + +static void Cmd_if_has_move_with_type(void) +{ + u32 i, moveType, battler = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + u16 *moves = GetMovesArray(battler); + + for (i = 0; i < 4; i++) + { + if (moves[i] == MOVE_NONE) + continue; + + SetTypeBeforeUsingMove(moves[i], battler); + GET_MOVE_TYPE(moves[i], moveType); + if (moveType == gAIScriptPtr[2]) + break; + } + + if (i == 4) + gAIScriptPtr += 7; + else + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); +} + +static void Cmd_if_has_move_with_flag(void) +{ + u32 i, flag, battler = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + u16 *moves = GetMovesArray(battler); + + flag = T1_READ_32(gAIScriptPtr + 2); + for (i = 0; i < 4; i++) + { + if (moves[i] != MOVE_NONE && gBattleMoves[moves[i]].flags & flag) + { + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); + return; + } + } + + gAIScriptPtr += 10; +} + +static void Cmd_if_no_move_used(void) +{ + u32 i, battler = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + + if (!IsBattlerAIControlled(battler)) + { + for (i = 0; i < 4; i++) + { + if (BATTLE_HISTORY->usedMoves[battler][i] != 0 && BATTLE_HISTORY->usedMoves[battler][i] != 0xFFFF) + { + gAIScriptPtr += 6; + return; + } + } + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); + } + else + { + gAIScriptPtr += 6; + } +} + +static void Cmd_if_battler_absent(void) +{ + u32 battler = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + + if (!IsBattlerAlive(battler)) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void Cmd_is_grounded(void) +{ + u32 battler = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + + if (IsBattlerGrounded(battler)) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void Cmd_get_best_dmg_hp_percent(void) +{ + int i, bestDmg; + + bestDmg = 0; + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (gBattleResources->ai->simulatedDmg[sBattler_AI][gBattlerTarget][i] > bestDmg) + bestDmg = gBattleResources->ai->simulatedDmg[sBattler_AI][gBattlerTarget][i]; + } + + gBattleResources->ai->funcResult = (bestDmg * 100) / gBattleMons[gBattlerTarget].maxHP; + gAIScriptPtr++; +} + +static void Cmd_get_curr_dmg_hp_percent(void) +{ + int bestDmg = gBattleResources->ai->simulatedDmg[sBattler_AI][gBattlerTarget][AI_THINKING_STRUCT->movesetIndex]; + + gBattleResources->ai->funcResult = (bestDmg * 100) / gBattleMons[gBattlerTarget].maxHP; + gAIScriptPtr++; +} + +static void Cmd_get_move_split_from_result(void) +{ + AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->funcResult].split; + gAIScriptPtr += 1; +} + +static void Cmd_get_considered_move_split(void) +{ + AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].split; + gAIScriptPtr += 1; +} + +static void Cmd_get_considered_move_target(void) +{ + AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].target; + gAIScriptPtr += 1; +} + +static void Cmd_compare_speeds(void) +{ + u8 battler1 = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + u8 battler2 = BattleAI_GetWantedBattler(gAIScriptPtr[2]); + AI_THINKING_STRUCT->funcResult = GetWhoStrikesFirst(battler1, battler2, TRUE); + gAIScriptPtr += 3; +} + +static u32 FindMoveUsedXTurnsAgo(u32 battlerId, u32 x) +{ + s32 i, index = BATTLE_HISTORY->moveHistoryIndex[battlerId]; + for (i = 0; i < x; i++) + { + if (--index < 0) + index = AI_MOVE_HISTORY_COUNT - 1; + } + return BATTLE_HISTORY->moveHistory[battlerId][index]; +} + +static void Cmd_is_wakeup_turn(void) +{ + u32 battler = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + // Check if rest was used 2 turns ago + if ((gBattleMons[battler].status1 & STATUS1_SLEEP) == 1 && FindMoveUsedXTurnsAgo(battler, 2) == MOVE_REST) + AI_THINKING_STRUCT->funcResult = TRUE; + else + AI_THINKING_STRUCT->funcResult = FALSE; + + gAIScriptPtr += 2; +} + +static void Cmd_if_has_move_with_accuracy_lt(void) +{ + u32 i; + u32 battler = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + u32 toCmp = gAIScriptPtr[2]; + u16 *moves = GetMovesArray(battler); + + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (moves[i] != MOVE_NONE + && gBattleMoves[moves[i]].effect != EFFECT_OHKO + && gBattleMoves[moves[i]].accuracy > 1 + && gBattleMoves[moves[i]].accuracy < toCmp) + break; + } + + if (i == MAX_MON_MOVES) + gAIScriptPtr += 7; + else + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); +} diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 1663c25616..83c8d86270 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -1,7 +1,9 @@ #include "global.h" #include "battle.h" +#include "battle_ai_script_commands.h" #include "battle_anim.h" #include "battle_controllers.h" +#include "battle_setup.h" #include "pokemon.h" #include "random.h" #include "util.h" @@ -12,9 +14,43 @@ // this file's functions static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng); -static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent); +static bool8 FindMonWithFlagsAndSuperEffective(u16 flags, u8 moduloPercent); static bool8 ShouldUseItem(void); +void GetAIPartyIndexes(u32 battlerId, s32 *firstId, s32 *lastId) +{ + if (BATTLE_TWO_VS_ONE_OPPONENT && (battlerId & BIT_SIDE) == B_SIDE_OPPONENT) + { + *firstId = 0, *lastId = 6; + } + else if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_x800000)) + { + if ((battlerId & BIT_FLANK) == B_FLANK_LEFT) + *firstId = 0, *lastId = 3; + else + *firstId = 3, *lastId = 6; + } + else + { + *firstId = 0, *lastId = 6; + } +} + +static bool8 ShouldSwitchIfAllBadMoves(void) +{ + if (gBattleResources->ai->switchMon) + { + gBattleResources->ai->switchMon = 0; + *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = PARTY_SIZE; + BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); + return TRUE; + } + else + { + return FALSE; + } +} + static bool8 ShouldSwitchIfPerishSong(void) { if (gStatuses3[gActiveBattler] & STATUS3_PERISH_SONG @@ -34,7 +70,6 @@ static bool8 ShouldSwitchIfWonderGuard(void) { u8 opposingPosition; u8 opposingBattler; - u8 moveFlags; s32 i, j; s32 firstId; s32 lastId; // + 1 @@ -53,26 +88,15 @@ static bool8 ShouldSwitchIfWonderGuard(void) for (opposingBattler = GetBattlerAtPosition(opposingPosition), i = 0; i < MAX_MON_MOVES; i++) { move = gBattleMons[gActiveBattler].moves[i]; - if (move == MOVE_NONE) - continue; - - moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability); - if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE) - return FALSE; + if (move != MOVE_NONE) + { + if (AI_GetTypeEffectiveness(move, gActiveBattler, opposingBattler) >= UQ_4_12(2.0)) + return FALSE; + } } // Get party information. - if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000)) - { - if ((gActiveBattler & BIT_FLANK) == B_FLANK_LEFT) - firstId = 0, lastId = 3; - else - firstId = 3, lastId = 6; - } - else - { - firstId = 0, lastId = 6; - } + GetAIPartyIndexes(gActiveBattler, &firstId, &lastId); if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) party = gPlayerParty; @@ -91,22 +115,18 @@ static bool8 ShouldSwitchIfWonderGuard(void) if (i == gBattlerPartyIndexes[gActiveBattler]) continue; - GetMonData(&party[i], MON_DATA_SPECIES); // Unused return value. - GetMonData(&party[i], MON_DATA_ABILITY_NUM); // Unused return value. - for (opposingBattler = GetBattlerAtPosition(opposingPosition), j = 0; j < MAX_MON_MOVES; j++) { move = GetMonData(&party[i], MON_DATA_MOVE1 + j); - if (move == MOVE_NONE) - continue; - - moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability); - if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && Random() % 3 < 2) + if (move != MOVE_NONE) { - // We found a mon. - *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = i; - BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); - return TRUE; + if (AI_GetTypeEffectiveness(move, gActiveBattler, opposingBattler) >= UQ_4_12(2.0) && Random() % 3 < 2) + { + // We found a mon. + *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = i; + BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); + return TRUE; + } } } } @@ -158,17 +178,7 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void) if (gBattleMons[gActiveBattler].ability == absorbingTypeAbility) return FALSE; - if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000)) - { - if ((gActiveBattler & BIT_FLANK) == B_FLANK_LEFT) - firstId = 0, lastId = 3; - else - firstId = 3, lastId = 6; - } - else - { - firstId = 0, lastId = 6; - } + GetAIPartyIndexes(gActiveBattler, &firstId, &lastId); if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) party = gPlayerParty; @@ -255,7 +265,6 @@ static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng) u8 opposingPosition; u8 opposingBattler; s32 i; - u8 moveFlags; u16 move; opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(gActiveBattler)); @@ -269,8 +278,7 @@ static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng) if (move == MOVE_NONE) continue; - moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability); - if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE) + if (AI_GetTypeEffectiveness(move, gActiveBattler, opposingBattler) >= UQ_4_12(2.0)) { if (noRng) return TRUE; @@ -292,8 +300,7 @@ static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng) if (move == MOVE_NONE) continue; - moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability); - if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE) + if (AI_GetTypeEffectiveness(move, gActiveBattler, opposingBattler) >= UQ_4_12(2.0)) { if (noRng) return TRUE; @@ -320,7 +327,7 @@ static bool8 AreStatsRaised(void) return (buffedStatsValue > 3); } -static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent) +static bool8 FindMonWithFlagsAndSuperEffective(u16 flags, u8 moduloPercent) { u8 battlerIn1, battlerIn2; s32 firstId; @@ -328,7 +335,6 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent) struct Pokemon *party; s32 i, j; u16 move; - u8 moveFlags; if (gLastLandedMoves[gActiveBattler] == 0) return FALSE; @@ -353,17 +359,7 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent) battlerIn2 = gActiveBattler; } - if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000)) - { - if ((gActiveBattler & BIT_FLANK) == 0) - firstId = 0, lastId = 3; - else - firstId = 3, lastId = 6; - } - else - { - firstId = 0, lastId = 6; - } + GetAIPartyIndexes(gActiveBattler, &firstId, &lastId); if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) party = gPlayerParty; @@ -396,8 +392,8 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent) else monAbility = gBaseStats[species].abilities[0]; - moveFlags = AI_TypeCalc(gLastLandedMoves[gActiveBattler], species, monAbility); - if (moveFlags & flags) + CalcPartyMonTypeEffectivenessMultiplier(gLastLandedMoves[gActiveBattler], species, monAbility); + if (gMoveResultFlags & flags) { battlerIn1 = gLastHitBy[gActiveBattler]; @@ -407,8 +403,7 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent) if (move == 0) continue; - moveFlags = AI_TypeCalc(move, gBattleMons[battlerIn1].species, gBattleMons[battlerIn1].ability); - if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && Random() % moduloPercent == 0) + if (AI_GetTypeEffectiveness(move, gActiveBattler, battlerIn1) >= UQ_4_12(2.0) && Random() % moduloPercent == 0) { *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = i; BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); @@ -424,57 +419,37 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent) static bool8 ShouldSwitch(void) { u8 battlerIn1, battlerIn2; - u8 *activeBattlerPtr; // Needed to match. s32 firstId; s32 lastId; // + 1 struct Pokemon *party; s32 i; s32 availableToSwitch; - if (gBattleMons[*(activeBattlerPtr = &gActiveBattler)].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) + if (gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) return FALSE; if (gStatuses3[gActiveBattler] & STATUS3_ROOTED) return FALSE; - if (ABILITY_ON_OPPOSING_FIELD(gActiveBattler, ABILITY_SHADOW_TAG)) + if (IsAbilityPreventingEscape(gActiveBattler)) return FALSE; - if (ABILITY_ON_OPPOSING_FIELD(gActiveBattler, ABILITY_ARENA_TRAP)) // Misses the flying type and Levitate check. - return FALSE; - if (ABILITY_ON_FIELD2(ABILITY_MAGNET_PULL)) - { - if (gBattleMons[gActiveBattler].type1 == TYPE_STEEL) - return FALSE; - if (gBattleMons[gActiveBattler].type2 == TYPE_STEEL) - return FALSE; - } if (gBattleTypeFlags & BATTLE_TYPE_ARENA) return FALSE; availableToSwitch = 0; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { - battlerIn1 = *activeBattlerPtr; - if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(GetBattlerPosition(*activeBattlerPtr) ^ BIT_FLANK)]) - battlerIn2 = *activeBattlerPtr; + battlerIn1 = gActiveBattler; + if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK)]) + battlerIn2 = gActiveBattler; else - battlerIn2 = GetBattlerAtPosition(GetBattlerPosition(*activeBattlerPtr) ^ BIT_FLANK); + battlerIn2 = GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK); } else { - battlerIn1 = *activeBattlerPtr; - battlerIn2 = *activeBattlerPtr; + battlerIn1 = gActiveBattler; + battlerIn2 = gActiveBattler; } - if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000)) - { - if ((gActiveBattler & BIT_FLANK) == B_FLANK_LEFT) - firstId = 0, lastId = 3; - else - firstId = 3, lastId = 6; - } - else - { - firstId = 0, lastId = 6; - } + GetAIPartyIndexes(gActiveBattler, &firstId, &lastId); if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) party = gPlayerParty; @@ -503,6 +478,8 @@ static bool8 ShouldSwitch(void) if (availableToSwitch == 0) return FALSE; + if (ShouldSwitchIfAllBadMoves()) + return TRUE; if (ShouldSwitchIfPerishSong()) return TRUE; if (ShouldSwitchIfWonderGuard()) @@ -555,17 +532,7 @@ void AI_TrySwitchOrUseItem(void) battlerIn2 = GetBattlerAtPosition(battlerIdentity ^ BIT_FLANK); } - if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000)) - { - if ((gActiveBattler & BIT_FLANK) == B_FLANK_LEFT) - firstId = 0, lastId = 3; - else - firstId = 3, lastId = 6; - } - else - { - firstId = 0, lastId = 6; - } + GetAIPartyIndexes(gActiveBattler, &firstId, &lastId); for (monToSwitchId = firstId; monToSwitchId < lastId; monToSwitchId++) { @@ -599,42 +566,143 @@ void AI_TrySwitchOrUseItem(void) BtlController_EmitTwoReturnValues(1, B_ACTION_USE_MOVE, (gActiveBattler ^ BIT_SIDE) << 8); } -static void ModulateByTypeEffectiveness(u8 atkType, u8 defType1, u8 defType2, u8 *var) +// If there are two(or more) mons to choose from, always choose one that has baton pass +// as most often it can't do much on its own. +static u32 GetBestMonBatonPass(struct Pokemon *party, int firstId, int lastId, u8 invalidMons, int aliveCount) { - s32 i = 0; + int i, j, bits = 0; - while (TYPE_EFFECT_ATK_TYPE(i) != TYPE_ENDTABLE) + for (i = firstId; i < lastId; i++) { - if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT) - { - i += 3; + if (invalidMons & gBitTable[i]) continue; - } - else if (TYPE_EFFECT_ATK_TYPE(i) == atkType) + + for (j = 0; j < MAX_MON_MOVES; j++) { - // Check type1. - if (TYPE_EFFECT_DEF_TYPE(i) == defType1) - *var = (*var * TYPE_EFFECT_MULTIPLIER(i)) / 10; - // Check type2. - if (TYPE_EFFECT_DEF_TYPE(i) == defType2 && defType1 != defType2) - *var = (*var * TYPE_EFFECT_MULTIPLIER(i)) / 10; + if (GetMonData(&party[i], MON_DATA_MOVE1 + j, NULL) == MOVE_BATON_PASS) + { + bits |= gBitTable[i]; + break; + } } - i += 3; } + + if ((aliveCount == 2 || (aliveCount > 2 && Random() % 3 == 0)) && bits) + { + do + { + i = (Random() % (lastId - firstId)) + firstId; + } while (!(bits & gBitTable[i])); + return i; + } + + return PARTY_SIZE; +} + +static u32 GestBestMonOffensive(struct Pokemon *party, int firstId, int lastId, u8 invalidMons, u32 opposingBattler) +{ + int i, bits = 0; + + while (bits != 0x3F) // All mons were checked. + { + int bestDmg = 0; + int bestMonId = PARTY_SIZE; + // Find the mon whose type is the most suitable offensively. + for (i = firstId; i < lastId; i++) + { + if (!(gBitTable[i] & invalidMons) && !(gBitTable[i] & bits)) + { + u16 species = GetMonData(&party[i], MON_DATA_SPECIES); + u32 typeDmg = UQ_4_12(1.0); + + u8 atkType1 = gBaseStats[species].type1; + u8 atkType2 = gBaseStats[species].type2; + u8 defType1 = gBattleMons[opposingBattler].type1; + u8 defType2 = gBattleMons[opposingBattler].type2; + + typeDmg *= GetTypeModifier(atkType1, defType1); + if (atkType2 != atkType1) + typeDmg *= GetTypeModifier(atkType2, defType1); + if (defType2 != defType1) + { + typeDmg *= GetTypeModifier(atkType1, defType2); + if (atkType2 != atkType1) + typeDmg *= GetTypeModifier(atkType2, defType2); + } + if (bestDmg < typeDmg) + { + bestDmg = typeDmg; + bestMonId = i; + } + } + } + + // Ok, we know the mon has the right typing but does it have at least one super effective move? + if (bestMonId != PARTY_SIZE) + { + for (i = 0; i < MAX_MON_MOVES; i++) + { + u32 move = GetMonData(&party[bestMonId], MON_DATA_MOVE1 + i); + if (move != MOVE_NONE && AI_GetTypeEffectiveness(move, gActiveBattler, opposingBattler) >= UQ_4_12(2.0)) + break; + } + + if (i != MAX_MON_MOVES) + return bestMonId; // Has both the typing and at least one super effective move. + + bits |= gBitTable[bestMonId]; // Sorry buddy, we want something better. + } + else + { + bits = 0x3F; // No viable mon to switch. + } + } + + return PARTY_SIZE; +} + +static u32 GetBestMonDmg(struct Pokemon *party, int firstId, int lastId, u8 invalidMons, u32 opposingBattler) +{ + int i, j; + int bestDmg = 0; + int bestMonId = PARTY_SIZE; + + gMoveResultFlags = 0; + // If we couldn't find the best mon in terms of typing, find the one that deals most damage. + for (i = firstId; i < lastId; i++) + { + if (gBitTable[i] & invalidMons) + continue; + + for (j = 0; j < MAX_MON_MOVES; j++) + { + u32 move = GetMonData(&party[i], MON_DATA_MOVE1 + j); + if (move != MOVE_NONE && gBattleMoves[move].power != 0) + { + s32 dmg = AI_CalcPartyMonDamage(move, gActiveBattler, opposingBattler, &party[i]); + if (bestDmg < dmg) + { + bestDmg = dmg; + bestMonId = i; + } + } + } + } + + return bestMonId; } u8 GetMostSuitableMonToSwitchInto(void) { - u8 opposingBattler; - u8 bestDmg; // Note : should be changed to u32 for obvious reasons. - u8 bestMonId; - u8 battlerIn1, battlerIn2; - s32 firstId; - s32 lastId; // + 1 + u32 opposingBattler = 0; + u32 bestDmg = 0; + u32 bestMonId = 0; + u8 battlerIn1 = 0, battlerIn2 = 0; + s32 firstId = 0; + s32 lastId = 0; // + 1 struct Pokemon *party; - s32 i, j; - u8 invalidMons; - u16 move; + s32 i, j, aliveCount = 0; + u8 invalidMons = 0; if (*(gBattleStruct->monToSwitchIntoId + gActiveBattler) != PARTY_SIZE) return *(gBattleStruct->monToSwitchIntoId + gActiveBattler); @@ -649,8 +717,7 @@ u8 GetMostSuitableMonToSwitchInto(void) else battlerIn2 = GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK); - // UB: It considers the opponent only player's side even though it can battle alongside player. - opposingBattler = Random() & BIT_FLANK; + opposingBattler = BATTLE_OPPOSITE(battlerIn1); if (gAbsentBattlerFlags & gBitTable[opposingBattler]) opposingBattler ^= BIT_FLANK; } @@ -661,124 +728,44 @@ u8 GetMostSuitableMonToSwitchInto(void) battlerIn2 = gActiveBattler; } - if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000)) - { - if ((gActiveBattler & BIT_FLANK) == B_FLANK_LEFT) - firstId = 0, lastId = 3; - else - firstId = 3, lastId = 6; - } - else - { - firstId = 0, lastId = 6; - } + GetAIPartyIndexes(gActiveBattler, &firstId, &lastId); if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) party = gPlayerParty; else party = gEnemyParty; - invalidMons = 0; - - while (invalidMons != 0x3F) // All mons are invalid. - { - bestDmg = 0; - bestMonId = 6; - // Find the mon whose type is the most suitable offensively. - for (i = firstId; i < lastId; i++) - { - u16 species = GetMonData(&party[i], MON_DATA_SPECIES); - if (species != SPECIES_NONE - && GetMonData(&party[i], MON_DATA_HP) != 0 - && !(gBitTable[i] & invalidMons) - && gBattlerPartyIndexes[battlerIn1] != i - && gBattlerPartyIndexes[battlerIn2] != i - && i != *(gBattleStruct->monToSwitchIntoId + battlerIn1) - && i != *(gBattleStruct->monToSwitchIntoId + battlerIn2)) - { - u8 type1 = gBaseStats[species].type1; - u8 type2 = gBaseStats[species].type2; - u8 typeDmg = 10; - ModulateByTypeEffectiveness(gBattleMons[opposingBattler].type1, type1, type2, &typeDmg); - ModulateByTypeEffectiveness(gBattleMons[opposingBattler].type2, type1, type2, &typeDmg); - if (bestDmg < typeDmg) - { - bestDmg = typeDmg; - bestMonId = i; - } - } - else - { - invalidMons |= gBitTable[i]; - } - } - - // Ok, we know the mon has the right typing but does it have at least one super effective move? - if (bestMonId != PARTY_SIZE) - { - for (i = 0; i < MAX_MON_MOVES; i++) - { - move = GetMonData(&party[bestMonId], MON_DATA_MOVE1 + i); - if (move != MOVE_NONE && TypeCalc(move, gActiveBattler, opposingBattler) & MOVE_RESULT_SUPER_EFFECTIVE) - break; - } - - if (i != MAX_MON_MOVES) - return bestMonId; // Has both the typing and at least one super effective move. - - invalidMons |= gBitTable[bestMonId]; // Sorry buddy, we want something better. - } - else - { - invalidMons = 0x3F; // No viable mon to switch. - } - } - - gDynamicBasePower = 0; - gBattleStruct->dynamicMoveType = 0; - gBattleScripting.dmgMultiplier = 1; - gMoveResultFlags = 0; - gCritMultiplier = 1; - bestDmg = 0; - bestMonId = 6; - - // If we couldn't find the best mon in terms of typing, find the one that deals most damage. + // Get invalid slots ids. for (i = firstId; i < lastId; i++) { - if ((u16)(GetMonData(&party[i], MON_DATA_SPECIES)) == SPECIES_NONE) - continue; - if (GetMonData(&party[i], MON_DATA_HP) == 0) - continue; - if (gBattlerPartyIndexes[battlerIn1] == i) - continue; - if (gBattlerPartyIndexes[battlerIn2] == i) - continue; - if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn1)) - continue; - if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn2)) - continue; - - for (j = 0; j < MAX_MON_MOVES; j++) - { - move = GetMonData(&party[i], MON_DATA_MOVE1 + j); - gBattleMoveDamage = 0; - if (move != MOVE_NONE && gBattleMoves[move].power != 1) - { - AI_CalcDmg(gActiveBattler, opposingBattler); - TypeCalc(move, gActiveBattler, opposingBattler); - } - if (bestDmg < gBattleMoveDamage) - { - bestDmg = gBattleMoveDamage; - bestMonId = i; - } - } + if (GetMonData(&party[i], MON_DATA_SPECIES) == SPECIES_NONE + || GetMonData(&party[i], MON_DATA_HP) == 0 + || gBattlerPartyIndexes[battlerIn1] == i + || gBattlerPartyIndexes[battlerIn2] == i + || i == *(gBattleStruct->monToSwitchIntoId + battlerIn1) + || i == *(gBattleStruct->monToSwitchIntoId + battlerIn2) + || (GetMonAbility(&party[i]) == ABILITY_TRUANT && IsTruantMonVulnerable(gActiveBattler, opposingBattler))) // While not really invalid per say, not really wise to switch into this mon. + invalidMons |= gBitTable[i]; + else + aliveCount++; } - return bestMonId; + bestMonId = GetBestMonBatonPass(party, firstId, lastId, invalidMons, aliveCount); + if (bestMonId != PARTY_SIZE) + return bestMonId; + + bestMonId = GestBestMonOffensive(party, firstId, lastId, invalidMons, opposingBattler); + if (bestMonId != PARTY_SIZE) + return bestMonId; + + bestMonId = GetBestMonDmg(party, firstId, lastId, invalidMons, opposingBattler); + if (bestMonId != PARTY_SIZE) + return bestMonId; + + return PARTY_SIZE; } -static u8 GetAI_ItemType(u8 itemId, const u8 *itemEffect) // NOTE: should take u16 as item Id argument +static u8 GetAI_ItemType(u16 itemId, const u8 *itemEffect) { if (itemId == ITEM_FULL_RESTORE) return AI_ITEM_FULL_RESTORE; diff --git a/src/battle_anim.c b/src/battle_anim.c index 874ac935b5..21774d3561 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -17,6 +17,7 @@ #include "sprite.h" #include "task.h" #include "constants/battle_anim.h" +#include "constants/battle_config.h" #define ANIM_SPRITE_INDEX_COUNT 8 @@ -108,7 +109,7 @@ EWRAM_DATA static u16 sSoundAnimFramesToWait = 0; EWRAM_DATA static u8 sMonAnimTaskIdArray[2] = {0}; EWRAM_DATA u8 gAnimMoveTurn = 0; EWRAM_DATA static u8 sAnimBackgroundFadeState = 0; -EWRAM_DATA static u16 sAnimMoveIndex = 0; // Set but unused. +EWRAM_DATA u16 gAnimMoveIndex = 0; // Set but unused. EWRAM_DATA u8 gBattleAnimAttacker = 0; EWRAM_DATA u8 gBattleAnimTarget = 0; EWRAM_DATA u16 gAnimBattlerSpecies[MAX_BATTLERS_COUNT] = {0}; @@ -1130,8 +1131,16 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_Pencil, 0x0200, ANIM_TAG_PENCIL}, {gBattleAnimSpriteGfx_AirWave, 0x0100, ANIM_TAG_AIR_WAVE}, {gBattleAnimSpriteGfx_Orb, 0x0200, ANIM_TAG_ORB}, + #if NEW_SWORD_PARTICLE + {gBattleAnimSpriteGfx_NewSword, 0x0400, ANIM_TAG_SWORD}, + #else {gBattleAnimSpriteGfx_Sword, 0x0400, ANIM_TAG_SWORD}, + #endif + #if NEW_LEECH_SEED_PARTICLE + {gBattleAnimSpriteGfx_NewLeechSeed, 0x0180, ANIM_TAG_SEED}, + #else {gBattleAnimSpriteGfx_Seed, 0x0180, ANIM_TAG_SEED}, + #endif {gBattleAnimSpriteGfx_Explosion6, 0x0800, ANIM_TAG_EXPLOSION_6}, {gBattleAnimSpriteGfx_PinkOrb, 0x0020, ANIM_TAG_PINK_ORB}, {gBattleAnimSpriteGfx_Gust, 0x0400, ANIM_TAG_GUST}, @@ -1154,7 +1163,11 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_HitDuplicate, 0x0A00, ANIM_TAG_HIT_DUPLICATE}, {gBattleAnimSpriteGfx_Leer, 0x0A00, ANIM_TAG_LEER}, {gBattleAnimSpriteGfx_BlueBurst, 0x0A00, ANIM_TAG_BLUE_BURST}, + #if NEW_EMBER_PARTICLES + {gBattleAnimSpriteGfx_NewEmbers, 0x0A00, ANIM_TAG_SMALL_EMBER}, + #else {gBattleAnimSpriteGfx_SmallEmber, 0x0A00, ANIM_TAG_SMALL_EMBER}, + #endif {gBattleAnimSpriteGfx_GraySmoke, 0x0A00, ANIM_TAG_GRAY_SMOKE}, {gBattleAnimSpriteGfx_BlueStar, 0x0E00, ANIM_TAG_BLUE_STAR}, {gBattleAnimSpriteGfx_BubbleBurst, 0x0380, ANIM_TAG_BUBBLE_BURST}, @@ -1183,12 +1196,20 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_RedFist, 0x0200, ANIM_TAG_RED_FIST}, {gBattleAnimSpriteGfx_SlamHit, 0x1000, ANIM_TAG_SLAM_HIT}, {gBattleAnimSpriteGfx_Ring, 0x0180, ANIM_TAG_RING}, + #if NEW_ROCKS_PARTICLE + {gBattleAnimSpriteGfx_NewRocks, 0x0C00, ANIM_TAG_ROCKS}, + #else {gBattleAnimSpriteGfx_Rocks, 0x0C00, ANIM_TAG_ROCKS}, + #endif {gBattleAnimSpriteGfx_Z, 0x0100, ANIM_TAG_Z}, {gBattleAnimSpriteGfx_YellowUnk2, 0x0040, ANIM_TAG_YELLOW_UNK_2}, {gBattleAnimSpriteGfx_AirSlash, 0x0180, ANIM_TAG_AIR_SLASH}, {gBattleAnimSpriteGfx_SpinningGreenOrbs, 0x0800, ANIM_TAG_SPINNING_GREEN_ORBS}, + #if NEW_LEAF_PARTICLE + {gBattleAnimSpriteGfx_NewLeaf, 0x0480, ANIM_TAG_LEAF}, + #else {gBattleAnimSpriteGfx_Leaf, 0x0480, ANIM_TAG_LEAF}, + #endif {gBattleAnimSpriteGfx_Finger, 0x0200, ANIM_TAG_FINGER}, {gBattleAnimSpriteGfx_PoisonPowder, 0x0200, ANIM_TAG_POISON_POWDER}, {gBattleAnimSpriteGfx_BrownTriangle, 0x0100, ANIM_TAG_BROWN_TRIANGLE}, @@ -1252,7 +1273,11 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_Shock2, 0x0600, ANIM_TAG_SHOCK_2}, {gBattleAnimSpriteGfx_ClosingEye2, 0x0200, ANIM_TAG_CLOSING_EYE_2}, {gBattleAnimSpriteGfx_MetalBall, 0x0080, ANIM_TAG_METAL_BALL}, + #if NEW_SUBSTITUTE_PARTICLE + {gBattleAnimSpriteGfx_NewSubstituteFront, 0x0200, ANIM_TAG_MONSTER_DOLL}, + #else {gBattleAnimSpriteGfx_MonsterDoll, 0x0200, ANIM_TAG_MONSTER_DOLL}, + #endif {gBattleAnimSpriteGfx_Whirlwind, 0x0800, ANIM_TAG_WHIRLWIND}, {gBattleAnimSpriteGfx_Whirlwind2, 0x0080, ANIM_TAG_WHIRLWIND_2}, {gBattleAnimSpriteGfx_Explosion4, 0x0a00, ANIM_TAG_EXPLOSION_4}, @@ -1264,11 +1289,19 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_CircleImpact, 0x0020, ANIM_TAG_CIRCLE_IMPACT}, {gBattleAnimSpriteGfx_Scratch, 0x0a00, ANIM_TAG_SCRATCH}, {gBattleAnimSpriteGfx_Cut, 0x0800, ANIM_TAG_CUT}, + #if NEW_TEETH_PARTICLE + {gBattleAnimSpriteGfx_NewTeeth, 0x0800, ANIM_TAG_SHARP_TEETH}, + #else {gBattleAnimSpriteGfx_SharpTeeth, 0x0800, ANIM_TAG_SHARP_TEETH}, + #endif {gBattleAnimSpriteGfx_RainbowRings, 0x00c0, ANIM_TAG_RAINBOW_RINGS}, {gBattleAnimSpriteGfx_IceCrystals, 0x01c0, ANIM_TAG_ICE_CRYSTALS}, {gBattleAnimSpriteGfx_IceSpikes, 0x0100, ANIM_TAG_ICE_SPIKES}, + #if NEW_HANDS_FEET_PARTICLE + {gBattleAnimSpriteGfx_NewHandsAndFeet, 0x0800, ANIM_TAG_HANDS_AND_FEET}, + #else {gBattleAnimSpriteGfx_HandsAndFeet, 0x0800, ANIM_TAG_HANDS_AND_FEET}, + #endif {gBattleAnimSpriteGfx_MistCloud, 0x0200, ANIM_TAG_MIST_CLOUD}, {gBattleAnimSpriteGfx_Clamp, 0x0800, ANIM_TAG_CLAMP}, {gBattleAnimSpriteGfx_Bubble, 0x0180, ANIM_TAG_BUBBLE}, @@ -1277,11 +1310,19 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_WaterOrb, 0x0200, ANIM_TAG_WATER_ORB}, {gBattleAnimSpriteGfx_PoisonBubble, 0x0180, ANIM_TAG_POISON_BUBBLE}, {gBattleAnimSpriteGfx_ToxicBubble, 0x0400, ANIM_TAG_TOXIC_BUBBLE}, + #if NEW_SPIKES_PARTICLE + {gBattleAnimSpriteGfx_NewSpikes, 0x0080, ANIM_TAG_SPIKES}, + #else {gBattleAnimSpriteGfx_Spikes, 0x0080, ANIM_TAG_SPIKES}, + #endif {gBattleAnimSpriteGfx_HornHit2, 0x0100, ANIM_TAG_HORN_HIT_2}, {gBattleAnimSpriteGfx_AirWave2, 0x0100, ANIM_TAG_AIR_WAVE_2}, {gBattleAnimSpriteGfx_SmallBubbles, 0x0140, ANIM_TAG_SMALL_BUBBLES}, + #if NEW_FLY_BUBBLE_PARTICLE + {gBattleAnimSpriteGfx_NewFly, 0x0800, ANIM_TAG_ROUND_SHADOW}, + #else {gBattleAnimSpriteGfx_RoundShadow, 0x0800, ANIM_TAG_ROUND_SHADOW}, + #endif {gBattleAnimSpriteGfx_Sunlight, 0x0200, ANIM_TAG_SUNLIGHT}, {gBattleAnimSpriteGfx_Spore, 0x0100, ANIM_TAG_SPORE}, {gBattleAnimSpriteGfx_Flower, 0x00a0, ANIM_TAG_FLOWER}, @@ -1312,7 +1353,11 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_FocusEnergy, 0x0400, ANIM_TAG_FOCUS_ENERGY}, {gBattleAnimSpriteGfx_SphereToCube, 0x0a00, ANIM_TAG_SPHERE_TO_CUBE}, {gBattleAnimSpriteGfx_Tendrils, 0x1000, ANIM_TAG_TENDRILS}, + #if NEW_MEAN_LOOK_PARTICLE + {gBattleAnimSpriteGfx_NewEye, 0x0800, ANIM_TAG_EYE}, + #else {gBattleAnimSpriteGfx_Eye, 0x0800, ANIM_TAG_EYE}, + #endif {gBattleAnimSpriteGfx_WhiteShadow, 0x0400, ANIM_TAG_WHITE_SHADOW}, {gBattleAnimSpriteGfx_TealAlert, 0x0200, ANIM_TAG_TEAL_ALERT}, {gBattleAnimSpriteGfx_OpeningEye, 0x0800, ANIM_TAG_OPENING_EYE}, @@ -1324,7 +1369,11 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_Spiral, 0x0800, ANIM_TAG_SPIRAL}, {gBattleAnimSpriteGfx_SnoreZ, 0x0200, ANIM_TAG_SNORE_Z}, {gBattleAnimSpriteGfx_Explosion, 0x0800, ANIM_TAG_EXPLOSION}, + #if NEW_CURSE_NAIL_PARTICLE + {gBattleAnimSpriteGfx_NewNail, 0x0400, ANIM_TAG_NAIL}, + #else {gBattleAnimSpriteGfx_Nail, 0x0400, ANIM_TAG_NAIL}, + #endif {gBattleAnimSpriteGfx_GhostlySpirit, 0x0200, ANIM_TAG_GHOSTLY_SPIRIT}, {gBattleAnimSpriteGfx_WarmRock, 0x0a80, ANIM_TAG_WARM_ROCK}, {gBattleAnimSpriteGfx_BreakingEgg, 0x0600, ANIM_TAG_BREAKING_EGG}, @@ -1351,7 +1400,11 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_Roots, 0x0800, ANIM_TAG_ROOTS}, {gBattleAnimSpriteGfx_ItemBag, 0x0200, ANIM_TAG_ITEM_BAG}, {gBattleAnimSpriteGfx_JaggedMusicNote, 0x0400, ANIM_TAG_JAGGED_MUSIC_NOTE}, + #if NEW_BATON_PASS_BALL_PARTICLE + {gBattleAnimSpriteGfx_NewPokeball, 0x0080, ANIM_TAG_POKEBALL}, + #else {gBattleAnimSpriteGfx_Pokeball, 0x0080, ANIM_TAG_POKEBALL}, + #endif {gBattleAnimSpriteGfx_Spotlight, 0x0800, ANIM_TAG_SPOTLIGHT}, {gBattleAnimSpriteGfx_LetterZ, 0x0200, ANIM_TAG_LETTER_Z}, {gBattleAnimSpriteGfx_RapidSpin, 0x0300, ANIM_TAG_RAPID_SPIN}, @@ -1366,7 +1419,11 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_PinkPetal, 0x0080, ANIM_TAG_PINK_PETAL}, {gBattleAnimSpriteGfx_PainSplit, 0x0180, ANIM_TAG_PAIN_SPLIT}, {gBattleAnimSpriteGfx_Confetti, 0x0180, ANIM_TAG_CONFETTI}, + #if NEW_MORNING_SUN_STAR_PARTICLE + {gBattleAnimSpriteGfx_NewGreenStar, 0x0200, ANIM_TAG_GREEN_STAR}, + #else {gBattleAnimSpriteGfx_GreenStar, 0x0200, ANIM_TAG_GREEN_STAR}, + #endif {gBattleAnimSpriteGfx_PinkCloud, 0x0200, ANIM_TAG_PINK_CLOUD}, {gBattleAnimSpriteGfx_SweatDrop, 0x0020, ANIM_TAG_SWEAT_DROP}, {gBattleAnimSpriteGfx_GuardRing, 0x0400, ANIM_TAG_GUARD_RING}, @@ -1414,6 +1471,99 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_Slash, 0x0800, ANIM_TAG_SLASH_2}, {gBattleAnimSpriteGfx_SlamHit, 0x1000, ANIM_TAG_WHIP_HIT}, {gBattleAnimSpriteGfx_GoldRing, 0x0100, ANIM_TAG_BLUE_RING_2}, + {gBattleAnimSpriteGfx_WhiteStreak, 0x0200, ANIM_TAG_WHITE_STREAK}, + {gBattleAnimSpriteGfx_PurpleJab, 0x0100, ANIM_TAG_PURPLE_JAB}, + {gBattleAnimSpriteGfx_Spikes, 0x0080, ANIM_TAG_TOXIC_SPIKES}, + {gBattleAnimSpriteGfx_EnergyBall, 0x0200, ANIM_TAG_ENERGY_BALL}, + {gBattleAnimSpriteGfx_SeedBrown, 0x0080, ANIM_TAG_SEED_BROWN}, + {gBattleAnimSpriteGfx_Feint, 0x0800, ANIM_TAG_FEINT}, + {gBattleAnimSpriteGfx_MegaStone, 0x800, ANIM_TAG_MEGA_STONE}, + {gBattleAnimSpriteGfx_MegaSymbol, 0x0200, ANIM_TAG_MEGA_SYMBOL}, + {gBattleAnimSpriteGfx_MegaParticles, 0x0180, ANIM_TAG_MEGA_PARTICLES}, + {gBattleAnimSpriteGfx_TrumpCard, 0x0180, ANIM_TAG_TRUMP_CARD}, + {gBattleAnimSpriteGfx_TrumpCardParticles, 0x0060, ANIM_TAG_TRUMP_CARD_PARTICLES}, + {gBattleAnimSpriteGfx_Accupressure, 0x0200, ANIM_TAG_ACCUPRESSURE}, + {gBattleAnimSpriteGfx_WringOut, 0x0200, ANIM_TAG_WRING_OUT}, + {gBattleAnimSpriteGfx_ColoredOrbs, 0x0300, ANIM_TAG_COLORED_ORBS}, + {gBattleAnimSpriteGfx_WorrySeed, 0x0080, ANIM_TAG_WORRY_SEED}, + {gBattleAnimSpriteGfx_SmallCloud, 0x0080, ANIM_TAG_SMALL_CLOUD}, + {gBattleAnimSpriteGfx_AttackOrder, 0x0480, ANIM_TAG_ATTACK_ORDER}, + {gBattleAnimSpriteGfx_DragonPulse, 0x0100, ANIM_TAG_DRAGON_PULSE}, + {gBattleAnimSpriteGfx_WoodHammer, 0x0C00, ANIM_TAG_WOOD_HAMMER}, + {gBattleAnimSpriteGfx_PsychoCut, 0x0200, ANIM_TAG_PSYCHO_CUT}, + {gBattleAnimSpriteGfx_PowerGem, 0x0080, ANIM_TAG_POWER_GEM}, + {gBattleAnimSpriteGfx_StoneEdge, 0x0A00, ANIM_TAG_STONE_EDGE}, + {gBattleAnimSpriteGfx_StealthRock, 0x0080, ANIM_TAG_STEALTH_ROCK}, + {gBattleAnimSpriteGfx_PoisonJab, 0x0080, ANIM_TAG_POISON_JAB}, + {gBattleAnimSpriteGfx_PoisonBubble, 0x0180, ANIM_TAG_GREEN_POISON_BUBBLE}, + {gBattleAnimSpriteGfx_FlashCannonBall, 0x200, ANIM_TAG_FLASH_CANNON_BALL}, + {gBattleAnimSpriteGfx_WaterGun, 0x180, ANIM_TAG_WATER_GUN}, + {gBattleAnimSpriteGfx_Punishment, 0xa00, ANIM_TAG_PUNISHMENT_BLADES}, + {gBattleAnimSpriteGfx_QuickGuard, 0x200, ANIM_TAG_QUICK_GUARD_HAND}, + {gBattleAnimSpriteGfx_ShellRight, 0x800, ANIM_TAG_SHELL_RIGHT}, + {gBattleAnimSpriteGfx_ShellLeft, 0x800, ANIM_TAG_SHELL_LEFT}, + {gBattleAnimSpriteGfx_RazorShell, 0x200, ANIM_TAG_RAZOR_SHELL}, + {gBattleAnimSpriteGfx_HydroPump, 0x200, ANIM_TAG_HYDRO_PUMP}, + {gBattleAnimSpriteGfx_Brine, 0xc00, ANIM_TAG_BRINE}, + {gBattleAnimSpriteGfx_Gear, 0x200, ANIM_TAG_GEAR}, + {gBattleAnimSpriteGfx_AssuranceHand, 0x200, ANIM_TAG_ASSURANCE_HAND}, + {gBattleAnimSpriteGfx_AcupressureFinger, 0x200, ANIM_TAG_ACUPRESSURE_FINGER}, + {gBattleAnimSpriteGfx_Fishies, 0x480, ANIM_TAG_WISHIWASHI_FISH}, + {gBattleAnimSpriteGfx_ZygardeHexes, 0x480, ANIM_TAG_ZYGARDE_HEXES}, + {gBattleAnimSpriteGfx_AuraSphere, 0x200, ANIM_TAG_AURA_SPHERE}, + {gBattleAnimSpriteGfx_OmegaStone, 0x800, ANIM_TAG_OMEGA_STONE}, + {gBattleAnimSpriteGfx_AlphaStone, 0x800, ANIM_TAG_ALPHA_STONE}, + {gBattleAnimSpriteGfx_BerryNormal, 0x400, ANIM_TAG_BERRY_NORMAL}, + {gBattleAnimSpriteGfx_BerryEaten, 0x200, ANIM_TAG_BERRY_EATEN}, + {gBattleAnimSpriteGfx_PurpleDrake, 0x800, ANIM_TAG_DRAGON_ASCENT}, + {gBattleAnimSpriteGfx_PinkDiamond, 0x40, ANIM_TAG_PINK_DIAMOND}, + {gBattleAnimSpriteGfx_SteamEruption, 0xa00, ANIM_TAG_STEAM_ERUPTION}, + {gBattleAnimSpriteGfx_Confide, 0x800, ANIM_TAG_CONFIDE}, + {gBattleAnimSpriteGfx_Arrows, 0x480, ANIM_TAG_VERTICAL_HEX}, + {NULL, 0x0, ANIM_TAG_UNAVAILABLE_1}, + {NULL, 0x0, ANIM_TAG_UNAVAILABLE_2}, + {gBattleAnimSpriteGfx_PowerTrick, 0x800, ANIM_TAG_POWER_TRICK}, + {gBattleAnimSpriteGfx_ChainLink, 0x200, ANIM_TAG_CHAIN_LINK}, + {gBattleAnimSpriteGfx_Anchor, 0x200, ANIM_TAG_ANCHOR}, + {gBattleAnimSpriteGfx_HorseshoeFist, 0x800, ANIM_TAG_HORSESHOE_SIDE_FIST}, + {gBattleAnimSpriteGfx_PurpleDrake, 0x800, ANIM_TAG_DRAGON_ASCENT_FOE}, + {gBattleAnimSpriteGfx_CraftyShield, 0x80, ANIM_TAG_CRAFTY_SHIELD}, + {gBattleAnimSpriteGfx_BlacephalonHead, 0x200, ANIM_TAG_BLACEPHALON_HEAD}, + {gBattleAnimSpriteGfx_FairyLockChains, 0x400, ANIM_TAG_FAIRY_LOCK_CHAINS}, + {gBattleAnimSpriteGfx_LightningRain, 0x700, ANIM_TAG_IONS}, + {gBattleAnimSpriteGfx_Chop, 0x200, ANIM_TAG_CHOP}, + {gBattleAnimSpriteGfx_HeartStamp, 0x400, ANIM_TAG_HEART_STAMP}, + {gBattleAnimSpriteGfx_HornLeech, 0x200, ANIM_TAG_HORN_LEECH}, + {gBattleAnimSpriteGfx_Steamroller, 0x800, ANIM_TAG_STEAMROLLER}, + {gBattleAnimSpriteGfx_HoopaHand, 0x80, ANIM_TAG_HOOPA_HAND}, + {gBattleAnimSpriteGfx_HoopaRing, 0x200, ANIM_TAG_HOOPA_RING}, + {gBattleAnimSpriteGfx_MetalBits, 0x140, ANIM_TAG_METAL_BITS}, + {gBattleAnimSpriteGfx_RocksSmall, 0x140, ANIM_TAG_SMALL_ROCK}, + {gBattleAnimSpriteGfx_SpiritShackleArrow, 0x200, ANIM_TAG_SPIRIT_ARROW}, + {gBattleAnimSpriteGfx_NecrozmaStar, 0x200, ANIM_TAG_ULTRA_BURST_SYMBOL}, + {gBattleAnimSpriteGfx_ZMoveSymbol, 0x800, ANIM_TAG_Z_MOVE_SYMBOL}, + {gBattleAnimSpriteGfx_BigRock, 0x800, ANIM_TAG_REALLY_BIG_ROCK}, + {gBattleAnimSpriteGfx_Cacoon, 0x800, ANIM_TAG_COCOON}, + {gBattleAnimSpriteGfx_Drill, 0x800, ANIM_TAG_CORKSCREW}, + {gBattleAnimSpriteGfx_GigavoltHavocSpear, 0x800, ANIM_TAG_HAVOC_SPEAR}, + {gBattleAnimSpriteGfx_PurpleDrake, 0x800, ANIM_TAG_PURPLE_DRAKE}, + {gBattleAnimSpriteGfx_MudBomb, 0x800, ANIM_TAG_MUD_BOMB}, + {gBattleAnimSpriteGfx_Branch, 0x200, ANIM_TAG_BRANCH}, + {gBattleAnimSpriteGfx_Apple, 0x200, ANIM_TAG_APPLE}, + {gBattleAnimSpriteGfx_Obstruct, 0x200, ANIM_TAG_OBSTRUCT_CROSS}, + {gBattleAnimSpriteGfx_PoisonColumn, 0x2000, ANIM_TAG_POISON_COLUMN}, + {gBattleAnimSpriteGfx_PoisonColumn, 0x2000, ANIM_TAG_GARBAGE_COLUMN}, + {gBattleAnimSpriteGfx_LargeSpike, 0x1000, ANIM_TAG_LARGE_SPIKE}, + {gBattleAnimSpriteGfx_DragonPulseRing, 0x200, ANIM_TAG_DRAGON_PULSE_RING}, + {gBattleAnimSpriteGfx_StonePillar, 0x2000, ANIM_TAG_STONE_PILLAR}, + {gBattleAnimSpriteGfx_Mushroom, 0x800, ANIM_TAG_MUSHROOM}, + {gBattleAnimSpriteGfx_GoldenApple, 0x800, ANIM_TAG_GOLDEN_APPLE}, + {gBattleAnimSpriteGfx_IceRock, 0x2800, ANIM_TAG_ICE_ROCK}, + {gBattleAnimSpriteGfx_Tornado, 0x1800, ANIM_TAG_TORNADO}, + {gBattleAnimSpriteGfx_StraightBeam, 0x180, ANIM_TAG_STRAIGHT_BEAM}, + {gBattleAnimSpriteGfx_DreepyMissile, 0x200, ANIM_TAG_DREEPY}, + {gBattleAnimSpriteGfx_IceRock, 0x1800, ANIM_TAG_ICE_ROCK_SINGLE}, + {gBattleAnimSpriteGfx_StonePillar, 0x1800, ANIM_TAG_STONE_PILLAR_MULTI}, }; const struct CompressedSpritePalette gBattleAnimPaletteTable[] = @@ -1423,8 +1573,16 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_Pencil, ANIM_TAG_PENCIL}, {gBattleAnimSpritePal_AirWave, ANIM_TAG_AIR_WAVE}, {gBattleAnimSpritePal_Orb, ANIM_TAG_ORB}, + #if NEW_SWORD_PARTICLE + {gBattleAnimSpritePal_NewSword, ANIM_TAG_SWORD}, + #else {gBattleAnimSpritePal_Sword, ANIM_TAG_SWORD}, + #endif + #if NEW_LEECH_SEED_PARTICLE + {gBattleAnimSpritePal_NewLeechSeed, ANIM_TAG_SEED}, + #else {gBattleAnimSpritePal_Seed, ANIM_TAG_SEED}, + #endif {gBattleAnimSpritePal_Explosion6, ANIM_TAG_EXPLOSION_6}, {gBattleAnimSpritePal_PinkOrb, ANIM_TAG_PINK_ORB}, {gBattleAnimSpritePal_Gust, ANIM_TAG_GUST}, @@ -1438,7 +1596,11 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_BlackSmoke, ANIM_TAG_BLACK_BALL}, {gBattleAnimSpritePal_Conversion, ANIM_TAG_CONVERSION}, {gBattleAnimSpritePal_Glass, ANIM_TAG_GLASS}, + #if NEW_HORN_ATTACK_PARTICLE + {gBattleAnimSpritePal_NewHornHit, ANIM_TAG_HORN_HIT}, + #else {gBattleAnimSpritePal_HornHit, ANIM_TAG_HORN_HIT}, + #endif {gBattleAnimSpritePal_Hit, ANIM_TAG_HIT}, {gBattleAnimSpritePal_Hit2, ANIM_TAG_HIT_2}, {gBattleAnimSpritePal_BlueShards, ANIM_TAG_BLUE_SHARDS}, @@ -1447,7 +1609,11 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_HitDuplicate, ANIM_TAG_HIT_DUPLICATE}, {gBattleAnimSpritePal_Leer, ANIM_TAG_LEER}, {gBattleAnimSpritePal_BlueBurst, ANIM_TAG_BLUE_BURST}, + #if NEW_EMBER_PARTICLES + {gBattleAnimSpritePal_NewEmbers, ANIM_TAG_SMALL_EMBER}, + #else {gBattleAnimSpritePal_SmallEmber, ANIM_TAG_SMALL_EMBER}, + #endif {gBattleAnimSpritePal_GraySmoke, ANIM_TAG_GRAY_SMOKE}, {gBattleAnimSpritePal_BlueStar, ANIM_TAG_BLUE_STAR}, {gBattleAnimSpritePal_BubbleBurst, ANIM_TAG_BUBBLE_BURST}, @@ -1476,12 +1642,20 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_HumanoidFoot, ANIM_TAG_RED_FIST}, {gBattleAnimSpritePal_SlamHit, ANIM_TAG_SLAM_HIT}, {gBattleAnimSpritePal_Ring, ANIM_TAG_RING}, + #if NEW_ROCKS_PARTICLE + {gBattleAnimSpritePal_NewRocks, ANIM_TAG_ROCKS}, + #else {gBattleAnimSpritePal_Rocks, ANIM_TAG_ROCKS}, + #endif {gBattleAnimSpritePal_Z, ANIM_TAG_Z}, {gBattleAnimSpritePal_YellowUnk2, ANIM_TAG_YELLOW_UNK_2}, {gBattleAnimSpritePal_AirSlash, ANIM_TAG_AIR_SLASH}, {gBattleAnimSpritePal_SpinningGreenOrbs, ANIM_TAG_SPINNING_GREEN_ORBS}, + #if NEW_LEAF_PARTICLE + {gBattleAnimSpritePal_NewLeaf, ANIM_TAG_LEAF}, + #else {gBattleAnimSpritePal_Leaf, ANIM_TAG_LEAF}, + #endif {gBattleAnimSpritePal_Finger, ANIM_TAG_FINGER}, {gBattleAnimSpritePal_PoisonPowder, ANIM_TAG_POISON_POWDER}, {gBattleAnimSpritePal_BrownTriangle, ANIM_TAG_BROWN_TRIANGLE}, @@ -1545,7 +1719,11 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_Shock2, ANIM_TAG_SHOCK_2}, {gBattleAnimSpritePal_ClosingEye2, ANIM_TAG_CLOSING_EYE_2}, {gBattleAnimSpritePal_MetalBall, ANIM_TAG_METAL_BALL}, + #if NEW_SUBSTITUTE_PARTICLE + {gBattleAnimSpritePal_NewSubstituteFront, ANIM_TAG_MONSTER_DOLL}, + #else {gBattleAnimSpritePal_MonsterDoll, ANIM_TAG_MONSTER_DOLL}, + #endif {gBattleAnimSpritePal_Whirlwind, ANIM_TAG_WHIRLWIND}, {gBattleAnimSpritePal_Whirlwind, ANIM_TAG_WHIRLWIND_2}, {gBattleAnimSpritePal_Explosion4, ANIM_TAG_EXPLOSION_4}, @@ -1553,15 +1731,27 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_Tongue, ANIM_TAG_TONGUE}, {gBattleAnimSpritePal_Smoke, ANIM_TAG_SMOKE}, {gBattleAnimSpritePal_Smoke, ANIM_TAG_SMOKE_2}, + #if NEW_IMPACT_PALETTE + {gBattleAnimSpritePal_NewImpact, ANIM_TAG_IMPACT}, + #else {gBattleAnimSpritePal_Impact, ANIM_TAG_IMPACT}, + #endif {gBattleAnimSpritePal_CircleImpact, ANIM_TAG_CIRCLE_IMPACT}, {gBattleAnimSpritePal_Impact, ANIM_TAG_SCRATCH}, {gBattleAnimSpritePal_Impact, ANIM_TAG_CUT}, + #if NEW_TEETH_PARTICLE + {gBattleAnimSpritePal_NewTeeth, ANIM_TAG_SHARP_TEETH}, + #else {gBattleAnimSpritePal_SharpTeeth, ANIM_TAG_SHARP_TEETH}, + #endif {gBattleAnimSpritePal_RainbowRings, ANIM_TAG_RAINBOW_RINGS}, {gBattleAnimSpritePal_IceCrystals, ANIM_TAG_ICE_CRYSTALS}, {gBattleAnimSpritePal_IceCrystals, ANIM_TAG_ICE_SPIKES}, + #if NEW_HANDS_FEET_PARTICLE + {gBattleAnimSpritePal_NewHandsAndFeet, ANIM_TAG_HANDS_AND_FEET}, + #else {gBattleAnimSpritePal_HandsAndFeet, ANIM_TAG_HANDS_AND_FEET}, + #endif {gBattleAnimSpritePal_MistCloud, ANIM_TAG_MIST_CLOUD}, {gBattleAnimSpritePal_SharpTeeth, ANIM_TAG_CLAMP}, {gBattleAnimSpritePal_RainDrops, ANIM_TAG_BUBBLE}, @@ -1570,11 +1760,19 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_WaterImpact, ANIM_TAG_WATER_ORB}, {gBattleAnimSpritePal_PoisonBubble, ANIM_TAG_POISON_BUBBLE}, {gBattleAnimSpritePal_PoisonBubble, ANIM_TAG_TOXIC_BUBBLE}, + #if NEW_SPIKES_PARTICLE + {gBattleAnimSpritePal_NewSpikes, ANIM_TAG_SPIKES}, + #else {gBattleAnimSpritePal_Spikes, ANIM_TAG_SPIKES}, + #endif {gBattleAnimSpritePal_HornHit2, ANIM_TAG_HORN_HIT_2}, {gBattleAnimSpritePal_AirWave2, ANIM_TAG_AIR_WAVE_2}, {gBattleAnimSpritePal_SmallBubbles, ANIM_TAG_SMALL_BUBBLES}, + #if NEW_FLY_BUBBLE_PARTICLE + {gBattleAnimSpritePal_NewFly, ANIM_TAG_ROUND_SHADOW}, + #else {gBattleAnimSpritePal_RoundShadow, ANIM_TAG_ROUND_SHADOW}, + #endif {gBattleAnimSpritePal_Sunlight, ANIM_TAG_SUNLIGHT}, {gBattleAnimSpritePal_Spore, ANIM_TAG_SPORE}, {gBattleAnimSpritePal_Flower, ANIM_TAG_FLOWER}, @@ -1605,7 +1803,11 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_FocusEnergy, ANIM_TAG_FOCUS_ENERGY}, {gBattleAnimSpritePal_SphereToCube, ANIM_TAG_SPHERE_TO_CUBE}, {gBattleAnimSpritePal_Tendrils, ANIM_TAG_TENDRILS}, + #if NEW_MEAN_LOOK_PARTICLE + {gBattleAnimSpritePal_NewEye, ANIM_TAG_EYE}, + #else {gBattleAnimSpritePal_Eye, ANIM_TAG_EYE}, + #endif {gBattleAnimSpritePal_WhiteShadow, ANIM_TAG_WHITE_SHADOW}, {gBattleAnimSpritePal_TealAlert, ANIM_TAG_TEAL_ALERT}, {gBattleAnimSpritePal_OpeningEye, ANIM_TAG_OPENING_EYE}, @@ -1644,7 +1846,11 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_Roots, ANIM_TAG_ROOTS}, {gBattleAnimSpritePal_ItemBag, ANIM_TAG_ITEM_BAG}, {gBattleAnimSpritePal_JaggedMusicNote, ANIM_TAG_JAGGED_MUSIC_NOTE}, + #if NEW_BATON_PASS_BALL_PARTICLE + {gBattleAnimSpritePal_NewPokeball, ANIM_TAG_POKEBALL}, + #else {gBattleAnimSpritePal_Pokeball, ANIM_TAG_POKEBALL}, + #endif {gBattleAnimSpritePal_Pokeball, ANIM_TAG_SPOTLIGHT}, {gBattleAnimSpritePal_LetterZ, ANIM_TAG_LETTER_Z}, {gBattleAnimSpritePal_RapidSpin, ANIM_TAG_RAPID_SPIN}, @@ -1659,7 +1865,11 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_PinkPetal, ANIM_TAG_PINK_PETAL}, {gBattleAnimSpritePal_PainSplit, ANIM_TAG_PAIN_SPLIT}, {gBattleAnimSpritePal_Confetti, ANIM_TAG_CONFETTI}, + #if NEW_MORNING_SUN_STAR_PARTICLE + {gBattleAnimSpritePal_NewGreenStar, ANIM_TAG_GREEN_STAR}, + #else {gBattleAnimSpritePal_GreenStar, ANIM_TAG_GREEN_STAR}, + #endif {gBattleAnimSpritePal_PinkCloud, ANIM_TAG_PINK_CLOUD}, {gBattleAnimSpritePal_SweatDrop, ANIM_TAG_SWEAT_DROP}, {gBattleAnimSpritePal_GuardRing, ANIM_TAG_GUARD_RING}, @@ -1707,6 +1917,100 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_Slash2, ANIM_TAG_SLASH_2}, {gBattleAnimSpritePal_WhipHit, ANIM_TAG_WHIP_HIT}, {gBattleAnimSpritePal_BlueRing2, ANIM_TAG_BLUE_RING_2}, + {gBattleAnimSpritePal_WhiteStreak, ANIM_TAG_WHITE_STREAK}, + {gBattleAnimSpritePal_PurpleJab, ANIM_TAG_PURPLE_JAB}, + //new particles + {gBattleAnimSpritePal_ToxicSpikes, ANIM_TAG_TOXIC_SPIKES}, + {gBattleAnimSpritePal_EnergyBall, ANIM_TAG_ENERGY_BALL}, + {gBattleAnimSpritePal_SeedBrown, ANIM_TAG_SEED_BROWN}, + {gBattleAnimSpritePal_Feint, ANIM_TAG_FEINT}, + {gBattleAnimSpritePal_MegaStone, ANIM_TAG_MEGA_STONE}, + {gBattleAnimSpritePal_MegaSymbol, ANIM_TAG_MEGA_SYMBOL}, + {gBattleAnimSpritePal_MegaParticles, ANIM_TAG_MEGA_PARTICLES}, + {gBattleAnimSpritePal_TrumpCard, ANIM_TAG_TRUMP_CARD}, + {gBattleAnimSpritePal_TrumpCardParticles, ANIM_TAG_TRUMP_CARD_PARTICLES}, + {gBattleAnimSpritePal_Accupressure, ANIM_TAG_ACCUPRESSURE}, + {gBattleAnimSpritePal_WringOut, ANIM_TAG_WRING_OUT}, + {gBattleAnimSpritePal_ColoredOrbs, ANIM_TAG_COLORED_ORBS}, + {gBattleAnimSpritePal_WorrySeed, ANIM_TAG_WORRY_SEED}, + {gBattleAnimSpritePal_SmallCloud, ANIM_TAG_SMALL_CLOUD}, + {gBattleAnimSpritePal_AttackOrder, ANIM_TAG_ATTACK_ORDER}, + {gBattleAnimSpritePal_DragonPulse, ANIM_TAG_DRAGON_PULSE}, + {gBattleAnimSpritePal_WoodHammer, ANIM_TAG_WOOD_HAMMER}, + {gBattleAnimSpritePal_PsychoCut, ANIM_TAG_PSYCHO_CUT}, + {gBattleAnimSpritePal_PowerGem, ANIM_TAG_POWER_GEM}, + {gBattleAnimSpritePal_StoneEdge, ANIM_TAG_STONE_EDGE}, + {gBattleAnimSpritePal_StealthRock, ANIM_TAG_STEALTH_ROCK}, + {gBattleAnimSpritePal_PoisonJab, ANIM_TAG_POISON_JAB}, + {gBattleAnimSpritePal_Vine, ANIM_TAG_GREEN_POISON_BUBBLE}, + {gBattleAnimSpritePal_FlashCannonBall, ANIM_TAG_FLASH_CANNON_BALL}, + {gBattleAnimSpritePal_WaterGun, ANIM_TAG_WATER_GUN}, + {gBattleAnimSpritePal_Punishment, ANIM_TAG_PUNISHMENT_BLADES}, + {gBattleAnimSpritePal_QuickGuard, ANIM_TAG_QUICK_GUARD_HAND}, + {gBattleAnimSpritePal_ShellLeft, ANIM_TAG_SHELL_RIGHT}, + {gBattleAnimSpritePal_ShellLeft, ANIM_TAG_SHELL_LEFT}, + {gBattleAnimSpritePal_RazorShell, ANIM_TAG_RAZOR_SHELL}, + {gBattleAnimSpritePal_HydroPump, ANIM_TAG_HYDRO_PUMP}, + {gBattleAnimSpritePal_Brine, ANIM_TAG_BRINE}, + {gBattleAnimSpritePal_Gear, ANIM_TAG_GEAR}, + {gBattleAnimSpritePal_AssuranceHand, ANIM_TAG_ASSURANCE_HAND}, + {gBattleAnimSpritePal_AcupressureFinger, ANIM_TAG_ACUPRESSURE_FINGER}, + {gBattleAnimSpritePal_Fishies, ANIM_TAG_WISHIWASHI_FISH}, + {gBattleAnimSpritePal_ZygardeHexes, ANIM_TAG_ZYGARDE_HEXES}, + {gBattleAnimSpritePal_AuraSphere, ANIM_TAG_AURA_SPHERE}, + {gBattleAnimSpritePal_OmegaStone, ANIM_TAG_OMEGA_STONE}, + {gBattleAnimSpritePal_AlphaStone, ANIM_TAG_ALPHA_STONE}, + {gBattleAnimSpritePal_BerryNormal, ANIM_TAG_BERRY_NORMAL}, + {gBattleAnimSpritePal_SpacialRendSlices, ANIM_TAG_BERRY_EATEN}, + {gBattleAnimSpritePal_GreenDrake, ANIM_TAG_DRAGON_ASCENT}, + {gBattleAnimSpritePal_PinkDiamond, ANIM_TAG_PINK_DIAMOND}, + {gBattleAnimSpritePal_SteamEruption, ANIM_TAG_STEAM_ERUPTION}, + {gBattleAnimSpritePal_Confide, ANIM_TAG_CONFIDE}, + {gBattleAnimSpritePal_FusionFlare, ANIM_TAG_VERTICAL_HEX}, + {NULL, ANIM_TAG_UNAVAILABLE_1}, + {NULL, ANIM_TAG_UNAVAILABLE_2}, + {gBattleAnimSpritePal_PowerTrick, ANIM_TAG_POWER_TRICK}, + {gBattleAnimSpritePal_ChainLink, ANIM_TAG_CHAIN_LINK}, + {gBattleAnimSpritePal_NaturalGiftRing, ANIM_TAG_ANCHOR}, + {gBattleAnimSpritePal_HorseshoeFist, ANIM_TAG_HORSESHOE_SIDE_FIST}, + {gBattleAnimSpritePal_AvalancheRocks, ANIM_TAG_DRAGON_ASCENT_FOE}, + {gBattleAnimSpritePal_CraftyShield, ANIM_TAG_CRAFTY_SHIELD}, + {gBattleAnimSpritePal_BlacephalonHead, ANIM_TAG_BLACEPHALON_HEAD}, + {gBattleAnimSpritePal_DracoMeteor, ANIM_TAG_FAIRY_LOCK_CHAINS}, + {gBattleAnimSpritePal_LightningRain, ANIM_TAG_IONS}, + {gBattleAnimSpritePal_Chop, ANIM_TAG_CHOP}, + [ANIM_TAG_HEART_STAMP - ANIM_SPRITES_START] = {gBattleAnimSpritePal_HeartStamp, ANIM_TAG_HEART_STAMP}, + {gBattleAnimSpritePal_HornLeech, ANIM_TAG_HORN_LEECH}, + {gBattleAnimSpritePal_Steamroller, ANIM_TAG_STEAMROLLER}, + {gBattleAnimSpritePal_HoopaHand, ANIM_TAG_HOOPA_HAND}, + {gBattleAnimSpritePal_HoopaRing, ANIM_TAG_HOOPA_RING}, + {gBattleAnimSpritePal_BlueFlare, ANIM_TAG_METAL_BITS}, + {gBattleAnimSpritePal_NewRocks, ANIM_TAG_SMALL_ROCK}, + {gBattleAnimSpritePal_SpiritShackleArrow, ANIM_TAG_SPIRIT_ARROW}, + {gBattleAnimSpritePal_NecrozmaStar, ANIM_TAG_ULTRA_BURST_SYMBOL}, + {gBattleAnimSpritePal_ZMoveSymbol, ANIM_TAG_Z_MOVE_SYMBOL}, + {gBattleAnimSpritePal_BigRock, ANIM_TAG_REALLY_BIG_ROCK}, + {gBattleAnimSpritePal_Cacoon, ANIM_TAG_COCOON}, + {gBattleAnimSpritePal_Drill, ANIM_TAG_CORKSCREW}, + {gBattleAnimSpritePal_GigavoltHavocSpear, ANIM_TAG_HAVOC_SPEAR}, + {gBattleAnimSpritePal_PurpleDrake, ANIM_TAG_PURPLE_DRAKE}, + {gBattleAnimSpritePal_MudBomb, ANIM_TAG_MUD_BOMB}, + {gBattleAnimSpritePal_Branch, ANIM_TAG_BRANCH}, + {gBattleAnimSpritePal_Apple, ANIM_TAG_APPLE}, + {gBattleAnimSpritePal_Obstruct, ANIM_TAG_OBSTRUCT_CROSS}, + {gBattleAnimSpritePal_PoisonColumn, ANIM_TAG_POISON_COLUMN}, + {gBattleAnimSpritePal_GarbagePoisonPillar, ANIM_TAG_GARBAGE_COLUMN}, + {gBattleAnimSpritePal_LargeSpike, ANIM_TAG_LARGE_SPIKE}, + {gBattleAnimSpritePal_DragonPulseRing, ANIM_TAG_DRAGON_PULSE_RING}, + {gBattleAnimSpritePal_StonePillar, ANIM_TAG_STONE_PILLAR}, + {gBattleAnimSpritePal_Mushroom, ANIM_TAG_MUSHROOM}, + {gBattleAnimSpritePal_GoldenApple, ANIM_TAG_GOLDEN_APPLE}, + {gBattleAnimSpritePal_IceRock, ANIM_TAG_ICE_ROCK}, + {gBattleAnimSpritePal_Tornado, ANIM_TAG_TORNADO}, + {gBattleAnimSpritePal_StraightBeam, ANIM_TAG_STRAIGHT_BEAM}, + {gBattleAnimSpritePal_DreepyMissile, ANIM_TAG_DREEPY}, + {gBattleAnimSpritePal_IceRock, ANIM_TAG_ICE_ROCK_SINGLE}, + {gBattleAnimSpritePal_StonePillar, ANIM_TAG_STONE_PILLAR_MULTI}, }; const struct BattleAnimBackground gBattleAnimBackgroundTable[] = @@ -1738,6 +2042,58 @@ const struct BattleAnimBackground gBattleAnimBackgroundTable[] = [BG_SOLARBEAM_OPPONENT] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_Solarbeam, gBattleAnimBgTilemap_ImpactOpponent}, [BG_SOLARBEAM_PLAYER] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_Solarbeam, gBattleAnimBgTilemap_ImpactPlayer}, [BG_SOLARBEAM_CONTESTS] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_Solarbeam, gBattleAnimBgTilemap_ImpactContests}, + //new bgs + [BG_MAGMA_STORM] = {gBattleAnimBgImage_InAir, gBattleAnimBgPalette_MagmaStorm, gBattleAnimBgTilemap_InAir}, + [BG_GIGA_IMPACT_OPPONENT] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_GigaImpact, gBattleAnimBgTilemap_ImpactOpponent}, + [BG_GIGA_IMPACT_PLAYER] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_GigaImpact, gBattleAnimBgTilemap_ImpactPlayer}, + [BG_GIGA_IMPACT_CONTEST] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_GigaImpact, gBattleAnimBgTilemap_ImpactContests}, + [BG_TRICK_ROOM] = {gBattleAnimBgImage_TrickRoom, gBattleAnimBgPalette_TrickRoom, gBattleAnimBgTilemap_TrickRoom}, + [BG_ROCK_WRECKER] = {gBattleAnimBgImage_RockWrecker, gBattleAnimBgPalette_RockWrecker, gBattleAnimBgTilemap_RockWrecker}, + [BG_SPACIAL_REND_ON_OPPONENT] = {gBattleAnimBgImage_SpacialRendOpponent, gBattleAnimBgPalette_SpacialRendOpponent, gBattleAnimBgTilemap_SpacialRendOpponent}, + [BG_SPACIAL_REND_ON_PLAYER] = {gBattleAnimBgImage_SpacialRendPlayer, gBattleAnimBgPalette_SpacialRendPlayer, gBattleAnimBgTilemap_SpacialRendPlayer}, + [BG_DARK_VOID] = {gBattleAnimBgImage_DarkVoid, gBattleAnimBgPalette_DarkVoid, gBattleAnimBgTilemap_DarkVoid}, + [BG_WATER] = {gBattleAnimBgImage_HydroPump, gBattleAnimBgPalette_HydroPump, gBattleAnimBgTilemap_HydroPump}, + [BG_NIGHTMARE] = {gBattleAnimBgImage_Nightmare, gBattleAnimBgPalette_Nightmare, gBattleAnimBgTilemap_Nightmare}, + [BG_LEAF_STORM] = {gBattleAnimBgImage_LeafStorm, gBattleAnimBgPalette_LeafStorm, gBattleAnimBgTilemap_LeafStorm}, + [BG_FIRE] = {gBattleAnimBgImage_Fire1, gBattleAnimBgPalette_Fire1, gBattleAnimBgTilemap_Fire1}, + [BG_FIRE_2] = {gBattleAnimBgImage_Fire1, gBattleAnimBgPalette_Fire2, gBattleAnimBgTilemap_Fire1}, + [BG_WATER_2] = {gBattleAnimBgImage_Waterfall, gBattleAnimBgPalette_Waterfall, gBattleAnimBgTilemap_Waterfall}, + [BG_POISON] = {gBattleAnimBgImage_Waterfall, gBattleAnimBgPalette_PoisonFalls, gBattleAnimBgTilemap_Waterfall}, + [BG_AEROBLAST] = {gBattleAnimBgImage_Aeroblast, gBattleAnimBgPalette_Aeroblast, gBattleAnimBgTilemap_Aeroblast}, + [BG_HIGH_SPEED] = {gBattleAnimBgImage_HighSpeed, gBattleAnimBgPalette_HighSpeed, gBattleAnimBgTilemap_HighSpeed}, + [BG_ELECTRIC_TERRAIN] = {gBattleAnimBgImage_ElectricTerrain, gBattleAnimBgPalette_ElectricTerrain, gBattleAnimBgTilemap_ElectricTerrain}, + [BG_GRASSY_TERRAIN] = {gBattleAnimBgImage_GrassyTerrain, gBattleAnimBgPalette_GrassyTerrain, gBattleAnimBgTilemap_GrassyTerrain}, + [BG_MISTY_TERRAIN] = {gBattleAnimBgImage_MistyTerrain, gBattleAnimBgPalette_MistyTerrain, gBattleAnimBgTilemap_MistyTerrain}, + [BG_PSYCHIC_TERRAIN] = {gBattleAnimBgImage_PsychicTerrain, gBattleAnimBgPalette_PsychicTerrain, gBattleAnimBgTilemap_PsychicTerrain}, + [BG_FOCUS_BLAST] = {gBattleAnimBgImage_FocusBlast, gBattleAnimBgPalette_FocusBlast, gBattleAnimBgTilemap_FocusBlast}, + [BG_GUNK_SHOT] = {gBattleAnimBgImage_FocusBlast, gBattleAnimBgPalette_GunkShot, gBattleAnimBgTilemap_FocusBlast}, + [BG_HYDRO_CANNON] = {gBattleAnimBgImage_HydroCannon, gBattleAnimBgPalette_HydroCannon, gBattleAnimBgTilemap_HydroCannon}, + [BG_WONDER_ROOM] = {gBattleAnimBgImage_TrickRoom, gBattleAnimBgPalette_WonderRoom, gBattleAnimBgTilemap_TrickRoom}, + [BG_MAGIC_ROOM] = {gBattleAnimBgImage_TrickRoom, gBattleAnimBgPalette_MagicRoom, gBattleAnimBgTilemap_TrickRoom}, + [BG_HYPERSPACE_FURY] = {gBattleAnimBgImage_Psychic, gBattleAnimBgPalette_HyperspaceFury, gBattleAnimBgTilemap_Psychic}, + [BG_BOLT_STRIKE] = {gBattleAnimBgImage_BoltStrike, gBattleAnimBgPalette_BoltStrike, gBattleAnimBgTilemap_BoltStrike}, + [BG_ZMOVE_ACTIVATE] = {gBattleAnimBgImage_ZMoveActivate, gBattleAnimBgPalette_ZMoveActivate, gBattleAnimBgTilemap_ZMoveActivate}, + [BG_TECTONIC_RAGE] = {gBattleAnimBgImage_InAir, gBattleAnimBgPalette_TectonicRage, gBattleAnimBgTilemap_InAir}, + [BG_BLUE_SKY_DAY] = {gBattleAnimBgImage_SkyDay, gBattleAnimBgPalette_SkyDay, gBattleAnimBgTilemap_SkyDay}, + [BG_BLUE_SKY_AFTERNOON] = {gBattleAnimBgImage_SkyDay, gBattleAnimBgPalette_SkyAfternoon, gBattleAnimBgTilemap_SkyDay}, + [BG_BLUE_SKY_NIGHT] = {gBattleAnimBgImage_SkyDay, gBattleAnimBgPalette_SkyNight, gBattleAnimBgTilemap_SkyDay}, + [BG_ZMOVE_MOUNTAIN] = {gBattleAnimBgImage_ZMoveMountain, gBattleAnimBgPalette_ZMoveMountain, gBattleAnimBgTilemap_ZMoveMountain}, + [BG_NEVERENDING_NIGHTMARE] = {gBattleAnimBgImage_NeverendingNightmare, gBattleAnimBgPalette_NeverendingNightmare, gBattleAnimBgTilemap_NeverendingNightmare}, + [BG_WATER_PULSE] = {gBattleAnimBgImage_WaterPulse, gBattleAnimBgPalette_WaterPulse, gBattleAnimBgTilemap_WaterPulse}, + [BG_INFERNO_OVERDRIVE] = {gBattleAnimBgImage_InfernoOverdrive, gBattleAnimBgPalette_InfernoOverdrive, gBattleAnimBgTilemap_InfernoOverdrive}, + [BG_BLOOM_DOOM] = {gBattleAnimBgImage_BloomDoom, gBattleAnimBgPalette_BloomDoom, gBattleAnimBgTilemap_BloomDoom}, + [BG_SHATTERED_PSYCHE] = {gBattleAnimBgImage_ShatteredPsyche, gBattleAnimBgPalette_ShatteredPsyche, gBattleAnimBgTilemap_ShatteredPsyche}, + [BG_TWINKLE_TACKLE] = {gBattleAnimBgImage_TwinkleTackle, gBattleAnimBgPalette_TwinkleTackle, gBattleAnimBgTilemap_TwinkleTackle}, + [BG_BLACKHOLE_ECLIPSE] = {gBattleAnimBgImage_BlackholeEclipse, gBattleAnimBgPalette_BlackholeEclipse, gBattleAnimBgTilemap_BlackholeEclipse}, + [BG_SOULSTEALING_7STAR_STRIKE] = {gBattleAnimBgImage_SoulStealing7StarStrike, gBattleAnimBgPalette_SoulStealing7StarStrike, gBattleAnimBgTilemap_SoulStealing7StarStrike}, + [BG_MALICIOUS_MOONSAULT] = {gBattleAnimBgImage_MaliciousMoonsault, gBattleAnimBgPalette_MaliciousMoonsault, gBattleAnimBgTilemap_MaliciousMoonsault}, + [BG_CLANGOROUS_SOULBLAZE] = {gBattleAnimBgImage_ClangorousSoulblaze, gBattleAnimBgPalette_ClangorousSoulblaze, gBattleAnimBgTilemap_ClangorousSoulblaze}, + [BG_SNUGGLE_FOREVER] = {gBattleAnimBgImage_SnuggleForever, gBattleAnimBgPalette_SnuggleForever, gBattleAnimBgTilemap_SnuggleForever}, + [BG_MAX_LIGHTNING] = {gBattleAnimBgImage_MaxLightning, gBattleAnimBgPalette_MaxLightning, gBattleAnimBgTilemap_MaxLightning}, + [BG_GARBAGE_FALLS] = {gBattleAnimBgImage_Waterfall, gBattleAnimBgPalette_GarbageFalls, gBattleAnimBgTilemap_Waterfall}, + [BG_HYPER_BEAM] = {gBattleAnimBgImage_HydroCannon, gBattleAnimBgPalette_HyperBeam, gBattleAnimBgTilemap_HydroCannon}, + [BG_DYNAMAX_CANNON] = {gBattleAnimBgImage_HydroCannon, gBattleAnimBgPalette_DynamaxCannon, gBattleAnimBgTilemap_HydroCannon}, + [BG_AURA_SPHERE] = {gBattleAnimBgImage_FocusBlast, gBattleAnimBgPalette_AuraSphere, gBattleAnimBgTilemap_FocusBlast}, }; static void (* const sScriptCmdTable[])(void) = @@ -1818,7 +2174,7 @@ void ClearBattleAnimationVars(void) sMonAnimTaskIdArray[1] = 0xFF; gAnimMoveTurn = 0; sAnimBackgroundFadeState = 0; - sAnimMoveIndex = 0; + gAnimMoveIndex = 0; gBattleAnimAttacker = 0; gBattleAnimTarget = 0; gAnimCustomPanning = 0; @@ -1828,6 +2184,15 @@ void DoMoveAnim(u16 move) { gBattleAnimAttacker = gBattlerAttacker; gBattleAnimTarget = gBattlerTarget; + // Make sure the anim target of moves hitting everyone is at the opposite side. + if (gBattleMoves[move].target & MOVE_TARGET_FOES_AND_ALLY && IsDoubleBattle()) + { + while (GET_BATTLER_SIDE(gBattleAnimAttacker) == GET_BATTLER_SIDE(gBattleAnimTarget)) + { + if (++gBattleAnimTarget >= MAX_BATTLERS_COUNT) + gBattleAnimTarget = 0; + } + } LaunchBattleAnimation(gBattleAnims_Moves, move, TRUE); } @@ -1854,9 +2219,9 @@ void LaunchBattleAnimation(const u8 *const animsTable[], u16 tableId, bool8 isMo } if (!isMoveAnim) - sAnimMoveIndex = 0; + gAnimMoveIndex = 0; else - sAnimMoveIndex = tableId; + gAnimMoveIndex = tableId; for (i = 0; i < ANIM_ARGS_COUNT; i++) gBattleAnimArgs[i] = 0; @@ -2261,6 +2626,18 @@ static void ScriptCmd_monbg(void) gAnimScriptCallback = WaitAnimFrameCount; } +u8 GetAnimBattlerId(u8 wantedBattler) +{ + if (wantedBattler == ANIM_ATTACKER) + return gBattleAnimAttacker; + else if (wantedBattler == ANIM_TARGET) + return gBattleAnimTarget; + else if (wantedBattler == ANIM_ATK_PARTNER) + return BATTLE_PARTNER(gBattleAnimAttacker); + else + return BATTLE_PARTNER(gBattleAnimTarget); +} + bool8 IsBattlerSpriteVisible(u8 battlerId) { if (IsContest()) diff --git a/src/battle_anim_bug.c b/src/battle_anim_bug.c index 5e8a8b2a76..87c8ba88e1 100644 --- a/src/battle_anim_bug.c +++ b/src/battle_anim_bug.c @@ -9,13 +9,9 @@ static void AnimLeechLifeNeedle(struct Sprite *); static void AnimTranslateWebThread(struct Sprite *); static void AnimTranslateWebThread_Step(struct Sprite *); static void AnimStringWrap(struct Sprite *); -static void AnimStringWrap_Step(struct Sprite *); -static void AnimSpiderWeb(struct Sprite *); static void AnimSpiderWeb_Step(struct Sprite *); static void AnimSpiderWeb_End(struct Sprite *); static void AnimTranslateStinger(struct Sprite *); -static void AnimMissileArc(struct Sprite *); -static void AnimMissileArc_Step(struct Sprite *); static void AnimTailGlowOrb(struct Sprite *); static const union AffineAnimCmd sAffineAnim_MegahornHorn_0[] = @@ -307,7 +303,7 @@ static void AnimStringWrap(struct Sprite *sprite) sprite->callback = AnimStringWrap_Step; } -static void AnimStringWrap_Step(struct Sprite *sprite) +void AnimStringWrap_Step(struct Sprite *sprite) { if (++sprite->data[0] == 3) { @@ -321,11 +317,23 @@ static void AnimStringWrap_Step(struct Sprite *sprite) } } -static void AnimSpiderWeb(struct Sprite *sprite) +// arg0: x +// arg1: y +// arg2: targets both +void AnimSpiderWeb(struct Sprite *sprite) { SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); + if (gBattleAnimArgs[2]) + SetAverageBattlerPositions(gBattleAnimTarget, FALSE, &sprite->pos1.x, &sprite->pos1.y); + + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) + sprite->pos1.x -= gBattleAnimArgs[0]; + else + sprite->pos1.x += gBattleAnimArgs[0]; + + sprite->pos1.y += gBattleAnimArgs[1]; sprite->data[0] = 16; sprite->callback = AnimSpiderWeb_Step; } @@ -412,7 +420,7 @@ static void AnimTranslateStinger(struct Sprite *sprite) // arg 3: target y pixel offset // arg 4: duration // arg 5: wave amplitude -static void AnimMissileArc(struct Sprite *sprite) +void AnimMissileArc(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, 1); @@ -429,7 +437,7 @@ static void AnimMissileArc(struct Sprite *sprite) sprite->invisible = TRUE; } -static void AnimMissileArc_Step(struct Sprite *sprite) +void AnimMissileArc_Step(struct Sprite *sprite) { sprite->invisible = FALSE; diff --git a/src/battle_anim_dark.c b/src/battle_anim_dark.c index 7253b52472..8f93438e84 100644 --- a/src/battle_anim_dark.c +++ b/src/battle_anim_dark.c @@ -10,9 +10,6 @@ #include "constants/rgb.h" static void sub_81138D4(struct Sprite *); -static void AnimBite(struct Sprite *); -static void AnimTearDrop(struct Sprite *); -static void AnimClawSlash(struct Sprite *); static void AnimTask_AttackerFadeToInvisible_Step(u8); static void AnimTask_AttackerFadeFromInvisible_Step(u8); static void sub_8113950(struct Sprite *); @@ -23,6 +20,7 @@ static void AnimTask_MoveAttackerMementoShadow_Step(u8); static void AnimTask_MoveTargetMementoShadow_Step(u8); static void sub_8114244(struct Task *); static void sub_8114374(u8); +static void AnimPunishment(struct Sprite *sprite); static void AnimTask_MetallicShine_Step(u8); // Unused @@ -133,7 +131,7 @@ static const union AffineAnimCmd sAffineAnim_TearDrop_1[] = AFFINEANIMCMD_END, }; -static const union AffineAnimCmd *const sAffineAnims_TearDrop[] = +const union AffineAnimCmd *const gAffineAnims_TearDrop[] = { sAffineAnim_TearDrop_0, sAffineAnim_TearDrop_1, @@ -146,7 +144,7 @@ const struct SpriteTemplate gTearDropSpriteTemplate = .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_TearDrop, + .affineAnims = gAffineAnims_TearDrop, .callback = AnimTearDrop, }; @@ -170,7 +168,7 @@ static const union AnimCmd sAnim_ClawSlash_1[] = ANIMCMD_END, }; -static const union AnimCmd *const sAnims_ClawSlash[] = +const union AnimCmd *const gAnims_ClawSlash[] = { sAnim_ClawSlash_0, sAnim_ClawSlash_1, @@ -181,12 +179,96 @@ const struct SpriteTemplate gClawSlashSpriteTemplate = .tileTag = ANIM_TAG_CLAW_SLASH, .paletteTag = ANIM_TAG_CLAW_SLASH, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sAnims_ClawSlash, + .anims = gAnims_ClawSlash, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimClawSlash, }; +const union AffineAnimCmd gPunishmentImpactAffineAnimCmd_1[] = +{ + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gPunishmentImpactAffineAnimCmd_2[] = +{ + AFFINEANIMCMD_FRAME(0xD8, 0xD8, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gPunishmentImpactAffineAnimCmd_3[] = +{ + AFFINEANIMCMD_FRAME(0xB0, 0xB0, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gPunishmentImpactAffineAnimCmd_4[] = +{ + AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd *const gPunishmentImpactAffineAnim[] = +{ + gPunishmentImpactAffineAnimCmd_1, + gPunishmentImpactAffineAnimCmd_2, + gPunishmentImpactAffineAnimCmd_3, + gPunishmentImpactAffineAnimCmd_4, +}; + +const union AnimCmd gPunishmentAnimCmd[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(16, 4), + ANIMCMD_FRAME(32, 4), + ANIMCMD_FRAME(48, 4), + ANIMCMD_FRAME(64, 4), + ANIMCMD_END, +}; + +const union AnimCmd *const gPunishmentAnim[] = +{ + gPunishmentAnimCmd, +}; + +const struct SpriteTemplate gPunishmentSpriteTemplate = +{ + .tileTag = ANIM_TAG_SCRATCH, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gPunishmentAnim, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSpriteOnMonPos, +}; + +const struct SpriteTemplate gPunishmentImpactSpriteTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gPunishmentImpactAffineAnim, + .callback = AnimPunishment, +}; + +static void AnimPunishment(struct Sprite *sprite) +{ + StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]); + if (gBattleAnimArgs[2] == 0) + InitSpritePosToAnimAttacker(sprite, 1); + else + InitSpritePosToAnimTarget(sprite, TRUE); + + sprite->callback = RunStoredCallbackWhenAffineAnimEnds; + StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); +} + void AnimTask_AttackerFadeToInvisible(u8 taskId) { int battler; @@ -312,7 +394,7 @@ static void sub_8113950(struct Sprite *sprite) } // Move sprite inward for Bite/Crunch and Clamp -static void AnimBite(struct Sprite *sprite) +void AnimBite(struct Sprite *sprite) { sprite->pos1.x += gBattleAnimArgs[0]; sprite->pos1.y += gBattleAnimArgs[1]; @@ -344,7 +426,7 @@ static void AnimBite_Step2(struct Sprite *sprite) } // Launches a tear drop away from the battler. Used by Fake Tears -static void AnimTearDrop(struct Sprite *sprite) +void AnimTearDrop(struct Sprite *sprite) { u8 battler; s8 xOffset; @@ -796,7 +878,7 @@ void sub_8114470(u8 taskId) } // Animates a deep slash from a claw. Used by Metal Claw, Dragon Claw, and Crush Claw -static void AnimClawSlash(struct Sprite *sprite) +void AnimClawSlash(struct Sprite *sprite) { sprite->pos1.x += gBattleAnimArgs[0]; sprite->pos1.y += gBattleAnimArgs[1]; diff --git a/src/battle_anim_dragon.c b/src/battle_anim_dragon.c index 1d426cac72..406902d71d 100644 --- a/src/battle_anim_dragon.c +++ b/src/battle_anim_dragon.c @@ -6,14 +6,13 @@ #include "constants/rgb.h" static void AnimOutrageFlame(struct Sprite *); -static void AnimDragonRageFirePlume(struct Sprite *); -static void AnimDragonFireToTarget(struct Sprite *); -static void AnimDragonDanceOrb(struct Sprite *); static void AnimDragonDanceOrb_Step(struct Sprite *); -static void AnimOverheatFlame(struct Sprite *); static void AnimOverheatFlame_Step(struct Sprite *); static void AnimTask_DragonDanceWaver_Step(u8); static void sub_8113574(struct Task *); +static void AnimDragonRushStep(struct Sprite *sprite); +static void AnimSpinningDracoMeteor(struct Sprite *sprite); +static void AnimSpinningDracoMeteorFinish(struct Sprite *sprite); EWRAM_DATA static u16 gUnknown_0203A100[7] = {0}; @@ -59,7 +58,7 @@ static const union AnimCmd sAnim_DragonBreathFire_1[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sAnims_DragonBreathFire[] = +const union AnimCmd *const gAnims_DragonBreathFire[] = { sAnim_DragonBreathFire_0, sAnim_DragonBreathFire_1, @@ -79,7 +78,7 @@ static const union AffineAnimCmd sAffineAnim_DragonBreathFire_1[] = AFFINEANIMCMD_END, }; -static const union AffineAnimCmd *const sAffineAnims_DragonBreathFire[] = +const union AffineAnimCmd *const gAffineAnims_DragonBreathFire[] = { sAffineAnim_DragonBreathFire_0, sAffineAnim_DragonBreathFire_1, @@ -90,9 +89,9 @@ const struct SpriteTemplate gDragonBreathFireSpriteTemplate = .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineDouble_ObjNormal_32x32, - .anims = sAnims_DragonBreathFire, + .anims = gAnims_DragonBreathFire, .images = NULL, - .affineAnims = sAffineAnims_DragonBreathFire, + .affineAnims = gAffineAnims_DragonBreathFire, .callback = AnimDragonFireToTarget, }; @@ -106,7 +105,7 @@ static const union AnimCmd sAnim_DragonRageFirePlume[] = ANIMCMD_END, }; -static const union AnimCmd *const sAnims_DragonRageFirePlume[] = +const union AnimCmd *const gAnims_DragonRageFirePlume[] = { sAnim_DragonRageFirePlume, }; @@ -116,7 +115,7 @@ const struct SpriteTemplate gDragonRageFirePlumeSpriteTemplate = .tileTag = ANIM_TAG_FIRE_PLUME, .paletteTag = ANIM_TAG_FIRE_PLUME, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sAnims_DragonRageFirePlume, + .anims = gAnims_DragonRageFirePlume, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimDragonRageFirePlume, @@ -130,7 +129,7 @@ static const union AnimCmd sAnim_DragonRageFire[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sAnims_DragonRageFire[] = +const union AnimCmd *const gAnims_DragonRageFire[] = { sAnim_DragonRageFire, sAnim_DragonRageFire, @@ -148,7 +147,7 @@ static const union AffineAnimCmd sAffineAnim_DragonRageFire_1[] = AFFINEANIMCMD_END, }; -static const union AffineAnimCmd *const sAffineAnims_DragonRageFire[] = +const union AffineAnimCmd *const gAffineAnims_DragonRageFire[] = { sAffineAnim_DragonRageFire_0, sAffineAnim_DragonRageFire_1, @@ -159,9 +158,9 @@ const struct SpriteTemplate gDragonRageFireSpitSpriteTemplate = .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineDouble_ObjNormal_32x32, - .anims = sAnims_DragonRageFire, + .anims = gAnims_DragonRageFire, .images = NULL, - .affineAnims = sAffineAnims_DragonRageFire, + .affineAnims = gAffineAnims_DragonRageFire, .callback = AnimDragonFireToTarget, }; @@ -187,6 +186,136 @@ const struct SpriteTemplate gOverheatFlameSpriteTemplate = .callback = AnimOverheatFlame, }; +const union AnimCmd gDragonRushAnimCmds[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(64, 4), + ANIMCMD_END, +}; + +const union AnimCmd *const gDragonRushAnimTable[] = +{ + gDragonRushAnimCmds, +}; + +const union AffineAnimCmd gDragonRushAffineanimCmds1[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, -4, 8), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gDragonRushAffineanimCmds2[] = +{ + AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, 4, 8), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd *const gDragonRushAffineAnimTable[] = +{ + gDragonRushAffineanimCmds1, + gDragonRushAffineanimCmds2, +}; + +const union AnimCmd gDracoMeteorAnimTable[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +const union AnimCmd *const gDracoMeteorAnimCmd[] = +{ + gDracoMeteorAnimTable, +}; + +const union AffineAnimCmd gDracoMeteorAffineAnimCmd[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(0xFFF8, 0xFFF8, 20, 1), + AFFINEANIMCMD_JUMP(1), +}; + +const union AffineAnimCmd *const gDracoMeteorAffineAnims[] = +{ + gDracoMeteorAffineAnimCmd, +}; + +const struct SpriteTemplate gDragonRushSpriteTemplate = +{ + .tileTag = ANIM_TAG_SLAM_HIT_2, + .paletteTag = ANIM_TAG_RED_HEART, + .oam = &gOamData_AffineNormal_ObjNormal_64x64, + .anims = gDragonRushAnimTable, + .images = NULL, + .affineAnims = gDragonRushAffineAnimTable, + .callback = AnimDragonRushStep, +}; + +const struct SpriteTemplate gDracoMetorSpriteTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_IMPACT, + .oam = &gOamData_AffineDouble_ObjNormal_32x32, + .anims = gDracoMeteorAnimCmd, + .images = NULL, + .affineAnims = gDracoMeteorAffineAnims, + .callback = AnimSpinningDracoMeteor, +}; + +const struct SpriteTemplate gDragonPulseSpriteTemplate = +{ + .tileTag = ANIM_TAG_DRAGON_PULSE, + .paletteTag = ANIM_TAG_DRAGON_PULSE, + .oam = &gOamData_AffineOff_ObjNormal_16x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = TranslateAnimSpriteToTargetMonLocation, +}; + +static void AnimDragonRushStep(struct Sprite *sprite) +{ + // These two cases are identical. + if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) + { + sprite->data[1] += sprite->data[0]; + sprite->data[1] &= 0xFF; + } + else + { + sprite->data[1] += sprite->data[0]; + sprite->data[1] &= 0xFF; + } + + sprite->pos2.x = Cos(sprite->data[1], 20); + sprite->pos2.y = Sin(sprite->data[1], 20); + if (sprite->animEnded) + DestroyAnimSprite(sprite); + + sprite->data[2]++; +} + +static void AnimSpinningDracoMeteorFinish(struct Sprite *sprite) +{ + StartSpriteAffineAnim(sprite, 0); + sprite->affineAnimPaused = 1; + sprite->data[0] = 20; + + sprite->callback = WaitAnimForDuration; + StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); +} + +static void AnimSpinningDracoMeteor(struct Sprite *sprite) +{ + InitSpritePosToAnimTarget(sprite, TRUE); + StartSpriteAnim(sprite, gBattleAnimArgs[2]); + sprite->data[0] = gBattleAnimArgs[3]; + + sprite->callback = WaitAnimForDuration; + StoreSpriteCallbackInData6(sprite, AnimSpinningDracoMeteorFinish); +} + static void AnimOutrageFlame(struct Sprite *sprite) { sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); @@ -238,7 +367,7 @@ static void sub_8113100(struct Sprite *sprite) StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); } -static void AnimDragonRageFirePlume(struct Sprite *sprite) +void AnimDragonRageFirePlume(struct Sprite *sprite) { if (gBattleAnimArgs[0] == 0) { @@ -258,7 +387,7 @@ static void AnimDragonRageFirePlume(struct Sprite *sprite) } // For Dragon Breath and Dragon Rage -static void AnimDragonFireToTarget(struct Sprite *sprite) +void AnimDragonFireToTarget(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) StartSpriteAffineAnim(sprite, 1); @@ -266,7 +395,7 @@ static void AnimDragonFireToTarget(struct Sprite *sprite) sub_8113100(sprite); } -static void AnimDragonDanceOrb(struct Sprite *sprite) +void AnimDragonDanceOrb(struct Sprite *sprite) { u16 r5; u16 r0; @@ -413,7 +542,7 @@ static void sub_8113574(struct Task *task) task->data[5] = (task->data[5] + 9) & 0xFF; } -static void AnimOverheatFlame(struct Sprite *sprite) +void AnimOverheatFlame(struct Sprite *sprite) { int r6 = (gBattleAnimArgs[2] * 3) / 5; int i; diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index c8d43e12e0..0efa863fd4 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -15,24 +15,17 @@ #include "util.h" #include "constants/rgb.h" #include "constants/songs.h" +#include "constants/moves.h" EWRAM_DATA s16 gUnknown_0203A0F8[4] = {0}; -static void AnimMovePowderParticle(struct Sprite *); static void AnimMovePowderParticle_Step(struct Sprite *); -static void AnimPowerAbsorptionOrb(struct Sprite *); -static void AnimSolarbeamBigOrb(struct Sprite *); static void AnimSolarbeamSmallOrb(struct Sprite *); static void AnimSolarbeamSmallOrb_Step(struct Sprite *); -static void AnimAbsorptionOrb(struct Sprite *); static void AnimAbsorptionOrb_Step(struct Sprite *); -static void AnimHyperBeamOrb(struct Sprite *); static void AnimHyperBeamOrb_Step(struct Sprite *); -static void AnimSporeParticle(struct Sprite *); static void AnimSporeParticle_Step(struct Sprite *); -static void AnimPetalDanceBigFlower(struct Sprite *); static void AnimPetalDanceBigFlower_Step(struct Sprite *); -static void AnimPetalDanceSmallFlower(struct Sprite *); static void AnimPetalDanceSmallFlower_Step(struct Sprite *); static void AnimRazorLeafParticle(struct Sprite *); static void AnimRazorLeafParticle_Step1(struct Sprite *); @@ -40,12 +33,10 @@ static void AnimRazorLeafParticle_Step2(struct Sprite *); static void AnimLeechSeed(struct Sprite *); static void AnimLeechSeed_Step(struct Sprite *); static void AnimLeechSeedSprouts(struct Sprite *); -static void AnimTranslateLinearSingleSineWave(struct Sprite *); static void AnimTranslateLinearSingleSineWave_Step(struct Sprite *); static void AnimConstrictBinding(struct Sprite *); static void AnimConstrictBinding_Step1(struct Sprite *); static void AnimConstrictBinding_Step2(struct Sprite *); -static void AnimMimicOrb(struct Sprite *); static void AnimIngrainRoot(struct Sprite *); static void AnimFrenzyPlantRoot(struct Sprite *); static void AnimRootFlickerOut(struct Sprite *); @@ -63,12 +54,9 @@ static void AnimTrickBag_Step2(struct Sprite *); static void AnimTrickBag_Step3(struct Sprite *); static void AnimFlyingParticle(struct Sprite *); static void AnimFlyingParticle_Step(struct Sprite *); -static void AnimNeedleArmSpike(struct Sprite *); -static void AnimNeedleArmSpike_Step(struct Sprite *); static void sub_81009F8(struct Sprite *); static void AnimWhipHit(struct Sprite *); static void sub_8100A94(struct Sprite *); -static void AnimCuttingSlice(struct Sprite *); static void AnimAirCutterSlice(struct Sprite *); static void AnimSlice_Step(struct Sprite *); static void sub_8100E1C(struct Sprite *); @@ -78,7 +66,6 @@ static void AnimProtect_Step(struct Sprite *); static void AnimMilkBottle(struct Sprite *); static void AnimMilkBottle_Step1(struct Sprite *); static void AnimMilkBottle_Step2(struct Sprite *, int, int); -static void AnimGrantingStars(struct Sprite *); static void AnimSparkingStars(struct Sprite *); static void sub_8101440(struct Sprite *); static void sub_81014A0(struct Sprite *); @@ -107,11 +94,9 @@ static void AnimFalseSwipeSlice_Step1(struct Sprite *); static void AnimFalseSwipeSlice_Step2(struct Sprite *); static void AnimFalseSwipeSlice_Step3(struct Sprite *); static void AnimFalseSwipePositionedSlice(struct Sprite *); -static void AnimEndureEnergy(struct Sprite *); static void AnimEndureEnergy_Step(struct Sprite *); static void AnimSharpenSphere(struct Sprite *); static void AnimSharpenSphere_Step(struct Sprite *); -static void AnimConversion(struct Sprite *); static void AnimConversion2(struct Sprite *); static void AnimConversion2_Step(struct Sprite *); static void AnimMoon(struct Sprite *); @@ -129,11 +114,8 @@ static void AnimFlyingMusicNotes_Step(struct Sprite *); static void AnimBellyDrumHand(struct Sprite *); static void AnimSlowFlyingMusicNotes(struct Sprite *); static void AnimSlowFlyingMusicNotes_Step(struct Sprite *); -static void AnimThoughtBubble(struct Sprite *); static void AnimThoughtBubble_Step(struct Sprite *); -static void AnimMetronomeFinger(struct Sprite *); static void AnimMetronomeFinger_Step(struct Sprite *); -static void AnimFollowMeFinger(struct Sprite *); static void AnimFollowMeFinger_Step1(struct Sprite *); static void AnimFollowMeFinger_Step2(struct Sprite *); static void AnimTauntFinger(struct Sprite *); @@ -149,8 +131,26 @@ static void AnimTask_LeafBlade_Step2(struct Task *, u8); static void AnimTask_LeafBlade_Step2_Callback(struct Sprite *); static void AnimTask_SkullBashPositionSet(u8); static void AnimTask_SkullBashPositionReset(u8); +static void AnimMoveFeintSwipe(struct Sprite *); +static void AnimMoveFeintZoom(struct Sprite *); +static void AnimMoveTrumpCard(struct Sprite *); +static void AnimMoveTrumpCardParticle(struct Sprite* sprite); +static void AnimMoveAccupressure(struct Sprite* sprite); +static void AnimMoveWringOut(struct Sprite* sprite); +static void AnimMoveWorrySeed(struct Sprite* sprite); +static void AnimMoveSmallCloud(struct Sprite* sprite); +static void AnimGrassKnotStep(struct Sprite *sprite); +static void AnimGrassKnot(struct Sprite *sprite); +static void AnimWoodHammerSmall(struct Sprite *sprite); +static void AnimWoodHammerBig(struct Sprite *sprite); static void AnimTask_DoubleTeam_Step(u8); static void AnimDoubleTeam(struct Sprite *); +static void AnimNightSlash(struct Sprite *sprite); +static void AnimRockPolishStreak(struct Sprite *sprite); +static void AnimRockPolishSparkle(struct Sprite *sprite); +static void AnimPoisonJabProjectile(struct Sprite *sprite); +static void AnimNightSlash(struct Sprite *sprite); +static void AnimPluck(struct Sprite* sprite); const union AnimCmd gPowderParticlesAnimCmds[] = { @@ -170,6 +170,251 @@ const union AnimCmd *const gPowderParticlesAnimTable[] = gPowderParticlesAnimCmds, }; +static const union AffineAnimCmd sFeintAffineSwipe[] = { AFFINEANIMCMD_END }; +static const union AffineAnimCmd sFeintAffineZoom[] = +{ + AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0), + AFFINEANIMCMD_FRAME(-30, -30, 0, 10), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sTrumpCardAffine0[] = +{ + AFFINEANIMCMD_FRAME(0xC0, 0xC0, 30, 0), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sTrumpCardAffine1[] = +{ + AFFINEANIMCMD_FRAME(0xA0, 0xA0, 40, 0), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sTrumpCardAffine2[] = +{ + AFFINEANIMCMD_FRAME(0xD0, 0xD0, -20, 0), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sTrumpCardAffine3[] = +{ + AFFINEANIMCMD_FRAME(0xE0, 0xE0, 40, 0), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sTrumpCardAffine4[] = +{ + AFFINEANIMCMD_FRAME(0xF0, 0xF0, 60, 0), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd * const sTrumpCardAffineAnims[] = +{ + sTrumpCardAffine0, + sTrumpCardAffine1, + sTrumpCardAffine2, + sTrumpCardAffine3, + sTrumpCardAffine4 +}; + +static const union AffineAnimCmd * const sFeintAffineAnims[] = +{ + sFeintAffineZoom, +}; + +static const union AnimCmd sTrumpCardFrame0[] = +{ + ANIMCMD_FRAME(0, 0), + ANIMCMD_END +}; + +static const union AnimCmd sTrumpCardFrame1[] = +{ + ANIMCMD_FRAME(4, 0), + ANIMCMD_END +}; + +static const union AnimCmd sTrumpCardFrame2[] = +{ + ANIMCMD_FRAME(8, 0), + ANIMCMD_END +}; + +static const union AnimCmd sTrumpCardParticleFrame0[] = +{ + ANIMCMD_FRAME(0, 0), + ANIMCMD_END +}; + +static const union AnimCmd sTrumpCardParticleFrame1[] = +{ + ANIMCMD_FRAME(1, 0), + ANIMCMD_END +}; + +static const union AnimCmd sTrumpCardParticleFrame2[] = +{ + ANIMCMD_FRAME(2, 0), + ANIMCMD_END +}; + +static const union AnimCmd * const sTrumpCardAnims[] = +{ + sTrumpCardFrame0, + sTrumpCardFrame1, + sTrumpCardFrame2 +}; + +static const union AnimCmd * const sTrumpCardParticleAnims[] = +{ + sTrumpCardParticleFrame0, + sTrumpCardParticleFrame1, + sTrumpCardParticleFrame2, +}; + +static const union AffineAnimCmd sAccupressureTurn[] = +{ + AFFINEANIMCMD_FRAME(0, 0, 1, 20), + AFFINEANIMCMD_FRAME(0, 0, -1, 40), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sAccupressureStill[] = +{ + AFFINEANIMCMD_FRAME(256, 256, 0, 0), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd * const sAccupressureAffineAnims[] = +{ + sAccupressureStill, + sAccupressureTurn +}; + +static const union AffineAnimCmd sSmallCloundsInit[] = +{ + AFFINEANIMCMD_FRAME(0x100,0x100, 0, 0), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSmallCloudsVariant0[] = +{ + AFFINEANIMCMD_FRAME(0x100,0x100, 0, 0), + AFFINEANIMCMD_FRAME(-10, -10, 0, 15), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sSmallCloudsVariant1[] = +{ + AFFINEANIMCMD_FRAME(0x180,0x180, 0, 0), + AFFINEANIMCMD_FRAME(-18, -18, 0, 21), + AFFINEANIMCMD_END +}; + + +static const union AffineAnimCmd sSmallCloudsVariant2[] = +{ + AFFINEANIMCMD_FRAME(0xC0, 0xC0, 0, 0), + AFFINEANIMCMD_FRAME(-6, -6, 0, 15), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd * const sSmallCloudSpriteAffineAnimTable[] = +{ + sSmallCloundsInit, + sSmallCloudsVariant0, + sSmallCloudsVariant1, + sSmallCloudsVariant2, +}; + +const struct SpriteTemplate gWorrySeedSpriteTemplate = +{ + .tileTag = ANIM_TAG_WORRY_SEED, + .paletteTag = ANIM_TAG_WORRY_SEED, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMoveWorrySeed +}; + +const struct SpriteTemplate gSmallCloudTemplate = +{ + .tileTag = ANIM_TAG_SMALL_CLOUD, + .paletteTag = ANIM_TAG_SMALL_CLOUD, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = sSmallCloudSpriteAffineAnimTable, + .callback = AnimMoveSmallCloud +}; + +const struct SpriteTemplate gAccupressureSpriteTemplate = +{ + .tileTag = ANIM_TAG_ACCUPRESSURE, + .paletteTag = ANIM_TAG_ACCUPRESSURE, + .oam = &gOamData_AffineDouble_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = sAccupressureAffineAnims, + .callback = AnimMoveAccupressure, +}; + +const struct SpriteTemplate gWringOutHandSpriteTemplate = +{ + .tileTag = ANIM_TAG_WRING_OUT, + .paletteTag = ANIM_TAG_WRING_OUT, + .oam = &gOamData_AffineDouble_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMoveWringOut, +}; + +const struct SpriteTemplate gTrumpCardParticleSpriteTempalte = +{ + .tileTag = ANIM_TAG_TRUMP_CARD_PARTICLES, + .paletteTag = ANIM_TAG_TRUMP_CARD_PARTICLES, + .oam = &gOamData_AffineDouble_ObjNormal_8x8, + .anims = sTrumpCardParticleAnims, + .images = NULL, + .affineAnims = sTrumpCardAffineAnims, + .callback = AnimMoveTrumpCardParticle +}; + +const struct SpriteTemplate gTrumpCardSpriteTemplate = +{ + .tileTag = ANIM_TAG_TRUMP_CARD, + .paletteTag = ANIM_TAG_TRUMP_CARD, + .oam = &gOamData_AffineDouble_ObjNormal_16x16, + .anims = sTrumpCardAnims, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMoveTrumpCard +}; + +const struct SpriteTemplate gFeintSwipeSpriteTemplate = +{ + .tileTag = ANIM_TAG_FEINT, + .paletteTag = ANIM_TAG_FEINT, + .oam = &gOamData_AffineNormal_ObjNormal_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMoveFeintSwipe, +}; + +const struct SpriteTemplate gFeintZoomSpriteTemplate = +{ + .tileTag = ANIM_TAG_FEINT, + .paletteTag = ANIM_TAG_FEINT, + .oam = &gOamData_AffineNormal_ObjNormal_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = sFeintAffineAnims, + .callback = AnimMoveFeintZoom, +}; + const struct SpriteTemplate gSleepPowderParticleSpriteTemplate = { .tileTag = ANIM_TAG_SLEEP_POWDER, @@ -402,6 +647,17 @@ const struct SpriteTemplate gLeechSeedSpriteTemplate = .callback = AnimLeechSeed, }; +const struct SpriteTemplate gPluckParticleSpriteTemplate = +{ + .tileTag = ANIM_TAG_SEED_BROWN, + .paletteTag = ANIM_TAG_SEED_BROWN, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimPluck, +}; + const union AnimCmd gSporeParticleAnimCmds1[] = { ANIMCMD_FRAME(0, 1), @@ -504,6 +760,8 @@ const union AnimCmd *const gRazorLeafParticleAnimTable[] = gRazorLeafParticleAnimCmds2, }; +void AnimFlyUpTarget(struct Sprite *sprite); + const struct SpriteTemplate gRazorLeafParticleSpriteTemplate = { .tileTag = ANIM_TAG_LEAF, @@ -515,6 +773,17 @@ const struct SpriteTemplate gRazorLeafParticleSpriteTemplate = .callback = AnimRazorLeafParticle, }; +const struct SpriteTemplate gGrassPledgeSpriteTemplate = +{ + .tileTag = ANIM_TAG_LEAF, + .paletteTag = ANIM_TAG_LEAF, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gRazorLeafParticleAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFlyUpTarget, +}; + const struct SpriteTemplate gTwisterLeafSpriteTemplate = { .tileTag = ANIM_TAG_LEAF, @@ -526,6 +795,17 @@ const struct SpriteTemplate gTwisterLeafSpriteTemplate = .callback = AnimMoveTwisterParticle, }; +const struct SpriteTemplate gAttackOrderParticleSpriteTemplate = +{ + .tileTag = ANIM_TAG_ATTACK_ORDER, + .paletteTag = ANIM_TAG_ATTACK_ORDER, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gRazorLeafParticleAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMoveTwisterParticle, +}; + const union AnimCmd gRazorLeafCutterAnimCmds[] = { ANIMCMD_FRAME(0, 3), @@ -2183,6 +2463,494 @@ const struct SpriteTemplate gTauntFingerSpriteTemplate = .callback = AnimTauntFinger, }; +const struct SpriteTemplate gPowerOrbs_Float = +{ + .tileTag = ANIM_TAG_RED_ORB, + .paletteTag = ANIM_TAG_RED_ORB, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gSporeParticleAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSporeParticle, +}; + +const union AnimCmd gRockPolishStreak_AnimCmd[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(4, 2), + ANIMCMD_FRAME(8, 3), + ANIMCMD_FRAME(12, 15), + ANIMCMD_FRAME(8, 3), + ANIMCMD_FRAME(4, 2), + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +const union AnimCmd *const gRockPolishStreak_AnimCmds[] = +{ + gRockPolishStreak_AnimCmd, +}; + +const union AffineAnimCmd gRockPolishStreak_AffineAnimCmd0[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0x0, 0), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gRockPolishStreak_AffineAnimCmd1[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0x10, 0), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gRockPolishStreak_AffineAnimCmd2[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0x20, 0), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gRockPolishStreak_AffineAnimCmd3[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0x30, 0), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gRockPolishStreak_AffineAnimCmd4[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0x40, 0), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gRockPolishStreak_AffineAnimCmd5[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0x50, 0), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gRockPolishStreak_AffineAnimCmd6[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0x60, 0), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gRockPolishStreak_AffineAnimCmd7[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0x70, 0), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gRockPolishStreak_AffineAnimCmd8[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0x80, 0), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gRockPolishStreak_AffineAnimCmd9[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0x90, 0), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gRockPolishStreak_AffineAnimCmdA[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0xA0, 0), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gRockPolishStreak_AffineAnimCmdB[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0xB0, 0), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gRockPolishStreak_AffineAnimCmdC[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0xC0, 0), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gRockPolishStreak_AffineAnimCmdD[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0xD0, 0), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gRockPolishStreak_AffineAnimCmdE[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0xE0, 0), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gRockPolishStreak_AffineAnimCmdF[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0xF0, 0), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd *const gRockPolishStreak_AffineAnimCmds[] = +{ + gRockPolishStreak_AffineAnimCmd0, + gRockPolishStreak_AffineAnimCmd1, + gRockPolishStreak_AffineAnimCmd2, + gRockPolishStreak_AffineAnimCmd3, + gRockPolishStreak_AffineAnimCmd4, + gRockPolishStreak_AffineAnimCmd5, + gRockPolishStreak_AffineAnimCmd6, + gRockPolishStreak_AffineAnimCmd7, + gRockPolishStreak_AffineAnimCmd8, + gRockPolishStreak_AffineAnimCmd9, + gRockPolishStreak_AffineAnimCmdA, + gRockPolishStreak_AffineAnimCmdB, + gRockPolishStreak_AffineAnimCmdC, + gRockPolishStreak_AffineAnimCmdD, + gRockPolishStreak_AffineAnimCmdE, + gRockPolishStreak_AffineAnimCmdF, +}; + +const struct SpriteTemplate gRockPolishStreakSpriteTemplate = +{ + .tileTag = ANIM_TAG_WHITE_STREAK, + .paletteTag = ANIM_TAG_WHITE_STREAK, + .oam = &gOamData_AffineDouble_ObjBlend_32x8, + .anims = gRockPolishStreak_AnimCmds, + .images = NULL, + .affineAnims = gRockPolishStreak_AffineAnimCmds, + .callback = AnimRockPolishStreak, +}; + +const union AnimCmd gRockPolishSparkle_AnimCmd1[] = +{ + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(4, 7), + ANIMCMD_FRAME(8, 7), + ANIMCMD_FRAME(12, 7), + ANIMCMD_END, +}; + +const union AnimCmd *const gRockPolishSparkle_AnimCmds[] = +{ + gRockPolishSparkle_AnimCmd1, +}; + +const struct SpriteTemplate gRockPolishSparkleSpriteTemplate = +{ + .tileTag = ANIM_TAG_SPARKLE_3, + .paletteTag = ANIM_TAG_SPARKLE_3, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gRockPolishSparkle_AnimCmds, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimRockPolishSparkle, +}; + +const struct SpriteTemplate gPoisonJabProjectileSpriteTemplate = +{ + .tileTag = ANIM_TAG_PURPLE_JAB, + .paletteTag = ANIM_TAG_PURPLE_JAB, + .oam = &gOamData_AffineDouble_ObjBlend_32x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimPoisonJabProjectile, +}; + +const union AnimCmd gNightSlashLeftAnimCmd0[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(16, 4), + ANIMCMD_FRAME(32, 4), + ANIMCMD_FRAME(48, 4), + ANIMCMD_END, +}; + +const union AnimCmd gNightSlashLeftAnimCmd1[] = +{ + ANIMCMD_FRAME(48, 4), + ANIMCMD_END, +}; + +const union AnimCmd *const gNightSlashLeftAnimTable[] = +{ + gNightSlashLeftAnimCmd0, + gNightSlashLeftAnimCmd1, +}; + +const struct SpriteTemplate gNightSlashLeftSpriteTemplate = +{ + .tileTag = ANIM_TAG_SLASH, + .paletteTag = ANIM_TAG_SLASH, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gNightSlashLeftAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimNightSlash, +}; + +const union AnimCmd gNightSlashRightAnimCmd0[] = +{ + ANIMCMD_FRAME(0, 4, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(16, 4, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(32, 4, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(48, 4, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_END, +}; + +const union AnimCmd gNightSlashRightAnimCmd1[] = +{ + ANIMCMD_FRAME(48, 4, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_END, +}; + +const union AnimCmd *const gNightSlashRightAnimTable[] = +{ + gNightSlashRightAnimCmd0, + gNightSlashRightAnimCmd1, +}; + +const struct SpriteTemplate gNightSlashRightSpriteTemplate = +{ + .tileTag = ANIM_TAG_SLASH, + .paletteTag = ANIM_TAG_SLASH, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gNightSlashRightAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimNightSlash, +}; + +const struct SpriteTemplate gLuckyChantBigStarsSpriteTemplate = +{ + .tileTag = ANIM_TAG_GOLD_STARS, + .paletteTag = ANIM_TAG_GOLD_STARS, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gPetalDanceBigFlowerAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimPetalDanceBigFlower, +}; + +const struct SpriteTemplate gLuckyChantSmallStarsSpriteTemplate = +{ + .tileTag = ANIM_TAG_GOLD_STARS, + .paletteTag = ANIM_TAG_GOLD_STARS, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = gPetalDanceSmallFlowerAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimPetalDanceSmallFlower, +}; + +const union AnimCmd gWoodHammerBigAnimCmd_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +const union AnimCmd gWoodHammerBigAnimCmd_2[] = +{ + ANIMCMD_FRAME(16, 1), + ANIMCMD_END, +}; + +const union AnimCmd *const gWoodHammerBigAnims[] = +{ + gWoodHammerBigAnimCmd_1, + gWoodHammerBigAnimCmd_2, +}; + +const union AffineAnimCmd gWoodHammerBigAffineAnimCmd_1[] = +{ + AFFINEANIMCMD_FRAME(0x0, 0x0, -5, 5), + AFFINEANIMCMD_JUMP(0), +}; + +const union AffineAnimCmd gWoodHammerBigAffineAnimCmd_2[] = +{ + AFFINEANIMCMD_FRAME(0x0, 0x0, 5, 5), + AFFINEANIMCMD_JUMP(0), +}; + +const union AffineAnimCmd *const gWoodHammerBigAffineAnims[] = +{ + gWoodHammerBigAffineAnimCmd_1, + gWoodHammerBigAffineAnimCmd_2, +}; + +const union AnimCmd gWoodHammerSmallAnimCmd_1[] = +{ + ANIMCMD_FRAME(32, 1), + ANIMCMD_END, +}; + +const union AnimCmd gWoodHammerSmallAnimCmd_2[] = +{ + ANIMCMD_FRAME(48, 1), + ANIMCMD_END, +}; + +const union AnimCmd gWoodHammerSmallAnimCmd_3[] = +{ + ANIMCMD_FRAME(64, 1), + ANIMCMD_END, +}; + +const union AnimCmd *const gWoodHammerSmallAnims[] = +{ + gWoodHammerSmallAnimCmd_1, + gWoodHammerSmallAnimCmd_2, + gWoodHammerSmallAnimCmd_3, +}; + +const struct SpriteTemplate gGrassKnotSpriteTemplate = +{ + .tileTag = ANIM_TAG_RAZOR_LEAF, + .paletteTag = ANIM_TAG_RAZOR_LEAF, + .oam = &gOamData_AffineOff_ObjNormal_32x16, + .anims = gRazorLeafCutterAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimGrassKnot, +}; + +const struct SpriteTemplate gWoodHammerBigSpriteTemplate = +{ + .tileTag = ANIM_TAG_WOOD_HAMMER, + .paletteTag = ANIM_TAG_WOOD_HAMMER, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gWoodHammerBigAnims, + .images = NULL, + .affineAnims = gWoodHammerBigAffineAnims, + .callback = AnimWoodHammerBig, +}; + +const struct SpriteTemplate gWoodHammerSmallSpriteTemplate = +{ + .tileTag = ANIM_TAG_WOOD_HAMMER, + .paletteTag = ANIM_TAG_WOOD_HAMMER, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gWoodHammerSmallAnims, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimWoodHammerSmall, +}; + +const struct SpriteTemplate gJudgmentGrayOutwardSpikesTemplate = +{ + .tileTag = ANIM_TAG_GREEN_SPIKE, + .paletteTag = ANIM_TAG_GUST, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimNeedleArmSpike +}; + +const struct SpriteTemplate gJudgmentGrayInwardOrbsTemplate = +{ + .tileTag = ANIM_TAG_ORBS, + .paletteTag = ANIM_TAG_HANDS_AND_FEET, + .oam = &gOamData_AffineNormal_ObjBlend_16x16, + .anims = gPowerAbsorptionOrbAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimNeedleArmSpike +}; + +const struct SpriteTemplate gDarkVoidPurpleStarsTemplate = +{ + .tileTag = ANIM_TAG_SPARKLE_2, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gGrantingStarsAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimGrantingStars +}; + +const struct SpriteTemplate gSeedFlareGreenCirclesTemplate = +{ + .tileTag = ANIM_TAG_ORBS, + .paletteTag = ANIM_TAG_RAZOR_LEAF, + .oam = &gOamData_AffineNormal_ObjBlend_16x16, + .anims = gPowerAbsorptionOrbAnimTable, + .images = NULL, + .affineAnims = gPowerAbsorptionOrbAffineAnimTable, + .callback = AnimPowerAbsorptionOrb +}; + +// functions +static void AnimGrassKnot(struct Sprite *sprite) +{ + if (BATTLE_PARTNER(gBattleAnimAttacker) == gBattleAnimTarget && GetBattlerPosition(gBattleAnimTarget) < B_POSITION_PLAYER_RIGHT) + gBattleAnimArgs[0] *= -1; + + InitSpritePosToAnimTarget(sprite, TRUE); + + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + + sprite->data[0] = gBattleAnimArgs[3]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2]; + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = sprite->pos1.y; + + InitAnimLinearTranslation(sprite); + + sprite->data[5] = gBattleAnimArgs[5]; + sprite->data[6] = gBattleAnimArgs[4]; + sprite->data[7] = 0; + + sprite->callback = AnimGrassKnotStep; +} + +static void AnimGrassKnotStep(struct Sprite *sprite) +{ + if (!AnimTranslateLinear(sprite)) + { + sprite->pos2.y += Sin(sprite->data[7] >> 8, sprite->data[5]); + sprite->data[7] += sprite->data[6]; + } + else + { + DestroyAnimSprite(sprite); + } +} + +static void AnimWoodHammerBig(struct Sprite *sprite) +{ + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) + StartSpriteAffineAnim(sprite, 1); + + TranslateAnimSpriteToTargetMonLocation(sprite); +} + +static void AnimWoodHammerSmall(struct Sprite *sprite) +{ + StartSpriteAnim(sprite, gBattleAnimArgs[5]); + AnimateSprite(sprite); + + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + sprite->pos1.x -= gBattleAnimArgs[0]; + else + sprite->pos1.x += gBattleAnimArgs[0]; + + sprite->pos1.y += gBattleAnimArgs[1]; + + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2]; + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[3]; + + InitSpriteDataForLinearTranslation(sprite); + sprite->data[3] = 0; + sprite->data[4] = 0; + + sprite->callback = TranslateSpriteLinearFixedPoint; + StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); +} + // Animates the falling particles that horizontally wave back and forth. // Used by Sleep Powder, Stun Spore, and Poison Powder. // arg 0: initial x pixel offset @@ -2191,7 +2959,7 @@ const struct SpriteTemplate gTauntFingerSpriteTemplate = // arg 3: vertical movement speed (sub-pixel value) // arg 4: wave amplitude // arg 5: wave speed -static void AnimMovePowderParticle(struct Sprite* sprite) +void AnimMovePowderParticle(struct Sprite* sprite) { sprite->pos1.x += gBattleAnimArgs[0]; sprite->pos1.y += gBattleAnimArgs[1]; @@ -2231,7 +2999,7 @@ static void AnimMovePowderParticle_Step(struct Sprite* sprite) // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: duration -static void AnimPowerAbsorptionOrb(struct Sprite* sprite) +void AnimPowerAbsorptionOrb(struct Sprite* sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[2]; @@ -2246,7 +3014,7 @@ static void AnimPowerAbsorptionOrb(struct Sprite* sprite) // arg 1: initial y pixel offset // arg 2: duration // arg 3: sprite anim number -static void AnimSolarbeamBigOrb(struct Sprite* sprite) +void AnimSolarbeamBigOrb(struct Sprite* sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); StartSpriteAnim(sprite, gBattleAnimArgs[3]); @@ -2266,11 +3034,20 @@ static void AnimSolarbeamBigOrb(struct Sprite* sprite) static void AnimSolarbeamSmallOrb(struct Sprite* sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); - sprite->data[0] = gBattleAnimArgs[2]; - sprite->data[1] = sprite->pos1.x; - sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); - sprite->data[3] = sprite->pos1.y; - sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); + + if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gAnimMoveIndex == MOVE_CORE_ENFORCER) + { + CoreEnforcerLoadBeamTarget(sprite); + } + else + { + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); + } + InitAnimLinearTranslation(sprite); sprite->data[5] = gBattleAnimArgs[3]; sprite->callback = AnimSolarbeamSmallOrb_Step; @@ -2321,7 +3098,7 @@ void AnimTask_CreateSmallSolarbeamOrbs(u8 taskId) // arg 1: initial y pixel offset // arg 2: wave amplitude // arg 3: wave period (lower means faster wave) -static void AnimAbsorptionOrb(struct Sprite* sprite) +void AnimAbsorptionOrb(struct Sprite* sprite) { InitSpritePosToAnimTarget(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[3]; @@ -2340,7 +3117,7 @@ static void AnimAbsorptionOrb_Step(struct Sprite* sprite) // Moves an orb in a wave-like fashion towards the target mon. The wave's // properties and the sprite anim are randomly determined. -static void AnimHyperBeamOrb(struct Sprite* sprite) +void AnimHyperBeamOrb(struct Sprite* sprite) { u16 speed; u16 animNum = Random2(); @@ -2385,6 +3162,302 @@ static void AnimHyperBeamOrb_Step(struct Sprite* sprite) } } +static void AnimMoveWorrySeedWait(struct Sprite* sprite) +{ + if (TranslateAnimHorizontalArc(sprite)) + DestroyAnimSprite(sprite); +} + +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: wave period +// arg 3: wave amplitude +static void AnimMoveWorrySeed(struct Sprite* sprite) +{ + InitSpritePosToAnimAttacker(sprite, TRUE); + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y); + + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[5] = gBattleAnimArgs[3]; + InitAnimArcTranslation(sprite); + sprite->callback = AnimMoveWorrySeedWait; +} + +static void AnimMoveSmallCloudAnimate(struct Sprite* sprite) +{ + sprite->pos2.x += sprite->data[0]; + sprite->pos2.y += sprite->data[1]; + + if(sprite->affineAnimEnded) + { + DestroyAnimSprite(sprite); + } + +} +#define ONE_IF_ZERO(x) ((x) > 0 ? (x) : 1) + +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: cloud type animation [0..2] +// arg 3: horizontal velocity +// arg 4: vertical velocity +// arg 5: duration +static void AnimMoveSmallCloud(struct Sprite* sprite) +{ + InitSpritePosToAnimTarget(sprite, TRUE); + sprite->data[0] = gBattleAnimArgs[3]; + sprite->data[1] = gBattleAnimArgs[4]; + sprite->callback = AnimMoveSmallCloudAnimate; + StartSpriteAffineAnim(sprite, gBattleAnimArgs[2]+1); +} + +static void AnimPluckParticle(struct Sprite* sprite) +{ + if(sprite->data[0] > 0) + { + s16 yVelocity = sprite->data[5]; + s16 xVelocity = sprite->data[2]; + sprite->pos1.y -= yVelocity; + sprite->pos1.x += xVelocity; + if((sprite->data[0] % 7) == 0) + { + sprite->data[5] = yVelocity-1; + } + sprite->data[0]--; + } + else + { + sprite->callback = DestroyAnimSprite; + } +} + +// brown seed particle (jumps up, falls down.) +// used by Pluck. +// arg 0: initial x offset from target +// arg 1: initial y offset from target +// arg 2: lifetime of the particle +// arg 3: upward velocity initial (decreases over time) +// arg 4: horizontal velocity (stays the same) +static void AnimPluck(struct Sprite* sprite) +{ + InitSpritePosToAnimTarget(sprite, TRUE); + + sprite->data[0] = gBattleAnimArgs[2]; //lifetime of the particle + sprite->data[5] = gBattleAnimArgs[3]; //upward velocity + sprite->data[2] = gBattleAnimArgs[4]; //horizontal velocity + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + sprite->callback = AnimPluckParticle; +} + +static void AnimMoveFeintSwipeStep(struct Sprite* sprite) +{ + switch(sprite->data[5]) + { + case 0: + if(AnimTranslateLinear(sprite)) + { + //Not the most elegant solution here, but it works without messing up the sprites coordinates + sprite->pos2.x = 0; + sprite->pos1.x += 64; + sprite->data[5]++; + sprite->data[0] = sprite->data[6]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = sprite->pos1.x - 64; + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = sprite->pos1.y; + InitAnimLinearTranslation(sprite); + } + break; + case 1: + if(AnimTranslateLinear(sprite)) + { + sprite->callback = DestroyAnimSprite; + } + break; + } + +} + +static void AnimMoveFeintSwipe(struct Sprite* sprite) +{ + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + { + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + } + InitSpritePosToAnimTarget(sprite, TRUE); + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[6] = gBattleAnimArgs[2]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = sprite->pos1.x + 64; + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = sprite->pos1.y; + sprite->data[5] = 0; + InitAnimLinearTranslation(sprite); + sprite->callback = AnimMoveFeintSwipeStep; +} + +static void AnimMoveFeintZoom(struct Sprite* sprite) +{ + InitSpritePosToAnimTarget(sprite, TRUE); + StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); + sprite->callback = RunStoredCallbackWhenAffineAnimEnds; +} + +static void AnimMoveTrumpCardArc(struct Sprite* sprite) +{ + if(AnimTranslateLinear(sprite)) + { + DestroyAnimSprite(sprite); + } + else + { + sprite->pos2.y = Sin(sprite->data[5], -20); + sprite->data[5] -= sprite->data[6]; + } + +} + +static void AnimMoveTrumpCard(struct Sprite* sprite) +{ + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + { + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + } + InitSpritePosToAnimTarget(sprite, TRUE); + StartSpriteAnim(sprite, gBattleAnimArgs[2]); + sprite->data[0] = gBattleAnimArgs[3]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = sprite->pos1.x - 80; + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = sprite->pos1.y; + sprite->data[5] = 128; + sprite->data[6] = 128 / sprite->data[0]; + InitAnimLinearTranslation(sprite); + sprite->callback = AnimMoveTrumpCardArc; +} + +static void AnimMoveTrumpCardParticleAlive(struct Sprite* sprite) +{ + if(sprite->data[0] > 0) + { + s16 yVelocity = sprite->data[2]; + s16 xVelocity = sprite->data[1]; + sprite->pos1.y -= yVelocity; + sprite->pos1.x += xVelocity; + if((sprite->data[0] % 2) == 0) + { + if(xVelocity > 0) + xVelocity--; + else if(xVelocity < 0) + xVelocity++; + + if(yVelocity > 0) + yVelocity--; + else if(yVelocity < 0) + yVelocity++; + sprite->data[1] = xVelocity; + sprite->data[2] = yVelocity; + } + sprite->data[0]--; + } + else + { + sprite->callback = DestroyAnimSprite; + } +} + +static void AnimMoveTrumpCardParticle(struct Sprite* sprite) +{ + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + { + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + } + InitSpritePosToAnimTarget(sprite, TRUE); + StartSpriteAnim(sprite, gBattleAnimArgs[2]); + StartSpriteAffineAnim(sprite, gBattleAnimArgs[6]); + sprite->data[0] = gBattleAnimArgs[3]; //lifespan + sprite->data[1] = gBattleAnimArgs[4]; //horizontal velocity, decaying + sprite->data[2] = gBattleAnimArgs[5]; //vertical velocity, decaying + sprite->callback = AnimMoveTrumpCardParticleAlive; +} + +static void AnimMoveAccupressureTransition(struct Sprite* sprite) +{ + switch(sprite->data[5]) + { + case 0: + if(AnimTranslateLinear(sprite)) + { + StartSpriteAffineAnim(sprite, 1); + sprite->data[5]++; + } + break; + case 1: + if(sprite->affineAnimEnded) + { + DestroyAnimSprite(sprite); + } + break; + } +} + +static void AnimMoveAccupressure(struct Sprite* sprite) +{ + InitSpritePosToAnimTarget(sprite, TRUE); + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y); + sprite->data[5] = 0; + InitAnimLinearTranslation(sprite); + sprite->callback = AnimMoveAccupressureTransition; +} + +static void AnimMoveWringOutCircle(struct Sprite* sprite) +{ + sprite->pos2.x = Cos(sprite->data[3], sprite->data[2]); + sprite->pos2.y = Sin(sprite->data[3], sprite->data[2]); + if(sprite->data[1] > 0) + { + if(sprite->data[3] + sprite->data[0] >= 256) + { + sprite->data[3] = (sprite->data[0] + sprite->data[3]) % 256; + sprite->data[1]--; + } + else + { + sprite->data[3] += sprite->data[0]; + } + + } + else if(sprite->data[3] < 64) + { + //We need to go for an extra 90° + sprite->data[3] += sprite->data[0]; + } + else + { + DestroyAnimSprite(sprite); + } +} + +static void AnimMoveWringOut(struct Sprite* sprite) +{ + InitSpritePosToAnimTarget(sprite, TRUE); + if(gBattleAnimArgs[5] == TRUE) + { + sprite->oam.objMode = ST_OAM_OBJ_BLEND; + } + sprite->data[0] = 256 / gBattleAnimArgs[2]; //step size + sprite->data[1] = gBattleAnimArgs[3]; //Number of circle spins + sprite->data[2] = gBattleAnimArgs[4]; //radius + sprite->data[3] = 64; //current angle 90° + sprite->callback = AnimMoveWringOutCircle; +} + // seed (sprouts a sapling from a seed.) // Used by Leech Seed. // arg 0: initial x pixel offset @@ -2435,7 +3508,7 @@ static void AnimLeechSeedSprouts(struct Sprite* sprite) // arg 2: initial wave offset // arg 3: duration // arg 4: blend (0 = off, 1 = on) -static void AnimSporeParticle(struct Sprite* sprite) +void AnimSporeParticle(struct Sprite* sprite) { InitSpritePosToAnimTarget(sprite, TRUE); StartSpriteAnim(sprite, gBattleAnimArgs[4]); @@ -2497,7 +3570,7 @@ void AnimTask_SporeDoubleBattle(u8 taskId) // arg 1: initial y pixel offset // arg 2: target y pixel offset // arg 3: duration -static void AnimPetalDanceBigFlower(struct Sprite* sprite) +void AnimPetalDanceBigFlower(struct Sprite* sprite) { InitSpritePosToAnimAttacker(sprite, FALSE); sprite->data[0] = gBattleAnimArgs[3]; @@ -2535,7 +3608,7 @@ static void AnimPetalDanceBigFlower_Step(struct Sprite* sprite) // arg 1: initial y pixel offset // arg 2: target y pixel offset // arg 3: duration -static void AnimPetalDanceSmallFlower(struct Sprite* sprite) +void AnimPetalDanceSmallFlower(struct Sprite* sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[3]; @@ -2633,7 +3706,7 @@ static void AnimRazorLeafParticle_Step2(struct Sprite* sprite) // arg 4: translation duration // arg 5: wave amplitude // arg 6: target between double battle opponents (boolean) -static void AnimTranslateLinearSingleSineWave(struct Sprite* sprite) +void AnimTranslateLinearSingleSineWave(struct Sprite* sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) @@ -2864,7 +3937,7 @@ static void AnimTask_DuplicateAndShrinkToPos_Step2(u8 taskId) // Moves an orb from the target mon to the attacking mon. // arg 0: initial x pixel offset // arg 1: initial y pixel offset -static void AnimMimicOrb(struct Sprite* sprite) +void AnimMimicOrb(struct Sprite* sprite) { switch (sprite->data[0]) { @@ -3659,7 +4732,7 @@ void AnimTask_CycleMagicalLeafPal(u8 taskId) DestroyAnimVisualTask(taskId); } -static void AnimNeedleArmSpike(struct Sprite* sprite) +void AnimNeedleArmSpike(struct Sprite* sprite) { u8 a; u8 b; @@ -3715,7 +4788,7 @@ static void AnimNeedleArmSpike(struct Sprite* sprite) } } -static void AnimNeedleArmSpike_Step(struct Sprite* sprite) +void AnimNeedleArmSpike_Step(struct Sprite* sprite) { if (sprite->data[0]) { @@ -3782,7 +4855,7 @@ static void sub_8100A94(struct Sprite* sprite) // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: slice direction; 0 = right-to-left, 1 = left-to-right -static void AnimCuttingSlice(struct Sprite* sprite) +void AnimCuttingSlice(struct Sprite* sprite) { sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 0); sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 1); @@ -4119,7 +5192,7 @@ static void AnimMilkBottle_Step2(struct Sprite* sprite, int unk1, int unk2) sprite->data[3] = 0; } -static void AnimGrantingStars(struct Sprite* sprite) +void AnimGrantingStars(struct Sprite* sprite) { if (!gBattleAnimArgs[2]) SetSpriteCoordsToAnimAttackerCoords(sprite); @@ -4768,7 +5841,7 @@ static void AnimFalseSwipeSlice_Step3(struct Sprite* sprite) } } -static void AnimEndureEnergy(struct Sprite* sprite) +void AnimEndureEnergy(struct Sprite* sprite) { if (gBattleAnimArgs[0] == 0) { @@ -4836,7 +5909,7 @@ static void AnimSharpenSphere_Step(struct Sprite* sprite) DestroyAnimSprite(sprite); } -static void AnimConversion(struct Sprite* sprite) +void AnimConversion(struct Sprite* sprite) { if (sprite->data[0] == 0) { @@ -5459,7 +6532,7 @@ void SetSpriteNextToMonHead(u8 battler, struct Sprite* sprite) sprite->pos1.y = GetBattlerSpriteCoord(battler, 3) - (s16)GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_HEIGHT) / 4; } -static void AnimThoughtBubble(struct Sprite* sprite) +void AnimThoughtBubble(struct Sprite* sprite) { u8 a; u8 battler; @@ -5487,7 +6560,7 @@ static void AnimThoughtBubble_Step(struct Sprite* sprite) } } -static void AnimMetronomeFinger(struct Sprite* sprite) +void AnimMetronomeFinger(struct Sprite* sprite) { u8 battler; if (gBattleAnimArgs[0] == 0) @@ -5511,7 +6584,7 @@ static void AnimMetronomeFinger_Step(struct Sprite* sprite) } } -static void AnimFollowMeFinger(struct Sprite* sprite) +void AnimFollowMeFinger(struct Sprite* sprite) { u8 battler; if (gBattleAnimArgs[0] == 0) @@ -5608,3 +6681,85 @@ static void AnimTauntFinger_Step2(struct Sprite* sprite) if (++sprite->data[1] > 5) DestroyAnimSprite(sprite); } + +// Animates a white streak by giving it a random rotation. +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +static void AnimRockPolishStreak(struct Sprite *sprite) +{ + int affineAnimNum = Random2() % ARRAY_COUNT(gRockPolishStreak_AffineAnimCmds); + InitSpritePosToAnimAttacker(sprite, TRUE); + StartSpriteAffineAnim(sprite, affineAnimNum); + StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); + sprite->callback = RunStoredCallbackWhenAnimEnds; +} + +// Places a blue sparkle that plays its default animation. +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +static void AnimRockPolishSparkle(struct Sprite *sprite) +{ + InitSpritePosToAnimAttacker(sprite, TRUE); + StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); + sprite->callback = RunStoredCallbackWhenAnimEnds; +} + +// Moves a projectile towards the center of the target mon. The sprite is rotated to look +// like it's traveling along that path. +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: duration +static void AnimPoisonJabProjectile(struct Sprite *sprite) +{ + s16 targetXPos; + s16 targetYPos; + u16 rotation; + + InitSpritePosToAnimTarget(sprite, TRUE); + targetXPos = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); + targetYPos = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); + rotation = ArcTan2Neg(targetXPos - sprite->pos1.x, targetYPos - sprite->pos1.y); + TrySetSpriteRotScale(sprite, FALSE, 0x100, 0x100, rotation); + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[2] = targetXPos; + sprite->data[4] = targetYPos; + sprite->callback = StartAnimLinearTranslation; + StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); +} + +void AnimTask_BlendNightSlash(u8 taskId) +{ + int paletteOffset = IndexOfSpritePaletteTag(ANIM_TAG_SLASH) * 16 + 256; + BlendPalette(paletteOffset, 16, 6, RGB_RED); + DestroyAnimVisualTask(taskId); +} + +static void AnimNightSlash(struct Sprite *sprite) +{ + sprite->callback = AnimSlashSlice; + sprite->callback(sprite); +} + +static const union AffineAnimCmd sCompressTargetHorizontallyAffineAnimCmds[] = +{ + AFFINEANIMCMD_FRAME(64, 0, 0, 16), //Compress + AFFINEANIMCMD_FRAME(0, 0, 0, 64), + AFFINEANIMCMD_FRAME(-64, 0, 0, 16), + AFFINEANIMCMD_END, +}; + +static void AnimTask_CompressTargetStep(u8 taskId) +{ + struct Task* task = &gTasks[taskId]; + + if (!RunAffineAnimFromTaskData(task)) + DestroyAnimVisualTask(taskId); +} + +void AnimTask_CompressTargetHorizontally(u8 taskId) +{ + struct Task* task = &gTasks[taskId]; + u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET); + PrepareAffineAnimInTaskData(task, spriteId, sCompressTargetHorizontallyAffineAnimCmds); + task->func = AnimTask_CompressTargetStep; +} diff --git a/src/battle_anim_effects_2.c b/src/battle_anim_effects_2.c index d891a4d016..6c0d76055a 100755 --- a/src/battle_anim_effects_2.c +++ b/src/battle_anim_effects_2.c @@ -26,7 +26,6 @@ static void sub_8103680(struct Sprite *); static void AnimKinesisZapEnergy(struct Sprite *); static void AnimSwordsDanceBlade(struct Sprite *); static void AnimSwordsDanceBlade_Step(struct Sprite *); -static void AnimSonicBoomProjectile(struct Sprite *); static void AnimAirWaveProjectile(struct Sprite *); static void AnimAirWaveProjectile_Step1(struct Sprite *sprite); static void AnimAirWaveProjectile_Step2(struct Sprite *sprite); @@ -46,12 +45,9 @@ static void AnimGuillotinePincer_Step1(struct Sprite *); static void AnimGuillotinePincer_Step2(struct Sprite *); static void AnimGuillotinePincer_Step3(struct Sprite *); static void AnimBreathPuff(struct Sprite *); -static void AnimAngerMark(struct Sprite *); static void AnimPencil(struct Sprite *); static void AnimPencil_Step(struct Sprite *); static void AnimBlendThinRing(struct Sprite *); -static void AnimHyperVoiceRing(struct Sprite *); -static void AnimUproarRing(struct Sprite *); static void AnimSoftBoiledEgg(struct Sprite *); static void AnimSoftBoiledEgg_Step1(struct Sprite *); static void AnimSoftBoiledEgg_Step2(struct Sprite *); @@ -67,9 +63,7 @@ static void AnimRedHeartProjectile(struct Sprite *); static void AnimRedHeartProjectile_Step(struct Sprite *); static void AnimRedHeartRising(struct Sprite *); static void AnimRedHeartRising_Step(struct Sprite *); -static void AnimOrbitFast(struct Sprite *); static void AnimOrbitFast_Step(struct Sprite *); -static void AnimOrbitScatter(struct Sprite *); static void AnimOrbitScatter_Step(struct Sprite *); static void AnimSpitUpOrb(struct Sprite *); static void AnimSpitUpOrb_Step(struct Sprite *sprite); @@ -985,6 +979,28 @@ const struct SpriteTemplate gHiddenPowerOrbScatterSpriteTemplate = .callback = AnimOrbitScatter, }; +const struct SpriteTemplate gPowerGemOrbSpriteTemplate = +{ + .tileTag = ANIM_TAG_POWER_GEM, + .paletteTag = ANIM_TAG_POWER_GEM, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gHiddenPowerOrbAffineAnimTable, + .callback = AnimOrbitFast, +}; + +const struct SpriteTemplate gPowerGemOrbScatterSpriteTemplate = +{ + .tileTag = ANIM_TAG_POWER_GEM, + .paletteTag = ANIM_TAG_POWER_GEM, + .oam = &gOamData_AffineDouble_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gHiddenPowerOrbAffineAnimTable, + .callback = AnimOrbitScatter, +}; + const union AffineAnimCmd gSpitUpOrbAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0), @@ -1210,7 +1226,6 @@ const union AffineAnimCmd *const gPerishSongMusicNoteAffineAnimTable[] = gPerishSongMusicNoteAffineAnimCmds3, }; -extern const union AnimCmd *const gMusicNotesAnimTable[]; const struct SpriteTemplate gPerishSongMusicNoteSpriteTemplate = { .tileTag = ANIM_TAG_MUSIC_NOTES_2, @@ -1262,6 +1277,28 @@ const struct SpriteTemplate gGuardRingSpriteTemplate = .callback = AnimGuardRing, }; +const struct SpriteTemplate gCrushGripExplosionTemplate = +{ + .tileTag = ANIM_TAG_EXPLOSION, + .paletteTag = ANIM_TAG_EXPLOSION, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gExplosionAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; + +const struct SpriteTemplate gRoarOfTimeBombTemplate = +{ + .tileTag = ANIM_TAG_EXPLOSION, + .paletteTag = ANIM_TAG_WATER_GUN, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gExplosionAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; + static void sub_8103448(struct Sprite *sprite) { SetSpriteCoordsToAnimAttackerCoords(sprite); @@ -1480,7 +1517,7 @@ static void AnimSwordsDanceBlade_Step(struct Sprite *sprite) // arg 2: target x pixel offset // arg 3: target y pixel offset // arg 4: duration -static void AnimSonicBoomProjectile(struct Sprite *sprite) +void AnimSonicBoomProjectile(struct Sprite *sprite) { s16 targetXPos; s16 targetYPos; @@ -2268,7 +2305,7 @@ static void AnimBreathPuff(struct Sprite *sprite) // arg 0: target mon (0 = attacker, 1 = target) // arg 1: x pixel offset // arg 2: y pixel offset -static void AnimAngerMark(struct Sprite *sprite) +void AnimAngerMark(struct Sprite *sprite) { u8 battler; if (!gBattleAnimArgs[0]) @@ -2578,7 +2615,7 @@ void sub_8105284(struct Sprite *sprite) } } -static void AnimHyperVoiceRing(struct Sprite *sprite) +void AnimHyperVoiceRing(struct Sprite *sprite) { u16 r9 = 0; u16 r6 = 0; @@ -2663,7 +2700,7 @@ static void AnimHyperVoiceRing(struct Sprite *sprite) sprite->callback(sprite); } -static void AnimUproarRing(struct Sprite *sprite) +void AnimUproarRing(struct Sprite *sprite) { u8 index = IndexOfSpritePaletteTag(ANIM_TAG_THIN_RING); if (index != 0xFF) @@ -3400,7 +3437,7 @@ static void AnimTask_ScaryFace_Step(u8 taskId) // Used by MOVE_HIDDEN_POWER // arg 0: duration // arg 1: initial wave offset -static void AnimOrbitFast(struct Sprite *sprite) +void AnimOrbitFast(struct Sprite *sprite) { sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); @@ -3451,7 +3488,7 @@ static void AnimOrbitFast_Step(struct Sprite *sprite) // Moves orbs away from the mon, based on where they are in their orbit. // Used in MOVE_HIDDEN_POWER. // arg 0: initial wave offset -static void AnimOrbitScatter(struct Sprite *sprite) +void AnimOrbitScatter(struct Sprite *sprite) { sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c index abb3223e06..c3e023cdca 100755 --- a/src/battle_anim_effects_3.c +++ b/src/battle_anim_effects_3.c @@ -25,12 +25,10 @@ extern const struct SpriteTemplate gThoughtBubbleSpriteTemplate; -static void AnimBlackSmoke(struct Sprite *); static void AnimBlackSmoke_Step(struct Sprite *); static void AnimWhiteHalo(struct Sprite *); static void AnimWhiteHalo_Step1(struct Sprite *); static void AnimWhiteHalo_Step2(struct Sprite *); -static void AnimTealAlert(struct Sprite *); static void AnimMeanLookEye(struct Sprite *); static void AnimMeanLookEye_Step1(struct Sprite *); static void AnimMeanLookEye_Step2(struct Sprite *); @@ -62,7 +60,6 @@ static void AnimGreenStar_Step1(struct Sprite *); static void AnimGreenStar_Step2(struct Sprite *); static void AnimGreenStar_Callback(struct Sprite *); static void AnimWeakFrustrationAngerMark(struct Sprite *); -static void AnimSweetScentPetal(struct Sprite *); static void AnimSweetScentPetal_Step(struct Sprite *); static void AnimPainSplitProjectile(struct Sprite *); static void AnimFlatterConfetti(struct Sprite *); @@ -89,7 +86,6 @@ static void AnimForesightMagnifyingGlass(struct Sprite *); static void AnimForesightMagnifyingGlass_Step(struct Sprite *); static void AnimMeteorMashStar(struct Sprite *); static void AnimMeteorMashStar_Step(struct Sprite *sprite); -static void AnimBlockX(struct Sprite *); static void AnimBlockX_Step(struct Sprite *); static void sub_815FE80(struct Sprite *); static void AnimKnockOffStrike(struct Sprite *); @@ -258,6 +254,17 @@ const struct SpriteTemplate gSpikesSpriteTemplate = .callback = AnimSpikes, }; +const struct SpriteTemplate gToxicSpikesSpriteTemplate = +{ + .tileTag = ANIM_TAG_TOXIC_SPIKES, + .paletteTag = ANIM_TAG_TOXIC_SPIKES, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSpikes, +}; + const union AnimCmd gLeerAnimCmds[] = { ANIMCMD_FRAME(0, 3), @@ -1179,7 +1186,40 @@ const union AffineAnimCmd gSlackOffSquishAffineAnimCmds[] = AFFINEANIMCMD_END, }; -static void AnimBlackSmoke(struct Sprite *sprite) +const struct SpriteTemplate gMegaStoneSpriteTemplate = +{ + .tileTag = ANIM_TAG_MEGA_STONE, + .paletteTag = ANIM_TAG_MEGA_STONE, + .oam = &gOamData_AffineDouble_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_LusterPurgeCircle, + .callback = AnimSpriteOnMonPos, +}; + +const struct SpriteTemplate gMegaParticlesSpriteTemplate = +{ + .tileTag = ANIM_TAG_MEGA_PARTICLES, + .paletteTag = ANIM_TAG_MEGA_PARTICLES, + .oam = &gOamData_AffineNormal_ObjBlend_16x16, + .anims = gPowerAbsorptionOrbAnimTable, + .images = NULL, + .affineAnims = gPowerAbsorptionOrbAffineAnimTable, + .callback = AnimPowerAbsorptionOrb, +}; + +const struct SpriteTemplate gMegaSymbolSpriteTemplate = +{ + .tileTag = ANIM_TAG_MEGA_SYMBOL, + .paletteTag = ANIM_TAG_MEGA_SYMBOL, + .oam = &gOamData_AffineOff_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimGhostStatusSprite, +}; + +void AnimBlackSmoke(struct Sprite *sprite) { sprite->pos1.x += gBattleAnimArgs[0]; sprite->pos1.y += gBattleAnimArgs[1]; @@ -1244,7 +1284,7 @@ static void AnimWhiteHalo_Step2(struct Sprite *sprite) DestroyAnimSprite(sprite); } -static void AnimTealAlert(struct Sprite *sprite) +void AnimTealAlert(struct Sprite *sprite) { u16 rotation; u8 x = GetBattlerSpriteCoord(gBattleAnimTarget, 2); @@ -2282,7 +2322,7 @@ void AnimTask_TransformMon(u8 taskId) } break; case 2: - HandleSpeciesGfxDataChange(gBattleAnimAttacker, gBattleAnimTarget, gTasks[taskId].data[10]); + HandleSpeciesGfxDataChange(gBattleAnimAttacker, gBattleAnimTarget, gTasks[taskId].data[10], gBattleAnimArgs[1]); sub_80A6BFC(&animBg, gBattleAnimAttacker); if (IsContest()) @@ -2369,7 +2409,7 @@ void AnimTask_IsMonInvisible(u8 taskId) void AnimTask_CastformGfxDataChange(u8 taskId) { - HandleSpeciesGfxDataChange(gBattleAnimAttacker, gBattleAnimTarget, TRUE); + HandleSpeciesGfxDataChange(gBattleAnimAttacker, gBattleAnimTarget, TRUE, FALSE); DestroyAnimVisualTask(taskId); } @@ -2798,7 +2838,7 @@ static void AnimTask_RockMonBackAndForth_Step(u8 taskId) // arg 0: initial y pixel offset // arg 1: sprite anim num // arg 2: unused -static void AnimSweetScentPetal(struct Sprite *sprite) +void AnimSweetScentPetal(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) { @@ -4655,6 +4695,17 @@ static void AnimForesightMagnifyingGlass_Step(struct Sprite *sprite) } } +const struct SpriteTemplate gDracoMeteorSmashSpriteTemplate = +{ + .tileTag = ANIM_TAG_WARM_ROCK, + .paletteTag = ANIM_TAG_WARM_ROCK, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMeteorMashStar, +}; + static void AnimMeteorMashStar_Step(struct Sprite *sprite) { sprite->pos2.x = ((sprite->data[2] - sprite->data[0]) * sprite->data[5]) / sprite->data[4]; @@ -4799,7 +4850,7 @@ static void AnimTask_MonToSubstituteDoll(u8 taskId) // Moves down an X that flickers and disappears. // No args. -static void AnimBlockX(struct Sprite *sprite) +void AnimBlockX(struct Sprite *sprite) { s16 y; diff --git a/src/battle_anim_electric.c b/src/battle_anim_electric.c index a57e88b03d..3d61ab7034 100644 --- a/src/battle_anim_electric.c +++ b/src/battle_anim_electric.c @@ -4,34 +4,28 @@ #include "trig.h" #include "constants/songs.h" #include "sound.h" +#include "constants/moves.h" static void AnimLightning(struct Sprite *); static void AnimLightning_Step(struct Sprite *); static void sub_810A214(struct Sprite *); static void sub_810A258(struct Sprite *); static void sub_810A274(struct Sprite *); -static void AnimSparkElectricity(struct Sprite *); -static void AnimZapCannonSpark(struct Sprite *); static void AnimZapCannonSpark_Step(struct Sprite *); static void AnimThunderboltOrb(struct Sprite *); static void AnimThunderboltOrb_Step(struct Sprite *); -static void AnimSparkElectricityFlashing(struct Sprite *); static void AnimSparkElectricityFlashing_Step(struct Sprite *); static void AnimElectricity(struct Sprite *); static void AnimTask_ElectricBolt_Step(u8 taskId); static void AnimElectricBoltSegment(struct Sprite *); -static void AnimThunderWave(struct Sprite *); static void AnimThunderWave_Step(struct Sprite *); static void AnimTask_ElectricChargingParticles_Step(u8 taskId); static void AnimElectricChargingParticles(struct Sprite *); static void AnimElectricChargingParticles_Step(struct Sprite *); -static void AnimGrowingChargeOrb(struct Sprite *); -static void AnimElectricPuff(struct Sprite *); static void AnimVoltTackleOrbSlide(struct Sprite *); static void AnimVoltTackleOrbSlide_Step(struct Sprite *); static bool8 sub_810B154(struct Task *task, u8 taskId); static void AnimVoltTackleBolt(struct Sprite *); -static void AnimGrowingShockWaveOrb(struct Sprite *); static bool8 sub_810B430(struct Task *task, u8 taskId); static void AnimShockWaveProgressingBolt(struct Sprite *); static bool8 sub_810B614(struct Task *task, u8 taskId); @@ -144,7 +138,7 @@ static const union AffineAnimCmd sAffineAnim_FlashingSpark[] = AFFINEANIMCMD_JUMP(0), }; -static const union AffineAnimCmd *const sAffineAnims_FlashingSpark[] = +const union AffineAnimCmd *const gAffineAnims_FlashingSpark[] = { sAffineAnim_FlashingSpark, }; @@ -156,7 +150,7 @@ const struct SpriteTemplate gZapCannonSparkSpriteTemplate = .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_FlashingSpark, + .affineAnims = gAffineAnims_FlashingSpark, .callback = AnimZapCannonSpark, }; @@ -168,7 +162,7 @@ static const union AnimCmd sAnim_ThunderboltOrb[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sAnims_ThunderboltOrb[] = +const union AnimCmd *const gAnims_ThunderboltOrb[] = { sAnim_ThunderboltOrb, }; @@ -191,7 +185,7 @@ const struct SpriteTemplate gThunderboltOrbSpriteTemplate = .tileTag = ANIM_TAG_SHOCK_3, .paletteTag = ANIM_TAG_SHOCK_3, .oam = &gOamData_AffineNormal_ObjNormal_32x32, - .anims = sAnims_ThunderboltOrb, + .anims = gAnims_ThunderboltOrb, .images = NULL, .affineAnims = sAffineAnims_ThunderboltOrb, .callback = AnimThunderboltOrb, @@ -204,7 +198,7 @@ const struct SpriteTemplate gSparkElectricityFlashingSpriteTemplate = .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_FlashingSpark, + .affineAnims = gAffineAnims_FlashingSpark, .callback = AnimSparkElectricityFlashing, }; @@ -241,6 +235,17 @@ const struct SpriteTemplate gThunderWaveSpriteTemplate = .callback = AnimThunderWave, }; +const struct SpriteTemplate gAnchorShotChainTemplate = +{ + .tileTag = ANIM_TAG_CHAIN_LINK, + .paletteTag = ANIM_TAG_CHAIN_LINK, + .oam = &gOamData_AffineOff_ObjNormal_32x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimThunderWave +}; + static const s8 sElectricChargingParticleCoordOffsets[][2] = { { 58, -60}, @@ -279,7 +284,7 @@ static const union AnimCmd sAnim_ElectricChargingParticles_1[] = ANIMCMD_END, }; -static const union AnimCmd *const sAnims_ElectricChargingParticles[] = +const union AnimCmd *const gAnims_ElectricChargingParticles[] = { sAnim_ElectricChargingParticles_0, sAnim_ElectricChargingParticles_1, @@ -290,12 +295,23 @@ const struct SpriteTemplate gElectricChargingParticlesSpriteTemplate = .tileTag = ANIM_TAG_ELECTRIC_ORBS, .paletteTag = ANIM_TAG_ELECTRIC_ORBS, .oam = &gOamData_AffineOff_ObjNormal_8x8, - .anims = sAnims_ElectricChargingParticles, + .anims = gAnims_ElectricChargingParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; +const struct SpriteTemplate gLightOfRuinGrayChargeTemplate = +{ + .tileTag = ANIM_TAG_ELECTRIC_ORBS, + .paletteTag = ANIM_TAG_GUST, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = gAnims_ElectricChargingParticles, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + static const union AffineAnimCmd sAffineAnim_GrowingElectricOrb_0[] = { AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0), @@ -326,13 +342,31 @@ static const union AffineAnimCmd sAffineAnim_GrowingElectricOrb_2[] = AFFINEANIMCMD_END, }; -static const union AffineAnimCmd *const sAffineAnims_GrowingElectricOrb[] = +static const union AffineAnimCmd sAffineAnim_GrowingElectricOrb_4[] = +{ + AFFINEANIMCMD_FRAME(5, 5, 0, 0), + AFFINEANIMCMD_FRAME(0x2, 0x2, 0, 20), + AFFINEANIMCMD_FRAME(0x3, 0x3, 0, 15), + AFFINEANIMCMD_FRAME(0x1, 0x1, 0, 25), + AFFINEANIMCMD_FRAME(0xFFFC, 0xFFFC, 0, 5), + AFFINEANIMCMD_FRAME(0x3, 0x3, 0, 5), + AFFINEANIMCMD_FRAME(0xFFFB, 0xFFFB, 0, 5), + AFFINEANIMCMD_FRAME(0x4, 0x4, 0, 5), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd *const gAffineAnims_GrowingElectricOrb[] = { sAffineAnim_GrowingElectricOrb_0, sAffineAnim_GrowingElectricOrb_1, sAffineAnim_GrowingElectricOrb_2, }; +const union AffineAnimCmd *const gAffineAnims_GrowingElectricOrb2[] = +{ + sAffineAnim_GrowingElectricOrb_4, +}; + const struct SpriteTemplate gGrowingChargeOrbSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, @@ -340,7 +374,19 @@ const struct SpriteTemplate gGrowingChargeOrbSpriteTemplate = .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_GrowingElectricOrb, + .affineAnims = gAffineAnims_GrowingElectricOrb, + .callback = AnimGrowingChargeOrb, +}; + +// For Electro Ball - smaller orb. +const struct SpriteTemplate gGrowingChargeOrb2SpriteTemplate = +{ + .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .oam = &gOamData_AffineNormal_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_GrowingElectricOrb2, .callback = AnimGrowingChargeOrb, }; @@ -353,7 +399,7 @@ static const union AnimCmd sAnim_ElectricPuff[] = ANIMCMD_END, }; -static const union AnimCmd *const sAnims_ElectricPuff[] = +const union AnimCmd *const gAnims_ElectricPuff[] = { sAnim_ElectricPuff, }; @@ -363,7 +409,7 @@ const struct SpriteTemplate gElectricPuffSpriteTemplate = .tileTag = ANIM_TAG_ELECTRICITY, .paletteTag = ANIM_TAG_ELECTRICITY, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sAnims_ElectricPuff, + .anims = gAnims_ElectricPuff, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimElectricPuff, @@ -376,7 +422,7 @@ const struct SpriteTemplate gVoltTackleOrbSlideSpriteTemplate = .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_GrowingElectricOrb, + .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimVoltTackleOrbSlide, }; @@ -441,7 +487,7 @@ const struct SpriteTemplate gGrowingShockWaveOrbSpriteTemplate = .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_GrowingElectricOrb, + .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingShockWaveOrb, }; @@ -456,6 +502,54 @@ const struct SpriteTemplate gShockWaveProgressingBoltSpriteTemplate = .callback = AnimShockWaveProgressingBolt, }; +const struct SpriteTemplate gFlashCannonGrayChargeTemplate = +{ + .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .paletteTag = ANIM_TAG_HANDS_AND_FEET, + .oam = &gOamData_AffineNormal_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_GrowingElectricOrb, + .callback = AnimGrowingChargeOrb +}; + +static const union AffineAnimCmd sSpriteAffineAnim_JudgmentBall[] = +{ + AFFINEANIMCMD_FRAME(16, 16, 0, 0), + AFFINEANIMCMD_FRAME(8, 8, 0, 15), //Half size + AFFINEANIMCMD_FRAME(0, 0, 0, 120), //Delay + AFFINEANIMCMD_FRAME(24, 24, 0, 5), //Normal size + AFFINEANIMCMD_FRAME(0, 0, 0, 10), //Delay + AFFINEANIMCMD_FRAME(-16, -16, 0, 15), //Revert to 1 px + AFFINEANIMCMD_END, +}; +static const union AffineAnimCmd* const sSpriteAffineAnimTable_JudgmentBall[] = +{ + sSpriteAffineAnim_JudgmentBall, +}; +const struct SpriteTemplate gJudgmentBlackChargeTemplate = +{ + .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .paletteTag = ANIM_TAG_HANDS_AND_FEET, + .oam = &gOamData_AffineNormal_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = sSpriteAffineAnimTable_JudgmentBall, + .callback = AnimGrowingChargeOrb +}; + +const struct SpriteTemplate gSeedFlareGreenChargeTemplate = +{ + .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .paletteTag = ANIM_TAG_LEAF, + .oam = &gOamData_AffineNormal_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_GrowingElectricOrb, + .callback = AnimGrowingChargeOrb +}; + +// functions static void AnimLightning(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) @@ -512,7 +606,7 @@ static void sub_810A274(struct Sprite *sprite) sprite->callback = TranslateSpriteInCircleOverDuration; } -static void AnimSparkElectricity(struct Sprite *sprite) +void AnimSparkElectricity(struct Sprite *sprite) { u8 battler; u32 matrixNum; @@ -569,7 +663,7 @@ static void AnimSparkElectricity(struct Sprite *sprite) sprite->callback = DestroyAnimSpriteAfterTimer; } -static void AnimZapCannonSpark(struct Sprite *sprite) +void AnimZapCannonSpark(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, 1); sprite->data[0] = gBattleAnimArgs[3]; @@ -624,7 +718,7 @@ static void AnimThunderboltOrb(struct Sprite *sprite) sprite->callback = AnimThunderboltOrb_Step; } -static void AnimSparkElectricityFlashing(struct Sprite *sprite) +void AnimSparkElectricityFlashing(struct Sprite *sprite) { u8 battler; @@ -666,7 +760,8 @@ static void AnimSparkElectricityFlashing_Step(struct Sprite *sprite) // Electricity arcs around the target. Used for Paralysis and various electric move hits static void AnimElectricity(struct Sprite *sprite) { - InitSpritePosToAnimTarget(sprite, FALSE); + if (!InitSpritePosToAnimBattler(gBattleAnimArgs[4], sprite, FALSE)) + return; sprite->oam.tileNum += gBattleAnimArgs[3] * 4; if (gBattleAnimArgs[3] == 1) @@ -774,13 +869,18 @@ static void AnimElectricBoltSegment(struct Sprite *sprite) } // The horizontal bands of electricity used in Thunder Wave -static void AnimThunderWave(struct Sprite *sprite) +void AnimThunderWave(struct Sprite *sprite) { u8 spriteId; sprite->pos1.x += gBattleAnimArgs[0]; sprite->pos1.y += gBattleAnimArgs[1]; - spriteId = CreateSprite(&gThunderWaveSpriteTemplate, sprite->pos1.x + 32, sprite->pos1.y, sprite->subpriority); + if (gAnimMoveIndex == MOVE_THUNDER_WAVE) + spriteId = CreateSprite(&gThunderWaveSpriteTemplate, sprite->pos1.x + 32, sprite->pos1.y, sprite->subpriority); + else + spriteId = CreateSprite(&gAnchorShotChainTemplate, sprite->pos1.x + 32, sprite->pos1.y, sprite->subpriority); + + gSprites[spriteId].oam.tileNum += 8; gAnimVisualTaskCount++; gSprites[spriteId].callback = AnimThunderWave_Step; @@ -836,7 +936,11 @@ static void AnimTask_ElectricChargingParticles_Step(u8 taskId) { u8 spriteId; task->data[12] = 0; - spriteId = CreateSprite(&gElectricChargingParticlesSpriteTemplate, task->data[14], task->data[15], 2); + if (gAnimMoveIndex == MOVE_FLASH_CANNON || gAnimMoveIndex == MOVE_STEEL_BEAM) + spriteId = CreateSprite(&gLightOfRuinGrayChargeTemplate, task->data[14], task->data[15], 2); + else + spriteId = CreateSprite(&gElectricChargingParticlesSpriteTemplate, task->data[14], task->data[15], 2); + if (spriteId != MAX_SPRITES) { struct Sprite *sprite = &gSprites[spriteId]; @@ -888,7 +992,7 @@ static void AnimElectricChargingParticles(struct Sprite *sprite) sprite->callback = AnimElectricChargingParticles_Step; } -static void AnimGrowingChargeOrb(struct Sprite *sprite) +void AnimGrowingChargeOrb(struct Sprite *sprite) { if (gBattleAnimArgs[0] == ANIM_ATTACKER) { @@ -906,7 +1010,7 @@ static void AnimGrowingChargeOrb(struct Sprite *sprite) } // The quick electric burst at the end of Charge / during the Volt Tackle hit -static void AnimElectricPuff(struct Sprite *sprite) +void AnimElectricPuff(struct Sprite *sprite) { if (gBattleAnimArgs[0] == ANIM_ATTACKER) { @@ -1126,7 +1230,7 @@ static void AnimVoltTackleBolt(struct Sprite *sprite) } } -static void AnimGrowingShockWaveOrb(struct Sprite *sprite) +void AnimGrowingShockWaveOrb(struct Sprite *sprite) { switch (sprite->data[0]) { @@ -1147,6 +1251,7 @@ static void AnimGrowingShockWaveOrb(struct Sprite *sprite) void AnimTask_ShockWaveProgressingBolt(u8 taskId) { struct Task *task = &gTasks[taskId]; + u8 target = GetAnimBattlerId(gBattleAnimArgs[0]); switch (task->data[0]) { @@ -1154,7 +1259,7 @@ void AnimTask_ShockWaveProgressingBolt(u8 taskId) task->data[6] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); task->data[7] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); task->data[8] = 4; - task->data[10] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); + task->data[10] = GetBattlerSpriteCoord(target, BATTLER_COORD_X_2); task->data[9] = (task->data[10] - task->data[6]) / 5; task->data[4] = 7; task->data[5] = -1; @@ -1272,19 +1377,20 @@ static void AnimShockWaveProgressingBolt(struct Sprite *sprite) void AnimTask_ShockWaveLightning(u8 taskId) { struct Task *task = &gTasks[taskId]; + u8 target = GetAnimBattlerId(gBattleAnimArgs[0]); switch (task->data[0]) { case 0: - task->data[15] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 32; + task->data[15] = GetBattlerSpriteCoord(target, BATTLER_COORD_Y) + 32; task->data[14] = task->data[15]; while (task->data[14] > 16) { task->data[14] -= 32; } - task->data[13] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); - task->data[12] = GetBattlerSpriteSubpriority(gBattleAnimTarget) - 2; + task->data[13] = GetBattlerSpriteCoord(target, BATTLER_COORD_X_2); + task->data[12] = GetBattlerSpriteSubpriority(target) - 2; task->data[0]++; break; case 1: @@ -1305,7 +1411,6 @@ void AnimTask_ShockWaveLightning(u8 taskId) bool8 sub_810B614(struct Task *task, u8 taskId) { u8 spriteId = CreateSprite(&gLightningSpriteTemplate, task->data[13], task->data[14], task->data[12]); - if (spriteId != MAX_SPRITES) { gSprites[spriteId].callback = sub_810B684; diff --git a/src/battle_anim_fight.c b/src/battle_anim_fight.c index 5211860e00..477a15b6d9 100644 --- a/src/battle_anim_fight.c +++ b/src/battle_anim_fight.c @@ -8,21 +8,15 @@ static void unc_080B08A0(struct Sprite *); static void AnimSlideHandOrFootToTarget(struct Sprite *); -static void AnimJumpKick(struct Sprite *); -static void AnimBasicFistOrFoot(struct Sprite *); static void AnimFistOrFootRandomPos(struct Sprite *); static void AnimFistOrFootRandomPos_Step(struct Sprite *); static void AnimCrossChopHand(struct Sprite *); static void AnimCrossChopHand_Step(struct Sprite *); static void AnimSlidingKick(struct Sprite *); static void AnimSlidingKick_Step(struct Sprite *); -static void AnimSpinningKickOrPunch(struct Sprite *); -static void AnimStompFoot(struct Sprite *); static void AnimStompFoot_Step(struct Sprite *); static void AnimStompFoot_End(struct Sprite *); -static void AnimDizzyPunchDuck(struct Sprite *); static void AnimBrickBreakWall(struct Sprite *); -static void AnimBrickBreakWall_Step(struct Sprite *); static void AnimBrickBreakWallShard(struct Sprite *); static void AnimBrickBreakWallShard_Step(struct Sprite *); static void AnimSuperpowerOrb(struct Sprite *); @@ -33,9 +27,8 @@ static void AnimSuperpowerRock_Step2(struct Sprite *); static void AnimSuperpowerFireball(struct Sprite *); static void AnimArmThrustHit(struct Sprite *); static void AnimArmThrustHit_Step(struct Sprite *sprite); -static void AnimRevengeScratch(struct Sprite *); static void AnimFocusPunchFist(struct Sprite *); -static void AnimSpinningKickOrPunchFinish(struct Sprite *); +static void AnimForcePalm(struct Sprite *sprite); extern struct SpriteTemplate gBasicHitSplatSpriteTemplate; @@ -81,7 +74,7 @@ static const union AnimCmd sAnim_CrossChopHand_1[] = ANIMCMD_END, }; -static const union AnimCmd *const sAnims_HandOrFoot[] = +const union AnimCmd *const gAnims_HandOrFoot[] = { sAnim_HandOrFoot, }; @@ -103,7 +96,7 @@ const struct SpriteTemplate gKarateChopSpriteTemplate = .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sAnims_HandOrFoot, + .anims = gAnims_HandOrFoot, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSlideHandOrFootToTarget, @@ -114,7 +107,7 @@ const struct SpriteTemplate gJumpKickSpriteTemplate = .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sAnims_HandOrFoot, + .anims = gAnims_HandOrFoot, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimJumpKick, @@ -125,7 +118,7 @@ const struct SpriteTemplate gFistFootSpriteTemplate = .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sAnims_HandOrFoot, + .anims = gAnims_HandOrFoot, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimBasicFistOrFoot, @@ -136,7 +129,7 @@ const struct SpriteTemplate gFistFootRandomPosSpriteTemplate = .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sAnims_HandOrFoot, + .anims = gAnims_HandOrFoot, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFistOrFootRandomPos, @@ -171,7 +164,7 @@ static const union AffineAnimCmd sAffineAnim_SpinningHandOrFoot[] = AFFINEANIMCMD_JUMP(1), }; -static const union AffineAnimCmd *const sAffineAnims_SpinningHandOrFoot[] = +const union AffineAnimCmd *const gAffineAnims_SpinningHandOrFoot[] = { sAffineAnim_SpinningHandOrFoot, }; @@ -182,9 +175,9 @@ const struct SpriteTemplate gSpinningHandOrFootSpriteTemplate = .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineDouble_ObjNormal_32x32, - .anims = sAnims_HandOrFoot, + .anims = gAnims_HandOrFoot, .images = NULL, - .affineAnims = sAffineAnims_SpinningHandOrFoot, + .affineAnims = gAffineAnims_SpinningHandOrFoot, .callback = AnimSpinningKickOrPunch, }; @@ -195,7 +188,7 @@ static const union AffineAnimCmd sAffineAnim_MegaPunchKick[] = AFFINEANIMCMD_JUMP(1), }; -static const union AffineAnimCmd *const sAffineAnims_MegaPunchKick[] = +const union AffineAnimCmd *const gAffineAnims_MegaPunchKick[] = { sAffineAnim_MegaPunchKick, }; @@ -205,9 +198,9 @@ const struct SpriteTemplate gMegaPunchKickSpriteTemplate = .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineDouble_ObjNormal_32x32, - .anims = sAnims_HandOrFoot, + .anims = gAnims_HandOrFoot, .images = NULL, - .affineAnims = sAffineAnims_MegaPunchKick, + .affineAnims = gAffineAnims_MegaPunchKick, .callback = AnimSpinningKickOrPunch, }; @@ -307,7 +300,7 @@ const struct SpriteTemplate gArmThrustHandSpriteTemplate = .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sAnims_HandOrFoot, + .anims = gAnims_HandOrFoot, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimArmThrustHit, @@ -376,7 +369,7 @@ static const union AnimCmd sAnim_RevengeBigScratch_2[] = ANIMCMD_END, }; -static const union AnimCmd *const sAnims_RevengeBigScratch[] = +const union AnimCmd *const gAnims_RevengeBigScratch[] = { sAnim_RevengeBigScratch_0, sAnim_RevengeBigScratch_1, @@ -388,7 +381,7 @@ const struct SpriteTemplate gRevengeBigScratchSpriteTemplate = .tileTag = ANIM_TAG_PURPLE_SWIPE, .paletteTag = ANIM_TAG_PURPLE_SWIPE, .oam = &gOamData_AffineOff_ObjNormal_64x64, - .anims = sAnims_RevengeBigScratch, + .anims = gAnims_RevengeBigScratch, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimRevengeScratch, @@ -411,12 +404,92 @@ const struct SpriteTemplate gFocusPunchFistSpriteTemplate = .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineDouble_ObjNormal_32x32, - .anims = sAnims_HandOrFoot, + .anims = gAnims_HandOrFoot, .images = NULL, .affineAnims = sAffineAnims_FocusPunchFist, .callback = AnimFocusPunchFist, }; +const struct SpriteTemplate gPalmSpriteTemplate = +{ + .tileTag = ANIM_TAG_PURPLE_HAND_OUTLINE, + .paletteTag = ANIM_TAG_PURPLE_HAND_OUTLINE, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_HandOrFoot, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimBasicFistOrFoot, +}; + +const struct SpriteTemplate gAuraSphereBlast = +{ + .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .oam = &gOamData_AffineOff_ObjNormal_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSuperpowerFireball, +}; + +const union AffineAnimCmd gForcePalmAffineAnimCmd_1[] = +{ + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gForcePalmAffineAnimCmd_2[] = +{ + AFFINEANIMCMD_FRAME(0xD8, 0xD8, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gForcePalmAffineAnimCmd_3[] = +{ + AFFINEANIMCMD_FRAME(0xB0, 0xB0, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gForcePalmAffineAnimCmd_4[] = +{ + AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd *const gForcePalmAffineAnims[] = +{ + gForcePalmAffineAnimCmd_1, + gForcePalmAffineAnimCmd_2, + gForcePalmAffineAnimCmd_3, + gForcePalmAffineAnimCmd_4, +}; + +const struct SpriteTemplate gForcePalmSpriteTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_SHADOW_BALL, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gForcePalmAffineAnims, + .callback = AnimForcePalm, +}; + +static void AnimForcePalm(struct Sprite *sprite) +{ + StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]); + if (gBattleAnimArgs[2] == 0) + InitSpritePosToAnimAttacker(sprite, 1); + else + InitSpritePosToAnimTarget(sprite, TRUE); + + sprite->callback = RunStoredCallbackWhenAffineAnimEnds; + StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); +} + static void unc_080B08A0(struct Sprite *sprite) { SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); @@ -439,7 +512,7 @@ static void AnimSlideHandOrFootToTarget(struct Sprite *sprite) AnimTravelDiagonally(sprite); } -static void AnimJumpKick(struct Sprite *sprite) +void AnimJumpKick(struct Sprite *sprite) { if (IsContest()) { @@ -457,7 +530,7 @@ static void AnimJumpKick(struct Sprite *sprite) // arg 2: duration // arg 3: ? (todo: related to initial pixel offsets) // arg 4: anim num -static void AnimBasicFistOrFoot(struct Sprite *sprite) +void AnimBasicFistOrFoot(struct Sprite *sprite) { StartSpriteAnim(sprite, gBattleAnimArgs[4]); @@ -617,7 +690,7 @@ static void AnimSlidingKick_Step(struct Sprite *sprite) // arg 1: initial y pixel offset // arg 2: anim num // arg 3: spin duration -static void AnimSpinningKickOrPunch(struct Sprite *sprite) +void AnimSpinningKickOrPunch(struct Sprite *sprite) { InitSpritePosToAnimTarget(sprite, TRUE); StartSpriteAnim(sprite, gBattleAnimArgs[2]); @@ -627,7 +700,7 @@ static void AnimSpinningKickOrPunch(struct Sprite *sprite) StoreSpriteCallbackInData6(sprite, AnimSpinningKickOrPunchFinish); } -static void AnimSpinningKickOrPunchFinish(struct Sprite *sprite) +void AnimSpinningKickOrPunchFinish(struct Sprite *sprite) { StartSpriteAffineAnim(sprite, 0); sprite->affineAnimPaused = 1; @@ -641,7 +714,7 @@ static void AnimSpinningKickOrPunchFinish(struct Sprite *sprite) // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: initial wait duration -static void AnimStompFoot(struct Sprite *sprite) +void AnimStompFoot(struct Sprite *sprite) { InitSpritePosToAnimTarget(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[2]; @@ -670,7 +743,7 @@ static void AnimStompFoot_End(struct Sprite *sprite) StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } -static void AnimDizzyPunchDuck(struct Sprite *sprite) +void AnimDizzyPunchDuck(struct Sprite *sprite) { if (sprite->data[0] == 0) { @@ -718,7 +791,7 @@ static void AnimBrickBreakWall(struct Sprite *sprite) sprite->callback = AnimBrickBreakWall_Step; } -static void AnimBrickBreakWall_Step(struct Sprite *sprite) +void AnimBrickBreakWall_Step(struct Sprite *sprite) { switch (sprite->data[0]) { @@ -969,7 +1042,7 @@ static void AnimArmThrustHit(struct Sprite *sprite) sprite->callback = AnimArmThrustHit_Step; } -static void AnimRevengeScratch(struct Sprite *sprite) +void AnimRevengeScratch(struct Sprite *sprite) { if (gBattleAnimArgs[2] == ANIM_ATTACKER) InitSpritePosToAnimAttacker(sprite, 0); diff --git a/src/battle_anim_fire.c b/src/battle_anim_fire.c index c8402f727c..df951ab1a4 100644 --- a/src/battle_anim_fire.c +++ b/src/battle_anim_fire.c @@ -8,7 +8,6 @@ #include "trig.h" static void AnimFireSpiralInward(struct Sprite *); -static void AnimFireSpread(struct Sprite *); static void AnimFirePlume(struct Sprite *); static void AnimLargeFlame(struct Sprite *); static void sub_8109028(struct Sprite *); @@ -23,7 +22,6 @@ static void AnimFireRing_Step2(struct Sprite *); static void AnimFireRing_Step3(struct Sprite *); static void UpdateFireRingCircleOffset(struct Sprite *); static void AnimFireCross(struct Sprite *); -static void AnimFireSpiralOutward(struct Sprite *); static void AnimFireSpiralOutward_Step1(struct Sprite *); static void AnimFireSpiralOutward_Step2(struct Sprite *); static void AnimTask_EruptionLaunchRocks_Step(u8 taskId); @@ -38,6 +36,8 @@ static void AnimWillOWispOrb(struct Sprite *); static void AnimWillOWispOrb_Step(struct Sprite *); static void AnimWillOWispFire(struct Sprite *); static void AnimTask_MoveHeatWaveTargets_Step(u8 taskId); +static void AnimLavaPlumeOrbitScatter(struct Sprite *sprite); +static void AnimLavaPlumeOrbitScatterStep(struct Sprite *sprite); static const union AnimCmd sAnim_FireSpiralSpread_0[] = { @@ -258,6 +258,30 @@ const struct SpriteTemplate gEmberFlareSpriteTemplate = .callback = AnimEmberFlare, }; +const union AnimCmd gIncinerateAnim1[] = +{ + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(16, 4), + ANIMCMD_FRAME(32, 2), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd *const gIncinerateAnims[] = +{ + gIncinerateAnim1, +}; + +const struct SpriteTemplate gIncinerateSpriteTemplate = +{ + .tileTag = ANIM_TAG_SMALL_EMBER, + .paletteTag = ANIM_TAG_SMALL_EMBER, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gIncinerateAnims, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = TranslateAnimSpriteToTargetMonLocation, +}; + const struct SpriteTemplate gBurnFlameSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, @@ -287,7 +311,7 @@ static const union AnimCmd sAnim_FireBlastCross[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sAnims_FireBlastCross[] = +const union AnimCmd *const gAnims_FireBlastCross[] = { sAnim_FireBlastCross, }; @@ -316,7 +340,7 @@ const struct SpriteTemplate gFireBlastCrossSpriteTemplate = .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sAnims_FireBlastCross, + .anims = gAnims_FireBlastCross, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFireCross, @@ -461,6 +485,68 @@ static const s8 sShakeDirsPattern1[16] = -1, 0, 1, 0, -1, 1, 0, -1, 0, 1, 0, -1, 0, 1, 0, 1, }; +const union AffineAnimCmd gLavaPlumeAffineAnimCmd[] = +{ + AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0), + AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 1), + AFFINEANIMCMD_JUMP(1), +}; + +const union AffineAnimCmd *const gLavaPlumeAffineAnims[] = +{ + gLavaPlumeAffineAnimCmd, +}; + +const struct SpriteTemplate gLavaPlumeSpriteTemplate = +{ + .tileTag = ANIM_TAG_FIRE_PLUME, + .paletteTag = ANIM_TAG_FIRE_PLUME, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = sAnims_FirePlume, + .images = NULL, + .affineAnims = gLavaPlumeAffineAnims, + .callback = AnimLavaPlumeOrbitScatter, +}; + +const struct SpriteTemplate gSpacialRendBladesTemplate = +{ + .tileTag = ANIM_TAG_PUNISHMENT_BLADES, + .paletteTag = ANIM_TAG_PINK_HEART_2, //ANIM_TAG_BERRY_EATEN, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_BasicFire, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpiralOutward +}; + +const struct SpriteTemplate gSpacialRendBladesTemplate2 = +{ + .tileTag = ANIM_TAG_PUNISHMENT_BLADES, + .paletteTag = ANIM_TAG_PINK_HEART_2, //ANIM_TAG_BERRY_EATEN, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = sAnims_FireSpiralSpread, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpread +}; + +static void AnimLavaPlumeOrbitScatter(struct Sprite *sprite) +{ + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); + sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); + sprite->data[0] = Sin(gBattleAnimArgs[0], 10); + sprite->data[1] = Cos(gBattleAnimArgs[0], 7); + sprite->callback = AnimLavaPlumeOrbitScatterStep; +} + +static void AnimLavaPlumeOrbitScatterStep(struct Sprite *sprite) +{ + sprite->pos2.x += sprite->data[0]; + sprite->pos2.y += sprite->data[1]; + if (sprite->pos1.x + sprite->pos2.x + 16 > 272u || sprite->pos1.y + sprite->pos2.y > 160 || sprite->pos1.y + sprite->pos2.y < -16) + DestroyAnimSprite(sprite); +} + // For the first stage of Fire Punch static void AnimFireSpiralInward(struct Sprite *sprite) { @@ -477,14 +563,14 @@ static void AnimFireSpiralInward(struct Sprite *sprite) } // For the impact spread of fire sprites for moves like Blaze Kick or Fire Punch -static void AnimFireSpread(struct Sprite *sprite) +void AnimFireSpread(struct Sprite *sprite) { SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); sprite->pos1.y += gBattleAnimArgs[1]; - sprite->data[0] = gBattleAnimArgs[4]; - sprite->data[1] = gBattleAnimArgs[2]; - sprite->data[2] = gBattleAnimArgs[3]; + sprite->data[0] = gBattleAnimArgs[4]; // duration + sprite->data[1] = gBattleAnimArgs[2]; // x + sprite->data[2] = gBattleAnimArgs[3]; // y sprite->callback = TranslateSpriteLinearFixedPoint; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); @@ -660,7 +746,7 @@ void AnimFireRing(struct Sprite *sprite) } static void AnimFireRing_Step1(struct Sprite *sprite) -{ +{ UpdateFireRingCircleOffset(sprite); if (++sprite->data[0] == 0x12) @@ -720,7 +806,7 @@ static void UpdateFireRingCircleOffset(struct Sprite *sprite) // arg 1: initial y pixel offset // arg 2: duration // arg 3: x delta -// arg 4: y delta +// arg 4: y delta // AnimFireCross(struct Sprite *sprite) static void AnimFireCross(struct Sprite *sprite) { @@ -736,7 +822,7 @@ static void AnimFireCross(struct Sprite *sprite) sprite->callback = TranslateSpriteLinear; } -static void AnimFireSpiralOutward(struct Sprite *sprite) +void AnimFireSpiralOutward(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, 1); @@ -1101,7 +1187,7 @@ static void AnimWillOWispOrb(struct Sprite *sprite) case 2: sprite->pos2.x = Sin(sprite->data[2], sprite->data[4]); sprite->data[2] = (sprite->data[2] + 4) & 0xFF; - + if (++sprite->data[3] == 31) { sprite->pos1.x += sprite->pos2.x; diff --git a/src/battle_anim_flying.c b/src/battle_anim_flying.c index fe94dc9a21..bf45001b41 100644 --- a/src/battle_anim_flying.c +++ b/src/battle_anim_flying.c @@ -12,11 +12,6 @@ static void AnimEllipticalGust(struct Sprite *); static void AnimEllipticalGust_Step(struct Sprite *); static void AnimGustToTarget(struct Sprite *); static void AnimGustToTarget_Step(struct Sprite *); -static void AnimAirWaveCrescent(struct Sprite *); -static void AnimFlyBallUp(struct Sprite *); -static void AnimFlyBallUp_Step(struct Sprite *); -static void AnimFlyBallAttack(struct Sprite *); -static void AnimFlyBallAttack_Step(struct Sprite *); static void AnimFallingFeather(struct Sprite *); static void sub_810E520(struct Sprite *); static void sub_810EB40(struct Sprite *); @@ -80,7 +75,7 @@ static const union AnimCmd sAffineAnim_AirWaveCrescent[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sAffineAnims_AirWaveCrescent[] = +const union AnimCmd *const gAffineAnims_AirWaveCrescent[] = { sAffineAnim_AirWaveCrescent, }; @@ -90,7 +85,7 @@ const struct SpriteTemplate gAirWaveCrescentSpriteTemplate = .tileTag = ANIM_TAG_AIR_WAVE_2, .paletteTag = ANIM_TAG_AIR_WAVE_2, .oam = &gOamData_AffineOff_ObjNormal_32x16, - .anims = sAffineAnims_AirWaveCrescent, + .anims = gAffineAnims_AirWaveCrescent, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimAirWaveCrescent, @@ -105,7 +100,7 @@ static const union AffineAnimCmd sAffineAnim_FlyBallUp[] = AFFINEANIMCMD_END, }; -static const union AffineAnimCmd *const sAffineAnims_FlyBallUp[] = +const union AffineAnimCmd *const gAffineAnims_FlyBallUp[] = { sAffineAnim_FlyBallUp, }; @@ -122,7 +117,7 @@ static const union AffineAnimCmd sAffineAnim_FlyBallAttack_1[] = AFFINEANIMCMD_END, }; -static const union AffineAnimCmd *const sAffineAnims_FlyBallAttack[] = +const union AffineAnimCmd *const gAffineAnims_FlyBallAttack[] = { sAffineAnim_FlyBallAttack_0, sAffineAnim_FlyBallAttack_1, @@ -135,7 +130,7 @@ const struct SpriteTemplate gFlyBallUpSpriteTemplate = .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_FlyBallUp, + .affineAnims = gAffineAnims_FlyBallUp, .callback = AnimFlyBallUp, }; @@ -146,7 +141,7 @@ const struct SpriteTemplate gFlyBallAttackSpriteTemplate = .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_FlyBallAttack, + .affineAnims = gAffineAnims_FlyBallAttack, .callback = AnimFlyBallAttack, }; @@ -422,7 +417,7 @@ static void AnimGustToTarget_Step(struct Sprite *sprite) DestroyAnimSprite(sprite); } -static void AnimAirWaveCrescent(struct Sprite *sprite) +void AnimAirWaveCrescent(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { @@ -462,7 +457,7 @@ static void AnimAirWaveCrescent(struct Sprite *sprite) SeekSpriteAnim(sprite, gBattleAnimArgs[5]); } -static void AnimFlyBallUp(struct Sprite *sprite) +void AnimFlyBallUp(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[2]; @@ -471,7 +466,7 @@ static void AnimFlyBallUp(struct Sprite *sprite) gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].invisible = TRUE; } -static void AnimFlyBallUp_Step(struct Sprite *sprite) +void AnimFlyBallUp_Step(struct Sprite *sprite) { if (sprite->data[0] > 0) { @@ -487,7 +482,7 @@ static void AnimFlyBallUp_Step(struct Sprite *sprite) DestroyAnimSprite(sprite); } -static void AnimFlyBallAttack(struct Sprite *sprite) +void AnimFlyBallAttack(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { @@ -506,12 +501,13 @@ static void AnimFlyBallAttack(struct Sprite *sprite) sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); + sprite->data[5] = gBattleAnimArgs[1]; // if sprite is to remain invisible InitAnimLinearTranslation(sprite); sprite->callback = AnimFlyBallAttack_Step; } -static void AnimFlyBallAttack_Step(struct Sprite *sprite) +void AnimFlyBallAttack_Step(struct Sprite *sprite) { sprite->data[0] = 1; AnimTranslateLinear(sprite); @@ -526,7 +522,7 @@ static void AnimFlyBallAttack_Step(struct Sprite *sprite) || sprite->pos1.x + sprite->pos2.x > 272 || sprite->pos1.y + sprite->pos2.y > 160) { - gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].invisible = FALSE; + gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].invisible = sprite->data[5]; DestroyAnimSprite(sprite); } } @@ -1059,7 +1055,7 @@ static void AnimDiveWaterSplash(struct Sprite *sprite) sprite->data[2]++; TrySetSpriteRotScale(sprite, 0, 256, sprite->data[1], 0); - + matrixNum = sprite->oam.matrixNum; t1 = 15616; diff --git a/src/battle_anim_ghost.c b/src/battle_anim_ghost.c index 632954351c..8831cae5e3 100644 --- a/src/battle_anim_ghost.c +++ b/src/battle_anim_ghost.c @@ -9,6 +9,7 @@ #include "sound.h" #include "trig.h" #include "util.h" +#include "constants/moves.h" static void AnimConfuseRayBallBounce(struct Sprite *); static void AnimConfuseRayBallBounce_Step1(struct Sprite *); @@ -18,7 +19,6 @@ static void AnimConfuseRayBallSpiral(struct Sprite *); static void AnimConfuseRayBallSpiral_Step(struct Sprite *); static void AnimTask_NightShadeClone_Step1(u8 taskId); static void AnimTask_NightShadeClone_Step2(u8 taskId); -static void AnimShadowBall(struct Sprite *); static void AnimShadowBall_Step(struct Sprite *); static void AnimLick(struct Sprite *); static void AnimLick_Step(struct Sprite *); @@ -35,9 +35,7 @@ static void AnimCurseNail(struct Sprite *); static void AnimCurseNail_Step1(struct Sprite *); static void AnimCurseNail_Step2(struct Sprite *); static void AnimCurseNail_End(struct Sprite *); -static void AnimGhostStatusSprite(struct Sprite *); static void AnimGhostStatusSprite_Step(struct Sprite *); -static void AnimTask_GrudgeFlames_Step(u8 taskId); static void AnimGrudgeFlame(struct Sprite *); static void sub_8112F60(struct Sprite *); static void sub_8112FB8(struct Sprite *); @@ -82,7 +80,7 @@ static const union AffineAnimCmd sAffineAnim_ShadowBall[] = AFFINEANIMCMD_JUMP(0), }; -static const union AffineAnimCmd *const sAffineAnims_ShadowBall[] = +const union AffineAnimCmd *const gAffineAnims_ShadowBall[] = { sAffineAnim_ShadowBall, }; @@ -94,10 +92,43 @@ const struct SpriteTemplate gShadowBallSpriteTemplate = .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_ShadowBall, + .affineAnims = gAffineAnims_ShadowBall, .callback = AnimShadowBall, }; +const struct SpriteTemplate gEnergyBallSpriteTemplate = +{ + .tileTag = ANIM_TAG_ENERGY_BALL, + .paletteTag = ANIM_TAG_ENERGY_BALL, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_ShadowBall, + .callback = AnimShadowBall, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_LeafStorm = +{ + .tileTag = ANIM_TAG_RAZOR_LEAF, + .paletteTag = ANIM_TAG_RAZOR_LEAF, + .oam = &gOamData_AffineOff_ObjNormal_32x16, + .anims = gAffineAnims_AirWaveCrescent, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimAirWaveCrescent, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_LeafStorm2 = +{ + .tileTag = ANIM_TAG_LEAF, + .paletteTag = ANIM_TAG_LEAF, + .oam = &gOamData_AffineDouble_ObjNormal_16x16, + .anims = gRazorLeafParticleAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_PoisonProjectile, + .callback = AnimNeedleArmSpike, +}; + static const union AnimCmd sAnim_Lick[] = { ANIMCMD_FRAME(0, 2), @@ -147,6 +178,17 @@ const struct SpriteTemplate gDestinyBondWhiteShadowSpriteTemplate = .callback = AnimDestinyBondWhiteShadow, }; +const struct SpriteTemplate gDarkVoidBlackHoleTemplate = +{ + .tileTag = ANIM_TAG_WHITE_SHADOW, + .paletteTag = ANIM_TAG_QUICK_GUARD_HAND, + .oam = &gOamData_AffineOff_ObjBlend_64x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimDestinyBondWhiteShadow +}; + const struct SpriteTemplate gCurseNailSpriteTemplate = { .tileTag = ANIM_TAG_NAIL, @@ -217,6 +259,17 @@ const struct SpriteTemplate gUnknown_08596E48 = .callback = sub_8112F60, }; +const struct SpriteTemplate gFlashCannonBallMovementTemplate = +{ + .tileTag = ANIM_TAG_FLASH_CANNON_BALL, + .paletteTag = ANIM_TAG_FLASH_CANNON_BALL, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_ShadowBall, + .callback = AnimShadowBall +}; + static void AnimConfuseRayBallBounce(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, 1); @@ -400,7 +453,7 @@ static void AnimTask_NightShadeClone_Step2(u8 taskId) // arg 0: duration step 1 (attacker -> center) // arg 1: duration step 2 (spin center) // arg 2: duration step 3 (center -> target) -static void AnimShadowBall(struct Sprite *sprite) +void AnimShadowBall(struct Sprite *sprite) { s16 oldPosX = sprite->pos1.x; s16 oldPosY = sprite->pos1.y; @@ -822,7 +875,11 @@ void AnimTask_DestinyBondWhiteShadow(u8 taskId) && battler != (gBattleAnimAttacker ^ 2) && IsBattlerSpriteVisible(battler)) { - spriteId = CreateSprite(&gDestinyBondWhiteShadowSpriteTemplate, baseX, baseY, 55); + if (gAnimMoveIndex == MOVE_DARK_VOID) + spriteId = CreateSprite(&gDarkVoidBlackHoleTemplate, baseX, baseY, 55); //dark void + else + spriteId = CreateSprite(&gDestinyBondWhiteShadowSpriteTemplate, baseX, baseY, 55); //destiny bond + if (spriteId != MAX_SPRITES) { x = GetBattlerSpriteCoord(battler, 2); @@ -844,7 +901,11 @@ void AnimTask_DestinyBondWhiteShadow(u8 taskId) } else { - spriteId = CreateSprite(&gDestinyBondWhiteShadowSpriteTemplate, baseX, baseY, 55); + if (gAnimMoveIndex == MOVE_DARK_VOID) + spriteId = CreateSprite(&gDarkVoidBlackHoleTemplate, baseX, baseY, 55); //dark void + else + spriteId = CreateSprite(&gDestinyBondWhiteShadowSpriteTemplate, baseX, baseY, 55); //destiny bond + if (spriteId != MAX_SPRITES) { x = 48; @@ -1125,7 +1186,7 @@ static void AnimCurseNail_End(struct Sprite *sprite) DestroyAnimSprite(sprite); } -static void AnimGhostStatusSprite(struct Sprite *sprite) +void AnimGhostStatusSprite(struct Sprite *sprite) { u16 coeffB; u16 coeffA; @@ -1194,7 +1255,7 @@ void AnimTask_GrudgeFlames(u8 taskId) task->func = AnimTask_GrudgeFlames_Step; } -static void AnimTask_GrudgeFlames_Step(u8 taskId) +void AnimTask_GrudgeFlames_Step(u8 taskId) { u16 i; u8 spriteId; diff --git a/src/battle_anim_ground.c b/src/battle_anim_ground.c index 875ecbd75d..8c1442fd4c 100644 --- a/src/battle_anim_ground.c +++ b/src/battle_anim_ground.c @@ -8,14 +8,11 @@ static void AnimBonemerangProjectile(struct Sprite *); static void AnimBoneHitProjectile(struct Sprite *); -static void AnimDirtScatter(struct Sprite *); -static void AnimMudSportDirt(struct Sprite *); static void AnimDirtPlumeParticle(struct Sprite *); static void AnimDirtPlumeParticle_Step(struct Sprite *); static void AnimDigDirtMound(struct Sprite *); static void AnimBonemerangProjectile_Step(struct Sprite *); static void AnimBonemerangProjectile_End(struct Sprite *); -static void AnimMudSportDirtRising(struct Sprite *); static void AnimMudSportDirtFalling(struct Sprite *); static void AnimTask_DigBounceMovement(u8); static void AnimTask_DigEndBounceMovementSetInvisible(u8); @@ -44,7 +41,7 @@ static const union AffineAnimCmd *const sAffineAnims_Bonemerang[] = sAffineAnim_Bonemerang, }; -static const union AffineAnimCmd *const sAffineAnims_SpinningBone[] = +const union AffineAnimCmd *const gAffineAnims_SpinningBone[] = { sAffineAnim_SpinningBone, }; @@ -67,7 +64,7 @@ const struct SpriteTemplate gSpinningBoneSpriteTemplate = .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_SpinningBone, + .affineAnims = gAffineAnims_SpinningBone, .callback = AnimBoneHitProjectile, }; @@ -137,6 +134,28 @@ const struct SpriteTemplate gDirtMoundSpriteTemplate = .callback = AnimDigDirtMound, }; +const struct SpriteTemplate gMudBombSplash = +{ + .tileTag = ANIM_TAG_MUD_SAND, + .paletteTag = ANIM_TAG_MUD_SAND, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSludgeBombHitParticle, +}; + +const struct SpriteTemplate gMudBombToss = +{ + .tileTag = ANIM_TAG_MUD_SAND, + .paletteTag = ANIM_TAG_MUD_SAND, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = sAnims_MudSlapMud, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimThrowProjectile, +}; + // Moves a bone projectile towards the target mon, which moves like // a boomerang. After hitting the target mon, it comes back to the user. static void AnimBonemerangProjectile(struct Sprite *sprite) @@ -186,7 +205,7 @@ static void AnimBoneHitProjectile(struct Sprite *sprite) InitSpritePosToAnimTarget(sprite, TRUE); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; - + sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[3]; @@ -200,7 +219,7 @@ static void AnimBoneHitProjectile(struct Sprite *sprite) // arg 2: duration // arg 3: target x pixel offset // arg 4: target y pixel offset -static void AnimDirtScatter(struct Sprite *sprite) +void AnimDirtScatter(struct Sprite *sprite) { u8 targetXPos, targetYPos; s16 xOffset, yOffset; @@ -229,7 +248,7 @@ static void AnimDirtScatter(struct Sprite *sprite) // arg 0: 0 = dirt is rising into the air, 1 = dirt is falling down // arg 1: initial x pixel offset // arg 2: initial y pixel offset -static void AnimMudSportDirt(struct Sprite *sprite) +void AnimMudSportDirt(struct Sprite *sprite) { sprite->oam.tileNum++; if (gBattleAnimArgs[0] == 0) @@ -248,7 +267,7 @@ static void AnimMudSportDirt(struct Sprite *sprite) } } -static void AnimMudSportDirtRising(struct Sprite *sprite) +void AnimMudSportDirtRising(struct Sprite *sprite) { if (++sprite->data[1] > 1) { @@ -557,7 +576,6 @@ static void AnimDigDirtMound(struct Sprite *sprite) sprite->callback = WaitAnimForDuration; } - #define tState data[0] #define tDelay data[1] #define tTimer data[2] diff --git a/src/battle_anim_ice.c b/src/battle_anim_ice.c index 24ddf3b32c..c3aa2680b0 100644 --- a/src/battle_anim_ice.c +++ b/src/battle_anim_ice.c @@ -24,18 +24,14 @@ static void sub_810B6C4(struct Sprite *); static void sub_810B848(struct Sprite *); static void AnimIcePunchSwirlingParticle(struct Sprite *); static void AnimIceBeamParticle(struct Sprite *); -static void AnimIceEffectParticle(struct Sprite *); static void AnimFlickerIceEffectParticle(struct Sprite *); static void AnimSwirlingSnowball(struct Sprite *); -static void AnimSwirlingSnowball_Step1(struct Sprite *); static void AnimSwirlingSnowball_Step2(struct Sprite *); static void AnimSwirlingSnowball_End(struct Sprite *); -static void AnimMoveParticleBeyondTarget(struct Sprite *); static void AnimWiggleParticleTowardsTarget(struct Sprite *); static void AnimWaveFromCenterOfTarget(struct Sprite *); static void InitSwirlingFogAnim(struct Sprite *); static void AnimSwirlingFogAnim(struct Sprite *); -static void AnimThrowMistBall(struct Sprite *); static void InitPoisonGasCloudAnim(struct Sprite *); static void MovePoisonGasCloud(struct Sprite *); static void AnimHailBegin(struct Sprite *); @@ -48,6 +44,8 @@ static void AnimTask_Haze2(u8); static void AnimTask_OverlayFogTiles(u8); static void AnimTask_Hail2(u8); static bool8 GenerateHailParticle(u8 hailStructId, u8 affineAnimNum, u8 taskId, u8 c); +static void AvalancheAnim_Step(struct Sprite *sprite); +static void AvalancheAnim_Step2(struct Sprite *sprite); static const union AnimCmd gUnknown_08595A48[] = { @@ -116,7 +114,7 @@ static const union AnimCmd *const gUnknown_08595AA4[] = gUnknown_08595A70, }; -static const union AnimCmd *const sAnims_IceCrystalLarge[] = +const union AnimCmd *const gAnims_IceCrystalLarge[] = { sAnim_IceCrystalLarge, }; @@ -126,12 +124,12 @@ static const union AnimCmd *const sAnims_IceCrystalSmall[] = sAnim_IceCrystalSmall, }; -static const union AnimCmd *const sAnims_Snowball[] = +const union AnimCmd *const gAnims_Snowball[] = { sAnim_Snowball, }; -static const union AnimCmd *const sAnims_BlizzardIceCrystal[] = +const union AnimCmd *const gAnims_BlizzardIceCrystal[] = { sAnim_BlizzardIceCrystal, }; @@ -157,7 +155,7 @@ const struct SpriteTemplate gIceCrystalSpiralInwardLarge = .tileTag = ANIM_TAG_ICE_CRYSTALS, .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineDouble_ObjBlend_8x16, - .anims = sAnims_IceCrystalLarge, + .anims = gAnims_IceCrystalLarge, .images = NULL, .affineAnims = sAffineAnims_IceCrystalSpiralInwardLarge, .callback = AnimIcePunchSwirlingParticle, @@ -190,7 +188,7 @@ const struct SpriteTemplate gIceBeamInnerCrystalSpriteTemplate = .tileTag = ANIM_TAG_ICE_CRYSTALS, .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineNormal_ObjBlend_8x16, - .anims = sAnims_IceCrystalLarge, + .anims = gAnims_IceCrystalLarge, .images = NULL, .affineAnims = sAffineAnims_IceBeamInnerCrystal, .callback = AnimIceBeamParticle, @@ -215,7 +213,7 @@ static const union AffineAnimCmd sAffineAnim_IceCrystalHit[] = AFFINEANIMCMD_END, }; -static const union AffineAnimCmd *const sAffineAnims_IceCrystalHit[] = +const union AffineAnimCmd *const gAffineAnims_IceCrystalHit[] = { sAffineAnim_IceCrystalHit, }; @@ -225,9 +223,9 @@ const struct SpriteTemplate gIceCrystalHitLargeSpriteTemplate = .tileTag = ANIM_TAG_ICE_CRYSTALS, .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineNormal_ObjBlend_8x16, - .anims = sAnims_IceCrystalLarge, + .anims = gAnims_IceCrystalLarge, .images = NULL, - .affineAnims = sAffineAnims_IceCrystalHit, + .affineAnims = gAffineAnims_IceCrystalHit, .callback = AnimIceEffectParticle, }; @@ -238,7 +236,7 @@ const struct SpriteTemplate gIceCrystalHitSmallSpriteTemplate = .oam = &gOamData_AffineNormal_ObjBlend_8x8, .anims = sAnims_IceCrystalSmall, .images = NULL, - .affineAnims = sAffineAnims_IceCrystalHit, + .affineAnims = gAffineAnims_IceCrystalHit, .callback = AnimIceEffectParticle, }; @@ -247,7 +245,7 @@ const struct SpriteTemplate gSwirlingSnowballSpriteTemplate = .tileTag = ANIM_TAG_ICE_CRYSTALS, .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineOff_ObjNormal_8x8, - .anims = sAnims_Snowball, + .anims = gAnims_Snowball, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSwirlingSnowball, @@ -258,7 +256,7 @@ const struct SpriteTemplate gBlizzardIceCrystalSpriteTemplate = .tileTag = ANIM_TAG_ICE_CRYSTALS, .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineOff_ObjNormal_16x16, - .anims = sAnims_BlizzardIceCrystal, + .anims = gAnims_BlizzardIceCrystal, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMoveParticleBeyondTarget, @@ -269,7 +267,7 @@ const struct SpriteTemplate gPowderSnowSnowballSpriteTemplate = .tileTag = ANIM_TAG_ICE_CRYSTALS, .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineOff_ObjNormal_8x8, - .anims = sAnims_Snowball, + .anims = gAnims_Snowball, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMoveParticleBeyondTarget, @@ -456,7 +454,7 @@ static const union AnimCmd sAnim_IceBallChunk_1[] = ANIMCMD_END, }; -static const union AnimCmd *const sAnims_IceBallChunk[] = +const union AnimCmd *const gAnims_IceBallChunk[] = { sAnim_IceBallChunk_0, sAnim_IceBallChunk_1, @@ -506,7 +504,7 @@ const struct SpriteTemplate gIceBallChunkSpriteTemplate = .tileTag = ANIM_TAG_ICE_CHUNK, .paletteTag = ANIM_TAG_ICE_CHUNK, .oam = &gOamData_AffineDouble_ObjNormal_32x32, - .anims = sAnims_IceBallChunk, + .anims = gAnims_IceBallChunk, .images = NULL, .affineAnims = sAffineAnims_IceBallChunk, .callback = InitIceBallAnim, @@ -523,6 +521,91 @@ const struct SpriteTemplate gIceBallImpactShardSpriteTemplate = .callback = InitIceBallParticle, }; +const union AnimCmd gAvalancheAnimTable_1[] = +{ + ANIMCMD_FRAME(32, 1), + ANIMCMD_END, +}; + +const union AnimCmd gAvalancheAnimTable_2[] = +{ + ANIMCMD_FRAME(48, 1), + ANIMCMD_END, +}; + +const union AnimCmd gAvalancheAnimTable_3[] = +{ + ANIMCMD_FRAME(64, 1), + ANIMCMD_END, +}; + +const union AnimCmd *const gAvalancheAnimCmd[] = +{ + gAvalancheAnimTable_1, + gAvalancheAnimTable_2, + gAvalancheAnimTable_3, +}; + +const struct SpriteTemplate gAvalancheSpriteTemplate = +{ + .tileTag = ANIM_TAG_ROCKS, + .paletteTag = ANIM_TAG_ICE_CHUNK, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAvalancheAnimCmd, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AvalancheAnim_Step, +}; + +const struct SpriteTemplate gChatterSingNotesTemplate = +{ + .tileTag = ANIM_TAG_MUSIC_NOTES, + .paletteTag = ANIM_TAG_MUSIC_NOTES, + .oam = &gOamData_AffineDouble_ObjNormal_16x16, + .anims = gMusicNotesAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_IceCrystalHit, + .callback = AnimIceEffectParticle +}; + +static void AvalancheAnim_Step(struct Sprite *sprite) +{ + if (gBattleAnimArgs[3] != 0) + SetAverageBattlerPositions(gBattleAnimTarget, 0, &sprite->pos1.x, &sprite->pos1.y); + + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += 14; + + StartSpriteAnim(sprite, gBattleAnimArgs[1]); + AnimateSprite(sprite); + + sprite->data[0] = 0; + sprite->data[1] = 0; + sprite->data[2] = 4; + sprite->data[3] = 16; + sprite->data[4] = -70; + sprite->data[5] = gBattleAnimArgs[2]; + + StoreSpriteCallbackInData6(sprite, AvalancheAnim_Step2); + sprite->callback = TranslateSpriteInEllipseOverDuration; + sprite->callback(sprite); +} + +static void AvalancheAnim_Step2(struct Sprite *sprite) +{ + sprite->pos1.x += sprite->data[5]; + + sprite->data[0] = 192; + sprite->data[1] = sprite->data[5]; + sprite->data[2] = 4; + sprite->data[3] = 32; + sprite->data[4] = -24; + + StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); + sprite->callback = TranslateSpriteInEllipseOverDuration; + sprite->callback(sprite); +} + // Unused static void sub_810B6C4(struct Sprite *sprite) { @@ -623,7 +706,7 @@ static void AnimIceBeamParticle(struct Sprite *sprite) // arg 0: target x offset // arg 1: target y offset // arg 2: ??? unknown boolean -static void AnimIceEffectParticle(struct Sprite *sprite) +void AnimIceEffectParticle(struct Sprite *sprite) { if (gBattleAnimArgs[2] == 0) { @@ -714,7 +797,7 @@ static void AnimSwirlingSnowball(struct Sprite *sprite) StoreSpriteCallbackInData6(sprite, AnimSwirlingSnowball_Step1); } -static void AnimSwirlingSnowball_Step1(struct Sprite *sprite) +void AnimSwirlingSnowball_Step1(struct Sprite *sprite) { s16 tempVar; @@ -778,7 +861,7 @@ static void AnimSwirlingSnowball_End(struct Sprite *sprite) // arg 5: wave amplitude // arg 6: wave frequency // arg 7: multiple targets? (boolean) -static void AnimMoveParticleBeyondTarget(struct Sprite *sprite) +void AnimMoveParticleBeyondTarget(struct Sprite *sprite) { int i; s16 tempDataHolder[8]; @@ -1080,7 +1163,7 @@ static void AnimTask_Haze2(u8 taskId) // arg 3: target y offset // arg 4: duration // arg 5: ??? unknown (seems to vibrate target mon somehow) -static void AnimThrowMistBall(struct Sprite *sprite) +void AnimThrowMistBall(struct Sprite *sprite) { sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); diff --git a/src/battle_anim_mon_movement.c b/src/battle_anim_mon_movement.c index e789e46800..4b6d53304e 100644 --- a/src/battle_anim_mon_movement.c +++ b/src/battle_anim_mon_movement.c @@ -27,6 +27,7 @@ static void AnimTask_ScaleMonAndRestore_Step(u8 taskId); static void AnimTask_RotateMonSpriteToSide_Step(u8 taskId); static void AnimTask_ShakeTargetBasedOnMovePowerOrDmg_Step(u8 taskId); static void AnimTask_SlideOffScreen_Step(u8 taskId); +static void AnimTask_RotateVerticallyStep(u8 taskId); const struct SpriteTemplate gHorizontalLungeSpriteTemplate = { @@ -764,6 +765,11 @@ void AnimTask_SwayMon(u8 taskId) gBattleAnimArgs[1] = -gBattleAnimArgs[1]; spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[4]); + if (spriteId == 0xff) + { + DestroyAnimVisualTask(taskId); + return; + } gTasks[taskId].data[0] = gBattleAnimArgs[0]; gTasks[taskId].data[1] = gBattleAnimArgs[1]; gTasks[taskId].data[2] = gBattleAnimArgs[2]; @@ -1057,3 +1063,68 @@ static void AnimTask_ShakeTargetBasedOnMovePowerOrDmg_Step(u8 taskId) } } } + +#define tSpriteId data[0] +#define tRotSpeed data[1] +#define tRotCurr data[2] +#define tPhase data[3] +#define tFrames data[4] +#define tPlayerSide data[5] +#define tRotMax data[6] // Can't fully flip back sprites + +void AnimTask_RotateVertically(u8 taskId) +{ + u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); + + PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_NORMAL); + gTasks[taskId].tSpriteId = spriteId; + gTasks[taskId].tRotCurr = 0; + gTasks[taskId].tPlayerSide = ((GetBattlerSide(GetAnimBattlerId(gBattleAnimArgs[0]))) == B_SIDE_PLAYER); + gTasks[taskId].tRotMax = gTasks[taskId].tPlayerSide ? 0x1FFF : 0x7FFE; + gTasks[taskId].tRotSpeed = gBattleAnimArgs[1]; + gTasks[taskId].func = AnimTask_RotateVerticallyStep; +} + +static void AnimTask_RotateVerticallyStep(u8 taskId) +{ + switch (gTasks[taskId].tPhase) + { + case 0: // flip upside-down + gTasks[taskId].tRotCurr = min(abs(gTasks[taskId].tRotCurr + gTasks[taskId].tRotSpeed), gTasks[taskId].tRotMax); + SetSpriteRotScale(gTasks[taskId].tSpriteId, 0x100, 0x100, gTasks[taskId].tRotCurr); + if (gTasks[taskId].tPlayerSide) + SetBattlerSpriteYOffsetFromRotation(gTasks[taskId].tSpriteId); + + if (gTasks[taskId].tRotCurr == gTasks[taskId].tRotMax) + gTasks[taskId].tPhase++; + break; + case 1: // Wait a bit + if (++gTasks[taskId].tFrames >= 75) + gTasks[taskId].tPhase++; + break; + case 2: // rotate back + if (gTasks[taskId].tRotCurr < gTasks[taskId].tRotSpeed) + gTasks[taskId].tRotCurr = 0; + else + gTasks[taskId].tRotCurr = gTasks[taskId].tRotCurr - gTasks[taskId].tRotSpeed; + SetSpriteRotScale(gTasks[taskId].tSpriteId, 0x100, 0x100, gTasks[taskId].tRotCurr); + if (gTasks[taskId].tPlayerSide) + SetBattlerSpriteYOffsetFromRotation(gTasks[taskId].tSpriteId); + + if (gTasks[taskId].tRotCurr == 0) + gTasks[taskId].tPhase++; + break; + case 3: // end + ResetSpriteRotScale(gTasks[taskId].tSpriteId); + DestroyAnimVisualTask(taskId); + break; + } +} + +#undef tSpriteId +#undef tRotSpeed +#undef tRotCurr +#undef tPhase +#undef tFrames +#undef tPlayerSide +#undef tRotMax diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index d626e16041..c7c0e0b65f 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -118,6 +118,7 @@ u8 GetBattlerSpriteCoord(u8 battlerId, u8 coordType) { u8 retVal; u16 species; + struct Pokemon *mon, *illusionMon; struct BattleSpriteInfo *spriteInfo; if (IsContest()) @@ -148,21 +149,18 @@ u8 GetBattlerSpriteCoord(u8 battlerId, u8 coordType) else { if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) - { - spriteInfo = gBattleSpritesDataPtr->battlerData; - if (!spriteInfo[battlerId].transformSpecies) - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); - else - species = spriteInfo[battlerId].transformSpecies; - } + mon = &gEnemyParty[gBattlerPartyIndexes[battlerId]]; else - { - spriteInfo = gBattleSpritesDataPtr->battlerData; - if (!spriteInfo[battlerId].transformSpecies) - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); - else - species = spriteInfo[battlerId].transformSpecies; - } + mon = &gPlayerParty[gBattlerPartyIndexes[battlerId]]; + + illusionMon = GetIllusionMonPtr(battlerId); + if (illusionMon != NULL) + mon = illusionMon; + spriteInfo = gBattleSpritesDataPtr->battlerData; + if (!spriteInfo[battlerId].transformSpecies) + species = GetMonData(mon, MON_DATA_SPECIES); + else + species = spriteInfo[battlerId].transformSpecies; } if (coordType == BATTLER_COORD_Y_PIC_OFFSET) retVal = GetBattlerSpriteFinal_Y(battlerId, species, TRUE); @@ -794,6 +792,46 @@ void InitSpritePosToAnimAttacker(struct Sprite *sprite, bool8 respectMonPicOffse sprite->pos1.y += gBattleAnimArgs[1]; } +void InitSpritePosToAnimAttackerPartner(struct Sprite *sprite, bool8 respectMonPicOffsets) +{ + if (!respectMonPicOffsets) + { + sprite->pos1.x = GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimAttacker), BATTLER_COORD_X); + sprite->pos1.y = GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimAttacker), BATTLER_COORD_Y); + } + else + { + sprite->pos1.x = GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimAttacker), BATTLER_COORD_X_2); + sprite->pos1.y = GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimAttacker), BATTLER_COORD_Y_PIC_OFFSET); + } + SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); + sprite->pos1.y += gBattleAnimArgs[1]; +} + +bool32 InitSpritePosToAnimBattler(u32 animBattlerId, struct Sprite *sprite, bool8 respectMonPicOffsets) +{ + u32 battlerId = GetAnimBattlerId(animBattlerId); + if (GetAnimBattlerSpriteId(animBattlerId) == 0xFF || !IsBattlerSpriteVisible(battlerId)) + { + DestroyAnimSprite(sprite); + return FALSE; + } + + if (!respectMonPicOffsets) + { + sprite->pos1.x = GetBattlerSpriteCoord2(battlerId, BATTLER_COORD_X); + sprite->pos1.y = GetBattlerSpriteCoord2(battlerId, BATTLER_COORD_Y); + } + else if (animBattlerId != ANIM_TARGET) + { + sprite->pos1.x = GetBattlerSpriteCoord2(battlerId, BATTLER_COORD_X_2); + sprite->pos1.y = GetBattlerSpriteCoord2(battlerId, BATTLER_COORD_Y_PIC_OFFSET); + } + SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); + sprite->pos1.y += gBattleAnimArgs[1]; + return TRUE; +} + u8 GetBattlerSide(u8 battlerId) { return GET_BATTLER_SIDE2(battlerId); @@ -830,21 +868,23 @@ bool8 IsBattlerSpritePresent(u8 battlerId) else { if (gBattlerPositions[battlerId] == 0xff) - { return FALSE; - } - else if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) + + if (!gBattleStruct->spriteIgnore0Hp) { - if (GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_HP) != 0) - return TRUE; - } - else - { - if (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_HP) != 0) - return TRUE; + if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT) + { + if (GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_HP) == 0) + return FALSE; + } + else + { + if (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_HP) == 0) + return FALSE; + } } + return TRUE; } - return FALSE; } bool8 IsDoubleBattle(void) @@ -1465,10 +1505,14 @@ void AnimSpriteOnMonPos(struct Sprite *sprite) var = TRUE; else var = FALSE; - if (!gBattleAnimArgs[2]) + + if (gBattleAnimArgs[2] == 0) InitSpritePosToAnimAttacker(sprite, var); - else + else if (gBattleAnimArgs[2] == 1) InitSpritePosToAnimTarget(sprite, var); + else if (gBattleAnimArgs[2] == 2) + InitSpritePosToAnimAttackerPartner(sprite, var); + sprite->data[0]++; } diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c new file mode 100644 index 0000000000..1129af88b9 --- /dev/null +++ b/src/battle_anim_new.c @@ -0,0 +1,4994 @@ +#include "global.h" +#include "battle_anim.h" +#include "item_menu_icons.h" +#include "sprite.h" +#include "random.h" +#include "gpu_regs.h" +#include "item.h" +#include "item_icon.h" +#include "sound.h" +#include "menu.h" +#include "malloc.h" +#include "util.h" +#include "graphics.h" +#include "battle_scripts.h" +#include "battle_controllers.h" +#include "constants/moves.h" + +//// function declarations +static void SpriteCB_SpriteToCentreOfSide(struct Sprite* sprite); +static void SpriteCB_SpriteOnMonForDuration(struct Sprite *sprite); +static void SpriteCB_ToxicThreadWrap(struct Sprite *sprite); +static void SpriteCB_GrowingSuperpower(struct Sprite *sprite); +static void SpriteCB_CentredSpiderWeb(struct Sprite* sprite); +static void SpriteCB_CoreEnforcerHits(struct Sprite* sprite); +static void SpriteCB_CoreEnforcerBeam(struct Sprite* sprite); +static void SpriteCB_TranslateAnimSpriteToTargetMonLocationDoubles(struct Sprite* sprite); +static void SpriteCB_FallingObject(struct Sprite *sprite); +static void SpriteCB_FallingObjectStep(struct Sprite *sprite); +static void SpriteCB_SunsteelStrikeRings(struct Sprite* sprite); +static void SpriteCB_MoongeistCharge(struct Sprite *sprite); +static void SpriteCB_MindBlownBall(struct Sprite *sprite); +static void AnimMindBlownBallStep(struct Sprite *sprite); +static void SpriteCB_MindBlownExplosion(struct Sprite* sprite); +static void SpriteCB_RandomCentredHits(struct Sprite* sprite); +static void SpriteCB_LockingJaw(struct Sprite *sprite); +static void SpriteCB_LockingJawStep(struct Sprite *sprite); +static void SpriteCB_LockingJawFinish(struct Sprite *sprite); +static void SpriteCB_LeftRightSlice(struct Sprite *sprite); +static void SpriteCB_LeftRightSliceStep1(struct Sprite *sprite); +static void SpriteCB_LeftRightSliceStep0(struct Sprite *sprite); +static void SpriteCB_PyroBallRockBounce(struct Sprite* sprite); +static void SpriteCB_PyroBallLaunch(struct Sprite* sprite); +static void SpriteCB_AcidLaunchSingleTarget(struct Sprite *sprite); +static void SpriteCB_AcidDripSingleTarget(struct Sprite *sprite); +static void SpriteCB_WaterDroplet(struct Sprite *sprite); +static void SpriteCB_WaterDropletDrip(struct Sprite *sprite); +static void SpriteCB_WaterDropletDrop(struct Sprite *sprite); +static void SpriteCB_AnimSpriteOnSelectedMonPos(struct Sprite *sprite); +static void SpriteCB_SurroundingRing(struct Sprite *sprite); +static void SpriteCB_PhotonGeyserBeam(struct Sprite* sprite); +static void SpriteCB_BeamUpStep(struct Sprite* sprite); +static void SpriteCB_CentredElectricity(struct Sprite* sprite); +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); + +//////// const data +//// general +static const union AffineAnimCmd sSquishTargetAffineAnimCmds[] = +{ + AFFINEANIMCMD_FRAME(0, 64, 0, 16), //Flatten + AFFINEANIMCMD_FRAME(0, 0, 0, 64), + AFFINEANIMCMD_FRAME(0, -64, 0, 16), + AFFINEANIMCMD_END, +}; + +//// GEN 5 +//wide guard +const struct SpriteTemplate gWideGuardBlueConversionTemplate = +{ + .tileTag = ANIM_TAG_CONVERSION, + .paletteTag = ANIM_TAG_WATER_ORB, + .oam = &gOamData_AffineDouble_ObjBlend_8x8, + .anims = gConversionAnimTable, + .images = NULL, + .affineAnims = gConversionAffineAnimTable, + .callback = AnimConversion +}; + +//guard split +const struct SpriteTemplate gGuardSwapOrbs1Template = +{ + .tileTag = ANIM_TAG_BLUEGREEN_ORB, + .paletteTag = ANIM_TAG_BLUEGREEN_ORB, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = AnimMimicOrb +}; + +const struct SpriteTemplate gGuardSwapOrbs2Template = +{ + .tileTag = ANIM_TAG_BLUEGREEN_ORB, + .paletteTag = ANIM_TAG_BLUEGREEN_ORB, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = AnimMissileArc +}; + +// power split +const struct SpriteTemplate gPowerSplitOrbs1Template = +{ + .tileTag = ANIM_TAG_BLUEGREEN_ORB, + .paletteTag = ANIM_TAG_RED_HEART, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = AnimMimicOrb +}; + +const struct SpriteTemplate gPowerSplitOrbs2Template = +{ + .tileTag = ANIM_TAG_BLUEGREEN_ORB, + .paletteTag = ANIM_TAG_RED_HEART, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = AnimMissileArc +}; + +// automotize +const struct SpriteTemplate gAutotomizeMetalShardsTemplate = +{ + .tileTag = ANIM_TAG_METAL_BITS, + .paletteTag = ANIM_TAG_METAL_BITS, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_TearDrop, + .callback = AnimTearDrop +}; + +//rage powder +const struct SpriteTemplate gRagePowderRedPowderTemplate = +{ + .tileTag = ANIM_TAG_SPORE, + .paletteTag = ANIM_TAG_HEART_STAMP, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gSporeParticleAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSporeParticle +}; + +//flame charge +const struct SpriteTemplate gFlameChargeEmberTemplate = +{ + .tileTag = ANIM_TAG_SMALL_EMBER, + .paletteTag = ANIM_TAG_SMALL_EMBER, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_FlamethrowerFlame, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimPetalDanceBigFlower +}; + +//final gambit +const struct SpriteTemplate gFinalGambitBlueYawnTemplate = +{ + .tileTag = ANIM_TAG_PINK_CLOUD, + .paletteTag = ANIM_TAG_WATER_IMPACT, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_ShadowBall, + .callback = AnimShadowBall +}; + +const struct SpriteTemplate gFinalGambitExplosionTemplate = +{ + .tileTag = ANIM_TAG_EXPLOSION, + .paletteTag = ANIM_TAG_WATER_IMPACT, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gExplosionAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; + +//synchronoise +const struct SpriteTemplate gSynchronoiseVioletRingTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_AffineDouble_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gHyperVoiceRingAffineAnimTable, + .callback = AnimHyperVoiceRing +}; + +const struct SpriteTemplate gSynchronoiseYellowRingTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_SPARK_2, + .oam = &gOamData_AffineDouble_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gHyperVoiceRingAffineAnimTable, + .callback = AnimHyperVoiceRing +}; + +const struct SpriteTemplate gSynchronoiseBlueRingTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_WATER_ORB, + .oam = &gOamData_AffineDouble_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gHyperVoiceRingAffineAnimTable, + .callback = AnimHyperVoiceRing +}; + +const struct SpriteTemplate gSynchronoiseAeroWheelTemplate = +{ + .tileTag = ANIM_TAG_AIR_WAVE_2, + .paletteTag = ANIM_TAG_AIR_WAVE_2, + .oam = &gOamData_AffineOff_ObjNormal_32x16, + .anims = gAffineAnims_AirWaveCrescent, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpread +}; + +//electro ball +const struct SpriteTemplate gElectroBallCannonBallTemplate = +{ + .tileTag = ANIM_TAG_FLASH_CANNON_BALL, + .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_ShadowBall, + .callback = AnimShadowBall +}; + +//foul play +const struct SpriteTemplate gFoulPlayImpactTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_HANDS_AND_FEET, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = AnimHitSplatBasic +}; + +const struct SpriteTemplate gFoulPlayRingTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_AffineDouble_ObjNormal_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gThinRingExpandingAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; + +//simple beam +const struct SpriteTemplate gSimpleBeamBrownTemplate = +{ + .tileTag = ANIM_TAG_GOLD_RING, + .paletteTag = ANIM_TAG_ROCKS, + .oam = &gOamData_AffineOff_ObjNormal_16x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = TranslateAnimSpriteToTargetMonLocation +}; + +const struct SpriteTemplate gSimpleBeamPinkTemplate = +{ + .tileTag = ANIM_TAG_GOLD_RING, + .paletteTag = ANIM_TAG_PINK_PETAL, + .oam = &gOamData_AffineOff_ObjNormal_16x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = TranslateAnimSpriteToTargetMonLocation +}; + +const struct SpriteTemplate gSimpleBeamBrownRingTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_ROCKS, + .oam = &gOamData_AffineDouble_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gThinRingExpandingAffineAnimTable, + .callback = AnimUproarRing +}; + +const struct SpriteTemplate gSimpleBeamPinkRingTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_PINK_PETAL, + .oam = &gOamData_AffineDouble_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gThinRingExpandingAffineAnimTable, + .callback = AnimUproarRing +}; + +// after you +const struct SpriteTemplate gAfterYouGreenRageTemplate = +{ + .tileTag = ANIM_TAG_ANGER, + .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAngerMarkAffineAnimTable, + .callback = AnimAngerMark +}; + +//quick guard +const struct SpriteTemplate gQuickGuardArmImpactTemplate = +{ + .tileTag = ANIM_TAG_QUICK_GUARD_HAND, + .paletteTag = ANIM_TAG_QUICK_GUARD_HAND, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_HandOrFoot, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimBasicFistOrFoot +}; + +//sky drop +static const union AffineAnimCmd sSkyDropFlyBallAffineAnimCmd_0[] = +{ + AFFINEANIMCMD_FRAME(0xa0, 0x100, 0x50, 0x0), //.hword 0xa0, 0x100, 0x50, 0x0, + AFFINEANIMCMD_END +}; +static const union AffineAnimCmd *const sSkyDropFlyBallAffineAnimCmds[] = +{ + sSkyDropFlyBallAffineAnimCmd_0 +}; +const struct SpriteTemplate gSkyDropFlyBallTemplate = +{ + .tileTag = ANIM_TAG_ROUND_SHADOW, + .paletteTag = ANIM_TAG_ROUND_SHADOW, + .oam = &gOamData_AffineDouble_ObjNormal_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = sSkyDropFlyBallAffineAnimCmds, + .callback = AnimThrowMistBall +}; + +const struct SpriteTemplate gSkyDropTargetFlyingTemplate = +{ + .tileTag = ANIM_TAG_ROUND_SHADOW, + .paletteTag = ANIM_TAG_ROUND_SHADOW, + .oam = &gOamData_AffineDouble_ObjNormal_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_FlyBallUp, + .callback = AnimSkyDropBallUp +}; + +//shift gear +const struct SpriteTemplate gShiftGearGearsTemplate = +{ + .tileTag = ANIM_TAG_GEAR, + .paletteTag = ANIM_TAG_GEAR, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_SpinningBone, + .callback = SpriteCB_SpriteOnMonForDuration +}; + +//circle throw +const struct SpriteTemplate gCircleThrowRingTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_ICE_CHUNK, + .oam = &gOamData_AffineDouble_ObjNormal_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gThinRingExpandingAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; + +//quash +const struct SpriteTemplate gQuashArmHitTemplate = +{ + .tileTag = ANIM_TAG_ASSURANCE_HAND, + .paletteTag = ANIM_TAG_ASSURANCE_HAND, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_HandOrFoot, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimStompFoot +}; + +//reflect type +const struct SpriteTemplate gReflectTypeBlueStringTemplate = +{ + .tileTag = ANIM_TAG_GUARD_RING, + .paletteTag = ANIM_TAG_ICE_CHUNK, + .oam = &gOamData_AffineOff_ObjBlend_64x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_ToxicThreadWrap +}; + +const struct SpriteTemplate gReflectTypeVioletStringTemplate = +{ + .tileTag = ANIM_TAG_GUARD_RING, + .paletteTag = ANIM_TAG_PURPLE_FLAME, + .oam = &gOamData_AffineOff_ObjBlend_64x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_ToxicThreadWrap +}; + +const struct SpriteTemplate gReflectTypeWhiteStringTemplate = +{ + .tileTag = ANIM_TAG_GUARD_RING, + .paletteTag = ANIM_TAG_GUARD_RING, + .oam = &gOamData_AffineOff_ObjBlend_64x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_ToxicThreadWrap +}; + +const struct SpriteTemplate gReflectTypeWhiteRingTemplate = +{ + .tileTag = ANIM_TAG_GUARD_RING, + .paletteTag = ANIM_TAG_GUARD_RING, + .oam = &gOamData_AffineDouble_ObjBlend_64x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gGuardRingAffineAnimTable, + .callback = SpriteCB_SurroundingRing +}; + +const struct SpriteTemplate gReflectTypePinkRingTemplate = +{ + .tileTag = ANIM_TAG_GUARD_RING, + .paletteTag = ANIM_TAG_PINK_PETAL, + .oam = &gOamData_AffineDouble_ObjBlend_64x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gGuardRingAffineAnimTable, + .callback = SpriteCB_SurroundingRing +}; + +const struct SpriteTemplate gReflectTypeVioletRingTemplate = +{ + .tileTag = ANIM_TAG_GUARD_RING, + .paletteTag = ANIM_TAG_PURPLE_FLAME, + .oam = &gOamData_AffineDouble_ObjBlend_64x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gGuardRingAffineAnimTable, + .callback = SpriteCB_SurroundingRing +}; + +const struct SpriteTemplate gReflectTypeBlueRingTemplate = +{ + .tileTag = ANIM_TAG_GUARD_RING, + .paletteTag = ANIM_TAG_ICE_CHUNK, + .oam = &gOamData_AffineDouble_ObjBlend_64x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gGuardRingAffineAnimTable, + .callback = SpriteCB_SurroundingRing +}; + +//frost breath +const struct SpriteTemplate gFrostBreathBlueRageTemplate = +{ + .tileTag = ANIM_TAG_FIRE_PLUME, + .paletteTag = ANIM_TAG_ICE_CHUNK, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_DragonRageFirePlume, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimDragonRageFirePlume +}; + +const struct SpriteTemplate gFrostBreathBlueBreathTemplate = +{ + .tileTag = ANIM_TAG_SMALL_EMBER, + .paletteTag = ANIM_TAG_ICE_CHUNK, + .oam = &gOamData_AffineDouble_ObjNormal_32x32, + .anims = gAnims_DragonRageFire, + .images = NULL, + .affineAnims = gAffineAnims_DragonRageFire, + .callback = AnimDragonFireToTarget +}; + +//heart stamp +const struct SpriteTemplate gHeartStampSpinningHeartTemplate = +{ + .tileTag = ANIM_TAG_HEART_STAMP, + .paletteTag = ANIM_TAG_HEART_STAMP, + .oam = &gOamData_AffineDouble_ObjNormal_32x32, + .anims = gAnims_HandOrFoot, + .images = NULL, + .affineAnims = gAffineAnims_SpinningHandOrFoot, + .callback = AnimSpinningKickOrPunch +}; + +//horn leech +const struct SpriteTemplate gHornLeechHornTemplate = +{ + .tileTag = ANIM_TAG_HORN_LEECH, + .paletteTag = ANIM_TAG_HORN_LEECH, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimShadowBall +}; + +//dual chop +const struct SpriteTemplate gDualChopImpactTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = AnimHitSplatBasic +}; + +//sacred sword +const struct SpriteTemplate gSacredSwordBladesTemplate = +{ + .tileTag = ANIM_TAG_PUNISHMENT_BLADES, + .paletteTag = ANIM_TAG_HYDRO_PUMP, + .oam = &gOamData_AffineDouble_ObjNormal_32x32, + .anims = gAnims_DragonBreathFire, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpread +}; + +const struct SpriteTemplate gSacredSwordCutTemplate = +{ + .tileTag = ANIM_TAG_CUT, + .paletteTag = ANIM_TAG_HYDRO_PUMP, + .oam = &gOamData_AffineOff_ObjBlend_32x32, + .anims = gCuttingSliceAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimCuttingSlice +}; + +//razor shell +const struct SpriteTemplate gRazorShellTemplate = +{ + .tileTag = ANIM_TAG_RAZOR_SHELL, + .paletteTag = ANIM_TAG_RAZOR_SHELL, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_ShadowBall, + .callback = SpriteCB_SpriteOnMonForDuration +}; + +//heat crash +const struct SpriteTemplate gHeatCrashEruptionRockTemplate = +{ + .tileTag = ANIM_TAG_WARM_ROCK, + .paletteTag = ANIM_TAG_WARM_ROCK, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimStompFoot +}; + +//leaf tornado +const struct SpriteTemplate gLeafTornadoVortexTemplate = +{ + .tileTag = ANIM_TAG_LEAF, + .paletteTag = ANIM_TAG_LEAF, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gRazorLeafParticleAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimParticleInVortex +}; + +//cotton guard +const struct SpriteTemplate gCottonGuardSporeTemplate = +{ + .tileTag = ANIM_TAG_SPORE, + .paletteTag = ANIM_TAG_SPORE, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gSporeParticleAnimTable, + .images = NULL, + .affineAnims = gPowerAbsorptionOrbAffineAnimTable, + .callback = AnimPowerAbsorptionOrb +}; + +//night daze +const struct SpriteTemplate gNightDazeVioletRingsTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_PURPLE_FLAME, + .oam = &gOamData_AffineDouble_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gThinRingExpandingAffineAnimTable, + .callback = AnimUproarRing +}; + +const struct SpriteTemplate gNightDazeVioletCirclesTemplate = +{ + .tileTag = ANIM_TAG_RED_ORB, + .paletteTag = ANIM_TAG_PURPLE_FLAME, + .oam = &gOamData_AffineDouble_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gHiddenPowerOrbAffineAnimTable, + .callback = AnimOrbitScatter +}; + +//tail slap +const struct SpriteTemplate gTailSlapTemplate = +{ + .tileTag = ANIM_TAG_PUNISHMENT_BLADES, + .paletteTag = ANIM_TAG_AIR_WAVE_2, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gScratchAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; + +//gear grind +const struct SpriteTemplate gGearGrindTemplate = +{ + .tileTag = ANIM_TAG_GEAR, + .paletteTag = ANIM_TAG_GEAR, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_ShadowBall, + .callback = AnimBite +}; + +//searing shot +const struct SpriteTemplate gSearingShotRedChargeTemplate = +{ + .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .paletteTag = ANIM_TAG_JAGGED_MUSIC_NOTE, + .oam = &gOamData_AffineNormal_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_GrowingElectricOrb, + .callback = AnimGrowingChargeOrb +}; + +const struct SpriteTemplate gSearingShotEruptionRockTemplate = +{ + .tileTag = ANIM_TAG_WARM_ROCK, + .paletteTag = ANIM_TAG_WARM_ROCK, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimOverheatFlame +}; + +static const union AffineAnimCmd sSpriteAffineAnim_SearingShotRock[] = +{ + AFFINEANIMCMD_FRAME(8, 8, 9, 15), + AFFINEANIMCMD_FRAME(-8, -8, 9, 15), + AFFINEANIMCMD_END, +}; +static const union AffineAnimCmd* const sSpriteAffineAnimTable_SearingShotRock[] = +{ + sSpriteAffineAnim_SearingShotRock, +}; +const struct SpriteTemplate gSearingShotEruptionImpactTemplate = +{ + .tileTag = ANIM_TAG_WARM_ROCK, + .paletteTag = ANIM_TAG_WARM_ROCK, + .oam = &gOamData_AffineDouble_ObjNormal_32x32, + .anims = gAnims_HandOrFoot, + .images = NULL, + .affineAnims = sSpriteAffineAnimTable_SearingShotRock, + .callback = SpriteCB_SearingShotRock +}; + +//techno blast +const struct SpriteTemplate gTechnoBlastWhiteChargeTemplate = +{ + .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .paletteTag = ANIM_TAG_AIR_WAVE_2, + .oam = &gOamData_AffineNormal_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_GrowingElectricOrb, + .callback = AnimGrowingChargeOrb +}; +const struct SpriteTemplate gTechnoBlastWhiteCircleTemplate = +{ + .tileTag = ANIM_TAG_ORBS, + .paletteTag = ANIM_TAG_AIR_WAVE_2, + .oam = &gOamData_AffineNormal_ObjBlend_16x16, + .anims = gPowerAbsorptionOrbAnimTable, + .images = NULL, + .affineAnims = gPowerAbsorptionOrbAffineAnimTable, + .callback = AnimPowerAbsorptionOrb +}; +const struct SpriteTemplate gTechnoBlastWhiteBlastTemplate = +{ + .tileTag = ANIM_TAG_BLACK_BALL_2, + .paletteTag = ANIM_TAG_AIR_WAVE_2, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = TranslateAnimSpriteToTargetMonLocation +}; +const struct SpriteTemplate gTechnoBlastWhiteSparkTemplate = +{ + .tileTag = ANIM_TAG_SPARK_2, + .paletteTag = ANIM_TAG_AIR_WAVE_2, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_FlashingSpark, + .callback = AnimZapCannonSpark +}; +const struct SpriteTemplate gTechnoBlastWhiteSmokeTemplate = +{ + .tileTag = ANIM_TAG_GRAY_SMOKE, + .paletteTag = ANIM_TAG_AIR_WAVE_2, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gOctazookaAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; + +const struct SpriteTemplate gTechnoBlastYellowBlastTemplate = +{ + .tileTag = ANIM_TAG_BLACK_BALL_2, + .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = TranslateAnimSpriteToTargetMonLocation +}; +const struct SpriteTemplate gTechnoBlastYellowSparkTemplate = +{ + .tileTag = ANIM_TAG_SPARK_2, + .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_FlashingSpark, + .callback = AnimZapCannonSpark +}; +const struct SpriteTemplate gTechnoBlastYellowSmokeTemplate = +{ + .tileTag = ANIM_TAG_GRAY_SMOKE, + .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gOctazookaAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; + +const struct SpriteTemplate gTechnoBlastBlueChargeTemplate = +{ + .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .paletteTag = ANIM_TAG_WATER_ORB, + .oam = &gOamData_AffineNormal_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_GrowingElectricOrb, + .callback = AnimGrowingChargeOrb +}; +const struct SpriteTemplate gTechnoBlastBlueBubbleTemplate = +{ + .tileTag = ANIM_TAG_BUBBLE, + .paletteTag = ANIM_TAG_BUBBLE, + .oam = &gOamData_AffineNormal_ObjBlend_16x16, + .anims = gAnims_WaterBubbleProjectile, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSmallBubblePair +}; +const struct SpriteTemplate gTechnoBlastBlueBlastTemplate = +{ + .tileTag = ANIM_TAG_BLACK_BALL_2, + .paletteTag = ANIM_TAG_WATER_ORB, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = TranslateAnimSpriteToTargetMonLocation +}; +const struct SpriteTemplate gTechnoBlastBlueSparkTemplate = +{ + .tileTag = ANIM_TAG_SPARK_2, + .paletteTag = ANIM_TAG_WATER_ORB, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_FlashingSpark, + .callback = AnimZapCannonSpark +}; +const struct SpriteTemplate gTechnoBlastBlueSmokeTemplate = +{ + .tileTag = ANIM_TAG_GRAY_SMOKE, + .paletteTag = ANIM_TAG_WATER_ORB, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gOctazookaAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; + +const struct SpriteTemplate gTechnoBlastRedChargeTemplate = +{ + .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .paletteTag = ANIM_TAG_SMALL_RED_EYE, + .oam = &gOamData_AffineNormal_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_GrowingElectricOrb, + .callback = AnimGrowingChargeOrb +}; +const struct SpriteTemplate gTechnoBlastRedBlastTemplate = +{ + .tileTag = ANIM_TAG_BLACK_BALL_2, + .paletteTag = ANIM_TAG_SMALL_RED_EYE, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = TranslateAnimSpriteToTargetMonLocation +}; +const struct SpriteTemplate gTechnoBlastRedSparkTemplate = +{ + .tileTag = ANIM_TAG_SPARK_2, + .paletteTag = ANIM_TAG_JAGGED_MUSIC_NOTE, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_FlashingSpark, + .callback = AnimZapCannonSpark +}; +const struct SpriteTemplate gTechnoBlastRedSmokeTemplate = +{ + .tileTag = ANIM_TAG_GRAY_SMOKE, + .paletteTag = ANIM_TAG_JAGGED_MUSIC_NOTE, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gOctazookaAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; + +const struct SpriteTemplate gTechnoBlastIceChargeTemplate = +{ + .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .paletteTag = ANIM_TAG_ICE_CHUNK, + .oam = &gOamData_AffineNormal_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_GrowingElectricOrb, + .callback = AnimGrowingChargeOrb +}; +const struct SpriteTemplate gTechnoBlastIceBlastTemplate = +{ + .tileTag = ANIM_TAG_BLACK_BALL_2, + .paletteTag = ANIM_TAG_ICE_CHUNK, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = TranslateAnimSpriteToTargetMonLocation +}; +const struct SpriteTemplate gTechnoBlastIceSparkTemplate = +{ + .tileTag = ANIM_TAG_SPARK_2, + .paletteTag = ANIM_TAG_ICE_CHUNK, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_FlashingSpark, + .callback = AnimZapCannonSpark +}; +const struct SpriteTemplate gTechnoBlastIceSmokeTemplate = +{ + .tileTag = ANIM_TAG_GRAY_SMOKE, + .paletteTag = ANIM_TAG_ICE_CHUNK, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gOctazookaAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; +const struct SpriteTemplate gTechnoBlastIceCrystalsTemplate = +{ + .tileTag = ANIM_TAG_ICE_CRYSTALS, + .paletteTag = ANIM_TAG_ICE_CRYSTALS, + .oam = &gOamData_AffineNormal_ObjBlend_8x16, + .anims = gAnims_IceCrystalLarge, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = AnimHitSplatBasic +}; + +//secret sword +const struct SpriteTemplate gSecretSwordBladesTemplate = +{ + .tileTag = ANIM_TAG_PUNISHMENT_BLADES, + .paletteTag = ANIM_TAG_HYDRO_PUMP, + .oam = &gOamData_AffineDouble_ObjNormal_32x32, + .anims = gAnims_DragonBreathFire, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpread +}; + +//glaciate +const struct SpriteTemplate gGlaciateSmokeTemplate = +{ + .tileTag = ANIM_TAG_BLACK_SMOKE, + .paletteTag = ANIM_TAG_ICE_CHUNK, + .oam = &gOamData_AffineOff_ObjNormal_32x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimBlackSmoke +}; + +//blue flare +const struct SpriteTemplate gBlueFlareFlameJabTemplate = +{ + .tileTag = ANIM_TAG_SMALL_EMBER, + .paletteTag = ANIM_TAG_METAL_BITS, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_FlamethrowerFlame, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimNeedleArmSpike +}; + +const struct SpriteTemplate gBlueFlareFlameSwirlTemplate = +{ + .tileTag = ANIM_TAG_SMALL_EMBER, + .paletteTag = ANIM_TAG_METAL_BITS, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_FlamethrowerFlame, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimParticleInVortex +}; + +const struct SpriteTemplate gBlueFlareBurnTemplate = +{ + .tileTag = ANIM_TAG_SMALL_EMBER, + .paletteTag = ANIM_TAG_METAL_BITS, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_FlamethrowerFlame, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpread +}; + +//freeze shock +const struct SpriteTemplate gFreezeShockCircleTemplate = +{ + .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .oam = &gOamData_AffineNormal_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_GrowingElectricOrb, + .callback = AnimGrowingShockWaveOrb +}; + +const struct SpriteTemplate gFreezeShockIceBallTemplate = +{ + .tileTag = ANIM_TAG_ICE_CHUNK, + .paletteTag = ANIM_TAG_ICE_CHUNK, + .oam = &gOamData_AffineDouble_ObjNormal_32x32, + .anims = gAnims_IceBallChunk, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = TranslateAnimSpriteToTargetMonLocation +}; + +//ice burn +const struct SpriteTemplate gIceBurnSmokeTemplate = +{ + .tileTag = ANIM_TAG_BLACK_SMOKE, + .paletteTag = ANIM_TAG_ICE_CHUNK, + .oam = &gOamData_AffineOff_ObjNormal_32x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimBlackSmoke +}; + +//icicle crash +static const union AffineAnimCmd sSpriteAffineAnim_IcicleCrash[] = +{ + AFFINEANIMCMD_FRAME(0, 0, 128, 1), //180 degree turn + AFFINEANIMCMD_END +}; +static const union AffineAnimCmd* const sSpriteAffineAnimTable_IcicleCrash[] = +{ + sSpriteAffineAnim_IcicleCrash, +}; +const struct SpriteTemplate gIcicleCrashSpearTemplate = +{ + .tileTag = ANIM_TAG_ICICLE_SPEAR, + .paletteTag = ANIM_TAG_ICICLE_SPEAR, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = sSpriteAffineAnimTable_IcicleCrash, + .callback = AnimFallingRock +}; + +//v create +const struct SpriteTemplate gVCreateFlameTemplate = +{ + .tileTag = ANIM_TAG_SMALL_EMBER, + .paletteTag = ANIM_TAG_SMALL_EMBER, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_FireBlastCross, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimNeedleArmSpike +}; + +const struct SpriteTemplate gVCreateRedRingTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_JAGGED_MUSIC_NOTE, + .oam = &gOamData_AffineDouble_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gThinRingShrinkingAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; + +const struct SpriteTemplate gVCreateRedOrbTemplate = +{ + .tileTag = ANIM_TAG_ECLIPSING_ORB, + .paletteTag = ANIM_TAG_JAGGED_MUSIC_NOTE, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gEclipsingOrbAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; + +//fusion flare +const struct SpriteTemplate gFusionFlareRedBallUpTemplate = +{ + .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .paletteTag = ANIM_TAG_VERTICAL_HEX, + .oam = &gOamData_AffineNormal_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimWeatherBallUp +}; + +const struct SpriteTemplate gFusionFlareRedBallTemplate = +{ + .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .paletteTag = ANIM_TAG_VERTICAL_HEX, + .oam = &gOamData_AffineNormal_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimStompFoot +}; + +const struct SpriteTemplate gFusionFlareRedBubblesTemplate = +{ + .tileTag = ANIM_TAG_SMALL_BUBBLES, + .paletteTag = ANIM_TAG_SMALL_BUBBLES, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = gAnims_WaterPulseBubble, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimWaterPulseBubble +}; + +const struct SpriteTemplate gFusionFlareRedRingTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_JAGGED_MUSIC_NOTE, + .oam = &gOamData_AffineDouble_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gThinRingExpandingAffineAnimTable, + .callback = AnimUproarRing +}; + +//fusion bolt +static const union AffineAnimCmd sSpriteAffineAnim_DrakeStrikePlayer[] = +{ + AFFINEANIMCMD_FRAME(0, 0, 0xb9, 1), //.hword 0,0,0x01b9 + AFFINEANIMCMD_END, //.hword 0,0x7fff,0,0,0 +}; +static const union AffineAnimCmd sSpriteAffineAnim_DrakeStrikeOpponent[] = +{ + AFFINEANIMCMD_FRAME(0, 0, 0x50, 1), //.hword 0,0,0x0150,0, + AFFINEANIMCMD_END, //.hword 0x7fff,0,0,0 +}; +static const union AffineAnimCmd* const sAffineAnimCmdTable_DrakeStriking[] = //devestating drake, fusion bolt +{ + sSpriteAffineAnim_DrakeStrikePlayer, + sSpriteAffineAnim_DrakeStrikeOpponent, +}; +const struct SpriteTemplate gFusionBoltBallTemplate = +{ + .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .oam = &gOamData_AffineNormal_ObjNormal_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = sAffineAnimCmdTable_DrakeStriking, + .callback = AnimFlyBallAttack +}; + +//// GEN 6 +//mat block +const struct SpriteTemplate gMatBlockGreenConversionTemplate = +{ + .tileTag = ANIM_TAG_CONVERSION, + .paletteTag = ANIM_TAG_GREEN_LIGHT_WALL, + .oam = &gOamData_AffineDouble_ObjBlend_8x8, + .anims = gConversionAnimTable, + .images = NULL, + .affineAnims = gConversionAffineAnimTable, + .callback = AnimConversion +}; + +//belch +static const union AnimCmd sAnimCmdBerryEaten[] = +{ + ANIMCMD_FRAME(16, 3), + ANIMCMD_END, +}; +static const union AnimCmd *const sAnimCmdFramesBerryEaten[] = +{ + sAnimCmdBerryEaten, +}; +const struct SpriteTemplate gBelchBerryTemplate = +{ + .tileTag = ANIM_TAG_BERRY_NORMAL, + .paletteTag = ANIM_TAG_BERRY_NORMAL, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = sAnimCmdFramesBerryEaten, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMissileArc +}; + +//forest's curse +const struct SpriteTemplate gForestsCurseIngrainTemplate = +{ + .tileTag = ANIM_TAG_ROOTS, + .paletteTag = ANIM_TAG_ROOTS, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gIngrainRootAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimWaterPulseBubble +}; + +//petal blizzard +/* +PB_TEMPLATE_1: .hword 0x0,0xa,0xfffe,0x0 + 00 00 00 0A FE FF 00 00 +*/ +static const union AnimCmd sAnimCmd_PetalBlizzard1_0[] = +{ + ANIMCMD_FRAME(0, 10), + ANIMCMD_JUMP(0), +}; +static const union AnimCmd *const sAnimCmdTable_PetalBlizzard1[] = +{ + sAnimCmd_PetalBlizzard1_0, +}; +const struct SpriteTemplate gPetalBlizzardTwister1Template = +{ + .tileTag = ANIM_TAG_FLOWER, + .paletteTag = ANIM_TAG_FLOWER, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = sAnimCmdTable_PetalBlizzard1, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMoveTwisterParticle +}; +static const u16 sPetalBlizzardFlowerOam[] = {0x0, 0x2000,0x0800,0x0}; //todo: convert to oam data +static const union AnimCmd sAnimCmd_PetalBlizzard2_0[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(4, 0), + ANIMCMD_END, +}; +static const union AnimCmd *const sAnimCmdTable_PetalBlizzard2[] = +{ + sAnimCmd_PetalBlizzard2_0, +}; +const struct SpriteTemplate gPetalBlizzardTwister2Template = +{ + .tileTag = ANIM_TAG_FLOWER, + .paletteTag = ANIM_TAG_FLOWER, + .oam = (const struct OamData *) &sPetalBlizzardFlowerOam, + .anims = sAnimCmdTable_PetalBlizzard2, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMoveTwisterParticle +}; + +//crafty shield +const struct SpriteTemplate gCraftyShieldPinkConversionTemplate = +{ + .tileTag = ANIM_TAG_CRAFTY_SHIELD, + .paletteTag = ANIM_TAG_CRAFTY_SHIELD, + .oam = &gOamData_AffineDouble_ObjBlend_8x8, + .anims = gConversionAnimTable, + .images = NULL, + .affineAnims = gConversionAffineAnimTable, + .callback = AnimConversion +}; + +//grassy terrain +const struct SpriteTemplate gGrassyTerrainOrbsTemplate = +{ + .tileTag = ANIM_TAG_ORBS, + .paletteTag = ANIM_TAG_ORBS, + .oam = &gOamData_AffineNormal_ObjBlend_16x16, + .anims = gPowerAbsorptionOrbAnimTable, + .images = NULL, + .affineAnims = gPowerAbsorptionOrbAffineAnimTable, + .callback = AnimOrbitFast +}; + +const struct SpriteTemplate gGrassyTerrainStarTemplate = +{ + .tileTag = ANIM_TAG_GREEN_SPARKLE, + .paletteTag = ANIM_TAG_GREEN_SPARKLE, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gMoonlightSparkleAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimOrbitScatter +}; + +//misty terrain +const struct SpriteTemplate gMistyTerrainOrbsTemplate = +{ + .tileTag = ANIM_TAG_ORBS, + .paletteTag = ANIM_TAG_WATER_GUN, + .oam = &gOamData_AffineNormal_ObjBlend_16x16, + .anims = gPowerAbsorptionOrbAnimTable, + .images = NULL, + .affineAnims = gPowerAbsorptionOrbAffineAnimTable, + .callback = AnimOrbitFast +}; + +const struct SpriteTemplate gMistyTerrainStarTemplate = +{ + .tileTag = ANIM_TAG_GREEN_SPARKLE, + .paletteTag = ANIM_TAG_WATER_GUN, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gMoonlightSparkleAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimOrbitScatter +}; + +//electrify +const struct SpriteTemplate gElectrifyRingTemplate = +{ + .tileTag = ANIM_TAG_GUARD_RING, + .paletteTag = ANIM_TAG_SPARK_2, + .oam = &gOamData_AffineDouble_ObjBlend_64x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gGuardRingAffineAnimTable, + .callback = SpriteCB_SurroundingRing +}; + +const struct SpriteTemplate gElectrifyYellowRingTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_SMALL_EMBER, + .oam = &gOamData_AffineDouble_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gThinRingExpandingAffineAnimTable, + .callback = AnimUproarRing +}; + +//fairy wind +const struct SpriteTemplate gFairyWindCloudTemplate = +{ + .tileTag = ANIM_TAG_PINK_CLOUD, + .paletteTag = ANIM_TAG_PINK_CLOUD, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gSwiftStarAffineAnimTable, + .callback = AnimTranslateLinearSingleSineWave +}; + +//confide +const struct SpriteTemplate gConfideBubbleTemplate = +{ + .tileTag = ANIM_TAG_CONFIDE, + .paletteTag = ANIM_TAG_CONFIDE, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gMetronomeThroughtBubbleAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimThoughtBubble +}; + +//diamond storm +const struct SpriteTemplate gDiamondStormSwirlingIceTemplate = +{ + .tileTag = ANIM_TAG_ICE_CRYSTALS, + .paletteTag = ANIM_TAG_ICE_CRYSTALS, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = gAnims_Snowball, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSwirlingSnowball_Step1 +}; + +const struct SpriteTemplate gDiamondStormBlizzardTemplate = +{ + .tileTag = ANIM_TAG_ICE_CRYSTALS, + .paletteTag = ANIM_TAG_ICE_CRYSTALS, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gAnims_BlizzardIceCrystal, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMoveParticleBeyondTarget +}; + +const struct SpriteTemplate gDiamondStormDiamondsTemplate = +{ + .tileTag = ANIM_TAG_ICE_CRYSTALS, + .paletteTag = ANIM_TAG_ICE_CRYSTALS, + .oam = &gOamData_AffineNormal_ObjBlend_8x16, + .anims = gAnims_IceCrystalLarge, + .images = NULL, + .affineAnims = gAffineAnims_BasicRock, + .callback = AnimMoveTwisterParticle +}; + +//steam eruption +const struct SpriteTemplate gSteamEruptionBreathTemplate = +{ + .tileTag = ANIM_TAG_STEAM_ERUPTION, + .paletteTag = ANIM_TAG_STEAM_ERUPTION, + .oam = &gOamData_AffineDouble_ObjNormal_32x32, + .anims = gAnims_DragonBreathFire, + .images = NULL, + .affineAnims = gAffineAnims_DragonBreathFire, + .callback = AnimDragonFireToTarget +}; + +//hyperspace hole +const struct SpriteTemplate gHyperspaceHoleImpactTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_IceCrystalHit, + .callback = AnimIceEffectParticle +}; + +//water shuriken +const struct SpriteTemplate gWaterShurikenStarTemplate = +{ + .tileTag = ANIM_TAG_YELLOW_STAR, + .paletteTag = ANIM_TAG_WATER_ORB, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_ShadowBall, + .callback = AnimShadowBall +}; + +const struct SpriteTemplate gWaterShurikenRingTemplate = +{ + .tileTag = ANIM_TAG_BLUE_RING_2, + .paletteTag = ANIM_TAG_WATER_ORB, + .oam = &gOamData_AffineDouble_ObjNormal_16x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gWaterPulseRingAffineAnimTable, + .callback = AnimWaterPulseRing +}; + +const struct SpriteTemplate gWaterShurikenImpactTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_WATER_ORB, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = AnimHitSplatBasic +}; + +//eerie impulse +const struct SpriteTemplate gEerieImpulseRingTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_SPARK_2, + .oam = &gOamData_AffineDouble_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gHyperVoiceRingAffineAnimTable, + .callback = AnimHyperVoiceRing +}; + +const struct SpriteTemplate gEerieImpulseImpactTemplate = +{ + .tileTag = ANIM_TAG_GOLD_RING, + .paletteTag = ANIM_TAG_SPARK_H, + .oam = &gOamData_AffineOff_ObjNormal_16x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimGrantingStars +}; + +//venom drench +const struct SpriteTemplate gVenomDrenchAcidTemplate = +{ + .tileTag = ANIM_TAG_POISON_BUBBLE, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_AffineDouble_ObjNormal_16x16, + .anims = gAnims_PoisonProjectile, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFallingRock +}; + +//powder +const struct SpriteTemplate gPowderBlackSporeTemplate = +{ + .tileTag = ANIM_TAG_SPORE, + .paletteTag = ANIM_TAG_HANDS_AND_FEET, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gSporeParticleAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSporeParticle +}; + +//geomancy +const struct SpriteTemplate gGeomancyRingTemplate = +{ + .tileTag = ANIM_TAG_GUARD_RING, + .paletteTag = ANIM_TAG_GUARD_RING, + .oam = &gOamData_AffineDouble_ObjBlend_64x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gGuardRingAffineAnimTable, + .callback = SpriteCB_SurroundingRing +}; + +const struct SpriteTemplate gGeomancyYellowRageTemplate = +{ + .tileTag = ANIM_TAG_FIRE_PLUME, + .paletteTag = ANIM_TAG_PAW_PRINT, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_DragonRageFirePlume, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimDragonRageFirePlume +}; + +const struct SpriteTemplate gGeomancyRedCellVortexTemplate = +{ + .tileTag = ANIM_TAG_ZYGARDE_HEXES, + .paletteTag = ANIM_TAG_SMALL_EMBER, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gRazorLeafParticleAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimParticleInVortex +}; + +const struct SpriteTemplate gGeomancyGreenCellVortexTemplate = +{ + .tileTag = ANIM_TAG_ZYGARDE_HEXES, + .paletteTag = ANIM_TAG_WHIP_HIT, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gRazorLeafParticleAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimParticleInVortex +}; + +const struct SpriteTemplate gGeomancyBlueCellVortexTemplate = +{ + .tileTag = ANIM_TAG_ZYGARDE_HEXES, + .paletteTag = ANIM_TAG_SWEAT_BEAD, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gRazorLeafParticleAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimParticleInVortex +}; + +const struct SpriteTemplate gGeomancyRedCellRaiseTemplate = +{ + .tileTag = ANIM_TAG_ZYGARDE_HEXES, + .paletteTag = ANIM_TAG_SMALL_EMBER, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gRazorLeafParticleAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimRaiseSprite +}; + +const struct SpriteTemplate gGeomancyGreenCellRaiseTemplate = +{ + .tileTag = ANIM_TAG_ZYGARDE_HEXES, + .paletteTag = ANIM_TAG_WHIP_HIT, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gRazorLeafParticleAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimRaiseSprite +}; + +const struct SpriteTemplate gGeomancyBlueCellRaiseTemplate = +{ + .tileTag = ANIM_TAG_ZYGARDE_HEXES, + .paletteTag = ANIM_TAG_SWEAT_BEAD, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gRazorLeafParticleAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimRaiseSprite +}; + +//magnetic flux +const struct SpriteTemplate gMagneticFluxUproarTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_SMALL_EMBER, + .oam = &gOamData_AffineDouble_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gThinRingExpandingAffineAnimTable, + .callback = AnimUproarRing +}; + +//happy hour +const struct SpriteTemplate gHappyHourCoinShowerTemplate = +{ + .tileTag = ANIM_TAG_COIN, + .paletteTag = ANIM_TAG_COIN, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gCoinAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimHappyHourCoinShower +}; + +//electric terrain +const struct SpriteTemplate gElectricTerrainOrbsTemplate = +{ + .tileTag = ANIM_TAG_ELECTRIC_ORBS, + .paletteTag = ANIM_TAG_ELECTRIC_ORBS, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = gAnims_ElectricChargingParticles, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimOrbitFast +}; + +const struct SpriteTemplate gElectricTerrainFlyingBallTemplate = +{ + .tileTag = ANIM_TAG_ELECTRIC_ORBS, + .paletteTag = ANIM_TAG_ELECTRIC_ORBS, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = gAnims_ElectricChargingParticles, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimOrbitScatter +}; + +//celebrate +const struct SpriteTemplate gCelebrateBagTemplate = +{ + .tileTag = ANIM_TAG_ITEM_BAG, + .paletteTag = ANIM_TAG_ITEM_BAG, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gMetronomeFingerAffineAnimTable, + .callback = AnimFollowMeFinger +}; + +//hold hands +const struct SpriteTemplate gHoldHandsHeartTemplate = +{ + .tileTag = ANIM_TAG_MAGENTA_HEART, + .paletteTag = ANIM_TAG_VERTICAL_HEX, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimPetalDanceBigFlower +}; + +//hold back +const struct SpriteTemplate gHoldBackSwipeTemplate = +{ + .tileTag = ANIM_TAG_PURPLE_SWIPE, + .paletteTag = ANIM_TAG_PAW_PRINT, + .oam = &gOamData_AffineOff_ObjNormal_64x64, + .anims = gAnims_RevengeBigScratch, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimRevengeScratch +}; + +const struct SpriteTemplate gHoldBackRingTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_PAW_PRINT, + .oam = &gOamData_AffineDouble_ObjNormal_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gThinRingExpandingAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; + +const struct SpriteTemplate gHoldBackStarsTemplate = +{ + .tileTag = ANIM_TAG_PAIN_SPLIT, + .paletteTag = ANIM_TAG_DUCK, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimDizzyPunchDuck +}; + +//infestation +const struct SpriteTemplate gInfestationBubbleTemplate = +{ + .tileTag = ANIM_TAG_SMALL_BUBBLES, + .paletteTag = ANIM_TAG_HANDS_AND_FEET, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = gAnims_WaterPulseBubble, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimParticleInVortex +}; + +//oblivion wing +static const union AffineAnimCmd sSpriteAffineAnim_GrowingRing[] = +{ + AFFINEANIMCMD_FRAME(8, 8, 0, 16), //Double in size + AFFINEANIMCMD_END, +}; +static const union AffineAnimCmd* const sSpriteAffineAnimTable_GrowingRing[] = +{ + sSpriteAffineAnim_GrowingRing, +}; +const struct SpriteTemplate gOblivionWingBeamTemplate = +{ + .tileTag = ANIM_TAG_HYDRO_PUMP, + .paletteTag = ANIM_TAG_HYDRO_PUMP, + .oam = &gOamData_AffineDouble_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = sSpriteAffineAnimTable_GrowingRing, + .callback = TranslateAnimSpriteToTargetMonLocation +}; + +//thousand arrows +const struct SpriteTemplate gThousandArrowsGreenChargeTemplate = +{ + .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .paletteTag = ANIM_TAG_LEAF, + .oam = &gOamData_AffineNormal_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_GrowingElectricOrb, + .callback = AnimGrowingChargeOrb +}; + +const struct SpriteTemplate gThousandArrowsGreenHexTemplate = +{ + .tileTag = ANIM_TAG_VERTICAL_HEX, + .paletteTag = ANIM_TAG_ZYGARDE_HEXES, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gRazorLeafParticleAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_Geyser +}; + +const struct SpriteTemplate gThousandArrowsGreenArrowTemplate = +{ + .tileTag = ANIM_TAG_NEEDLE, + .paletteTag = ANIM_TAG_LEAF, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMudSportDirt +}; + +const struct SpriteTemplate gThousandArrowsGreenDischargeTemplate = +{ + .tileTag = ANIM_TAG_ELECTRICITY, + .paletteTag = ANIM_TAG_RAZOR_LEAF, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_ElectricPuff, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimElectricPuff +}; + +//thousand waves +const struct SpriteTemplate gThousandWavesGreenWaveTemplate = +{ + .tileTag = ANIM_TAG_FLYING_DIRT, + .paletteTag = ANIM_TAG_LEAF, + .oam = &gOamData_AffineOff_ObjNormal_32x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFlyingSandCrescent +}; + +const struct SpriteTemplate gThousandWavesGreenRecoverTemplate = +{ + .tileTag = ANIM_TAG_ZYGARDE_HEXES, + .paletteTag = ANIM_TAG_ZYGARDE_HEXES, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gRazorLeafParticleAnimTable, + .images = NULL, + .affineAnims = gPowerAbsorptionOrbAffineAnimTable, + .callback = AnimPowerAbsorptionOrb +}; + +const struct SpriteTemplate gThousandWavesGreenWheelTemplate = +{ + .tileTag = ANIM_TAG_ZYGARDE_HEXES, + .paletteTag = ANIM_TAG_ZYGARDE_HEXES, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gRazorLeafParticleAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimDragonDanceOrb +}; + +const struct SpriteTemplate gThousandWavesRotatingImpactTemplate = +{ + .tileTag = ANIM_TAG_ZYGARDE_HEXES, + .paletteTag = ANIM_TAG_ZYGARDE_HEXES, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gRazorLeafParticleAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_Whirlpool, + .callback = AnimParticleInVortex +}; + +const struct SpriteTemplate gThousandWavesPoundImpactTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_LEAF, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = AnimHitSplatOnMonEdge +}; + +//lands wrath +const struct SpriteTemplate gLandsWrathVortexTemplate = +{ + .tileTag = ANIM_TAG_WATER_ORB, + .paletteTag = ANIM_TAG_SPARK_2, + .oam = &gOamData_AffineNormal_ObjBlend_16x16, + .anims = gAnims_WaterMudOrb, + .images = NULL, + .affineAnims = gAffineAnims_Whirlpool, + .callback = AnimParticleInVortex +}; + +//light of ruin +const struct SpriteTemplate gLightOfRuinPinkOrbsTemplate = +{ + .tileTag = ANIM_TAG_ORBS, + .paletteTag = ANIM_TAG_PINK_PETAL, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = gSolarbeamBigOrbAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimHyperBeamOrb +}; +const struct SpriteTemplate gLightOfRuinPinkDischargeTemplate = +{ + .tileTag = ANIM_TAG_ELECTRICITY, + .paletteTag = ANIM_TAG_PINK_PETAL, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_ElectricPuff, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimElectricPuff +}; + +const struct SpriteTemplate gLightOfRuinPinkExplosionTemplate = +{ + .tileTag = ANIM_TAG_EXPLOSION, + .paletteTag = ANIM_TAG_PINK_PETAL, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gExplosionAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; + +//origin pulse +const struct SpriteTemplate gOriginPulseRingTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_WATER_ORB, + .oam = &gOamData_AffineDouble_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gThinRingExpandingAffineAnimTable, + .callback = AnimUproarRing +}; + +const struct SpriteTemplate gOriginPulseOrbTemplate = +{ + .tileTag = ANIM_TAG_ORBS, + .paletteTag = ANIM_TAG_WATER_ORB, + .oam = &gOamData_AffineNormal_ObjBlend_16x16, + .anims = gPowerAbsorptionOrbAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimDragonDanceOrb +}; + +const struct SpriteTemplate gOriginPulseOrbInwardTemplate = +{ + .tileTag = ANIM_TAG_ORBS, + .paletteTag = ANIM_TAG_WATER_ORB, + .oam = &gOamData_AffineNormal_ObjBlend_16x16, + .anims = gPowerAbsorptionOrbAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimNeedleArmSpike +}; + +const struct SpriteTemplate gOriginPulseBlueImpactTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_WATER_ORB, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = AnimHitSplatRandom +}; + +const struct SpriteTemplate gOriginPulseBasicSplatTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_WATER_ORB, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = AnimHitSplatBasic +}; + +//precipice blades +static const union AnimCmd sAnimCmdLargeSpike[] = +{ + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(32, 3), + ANIMCMD_FRAME(64, 3), + ANIMCMD_FRAME(96, 3), + ANIMCMD_END, +}; +static const union AnimCmd *const sAnimCmdTable_LargeSpike[] = +{ + sAnimCmdLargeSpike, +}; +const struct SpriteTemplate gPrecipiceBladesSpikeTemplate = +{ + .tileTag = ANIM_TAG_LARGE_SPIKE, + .paletteTag = ANIM_TAG_LARGE_SPIKE, + .oam = &gOamData_AffineOff_ObjNormal_32x64, + .anims = sAnimCmdTable_LargeSpike, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_SpriteOnMonForDuration +}; + +static const union AffineAnimCmd sSpriteAffineAnim_LargeHailRock[] = +{ + AFFINEANIMCMD_FRAME(256, 256, 0, 1), //Double sprite size + AFFINEANIMCMD_END, +}; +static const union AffineAnimCmd* const sSpriteAffineAnimTable_LargeHailRock[] = +{ + sSpriteAffineAnim_LargeHailRock, +}; +const struct SpriteTemplate gPrecipiceBladesLargeSpikeTemplate = +{ + .tileTag = ANIM_TAG_LARGE_SPIKE, + .paletteTag = ANIM_TAG_LARGE_SPIKE, + .oam = &gOamData_AffineDouble_ObjNormal_32x64, + .anims = sAnimCmdTable_LargeSpike, + .images = NULL, + .affineAnims = sSpriteAffineAnimTable_LargeHailRock, + .callback = SpriteCB_SpriteOnMonForDuration +}; + +const struct SpriteTemplate gPrecipiceBladesPlumeTemplate = +{ + .tileTag = ANIM_TAG_FIRE_PLUME, + .paletteTag = ANIM_TAG_FIRE_PLUME, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_DragonRageFirePlume, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_AnimSpriteOnSelectedMonPos +}; + +//dragon ascent +static const union AffineAnimCmd sAffineAnimCmd_Drake[] = +{ + AFFINEANIMCMD_FRAME(0, 0, 0, 1), //drake faces up + AFFINEANIMCMD_END, +}; +static const union AffineAnimCmd* const sAffineAnimCmdTable_DrakeFaceNorth[] = +{ + sAffineAnimCmd_Drake, + sAffineAnimCmd_Drake, +}; +const struct SpriteTemplate gDragonAscentFlyUpTemplate = +{ + .tileTag = ANIM_TAG_DRAGON_ASCENT, + .paletteTag = ANIM_TAG_DRAGON_ASCENT, + .oam = &gOamData_AffineNormal_ObjNormal_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = sAffineAnimCmdTable_DrakeFaceNorth, + .callback = AnimParticleInVortex +}; + +const struct SpriteTemplate gDragonAscentDrakeTemplate = +{ + .tileTag = ANIM_TAG_DRAGON_ASCENT, + .paletteTag = ANIM_TAG_DRAGON_ASCENT, + .oam = &gOamData_AffineNormal_ObjNormal_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = sAffineAnimCmdTable_DrakeStriking, + .callback = AnimFlyBallAttack +}; + +//hyperspace fury +const struct SpriteTemplate gHyperspaceFuryRingTemplate = +{ + .tileTag = ANIM_TAG_HOOPA_RING, + .paletteTag = ANIM_TAG_HOOPA_RING, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_ShadowBall, + .callback = AnimFireSpiralOutward +}; + +const struct SpriteTemplate gHyperspaceFuryHandTemplate = +{ + .tileTag = ANIM_TAG_HOOPA_HAND, + .paletteTag = ANIM_TAG_HOOPA_HAND, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimNeedleArmSpike +}; + +const struct SpriteTemplate gHyperspaceFuryImpactTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = AnimHitSplatRandom +}; + +//// GEN 7 +//first impression +const struct SpriteTemplate gFirstImpressionPoundTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_RAZOR_LEAF, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = AnimHitSplatBasic +}; + +//baneful bunker +const struct SpriteTemplate gBanefulBunkerPoisonBubbleTemplate = +{ + .tileTag = ANIM_TAG_POISON_BUBBLE, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gAnims_PoisonProjectile, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSmallBubblePair +}; + +//spirit shackle +const struct SpriteTemplate gSpiritShackleArrowTemplate = +{ + .tileTag = ANIM_TAG_SPIRIT_ARROW, + .paletteTag = ANIM_TAG_SPIRIT_ARROW, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSonicBoomProjectile +}; + +const struct SpriteTemplate gSpiritShackleChainTemplate = +{ + .tileTag = ANIM_TAG_CHAIN_LINK, + .paletteTag = ANIM_TAG_CHAIN_LINK, + .oam = &gOamData_AffineOff_ObjNormal_32x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimThunderWave +}; + +//darkest lariat +const struct SpriteTemplate gDarkestLariatImpactTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = AnimHitSplatBasic +}; + +//sparklig aria +const struct SpriteTemplate gSparklingAriaBlueChargeTemplate = +{ + .tileTag = ANIM_TAG_WATER_ORB, + .paletteTag = ANIM_TAG_WATER_ORB, + .oam = &gOamData_AffineDouble_ObjBlend_16x16, + .anims = gAnims_WaterMudOrb, + .images = NULL, + .affineAnims = gAffineAnims_GrowingElectricOrb, + .callback = AnimGrowingChargeOrb +}; + +const struct SpriteTemplate gSparklingAriaRainTemplate = +{ + .tileTag = ANIM_TAG_HYDRO_PUMP, + .paletteTag = ANIM_TAG_HYDRO_PUMP, + .oam = &gOamData_AffineOff_ObjBlend_16x16, + .anims = gAnims_WaterBubbleProjectile, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMudSportDirt +}; + +const struct SpriteTemplate gSparklingAriaBubbleRainTemplate = +{ + .tileTag = ANIM_TAG_BUBBLE, + .paletteTag = ANIM_TAG_BUBBLE, + .oam = &gOamData_AffineOff_ObjBlend_16x16, + .anims = gAnims_WaterBubbleProjectile, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMudSportDirt +}; + +const struct SpriteTemplate gSparklingAriaBubblesTemplate = +{ + .tileTag = ANIM_TAG_BUBBLE, + .paletteTag = ANIM_TAG_BUBBLE, + .oam = &gOamData_AffineOff_ObjBlend_16x16, + .anims = gAnims_WaterBubbleProjectile, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSmallBubblePair +}; + +//ice hammer +const struct SpriteTemplate gIceHammerPunchStompTemplate = +{ + .tileTag = ANIM_TAG_HORSESHOE_SIDE_FIST, + .paletteTag = ANIM_TAG_HORSESHOE_SIDE_FIST, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_HandOrFoot, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimStompFoot +}; + +const struct SpriteTemplate gIceHammerSmokesTemplate = +{ + .tileTag = ANIM_TAG_BLACK_SMOKE, + .paletteTag = ANIM_TAG_ECLIPSING_ORB, + .oam = &gOamData_AffineOff_ObjNormal_32x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimBlackSmoke +}; + +//floral healing +const struct SpriteTemplate gFloralHealingFlowerTemplate = +{ + .tileTag = ANIM_TAG_FLOWER, + .paletteTag = ANIM_TAG_FLOWER, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gPetalDanceBigFlowerAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSporeParticle +}; + +const struct SpriteTemplate gFloralHealingOrbsTemplate = +{ + .tileTag = ANIM_TAG_ORBS, + .paletteTag = ANIM_TAG_ORBS, + .oam = &gOamData_AffineNormal_ObjBlend_16x16, + .anims = gPowerAbsorptionOrbAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_Whirlpool, + .callback = AnimParticleInVortex +}; + +const struct SpriteTemplate gFloralHealingLeavesTemplate = +{ + .tileTag = ANIM_TAG_LEAF, + .paletteTag = ANIM_TAG_LEAF, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gRazorLeafParticleAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_Whirlpool, + .callback = AnimParticleInVortex +}; + +const struct SpriteTemplate gFloralHealingWindLeavesTemplate = +{ + .tileTag = ANIM_TAG_LEAF, + .paletteTag = ANIM_TAG_LEAF, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gRazorLeafParticleAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSweetScentPetal +}; + +//high horsepower +const struct SpriteTemplate gHighHorsepowerHorseshoeTemplate = +{ + .tileTag = ANIM_TAG_HORSESHOE_SIDE_FIST, + .paletteTag = ANIM_TAG_HORSESHOE_SIDE_FIST, + .oam = &gOamData_AffineDouble_ObjNormal_32x32, + .anims = gAnims_HandOrFoot, + .images = NULL, + .affineAnims = gAffineAnims_MegaPunchKick, + .callback = AnimSpinningKickOrPunch +}; + +//strength sap +const struct SpriteTemplate gStrengthSapRedSmokeTemplate = +{ + .tileTag = ANIM_TAG_GRAY_SMOKE, + .paletteTag = ANIM_TAG_RED_HEART, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gOctazookaAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; + +const struct SpriteTemplate gStrengthSapRedInwardTemplate = +{ + .tileTag = ANIM_TAG_TEAL_ALERT, + .paletteTag = ANIM_TAG_RED_HEART, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimTealAlert +}; + +const struct SpriteTemplate gStrengthSapAbsorbTemplate = +{ + .tileTag = ANIM_TAG_ORBS, + .paletteTag = ANIM_TAG_PINK_PETAL, + .oam = &gOamData_AffineNormal_ObjBlend_16x16, + .anims = gPowerAbsorptionOrbAnimTable, + .images = NULL, + .affineAnims = gAbsorptionOrbAffineAnimTable, + .callback = AnimAbsorptionOrb +}; + +//solar blade +const struct SpriteTemplate gSolarBladeImpactTemplate = +{ + .tileTag = ANIM_TAG_CLAW_SLASH, + .paletteTag = ANIM_TAG_SPARK_2, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_ClawSlash, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimClawSlash +}; + +//leafage +const struct SpriteTemplate gLeafageImpactTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_RAZOR_LEAF, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = AnimHitSplatBasic +}; + +//toxic thread +const struct SpriteTemplate gToxicThreadString = +{ + .tileTag = ANIM_TAG_STRING, + .paletteTag = ANIM_TAG_STRING, + .oam = &gOamData_AffineOff_ObjNormal_64x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_ToxicThreadWrap +}; + +//laser focus +const struct SpriteTemplate gLaserFocusRedEyesTemplate = +{ + .tileTag = ANIM_TAG_OPENING_EYE, + .paletteTag = ANIM_TAG_EYE_SPARKLE, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gOpeningEyeAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; + +//gear up +const struct SpriteTemplate gGearUpGearsTemplate = +{ + .tileTag = ANIM_TAG_GEAR, + .paletteTag = ANIM_TAG_GEAR, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimPetalDanceBigFlower +}; + +//throat chop +const struct SpriteTemplate gThroatChopRedImpactTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_SMALL_RED_EYE, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = AnimHitSplatBasic +}; + +//pollen puff +const struct SpriteTemplate gPollenPuffPinkStarTemplate = +{ + .tileTag = ANIM_TAG_SPARKLE_2, + .paletteTag = ANIM_TAG_PINK_PETAL, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gGrantingStarsAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSmallBubblePair +}; + +const struct SpriteTemplate gPollenPuffPinkSparkleTemplate = +{ + .tileTag = ANIM_TAG_SPARKLE_2, + .paletteTag = ANIM_TAG_PINK_PETAL, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gGrantingStarsAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_FlashingSpark, + .callback = AnimZapCannonSpark +}; + +const struct SpriteTemplate gPollenPuffYellowSparkleTemplate = +{ + .tileTag = ANIM_TAG_SPARKLE_2, + .paletteTag = ANIM_TAG_SMALL_EMBER, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gGrantingStarsAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_FlashingSpark, + .callback = AnimZapCannonSpark +}; + +const struct SpriteTemplate gPollenPuffSporeTemplate = +{ + .tileTag = ANIM_TAG_SPORE, + .paletteTag = ANIM_TAG_SPORE, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gSporeParticleAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimThrowProjectile +}; + +const struct SpriteTemplate gPollenPuffImpactTemplates = +{ + .tileTag = ANIM_TAG_ORBS, + .paletteTag = ANIM_TAG_FLAT_ROCK, + .oam = &gOamData_AffineNormal_ObjBlend_16x16, + .anims = gPowerAbsorptionOrbAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimNeedleArmSpike +}; + +const struct SpriteTemplate gPollenPuffHealTemplate = +{ + .tileTag = ANIM_TAG_BLUE_STAR, + .paletteTag = ANIM_TAG_PINK_PETAL, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gHealingBlueStarAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; + +//anchor shot +const struct SpriteTemplate gAnchorShotAnchorTemplate = +{ + .tileTag = ANIM_TAG_ANCHOR, + .paletteTag = ANIM_TAG_CHAIN_LINK, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimBlockX +}; + +const struct SpriteTemplate gAnchorShotAngledAnchorTemplate = +{ + .tileTag = ANIM_TAG_ANCHOR, + .paletteTag = ANIM_TAG_CHAIN_LINK, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_ShadowBall, + .callback = AnimShadowBall +}; + +//psychic terrain +const struct SpriteTemplate gPsychicTerrainOrbsTemplate = +{ + .tileTag = ANIM_TAG_ORBS, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_AffineNormal_ObjBlend_16x16, + .anims = gPowerAbsorptionOrbAnimTable, + .images = NULL, + .affineAnims = gPowerAbsorptionOrbAffineAnimTable, + .callback = AnimOrbitFast +}; + +const struct SpriteTemplate gPsychicTerrainStarTemplate = +{ + .tileTag = ANIM_TAG_GREEN_SPARKLE, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gMoonlightSparkleAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimOrbitScatter +}; + +//lunge +const struct SpriteTemplate gLungeGreenChargeTemplate = +{ + .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .paletteTag = ANIM_TAG_LEAF, + .oam = &gOamData_AffineDouble_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_PsychoBoostOrb, + .callback = AnimPsychoBoost +}; + +const struct SpriteTemplate gLungeGreenBubbleTemplate = +{ + .tileTag = ANIM_TAG_SMALL_BUBBLES, + .paletteTag = ANIM_TAG_RAZOR_LEAF, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimThrowProjectile +}; + +const struct SpriteTemplate gLungeGreenImpactTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_RAZOR_LEAF, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = AnimHitSplatBasic +}; + +//power trip +const struct SpriteTemplate gPowerTripFocusEnergyTemplate = +{ + .tileTag = ANIM_TAG_FOCUS_ENERGY, + .paletteTag = ANIM_TAG_HANDS_AND_FEET, + .oam = &gOamData_AffineOff_ObjNormal_16x32, + .anims = gEndureEnergyAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimEndureEnergy +}; + +const struct SpriteTemplate gPowerTripImpactTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_PURPLE_FLAME, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = AnimHitSplatBasic +}; + +//burn up +const struct SpriteTemplate gBurnUpRedYawnTemplate = +{ + .tileTag = ANIM_TAG_PINK_CLOUD, + .paletteTag = ANIM_TAG_SMALL_RED_EYE, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimThrowMistBall +}; + +//speed swap +const struct SpriteTemplate gSpeedSwapRingTemplate = +{ + .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 gSpeedSwapCircleTemplate = +{ + .tileTag = ANIM_TAG_ORBS, + .paletteTag = ANIM_TAG_ICE_CHUNK, + .oam = &gOamData_AffineDouble_ObjNormal_16x16, + .anims = gPowerAbsorptionOrbAnimTable, + .images = NULL, + .affineAnims = gMimicOrbAffineAnimTable, + .callback = AnimMimicOrb +}; + +const struct SpriteTemplate gSpeedSwapOrbMissileTemplate = +{ + .tileTag = ANIM_TAG_ORBS, + .paletteTag = ANIM_TAG_ICE_CHUNK, + .oam = &gOamData_AffineDouble_ObjNormal_16x16, + .anims = gPowerAbsorptionOrbAnimTable, + .images = NULL, + .affineAnims = gMimicOrbAffineAnimTable, + .callback = AnimMissileArc +}; + +const struct SpriteTemplate gSpeedSwapOrbTemplate = +{ + .tileTag = ANIM_TAG_ORBS, + .paletteTag = ANIM_TAG_ICE_CHUNK, + .oam = &gOamData_AffineOff_ObjBlend_16x16, + .anims = gPowerAbsorptionOrbAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimNeedleArmSpike +}; + +//smart strike +const struct SpriteTemplate gSmartStrikeGemTemplate = +{ + .tileTag = ANIM_TAG_POWER_GEM, + .paletteTag = ANIM_TAG_POWER_GEM, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimNeedleArmSpike +}; + +const struct SpriteTemplate gSmartStrikeImpactTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_FLASH_CANNON_BALL, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = AnimHitSplatBasic +}; + +//purify +const struct SpriteTemplate gPurifyWhiteBallTemplate = +{ + .tileTag = ANIM_TAG_FLASH_CANNON_BALL, + .paletteTag = ANIM_TAG_FLASH_CANNON_BALL, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMissileArc +}; + +const struct SpriteTemplate gPurifySmokeTemplate = +{ + .tileTag = ANIM_TAG_BLACK_SMOKE, + .paletteTag = ANIM_TAG_ICE_CHUNK, + .oam = &gOamData_AffineOff_ObjNormal_32x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimBlackSmoke +}; + +//revelation dance +const struct SpriteTemplate gRevelationDanceYellowOrbsTemplate = +{ + .tileTag = ANIM_TAG_ORBS, + .paletteTag = ANIM_TAG_ORBS, + .oam = &gOamData_AffineNormal_ObjBlend_16x16, + .anims = gPowerAbsorptionOrbAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimPetalDanceBigFlower +}; + +const struct SpriteTemplate gRevelationDanceYellowFlowerTemplate = +{ + .tileTag = ANIM_TAG_FLOWER, + .paletteTag = ANIM_TAG_JAGGED_MUSIC_NOTE, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = gPetalDanceSmallFlowerAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimPetalDanceSmallFlower +}; + +const struct SpriteTemplate gRevelationDanceYellowAirWaveTemplate = +{ + .tileTag = ANIM_TAG_AIR_WAVE, + .paletteTag = ANIM_TAG_JAGGED_MUSIC_NOTE, + .oam = &gOamData_AffineDouble_ObjBlend_32x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSonicBoomProjectile +}; + +const struct SpriteTemplate gRevelationDanceYellowImpactTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_SMALL_EMBER, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = AnimHitSplatBasic +}; + +const struct SpriteTemplate gRevelationDanceYellowRingTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_SMALL_EMBER, + .oam = &gOamData_AffineDouble_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gThinRingExpandingAffineAnimTable, + .callback = AnimUproarRing +}; + +const struct SpriteTemplate gRevelationDanceYellowDispersalTemplate = +{ + .tileTag = ANIM_TAG_ORBS, + .paletteTag = ANIM_TAG_ORBS, + .oam = &gOamData_AffineNormal_ObjBlend_16x16, + .anims = gPowerAbsorptionOrbAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpread +}; + +//core enforcer +const struct SpriteTemplate gCoreEnforcerBlueRingTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_WATER_ORB, + .oam = &gOamData_AffineDouble_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gThinRingShrinkingAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; + +const struct SpriteTemplate gCoreEnforcerYellowRingTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_SPARK_2, + .oam = &gOamData_AffineDouble_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gThinRingShrinkingAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; + +const struct SpriteTemplate gCoreEnforcerGreenRingTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_LEAF, + .oam = &gOamData_AffineDouble_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gThinRingShrinkingAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; + +const struct SpriteTemplate gCoreEnforcerCircleChargeTemplate = +{ + .tileTag = ANIM_TAG_SHOCK_3, + .paletteTag = ANIM_TAG_SHOCK_3, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gAnims_ThunderboltOrb, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = AnimFlashingHitSplat +}; + +const struct SpriteTemplate gCoreEnforcerBlueSparkTemplate = +{ + .tileTag = ANIM_TAG_SPARK_2, + .paletteTag = ANIM_TAG_WATER_ORB, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSparkElectricity +}; + +const struct SpriteTemplate gCoreEnforcerGreenChargeTemplate = +{ + .tileTag = ANIM_TAG_SPARK_2, + .paletteTag = ANIM_TAG_LEAF, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSparkElectricity +}; + +const struct SpriteTemplate gCoreEnforcerSnoreTemplate = +{ + .tileTag = ANIM_TAG_SNORE_Z, + .paletteTag = ANIM_TAG_SNORE_Z, + .oam = &gOamData_AffineOff_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_CentredSpiderWeb +}; + +const struct SpriteTemplate gCoreEnforcerImpactTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_IMPACT, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = SpriteCB_CoreEnforcerHits +}; + +const struct SpriteTemplate gCoreEnforcerBeamTemplate = +{ + .tileTag = ANIM_TAG_ORBS, + .paletteTag = ANIM_TAG_ORBS, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = gSolarbeamBigOrbAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_CoreEnforcerBeam +}; + +const struct SpriteTemplate gCoreEnforcerExplosionTemplate = +{ + .tileTag = ANIM_TAG_EXPLOSION, + .paletteTag = ANIM_TAG_EXPLOSION, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gExplosionAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_SpriteToCentreOfSide +}; + +//trop kick +const struct SpriteTemplate gTropKickGreenFootTemplate = +{ + .tileTag = ANIM_TAG_HANDS_AND_FEET, + .paletteTag = ANIM_TAG_HANDS_AND_FEET, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_HandOrFoot, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimJumpKick +}; + +const struct SpriteTemplate gTropKickFlowerTemplate = +{ + .tileTag = ANIM_TAG_FLOWER, + .paletteTag = ANIM_TAG_FLOWER, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gPetalDanceBigFlowerAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpread +}; + +const struct SpriteTemplate gTropKickLeavesTemplate = +{ + .tileTag = ANIM_TAG_LEAF, + .paletteTag = ANIM_TAG_LEAF, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gRazorLeafParticleAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireSpread +}; + +//clanging scales +const struct SpriteTemplate gClangingScalesPurpleMetalSoundTemplate = +{ + .tileTag = ANIM_TAG_METAL_SOUND_WAVES, + .paletteTag = ANIM_TAG_METAL_SOUND_WAVES, + .oam = &gOamData_AffineDouble_ObjNormal_32x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gGrowingRingAffineAnimTable, + .callback = SpriteCB_TranslateAnimSpriteToTargetMonLocationDoubles +}; + +//brutal swing +const struct SpriteTemplate gBrutalSwingRandomImpactTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_HANDS_AND_FEET, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = AnimHitSplatRandom +}; + +const struct SpriteTemplate gBrutalSwingBasicImpactTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_HANDS_AND_FEET, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = AnimHitSplatBasic +}; + +//aurora veil +const struct SpriteTemplate gAuroraVeilRingTemplate = +{ + .tileTag = ANIM_TAG_GUARD_RING, + .paletteTag = ANIM_TAG_GUARD_RING, + .oam = &gOamData_AffineDouble_ObjBlend_64x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gGuardRingAffineAnimTable, + .callback = SpriteCB_SurroundingRing +}; + +//shell trap +const struct SpriteTemplate gShellTrapYellowImpactTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_SMALL_EMBER, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = AnimHitSplatBasic +}; + +const struct SpriteTemplate gShellTrapRedImpactTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_SMALL_RED_EYE, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = AnimHitSplatBasic +}; + +const struct SpriteTemplate gShellTrapFireHitsTemplate = +{ + .tileTag = ANIM_TAG_ICE_CRYSTALS, + .paletteTag = ANIM_TAG_SMALL_EMBER, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = gAnims_Snowball, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMoveParticleBeyondTarget +}; + +//fleur cannon +const struct SpriteTemplate gFleurCannonOrbTemplate = +{ + .tileTag = ANIM_TAG_ORBS, + .paletteTag = ANIM_TAG_PINK_PETAL, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = gSolarbeamBigOrbAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimHyperBeamOrb +}; + +const struct SpriteTemplate gFleurCannonDischargeTemplate = +{ + .tileTag = ANIM_TAG_ELECTRICITY, + .paletteTag = ANIM_TAG_PINK_PETAL, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_ElectricPuff, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimElectricPuff +}; + +//stomping tantrum +const struct SpriteTemplate gStompingTantrumRockTemplate = +{ + .tileTag = ANIM_TAG_SMALL_ROCK, + .paletteTag = ANIM_TAG_ROCKS, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_TearDrop, + .callback = AnimTearDrop +}; + +//prismatic laser +const struct SpriteTemplate gPrismaticLaserChargeTemplate = +{ + .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .paletteTag = ANIM_TAG_ICE_CHUNK, + .oam = &gOamData_AffineNormal_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_GrowingElectricOrb, + .callback = AnimGrowingChargeOrb +}; + +const struct SpriteTemplate gPrismaticLaserYellowOutwardTemplate = +{ + .tileTag = ANIM_TAG_GREEN_SPIKE, + .paletteTag = ANIM_TAG_SPARK_H, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimNeedleArmSpike +}; + +const struct SpriteTemplate gPrismaticLaserGreenOutwardTemplate = +{ + .tileTag = ANIM_TAG_GREEN_SPIKE, + .paletteTag = ANIM_TAG_RAZOR_LEAF, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimNeedleArmSpike +}; + +const struct SpriteTemplate gPrismaticLaserRedOutwardTemplate = +{ + .tileTag = ANIM_TAG_GREEN_SPIKE, + .paletteTag = ANIM_TAG_JAGGED_MUSIC_NOTE, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimNeedleArmSpike +}; + +const struct SpriteTemplate gPrismaticLaserVioletOutwardTemplate = +{ + .tileTag = ANIM_TAG_GREEN_SPIKE, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimNeedleArmSpike +}; + +const struct SpriteTemplate gPrismaticLaserYellowInwardTemplate = +{ + .tileTag = ANIM_TAG_TEAL_ALERT, + .paletteTag = ANIM_TAG_SPARK_H, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimNeedleArmSpike +}; + +const struct SpriteTemplate gPrismaticLaserGreenInwardTemplate = +{ + .tileTag = ANIM_TAG_TEAL_ALERT, + .paletteTag = ANIM_TAG_RAZOR_LEAF, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimNeedleArmSpike +}; + +const struct SpriteTemplate gPrismaticLaserRedInwardTemplate = +{ + .tileTag = ANIM_TAG_TEAL_ALERT, + .paletteTag = ANIM_TAG_JAGGED_MUSIC_NOTE, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimNeedleArmSpike +}; + +const struct SpriteTemplate gPrismaticLaserVioletInwardTemplate = +{ + .tileTag = ANIM_TAG_TEAL_ALERT, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimNeedleArmSpike +}; + +const struct SpriteTemplate gPrismaticLaserYellowRainTemplate = +{ + .tileTag = ANIM_TAG_NEEDLE, + .paletteTag = ANIM_TAG_SPARK_H, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_FallingObject +}; + +const struct SpriteTemplate gPrismaticLaserGreenRainTemplate = +{ + .tileTag = ANIM_TAG_NEEDLE, + .paletteTag = ANIM_TAG_RAZOR_LEAF, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_FallingObject +}; + +const struct SpriteTemplate gPrismaticLaserRedRainTemplate = +{ + .tileTag = ANIM_TAG_NEEDLE, + .paletteTag = ANIM_TAG_JAGGED_MUSIC_NOTE, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_FallingObject +}; + +const struct SpriteTemplate gPrismaticLaserVioletRainTemplate = +{ + .tileTag = ANIM_TAG_NEEDLE, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_FallingObject +}; + +//spectral thief +const struct SpriteTemplate gSpectralThiefBlackSmokeTemplate = +{ + .tileTag = ANIM_TAG_GRAY_SMOKE, + .paletteTag = ANIM_TAG_HANDS_AND_FEET, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gOctazookaAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; + +const struct SpriteTemplate gSpectralThiefThiefImpactTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_HANDS_AND_FEET, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_IceCrystalHit, + .callback = AnimIceEffectParticle +}; + +const struct SpriteTemplate gSpectralThiefBlackOrbsTemplate = +{ + .tileTag = ANIM_TAG_ORBS, + .paletteTag = ANIM_TAG_HANDS_AND_FEET, + .oam = &gOamData_AffineDouble_ObjNormal_16x16, + .anims = gPowerAbsorptionOrbAnimTable, + .images = NULL, + .affineAnims = gMimicOrbAffineAnimTable, + .callback = AnimMimicOrb +}; + +const struct SpriteTemplate gSpectralThiefBlackBuffTemplate = +{ + .tileTag = ANIM_TAG_FOCUS_ENERGY, + .paletteTag = ANIM_TAG_HANDS_AND_FEET, + .oam = &gOamData_AffineOff_ObjNormal_16x32, + .anims = gEndureEnergyAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimEndureEnergy +}; + +//sunsteeel strike +const struct SpriteTemplate gSunsteelStrikeBlackFlyBallTemplate = +{ + .tileTag = ANIM_TAG_ROUND_SHADOW, + .paletteTag = ANIM_TAG_AIR_WAVE_2, + .oam = &gOamData_AffineDouble_ObjNormal_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_FlyBallUp, + .callback = AnimFlyBallUp +}; + +static const struct OamData sSunsteelStrikeBlastOAM = +{ + .affineMode = ST_OAM_AFFINE_DOUBLE, + .objMode = ST_OAM_OBJ_NORMAL, + .shape = SPRITE_SHAPE(64x64), + .size = SPRITE_SIZE(64x64), + .priority = 1, //Above sprites +}; +static const union AffineAnimCmd sSpriteAffineAnim_SunsteelStrikeBlastEnemySide[] = +{ + AFFINEANIMCMD_FRAME(0, 0, -64, 1), //90 degree turn + AFFINEANIMCMD_FRAME(0, 0, 0, 7), //Pause + AFFINEANIMCMD_FRAME(16, 16, 0, 15), //Double in size + AFFINEANIMCMD_END +}; +static const union AffineAnimCmd sSpriteAffineAnim_SunsteelStrikeBlastPlayerSide[] = +{ + AFFINEANIMCMD_FRAME(0, 0, 128, 1), //180 degree turn + AFFINEANIMCMD_FRAME(0, 0, 0, 7), //Pause + AFFINEANIMCMD_FRAME(16, 16, 0, 15), //Double in size + AFFINEANIMCMD_END +}; +static const union AffineAnimCmd* const sSpriteAffineAnimTable_SunsteelStrikeBlast[] = +{ + sSpriteAffineAnim_SunsteelStrikeBlastEnemySide, + sSpriteAffineAnim_SunsteelStrikeBlastPlayerSide, +}; +const struct SpriteTemplate gSunsteelStrikeSuperpowerTemplate = +{ + .tileTag = ANIM_TAG_METEOR, + .paletteTag = ANIM_TAG_METEOR, + .oam = &sSunsteelStrikeBlastOAM, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = sSpriteAffineAnimTable_SunsteelStrikeBlast, + .callback = AnimFlyBallAttack +}; + +const struct SpriteTemplate gSunsteelStrikeRedBeamTemplate = +{ + .tileTag = ANIM_TAG_GOLD_RING, + .paletteTag = ANIM_TAG_SMALL_RED_EYE, + .oam = &gOamData_AffineOff_ObjNormal_16x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_FlyBallAttack, + .callback = SpriteCB_SunsteelStrikeRings +}; + +const struct SpriteTemplate gSunsteelStrikeYellowBeamTemplate = +{ + .tileTag = ANIM_TAG_GOLD_RING, + .paletteTag = ANIM_TAG_GOLD_RING, + .oam = &gOamData_AffineOff_ObjNormal_16x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_FlyBallAttack, + .callback = SpriteCB_SunsteelStrikeRings +}; + +const struct SpriteTemplate gSunsteelStrikeRedImpactTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_SMALL_RED_EYE, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = AnimHitSplatBasic +}; + +const struct SpriteTemplate gSunsteelStrikeRocksTemplate = +{ + .tileTag = ANIM_TAG_SMALL_ROCK, + .paletteTag = ANIM_TAG_ROCKS, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_TearDrop, + .callback = AnimTearDrop +}; + +//moongeist beam +const struct SpriteTemplate gMoongeistBeamBlueOrbsTemplate = +{ + .tileTag = ANIM_TAG_ORBS, + .paletteTag = ANIM_TAG_WATER_GUN, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = gSolarbeamBigOrbAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimHyperBeamOrb +}; + +const struct SpriteTemplate gMoongeistBeamPurpleOrbsTemplate = +{ + .tileTag = ANIM_TAG_ORBS, + .paletteTag = ANIM_TAG_ASSURANCE_HAND, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = gSolarbeamBigOrbAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimHyperBeamOrb +}; + +const struct SpriteTemplate gMoongeistBeamChargeTemplate = +{ + .tileTag = ANIM_TAG_ELECTRIC_ORBS, + .paletteTag = ANIM_TAG_ELECTRIC_ORBS, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = gAnims_ElectricChargingParticles, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_MoongeistCharge +}; + +//zing zap +const struct SpriteTemplate gZingZapYellowBallTemplate = +{ + .tileTag = ANIM_TAG_YELLOW_BALL, + .paletteTag = ANIM_TAG_SPARK_H, + .oam = &gOamData_AffineDouble_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_ShadowBall, + .callback = AnimShadowBall +}; + +const struct SpriteTemplate gZingZapRingTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_SMALL_EMBER, + .oam = &gOamData_AffineDouble_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gThinRingExpandingAffineAnimTable, + .callback = AnimUproarRing +}; + +//nature's madness +const struct SpriteTemplate gNaturesMadnessPinkStarsTemplate = +{ + .tileTag = ANIM_TAG_SPARKLE_2, + .paletteTag = ANIM_TAG_PINK_PETAL, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gGrantingStarsAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSmallBubblePair +}; + +const struct SpriteTemplate gNaturesMadnessCrystalsTemplate = +{ + .tileTag = ANIM_TAG_ICE_CRYSTALS, + .paletteTag = ANIM_TAG_ICE_CHUNK, + .oam = &gOamData_AffineOff_ObjNormal_8x8, + .anims = gAnims_SmallBubblePair, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSmallBubblePair +}; + +const struct SpriteTemplate gNaturesMadnessPinkRingTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_PINK_PETAL, + .oam = &gOamData_AffineDouble_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gThinRingExpandingAffineAnimTable, + .callback = AnimUproarRing +}; + +const struct SpriteTemplate gNaturesMadnessGrayRingTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_ECLIPSING_ORB, + .oam = &gOamData_AffineDouble_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gThinRingShrinkingAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; + +//mind blown +const struct SpriteTemplate gMindBlownHeadTemplate = +{ + .tileTag = ANIM_TAG_BLACEPHALON_HEAD, + .paletteTag = ANIM_TAG_BLACEPHALON_HEAD, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_ShadowBall, + .callback = SpriteCB_MindBlownBall +}; + +const struct SpriteTemplate gMindBlownBlueOrbsTemplate = +{ + .tileTag = ANIM_TAG_ORBS, + .paletteTag = ANIM_TAG_SMALL_BUBBLES, + .oam = &gOamData_AffineNormal_ObjBlend_16x16, + .anims = gPowerAbsorptionOrbAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_MindBlownExplosion +}; + +const struct SpriteTemplate gMindBlownPinkOrbsTemplate = +{ + .tileTag = ANIM_TAG_ORBS, + .paletteTag = ANIM_TAG_PINK_HEART, + .oam = &gOamData_AffineNormal_ObjBlend_16x16, + .anims = gPowerAbsorptionOrbAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_MindBlownExplosion +}; + +const struct SpriteTemplate gMindBlownBlueImpactTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_SMALL_BUBBLES, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = SpriteCB_RandomCentredHits +}; + +const struct SpriteTemplate gMindBlownPinkImpactTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_PINK_HEART, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_HitSplat, + .callback = SpriteCB_RandomCentredHits +}; + +//plasma fists +const struct SpriteTemplate gPlasmaFistsChargeTemplate = +{ + .tileTag = ANIM_TAG_SHOCK_3, + .paletteTag = ANIM_TAG_SHOCK_3, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gAnims_ThunderboltOrb, + .images = NULL, + .affineAnims = gAffineAnims_GrowingElectricOrb, + .callback = AnimGrowingChargeOrb +}; + +//photon geyser +static const union AnimCmd sAnimCmdPhotonGeyserBeam1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; +static const union AnimCmd sAnimCmdSmiteBeam[] = +{ + ANIMCMD_FRAME(4, 1), + ANIMCMD_END +}; +static const union AnimCmd sAnimCmdPhotonGeyserBeam2[] = +{ + ANIMCMD_FRAME(8, 1), + ANIMCMD_END +}; +static const union AnimCmd *const sAnimCmdTable_PhotonGeyserBeam[] = +{ + sAnimCmdPhotonGeyserBeam1, + sAnimCmdSmiteBeam, + sAnimCmdPhotonGeyserBeam2, +}; +static const union AffineAnimCmd sSpriteAffineAnim_DoNothing[] = +{ + AFFINEANIMCMD_FRAME(0, 0, 0, 1), //Do nothing + AFFINEANIMCMD_END +}; +static const union AffineAnimCmd sSpriteAffineAnim_PhotonGeyserBeam[] = +{ + AFFINEANIMCMD_FRAME(0, 0, 0, 16), //Delay + AFFINEANIMCMD_FRAME(64, 64, 0, 4), //Double in size + //Pulsate + AFFINEANIMCMD_FRAME(-128, -128, 0, 1), + AFFINEANIMCMD_FRAME(128, 128, 0, 1), + AFFINEANIMCMD_JUMP(2), +}; +static const union AffineAnimCmd* const sSpriteAffineAnimTable_PhotonGeyserBeam[] = +{ + sSpriteAffineAnim_DoNothing, + sSpriteAffineAnim_PhotonGeyserBeam, +}; +const struct SpriteTemplate gPhotonGeyserBeam = +{ + .tileTag = ANIM_TAG_STRAIGHT_BEAM, + .paletteTag = ANIM_TAG_STRAIGHT_BEAM, + .oam = &gOamData_AffineDouble_ObjNormal_16x16, + .anims = sAnimCmdTable_PhotonGeyserBeam, + .images = NULL, + .affineAnims = sSpriteAffineAnimTable_PhotonGeyserBeam, + .callback = SpriteCB_PhotonGeyserBeam +}; + +const struct SpriteTemplate gPhotonGeyserChargeTemplate = +{ + .tileTag = ANIM_TAG_SHOCK_3, + .paletteTag = ANIM_TAG_SMALL_RED_EYE, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gAnims_ThunderboltOrb, + .images = NULL, + .affineAnims = gAffineAnims_GrowingElectricOrb, + .callback = AnimGrowingChargeOrb +}; + +const struct SpriteTemplate gPhotonGeyserSparkTemplate = +{ + .tileTag = ANIM_TAG_SPARK_2, + .paletteTag = ANIM_TAG_SMALL_RED_EYE, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSparkElectricity +}; + +const struct SpriteTemplate gPhotonGeyserZapCannonSparkTemplate = +{ + .tileTag = ANIM_TAG_SPARK_2, + .paletteTag = ANIM_TAG_SMALL_RED_EYE, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_FlashingSpark, + .callback = AnimZapCannonSpark +}; + +const struct SpriteTemplate gPhotonGeyserWhiteRingTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_AIR_WAVE_2, + .oam = &gOamData_AffineDouble_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gThinRingExpandingAffineAnimTable, + .callback = AnimUproarRing +}; + +const struct SpriteTemplate gPhotonGeyserYellowRingTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_SMALL_EMBER, + .oam = &gOamData_AffineDouble_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gThinRingExpandingAffineAnimTable, + .callback = AnimUproarRing +}; + +const struct SpriteTemplate gPhotonGeyserZapBallTemplate = +{ + .tileTag = ANIM_TAG_YELLOW_BALL, + .paletteTag = ANIM_TAG_YELLOW_BALL, + .oam = &gOamData_AffineDouble_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = TranslateAnimSpriteToTargetMonLocation +}; + + +//// GEN 8 +//snipe shot +static const union AffineAnimCmd sSpriteAffineAnim_LargeSpikePointedLeft[] = +{ + AFFINEANIMCMD_FRAME(0, 0, 32, 1), //45 degree turn + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sSpriteAffineAnim_LargeSpikePointedRight[] = +{ + AFFINEANIMCMD_FRAME(0, 0, -32, 1), //45 degree turn + AFFINEANIMCMD_END +}; +static const union AffineAnimCmd* const sSpriteAffineAnimTable_LargeSpike[] = +{ + sSpriteAffineAnim_LargeSpikePointedLeft, + sSpriteAffineAnim_LargeSpikePointedRight, +}; + +static const union AffineAnimCmd* const sSpriteAffineAnimTable_SnipeShot[] = +{ + sSpriteAffineAnim_LargeSpikePointedRight, +}; +static const union AnimCmd sAnimCmdSnipeShot[] = +{ + ANIMCMD_FRAME(64, 4), + ANIMCMD_FRAME(48, 4), + ANIMCMD_FRAME(32, 4), + ANIMCMD_FRAME(16, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_END, +}; +static const union AnimCmd *const sAnimCmdTable_SnipeShot[] = +{ + sAnimCmdSnipeShot, +}; +const struct SpriteTemplate gSnipeShotBallTemplate = //used in aura sphere +{ + .tileTag = ANIM_TAG_IMPACT_2, + .paletteTag = ANIM_TAG_IMPACT_2, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = sAnimCmdTable_SnipeShot, + .images = NULL, + .affineAnims = sSpriteAffineAnimTable_SnipeShot, + .callback = AnimShadowBall +}; + +//jaw lock +const struct SpriteTemplate gJawLockTeethTemplate = +{ + .tileTag = ANIM_TAG_SHARP_TEETH, + .paletteTag = ANIM_TAG_SHARP_TEETH, + .oam = &gOamData_AffineNormal_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_Bite, + .callback = SpriteCB_LockingJaw +}; + +//stuff cheeks +static const union AnimCmd sAnimCmdBerryChomp[] = +{ + ANIMCMD_FRAME(0, 0x30), + ANIMCMD_FRAME(0, 0x25), + ANIMCMD_FRAME(16, 3), + ANIMCMD_END, +}; +static const union AnimCmd *const sAnimCmdTable_BerryChomp[] = +{ + sAnimCmdBerryChomp, +}; +const struct SpriteTemplate gFloatingBerryTemplate = +{ + .tileTag = ANIM_TAG_BERRY_NORMAL, + .paletteTag = ANIM_TAG_BERRY_NORMAL, + .oam = &gOamData_AffineDouble_ObjNormal_32x32, + .anims = sAnimCmdTable_BerryChomp, + .images = NULL, + .affineAnims = gMetronomeFingerAffineAnimTable, + .callback = AnimMetronomeFinger +}; + +//no retreat +static const struct OamData sPyroBallFlamesOAM = +{ + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .shape = SPRITE_SHAPE(32x32), + .size = SPRITE_SIZE(32x32), + .priority = 1, //Above sprites +}; +const struct SpriteTemplate gNoRetreatFlameTemplate = +{ + .tileTag = ANIM_TAG_SMALL_EMBER, + .paletteTag = ANIM_TAG_SMALL_EMBER, + .oam = &sPyroBallFlamesOAM, + .anims = gAnims_DragonBreathFire, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_SpriteOnMonForDuration +}; + +//magic powder +const struct SpriteTemplate gMagicPowderBluePowderTemplate = +{ + .tileTag = ANIM_TAG_POISON_POWDER, + .paletteTag = ANIM_TAG_WATER_GUN, + .oam = &gOamData_AffineOff_ObjNormal_8x16, + .anims = gPowderParticlesAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMovePowderParticle +}; + +//dreepy missile +const struct SpriteTemplate gDreepyMissileTemplate = +{ + .tileTag = ANIM_TAG_DREEPY, + .paletteTag = ANIM_TAG_DREEPY, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimShadowBall +}; + +//bolt beak +const struct SpriteTemplate gBoltBeakBlueSparkTemplate = +{ + .tileTag = ANIM_TAG_SPARK_2, + .paletteTag = ANIM_TAG_ELECTRICITY, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSparkElectricity +}; + +const struct SpriteTemplate gBoltBeakBlueFlashingSparkTemplate = +{ + .tileTag = ANIM_TAG_SPARK_2, + .paletteTag = ANIM_TAG_ELECTRICITY, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_FlashingSpark, + .callback = AnimSparkElectricityFlashing +}; + +//fishious rend +static const struct OamData sFishiousRendTeethOam = +{ + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .shape = SPRITE_SHAPE(64x64), + .size = SPRITE_SIZE(64x64), + .priority = 1, //Above sprites +}; +const struct SpriteTemplate gFishiousRendTeethTemplate = +{ + .tileTag = ANIM_TAG_SHARP_TEETH, + .paletteTag = ANIM_TAG_SHARP_TEETH, + .oam = &sFishiousRendTeethOam, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_LeftRightSlice +}; + +//clangorous soul +const struct SpriteTemplate gClangorousSoulBlueBuffTemplate = +{ + .tileTag = ANIM_TAG_FOCUS_ENERGY, + .paletteTag = ANIM_TAG_WATER_ORB, + .oam = &gOamData_AffineOff_ObjNormal_16x32, + .anims = gEndureEnergyAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimEndureEnergy +}; + +const struct SpriteTemplate gClangorousSoulPurpleBuffTemplate = +{ + .tileTag = ANIM_TAG_FOCUS_ENERGY, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_AffineOff_ObjNormal_16x32, + .anims = gEndureEnergyAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimEndureEnergy +}; + +const struct SpriteTemplate gClangorousSoulWhiteBuffTemplate = +{ + .tileTag = ANIM_TAG_FOCUS_ENERGY, + .paletteTag = ANIM_TAG_AIR_WAVE_2, + .oam = &gOamData_AffineOff_ObjNormal_16x32, + .anims = gEndureEnergyAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimEndureEnergy +}; + +const struct SpriteTemplate gClangorousSoulRedFistTemplate = +{ + .tileTag = ANIM_TAG_HORSESHOE_SIDE_FIST, + .paletteTag = ANIM_TAG_VERTICAL_HEX, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_HandOrFoot, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimJumpKick +}; + +const struct SpriteTemplate gClangorousSoulRedRingTemplate = +{ + .tileTag = ANIM_TAG_THIN_RING, + .paletteTag = ANIM_TAG_VERTICAL_HEX, + .oam = &gOamData_AffineDouble_ObjNormal_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gThinRingExpandingAffineAnimTable, + .callback = AnimSpriteOnMonPos +}; + +//pyro ball +static const struct OamData sPyroBallRockOAM = +{ + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .shape = SPRITE_SHAPE(16x16), + .size = SPRITE_SIZE(16x16), + .priority = 1, //Above sprites +}; +const struct SpriteTemplate gPyroBallRockTemplate = +{ + .tileTag = ANIM_TAG_FLAT_ROCK, + .paletteTag = ANIM_TAG_FLAT_ROCK, + .oam = &sPyroBallRockOAM, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_PyroBallRockBounce +}; + +const struct SpriteTemplate gPyroBallBurningRockTemplate = +{ + .tileTag = ANIM_TAG_SMALL_EMBER, + .paletteTag = ANIM_TAG_SMALL_EMBER, + .oam = &sPyroBallFlamesOAM, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_PyroBallRockBounce +}; + +const struct SpriteTemplate gPyroBallFlamesUpTemplate = +{ + .tileTag = ANIM_TAG_SMALL_EMBER, + .paletteTag = ANIM_TAG_SMALL_EMBER, + .oam = &sPyroBallFlamesOAM, + .anims = gAnims_DragonBreathFire, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_PyroBallRockBounce +}; + +const struct SpriteTemplate gPyroBallEmberBallTemplate = +{ + .tileTag = ANIM_TAG_SMALL_EMBER, + .paletteTag = ANIM_TAG_SMALL_EMBER, + .oam = &sPyroBallFlamesOAM, + .anims = gAnims_DragonBreathFire, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_PyroBallLaunch +}; + +//aura wheel +const struct SpriteTemplate gAuraWheelBlueElectricityTemplate = +{ + .tileTag = ANIM_TAG_SPARK_2, + .paletteTag = ANIM_TAG_SPARK_2, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_ShadowBall, + .callback = AnimFireSpiralOutward +}; + +const struct SpriteTemplate gAuraWheelRedElectricityTemplate = +{ + .tileTag = ANIM_TAG_SPARK_2, + .paletteTag = ANIM_TAG_SPARK, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_ShadowBall, + .callback = AnimFireSpiralOutward +}; + +//breaking swipe +const struct SpriteTemplate gBreakingSwipeCenteredElectricity = +{ + .tileTag = ANIM_TAG_SPARK_2, + .paletteTag = ANIM_TAG_SPARK_2, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_CentredElectricity +}; + +//branch poke +const struct SpriteTemplate gBranchPokeBranchTemplate = +{ + .tileTag = ANIM_TAG_BRANCH, + .paletteTag = ANIM_TAG_BRANCH, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimShadowBall +}; + +//apple acid +const struct SpriteTemplate gAppleAcidFloatingAppleTemplate = +{ + .tileTag = ANIM_TAG_APPLE, + .paletteTag = ANIM_TAG_APPLE, + .oam = &gOamData_AffineDouble_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gMetronomeFingerAffineAnimTable, + .callback = AnimMetronomeFinger +}; + +const struct SpriteTemplate gAppleAcidLaunchTemplate = +{ + .tileTag = ANIM_TAG_POISON_BUBBLE, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_AffineDouble_ObjNormal_16x16, + .anims = gAnims_PoisonProjectile, + .images = NULL, + .affineAnims = gAffineAnims_PoisonProjectile, + .callback = SpriteCB_AcidLaunchSingleTarget +}; + +const struct SpriteTemplate gAppleAcidDripTemplate = +{ + .tileTag = ANIM_TAG_POISON_BUBBLE, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_AffineDouble_ObjNormal_16x16, + .anims = gAnims_AcidPoisonDroplet, + .images = NULL, + .affineAnims = gAffineAnims_Droplet, + .callback = SpriteCB_AcidDripSingleTarget +}; + +//grav apple +static const struct OamData sAppleOAM = +{ + .affineMode = ST_OAM_AFFINE_DOUBLE, + .objMode = ST_OAM_OBJ_NORMAL, + .shape = SPRITE_SHAPE(32x32), + .size = SPRITE_SIZE(32x32), + .priority = 1, //Above sprites +}; +const struct SpriteTemplate gGravAppleSmallApple = +{ + .tileTag = ANIM_TAG_APPLE, + .paletteTag = ANIM_TAG_APPLE, + .oam = &sAppleOAM, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_FallingObject +}; + +static const union AffineAnimCmd sSpriteAffineAnim_ScaledApple[] = +{ + AFFINEANIMCMD_FRAME(64, 64, 0, 10), //Quadruple in size + AFFINEANIMCMD_END +}; +static const union AffineAnimCmd* const sSpriteAffineAnimTable_ScaledApple[] = +{ + sSpriteAffineAnim_ScaledApple, +}; +const struct SpriteTemplate gGravAppleLargeApple = +{ + .tileTag = ANIM_TAG_APPLE, + .paletteTag = ANIM_TAG_APPLE, + .oam = &sAppleOAM, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = sSpriteAffineAnimTable_ScaledApple, + .callback = SpriteCB_FallingObject +}; + +//strange steam +const struct SpriteTemplate gStrangeSteamPinkCloudTemplate = +{ + .tileTag = ANIM_TAG_PINK_CLOUD, + .paletteTag = ANIM_TAG_PINK_CLOUD, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_ShadowBall, + .callback = AnimDirtScatter +}; + +const struct SpriteTemplate gStrangeSteamGreenCloudTemplate = +{ + .tileTag = ANIM_TAG_PINK_CLOUD, + .paletteTag = ANIM_TAG_FINGER, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_ShadowBall, + .callback = AnimDirtScatter +}; + +const struct SpriteTemplate gStrangeSteamBlueCloudTemplate = +{ + .tileTag = ANIM_TAG_PINK_CLOUD, + .paletteTag = ANIM_TAG_WATER_GUN, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_ShadowBall, + .callback = AnimDirtScatter +}; + +//life dew +static const union AnimCmd sAnimCmdWaterDropletDrip[] = +{ + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(16, 3), + ANIMCMD_FRAME(32, 3), + ANIMCMD_FRAME(48, 3), + ANIMCMD_END, +}; +static const union AnimCmd sAnimCmdWaterDropletSplash[] = +{ + ANIMCMD_FRAME(64, 3), + ANIMCMD_FRAME(80, 3), + ANIMCMD_FRAME(96, 3), + ANIMCMD_FRAME(112, 10), + ANIMCMD_END, +}; +static const union AnimCmd *const sAnimCmdWaterDroplet[] = +{ + sAnimCmdWaterDropletDrip, + sAnimCmdWaterDropletSplash, +}; +const struct SpriteTemplate gLifeDewDropletTemplate = +{ + .tileTag = ANIM_TAG_WATER_DROPLET, + .paletteTag = ANIM_TAG_WATER_DROPLET, + .oam = &sAppleOAM, + .anims = sAnimCmdWaterDroplet, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_WaterDroplet +}; + +const struct SpriteTemplate gLifeDewSpecialOrbsTemplate = +{ + .tileTag = ANIM_TAG_BLUE_STAR, + .paletteTag = ANIM_TAG_BLUE_STAR, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gHealingBlueStarAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_AnimSpriteOnSelectedMonPos +}; + +//obstruct +const struct SpriteTemplate gObstructCrossTemplate = +{ + .tileTag = ANIM_TAG_OBSTRUCT_CROSS, + .paletteTag = ANIM_TAG_OBSTRUCT_CROSS, + .oam = &gOamData_AffineOff_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimCrossImpact +}; + +//meteor assault +static const struct OamData sGrowingSuperpowerOAM = +{ + .affineMode = ST_OAM_AFFINE_DOUBLE, + .objMode = ST_OAM_OBJ_NORMAL, + .shape = SPRITE_SHAPE(64x64), + .size = SPRITE_SIZE(64x64), + .priority = 2, +}; +static const union AffineAnimCmd sSpriteAffineAnim_GrowingSuperpowerEnemyAttack[] = +{ + AFFINEANIMCMD_FRAME(0, 0, 128, 1), //180 degree turn + AFFINEANIMCMD_FRAME(0, 0, 0, 2), //Pause + AFFINEANIMCMD_FRAME(16, 16, 0, 15), //Double in size + AFFINEANIMCMD_END +}; +static const union AffineAnimCmd sSpriteAffineAnim_GrowingSuperpowerPlayerAttack[] = +{ + AFFINEANIMCMD_FRAME(0, 0, 0, 2), //Pause + AFFINEANIMCMD_FRAME(16, 16, 0, 15), //Double in size + AFFINEANIMCMD_END +}; +static const union AffineAnimCmd* const sSpriteAffineAnimTable_GrowingSuperpower[] = +{ + sSpriteAffineAnim_GrowingSuperpowerPlayerAttack, + sSpriteAffineAnim_GrowingSuperpowerEnemyAttack, +}; +const struct SpriteTemplate gGrowingSuperpowerTemplate = //used in breakneck blitz +{ + .tileTag = ANIM_TAG_METEOR, + .paletteTag = ANIM_TAG_METEOR, + .oam = &sGrowingSuperpowerOAM, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = sSpriteAffineAnimTable_GrowingSuperpower, + .callback = SpriteCB_GrowingSuperpower +}; + +//steel beam +const struct SpriteTemplate gSteelBeamSpikeShardTemplate = +{ + .tileTag = ANIM_TAG_SPIKES, + .paletteTag = ANIM_TAG_SPIKES, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_ShadowBall, + .callback = AnimDirtScatter +}; + +//// functions +//general +static u8 LoadBattleAnimTarget(u8 arg) +{ + u8 battler; + + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + switch (gBattleAnimArgs[arg]) + { + case 0: + battler = gBattleAnimAttacker; + break; + default: + battler = gBattleAnimTarget; + break; + case 2: + battler = BATTLE_PARTNER(gBattleAnimAttacker); + break; + case 3: + battler = BATTLE_PARTNER(gBattleAnimTarget); + break; + } + } + else + { + if (gBattleAnimArgs[arg] == 0) + battler = gBattleAnimAttacker; + else + battler = gBattleAnimTarget; + } + + return battler; +} + +static u8 GetProperCentredCoord(u8 battler, u8 coordType) +{ + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + return (GetBattlerSpriteCoord2(battler, coordType) + GetBattlerSpriteCoord2(BATTLE_PARTNER(battler), coordType)) / 2; + + return GetBattlerSpriteCoord(battler, coordType); +} + +static void InitSpritePosToGivenTarget(struct Sprite* sprite, u8 target) +{ + sprite->pos1.x = GetBattlerSpriteCoord2(target, BATTLER_COORD_X); + sprite->pos1.y = GetBattlerSpriteCoord2(target, BATTLER_COORD_Y); + + SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); + sprite->pos2.y = gBattleAnimArgs[1]; +} + +static void InitSpritePosToAnimTargetsCentre(struct Sprite *sprite, bool8 respectMonPicOffsets) +{ + if (!respectMonPicOffsets) + { + sprite->pos1.x = (GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X) + + GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_X)) / 2; + sprite->pos1.y = (GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y) + + GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_Y)) / 2; + } + + SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); + sprite->pos1.y += gBattleAnimArgs[1]; +} + +static void InitSpritePosToAnimAttackersCentre(struct Sprite *sprite, bool8 respectMonPicOffsets) +{ + if (!respectMonPicOffsets) + { + sprite->pos1.x = (GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_X) + + GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimAttacker), BATTLER_COORD_X)) / 2; + sprite->pos1.y = (GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_Y) + + GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimAttacker), BATTLER_COORD_Y)) / 2; + } + else + { + sprite->pos1.x = (GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_X_2) + + GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimAttacker), BATTLER_COORD_X_2)) / 2; + sprite->pos1.y = (GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + + GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimAttacker), BATTLER_COORD_Y_PIC_OFFSET)) / 2; + } + + SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); + sprite->pos1.y += gBattleAnimArgs[1]; +} + +//sprite callbacks +static void SpriteCB_SpriteToCentreOfSide(struct Sprite* sprite) +{ + bool8 var; + + if (!sprite->data[0]) + { + if (!gBattleAnimArgs[3]) + var = TRUE; + else + var = FALSE; + + if (gBattleAnimArgs[2] == 0) //Attacker + { + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + InitSpritePosToAnimAttackersCentre(sprite, var); + else + InitSpritePosToAnimAttacker(sprite, var); + } + else + { + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + InitSpritePosToAnimTargetsCentre(sprite, var); + else + InitSpritePosToAnimTarget(sprite, var); + } + + sprite->data[0]++; + } + else if (sprite->animEnded || sprite->affineAnimEnded) + { + DestroySpriteAndMatrix(sprite); + } +} + +static void SpriteCB_SpriteOnMonForDuration(struct Sprite *sprite) +{ + u8 target = LoadBattleAnimTarget(0); + + if (!IsBattlerSpriteVisible(target)) + { + DestroyAnimSprite(sprite); + } + else + { + sprite->pos1.x = GetBattlerSpriteCoord(target, 0); + sprite->pos1.y = GetBattlerSpriteCoord(target, 1); + sprite->pos1.x += gBattleAnimArgs[1]; + sprite->pos1.y += gBattleAnimArgs[2]; + sprite->data[0] = 0; + sprite->data[1] = gBattleAnimArgs[3]; + sprite->data[2] = gBattleAnimArgs[4]; + sprite->data[3] = 0; + sprite->callback = AnimBrickBreakWall_Step; + } +} + +static void SpriteCB_ToxicThreadWrap(struct Sprite *sprite) +{ + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + sprite->pos1.x -= gBattleAnimArgs[0]; + else + sprite->pos1.x += gBattleAnimArgs[0]; + + sprite->pos1.y += gBattleAnimArgs[1]; + if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) + sprite->pos1.y += 8; + + sprite->callback = AnimStringWrap_Step; +} + + +static void SpriteCB_GrowingSuperpower(struct Sprite *sprite) +{ + u8 battler; + + if (gBattleAnimArgs[0] == 0) + { + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); + sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); + battler = gBattleAnimTarget; + sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker); + } + else + { + battler = gBattleAnimAttacker; + sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget); + } + + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) + StartSpriteAffineAnim(sprite, 1); + + sprite->data[0] = 16; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = GetBattlerSpriteCoord(battler, 2); + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = GetBattlerSpriteCoord(battler, 3); + + InitAnimLinearTranslation(sprite); + StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); + sprite->callback = sub_80A6F98; +} + +static void SpriteCB_CentredSpiderWeb(struct Sprite* sprite) +{ + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + InitSpritePosToAnimTargetsCentre(sprite, FALSE); + else + InitSpritePosToAnimTarget(sprite, FALSE); + + sprite->callback = AnimSpiderWeb; +} + +static void SpriteCB_CoreEnforcerHits(struct Sprite* sprite) +{ + StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]); + + if (gBattleAnimArgs[2] == 0) + { + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + InitSpritePosToAnimAttackersCentre(sprite, FALSE); + else + InitSpritePosToAnimAttacker(sprite, FALSE); + } + else + { + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + InitSpritePosToAnimTargetsCentre(sprite, FALSE); + else + InitSpritePosToAnimTarget(sprite, FALSE); + } + + sprite->pos1.y += 20; + sprite->callback = AnimFlashingHitSplat_Step; +} + +static void SpriteCB_CoreEnforcerBeam(struct Sprite* sprite) +{ + if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + { + AnimSolarbeamBigOrb(sprite); + } + else + { + InitSpritePosToAnimAttacker(sprite, TRUE); + StartSpriteAnim(sprite, gBattleAnimArgs[3]); + + sprite->data[0] = gBattleAnimArgs[2]; + + sprite->data[2] = (GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + + GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_X_2)) / 2; + + + sprite->data[4] = (GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + + GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_Y_PIC_OFFSET)) / 2; + + sprite->callback = StartAnimLinearTranslation; + StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); + } +} + +static void SpriteCB_TranslateAnimSpriteToTargetMonLocationDoubles(struct Sprite* sprite) +{ + bool8 v1; + u8 target; + u8 coordType; + + if (!(gBattleAnimArgs[5] & 0xff00)) + v1 = TRUE; + else + v1 = FALSE; + + if (!(gBattleAnimArgs[5] & 0xff)) + coordType = BATTLER_COORD_Y_PIC_OFFSET; + else + coordType = BATTLER_COORD_Y; + + InitSpritePosToAnimAttacker(sprite, v1); + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + + target = LoadBattleAnimTarget(6); + + if (!IsBattlerSpriteVisible(target)) + DestroyAnimSprite(sprite); + else + { + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[2] = GetBattlerSpriteCoord(target, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; + sprite->data[4] = GetBattlerSpriteCoord(target, coordType) + gBattleAnimArgs[3]; + sprite->callback = StartAnimLinearTranslation; + StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); + } +} + +//Causes an object to fall from the sky. +//arg 0: initial x pixel offset +//arg 1: initial y pixel offset +//arg 2: speed +//arg 3: anim battler +static void SpriteCB_FallingObject(struct Sprite *sprite) +{ + u8 target = LoadBattleAnimTarget(3); + + if (!IsBattlerSpriteVisible(target)) + DestroyAnimSprite(sprite); + else + { + sprite->pos1.x = GetBattlerSpriteCoord2(target, BATTLER_COORD_X); + sprite->pos1.y = GetBattlerSpriteCoord2(target, BATTLER_COORD_Y); + + sprite->pos2.x = gBattleAnimArgs[0]; + sprite->pos1.y = gBattleAnimArgs[1]; + sprite->pos2.y = -gBattleAnimArgs[1]; + + if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) + { + sprite->pos1.y += 45; + sprite->pos2.y -= 45; + } + + sprite->data[3] = gBattleAnimArgs[2]; //Speed + sprite->callback = SpriteCB_FallingObjectStep; + } +} +static void SpriteCB_FallingObjectStep(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->pos2.y += sprite->data[3]; + if (sprite->pos2.y >= 0) + { + sprite->pos2.y = 0; + sprite->data[0]++; + } + break; + case 1: + if (++sprite->data[1] > 0) + { + sprite->data[1] = 0; + sprite->invisible ^= 1; + if (++sprite->data[2] == 10) + DestroySpriteAndMatrix(sprite); + } + break; + } +} + +static void SpriteCB_SunsteelStrikeRings(struct Sprite* sprite) +{ + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + { + sprite->pos1.x = 272; + sprite->pos1.y = -32; + } + else + { + sprite->pos1.x = -32; + sprite->pos1.y = -32; + } + + sprite->data[0] = gBattleAnimArgs[0]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); + + InitAnimLinearTranslation(sprite); + sprite->callback = AnimFlyBallAttack_Step; +} + +//arg 0: initial x pixel offset +//arg 1: initial y pixel offset +//arg 2: target x pixel offset +//arg 3: target y pixel offset +//arg 4: duration +//arg 5: wave amplitude +static void SpriteCB_MoongeistCharge(struct Sprite *sprite) +{ + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[0]; + sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1]; + + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; //Target X + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; //Target Y + sprite->data[5] = gBattleAnimArgs[5]; + + InitAnimArcTranslation(sprite); + sprite->callback = AnimMissileArc_Step; +} + +//Spins a sprite towards the target, pausing in the middle. +//Used in Mind Blown. +//arg 0: duration step 1 (attacker -> center) +//arg 1: duration step 2 (spin center) +//arg 2: duration step 3 (center -> target) +static void SpriteCB_MindBlownBall(struct Sprite *sprite) +{ + s16 oldPosX = sprite->pos1.x; + s16 oldPosY = sprite->pos1.y; + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); + sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); + sprite->data[0] = 0; + sprite->data[1] = gBattleAnimArgs[0]; + sprite->data[2] = gBattleAnimArgs[1]; + sprite->data[3] = gBattleAnimArgs[2]; + sprite->data[4] = sprite->pos1.x << 4; + sprite->data[5] = sprite->pos1.y << 4; + sprite->data[6] = ((oldPosX - sprite->pos1.x) << 4) / (gBattleAnimArgs[0] << 1); + sprite->data[7] = ((oldPosY - sprite->pos1.y) << 4) / (gBattleAnimArgs[0] << 1); + sprite->callback = AnimMindBlownBallStep; +} +static void AnimMindBlownBallStep(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->data[4] += sprite->data[6]; + sprite->data[5] += sprite->data[7]; + sprite->pos1.x = sprite->data[4] >> 4; + sprite->pos1.y = sprite->data[5] >> 4; + sprite->data[1] -= 1; + if (sprite->data[1] > 0) + break; + sprite->data[0] += 1; + break; + case 1: + sprite->data[2] -= 1; + if (sprite->data[2] > 0) + break; + + sprite->data[1] = GetProperCentredCoord(gBattleAnimTarget, BATTLER_COORD_X_2); + sprite->data[2] = GetProperCentredCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); + sprite->data[4] = sprite->pos1.x << 4; + sprite->data[5] = sprite->pos1.y << 4; + sprite->data[6] = ((sprite->data[1] - sprite->pos1.x) << 4) / sprite->data[3]; + sprite->data[7] = ((sprite->data[2] - sprite->pos1.y) << 4) / sprite->data[3]; + sprite->data[0] += 1; + break; + case 2: + sprite->data[4] += sprite->data[6]; + sprite->data[5] += sprite->data[7]; + sprite->pos1.x = sprite->data[4] >> 4; + sprite->pos1.y = sprite->data[5] >> 4; + sprite->data[3] -= 1; + if (sprite->data[3] > 0) + break; + sprite->pos1.x = GetProperCentredCoord(gBattleAnimTarget, BATTLER_COORD_X_2); + sprite->pos1.y = GetProperCentredCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); + sprite->data[0] += 1; + break; + case 3: + DestroySpriteAndMatrix(sprite); + break; + } +} + +static void SpriteCB_MindBlownExplosion(struct Sprite* sprite) +{ + u8 a; + u8 b; + u16 x; + u16 y; + + if (gBattleAnimArgs[4] == 0) + { + DestroyAnimSprite(sprite); + } + else + { + a = GetProperCentredCoord(gBattleAnimTarget, BATTLER_COORD_X_2); + b = GetProperCentredCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); + + sprite->data[0] = gBattleAnimArgs[4]; + if (gBattleAnimArgs[1] == 0) + { + sprite->pos1.x = gBattleAnimArgs[2] + a; + sprite->pos1.y = gBattleAnimArgs[3] + b; + sprite->data[5] = a; + sprite->data[6] = b; + } + else + { + sprite->pos1.x = a; + sprite->pos1.y = b; + sprite->data[5] = gBattleAnimArgs[2] + a; + sprite->data[6] = gBattleAnimArgs[3] + b; + } + + x = sprite->pos1.x; + sprite->data[1] = x * 16; + y = sprite->pos1.y; + sprite->data[2] = y * 16; + sprite->data[3] = (sprite->data[5] - sprite->pos1.x) * 16 / gBattleAnimArgs[4]; + sprite->data[4] = (sprite->data[6] - sprite->pos1.y) * 16 / gBattleAnimArgs[4]; + + sprite->callback = AnimNeedleArmSpike_Step; + } +} + +static void SpriteCB_RandomCentredHits(struct Sprite* sprite) +{ + if (gBattleAnimArgs[1] == -1) + gBattleAnimArgs[1] = Random() & 3; + + StartSpriteAffineAnim(sprite, gBattleAnimArgs[1]); + + if (gBattleAnimArgs[0] == 0) + { + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + InitSpritePosToAnimAttackersCentre(sprite, FALSE); + else + InitSpritePosToAnimAttacker(sprite, FALSE); + } + else + { + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + InitSpritePosToAnimTargetsCentre(sprite, FALSE); + else + InitSpritePosToAnimTarget(sprite, FALSE); + } + + sprite->pos2.x += (Random() % 48) - 24; + sprite->pos2.y += (Random() % 24) - 12; + + StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); + sprite->callback = RunStoredCallbackWhenAffineAnimEnds; +} + +//Creates a jaw that bites down and locks on the target. +//args: Idk same as bite and crunch +//arg 6: Time to hold bite for. +static void SpriteCB_LockingJaw(struct Sprite *sprite) +{ + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + StartSpriteAffineAnim(sprite, gBattleAnimArgs[2]); + sprite->data[0] = gBattleAnimArgs[3]; + sprite->data[1] = gBattleAnimArgs[4]; + sprite->data[2] = gBattleAnimArgs[5]; + sprite->data[6] = -gBattleAnimArgs[6]; + sprite->callback = SpriteCB_LockingJawStep; +} +static void SpriteCB_LockingJawStep(struct Sprite *sprite) +{ + sprite->data[4] += sprite->data[0]; + sprite->data[5] += sprite->data[1]; + sprite->pos2.x = sprite->data[4] >> 8; + sprite->pos2.y = sprite->data[5] >> 8; + if (++sprite->data[3] == sprite->data[2]) + sprite->callback = SpriteCB_LockingJawFinish; +} +static void SpriteCB_LockingJawFinish(struct Sprite *sprite) +{ + if (--sprite->data[3] <= sprite->data[6]) + DestroySpriteAndMatrix(sprite); +} + +//Creates a sprite that moves left then right along the target. +//arg 0: Slice distance +//arg 1: Speed +static void SpriteCB_LeftRightSlice(struct Sprite *sprite) +{ + sprite->pos2.x = gBattleAnimArgs[0]; + sprite->data[0] = -gBattleAnimArgs[0]; //Slice distance + sprite->data[1] = gBattleAnimArgs[1]; //Slice speed + sprite->callback = SpriteCB_LeftRightSliceStep0; +} +static void SpriteCB_LeftRightSliceStep1(struct Sprite *sprite) +{ + sprite->pos2.x += sprite->data[1]; + if (sprite->pos2.x >= sprite->data[0]) + DestroyAnimSprite(sprite); +} +static void SpriteCB_LeftRightSliceStep0(struct Sprite *sprite) +{ + sprite->pos2.x -= sprite->data[1]; + if (sprite->pos2.x <= sprite->data[0]) + { + sprite->data[0] = -sprite->data[0]; + sprite->callback = SpriteCB_LeftRightSliceStep1; + } +} + +//Creates a rock that bounces between the attacker's feet. +//arg 0: initial x pixel offset +//arg 1: initial y pixel offset +//arg 2: Ignore horizontal motion if TRUE. Only bounce once. +#define sVerticalTime sprite->data[0] +#define sHorizontalTime sprite->data[1] +#define sMovingBackHorizontally sprite->data[2] +static void SpriteCB_PyroBallRockBounceStep(struct Sprite* sprite) +{ + s8 initialVerticalVelocity; + s8 initialHorizontalVelocity; + + if (sprite->pos2.y > 0) //Rock returned back down + { + if (gBattleAnimArgs[2] || sMovingBackHorizontally) //Finished moving from left to right + DestroyAnimSprite(sprite); + else + { + sVerticalTime = 0; + sMovingBackHorizontally = TRUE; + } + } + + initialVerticalVelocity = -6; + initialHorizontalVelocity = -1; //Starts by moving right to left + + //vi = -6 + //g = 0.25 (gravity not negative b/c go up to go closer to 0) + //h = vi*t + 0.5g*t^2 + //t = sVerticalTime + sprite->pos2.y = (initialVerticalVelocity * sVerticalTime + (1 * sVerticalTime * sVerticalTime) / 4); + + //x = vi*t + //vi = sprite->data[2] + //t = sHorizontalTime + if (!gBattleAnimArgs[2]) + sprite->pos2.x = (initialHorizontalVelocity * sHorizontalTime); + + sVerticalTime++; + + if (sMovingBackHorizontally) + sHorizontalTime--; //Move left to right + else + sHorizontalTime++; //Move right to left +} + +static void InitSpritePositionForPyroBall(struct Sprite* sprite) +{ + InitSpritePosToAnimAttacker(sprite, 0); + sprite->pos1.y += 20; //Move closer to attacker's feet + + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) + sprite->pos1.y += 20; //Move below the text box + +} + +static void SpriteCB_PyroBallRockBounce(struct Sprite* sprite) +{ + InitSpritePositionForPyroBall(sprite); + sprite->callback = SpriteCB_PyroBallRockBounceStep; +} +#undef sVerticalTime +#undef sHorizontalTime +#undef sMovingBackHorizontally + +//Launches a projectile from the attacker's feet at the target. +//arg 0: initial x pixel offset +//arg 1: initial y pixel offset +//arg 2: target x pixel offset +//arg 3: target y pixel offset +//arg 4: duration +//arg 5: wave amplitude +static void SpriteCB_PyroBallLaunch(struct Sprite* sprite) +{ + InitSpritePositionForPyroBall(sprite); + + if (GetBattlerSide(gBattleAnimAttacker)) + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; //Target X + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; //Target Y + sprite->data[5] = gBattleAnimArgs[5]; + InitAnimArcTranslation(sprite); + + sprite->callback = AnimMissileArc_Step; +} + +//Throws acid at a single target. +static void SpriteCB_AcidLaunchSingleTarget(struct Sprite *sprite) +{ + s16 l1, l2; + + if (!gBattleAnimArgs[3]) + StartSpriteAnim(sprite, 2); + + InitSpritePosToAnimTarget(sprite, TRUE); + l1 = sprite->pos1.x; l2 = sprite->pos1.y; + InitSpritePosToAnimAttacker(sprite, TRUE); + if (GetBattlerSide(gBattleAnimAttacker)) + gBattleAnimArgs[4] = -gBattleAnimArgs[4]; + + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[2] = l1 + gBattleAnimArgs[4]; + sprite->data[4] = l2 + gBattleAnimArgs[5]; + sprite->data[5] = -30; + InitAnimArcTranslation(sprite); + sprite->callback = AnimAcidPoisonBubble_Step; +} + +//Causes acid to drip down a single target. +static void SpriteCB_AcidDripSingleTarget(struct Sprite *sprite) +{ + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2]; + sprite->data[4] = sprite->pos1.y + sprite->data[0]; + + sprite->callback = StartAnimLinearTranslation; + StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); +} + +//Causes an object to fall from the sky. +//arg 0: initial x pixel offset +//arg 1: initial y pixel offset +//arg 2: anim battler +static void SpriteCB_WaterDroplet(struct Sprite *sprite) +{ + u8 target = LoadBattleAnimTarget(2); + + if (!IsBattlerSpriteVisible(target)) + DestroyAnimSprite(sprite); + else + { + InitSpritePosToGivenTarget(sprite, target); + sprite->data[1] = sprite->pos1.y; //Target's y coord + + sprite->pos2.x = gBattleAnimArgs[0]; + sprite->pos2.y = 0; + + //Put droplet at the top of the screen + sprite->pos1.y = 15; + + sprite->callback = SpriteCB_WaterDropletDrip; + } +} +static void SpriteCB_WaterDropletDrip(struct Sprite *sprite) +{ + sprite->data[0] = 12; + StartSpriteAnim(sprite, 0); + sprite->callback = WaitAnimForDuration; + StoreSpriteCallbackInData6(sprite, SpriteCB_WaterDropletDrop); +} +static void SpriteCB_WaterDropletDrop(struct Sprite *sprite) +{ + sprite->pos2.y += 4; + if (sprite->pos2.y >= sprite->data[1]) + { + sprite->data[0] = 19; + StartSpriteAnim(sprite, 1); + sprite->callback = WaitAnimForDuration; + StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); + } +} + +static void SpriteCB_AnimSpriteOnSelectedMonPos(struct Sprite *sprite) +{ + if (!sprite->data[0]) + { + u8 target = LoadBattleAnimTarget(2); + + if (!IsBattlerSpriteVisible(target)) + DestroyAnimSprite(sprite); + else + { + InitSpritePosToGivenTarget(sprite, target); + sprite->data[0]++; + } + } + else if (sprite->animEnded || sprite->affineAnimEnded) + { + DestroySpriteAndMatrix(sprite); + } +} + +static void SpriteCB_SurroundingRing(struct Sprite *sprite) +{ + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0); + sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1) + 40; + + sprite->data[0] = 13; + sprite->data[2] = sprite->pos1.x; + sprite->data[4] = sprite->pos1.y - 72; + + sprite->callback = StartAnimLinearTranslation; + StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); +} + +//Imitates launching a beam of light towards the sky +//arg 0: initial x pixel offset +//arg 1: initial y pixel offset +//arg 2: battler +//arg 3: duration +//arg 4: Anim num +//arg 5: affine anim start delay +static void SpriteCB_PhotonGeyserBeam(struct Sprite* sprite) +{ + u8 target = LoadBattleAnimTarget(2); + + if (!IsBattlerSpriteVisible(target)) + DestroyAnimSprite(sprite); + else + { + InitSpritePosToGivenTarget(sprite, target); + StartSpriteAnim(sprite, gBattleAnimArgs[4]); + sprite->data[0] = gBattleAnimArgs[3]; + sprite->data[1] = gBattleAnimArgs[5]; + sprite->callback = SpriteCB_BeamUpStep; + } +} +//Animates the beam of light +static void SpriteCB_BeamUpStep(struct Sprite* sprite) +{ + if (sprite->data[1]-- == 0) + StartSpriteAffineAnim(sprite, 1); + + if (sprite->data[0]-- <= 0) + DestroySpriteAndMatrix(sprite); +} + +static void SpriteCB_CentredElectricity(struct Sprite* sprite) +{ + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + InitSpritePosToAnimTargetsCentre(sprite, FALSE); + else + InitSpritePosToAnimTarget(sprite, FALSE); + + sprite->oam.tileNum += gBattleAnimArgs[3] * 4; + + if (gBattleAnimArgs[3] == 1) + sprite->oam.matrixNum = 8; + else if (gBattleAnimArgs[3] == 2) + sprite->oam.matrixNum = 16; + + sprite->data[0] = gBattleAnimArgs[2]; + sprite->callback = WaitAnimForDuration; + StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); +} + +static void AnimSkyDropBallUp(struct Sprite *sprite) +{ + InitSpritePosToAnimTarget(sprite, TRUE); + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[1] = gBattleAnimArgs[3]; + sprite->callback = AnimFlyBallUp_Step; + gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].invisible = TRUE; +} + +static void SpriteCB_SearingShotRock(struct Sprite* sprite) +{ + u8 target = LoadBattleAnimTarget(4); + + if (!IsBattlerSpriteVisible(target)) + { + DestroyAnimSprite(sprite); + } + else + { + InitSpritePosToGivenTarget(sprite, target); + StartSpriteAnim(sprite, gBattleAnimArgs[2]); + sprite->data[0] = gBattleAnimArgs[3]; + sprite->callback = WaitAnimForDuration; + StoreSpriteCallbackInData6(sprite, AnimSpinningKickOrPunchFinish); + } +} + +static void AnimHappyHourCoinShower(struct Sprite *sprite) +{ + if (gBattleAnimArgs[3] != 0) + SetAverageBattlerPositions(gBattleAnimAttacker, 0, &sprite->pos1.x, &sprite->pos1.y); //coin shower on attacker + + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += 14; + StartSpriteAnim(sprite, gBattleAnimArgs[1]); + AnimateSprite(sprite); + sprite->data[0] = 0; + sprite->data[1] = 0; + sprite->data[2] = 4; + sprite->data[3] = 16; + sprite->data[4] = -70; + sprite->data[5] = gBattleAnimArgs[2]; + StoreSpriteCallbackInData6(sprite, AnimFallingRock_Step); + sprite->callback = TranslateSpriteInEllipseOverDuration; + sprite->callback(sprite); +} + +//Launches an object upwards like they were being shot from a geyser +//arg 0: null +//arg 1: initial x pixel offset +//arg 2: initial y pixel offset +static void SpriteCB_Geyser(struct Sprite* sprite) +{ + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) + gBattleAnimArgs[1]; + sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + gBattleAnimArgs[2]; + + sprite->data[0] = gBattleAnimArgs[1] > 0 ? 1 : -1; + sprite->callback = AnimMudSportDirtRising; +} + +// Anim Task Functions +static void AnimTask_WaitAffineAnim(u8 taskId) +{ + struct Task* task = &gTasks[taskId]; + + if (!RunAffineAnimFromTaskData(task)) + DestroyAnimVisualTask(taskId); +} + +void AnimTask_SquishTarget(u8 taskId) +{ + struct Task* task = &gTasks[taskId]; + u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET); + + PrepareAffineAnimInTaskData(task, spriteId, sSquishTargetAffineAnimCmds); + task->func = AnimTask_WaitAffineAnim; +} + +void CoreEnforcerLoadBeamTarget(struct Sprite* sprite) +{ + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = (GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + + GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_X_2)) / 2; + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = (GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + + GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_Y_PIC_OFFSET)) / 2; +} + +void AnimTask_CreateBestowItem(u8 taskId) +{ + u8 iconSpriteId = AddItemIconSprite(ANIM_TAG_ITEM_BAG, ANIM_TAG_ITEM_BAG, gLastUsedItem); + + if (iconSpriteId != MAX_SPRITES) + { + gSprites[iconSpriteId].oam.priority = 2; + gSprites[iconSpriteId].callback = AnimThrowProjectile; + ++gAnimVisualTaskCount; + } + DestroyAnimVisualTask(taskId); +} + +//Creates purple flames that surround the target. +//No args. +void AnimTask_PurpleFlamesOnTarget(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + task->data[0] = 0; + task->data[1] = 16; + task->data[9] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); + task->data[10] = GetBattlerYCoordWithElevation(gBattleAnimTarget); + task->data[11] = (GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_WIDTH) / 2) + 8; + task->data[7] = 0; + task->data[5] = GetBattlerSpriteBGPriority(gBattleAnimTarget); + task->data[6] = GetBattlerSpriteSubpriority(gBattleAnimTarget) - 2; + task->data[3] = 0; + task->data[4] = 16; + SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL)); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0x10)); + task->data[8] = 0; + task->func = AnimTask_GrudgeFlames_Step; +} + +void AnimTask_TechnoBlast(u8 taskId) +{ + //gBattleAnimArgs[0] = gItems[GetBattlerPartyData(gBattleAnimAttacker).item].holdEffectParam; + gBattleAnimArgs[0] = ItemId_GetHoldEffectParam(gBattleMons[gBattleAnimAttacker].item); + DestroyAnimVisualTask(taskId); +} + diff --git a/src/battle_anim_normal.c b/src/battle_anim_normal.c index f7df9a4a94..0e45fe644c 100644 --- a/src/battle_anim_normal.c +++ b/src/battle_anim_normal.c @@ -16,14 +16,8 @@ static void sub_81159B4(struct Sprite *); static void AnimShakeMonOrBattleTerrain(struct Sprite *); static void AnimShakeMonOrBattleTerrain_Step(struct Sprite *); static void AnimShakeMonOrBattleTerrain_UpdateCoordOffsetEnabled(void); -static void AnimHitSplatBasic(struct Sprite *); static void AnimHitSplatPersistent(struct Sprite *); static void AnimHitSplatHandleInvert(struct Sprite *); -static void AnimHitSplatRandom(struct Sprite *); -static void AnimHitSplatOnMonEdge(struct Sprite *); -static void AnimCrossImpact(struct Sprite *); -static void AnimFlashingHitSplat(struct Sprite *); -static void AnimFlashingHitSplat_Step(struct Sprite *); static void AnimConfusionDuck_Step(struct Sprite *); static void BlendColorCycle(u8, u8, u8); static void AnimTask_BlendColorCycleLoop(u8); @@ -34,6 +28,7 @@ static void AnimTask_BlendColorCycleByTagLoop(u8); static void AnimTask_FlashAnimTagWithColor_Step1(u8); static void AnimTask_FlashAnimTagWithColor_Step2(u8); static void AnimTask_ShakeBattleTerrain_Step(u8); +static void AnimMovePowerSwapGuardSwap(struct Sprite *); static const union AnimCmd sAnim_ConfusionDuck_0[] = { @@ -92,6 +87,63 @@ const struct SpriteTemplate gComplexPaletteBlendSpriteTemplate = .callback = AnimComplexPaletteBlend, }; +static const union AnimCmd sPowerSwapGuardSwapFrame0[] = +{ + ANIMCMD_FRAME(0, 0), + ANIMCMD_END +}; + +static const union AnimCmd sPowerSwapGuardSwapFrame1[] = +{ + ANIMCMD_FRAME(4, 0), + ANIMCMD_END +}; + +static const union AnimCmd sPowerSwapGuardSwapFrame2[] = +{ + ANIMCMD_FRAME(8, 0), + ANIMCMD_END +}; + +static const union AnimCmd sPowerSwapGuardSwapFrame3[] = +{ + ANIMCMD_FRAME(12, 0), + ANIMCMD_END +}; + +static const union AnimCmd sPowerSwapGuardSwapFrame4[] = +{ + ANIMCMD_FRAME(16, 0), + ANIMCMD_END +}; + +static const union AnimCmd sPowerSwapGuardSwapFrame5[] = +{ + ANIMCMD_FRAME(20, 0), + ANIMCMD_END +}; + +static const union AnimCmd * const sPowerSwapGuardSwapAnimTable[] = +{ + sPowerSwapGuardSwapFrame0, + sPowerSwapGuardSwapFrame1, + sPowerSwapGuardSwapFrame2, + sPowerSwapGuardSwapFrame3, + sPowerSwapGuardSwapFrame4, + sPowerSwapGuardSwapFrame5 +}; + +const struct SpriteTemplate gPowerSwapGuardSwapSpriteTemplate = +{ + .tileTag = ANIM_TAG_COLORED_ORBS, + .paletteTag = ANIM_TAG_COLORED_ORBS, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = sPowerSwapGuardSwapAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMovePowerSwapGuardSwap +}; + static const union AnimCmd gUnknown_085972A4[] = { ANIMCMD_FRAME(0, 3), @@ -157,7 +209,7 @@ static const union AffineAnimCmd sAffineAnim_HitSplat_3[] = AFFINEANIMCMD_END, }; -static const union AffineAnimCmd *const sAffineAnims_HitSplat[] = +const union AffineAnimCmd *const gAffineAnims_HitSplat[] = { sAffineAnim_HitSplat_0, sAffineAnim_HitSplat_1, @@ -172,7 +224,7 @@ const struct SpriteTemplate gBasicHitSplatSpriteTemplate = .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_HitSplat, + .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatBasic, }; @@ -183,7 +235,7 @@ const struct SpriteTemplate gHandleInvertHitSplatSpriteTemplate = .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_HitSplat, + .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatHandleInvert, }; @@ -194,7 +246,7 @@ const struct SpriteTemplate gWaterHitSplatSpriteTemplate = .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_HitSplat, + .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatBasic, }; @@ -205,7 +257,7 @@ const struct SpriteTemplate gRandomPosHitSplatSpriteTemplate = .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_HitSplat, + .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatRandom, }; @@ -216,7 +268,7 @@ const struct SpriteTemplate gMonEdgeHitSplatSpriteTemplate = .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_HitSplat, + .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatOnMonEdge, }; @@ -238,7 +290,7 @@ const struct SpriteTemplate gFlashingHitSplatSpriteTemplate = .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_HitSplat, + .affineAnims = gAffineAnims_HitSplat, .callback = AnimFlashingHitSplat, }; @@ -249,10 +301,43 @@ const struct SpriteTemplate gPersistHitSplatSpriteTemplate = .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_HitSplat, + .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatPersistent, }; +static void AnimMovePowerSwapGuardSwapWait(struct Sprite* sprite) +{ + if (TranslateAnimHorizontalArc(sprite)) + DestroyAnimSprite(sprite); +} + +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: orb type (0..5) - color and size +// arg 3: from user to target / target to user +// arg 4: wave period +// arg 5: wave amplitude +static void AnimMovePowerSwapGuardSwap(struct Sprite* sprite) +{ + StartSpriteAnim(sprite, gBattleAnimArgs[2]); + if(gBattleAnimArgs[3] == 0) + { + InitSpritePosToAnimAttacker(sprite, TRUE); + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y); + } + else + { + InitSpritePosToAnimTarget(sprite, TRUE); + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y); + } + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[5] = gBattleAnimArgs[5]; + InitAnimArcTranslation(sprite); + sprite->callback = AnimMovePowerSwapGuardSwapWait; +} + // Moves a spinning duck around the mon's head. // arg 0: initial x pixel offset // arg 1: initial y pixel offset @@ -425,7 +510,7 @@ static void sub_81159B4(struct Sprite *sprite) #define tPalSelectorHi data[9] #define tPalSelectorLo data[10] -// Blends mon/screen to designated color or back alternately tNumBlends times +// Blends mon/screen to designated color or back alternately tNumBlends times // Many uses of this task only set a tNumBlends of 2, which has the effect of blending to a color and back once void AnimTask_BlendColorCycle(u8 taskId) { @@ -719,17 +804,17 @@ static void AnimTask_FlashAnimTagWithColor_Step2(u8 taskId) void AnimTask_InvertScreenColor(u8 taskId) { u32 selectedPalettes = 0; - u8 attackerBattler = gBattleAnimAttacker; - u8 targetBattler = gBattleAnimTarget; - if (gBattleAnimArgs[0] & 0x100) + if (gBattleAnimArgs[0] & 0x1) selectedPalettes = sub_80A75AC(1, 0, 0, 0, 0, 0, 0); - - if (gBattleAnimArgs[1] & 0x100) - selectedPalettes |= (0x10000 << attackerBattler); - - if (gBattleAnimArgs[2] & 0x100) - selectedPalettes |= (0x10000 << targetBattler); + if (gBattleAnimArgs[0] & 0x2) + selectedPalettes |= (0x10000 << gBattleAnimAttacker); + if (gBattleAnimArgs[0] & 0x4) + selectedPalettes |= (0x10000 << gBattleAnimTarget); + if (gBattleAnimArgs[0] & 0x8 && IsBattlerAlive(BATTLE_PARTNER(gBattleAnimTarget))) + selectedPalettes |= (0x10000 << BATTLE_PARTNER(gBattleAnimTarget)); + if (gBattleAnimArgs[0] & 0x10 && IsBattlerAlive(BATTLE_PARTNER(gBattleAnimAttacker))) + selectedPalettes |= (0x10000 << BATTLE_PARTNER(gBattleAnimAttacker)); InvertPlttBuffer(selectedPalettes); DestroyAnimVisualTask(taskId); @@ -765,7 +850,7 @@ void sub_8115F94(u8 taskId) paletteIndex = IndexOfSpritePaletteTag(gSprites[gHealthboxSpriteIds[attackerBattler]].template->paletteTag); selectedPalettes |= (1 << paletteIndex) << 16; } - + if (gTasks[taskId].data[3] & 0x100) selectedPalettes |= (1 << attackerBattler) << 16; @@ -926,7 +1011,7 @@ static void AnimTask_ShakeBattleTerrain_Step(u8 taskId) #undef tTimer #undef tShakeDelay -static void AnimHitSplatBasic(struct Sprite *sprite) +void AnimHitSplatBasic(struct Sprite *sprite) { StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]); if (gBattleAnimArgs[2] == ANIM_ATTACKER) @@ -958,20 +1043,18 @@ static void AnimHitSplatHandleInvert(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER && !IsContest()) gBattleAnimArgs[1] = -gBattleAnimArgs[1]; - + AnimHitSplatBasic(sprite); } -static void AnimHitSplatRandom(struct Sprite *sprite) +void AnimHitSplatRandom(struct Sprite *sprite) { if (gBattleAnimArgs[1] == -1) gBattleAnimArgs[1] = Random2() & 3; + if (!InitSpritePosToAnimBattler(gBattleAnimArgs[0], sprite, FALSE)) + return; StartSpriteAffineAnim(sprite, gBattleAnimArgs[1]); - if (gBattleAnimArgs[0] == ANIM_ATTACKER) - InitSpritePosToAnimAttacker(sprite, 0); - else - InitSpritePosToAnimTarget(sprite, FALSE); sprite->pos2.x += (Random2() % 48) - 24; sprite->pos2.y += (Random2() % 24) - 12; @@ -980,7 +1063,7 @@ static void AnimHitSplatRandom(struct Sprite *sprite) sprite->callback = RunStoredCallbackWhenAffineAnimEnds; } -static void AnimHitSplatOnMonEdge(struct Sprite *sprite) +void AnimHitSplatOnMonEdge(struct Sprite *sprite) { sprite->data[0] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); sprite->pos1.x = gSprites[sprite->data[0]].pos1.x + gSprites[sprite->data[0]].pos2.x; @@ -992,7 +1075,7 @@ static void AnimHitSplatOnMonEdge(struct Sprite *sprite) sprite->callback = RunStoredCallbackWhenAffineAnimEnds; } -static void AnimCrossImpact(struct Sprite *sprite) +void AnimCrossImpact(struct Sprite *sprite) { if (gBattleAnimArgs[2] == ANIM_ATTACKER) InitSpritePosToAnimAttacker(sprite, 1); @@ -1004,7 +1087,7 @@ static void AnimCrossImpact(struct Sprite *sprite) sprite->callback = WaitAnimForDuration; } -static void AnimFlashingHitSplat(struct Sprite *sprite) +void AnimFlashingHitSplat(struct Sprite *sprite) { StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]); if (gBattleAnimArgs[2] == ANIM_ATTACKER) @@ -1015,7 +1098,7 @@ static void AnimFlashingHitSplat(struct Sprite *sprite) sprite->callback = AnimFlashingHitSplat_Step; } -static void AnimFlashingHitSplat_Step(struct Sprite *sprite) +void AnimFlashingHitSplat_Step(struct Sprite *sprite) { sprite->invisible ^= 1; if (sprite->data[0]++ > 12) diff --git a/src/battle_anim_poison.c b/src/battle_anim_poison.c index bc56242492..f50ad1298d 100644 --- a/src/battle_anim_poison.c +++ b/src/battle_anim_poison.c @@ -6,12 +6,15 @@ static void AnimSludgeProjectile(struct Sprite *); static void AnimSludgeProjectile_Step(struct Sprite *); static void AnimAcidPoisonBubble(struct Sprite *); -static void AnimAcidPoisonBubble_Step(struct Sprite *); -static void AnimSludgeBombHitParticle(struct Sprite *); static void AnimSludgeBombHitParticle_Step(struct Sprite *); static void AnimAcidPoisonDroplet(struct Sprite *); static void AnimBubbleEffect(struct Sprite *); static void AnimBubbleEffect_Step(struct Sprite *); +static void AnimSuckerPunchStep(struct Sprite *sprite); +static void AnimSuckerPunch(struct Sprite *sprite); +static void AnimGunkShotParticlesStep(struct Sprite *sprite); +static void AnimGunkShotParticles(struct Sprite *sprite); +static void AnimGunkShotImpact(struct Sprite *sprite); static const union AnimCmd sAnim_ToxicBubble[] = { @@ -56,12 +59,12 @@ static const union AnimCmd sAnim_SludgeBombHit[] = ANIMCMD_END, }; -static const union AnimCmd *const sAnims_PoisonProjectile[] = +const union AnimCmd *const gAnims_PoisonProjectile[] = { sAnim_PoisonProjectile, }; -static const union AnimCmd *const sAnims_AcidPoisonDroplet[] = +const union AnimCmd *const gAnims_AcidPoisonDroplet[] = { sAnim_AcidPoisonDroplet, }; @@ -85,7 +88,7 @@ static const union AffineAnimCmd sAffineAnim_SludgeBombHit[] = AFFINEANIMCMD_END, }; -static const union AffineAnimCmd *const sAffineAnims_PoisonProjectile[] = +const union AffineAnimCmd *const gAffineAnims_PoisonProjectile[] = { sAffineAnim_PoisonProjectile, }; @@ -100,9 +103,9 @@ const struct SpriteTemplate gSludgeProjectileSpriteTemplate = .tileTag = ANIM_TAG_POISON_BUBBLE, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineDouble_ObjNormal_16x16, - .anims = sAnims_PoisonProjectile, + .anims = gAnims_PoisonProjectile, .images = NULL, - .affineAnims = sAffineAnims_PoisonProjectile, + .affineAnims = gAffineAnims_PoisonProjectile, .callback = AnimSludgeProjectile, }; @@ -111,9 +114,9 @@ const struct SpriteTemplate gAcidPoisonBubbleSpriteTemplate = .tileTag = ANIM_TAG_POISON_BUBBLE, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineDouble_ObjNormal_16x16, - .anims = sAnims_PoisonProjectile, + .anims = gAnims_PoisonProjectile, .images = NULL, - .affineAnims = sAffineAnims_PoisonProjectile, + .affineAnims = gAffineAnims_PoisonProjectile, .callback = AnimAcidPoisonBubble, }; @@ -145,7 +148,7 @@ const struct SpriteTemplate gAcidPoisonDropletSpriteTemplate = .tileTag = ANIM_TAG_POISON_BUBBLE, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineDouble_ObjNormal_16x16, - .anims = sAnims_AcidPoisonDroplet, + .anims = gAnims_AcidPoisonDroplet, .images = NULL, .affineAnims = gAffineAnims_Droplet, .callback = AnimAcidPoisonDroplet, @@ -168,7 +171,7 @@ const struct SpriteTemplate gPoisonBubbleSpriteTemplate = .tileTag = ANIM_TAG_POISON_BUBBLE, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineNormal_ObjNormal_16x16, - .anims = sAnims_PoisonProjectile, + .anims = gAnims_PoisonProjectile, .images = NULL, .affineAnims = sAffineAnims_Bubble, .callback = AnimBubbleEffect, @@ -185,6 +188,217 @@ const struct SpriteTemplate gWaterBubbleSpriteTemplate = .callback = AnimBubbleEffect, }; +const struct SpriteTemplate gGreenPoisonDrip = +{ + .tileTag = ANIM_TAG_GREEN_POISON_BUBBLE, + .paletteTag = ANIM_TAG_GREEN_POISON_BUBBLE, + .oam = &gOamData_AffineDouble_ObjNormal_16x16, + .anims = gAnims_AcidPoisonDroplet, + .images = NULL, + .affineAnims = gAffineAnims_Droplet, + .callback = AnimAcidPoisonDroplet, +}; + +const struct SpriteTemplate gGreenPoisonBubble = +{ + .tileTag = ANIM_TAG_GREEN_POISON_BUBBLE, + .paletteTag = ANIM_TAG_GREEN_POISON_BUBBLE, + .oam = &gOamData_AffineDouble_ObjNormal_16x16, + .anims = gAnims_PoisonProjectile, + .images = NULL, + .affineAnims = gAffineAnims_PoisonProjectile, + .callback = AnimAcidPoisonBubble, +}; + +const union AnimCmd gSuckerPunchAnimCmd[] = +{ + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(0, 3, .hFlip = TRUE), + ANIMCMD_FRAME(0, 3, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(0, 3, .vFlip = TRUE), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd *const gSuckerPunchAnim[] = +{ + gSuckerPunchAnimCmd, +}; + +const union AnimCmd gGunkShotParticlesAnimCmd[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(4, 1), + ANIMCMD_FRAME(8, 1), + ANIMCMD_FRAME(12, 1), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd *const gGunkShotParticlesAnims[] = +{ + gGunkShotParticlesAnimCmd, +}; + +const union AffineAnimCmd gSuckerPunchImpactAffineAnimCmd_1[] = +{ + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gSuckerPunchImpactAffineAnimCmd_2[] = +{ + AFFINEANIMCMD_FRAME(0xD8, 0xD8, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gSuckerPunchImpactAffineAnimCmd_3[] = +{ + AFFINEANIMCMD_FRAME(0xB0, 0xB0, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gSuckerPunchImpactAffineAnimCmd_4[] = +{ + AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd *const gSuckerPunchImpactAffineAnim[] = +{ + gSuckerPunchImpactAffineAnimCmd_1, + gSuckerPunchImpactAffineAnimCmd_2, + gSuckerPunchImpactAffineAnimCmd_3, + gSuckerPunchImpactAffineAnimCmd_4, +}; + +const struct SpriteTemplate gSuckerPunchSpriteTemplate = +{ + .tileTag = ANIM_TAG_POISON_JAB, + .paletteTag = ANIM_TAG_POISON_JAB, + .oam = &gOamData_AffineNormal_ObjNormal_16x16, + .anims = gSuckerPunchAnim, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSuckerPunch, +}; + +const struct SpriteTemplate gGunkShoParticlesSpriteTemplate = +{ + .tileTag = ANIM_TAG_WATER_ORB, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_AffineOff_ObjBlend_16x16, + .anims = gGunkShotParticlesAnims, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimGunkShotParticles, +}; + +const struct SpriteTemplate gGunkShotImpactSpriteTemplate = +{ + .tileTag = ANIM_TAG_WATER_IMPACT, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gSuckerPunchImpactAffineAnim, + .callback = AnimGunkShotImpact, +}; + +static void AnimGunkShotImpact(struct Sprite *sprite) +{ + StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]); + if (gBattleAnimArgs[2] == 0) + InitSpritePosToAnimAttacker(sprite, 1); + else + InitSpritePosToAnimTarget(sprite, TRUE); + + sprite->callback = RunStoredCallbackWhenAffineAnimEnds; + StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); +} + +static void AnimGunkShotParticles(struct Sprite *sprite) +{ + u16 retArg; + + InitSpritePosToAnimAttacker(sprite, TRUE); + sprite->data[0] = 30; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2); + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3); + InitAnimLinearTranslation(sprite); + sprite->data[5] = 0xD200 / sprite->data[0]; + sprite->data[7] = gBattleAnimArgs[3]; + retArg = gBattleAnimArgs[ARG_RET_ID]; + if (gBattleAnimArgs[ARG_RET_ID] > 127) + { + sprite->data[6] = (retArg - 127) * 256; + sprite->data[7] = -sprite->data[7]; + } + else + { + sprite->data[6] = retArg * 256; + } + sprite->callback = AnimGunkShotParticlesStep; + sprite->callback(sprite); +} + +static void AnimGunkShotParticlesStep(struct Sprite *sprite) +{ + if (AnimTranslateLinear(sprite)) + DestroyAnimSprite(sprite); + sprite->pos2.y += Sin(sprite->data[6] >> 8, sprite->data[7]); + if ((sprite->data[6] + sprite->data[5]) >> 8 > 127) + { + sprite->data[6] = 0; + sprite->data[7] = -sprite->data[7]; + } + else + { + sprite->data[6] += sprite->data[5]; + } +} + +static void AnimSuckerPunch(struct Sprite *sprite) +{ + if (BATTLE_PARTNER(gBattleAnimAttacker) == gBattleAnimTarget && GetBattlerPosition(gBattleAnimTarget) < B_POSITION_PLAYER_RIGHT) + gBattleAnimArgs[0] *= -1; + + InitSpritePosToAnimTarget(sprite, TRUE); + + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + + sprite->data[0] = gBattleAnimArgs[3]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2]; + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = sprite->pos1.y; + + InitAnimLinearTranslation(sprite); + + sprite->data[5] = gBattleAnimArgs[5]; + sprite->data[6] = gBattleAnimArgs[4]; + sprite->data[7] = 0; + + sprite->callback = AnimSuckerPunchStep; +} + +static void AnimSuckerPunchStep(struct Sprite *sprite) +{ + if (!AnimTranslateLinear(sprite)) + { + sprite->pos2.y += Sin(sprite->data[7] >> 8, sprite->data[5]); + sprite->data[7] += sprite->data[6]; + } + else + { + DestroyAnimSprite(sprite); + } +} + static void AnimSludgeProjectile(struct Sprite *sprite) { if (!gBattleAnimArgs[3]) @@ -210,12 +424,15 @@ static void AnimSludgeProjectile_Step(struct Sprite *sprite) static void AnimAcidPoisonBubble(struct Sprite *sprite) { - s16 l1, l2; + s16 l1 = 0, l2 = 0; if (!gBattleAnimArgs[3]) StartSpriteAnim(sprite, 2); InitSpritePosToAnimAttacker(sprite, 1); - SetAverageBattlerPositions(gBattleAnimTarget, 1, &l1, &l2); + if (gBattleAnimArgs[6]) + SetAverageBattlerPositions(gBattleAnimTarget, 1, &l1, &l2); + else + l1 = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2), l2 = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); if (GetBattlerSide(gBattleAnimAttacker)) gBattleAnimArgs[4] = -gBattleAnimArgs[4]; @@ -230,13 +447,13 @@ static void AnimAcidPoisonBubble(struct Sprite *sprite) sprite->callback = AnimAcidPoisonBubble_Step; } -static void AnimAcidPoisonBubble_Step(struct Sprite *sprite) +void AnimAcidPoisonBubble_Step(struct Sprite *sprite) { if (TranslateAnimHorizontalArc(sprite)) DestroyAnimSprite(sprite); } -static void AnimSludgeBombHitParticle(struct Sprite *sprite) +void AnimSludgeBombHitParticle(struct Sprite *sprite) { sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = sprite->pos1.x; @@ -265,7 +482,8 @@ static void AnimSludgeBombHitParticle_Step(struct Sprite *sprite) static void AnimAcidPoisonDroplet(struct Sprite *sprite) { - SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &sprite->pos1.x, &sprite->pos1.y); + if (gBattleAnimArgs[5]) + SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &sprite->pos1.x, &sprite->pos1.y); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[0] = -gBattleAnimArgs[0]; diff --git a/src/battle_anim_psychic.c b/src/battle_anim_psychic.c index 3f451998c4..e4e91bd426 100644 --- a/src/battle_anim_psychic.c +++ b/src/battle_anim_psychic.c @@ -21,13 +21,14 @@ static void AnimQuestionMark_Step1(struct Sprite *); static void AnimQuestionMark_Step2(struct Sprite *); static void AnimRedX(struct Sprite *); static void AnimSkillSwapOrb(struct Sprite *); -static void AnimPsychoBoost(struct Sprite *); static void AnimTask_MeditateStretchAttacker_Step(u8); static void AnimTask_Teleport_Step(u8); static void AnimTask_ImprisonOrbs_Step(u8); static void AnimTask_SkillSwap_Step(u8); static void AnimTask_ExtrasensoryDistortion_Step(u8); static void AnimTask_TransparentCloneGrowAndShrink_Step(u8); +static void AnimateZenHeadbutt(struct Sprite *sprite); +static void AnimPsychoCut(struct Sprite *sprite); static const union AffineAnimCmd sAffineAnim_PsychUpSpiral[] = { @@ -365,7 +366,7 @@ static const union AffineAnimCmd sAffineAnim_LusterPurgeCircle[] = AFFINEANIMCMD_END_ALT(1), }; -static const union AffineAnimCmd *const sAffineAnims_LusterPurgeCircle[] = +const union AffineAnimCmd *const gAffineAnims_LusterPurgeCircle[] = { sAffineAnim_LusterPurgeCircle, }; @@ -377,7 +378,7 @@ const struct SpriteTemplate gLusterPurgeCircleSpriteTemplate = .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_LusterPurgeCircle, + .affineAnims = gAffineAnims_LusterPurgeCircle, .callback = AnimSpriteOnMonPos, }; @@ -402,7 +403,7 @@ static const union AffineAnimCmd sAffineAnim_PsychoBoostOrb_1[] = AFFINEANIMCMD_END, }; -static const union AffineAnimCmd *const sAffineAnims_PsychoBoostOrb[] = +const union AffineAnimCmd *const gAffineAnims_PsychoBoostOrb[] = { sAffineAnim_PsychoBoostOrb_0, sAffineAnim_PsychoBoostOrb_1, @@ -415,10 +416,126 @@ const struct SpriteTemplate gPsychoBoostOrbSpriteTemplate = .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_PsychoBoostOrb, + .affineAnims = gAffineAnims_PsychoBoostOrb, .callback = AnimPsychoBoost, }; +const union AffineAnimCmd gZenHeadbuttAffineAnimCmd[] = +{ + AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0), + AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 18), + AFFINEANIMCMD_LOOP(0), + AFFINEANIMCMD_FRAME(0xFFFB, 0xFFFB, 0, 8), + AFFINEANIMCMD_FRAME(0x5, 0x5, 0, 8), + AFFINEANIMCMD_LOOP(5), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd *const gZenHeadbuttAffineAnims[] = +{ + gZenHeadbuttAffineAnimCmd, +}; + +const struct SpriteTemplate gZenHeadbuttSpriteTemplate = +{ + .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .paletteTag = ANIM_TAG_WATER_IMPACT, + .oam = &gOamData_AffineNormal_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gZenHeadbuttAffineAnims, + .callback = AnimateZenHeadbutt, +}; + +const struct SpriteTemplate gPsychoCutSpiralSpriteTemplate = +{ + .tileTag = ANIM_TAG_SPIRAL, + .paletteTag = ANIM_TAG_PSYCHO_CUT, + .oam = &gOamData_AffineNormal_ObjBlend_64x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = sAffineAnims_PsychUpSpiral, + .callback = AnimSpriteOnMonPos, +}; + +const struct SpriteTemplate gPsychoCutSpriteTemplate = +{ + .tileTag = ANIM_TAG_PSYCHO_CUT, + .paletteTag = ANIM_TAG_PSYCHO_CUT, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimPsychoCut, +}; + +static void AnimPsychoCut(struct Sprite *sprite) +{ + s16 lVarX, lVarY; + u16 rot; + + if (IsContest()) + { + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + } + else + { + if (GetBattlerSide(gBattleAnimAttacker)) + { + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + gBattleAnimArgs[1] = -gBattleAnimArgs[1]; + gBattleAnimArgs[3] = -gBattleAnimArgs[3]; + } + } + + if (!IsContest() && GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) + { + if (GetBattlerPosition(gBattleAnimTarget) == B_POSITION_PLAYER_LEFT + || GetBattlerPosition(gBattleAnimTarget) == B_POSITION_OPPONENT_LEFT) + { + s16 temp1, temp2; + + temp1 = gBattleAnimArgs[2]; + gBattleAnimArgs[2] = -temp1; + + temp2 = gBattleAnimArgs[0]; + gBattleAnimArgs[0] = -temp2; + } + } + + InitSpritePosToAnimAttacker(sprite, 1); + + lVarX = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + gBattleAnimArgs[2]; + lVarY = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[3]; + rot = ArcTan2Neg(lVarX - sprite->pos1.x, lVarY - sprite->pos1.y); + rot += 0xC000; + TrySetSpriteRotScale(sprite, FALSE, 0x100, 0x100, rot); + + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[2] = lVarX; + sprite->data[4] = lVarY; + + sprite->callback = StartAnimLinearTranslation; + StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); +} + +static void AnimateZenHeadbutt(struct Sprite *sprite) +{ + if (gBattleAnimArgs[0] == 0) + { + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); + sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + 18; + } + else + { + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 2); + sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + 18; + } + + StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); + sprite->callback = RunStoredCallbackWhenAffineAnimEnds; +} + // For the rectangular wall sprite used by Reflect, Mirror Coat, etc static void AnimDefensiveWall(struct Sprite *sprite) { @@ -493,7 +610,7 @@ static void AnimDefensiveWall_Step1(struct Sprite *sprite) if (IsBattlerSpriteVisible(battler)) gSprites[gBattlerSpriteIds[battler]].invisible = TRUE; - + battler = BATTLE_PARTNER(battler); if (IsBattlerSpriteVisible(battler)) gSprites[gBattlerSpriteIds[battler]].invisible = TRUE; @@ -957,7 +1074,7 @@ void AnimTask_ExtrasensoryDistortion(u8 taskId) u8 yOffset; struct ScanlineEffectParams scanlineParams; struct Task *task = &gTasks[taskId]; - + yOffset = GetBattlerYCoordWithElevation(gBattleAnimTarget); task->data[14] = yOffset - 32; @@ -1056,7 +1173,7 @@ void AnimTask_TransparentCloneGrowAndShrink(u8 taskId) s16 spriteId; s16 matrixNum; struct Task *task = &gTasks[taskId]; - + matrixNum = AllocOamMatrix(); if (matrixNum == 0xFF) { @@ -1118,7 +1235,7 @@ static void AnimTask_TransparentCloneGrowAndShrink_Step(u8 taskId) } } -static void AnimPsychoBoost(struct Sprite *sprite) +void AnimPsychoBoost(struct Sprite *sprite) { switch (sprite->data[0]) { diff --git a/src/battle_anim_rock.c b/src/battle_anim_rock.c index 29ba493463..b5c0f4b1cf 100644 --- a/src/battle_anim_rock.c +++ b/src/battle_anim_rock.c @@ -9,11 +9,7 @@ #include "constants/rgb.h" #include "constants/songs.h" -static void AnimFallingRock(struct Sprite *); -static void AnimFallingRock_Step(struct Sprite *); static void AnimRockFragment(struct Sprite *); -static void AnimFlyingSandCrescent(struct Sprite *); -static void AnimRaiseSprite(struct Sprite *); static void AnimTask_Rollout_Step(u8 taskId); static void AnimRolloutParticle(struct Sprite *); static void AnimRockTomb(struct Sprite *); @@ -21,10 +17,12 @@ static void AnimRockTomb_Step(struct Sprite *sprite); static void AnimRockBlastRock(struct Sprite *); static void AnimRockScatter(struct Sprite *); static void AnimRockScatter_Step(struct Sprite *sprite); -static void AnimParticleInVortex(struct Sprite *); static void AnimParticleInVortex_Step(struct Sprite *sprite); static void AnimTask_LoadSandstormBackground_Step(u8 taskId); static void sub_8111214(struct Task *task); +static void AnimStealthRockStep2(struct Sprite *sprite); +static void AnimStealthRockStep(struct Sprite *sprite); +static void AnimStealthRock(struct Sprite *sprite); static u8 GetRolloutCounter(void); static const union AnimCmd sAnim_FlyingRock_0[] = @@ -93,7 +91,7 @@ static const union AffineAnimCmd sAffineAnim_Whirlpool[] = AFFINEANIMCMD_JUMP(1), }; -static const union AffineAnimCmd *const sAffineAnims_Whirlpool[] = +const union AffineAnimCmd *const gAffineAnims_Whirlpool[] = { sAffineAnim_Whirlpool, }; @@ -105,7 +103,7 @@ const struct SpriteTemplate gWhirlpoolSpriteTemplate = .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gAnims_WaterMudOrb, .images = NULL, - .affineAnims = sAffineAnims_Whirlpool, + .affineAnims = gAffineAnims_Whirlpool, .callback = AnimParticleInVortex, }; @@ -248,7 +246,7 @@ static const union AffineAnimCmd sAffineAnim_BasicRock_1[] = AFFINEANIMCMD_JUMP(0), }; -static const union AffineAnimCmd *const sAffineAnims_BasicRock[] = +const union AffineAnimCmd *const gAffineAnims_BasicRock[] = { sAffineAnim_BasicRock_0, sAffineAnim_BasicRock_1, @@ -261,7 +259,7 @@ const struct SpriteTemplate gRockBlastRockSpriteTemplate = .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = sAnims_BasicRock, .images = NULL, - .affineAnims = sAffineAnims_BasicRock, + .affineAnims = gAffineAnims_BasicRock, .callback = AnimRockBlastRock, }; @@ -272,7 +270,7 @@ const struct SpriteTemplate gRockScatterSpriteTemplate = .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = sAnims_BasicRock, .images = NULL, - .affineAnims = sAffineAnims_BasicRock, + .affineAnims = gAffineAnims_BasicRock, .callback = AnimRockScatter, }; @@ -283,7 +281,7 @@ const struct SpriteTemplate gTwisterRockSpriteTemplate = .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_TwisterRock, .images = NULL, - .affineAnims = sAffineAnims_BasicRock, + .affineAnims = gAffineAnims_BasicRock, .callback = AnimMoveTwisterParticle, }; @@ -294,11 +292,110 @@ const struct SpriteTemplate gWeatherBallRockDownSpriteTemplate = .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = &sAnims_BasicRock[2], .images = NULL, - .affineAnims = sAffineAnims_BasicRock, + .affineAnims = gAffineAnims_BasicRock, .callback = AnimWeatherBallDown, }; -static void AnimFallingRock(struct Sprite *sprite) +const struct SpriteTemplate gStoneEdgeSpriteTemplate = +{ + .tileTag = ANIM_TAG_STONE_EDGE, + .paletteTag = ANIM_TAG_STONE_EDGE, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_BasicFire, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimParticleInVortex, +}; + +const struct SpriteTemplate gStealthRockSpriteTemplate = +{ + .tileTag = ANIM_TAG_STEALTH_ROCK, + .paletteTag = ANIM_TAG_STEALTH_ROCK, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimStealthRock, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_CrushGripHandEnemyAttack[] = +{ + AFFINEANIMCMD_FRAME(0, 0, 96, 1), //180 degree turn + AFFINEANIMCMD_END +}; +static const union AffineAnimCmd sSpriteAffineAnim_DoNothing[] = +{ + AFFINEANIMCMD_FRAME(0, 0, 0, 1), //Do nothing + AFFINEANIMCMD_END +}; +static const union AffineAnimCmd* const sSpriteAffineAnimTable_CrushGripHand[] = +{ + sSpriteAffineAnim_DoNothing, + sSpriteAffineAnim_CrushGripHandEnemyAttack, +}; +const struct SpriteTemplate gCrushGripHandTemplate = +{ + .tileTag = ANIM_TAG_PURPLE_HAND_OUTLINE, + .paletteTag = ANIM_TAG_ACCUPRESSURE, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = sAnims_BasicRock, + .images = NULL, + .affineAnims = sSpriteAffineAnimTable_CrushGripHand, + .callback = AnimRockBlastRock +}; + +const struct SpriteTemplate gSeedFlareGreenWavesTemplate = +{ + .tileTag = ANIM_TAG_FLYING_DIRT, + .paletteTag = ANIM_TAG_LEAF, + .oam = &gOamData_AffineOff_ObjNormal_32x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFlyingSandCrescent +}; + +static void AnimStealthRock(struct Sprite *sprite) +{ + u16 x; + u16 y; + + InitSpritePosToAnimAttacker(sprite, TRUE); + SetAverageBattlerPositions(gBattleAnimTarget, FALSE, &x, &y); + + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[2] = x + gBattleAnimArgs[2]; + sprite->data[4] = y + gBattleAnimArgs[3]; + sprite->data[5] = -50; + + InitAnimArcTranslation(sprite); + sprite->callback = AnimStealthRockStep; +} + +static void AnimStealthRockStep(struct Sprite *sprite) +{ + if (TranslateAnimHorizontalArc(sprite)) + { + sprite->data[0] = 30; + sprite->data[1] = 0; + sprite->callback = WaitAnimForDuration; + StoreSpriteCallbackInData6(sprite, AnimStealthRockStep2); + } +} + +static void AnimStealthRockStep2(struct Sprite *sprite) +{ + if (sprite->data[1] & 1) + sprite->invisible ^= 1; + + if (++sprite->data[1] == 16) + DestroyAnimSprite(sprite); +} + +void AnimFallingRock(struct Sprite *sprite) { if (gBattleAnimArgs[3] != 0) SetAverageBattlerPositions(gBattleAnimTarget, 0, &sprite->pos1.x, &sprite->pos1.y); @@ -321,7 +418,7 @@ static void AnimFallingRock(struct Sprite *sprite) sprite->callback(sprite); } -static void AnimFallingRock_Step(struct Sprite *sprite) +void AnimFallingRock_Step(struct Sprite *sprite) { sprite->pos1.x += sprite->data[5]; @@ -364,7 +461,7 @@ static void AnimRockFragment(struct Sprite *sprite) } // Swirls particle in vortex. Used for moves like Fire Spin or Sand Tomb -static void AnimParticleInVortex(struct Sprite *sprite) +void AnimParticleInVortex(struct Sprite *sprite) { if (gBattleAnimArgs[6] == ANIM_ATTACKER) InitSpritePosToAnimAttacker(sprite, 0); @@ -494,7 +591,7 @@ static void AnimTask_LoadSandstormBackground_Step(u8 taskId) // arg 1: projectile speed // arg 2: y pixel drop // arg 3: ??? unknown (possibly a color bit) -static void AnimFlyingSandCrescent(struct Sprite *sprite) +void AnimFlyingSandCrescent(struct Sprite *sprite) { if (sprite->data[0] == 0) { @@ -545,7 +642,7 @@ static void AnimFlyingSandCrescent(struct Sprite *sprite) // arg 2: terminal y offset // arg 3: duration // arg 4: sprite size [1,5] -static void AnimRaiseSprite(struct Sprite *sprite) +void AnimRaiseSprite(struct Sprite *sprite) { StartSpriteAnim(sprite, gBattleAnimArgs[4]); InitSpritePosToAnimAttacker(sprite, 0); diff --git a/src/battle_anim_sound_tasks.c b/src/battle_anim_sound_tasks.c index eed1638166..c1aea13f19 100644 --- a/src/battle_anim_sound_tasks.c +++ b/src/battle_anim_sound_tasks.c @@ -2,10 +2,13 @@ #include "battle.h" #include "battle_anim.h" #include "contest.h" +#include "m4a.h" #include "sound.h" #include "task.h" #include "constants/battle_anim.h" +extern struct MusicPlayerInfo gMPlayInfo_SE1; + // this file's functions static void sub_8158B98(u8 taskId); static void sub_8158C04(u8 taskId); @@ -13,6 +16,7 @@ static void SoundTask_LoopSEAdjustPanning_Step(u8 taskId); static void SoundTask_PlayDoubleCry_Step(u8 taskId); static void SoundTask_PlayCryWithEcho_Step(u8 taskId); static void SoundTask_AdjustPanningVar_Step(u8 taskId); +static void SoundTask_SeVolumeChange(u8 taskId); // task start void sub_8158B30(u8 taskId) @@ -349,7 +353,7 @@ void SoundTask_PlaySE2WithPanning(u8 taskId) DestroyAnimVisualTask(taskId); } -// Adjusts panning and assigns it to gAnimCustomPanning. Doesnt play sound. +// Adjusts panning and assigns it to gAnimCustomPanning. Doesnt play sound. // Used by Confuse Ray and Will-O-Wisp (see uses of gAnimCustomPanning) void SoundTask_AdjustPanningVar(u8 taskId) { @@ -381,7 +385,7 @@ static void SoundTask_AdjustPanningVar_Step(u8 taskId) u16 oldPan; gTasks[taskId].data[10] = 0; oldPan = gTasks[taskId].data[11]; - gTasks[taskId].data[11] = panIncrement + oldPan; + gTasks[taskId].data[11] = panIncrement + oldPan; gTasks[taskId].data[11] = KeepPanInRange(gTasks[taskId].data[11], oldPan); } @@ -390,3 +394,61 @@ static void SoundTask_AdjustPanningVar_Step(u8 taskId) DestroyAnimVisualTask(taskId); } +#define tSongNum data[0] +#define tPan data[1] +#define tCurrentVolume data[2] +#define tIncrementVal data[3] +#define tTargetVolume data[4] +#define tDelay data[5] +#define tFrameCounter data[6] +#define tInitialVolume data[7] + +void SoundTask_PlaySeChangingVolume(u8 taskId) +{ + gTasks[taskId].tSongNum = gBattleAnimArgs[0]; + gTasks[taskId].tPan = BattleAnimAdjustPanning(gBattleAnimArgs[1]); + gTasks[taskId].tCurrentVolume = gTasks[taskId].tInitialVolume = gBattleAnimArgs[2]; + gTasks[taskId].tIncrementVal = gBattleAnimArgs[3]; + gTasks[taskId].tTargetVolume = gBattleAnimArgs[4]; + gTasks[taskId].tDelay = gBattleAnimArgs[5]; + + PlaySE1WithPanning(gTasks[taskId].tSongNum, gTasks[taskId].tPan); + m4aMPlayVolumeControl(&gMPlayInfo_SE1, 0xFFFF, gTasks[taskId].tCurrentVolume); + if (gTasks[taskId].tIncrementVal == 0) // Either increase or decrease volume. + DestroyAnimSoundTask(taskId); + else + gTasks[taskId].func = SoundTask_SeVolumeChange; +} + +static void SoundTask_SeVolumeChange(u8 taskId) +{ + bool32 destroyTask = FALSE; + + if (gTasks[taskId].tFrameCounter++ >= gTasks[taskId].tDelay) + { + gTasks[taskId].tFrameCounter = 0; + gTasks[taskId].tCurrentVolume += gTasks[taskId].tIncrementVal; + + if (gTasks[taskId].tCurrentVolume < 0) + gTasks[taskId].tCurrentVolume = 0; + if (gTasks[taskId].tCurrentVolume > 256) + gTasks[taskId].tCurrentVolume = 256; + + if (gTasks[taskId].tInitialVolume < gTasks[taskId].tTargetVolume) // Volume increasing. + { + if (gTasks[taskId].tCurrentVolume >= gTasks[taskId].tTargetVolume) // Target reached. + destroyTask = TRUE; + } + else // Volume decreasing. + { + if (gTasks[taskId].tCurrentVolume <= gTasks[taskId].tTargetVolume) // Target reached. + destroyTask = TRUE; + } + + if (destroyTask) + DestroyAnimSoundTask(taskId); + + m4aMPlayVolumeControl(&gMPlayInfo_SE1, 0xFFFF, gTasks[taskId].tCurrentVolume); + } +} + diff --git a/src/battle_anim_throw.c b/src/battle_anim_throw.c index fef3013265..ad32702353 100755 --- a/src/battle_anim_throw.c +++ b/src/battle_anim_throw.c @@ -98,6 +98,7 @@ static void DiveBallOpenParticleAnimation(u8); static void RepeatBallOpenParticleAnimation(u8); static void TimerBallOpenParticleAnimation(u8); static void PremierBallOpenParticleAnimation(u8); +static void CB_CriticalCaptureThrownBallMovement(struct Sprite *sprite); static void SpriteCB_PokeBlock_Throw(struct Sprite *); struct CaptureStar @@ -985,17 +986,17 @@ static void SpriteCB_Ball_MonShrink_Step(struct Sprite *sprite) static void SpriteCB_Ball_Bounce(struct Sprite *sprite) { - s16 phase; - if (sprite->animEnded) { sprite->sState = 0; sprite->sAmplitude = 40; sprite->sPhase = 0; - phase = 0; - sprite->pos1.y += Cos(phase, 40); - sprite->pos2.y = -Cos(phase, sprite->sAmplitude); - sprite->callback = SpriteCB_Ball_Bounce_Step; + sprite->pos1.y += Cos(0, 40); + sprite->pos2.y = -Cos(0, sprite->sAmplitude); + if (IsCriticalCapture()) + sprite->callback = CB_CriticalCaptureThrownBallMovement; + else + sprite->callback = SpriteCB_Ball_Bounce_Step; } } @@ -1135,8 +1136,8 @@ static void SpriteCB_Ball_Wobble_Step(struct Sprite *sprite) switch (STATE(sprite->sState)) { - case BALL_ROLL_1: - // Rolling effect: every frame in the rotation, the sprite shifts 176/256 of a pixel. + case BALL_ROLL_1: + // Rolling effect: every frame in the rotation, the sprite shifts 176/256 of a pixel. if (gBattleSpritesDataPtr->animationData->ballSubpx > 255) { sprite->pos2.x += sprite->sDirection; @@ -1228,22 +1229,38 @@ static void SpriteCB_Ball_Wobble_Step(struct Sprite *sprite) case BALL_NEXT_MOVE: SHAKE_INC(sprite->sState); shakes = SHAKES(sprite->sState); - if (shakes == gBattleSpritesDataPtr->animationData->ballThrowCaseId) + if (IsCriticalCapture()) { - sprite->affineAnimPaused = TRUE; - sprite->callback = SpriteCB_Ball_Release; - } - else - { - if (gBattleSpritesDataPtr->animationData->ballThrowCaseId == BALL_3_SHAKES_SUCCESS && shakes == 3) + if (gBattleSpritesDataPtr->animationData->criticalCaptureSuccess) { sprite->callback = SpriteCB_Ball_Capture; sprite->affineAnimPaused = TRUE; } else { - sprite->sState++; // BALL_WAIT_NEXT_SHAKE sprite->affineAnimPaused = TRUE; + sprite->callback = SpriteCB_Ball_Release; + } + } + else + { + if (shakes == gBattleSpritesDataPtr->animationData->ballThrowCaseId) + { + sprite->affineAnimPaused = TRUE; + sprite->callback = SpriteCB_Ball_Release; + } + else + { + if (gBattleSpritesDataPtr->animationData->ballThrowCaseId == BALL_3_SHAKES_SUCCESS && shakes == 3) + { + sprite->callback = SpriteCB_Ball_Capture; + sprite->affineAnimPaused = TRUE; + } + else + { + sprite->sState++; // BALL_WAIT_NEXT_SHAKE + sprite->affineAnimPaused = TRUE; + } } } break; @@ -2266,7 +2283,7 @@ static void Task_ShinyStars(u8 taskId) } // Wait until the ball particles have despawned - if (gBattleSpritesDataPtr->animationData->numBallParticles) + if (gBattleSpritesDataPtr->animationData->numBallParticles) return; timer = gTasks[taskId].tStarTimer++; @@ -2438,7 +2455,7 @@ static void SpriteCB_PokeBlock_Arc(struct Sprite *sprite) } // Destroy after end of player animation -static void SpriteCB_ThrowPokeBlock_Free(struct Sprite *sprite) +static void SpriteCB_ThrowPokeBlock_Free(struct Sprite *sprite) { if (gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].animEnded) { @@ -2489,3 +2506,53 @@ void AnimTask_GetBattlersFromArg(u8 taskId) gBattleAnimTarget = gBattleSpritesDataPtr->animationData->animArg >> 8; DestroyAnimVisualTask(taskId); } + +bool32 IsCriticalCapture(void) +{ + return gBattleSpritesDataPtr->animationData->isCriticalCapture; +} + +static void CB_CriticalCaptureThrownBallMovement(struct Sprite *sprite) +{ + bool8 lastBounce = FALSE; + u8 maxBounces = 6; + int bounceCount = sprite->data[3] >> 8; + + if (bounceCount == 0) + PlaySE(SE_BALL); + + switch (sprite->data[3] & 0xFF) + { + case 0: + if (bounceCount < 3) + sprite->pos2.x++; + + if (++sprite->data[5] >= 3) + sprite->data[3] += 257; + + break; + case 1: + if (bounceCount < 3 || sprite->pos2.x != 0) + sprite->pos2.x--; + + if (--sprite->data[5] <= 0) + { + sprite->data[5] = 0; + sprite->data[3] &= -0x100; + } + + if (bounceCount >= maxBounces) + lastBounce = TRUE; + + break; + } + + if (lastBounce) + { + sprite->data[3] = 0; + sprite->data[4] = 40; //starting max height + sprite->data[5] = 0; + sprite->callback = SpriteCB_Ball_Bounce_Step; + } +} + diff --git a/src/battle_anim_utility_funcs.c b/src/battle_anim_utility_funcs.c index 9790cf9eac..411e60767e 100644 --- a/src/battle_anim_utility_funcs.c +++ b/src/battle_anim_utility_funcs.c @@ -1064,3 +1064,27 @@ static void AnimTask_WaitAndRestoreVisibility(u8 taskId) DestroyTask(taskId); } } + +void AnimTask_IsDoubleBattle(u8 taskId) +{ + gBattleAnimArgs[7] = (IsDoubleBattle() && !IsContest()); + DestroyAnimVisualTask(taskId); +} + +void AnimTask_CanBattlerSwitch(u8 taskId) +{ + if (gBattleTypeFlags & BATTLE_TYPE_ARENA) + gBattleAnimArgs[ARG_RET_ID] = FALSE; + else + gBattleAnimArgs[ARG_RET_ID] = CanBattlerSwitch(GetAnimBattlerId(gBattleAnimArgs[0])); + DestroyAnimVisualTask(taskId); +} + +void AnimTask_SetInvisible(u8 taskId) +{ + u32 battlerId = GetAnimBattlerId(gBattleAnimArgs[0]); + u32 spriteId = gBattlerSpriteIds[battlerId]; + + gSprites[spriteId].invisible = gBattleSpritesDataPtr->battlerData[battlerId].invisible = gBattleAnimArgs[1]; + DestroyAnimVisualTask(taskId); +} diff --git a/src/battle_anim_water.c b/src/battle_anim_water.c index 12f37dbba2..d7caf01f6f 100644 --- a/src/battle_anim_water.c +++ b/src/battle_anim_water.c @@ -21,13 +21,14 @@ static void AnimWaterBubbleProjectile_Step2(struct Sprite *); static void AnimWaterBubbleProjectile_Step3(struct Sprite *); static void AnimAuroraBeamRings(struct Sprite *); static void AnimAuroraBeamRings_Step(struct Sprite *); +void AnimFlyUpTarget(struct Sprite *); +static void AnimFlyUpTarget_Step(struct Sprite *); static void AnimToTargetInSinWave(struct Sprite *); static void AnimToTargetInSinWave_Step(struct Sprite *); static void AnimHydroCannonCharge(struct Sprite *); static void AnimHydroCannonCharge_Step(struct Sprite *); static void AnimHydroCannonBeam(struct Sprite *); static void AnimWaterGunDroplet(struct Sprite *); -static void AnimSmallBubblePair(struct Sprite *); static void AnimSmallBubblePair_Step(struct Sprite *); static void AnimSmallDriftingBubbles(struct Sprite *); static void AnimSmallDriftingBubbles_Step(struct Sprite *); @@ -36,7 +37,6 @@ static void AnimWaterSpoutRain(struct Sprite *); static void AnimWaterSpoutRainHit(struct Sprite *); static void AnimWaterSportDroplet(struct Sprite *); static void AnimWaterSportDroplet_Step(struct Sprite *); -static void AnimWaterPulseBubble(struct Sprite *); static void AnimWaterPulseBubble_Step(struct Sprite *); static void AnimWaterPulseRingBubble(struct Sprite *); static void AnimWaterPulseRing_Step(struct Sprite *); @@ -53,6 +53,9 @@ static void CreateWaterSpoutRainDroplet(struct Task*, u8); static void AnimTask_WaterSport_Step(u8); static void CreateWaterSportDroplet(struct Task*); static void CreateWaterPulseRingBubbles(struct Sprite*, s32, s32); +static void AnimAquaTail(struct Sprite *sprite); +static void AnimKnockOffAquaTail(struct Sprite *sprite); +static void AnimKnockOffAquaTailStep(struct Sprite *sprite); // Both unused const u8 gUnknown_8593C80[] = INCBIN_U8("graphics/unknown/unknown_593C80.4bpp"); @@ -106,7 +109,7 @@ static const union AnimCmd sAnim_WaterBubbleProjectile[] = ANIMCMD_END, }; -static const union AnimCmd *const sAnims_WaterBubbleProjectile[] = +const union AnimCmd *const gAnims_WaterBubbleProjectile[] = { sAnim_WaterBubbleProjectile, }; @@ -116,7 +119,7 @@ const struct SpriteTemplate gWaterBubbleProjectileSpriteTemplate = .tileTag = ANIM_TAG_BUBBLE, .paletteTag = ANIM_TAG_BUBBLE, .oam = &gOamData_AffineNormal_ObjBlend_16x16, - .anims = sAnims_WaterBubbleProjectile, + .anims = gAnims_WaterBubbleProjectile, .images = NULL, .affineAnims = sAffineAnims_WaterBubbleProjectile, .callback = AnimWaterBubbleProjectile, @@ -188,6 +191,17 @@ const struct SpriteTemplate gHydroPumpOrbSpriteTemplate = .callback = AnimToTargetInSinWave, }; +const struct SpriteTemplate gWaterPledgeOrbSpriteTemplate = +{ + .tileTag = ANIM_TAG_WATER_ORB, + .paletteTag = ANIM_TAG_WATER_ORB, + .oam = &gOamData_AffineOff_ObjBlend_16x16, + .anims = gAnims_WaterMudOrb, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFlyUpTarget, +}; + const struct SpriteTemplate gMudShotOrbSpriteTemplate = { .tileTag = ANIM_TAG_BROWN_ORB, @@ -229,7 +243,7 @@ static const union AnimCmd sAnim_FlamethrowerFlame[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sAnims_FlamethrowerFlame[] = +const union AnimCmd *const gAnims_FlamethrowerFlame[] = { sAnim_FlamethrowerFlame, }; @@ -239,12 +253,23 @@ const struct SpriteTemplate gFlamethrowerFlameSpriteTemplate = .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sAnims_FlamethrowerFlame, + .anims = gAnims_FlamethrowerFlame, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimToTargetInSinWave, }; +const struct SpriteTemplate gFirePledgeSpriteTemplate = +{ + .tileTag = ANIM_TAG_SMALL_EMBER, + .paletteTag = ANIM_TAG_SMALL_EMBER, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_FlamethrowerFlame, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFlyUpTarget, +}; + const struct SpriteTemplate gPsywaveRingSpriteTemplate = { .tileTag = ANIM_TAG_BLUE_RING, @@ -398,7 +423,7 @@ static const union AnimCmd sAnim_WeatherBallWaterDown[] = ANIMCMD_END, }; -static const union AnimCmd *const sAnims_WaterPulseBubble[] = +const union AnimCmd *const gAnims_WaterPulseBubble[] = { sAnim_WaterPulseBubble_0, sAnim_WaterPulseBubble_1, @@ -446,7 +471,7 @@ const struct SpriteTemplate gWaterPulseBubbleSpriteTemplate = .tileTag = ANIM_TAG_SMALL_BUBBLES, .paletteTag = ANIM_TAG_SMALL_BUBBLES, .oam = &gOamData_AffineOff_ObjNormal_8x8, - .anims = sAnims_WaterPulseBubble, + .anims = gAnims_WaterPulseBubble, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimWaterPulseBubble, @@ -457,7 +482,7 @@ const struct SpriteTemplate gWaterPulseRingBubbleSpriteTemplate = .tileTag = ANIM_TAG_SMALL_BUBBLES, .paletteTag = ANIM_TAG_SMALL_BUBBLES, .oam = &gOamData_AffineNormal_ObjNormal_8x8, - .anims = sAnims_WaterPulseBubble, + .anims = gAnims_WaterPulseBubble, .images = NULL, .affineAnims = sAffineAnims_WaterPulseRingBubble, .callback = AnimWaterPulseRingBubble, @@ -474,6 +499,140 @@ const struct SpriteTemplate gWeatherBallWaterDownSpriteTemplate = .callback = AnimWeatherBallDown, }; +const union AffineAnimCmd gAquaTailHitAffineAnimCmd_1[] = +{ + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gAquaTailHitAffineAnimCmd_2[] = +{ + AFFINEANIMCMD_FRAME(0xD8, 0xD8, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gAquaTailHitAffineAnimCmd_3[] = +{ + AFFINEANIMCMD_FRAME(0xB0, 0xB0, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gAquaTailHitAffineAnimCmd_4[] = +{ + AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd *const gAquaTailHitAffineAnims[] = +{ + gAquaTailHitAffineAnimCmd_1, + gAquaTailHitAffineAnimCmd_2, + gAquaTailHitAffineAnimCmd_3, + gAquaTailHitAffineAnimCmd_4, +}; + +const union AnimCmd gKnockOffAquaTailAnimCmd[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(64, 4), + ANIMCMD_END, +}; + +const union AnimCmd *const gKnockOffAquaTailAnim[] = +{ + gKnockOffAquaTailAnimCmd, +}; + +const union AffineAnimCmd gKnockOffAquaTailAffineanimCmd_1[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, -4, 8), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gKnockOffAquaTailAffineanimCmd_2[] = +{ + AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, 4, 8), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd *const gKnockOffAquaTailAffineAnim[] = +{ + gKnockOffAquaTailAffineanimCmd_1, + gKnockOffAquaTailAffineanimCmd_2, +}; + +const struct SpriteTemplate gAquaTailKnockOffSpriteTemplate = +{ + .tileTag = ANIM_TAG_SLAM_HIT_2, + .paletteTag = ANIM_TAG_WATER_IMPACT, + .oam = &gOamData_AffineNormal_ObjNormal_64x64, + .anims = gKnockOffAquaTailAnim, + .images = NULL, + .affineAnims = gKnockOffAquaTailAffineAnim, + .callback = AnimKnockOffAquaTail, +}; + +const struct SpriteTemplate gAquaTailHitSpriteTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_WATER_IMPACT, + .oam = &gOamData_AffineNormal_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAquaTailHitAffineAnims, + .callback = AnimAquaTail, +}; + +static void AnimAquaTail(struct Sprite *sprite) +{ + StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]); + if (gBattleAnimArgs[2] == 0) + InitSpritePosToAnimAttacker(sprite, 1); + else + InitSpritePosToAnimTarget(sprite, TRUE); + + sprite->callback = RunStoredCallbackWhenAffineAnimEnds; + StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); +} + +static void AnimKnockOffAquaTail(struct Sprite *sprite) +{ + if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) + { + sprite->pos1.x -= gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + sprite->data[0] = -11; + sprite->data[1] = 192; + StartSpriteAffineAnim(sprite, 1); + } + else + { + sprite->data[0] = 11; + sprite->data[1] = 192; + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + } + + sprite->callback = AnimKnockOffAquaTailStep; +} + +static void AnimKnockOffAquaTailStep(struct Sprite *sprite) +{ + sprite->data[1] += sprite->data[0]; + sprite->data[1] &= 0xFF; + sprite->pos2.x = Cos(sprite->data[1], 20); + sprite->pos2.y = Sin(sprite->data[1], 20); + if (sprite->animEnded) + DestroyAnimSprite(sprite); + + sprite->data[2]++; +} + void AnimTask_CreateRaindrops(u8 taskId) { u8 x, y; @@ -643,6 +802,27 @@ static void AnimTask_RotateAuroraRingColors_Step(u8 taskId) DestroyAnimVisualTask(taskId); } +void AnimFlyUpTarget(struct Sprite *sprite) +{ + InitSpritePosToAnimTarget(sprite, TRUE); + sprite->pos2.y += GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_HEIGHT) / 2; + sprite->pos2.y += gBattleAnimArgs[1]; + sprite->data[0] = gBattleAnimArgs[2]; //max y offset + sprite->data[1] = gBattleAnimArgs[3]; //speed + sprite->callback = AnimFlyUpTarget_Step; + sprite->callback(sprite); +} + +static void AnimFlyUpTarget_Step(struct Sprite *sprite) +{ + if(sprite->pos2.y <= sprite->data[0]) + { + DestroyAnimSprite(sprite); + return; + } + sprite->pos2.y -= sprite->data[1]; +} + // For animating undulating beam attacks (e.g. Flamethrower, Hydro Pump, Signal Beam) static void AnimToTargetInSinWave(struct Sprite *sprite) { @@ -778,7 +958,7 @@ static void AnimWaterGunDroplet(struct Sprite *sprite) StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } -static void AnimSmallBubblePair(struct Sprite *sprite) +void AnimSmallBubblePair(struct Sprite *sprite) { if (gBattleAnimArgs[3] != ANIM_ATTACKER) InitSpritePosToAnimTarget(sprite, TRUE); @@ -812,7 +992,7 @@ void AnimTask_CreateSurfWave(u8 taskId) SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 1); sub_80A6B30(&animBg); - + if (!IsContest()) { SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1); @@ -826,10 +1006,20 @@ void AnimTask_CreateSurfWave(u8 taskId) AnimLoadCompressedBgTilemapHandleContest(&animBg, gBattleAnimBgTilemap_SurfContest, 1); } AnimLoadCompressedBgGfx(animBg.bgId, gBattleAnimBgImage_Surf, animBg.tilesOffset); - if (gBattleAnimArgs[0] == 0) + switch (gBattleAnimArgs[0]) + { + case ANIM_SURF_PAL_SURF: + default: LoadCompressedPalette(gBattleAnimBgPalette_Surf, animBg.paletteId * 16, 32); - else + break; + case ANIM_SURF_PAL_MUDDY_WATER: LoadCompressedPalette(gBattleAnimBackgroundImageMuddyWater_Pal, animBg.paletteId * 16, 32); + break; + case ANIM_SURF_PAL_SLUDGE_WAVE: + LoadCompressedPalette(gBattleAnimBgPalette_SludgeWave, animBg.paletteId * 16, 32); + break; + } + taskId2 = CreateTask(AnimTask_SurfWaveScanlineEffect, gTasks[taskId].priority + 1); gTasks[taskId].data[15] = taskId2; gTasks[taskId2].data[0] = 0; @@ -1482,7 +1672,7 @@ static void AnimWaterSportDroplet_Step(struct Sprite *sprite) } } -static void AnimWaterPulseBubble(struct Sprite *sprite) +void AnimWaterPulseBubble(struct Sprite *sprite) { sprite->pos1.x = gBattleAnimArgs[0]; sprite->pos1.y = gBattleAnimArgs[1]; diff --git a/src/battle_bg.c b/src/battle_bg.c index 6a0e4c10cf..483be5dbd1 100644 --- a/src/battle_bg.c +++ b/src/battle_bg.c @@ -1142,7 +1142,7 @@ void DrawBattleEntryBackground(void) } else if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_EREADER_TRAINER)) { - if (!(gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) || gPartnerTrainerId == TRAINER_STEVEN_PARTNER) + if (!(gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) || gPartnerTrainerId == TRAINER_STEVEN_PARTNER || gPartnerTrainerId >= TRAINER_CUSTOM_PARTNER) { LZDecompressVram(gBattleTerrainAnimTiles_Building, (void*)(BG_CHAR_ADDR(1))); LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void*)(BG_SCREEN_ADDR(28))); diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index 1041f6fda0..a9e153cd93 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -88,6 +88,7 @@ static void LinkOpponentHandleBattleAnimation(void); static void LinkOpponentHandleLinkStandbyMsg(void); static void LinkOpponentHandleResetActionMoveSelection(void); static void LinkOpponentHandleCmd55(void); +static void LinkOpponentHandleBattleDebug(void); static void LinkOpponentCmdEnd(void); static void LinkOpponentBufferRunCommand(void); @@ -160,6 +161,7 @@ static void (*const sLinkOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void) = LinkOpponentHandleLinkStandbyMsg, LinkOpponentHandleResetActionMoveSelection, LinkOpponentHandleCmd55, + LinkOpponentHandleBattleDebug, LinkOpponentCmdEnd }; @@ -176,8 +178,8 @@ static void LinkOpponentBufferRunCommand(void) { if (gBattleControllerExecFlags & gBitTable[gActiveBattler]) { - if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sLinkOpponentBufferCommands)) - sLinkOpponentBufferCommands[gBattleBufferA[gActiveBattler][0]](); + if (gBattleResources->bufferA[gActiveBattler][0] < ARRAY_COUNT(sLinkOpponentBufferCommands)) + sLinkOpponentBufferCommands[gBattleResources->bufferA[gActiveBattler][0]](); else LinkOpponentBufferExecCompleted(); } @@ -529,7 +531,7 @@ static void LinkOpponentBufferExecCompleted(void) u8 playerId = GetMultiplayerId(); PrepareBufferDataTransferLink(2, 4, &playerId); - gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; + gBattleResources->bufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else { @@ -544,13 +546,13 @@ static void LinkOpponentHandleGetMonData(void) u8 monToCheck; s32 i; - if (gBattleBufferA[gActiveBattler][2] == 0) + if (gBattleResources->bufferA[gActiveBattler][2] == 0) { size += CopyLinkOpponentMonData(gBattlerPartyIndexes[gActiveBattler], monData); } else { - monToCheck = gBattleBufferA[gActiveBattler][2]; + monToCheck = gBattleResources->bufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; i++) { if (monToCheck & 1) @@ -572,7 +574,7 @@ static u32 CopyLinkOpponentMonData(u8 monId, u8 *dst) u32 data32; s32 size = 0; - switch (gBattleBufferA[gActiveBattler][1]) + switch (gBattleResources->bufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: battleMon.species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES); @@ -601,7 +603,6 @@ static u32 CopyLinkOpponentMonData(u8 monId, u8 *dst) battleMon.speed = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED); battleMon.spAttack = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK); battleMon.spDefense = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF); - battleMon.isEgg = GetMonData(&gEnemyParty[monId], MON_DATA_IS_EGG); battleMon.abilityNum = GetMonData(&gEnemyParty[monId], MON_DATA_ABILITY_NUM); battleMon.otId = GetMonData(&gEnemyParty[monId], MON_DATA_OT_ID); GetMonData(&gEnemyParty[monId], MON_DATA_NICKNAME, nickname); @@ -638,7 +639,7 @@ static u32 CopyLinkOpponentMonData(u8 monId, u8 *dst) case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - data16 = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE); + data16 = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE); dst[0] = data16; dst[1] = data16 >> 8; size = 2; @@ -653,7 +654,7 @@ static u32 CopyLinkOpponentMonData(u8 monId, u8 *dst) case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE); size = 1; break; case REQUEST_OTID_BATTLE: @@ -878,13 +879,13 @@ static void LinkOpponentHandleSetMonData(void) u8 monToCheck; u8 i; - if (gBattleBufferA[gActiveBattler][2] == 0) + if (gBattleResources->bufferA[gActiveBattler][2] == 0) { SetLinkOpponentMonData(gBattlerPartyIndexes[gActiveBattler]); } else { - monToCheck = gBattleBufferA[gActiveBattler][2]; + monToCheck = gBattleResources->bufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; i++) { if (monToCheck & 1) @@ -897,11 +898,11 @@ static void LinkOpponentHandleSetMonData(void) static void SetLinkOpponentMonData(u8 monId) { - struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3]; - struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3]; + struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleResources->bufferA[gActiveBattler][3]; + struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleResources->bufferA[gActiveBattler][3]; s32 i; - switch (gBattleBufferA[gActiveBattler][1]) + switch (gBattleResources->bufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: { @@ -942,10 +943,10 @@ static void SetLinkOpponentMonData(u8 monId) } break; case REQUEST_SPECIES_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_HELDITEM_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: for (i = 0; i < MAX_MON_MOVES; i++) @@ -959,165 +960,165 @@ static void SetLinkOpponentMonData(u8 monId) case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_PP_DATA_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gEnemyParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gEnemyParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gEnemyParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]); + SetMonData(&gEnemyParty[monId], MON_DATA_PP1, &gBattleResources->bufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_PP2, &gBattleResources->bufferA[gActiveBattler][4]); + SetMonData(&gEnemyParty[monId], MON_DATA_PP3, &gBattleResources->bufferA[gActiveBattler][5]); + SetMonData(&gEnemyParty[monId], MON_DATA_PP4, &gBattleResources->bufferA[gActiveBattler][6]); + SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &gBattleResources->bufferA[gActiveBattler][7]); break; case REQUEST_PPMOVE1_BATTLE: case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_OTID_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_OT_ID, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_EXP_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_EXP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_HP_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_HP_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ATK_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_ATK_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_DEF_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_DEF_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPEED_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPATK_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_FRIENDSHIP_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_POKERUS_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_POKERUS, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MET_LOCATION_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_MET_LOCATION, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MET_LEVEL_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_MET_LEVEL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MET_GAME_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_MET_GAME, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_POKEBALL_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_POKEBALL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ALL_IVS_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]); - SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]); + SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleResources->bufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleResources->bufferA[gActiveBattler][4]); + SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleResources->bufferA[gActiveBattler][5]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleResources->bufferA[gActiveBattler][6]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleResources->bufferA[gActiveBattler][7]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleResources->bufferA[gActiveBattler][8]); break; case REQUEST_HP_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ATK_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_DEF_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPEED_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPATK_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_PERSONALITY_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_LEVEL_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_HP_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_HP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MAX_HP_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ATK_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_ATK, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_DEF_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_DEF, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPEED_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPEED, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPATK_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPATK, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_COOL_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_COOL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_CUTE_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_CUTE, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SMART_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SMART, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SHEEN_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SHEEN, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_COOL_RIBBON_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_COOL_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_RIBBON_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_CUTE_RIBBON_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_CUTE_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SMART_RIBBON_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SMART_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_RIBBON_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; } } static void LinkOpponentHandleSetRawMonData(void) { - u8 *dst = (u8 *)&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1]; + u8 *dst = (u8 *)&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleResources->bufferA[gActiveBattler][1]; u8 i; - for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++) - dst[i] = gBattleBufferA[gActiveBattler][3 + i]; + for (i = 0; i < gBattleResources->bufferA[gActiveBattler][2]; i++) + dst[i] = gBattleResources->bufferA[gActiveBattler][3 + i]; LinkOpponentBufferExecCompleted(); } @@ -1146,8 +1147,8 @@ static void LinkOpponentHandleLoadMonSprite(void) static void LinkOpponentHandleSwitchInAnim(void) { - gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1]; - sub_8066494(gActiveBattler, gBattleBufferA[gActiveBattler][2]); + gBattlerPartyIndexes[gActiveBattler] = gBattleResources->bufferA[gActiveBattler][1]; + sub_8066494(gActiveBattler, gBattleResources->bufferA[gActiveBattler][2]); gBattlerControllerFuncs[gActiveBattler] = sub_8064F40; } @@ -1156,7 +1157,7 @@ static void sub_8066494(u8 battlerId, bool8 dontClearSubstituteBit) u16 species; ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit); - gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; + gBattlerPartyIndexes[battlerId] = gBattleResources->bufferA[battlerId][1]; species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714); BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId); @@ -1185,7 +1186,7 @@ static void sub_8066494(u8 battlerId, bool8 dontClearSubstituteBit) static void LinkOpponentHandleReturnMonToBall(void) { - if (gBattleBufferA[gActiveBattler][1] == 0) + if (gBattleResources->bufferA[gActiveBattler][1] == 0) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation; @@ -1388,14 +1389,14 @@ static void LinkOpponentHandleMoveAnimation(void) { if (!mplay_80342A4(gActiveBattler)) { - u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); + u16 move = gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8); - gAnimMoveTurn = gBattleBufferA[gActiveBattler][3]; - gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8); - gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24); - gAnimFriendship = gBattleBufferA[gActiveBattler][10]; - gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8); - gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16]; + gAnimMoveTurn = gBattleResources->bufferA[gActiveBattler][3]; + gAnimMovePower = gBattleResources->bufferA[gActiveBattler][4] | (gBattleResources->bufferA[gActiveBattler][5] << 8); + gAnimMoveDmg = gBattleResources->bufferA[gActiveBattler][6] | (gBattleResources->bufferA[gActiveBattler][7] << 8) | (gBattleResources->bufferA[gActiveBattler][8] << 16) | (gBattleResources->bufferA[gActiveBattler][9] << 24); + gAnimFriendship = gBattleResources->bufferA[gActiveBattler][10]; + gWeatherMoveAnim = gBattleResources->bufferA[gActiveBattler][12] | (gBattleResources->bufferA[gActiveBattler][13] << 8); + gAnimDisableStructPtr = (struct DisableStruct *)&gBattleResources->bufferA[gActiveBattler][16]; gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality; if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE { @@ -1412,8 +1413,8 @@ static void LinkOpponentHandleMoveAnimation(void) static void LinkOpponentDoMoveAnimation(void) { - u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); - u8 multihit = gBattleBufferA[gActiveBattler][11]; + u16 move = gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8); + u8 multihit = gBattleResources->bufferA[gActiveBattler][11]; switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState) { @@ -1451,7 +1452,7 @@ static void LinkOpponentDoMoveAnimation(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { CopyAllBattleSpritesInvisibilities(); - TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; LinkOpponentBufferExecCompleted(); } @@ -1465,7 +1466,7 @@ static void LinkOpponentHandlePrintString(void) gBattle_BG0_X = 0; gBattle_BG0_Y = 0; - stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]); + stringId = (u16*)(&gBattleResources->bufferA[gActiveBattler][2]); BufferStringBattle(*stringId); BattlePutTextOnWindow(gDisplayedStringBattle, 0); gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter; @@ -1512,7 +1513,7 @@ static void LinkOpponentHandleHealthBarUpdate(void) s16 hpVal; LoadBattleBarGfx(0); - hpVal = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); + hpVal = gBattleResources->bufferA[gActiveBattler][2] | (gBattleResources->bufferA[gActiveBattler][3] << 8); if (hpVal != INSTANT_HP_BAR_DROP) { @@ -1553,8 +1554,8 @@ static void LinkOpponentHandleStatusAnimation(void) { if (!mplay_80342A4(gActiveBattler)) { - InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1], - gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24)); + InitAndLaunchChosenStatusAnimation(gBattleResources->bufferA[gActiveBattler][1], + gBattleResources->bufferA[gActiveBattler][2] | (gBattleResources->bufferA[gActiveBattler][3] << 8) | (gBattleResources->bufferA[gActiveBattler][4] << 16) | (gBattleResources->bufferA[gActiveBattler][5] << 24)); gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; } } @@ -1612,7 +1613,7 @@ static void LinkOpponentHandleCmd37(void) static void LinkOpponentHandleCmd38(void) { - gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBattler][1]; + gUnknown_02022D0C.field_0 = gBattleResources->bufferA[gActiveBattler][1]; LinkOpponentBufferExecCompleted(); } @@ -1657,20 +1658,20 @@ static void LinkOpponentHandlePlaySE(void) else pan = SOUND_PAN_TARGET; - PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan); + PlaySE12WithPanning(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8), pan); LinkOpponentBufferExecCompleted(); } static void LinkOpponentHandlePlayFanfareOrBGM(void) { - if (gBattleBufferA[gActiveBattler][3]) + if (gBattleResources->bufferA[gActiveBattler][3]) { BattleStopLowHpSound(); - PlayBGM(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + PlayBGM(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); } else { - PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + PlayFanfare(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); } LinkOpponentBufferExecCompleted(); @@ -1686,7 +1687,7 @@ static void LinkOpponentHandleFaintingCry(void) static void LinkOpponentHandleIntroSlide(void) { - HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); + HandleIntroSlide(gBattleResources->bufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; LinkOpponentBufferExecCompleted(); } @@ -1722,15 +1723,15 @@ static void sub_8067618(u8 taskId) gActiveBattler = gTasks[taskId].data[0]; if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) { - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + gBattleResources->bufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; sub_8066494(gActiveBattler, FALSE); } else { - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + gBattleResources->bufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; sub_8066494(gActiveBattler, FALSE); gActiveBattler = BATTLE_PARTNER(gActiveBattler); - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + gBattleResources->bufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; sub_8066494(gActiveBattler, FALSE); gActiveBattler = BATTLE_PARTNER(gActiveBattler); } @@ -1748,7 +1749,7 @@ static void sub_80676FC(struct Sprite *sprite) static void LinkOpponentHandleDrawPartyStatusSummary(void) { - if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) + if (gBattleResources->bufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { LinkOpponentBufferExecCompleted(); } @@ -1756,7 +1757,7 @@ static void LinkOpponentHandleDrawPartyStatusSummary(void) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = 1; - if (gBattleBufferA[gActiveBattler][2] != 0) + if (gBattleResources->bufferA[gActiveBattler][2] != 0) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1E < 2) { @@ -1769,10 +1770,10 @@ static void LinkOpponentHandleDrawPartyStatusSummary(void) } } - gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]); + gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleResources->bufferA[gActiveBattler][4], gBattleResources->bufferA[gActiveBattler][1], gBattleResources->bufferA[gActiveBattler][2]); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0; - if (gBattleBufferA[gActiveBattler][2] != 0) + if (gBattleResources->bufferA[gActiveBattler][2] != 0) gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0x5D; gBattlerControllerFuncs[gActiveBattler] = sub_806782C; @@ -1804,7 +1805,7 @@ static void LinkOpponentHandleSpriteInvisibility(void) { if (IsBattlerSpritePresent(gActiveBattler)) { - gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1]; + gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleResources->bufferA[gActiveBattler][1]; CopyBattleSpriteInvisibility(gActiveBattler); } LinkOpponentBufferExecCompleted(); @@ -1814,8 +1815,8 @@ static void LinkOpponentHandleBattleAnimation(void) { if (!mplay_80342A4(gActiveBattler)) { - u8 animationId = gBattleBufferA[gActiveBattler][1]; - u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); + u8 animationId = gBattleResources->bufferA[gActiveBattler][1]; + u16 argument = gBattleResources->bufferA[gActiveBattler][2] | (gBattleResources->bufferA[gActiveBattler][3] << 8); if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument)) LinkOpponentBufferExecCompleted(); @@ -1828,7 +1829,7 @@ static void LinkOpponentHandleBattleAnimation(void) static void LinkOpponentHandleLinkStandbyMsg(void) { - sub_81851A8(&gBattleBufferA[gActiveBattler][2]); + sub_81851A8(&gBattleResources->bufferA[gActiveBattler][2]); LinkOpponentBufferExecCompleted(); } @@ -1839,20 +1840,25 @@ static void LinkOpponentHandleResetActionMoveSelection(void) static void LinkOpponentHandleCmd55(void) { - sub_81851A8(&gBattleBufferA[gActiveBattler][4]); + sub_81851A8(&gBattleResources->bufferA[gActiveBattler][4]); - if (gBattleBufferA[gActiveBattler][1] == B_OUTCOME_DREW) - gBattleOutcome = gBattleBufferA[gActiveBattler][1]; + if (gBattleResources->bufferA[gActiveBattler][1] == B_OUTCOME_DREW) + gBattleOutcome = gBattleResources->bufferA[gActiveBattler][1]; else - gBattleOutcome = gBattleBufferA[gActiveBattler][1] ^ B_OUTCOME_DREW; + gBattleOutcome = gBattleResources->bufferA[gActiveBattler][1] ^ B_OUTCOME_DREW; - gSaveBlock2Ptr->frontier.disableRecordBattle = gBattleBufferA[gActiveBattler][2]; + gSaveBlock2Ptr->frontier.disableRecordBattle = gBattleResources->bufferA[gActiveBattler][2]; FadeOutMapMusic(5); BeginFastPaletteFade(3); LinkOpponentBufferExecCompleted(); gBattlerControllerFuncs[gActiveBattler] = sub_80587B0; } +static void LinkOpponentHandleBattleDebug(void) +{ + LinkOpponentBufferExecCompleted(); +} + static void LinkOpponentCmdEnd(void) { } diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index af81b06d5b..2f0929f257 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -86,6 +86,7 @@ static void LinkPartnerHandleBattleAnimation(void); static void LinkPartnerHandleLinkStandbyMsg(void); static void LinkPartnerHandleResetActionMoveSelection(void); static void LinkPartnerHandleCmd55(void); +static void LinkPartnerHandleBattleDebug(void); static void LinkPartnerCmdEnd(void); static void LinkPartnerBufferRunCommand(void); @@ -157,6 +158,7 @@ static void (*const sLinkPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(void) = LinkPartnerHandleLinkStandbyMsg, LinkPartnerHandleResetActionMoveSelection, LinkPartnerHandleCmd55, + LinkPartnerHandleBattleDebug, LinkPartnerCmdEnd }; @@ -173,8 +175,8 @@ static void LinkPartnerBufferRunCommand(void) { if (gBattleControllerExecFlags & gBitTable[gActiveBattler]) { - if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sLinkPartnerBufferCommands)) - sLinkPartnerBufferCommands[gBattleBufferA[gActiveBattler][0]](); + if (gBattleResources->bufferA[gActiveBattler][0] < ARRAY_COUNT(sLinkPartnerBufferCommands)) + sLinkPartnerBufferCommands[gBattleResources->bufferA[gActiveBattler][0]](); else LinkPartnerBufferExecCompleted(); } @@ -402,7 +404,7 @@ static void LinkPartnerBufferExecCompleted(void) u8 playerId = GetMultiplayerId(); PrepareBufferDataTransferLink(2, 4, &playerId); - gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; + gBattleResources->bufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else { @@ -429,13 +431,13 @@ static void LinkPartnerHandleGetMonData(void) u8 monToCheck; s32 i; - if (gBattleBufferA[gActiveBattler][2] == 0) + if (gBattleResources->bufferA[gActiveBattler][2] == 0) { size += CopyLinkPartnerMonData(gBattlerPartyIndexes[gActiveBattler], monData); } else { - monToCheck = gBattleBufferA[gActiveBattler][2]; + monToCheck = gBattleResources->bufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; i++) { if (monToCheck & 1) @@ -457,7 +459,7 @@ static u32 CopyLinkPartnerMonData(u8 monId, u8 *dst) u32 data32; s32 size = 0; - switch (gBattleBufferA[gActiveBattler][1]) + switch (gBattleResources->bufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); @@ -486,7 +488,6 @@ static u32 CopyLinkPartnerMonData(u8 monId, u8 *dst) battleMon.speed = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED); battleMon.spAttack = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK); battleMon.spDefense = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF); - battleMon.isEgg = GetMonData(&gPlayerParty[monId], MON_DATA_IS_EGG); battleMon.abilityNum = GetMonData(&gPlayerParty[monId], MON_DATA_ABILITY_NUM); battleMon.otId = GetMonData(&gPlayerParty[monId], MON_DATA_OT_ID); GetMonData(&gPlayerParty[monId], MON_DATA_NICKNAME, nickname); @@ -523,7 +524,7 @@ static u32 CopyLinkPartnerMonData(u8 monId, u8 *dst) case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE); + data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE); dst[0] = data16; dst[1] = data16 >> 8; size = 2; @@ -538,7 +539,7 @@ static u32 CopyLinkPartnerMonData(u8 monId, u8 *dst) case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE); size = 1; break; case REQUEST_OTID_BATTLE: @@ -763,13 +764,13 @@ static void LinkPartnerHandleSetMonData(void) u8 monToCheck; u8 i; - if (gBattleBufferA[gActiveBattler][2] == 0) + if (gBattleResources->bufferA[gActiveBattler][2] == 0) { SetLinkPartnerMonData(gBattlerPartyIndexes[gActiveBattler]); } else { - monToCheck = gBattleBufferA[gActiveBattler][2]; + monToCheck = gBattleResources->bufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; i++) { if (monToCheck & 1) @@ -782,11 +783,11 @@ static void LinkPartnerHandleSetMonData(void) static void SetLinkPartnerMonData(u8 monId) { - struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3]; - struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3]; + struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleResources->bufferA[gActiveBattler][3]; + struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleResources->bufferA[gActiveBattler][3]; s32 i; - switch (gBattleBufferA[gActiveBattler][1]) + switch (gBattleResources->bufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: { @@ -827,10 +828,10 @@ static void SetLinkPartnerMonData(u8 monId) } break; case REQUEST_SPECIES_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_HELDITEM_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: for (i = 0; i < MAX_MON_MOVES; i++) @@ -844,154 +845,154 @@ static void SetLinkPartnerMonData(u8 monId) case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_PP_DATA_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleResources->bufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleResources->bufferA[gActiveBattler][4]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleResources->bufferA[gActiveBattler][5]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleResources->bufferA[gActiveBattler][6]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleResources->bufferA[gActiveBattler][7]); break; case REQUEST_PPMOVE1_BATTLE: case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_OTID_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_EXP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_HP_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ATK_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_DEF_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPEED_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPATK_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_FRIENDSHIP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_POKERUS_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MET_LOCATION_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MET_LEVEL_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MET_GAME_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_POKEBALL_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ALL_IVS_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]); - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]); + SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleResources->bufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleResources->bufferA[gActiveBattler][4]); + SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleResources->bufferA[gActiveBattler][5]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleResources->bufferA[gActiveBattler][6]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleResources->bufferA[gActiveBattler][7]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleResources->bufferA[gActiveBattler][8]); break; case REQUEST_HP_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ATK_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_DEF_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPEED_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPATK_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_PERSONALITY_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_LEVEL_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_HP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MAX_HP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ATK_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_DEF_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPEED_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPATK_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_COOL_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_CUTE_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SMART_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SHEEN_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_COOL_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_CUTE_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SMART_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; } @@ -1000,11 +1001,11 @@ static void SetLinkPartnerMonData(u8 monId) static void LinkPartnerHandleSetRawMonData(void) { - u8 *dst = (u8 *)&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1]; + u8 *dst = (u8 *)&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleResources->bufferA[gActiveBattler][1]; u8 i; - for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++) - dst[i] = gBattleBufferA[gActiveBattler][3 + i]; + for (i = 0; i < gBattleResources->bufferA[gActiveBattler][2]; i++) + dst[i] = gBattleResources->bufferA[gActiveBattler][3 + i]; LinkPartnerBufferExecCompleted(); } @@ -1030,10 +1031,10 @@ static void LinkPartnerHandleLoadMonSprite(void) static void LinkPartnerHandleSwitchInAnim(void) { - ClearTemporarySpeciesSpriteData(gActiveBattler, gBattleBufferA[gActiveBattler][2]); - gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1]; + ClearTemporarySpeciesSpriteData(gActiveBattler, gBattleResources->bufferA[gActiveBattler][2]); + gBattlerPartyIndexes[gActiveBattler] = gBattleResources->bufferA[gActiveBattler][1]; BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - sub_814CC98(gActiveBattler, gBattleBufferA[gActiveBattler][2]); + sub_814CC98(gActiveBattler, gBattleResources->bufferA[gActiveBattler][2]); gBattlerControllerFuncs[gActiveBattler] = sub_814B69C; } @@ -1042,7 +1043,7 @@ static void sub_814CC98(u8 battlerId, bool8 dontClearSubstituteBit) u16 species; ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit); - gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; + gBattlerPartyIndexes[battlerId] = gBattleResources->bufferA[battlerId][1]; species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); @@ -1070,7 +1071,7 @@ static void sub_814CC98(u8 battlerId, bool8 dontClearSubstituteBit) static void LinkPartnerHandleReturnMonToBall(void) { - if (gBattleBufferA[gActiveBattler][1] == 0) + if (gBattleResources->bufferA[gActiveBattler][1] == 0) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation; @@ -1212,14 +1213,14 @@ static void LinkPartnerHandleMoveAnimation(void) { if (!mplay_80342A4(gActiveBattler)) { - u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); + u16 move = gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8); - gAnimMoveTurn = gBattleBufferA[gActiveBattler][3]; - gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8); - gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24); - gAnimFriendship = gBattleBufferA[gActiveBattler][10]; - gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8); - gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16]; + gAnimMoveTurn = gBattleResources->bufferA[gActiveBattler][3]; + gAnimMovePower = gBattleResources->bufferA[gActiveBattler][4] | (gBattleResources->bufferA[gActiveBattler][5] << 8); + gAnimMoveDmg = gBattleResources->bufferA[gActiveBattler][6] | (gBattleResources->bufferA[gActiveBattler][7] << 8) | (gBattleResources->bufferA[gActiveBattler][8] << 16) | (gBattleResources->bufferA[gActiveBattler][9] << 24); + gAnimFriendship = gBattleResources->bufferA[gActiveBattler][10]; + gWeatherMoveAnim = gBattleResources->bufferA[gActiveBattler][12] | (gBattleResources->bufferA[gActiveBattler][13] << 8); + gAnimDisableStructPtr = (struct DisableStruct *)&gBattleResources->bufferA[gActiveBattler][16]; gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality; if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE { @@ -1236,8 +1237,8 @@ static void LinkPartnerHandleMoveAnimation(void) static void LinkPartnerDoMoveAnimation(void) { - u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); - u8 multihit = gBattleBufferA[gActiveBattler][11]; + u16 move = gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8); + u8 multihit = gBattleResources->bufferA[gActiveBattler][11]; switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState) { @@ -1275,7 +1276,7 @@ static void LinkPartnerDoMoveAnimation(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { CopyAllBattleSpritesInvisibilities(); - TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; LinkPartnerBufferExecCompleted(); } @@ -1289,7 +1290,7 @@ static void LinkPartnerHandlePrintString(void) gBattle_BG0_X = 0; gBattle_BG0_Y = 0; - stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]); + stringId = (u16*)(&gBattleResources->bufferA[gActiveBattler][2]); BufferStringBattle(*stringId); BattlePutTextOnWindow(gDisplayedStringBattle, 0); gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter; @@ -1336,7 +1337,7 @@ static void LinkPartnerHandleHealthBarUpdate(void) s16 hpVal; LoadBattleBarGfx(0); - hpVal = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); + hpVal = gBattleResources->bufferA[gActiveBattler][2] | (gBattleResources->bufferA[gActiveBattler][3] << 8); if (hpVal != INSTANT_HP_BAR_DROP) { @@ -1377,8 +1378,8 @@ static void LinkPartnerHandleStatusAnimation(void) { if (!mplay_80342A4(gActiveBattler)) { - InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1], - gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24)); + InitAndLaunchChosenStatusAnimation(gBattleResources->bufferA[gActiveBattler][1], + gBattleResources->bufferA[gActiveBattler][2] | (gBattleResources->bufferA[gActiveBattler][3] << 8) | (gBattleResources->bufferA[gActiveBattler][4] << 16) | (gBattleResources->bufferA[gActiveBattler][5] << 24)); gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; } } @@ -1436,7 +1437,7 @@ static void LinkPartnerHandleCmd37(void) static void LinkPartnerHandleCmd38(void) { - gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBattler][1]; + gUnknown_02022D0C.field_0 = gBattleResources->bufferA[gActiveBattler][1]; LinkPartnerBufferExecCompleted(); } @@ -1481,20 +1482,20 @@ static void LinkPartnerHandlePlaySE(void) else pan = SOUND_PAN_TARGET; - PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan); + PlaySE12WithPanning(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8), pan); LinkPartnerBufferExecCompleted(); } static void LinkPartnerHandlePlayFanfareOrBGM(void) { - if (gBattleBufferA[gActiveBattler][3]) + if (gBattleResources->bufferA[gActiveBattler][3]) { BattleStopLowHpSound(); - PlayBGM(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + PlayBGM(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); } else { - PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + PlayFanfare(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); } LinkPartnerBufferExecCompleted(); @@ -1510,7 +1511,7 @@ static void LinkPartnerHandleFaintingCry(void) static void LinkPartnerHandleIntroSlide(void) { - HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); + HandleIntroSlide(gBattleResources->bufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; LinkPartnerBufferExecCompleted(); } @@ -1576,15 +1577,15 @@ static void sub_814DCCC(u8 taskId) gActiveBattler = gTasks[taskId].data[0]; if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) { - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + gBattleResources->bufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; sub_814CC98(gActiveBattler, FALSE); } else { - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + gBattleResources->bufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; sub_814CC98(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + gBattleResources->bufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); sub_814CC98(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; @@ -1597,17 +1598,17 @@ static void sub_814DCCC(u8 taskId) static void LinkPartnerHandleDrawPartyStatusSummary(void) { - if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) + if (gBattleResources->bufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { LinkPartnerBufferExecCompleted(); } else { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = 1; - gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]); + gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleResources->bufferA[gActiveBattler][4], gBattleResources->bufferA[gActiveBattler][1], gBattleResources->bufferA[gActiveBattler][2]); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0; - if (gBattleBufferA[gActiveBattler][2] != 0) + if (gBattleResources->bufferA[gActiveBattler][2] != 0) gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0x5D; gBattlerControllerFuncs[gActiveBattler] = sub_814DE9C; @@ -1639,7 +1640,7 @@ static void LinkPartnerHandleSpriteInvisibility(void) { if (IsBattlerSpritePresent(gActiveBattler)) { - gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1]; + gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleResources->bufferA[gActiveBattler][1]; CopyBattleSpriteInvisibility(gActiveBattler); } LinkPartnerBufferExecCompleted(); @@ -1649,8 +1650,8 @@ static void LinkPartnerHandleBattleAnimation(void) { if (!mplay_80342A4(gActiveBattler)) { - u8 animationId = gBattleBufferA[gActiveBattler][1]; - u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); + u8 animationId = gBattleResources->bufferA[gActiveBattler][1]; + u16 argument = gBattleResources->bufferA[gActiveBattler][2] | (gBattleResources->bufferA[gActiveBattler][3] << 8); if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument)) LinkPartnerBufferExecCompleted(); @@ -1663,7 +1664,7 @@ static void LinkPartnerHandleBattleAnimation(void) static void LinkPartnerHandleLinkStandbyMsg(void) { - sub_81851A8(&gBattleBufferA[gActiveBattler][2]); + sub_81851A8(&gBattleResources->bufferA[gActiveBattler][2]); LinkPartnerBufferExecCompleted(); } @@ -1674,15 +1675,20 @@ static void LinkPartnerHandleResetActionMoveSelection(void) static void LinkPartnerHandleCmd55(void) { - sub_81851A8(&gBattleBufferA[gActiveBattler][4]); - gBattleOutcome = gBattleBufferA[gActiveBattler][1]; - gSaveBlock2Ptr->frontier.disableRecordBattle = gBattleBufferA[gActiveBattler][2]; + sub_81851A8(&gBattleResources->bufferA[gActiveBattler][4]); + gBattleOutcome = gBattleResources->bufferA[gActiveBattler][1]; + gSaveBlock2Ptr->frontier.disableRecordBattle = gBattleResources->bufferA[gActiveBattler][2]; FadeOutMapMusic(5); BeginFastPaletteFade(3); LinkPartnerBufferExecCompleted(); gBattlerControllerFuncs[gActiveBattler] = sub_80587B0; } +static void LinkPartnerHandleBattleDebug(void) +{ + LinkPartnerBufferExecCompleted(); +} + static void LinkPartnerCmdEnd(void) { } diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index f186bf3ff6..f244377aa5 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -93,6 +93,7 @@ static void OpponentHandleBattleAnimation(void); static void OpponentHandleLinkStandbyMsg(void); static void OpponentHandleResetActionMoveSelection(void); static void OpponentHandleCmd55(void); +static void OpponentHandleDebugMenu(void); static void OpponentCmdEnd(void); static void OpponentBufferRunCommand(void); @@ -165,6 +166,7 @@ static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void) = OpponentHandleLinkStandbyMsg, OpponentHandleResetActionMoveSelection, OpponentHandleCmd55, + OpponentHandleDebugMenu, OpponentCmdEnd }; @@ -184,8 +186,8 @@ static void OpponentBufferRunCommand(void) { if (gBattleControllerExecFlags & gBitTable[gActiveBattler]) { - if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sOpponentBufferCommands)) - sOpponentBufferCommands[gBattleBufferA[gActiveBattler][0]](); + if (gBattleResources->bufferA[gActiveBattler][0] < ARRAY_COUNT(sOpponentBufferCommands)) + sOpponentBufferCommands[gBattleResources->bufferA[gActiveBattler][0]](); else OpponentBufferExecCompleted(); } @@ -228,7 +230,7 @@ static void sub_805F2F0(void) bool8 var = FALSE; bool8 var2; - if (!IsDoubleBattle() || ((IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI)) || (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS))) + if (!IsDoubleBattle() || ((IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI) && !BATTLE_TWO_VS_ONE_OPPONENT) || (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS))) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) var = TRUE; @@ -249,7 +251,7 @@ static void sub_805F2F0(void) { if (var2 == TRUE) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; @@ -266,7 +268,7 @@ static void sub_805F2F0(void) { if (GetBattlerPosition(gActiveBattler) == 3) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim) { FreeSpriteTilesByTag(0x27F9); @@ -291,16 +293,16 @@ static void sub_805F560(void) bool32 sp = FALSE; bool32 r10 = FALSE; - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); - if (!(gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) - && !(gBattleTypeFlags & BATTLE_TYPE_MULTI) - && IsDoubleBattle() - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive + if (!(gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + && !(gBattleTypeFlags & BATTLE_TYPE_MULTI) + && IsDoubleBattle() + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim) TryShinyAnimation(gActiveBattler ^ BIT_FLANK, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]); @@ -308,7 +310,7 @@ static void sub_805F560(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80) { - if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) + if (IsDoubleBattle() && (!(gBattleTypeFlags & BATTLE_TYPE_MULTI) || BATTLE_TWO_VS_ONE_OPPONENT)) { UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], HEALTHBOX_ALL); sub_8076918(gActiveBattler ^ BIT_FLANK); @@ -340,7 +342,7 @@ static void sub_805F560(void) sp = TRUE; } - if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI))) + if (!IsDoubleBattle() || (IsDoubleBattle() && gBattleTypeFlags & BATTLE_TYPE_MULTI && !BATTLE_TWO_VS_ONE_OPPONENT)) { if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) @@ -361,7 +363,7 @@ static void sub_805F560(void) if (sp && r10) { - if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) + if (IsDoubleBattle() && (!(gBattleTypeFlags & BATTLE_TYPE_MULTI) || BATTLE_TWO_VS_ONE_OPPONENT)) { DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler ^ BIT_FLANK]]); SetBattlerShadowSpriteCallback(gActiveBattler ^ BIT_FLANK, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], MON_DATA_SPECIES)); @@ -379,12 +381,12 @@ static void sub_805F560(void) static void sub_805F994(void) { - if (gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x == 0 - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim + if (gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x == 0 + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); - if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy + if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; @@ -477,7 +479,7 @@ static void sub_805FC80(void) static void sub_805FD00(void) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; @@ -495,7 +497,7 @@ static void sub_805FD00(void) static void sub_805FDF0(void) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); @@ -528,7 +530,7 @@ static void OpponentBufferExecCompleted(void) u8 playerId = GetMultiplayerId(); PrepareBufferDataTransferLink(2, 4, &playerId); - gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; + gBattleResources->bufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else { @@ -543,13 +545,13 @@ static void OpponentHandleGetMonData(void) u8 monToCheck; s32 i; - if (gBattleBufferA[gActiveBattler][2] == 0) + if (gBattleResources->bufferA[gActiveBattler][2] == 0) { size += GetOpponentMonData(gBattlerPartyIndexes[gActiveBattler], monData); } else { - monToCheck = gBattleBufferA[gActiveBattler][2]; + monToCheck = gBattleResources->bufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; i++) { if (monToCheck & 1) @@ -571,7 +573,7 @@ static u32 GetOpponentMonData(u8 monId, u8 *dst) u32 data32; s32 size = 0; - switch (gBattleBufferA[gActiveBattler][1]) + switch (gBattleResources->bufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: battleMon.species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES); @@ -600,7 +602,6 @@ static u32 GetOpponentMonData(u8 monId, u8 *dst) battleMon.speed = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED); battleMon.spAttack = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK); battleMon.spDefense = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF); - battleMon.isEgg = GetMonData(&gEnemyParty[monId], MON_DATA_IS_EGG); battleMon.abilityNum = GetMonData(&gEnemyParty[monId], MON_DATA_ABILITY_NUM); battleMon.otId = GetMonData(&gEnemyParty[monId], MON_DATA_OT_ID); GetMonData(&gEnemyParty[monId], MON_DATA_NICKNAME, nickname); @@ -637,7 +638,7 @@ static u32 GetOpponentMonData(u8 monId, u8 *dst) case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - data16 = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE); + data16 = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE); dst[0] = data16; dst[1] = data16 >> 8; size = 2; @@ -652,7 +653,7 @@ static u32 GetOpponentMonData(u8 monId, u8 *dst) case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE); size = 1; break; case REQUEST_OTID_BATTLE: @@ -870,14 +871,14 @@ static u32 GetOpponentMonData(u8 monId, u8 *dst) static void OpponentHandleGetRawMonData(void) { struct BattlePokemon battleMon; - u8 *src = (u8 *)&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1]; - u8 *dst = (u8 *)&battleMon + gBattleBufferA[gActiveBattler][1]; + u8 *src = (u8 *)&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleResources->bufferA[gActiveBattler][1]; + u8 *dst = (u8 *)&battleMon + gBattleResources->bufferA[gActiveBattler][1]; u8 i; - for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++) + for (i = 0; i < gBattleResources->bufferA[gActiveBattler][2]; i++) dst[i] = src[i]; - BtlController_EmitDataTransfer(1, gBattleBufferA[gActiveBattler][2], dst); + BtlController_EmitDataTransfer(1, gBattleResources->bufferA[gActiveBattler][2], dst); OpponentBufferExecCompleted(); } @@ -886,13 +887,13 @@ static void OpponentHandleSetMonData(void) u8 monToCheck; u8 i; - if (gBattleBufferA[gActiveBattler][2] == 0) + if (gBattleResources->bufferA[gActiveBattler][2] == 0) { SetOpponentMonData(gBattlerPartyIndexes[gActiveBattler]); } else { - monToCheck = gBattleBufferA[gActiveBattler][2]; + monToCheck = gBattleResources->bufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; i++) { if (monToCheck & 1) @@ -905,11 +906,11 @@ static void OpponentHandleSetMonData(void) static void SetOpponentMonData(u8 monId) { - struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3]; - struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3]; + struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleResources->bufferA[gActiveBattler][3]; + struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleResources->bufferA[gActiveBattler][3]; s32 i; - switch (gBattleBufferA[gActiveBattler][1]) + switch (gBattleResources->bufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: { @@ -950,10 +951,10 @@ static void SetOpponentMonData(u8 monId) } break; case REQUEST_SPECIES_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_HELDITEM_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: for (i = 0; i < MAX_MON_MOVES; i++) @@ -967,165 +968,165 @@ static void SetOpponentMonData(u8 monId) case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_PP_DATA_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gEnemyParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gEnemyParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gEnemyParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]); + SetMonData(&gEnemyParty[monId], MON_DATA_PP1, &gBattleResources->bufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_PP2, &gBattleResources->bufferA[gActiveBattler][4]); + SetMonData(&gEnemyParty[monId], MON_DATA_PP3, &gBattleResources->bufferA[gActiveBattler][5]); + SetMonData(&gEnemyParty[monId], MON_DATA_PP4, &gBattleResources->bufferA[gActiveBattler][6]); + SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &gBattleResources->bufferA[gActiveBattler][7]); break; case REQUEST_PPMOVE1_BATTLE: case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_OTID_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_OT_ID, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_EXP_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_EXP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_HP_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_HP_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ATK_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_ATK_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_DEF_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_DEF_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPEED_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPATK_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_FRIENDSHIP_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_POKERUS_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_POKERUS, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MET_LOCATION_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_MET_LOCATION, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MET_LEVEL_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_MET_LEVEL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MET_GAME_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_MET_GAME, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_POKEBALL_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_POKEBALL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ALL_IVS_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]); - SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]); + SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleResources->bufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleResources->bufferA[gActiveBattler][4]); + SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleResources->bufferA[gActiveBattler][5]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleResources->bufferA[gActiveBattler][6]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleResources->bufferA[gActiveBattler][7]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleResources->bufferA[gActiveBattler][8]); break; case REQUEST_HP_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ATK_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_DEF_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPEED_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPATK_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_PERSONALITY_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_LEVEL_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_HP_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_HP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MAX_HP_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ATK_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_ATK, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_DEF_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_DEF, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPEED_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPEED, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPATK_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPATK, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_COOL_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_COOL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_CUTE_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_CUTE, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SMART_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SMART, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SHEEN_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SHEEN, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_COOL_RIBBON_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_COOL_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_RIBBON_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_CUTE_RIBBON_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_CUTE_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SMART_RIBBON_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SMART_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_RIBBON_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; } } static void OpponentHandleSetRawMonData(void) { - u8 *dst = (u8 *)&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1]; + u8 *dst = (u8 *)&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleResources->bufferA[gActiveBattler][1]; u8 i; - for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++) - dst[i] = gBattleBufferA[gActiveBattler][3 + i]; + for (i = 0; i < gBattleResources->bufferA[gActiveBattler][2]; i++) + dst[i] = gBattleResources->bufferA[gActiveBattler][3 + i]; OpponentBufferExecCompleted(); } @@ -1156,8 +1157,8 @@ static void OpponentHandleLoadMonSprite(void) static void OpponentHandleSwitchInAnim(void) { *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = 6; - gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1]; - sub_80613DC(gActiveBattler, gBattleBufferA[gActiveBattler][2]); + gBattlerPartyIndexes[gActiveBattler] = gBattleResources->bufferA[gActiveBattler][1]; + sub_80613DC(gActiveBattler, gBattleResources->bufferA[gActiveBattler][2]); gBattlerControllerFuncs[gActiveBattler] = sub_805FDF0; } @@ -1166,7 +1167,7 @@ static void sub_80613DC(u8 battlerId, bool8 dontClearSubstituteBit) u16 species; ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit); - gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; + gBattlerPartyIndexes[battlerId] = gBattleResources->bufferA[battlerId][1]; species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714); BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId); @@ -1195,7 +1196,7 @@ static void sub_80613DC(u8 battlerId, bool8 dontClearSubstituteBit) static void OpponentHandleReturnMonToBall(void) { - if (gBattleBufferA[gActiveBattler][1] == 0) + if (gBattleResources->bufferA[gActiveBattler][1] == 0) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation; @@ -1288,7 +1289,7 @@ static void OpponentHandleDrawTrainerPic(void) trainerPicId = gTrainers[gTrainerBattleOpponent_A].trainerPic; } - if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS)) + if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS) && !BATTLE_TWO_VS_ONE_OPPONENT) { if ((GetBattlerPosition(gActiveBattler) & BIT_FLANK) != 0) // second mon xPos = 152; @@ -1441,14 +1442,14 @@ static void OpponentHandleMoveAnimation(void) { if (!mplay_80342A4(gActiveBattler)) { - u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); + u16 move = gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8); - gAnimMoveTurn = gBattleBufferA[gActiveBattler][3]; - gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8); - gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24); - gAnimFriendship = gBattleBufferA[gActiveBattler][10]; - gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8); - gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16]; + gAnimMoveTurn = gBattleResources->bufferA[gActiveBattler][3]; + gAnimMovePower = gBattleResources->bufferA[gActiveBattler][4] | (gBattleResources->bufferA[gActiveBattler][5] << 8); + gAnimMoveDmg = gBattleResources->bufferA[gActiveBattler][6] | (gBattleResources->bufferA[gActiveBattler][7] << 8) | (gBattleResources->bufferA[gActiveBattler][8] << 16) | (gBattleResources->bufferA[gActiveBattler][9] << 24); + gAnimFriendship = gBattleResources->bufferA[gActiveBattler][10]; + gWeatherMoveAnim = gBattleResources->bufferA[gActiveBattler][12] | (gBattleResources->bufferA[gActiveBattler][13] << 8); + gAnimDisableStructPtr = (struct DisableStruct *)&gBattleResources->bufferA[gActiveBattler][16]; gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality; if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE { @@ -1464,8 +1465,8 @@ static void OpponentHandleMoveAnimation(void) static void OpponentDoMoveAnimation(void) { - u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); - u8 multihit = gBattleBufferA[gActiveBattler][11]; + u16 move = gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8); + u8 multihit = gBattleResources->bufferA[gActiveBattler][11]; switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState) { @@ -1503,7 +1504,7 @@ static void OpponentDoMoveAnimation(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { CopyAllBattleSpritesInvisibilities(); - TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; OpponentBufferExecCompleted(); } @@ -1517,7 +1518,7 @@ static void OpponentHandlePrintString(void) gBattle_BG0_X = 0; gBattle_BG0_Y = 0; - stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]); + stringId = (u16*)(&gBattleResources->bufferA[gActiveBattler][2]); BufferStringBattle(*stringId); BattlePutTextOnWindow(gDisplayedStringBattle, 0); gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter; @@ -1550,11 +1551,10 @@ static void OpponentHandleChooseMove(void) else { u8 chosenMoveId; - struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBattler][4]); + struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleResources->bufferA[gActiveBattler][4]); if (gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_SAFARI | BATTLE_TYPE_ROAMER)) { - BattleAI_SetupAIData(0xF); chosenMoveId = BattleAI_ChooseMoveOrAction(); @@ -1566,6 +1566,9 @@ static void OpponentHandleChooseMove(void) case AI_CHOICE_FLEE: BtlController_EmitTwoReturnValues(1, B_ACTION_RUN, 0); break; + case AI_CHOICE_SWITCH: + BtlController_EmitTwoReturnValues(1, 10, 0xFFFF); + break; case 6: BtlController_EmitTwoReturnValues(1, 15, gBattlerTarget); break; @@ -1578,7 +1581,10 @@ static void OpponentHandleChooseMove(void) if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); } - BtlController_EmitTwoReturnValues(1, 10, (chosenMoveId) | (gBattlerTarget << 8)); + if (CanMegaEvolve(gActiveBattler)) // If opponent can mega evolve, do it. + BtlController_EmitTwoReturnValues(1, 10, (chosenMoveId) | (RET_MEGA_EVOLUTION) | (gBattlerTarget << 8)); + else + BtlController_EmitTwoReturnValues(1, 10, (chosenMoveId) | (gBattlerTarget << 8)); break; } OpponentBufferExecCompleted(); @@ -1632,17 +1638,7 @@ static void OpponentHandleChoosePokemon(void) battler2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); } - if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000)) - { - if (gActiveBattler == 1) - firstId = 0, lastId = 3; - else - firstId = 3, lastId = 6; - } - else - { - firstId = 0, lastId = 6; - } + GetAIPartyIndexes(gActiveBattler, &firstId, &lastId); for (chosenMonId = firstId; chosenMonId < lastId; chosenMonId++) { @@ -1677,7 +1673,7 @@ static void OpponentHandleHealthBarUpdate(void) s16 hpVal; LoadBattleBarGfx(0); - hpVal = (gBattleBufferA[gActiveBattler][3] << 8) | gBattleBufferA[gActiveBattler][2]; + hpVal = (gBattleResources->bufferA[gActiveBattler][3] << 8) | gBattleResources->bufferA[gActiveBattler][2]; if (hpVal != INSTANT_HP_BAR_DROP) { @@ -1718,8 +1714,8 @@ static void OpponentHandleStatusAnimation(void) { if (!mplay_80342A4(gActiveBattler)) { - InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1], - gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24)); + InitAndLaunchChosenStatusAnimation(gBattleResources->bufferA[gActiveBattler][1], + gBattleResources->bufferA[gActiveBattler][2] | (gBattleResources->bufferA[gActiveBattler][3] << 8) | (gBattleResources->bufferA[gActiveBattler][4] << 16) | (gBattleResources->bufferA[gActiveBattler][5] << 24)); gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; } } @@ -1777,7 +1773,7 @@ static void OpponentHandleCmd37(void) static void OpponentHandleCmd38(void) { - gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBattler][1]; + gUnknown_02022D0C.field_0 = gBattleResources->bufferA[gActiveBattler][1]; OpponentBufferExecCompleted(); } @@ -1822,20 +1818,20 @@ static void OpponentHandlePlaySE(void) else pan = SOUND_PAN_TARGET; - PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan); + PlaySE12WithPanning(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8), pan); OpponentBufferExecCompleted(); } static void OpponentHandlePlayFanfareOrBGM(void) { - if (gBattleBufferA[gActiveBattler][3]) + if (gBattleResources->bufferA[gActiveBattler][3]) { BattleStopLowHpSound(); - PlayBGM(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + PlayBGM(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); } else { - PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + PlayFanfare(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); } OpponentBufferExecCompleted(); @@ -1851,7 +1847,7 @@ static void OpponentHandleFaintingCry(void) static void OpponentHandleIntroSlide(void) { - HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); + HandleIntroSlide(gBattleResources->bufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; OpponentBufferExecCompleted(); } @@ -1892,22 +1888,22 @@ static void sub_8062828(u8 taskId) u8 savedActiveBank = gActiveBattler; gActiveBattler = gTasks[taskId].data[0]; - if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) + if ((!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) && !BATTLE_TWO_VS_ONE_OPPONENT) { - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + gBattleResources->bufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; sub_80613DC(gActiveBattler, FALSE); } else if ((gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)) { - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + gBattleResources->bufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; sub_80613DC(gActiveBattler, FALSE); } else { - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + gBattleResources->bufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; sub_80613DC(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + gBattleResources->bufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; sub_80613DC(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; } @@ -1918,7 +1914,7 @@ static void sub_8062828(u8 taskId) static void OpponentHandleDrawPartyStatusSummary(void) { - if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) + if (gBattleResources->bufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { OpponentBufferExecCompleted(); } @@ -1926,7 +1922,7 @@ static void OpponentHandleDrawPartyStatusSummary(void) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = 1; - if (gBattleBufferA[gActiveBattler][2] != 0) + if (gBattleResources->bufferA[gActiveBattler][2] != 0) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1E < 2) { @@ -1939,10 +1935,10 @@ static void OpponentHandleDrawPartyStatusSummary(void) } } - gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]); + gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleResources->bufferA[gActiveBattler][4], gBattleResources->bufferA[gActiveBattler][1], gBattleResources->bufferA[gActiveBattler][2]); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0; - if (gBattleBufferA[gActiveBattler][2] != 0) + if (gBattleResources->bufferA[gActiveBattler][2] != 0) gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0x5D; gBattlerControllerFuncs[gActiveBattler] = sub_8062A2C; @@ -1974,7 +1970,7 @@ static void OpponentHandleSpriteInvisibility(void) { if (IsBattlerSpritePresent(gActiveBattler)) { - gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1]; + gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleResources->bufferA[gActiveBattler][1]; CopyBattleSpriteInvisibility(gActiveBattler); } OpponentBufferExecCompleted(); @@ -1984,8 +1980,8 @@ static void OpponentHandleBattleAnimation(void) { if (!mplay_80342A4(gActiveBattler)) { - u8 animationId = gBattleBufferA[gActiveBattler][1]; - u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); + u8 animationId = gBattleResources->bufferA[gActiveBattler][1]; + u16 argument = gBattleResources->bufferA[gActiveBattler][2] | (gBattleResources->bufferA[gActiveBattler][3] << 8); if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument)) OpponentBufferExecCompleted(); @@ -2015,6 +2011,11 @@ static void OpponentHandleCmd55(void) OpponentBufferExecCompleted(); } +static void OpponentHandleDebugMenu(void) +{ + OpponentBufferExecCompleted(); +} + static void OpponentCmdEnd(void) { } diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 7c34efd443..2ad1136382 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -29,6 +29,7 @@ #include "util.h" #include "window.h" #include "constants/battle_anim.h" +#include "constants/battle_config.h" #include "constants/items.h" #include "constants/moves.h" #include "constants/party_menu.h" @@ -94,6 +95,7 @@ static void PlayerHandleBattleAnimation(void); static void PlayerHandleLinkStandbyMsg(void); static void PlayerHandleResetActionMoveSelection(void); static void PlayerHandleCmd55(void); +static void PlayerHandleBattleDebug(void); static void PlayerCmdEnd(void); static void PlayerBufferRunCommand(void); @@ -181,11 +183,10 @@ static void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(void) = PlayerHandleLinkStandbyMsg, PlayerHandleResetActionMoveSelection, PlayerHandleCmd55, + PlayerHandleBattleDebug, PlayerCmdEnd }; -static const u8 sTargetIdentities[] = {B_POSITION_PLAYER_LEFT, B_POSITION_PLAYER_RIGHT, B_POSITION_OPPONENT_RIGHT, B_POSITION_OPPONENT_LEFT}; - // unknown unused data static const u8 sUnknown_0831C5FC[] = {0x48, 0x48, 0x20, 0x5a, 0x50, 0x50, 0x50, 0x58}; @@ -208,7 +209,7 @@ static void PlayerBufferExecCompleted(void) u8 playerId = GetMultiplayerId(); PrepareBufferDataTransferLink(2, 4, &playerId); - gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; + gBattleResources->bufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else { @@ -220,8 +221,8 @@ static void PlayerBufferRunCommand(void) { if (gBattleControllerExecFlags & gBitTable[gActiveBattler]) { - if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sPlayerBufferCommands)) - sPlayerBufferCommands[gBattleBufferA[gActiveBattler][0]](); + if (gBattleResources->bufferA[gActiveBattler][0] < ARRAY_COUNT(sPlayerBufferCommands)) + sPlayerBufferCommands[gBattleResources->bufferA[gActiveBattler][0]](); else PlayerBufferExecCompleted(); } @@ -235,7 +236,7 @@ static void CompleteOnBankSpritePosX_0(void) static void HandleInputChooseAction(void) { - u16 itemId = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); + u16 itemId = gBattleResources->bufferA[gActiveBattler][2] | (gBattleResources->bufferA[gActiveBattler][3] << 8); DoBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX, 7, 1); DoBounceEffect(gActiveBattler, BOUNCE_MON, 7, 1); @@ -313,7 +314,7 @@ static void HandleInputChooseAction(void) && !(gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]) && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { - if (gBattleBufferA[gActiveBattler][1] == B_ACTION_USE_ITEM) + if (gBattleResources->bufferA[gActiveBattler][1] == B_ACTION_USE_ITEM) { // Add item to bag if it is a ball if (itemId <= LAST_BALL) @@ -330,6 +331,11 @@ static void HandleInputChooseAction(void) { SwapHpBarsWithHpText(); } + else if (USE_BATTLE_DEBUG && gMain.newKeys & SELECT_BUTTON) + { + BtlController_EmitTwoReturnValues(1, B_ACTION_DEBUG, 0); + PlayerBufferExecCompleted(); + } } static void sub_80577F0(void) // unused @@ -342,21 +348,14 @@ static void sub_80577F0(void) // unused static void HandleInputChooseTarget(void) { s32 i; - u8 identities[4]; - memcpy(identities, sTargetIdentities, ARRAY_COUNT(sTargetIdentities)); + static const u8 identities[4] = {B_POSITION_PLAYER_LEFT, B_POSITION_PLAYER_RIGHT, B_POSITION_OPPONENT_RIGHT, B_POSITION_OPPONENT_LEFT}; + u16 move = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + gMoveSelectionCursor[gActiveBattler]); DoBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX, 15, 1); - - // what a weird loop - i = 0; - if (gBattlersCount != 0) + for (i = 0; i < gBattlersCount; i++) { - do - { - if (i != gMultiUsePlayerCursor) - EndBounceEffect(i, BOUNCE_HEALTHBOX); - i++; - } while (i < gBattlersCount); + if (i != gMultiUsePlayerCursor) + EndBounceEffect(i, BOUNCE_HEALTHBOX); } if (JOY_HELD(DPAD_ANY) && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_L_EQUALS_A) @@ -368,8 +367,12 @@ static void HandleInputChooseTarget(void) { PlaySE(SE_SELECT); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCb_HideAsMoveTarget; - BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); + if (gBattleStruct->mega.playerSelect) + BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | RET_MEGA_EVOLUTION | (gMultiUsePlayerCursor << 8)); + else + BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); EndBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX); + HideMegaTriggerSprite(); PlayerBufferExecCompleted(); } else if (JOY_NEW(B_BUTTON) || gPlayerDpadHoldFrames > 59) @@ -386,41 +389,48 @@ static void HandleInputChooseTarget(void) PlaySE(SE_SELECT); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCb_HideAsMoveTarget; - do + if (gBattleMoves[move].target == (MOVE_TARGET_USER | MOVE_TARGET_ALLY)) + { + gMultiUsePlayerCursor ^= BIT_FLANK; + } + else { - u8 currSelIdentity = GetBattlerPosition(gMultiUsePlayerCursor); - - for (i = 0; i < MAX_BATTLERS_COUNT; i++) - { - if (currSelIdentity == identities[i]) - break; - } do { - if (--i < 0) - i = MAX_BATTLERS_COUNT; // UB: array out of range - gMultiUsePlayerCursor = GetBattlerAtPosition(identities[i]); - } while (gMultiUsePlayerCursor == gBattlersCount); + u8 currSelIdentity = GetBattlerPosition(gMultiUsePlayerCursor); - i = 0; - switch (GetBattlerPosition(gMultiUsePlayerCursor)) - { - case B_POSITION_PLAYER_LEFT: - case B_POSITION_PLAYER_RIGHT: - if (gActiveBattler != gMultiUsePlayerCursor) - i++; - else if (gBattleMoves[GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + gMoveSelectionCursor[gActiveBattler])].target & MOVE_TARGET_USER_OR_SELECTED) - i++; - break; - case B_POSITION_OPPONENT_LEFT: - case B_POSITION_OPPONENT_RIGHT: - i++; - break; - } + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { + if (currSelIdentity == identities[i]) + break; + } + do + { + if (--i < 0) + i = 3; + gMultiUsePlayerCursor = GetBattlerAtPosition(identities[i]); + } while (gMultiUsePlayerCursor == gBattlersCount); - if (gAbsentBattlerFlags & gBitTable[gMultiUsePlayerCursor]) i = 0; - } while (i == 0); + switch (GetBattlerPosition(gMultiUsePlayerCursor)) + { + case B_POSITION_PLAYER_LEFT: + case B_POSITION_PLAYER_RIGHT: + if (gActiveBattler != gMultiUsePlayerCursor) + i++; + else if (gBattleMoves[move].target & MOVE_TARGET_USER_OR_SELECTED) + i++; + break; + case B_POSITION_OPPONENT_LEFT: + case B_POSITION_OPPONENT_RIGHT: + i++; + break; + } + + if (gAbsentBattlerFlags & gBitTable[gMultiUsePlayerCursor]) + i = 0; + } while (i == 0); + } gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCb_ShowAsMoveTarget; } else if (JOY_NEW(DPAD_RIGHT | DPAD_DOWN)) @@ -428,50 +438,68 @@ static void HandleInputChooseTarget(void) PlaySE(SE_SELECT); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCb_HideAsMoveTarget; - do + if (gBattleMoves[move].target == (MOVE_TARGET_USER | MOVE_TARGET_ALLY)) + { + gMultiUsePlayerCursor ^= BIT_FLANK; + } + else { - u8 currSelIdentity = GetBattlerPosition(gMultiUsePlayerCursor); - - for (i = 0; i < MAX_BATTLERS_COUNT; i++) - { - if (currSelIdentity == identities[i]) - break; - } do { - if (++i > 3) - i = 0; - gMultiUsePlayerCursor = GetBattlerAtPosition(identities[i]); - } while (gMultiUsePlayerCursor == gBattlersCount); + u8 currSelIdentity = GetBattlerPosition(gMultiUsePlayerCursor); - i = 0; - switch (GetBattlerPosition(gMultiUsePlayerCursor)) - { - case B_POSITION_PLAYER_LEFT: - case B_POSITION_PLAYER_RIGHT: - if (gActiveBattler != gMultiUsePlayerCursor) - i++; - else if (gBattleMoves[GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + gMoveSelectionCursor[gActiveBattler])].target & MOVE_TARGET_USER_OR_SELECTED) - i++; - break; - case B_POSITION_OPPONENT_LEFT: - case B_POSITION_OPPONENT_RIGHT: - i++; - break; - } + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { + if (currSelIdentity == identities[i]) + break; + } + do + { + if (++i > 3) + i = 0; + gMultiUsePlayerCursor = GetBattlerAtPosition(identities[i]); + } while (gMultiUsePlayerCursor == gBattlersCount); - if (gAbsentBattlerFlags & gBitTable[gMultiUsePlayerCursor]) i = 0; - } while (i == 0); + switch (GetBattlerPosition(gMultiUsePlayerCursor)) + { + case B_POSITION_PLAYER_LEFT: + case B_POSITION_PLAYER_RIGHT: + if (gActiveBattler != gMultiUsePlayerCursor) + i++; + else if (gBattleMoves[move].target & MOVE_TARGET_USER_OR_SELECTED) + i++; + break; + case B_POSITION_OPPONENT_LEFT: + case B_POSITION_OPPONENT_RIGHT: + i++; + break; + } + + if (gAbsentBattlerFlags & gBitTable[gMultiUsePlayerCursor]) + i = 0; + } while (i == 0); + } + gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCb_ShowAsMoveTarget; } } -static void HandleInputChooseMove(void) +static void HideShownTargets(void) { - bool32 canSelectTarget = FALSE; - struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBattler][4]); + s32 i; + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { + if (IsBattlerAlive(i) && gBattleSpritesDataPtr->healthBoxesData[i].healthboxIsBouncing && i != gActiveBattler) + { + gSprites[gBattlerSpriteIds[i]].callback = SpriteCb_HideAsMoveTarget; + EndBounceEffect(i, BOUNCE_HEALTHBOX); + } + } +} +static void HandleInputShowTargets(void) +{ if (JOY_HELD(DPAD_ANY) && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_L_EQUALS_A) gPlayerDpadHoldFrames++; else @@ -479,12 +507,51 @@ static void HandleInputChooseMove(void) if (JOY_NEW(A_BUTTON)) { - u8 moveTarget; + PlaySE(SE_SELECT); + HideShownTargets(); + if (gBattleStruct->mega.playerSelect) + BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | RET_MEGA_EVOLUTION | (gMultiUsePlayerCursor << 8)); + else + BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); + HideMegaTriggerSprite(); + PlayerBufferExecCompleted(); + } + else if (gMain.newKeys & B_BUTTON || gPlayerDpadHoldFrames > 59) + { + PlaySE(SE_SELECT); + HideShownTargets(); + gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseMove; + DoBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX, 7, 1); + DoBounceEffect(gActiveBattler, BOUNCE_MON, 7, 1); + } +} +static void TryShowAsTarget(u32 battlerId) +{ + if (IsBattlerAlive(battlerId)) + { + DoBounceEffect(battlerId, BOUNCE_HEALTHBOX, 15, 1); + gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCb_ShowAsMoveTarget; + } +} + +static void HandleInputChooseMove(void) +{ + u8 moveTarget; + u32 canSelectTarget = 0; + struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleResources->bufferA[gActiveBattler][4]); + + if (gMain.heldKeys & DPAD_ANY && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_L_EQUALS_A) + gPlayerDpadHoldFrames++; + else + gPlayerDpadHoldFrames = 0; + + if (gMain.newKeys & A_BUTTON) + { PlaySE(SE_SELECT); if (moveInfo->moves[gMoveSelectionCursor[gActiveBattler]] == MOVE_CURSE) { - if (moveInfo->monType1 != TYPE_GHOST && moveInfo->monType2 != TYPE_GHOST) + if (moveInfo->monType1 != TYPE_GHOST && moveInfo->monType2 != TYPE_GHOST && moveInfo->monType3 != TYPE_GHOST) moveTarget = MOVE_TARGET_USER; else moveTarget = MOVE_TARGET_SELECTED; @@ -499,33 +566,49 @@ static void HandleInputChooseMove(void) else gMultiUsePlayerCursor = GetBattlerAtPosition((GetBattlerPosition(gActiveBattler) & BIT_SIDE) ^ BIT_SIDE); - if (!gBattleBufferA[gActiveBattler][1]) // not a double battle + if (!gBattleResources->bufferA[gActiveBattler][1]) // not a double battle { - if (moveTarget & MOVE_TARGET_USER_OR_SELECTED && !gBattleBufferA[gActiveBattler][2]) - canSelectTarget++; + if (moveTarget & MOVE_TARGET_USER_OR_SELECTED && !gBattleResources->bufferA[gActiveBattler][2]) + canSelectTarget = 1; } else // double battle { - if (!(moveTarget & (MOVE_TARGET_RANDOM | MOVE_TARGET_BOTH | MOVE_TARGET_DEPENDS | MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_USER))) - canSelectTarget++; // either selected or user + if (!(moveTarget & (MOVE_TARGET_RANDOM | MOVE_TARGET_BOTH | MOVE_TARGET_DEPENDS | MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_USER | MOVE_TARGET_ALLY))) + canSelectTarget = 1; // either selected or user + if (moveTarget == (MOVE_TARGET_USER | MOVE_TARGET_ALLY) && IsBattlerAlive(BATTLE_PARTNER(gActiveBattler))) + canSelectTarget = 1; if (moveInfo->currentPp[gMoveSelectionCursor[gActiveBattler]] == 0) { - canSelectTarget = FALSE; + canSelectTarget = 0; } else if (!(moveTarget & (MOVE_TARGET_USER | MOVE_TARGET_USER_OR_SELECTED)) && CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_ACTIVE) <= 1) { gMultiUsePlayerCursor = GetDefaultMoveTarget(gActiveBattler); - canSelectTarget = FALSE; + canSelectTarget = 0; + } + + // Show all available targets for multi-target moves + if (B_SHOW_TARGETS && moveTarget & (MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY)) + { + TryShowAsTarget(gMultiUsePlayerCursor); + TryShowAsTarget(BATTLE_PARTNER(gMultiUsePlayerCursor)); + if (moveTarget & MOVE_TARGET_FOES_AND_ALLY) + TryShowAsTarget(BATTLE_PARTNER(gActiveBattler)); + canSelectTarget = 2; } } - if (!canSelectTarget) + if (canSelectTarget == 0) { - BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); + if (gBattleStruct->mega.playerSelect) + BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | RET_MEGA_EVOLUTION | (gMultiUsePlayerCursor << 8)); + else + BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); + HideMegaTriggerSprite(); PlayerBufferExecCompleted(); } - else + else if (canSelectTarget == 1) { gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseTarget; @@ -538,11 +621,17 @@ static void HandleInputChooseMove(void) gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCb_ShowAsMoveTarget; } + else + { + gBattlerControllerFuncs[gActiveBattler] = HandleInputShowTargets; + } } else if (JOY_NEW(B_BUTTON) || gPlayerDpadHoldFrames > 59) { PlaySE(SE_SELECT); + gBattleStruct->mega.playerSelect = FALSE; BtlController_EmitTwoReturnValues(1, 10, 0xFFFF); + HideMegaTriggerSprite(); PlayerBufferExecCompleted(); } else if (JOY_NEW(DPAD_LEFT)) @@ -611,6 +700,15 @@ static void HandleInputChooseMove(void) gBattlerControllerFuncs[gActiveBattler] = HandleMoveSwitching; } } + else if (gMain.newKeys & START_BUTTON) + { + if (CanMegaEvolve(gActiveBattler)) + { + gBattleStruct->mega.playerSelect ^= 1; + ChangeMegaTriggerSprite(gBattleStruct->mega.triggerSpriteId, gBattleStruct->mega.playerSelect); + PlaySE(SE_SELECT); + } + } } u32 sub_8057FBC(void) // unused @@ -675,7 +773,7 @@ static void HandleMoveSwitching(void) if (gMoveSelectionCursor[gActiveBattler] != gMultiUsePlayerCursor) { - struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBattler][4]); + struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleResources->bufferA[gActiveBattler][4]); s32 i; // swap moves and pp @@ -976,11 +1074,11 @@ static void sub_8058B40(void) bool32 r9 = FALSE; bool32 r8 = FALSE; - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) TryShinyAnimation(gActiveBattler ^ BIT_FLANK, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]); @@ -1348,7 +1446,7 @@ static void WaitForMonSelection(void) else BtlController_EmitChosenMonReturnValue(1, PARTY_SIZE, NULL); - if ((gBattleBufferA[gActiveBattler][1] & 0xF) == 1) + if ((gBattleResources->bufferA[gActiveBattler][1] & 0xF) == 1) PrintLinkStandbyMsg(); PlayerBufferExecCompleted(); @@ -1439,7 +1537,7 @@ static void PlayerHandleUnknownYesNoInput(void) static void MoveSelectionDisplayMoveNames(void) { s32 i; - struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBattler][4]); + struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleResources->bufferA[gActiveBattler][4]); gNumberOfMovesToChoose = 0; for (i = 0; i < MAX_MON_MOVES; i++) @@ -1463,11 +1561,11 @@ static void MoveSelectionDisplayPpNumber(void) u8 *txtPtr; struct ChooseMoveStruct *moveInfo; - if (gBattleBufferA[gActiveBattler][2] == TRUE) // check if we didn't want to display pp number + if (gBattleResources->bufferA[gActiveBattler][2] == TRUE) // check if we didn't want to display pp number return; SetPpNumbersPaletteInMoveSelection(); - moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBattler][4]); + moveInfo = (struct ChooseMoveStruct*)(&gBattleResources->bufferA[gActiveBattler][4]); txtPtr = ConvertIntToDecimalStringN(gDisplayedStringBattle, moveInfo->currentPp[gMoveSelectionCursor[gActiveBattler]], STR_CONV_MODE_RIGHT_ALIGN, 2); *(txtPtr)++ = CHAR_SLASH; ConvertIntToDecimalStringN(txtPtr, moveInfo->maxPp[gMoveSelectionCursor[gActiveBattler]], STR_CONV_MODE_RIGHT_ALIGN, 2); @@ -1478,7 +1576,7 @@ static void MoveSelectionDisplayPpNumber(void) static void MoveSelectionDisplayMoveType(void) { u8 *txtPtr; - struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBattler][4]); + struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleResources->bufferA[gActiveBattler][4]); txtPtr = StringCopy(gDisplayedStringBattle, gText_MoveInterfaceType); *(txtPtr)++ = EXT_CTRL_CODE_BEGIN; @@ -1568,13 +1666,13 @@ static void PlayerHandleGetMonData(void) u8 monToCheck; s32 i; - if (gBattleBufferA[gActiveBattler][2] == 0) + if (gBattleResources->bufferA[gActiveBattler][2] == 0) { size += CopyPlayerMonData(gBattlerPartyIndexes[gActiveBattler], monData); } else { - monToCheck = gBattleBufferA[gActiveBattler][2]; + monToCheck = gBattleResources->bufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; i++) { if (monToCheck & 1) @@ -1596,7 +1694,7 @@ static u32 CopyPlayerMonData(u8 monId, u8 *dst) u32 data32; s32 size = 0; - switch (gBattleBufferA[gActiveBattler][1]) + switch (gBattleResources->bufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); @@ -1625,7 +1723,6 @@ static u32 CopyPlayerMonData(u8 monId, u8 *dst) battleMon.speed = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED); battleMon.spAttack = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK); battleMon.spDefense = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF); - battleMon.isEgg = GetMonData(&gPlayerParty[monId], MON_DATA_IS_EGG); battleMon.abilityNum = GetMonData(&gPlayerParty[monId], MON_DATA_ABILITY_NUM); battleMon.otId = GetMonData(&gPlayerParty[monId], MON_DATA_OT_ID); GetMonData(&gPlayerParty[monId], MON_DATA_NICKNAME, nickname); @@ -1662,7 +1759,7 @@ static u32 CopyPlayerMonData(u8 monId, u8 *dst) case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE); + data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE); dst[0] = data16; dst[1] = data16 >> 8; size = 2; @@ -1677,7 +1774,7 @@ static u32 CopyPlayerMonData(u8 monId, u8 *dst) case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE); size = 1; break; case REQUEST_OTID_BATTLE: @@ -1895,14 +1992,14 @@ static u32 CopyPlayerMonData(u8 monId, u8 *dst) void PlayerHandleGetRawMonData(void) { struct BattlePokemon battleMon; - u8 *src = (u8 *)&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1]; - u8 *dst = (u8 *)&battleMon + gBattleBufferA[gActiveBattler][1]; + u8 *src = (u8 *)&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleResources->bufferA[gActiveBattler][1]; + u8 *dst = (u8 *)&battleMon + gBattleResources->bufferA[gActiveBattler][1]; u8 i; - for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++) + for (i = 0; i < gBattleResources->bufferA[gActiveBattler][2]; i++) dst[i] = src[i]; - BtlController_EmitDataTransfer(1, gBattleBufferA[gActiveBattler][2], dst); + BtlController_EmitDataTransfer(1, gBattleResources->bufferA[gActiveBattler][2], dst); PlayerBufferExecCompleted(); } @@ -1911,13 +2008,13 @@ static void PlayerHandleSetMonData(void) u8 monToCheck; u8 i; - if (gBattleBufferA[gActiveBattler][2] == 0) + if (gBattleResources->bufferA[gActiveBattler][2] == 0) { SetPlayerMonData(gBattlerPartyIndexes[gActiveBattler]); } else { - monToCheck = gBattleBufferA[gActiveBattler][2]; + monToCheck = gBattleResources->bufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; i++) { if (monToCheck & 1) @@ -1930,11 +2027,11 @@ static void PlayerHandleSetMonData(void) static void SetPlayerMonData(u8 monId) { - struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3]; - struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3]; + struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleResources->bufferA[gActiveBattler][3]; + struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleResources->bufferA[gActiveBattler][3]; s32 i; - switch (gBattleBufferA[gActiveBattler][1]) + switch (gBattleResources->bufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: { @@ -1975,10 +2072,10 @@ static void SetPlayerMonData(u8 monId) } break; case REQUEST_SPECIES_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_HELDITEM_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: for (i = 0; i < MAX_MON_MOVES; i++) @@ -1992,154 +2089,154 @@ static void SetPlayerMonData(u8 monId) case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_PP_DATA_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleResources->bufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleResources->bufferA[gActiveBattler][4]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleResources->bufferA[gActiveBattler][5]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleResources->bufferA[gActiveBattler][6]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleResources->bufferA[gActiveBattler][7]); break; case REQUEST_PPMOVE1_BATTLE: case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_OTID_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_EXP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_HP_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ATK_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_DEF_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPEED_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPATK_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_FRIENDSHIP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_POKERUS_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MET_LOCATION_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MET_LEVEL_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MET_GAME_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_POKEBALL_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ALL_IVS_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]); - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]); + SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleResources->bufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleResources->bufferA[gActiveBattler][4]); + SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleResources->bufferA[gActiveBattler][5]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleResources->bufferA[gActiveBattler][6]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleResources->bufferA[gActiveBattler][7]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleResources->bufferA[gActiveBattler][8]); break; case REQUEST_HP_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ATK_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_DEF_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPEED_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPATK_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_PERSONALITY_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_LEVEL_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_HP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MAX_HP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ATK_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_DEF_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPEED_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPATK_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_COOL_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_CUTE_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SMART_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SHEEN_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_COOL_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_CUTE_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SMART_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; } @@ -2148,11 +2245,11 @@ static void SetPlayerMonData(u8 monId) static void PlayerHandleSetRawMonData(void) { - u8 *dst = (u8 *)&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1]; + u8 *dst = (u8 *)&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleResources->bufferA[gActiveBattler][1]; u8 i; - for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++) - dst[i] = gBattleBufferA[gActiveBattler][3 + i]; + for (i = 0; i < gBattleResources->bufferA[gActiveBattler][2]; i++) + dst[i] = gBattleResources->bufferA[gActiveBattler][3 + i]; PlayerBufferExecCompleted(); } @@ -2166,12 +2263,12 @@ static void PlayerHandleLoadMonSprite(void) static void PlayerHandleSwitchInAnim(void) { - ClearTemporarySpeciesSpriteData(gActiveBattler, gBattleBufferA[gActiveBattler][2]); - gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1]; + ClearTemporarySpeciesSpriteData(gActiveBattler, gBattleResources->bufferA[gActiveBattler][2]); + gBattlerPartyIndexes[gActiveBattler] = gBattleResources->bufferA[gActiveBattler][1]; BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); gActionSelectionCursor[gActiveBattler] = 0; gMoveSelectionCursor[gActiveBattler] = 0; - sub_805B258(gActiveBattler, gBattleBufferA[gActiveBattler][2]); + sub_805B258(gActiveBattler, gBattleResources->bufferA[gActiveBattler][2]); gBattlerControllerFuncs[gActiveBattler] = sub_805902C; } @@ -2180,7 +2277,7 @@ static void sub_805B258(u8 battlerId, bool8 dontClearSubstituteBit) u16 species; ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit); - gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; + gBattlerPartyIndexes[battlerId] = gBattleResources->bufferA[battlerId][1]; species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); @@ -2208,7 +2305,7 @@ static void sub_805B258(u8 battlerId, bool8 dontClearSubstituteBit) static void PlayerHandleReturnMonToBall(void) { - if (gBattleBufferA[gActiveBattler][1] == 0) + if (gBattleResources->bufferA[gActiveBattler][1] == 0) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation; @@ -2280,7 +2377,7 @@ static void PlayerHandleDrawTrainerPic(void) else // First mon, on the left. xPos = 32; - if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId != TRAINER_STEVEN_PARTNER) + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId != TRAINER_STEVEN_PARTNER && gPartnerTrainerId < TRAINER_CUSTOM_PARTNER) { xPos = 90; yPos = (8 - gTrainerFrontPicCoords[trainerPicId].size) * 4 + 80; @@ -2298,7 +2395,7 @@ static void PlayerHandleDrawTrainerPic(void) } // Use front pic table for any tag battles unless your partner is Steven. - if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId != TRAINER_STEVEN_PARTNER) + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId != TRAINER_STEVEN_PARTNER && gPartnerTrainerId < TRAINER_CUSTOM_PARTNER) { trainerPicId = PlayerGenderToFrontTrainerPicId(gSaveBlock2Ptr->playerGender); DecompressTrainerFrontPic(trainerPicId, gActiveBattler); @@ -2412,23 +2509,31 @@ static void PlayerHandleSuccessBallThrowAnim(void) { gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS; gDoingBattleAnim = TRUE; - InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW); + if (IsCriticalCapture()) + InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gBattlerTarget, B_ANIM_CRITICAL_CAPTURE_THROW); + else + InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gBattlerTarget, B_ANIM_BALL_THROW); + gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone; } static void PlayerHandleBallThrowAnim(void) { - u8 ballThrowCaseId = gBattleBufferA[gActiveBattler][1]; + u8 ballThrowCaseId = gBattleResources->bufferA[gActiveBattler][1]; gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId; gDoingBattleAnim = TRUE; - InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW); + if (IsCriticalCapture()) + InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gBattlerTarget, B_ANIM_CRITICAL_CAPTURE_THROW); + else + InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gBattlerTarget, B_ANIM_BALL_THROW); + gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone; } static void PlayerHandlePause(void) { - u8 var = gBattleBufferA[gActiveBattler][1]; + u8 var = gBattleResources->bufferA[gActiveBattler][1]; // WTF is this?? while (var != 0) @@ -2441,14 +2546,14 @@ static void PlayerHandleMoveAnimation(void) { if (!mplay_80342A4(gActiveBattler)) { - u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); + u16 move = gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8); - gAnimMoveTurn = gBattleBufferA[gActiveBattler][3]; - gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8); - gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24); - gAnimFriendship = gBattleBufferA[gActiveBattler][10]; - gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8); - gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16]; + gAnimMoveTurn = gBattleResources->bufferA[gActiveBattler][3]; + gAnimMovePower = gBattleResources->bufferA[gActiveBattler][4] | (gBattleResources->bufferA[gActiveBattler][5] << 8); + gAnimMoveDmg = gBattleResources->bufferA[gActiveBattler][6] | (gBattleResources->bufferA[gActiveBattler][7] << 8) | (gBattleResources->bufferA[gActiveBattler][8] << 16) | (gBattleResources->bufferA[gActiveBattler][9] << 24); + gAnimFriendship = gBattleResources->bufferA[gActiveBattler][10]; + gWeatherMoveAnim = gBattleResources->bufferA[gActiveBattler][12] | (gBattleResources->bufferA[gActiveBattler][13] << 8); + gAnimDisableStructPtr = (struct DisableStruct *)&gBattleResources->bufferA[gActiveBattler][16]; gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality; if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // Always returns FALSE. { @@ -2465,8 +2570,8 @@ static void PlayerHandleMoveAnimation(void) static void PlayerDoMoveAnimation(void) { - u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); - u8 multihit = gBattleBufferA[gActiveBattler][11]; + u16 move = gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8); + u8 multihit = gBattleResources->bufferA[gActiveBattler][11]; switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState) { @@ -2504,7 +2609,7 @@ static void PlayerDoMoveAnimation(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { CopyAllBattleSpritesInvisibilities(); - TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; PlayerBufferExecCompleted(); } @@ -2518,7 +2623,7 @@ static void PlayerHandlePrintString(void) gBattle_BG0_X = 0; gBattle_BG0_Y = 0; - stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]); + stringId = (u16*)(&gBattleResources->bufferA[gActiveBattler][2]); BufferStringBattle(*stringId); BattlePutTextOnWindow(gDisplayedStringBattle, 0); gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter2; @@ -2608,6 +2713,11 @@ static void PlayerHandleChooseMove(void) else { InitMoveSelectionsVarsAndStrings(); + gBattleStruct->mega.playerSelect = FALSE; + if (!IsMegaTriggerSpriteActive()) + gBattleStruct->mega.triggerSpriteId = 0xFF; + if (CanMegaEvolve(gActiveBattler)) + CreateMegaTriggerSprite(gActiveBattler, 0); gBattlerControllerFuncs[gActiveBattler] = HandleChooseMoveAfterDma3; } } @@ -2630,18 +2740,18 @@ static void PlayerHandleChooseItem(void) gBattlerControllerFuncs[gActiveBattler] = OpenBagAndChooseItem; gBattlerInMenuId = gActiveBattler; - for (i = 0; i < (int)ARRAY_COUNT(gBattlePartyCurrentOrder); i++) - gBattlePartyCurrentOrder[i] = gBattleBufferA[gActiveBattler][1 + i]; + for (i = 0; i < ARRAY_COUNT(gBattlePartyCurrentOrder); i++) + gBattlePartyCurrentOrder[i] = gBattleResources->bufferA[gActiveBattler][1 + i]; } static void PlayerHandleChoosePokemon(void) { s32 i; - for (i = 0; i < (int)ARRAY_COUNT(gBattlePartyCurrentOrder); i++) - gBattlePartyCurrentOrder[i] = gBattleBufferA[gActiveBattler][4 + i]; + for (i = 0; i < ARRAY_COUNT(gBattlePartyCurrentOrder); i++) + gBattlePartyCurrentOrder[i] = gBattleResources->bufferA[gActiveBattler][4 + i]; - if (gBattleTypeFlags & BATTLE_TYPE_ARENA && (gBattleBufferA[gActiveBattler][1] & 0xF) != PARTY_ACTION_CANT_SWITCH) + if (gBattleTypeFlags & BATTLE_TYPE_ARENA && (gBattleResources->bufferA[gActiveBattler][1] & 0xF) != PARTY_ACTION_CANT_SWITCH) { BtlController_EmitChosenMonReturnValue(1, gBattlerPartyIndexes[gActiveBattler] + 1, gBattlePartyCurrentOrder); PlayerBufferExecCompleted(); @@ -2649,10 +2759,10 @@ static void PlayerHandleChoosePokemon(void) else { gUnknown_03005D7C[gActiveBattler] = CreateTask(TaskDummy, 0xFF); - gTasks[gUnknown_03005D7C[gActiveBattler]].data[0] = gBattleBufferA[gActiveBattler][1] & 0xF; - *(&gBattleStruct->battlerPreventingSwitchout) = gBattleBufferA[gActiveBattler][1] >> 4; - *(&gBattleStruct->field_8B) = gBattleBufferA[gActiveBattler][2]; - *(&gBattleStruct->abilityPreventingSwitchout) = gBattleBufferA[gActiveBattler][3]; + gTasks[gUnknown_03005D7C[gActiveBattler]].data[0] = gBattleResources->bufferA[gActiveBattler][1] & 0xF; + *(&gBattleStruct->battlerPreventingSwitchout) = gBattleResources->bufferA[gActiveBattler][1] >> 4; + *(&gBattleStruct->field_8B) = gBattleResources->bufferA[gActiveBattler][2]; + *(&gBattleStruct->abilityPreventingSwitchout) = gBattleResources->bufferA[gActiveBattler][3]; BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); gBattlerControllerFuncs[gActiveBattler] = OpenPartyMenuToChooseMon; gBattlerInMenuId = gActiveBattler; @@ -2671,7 +2781,7 @@ static void PlayerHandleHealthBarUpdate(void) s16 hpVal; LoadBattleBarGfx(0); - hpVal = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); + hpVal = gBattleResources->bufferA[gActiveBattler][2] | (gBattleResources->bufferA[gActiveBattler][3] << 8); // gPlayerPartyLostHP used by Battle Dome, but never read if (hpVal > 0) @@ -2697,7 +2807,7 @@ static void PlayerHandleHealthBarUpdate(void) static void PlayerHandleExpUpdate(void) { - u8 monId = gBattleBufferA[gActiveBattler][1]; + u8 monId = gBattleResources->bufferA[gActiveBattler][1]; if (GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL) >= MAX_LEVEL) { @@ -2710,7 +2820,7 @@ static void PlayerHandleExpUpdate(void) LoadBattleBarGfx(1); GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); // Unused return value. - expPointsToGive = T1_READ_16(&gBattleBufferA[gActiveBattler][2]); + expPointsToGive = T1_READ_16(&gBattleResources->bufferA[gActiveBattler][2]); taskId = CreateTask(Task_GiveExpToMon, 10); gTasks[taskId].tExpTask_monId = monId; gTasks[taskId].tExpTask_gainedExp = expPointsToGive; @@ -2741,15 +2851,15 @@ static void PlayerHandleStatusAnimation(void) { if (!mplay_80342A4(gActiveBattler)) { - InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1], - gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24)); + InitAndLaunchChosenStatusAnimation(gBattleResources->bufferA[gActiveBattler][1], + gBattleResources->bufferA[gActiveBattler][2] | (gBattleResources->bufferA[gActiveBattler][3] << 8) | (gBattleResources->bufferA[gActiveBattler][4] << 16) | (gBattleResources->bufferA[gActiveBattler][5] << 24)); gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; } } static void PlayerHandleStatusXor(void) { - u8 val = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_STATUS) ^ gBattleBufferA[gActiveBattler][1]; + u8 val = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_STATUS) ^ gBattleResources->bufferA[gActiveBattler][1]; SetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_STATUS, &val); PlayerBufferExecCompleted(); @@ -2762,13 +2872,13 @@ static void PlayerHandleDataTransfer(void) static void PlayerHandleDMA3Transfer(void) { - u32 dstArg = gBattleBufferA[gActiveBattler][1] - | (gBattleBufferA[gActiveBattler][2] << 8) - | (gBattleBufferA[gActiveBattler][3] << 16) - | (gBattleBufferA[gActiveBattler][4] << 24); - u16 sizeArg = gBattleBufferA[gActiveBattler][5] | (gBattleBufferA[gActiveBattler][6] << 8); + u32 dstArg = gBattleResources->bufferA[gActiveBattler][1] + | (gBattleResources->bufferA[gActiveBattler][2] << 8) + | (gBattleResources->bufferA[gActiveBattler][3] << 16) + | (gBattleResources->bufferA[gActiveBattler][4] << 24); + u16 sizeArg = gBattleResources->bufferA[gActiveBattler][5] | (gBattleResources->bufferA[gActiveBattler][6] << 8); - const u8 *src = &gBattleBufferA[gActiveBattler][7]; + const u8 *src = &gBattleResources->bufferA[gActiveBattler][7]; u8 *dst = (u8*)(dstArg); u32 size = sizeArg; @@ -2789,7 +2899,7 @@ static void PlayerHandleDMA3Transfer(void) static void PlayerHandlePlayBGM(void) { - PlayBGM(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + PlayBGM(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); PlayerBufferExecCompleted(); } @@ -2830,7 +2940,7 @@ static void PlayerHandleCmd37(void) static void PlayerHandleCmd38(void) { - gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBattler][1]; + gUnknown_02022D0C.field_0 = gBattleResources->bufferA[gActiveBattler][1]; PlayerBufferExecCompleted(); } @@ -2875,20 +2985,20 @@ static void PlayerHandlePlaySE(void) else pan = SOUND_PAN_TARGET; - PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan); + PlaySE12WithPanning(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8), pan); PlayerBufferExecCompleted(); } static void PlayerHandlePlayFanfareOrBGM(void) { - if (gBattleBufferA[gActiveBattler][3]) + if (gBattleResources->bufferA[gActiveBattler][3]) { BattleStopLowHpSound(); - PlayBGM(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + PlayBGM(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); } else { - PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + PlayFanfare(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); } PlayerBufferExecCompleted(); @@ -2904,7 +3014,7 @@ static void PlayerHandleFaintingCry(void) static void PlayerHandleIntroSlide(void) { - HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); + HandleIntroSlide(gBattleResources->bufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; PlayerBufferExecCompleted(); } @@ -2963,15 +3073,15 @@ static void task05_08033660(u8 taskId) gActiveBattler = gTasks[taskId].data[0]; if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) { - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + gBattleResources->bufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; sub_805B258(gActiveBattler, FALSE); } else { - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + gBattleResources->bufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; sub_805B258(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + gBattleResources->bufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); sub_805B258(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; @@ -2984,17 +3094,17 @@ static void task05_08033660(u8 taskId) static void PlayerHandleDrawPartyStatusSummary(void) { - if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) + if (gBattleResources->bufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { PlayerBufferExecCompleted(); } else { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = 1; - gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]); + gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleResources->bufferA[gActiveBattler][4], gBattleResources->bufferA[gActiveBattler][1], gBattleResources->bufferA[gActiveBattler][2]); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0; - if (gBattleBufferA[gActiveBattler][2] != 0) + if (gBattleResources->bufferA[gActiveBattler][2] != 0) gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0x5D; gBattlerControllerFuncs[gActiveBattler] = sub_805CE38; @@ -3028,7 +3138,7 @@ static void PlayerHandleSpriteInvisibility(void) { if (IsBattlerSpritePresent(gActiveBattler)) { - gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1]; + gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleResources->bufferA[gActiveBattler][1]; CopyBattleSpriteInvisibility(gActiveBattler); } PlayerBufferExecCompleted(); @@ -3038,8 +3148,8 @@ static void PlayerHandleBattleAnimation(void) { if (!mplay_80342A4(gActiveBattler)) { - u8 animationId = gBattleBufferA[gActiveBattler][1]; - u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); + u8 animationId = gBattleResources->bufferA[gActiveBattler][1]; + u16 argument = gBattleResources->bufferA[gActiveBattler][2] | (gBattleResources->bufferA[gActiveBattler][3] << 8); if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument)) PlayerBufferExecCompleted(); @@ -3052,8 +3162,8 @@ static void PlayerHandleBattleAnimation(void) static void PlayerHandleLinkStandbyMsg(void) { - sub_81851A8(&gBattleBufferA[gActiveBattler][2]); - switch (gBattleBufferA[gActiveBattler][1]) + sub_81851A8(&gBattleResources->bufferA[gActiveBattler][2]); + switch (gBattleResources->bufferA[gActiveBattler][1]) { case 0: PrintLinkStandbyMsg(); @@ -3071,7 +3181,7 @@ static void PlayerHandleLinkStandbyMsg(void) static void PlayerHandleResetActionMoveSelection(void) { - switch (gBattleBufferA[gActiveBattler][1]) + switch (gBattleResources->bufferA[gActiveBattler][1]) { case RESET_ACTION_MOVE_SELECTION: gActionSelectionCursor[gActiveBattler] = 0; @@ -3089,15 +3199,30 @@ static void PlayerHandleResetActionMoveSelection(void) static void PlayerHandleCmd55(void) { - sub_81851A8(&gBattleBufferA[gActiveBattler][4]); - gBattleOutcome = gBattleBufferA[gActiveBattler][1]; - gSaveBlock2Ptr->frontier.disableRecordBattle = gBattleBufferA[gActiveBattler][2]; + sub_81851A8(&gBattleResources->bufferA[gActiveBattler][4]); + gBattleOutcome = gBattleResources->bufferA[gActiveBattler][1]; + gSaveBlock2Ptr->frontier.disableRecordBattle = gBattleResources->bufferA[gActiveBattler][2]; FadeOutMapMusic(5); BeginFastPaletteFade(3); PlayerBufferExecCompleted(); gBattlerControllerFuncs[gActiveBattler] = sub_80587B0; } +static void WaitForDebug(void) +{ + if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) + { + PlayerBufferExecCompleted(); + } +} + +static void PlayerHandleBattleDebug(void) +{ + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + SetMainCallback2(CB2_BattleDebugMenu); + gBattlerControllerFuncs[gActiveBattler] = WaitForDebug; +} + static void PlayerCmdEnd(void) { } diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index af6b739ccf..9743e92e00 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -84,6 +84,7 @@ static void PlayerPartnerHandleBattleAnimation(void); static void PlayerPartnerHandleLinkStandbyMsg(void); static void PlayerPartnerHandleResetActionMoveSelection(void); static void PlayerPartnerHandleCmd55(void); +static void PlayerPartnerHandleBattleDebug(void); static void PlayerPartnerCmdEnd(void); static void PlayerPartnerBufferRunCommand(void); @@ -161,6 +162,7 @@ static void (*const sPlayerPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(void) = PlayerPartnerHandleLinkStandbyMsg, PlayerPartnerHandleResetActionMoveSelection, PlayerPartnerHandleCmd55, + PlayerPartnerHandleBattleDebug, PlayerPartnerCmdEnd }; @@ -186,8 +188,8 @@ static void PlayerPartnerBufferRunCommand(void) { if (gBattleControllerExecFlags & gBitTable[gActiveBattler]) { - if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sPlayerPartnerBufferCommands)) - sPlayerPartnerBufferCommands[gBattleBufferA[gActiveBattler][0]](); + if (gBattleResources->bufferA[gActiveBattler][0] < ARRAY_COUNT(sPlayerPartnerBufferCommands)) + sPlayerPartnerBufferCommands[gBattleResources->bufferA[gActiveBattler][0]](); else PlayerPartnerBufferExecCompleted(); } @@ -587,7 +589,7 @@ static void PlayerPartnerBufferExecCompleted(void) u8 playerId = GetMultiplayerId(); PrepareBufferDataTransferLink(2, 4, &playerId); - gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; + gBattleResources->bufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else { @@ -614,13 +616,13 @@ static void PlayerPartnerHandleGetMonData(void) u8 monToCheck; s32 i; - if (gBattleBufferA[gActiveBattler][2] == 0) + if (gBattleResources->bufferA[gActiveBattler][2] == 0) { size += CopyPlayerPartnerMonData(gBattlerPartyIndexes[gActiveBattler], monData); } else { - monToCheck = gBattleBufferA[gActiveBattler][2]; + monToCheck = gBattleResources->bufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; i++) { if (monToCheck & 1) @@ -642,7 +644,7 @@ static u32 CopyPlayerPartnerMonData(u8 monId, u8 *dst) u32 data32; s32 size = 0; - switch (gBattleBufferA[gActiveBattler][1]) + switch (gBattleResources->bufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); @@ -671,7 +673,6 @@ static u32 CopyPlayerPartnerMonData(u8 monId, u8 *dst) battleMon.speed = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED); battleMon.spAttack = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK); battleMon.spDefense = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF); - battleMon.isEgg = GetMonData(&gPlayerParty[monId], MON_DATA_IS_EGG); battleMon.abilityNum = GetMonData(&gPlayerParty[monId], MON_DATA_ABILITY_NUM); battleMon.otId = GetMonData(&gPlayerParty[monId], MON_DATA_OT_ID); GetMonData(&gPlayerParty[monId], MON_DATA_NICKNAME, nickname); @@ -708,7 +709,7 @@ static u32 CopyPlayerPartnerMonData(u8 monId, u8 *dst) case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE); + data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE); dst[0] = data16; dst[1] = data16 >> 8; size = 2; @@ -723,7 +724,7 @@ static u32 CopyPlayerPartnerMonData(u8 monId, u8 *dst) case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE); size = 1; break; case REQUEST_OTID_BATTLE: @@ -948,13 +949,13 @@ static void PlayerPartnerHandleSetMonData(void) u8 monToCheck; u8 i; - if (gBattleBufferA[gActiveBattler][2] == 0) + if (gBattleResources->bufferA[gActiveBattler][2] == 0) { SetPlayerPartnerMonData(gBattlerPartyIndexes[gActiveBattler]); } else { - monToCheck = gBattleBufferA[gActiveBattler][2]; + monToCheck = gBattleResources->bufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; i++) { if (monToCheck & 1) @@ -967,11 +968,11 @@ static void PlayerPartnerHandleSetMonData(void) static void SetPlayerPartnerMonData(u8 monId) { - struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3]; - struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3]; + struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleResources->bufferA[gActiveBattler][3]; + struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleResources->bufferA[gActiveBattler][3]; s32 i; - switch (gBattleBufferA[gActiveBattler][1]) + switch (gBattleResources->bufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: { @@ -1012,10 +1013,10 @@ static void SetPlayerPartnerMonData(u8 monId) } break; case REQUEST_SPECIES_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_HELDITEM_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: for (i = 0; i < MAX_MON_MOVES; i++) @@ -1029,154 +1030,154 @@ static void SetPlayerPartnerMonData(u8 monId) case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_PP_DATA_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleResources->bufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleResources->bufferA[gActiveBattler][4]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleResources->bufferA[gActiveBattler][5]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleResources->bufferA[gActiveBattler][6]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleResources->bufferA[gActiveBattler][7]); break; case REQUEST_PPMOVE1_BATTLE: case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_OTID_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_EXP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_HP_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ATK_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_DEF_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPEED_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPATK_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_FRIENDSHIP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_POKERUS_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MET_LOCATION_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MET_LEVEL_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MET_GAME_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_POKEBALL_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ALL_IVS_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]); - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]); + SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleResources->bufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleResources->bufferA[gActiveBattler][4]); + SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleResources->bufferA[gActiveBattler][5]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleResources->bufferA[gActiveBattler][6]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleResources->bufferA[gActiveBattler][7]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleResources->bufferA[gActiveBattler][8]); break; case REQUEST_HP_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ATK_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_DEF_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPEED_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPATK_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_PERSONALITY_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_LEVEL_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_HP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MAX_HP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ATK_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_DEF_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPEED_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPATK_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_COOL_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_CUTE_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SMART_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SHEEN_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_COOL_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_CUTE_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SMART_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; } @@ -1185,11 +1186,11 @@ static void SetPlayerPartnerMonData(u8 monId) static void PlayerPartnerHandleSetRawMonData(void) { - u8 *dst = (u8 *)&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1]; + u8 *dst = (u8 *)&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleResources->bufferA[gActiveBattler][1]; u8 i; - for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++) - dst[i] = gBattleBufferA[gActiveBattler][3 + i]; + for (i = 0; i < gBattleResources->bufferA[gActiveBattler][2]; i++) + dst[i] = gBattleResources->bufferA[gActiveBattler][3 + i]; PlayerPartnerBufferExecCompleted(); } @@ -1215,10 +1216,10 @@ static void PlayerPartnerHandleLoadMonSprite(void) static void PlayerPartnerHandleSwitchInAnim(void) { - ClearTemporarySpeciesSpriteData(gActiveBattler, gBattleBufferA[gActiveBattler][2]); - gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1]; + ClearTemporarySpeciesSpriteData(gActiveBattler, gBattleResources->bufferA[gActiveBattler][2]); + gBattlerPartyIndexes[gActiveBattler] = gBattleResources->bufferA[gActiveBattler][1]; BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - sub_81BD0E4(gActiveBattler, gBattleBufferA[gActiveBattler][2]); + sub_81BD0E4(gActiveBattler, gBattleResources->bufferA[gActiveBattler][2]); gBattlerControllerFuncs[gActiveBattler] = sub_81BBAE8; } @@ -1227,7 +1228,7 @@ static void sub_81BD0E4(u8 battlerId, bool8 dontClearSubstituteBit) u16 species; ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit); - gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; + gBattlerPartyIndexes[battlerId] = gBattleResources->bufferA[battlerId][1]; species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); @@ -1255,7 +1256,7 @@ static void sub_81BD0E4(u8 battlerId, bool8 dontClearSubstituteBit) static void PlayerPartnerHandleReturnMonToBall(void) { - if (gBattleBufferA[gActiveBattler][1] == 0) + if (gBattleResources->bufferA[gActiveBattler][1] == 0) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation; @@ -1304,6 +1305,12 @@ static void PlayerPartnerHandleDrawTrainerPic(void) xPos = 90; yPos = (8 - gTrainerBackPicCoords[trainerPicId].size) * 4 + 80; } + else if (gPartnerTrainerId >= TRAINER_CUSTOM_PARTNER) + { + trainerPicId = gPartnerSpriteId; + xPos = 90; + yPos = (8 - gTrainerBackPicCoords[trainerPicId].size) * 4 + 80; + } else { trainerPicId = GetFrontierTrainerFrontSpriteId(gPartnerTrainerId); @@ -1312,7 +1319,7 @@ static void PlayerPartnerHandleDrawTrainerPic(void) } // Use back pic only if the partner is Steven - if (gPartnerTrainerId == TRAINER_STEVEN_PARTNER) + if (gPartnerTrainerId == TRAINER_STEVEN_PARTNER || gPartnerTrainerId >= TRAINER_CUSTOM_PARTNER) { DecompressTrainerBackPic(trainerPicId, gActiveBattler); SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler)); @@ -1404,14 +1411,14 @@ static void PlayerPartnerHandleMoveAnimation(void) { if (!mplay_80342A4(gActiveBattler)) { - u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); + u16 move = gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8); - gAnimMoveTurn = gBattleBufferA[gActiveBattler][3]; - gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8); - gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24); - gAnimFriendship = gBattleBufferA[gActiveBattler][10]; - gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8); - gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16]; + gAnimMoveTurn = gBattleResources->bufferA[gActiveBattler][3]; + gAnimMovePower = gBattleResources->bufferA[gActiveBattler][4] | (gBattleResources->bufferA[gActiveBattler][5] << 8); + gAnimMoveDmg = gBattleResources->bufferA[gActiveBattler][6] | (gBattleResources->bufferA[gActiveBattler][7] << 8) | (gBattleResources->bufferA[gActiveBattler][8] << 16) | (gBattleResources->bufferA[gActiveBattler][9] << 24); + gAnimFriendship = gBattleResources->bufferA[gActiveBattler][10]; + gWeatherMoveAnim = gBattleResources->bufferA[gActiveBattler][12] | (gBattleResources->bufferA[gActiveBattler][13] << 8); + gAnimDisableStructPtr = (struct DisableStruct *)&gBattleResources->bufferA[gActiveBattler][16]; gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality; if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE { @@ -1427,8 +1434,8 @@ static void PlayerPartnerHandleMoveAnimation(void) static void PlayerPartnerDoMoveAnimation(void) { - u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); - u8 multihit = gBattleBufferA[gActiveBattler][11]; + u16 move = gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8); + u8 multihit = gBattleResources->bufferA[gActiveBattler][11]; switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState) { @@ -1466,7 +1473,7 @@ static void PlayerPartnerDoMoveAnimation(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { CopyAllBattleSpritesInvisibilities(); - TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; PlayerPartnerBufferExecCompleted(); } @@ -1480,7 +1487,7 @@ static void PlayerPartnerHandlePrintString(void) gBattle_BG0_X = 0; gBattle_BG0_Y = 0; - stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]); + stringId = (u16*)(&gBattleResources->bufferA[gActiveBattler][2]); BufferStringBattle(*stringId); BattlePutTextOnWindow(gDisplayedStringBattle, 0); gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter2; @@ -1505,7 +1512,7 @@ static void PlayerPartnerHandleUnknownYesNoBox(void) static void PlayerPartnerHandleChooseMove(void) { u8 chosenMoveId; - struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBattler][4]); + struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleResources->bufferA[gActiveBattler][4]); BattleAI_SetupAIData(0xF); chosenMoveId = BattleAI_ChooseMoveOrAction(); @@ -1563,7 +1570,7 @@ static void PlayerPartnerHandleHealthBarUpdate(void) s16 hpVal; LoadBattleBarGfx(0); - hpVal = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); + hpVal = gBattleResources->bufferA[gActiveBattler][2] | (gBattleResources->bufferA[gActiveBattler][3] << 8); if (hpVal != INSTANT_HP_BAR_DROP) { @@ -1584,7 +1591,7 @@ static void PlayerPartnerHandleHealthBarUpdate(void) static void PlayerPartnerHandleExpUpdate(void) { - u8 monId = gBattleBufferA[gActiveBattler][1]; + u8 monId = gBattleResources->bufferA[gActiveBattler][1]; if (GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL) >= MAX_LEVEL) { @@ -1597,7 +1604,7 @@ static void PlayerPartnerHandleExpUpdate(void) LoadBattleBarGfx(1); GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); // unused return value - expPointsToGive = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); + expPointsToGive = gBattleResources->bufferA[gActiveBattler][2] | (gBattleResources->bufferA[gActiveBattler][3] << 8); taskId = CreateTask(Task_GiveExpToMon, 10); gTasks[taskId].tExpTask_monId = monId; gTasks[taskId].tExpTask_gainedExp = expPointsToGive; @@ -1628,8 +1635,8 @@ static void PlayerPartnerHandleStatusAnimation(void) { if (!mplay_80342A4(gActiveBattler)) { - InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1], - gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24)); + InitAndLaunchChosenStatusAnimation(gBattleResources->bufferA[gActiveBattler][1], + gBattleResources->bufferA[gActiveBattler][2] | (gBattleResources->bufferA[gActiveBattler][3] << 8) | (gBattleResources->bufferA[gActiveBattler][4] << 16) | (gBattleResources->bufferA[gActiveBattler][5] << 24)); gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; } } @@ -1687,7 +1694,7 @@ static void PlayerPartnerHandleCmd37(void) static void PlayerPartnerHandleCmd38(void) { - gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBattler][1]; + gUnknown_02022D0C.field_0 = gBattleResources->bufferA[gActiveBattler][1]; PlayerPartnerBufferExecCompleted(); } @@ -1732,20 +1739,20 @@ static void PlayerPartnerHandlePlaySE(void) else pan = SOUND_PAN_TARGET; - PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan); + PlaySE12WithPanning(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8), pan); PlayerPartnerBufferExecCompleted(); } static void PlayerPartnerHandlePlayFanfareOrBGM(void) { - if (gBattleBufferA[gActiveBattler][3]) + if (gBattleResources->bufferA[gActiveBattler][3]) { BattleStopLowHpSound(); - PlayBGM(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + PlayBGM(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); } else { - PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + PlayFanfare(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); } PlayerPartnerBufferExecCompleted(); @@ -1761,7 +1768,7 @@ static void PlayerPartnerHandleFaintingCry(void) static void PlayerPartnerHandleIntroSlide(void) { - HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); + HandleIntroSlide(gBattleResources->bufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; PlayerPartnerBufferExecCompleted(); } @@ -1788,6 +1795,11 @@ static void PlayerPartnerHandleIntroTrainerBallThrow(void) u8 spriteId = TRAINER_BACK_PIC_STEVEN; LoadCompressedPalette(gTrainerBackPicPaletteTable[spriteId].data, 0x100 + paletteNum * 16, 32); } + else if (gPartnerTrainerId >= TRAINER_CUSTOM_PARTNER) + { + u8 spriteId = gPartnerSpriteId; + LoadCompressedPalette(gTrainerBackPicPaletteTable[spriteId].data, 0x100 + paletteNum * 16, 32); + } else { u8 spriteId = GetFrontierTrainerFrontSpriteId(gPartnerTrainerId); @@ -1820,15 +1832,15 @@ static void sub_81BE2C8(u8 taskId) gActiveBattler = gTasks[taskId].data[0]; if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) { - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + gBattleResources->bufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; sub_81BD0E4(gActiveBattler, FALSE); } else { - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + gBattleResources->bufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; sub_81BD0E4(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + gBattleResources->bufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); sub_81BD0E4(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; @@ -1841,17 +1853,17 @@ static void sub_81BE2C8(u8 taskId) static void PlayerPartnerHandleDrawPartyStatusSummary(void) { - if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) + if (gBattleResources->bufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { PlayerPartnerBufferExecCompleted(); } else { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = 1; - gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]); + gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleResources->bufferA[gActiveBattler][4], gBattleResources->bufferA[gActiveBattler][1], gBattleResources->bufferA[gActiveBattler][2]); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0; - if (gBattleBufferA[gActiveBattler][2] != 0) + if (gBattleResources->bufferA[gActiveBattler][2] != 0) gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0x5D; gBattlerControllerFuncs[gActiveBattler] = sub_81BE498; @@ -1883,7 +1895,7 @@ static void PlayerPartnerHandleSpriteInvisibility(void) { if (IsBattlerSpritePresent(gActiveBattler)) { - gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1]; + gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleResources->bufferA[gActiveBattler][1]; CopyBattleSpriteInvisibility(gActiveBattler); } PlayerPartnerBufferExecCompleted(); @@ -1893,8 +1905,8 @@ static void PlayerPartnerHandleBattleAnimation(void) { if (!mplay_80342A4(gActiveBattler)) { - u8 animationId = gBattleBufferA[gActiveBattler][1]; - u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); + u8 animationId = gBattleResources->bufferA[gActiveBattler][1]; + u16 argument = gBattleResources->bufferA[gActiveBattler][2] | (gBattleResources->bufferA[gActiveBattler][3] << 8); if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument)) PlayerPartnerBufferExecCompleted(); @@ -1915,13 +1927,18 @@ static void PlayerPartnerHandleResetActionMoveSelection(void) static void PlayerPartnerHandleCmd55(void) { - gBattleOutcome = gBattleBufferA[gActiveBattler][1]; + gBattleOutcome = gBattleResources->bufferA[gActiveBattler][1]; FadeOutMapMusic(5); BeginFastPaletteFade(3); PlayerPartnerBufferExecCompleted(); gBattlerControllerFuncs[gActiveBattler] = sub_80587B0; } +static void PlayerPartnerHandleBattleDebug(void) +{ + PlayerPartnerBufferExecCompleted(); +} + static void PlayerPartnerCmdEnd(void) { } diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index ca7cd4adc6..3480cda921 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -88,6 +88,7 @@ static void RecordedOpponentHandleBattleAnimation(void); static void RecordedOpponentHandleLinkStandbyMsg(void); static void RecordedOpponentHandleResetActionMoveSelection(void); static void RecordedOpponentHandleCmd55(void); +static void RecordedOpponentHandleBattleDebug(void); static void RecordedOpponentCmdEnd(void); static void RecordedOpponentBufferRunCommand(void); @@ -160,6 +161,7 @@ static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void RecordedOpponentHandleLinkStandbyMsg, RecordedOpponentHandleResetActionMoveSelection, RecordedOpponentHandleCmd55, + RecordedOpponentHandleBattleDebug, RecordedOpponentCmdEnd }; @@ -176,8 +178,8 @@ static void RecordedOpponentBufferRunCommand(void) { if (gBattleControllerExecFlags & gBitTable[gActiveBattler]) { - if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sRecordedOpponentBufferCommands)) - sRecordedOpponentBufferCommands[gBattleBufferA[gActiveBattler][0]](); + if (gBattleResources->bufferA[gActiveBattler][0] < ARRAY_COUNT(sRecordedOpponentBufferCommands)) + sRecordedOpponentBufferCommands[gBattleResources->bufferA[gActiveBattler][0]](); else RecordedOpponentBufferExecCompleted(); } @@ -512,7 +514,7 @@ static void RecordedOpponentBufferExecCompleted(void) u8 playerId = GetMultiplayerId(); PrepareBufferDataTransferLink(2, 4, &playerId); - gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; + gBattleResources->bufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else { @@ -527,13 +529,13 @@ static void RecordedOpponentHandleGetMonData(void) u8 monToCheck; s32 i; - if (gBattleBufferA[gActiveBattler][2] == 0) + if (gBattleResources->bufferA[gActiveBattler][2] == 0) { size += CopyRecordedOpponentMonData(gBattlerPartyIndexes[gActiveBattler], monData); } else { - monToCheck = gBattleBufferA[gActiveBattler][2]; + monToCheck = gBattleResources->bufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; i++) { if (monToCheck & 1) @@ -555,7 +557,7 @@ static u32 CopyRecordedOpponentMonData(u8 monId, u8 *dst) u32 data32; s32 size = 0; - switch (gBattleBufferA[gActiveBattler][1]) + switch (gBattleResources->bufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: battleMon.species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES); @@ -584,7 +586,6 @@ static u32 CopyRecordedOpponentMonData(u8 monId, u8 *dst) battleMon.speed = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED); battleMon.spAttack = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK); battleMon.spDefense = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF); - battleMon.isEgg = GetMonData(&gEnemyParty[monId], MON_DATA_IS_EGG); battleMon.abilityNum = GetMonData(&gEnemyParty[monId], MON_DATA_ABILITY_NUM); battleMon.otId = GetMonData(&gEnemyParty[monId], MON_DATA_OT_ID); GetMonData(&gEnemyParty[monId], MON_DATA_NICKNAME, nickname); @@ -621,7 +622,7 @@ static u32 CopyRecordedOpponentMonData(u8 monId, u8 *dst) case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - data16 = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE); + data16 = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE); dst[0] = data16; dst[1] = data16 >> 8; size = 2; @@ -636,7 +637,7 @@ static u32 CopyRecordedOpponentMonData(u8 monId, u8 *dst) case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE); size = 1; break; case REQUEST_OTID_BATTLE: @@ -861,13 +862,13 @@ static void RecordedOpponentHandleSetMonData(void) u8 monToCheck; u8 i; - if (gBattleBufferA[gActiveBattler][2] == 0) + if (gBattleResources->bufferA[gActiveBattler][2] == 0) { SetRecordedOpponentMonData(gBattlerPartyIndexes[gActiveBattler]); } else { - monToCheck = gBattleBufferA[gActiveBattler][2]; + monToCheck = gBattleResources->bufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; i++) { if (monToCheck & 1) @@ -880,11 +881,11 @@ static void RecordedOpponentHandleSetMonData(void) static void SetRecordedOpponentMonData(u8 monId) { - struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3]; - struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3]; + struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleResources->bufferA[gActiveBattler][3]; + struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleResources->bufferA[gActiveBattler][3]; s32 i; - switch (gBattleBufferA[gActiveBattler][1]) + switch (gBattleResources->bufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: { @@ -925,10 +926,10 @@ static void SetRecordedOpponentMonData(u8 monId) } break; case REQUEST_SPECIES_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_HELDITEM_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: for (i = 0; i < MAX_MON_MOVES; i++) @@ -942,165 +943,165 @@ static void SetRecordedOpponentMonData(u8 monId) case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_PP_DATA_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gEnemyParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gEnemyParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gEnemyParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]); + SetMonData(&gEnemyParty[monId], MON_DATA_PP1, &gBattleResources->bufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_PP2, &gBattleResources->bufferA[gActiveBattler][4]); + SetMonData(&gEnemyParty[monId], MON_DATA_PP3, &gBattleResources->bufferA[gActiveBattler][5]); + SetMonData(&gEnemyParty[monId], MON_DATA_PP4, &gBattleResources->bufferA[gActiveBattler][6]); + SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &gBattleResources->bufferA[gActiveBattler][7]); break; case REQUEST_PPMOVE1_BATTLE: case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_OTID_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_OT_ID, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_EXP_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_EXP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_HP_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_HP_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ATK_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_ATK_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_DEF_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_DEF_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPEED_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPATK_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_FRIENDSHIP_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_POKERUS_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_POKERUS, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MET_LOCATION_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_MET_LOCATION, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MET_LEVEL_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_MET_LEVEL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MET_GAME_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_MET_GAME, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_POKEBALL_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_POKEBALL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ALL_IVS_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]); - SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]); + SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleResources->bufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleResources->bufferA[gActiveBattler][4]); + SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleResources->bufferA[gActiveBattler][5]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleResources->bufferA[gActiveBattler][6]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleResources->bufferA[gActiveBattler][7]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleResources->bufferA[gActiveBattler][8]); break; case REQUEST_HP_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ATK_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_DEF_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPEED_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPATK_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_PERSONALITY_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_LEVEL_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_HP_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_HP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MAX_HP_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ATK_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_ATK, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_DEF_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_DEF, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPEED_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPEED, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPATK_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPATK, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_COOL_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_COOL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_CUTE_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_CUTE, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SMART_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SMART, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SHEEN_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SHEEN, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_COOL_RIBBON_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_COOL_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_RIBBON_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_CUTE_RIBBON_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_CUTE_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SMART_RIBBON_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SMART_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_RIBBON_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; } } static void RecordedOpponentHandleSetRawMonData(void) { - u8 *dst = (u8 *)&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1]; + u8 *dst = (u8 *)&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleResources->bufferA[gActiveBattler][1]; u8 i; - for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++) - dst[i] = gBattleBufferA[gActiveBattler][3 + i]; + for (i = 0; i < gBattleResources->bufferA[gActiveBattler][2]; i++) + dst[i] = gBattleResources->bufferA[gActiveBattler][3 + i]; RecordedOpponentBufferExecCompleted(); } @@ -1129,8 +1130,8 @@ static void RecordedOpponentHandleLoadMonSprite(void) static void RecordedOpponentHandleSwitchInAnim(void) { - gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1]; - sub_81885D8(gActiveBattler, gBattleBufferA[gActiveBattler][2]); + gBattlerPartyIndexes[gActiveBattler] = gBattleResources->bufferA[gActiveBattler][1]; + sub_81885D8(gActiveBattler, gBattleResources->bufferA[gActiveBattler][2]); gBattlerControllerFuncs[gActiveBattler] = sub_8187084; } @@ -1139,7 +1140,7 @@ static void sub_81885D8(u8 battlerId, bool8 dontClearSubstituteBit) u16 species; ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit); - gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; + gBattlerPartyIndexes[battlerId] = gBattleResources->bufferA[battlerId][1]; species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714); BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId); @@ -1167,7 +1168,7 @@ static void sub_81885D8(u8 battlerId, bool8 dontClearSubstituteBit) static void RecordedOpponentHandleReturnMonToBall(void) { - if (gBattleBufferA[gActiveBattler][1] == 0) + if (gBattleResources->bufferA[gActiveBattler][1] == 0) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation; @@ -1316,14 +1317,14 @@ static void RecordedOpponentHandleMoveAnimation(void) { if (!mplay_80342A4(gActiveBattler)) { - u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); + u16 move = gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8); - gAnimMoveTurn = gBattleBufferA[gActiveBattler][3]; - gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8); - gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24); - gAnimFriendship = gBattleBufferA[gActiveBattler][10]; - gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8); - gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16]; + gAnimMoveTurn = gBattleResources->bufferA[gActiveBattler][3]; + gAnimMovePower = gBattleResources->bufferA[gActiveBattler][4] | (gBattleResources->bufferA[gActiveBattler][5] << 8); + gAnimMoveDmg = gBattleResources->bufferA[gActiveBattler][6] | (gBattleResources->bufferA[gActiveBattler][7] << 8) | (gBattleResources->bufferA[gActiveBattler][8] << 16) | (gBattleResources->bufferA[gActiveBattler][9] << 24); + gAnimFriendship = gBattleResources->bufferA[gActiveBattler][10]; + gWeatherMoveAnim = gBattleResources->bufferA[gActiveBattler][12] | (gBattleResources->bufferA[gActiveBattler][13] << 8); + gAnimDisableStructPtr = (struct DisableStruct *)&gBattleResources->bufferA[gActiveBattler][16]; gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality; if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE { @@ -1339,8 +1340,8 @@ static void RecordedOpponentHandleMoveAnimation(void) static void RecordedOpponentDoMoveAnimation(void) { - u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); - u8 multihit = gBattleBufferA[gActiveBattler][11]; + u16 move = gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8); + u8 multihit = gBattleResources->bufferA[gActiveBattler][11]; switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState) { @@ -1378,7 +1379,7 @@ static void RecordedOpponentDoMoveAnimation(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { CopyAllBattleSpritesInvisibilities(); - TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; RecordedOpponentBufferExecCompleted(); } @@ -1392,7 +1393,7 @@ static void RecordedOpponentHandlePrintString(void) gBattle_BG0_X = 0; gBattle_BG0_Y = 0; - stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]); + stringId = (u16*)(&gBattleResources->bufferA[gActiveBattler][2]); BufferStringBattle(*stringId); BattlePutTextOnWindow(gDisplayedStringBattle, 0); gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter; @@ -1452,7 +1453,7 @@ static void RecordedOpponentHandleHealthBarUpdate(void) s16 hpVal; LoadBattleBarGfx(0); - hpVal = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); + hpVal = gBattleResources->bufferA[gActiveBattler][2] | (gBattleResources->bufferA[gActiveBattler][3] << 8); if (hpVal != INSTANT_HP_BAR_DROP) { @@ -1493,8 +1494,8 @@ static void RecordedOpponentHandleStatusAnimation(void) { if (!mplay_80342A4(gActiveBattler)) { - InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1], - gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24)); + InitAndLaunchChosenStatusAnimation(gBattleResources->bufferA[gActiveBattler][1], + gBattleResources->bufferA[gActiveBattler][2] | (gBattleResources->bufferA[gActiveBattler][3] << 8) | (gBattleResources->bufferA[gActiveBattler][4] << 16) | (gBattleResources->bufferA[gActiveBattler][5] << 24)); gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; } } @@ -1552,7 +1553,7 @@ static void RecordedOpponentHandleCmd37(void) static void RecordedOpponentHandleCmd38(void) { - gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBattler][1]; + gUnknown_02022D0C.field_0 = gBattleResources->bufferA[gActiveBattler][1]; RecordedOpponentBufferExecCompleted(); } @@ -1597,20 +1598,20 @@ static void RecordedOpponentHandlePlaySE(void) else pan = SOUND_PAN_TARGET; - PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan); + PlaySE12WithPanning(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8), pan); RecordedOpponentBufferExecCompleted(); } static void RecordedOpponentHandlePlayFanfareOrBGM(void) { - if (gBattleBufferA[gActiveBattler][3]) + if (gBattleResources->bufferA[gActiveBattler][3]) { BattleStopLowHpSound(); - PlayBGM(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + PlayBGM(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); } else { - PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + PlayFanfare(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); } RecordedOpponentBufferExecCompleted(); @@ -1626,7 +1627,7 @@ static void RecordedOpponentHandleFaintingCry(void) static void RecordedOpponentHandleIntroSlide(void) { - HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); + HandleIntroSlide(gBattleResources->bufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; RecordedOpponentBufferExecCompleted(); } @@ -1662,15 +1663,15 @@ static void sub_8189548(u8 taskId) gActiveBattler = gTasks[taskId].data[0]; if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) { - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + gBattleResources->bufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; sub_81885D8(gActiveBattler, FALSE); } else { - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + gBattleResources->bufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; sub_81885D8(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + gBattleResources->bufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; sub_81885D8(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; } @@ -1688,7 +1689,7 @@ static void sub_818962C(struct Sprite *sprite) static void RecordedOpponentHandleDrawPartyStatusSummary(void) { - if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) + if (gBattleResources->bufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { RecordedOpponentBufferExecCompleted(); } @@ -1696,7 +1697,7 @@ static void RecordedOpponentHandleDrawPartyStatusSummary(void) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = 1; - if (gBattleBufferA[gActiveBattler][2] != 0) + if (gBattleResources->bufferA[gActiveBattler][2] != 0) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1E < 2) { @@ -1709,10 +1710,10 @@ static void RecordedOpponentHandleDrawPartyStatusSummary(void) } } - gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]); + gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleResources->bufferA[gActiveBattler][4], gBattleResources->bufferA[gActiveBattler][1], gBattleResources->bufferA[gActiveBattler][2]); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0; - if (gBattleBufferA[gActiveBattler][2] != 0) + if (gBattleResources->bufferA[gActiveBattler][2] != 0) gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0x5D; gBattlerControllerFuncs[gActiveBattler] = sub_818975C; @@ -1744,7 +1745,7 @@ static void RecordedOpponentHandleSpriteInvisibility(void) { if (IsBattlerSpritePresent(gActiveBattler)) { - gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1]; + gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleResources->bufferA[gActiveBattler][1]; CopyBattleSpriteInvisibility(gActiveBattler); } RecordedOpponentBufferExecCompleted(); @@ -1754,8 +1755,8 @@ static void RecordedOpponentHandleBattleAnimation(void) { if (!mplay_80342A4(gActiveBattler)) { - u8 animationId = gBattleBufferA[gActiveBattler][1]; - u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); + u8 animationId = gBattleResources->bufferA[gActiveBattler][1]; + u16 argument = gBattleResources->bufferA[gActiveBattler][2] | (gBattleResources->bufferA[gActiveBattler][3] << 8); if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument)) RecordedOpponentBufferExecCompleted(); @@ -1776,10 +1777,10 @@ static void RecordedOpponentHandleResetActionMoveSelection(void) static void RecordedOpponentHandleCmd55(void) { - if (gBattleBufferA[gActiveBattler][1] == B_OUTCOME_DREW) - gBattleOutcome = gBattleBufferA[gActiveBattler][1]; + if (gBattleResources->bufferA[gActiveBattler][1] == B_OUTCOME_DREW) + gBattleOutcome = gBattleResources->bufferA[gActiveBattler][1]; else - gBattleOutcome = gBattleBufferA[gActiveBattler][1] ^ B_OUTCOME_DREW; + gBattleOutcome = gBattleResources->bufferA[gActiveBattler][1] ^ B_OUTCOME_DREW; FadeOutMapMusic(5); BeginFastPaletteFade(3); @@ -1787,6 +1788,11 @@ static void RecordedOpponentHandleCmd55(void) gBattlerControllerFuncs[gActiveBattler] = sub_80587B0; } +static void RecordedOpponentHandleBattleDebug(void) +{ + RecordedOpponentBufferExecCompleted(); +} + static void RecordedOpponentCmdEnd(void) { } diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index 72af27d5ec..c26b421fa5 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -171,8 +171,8 @@ static void RecordedPlayerBufferRunCommand(void) { if (gBattleControllerExecFlags & gBitTable[gActiveBattler]) { - if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sRecordedPlayerBufferCommands)) - sRecordedPlayerBufferCommands[gBattleBufferA[gActiveBattler][0]](); + if (gBattleResources->bufferA[gActiveBattler][0] < ARRAY_COUNT(sRecordedPlayerBufferCommands)) + sRecordedPlayerBufferCommands[gBattleResources->bufferA[gActiveBattler][0]](); else RecordedPlayerBufferExecCompleted(); } @@ -479,7 +479,7 @@ static void RecordedPlayerBufferExecCompleted(void) u8 playerId = GetMultiplayerId(); PrepareBufferDataTransferLink(2, 4, &playerId); - gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; + gBattleResources->bufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else { @@ -506,13 +506,13 @@ static void RecordedPlayerHandleGetMonData(void) u8 monToCheck; s32 i; - if (gBattleBufferA[gActiveBattler][2] == 0) + if (gBattleResources->bufferA[gActiveBattler][2] == 0) { size += CopyRecordedPlayerMonData(gBattlerPartyIndexes[gActiveBattler], monData); } else { - monToCheck = gBattleBufferA[gActiveBattler][2]; + monToCheck = gBattleResources->bufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; i++) { if (monToCheck & 1) @@ -534,7 +534,7 @@ static u32 CopyRecordedPlayerMonData(u8 monId, u8 *dst) u32 data32; s32 size = 0; - switch (gBattleBufferA[gActiveBattler][1]) + switch (gBattleResources->bufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); @@ -563,7 +563,6 @@ static u32 CopyRecordedPlayerMonData(u8 monId, u8 *dst) battleMon.speed = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED); battleMon.spAttack = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK); battleMon.spDefense = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF); - battleMon.isEgg = GetMonData(&gPlayerParty[monId], MON_DATA_IS_EGG); battleMon.abilityNum = GetMonData(&gPlayerParty[monId], MON_DATA_ABILITY_NUM); battleMon.otId = GetMonData(&gPlayerParty[monId], MON_DATA_OT_ID); GetMonData(&gPlayerParty[monId], MON_DATA_NICKNAME, nickname); @@ -600,7 +599,7 @@ static u32 CopyRecordedPlayerMonData(u8 monId, u8 *dst) case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE); + data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE); dst[0] = data16; dst[1] = data16 >> 8; size = 2; @@ -615,7 +614,7 @@ static u32 CopyRecordedPlayerMonData(u8 monId, u8 *dst) case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE); size = 1; break; case REQUEST_OTID_BATTLE: @@ -840,13 +839,13 @@ static void RecordedPlayerHandleSetMonData(void) u8 monToCheck; u8 i; - if (gBattleBufferA[gActiveBattler][2] == 0) + if (gBattleResources->bufferA[gActiveBattler][2] == 0) { SetRecordedPlayerMonData(gBattlerPartyIndexes[gActiveBattler]); } else { - monToCheck = gBattleBufferA[gActiveBattler][2]; + monToCheck = gBattleResources->bufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; i++) { if (monToCheck & 1) @@ -859,11 +858,11 @@ static void RecordedPlayerHandleSetMonData(void) static void SetRecordedPlayerMonData(u8 monId) { - struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3]; - struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3]; + struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleResources->bufferA[gActiveBattler][3]; + struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleResources->bufferA[gActiveBattler][3]; s32 i; - switch (gBattleBufferA[gActiveBattler][1]) + switch (gBattleResources->bufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: { @@ -904,10 +903,10 @@ static void SetRecordedPlayerMonData(u8 monId) } break; case REQUEST_SPECIES_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_HELDITEM_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: for (i = 0; i < MAX_MON_MOVES; i++) @@ -921,154 +920,154 @@ static void SetRecordedPlayerMonData(u8 monId) case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_PP_DATA_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleResources->bufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleResources->bufferA[gActiveBattler][4]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleResources->bufferA[gActiveBattler][5]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleResources->bufferA[gActiveBattler][6]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleResources->bufferA[gActiveBattler][7]); break; case REQUEST_PPMOVE1_BATTLE: case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_OTID_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_EXP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_HP_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ATK_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_DEF_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPEED_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPATK_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_FRIENDSHIP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_POKERUS_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MET_LOCATION_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MET_LEVEL_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MET_GAME_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_POKEBALL_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ALL_IVS_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]); - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]); + SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleResources->bufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleResources->bufferA[gActiveBattler][4]); + SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleResources->bufferA[gActiveBattler][5]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleResources->bufferA[gActiveBattler][6]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleResources->bufferA[gActiveBattler][7]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleResources->bufferA[gActiveBattler][8]); break; case REQUEST_HP_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ATK_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_DEF_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPEED_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPATK_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_PERSONALITY_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_LEVEL_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_HP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MAX_HP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ATK_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_DEF_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPEED_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPATK_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_COOL_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_CUTE_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SMART_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SHEEN_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_COOL_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_CUTE_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SMART_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; } @@ -1077,11 +1076,11 @@ static void SetRecordedPlayerMonData(u8 monId) static void RecordedPlayerHandleSetRawMonData(void) { - u8 *dst = (u8 *)&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1]; + u8 *dst = (u8 *)&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleResources->bufferA[gActiveBattler][1]; u8 i; - for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++) - dst[i] = gBattleBufferA[gActiveBattler][3 + i]; + for (i = 0; i < gBattleResources->bufferA[gActiveBattler][2]; i++) + dst[i] = gBattleResources->bufferA[gActiveBattler][3 + i]; RecordedPlayerBufferExecCompleted(); } @@ -1107,10 +1106,10 @@ static void RecordedPlayerHandleLoadMonSprite(void) static void RecordedPlayerHandleSwitchInAnim(void) { - ClearTemporarySpeciesSpriteData(gActiveBattler, gBattleBufferA[gActiveBattler][2]); - gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1]; + ClearTemporarySpeciesSpriteData(gActiveBattler, gBattleResources->bufferA[gActiveBattler][2]); + gBattlerPartyIndexes[gActiveBattler] = gBattleResources->bufferA[gActiveBattler][1]; BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - sub_818BA6C(gActiveBattler, gBattleBufferA[gActiveBattler][2]); + sub_818BA6C(gActiveBattler, gBattleResources->bufferA[gActiveBattler][2]); gBattlerControllerFuncs[gActiveBattler] = sub_818A470; } @@ -1119,7 +1118,7 @@ static void sub_818BA6C(u8 battlerId, bool8 dontClearSubstituteBit) u16 species; ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit); - gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; + gBattlerPartyIndexes[battlerId] = gBattleResources->bufferA[battlerId][1]; species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); @@ -1147,7 +1146,7 @@ static void sub_818BA6C(u8 battlerId, bool8 dontClearSubstituteBit) static void RecordedPlayerHandleReturnMonToBall(void) { - if (gBattleBufferA[gActiveBattler][1] == 0) + if (gBattleResources->bufferA[gActiveBattler][1] == 0) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation; @@ -1316,14 +1315,14 @@ static void RecordedPlayerHandleMoveAnimation(void) { if (!mplay_80342A4(gActiveBattler)) { - u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); + u16 move = gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8); - gAnimMoveTurn = gBattleBufferA[gActiveBattler][3]; - gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8); - gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24); - gAnimFriendship = gBattleBufferA[gActiveBattler][10]; - gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8); - gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16]; + gAnimMoveTurn = gBattleResources->bufferA[gActiveBattler][3]; + gAnimMovePower = gBattleResources->bufferA[gActiveBattler][4] | (gBattleResources->bufferA[gActiveBattler][5] << 8); + gAnimMoveDmg = gBattleResources->bufferA[gActiveBattler][6] | (gBattleResources->bufferA[gActiveBattler][7] << 8) | (gBattleResources->bufferA[gActiveBattler][8] << 16) | (gBattleResources->bufferA[gActiveBattler][9] << 24); + gAnimFriendship = gBattleResources->bufferA[gActiveBattler][10]; + gWeatherMoveAnim = gBattleResources->bufferA[gActiveBattler][12] | (gBattleResources->bufferA[gActiveBattler][13] << 8); + gAnimDisableStructPtr = (struct DisableStruct *)&gBattleResources->bufferA[gActiveBattler][16]; gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality; if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE { @@ -1339,8 +1338,8 @@ static void RecordedPlayerHandleMoveAnimation(void) static void RecordedPlayerDoMoveAnimation(void) { - u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); - u8 multihit = gBattleBufferA[gActiveBattler][11]; + u16 move = gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8); + u8 multihit = gBattleResources->bufferA[gActiveBattler][11]; switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState) { @@ -1378,7 +1377,7 @@ static void RecordedPlayerDoMoveAnimation(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { CopyAllBattleSpritesInvisibilities(); - TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; RecordedPlayerBufferExecCompleted(); } @@ -1392,7 +1391,7 @@ static void RecordedPlayerHandlePrintString(void) gBattle_BG0_X = 0; gBattle_BG0_Y = 0; - stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]); + stringId = (u16*)(&gBattleResources->bufferA[gActiveBattler][2]); BufferStringBattle(*stringId); BattlePutTextOnWindow(gDisplayedStringBattle, 0); gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter; @@ -1468,7 +1467,7 @@ static void RecordedPlayerHandleHealthBarUpdate(void) s16 hpVal; LoadBattleBarGfx(0); - hpVal = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); + hpVal = gBattleResources->bufferA[gActiveBattler][2] | (gBattleResources->bufferA[gActiveBattler][3] << 8); if (hpVal != INSTANT_HP_BAR_DROP) { @@ -1510,8 +1509,8 @@ static void RecordedPlayerHandleStatusAnimation(void) { if (!mplay_80342A4(gActiveBattler)) { - InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1], - gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24)); + InitAndLaunchChosenStatusAnimation(gBattleResources->bufferA[gActiveBattler][1], + gBattleResources->bufferA[gActiveBattler][2] | (gBattleResources->bufferA[gActiveBattler][3] << 8) | (gBattleResources->bufferA[gActiveBattler][4] << 16) | (gBattleResources->bufferA[gActiveBattler][5] << 24)); gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; } } @@ -1569,7 +1568,7 @@ static void RecordedPlayerHandleCmd37(void) static void RecordedPlayerHandleCmd38(void) { - gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBattler][1]; + gUnknown_02022D0C.field_0 = gBattleResources->bufferA[gActiveBattler][1]; RecordedPlayerBufferExecCompleted(); } @@ -1614,20 +1613,20 @@ static void RecordedPlayerHandlePlaySE(void) else pan = SOUND_PAN_TARGET; - PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan); + PlaySE12WithPanning(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8), pan); RecordedPlayerBufferExecCompleted(); } static void RecordedPlayerHandlePlayFanfareOrBGM(void) { - if (gBattleBufferA[gActiveBattler][3]) + if (gBattleResources->bufferA[gActiveBattler][3]) { BattleStopLowHpSound(); - PlayBGM(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + PlayBGM(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); } else { - PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + PlayFanfare(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); } RecordedPlayerBufferExecCompleted(); @@ -1643,7 +1642,7 @@ static void RecordedPlayerHandleFaintingCry(void) static void RecordedPlayerHandleIntroSlide(void) { - HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); + HandleIntroSlide(gBattleResources->bufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; RecordedPlayerBufferExecCompleted(); } @@ -1698,15 +1697,15 @@ static void sub_818CC24(u8 taskId) gActiveBattler = gTasks[taskId].data[0]; if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) { - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + gBattleResources->bufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; sub_818BA6C(gActiveBattler, FALSE); } else { - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + gBattleResources->bufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; sub_818BA6C(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + gBattleResources->bufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); sub_818BA6C(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; @@ -1719,17 +1718,17 @@ static void sub_818CC24(u8 taskId) static void RecordedPlayerHandleDrawPartyStatusSummary(void) { - if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) + if (gBattleResources->bufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { RecordedPlayerBufferExecCompleted(); } else { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = 1; - gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]); + gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleResources->bufferA[gActiveBattler][4], gBattleResources->bufferA[gActiveBattler][1], gBattleResources->bufferA[gActiveBattler][2]); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0; - if (gBattleBufferA[gActiveBattler][2] != 0) + if (gBattleResources->bufferA[gActiveBattler][2] != 0) gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0x5D; gBattlerControllerFuncs[gActiveBattler] = sub_818CDF4; @@ -1761,7 +1760,7 @@ static void RecordedPlayerHandleSpriteInvisibility(void) { if (IsBattlerSpritePresent(gActiveBattler)) { - gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1]; + gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleResources->bufferA[gActiveBattler][1]; CopyBattleSpriteInvisibility(gActiveBattler); } RecordedPlayerBufferExecCompleted(); @@ -1771,8 +1770,8 @@ static void RecordedPlayerHandleBattleAnimation(void) { if (!mplay_80342A4(gActiveBattler)) { - u8 animationId = gBattleBufferA[gActiveBattler][1]; - u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); + u8 animationId = gBattleResources->bufferA[gActiveBattler][1]; + u16 argument = gBattleResources->bufferA[gActiveBattler][2] | (gBattleResources->bufferA[gActiveBattler][3] << 8); if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument)) RecordedPlayerBufferExecCompleted(); @@ -1793,7 +1792,7 @@ static void RecordedPlayerHandleResetActionMoveSelection(void) static void RecordedPlayerHandleCmd55(void) { - gBattleOutcome = gBattleBufferA[gActiveBattler][1]; + gBattleOutcome = gBattleResources->bufferA[gActiveBattler][1]; FadeOutMapMusic(5); BeginFastPaletteFade(3); RecordedPlayerBufferExecCompleted(); diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c index 9cb427e129..95a4d3aba0 100644 --- a/src/battle_controller_safari.c +++ b/src/battle_controller_safari.c @@ -81,6 +81,7 @@ static void SafariHandleBattleAnimation(void); static void SafariHandleLinkStandbyMsg(void); static void SafariHandleResetActionMoveSelection(void); static void SafariHandleCmd55(void); +static void SafariHandleBattleDebug(void); static void SafariCmdEnd(void); static void SafariBufferRunCommand(void); @@ -145,6 +146,7 @@ static void (*const sSafariBufferCommands[CONTROLLER_CMDS_COUNT])(void) = SafariHandleLinkStandbyMsg, SafariHandleResetActionMoveSelection, SafariHandleCmd55, + SafariHandleBattleDebug, SafariCmdEnd }; @@ -161,8 +163,8 @@ static void SafariBufferRunCommand(void) { if (gBattleControllerExecFlags & gBitTable[gActiveBattler]) { - if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sSafariBufferCommands)) - sSafariBufferCommands[gBattleBufferA[gActiveBattler][0]](); + if (gBattleResources->bufferA[gActiveBattler][0] < ARRAY_COUNT(sSafariBufferCommands)) + sSafariBufferCommands[gBattleResources->bufferA[gActiveBattler][0]](); else SafariBufferExecCompleted(); } @@ -300,7 +302,7 @@ static void SafariBufferExecCompleted(void) u8 playerId = GetMultiplayerId(); PrepareBufferDataTransferLink(2, 4, &playerId); - gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; + gBattleResources->bufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else { @@ -395,7 +397,7 @@ static void SafariHandleSuccessBallThrowAnim(void) static void SafariHandleBallThrowAnim(void) { - u8 ballThrowCaseId = gBattleBufferA[gActiveBattler][1]; + u8 ballThrowCaseId = gBattleResources->bufferA[gActiveBattler][1]; gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId; gDoingBattleAnim = TRUE; @@ -419,7 +421,7 @@ static void SafariHandlePrintString(void) gBattle_BG0_X = 0; gBattle_BG0_Y = 0; - stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]); + stringId = (u16*)(&gBattleResources->bufferA[gActiveBattler][2]); BufferStringBattle(*stringId); BattlePutTextOnWindow(gDisplayedStringBattle, 0); gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter; @@ -592,20 +594,20 @@ static void SafariHandlePlaySE(void) else pan = SOUND_PAN_TARGET; - PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan); + PlaySE12WithPanning(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8), pan); SafariBufferExecCompleted(); } static void SafariHandlePlayFanfareOrBGM(void) { - if (gBattleBufferA[gActiveBattler][3]) + if (gBattleResources->bufferA[gActiveBattler][3]) { BattleStopLowHpSound(); - PlayBGM(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + PlayBGM(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); } else { - PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + PlayFanfare(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); } SafariBufferExecCompleted(); @@ -621,7 +623,7 @@ static void SafariHandleFaintingCry(void) static void SafariHandleIntroSlide(void) { - HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); + HandleIntroSlide(gBattleResources->bufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; SafariBufferExecCompleted(); } @@ -656,8 +658,8 @@ static void SafariHandleSpriteInvisibility(void) static void SafariHandleBattleAnimation(void) { - u8 animationId = gBattleBufferA[gActiveBattler][1]; - u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); + u8 animationId = gBattleResources->bufferA[gActiveBattler][1]; + u16 argument = gBattleResources->bufferA[gActiveBattler][2] | (gBattleResources->bufferA[gActiveBattler][3] << 8); if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument)) SafariBufferExecCompleted(); @@ -677,7 +679,7 @@ static void SafariHandleResetActionMoveSelection(void) static void SafariHandleCmd55(void) { - gBattleOutcome = gBattleBufferA[gActiveBattler][1]; + gBattleOutcome = gBattleResources->bufferA[gActiveBattler][1]; FadeOutMapMusic(5); BeginFastPaletteFade(3); SafariBufferExecCompleted(); @@ -685,6 +687,11 @@ static void SafariHandleCmd55(void) gBattlerControllerFuncs[gActiveBattler] = sub_81595E4; } +static void SafariHandleBattleDebug(void) +{ + SafariBufferExecCompleted(); +} + static void SafariCmdEnd(void) { } diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c index aa50bc159d..a63863e3e3 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -89,6 +89,7 @@ static void WallyHandleBattleAnimation(void); static void WallyHandleLinkStandbyMsg(void); static void WallyHandleResetActionMoveSelection(void); static void WallyHandleCmd55(void); +static void WallyHandleBattleDebug(void); static void WallyCmdEnd(void); static void WallyBufferRunCommand(void); @@ -158,6 +159,7 @@ static void (*const sWallyBufferCommands[CONTROLLER_CMDS_COUNT])(void) = WallyHandleLinkStandbyMsg, WallyHandleResetActionMoveSelection, WallyHandleCmd55, + WallyHandleBattleDebug, WallyCmdEnd }; @@ -178,8 +180,8 @@ static void WallyBufferRunCommand(void) { if (gBattleControllerExecFlags & gBitTable[gActiveBattler]) { - if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sWallyBufferCommands)) - sWallyBufferCommands[gBattleBufferA[gActiveBattler][0]](); + if (gBattleResources->bufferA[gActiveBattler][0] < ARRAY_COUNT(sWallyBufferCommands)) + sWallyBufferCommands[gBattleResources->bufferA[gActiveBattler][0]](); else WallyBufferExecCompleted(); } @@ -409,7 +411,7 @@ static void WallyBufferExecCompleted(void) u8 playerId = GetMultiplayerId(); PrepareBufferDataTransferLink(2, 4, &playerId); - gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; + gBattleResources->bufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else { @@ -430,13 +432,13 @@ static void WallyHandleGetMonData(void) u8 monToCheck; s32 i; - if (gBattleBufferA[gActiveBattler][2] == 0) + if (gBattleResources->bufferA[gActiveBattler][2] == 0) { size += CopyWallyMonData(gBattlerPartyIndexes[gActiveBattler], monData); } else { - monToCheck = gBattleBufferA[gActiveBattler][2]; + monToCheck = gBattleResources->bufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; i++) { if (monToCheck & 1) @@ -458,7 +460,7 @@ static u32 CopyWallyMonData(u8 monId, u8 *dst) u32 data32; s32 size = 0; - switch (gBattleBufferA[gActiveBattler][1]) + switch (gBattleResources->bufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); @@ -487,7 +489,6 @@ static u32 CopyWallyMonData(u8 monId, u8 *dst) battleMon.speed = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED); battleMon.spAttack = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK); battleMon.spDefense = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF); - battleMon.isEgg = GetMonData(&gPlayerParty[monId], MON_DATA_IS_EGG); battleMon.abilityNum = GetMonData(&gPlayerParty[monId], MON_DATA_ABILITY_NUM); battleMon.otId = GetMonData(&gPlayerParty[monId], MON_DATA_OT_ID); GetMonData(&gPlayerParty[monId], MON_DATA_NICKNAME, nickname); @@ -524,7 +525,7 @@ static u32 CopyWallyMonData(u8 monId, u8 *dst) case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE); + data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE); dst[0] = data16; dst[1] = data16 >> 8; size = 2; @@ -539,7 +540,7 @@ static u32 CopyWallyMonData(u8 monId, u8 *dst) case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE); size = 1; break; case REQUEST_OTID_BATTLE: @@ -764,13 +765,13 @@ static void WallyHandleSetMonData(void) u8 monToCheck; u8 i; - if (gBattleBufferA[gActiveBattler][2] == 0) + if (gBattleResources->bufferA[gActiveBattler][2] == 0) { SetWallyMonData(gBattlerPartyIndexes[gActiveBattler]); } else { - monToCheck = gBattleBufferA[gActiveBattler][2]; + monToCheck = gBattleResources->bufferA[gActiveBattler][2]; for (i = 0; i < PARTY_SIZE; i++) { if (monToCheck & 1) @@ -783,11 +784,11 @@ static void WallyHandleSetMonData(void) static void SetWallyMonData(u8 monId) { - struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3]; - struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3]; + struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleResources->bufferA[gActiveBattler][3]; + struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleResources->bufferA[gActiveBattler][3]; s32 i; - switch (gBattleBufferA[gActiveBattler][1]) + switch (gBattleResources->bufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: { @@ -828,10 +829,10 @@ static void SetWallyMonData(u8 monId) } break; case REQUEST_SPECIES_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_HELDITEM_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: for (i = 0; i < MAX_MON_MOVES; i++) @@ -845,154 +846,154 @@ static void SetWallyMonData(u8 monId) case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_PP_DATA_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleResources->bufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleResources->bufferA[gActiveBattler][4]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleResources->bufferA[gActiveBattler][5]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleResources->bufferA[gActiveBattler][6]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleResources->bufferA[gActiveBattler][7]); break; case REQUEST_PPMOVE1_BATTLE: case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleResources->bufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_OTID_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_EXP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_HP_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ATK_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_DEF_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPEED_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPATK_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_FRIENDSHIP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_POKERUS_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MET_LOCATION_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MET_LEVEL_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MET_GAME_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_POKEBALL_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ALL_IVS_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]); - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]); + SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleResources->bufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleResources->bufferA[gActiveBattler][4]); + SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleResources->bufferA[gActiveBattler][5]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleResources->bufferA[gActiveBattler][6]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleResources->bufferA[gActiveBattler][7]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleResources->bufferA[gActiveBattler][8]); break; case REQUEST_HP_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ATK_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_DEF_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPEED_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPATK_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_PERSONALITY_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_LEVEL_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_HP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_MAX_HP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_ATK_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_DEF_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPEED_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPATK_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_COOL_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_CUTE_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SMART_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SHEEN_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_COOL_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_CUTE_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_SMART_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleResources->bufferA[gActiveBattler][3]); break; } @@ -1016,7 +1017,7 @@ static void WallyHandleSwitchInAnim(void) static void WallyHandleReturnMonToBall(void) { - if (gBattleBufferA[gActiveBattler][1] == 0) + if (gBattleResources->bufferA[gActiveBattler][1] == 0) { InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_PLAYER_MON); gBattlerControllerFuncs[gActiveBattler] = sub_8168A20; @@ -1085,7 +1086,7 @@ static void WallyHandleSuccessBallThrowAnim(void) static void WallyHandleBallThrowAnim(void) { - u8 ballThrowCaseId = gBattleBufferA[gActiveBattler][1]; + u8 ballThrowCaseId = gBattleResources->bufferA[gActiveBattler][1]; gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId; gDoingBattleAnim = TRUE; @@ -1100,14 +1101,14 @@ static void WallyHandlePause(void) static void WallyHandleMoveAnimation(void) { - u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); + u16 move = gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8); - gAnimMoveTurn = gBattleBufferA[gActiveBattler][3]; - gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8); - gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24); - gAnimFriendship = gBattleBufferA[gActiveBattler][10]; - gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8); - gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16]; + gAnimMoveTurn = gBattleResources->bufferA[gActiveBattler][3]; + gAnimMovePower = gBattleResources->bufferA[gActiveBattler][4] | (gBattleResources->bufferA[gActiveBattler][5] << 8); + gAnimMoveDmg = gBattleResources->bufferA[gActiveBattler][6] | (gBattleResources->bufferA[gActiveBattler][7] << 8) | (gBattleResources->bufferA[gActiveBattler][8] << 16) | (gBattleResources->bufferA[gActiveBattler][9] << 24); + gAnimFriendship = gBattleResources->bufferA[gActiveBattler][10]; + gWeatherMoveAnim = gBattleResources->bufferA[gActiveBattler][12] | (gBattleResources->bufferA[gActiveBattler][13] << 8); + gAnimDisableStructPtr = (struct DisableStruct *)&gBattleResources->bufferA[gActiveBattler][16]; gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality; if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE { @@ -1123,7 +1124,7 @@ static void WallyHandleMoveAnimation(void) static void WallyDoMoveAnimation(void) { - u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); + u16 move = gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8); switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState) { @@ -1158,7 +1159,7 @@ static void WallyDoMoveAnimation(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { CopyAllBattleSpritesInvisibilities(); - TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; WallyBufferExecCompleted(); } @@ -1172,7 +1173,7 @@ static void WallyHandlePrintString(void) gBattle_BG0_X = 0; gBattle_BG0_Y = 0; - stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]); + stringId = (u16*)(&gBattleResources->bufferA[gActiveBattler][2]); BufferStringBattle(*stringId); BattlePutTextOnWindow(gDisplayedStringBattle, 0); gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter; @@ -1266,7 +1267,7 @@ static void WallyHandleHealthBarUpdate(void) s16 hpVal; LoadBattleBarGfx(0); - hpVal = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); + hpVal = gBattleResources->bufferA[gActiveBattler][2] | (gBattleResources->bufferA[gActiveBattler][3] << 8); if (hpVal != INSTANT_HP_BAR_DROP) { @@ -1388,20 +1389,20 @@ static void WallyHandleCmd42(void) static void WallyHandlePlaySE(void) { - PlaySE(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + PlaySE(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); WallyBufferExecCompleted(); } static void WallyHandlePlayFanfareOrBGM(void) { - if (gBattleBufferA[gActiveBattler][3]) + if (gBattleResources->bufferA[gActiveBattler][3]) { BattleStopLowHpSound(); - PlayBGM(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + PlayBGM(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); } else { - PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + PlayFanfare(gBattleResources->bufferA[gActiveBattler][1] | (gBattleResources->bufferA[gActiveBattler][2] << 8)); } WallyBufferExecCompleted(); @@ -1417,7 +1418,7 @@ static void WallyHandleFaintingCry(void) static void WallyHandleIntroSlide(void) { - HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); + HandleIntroSlide(gBattleResources->bufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; WallyBufferExecCompleted(); } @@ -1457,7 +1458,7 @@ static void sub_816AA80(u8 battlerId) u16 species; gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies = 0; - gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; + gBattlerPartyIndexes[battlerId] = gBattleResources->bufferA[battlerId][1]; species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); @@ -1490,7 +1491,7 @@ static void sub_816AC04(u8 taskId) u8 savedActiveBank = gActiveBattler; gActiveBattler = gTasks[taskId].data[0]; - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + gBattleResources->bufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; sub_816AA80(gActiveBattler); gBattlerControllerFuncs[gActiveBattler] = sub_816864C; gActiveBattler = savedActiveBank; @@ -1500,14 +1501,14 @@ static void sub_816AC04(u8 taskId) static void WallyHandleDrawPartyStatusSummary(void) { - if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) + if (gBattleResources->bufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { WallyBufferExecCompleted(); } else { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = 1; - gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]); + gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleResources->bufferA[gActiveBattler][4], gBattleResources->bufferA[gActiveBattler][1], gBattleResources->bufferA[gActiveBattler][2]); WallyBufferExecCompleted(); } } @@ -1529,8 +1530,8 @@ static void WallyHandleSpriteInvisibility(void) static void WallyHandleBattleAnimation(void) { - u8 animationId = gBattleBufferA[gActiveBattler][1]; - u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); + u8 animationId = gBattleResources->bufferA[gActiveBattler][1]; + u16 argument = gBattleResources->bufferA[gActiveBattler][2] | (gBattleResources->bufferA[gActiveBattler][3] << 8); if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument)) WallyBufferExecCompleted(); @@ -1550,7 +1551,7 @@ static void WallyHandleResetActionMoveSelection(void) static void WallyHandleCmd55(void) { - gBattleOutcome = gBattleBufferA[gActiveBattler][1]; + gBattleOutcome = gBattleResources->bufferA[gActiveBattler][1]; FadeOutMapMusic(5); BeginFastPaletteFade(3); WallyBufferExecCompleted(); @@ -1559,6 +1560,11 @@ static void WallyHandleCmd55(void) gBattlerControllerFuncs[gActiveBattler] = sub_80587B0; } +static void WallyHandleBattleDebug(void) +{ + WallyBufferExecCompleted(); +} + static void WallyCmdEnd(void) { } diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 3ebc5d3bd8..8399ce51d3 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -4,6 +4,7 @@ #include "battle_anim.h" #include "battle_controllers.h" #include "battle_message.h" +#include "battle_setup.h" #include "cable_club.h" #include "link.h" #include "link_rfu.h" @@ -59,7 +60,9 @@ void SetUpBattleVarsAndBirchZigzagoon(void) gBattleControllerExecFlags = 0; ClearBattleAnimationVars(); ClearBattleMonForms(); - BattleAI_HandleItemUseBeforeAISetup(0xF); + BattleAI_SetupItems(); + BattleAI_SetupFlags(); + BattleAI_SetupAIData(0xF); if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) { @@ -151,8 +154,16 @@ static void InitSinglePlayerBtlControllers(void) gBattlerPartyIndexes[0] = 0; gBattlerPartyIndexes[1] = 0; - gBattlerPartyIndexes[2] = 3; - gBattlerPartyIndexes[3] = 3; + if (BATTLE_TWO_VS_ONE_OPPONENT) + { + gBattlerPartyIndexes[2] = 3; + gBattlerPartyIndexes[3] = 1; + } + else + { + gBattlerPartyIndexes[2] = 3; + gBattlerPartyIndexes[3] = 3; + } } else if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) { @@ -663,14 +674,14 @@ static void PrepareBufferDataTransfer(u8 bufferId, u8 *data, u16 size) case 0: for (i = 0; i < size; i++) { - gBattleBufferA[gActiveBattler][i] = *data; + gBattleResources->bufferA[gActiveBattler][i] = *data; data++; } break; case 1: for (i = 0; i < size; i++) { - gBattleBufferB[gActiveBattler][i] = *data; + gBattleResources->bufferB[gActiveBattler][i] = *data; data++; } break; @@ -880,7 +891,7 @@ static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId) if (gBattleControllerExecFlags & gBitTable[battlerId]) return; - memcpy(gBattleBufferA[battlerId], &gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_DATA], blockSize); + memcpy(gBattleResources->bufferA[battlerId], &gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_DATA], blockSize); sub_803F850(battlerId); if (!(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER)) @@ -892,7 +903,7 @@ static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId) } break; case 1: - memcpy(gBattleBufferB[battlerId], &gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_DATA], blockSize); + memcpy(gBattleResources->bufferB[battlerId], &gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_DATA], blockSize); break; case 2: var = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_DATA]; @@ -1057,7 +1068,7 @@ void BtlController_EmitMoveAnimation(u8 bufferId, u16 move, u8 turnOfMove, u16 m sBattleBuffersTransferData[9] = (dmg & 0xFF000000) >> 24; sBattleBuffersTransferData[10] = friendship; sBattleBuffersTransferData[11] = multihit; - if (WEATHER_HAS_EFFECT2) + if (WEATHER_HAS_EFFECT) { sBattleBuffersTransferData[12] = gBattleWeather; sBattleBuffersTransferData[13] = (gBattleWeather & 0xFF00) >> 8; @@ -1514,3 +1525,9 @@ void BtlController_EmitCmd55(u8 bufferId, u8 battleOutcome) sBattleBuffersTransferData[5] = sBattleBuffersTransferData[4] = sub_81850DC(&sBattleBuffersTransferData[6]); PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, sBattleBuffersTransferData[4] + 6); } + +void BtlController_EmitDebugMenu(u8 bufferId) +{ + sBattleBuffersTransferData[0] = CONTROLLER_DEBUGMENU; + PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 1); +} diff --git a/src/battle_debug.c b/src/battle_debug.c new file mode 100644 index 0000000000..4cfd9be54b --- /dev/null +++ b/src/battle_debug.c @@ -0,0 +1,1679 @@ +#include "global.h" +#include "battle.h" +#include "battle_anim.h" +#include "battle_message.h" +#include "main.h" +#include "menu.h" +#include "menu_helpers.h" +#include "scanline_effect.h" +#include "palette.h" +#include "pokemon_icon.h" +#include "sprite.h" +#include "item.h" +#include "task.h" +#include "bg.h" +#include "gpu_regs.h" +#include "window.h" +#include "text.h" +#include "text_window.h" +#include "international_string_util.h" +#include "strings.h" +#include "battle_ai_script_commands.h" +#include "list_menu.h" +#include "decompress.h" +#include "trainer_pokemon_sprites.h" +#include "malloc.h" +#include "string_util.h" +#include "util.h" +#include "data.h" +#include "reset_rtc_screen.h" +#include "reshow_battle_screen.h" +#include "constants/abilities.h" +#include "constants/moves.h" +#include "constants/items.h" +#include "constants/rgb.h" + +#define MAX_MODIFY_DIGITS 4 + +struct BattleDebugModifyArrows +{ + u8 arrowSpriteId[2]; + u16 minValue; + u16 maxValue; + int currValue; + u8 currentDigit; + u8 maxDigits; + u8 charDigits[MAX_MODIFY_DIGITS]; + void *modifiedValPtr; + u8 typeOfVal; +}; + +struct BattleDebugMenu +{ + u8 battlerId; + u8 battlerWindowId; + + u8 mainListWindowId; + u8 mainListTaskId; + u8 currentMainListItemId; + + u8 secondaryListWindowId; + u8 secondaryListTaskId; + u8 currentSecondaryListItemId; + u8 secondaryListItemCount; + + u8 modifyWindowId; + + u8 activeWindow; + + struct BattleDebugModifyArrows modifyArrows; + const struct BitfieldInfo *bitfield; + bool8 battlerWasChanged[MAX_BATTLERS_COUNT]; + + u8 aiBattlerId; + u8 aiViewState; + u8 aiIconSpriteIds[MAX_BATTLERS_COUNT]; + u8 aiMonSpriteId; + u8 aiMovesWindowId; +}; + +struct __attribute__((__packed__)) BitfieldInfo +{ + u8 bitsCount; + u8 currBit; +}; + +enum +{ + LIST_ITEM_MOVES, + LIST_ITEM_ABILITY, + LIST_ITEM_HELD_ITEM, + LIST_ITEM_PP, + LIST_ITEM_TYPES, + LIST_ITEM_STATS, + LIST_ITEM_STAT_STAGES, + LIST_ITEM_STATUS1, + LIST_ITEM_STATUS2, + LIST_ITEM_STATUS3, + LIST_ITEM_SIDE_STATUS, + LIST_ITEM_AI, + LIST_ITEM_AI_MOVES_PTS, + LIST_ITEM_VARIOUS, + LIST_ITEM_COUNT +}; + +enum +{ + ACTIVE_WIN_MAIN, + ACTIVE_WIN_SECONDARY, + ACTIVE_WIN_MODIFY +}; + +enum +{ + VAL_U8, + VAL_U16, + VAL_U32, + VAL_BITFIELD_8, + VAL_BITFIELD_16, + VAL_BITFIELD_32, + VAR_SIDE_STATUS, + VAR_SHOW_HP, + VAR_SUBSTITUTE, + VAR_IN_LOVE, + VAR_U16_4_ENTRIES, + VAL_S8, + VAL_ITEM, + VAL_ALL_STAT_STAGES, +}; + +enum +{ + LIST_SIDE_REFLECT, + LIST_SIDE_LIGHTSCREEN, + LIST_SIDE_SPIKES, + LIST_SIDE_SAFEGUARD, + LIST_SIDE_MIST, + LIST_SIDE_AURORA_VEIL, + LIST_SIDE_LUCKY_CHANT, + LIST_SIDE_TAILWIND, + LIST_SIDE_STEALTH_ROCK, + LIST_SIDE_TOXIC_SPIKES, + LIST_SIDE_STICKY_WEB, +}; + +enum +{ + VARIOUS_SHOW_HP, + VARIOUS_SUBSTITUTE_HP, + VARIOUS_IN_LOVE, +}; + +// const rom data +static const u8 sText_Ability[] = _("Ability"); +static const u8 sText_Moves[] = _("Moves"); +static const u8 sText_Stats[] = _("Stats"); +static const u8 sText_StatStages[] = _("Stat Stages"); +static const u8 sText_Status1[] = _("Status1"); +static const u8 sText_Status2[] = _("Status2"); +static const u8 sText_Status3[] = _("Status3"); +static const u8 sText_HeldItem[] = _("Held Item"); +static const u8 sText_SideStatus[] = _("Side Status"); +static const u8 sText_MaxHp[] = _("HP Max"); +static const u8 sText_CurrHp[] = _("HP Current"); +static const u8 sText_Freeze[] = _("Freeze"); +static const u8 sText_ToxicPoison[] = _("Toxic Poison"); +static const u8 sText_ToxicCounter[] = _("Toxic Counter"); +static const u8 sText_Flinch[] = _("Flinch"); +static const u8 sText_Uproar[] = _("Uproar"); +static const u8 sText_Bide[] = _("Bide"); +static const u8 sText_LockConfuse[] = _("Lock Confuse"); +static const u8 sText_MultipleTurns[] = _("MultipleTurns"); +static const u8 sText_FocusEnergy[] = _("Focus Energy"); +static const u8 sText_Transformed[] = _("Transformed"); +static const u8 sText_Recharge[] = _("Recharge"); +static const u8 sText_Rage[] = _("Rage"); +static const u8 sText_Substitute[] = _("Substitute"); +static const u8 sText_SubstituteHp[] = _("Substitute HP"); +static const u8 sText_DestinyBond[] = _("Destiny Bond"); +static const u8 sText_CantEscape[] = _("Cant Escape"); +static const u8 sText_Nightmare[] = _("Nightmare"); +static const u8 sText_Cursed[] = _("Cursed"); +static const u8 sText_Foresight[] = _("Foresighted"); +static const u8 sText_DefenseCurl[] = _("Def Curled"); +static const u8 sText_Tormented[] = _("Tormented"); +static const u8 sText_AlwaysHits[] = _("Sure Hit"); +static const u8 sText_ChargedUp[] = _("Charged Up"); +static const u8 sText_Rooted[] = _("Rooted"); +static const u8 sText_Yawned[] = _("Yawned"); +static const u8 sText_Minimized[] = _("Minimized"); +static const u8 sText_NoCrit[] = _("No Crit"); +static const u8 sText_Imprisoned[] = _("Imprison"); +static const u8 sText_Reflect[] = _("Reflect"); +static const u8 sText_LightScreen[] = _("Light Screen"); +static const u8 sText_Spikes[] = _("Spikes"); +static const u8 sText_Safeguard[] = _("Safeguard"); +static const u8 sText_Mist[] = _("Mist"); +static const u8 sText_ShowOpponentHP[] = _("Opponent Hp"); +static const u8 sText_Types[] = _("Types"); +static const u8 sText_GastroAcid[] = _("Gastro Acid"); +static const u8 sText_SmackDown[] = _("Smacked Down"); +static const u8 sText_MiracleEye[] = _("Miracle Eye"); +static const u8 sText_AquaRing[] = _("Aqua Ring"); +static const u8 sText_AuroraVeil[] = _("Aurora Veil"); +static const u8 sText_LuckyChant[] = _("Lucky Chant"); +static const u8 sText_Tailwind[] = _("Tailwind"); +static const u8 sText_PP[] = _("PP"); +static const u8 sText_StealthRock[] = _("Stealth Rock"); +static const u8 sText_ToxicSpikes[] = _("Toxic Spikes"); +static const u8 sText_StickyWeb[] = _("Sticky Web"); +static const u8 sText_AI[] = _("AI"); +static const u8 sText_NoBadMoves[] = _("No Bad Moves"); +static const u8 sText_Viability[] = _("Viability"); +static const u8 sText_TryFaint[] = _("Try Faint"); +static const u8 sText_SetUpFirstTurn[] = _("Setup 1 turn"); +static const u8 sText_Risky[] = _("Risky"); +static const u8 sText_StrongestMove[] = _("Most dmg move"); +static const u8 sText_Various[] = _("Various"); +static const u8 sText_ShowHP[] = _("Show HP"); +static const u8 sText_PreferBatonPass[] = _("Baton Pass"); +static const u8 sText_InDoubles[] = _("In Doubles"); +static const u8 sText_HpAware[] = _("HP aware"); +static const u8 sText_Unknown[] = _("Unknown"); +static const u8 sText_InLove[] = _("In Love"); +static const u8 sText_AIMovePts[] = _("AI Move Pts"); +static const u8 sText_EffectOverride[] = _("Effect Override"); + +static const u8 sText_EmptyString[] = _(""); + +static const struct BitfieldInfo sStatus1Bitfield[] = +{ + {/*Sleep*/ 3, 0}, + {/*Poison*/ 1, 3}, + {/*Burn*/ 1, 4}, + {/*Freeze*/ 1, 5}, + {/*Paralysis*/1, 6}, + {/*Toxic Poison*/ 1, 7}, + {/*Toxic Counter*/ 4, 8}, +}; + +static const struct BitfieldInfo sStatus2Bitfield[] = +{ + {/*Confusion*/ 3, 0}, + {/*Flinch*/ 1, 3}, + {/*Uproar*/ 3, 4}, + // Bit 7 is unused. + {/*Bide*/ 2, 8}, + {/*Lock Confuse*/ 2, 10}, + {/*Multiple Turns*/ 1, 12}, + // Wrap bits are omitted. Done in various. + // In Love bits are omitted. Done in various. + {/*Transformed*/ 1, 21}, + {/*Recharge*/ 1, 22}, + {/*Rage*/ 1, 23}, + {/*Substitute*/ 1, 24}, + {/*Destiny bond*/ 1, 25}, + {/*Can't escape*/ 1, 26}, + {/*Nightmares*/ 1, 27}, + {/*Cursed*/ 1, 28}, + {/*Foresighted*/ 1, 29}, + {/*Defense Curled*/ 1, 30}, + {/*Tormented*/ 1, 31}, +}; + +static const struct BitfieldInfo sStatus3Bitfield[] = +{ + {/*Always hits*/ 2, 4}, + //*Perish Song*/ 1, 5}, + // On Air 1, 6, + // Underground 1, 7, + {/*Minimized*/ 1, 8}, + {/*Charged Up*/ 1, 9}, + {/*Rooted*/ 1, 10}, + {/*Yawn*/ 2, 11}, + {/*Imprison*/ 1, 13}, + // Grudge 1, 14, + {/*No Crit*/ 1, 15}, + {/*Gastro Acid*/ 1, 16}, + // Embargo 1, 17, + // Underwater 1, 18, + // Intimidated Mons 1, 19, + // Traced 1, 20, + {/*Smacked Down*/ 1, 21}, + // Me First 1, 22, + // Telekinesis 1, 23, + // Phantom Force 1, 24}, + {/*Miracle Eyed*/ 1, 25}, + // Magnet Rise 1, 26, + // Heal Block 1, 27, + {/*Aqua Ring*/ 1, 28}, +}; + +static const struct BitfieldInfo sAIBitfield[] = +{ + {/*Check bad move*/ 1, 0}, + {/*Try To Faint*/ 1, 1}, + {/*Viability*/ 1, 2}, + {/*Set up first turn*/ 1, 3}, + {/*Risky*/ 1, 4}, + {/*Prefer Strongest Move*/ 1, 5}, + {/*Prefer Baton Pass*/ 1, 6}, + {/*In Doubles*/ 1, 7}, + {/*Hp aware*/ 1, 8}, + {/*Unknown*/ 1, 9}, +}; + + +static const struct ListMenuItem sMainListItems[] = +{ + {sText_Moves, LIST_ITEM_MOVES}, + {sText_Ability, LIST_ITEM_ABILITY}, + {sText_HeldItem, LIST_ITEM_HELD_ITEM}, + {sText_PP, LIST_ITEM_PP}, + {sText_Types, LIST_ITEM_TYPES}, + {sText_Stats, LIST_ITEM_STATS}, + {sText_StatStages, LIST_ITEM_STAT_STAGES}, + {sText_Status1, LIST_ITEM_STATUS1}, + {sText_Status2, LIST_ITEM_STATUS2}, + {sText_Status3, LIST_ITEM_STATUS3}, + {sText_SideStatus, LIST_ITEM_SIDE_STATUS}, + {sText_AI, LIST_ITEM_AI}, + {sText_AIMovePts, LIST_ITEM_AI_MOVES_PTS}, + {sText_Various, LIST_ITEM_VARIOUS}, +}; + +static const struct ListMenuItem sVariousListItems[] = +{ + {sText_ShowHP, VARIOUS_SHOW_HP}, + {sText_SubstituteHp, VARIOUS_SUBSTITUTE_HP}, + {sText_InLove, VARIOUS_IN_LOVE}, +}; + +static const struct ListMenuItem sAIListItems[] = +{ + {sText_NoBadMoves, 0}, + {sText_TryFaint, 1}, + {sText_Viability, 2}, + {sText_SetUpFirstTurn, 3}, + {sText_Risky, 4}, + {sText_StrongestMove, 5}, + {sText_PreferBatonPass, 6}, + {sText_InDoubles, 7}, + {sText_HpAware, 8}, + // {sText_Unknown, 9}, +}; + +static const struct ListMenuItem sStatsListItems[] = +{ + {sText_CurrHp, 0}, + {sText_MaxHp, 1}, + {gText_Attack, 2}, + {gText_Defense, 3}, + {gText_Speed, 4}, + {gText_SpAtk, 5}, + {gText_SpDef, 6}, +}; + +static const struct ListMenuItem sStatus1ListItems[] = +{ + {gText_Sleep, 0}, + {gText_Poison, 1}, + {gText_Burn, 2}, + {sText_Freeze, 3}, + {gText_Paralysis, 4}, + {sText_ToxicPoison, 5}, + {sText_ToxicCounter, 6}, +}; + +static const struct ListMenuItem sStatus2ListItems[] = +{ + {gText_Confusion, 0}, + {sText_Flinch, 1}, + {sText_Uproar, 2}, + {sText_Bide, 3}, + {sText_LockConfuse, 4}, + {sText_MultipleTurns, 5}, + {sText_FocusEnergy, 6}, + {sText_Recharge, 7}, + {sText_Rage, 8}, + {sText_Substitute, 9}, + {sText_DestinyBond, 10}, + {sText_CantEscape, 11}, + {sText_Nightmare, 12}, + {sText_Cursed, 13}, + {sText_Foresight, 14}, + {sText_DefenseCurl, 15}, + {sText_Tormented, 16}, +}; + +static const struct ListMenuItem sStatus3ListItems[] = +{ + {sText_AlwaysHits, 0}, + {sText_Minimized, 1}, + {sText_ChargedUp, 2}, + {sText_Rooted, 3}, + {sText_Yawned, 4}, + {sText_Imprisoned, 5}, + {sText_NoCrit, 6}, + {sText_GastroAcid, 7}, + {sText_SmackDown, 8}, + {sText_MiracleEye, 9}, + {sText_AquaRing, 10}, +}; + +static const struct ListMenuItem sSideStatusListItems[] = +{ + {sText_Reflect, LIST_SIDE_REFLECT}, + {sText_LightScreen, LIST_SIDE_LIGHTSCREEN}, + {sText_Spikes, LIST_SIDE_SPIKES}, + {sText_Safeguard, LIST_SIDE_SAFEGUARD}, + {sText_Mist, LIST_SIDE_MIST}, + {sText_AuroraVeil, LIST_SIDE_AURORA_VEIL}, + {sText_LuckyChant, LIST_SIDE_LUCKY_CHANT}, + {sText_Tailwind, LIST_SIDE_TAILWIND}, + {sText_StealthRock, LIST_SIDE_STEALTH_ROCK}, + {sText_ToxicSpikes, LIST_SIDE_TOXIC_SPIKES}, + {sText_StickyWeb, LIST_SIDE_STICKY_WEB}, +}; + +static const struct ListMenuItem sSecondaryListItems[] = +{ + {sText_EmptyString, 0}, + {sText_EmptyString, 1}, + {sText_EmptyString, 2}, + {sText_EmptyString, 3}, + {sText_EmptyString, 4}, + {sText_EmptyString, 5}, + {sText_EmptyString, 6}, + {sText_EmptyString, 7}, + {sText_EmptyString, 8}, +}; + + +static const struct ListMenuTemplate sMainListTemplate = +{ + .items = sMainListItems, + .moveCursorFunc = NULL, + .itemPrintFunc = NULL, + .totalItems = ARRAY_COUNT(sMainListItems), + .maxShowed = 6, + .windowId = 0, + .header_X = 0, + .item_X = 8, + .cursor_X = 0, + .upText_Y = 1, + .cursorPal = 2, + .fillValue = 1, + .cursorShadowPal = 3, + .lettersSpacing = 1, + .itemVerticalPadding = 0, + .scrollMultiple = LIST_NO_MULTIPLE_SCROLL, + .fontId = 1, + .cursorKind = 0 +}; + +static const struct ListMenuTemplate sSecondaryListTemplate = +{ + .items = sSecondaryListItems, + .moveCursorFunc = NULL, + .itemPrintFunc = NULL, + .totalItems = 0, + .maxShowed = 0, + .windowId = 0, + .header_X = 0, + .item_X = 8, + .cursor_X = 0, + .upText_Y = 1, + .cursorPal = 2, + .fillValue = 1, + .cursorShadowPal = 3, + .lettersSpacing = 1, + .itemVerticalPadding = 0, + .scrollMultiple = LIST_NO_MULTIPLE_SCROLL, + .fontId = 1, + .cursorKind = 0 +}; + + +static const struct WindowTemplate sMainListWindowTemplate = +{ + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 3, + .width = 9, + .height = 12, + .paletteNum = 0xF, + .baseBlock = 0x2 +}; + +static const struct WindowTemplate sSecondaryListWindowTemplate = +{ + .bg = 0, + .tilemapLeft = 12, + .tilemapTop = 3, + .width = 10, + .height = 2, + .paletteNum = 0xF, + .baseBlock = 0xA0 +}; + +static const struct WindowTemplate sModifyWindowTemplate = +{ + .bg = 0, + .tilemapLeft = 25, + .tilemapTop = 2, + .width = 4, + .height = 2, + .paletteNum = 0xF, + .baseBlock = 0x200 +}; + +static const struct WindowTemplate sBattlerWindowTemplate = +{ + .bg = 0, + .tilemapLeft = 10, + .tilemapTop = 0, + .width = 14, + .height = 2, + .paletteNum = 0xF, + .baseBlock = 0x300 +}; + +static const struct BgTemplate sBgTemplates[] = +{ + { + .bg = 0, + .charBaseIndex = 0, + .mapBaseIndex = 31, + .screenSize = 0, + .paletteMode = 0, + .priority = 1, + .baseTile = 0 + }, + { + .bg = 1, + .charBaseIndex = 10, + .mapBaseIndex = 20, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0 + } +}; + +static const u8 sBitsToMaxDigit[] = +{ + [0] = 0, + [1] = 1, // max 1 + [2] = 1, // max 3 + [3] = 1, // max 7 + [4] = 2, // max 15 + [5] = 2, // max 31 + [6] = 2, // max 63 + [7] = 3, // max 127 + [8] = 3, // max 255 +}; + +static const bool8 sHasChangeableEntries[LIST_ITEM_COUNT] = +{ + [LIST_ITEM_MOVES] = TRUE, + [LIST_ITEM_AI_MOVES_PTS] = TRUE, + [LIST_ITEM_PP] = TRUE, + [LIST_ITEM_ABILITY] = TRUE, + [LIST_ITEM_TYPES] = TRUE, + [LIST_ITEM_HELD_ITEM] = TRUE, + [LIST_ITEM_STAT_STAGES] = TRUE, +}; + +static const u16 sBgColor[] = {RGB_WHITE}; + +// this file's functions +static void Task_DebugMenuFadeOut(u8 taskId); +static void Task_DebugMenuProcessInput(u8 taskId); +static void Task_DebugMenuFadeIn(u8 taskId); +static void PrintOnBattlerWindow(u8 windowId, u8 battlerId); +static void UpdateWindowsOnChangedBattler(struct BattleDebugMenu *data); +static void CreateSecondaryListMenu(struct BattleDebugMenu *data); +static void PrintSecondaryEntries(struct BattleDebugMenu *data); +static void DestroyModifyArrows(struct BattleDebugMenu *data); +static void PrintDigitChars(struct BattleDebugMenu *data); +static void SetUpModifyArrows(struct BattleDebugMenu *data); +static void UpdateBattlerValue(struct BattleDebugMenu *data); +static void UpdateMonData(struct BattleDebugMenu *data); +static u8 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus, bool32 statusTrue); +static bool32 TryMoveDigit(struct BattleDebugModifyArrows *modArrows, bool32 moveUp); +static void SwitchToDebugView(u8 taskId); + +// code +static struct BattleDebugMenu *GetStructPtr(u8 taskId) +{ + u8 *taskDataPtr = (u8*)(&gTasks[taskId].data[0]); + + return (struct BattleDebugMenu*)(T1_READ_PTR(taskDataPtr)); +} + +static void SetStructPtr(u8 taskId, void *ptr) +{ + u32 structPtr = (u32)(ptr); + u8 *taskDataPtr = (u8*)(&gTasks[taskId].data[0]); + + taskDataPtr[0] = structPtr >> 0; + taskDataPtr[1] = structPtr >> 8; + taskDataPtr[2] = structPtr >> 16; + taskDataPtr[3] = structPtr >> 24; +} + +static void MainCB2(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void VBlankCB(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void CB2_BattleDebugMenu(void) +{ + u8 taskId; + struct BattleDebugMenu *data; + + switch (gMain.state) + { + default: + case 0: + SetVBlankCallback(NULL); + gMain.state++; + break; + case 1: + ResetVramOamAndBgCntRegs(); + SetGpuReg(REG_OFFSET_DISPCNT, 0); + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); + ResetAllBgsCoordinates(); + FreeAllWindowBuffers(); + DeactivateAllTextPrinters(); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); + ShowBg(0); + ShowBg(1); + gMain.state++; + break; + case 2: + ResetPaletteFade(); + ScanlineEffect_Stop(); + ResetTasks(); + ResetSpriteData(); + gMain.state++; + break; + case 3: + LoadPalette(sBgColor, 0, 2); + LoadPalette(GetOverworldTextboxPalettePtr(), 0xf0, 16); + gMain.state++; + break; + case 4: + taskId = CreateTask(Task_DebugMenuFadeIn, 0); + data = AllocZeroed(sizeof(struct BattleDebugMenu)); + SetStructPtr(taskId, data); + + data->battlerId = gBattleStruct->debugBattler; + data->battlerWindowId = AddWindow(&sBattlerWindowTemplate); + PutWindowTilemap(data->battlerWindowId); + PrintOnBattlerWindow(data->battlerWindowId, data->battlerId); + + data->mainListWindowId = AddWindow(&sMainListWindowTemplate); + + gMultiuseListMenuTemplate = sMainListTemplate; + gMultiuseListMenuTemplate.windowId = data->mainListWindowId; + data->mainListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0); + + data->currentMainListItemId = 0; + data->activeWindow = ACTIVE_WIN_MAIN; + data->secondaryListTaskId = 0xFF; + CopyWindowToVram(data->mainListWindowId, 3); + gMain.state++; + break; + case 5: + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + SetVBlankCallback(VBlankCB); + SetMainCallback2(MainCB2); + return; + } +} + +static void PutMovesPointsText(struct BattleDebugMenu *data) +{ + u32 i, j, count; + u8 *text = malloc(0x50); + + FillWindowPixelBuffer(data->aiMovesWindowId, 0x11); + for (i = 0; i < MAX_MON_MOVES; i++) + { + text[0] = CHAR_SPACE; + StringCopy(text + 1, gMoveNames[gBattleMons[data->aiBattlerId].moves[i]]); + AddTextPrinterParameterized(data->aiMovesWindowId, 1, text, 0, i * 15, 0, NULL); + for (count = 0, j = 0; j < MAX_BATTLERS_COUNT; j++) + { + if (data->aiIconSpriteIds[j] == 0xFF) + continue; + ConvertIntToDecimalStringN(text, + gBattleStruct->aiFinalScore[data->aiBattlerId][gSprites[data->aiIconSpriteIds[j]].data[0]][i], + STR_CONV_MODE_RIGHT_ALIGN, 3); + AddTextPrinterParameterized(data->aiMovesWindowId, 1, text, 83 + count * 54, i * 15, 0, NULL); + count++; + } + } + + CopyWindowToVram(data->aiMovesWindowId, 3); + free(text); +} + +static void Task_ShowAiPoints(u8 taskId) +{ + u32 i, count; + struct WindowTemplate winTemplate; + struct BattleDebugMenu *data = GetStructPtr(taskId); + + switch (data->aiViewState) + { + case 0: + HideBg(0); + ShowBg(1); + + // Swap battler if it's player mon + data->aiBattlerId = data->battlerId; + while (!IsBattlerAIControlled(data->aiBattlerId)) + { + if (++data->aiBattlerId >= gBattlersCount) + data->aiBattlerId = 0; + } + + LoadMonIconPalettes(); + for (count = 0, i = 0; i < MAX_BATTLERS_COUNT; i++) + { + if (i != data->aiBattlerId && IsBattlerAlive(i)) + { + data->aiIconSpriteIds[i] = CreateMonIcon(gBattleMons[i].species, + SpriteCallbackDummy, + 95 + (count * 60), 17, 0, 0, FALSE); + gSprites[data->aiIconSpriteIds[i]].data[0] = i; // battler id + count++; + } + else + { + data->aiIconSpriteIds[i] = 0xFF; + } + } + data->aiMonSpriteId = CreateMonPicSprite_HandleDeoxys(gBattleMons[data->aiBattlerId].species, + gBattleMons[data->aiBattlerId].otId, + gBattleMons[data->aiBattlerId].personality, + TRUE, + 39, 130, 15, 0xFFFF); + data->aiViewState++; + break; + // Put text + case 1: + winTemplate = CreateWindowTemplate(1, 0, 4, 27, 14, 15, 0x200); + data->aiMovesWindowId = AddWindow(&winTemplate); + PutWindowTilemap(data->aiMovesWindowId); + PutMovesPointsText(data); + + data->aiViewState++; + break; + // Input + case 2: + if (gMain.newKeys & (SELECT_BUTTON | B_BUTTON)) + { + SwitchToDebugView(taskId); + HideBg(1); + ShowBg(0); + return; + } + break; + } +} + +static void SwitchToAiPointsView(u8 taskId) +{ + gTasks[taskId].func = Task_ShowAiPoints; + GetStructPtr(taskId)->aiViewState = 0; +} + +static void SwitchToDebugView(u8 taskId) +{ + u32 i; + struct BattleDebugMenu *data = GetStructPtr(taskId); + + FreeMonIconPalettes(); + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { + if (data->aiIconSpriteIds[i] != 0xFF) + FreeAndDestroyMonIconSprite(&gSprites[data->aiIconSpriteIds[i]]); + } + FreeAndDestroyMonPicSprite(data->aiMonSpriteId); + RemoveWindow(data->aiMovesWindowId); + + gTasks[taskId].func = Task_DebugMenuProcessInput; +} + +static void Task_DebugMenuFadeIn(u8 taskId) +{ + if (!gPaletteFade.active) + gTasks[taskId].func = Task_DebugMenuProcessInput; +} + +static void Task_DebugMenuProcessInput(u8 taskId) +{ + s32 listItemId = 0; + struct BattleDebugMenu *data = GetStructPtr(taskId); + + // Exit the menu. + if (gMain.newKeys & SELECT_BUTTON) + { + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_DebugMenuFadeOut; + return; + } + + // Try changing active battler. + if (gMain.newKeys & R_BUTTON) + { + if (data->battlerId++ == gBattlersCount - 1) + data->battlerId = 0; + UpdateWindowsOnChangedBattler(data); + } + else if (gMain.newKeys & L_BUTTON) + { + if (data->battlerId-- == 0) + data->battlerId = gBattlersCount - 1; + UpdateWindowsOnChangedBattler(data); + } + + // A main list item is active, handle input. + if (data->activeWindow == ACTIVE_WIN_MAIN) + { + listItemId = ListMenu_ProcessInput(data->mainListTaskId); + if (listItemId != LIST_CANCEL && listItemId != LIST_NOTHING_CHOSEN && listItemId < LIST_ITEM_COUNT) + { + if (listItemId == LIST_ITEM_AI_MOVES_PTS && gMain.newKeys & A_BUTTON) + { + SwitchToAiPointsView(taskId); + return; + } + data->currentMainListItemId = listItemId; + + // Create the secondary menu list. + CreateSecondaryListMenu(data); + PrintSecondaryEntries(data); + data->activeWindow = ACTIVE_WIN_SECONDARY; + } + } + // Secondary list is active, handle input. + else if (data->activeWindow == ACTIVE_WIN_SECONDARY) + { + listItemId = ListMenu_ProcessInput(data->secondaryListTaskId); + if (listItemId == LIST_CANCEL) + { + DestroyListMenuTask(data->secondaryListTaskId, NULL, NULL); + ClearStdWindowAndFrameToTransparent(data->secondaryListWindowId, TRUE); + RemoveWindow(data->secondaryListWindowId); + data->activeWindow = ACTIVE_WIN_MAIN; + data->secondaryListTaskId = 0xFF; + } + else if (listItemId != LIST_NOTHING_CHOSEN) + { + data->currentSecondaryListItemId = listItemId; + data->modifyWindowId = AddWindow(&sModifyWindowTemplate); + PutWindowTilemap(data->modifyWindowId); + CopyWindowToVram(data->modifyWindowId, 3); + SetUpModifyArrows(data); + PrintDigitChars(data); + data->activeWindow = ACTIVE_WIN_MODIFY; + } + } + // Handle value modifying. + else if (data->activeWindow == ACTIVE_WIN_MODIFY) + { + if (gMain.newKeys & (B_BUTTON | A_BUTTON)) + { + ClearStdWindowAndFrameToTransparent(data->modifyWindowId, TRUE); + RemoveWindow(data->modifyWindowId); + DestroyModifyArrows(data); + data->activeWindow = ACTIVE_WIN_SECONDARY; + } + else if (gMain.newKeys & DPAD_RIGHT) + { + if (data->modifyArrows.currentDigit != (data->modifyArrows.maxDigits - 1)) + { + data->modifyArrows.currentDigit++; + gSprites[data->modifyArrows.arrowSpriteId[0]].pos2.x += 6; + gSprites[data->modifyArrows.arrowSpriteId[1]].pos2.x += 6; + } + } + else if (gMain.newKeys & DPAD_LEFT) + { + if (data->modifyArrows.currentDigit != 0) + { + data->modifyArrows.currentDigit--; + gSprites[data->modifyArrows.arrowSpriteId[0]].pos2.x -= 6; + gSprites[data->modifyArrows.arrowSpriteId[1]].pos2.x -= 6; + } + } + else if (gMain.newKeys & DPAD_UP) + { + if (TryMoveDigit(&data->modifyArrows, TRUE)) + { + PrintDigitChars(data); + UpdateBattlerValue(data); + PrintSecondaryEntries(data); + } + } + else if (gMain.newKeys & DPAD_DOWN) + { + if (TryMoveDigit(&data->modifyArrows, FALSE)) + { + PrintDigitChars(data); + UpdateBattlerValue(data); + PrintSecondaryEntries(data); + } + } + } +} + +static void Task_DebugMenuFadeOut(u8 taskId) +{ + if (!gPaletteFade.active) + { + struct BattleDebugMenu *data = GetStructPtr(taskId); + DestroyListMenuTask(data->mainListTaskId, 0, 0); + if (data->secondaryListTaskId != 0xFF) + DestroyListMenuTask(data->secondaryListTaskId, 0, 0); + + FreeAllWindowBuffers(); + UpdateMonData(data); + gBattleStruct->debugBattler = data->battlerId; + Free(data); + DestroyTask(taskId); + SetMainCallback2(ReshowBattleScreenAfterMenu); + } +} + +static void PrintOnBattlerWindow(u8 windowId, u8 battlerId) +{ + u8 text[POKEMON_NAME_LENGTH + 10]; + + text[0] = CHAR_0 + battlerId; + text[1] = CHAR_SPACE; + text[2] = CHAR_HYPHEN; + text[3] = CHAR_SPACE; + StringCopy(&text[4], gBattleMons[battlerId].nickname); + + FillWindowPixelBuffer(windowId, 0x11); + AddTextPrinterParameterized(windowId, 1, text, 0, 0, 0, NULL); + CopyWindowToVram(windowId, 3); +} + +static void UpdateWindowsOnChangedBattler(struct BattleDebugMenu *data) +{ + PrintOnBattlerWindow(data->battlerWindowId, data->battlerId); + if (data->secondaryListTaskId != 0xFF) + { + DestroyListMenuTask(data->secondaryListTaskId, 0, 0); + RemoveWindow(data->secondaryListWindowId); + CreateSecondaryListMenu(data); + data->currentSecondaryListItemId = 0; + PrintSecondaryEntries(data); + } + if (data->activeWindow == ACTIVE_WIN_MODIFY) + { + DestroyModifyArrows(data); + SetUpModifyArrows(data); + PrintDigitChars(data); + } +} + + +static void CreateSecondaryListMenu(struct BattleDebugMenu *data) +{ + struct WindowTemplate winTemplate; + struct ListMenuTemplate listTemplate; + u8 itemsCount = 1; + + winTemplate = sSecondaryListWindowTemplate; + listTemplate = sSecondaryListTemplate; + + switch (data->currentMainListItemId) + { + case LIST_ITEM_ABILITY: + itemsCount = 1; + break; + case LIST_ITEM_HELD_ITEM: + itemsCount = 2; + break; + case LIST_ITEM_TYPES: + itemsCount = 3; + break; + case LIST_ITEM_MOVES: + itemsCount = 5; + break; + case LIST_ITEM_PP: + itemsCount = 4; + break; + case LIST_ITEM_STATS: + listTemplate.items = sStatsListItems; + itemsCount = ARRAY_COUNT(sStatsListItems); + break; + case LIST_ITEM_STAT_STAGES: + itemsCount = 8; + break; + case LIST_ITEM_STATUS1: + listTemplate.items = sStatus1ListItems; + itemsCount = ARRAY_COUNT(sStatus1ListItems); + data->bitfield = sStatus1Bitfield; + break; + case LIST_ITEM_STATUS2: + listTemplate.items = sStatus2ListItems; + itemsCount = ARRAY_COUNT(sStatus2ListItems); + data->bitfield = sStatus2Bitfield; + winTemplate.height = 1; + break; + case LIST_ITEM_STATUS3: + listTemplate.items = sStatus3ListItems; + itemsCount = ARRAY_COUNT(sStatus3ListItems); + data->bitfield = sStatus3Bitfield; + break; + case LIST_ITEM_AI: + listTemplate.items = sAIListItems; + itemsCount = ARRAY_COUNT(sAIListItems); + data->bitfield = sAIBitfield; + break; + case LIST_ITEM_VARIOUS: + listTemplate.items = sVariousListItems; + itemsCount = ARRAY_COUNT(sVariousListItems); + break; + case LIST_ITEM_SIDE_STATUS: + listTemplate.items = sSideStatusListItems; + itemsCount = ARRAY_COUNT(sSideStatusListItems); + break; + case LIST_ITEM_AI_MOVES_PTS: + return; + } + + data->secondaryListItemCount = itemsCount; + winTemplate.height *= itemsCount; + data->secondaryListWindowId = AddWindow(&winTemplate); + + listTemplate.totalItems = itemsCount; + listTemplate.maxShowed = itemsCount; + if (listTemplate.maxShowed > 7 && !sHasChangeableEntries[data->currentMainListItemId]) + listTemplate.maxShowed = 7; + listTemplate.windowId = data->secondaryListWindowId; + + data->secondaryListTaskId = ListMenuInit(&listTemplate, 0, 0); + CopyWindowToVram(data->secondaryListWindowId, 3); +} + +static void PadString(const u8 *src, u8 *dst) +{ + u32 i; + + for (i = 0; i < 17 && src[i] != EOS; i++) + dst[i] = src[i]; + + for (; i < 17; i++) + dst[i] = CHAR_SPACE; + + dst[i] = EOS; +} + +static const u8 sTextAll[] = _("All"); + +static void PrintSecondaryEntries(struct BattleDebugMenu *data) +{ + u8 text[20]; + s32 i; + struct TextPrinterTemplate printer; + u8 yMultiplier; + + // Do not print entries if they are not changing. + if (!sHasChangeableEntries[data->currentMainListItemId]) + return; + + yMultiplier = (GetFontAttribute(sSecondaryListTemplate.fontId, 1) + sSecondaryListTemplate.itemVerticalPadding); + + printer.windowId = data->secondaryListWindowId; + printer.fontId = 1; + printer.style = 0; + printer.letterSpacing = 0; + printer.lineSpacing = 1; + printer.fgColor = 2; + printer.bgColor = 1; + printer.shadowColor = 3; + printer.x = sSecondaryListTemplate.item_X; + printer.currentX = sSecondaryListTemplate.item_X; + printer.currentChar = text; + + switch (data->currentMainListItemId) + { + case LIST_ITEM_MOVES: + case LIST_ITEM_PP: + for (i = 0; i < 4; i++) + { + PadString(gMoveNames[gBattleMons[data->battlerId].moves[i]], text); + printer.currentY = printer.y = (i * yMultiplier) + sSecondaryListTemplate.upText_Y; + AddTextPrinter(&printer, 0, NULL); + } + // Allow changing all moves at once. Useful for testing in wild doubles. + if (data->currentMainListItemId == LIST_ITEM_MOVES) + { + PadString(sTextAll, text); + printer.currentY = printer.y = (i * yMultiplier) + sSecondaryListTemplate.upText_Y; + AddTextPrinter(&printer, 0, NULL); + } + break; + case LIST_ITEM_ABILITY: + PadString(gAbilityNames[gBattleMons[data->battlerId].ability], text); + printer.currentY = printer.y = sSecondaryListTemplate.upText_Y; + AddTextPrinter(&printer, 0, NULL); + break; + case LIST_ITEM_HELD_ITEM: + PadString(ItemId_GetName(gBattleMons[data->battlerId].item), text); + printer.currentY = printer.y = sSecondaryListTemplate.upText_Y; + AddTextPrinter(&printer, 0, NULL); + + PadString(sText_EffectOverride, text); + printer.fontId = 0; + printer.currentY = printer.y = sSecondaryListTemplate.upText_Y + yMultiplier; + AddTextPrinter(&printer, 0, NULL); + break; + case LIST_ITEM_TYPES: + for (i = 0; i < 3; i++) + { + u8 *types = &gBattleMons[data->battlerId].type1; + + PadString(gTypeNames[types[i]], text); + printer.currentY = printer.y = (i * yMultiplier) + sSecondaryListTemplate.upText_Y; + AddTextPrinter(&printer, 0, NULL); + } + break; + case LIST_ITEM_STAT_STAGES: + for (i = 0; i < NUM_BATTLE_STATS - 1; i++) + { + u8 *txtPtr = StringCopy(text, gStatNamesTable[STAT_ATK + i]); + txtPtr[0] = CHAR_SPACE; + if (gBattleMons[data->battlerId].statStages[STAT_ATK + i] >= 6) + { + txtPtr[1] = CHAR_PLUS; + txtPtr[2] = CHAR_0 + (gBattleMons[data->battlerId].statStages[STAT_ATK + i] - 6); + } + else + { + txtPtr[1] = CHAR_HYPHEN; + txtPtr[2] = CHAR_6 - (gBattleMons[data->battlerId].statStages[STAT_ATK + i]); + } + txtPtr[3] = EOS; + + PadString(text, text); + printer.currentY = printer.y = (i * yMultiplier) + sSecondaryListTemplate.upText_Y; + AddTextPrinter(&printer, 0, NULL); + } + // Allow changing all stat stages at once. + PadString(sTextAll, text); + printer.currentY = printer.y = (i * yMultiplier) + sSecondaryListTemplate.upText_Y; + AddTextPrinter(&printer, 0, NULL); + break; + } +} + +static void DestroyModifyArrows(struct BattleDebugMenu *data) +{ + FreeSpritePaletteByTag(gSpritePalette_RtcArrow.tag); + if (data->modifyArrows.arrowSpriteId[0] != 0xFF) + DestroySprite(&gSprites[data->modifyArrows.arrowSpriteId[0]]); + if (data->modifyArrows.arrowSpriteId[1] != 0xFF) + DestroySprite(&gSprites[data->modifyArrows.arrowSpriteId[1]]); +} + +static void PrintDigitChars(struct BattleDebugMenu *data) +{ + s32 i; + u8 text[MAX_MODIFY_DIGITS + 1]; + + for (i = 0; i < data->modifyArrows.maxDigits; i++) + text[i] = data->modifyArrows.charDigits[i]; + + text[i] = EOS; + + AddTextPrinterParameterized(data->modifyWindowId, 1, text, 3, 0, 0, NULL); +} + +static const u32 GetBitfieldToAndValue(u32 currBit, u32 bitsCount) +{ + u32 i; + u32 toAnd = 0; + + for (i = 0; i < bitsCount; i++) + toAnd |= (1 << (currBit + i)); + + return toAnd; +} + +static const u32 GetBitfieldValue(u32 value, u32 currBit, u32 bitsCount) +{ + return (value & (GetBitfieldToAndValue(currBit, bitsCount))) >> currBit; +} + +static void UpdateBattlerValue(struct BattleDebugMenu *data) +{ + u32 i; + switch (data->modifyArrows.typeOfVal) + { + case VAL_U8: + *(u8*)(data->modifyArrows.modifiedValPtr) = data->modifyArrows.currValue; + break; + case VAL_S8: + *(s8*)(data->modifyArrows.modifiedValPtr) = data->modifyArrows.currValue; + break; + case VAL_U16: + *(u16*)(data->modifyArrows.modifiedValPtr) = data->modifyArrows.currValue; + break; + case VAR_U16_4_ENTRIES: + ((u16*)(data->modifyArrows.modifiedValPtr))[0] = data->modifyArrows.currValue; + ((u16*)(data->modifyArrows.modifiedValPtr))[1] = data->modifyArrows.currValue; + ((u16*)(data->modifyArrows.modifiedValPtr))[2] = data->modifyArrows.currValue; + ((u16*)(data->modifyArrows.modifiedValPtr))[3] = data->modifyArrows.currValue; + break; + case VAL_ALL_STAT_STAGES: + for (i = 0; i < NUM_BATTLE_STATS; i++) + gBattleMons[data->battlerId].statStages[i] = data->modifyArrows.currValue; + break; + case VAL_U32: + *(u32*)(data->modifyArrows.modifiedValPtr) = data->modifyArrows.currValue; + break; + case VAL_BITFIELD_32: + *(u32*)(data->modifyArrows.modifiedValPtr) &= ~(GetBitfieldToAndValue(data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount)); + *(u32*)(data->modifyArrows.modifiedValPtr) |= (data->modifyArrows.currValue << data->bitfield[data->currentSecondaryListItemId].currBit); + break; + case VAR_SIDE_STATUS: + *GetSideStatusValue(data, TRUE, data->modifyArrows.currValue != 0) = data->modifyArrows.currValue; + break; + case VAR_SHOW_HP: + (*(struct BattleSpriteInfo*)(data->modifyArrows.modifiedValPtr)).hpNumbersNoBars = data->modifyArrows.currValue; + break; + case VAR_SUBSTITUTE: + *(u8*)(data->modifyArrows.modifiedValPtr) = data->modifyArrows.currValue; + if (*(u8*)(data->modifyArrows.modifiedValPtr) == 0) + { + gBattleMons[data->battlerId].status2 &= ~(STATUS2_SUBSTITUTE); + gBattleSpritesDataPtr->battlerData[data->battlerId].behindSubstitute = 0; + } + else + { + gBattleMons[data->battlerId].status2 |= STATUS2_SUBSTITUTE; + gBattleSpritesDataPtr->battlerData[data->battlerId].behindSubstitute = 1; + } + break; + case VAR_IN_LOVE: + if (data->modifyArrows.currValue) + { + if (IsBattlerAlive(BATTLE_OPPOSITE(data->battlerId))) + gBattleMons[data->battlerId].status2 |= STATUS2_INFATUATED_WITH(BATTLE_OPPOSITE(data->battlerId)); + else + gBattleMons[data->battlerId].status2 |= STATUS2_INFATUATED_WITH(BATTLE_PARTNER(BATTLE_OPPOSITE(data->battlerId))); + } + else + { + gBattleMons[data->battlerId].status2 &= ~(STATUS2_INFATUATION); + } + break; + case VAL_ITEM: + if (data->currentSecondaryListItemId == 0) + *(u16*)(data->modifyArrows.modifiedValPtr) = data->modifyArrows.currValue; + else if (data->currentSecondaryListItemId == 1) + gBattleStruct->debugHoldEffects[data->battlerId] = data->modifyArrows.currValue; + break; + } + data->battlerWasChanged[data->battlerId] = TRUE; +} + +static u32 CharDigitsToValue(u8 *charDigits, u8 maxDigits) +{ + s32 i; + u8 id = 0; + u32 newValue = 0; + u8 valueDigits[MAX_MODIFY_DIGITS]; + + for (i = 0; i < MAX_MODIFY_DIGITS; i++) + valueDigits[i] = charDigits[i] - CHAR_0; + + if (maxDigits >= MAX_MODIFY_DIGITS) + newValue += valueDigits[id++] * 1000; + if (maxDigits >= MAX_MODIFY_DIGITS - 1) + newValue += valueDigits[id++] * 100; + if (maxDigits >= MAX_MODIFY_DIGITS - 2) + newValue += valueDigits[id++] * 10; + if (maxDigits >= MAX_MODIFY_DIGITS - 3) + newValue += valueDigits[id++]; + + return newValue; +} + +static void ValueToCharDigits(u8 *charDigits, u32 newValue, u8 maxDigits) +{ + s32 i; + u8 valueDigits[MAX_MODIFY_DIGITS]; + u8 id = 0; + + if (maxDigits >= MAX_MODIFY_DIGITS) + valueDigits[id++] = newValue / 1000; + if (maxDigits >= MAX_MODIFY_DIGITS - 1) + valueDigits[id++] = (newValue % 1000) / 100; + if (maxDigits >= MAX_MODIFY_DIGITS - 2) + valueDigits[id++] = (newValue % 100) / 10; + if (maxDigits >= MAX_MODIFY_DIGITS - 3) + valueDigits[id++] = newValue % 10; + + for (i = 0; i < MAX_MODIFY_DIGITS; i++) + charDigits[i] = valueDigits[i] + CHAR_0; +} + +static u8 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus, bool32 statusTrue) +{ + struct SideTimer *sideTimer = &gSideTimers[GET_BATTLER_SIDE(data->battlerId)]; + + switch (data->currentSecondaryListItemId) + { + case LIST_SIDE_REFLECT: + if (changeStatus) + { + if (statusTrue) + *(u32*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_REFLECT; + else + *(u32*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_REFLECT); + sideTimer->reflectBattlerId = data->battlerId; + } + return &sideTimer->reflectTimer; + case LIST_SIDE_LIGHTSCREEN: + if (changeStatus) + { + if (statusTrue) + *(u32*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_LIGHTSCREEN; + else + *(u32*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_LIGHTSCREEN); + sideTimer->lightscreenBattlerId = data->battlerId; + } + return &sideTimer->lightscreenTimer; + case LIST_SIDE_SPIKES: + if (changeStatus) + { + if (statusTrue) + *(u32*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_SPIKES; + else + *(u32*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_SPIKES); + } + return &sideTimer->spikesAmount; + case LIST_SIDE_SAFEGUARD: + if (changeStatus) + { + if (statusTrue) + *(u32*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_SAFEGUARD; + else + *(u32*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_SAFEGUARD); + sideTimer->safeguardBattlerId = data->battlerId; + } + return &sideTimer->safeguardTimer; + case LIST_SIDE_MIST: + if (changeStatus) + { + if (statusTrue) + *(u32*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_MIST; + else + *(u32*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_MIST); + sideTimer->mistBattlerId = data->battlerId; + } + return &sideTimer->mistTimer; + case LIST_SIDE_AURORA_VEIL: + if (changeStatus) + { + if (statusTrue) + *(u32*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_AURORA_VEIL; + else + *(u32*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_AURORA_VEIL); + sideTimer->auroraVeilBattlerId = data->battlerId; + } + return &sideTimer->auroraVeilTimer; + case LIST_SIDE_LUCKY_CHANT: + if (changeStatus) + { + if (statusTrue) + *(u32*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_LUCKY_CHANT; + else + *(u32*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_LUCKY_CHANT); + sideTimer->luckyChantBattlerId = data->battlerId; + } + return &sideTimer->luckyChantTimer; + case LIST_SIDE_TAILWIND: + if (changeStatus) + { + if (statusTrue) + *(u32*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_TAILWIND; + else + *(u32*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_TAILWIND); + sideTimer->tailwindBattlerId = data->battlerId; + } + return &sideTimer->tailwindTimer; + case LIST_SIDE_STEALTH_ROCK: + if (changeStatus) + { + if (statusTrue) + *(u32*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_STEALTH_ROCK; + else + *(u32*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_STEALTH_ROCK); + } + return &sideTimer->stealthRockAmount; + case LIST_SIDE_TOXIC_SPIKES: + if (changeStatus) + { + if (statusTrue) + *(u32*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_TOXIC_SPIKES; + else + *(u32*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_TOXIC_SPIKES); + } + return &sideTimer->toxicSpikesAmount; + case LIST_SIDE_STICKY_WEB: + if (changeStatus) + { + if (statusTrue) + *(u32*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_STICKY_WEB; + else + *(u32*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_STICKY_WEB); + } + return &sideTimer->stickyWebAmount; + default: + return NULL; + } +} + +static void SetUpModifyArrows(struct BattleDebugMenu *data) +{ + LoadSpritePalette(&gSpritePalette_RtcArrow); + data->modifyArrows.arrowSpriteId[0] = CreateSprite(&gSpriteTemplate_RtcArrow, 207, 12, 0); + data->modifyArrows.arrowSpriteId[1] = CreateSprite(&gSpriteTemplate_RtcArrow, 207, 36, 0); + gSprites[data->modifyArrows.arrowSpriteId[1]].animNum = 1; + switch (data->currentMainListItemId) + { + case LIST_ITEM_ABILITY: + data->modifyArrows.minValue = 0; + data->modifyArrows.maxValue = ABILITIES_COUNT_GEN7 - 1; + data->modifyArrows.maxDigits = 3; + data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].ability; + data->modifyArrows.typeOfVal = VAL_U8; + data->modifyArrows.currValue = gBattleMons[data->battlerId].ability; + break; + case LIST_ITEM_MOVES: + data->modifyArrows.minValue = 0; + data->modifyArrows.maxValue = MOVES_COUNT_GEN7 - 1; + data->modifyArrows.maxDigits = 3; + if (data->currentSecondaryListItemId == 4) + { + data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].moves[0]; + data->modifyArrows.currValue = gBattleMons[data->battlerId].moves[0]; + data->modifyArrows.typeOfVal = VAR_U16_4_ENTRIES; + } + else + { + data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].moves[data->currentSecondaryListItemId]; + data->modifyArrows.currValue = gBattleMons[data->battlerId].moves[data->currentSecondaryListItemId]; + data->modifyArrows.typeOfVal = VAL_U16; + } + break; + case LIST_ITEM_PP: + data->modifyArrows.minValue = 0; + data->modifyArrows.maxValue = CalculatePPWithBonus(gBattleMons[data->battlerId].moves[data->currentSecondaryListItemId], gBattleMons[data->battlerId].ppBonuses, data->currentSecondaryListItemId); + data->modifyArrows.maxDigits = 2; + data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].pp[data->currentSecondaryListItemId]; + data->modifyArrows.typeOfVal = VAL_U8; + data->modifyArrows.currValue = gBattleMons[data->battlerId].pp[data->currentSecondaryListItemId]; + break; + case LIST_ITEM_HELD_ITEM: + data->modifyArrows.minValue = 0; + data->modifyArrows.maxValue = ITEMS_COUNT - 1; + data->modifyArrows.maxDigits = 3; + data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].item; + data->modifyArrows.typeOfVal = VAL_ITEM; + if (data->currentSecondaryListItemId == 0) + data->modifyArrows.currValue = gBattleMons[data->battlerId].item; + else + data->modifyArrows.currValue = gBattleStruct->debugHoldEffects[data->battlerId]; + break; + case LIST_ITEM_TYPES: + data->modifyArrows.minValue = 0; + data->modifyArrows.maxValue = NUMBER_OF_MON_TYPES - 1; + data->modifyArrows.maxDigits = 2; + data->modifyArrows.modifiedValPtr = (u8*)((&gBattleMons[data->battlerId].type1) + data->currentSecondaryListItemId); + data->modifyArrows.typeOfVal = VAL_U8; + data->modifyArrows.currValue = *(u8*)((&gBattleMons[data->battlerId].type1) + data->currentSecondaryListItemId); + break; + case LIST_ITEM_STATS: + data->modifyArrows.minValue = 0; + data->modifyArrows.maxValue = 9999; + data->modifyArrows.maxDigits = 4; + if (data->currentSecondaryListItemId == 0) + { + data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].hp; + data->modifyArrows.currValue = gBattleMons[data->battlerId].hp; + data->modifyArrows.minValue = 1; + data->modifyArrows.maxValue = gBattleMons[data->battlerId].maxHP; + } + else if (data->currentSecondaryListItemId == 1) + { + data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].maxHP; + data->modifyArrows.minValue = gBattleMons[data->battlerId].hp; + data->modifyArrows.currValue = gBattleMons[data->battlerId].maxHP; + } + else + { + data->modifyArrows.modifiedValPtr = (u16*)((&gBattleMons[data->battlerId].attack) + (data->currentSecondaryListItemId - 2)); + data->modifyArrows.currValue = *(u16*)((&gBattleMons[data->battlerId].attack) + (data->currentSecondaryListItemId - 2)); + } + data->modifyArrows.typeOfVal = VAL_U16; + break; + case LIST_ITEM_STAT_STAGES: + data->modifyArrows.minValue = 0; + data->modifyArrows.maxValue = 12; + data->modifyArrows.maxDigits = 2; + if (data->currentSecondaryListItemId == NUM_BATTLE_STATS - 1) // Change all stats + { + data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].statStages[STAT_ATK]; + data->modifyArrows.currValue = gBattleMons[data->battlerId].statStages[STAT_ATK]; + data->modifyArrows.typeOfVal = VAL_ALL_STAT_STAGES; + } + else + { + data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].statStages[data->currentSecondaryListItemId + STAT_ATK]; + data->modifyArrows.typeOfVal = VAL_U8; + data->modifyArrows.currValue = gBattleMons[data->battlerId].statStages[data->currentSecondaryListItemId + STAT_ATK]; + } + break; + case LIST_ITEM_VARIOUS: + if (data->currentSecondaryListItemId == VARIOUS_SHOW_HP) + { + data->modifyArrows.minValue = 0; + data->modifyArrows.maxValue = 1; + data->modifyArrows.maxDigits = 1; + data->modifyArrows.modifiedValPtr = &gBattleSpritesDataPtr->battlerData[data->battlerId]; + data->modifyArrows.typeOfVal = VAR_SHOW_HP; + data->modifyArrows.currValue = gBattleSpritesDataPtr->battlerData[data->battlerId].hpNumbersNoBars; + } + else if (data->currentSecondaryListItemId == VARIOUS_SUBSTITUTE_HP) + { + data->modifyArrows.minValue = 0; + data->modifyArrows.maxValue = 255; + data->modifyArrows.maxDigits = 3; + data->modifyArrows.modifiedValPtr = &gDisableStructs[data->battlerId].substituteHP; + data->modifyArrows.typeOfVal = VAR_SUBSTITUTE; + data->modifyArrows.currValue = gDisableStructs[data->battlerId].substituteHP; + } + else if (data->currentSecondaryListItemId == VARIOUS_IN_LOVE) + { + data->modifyArrows.minValue = 0; + data->modifyArrows.maxValue = 1; + data->modifyArrows.maxDigits = 1; + data->modifyArrows.modifiedValPtr = NULL; + data->modifyArrows.typeOfVal = VAR_IN_LOVE; + data->modifyArrows.currValue = (gBattleMons[data->battlerId].status2 & STATUS2_INFATUATION) != 0; + } + break; + case LIST_ITEM_STATUS1: + data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].status1; + data->modifyArrows.currValue = GetBitfieldValue(gBattleMons[data->battlerId].status1, data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount); + data->modifyArrows.typeOfVal = VAL_BITFIELD_32; + goto CASE_ITEM_STATUS; + case LIST_ITEM_STATUS2: + data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].status2; + data->modifyArrows.currValue = GetBitfieldValue(gBattleMons[data->battlerId].status2, data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount); + data->modifyArrows.typeOfVal = VAL_BITFIELD_32; + goto CASE_ITEM_STATUS; + case LIST_ITEM_STATUS3: + data->modifyArrows.modifiedValPtr = &gStatuses3[data->battlerId]; + data->modifyArrows.currValue = GetBitfieldValue(gStatuses3[data->battlerId], data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount); + data->modifyArrows.typeOfVal = VAL_BITFIELD_32; + goto CASE_ITEM_STATUS; + case LIST_ITEM_AI: + data->modifyArrows.modifiedValPtr = &gBattleResources->ai->aiFlags; + data->modifyArrows.currValue = GetBitfieldValue(gBattleResources->ai->aiFlags, data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount); + data->modifyArrows.typeOfVal = VAL_BITFIELD_32; + goto CASE_ITEM_STATUS; + CASE_ITEM_STATUS: + data->modifyArrows.minValue = 0; + data->modifyArrows.maxValue = (1 << data->bitfield[data->currentSecondaryListItemId].bitsCount) - 1; + data->modifyArrows.maxDigits = sBitsToMaxDigit[data->bitfield[data->currentSecondaryListItemId].bitsCount]; + break; + case LIST_ITEM_SIDE_STATUS: + data->modifyArrows.minValue = 0; + + if (data->currentSecondaryListItemId == LIST_SIDE_SPIKES) + data->modifyArrows.maxValue = 3; + else if (data->currentSecondaryListItemId == LIST_SIDE_STEALTH_ROCK || data->currentSecondaryListItemId == LIST_SIDE_STICKY_WEB) + data->modifyArrows.maxValue = 1; + else + data->modifyArrows.maxValue = 9; + + data->modifyArrows.maxDigits = 2; + data->modifyArrows.modifiedValPtr = &gSideStatuses[GET_BATTLER_SIDE(data->battlerId)]; + data->modifyArrows.typeOfVal = VAR_SIDE_STATUS; + data->modifyArrows.currValue = *GetSideStatusValue(data, FALSE, FALSE); + break; + } + + data->modifyArrows.currentDigit = 0; + ValueToCharDigits(data->modifyArrows.charDigits, data->modifyArrows.currValue, data->modifyArrows.maxDigits); +} + +static bool32 TryMoveDigit(struct BattleDebugModifyArrows *modArrows, bool32 moveUp) +{ + s32 i; + u8 charDigits[MAX_MODIFY_DIGITS]; + u32 newValue; + + for (i = 0; i < MAX_MODIFY_DIGITS; i++) + charDigits[i] = modArrows->charDigits[i]; + + if (moveUp) + { + if (charDigits[modArrows->currentDigit] == CHAR_9) + charDigits[modArrows->currentDigit] = CHAR_0; + else + charDigits[modArrows->currentDigit]++; + } + else + { + if (charDigits[modArrows->currentDigit] == CHAR_0) + charDigits[modArrows->currentDigit] = CHAR_9; + else + charDigits[modArrows->currentDigit]--; + } + + newValue = CharDigitsToValue(charDigits, modArrows->maxDigits); + if (newValue > modArrows->maxValue || newValue < modArrows->minValue) + { + return FALSE; + } + else + { + modArrows->currValue = newValue; + for (i = 0; i < MAX_MODIFY_DIGITS; i++) + modArrows->charDigits[i] = charDigits[i]; + return TRUE; + } +} + +static void UpdateMonData(struct BattleDebugMenu *data) +{ + s32 i, j; + + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { + if (data->battlerWasChanged[i]) + { + struct Pokemon *mon; + struct BattlePokemon *battleMon = &gBattleMons[i]; + + if (GetBattlerSide(i) == B_SIDE_PLAYER) + mon = &gPlayerParty[gBattlerPartyIndexes[i]]; + else + mon = &gEnemyParty[gBattlerPartyIndexes[i]]; + + SetMonData(mon, MON_DATA_HELD_ITEM, &battleMon->item); + SetMonData(mon, MON_DATA_STATUS, &battleMon->status1); + SetMonData(mon, MON_DATA_HP, &battleMon->hp); + SetMonData(mon, MON_DATA_MAX_HP, &battleMon->maxHP); + for (j = 0; j < 4; j++) + SetMonData(mon, MON_DATA_MOVE1 + j, &battleMon->moves[j]); + } + } +} diff --git a/src/battle_dome.c b/src/battle_dome.c index e504115a61..a5a7355dcf 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -2730,6 +2730,7 @@ static int SelectOpponentMonsFromParty(int *partyMovePoints, bool8 allowRandom) #define TYPE_x2 40 #define TYPE_x4 80 +// arg2 is either 2, a personality, or an OTID static int GetTypeEffectivenessPoints(int move, int targetSpecies, int arg2) { int defType1, defType2, defAbility, moveType; @@ -2751,25 +2752,15 @@ static int GetTypeEffectivenessPoints(int move, int targetSpecies, int arg2) } else { - while (TYPE_EFFECT_ATK_TYPE(i) != TYPE_ENDTABLE) - { - if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT) - { - i += 3; - continue; - } - if (TYPE_EFFECT_ATK_TYPE(i) == moveType) - { - // BUG: TYPE_x2 is not necessary and makes the condition always false if the ability is wonder guard. - if (TYPE_EFFECT_DEF_TYPE(i) == defType1) - if ((defAbility == ABILITY_WONDER_GUARD && TYPE_EFFECT_MULTIPLIER(i) == TYPE_x2) || defAbility != ABILITY_WONDER_GUARD) - typePower = typePower * TYPE_EFFECT_MULTIPLIER(i) / 10; - if (TYPE_EFFECT_DEF_TYPE(i) == defType2 && defType1 != defType2) - if ((defAbility == ABILITY_WONDER_GUARD && TYPE_EFFECT_MULTIPLIER(i) == TYPE_x2) || defAbility != ABILITY_WONDER_GUARD) - typePower = typePower * TYPE_EFFECT_MULTIPLIER(i) / 10; - } - i += 3; - } + u32 typeEffectiveness1 = UQ_4_12_TO_INT(GetTypeModifier(moveType, defType1) * 2) * 5; + u32 typeEffectiveness2 = UQ_4_12_TO_INT(GetTypeModifier(moveType, defType2) * 2) * 5; + + typePower = (typeEffectiveness1 * typePower) / 10; + if (defType2 != defType1) + typePower = (typeEffectiveness2 * typePower) / 10; + + if (defAbility == ABILITY_WONDER_GUARD && typeEffectiveness1 != 20 && typeEffectiveness2 != 20) + typePower = 0; } switch (arg2) @@ -4533,7 +4524,6 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTourneyId) // If 2 good stats have been found already, choose which to use if (i == 2) { - if (allocatedArray[6] < allocatedArray[k]) { if (allocatedArray[7] < allocatedArray[k]) @@ -5164,28 +5154,28 @@ static u16 GetWinningMove(int winnerTournamentId, int loserTournamentId, u8 roun for (k = 0; k < FRONTIER_PARTY_SIZE; k++) { - u32 var = 0; - u16 targetSpecies = SPECIES_NONE; - u16 targetAbility = ABILITY_NONE; + u32 personality = 0; + u32 targetSpecies = 0; + u32 targetAbility = 0; + u32 typeMultiplier = 0; do { - var = Random32(); - } while (gFacilityTrainerMons[DOME_MONS[loserTournamentId][k]].nature != GetNatureFromPersonality(var)); + personality = Random32(); + } while (gFacilityTrainerMons[DOME_MONS[loserTournamentId][k]].nature != GetNatureFromPersonality(personality)); targetSpecies = gFacilityTrainerMons[DOME_MONS[loserTournamentId][k]].species; - if (var & 1) + + if (personality & 1) targetAbility = gBaseStats[targetSpecies].abilities[1]; else targetAbility = gBaseStats[targetSpecies].abilities[0]; - var = AI_TypeCalc(moveIds[i * MAX_MON_MOVES + j], targetSpecies, targetAbility); - if (var & MOVE_RESULT_NOT_VERY_EFFECTIVE && var & MOVE_RESULT_SUPER_EFFECTIVE) - moveScores[i * MAX_MON_MOVES + j] += movePower; - else if (var & MOVE_RESULT_NO_EFFECT) + typeMultiplier = CalcPartyMonTypeEffectivenessMultiplier(moveIds[i * 4 + j], targetSpecies, targetAbility); + if (typeMultiplier == UQ_4_12(0)) moveScores[i * MAX_MON_MOVES + j] += 0; - else if (var & MOVE_RESULT_SUPER_EFFECTIVE) + else if (typeMultiplier >= UQ_4_12(2)) moveScores[i * MAX_MON_MOVES + j] += movePower * 2; - else if (var & MOVE_RESULT_NOT_VERY_EFFECTIVE) + else if (typeMultiplier <= UQ_4_12(0.5)) moveScores[i * MAX_MON_MOVES + j] += movePower / 2; else moveScores[i * MAX_MON_MOVES + j] += movePower; diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index d044f2fbdf..72bdd8149d 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -22,6 +22,7 @@ #include "palette.h" #include "contest.h" #include "constants/songs.h" +#include "constants/battle_config.h" #include "constants/rgb.h" #include "constants/battle_palace.h" @@ -113,7 +114,7 @@ u16 ChooseMoveAndTargetInBattlePalace(void) { s32 i, var1, var2; s32 chosenMoveId = -1; - struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBattler][4]); + struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleResources->bufferA[gActiveBattler][4]); u8 unusableMovesBits = CheckMoveLimitations(gActiveBattler, 0, 0xFF); s32 percent = Random() % 100; @@ -138,7 +139,7 @@ u16 ChooseMoveAndTargetInBattlePalace(void) // Each nature has a different percent chance to select a move from one of 3 move groups // If percent is less than 1st check, use move from "Attack" group // If percent is less than 2nd check, use move from "Defense" group - // Otherwise use move from "Support" group + // Otherwise use move from "Support" group for (; i < maxGroupNum; i++) { if (gBattlePalaceNatureToMoveGroupLikelihood[GetNatureFromPersonality(gBattleMons[gActiveBattler].personality)][i] > percent) @@ -195,7 +196,7 @@ u16 ChooseMoveAndTargetInBattlePalace(void) if ((validMoveFlags & 0xF0) > 0x1FF) numValidMoveGroups++; - + // If more than 1 possible move group, or no possible move groups // then choose move randomly if (numValidMoveGroups > 1 || numValidMoveGroups == 0) @@ -242,7 +243,7 @@ u16 ChooseMoveAndTargetInBattlePalace(void) if (moveInfo->moves[chosenMoveId] == MOVE_CURSE) { - if (moveInfo->monType1 != TYPE_GHOST && moveInfo->monType2 != TYPE_GHOST) + if (moveInfo->monType1 != TYPE_GHOST && moveInfo->monType2 != TYPE_GHOST && moveInfo->monType3 != TYPE_GHOST) moveTarget = MOVE_TARGET_USER; else moveTarget = MOVE_TARGET_SELECTED; @@ -450,6 +451,12 @@ bool8 TryHandleLaunchBattleTableAnimation(u8 activeBattler, u8 atkBattler, u8 de return TRUE; } + if (tableId == B_ANIM_ILLUSION_OFF) + { + gBattleStruct->illusion[activeBattler].broken = 1; + gBattleStruct->illusion[activeBattler].on = 0; + } + gBattleAnimAttacker = atkBattler; gBattleAnimTarget = defBattler; gBattleSpritesDataPtr->animationData->animArg = argument; @@ -518,7 +525,10 @@ 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) { - return FALSE; + if (moveId >= (MOVES_COUNT - 1)) + return TRUE; + else + return FALSE; } bool8 mplay_80342A4(u8 battlerId) @@ -543,16 +553,15 @@ bool8 mplay_80342A4(u8 battlerId) return TRUE; } -void BattleLoadOpponentMonSpriteGfx(struct Pokemon *mon, u8 battlerId) +static void BattleLoadMonSpriteGfx(struct Pokemon *mon, u32 battlerId, bool32 opponent) { - u32 monsPersonality, currentPersonality, otId; - u16 species; - u8 position; - u16 paletteOffset; + u32 monsPersonality, currentPersonality, otId, species, paletteOffset, position; const void *lzPaletteData; + struct Pokemon *illusionMon = GetIllusionMonPtr(battlerId); + if (illusionMon != NULL) + mon = illusionMon; monsPersonality = GetMonData(mon, MON_DATA_PERSONALITY); - if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies == SPECIES_NONE) { species = GetMonData(mon, MON_DATA_SPECIES); @@ -566,9 +575,27 @@ void BattleLoadOpponentMonSpriteGfx(struct Pokemon *mon, u8 battlerId) otId = GetMonData(mon, MON_DATA_OT_ID); position = GetBattlerPosition(battlerId); - HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], + if (opponent) + { + HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[position], species, currentPersonality); + } + else + { + if (sub_80688F8(1, battlerId) == 1 || gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE) + { + HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[species], + gMonSpritesGfxPtr->sprites[position], + species, currentPersonality); + } + else + { + HandleLoadSpecialPokePic(&gMonBackPicTable[species], + gMonSpritesGfxPtr->sprites[position], + species, currentPersonality); + } + } paletteOffset = 0x100 + battlerId * 16; @@ -581,7 +608,7 @@ void BattleLoadOpponentMonSpriteGfx(struct Pokemon *mon, u8 battlerId) LoadPalette(gDecompressionBuffer, paletteOffset, 0x20); LoadPalette(gDecompressionBuffer, 0x80 + battlerId * 16, 0x20); - if (species == SPECIES_CASTFORM) + if (species == SPECIES_CASTFORM || species == SPECIES_CHERRIM) { paletteOffset = 0x100 + battlerId * 16; LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[0]); @@ -596,71 +623,14 @@ void BattleLoadOpponentMonSpriteGfx(struct Pokemon *mon, u8 battlerId) } } +void BattleLoadOpponentMonSpriteGfx(struct Pokemon *mon, u8 battlerId) +{ + BattleLoadMonSpriteGfx(mon, battlerId, TRUE); +} + void BattleLoadPlayerMonSpriteGfx(struct Pokemon *mon, u8 battlerId) { - u32 monsPersonality, currentPersonality, otId; - u16 species; - u8 position; - u16 paletteOffset; - const void *lzPaletteData; - - monsPersonality = GetMonData(mon, MON_DATA_PERSONALITY); - - if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies == SPECIES_NONE) - { - species = GetMonData(mon, MON_DATA_SPECIES); - currentPersonality = monsPersonality; - } - else - { - species = gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies; - currentPersonality = gTransformedPersonalities[battlerId]; - } - - otId = GetMonData(mon, MON_DATA_OT_ID); - position = GetBattlerPosition(battlerId); - - if (sub_80688F8(1, battlerId) == 1 || gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE) - { - HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[species], - gMonSpritesGfxPtr->sprites[position], - species, currentPersonality); - } - else - { - HandleLoadSpecialPokePic(&gMonBackPicTable[species], - gMonSpritesGfxPtr->sprites[position], - species, currentPersonality); - } - - paletteOffset = 0x100 + battlerId * 16; - - if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies == SPECIES_NONE) - lzPaletteData = GetMonFrontSpritePal(mon); - else - lzPaletteData = GetMonSpritePalFromSpeciesAndPersonality(species, otId, monsPersonality); - - LZDecompressWram(lzPaletteData, gDecompressionBuffer); - LoadPalette(gDecompressionBuffer, paletteOffset, 0x20); - LoadPalette(gDecompressionBuffer, 0x80 + battlerId * 16, 0x20); - - if (species == SPECIES_CASTFORM) - { - paletteOffset = 0x100 + battlerId * 16; - LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[0]); - LoadPalette(gBattleStruct->castformPalette[gBattleMonForms[battlerId]], paletteOffset, 0x20); - } - - // transform's pink color - if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE) - { - BlendPalette(paletteOffset, 16, 6, RGB_WHITE); - CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32); - } -} - -void nullsub_23(void) -{ + BattleLoadMonSpriteGfx(mon, battlerId, FALSE); } void nullsub_24(u16 species) @@ -885,13 +855,54 @@ void CopyBattleSpriteInvisibility(u8 battlerId) gBattleSpritesDataPtr->battlerData[battlerId].invisible = gSprites[gBattlerSpriteIds[battlerId]].invisible; } -void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool8 notTransform) +void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool8 notTransform, bool32 megaEvo) { - u16 paletteOffset; - u32 personalityValue; - u32 otId; - u8 position; - const u32 *lzPaletteData; + u32 personalityValue, otId, position, paletteOffset, targetSpecies; + const void *lzPaletteData, *src; + void *dst; + + if (IsContest()) + { + position = 0; + targetSpecies = gContestResources->moveAnim->targetSpecies; + personalityValue = gContestResources->moveAnim->personality; + otId = gContestResources->moveAnim->otId; + + HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[targetSpecies], + gMonSpritesGfxPtr->sprites[0], + targetSpecies, + gContestResources->moveAnim->targetPersonality); + } + else + { + position = GetBattlerPosition(battlerAtk); + + if (GetBattlerSide(battlerDef) == B_SIDE_OPPONENT) + targetSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerDef]], MON_DATA_SPECIES); + else + targetSpecies = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerDef]], MON_DATA_SPECIES); + + if (GetBattlerSide(battlerAtk) == B_SIDE_PLAYER) + { + personalityValue = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_PERSONALITY); + otId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_OT_ID); + + HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[targetSpecies], + gMonSpritesGfxPtr->sprites[position], + targetSpecies, + gTransformedPersonalities[battlerAtk]); + } + else + { + personalityValue = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_PERSONALITY); + otId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_OT_ID); + + HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[targetSpecies], + gMonSpritesGfxPtr->sprites[position], + targetSpecies, + gTransformedPersonalities[battlerAtk]); + } + } if (notTransform) { @@ -908,53 +919,6 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool8 notTransform } else { - const void *src; - void *dst; - u16 targetSpecies; - - if (IsContest()) - { - position = 0; - targetSpecies = gContestResources->moveAnim->targetSpecies; - personalityValue = gContestResources->moveAnim->personality; - otId = gContestResources->moveAnim->otId; - - HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[targetSpecies], - gMonSpritesGfxPtr->sprites[0], - targetSpecies, - gContestResources->moveAnim->targetPersonality); - } - else - { - position = GetBattlerPosition(battlerAtk); - - if (GetBattlerSide(battlerDef) == B_SIDE_OPPONENT) - targetSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerDef]], MON_DATA_SPECIES); - else - targetSpecies = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerDef]], MON_DATA_SPECIES); - - if (GetBattlerSide(battlerAtk) == B_SIDE_PLAYER) - { - personalityValue = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_PERSONALITY); - otId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_OT_ID); - - HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[targetSpecies], - gMonSpritesGfxPtr->sprites[position], - targetSpecies, - gTransformedPersonalities[battlerAtk]); - } - else - { - personalityValue = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_PERSONALITY); - otId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_OT_ID); - - HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[targetSpecies], - gMonSpritesGfxPtr->sprites[position], - targetSpecies, - gTransformedPersonalities[battlerAtk]); - } - } - src = gMonSpritesGfxPtr->sprites[position]; dst = (void *)(OBJ_VRAM0 + gSprites[gBattlerSpriteIds[battlerAtk]].oam.tileNum * 32); DmaCopy32(3, src, dst, 0x800); @@ -963,17 +927,20 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool8 notTransform LZDecompressWram(lzPaletteData, gDecompressionBuffer); LoadPalette(gDecompressionBuffer, paletteOffset, 32); - if (targetSpecies == SPECIES_CASTFORM) + if (targetSpecies == SPECIES_CASTFORM || targetSpecies == SPECIES_CHERRIM) { gSprites[gBattlerSpriteIds[battlerAtk]].anims = gMonFrontAnimsPtrTable[targetSpecies]; LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[0]); LoadPalette(gBattleStruct->castformPalette[0] + gBattleMonForms[battlerDef] * 16, paletteOffset, 32); } - BlendPalette(paletteOffset, 16, 6, RGB_WHITE); - CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32); + if (!megaEvo) + { + BlendPalette(paletteOffset, 16, 6, RGB_WHITE); + CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32); + } - if (!IsContest()) + if (!IsContest() && !megaEvo) { gBattleSpritesDataPtr->battlerData[battlerAtk].transformSpecies = targetSpecies; gBattleMonForms[battlerAtk] = gBattleMonForms[battlerDef]; diff --git a/src/battle_interface.c b/src/battle_interface.c index adbef019d8..e7cf26cff1 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -1,4 +1,5 @@ #include "global.h" +#include "malloc.h" #include "battle.h" #include "pokemon.h" #include "battle_controllers.h" @@ -22,18 +23,11 @@ #include "battle_anim.h" #include "constants/battle_anim.h" #include "constants/rgb.h" +#include "battle_debug.h" +#include "constants/battle_config.h" #include "data.h" #include "pokemon_summary_screen.h" -struct TestingBar -{ - s32 maxValue; - s32 oldValue; - s32 receivedValue; - u32 unkC_0:5; - u32 unk10; -}; - enum { // Corresponds to gHealthboxElementsGfxTable (and the tables after it) in graphics.c // These are indexes into the tables, which are filled with 8x8 square pixel data. @@ -190,12 +184,17 @@ static void SpriteCB_StatusSummaryBar(struct Sprite *sprite); static void SpriteCB_StatusSummaryBallsOnBattleStart(struct Sprite *sprite); static void SpriteCB_StatusSummaryBallsOnSwitchout(struct Sprite *sprite); +static void SpriteCb_MegaTrigger(struct Sprite *sprite); +static void SpriteCb_MegaIndicator(struct Sprite *sprite); + static u8 GetStatusIconForBattlerId(u8 statusElementId, u8 battlerId); static s32 CalcNewBarValue(s32 maxValue, s32 currValue, s32 receivedValue, s32 *arg3, u8 arg4, u16 arg5); static u8 GetScaledExpFraction(s32 currValue, s32 receivedValue, s32 maxValue, u8 scale); static void MoveBattleBarGraphically(u8 battlerId, u8 whichBar); static u8 CalcBarFilledPixels(s32 maxValue, s32 oldValue, s32 receivedValue, s32 *currValue, u8 *arg4, u8 scale); -static void sub_8074F88(struct TestingBar *barInfo, s32 *arg1, u16 *arg2); + +static void SpriteCb_AbilityPopUp(struct Sprite *sprite); +static void Task_FreeAbilityPopUpGfx(u8 taskId); // const rom data static const struct OamData sUnknown_0832C138 = @@ -327,150 +326,22 @@ static const struct SpriteTemplate sHealthbarSpriteTemplates[MAX_BATTLERS_COUNT] } }; -static const struct Subsprite sUnknown_0832C220[] = -{ - { - .x = 240, - .y = 0, - .shape = SPRITE_SHAPE(64x32), - .size = SPRITE_SIZE(64x32), - .tileOffset = 0, - .priority = 1 - }, - { - .x = 48, - .y = 0, - .shape = SPRITE_SHAPE(32x32), - .size = SPRITE_SIZE(32x32), - .tileOffset = 32, - .priority = 1 - }, - { - .x = 240, - .y = 32, - .shape = SPRITE_SHAPE(32x8), - .size = SPRITE_SIZE(32x8), - .tileOffset = 48, - .priority = 1 - }, - { - .x = 16, - .y = 32, - .shape = SPRITE_SHAPE(32x8), - .size = SPRITE_SIZE(32x8), - .tileOffset = 52, - .priority = 1 - }, - { - .x = 48, - .y = 32, - .shape = SPRITE_SHAPE(32x8), - .size = SPRITE_SIZE(32x8), - .tileOffset = 56, - .priority = 1 - } -}; - -static const struct Subsprite sUnknown_0832C234[] = -{ - { - .x = 240, - .y = 0, - .shape = SPRITE_SHAPE(64x32), - .size = SPRITE_SIZE(64x32), - .tileOffset = 64, - .priority = 1 - }, - { - .x = 48, - .y = 0, - .shape = SPRITE_SHAPE(32x32), - .size = SPRITE_SIZE(32x32), - .tileOffset = 96, - .priority = 1 - }, - { - .x = 240, - .y = 32, - .shape = SPRITE_SHAPE(32x8), - .size = SPRITE_SIZE(32x8), - .tileOffset = 112, - .priority = 1 - }, - { - .x = 16, - .y = 32, - .shape = SPRITE_SHAPE(32x8), - .size = SPRITE_SIZE(32x8), - .tileOffset = 116, - .priority = 1 - }, - { - .x = 48, - .y = 32, - .shape = SPRITE_SHAPE(32x8), - .size = SPRITE_SIZE(32x8), - .tileOffset = 120, - .priority = 1 - } -}; - -static const struct Subsprite sUnknown_0832C248[] = -{ - { - .x = 240, - .y = 0, - .shape = SPRITE_SHAPE(64x32), - .size = SPRITE_SIZE(64x32), - .tileOffset = 0, - .priority = 1 - }, - { - .x = 48, - .y = 0, - .shape = SPRITE_SHAPE(32x32), - .size = SPRITE_SIZE(32x32), - .tileOffset = 32, - .priority = 1 - } -}; - -static const struct Subsprite sUnknown_0832C250[] = -{ - { - .x = 240, - .y = 0, - .shape = SPRITE_SHAPE(64x32), - .size = SPRITE_SIZE(64x32), - .tileOffset = 0, - .priority = 1 - }, - { - .x = 48, - .y = 0, - .shape = SPRITE_SHAPE(32x32), - .size = SPRITE_SIZE(32x32), - .tileOffset = 32, - .priority = 1 - } -}; - static const struct Subsprite sUnknown_0832C258[] = { { - .x = 240, - .y = 0, - .shape = SPRITE_SHAPE(32x8), - .size = SPRITE_SIZE(32x8), - .tileOffset = 0, + .x = 240, + .y = 0, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 0, .priority = 1 }, { - .x = 16, - .y = 0, - .shape = SPRITE_SHAPE(32x8), - .size = SPRITE_SIZE(32x8), - .tileOffset = 4, + .x = 16, + .y = 0, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 4, .priority = 1 } }; @@ -478,40 +349,31 @@ static const struct Subsprite sUnknown_0832C258[] = static const struct Subsprite sUnknown_0832C260[] = { { - .x = 240, - .y = 0, - .shape = SPRITE_SHAPE(32x8), - .size = SPRITE_SIZE(32x8), - .tileOffset = 0, + .x = 240, + .y = 0, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 0, .priority = 1 }, { - .x = 16, - .y = 0, - .shape = SPRITE_SHAPE(32x8), - .size = SPRITE_SIZE(32x8), - .tileOffset = 4, + .x = 16, + .y = 0, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 4, .priority = 1 }, { - .x = 224, - .y = 0, - .shape = SPRITE_SHAPE(8x8), - .size = SPRITE_SIZE(8x8), - .tileOffset = 8, + .x = 224, + .y = 0, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .tileOffset = 8, .priority = 1 } }; -// unused subsprite table -static const struct SubspriteTable sUnknown_0832C26C[] = -{ - {ARRAY_COUNT(sUnknown_0832C220), sUnknown_0832C220}, - {ARRAY_COUNT(sUnknown_0832C248), sUnknown_0832C248}, - {ARRAY_COUNT(sUnknown_0832C234), sUnknown_0832C234}, - {ARRAY_COUNT(sUnknown_0832C250), sUnknown_0832C250} -}; - static const struct SubspriteTable sUnknown_0832C28C[] = { {ARRAY_COUNT(sUnknown_0832C258), sUnknown_0832C258}, @@ -521,35 +383,35 @@ static const struct SubspriteTable sUnknown_0832C28C[] = static const struct Subsprite sStatusSummaryBar_Subsprites_0[] = { { - .x = 160, - .y = 0, - .shape = SPRITE_SHAPE(32x8), - .size = SPRITE_SIZE(32x8), - .tileOffset = 0, + .x = 160, + .y = 0, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 0, .priority = 1 }, { - .x = 192, - .y = 0, - .shape = SPRITE_SHAPE(32x8), - .size = SPRITE_SIZE(32x8), - .tileOffset = 4, + .x = 192, + .y = 0, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 4, .priority = 1 }, { - .x = 224, - .y = 0, - .shape = SPRITE_SHAPE(32x8), - .size = SPRITE_SIZE(32x8), - .tileOffset = 8, + .x = 224, + .y = 0, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 8, .priority = 1 }, { - .x = 0, - .y = 0, - .shape = SPRITE_SHAPE(32x8), - .size = SPRITE_SIZE(32x8), - .tileOffset = 12, + .x = 0, + .y = 0, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 12, .priority = 1 } }; @@ -557,51 +419,51 @@ static const struct Subsprite sStatusSummaryBar_Subsprites_0[] = static const struct Subsprite sUnknown_0832C2AC[] = { { - .x = 160, - .y = 0, - .shape = SPRITE_SHAPE(32x8), - .size = SPRITE_SIZE(32x8), - .tileOffset = 0, + .x = 160, + .y = 0, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 0, .priority = 1 }, { - .x = 192, - .y = 0, - .shape = SPRITE_SHAPE(32x8), - .size = SPRITE_SIZE(32x8), - .tileOffset = 4, + .x = 192, + .y = 0, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 4, .priority = 1 }, { - .x = 224, - .y = 0, - .shape = SPRITE_SHAPE(32x8), - .size = SPRITE_SIZE(32x8), - .tileOffset = 8, + .x = 224, + .y = 0, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 8, .priority = 1 }, { - .x = 0, - .y = 0, - .shape = SPRITE_SHAPE(32x8), - .size = SPRITE_SIZE(32x8), - .tileOffset = 8, + .x = 0, + .y = 0, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 8, .priority = 1 }, { - .x = 32, - .y = 0, - .shape = SPRITE_SHAPE(32x8), - .size = SPRITE_SIZE(32x8), - .tileOffset = 8, + .x = 32, + .y = 0, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 8, .priority = 1 }, { - .x = 64, - .y = 0, - .shape = SPRITE_SHAPE(32x8), - .size = SPRITE_SIZE(32x8), - .tileOffset = 12, + .x = 64, + .y = 0, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 12, .priority = 1 } }; @@ -616,9 +478,6 @@ static const struct SubspriteTable sUnknown_0832C2CC[] = {ARRAY_COUNT(sUnknown_0832C2AC), sUnknown_0832C2AC} }; -// unused unknown image -static const u8 sUnknown_0832C2D4[] = INCBIN_U8("graphics/battle_interface/unknown_32C2D4.4bpp"); - static const struct CompressedSpriteSheet sStatusSummaryBarSpriteSheet = { gBattleInterface_BallStatusBarGfx, 0x200, TAG_STATUS_SUMMARY_BAR_TILE @@ -639,24 +498,6 @@ static const struct SpriteSheet sStatusSummaryBallsSpriteSheet = gBattleInterface_BallDisplayGfx, 0x80, TAG_STATUS_SUMMARY_BALLS_TILE }; -// unused oam data -static const struct OamData sUnknown_0832C354 = -{ - .y = 0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .mosaic = 0, - .bpp = ST_OAM_4BPP, - .shape = SPRITE_SHAPE(64x32), - .x = 0, - .matrixNum = 0, - .size = SPRITE_SIZE(64x32), - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; - static const struct OamData sOamData_StatusSummaryBalls = { .y = 0, @@ -754,92 +595,107 @@ static const u16 sStatusIconColors[] = static const struct WindowTemplate sHealthboxWindowTemplate = {0, 0, 0, 8, 2, 0, 0}; // width = 8, height = 2 +static const u8 sMegaTriggerGfx[] = INCBIN_U8("graphics/battle_interface/mega_trigger.4bpp"); +static const u16 sMegaTriggerPal[] = INCBIN_U16("graphics/battle_interface/mega_trigger.gbapal"); + +static const struct SpriteSheet sSpriteSheet_MegaTrigger = +{ + sMegaTriggerGfx, sizeof(sMegaTriggerGfx), TAG_MEGA_TRIGGER_TILE +}; +static const struct SpritePalette sSpritePalette_MegaTrigger = +{ + sMegaTriggerPal, TAG_MEGA_TRIGGER_PAL +}; + +static const struct OamData sOamData_MegaTrigger = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = ST_OAM_SQUARE, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sSpriteAnim_MegaTriggerOff[] = +{ + ANIMCMD_FRAME(0, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_MegaTriggerOn[] = +{ + ANIMCMD_FRAME(16, 0), + ANIMCMD_END +}; + +static const union AnimCmd *const sSpriteAnimTable_MegaTrigger[] = +{ + sSpriteAnim_MegaTriggerOff, + sSpriteAnim_MegaTriggerOn, +}; + +static const struct SpriteTemplate sSpriteTemplate_MegaTrigger = +{ + .tileTag = TAG_MEGA_TRIGGER_TILE, + .paletteTag = TAG_MEGA_TRIGGER_PAL, + .oam = &sOamData_MegaTrigger, + .anims = sSpriteAnimTable_MegaTrigger, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCb_MegaTrigger +}; + +static const u8 sMegaIndicatorGfx[] = INCBIN_U8("graphics/battle_interface/mega_indicator.4bpp"); +static const u16 sMegaIndicatorPal[] = INCBIN_U16("graphics/battle_interface/mega_indicator.gbapal"); + +static const struct SpriteSheet sSpriteSheet_MegaIndicator = +{ + sMegaIndicatorGfx, sizeof(sMegaIndicatorGfx), TAG_MEGA_INDICATOR_TILE +}; +static const struct SpritePalette sSpritePalette_MegaIndicator = +{ + sMegaIndicatorPal, TAG_MEGA_INDICATOR_PAL +}; + +static const struct OamData sOamData_MegaIndicator = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = SPRITE_SHAPE(16x16), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(16x16), + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct SpriteTemplate sSpriteTemplate_MegaIndicator = +{ + .tileTag = TAG_MEGA_INDICATOR_TILE, + .paletteTag = TAG_MEGA_INDICATOR_PAL, + .oam = &sOamData_MegaIndicator, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCb_MegaIndicator, +}; + + // code -static s32 DummiedOutFunction(s16 unused1, s16 unused2, s32 unused3) -{ - return 9; -} -void sub_8072308(s16 number, u16 *dest, bool8 unk) -{ - s8 i, j; - u8 buff[4]; - - for (i = 0; i < 4; i++) - { - buff[i] = 0; - } - - for (i = 3; ; i--) - { - if (number > 0) - { - buff[i] = number % 10; - number /= 10; - } - else - { - for (; i > -1; i--) - { - buff[i] = 0xFF; - } - if (buff[3] == 0xFF) - buff[3] = 0; - break; - } - } - - if (!unk) - { - for (i = 0, j = 0; i < 4; i++) - { - if (buff[j] == 0xFF) - { - dest[j + 0x00] &= 0xFC00; - dest[j + 0x00] |= 0x1E; - dest[i + 0x20] &= 0xFC00; - dest[i + 0x20] |= 0x1E; - } - else - { - dest[j + 0x00] &= 0xFC00; - dest[j + 0x00] |= 0x14 + buff[j]; - dest[i + 0x20] &= 0xFC00; - dest[i + 0x20] |= 0x34 + buff[i]; - } - j++; - } - } - else - { - for (i = 0; i < 4; i++) - { - if (buff[i] == 0xFF) - { - dest[i + 0x00] &= 0xFC00; - dest[i + 0x00] |= 0x1E; - dest[i + 0x20] &= 0xFC00; - dest[i + 0x20] |= 0x1E; - } - else - { - dest[i + 0x00] &= 0xFC00; - dest[i + 0x00] |= 0x14 + buff[i]; - dest[i + 0x20] &= 0xFC00; - dest[i + 0x20] |= 0x34 + buff[i]; - } - } - } -} - - -void sub_80724A8(s16 arg0, s16 arg1, u16 *arg2) -{ - arg2[4] = 0x1E; - sub_8072308(arg1, arg2, 0); - sub_8072308(arg0, arg2 + 5, 1); -} - // Because the healthbox is too large to fit into one sprite, it is divided into two sprites. // healthboxLeft or healthboxMain is the left part that is used as the 'main' sprite. // healthboxRight or healthboxOther is the right part of the healthbox. @@ -853,16 +709,25 @@ void sub_80724A8(s16 arg0, s16 arg1, u16 *arg2) // data fields for healthboxRight #define hOther_HealthBoxSpriteId data[5] +#define hOther_IndicatorSpriteId data[6] // For Mega Evo // data fields for healthbar #define hBar_HealthBoxSpriteId data[5] #define hBar_Data6 data[6] +u8 GetMegaIndicatorSpriteId(u32 healthboxSpriteId) +{ + u8 spriteId = gSprites[healthboxSpriteId].oam.affineParam; + if (spriteId >= MAX_SPRITES) + return 0xFF; + return gSprites[spriteId].hOther_IndicatorSpriteId; +} + u8 CreateBattlerHealthboxSprites(u8 battlerId) { s16 data6 = 0; u8 healthboxLeftSpriteId, healthboxRightSpriteId; - u8 healthbarSpriteId; + u8 healthbarSpriteId, megaIndicatorSpriteId; struct Sprite *healthBarSpritePtr; if (!IsDoubleBattle()) @@ -934,11 +799,19 @@ u8 CreateBattlerHealthboxSprites(u8 battlerId) gSprites[healthboxLeftSpriteId].invisible = TRUE; gSprites[healthboxRightSpriteId].invisible = TRUE; + gSprites[healthboxRightSpriteId].hOther_IndicatorSpriteId = 0xFF; healthBarSpritePtr->hBar_HealthBoxSpriteId = healthboxLeftSpriteId; healthBarSpritePtr->hBar_Data6 = data6; healthBarSpritePtr->invisible = TRUE; + // Create mega indicator sprite if is a mega evolved mon. + if (gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(battlerId)] & gBitTable[gBattlerPartyIndexes[battlerId]]) + { + megaIndicatorSpriteId = CreateMegaIndicatorSprite(battlerId, 0); + gSprites[megaIndicatorSpriteId].invisible = TRUE; + } + return healthboxLeftSpriteId; } @@ -957,6 +830,8 @@ u8 CreateSafariPlayerHealthboxSprites(void) gSprites[healthboxLeftSpriteId].oam.affineParam = healthboxRightSpriteId; gSprites[healthboxRightSpriteId].hOther_HealthBoxSpriteId = healthboxLeftSpriteId; + gSprites[healthboxRightSpriteId].hOther_IndicatorSpriteId = 0xFF; + gSprites[healthboxRightSpriteId].callback = SpriteCB_HealthBoxOther; return healthboxLeftSpriteId; @@ -996,12 +871,19 @@ static void SpriteCB_HealthBar(struct Sprite *sprite) static void SpriteCB_HealthBoxOther(struct Sprite *sprite) { u8 healthboxMainSpriteId = sprite->hOther_HealthBoxSpriteId; + u8 megaSpriteId = sprite->hOther_IndicatorSpriteId; sprite->pos1.x = gSprites[healthboxMainSpriteId].pos1.x + 64; sprite->pos1.y = gSprites[healthboxMainSpriteId].pos1.y; sprite->pos2.x = gSprites[healthboxMainSpriteId].pos2.x; sprite->pos2.y = gSprites[healthboxMainSpriteId].pos2.y; + + if (megaSpriteId != 0xFF) + { + gSprites[megaSpriteId].pos2.x = sprite->pos2.x; + gSprites[megaSpriteId].pos2.y = sprite->pos2.y; + } } void SetBattleBarStruct(u8 battlerId, u8 healthboxSpriteId, s32 maxVal, s32 oldVal, s32 receivedValue) @@ -1015,6 +897,7 @@ void SetBattleBarStruct(u8 battlerId, u8 healthboxSpriteId, s32 maxVal, s32 oldV void SetHealthboxSpriteInvisible(u8 healthboxSpriteId) { + DestroyMegaIndicatorSprite(healthboxSpriteId); gSprites[healthboxSpriteId].invisible = TRUE; gSprites[gSprites[healthboxSpriteId].hMain_HealthBarSpriteId].invisible = TRUE; gSprites[gSprites[healthboxSpriteId].oam.affineParam].invisible = TRUE; @@ -1022,9 +905,19 @@ void SetHealthboxSpriteInvisible(u8 healthboxSpriteId) void SetHealthboxSpriteVisible(u8 healthboxSpriteId) { + u8 battlerId = gSprites[healthboxSpriteId].hMain_Battler; + gSprites[healthboxSpriteId].invisible = FALSE; gSprites[gSprites[healthboxSpriteId].hMain_HealthBarSpriteId].invisible = FALSE; gSprites[gSprites[healthboxSpriteId].oam.affineParam].invisible = FALSE; + if (gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(battlerId)] & gBitTable[gBattlerPartyIndexes[battlerId]]) + { + u8 spriteId = GetMegaIndicatorSpriteId(healthboxSpriteId); + if (spriteId != 0xFF) + gSprites[spriteId].invisible = FALSE; + else + CreateMegaIndicatorSprite(battlerId, 0); + } } static void UpdateSpritePos(u8 spriteId, s16 x, s16 y) @@ -1035,6 +928,7 @@ static void UpdateSpritePos(u8 spriteId, s16 x, s16 y) void DestoryHealthboxSprite(u8 healthboxSpriteId) { + DestroyMegaIndicatorSprite(healthboxSpriteId); DestroySprite(&gSprites[gSprites[healthboxSpriteId].oam.affineParam]); DestroySprite(&gSprites[gSprites[healthboxSpriteId].hMain_HealthBarSpriteId]); DestroySprite(&gSprites[healthboxSpriteId]); @@ -1054,43 +948,52 @@ void UpdateOamPriorityInAllHealthboxes(u8 priority) u8 healthboxLeftSpriteId = gHealthboxSpriteIds[i]; u8 healthboxRightSpriteId = gSprites[gHealthboxSpriteIds[i]].oam.affineParam; u8 healthbarSpriteId = gSprites[gHealthboxSpriteIds[i]].hMain_HealthBarSpriteId; + u8 indicatorSpriteId = GetMegaIndicatorSpriteId(healthboxLeftSpriteId); gSprites[healthboxLeftSpriteId].oam.priority = priority; gSprites[healthboxRightSpriteId].oam.priority = priority; gSprites[healthbarSpriteId].oam.priority = priority; + if (indicatorSpriteId != 0xFF) + gSprites[indicatorSpriteId].oam.priority = priority; } } -void InitBattlerHealthboxCoords(u8 battler) +void GetBattlerHealthboxCoords(u8 battler, s16 *x, s16 *y) { - s16 x = 0, y = 0; + *x = 0, *y = 0; if (!IsDoubleBattle()) { if (GetBattlerSide(battler) != B_SIDE_PLAYER) - x = 44, y = 30; + *x = 44, *y = 30; else - x = 158, y = 88; + *x = 158, *y = 88; } else { switch (GetBattlerPosition(battler)) { case B_POSITION_PLAYER_LEFT: - x = 159, y = 76; + *x = 159, *y = 76; break; case B_POSITION_PLAYER_RIGHT: - x = 171, y = 101; + *x = 171, *y = 101; break; case B_POSITION_OPPONENT_LEFT: - x = 44, y = 19; + *x = 44, *y = 19; break; case B_POSITION_OPPONENT_RIGHT: - x = 32, y = 44; + *x = 32, *y = 44; break; } } +} +void InitBattlerHealthboxCoords(u8 battler) +{ + s16 x, y; + + GetBattlerHealthboxCoords(battler, &x, &y); UpdateSpritePos(gHealthboxSpriteIds[battler], x, y); } @@ -1101,11 +1004,21 @@ static void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl) u8 text[16]; u32 xPos, var1; void *objVram; + u8 battler = gSprites[healthboxSpriteId].hMain_Battler; - text[0] = 0xF9; - text[1] = 5; + // Don't print Lv char if mon is mega evolved. + if (gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(battler)] & gBitTable[gBattlerPartyIndexes[battler]]) + { + xPos = (u32) ConvertIntToDecimalStringN(text, lvl, STR_CONV_MODE_LEFT_ALIGN, 3); + } + else + { + text[0] = 0xF9; + text[1] = 5; + + xPos = (u32) ConvertIntToDecimalStringN(text + 2, lvl, STR_CONV_MODE_LEFT_ALIGN, 3); + } - xPos = (u32) ConvertIntToDecimalStringN(text + 2, lvl, STR_CONV_MODE_LEFT_ALIGN, 3); // Alright, that part was unmatchable. It's basically doing: // xPos = 5 * (3 - (u32)(&text[2])); xPos--; @@ -1118,7 +1031,7 @@ static void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl) windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, xPos, 3, 2, &windowId); spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * TILE_SIZE_4BPP; - if (GetBattlerSide(gSprites[healthboxSpriteId].hMain_Battler) == B_SIDE_PLAYER) + if (GetBattlerSide(battler) == B_SIDE_PLAYER) { objVram = (void*)(OBJ_VRAM0); if (!IsDoubleBattle()) @@ -1175,11 +1088,11 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent) memcpy(text, sUnknown_0832C3C4, sizeof(sUnknown_0832C3C4)); battler = gSprites[healthboxSpriteId].hMain_Battler; - if (IsDoubleBattle() == TRUE || GetBattlerSide(battler) == B_SIDE_OPPONENT) + if (IsDoubleBattle() == TRUE) { UpdateHpTextInHealthboxInDoubles(healthboxSpriteId, value, maxOrCurrent); } - else + else if (gBattleSpritesDataPtr->battlerData[battler].hpNumbersNoBars) // don't print text if only bars are visible { u32 var; u8 i; @@ -1194,12 +1107,12 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent) else { if (maxOrCurrent == HP_CURRENT) - var = 20; + var = 21; else - var = 48; + var = 49; } - ConvertIntToDecimalStringN(text + 6, value, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(text + 6, value, STR_CONV_MODE_LEADING_ZEROS, 3); RenderTextFont9(gMonSpritesGfxPtr->barFontGfx, 9, text); for (i = 0; i < 3; i++) @@ -1440,6 +1353,195 @@ void SwapHpBarsWithHpText(void) } } +// Mega Evolution gfx functions. +void ChangeMegaTriggerSprite(u8 spriteId, u8 animId) +{ + StartSpriteAnim(&gSprites[spriteId], animId); +} + +#define SINGLES_MEGA_TRIGGER_POS_X_OPTIMAL (30) +#define SINGLES_MEGA_TRIGGER_POS_X_PRIORITY (31) +#define SINGLES_MEGA_TRIGGER_POS_X_SLIDE (15) +#define SINGLES_MEGA_TRIGGER_POS_Y_DIFF (-11) + +#define DOUBLES_MEGA_TRIGGER_POS_X_OPTIMAL (30) +#define DOUBLES_MEGA_TRIGGER_POS_X_PRIORITY (31) +#define DOUBLES_MEGA_TRIGGER_POS_X_SLIDE (15) +#define DOUBLES_MEGA_TRIGGER_POS_Y_DIFF (-4) + +#define tBattler data[0] +#define tHide data[1] + +void CreateMegaTriggerSprite(u8 battlerId, u8 palId) +{ + LoadSpritePalette(&sSpritePalette_MegaTrigger); + if (GetSpriteTileStartByTag(TAG_MEGA_TRIGGER_TILE) == 0xFFFF) + LoadSpriteSheet(&sSpriteSheet_MegaTrigger); + if (gBattleStruct->mega.triggerSpriteId == 0xFF) + { + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + gBattleStruct->mega.triggerSpriteId = CreateSprite(&sSpriteTemplate_MegaTrigger, + gSprites[gHealthboxSpriteIds[battlerId]].pos1.x - DOUBLES_MEGA_TRIGGER_POS_X_SLIDE, + gSprites[gHealthboxSpriteIds[battlerId]].pos1.y - DOUBLES_MEGA_TRIGGER_POS_Y_DIFF, 0); + else + gBattleStruct->mega.triggerSpriteId = CreateSprite(&sSpriteTemplate_MegaTrigger, + gSprites[gHealthboxSpriteIds[battlerId]].pos1.x - SINGLES_MEGA_TRIGGER_POS_X_SLIDE, + gSprites[gHealthboxSpriteIds[battlerId]].pos1.y - SINGLES_MEGA_TRIGGER_POS_Y_DIFF, 0); + } + gSprites[gBattleStruct->mega.triggerSpriteId].tBattler = battlerId; + gSprites[gBattleStruct->mega.triggerSpriteId].tHide = FALSE; + + ChangeMegaTriggerSprite(gBattleStruct->mega.triggerSpriteId, palId); +} + +static void SpriteCb_MegaTrigger(struct Sprite *sprite) +{ + s32 xSlide, xPriority, xOptimal; + s32 yDiff; + + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + xSlide = DOUBLES_MEGA_TRIGGER_POS_X_SLIDE; + xPriority = DOUBLES_MEGA_TRIGGER_POS_X_PRIORITY; + xOptimal = DOUBLES_MEGA_TRIGGER_POS_X_OPTIMAL; + yDiff = DOUBLES_MEGA_TRIGGER_POS_Y_DIFF; + } + else + { + xSlide = SINGLES_MEGA_TRIGGER_POS_X_SLIDE; + xPriority = SINGLES_MEGA_TRIGGER_POS_X_PRIORITY; + xOptimal = SINGLES_MEGA_TRIGGER_POS_X_OPTIMAL; + yDiff = SINGLES_MEGA_TRIGGER_POS_Y_DIFF; + } + + if (sprite->tHide) + { + if (sprite->pos1.x != gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos1.x - xSlide) + sprite->pos1.x++; + + if (sprite->pos1.x >= gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos1.x - xPriority) + sprite->oam.priority = 2; + else + sprite->oam.priority = 1; + + sprite->pos1.y = gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos1.y - yDiff; + sprite->pos2.y = gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos2.y - yDiff; + if (sprite->pos1.x == gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos1.x - xSlide) + DestroyMegaTriggerSprite(); + } + else + { + if (sprite->pos1.x != gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos1.x - xOptimal) + sprite->pos1.x--; + + if (sprite->pos1.x >= gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos1.x - xPriority) + sprite->oam.priority = 2; + else + sprite->oam.priority = 1; + + sprite->pos1.y = gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos1.y - yDiff; + sprite->pos2.y = gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos2.y - yDiff; + } +} + +bool32 IsMegaTriggerSpriteActive(void) +{ + if (GetSpriteTileStartByTag(TAG_MEGA_TRIGGER_TILE) == 0xFFFF) + return FALSE; + else if (IndexOfSpritePaletteTag(TAG_MEGA_TRIGGER_PAL) != 0xFF) + return TRUE; + else + return FALSE; +} + +void HideMegaTriggerSprite(void) +{ + ChangeMegaTriggerSprite(gBattleStruct->mega.triggerSpriteId, 0); + gSprites[gBattleStruct->mega.triggerSpriteId].tHide = TRUE; +} + +void DestroyMegaTriggerSprite(void) +{ + FreeSpritePaletteByTag(TAG_MEGA_TRIGGER_PAL); + FreeSpriteTilesByTag(TAG_MEGA_TRIGGER_TILE); + if (gBattleStruct->mega.triggerSpriteId != 0xFF) + DestroySprite(&gSprites[gBattleStruct->mega.triggerSpriteId]); + gBattleStruct->mega.triggerSpriteId = 0xFF; +} + +static const s8 sIndicatorPosSingles[][2] = +{ + [B_POSITION_PLAYER_LEFT] = {53, -8}, + [B_POSITION_OPPONENT_LEFT] = {45, -8}, +}; + +static const s8 sIndicatorPosDoubles[][2] = +{ + [B_POSITION_PLAYER_LEFT] = {53, -8}, + [B_POSITION_OPPONENT_LEFT] = {45, -8}, + [B_POSITION_PLAYER_RIGHT] = {53, -8}, + [B_POSITION_OPPONENT_RIGHT] = {45, -8}, +}; + +u32 CreateMegaIndicatorSprite(u32 battlerId, u32 which) +{ + u32 spriteId, position; + s16 x, y; + + LoadSpritePalette(&sSpritePalette_MegaIndicator); + LoadSpriteSheet(&sSpriteSheet_MegaIndicator); + + position = GetBattlerPosition(battlerId); + GetBattlerHealthboxCoords(battlerId, &x, &y); + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + x += sIndicatorPosDoubles[position][0]; + y += sIndicatorPosDoubles[position][1]; + } + else + { + x += sIndicatorPosSingles[position][0]; + y += sIndicatorPosSingles[position][1]; + } + spriteId = CreateSpriteAtEnd(&sSpriteTemplate_MegaIndicator, x, y, 0); + gSprites[gSprites[gHealthboxSpriteIds[battlerId]].oam.affineParam].hOther_IndicatorSpriteId = spriteId; + + gSprites[spriteId].tBattler = battlerId; + return spriteId; +} + +void DestroyMegaIndicatorSprite(u32 healthboxSpriteId) +{ + u32 i; + s16 *spriteId = &gSprites[gSprites[healthboxSpriteId].oam.affineParam].hOther_IndicatorSpriteId; + + if (*spriteId != 0xFF) + { + DestroySprite(&gSprites[*spriteId]); + *spriteId = 0xFF; + } + + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { + if (gSprites[gSprites[gHealthboxSpriteIds[i]].oam.affineParam].hOther_IndicatorSpriteId != 0xFF) + break; + } + // Free Sprite pal/tiles only if no indicator sprite is active for all battlers. + if (i == MAX_BATTLERS_COUNT) + { + FreeSpritePaletteByTag(TAG_MEGA_INDICATOR_PAL); + FreeSpriteTilesByTag(TAG_MEGA_INDICATOR_TILE); + } +} + +static void SpriteCb_MegaIndicator(struct Sprite *sprite) +{ + +} + +#undef tBattler +#undef tHide + #define tBattler data[0] #define tSummaryBarSpriteId data[1] #define tBallIconSpriteId(n) data[3 + n] @@ -1898,10 +2000,12 @@ static void UpdateNickInHealthbox(u8 healthboxSpriteId, struct Pokemon *mon) u8 nickname[POKEMON_NAME_LENGTH + 1]; void *ptr; const u8 *genderTxt; - u32 windowId, spriteTileNum; + u32 windowId, spriteTileNum, species; u8 *windowTileData; - u16 species; u8 gender; + struct Pokemon *illusionMon = GetIllusionMonPtr(gSprites[healthboxSpriteId].hMain_Battler); + if (illusionMon != NULL) + mon = illusionMon; StringCopy(gDisplayedStringBattle, gText_HighlightDarkGrey); GetMonData(mon, MON_DATA_NICKNAME, nickname); @@ -2150,9 +2254,6 @@ void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elem s32 maxHp, currHp; u8 battlerId = gSprites[healthboxSpriteId].hMain_Battler; - if (elementId == HEALTHBOX_ALL && !IsDoubleBattle()) - GetBattlerSide(battlerId); // Pointless function call. - if (GetBattlerSide(gSprites[healthboxSpriteId].hMain_Battler) == B_SIDE_PLAYER) { u8 isDoubles; @@ -2202,6 +2303,10 @@ void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elem { if (elementId == HEALTHBOX_LEVEL || elementId == HEALTHBOX_ALL) UpdateLvlInHealthbox(healthboxSpriteId, GetMonData(mon, MON_DATA_LEVEL)); + if (gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars && (elementId == HEALTHBOX_CURRENT_HP || elementId == HEALTHBOX_ALL)) + UpdateHpTextInHealthbox(healthboxSpriteId, GetMonData(mon, MON_DATA_HP), HP_CURRENT); + if (gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars && (elementId == HEALTHBOX_MAX_HP || elementId == HEALTHBOX_ALL)) + UpdateHpTextInHealthbox(healthboxSpriteId, GetMonData(mon, MON_DATA_MAX_HP), HP_MAX); if (elementId == HEALTHBOX_HEALTH_BAR || elementId == HEALTHBOX_ALL) { LoadBattleBarGfx(0); @@ -2443,42 +2548,6 @@ static u8 CalcBarFilledPixels(s32 maxValue, s32 oldValue, s32 receivedValue, s32 return filledPixels; } -// These two functions seem as if they were made for testing the health bar. -static s16 sub_8074F28(struct TestingBar *barInfo, s32 *currValue, u16 *arg2, s32 arg3) -{ - s16 ret, var; - - ret = CalcNewBarValue(barInfo->maxValue, - barInfo->oldValue, - barInfo->receivedValue, - currValue, B_HEALTHBAR_PIXELS / 8, 1); - sub_8074F88(barInfo, currValue, arg2); - - if (barInfo->maxValue < B_HEALTHBAR_PIXELS) - var = *currValue >> 8; - else - var = *currValue; - - DummiedOutFunction(barInfo->maxValue, var, arg3); - - return ret; -} - -static void sub_8074F88(struct TestingBar *barInfo, s32 *currValue, u16 *arg2) -{ - u8 sp8[6]; - u16 sp10[6]; - u8 i; - - CalcBarFilledPixels(barInfo->maxValue, barInfo->oldValue, - barInfo->receivedValue, currValue, sp8, B_HEALTHBAR_PIXELS / 8); - - for (i = 0; i < 6; i++) - sp10[i] = (barInfo->unkC_0 << 12) | (barInfo->unk10 + sp8[i]); - - CpuCopy16(sp10, arg2, sizeof(sp10)); -} - static u8 GetScaledExpFraction(s32 oldValue, s32 receivedValue, s32 maxValue, u8 scale) { s32 newVal, result; @@ -2587,3 +2656,413 @@ static void SafariTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 wi CpuCopy32(windowTileData, dest, windowWidth * TILE_SIZE_4BPP); CpuCopy32(windowTileData + 256, dest + 256, windowWidth * TILE_SIZE_4BPP); } + +#define ABILITY_POP_UP_TAG 0xD720 + +// for sprite +#define tOriginalX data[0] +#define tHide data[1] +#define tFrames data[2] +#define tRightToLeft data[3] +#define tBattlerId data[4] +#define tIsMain data[5] + +// for task +#define tSpriteId1 data[6] +#define tSpriteId2 data[7] + +static const u8 sAbilityPopUpGfx[] = INCBIN_U8("graphics/battle_interface/ability_pop_up.4bpp"); +static const u16 sAbilityPopUpPalette[] = INCBIN_U16("graphics/battle_interface/ability_pop_up.gbapal"); + +static const struct SpriteSheet sSpriteSheet_AbilityPopUp = +{ + sAbilityPopUpGfx, sizeof(sAbilityPopUpGfx), ABILITY_POP_UP_TAG +}; +static const struct SpritePalette sSpritePalette_AbilityPopUp = +{ + sAbilityPopUpPalette, ABILITY_POP_UP_TAG +}; + +static const struct OamData sOamData_AbilityPopUp = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = ST_OAM_H_RECTANGLE, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sSpriteAnim_AbilityPopUp1[] = +{ + ANIMCMD_FRAME(0, 0), + ANIMCMD_END +}; + +static const union AnimCmd *const sSpriteAnimTable_AbilityPopUp1[] = +{ + sSpriteAnim_AbilityPopUp1 +}; + +static const struct SpriteTemplate sSpriteTemplate_AbilityPopUp1 = +{ + .tileTag = ABILITY_POP_UP_TAG, + .paletteTag = ABILITY_POP_UP_TAG, + .oam = &sOamData_AbilityPopUp, + .anims = sSpriteAnimTable_AbilityPopUp1, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCb_AbilityPopUp +}; + +static const union AnimCmd sSpriteAnim_AbilityPopUp2[] = +{ + ANIMCMD_FRAME(32, 0), + ANIMCMD_END +}; + +static const union AnimCmd *const sSpriteAnimTable_AbilityPopUp2[] = +{ + sSpriteAnim_AbilityPopUp2 +}; + +static const struct SpriteTemplate sSpriteTemplate_AbilityPopUp2 = +{ + .tileTag = ABILITY_POP_UP_TAG, + .paletteTag = ABILITY_POP_UP_TAG, + .oam = &sOamData_AbilityPopUp, + .anims = sSpriteAnimTable_AbilityPopUp2, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCb_AbilityPopUp +}; + +#define ABILITY_POP_UP_POS_X_DIFF 64 +#define ABILITY_POP_UP_POS_X_SLIDE 68 + +static const s16 sAbilityPopUpCoordsDoubles[MAX_BATTLERS_COUNT][2] = +{ + {29, 80}, // player left + {204, 19}, // opponent left + {29, 97}, // player right + {204, 36}, // opponent right +}; + +static const s16 sAbilityPopUpCoordsSingles[MAX_BATTLERS_COUNT][2] = +{ + {29, 93}, // player + {204, 23}, // opponent +}; + +static u8* AddTextPrinterAndCreateWindowOnAbilityPopUp(const u8 *str, u32 x, u32 y, u32 color1, u32 color2, u32 color3, u32 *windowId) +{ + u8 color[3] = {color1, color2, color3}; + struct WindowTemplate winTemplate = {0}; + winTemplate.width = 8; + winTemplate.height = 2; + + *windowId = AddWindow(&winTemplate); + FillWindowPixelBuffer(*windowId, (color1 << 4) | (color1)); + + AddTextPrinterParameterized4(*windowId, 0, x, y, 0, 0, color, -1, str); + return (u8*)(GetWindowAttribute(*windowId, WINDOW_TILE_DATA)); +} + +static void TextIntoAbilityPopUp(void *dest, u8 *windowTileData, s32 arg2, bool32 arg3) +{ + CpuCopy32(windowTileData + 256, dest + 256, arg2 * 32); + if (arg2 > 0) + { + do + { + if (arg3) + CpuCopy32(windowTileData + 16, dest + 16, 16); + else + CpuCopy32(windowTileData + 20, dest + 20, 12); + dest += 32, windowTileData += 32; + arg2--; + } while (arg2 != 0); + } +} + +#define MAX_CHARS_PRINTED 12 + +static void PrintOnAbilityPopUp(const u8 *str, u8 *spriteTileData1, u8 *spriteTileData2, u32 x1, u32 x2, u32 y, u32 color1, u32 color2, u32 color3) +{ + u32 windowId, i; + u8 *windowTileData; + u8 text1[MAX_CHARS_PRINTED + 2]; + u8 text2[MAX_CHARS_PRINTED + 2]; + + for (i = 0; i < MAX_CHARS_PRINTED + 1; i++) + { + text1[i] = str[i]; + if (text1[i] == EOS) + break; + } + text1[i] = EOS; + + windowTileData = AddTextPrinterAndCreateWindowOnAbilityPopUp(text1, x1, y, color1, color2, color3, &windowId); + TextIntoAbilityPopUp(spriteTileData1, windowTileData, 8, (y == 0)); + RemoveWindow(windowId); + + if (i == MAX_CHARS_PRINTED + 1) + { + for (i = 0; i < MAX_CHARS_PRINTED; i++) + { + text2[i] = str[MAX_CHARS_PRINTED + i]; + if (text2[i] == EOS) + break; + } + text2[i] = EOS; + + windowTileData = AddTextPrinterAndCreateWindowOnAbilityPopUp(text2, x2, y, color1, color2, color3, &windowId); + TextIntoAbilityPopUp(spriteTileData2, windowTileData, 1, (y == 0)); + RemoveWindow(windowId); + } +} + +static void PrintBattlerOnAbilityPopUp(u8 battlerId, u8 spriteId1, u8 spriteId2) +{ + PrintOnAbilityPopUp(gBattleMons[battlerId].nickname, + (void*)(OBJ_VRAM0) + (gSprites[spriteId1].oam.tileNum * 32), + (void*)(OBJ_VRAM0) + (gSprites[spriteId2].oam.tileNum * 32), + 7, 0, + 0, + 2, 7, 1); +} + +static void PrintAbilityOnAbilityPopUp(u32 ability, u8 spriteId1, u8 spriteId2) +{ + PrintOnAbilityPopUp(gAbilityNames[ability], + (void*)(OBJ_VRAM0) + (gSprites[spriteId1].oam.tileNum * 32) + 256, + (void*)(OBJ_VRAM0) + (gSprites[spriteId2].oam.tileNum * 32) + 256, + 7, 1, + 4, + 7, 9, 1); +} + +#define PIXEL_COORDS_TO_OFFSET(x, y)( \ +/*Add tiles by X*/ \ +((y / 8) * 32 * 8) \ +/*Add tiles by X*/ \ ++ ((x / 8) * 32) \ +/*Add pixels by Y*/ \ ++ ((((y) - ((y / 8) * 8))) * 4) \ +/*Add pixels by X*/ \ ++ ((((x) - ((x / 8) * 8)) / 2))) + +static const u16 sOverwrittenPixelsTable[][2] = +{ + {PIXEL_COORDS_TO_OFFSET(0, 0), 5}, + {PIXEL_COORDS_TO_OFFSET(0, 1), 5}, + {PIXEL_COORDS_TO_OFFSET(0, 2), 5}, + {PIXEL_COORDS_TO_OFFSET(0, 3), 5}, + {PIXEL_COORDS_TO_OFFSET(0, 4), 5}, + {PIXEL_COORDS_TO_OFFSET(0, 5), 5}, + {PIXEL_COORDS_TO_OFFSET(0, 6), 5}, + {PIXEL_COORDS_TO_OFFSET(0, 7), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 8), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 9), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 10), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 11), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 12), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 13), 8}, + + {PIXEL_COORDS_TO_OFFSET(8, 13), 8}, + {PIXEL_COORDS_TO_OFFSET(16, 13), 8}, + {PIXEL_COORDS_TO_OFFSET(24, 13), 8}, + {PIXEL_COORDS_TO_OFFSET(32, 13), 8}, + {PIXEL_COORDS_TO_OFFSET(40, 13), 8}, + {PIXEL_COORDS_TO_OFFSET(48, 13), 8}, + {PIXEL_COORDS_TO_OFFSET(56, 13), 8}, + + {PIXEL_COORDS_TO_OFFSET(0, 14), 8}, + {PIXEL_COORDS_TO_OFFSET(8, 14), 8}, + {PIXEL_COORDS_TO_OFFSET(16, 14), 8}, + {PIXEL_COORDS_TO_OFFSET(24, 14), 8}, + {PIXEL_COORDS_TO_OFFSET(32, 14), 8}, + {PIXEL_COORDS_TO_OFFSET(40, 14), 8}, + {PIXEL_COORDS_TO_OFFSET(48, 14), 8}, + {PIXEL_COORDS_TO_OFFSET(56, 14), 8}, + + {PIXEL_COORDS_TO_OFFSET(0, 15), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 16), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 17), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 18), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 19), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 20), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 21), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 22), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 23), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 24), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 25), 3}, + {PIXEL_COORDS_TO_OFFSET(0, 26), 3}, +}; + +static inline void CopyPixels(u8 *dest, const u8 *src, u32 pixelCount) +{ + u32 i = 0; + + if (pixelCount & 1) + { + while (pixelCount != 0) + { + dest[i] &= ~(0xF); + dest[i] |= (src[i] & 0xF); + if (--pixelCount != 0) + { + dest[i] &= ~(0xF0); + dest[i] |= (src[i] & 0xF0); + pixelCount--; + } + i++; + } + } + else + { + for (i = 0; i < pixelCount / 2; i++) + dest[i] = src[i]; + } +} + +static void RestoreOverwrittenPixels(u8 *tiles) +{ + u32 i; + u8 *buffer = Alloc(sizeof(sAbilityPopUpGfx) * 2); + + CpuCopy32(tiles, buffer, sizeof(sAbilityPopUpGfx)); + + for (i = 0; i < ARRAY_COUNT(sOverwrittenPixelsTable); i++) + { + CopyPixels(buffer + sOverwrittenPixelsTable[i][0], + sAbilityPopUpGfx + sOverwrittenPixelsTable[i][0], + sOverwrittenPixelsTable[i][1]); + } + + CpuCopy32(buffer, tiles, sizeof(sAbilityPopUpGfx)); + Free(buffer); +} + +void CreateAbilityPopUp(u8 battlerId, u32 ability, bool32 isDoubleBattle) +{ + const s16 (*coords)[2]; + u8 spriteId1, spriteId2, battlerPosition, taskId; + + if (B_ABILITY_POP_UP < GEN_5) + return; + + if (!gBattleStruct->activeAbilityPopUps) + { + LoadSpriteSheet(&sSpriteSheet_AbilityPopUp); + LoadSpritePalette(&sSpritePalette_AbilityPopUp); + } + gBattleStruct->activeAbilityPopUps |= gBitTable[battlerId]; + battlerPosition = GetBattlerPosition(battlerId); + + if (isDoubleBattle) + coords = sAbilityPopUpCoordsDoubles; + else + coords = sAbilityPopUpCoordsSingles; + + if ((battlerPosition & BIT_SIDE) == B_SIDE_PLAYER) + { + spriteId1 = CreateSprite(&sSpriteTemplate_AbilityPopUp1, + coords[battlerPosition][0] - ABILITY_POP_UP_POS_X_SLIDE, + coords[battlerPosition][1], 0); + spriteId2 = CreateSprite(&sSpriteTemplate_AbilityPopUp2, + coords[battlerPosition][0] - ABILITY_POP_UP_POS_X_SLIDE + ABILITY_POP_UP_POS_X_DIFF, + coords[battlerPosition][1], 0); + + gSprites[spriteId1].tOriginalX = coords[battlerPosition][0]; + gSprites[spriteId2].tOriginalX = coords[battlerPosition][0] + ABILITY_POP_UP_POS_X_DIFF; + + gSprites[spriteId1].tRightToLeft = TRUE; + gSprites[spriteId2].tRightToLeft = TRUE; + } + else + { + spriteId1 = CreateSprite(&sSpriteTemplate_AbilityPopUp1, + coords[battlerPosition][0] + ABILITY_POP_UP_POS_X_SLIDE, + coords[battlerPosition][1], 0); + spriteId2 = CreateSprite(&sSpriteTemplate_AbilityPopUp2, + coords[battlerPosition][0] + ABILITY_POP_UP_POS_X_SLIDE + ABILITY_POP_UP_POS_X_DIFF, + coords[battlerPosition][1], 0); + + gSprites[spriteId1].tOriginalX = coords[battlerPosition][0]; + gSprites[spriteId2].tOriginalX = coords[battlerPosition][0] + ABILITY_POP_UP_POS_X_DIFF; + + gSprites[spriteId1].tRightToLeft = FALSE; + gSprites[spriteId2].tRightToLeft = FALSE; + } + + taskId = CreateTask(Task_FreeAbilityPopUpGfx, 5); + gTasks[taskId].tSpriteId1 = spriteId1; + gTasks[taskId].tSpriteId2 = spriteId2; + + gSprites[spriteId1].tIsMain = TRUE; + gSprites[spriteId1].tBattlerId = battlerId; + gSprites[spriteId2].tBattlerId = battlerId; + + StartSpriteAnim(&gSprites[spriteId1], 0); + StartSpriteAnim(&gSprites[spriteId2], 0); + + PrintBattlerOnAbilityPopUp(battlerId, spriteId1, spriteId2); + PrintAbilityOnAbilityPopUp(ability, spriteId1, spriteId2); + RestoreOverwrittenPixels((void*)(OBJ_VRAM0) + (gSprites[spriteId1].oam.tileNum * 32)); +} + +#define FRAMES_TO_WAIT 48 + +static void SpriteCb_AbilityPopUp(struct Sprite *sprite) +{ + if (!sprite->tHide) // Show + { + if (sprite->tIsMain && ++sprite->tFrames == 4) + PlaySE(SE_SELECT); + if ((!sprite->tRightToLeft && (sprite->pos1.x -= 4) <= sprite->tOriginalX) + || (sprite->tRightToLeft && (sprite->pos1.x += 4) >= sprite->tOriginalX) + ) + { + sprite->pos1.x = sprite->tOriginalX; + sprite->tHide = TRUE; + sprite->tFrames = FRAMES_TO_WAIT; + } + } + else // Hide + { + if (sprite->tFrames == 0) + { + if ((!sprite->tRightToLeft && (sprite->pos1.x += 4) >= sprite->tOriginalX + ABILITY_POP_UP_POS_X_SLIDE) + ||(sprite->tRightToLeft && (sprite->pos1.x -= 4) <= sprite->tOriginalX - ABILITY_POP_UP_POS_X_SLIDE) + ) + { + gBattleStruct->activeAbilityPopUps &= ~(gBitTable[sprite->tBattlerId]); + DestroySprite(sprite); + } + } + else + { + sprite->tFrames--; + } + } +} + +static void Task_FreeAbilityPopUpGfx(u8 taskId) +{ + if (!gSprites[gTasks[taskId].tSpriteId1].inUse + && !gSprites[gTasks[taskId].tSpriteId2].inUse + && !gBattleStruct->activeAbilityPopUps) + { + FreeSpriteTilesByTag(ABILITY_POP_UP_TAG); + FreeSpritePaletteByTag(ABILITY_POP_UP_TAG); + DestroyTask(taskId); + } +} diff --git a/src/battle_intro.c b/src/battle_intro.c index 6964428a35..96c8cbd6aa 100644 --- a/src/battle_intro.c +++ b/src/battle_intro.c @@ -103,7 +103,7 @@ void HandleIntroSlide(u8 terrain) { u8 taskId; - if ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) && gPartnerTrainerId != TRAINER_STEVEN_PARTNER) + if ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) && gPartnerTrainerId != TRAINER_STEVEN_PARTNER && gPartnerTrainerId < TRAINER_CUSTOM_PARTNER) { taskId = CreateTask(BattleIntroSlidePartner, 0); } diff --git a/src/battle_main.c b/src/battle_main.c index bdde96be28..48ffe79a7f 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -50,6 +50,7 @@ #include "util.h" #include "window.h" #include "constants/abilities.h" +#include "constants/battle_config.h" #include "constants/battle_move_effects.h" #include "constants/battle_string_ids.h" #include "constants/hold_effects.h" @@ -97,18 +98,7 @@ static void oac_poke_ally_(struct Sprite *sprite); static void TurnValuesCleanUp(bool8 var0); static void SpriteCB_BounceEffect(struct Sprite *sprite); static void BattleStartClearSetData(void); -static void BattleIntroGetMonsData(void); -static void BattleIntroPrepareBackgroundSlide(void); -static void BattleIntroDrawTrainersOrMonsSprites(void); -static void BattleIntroDrawPartySummaryScreens(void); -static void BattleIntroPrintTrainerWantsToBattle(void); -static void BattleIntroPrintWildMonAttacked(void); -static void BattleIntroPrintOpponentSendsOut(void); -static void BattleIntroPrintPlayerSendsOut(void); -static void BattleIntroOpponent1SendsOutMonAnimation(void); -static void BattleIntroOpponent2SendsOutMonAnimation(void); -static void BattleIntroRecordMonsToDex(void); -static void BattleIntroPlayer1SendsOutMonAnimation(void); +static void DoBattleIntro(void); static void TryDoEventsBeforeFirstTurn(void); static void HandleTurnActionSelectionState(void); static void RunTurnActionsFunctions(void); @@ -116,6 +106,7 @@ static void SetActionsAndBattlersTurnOrder(void); static void sub_803CDF8(void); static bool8 AllAtActionConfirmed(void); static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void); +static void CheckMegaEvolutionBeforeTurn(void); static void FreeResetData_ReturnToOvOrDoEvolutions(void); static void ReturnFromBattleToOverworld(void); static void TryEvolvePokemon(void); @@ -141,11 +132,10 @@ EWRAM_DATA u16 gBattle_WIN0H = 0; EWRAM_DATA u16 gBattle_WIN0V = 0; EWRAM_DATA u16 gBattle_WIN1H = 0; EWRAM_DATA u16 gBattle_WIN1V = 0; -EWRAM_DATA u8 gDisplayedStringBattle[300] = {0}; +EWRAM_DATA u8 gDisplayedStringBattle[400] = {0}; EWRAM_DATA u8 gBattleTextBuff1[TEXT_BUFF_ARRAY_COUNT] = {0}; EWRAM_DATA u8 gBattleTextBuff2[TEXT_BUFF_ARRAY_COUNT] = {0}; EWRAM_DATA u8 gBattleTextBuff3[TEXT_BUFF_ARRAY_COUNT] = {0}; -EWRAM_DATA static u32 sUnusedUnknownArray[25] = {0}; EWRAM_DATA u32 gBattleTypeFlags = 0; EWRAM_DATA u8 gBattleTerrain = 0; EWRAM_DATA u32 gUnknown_02022FF4 = 0; @@ -153,8 +143,6 @@ EWRAM_DATA struct UnknownPokemonStruct4 gMultiPartnerParty[MULTI_PARTY_SIZE] = { EWRAM_DATA static struct UnknownPokemonStruct4* sMultiPartnerPartyBuffer = NULL; EWRAM_DATA u8 *gUnknown_0202305C = NULL; EWRAM_DATA u8 *gUnknown_02023060 = NULL; -EWRAM_DATA u8 gBattleBufferA[MAX_BATTLERS_COUNT][0x200] = {0}; -EWRAM_DATA u8 gBattleBufferB[MAX_BATTLERS_COUNT][0x200] = {0}; EWRAM_DATA u8 gActiveBattler = 0; EWRAM_DATA u32 gBattleControllerExecFlags = 0; EWRAM_DATA u8 gBattlersCount = 0; @@ -182,10 +170,9 @@ EWRAM_DATA u8 gBattlerFainted = 0; EWRAM_DATA u8 gEffectBattler = 0; EWRAM_DATA u8 gPotentialItemEffectBattler = 0; EWRAM_DATA u8 gAbsentBattlerFlags = 0; -EWRAM_DATA u8 gCritMultiplier = 0; +EWRAM_DATA u8 gIsCriticalHit = FALSE; EWRAM_DATA u8 gMultiHitCounter = 0; EWRAM_DATA const u8 *gBattlescriptCurrInstr = NULL; -EWRAM_DATA u32 gUnusedBattleMainVar = 0; EWRAM_DATA u8 gChosenActionByBattler[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA const u8 *gSelectionBattleScripts[MAX_BATTLERS_COUNT] = {NULL}; EWRAM_DATA const u8 *gPalaceSelectionBattleScripts[MAX_BATTLERS_COUNT] = {NULL}; @@ -195,14 +182,14 @@ EWRAM_DATA u16 gLastLandedMoves[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gLastHitByType[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gLastResultingMoves[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gLockedMoves[MAX_BATTLERS_COUNT] = {0}; +EWRAM_DATA u16 gLastUsedMove = 0; EWRAM_DATA u8 gLastHitBy[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gChosenMoveByBattler[MAX_BATTLERS_COUNT] = {0}; -EWRAM_DATA u8 gMoveResultFlags = 0; +EWRAM_DATA u16 gMoveResultFlags = 0; EWRAM_DATA u32 gHitMarker = 0; -EWRAM_DATA static u8 sUnusedBattlersArray[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gTakenDmgByBattler[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gUnknown_0202428C = 0; -EWRAM_DATA u16 gSideStatuses[2] = {0}; +EWRAM_DATA u32 gSideStatuses[2] = {0}; EWRAM_DATA struct SideTimer gSideTimers[2] = {0}; EWRAM_DATA u32 gStatuses3[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA struct DisableStruct gDisableStructs[MAX_BATTLERS_COUNT] = {0}; @@ -217,7 +204,6 @@ EWRAM_DATA u16 gBattleWeather = 0; EWRAM_DATA struct WishFutureKnock gWishFutureKnock = {0}; EWRAM_DATA u16 gIntroSlideFlags = 0; EWRAM_DATA u8 gSentPokesToOpponent[2] = {0}; -EWRAM_DATA u16 gDynamicBasePower = 0; EWRAM_DATA u16 gExpShareExp = 0; EWRAM_DATA struct BattleEnigmaBerry gEnigmaBerries[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA struct BattleScripting gBattleScripting = {0}; @@ -239,6 +225,10 @@ EWRAM_DATA struct BattleHealthboxInfo *gUnknown_020244DC = NULL; EWRAM_DATA u16 gBattleMovePower = 0; EWRAM_DATA u16 gMoveToLearn = 0; EWRAM_DATA u8 gBattleMonForms[MAX_BATTLERS_COUNT] = {0}; +EWRAM_DATA u32 gFieldStatuses = 0; +EWRAM_DATA struct FieldTimer gFieldTimers = {0}; +EWRAM_DATA u8 gBattlerAbility = 0; +EWRAM_DATA u16 gPartnerSpriteId = 0; // IWRAM common vars void (*gPreBattleCallback1)(void); @@ -306,136 +296,8 @@ const struct OamData gOamData_831ACB0 = .affineParam = 0, }; -// Unknown and unused data. Feel free to remove. -static const u16 gUnknown_0831ACB8[] = {0, 5, 0xfffe, 0}; -static const u16 *const gUnknown_0831ACC0 = gUnknown_0831ACB8; -static const u16 gUnknown_0831ACC4[] = {0xfff0, 0, 0x0400, 0, 0, 0, 0x3c00, 0, 0x7ffe, 1, 0, 0}; -static const u16 *const gUnknown_0831ACDC = gUnknown_0831ACC4; - static const s8 gUnknown_0831ACE0[] ={-32, -16, -16, -32, -32, 0, 0, 0}; -// format: attacking type, defending type, damage multiplier -// the multiplier is a (decimal) fixed-point number: -// 20 is ×2.0 TYPE_MUL_SUPER_EFFECTIVE -// 10 is ×1.0 TYPE_MUL_NORMAL -// 05 is ×0.5 TYPE_MUL_NOT_EFFECTIVE -// 00 is ×0.0 TYPE_MUL_NO_EFFECT -const u8 gTypeEffectiveness[336] = -{ - TYPE_NORMAL, TYPE_ROCK, TYPE_MUL_NOT_EFFECTIVE, - TYPE_NORMAL, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE, - TYPE_FIRE, TYPE_FIRE, TYPE_MUL_NOT_EFFECTIVE, - TYPE_FIRE, TYPE_WATER, TYPE_MUL_NOT_EFFECTIVE, - TYPE_FIRE, TYPE_GRASS, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_FIRE, TYPE_ICE, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_FIRE, TYPE_BUG, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_FIRE, TYPE_ROCK, TYPE_MUL_NOT_EFFECTIVE, - TYPE_FIRE, TYPE_DRAGON, TYPE_MUL_NOT_EFFECTIVE, - TYPE_FIRE, TYPE_STEEL, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_WATER, TYPE_FIRE, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_WATER, TYPE_WATER, TYPE_MUL_NOT_EFFECTIVE, - TYPE_WATER, TYPE_GRASS, TYPE_MUL_NOT_EFFECTIVE, - TYPE_WATER, TYPE_GROUND, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_WATER, TYPE_ROCK, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_WATER, TYPE_DRAGON, TYPE_MUL_NOT_EFFECTIVE, - TYPE_ELECTRIC, TYPE_WATER, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_ELECTRIC, TYPE_ELECTRIC, TYPE_MUL_NOT_EFFECTIVE, - TYPE_ELECTRIC, TYPE_GRASS, TYPE_MUL_NOT_EFFECTIVE, - TYPE_ELECTRIC, TYPE_GROUND, TYPE_MUL_NO_EFFECT, - TYPE_ELECTRIC, TYPE_FLYING, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_ELECTRIC, TYPE_DRAGON, TYPE_MUL_NOT_EFFECTIVE, - TYPE_GRASS, TYPE_FIRE, TYPE_MUL_NOT_EFFECTIVE, - TYPE_GRASS, TYPE_WATER, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_GRASS, TYPE_GRASS, TYPE_MUL_NOT_EFFECTIVE, - TYPE_GRASS, TYPE_POISON, TYPE_MUL_NOT_EFFECTIVE, - TYPE_GRASS, TYPE_GROUND, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_GRASS, TYPE_FLYING, TYPE_MUL_NOT_EFFECTIVE, - TYPE_GRASS, TYPE_BUG, TYPE_MUL_NOT_EFFECTIVE, - TYPE_GRASS, TYPE_ROCK, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_GRASS, TYPE_DRAGON, TYPE_MUL_NOT_EFFECTIVE, - TYPE_GRASS, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE, - TYPE_ICE, TYPE_WATER, TYPE_MUL_NOT_EFFECTIVE, - TYPE_ICE, TYPE_GRASS, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_ICE, TYPE_ICE, TYPE_MUL_NOT_EFFECTIVE, - TYPE_ICE, TYPE_GROUND, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_ICE, TYPE_FLYING, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_ICE, TYPE_DRAGON, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_ICE, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE, - TYPE_ICE, TYPE_FIRE, TYPE_MUL_NOT_EFFECTIVE, - TYPE_FIGHTING, TYPE_NORMAL, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_FIGHTING, TYPE_ICE, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_FIGHTING, TYPE_POISON, TYPE_MUL_NOT_EFFECTIVE, - TYPE_FIGHTING, TYPE_FLYING, TYPE_MUL_NOT_EFFECTIVE, - TYPE_FIGHTING, TYPE_PSYCHIC, TYPE_MUL_NOT_EFFECTIVE, - TYPE_FIGHTING, TYPE_BUG, TYPE_MUL_NOT_EFFECTIVE, - TYPE_FIGHTING, TYPE_ROCK, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_FIGHTING, TYPE_DARK, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_FIGHTING, TYPE_STEEL, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_POISON, TYPE_GRASS, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_POISON, TYPE_POISON, TYPE_MUL_NOT_EFFECTIVE, - TYPE_POISON, TYPE_GROUND, TYPE_MUL_NOT_EFFECTIVE, - TYPE_POISON, TYPE_ROCK, TYPE_MUL_NOT_EFFECTIVE, - TYPE_POISON, TYPE_GHOST, TYPE_MUL_NOT_EFFECTIVE, - TYPE_POISON, TYPE_STEEL, TYPE_MUL_NO_EFFECT, - TYPE_GROUND, TYPE_FIRE, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_GROUND, TYPE_ELECTRIC, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_GROUND, TYPE_GRASS, TYPE_MUL_NOT_EFFECTIVE, - TYPE_GROUND, TYPE_POISON, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_GROUND, TYPE_FLYING, TYPE_MUL_NO_EFFECT, - TYPE_GROUND, TYPE_BUG, TYPE_MUL_NOT_EFFECTIVE, - TYPE_GROUND, TYPE_ROCK, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_GROUND, TYPE_STEEL, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_FLYING, TYPE_ELECTRIC, TYPE_MUL_NOT_EFFECTIVE, - TYPE_FLYING, TYPE_GRASS, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_FLYING, TYPE_FIGHTING, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_FLYING, TYPE_BUG, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_FLYING, TYPE_ROCK, TYPE_MUL_NOT_EFFECTIVE, - TYPE_FLYING, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE, - TYPE_PSYCHIC, TYPE_FIGHTING, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_PSYCHIC, TYPE_POISON, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_PSYCHIC, TYPE_PSYCHIC, TYPE_MUL_NOT_EFFECTIVE, - TYPE_PSYCHIC, TYPE_DARK, TYPE_MUL_NO_EFFECT, - TYPE_PSYCHIC, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE, - TYPE_BUG, TYPE_FIRE, TYPE_MUL_NOT_EFFECTIVE, - TYPE_BUG, TYPE_GRASS, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_BUG, TYPE_FIGHTING, TYPE_MUL_NOT_EFFECTIVE, - TYPE_BUG, TYPE_POISON, TYPE_MUL_NOT_EFFECTIVE, - TYPE_BUG, TYPE_FLYING, TYPE_MUL_NOT_EFFECTIVE, - TYPE_BUG, TYPE_PSYCHIC, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_BUG, TYPE_GHOST, TYPE_MUL_NOT_EFFECTIVE, - TYPE_BUG, TYPE_DARK, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_BUG, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE, - TYPE_ROCK, TYPE_FIRE, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_ROCK, TYPE_ICE, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_ROCK, TYPE_FIGHTING, TYPE_MUL_NOT_EFFECTIVE, - TYPE_ROCK, TYPE_GROUND, TYPE_MUL_NOT_EFFECTIVE, - TYPE_ROCK, TYPE_FLYING, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_ROCK, TYPE_BUG, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_ROCK, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE, - TYPE_GHOST, TYPE_NORMAL, TYPE_MUL_NO_EFFECT, - TYPE_GHOST, TYPE_PSYCHIC, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_GHOST, TYPE_DARK, TYPE_MUL_NOT_EFFECTIVE, - TYPE_GHOST, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE, - TYPE_GHOST, TYPE_GHOST, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_DRAGON, TYPE_DRAGON, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_DRAGON, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE, - TYPE_DARK, TYPE_FIGHTING, TYPE_MUL_NOT_EFFECTIVE, - TYPE_DARK, TYPE_PSYCHIC, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_DARK, TYPE_GHOST, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_DARK, TYPE_DARK, TYPE_MUL_NOT_EFFECTIVE, - TYPE_DARK, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE, - TYPE_STEEL, TYPE_FIRE, TYPE_MUL_NOT_EFFECTIVE, - TYPE_STEEL, TYPE_WATER, TYPE_MUL_NOT_EFFECTIVE, - TYPE_STEEL, TYPE_ELECTRIC, TYPE_MUL_NOT_EFFECTIVE, - TYPE_STEEL, TYPE_ICE, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_STEEL, TYPE_ROCK, TYPE_MUL_SUPER_EFFECTIVE, - TYPE_STEEL, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE, - TYPE_FORESIGHT, TYPE_FORESIGHT, TYPE_MUL_NO_EFFECT, - TYPE_NORMAL, TYPE_GHOST, TYPE_MUL_NO_EFFECT, - TYPE_FIGHTING, TYPE_GHOST, TYPE_MUL_NO_EFFECT, - TYPE_ENDTABLE, TYPE_ENDTABLE, TYPE_MUL_NO_EFFECT -}; - const u8 gTypeNames[NUMBER_OF_MON_TYPES][TYPE_NAME_LENGTH + 1] = { _("NORMAL"), @@ -456,6 +318,7 @@ const u8 gTypeNames[NUMBER_OF_MON_TYPES][TYPE_NAME_LENGTH + 1] = _("ICE"), _("DRAGON"), _("DARK"), + _("FAIRY"), }; // This is a factor in how much money you get for beating a trainer. @@ -622,7 +485,7 @@ static void CB2_InitBattleInternal(void) gBattle_WIN0H = 240; - if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId != TRAINER_STEVEN_PARTNER) + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId != TRAINER_STEVEN_PARTNER && gPartnerTrainerId < TRAINER_CUSTOM_PARTNER) { gBattle_WIN0V = 159; gBattle_WIN1H = 240; @@ -684,7 +547,7 @@ static void CB2_InitBattleInternal(void) if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED))) { CreateNPCTrainerParty(&gEnemyParty[0], gTrainerBattleOpponent_A, TRUE); - if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && !BATTLE_TWO_VS_ONE_OPPONENT) CreateNPCTrainerParty(&gEnemyParty[3], gTrainerBattleOpponent_B, FALSE); SetWildMonHeldItem(); } @@ -2031,12 +1894,6 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir return gTrainers[trainerNum].partySize; } -void sub_8038A04(void) // unused -{ - if (REG_VCOUNT < 0xA0 && REG_VCOUNT >= 0x6F) - SetGpuReg(REG_OFFSET_BG0CNT, 0x9800); -} - void VBlankCB_Battle(void) { // Change gRngSeed every vblank unless the battle could be recorded. @@ -2636,7 +2493,10 @@ void SpriteCb_WildMon(struct Sprite *sprite) { sprite->callback = SpriteCb_MoveWildMonToRight; StartSpriteAnimIfDifferent(sprite, 0); - BeginNormalPaletteFade(0x20000, 0, 10, 10, RGB(8, 8, 8)); + if (WILD_DOUBLE_BATTLE) + BeginNormalPaletteFade((0x10000 << sprite->sBattler) | (0x10000 << BATTLE_PARTNER(sprite->sBattler)), 0, 10, 10, RGB(8, 8, 8)); + else + BeginNormalPaletteFade((0x10000 << sprite->sBattler), 0, 10, 10, RGB(8, 8, 8)); } static void SpriteCb_MoveWildMonToRight(struct Sprite *sprite) @@ -2659,7 +2519,10 @@ static void SpriteCb_WildMonShowHealthbox(struct Sprite *sprite) SetHealthboxSpriteVisible(gHealthboxSpriteIds[sprite->sBattler]); sprite->callback = SpriteCb_WildMonAnimate; StartSpriteAnimIfDifferent(sprite, 0); - BeginNormalPaletteFade(0x20000, 0, 10, 0, RGB(8, 8, 8)); + if (WILD_DOUBLE_BATTLE) + BeginNormalPaletteFade((0x10000 << sprite->sBattler) | (0x10000 << BATTLE_PARTNER(sprite->sBattler)), 0, 10, 0, RGB(8, 8, 8)); + else + BeginNormalPaletteFade((0x10000 << sprite->sBattler), 0, 10, 0, RGB(8, 8, 8)); } } @@ -2676,13 +2539,6 @@ void SpriteCallbackDummy_2(struct Sprite *sprite) } -static void sub_80398BC(struct Sprite *sprite) // unused? -{ - sprite->data[3] = 6; - sprite->data[4] = 1; - sprite->callback = sub_80398D0; -} - static void sub_80398D0(struct Sprite *sprite) { if (--sprite->data[4] == 0) @@ -2694,7 +2550,7 @@ static void sub_80398D0(struct Sprite *sprite) { sprite->invisible = FALSE; sprite->callback = SpriteCallbackDummy_2; - sUnusedUnknownArray[0] = 0; + // sUnusedUnknownArray[0] = 0; } } } @@ -2844,11 +2700,11 @@ void sub_8039C00(struct Sprite *sprite) } } -#define sSinIndex data[0] -#define sDelta data[1] -#define sAmplitude data[2] -#define sBouncerSpriteId data[3] -#define sWhich data[4] +#define sSinIndex data[3] +#define sDelta data[4] +#define sAmplitude data[5] +#define sBouncerSpriteId data[6] +#define sWhich data[7] void DoBounceEffect(u8 battler, u8 which, s8 delta, s8 amplitude) { @@ -2887,6 +2743,7 @@ void DoBounceEffect(u8 battler, u8 which, s8 delta, s8 amplitude) gSprites[invisibleSpriteId].sAmplitude = amplitude; gSprites[invisibleSpriteId].sBouncerSpriteId = bouncerSpriteId; gSprites[invisibleSpriteId].sWhich = which; + gSprites[invisibleSpriteId].sBattler = battler; gSprites[bouncerSpriteId].pos2.x = 0; gSprites[bouncerSpriteId].pos2.y = 0; } @@ -2921,15 +2778,15 @@ void EndBounceEffect(u8 battler, u8 which) static void SpriteCB_BounceEffect(struct Sprite *sprite) { u8 bouncerSpriteId = sprite->sBouncerSpriteId; - s32 index; + s32 index = sprite->sSinIndex; + s32 y = Sin(index, sprite->sAmplitude) + sprite->sAmplitude; - if (sprite->sWhich == BOUNCE_HEALTHBOX) - index = sprite->sSinIndex; - else - index = sprite->sSinIndex; - - gSprites[bouncerSpriteId].pos2.y = Sin(index, sprite->sAmplitude) + sprite->sAmplitude; + gSprites[bouncerSpriteId].pos2.y = y; sprite->sSinIndex = (sprite->sSinIndex + sprite->sDelta) & 0xFF; + + bouncerSpriteId = GetMegaIndicatorSpriteId(sprite->sBouncerSpriteId); + if (sprite->sWhich == BOUNCE_HEALTHBOX && bouncerSpriteId != 0xFF) + gSprites[bouncerSpriteId].pos2.y = y; } #undef sSinIndex @@ -2972,7 +2829,8 @@ void BeginBattleIntro(void) { BattleStartClearSetData(); gBattleCommunication[1] = 0; - gBattleMainFunc = BattleIntroGetMonsData; + gBattleStruct->introState = 0; + gBattleMainFunc = DoBattleIntro; } static void BattleMainCB1(void) @@ -2986,22 +2844,21 @@ static void BattleMainCB1(void) static void BattleStartClearSetData(void) { s32 i; - u32 j; - u8 *dataPtr; TurnValuesCleanUp(FALSE); SpecialStatusesClear(); + memset(&gDisableStructs, 0, sizeof(gDisableStructs)); + memset(&gFieldTimers, 0, sizeof(gFieldTimers)); + memset(&gSideStatuses, 0, sizeof(gSideStatuses)); + memset(&gSideTimers, 0, sizeof(gSideTimers)); + memset(&gWishFutureKnock, 0, sizeof(gWishFutureKnock)); + memset(&gBattleResults, 0, sizeof(gBattleResults)); + for (i = 0; i < MAX_BATTLERS_COUNT; i++) { gStatuses3[i] = 0; - - dataPtr = (u8 *)&gDisableStructs[i]; - for (j = 0; j < sizeof(struct DisableStruct); j++) - dataPtr[j] = 0; - gDisableStructs[i].isFirstTurn = 2; - sUnusedBattlersArray[i] = 0; gLastMoves[i] = 0; gLastLandedMoves[i] = 0; gLastHitByType[i] = 0; @@ -3011,25 +2868,23 @@ static void BattleStartClearSetData(void) gLastPrintedMoves[i] = 0; gBattleResources->flags->flags[i] = 0; gPalaceSelectionBattleScripts[i] = 0; + gBattleStruct->lastTakenMove[i] = 0; + gBattleStruct->usedHeldItems[i] = 0; + gBattleStruct->choicedMove[i] = 0; + gBattleStruct->changedItems[i] = 0; + gBattleStruct->lastTakenMoveFrom[i][0] = 0; + gBattleStruct->lastTakenMoveFrom[i][1] = 0; + gBattleStruct->lastTakenMoveFrom[i][2] = 0; + gBattleStruct->lastTakenMoveFrom[i][3] = 0; + gBattleStruct->AI_monToSwitchIntoId[i] = PARTY_SIZE; } - for (i = 0; i < 2; i++) - { - gSideStatuses[i] = 0; - - dataPtr = (u8 *)&gSideTimers[i]; - for (j = 0; j < sizeof(struct SideTimer); j++) - dataPtr[j] = 0; - } + gLastUsedMove = 0; + gFieldStatuses = 0; gBattlerAttacker = 0; gBattlerTarget = 0; gBattleWeather = 0; - - dataPtr = (u8 *)&gWishFutureKnock; - for (i = 0; i < sizeof(struct WishFutureKnock); i++) - dataPtr[i] = 0; - gHitMarker = 0; if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) @@ -3038,9 +2893,13 @@ static void BattleStartClearSetData(void) gHitMarker |= HITMARKER_NO_ANIMATIONS; } else if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) && GetBattleSceneInRecordedBattle()) + { gHitMarker |= HITMARKER_NO_ANIMATIONS; + } gBattleScripting.battleStyle = gSaveBlock2Ptr->optionsBattleStyle; + gBattleScripting.expOnCatch = (B_EXP_CATCH >= GEN_6); + gBattleScripting.monCaught = FALSE; gMultiHitCounter = 0; gBattleOutcome = 0; @@ -3062,49 +2921,30 @@ static void BattleStartClearSetData(void) gBattleStruct->runTries = 0; gBattleStruct->safariGoNearCounter = 0; gBattleStruct->safariPkblThrowCounter = 0; - *(&gBattleStruct->safariCatchFactor) = gBaseStats[GetMonData(&gEnemyParty[0], MON_DATA_SPECIES)].catchRate * 100 / 1275; + gBattleStruct->safariCatchFactor = gBaseStats[GetMonData(&gEnemyParty[0], MON_DATA_SPECIES)].catchRate * 100 / 1275; gBattleStruct->safariEscapeFactor = 3; gBattleStruct->wildVictorySong = 0; gBattleStruct->moneyMultiplier = 1; - for (i = 0; i < 8; i++) - { - *((u8 *)gBattleStruct->lastTakenMove + i) = 0; - *((u8 *)gBattleStruct->usedHeldItems + i) = 0; - *((u8 *)gBattleStruct->choicedMove + i) = 0; - *((u8 *)gBattleStruct->changedItems + i) = 0; - *(i + 0 * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; - *(i + 1 * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; - *(i + 2 * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; - *(i + 3 * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; - } - - for (i = 0; i < MAX_BATTLERS_COUNT; i++) - { - *(gBattleStruct->AI_monToSwitchIntoId + i) = PARTY_SIZE; - } - gBattleStruct->givenExpMons = 0; gBattleStruct->palaceFlags = 0; gRandomTurnNumber = Random(); - dataPtr = (u8 *)(&gBattleResults); - for (i = 0; i < sizeof(struct BattleResults); i++) - dataPtr[i] = 0; - gBattleResults.shinyWildMon = IsMonShiny(&gEnemyParty[0]); gBattleStruct->arenaLostPlayerMons = 0; gBattleStruct->arenaLostOpponentMons = 0; + + gBattleStruct->mega.triggerSpriteId = 0xFF; } void SwitchInClearSetData(void) { - struct DisableStruct disableStructCopy = gDisableStructs[gActiveBattler]; s32 i; - u8 *ptr; + struct DisableStruct disableStructCopy = gDisableStructs[gActiveBattler]; + ClearIllusionMon(gActiveBattler); if (gBattleMoves[gCurrentMove].effect != EFFECT_BATON_PASS) { for (i = 0; i < NUM_BATTLE_STATS; i++) @@ -3123,7 +2963,7 @@ void SwitchInClearSetData(void) if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS) { gBattleMons[gActiveBattler].status2 &= (STATUS2_CONFUSION | STATUS2_FOCUS_ENERGY | STATUS2_SUBSTITUTE | STATUS2_ESCAPE_PREVENTION | STATUS2_CURSED); - gStatuses3[gActiveBattler] &= (STATUS3_LEECHSEED_BATTLER | STATUS3_LEECHSEED | STATUS3_ALWAYS_HITS | STATUS3_PERISH_SONG | STATUS3_ROOTED | STATUS3_MUDSPORT | STATUS3_WATERSPORT); + gStatuses3[gActiveBattler] &= (STATUS3_LEECHSEED_BATTLER | STATUS3_LEECHSEED | STATUS3_ALWAYS_HITS | STATUS3_PERISH_SONG | STATUS3_ROOTED); for (i = 0; i < gBattlersCount; i++) { @@ -3135,6 +2975,8 @@ void SwitchInClearSetData(void) gStatuses3[i] |= STATUS3_ALWAYS_HITS_TURN(2); } } + if (gStatuses3[gActiveBattler] & STATUS3_POWER_TRICK) + SWAP(gBattleMons[gActiveBattler].attack, gBattleMons[gActiveBattler].defense, i); } else { @@ -3153,9 +2995,7 @@ void SwitchInClearSetData(void) gActionSelectionCursor[gActiveBattler] = 0; gMoveSelectionCursor[gActiveBattler] = 0; - ptr = (u8 *)&gDisableStructs[gActiveBattler]; - for (i = 0; i < sizeof(struct DisableStruct); i++) - ptr[i] = 0; + memset(&gDisableStructs[gActiveBattler], 0, sizeof(struct DisableStruct)); if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS) { @@ -3176,33 +3016,24 @@ void SwitchInClearSetData(void) gLastPrintedMoves[gActiveBattler] = 0; gLastHitBy[gActiveBattler] = 0xFF; - *(gBattleStruct->lastTakenMove + gActiveBattler * 2 + 0) = 0; - *(gBattleStruct->lastTakenMove + gActiveBattler * 2 + 1) = 0; - *(0 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; - *(0 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 1) = 0; - *(1 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; - *(1 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 1) = 0; - *(2 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; - *(2 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 1) = 0; - *(3 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; - *(3 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 1) = 0; - + gBattleStruct->lastTakenMove[gActiveBattler] = 0; + gBattleStruct->sameMoveTurns[gActiveBattler] = 0; + gBattleStruct->lastTakenMoveFrom[gActiveBattler][0] = 0; + gBattleStruct->lastTakenMoveFrom[gActiveBattler][1] = 0; + gBattleStruct->lastTakenMoveFrom[gActiveBattler][2] = 0; + gBattleStruct->lastTakenMoveFrom[gActiveBattler][3] = 0; + gBattleStruct->lastMoveFailed &= ~(gBitTable[gActiveBattler]); gBattleStruct->palaceFlags &= ~(gBitTable[gActiveBattler]); for (i = 0; i < gBattlersCount; i++) { if (i != gActiveBattler && GetBattlerSide(i) != GetBattlerSide(gActiveBattler)) - { - *(gBattleStruct->lastTakenMove + i * 2 + 0) = 0; - *(gBattleStruct->lastTakenMove + i * 2 + 1) = 0; - } - *(i * 8 + gActiveBattler * 2 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; - *(i * 8 + gActiveBattler * 2 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 1) = 0; + gBattleStruct->lastTakenMove[i] = 0; + + gBattleStruct->lastTakenMoveFrom[i][gActiveBattler] = 0; } - *(u8*)((u8*)(&gBattleStruct->choicedMove[gActiveBattler]) + 0) = 0; - *(u8*)((u8*)(&gBattleStruct->choicedMove[gActiveBattler]) + 1) = 0; - + gBattleStruct->choicedMove[gActiveBattler] = 0; gBattleResources->flags->flags[gActiveBattler] = 0; gCurrentMove = 0; gBattleStruct->arenaTurnCounter = 0xFF; @@ -3214,7 +3045,6 @@ void SwitchInClearSetData(void) void FaintClearSetData(void) { s32 i; - u8 *ptr; for (i = 0; i < NUM_BATTLE_STATS; i++) gBattleMons[gActiveBattler].statStages[i] = DEFAULT_STAT_STAGE; @@ -3235,17 +3065,17 @@ void FaintClearSetData(void) gActionSelectionCursor[gActiveBattler] = 0; gMoveSelectionCursor[gActiveBattler] = 0; - ptr = (u8 *)&gDisableStructs[gActiveBattler]; - for (i = 0; i < sizeof(struct DisableStruct); i++) - ptr[i] = 0; + memset(&gDisableStructs[gActiveBattler], 0, sizeof(struct DisableStruct)); gProtectStructs[gActiveBattler].protected = 0; + gProtectStructs[gActiveBattler].spikyShielded = 0; + gProtectStructs[gActiveBattler].kingsShielded = 0; + gProtectStructs[gActiveBattler].banefulBunkered = 0; gProtectStructs[gActiveBattler].endured = 0; gProtectStructs[gActiveBattler].noValidMoves = 0; gProtectStructs[gActiveBattler].helpingHand = 0; gProtectStructs[gActiveBattler].bounceMove = 0; gProtectStructs[gActiveBattler].stealMove = 0; - gProtectStructs[gActiveBattler].flag0Unknown = 0; gProtectStructs[gActiveBattler].prlzImmobility = 0; gProtectStructs[gActiveBattler].confusionSelfDmg = 0; gProtectStructs[gActiveBattler].targetNotAffected = 0; @@ -3258,6 +3088,10 @@ void FaintClearSetData(void) gProtectStructs[gActiveBattler].flag2Unknown = 0; gProtectStructs[gActiveBattler].flinchImmobility = 0; gProtectStructs[gActiveBattler].notFirstStrike = 0; + gProtectStructs[gActiveBattler].usedHealBlockedMove = 0; + gProtectStructs[gActiveBattler].usesBouncedMove = 0; + gProtectStructs[gActiveBattler].usedGravityPreventedMove = 0; + gProtectStructs[gActiveBattler].usedThroatChopPreventedMove = 0; gDisableStructs[gActiveBattler].isFirstTurn = 2; @@ -3268,505 +3102,360 @@ void FaintClearSetData(void) gLastPrintedMoves[gActiveBattler] = 0; gLastHitBy[gActiveBattler] = 0xFF; - *(u8*)((u8*)(&gBattleStruct->choicedMove[gActiveBattler]) + 0) = 0; - *(u8*)((u8*)(&gBattleStruct->choicedMove[gActiveBattler]) + 1) = 0; - - *(gBattleStruct->lastTakenMove + gActiveBattler * 2 + 0) = 0; - *(gBattleStruct->lastTakenMove + gActiveBattler * 2 + 1) = 0; - *(0 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; - *(0 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 1) = 0; - *(1 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; - *(1 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 1) = 0; - *(2 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; - *(2 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 1) = 0; - *(3 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; - *(3 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 1) = 0; + gBattleStruct->choicedMove[gActiveBattler] = 0; + gBattleStruct->sameMoveTurns[gActiveBattler] = 0; + gBattleStruct->lastTakenMove[gActiveBattler] = 0; + gBattleStruct->lastTakenMoveFrom[gActiveBattler][0] = 0; + gBattleStruct->lastTakenMoveFrom[gActiveBattler][1] = 0; + gBattleStruct->lastTakenMoveFrom[gActiveBattler][2] = 0; + gBattleStruct->lastTakenMoveFrom[gActiveBattler][3] = 0; gBattleStruct->palaceFlags &= ~(gBitTable[gActiveBattler]); for (i = 0; i < gBattlersCount; i++) { if (i != gActiveBattler && GetBattlerSide(i) != GetBattlerSide(gActiveBattler)) - { - *(gBattleStruct->lastTakenMove + i * 2 + 0) = 0; - *(gBattleStruct->lastTakenMove + i * 2 + 1) = 0; - } - *(i * 8 + gActiveBattler * 2 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 0) = 0; - *(i * 8 + gActiveBattler * 2 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 1) = 0; + gBattleStruct->lastTakenMove[i] = 0; + + gBattleStruct->lastTakenMoveFrom[i][gActiveBattler] = 0; } gBattleResources->flags->flags[gActiveBattler] = 0; gBattleMons[gActiveBattler].type1 = gBaseStats[gBattleMons[gActiveBattler].species].type1; gBattleMons[gActiveBattler].type2 = gBaseStats[gBattleMons[gActiveBattler].species].type2; + gBattleMons[gActiveBattler].type3 = TYPE_MYSTERY; ClearBattlerMoveHistory(gActiveBattler); ClearBattlerAbilityHistory(gActiveBattler); + UndoFormChange(gBattlerPartyIndexes[gActiveBattler], GET_BATTLER_SIDE(gActiveBattler)); + if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) + UndoMegaEvolution(gBattlerPartyIndexes[gActiveBattler]); } -static void BattleIntroGetMonsData(void) +static void DoBattleIntro(void) { - switch (gBattleCommunication[MULTIUSE_STATE]) + s32 i; + u8 *state = &gBattleStruct->introState; + + switch (*state) { - case 0: + case 0: // Get Data of all battlers. gActiveBattler = gBattleCommunication[1]; BtlController_EmitGetMonData(0, REQUEST_ALL_BATTLE, 0); MarkBattlerForControllerExec(gActiveBattler); - gBattleCommunication[MULTIUSE_STATE]++; + (*state)++; break; - case 1: - if (gBattleControllerExecFlags == 0) + case 1: // Loop through all battlers. + if (!gBattleControllerExecFlags) { - gBattleCommunication[1]++; - if (gBattleCommunication[1] == gBattlersCount) - gBattleMainFunc = BattleIntroPrepareBackgroundSlide; + if (++gBattleCommunication[1] == gBattlersCount) + (*state)++; else - gBattleCommunication[MULTIUSE_STATE] = 0; + *state = 0; } break; - } -} - -static void BattleIntroPrepareBackgroundSlide(void) -{ - if (gBattleControllerExecFlags == 0) - { - gActiveBattler = GetBattlerAtPosition(0); - BtlController_EmitIntroSlide(0, gBattleTerrain); - MarkBattlerForControllerExec(gActiveBattler); - gBattleMainFunc = BattleIntroDrawTrainersOrMonsSprites; - gBattleCommunication[0] = 0; - gBattleCommunication[1] = 0; - } -} - -static void BattleIntroDrawTrainersOrMonsSprites(void) -{ - u8 *ptr; - s32 i; - - if (gBattleControllerExecFlags) - return; - - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) - { - if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) - && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) + case 2: // Start graphical intro slide. + if (!gBattleControllerExecFlags) { - ptr = (u8 *)&gBattleMons[gActiveBattler]; - for (i = 0; i < sizeof(struct BattlePokemon); i++) - ptr[i] = 0; - } - else - { - u16* hpOnSwitchout; - - ptr = (u8 *)&gBattleMons[gActiveBattler]; - for (i = 0; i < sizeof(struct BattlePokemon); i++) - ptr[i] = gBattleBufferB[gActiveBattler][4 + i]; - - gBattleMons[gActiveBattler].type1 = gBaseStats[gBattleMons[gActiveBattler].species].type1; - gBattleMons[gActiveBattler].type2 = gBaseStats[gBattleMons[gActiveBattler].species].type2; - gBattleMons[gActiveBattler].ability = GetAbilityBySpecies(gBattleMons[gActiveBattler].species, gBattleMons[gActiveBattler].abilityNum); - hpOnSwitchout = &gBattleStruct->hpOnSwitchout[GetBattlerSide(gActiveBattler)]; - *hpOnSwitchout = gBattleMons[gActiveBattler].hp; - for (i = 0; i < NUM_BATTLE_STATS; i++) - gBattleMons[gActiveBattler].statStages[i] = DEFAULT_STAT_STAGE; - gBattleMons[gActiveBattler].status2 = 0; - } - - if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT) - { - BtlController_EmitDrawTrainerPic(0); + gActiveBattler = GetBattlerAtPosition(0); + BtlController_EmitIntroSlide(0, gBattleTerrain); MarkBattlerForControllerExec(gActiveBattler); + gBattleCommunication[0] = 0; + gBattleCommunication[1] = 0; + (*state)++; + } + break; + case 3: // Wait for intro slide. + if (!gBattleControllerExecFlags) + (*state)++; + break; + case 4: // Copy battler data gotten in cases 0 and 1. Draw trainer/mon sprite. + for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) + { + if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) + { + memset(&gBattleMons[gActiveBattler], 0, sizeof(struct BattlePokemon)); + } + else + { + memcpy(&gBattleMons[gActiveBattler], &gBattleResources->bufferB[gActiveBattler][4], sizeof(struct BattlePokemon)); + gBattleMons[gActiveBattler].type1 = gBaseStats[gBattleMons[gActiveBattler].species].type1; + gBattleMons[gActiveBattler].type2 = gBaseStats[gBattleMons[gActiveBattler].species].type2; + gBattleMons[gActiveBattler].type3 = TYPE_MYSTERY; + gBattleMons[gActiveBattler].ability = GetAbilityBySpecies(gBattleMons[gActiveBattler].species, gBattleMons[gActiveBattler].abilityNum); + gBattleStruct->hpOnSwitchout[GetBattlerSide(gActiveBattler)] = gBattleMons[gActiveBattler].hp; + gBattleMons[gActiveBattler].status2 = 0; + for (i = 0; i < NUM_BATTLE_STATS; i++) + gBattleMons[gActiveBattler].statStages[i] = 6; + } + + // Draw sprite. + switch (GetBattlerPosition(gActiveBattler)) + { + case B_POSITION_PLAYER_LEFT: // player sprite + BtlController_EmitDrawTrainerPic(0); + MarkBattlerForControllerExec(gActiveBattler); + break; + case B_POSITION_OPPONENT_LEFT: + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) // opponent 1 sprite + { + BtlController_EmitDrawTrainerPic(0); + MarkBattlerForControllerExec(gActiveBattler); + } + else // wild mon 1 + { + BtlController_EmitLoadMonSprite(0); + MarkBattlerForControllerExec(gActiveBattler); + gBattleResults.lastOpponentSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES, NULL); + } + break; + case B_POSITION_PLAYER_RIGHT: + if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER)) // partner sprite + { + BtlController_EmitDrawTrainerPic(0); + MarkBattlerForControllerExec(gActiveBattler); + } + break; + case B_POSITION_OPPONENT_RIGHT: + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + { + if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS) && !BATTLE_TWO_VS_ONE_OPPONENT) // opponent 2 if exists + { + BtlController_EmitDrawTrainerPic(0); + MarkBattlerForControllerExec(gActiveBattler); + } + } + else // wild mon 2 + { + BtlController_EmitLoadMonSprite(0); + MarkBattlerForControllerExec(gActiveBattler); + gBattleResults.lastOpponentSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES, NULL); + } + break; + } + + if (gBattleTypeFlags & BATTLE_TYPE_ARENA) + BattleArena_InitPoints(); } if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_LEFT) + (*state)++; + } + else // Skip party summary since it is a wild battle. + { + if (B_FAST_INTRO) + *state = 7; // Don't wait for sprite, print message at the same time. + else + *state = 6; // Wait for sprite to load. + } + break; + case 5: // draw party summary in trainer battles + if (!gBattleControllerExecFlags) + { + struct HpAndStatus hpStatus[PARTY_SIZE]; + + for (i = 0; i < PARTY_SIZE; i++) { - BtlController_EmitDrawTrainerPic(0); - MarkBattlerForControllerExec(gActiveBattler); + if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_NONE + || GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) + { + hpStatus[i].hp = 0xFFFF; + hpStatus[i].status = 0; + } + else + { + hpStatus[i].hp = GetMonData(&gEnemyParty[i], MON_DATA_HP); + hpStatus[i].status = GetMonData(&gEnemyParty[i], MON_DATA_STATUS); + } } - if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT - && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER - | BATTLE_TYPE_FRONTIER - | BATTLE_TYPE_LINK - | BATTLE_TYPE_x2000000 - | BATTLE_TYPE_TRAINER_HILL))) + + gActiveBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + BtlController_EmitDrawPartyStatusSummary(0, hpStatus, 0x80); + MarkBattlerForControllerExec(gActiveBattler); + + for (i = 0; i < PARTY_SIZE; i++) { - HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality); + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_NONE + || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) + { + hpStatus[i].hp = 0xFFFF; + hpStatus[i].status = 0; + } + else + { + hpStatus[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); + hpStatus[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); + } + } + + gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); + BtlController_EmitDrawPartyStatusSummary(0, hpStatus, 0x80); + MarkBattlerForControllerExec(gActiveBattler); + + (*state)++; + } + break; + case 6: // wait for previous action to complete + if (!gBattleControllerExecFlags) + (*state)++; + break; + case 7: // print battle intro message + if (!IsBattlerMarkedForControllerExec(GetBattlerAtPosition(B_POSITION_PLAYER_LEFT))) + { + PrepareStringBattle(STRINGID_INTROMSG, GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)); + (*state)++; + } + break; + case 8: // wait for intro message to be printed + if (!IsBattlerMarkedForControllerExec(GetBattlerAtPosition(B_POSITION_PLAYER_LEFT))) + { + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + { + (*state)++; + } + else + { + if (B_FAST_INTRO) + *state = 15; // Wait for text to be printed. + else + *state = 14; // Wait for text and sprite. } } + break; + case 9: // print opponent sends out + if (gBattleTypeFlags & BATTLE_TYPE_x2000000 && !(gBattleTypeFlags & BATTLE_TYPE_x80000000)) + PrepareStringBattle(STRINGID_INTROSENDOUT, GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)); else + PrepareStringBattle(STRINGID_INTROSENDOUT, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)); + (*state)++; + break; + case 10: // wait for opponent sends out text + if (!gBattleControllerExecFlags) + (*state)++; + break; + case 11: // first opponent's mon send out animation + if (gBattleTypeFlags & BATTLE_TYPE_x2000000 && !(gBattleTypeFlags & BATTLE_TYPE_x80000000)) + gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); + else + gActiveBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + + BtlController_EmitIntroTrainerBallThrow(0); + MarkBattlerForControllerExec(gActiveBattler); + (*state)++; + break; + case 12: // nothing + (*state)++; + case 13: // second opponent's mon send out + if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS) && !BATTLE_TWO_VS_ONE_OPPONENT) { - if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT) + if (gBattleTypeFlags & BATTLE_TYPE_x2000000 && !(gBattleTypeFlags & BATTLE_TYPE_x80000000)) + gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); + else + gActiveBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); + + BtlController_EmitIntroTrainerBallThrow(0); + MarkBattlerForControllerExec(gActiveBattler); + } + if (B_FAST_INTRO && !(gBattleTypeFlags & (BATTLE_TYPE_RECORDED | BATTLE_TYPE_x2000000 | BATTLE_TYPE_x80000000 | BATTLE_TYPE_LINK))) + *state = 15; // Print at the same time as trainer sends out second mon. + else + (*state)++; + break; + case 14: // wait for opponent 2 send out + if (!gBattleControllerExecFlags) + (*state)++; + break; + case 15: // wait for wild battle message + if (!IsBattlerMarkedForControllerExec(GetBattlerAtPosition(B_POSITION_PLAYER_LEFT))) + (*state)++; + break; + case 16: // print player sends out + if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) + { + if (gBattleTypeFlags & BATTLE_TYPE_x2000000 && !(gBattleTypeFlags & BATTLE_TYPE_x80000000)) + gActiveBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + else + gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); + + // A hack that makes fast intro work in trainer battles too. + if (B_FAST_INTRO + && gBattleTypeFlags & BATTLE_TYPE_TRAINER + && !(gBattleTypeFlags & (BATTLE_TYPE_RECORDED | BATTLE_TYPE_x2000000 | BATTLE_TYPE_x80000000 | BATTLE_TYPE_LINK)) + && gSprites[gHealthboxSpriteIds[gActiveBattler ^ BIT_SIDE]].callback == SpriteCallbackDummy) { - if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER - | BATTLE_TYPE_FRONTIER - | BATTLE_TYPE_LINK - | BATTLE_TYPE_x2000000 - | BATTLE_TYPE_TRAINER_HILL))) + return; + } + + PrepareStringBattle(STRINGID_INTROSENDOUT, gActiveBattler); + } + (*state)++; + break; + case 17: // wait for player send out message + if (!(gBattleTypeFlags & BATTLE_TYPE_LINK && gBattleControllerExecFlags)) + { + if (gBattleTypeFlags & BATTLE_TYPE_x2000000 && !(gBattleTypeFlags & BATTLE_TYPE_x80000000)) + gActiveBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + else + gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); + + if (!IsBattlerMarkedForControllerExec(gActiveBattler)) + (*state)++; + } + break; + case 18: // player 1 send out + if (gBattleTypeFlags & BATTLE_TYPE_x2000000 && !(gBattleTypeFlags & BATTLE_TYPE_x80000000)) + gActiveBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + else + gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); + + BtlController_EmitIntroTrainerBallThrow(0); + MarkBattlerForControllerExec(gActiveBattler); + (*state)++; + break; + case 19: // player 2 send out + if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER)) + { + if (gBattleTypeFlags & BATTLE_TYPE_x2000000 && !(gBattleTypeFlags & BATTLE_TYPE_x80000000)) + gActiveBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); + else + gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); + + BtlController_EmitIntroTrainerBallThrow(0); + MarkBattlerForControllerExec(gActiveBattler); + } + (*state)++; + break; + case 20: // set dex and battle vars + if (!gBattleControllerExecFlags) + { + for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) + { + if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT + && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER + | BATTLE_TYPE_FRONTIER + | BATTLE_TYPE_LINK + | BATTLE_TYPE_x2000000 + | BATTLE_TYPE_TRAINER_HILL))) { HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality); } - BtlController_EmitLoadMonSprite(0); - MarkBattlerForControllerExec(gActiveBattler); - gBattleResults.lastOpponentSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES, NULL); } + + gBattleStruct->switchInAbilitiesCounter = 0; + gBattleStruct->switchInItemsCounter = 0; + gBattleStruct->overworldWeatherDone = FALSE; + + gBattleMainFunc = TryDoEventsBeforeFirstTurn; } - - if ((gBattleTypeFlags & BATTLE_TYPE_MULTI) && (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT || GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_RIGHT)) - { - BtlController_EmitDrawTrainerPic(0); - MarkBattlerForControllerExec(gActiveBattler); - } - - if ((gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) && (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_RIGHT)) - { - BtlController_EmitDrawTrainerPic(0); - MarkBattlerForControllerExec(gActiveBattler); - } - - if (gBattleTypeFlags & BATTLE_TYPE_ARENA) - BattleArena_InitPoints(); - } - gBattleMainFunc = BattleIntroDrawPartySummaryScreens; -} - -static void BattleIntroDrawPartySummaryScreens(void) -{ - s32 i; - struct HpAndStatus hpStatus[PARTY_SIZE]; - - if (gBattleControllerExecFlags) - return; - - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - for (i = 0; i < PARTY_SIZE; i++) - { - if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_NONE - || GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) - { - hpStatus[i].hp = 0xFFFF; - hpStatus[i].status = 0; - } - else - { - hpStatus[i].hp = GetMonData(&gEnemyParty[i], MON_DATA_HP); - hpStatus[i].status = GetMonData(&gEnemyParty[i], MON_DATA_STATUS); - } - } - gActiveBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); - BtlController_EmitDrawPartyStatusSummary(0, hpStatus, 0x80); - MarkBattlerForControllerExec(gActiveBattler); - - for (i = 0; i < PARTY_SIZE; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_NONE - || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) - { - hpStatus[i].hp = 0xFFFF; - hpStatus[i].status = 0; - } - else - { - hpStatus[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); - hpStatus[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); - } - } - gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - BtlController_EmitDrawPartyStatusSummary(0, hpStatus, 0x80); - MarkBattlerForControllerExec(gActiveBattler); - - gBattleMainFunc = BattleIntroPrintTrainerWantsToBattle; - } - else - { - // The struct gets set here, but nothing is ever done with it since - // wild battles don't show the party summary. - // Still, there's no point in having dead code. - - for (i = 0; i < PARTY_SIZE; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_NONE - || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) - { - hpStatus[i].hp = 0xFFFF; - hpStatus[i].status = 0; - } - else - { - hpStatus[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); - hpStatus[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); - } - } - - gBattleMainFunc = BattleIntroPrintWildMonAttacked; - } - -} - -static void BattleIntroPrintTrainerWantsToBattle(void) -{ - if (gBattleControllerExecFlags == 0) - { - gActiveBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); - PrepareStringBattle(STRINGID_INTROMSG, gActiveBattler); - gBattleMainFunc = BattleIntroPrintOpponentSendsOut; - } -} - -static void BattleIntroPrintWildMonAttacked(void) -{ - if (gBattleControllerExecFlags == 0) - { - gBattleMainFunc = BattleIntroPrintPlayerSendsOut; - PrepareStringBattle(STRINGID_INTROMSG, 0); - } -} - -static void BattleIntroPrintOpponentSendsOut(void) -{ - u8 position; - - if (gBattleControllerExecFlags) - return; - - if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) - position = B_POSITION_OPPONENT_LEFT; - else if (gBattleTypeFlags & BATTLE_TYPE_x2000000) - { - if (gBattleTypeFlags & BATTLE_TYPE_x80000000) - position = B_POSITION_OPPONENT_LEFT; - else - position = B_POSITION_PLAYER_LEFT; - } - else - position = B_POSITION_OPPONENT_LEFT; - - PrepareStringBattle(STRINGID_INTROSENDOUT, GetBattlerAtPosition(position)); - gBattleMainFunc = BattleIntroOpponent1SendsOutMonAnimation; -} - -static void BattleIntroOpponent2SendsOutMonAnimation(void) -{ - u8 position; - - if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) - position = B_POSITION_OPPONENT_RIGHT; - else if (gBattleTypeFlags & BATTLE_TYPE_x2000000) - { - if (gBattleTypeFlags & BATTLE_TYPE_x80000000) - position = B_POSITION_OPPONENT_RIGHT; - else - position = B_POSITION_PLAYER_RIGHT; - } - else - position = B_POSITION_OPPONENT_RIGHT; - - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) - { - if (GetBattlerPosition(gActiveBattler) == position) - { - BtlController_EmitIntroTrainerBallThrow(0); - MarkBattlerForControllerExec(gActiveBattler); - } - } - - gBattleMainFunc = BattleIntroRecordMonsToDex; -} - -static void BattleIntroOpponent1SendsOutMonAnimation(void) -{ - u8 position; - - if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) - { - if (gBattleTypeFlags & BATTLE_TYPE_x2000000) - { - if (gBattleTypeFlags & BATTLE_TYPE_x80000000) - position = B_POSITION_OPPONENT_LEFT; - else - position = B_POSITION_PLAYER_LEFT; - } - else - position = B_POSITION_OPPONENT_LEFT; - } - else - { - position = B_POSITION_OPPONENT_LEFT; - } - - if (gBattleControllerExecFlags) - return; - - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) - { - if (GetBattlerPosition(gActiveBattler) == position) - { - BtlController_EmitIntroTrainerBallThrow(0); - MarkBattlerForControllerExec(gActiveBattler); - if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS)) - { - gBattleMainFunc = BattleIntroOpponent2SendsOutMonAnimation; - return; - } - } - } - - gBattleMainFunc = BattleIntroRecordMonsToDex; -} - -static void BattleIntroRecordMonsToDex(void) -{ - if (gBattleControllerExecFlags == 0) - { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) - { - if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT - && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER - | BATTLE_TYPE_FRONTIER - | BATTLE_TYPE_LINK - | BATTLE_TYPE_x2000000 - | BATTLE_TYPE_TRAINER_HILL))) - { - HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality); - } - } - gBattleMainFunc = BattleIntroPrintPlayerSendsOut; - } -} - -static void sub_803B3AC(void) // unused -{ - if (gBattleControllerExecFlags == 0) - gBattleMainFunc = BattleIntroPrintPlayerSendsOut; -} - -static void BattleIntroPrintPlayerSendsOut(void) -{ - if (gBattleControllerExecFlags == 0) - { - u8 position; - - if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) - position = B_POSITION_PLAYER_LEFT; - else if (gBattleTypeFlags & BATTLE_TYPE_x2000000) - { - if (gBattleTypeFlags & BATTLE_TYPE_x80000000) - position = B_POSITION_PLAYER_LEFT; - else - position = B_POSITION_OPPONENT_LEFT; - } - else - position = B_POSITION_PLAYER_LEFT; - - if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) - PrepareStringBattle(STRINGID_INTROSENDOUT, GetBattlerAtPosition(position)); - - gBattleMainFunc = BattleIntroPlayer1SendsOutMonAnimation; - } -} - -static void BattleIntroPlayer2SendsOutMonAnimation(void) -{ - u8 position; - - if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) - position = B_POSITION_PLAYER_RIGHT; - else if (gBattleTypeFlags & BATTLE_TYPE_x2000000) - { - if (gBattleTypeFlags & BATTLE_TYPE_x80000000) - position = B_POSITION_PLAYER_RIGHT; - else - position = B_POSITION_OPPONENT_RIGHT; - } - else - position = B_POSITION_PLAYER_RIGHT; - - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) - { - if (GetBattlerPosition(gActiveBattler) == position) - { - BtlController_EmitIntroTrainerBallThrow(0); - MarkBattlerForControllerExec(gActiveBattler); - } - } - - gBattleStruct->switchInAbilitiesCounter = 0; - gBattleStruct->switchInItemsCounter = 0; - gBattleStruct->overworldWeatherDone = FALSE; - - gBattleMainFunc = TryDoEventsBeforeFirstTurn; -} - -static void BattleIntroPlayer1SendsOutMonAnimation(void) -{ - u8 position; - - if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) - position = B_POSITION_PLAYER_LEFT; - else if (gBattleTypeFlags & BATTLE_TYPE_x2000000) - { - if (gBattleTypeFlags & BATTLE_TYPE_x80000000) - position = B_POSITION_PLAYER_LEFT; - else - position = B_POSITION_OPPONENT_LEFT; - } - else - position = B_POSITION_PLAYER_LEFT; - - if (gBattleControllerExecFlags) - return; - - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) - { - if (GetBattlerPosition(gActiveBattler) == position) - { - BtlController_EmitIntroTrainerBallThrow(0); - MarkBattlerForControllerExec(gActiveBattler); - if (gBattleTypeFlags & (BATTLE_TYPE_MULTI)) - { - gBattleMainFunc = BattleIntroPlayer2SendsOutMonAnimation; - return; - } - } - } - - gBattleStruct->switchInAbilitiesCounter = 0; - gBattleStruct->switchInItemsCounter = 0; - gBattleStruct->overworldWeatherDone = FALSE; - - gBattleMainFunc = TryDoEventsBeforeFirstTurn; -} - -static void sub_803B598(void) // unused -{ - if (gBattleControllerExecFlags == 0) - { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) - { - if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) - { - BtlController_EmitSwitchInAnim(0, gBattlerPartyIndexes[gActiveBattler], FALSE); - MarkBattlerForControllerExec(gActiveBattler); - } - } - - gBattleStruct->switchInAbilitiesCounter = 0; - gBattleStruct->switchInItemsCounter = 0; - gBattleStruct->overworldWeatherDone = FALSE; - - gBattleMainFunc = TryDoEventsBeforeFirstTurn; + break; } } static void TryDoEventsBeforeFirstTurn(void) { s32 i, j; - u8 effect = 0; if (gBattleControllerExecFlags) return; @@ -3793,27 +3482,18 @@ static void TryDoEventsBeforeFirstTurn(void) // Check all switch in abilities happening from the fastest mon to slowest. while (gBattleStruct->switchInAbilitiesCounter < gBattlersCount) { - if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gBattlerByTurnOrder[gBattleStruct->switchInAbilitiesCounter], 0, 0, 0) != 0) - effect++; - - gBattleStruct->switchInAbilitiesCounter++; - - if (effect) + gBattlerAttacker = gBattlerByTurnOrder[gBattleStruct->switchInAbilitiesCounter++]; + if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gBattlerAttacker, 0, 0, 0) != 0) return; } if (AbilityBattleEffects(ABILITYEFFECT_INTIMIDATE1, 0, 0, 0, 0) != 0) return; - if (AbilityBattleEffects(ABILITYEFFECT_TRACE, 0, 0, 0, 0) != 0) + if (AbilityBattleEffects(ABILITYEFFECT_TRACE1, 0, 0, 0, 0) != 0) return; // Check all switch in items having effect from the fastest mon to slowest. while (gBattleStruct->switchInItemsCounter < gBattlersCount) { - if (ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, gBattlerByTurnOrder[gBattleStruct->switchInItemsCounter], FALSE)) - effect++; - - gBattleStruct->switchInItemsCounter++; - - if (effect) + if (ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, gBattlerByTurnOrder[gBattleStruct->switchInItemsCounter++], FALSE)) return; } for (i = 0; i < MAX_BATTLERS_COUNT; i++) @@ -3940,13 +3620,13 @@ void BattleTurnPassed(void) BattleScriptExecute(BattleScript_PalacePrintFlavorText); else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->arenaTurnCounter == 0) BattleScriptExecute(BattleScript_ArenaTurnBeginning); + else if (ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), gTrainerBattleOpponent_A, TRAINER_SLIDE_LAST_LOW_HP)) + BattleScriptExecute(BattleScript_TrainerSlideMsgEnd2); } u8 IsRunningFromBattleImpossible(void) { - u8 holdEffect; - u8 side; - s32 i; + u32 holdEffect, i; if (gBattleMons[gActiveBattler].item == ITEM_ENIGMA_BERRY) holdEffect = gEnigmaBerries[gActiveBattler].holdEffect; @@ -3955,51 +3635,38 @@ u8 IsRunningFromBattleImpossible(void) gPotentialItemEffectBattler = gActiveBattler; - if ((holdEffect == HOLD_EFFECT_CAN_ALWAYS_RUN) || (gBattleTypeFlags & BATTLE_TYPE_LINK) || (gBattleMons[gActiveBattler].ability == ABILITY_RUN_AWAY)) + if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) // Cannot ever run from saving Birch's battle. + { + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + return 1; + } + if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT && WILD_DOUBLE_BATTLE + && IsBattlerAlive(GetBattlerAtPosition(B_POSITION_PLAYER_LEFT))) // The second pokemon cannot run from a double wild battle, unless it's the only alive mon. + { + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + return 1; + } + + if (holdEffect == HOLD_EFFECT_CAN_ALWAYS_RUN) + return 0; + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + return 0; + if (gBattleMons[gActiveBattler].ability == ABILITY_RUN_AWAY) return 0; - side = GetBattlerSide(gActiveBattler); - - for (i = 0; i < gBattlersCount; i++) - { - if (side != GetBattlerSide(i) - && gBattleMons[i].ability == ABILITY_SHADOW_TAG) - { - gBattleScripting.battler = i; - gLastUsedAbility = gBattleMons[i].ability; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - return 2; - } - if (side != GetBattlerSide(i) - && gBattleMons[gActiveBattler].ability != ABILITY_LEVITATE - && !IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_FLYING) - && gBattleMons[i].ability == ABILITY_ARENA_TRAP) - { - gBattleScripting.battler = i; - gLastUsedAbility = gBattleMons[i].ability; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; - return 2; - } - } - i = AbilityBattleEffects(ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER, gActiveBattler, ABILITY_MAGNET_PULL, 0, 0); - if (i != 0 && IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_STEEL)) + if ((i = IsAbilityPreventingEscape(gActiveBattler))) { gBattleScripting.battler = i - 1; gLastUsedAbility = gBattleMons[i - 1].ability; gBattleCommunication[MULTISTRING_CHOOSER] = 2; return 2; } - if ((gBattleMons[gActiveBattler].status2 & (STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED)) - || (gStatuses3[gActiveBattler] & STATUS3_ROOTED)) + + if (!CanBattlerEscape(gActiveBattler)) { gBattleCommunication[MULTISTRING_CHOOSER] = 0; return 1; } - if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) - { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - return 1; - } return 0; } @@ -4085,9 +3752,17 @@ static void HandleTurnActionSelectionState(void) gChosenActionByBattler[gActiveBattler] = B_ACTION_USE_MOVE; gBattleCommunication[gActiveBattler] = STATE_WAIT_ACTION_CONFIRMED_STANDBY; } + else if (WILD_DOUBLE_BATTLE + && position == B_POSITION_PLAYER_RIGHT + && (gBattleStruct->throwingPokeBall || gChosenActionByBattler[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)] == B_ACTION_RUN)) + { + gBattleStruct->throwingPokeBall = FALSE; + gChosenActionByBattler[gActiveBattler] = B_ACTION_NOTHING_FAINTED; // Not fainted, but it cannot move, because of the throwing ball. + gBattleCommunication[gActiveBattler] = STATE_WAIT_ACTION_CONFIRMED_STANDBY; + } else { - BtlController_EmitChooseAction(0, gChosenActionByBattler[0], gBattleBufferB[0][1] | (gBattleBufferB[0][2] << 8)); + BtlController_EmitChooseAction(0, gChosenActionByBattler[0], gBattleResources->bufferB[0][1] | (gBattleResources->bufferB[0][2] << 8)); MarkBattlerForControllerExec(gActiveBattler); gBattleCommunication[gActiveBattler]++; } @@ -4097,10 +3772,10 @@ static void HandleTurnActionSelectionState(void) case STATE_WAIT_ACTION_CHOSEN: // Try to perform an action. if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC)))) { - RecordedBattle_SetBattlerAction(gActiveBattler, gBattleBufferB[gActiveBattler][1]); - gChosenActionByBattler[gActiveBattler] = gBattleBufferB[gActiveBattler][1]; + RecordedBattle_SetBattlerAction(gActiveBattler, gBattleResources->bufferB[gActiveBattler][1]); + gChosenActionByBattler[gActiveBattler] = gBattleResources->bufferB[gActiveBattler][1]; - switch (gBattleBufferB[gActiveBattler][1]) + switch (gBattleResources->bufferB[gActiveBattler][1]) { case B_ACTION_USE_MOVE: if (AreAllMovesUnusable()) @@ -4108,7 +3783,7 @@ static void HandleTurnActionSelectionState(void) gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT; *(gBattleStruct->selectionScriptFinished + gActiveBattler) = FALSE; *(gBattleStruct->stateIdAfterSelScript + gActiveBattler) = STATE_WAIT_ACTION_CONFIRMED_STANDBY; - *(gBattleStruct->moveTarget + gActiveBattler) = gBattleBufferB[gActiveBattler][3]; + *(gBattleStruct->moveTarget + gActiveBattler) = gBattleResources->bufferB[gActiveBattler][3]; return; } else if (gDisableStructs[gActiveBattler].encoredMove != 0) @@ -4122,9 +3797,11 @@ static void HandleTurnActionSelectionState(void) { struct ChooseMoveStruct moveInfo; + moveInfo.mega = gBattleStruct->mega; moveInfo.species = gBattleMons[gActiveBattler].species; moveInfo.monType1 = gBattleMons[gActiveBattler].type1; moveInfo.monType2 = gBattleMons[gActiveBattler].type2; + moveInfo.monType3 = gBattleMons[gActiveBattler].type3; for (i = 0; i < MAX_MON_MOVES; i++) { @@ -4161,20 +3838,14 @@ static void HandleTurnActionSelectionState(void) break; case B_ACTION_SWITCH: *(gBattleStruct->field_58 + gActiveBattler) = gBattlerPartyIndexes[gActiveBattler]; - if (gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION) - || gBattleTypeFlags & BATTLE_TYPE_ARENA - || gStatuses3[gActiveBattler] & STATUS3_ROOTED) + if (gBattleTypeFlags & BATTLE_TYPE_ARENA + || !CanBattlerEscape(gActiveBattler)) { BtlController_EmitChoosePokemon(0, PARTY_ACTION_CANT_SWITCH, PARTY_SIZE, ABILITY_NONE, gBattleStruct->field_60[gActiveBattler]); } - else if ((i = ABILITY_ON_OPPOSING_FIELD(gActiveBattler, ABILITY_SHADOW_TAG)) - || ((i = ABILITY_ON_OPPOSING_FIELD(gActiveBattler, ABILITY_ARENA_TRAP)) - && !IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_FLYING) - && gBattleMons[gActiveBattler].ability != ABILITY_LEVITATE) - || ((i = AbilityBattleEffects(ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER, gActiveBattler, ABILITY_MAGNET_PULL, 0, 0)) - && IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_STEEL))) + else if ((i = IsAbilityPreventingEscape(gActiveBattler))) { - BtlController_EmitChoosePokemon(0, ((i - 1) << 4) | PARTY_ACTION_ABILITY_PREVENTS, PARTY_SIZE, gLastUsedAbility, gBattleStruct->field_60[gActiveBattler]); + BtlController_EmitChoosePokemon(0, ((i - 1) << 4) | PARTY_ACTION_ABILITY_PREVENTS, PARTY_SIZE, gBattleMons[i - 1].ability, gBattleStruct->field_60[gActiveBattler]); } else { @@ -4236,14 +3907,20 @@ static void HandleTurnActionSelectionState(void) { RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))), 3); } + + gBattleStruct->mega.toEvolve &= ~(gBitTable[BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))]); BtlController_EmitEndBounceEffect(0); MarkBattlerForControllerExec(gActiveBattler); return; + case B_ACTION_DEBUG: + BtlController_EmitDebugMenu(0); + MarkBattlerForControllerExec(gActiveBattler); + break; } if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_TRAINER_HILL) - && gBattleBufferB[gActiveBattler][1] == B_ACTION_RUN) + && gBattleResources->bufferB[gActiveBattler][1] == B_ACTION_RUN) { gSelectionBattleScripts[gActiveBattler] = BattleScript_AskIfWantsToForfeitMatch; gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT_MAY_RUN; @@ -4253,13 +3930,13 @@ static void HandleTurnActionSelectionState(void) } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) - && gBattleBufferB[gActiveBattler][1] == B_ACTION_RUN) + && gBattleResources->bufferB[gActiveBattler][1] == B_ACTION_RUN) { BattleScriptExecute(BattleScript_PrintCantRunFromTrainer); gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN; } else if (IsRunningFromBattleImpossible() - && gBattleBufferB[gActiveBattler][1] == B_ACTION_RUN) + && gBattleResources->bufferB[gActiveBattler][1] == B_ACTION_RUN) { gSelectionBattleScripts[gActiveBattler] = BattleScript_PrintCantEscapeFromBattle; gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT; @@ -4279,7 +3956,7 @@ static void HandleTurnActionSelectionState(void) switch (gChosenActionByBattler[gActiveBattler]) { case B_ACTION_USE_MOVE: - switch (gBattleBufferB[gActiveBattler][1]) + switch (gBattleResources->bufferB[gActiveBattler][1]) { case 3: case 4: @@ -4288,7 +3965,7 @@ static void HandleTurnActionSelectionState(void) case 7: case 8: case 9: - gChosenActionByBattler[gActiveBattler] = gBattleBufferB[gActiveBattler][1]; + gChosenActionByBattler[gActiveBattler] = gBattleResources->bufferB[gActiveBattler][1]; return; case 15: gChosenActionByBattler[gActiveBattler] = B_ACTION_SWITCH; @@ -4296,7 +3973,7 @@ static void HandleTurnActionSelectionState(void) return; default: sub_818603C(2); - if ((gBattleBufferB[gActiveBattler][2] | (gBattleBufferB[gActiveBattler][3] << 8)) == 0xFFFF) + if ((gBattleResources->bufferB[gActiveBattler][2] | (gBattleResources->bufferB[gActiveBattler][3] << 8)) == 0xFFFF) { gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN; RecordedBattle_ClearBattlerAction(gActiveBattler, 1); @@ -4306,7 +3983,7 @@ static void HandleTurnActionSelectionState(void) RecordedBattle_ClearBattlerAction(gActiveBattler, 1); gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT; *(gBattleStruct->selectionScriptFinished + gActiveBattler) = FALSE; - gBattleBufferB[gActiveBattler][1] = B_ACTION_USE_MOVE; + gBattleResources->bufferB[gActiveBattler][1] = B_ACTION_USE_MOVE; *(gBattleStruct->stateIdAfterSelScript + gActiveBattler) = STATE_WAIT_ACTION_CHOSEN; return; } @@ -4314,30 +3991,34 @@ static void HandleTurnActionSelectionState(void) { if (!(gBattleTypeFlags & BATTLE_TYPE_PALACE)) { - RecordedBattle_SetBattlerAction(gActiveBattler, gBattleBufferB[gActiveBattler][2]); - RecordedBattle_SetBattlerAction(gActiveBattler, gBattleBufferB[gActiveBattler][3]); + RecordedBattle_SetBattlerAction(gActiveBattler, gBattleResources->bufferB[gActiveBattler][2]); + RecordedBattle_SetBattlerAction(gActiveBattler, gBattleResources->bufferB[gActiveBattler][3]); } - *(gBattleStruct->chosenMovePositions + gActiveBattler) = gBattleBufferB[gActiveBattler][2]; + *(gBattleStruct->chosenMovePositions + gActiveBattler) = gBattleResources->bufferB[gActiveBattler][2] & ~(RET_MEGA_EVOLUTION); gChosenMoveByBattler[gActiveBattler] = gBattleMons[gActiveBattler].moves[*(gBattleStruct->chosenMovePositions + gActiveBattler)]; - *(gBattleStruct->moveTarget + gActiveBattler) = gBattleBufferB[gActiveBattler][3]; + *(gBattleStruct->moveTarget + gActiveBattler) = gBattleResources->bufferB[gActiveBattler][3]; + if (gBattleResources->bufferB[gActiveBattler][2] & RET_MEGA_EVOLUTION) + gBattleStruct->mega.toEvolve |= gBitTable[gActiveBattler]; gBattleCommunication[gActiveBattler]++; } break; } break; case B_ACTION_USE_ITEM: - if ((gBattleBufferB[gActiveBattler][1] | (gBattleBufferB[gActiveBattler][2] << 8)) == 0) + if ((gBattleResources->bufferB[gActiveBattler][1] | (gBattleResources->bufferB[gActiveBattler][2] << 8)) == 0) { gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN; } else { - gLastUsedItem = (gBattleBufferB[gActiveBattler][1] | (gBattleBufferB[gActiveBattler][2] << 8)); + gLastUsedItem = (gBattleResources->bufferB[gActiveBattler][1] | (gBattleResources->bufferB[gActiveBattler][2] << 8)); + if (ItemId_GetPocket(gLastUsedItem) == POCKET_POKE_BALLS) + gBattleStruct->throwingPokeBall = TRUE; gBattleCommunication[gActiveBattler]++; } break; case B_ACTION_SWITCH: - if (gBattleBufferB[gActiveBattler][1] == PARTY_SIZE) + if (gBattleResources->bufferB[gActiveBattler][1] == PARTY_SIZE) { gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN; RecordedBattle_ClearBattlerAction(gActiveBattler, 1); @@ -4359,7 +4040,7 @@ static void HandleTurnActionSelectionState(void) gBattleCommunication[gActiveBattler]++; break; case B_ACTION_SAFARI_POKEBLOCK: - if ((gBattleBufferB[gActiveBattler][1] | (gBattleBufferB[gActiveBattler][2] << 8)) != 0) + if ((gBattleResources->bufferB[gActiveBattler][1] | (gBattleResources->bufferB[gActiveBattler][2] << 8)) != 0) { gBattleCommunication[gActiveBattler]++; } @@ -4378,6 +4059,9 @@ static void HandleTurnActionSelectionState(void) case B_ACTION_WALLY_THROW: gBattleCommunication[gActiveBattler]++; break; + case B_ACTION_DEBUG: + gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN; + break; } } break; @@ -4434,7 +4118,7 @@ static void HandleTurnActionSelectionState(void) case STATE_SELECTION_SCRIPT_MAY_RUN: if (*(gBattleStruct->selectionScriptFinished + gActiveBattler)) { - if (gBattleBufferB[gActiveBattler][1] == B_ACTION_NOTHING_FAINTED) + if (gBattleResources->bufferB[gActiveBattler][1] == B_ACTION_NOTHING_FAINTED) { gHitMarker |= HITMARKER_RUN; gChosenActionByBattler[gActiveBattler] = B_ACTION_RUN; @@ -4495,18 +4179,18 @@ static bool8 AllAtActionConfirmed(void) static void sub_803CDF8(void) { - *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = gBattleBufferB[gActiveBattler][1]; - RecordedBattle_SetBattlerAction(gActiveBattler, gBattleBufferB[gActiveBattler][1]); + *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = gBattleResources->bufferB[gActiveBattler][1]; + RecordedBattle_SetBattlerAction(gActiveBattler, gBattleResources->bufferB[gActiveBattler][1]); if (gBattleTypeFlags & BATTLE_TYPE_LINK && gBattleTypeFlags & BATTLE_TYPE_MULTI) { *(gActiveBattler * 3 + (u8*)(gBattleStruct->field_60) + 0) &= 0xF; - *(gActiveBattler * 3 + (u8*)(gBattleStruct->field_60) + 0) |= (gBattleBufferB[gActiveBattler][2] & 0xF0); - *(gActiveBattler * 3 + (u8*)(gBattleStruct->field_60) + 1) = gBattleBufferB[gActiveBattler][3]; + *(gActiveBattler * 3 + (u8*)(gBattleStruct->field_60) + 0) |= (gBattleResources->bufferB[gActiveBattler][2] & 0xF0); + *(gActiveBattler * 3 + (u8*)(gBattleStruct->field_60) + 1) = gBattleResources->bufferB[gActiveBattler][3]; *((gActiveBattler ^ BIT_FLANK) * 3 + (u8*)(gBattleStruct->field_60) + 0) &= (0xF0); - *((gActiveBattler ^ BIT_FLANK) * 3 + (u8*)(gBattleStruct->field_60) + 0) |= (gBattleBufferB[gActiveBattler][2] & 0xF0) >> 4; - *((gActiveBattler ^ BIT_FLANK) * 3 + (u8*)(gBattleStruct->field_60) + 2) = gBattleBufferB[gActiveBattler][3]; + *((gActiveBattler ^ BIT_FLANK) * 3 + (u8*)(gBattleStruct->field_60) + 0) |= (gBattleResources->bufferB[gActiveBattler][2] & 0xF0) >> 4; + *((gActiveBattler ^ BIT_FLANK) * 3 + (u8*)(gBattleStruct->field_60) + 2) = gBattleResources->bufferB[gActiveBattler][3]; } } @@ -4518,156 +4202,197 @@ void SwapTurnOrder(u8 id1, u8 id2) SWAP(gBattlerByTurnOrder[id1], gBattlerByTurnOrder[id2], temp); } +u32 GetBattlerTotalSpeedStat(u8 battlerId) +{ + u32 speed = gBattleMons[battlerId].speed; + u32 ability = GetBattlerAbility(battlerId); + u32 holdEffect = GetBattlerHoldEffect(battlerId, TRUE); + + // weather abilities + if (WEATHER_HAS_EFFECT) + { + if (ability == ABILITY_SWIFT_SWIM && gBattleWeather & WEATHER_RAIN_ANY) + speed *= 2; + else if (ability == ABILITY_CHLOROPHYLL && gBattleWeather & WEATHER_SUN_ANY) + speed *= 2; + else if (ability == ABILITY_SAND_RUSH && gBattleWeather & WEATHER_SANDSTORM_ANY) + speed *= 2; + else if (ability == ABILITY_SLUSH_RUSH && gBattleWeather & WEATHER_HAIL_ANY) + speed *= 2; + } + + // other abilities + if (ability == ABILITY_QUICK_FEET && gBattleMons[battlerId].status1 & STATUS1_ANY) + speed = (speed * 150) / 100; + else if (ability == ABILITY_SURGE_SURFER && gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) + speed *= 2; + else if (ability == ABILITY_SLOW_START && gDisableStructs[battlerId].slowStartTimer != 0) + speed /= 2; + + // stat stages + speed *= gStatStageRatios[gBattleMons[battlerId].statStages[STAT_SPEED]][0]; + speed /= gStatStageRatios[gBattleMons[battlerId].statStages[STAT_SPEED]][1]; + + // player's badge boost + if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_FRONTIER)) + && FlagGet(FLAG_BADGE03_GET) + && GetBattlerSide(battlerId) == B_SIDE_PLAYER) + { + speed = (speed * 110) / 100; + } + + // item effects + if (GetBattlerHoldEffect(battlerId, FALSE) == HOLD_EFFECT_MACHO_BRACE || GetBattlerHoldEffect(battlerId, FALSE) == HOLD_EFFECT_EV_BOOST) + speed /= 2; + else if (holdEffect == HOLD_EFFECT_IRON_BALL) + speed /= 2; + else if (holdEffect == HOLD_EFFECT_CHOICE_SCARF) + speed = (speed * 150) / 100; + else if (holdEffect == HOLD_EFFECT_QUICK_POWDER && gBattleMons[battlerId].species == SPECIES_DITTO && !(gBattleMons[battlerId].status2 & STATUS2_TRANSFORMED)) + speed *= 2; + + // various effects + if (gSideStatuses[GET_BATTLER_SIDE(battlerId)] & SIDE_STATUS_TAILWIND) + speed *= 2; + if (gBattleResources->flags->flags[battlerId] & RESOURCE_FLAG_UNBURDEN) + speed *= 2; + + // paralysis drop + if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS && ability != ABILITY_QUICK_FEET) + speed /= (B_PARALYSIS_SPEED >= GEN_7 ? 2 : 4); + + return speed; +} + +s8 GetChosenMovePriority(u32 battlerId) +{ + u16 move; + + if (gProtectStructs[battlerId].noValidMoves) + move = MOVE_STRUGGLE; + else + move = gBattleMons[battlerId].moves[*(gBattleStruct->chosenMovePositions + battlerId)]; + + return GetMovePriority(battlerId, move); +} + +s8 GetMovePriority(u32 battlerId, u16 move) +{ + s8 priority; + + priority = gBattleMoves[move].priority; + if (GetBattlerAbility(battlerId) == ABILITY_GALE_WINGS + && gBattleMoves[move].type == TYPE_FLYING + && (B_GALE_WINGS <= GEN_6 || BATTLER_MAX_HP(battlerId))) + { + priority++; + } + else if (GetBattlerAbility(battlerId) == ABILITY_PRANKSTER + && gBattleMoves[move].split == SPLIT_STATUS) + { + priority++; + } + else if (GetBattlerAbility(battlerId) == ABILITY_TRIAGE) + { + switch (gBattleMoves[move].effect) + { + case EFFECT_RESTORE_HP: + case EFFECT_REST: + case EFFECT_MORNING_SUN: + case EFFECT_MOONLIGHT: + case EFFECT_SYNTHESIS: + case EFFECT_HEAL_PULSE: + case EFFECT_HEALING_WISH: + case EFFECT_SWALLOW: + case EFFECT_WISH: + case EFFECT_SOFTBOILED: + case EFFECT_ABSORB: + case EFFECT_ROOST: + priority += 3; + break; + } + } + + return priority; +} + u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) { u8 strikesFirst = 0; - u8 speedMultiplierBattler1 = 0, speedMultiplierBattler2 = 0; u32 speedBattler1 = 0, speedBattler2 = 0; - u8 holdEffect = 0; - u8 holdEffectParam = 0; - u16 moveBattler1 = 0, moveBattler2 = 0; + u32 holdEffectBattler1 = 0, holdEffectBattler2 = 0; + bool32 quickClawBattler1 = FALSE, quickClawBattler2 = FALSE; + s8 priority1 = 0, priority2 = 0; - if (WEATHER_HAS_EFFECT) - { - if ((gBattleMons[battler1].ability == ABILITY_SWIFT_SWIM && gBattleWeather & WEATHER_RAIN_ANY) - || (gBattleMons[battler1].ability == ABILITY_CHLOROPHYLL && gBattleWeather & WEATHER_SUN_ANY)) - speedMultiplierBattler1 = 2; - else - speedMultiplierBattler1 = 1; + speedBattler1 = GetBattlerTotalSpeedStat(battler1); + holdEffectBattler1 = GetBattlerHoldEffect(battler1, TRUE); + if (holdEffectBattler1 == HOLD_EFFECT_QUICK_CLAW + && gRandomTurnNumber < (0xFFFF * GetBattlerHoldEffectParam(battler1)) / 100) + quickClawBattler1 = TRUE; - if ((gBattleMons[battler2].ability == ABILITY_SWIFT_SWIM && gBattleWeather & WEATHER_RAIN_ANY) - || (gBattleMons[battler2].ability == ABILITY_CHLOROPHYLL && gBattleWeather & WEATHER_SUN_ANY)) - speedMultiplierBattler2 = 2; - else - speedMultiplierBattler2 = 1; - } - else - { - speedMultiplierBattler1 = 1; - speedMultiplierBattler2 = 1; - } + speedBattler2 = GetBattlerTotalSpeedStat(battler2); + holdEffectBattler2 = GetBattlerHoldEffect(battler2, TRUE); + if (holdEffectBattler2 == HOLD_EFFECT_QUICK_CLAW + && gRandomTurnNumber < (0xFFFF * GetBattlerHoldEffectParam(battler2)) / 100) + quickClawBattler2 = TRUE; - speedBattler1 = (gBattleMons[battler1].speed * speedMultiplierBattler1) - * (gStatStageRatios[gBattleMons[battler1].statStages[STAT_SPEED]][0]) - / (gStatStageRatios[gBattleMons[battler1].statStages[STAT_SPEED]][1]); - - if (gBattleMons[battler1].item == ITEM_ENIGMA_BERRY) - { - holdEffect = gEnigmaBerries[battler1].holdEffect; - holdEffectParam = gEnigmaBerries[battler1].holdEffectParam; - } - else - { - holdEffect = ItemId_GetHoldEffect(gBattleMons[battler1].item); - holdEffectParam = ItemId_GetHoldEffectParam(gBattleMons[battler1].item); - } - - // badge boost - if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_FRONTIER)) - && FlagGet(FLAG_BADGE03_GET) - && GetBattlerSide(battler1) == B_SIDE_PLAYER) - { - speedBattler1 = (speedBattler1 * 110) / 100; - } - - if (holdEffect == HOLD_EFFECT_MACHO_BRACE) - speedBattler1 /= 2; - - if (gBattleMons[battler1].status1 & STATUS1_PARALYSIS) - speedBattler1 /= 4; - - if (holdEffect == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (0xFFFF * holdEffectParam) / 100) - speedBattler1 = UINT_MAX; - - // check second battlerId's speed - - speedBattler2 = (gBattleMons[battler2].speed * speedMultiplierBattler2) - * (gStatStageRatios[gBattleMons[battler2].statStages[STAT_SPEED]][0]) - / (gStatStageRatios[gBattleMons[battler2].statStages[STAT_SPEED]][1]); - - if (gBattleMons[battler2].item == ITEM_ENIGMA_BERRY) - { - holdEffect = gEnigmaBerries[battler2].holdEffect; - holdEffectParam = gEnigmaBerries[battler2].holdEffectParam; - } - else - { - holdEffect = ItemId_GetHoldEffect(gBattleMons[battler2].item); - holdEffectParam = ItemId_GetHoldEffectParam(gBattleMons[battler2].item); - } - - // badge boost - if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_FRONTIER)) - && FlagGet(FLAG_BADGE03_GET) - && GetBattlerSide(battler2) == B_SIDE_PLAYER) - { - speedBattler2 = (speedBattler2 * 110) / 100; - } - - if (holdEffect == HOLD_EFFECT_MACHO_BRACE) - speedBattler2 /= 2; - - if (gBattleMons[battler2].status1 & STATUS1_PARALYSIS) - speedBattler2 /= 4; - - if (holdEffect == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (0xFFFF * holdEffectParam) / 100) - speedBattler2 = UINT_MAX; - - if (ignoreChosenMoves) - { - moveBattler1 = MOVE_NONE; - moveBattler2 = MOVE_NONE; - } - else + if (!ignoreChosenMoves) { if (gChosenActionByBattler[battler1] == B_ACTION_USE_MOVE) - { - if (gProtectStructs[battler1].noValidMoves) - moveBattler1 = MOVE_STRUGGLE; - else - moveBattler1 = gBattleMons[battler1].moves[*(gBattleStruct->chosenMovePositions + battler1)]; - } - else - moveBattler1 = MOVE_NONE; - + priority1 = GetChosenMovePriority(battler1); if (gChosenActionByBattler[battler2] == B_ACTION_USE_MOVE) - { - if (gProtectStructs[battler2].noValidMoves) - moveBattler2 = MOVE_STRUGGLE; - else - moveBattler2 = gBattleMons[battler2].moves[*(gBattleStruct->chosenMovePositions + battler2)]; - } - else - moveBattler2 = MOVE_NONE; + priority2 = GetChosenMovePriority(battler2); } - // both move priorities are different than 0 - if (gBattleMoves[moveBattler1].priority != 0 || gBattleMoves[moveBattler2].priority != 0) + if (priority1 == priority2) { - // both priorities are the same - if (gBattleMoves[moveBattler1].priority == gBattleMoves[moveBattler2].priority) + // QUICK CLAW - always first + // LAGGING TAIL - always last + // STALL - always last + + if (quickClawBattler1 && !quickClawBattler2) + strikesFirst = 0; + else if (quickClawBattler2 && !quickClawBattler1) + strikesFirst = 1; + else if (holdEffectBattler1 == HOLD_EFFECT_LAGGING_TAIL && holdEffectBattler2 != HOLD_EFFECT_LAGGING_TAIL) + strikesFirst = 1; + else if (holdEffectBattler2 == HOLD_EFFECT_LAGGING_TAIL && holdEffectBattler1 != HOLD_EFFECT_LAGGING_TAIL) + strikesFirst = 0; + else if (GetBattlerAbility(battler1) == ABILITY_STALL && GetBattlerAbility(battler2) != ABILITY_STALL) + strikesFirst = 1; + else if (GetBattlerAbility(battler2) == ABILITY_STALL && GetBattlerAbility(battler1) != ABILITY_STALL) + strikesFirst = 0; + else { if (speedBattler1 == speedBattler2 && Random() & 1) + { strikesFirst = 2; // same speeds, same priorities + } else if (speedBattler1 < speedBattler2) - strikesFirst = 1; // battler2 has more speed - - // else battler1 has more speed + { + // battler2 has more speed + if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM) + strikesFirst = 0; + else + strikesFirst = 1; + } + else + { + // battler1 has more speed + if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM) + strikesFirst = 1; + else + strikesFirst = 0; + } } - else if (gBattleMoves[moveBattler1].priority < gBattleMoves[moveBattler2].priority) - strikesFirst = 1; // battler2's move has greater priority - - // else battler1's move has greater priority } - // both priorities are equal to 0 + else if (priority1 < priority2) + { + strikesFirst = 1; // battler2's move has greater priority + } else { - if (speedBattler1 == speedBattler2 && Random() & 1) - strikesFirst = 2; // same speeds, same priorities - else if (speedBattler1 < speedBattler2) - strikesFirst = 1; // battler2 has more speed - - // else battler1 has more speed + strikesFirst = 0; // battler1's move has greater priority } return strikesFirst; @@ -4728,8 +4453,8 @@ static void SetActionsAndBattlersTurnOrder(void) turnOrderId++; } } - gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts; - gBattleStruct->focusPunchBattlerId = 0; + gBattleMainFunc = CheckMegaEvolutionBeforeTurn; + gBattleStruct->mega.battlerId = 0; return; } for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) @@ -4768,27 +4493,26 @@ static void SetActionsAndBattlersTurnOrder(void) } } } - gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts; - gBattleStruct->focusPunchBattlerId = 0; + gBattleMainFunc = CheckMegaEvolutionBeforeTurn; + gBattleStruct->mega.battlerId = 0; } static void TurnValuesCleanUp(bool8 var0) { s32 i; - u8 *dataPtr; for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { if (var0) { gProtectStructs[gActiveBattler].protected = 0; - gProtectStructs[gActiveBattler].endured = 0; + gProtectStructs[gActiveBattler].spikyShielded = 0; + gProtectStructs[gActiveBattler].kingsShielded = 0; + gProtectStructs[gActiveBattler].banefulBunkered = 0; } else { - dataPtr = (u8*)(&gProtectStructs[gActiveBattler]); - for (i = 0; i < sizeof(struct ProtectStruct); i++) - dataPtr[i] = 0; + memset(&gProtectStructs[gActiveBattler], 0, sizeof(struct ProtectStruct)); if (gDisableStructs[gActiveBattler].isFirstTurn) gDisableStructs[gActiveBattler].isFirstTurn--; @@ -4805,24 +4529,44 @@ static void TurnValuesCleanUp(bool8 var0) gBattleMons[gActiveBattler].status2 &= ~(STATUS2_SUBSTITUTE); } + gSideStatuses[0] &= ~(SIDE_STATUS_QUICK_GUARD | SIDE_STATUS_WIDE_GUARD | SIDE_STATUS_CRAFTY_SHIELD | SIDE_STATUS_MAT_BLOCK); + gSideStatuses[1] &= ~(SIDE_STATUS_QUICK_GUARD | SIDE_STATUS_WIDE_GUARD | SIDE_STATUS_CRAFTY_SHIELD | SIDE_STATUS_MAT_BLOCK); gSideTimers[0].followmeTimer = 0; gSideTimers[1].followmeTimer = 0; } void SpecialStatusesClear(void) { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) - { - s32 i; - u8 *dataPtr = (u8*)(&gSpecialStatuses[gActiveBattler]); + memset(&gSpecialStatuses, 0, sizeof(gSpecialStatuses)); +} - for (i = 0; i < sizeof(struct SpecialStatus); i++) - dataPtr[i] = 0; +static void CheckMegaEvolutionBeforeTurn(void) +{ + if (!(gHitMarker & HITMARKER_RUN)) + { + while (gBattleStruct->mega.battlerId < gBattlersCount) + { + gActiveBattler = gBattlerAttacker = gBattleStruct->mega.battlerId; + gBattleStruct->mega.battlerId++; + if (gBattleStruct->mega.toEvolve & gBitTable[gActiveBattler] + && !(gProtectStructs[gActiveBattler].noValidMoves)) + { + gBattleStruct->mega.toEvolve &= ~(gBitTable[gActiveBattler]); + gLastUsedItem = gBattleMons[gActiveBattler].item; + BattleScriptExecute(BattleScript_MegaEvolution); + return; + } + } } + + gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts; + gBattleStruct->focusPunchBattlerId = 0; } static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void) { + u32 i; + if (!(gHitMarker & HITMARKER_RUN)) { while (gBattleStruct->focusPunchBattlerId < gBattlersCount) @@ -4840,11 +4584,16 @@ static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void) } } - TryClearRageStatuses(); - gCurrentTurnActionNumber = 0; //See comment underneath - gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber]; //Should be gActionsByTurnOrder[(gCurrentTurnActionNumber = 0)], but that doesn't match - gDynamicBasePower = 0; + TryClearRageAndFuryCutter(); + gCurrentTurnActionNumber = 0; + gCurrentActionFuncId = gActionsByTurnOrder[0]; gBattleStruct->dynamicMoveType = 0; + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { + gBattleStruct->ateBoost[i] = FALSE; + gSpecialStatuses[i].gemBoost = FALSE; + } + gBattleMainFunc = RunTurnActionsFunctions; gBattleCommunication[3] = 0; gBattleCommunication[4] = 0; @@ -5012,6 +4761,8 @@ static void HandleEndTurn_MonFled(void) static void HandleEndTurn_FinishBattle(void) { + u32 i; + if (gCurrentActionFuncId == B_ACTION_TRY_FINISH || gCurrentActionFuncId == B_ACTION_FINISHED) { if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK @@ -5057,6 +4808,11 @@ static void HandleEndTurn_FinishBattle(void) sub_8186444(); BeginFastPaletteFade(3); FadeOutMapMusic(5); + for (i = 0; i < PARTY_SIZE; i++) + { + UndoMegaEvolution(i); + UndoFormChange(i, B_SIDE_PLAYER); + } gBattleMainFunc = FreeResetData_ReturnToOvOrDoEvolutions; gCB2_AfterEvolution = BattleMainCB2; } @@ -5072,12 +4828,15 @@ static void FreeResetData_ReturnToOvOrDoEvolutions(void) if (!gPaletteFade.active) { ResetSpriteData(); - if (gLeveledUpInBattle == 0 || gBattleOutcome != B_OUTCOME_WON) + if (gLeveledUpInBattle && (gBattleOutcome == B_OUTCOME_WON || gBattleOutcome == B_OUTCOME_CAUGHT)) + { + gBattleMainFunc = TryEvolvePokemon; + } + else { gBattleMainFunc = ReturnFromBattleToOverworld; return; } - gBattleMainFunc = TryEvolvePokemon; } FreeAllWindowBuffers(); @@ -5172,4 +4931,118 @@ void RunBattleScriptCommands(void) if (gBattleControllerExecFlags == 0) gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); } +void SetTypeBeforeUsingMove(u16 move, u8 battlerAtk) +{ + u32 moveType, ateType, attackerAbility; + if (move == MOVE_STRUGGLE) + return; + + gBattleStruct->dynamicMoveType = 0; + gBattleStruct->ateBoost[battlerAtk] = 0; + gSpecialStatuses[battlerAtk].gemBoost = 0; + + if (gBattleMoves[move].effect == EFFECT_WEATHER_BALL) + { + if (WEATHER_HAS_EFFECT) + { + if (gBattleWeather & WEATHER_RAIN_ANY) + gBattleStruct->dynamicMoveType = TYPE_WATER | 0x80; + else if (gBattleWeather & WEATHER_SANDSTORM_ANY) + gBattleStruct->dynamicMoveType = TYPE_ROCK | 0x80; + else if (gBattleWeather & WEATHER_SUN_ANY) + gBattleStruct->dynamicMoveType = TYPE_FIRE | 0x80; + else if (gBattleWeather & WEATHER_HAIL_ANY) + gBattleStruct->dynamicMoveType = TYPE_ICE | 0x80; + else + gBattleStruct->dynamicMoveType = TYPE_NORMAL | 0x80; + } + } + else if (gBattleMoves[move].effect == EFFECT_HIDDEN_POWER) + { + u8 typeBits = ((gBattleMons[battlerAtk].hpIV & 1) << 0) + | ((gBattleMons[battlerAtk].attackIV & 1) << 1) + | ((gBattleMons[battlerAtk].defenseIV & 1) << 2) + | ((gBattleMons[battlerAtk].speedIV & 1) << 3) + | ((gBattleMons[battlerAtk].spAttackIV & 1) << 4) + | ((gBattleMons[battlerAtk].spDefenseIV & 1) << 5); + + gBattleStruct->dynamicMoveType = (15 * typeBits) / 63 + 1; + if (gBattleStruct->dynamicMoveType >= TYPE_MYSTERY) + gBattleStruct->dynamicMoveType++; + gBattleStruct->dynamicMoveType |= 0xC0; + } + else if (gBattleMoves[move].effect == EFFECT_TECHNO_BLAST) + { + if (GetBattlerHoldEffect(battlerAtk, TRUE) == HOLD_EFFECT_DRIVE) + gBattleStruct->dynamicMoveType = ItemId_GetSecondaryId(gBattleMons[battlerAtk].item) | 0x80; + } + else if (move == MOVE_MULTI_ATTACK) + { + if (GetBattlerHoldEffect(battlerAtk, TRUE) == HOLD_EFFECT_MEMORY) + gBattleStruct->dynamicMoveType = ItemId_GetSecondaryId(gBattleMons[battlerAtk].item) | 0x80; + } + else if (gBattleMoves[move].effect == EFFECT_JUDGMENT) + { + // TODO: + } + else if (gBattleMoves[move].effect == EFFECT_REVELATION_DANCE) + { + if (gBattleMons[battlerAtk].type1 != TYPE_MYSTERY) + gBattleStruct->dynamicMoveType = gBattleMons[battlerAtk].type1 | 0x80; + else if (gBattleMons[battlerAtk].type2 != TYPE_MYSTERY) + gBattleStruct->dynamicMoveType = gBattleMons[battlerAtk].type2 | 0x80; + else if (gBattleMons[battlerAtk].type3 != TYPE_MYSTERY) + gBattleStruct->dynamicMoveType = gBattleMons[battlerAtk].type3 | 0x80; + } + else if (gBattleMoves[move].effect == EFFECT_NATURAL_GIFT) + { + if (ItemId_GetPocket(gBattleMons[battlerAtk].item) == POCKET_BERRIES) + gBattleStruct->dynamicMoveType = gNaturalGiftTable[ITEM_TO_BERRY(gBattleMons[battlerAtk].item)].type; + } + + attackerAbility = GetBattlerAbility(battlerAtk); + GET_MOVE_TYPE(move, moveType); + if ((gFieldStatuses & STATUS_FIELD_ION_DELUGE && moveType == TYPE_NORMAL) + || gStatuses3[battlerAtk] & STATUS3_ELECTRIFIED) + { + gBattleStruct->dynamicMoveType = 0x80 | TYPE_ELECTRIC; + } + else if (gBattleMoves[move].type == TYPE_NORMAL + && gBattleMoves[move].effect != EFFECT_HIDDEN_POWER + && gBattleMoves[move].effect != EFFECT_WEATHER_BALL + && gBattleMoves[move].effect != EFFECT_JUDGMENT + && gBattleMoves[move].effect != EFFECT_NATURAL_GIFT + && ((attackerAbility == ABILITY_PIXILATE && (ateType = TYPE_FAIRY)) + || (attackerAbility == ABILITY_REFRIGERATE && (ateType = TYPE_ICE)) + || (attackerAbility == ABILITY_AERILATE && (ateType = TYPE_FLYING)) + || ((attackerAbility == ABILITY_GALVANIZE) && (ateType = TYPE_ELECTRIC)) + ) + ) + { + gBattleStruct->dynamicMoveType = 0x80 | ateType; + gBattleStruct->ateBoost[battlerAtk] = 1; + } + else if (gBattleMoves[move].type != TYPE_NORMAL + && gBattleMoves[move].effect != EFFECT_HIDDEN_POWER + && gBattleMoves[move].effect != EFFECT_WEATHER_BALL + && attackerAbility == ABILITY_NORMALIZE) + { + gBattleStruct->dynamicMoveType = 0x80 | TYPE_NORMAL; + gBattleStruct->ateBoost[battlerAtk] = 1; + } + else if (gBattleMoves[move].flags & FLAG_SOUND + && attackerAbility == ABILITY_LIQUID_VOICE) + { + gBattleStruct->dynamicMoveType = 0x80 | TYPE_WATER; + } + + // Check if a gem should activate. + GET_MOVE_TYPE(move, moveType); + if (GetBattlerHoldEffect(battlerAtk, TRUE) == HOLD_EFFECT_GEMS + && moveType == ItemId_GetSecondaryId(gBattleMons[battlerAtk].item)) + { + gSpecialStatuses[battlerAtk].gemParam = GetBattlerHoldEffectParam(battlerAtk); + gSpecialStatuses[battlerAtk].gemBoost = 1; + } +} diff --git a/src/battle_message.c b/src/battle_message.c index c004665d75..a528b9d9a6 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -19,12 +19,14 @@ #include "text.h" #include "trainer_hill.h" #include "window.h" +#include "constants/abilities.h" #include "constants/battle_dome.h" #include "constants/battle_string_ids.h" #include "constants/berry.h" #include "constants/frontier_util.h" #include "constants/items.h" #include "constants/moves.h" +#include "constants/species.h" #include "constants/trainers.h" #include "constants/trainer_hill.h" #include "constants/weather.h" @@ -91,7 +93,7 @@ static const u8 sText_PkmnAlreadyAsleep[] = _("{B_DEF_NAME_WITH_PREFIX} is\nalre static const u8 sText_PkmnAlreadyAsleep2[] = _("{B_ATK_NAME_WITH_PREFIX} is\nalready asleep!"); static const u8 sText_PkmnWasntAffected[] = _("{B_DEF_NAME_WITH_PREFIX}\nwasn't affected!"); static const u8 sText_PkmnWasPoisoned[] = _("{B_EFF_NAME_WITH_PREFIX}\nwas poisoned!"); -static const u8 sText_PkmnPoisonedBy[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\npoisoned {B_EFF_NAME_WITH_PREFIX}!"); +static const u8 sText_PkmnPoisonedBy[] = _("{B_EFF_NAME_WITH_PREFIX} was poisoned by\n{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_BUFF1}!"); static const u8 sText_PkmnHurtByPoison[] = _("{B_ATK_NAME_WITH_PREFIX} is hurt\nby poison!"); static const u8 sText_PkmnAlreadyPoisoned[] = _("{B_DEF_NAME_WITH_PREFIX} is already\npoisoned."); static const u8 sText_PkmnBadlyPoisoned[] = _("{B_EFF_NAME_WITH_PREFIX} is badly\npoisoned!"); @@ -227,7 +229,7 @@ static const u8 sText_NaturePowerTurnedInto[] = _("NATURE POWER turned into\n{B_ static const u8 sText_PkmnStatusNormal[] = _("{B_ATK_NAME_WITH_PREFIX}'s status\nreturned to normal!"); static const u8 sText_PkmnSubjectedToTorment[] = _("{B_DEF_NAME_WITH_PREFIX} was subjected\nto TORMENT!"); static const u8 sText_PkmnTighteningFocus[] = _("{B_ATK_NAME_WITH_PREFIX} is tightening\nits focus!"); -static const u8 sText_PkmnFellForTaunt[] = _("{B_DEF_NAME_WITH_PREFIX} fell for\nthe TAUNT!"); +static const u8 sText_PkmnFellForTaunt[] = _("{B_DEF_NAME_WITH_PREFIX} fell for\nthe Taunt!"); static const u8 sText_PkmnReadyToHelp[] = _("{B_ATK_NAME_WITH_PREFIX} is ready to\nhelp {B_DEF_NAME_WITH_PREFIX}!"); static const u8 sText_PkmnSwitchedItems[] = _("{B_ATK_NAME_WITH_PREFIX} switched\nitems with its opponent!"); static const u8 sText_PkmnObtainedX[] = _("{B_ATK_NAME_WITH_PREFIX} obtained\n{B_BUFF1}."); @@ -262,9 +264,10 @@ static const u8 sText_TheWallShattered[] = _("The wall shattered!"); static const u8 sText_ButNoEffect[] = _("But it had no effect!"); static const u8 sText_PkmnHasNoMovesLeft[] = _("{B_ACTIVE_NAME_WITH_PREFIX} has no\nmoves left!\p"); static const u8 sText_PkmnMoveIsDisabled[] = _("{B_ACTIVE_NAME_WITH_PREFIX}'s {B_CURRENT_MOVE}\nis disabled!\p"); -static const u8 sText_PkmnCantUseMoveTorment[] = _("{B_ACTIVE_NAME_WITH_PREFIX} can't use the same\nmove in a row due to the TORMENT!\p"); -static const u8 sText_PkmnCantUseMoveTaunt[] = _("{B_ACTIVE_NAME_WITH_PREFIX} can't use\n{B_CURRENT_MOVE} after the TAUNT!\p"); +static const u8 sText_PkmnCantUseMoveTorment[] = _("{B_ACTIVE_NAME_WITH_PREFIX} can't use the same\nmove in a row due to the Torment!\p"); +static const u8 sText_PkmnCantUseMoveTaunt[] = _("{B_ACTIVE_NAME_WITH_PREFIX} can't use\n{B_CURRENT_MOVE} after the Taunt!\p"); static const u8 sText_PkmnCantUseMoveSealed[] = _("{B_ACTIVE_NAME_WITH_PREFIX} can't use the\nsealed {B_CURRENT_MOVE}!\p"); +static const u8 sText_PkmnCantUseMoveThroatChop[] = _("{B_ACTIVE_NAME_WITH_PREFIX} can't use\n{B_CURRENT_MOVE} due to Throat Chop!\p"); static const u8 sText_PkmnMadeItRain[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\nmade it rain!"); static const u8 sText_PkmnRaisedSpeed[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\nraised its SPEED!"); static const u8 sText_PkmnProtectedBy[] = _("{B_DEF_NAME_WITH_PREFIX} was protected\nby {B_DEF_ABILITY}!"); @@ -280,7 +283,7 @@ static const u8 sText_PkmnRaisedFirePowerWith[] = _("{B_DEF_NAME_WITH_PREFIX}'s static const u8 sText_PkmnAnchorsItselfWith[] = _("{B_DEF_NAME_WITH_PREFIX} anchors\nitself with {B_DEF_ABILITY}!"); static const u8 sText_PkmnCutsAttackWith[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\ncuts {B_DEF_NAME_WITH_PREFIX}'s ATTACK!"); static const u8 sText_PkmnPreventsStatLossWith[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\nprevents stat loss!"); -static const u8 sText_PkmnHurtsWith[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\nhurt {B_ATK_NAME_WITH_PREFIX}!"); +static const u8 sText_PkmnHurtsWith[] = _("{B_ATK_NAME_WITH_PREFIX} was hurt by\n{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}!"); static const u8 sText_PkmnTraced[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} TRACED\n{B_BUFF1}'s {B_BUFF2}!"); static const u8 sText_PkmnsXPreventsBurns[] = _("{B_EFF_NAME_WITH_PREFIX}'s {B_EFF_ABILITY}\nprevents burns!"); static const u8 sText_PkmnsXBlocksY[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\nblocks {B_CURRENT_MOVE}!"); @@ -421,31 +424,20 @@ static const u8 sText_FoePkmnPrefix3[] = _("Foe"); static const u8 sText_AllyPkmnPrefix2[] = _("Ally"); static const u8 sText_FoePkmnPrefix4[] = _("Foe"); static const u8 sText_AllyPkmnPrefix3[] = _("Ally"); -static const u8 sText_AttackerUsedX[] = _("{B_ATK_NAME_WITH_PREFIX} used\n{B_BUFF2}"); +static const u8 sText_AttackerUsedX[] = _("{B_ATK_NAME_WITH_PREFIX} used\n{B_BUFF3}!"); static const u8 sText_ExclamationMark[] = _("!"); static const u8 sText_ExclamationMark2[] = _("!"); static const u8 sText_ExclamationMark3[] = _("!"); static const u8 sText_ExclamationMark4[] = _("!"); static const u8 sText_ExclamationMark5[] = _("!"); -static const u8 sText_HP2[] = _("HP"); -static const u8 sText_Attack2[] = _("ATTACK"); -static const u8 sText_Defense2[] = _("DEFENSE"); -static const u8 sText_Speed[] = _("SPEED"); -static const u8 sText_SpAtk2[] = _("SP. ATK"); -static const u8 sText_SpDef2[] = _("SP. DEF"); static const u8 sText_Accuracy[] = _("accuracy"); static const u8 sText_Evasiveness[] = _("evasiveness"); const u8 * const gStatNamesTable[NUM_BATTLE_STATS] = { - [STAT_HP] = sText_HP2, - [STAT_ATK] = sText_Attack2, - [STAT_DEF] = sText_Defense2, - [STAT_SPEED] = sText_Speed, - [STAT_SPATK] = sText_SpAtk2, - [STAT_SPDEF] = sText_SpDef2, - [STAT_ACC] = sText_Accuracy, - [STAT_EVASION] = sText_Evasiveness, + gText_HP3, gText_Attack, gText_Defense, + gText_Speed, gText_SpAtk, gText_SpDef, + sText_Accuracy, sText_Evasiveness }; static const u8 sText_PokeblockWasTooSpicy[] = _("was too spicy!"); @@ -474,13 +466,13 @@ static const u8 sText_PkmnBrokeFree[] = _("Oh, no!\nThe POKéMON broke free!"); static const u8 sText_ItAppearedCaught[] = _("Aww!\nIt appeared to be caught!"); static const u8 sText_AarghAlmostHadIt[] = _("Aargh!\nAlmost had it!"); static const u8 sText_ShootSoClose[] = _("Shoot!\nIt was so close, too!"); -static const u8 sText_GotchaPkmnCaught[] = _("Gotcha!\n{B_OPPONENT_MON1_NAME} was caught!{WAIT_SE}{PLAY_BGM MUS_CAUGHT}\p"); -static const u8 sText_GotchaPkmnCaught2[] = _("Gotcha!\n{B_OPPONENT_MON1_NAME} was caught!{WAIT_SE}{PLAY_BGM MUS_CAUGHT}{PAUSE 127}"); -static const u8 sText_GiveNicknameCaptured[] = _("Give a nickname to the\ncaptured {B_OPPONENT_MON1_NAME}?"); -static const u8 sText_PkmnSentToPC[] = _("{B_OPPONENT_MON1_NAME} was sent to\n{B_PC_CREATOR_NAME} PC."); +static const u8 sText_GotchaPkmnCaught[] = _("Gotcha!\n{B_DEF_NAME} was caught!{WAIT_SE}{PLAY_BGM MUS_CAUGHT}\p"); +static const u8 sText_GotchaPkmnCaught2[] = _("Gotcha!\n{B_DEF_NAME} was caught!{WAIT_SE}{PLAY_BGM MUS_CAUGHT}{PAUSE 127}"); +static const u8 sText_GiveNicknameCaptured[] = _("Give a nickname to the\ncaptured {B_DEF_NAME}?"); +static const u8 sText_PkmnSentToPC[] = _("{B_DEF_NAME} was sent to\n{B_PC_CREATOR_NAME} PC."); static const u8 sText_Someones[] = _("someone's"); static const u8 sText_Lanettes[] = _("LANETTE's"); -static const u8 sText_PkmnDataAddedToDex[] = _("{B_OPPONENT_MON1_NAME}'s data was\nadded to the POKéDEX.\p"); +static const u8 sText_PkmnDataAddedToDex[] = _("{B_DEF_NAME}'s data was\nadded to the POKéDEX.\p"); static const u8 sText_ItIsRaining[] = _("It is raining."); static const u8 sText_SandstormIsRaging[] = _("A sandstorm is raging."); static const u8 sText_BoxIsFull[] = _("The BOX is full!\nYou can't catch any more!\p"); @@ -519,8 +511,202 @@ static const u8 sText_Trainer2WinText[]; static const u8 sText_TwoInGameTrainersDefeated[]; static const u8 sText_Trainer2LoseText[]; -const u8 * const gBattleStringsTable[BATTLESTRINGS_COUNT] = +// New battle strings. +static const s8 sText_EnduredViaSturdy[] = _("{B_DEF_NAME_WITH_PREFIX} ENDURED\nthe hit using {B_DEF_ABILITY}!"); +static const s8 sText_PowerHerbActivation[] = _("{B_ATK_NAME_WITH_PREFIX} became fully charged\ndue to its {B_LAST_ITEM}!"); +static const s8 sText_HurtByItem[] = _("{B_ATK_NAME_WITH_PREFIX} was hurt\nby its {B_LAST_ITEM}!"); +static const s8 sText_BadlyPoisonedByItem[] = _("{B_EFF_NAME_WITH_PREFIX} was badly \npoisoned by the {B_LAST_ITEM}!"); +static const s8 sText_BurnedByItem[] = _("{B_EFF_NAME_WITH_PREFIX} was burned\nby the {B_LAST_ITEM}!"); +static const s8 sText_TargetAbilityActivates[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} activates!"); +static const u8 sText_GravityIntensified[] = _("GRAVITY intensified!"); +static const u8 sText_TargetIdentified[] = _("{B_DEF_NAME_WITH_PREFIX} was \nidentified!"); +static const u8 sText_TargetWokeUp[] = _("{B_DEF_NAME_WITH_PREFIX} woke up!"); +static const u8 sText_PkmnStoleAndAteItem[] = _("{B_ATK_NAME_WITH_PREFIX} stole and\nate {B_DEF_NAME_WITH_PREFIX}'s {B_LAST_ITEM}!"); +static const u8 sText_TailWindBlew[] = _("The tailwind blew from\nbehind {B_ATK_TEAM2} team!"); +static const u8 sText_PkmnWentBack[] = _("{B_ATK_NAME_WITH_PREFIX} went back\nto {B_ATK_TRAINER_CLASS} {B_ATK_TRAINER_NAME}"); +static const u8 sText_PkmnCantUseItemsAnymore[] = _("{B_DEF_NAME_WITH_PREFIX} can't use\nitems anymore!"); +static const u8 sText_PkmnFlung[] = _("{B_ATK_NAME_WITH_PREFIX} flung its\n{B_LAST_ITEM}!"); +static const u8 sText_PkmnPreventedFromHealing[] = _("{B_DEF_NAME_WITH_PREFIX} was prevented\nfrom healing!"); +static const u8 sText_PkmnSwitchedAtkAndDef[] = _("{B_ATK_NAME_WITH_PREFIX} switched its\nAttack and Defense!"); +static const u8 sText_PkmnsAbilitySuppressed[] = _("{B_DEF_NAME_WITH_PREFIX}'s ability\nwas suppressed!"); +static const u8 sText_ShieldedFromCriticalHits[] = _("The {B_CURRENT_MOVE} shielded {B_ATK_TEAM2}\nteam from critical hits!"); +static const u8 sText_SwitchedAtkAndSpAtk[] = _("{B_ATK_NAME_WITH_PREFIX} switched all its\nchanges to its Attack and\pSp. Atk with the target!"); +static const u8 sText_SwitchedDefAndSpDef[] = _("{B_ATK_NAME_WITH_PREFIX} switched all its\nchanges to its Defense and\pSp. Def with the target!"); +static const u8 sText_PkmnAcquiredAbility[] = _("{B_DEF_NAME_WITH_PREFIX} acquired\n{B_DEF_ABILITY}!"); +static const u8 sText_PoisonSpikesScattered[] = _("Poison Spikes were scattered all\naround the opposing team's feet!"); +static const u8 sText_PkmnSwitchedStatChanges[] = _("{B_ATK_NAME_WITH_PREFIX} switched stat changes\nwith the target!"); +static const u8 sText_PkmnSurroundedWithVeilOfWater[] = _("{B_ATK_NAME_WITH_PREFIX} surrounded itself\nwith a veil of water!"); +static const u8 sText_PkmnLevitatedOnElectromagnetism[] = _("{B_ATK_NAME_WITH_PREFIX} levitated on\nelectromagnetism!"); +static const u8 sText_PkmnTwistedDimensions[] = _("{B_ATK_NAME_WITH_PREFIX} twisted\nthe dimensions!"); +static const u8 sText_PointedStonesFloat[] =_("Pointed stones float in the air\naround {B_DEF_TEAM2} team!"); +static const u8 sText_CloakedInMysticalMoonlight[] =_("It became cloaked in mystical\nmoonlight!"); +static const u8 sText_TrappedBySwirlingMagma[] =_("{B_DEF_NAME_WITH_PREFIX} became\ntrapped by swirling magma!"); +static const u8 sText_VanishedInstantly[] =_("{B_ATK_NAME_WITH_PREFIX} vanished\ninstantly!"); +static const u8 sText_ProtectedTeam[] =_("{B_CURRENT_MOVE} protected\n{B_ATK_TEAM2} team!"); +static const u8 sText_SharedItsGuard[] =_("{B_ATK_NAME_WITH_PREFIX} shared its\nguard with the target!"); +static const u8 sText_SharedItsPower[] =_("{B_ATK_NAME_WITH_PREFIX} shared its\npower with the target!"); +static const u8 sText_SwapsDefAndSpDefOfAllPkmn[] =_("It created a bizarre area in which\nthe Defense and Sp.Def stats are swapped!"); +static const u8 sText_BecameNimble[] =_("{B_ATK_NAME_WITH_PREFIX} became nimble!"); +static const u8 sText_HurledIntoTheAir[] =_("{B_DEF_NAME_WITH_PREFIX} was hurled\ninto the air!"); +static const u8 sText_HeldItemsLoseEffects[] =_("It created a bizarre area in which\nPokémon's held items lose their effects!"); +static const u8 sText_FellStraightDown[] =_("{B_DEF_NAME_WITH_PREFIX} fell\nstraight down!"); +static const u8 sText_TransformedIntoWaterType[] =_("{B_DEF_NAME_WITH_PREFIX} transformed\ninto the water type!"); +static const u8 sText_PkmnAcquiredSimple[] =_("{B_DEF_NAME_WITH_PREFIX} acquired\nSimple!"); +static const u8 sText_KindOffer[] =_("{B_DEF_NAME_WITH_PREFIX}\ntook the kind offer!"); +static const u8 sText_ResetsTargetsStatLevels[] =_("{B_DEF_NAME_WITH_PREFIX}'s stat changes\nwere removed!"); +static const u8 sText_AllySwitchPosition[] =_("{B_ATK_NAME_WITH_PREFIX} and\n{B_SCR_ACTIVE_NAME_WITH_PREFIX} switched places!"); +static const u8 sText_RestoreTargetsHealth[] =_("{B_DEF_NAME_WITH_PREFIX}'s HP was restored!"); +static const u8 sText_TookPkmnIntoTheSky[] =_("{B_ATK_NAME_WITH_PREFIX} took\n{B_DEF_NAME_WITH_PREFIX} into the sky!"); +static const u8 sText_FreedFromSkyDrop[] =_("{B_DEF_NAME_WITH_PREFIX} was freed\nfrom the Sky Drop!"); +static const u8 sText_PostponeTargetMove[] =_("{B_DEF_NAME_WITH_PREFIX}'s move\nwas postponed!"); +static const u8 sText_ReflectTargetsType[] =_("{B_ATK_NAME_WITH_PREFIX}'s type\nchanged to match the {B_DEF_NAME_WITH_PREFIX}'s!"); +static const u8 sText_TransferHeldItem[] =_("{B_DEF_NAME_WITH_PREFIX} received {B_LAST_ITEM}\nfrom {B_ATK_NAME_WITH_PREFIX}"); +static const u8 sText_EmbargoEnds[] = _("{B_ATK_NAME_WITH_PREFIX} can\nuse items again!"); +static const u8 sText_Electromagnetism[] = _("electromagnetism"); +static const u8 sText_BufferEnds[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1}\nwore off!"); +static const u8 sText_ThroatChopEnds[] = _("{B_ATK_NAME_WITH_PREFIX} can\nuse sound-based moves again!"); +static const u8 sText_TelekinesisEnds[] = _("{B_ATK_NAME_WITH_PREFIX} was freed\nfrom the telekinesis!"); +static const u8 sText_TailwindEnds[] = _("{B_ATK_TEAM1} team's tailwind\n petered out!"); +static const u8 sText_LuckyChantEnds[] = _("{B_ATK_TEAM1} team's Lucky Chant\n wore off!"); +static const u8 sText_TrickRoomEnds[] = _("The twisted dimensions returned to\nnormal!"); +static const u8 sText_WonderRoomEnds[] = _("Wonder Room wore off, and\nDefense and Sp. Def stats returned to normal!"); +static const u8 sText_MagicRoomEnds[] = _("Magic Room wore off, and\nheld items' effects returned to normal!"); +static const u8 sText_MudSportEnds[] = _("The effects of Mud Sport have faded."); +static const u8 sText_WaterSportEnds[] = _("The effects of Water Sport have faded."); +static const u8 sText_GravityEnds[] = _("Gravity returned to normal!"); +static const u8 sText_AquaRingHeal[] = _("Aqua Ring restored\n{B_ATK_NAME_WITH_PREFIX}'s HP!"); +static const u8 sText_TargetAbilityRaisedStat[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\nraised its {B_BUFF1}!"); +static const u8 sText_TargetAbilityLoweredStat[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\nlowered its {B_BUFF1}!"); +static const u8 sText_AttackerAbilityRaisedStat[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY}\nraised its {B_BUFF1}!"); +static const u8 sText_ScriptingAbilityRaisedStat[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\nraised its {B_BUFF1}!"); +static const u8 sText_AuroraVeilEnds[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\nwore off!"); +static const u8 sText_ElectricTerrainEnds[] = _("The electricity disappeared\nfrom the battlefield."); +static const u8 sText_MistyTerrainEnds[] = _("The mist disappeared\nfrom the battlefield."); +static const u8 sText_PsychicTerrainEnds[] = _("The weirdness disappeared\nfrom the battlefield."); +static const u8 sText_GrassyTerrainEnds[] = _("The grass disappeared\nfrom the battlefield."); +static const u8 sText_AngryPointActivates[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} maxed\nits attack!"); +static const u8 sText_PoisonHealHpUp[] = _("The poisoning healed {B_ATK_NAME_WITH_PREFIX}\na little bit!"); +static const u8 sText_BadDreamsDmg[] = _("{B_DEF_NAME_WITH_PREFIX} is tormented\nby {B_ATK_ABILITY}!"); +static const u8 sText_MoldBreakerEnters[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} breaks the mold!"); +static const u8 sText_TeravoltEnters[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is radiating \na bursting aura!"); +static const u8 sText_TurboblazeEnters[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is radiating\na blazing aura!"); +static const u8 sText_SlowStartEnters[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} can't get it going!"); +static const u8 sText_SlowStartEnd[] = _("{B_ATK_NAME_WITH_PREFIX} finally got\nits act together!"); +static const u8 sText_SolarPowerHpDrop[] = _("The {B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY}\ntakes its toll!"); +static const u8 sText_AftermathDmg[] = _("{B_ATK_NAME_WITH_PREFIX} is hurt!"); +static const u8 sText_AnticipationActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} shuddered\nin anticipation!"); +static const u8 sText_ForewarnActivates[] = _("{B_SCR_ACTIVE_ABILITY} alerted {B_SCR_ACTIVE_NAME_WITH_PREFIX}\nto the {B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}!"); +static const u8 sText_IceBodyHpGain[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY}\nhealed it a little bit!"); +static const u8 sText_SnowWarningHail[] = _("It started to hail!"); +static const u8 sText_FriskActivates[] = _("{B_ATK_NAME_WITH_PREFIX} frisked {B_DEF_NAME_WITH_PREFIX} and\nfound its {B_LAST_ITEM}!"); +static const u8 sText_UnnerveEnters[] = _("The opposing team is too nervous\nto eat Berries!"); +static const u8 sText_HarvestBerry[] = _("{B_ATK_NAME_WITH_PREFIX} harvested\nits {B_LAST_ITEM}!"); +static const u8 sText_MoxieAtkRise[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} raised its Attack!"); +static const u8 sText_MagicBounceActivates[] = _("The {B_DEF_NAME_WITH_PREFIX} bounced the\n{B_ATK_NAME_WITH_PREFIX} back!"); +static const u8 sText_ProteanTypeChange[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} transformed\nit into the {B_BUFF1} type!"); +static const u8 sText_SymbiosisItemPass[] = _("{B_ATK_NAME_WITH_PREFIX} passed its {B_LAST_ITEM}\nto {B_SCR_ACTIVE_NAME_WITH_PREFIX} through {B_ATK_ABILITY}!"); +static const u8 sText_StealthRockDmg[] = _("Pointed stones dug into\n{B_SCR_ACTIVE_NAME_WITH_PREFIX}!"); +static const u8 sText_ToxicSpikesAbsorbed[] = _("The poison spikes disappeared\nfrom around the opposing team's feet!"); +static const u8 sText_ToxicSpikesPoisoned[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} was poisoned!"); +static const u8 sText_StickyWebSwitchIn[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} was\ncaught in a Sticky Web!"); +static const u8 sText_HealingWishCameTrue[] = _("The healing wish came true\nfor {B_ATK_NAME_WITH_PREFIX}!"); +static const u8 sText_HealingWishHealed[] = _("{B_ATK_NAME_WITH_PREFIX} regained health!"); +static const u8 sText_LunarDanceCameTrue[] = _("{B_ATK_NAME_WITH_PREFIX} became cloaked\nin mystical moonlight!"); +static const u8 sText_CursedBodyDisabled[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1} was disabled\nby {B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}!"); +static const u8 sText_AttackerAquiredAbility[] = _("{B_ATK_NAME_WITH_PREFIX} acquired {B_LAST_ABILITY}!"); +static const u8 sText_TargetStatWontGoHigher[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}\nwon't go higher!"); +static const u8 sText_PkmnMoveBouncedViaAbility[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_CURRENT_MOVE} was\nbounced back by {B_DEF_NAME_WITH_PREFIX}'s\l{B_DEF_ABILITY}!"); +static const u8 sText_ImposterTransform[] = _("{B_ATK_NAME_WITH_PREFIX} transformed into\n{B_DEF_NAME_WITH_PREFIX} using {B_LAST_ABILITY}!"); +static const u8 sText_NotDoneYet[] = _("This move effect is not done yet!\p"); +static const u8 sText_PkmnBlewAwayToxicSpikes[] = _("{B_ATK_NAME_WITH_PREFIX} blew away\nTOXIC SPIKES!"); +static const u8 sText_PkmnBlewAwayStickyWeb[] = _("{B_ATK_NAME_WITH_PREFIX} blew away\nSTICKY WEB!"); +static const u8 sText_PkmnBlewAwayStealthRock[] = _("{B_ATK_NAME_WITH_PREFIX} blew away\nSTEALTH ROCK!"); +static const u8 sText_StickyWebUsed[] = _("A sticky web spreads out on the\nground around {B_DEF_TEAM2} team!"); +static const u8 sText_QuashSuccess[] = _("The opposing {B_ATK_NAME_WITH_PREFIX}'s move was postponed!"); +static const u8 sText_IonDelugeOn[] = _("A deluge of ions showers\nthe battlefield!"); +static const u8 sText_TopsyTurvySwitchedStats[] = _("{B_DEF_NAME_WITH_PREFIX}'s stat changes were\nall reversed!"); +static const u8 sText_TerrainBecomesMisty[] = _("Mist swirled about\nthe battlefield!"); +static const u8 sText_TerrainBecomesGrassy[] = _("Grass grew to cover\nthe battlefield!"); +static const u8 sText_TerrainBecomesElectric[] = _("An electric current runs across\nthe battlefield!"); +static const u8 sText_TerrainBecomesPsychic[] = _("The battlefield got weird!"); +static const u8 sText_TargetElectrified[] = _("The {B_DEF_NAME_WITH_PREFIX}'s moves\nhave been electrified!"); +static const u8 sText_AssaultVestDoesntAllow[] = _("The effects of the {B_LAST_ITEM} prevent status\nmoves from being used!\p"); +static const u8 sText_GravityPreventsUsage[] = _("{B_ATK_NAME_WITH_PREFIX} can't use {B_CURRENT_MOVE}\nbecause of gravity!\p"); +static const u8 sText_HealBlockPreventsUsage[] = _("{B_ATK_NAME_WITH_PREFIX} was\nprevented from healing!\p"); +static const u8 sText_MegaEvoReacting[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_LAST_ITEM} is \nreacting to {B_ATK_TRAINER_NAME}'s Mega Ring!"); +static const u8 sText_MegaEvoEvolved[] = _("{B_ATK_NAME_WITH_PREFIX} has Mega\nEvolved into Mega {B_BUFF1}!"); +static const u8 sText_drastically[] = _("drastically "); +static const u8 sText_severely[] = _("severely "); +static const u8 sText_Infestation[] = _("{B_DEF_NAME_WITH_PREFIX} has been afflicted\nwith an infestation by {B_ATK_NAME_WITH_PREFIX}!"); +static const u8 sText_NoEffectOnTarget[] = _("It had no effect\non {B_DEF_NAME_WITH_PREFIX}!"); +static const u8 sText_BurstingFlames[] = _("The bursting flames\nhit {B_SCR_ACTIVE_NAME_WITH_PREFIX}!"); +static const u8 sText_BestowItemGiving[] = _("{B_DEF_NAME_WITH_PREFIX} received {B_LAST_ITEM}\nfrom {B_ATK_NAME_WITH_PREFIX}!"); +static const u8 sText_ThirdTypeAdded[] = _("{B_BUFF1} type was added to\n{B_DEF_NAME_WITH_PREFIX}!"); +static const u8 sText_FellForFeint[] = _("{B_DEF_NAME_WITH_PREFIX} fell for\nthe feint!"); +static const u8 sText_PokemonCannotUseMove[] = _("{B_ATK_NAME_WITH_PREFIX} cannot\nuse {B_CURRENT_MOVE}!"); +static const u8 sText_CoveredInPowder[] = _("{B_DEF_NAME_WITH_PREFIX} is covered in powder!"); +static const u8 sText_PowderExplodes[] = _("When the flame touched the powder\non the Pokémon, it exploded!"); +static const u8 sText_BelchCantUse[] = _("Belch cannot be used!\p"); +static const u8 sText_SpectralThiefSteal[] = _("{B_ATK_NAME_WITH_PREFIX} stole the target's\nboosted stats!"); +static const u8 sText_GravityGrounding[] = _("{B_DEF_NAME_WITH_PREFIX} can't stay airborne\nbecause of gravity!"); +static const u8 sText_MistyTerrainPreventsStatus[] = _("{B_DEF_NAME_WITH_PREFIX} surrounds itself\nwith a protective mist!"); +static const u8 sText_GrassyTerrainHeals[] = _("{B_ATK_NAME_WITH_PREFIX} is healed\nby the grassy terrain!"); +static const u8 sText_ElectricTerrainPreventsSleep[] = _("{B_DEF_NAME_WITH_PREFIX} surrounds itself\nwith electrified terrain!"); +static const u8 sText_PsychicTerrainPreventsPriority[] = _("{B_DEF_NAME_WITH_PREFIX} surrounds itself\nwith psychic terrain!"); +static const u8 sText_SafetyGooglesProtected[] = _("{B_DEF_NAME_WITH_PREFIX} is not affected\nthanks to its {B_LAST_ITEM}!"); +static const u8 sText_FlowerVeilProtected[] = _("{B_DEF_NAME_WITH_PREFIX} surrounded itself\nwith a veil of petals!"); +static const u8 sText_SweetVeilProtected[] = _("{B_DEF_NAME_WITH_PREFIX} surrounded itself\nwith a veil of sweetness!"); +static const u8 sText_AromaVeilProtected[] = _("{B_DEF_NAME_WITH_PREFIX} is protected\nby an aromatic veil!"); +static const u8 sText_CelebrateMessage[] = _("Congratulations, {B_PLAYER_NAME}!"); +static const u8 sText_UsedInstructedMove[] = _("{B_ATK_NAME_WITH_PREFIX} used the move\ninstructed by {B_BUFF1}!"); +static const u8 sText_LaserFocusMessage[] = _("{B_ATK_NAME_WITH_PREFIX}\nconcentrated intensely!"); +static const u8 sText_GemActivates[] = _("{B_LAST_ITEM} strengthened\n{B_ATK_NAME_WITH_PREFIX}'s power!"); +static const u8 sText_BerryDmgReducing[] = _("{B_LAST_ITEM} weakened the damage\nto {B_DEF_NAME_WITH_PREFIX}!"); +static const u8 sText_TargetAteItem[] = _("{B_DEF_NAME_WITH_PREFIX} ate its {B_LAST_ITEM}!"); +static const u8 sText_AirBalloonFloat[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} floats in the air\nwith its {B_LAST_ITEM}!"); +static const u8 sText_AirBalloonPop[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_LAST_ITEM} popped!"); +static const u8 sText_IncinerateBurn[] = _("{B_EFF_NAME_WITH_PREFIX}'s {B_LAST_ITEM}\nwas burnt up!"); +static const u8 sText_BugBite[] = _("{B_ATK_NAME_WITH_PREFIX} stole and ate\n{B_EFF_NAME_WITH_PREFIX}'s {B_LAST_ITEM}!"); +static const u8 sText_IllusionWoreOff[] = _("{B_DEF_NAME_WITH_PREFIX}'s Illusion wore off!"); +static const u8 sText_AttackerCuredTargetStatus[] = _("{B_ATK_NAME_WITH_PREFIX} cured\n{B_DEF_NAME_WITH_PREFIX}'s problem!"); +static const u8 sText_AttackerLostFireType[] = _("{B_ATK_NAME_WITH_PREFIX} burned itself out!"); +static const u8 sText_HealerCure[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_LAST_ABILITY}\ncured {B_SCR_ACTIVE_NAME_WITH_PREFIX}'s problem!"); +static const u8 sText_ReceiverAbilityTakeOver[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY}\nwas taken over!"); +static const u8 sText_PkmnAbsorbingPower[] = _("{B_ATK_NAME_WITH_PREFIX} is absorbing power!"); +static const u8 sText_NoOneWillBeAbleToRun[] = _("No one will be able to run away\nduring the next turn!"); +static const u8 sText_DestinyKnotActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} fell in love\nfrom the {B_LAST_ITEM}!"); +static const u8 sText_CloakedInAFreezingLight[] = _("{B_ATK_NAME_WITH_PREFIX} became cloaked\nin a freezing light!"); + +const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_CLOAKEDINAFREEZINGLIGHT - 12] = sText_CloakedInAFreezingLight, + [STRINGID_DESTINYKNOTACTIVATES - 12] = sText_DestinyKnotActivates, + [STRINGID_NOONEWILLBEABLETORUNAWAY - 12] = sText_NoOneWillBeAbleToRun, + [STRINGID_PKNMABSORBINGPOWER - 12] = sText_PkmnAbsorbingPower, + [STRINGID_RECEIVERABILITYTAKEOVER - 12] = sText_ReceiverAbilityTakeOver, + [STRINGID_SCRIPTINGABILITYSTATRAISE - 12] = sText_ScriptingAbilityRaisedStat, + [STRINGID_HEALERCURE - 12] = sText_HealerCure, + [STRINGID_ATTACKERLOSTFIRETYPE - 12] = sText_AttackerLostFireType, + [STRINGID_ATTACKERCUREDTARGETSTATUS - 12] = sText_AttackerCuredTargetStatus, + [STRINGID_ILLUSIONWOREOFF - 12] = sText_IllusionWoreOff, + [STRINGID_BUGBITE - 12] = sText_BugBite, + [STRINGID_INCINERATEBURN - 12] = sText_IncinerateBurn, + [STRINGID_AIRBALLOONPOP - 12] = sText_AirBalloonPop, + [STRINGID_AIRBALLOONFLOAT - 12] = sText_AirBalloonFloat, + [STRINGID_TARGETATEITEM - 12] = sText_TargetAteItem, + [STRINGID_BERRYDMGREDUCES - 12] = sText_BerryDmgReducing, + [STRINGID_GEMACTIVATES - 12] = sText_GemActivates, + [STRINGID_LASERFOCUS - 12] = sText_LaserFocusMessage, + [STRINGID_THROATCHOPENDS - 12] = sText_ThroatChopEnds, + [STRINGID_PKMNCANTUSEMOVETHROATCHOP - 12] = sText_PkmnCantUseMoveThroatChop, + [STRINGID_USEDINSTRUCTEDMOVE - 12] = sText_UsedInstructedMove, + [STRINGID_CELEBRATEMESSAGE - 12] = sText_CelebrateMessage, + [STRINGID_AROMAVEILPROTECTED - 12] = sText_AromaVeilProtected, + [STRINGID_SWEETVEILPROTECTED - 12] = sText_SweetVeilProtected, + [STRINGID_FLOWERVEILPROTECTED - 12] = sText_FlowerVeilProtected, + [STRINGID_SAFETYGOOGLESPROTECTED - 12] = sText_SafetyGooglesProtected, + [STRINGID_SPECTRALTHIEFSTEAL - 12] = sText_SpectralThiefSteal, + [STRINGID_BELCHCANTSELECT - 12] = sText_BelchCantUse, [STRINGID_TRAINER1LOSETEXT - 12] = sText_Trainer1LoseText, [STRINGID_PKMNGAINEDEXP - 12] = sText_PkmnGainedEXP, [STRINGID_PKMNGREWTOLV - 12] = sText_PkmnGrewToLv, @@ -890,6 +1076,177 @@ const u8 * const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_PKMNBOXLANETTESPCFULL - 12] = gText_PkmnTransferredLanettesPCBoxFull, [STRINGID_TRAINER1WINTEXT - 12] = sText_Trainer1WinText, [STRINGID_TRAINER2WINTEXT - 12] = sText_Trainer2WinText, + [STRINGID_ENDUREDSTURDY - 12] = sText_EnduredViaSturdy, + [STRINGID_POWERHERB - 12] = sText_PowerHerbActivation, + [STRINGID_HURTBYITEM - 12] = sText_HurtByItem, + [STRINGID_PSNBYITEM - 12] = sText_BadlyPoisonedByItem, + [STRINGID_BRNBYITEM - 12] = sText_BurnedByItem, + [STRINGID_DEFABILITYIN - 12] = sText_TargetAbilityActivates, + [STRINGID_GRAVITYINTENSIFIED - 12] = sText_GravityIntensified, + [STRINGID_TARGETIDENTIFIED - 12] = sText_TargetIdentified, + [STRINGID_TARGETWOKEUP - 12] = sText_TargetWokeUp, + [STRINGID_PKMNSTOLEANDATEITEM - 12] = sText_PkmnStoleAndAteItem, + [STRINGID_TAILWINDBLEW - 12] = sText_TailWindBlew, + [STRINGID_PKMNWENTBACK - 12] = sText_PkmnWentBack, + [STRINGID_PKMNCANTUSEITEMSANYMORE - 12] = sText_PkmnCantUseItemsAnymore, + [STRINGID_PKMNFLUNG - 12] = sText_PkmnFlung, + [STRINGID_PKMNPREVENTEDFROMHEALING - 12] = sText_PkmnPreventedFromHealing, + [STRINGID_PKMNSWITCHEDATKANDDEF - 12] = sText_PkmnSwitchedAtkAndDef, + [STRINGID_PKMNSABILITYSUPPRESSED - 12] = sText_PkmnsAbilitySuppressed, + [STRINGID_SHIELDEDFROMCRITICALHITS - 12] = sText_ShieldedFromCriticalHits, + [STRINGID_SWITCHEDATKANDSPATK - 12] = sText_SwitchedAtkAndSpAtk, + [STRINGID_SWITCHEDDEFANDSPDEF - 12] = sText_SwitchedDefAndSpDef, + [STRINGID_PKMNACQUIREDABILITY - 12] = sText_PkmnAcquiredAbility, + [STRINGID_POISONSPIKESSCATTERED - 12] = sText_PoisonSpikesScattered, + [STRINGID_PKMNSWITCHEDSTATCHANGES - 12] = sText_PkmnSwitchedStatChanges, + [STRINGID_PKMNSURROUNDEDWITHVEILOFWATER - 12] = sText_PkmnSurroundedWithVeilOfWater, + [STRINGID_PKMNLEVITATEDONELECTROMAGNETISM - 12] = sText_PkmnLevitatedOnElectromagnetism, + [STRINGID_PKMNTWISTEDDIMENSIONS - 12] = sText_PkmnTwistedDimensions, + [STRINGID_POINTEDSTONESFLOAT - 12] = sText_PointedStonesFloat, + [STRINGID_CLOAKEDINMYSTICALMOONLIGHT - 12] = sText_CloakedInMysticalMoonlight, + [STRINGID_TRAPPERBYSWIRLINGMAGMA - 12] = sText_TrappedBySwirlingMagma, + [STRINGID_VANISHEDINSTANTLY - 12] = sText_VanishedInstantly, + [STRINGID_PROTECTEDTEAM - 12] = sText_ProtectedTeam, + [STRINGID_SHAREDITSGUARD - 12] = sText_SharedItsGuard, + [STRINGID_SHAREDITSPOWER - 12] = sText_SharedItsPower, + [STRINGID_SWAPSDEFANDSPDEFOFALLPOKEMON - 12] = sText_SwapsDefAndSpDefOfAllPkmn, + [STRINGID_BECAMENIMBLE - 12] = sText_BecameNimble, + [STRINGID_HURLEDINTOTHEAIR - 12] = sText_HurledIntoTheAir, + [STRINGID_HELDITEMSLOSEEFFECTS - 12] = sText_HeldItemsLoseEffects, + [STRINGID_FELLSTRAIGHTDOWN - 12] = sText_FellStraightDown, + [STRINGID_TRANSFORMEDINTOWATERTYPE - 12] = sText_TransformedIntoWaterType, + [STRINGID_PKMNACQUIREDSIMPLE - 12] = sText_PkmnAcquiredSimple, + [STRINGID_EMPTYSTRING5 - 12] = sText_EmptyString4, + [STRINGID_KINDOFFER - 12] = sText_KindOffer, + [STRINGID_RESETSTARGETSSTATLEVELS - 12] = sText_ResetsTargetsStatLevels, + [STRINGID_EMPTYSTRING6 - 12] = sText_EmptyString4, + [STRINGID_ALLYSWITCHPOSITION - 12] = sText_AllySwitchPosition, + [STRINGID_RESTORETARGETSHEALTH - 12] = sText_RestoreTargetsHealth, + [STRINGID_TOOKPJMNINTOTHESKY - 12] = sText_TookPkmnIntoTheSky, + [STRINGID_FREEDFROMSKYDROP - 12] = sText_FreedFromSkyDrop, + [STRINGID_POSTPONETARGETMOVE - 12] = sText_PostponeTargetMove, + [STRINGID_REFLECTTARGETSTYPE - 12] = sText_ReflectTargetsType, + [STRINGID_TRANSFERHELDITEM - 12] = sText_TransferHeldItem, + [STRINGID_EMBARGOENDS - 12] = sText_EmbargoEnds, + [STRINGID_ELECTROMAGNETISM - 12] = sText_Electromagnetism, + [STRINGID_BUFFERENDS - 12] = sText_BufferEnds, + [STRINGID_TELEKINESISENDS - 12] = sText_TelekinesisEnds, + [STRINGID_TAILWINDENDS - 12] = sText_TailwindEnds, + [STRINGID_LUCKYCHANTENDS - 12] = sText_LuckyChantEnds, + [STRINGID_TRICKROOMENDS - 12] = sText_TrickRoomEnds, + [STRINGID_WONDERROOMENDS - 12] = sText_WonderRoomEnds, + [STRINGID_MAGICROOMENDS - 12] = sText_MagicRoomEnds, + [STRINGID_MUDSPORTENDS - 12] = sText_MudSportEnds, + [STRINGID_WATERSPORTENDS - 12] = sText_WaterSportEnds, + [STRINGID_GRAVITYENDS - 12] = sText_GravityEnds, + [STRINGID_AQUARINGHEAL - 12] = sText_AquaRingHeal, + [STRINGID_AURORAVEILENDS - 12] = sText_AuroraVeilEnds, + [STRINGID_ELECTRICTERRAINENDS - 12] = sText_ElectricTerrainEnds, + [STRINGID_MISTYTERRAINENDS - 12] = sText_MistyTerrainEnds, + [STRINGID_PSYCHICTERRAINENDS - 12] = sText_PsychicTerrainEnds, + [STRINGID_GRASSYTERRAINENDS - 12] = sText_GrassyTerrainEnds, + [STRINGID_TARGETABILITYSTATRAISE - 12] = sText_TargetAbilityRaisedStat, + [STRINGID_ANGRYPOINTACTIVATES - 12] = sText_AngryPointActivates, + [STRINGID_ATTACKERABILITYSTATRAISE - 12] = sText_AttackerAbilityRaisedStat, + [STRINGID_POISONHEALHPUP - 12] = sText_PoisonHealHpUp, + [STRINGID_BADDREAMSDMG - 12] = sText_BadDreamsDmg, + [STRINGID_MOLDBREAKERENTERS - 12] = sText_MoldBreakerEnters, + [STRINGID_TERAVOLTENTERS - 12] = sText_TeravoltEnters, + [STRINGID_TURBOBLAZEENTERS - 12] = sText_TurboblazeEnters, + [STRINGID_SLOWSTARTENTERS - 12] = sText_SlowStartEnters, + [STRINGID_SLOWSTARTEND - 12] = sText_SlowStartEnd, + [STRINGID_SOLARPOWERHPDROP - 12] = sText_SolarPowerHpDrop, + [STRINGID_AFTERMATHDMG - 12] = sText_AftermathDmg, + [STRINGID_ANTICIPATIONACTIVATES - 12] = sText_AnticipationActivates, + [STRINGID_FOREWARNACTIVATES - 12] = sText_ForewarnActivates, + [STRINGID_ICEBODYHPGAIN - 12] = sText_IceBodyHpGain, + [STRINGID_SNOWWARNINGHAIL - 12] = sText_SnowWarningHail, + [STRINGID_FRISKACTIVATES - 12] = sText_FriskActivates, + [STRINGID_UNNERVEENTERS - 12] = sText_UnnerveEnters, + [STRINGID_HARVESTBERRY - 12] = sText_HarvestBerry, + [STRINGID_MOXIEATKRISE - 12] = sText_MoxieAtkRise, + [STRINGID_MAGICBOUNCEACTIVATES - 12] = sText_MagicBounceActivates, + [STRINGID_PROTEANTYPECHANGE - 12] = sText_ProteanTypeChange, + [STRINGID_SYMBIOSISITEMPASS - 12] = sText_SymbiosisItemPass, + [STRINGID_STEALTHROCKDMG - 12] = sText_StealthRockDmg, + [STRINGID_TOXICSPIKESABSORBED - 12] = sText_ToxicSpikesAbsorbed, + [STRINGID_TOXICSPIKESPOISONED - 12] = sText_ToxicSpikesPoisoned, + [STRINGID_STICKYWEBSWITCHIN - 12] = sText_StickyWebSwitchIn, + [STRINGID_HEALINGWISHCAMETRUE - 12] = sText_HealingWishCameTrue, + [STRINGID_HEALINGWISHHEALED - 12] = sText_HealingWishHealed, + [STRINGID_LUNARDANCECAMETRUE - 12] = sText_LunarDanceCameTrue, + [STRINGID_CUSEDBODYDISABLED - 12] = sText_CursedBodyDisabled, + [STRINGID_ATTACKERACQUIREDABILITY - 12] = sText_AttackerAquiredAbility, + [STRINGID_TARGETABILITYSTATLOWER - 12] = sText_TargetAbilityLoweredStat, + [STRINGID_TARGETSTATWONTGOHIGHER - 12] = sText_TargetStatWontGoHigher, + [STRINGID_PKMNMOVEBOUNCEDABILITY - 12] = sText_PkmnMoveBouncedViaAbility, + [STRINGID_IMPOSTERTRANSFORM - 12] = sText_ImposterTransform, + [STRINGID_ASSAULTVESTDOESNTALLOW - 12] = sText_AssaultVestDoesntAllow, + [STRINGID_GRAVITYPREVENTSUSAGE - 12] = sText_GravityPreventsUsage, + [STRINGID_HEALBLOCKPREVENTSUSAGE - 12] = sText_HealBlockPreventsUsage, + [STRINGID_NOTDONEYET - 12] = sText_NotDoneYet, + [STRINGID_STICKYWEBUSED - 12] = sText_StickyWebUsed, + [STRINGID_QUASHSUCCESS - 12] = sText_QuashSuccess, + [STRINGID_PKMNBLEWAWAYTOXICSPIKES - 12] = sText_PkmnBlewAwayToxicSpikes, + [STRINGID_PKMNBLEWAWAYSTICKYWEB - 12] = sText_PkmnBlewAwayStickyWeb, + [STRINGID_PKMNBLEWAWAYSTEALTHROCK - 12] = sText_PkmnBlewAwayStealthRock, + [STRINGID_IONDELUGEON - 12] = sText_IonDelugeOn, + [STRINGID_TOPSYTURVYSWITCHEDSTATS - 12] = sText_TopsyTurvySwitchedStats, + [STRINGID_TERRAINBECOMESMISTY - 12] = sText_TerrainBecomesMisty, + [STRINGID_TERRAINBECOMESGRASSY - 12] = sText_TerrainBecomesGrassy, + [STRINGID_TERRAINBECOMESELECTRIC - 12] = sText_TerrainBecomesElectric, + [STRINGID_TERRAINBECOMESPSYCHIC - 12] = sText_TerrainBecomesPsychic, + [STRINGID_TARGETELECTRIFIED - 12] = sText_TargetElectrified, + [STRINGID_MEGAEVOREACTING - 12] = sText_MegaEvoReacting, + [STRINGID_MEGAEVOEVOLVED - 12] = sText_MegaEvoEvolved, + [STRINGID_DRASTICALLY - 12] = sText_drastically, + [STRINGID_SEVERELY - 12] = sText_severely, + [STRINGID_INFESTATION - 12] = sText_Infestation, + [STRINGID_NOEFFECTONTARGET - 12] = sText_NoEffectOnTarget, + [STRINGID_BURSTINGFLAMESHIT - 12] = sText_BurstingFlames, + [STRINGID_BESTOWITEMGIVING - 12] = sText_BestowItemGiving, + [STRINGID_THIRDTYPEADDED - 12] = sText_ThirdTypeAdded, + [STRINGID_FELLFORFEINT - 12] = sText_FellForFeint, + [STRINGID_POKEMONCANNOTUSEMOVE - 12] = sText_PokemonCannotUseMove, + [STRINGID_COVEREDINPOWDER - 12] = sText_CoveredInPowder, + [STRINGID_POWDEREXPLODES - 12] = sText_PowderExplodes, + [STRINGID_GRAVITYGROUNDING - 12] = sText_GravityGrounding, + [STRINGID_MISTYTERRAINPREVENTS - 12] = sText_MistyTerrainPreventsStatus, + [STRINGID_GRASSYTERRAINHEALS - 12] = sText_GrassyTerrainHeals, + [STRINGID_ELECTRICTERRAINPREVENTS - 12] = sText_ElectricTerrainPreventsSleep, + [STRINGID_PSYCHICTERRAINPREVENTS - 12] = sText_PsychicTerrainPreventsPriority, +}; + +const u16 gTerrainStringIds[] = +{ + STRINGID_TERRAINBECOMESMISTY, STRINGID_TERRAINBECOMESGRASSY, STRINGID_TERRAINBECOMESELECTRIC, STRINGID_TERRAINBECOMESPSYCHIC +}; + +const u16 gTerrainPreventsStringIds[] = +{ + STRINGID_MISTYTERRAINPREVENTS, STRINGID_ELECTRICTERRAINPREVENTS, STRINGID_PSYCHICTERRAINPREVENTS +}; + +const u16 gMagicCoatBounceStringIds[] = +{ + STRINGID_PKMNMOVEBOUNCED, STRINGID_PKMNMOVEBOUNCEDABILITY +}; + +const u16 gHealingWishStringIds[] = +{ + STRINGID_HEALINGWISHCAMETRUE, STRINGID_LUNARDANCECAMETRUE +}; + +const u16 gDmgHazardsStringIds[] = +{ + STRINGID_PKMNHURTBYSPIKES, STRINGID_STEALTHROCKDMG +}; + +const u16 gSwitchInAbilityStringIds[] = +{ + STRINGID_MOLDBREAKERENTERS, STRINGID_TERAVOLTENTERS, STRINGID_TURBOBLAZEENTERS, + STRINGID_SLOWSTARTENTERS, STRINGID_UNNERVEENTERS, STRINGID_ANTICIPATIONACTIVATES, + STRINGID_FOREWARNACTIVATES }; const u16 gMissStringIds[] = @@ -933,7 +1290,7 @@ const u16 gRainContinuesStringIds[] = const u16 gProtectLikeUsedStringIds[] = { - STRINGID_PKMNPROTECTEDITSELF2, STRINGID_PKMNBRACEDITSELF, STRINGID_BUTITFAILED + STRINGID_PKMNPROTECTEDITSELF2, STRINGID_PKMNBRACEDITSELF, STRINGID_BUTITFAILED, STRINGID_PROTECTEDTEAM, }; const u16 gReflectLightScreenSafeguardStringIds[] = @@ -992,14 +1349,17 @@ const u16 gStatDownStringIds[] = // Index read from sTWOTURN_STRINGID const u16 gFirstTurnOfTwoStringIds[] = { - STRINGID_PKMNWHIPPEDWHIRLWIND, // MOVE_RAZOR_WIND - STRINGID_PKMNTOOKSUNLIGHT, // MOVE_SOLAR_BEAM - STRINGID_PKMNLOWEREDHEAD, // MOVE_SKULL_BASH - STRINGID_PKMNISGLOWING, // MOVE_SKY_ATTACK - STRINGID_PKMNFLEWHIGH, // MOVE_FLY - STRINGID_PKMNDUGHOLE, // MOVE_DIG - STRINGID_PKMNHIDUNDERWATER, // MOVE_DIVE - STRINGID_PKMNSPRANGUP // MOVE_BOUNCE + STRINGID_PKMNWHIPPEDWHIRLWIND, // MOVE_RAZOR_WIND + STRINGID_PKMNTOOKSUNLIGHT, // MOVE_SOLAR_BEAM + STRINGID_PKMNLOWEREDHEAD, // MOVE_SKULL_BASH + STRINGID_PKMNISGLOWING, // MOVE_SKY_ATTACK + STRINGID_PKMNFLEWHIGH, // MOVE_FLY + STRINGID_PKMNDUGHOLE, // MOVE_DIG + STRINGID_PKMNHIDUNDERWATER, // MOVE_DIVE + STRINGID_PKMNSPRANGUP, // MOVE_BOUNCE + STRINGID_VANISHEDINSTANTLY, // MOVE_PHANTOM_FORCE + STRINGID_PKNMABSORBINGPOWER, // MOVE_GEOMANCY + STRINGID_CLOAKEDINAFREEZINGLIGHT, // MOVE_FREEZE_SHOCK }; // Index copied from move's index in gTrappingMoves @@ -1010,7 +1370,8 @@ const u16 gWrappedStringIds[] = STRINGID_PKMNTRAPPEDINVORTEX, // MOVE_FIRE_SPIN STRINGID_PKMNCLAMPED, // MOVE_CLAMP STRINGID_PKMNTRAPPEDINVORTEX, // MOVE_WHIRLPOOL - STRINGID_PKMNTRAPPEDBYSANDTOMB // MOVE_SAND_TOMB + STRINGID_PKMNTRAPPEDBYSANDTOMB,// MOVE_SAND_TOMB + STRINGID_INFESTATION, // MOVE_INFESTATION }; const u16 gMistUsedStringIds[] = @@ -1180,20 +1541,27 @@ const u16 gCaughtMonStringIds[] = const u16 gTrappingMoves[] = { - MOVE_BIND, - MOVE_WRAP, - MOVE_FIRE_SPIN, - MOVE_CLAMP, - MOVE_WHIRLPOOL, - MOVE_SAND_TOMB, - 0xFFFF + MOVE_BIND, MOVE_WRAP, MOVE_FIRE_SPIN, MOVE_CLAMP, MOVE_WHIRLPOOL, MOVE_SAND_TOMB, MOVE_INFESTATION, 0xFFFF +}; + +const u16 gRoomsStringIds[] = +{ + STRINGID_PKMNTWISTEDDIMENSIONS, STRINGID_TRICKROOMENDS, + STRINGID_SWAPSDEFANDSPDEFOFALLPOKEMON, STRINGID_WONDERROOMENDS, + STRINGID_HELDITEMSLOSEEFFECTS, STRINGID_MAGICROOMENDS, + STRINGID_EMPTYSTRING3 +}; + +const u16 gStatusConditionsStringIds[] = +{ + STRINGID_PKMNWASPOISONED, STRINGID_PKMNBADLYPOISONED, STRINGID_PKMNWASBURNED, STRINGID_PKMNWASPARALYZED, STRINGID_PKMNFELLASLEEP }; const u8 gText_PkmnIsEvolving[] = _("What?\n{STR_VAR_1} is evolving!"); const u8 gText_CongratsPkmnEvolved[] = _("Congratulations! Your {STR_VAR_1}\nevolved into {STR_VAR_2}!{WAIT_SE}\p"); const u8 gText_PkmnStoppedEvolving[] = _("Huh? {STR_VAR_1}\nstopped evolving!\p"); const u8 gText_EllipsisQuestionMark[] = _("……?\p"); -const u8 gText_WhatWillPkmnDo[] = _("What will\n{B_ACTIVE_NAME_WITH_PREFIX} do?"); +const u8 gText_WhatWillPkmnDo[] = _("What will\n{B_ACTIVE_NAME2} do?"); const u8 gText_WhatWillPkmnDo2[] = _("What will\n{B_PLAYER_NAME} do?"); const u8 gText_WhatWillWallyDo[] = _("What will\nWALLY do?"); const u8 gText_LinkStandby[] = _("{PAUSE 16}Link standby…"); @@ -1211,16 +1579,10 @@ const u8 gText_BattleSwitchWhich3[] = _("{UP_ARROW}"); const u8 gText_BattleSwitchWhich4[] = _("{ESCAPE 4}"); const u8 gText_BattleSwitchWhich5[] = _("-"); -static const u8 sText_HP[] = _("HP"); -static const u8 sText_Attack[] = _("ATTACK"); -static const u8 sText_Defense[] = _("DEFENSE"); -static const u8 sText_SpAtk[] = _("SP. ATK"); -static const u8 sText_SpDef[] = _("SP. DEF"); - const u8 * const gStatNamesTable2[] = { - sText_HP, sText_SpAtk, sText_Attack, - sText_SpDef, sText_Defense, sText_Speed + gText_HP3, gText_SpAtk, gText_Attack, + gText_SpDef, gText_Defense, gText_Speed }; const u8 gText_SafariBalls[] = _("{HIGHLIGHT DARK_GREY}SAFARI BALLS"); @@ -1247,7 +1609,6 @@ const u8 gText_Draw[] = _("{HIGHLIGHT TRANSPARENT}Draw"); static const u8 sText_SpaceIs[] = _(" is"); static const u8 sText_ApostropheS[] = _("'s"); -// For displaying names of invalid moves static const u8 sATypeMove_Table[][NUMBER_OF_MON_TYPES - 1] = { [TYPE_NORMAL] = _("a NORMAL move"), @@ -1267,7 +1628,8 @@ static const u8 sATypeMove_Table[][NUMBER_OF_MON_TYPES - 1] = [TYPE_PSYCHIC] = _("a PSYCHIC move"), [TYPE_ICE] = _("an ICE move"), [TYPE_DRAGON] = _("a DRAGON move"), - [TYPE_DARK] = _("a DARK move") + [TYPE_DARK] = _("a DARK move"), + [TYPE_FAIRY] = _("a FAIRY move"), }; const u8 gText_BattleTourney[] = _("BATTLE TOURNEY"); @@ -1310,9 +1672,9 @@ static const u8 sText_PkmnEagerForMore[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is const u16 gBattlePalaceFlavorTextTable[] = { - STRINGID_GLINTAPPEARSINEYE, + STRINGID_GLINTAPPEARSINEYE, STRINGID_PKMNGETTINGINTOPOSITION, - STRINGID_PKMNBEGANGROWLINGDEEPLY, + STRINGID_PKMNBEGANGROWLINGDEEPLY, STRINGID_PKMNEAGERFORMORE }; @@ -1353,6 +1715,10 @@ const u8 gText_RecordBattleToPass[] = _("Would you like to record your battle\no const u8 gText_BattleRecordedOnPass[] = _("{B_PLAYER_NAME}'s battle result was recorded\non the FRONTIER PASS."); static const u8 sText_LinkTrainerWantsToBattlePause[] = _("{B_LINK_OPPONENT1_NAME}\nwants to battle!{PAUSE 49}"); static const u8 sText_TwoLinkTrainersWantToBattlePause[] = _("{B_LINK_OPPONENT1_NAME} and {B_LINK_OPPONENT2_NAME}\nwant to battle!{PAUSE 49}"); +static const u8 sText_Your1[] = _("Your"); +static const u8 sText_Opposing1[] = _("The opposing"); +static const u8 sText_Your2[] = _("your"); +static const u8 sText_Opposing2[] = _("the opposing"); // This is four lists of moves which use a different attack string in Japanese // to the default. See the documentation for ChooseTypeOfMoveUsedString for more detail. @@ -1984,14 +2350,14 @@ void BufferStringBattle(u16 stringID) s32 i; const u8 *stringPtr = NULL; - gBattleMsgDataPtr = (struct BattleMsgData*)(&gBattleBufferA[gActiveBattler][4]); + gBattleMsgDataPtr = (struct BattleMsgData*)(&gBattleResources->bufferA[gActiveBattler][4]); gLastUsedItem = gBattleMsgDataPtr->lastItem; gLastUsedAbility = gBattleMsgDataPtr->lastAbility; gBattleScripting.battler = gBattleMsgDataPtr->scrActive; - *(&gBattleStruct->field_52) = gBattleMsgDataPtr->unk1605E; - *(&gBattleStruct->hpScale) = gBattleMsgDataPtr->hpScale; + gBattleStruct->field_52 = gBattleMsgDataPtr->unk1605E; + gBattleStruct->hpScale = gBattleMsgDataPtr->hpScale; gPotentialItemEffectBattler = gBattleMsgDataPtr->itemEffectBattler; - *(&gBattleStruct->stringMoveType) = gBattleMsgDataPtr->moveType; + gBattleStruct->stringMoveType = gBattleMsgDataPtr->moveType; for (i = 0; i < MAX_BATTLERS_COUNT; i++) { @@ -2034,7 +2400,9 @@ void BufferStringBattle(u16 stringID) } else { - if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) + if (BATTLE_TWO_VS_ONE_OPPONENT) + stringPtr = sText_Trainer1WantsToBattle; + else if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER)) stringPtr = sText_TwoTrainersWantToBattle; else if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) stringPtr = sText_TwoTrainersWantToBattle; @@ -2077,7 +2445,9 @@ void BufferStringBattle(u16 stringID) { if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { - if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + if (BATTLE_TWO_VS_ONE_OPPONENT) + stringPtr = sText_Trainer1SentOutTwoPkmn; + else if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) stringPtr = sText_TwoTrainersSentPkmn; else if (gBattleTypeFlags & BATTLE_TYPE_x800000) stringPtr = sText_TwoTrainersSentPkmn; @@ -2176,14 +2546,11 @@ void BufferStringBattle(u16 stringID) } break; case STRINGID_USEDMOVE: // pokemon used a move msg - ChooseMoveUsedParticle(gBattleTextBuff1); // buff1 doesn't appear in the string, leftover from japanese move names - if (gBattleMsgDataPtr->currentMove >= MOVES_COUNT) - StringCopy(gBattleTextBuff2, sATypeMove_Table[*(&gBattleStruct->stringMoveType)]); + StringCopy(gBattleTextBuff3, sATypeMove_Table[*(&gBattleStruct->stringMoveType)]); else - StringCopy(gBattleTextBuff2, gMoveNames[gBattleMsgDataPtr->currentMove]); + StringCopy(gBattleTextBuff3, gMoveNames[gBattleMsgDataPtr->currentMove]); - ChooseTypeOfMoveUsedString(gBattleTextBuff2); stringPtr = sText_AttackerUsedX; break; case STRINGID_BATTLEEND: // battle end @@ -2255,6 +2622,9 @@ void BufferStringBattle(u16 stringID) } } break; + case STRINGID_TRAINERSLIDE: + stringPtr = gBattleStruct->trainerSlideMsg; + break; default: // load a string from the table if (stringID >= BATTLESTRINGS_COUNT + BATTLESTRINGS_ID_ADDER) { @@ -2307,7 +2677,23 @@ static const u8* TryGetStatusString(u8 *src) return NULL; } -#define HANDLE_NICKNAME_STRING_CASE(battlerId, monIndex) \ +static void GetBattlerNick(u32 battlerId, u8 *dst) +{ + struct Pokemon *mon, *illusionMon; + + if (GET_BATTLER_SIDE(battlerId) == B_SIDE_PLAYER) + mon = &gPlayerParty[gBattlerPartyIndexes[battlerId]]; + else + mon = &gEnemyParty[gBattlerPartyIndexes[battlerId]]; + + illusionMon = GetIllusionMonPtr(battlerId); + if (illusionMon != NULL) + mon = illusionMon; + GetMonData(mon, MON_DATA_NICKNAME, dst); + StringGetEnd10(dst); +} + +#define HANDLE_NICKNAME_STRING_CASE(battlerId) \ if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) \ { \ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) \ @@ -2320,15 +2706,144 @@ static const u8* TryGetStatusString(u8 *src) dstID++; \ toCpy++; \ } \ - GetMonData(&gEnemyParty[monIndex], MON_DATA_NICKNAME, text); \ } \ - else \ - { \ - GetMonData(&gPlayerParty[monIndex], MON_DATA_NICKNAME, text); \ - } \ - StringGetEnd10(text); \ + GetBattlerNick(battlerId, text); \ toCpy = text; +static const u8 *BattleStringGetOpponentNameByTrainerId(u16 trainerId, u8 *text, u8 multiplayerId, u8 battlerId) +{ + const u8 *toCpy; + + if (gBattleTypeFlags & BATTLE_TYPE_SECRET_BASE) + { + u32 i; + for (i = 0; i < ARRAY_COUNT(gBattleResources->secretBase->trainerName); i++) + text[i] = gBattleResources->secretBase->trainerName[i]; + text[i] = EOS; + ConvertInternationalString(text, gBattleResources->secretBase->language); + toCpy = text; + } + else if (trainerId == TRAINER_UNION_ROOM) + { + toCpy = gLinkPlayers[multiplayerId ^ BIT_SIDE].name; + } + else if (trainerId == TRAINER_LINK_OPPONENT) + { + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + toCpy = gLinkPlayers[GetBattlerMultiplayerId(battlerId)].name; + else + toCpy = gLinkPlayers[GetBattlerMultiplayerId(battlerId) & BIT_SIDE].name; + } + else if (trainerId == TRAINER_FRONTIER_BRAIN) + { + CopyFrontierBrainTrainerName(text); + toCpy = text; + } + else if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) + { + GetFrontierTrainerName(text, trainerId); + toCpy = text; + } + else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) + { + GetTrainerHillTrainerName(text, trainerId); + toCpy = text; + } + else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) + { + GetEreaderTrainerName(text); + toCpy = text; + } + else + { + toCpy = gTrainers[trainerId].trainerName; + } + + return toCpy; +} + +static const u8 *BattleStringGetOpponentName(u8 *text, u8 multiplayerId, u8 battlerId) +{ + const u8 *toCpy; + + switch (GetBattlerPosition(battlerId)) + { + case B_POSITION_OPPONENT_LEFT: + toCpy = BattleStringGetOpponentNameByTrainerId(gTrainerBattleOpponent_A, text, multiplayerId, battlerId); + break; + case B_POSITION_OPPONENT_RIGHT: + if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_MULTI) && !BATTLE_TWO_VS_ONE_OPPONENT) + toCpy = BattleStringGetOpponentNameByTrainerId(gTrainerBattleOpponent_B, text, multiplayerId, battlerId); + else + toCpy = BattleStringGetOpponentNameByTrainerId(gTrainerBattleOpponent_A, text, multiplayerId, battlerId); + break; + } + + return toCpy; +} + +static const u8 *BattleStringGetPlayerName(u8 *text, u8 battlerId) +{ + const u8 *toCpy; + + switch (GetBattlerPosition(battlerId)) + { + case B_POSITION_PLAYER_LEFT: + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) + toCpy = gLinkPlayers[0].name; + else + toCpy = gSaveBlock2Ptr->playerName; + break; + case B_POSITION_PLAYER_RIGHT: + if (gBattleTypeFlags & BATTLE_TYPE_LINK && gBattleTypeFlags & (BATTLE_TYPE_RECORDED | BATTLE_TYPE_MULTI)) + { + toCpy = gLinkPlayers[2].name; + } + else if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) + { + GetFrontierTrainerName(text, gPartnerTrainerId); + toCpy = text; + } + else + { + toCpy = gSaveBlock2Ptr->playerName; + } + break; + } + + return toCpy; +} + +static const u8 *BattleStringGetTrainerName(u8 *text, u8 multiplayerId, u8 battlerId) +{ + if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) + return BattleStringGetPlayerName(text, battlerId); + else + return BattleStringGetOpponentName(text, multiplayerId, battlerId); +} + +static const u8 *BattleStringGetOpponentClassByTrainerId(u16 trainerId) +{ + const u8 *toCpy; + + if (gBattleTypeFlags & BATTLE_TYPE_SECRET_BASE) + toCpy = gTrainerClassNames[GetSecretBaseTrainerClass()]; + else if (trainerId == TRAINER_UNION_ROOM) + toCpy = gTrainerClassNames[GetUnionRoomTrainerClass()]; + else if (trainerId == TRAINER_FRONTIER_BRAIN) + toCpy = gTrainerClassNames[GetFrontierBrainTrainerClass()]; + else if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) + toCpy = gTrainerClassNames[GetFrontierOpponentClass(trainerId)]; + else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) + toCpy = gTrainerClassNames[GetTrainerHillOpponentClass(trainerId)]; + else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) + toCpy = gTrainerClassNames[GetEreaderTrainerClassId()]; + else + toCpy = gTrainerClassNames[gTrainers[trainerId].trainerClass]; + + return toCpy; +} + u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) { u32 dstID = 0; // if they used dstID, why not use srcID as well? @@ -2344,6 +2859,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) while (*src != EOS) { + toCpy = NULL; if (*src == PLACEHOLDER_BEGIN) { src++; @@ -2390,80 +2906,73 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) toCpy = gStringVar3; break; case B_TXT_PLAYER_MON1_NAME: // first player poke name - GetMonData(&gPlayerParty[gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]], - MON_DATA_NICKNAME, text); - StringGetEnd10(text); + GetBattlerNick(GetBattlerAtPosition(B_POSITION_PLAYER_LEFT), text); toCpy = text; break; case B_TXT_OPPONENT_MON1_NAME: // first enemy poke name - GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)]], - MON_DATA_NICKNAME, text); - StringGetEnd10(text); + GetBattlerNick(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), text); toCpy = text; break; case B_TXT_PLAYER_MON2_NAME: // second player poke name - GetMonData(&gPlayerParty[gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT)]], - MON_DATA_NICKNAME, text); - StringGetEnd10(text); + GetBattlerNick(GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT), text); toCpy = text; break; case B_TXT_OPPONENT_MON2_NAME: // second enemy poke name - GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)]], - MON_DATA_NICKNAME, text); - StringGetEnd10(text); + GetBattlerNick(GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT), text); toCpy = text; break; case B_TXT_LINK_PLAYER_MON1_NAME: // link first player poke name - GetMonData(&gPlayerParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerId].id]], - MON_DATA_NICKNAME, text); - StringGetEnd10(text); + GetBattlerNick(gLinkPlayers[multiplayerId].id, text); toCpy = text; break; case B_TXT_LINK_OPPONENT_MON1_NAME: // link first opponent poke name - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerId].id ^ 1]], - MON_DATA_NICKNAME, text); - StringGetEnd10(text); + GetBattlerNick(gLinkPlayers[multiplayerId].id ^ 1, text); toCpy = text; break; case B_TXT_LINK_PLAYER_MON2_NAME: // link second player poke name - GetMonData(&gPlayerParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerId].id ^ 2]], - MON_DATA_NICKNAME, text); - StringGetEnd10(text); + GetBattlerNick(gLinkPlayers[multiplayerId].id ^ 2, text); toCpy = text; break; case B_TXT_LINK_OPPONENT_MON2_NAME: // link second opponent poke name - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerId].id ^ 3]], - MON_DATA_NICKNAME, text); - StringGetEnd10(text); + GetBattlerNick(gLinkPlayers[multiplayerId].id ^ 3, text); toCpy = text; break; - case B_TXT_ATK_NAME_WITH_PREFIX_MON1: // attacker name with prefix, only battlerId 0/1 - HANDLE_NICKNAME_STRING_CASE(gBattlerAttacker, - gBattlerPartyIndexes[GetBattlerAtPosition(GET_BATTLER_SIDE(gBattlerAttacker))]) + case B_TXT_ATK_NAME_WITH_PREFIX_MON1: // Unused, to change into sth else. break; case B_TXT_ATK_PARTNER_NAME: // attacker partner name - if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) - GetMonData(&gPlayerParty[gBattlerPartyIndexes[GetBattlerAtPosition(GET_BATTLER_SIDE(gBattlerAttacker)) + 2]], MON_DATA_NICKNAME, text); - else - GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetBattlerAtPosition(GET_BATTLER_SIDE(gBattlerAttacker)) + 2]], MON_DATA_NICKNAME, text); - - StringGetEnd10(text); + GetBattlerNick(BATTLE_PARTNER(gBattlerAttacker), text); toCpy = text; break; case B_TXT_ATK_NAME_WITH_PREFIX: // attacker name with prefix - HANDLE_NICKNAME_STRING_CASE(gBattlerAttacker, gBattlerPartyIndexes[gBattlerAttacker]) + HANDLE_NICKNAME_STRING_CASE(gBattlerAttacker) break; case B_TXT_DEF_NAME_WITH_PREFIX: // target name with prefix - HANDLE_NICKNAME_STRING_CASE(gBattlerTarget, gBattlerPartyIndexes[gBattlerTarget]) + HANDLE_NICKNAME_STRING_CASE(gBattlerTarget) + break; + case B_TXT_DEF_NAME: // target name + GetBattlerNick(gBattlerTarget, text); + toCpy = text; + break; + case B_TXT_ACTIVE_NAME: // active name + GetBattlerNick(gActiveBattler, text); + toCpy = text; + break; + case B_TXT_ACTIVE_NAME2: // active battlerId name with prefix, no illusion + if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) + GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_NICKNAME, text); + else + GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_NICKNAME, text); + StringGetEnd10(text); + toCpy = text; break; case B_TXT_EFF_NAME_WITH_PREFIX: // effect battlerId name with prefix - HANDLE_NICKNAME_STRING_CASE(gEffectBattler, gBattlerPartyIndexes[gEffectBattler]) + HANDLE_NICKNAME_STRING_CASE(gEffectBattler) break; case B_TXT_ACTIVE_NAME_WITH_PREFIX: // active battlerId name with prefix - HANDLE_NICKNAME_STRING_CASE(gActiveBattler, gBattlerPartyIndexes[gActiveBattler]) + HANDLE_NICKNAME_STRING_CASE(gActiveBattler) break; case B_TXT_SCR_ACTIVE_NAME_WITH_PREFIX: // scripting active battlerId name with prefix - HANDLE_NICKNAME_STRING_CASE(gBattleScripting.battler, gBattlerPartyIndexes[gBattleScripting.battler]) + HANDLE_NICKNAME_STRING_CASE(gBattleScripting.battler) break; case B_TXT_CURRENT_MOVE: // current move name if (gBattleMsgDataPtr->currentMove >= MOVES_COUNT) @@ -2536,58 +3045,10 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) toCpy = gAbilityNames[sBattlerAbilities[gEffectBattler]]; break; case B_TXT_TRAINER1_CLASS: // trainer class name - if (gBattleTypeFlags & BATTLE_TYPE_SECRET_BASE) - toCpy = gTrainerClassNames[GetSecretBaseTrainerClass()]; - else if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) - toCpy = gTrainerClassNames[GetUnionRoomTrainerClass()]; - else if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) - toCpy = gTrainerClassNames[GetFrontierBrainTrainerClass()]; - else if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) - toCpy = gTrainerClassNames[GetFrontierOpponentClass(gTrainerBattleOpponent_A)]; - else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) - toCpy = gTrainerClassNames[GetTrainerHillOpponentClass(gTrainerBattleOpponent_A)]; - else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) - toCpy = gTrainerClassNames[GetEreaderTrainerClassId()]; - else - toCpy = gTrainerClassNames[gTrainers[gTrainerBattleOpponent_A].trainerClass]; + toCpy = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_A); break; case B_TXT_TRAINER1_NAME: // trainer1 name - if (gBattleTypeFlags & BATTLE_TYPE_SECRET_BASE) - { - for (i = 0; i < (s32) ARRAY_COUNT(gBattleResources->secretBase->trainerName); i++) - text[i] = gBattleResources->secretBase->trainerName[i]; - text[i] = EOS; - ConvertInternationalString(text, gBattleResources->secretBase->language); - toCpy = text; - } - else if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) - { - toCpy = gLinkPlayers[multiplayerId ^ BIT_SIDE].name; - } - else if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) - { - CopyFrontierBrainTrainerName(text); - toCpy = text; - } - else if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) - { - GetFrontierTrainerName(text, gTrainerBattleOpponent_A); - toCpy = text; - } - else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) - { - GetTrainerHillTrainerName(text, gTrainerBattleOpponent_A); - toCpy = text; - } - else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) - { - GetEreaderTrainerName(text); - toCpy = text; - } - else - { - toCpy = gTrainers[gTrainerBattleOpponent_A].trainerName; - } + toCpy = BattleStringGetOpponentNameByTrainerId(gTrainerBattleOpponent_A, text, multiplayerId, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)); break; case B_TXT_LINK_PLAYER_NAME: // link player name toCpy = gLinkPlayers[multiplayerId].name; @@ -2605,10 +3066,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) toCpy = gLinkPlayers[GetBattlerMultiplayerId(gBattleScripting.battler)].name; break; case B_TXT_PLAYER_NAME: // player name - if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) - toCpy = gLinkPlayers[0].name; - else - toCpy = gSaveBlock2Ptr->playerName; + toCpy = BattleStringGetPlayerName(text, GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)); break; case B_TXT_TRAINER1_LOSE_TEXT: // trainerA lose text if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) @@ -2639,7 +3097,26 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) } break; case B_TXT_26: // ? - HANDLE_NICKNAME_STRING_CASE(gBattleScripting.battler, *(&gBattleStruct->field_52)) + if (GetBattlerSide(gBattleScripting.battler) != B_SIDE_PLAYER) + { + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + toCpy = sText_FoePkmnPrefix; + else + toCpy = sText_WildPkmnPrefix; + while (*toCpy != EOS) + { + dst[dstID] = *toCpy; + dstID++; + toCpy++; + } + GetMonData(&gEnemyParty[gBattleStruct->field_52], MON_DATA_NICKNAME, text); + } + else + { + GetMonData(&gPlayerParty[gBattleStruct->field_52], MON_DATA_NICKNAME, text); + } + StringGetEnd10(text); + toCpy = text; break; case B_TXT_PC_CREATOR_NAME: // lanette pc if (FlagGet(FLAG_SYS_PC_LANETTE)) @@ -2684,28 +3161,10 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) toCpy = sText_FoePkmnPrefix4; break; case B_TXT_TRAINER2_CLASS: - if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) - toCpy = gTrainerClassNames[GetFrontierOpponentClass(gTrainerBattleOpponent_B)]; - else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) - toCpy = gTrainerClassNames[GetTrainerHillOpponentClass(gTrainerBattleOpponent_B)]; - else - toCpy = gTrainerClassNames[gTrainers[gTrainerBattleOpponent_B].trainerClass]; + toCpy = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_B); break; case B_TXT_TRAINER2_NAME: - if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) - { - GetFrontierTrainerName(text, gTrainerBattleOpponent_B); - toCpy = text; - } - else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) - { - GetTrainerHillTrainerName(text, gTrainerBattleOpponent_B); - toCpy = text; - } - else - { - toCpy = gTrainers[gTrainerBattleOpponent_B].trainerName; - } + toCpy = BattleStringGetOpponentNameByTrainerId(gTrainerBattleOpponent_B, text, multiplayerId, GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)); break; case B_TXT_TRAINER2_LOSE_TEXT: if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) @@ -2739,18 +3198,65 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) toCpy = gTrainerClassNames[GetFrontierOpponentClass(gPartnerTrainerId)]; break; case B_TXT_PARTNER_NAME: - GetFrontierTrainerName(text, gPartnerTrainerId); - toCpy = text; + toCpy = BattleStringGetPlayerName(text, GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT)); + break; + case B_TXT_ATK_TRAINER_NAME: + toCpy = BattleStringGetTrainerName(text, multiplayerId, gBattlerAttacker); + break; + case B_TXT_ATK_TRAINER_CLASS: + switch (GetBattlerPosition(gBattlerAttacker)) + { + case B_POSITION_PLAYER_RIGHT: + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) + toCpy = gTrainerClassNames[GetFrontierOpponentClass(gPartnerTrainerId)]; + break; + case B_POSITION_OPPONENT_LEFT: + toCpy = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_A); + break; + case B_POSITION_OPPONENT_RIGHT: + if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && !BATTLE_TWO_VS_ONE_OPPONENT) + toCpy = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_B); + else + toCpy = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_A); + break; + } + break; + case B_TXT_ATK_TEAM1: + if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) + toCpy = sText_Your1; + else + toCpy = sText_Opposing1; + break; + case B_TXT_ATK_TEAM2: + if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) + toCpy = sText_Your2; + else + toCpy = sText_Opposing2; + break; + case B_TXT_DEF_TEAM1: + if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER) + toCpy = sText_Your1; + else + toCpy = sText_Opposing1; + break; + case B_TXT_DEF_TEAM2: + if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER) + toCpy = sText_Your2; + else + toCpy = sText_Opposing2; break; } - // missing if (toCpy != NULL) check - while (*toCpy != EOS) + if (toCpy != NULL) { - dst[dstID] = *toCpy; - dstID++; - toCpy++; + while (*toCpy != EOS) + { + dst[dstID] = *toCpy; + dstID++; + toCpy++; + } } + if (*src == B_TXT_TRAINER1_LOSE_TEXT || *src == B_TXT_TRAINER2_LOSE_TEXT || *src == B_TXT_TRAINER1_WIN_TEXT || *src == B_TXT_TRAINER2_WIN_TEXT) { @@ -2774,6 +3280,37 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) return dstID; } +static void IllusionNickHack(u32 battlerId, u32 partyId, u8 *dst) +{ + s32 id, i; + // we know it's gEnemyParty + struct Pokemon *mon = &gEnemyParty[partyId], *partnerMon; + + if (GetMonAbility(mon) == ABILITY_ILLUSION) + { + if (IsBattlerAlive(BATTLE_PARTNER(battlerId))) + partnerMon = &gEnemyParty[gBattlerPartyIndexes[BATTLE_PARTNER(battlerId)]]; + else + partnerMon = mon; + + // Find last alive non-egg pokemon. + for (i = PARTY_SIZE - 1; i >= 0; i--) + { + id = i; + if (GetMonData(&gEnemyParty[id], MON_DATA_SANITY_HAS_SPECIES) + && GetMonData(&gEnemyParty[id], MON_DATA_HP) + && &gEnemyParty[id] != mon + && &gEnemyParty[id] != partnerMon) + { + GetMonData(&gEnemyParty[id], MON_DATA_NICKNAME, dst); + return; + } + } + } + + GetMonData(mon, MON_DATA_NICKNAME, dst); +} + static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst) { u32 srcID = 1; @@ -2842,11 +3379,24 @@ static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst) srcID += 3; break; case B_BUFF_MON_NICK: // poke nick without prefix - if (GetBattlerSide(src[srcID + 1]) == B_SIDE_PLAYER) - GetMonData(&gPlayerParty[src[srcID + 2]], MON_DATA_NICKNAME, dst); + if (src[srcID + 2] == gBattlerPartyIndexes[src[srcID + 1]]) + { + GetBattlerNick(src[srcID + 1], dst); + } + else if (gBattleScripting.illusionNickHack) // for STRINGID_ENEMYABOUTTOSWITCHPKMN + { + gBattleScripting.illusionNickHack = 0; + IllusionNickHack(src[srcID + 1], src[srcID + 2], dst); + StringGetEnd10(dst); + } else - GetMonData(&gEnemyParty[src[srcID + 2]], MON_DATA_NICKNAME, dst); - StringGetEnd10(dst); + { + if (GetBattlerSide(src[srcID + 1]) == B_SIDE_PLAYER) + GetMonData(&gPlayerParty[src[srcID + 2]], MON_DATA_NICKNAME, dst); + else + GetMonData(&gEnemyParty[src[srcID + 2]], MON_DATA_NICKNAME, dst); + StringGetEnd10(dst); + } srcID += 3; break; case B_BUFF_NEGATIVE_FLAVOR: // flavor table @@ -2890,7 +3440,7 @@ static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst) // Loads one of two text strings into the provided buffer. This is functionally // unused, since the value loaded into the buffer is not read; it loaded one of -// two particles (either "ã¯" or "ã®") which works in tandem with ChooseTypeOfMoveUsedString +// two particles (either "?" or "?") which works in tandem with ChooseTypeOfMoveUsedString // below to effect changes in the meaning of the line. static void ChooseMoveUsedParticle(u8* textBuff) { @@ -2920,17 +3470,17 @@ static void ChooseMoveUsedParticle(u8* textBuff) // sText_ExclamationMark was a plain "!", used for any attack not on the list. // It resulted in the translation "'s !". // -// sText_ExclamationMark2 was "ã‚’ ã¤ã‹ã£ãŸï¼". This resulted in the translation +// sText_ExclamationMark2 was "? ????!". This resulted in the translation // " used !", which was used for all attacks in English. // -// sText_ExclamationMark3 was "ã—ãŸï¼". This was used for those moves whose +// sText_ExclamationMark3 was "??!". This was used for those moves whose // names were verbs, such as Recover, and resulted in translations like " // recovered itself!". // -// sText_ExclamationMark4 was "ã‚’ ã—ãŸï¼" This resulted in a translation of +// sText_ExclamationMark4 was "? ??!" This resulted in a translation of // " did an !". // -// sText_ExclamationMark5 was " ã“ã†ã’ãï¼" This resulted in a translation of +// sText_ExclamationMark5 was " ????!" This resulted in a translation of // "'s attack!". static void ChooseTypeOfMoveUsedString(u8* dst) { @@ -3045,7 +3595,7 @@ void BattlePutTextOnWindow(const u8 *text, u8 windowId) void SetPpNumbersPaletteInMoveSelection(void) { - struct ChooseMoveStruct *chooseMoveStruct = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBattler][4]); + struct ChooseMoveStruct *chooseMoveStruct = (struct ChooseMoveStruct*)(&gBattleResources->bufferA[gActiveBattler][4]); const u16 *palPtr = gUnknown_08D85620; u8 var = GetCurrentPpToMaxPpState(chooseMoveStruct->currentPp[gMoveSelectionCursor[gActiveBattler]], chooseMoveStruct->maxPp[gMoveSelectionCursor[gActiveBattler]]); @@ -3089,3 +3639,87 @@ u8 GetCurrentPpToMaxPpState(u8 currentPp, u8 maxPp) return 0; } + +struct TrainerSlide +{ + u16 trainerId; + const u8 *msgLastSwitchIn; + const u8 *msgLastLowHp; + const u8 *msgFirstDown; +}; + +static const struct TrainerSlide sTrainerSlides[] = +{ + {0x291, sText_AarghAlmostHadIt, sText_BoxIsFull, sText_123Poof}, +}; + +static u32 GetEnemyMonCount(bool32 onlyAlive) +{ + u32 i, count = 0; + + for (i = 0; i < PARTY_SIZE; i++) + { + u32 species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2, NULL); + if (species != SPECIES_NONE + && species != SPECIES_EGG + && (!onlyAlive || GetMonData(&gEnemyParty[i], MON_DATA_HP, NULL))) + count++; + } + + return count; +} + +static bool32 IsBattlerHpLow(u32 battler) +{ + if ((gBattleMons[battler].hp * 100) / gBattleMons[battler].maxHP < 25) + return TRUE; + else + return FALSE; +} + +bool32 ShouldDoTrainerSlide(u32 battlerId, u32 trainerId, u32 which) +{ + s32 i; + + if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER) || GetBattlerSide(battlerId) != B_SIDE_OPPONENT) + return FALSE; + + for (i = 0; i < ARRAY_COUNT(sTrainerSlides); i++) + { + if (trainerId == sTrainerSlides[i].trainerId) + { + gBattleScripting.battler = battlerId; + switch (which) + { + case TRAINER_SLIDE_LAST_SWITCHIN: + if (sTrainerSlides[i].msgLastSwitchIn != NULL && GetEnemyMonCount(TRUE) == 1) + { + gBattleStruct->trainerSlideMsg = sTrainerSlides[i].msgLastSwitchIn; + return TRUE; + } + break; + case TRAINER_SLIDE_LAST_LOW_HP: + if (sTrainerSlides[i].msgLastLowHp != NULL + && GetEnemyMonCount(TRUE) == 1 + && IsBattlerHpLow(battlerId) + && !gBattleStruct->trainerSlideLowHpMsgDone) + { + gBattleStruct->trainerSlideLowHpMsgDone = TRUE; + gBattleStruct->trainerSlideMsg = sTrainerSlides[i].msgLastLowHp; + return TRUE; + } + break; + case TRAINER_SLIDE_FIRST_DOWN: + if (sTrainerSlides[i].msgFirstDown != NULL && GetEnemyMonCount(TRUE) == GetEnemyMonCount(FALSE) - 1) + { + gBattleStruct->trainerSlideMsg = sTrainerSlides[i].msgFirstDown; + return TRUE; + } + break; + } + break; + } + } + + return FALSE; +} diff --git a/src/battle_pike.c b/src/battle_pike.c index a161b88b81..a053789bbd 100644 --- a/src/battle_pike.c +++ b/src/battle_pike.c @@ -17,6 +17,7 @@ #include "constants/battle_frontier.h" #include "constants/frontier_util.h" #include "constants/abilities.h" +#include "constants/battle_config.h" #include "constants/easy_chat.h" #include "constants/layouts.h" #include "constants/rgb.h" @@ -855,8 +856,9 @@ static bool8 DoesTypePreventStatus(u16 species, u32 status) ret = TRUE; break; case STATUS1_PARALYSIS: - if (gBaseStats[species].type1 == TYPE_GROUND || gBaseStats[species].type1 == TYPE_ELECTRIC - || gBaseStats[species].type2 == TYPE_GROUND || gBaseStats[species].type2 == TYPE_ELECTRIC) + if (gBaseStats[species].type1 == TYPE_GROUND || gBaseStats[species].type2 == TYPE_GROUND + || (B_PARALYZE_ELECTRIC >= GEN_6 && + (gBaseStats[species].type1 == TYPE_ELECTRIC || gBaseStats[species].type2 == TYPE_ELECTRIC))) ret = TRUE; break; case STATUS1_BURN: diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 3b77df294d..ec5aa12dad 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -42,6 +42,7 @@ #include "battle_setup.h" #include "overworld.h" #include "party_menu.h" +#include "constants/battle_config.h" #include "battle_arena.h" #include "battle_pike.h" #include "battle_pyramid.h" @@ -57,14 +58,14 @@ extern struct MusicPlayerInfo gMPlayInfo_BGM; extern const u8* const gBattleScriptsForMoveEffects[]; -#define DEFENDER_IS_PROTECTED ((gProtectStructs[gBattlerTarget].protected) && (gBattleMoves[gCurrentMove].flags & FLAG_PROTECT_AFFECTED)) - // this file's functions +#define STAT_CHANGE_WORKED 0 +#define STAT_CHANGE_DIDNT_WORK 1 + static bool8 IsTwoTurnsMove(u16 move); static void TrySetDestinyBondToHappen(void); static u8 AttacksThisTurn(u8 battlerId, u16 move); // Note: returns 1 if it's a charging turn, otherwise 2. -static void CheckWonderGuardAndLevitate(void); -static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8, const u8* BS_ptr); +static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr); static bool32 IsMonGettingExpSentOut(void); static void sub_804F17C(void); static bool8 sub_804F1CC(void); @@ -73,6 +74,7 @@ static void DrawLevelUpWindow2(void); static bool8 sub_804F344(void); static void PutMonIconOnLvlUpBox(void); static void PutLevelAndGenderOnLvlUpBox(void); +static bool32 CriticalCapture(u32 odds); static void SpriteCB_MonIconOnLvlUpBox(struct Sprite* sprite); @@ -83,8 +85,8 @@ static void Cmd_ppreduce(void); static void Cmd_critcalc(void); static void Cmd_damagecalc(void); static void Cmd_typecalc(void); -static void Cmd_adjustnormaldamage(void); -static void Cmd_adjustnormaldamage2(void); +static void Cmd_adjustdamage(void); +static void Cmd_multihitresultmessage(void); static void Cmd_attackanimation(void); static void Cmd_waitanimation(void); static void Cmd_healthbarupdate(void); @@ -110,9 +112,9 @@ static void Cmd_jumpifability(void); static void Cmd_jumpifsideaffecting(void); static void Cmd_jumpifstat(void); static void Cmd_jumpifstatus3condition(void); -static void Cmd_jumpiftype(void); +static void Cmd_jumpbasedontype(void); static void Cmd_getexp(void); -static void Cmd_unknown_24(void); +static void atk24(void); static void Cmd_movevaluescleanup(void); static void Cmd_setmultihit(void); static void Cmd_decrementmultihit(void); @@ -135,14 +137,14 @@ static void Cmd_bichalfword(void); static void Cmd_bicword(void); static void Cmd_pause(void); static void Cmd_waitstate(void); -static void Cmd_healthbar_update(void); +static void Cmd_update(void); static void Cmd_return(void); static void Cmd_end(void); static void Cmd_end2(void); static void Cmd_end3(void); static void Cmd_jumpifaffectedbyprotect(void); static void Cmd_call(void); -static void Cmd_jumpiftype2(void); +static void Cmd_setroost(void); static void Cmd_jumpifabilitypresent(void); static void Cmd_endselectionscript(void); static void Cmd_playanimation(void); @@ -150,7 +152,7 @@ static void Cmd_playanimation2(void); static void Cmd_setgraphicalstatchangevalues(void); static void Cmd_playstatchangeanimation(void); static void Cmd_moveend(void); -static void Cmd_typecalc2(void); +static void Cmd_sethealblock(void); static void Cmd_returnatktoball(void); static void Cmd_getswitchedmondata(void); static void Cmd_switchindataupdate(void); @@ -163,14 +165,14 @@ static void Cmd_trainerslidein(void); static void Cmd_playse(void); static void Cmd_fanfare(void); static void Cmd_playfaintcry(void); -static void Cmd_unknown_57(void); +static void atk57(void); static void Cmd_returntoball(void); static void Cmd_handlelearnnewmove(void); static void Cmd_yesnoboxlearnmove(void); static void Cmd_yesnoboxstoplearningmove(void); static void Cmd_hitanimation(void); static void Cmd_getmoneyreward(void); -static void Cmd_unknown_5E(void); +static void atk5E(void); static void Cmd_swapattackerwithtarget(void); static void Cmd_incrementgamestat(void); static void Cmd_drawpartystatussummary(void); @@ -181,14 +183,14 @@ static void Cmd_status2animation(void); static void Cmd_chosenstatusanimation(void); static void Cmd_yesnobox(void); static void Cmd_cancelallactions(void); -static void Cmd_adjustsetdamage(void); +static void Cmd_setgravity(void); static void Cmd_removeitem(void); static void Cmd_atknameinbuff1(void); static void Cmd_drawlvlupbox(void); static void Cmd_resetsentmonsvalue(void); static void Cmd_setatktoplayer0(void); static void Cmd_makevisible(void); -static void Cmd_recordlastability(void); +static void Cmd_recordability(void); static void Cmd_buffermovetolearn(void); static void Cmd_jumpifplayerran(void); static void Cmd_hpthresholds(void); @@ -207,12 +209,12 @@ static void Cmd_setseeded(void); static void Cmd_manipulatedamage(void); static void Cmd_trysetrest(void); static void Cmd_jumpifnotfirstturn(void); -static void Cmd_nop(void); +static void Cmd_setmiracleeye(void); static void Cmd_jumpifcantmakeasleep(void); static void Cmd_stockpile(void); static void Cmd_stockpiletobasedamage(void); static void Cmd_stockpiletohpheal(void); -static void Cmd_negativedamage(void); +static void Cmd_setdrainedhp(void); static void Cmd_statbuffchange(void); static void Cmd_normalisebuffs(void); static void Cmd_setbide(void); @@ -248,17 +250,17 @@ static void Cmd_copymovepermanently(void); static void Cmd_trychoosesleeptalkmove(void); static void Cmd_setdestinybond(void); static void Cmd_trysetdestinybondtohappen(void); -static void Cmd_remaininghptopower(void); +static void Cmd_settailwind(void); static void Cmd_tryspiteppreduce(void); static void Cmd_healpartystatus(void); static void Cmd_cursetarget(void); static void Cmd_trysetspikes(void); static void Cmd_setforesight(void); static void Cmd_trysetperishsong(void); -static void Cmd_rolloutdamagecalculation(void); +static void Cmd_handlerollout(void); static void Cmd_jumpifconfusedandstatmaxed(void); -static void Cmd_furycuttercalc(void); -static void Cmd_happinesstodamagecalculation(void); +static void Cmd_handlefurycutter(void); +static void Cmd_setembargo(void); static void Cmd_presentdamagecalculation(void); static void Cmd_setsafeguard(void); static void Cmd_magnitudedamagecalculation(void); @@ -269,7 +271,7 @@ static void Cmd_copyfoestats(void); static void Cmd_rapidspinfree(void); static void Cmd_setdefensecurlbit(void); static void Cmd_recoverbasedonsunlight(void); -static void Cmd_hiddenpowercalc(void); +static void Cmd_setstickyweb(void); static void Cmd_selectfirstvalidtarget(void); static void Cmd_trysetfutureattack(void); static void Cmd_trydobeatup(void); @@ -289,15 +291,15 @@ static void Cmd_trysethelpinghand(void); static void Cmd_tryswapitems(void); static void Cmd_trycopyability(void); static void Cmd_trywish(void); -static void Cmd_trysetroots(void); -static void Cmd_doubledamagedealtifdamaged(void); +static void Cmd_settoxicspikes(void); +static void Cmd_setgastroacid(void); static void Cmd_setyawn(void); static void Cmd_setdamagetohealthdifference(void); -static void Cmd_scaledamagebyhealthratio(void); +static void Cmd_setroom(void); static void Cmd_tryswapabilities(void); static void Cmd_tryimprison(void); -static void Cmd_trysetgrudge(void); -static void Cmd_weightdamagecalculation(void); +static void Cmd_setstealthrock(void); +static void Cmd_setuserstatus3(void); static void Cmd_assistattackselect(void); static void Cmd_trysetmagiccoat(void); static void Cmd_trysetsnatch(void); @@ -309,7 +311,7 @@ static void Cmd_pickup(void); static void Cmd_docastformchangeanimation(void); static void Cmd_trycastformdatachange(void); static void Cmd_settypebasedhalvers(void); -static void Cmd_setweatherballtype(void); +static void Cmd_jumpifsubstituteblocks(void); static void Cmd_tryrecycleitem(void); static void Cmd_settypetoterrain(void); static void Cmd_pursuitrelated(void); @@ -325,258 +327,272 @@ static void Cmd_removeattackerstatus1(void); static void Cmd_finishaction(void); static void Cmd_finishturn(void); static void Cmd_trainerslideout(void); +static void Cmd_settelekinesis(void); +static void Cmd_swapstatstages(void); +static void Cmd_averagestats(void); +static void Cmd_jumpifoppositegenders(void); +static void Cmd_trygetbaddreamstarget(void); +static void Cmd_tryworryseed(void); +static void Cmd_metalburstdamagecalculator(void); void (* const gBattleScriptingCommandsTable[])(void) = { - Cmd_attackcanceler, //0x0 - Cmd_accuracycheck, //0x1 - Cmd_attackstring, //0x2 - Cmd_ppreduce, //0x3 - Cmd_critcalc, //0x4 - Cmd_damagecalc, //0x5 - Cmd_typecalc, //0x6 - Cmd_adjustnormaldamage, //0x7 - Cmd_adjustnormaldamage2, //0x8 - Cmd_attackanimation, //0x9 - Cmd_waitanimation, //0xA - Cmd_healthbarupdate, //0xB - Cmd_datahpupdate, //0xC - Cmd_critmessage, //0xD - Cmd_effectivenesssound, //0xE - Cmd_resultmessage, //0xF - Cmd_printstring, //0x10 - Cmd_printselectionstring, //0x11 - Cmd_waitmessage, //0x12 - Cmd_printfromtable, //0x13 - Cmd_printselectionstringfromtable, //0x14 - Cmd_seteffectwithchance, //0x15 - Cmd_seteffectprimary, //0x16 - Cmd_seteffectsecondary, //0x17 - Cmd_clearstatusfromeffect, //0x18 - Cmd_tryfaintmon, //0x19 - Cmd_dofaintanimation, //0x1A - Cmd_cleareffectsonfaint, //0x1B - Cmd_jumpifstatus, //0x1C - Cmd_jumpifstatus2, //0x1D - Cmd_jumpifability, //0x1E - Cmd_jumpifsideaffecting, //0x1F - Cmd_jumpifstat, //0x20 - Cmd_jumpifstatus3condition, //0x21 - Cmd_jumpiftype, //0x22 - Cmd_getexp, //0x23 - Cmd_unknown_24, //0x24 - Cmd_movevaluescleanup, //0x25 - Cmd_setmultihit, //0x26 - Cmd_decrementmultihit, //0x27 - Cmd_goto, //0x28 - Cmd_jumpifbyte, //0x29 - Cmd_jumpifhalfword, //0x2A - Cmd_jumpifword, //0x2B - Cmd_jumpifarrayequal, //0x2C - Cmd_jumpifarraynotequal, //0x2D - Cmd_setbyte, //0x2E - Cmd_addbyte, //0x2F - Cmd_subbyte, //0x30 - Cmd_copyarray, //0x31 - Cmd_copyarraywithindex, //0x32 - Cmd_orbyte, //0x33 - Cmd_orhalfword, //0x34 - Cmd_orword, //0x35 - Cmd_bicbyte, //0x36 - Cmd_bichalfword, //0x37 - Cmd_bicword, //0x38 - Cmd_pause, //0x39 - Cmd_waitstate, //0x3A - Cmd_healthbar_update, //0x3B - Cmd_return, //0x3C - Cmd_end, //0x3D - Cmd_end2, //0x3E - Cmd_end3, //0x3F - Cmd_jumpifaffectedbyprotect, //0x40 - Cmd_call, //0x41 - Cmd_jumpiftype2, //0x42 - Cmd_jumpifabilitypresent, //0x43 - Cmd_endselectionscript, //0x44 - Cmd_playanimation, //0x45 - Cmd_playanimation2, //0x46 - Cmd_setgraphicalstatchangevalues, //0x47 - Cmd_playstatchangeanimation, //0x48 - Cmd_moveend, //0x49 - Cmd_typecalc2, //0x4A - Cmd_returnatktoball, //0x4B - Cmd_getswitchedmondata, //0x4C - Cmd_switchindataupdate, //0x4D - Cmd_switchinanim, //0x4E - Cmd_jumpifcantswitch, //0x4F - Cmd_openpartyscreen, //0x50 - Cmd_switchhandleorder, //0x51 - Cmd_switchineffects, //0x52 - Cmd_trainerslidein, //0x53 - Cmd_playse, //0x54 - Cmd_fanfare, //0x55 - Cmd_playfaintcry, //0x56 - Cmd_unknown_57, //0x57 - Cmd_returntoball, //0x58 - Cmd_handlelearnnewmove, //0x59 - Cmd_yesnoboxlearnmove, //0x5A - Cmd_yesnoboxstoplearningmove, //0x5B - Cmd_hitanimation, //0x5C - Cmd_getmoneyreward, //0x5D - Cmd_unknown_5E, //0x5E - Cmd_swapattackerwithtarget, //0x5F - Cmd_incrementgamestat, //0x60 - Cmd_drawpartystatussummary, //0x61 - Cmd_hidepartystatussummary, //0x62 - Cmd_jumptocalledmove, //0x63 - Cmd_statusanimation, //0x64 - Cmd_status2animation, //0x65 - Cmd_chosenstatusanimation, //0x66 - Cmd_yesnobox, //0x67 - Cmd_cancelallactions, //0x68 - Cmd_adjustsetdamage, //0x69 - Cmd_removeitem, //0x6A - Cmd_atknameinbuff1, //0x6B - Cmd_drawlvlupbox, //0x6C - Cmd_resetsentmonsvalue, //0x6D - Cmd_setatktoplayer0, //0x6E - Cmd_makevisible, //0x6F - Cmd_recordlastability, //0x70 - Cmd_buffermovetolearn, //0x71 - Cmd_jumpifplayerran, //0x72 - Cmd_hpthresholds, //0x73 - Cmd_hpthresholds2, //0x74 - Cmd_useitemonopponent, //0x75 - Cmd_various, //0x76 - Cmd_setprotectlike, //0x77 - Cmd_faintifabilitynotdamp, //0x78 - Cmd_setatkhptozero, //0x79 - Cmd_jumpifnexttargetvalid, //0x7A - Cmd_tryhealhalfhealth, //0x7B - Cmd_trymirrormove, //0x7C - Cmd_setrain, //0x7D - Cmd_setreflect, //0x7E - Cmd_setseeded, //0x7F - Cmd_manipulatedamage, //0x80 - Cmd_trysetrest, //0x81 - Cmd_jumpifnotfirstturn, //0x82 - Cmd_nop, //0x83 - Cmd_jumpifcantmakeasleep, //0x84 - Cmd_stockpile, //0x85 - Cmd_stockpiletobasedamage, //0x86 - Cmd_stockpiletohpheal, //0x87 - Cmd_negativedamage, //0x88 - Cmd_statbuffchange, //0x89 - Cmd_normalisebuffs, //0x8A - Cmd_setbide, //0x8B - Cmd_confuseifrepeatingattackends, //0x8C - Cmd_setmultihitcounter, //0x8D - Cmd_initmultihitstring, //0x8E - Cmd_forcerandomswitch, //0x8F - Cmd_tryconversiontypechange, //0x90 - Cmd_givepaydaymoney, //0x91 - Cmd_setlightscreen, //0x92 - Cmd_tryKO, //0x93 - Cmd_damagetohalftargethp, //0x94 - Cmd_setsandstorm, //0x95 - Cmd_weatherdamage, //0x96 - Cmd_tryinfatuating, //0x97 - Cmd_updatestatusicon, //0x98 - Cmd_setmist, //0x99 - Cmd_setfocusenergy, //0x9A - Cmd_transformdataexecution, //0x9B - Cmd_setsubstitute, //0x9C - Cmd_mimicattackcopy, //0x9D - Cmd_metronome, //0x9E - Cmd_dmgtolevel, //0x9F - Cmd_psywavedamageeffect, //0xA0 - Cmd_counterdamagecalculator, //0xA1 - Cmd_mirrorcoatdamagecalculator, //0xA2 - Cmd_disablelastusedattack, //0xA3 - Cmd_trysetencore, //0xA4 - Cmd_painsplitdmgcalc, //0xA5 - Cmd_settypetorandomresistance, //0xA6 - Cmd_setalwayshitflag, //0xA7 - Cmd_copymovepermanently, //0xA8 - Cmd_trychoosesleeptalkmove, //0xA9 - Cmd_setdestinybond, //0xAA - Cmd_trysetdestinybondtohappen, //0xAB - Cmd_remaininghptopower, //0xAC - Cmd_tryspiteppreduce, //0xAD - Cmd_healpartystatus, //0xAE - Cmd_cursetarget, //0xAF - Cmd_trysetspikes, //0xB0 - Cmd_setforesight, //0xB1 - Cmd_trysetperishsong, //0xB2 - Cmd_rolloutdamagecalculation, //0xB3 - Cmd_jumpifconfusedandstatmaxed, //0xB4 - Cmd_furycuttercalc, //0xB5 - Cmd_happinesstodamagecalculation, //0xB6 - Cmd_presentdamagecalculation, //0xB7 - Cmd_setsafeguard, //0xB8 - Cmd_magnitudedamagecalculation, //0xB9 - Cmd_jumpifnopursuitswitchdmg, //0xBA - Cmd_setsunny, //0xBB - Cmd_maxattackhalvehp, //0xBC - Cmd_copyfoestats, //0xBD - Cmd_rapidspinfree, //0xBE - Cmd_setdefensecurlbit, //0xBF - Cmd_recoverbasedonsunlight, //0xC0 - Cmd_hiddenpowercalc, //0xC1 - Cmd_selectfirstvalidtarget, //0xC2 - Cmd_trysetfutureattack, //0xC3 - Cmd_trydobeatup, //0xC4 - Cmd_setsemiinvulnerablebit, //0xC5 - Cmd_clearsemiinvulnerablebit, //0xC6 - Cmd_setminimize, //0xC7 - Cmd_sethail, //0xC8 - Cmd_jumpifattackandspecialattackcannotfall, //0xC9 - Cmd_setforcedtarget, //0xCA - Cmd_setcharge, //0xCB - Cmd_callterrainattack, //0xCC - Cmd_cureifburnedparalysedorpoisoned, //0xCD - Cmd_settorment, //0xCE - Cmd_jumpifnodamage, //0xCF - Cmd_settaunt, //0xD0 - Cmd_trysethelpinghand, //0xD1 - Cmd_tryswapitems, //0xD2 - Cmd_trycopyability, //0xD3 - Cmd_trywish, //0xD4 - Cmd_trysetroots, //0xD5 - Cmd_doubledamagedealtifdamaged, //0xD6 - Cmd_setyawn, //0xD7 - Cmd_setdamagetohealthdifference, //0xD8 - Cmd_scaledamagebyhealthratio, //0xD9 - Cmd_tryswapabilities, //0xDA - Cmd_tryimprison, //0xDB - Cmd_trysetgrudge, //0xDC - Cmd_weightdamagecalculation, //0xDD - Cmd_assistattackselect, //0xDE - Cmd_trysetmagiccoat, //0xDF - Cmd_trysetsnatch, //0xE0 - Cmd_trygetintimidatetarget, //0xE1 - Cmd_switchoutabilities, //0xE2 - Cmd_jumpifhasnohp, //0xE3 - Cmd_getsecretpowereffect, //0xE4 - Cmd_pickup, //0xE5 - Cmd_docastformchangeanimation, //0xE6 - Cmd_trycastformdatachange, //0xE7 - Cmd_settypebasedhalvers, //0xE8 - Cmd_setweatherballtype, //0xE9 - Cmd_tryrecycleitem, //0xEA - Cmd_settypetoterrain, //0xEB - Cmd_pursuitrelated, //0xEC - Cmd_snatchsetbattlers, //0xED - Cmd_removelightscreenreflect, //0xEE - Cmd_handleballthrow, //0xEF - Cmd_givecaughtmon, //0xF0 - Cmd_trysetcaughtmondexflags, //0xF1 - Cmd_displaydexinfo, //0xF2 - Cmd_trygivecaughtmonnick, //0xF3 - Cmd_subattackerhpbydmg, //0xF4 - Cmd_removeattackerstatus1, //0xF5 - Cmd_finishaction, //0xF6 - Cmd_finishturn, //0xF7 - Cmd_trainerslideout //0xF8 + Cmd_attackcanceler, // 0x0 + Cmd_accuracycheck, // 0x1 + Cmd_attackstring, // 0x2 + Cmd_ppreduce, // 0x3 + Cmd_critcalc, // 0x4 + Cmd_damagecalc, // 0x5 + Cmd_typecalc, // 0x6 + Cmd_adjustdamage, // 0x7 + Cmd_multihitresultmessage, // 0x8 + Cmd_attackanimation, // 0x9 + Cmd_waitanimation, // 0xA + Cmd_healthbarupdate, // 0xB + Cmd_datahpupdate, // 0xC + Cmd_critmessage, // 0xD + Cmd_effectivenesssound, // 0xE + Cmd_resultmessage, // 0xF + Cmd_printstring, // 0x10 + Cmd_printselectionstring, // 0x11 + Cmd_waitmessage, // 0x12 + Cmd_printfromtable, // 0x13 + Cmd_printselectionstringfromtable, // 0x14 + Cmd_seteffectwithchance, // 0x15 + Cmd_seteffectprimary, // 0x16 + Cmd_seteffectsecondary, // 0x17 + Cmd_clearstatusfromeffect, // 0x18 + Cmd_tryfaintmon, // 0x19 + Cmd_dofaintanimation, // 0x1A + Cmd_cleareffectsonfaint, // 0x1B + Cmd_jumpifstatus, // 0x1C + Cmd_jumpifstatus2, // 0x1D + Cmd_jumpifability, // 0x1E + Cmd_jumpifsideaffecting, // 0x1F + Cmd_jumpifstat, // 0x20 + Cmd_jumpifstatus3condition, // 0x21 + Cmd_jumpbasedontype, // 0x22 + Cmd_getexp, // 0x23 + atk24, // 0x24 + Cmd_movevaluescleanup, // 0x25 + Cmd_setmultihit, // 0x26 + Cmd_decrementmultihit, // 0x27 + Cmd_goto, // 0x28 + Cmd_jumpifbyte, // 0x29 + Cmd_jumpifhalfword, // 0x2A + Cmd_jumpifword, // 0x2B + Cmd_jumpifarrayequal, // 0x2C + Cmd_jumpifarraynotequal, // 0x2D + Cmd_setbyte, // 0x2E + Cmd_addbyte, // 0x2F + Cmd_subbyte, // 0x30 + Cmd_copyarray, // 0x31 + Cmd_copyarraywithindex, // 0x32 + Cmd_orbyte, // 0x33 + Cmd_orhalfword, // 0x34 + Cmd_orword, // 0x35 + Cmd_bicbyte, // 0x36 + Cmd_bichalfword, // 0x37 + Cmd_bicword, // 0x38 + Cmd_pause, // 0x39 + Cmd_waitstate, // 0x3A + Cmd_update, // 0x3B + Cmd_return, // 0x3C + Cmd_end, // 0x3D + Cmd_end2, // 0x3E + Cmd_end3, // 0x3F + Cmd_jumpifaffectedbyprotect, // 0x40 + Cmd_call, // 0x41 + Cmd_setroost, // 0x42 + Cmd_jumpifabilitypresent, // 0x43 + Cmd_endselectionscript, // 0x44 + Cmd_playanimation, // 0x45 + Cmd_playanimation2, // 0x46 + Cmd_setgraphicalstatchangevalues, // 0x47 + Cmd_playstatchangeanimation, // 0x48 + Cmd_moveend, // 0x49 + Cmd_sethealblock, // 0x4A + Cmd_returnatktoball, // 0x4B + Cmd_getswitchedmondata, // 0x4C + Cmd_switchindataupdate, // 0x4D + Cmd_switchinanim, // 0x4E + Cmd_jumpifcantswitch, // 0x4F + Cmd_openpartyscreen, // 0x50 + Cmd_switchhandleorder, // 0x51 + Cmd_switchineffects, // 0x52 + Cmd_trainerslidein, // 0x53 + Cmd_playse, // 0x54 + Cmd_fanfare, // 0x55 + Cmd_playfaintcry, // 0x56 + atk57, // 0x57 + Cmd_returntoball, // 0x58 + Cmd_handlelearnnewmove, // 0x59 + Cmd_yesnoboxlearnmove, // 0x5A + Cmd_yesnoboxstoplearningmove, // 0x5B + Cmd_hitanimation, // 0x5C + Cmd_getmoneyreward, // 0x5D + atk5E, // 0x5E + Cmd_swapattackerwithtarget, // 0x5F + Cmd_incrementgamestat, // 0x60 + Cmd_drawpartystatussummary, // 0x61 + Cmd_hidepartystatussummary, // 0x62 + Cmd_jumptocalledmove, // 0x63 + Cmd_statusanimation, // 0x64 + Cmd_status2animation, // 0x65 + Cmd_chosenstatusanimation, // 0x66 + Cmd_yesnobox, // 0x67 + Cmd_cancelallactions, // 0x68 + Cmd_setgravity, // 0x69 + Cmd_removeitem, // 0x6A + Cmd_atknameinbuff1, // 0x6B + Cmd_drawlvlupbox, // 0x6C + Cmd_resetsentmonsvalue, // 0x6D + Cmd_setatktoplayer0, // 0x6E + Cmd_makevisible, // 0x6F + Cmd_recordability, // 0x70 + Cmd_buffermovetolearn, // 0x71 + Cmd_jumpifplayerran, // 0x72 + Cmd_hpthresholds, // 0x73 + Cmd_hpthresholds2, // 0x74 + Cmd_useitemonopponent, // 0x75 + Cmd_various, // 0x76 + Cmd_setprotectlike, // 0x77 + Cmd_faintifabilitynotdamp, // 0x78 + Cmd_setatkhptozero, // 0x79 + Cmd_jumpifnexttargetvalid, // 0x7A + Cmd_tryhealhalfhealth, // 0x7B + Cmd_trymirrormove, // 0x7C + Cmd_setrain, // 0x7D + Cmd_setreflect, // 0x7E + Cmd_setseeded, // 0x7F + Cmd_manipulatedamage, // 0x80 + Cmd_trysetrest, // 0x81 + Cmd_jumpifnotfirstturn, // 0x82 + Cmd_setmiracleeye, // 0x83 + Cmd_jumpifcantmakeasleep, // 0x84 + Cmd_stockpile, // 0x85 + Cmd_stockpiletobasedamage, // 0x86 + Cmd_stockpiletohpheal, // 0x87 + Cmd_setdrainedhp, // 0x88 + Cmd_statbuffchange, // 0x89 + Cmd_normalisebuffs, // 0x8A + Cmd_setbide, // 0x8B + Cmd_confuseifrepeatingattackends, // 0x8C + Cmd_setmultihitcounter, // 0x8D + Cmd_initmultihitstring, // 0x8E + Cmd_forcerandomswitch, // 0x8F + Cmd_tryconversiontypechange, // 0x90 + Cmd_givepaydaymoney, // 0x91 + Cmd_setlightscreen, // 0x92 + Cmd_tryKO, // 0x93 + Cmd_damagetohalftargethp, // 0x94 + Cmd_setsandstorm, // 0x95 + Cmd_weatherdamage, // 0x96 + Cmd_tryinfatuating, // 0x97 + Cmd_updatestatusicon, // 0x98 + Cmd_setmist, // 0x99 + Cmd_setfocusenergy, // 0x9A + Cmd_transformdataexecution, // 0x9B + Cmd_setsubstitute, // 0x9C + Cmd_mimicattackcopy, // 0x9D + Cmd_metronome, // 0x9E + Cmd_dmgtolevel, // 0x9F + Cmd_psywavedamageeffect, // 0xA0 + Cmd_counterdamagecalculator, // 0xA1 + Cmd_mirrorcoatdamagecalculator, // 0xA2 + Cmd_disablelastusedattack, // 0xA3 + Cmd_trysetencore, // 0xA4 + Cmd_painsplitdmgcalc, // 0xA5 + Cmd_settypetorandomresistance, // 0xA6 + Cmd_setalwayshitflag, // 0xA7 + Cmd_copymovepermanently, // 0xA8 + Cmd_trychoosesleeptalkmove, // 0xA9 + Cmd_setdestinybond, // 0xAA + Cmd_trysetdestinybondtohappen, // 0xAB + Cmd_settailwind, // 0xAC + Cmd_tryspiteppreduce, // 0xAD + Cmd_healpartystatus, // 0xAE + Cmd_cursetarget, // 0xAF + Cmd_trysetspikes, // 0xB0 + Cmd_setforesight, // 0xB1 + Cmd_trysetperishsong, // 0xB2 + Cmd_handlerollout, // 0xB3 + Cmd_jumpifconfusedandstatmaxed, // 0xB4 + Cmd_handlefurycutter, // 0xB5 + Cmd_setembargo, // 0xB6 + Cmd_presentdamagecalculation, // 0xB7 + Cmd_setsafeguard, // 0xB8 + Cmd_magnitudedamagecalculation, // 0xB9 + Cmd_jumpifnopursuitswitchdmg, // 0xBA + Cmd_setsunny, // 0xBB + Cmd_maxattackhalvehp, // 0xBC + Cmd_copyfoestats, // 0xBD + Cmd_rapidspinfree, // 0xBE + Cmd_setdefensecurlbit, // 0xBF + Cmd_recoverbasedonsunlight, // 0xC0 + Cmd_setstickyweb, // 0xC1 + Cmd_selectfirstvalidtarget, // 0xC2 + Cmd_trysetfutureattack, // 0xC3 + Cmd_trydobeatup, // 0xC4 + Cmd_setsemiinvulnerablebit, // 0xC5 + Cmd_clearsemiinvulnerablebit, // 0xC6 + Cmd_setminimize, // 0xC7 + Cmd_sethail, // 0xC8 + Cmd_jumpifattackandspecialattackcannotfall, // 0xC9 + Cmd_setforcedtarget, // 0xCA + Cmd_setcharge, // 0xCB + Cmd_callterrainattack, // 0xCC + Cmd_cureifburnedparalysedorpoisoned, // 0xCD + Cmd_settorment, // 0xCE + Cmd_jumpifnodamage, // 0xCF + Cmd_settaunt, // 0xD0 + Cmd_trysethelpinghand, // 0xD1 + Cmd_tryswapitems, // 0xD2 + Cmd_trycopyability, // 0xD3 + Cmd_trywish, // 0xD4 + Cmd_settoxicspikes, // 0xD5 + Cmd_setgastroacid, // 0xD6 + Cmd_setyawn, // 0xD7 + Cmd_setdamagetohealthdifference, // 0xD8 + Cmd_setroom, // 0xD9 + Cmd_tryswapabilities, // 0xDA + Cmd_tryimprison, // 0xDB + Cmd_setstealthrock, // 0xDC + Cmd_setuserstatus3, // 0xDD + Cmd_assistattackselect, // 0xDE + Cmd_trysetmagiccoat, // 0xDF + Cmd_trysetsnatch, // 0xE0 + Cmd_trygetintimidatetarget, // 0xE1 + Cmd_switchoutabilities, // 0xE2 + Cmd_jumpifhasnohp, // 0xE3 + Cmd_getsecretpowereffect, // 0xE4 + Cmd_pickup, // 0xE5 + Cmd_docastformchangeanimation, // 0xE6 + Cmd_trycastformdatachange, // 0xE7 + Cmd_settypebasedhalvers, // 0xE8 + Cmd_jumpifsubstituteblocks, // 0xE9 + Cmd_tryrecycleitem, // 0xEA + Cmd_settypetoterrain, // 0xEB + Cmd_pursuitrelated, // 0xEC + Cmd_snatchsetbattlers, // 0xED + Cmd_removelightscreenreflect, // 0xEE + Cmd_handleballthrow, // 0xEF + Cmd_givecaughtmon, // 0xF0 + Cmd_trysetcaughtmondexflags, // 0xF1 + Cmd_displaydexinfo, // 0xF2 + Cmd_trygivecaughtmonnick, // 0xF3 + Cmd_subattackerhpbydmg, // 0xF4 + Cmd_removeattackerstatus1, // 0xF5 + Cmd_finishaction, // 0xF6 + Cmd_finishturn, // 0xF7 + Cmd_trainerslideout, // 0xF8 + Cmd_settelekinesis, // 0xF9 + Cmd_swapstatstages, // 0xFA + Cmd_averagestats, // 0xFB + Cmd_jumpifoppositegenders, // 0xFC + Cmd_trygetbaddreamstarget, // 0xFD + Cmd_tryworryseed, // 0xFE + Cmd_metalburstdamagecalculator, // 0xFF }; struct StatFractions @@ -602,9 +618,6 @@ static const struct StatFractions sAccuracyStageRatios[] = { 3, 1}, // +6 }; -// The chance is 1/N for each stage. -static const u16 sCriticalHitChance[] = {16, 8, 4, 3, 2}; - static const u32 sStatusFlagsForMoveEffects[NUM_MOVE_EFFECTS] = { [MOVE_EFFECT_SLEEP] = STATUS1_SLEEP, @@ -626,45 +639,18 @@ static const u32 sStatusFlagsForMoveEffects[NUM_MOVE_EFFECTS] = static const u8* const sMoveEffectBS_Ptrs[] = { - [0] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_SLEEP] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_POISON] = BattleScript_MoveEffectPoison, - [MOVE_EFFECT_BURN] = BattleScript_MoveEffectBurn, - [MOVE_EFFECT_FREEZE] = BattleScript_MoveEffectFreeze, - [MOVE_EFFECT_PARALYSIS] = BattleScript_MoveEffectParalysis, - [MOVE_EFFECT_TOXIC] = BattleScript_MoveEffectToxic, - [MOVE_EFFECT_CONFUSION] = BattleScript_MoveEffectConfusion, - [MOVE_EFFECT_FLINCH] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_TRI_ATTACK] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_UPROAR] = BattleScript_MoveEffectUproar, - [MOVE_EFFECT_PAYDAY] = BattleScript_MoveEffectPayDay, - [MOVE_EFFECT_CHARGING] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_WRAP] = BattleScript_MoveEffectWrap, - [MOVE_EFFECT_RECOIL_25] = BattleScript_MoveEffectRecoil, - [MOVE_EFFECT_ATK_PLUS_1] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_DEF_PLUS_1] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_SPD_PLUS_1] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_SP_ATK_PLUS_1] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_SP_DEF_PLUS_1] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_ACC_PLUS_1] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_EVS_PLUS_1] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_ATK_MINUS_1] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_DEF_MINUS_1] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_SPD_MINUS_1] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_SP_ATK_MINUS_1] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_SP_DEF_MINUS_1] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_ACC_MINUS_1] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_EVS_MINUS_1] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_RECHARGE] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_RAGE] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_STEAL_ITEM] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_PREVENT_ESCAPE] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_NIGHTMARE] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_ALL_STATS_UP] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_RAPIDSPIN] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_REMOVE_PARALYSIS] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_ATK_DEF_DOWN] = BattleScript_MoveEffectSleep, - [MOVE_EFFECT_RECOIL_33] = BattleScript_MoveEffectRecoil, + [MOVE_EFFECT_SLEEP] = BattleScript_MoveEffectSleep, + [MOVE_EFFECT_POISON] = BattleScript_MoveEffectPoison, + [MOVE_EFFECT_BURN] = BattleScript_MoveEffectBurn, + [MOVE_EFFECT_FREEZE] = BattleScript_MoveEffectFreeze, + [MOVE_EFFECT_PARALYSIS] = BattleScript_MoveEffectParalysis, + [MOVE_EFFECT_TOXIC] = BattleScript_MoveEffectToxic, + [MOVE_EFFECT_CONFUSION] = BattleScript_MoveEffectConfusion, + [MOVE_EFFECT_UPROAR] = BattleScript_MoveEffectUproar, + [MOVE_EFFECT_PAYDAY] = BattleScript_MoveEffectPayDay, + [MOVE_EFFECT_WRAP] = BattleScript_MoveEffectWrap, + [MOVE_EFFECT_RECOIL_25] = BattleScript_MoveEffectRecoil, + [MOVE_EFFECT_RECOIL_33] = BattleScript_MoveEffectRecoil, }; static const struct WindowTemplate sUnusedWinTemplate = {0, 1, 3, 7, 0xF, 0x1F, 0x3F}; @@ -672,13 +658,6 @@ static const struct WindowTemplate sUnusedWinTemplate = {0, 1, 3, 7, 0xF, 0x1F, static const u16 sUnknown_0831C2C8[] = INCBIN_U16("graphics/battle_interface/unk_battlebox.gbapal"); static const u32 sUnknown_0831C2E8[] = INCBIN_U32("graphics/battle_interface/unk_battlebox.4bpp.lz"); -// unused -static const u8 sRubyLevelUpStatBoxStats[] = -{ - MON_DATA_MAX_HP, MON_DATA_SPATK, MON_DATA_ATK, - MON_DATA_SPDEF, MON_DATA_DEF, MON_DATA_SPEED -}; - #define MON_ICON_LVLUP_BOX_TAG 0xD75A static const struct OamData sOamData_MonIconOnLvlUpBox = @@ -711,42 +690,115 @@ static const struct SpriteTemplate sSpriteTemplate_MonIconOnLvlUpBox = static const u16 sProtectSuccessRates[] = {USHRT_MAX, USHRT_MAX / 2, USHRT_MAX / 4, USHRT_MAX / 8}; -#define MIMIC_FORBIDDEN_END 0xFFFE -#define METRONOME_FORBIDDEN_END 0xFFFF -#define ASSIST_FORBIDDEN_END 0xFFFF +#define FORBIDDEN_MIMIC 0x1 +#define FORBIDDEN_METRONOME 0x2 +#define FORBIDDEN_ASSIST 0x4 +#define FORBIDDEN_COPYCAT 0x8 +#define FORBIDDEN_SLEEP_TALK 0x10 -static const u16 sMovesForbiddenToCopy[] = +#define FORBIDDEN_INSTRUCT_END 0xFFFF + +static const u8 sForbiddenMoves[MOVES_COUNT] = { - MOVE_METRONOME, - MOVE_STRUGGLE, - MOVE_SKETCH, - MOVE_MIMIC, - MIMIC_FORBIDDEN_END, - MOVE_COUNTER, - MOVE_MIRROR_COAT, - MOVE_PROTECT, - MOVE_DETECT, - MOVE_ENDURE, - MOVE_DESTINY_BOND, - MOVE_SLEEP_TALK, - MOVE_THIEF, - MOVE_FOLLOW_ME, - MOVE_SNATCH, - MOVE_HELPING_HAND, - MOVE_COVET, - MOVE_TRICK, - MOVE_FOCUS_PUNCH, - METRONOME_FORBIDDEN_END + [MOVE_NONE] = 0xFF, // Can't use a non-move lol + [MOVE_STRUGGLE] = 0xFF, // Neither Struggle + [MOVE_AFTER_YOU] = FORBIDDEN_METRONOME, + [MOVE_ASSIST] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, + [MOVE_BANEFUL_BUNKER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_BEAK_BLAST] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, + [MOVE_BELCH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, + [MOVE_BESTOW] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_BIDE] = FORBIDDEN_SLEEP_TALK, + [MOVE_CELEBRATE] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, + [MOVE_CHATTER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_MIMIC | FORBIDDEN_SLEEP_TALK, + [MOVE_CIRCLE_THROW] = FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_COPYCAT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, + [MOVE_COUNTER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_COVET] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_CRAFTY_SHIELD] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_DESTINY_BOND] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_DETECT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_DIG] = FORBIDDEN_ASSIST, + [MOVE_DIVE] = FORBIDDEN_ASSIST, + [MOVE_DRAGON_TAIL] = FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_DIAMOND_STORM] = FORBIDDEN_METRONOME, + [MOVE_ENDURE] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_FEINT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_FLEUR_CANNON] = FORBIDDEN_METRONOME, + [MOVE_FLY] = FORBIDDEN_ASSIST, + [MOVE_FOCUS_PUNCH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, + [MOVE_FOLLOW_ME] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_FREEZE_SHOCK] = FORBIDDEN_METRONOME, + [MOVE_HELPING_HAND] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_HOLD_HANDS] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, + [MOVE_HYPERSPACE_FURY] = FORBIDDEN_METRONOME, + [MOVE_HYPERSPACE_HOLE] = FORBIDDEN_METRONOME, + [MOVE_ICE_BURN] = FORBIDDEN_METRONOME, + [MOVE_INSTRUCT] = FORBIDDEN_METRONOME, + [MOVE_KINGS_SHIELD] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_LIGHT_OF_RUIN] = FORBIDDEN_METRONOME, + [MOVE_MAT_BLOCK] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_ME_FIRST] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, + [MOVE_METRONOME] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, + [MOVE_MIMIC] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_MIMIC | FORBIDDEN_SLEEP_TALK, + [MOVE_MIRROR_COAT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_MIRROR_MOVE] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, + [MOVE_NATURE_POWER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, + [MOVE_ORIGIN_PULSE] = FORBIDDEN_METRONOME, + [MOVE_PRECIPICE_BLADES] = FORBIDDEN_METRONOME, + [MOVE_PROTECT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_QUASH] = FORBIDDEN_METRONOME, + [MOVE_QUICK_GUARD] = FORBIDDEN_METRONOME, + [MOVE_RAGE_POWDER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_RELIC_SONG] = FORBIDDEN_METRONOME, + [MOVE_ROAR] = FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_SECRET_SWORD] = FORBIDDEN_METRONOME, + [MOVE_SHELL_TRAP] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, + [MOVE_SKETCH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, + [MOVE_SLEEP_TALK] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK, + [MOVE_SNARL] = FORBIDDEN_METRONOME, + [MOVE_SNATCH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_SNORE] = FORBIDDEN_METRONOME, + [MOVE_SPECTRAL_THIEF] = FORBIDDEN_METRONOME, + [MOVE_SPIKY_SHIELD] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_SPOTLIGHT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST, + [MOVE_STEAM_ERUPTION] = FORBIDDEN_METRONOME, + [MOVE_SWITCHEROO] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_TECHNO_BLAST] = FORBIDDEN_METRONOME, + [MOVE_THIEF] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_THOUSAND_ARROWS] = FORBIDDEN_METRONOME, + [MOVE_THOUSAND_WAVES] = FORBIDDEN_METRONOME, + [MOVE_TRANSFORM] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_MIMIC, + [MOVE_TRICK] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_V_CREATE] = FORBIDDEN_METRONOME, + [MOVE_WIDE_GUARD] = FORBIDDEN_METRONOME, + [MOVE_WHIRLWIND] = FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [MOVE_UPROAR] = FORBIDDEN_SLEEP_TALK, }; -static const u8 sFlailHpScaleToPowerTable[] = +static const u16 sMoveEffectsForbiddenToInstruct[] = { - 1, 200, - 4, 150, - 9, 100, - 16, 80, - 32, 40, - 48, 20 + EFFECT_ASSIST, + //EFFECT_BEAK_BLAST, + EFFECT_BIDE, + EFFECT_FOCUS_PUNCH, + //EFFECT_GEOMANCY, + EFFECT_INSTRUCT, + EFFECT_ME_FIRST, + EFFECT_METRONOME, + EFFECT_MIRROR_MOVE, + EFFECT_NATURE_POWER, + EFFECT_RECHARGE, + EFFECT_SEMI_INVULNERABLE, + //EFFECT_SHELL_TRAP, + EFFECT_SKETCH, + //EFFECT_SKY_DROP, + EFFECT_SKULL_BASH, + EFFECT_SLEEP_TALK, + EFFECT_SOLARBEAM, + EFFECT_TRANSFORM, + EFFECT_TWO_TURNS_ATTACK, + FORBIDDEN_INSTRUCT_END }; static const u16 sNaturePowerMoves[] = @@ -763,17 +815,6 @@ static const u16 sNaturePowerMoves[] = [BATTLE_TERRAIN_PLAIN] = MOVE_SWIFT }; -// format: min. weight (hectograms), base power -static const u16 sWeightToDamageTable[] = -{ - 100, 20, - 250, 40, - 500, 60, - 1000, 80, - 2000, 100, - 0xFFFF, 0xFFFF -}; - static const u16 sPickupItems[] = { ITEM_POTION, @@ -833,9 +874,9 @@ static const u8 sTerrainToType[] = // - ITEM_ULTRA_BALL skips Master Ball and ITEM_NONE static const u8 sBallCatchBonuses[] = { - [ITEM_ULTRA_BALL - ITEM_ULTRA_BALL] = 20, - [ITEM_GREAT_BALL - ITEM_ULTRA_BALL] = 15, - [ITEM_POKE_BALL - ITEM_ULTRA_BALL] = 10, + [ITEM_ULTRA_BALL - ITEM_ULTRA_BALL] = 20, + [ITEM_GREAT_BALL - ITEM_ULTRA_BALL] = 15, + [ITEM_POKE_BALL - ITEM_ULTRA_BALL] = 10, [ITEM_SAFARI_BALL - ITEM_ULTRA_BALL] = 15 }; @@ -906,9 +947,93 @@ static const u8 sBattlePalaceNatureToFlavorTextId[NUM_NATURES] = [NATURE_QUIRKY] = 3, }; +bool32 IsBattlerProtected(u8 battlerId, u16 move) +{ + if (!(gBattleMoves[move].flags & FLAG_PROTECT_AFFECTED)) + return FALSE; + else if (gBattleMoves[move].effect == MOVE_EFFECT_FEINT) + return FALSE; + else if (gProtectStructs[battlerId].protected) + return TRUE; + else if (gSideStatuses[GetBattlerSide(battlerId)] & SIDE_STATUS_WIDE_GUARD + && gBattleMoves[move].target & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY)) + return TRUE; + else if (gProtectStructs[battlerId].banefulBunkered) + return TRUE; + else if (gProtectStructs[battlerId].spikyShielded) + return TRUE; + else if (gProtectStructs[battlerId].kingsShielded && gBattleMoves[move].power != 0) + return TRUE; + else if (gSideStatuses[GetBattlerSide(battlerId)] & SIDE_STATUS_QUICK_GUARD + && GetChosenMovePriority(gBattlerAttacker) > 0) + return TRUE; + else if (gSideStatuses[GetBattlerSide(battlerId)] & SIDE_STATUS_CRAFTY_SHIELD + && gBattleMoves[move].power == 0) + return TRUE; + else if (gSideStatuses[GetBattlerSide(battlerId)] & SIDE_STATUS_MAT_BLOCK + && gBattleMoves[move].power != 0) + return TRUE; + else + return FALSE; +} + +static bool32 NoTargetPresent(u32 move) +{ + if (!IsBattlerAlive(gBattlerTarget)) + gBattlerTarget = GetMoveTarget(move, 0); + + switch (gBattleMoves[move].target) + { + case MOVE_TARGET_SELECTED: + case MOVE_TARGET_DEPENDS: + case MOVE_TARGET_RANDOM: + if (!IsBattlerAlive(gBattlerTarget)) + return TRUE; + break; + case MOVE_TARGET_BOTH: + if (!IsBattlerAlive(gBattlerTarget) && !IsBattlerAlive(BATTLE_PARTNER(gBattlerTarget))) + return TRUE; + break; + case MOVE_TARGET_FOES_AND_ALLY: + if (!IsBattlerAlive(gBattlerTarget) && !IsBattlerAlive(BATTLE_PARTNER(gBattlerTarget)) && !IsBattlerAlive(BATTLE_PARTNER(gBattlerAttacker))) + return TRUE; + break; + } + + return FALSE; +} + +static bool32 TryAegiFormChange(void) +{ + // Only Aegislash with Stance Change can transform, transformed mons cannot. + if (GetBattlerAbility(gBattlerAttacker) != ABILITY_STANCE_CHANGE + || gBattleMons[gBattlerAttacker].status2 & STATUS2_TRANSFORMED) + return FALSE; + + switch (gBattleMons[gBattlerAttacker].species) + { + default: + return FALSE; + case SPECIES_AEGISLASH: // Shield -> Blade + if (gBattleMoves[gCurrentMove].power == 0) + return FALSE; + gBattleMons[gBattlerAttacker].species = SPECIES_AEGISLASH_BLADE; + break; + case SPECIES_AEGISLASH_BLADE: // Blade -> Shield + if (gCurrentMove != MOVE_KINGS_SHIELD) + return FALSE; + gBattleMons[gBattlerAttacker].species = SPECIES_AEGISLASH; + break; + } + + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_AttackerFormChange; + return TRUE; +} + static void Cmd_attackcanceler(void) { - s32 i; + s32 i, moveType; if (gBattleOutcome != 0) { @@ -921,8 +1046,30 @@ static void Cmd_attackcanceler(void) gBattlescriptCurrInstr = BattleScript_MoveEnd; return; } + #if (B_STANCE_CHANGE_FAIL <= GEN_6) + if (TryAegiFormChange()) + return; + #endif if (AtkCanceller_UnableToUseMove()) return; + + // Check Protean activation. + GET_MOVE_TYPE(gCurrentMove, moveType); + if (GetBattlerAbility(gBattlerAttacker) == ABILITY_PROTEAN + && (gBattleMons[gBattlerAttacker].type1 != moveType || gBattleMons[gBattlerAttacker].type2 != moveType || + (gBattleMons[gBattlerAttacker].type3 != moveType && gBattleMons[gBattlerAttacker].type3 != TYPE_MYSTERY)) + && gCurrentMove != MOVE_STRUGGLE) + { + PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); + SET_BATTLER_TYPE(gBattlerAttacker, moveType); + gBattlerAbility = gBattlerAttacker; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ProteanActivates; + return; + } + + if (AtkCanceller_UnableToUseMove2()) + return; if (AbilityBattleEffects(ABILITYEFFECT_MOVES_BLOCK, gBattlerTarget, 0, 0, 0)) return; if (!gBattleMons[gBattlerAttacker].pp[gCurrMovePos] && gCurrentMove != MOVE_STRUGGLE && !(gHitMarker & (HITMARKER_x800000 | HITMARKER_NO_ATTACKSTRING)) @@ -932,13 +1079,15 @@ static void Cmd_attackcanceler(void) gMoveResultFlags |= MOVE_RESULT_MISSED; return; } + #if (B_STANCE_CHANGE_FAIL >= GEN_7) + if (TryAegiFormChange()) + return; + #endif gHitMarker &= ~(HITMARKER_x800000); - if (!(gHitMarker & HITMARKER_OBEYS) && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) { - i = IsMonDisobedient(); // why use the 'i' variable...? - switch (i) + switch (IsMonDisobedient()) { case 0: break; @@ -952,11 +1101,33 @@ static void Cmd_attackcanceler(void) } gHitMarker |= HITMARKER_OBEYS; + if (NoTargetPresent(gCurrentMove)) + { + gBattlescriptCurrInstr = BattleScript_ButItFailedAtkStringPpReduce; + if (!IsTwoTurnsMove(gCurrentMove) || (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) + CancelMultiTurnMoves(gBattlerAttacker); + return; + } - if (gProtectStructs[gBattlerTarget].bounceMove && gBattleMoves[gCurrentMove].flags & FLAG_MAGICCOAT_AFFECTED) + if (gProtectStructs[gBattlerTarget].bounceMove + && gBattleMoves[gCurrentMove].flags & FLAG_MAGICCOAT_AFFECTED + && !gProtectStructs[gBattlerAttacker].usesBouncedMove) { PressurePPLose(gBattlerAttacker, gBattlerTarget, MOVE_MAGIC_COAT); gProtectStructs[gBattlerTarget].bounceMove = 0; + gProtectStructs[gBattlerTarget].usesBouncedMove = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_MagicCoatBounce; + return; + } + else if (GetBattlerAbility(gBattlerTarget) == ABILITY_MAGIC_BOUNCE + && gBattleMoves[gCurrentMove].flags & FLAG_MAGICCOAT_AFFECTED + && !gProtectStructs[gBattlerAttacker].usesBouncedMove) + { + RecordAbilityBattle(gBattlerTarget, ABILITY_MAGIC_BOUNCE); + gProtectStructs[gBattlerTarget].usesBouncedMove = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MagicCoatBounce; return; @@ -983,7 +1154,15 @@ static void Cmd_attackcanceler(void) gBattlescriptCurrInstr = BattleScript_TookAttack; RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); } - else if (DEFENDER_IS_PROTECTED + else if (gSpecialStatuses[gBattlerTarget].stormDrainRedirected) + { + gSpecialStatuses[gBattlerTarget].stormDrainRedirected = 0; + gLastUsedAbility = ABILITY_STORM_DRAIN; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_TookAttack; + RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); + } + else if (IsBattlerProtected(gBattlerTarget, gCurrentMove) && (gCurrentMove != MOVE_CURSE || IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST)) && ((!IsTwoTurnsMove(gCurrentMove) || (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)))) { @@ -1000,27 +1179,28 @@ static void Cmd_attackcanceler(void) } } -static void JumpIfMoveFailed(u8 adder, u16 move) +static bool32 JumpIfMoveFailed(u8 adder, u16 move) { - const u8 *BS_ptr = gBattlescriptCurrInstr + adder; if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) { gLastLandedMoves[gBattlerTarget] = 0; gLastHitByType[gBattlerTarget] = 0; - BS_ptr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + return TRUE; } else { TrySetDestinyBondToHappen(); if (AbilityBattleEffects(ABILITYEFFECT_ABSORBING, gBattlerTarget, 0, 0, move)) - return; + return TRUE; } - gBattlescriptCurrInstr = BS_ptr; + gBattlescriptCurrInstr += adder; + return FALSE; } static void Cmd_jumpifaffectedbyprotect(void) { - if (DEFENDER_IS_PROTECTED) + if (IsBattlerProtected(gBattlerTarget, gCurrentMove)) { gMoveResultFlags |= MOVE_RESULT_MISSED; JumpIfMoveFailed(5, 0); @@ -1035,7 +1215,7 @@ static void Cmd_jumpifaffectedbyprotect(void) bool8 JumpIfMoveAffectedByProtect(u16 move) { bool8 affected = FALSE; - if (DEFENDER_IS_PROTECTED) + if (IsBattlerProtected(gBattlerTarget, move)) { gMoveResultFlags |= MOVE_RESULT_MISSED; JumpIfMoveFailed(7, move); @@ -1045,43 +1225,49 @@ bool8 JumpIfMoveAffectedByProtect(u16 move) return affected; } -static bool8 AccuracyCalcHelper(u16 move) +static bool32 AccuracyCalcHelper(u16 move) { if (gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker) { JumpIfMoveFailed(7, move); return TRUE; } + else if (B_TOXIC_NEVER_MISS >= GEN_6 + && gBattleMoves[move].effect == EFFECT_TOXIC + && IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_POISON)) + { + JumpIfMoveFailed(7, move); + return TRUE; + } + else if (GetBattlerAbility(gBattlerAttacker) == ABILITY_NO_GUARD) + { + if (!JumpIfMoveFailed(7, move)) + RecordAbilityBattle(gBattlerAttacker, ABILITY_NO_GUARD); + return TRUE; + } + else if (GetBattlerAbility(gBattlerTarget) == ABILITY_NO_GUARD) + { + if (!JumpIfMoveFailed(7, move)) + RecordAbilityBattle(gBattlerTarget, ABILITY_NO_GUARD); + return TRUE; + } - if (!(gHitMarker & HITMARKER_IGNORE_ON_AIR) && gStatuses3[gBattlerTarget] & STATUS3_ON_AIR) + if ((gStatuses3[gBattlerTarget] & STATUS3_PHANTOM_FORCE) + || (!(gBattleMoves[move].flags & FLAG_HIT_IN_AIR) && gStatuses3[gBattlerTarget] & STATUS3_ON_AIR) + || (!(gBattleMoves[move].flags & FLAG_DMG_UNDERGROUND) && gStatuses3[gBattlerTarget] & STATUS3_UNDERGROUND) + || (!(gBattleMoves[move].flags & FLAG_DMG_UNDERWATER) && gStatuses3[gBattlerTarget] & STATUS3_UNDERWATER)) { gMoveResultFlags |= MOVE_RESULT_MISSED; JumpIfMoveFailed(7, move); return TRUE; } - gHitMarker &= ~HITMARKER_IGNORE_ON_AIR; - - if (!(gHitMarker & HITMARKER_IGNORE_UNDERGROUND) && gStatuses3[gBattlerTarget] & STATUS3_UNDERGROUND) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - JumpIfMoveFailed(7, move); - return TRUE; - } - - gHitMarker &= ~HITMARKER_IGNORE_UNDERGROUND; - - if (!(gHitMarker & HITMARKER_IGNORE_UNDERWATER) && gStatuses3[gBattlerTarget] & STATUS3_UNDERWATER) - { - gMoveResultFlags |= MOVE_RESULT_MISSED; - JumpIfMoveFailed(7, move); - return TRUE; - } - - gHitMarker &= ~HITMARKER_IGNORE_UNDERWATER; - - if ((WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_RAIN_ANY) && gBattleMoves[move].effect == EFFECT_THUNDER) - || (gBattleMoves[move].effect == EFFECT_ALWAYS_HIT || gBattleMoves[move].effect == EFFECT_VITAL_THROW)) + if ((WEATHER_HAS_EFFECT && + (((gBattleWeather & WEATHER_RAIN_ANY) && (gBattleMoves[move].effect == EFFECT_THUNDER || gBattleMoves[move].effect == EFFECT_HURRICANE)) + || (((gBattleWeather & WEATHER_HAIL_ANY) && move == MOVE_BLIZZARD)))) + || (gBattleMoves[move].effect == EFFECT_VITAL_THROW) + || (gBattleMoves[move].accuracy == 0) + || ((B_MINIMIZE_DMG_ACC >= GEN_6) && (gStatuses3[gBattlerTarget] & STATUS3_MINIMIZED) && (gBattleMoves[move].flags & FLAG_DMG_MINIMIZE))) { JumpIfMoveFailed(7, move); return TRUE; @@ -1090,84 +1276,105 @@ static bool8 AccuracyCalcHelper(u16 move) return FALSE; } +u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move) +{ + u32 calc, moveAcc, atkHoldEffect, atkParam, defHoldEffect, defParam, atkAbility, defAbility; + s8 buff, accStage, evasionStage; + + atkAbility = GetBattlerAbility(battlerAtk); + atkHoldEffect = GetBattlerHoldEffect(battlerAtk, TRUE); + atkParam = GetBattlerHoldEffectParam(battlerAtk); + + defAbility = GetBattlerAbility(battlerDef); + defHoldEffect = GetBattlerHoldEffect(battlerDef, TRUE); + defParam = GetBattlerHoldEffectParam(battlerDef); + gPotentialItemEffectBattler = battlerDef; + + accStage = gBattleMons[battlerAtk].statStages[STAT_ACC]; + evasionStage = gBattleMons[battlerDef].statStages[STAT_EVASION]; + if (atkAbility == ABILITY_UNAWARE) + evasionStage = 6; + if (gBattleMoves[move].flags & FLAG_STAT_STAGES_IGNORED) + evasionStage = 6; + if (defAbility == ABILITY_UNAWARE) + accStage = 6; + + if (gBattleMons[battlerDef].status2 & STATUS2_FORESIGHT || gStatuses3[battlerDef] & STATUS3_MIRACLE_EYED) + buff = accStage; + else + buff = accStage + 6 - evasionStage; + + if (buff < 0) + buff = 0; + if (buff > 0xC) + buff = 0xC; + + moveAcc = gBattleMoves[move].accuracy; + // Check Thunder and Hurricane on sunny weather. + if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY + && (gBattleMoves[move].effect == EFFECT_THUNDER || gBattleMoves[move].effect == EFFECT_HURRICANE)) + moveAcc = 50; + // Check Wonder Skin. + if (defAbility == ABILITY_WONDER_SKIN && gBattleMoves[move].power == 0) + moveAcc = 50; + + calc = sAccuracyStageRatios[buff].dividend * moveAcc; + calc /= sAccuracyStageRatios[buff].divisor; + + if (atkAbility == ABILITY_COMPOUND_EYES) + calc = (calc * 130) / 100; // 1.3 compound eyes boost + else if (atkAbility == ABILITY_VICTORY_STAR) + calc = (calc * 110) / 100; // 1.1 victory star boost + if (IsBattlerAlive(BATTLE_PARTNER(battlerAtk)) && GetBattlerAbility(BATTLE_PARTNER(battlerAtk)) == ABILITY_VICTORY_STAR) + calc = (calc * 110) / 100; // 1.1 ally's victory star boost + + if (defAbility == ABILITY_SAND_VEIL && WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SANDSTORM_ANY) + calc = (calc * 80) / 100; // 1.2 sand veil loss + else if (defAbility == ABILITY_SNOW_CLOAK && WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_HAIL_ANY) + calc = (calc * 80) / 100; // 1.2 snow cloak loss + else if (defAbility == ABILITY_TANGLED_FEET && gBattleMons[battlerDef].status2 & STATUS2_CONFUSION) + calc = (calc * 50) / 100; // 1.5 tangled feet loss + + if (atkAbility == ABILITY_HUSTLE && IS_MOVE_PHYSICAL(move)) + calc = (calc * 80) / 100; // 1.2 hustle loss + + if (defHoldEffect == HOLD_EFFECT_EVASION_UP) + calc = (calc * (100 - defParam)) / 100; + + if (atkHoldEffect == HOLD_EFFECT_WIDE_LENS) + calc = (calc * (100 + atkParam)) / 100; + else if (atkHoldEffect == HOLD_EFFECT_ZOOM_LENS && GetBattlerTurnOrderNum(battlerAtk) > GetBattlerTurnOrderNum(battlerDef)); + calc = (calc * (100 + atkParam)) / 100; + + return calc; +} + static void Cmd_accuracycheck(void) { - u16 move = T2_READ_16(gBattlescriptCurrInstr + 5); + u16 type, move = T2_READ_16(gBattlescriptCurrInstr + 5); - if (move == NO_ACC_CALC || move == NO_ACC_CALC_CHECK_LOCK_ON) + if (move == ACC_CURR_MOVE) + move = gCurrentMove; + + if (move == NO_ACC_CALC_CHECK_LOCK_ON) { - if (gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS && move == NO_ACC_CALC_CHECK_LOCK_ON && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker) + if (gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker) gBattlescriptCurrInstr += 7; - else if (gStatuses3[gBattlerTarget] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) + else if (gStatuses3[gBattlerTarget] & (STATUS3_SEMI_INVULNERABLE)) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else if (!JumpIfMoveAffectedByProtect(0)) gBattlescriptCurrInstr += 7; } else { - u8 type, moveAcc, holdEffect, param; - s8 buff; - u16 calc; - - if (move == 0) - move = gCurrentMove; - GET_MOVE_TYPE(move, type); - if (JumpIfMoveAffectedByProtect(move)) return; if (AccuracyCalcHelper(move)) return; - if (gBattleMons[gBattlerTarget].status2 & STATUS2_FORESIGHT) - { - u8 acc = gBattleMons[gBattlerAttacker].statStages[STAT_ACC]; - buff = acc; - } - else - { - u8 acc = gBattleMons[gBattlerAttacker].statStages[STAT_ACC]; - buff = acc + DEFAULT_STAT_STAGE - gBattleMons[gBattlerTarget].statStages[STAT_EVASION]; - } - - if (buff < MIN_STAT_STAGE) - buff = MIN_STAT_STAGE; - if (buff > MAX_STAT_STAGE) - buff = MAX_STAT_STAGE; - - moveAcc = gBattleMoves[move].accuracy; - // check Thunder on sunny weather - if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY && gBattleMoves[move].effect == EFFECT_THUNDER) - moveAcc = 50; - - calc = sAccuracyStageRatios[buff].dividend * moveAcc; - calc /= sAccuracyStageRatios[buff].divisor; - - if (gBattleMons[gBattlerAttacker].ability == ABILITY_COMPOUND_EYES) - calc = (calc * 130) / 100; // 1.3 compound eyes boost - if (WEATHER_HAS_EFFECT && gBattleMons[gBattlerTarget].ability == ABILITY_SAND_VEIL && gBattleWeather & WEATHER_SANDSTORM_ANY) - calc = (calc * 80) / 100; // 1.2 sand veil loss - if (gBattleMons[gBattlerAttacker].ability == ABILITY_HUSTLE && IS_TYPE_PHYSICAL(type)) - calc = (calc * 80) / 100; // 1.2 hustle loss - - if (gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY) - { - holdEffect = gEnigmaBerries[gBattlerTarget].holdEffect; - param = gEnigmaBerries[gBattlerTarget].holdEffectParam; - } - else - { - holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item); - param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item); - } - - gPotentialItemEffectBattler = gBattlerTarget; - - if (holdEffect == HOLD_EFFECT_EVASION_UP) - calc = (calc * (100 - param)) / 100; - // final calculation - if ((Random() % 100 + 1) > calc) + if ((Random() % 100 + 1) > GetTotalAccuracy(gBattlerAttacker, gBattlerTarget, move)) { gMoveResultFlags |= MOVE_RESULT_MISSED; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && @@ -1176,7 +1383,8 @@ static void Cmd_accuracycheck(void) else gBattleCommunication[6] = 0; - CheckWonderGuardAndLevitate(); + if (gBattleMoves[move].power) + CalcTypeEffectivenessMultiplier(move, type, gBattlerAttacker, gBattlerTarget, TRUE); } JumpIfMoveFailed(7, move); } @@ -1197,7 +1405,7 @@ static void Cmd_attackstring(void) static void Cmd_ppreduce(void) { - s32 ppToDeduct = 1; + s32 i, ppToDeduct = 1; if (gBattleControllerExecFlags) return; @@ -1207,14 +1415,22 @@ static void Cmd_ppreduce(void) switch (gBattleMoves[gCurrentMove].target) { case MOVE_TARGET_FOES_AND_ALLY: - ppToDeduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_ON_FIELD, gBattlerAttacker, ABILITY_PRESSURE, 0, 0); + for (i = 0; i < gBattlersCount; i++) + { + if (i != gBattlerAttacker && IsBattlerAlive(i)) + ppToDeduct += (GetBattlerAbility(i) == ABILITY_PRESSURE); + } break; case MOVE_TARGET_BOTH: case MOVE_TARGET_OPPONENTS_FIELD: - ppToDeduct += AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIDE, gBattlerAttacker, ABILITY_PRESSURE, 0, 0); + for (i = 0; i < gBattlersCount; i++) + { + if (GetBattlerSide(i) != GetBattlerSide(gBattlerAttacker) && IsBattlerAlive(i)) + ppToDeduct += (GetBattlerAbility(i) == ABILITY_PRESSURE); + } break; default: - if (gBattlerAttacker != gBattlerTarget && gBattleMons[gBattlerTarget].ability == ABILITY_PRESSURE) + if (gBattlerAttacker != gBattlerTarget && GetBattlerAbility(gBattlerTarget) == ABILITY_PRESSURE) ppToDeduct++; break; } @@ -1223,6 +1439,13 @@ static void Cmd_ppreduce(void) if (!(gHitMarker & (HITMARKER_NO_PPDEDUCT | HITMARKER_NO_ATTACKSTRING)) && gBattleMons[gBattlerAttacker].pp[gCurrMovePos]) { gProtectStructs[gBattlerAttacker].notFirstStrike = 1; + // For item Metronome + if (gCurrentMove == gLastResultingMoves[gBattlerAttacker] + && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && !WasUnableToUseMove(gBattlerAttacker)) + gBattleStruct->sameMoveTurns[gBattlerAttacker]++; + else + gBattleStruct->sameMoveTurns[gBattlerAttacker] = 0; if (gBattleMons[gBattlerAttacker].pp[gCurrMovePos] > ppToDeduct) gBattleMons[gBattlerAttacker].pp[gCurrMovePos] -= ppToDeduct; @@ -1242,426 +1465,107 @@ static void Cmd_ppreduce(void) gBattlescriptCurrInstr++; } +// The chance is 1/N for each stage. +#if B_CRIT_CHANCE >= GEN_7 + static const u8 sCriticalHitChance[] = {24, 8, 2, 1, 1}; +#elif B_CRIT_CHANCE == GEN_6 + static const u8 sCriticalHitChance[] = {16, 8, 2, 1, 1}; +#else + static const u8 sCriticalHitChance[] = {16, 8, 4, 3, 2}; // Gens 2,3,4,5 +#endif // B_CRIT_CHANCE + +s32 CalcCritChanceStage(u8 battlerAtk, u8 battlerDef, u32 move, bool32 recordAbility) +{ + s32 critChance = 0; + u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); + u32 abilityDef = GetBattlerAbility(gBattlerTarget); + + if (gSideStatuses[battlerDef] & SIDE_STATUS_LUCKY_CHANT + || gStatuses3[gBattlerAttacker] & STATUS3_CANT_SCORE_A_CRIT) + { + critChance = -1; + } + else if (abilityDef == ABILITY_BATTLE_ARMOR || abilityDef == ABILITY_SHELL_ARMOR) + { + if (recordAbility) + RecordAbilityBattle(battlerDef, abilityDef); + critChance = -1; + } + else if (gStatuses3[battlerAtk] & STATUS3_LASER_FOCUS + || gBattleMoves[move].effect == EFFECT_ALWAYS_CRIT + || (abilityAtk == ABILITY_MERCILESS && gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY)) + { + critChance = -2; + } + else + { + u32 holdEffectAtk = GetBattlerHoldEffect(battlerAtk, TRUE); + + critChance = 2 * ((gBattleMons[gBattlerAttacker].status2 & STATUS2_FOCUS_ENERGY) != 0) + + ((gBattleMoves[gCurrentMove].flags & FLAG_HIGH_CRIT) != 0) + + (holdEffectAtk == HOLD_EFFECT_SCOPE_LENS) + + 2 * (holdEffectAtk == HOLD_EFFECT_LUCKY_PUNCH && gBattleMons[gBattlerAttacker].species == SPECIES_CHANSEY) + + 2 * (holdEffectAtk == HOLD_EFFECT_STICK && gBattleMons[gBattlerAttacker].species == SPECIES_FARFETCHD) + + (abilityAtk == ABILITY_SUPER_LUCK); + + if (critChance >= ARRAY_COUNT(sCriticalHitChance)) + critChance = ARRAY_COUNT(sCriticalHitChance) - 1; + } + + return critChance; +} + static void Cmd_critcalc(void) { - u8 holdEffect; - u16 item, critChance; - - item = gBattleMons[gBattlerAttacker].item; - - if (item == ITEM_ENIGMA_BERRY) - holdEffect = gEnigmaBerries[gBattlerAttacker].holdEffect; - else - holdEffect = ItemId_GetHoldEffect(item); - + s32 critChance = CalcCritChanceStage(gBattlerAttacker, gBattlerTarget, gCurrentMove, TRUE); gPotentialItemEffectBattler = gBattlerAttacker; - critChance = 2 * ((gBattleMons[gBattlerAttacker].status2 & STATUS2_FOCUS_ENERGY) != 0) - + (gBattleMoves[gCurrentMove].effect == EFFECT_HIGH_CRITICAL) - + (gBattleMoves[gCurrentMove].effect == EFFECT_SKY_ATTACK) - + (gBattleMoves[gCurrentMove].effect == EFFECT_BLAZE_KICK) - + (gBattleMoves[gCurrentMove].effect == EFFECT_POISON_TAIL) - + (holdEffect == HOLD_EFFECT_SCOPE_LENS) - + 2 * (holdEffect == HOLD_EFFECT_LUCKY_PUNCH && gBattleMons[gBattlerAttacker].species == SPECIES_CHANSEY) - + 2 * (holdEffect == HOLD_EFFECT_STICK && gBattleMons[gBattlerAttacker].species == SPECIES_FARFETCHD); - - if (critChance >= ARRAY_COUNT(sCriticalHitChance)) - critChance = ARRAY_COUNT(sCriticalHitChance) - 1; - - if ((gBattleMons[gBattlerTarget].ability != ABILITY_BATTLE_ARMOR && gBattleMons[gBattlerTarget].ability != ABILITY_SHELL_ARMOR) - && !(gStatuses3[gBattlerAttacker] & STATUS3_CANT_SCORE_A_CRIT) - && !(gBattleTypeFlags & (BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_FIRST_BATTLE)) - && !(Random() % sCriticalHitChance[critChance])) - gCritMultiplier = 2; + if (gBattleTypeFlags & (BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_FIRST_BATTLE)) + gIsCriticalHit = FALSE; + else if (critChance == -1) + gIsCriticalHit = FALSE; + else if (critChance == -2) + gIsCriticalHit = TRUE; + else if (Random() % sCriticalHitChance[critChance] == 0) + gIsCriticalHit = TRUE; else - gCritMultiplier = 1; + gIsCriticalHit = FALSE; gBattlescriptCurrInstr++; } static void Cmd_damagecalc(void) { - u16 sideStatus = gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)]; - gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerTarget], gCurrentMove, - sideStatus, gDynamicBasePower, - gBattleStruct->dynamicMoveType, gBattlerAttacker, gBattlerTarget); - gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * gBattleScripting.dmgMultiplier; - - if (gStatuses3[gBattlerAttacker] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) - gBattleMoveDamage *= 2; - if (gProtectStructs[gBattlerAttacker].helpingHand) - gBattleMoveDamage = gBattleMoveDamage * 15 / 10; + u8 moveType; + GET_MOVE_TYPE(gCurrentMove, moveType); + gBattleMoveDamage = CalculateMoveDamage(gCurrentMove, gBattlerAttacker, gBattlerTarget, moveType, 0, gIsCriticalHit, TRUE, TRUE); gBattlescriptCurrInstr++; } -void AI_CalcDmg(u8 attacker, u8 defender) -{ - u16 sideStatus = gSideStatuses[GET_BATTLER_SIDE(defender)]; - gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[attacker], &gBattleMons[defender], gCurrentMove, - sideStatus, gDynamicBasePower, - gBattleStruct->dynamicMoveType, attacker, defender); - gDynamicBasePower = 0; - gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * gBattleScripting.dmgMultiplier; - - if (gStatuses3[attacker] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) - gBattleMoveDamage *= 2; - if (gProtectStructs[attacker].helpingHand) - gBattleMoveDamage = gBattleMoveDamage * 15 / 10; -} - -static void ModulateDmgByType(u8 multiplier) -{ - gBattleMoveDamage = gBattleMoveDamage * multiplier / 10; - if (gBattleMoveDamage == 0 && multiplier != 0) - gBattleMoveDamage = 1; - - switch (multiplier) - { - case TYPE_MUL_NO_EFFECT: - gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; - gMoveResultFlags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE; - gMoveResultFlags &= ~MOVE_RESULT_SUPER_EFFECTIVE; - break; - case TYPE_MUL_NOT_EFFECTIVE: - if (gBattleMoves[gCurrentMove].power && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) - gMoveResultFlags &= ~MOVE_RESULT_SUPER_EFFECTIVE; - else - gMoveResultFlags |= MOVE_RESULT_NOT_VERY_EFFECTIVE; - } - break; - case TYPE_MUL_SUPER_EFFECTIVE: - if (gBattleMoves[gCurrentMove].power && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) - { - if (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE) - gMoveResultFlags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE; - else - gMoveResultFlags |= MOVE_RESULT_SUPER_EFFECTIVE; - } - break; - } -} - static void Cmd_typecalc(void) { - s32 i = 0; u8 moveType; - if (gCurrentMove == MOVE_STRUGGLE) - { - gBattlescriptCurrInstr++; - return; - } - GET_MOVE_TYPE(gCurrentMove, moveType); - - // check stab - if (IS_BATTLER_OF_TYPE(gBattlerAttacker, moveType)) - { - gBattleMoveDamage = gBattleMoveDamage * 15; - gBattleMoveDamage = gBattleMoveDamage / 10; - } - - if (gBattleMons[gBattlerTarget].ability == ABILITY_LEVITATE && moveType == TYPE_GROUND) - { - gLastUsedAbility = gBattleMons[gBattlerTarget].ability; - gMoveResultFlags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); - gLastLandedMoves[gBattlerTarget] = 0; - gLastHitByType[gBattlerTarget] = 0; - gBattleCommunication[6] = moveType; - RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); - } - else - { - while (TYPE_EFFECT_ATK_TYPE(i) != TYPE_ENDTABLE) - { - if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT) - { - if (gBattleMons[gBattlerTarget].status2 & STATUS2_FORESIGHT) - break; - i += 3; - continue; - } - else if (TYPE_EFFECT_ATK_TYPE(i) == moveType) - { - // check type1 - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type1) - ModulateDmgByType(TYPE_EFFECT_MULTIPLIER(i)); - // check type2 - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2 && - gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2) - ModulateDmgByType(TYPE_EFFECT_MULTIPLIER(i)); - } - i += 3; - } - } - - if (gBattleMons[gBattlerTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBattlerAttacker, gCurrentMove) == 2 - && (!(gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) || ((gMoveResultFlags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE))) - && gBattleMoves[gCurrentMove].power) - { - gLastUsedAbility = ABILITY_WONDER_GUARD; - gMoveResultFlags |= MOVE_RESULT_MISSED; - gLastLandedMoves[gBattlerTarget] = 0; - gLastHitByType[gBattlerTarget] = 0; - gBattleCommunication[6] = 3; - RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); - } - if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) - gProtectStructs[gBattlerAttacker].targetNotAffected = 1; + CalcTypeEffectivenessMultiplier(gCurrentMove, moveType, gBattlerAttacker, gBattlerTarget, TRUE); gBattlescriptCurrInstr++; } -static void CheckWonderGuardAndLevitate(void) -{ - u8 flags = 0; - s32 i = 0; - u8 moveType; - - if (gCurrentMove == MOVE_STRUGGLE || !gBattleMoves[gCurrentMove].power) - return; - - GET_MOVE_TYPE(gCurrentMove, moveType); - - if (gBattleMons[gBattlerTarget].ability == ABILITY_LEVITATE && moveType == TYPE_GROUND) - { - gLastUsedAbility = ABILITY_LEVITATE; - gBattleCommunication[6] = moveType; - RecordAbilityBattle(gBattlerTarget, ABILITY_LEVITATE); - return; - } - - while (TYPE_EFFECT_ATK_TYPE(i) != TYPE_ENDTABLE) - { - if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT) - { - if (gBattleMons[gBattlerTarget].status2 & STATUS2_FORESIGHT) - break; - i += 3; - continue; - } - if (TYPE_EFFECT_ATK_TYPE(i) == moveType) - { - // check no effect - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type1 - && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NO_EFFECT) - { - gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; - gProtectStructs[gBattlerAttacker].targetNotAffected = 1; - } - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2 && - gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2 && - TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NO_EFFECT) - { - gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; - gProtectStructs[gBattlerAttacker].targetNotAffected = 1; - } - - // check super effective - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type1 && TYPE_EFFECT_MULTIPLIER(i) == 20) - flags |= 1; - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2 - && gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2 - && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_SUPER_EFFECTIVE) - flags |= 1; - - // check not very effective - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type1 && TYPE_EFFECT_MULTIPLIER(i) == 5) - flags |= 2; - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2 - && gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2 - && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NOT_EFFECTIVE) - flags |= 2; - } - i += 3; - } - - if (gBattleMons[gBattlerTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBattlerAttacker, gCurrentMove) == 2) - { - if (((flags & 2) || !(flags & 1)) && gBattleMoves[gCurrentMove].power) - { - gLastUsedAbility = ABILITY_WONDER_GUARD; - gBattleCommunication[6] = 3; - RecordAbilityBattle(gBattlerTarget, ABILITY_WONDER_GUARD); - } - } -} - -static void ModulateDmgByType2(u8 multiplier, u16 move, u8* flags) // same as ModulateDmgByType except different arguments -{ - gBattleMoveDamage = gBattleMoveDamage * multiplier / 10; - if (gBattleMoveDamage == 0 && multiplier != 0) - gBattleMoveDamage = 1; - - switch (multiplier) - { - case TYPE_MUL_NO_EFFECT: - *flags |= MOVE_RESULT_DOESNT_AFFECT_FOE; - *flags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE; - *flags &= ~MOVE_RESULT_SUPER_EFFECTIVE; - break; - case TYPE_MUL_NOT_EFFECTIVE: - if (gBattleMoves[move].power && !(*flags & MOVE_RESULT_NO_EFFECT)) - { - if (*flags & MOVE_RESULT_SUPER_EFFECTIVE) - *flags &= ~MOVE_RESULT_SUPER_EFFECTIVE; - else - *flags |= MOVE_RESULT_NOT_VERY_EFFECTIVE; - } - break; - case TYPE_MUL_SUPER_EFFECTIVE: - if (gBattleMoves[move].power && !(*flags & MOVE_RESULT_NO_EFFECT)) - { - if (*flags & MOVE_RESULT_NOT_VERY_EFFECTIVE) - *flags &= ~MOVE_RESULT_NOT_VERY_EFFECTIVE; - else - *flags |= MOVE_RESULT_SUPER_EFFECTIVE; - } - break; - } -} - -u8 TypeCalc(u16 move, u8 attacker, u8 defender) -{ - s32 i = 0; - u8 flags = 0; - u8 moveType; - - if (move == MOVE_STRUGGLE) - return 0; - - moveType = gBattleMoves[move].type; - - // check stab - if (IS_BATTLER_OF_TYPE(attacker, moveType)) - { - gBattleMoveDamage = gBattleMoveDamage * 15; - gBattleMoveDamage = gBattleMoveDamage / 10; - } - - if (gBattleMons[defender].ability == ABILITY_LEVITATE && moveType == TYPE_GROUND) - { - flags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); - } - else - { - while (TYPE_EFFECT_ATK_TYPE(i) != TYPE_ENDTABLE) - { - if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT) - { - if (gBattleMons[defender].status2 & STATUS2_FORESIGHT) - break; - i += 3; - continue; - } - - else if (TYPE_EFFECT_ATK_TYPE(i) == moveType) - { - // check type1 - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[defender].type1) - ModulateDmgByType2(TYPE_EFFECT_MULTIPLIER(i), move, &flags); - // check type2 - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[defender].type2 && - gBattleMons[defender].type1 != gBattleMons[defender].type2) - ModulateDmgByType2(TYPE_EFFECT_MULTIPLIER(i), move, &flags); - } - i += 3; - } - } - - if (gBattleMons[defender].ability == ABILITY_WONDER_GUARD && !(flags & MOVE_RESULT_MISSED) - && AttacksThisTurn(attacker, move) == 2 - && (!(flags & MOVE_RESULT_SUPER_EFFECTIVE) || ((flags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE))) - && gBattleMoves[move].power) - { - flags |= MOVE_RESULT_MISSED; - } - return flags; -} - -u8 AI_TypeCalc(u16 move, u16 targetSpecies, u8 targetAbility) -{ - s32 i = 0; - u8 flags = 0; - u8 type1 = gBaseStats[targetSpecies].type1, type2 = gBaseStats[targetSpecies].type2; - u8 moveType; - - if (move == MOVE_STRUGGLE) - return 0; - - moveType = gBattleMoves[move].type; - - if (targetAbility == ABILITY_LEVITATE && moveType == TYPE_GROUND) - { - flags = MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE; - } - else - { - while (TYPE_EFFECT_ATK_TYPE(i) != TYPE_ENDTABLE) - { - if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT) - { - i += 3; - continue; - } - if (TYPE_EFFECT_ATK_TYPE(i) == moveType) - { - // check type1 - if (TYPE_EFFECT_DEF_TYPE(i) == type1) - ModulateDmgByType2(TYPE_EFFECT_MULTIPLIER(i), move, &flags); - // check type2 - if (TYPE_EFFECT_DEF_TYPE(i) == type2 && type1 != type2) - ModulateDmgByType2(TYPE_EFFECT_MULTIPLIER(i), move, &flags); - } - i += 3; - } - } - if (targetAbility == ABILITY_WONDER_GUARD - && (!(flags & MOVE_RESULT_SUPER_EFFECTIVE) || ((flags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE))) - && gBattleMoves[move].power) - flags |= MOVE_RESULT_DOESNT_AFFECT_FOE; - return flags; -} - -// Multiplies the damage by a random factor between 85% to 100% inclusive -static inline void ApplyRandomDmgMultiplier(void) -{ - u16 rand = Random(); - u16 randPercent = 100 - (rand % 16); - - if (gBattleMoveDamage != 0) - { - gBattleMoveDamage *= randPercent; - gBattleMoveDamage /= 100; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - } -} - -static void Unused_ApplyRandomDmgMultiplier(void) -{ - ApplyRandomDmgMultiplier(); -} - -static void Cmd_adjustnormaldamage(void) +static void Cmd_adjustdamage(void) { u8 holdEffect, param; - ApplyRandomDmgMultiplier(); + if (DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) + goto END; + if (DoesDisguiseBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) + goto END; + if (gBattleMons[gBattlerTarget].hp > gBattleMoveDamage) + goto END; - if (gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY) - { - holdEffect = gEnigmaBerries[gBattlerTarget].holdEffect; - param = gEnigmaBerries[gBattlerTarget].holdEffectParam; - } - else - { - holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item); - param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item); - } + holdEffect = GetBattlerHoldEffect(gBattlerTarget, TRUE); + param = GetBattlerHoldEffectParam(gBattlerTarget); gPotentialItemEffectBattler = gBattlerTarget; @@ -1670,61 +1574,92 @@ static void Cmd_adjustnormaldamage(void) RecordItemEffectBattle(gBattlerTarget, holdEffect); gSpecialStatuses[gBattlerTarget].focusBanded = 1; } - if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_SUBSTITUTE) - && (gBattleMoves[gCurrentMove].effect == EFFECT_FALSE_SWIPE || gProtectStructs[gBattlerTarget].endured || gSpecialStatuses[gBattlerTarget].focusBanded) - && gBattleMons[gBattlerTarget].hp <= gBattleMoveDamage) - { - gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - 1; - if (gProtectStructs[gBattlerTarget].endured) - { - gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED; - } - else if (gSpecialStatuses[gBattlerTarget].focusBanded) - { - gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON; - gLastUsedItem = gBattleMons[gBattlerTarget].item; - } - } - gBattlescriptCurrInstr++; -} - -static void Cmd_adjustnormaldamage2(void) // The same as adjustnormaldamage except it doesn't check for false swipe move effect. -{ - u8 holdEffect, param; - - ApplyRandomDmgMultiplier(); - - if (gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY) - { - holdEffect = gEnigmaBerries[gBattlerTarget].holdEffect; - param = gEnigmaBerries[gBattlerTarget].holdEffectParam; - } - else - { - holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item); - param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item); - } - - gPotentialItemEffectBattler = gBattlerTarget; - - if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < param) + else if (holdEffect == HOLD_EFFECT_FOCUS_SASH && BATTLER_MAX_HP(gBattlerTarget)) { RecordItemEffectBattle(gBattlerTarget, holdEffect); - gSpecialStatuses[gBattlerTarget].focusBanded = 1; + gSpecialStatuses[gBattlerTarget].focusSashed = 1; } - if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_SUBSTITUTE) - && (gProtectStructs[gBattlerTarget].endured || gSpecialStatuses[gBattlerTarget].focusBanded) - && gBattleMons[gBattlerTarget].hp <= gBattleMoveDamage) + else if (GetBattlerAbility(gBattlerTarget) == ABILITY_STURDY && BATTLER_MAX_HP(gBattlerTarget)) { - gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - 1; - if (gProtectStructs[gBattlerTarget].endured) + RecordAbilityBattle(gBattlerTarget, ABILITY_STURDY); + gSpecialStatuses[gBattlerTarget].sturdied = 1; + } + + if (gBattleMoves[gCurrentMove].effect != EFFECT_FALSE_SWIPE + && !gProtectStructs[gBattlerTarget].endured + && !gSpecialStatuses[gBattlerTarget].focusBanded + && !gSpecialStatuses[gBattlerTarget].focusSashed + && !gSpecialStatuses[gBattlerTarget].sturdied) + goto END; + + // Handle reducing the dmg to 1 hp. + gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - 1; + + if (gProtectStructs[gBattlerTarget].endured) + { + gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED; + } + else if (gSpecialStatuses[gBattlerTarget].focusBanded || gSpecialStatuses[gBattlerTarget].focusSashed) + { + gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON; + gLastUsedItem = gBattleMons[gBattlerTarget].item; + } + else if (gSpecialStatuses[gBattlerTarget].sturdied) + { + gMoveResultFlags |= MOVE_RESULT_STURDIED; + gLastUsedAbility = ABILITY_STURDY; + } + +END: + gBattlescriptCurrInstr++; + + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && gBattleMoveDamage >= 1) + gSpecialStatuses[gBattlerAttacker].damagedMons |= gBitTable[gBattlerTarget]; + + // Check gems and damage reducing berries. + if (gSpecialStatuses[gBattlerTarget].berryReduced + && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && gBattleMons[gBattlerTarget].item) + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_BerryReduceDmg; + gLastUsedItem = gBattleMons[gBattlerTarget].item; + } + if (gSpecialStatuses[gBattlerAttacker].gemBoost + && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && gBattleMons[gBattlerAttacker].item) + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_GemActivates; + gLastUsedItem = gBattleMons[gBattlerAttacker].item; + } +} + +static void Cmd_multihitresultmessage(void) +{ + if (gBattleControllerExecFlags) + return; + + if (!(gMoveResultFlags & MOVE_RESULT_FAILED) && !(gMoveResultFlags & MOVE_RESULT_FOE_ENDURED)) + { + if (gMoveResultFlags & MOVE_RESULT_STURDIED) { - gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED; + gMoveResultFlags &= ~(MOVE_RESULT_STURDIED | MOVE_RESULT_FOE_HUNG_ON); + gSpecialStatuses[gBattlerTarget].sturdied = 0; // Delete this line to make Sturdy last for the duration of the whole move turn. + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_SturdiedMsg; + return; } - else if (gSpecialStatuses[gBattlerTarget].focusBanded) + else if (gMoveResultFlags & MOVE_RESULT_FOE_HUNG_ON) { - gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON; gLastUsedItem = gBattleMons[gBattlerTarget].item; + gPotentialItemEffectBattler = gBattlerTarget; + gMoveResultFlags &= ~(MOVE_RESULT_STURDIED | MOVE_RESULT_FOE_HUNG_ON); + gSpecialStatuses[gBattlerTarget].focusBanded = 0; // Delete this line to make Focus Band last for the duration of the whole move turn. + gSpecialStatuses[gBattlerTarget].focusSashed = 0; // Delete this line to make Focus Sash last for the duration of the whole move turn. + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_HangedOnMsg; + return; } } gBattlescriptCurrInstr++; @@ -1735,7 +1670,11 @@ static void Cmd_attackanimation(void) if (gBattleControllerExecFlags) return; - if ((gHitMarker & HITMARKER_NO_ANIMATIONS) && (gCurrentMove != MOVE_TRANSFORM && gCurrentMove != MOVE_SUBSTITUTE)) + if ((gHitMarker & HITMARKER_NO_ANIMATIONS) + && gCurrentMove != MOVE_TRANSFORM + && gCurrentMove != MOVE_SUBSTITUTE + // In a wild double battle gotta use the teleport animation if two wild pokemon are alive. + && !(gCurrentMove == MOVE_TELEPORT && WILD_DOUBLE_BATTLE && GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT && IsBattlerAlive(BATTLE_PARTNER(gBattlerAttacker)))) { BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_Pausex20; @@ -1799,21 +1738,13 @@ static void Cmd_healthbarupdate(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBattler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) + if (DoesSubstituteBlockMove(gBattlerAttacker, gActiveBattler, gCurrentMove) && gDisableStructs[gActiveBattler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) { PrepareStringBattle(STRINGID_SUBSTITUTEDAMAGED, gActiveBattler); } - else + else if (!DoesDisguiseBlockMove(gBattlerAttacker, gActiveBattler, gCurrentMove)) { - s16 healthValue; - - s32 currDmg = gBattleMoveDamage; - s32 maxPossibleDmgValue = 10000; // not present in R/S, ensures that huge damage values don't change sign - - if (currDmg <= maxPossibleDmgValue) - healthValue = currDmg; - else - healthValue = maxPossibleDmgValue; + s16 healthValue = min(gBattleMoveDamage, 10000); // Max damage (10000) not present in R/S, ensures that huge damage values don't change sign BtlController_EmitHealthBarUpdate(0, healthValue); MarkBattlerForControllerExec(gActiveBattler); @@ -1843,7 +1774,7 @@ static void Cmd_datahpupdate(void) if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBattler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) + if (DoesSubstituteBlockMove(gBattlerAttacker, gActiveBattler, gCurrentMove) && gDisableStructs[gActiveBattler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) { if (gDisableStructs[gActiveBattler].substituteHP >= gBattleMoveDamage) { @@ -1868,6 +1799,12 @@ static void Cmd_datahpupdate(void) return; } } + else if (DoesDisguiseBlockMove(gBattlerAttacker, gActiveBattler, gCurrentMove)) + { + gBattleMons[gActiveBattler].species = SPECIES_MIMIKYU_BUSTED; + BattleScriptPush(gBattlescriptCurrInstr + 2); + gBattlescriptCurrInstr = BattleScript_TargetFormChange; + } else { gHitMarker &= ~(HITMARKER_IGNORE_SUBSTITUTE); @@ -1907,7 +1844,7 @@ static void Cmd_datahpupdate(void) if (!gSpecialStatuses[gActiveBattler].dmg && !(gHitMarker & HITMARKER_x100000)) gSpecialStatuses[gActiveBattler].dmg = gHpDealt; - if (IS_TYPE_PHYSICAL(moveType) && !(gHitMarker & HITMARKER_x100000) && gCurrentMove != MOVE_PAIN_SPLIT) + if (IS_MOVE_PHYSICAL(gCurrentMove) && !(gHitMarker & HITMARKER_x100000) && gCurrentMove != MOVE_PAIN_SPLIT) { gProtectStructs[gActiveBattler].physicalDmg = gHpDealt; gSpecialStatuses[gActiveBattler].physicalDmg = gHpDealt; @@ -1922,7 +1859,7 @@ static void Cmd_datahpupdate(void) gSpecialStatuses[gActiveBattler].physicalBattlerId = gBattlerTarget; } } - else if (!IS_TYPE_PHYSICAL(moveType) && !(gHitMarker & HITMARKER_x100000)) + else if (!IS_MOVE_PHYSICAL(gCurrentMove) && !(gHitMarker & HITMARKER_x100000)) { gProtectStructs[gActiveBattler].specialDmg = gHpDealt; gSpecialStatuses[gActiveBattler].specialDmg = gHpDealt; @@ -1956,7 +1893,7 @@ static void Cmd_critmessage(void) { if (gBattleControllerExecFlags == 0) { - if (gCritMultiplier == 2 && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + if (gIsCriticalHit == TRUE && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { PrepareStringBattle(STRINGID_CRITICALHIT, gBattlerAttacker); gBattleCommunication[MSG_DISPLAY] = 1; @@ -1973,7 +1910,7 @@ static void Cmd_effectivenesssound(void) gActiveBattler = gBattlerTarget; if (!(gMoveResultFlags & MOVE_RESULT_MISSED)) { - switch (gMoveResultFlags & (u8)(~(MOVE_RESULT_MISSED))) + switch (gMoveResultFlags & (~(MOVE_RESULT_MISSED))) { case MOVE_RESULT_SUPER_EFFECTIVE: BtlController_EmitPlaySE(0, SE_SUPER_EFFECTIVE); @@ -1990,6 +1927,7 @@ static void Cmd_effectivenesssound(void) case MOVE_RESULT_FOE_ENDURED: case MOVE_RESULT_ONE_HIT_KO: case MOVE_RESULT_FOE_HUNG_ON: + case MOVE_RESULT_STURDIED: default: if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) { @@ -2021,13 +1959,15 @@ static void Cmd_resultmessage(void) if (gMoveResultFlags & MOVE_RESULT_MISSED && (!(gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) || gBattleCommunication[6] > 2)) { + if (gBattleCommunication[6] > 2) // Wonder Guard or Levitate - show the ability pop-up + CreateAbilityPopUp(gBattlerTarget, gBattleMons[gBattlerTarget].ability, (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) != 0); stringId = gMissStringIds[gBattleCommunication[6]]; gBattleCommunication[MSG_DISPLAY] = 1; } else { gBattleCommunication[MSG_DISPLAY] = 1; - switch (gMoveResultFlags & (u8)(~(MOVE_RESULT_MISSED))) + switch (gMoveResultFlags & (~MOVE_RESULT_MISSED)) { case MOVE_RESULT_SUPER_EFFECTIVE: stringId = STRINGID_SUPEREFFECTIVE; @@ -2052,7 +1992,7 @@ static void Cmd_resultmessage(void) gPotentialItemEffectBattler = gBattlerTarget; gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_FocusBandActivates; + gBattlescriptCurrInstr = BattleScript_HangedOnMsg; return; default: if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) @@ -2068,6 +2008,14 @@ static void Cmd_resultmessage(void) gBattlescriptCurrInstr = BattleScript_OneHitKOMsg; return; } + else if (gMoveResultFlags & MOVE_RESULT_STURDIED) + { + gMoveResultFlags &= ~(MOVE_RESULT_STURDIED | MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); + gSpecialStatuses[gBattlerTarget].sturdied = 0; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_SturdiedMsg; + return; + } else if (gMoveResultFlags & MOVE_RESULT_FOE_ENDURED) { gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); @@ -2081,7 +2029,7 @@ static void Cmd_resultmessage(void) gPotentialItemEffectBattler = gBattlerTarget; gMoveResultFlags &= ~(MOVE_RESULT_FOE_ENDURED | MOVE_RESULT_FOE_HUNG_ON); BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_FocusBandActivates; + gBattlescriptCurrInstr = BattleScript_HangedOnMsg; return; } else if (gMoveResultFlags & MOVE_RESULT_FAILED) @@ -2099,6 +2047,15 @@ static void Cmd_resultmessage(void) PrepareStringBattle(stringId, gBattlerAttacker); gBattlescriptCurrInstr++; + + // Print berry reducing message after result message. + if (gSpecialStatuses[gBattlerTarget].berryReduced + && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + { + gSpecialStatuses[gBattlerTarget].berryReduced = 0; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_PrintBerryReduceString; + } } static void Cmd_printstring(void) @@ -2106,8 +2063,9 @@ static void Cmd_printstring(void) if (gBattleControllerExecFlags == 0) { u16 var = T2_READ_16(gBattlescriptCurrInstr + 1); - PrepareStringBattle(var, gBattlerAttacker); + gBattlescriptCurrInstr += 3; + PrepareStringBattle(var, gBattlerAttacker); gBattleCommunication[MSG_DISPLAY] = 1; } } @@ -2151,9 +2109,8 @@ static void Cmd_printfromtable(void) const u16 *ptr = (const u16*) T1_READ_PTR(gBattlescriptCurrInstr + 1); ptr += gBattleCommunication[MULTISTRING_CHOOSER]; - PrepareStringBattle(*ptr, gBattlerAttacker); - gBattlescriptCurrInstr += 5; + PrepareStringBattle(*ptr, gBattlerAttacker); gBattleCommunication[MSG_DISPLAY] = 1; } } @@ -2185,29 +2142,46 @@ u8 GetBattlerTurnOrderNum(u8 battlerId) return i; } +static void CheckSetUnburden(u8 battlerId) +{ + if (GetBattlerAbility(battlerId) == ABILITY_UNBURDEN) + { + gBattleResources->flags->flags[battlerId] |= RESOURCE_FLAG_UNBURDEN; + RecordAbilityBattle(battlerId, ABILITY_UNBURDEN); + } +} + #define INCREMENT_RESET_RETURN \ { \ gBattlescriptCurrInstr++; \ - gBattleCommunication[MOVE_EFFECT_BYTE] = 0; \ + gBattleScripting.moveEffect = 0; \ return; \ } #define RESET_RETURN \ { \ - gBattleCommunication[MOVE_EFFECT_BYTE] = 0; \ + gBattleScripting.moveEffect = 0; \ return; \ } -void SetMoveEffect(bool8 primary, u8 certain) +void SetMoveEffect(bool32 primary, u32 certain) { + s32 i, byTwo, affectsUser = 0; bool32 statusChanged = FALSE; - u8 affectsUser = 0; // 0x40 otherwise bool32 noSunCanFreeze = TRUE; - if (gBattleCommunication[MOVE_EFFECT_BYTE] & MOVE_EFFECT_AFFECTS_USER) + switch (gBattleScripting.moveEffect) // Set move effects which happen later on + { + case MOVE_EFFECT_KNOCK_OFF: + gBattleStruct->moveEffect2 = gBattleScripting.moveEffect; + gBattlescriptCurrInstr++; + return; + } + + if (gBattleScripting.moveEffect & MOVE_EFFECT_AFFECTS_USER) { gEffectBattler = gBattlerAttacker; // battlerId that effects get applied on - gBattleCommunication[MOVE_EFFECT_BYTE] &= ~(MOVE_EFFECT_AFFECTS_USER); + gBattleScripting.moveEffect &= ~(MOVE_EFFECT_AFFECTS_USER); affectsUser = MOVE_EFFECT_AFFECTS_USER; gBattleScripting.battler = gBattlerTarget; // theoretically the attacker } @@ -2216,35 +2190,42 @@ void SetMoveEffect(bool8 primary, u8 certain) gEffectBattler = gBattlerTarget; gBattleScripting.battler = gBattlerAttacker; } + // Just in case this flag is still set + gBattleScripting.moveEffect &= ~(MOVE_EFFECT_CERTAIN); - if (gBattleMons[gEffectBattler].ability == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) - && !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 9) + if (GetBattlerAbility(gEffectBattler) == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) + && !primary && gBattleScripting.moveEffect <= 9) INCREMENT_RESET_RETURN if (gSideStatuses[GET_BATTLER_SIDE(gEffectBattler)] & SIDE_STATUS_SAFEGUARD && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) - && !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 7) + && !primary && gBattleScripting.moveEffect <= 7) + INCREMENT_RESET_RETURN + + if (GetBattlerAbility(gBattlerAttacker) == ABILITY_SHEER_FORCE + && gBattleMoves[gCurrentMove].flags & FLAG_SHEER_FORCE_BOOST + && affectsUser != MOVE_EFFECT_AFFECTS_USER) INCREMENT_RESET_RETURN if (gBattleMons[gEffectBattler].hp == 0 - && gBattleCommunication[MOVE_EFFECT_BYTE] != MOVE_EFFECT_PAYDAY - && gBattleCommunication[MOVE_EFFECT_BYTE] != MOVE_EFFECT_STEAL_ITEM) + && gBattleScripting.moveEffect != MOVE_EFFECT_PAYDAY + && gBattleScripting.moveEffect != MOVE_EFFECT_STEAL_ITEM) INCREMENT_RESET_RETURN - if (gBattleMons[gEffectBattler].status2 & STATUS2_SUBSTITUTE && affectsUser != MOVE_EFFECT_AFFECTS_USER) + if (DoesSubstituteBlockMove(gBattlerAttacker, gEffectBattler, gCurrentMove) && affectsUser != MOVE_EFFECT_AFFECTS_USER) INCREMENT_RESET_RETURN - if (gBattleCommunication[MOVE_EFFECT_BYTE] <= PRIMARY_STATUS_MOVE_EFFECT) + if (gBattleScripting.moveEffect <= PRIMARY_STATUS_MOVE_EFFECT) // status change { - switch (sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]) + switch (sStatusFlagsForMoveEffects[gBattleScripting.moveEffect]) { case STATUS1_SLEEP: // check active uproar - if (gBattleMons[gEffectBattler].ability != ABILITY_SOUNDPROOF) + if (GetBattlerAbility(gEffectBattler) != ABILITY_SOUNDPROOF) { for (gActiveBattler = 0; gActiveBattler < gBattlersCount && !(gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR); gActiveBattler++) - {} + ; } else gActiveBattler = gBattlersCount; @@ -2253,16 +2234,18 @@ void SetMoveEffect(bool8 primary, u8 certain) break; if (gActiveBattler != gBattlersCount) break; - if (gBattleMons[gEffectBattler].ability == ABILITY_VITAL_SPIRIT) - break; - if (gBattleMons[gEffectBattler].ability == ABILITY_INSOMNIA) + if (GetBattlerAbility(gEffectBattler) == ABILITY_VITAL_SPIRIT + || GetBattlerAbility(gEffectBattler) == ABILITY_INSOMNIA + || GetBattlerAbility(gEffectBattler) == ABILITY_COMATOSE + || IsAbilityOnSide(gEffectBattler, ABILITY_SWEET_VEIL) + || IsAbilityStatusProtected(gEffectBattler)) break; CancelMultiTurnMoves(gEffectBattler); statusChanged = TRUE; break; case STATUS1_POISON: - if (gBattleMons[gEffectBattler].ability == ABILITY_IMMUNITY + if (GetBattlerAbility(gEffectBattler) == ABILITY_IMMUNITY && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { gLastUsedAbility = ABILITY_IMMUNITY; @@ -2282,7 +2265,7 @@ void SetMoveEffect(bool8 primary, u8 certain) } RESET_RETURN } - if ((IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON) || IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL)) + if (!CanPoisonType(gBattleScripting.battler, gEffectBattler) && (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { @@ -2292,19 +2275,19 @@ void SetMoveEffect(bool8 primary, u8 certain) gBattleCommunication[MULTISTRING_CHOOSER] = 2; RESET_RETURN } - if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON)) - break; - if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL)) + if (!CanPoisonType(gBattleScripting.battler, gEffectBattler)) break; if (gBattleMons[gEffectBattler].status1) break; - if (gBattleMons[gEffectBattler].ability == ABILITY_IMMUNITY) + if (GetBattlerAbility(gEffectBattler) == ABILITY_IMMUNITY + || GetBattlerAbility(gEffectBattler) == ABILITY_COMATOSE + || IsAbilityStatusProtected(gEffectBattler)) break; statusChanged = TRUE; break; case STATUS1_BURN: - if (gBattleMons[gEffectBattler].ability == ABILITY_WATER_VEIL + if (GetBattlerAbility(gEffectBattler) == ABILITY_WATER_VEIL && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { gLastUsedAbility = ABILITY_WATER_VEIL; @@ -2335,7 +2318,9 @@ void SetMoveEffect(bool8 primary, u8 certain) } if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_FIRE)) break; - if (gBattleMons[gEffectBattler].ability == ABILITY_WATER_VEIL) + if (GetBattlerAbility(gEffectBattler) == ABILITY_WATER_VEIL + || GetBattlerAbility(gEffectBattler) == ABILITY_COMATOSE + || IsAbilityStatusProtected(gEffectBattler)) break; if (gBattleMons[gEffectBattler].status1) break; @@ -2351,14 +2336,16 @@ void SetMoveEffect(bool8 primary, u8 certain) break; if (noSunCanFreeze == 0) break; - if (gBattleMons[gEffectBattler].ability == ABILITY_MAGMA_ARMOR) + if (GetBattlerAbility(gEffectBattler) == ABILITY_MAGMA_ARMOR + || GetBattlerAbility(gEffectBattler) == ABILITY_COMATOSE + || IsAbilityStatusProtected(gEffectBattler)) break; CancelMultiTurnMoves(gEffectBattler); statusChanged = TRUE; break; case STATUS1_PARALYSIS: - if (gBattleMons[gEffectBattler].ability == ABILITY_LIMBER) + if (GetBattlerAbility(gEffectBattler) == ABILITY_LIMBER) { if (primary == TRUE || certain == MOVE_EFFECT_CERTAIN) { @@ -2382,13 +2369,29 @@ void SetMoveEffect(bool8 primary, u8 certain) else break; } + if (!CanParalyzeType(gBattleScripting.battler, gEffectBattler) + && (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) + && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_PRLZPrevention; + + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + RESET_RETURN + } + if (!CanParalyzeType(gBattleScripting.battler, gEffectBattler)) + break; + if (GetBattlerAbility(gEffectBattler) == ABILITY_LIMBER + || GetBattlerAbility(gEffectBattler) == ABILITY_COMATOSE + || IsAbilityStatusProtected(gEffectBattler)) + break; if (gBattleMons[gEffectBattler].status1) break; statusChanged = TRUE; break; case STATUS1_TOXIC_POISON: - if (gBattleMons[gEffectBattler].ability == ABILITY_IMMUNITY && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) + if (GetBattlerAbility(gEffectBattler) == ABILITY_IMMUNITY && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { gLastUsedAbility = ABILITY_IMMUNITY; RecordAbilityBattle(gEffectBattler, ABILITY_IMMUNITY); @@ -2407,7 +2410,7 @@ void SetMoveEffect(bool8 primary, u8 certain) } RESET_RETURN } - if ((IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON) || IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL)) + if (!CanPoisonType(gBattleScripting.battler, gEffectBattler) && (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { @@ -2419,9 +2422,11 @@ void SetMoveEffect(bool8 primary, u8 certain) } if (gBattleMons[gEffectBattler].status1) break; - if (!IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON) && !IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL)) + if (CanPoisonType(gBattleScripting.battler, gEffectBattler)) { - if (gBattleMons[gEffectBattler].ability == ABILITY_IMMUNITY) + if (GetBattlerAbility(gEffectBattler) == ABILITY_IMMUNITY + || GetBattlerAbility(gEffectBattler) == ABILITY_COMATOSE + || IsAbilityStatusProtected(gEffectBattler)) break; // It's redundant, because at this point we know the status1 value is 0. @@ -2440,12 +2445,12 @@ void SetMoveEffect(bool8 primary, u8 certain) { BattleScriptPush(gBattlescriptCurrInstr + 1); - if (sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]] == STATUS1_SLEEP) - gBattleMons[gEffectBattler].status1 |= STATUS1_SLEEP_TURN((Random() & 3) + 2); // 2-5 turns + if (sStatusFlagsForMoveEffects[gBattleScripting.moveEffect] == STATUS1_SLEEP) + gBattleMons[gEffectBattler].status1 |= (B_SLEEP_TURNS >= GEN_5) ? ((Random() % 3) + 2) : ((Random() % 4) + 3); else - gBattleMons[gEffectBattler].status1 |= sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattleMons[gEffectBattler].status1 |= sStatusFlagsForMoveEffects[gBattleScripting.moveEffect]; - gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect]; gActiveBattler = gEffectBattler; BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gEffectBattler].status1); @@ -2463,20 +2468,19 @@ void SetMoveEffect(bool8 primary, u8 certain) // for synchronize - if (gBattleCommunication[MOVE_EFFECT_BYTE] == MOVE_EFFECT_POISON - || gBattleCommunication[MOVE_EFFECT_BYTE] == MOVE_EFFECT_TOXIC - || gBattleCommunication[MOVE_EFFECT_BYTE] == MOVE_EFFECT_PARALYSIS - || gBattleCommunication[MOVE_EFFECT_BYTE] == MOVE_EFFECT_BURN) + if (gBattleScripting.moveEffect == MOVE_EFFECT_POISON + || gBattleScripting.moveEffect == MOVE_EFFECT_TOXIC + || gBattleScripting.moveEffect == MOVE_EFFECT_PARALYSIS + || gBattleScripting.moveEffect == MOVE_EFFECT_BURN) { - u8* synchronizeEffect = &gBattleStruct->synchronizeMoveEffect; - *synchronizeEffect = gBattleCommunication[MOVE_EFFECT_BYTE]; + gBattleStruct->synchronizeMoveEffect = gBattleScripting.moveEffect; gHitMarker |= HITMARKER_SYNCHRONISE_EFFECT; } return; } else if (statusChanged == FALSE) { - gBattleCommunication[MOVE_EFFECT_BYTE] = 0; + gBattleScripting.moveEffect = 0; gBattlescriptCurrInstr++; return; } @@ -2484,17 +2488,17 @@ void SetMoveEffect(bool8 primary, u8 certain) } else { - if (gBattleMons[gEffectBattler].status2 & sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]) + if (gBattleMons[gEffectBattler].status2 & sStatusFlagsForMoveEffects[gBattleScripting.moveEffect]) { gBattlescriptCurrInstr++; } else { u8 side; - switch (gBattleCommunication[MOVE_EFFECT_BYTE]) + switch (gBattleScripting.moveEffect) { case MOVE_EFFECT_CONFUSION: - if (gBattleMons[gEffectBattler].ability == ABILITY_OWN_TEMPO + if (GetBattlerAbility(gEffectBattler) == ABILITY_OWN_TEMPO || gBattleMons[gEffectBattler].status2 & STATUS2_CONFUSION) { gBattlescriptCurrInstr++; @@ -2504,11 +2508,11 @@ void SetMoveEffect(bool8 primary, u8 certain) gBattleMons[gEffectBattler].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); // 2-5 turns BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect]; } break; case MOVE_EFFECT_FLINCH: - if (gBattleMons[gEffectBattler].ability == ABILITY_INNER_FOCUS) + if (GetBattlerAbility(gEffectBattler) == ABILITY_INNER_FOCUS) { if (primary == TRUE || certain == MOVE_EFFECT_CERTAIN) { @@ -2524,20 +2528,19 @@ void SetMoveEffect(bool8 primary, u8 certain) else { if (GetBattlerTurnOrderNum(gEffectBattler) > gCurrentTurnActionNumber) - gBattleMons[gEffectBattler].status2 |= sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattleMons[gEffectBattler].status2 |= sStatusFlagsForMoveEffects[gBattleScripting.moveEffect]; gBattlescriptCurrInstr++; } break; case MOVE_EFFECT_UPROAR: if (!(gBattleMons[gEffectBattler].status2 & STATUS2_UPROAR)) { - gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS; gLockedMoves[gEffectBattler] = gCurrentMove; - gBattleMons[gEffectBattler].status2 |= STATUS2_UPROAR_TURN((Random() & 3) + 2); // 2-5 turns + gBattleMons[gEffectBattler].status2 |= STATUS2_UPROAR_TURN(B_UPROAR_TURNS >= GEN_5 ? 3 : ((Random() & 3) + 2)); BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect]; } else { @@ -2553,7 +2556,14 @@ void SetMoveEffect(bool8 primary, u8 certain) gPaydayMoney = 0xFFFF; } BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect]; + break; + case MOVE_EFFECT_HAPPY_HOUR: + if (GET_BATTLER_SIDE(gBattlerAttacker) == B_SIDE_PLAYER) + { + gBattleStruct->moneyMultiplier *= 2; + } + gBattlescriptCurrInstr++; break; case MOVE_EFFECT_TRI_ATTACK: if (gBattleMons[gEffectBattler].status1) @@ -2562,7 +2572,7 @@ void SetMoveEffect(bool8 primary, u8 certain) } else { - gBattleCommunication[MOVE_EFFECT_BYTE] = Random() % 3 + 3; + gBattleScripting.moveEffect = Random() % 3 + 3; SetMoveEffect(FALSE, 0); } break; @@ -2579,32 +2589,27 @@ void SetMoveEffect(bool8 primary, u8 certain) } else { - gBattleMons[gEffectBattler].status2 |= STATUS2_WRAPPED_TURN((Random() & 3) + 3); // 3-6 turns + gBattleMons[gEffectBattler].status2 |= STATUS2_WRAPPED; + if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_GRIP_CLAW) + gDisableStructs[gEffectBattler].wrapTurns = (B_BINDING_TURNS >= GEN_5) ? 7 : 5; + else + gDisableStructs[gEffectBattler].wrapTurns = (B_BINDING_TURNS >= GEN_5) ? ((Random() % 2) + 4) : ((Random() % 4) + 2); - *(gBattleStruct->wrappedMove + gEffectBattler * 2 + 0) = gCurrentMove; - *(gBattleStruct->wrappedMove + gEffectBattler * 2 + 1) = gCurrentMove >> 8; - *(gBattleStruct->wrappedBy + gEffectBattler) = gBattlerAttacker; + gBattleStruct->wrappedMove[gEffectBattler] = gCurrentMove; + gBattleStruct->wrappedBy[gEffectBattler] = gBattlerAttacker; BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect]; for (gBattleCommunication[MULTISTRING_CHOOSER] = 0; ; gBattleCommunication[MULTISTRING_CHOOSER]++) { - if (gBattleCommunication[MULTISTRING_CHOOSER] > 4) + if (gBattleCommunication[MULTISTRING_CHOOSER] > 5) break; if (gTrappingMoves[gBattleCommunication[MULTISTRING_CHOOSER]] == gCurrentMove) break; } } break; - case MOVE_EFFECT_RECOIL_25: // 25% recoil - gBattleMoveDamage = (gHpDealt) / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; - break; case MOVE_EFFECT_ATK_PLUS_1: case MOVE_EFFECT_DEF_PLUS_1: case MOVE_EFFECT_SPD_PLUS_1: @@ -2613,14 +2618,14 @@ void SetMoveEffect(bool8 primary, u8 certain) case MOVE_EFFECT_ACC_PLUS_1: case MOVE_EFFECT_EVS_PLUS_1: if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(1), - gBattleCommunication[MOVE_EFFECT_BYTE] - MOVE_EFFECT_ATK_PLUS_1 + 1, + gBattleScripting.moveEffect - MOVE_EFFECT_ATK_PLUS_1 + 1, affectsUser, 0)) { gBattlescriptCurrInstr++; } else { - gBattleScripting.animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); + gBattleScripting.animArg1 = gBattleScripting.moveEffect & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); gBattleScripting.animArg2 = 0; BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_StatUp; @@ -2634,14 +2639,14 @@ void SetMoveEffect(bool8 primary, u8 certain) case MOVE_EFFECT_ACC_MINUS_1: case MOVE_EFFECT_EVS_MINUS_1: if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(1) | STAT_BUFF_NEGATIVE, - gBattleCommunication[MOVE_EFFECT_BYTE] - MOVE_EFFECT_ATK_MINUS_1 + 1, + gBattleScripting.moveEffect - MOVE_EFFECT_ATK_MINUS_1 + 1, affectsUser, 0)) { gBattlescriptCurrInstr++; } else { - gBattleScripting.animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); + gBattleScripting.animArg1 = gBattleScripting.moveEffect & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); gBattleScripting.animArg2 = 0; BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_StatDown; @@ -2655,14 +2660,14 @@ void SetMoveEffect(bool8 primary, u8 certain) case MOVE_EFFECT_ACC_PLUS_2: case MOVE_EFFECT_EVS_PLUS_2: if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(2), - gBattleCommunication[MOVE_EFFECT_BYTE] - MOVE_EFFECT_ATK_PLUS_2 + 1, + gBattleScripting.moveEffect - MOVE_EFFECT_ATK_PLUS_2 + 1, affectsUser, 0)) { gBattlescriptCurrInstr++; } else { - gBattleScripting.animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); + gBattleScripting.animArg1 = gBattleScripting.moveEffect & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); gBattleScripting.animArg2 = 0; BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_StatUp; @@ -2676,14 +2681,14 @@ void SetMoveEffect(bool8 primary, u8 certain) case MOVE_EFFECT_ACC_MINUS_2: case MOVE_EFFECT_EVS_MINUS_2: if (ChangeStatBuffs(SET_STAT_BUFF_VALUE(2) | STAT_BUFF_NEGATIVE, - gBattleCommunication[MOVE_EFFECT_BYTE] - MOVE_EFFECT_ATK_MINUS_2 + 1, + gBattleScripting.moveEffect - MOVE_EFFECT_ATK_MINUS_2 + 1, affectsUser, 0)) { gBattlescriptCurrInstr++; } else { - gBattleScripting.animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); + gBattleScripting.animArg1 = gBattleScripting.moveEffect & ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); gBattleScripting.animArg2 = 0; BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_StatDown; @@ -2746,10 +2751,12 @@ void SetMoveEffect(bool8 primary, u8 certain) } else { - u16* changedItem = &gBattleStruct->changedItems[gBattlerAttacker]; - gLastUsedItem = *changedItem = gBattleMons[gBattlerTarget].item; + gLastUsedItem = gBattleStruct->changedItems[gBattlerAttacker] = gBattleMons[gBattlerTarget].item; gBattleMons[gBattlerTarget].item = 0; + CheckSetUnburden(gBattlerTarget); + gBattleResources->flags->flags[gBattlerAttacker] &= ~(RESOURCE_FLAG_UNBURDEN); + gActiveBattler = gBattlerAttacker; BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gLastUsedItem); MarkBattlerForControllerExec(gBattlerAttacker); @@ -2761,8 +2768,7 @@ void SetMoveEffect(bool8 primary, u8 certain) BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_ItemSteal; - *(u8*)((u8*)(&gBattleStruct->choicedMove[gBattlerTarget]) + 0) = 0; - *(u8*)((u8*)(&gBattleStruct->choicedMove[gBattlerTarget]) + 1) = 0; + gBattleStruct->choicedMove[gBattlerTarget] = 0; } } @@ -2784,14 +2790,14 @@ void SetMoveEffect(bool8 primary, u8 certain) BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_RapidSpinAway; break; - case MOVE_EFFECT_REMOVE_PARALYSIS: // Smelling salts - if (!(gBattleMons[gBattlerTarget].status1 & STATUS1_PARALYSIS)) + case MOVE_EFFECT_REMOVE_STATUS: // Smelling salts + if (!(gBattleMons[gBattlerTarget].status1 & gBattleMoves[gCurrentMove].argument)) { gBattlescriptCurrInstr++; } else { - gBattleMons[gBattlerTarget].status1 &= ~(STATUS1_PARALYSIS); + gBattleMons[gBattlerTarget].status1 &= ~(gBattleMoves[gCurrentMove].argument); gActiveBattler = gBattlerTarget; BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); @@ -2805,13 +2811,41 @@ void SetMoveEffect(bool8 primary, u8 certain) BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_AtkDefDown; break; - case MOVE_EFFECT_RECOIL_33: // Double Edge + case MOVE_EFFECT_DEF_SPDEF_DOWN: // Close Combat + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_DefSpDefDown; + break; + case MOVE_EFFECT_RECOIL_25: // Take Down, 25% recoil + gBattleMoveDamage = (gHpDealt) / 4; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect]; + break; + case MOVE_EFFECT_RECOIL_33: // Double Edge, 33 % recoil gBattleMoveDamage = gHpDealt / 3; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect]; + break; + case MOVE_EFFECT_RECOIL_50: // Head Smash, 50 % recoil + gBattleMoveDamage = gHpDealt / 2; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil; + break; + case MOVE_EFFECT_RECOIL_33_STATUS: // Flare Blitz - can burn, Volt Tackle - can paralyze + gBattleScripting.savedDmg = gHpDealt / 3; + if (gBattleScripting.savedDmg == 0) + gBattleScripting.savedDmg = 1; + + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectRecoilWithStatus; break; case MOVE_EFFECT_THRASH: if (gBattleMons[gEffectBattler].status2 & STATUS2_LOCK_CONFUSE) @@ -2825,68 +2859,177 @@ void SetMoveEffect(bool8 primary, u8 certain) gBattleMons[gEffectBattler].status2 |= STATUS2_LOCK_CONFUSE_TURN((Random() & 1) + 2); // thrash for 2-3 turns } break; - case MOVE_EFFECT_KNOCK_OFF: - if (gBattleMons[gEffectBattler].ability == ABILITY_STICKY_HOLD) - { - if (gBattleMons[gEffectBattler].item == 0) - { - gBattlescriptCurrInstr++; - } - else - { - gLastUsedAbility = ABILITY_STICKY_HOLD; - gBattlescriptCurrInstr = BattleScript_StickyHoldActivates; - RecordAbilityBattle(gEffectBattler, ABILITY_STICKY_HOLD); - } - break; - } - if (gBattleMons[gEffectBattler].item) - { - side = GetBattlerSide(gEffectBattler); - - gLastUsedItem = gBattleMons[gEffectBattler].item; - gBattleMons[gEffectBattler].item = 0; - gWishFutureKnock.knockedOffMons[side] |= gBitTable[gBattlerPartyIndexes[gEffectBattler]]; - - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_KnockedOff; - - *(u8*)((u8*)(&gBattleStruct->choicedMove[gEffectBattler]) + 0) = 0; - *(u8*)((u8*)(&gBattleStruct->choicedMove[gEffectBattler]) + 1) = 0; - } - else - { - gBattlescriptCurrInstr++; - } - break; case MOVE_EFFECT_SP_ATK_TWO_DOWN: // Overheat BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_SAtkDown2; break; + case MOVE_EFFECT_CLEAR_SMOG: + for (i = 0; i < NUM_BATTLE_STATS; i++) + { + if (gBattleMons[gEffectBattler].statStages[i] != 6) + break; + } + if ((gSpecialStatuses[gEffectBattler].physicalDmg || gSpecialStatuses[gEffectBattler].specialDmg) && i != NUM_BATTLE_STATS) + { + for (i = 0; i < NUM_BATTLE_STATS; i++) + gBattleMons[gEffectBattler].statStages[i] = 6; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectClearSmog; + } + break; + case MOVE_EFFECT_SMACK_DOWN: + if (!IsBattlerGrounded(gBattlerTarget)) + { + gStatuses3[gBattlerTarget] |= STATUS3_SMACKED_DOWN; + gStatuses3[gBattlerTarget] &= ~(STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS | STATUS3_ON_AIR); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectSmackDown; + } + break; + case MOVE_EFFECT_FLAME_BURST: + if (IsBattlerAlive(BATTLE_PARTNER(gBattlerTarget)) && GetBattlerAbility(BATTLE_PARTNER(gBattlerTarget)) != ABILITY_MAGIC_GUARD) + { + gBattleScripting.battler = BATTLE_PARTNER(gBattlerTarget); + gBattleMoveDamage = gBattleMons[BATTLE_PARTNER(gBattlerTarget)].hp / 16; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattlescriptCurrInstr = BattleScript_MoveEffectFlameBurst; + } + break; + case MOVE_EFFECT_FEINT: + if (gProtectStructs[gBattlerTarget].protected + || gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_WIDE_GUARD + || gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_QUICK_GUARD + || gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_CRAFTY_SHIELD + || gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_MAT_BLOCK + || gProtectStructs[gBattlerTarget].spikyShielded + || gProtectStructs[gBattlerTarget].kingsShielded + || gProtectStructs[gBattlerTarget].banefulBunkered) + { + gProtectStructs[gBattlerTarget].protected = 0; + gSideStatuses[GetBattlerSide(gBattlerTarget)] &= ~(SIDE_STATUS_WIDE_GUARD); + gSideStatuses[GetBattlerSide(gBattlerTarget)] &= ~(SIDE_STATUS_QUICK_GUARD); + gSideStatuses[GetBattlerSide(gBattlerTarget)] &= ~(SIDE_STATUS_CRAFTY_SHIELD); + gSideStatuses[GetBattlerSide(gBattlerTarget)] &= ~(SIDE_STATUS_MAT_BLOCK); + gProtectStructs[gBattlerTarget].spikyShielded = 0; + gProtectStructs[gBattlerTarget].kingsShielded = 0; + gProtectStructs[gBattlerTarget].banefulBunkered = 0; + if (gCurrentMove == MOVE_FEINT) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectFeint; + } + } + break; + case MOVE_EFFECT_SPECTRAL_THIEF: + gBattleStruct->stolenStats[0] = 0; // Stats to steal. + gBattleScripting.animArg1 = 0; + for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) + { + if (gBattleMons[gBattlerTarget].statStages[i] > 6 && gBattleMons[gBattlerAttacker].statStages[i] != 12) + { + gBattleStruct->stolenStats[0] |= gBitTable[i]; + // Store by how many stages to raise the stat. + gBattleStruct->stolenStats[i] = gBattleMons[gBattlerTarget].statStages[i] - 6; + while (gBattleMons[gBattlerAttacker].statStages[i] + gBattleStruct->stolenStats[i] > 12) + gBattleStruct->stolenStats[i]--; + gBattleMons[gBattlerTarget].statStages[i] = 6; + + if (gBattleStruct->stolenStats[i] >= 2) + byTwo++; + + if (gBattleScripting.animArg1 == 0) + { + if (byTwo) + gBattleScripting.animArg1 = STAT_ANIM_PLUS2 - 1 + i; + else + gBattleScripting.animArg1 = STAT_ANIM_PLUS1 - 1 + i; + } + else + { + if (byTwo) + gBattleScripting.animArg1 = STAT_ANIM_MULTIPLE_PLUS2; + else + gBattleScripting.animArg1 = STAT_ANIM_MULTIPLE_PLUS1; + } + } + } + + if (gBattleStruct->stolenStats[0] != 0) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_SpectralThiefSteal; + } + break; + case MOVE_EFFECT_V_CREATE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_VCreateStatLoss; + break; + case MOVE_EFFECT_CORE_ENFORCER: + if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectCoreEnforcer; + } + break; + case MOVE_EFFECT_THROAT_CHOP: + gDisableStructs[gEffectBattler].throatChopTimer = 2; + gBattlescriptCurrInstr++; + break; + case MOVE_EFFECT_INCINERATE: + if ((B_INCINERATE_GEMS >= GEN_6 && GetBattlerHoldEffect(gEffectBattler, FALSE) == HOLD_EFFECT_GEMS) + || (gBattleMons[gEffectBattler].item >= FIRST_BERRY_INDEX && gBattleMons[gEffectBattler].item <= LAST_BERRY_INDEX)) + { + gLastUsedItem = gBattleMons[gEffectBattler].item; + gBattleMons[gEffectBattler].item = 0; + CheckSetUnburden(gEffectBattler); + + gActiveBattler = gEffectBattler; + BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gEffectBattler].item); + MarkBattlerForControllerExec(gActiveBattler); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectIncinerate; + } + break; + case MOVE_EFFECT_BUG_BITE: + if ((gBattleMons[gEffectBattler].item >= FIRST_BERRY_INDEX && gBattleMons[gEffectBattler].item <= LAST_BERRY_INDEX) + && GetBattlerAbility(gEffectBattler) != ABILITY_STICKY_HOLD) + { + gLastUsedItem = gBattleMons[gEffectBattler].item; + gBattleMons[gEffectBattler].item = 0; + CheckSetUnburden(gEffectBattler); + + gActiveBattler = gEffectBattler; + BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gEffectBattler].item); + MarkBattlerForControllerExec(gActiveBattler); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectBugBite; + } + break; } } } - gBattleCommunication[MOVE_EFFECT_BYTE] = 0; + gBattleScripting.moveEffect = 0; } static void Cmd_seteffectwithchance(void) { u32 percentChance; - if (gBattleMons[gBattlerAttacker].ability == ABILITY_SERENE_GRACE) + if (GetBattlerAbility(gBattlerAttacker) == ABILITY_SERENE_GRACE) percentChance = gBattleMoves[gCurrentMove].secondaryEffectChance * 2; else percentChance = gBattleMoves[gCurrentMove].secondaryEffectChance; - if (gBattleCommunication[MOVE_EFFECT_BYTE] & MOVE_EFFECT_CERTAIN + if (gBattleScripting.moveEffect & MOVE_EFFECT_CERTAIN && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { - gBattleCommunication[MOVE_EFFECT_BYTE] &= ~(MOVE_EFFECT_CERTAIN); + gBattleScripting.moveEffect &= ~(MOVE_EFFECT_CERTAIN); SetMoveEffect(FALSE, MOVE_EFFECT_CERTAIN); } else if (Random() % 100 < percentChance - && gBattleCommunication[MOVE_EFFECT_BYTE] + && gBattleScripting.moveEffect && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { if (percentChance >= 100) @@ -2899,7 +3042,7 @@ static void Cmd_seteffectwithchance(void) gBattlescriptCurrInstr++; } - gBattleCommunication[MOVE_EFFECT_BYTE] = 0; + gBattleScripting.moveEffect = 0; gBattleScripting.multihitMoveEffect = 0; } @@ -2917,12 +3060,12 @@ static void Cmd_clearstatusfromeffect(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - if (gBattleCommunication[MOVE_EFFECT_BYTE] <= PRIMARY_STATUS_MOVE_EFFECT) - gBattleMons[gActiveBattler].status1 &= (~sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]); + if (gBattleScripting.moveEffect <= PRIMARY_STATUS_MOVE_EFFECT) + gBattleMons[gActiveBattler].status1 &= (~sStatusFlagsForMoveEffects[gBattleScripting.moveEffect]); else - gBattleMons[gActiveBattler].status2 &= (~sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]); + gBattleMons[gActiveBattler].status2 &= (~sStatusFlagsForMoveEffects[gBattleScripting.moveEffect]); - gBattleCommunication[MOVE_EFFECT_BYTE] = 0; + gBattleScripting.moveEffect = 0; gBattlescriptCurrInstr += 2; gBattleScripting.multihitMoveEffect = 0; } @@ -2940,7 +3083,7 @@ static void Cmd_tryfaintmon(void) BattleScriptPop(); gBattlescriptCurrInstr = BS_ptr; - gSideStatuses[GetBattlerSide(gActiveBattler)] &= ~(SIDE_STATUS_SPIKES_DAMAGED); + gSideStatuses[GetBattlerSide(gActiveBattler)] &= ~(SIDE_STATUS_SPIKES_DAMAGED | SIDE_STATUS_TOXIC_SPIKES_DAMAGED | SIDE_STATUS_STEALTH_ROCK_DAMAGED | SIDE_STATUS_STICKY_WEB_DAMAGED); } else { @@ -3069,101 +3212,115 @@ static void Cmd_jumpifstatus2(void) static void Cmd_jumpifability(void) { - u8 battlerId; - u8 ability = gBattlescriptCurrInstr[2]; - const u8* jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 3); + u32 battlerId; + bool32 hasAbility = FALSE; + u32 ability = gBattlescriptCurrInstr[2]; - if (gBattlescriptCurrInstr[1] == BS_ATTACKER_SIDE) + switch (gBattlescriptCurrInstr[1]) { - battlerId = AbilityBattleEffects(ABILITYEFFECT_CHECK_BATTLER_SIDE, gBattlerAttacker, ability, 0, 0); + default: + battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); + if (GetBattlerAbility(battlerId) == ability) + hasAbility = TRUE; + break; + case BS_ATTACKER_SIDE: + battlerId = IsAbilityOnSide(gBattlerAttacker, ability); if (battlerId) { - gLastUsedAbility = ability; - gBattlescriptCurrInstr = jumpPtr; - RecordAbilityBattle(battlerId - 1, gLastUsedAbility); - gBattleScripting.battlerWithAbility = battlerId - 1; + battlerId--; + hasAbility = TRUE; } - else - gBattlescriptCurrInstr += 7; + break; + case BS_TARGET_SIDE: + battlerId = IsAbilityOnOpposingSide(gBattlerAttacker, ability); + if (battlerId) + { + battlerId--; + hasAbility = TRUE; + } + break; } - else if (gBattlescriptCurrInstr[1] == BS_NOT_ATTACKER_SIDE) + + if (hasAbility) { - battlerId = AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gBattlerAttacker, ability, 0, 0); - if (battlerId) - { - gLastUsedAbility = ability; - gBattlescriptCurrInstr = jumpPtr; - RecordAbilityBattle(battlerId - 1, gLastUsedAbility); - gBattleScripting.battlerWithAbility = battlerId - 1; - } - else - gBattlescriptCurrInstr += 7; + gLastUsedAbility = ability; + gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 3); + RecordAbilityBattle(battlerId, gLastUsedAbility); + gBattlerAbility = battlerId; } else { - battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - if (gBattleMons[battlerId].ability == ability) - { - gLastUsedAbility = ability; - gBattlescriptCurrInstr = jumpPtr; - RecordAbilityBattle(battlerId, gLastUsedAbility); - gBattleScripting.battlerWithAbility = battlerId; - } - else - gBattlescriptCurrInstr += 7; + gBattlescriptCurrInstr += 7; } } static void Cmd_jumpifsideaffecting(void) { u8 side; - u16 flags; - const u8* jumpPtr; + u32 flags; + const u8 *jumpPtr; if (gBattlescriptCurrInstr[1] == BS_ATTACKER) side = GET_BATTLER_SIDE(gBattlerAttacker); else side = GET_BATTLER_SIDE(gBattlerTarget); - flags = T2_READ_16(gBattlescriptCurrInstr + 2); - jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 4); + flags = T2_READ_32(gBattlescriptCurrInstr + 2); + jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 6); if (gSideStatuses[side] & flags) gBattlescriptCurrInstr = jumpPtr; else - gBattlescriptCurrInstr += 8; + gBattlescriptCurrInstr += 10; } static void Cmd_jumpifstat(void) { - u8 ret = 0; + bool32 ret = 0; u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - u8 value = gBattleMons[battlerId].statStages[gBattlescriptCurrInstr[3]]; + u8 statValue = gBattleMons[battlerId].statStages[gBattlescriptCurrInstr[3]]; + u8 cmpTo = gBattlescriptCurrInstr[4]; + u8 cmpKind = gBattlescriptCurrInstr[2]; - switch (gBattlescriptCurrInstr[2]) + // Because this command is used as a way of checking if a stat can be lowered/raised, + // we need to do some modification at run-time. + if (GetBattlerAbility(battlerId) == ABILITY_CONTRARY) + { + if (cmpKind == CMP_GREATER_THAN) + cmpKind = CMP_LESS_THAN; + else if (cmpKind == CMP_LESS_THAN) + cmpKind = CMP_GREATER_THAN; + + if (cmpTo == 0) + cmpTo = 0xC; + else if (cmpTo == 0xC) + cmpTo = 0; + } + + switch (cmpKind) { case CMP_EQUAL: - if (value == gBattlescriptCurrInstr[4]) + if (statValue == cmpTo) ret++; break; case CMP_NOT_EQUAL: - if (value != gBattlescriptCurrInstr[4]) + if (statValue != cmpTo) ret++; break; case CMP_GREATER_THAN: - if (value > gBattlescriptCurrInstr[4]) + if (statValue > cmpTo) ret++; break; case CMP_LESS_THAN: - if (value < gBattlescriptCurrInstr[4]) + if (statValue < cmpTo) ret++; break; case CMP_COMMON_BITS: - if (value & gBattlescriptCurrInstr[4]) + if (statValue & cmpTo) ret++; break; case CMP_NO_COMMON_BITS: - if (!(value & gBattlescriptCurrInstr[4])) + if (!(statValue & cmpTo)) ret++; break; } @@ -3199,16 +3356,28 @@ static void Cmd_jumpifstatus3condition(void) } } -static void Cmd_jumpiftype(void) +static void Cmd_jumpbasedontype(void) { u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); u8 type = gBattlescriptCurrInstr[2]; - const u8* jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 3); + const u8* jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 4); - if (IS_BATTLER_OF_TYPE(battlerId, type)) - gBattlescriptCurrInstr = jumpPtr; + // jumpiftype + if (gBattlescriptCurrInstr[3]) + { + if (IS_BATTLER_OF_TYPE(battlerId, type)) + gBattlescriptCurrInstr = jumpPtr; + else + gBattlescriptCurrInstr += 8; + } + // jumpifnottype else - gBattlescriptCurrInstr += 7; + { + if (!IS_BATTLER_OF_TYPE(battlerId, type)) + gBattlescriptCurrInstr = jumpPtr; + else + gBattlescriptCurrInstr += 8; + } } static void Cmd_getexp(void) @@ -3315,8 +3484,12 @@ static void Cmd_getexp(void) } else { - // music change in wild battle after fainting a poke - if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER) && gBattleMons[0].hp && !gBattleStruct->wildVictorySong) + // Music change in a wild battle after fainting opposing pokemon. + if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER) + && (gBattleMons[0].hp || (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattleMons[2].hp)) + && !IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) + && !IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)) + && !gBattleStruct->wildVictorySong) { BattleStopLowHpSound(); PlayBGM(MUS_VICTORY_WILD); @@ -3334,7 +3507,7 @@ static void Cmd_getexp(void) gBattleMoveDamage += gExpShareExp; if (holdEffect == HOLD_EFFECT_LUCKY_EGG) gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && B_TRAINER_EXP_MULTIPLIER <= GEN_7) gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; if (IsTradedMon(&gPlayerParty[gBattleStruct->expGetterMonId])) @@ -3389,7 +3562,7 @@ static void Cmd_getexp(void) case 3: // Set stats and give exp if (gBattleControllerExecFlags == 0) { - gBattleBufferB[gBattleStruct->expGetterBattlerId][0] = 0; + gBattleResources->bufferB[gBattleStruct->expGetterBattlerId][0] = 0; if (GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_HP) && GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL) != MAX_LEVEL) { gBattleResources->beforeLvlUp->stats[STAT_HP] = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MAX_HP); @@ -3410,8 +3583,9 @@ static void Cmd_getexp(void) if (gBattleControllerExecFlags == 0) { gActiveBattler = gBattleStruct->expGetterBattlerId; - if (gBattleBufferB[gActiveBattler][0] == CONTROLLER_TWORETURNVALUES && gBattleBufferB[gActiveBattler][1] == RET_VALUE_LEVELED_UP) + if (gBattleResources->bufferB[gActiveBattler][0] == CONTROLLER_TWORETURNVALUES && gBattleResources->bufferB[gActiveBattler][1] == RET_VALUE_LEVELED_UP) { + u16 temp, battlerId = 0xFF; if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gBattlerPartyIndexes[gActiveBattler] == gBattleStruct->expGetterMonId) HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); @@ -3421,38 +3595,30 @@ static void Cmd_getexp(void) BattleScriptPushCursor(); gLeveledUpInBattle |= gBitTable[gBattleStruct->expGetterMonId]; gBattlescriptCurrInstr = BattleScript_LevelUp; - gBattleMoveDamage = (gBattleBufferB[gActiveBattler][2] | (gBattleBufferB[gActiveBattler][3] << 8)); + gBattleMoveDamage = (gBattleResources->bufferB[gActiveBattler][2] | (gBattleResources->bufferB[gActiveBattler][3] << 8)); AdjustFriendship(&gPlayerParty[gBattleStruct->expGetterMonId], FRIENDSHIP_EVENT_GROW_LEVEL); // update battle mon structure after level up if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId && gBattleMons[0].hp) - { - gBattleMons[0].level = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL); - gBattleMons[0].hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_HP); - gBattleMons[0].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MAX_HP); - gBattleMons[0].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_ATK); - gBattleMons[0].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_DEF); - // Why is this duplicated? - gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED); - gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED); + battlerId = 0; + else if (gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId && gBattleMons[2].hp && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + battlerId = 2; - gBattleMons[0].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPATK); - gBattleMons[0].spDefense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPDEF); - } - // What is else if? - if (gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId && gBattleMons[2].hp && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + if (battlerId != 0xFF) { - gBattleMons[2].level = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL); - gBattleMons[2].hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_HP); - gBattleMons[2].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MAX_HP); - gBattleMons[2].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_ATK); - gBattleMons[2].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_DEF); - // Duplicated again, but this time there's no Sp Defense - gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED); - gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED); + gBattleMons[battlerId].level = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL); + gBattleMons[battlerId].hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_HP); + gBattleMons[battlerId].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MAX_HP); + gBattleMons[battlerId].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_ATK); + gBattleMons[battlerId].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_DEF); + gBattleMons[battlerId].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED); + gBattleMons[battlerId].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPATK); + gBattleMons[battlerId].spDefense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPDEF); - gBattleMons[2].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPATK); + if (gStatuses3[battlerId] & STATUS3_POWER_TRICK) + SWAP(gBattleMons[battlerId].attack, gBattleMons[battlerId].defense, temp); } + gBattleScripting.getexpState = 5; } else @@ -3488,15 +3654,12 @@ static void Cmd_getexp(void) } } -static void Cmd_unknown_24(void) +static bool32 NoAliveMonsForPlayer(void) { - u16 HP_count = 0; - s32 i; + u32 i; + u32 HP_count = 0; - if (gBattleControllerExecFlags) - return; - - if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId == TRAINER_STEVEN_PARTNER) + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && (gPartnerTrainerId == TRAINER_STEVEN_PARTNER || gPartnerTrainerId >= TRAINER_CUSTOM_PARTNER)) { for (i = 0; i < MULTI_PARTY_SIZE; i++) { @@ -3516,10 +3679,13 @@ static void Cmd_unknown_24(void) } } - if (HP_count == 0) - gBattleOutcome |= B_OUTCOME_LOST; + return (HP_count == 0); +} - HP_count = 0; +static bool32 NoAliveMonsForOpponent(void) +{ + u32 i; + u32 HP_count = 0; for (i = 0; i < PARTY_SIZE; i++) { @@ -3530,13 +3696,29 @@ static void Cmd_unknown_24(void) } } - if (HP_count == 0) + return (HP_count == 0); +} + +bool32 NoAliveMonsForEitherParty(void) +{ + return (NoAliveMonsForPlayer() || NoAliveMonsForOpponent()); +} + +static void atk24(void) +{ + if (gBattleControllerExecFlags) + return; + + if (NoAliveMonsForPlayer()) + gBattleOutcome |= B_OUTCOME_LOST; + if (NoAliveMonsForOpponent()) gBattleOutcome |= B_OUTCOME_WON; if (gBattleOutcome == 0 && (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))) { - s32 foundPlayer = 0, foundOpponent; - for (i = 0; i < gBattlersCount; i += 2) + s32 i, foundPlayer, foundOpponent; + + for (foundPlayer = 0, i = 0; i < gBattlersCount; i += 2) { if ((gHitMarker & HITMARKER_FAINTED2(i)) && (!gSpecialStatuses[i].flag40)) foundPlayer++; @@ -3573,9 +3755,8 @@ static void Cmd_unknown_24(void) static void MoveValuesCleanUp(void) { gMoveResultFlags = 0; - gBattleScripting.dmgMultiplier = 1; - gCritMultiplier = 1; - gBattleCommunication[MOVE_EFFECT_BYTE] = 0; + gIsCriticalHit = FALSE; + gBattleScripting.moveEffect = 0; gBattleCommunication[6] = 0; gHitMarker &= ~(HITMARKER_DESTINYBOND); gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT); @@ -3888,7 +4069,7 @@ static void Cmd_waitstate(void) gBattlescriptCurrInstr++; } -static void Cmd_healthbar_update(void) +static void Cmd_update(void) { if (gBattlescriptCurrInstr[1] == BS_TARGET) gActiveBattler = gBattlerTarget; @@ -3935,19 +4116,42 @@ static void Cmd_call(void) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } -static void Cmd_jumpiftype2(void) +static void Cmd_setroost(void) { - u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); + gBattleResources->flags->flags[gBattlerAttacker] |= RESOURCE_FLAG_ROOST; - if (gBattlescriptCurrInstr[2] == gBattleMons[battlerId].type1 || gBattlescriptCurrInstr[2] == gBattleMons[battlerId].type2) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); - else - gBattlescriptCurrInstr += 7; + // Pure flying type. + if (gBattleMons[gBattlerAttacker].type1 == TYPE_FLYING && gBattleMons[gBattlerAttacker].type2 == TYPE_FLYING) + { + gBattleStruct->roostTypes[gBattlerAttacker][0] = TYPE_FLYING; + gBattleStruct->roostTypes[gBattlerAttacker][1] = TYPE_FLYING; + gBattleStruct->roostTypes[gBattlerAttacker][2] = TYPE_FLYING; + SET_BATTLER_TYPE(gBattlerAttacker, TYPE_NORMAL); + } + // Dual Type with Flying Type. + else if ((gBattleMons[gBattlerAttacker].type1 == TYPE_FLYING && gBattleMons[gBattlerAttacker].type2 != TYPE_FLYING) + ||(gBattleMons[gBattlerAttacker].type2 == TYPE_FLYING && gBattleMons[gBattlerAttacker].type1 != TYPE_FLYING)) + { + gBattleStruct->roostTypes[gBattlerAttacker][0] = gBattleMons[gBattlerAttacker].type1; + gBattleStruct->roostTypes[gBattlerAttacker][1] = gBattleMons[gBattlerAttacker].type2; + if (gBattleMons[gBattlerAttacker].type1 == TYPE_FLYING) + gBattleMons[gBattlerAttacker].type1 = TYPE_MYSTERY; + if (gBattleMons[gBattlerAttacker].type2 == TYPE_FLYING) + gBattleMons[gBattlerAttacker].type2 = TYPE_MYSTERY; + } + // Non-flying type. + else if (!IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_FLYING)) + { + gBattleStruct->roostTypes[gBattlerAttacker][0] = gBattleMons[gBattlerAttacker].type1; + gBattleStruct->roostTypes[gBattlerAttacker][1] = gBattleMons[gBattlerAttacker].type2; + } + + gBattlescriptCurrInstr++; } static void Cmd_jumpifabilitypresent(void) { - if (AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, gBattlescriptCurrInstr[1], 0, 0)) + if (IsAbilityOnField(gBattlescriptCurrInstr[1])) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); else gBattlescriptCurrInstr += 6; @@ -3967,6 +4171,9 @@ static void Cmd_playanimation(void) if (gBattlescriptCurrInstr[2] == B_ANIM_STATS_CHANGE || gBattlescriptCurrInstr[2] == B_ANIM_SNATCH_MOVE + || gBattlescriptCurrInstr[2] == B_ANIM_MEGA_EVOLUTION + || gBattlescriptCurrInstr[2] == B_ANIM_ILLUSION_OFF + || gBattlescriptCurrInstr[2] == B_ANIM_FORM_CHANGE || gBattlescriptCurrInstr[2] == B_ANIM_SUBSTITUTE_FADE) { BtlController_EmitBattleAnimation(0, gBattlescriptCurrInstr[2], *argumentPtr); @@ -4010,6 +4217,9 @@ static void Cmd_playanimation2(void) // animation Id is stored in the first poin if (*animationIdPtr == B_ANIM_STATS_CHANGE || *animationIdPtr == B_ANIM_SNATCH_MOVE + || *animationIdPtr == B_ANIM_MEGA_EVOLUTION + || *animationIdPtr == B_ANIM_ILLUSION_OFF + || *animationIdPtr == B_ANIM_FORM_CHANGE || *animationIdPtr == B_ANIM_SUBSTITUTE_FADE) { BtlController_EmitBattleAnimation(0, *animationIdPtr, *argumentPtr); @@ -4043,8 +4253,9 @@ static void Cmd_playanimation2(void) // animation Id is stored in the first poin static void Cmd_setgraphicalstatchangevalues(void) { - u8 value = 0; - switch (GET_STAT_BUFF_VALUE2(gBattleScripting.statChanger)) + u8 value = GET_STAT_BUFF_VALUE_WITH_SIGN(gBattleScripting.statChanger); + + switch (value) { case SET_STAT_BUFF_VALUE(1): // +1 value = STAT_ANIM_PLUS1; @@ -4052,12 +4263,24 @@ static void Cmd_setgraphicalstatchangevalues(void) case SET_STAT_BUFF_VALUE(2): // +2 value = STAT_ANIM_PLUS2; break; + case SET_STAT_BUFF_VALUE(3): // +3 + value = STAT_ANIM_PLUS2; + break; case SET_STAT_BUFF_VALUE(1) | STAT_BUFF_NEGATIVE: // -1 value = STAT_ANIM_MINUS1; break; case SET_STAT_BUFF_VALUE(2) | STAT_BUFF_NEGATIVE: // -2 value = STAT_ANIM_MINUS2; break; + case SET_STAT_BUFF_VALUE(3) | STAT_BUFF_NEGATIVE: // -3 + value = STAT_ANIM_MINUS2; + break; + default: // <-12,-4> and <4, 12> + if (value & STAT_BUFF_NEGATIVE) + value = STAT_ANIM_MINUS2; + else + value = STAT_ANIM_PLUS2; + break; } gBattleScripting.animArg1 = GET_STAT_BUFF_ID(gBattleScripting.statChanger) + value - 1; gBattleScripting.animArg2 = 0; @@ -4066,18 +4289,27 @@ static void Cmd_setgraphicalstatchangevalues(void) static void Cmd_playstatchangeanimation(void) { + u32 ability; u32 currStat = 0; - u16 statAnimId = 0; - s32 changeableStatsCount = 0; - u8 statsToCheck = 0; + u32 statAnimId = 0; + u32 changeableStatsCount = 0; + u32 statsToCheck = 0; + u32 startingStatAnimId = 0; + u32 flags = gBattlescriptCurrInstr[3]; gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); + ability = GetBattlerAbility(gActiveBattler); statsToCheck = gBattlescriptCurrInstr[2]; - if (gBattlescriptCurrInstr[3] & STAT_CHANGE_NEGATIVE) // goes down + // Handle Contrary and Simple + if (ability == ABILITY_CONTRARY) + flags ^= STAT_CHANGE_NEGATIVE; + else if (ability == ABILITY_SIMPLE) + flags |= STAT_CHANGE_BY_TWO; + + if (flags & STAT_CHANGE_NEGATIVE) // goes down { - s16 startingStatAnimId; - if (gBattlescriptCurrInstr[3] & STAT_CHANGE_BY_TWO) + if (flags & STAT_CHANGE_BY_TWO) startingStatAnimId = STAT_ANIM_MINUS2 - 1; else startingStatAnimId = STAT_ANIM_MINUS1 - 1; @@ -4086,7 +4318,7 @@ static void Cmd_playstatchangeanimation(void) { if (statsToCheck & 1) { - if (gBattlescriptCurrInstr[3] & STAT_CHANGE_CANT_PREVENT) + if (flags & STAT_CHANGE_CANT_PREVENT) { if (gBattleMons[gActiveBattler].statStages[currStat] > MIN_STAT_STAGE) { @@ -4095,10 +4327,12 @@ static void Cmd_playstatchangeanimation(void) } } else if (!gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].mistTimer - && gBattleMons[gActiveBattler].ability != ABILITY_CLEAR_BODY - && gBattleMons[gActiveBattler].ability != ABILITY_WHITE_SMOKE - && !(gBattleMons[gActiveBattler].ability == ABILITY_KEEN_EYE && currStat == STAT_ACC) - && !(gBattleMons[gActiveBattler].ability == ABILITY_HYPER_CUTTER && currStat == STAT_ATK)) + && ability != ABILITY_CLEAR_BODY + && ability != ABILITY_FULL_METAL_BODY + && ability != ABILITY_WHITE_SMOKE + && !(ability == ABILITY_KEEN_EYE && currStat == STAT_ACC) + && !(ability == ABILITY_HYPER_CUTTER && currStat == STAT_ATK) + && !(ability == ABILITY_BIG_PECKS && currStat == STAT_DEF)) { if (gBattleMons[gActiveBattler].statStages[currStat] > MIN_STAT_STAGE) { @@ -4112,7 +4346,7 @@ static void Cmd_playstatchangeanimation(void) if (changeableStatsCount > 1) // more than one stat, so the color is gray { - if (gBattlescriptCurrInstr[3] & STAT_CHANGE_BY_TWO) + if (flags & STAT_CHANGE_BY_TWO) statAnimId = STAT_ANIM_MULTIPLE_MINUS2; else statAnimId = STAT_ANIM_MULTIPLE_MINUS1; @@ -4120,8 +4354,7 @@ static void Cmd_playstatchangeanimation(void) } else // goes up { - s16 startingStatAnimId; - if (gBattlescriptCurrInstr[3] & STAT_CHANGE_BY_TWO) + if (flags & STAT_CHANGE_BY_TWO) startingStatAnimId = STAT_ANIM_PLUS2 - 1; else startingStatAnimId = STAT_ANIM_PLUS1 - 1; @@ -4138,14 +4371,14 @@ static void Cmd_playstatchangeanimation(void) if (changeableStatsCount > 1) // more than one stat, so the color is gray { - if (gBattlescriptCurrInstr[3] & STAT_CHANGE_BY_TWO) + if (flags & STAT_CHANGE_BY_TWO) statAnimId = STAT_ANIM_MULTIPLE_PLUS2; else statAnimId = STAT_ANIM_MULTIPLE_PLUS1; } } - if (gBattlescriptCurrInstr[3] & STAT_CHANGE_MULTIPLE_STATS && changeableStatsCount < 2) + if (flags & STAT_CHANGE_ONLY_MULTIPLE && changeableStatsCount < 2) { gBattlescriptCurrInstr += 4; } @@ -4153,7 +4386,7 @@ static void Cmd_playstatchangeanimation(void) { BtlController_EmitBattleAnimation(0, B_ANIM_STATS_CHANGE, statAnimId); MarkBattlerForControllerExec(gActiveBattler); - if (gBattlescriptCurrInstr[3] & STAT_CHANGE_MULTIPLE_STATS && changeableStatsCount > 1) + if (flags & STAT_CHANGE_ONLY_MULTIPLE && changeableStatsCount > 1) gBattleScripting.statAnimPlayed = TRUE; gBattlescriptCurrInstr += 4; } @@ -4163,15 +4396,45 @@ static void Cmd_playstatchangeanimation(void) } } +static bool32 TryKnockOffBattleScript(u32 battlerDef) +{ + if (gBattleMons[battlerDef].item != 0 + && CanBattlerGetOrLoseItem(battlerDef, gBattleMons[battlerDef].item) + && !NoAliveMonsForEitherParty()) + { + if (GetBattlerAbility(battlerDef) == ABILITY_STICKY_HOLD && IsBattlerAlive(battlerDef)) + { + gBattlerAbility = battlerDef; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_StickyHoldActivates; + } + else + { + u32 side = GetBattlerSide(battlerDef); + + gLastUsedItem = gBattleMons[battlerDef].item; + gBattleMons[battlerDef].item = 0; + gBattleStruct->choicedMove[battlerDef] = 0; + gWishFutureKnock.knockedOffMons[side] |= gBitTable[gBattlerPartyIndexes[battlerDef]]; + CheckSetUnburden(battlerDef); + + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_KnockedOff; + } + return TRUE; + } + return FALSE; +} + static void Cmd_moveend(void) { s32 i; bool32 effect = FALSE; - u8 moveType = 0; - u8 holdEffectAtk = 0; + u32 moveType = 0; + u32 holdEffectAtk = 0; u16 *choicedMoveAtk = NULL; - u8 arg1, arg2; - u16 originallyUsedMove; + u32 arg1, arg2; + u32 originallyUsedMove; if (gChosenMove == 0xFFFF) originallyUsedMove = 0; @@ -4181,11 +4444,7 @@ static void Cmd_moveend(void) arg1 = gBattlescriptCurrInstr[1]; arg2 = gBattlescriptCurrInstr[2]; - if (gBattleMons[gBattlerAttacker].item == ITEM_ENIGMA_BERRY) - holdEffectAtk = gEnigmaBerries[gBattlerAttacker].holdEffect; - else - holdEffectAtk = ItemId_GetHoldEffect(gBattleMons[gBattlerAttacker].item); - + holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker, TRUE); choicedMoveAtk = &gBattleStruct->choicedMove[gBattlerAttacker]; GET_MOVE_TYPE(gCurrentMove, moveType); @@ -4193,6 +4452,40 @@ static void Cmd_moveend(void) { switch (gBattleScripting.moveendState) { + case MOVEEND_PROTECT_LIKE_EFFECT: + if (gBattleMoves[gCurrentMove].flags & FLAG_MAKES_CONTACT) + { + if (gProtectStructs[gBattlerTarget].spikyShielded && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) + { + gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 8; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_SPIKY_SHIELD); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_SpikyShieldEffect; + effect = 1; + } + else if (gProtectStructs[gBattlerTarget].kingsShielded) + { + i = gBattlerAttacker; + gBattlerAttacker = gBattlerTarget; + gBattlerTarget = i; // gBattlerTarget and gBattlerAttacker are swapped in order to activate Defiant, if applicable + gBattleScripting.moveEffect = (B_KINGS_SHIELD_LOWER_ATK >= GEN_8) ? MOVE_EFFECT_ATK_MINUS_1 : MOVE_EFFECT_ATK_MINUS_2; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_KingsShieldEffect; + effect = 1; + } + else if (gProtectStructs[gBattlerTarget].banefulBunkered) + { + gBattleScripting.moveEffect = MOVE_EFFECT_POISON | MOVE_EFFECT_AFFECTS_USER; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_BANEFUL_BUNKER); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_BanefulBunkerEffect; + effect = 1; + } + } + gBattleScripting.moveendState++; + break; case MOVEEND_RAGE: // rage check if (gBattleMons[gBattlerTarget].status2 & STATUS2_RAGE && gBattleMons[gBattlerTarget].hp != 0 && gBattlerAttacker != gBattlerTarget @@ -4211,7 +4504,7 @@ static void Cmd_moveend(void) if (gBattleMons[gBattlerTarget].status1 & STATUS1_FREEZE && gBattleMons[gBattlerTarget].hp != 0 && gBattlerAttacker != gBattlerTarget && gSpecialStatuses[gBattlerTarget].specialDmg - && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && moveType == TYPE_FIRE) + && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && (moveType == TYPE_FIRE || gBattleMoves[gCurrentMove].effect == EFFECT_SCALD)) { gBattleMons[gBattlerTarget].status1 &= ~(STATUS1_FREEZE); gActiveBattler = gBattlerTarget; @@ -4228,12 +4521,17 @@ static void Cmd_moveend(void) effect = TRUE; gBattleScripting.moveendState++; break; - case MOVEEND_ON_DAMAGE_ABILITIES: // Contact abilities and Color Change - if (AbilityBattleEffects(ABILITYEFFECT_ON_DAMAGE, gBattlerTarget, 0, 0, 0)) + case MOVEEND_ABILITIES: // Such as abilities activating on contact(Poison Spore, Rough Skin, etc.). + if (AbilityBattleEffects(ABILITYEFFECT_MOVE_END, gBattlerTarget, 0, 0, 0)) effect = TRUE; gBattleScripting.moveendState++; break; - case MOVEEND_IMMUNITY_ABILITIES: // status immunities + case MOVEEND_ABILITIES_ATTACKER: // Poison Touch, possibly other in the future + if (AbilityBattleEffects(ABILITYEFFECT_MOVE_END_ATTACKER, gBattlerAttacker, 0, 0, 0)) + effect = TRUE; + gBattleScripting.moveendState++; + break; + case MOVEEND_STATUS_IMMUNITY_ABILITIES: // status immunities if (AbilityBattleEffects(ABILITYEFFECT_IMMUNITY, 0, 0, 0, 0)) effect = TRUE; // it loops through all battlers, so we increment after its done with all battlers else @@ -4246,11 +4544,14 @@ static void Cmd_moveend(void) break; case MOVEEND_CHOICE_MOVE: // update choice band move if (gHitMarker & HITMARKER_OBEYS - && holdEffectAtk == HOLD_EFFECT_CHOICE_BAND + && HOLD_EFFECT_CHOICE(holdEffectAtk) && gChosenMove != MOVE_STRUGGLE && (*choicedMoveAtk == 0 || *choicedMoveAtk == 0xFFFF)) { - if (gChosenMove == MOVE_BATON_PASS && !(gMoveResultFlags & MOVE_RESULT_FAILED)) + if ((gBattleMoves[gChosenMove].effect == EFFECT_BATON_PASS + || gBattleMoves[gChosenMove].effect == EFFECT_HEALING_WISH + || gBattleMoves[gChosenMove].effect == EFFECT_HIT_ESCAPE) + && !(gMoveResultFlags & MOVE_RESULT_FAILED)) { ++gBattleScripting.moveendState; break; @@ -4269,15 +4570,29 @@ static void Cmd_moveend(void) case MOVEEND_CHANGED_ITEMS: // changed held items for (i = 0; i < gBattlersCount; i++) { - u16* changedItem = &gBattleStruct->changedItems[i]; - if (*changedItem != 0) + if (gBattleStruct->changedItems[i] != 0) { - gBattleMons[i].item = *changedItem; - *changedItem = 0; + gBattleMons[i].item = gBattleStruct->changedItems[i]; + gBattleStruct->changedItems[i] = 0; } } gBattleScripting.moveendState++; break; + case MOVEEND_ITEM_EFFECTS_TARGET: + if (ItemBattleEffects(ITEMEFFECT_TARGET, gBattlerTarget, FALSE)) + effect = TRUE; + gBattleScripting.moveendState++; + break; + case MOVEEND_MOVE_EFFECTS2: // For effects which should happen after target items, for example Knock Off after damage from Rocky Helmet. + switch (gBattleStruct->moveEffect2) + { + case MOVE_EFFECT_KNOCK_OFF: + effect = TryKnockOffBattleScript(gBattlerTarget); + break; + } + gBattleStruct->moveEffect2 = 0; + gBattleScripting.moveendState++; + break; case MOVEEND_ITEM_EFFECTS_ALL: // item effects for all battlers if (ItemBattleEffects(ITEMEFFECT_MOVE_END, 0, FALSE)) effect = TRUE; @@ -4338,6 +4653,11 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_UPDATE_LAST_MOVES: + if (gMoveResultFlags & (MOVE_RESULT_FAILED | MOVE_RESULT_DOESNT_AFFECT_FOE)) + gBattleStruct->lastMoveFailed |= gBitTable[gBattlerAttacker]; + else + gBattleStruct->lastMoveFailed &= ~(gBitTable[gBattlerAttacker]); + if (gHitMarker & HITMARKER_SWAP_ATTACKER_TARGET) { gActiveBattler = gBattlerAttacker; @@ -4345,18 +4665,27 @@ static void Cmd_moveend(void) gBattlerTarget = gActiveBattler; gHitMarker &= ~(HITMARKER_SWAP_ATTACKER_TARGET); } - if (gHitMarker & HITMARKER_ATTACKSTRING_PRINTED) + if (!gSpecialStatuses[gBattlerAttacker].dancerUsedMove) { - gLastPrintedMoves[gBattlerAttacker] = gChosenMove; + gDisableStructs[gBattlerAttacker].usedMoves |= gBitTable[gCurrMovePos]; + gBattleStruct->lastMoveTarget[gBattlerAttacker] = gBattlerTarget; + if (gHitMarker & HITMARKER_ATTACKSTRING_PRINTED) + { + gLastPrintedMoves[gBattlerAttacker] = gChosenMove; + gLastUsedMove = gCurrentMove; + } } if (!(gAbsentBattlerFlags & gBitTable[gBattlerAttacker]) && !(gBattleStruct->field_91 & gBitTable[gBattlerAttacker]) - && gBattleMoves[originallyUsedMove].effect != EFFECT_BATON_PASS) + && gBattleMoves[originallyUsedMove].effect != EFFECT_BATON_PASS + && gBattleMoves[originallyUsedMove].effect != EFFECT_HEALING_WISH) { if (gHitMarker & HITMARKER_OBEYS) - { - gLastMoves[gBattlerAttacker] = gChosenMove; - gLastResultingMoves[gBattlerAttacker] = gCurrentMove; + { if (!gSpecialStatuses[gBattlerAttacker].dancerUsedMove) + { + gLastMoves[gBattlerAttacker] = gChosenMove; + gLastResultingMoves[gBattlerAttacker] = gCurrentMove; + } } else { @@ -4392,33 +4721,43 @@ static void Cmd_moveend(void) && gBattlerAttacker != gBattlerTarget && !(gHitMarker & HITMARKER_FAINTED(gBattlerTarget)) && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { - u8 target, attacker; - - *(gBattleStruct->lastTakenMove + gBattlerTarget * 2 + 0) = gChosenMove; - *(gBattleStruct->lastTakenMove + gBattlerTarget * 2 + 1) = gChosenMove >> 8; - - target = gBattlerTarget; - attacker = gBattlerAttacker; - *(attacker * 2 + target * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 0) = gChosenMove; - - target = gBattlerTarget; - attacker = gBattlerAttacker; - *(attacker * 2 + target * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 1) = gChosenMove >> 8; + gBattleStruct->lastTakenMove[gBattlerTarget] = gChosenMove; + gBattleStruct->lastTakenMoveFrom[gBattlerTarget][gBattlerAttacker] = gChosenMove; } gBattleScripting.moveendState++; break; case MOVEEND_NEXT_TARGET: // For moves hitting two opposing Pokemon. - if (!(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && gBattleTypeFlags & BATTLE_TYPE_DOUBLE - && !gProtectStructs[gBattlerAttacker].chargingTurn && gBattleMoves[gCurrentMove].target == MOVE_TARGET_BOTH + if (!(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) + && gBattleTypeFlags & BATTLE_TYPE_DOUBLE + && !gProtectStructs[gBattlerAttacker].chargingTurn + && (gBattleMoves[gCurrentMove].target == MOVE_TARGET_BOTH || gBattleMoves[gCurrentMove].target == MOVE_TARGET_FOES_AND_ALLY) && !(gHitMarker & HITMARKER_NO_ATTACKSTRING)) { - u8 battlerId = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerTarget))); - if (gBattleMons[battlerId].hp != 0) + u8 battlerId; + + if (gBattleMoves[gCurrentMove].target == MOVE_TARGET_FOES_AND_ALLY) + { + gHitMarker |= HITMARKER_NO_PPDEDUCT; + for (battlerId = gBattlerTarget + 1; battlerId < gBattlersCount; battlerId++) + { + if (battlerId == gBattlerAttacker) + continue; + if (IsBattlerAlive(battlerId)) + break; + } + } + else + { + battlerId = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerTarget))); + gHitMarker |= HITMARKER_NO_ATTACKSTRING; + } + + if (IsBattlerAlive(battlerId)) { gBattlerTarget = battlerId; - gHitMarker |= HITMARKER_NO_ATTACKSTRING; gBattleScripting.moveendState = 0; MoveValuesCleanUp(); + gBattleScripting.moveEffect = gBattleScripting.savedMoveEffect; BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]); gBattlescriptCurrInstr = BattleScript_FlushMessageBox; return; @@ -4426,8 +4765,98 @@ static void Cmd_moveend(void) else { gHitMarker |= HITMARKER_NO_ATTACKSTRING; + gHitMarker &= ~(HITMARKER_NO_PPDEDUCT); } } + RecordLastUsedMoveBy(gBattlerAttacker, gCurrentMove); + gBattleScripting.moveendState++; + break; + case MOVEEND_LIFE_ORB: + if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIFE_ORB + && IsBattlerAlive(gBattlerAttacker) + && !(GetBattlerAbility(gBattlerAttacker) == ABILITY_SHEER_FORCE && gBattleMoves[gCurrentMove].flags & FLAG_SHEER_FORCE_BOOST) + && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD + && gSpecialStatuses[gBattlerAttacker].damagedMons) + { + gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 10; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + effect = TRUE; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ItemHurtRet; + gLastUsedItem = gBattleMons[gBattlerAttacker].item; + } + gBattleScripting.moveendState++; + break; + case MOVEEND_DANCER: // Special case because it's so annoying + if (gBattleMoves[gCurrentMove].flags & FLAG_DANCE) + { + u8 battler, nextDancer = 0; + + if (!(gBattleStruct->lastMoveFailed & gBitTable[gBattlerAttacker] + || (!gSpecialStatuses[gBattlerAttacker].dancerUsedMove + && gProtectStructs[gBattlerAttacker].usesBouncedMove))) + { // Dance move succeeds + // Set target for other Dancer mons; set bit so that mon cannot activate Dancer off of its own move + if (!gSpecialStatuses[gBattlerAttacker].dancerUsedMove) + { + gBattleScripting.savedBattler = gBattlerTarget | 0x4; + gBattleScripting.savedBattler |= (gBattlerAttacker << 4); + gSpecialStatuses[gBattlerAttacker].dancerUsedMove = 1; + } + for (battler = 0; battler < MAX_BATTLERS_COUNT; battler++) + { + if (GetBattlerAbility(battler) == ABILITY_DANCER && !gSpecialStatuses[battler].dancerUsedMove) + { + if (!nextDancer || (gBattleMons[battler].speed < gBattleMons[nextDancer & 0x3].speed)) + nextDancer = battler | 0x4; + } + } + if (nextDancer && AbilityBattleEffects(ABILITYEFFECT_MOVE_END_OTHER, nextDancer & 0x3, 0, 0, 0)) + effect = TRUE; + } + } + gBattleScripting.moveendState++; + break; + case MOVEEND_EMERGENCY_EXIT: // Special case, because moves hitting multiple opponents stop after switching out + for (i = 0; i < gBattlersCount; i++) + { + if (gBattleResources->flags->flags[i] & RESOURCE_FLAG_EMERGENCY_EXIT) + { + gBattleResources->flags->flags[i] &= ~(RESOURCE_FLAG_EMERGENCY_EXIT); + gBattlerTarget = gBattlerAbility = i; + BattleScriptPushCursor(); + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER || GetBattlerSide(i) == B_SIDE_PLAYER) + { + if (B_ABILITY_POP_UP >= GEN_6) + gBattlescriptCurrInstr = BattleScript_EmergencyExit; + else + gBattlescriptCurrInstr = BattleScript_EmergencyExitNoPopUp; + } + else + { + if (B_ABILITY_POP_UP >= GEN_6) + gBattlescriptCurrInstr = BattleScript_EmergencyExitWild; + else + gBattlescriptCurrInstr = BattleScript_EmergencyExitWildNoPopUp; + } + return; + } + } + gBattleScripting.moveendState++; + break; + case MOVEEND_CLEAR_BITS: // Clear/Set bits for things like using a move for all targets and all hits. + if (gSpecialStatuses[gBattlerAttacker].instructedChosenTarget) + *(gBattleStruct->moveTarget + gBattlerAttacker) = gSpecialStatuses[gBattlerAttacker].instructedChosenTarget & 0x3; + if (gSpecialStatuses[gBattlerAttacker].dancerOriginalTarget) + *(gBattleStruct->moveTarget + gBattlerAttacker) = gSpecialStatuses[gBattlerAttacker].dancerOriginalTarget & 0x3; + gProtectStructs[gBattlerAttacker].usesBouncedMove = 0; + gBattleStruct->ateBoost[gBattlerAttacker] = 0; + gStatuses3[gBattlerAttacker] &= ~(STATUS3_ME_FIRST); + gSpecialStatuses[gBattlerAttacker].gemBoost = 0; + gSpecialStatuses[gBattlerAttacker].damagedMons = 0; + gSpecialStatuses[gBattlerTarget].berryReduced = 0; + gBattleScripting.moveEffect = 0; gBattleScripting.moveendState++; break; case MOVEEND_COUNT: @@ -4445,99 +4874,18 @@ static void Cmd_moveend(void) gBattlescriptCurrInstr += 3; } -static void Cmd_typecalc2(void) +static void Cmd_sethealblock(void) { - u8 flags = 0; - s32 i = 0; - u8 moveType = gBattleMoves[gCurrentMove].type; - - if (gBattleMons[gBattlerTarget].ability == ABILITY_LEVITATE && moveType == TYPE_GROUND) + if (gStatuses3[gBattlerTarget] & STATUS3_HEAL_BLOCK) { - gLastUsedAbility = gBattleMons[gBattlerTarget].ability; - gMoveResultFlags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); - gLastLandedMoves[gBattlerTarget] = 0; - gBattleCommunication[6] = moveType; - RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { - while (TYPE_EFFECT_ATK_TYPE(i) != TYPE_ENDTABLE) - { - if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT) - { - if (gBattleMons[gBattlerTarget].status2 & STATUS2_FORESIGHT) - { - break; - } - else - { - i += 3; - continue; - } - } - - if (TYPE_EFFECT_ATK_TYPE(i) == moveType) - { - // check type1 - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type1) - { - if (TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NO_EFFECT) - { - gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; - break; - } - if (TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NOT_EFFECTIVE) - { - flags |= MOVE_RESULT_NOT_VERY_EFFECTIVE; - } - if (TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_SUPER_EFFECTIVE) - { - flags |= MOVE_RESULT_SUPER_EFFECTIVE; - } - } - // check type2 - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2) - { - if (gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2 - && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NO_EFFECT) - { - gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; - break; - } - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2 - && gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2 - && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_NOT_EFFECTIVE) - { - flags |= MOVE_RESULT_NOT_VERY_EFFECTIVE; - } - if (TYPE_EFFECT_DEF_TYPE(i) == gBattleMons[gBattlerTarget].type2 - && gBattleMons[gBattlerTarget].type1 != gBattleMons[gBattlerTarget].type2 - && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_SUPER_EFFECTIVE) - { - flags |= MOVE_RESULT_SUPER_EFFECTIVE; - } - } - } - i += 3; - } + gStatuses3[gBattlerTarget] |= STATUS3_HEAL_BLOCK; + gDisableStructs[gBattlerTarget].healBlockTimer = 5; + gBattlescriptCurrInstr += 5; } - - if (gBattleMons[gBattlerTarget].ability == ABILITY_WONDER_GUARD - && !(flags & MOVE_RESULT_NO_EFFECT) - && AttacksThisTurn(gBattlerAttacker, gCurrentMove) == 2 - && (!(flags & MOVE_RESULT_SUPER_EFFECTIVE) || ((flags & (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE)) == (MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE))) - && gBattleMoves[gCurrentMove].power) - { - gLastUsedAbility = ABILITY_WONDER_GUARD; - gMoveResultFlags |= MOVE_RESULT_MISSED; - gLastLandedMoves[gBattlerTarget] = 0; - gBattleCommunication[6] = 3; - RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); - } - if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) - gProtectStructs[gBattlerAttacker].targetNotAffected = 1; - - gBattlescriptCurrInstr++; } static void Cmd_returnatktoball(void) @@ -4581,11 +4929,12 @@ static void Cmd_switchindataupdate(void) for (i = 0; i < sizeof(struct BattlePokemon); i++) { - monData[i] = gBattleBufferB[gActiveBattler][4 + i]; + monData[i] = gBattleResources->bufferB[gActiveBattler][4 + i]; } gBattleMons[gActiveBattler].type1 = gBaseStats[gBattleMons[gActiveBattler].species].type1; gBattleMons[gActiveBattler].type2 = gBaseStats[gBattleMons[gActiveBattler].species].type2; + gBattleMons[gActiveBattler].type3 = TYPE_MYSTERY; gBattleMons[gActiveBattler].ability = GetAbilityBySpecies(gBattleMons[gActiveBattler].species, gBattleMons[gActiveBattler].abilityNum); // check knocked off item @@ -4606,9 +4955,9 @@ static void Cmd_switchindataupdate(void) SwitchInClearSetData(); - if (gBattleTypeFlags & BATTLE_TYPE_PALACE + if (gBattleTypeFlags & BATTLE_TYPE_PALACE && gBattleMons[gActiveBattler].maxHP / 2 >= gBattleMons[gActiveBattler].hp - && gBattleMons[gActiveBattler].hp != 0 + && gBattleMons[gActiveBattler].hp != 0 && !(gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP)) { gBattleStruct->palaceFlags |= gBitTable[gActiveBattler]; @@ -4647,34 +4996,39 @@ static void Cmd_switchinanim(void) BattleArena_InitPoints(); } -static void Cmd_jumpifcantswitch(void) +bool32 CanBattlerSwitch(u32 battlerId) { - s32 i; - s32 lastMonId; + s32 i, lastMonId, battlerIn1, battlerIn2; + bool32 ret = FALSE; struct Pokemon *party; - gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1] & ~(SWITCH_IGNORE_ESCAPE_PREVENTION)); - - if (!(gBattlescriptCurrInstr[1] & SWITCH_IGNORE_ESCAPE_PREVENTION) - && ((gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) - || (gStatuses3[gActiveBattler] & STATUS3_ROOTED))) + if (BATTLE_TWO_VS_ONE_OPPONENT && GetBattlerSide(battlerId) == B_SIDE_OPPONENT) { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); - return; + battlerIn1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + battlerIn2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); + party = gEnemyParty; + + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&party[i], MON_DATA_HP) != 0 + && GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE + && !GetMonData(&party[i], MON_DATA_IS_EGG) + && i != gBattlerPartyIndexes[battlerIn1] && i != gBattlerPartyIndexes[battlerIn2]) + break; + } + + ret = (i != PARTY_SIZE); } if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) { - #ifndef NONMATCHING - asm("":::"r5"); - #endif // NONMATCHING - if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT) + if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT) party = gEnemyParty; else party = gPlayerParty; i = 0; - if (gActiveBattler & 2) + if (battlerId & 2) i = 3; for (lastMonId = i + 3; i < lastMonId; i++) @@ -4682,32 +5036,29 @@ static void Cmd_jumpifcantswitch(void) if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE && !GetMonData(&party[i], MON_DATA_IS_EGG) && GetMonData(&party[i], MON_DATA_HP) != 0 - && gBattlerPartyIndexes[gActiveBattler] != i) + && gBattlerPartyIndexes[battlerId] != i) break; } - if (i == lastMonId) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); - else - gBattlescriptCurrInstr += 6; + ret = (i != lastMonId); } else if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { if (gBattleTypeFlags & BATTLE_TYPE_x800000) { - if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) + if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) { party = gPlayerParty; i = 0; - if (GetLinkTrainerFlankId(GetBattlerMultiplayerId(gActiveBattler)) == TRUE) + if (GetLinkTrainerFlankId(GetBattlerMultiplayerId(battlerId)) == TRUE) i = 3; } else { party = gEnemyParty; - if (gActiveBattler == 1) + if (battlerId == 1) i = 0; else i = 3; @@ -4715,13 +5066,13 @@ static void Cmd_jumpifcantswitch(void) } else { - if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT) + if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT) party = gEnemyParty; else party = gPlayerParty; i = 0; - if (GetLinkTrainerFlankId(GetBattlerMultiplayerId(gActiveBattler)) == TRUE) + if (GetLinkTrainerFlankId(GetBattlerMultiplayerId(battlerId)) == TRUE) i = 3; } @@ -4730,21 +5081,18 @@ static void Cmd_jumpifcantswitch(void) if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE && !GetMonData(&party[i], MON_DATA_IS_EGG) && GetMonData(&party[i], MON_DATA_HP) != 0 - && gBattlerPartyIndexes[gActiveBattler] != i) + && gBattlerPartyIndexes[battlerId] != i) break; } - if (i == lastMonId) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); - else - gBattlescriptCurrInstr += 6; + ret = (i != lastMonId); } - else if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT) + else if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && GetBattlerSide(battlerId) == B_SIDE_OPPONENT) { party = gEnemyParty; i = 0; - if (gActiveBattler == B_POSITION_OPPONENT_RIGHT) + if (battlerId == B_POSITION_OPPONENT_RIGHT) i = 3; for (lastMonId = i + 3; i < lastMonId; i++) @@ -4752,20 +5100,15 @@ static void Cmd_jumpifcantswitch(void) if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE && !GetMonData(&party[i], MON_DATA_IS_EGG) && GetMonData(&party[i], MON_DATA_HP) != 0 - && gBattlerPartyIndexes[gActiveBattler] != i) + && gBattlerPartyIndexes[battlerId] != i) break; } - if (i == lastMonId) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); - else - gBattlescriptCurrInstr += 6; + ret = (i != lastMonId); } else { - u8 battlerIn1, battlerIn2; - - if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT) + if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT) { battlerIn1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); @@ -4797,10 +5140,26 @@ static void Cmd_jumpifcantswitch(void) break; } - if (i == PARTY_SIZE) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); - else + ret = (i != PARTY_SIZE); + } + return ret; +} + +static void Cmd_jumpifcantswitch(void) +{ + gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1] & ~(SWITCH_IGNORE_ESCAPE_PREVENTION)); + + if (!(gBattlescriptCurrInstr[1] & SWITCH_IGNORE_ESCAPE_PREVENTION) + && !CanBattlerEscape(gActiveBattler)) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); + } + else + { + if (CanBattlerSwitch(gActiveBattler)) gBattlescriptCurrInstr += 6; + else + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); } } @@ -4990,7 +5349,7 @@ static void Cmd_openpartyscreen(void) if (gBitTable[2] & hitmarkerFaintBits && gBitTable[0] & hitmarkerFaintBits) { gActiveBattler = 2; - if (HasNoMonsToSwitch(2, gBattleBufferB[0][1], 6)) + if (HasNoMonsToSwitch(2, gBattleResources->bufferB[0][1], 6)) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler)); @@ -5006,7 +5365,7 @@ static void Cmd_openpartyscreen(void) if (gBitTable[3] & hitmarkerFaintBits && hitmarkerFaintBits & gBitTable[1]) { gActiveBattler = 3; - if (HasNoMonsToSwitch(3, gBattleBufferB[1][1], 6)) + if (HasNoMonsToSwitch(3, gBattleResources->bufferB[1][1], 6)) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler)); @@ -5117,12 +5476,12 @@ static void Cmd_switchhandleorder(void) case 0: for (i = 0; i < gBattlersCount; i++) { - if (gBattleBufferB[i][0] == 0x22) + if (gBattleResources->bufferB[i][0] == 0x22) { - *(gBattleStruct->monToSwitchIntoId + i) = gBattleBufferB[i][1]; + *(gBattleStruct->monToSwitchIntoId + i) = gBattleResources->bufferB[i][1]; if (!(gBattleStruct->field_93 & gBitTable[i])) { - RecordedBattle_SetBattlerAction(i, gBattleBufferB[i][1]); + RecordedBattle_SetBattlerAction(i, gBattleResources->bufferB[i][1]); gBattleStruct->field_93 |= gBitTable[i]; } } @@ -5135,23 +5494,23 @@ static void Cmd_switchhandleorder(void) case 2: if (!(gBattleStruct->field_93 & gBitTable[gActiveBattler])) { - RecordedBattle_SetBattlerAction(gActiveBattler, gBattleBufferB[gActiveBattler][1]); + RecordedBattle_SetBattlerAction(gActiveBattler, gBattleResources->bufferB[gActiveBattler][1]); gBattleStruct->field_93 |= gBitTable[gActiveBattler]; } // fall through case 3: - gBattleCommunication[0] = gBattleBufferB[gActiveBattler][1]; - *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = gBattleBufferB[gActiveBattler][1]; + gBattleCommunication[0] = gBattleResources->bufferB[gActiveBattler][1]; + *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = gBattleResources->bufferB[gActiveBattler][1]; if (gBattleTypeFlags & BATTLE_TYPE_LINK && gBattleTypeFlags & BATTLE_TYPE_MULTI) { *(gActiveBattler * 3 + (u8*)(gBattleStruct->field_60) + 0) &= 0xF; - *(gActiveBattler * 3 + (u8*)(gBattleStruct->field_60) + 0) |= (gBattleBufferB[gActiveBattler][2] & 0xF0); - *(gActiveBattler * 3 + (u8*)(gBattleStruct->field_60) + 1) = gBattleBufferB[gActiveBattler][3]; + *(gActiveBattler * 3 + (u8*)(gBattleStruct->field_60) + 0) |= (gBattleResources->bufferB[gActiveBattler][2] & 0xF0); + *(gActiveBattler * 3 + (u8*)(gBattleStruct->field_60) + 1) = gBattleResources->bufferB[gActiveBattler][3]; *((gActiveBattler ^ BIT_FLANK) * 3 + (u8*)(gBattleStruct->field_60) + 0) &= (0xF0); - *((gActiveBattler ^ BIT_FLANK) * 3 + (u8*)(gBattleStruct->field_60) + 0) |= (gBattleBufferB[gActiveBattler][2] & 0xF0) >> 4; - *((gActiveBattler ^ BIT_FLANK) * 3 + (u8*)(gBattleStruct->field_60) + 2) = gBattleBufferB[gActiveBattler][3]; + *((gActiveBattler ^ BIT_FLANK) * 3 + (u8*)(gBattleStruct->field_60) + 0) |= (gBattleResources->bufferB[gActiveBattler][2] & 0xF0) >> 4; + *((gActiveBattler ^ BIT_FLANK) * 3 + (u8*)(gBattleStruct->field_60) + 2) = gBattleResources->bufferB[gActiveBattler][3]; } else if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) { @@ -5163,14 +5522,29 @@ static void Cmd_switchhandleorder(void) } PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerAttacker].species) - PREPARE_MON_NICK_BUFFER(gBattleTextBuff2, gActiveBattler, gBattleBufferB[gActiveBattler][1]) - + PREPARE_MON_NICK_BUFFER(gBattleTextBuff2, gActiveBattler, gBattleResources->bufferB[gActiveBattler][1]) break; } gBattlescriptCurrInstr += 3; } +static void SetDmgHazardsBattlescript(u8 battlerId, u8 multistringId) +{ + gBattleMons[battlerId].status2 &= ~(STATUS2_DESTINY_BOND); + gHitMarker &= ~(HITMARKER_DESTINYBOND); + gBattleScripting.battler = battlerId; + gBattleCommunication[MULTISTRING_CHOOSER] = multistringId; + + BattleScriptPushCursor(); + if (gBattlescriptCurrInstr[1] == BS_TARGET) + gBattlescriptCurrInstr = BattleScript_DmgHazardsOnTarget; + else if (gBattlescriptCurrInstr[1] == BS_ATTACKER) + gBattlescriptCurrInstr = BattleScript_DmgHazardsOnAttacker; + else + gBattlescriptCurrInstr = BattleScript_DmgHazardsOnFaintedBattler; +} + static void Cmd_switchineffects(void) { s32 i; @@ -5183,73 +5557,113 @@ static void Cmd_switchineffects(void) if (!(gSideStatuses[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_SPIKES_DAMAGED) && (gSideStatuses[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_SPIKES) - && !IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_FLYING) - && gBattleMons[gActiveBattler].ability != ABILITY_LEVITATE) + && GetBattlerAbility(gActiveBattler) != ABILITY_MAGIC_GUARD + && IsBattlerGrounded(gActiveBattler)) { - u8 spikesDmg; - - gSideStatuses[GetBattlerSide(gActiveBattler)] |= SIDE_STATUS_SPIKES_DAMAGED; - - gBattleMons[gActiveBattler].status2 &= ~(STATUS2_DESTINY_BOND); - gHitMarker &= ~(HITMARKER_DESTINYBOND); - - spikesDmg = (5 - gSideTimers[GetBattlerSide(gActiveBattler)].spikesAmount) * 2; + u8 spikesDmg = (5 - gSideTimers[GetBattlerSide(gActiveBattler)].spikesAmount) * 2; gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / (spikesDmg); if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; - gBattleScripting.battler = gActiveBattler; - BattleScriptPushCursor(); + gSideStatuses[GetBattlerSide(gActiveBattler)] |= SIDE_STATUS_SPIKES_DAMAGED; + SetDmgHazardsBattlescript(gActiveBattler, 0); + } + else if (!(gSideStatuses[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_STEALTH_ROCK_DAMAGED) + && (gSideStatuses[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_STEALTH_ROCK) + && GetBattlerAbility(gActiveBattler) != ABILITY_MAGIC_GUARD) + { + gSideStatuses[GetBattlerSide(gActiveBattler)] |= SIDE_STATUS_STEALTH_ROCK_DAMAGED; + gBattleMoveDamage = GetStealthHazardDamage(gBattleMoves[MOVE_STEALTH_ROCK].type, gActiveBattler); - if (gBattlescriptCurrInstr[1] == BS_TARGET) - gBattlescriptCurrInstr = BattleScript_SpikesOnTarget; - else if (gBattlescriptCurrInstr[1] == BS_ATTACKER) - gBattlescriptCurrInstr = BattleScript_SpikesOnAttacker; + if (gBattleMoveDamage != 0) + SetDmgHazardsBattlescript(gActiveBattler, 1); + } + else if (!(gSideStatuses[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_TOXIC_SPIKES_DAMAGED) + && (gSideStatuses[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_TOXIC_SPIKES) + && IsBattlerGrounded(gActiveBattler)) + { + gSideStatuses[GetBattlerSide(gActiveBattler)] |= SIDE_STATUS_TOXIC_SPIKES_DAMAGED; + if (IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_POISON)) // Absorb the toxic spikes. + { + gSideStatuses[GetBattlerSide(gActiveBattler)] &= ~(SIDE_STATUS_TOXIC_SPIKES); + gSideTimers[GetBattlerSide(gActiveBattler)].toxicSpikesAmount = 0; + gBattleScripting.battler = gActiveBattler; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ToxicSpikesAbsorbed; + } else - gBattlescriptCurrInstr = BattleScript_SpikesOnFaintedBattler; + { + if (!(gBattleMons[gActiveBattler].status1 & STATUS1_ANY) + && !IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_STEEL) + && GetBattlerAbility(gActiveBattler) != ABILITY_IMMUNITY + && !(gSideStatuses[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_SAFEGUARD)) + { + if (gSideTimers[GetBattlerSide(gActiveBattler)].toxicSpikesAmount >= 2) + gBattleMons[gActiveBattler].status1 |= STATUS1_TOXIC_POISON; + else + gBattleMons[gActiveBattler].status1 |= STATUS1_POISON; + + BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + MarkBattlerForControllerExec(gActiveBattler); + gBattleScripting.battler = gActiveBattler; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ToxicSpikesPoisoned; + } + } + } + else if (!(gSideStatuses[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_STICKY_WEB_DAMAGED) + && (gSideStatuses[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_STICKY_WEB) + && IsBattlerGrounded(gActiveBattler)) + { + gSideStatuses[GetBattlerSide(gActiveBattler)] |= SIDE_STATUS_STICKY_WEB_DAMAGED; + gBattleScripting.battler = gActiveBattler; + SET_STATCHANGER(STAT_SPEED, 1, TRUE); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_StickyWebOnSwitchIn; } else { // There is a hack here to ensure the truant counter will be 0 when the battler's next turn starts. // The truant counter is not updated in the case where a mon switches in after a lost judgement in the battle arena. - if (gBattleMons[gActiveBattler].ability == ABILITY_TRUANT && !gDisableStructs[gActiveBattler].truantSwitchInHack) + if (gBattleMons[gActiveBattler].ability == ABILITY_TRUANT + && gCurrentActionFuncId != B_ACTION_USE_MOVE + && !gDisableStructs[gActiveBattler].truantSwitchInHack) gDisableStructs[gActiveBattler].truantCounter = 1; gDisableStructs[gActiveBattler].truantSwitchInHack = 0; - if (!AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gActiveBattler, 0, 0, 0) - && !ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, gActiveBattler, FALSE)) + if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gActiveBattler, 0, 0, 0) + || ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, gActiveBattler, FALSE) + || AbilityBattleEffects(ABILITYEFFECT_INTIMIDATE2, 0, 0, 0, 0) + || AbilityBattleEffects(ABILITYEFFECT_TRACE2, 0, 0, 0, 0) + || AbilityBattleEffects(ABILITYEFFECT_FORECAST, 0, 0, 0, 0)) + return; + + gSideStatuses[GetBattlerSide(gActiveBattler)] &= ~(SIDE_STATUS_SPIKES_DAMAGED | SIDE_STATUS_TOXIC_SPIKES_DAMAGED | SIDE_STATUS_STEALTH_ROCK_DAMAGED | SIDE_STATUS_STICKY_WEB_DAMAGED); + + for (i = 0; i < gBattlersCount; i++) { - gSideStatuses[GetBattlerSide(gActiveBattler)] &= ~(SIDE_STATUS_SPIKES_DAMAGED); + if (gBattlerByTurnOrder[i] == gActiveBattler) + gActionsByTurnOrder[i] = B_ACTION_CANCEL_PARTNER; - for (i = 0; i < gBattlersCount; i++) - { - if (gBattlerByTurnOrder[i] == gActiveBattler) - gActionsByTurnOrder[i] = B_ACTION_CANCEL_PARTNER; - } - - for (i = 0; i < gBattlersCount; i++) - { - u16* hpOnSwitchout = &gBattleStruct->hpOnSwitchout[GetBattlerSide(i)]; - *hpOnSwitchout = gBattleMons[i].hp; - } - - if (gBattlescriptCurrInstr[1] == 5) - { - u32 hitmarkerFaintBits = gHitMarker >> 0x1C; - - gBattlerFainted++; - while (1) - { - if (hitmarkerFaintBits & gBitTable[gBattlerFainted] && !(gAbsentBattlerFlags & gBitTable[gBattlerFainted])) - break; - if (gBattlerFainted >= gBattlersCount) - break; - gBattlerFainted++; - } - } - gBattlescriptCurrInstr += 2; + gBattleStruct->hpOnSwitchout[GetBattlerSide(i)] = gBattleMons[i].hp; } + + if (gBattlescriptCurrInstr[1] == 5) + { + u32 hitmarkerFaintBits = gHitMarker >> 0x1C; + + gBattlerFainted++; + while (1) + { + if (hitmarkerFaintBits & gBitTable[gBattlerFainted] && !(gAbsentBattlerFlags & gBitTable[gBattlerFainted])) + break; + if (gBattlerFainted >= gBattlersCount) + break; + gBattlerFainted++; + } + } + gBattlescriptCurrInstr += 2; } } @@ -5289,7 +5703,7 @@ static void Cmd_playfaintcry(void) gBattlescriptCurrInstr += 2; } -static void Cmd_unknown_57(void) +static void atk57(void) { gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); BtlController_EmitCmd55(0, gBattleOutcome); @@ -5521,7 +5935,7 @@ static void Cmd_hitanimation(void) { gBattlescriptCurrInstr += 2; } - else if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) || !(gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE) || gDisableStructs[gActiveBattler].substituteHP == 0) + else if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) || !(DoesSubstituteBlockMove(gBattlerAttacker, gActiveBattler, gCurrentMove)) || gDisableStructs[gActiveBattler].substituteHP == 0) { BtlController_EmitHitAnimation(0); MarkBattlerForControllerExec(gActiveBattler); @@ -5602,7 +6016,7 @@ static void Cmd_getmoneyreward(void) gBattlescriptCurrInstr++; } -static void Cmd_unknown_5E(void) +static void atk5E(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); @@ -5617,7 +6031,7 @@ static void Cmd_unknown_5E(void) if (gBattleControllerExecFlags == 0) { s32 i; - struct BattlePokemon *bufferPoke = (struct BattlePokemon*) &gBattleBufferB[gActiveBattler][4]; + struct BattlePokemon *bufferPoke = (struct BattlePokemon*) &gBattleResources->bufferB[gActiveBattler][4]; for (i = 0; i < MAX_MON_MOVES; i++) { gBattleMons[gActiveBattler].moves[i] = bufferPoke->moves[i]; @@ -5814,65 +6228,65 @@ static void Cmd_cancelallactions(void) gBattlescriptCurrInstr++; } -static void Cmd_adjustsetdamage(void) // The same as adjustnormaldamage, except there's no random damage multiplier. +static void Cmd_setgravity(void) { - u8 holdEffect, param; - - if (gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY) + if (gFieldStatuses & STATUS_FIELD_GRAVITY) { - holdEffect = gEnigmaBerries[gBattlerTarget].holdEffect; - param = gEnigmaBerries[gBattlerTarget].holdEffectParam; + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { - holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item); - param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item); + gFieldStatuses |= STATUS_FIELD_GRAVITY; + gFieldTimers.gravityTimer = 5; + gBattlescriptCurrInstr += 5; } +} - gPotentialItemEffectBattler = gBattlerTarget; - - if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < param) +static bool32 TryCheekPouch(u32 battlerId, u32 itemId) +{ + if (ItemId_GetPocket(itemId) == POCKET_BERRIES + && GetBattlerAbility(battlerId) == ABILITY_CHEEK_POUCH + && !(gStatuses3[battlerId] & STATUS3_HEAL_BLOCK) + && gBattleStruct->ateBerry[GetBattlerSide(battlerId)] & gBitTable[gBattlerPartyIndexes[battlerId]] + && !BATTLER_MAX_HP(battlerId)) { - RecordItemEffectBattle(gBattlerTarget, holdEffect); - gSpecialStatuses[gBattlerTarget].focusBanded = 1; + gBattleMoveDamage = gBattleMons[battlerId].maxHP / 3; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage *= -1; + gBattlerAbility = battlerId; + BattleScriptPush(gBattlescriptCurrInstr + 2); + gBattlescriptCurrInstr = BattleScript_CheekPouchActivates; + return TRUE; } - if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_SUBSTITUTE) - && (gBattleMoves[gCurrentMove].effect == EFFECT_FALSE_SWIPE || gProtectStructs[gBattlerTarget].endured || gSpecialStatuses[gBattlerTarget].focusBanded) - && gBattleMons[gBattlerTarget].hp <= gBattleMoveDamage) - { - gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - 1; - if (gProtectStructs[gBattlerTarget].endured) - { - gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED; - } - else if (gSpecialStatuses[gBattlerTarget].focusBanded) - { - gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON; - gLastUsedItem = gBattleMons[gBattlerTarget].item; - } - } - gBattlescriptCurrInstr++; + return FALSE; } static void Cmd_removeitem(void) { - u16* usedHeldItem; + u16 itemId = 0; gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); + itemId = gBattleMons[gActiveBattler].item; + + // Popped Air Balloon cannot be restored by no means. + if (GetBattlerHoldEffect(gActiveBattler, TRUE) != HOLD_EFFECT_AIR_BALLOON) + gBattleStruct->usedHeldItems[gActiveBattler] = itemId; - usedHeldItem = &gBattleStruct->usedHeldItems[gActiveBattler]; - *usedHeldItem = gBattleMons[gActiveBattler].item; gBattleMons[gActiveBattler].item = 0; + CheckSetUnburden(gActiveBattler); BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBattler].item); MarkBattlerForControllerExec(gActiveBattler); - gBattlescriptCurrInstr += 2; + ClearBattlerItemEffectHistory(gActiveBattler); + if (!TryCheekPouch(gActiveBattler, itemId)) + gBattlescriptCurrInstr += 2; } static void Cmd_atknameinbuff1(void) { - PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBattlerAttacker, gBattlerPartyIndexes[gBattlerAttacker]) + PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBattlerAttacker, gBattlerPartyIndexes[gBattlerAttacker]); gBattlescriptCurrInstr++; } @@ -6163,6 +6577,9 @@ static void Cmd_setatktoplayer0(void) static void Cmd_makevisible(void) { + if (gBattleControllerExecFlags) + return; + gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); BtlController_EmitSpriteInvisibility(0, FALSE); MarkBattlerForControllerExec(gActiveBattler); @@ -6170,11 +6587,11 @@ static void Cmd_makevisible(void) gBattlescriptCurrInstr += 2; } -static void Cmd_recordlastability(void) +static void Cmd_recordability(void) { - gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - RecordAbilityBattle(gActiveBattler, gLastUsedAbility); - gBattlescriptCurrInstr += 1; // UB: Should be + 2, one byte for command and one byte for battlerId argument. + u8 battler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); + RecordAbilityBattle(battler, gBattleMons[battler].ability); + gBattlescriptCurrInstr += 2; } void BufferMoveToLearnIntoBattleTextBuff2(void) @@ -6256,15 +6673,415 @@ static void Cmd_useitemonopponent(void) gBattlescriptCurrInstr += 1; } +static bool32 HasAttackerFaintedTarget(void) +{ + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && gBattleMoves[gCurrentMove].power != 0 + && (gLastHitBy[gBattlerTarget] == 0xFF || gLastHitBy[gBattlerTarget] == gBattlerAttacker) + && gBattleStruct->moveTarget[gBattlerAttacker] == gBattlerTarget + && gBattlerTarget != gBattlerAttacker + && gCurrentTurnActionNumber == GetBattlerTurnOrderNum(gBattlerAttacker) + && (gChosenMove == gChosenMoveByBattler[gBattlerAttacker] || gChosenMove == gBattleMons[gBattlerAttacker].moves[gChosenMovePos])) + return TRUE; + else + return FALSE; +} + +static void HandleTerrainMove(u32 moveEffect) +{ + u32 statusFlag = 0; + u8 *timer = NULL; + + switch (moveEffect) + { + case EFFECT_MISTY_TERRAIN: + statusFlag = STATUS_FIELD_MISTY_TERRAIN, timer = &gFieldTimers.mistyTerrainTimer; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + break; + case EFFECT_GRASSY_TERRAIN: + statusFlag = STATUS_FIELD_GRASSY_TERRAIN, timer = &gFieldTimers.grassyTerrainTimer; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + break; + case EFFECT_ELECTRIC_TERRAIN: + statusFlag = STATUS_FIELD_ELECTRIC_TERRAIN, timer = &gFieldTimers.electricTerrainTimer; + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + break; + case EFFECT_PSYCHIC_TERRAIN: + statusFlag = STATUS_FIELD_PSYCHIC_TERRAIN, timer = &gFieldTimers.psychicTerrainTimer; + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + break; + } + + if (gFieldStatuses & statusFlag || statusFlag == 0) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + } + else + { + gFieldStatuses &= ~(STATUS_FIELD_MISTY_TERRAIN | STATUS_FIELD_GRASSY_TERRAIN | STATUS_FIELD_ELECTRIC_TERRAIN | STATUS_FIELD_PSYCHIC_TERRAIN); + gFieldStatuses |= statusFlag; + if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_TERRAIN_EXTENDER) + *timer = 8; + else + *timer = 5; + gBattlescriptCurrInstr += 7; + } +} + +bool32 CanPoisonType(u8 battlerAttacker, u8 battlerTarget) +{ + return (GetBattlerAbility(battlerAttacker) == ABILITY_CORROSION + || !(IS_BATTLER_OF_TYPE(battlerTarget, TYPE_POISON) + || IS_BATTLER_OF_TYPE(battlerTarget, TYPE_STEEL))); +} + +bool32 CanParalyzeType(u8 battlerAttacker, u8 battlerTarget) +{ + return !(B_PARALYZE_ELECTRIC >= GEN_6 && IS_BATTLER_OF_TYPE(battlerTarget, TYPE_ELECTRIC)); +} + +bool32 CanUseLastResort(u8 battlerId) +{ + u32 i; + u32 knownMovesCount = 0, usedMovesCount = 0; + + for (i = 0; i < 4; i++) + { + if (gBattleMons[battlerId].moves[i] != MOVE_NONE) + knownMovesCount++; + if (i != gCurrMovePos && gDisableStructs[battlerId].usedMoves & gBitTable[i]) // Increment used move count for all moves except current Last Resort. + usedMovesCount++; + } + + return (knownMovesCount >= 2 && usedMovesCount >= knownMovesCount - 1); +} + +#define DEFOG_CLEAR(status, structField, battlescript, move)\ +{ \ + if (*sideStatuses & status) \ + { \ + if (clear) \ + { \ + if (move) \ + PREPARE_MOVE_BUFFER(gBattleTextBuff1, move);\ + *sideStatuses &= ~(status); \ + sideTimer->structField = 0; \ + BattleScriptPushCursor(); \ + gBattlescriptCurrInstr = battlescript; \ + } \ + return TRUE; \ + } \ +} + +static bool32 ClearDefogHazards(u8 battlerAtk, bool32 clear) +{ + s32 i; + for (i = 0; i < 2; i++) + { + struct SideTimer *sideTimer = &gSideTimers[i]; + u32 *sideStatuses = &gSideStatuses[i]; + + gBattlerAttacker = i; + if (GetBattlerSide(battlerAtk) != i) + { + DEFOG_CLEAR(SIDE_STATUS_REFLECT, reflectTimer, BattleScript_SideStatusWoreOffReturn, MOVE_REFLECT); + DEFOG_CLEAR(SIDE_STATUS_LIGHTSCREEN, lightscreenTimer, BattleScript_SideStatusWoreOffReturn, MOVE_LIGHT_SCREEN); + DEFOG_CLEAR(SIDE_STATUS_MIST, mistTimer, BattleScript_SideStatusWoreOffReturn, MOVE_MIST); + DEFOG_CLEAR(SIDE_STATUS_AURORA_VEIL, auroraVeilTimer, BattleScript_SideStatusWoreOffReturn, MOVE_AURORA_VEIL); + DEFOG_CLEAR(SIDE_STATUS_SAFEGUARD, safeguardTimer, BattleScript_SideStatusWoreOffReturn, MOVE_SAFEGUARD); + } + DEFOG_CLEAR(SIDE_STATUS_SPIKES, spikesAmount, BattleScript_SpikesFree, 0); + DEFOG_CLEAR(SIDE_STATUS_STEALTH_ROCK, stealthRockAmount, BattleScript_StealthRockFree, 0); + DEFOG_CLEAR(SIDE_STATUS_TOXIC_SPIKES, toxicSpikesAmount, BattleScript_ToxicSpikesFree, 0); + DEFOG_CLEAR(SIDE_STATUS_STICKY_WEB, stickyWebAmount, BattleScript_StickyWebFree, 0); + } + + return FALSE; +} + +u32 IsFlowerVeilProtected(u32 battler) +{ + if (IS_BATTLER_OF_TYPE(battler, TYPE_GRASS)) + return IsAbilityOnSide(battler, ABILITY_FLOWER_VEIL); + else + return 0; +} + +u32 IsLeafGuardProtected(u32 battler) +{ + if (WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_SUN_ANY)) + return GetBattlerAbility(battler) == ABILITY_LEAF_GUARD; + else + return 0; +} + +bool32 IsShieldsDownProtected(u32 battler) +{ + return (gBattleMons[battler].ability == ABILITY_SHIELDS_DOWN + && gBattleMons[battler].species == SPECIES_MINIOR); +} + +u32 IsAbilityStatusProtected(u32 battler) +{ + return IsFlowerVeilProtected(battler) + || IsLeafGuardProtected(battler) + || IsShieldsDownProtected(battler); +} + +static void RecalcBattlerStats(u32 battler, struct Pokemon *mon) +{ + CalculateMonStats(mon); + gBattleMons[battler].level = GetMonData(mon, MON_DATA_LEVEL); + gBattleMons[battler].hp = GetMonData(mon, MON_DATA_HP); + gBattleMons[battler].maxHP = GetMonData(mon, MON_DATA_MAX_HP); + gBattleMons[battler].attack = GetMonData(mon, MON_DATA_ATK); + gBattleMons[battler].defense = GetMonData(mon, MON_DATA_DEF); + gBattleMons[battler].speed = GetMonData(mon, MON_DATA_SPEED); + gBattleMons[battler].spAttack = GetMonData(mon, MON_DATA_SPATK); + gBattleMons[battler].spDefense = GetMonData(mon, MON_DATA_SPDEF); + gBattleMons[battler].ability = GetMonAbility(mon); + gBattleMons[battler].type1 = gBaseStats[gBattleMons[battler].species].type1; + gBattleMons[battler].type2 = gBaseStats[gBattleMons[battler].species].type2; +} + +static u32 GetHighestStatId(u32 battlerId) +{ + u32 i, highestId = STAT_ATK, highestStat = gBattleMons[battlerId].attack; + + for (i = STAT_DEF; i < NUM_STATS; i++) + { + u16 *statVal = &gBattleMons[battlerId].attack + (i - 1); + if (*statVal > highestStat) + { + highestStat = *statVal; + highestId = i; + } + } + return highestId; +} + static void Cmd_various(void) { - u8 side; - s32 i; + struct Pokemon *mon; + s32 i, j; + u8 data[10]; + u32 side, bits; + + if (gBattleControllerExecFlags) + return; gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); switch (gBattlescriptCurrInstr[2]) { + // Roar will fail in a double wild battle when used by the player against one of the two alive wild mons. + // Also when an opposing wild mon uses it againt its partner. + case VARIOUS_JUMP_IF_ROAR_FAILS: + if (WILD_DOUBLE_BATTLE + && GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER + && GetBattlerSide(gBattlerTarget) == B_SIDE_OPPONENT + && IS_WHOLE_SIDE_ALIVE(gBattlerTarget)) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else if (WILD_DOUBLE_BATTLE + && GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT + && GetBattlerSide(gBattlerTarget) == B_SIDE_OPPONENT) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else + gBattlescriptCurrInstr += 7; + return; + case VARIOUS_JUMP_IF_ABSENT: + if (!IsBattlerAlive(gActiveBattler)) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else + gBattlescriptCurrInstr += 7; + return; + case VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED: + if (IsShieldsDownProtected(gActiveBattler)) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else + gBattlescriptCurrInstr += 7; + return; + case VARIOUS_JUMP_IF_NO_HOLD_EFFECT: + if (GetBattlerHoldEffect(gActiveBattler, TRUE) != gBattlescriptCurrInstr[3]) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 4); + else + gBattlescriptCurrInstr += 8; + return; + case VARIOUS_JUMP_IF_NO_ALLY: + if (!IsBattlerAlive(BATTLE_PARTNER(gActiveBattler))) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else + gBattlescriptCurrInstr += 7; + return; + case VARIOUS_INFATUATE_WITH_BATTLER: + gBattleScripting.battler = gActiveBattler; + gBattleMons[gActiveBattler].status2 |= STATUS2_INFATUATED_WITH(GetBattlerForBattleScript(gBattlescriptCurrInstr[3])); + gBattlescriptCurrInstr += 4; + return; + case VARIOUS_SET_LAST_USED_ITEM: + gLastUsedItem = gBattleMons[gActiveBattler].item; + break; + case VARIOUS_TRY_FAIRY_LOCK: + if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + } + else + { + gFieldStatuses |= STATUS_FIELD_FAIRY_LOCK; + gFieldTimers.fairyLockTimer = 2; + gBattlescriptCurrInstr += 7; + } + return; + case VARIOUS_GET_STAT_VALUE: + i = gBattlescriptCurrInstr[3]; + gBattleMoveDamage = *(u16*)(&gBattleMons[gActiveBattler].attack) + (i - 1); + gBattleMoveDamage *= gStatStageRatios[gBattleMons[gActiveBattler].statStages[i]][0]; + gBattleMoveDamage /= gStatStageRatios[gBattleMons[gActiveBattler].statStages[i]][1]; + gBattlescriptCurrInstr += 4; + return; + case VARIOUS_JUMP_IF_FULL_HP: + if (BATTLER_MAX_HP(gActiveBattler)) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else + gBattlescriptCurrInstr += 7; + return; + case VARIOUS_TRY_FRISK: + while (gBattleStruct->friskedBattler < gBattlersCount) + { + gBattlerTarget = gBattleStruct->friskedBattler++; + if (GET_BATTLER_SIDE2(gActiveBattler) != GET_BATTLER_SIDE2(gBattlerTarget) + && IsBattlerAlive(gBattlerTarget) + && gBattleMons[gBattlerTarget].item != ITEM_NONE) + { + gLastUsedItem = gBattleMons[gBattlerTarget].item; + RecordItemEffectBattle(gBattlerTarget, GetBattlerHoldEffect(gBattlerTarget, FALSE)); + BattleScriptPushCursor(); + // If Frisk identifies two mons' items, show the pop-up only once. + if (gBattleStruct->friskedAbility) + { + gBattlescriptCurrInstr = BattleScript_FriskMsg; + } + else + { + gBattleStruct->friskedAbility = TRUE; + gBattlescriptCurrInstr = BattleScript_FriskMsgWithPopup; + } + return; + } + } + gBattleStruct->friskedBattler = 0; + gBattleStruct->friskedAbility = FALSE; + break; + case VARIOUS_POISON_TYPE_IMMUNITY: + if (!CanPoisonType(gActiveBattler, GetBattlerForBattleScript(gBattlescriptCurrInstr[3]))) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 4); + else + gBattlescriptCurrInstr += 8; + return; + case VARIOUS_PARALYZE_TYPE_IMMUNITY: + if (!CanParalyzeType(gActiveBattler, GetBattlerForBattleScript(gBattlescriptCurrInstr[3]))) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 4); + else + gBattlescriptCurrInstr += 8; + return; + case VARIOUS_TRACE_ABILITY: + gBattleMons[gActiveBattler].ability = gBattleStruct->tracedAbility[gActiveBattler]; + RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability); + break; + case VARIOUS_TRY_ILLUSION_OFF: + if (GetIllusionMonPtr(gActiveBattler) != NULL) + { + gBattlescriptCurrInstr += 3; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_IllusionOff; + return; + } + break; + case VARIOUS_SET_SPRITEIGNORE0HP: + gBattleStruct->spriteIgnore0Hp = gBattlescriptCurrInstr[3]; + gBattlescriptCurrInstr += 4; + return; + case VARIOUS_UPDATE_NICK: + if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) + mon = &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]; + else + mon = &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]; + UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], mon, HEALTHBOX_NICK); + break; + case VARIOUS_JUMP_IF_NOT_BERRY: + if (ItemId_GetPocket(gBattleMons[gActiveBattler].item) == POCKET_BERRIES) + gBattlescriptCurrInstr += 7; + else + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + return; + case VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS: + if ((gStatuses3[gActiveBattler] & (STATUS3_SEMI_INVULNERABLE)) + || BATTLER_MAX_HP(gActiveBattler) + || !gBattleMons[gActiveBattler].hp + || !(IsBattlerGrounded(gActiveBattler))) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + } + else + { + gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage *= -1; + + gBattlescriptCurrInstr += 7; + } + return; + case VARIOUS_GRAVITY_ON_AIRBORNE_MONS: + if (gStatuses3[gActiveBattler] & STATUS3_ON_AIR) + CancelMultiTurnMoves(gActiveBattler); + + gStatuses3[gActiveBattler] &= ~(STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS | STATUS3_ON_AIR); + break; + case VARIOUS_SPECTRAL_THIEF: + // Raise stats + for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) + { + if (gBattleStruct->stolenStats[0] & gBitTable[i]) + { + gBattleStruct->stolenStats[0] &= ~(gBitTable[i]); + SET_STATCHANGER(i, gBattleStruct->stolenStats[i], FALSE); + if (ChangeStatBuffs(GET_STAT_BUFF_VALUE_WITH_SIGN(gBattleScripting.statChanger), i, MOVE_EFFECT_CERTAIN | MOVE_EFFECT_AFFECTS_USER, NULL) == STAT_CHANGE_WORKED) + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_StatUpMsg; + return; + } + } + } + break; + case VARIOUS_SET_POWDER: + gBattleMons[gActiveBattler].status2 |= STATUS2_POWDER; + break; + case VARIOUS_ACUPRESSURE: + bits = 0; + for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) + { + if (gBattleMons[gActiveBattler].statStages[i] != 12) + bits |= gBitTable[i]; + } + if (bits) + { + u32 statId; + do + { + statId = (Random() % (NUM_BATTLE_STATS - 1)) + 1; + } while (!(bits & gBitTable[statId])); + + SET_STATCHANGER(statId, 2, FALSE); + gBattlescriptCurrInstr += 7; + } + else + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + } + return; case VARIOUS_CANCEL_MULTI_TURN_MOVES: CancelMultiTurnMoves(gActiveBattler); break; @@ -6284,33 +7101,30 @@ static void Cmd_various(void) break; case VARIOUS_GET_BATTLER_FAINTED: if (gHitMarker & HITMARKER_FAINTED(gActiveBattler)) - gBattleCommunication[0] = TRUE; + gBattleCommunication[0] = 1; else - gBattleCommunication[0] = FALSE; + gBattleCommunication[0] = 0; break; case VARIOUS_RESET_INTIMIDATE_TRACE_BITS: gSpecialStatuses[gActiveBattler].intimidatedMon = 0; gSpecialStatuses[gActiveBattler].traced = 0; + gSpecialStatuses[gActiveBattler].switchInAbilityDone = 0; break; case VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP: if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId || gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId) { - u16 *choicedMove; - if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId) gActiveBattler = 0; else gActiveBattler = 2; - choicedMove = &gBattleStruct->choicedMove[gActiveBattler]; - for (i = 0; i < MAX_MON_MOVES; i++) { - if (gBattleMons[gActiveBattler].moves[i] == *choicedMove) + if (gBattleMons[gActiveBattler].moves[i] == gBattleStruct->choicedMove[gActiveBattler]) break; } if (i == MAX_MON_MOVES) - *choicedMove = 0; + gBattleStruct->choicedMove[gActiveBattler] = 0; } break; case 7: @@ -6323,17 +7137,15 @@ static void Cmd_various(void) } break; case VARIOUS_PALACE_FLAVOR_TEXT: - // Try and print end-of-turn Battle Palace flavor text (e.g. "A glint appears in mon's eyes") - gBattleCommunication[0] = FALSE; // whether or not msg should be printed + gBattleCommunication[0] = 0; gBattleScripting.battler = gActiveBattler = gBattleCommunication[1]; - if (!(gBattleStruct->palaceFlags & gBitTable[gActiveBattler]) && gBattleMons[gActiveBattler].maxHP / 2 >= gBattleMons[gActiveBattler].hp && gBattleMons[gActiveBattler].hp != 0 && !(gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP)) { gBattleStruct->palaceFlags |= gBitTable[gActiveBattler]; - gBattleCommunication[0] = TRUE; + gBattleCommunication[0] = 1; gBattleCommunication[MULTISTRING_CHOOSER] = sBattlePalaceNatureToFlavorTextId[GetNatureFromPersonality(gBattleMons[gActiveBattler].personality)]; } break; @@ -6423,26 +7235,840 @@ static void Cmd_various(void) return; break; case VARIOUS_SET_TELEPORT_OUTCOME: - if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) + // Don't end the battle if one of the wild mons teleported from the wild double battle + // and its partner is still alive. + if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT && IsBattlerAlive(BATTLE_PARTNER(gActiveBattler))) + { + gAbsentBattlerFlags |= gBitTable[gActiveBattler]; + gHitMarker |= HITMARKER_FAINTED(gActiveBattler); + gBattleMons[gActiveBattler].hp = 0; + SetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP, &gBattleMons[gActiveBattler].hp); + SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); + FaintClearSetData(); + } + else if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) + { gBattleOutcome = B_OUTCOME_PLAYER_TELEPORTED; + } else + { gBattleOutcome = B_OUTCOME_MON_TELEPORTED; + } break; case VARIOUS_PLAY_TRAINER_DEFEATED_MUSIC: BtlController_EmitPlayFanfareOrBGM(0, MUS_VICTORY_TRAINER, TRUE); MarkBattlerForControllerExec(gActiveBattler); break; + case VARIOUS_STAT_TEXT_BUFFER: + PREPARE_STAT_BUFFER(gBattleTextBuff1, gBattleCommunication[0]); + break; + case VARIOUS_SWITCHIN_ABILITIES: + gBattlescriptCurrInstr += 3; + AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gActiveBattler, 0, 0, 0); + AbilityBattleEffects(ABILITYEFFECT_INTIMIDATE2, gActiveBattler, 0, 0, 0); + AbilityBattleEffects(ABILITYEFFECT_TRACE2, gActiveBattler, 0, 0, 0); + return; + case VARIOUS_SAVE_TARGET: + gBattleStruct->savedBattlerTarget = gBattlerTarget; + break; + case VARIOUS_RESTORE_TARGET: + gBattlerTarget = gBattleStruct->savedBattlerTarget; + break; + case VARIOUS_INSTANT_HP_DROP: + BtlController_EmitHealthBarUpdate(0, INSTANT_HP_BAR_DROP); + MarkBattlerForControllerExec(gActiveBattler); + break; + case VARIOUS_CLEAR_STATUS: + gBattleMons[gActiveBattler].status1 = 0; + BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + MarkBattlerForControllerExec(gActiveBattler); + break; + case VARIOUS_RESTORE_PP: + for (i = 0; i < 4; i++) + { + gBattleMons[gActiveBattler].pp[i] = CalculatePPWithBonus(gBattleMons[gActiveBattler].moves[i], gBattleMons[gActiveBattler].ppBonuses, i); + data[i] = gBattleMons[gActiveBattler].pp[i]; + } + data[i] = gBattleMons[gActiveBattler].ppBonuses; + BtlController_EmitSetMonData(0, REQUEST_PP_DATA_BATTLE, 0, 5, data); + MarkBattlerForControllerExec(gActiveBattler); + break; + case VARIOUS_TRY_ACTIVATE_MOXIE: + if (GetBattlerAbility(gActiveBattler) == ABILITY_MOXIE + && HasAttackerFaintedTarget() + && !NoAliveMonsForEitherParty() + && gBattleMons[gBattlerAttacker].statStages[STAT_ATK] != 12) + { + gBattleMons[gBattlerAttacker].statStages[STAT_ATK]++; + SET_STATCHANGER(STAT_ATK, 1, FALSE); + PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK); + BattleScriptPush(gBattlescriptCurrInstr + 3); + gBattlescriptCurrInstr = BattleScript_AttackerAbilityStatRaise; + return; + } + break; + case VARIOUS_TRY_ACTIVATE_RECEIVER: // Partner gets fainted's ally ability + gBattlerAbility = BATTLE_PARTNER(gActiveBattler); + i = GetBattlerAbility(gBattlerAbility); + if (IsBattlerAlive(gBattlerAbility) + && (i == ABILITY_RECEIVER || i == ABILITY_POWER_OF_ALCHEMY)) + { + switch (gBattleMons[gActiveBattler].ability) + { // Can't copy these abilities. + case ABILITY_POWER_OF_ALCHEMY: case ABILITY_RECEIVER: + case ABILITY_FORECAST: case ABILITY_MULTITYPE: + case ABILITY_FLOWER_GIFT: case ABILITY_ILLUSION: + case ABILITY_WONDER_GUARD: case ABILITY_ZEN_MODE: + case ABILITY_STANCE_CHANGE: case ABILITY_IMPOSTER: + case ABILITY_POWER_CONSTRUCT: case ABILITY_BATTLE_BOND: + case ABILITY_SCHOOLING: case ABILITY_COMATOSE: + case ABILITY_SHIELDS_DOWN: case ABILITY_DISGUISE: + case ABILITY_RKS_SYSTEM: case ABILITY_TRACE: + break; + default: + gBattleStruct->tracedAbility[gBattlerAbility] = gBattleMons[gActiveBattler].ability; // re-using the variable for trace + gBattleScripting.battler = gActiveBattler; + BattleScriptPush(gBattlescriptCurrInstr + 3); + gBattlescriptCurrInstr = BattleScript_ReceiverActivates; + return; + } + } + break; + case VARIOUS_TRY_ACTIVATE_BEAST_BOOST: + i = GetHighestStatId(gActiveBattler); + if (GetBattlerAbility(gActiveBattler) == ABILITY_BEAST_BOOST + && HasAttackerFaintedTarget() + && !NoAliveMonsForEitherParty() + && gBattleMons[gBattlerAttacker].statStages[i] != 12) + { + gBattleMons[gBattlerAttacker].statStages[i]++; + SET_STATCHANGER(i, 1, FALSE); + PREPARE_STAT_BUFFER(gBattleTextBuff1, i); + BattleScriptPush(gBattlescriptCurrInstr + 3); + gBattlescriptCurrInstr = BattleScript_AttackerAbilityStatRaise; + return; + } + break; + case VARIOUS_TRY_ACTIVATE_SOULHEART: + while (gBattleStruct->soulheartBattlerId < gBattlersCount) + { + gBattleScripting.battler = gBattleStruct->soulheartBattlerId++; + if (GetBattlerAbility(gBattleScripting.battler) == ABILITY_SOUL_HEART + && IsBattlerAlive(gBattleScripting.battler) + && !NoAliveMonsForEitherParty() + && gBattleMons[gBattleScripting.battler].statStages[STAT_SPATK] != 12) + { + gBattleMons[gBattleScripting.battler].statStages[STAT_SPATK]++; + SET_STATCHANGER(STAT_SPATK, 1, FALSE); + PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPATK); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ScriptingAbilityStatRaise; + return; + } + } + gBattleStruct->soulheartBattlerId = 0; + break; + case VARIOUS_TRY_ACTIVATE_FELL_STINGER: + if (gBattleMoves[gCurrentMove].effect == EFFECT_FELL_STINGER + && HasAttackerFaintedTarget() + && !NoAliveMonsForEitherParty() + && gBattleMons[gBattlerAttacker].statStages[STAT_ATK] != 12) + { + if (B_FELL_STINGER_STAT_RAISE >= GEN_7) + SET_STATCHANGER(STAT_ATK, 3, FALSE); + else + SET_STATCHANGER(STAT_ATK, 2, FALSE); + + PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK); + BattleScriptPush(gBattlescriptCurrInstr + 3); + gBattlescriptCurrInstr = BattleScript_FellStingerRaisesStat; + return; + } + break; + case VARIOUS_PLAY_MOVE_ANIMATION: + BtlController_EmitMoveAnimation(0, T1_READ_16(gBattlescriptCurrInstr + 3), gBattleScripting.animTurn, 0, 0, gBattleMons[gActiveBattler].friendship, &gDisableStructs[gActiveBattler], gMultiHitCounter); + MarkBattlerForControllerExec(gActiveBattler); + gBattlescriptCurrInstr += 5; + return; + case VARIOUS_SET_LUCKY_CHANT: + if (!(gSideStatuses[GET_BATTLER_SIDE(gActiveBattler)] & SIDE_STATUS_LUCKY_CHANT)) + { + gSideStatuses[GET_BATTLER_SIDE(gActiveBattler)] |= SIDE_STATUS_LUCKY_CHANT; + gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].luckyChantBattlerId = gActiveBattler; + gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].luckyChantTimer = 5; + gBattlescriptCurrInstr += 7; + } + else + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + } + return; + case VARIOUS_SUCKER_PUNCH_CHECK: + if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else if (gBattleMoves[gBattleMons[gBattlerTarget].moves[gBattleStruct->chosenMovePositions[gBattlerTarget]]].power == 0) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else + gBattlescriptCurrInstr += 7; + return; + case VARIOUS_SET_SIMPLE_BEAM: + switch (gBattleMons[gActiveBattler].ability) + { + case ABILITY_SIMPLE: + case ABILITY_TRUANT: + case ABILITY_STANCE_CHANGE: + case ABILITY_DISGUISE: + case ABILITY_MULTITYPE: + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + break; + default: + gBattleMons[gActiveBattler].ability = ABILITY_SIMPLE; + gBattlescriptCurrInstr += 7; + break; + } + return; + case VARIOUS_TRY_ENTRAINMENT: + switch (gBattleMons[gBattlerTarget].ability) + { + case ABILITY_TRUANT: + case ABILITY_MULTITYPE: + case ABILITY_STANCE_CHANGE: + case ABILITY_SCHOOLING: + case ABILITY_COMATOSE: + case ABILITY_SHIELDS_DOWN: + case ABILITY_DISGUISE: + case ABILITY_RKS_SYSTEM: + case ABILITY_BATTLE_BOND: + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + return; + } + switch (gBattleMons[gBattlerAttacker].ability) + { + case ABILITY_TRACE: + case ABILITY_FORECAST: + case ABILITY_FLOWER_GIFT: + case ABILITY_ZEN_MODE: + case ABILITY_ILLUSION: + case ABILITY_IMPOSTER: + case ABILITY_POWER_OF_ALCHEMY: + case ABILITY_RECEIVER: + case ABILITY_DISGUISE: + case ABILITY_POWER_CONSTRUCT: + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + return; + } + if (gBattleMons[gBattlerTarget].ability == gBattleMons[gBattlerAttacker].ability) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + } + else + { + gBattleMons[gBattlerTarget].ability = gBattleMons[gBattlerAttacker].ability; + gBattlescriptCurrInstr += 7; + } + return; + case VARIOUS_SET_LAST_USED_ABILITY: + gLastUsedAbility = gBattleMons[gActiveBattler].ability; + break; + case VARIOUS_TRY_HEAL_PULSE: + if (BATTLER_MAX_HP(gActiveBattler)) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + } + else + { + if (GetBattlerAbility(gBattlerAttacker) == ABILITY_MEGA_LAUNCHER && gBattleMoves[gCurrentMove].flags & FLAG_MEGA_LAUNCHER_BOOST) + gBattleMoveDamage = -(gBattleMons[gActiveBattler].maxHP * 75 / 100); + else + gBattleMoveDamage = -(gBattleMons[gActiveBattler].maxHP / 2); + + if (gBattleMoveDamage == 0) + gBattleMoveDamage = -1; + gBattlescriptCurrInstr += 7; + } + return; + case VARIOUS_TRY_QUASH: + if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + } + else + { + for (i = 0; i < gBattlersCount; i++) + data[i] = gBattlerByTurnOrder[i]; + for (i = 0; i < gBattlersCount; i++) + { + if (data[i] == gBattlerTarget) + { + for (j = i + 1; j < gBattlersCount; j++) + data[i++] = data[j]; + } + else + { + gBattlerByTurnOrder[i] = data[i]; + } + } + gBattlerByTurnOrder[gBattlersCount - 1] = gBattlerTarget; + gBattlescriptCurrInstr += 7; + } + return; + case VARIOUS_INVERT_STAT_STAGES: + for (i = 0; i < NUM_BATTLE_STATS; i++) + { + if (gBattleMons[gActiveBattler].statStages[i] < 6) // Negative becomes positive. + gBattleMons[gActiveBattler].statStages[i] = 6 + (6 - gBattleMons[gActiveBattler].statStages[i]); + else if (gBattleMons[gActiveBattler].statStages[i] > 6) // Positive becomes negative. + gBattleMons[gActiveBattler].statStages[i] = 6 - (gBattleMons[gActiveBattler].statStages[i] - 6); + } + break; + case VARIOUS_SET_TERRAIN: + HandleTerrainMove(gBattleMoves[gCurrentMove].effect); + return; + case VARIOUS_TRY_ME_FIRST: + if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else if (gBattleMoves[gBattleMons[gBattlerTarget].moves[gBattleStruct->chosenMovePositions[gBattlerTarget]]].power == 0) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else + { + u16 move = gBattleMons[gBattlerTarget].moves[gBattleStruct->chosenMovePositions[gBattlerTarget]]; + switch (move) + { + case MOVE_STRUGGLE: + case MOVE_CHATTER: + case MOVE_FOCUS_PUNCH: + case MOVE_THIEF: + case MOVE_COVET: + case MOVE_COUNTER: + case MOVE_MIRROR_COAT: + case MOVE_METAL_BURST: + case MOVE_ME_FIRST: + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + break; + default: + gCalledMove = move; + gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); + gBattlerTarget = GetMoveTarget(gCalledMove, 0); + gStatuses3[gBattlerAttacker] |= STATUS3_ME_FIRST; + gBattlescriptCurrInstr += 7; + break; + } + } + return; + case VARIOUS_JUMP_IF_BATTLE_END: + if (NoAliveMonsForEitherParty()) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else + gBattlescriptCurrInstr += 7; + return; + case VARIOUS_TRY_ELECTRIFY: + if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + } + else + { + gStatuses3[gBattlerTarget] |= STATUS3_ELECTRIFIED; + gBattlescriptCurrInstr += 7; + } + return; + case VARIOUS_TRY_REFLECT_TYPE: + if (gBattleMons[gBattlerTarget].species == SPECIES_ARCEUS || gBattleMons[gBattlerTarget].species == SPECIES_SILVALLY) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + } + else if (gBattleMons[gBattlerTarget].type1 == TYPE_MYSTERY && gBattleMons[gBattlerTarget].type2 != TYPE_MYSTERY) + { + gBattleMons[gBattlerAttacker].type1 = gBattleMons[gBattlerTarget].type2; + gBattleMons[gBattlerAttacker].type2 = gBattleMons[gBattlerTarget].type2; + gBattlescriptCurrInstr += 7; + } + else if (gBattleMons[gBattlerTarget].type1 != TYPE_MYSTERY && gBattleMons[gBattlerTarget].type2 == TYPE_MYSTERY) + { + gBattleMons[gBattlerAttacker].type1 = gBattleMons[gBattlerTarget].type1; + gBattleMons[gBattlerAttacker].type2 = gBattleMons[gBattlerTarget].type1; + gBattlescriptCurrInstr += 7; + } + else if (gBattleMons[gBattlerTarget].type1 == TYPE_MYSTERY && gBattleMons[gBattlerTarget].type2 == TYPE_MYSTERY) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + } + else + { + gBattleMons[gBattlerAttacker].type1 = gBattleMons[gBattlerTarget].type1; + gBattleMons[gBattlerAttacker].type2 = gBattleMons[gBattlerTarget].type2; + gBattlescriptCurrInstr += 7; + } + return; + case VARIOUS_TRY_SOAK: + if (gBattleMons[gBattlerTarget].type1 == TYPE_WATER && gBattleMons[gBattlerTarget].type2 == TYPE_WATER) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + } + else + { + SET_BATTLER_TYPE(gBattlerTarget, TYPE_WATER); + gBattlescriptCurrInstr += 7; + } + return; + case VARIOUS_HANDLE_MEGA_EVO: + if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT) + mon = &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]; + else + mon = &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]; + + // Change species. + if (gBattlescriptCurrInstr[3] == 0) + { + gBattleStruct->mega.evolvedSpecies[gActiveBattler] = gBattleMons[gActiveBattler].species; + if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT + || (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT && !(gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER)))) + { + gBattleStruct->mega.playerEvolvedSpecies = gBattleStruct->mega.evolvedSpecies[gActiveBattler]; + } + + gBattleMons[gActiveBattler].species = GetMegaEvolutionSpecies(gBattleStruct->mega.evolvedSpecies[gActiveBattler], gBattleMons[gActiveBattler].item); + PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gActiveBattler].species); + + BtlController_EmitSetMonData(0, REQUEST_SPECIES_BATTLE, gBitTable[gBattlerPartyIndexes[gActiveBattler]], 2, &gBattleMons[gActiveBattler].species); + MarkBattlerForControllerExec(gActiveBattler); + } + // Change stats. + else if (gBattlescriptCurrInstr[3] == 1) + { + RecalcBattlerStats(gActiveBattler, mon); + gBattleStruct->mega.alreadyEvolved[GetBattlerPosition(gActiveBattler)] = TRUE; + gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(gActiveBattler)] |= gBitTable[gBattlerPartyIndexes[gActiveBattler]]; + } + // Update healthbox and elevation. + else + { + UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], mon, HEALTHBOX_ALL); + CreateMegaIndicatorSprite(gActiveBattler, 0); + if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT) + SetBattlerShadowSpriteCallback(gActiveBattler, gBattleMons[gActiveBattler].species); + } + gBattlescriptCurrInstr += 4; + return; + case VARIOUS_HANDLE_FORM_CHANGE: + if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT) + mon = &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]; + else + mon = &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]; + + // Change species. + if (gBattlescriptCurrInstr[3] == 0) + { + PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gActiveBattler].species); + BtlController_EmitSetMonData(0, REQUEST_SPECIES_BATTLE, gBitTable[gBattlerPartyIndexes[gActiveBattler]], 2, &gBattleMons[gActiveBattler].species); + MarkBattlerForControllerExec(gActiveBattler); + } + // Change stats. + else if (gBattlescriptCurrInstr[3] == 1) + { + RecalcBattlerStats(gActiveBattler, mon); + } + // Update healthbox. + else + { + UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], mon, HEALTHBOX_ALL); + } + gBattlescriptCurrInstr += 4; + return; + case VARIOUS_TRY_LAST_RESORT: + if (CanUseLastResort(gActiveBattler)) + gBattlescriptCurrInstr += 7; + else + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + return; + case VARIOUS_ARGUMENT_STATUS_EFFECT: + switch (gBattleMoves[gCurrentMove].argument) + { + case STATUS1_BURN: + gBattleScripting.moveEffect = MOVE_EFFECT_BURN; + break; + case STATUS1_FREEZE: + gBattleScripting.moveEffect = MOVE_EFFECT_FREEZE; + break; + case STATUS1_PARALYSIS: + gBattleScripting.moveEffect = MOVE_EFFECT_PARALYSIS; + break; + case STATUS1_POISON: + gBattleScripting.moveEffect = MOVE_EFFECT_POISON; + break; + case STATUS1_TOXIC_POISON: + gBattleScripting.moveEffect = MOVE_EFFECT_TOXIC; + break; + default: + gBattleScripting.moveEffect = 0; + break; + } + if (gBattleScripting.moveEffect != 0) + { + BattleScriptPush(gBattlescriptCurrInstr + 3); + gBattlescriptCurrInstr = BattleScript_EffectWithChance; + return; + } + break; + case VARIOUS_TRY_HIT_SWITCH_TARGET: + if (IsBattlerAlive(gBattlerAttacker) + && IsBattlerAlive(gBattlerTarget) + && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && TARGET_TURN_DAMAGED) + { + gBattlescriptCurrInstr = BattleScript_ForceRandomSwitch; + } + else + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + } + return; + case VARIOUS_TRY_AUTOTOMIZE: + if (GetBattlerWeight(gActiveBattler) > 1) + { + gDisableStructs[gActiveBattler].autotomizeCount++; + gBattlescriptCurrInstr += 7; + } + else + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + } + return; + case VARIOUS_TRY_COPYCAT: + if (gLastUsedMove == 0xFFFF || (sForbiddenMoves[gLastUsedMove] & FORBIDDEN_COPYCAT)) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + } + else + { + gCalledMove = gLastUsedMove; + gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); + gBattlerTarget = GetMoveTarget(gCalledMove, 0); + gBattlescriptCurrInstr += 7; + } + return; + case VARIOUS_TRY_INSTRUCT: + for (i = 0; sMoveEffectsForbiddenToInstruct[i] != FORBIDDEN_INSTRUCT_END; i++) + { + if (sMoveEffectsForbiddenToInstruct[i] == gBattleMoves[gLastMoves[gBattlerTarget]].effect) + break; + } + if (gLastMoves[gBattlerTarget] == 0 || gLastMoves[gBattlerTarget] == 0xFFFF || sMoveEffectsForbiddenToInstruct[i] != FORBIDDEN_INSTRUCT_END + || gLastMoves[gBattlerTarget] == MOVE_STRUGGLE || gLastMoves[gBattlerTarget] == MOVE_KINGS_SHIELD) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + } + else + { + gSpecialStatuses[gBattlerTarget].instructedChosenTarget = *(gBattleStruct->moveTarget + gBattlerTarget) | 0x4; + gBattlerAttacker = gBattlerTarget; + gCalledMove = gLastMoves[gBattlerAttacker]; + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (gBattleMons[gBattlerAttacker].moves[i] == gCalledMove) + { + gCurrMovePos = i; + i = 4; + break; + } + } + if (i != 4 || gBattleMons[gBattlerAttacker].pp[gCurrMovePos] == 0) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else + { + gBattlerTarget = gBattleStruct->lastMoveTarget[gBattlerAttacker]; + gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); + PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBattler, gBattlerPartyIndexes[gActiveBattler]); + gBattlescriptCurrInstr += 7; + } + } + return; + case VARIOUS_ABILITY_POPUP: + CreateAbilityPopUp(gActiveBattler, gBattleMons[gActiveBattler].ability, (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) != 0); + break; + case VARIOUS_DEFOG: + if (T1_READ_8(gBattlescriptCurrInstr + 3)) // Clear + { + if (ClearDefogHazards(gEffectBattler, TRUE)) + return; + else + gBattlescriptCurrInstr += 8; + } + else + { + if (ClearDefogHazards(gActiveBattler, FALSE)) + gBattlescriptCurrInstr += 8; + else + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 4); + } + return; + case VARIOUS_JUMP_IF_TARGET_ALLY: + if (GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget)) + gBattlescriptCurrInstr += 7; + else + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + return; + case VARIOUS_TRY_SYNCHRONOISE: + if (!DoBattlersShareType(gBattlerAttacker, gBattlerTarget)) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else + gBattlescriptCurrInstr += 7; + return; + case VARIOUS_LOSE_TYPE: + for (i = 0; i < 3; i++) + { + if (*(u8*)(&gBattleMons[gActiveBattler].type1 + i) == gBattlescriptCurrInstr[3]) + *(u8*)(&gBattleMons[gActiveBattler].type1 + i) = TYPE_MYSTERY; + } + gBattlescriptCurrInstr += 4; + return; + case VARIOUS_PSYCHO_SHIFT: + i = TRUE; + if (gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS) + { + if (GetBattlerAbility(gBattlerTarget) == ABILITY_LIMBER) + { + gBattlerAbility = gBattlerTarget; + BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3)); + gBattlescriptCurrInstr = BattleScript_PRLZPrevention; + i = FALSE; + } + else if (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_ELECTRIC)) + { + BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3)); + gBattlescriptCurrInstr = BattleScript_PRLZPrevention; + i = FALSE; + } + else + { + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + } + } + else if (gBattleMons[gBattlerAttacker].status1 & STATUS1_PSN_ANY) + { + if (GetBattlerAbility(gBattlerTarget) == ABILITY_IMMUNITY) + { + gBattlerAbility = gBattlerTarget; + BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3)); + gBattlescriptCurrInstr = BattleScript_PSNPrevention; + i = FALSE; + } + else if (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_POISON) || IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_STEEL)) + { + BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3)); + gBattlescriptCurrInstr = BattleScript_PSNPrevention; + i = FALSE; + } + else + { + if (gBattleMons[gBattlerAttacker].status1 & STATUS1_POISON) + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + else + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + } + } + else if (gBattleMons[gBattlerAttacker].status1 & STATUS1_BURN) + { + if (GetBattlerAbility(gBattlerTarget) == ABILITY_WATER_VEIL) + { + gBattlerAbility = gBattlerTarget; + BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3)); + gBattlescriptCurrInstr = BattleScript_BRNPrevention; + i = FALSE; + } + else if (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_FIRE)) + { + BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3)); + gBattlescriptCurrInstr = BattleScript_BRNPrevention; + i = FALSE; + } + else + { + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + } + } + else if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) + { + if (GetBattlerAbility(gBattlerTarget) == ABILITY_INSOMNIA || GetBattlerAbility(gBattlerTarget) == ABILITY_VITAL_SPIRIT) + { + gBattlerAbility = gBattlerTarget; + // BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3)); + // gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + i = FALSE; + } + else + { + gBattleCommunication[MULTISTRING_CHOOSER] = 4; + } + } + + if (i == TRUE) + { + gBattleMons[gBattlerTarget].status1 = gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY; + gActiveBattler = gBattlerTarget; + BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + MarkBattlerForControllerExec(gActiveBattler); + gBattlescriptCurrInstr += 7; + } + return; + case VARIOUS_CURE_STATUS: + gBattleMons[gActiveBattler].status1 = 0; + BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + MarkBattlerForControllerExec(gActiveBattler); + break; + case VARIOUS_POWER_TRICK: + gStatuses3[gActiveBattler] ^= STATUS3_POWER_TRICK; + SWAP(gBattleMons[gActiveBattler].attack, gBattleMons[gActiveBattler].defense, i); + break; + case VARIOUS_AFTER_YOU: + if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget) + || GetBattlerTurnOrderNum(gBattlerAttacker) == GetBattlerTurnOrderNum(gBattlerTarget) + 1) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + } + else + { + for (i = 0; i < gBattlersCount; i++) + data[i] = gBattlerByTurnOrder[i]; + if (GetBattlerTurnOrderNum(gBattlerAttacker) == 0 && GetBattlerTurnOrderNum(gBattlerTarget) == 2) + { + gBattlerByTurnOrder[1] = gBattlerTarget; + gBattlerByTurnOrder[2] = data[1]; + gBattlerByTurnOrder[3] = data[3]; + } + else if (GetBattlerTurnOrderNum(gBattlerAttacker) == 0 && GetBattlerTurnOrderNum(gBattlerTarget) == 3) + { + gBattlerByTurnOrder[1] = gBattlerTarget; + gBattlerByTurnOrder[2] = data[1]; + gBattlerByTurnOrder[3] = data[2]; + } + else + { + gBattlerByTurnOrder[2] = gBattlerTarget; + gBattlerByTurnOrder[3] = data[2]; + } + gBattlescriptCurrInstr += 7; + } + return; + case VARIOUS_BESTOW: + if (gBattleMons[gBattlerAttacker].item == ITEM_NONE + || gBattleMons[gBattlerTarget].item != ITEM_NONE + || !CanBattlerGetOrLoseItem(gBattlerAttacker, gBattleMons[gBattlerAttacker].item) + || !CanBattlerGetOrLoseItem(gBattlerTarget, gBattleMons[gBattlerAttacker].item)) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + } + else + { + gLastUsedItem = gBattleMons[gBattlerAttacker].item; + + gActiveBattler = gBattlerAttacker; + gBattleMons[gActiveBattler].item = ITEM_NONE; + BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBattler].item); + MarkBattlerForControllerExec(gActiveBattler); + CheckSetUnburden(gBattlerAttacker); + + gActiveBattler = gBattlerTarget; + gBattleMons[gActiveBattler].item = gLastUsedItem; + BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBattler].item); + MarkBattlerForControllerExec(gActiveBattler); + gBattleResources->flags->flags[gBattlerTarget] &= ~(RESOURCE_FLAG_UNBURDEN); + + gBattlescriptCurrInstr += 7; + } + return; + case VARIOUS_ARGUMENT_TO_MOVE_EFFECT: + gBattleScripting.moveEffect = gBattleMoves[gCurrentMove].argument; + break; + case VARIOUS_JUMP_IF_NOT_GROUNDED: + if (!IsBattlerGrounded(gActiveBattler)) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else + gBattlescriptCurrInstr += 7; + return; + case VARIOUS_HANDLE_TRAINER_SLIDE_MSG: + if (gBattlescriptCurrInstr[3] == 0) + { + gBattleScripting.savedDmg = gBattlerSpriteIds[gActiveBattler]; + HideBattlerShadowSprite(gActiveBattler); + } + else if (gBattlescriptCurrInstr[3] == 1) + { + BtlController_EmitPrintString(0, STRINGID_TRAINERSLIDE); + MarkBattlerForControllerExec(gActiveBattler); + } + else + { + gBattlerSpriteIds[gActiveBattler] = gBattleScripting.savedDmg; + if (gBattleMons[gActiveBattler].hp != 0) + { + SetBattlerShadowSpriteCallback(gActiveBattler, gBattleMons[gActiveBattler].species); + BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); + } + } + gBattlescriptCurrInstr += 4; + return; + case VARIOUS_TRY_TRAINER_SLIDE_MSG_FIRST_OFF: + if (ShouldDoTrainerSlide(gActiveBattler, gTrainerBattleOpponent_A, TRAINER_SLIDE_FIRST_DOWN)) + { + BattleScriptPush(gBattlescriptCurrInstr + 3); + gBattlescriptCurrInstr = BattleScript_TrainerSlideMsgRet; + return; + } + break; + case VARIOUS_TRY_TRAINER_SLIDE_MSG_LAST_ON: + if (ShouldDoTrainerSlide(gActiveBattler, gTrainerBattleOpponent_A, TRAINER_SLIDE_LAST_SWITCHIN)) + { + BattleScriptPush(gBattlescriptCurrInstr + 3); + gBattlescriptCurrInstr = BattleScript_TrainerSlideMsgRet; + return; + } + break; + case VARIOUS_SET_AURORA_VEIL: + if (gSideStatuses[GET_BATTLER_SIDE(gActiveBattler)] & SIDE_STATUS_AURORA_VEIL + || !(WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_HAIL_ANY)) + { + gMoveResultFlags |= MOVE_RESULT_MISSED; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + else + { + gSideStatuses[GET_BATTLER_SIDE(gActiveBattler)] |= SIDE_STATUS_AURORA_VEIL; + if (GetBattlerHoldEffect(gActiveBattler, TRUE) == HOLD_EFFECT_LIGHT_CLAY) + gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].auroraVeilTimer = 8; + else + gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].auroraVeilTimer = 5; + gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].auroraVeilBattlerId = gActiveBattler; + + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMonsInBattle(BATTLE_ALIVE_ATK_SIDE) == 2) + gBattleCommunication[MULTISTRING_CHOOSER] = 5; + else + gBattleCommunication[MULTISTRING_CHOOSER] = 5; + } + break; + case VARIOUS_TRY_THIRD_TYPE: + if (IS_BATTLER_OF_TYPE(gActiveBattler, gBattleMoves[gCurrentMove].argument)) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + } + else + { + gBattleMons[gActiveBattler].type3 = gBattleMoves[gCurrentMove].argument; + PREPARE_TYPE_BUFFER(gBattleTextBuff1, gBattleMoves[gCurrentMove].argument); + gBattlescriptCurrInstr += 7; + } + return; } gBattlescriptCurrInstr += 3; } -static void Cmd_setprotectlike(void) // protect and endure +static void Cmd_setprotectlike(void) { - bool8 notLastTurn = TRUE; - u16 lastMove = gLastResultingMoves[gBattlerAttacker]; + bool32 fail = TRUE; + bool32 notLastTurn = TRUE; - if (lastMove != MOVE_PROTECT && lastMove != MOVE_DETECT && lastMove != MOVE_ENDURE) + if (!(gBattleMoves[gLastResultingMoves[gBattlerAttacker]].flags & FLAG_PROTECTION_MOVE)) gDisableStructs[gBattlerAttacker].protectUses = 0; if (gCurrentTurnActionNumber == (gBattlersCount - 1)) @@ -6450,19 +8076,71 @@ static void Cmd_setprotectlike(void) // protect and endure if (sProtectSuccessRates[gDisableStructs[gBattlerAttacker].protectUses] >= Random() && notLastTurn) { - if (gBattleMoves[gCurrentMove].effect == EFFECT_PROTECT) + if (!gBattleMoves[gCurrentMove].argument) // Protects one mon only. { - gProtectStructs[gBattlerAttacker].protected = 1; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + if (gBattleMoves[gCurrentMove].effect == EFFECT_ENDURE) + { + gProtectStructs[gBattlerAttacker].endured = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + } + else if (gCurrentMove == MOVE_DETECT || gCurrentMove == MOVE_PROTECT) + { + gProtectStructs[gBattlerAttacker].protected = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + else if (gCurrentMove == MOVE_SPIKY_SHIELD) + { + gProtectStructs[gBattlerAttacker].spikyShielded = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + else if (gCurrentMove == MOVE_KINGS_SHIELD) + { + gProtectStructs[gBattlerAttacker].kingsShielded = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + else if (gCurrentMove == MOVE_BANEFUL_BUNKER) + { + gProtectStructs[gBattlerAttacker].banefulBunkered = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + + gDisableStructs[gBattlerAttacker].protectUses++; + fail = FALSE; } - if (gBattleMoves[gCurrentMove].effect == EFFECT_ENDURE) + else // Protects the whole side. { - gProtectStructs[gBattlerAttacker].endured = 1; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + u8 side = GetBattlerSide(gBattlerAttacker); + if (gCurrentMove == MOVE_WIDE_GUARD && !(gSideStatuses[side] & SIDE_STATUS_WIDE_GUARD)) + { + gSideStatuses[side] |= SIDE_STATUS_WIDE_GUARD; + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + gDisableStructs[gBattlerAttacker].protectUses++; + fail = FALSE; + } + else if (gCurrentMove == MOVE_QUICK_GUARD && !(gSideStatuses[side] & SIDE_STATUS_QUICK_GUARD)) + { + gSideStatuses[side] |= SIDE_STATUS_QUICK_GUARD; + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + gDisableStructs[gBattlerAttacker].protectUses++; + fail = FALSE; + } + else if (gCurrentMove == MOVE_CRAFTY_SHIELD && !(gSideStatuses[side] & SIDE_STATUS_CRAFTY_SHIELD)) + { + gSideStatuses[side] |= SIDE_STATUS_CRAFTY_SHIELD; + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + gDisableStructs[gBattlerAttacker].protectUses++; + fail = FALSE; + } + else if (gCurrentMove == MOVE_MAT_BLOCK && !(gSideStatuses[side] & SIDE_STATUS_MAT_BLOCK)) + { + gSideStatuses[side] |= SIDE_STATUS_MAT_BLOCK; + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + fail = FALSE; + } } - gDisableStructs[gBattlerAttacker].protectUses++; } - else + + if (fail) { gDisableStructs[gBattlerAttacker].protectUses = 0; gBattleCommunication[MULTISTRING_CHOOSER] = 2; @@ -6477,33 +8155,26 @@ static void Cmd_faintifabilitynotdamp(void) if (gBattleControllerExecFlags) return; - for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++) - { - if (gBattleMons[gBattlerTarget].ability == ABILITY_DAMP) - break; - } - - if (gBattlerTarget == gBattlersCount) - { - gActiveBattler = gBattlerAttacker; - gBattleMoveDamage = gBattleMons[gActiveBattler].hp; - BtlController_EmitHealthBarUpdate(0, INSTANT_HP_BAR_DROP); - MarkBattlerForControllerExec(gActiveBattler); - gBattlescriptCurrInstr++; - - for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++) - { - if (gBattlerTarget == gBattlerAttacker) - continue; - if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) - break; - } - } - else + if ((gBattlerTarget = IsAbilityOnField(ABILITY_DAMP))) { gLastUsedAbility = ABILITY_DAMP; - RecordAbilityBattle(gBattlerTarget, gBattleMons[gBattlerTarget].ability); + RecordAbilityBattle(--gBattlerTarget, ABILITY_DAMP); gBattlescriptCurrInstr = BattleScript_DampStopsExplosion; + return; + } + + gActiveBattler = gBattlerAttacker; + gBattleMoveDamage = gBattleMons[gActiveBattler].hp; + BtlController_EmitHealthBarUpdate(0, INSTANT_HP_BAR_DROP); + MarkBattlerForControllerExec(gActiveBattler); + gBattlescriptCurrInstr++; + + for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++) + { + if (gBattlerTarget == gBattlerAttacker) + continue; + if (IsBattlerAlive(gBattlerTarget)) + break; } } @@ -6524,30 +8195,23 @@ static void Cmd_jumpifnexttargetvalid(void) { const u8 *jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + for (gBattlerTarget++; gBattlerTarget < gBattlersCount; gBattlerTarget++) { - for (gBattlerTarget++; ; gBattlerTarget++) - { - if (gBattlerTarget == gBattlerAttacker) - continue; - if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) - break; - } + if (gBattlerTarget == gBattlerAttacker && !(gBattleMoves[gCurrentMove].target & MOVE_TARGET_USER)) + continue; + if (IsBattlerAlive(gBattlerTarget)) + break; + } - if (gBattlerTarget >= gBattlersCount) - gBattlescriptCurrInstr += 5; - else - gBattlescriptCurrInstr = jumpPtr; - } - else - { + if (gBattlerTarget >= gBattlersCount) gBattlescriptCurrInstr += 5; - } + else + gBattlescriptCurrInstr = jumpPtr; } static void Cmd_tryhealhalfhealth(void) { - const u8* failPtr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + const u8 *failPtr = T1_READ_PTR(gBattlescriptCurrInstr + 1); if (gBattlescriptCurrInstr[5] == BS_ATTACKER) gBattlerTarget = gBattlerAttacker; @@ -6568,18 +8232,13 @@ static void Cmd_trymirrormove(void) s32 validMovesCount; s32 i; u16 move; - u16 movesArray[4]; - - for (i = 0; i < 3; i++) - movesArray[i] = 0; + u16 movesArray[4] = {0}; for (validMovesCount = 0, i = 0; i < gBattlersCount; i++) { if (i != gBattlerAttacker) { - move = *(i * 2 + gBattlerAttacker * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 0) - | (*(i * 2 + gBattlerAttacker * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 1) << 8); - + move = gBattleStruct->lastTakenMoveFrom[gBattlerAttacker][i]; if (move != 0 && move != 0xFFFF) { movesArray[validMovesCount] = move; @@ -6588,9 +8247,7 @@ static void Cmd_trymirrormove(void) } } - move = *(gBattleStruct->lastTakenMove + gBattlerAttacker * 2 + 0) - | (*(gBattleStruct->lastTakenMove + gBattlerAttacker * 2 + 1) << 8); - + move = gBattleStruct->lastTakenMove[gBattlerAttacker]; if (move != 0 && move != 0xFFFF) { gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); @@ -6615,16 +8272,14 @@ static void Cmd_trymirrormove(void) static void Cmd_setrain(void) { - if (gBattleWeather & WEATHER_RAIN_ANY) + if (!TryChangeBattleWeather(gBattlerAttacker, ENUM_WEATHER_RAIN, FALSE)) { gMoveResultFlags |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = 2; } else { - gBattleWeather = WEATHER_RAIN_TEMPORARY; gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gWishFutureKnock.weatherDuration = 5; } gBattlescriptCurrInstr++; } @@ -6639,7 +8294,10 @@ static void Cmd_setreflect(void) else { gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] |= SIDE_STATUS_REFLECT; - gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].reflectTimer = 5; + if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) + gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].reflectTimer = 8; + else + gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].reflectTimer = 5; gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].reflectBattlerId = gBattlerAttacker; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMonsInBattle(BATTLE_ALIVE_ATK_SIDE) == 2) @@ -6683,12 +8341,29 @@ static void Cmd_manipulatedamage(void) gBattleMoveDamage /= 2; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; - if ((gBattleMons[gBattlerTarget].maxHP / 2) < gBattleMoveDamage) + if (B_RECOIL_IF_MISS_DMG >= GEN_5 || ((gBattleMons[gBattlerTarget].maxHP / 2) < gBattleMoveDamage)) gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 2; break; case DMG_DOUBLED: gBattleMoveDamage *= 2; break; + case DMG_1_8_TARGET_HP: + gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 8; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + break; + case DMG_FULL_ATTACKER_HP: + gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP; + break; + case DMG_CURR_ATTACKER_HP: + gBattleMoveDamage = gBattleMons[gBattlerAttacker].hp; + break; + case DMG_BIG_ROOT: + gBattleMoveDamage = GetDrainedBigRootHp(gBattlerAttacker, gBattleMoveDamage); + break; + case DMG_1_2_ATTACKER_HP: + gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 2; + break; } gBattlescriptCurrInstr += 2; @@ -6728,9 +8403,17 @@ static void Cmd_jumpifnotfirstturn(void) gBattlescriptCurrInstr = failJump; } -static void Cmd_nop(void) +static void Cmd_setmiracleeye(void) { - gBattlescriptCurrInstr++; + if (!(gStatuses3[gBattlerTarget] & STATUS3_MIRACLE_EYED)) + { + gStatuses3[gBattlerTarget] |= STATUS3_MIRACLE_EYED; + gBattlescriptCurrInstr += 5; + } + else + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + } } bool8 UproarWakeUpCheck(u8 battlerId) @@ -6763,15 +8446,15 @@ bool8 UproarWakeUpCheck(u8 battlerId) static void Cmd_jumpifcantmakeasleep(void) { const u8 *jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + u32 ability = GetBattlerAbility(gBattlerTarget); if (UproarWakeUpCheck(gBattlerTarget)) { gBattlescriptCurrInstr = jumpPtr; } - else if (gBattleMons[gBattlerTarget].ability == ABILITY_INSOMNIA - || gBattleMons[gBattlerTarget].ability == ABILITY_VITAL_SPIRIT) + else if (ability == ABILITY_INSOMNIA || ability == ABILITY_VITAL_SPIRIT) { - gLastUsedAbility = gBattleMons[gBattlerTarget].ability; + gLastUsedAbility = ability; gBattleCommunication[MULTISTRING_CHOOSER] = 2; gBattlescriptCurrInstr = jumpPtr; RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); @@ -6784,20 +8467,33 @@ static void Cmd_jumpifcantmakeasleep(void) static void Cmd_stockpile(void) { - if (gDisableStructs[gBattlerAttacker].stockpileCounter == 3) + switch (gBattlescriptCurrInstr[1]) { - gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + case 0: + if (gDisableStructs[gBattlerAttacker].stockpileCounter >= 3) + { + gMoveResultFlags |= MOVE_RESULT_MISSED; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + } + else + { + gDisableStructs[gBattlerAttacker].stockpileCounter++; + gDisableStructs[gBattlerAttacker].stockpileBeforeDef = gBattleMons[gBattlerAttacker].statStages[STAT_DEF]; + gDisableStructs[gBattlerAttacker].stockpileBeforeSpDef = gBattleMons[gBattlerAttacker].statStages[STAT_SPDEF]; + PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gDisableStructs[gBattlerAttacker].stockpileCounter); + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + break; + case 1: // Save def/sp def stats. + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + { + gDisableStructs[gBattlerAttacker].stockpileDef += gBattleMons[gBattlerAttacker].statStages[STAT_DEF] - gDisableStructs[gBattlerAttacker].stockpileBeforeDef; + gDisableStructs[gBattlerAttacker].stockpileSpDef += gBattleMons[gBattlerAttacker].statStages[STAT_SPDEF] - gDisableStructs[gBattlerAttacker].stockpileBeforeSpDef; + } + break; } - else - { - gDisableStructs[gBattlerAttacker].stockpileCounter++; - PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gDisableStructs[gBattlerAttacker].stockpileCounter) - - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - gBattlescriptCurrInstr++; + gBattlescriptCurrInstr += 2; } static void Cmd_stockpiletobasedamage(void) @@ -6810,18 +8506,12 @@ static void Cmd_stockpiletobasedamage(void) else { if (gBattleCommunication[6] != 1) - { - gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerTarget], gCurrentMove, - gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)], 0, - 0, gBattlerAttacker, gBattlerTarget) - * gDisableStructs[gBattlerAttacker].stockpileCounter; gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter; - if (gProtectStructs[gBattlerAttacker].helpingHand) - gBattleMoveDamage = gBattleMoveDamage * 15 / 10; - } - gDisableStructs[gBattlerAttacker].stockpileCounter = 0; + // Restore stat changes from stockpile. + gBattleMons[gBattlerAttacker].statStages[STAT_DEF] -= gDisableStructs[gBattlerAttacker].stockpileDef; + gBattleMons[gBattlerAttacker].statStages[STAT_SPDEF] -= gDisableStructs[gBattlerAttacker].stockpileSpDef; gBattlescriptCurrInstr += 5; } } @@ -6835,44 +8525,52 @@ static void Cmd_stockpiletohpheal(void) gBattlescriptCurrInstr = jumpPtr; gBattleCommunication[MULTISTRING_CHOOSER] = 0; } - else if (gBattleMons[gBattlerAttacker].maxHP == gBattleMons[gBattlerAttacker].hp) - { - gDisableStructs[gBattlerAttacker].stockpileCounter = 0; - gBattlescriptCurrInstr = jumpPtr; - gBattlerTarget = gBattlerAttacker; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } else { - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / (1 << (3 - gDisableStructs[gBattlerAttacker].stockpileCounter)); + if (gBattleMons[gBattlerAttacker].maxHP == gBattleMons[gBattlerAttacker].hp) + { + gDisableStructs[gBattlerAttacker].stockpileCounter = 0; + gBattlescriptCurrInstr = jumpPtr; + gBattlerTarget = gBattlerAttacker; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + } + else + { + gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / (1 << (3 - gDisableStructs[gBattlerAttacker].stockpileCounter)); - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage *= -1; - gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter; - gDisableStructs[gBattlerAttacker].stockpileCounter = 0; - gBattlescriptCurrInstr += 5; - gBattlerTarget = gBattlerAttacker; + gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter; + gDisableStructs[gBattlerAttacker].stockpileCounter = 0; + gBattlescriptCurrInstr += 5; + gBattlerTarget = gBattlerAttacker; + } + + // Restore stat changes from stockpile. + gBattleMons[gBattlerAttacker].statStages[STAT_DEF] -= gDisableStructs[gBattlerAttacker].stockpileDef; + gBattleMons[gBattlerAttacker].statStages[STAT_SPDEF] -= gDisableStructs[gBattlerAttacker].stockpileSpDef; } } -static void Cmd_negativedamage(void) +static void Cmd_setdrainedhp(void) { - gBattleMoveDamage = -(gHpDealt / 2); + if (gBattleMoves[gCurrentMove].argument != 0) + gBattleMoveDamage = -(gHpDealt * gBattleMoves[gCurrentMove].argument / 100); + else + gBattleMoveDamage = -(gHpDealt / 2); + if (gBattleMoveDamage == 0) gBattleMoveDamage = -1; gBattlescriptCurrInstr++; } -#define STAT_BUFF_WORKED 0 -#define STAT_BUFF_DIDNT_WORK 1 - -static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr) +static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr) { - bool8 certain = FALSE; - bool8 notProtectAffected = FALSE; + bool32 certain = FALSE; + bool32 notProtectAffected = FALSE; u32 index; if (flags & MOVE_EFFECT_AFFECTS_USER) @@ -6880,6 +8578,8 @@ static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr) else gActiveBattler = gBattlerTarget; + gSpecialStatuses[gActiveBattler].changedStatsBattlerId = gBattlerAttacker; + flags &= ~(MOVE_EFFECT_AFFECTS_USER); if (flags & MOVE_EFFECT_CERTAIN) @@ -6890,12 +8590,23 @@ static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr) notProtectAffected++; flags &= ~(STAT_BUFF_NOT_PROTECT_AFFECTED); - PREPARE_STAT_BUFFER(gBattleTextBuff1, statId) + if (GetBattlerAbility(gActiveBattler) == ABILITY_CONTRARY) + { + statValue ^= STAT_BUFF_NEGATIVE; + gBattleScripting.statChanger ^= STAT_BUFF_NEGATIVE; + } + else if (GetBattlerAbility(gActiveBattler) == ABILITY_SIMPLE) + { + statValue = (SET_STAT_BUFF_VALUE(GET_STAT_BUFF_VALUE(statValue) * 2)) | ((statValue <= -1) ? STAT_BUFF_NEGATIVE : 0); + } + + PREPARE_STAT_BUFFER(gBattleTextBuff1, statId); if (statValue <= -1) // Stat decrease. { if (gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].mistTimer - && !certain && gCurrentMove != MOVE_CURSE) + && !certain && gCurrentMove != MOVE_CURSE + && !(gActiveBattler == gBattlerTarget && GetBattlerAbility(gBattlerAttacker) == ABILITY_INFILTRATOR)) { if (flags == STAT_BUFF_ALLOW_PTR) { @@ -6911,16 +8622,17 @@ static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr) gSpecialStatuses[gActiveBattler].statLowered = 1; } } - return STAT_BUFF_DIDNT_WORK; + return STAT_CHANGE_DIDNT_WORK; } else if (gCurrentMove != MOVE_CURSE && notProtectAffected != TRUE && JumpIfMoveAffectedByProtect(0)) { gBattlescriptCurrInstr = BattleScript_ButItFailed; - return STAT_BUFF_DIDNT_WORK; + return STAT_CHANGE_DIDNT_WORK; } - else if ((gBattleMons[gActiveBattler].ability == ABILITY_CLEAR_BODY - || gBattleMons[gActiveBattler].ability == ABILITY_WHITE_SMOKE) + else if ((GetBattlerAbility(gActiveBattler) == ABILITY_CLEAR_BODY + || GetBattlerAbility(gActiveBattler) == ABILITY_FULL_METAL_BODY + || GetBattlerAbility(gActiveBattler) == ABILITY_WHITE_SMOKE) && !certain && gCurrentMove != MOVE_CURSE) { if (flags == STAT_BUFF_ALLOW_PTR) @@ -6933,47 +8645,74 @@ static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr) { BattleScriptPush(BS_ptr); gBattleScripting.battler = gActiveBattler; + gBattlerAbility = gActiveBattler; gBattlescriptCurrInstr = BattleScript_AbilityNoStatLoss; - gLastUsedAbility = gBattleMons[gActiveBattler].ability; + gLastUsedAbility = GetBattlerAbility(gActiveBattler); RecordAbilityBattle(gActiveBattler, gLastUsedAbility); gSpecialStatuses[gActiveBattler].statLowered = 1; } } - return STAT_BUFF_DIDNT_WORK; + return STAT_CHANGE_DIDNT_WORK; } - else if (gBattleMons[gActiveBattler].ability == ABILITY_KEEN_EYE + else if ((index = IsFlowerVeilProtected(gActiveBattler)) && !certain) + { + if (flags == STAT_BUFF_ALLOW_PTR) + { + if (gSpecialStatuses[gActiveBattler].statLowered) + { + gBattlescriptCurrInstr = BS_ptr; + } + else + { + BattleScriptPush(BS_ptr); + gBattleScripting.battler = gActiveBattler; + gBattlerAbility = index - 1; + gBattlescriptCurrInstr = BattleScript_FlowerVeilProtectsRet; + gLastUsedAbility = ABILITY_FLOWER_VEIL; + gSpecialStatuses[gActiveBattler].statLowered = 1; + } + } + return STAT_CHANGE_DIDNT_WORK; + } + else if (GetBattlerAbility(gActiveBattler) == ABILITY_KEEN_EYE && !certain && statId == STAT_ACC) { if (flags == STAT_BUFF_ALLOW_PTR) { BattleScriptPush(BS_ptr); gBattleScripting.battler = gActiveBattler; + gBattlerAbility = gActiveBattler; gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss; - gLastUsedAbility = gBattleMons[gActiveBattler].ability; + gLastUsedAbility = GetBattlerAbility(gActiveBattler); RecordAbilityBattle(gActiveBattler, gLastUsedAbility); } - return STAT_BUFF_DIDNT_WORK; + return STAT_CHANGE_DIDNT_WORK; } - else if (gBattleMons[gActiveBattler].ability == ABILITY_HYPER_CUTTER + else if (GetBattlerAbility(gActiveBattler) == ABILITY_HYPER_CUTTER && !certain && statId == STAT_ATK) { if (flags == STAT_BUFF_ALLOW_PTR) { BattleScriptPush(BS_ptr); gBattleScripting.battler = gActiveBattler; + gBattlerAbility = gActiveBattler; gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss; - gLastUsedAbility = gBattleMons[gActiveBattler].ability; + gLastUsedAbility = GetBattlerAbility(gActiveBattler); RecordAbilityBattle(gActiveBattler, gLastUsedAbility); } - return STAT_BUFF_DIDNT_WORK; + return STAT_CHANGE_DIDNT_WORK; } - else if (gBattleMons[gActiveBattler].ability == ABILITY_SHIELD_DUST && flags == 0) + else if (GetBattlerAbility(gActiveBattler) == ABILITY_SHIELD_DUST && flags == 0) { - return STAT_BUFF_DIDNT_WORK; + return STAT_CHANGE_DIDNT_WORK; } else // try to decrease { statValue = -GET_STAT_BUFF_VALUE(statValue); + if (gBattleMons[gActiveBattler].statStages[statId] == 1) + statValue = -1; + else if (gBattleMons[gActiveBattler].statStages[statId] == 2 && statValue < -2) + statValue = -2; gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN; index = 1; if (statValue == -2) @@ -6983,6 +8722,13 @@ static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr) gBattleTextBuff2[3] = STRINGID_STATHARSHLY >> 8; index = 4; } + else if (statValue <= -3) + { + gBattleTextBuff2[1] = B_BUFF_STRING; + gBattleTextBuff2[2] = STRINGID_SEVERELY & 0xFF; + gBattleTextBuff2[3] = STRINGID_SEVERELY >> 8; + index = 4; + } gBattleTextBuff2[index] = B_BUFF_STRING; index++; gBattleTextBuff2[index] = STRINGID_STATFELL; @@ -6995,12 +8741,15 @@ static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr) gBattleCommunication[MULTISTRING_CHOOSER] = 2; else gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == gActiveBattler); - } } else // stat increase { statValue = GET_STAT_BUFF_VALUE(statValue); + if (gBattleMons[gActiveBattler].statStages[statId] == 11) + statValue = 1; + else if (gBattleMons[gActiveBattler].statStages[statId] == 10 && statValue > 2) + statValue = 2; gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN; index = 1; if (statValue == 2) @@ -7010,6 +8759,13 @@ static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr) gBattleTextBuff2[3] = STRINGID_STATSHARPLY >> 8; index = 4; } + else if (statValue >= 3) + { + gBattleTextBuff2[1] = B_BUFF_STRING; + gBattleTextBuff2[2] = STRINGID_DRASTICALLY & 0xFF; + gBattleTextBuff2[3] = STRINGID_DRASTICALLY >> 8; + index = 4; + } gBattleTextBuff2[index] = B_BUFF_STRING; index++; gBattleTextBuff2[index] = STRINGID_STATROSE; @@ -7034,16 +8790,21 @@ static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr) gMoveResultFlags |= MOVE_RESULT_MISSED; if (gBattleCommunication[MULTISTRING_CHOOSER] == 2 && !(flags & STAT_BUFF_ALLOW_PTR)) - return STAT_BUFF_DIDNT_WORK; + return STAT_CHANGE_DIDNT_WORK; - return STAT_BUFF_WORKED; + return STAT_CHANGE_WORKED; } static void Cmd_statbuffchange(void) { - const u8* jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 2); - if (ChangeStatBuffs(gBattleScripting.statChanger & 0xF0, GET_STAT_BUFF_ID(gBattleScripting.statChanger), gBattlescriptCurrInstr[1], jumpPtr) == STAT_BUFF_WORKED) - gBattlescriptCurrInstr += 6; + u16 flags = T1_READ_16(gBattlescriptCurrInstr + 1); + const u8 *ptrBefore = gBattlescriptCurrInstr; + const u8 *jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + + if (ChangeStatBuffs(GET_STAT_BUFF_VALUE_WITH_SIGN(gBattleScripting.statChanger), GET_STAT_BUFF_ID(gBattleScripting.statChanger), flags, jumpPtr) == STAT_CHANGE_WORKED) + gBattlescriptCurrInstr += 7; + else if (gBattlescriptCurrInstr == ptrBefore) // Prevent infinite looping. + gBattlescriptCurrInstr = jumpPtr; } static void Cmd_normalisebuffs(void) // haze @@ -7052,6 +8813,8 @@ static void Cmd_normalisebuffs(void) // haze for (i = 0; i < gBattlersCount; i++) { + gDisableStructs[i].stockpileDef = 0; + gDisableStructs[i].stockpileSpDef = 0; for (j = 0; j < NUM_BATTLE_STATS; j++) gBattleMons[i].statStages[j] = DEFAULT_STAT_STAGE; } @@ -7071,8 +8834,8 @@ static void Cmd_setbide(void) static void Cmd_confuseifrepeatingattackends(void) { - if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_LOCK_CONFUSE)) - gBattleCommunication[MOVE_EFFECT_BYTE] = (MOVE_EFFECT_THRASH | MOVE_EFFECT_AFFECTS_USER); + if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_LOCK_CONFUSE) && !gSpecialStatuses[gBattlerAttacker].dancerUsedMove) + gBattleScripting.moveEffect = (MOVE_EFFECT_THRASH | MOVE_EFFECT_AFFECTS_USER); gBattlescriptCurrInstr++; } @@ -7085,11 +8848,36 @@ static void Cmd_setmultihitcounter(void) } else { - gMultiHitCounter = Random() & 3; - if (gMultiHitCounter > 1) - gMultiHitCounter = (Random() & 3) + 2; + if (GetBattlerAbility(gBattlerAttacker) == ABILITY_SKILL_LINK) + { + gMultiHitCounter = 5; + } + else if (B_MULTI_HIT_CHANCE >= GEN_5) + { + // 2 and 3 hits: 33.3% + // 4 and 5 hits: 16.7% + gMultiHitCounter = Random() % 4; + if (gMultiHitCounter > 2) + { + gMultiHitCounter = (Random() % 3); + if (gMultiHitCounter < 2) + gMultiHitCounter = 2; + else + gMultiHitCounter = 3; + } + else + gMultiHitCounter += 3; + } else - gMultiHitCounter += 2; + { + // 2 and 3 hits: 37.5% + // 4 and 5 hits: 12.5% + gMultiHitCounter = Random() % 4; + if (gMultiHitCounter > 1) + gMultiHitCounter = (Random() % 4) + 2; + else + gMultiHitCounter += 2; + } } gBattlescriptCurrInstr += 2; @@ -7102,27 +8890,6 @@ static void Cmd_initmultihitstring(void) gBattlescriptCurrInstr++; } -static bool8 TryDoForceSwitchOut(void) -{ - if (gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level) - { - *(gBattleStruct->field_58 + gBattlerTarget) = gBattlerPartyIndexes[gBattlerTarget]; - } - else - { - u16 random = Random() & 0xFF; - if ((u32)((random * (gBattleMons[gBattlerAttacker].level + gBattleMons[gBattlerTarget].level) >> 8) + 1) <= (gBattleMons[gBattlerTarget].level / 4)) - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - return FALSE; - } - *(gBattleStruct->field_58 + gBattlerTarget) = gBattlerPartyIndexes[gBattlerTarget]; - } - - gBattlescriptCurrInstr = BattleScript_SuccessForceOut; - return TRUE; -} - static void Cmd_forcerandomswitch(void) { s32 i; @@ -7135,14 +8902,35 @@ static void Cmd_forcerandomswitch(void) s32 validMons = 0; s32 minNeeded; - if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER)) + // Swapping pokemon happens in: + // trainer battles + // wild double battles when an opposing pokemon uses it against one of the two alive player mons + // wild double battle when a player pokemon uses it against its partner + if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) + || (WILD_DOUBLE_BATTLE + && GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT + && GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER + && IS_WHOLE_SIDE_ALIVE(gBattlerTarget)) + || (WILD_DOUBLE_BATTLE + && GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER + && GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER) + ) { if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER) party = gPlayerParty; else party = gEnemyParty; - if ((gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER && gBattleTypeFlags & BATTLE_TYPE_LINK) + if (BATTLE_TWO_VS_ONE_OPPONENT && GetBattlerSide(gBattlerTarget) == B_SIDE_OPPONENT) + { + firstMonId = 0; + lastMonId = 6; + monsCount = 6; + minNeeded = 2; + battler2PartyId = gBattlerPartyIndexes[gBattlerTarget]; + battler1PartyId = gBattlerPartyIndexes[gBattlerTarget ^ BIT_FLANK]; + } + else if ((gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER && gBattleTypeFlags & BATTLE_TYPE_LINK) || (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER && gBattleTypeFlags & BATTLE_TYPE_x2000000) || (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)) { @@ -7241,19 +9029,20 @@ static void Cmd_forcerandomswitch(void) } else { - if (TryDoForceSwitchOut()) + *(gBattleStruct->field_58 + gBattlerTarget) = gBattlerPartyIndexes[gBattlerTarget]; + gBattlescriptCurrInstr = BattleScript_RoarSuccessSwitch; + + do { - do - { - do - { - i = Random() % monsCount; - i += firstMonId; - } while (i == battler2PartyId || i == battler1PartyId); - } while (GetMonData(&party[i], MON_DATA_SPECIES) == SPECIES_NONE - || GetMonData(&party[i], MON_DATA_IS_EGG) == TRUE - || GetMonData(&party[i], MON_DATA_HP) == 0); // Should be one while loop, conjoined by an ||, but that doesn't match. Equivalent logic though + i = Random() % monsCount; + i += firstMonId; } + while (i == battler2PartyId + || i == battler1PartyId + || GetMonData(&party[i], MON_DATA_SPECIES) == SPECIES_NONE + || GetMonData(&party[i], MON_DATA_IS_EGG) == TRUE + || GetMonData(&party[i], MON_DATA_HP) == 0); + *(gBattleStruct->monToSwitchIntoId + gBattlerTarget) = i; if (!IsMultiBattle()) @@ -7274,7 +9063,11 @@ static void Cmd_forcerandomswitch(void) } else { - TryDoForceSwitchOut(); + // In normal wild doubles, Roar will always fail if the user's level is less than the target's. + if (gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level) + gBattlescriptCurrInstr = BattleScript_RoarSuccessEndBattle; + else + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } @@ -7304,7 +9097,8 @@ static void Cmd_tryconversiontypechange(void) // randomly changes user's type to moveType = TYPE_NORMAL; } if (moveType != gBattleMons[gBattlerAttacker].type1 - && moveType != gBattleMons[gBattlerAttacker].type2) + && moveType != gBattleMons[gBattlerAttacker].type2 + && moveType != gBattleMons[gBattlerAttacker].type3) { break; } @@ -7331,7 +9125,7 @@ static void Cmd_tryconversiontypechange(void) // randomly changes user's type to moveType = TYPE_NORMAL; } } - while (moveType == gBattleMons[gBattlerAttacker].type1 || moveType == gBattleMons[gBattlerAttacker].type2); + while (moveType == gBattleMons[gBattlerAttacker].type1 || moveType == gBattleMons[gBattlerAttacker].type2 || moveType == gBattleMons[gBattlerAttacker].type3); SET_BATTLER_TYPE(gBattlerAttacker, moveType); PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); @@ -7368,7 +9162,10 @@ static void Cmd_setlightscreen(void) else { gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] |= SIDE_STATUS_LIGHTSCREEN; - gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].lightscreenTimer = 5; + if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) + gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].lightscreenTimer = 8; + else + gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].lightscreenTimer = 5; gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].lightscreenBattlerId = gBattlerAttacker; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMonsInBattle(BATTLE_ALIVE_ATK_SIDE) == 2) @@ -7382,66 +9179,54 @@ static void Cmd_setlightscreen(void) static void Cmd_tryKO(void) { - u8 holdEffect, param; - - if (gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY) - { - holdEffect = gEnigmaBerries[gBattlerTarget].holdEffect; - param = gEnigmaBerries[gBattlerTarget].holdEffectParam; - } - else - { - holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item); - param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item); - } + bool32 lands = FALSE; + u32 holdEffect = GetBattlerHoldEffect(gBattlerTarget, TRUE); gPotentialItemEffectBattler = gBattlerTarget; - - if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < param) + if (holdEffect == HOLD_EFFECT_FOCUS_BAND + && (Random() % 100) < GetBattlerHoldEffectParam(gBattlerTarget)) { - RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_FOCUS_BAND); gSpecialStatuses[gBattlerTarget].focusBanded = 1; + RecordItemEffectBattle(gBattlerTarget, holdEffect); + } + else if (holdEffect == HOLD_EFFECT_FOCUS_SASH && BATTLER_MAX_HP(gBattlerTarget)) + { + gSpecialStatuses[gBattlerTarget].focusSashed = 1; + RecordItemEffectBattle(gBattlerTarget, holdEffect); } - if (gBattleMons[gBattlerTarget].ability == ABILITY_STURDY) + if (GetBattlerAbility(gBattlerTarget) == ABILITY_STURDY) { gMoveResultFlags |= MOVE_RESULT_MISSED; gLastUsedAbility = ABILITY_STURDY; gBattlescriptCurrInstr = BattleScript_SturdyPreventsOHKO; - RecordAbilityBattle(gBattlerTarget, ABILITY_STURDY); + gBattlerAbility = gBattlerTarget; } else { - u16 chance; - if (!(gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS)) + if ((((gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS) + && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker) + || GetBattlerAbility(gBattlerAttacker) == ABILITY_NO_GUARD + || GetBattlerAbility(gBattlerTarget) == ABILITY_NO_GUARD) + && gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level) { - chance = gBattleMoves[gCurrentMove].accuracy + (gBattleMons[gBattlerAttacker].level - gBattleMons[gBattlerTarget].level); - if (Random() % 100 + 1 < chance && gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level) - chance = TRUE; - else - chance = FALSE; - } - else if (gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker - && gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level) - { - chance = TRUE; + lands = TRUE; } else { - chance = gBattleMoves[gCurrentMove].accuracy + (gBattleMons[gBattlerAttacker].level - gBattleMons[gBattlerTarget].level); - if (Random() % 100 + 1 < chance && gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level) - chance = TRUE; - else - chance = FALSE; + u16 odds = gBattleMoves[gCurrentMove].accuracy + (gBattleMons[gBattlerAttacker].level - gBattleMons[gBattlerTarget].level); + if (Random() % 100 + 1 < odds && gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level) + lands = TRUE; } - if (chance) + + if (lands) { if (gProtectStructs[gBattlerTarget].endured) { gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - 1; gMoveResultFlags |= MOVE_RESULT_FOE_ENDURED; } - else if (gSpecialStatuses[gBattlerTarget].focusBanded) + else if (gSpecialStatuses[gBattlerTarget].focusBanded || gSpecialStatuses[gBattlerTarget].focusSashed) { gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - 1; gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON; @@ -7477,68 +9262,68 @@ static void Cmd_damagetohalftargethp(void) // super fang static void Cmd_setsandstorm(void) { - if (gBattleWeather & WEATHER_SANDSTORM_ANY) + if (!TryChangeBattleWeather(gBattlerAttacker, ENUM_WEATHER_SANDSTORM, FALSE)) { gMoveResultFlags |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = 2; } else { - gBattleWeather = WEATHER_SANDSTORM_TEMPORARY; gBattleCommunication[MULTISTRING_CHOOSER] = 3; - gWishFutureKnock.weatherDuration = 5; } gBattlescriptCurrInstr++; } static void Cmd_weatherdamage(void) { - if (WEATHER_HAS_EFFECT) + u32 ability = GetBattlerAbility(gBattlerAttacker); + + gBattleMoveDamage = 0; + if (IsBattlerAlive(gBattlerAttacker) && WEATHER_HAS_EFFECT && ability != ABILITY_MAGIC_GUARD) { if (gBattleWeather & WEATHER_SANDSTORM_ANY) { - if (gBattleMons[gBattlerAttacker].type1 != TYPE_ROCK - && gBattleMons[gBattlerAttacker].type1 != TYPE_STEEL - && gBattleMons[gBattlerAttacker].type1 != TYPE_GROUND - && gBattleMons[gBattlerAttacker].type2 != TYPE_ROCK - && gBattleMons[gBattlerAttacker].type2 != TYPE_STEEL - && gBattleMons[gBattlerAttacker].type2 != TYPE_GROUND - && gBattleMons[gBattlerAttacker].ability != ABILITY_SAND_VEIL - && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERGROUND) - && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER)) + if (!IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ROCK) + && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GROUND) + && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_STEEL) + && ability != ABILITY_SAND_VEIL + && ability != ABILITY_SAND_FORCE + && ability != ABILITY_SAND_RUSH + && ability != ABILITY_OVERCOAT + && !(gStatuses3[gBattlerAttacker] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) + && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOOGLES) { gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; } - else - { - gBattleMoveDamage = 0; - } } if (gBattleWeather & WEATHER_HAIL_ANY) { - if (!IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ICE) - && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERGROUND) - && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER)) + if (ability == ABILITY_ICE_BODY + && !(gStatuses3[gBattlerAttacker] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) + && !BATTLER_MAX_HP(gBattlerAttacker) + && !(gStatuses3[gBattlerAttacker] & STATUS3_HEAL_BLOCK)) + { + gBattlerAbility = gBattlerAttacker; + gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage *= -1; + } + else if (!IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ICE) + && ability != ABILITY_SNOW_CLOAK + && ability != ABILITY_OVERCOAT + && ability != ABILITY_ICE_BODY + && !(gStatuses3[gBattlerAttacker] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) + && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOOGLES) { gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; } - else - { - gBattleMoveDamage = 0; - } } } - else - { - gBattleMoveDamage = 0; - } - - if (gAbsentBattlerFlags & gBitTable[gBattlerAttacker]) - gBattleMoveDamage = 0; gBattlescriptCurrInstr++; } @@ -7565,7 +9350,7 @@ static void Cmd_tryinfatuating(void) speciesTarget = GetMonData(monTarget, MON_DATA_SPECIES); personalityTarget = GetMonData(monTarget, MON_DATA_PERSONALITY); - if (gBattleMons[gBattlerTarget].ability == ABILITY_OBLIVIOUS) + if (GetBattlerAbility(gBattlerTarget) == ABILITY_OBLIVIOUS) { gBattlescriptCurrInstr = BattleScript_ObliviousPreventsAttraction; gLastUsedAbility = ABILITY_OBLIVIOUS; @@ -7658,6 +9443,7 @@ static void Cmd_transformdataexecution(void) gChosenMove = 0xFFFF; gBattlescriptCurrInstr++; if (gBattleMons[gBattlerTarget].status2 & STATUS2_TRANSFORMED + || gBattleStruct->illusion[gBattlerTarget].on || gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE) { gMoveResultFlags |= MOVE_RESULT_FAILED; @@ -7673,6 +9459,7 @@ static void Cmd_transformdataexecution(void) gDisableStructs[gBattlerAttacker].disableTimer = 0; gDisableStructs[gBattlerAttacker].transformedMonPersonality = gBattleMons[gBattlerTarget].personality; gDisableStructs[gBattlerAttacker].mimickedMoves = 0; + gDisableStructs[gBattlerAttacker].usedMoves = 0; PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerTarget].species) @@ -7724,22 +9511,10 @@ static void Cmd_setsubstitute(void) gBattlescriptCurrInstr++; } -static bool8 IsMoveUncopyableByMimic(u16 move) -{ - s32 i; - for (i = 0; sMovesForbiddenToCopy[i] != MIMIC_FORBIDDEN_END - && sMovesForbiddenToCopy[i] != move; i++); - - return (sMovesForbiddenToCopy[i] != MIMIC_FORBIDDEN_END); -} - static void Cmd_mimicattackcopy(void) { - gChosenMove = 0xFFFF; - - if (IsMoveUncopyableByMimic(gLastMoves[gBattlerTarget]) - || gBattleMons[gBattlerAttacker].status2 & STATUS2_TRANSFORMED - || gLastMoves[gBattlerTarget] == 0 + if ((sForbiddenMoves[gLastMoves[gBattlerTarget]] & FORBIDDEN_MIMIC) + || (gBattleMons[gBattlerAttacker].status2 & STATUS2_TRANSFORMED) || gLastMoves[gBattlerTarget] == 0xFFFF) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); @@ -7756,13 +9531,13 @@ static void Cmd_mimicattackcopy(void) if (i == MAX_MON_MOVES) { + gChosenMove = 0xFFFF; gBattleMons[gBattlerAttacker].moves[gCurrMovePos] = gLastMoves[gBattlerTarget]; if (gBattleMoves[gLastMoves[gBattlerTarget]].pp < 5) gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = gBattleMoves[gLastMoves[gBattlerTarget]].pp; else gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = 5; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastMoves[gBattlerTarget]) gDisableStructs[gBattlerAttacker].mimickedMoves |= gBitTable[gCurrMovePos]; @@ -7779,25 +9554,11 @@ static void Cmd_metronome(void) { while (1) { - s32 i; - - gCurrentMove = (Random() & 0x1FF) + 1; - if (gCurrentMove >= MOVES_COUNT) + gCurrentMove = (Random() % (MOVES_COUNT - 1)) + 1; + if (gBattleMoves[gCurrentMove].effect == EFFECT_PLACEHOLDER) continue; - for (i = 0; i < MAX_MON_MOVES; i++); // ? - - i = -1; - while (1) - { - i++; - if (sMovesForbiddenToCopy[i] == gCurrentMove) - break; - if (sMovesForbiddenToCopy[i] == METRONOME_FORBIDDEN_END) - break; - } - - if (sMovesForbiddenToCopy[i] == METRONOME_FORBIDDEN_END) + if (!(sForbiddenMoves[gCurrentMove] & FORBIDDEN_METRONOME)) { gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; @@ -7816,10 +9577,10 @@ static void Cmd_dmgtolevel(void) static void Cmd_psywavedamageeffect(void) { s32 randDamage; - - while ((randDamage = (Random() & 0xF)) > 10); - - randDamage *= 10; + if (B_PSYWAVE_DMG >= GEN_6) + randDamage = (Random() % 101); + else + randDamage = (Random() % 11) * 10; gBattleMoveDamage = gBattleMons[gBattlerAttacker].level * (randDamage + 50) / 100; gBattlescriptCurrInstr++; } @@ -7849,7 +9610,7 @@ static void Cmd_counterdamagecalculator(void) } } -static void Cmd_mirrorcoatdamagecalculator(void) // a copy of Cmd with the physical -> special field changes +static void Cmd_mirrorcoatdamagecalculator(void) // a copy of atkA1 with the physical -> special field changes { u8 sideAttacker = GetBattlerSide(gBattlerAttacker); u8 sideTarget = GetBattlerSide(gProtectStructs[gBattlerAttacker].specialBattlerId); @@ -7887,7 +9648,12 @@ static void Cmd_disablelastusedattack(void) PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerTarget].moves[i]) gDisableStructs[gBattlerTarget].disabledMove = gBattleMons[gBattlerTarget].moves[i]; - gDisableStructs[gBattlerTarget].disableTimer = (Random() & 3) + 2; + if (B_DISABLE_TURNS == GEN_3) + gDisableStructs[gBattlerTarget].disableTimer = (Random() & 3) + 2; + else if (B_DISABLE_TURNS == GEN_4) + gDisableStructs[gBattlerTarget].disableTimer = (Random() & 3) + 4; + else + gDisableStructs[gBattlerTarget].disableTimer = 4; gDisableStructs[gBattlerTarget].disableTimerStartValue = gDisableStructs[gBattlerTarget].disableTimer; // used to save the random amount of turns? gBattlescriptCurrInstr += 5; } @@ -7919,7 +9685,7 @@ static void Cmd_trysetencore(void) { gDisableStructs[gBattlerTarget].encoredMove = gBattleMons[gBattlerTarget].moves[i]; gDisableStructs[gBattlerTarget].encoredMovePos = i; - gDisableStructs[gBattlerTarget].encoreTimer = (Random() & 3) + 3; + gDisableStructs[gBattlerTarget].encoreTimer = 3; gDisableStructs[gBattlerTarget].encoreTimerStartValue = gDisableStructs[gBattlerTarget].encoreTimer; gBattlescriptCurrInstr += 5; } @@ -7931,7 +9697,7 @@ static void Cmd_trysetencore(void) static void Cmd_painsplitdmgcalc(void) { - if (!(gBattleMons[gBattlerTarget].status2 & STATUS2_SUBSTITUTE)) + if (!(DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove))) { s32 hpDiff = (gBattleMons[gBattlerAttacker].hp + gBattleMons[gBattlerTarget].hp) / 2; s32 painSplitHp = gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - hpDiff; @@ -7967,45 +9733,36 @@ static void Cmd_settypetorandomresistance(void) // conversion 2 } else { - s32 i, j, rands; + u32 i, resistTypes = 0; + u32 hitByType = gLastHitByType[gBattlerAttacker]; - for (rands = 0; rands < 1000; rands++) + for (i = 0; i < NUMBER_OF_MON_TYPES; i++) // Find all types that resist. { - while (((i = (Random() & 0x7F)) > sizeof(gTypeEffectiveness) / 3)); - - i *= 3; - - if (TYPE_EFFECT_ATK_TYPE(i) == gLastHitByType[gBattlerAttacker] - && TYPE_EFFECT_MULTIPLIER(i) <= TYPE_MUL_NOT_EFFECTIVE - && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_EFFECT_DEF_TYPE(i))) + switch (GetTypeModifier(hitByType, i)) { - SET_BATTLER_TYPE(gBattlerAttacker, TYPE_EFFECT_DEF_TYPE(i)); - PREPARE_TYPE_BUFFER(gBattleTextBuff1, TYPE_EFFECT_DEF_TYPE(i)); - - gBattlescriptCurrInstr += 5; - return; + case UQ_4_12(0): + case UQ_4_12(0.5): + resistTypes |= gBitTable[i]; + break; } } - for (j = 0, rands = 0; rands < sizeof(gTypeEffectiveness); j += 3, rands += 3) + while (resistTypes != 0) { - switch (TYPE_EFFECT_ATK_TYPE(j)) + i = Random() % NUMBER_OF_MON_TYPES; + if (resistTypes & gBitTable[i]) { - case TYPE_ENDTABLE: - case TYPE_FORESIGHT: - break; - default: - if (TYPE_EFFECT_ATK_TYPE(j) == gLastHitByType[gBattlerAttacker] - && TYPE_EFFECT_MULTIPLIER(j) <= 5 - && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_EFFECT_DEF_TYPE(i))) + if (IS_BATTLER_OF_TYPE(gBattlerAttacker, i)) { - SET_BATTLER_TYPE(gBattlerAttacker, TYPE_EFFECT_DEF_TYPE(rands)); - PREPARE_TYPE_BUFFER(gBattleTextBuff1, TYPE_EFFECT_DEF_TYPE(rands)) - + resistTypes &= ~(gBitTable[i]); // Type resists, but the user is already of this type. + } + else + { + SET_BATTLER_TYPE(gBattlerAttacker, i); + PREPARE_TYPE_BUFFER(gBattleTextBuff1, i); gBattlescriptCurrInstr += 5; return; } - break; } } @@ -8077,8 +9834,7 @@ static void Cmd_copymovepermanently(void) // sketch static bool8 IsTwoTurnsMove(u16 move) { if (gBattleMoves[move].effect == EFFECT_SKULL_BASH - || gBattleMoves[move].effect == EFFECT_RAZOR_WIND - || gBattleMoves[move].effect == EFFECT_SKY_ATTACK + || gBattleMoves[move].effect == EFFECT_TWO_TURNS_ATTACK || gBattleMoves[move].effect == EFFECT_SOLARBEAM || gBattleMoves[move].effect == EFFECT_SEMI_INVULNERABLE || gBattleMoves[move].effect == EFFECT_BIDE) @@ -8087,15 +9843,6 @@ static bool8 IsTwoTurnsMove(u16 move) return FALSE; } -static bool8 IsInvalidForSleepTalkOrAssist(u16 move) -{ - if (move == 0 || move == MOVE_SLEEP_TALK || move == MOVE_ASSIST - || move == MOVE_MIRROR_MOVE || move == MOVE_METRONOME) - return TRUE; - else - return FALSE; -} - static u8 AttacksThisTurn(u8 battlerId, u16 move) // Note: returns 1 if it's a charging turn, otherwise 2 { // first argument is unused @@ -8104,8 +9851,7 @@ static u8 AttacksThisTurn(u8 battlerId, u16 move) // Note: returns 1 if it's a c return 2; if (gBattleMoves[move].effect == EFFECT_SKULL_BASH - || gBattleMoves[move].effect == EFFECT_RAZOR_WIND - || gBattleMoves[move].effect == EFFECT_SKY_ATTACK + || gBattleMoves[move].effect == EFFECT_TWO_TURNS_ATTACK || gBattleMoves[move].effect == EFFECT_SOLARBEAM || gBattleMoves[move].effect == EFFECT_SEMI_INVULNERABLE || gBattleMoves[move].effect == EFFECT_BIDE) @@ -8118,19 +9864,15 @@ static u8 AttacksThisTurn(u8 battlerId, u16 move) // Note: returns 1 if it's a c static void Cmd_trychoosesleeptalkmove(void) { - s32 i; - u8 unusableMovesBits = 0; + u32 i, unusableMovesBits = 0, movePosition; for (i = 0; i < MAX_MON_MOVES; i++) { - if (IsInvalidForSleepTalkOrAssist(gBattleMons[gBattlerAttacker].moves[i]) - || gBattleMons[gBattlerAttacker].moves[i] == MOVE_FOCUS_PUNCH - || gBattleMons[gBattlerAttacker].moves[i] == MOVE_UPROAR + if ((sForbiddenMoves[gBattleMons[gBattlerAttacker].moves[i]] & FORBIDDEN_SLEEP_TALK) || IsTwoTurnsMove(gBattleMons[gBattlerAttacker].moves[i])) { unusableMovesBits |= gBitTable[i]; } - } unusableMovesBits = CheckMoveLimitations(gBattlerAttacker, unusableMovesBits, ~(MOVE_LIMITATION_PP)); @@ -8140,8 +9882,6 @@ static void Cmd_trychoosesleeptalkmove(void) } else // at least one move can be chosen { - u32 movePosition; - do { movePosition = Random() & 3; @@ -8179,19 +9919,21 @@ static void Cmd_trysetdestinybondtohappen(void) gBattlescriptCurrInstr++; } -static void Cmd_remaininghptopower(void) +static void Cmd_settailwind(void) { - s32 i; - s32 hpFraction = GetScaledHPFraction(gBattleMons[gBattlerAttacker].hp, gBattleMons[gBattlerAttacker].maxHP, 48); + u8 side = GetBattlerSide(gBattlerAttacker); - for (i = 0; i < (s32) sizeof(sFlailHpScaleToPowerTable); i += 2) + if (!(gSideStatuses[side] & SIDE_STATUS_TAILWIND)) { - if (hpFraction <= sFlailHpScaleToPowerTable[i]) - break; + gSideStatuses[side] |= SIDE_STATUS_TAILWIND; + gSideTimers[side].tailwindBattlerId = gBattlerAttacker; + gSideTimers[side].tailwindTimer = 3; + gBattlescriptCurrInstr += 5; + } + else + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } - - gDynamicBasePower = sFlailHpScaleToPowerTable[i + 1]; - gBattlescriptCurrInstr++; } static void Cmd_tryspiteppreduce(void) @@ -8409,7 +10151,7 @@ static void Cmd_trysetperishsong(void) gBattlescriptCurrInstr += 5; } -static void Cmd_rolloutdamagecalculation(void) +static void Cmd_handlerollout(void) { if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) { @@ -8418,28 +10160,18 @@ static void Cmd_rolloutdamagecalculation(void) } else { - s32 i; - - if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) // first hit + if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) // First hit. { gDisableStructs[gBattlerAttacker].rolloutTimer = 5; gDisableStructs[gBattlerAttacker].rolloutTimerStartValue = 5; gBattleMons[gBattlerAttacker].status2 |= STATUS2_MULTIPLETURNS; gLockedMoves[gBattlerAttacker] = gCurrentMove; } - if (--gDisableStructs[gBattlerAttacker].rolloutTimer == 0) // last hit + if (--gDisableStructs[gBattlerAttacker].rolloutTimer == 0) // Last hit. { gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_MULTIPLETURNS); } - gDynamicBasePower = gBattleMoves[gCurrentMove].power; - - for (i = 1; i < (5 - gDisableStructs[gBattlerAttacker].rolloutTimer); i++) - gDynamicBasePower *= 2; - - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_DEFENSE_CURL) - gDynamicBasePower *= 2; - gBattlescriptCurrInstr++; } } @@ -8453,7 +10185,7 @@ static void Cmd_jumpifconfusedandstatmaxed(void) gBattlescriptCurrInstr += 6; } -static void Cmd_furycuttercalc(void) +static void Cmd_handlefurycutter(void) { if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) { @@ -8462,40 +10194,43 @@ static void Cmd_furycuttercalc(void) } else { - s32 i; - if (gDisableStructs[gBattlerAttacker].furyCutterCounter != 5) gDisableStructs[gBattlerAttacker].furyCutterCounter++; - gDynamicBasePower = gBattleMoves[gCurrentMove].power; - - for (i = 1; i < gDisableStructs[gBattlerAttacker].furyCutterCounter; i++) - gDynamicBasePower *= 2; - gBattlescriptCurrInstr++; } } -static void Cmd_happinesstodamagecalculation(void) +static void Cmd_setembargo(void) { - if (gBattleMoves[gCurrentMove].effect == EFFECT_RETURN) - gDynamicBasePower = 10 * (gBattleMons[gBattlerAttacker].friendship) / 25; - else // EFFECT_FRUSTRATION - gDynamicBasePower = 10 * (255 - gBattleMons[gBattlerAttacker].friendship) / 25; - - gBattlescriptCurrInstr++; + if (gStatuses3[gBattlerTarget] & STATUS3_EMBARGO) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + } + else + { + gStatuses3[gBattlerTarget] |= STATUS3_EMBARGO; + gDisableStructs[gBattlerTarget].embargoTimer = 5; + gBattlescriptCurrInstr += 5; + } } static void Cmd_presentdamagecalculation(void) { - s32 rand = Random() & 0xFF; + u32 rand = Random() & 0xFF; if (rand < 102) - gDynamicBasePower = 40; + { + gBattleStruct->presentBasePower = 40; + } else if (rand < 178) - gDynamicBasePower = 80; + { + gBattleStruct->presentBasePower = 80; + } else if (rand < 204) - gDynamicBasePower = 120; + { + gBattleStruct->presentBasePower = 120; + } else { gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 4; @@ -8503,10 +10238,15 @@ static void Cmd_presentdamagecalculation(void) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; } + if (rand < 204) + { gBattlescriptCurrInstr = BattleScript_HitFromCritCalc; + } else if (gBattleMons[gBattlerTarget].maxHP == gBattleMons[gBattlerTarget].hp) + { gBattlescriptCurrInstr = BattleScript_AlreadyAtFullHp; + } else { gMoveResultFlags &= ~(MOVE_RESULT_DOESNT_AFFECT_FOE); @@ -8534,52 +10274,50 @@ static void Cmd_setsafeguard(void) static void Cmd_magnitudedamagecalculation(void) { - s32 magnitude = Random() % 100; + u32 magnitude = Random() % 100; if (magnitude < 5) { - gDynamicBasePower = 10; + gBattleStruct->magnitudeBasePower = 10; magnitude = 4; } else if (magnitude < 15) { - gDynamicBasePower = 30; + gBattleStruct->magnitudeBasePower = 30; magnitude = 5; } else if (magnitude < 35) { - gDynamicBasePower = 50; + gBattleStruct->magnitudeBasePower = 50; magnitude = 6; } else if (magnitude < 65) { - gDynamicBasePower = 70; + gBattleStruct->magnitudeBasePower = 70; magnitude = 7; } else if (magnitude < 85) { - gDynamicBasePower = 90; + gBattleStruct->magnitudeBasePower = 90; magnitude = 8; } else if (magnitude < 95) { - gDynamicBasePower = 110; + gBattleStruct->magnitudeBasePower = 110; magnitude = 9; } else { - gDynamicBasePower = 150; + gBattleStruct->magnitudeBasePower = 150; magnitude = 10; } - - PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 2, magnitude) - + PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 2, magnitude); for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++) { if (gBattlerTarget == gBattlerAttacker) continue; - if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) // a valid target was found + if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) // A valid target was found. break; } @@ -8632,16 +10370,14 @@ static void Cmd_jumpifnopursuitswitchdmg(void) static void Cmd_setsunny(void) { - if (gBattleWeather & WEATHER_SUN_ANY) + if (!TryChangeBattleWeather(gBattlerAttacker, ENUM_WEATHER_SUN, FALSE)) { gMoveResultFlags |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = 2; } else { - gBattleWeather = WEATHER_SUN_TEMPORARY; gBattleCommunication[MULTISTRING_CHOOSER] = 4; - gWishFutureKnock.weatherDuration = 5; } gBattlescriptCurrInstr++; @@ -8684,18 +10420,14 @@ static void Cmd_copyfoestats(void) // psych up static void Cmd_rapidspinfree(void) { + u8 atkSide = GetBattlerSide(gBattlerAttacker); + if (gBattleMons[gBattlerAttacker].status2 & STATUS2_WRAPPED) { gBattleScripting.battler = gBattlerTarget; gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_WRAPPED); gBattlerTarget = *(gBattleStruct->wrappedBy + gBattlerAttacker); - - gBattleTextBuff1[0] = B_BUFF_PLACEHOLDER_BEGIN; - gBattleTextBuff1[1] = B_BUFF_MOVE; - gBattleTextBuff1[2] = *(gBattleStruct->wrappedMove + gBattlerAttacker * 2 + 0); - gBattleTextBuff1[3] = *(gBattleStruct->wrappedMove + gBattlerAttacker * 2 + 1); - gBattleTextBuff1[4] = B_BUFF_EOS; - + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleStruct->wrappedMove[gBattlerAttacker]); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_WrapFree; } @@ -8706,13 +10438,34 @@ static void Cmd_rapidspinfree(void) BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_LeechSeedFree; } - else if (gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_SPIKES) + else if (gSideStatuses[atkSide] & SIDE_STATUS_SPIKES) { - gSideStatuses[GetBattlerSide(gBattlerAttacker)] &= ~(SIDE_STATUS_SPIKES); - gSideTimers[GetBattlerSide(gBattlerAttacker)].spikesAmount = 0; + gSideStatuses[atkSide] &= ~(SIDE_STATUS_SPIKES); + gSideTimers[atkSide].spikesAmount = 0; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SpikesFree; } + else if (gSideStatuses[atkSide] & SIDE_STATUS_TOXIC_SPIKES) + { + gSideStatuses[atkSide] &= ~(SIDE_STATUS_TOXIC_SPIKES); + gSideTimers[atkSide].toxicSpikesAmount = 0; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ToxicSpikesFree; + } + else if (gSideStatuses[atkSide] & SIDE_STATUS_STICKY_WEB) + { + gSideStatuses[atkSide] &= ~(SIDE_STATUS_STICKY_WEB); + gSideTimers[atkSide].stickyWebAmount = 0; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_StickyWebFree; + } + else if (gSideStatuses[atkSide] & SIDE_STATUS_STEALTH_ROCK) + { + gSideStatuses[atkSide] &= ~(SIDE_STATUS_STEALTH_ROCK); + gSideTimers[atkSide].stealthRockAmount = 0; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_StealthRockFree; + } else { gBattlescriptCurrInstr++; @@ -8728,15 +10481,24 @@ static void Cmd_setdefensecurlbit(void) static void Cmd_recoverbasedonsunlight(void) { gBattlerTarget = gBattlerAttacker; - if (gBattleMons[gBattlerAttacker].hp != gBattleMons[gBattlerAttacker].maxHP) { - if (gBattleWeather == 0 || !WEATHER_HAS_EFFECT) - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 2; - else if (gBattleWeather & WEATHER_SUN_ANY) - gBattleMoveDamage = 20 * gBattleMons[gBattlerAttacker].maxHP / 30; - else // not sunny weather - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 4; + if (gCurrentMove == MOVE_SHORE_UP) + { + if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SANDSTORM_ANY) + gBattleMoveDamage = 20 * gBattleMons[gBattlerAttacker].maxHP / 30; + else + gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 2; + } + else + { + if (!(gBattleWeather & WEATHER_ANY) || !WEATHER_HAS_EFFECT) + gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 2; + else if (gBattleWeather & WEATHER_SUN_ANY) + gBattleMoveDamage = 20 * gBattleMons[gBattlerAttacker].maxHP / 30; + else // not sunny weather + gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 4; + } if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; @@ -8750,42 +10512,28 @@ static void Cmd_recoverbasedonsunlight(void) } } -static void Cmd_hiddenpowercalc(void) +static void Cmd_setstickyweb(void) { - u8 powerBits; - u8 typeBits; - - powerBits = ((gBattleMons[gBattlerAttacker].hpIV & 2) >> 1) - | ((gBattleMons[gBattlerAttacker].attackIV & 2) << 0) - | ((gBattleMons[gBattlerAttacker].defenseIV & 2) << 1) - | ((gBattleMons[gBattlerAttacker].speedIV & 2) << 2) - | ((gBattleMons[gBattlerAttacker].spAttackIV & 2) << 3) - | ((gBattleMons[gBattlerAttacker].spDefenseIV & 2) << 4); - - typeBits = ((gBattleMons[gBattlerAttacker].hpIV & 1) << 0) - | ((gBattleMons[gBattlerAttacker].attackIV & 1) << 1) - | ((gBattleMons[gBattlerAttacker].defenseIV & 1) << 2) - | ((gBattleMons[gBattlerAttacker].speedIV & 1) << 3) - | ((gBattleMons[gBattlerAttacker].spAttackIV & 1) << 4) - | ((gBattleMons[gBattlerAttacker].spDefenseIV & 1) << 5); - - gDynamicBasePower = (40 * powerBits) / 63 + 30; - - gBattleStruct->dynamicMoveType = (15 * typeBits) / 63 + 1; - if (gBattleStruct->dynamicMoveType >= TYPE_MYSTERY) - gBattleStruct->dynamicMoveType++; - gBattleStruct->dynamicMoveType |= 0xC0; - - gBattlescriptCurrInstr++; + u8 targetSide = GetBattlerSide(gBattlerTarget); + if (gSideStatuses[targetSide] & SIDE_STATUS_STICKY_WEB) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + } + else + { + gSideStatuses[targetSide] |= SIDE_STATUS_STICKY_WEB; + gSideTimers[targetSide].stickyWebAmount = 1; + gBattlescriptCurrInstr += 5; + } } static void Cmd_selectfirstvalidtarget(void) { for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++) { - if (gBattlerTarget == gBattlerAttacker) + if (gBattlerTarget == gBattlerAttacker && !(gBattleMoves[gCurrentMove].target & MOVE_TARGET_USER)) continue; - if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) + if (IsBattlerAlive(gBattlerTarget)) break; } gBattlescriptCurrInstr++; @@ -8803,12 +10551,6 @@ static void Cmd_trysetfutureattack(void) gWishFutureKnock.futureSightMove[gBattlerTarget] = gCurrentMove; gWishFutureKnock.futureSightAttacker[gBattlerTarget] = gBattlerAttacker; gWishFutureKnock.futureSightCounter[gBattlerTarget] = 3; - gWishFutureKnock.futureSightDmg[gBattlerTarget] = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerTarget], gCurrentMove, - gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)], 0, - 0, gBattlerAttacker, gBattlerTarget); - - if (gProtectStructs[gBattlerAttacker].helpingHand) - gWishFutureKnock.futureSightDmg[gBattlerTarget] = gWishFutureKnock.futureSightDmg[gBattlerTarget] * 15 / 10; if (gCurrentMove == MOVE_DOOM_DESIRE) gBattleCommunication[MULTISTRING_CHOOSER] = 1; @@ -8880,6 +10622,10 @@ static void Cmd_setsemiinvulnerablebit(void) case MOVE_DIVE: gStatuses3[gBattlerAttacker] |= STATUS3_UNDERWATER; break; + case MOVE_PHANTOM_FORCE: + case MOVE_SHADOW_FORCE: + gStatuses3[gBattlerAttacker] |= STATUS3_PHANTOM_FORCE; + break; } gBattlescriptCurrInstr++; @@ -8887,20 +10633,7 @@ static void Cmd_setsemiinvulnerablebit(void) static void Cmd_clearsemiinvulnerablebit(void) { - switch (gCurrentMove) - { - case MOVE_FLY: - case MOVE_BOUNCE: - gStatuses3[gBattlerAttacker] &= ~STATUS3_ON_AIR; - break; - case MOVE_DIG: - gStatuses3[gBattlerAttacker] &= ~STATUS3_UNDERGROUND; - break; - case MOVE_DIVE: - gStatuses3[gBattlerAttacker] &= ~STATUS3_UNDERWATER; - break; - } - + gStatuses3[gBattlerAttacker] &= ~(STATUS3_SEMI_INVULNERABLE); gBattlescriptCurrInstr++; } @@ -8914,16 +10647,14 @@ static void Cmd_setminimize(void) static void Cmd_sethail(void) { - if (gBattleWeather & WEATHER_HAIL_ANY) + if (!TryChangeBattleWeather(gBattlerAttacker, ENUM_WEATHER_HAIL, FALSE)) { gMoveResultFlags |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = 2; } else { - gBattleWeather = WEATHER_HAIL; gBattleCommunication[MULTISTRING_CHOOSER] = 5; - gWishFutureKnock.weatherDuration = 5; } gBattlescriptCurrInstr++; @@ -9012,8 +10743,11 @@ static void Cmd_settaunt(void) { if (gDisableStructs[gBattlerTarget].tauntTimer == 0) { - gDisableStructs[gBattlerTarget].tauntTimer = 2; - gDisableStructs[gBattlerTarget].tauntTimer2 = 2; + u8 turns = 4; + if (GetBattlerTurnOrderNum(gBattlerTarget) > GetBattlerTurnOrderNum(gBattlerAttacker)) + turns--; // If the target hasn't yet moved this turn, Taunt lasts for only three turns (source: Bulbapedia) + + gDisableStructs[gBattlerTarget].tauntTimer = gDisableStructs[gBattlerTarget].tauntTimer2 = turns; gBattlescriptCurrInstr += 5; } else @@ -9072,10 +10806,10 @@ static void Cmd_tryswapitems(void) // trick // can't swap if two pokemon don't have an item // or if either of them is an enigma berry or a mail else if ((gBattleMons[gBattlerAttacker].item == 0 && gBattleMons[gBattlerTarget].item == 0) - || gBattleMons[gBattlerAttacker].item == ITEM_ENIGMA_BERRY - || gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY - || IS_ITEM_MAIL(gBattleMons[gBattlerAttacker].item) - || IS_ITEM_MAIL(gBattleMons[gBattlerTarget].item)) + || !CanBattlerGetOrLoseItem(gBattlerAttacker, gBattleMons[gBattlerAttacker].item) + || !CanBattlerGetOrLoseItem(gBattlerAttacker, gBattleMons[gBattlerTarget].item) + || !CanBattlerGetOrLoseItem(gBattlerTarget, gBattleMons[gBattlerTarget].item) + || !CanBattlerGetOrLoseItem(gBattlerTarget, gBattleMons[gBattlerAttacker].item)) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } @@ -9106,11 +10840,8 @@ static void Cmd_tryswapitems(void) // trick BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gBattlerTarget].item); MarkBattlerForControllerExec(gBattlerTarget); - *(u8*)((u8*)(&gBattleStruct->choicedMove[gBattlerTarget]) + 0) = 0; - *(u8*)((u8*)(&gBattleStruct->choicedMove[gBattlerTarget]) + 1) = 0; - - *(u8*)((u8*)(&gBattleStruct->choicedMove[gBattlerAttacker]) + 0) = 0; - *(u8*)((u8*)(&gBattleStruct->choicedMove[gBattlerAttacker]) + 1) = 0; + gBattleStruct->choicedMove[gBattlerTarget] = 0; + gBattleStruct->choicedMove[gBattlerAttacker] = 0; gBattlescriptCurrInstr += 5; @@ -9120,25 +10851,35 @@ static void Cmd_tryswapitems(void) // trick if (oldItemAtk != 0 && *newItemAtk != 0) gBattleCommunication[MULTISTRING_CHOOSER] = 2; // attacker's item -> <- target's item else if (oldItemAtk == 0 && *newItemAtk != 0) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; // nothing -> <- target's item + { + if (GetBattlerAbility(gBattlerAttacker) == ABILITY_UNBURDEN && gBattleResources->flags->flags[gBattlerAttacker] & RESOURCE_FLAG_UNBURDEN) + gBattleResources->flags->flags[gBattlerAttacker] &= ~(RESOURCE_FLAG_UNBURDEN); + + gBattleCommunication[MULTISTRING_CHOOSER] = 0; // nothing -> <- target's item + } else + { + CheckSetUnburden(gBattlerAttacker); gBattleCommunication[MULTISTRING_CHOOSER] = 1; // attacker's item -> <- nothing + } } } } static void Cmd_trycopyability(void) // role play { - if (gBattleMons[gBattlerTarget].ability != 0 - && gBattleMons[gBattlerTarget].ability != ABILITY_WONDER_GUARD) + switch (gBattleMons[gBattlerTarget].ability) { - gBattleMons[gBattlerAttacker].ability = gBattleMons[gBattlerTarget].ability; - gLastUsedAbility = gBattleMons[gBattlerTarget].ability; - gBattlescriptCurrInstr += 5; - } - else - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + case ABILITY_NONE: + case ABILITY_WONDER_GUARD: + case ABILITY_DISGUISE: + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + break; + default: + gBattleMons[gBattlerAttacker].ability = gBattleMons[gBattlerTarget].ability; + gLastUsedAbility = gBattleMons[gBattlerTarget].ability; + gBattlescriptCurrInstr += 5; + break; } } @@ -9175,30 +10916,41 @@ static void Cmd_trywish(void) } } -static void Cmd_trysetroots(void) // ingrain +static void Cmd_settoxicspikes(void) { - if (gStatuses3[gBattlerAttacker] & STATUS3_ROOTED) + u8 targetSide = GetBattlerSide(gBattlerTarget); + if (gSideTimers[targetSide].toxicSpikesAmount >= 2) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { - gStatuses3[gBattlerAttacker] |= STATUS3_ROOTED; + gSideTimers[targetSide].toxicSpikesAmount++; + gSideStatuses[targetSide] |= SIDE_STATUS_TOXIC_SPIKES; gBattlescriptCurrInstr += 5; } } -static void Cmd_doubledamagedealtifdamaged(void) +static void Cmd_setgastroacid(void) { - if ((gProtectStructs[gBattlerAttacker].physicalDmg - && gProtectStructs[gBattlerAttacker].physicalBattlerId == gBattlerTarget) - || (gProtectStructs[gBattlerAttacker].specialDmg - && gProtectStructs[gBattlerAttacker].specialBattlerId == gBattlerTarget)) + switch (gBattleMons[gBattlerTarget].ability) { - gBattleScripting.dmgMultiplier = 2; + case ABILITY_MULTITYPE: + case ABILITY_STANCE_CHANGE: + case ABILITY_SCHOOLING: + case ABILITY_COMATOSE: + case ABILITY_SHIELDS_DOWN: + case ABILITY_DISGUISE: + case ABILITY_RKS_SYSTEM: + case ABILITY_BATTLE_BOND: + case ABILITY_POWER_CONSTRUCT: + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + break; + default: + gStatuses3[gBattlerTarget] |= STATUS3_GASTRO_ACID; + gBattlescriptCurrInstr += 5; + break; } - - gBattlescriptCurrInstr++; } static void Cmd_setyawn(void) @@ -9228,35 +10980,73 @@ static void Cmd_setdamagetohealthdifference(void) } } -static void Cmd_scaledamagebyhealthratio(void) +static void HandleRoomMove(u32 statusFlag, u8 *timer, u8 stringId) { - if (gDynamicBasePower == 0) + if (gFieldStatuses & statusFlag) { - u8 power = gBattleMoves[gCurrentMove].power; - gDynamicBasePower = gBattleMons[gBattlerAttacker].hp * power / gBattleMons[gBattlerAttacker].maxHP; - if (gDynamicBasePower == 0) - gDynamicBasePower = 1; + gFieldStatuses &= ~(statusFlag); + *timer = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = stringId + 1; + } + else + { + gFieldStatuses |= statusFlag; + *timer = 5; + gBattleCommunication[MULTISTRING_CHOOSER] = stringId; + } +} + +static void Cmd_setroom(void) +{ + switch (gBattleMoves[gCurrentMove].effect) + { + case EFFECT_TRICK_ROOM: + HandleRoomMove(STATUS_FIELD_TRICK_ROOM, &gFieldTimers.trickRoomTimer, 0); + break; + case EFFECT_WONDER_ROOM: + HandleRoomMove(STATUS_FIELD_WONDER_ROOM, &gFieldTimers.wonderRoomTimer, 2); + break; + case EFFECT_MAGIC_ROOM: + HandleRoomMove(STATUS_FIELD_MAGIC_ROOM, &gFieldTimers.magicRoomTimer, 4); + break; + default: + gBattleCommunication[MULTISTRING_CHOOSER] = 6; + break; } gBattlescriptCurrInstr++; } static void Cmd_tryswapabilities(void) // skill swap { - if ((gBattleMons[gBattlerAttacker].ability == 0 - && gBattleMons[gBattlerTarget].ability == 0) - || gBattleMons[gBattlerAttacker].ability == ABILITY_WONDER_GUARD - || gBattleMons[gBattlerTarget].ability == ABILITY_WONDER_GUARD - || gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - } + switch (gBattleMons[gBattlerAttacker].ability) + { + case ABILITY_NONE: + case ABILITY_WONDER_GUARD: + case ABILITY_DISGUISE: + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + return; + } + + switch (gBattleMons[gBattlerTarget].ability) + { + case ABILITY_NONE: + case ABILITY_WONDER_GUARD: + case ABILITY_DISGUISE: + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + return; + } + + if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + } else { u8 abilityAtk = gBattleMons[gBattlerAttacker].ability; gBattleMons[gBattlerAttacker].ability = gBattleMons[gBattlerTarget].ability; gBattleMons[gBattlerTarget].ability = abilityAtk; - gBattlescriptCurrInstr += 5; + gBattlescriptCurrInstr += 5; } } @@ -9297,39 +11087,43 @@ static void Cmd_tryimprison(void) } } } - if (battlerId == gBattlersCount) // In Generation 3 games, Imprison fails if the user doesn't share any moves with any of the foes + if (battlerId == gBattlersCount) // In Generation 3 games, Imprison fails if the user doesn't share any moves with any of the foes. gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } -static void Cmd_trysetgrudge(void) +static void Cmd_setstealthrock(void) { - if (gStatuses3[gBattlerAttacker] & STATUS3_GRUDGE) + u8 targetSide = GetBattlerSide(gBattlerTarget); + if (gSideStatuses[targetSide] & SIDE_STATUS_STEALTH_ROCK) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { - gStatuses3[gBattlerAttacker] |= STATUS3_GRUDGE; + gSideStatuses[targetSide] |= SIDE_STATUS_STEALTH_ROCK; + gSideTimers[targetSide].stealthRockAmount = 1; gBattlescriptCurrInstr += 5; } } -static void Cmd_weightdamagecalculation(void) +static void Cmd_setuserstatus3(void) { - s32 i; - for (i = 0; sWeightToDamageTable[i] != 0xFFFF; i += 2) + u32 flags = T1_READ_32(gBattlescriptCurrInstr + 1); + + if (gStatuses3[gBattlerAttacker] & flags) { - if (sWeightToDamageTable[i] > GetPokedexHeightWeight(SpeciesToNationalPokedexNum(gBattleMons[gBattlerTarget].species), 1)) - break; + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 5); } - - if (sWeightToDamageTable[i] != 0xFFFF) - gDynamicBasePower = sWeightToDamageTable[i + 1]; else - gDynamicBasePower = 120; - - gBattlescriptCurrInstr++; + { + gStatuses3[gBattlerAttacker] |= flags; + if (flags & STATUS3_MAGNET_RISE) + gDisableStructs[gBattlerAttacker].magnetRiseTimer = 5; + if (flags & STATUS3_LASER_FOCUS) + gDisableStructs[gBattlerAttacker].laserFocusTimer = 2; + gBattlescriptCurrInstr += 9; + } } static void Cmd_assistattackselect(void) @@ -9358,14 +11152,7 @@ static void Cmd_assistattackselect(void) s32 i = 0; u16 move = GetMonData(&party[monId], MON_DATA_MOVE1 + moveId); - if (IsInvalidForSleepTalkOrAssist(move)) - continue; - - for (; sMovesForbiddenToCopy[i] != ASSIST_FORBIDDEN_END && move != sMovesForbiddenToCopy[i]; i++); - - if (sMovesForbiddenToCopy[i] != ASSIST_FORBIDDEN_END) - continue; - if (move == MOVE_NONE) + if (sForbiddenMoves[move] & FORBIDDEN_ASSIST) continue; movesArray[chooseableMovesNo] = move; @@ -9441,13 +11228,21 @@ static void Cmd_switchoutabilities(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - switch (gBattleMons[gActiveBattler].ability) + switch (GetBattlerAbility(gActiveBattler)) { case ABILITY_NATURAL_CURE: gBattleMons[gActiveBattler].status1 = 0; BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, gBitTable[*(gBattleStruct->field_58 + gActiveBattler)], 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); break; + case ABILITY_REGENERATOR: + gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 3; + gBattleMoveDamage += gBattleMons[gActiveBattler].hp; + if (gBattleMoveDamage > gBattleMons[gActiveBattler].maxHP) + gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP; + BtlController_EmitSetMonData(0, REQUEST_HP_BATTLE, gBitTable[*(gBattleStruct->field_58 + gActiveBattler)], 2, &gBattleMoveDamage); + MarkBattlerForControllerExec(gActiveBattler); + break; } gBattlescriptCurrInstr += 2; @@ -9468,31 +11263,31 @@ static void Cmd_getsecretpowereffect(void) switch (gBattleTerrain) { case BATTLE_TERRAIN_GRASS: - gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_POISON; + gBattleScripting.moveEffect = MOVE_EFFECT_POISON; break; case BATTLE_TERRAIN_LONG_GRASS: - gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_SLEEP; + gBattleScripting.moveEffect = MOVE_EFFECT_SLEEP; break; case BATTLE_TERRAIN_SAND: - gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_ACC_MINUS_1; + gBattleScripting.moveEffect = MOVE_EFFECT_ACC_MINUS_1; break; case BATTLE_TERRAIN_UNDERWATER: - gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_DEF_MINUS_1; + gBattleScripting.moveEffect = MOVE_EFFECT_DEF_MINUS_1; break; case BATTLE_TERRAIN_WATER: - gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_ATK_MINUS_1; + gBattleScripting.moveEffect = MOVE_EFFECT_ATK_MINUS_1; break; case BATTLE_TERRAIN_POND: - gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_SPD_MINUS_1; + gBattleScripting.moveEffect = MOVE_EFFECT_SPD_MINUS_1; break; case BATTLE_TERRAIN_MOUNTAIN: - gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_CONFUSION; + gBattleScripting.moveEffect = MOVE_EFFECT_CONFUSION; break; case BATTLE_TERRAIN_CAVE: - gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_FLINCH; + gBattleScripting.moveEffect = MOVE_EFFECT_FLINCH; break; default: - gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_PARALYSIS; + gBattleScripting.moveEffect = MOVE_EFFECT_PARALYSIS; break; } gBattlescriptCurrInstr++; @@ -9503,6 +11298,7 @@ static void Cmd_pickup(void) s32 i; u16 species, heldItem; u8 ability; + u8 lvlDivBy10; if (InBattlePike()) { @@ -9529,6 +11325,19 @@ static void Cmd_pickup(void) heldItem = GetBattlePyramidPickupItemId(); SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &heldItem); } + #if (defined ITEM_HONEY) + else if (ability == ABILITY_HONEY_GATHER + && species != 0 + && species != SPECIES_EGG + && heldItem == ITEM_NONE) + { + if ((lvlDivBy10 + 1 ) * 5 > Random() % 100) + { + heldItem = ITEM_HONEY; + SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &heldItem); + } + } + #endif } } else @@ -9537,6 +11346,9 @@ static void Cmd_pickup(void) { species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); + lvlDivBy10 = (GetMonData(&gPlayerParty[i], MON_DATA_LEVEL)-1) / 10; //Moving this here makes it easier to add in abilities like Honey Gather + if (lvlDivBy10 > 9) + lvlDivBy10 = 9; if (GetMonData(&gPlayerParty[i], MON_DATA_ABILITY_NUM)) ability = gBaseStats[species].abilities[1]; @@ -9551,9 +11363,6 @@ static void Cmd_pickup(void) { s32 j; s32 rand = Random() % 100; - u8 lvlDivBy10 = (GetMonData(&gPlayerParty[i], MON_DATA_LEVEL) - 1) / 10; - if (lvlDivBy10 > 9) - lvlDivBy10 = 9; for (j = 0; j < (int)ARRAY_COUNT(sPickupProbabilities); j++) { @@ -9569,6 +11378,19 @@ static void Cmd_pickup(void) } } } + #if (defined ITEM_HONEY) + else if (ability == ABILITY_HONEY_GATHER + && species != 0 + && species != SPECIES_EGG + && heldItem == ITEM_NONE) + { + if ((lvlDivBy10 + 1 ) * 5 > Random() % 100) + { + heldItem = ITEM_HONEY; + SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &heldItem); + } + } + #endif } } @@ -9593,7 +11415,7 @@ static void Cmd_trycastformdatachange(void) u8 form; gBattlescriptCurrInstr++; - form = CastformDataTypeChange(gBattleScripting.battler); + form = TryWeatherFormChange(gBattleScripting.battler); if (form) { BattleScriptPushCursorAndCallback(BattleScript_CastformChange); @@ -9607,18 +11429,20 @@ static void Cmd_settypebasedhalvers(void) // water and mud sport if (gBattleMoves[gCurrentMove].effect == EFFECT_MUD_SPORT) { - if (!(gStatuses3[gBattlerAttacker] & STATUS3_MUDSPORT)) + if (!(gFieldStatuses & STATUS_FIELD_MUDSPORT)) { - gStatuses3[gBattlerAttacker] |= STATUS3_MUDSPORT; + gFieldStatuses |= STATUS_FIELD_MUDSPORT; + gFieldTimers.mudSportTimer = 5; gBattleCommunication[MULTISTRING_CHOOSER] = 0; worked = TRUE; } } else // water sport { - if (!(gStatuses3[gBattlerAttacker] & STATUS3_WATERSPORT)) + if (!(gFieldStatuses & STATUS_FIELD_WATERSPORT)) { - gStatuses3[gBattlerAttacker] |= STATUS3_WATERSPORT; + gFieldStatuses |= STATUS_FIELD_WATERSPORT; + gFieldTimers.waterSportTimer = 5; gBattleCommunication[MULTISTRING_CHOOSER] = 1; worked = TRUE; } @@ -9630,25 +11454,35 @@ static void Cmd_settypebasedhalvers(void) // water and mud sport gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } -static void Cmd_setweatherballtype(void) +bool32 DoesSubstituteBlockMove(u8 battlerAtk, u8 battlerDef, u32 move) { - if (WEATHER_HAS_EFFECT) - { - if (gBattleWeather & WEATHER_ANY) - gBattleScripting.dmgMultiplier = 2; - if (gBattleWeather & WEATHER_RAIN_ANY) - *(&gBattleStruct->dynamicMoveType) = TYPE_WATER | 0x80; - else if (gBattleWeather & WEATHER_SANDSTORM_ANY) - *(&gBattleStruct->dynamicMoveType) = TYPE_ROCK | 0x80; - else if (gBattleWeather & WEATHER_SUN_ANY) - *(&gBattleStruct->dynamicMoveType) = TYPE_FIRE | 0x80; - else if (gBattleWeather & WEATHER_HAIL_ANY) - *(&gBattleStruct->dynamicMoveType) = TYPE_ICE | 0x80; - else - *(&gBattleStruct->dynamicMoveType) = TYPE_NORMAL | 0x80; - } + if (!(gBattleMons[battlerDef].status2 & STATUS2_SUBSTITUTE)) + return FALSE; + else if (gBattleMoves[move].flags & FLAG_SOUND && B_SOUND_SUBSTITUTE >= GEN_6) + return FALSE; + else if (GetBattlerAbility(battlerAtk) == ABILITY_INFILTRATOR) + return FALSE; + else + return TRUE; +} - gBattlescriptCurrInstr++; +bool32 DoesDisguiseBlockMove(u8 battlerAtk, u8 battlerDef, u32 move) +{ + if (GetBattlerAbility(battlerDef) != ABILITY_DISGUISE + || gBattleMons[battlerDef].species != SPECIES_MIMIKYU + || gBattleMons[battlerDef].status2 & STATUS2_TRANSFORMED + || gBattleMoves[move].power == 0) + return FALSE; + else + return TRUE; +} + +static void Cmd_jumpifsubstituteblocks(void) +{ + if (DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + else + gBattlescriptCurrInstr += 5; } static void Cmd_tryrecycleitem(void) @@ -9702,7 +11536,7 @@ static void Cmd_pursuitrelated(void) gCurrentMove = MOVE_PURSUIT; gBattlescriptCurrInstr += 5; gBattleScripting.animTurn = 1; - gBattleScripting.field_20 = gBattlerAttacker; + gBattleScripting.savedBattler = gBattlerAttacker; gBattlerAttacker = gActiveBattler; } else @@ -9746,6 +11580,14 @@ static void Cmd_removelightscreenreflect(void) // brick break gBattlescriptCurrInstr++; } +static u8 GetCatchingBattler(void) +{ + if (IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT))) + return GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + else + return GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); +} + static void Cmd_handleballthrow(void) { u8 ballMultiplier = 0; @@ -9754,7 +11596,7 @@ static void Cmd_handleballthrow(void) return; gActiveBattler = gBattlerAttacker; - gBattlerTarget = gBattlerAttacker ^ BIT_SIDE; + gBattlerTarget = GetCatchingBattler(); if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { @@ -9863,23 +11705,41 @@ static void Cmd_handleballthrow(void) else // mon may be caught, calculate shakes { u8 shakes; + u8 maxShakes; - odds = Sqrt(Sqrt(16711680 / odds)); - odds = 1048560 / odds; - - for (shakes = 0; shakes < BALL_3_SHAKES_SUCCESS && Random() < odds; shakes++); + gBattleSpritesDataPtr->animationData->isCriticalCapture = 0; //initialize + gBattleSpritesDataPtr->animationData->criticalCaptureSuccess = 0; + if (CriticalCapture(odds)) + { + maxShakes = 1; //critical capture doesn't gauarantee capture + gBattleSpritesDataPtr->animationData->isCriticalCapture = 1; + } + else + { + maxShakes = 4; + } if (gLastUsedItem == ITEM_MASTER_BALL) - shakes = BALL_3_SHAKES_SUCCESS; // why calculate the shakes before that check? + { + shakes = maxShakes; + } + else + { + odds = Sqrt(Sqrt(16711680 / odds)); + odds = 1048560 / odds; + for (shakes = 0; shakes < maxShakes && Random() < odds; shakes++); + } BtlController_EmitBallThrowAnim(0, shakes); MarkBattlerForControllerExec(gActiveBattler); - if (shakes == BALL_3_SHAKES_SUCCESS) // mon caught, copy of the code above + if (shakes == maxShakes) // mon caught, copy of the code above { + if (IsCriticalCapture()) + gBattleSpritesDataPtr->animationData->criticalCaptureSuccess = 1; + gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_POKEBALL, &gLastUsedItem); - if (CalculatePlayerPartyCount() == PARTY_SIZE) gBattleCommunication[MULTISTRING_CHOOSER] = 0; else @@ -9887,8 +11747,11 @@ static void Cmd_handleballthrow(void) } else // not caught { - gBattleCommunication[MULTISTRING_CHOOSER] = shakes; - // Maybe inject SpriteCB_TestBallThrow here + if (IsCriticalCapture()) + gBattleCommunication[MULTISTRING_CHOOSER] = shakes + 3; + else + gBattleCommunication[MULTISTRING_CHOOSER] = shakes; + gBattlescriptCurrInstr = BattleScript_ShakeBallThrow; } } @@ -9897,19 +11760,19 @@ static void Cmd_handleballthrow(void) static void Cmd_givecaughtmon(void) { - if (GiveMonToPlayer(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]]) != MON_GIVEN_TO_PARTY) + if (GiveMonToPlayer(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]]) != MON_GIVEN_TO_PARTY) { if (!ShouldShowBoxWasFullMessage()) { gBattleCommunication[MULTISTRING_CHOOSER] = 0; StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON))); - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gStringVar2); + GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_NICKNAME, gStringVar2); } else { - StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON))); // box the mon was sent to - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gStringVar2); - StringCopy(gStringVar3, GetBoxNamePtr(GetPCBoxToSendMon())); //box the mon was going to be sent to + StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON))); + GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_NICKNAME, gStringVar2); + StringCopy(gStringVar3, GetBoxNamePtr(GetPCBoxToSendMon())); gBattleCommunication[MULTISTRING_CHOOSER] = 2; } @@ -9917,17 +11780,17 @@ static void Cmd_givecaughtmon(void) gBattleCommunication[MULTISTRING_CHOOSER]++; } - gBattleResults.caughtMonSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_SPECIES, NULL); - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gBattleResults.caughtMonNick); - gBattleResults.caughtMonBall = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_POKEBALL, NULL); + gBattleResults.caughtMonSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_SPECIES, NULL); + GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_NICKNAME, gBattleResults.caughtMonNick); + gBattleResults.caughtMonBall = GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_POKEBALL, NULL); gBattlescriptCurrInstr++; } static void Cmd_trysetcaughtmondexflags(void) { - u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL); - u32 personality = GetMonData(&gEnemyParty[0], MON_DATA_PERSONALITY, NULL); + u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_SPECIES, NULL); + u32 personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_PERSONALITY, NULL); if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)) { @@ -9942,7 +11805,7 @@ static void Cmd_trysetcaughtmondexflags(void) static void Cmd_displaydexinfo(void) { - u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL); + u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_SPECIES, NULL); switch (gBattleCommunication[0]) { @@ -9955,8 +11818,8 @@ static void Cmd_displaydexinfo(void) { FreeAllWindowBuffers(); gBattleCommunication[TASK_ID] = DisplayCaughtMonDexPage(SpeciesToNationalPokedexNum(species), - gBattleMons[gBattlerTarget].otId, - gBattleMons[gBattlerTarget].personality); + gBattleMons[GetCatchingBattler()].otId, + gBattleMons[GetCatchingBattler()].personality); gBattleCommunication[0]++; } break; @@ -9993,7 +11856,7 @@ static void Cmd_displaydexinfo(void) void HandleBattleWindow(u8 xStart, u8 yStart, u8 xEnd, u8 yEnd, u8 flags) { - s32 destY, destX; + s32 destY, destX, bgId; u16 var = 0; for (destY = yStart; destY <= yEnd; destY++) @@ -10031,10 +11894,8 @@ void HandleBattleWindow(u8 xStart, u8 yStart, u8 xEnd, u8 yEnd, u8 flags) if (flags & WINDOW_CLEAR) var = 0; - if (flags & WINDOW_x80) - CopyToBgTilemapBufferRect_ChangePalette(1, &var, destX, destY, 1, 1, 0x11); - else - CopyToBgTilemapBufferRect_ChangePalette(0, &var, destX, destY, 1, 1, 0x11); + bgId = (flags & WINDOW_x80) ? 1 : 0; + CopyToBgTilemapBufferRect_ChangePalette(bgId, &var, destX, destY, 1, 1, 0x11); } } } @@ -10107,13 +11968,13 @@ static void Cmd_trygivecaughtmonnick(void) case 2: if (!gPaletteFade.active) { - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gBattleStruct->caughtMonNick); + GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_NICKNAME, gBattleStruct->caughtMonNick); FreeAllWindowBuffers(); DoNamingScreen(NAMING_SCREEN_CAUGHT_MON, gBattleStruct->caughtMonNick, - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_SPECIES), - GetMonGender(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]]), - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_PERSONALITY, NULL), + GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_SPECIES), + GetMonGender(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]]), + GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_PERSONALITY, NULL), BattleMainCB2); gBattleCommunication[MULTIUSE_STATE]++; @@ -10122,7 +11983,7 @@ static void Cmd_trygivecaughtmonnick(void) case 3: if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active ) { - SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gBattleStruct->caughtMonNick); + SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_NICKNAME, gBattleStruct->caughtMonNick); gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } break; @@ -10166,3 +12027,154 @@ static void Cmd_trainerslideout(void) gBattlescriptCurrInstr += 2; } + +static void Cmd_settelekinesis(void) +{ + if (gStatuses3[gBattlerTarget] & (STATUS3_TELEKINESIS | STATUS3_ROOTED | STATUS3_SMACKED_DOWN) + || gFieldStatuses & STATUS_FIELD_GRAVITY + || (gBattleMons[gBattlerTarget].species == SPECIES_DIGLETT || gBattleMons[gBattlerTarget].species == SPECIES_DUGTRIO)) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + } + else + { + gStatuses3[gBattlerTarget] |= STATUS3_TELEKINESIS; + gDisableStructs[gBattlerTarget].telekinesisTimer = 3; + gBattlescriptCurrInstr += 5; + } +} + +static void Cmd_swapstatstages(void) +{ + u8 statId = T1_READ_8(gBattlescriptCurrInstr + 1); + s8 atkStatStage = gBattleMons[gBattlerAttacker].statStages[statId]; + s8 defStatStage = gBattleMons[gBattlerTarget].statStages[statId]; + + gBattleMons[gBattlerAttacker].statStages[statId] = defStatStage; + gBattleMons[gBattlerTarget].statStages[statId] = atkStatStage; + + gBattlescriptCurrInstr += 2; +} + +static void Cmd_averagestats(void) +{ + u8 statId = T1_READ_8(gBattlescriptCurrInstr + 1); + u16 atkStat = *(u16*)((&gBattleMons[gBattlerAttacker].attack) + (statId - 1)); + u16 defStat = *(u16*)((&gBattleMons[gBattlerTarget].attack) + (statId - 1)); + u16 average = (atkStat + defStat) / 2; + + *(u16*)((&gBattleMons[gBattlerAttacker].attack) + (statId - 1)) = average; + *(u16*)((&gBattleMons[gBattlerTarget].attack) + (statId - 1)) = average; + + gBattlescriptCurrInstr += 2; +} + +static void Cmd_jumpifoppositegenders(void) +{ + u32 atkGender = GetGenderFromSpeciesAndPersonality(gBattleMons[gBattlerAttacker].species, gBattleMons[gBattlerAttacker].personality); + u32 defGender = GetGenderFromSpeciesAndPersonality(gBattleMons[gBattlerTarget].species, gBattleMons[gBattlerTarget].personality); + + if ((atkGender == MON_MALE && defGender == MON_FEMALE) || (atkGender == MON_FEMALE && defGender == MON_MALE)) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + else + gBattlescriptCurrInstr += 5; +} + +static void Cmd_trygetbaddreamstarget(void) +{ + u8 badDreamsMonSide = GetBattlerSide(gBattlerAttacker); + for (;gBattlerTarget < gBattlersCount; gBattlerTarget++) + { + if (GetBattlerSide(gBattlerTarget) == badDreamsMonSide) + continue; + if ((gBattleMons[gBattlerTarget].status1 & STATUS1_SLEEP || GetBattlerAbility(gBattlerTarget) == ABILITY_COMATOSE) + && IsBattlerAlive(gBattlerTarget)) + break; + } + + if (gBattlerTarget >= gBattlersCount) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + else + gBattlescriptCurrInstr += 5; +} + +static void Cmd_tryworryseed(void) +{ + switch (gBattleMons[gBattlerTarget].ability) + { + case ABILITY_INSOMNIA: + case ABILITY_MULTITYPE: + case ABILITY_TRUANT: + case ABILITY_STANCE_CHANGE: + case ABILITY_DISGUISE: + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + break; + default: + gBattleMons[gBattlerTarget].ability = ABILITY_INSOMNIA; + gBattlescriptCurrInstr += 5; + break; + } +} + +static void Cmd_metalburstdamagecalculator(void) +{ + u8 sideAttacker = GetBattlerSide(gBattlerAttacker); + u8 sideTarget = 0; + + if (gProtectStructs[gBattlerAttacker].physicalDmg + && sideAttacker != (sideTarget = GetBattlerSide(gProtectStructs[gBattlerAttacker].physicalBattlerId)) + && gBattleMons[gProtectStructs[gBattlerAttacker].physicalBattlerId].hp) + { + gBattleMoveDamage = gProtectStructs[gBattlerAttacker].physicalDmg * 150 / 100; + + if (gSideTimers[sideTarget].followmeTimer && gBattleMons[gSideTimers[sideTarget].followmeTarget].hp) + gBattlerTarget = gSideTimers[sideTarget].followmeTarget; + else + gBattlerTarget = gProtectStructs[gBattlerAttacker].physicalBattlerId; + + gBattlescriptCurrInstr += 5; + } + else if (gProtectStructs[gBattlerAttacker].specialDmg + && sideAttacker != (sideTarget = GetBattlerSide(gProtectStructs[gBattlerAttacker].specialBattlerId)) + && gBattleMons[gProtectStructs[gBattlerAttacker].specialBattlerId].hp) + { + gBattleMoveDamage = gProtectStructs[gBattlerAttacker].specialDmg * 150 / 100; + + if (gSideTimers[sideTarget].followmeTimer && gBattleMons[gSideTimers[sideTarget].followmeTarget].hp) + gBattlerTarget = gSideTimers[sideTarget].followmeTarget; + else + gBattlerTarget = gProtectStructs[gBattlerAttacker].specialBattlerId; + + gBattlescriptCurrInstr += 5; + } + else + { + gSpecialStatuses[gBattlerAttacker].ppNotAffectedByPressure = 1; + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + } +} + +static bool32 CriticalCapture(u32 odds) +{ + u16 numCaught = GetNationalPokedexCount(FLAG_GET_CAUGHT); + + if (numCaught <= 30) + odds = 0; + else if (numCaught <= 150) + odds /= 2; + else if (numCaught <= 300) + ; + else if (numCaught <= 450) + odds = (odds * 150) / 100; + else if (numCaught <= 600) + odds *= 2; + else + odds = (odds * 250) / 100; + + odds /= 6; + if ((Random() % 255) < odds) + return TRUE; + + return FALSE; +} + diff --git a/src/battle_setup.c b/src/battle_setup.c index 7b9d13980f..afa82680f5 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -67,11 +67,9 @@ struct TrainerBattleParameter // this file's functions static void DoBattlePikeWildBattle(void); static void DoSafariBattle(void); -static void DoStandardWildBattle(void); +static void DoStandardWildBattle(bool32 isDouble); static void CB2_EndWildBattle(void); static void CB2_EndScriptedWildBattle(void); -static u8 GetWildBattleTransition(void); -static u8 GetTrainerBattleTransition(void); static void TryUpdateGymLeaderRematchFromWild(void); static void TryUpdateGymLeaderRematchFromTrainer(void); static void CB2_GiveStarter(void); @@ -387,7 +385,12 @@ void BattleSetup_StartWildBattle(void) if (GetSafariZoneFlag()) DoSafariBattle(); else - DoStandardWildBattle(); + DoStandardWildBattle(FALSE); +} + +void BattleSetup_StartDoubleWildBattle(void) +{ + DoStandardWildBattle(TRUE); } void BattleSetup_StartBattlePikeWildBattle(void) @@ -395,13 +398,15 @@ void BattleSetup_StartBattlePikeWildBattle(void) DoBattlePikeWildBattle(); } -static void DoStandardWildBattle(void) +static void DoStandardWildBattle(bool32 isDouble) { ScriptContext2_Enable(); FreezeObjectEvents(); sub_808BCF4(); gMain.savedCallback = CB2_EndWildBattle; gBattleTypeFlags = 0; + if (isDouble) + gBattleTypeFlags |= BATTLE_TYPE_DOUBLE; if (InBattlePyramid()) { VarSet(VAR_TEMP_E, 0); @@ -780,7 +785,7 @@ static u8 GetSumOfEnemyPartyLevel(u16 opponentId, u8 numMons) return sum; } -static u8 GetWildBattleTransition(void) +u8 GetWildBattleTransition(void) { u8 transitionType = GetBattleTransitionTypeByMap(); u8 enemyLevel = GetMonData(&gEnemyParty[0], MON_DATA_LEVEL); @@ -802,7 +807,7 @@ static u8 GetWildBattleTransition(void) } } -static u8 GetTrainerBattleTransition(void) +u8 GetTrainerBattleTransition(void) { u8 minPartyCount; u8 transitionType; @@ -1104,7 +1109,8 @@ void SetMapVarsToTrainer(void) const u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data) { - InitTrainerBattleVariables(); + if (TrainerBattleLoadArg8(data) != TRAINER_BATTLE_SET_TRAINER_B) + InitTrainerBattleVariables(); sTrainerBattleMode = TrainerBattleLoadArg8(data); switch (sTrainerBattleMode) @@ -1161,10 +1167,10 @@ const u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data) return EventScript_TryDoNormalTrainerBattle; case TRAINER_BATTLE_SET_TRAINER_A: TrainerBattleLoadArgs(sOrdinaryBattleParams, data); - return NULL; + return sTrainerBattleEndScript; case TRAINER_BATTLE_SET_TRAINER_B: TrainerBattleLoadArgs(sTrainerBOrdinaryBattleParams, data); - return NULL; + return sTrainerBattleEndScript; case TRAINER_BATTLE_HILL: if (gApproachingTrainerId == 0) { diff --git a/src/battle_tower.c b/src/battle_tower.c index 9852a0eac1..1f48a51712 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -1452,6 +1452,10 @@ u8 GetFrontierOpponentClass(u16 trainerId) { trainerClass = gTrainers[TRAINER_STEVEN].trainerClass; } + else if (trainerId >= TRAINER_CUSTOM_PARTNER) + { + trainerClass = gTrainers[trainerId - TRAINER_CUSTOM_PARTNER].trainerClass; + } else if (trainerId < FRONTIER_TRAINERS_COUNT) { trainerClass = gFacilityClassToTrainerClass[gFacilityTrainers[trainerId].facilityClass]; @@ -1533,6 +1537,11 @@ void GetFrontierTrainerName(u8 *dst, u16 trainerId) for (i = 0; i < PLAYER_NAME_LENGTH; i++) dst[i] = gTrainers[TRAINER_STEVEN].trainerName[i]; } + else if (trainerId >= TRAINER_CUSTOM_PARTNER) + { + for (i = 0; gTrainers[trainerId - TRAINER_CUSTOM_PARTNER].trainerName[i] != EOS; i++) + dst[i] = gTrainers[trainerId - TRAINER_CUSTOM_PARTNER].trainerName[i]; + } else if (trainerId < FRONTIER_TRAINERS_COUNT) { for (i = 0; i < PLAYER_NAME_LENGTH; i++) @@ -1979,6 +1988,13 @@ static void HandleSpecialTrainerBattleEnd(void) case SPECIAL_BATTLE_EREADER: CopyEReaderTrainerFarewellMessage(); break; + case SPECIAL_BATTLE_MULTI: + for (i = 0; i < 3; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES)) + gSaveBlock1Ptr->playerParty[i] = gPlayerParty[i]; + } + break; } SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); @@ -2121,6 +2137,34 @@ void DoSpecialTrainerBattle(void) PlayMapChosenOrBattleBGM(0); BattleTransition_StartOnField(B_TRANSITION_MAGMA); break; + case SPECIAL_BATTLE_MULTI: + if (gSpecialVar_0x8005 & MULTI_BATTLE_2_VS_WILD) // Player + AI against wild mon + { + gBattleTypeFlags = BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER; + } + else if (gSpecialVar_0x8005 & MULTI_BATTLE_2_VS_1) // Player + AI against one trainer + { + gTrainerBattleOpponent_B = 0xFFFF; + gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER; + } + else // MULTI_BATTLE_2_VS_2 + { + gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER; + } + + gPartnerSpriteId = VarGet(gSpecialVar_0x8007); + gPartnerTrainerId = VarGet(gSpecialVar_0x8006) + TRAINER_CUSTOM_PARTNER; + FillPartnerParty(gPartnerTrainerId); + CreateTask(Task_StartBattleAfterTransition, 1); + PlayMapChosenOrBattleBGM(0); + if (gSpecialVar_0x8005 & MULTI_BATTLE_2_VS_WILD) + BattleTransition_StartOnField(GetWildBattleTransition()); + else + BattleTransition_StartOnField(GetTrainerBattleTransition()); + + if (gSpecialVar_0x8005 & MULTI_BATTLE_CHOOSE_MONS) // Skip mons restoring(done in the script) + gBattleScripting.specialTrainerBattleType = 0xFF; + break; } } @@ -2647,7 +2691,7 @@ static void sub_8164DCC(void) static void SetMultiPartnerGfx(void) { // 0xF below means use VAR_OBJ_GFX_ID_E - SetBattleFacilityTrainerGfxId(gSaveBlock2Ptr->frontier.trainerIds[17], 0xF); + SetBattleFacilityTrainerGfxId(gSaveBlock2Ptr->frontier.trainerIds[17], 0xF); } static void SetTowerInterviewData(void) @@ -2941,7 +2985,7 @@ static void FillPartnerParty(u16 trainerId) u32 friendship; u16 monId; u32 otID; - u8 trainerName[PLAYER_NAME_LENGTH + 1]; + u8 trainerName[(PLAYER_NAME_LENGTH * 3) + 1]; SetFacilityPtrsGetLevel(); if (trainerId == TRAINER_STEVEN_PARTNER) @@ -2968,6 +3012,72 @@ static void FillPartnerParty(u16 trainerId) CalculateMonStats(&gPlayerParty[MULTI_PARTY_SIZE + i]); } } + else if (trainerId >= TRAINER_CUSTOM_PARTNER) + { + otID = Random32(); + + for (i = 0; i < 3; i++) + ZeroMonData(&gPlayerParty[i + 3]); + + for (i = 0; i < 3 && i < gTrainers[trainerId - TRAINER_CUSTOM_PARTNER].partySize; i++) + { + do + { + j = Random32(); + } while (IsShinyOtIdPersonality(otID, j)); + + switch (gTrainers[trainerId - TRAINER_CUSTOM_PARTNER].partyFlags) + { + case 0: + { + const struct TrainerMonNoItemDefaultMoves *partyData = gTrainers[trainerId - TRAINER_CUSTOM_PARTNER].party.NoItemDefaultMoves; + + CreateMon(&gPlayerParty[i + 3], partyData[i].species, partyData[i].lvl, partyData[i].iv * 31 / 255, TRUE, j, TRUE, otID); + break; + } + case F_TRAINER_PARTY_CUSTOM_MOVESET: + { + const struct TrainerMonNoItemCustomMoves *partyData = gTrainers[trainerId - TRAINER_CUSTOM_PARTNER].party.NoItemCustomMoves; + + CreateMon(&gPlayerParty[i + 3], partyData[i].species, partyData[i].lvl, partyData[i].iv * 31 / 255, TRUE, j, TRUE, otID); + + for (j = 0; j < 4; j++) + { + SetMonData(&gPlayerParty[i + 3], MON_DATA_MOVE1 + j, &partyData[i].moves[j]); + SetMonData(&gPlayerParty[i + 3], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp); + } + break; + } + case F_TRAINER_PARTY_HELD_ITEM: + { + const struct TrainerMonItemDefaultMoves *partyData = gTrainers[trainerId - TRAINER_CUSTOM_PARTNER].party.ItemDefaultMoves; + + CreateMon(&gPlayerParty[i + 3], partyData[i].species, partyData[i].lvl, partyData[i].iv * 31 / 255, TRUE, j, TRUE, otID); + + SetMonData(&gPlayerParty[i + 3], MON_DATA_HELD_ITEM, &partyData[i].heldItem); + break; + } + case F_TRAINER_PARTY_CUSTOM_MOVESET | F_TRAINER_PARTY_HELD_ITEM: + { + const struct TrainerMonItemCustomMoves *partyData = gTrainers[trainerId - TRAINER_CUSTOM_PARTNER].party.ItemCustomMoves; + + CreateMon(&gPlayerParty[i + 3], partyData[i].species, partyData[i].lvl, partyData[i].iv * 31 / 255, TRUE, j, TRUE, otID); + + SetMonData(&gPlayerParty[i + 3], MON_DATA_HELD_ITEM, &partyData[i].heldItem); + + for (j = 0; j < 4; j++) + { + SetMonData(&gPlayerParty[i + 3], MON_DATA_MOVE1 + j, &partyData[i].moves[j]); + SetMonData(&gPlayerParty[i + 3], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp); + } + break; + } + } + + StringCopy(trainerName, gTrainers[trainerId - TRAINER_CUSTOM_PARTNER].trainerName); + SetMonData(&gPlayerParty[i + 3], MON_DATA_OT_NAME, trainerName); + } + } else if (trainerId == TRAINER_EREADER) { // Scrapped, lol. diff --git a/src/battle_tv.c b/src/battle_tv.c index dea7116090..8b006c0966 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -1099,20 +1099,9 @@ static void TrySetBattleSeminarShow(void) powerOverride = 0; if (ShouldCalculateDamage(gCurrentMove, &dmgByMove[i], &powerOverride)) { - u8 moveResultFlags; - u16 sideStatus = gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)]; - gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerTarget], gCurrentMove, - sideStatus, powerOverride, - 0, gBattlerAttacker, gBattlerTarget); - - if (gStatuses3[gBattlerAttacker] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) - gBattleMoveDamage *= 2; - if (gProtectStructs[gBattlerAttacker].helpingHand) - gBattleMoveDamage = gBattleMoveDamage * 15 / 10; - - moveResultFlags = TypeCalc(gCurrentMove, gBattlerAttacker, gBattlerTarget); + gBattleMoveDamage = CalculateMoveDamage(gCurrentMove, gBattlerAttacker, gBattlerTarget, gBattleMoves[gCurrentMove].type, powerOverride, FALSE, FALSE, FALSE); dmgByMove[i] = gBattleMoveDamage; - if (dmgByMove[i] == 0 && !(moveResultFlags & MOVE_RESULT_NO_EFFECT)) + if (dmgByMove[i] == 0 && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) dmgByMove[i] = 1; } } diff --git a/src/battle_util.c b/src/battle_util.c index f98b088e05..c11bd531c8 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2,6 +2,10 @@ #include "battle.h" #include "battle_util.h" #include "battle_anim.h" +#include "battle_controllers.h" +#include "battle_interface.h" +#include "battle_setup.h" +#include "party_menu.h" #include "pokemon.h" #include "item.h" #include "util.h" @@ -9,11 +13,17 @@ #include "random.h" #include "string_util.h" #include "battle_ai_script_commands.h" -#include "battle_controllers.h" #include "event_data.h" #include "link.h" +#include "malloc.h" +#include "berry.h" +#include "pokedex.h" +#include "mail.h" +#include "constants/battle_config.h" #include "field_weather.h" #include "constants/abilities.h" +#include "constants/battle_anim.h" +#include "constants/battle_config.h" #include "constants/battle_move_effects.h" #include "constants/battle_script_commands.h" #include "constants/battle_string_ids.h" @@ -44,23 +54,21 @@ static const u8 sGoNearCounterToEscapeFactor[] = {4, 4, 4, 4}; void HandleAction_UseMove(void) { - u8 side; - u8 var = 4; + u32 i, side, moveType, var = 4; gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; - - if (*(&gBattleStruct->field_91) & gBitTable[gBattlerAttacker]) + if (gBattleStruct->field_91 & gBitTable[gBattlerAttacker] || !IsBattlerAlive(gBattlerAttacker)) { gCurrentActionFuncId = B_ACTION_FINISHED; return; } - gCritMultiplier = 1; - gBattleScripting.dmgMultiplier = 1; + gIsCriticalHit = FALSE; gBattleStruct->atkCancellerTracker = 0; gMoveResultFlags = 0; gMultiHitCounter = 0; gBattleCommunication[6] = 0; + gBattleScripting.savedMoveEffect = 0; gCurrMovePos = gChosenMovePos = *(gBattleStruct->chosenMovePositions + gBattlerAttacker); // choose move @@ -112,6 +120,10 @@ void HandleAction_UseMove(void) gBattleResults.lastUsedMoveOpponent = gCurrentMove; } + // Set dynamic move type. + SetTypeBeforeUsingMove(gChosenMove, gBattlerAttacker); + GET_MOVE_TYPE(gChosenMove, moveType); + // choose target side = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE; if (gSideTimers[side].followmeTimer != 0 @@ -123,17 +135,20 @@ void HandleAction_UseMove(void) } else if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gSideTimers[side].followmeTimer == 0 - && (gBattleMoves[gCurrentMove].power != 0 - || gBattleMoves[gCurrentMove].target != MOVE_TARGET_USER) - && gBattleMons[*(gBattleStruct->moveTarget + gBattlerAttacker)].ability != ABILITY_LIGHTNING_ROD - && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) + && (gBattleMoves[gCurrentMove].power != 0 || gBattleMoves[gCurrentMove].target != MOVE_TARGET_USER) + && ((gBattleMons[*(gBattleStruct->moveTarget + gBattlerAttacker)].ability != ABILITY_LIGHTNING_ROD && moveType == TYPE_ELECTRIC) + || (gBattleMons[*(gBattleStruct->moveTarget + gBattlerAttacker)].ability != ABILITY_STORM_DRAIN && moveType == TYPE_WATER) + ) + ) { side = GetBattlerSide(gBattlerAttacker); for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { if (side != GetBattlerSide(gActiveBattler) && *(gBattleStruct->moveTarget + gBattlerAttacker) != gActiveBattler - && gBattleMons[gActiveBattler].ability == ABILITY_LIGHTNING_ROD + && ((GetBattlerAbility(gActiveBattler) == ABILITY_LIGHTNING_ROD && moveType == TYPE_ELECTRIC) + || (GetBattlerAbility(gActiveBattler) == ABILITY_STORM_DRAIN && moveType == TYPE_WATER) + ) && GetBattlerTurnOrderNum(gActiveBattler) < var) { var = GetBattlerTurnOrderNum(gActiveBattler); @@ -158,12 +173,22 @@ void HandleAction_UseMove(void) gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); } } + else if (gBattleMoves[gChosenMove].target & MOVE_TARGET_FOES_AND_ALLY) + { + for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++) + { + if (gBattlerTarget == gBattlerAttacker) + continue; + if (IsBattlerAlive(gBattlerTarget)) + break; + } + } else { gBattlerTarget = *(gBattleStruct->moveTarget + gBattlerAttacker); } - if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) + if (!IsBattlerAlive(gBattlerTarget)) { if (GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget)) { @@ -172,7 +197,7 @@ void HandleAction_UseMove(void) else { gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_SIDE); - if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) + if (!IsBattlerAlive(gBattlerTarget)) gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerTarget) ^ BIT_FLANK); } } @@ -181,7 +206,10 @@ void HandleAction_UseMove(void) { gActiveBattler = gBattlerByTurnOrder[var]; RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability); - gSpecialStatuses[gActiveBattler].lightningRodRedirected = 1; + if (gBattleMons[gActiveBattler].ability == ABILITY_LIGHTNING_ROD) + gSpecialStatuses[gActiveBattler].lightningRodRedirected = 1; + else if (gBattleMons[gActiveBattler].ability == ABILITY_STORM_DRAIN) + gSpecialStatuses[gActiveBattler].stormDrainRedirected = 1; gBattlerTarget = gActiveBattler; } } @@ -209,10 +237,28 @@ void HandleAction_UseMove(void) gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerTarget) ^ BIT_FLANK); } } + else if (gBattleMoves[gChosenMove].target == MOVE_TARGET_ALLY) + { + if (IsBattlerAlive(BATTLE_PARTNER(gBattlerAttacker))) + gBattlerTarget = BATTLE_PARTNER(gBattlerAttacker); + else + gBattlerTarget = gBattlerAttacker; + } + else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE + && gBattleMoves[gChosenMove].target == MOVE_TARGET_FOES_AND_ALLY) + { + for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++) + { + if (gBattlerTarget == gBattlerAttacker) + continue; + if (IsBattlerAlive(gBattlerTarget)) + break; + } + } else { gBattlerTarget = *(gBattleStruct->moveTarget + gBattlerAttacker); - if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) + if (!IsBattlerAlive(gBattlerTarget)) { if (GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget)) { @@ -221,13 +267,13 @@ void HandleAction_UseMove(void) else { gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_SIDE); - if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) + if (!IsBattlerAlive(gBattlerTarget)) gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerTarget) ^ BIT_FLANK); } } } - // choose battlescript + // Choose battlescript. if (gBattleTypeFlags & BATTLE_TYPE_PALACE && gProtectStructs[gBattlerAttacker].palaceUnableToUseMove) { @@ -256,6 +302,10 @@ void HandleAction_UseMove(void) if (gBattleTypeFlags & BATTLE_TYPE_ARENA) BattleArena_AddMindPoints(gBattlerAttacker); + // Record HP of each battler + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + gBattleStruct->hpBefore[i] = gBattleMons[i].hp; + gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; } @@ -275,6 +325,8 @@ void HandleAction_Switch(void) if (gBattleResults.playerSwitchesCounter < 255) gBattleResults.playerSwitchesCounter++; + + UndoFormChange(gBattlerPartyIndexes[gBattlerAttacker], GetBattlerSide(gBattlerAttacker)); } void HandleAction_UseItem(void) @@ -282,10 +334,8 @@ void HandleAction_UseItem(void) gBattlerAttacker = gBattlerTarget = gBattlerByTurnOrder[gCurrentTurnActionNumber]; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; - ClearFuryCutterDestinyBondGrudge(gBattlerAttacker); - - gLastUsedItem = gBattleBufferB[gBattlerAttacker][1] | (gBattleBufferB[gBattlerAttacker][2] << 8); + gLastUsedItem = gBattleResources->bufferB[gBattlerAttacker][1] | (gBattleResources->bufferB[gBattlerAttacker][2] << 8); if (gLastUsedItem <= LAST_BALL) // is ball { @@ -310,18 +360,18 @@ void HandleAction_UseItem(void) break; case AI_ITEM_CURE_CONDITION: gBattleCommunication[MULTISTRING_CHOOSER] = 0; - if (*(gBattleStruct->AI_itemFlags + (gBattlerAttacker >> 1)) & 1) + if (*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) & 1) { - if (*(gBattleStruct->AI_itemFlags + (gBattlerAttacker >> 1)) & 0x3E) + if (*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) & 0x3E) gBattleCommunication[MULTISTRING_CHOOSER] = 5; } else { - do + while (!(*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) & 1)) { - *(gBattleStruct->AI_itemFlags + (gBattlerAttacker >> 1)) >>= 1; + *(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) >>= 1; gBattleCommunication[MULTISTRING_CHOOSER]++; - } while (!(*(gBattleStruct->AI_itemFlags + (gBattlerAttacker >> 1)) & 1)); + } } break; case AI_ITEM_X_STAT: @@ -337,7 +387,7 @@ void HandleAction_UseItem(void) while (!((*(gBattleStruct->AI_itemFlags + (gBattlerAttacker >> 1))) & 1)) { - *(gBattleStruct->AI_itemFlags + (gBattlerAttacker >> 1)) >>= 1; + *(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) >>= 1; gBattleTextBuff1[2]++; } @@ -353,7 +403,7 @@ void HandleAction_UseItem(void) break; } - gBattlescriptCurrInstr = gBattlescriptsForUsingItem[*(gBattleStruct->AI_itemType + (gBattlerAttacker >> 1))]; + gBattlescriptCurrInstr = gBattlescriptsForUsingItem[*(gBattleStruct->AI_itemType + gBattlerAttacker / 2)]; } gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; } @@ -405,25 +455,26 @@ bool8 TryRunFromBattle(u8 battler) } else { - if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + u8 runningFromBattler = BATTLE_OPPOSITE(battler); + if (!IsBattlerAlive(runningFromBattler)) + runningFromBattler |= BIT_FLANK; + + if (InBattlePyramid()) { - if (InBattlePyramid()) - { - pyramidMultiplier = GetPyramidRunMultiplier(); - speedVar = (gBattleMons[battler].speed * pyramidMultiplier) / (gBattleMons[BATTLE_OPPOSITE(battler)].speed) + (gBattleStruct->runTries * 30); - if (speedVar > (Random() & 0xFF)) - effect++; - } - else if (gBattleMons[battler].speed < gBattleMons[BATTLE_OPPOSITE(battler)].speed) - { - speedVar = (gBattleMons[battler].speed * 128) / (gBattleMons[BATTLE_OPPOSITE(battler)].speed) + (gBattleStruct->runTries * 30); - if (speedVar > (Random() & 0xFF)) - effect++; - } - else // same speed or faster - { + pyramidMultiplier = GetPyramidRunMultiplier(); + speedVar = (gBattleMons[battler].speed * pyramidMultiplier) / (gBattleMons[runningFromBattler].speed) + (gBattleStruct->runTries * 30); + if (speedVar > (Random() & 0xFF)) effect++; - } + } + else if (gBattleMons[battler].speed < gBattleMons[runningFromBattler].speed) + { + speedVar = (gBattleMons[battler].speed * 128) / (gBattleMons[runningFromBattler].speed) + (gBattleStruct->runTries * 30); + if (speedVar > (Random() & 0xFF)) + effect++; + } + else // same speed or faster + { + effect++; } gBattleStruct->runTries++; @@ -477,7 +528,7 @@ void HandleAction_Run(void) } else { - if (gBattleMons[gBattlerAttacker].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) + if (!CanBattlerEscape(gBattlerAttacker)) { gBattleCommunication[MULTISTRING_CHOOSER] = 4; gBattlescriptCurrInstr = BattleScript_PrintFailedToRunString; @@ -517,8 +568,8 @@ void HandleAction_ThrowPokeblock(void) gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = gBattleBufferB[gBattlerAttacker][1] - 1; - gLastUsedItem = gBattleBufferB[gBattlerAttacker][2]; + gBattleCommunication[MULTISTRING_CHOOSER] = gBattleResources->bufferB[gBattlerAttacker][1] - 1; + gLastUsedItem = gBattleResources->bufferB[gBattlerAttacker][2]; if (gBattleResults.pokeblockThrows < 0xFF) gBattleResults.pokeblockThrows++; @@ -526,8 +577,6 @@ void HandleAction_ThrowPokeblock(void) gBattleStruct->safariPkblThrowCounter++; if (gBattleStruct->safariEscapeFactor > 1) { - // BUG: The safariEscapeFactor is unintetionally able to become 0 (but it can not become negative!). This causes the pokeblock throw glitch. - // To fix that change the < in the if statement below to <=. if (gBattleStruct->safariEscapeFactor < sPkblToEscapeFactor[gBattleStruct->safariPkblThrowCounter][gBattleCommunication[MULTISTRING_CHOOSER]]) gBattleStruct->safariEscapeFactor = 1; else @@ -600,8 +649,7 @@ void HandleAction_NothingIsFainted(void) gCurrentTurnActionNumber++; gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber]; gHitMarker &= ~(HITMARKER_DESTINYBOND | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED - | HITMARKER_NO_PPDEDUCT | HITMARKER_IGNORE_SAFEGUARD | HITMARKER_IGNORE_ON_AIR - | HITMARKER_IGNORE_UNDERGROUND | HITMARKER_IGNORE_UNDERWATER | HITMARKER_x100000 + | HITMARKER_NO_PPDEDUCT | HITMARKER_IGNORE_SAFEGUARD | HITMARKER_x100000 | HITMARKER_OBEYS | HITMARKER_x10 | HITMARKER_SYNCHRONISE_EFFECT | HITMARKER_CHARGING | HITMARKER_x4000000); } @@ -613,8 +661,7 @@ void HandleAction_ActionFinished(void) gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber]; SpecialStatusesClear(); gHitMarker &= ~(HITMARKER_DESTINYBOND | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED - | HITMARKER_NO_PPDEDUCT | HITMARKER_IGNORE_SAFEGUARD | HITMARKER_IGNORE_ON_AIR - | HITMARKER_IGNORE_UNDERGROUND | HITMARKER_IGNORE_UNDERWATER | HITMARKER_x100000 + | HITMARKER_NO_PPDEDUCT | HITMARKER_IGNORE_SAFEGUARD | HITMARKER_x100000 | HITMARKER_OBEYS | HITMARKER_x10 | HITMARKER_SYNCHRONISE_EFFECT | HITMARKER_CHARGING | HITMARKER_x4000000); @@ -626,7 +673,7 @@ void HandleAction_ActionFinished(void) gLastLandedMoves[gBattlerAttacker] = 0; gLastHitByType[gBattlerAttacker] = 0; gBattleStruct->dynamicMoveType = 0; - gDynamicBasePower = 0; + gBattleScripting.moveendState = 0; gBattleScripting.moveendState = 0; gBattleCommunication[3] = 0; gBattleCommunication[4] = 0; @@ -635,12 +682,277 @@ void HandleAction_ActionFinished(void) } // rom const data -static const u16 sSoundMovesTable[] = + +static const u8 sAbilitiesAffectedByMoldBreaker[] = { - MOVE_GROWL, MOVE_ROAR, MOVE_SING, MOVE_SUPERSONIC, MOVE_SCREECH, MOVE_SNORE, - MOVE_UPROAR, MOVE_METAL_SOUND, MOVE_GRASS_WHISTLE, MOVE_HYPER_VOICE, 0xFFFF + [ABILITY_BATTLE_ARMOR] = 1, + [ABILITY_CLEAR_BODY] = 1, + [ABILITY_DAMP] = 1, + [ABILITY_DRY_SKIN] = 1, + [ABILITY_FILTER] = 1, + [ABILITY_FLASH_FIRE] = 1, + [ABILITY_FLOWER_GIFT] = 1, + [ABILITY_HEATPROOF] = 1, + [ABILITY_HYPER_CUTTER] = 1, + [ABILITY_IMMUNITY] = 1, + [ABILITY_INNER_FOCUS] = 1, + [ABILITY_INSOMNIA] = 1, + [ABILITY_KEEN_EYE] = 1, + [ABILITY_LEAF_GUARD] = 1, + [ABILITY_LEVITATE] = 1, + [ABILITY_LIGHTNING_ROD] = 1, + [ABILITY_LIMBER] = 1, + [ABILITY_MAGMA_ARMOR] = 1, + [ABILITY_MARVEL_SCALE] = 1, + [ABILITY_MOTOR_DRIVE] = 1, + [ABILITY_OBLIVIOUS] = 1, + [ABILITY_OWN_TEMPO] = 1, + [ABILITY_SAND_VEIL] = 1, + [ABILITY_SHELL_ARMOR] = 1, + [ABILITY_SHIELD_DUST] = 1, + [ABILITY_SIMPLE] = 1, + [ABILITY_SNOW_CLOAK] = 1, + [ABILITY_SOLID_ROCK] = 1, + [ABILITY_SOUNDPROOF] = 1, + [ABILITY_STICKY_HOLD] = 1, + [ABILITY_STORM_DRAIN] = 1, + [ABILITY_STURDY] = 1, + [ABILITY_SUCTION_CUPS] = 1, + [ABILITY_TANGLED_FEET] = 1, + [ABILITY_THICK_FAT] = 1, + [ABILITY_UNAWARE] = 1, + [ABILITY_VITAL_SPIRIT] = 1, + [ABILITY_VOLT_ABSORB] = 1, + [ABILITY_WATER_ABSORB] = 1, + [ABILITY_WATER_VEIL] = 1, + [ABILITY_WHITE_SMOKE] = 1, + [ABILITY_WONDER_GUARD] = 1, + [ABILITY_BIG_PECKS] = 1, + [ABILITY_CONTRARY] = 1, + [ABILITY_FRIEND_GUARD] = 1, + [ABILITY_HEAVY_METAL] = 1, + [ABILITY_LIGHT_METAL] = 1, + [ABILITY_MAGIC_BOUNCE] = 1, + [ABILITY_MULTISCALE] = 1, + [ABILITY_SAP_SIPPER] = 1, + [ABILITY_TELEPATHY] = 1, + [ABILITY_WONDER_SKIN] = 1, + [ABILITY_AROMA_VEIL] = 1, + [ABILITY_BULLETPROOF] = 1, + [ABILITY_FLOWER_VEIL] = 1, + [ABILITY_FUR_COAT] = 1, + [ABILITY_OVERCOAT] = 1, + [ABILITY_SWEET_VEIL] = 1, + [ABILITY_DAZZLING] = 1, + [ABILITY_DISGUISE] = 1, + [ABILITY_FLUFFY] = 1, + [ABILITY_QUEENLY_MAJESTY] = 1, + [ABILITY_WATER_BUBBLE] = 1, }; +static const u8 sAbilitiesNotTraced[ABILITIES_COUNT] = +{ + [ABILITY_BATTLE_BOND] = 1, + [ABILITY_COMATOSE] = 1, + [ABILITY_DISGUISE] = 1, + [ABILITY_FLOWER_GIFT] = 1, + [ABILITY_FORECAST] = 1, + [ABILITY_ILLUSION] = 1, + [ABILITY_IMPOSTER] = 1, + [ABILITY_MULTITYPE] = 1, + [ABILITY_NONE] = 1, + [ABILITY_POWER_CONSTRUCT] = 1, + [ABILITY_POWER_OF_ALCHEMY] = 1, + [ABILITY_RECEIVER] = 1, + [ABILITY_RKS_SYSTEM] = 1, + [ABILITY_SCHOOLING] = 1, + [ABILITY_SHIELDS_DOWN] = 1, + [ABILITY_STANCE_CHANGE] = 1, + [ABILITY_TRACE] = 1, + [ABILITY_ZEN_MODE] = 1, +}; + +static const u8 sHoldEffectToType[][2] = +{ + {HOLD_EFFECT_BUG_POWER, TYPE_BUG}, + {HOLD_EFFECT_STEEL_POWER, TYPE_STEEL}, + {HOLD_EFFECT_GROUND_POWER, TYPE_GROUND}, + {HOLD_EFFECT_ROCK_POWER, TYPE_ROCK}, + {HOLD_EFFECT_GRASS_POWER, TYPE_GRASS}, + {HOLD_EFFECT_DARK_POWER, TYPE_DARK}, + {HOLD_EFFECT_FIGHTING_POWER, TYPE_FIGHTING}, + {HOLD_EFFECT_ELECTRIC_POWER, TYPE_ELECTRIC}, + {HOLD_EFFECT_WATER_POWER, TYPE_WATER}, + {HOLD_EFFECT_FLYING_POWER, TYPE_FLYING}, + {HOLD_EFFECT_POISON_POWER, TYPE_POISON}, + {HOLD_EFFECT_ICE_POWER, TYPE_ICE}, + {HOLD_EFFECT_GHOST_POWER, TYPE_GHOST}, + {HOLD_EFFECT_PSYCHIC_POWER, TYPE_PSYCHIC}, + {HOLD_EFFECT_FIRE_POWER, TYPE_FIRE}, + {HOLD_EFFECT_DRAGON_POWER, TYPE_DRAGON}, + {HOLD_EFFECT_NORMAL_POWER, TYPE_NORMAL}, + {HOLD_EFFECT_FAIRY_POWER, TYPE_FAIRY}, +}; + +// percent in UQ_4_12 format +static const u16 sPercentToModifier[] = +{ + UQ_4_12(0.00), // 0 + UQ_4_12(0.01), // 1 + UQ_4_12(0.02), // 2 + UQ_4_12(0.03), // 3 + UQ_4_12(0.04), // 4 + UQ_4_12(0.05), // 5 + UQ_4_12(0.06), // 6 + UQ_4_12(0.07), // 7 + UQ_4_12(0.08), // 8 + UQ_4_12(0.09), // 9 + UQ_4_12(0.10), // 10 + UQ_4_12(0.11), // 11 + UQ_4_12(0.12), // 12 + UQ_4_12(0.13), // 13 + UQ_4_12(0.14), // 14 + UQ_4_12(0.15), // 15 + UQ_4_12(0.16), // 16 + UQ_4_12(0.17), // 17 + UQ_4_12(0.18), // 18 + UQ_4_12(0.19), // 19 + UQ_4_12(0.20), // 20 + UQ_4_12(0.21), // 21 + UQ_4_12(0.22), // 22 + UQ_4_12(0.23), // 23 + UQ_4_12(0.24), // 24 + UQ_4_12(0.25), // 25 + UQ_4_12(0.26), // 26 + UQ_4_12(0.27), // 27 + UQ_4_12(0.28), // 28 + UQ_4_12(0.29), // 29 + UQ_4_12(0.30), // 30 + UQ_4_12(0.31), // 31 + UQ_4_12(0.32), // 32 + UQ_4_12(0.33), // 33 + UQ_4_12(0.34), // 34 + UQ_4_12(0.35), // 35 + UQ_4_12(0.36), // 36 + UQ_4_12(0.37), // 37 + UQ_4_12(0.38), // 38 + UQ_4_12(0.39), // 39 + UQ_4_12(0.40), // 40 + UQ_4_12(0.41), // 41 + UQ_4_12(0.42), // 42 + UQ_4_12(0.43), // 43 + UQ_4_12(0.44), // 44 + UQ_4_12(0.45), // 45 + UQ_4_12(0.46), // 46 + UQ_4_12(0.47), // 47 + UQ_4_12(0.48), // 48 + UQ_4_12(0.49), // 49 + UQ_4_12(0.50), // 50 + UQ_4_12(0.51), // 51 + UQ_4_12(0.52), // 52 + UQ_4_12(0.53), // 53 + UQ_4_12(0.54), // 54 + UQ_4_12(0.55), // 55 + UQ_4_12(0.56), // 56 + UQ_4_12(0.57), // 57 + UQ_4_12(0.58), // 58 + UQ_4_12(0.59), // 59 + UQ_4_12(0.60), // 60 + UQ_4_12(0.61), // 61 + UQ_4_12(0.62), // 62 + UQ_4_12(0.63), // 63 + UQ_4_12(0.64), // 64 + UQ_4_12(0.65), // 65 + UQ_4_12(0.66), // 66 + UQ_4_12(0.67), // 67 + UQ_4_12(0.68), // 68 + UQ_4_12(0.69), // 69 + UQ_4_12(0.70), // 70 + UQ_4_12(0.71), // 71 + UQ_4_12(0.72), // 72 + UQ_4_12(0.73), // 73 + UQ_4_12(0.74), // 74 + UQ_4_12(0.75), // 75 + UQ_4_12(0.76), // 76 + UQ_4_12(0.77), // 77 + UQ_4_12(0.78), // 78 + UQ_4_12(0.79), // 79 + UQ_4_12(0.80), // 80 + UQ_4_12(0.81), // 81 + UQ_4_12(0.82), // 82 + UQ_4_12(0.83), // 83 + UQ_4_12(0.84), // 84 + UQ_4_12(0.85), // 85 + UQ_4_12(0.86), // 86 + UQ_4_12(0.87), // 87 + UQ_4_12(0.88), // 88 + UQ_4_12(0.89), // 89 + UQ_4_12(0.90), // 90 + UQ_4_12(0.91), // 91 + UQ_4_12(0.92), // 92 + UQ_4_12(0.93), // 93 + UQ_4_12(0.94), // 94 + UQ_4_12(0.95), // 95 + UQ_4_12(0.96), // 96 + UQ_4_12(0.97), // 97 + UQ_4_12(0.98), // 98 + UQ_4_12(0.99), // 99 + UQ_4_12(1.00), // 100 +}; + +#define X UQ_4_12 + +static const u16 sTypeEffectivenessTable[NUMBER_OF_MON_TYPES][NUMBER_OF_MON_TYPES] = +{ +// normal fight flying poison ground rock bug ghost steel mystery fire water grass electric psychic ice dragon dark fairy + {X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(0.5), X(1.0), X(0.0), X(0.5), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0)}, // normal + {X(2.0), X(1.0), X(0.5), X(0.5), X(1.0), X(2.0), X(0.5), X(0.0), X(2.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(0.5), X(2.0), X(1.0), X(2.0), X(0.5)}, // fight + {X(1.0), X(2.0), X(1.0), X(1.0), X(1.0), X(0.5), X(2.0), X(1.0), X(0.5), X(1.0), X(1.0), X(1.0), X(2.0), X(0.5), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0)}, // flying + {X(1.0), X(1.0), X(1.0), X(0.5), X(0.5), X(0.5), X(1.0), X(0.5), X(0.0), X(1.0), X(1.0), X(1.0), X(2.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(2.0)}, // poison + {X(1.0), X(1.0), X(0.0), X(2.0), X(1.0), X(2.0), X(0.5), X(1.0), X(2.0), X(1.0), X(2.0), X(1.0), X(0.5), X(2.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0)}, // ground + {X(1.0), X(0.5), X(2.0), X(1.0), X(0.5), X(1.0), X(2.0), X(1.0), X(0.5), X(1.0), X(2.0), X(1.0), X(1.0), X(1.0), X(1.0), X(2.0), X(1.0), X(1.0), X(1.0)}, // rock + {X(1.0), X(0.5), X(0.5), X(0.5), X(1.0), X(1.0), X(1.0), X(0.5), X(0.5), X(1.0), X(0.5), X(1.0), X(2.0), X(1.0), X(2.0), X(1.0), X(1.0), X(2.0), X(0.5)}, // bug + {X(0.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(2.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(2.0), X(1.0), X(1.0), X(0.5), X(1.0)}, // ghost + {X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(2.0), X(1.0), X(1.0), X(0.5), X(1.0), X(0.5), X(0.5), X(1.0), X(0.5), X(1.0), X(2.0), X(1.0), X(1.0), X(2.0)}, // steel + {X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0)}, // mystery + {X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(0.5), X(2.0), X(1.0), X(2.0), X(1.0), X(0.5), X(0.5), X(2.0), X(1.0), X(1.0), X(2.0), X(0.5), X(1.0), X(1.0)}, // fire + {X(1.0), X(1.0), X(1.0), X(1.0), X(2.0), X(2.0), X(1.0), X(1.0), X(1.0), X(1.0), X(2.0), X(0.5), X(0.5), X(1.0), X(1.0), X(1.0), X(0.5), X(1.0), X(1.0)}, // water + {X(1.0), X(1.0), X(0.5), X(0.5), X(2.0), X(2.0), X(0.5), X(1.0), X(0.5), X(1.0), X(0.5), X(2.0), X(0.5), X(1.0), X(1.0), X(1.0), X(0.5), X(1.0), X(1.0)}, // grass + {X(1.0), X(1.0), X(2.0), X(1.0), X(0.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(2.0), X(0.5), X(0.5), X(1.0), X(1.0), X(0.5), X(1.0), X(1.0)}, // electric + {X(1.0), X(2.0), X(1.0), X(2.0), X(1.0), X(1.0), X(1.0), X(1.0), X(0.5), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(0.5), X(1.0), X(1.0), X(0.0), X(1.0)}, // psychic + {X(1.0), X(1.0), X(2.0), X(1.0), X(2.0), X(1.0), X(1.0), X(1.0), X(0.5), X(1.0), X(0.5), X(0.5), X(2.0), X(1.0), X(1.0), X(0.5), X(2.0), X(1.0), X(1.0)}, // ice + {X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(0.5), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(2.0), X(1.0), X(0.0)}, // dragon + {X(1.0), X(0.5), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(2.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(2.0), X(1.0), X(1.0), X(0.5), X(0.5)}, // dark + {X(1.0), X(2.0), X(1.0), X(0.5), X(1.0), X(1.0), X(1.0), X(1.0), X(0.5), X(1.0), X(0.5), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(2.0), X(2.0), X(1.0)}, // fairy +}; + +static const u16 sInverseTypeEffectivenessTable[NUMBER_OF_MON_TYPES][NUMBER_OF_MON_TYPES] = +{ +// normal fight flying poison ground rock bug ghost steel mystery fire water grass electric psychic ice dragon dark fairy + {X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(2.0), X(1.0), X(2.0), X(2.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0)}, // normal + {X(0.5), X(1.0), X(2.0), X(2.0), X(1.0), X(0.5), X(2.0), X(2.0), X(0.5), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(2.0), X(0.5), X(1.0), X(0.5), X(2.0)}, // fight + {X(1.0), X(0.5), X(1.0), X(1.0), X(1.0), X(2.0), X(0.5), X(1.0), X(2.0), X(1.0), X(1.0), X(1.0), X(0.5), X(2.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0)}, // flying + {X(1.0), X(1.0), X(1.0), X(2.0), X(2.0), X(2.0), X(1.0), X(2.0), X(2.0), X(1.0), X(1.0), X(1.0), X(0.5), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(0.5)}, // poison + {X(1.0), X(1.0), X(2.0), X(0.5), X(1.0), X(0.5), X(2.0), X(1.0), X(0.5), X(1.0), X(0.5), X(1.0), X(2.0), X(0.5), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0)}, // ground + {X(1.0), X(2.0), X(0.5), X(1.0), X(2.0), X(1.0), X(0.5), X(1.0), X(2.0), X(1.0), X(0.5), X(1.0), X(1.0), X(1.0), X(1.0), X(0.5), X(1.0), X(1.0), X(1.0)}, // rock + {X(1.0), X(2.0), X(2.0), X(2.0), X(1.0), X(1.0), X(1.0), X(2.0), X(2.0), X(1.0), X(2.0), X(1.0), X(0.5), X(1.0), X(0.5), X(1.0), X(1.0), X(0.5), X(2.0)}, // bug + {X(2.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(0.5), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(0.5), X(1.0), X(1.0), X(2.0), X(1.0)}, // ghost + {X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(0.5), X(1.0), X(1.0), X(2.0), X(1.0), X(2.0), X(2.0), X(1.0), X(2.0), X(1.0), X(0.5), X(1.0), X(1.0), X(0.5)}, // steel + {X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0)}, // mystery + {X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(2.0), X(0.5), X(1.0), X(0.5), X(1.0), X(2.0), X(2.0), X(0.5), X(1.0), X(1.0), X(0.5), X(2.0), X(1.0), X(1.0)}, // fire + {X(1.0), X(1.0), X(1.0), X(1.0), X(0.5), X(0.5), X(1.0), X(1.0), X(1.0), X(1.0), X(0.5), X(2.0), X(2.0), X(1.0), X(1.0), X(1.0), X(2.0), X(1.0), X(1.0)}, // water + {X(1.0), X(1.0), X(2.0), X(2.0), X(0.5), X(0.5), X(2.0), X(1.0), X(2.0), X(1.0), X(2.0), X(0.5), X(2.0), X(1.0), X(1.0), X(1.0), X(2.0), X(1.0), X(1.0)}, // grass + {X(1.0), X(1.0), X(0.5), X(1.0), X(2.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(0.5), X(2.0), X(2.0), X(1.0), X(1.0), X(2.0), X(1.0), X(1.0)}, // electric + {X(1.0), X(0.5), X(1.0), X(0.5), X(1.0), X(1.0), X(1.0), X(1.0), X(2.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(2.0), X(1.0), X(1.0), X(2.0), X(1.0)}, // psychic + {X(1.0), X(1.0), X(0.5), X(1.0), X(0.5), X(1.0), X(1.0), X(1.0), X(2.0), X(1.0), X(2.0), X(2.0), X(0.5), X(1.0), X(1.0), X(2.0), X(0.5), X(1.0), X(1.0)}, // ice + {X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(2.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(0.5), X(1.0), X(2.0)}, // dragon + {X(1.0), X(2.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(0.5), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(0.5), X(1.0), X(1.0), X(2.0), X(2.0)}, // dark + {X(1.0), X(0.5), X(1.0), X(2.0), X(1.0), X(1.0), X(1.0), X(1.0), X(2.0), X(1.0), X(2.0), X(1.0), X(1.0), X(1.0), X(1.0), X(1.0), X(0.5), X(0.5), X(1.0)}, // fairy +}; + +#undef X + +// code u8 GetBattlerForBattleScript(u8 caseId) { u8 ret = 0; @@ -683,6 +995,9 @@ u8 GetBattlerForBattleScript(u8 caseId) case BS_OPPONENT2: ret = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); break; + case BS_ABILITY_BATTLER: + ret = gBattlerAbility; + break; } return ret; } @@ -798,6 +1113,14 @@ void MarkAllBattlersForControllerExec(void) // unused } } +bool32 IsBattlerMarkedForControllerExec(u8 battlerId) +{ + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + return (gBattleControllerExecFlags & (gBitTable[battlerId] << 0x1C)) != 0; + else + return (gBattleControllerExecFlags & (gBitTable[battlerId])) != 0; +} + void MarkBattlerForControllerExec(u8 battlerId) { if (gBattleTypeFlags & BATTLE_TYPE_LINK) @@ -837,9 +1160,13 @@ bool8 WasUnableToUseMove(u8 battler) || gProtectStructs[battler].loveImmobility || gProtectStructs[battler].usedDisabledMove || gProtectStructs[battler].usedTauntedMove + || gProtectStructs[battler].usedGravityPreventedMove + || gProtectStructs[battler].usedHealBlockedMove || gProtectStructs[battler].flag2Unknown || gProtectStructs[battler].flinchImmobility - || gProtectStructs[battler].confusionSelfDmg) + || gProtectStructs[battler].confusionSelfDmg + || gProtectStructs[battler].powderSelfDmg + || gProtectStructs[battler].usedThroatChopPreventedMove) return TRUE; else return FALSE; @@ -847,6 +1174,35 @@ bool8 WasUnableToUseMove(u8 battler) void PrepareStringBattle(u16 stringId, u8 battler) { + // Support for Contrary ability. + // If a move attempted to raise stat - print "won't increase". + // If a move attempted to lower stat - print "won't decrease". + if (stringId == STRINGID_STATSWONTDECREASE && !(gBattleScripting.statChanger & STAT_BUFF_NEGATIVE)) + stringId = STRINGID_STATSWONTINCREASE; + else if (stringId == STRINGID_STATSWONTINCREASE && gBattleScripting.statChanger & STAT_BUFF_NEGATIVE) + stringId = STRINGID_STATSWONTDECREASE; + + else if (stringId == STRINGID_STATSWONTDECREASE2 && GetBattlerAbility(battler) == ABILITY_CONTRARY) + stringId = STRINGID_STATSWONTINCREASE2; + else if (stringId == STRINGID_STATSWONTINCREASE2 && GetBattlerAbility(battler) == ABILITY_CONTRARY) + stringId = STRINGID_STATSWONTDECREASE2; + + // Check Defiant and Competitive stat raise whenever a stat is lowered. + else if ((stringId == STRINGID_PKMNSSTATCHANGED4 || stringId == STRINGID_PKMNCUTSATTACKWITH) + && ((GetBattlerAbility(gBattlerTarget) == ABILITY_DEFIANT && gBattleMons[gBattlerTarget].statStages[STAT_ATK] != 12) + || (GetBattlerAbility(gBattlerTarget) == ABILITY_COMPETITIVE && gBattleMons[gBattlerTarget].statStages[STAT_SPATK] != 12)) + && gSpecialStatuses[gBattlerTarget].changedStatsBattlerId != BATTLE_PARTNER(gBattlerTarget) + && gSpecialStatuses[gBattlerTarget].changedStatsBattlerId != gBattlerTarget) + { + gBattlerAbility = gBattlerTarget; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_DefiantActivates; + if (GetBattlerAbility(gBattlerTarget) == ABILITY_DEFIANT) + SET_STATCHANGER(STAT_ATK, 2, FALSE); + else + SET_STATCHANGER(STAT_SPATK, 2, FALSE); + } + gActiveBattler = battler; BtlController_EmitPrintString(0, stringId); MarkBattlerForControllerExec(gActiveBattler); @@ -916,12 +1272,65 @@ void BattleScriptPop(void) gBattlescriptCurrInstr = gBattleResources->battleScriptsStack->ptr[--gBattleResources->battleScriptsStack->size]; } +static bool32 IsGravityPreventingMove(u32 move) +{ + if (!(gFieldStatuses & STATUS_FIELD_GRAVITY)) + return FALSE; + + switch (move) + { + case MOVE_BOUNCE: + case MOVE_FLY: + case MOVE_FLYING_PRESS: + case MOVE_HI_JUMP_KICK: + case MOVE_JUMP_KICK: + case MOVE_MAGNET_RISE: + case MOVE_SKY_DROP: + case MOVE_SPLASH: + case MOVE_TELEKINESIS: + return TRUE; + default: + return FALSE; + } +} + +static bool32 IsHealBlockPreventingMove(u32 battler, u32 move) +{ + if (!(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) + return FALSE; + + switch (gBattleMoves[move].effect) + { + case EFFECT_ABSORB: + case EFFECT_MORNING_SUN: + case EFFECT_MOONLIGHT: + case EFFECT_RESTORE_HP: + case EFFECT_REST: + case EFFECT_ROOST: + case EFFECT_HEALING_WISH: + case EFFECT_WISH: + case EFFECT_DREAM_EATER: + return TRUE; + default: + return FALSE; + } +} + +static bool32 IsBelchPreventingMove(u32 battler, u32 move) +{ + if (gBattleMoves[move].effect != EFFECT_BELCH) + return FALSE; + + return !(gBattleStruct->ateBerry[battler & BIT_SIDE] & gBitTable[gBattlerPartyIndexes[battler]]); +} + u8 TrySetCantSelectMoveBattleScript(void) { - u8 limitations = 0; - u16 move = gBattleMons[gActiveBattler].moves[gBattleBufferB[gActiveBattler][2]]; - u8 holdEffect; - u16* choicedMove = &gBattleStruct->choicedMove[gActiveBattler]; + u32 limitations = 0; + u8 moveId = gBattleResources->bufferB[gActiveBattler][2] & ~(RET_MEGA_EVOLUTION); + u32 move = gBattleMons[gActiveBattler].moves[moveId]; + u32 holdEffect = GetBattlerHoldEffect(gActiveBattler, TRUE); + u16 *choicedMove = &gBattleStruct->choicedMove[gActiveBattler]; if (gDisableStructs[gActiveBattler].disabledMove == move && move != MOVE_NONE) { @@ -935,7 +1344,7 @@ u8 TrySetCantSelectMoveBattleScript(void) else { gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingDisabledMove; - limitations = 1; + limitations++; } } @@ -969,6 +1378,21 @@ u8 TrySetCantSelectMoveBattleScript(void) } } + if (gDisableStructs[gActiveBattler].throatChopTimer != 0 && gBattleMoves[move].flags & FLAG_SOUND) + { + gCurrentMove = move; + if (gBattleTypeFlags & BATTLE_TYPE_PALACE) + { + gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveThroatChopInPalace; + gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1; + } + else + { + gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveThroatChop; + limitations++; + } + } + if (GetImprisonedMovesCount(gActiveBattler, move)) { gCurrentMove = move; @@ -984,14 +1408,53 @@ u8 TrySetCantSelectMoveBattleScript(void) } } - if (gBattleMons[gActiveBattler].item == ITEM_ENIGMA_BERRY) - holdEffect = gEnigmaBerries[gActiveBattler].holdEffect; - else - holdEffect = ItemId_GetHoldEffect(gBattleMons[gActiveBattler].item); + if (IsGravityPreventingMove(move)) + { + gCurrentMove = move; + if (gBattleTypeFlags & BATTLE_TYPE_PALACE) + { + gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveGravityInPalace; + gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1; + } + else + { + gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveGravity; + limitations++; + } + } + + if (IsHealBlockPreventingMove(gActiveBattler, move)) + { + gCurrentMove = move; + if (gBattleTypeFlags & BATTLE_TYPE_PALACE) + { + gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveHealBlockInPalace; + gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1; + } + else + { + gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveHealBlock; + limitations++; + } + } + + if (IsBelchPreventingMove(gActiveBattler, move)) + { + gCurrentMove = move; + if (gBattleTypeFlags & BATTLE_TYPE_PALACE) + { + gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedBelchInPalace; + gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1; + } + else + { + gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedBelch; + limitations++; + } + } gPotentialItemEffectBattler = gActiveBattler; - - if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != 0 && *choicedMove != 0xFFFF && *choicedMove != move) + if (HOLD_EFFECT_CHOICE(holdEffect) && *choicedMove != 0 && *choicedMove != 0xFFFF && *choicedMove != move) { gCurrentMove = *choicedMove; gLastUsedItem = gBattleMons[gActiveBattler].item; @@ -1005,8 +1468,22 @@ u8 TrySetCantSelectMoveBattleScript(void) limitations++; } } + else if (holdEffect == HOLD_EFFECT_ASSAULT_VEST && gBattleMoves[move].power == 0) + { + gCurrentMove = move; + gLastUsedItem = gBattleMons[gActiveBattler].item; + if (gBattleTypeFlags & BATTLE_TYPE_PALACE) + { + gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1; + } + else + { + gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveAssaultVest; + limitations++; + } + } - if (gBattleMons[gActiveBattler].pp[gBattleBufferB[gActiveBattler][2]] == 0) + if (gBattleMons[gActiveBattler].pp[moveId] == 0) { if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { @@ -1024,34 +1501,39 @@ u8 TrySetCantSelectMoveBattleScript(void) u8 CheckMoveLimitations(u8 battlerId, u8 unusableMoves, u8 check) { - u8 holdEffect; + u8 holdEffect = GetBattlerHoldEffect(battlerId, TRUE); u16 *choicedMove = &gBattleStruct->choicedMove[battlerId]; s32 i; - if (gBattleMons[battlerId].item == ITEM_ENIGMA_BERRY) - holdEffect = gEnigmaBerries[battlerId].holdEffect; - else - holdEffect = ItemId_GetHoldEffect(gBattleMons[battlerId].item); - gPotentialItemEffectBattler = battlerId; for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[battlerId].moves[i] == 0 && check & MOVE_LIMITATION_ZEROMOVE) unusableMoves |= gBitTable[i]; - if (gBattleMons[battlerId].pp[i] == 0 && check & MOVE_LIMITATION_PP) + else if (gBattleMons[battlerId].pp[i] == 0 && check & MOVE_LIMITATION_PP) unusableMoves |= gBitTable[i]; - if (gBattleMons[battlerId].moves[i] == gDisableStructs[battlerId].disabledMove && check & MOVE_LIMITATION_DISABLED) + else if (gBattleMons[battlerId].moves[i] == gDisableStructs[battlerId].disabledMove && check & MOVE_LIMITATION_DISABLED) unusableMoves |= gBitTable[i]; - if (gBattleMons[battlerId].moves[i] == gLastMoves[battlerId] && check & MOVE_LIMITATION_TORMENTED && gBattleMons[battlerId].status2 & STATUS2_TORMENT) + else if (gBattleMons[battlerId].moves[i] == gLastMoves[battlerId] && check & MOVE_LIMITATION_TORMENTED && gBattleMons[battlerId].status2 & STATUS2_TORMENT) unusableMoves |= gBitTable[i]; - if (gDisableStructs[battlerId].tauntTimer && check & MOVE_LIMITATION_TAUNT && gBattleMoves[gBattleMons[battlerId].moves[i]].power == 0) + else if (gDisableStructs[battlerId].tauntTimer && check & MOVE_LIMITATION_TAUNT && gBattleMoves[gBattleMons[battlerId].moves[i]].power == 0) unusableMoves |= gBitTable[i]; - if (GetImprisonedMovesCount(battlerId, gBattleMons[battlerId].moves[i]) && check & MOVE_LIMITATION_IMPRISON) + else if (GetImprisonedMovesCount(battlerId, gBattleMons[battlerId].moves[i]) && check & MOVE_LIMITATION_IMPRISON) unusableMoves |= gBitTable[i]; - if (gDisableStructs[battlerId].encoreTimer && gDisableStructs[battlerId].encoredMove != gBattleMons[battlerId].moves[i]) + else if (gDisableStructs[battlerId].encoreTimer && gDisableStructs[battlerId].encoredMove != gBattleMons[battlerId].moves[i]) unusableMoves |= gBitTable[i]; - if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != 0 && *choicedMove != 0xFFFF && *choicedMove != gBattleMons[battlerId].moves[i]) + else if (HOLD_EFFECT_CHOICE(holdEffect) && *choicedMove != 0 && *choicedMove != 0xFFFF && *choicedMove != gBattleMons[battlerId].moves[i]) + unusableMoves |= gBitTable[i]; + else if (holdEffect == HOLD_EFFECT_ASSAULT_VEST && gBattleMoves[gBattleMons[battlerId].moves[i]].power == 0) + unusableMoves |= gBitTable[i]; + else if (IsGravityPreventingMove(gBattleMons[battlerId].moves[i])) + unusableMoves |= gBitTable[i]; + else if (IsHealBlockPreventingMove(battlerId, gBattleMons[battlerId].moves[i])) + unusableMoves |= gBitTable[i]; + else if (IsBelchPreventingMove(battlerId, gBattleMons[battlerId].moves[i])) + unusableMoves |= gBitTable[i]; + else if (gDisableStructs[battlerId].throatChopTimer && gBattleMoves[gBattleMons[battlerId].moves[i]].flags & FLAG_SOUND) unusableMoves |= gBitTable[i]; } return unusableMoves; @@ -1101,23 +1583,37 @@ u8 GetImprisonedMovesCount(u8 battlerId, u16 move) enum { - ENDTURN_ORDER, - ENDTURN_REFLECT, - ENDTURN_LIGHT_SCREEN, - ENDTURN_MIST, - ENDTURN_SAFEGUARD, - ENDTURN_WISH, - ENDTURN_RAIN, - ENDTURN_SANDSTORM, - ENDTURN_SUN, - ENDTURN_HAIL, - ENDTURN_FIELD_COUNT, + ENDTURN_ORDER, + ENDTURN_REFLECT, + ENDTURN_LIGHT_SCREEN, + ENDTURN_AURORA_VEIL, + ENDTURN_MIST, + ENDTURN_LUCKY_CHANT, + ENDTURN_SAFEGUARD, + ENDTURN_TAILWIND, + ENDTURN_WISH, + ENDTURN_RAIN, + ENDTURN_SANDSTORM, + ENDTURN_SUN, + ENDTURN_HAIL, + ENDTURN_GRAVITY, + ENDTURN_WATER_SPORT, + ENDTURN_MUD_SPORT, + ENDTURN_TRICK_ROOM, + ENDTURN_WONDER_ROOM, + ENDTURN_MAGIC_ROOM, + ENDTURN_ELECTRIC_TERRAIN, + ENDTURN_MISTY_TERRAIN, + ENDTURN_GRASSY_TERRAIN, + ENDTURN_PSYCHIC_TERRAIN, + ENDTURN_ION_DELUGE, + ENDTURN_FAIRY_LOCK, + ENDTURN_FIELD_COUNT, }; u8 DoFieldEndTurnEffects(void) { u8 effect = 0; - s32 i; for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount && gAbsentBattlerFlags & gBitTable[gBattlerAttacker]; gBattlerAttacker++) { @@ -1128,6 +1624,7 @@ u8 DoFieldEndTurnEffects(void) do { + s32 i; u8 side; switch (gBattleStruct->turnCountersTracker) @@ -1147,12 +1644,8 @@ u8 DoFieldEndTurnEffects(void) } } - // It's stupid, but won't match without it - { - u8* var = &gBattleStruct->turnCountersTracker; - (*var)++; - gBattleStruct->turnSideTracker = 0; - } + gBattleStruct->turnCountersTracker++; + gBattleStruct->turnSideTracker = 0; // fall through case ENDTURN_REFLECT: while (gBattleStruct->turnSideTracker < 2) @@ -1205,6 +1698,32 @@ u8 DoFieldEndTurnEffects(void) gBattleStruct->turnSideTracker = 0; } break; + case ENDTURN_AURORA_VEIL: + while (gBattleStruct->turnSideTracker < 2) + { + side = gBattleStruct->turnSideTracker; + gActiveBattler = gBattlerAttacker = gSideTimers[side].auroraVeilBattlerId; + if (gSideStatuses[side] & SIDE_STATUS_AURORA_VEIL) + { + if (--gSideTimers[side].auroraVeilTimer == 0) + { + gSideStatuses[side] &= ~SIDE_STATUS_AURORA_VEIL; + BattleScriptExecute(BattleScript_SideStatusWoreOff); + gBattleCommunication[MULTISTRING_CHOOSER] = side; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_AURORA_VEIL); + effect++; + } + } + gBattleStruct->turnSideTracker++; + if (effect) + break; + } + if (!effect) + { + gBattleStruct->turnCountersTracker++; + gBattleStruct->turnSideTracker = 0; + } + break; case ENDTURN_MIST: while (gBattleStruct->turnSideTracker < 2) { @@ -1253,6 +1772,54 @@ u8 DoFieldEndTurnEffects(void) gBattleStruct->turnSideTracker = 0; } break; + case ENDTURN_LUCKY_CHANT: + while (gBattleStruct->turnSideTracker < 2) + { + side = gBattleStruct->turnSideTracker; + gActiveBattler = gBattlerAttacker = gSideTimers[side].luckyChantBattlerId; + if (gSideStatuses[side] & SIDE_STATUS_LUCKY_CHANT) + { + if (--gSideTimers[side].luckyChantTimer == 0) + { + gSideStatuses[side] &= ~SIDE_STATUS_LUCKY_CHANT; + BattleScriptExecute(BattleScript_LuckyChantEnds); + effect++; + } + } + gBattleStruct->turnSideTracker++; + if (effect) + break; + } + if (!effect) + { + gBattleStruct->turnCountersTracker++; + gBattleStruct->turnSideTracker = 0; + } + break; + case ENDTURN_TAILWIND: + while (gBattleStruct->turnSideTracker < 2) + { + side = gBattleStruct->turnSideTracker; + gActiveBattler = gBattlerAttacker = gSideTimers[side].tailwindBattlerId; + if (gSideStatuses[side] & SIDE_STATUS_TAILWIND) + { + if (--gSideTimers[side].tailwindTimer == 0) + { + gSideStatuses[side] &= ~SIDE_STATUS_TAILWIND; + BattleScriptExecute(BattleScript_TailwindEnds); + effect++; + } + } + gBattleStruct->turnSideTracker++; + if (effect) + break; + } + if (!effect) + { + gBattleStruct->turnCountersTracker++; + gBattleStruct->turnSideTracker = 0; + } + break; case ENDTURN_WISH: while (gBattleStruct->turnSideTracker < gBattlersCount) { @@ -1345,9 +1912,9 @@ u8 DoFieldEndTurnEffects(void) case ENDTURN_HAIL: if (gBattleWeather & WEATHER_HAIL_ANY) { - if (--gWishFutureKnock.weatherDuration == 0) + if (!(gBattleWeather & WEATHER_HAIL_PERMANENT) && --gWishFutureKnock.weatherDuration == 0) { - gBattleWeather &= ~WEATHER_HAIL; + gBattleWeather &= ~WEATHER_HAIL_TEMPORARY; gBattlescriptCurrInstr = BattleScript_SandStormHailEnds; } else @@ -1362,41 +1929,177 @@ u8 DoFieldEndTurnEffects(void) } gBattleStruct->turnCountersTracker++; break; + case ENDTURN_TRICK_ROOM: + if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && --gFieldTimers.trickRoomTimer == 0) + { + gFieldStatuses &= ~(STATUS_FIELD_TRICK_ROOM); + BattleScriptExecute(BattleScript_TrickRoomEnds); + effect++; + } + gBattleStruct->turnCountersTracker++; + break; + case ENDTURN_WONDER_ROOM: + if (gFieldStatuses & STATUS_FIELD_WONDER_ROOM && --gFieldTimers.wonderRoomTimer == 0) + { + gFieldStatuses &= ~(STATUS_FIELD_WONDER_ROOM); + BattleScriptExecute(BattleScript_WonderRoomEnds); + effect++; + } + gBattleStruct->turnCountersTracker++; + break; + case ENDTURN_MAGIC_ROOM: + if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM && --gFieldTimers.magicRoomTimer == 0) + { + gFieldStatuses &= ~(STATUS_FIELD_MAGIC_ROOM); + BattleScriptExecute(BattleScript_MagicRoomEnds); + effect++; + } + gBattleStruct->turnCountersTracker++; + break; + case ENDTURN_ELECTRIC_TERRAIN: + if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && --gFieldTimers.electricTerrainTimer == 0) + { + gFieldStatuses &= ~(STATUS_FIELD_ELECTRIC_TERRAIN); + BattleScriptExecute(BattleScript_ElectricTerrainEnds); + effect++; + } + gBattleStruct->turnCountersTracker++; + break; + case ENDTURN_MISTY_TERRAIN: + if (gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN && --gFieldTimers.mistyTerrainTimer == 0) + { + gFieldStatuses &= ~(STATUS_FIELD_MISTY_TERRAIN); + BattleScriptExecute(BattleScript_MistyTerrainEnds); + effect++; + } + gBattleStruct->turnCountersTracker++; + break; + case ENDTURN_GRASSY_TERRAIN: + if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN) + { + if (gFieldTimers.grassyTerrainTimer == 0 || --gFieldTimers.grassyTerrainTimer == 0) + gFieldStatuses &= ~(STATUS_FIELD_GRASSY_TERRAIN); + BattleScriptExecute(BattleScript_GrassyTerrainHeals); + effect++; + } + gBattleStruct->turnCountersTracker++; + break; + case ENDTURN_PSYCHIC_TERRAIN: + if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN && --gFieldTimers.psychicTerrainTimer == 0) + { + gFieldStatuses &= ~(STATUS_FIELD_PSYCHIC_TERRAIN); + BattleScriptExecute(BattleScript_PsychicTerrainEnds); + effect++; + } + gBattleStruct->turnCountersTracker++; + break; + case ENDTURN_WATER_SPORT: + if (gFieldStatuses & STATUS_FIELD_WATERSPORT && --gFieldTimers.waterSportTimer == 0) + { + gFieldStatuses &= ~(STATUS_FIELD_WATERSPORT); + BattleScriptExecute(BattleScript_WaterSportEnds); + effect++; + } + gBattleStruct->turnCountersTracker++; + break; + case ENDTURN_MUD_SPORT: + if (gFieldStatuses & STATUS_FIELD_MUDSPORT && --gFieldTimers.mudSportTimer == 0) + { + gFieldStatuses &= ~(STATUS_FIELD_MUDSPORT); + BattleScriptExecute(BattleScript_MudSportEnds); + effect++; + } + gBattleStruct->turnCountersTracker++; + break; + case ENDTURN_GRAVITY: + if (gFieldStatuses & STATUS_FIELD_GRAVITY && --gFieldTimers.gravityTimer == 0) + { + gFieldStatuses &= ~(STATUS_FIELD_GRAVITY); + BattleScriptExecute(BattleScript_GravityEnds); + effect++; + } + gBattleStruct->turnCountersTracker++; + break; + case ENDTURN_ION_DELUGE: + gFieldStatuses &= ~(STATUS_FIELD_ION_DELUGE); + gBattleStruct->turnCountersTracker++; + break; + case ENDTURN_FAIRY_LOCK: + if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK && --gFieldTimers.fairyLockTimer == 0) + { + gFieldStatuses &= ~(STATUS_FIELD_FAIRY_LOCK); + } + gBattleStruct->turnCountersTracker++; + break; case ENDTURN_FIELD_COUNT: effect++; break; } } while (effect == 0); + return (gBattleMainFunc != BattleTurnPassed); } enum { ENDTURN_INGRAIN, + ENDTURN_AQUA_RING, ENDTURN_ABILITIES, - ENDTURN_ITEMS1, - ENDTURN_LEECH_SEED, - ENDTURN_POISON, - ENDTURN_BAD_POISON, - ENDTURN_BURN, - ENDTURN_NIGHTMARES, - ENDTURN_CURSE, - ENDTURN_WRAP, - ENDTURN_UPROAR, - ENDTURN_THRASH, - ENDTURN_DISABLE, - ENDTURN_ENCORE, - ENDTURN_LOCK_ON, - ENDTURN_CHARGE, - ENDTURN_TAUNT, - ENDTURN_YAWN, - ENDTURN_ITEMS2, - ENDTURN_BATTLER_COUNT + ENDTURN_ITEMS1, + ENDTURN_LEECH_SEED, + ENDTURN_POISON, + ENDTURN_BAD_POISON, + ENDTURN_BURN, + ENDTURN_NIGHTMARES, + ENDTURN_CURSE, + ENDTURN_WRAP, + ENDTURN_UPROAR, + ENDTURN_THRASH, + ENDTURN_FLINCH, + ENDTURN_DISABLE, + ENDTURN_ENCORE, + ENDTURN_MAGNET_RISE, + ENDTURN_TELEKINESIS, + ENDTURN_HEALBLOCK, + ENDTURN_EMBARGO, + ENDTURN_LOCK_ON, + ENDTURN_CHARGE, + ENDTURN_LASER_FOCUS, + ENDTURN_TAUNT, + ENDTURN_YAWN, + ENDTURN_ITEMS2, + ENDTURN_ORBS, + ENDTURN_ROOST, + ENDTURN_ELECTRIFY, + ENDTURN_POWDER, + ENDTURN_THROAT_CHOP, + ENDTURN_SLOW_START, + ENDTURN_BATTLER_COUNT }; +// Ingrain, Leech Seed, Strength Sap and Aqua Ring +s32 GetDrainedBigRootHp(u32 battler, s32 hp) +{ + if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_BIG_ROOT) + hp = (hp * 1300) / 1000; + if (hp == 0) + hp = 1; + + return hp * -1; +} + +#define MAGIC_GAURD_CHECK \ +if (ability == ABILITY_MAGIC_GUARD) \ +{\ + RecordAbilityBattle(gActiveBattler, ability);\ + gBattleStruct->turnEffectsTracker++;\ + break;\ +} + + u8 DoBattlerEndTurnEffects(void) { - u8 effect = 0; + u32 ability, i, effect = 0; gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_x20); while (gBattleStruct->turnEffectsBattlerId < gBattlersCount && gBattleStruct->turnEffectsTracker <= ENDTURN_BATTLER_COUNT) @@ -1405,58 +2108,93 @@ u8 DoBattlerEndTurnEffects(void) if (gAbsentBattlerFlags & gBitTable[gActiveBattler]) { gBattleStruct->turnEffectsBattlerId++; + continue; } - else + + ability = GetBattlerAbility(gActiveBattler); + switch (gBattleStruct->turnEffectsTracker) { - switch (gBattleStruct->turnEffectsTracker) + case ENDTURN_INGRAIN: // ingrain + if ((gStatuses3[gActiveBattler] & STATUS3_ROOTED) + && !BATTLER_MAX_HP(gActiveBattler) + && !(gStatuses3[gActiveBattler] & STATUS3_HEAL_BLOCK) + && gBattleMons[gActiveBattler].hp != 0) { - case ENDTURN_INGRAIN: // ingrain - if ((gStatuses3[gActiveBattler] & STATUS3_ROOTED) - && gBattleMons[gActiveBattler].hp != gBattleMons[gActiveBattler].maxHP - && gBattleMons[gActiveBattler].hp != 0) + gBattleMoveDamage = GetDrainedBigRootHp(gActiveBattler, gBattleMons[gActiveBattler].maxHP / 16); + BattleScriptExecute(BattleScript_IngrainTurnHeal); + effect++; + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_AQUA_RING: // aqua ring + if ((gStatuses3[gActiveBattler] & STATUS3_AQUA_RING) + && !BATTLER_MAX_HP(gActiveBattler) + && !(gStatuses3[gActiveBattler] & STATUS3_HEAL_BLOCK) + && gBattleMons[gActiveBattler].hp != 0) + { + gBattleMoveDamage = GetDrainedBigRootHp(gActiveBattler, gBattleMons[gActiveBattler].maxHP / 16); + BattleScriptExecute(BattleScript_AquaRingHeal); + effect++; + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_ABILITIES: // end turn abilities + if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, gActiveBattler, 0, 0, 0)) + effect++; + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_ITEMS1: // item effects + if (ItemBattleEffects(1, gActiveBattler, FALSE)) + effect++; + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_ITEMS2: // item effects again + if (ItemBattleEffects(1, gActiveBattler, TRUE)) + effect++; + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_ORBS: + if (ItemBattleEffects(ITEMEFFECT_ORBS, gActiveBattler, FALSE)) + effect++; + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_LEECH_SEED: // leech seed + if ((gStatuses3[gActiveBattler] & STATUS3_LEECHSEED) + && gBattleMons[gStatuses3[gActiveBattler] & STATUS3_LEECHSEED_BATTLER].hp != 0 + && gBattleMons[gActiveBattler].hp != 0) + { + MAGIC_GAURD_CHECK; + + gBattlerTarget = gStatuses3[gActiveBattler] & STATUS3_LEECHSEED_BATTLER; // Notice gBattlerTarget is actually the HP receiver. + gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleScripting.animArg1 = gBattlerTarget; + gBattleScripting.animArg2 = gBattlerAttacker; + BattleScriptExecute(BattleScript_LeechSeedTurnDrain); + effect++; + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_POISON: // poison + if ((gBattleMons[gActiveBattler].status1 & STATUS1_POISON) + && gBattleMons[gActiveBattler].hp != 0) + { + MAGIC_GAURD_CHECK; + + if (ability == ABILITY_POISON_HEAL) { - gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - BattleScriptExecute(BattleScript_IngrainTurnHeal); - effect++; + if (!BATTLER_MAX_HP(gActiveBattler) && !(gStatuses3[gActiveBattler] & STATUS3_HEAL_BLOCK)) + { + gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage *= -1; + BattleScriptExecute(BattleScript_PoisonHealActivates); + effect++; + } } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_ABILITIES: // end turn abilities - if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, gActiveBattler, 0, 0, 0)) - effect++; - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_ITEMS1: // item effects - if (ItemBattleEffects(1, gActiveBattler, FALSE)) - effect++; - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_ITEMS2: // item effects again - if (ItemBattleEffects(1, gActiveBattler, TRUE)) - effect++; - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_LEECH_SEED: // leech seed - if ((gStatuses3[gActiveBattler] & STATUS3_LEECHSEED) - && gBattleMons[gStatuses3[gActiveBattler] & STATUS3_LEECHSEED_BATTLER].hp != 0 - && gBattleMons[gActiveBattler].hp != 0) - { - gBattlerTarget = gStatuses3[gActiveBattler] & STATUS3_LEECHSEED_BATTLER; // Notice gBattlerTarget is actually the HP receiver. - gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleScripting.animArg1 = gBattlerTarget; - gBattleScripting.animArg2 = gBattlerAttacker; - BattleScriptExecute(BattleScript_LeechSeedTurnDrain); - effect++; - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_POISON: // poison - if ((gBattleMons[gActiveBattler].status1 & STATUS1_POISON) && gBattleMons[gActiveBattler].hp != 0) + else { gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; if (gBattleMoveDamage == 0) @@ -1464,10 +2202,28 @@ u8 DoBattlerEndTurnEffects(void) BattleScriptExecute(BattleScript_PoisonTurnDmg); effect++; } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_BAD_POISON: // toxic poison - if ((gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_POISON) && gBattleMons[gActiveBattler].hp != 0) + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_BAD_POISON: // toxic poison + if ((gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_POISON) + && gBattleMons[gActiveBattler].hp != 0) + { + MAGIC_GAURD_CHECK; + + if (ability == ABILITY_POISON_HEAL) + { + if (!BATTLER_MAX_HP(gActiveBattler) && !(gStatuses3[gActiveBattler] & STATUS3_HEAL_BLOCK)) + { + gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage *= -1; + BattleScriptExecute(BattleScript_PoisonHealActivates); + effect++; + } + } + else { gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16; if (gBattleMoveDamage == 0) @@ -1478,238 +2234,348 @@ u8 DoBattlerEndTurnEffects(void) BattleScriptExecute(BattleScript_PoisonTurnDmg); effect++; } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_BURN: // burn - if ((gBattleMons[gActiveBattler].status1 & STATUS1_BURN) && gBattleMons[gActiveBattler].hp != 0) + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_BURN: // burn + if ((gBattleMons[gActiveBattler].status1 & STATUS1_BURN) + && gBattleMons[gActiveBattler].hp != 0) + { + MAGIC_GAURD_CHECK; + + gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8); + if (ability == ABILITY_HEATPROOF) { - gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - BattleScriptExecute(BattleScript_BurnTurnDmg); - effect++; + if (gBattleMoveDamage > (gBattleMoveDamage / 2) + 1) // Record ability if the burn takes less damage than it normally would. + RecordAbilityBattle(gActiveBattler, ABILITY_HEATPROOF); + gBattleMoveDamage /= 2; } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_NIGHTMARES: // spooky nightmares - if ((gBattleMons[gActiveBattler].status2 & STATUS2_NIGHTMARE) && gBattleMons[gActiveBattler].hp != 0) - { - // R/S does not perform this sleep check, which causes the nightmare effect to - // persist even after the affected Pokemon has been awakened by Shed Skin. - if (gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP) - { - gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - BattleScriptExecute(BattleScript_NightmareTurnDmg); - effect++; - } - else - { - gBattleMons[gActiveBattler].status2 &= ~STATUS2_NIGHTMARE; - } - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_CURSE: // curse - if ((gBattleMons[gActiveBattler].status2 & STATUS2_CURSED) && gBattleMons[gActiveBattler].hp != 0) + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + BattleScriptExecute(BattleScript_BurnTurnDmg); + effect++; + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_NIGHTMARES: // spooky nightmares + if ((gBattleMons[gActiveBattler].status2 & STATUS2_NIGHTMARE) + && gBattleMons[gActiveBattler].hp != 0) + { + MAGIC_GAURD_CHECK; + // R/S does not perform this sleep check, which causes the nightmare effect to + // persist even after the affected Pokemon has been awakened by Shed Skin. + if (gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP) { gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 4; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; - BattleScriptExecute(BattleScript_CurseTurnDmg); + BattleScriptExecute(BattleScript_NightmareTurnDmg); effect++; } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_WRAP: // wrap - if ((gBattleMons[gActiveBattler].status2 & STATUS2_WRAPPED) && gBattleMons[gActiveBattler].hp != 0) + else { - gBattleMons[gActiveBattler].status2 -= STATUS2_WRAPPED_TURN(1); - if (gBattleMons[gActiveBattler].status2 & STATUS2_WRAPPED) // damaged by wrap - { - // This is the only way I could get this array access to match. - gBattleScripting.animArg1 = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 0); - gBattleScripting.animArg2 = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 1); - gBattleTextBuff1[0] = B_BUFF_PLACEHOLDER_BEGIN; - gBattleTextBuff1[1] = B_BUFF_MOVE; - gBattleTextBuff1[2] = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 0); - gBattleTextBuff1[3] = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 1); - gBattleTextBuff1[4] = EOS; - gBattlescriptCurrInstr = BattleScript_WrapTurnDmg; - gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - } - else // broke free - { - gBattleTextBuff1[0] = B_BUFF_PLACEHOLDER_BEGIN; - gBattleTextBuff1[1] = B_BUFF_MOVE; - gBattleTextBuff1[2] = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 0); - gBattleTextBuff1[3] = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 1); - gBattleTextBuff1[4] = EOS; - gBattlescriptCurrInstr = BattleScript_WrapEnds; - } - BattleScriptExecute(gBattlescriptCurrInstr); - effect++; + gBattleMons[gActiveBattler].status2 &= ~STATUS2_NIGHTMARE; } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_UPROAR: // uproar - if (gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR) + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_CURSE: // curse + if ((gBattleMons[gActiveBattler].status2 & STATUS2_CURSED) + && gBattleMons[gActiveBattler].hp != 0) + { + MAGIC_GAURD_CHECK; + gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 4; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + BattleScriptExecute(BattleScript_CurseTurnDmg); + effect++; + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_WRAP: // wrap + if ((gBattleMons[gActiveBattler].status2 & STATUS2_WRAPPED) && gBattleMons[gActiveBattler].hp != 0) + { + if (--gDisableStructs[gActiveBattler].wrapTurns != 0) // damaged by wrap { - for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount; gBattlerAttacker++) + MAGIC_GAURD_CHECK; + + gBattleScripting.animArg1 = gBattleStruct->wrappedMove[gActiveBattler]; + gBattleScripting.animArg2 = gBattleStruct->wrappedMove[gActiveBattler] >> 8; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleStruct->wrappedMove[gActiveBattler]); + gBattlescriptCurrInstr = BattleScript_WrapTurnDmg; + if (GetBattlerHoldEffect(gBattleStruct->wrappedBy[gActiveBattler], TRUE) == HOLD_EFFECT_BINDING_BAND) + gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / (B_BINDING_DAMAGE >= GEN_6) ? 6 : 8; + else + gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / (B_BINDING_DAMAGE >= GEN_6) ? 8 : 16; + + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + } + else // broke free + { + gBattleMons[gActiveBattler].status2 &= ~(STATUS2_WRAPPED); + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleStruct->wrappedMove[gActiveBattler]); + gBattlescriptCurrInstr = BattleScript_WrapEnds; + } + BattleScriptExecute(gBattlescriptCurrInstr); + effect++; + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_UPROAR: // uproar + if (gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR) + { + for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount; gBattlerAttacker++) + { + if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) + && gBattleMons[gBattlerAttacker].ability != ABILITY_SOUNDPROOF) { - if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) - && gBattleMons[gBattlerAttacker].ability != ABILITY_SOUNDPROOF) - { - gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_SLEEP); - gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_NIGHTMARE); - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - BattleScriptExecute(BattleScript_MonWokeUpInUproar); - gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); - MarkBattlerForControllerExec(gActiveBattler); - break; - } - } - if (gBattlerAttacker != gBattlersCount) - { - effect = 2; // a pokemon was awaken + gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_SLEEP); + gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_NIGHTMARE); + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + BattleScriptExecute(BattleScript_MonWokeUpInUproar); + gActiveBattler = gBattlerAttacker; + BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + MarkBattlerForControllerExec(gActiveBattler); break; } + } + if (gBattlerAttacker != gBattlersCount) + { + effect = 2; // a pokemon was awaken + break; + } + else + { + gBattlerAttacker = gActiveBattler; + gBattleMons[gActiveBattler].status2 -= STATUS2_UPROAR_TURN(1); // uproar timer goes down + if (WasUnableToUseMove(gActiveBattler)) + { + CancelMultiTurnMoves(gActiveBattler); + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + } + else if (gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR) + { + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleMons[gActiveBattler].status2 |= STATUS2_MULTIPLETURNS; + } else { - gBattlerAttacker = gActiveBattler; - gBattleMons[gActiveBattler].status2 -= STATUS2_UPROAR_TURN(1); - if (WasUnableToUseMove(gActiveBattler)) - { - CancelMultiTurnMoves(gActiveBattler); - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - } - else if (gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR) - { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gBattleMons[gActiveBattler].status2 |= STATUS2_MULTIPLETURNS; - } - else - { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - CancelMultiTurnMoves(gActiveBattler); - } - BattleScriptExecute(BattleScript_PrintUproarOverTurns); - effect = 1; - } - } - if (effect != 2) - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_THRASH: // thrash - if (gBattleMons[gActiveBattler].status2 & STATUS2_LOCK_CONFUSE) - { - gBattleMons[gActiveBattler].status2 -= STATUS2_LOCK_CONFUSE_TURN(1); - if (WasUnableToUseMove(gActiveBattler)) + gBattleCommunication[MULTISTRING_CHOOSER] = 1; CancelMultiTurnMoves(gActiveBattler); - else if (!(gBattleMons[gActiveBattler].status2 & STATUS2_LOCK_CONFUSE) - && (gBattleMons[gActiveBattler].status2 & STATUS2_MULTIPLETURNS)) - { - gBattleMons[gActiveBattler].status2 &= ~(STATUS2_MULTIPLETURNS); - if (!(gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION)) - { - gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER; - SetMoveEffect(TRUE, 0); - if (gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION) - BattleScriptExecute(BattleScript_ThrashConfuses); - effect++; - } } + BattleScriptExecute(BattleScript_PrintUproarOverTurns); + effect = 1; } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_DISABLE: // disable - if (gDisableStructs[gActiveBattler].disableTimer != 0) - { - s32 i; - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gDisableStructs[gActiveBattler].disabledMove == gBattleMons[gActiveBattler].moves[i]) - break; - } - if (i == MAX_MON_MOVES) // pokemon does not have the disabled move anymore - { - gDisableStructs[gActiveBattler].disabledMove = 0; - gDisableStructs[gActiveBattler].disableTimer = 0; - } - else if (--gDisableStructs[gActiveBattler].disableTimer == 0) // disable ends - { - gDisableStructs[gActiveBattler].disabledMove = 0; - BattleScriptExecute(BattleScript_DisabledNoMore); - effect++; - } - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_ENCORE: // encore - if (gDisableStructs[gActiveBattler].encoreTimer != 0) - { - if (gBattleMons[gActiveBattler].moves[gDisableStructs[gActiveBattler].encoredMovePos] != gDisableStructs[gActiveBattler].encoredMove) // pokemon does not have the encored move anymore - { - gDisableStructs[gActiveBattler].encoredMove = 0; - gDisableStructs[gActiveBattler].encoreTimer = 0; - } - else if (--gDisableStructs[gActiveBattler].encoreTimer == 0 - || gBattleMons[gActiveBattler].pp[gDisableStructs[gActiveBattler].encoredMovePos] == 0) - { - gDisableStructs[gActiveBattler].encoredMove = 0; - gDisableStructs[gActiveBattler].encoreTimer = 0; - BattleScriptExecute(BattleScript_EncoredNoMore); - effect++; - } - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_LOCK_ON: // lock-on decrement - if (gStatuses3[gActiveBattler] & STATUS3_ALWAYS_HITS) - gStatuses3[gActiveBattler] -= STATUS3_ALWAYS_HITS_TURN(1); - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_CHARGE: // charge - if (gDisableStructs[gActiveBattler].chargeTimer && --gDisableStructs[gActiveBattler].chargeTimer == 0) - gStatuses3[gActiveBattler] &= ~STATUS3_CHARGED_UP; - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_TAUNT: // taunt - if (gDisableStructs[gActiveBattler].tauntTimer) - gDisableStructs[gActiveBattler].tauntTimer--; - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_YAWN: // yawn - if (gStatuses3[gActiveBattler] & STATUS3_YAWN) - { - gStatuses3[gActiveBattler] -= STATUS3_YAWN_TURN(1); - if (!(gStatuses3[gActiveBattler] & STATUS3_YAWN) && !(gBattleMons[gActiveBattler].status1 & STATUS1_ANY) - && gBattleMons[gActiveBattler].ability != ABILITY_VITAL_SPIRIT - && gBattleMons[gActiveBattler].ability != ABILITY_INSOMNIA && !UproarWakeUpCheck(gActiveBattler)) - { - CancelMultiTurnMoves(gActiveBattler); - gBattleMons[gActiveBattler].status1 |= STATUS1_SLEEP_TURN((Random() & 3) + 2); // 2-5 turns of sleep - BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); - MarkBattlerForControllerExec(gActiveBattler); - gEffectBattler = gActiveBattler; - BattleScriptExecute(BattleScript_YawnMakesAsleep); - effect++; - } - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_BATTLER_COUNT: // done - gBattleStruct->turnEffectsTracker = 0; - gBattleStruct->turnEffectsBattlerId++; - break; } - if (effect != 0) - return effect; + if (effect != 2) + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_THRASH: // thrash + if (gBattleMons[gActiveBattler].status2 & STATUS2_LOCK_CONFUSE) + { + gBattleMons[gActiveBattler].status2 -= STATUS2_LOCK_CONFUSE_TURN(1); + if (WasUnableToUseMove(gActiveBattler)) + CancelMultiTurnMoves(gActiveBattler); + else if (!(gBattleMons[gActiveBattler].status2 & STATUS2_LOCK_CONFUSE) + && (gBattleMons[gActiveBattler].status2 & STATUS2_MULTIPLETURNS)) + { + gBattleMons[gActiveBattler].status2 &= ~(STATUS2_MULTIPLETURNS); + if (!(gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION)) + { + gBattleScripting.moveEffect = MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER; + SetMoveEffect(TRUE, 0); + if (gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION) + BattleScriptExecute(BattleScript_ThrashConfuses); + effect++; + } + } + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_FLINCH: // reset flinch + gBattleMons[gActiveBattler].status2 &= ~(STATUS2_FLINCHED); + gBattleStruct->turnEffectsTracker++; + case ENDTURN_DISABLE: // disable + if (gDisableStructs[gActiveBattler].disableTimer != 0) + { + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (gDisableStructs[gActiveBattler].disabledMove == gBattleMons[gActiveBattler].moves[i]) + break; + } + if (i == MAX_MON_MOVES) // pokemon does not have the disabled move anymore + { + gDisableStructs[gActiveBattler].disabledMove = 0; + gDisableStructs[gActiveBattler].disableTimer = 0; + } + else if (--gDisableStructs[gActiveBattler].disableTimer == 0) // disable ends + { + gDisableStructs[gActiveBattler].disabledMove = 0; + BattleScriptExecute(BattleScript_DisabledNoMore); + effect++; + } + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_ENCORE: // encore + if (gDisableStructs[gActiveBattler].encoreTimer != 0) + { + if (gBattleMons[gActiveBattler].moves[gDisableStructs[gActiveBattler].encoredMovePos] != gDisableStructs[gActiveBattler].encoredMove) // pokemon does not have the encored move anymore + { + gDisableStructs[gActiveBattler].encoredMove = 0; + gDisableStructs[gActiveBattler].encoreTimer = 0; + } + else if (--gDisableStructs[gActiveBattler].encoreTimer == 0 + || gBattleMons[gActiveBattler].pp[gDisableStructs[gActiveBattler].encoredMovePos] == 0) + { + gDisableStructs[gActiveBattler].encoredMove = 0; + gDisableStructs[gActiveBattler].encoreTimer = 0; + BattleScriptExecute(BattleScript_EncoredNoMore); + effect++; + } + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_LOCK_ON: // lock-on decrement + if (gStatuses3[gActiveBattler] & STATUS3_ALWAYS_HITS) + gStatuses3[gActiveBattler] -= STATUS3_ALWAYS_HITS_TURN(1); + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_CHARGE: // charge + if (gDisableStructs[gActiveBattler].chargeTimer && --gDisableStructs[gActiveBattler].chargeTimer == 0) + gStatuses3[gActiveBattler] &= ~STATUS3_CHARGED_UP; + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_TAUNT: // taunt + if (gDisableStructs[gActiveBattler].tauntTimer && --gDisableStructs[gActiveBattler].tauntTimer == 0) + { + BattleScriptExecute(BattleScript_BufferEndTurn); + PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_TAUNT); + effect++; + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_YAWN: // yawn + if (gStatuses3[gActiveBattler] & STATUS3_YAWN) + { + gStatuses3[gActiveBattler] -= STATUS3_YAWN_TURN(1); + if (!(gStatuses3[gActiveBattler] & STATUS3_YAWN) && !(gBattleMons[gActiveBattler].status1 & STATUS1_ANY) + && gBattleMons[gActiveBattler].ability != ABILITY_VITAL_SPIRIT + && gBattleMons[gActiveBattler].ability != ABILITY_INSOMNIA && !UproarWakeUpCheck(gActiveBattler) + && !IsLeafGuardProtected(gActiveBattler)) + { + CancelMultiTurnMoves(gActiveBattler); + gBattleMons[gActiveBattler].status1 |= (Random() & 3) + 2; + BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + MarkBattlerForControllerExec(gActiveBattler); + gEffectBattler = gActiveBattler; + BattleScriptExecute(BattleScript_YawnMakesAsleep); + effect++; + } + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_LASER_FOCUS: + if (gStatuses3[gActiveBattler] & STATUS3_LASER_FOCUS) + { + if (gDisableStructs[gActiveBattler].laserFocusTimer == 0 || --gDisableStructs[gActiveBattler].laserFocusTimer == 0) + gStatuses3[gActiveBattler] &= ~(STATUS3_LASER_FOCUS); + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_EMBARGO: + if (gStatuses3[gActiveBattler] & STATUS3_EMBARGO) + { + if (gDisableStructs[gActiveBattler].embargoTimer == 0 || --gDisableStructs[gActiveBattler].embargoTimer == 0) + { + gStatuses3[gActiveBattler] &= ~(STATUS3_EMBARGO); + BattleScriptExecute(BattleScript_EmbargoEndTurn); + effect++; + } + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_MAGNET_RISE: + if (gStatuses3[gActiveBattler] & STATUS3_MAGNET_RISE) + { + if (gDisableStructs[gActiveBattler].magnetRiseTimer == 0 || --gDisableStructs[gActiveBattler].magnetRiseTimer == 0) + { + gStatuses3[gActiveBattler] &= ~(STATUS3_MAGNET_RISE); + BattleScriptExecute(BattleScript_BufferEndTurn); + PREPARE_STRING_BUFFER(gBattleTextBuff1, STRINGID_ELECTROMAGNETISM); + effect++; + } + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_TELEKINESIS: + if (gStatuses3[gActiveBattler] & STATUS3_TELEKINESIS) + { + if (gDisableStructs[gActiveBattler].telekinesisTimer == 0 || --gDisableStructs[gActiveBattler].telekinesisTimer == 0) + { + gStatuses3[gActiveBattler] &= ~(STATUS3_TELEKINESIS); + BattleScriptExecute(BattleScript_TelekinesisEndTurn); + effect++; + } + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_HEALBLOCK: + if (gStatuses3[gActiveBattler] & STATUS3_HEAL_BLOCK) + { + if (gDisableStructs[gActiveBattler].healBlockTimer == 0 || --gDisableStructs[gActiveBattler].healBlockTimer == 0) + { + gStatuses3[gActiveBattler] &= ~(STATUS3_HEAL_BLOCK); + BattleScriptExecute(BattleScript_BufferEndTurn); + PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_HEAL_BLOCK); + effect++; + } + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_ROOST: // Return flying type. + if (gBattleResources->flags->flags[gActiveBattler] & RESOURCE_FLAG_ROOST) + { + gBattleResources->flags->flags[gActiveBattler] &= ~(RESOURCE_FLAG_ROOST); + gBattleMons[gActiveBattler].type1 = gBattleStruct->roostTypes[gActiveBattler][0]; + gBattleMons[gActiveBattler].type2 = gBattleStruct->roostTypes[gActiveBattler][1]; + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_ELECTRIFY: + gStatuses3[gActiveBattler] &= ~(STATUS3_ELECTRIFIED); + gBattleStruct->turnEffectsTracker++; + case ENDTURN_POWDER: + gBattleMons[gActiveBattler].status2 &= ~(STATUS2_POWDER); + gBattleStruct->turnEffectsTracker++; + case ENDTURN_THROAT_CHOP: + if (gDisableStructs[gActiveBattler].throatChopTimer && --gDisableStructs[gActiveBattler].throatChopTimer == 0) + { + BattleScriptExecute(BattleScript_ThroatChopEndTurn); + effect++; + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_SLOW_START: + if (gDisableStructs[gActiveBattler].slowStartTimer + && --gDisableStructs[gActiveBattler].slowStartTimer == 0 + && ability == ABILITY_SLOW_START) + { + BattleScriptExecute(BattleScript_SlowStartEnds); + effect++; + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_BATTLER_COUNT: // done + gBattleStruct->turnEffectsTracker = 0; + gBattleStruct->turnEffectsBattlerId++; + break; } + + if (effect != 0) + return effect; + } gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_x20); return 0; @@ -1745,8 +2611,9 @@ bool8 HandleWishPerishSongOnTurnEnd(void) gBattlerTarget = gActiveBattler; gBattlerAttacker = gWishFutureKnock.futureSightAttacker[gActiveBattler]; - gBattleMoveDamage = gWishFutureKnock.futureSightDmg[gActiveBattler]; gSpecialStatuses[gBattlerTarget].dmg = 0xFFFF; + gCurrentMove = gWishFutureKnock.futureSightMove[gActiveBattler]; + SetTypeBeforeUsingMove(gCurrentMove, gActiveBattler); BattleScriptExecute(BattleScript_MonTookFutureAttack); if (gWishFutureKnock.futureSightCounter[gActiveBattler] == 0 @@ -1757,12 +2624,8 @@ bool8 HandleWishPerishSongOnTurnEnd(void) return TRUE; } } - // Why do I have to keep doing this to match? - { - u8 *state = &gBattleStruct->wishPerishSongState; - *state = 1; - gBattleStruct->wishPerishSongBattlerId = 0; - } + gBattleStruct->wishPerishSongState = 1; + gBattleStruct->wishPerishSongBattlerId = 0; // fall through case 1: while (gBattleStruct->wishPerishSongBattlerId < gBattlersCount) @@ -1863,8 +2726,24 @@ bool8 HandleFaintedMonActions(void) gBattleStruct->faintedActionsState = 3; else gBattleStruct->faintedActionsState = 1; + + // Don't switch mons until all pokemon performed their actions or the battle's over. + if (gBattleOutcome == 0 + && !NoAliveMonsForEitherParty() + && gCurrentTurnActionNumber != gBattlersCount) + { + gAbsentBattlerFlags |= gBitTable[gBattlerFainted]; + return FALSE; + } break; case 3: + // Don't switch mons until all pokemon performed their actions or the battle's over. + if (gBattleOutcome == 0 + && !NoAliveMonsForEitherParty() + && gCurrentTurnActionNumber != gBattlersCount) + { + return FALSE; + } gBattleStruct->faintedActionsBattlerId = 0; gBattleStruct->faintedActionsState++; // fall through @@ -1889,7 +2768,7 @@ bool8 HandleFaintedMonActions(void) gBattleStruct->faintedActionsState = 4; break; case 6: - if (AbilityBattleEffects(ABILITYEFFECT_INTIMIDATE1, 0, 0, 0, 0) || AbilityBattleEffects(ABILITYEFFECT_TRACE, 0, 0, 0, 0) || ItemBattleEffects(1, 0, TRUE) || AbilityBattleEffects(ABILITYEFFECT_FORECAST, 0, 0, 0, 0)) + if (ItemBattleEffects(1, 0, TRUE)) return TRUE; gBattleStruct->faintedActionsState++; break; @@ -1900,13 +2779,15 @@ bool8 HandleFaintedMonActions(void) return FALSE; } -void TryClearRageStatuses(void) +void TryClearRageAndFuryCutter(void) { s32 i; for (i = 0; i < gBattlersCount; i++) { if ((gBattleMons[i].status2 & STATUS2_RAGE) && gChosenMoveByBattler[i] != MOVE_RAGE) gBattleMons[i].status2 &= ~(STATUS2_RAGE); + if (gDisableStructs[i].furyCutterCounter != 0 && gChosenMoveByBattler[i] != MOVE_FURY_CUTTER) + gDisableStructs[i].furyCutterCounter = 0; } } @@ -1919,6 +2800,8 @@ enum CANCELLER_RECHARGE, CANCELLER_FLINCH, CANCELLER_DISABLED, + CANCELLER_GRAVITY, + CANCELLER_HEAL_BLOCKED, CANCELLER_TAUNTED, CANCELLER_IMPRISONED, CANCELLER_CONFUSED, @@ -1926,7 +2809,12 @@ enum CANCELLER_IN_LOVE, CANCELLER_BIDE, CANCELLER_THAW, + CANCELLER_POWDER_MOVE, + CANCELLER_POWDER_STATUS, + CANCELLER_THROAT_CHOP, CANCELLER_END, + CANCELLER_PSYCHIC_TERRAIN, + CANCELLER_END2, }; u8 AtkCanceller_UnableToUseMove(void) @@ -2019,7 +2907,8 @@ u8 AtkCanceller_UnableToUseMove(void) CancelMultiTurnMoves(gBattlerAttacker); gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; + gBattlerAbility = gBattlerAttacker; + gBattlescriptCurrInstr = BattleScript_TruantLoafingAround; gMoveResultFlags |= MOVE_RESULT_MISSED; effect = 1; } @@ -2040,7 +2929,6 @@ u8 AtkCanceller_UnableToUseMove(void) case CANCELLER_FLINCH: // flinch if (gBattleMons[gBattlerAttacker].status2 & STATUS2_FLINCHED) { - gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_FLINCHED); gProtectStructs[gBattlerAttacker].flinchImmobility = 1; CancelMultiTurnMoves(gBattlerAttacker); gBattlescriptCurrInstr = BattleScript_MoveUsedFlinched; @@ -2061,6 +2949,30 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; + case CANCELLER_HEAL_BLOCKED: + if (gStatuses3[gBattlerAttacker] & STATUS3_HEAL_BLOCK && IsHealBlockPreventingMove(gBattlerAttacker, gCurrentMove)) + { + gProtectStructs[gBattlerAttacker].usedHealBlockedMove = 1; + gBattleScripting.battler = gBattlerAttacker; + CancelMultiTurnMoves(gBattlerAttacker); + gBattlescriptCurrInstr = BattleScript_MoveUsedHealBlockPrevents; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + effect = 1; + } + gBattleStruct->atkCancellerTracker++; + break; + case CANCELLER_GRAVITY: + if (gFieldStatuses & STATUS_FIELD_GRAVITY && IsGravityPreventingMove(gCurrentMove)) + { + gProtectStructs[gBattlerAttacker].usedGravityPreventedMove = 1; + gBattleScripting.battler = gBattlerAttacker; + CancelMultiTurnMoves(gBattlerAttacker); + gBattlescriptCurrInstr = BattleScript_MoveUsedGravityPrevents; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + effect = 1; + } + gBattleStruct->atkCancellerTracker++; + break; case CANCELLER_TAUNTED: // taunt if (gDisableStructs[gBattlerAttacker].tauntTimer && gBattleMoves[gCurrentMove].power == 0) { @@ -2089,19 +3001,19 @@ u8 AtkCanceller_UnableToUseMove(void) gBattleMons[gBattlerAttacker].status2 -= STATUS2_CONFUSION_TURN(1); if (gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION) { - if (Random() & 1) - { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - BattleScriptPushCursor(); - } - else // confusion dmg + if (Random() % ((B_CONFUSION_SELF_DMG_CHANCE >= GEN_7) ? 3 : 2) == 0) // confusion dmg { gBattleCommunication[MULTISTRING_CHOOSER] = 1; gBattlerTarget = gBattlerAttacker; - gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerAttacker], MOVE_POUND, 0, 40, 0, gBattlerAttacker, gBattlerAttacker); + gBattleMoveDamage = CalculateMoveDamage(MOVE_NONE, gBattlerAttacker, gBattlerAttacker, TYPE_MYSTERY, 40, FALSE, FALSE, TRUE); gProtectStructs[gBattlerAttacker].confusionSelfDmg = 1; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; } + else + { + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + BattleScriptPushCursor(); + } gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfused; } else // snapped out of confusion @@ -2178,7 +3090,8 @@ u8 AtkCanceller_UnableToUseMove(void) case CANCELLER_THAW: // move thawing if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE) { - if (gBattleMoves[gCurrentMove].effect == EFFECT_THAW_HIT) + if (gBattleMoves[gCurrentMove].effect == EFFECT_THAW_HIT + || (gBattleMoves[gCurrentMove].effect == EFFECT_BURN_UP && IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_FIRE))) { gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_FREEZE); BattleScriptPushCursor(); @@ -2189,11 +3102,57 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; + case CANCELLER_POWDER_MOVE: + if (gBattleMoves[gCurrentMove].flags & FLAG_POWDER) + { + if ((B_POWDER_GRASS >= GEN_6 && IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_GRASS)) + || GetBattlerAbility(gBattlerTarget) == ABILITY_OVERCOAT) + { + gBattlerAbility = gBattlerTarget; + effect = 1; + } + else if (GetBattlerHoldEffect(gBattlerTarget, TRUE) == HOLD_EFFECT_SAFETY_GOOGLES) + { + RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_SAFETY_GOOGLES); + effect = 1; + } + + if (effect) + gBattlescriptCurrInstr = BattleScript_PowderMoveNoEffect; + } + gBattleStruct->atkCancellerTracker++; + break; + case CANCELLER_POWDER_STATUS: + if (gBattleMons[gBattlerAttacker].status2 & STATUS2_POWDER) + { + u32 moveType; + GET_MOVE_TYPE(gCurrentMove, moveType); + if (moveType == TYPE_FIRE) + { + gProtectStructs[gBattlerAttacker].powderSelfDmg = 1; + gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 4; + gBattlescriptCurrInstr = BattleScript_MoveUsedPowder; + effect = 1; + } + } + gBattleStruct->atkCancellerTracker++; + break; + case CANCELLER_THROAT_CHOP: + if (gDisableStructs[gBattlerAttacker].throatChopTimer && gBattleMoves[gCurrentMove].flags & FLAG_SOUND) + { + gProtectStructs[gBattlerAttacker].usedThroatChopPreventedMove = 1; + CancelMultiTurnMoves(gBattlerAttacker); + gBattlescriptCurrInstr = BattleScript_MoveUsedIsThroatChopPrevented; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + effect = 1; + } + gBattleStruct->atkCancellerTracker++; + break; case CANCELLER_END: break; } - } while (gBattleStruct->atkCancellerTracker != CANCELLER_END && effect == 0); + } while (gBattleStruct->atkCancellerTracker != CANCELLER_END && gBattleStruct->atkCancellerTracker != CANCELLER_END2 && effect == 0); if (effect == 2) { @@ -2204,6 +3163,39 @@ u8 AtkCanceller_UnableToUseMove(void) return effect; } +// After Protean Activation. +u8 AtkCanceller_UnableToUseMove2(void) +{ + u8 effect = 0; + + do + { + switch (gBattleStruct->atkCancellerTracker) + { + case CANCELLER_END: + gBattleStruct->atkCancellerTracker++; + case CANCELLER_PSYCHIC_TERRAIN: + if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN + && IsBattlerGrounded(gBattlerTarget) + && GetChosenMovePriority(gBattlerAttacker) > 0 + && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget)) + { + CancelMultiTurnMoves(gBattlerAttacker); + gBattlescriptCurrInstr = BattleScript_MoveUsedPsychicTerrainPrevents; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + effect = 1; + } + gBattleStruct->atkCancellerTracker++; + break; + case CANCELLER_END2: + break; + } + + } while (gBattleStruct->atkCancellerTracker != CANCELLER_END2 && effect == 0); + + return effect; +} + bool8 HasNoMonsToSwitch(u8 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2) { struct Pokemon *party; @@ -2213,7 +3205,29 @@ bool8 HasNoMonsToSwitch(u8 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2) if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) return FALSE; - if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) + if (BATTLE_TWO_VS_ONE_OPPONENT && GetBattlerSide(battler) == B_SIDE_OPPONENT) + { + id2 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + id1 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); + party = gEnemyParty; + + if (partyIdBattlerOn1 == PARTY_SIZE) + partyIdBattlerOn1 = gBattlerPartyIndexes[id2]; + if (partyIdBattlerOn2 == PARTY_SIZE) + partyIdBattlerOn2 = gBattlerPartyIndexes[id1]; + + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&party[i], MON_DATA_HP) != 0 + && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE + && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG + && i != partyIdBattlerOn1 && i != partyIdBattlerOn2 + && i != *(gBattleStruct->monToSwitchIntoId + id2) && i != id1[gBattleStruct->monToSwitchIntoId]) + break; + } + return (i == PARTY_SIZE); + } + else if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) { if (GetBattlerSide(battler) == B_SIDE_PLAYER) party = gPlayerParty; @@ -2321,820 +3335,1535 @@ bool8 HasNoMonsToSwitch(u8 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2) } } -enum +u8 TryWeatherFormChange(u8 battler) { - CASTFORM_NO_CHANGE, //0 - CASTFORM_TO_NORMAL, //1 - CASTFORM_TO_FIRE, //2 - CASTFORM_TO_WATER, //3 - CASTFORM_TO_ICE, //4 + u8 ret = 0; + bool32 weatherEffect = WEATHER_HAS_EFFECT; + + if (gBattleMons[battler].species == SPECIES_CASTFORM) + { + if (gBattleMons[battler].ability != ABILITY_FORECAST || gBattleMons[battler].hp == 0) + { + ret = 0; + } + else if (!weatherEffect && !IS_BATTLER_OF_TYPE(battler, TYPE_NORMAL)) + { + SET_BATTLER_TYPE(battler, TYPE_NORMAL); + ret = 1; + } + else if (!weatherEffect) + { + ret = 0; + } + else if (!(gBattleWeather & (WEATHER_RAIN_ANY | WEATHER_SUN_ANY | WEATHER_HAIL_ANY)) && !IS_BATTLER_OF_TYPE(battler, TYPE_NORMAL)) + { + SET_BATTLER_TYPE(battler, TYPE_NORMAL); + ret = 1; + } + else if (gBattleWeather & WEATHER_SUN_ANY && !IS_BATTLER_OF_TYPE(battler, TYPE_FIRE)) + { + SET_BATTLER_TYPE(battler, TYPE_FIRE); + ret = 2; + } + else if (gBattleWeather & WEATHER_RAIN_ANY && !IS_BATTLER_OF_TYPE(battler, TYPE_WATER)) + { + SET_BATTLER_TYPE(battler, TYPE_WATER); + ret = 3; + } + else if (gBattleWeather & WEATHER_HAIL_ANY && !IS_BATTLER_OF_TYPE(battler, TYPE_ICE)) + { + SET_BATTLER_TYPE(battler, TYPE_ICE); + ret = 4; + } + } + else if (gBattleMons[battler].species == SPECIES_CHERRIM) + { + if (gBattleMons[battler].ability != ABILITY_FLOWER_GIFT || gBattleMons[battler].hp == 0) + ret = 0; + else if (gBattleMonForms[battler] == 0 && weatherEffect && gBattleWeather & WEATHER_SUN_ANY) + ret = 2; + else if (gBattleMonForms[battler] != 0 && (!weatherEffect || !(gBattleWeather & WEATHER_SUN_ANY))) + ret = 1; + } + + return ret; +} +static const u16 sWeatherFlagsInfo[][3] = +{ + [ENUM_WEATHER_RAIN] = {WEATHER_RAIN_TEMPORARY, WEATHER_RAIN_PERMANENT, HOLD_EFFECT_DAMP_ROCK}, + [ENUM_WEATHER_SUN] = {WEATHER_SUN_TEMPORARY, WEATHER_SUN_PERMANENT, HOLD_EFFECT_HEAT_ROCK}, + [ENUM_WEATHER_SANDSTORM] = {WEATHER_SANDSTORM_TEMPORARY, WEATHER_SANDSTORM_PERMANENT, HOLD_EFFECT_SMOOTH_ROCK}, + [ENUM_WEATHER_HAIL] = {WEATHER_HAIL_TEMPORARY, WEATHER_HAIL_PERMANENT, HOLD_EFFECT_ICY_ROCK}, }; -u8 CastformDataTypeChange(u8 battler) +bool32 TryChangeBattleWeather(u8 battler, u32 weatherEnumId, bool32 viaAbility) { - u8 formChange = 0; - if (gBattleMons[battler].species != SPECIES_CASTFORM || gBattleMons[battler].ability != ABILITY_FORECAST || gBattleMons[battler].hp == 0) - return CASTFORM_NO_CHANGE; - if (!WEATHER_HAS_EFFECT && !IS_BATTLER_OF_TYPE(battler, TYPE_NORMAL)) + if (viaAbility && B_ABILITY_WEATHER <= GEN_5 + && !(gBattleWeather & sWeatherFlagsInfo[weatherEnumId][1])) { - SET_BATTLER_TYPE(battler, TYPE_NORMAL); - return CASTFORM_TO_NORMAL; + gBattleWeather = (sWeatherFlagsInfo[weatherEnumId][0] | sWeatherFlagsInfo[weatherEnumId][1]); + return TRUE; } - if (!WEATHER_HAS_EFFECT) - return CASTFORM_NO_CHANGE; - if (!(gBattleWeather & (WEATHER_RAIN_ANY | WEATHER_SUN_ANY | WEATHER_HAIL_ANY)) && !IS_BATTLER_OF_TYPE(battler, TYPE_NORMAL)) + else if (!(gBattleWeather & (sWeatherFlagsInfo[weatherEnumId][0] | sWeatherFlagsInfo[weatherEnumId][1]))) { - SET_BATTLER_TYPE(battler, TYPE_NORMAL); - formChange = CASTFORM_TO_NORMAL; + gBattleWeather = (sWeatherFlagsInfo[weatherEnumId][0]); + if (GetBattlerHoldEffect(battler, TRUE) == sWeatherFlagsInfo[weatherEnumId][2]) + gWishFutureKnock.weatherDuration = 8; + else + gWishFutureKnock.weatherDuration = 5; + + return TRUE; } - if (gBattleWeather & WEATHER_SUN_ANY && !IS_BATTLER_OF_TYPE(battler, TYPE_FIRE)) - { - SET_BATTLER_TYPE(battler, TYPE_FIRE); - formChange = CASTFORM_TO_FIRE; - } - if (gBattleWeather & WEATHER_RAIN_ANY && !IS_BATTLER_OF_TYPE(battler, TYPE_WATER)) - { - SET_BATTLER_TYPE(battler, TYPE_WATER); - formChange = CASTFORM_TO_WATER; - } - if (gBattleWeather & WEATHER_HAIL_ANY && !IS_BATTLER_OF_TYPE(battler, TYPE_ICE)) - { - SET_BATTLER_TYPE(battler, TYPE_ICE); - formChange = CASTFORM_TO_ICE; - } - return formChange; + + return FALSE; +} + +static bool32 TryChangeBattleTerrain(u32 battler, u32 statusFlag, u8 *timer) +{ + if (!(gFieldStatuses & statusFlag)) + { + gFieldStatuses &= ~(STATUS_FIELD_MISTY_TERRAIN | STATUS_FIELD_GRASSY_TERRAIN | EFFECT_ELECTRIC_TERRAIN | EFFECT_PSYCHIC_TERRAIN); + gFieldStatuses |= statusFlag; + + if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_TERRAIN_EXTENDER) + *timer = 8; + else + *timer = 5; + + gBattlerAttacker = gBattleScripting.battler = battler; + return TRUE; + } + + return FALSE; +} + +static bool32 ShouldChangeFormHpBased(u32 battler) +{ + // Ability, form >, form <=, hp divided + static const u16 forms[][4] = + { + {ABILITY_ZEN_MODE, SPECIES_DARMANITAN, SPECIES_DARMANITAN_ZEN, 2}, + {ABILITY_SHIELDS_DOWN, SPECIES_MINIOR, SPECIES_MINIOR_CORE, 2}, + {ABILITY_SCHOOLING, SPECIES_WISHIWASHI_SCHOOL, SPECIES_WISHIWASHI, 4}, + }; + u32 i; + + for (i = 0; i < ARRAY_COUNT(forms); i++) + { + if (gBattleMons[battler].ability == forms[i][0]) + { + if (gBattleMons[battler].species == forms[i][2] + && gBattleMons[battler].hp > gBattleMons[battler].maxHP / forms[i][3]) + { + gBattleMons[battler].species = forms[i][1]; + return TRUE; + } + if (gBattleMons[battler].species == forms[i][1] + && gBattleMons[battler].hp <= gBattleMons[battler].maxHP / forms[i][3]) + { + gBattleMons[battler].species = forms[i][2]; + return TRUE; + } + } + } + return FALSE; +} + +static u8 ForewarnChooseMove(u32 battler) +{ + struct Forewarn { + u8 battlerId; + u8 power; + u16 moveId; + }; + u32 i, j, bestId, count; + struct Forewarn *data = malloc(sizeof(struct Forewarn) * MAX_BATTLERS_COUNT * MAX_MON_MOVES); + + // Put all moves + for (count = 0, i = 0; i < MAX_BATTLERS_COUNT; i++) + { + if (IsBattlerAlive(i) && GetBattlerSide(i) != GetBattlerSide(battler)) + { + for (j = 0; j < MAX_MON_MOVES; j++) + { + if (gBattleMons[i].moves[j] == MOVE_NONE) + continue; + data[count].moveId = gBattleMons[i].moves[j]; + data[count].battlerId = i; + switch (gBattleMoves[data[count].moveId].effect) + { + case EFFECT_OHKO: + data[count].power = 150; + break; + case EFFECT_COUNTER: + case EFFECT_MIRROR_COAT: + case EFFECT_METAL_BURST: + data[count].power = 120; + break; + default: + if (gBattleMoves[data[count].moveId].power == 1) + data[count].power = 80; + else + data[count].power = gBattleMoves[data[count].moveId].power; + break; + } + count++; + } + } + } + + for (bestId = 0, i = 1; i < count; i++) + { + if (data[i].power > data[bestId].power) + bestId = i; + else if (data[i].power == data[bestId].power && Random() & 1) + bestId = i; + } + + gBattlerTarget = data[bestId].battlerId; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, data[bestId].moveId) + RecordKnownMove(gBattlerTarget, data[bestId].moveId); + + free(data); } -// The largest function in the game, but even it could not save itself from decompiling. u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveArg) { u8 effect = 0; - struct Pokemon *pokeAtk; - struct Pokemon *pokeDef; - u16 speciesAtk; - u16 speciesDef; - u32 pidAtk; - u32 pidDef; + u32 speciesAtk, speciesDef; + u32 pidAtk, pidDef; + u32 moveType, move; + u32 i, j; + + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + return 0; if (gBattlerAttacker >= gBattlersCount) gBattlerAttacker = battler; - if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) - pokeAtk = &gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]]; + speciesAtk = gBattleMons[gBattlerAttacker].species; + pidAtk = gBattleMons[gBattlerAttacker].personality; + + speciesDef = gBattleMons[gBattlerTarget].species; + pidDef = gBattleMons[gBattlerTarget].personality; + + if (special) + gLastUsedAbility = special; else - pokeAtk = &gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker]]; + gLastUsedAbility = GetBattlerAbility(battler); - if (gBattlerTarget >= gBattlersCount) - gBattlerTarget = battler; - - if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER) - pokeDef = &gPlayerParty[gBattlerPartyIndexes[gBattlerTarget]]; + if (moveArg) + move = moveArg; else - pokeDef = &gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]]; + move = gCurrentMove; - speciesAtk = GetMonData(pokeAtk, MON_DATA_SPECIES); - pidAtk = GetMonData(pokeAtk, MON_DATA_PERSONALITY); + GET_MOVE_TYPE(move, moveType); - speciesDef = GetMonData(pokeDef, MON_DATA_SPECIES); - pidDef = GetMonData(pokeDef, MON_DATA_PERSONALITY); - - if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) // Why isn't that check done at the beginning? + switch (caseID) { - u8 moveType; - s32 i; - u16 move; - u8 side; - u8 target1; - - if (special) - gLastUsedAbility = special; - else - gLastUsedAbility = gBattleMons[battler].ability; - - if (moveArg) - move = moveArg; - else - move = gCurrentMove; - - GET_MOVE_TYPE(move, moveType); - - switch (caseID) + case ABILITYEFFECT_ON_SWITCHIN: // 0 + gBattleScripting.battler = battler; + switch (gLastUsedAbility) { - case ABILITYEFFECT_ON_SWITCHIN: // 0 - if (gBattlerAttacker >= gBattlersCount) - gBattlerAttacker = battler; - switch (gLastUsedAbility) + case ABILITYEFFECT_SWITCH_IN_WEATHER: + if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) { - case ABILITYEFFECT_SWITCH_IN_WEATHER: - if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) + switch (GetCurrentWeather()) { - switch (GetCurrentWeather()) + case WEATHER_RAIN: + case WEATHER_RAIN_THUNDERSTORM: + case WEATHER_DOWNPOUR: + if (!(gBattleWeather & WEATHER_RAIN_ANY)) { - case WEATHER_RAIN: - case WEATHER_RAIN_THUNDERSTORM: - case WEATHER_DOWNPOUR: - if (!(gBattleWeather & WEATHER_RAIN_ANY)) + gBattleWeather = (WEATHER_RAIN_TEMPORARY | WEATHER_RAIN_PERMANENT); + gBattleScripting.animArg1 = B_ANIM_RAIN_CONTINUES; + effect++; + } + break; + case WEATHER_SANDSTORM: + if (!(gBattleWeather & WEATHER_SANDSTORM_ANY)) + { + gBattleWeather = (WEATHER_SANDSTORM_PERMANENT | WEATHER_SANDSTORM_TEMPORARY); + gBattleScripting.animArg1 = B_ANIM_SANDSTORM_CONTINUES; + effect++; + } + break; + case WEATHER_DROUGHT: + if (!(gBattleWeather & WEATHER_SUN_ANY)) + { + gBattleWeather = (WEATHER_SUN_PERMANENT | WEATHER_SUN_TEMPORARY); + gBattleScripting.animArg1 = B_ANIM_SUN_CONTINUES; + effect++; + } + break; + } + } + if (effect) + { + gBattleCommunication[MULTISTRING_CHOOSER] = GetCurrentWeather(); + BattleScriptPushCursorAndCallback(BattleScript_OverworldWeatherStarts); + } + break; + case ABILITY_IMPOSTER: + if (IsBattlerAlive(BATTLE_OPPOSITE(battler)) + && !(gBattleMons[BATTLE_OPPOSITE(battler)].status2 & (STATUS2_TRANSFORMED | STATUS2_SUBSTITUTE)) + && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) + && !(gBattleStruct->illusion[BATTLE_OPPOSITE(battler)].on) + && !(gStatuses3[BATTLE_OPPOSITE(battler)] & STATUS3_SEMI_INVULNERABLE)) + { + gBattlerTarget = BATTLE_OPPOSITE(battler); + BattleScriptPushCursorAndCallback(BattleScript_ImposterActivates); + effect++; + } + break; + case ABILITY_MOLD_BREAKER: + if (!gSpecialStatuses[battler].switchInAbilityDone) + { + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gSpecialStatuses[battler].switchInAbilityDone = 1; + BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); + effect++; + } + break; + case ABILITY_TERAVOLT: + if (!gSpecialStatuses[battler].switchInAbilityDone) + { + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gSpecialStatuses[battler].switchInAbilityDone = 1; + BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); + effect++; + } + break; + case ABILITY_TURBOBLAZE: + if (!gSpecialStatuses[battler].switchInAbilityDone) + { + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gSpecialStatuses[battler].switchInAbilityDone = 1; + BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); + effect++; + } + break; + case ABILITY_SLOW_START: + if (!gSpecialStatuses[battler].switchInAbilityDone) + { + gDisableStructs[battler].slowStartTimer = 5; + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + gSpecialStatuses[battler].switchInAbilityDone = 1; + BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); + effect++; + } + break; + case ABILITY_UNNERVE: + if (!gSpecialStatuses[battler].switchInAbilityDone) + { + gBattleCommunication[MULTISTRING_CHOOSER] = 4; + gSpecialStatuses[battler].switchInAbilityDone = 1; + BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); + effect++; + } + break; + case ABILITY_ANTICIPATION: + if (!gSpecialStatuses[battler].switchInAbilityDone) + { + u32 side = GetBattlerSide(battler); + + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { + if (IsBattlerAlive(i) && side != GetBattlerSide(i)) + { + for (j = 0; j < MAX_MON_MOVES; j++) { - gBattleWeather = (WEATHER_RAIN_TEMPORARY | WEATHER_RAIN_PERMANENT); - gBattleScripting.animArg1 = B_ANIM_RAIN_CONTINUES; - gBattleScripting.battler = battler; - effect++; + move = gBattleMons[i].moves[j]; + GET_MOVE_TYPE(move, moveType); + if (CalcTypeEffectivenessMultiplier(move, moveType, i, battler, FALSE) >= UQ_4_12(2.0)) + { + effect++; + break; + } } - break; - case WEATHER_SANDSTORM: - if (!(gBattleWeather & WEATHER_SANDSTORM_ANY)) - { - gBattleWeather = (WEATHER_SANDSTORM_PERMANENT | WEATHER_SANDSTORM_TEMPORARY); - gBattleScripting.animArg1 = B_ANIM_SANDSTORM_CONTINUES; - gBattleScripting.battler = battler; - effect++; - } - break; - case WEATHER_DROUGHT: - if (!(gBattleWeather & WEATHER_SUN_ANY)) - { - gBattleWeather = (WEATHER_SUN_PERMANENT | WEATHER_SUN_TEMPORARY); - gBattleScripting.animArg1 = B_ANIM_SUN_CONTINUES; - gBattleScripting.battler = battler; - effect++; - } - break; } } + if (effect) { - gBattleCommunication[MULTISTRING_CHOOSER] = GetCurrentWeather(); - BattleScriptPushCursorAndCallback(BattleScript_OverworldWeatherStarts); + gBattleCommunication[MULTISTRING_CHOOSER] = 5; + gSpecialStatuses[battler].switchInAbilityDone = 1; + BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); } - break; - case ABILITY_DRIZZLE: - if (!(gBattleWeather & WEATHER_RAIN_PERMANENT)) + } + break; + case ABILITY_FRISK: + if (!gSpecialStatuses[battler].switchInAbilityDone) + { + gSpecialStatuses[battler].switchInAbilityDone = 1; + BattleScriptPushCursorAndCallback(BattleScript_FriskActivates); // Try activate + effect++; + } + return effect; // Note: It returns effect as to not record the ability if Frisk does not activate. + case ABILITY_FOREWARN: + if (!gSpecialStatuses[battler].switchInAbilityDone) + { + ForewarnChooseMove(battler); + gBattleCommunication[MULTISTRING_CHOOSER] = 6; + gSpecialStatuses[battler].switchInAbilityDone = 1; + BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); + effect++; + } + break; + case ABILITY_DOWNLOAD: + if (!gSpecialStatuses[battler].switchInAbilityDone) + { + u32 statId, opposingBattler; + u32 opposingDef = 0, opposingSpDef = 0; + + opposingBattler = BATTLE_OPPOSITE(battler); + for (i = 0; i < 2; opposingBattler ^= BIT_SIDE, i++) { - gBattleWeather = (WEATHER_RAIN_PERMANENT | WEATHER_RAIN_TEMPORARY); - BattleScriptPushCursorAndCallback(BattleScript_DrizzleActivates); - gBattleScripting.battler = battler; + if (IsBattlerAlive(opposingBattler)) + { + opposingDef += gBattleMons[opposingBattler].defense + * gStatStageRatios[gBattleMons[opposingBattler].statStages[STAT_DEF]][0] + / gStatStageRatios[gBattleMons[opposingBattler].statStages[STAT_DEF]][1]; + opposingSpDef += gBattleMons[opposingBattler].spDefense + * gStatStageRatios[gBattleMons[opposingBattler].statStages[STAT_SPDEF]][0] + / gStatStageRatios[gBattleMons[opposingBattler].statStages[STAT_SPDEF]][1]; + } + } + + if (opposingDef < opposingSpDef) + statId = STAT_ATK; + else + statId = STAT_SPATK; + + gSpecialStatuses[battler].switchInAbilityDone = 1; + + if (gBattleMons[battler].statStages[statId] != 12) + { + gBattleMons[battler].statStages[statId]++; + SET_STATCHANGER(statId, 1, FALSE); + PREPARE_STAT_BUFFER(gBattleTextBuff1, statId); + BattleScriptPushCursorAndCallback(BattleScript_AttackerAbilityStatRaiseEnd3); effect++; } - break; - case ABILITY_SAND_STREAM: - if (!(gBattleWeather & WEATHER_SANDSTORM_PERMANENT)) - { - gBattleWeather = (WEATHER_SANDSTORM_PERMANENT | WEATHER_SANDSTORM_TEMPORARY); - BattleScriptPushCursorAndCallback(BattleScript_SandstreamActivates); - gBattleScripting.battler = battler; - effect++; - } - break; - case ABILITY_DROUGHT: - if (!(gBattleWeather & WEATHER_SUN_PERMANENT)) - { - gBattleWeather = (WEATHER_SUN_PERMANENT | WEATHER_SUN_TEMPORARY); - BattleScriptPushCursorAndCallback(BattleScript_DroughtActivates); - gBattleScripting.battler = battler; - effect++; - } - break; - case ABILITY_INTIMIDATE: - if (!(gSpecialStatuses[battler].intimidatedMon)) - { - gStatuses3[battler] |= STATUS3_INTIMIDATE_POKES; - gSpecialStatuses[battler].intimidatedMon = 1; - } - break; - case ABILITY_FORECAST: - effect = CastformDataTypeChange(battler); + } + break; + case ABILITY_DRIZZLE: + if (TryChangeBattleWeather(battler, ENUM_WEATHER_RAIN, TRUE)) + { + BattleScriptPushCursorAndCallback(BattleScript_DrizzleActivates); + effect++; + } + break; + case ABILITY_SAND_STREAM: + if (TryChangeBattleWeather(battler, ENUM_WEATHER_SANDSTORM, TRUE)) + { + BattleScriptPushCursorAndCallback(BattleScript_SandstreamActivates); + effect++; + } + break; + case ABILITY_DROUGHT: + if (TryChangeBattleWeather(battler, ENUM_WEATHER_SUN, TRUE)) + { + BattleScriptPushCursorAndCallback(BattleScript_DroughtActivates); + effect++; + } + break; + case ABILITY_SNOW_WARNING: + if (TryChangeBattleWeather(battler, ENUM_WEATHER_HAIL, TRUE)) + { + BattleScriptPushCursorAndCallback(BattleScript_SnowWarningActivates); + effect++; + } + break; + case ABILITY_ELECTRIC_SURGE: + if (TryChangeBattleTerrain(battler, STATUS_FIELD_ELECTRIC_TERRAIN, &gFieldTimers.electricTerrainTimer)) + { + BattleScriptPushCursorAndCallback(BattleScript_ElectricSurgeActivates); + effect++; + } + break; + case ABILITY_GRASSY_SURGE: + if (TryChangeBattleTerrain(battler, STATUS_FIELD_GRASSY_TERRAIN, &gFieldTimers.grassyTerrainTimer)) + { + BattleScriptPushCursorAndCallback(BattleScript_GrassySurgeActivates); + effect++; + } + break; + case ABILITY_MISTY_SURGE: + if (TryChangeBattleTerrain(battler, STATUS_FIELD_MISTY_TERRAIN, &gFieldTimers.mistyTerrainTimer)) + { + BattleScriptPushCursorAndCallback(BattleScript_MistySurgeActivates); + effect++; + } + break; + case ABILITY_PSYCHIC_SURGE: + if (TryChangeBattleTerrain(battler, STATUS_FIELD_PSYCHIC_TERRAIN, &gFieldTimers.psychicTerrainTimer)) + { + BattleScriptPushCursorAndCallback(BattleScript_PsychicSurgeActivates); + effect++; + } + break; + case ABILITY_INTIMIDATE: + if (!(gSpecialStatuses[battler].intimidatedMon)) + { + gBattleResources->flags->flags[battler] |= RESOURCE_FLAG_INTIMIDATED; + gSpecialStatuses[battler].intimidatedMon = 1; + } + break; + case ABILITY_FORECAST: + case ABILITY_FLOWER_GIFT: + effect = TryWeatherFormChange(battler); + if (effect != 0) + { + BattleScriptPushCursorAndCallback(BattleScript_CastformChange); + *(&gBattleStruct->formToChangeInto) = effect - 1; + } + break; + case ABILITY_TRACE: + if (!(gSpecialStatuses[battler].traced)) + { + gBattleResources->flags->flags[battler] |= RESOURCE_FLAG_TRACED; + gSpecialStatuses[battler].traced = 1; + } + break; + case ABILITY_CLOUD_NINE: + case ABILITY_AIR_LOCK: + for (i = 0; i < gBattlersCount; i++) + { + effect = TryWeatherFormChange(i); if (effect != 0) { BattleScriptPushCursorAndCallback(BattleScript_CastformChange); - gBattleScripting.battler = battler; - *(&gBattleStruct->formToChangeInto) = effect - 1; - } - break; - case ABILITY_TRACE: - if (!(gSpecialStatuses[battler].traced)) - { - gStatuses3[battler] |= STATUS3_TRACE; - gSpecialStatuses[battler].traced = 1; - } - break; - case ABILITY_CLOUD_NINE: - case ABILITY_AIR_LOCK: - { - // that's a weird choice for a variable, why not use i or battler? - for (target1 = 0; target1 < gBattlersCount; target1++) - { - effect = CastformDataTypeChange(target1); - if (effect != 0) - { - BattleScriptPushCursorAndCallback(BattleScript_CastformChange); - gBattleScripting.battler = target1; - *(&gBattleStruct->formToChangeInto) = effect - 1; - break; - } - } - } - break; - } - break; - case ABILITYEFFECT_ENDTURN: // 1 - if (gBattleMons[battler].hp != 0) - { - gBattlerAttacker = battler; - switch (gLastUsedAbility) - { - case ABILITY_RAIN_DISH: - if (WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_RAIN_ANY) - && gBattleMons[battler].maxHP > gBattleMons[battler].hp) - { - gLastUsedAbility = ABILITY_RAIN_DISH; // why - BattleScriptPushCursorAndCallback(BattleScript_RainDishActivates); - gBattleMoveDamage = gBattleMons[battler].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - effect++; - } - break; - case ABILITY_SHED_SKIN: - if ((gBattleMons[battler].status1 & STATUS1_ANY) && (Random() % 3) == 0) - { - if (gBattleMons[battler].status1 & (STATUS1_POISON | STATUS1_TOXIC_POISON)) - StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); - if (gBattleMons[battler].status1 & STATUS1_SLEEP) - StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); - if (gBattleMons[battler].status1 & STATUS1_PARALYSIS) - StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); - if (gBattleMons[battler].status1 & STATUS1_BURN) - StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); - if (gBattleMons[battler].status1 & STATUS1_FREEZE) - StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); - gBattleMons[battler].status1 = 0; - gBattleMons[battler].status2 &= ~(STATUS2_NIGHTMARE); // fix nightmare glitch - gBattleScripting.battler = gActiveBattler = battler; - BattleScriptPushCursorAndCallback(BattleScript_ShedSkinActivates); - BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); - MarkBattlerForControllerExec(gActiveBattler); - effect++; - } - break; - case ABILITY_SPEED_BOOST: - if (gBattleMons[battler].statStages[STAT_SPEED] < MAX_STAT_STAGE && gDisableStructs[battler].isFirstTurn != 2) - { - gBattleMons[battler].statStages[STAT_SPEED]++; - gBattleScripting.animArg1 = 0x11; - gBattleScripting.animArg2 = 0; - BattleScriptPushCursorAndCallback(BattleScript_SpeedBoostActivates); - gBattleScripting.battler = battler; - effect++; - } - break; - case ABILITY_TRUANT: - gDisableStructs[gBattlerAttacker].truantCounter ^= 1; + gBattleScripting.battler = i; + gBattleStruct->formToChangeInto = effect - 1; break; } } break; - case ABILITYEFFECT_MOVES_BLOCK: // 2 - if (gLastUsedAbility == ABILITY_SOUNDPROOF) + case ABILITY_SCHOOLING: + if (gBattleMons[battler].level < 20) + break; + case ABILITY_SHIELDS_DOWN: + if (ShouldChangeFormHpBased(battler)) { - for (i = 0; sSoundMovesTable[i] != 0xFFFF; i++) - { - if (sSoundMovesTable[i] == move) - break; - } - if (sSoundMovesTable[i] != 0xFFFF) - { - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS) - gHitMarker |= HITMARKER_NO_PPDEDUCT; - gBattlescriptCurrInstr = BattleScript_SoundproofProtected; - effect = 1; - } - } - break; - case ABILITYEFFECT_ABSORBING: // 3 - if (move) - { - switch (gLastUsedAbility) - { - case ABILITY_VOLT_ABSORB: - if (moveType == TYPE_ELECTRIC && gBattleMoves[move].power != 0) - { - if (gProtectStructs[gBattlerAttacker].notFirstStrike) - gBattlescriptCurrInstr = BattleScript_MoveHPDrain; - else - gBattlescriptCurrInstr = BattleScript_MoveHPDrain_PPLoss; - - effect = 1; - } - break; - case ABILITY_WATER_ABSORB: - if (moveType == TYPE_WATER && gBattleMoves[move].power != 0) - { - if (gProtectStructs[gBattlerAttacker].notFirstStrike) - gBattlescriptCurrInstr = BattleScript_MoveHPDrain; - else - gBattlescriptCurrInstr = BattleScript_MoveHPDrain_PPLoss; - - effect = 1; - } - break; - case ABILITY_FLASH_FIRE: - if (moveType == TYPE_FIRE && !(gBattleMons[battler].status1 & STATUS1_FREEZE)) - { - if (!(gBattleResources->flags->flags[battler] & RESOURCE_FLAG_FLASH_FIRE)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - if (gProtectStructs[gBattlerAttacker].notFirstStrike) - gBattlescriptCurrInstr = BattleScript_FlashFireBoost; - else - gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss; - - gBattleResources->flags->flags[battler] |= RESOURCE_FLAG_FLASH_FIRE; - effect = 2; - } - else - { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - if (gProtectStructs[gBattlerAttacker].notFirstStrike) - gBattlescriptCurrInstr = BattleScript_FlashFireBoost; - else - gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss; - - effect = 2; - } - } - break; - } - if (effect == 1) - { - if (gBattleMons[battler].maxHP == gBattleMons[battler].hp) - { - if ((gProtectStructs[gBattlerAttacker].notFirstStrike)) - gBattlescriptCurrInstr = BattleScript_MonMadeMoveUseless; - else - gBattlescriptCurrInstr = BattleScript_MonMadeMoveUseless_PPLoss; - } - else - { - gBattleMoveDamage = gBattleMons[battler].maxHP / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - } - } - } - break; - case ABILITYEFFECT_ON_DAMAGE: // Contact abilities and Color Change - switch (gLastUsedAbility) - { - case ABILITY_COLOR_CHANGE: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && move != MOVE_STRUGGLE - && gBattleMoves[move].power != 0 - && TARGET_TURN_DAMAGED - && !IS_BATTLER_OF_TYPE(battler, moveType) - && gBattleMons[battler].hp != 0) - { - SET_BATTLER_TYPE(battler, moveType); - PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ColorChangeActivates; - effect++; - } - break; - case ABILITY_ROUGH_SKIN: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && gBattleMons[gBattlerAttacker].hp != 0 - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && TARGET_TURN_DAMAGED - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)) - { - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_RoughSkinActivates; - effect++; - } - break; - case ABILITY_EFFECT_SPORE: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && gBattleMons[gBattlerAttacker].hp != 0 - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && TARGET_TURN_DAMAGED - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) - && (Random() % 10) == 0) - { - do - { - gBattleCommunication[MOVE_EFFECT_BYTE] = Random() & 3; - } while (gBattleCommunication[MOVE_EFFECT_BYTE] == 0); - - if (gBattleCommunication[MOVE_EFFECT_BYTE] == MOVE_EFFECT_BURN) - gBattleCommunication[MOVE_EFFECT_BYTE] += 2; // 5 MOVE_EFFECT_PARALYSIS - - gBattleCommunication[MOVE_EFFECT_BYTE] += MOVE_EFFECT_AFFECTS_USER; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } - break; - case ABILITY_POISON_POINT: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && gBattleMons[gBattlerAttacker].hp != 0 - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && TARGET_TURN_DAMAGED - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) - && (Random() % 3) == 0) - { - gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_POISON; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } - break; - case ABILITY_STATIC: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && gBattleMons[gBattlerAttacker].hp != 0 - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && TARGET_TURN_DAMAGED - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) - && (Random() % 3) == 0) - { - gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_PARALYSIS; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } - break; - case ABILITY_FLAME_BODY: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && gBattleMons[gBattlerAttacker].hp != 0 - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) - && TARGET_TURN_DAMAGED - && (Random() % 3) == 0) - { - gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_BURN; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } - break; - case ABILITY_CUTE_CHARM: - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && gBattleMons[gBattlerAttacker].hp != 0 - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) - && TARGET_TURN_DAMAGED - && gBattleMons[gBattlerTarget].hp != 0 - && (Random() % 3) == 0 - && gBattleMons[gBattlerAttacker].ability != ABILITY_OBLIVIOUS - && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) - && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) - && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != MON_GENDERLESS - && GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) != MON_GENDERLESS) - { - gBattleMons[gBattlerAttacker].status2 |= STATUS2_INFATUATED_WITH(gBattlerTarget); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_CuteCharmActivates; - effect++; - } - break; - } - break; - case ABILITYEFFECT_IMMUNITY: // 5 - for (battler = 0; battler < gBattlersCount; battler++) - { - switch (gBattleMons[battler].ability) - { - case ABILITY_IMMUNITY: - if (gBattleMons[battler].status1 & (STATUS1_POISON | STATUS1_TOXIC_POISON | STATUS1_TOXIC_COUNTER)) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); - effect = 1; - } - break; - case ABILITY_OWN_TEMPO: - if (gBattleMons[battler].status2 & STATUS2_CONFUSION) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); - effect = 2; - } - break; - case ABILITY_LIMBER: - if (gBattleMons[battler].status1 & STATUS1_PARALYSIS) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); - effect = 1; - } - break; - case ABILITY_INSOMNIA: - case ABILITY_VITAL_SPIRIT: - if (gBattleMons[battler].status1 & STATUS1_SLEEP) - { - gBattleMons[battler].status2 &= ~(STATUS2_NIGHTMARE); - StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); - effect = 1; - } - break; - case ABILITY_WATER_VEIL: - if (gBattleMons[battler].status1 & STATUS1_BURN) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); - effect = 1; - } - break; - case ABILITY_MAGMA_ARMOR: - if (gBattleMons[battler].status1 & STATUS1_FREEZE) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); - effect = 1; - } - break; - case ABILITY_OBLIVIOUS: - if (gBattleMons[battler].status2 & STATUS2_INFATUATION) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); - effect = 3; - } - break; - } - if (effect) - { - switch (effect) - { - case 1: // status cleared - gBattleMons[battler].status1 = 0; - break; - case 2: // get rid of confusion - gBattleMons[battler].status2 &= ~(STATUS2_CONFUSION); - break; - case 3: // get rid of infatuation - gBattleMons[battler].status2 &= ~(STATUS2_INFATUATION); - break; - } - - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AbilityCuredStatus; - gBattleScripting.battler = battler; - gActiveBattler = battler; - BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); - MarkBattlerForControllerExec(gActiveBattler); - return effect; - } - } - break; - case ABILITYEFFECT_FORECAST: // 6 - for (battler = 0; battler < gBattlersCount; battler++) - { - if (gBattleMons[battler].ability == ABILITY_FORECAST) - { - effect = CastformDataTypeChange(battler); - if (effect) - { - BattleScriptPushCursorAndCallback(BattleScript_CastformChange); - gBattleScripting.battler = battler; - *(&gBattleStruct->formToChangeInto) = effect - 1; - return effect; - } - } - } - break; - case ABILITYEFFECT_SYNCHRONIZE: // 7 - if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT)) - { - gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT); - gBattleStruct->synchronizeMoveEffect &= ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); - if (gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) - gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON; - - gBattleCommunication[MOVE_EFFECT_BYTE] = gBattleStruct->synchronizeMoveEffect + MOVE_EFFECT_AFFECTS_USER; - gBattleScripting.battler = gBattlerTarget; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SynchronizeActivates; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + BattleScriptPushCursorAndCallback(BattleScript_AttackerFormChangeEnd3); effect++; } break; - case ABILITYEFFECT_ATK_SYNCHRONIZE: // 8 - if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT)) - { - gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT); - gBattleStruct->synchronizeMoveEffect &= ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); - if (gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) - gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON; - - gBattleCommunication[MOVE_EFFECT_BYTE] = gBattleStruct->synchronizeMoveEffect; - gBattleScripting.battler = gBattlerAttacker; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SynchronizeActivates; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; - } - break; - case ABILITYEFFECT_INTIMIDATE1: // 9 - for (i = 0; i < gBattlersCount; i++) - { - if (gBattleMons[i].ability == ABILITY_INTIMIDATE && gStatuses3[i] & STATUS3_INTIMIDATE_POKES) - { - gLastUsedAbility = ABILITY_INTIMIDATE; - gStatuses3[i] &= ~(STATUS3_INTIMIDATE_POKES); - BattleScriptPushCursorAndCallback(BattleScript_IntimidateActivatesEnd3); - gBattleStruct->intimidateBattler = i; - effect++; - break; - } - } - break; - case ABILITYEFFECT_TRACE: // 11 - for (i = 0; i < gBattlersCount; i++) - { - if (gBattleMons[i].ability == ABILITY_TRACE && (gStatuses3[i] & STATUS3_TRACE)) - { - u8 target2; - side = (GetBattlerPosition(i) ^ BIT_SIDE) & BIT_SIDE; // side of the opposing pokemon - target1 = GetBattlerAtPosition(side); - target2 = GetBattlerAtPosition(side + BIT_FLANK); - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - if (gBattleMons[target1].ability != 0 && gBattleMons[target1].hp != 0 - && gBattleMons[target2].ability != 0 && gBattleMons[target2].hp != 0) - { - gActiveBattler = GetBattlerAtPosition(((Random() & 1) * 2) | side); - gBattleMons[i].ability = gBattleMons[gActiveBattler].ability; - gLastUsedAbility = gBattleMons[gActiveBattler].ability; - effect++; - } - else if (gBattleMons[target1].ability != 0 && gBattleMons[target1].hp != 0) - { - gActiveBattler = target1; - gBattleMons[i].ability = gBattleMons[gActiveBattler].ability; - gLastUsedAbility = gBattleMons[gActiveBattler].ability; - effect++; - } - else if (gBattleMons[target2].ability != 0 && gBattleMons[target2].hp != 0) - { - gActiveBattler = target2; - gBattleMons[i].ability = gBattleMons[gActiveBattler].ability; - gLastUsedAbility = gBattleMons[gActiveBattler].ability; - effect++; - } - } - else - { - gActiveBattler = target1; - if (gBattleMons[target1].ability && gBattleMons[target1].hp) - { - gBattleMons[i].ability = gBattleMons[target1].ability; - gLastUsedAbility = gBattleMons[target1].ability; - effect++; - } - } - if (effect) - { - BattleScriptPushCursorAndCallback(BattleScript_TraceActivates); - gStatuses3[i] &= ~(STATUS3_TRACE); - gBattleScripting.battler = i; - - PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBattler, gBattlerPartyIndexes[gActiveBattler]) - PREPARE_ABILITY_BUFFER(gBattleTextBuff2, gLastUsedAbility) - break; - } - } - } - break; - case ABILITYEFFECT_INTIMIDATE2: // 10 - for (i = 0; i < gBattlersCount; i++) - { - if (gBattleMons[i].ability == ABILITY_INTIMIDATE && (gStatuses3[i] & STATUS3_INTIMIDATE_POKES)) - { - gLastUsedAbility = ABILITY_INTIMIDATE; - gStatuses3[i] &= ~(STATUS3_INTIMIDATE_POKES); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_IntimidateActivates; - gBattleStruct->intimidateBattler = i; - effect++; - break; - } - } - break; - case ABILITYEFFECT_CHECK_OTHER_SIDE: // 12 - side = GetBattlerSide(battler); - for (i = 0; i < gBattlersCount; i++) - { - if (GetBattlerSide(i) != side && gBattleMons[i].ability == ability) - { - gLastUsedAbility = ability; - effect = i + 1; - } - } - break; - case ABILITYEFFECT_CHECK_BATTLER_SIDE: // 13 - side = GetBattlerSide(battler); - for (i = 0; i < gBattlersCount; i++) - { - if (GetBattlerSide(i) == side && gBattleMons[i].ability == ability) - { - gLastUsedAbility = ability; - effect = i + 1; - } - } - break; - case ABILITYEFFECT_FIELD_SPORT: // 14 - switch (gLastUsedAbility) - { - case 0xFD: - for (i = 0; i < gBattlersCount; i++) - { - if (gStatuses3[i] & STATUS3_MUDSPORT) - effect = i + 1; - } - break; - case 0xFE: - for (i = 0; i < gBattlersCount; i++) - { - if (gStatuses3[i] & STATUS3_WATERSPORT) - effect = i + 1; - } - break; - default: - for (i = 0; i < gBattlersCount; i++) - { - if (gBattleMons[i].ability == ability) - { - gLastUsedAbility = ability; - effect = i + 1; - } - } - break; - } - break; - case ABILITYEFFECT_CHECK_ON_FIELD: // 19 - for (i = 0; i < gBattlersCount; i++) - { - if (gBattleMons[i].ability == ability && gBattleMons[i].hp != 0) - { - gLastUsedAbility = ability; - effect = i + 1; - } - } - break; - case ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER: // 15 - for (i = 0; i < gBattlersCount; i++) - { - if (gBattleMons[i].ability == ability && i != battler) - { - gLastUsedAbility = ability; - effect = i + 1; - } - } - break; - case ABILITYEFFECT_COUNT_OTHER_SIDE: // 16 - side = GetBattlerSide(battler); - for (i = 0; i < gBattlersCount; i++) - { - if (GetBattlerSide(i) != side && gBattleMons[i].ability == ability) - { - gLastUsedAbility = ability; - effect++; - } - } - break; - case ABILITYEFFECT_COUNT_BATTLER_SIDE: // 17 - side = GetBattlerSide(battler); - for (i = 0; i < gBattlersCount; i++) - { - if (GetBattlerSide(i) == side && gBattleMons[i].ability == ability) - { - gLastUsedAbility = ability; - effect++; - } - } - break; - case ABILITYEFFECT_COUNT_ON_FIELD: // 18 - for (i = 0; i < gBattlersCount; i++) - { - if (gBattleMons[i].ability == ability && i != battler) - { - gLastUsedAbility = ability; - effect++; - } - } - break; } + break; + case ABILITYEFFECT_ENDTURN: // 1 + if (gBattleMons[battler].hp != 0) + { + gBattlerAttacker = battler; + switch (gLastUsedAbility) + { + case ABILITY_HARVEST: + if (((WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY) || Random() % 2 == 0) + && gBattleMons[battler].item == ITEM_NONE + && gBattleStruct->changedItems[battler] == ITEM_NONE + && ItemId_GetPocket(gBattleStruct->usedHeldItems[battler]) == POCKET_BERRIES) + { + gLastUsedItem = gBattleStruct->changedItems[battler] = gBattleStruct->usedHeldItems[battler]; + gBattleStruct->usedHeldItems[battler] = ITEM_NONE; + BattleScriptPushCursorAndCallback(BattleScript_HarvestActivates); + effect++; + } + break; + case ABILITY_DRY_SKIN: + if (gBattleWeather & WEATHER_SUN_ANY) + goto SOLAR_POWER_HP_DROP; + // Dry Skin works similarly to Rain Dish in Rain + case ABILITY_RAIN_DISH: + if (WEATHER_HAS_EFFECT + && (gBattleWeather & WEATHER_RAIN_ANY) + && !BATTLER_MAX_HP(battler) + && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) + { + BattleScriptPushCursorAndCallback(BattleScript_RainDishActivates); + gBattleMoveDamage = gBattleMons[battler].maxHP / (gLastUsedAbility == ABILITY_RAIN_DISH ? 16 : 8); + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage *= -1; + effect++; + } + break; + case ABILITY_HYDRATION: + if (WEATHER_HAS_EFFECT + && (gBattleWeather & WEATHER_RAIN_ANY) + && gBattleMons[battler].status1 & STATUS1_ANY) + { + goto ABILITY_HEAL_MON_STATUS; + } + break; + case ABILITY_SHED_SKIN: + if ((gBattleMons[battler].status1 & STATUS1_ANY) && (Random() % 3) == 0) + { + ABILITY_HEAL_MON_STATUS: + if (gBattleMons[battler].status1 & (STATUS1_POISON | STATUS1_TOXIC_POISON)) + StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); + if (gBattleMons[battler].status1 & STATUS1_SLEEP) + StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); + if (gBattleMons[battler].status1 & STATUS1_PARALYSIS) + StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); + if (gBattleMons[battler].status1 & STATUS1_BURN) + StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); + if (gBattleMons[battler].status1 & STATUS1_FREEZE) + StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); - if (effect && caseID < ABILITYEFFECT_CHECK_OTHER_SIDE && gLastUsedAbility != 0xFF) - RecordAbilityBattle(battler, gLastUsedAbility); + gBattleMons[battler].status1 = 0; + gBattleMons[battler].status2 &= ~(STATUS2_NIGHTMARE); + gBattleScripting.battler = gActiveBattler = battler; + BattleScriptPushCursorAndCallback(BattleScript_ShedSkinActivates); + BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); + MarkBattlerForControllerExec(gActiveBattler); + effect++; + } + break; + case ABILITY_SPEED_BOOST: + if (gBattleMons[battler].statStages[STAT_SPEED] < 0xC && gDisableStructs[battler].isFirstTurn != 2) + { + gBattleMons[battler].statStages[STAT_SPEED]++; + gBattleScripting.animArg1 = 0x11; + gBattleScripting.animArg2 = 0; + BattleScriptPushCursorAndCallback(BattleScript_SpeedBoostActivates); + gBattleScripting.battler = battler; + effect++; + } + break; + case ABILITY_MOODY: + if (gDisableStructs[battler].isFirstTurn != 2) + { + u32 validToRaise = 0, validToLower = 0; + u32 statsNum = (B_MOODY_ACC_EVASION != GEN_8) ? NUM_BATTLE_STATS : NUM_STATS; + + for (i = STAT_ATK; i < statsNum; i++) + { + if (gBattleMons[battler].statStages[i] != 0) + validToLower |= gBitTable[i]; + if (gBattleMons[battler].statStages[i] != 12) + validToRaise |= gBitTable[i]; + } + + if (validToLower != 0 || validToRaise != 0) // Can lower one stat, or can raise one stat + { + gBattleScripting.statChanger = gBattleScripting.savedStatChanger = 0; // for raising and lowering stat respectively + if (validToRaise != 0) // Find stat to raise + { + do + { + i = (Random() % statsNum) + STAT_ATK; + } while (!(validToRaise & gBitTable[i])); + SET_STATCHANGER(i, 2, FALSE); + validToLower &= ~(gBitTable[i]); // Can't lower the same stat as raising. + } + if (validToLower != 0) // Find stat to lower + { + do + { + i = (Random() % statsNum) + STAT_ATK; + } while (!(validToLower & gBitTable[i])); + SET_STATCHANGER2(gBattleScripting.savedStatChanger, i, 1, TRUE); + } + BattleScriptPushCursorAndCallback(BattleScript_MoodyActivates); + effect++; + } + } + break; + case ABILITY_TRUANT: + gDisableStructs[gBattlerAttacker].truantCounter ^= 1; + break; + case ABILITY_BAD_DREAMS: + if (gBattleMons[battler].status1 & STATUS1_SLEEP + || gBattleMons[BATTLE_OPPOSITE(battler)].status1 & STATUS1_SLEEP + || GetBattlerAbility(battler) == ABILITY_COMATOSE + || GetBattlerAbility(BATTLE_OPPOSITE(battler)) == ABILITY_COMATOSE) + { + BattleScriptPushCursorAndCallback(BattleScript_BadDreamsActivates); + effect++; + } + break; + SOLAR_POWER_HP_DROP: + case ABILITY_SOLAR_POWER: + if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY) + { + BattleScriptPushCursorAndCallback(BattleScript_SolarPowerActivates); + gBattleMoveDamage = gBattleMons[battler].maxHP / 8; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + effect++; + } + break; + case ABILITY_HEALER: + gBattleScripting.battler = BATTLE_PARTNER(battler); + if (IsBattlerAlive(gBattleScripting.battler) + && gBattleMons[gBattleScripting.battler].status1 & STATUS1_ANY + && (Random() % 100) < 30) + { + BattleScriptPushCursorAndCallback(BattleScript_HealerActivates); + effect++; + } + break; + case ABILITY_SCHOOLING: + if (gBattleMons[battler].level < 20) + break; + case ABILITY_ZEN_MODE: + case ABILITY_SHIELDS_DOWN: + if ((effect = ShouldChangeFormHpBased(battler))) + BattleScriptPushCursorAndCallback(BattleScript_AttackerFormChangeEnd3); + break; + case ABILITY_POWER_CONSTRUCT: + if ((gBattleMons[battler].species == SPECIES_ZYGARDE || gBattleMons[battler].species == SPECIES_ZYGARDE_10) + && gBattleMons[battler].hp <= gBattleMons[battler].maxHP / 2) + { + gBattleStruct->changedSpecies[gBattlerPartyIndexes[battler]] = gBattleMons[battler].species; + gBattleMons[battler].species = SPECIES_ZYGARDE_COMPLETE; + BattleScriptPushCursorAndCallback(BattleScript_AttackerFormChangeEnd3); + effect++; + } + break; + } + } + break; + case ABILITYEFFECT_MOVES_BLOCK: // 2 + if ((gLastUsedAbility == ABILITY_SOUNDPROOF && gBattleMoves[move].flags & FLAG_SOUND) + || (gLastUsedAbility == ABILITY_BULLETPROOF && gBattleMoves[move].flags & FLAG_BALLISTIC)) + { + if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS) + gHitMarker |= HITMARKER_NO_PPDEDUCT; + gBattlescriptCurrInstr = BattleScript_SoundproofProtected; + effect = 1; + } + else if ((((gLastUsedAbility == ABILITY_DAZZLING || gLastUsedAbility == ABILITY_QUEENLY_MAJESTY + || (IsBattlerAlive(battler ^= BIT_FLANK) + && ((GetBattlerAbility(battler) == ABILITY_DAZZLING) || GetBattlerAbility(battler) == ABILITY_QUEENLY_MAJESTY))) + )) + && GetChosenMovePriority(gBattlerAttacker) > 0 + && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(battler)) + { + if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS) + gHitMarker |= HITMARKER_NO_PPDEDUCT; + gBattlescriptCurrInstr = BattleScript_DazzlingProtected; + effect = 1; + } + break; + case ABILITYEFFECT_ABSORBING: // 3 + if (move != MOVE_NONE) + { + u8 statId; + switch (gLastUsedAbility) + { + case ABILITY_VOLT_ABSORB: + if (moveType == TYPE_ELECTRIC) + effect = 1; + break; + case ABILITY_WATER_ABSORB: + case ABILITY_DRY_SKIN: + if (moveType == TYPE_WATER) + effect = 1; + break; + case ABILITY_MOTOR_DRIVE: + if (moveType == TYPE_ELECTRIC) + effect = 2, statId = STAT_SPEED; + break; + case ABILITY_LIGHTNING_ROD: + if (moveType == TYPE_ELECTRIC) + effect = 2, statId = STAT_SPATK; + break; + case ABILITY_STORM_DRAIN: + if (moveType == TYPE_WATER) + effect = 2, statId = STAT_SPATK; + break; + case ABILITY_SAP_SIPPER: + if (moveType == TYPE_GRASS) + effect = 2, statId = STAT_ATK; + break; + case ABILITY_FLASH_FIRE: + if (moveType == TYPE_FIRE && !((gBattleMons[battler].status1 & STATUS1_FREEZE) && B_FLASH_FIRE_FROZEN <= GEN_4)) + { + if (!(gBattleResources->flags->flags[battler] & RESOURCE_FLAG_FLASH_FIRE)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + if (gProtectStructs[gBattlerAttacker].notFirstStrike) + gBattlescriptCurrInstr = BattleScript_FlashFireBoost; + else + gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss; + + gBattleResources->flags->flags[battler] |= RESOURCE_FLAG_FLASH_FIRE; + effect = 3; + } + else + { + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + if (gProtectStructs[gBattlerAttacker].notFirstStrike) + gBattlescriptCurrInstr = BattleScript_FlashFireBoost; + else + gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss; + + effect = 3; + } + } + break; + } + + if (effect == 1) // Drain Hp ability. + { + if (BATTLER_MAX_HP(battler) || gStatuses3[battler] & STATUS3_HEAL_BLOCK) + { + if ((gProtectStructs[gBattlerAttacker].notFirstStrike)) + gBattlescriptCurrInstr = BattleScript_MonMadeMoveUseless; + else + gBattlescriptCurrInstr = BattleScript_MonMadeMoveUseless_PPLoss; + } + else + { + if (gProtectStructs[gBattlerAttacker].notFirstStrike) + gBattlescriptCurrInstr = BattleScript_MoveHPDrain; + else + gBattlescriptCurrInstr = BattleScript_MoveHPDrain_PPLoss; + + gBattleMoveDamage = gBattleMons[battler].maxHP / 4; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage *= -1; + } + } + else if (effect == 2) // Boost Stat ability; + { + if (gBattleMons[battler].statStages[statId] == 0xC) + { + if ((gProtectStructs[gBattlerAttacker].notFirstStrike)) + gBattlescriptCurrInstr = BattleScript_MonMadeMoveUseless; + else + gBattlescriptCurrInstr = BattleScript_MonMadeMoveUseless_PPLoss; + } + else + { + if (gProtectStructs[gBattlerAttacker].notFirstStrike) + gBattlescriptCurrInstr = BattleScript_MoveStatDrain; + else + gBattlescriptCurrInstr = BattleScript_MoveStatDrain_PPLoss; + + SET_STATCHANGER(statId, 1, FALSE); + gBattleMons[battler].statStages[statId]++; + PREPARE_STAT_BUFFER(gBattleTextBuff1, statId); + } + } + } + break; + case ABILITYEFFECT_MOVE_END: // Think contact abilities. + switch (gLastUsedAbility) + { + case ABILITY_JUSTIFIED: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && TARGET_TURN_DAMAGED + && IsBattlerAlive(battler) + && moveType == TYPE_DARK + && gBattleMons[battler].statStages[STAT_ATK] != 12) + { + SET_STATCHANGER(STAT_ATK, 1, FALSE); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaise; + effect++; + } + break; + case ABILITY_RATTLED: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && TARGET_TURN_DAMAGED + && IsBattlerAlive(battler) + && (moveType == TYPE_DARK || moveType == TYPE_BUG || moveType == TYPE_GHOST) + && gBattleMons[battler].statStages[STAT_SPEED] != 12) + { + SET_STATCHANGER(STAT_SPEED, 1, FALSE); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaise; + effect++; + } + break; + case ABILITY_WATER_COMPACTION: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && TARGET_TURN_DAMAGED + && IsBattlerAlive(battler) + && moveType == TYPE_WATER + && gBattleMons[battler].statStages[STAT_DEF] != 12) + { + SET_STATCHANGER(STAT_DEF, 2, FALSE); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaise; + effect++; + } + break; + case ABILITY_STAMINA: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && TARGET_TURN_DAMAGED + && IsBattlerAlive(battler) + && gBattleMons[battler].statStages[STAT_DEF] != 12) + { + SET_STATCHANGER(STAT_DEF, 1, FALSE); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaise; + effect++; + } + break; + case ABILITY_BERSERK: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && TARGET_TURN_DAMAGED + && IsBattlerAlive(battler) + // Had more than half of hp before, now has less + && gBattleStruct->hpBefore[battler] > gBattleMons[battler].maxHP / 2 + && gBattleMons[battler].hp < gBattleMons[battler].maxHP / 2 + && (gMultiHitCounter == 0 || gMultiHitCounter == 1) + && !(GetBattlerAbility(gBattlerAttacker) == ABILITY_SHEER_FORCE && gBattleMoves[gCurrentMove].flags & FLAG_SHEER_FORCE_BOOST) + && gBattleMons[battler].statStages[STAT_SPATK] != 12) + { + SET_STATCHANGER(STAT_SPATK, 1, FALSE); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaise; + effect++; + } + break; + case ABILITY_EMERGENCY_EXIT: + case ABILITY_WIMP_OUT: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && TARGET_TURN_DAMAGED + && IsBattlerAlive(battler) + // Had more than half of hp before, now has less + && gBattleStruct->hpBefore[battler] > gBattleMons[battler].maxHP / 2 + && gBattleMons[battler].hp < gBattleMons[battler].maxHP / 2 + && (gMultiHitCounter == 0 || gMultiHitCounter == 1) + && !(GetBattlerAbility(gBattlerAttacker) == ABILITY_SHEER_FORCE && gBattleMoves[gCurrentMove].flags & FLAG_SHEER_FORCE_BOOST) + && (CanBattlerSwitch(battler) || !(gBattleTypeFlags & BATTLE_TYPE_TRAINER)) + && !(gBattleTypeFlags & BATTLE_TYPE_ARENA)) + { + gBattleResources->flags->flags[battler] |= RESOURCE_FLAG_EMERGENCY_EXIT; + effect++; + } + break; + case ABILITY_WEAK_ARMOR: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && TARGET_TURN_DAMAGED + && IsBattlerAlive(battler) + && gBattleMoves[gCurrentMove].split == SPLIT_PHYSICAL + && (gBattleMons[battler].statStages[STAT_SPEED] != 12 || gBattleMons[battler].statStages[STAT_DEF] != 0)) + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_WeakArmorActivates; + effect++; + } + break; + case ABILITY_CURSED_BODY: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && TARGET_TURN_DAMAGED + && gDisableStructs[gBattlerAttacker].disabledMove == MOVE_NONE + && IsBattlerAlive(gBattlerAttacker) + && !IsAbilityOnSide(gBattlerAttacker, ABILITY_AROMA_VEIL) + && gBattleMons[gBattlerAttacker].pp[gChosenMovePos] != 0 + && (Random() % 3) == 0) + { + gDisableStructs[gBattlerAttacker].disabledMove = gChosenMove; + gDisableStructs[gBattlerAttacker].disableTimer = 4; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gChosenMove); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_CursedBodyActivates; + effect++; + } + break; + case ABILITY_MUMMY: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && IsBattlerAlive(gBattlerAttacker) + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)) + { + switch (gBattleMons[gBattlerAttacker].ability) + { + case ABILITY_MUMMY: + case ABILITY_BATTLE_BOND: + case ABILITY_COMATOSE: + case ABILITY_DISGUISE: + case ABILITY_MULTITYPE: + case ABILITY_POWER_CONSTRUCT: + case ABILITY_RKS_SYSTEM: + case ABILITY_SCHOOLING: + case ABILITY_SHIELDS_DOWN: + case ABILITY_STANCE_CHANGE: + break; + default: + gLastUsedAbility = gBattleMons[gBattlerAttacker].ability = ABILITY_MUMMY; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_MummyActivates; + effect++; + break; + } + } + break; + case ABILITY_ANGER_POINT: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && gIsCriticalHit + && TARGET_TURN_DAMAGED + && IsBattlerAlive(battler) + && gBattleMons[battler].statStages[STAT_ATK] != 12) + { + SET_STATCHANGER(STAT_ATK, 12 - gBattleMons[battler].statStages[STAT_ATK], FALSE); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_AngryPointActivates; + effect++; + } + break; + case ABILITY_COLOR_CHANGE: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && move != MOVE_STRUGGLE + && gBattleMoves[move].power != 0 + && TARGET_TURN_DAMAGED + && !IS_BATTLER_OF_TYPE(battler, moveType) + && gBattleMons[battler].hp != 0) + { + SET_BATTLER_TYPE(battler, moveType); + PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ColorChangeActivates; + effect++; + } + break; + case ABILITY_GOOEY: + case ABILITY_TANGLING_HAIR: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && gBattleMons[gBattlerAttacker].hp != 0 + && gBattleMons[gBattlerAttacker].statStages[STAT_SPEED] != 0 + && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + && TARGET_TURN_DAMAGED + && IsMoveMakingContact(move, gBattlerAttacker)) + { + gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_SPD_MINUS_1; + PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + break; + case ABILITY_ROUGH_SKIN: + case ABILITY_IRON_BARBS: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && gBattleMons[gBattlerAttacker].hp != 0 + && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + && TARGET_TURN_DAMAGED + && IsMoveMakingContact(move, gBattlerAttacker)) + { + gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 8; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_RoughSkinActivates; + effect++; + } + break; + case ABILITY_AFTERMATH: + if (!IsAbilityOnField(ABILITY_DAMP) + && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && gBattleMons[gBattlerTarget].hp == 0 + && IsBattlerAlive(gBattlerAttacker) + && IsMoveMakingContact(move, gBattlerAttacker)) + { + gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 4; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_AftermathDmg; + effect++; + } + break; + case ABILITY_INNARDS_OUT: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && gBattleMons[gBattlerTarget].hp == 0 + && IsBattlerAlive(gBattlerAttacker)) + { + gBattleMoveDamage = gSpecialStatuses[gBattlerTarget].dmg; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_AftermathDmg; + effect++; + } + break; + case ABILITY_EFFECT_SPORE: + if (!IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GRASS) + && GetBattlerAbility(gBattlerAttacker) != ABILITY_OVERCOAT + && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOOGLES) + { + i = Random() % 3; + if (i == 0) + goto POISON_POINT; + if (i == 1) + goto STATIC; + // Sleep + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && gBattleMons[gBattlerAttacker].hp != 0 + && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + && TARGET_TURN_DAMAGED + && GetBattlerAbility(gBattlerAttacker) != ABILITY_INSOMNIA + && GetBattlerAbility(gBattlerAttacker) != ABILITY_VITAL_SPIRIT + && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY) + && !IsAbilityStatusProtected(gBattlerAttacker) + && IsMoveMakingContact(move, gBattlerAttacker) + && (Random() % 3) == 0) + { + gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_SLEEP; + PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + } + break; + POISON_POINT: + case ABILITY_POISON_POINT: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && gBattleMons[gBattlerAttacker].hp != 0 + && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + && TARGET_TURN_DAMAGED + && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_POISON) + && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_STEEL) + && GetBattlerAbility(gBattlerAttacker) != ABILITY_IMMUNITY + && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY) + && !IsAbilityStatusProtected(gBattlerAttacker) + && IsMoveMakingContact(move, gBattlerAttacker) + && (Random() % 3) == 0) + { + gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_POISON; + PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + break; + STATIC: + case ABILITY_STATIC: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && gBattleMons[gBattlerAttacker].hp != 0 + && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + && TARGET_TURN_DAMAGED + && CanParalyzeType(gBattlerTarget, gBattlerAttacker) + && GetBattlerAbility(gBattlerAttacker) != ABILITY_LIMBER + && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY) + && !IsAbilityStatusProtected(gBattlerAttacker) + && IsMoveMakingContact(move, gBattlerAttacker) + && (Random() % 3) == 0) + { + gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_PARALYSIS; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + break; + case ABILITY_FLAME_BODY: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && gBattleMons[gBattlerAttacker].hp != 0 + && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && TARGET_TURN_DAMAGED + && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_FIRE) + && GetBattlerAbility(gBattlerAttacker) != ABILITY_WATER_VEIL + && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY) + && !IsAbilityStatusProtected(gBattlerAttacker) + && (Random() % 3) == 0) + { + gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_BURN; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + break; + case ABILITY_CUTE_CHARM: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && gBattleMons[gBattlerAttacker].hp != 0 + && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && TARGET_TURN_DAMAGED + && gBattleMons[gBattlerTarget].hp != 0 + && (Random() % 3) == 0 + && GetBattlerAbility(gBattlerAttacker) != ABILITY_OBLIVIOUS + && !IsAbilityOnSide(gBattlerAttacker, ABILITY_AROMA_VEIL) + && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) + && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) + && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != MON_GENDERLESS + && GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) != MON_GENDERLESS) + { + gBattleMons[gBattlerAttacker].status2 |= STATUS2_INFATUATED_WITH(gBattlerTarget); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_CuteCharmActivates; + effect++; + } + break; + case ABILITY_ILLUSION: + if (gBattleStruct->illusion[gBattlerTarget].on && !gBattleStruct->illusion[gBattlerTarget].broken && TARGET_TURN_DAMAGED) + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_IllusionOff; + effect++; + } + break; + } + break; + case ABILITYEFFECT_MOVE_END_ATTACKER: // Same as above, but for attacker + switch (gLastUsedAbility) + { + case ABILITY_POISON_TOUCH: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && gBattleMons[gBattlerTarget].hp != 0 + && !gProtectStructs[gBattlerTarget].confusionSelfDmg + && !IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_POISON) + && !IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_STEEL) + && GetBattlerAbility(gBattlerTarget) != ABILITY_IMMUNITY + && !(gBattleMons[gBattlerTarget].status1 & STATUS1_ANY) + && !IsAbilityStatusProtected(gBattlerTarget) + && IsMoveMakingContact(move, gBattlerAttacker) + && (Random() % 3) == 0) + { + gBattleScripting.moveEffect = MOVE_EFFECT_POISON; + PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + break; + } + break; + case ABILITYEFFECT_MOVE_END_OTHER: // Abilities that activate on *another* battler's moveend: Dancer, Soul-Heart, Receiver, Symbiosis + switch (GetBattlerAbility(battler)) + { + case ABILITY_DANCER: + if (IsBattlerAlive(battler) + && (gBattleMoves[gCurrentMove].flags & FLAG_DANCE) + && !gSpecialStatuses[battler].dancerUsedMove + && gBattlerAttacker != battler) + { + // Set bit and save Dancer mon's original target + gSpecialStatuses[battler].dancerUsedMove = 1; + gSpecialStatuses[battler].dancerOriginalTarget = *(gBattleStruct->moveTarget + battler) | 0x4; + gBattleStruct->atkCancellerTracker = 0; + gBattlerAttacker = gBattlerAbility = battler; + gCalledMove = gCurrentMove; + + // Set the target to the original target of the mon that first used a Dance move + gBattlerTarget = gBattleScripting.savedBattler & 0x3; + + // Make sure that the target isn't an ally - if it is, target the original user + if (GetBattlerSide(gBattlerTarget) == GetBattlerSide(gBattlerAttacker)) + gBattlerTarget = (gBattleScripting.savedBattler & 0xF0) >> 4; + gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); + BattleScriptExecute(BattleScript_DancerActivates); + effect++; + } + break; + } + break; + case ABILITYEFFECT_IMMUNITY: // 5 + for (battler = 0; battler < gBattlersCount; battler++) + { + switch (gBattleMons[battler].ability) + { + case ABILITY_IMMUNITY: + if (gBattleMons[battler].status1 & (STATUS1_POISON | STATUS1_TOXIC_POISON | STATUS1_TOXIC_COUNTER)) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); + effect = 1; + } + break; + case ABILITY_OWN_TEMPO: + if (gBattleMons[battler].status2 & STATUS2_CONFUSION) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); + effect = 2; + } + break; + case ABILITY_LIMBER: + if (gBattleMons[battler].status1 & STATUS1_PARALYSIS) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); + effect = 1; + } + break; + case ABILITY_INSOMNIA: + case ABILITY_VITAL_SPIRIT: + if (gBattleMons[battler].status1 & STATUS1_SLEEP) + { + gBattleMons[battler].status2 &= ~(STATUS2_NIGHTMARE); + StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); + effect = 1; + } + break; + case ABILITY_WATER_VEIL: + if (gBattleMons[battler].status1 & STATUS1_BURN) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); + effect = 1; + } + break; + case ABILITY_MAGMA_ARMOR: + if (gBattleMons[battler].status1 & STATUS1_FREEZE) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); + effect = 1; + } + break; + case ABILITY_OBLIVIOUS: + if (gBattleMons[battler].status2 & STATUS2_INFATUATION) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); + effect = 3; + } + break; + } + if (effect) + { + switch (effect) + { + case 1: // status cleared + gBattleMons[battler].status1 = 0; + break; + case 2: // get rid of confusion + gBattleMons[battler].status2 &= ~(STATUS2_CONFUSION); + break; + case 3: // get rid of infatuation + gBattleMons[battler].status2 &= ~(STATUS2_INFATUATION); + break; + } + + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_AbilityCuredStatus; + gBattleScripting.battler = gActiveBattler = gBattlerAbility = battler; + BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + MarkBattlerForControllerExec(gActiveBattler); + return effect; + } + } + break; + case ABILITYEFFECT_FORECAST: // 6 + for (battler = 0; battler < gBattlersCount; battler++) + { + if (gBattleMons[battler].ability == ABILITY_FORECAST || gBattleMons[battler].ability == ABILITY_FLOWER_GIFT) + { + effect = TryWeatherFormChange(battler); + if (effect) + { + BattleScriptPushCursorAndCallback(BattleScript_CastformChange); + gBattleScripting.battler = battler; + gBattleStruct->formToChangeInto = effect - 1; + return effect; + } + } + } + break; + case ABILITYEFFECT_SYNCHRONIZE: + if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT)) + { + gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT); + + if (!(gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY)) + { + gBattleStruct->synchronizeMoveEffect &= ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); + if (gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) + gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON; + + gBattleScripting.moveEffect = gBattleStruct->synchronizeMoveEffect + MOVE_EFFECT_AFFECTS_USER; + gBattleScripting.battler = gBattlerAbility = gBattlerTarget; + PREPARE_ABILITY_BUFFER(gBattleTextBuff1, ABILITY_SYNCHRONIZE); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_SynchronizeActivates; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + } + break; + case ABILITYEFFECT_ATK_SYNCHRONIZE: // 8 + if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT)) + { + gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT); + + if (!(gBattleMons[gBattlerTarget].status1 & STATUS1_ANY)) + { + gBattleStruct->synchronizeMoveEffect &= ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN); + if (gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) + gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON; + + gBattleScripting.moveEffect = gBattleStruct->synchronizeMoveEffect; + gBattleScripting.battler = gBattlerAbility = gBattlerAttacker; + PREPARE_ABILITY_BUFFER(gBattleTextBuff1, ABILITY_SYNCHRONIZE); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_SynchronizeActivates; + gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; + effect++; + } + } + break; + case ABILITYEFFECT_INTIMIDATE1: + case ABILITYEFFECT_INTIMIDATE2: + for (i = 0; i < gBattlersCount; i++) + { + if (gBattleMons[i].ability == ABILITY_INTIMIDATE && gBattleResources->flags->flags[i] & RESOURCE_FLAG_INTIMIDATED) + { + gLastUsedAbility = ABILITY_INTIMIDATE; + gBattleResources->flags->flags[i] &= ~(RESOURCE_FLAG_INTIMIDATED); + if (caseID == ABILITYEFFECT_INTIMIDATE1) + { + BattleScriptPushCursorAndCallback(BattleScript_IntimidateActivatesEnd3); + } + else + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_IntimidateActivates; + } + battler = gBattlerAbility = gBattleStruct->intimidateBattler = i; + effect++; + break; + } + } + break; + case ABILITYEFFECT_TRACE1: + case ABILITYEFFECT_TRACE2: + for (i = 0; i < gBattlersCount; i++) + { + if (gBattleMons[i].ability == ABILITY_TRACE && (gBattleResources->flags->flags[i] & RESOURCE_FLAG_TRACED)) + { + u8 side = (GetBattlerPosition(i) ^ BIT_SIDE) & BIT_SIDE; // side of the opposing pokemon + u8 target1 = GetBattlerAtPosition(side); + u8 target2 = GetBattlerAtPosition(side + BIT_FLANK); + + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + if (!sAbilitiesNotTraced[gBattleMons[target1].ability] && gBattleMons[target1].hp != 0 + && !sAbilitiesNotTraced[gBattleMons[target2].ability] && gBattleMons[target2].hp != 0) + gActiveBattler = GetBattlerAtPosition(((Random() & 1) * 2) | side), effect++; + else if (!sAbilitiesNotTraced[gBattleMons[target1].ability] && gBattleMons[target1].hp != 0) + gActiveBattler = target1, effect++; + else if (!sAbilitiesNotTraced[gBattleMons[target2].ability] && gBattleMons[target2].hp != 0) + gActiveBattler = target2, effect++; + } + else + { + if (!sAbilitiesNotTraced[gBattleMons[target1].ability] && gBattleMons[target1].hp != 0) + gActiveBattler = target1, effect++; + } + + if (effect) + { + if (caseID == ABILITYEFFECT_TRACE1) + { + BattleScriptPushCursorAndCallback(BattleScript_TraceActivatesEnd3); + } + else + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_TraceActivates; + } + gBattleResources->flags->flags[i] &= ~(RESOURCE_FLAG_TRACED); + gBattleStruct->tracedAbility[i] = gLastUsedAbility = gBattleMons[gActiveBattler].ability; + battler = gBattlerAbility = gBattleScripting.battler = i; + + PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBattler, gBattlerPartyIndexes[gActiveBattler]) + PREPARE_ABILITY_BUFFER(gBattleTextBuff2, gLastUsedAbility) + break; + } + } + } + break; } + if (effect && gLastUsedAbility != 0xFF) + RecordAbilityBattle(battler, gLastUsedAbility); + if (effect && caseID <= ABILITYEFFECT_MOVE_END) + gBattlerAbility = battler; + return effect; } +u32 GetBattlerAbility(u8 battlerId) +{ + if (gStatuses3[battlerId] & STATUS3_GASTRO_ACID) + return ABILITY_NONE; + else if ((((gBattleMons[gBattlerAttacker].ability == ABILITY_MOLD_BREAKER + || gBattleMons[gBattlerAttacker].ability == ABILITY_TERAVOLT + || gBattleMons[gBattlerAttacker].ability == ABILITY_TURBOBLAZE) + && !(gStatuses3[gBattlerAttacker] & STATUS3_GASTRO_ACID)) + || gBattleMoves[gCurrentMove].flags & FLAG_TARGET_ABILITY_IGNORED) + && sAbilitiesAffectedByMoldBreaker[gBattleMons[battlerId].ability] + && gBattlerByTurnOrder[gCurrentTurnActionNumber] == gBattlerAttacker + && gActionsByTurnOrder[gBattlerByTurnOrder[gBattlerAttacker]] == B_ACTION_USE_MOVE + && gCurrentTurnActionNumber < gBattlersCount) + return ABILITY_NONE; + else + return gBattleMons[battlerId].ability; +} + +u32 IsAbilityOnSide(u32 battlerId, u32 ability) +{ + if (IsBattlerAlive(battlerId) && GetBattlerAbility(battlerId) == ability) + return battlerId + 1; + else if (IsBattlerAlive(BATTLE_PARTNER(battlerId)) && GetBattlerAbility(BATTLE_PARTNER(battlerId)) == ability) + return BATTLE_PARTNER(battlerId) + 1; + else + return 0; +} + +u32 IsAbilityOnOpposingSide(u32 battlerId, u32 ability) +{ + return IsAbilityOnSide(BATTLE_OPPOSITE(battlerId), ability); +} + +u32 IsAbilityOnField(u32 ability) +{ + u32 i; + + for (i = 0; i < gBattlersCount; i++) + { + if (IsBattlerAlive(i) && GetBattlerAbility(i) == ability) + return i + 1; + } + + return 0; +} + +u32 IsAbilityOnFieldExcept(u32 battlerId, u32 ability) +{ + u32 i; + + for (i = 0; i < gBattlersCount; i++) + { + if (i != battlerId && IsBattlerAlive(i) && GetBattlerAbility(i) == ability) + return i + 1; + } + + return 0; +} + +u32 IsAbilityPreventingEscape(u32 battlerId) +{ + u32 id; + + if (B_GHOSTS_ESCAPE >= GEN_6 && IS_BATTLER_OF_TYPE(battlerId, TYPE_GHOST)) + return 0; + + if ((id = IsAbilityOnOpposingSide(battlerId, ABILITY_SHADOW_TAG)) && gBattleMons[battlerId].ability != ABILITY_SHADOW_TAG) + return id; + if ((id = IsAbilityOnOpposingSide(battlerId, ABILITY_ARENA_TRAP)) && IsBattlerGrounded(battlerId)) + return id; + if ((id = IsAbilityOnOpposingSide(battlerId, ABILITY_MAGNET_PULL)) && IS_BATTLER_OF_TYPE(battlerId, TYPE_STEEL)) + return id; + + return 0; +} + +bool32 CanBattlerEscape(u32 battlerId) // no ability check +{ + return (GetBattlerHoldEffect(battlerId, TRUE) == HOLD_EFFECT_SHED_SHELL + || !((gBattleMons[battlerId].status2 & (STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED)) + || (gStatuses3[battlerId] & STATUS3_ROOTED) + || gFieldStatuses & STATUS_FIELD_FAIRY_LOCK)); +} + void BattleScriptExecute(const u8 *BS_ptr) { gBattlescriptCurrInstr = BS_ptr; @@ -3161,78 +4890,347 @@ enum ITEM_STATS_CHANGE, // 5 }; +// second argument is 1/X of current hp compared to max hp +static bool32 HasEnoughHpToEatBerry(u32 battlerId, u32 hpFraction, u32 itemId) +{ + bool32 isBerry = (ItemId_GetPocket(itemId) == POCKET_BERRIES); + + if (gBattleMons[battlerId].hp == 0) + return FALSE; + // Unnerve prevents consumption of opponents' berries. + if (isBerry && IsAbilityOnOpposingSide(battlerId, ABILITY_UNNERVE)) + return FALSE; + if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / hpFraction) + return TRUE; + + if (hpFraction <= 4 && GetBattlerAbility(battlerId) == ABILITY_GLUTTONY && isBerry + && gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2) + { + RecordAbilityBattle(battlerId, ABILITY_GLUTTONY); + return TRUE; + } + + return FALSE; +} + +static u8 HealConfuseBerry(u32 battlerId, u32 itemId, u8 flavorId) +{ + if (HasEnoughHpToEatBerry(battlerId, 2, itemId)) + { + PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, flavorId); + + gBattleMoveDamage = gBattleMons[battlerId].maxHP / GetBattlerHoldEffectParam(battlerId); + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage *= -1; + if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, flavorId) < 0) + BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); + else + BattleScriptExecute(BattleScript_ItemHealHP_RemoveItemEnd2); + + return ITEM_HP_CHANGE; + } + return 0; +} + +static u8 StatRaiseBerry(u32 battlerId, u32 itemId, u32 statId) +{ + if (gBattleMons[battlerId].statStages[statId] < 0xC && HasEnoughHpToEatBerry(battlerId, GetBattlerHoldEffectParam(battlerId), itemId)) + { + PREPARE_STAT_BUFFER(gBattleTextBuff1, statId); + PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATROSE); + + gEffectBattler = battlerId; + SET_STATCHANGER(statId, 1, FALSE); + gBattleScripting.animArg1 = 0xE + statId; + gBattleScripting.animArg2 = 0; + BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); + return ITEM_STATS_CHANGE; + } + return 0; +} + +static u8 RandomStatRaiseBerry(u32 battlerId, u32 itemId) +{ + s32 i; + + for (i = 0; i < 5; i++) + { + if (gBattleMons[battlerId].statStages[STAT_ATK + i] < 0xC) + break; + } + if (i != 5 && HasEnoughHpToEatBerry(battlerId, GetBattlerHoldEffectParam(battlerId), itemId)) + { + do + { + i = Random() % 5; + } while (gBattleMons[battlerId].statStages[STAT_ATK + i] == 0xC); + + PREPARE_STAT_BUFFER(gBattleTextBuff1, i + 1); + + gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN; + gBattleTextBuff2[1] = B_BUFF_STRING; + gBattleTextBuff2[2] = STRINGID_STATSHARPLY; + gBattleTextBuff2[3] = STRINGID_STATSHARPLY >> 8; + gBattleTextBuff2[4] = B_BUFF_STRING; + gBattleTextBuff2[5] = STRINGID_STATROSE; + gBattleTextBuff2[6] = STRINGID_STATROSE >> 8; + gBattleTextBuff2[7] = EOS; + + gEffectBattler = battlerId; + SET_STATCHANGER(i + 1, 2, FALSE); + gBattleScripting.animArg1 = 0x21 + i + 6; + gBattleScripting.animArg2 = 0; + BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); + return ITEM_STATS_CHANGE; + } + return 0; +} + +static u8 ItemHealHp(u32 battlerId, u32 itemId, bool32 end2, bool32 percentHeal) +{ + if (HasEnoughHpToEatBerry(battlerId, 2, itemId)) + { + if (percentHeal) + gBattleMoveDamage = (gBattleMons[battlerId].maxHP * GetBattlerHoldEffectParam(battlerId) / 100) * -1; + else + gBattleMoveDamage = GetBattlerHoldEffectParam(battlerId) * -1; + + if (end2) + { + BattleScriptExecute(BattleScript_ItemHealHP_RemoveItemEnd2); + } + else + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ItemHealHP_RemoveItemRet; + } + return ITEM_HP_CHANGE; + } + return 0; +} + +static bool32 UnnerveOn(u32 battlerId, u32 itemId) +{ + if (ItemId_GetPocket(itemId) == POCKET_BERRIES && IsAbilityOnOpposingSide(battlerId, ABILITY_UNNERVE)) + return TRUE; + return FALSE; +} + u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) { - int i = 0; + int i = 0, moveType; u8 effect = ITEM_NO_EFFECT; u8 changedPP = 0; - u8 battlerHoldEffect, atkHoldEffect, defHoldEffect; - u8 battlerHoldEffectParam, atkHoldEffectParam, defHoldEffectParam; - u16 atkItem, defItem; + u8 battlerHoldEffect, atkHoldEffect; + u8 atkHoldEffectParam; + u16 atkItem; gLastUsedItem = gBattleMons[battlerId].item; - if (gLastUsedItem == ITEM_ENIGMA_BERRY) - { - battlerHoldEffect = gEnigmaBerries[battlerId].holdEffect; - battlerHoldEffectParam = gEnigmaBerries[battlerId].holdEffectParam; - } - else - { - battlerHoldEffect = ItemId_GetHoldEffect(gLastUsedItem); - battlerHoldEffectParam = ItemId_GetHoldEffectParam(gLastUsedItem); - } + battlerHoldEffect = GetBattlerHoldEffect(battlerId, TRUE); atkItem = gBattleMons[gBattlerAttacker].item; - if (atkItem == ITEM_ENIGMA_BERRY) - { - atkHoldEffect = gEnigmaBerries[gBattlerAttacker].holdEffect; - atkHoldEffectParam = gEnigmaBerries[gBattlerAttacker].holdEffectParam; - } - else - { - atkHoldEffect = ItemId_GetHoldEffect(atkItem); - atkHoldEffectParam = ItemId_GetHoldEffectParam(atkItem); - } - - // def variables are unused - defItem = gBattleMons[gBattlerTarget].item; - if (defItem == ITEM_ENIGMA_BERRY) - { - defHoldEffect = gEnigmaBerries[gBattlerTarget].holdEffect; - defHoldEffectParam = gEnigmaBerries[gBattlerTarget].holdEffectParam; - } - else - { - defHoldEffect = ItemId_GetHoldEffect(defItem); - defHoldEffectParam = ItemId_GetHoldEffectParam(defItem); - } + atkHoldEffect = GetBattlerHoldEffect(gBattlerAttacker, TRUE); + atkHoldEffectParam = GetBattlerHoldEffectParam(gBattlerAttacker); switch (caseID) { case ITEMEFFECT_ON_SWITCH_IN: - switch (battlerHoldEffect) + if (!gSpecialStatuses[battlerId].switchInItemDone) { - case HOLD_EFFECT_DOUBLE_PRIZE: - if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) - gBattleStruct->moneyMultiplier = 2; - break; - case HOLD_EFFECT_RESTORE_STATS: - for (i = 0; i < NUM_BATTLE_STATS; i++) + switch (battlerHoldEffect) { - if (gBattleMons[battlerId].statStages[i] < DEFAULT_STAT_STAGE) + case HOLD_EFFECT_DOUBLE_PRIZE: + if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) + gBattleStruct->moneyMultiplier *= 2; + break; + case HOLD_EFFECT_RESTORE_STATS: + for (i = 0; i < NUM_BATTLE_STATS; i++) { - gBattleMons[battlerId].statStages[i] = DEFAULT_STAT_STAGE; - effect = ITEM_STATS_CHANGE; + if (gBattleMons[battlerId].statStages[i] < DEFAULT_STAT_STAGE) + { + gBattleMons[battlerId].statStages[i] = DEFAULT_STAT_STAGE; + effect = ITEM_STATS_CHANGE; + } } + if (effect) + { + gBattleScripting.battler = battlerId; + gPotentialItemEffectBattler = battlerId; + gActiveBattler = gBattlerAttacker = battlerId; + BattleScriptExecute(BattleScript_WhiteHerbEnd2); + } + break; + case HOLD_EFFECT_CONFUSE_SPICY: + if (B_BERRIES_INSTANT >= GEN_4) + effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_SPICY); + break; + case HOLD_EFFECT_CONFUSE_DRY: + if (B_BERRIES_INSTANT >= GEN_4) + effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_DRY); + break; + case HOLD_EFFECT_CONFUSE_SWEET: + if (B_BERRIES_INSTANT >= GEN_4) + effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_SWEET); + break; + case HOLD_EFFECT_CONFUSE_BITTER: + if (B_BERRIES_INSTANT >= GEN_4) + effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_BITTER); + break; + case HOLD_EFFECT_CONFUSE_SOUR: + if (B_BERRIES_INSTANT >= GEN_4) + effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_SOUR); + break; + case HOLD_EFFECT_ATTACK_UP: + if (B_BERRIES_INSTANT >= GEN_4) + effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_ATK); + break; + case HOLD_EFFECT_DEFENSE_UP: + if (B_BERRIES_INSTANT >= GEN_4) + effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_DEF); + break; + case HOLD_EFFECT_SPEED_UP: + if (B_BERRIES_INSTANT >= GEN_4) + effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPEED); + break; + case HOLD_EFFECT_SP_ATTACK_UP: + if (B_BERRIES_INSTANT >= GEN_4) + effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPATK); + break; + case HOLD_EFFECT_SP_DEFENSE_UP: + if (B_BERRIES_INSTANT >= GEN_4) + effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPDEF); + break; + case HOLD_EFFECT_CRITICAL_UP: + if (B_BERRIES_INSTANT >= GEN_4 && !(gBattleMons[battlerId].status2 & STATUS2_FOCUS_ENERGY) && HasEnoughHpToEatBerry(battlerId, GetBattlerHoldEffectParam(battlerId), gLastUsedItem)) + { + gBattleMons[battlerId].status2 |= STATUS2_FOCUS_ENERGY; + BattleScriptExecute(BattleScript_BerryFocusEnergyEnd2); + effect = ITEM_EFFECT_OTHER; + } + break; + case HOLD_EFFECT_RANDOM_STAT_UP: + if (B_BERRIES_INSTANT >= GEN_4) + effect = RandomStatRaiseBerry(battlerId, gLastUsedItem); + break; + case HOLD_EFFECT_CURE_PAR: + if (B_BERRIES_INSTANT >= GEN_4 && gBattleMons[battlerId].status1 & STATUS1_PARALYSIS && !UnnerveOn(battlerId, gLastUsedItem)) + { + gBattleMons[battlerId].status1 &= ~(STATUS1_PARALYSIS); + BattleScriptExecute(BattleScript_BerryCurePrlzEnd2); + effect = ITEM_STATUS_CHANGE; + } + break; + case HOLD_EFFECT_CURE_PSN: + if (B_BERRIES_INSTANT >= GEN_4 && gBattleMons[battlerId].status1 & STATUS1_PSN_ANY && !UnnerveOn(battlerId, gLastUsedItem)) + { + gBattleMons[battlerId].status1 &= ~(STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER); + BattleScriptExecute(BattleScript_BerryCurePsnEnd2); + effect = ITEM_STATUS_CHANGE; + } + break; + case HOLD_EFFECT_CURE_BRN: + if (B_BERRIES_INSTANT >= GEN_4 && gBattleMons[battlerId].status1 & STATUS1_BURN && !UnnerveOn(battlerId, gLastUsedItem)) + { + gBattleMons[battlerId].status1 &= ~(STATUS1_BURN); + BattleScriptExecute(BattleScript_BerryCureBrnEnd2); + effect = ITEM_STATUS_CHANGE; + } + break; + case HOLD_EFFECT_CURE_FRZ: + if (B_BERRIES_INSTANT >= GEN_4 && gBattleMons[battlerId].status1 & STATUS1_FREEZE && !UnnerveOn(battlerId, gLastUsedItem)) + { + gBattleMons[battlerId].status1 &= ~(STATUS1_FREEZE); + BattleScriptExecute(BattleScript_BerryCureFrzEnd2); + effect = ITEM_STATUS_CHANGE; + } + break; + case HOLD_EFFECT_CURE_SLP: + if (B_BERRIES_INSTANT >= GEN_4 && gBattleMons[battlerId].status1 & STATUS1_SLEEP && !UnnerveOn(battlerId, gLastUsedItem)) + { + gBattleMons[battlerId].status1 &= ~(STATUS1_SLEEP); + gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE); + BattleScriptExecute(BattleScript_BerryCureSlpEnd2); + effect = ITEM_STATUS_CHANGE; + } + break; + case HOLD_EFFECT_CURE_STATUS: + if (B_BERRIES_INSTANT >= GEN_4 && (gBattleMons[battlerId].status1 & STATUS1_ANY || gBattleMons[battlerId].status2 & STATUS2_CONFUSION) && !UnnerveOn(battlerId, gLastUsedItem)) + { + i = 0; + if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); + i++; + } + if (gBattleMons[battlerId].status1 & STATUS1_SLEEP) + { + gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE); + StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); + i++; + } + if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); + i++; + } + if (gBattleMons[battlerId].status1 & STATUS1_BURN) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); + i++; + } + if (gBattleMons[battlerId].status1 & STATUS1_FREEZE) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); + i++; + } + if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); + i++; + } + if (!(i > 1)) + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + else + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleMons[battlerId].status1 = 0; + gBattleMons[battlerId].status2 &= ~(STATUS2_CONFUSION); + BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2); + effect = ITEM_STATUS_CHANGE; + } + break; + case HOLD_EFFECT_RESTORE_HP: + if (B_BERRIES_INSTANT >= GEN_4) + effect = ItemHealHp(battlerId, gLastUsedItem, TRUE, FALSE); + break; + case HOLD_EFFECT_RESTORE_PCT_HP: + if (B_BERRIES_INSTANT >= GEN_4) + effect = ItemHealHp(battlerId, gLastUsedItem, TRUE, TRUE); + break; + case HOLD_EFFECT_AIR_BALLOON: + effect = ITEM_EFFECT_OTHER; + gBattleScripting.battler = battlerId; + BattleScriptPushCursorAndCallback(BattleScript_AirBaloonMsgIn); + RecordItemEffectBattle(battlerId, HOLD_EFFECT_AIR_BALLOON); + break; } + if (effect) { - gBattleScripting.battler = battlerId; - gPotentialItemEffectBattler = battlerId; - gActiveBattler = gBattlerAttacker = battlerId; - BattleScriptExecute(BattleScript_WhiteHerbEnd2); + gSpecialStatuses[battlerId].switchInItemDone = 1; + gActiveBattler = gBattlerAttacker = gPotentialItemEffectBattler = gBattleScripting.battler = battlerId; + switch (effect) + { + case ITEM_STATUS_CHANGE: + BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battlerId].status1); + MarkBattlerForControllerExec(gActiveBattler); + break; + case ITEM_PP_CHANGE: + if (!(gBattleMons[battlerId].status2 & STATUS2_TRANSFORMED) && !(gDisableStructs[battlerId].mimickedMoves & gBitTable[i])) + gBattleMons[battlerId].pp[i] = changedPP; + break; + } } - break; } break; case 1: @@ -3241,15 +5239,12 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) switch (battlerHoldEffect) { case HOLD_EFFECT_RESTORE_HP: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn) - { - gBattleMoveDamage = battlerHoldEffectParam; - if (gBattleMons[battlerId].hp + battlerHoldEffectParam > gBattleMons[battlerId].maxHP) - gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp; - gBattleMoveDamage *= -1; - BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); - effect = 4; - } + if (!moveTurn) + effect = ItemHealHp(battlerId, gLastUsedItem, TRUE, FALSE); + break; + case HOLD_EFFECT_RESTORE_PCT_HP: + if (B_BERRIES_INSTANT >= GEN_4) + effect = ItemHealHp(battlerId, gLastUsedItem, TRUE, TRUE); break; case HOLD_EFFECT_RESTORE_PP: if (!moveTurn) @@ -3273,10 +5268,10 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) if (i != MAX_MON_MOVES) { u8 maxPP = CalculatePPWithBonus(move, ppBonuses, i); - if (changedPP + battlerHoldEffectParam > maxPP) + if (changedPP + GetBattlerHoldEffectParam(battlerId) > maxPP) changedPP = maxPP; else - changedPP = changedPP + battlerHoldEffectParam; + changedPP = changedPP + GetBattlerHoldEffectParam(battlerId); PREPARE_MOVE_BUFFER(gBattleTextBuff1, move); @@ -3290,9 +5285,9 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) case HOLD_EFFECT_RESTORE_STATS: for (i = 0; i < NUM_BATTLE_STATS; i++) { - if (gBattleMons[battlerId].statStages[i] < DEFAULT_STAT_STAGE) + if (gBattleMons[battlerId].statStages[i] < 6) { - gBattleMons[battlerId].statStages[i] = DEFAULT_STAT_STAGE; + gBattleMons[battlerId].statStages[i] = 6; effect = ITEM_STATS_CHANGE; } } @@ -3304,186 +5299,76 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) BattleScriptExecute(BattleScript_WhiteHerbEnd2); } break; + case HOLD_EFFECT_BLACK_SLUDGE: + if (IS_BATTLER_OF_TYPE(battlerId, TYPE_POISON)) + goto LEFTOVERS; + case HOLD_EFFECT_STICKY_BARB: + if (!moveTurn) + { + gBattleMoveDamage = gBattleMons[battlerId].maxHP / 8; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + BattleScriptExecute(BattleScript_ItemHurtEnd2); + effect = ITEM_HP_CHANGE; + RecordItemEffectBattle(battlerId, battlerHoldEffect); + PREPARE_ITEM_BUFFER(gBattleTextBuff1, gLastUsedItem); + } + break; case HOLD_EFFECT_LEFTOVERS: + LEFTOVERS: if (gBattleMons[battlerId].hp < gBattleMons[battlerId].maxHP && !moveTurn) { gBattleMoveDamage = gBattleMons[battlerId].maxHP / 16; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; - if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) - gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp; gBattleMoveDamage *= -1; BattleScriptExecute(BattleScript_ItemHealHP_End2); effect = ITEM_HP_CHANGE; RecordItemEffectBattle(battlerId, battlerHoldEffect); } break; - // nice copy/paste there gamefreak, making a function for confuse berries was too much eh? case HOLD_EFFECT_CONFUSE_SPICY: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn) - { - PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SPICY); - - gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) - gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp; - gBattleMoveDamage *= -1; - if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, FLAVOR_SPICY) < 0) - BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); - else - BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); - effect = ITEM_HP_CHANGE; - } + if (!moveTurn) + effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_SPICY); break; case HOLD_EFFECT_CONFUSE_DRY: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn) - { - PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_DRY); - - gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) - gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp; - gBattleMoveDamage *= -1; - if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, FLAVOR_DRY) < 0) - BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); - else - BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); - effect = ITEM_HP_CHANGE; - } + if (!moveTurn) + effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_DRY); break; case HOLD_EFFECT_CONFUSE_SWEET: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn) - { - PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SWEET); - - gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) - gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp; - gBattleMoveDamage *= -1; - if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, FLAVOR_SWEET) < 0) - BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); - else - BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); - effect = ITEM_HP_CHANGE; - } + if (!moveTurn) + effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_SWEET); break; case HOLD_EFFECT_CONFUSE_BITTER: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn) - { - PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_BITTER); - - gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) - gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp; - gBattleMoveDamage *= -1; - if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, FLAVOR_BITTER) < 0) - BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); - else - BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); - effect = ITEM_HP_CHANGE; - } + if (!moveTurn) + effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_BITTER); break; case HOLD_EFFECT_CONFUSE_SOUR: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn) - { - PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SOUR); - - gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) - gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp; - gBattleMoveDamage *= -1; - if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, FLAVOR_SOUR) < 0) - BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); - else - BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); - effect = ITEM_HP_CHANGE; - } + if (!moveTurn) + effect = HealConfuseBerry(battlerId, gLastUsedItem, FLAVOR_SOUR); break; - // copy/paste again, smh case HOLD_EFFECT_ATTACK_UP: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam - && !moveTurn && gBattleMons[battlerId].statStages[STAT_ATK] < MAX_STAT_STAGE) - { - PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK); - PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATROSE); - - gEffectBattler = battlerId; - SET_STATCHANGER(STAT_ATK, 1, FALSE); - gBattleScripting.animArg1 = 0xE + STAT_ATK; - gBattleScripting.animArg2 = 0; - BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); - effect = ITEM_STATS_CHANGE; - } + if (!moveTurn) + effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_ATK); break; case HOLD_EFFECT_DEFENSE_UP: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn - && gBattleMons[battlerId].statStages[STAT_DEF] < MAX_STAT_STAGE) - { - PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_DEF); - - gEffectBattler = battlerId; - SET_STATCHANGER(STAT_DEF, 1, FALSE); - gBattleScripting.animArg1 = 0xE + STAT_DEF; - gBattleScripting.animArg2 = 0; - BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); - effect = ITEM_STATS_CHANGE; - } + if (!moveTurn) + effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_DEF); break; case HOLD_EFFECT_SPEED_UP: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn - && gBattleMons[battlerId].statStages[STAT_SPEED] < MAX_STAT_STAGE) - { - PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPEED); - - gEffectBattler = battlerId; - SET_STATCHANGER(STAT_SPEED, 1, FALSE); - gBattleScripting.animArg1 = 0xE + STAT_SPEED; - gBattleScripting.animArg2 = 0; - BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); - effect = ITEM_STATS_CHANGE; - } + if (!moveTurn) + effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPEED); break; case HOLD_EFFECT_SP_ATTACK_UP: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn - && gBattleMons[battlerId].statStages[STAT_SPATK] < MAX_STAT_STAGE) - { - PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPATK); - - gEffectBattler = battlerId; - SET_STATCHANGER(STAT_SPATK, 1, FALSE); - gBattleScripting.animArg1 = 0xE + STAT_SPATK; - gBattleScripting.animArg2 = 0; - BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); - effect = ITEM_STATS_CHANGE; - } + if (!moveTurn) + effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPATK); break; case HOLD_EFFECT_SP_DEFENSE_UP: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn - && gBattleMons[battlerId].statStages[STAT_SPDEF] < MAX_STAT_STAGE) - { - PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPDEF); - - gEffectBattler = battlerId; - SET_STATCHANGER(STAT_SPDEF, 1, FALSE); - gBattleScripting.animArg1 = 0xE + STAT_SPDEF; - gBattleScripting.animArg2 = 0; - BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); - effect = ITEM_STATS_CHANGE; - } + if (!moveTurn) + effect = StatRaiseBerry(battlerId, gLastUsedItem, STAT_SPDEF); break; case HOLD_EFFECT_CRITICAL_UP: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn - && !(gBattleMons[battlerId].status2 & STATUS2_FOCUS_ENERGY)) + if (!moveTurn && !(gBattleMons[battlerId].status2 & STATUS2_FOCUS_ENERGY) && HasEnoughHpToEatBerry(battlerId, GetBattlerHoldEffectParam(battlerId), gLastUsedItem)) { gBattleMons[battlerId].status2 |= STATUS2_FOCUS_ENERGY; BattleScriptExecute(BattleScript_BerryFocusEnergyEnd2); @@ -3491,42 +5376,11 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_RANDOM_STAT_UP: - if (!moveTurn && gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam) - { - for (i = 0; i < 5; i++) - { - if (gBattleMons[battlerId].statStages[STAT_ATK + i] < MAX_STAT_STAGE) - break; - } - if (i != 5) - { - do - { - i = Random() % 5; - } while (gBattleMons[battlerId].statStages[STAT_ATK + i] == MAX_STAT_STAGE); - - PREPARE_STAT_BUFFER(gBattleTextBuff1, i + 1); - - gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN; - gBattleTextBuff2[1] = B_BUFF_STRING; - gBattleTextBuff2[2] = STRINGID_STATSHARPLY; - gBattleTextBuff2[3] = STRINGID_STATSHARPLY >> 8; - gBattleTextBuff2[4] = B_BUFF_STRING; - gBattleTextBuff2[5] = STRINGID_STATROSE; - gBattleTextBuff2[6] = STRINGID_STATROSE >> 8; - gBattleTextBuff2[7] = EOS; - - gEffectBattler = battlerId; - SET_STATCHANGER(i + 1, 2, FALSE); - gBattleScripting.animArg1 = 0x21 + i + 6; - gBattleScripting.animArg2 = 0; - BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); - effect = ITEM_STATS_CHANGE; - } - } + if (!moveTurn) + effect = RandomStatRaiseBerry(battlerId, gLastUsedItem); break; case HOLD_EFFECT_CURE_PAR: - if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS) + if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS && !UnnerveOn(battlerId, gLastUsedItem)) { gBattleMons[battlerId].status1 &= ~(STATUS1_PARALYSIS); BattleScriptExecute(BattleScript_BerryCurePrlzEnd2); @@ -3534,7 +5388,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_CURE_PSN: - if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY) + if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY && !UnnerveOn(battlerId, gLastUsedItem)) { gBattleMons[battlerId].status1 &= ~(STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER); BattleScriptExecute(BattleScript_BerryCurePsnEnd2); @@ -3542,7 +5396,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_CURE_BRN: - if (gBattleMons[battlerId].status1 & STATUS1_BURN) + if (gBattleMons[battlerId].status1 & STATUS1_BURN && !UnnerveOn(battlerId, gLastUsedItem)) { gBattleMons[battlerId].status1 &= ~(STATUS1_BURN); BattleScriptExecute(BattleScript_BerryCureBrnEnd2); @@ -3550,7 +5404,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_CURE_FRZ: - if (gBattleMons[battlerId].status1 & STATUS1_FREEZE) + if (gBattleMons[battlerId].status1 & STATUS1_FREEZE && !UnnerveOn(battlerId, gLastUsedItem)) { gBattleMons[battlerId].status1 &= ~(STATUS1_FREEZE); BattleScriptExecute(BattleScript_BerryCureFrzEnd2); @@ -3558,7 +5412,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_CURE_SLP: - if (gBattleMons[battlerId].status1 & STATUS1_SLEEP) + if (gBattleMons[battlerId].status1 & STATUS1_SLEEP && !UnnerveOn(battlerId, gLastUsedItem)) { gBattleMons[battlerId].status1 &= ~(STATUS1_SLEEP); gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE); @@ -3567,7 +5421,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_CURE_CONFUSION: - if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION) + if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION && !UnnerveOn(battlerId, gLastUsedItem)) { gBattleMons[battlerId].status2 &= ~(STATUS2_CONFUSION); BattleScriptExecute(BattleScript_BerryCureConfusionEnd2); @@ -3575,7 +5429,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_CURE_STATUS: - if (gBattleMons[battlerId].status1 & STATUS1_ANY || gBattleMons[battlerId].status2 & STATUS2_CONFUSION) + if ((gBattleMons[battlerId].status1 & STATUS1_ANY || gBattleMons[battlerId].status2 & STATUS2_CONFUSION) && !UnnerveOn(battlerId, gLastUsedItem)) { i = 0; if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY) @@ -3630,11 +5484,10 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; } + if (effect) { - gBattleScripting.battler = battlerId; - gPotentialItemEffectBattler = battlerId; - gActiveBattler = gBattlerAttacker = battlerId; + gActiveBattler = gBattlerAttacker = gPotentialItemEffectBattler = gBattleScripting.battler = battlerId; switch (effect) { case ITEM_STATUS_CHANGE: @@ -3649,26 +5502,23 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } } break; - case 2: - break; case ITEMEFFECT_MOVE_END: for (battlerId = 0; battlerId < gBattlersCount; battlerId++) { gLastUsedItem = gBattleMons[battlerId].item; - if (gBattleMons[battlerId].item == ITEM_ENIGMA_BERRY) - { - battlerHoldEffect = gEnigmaBerries[battlerId].holdEffect; - battlerHoldEffectParam = gEnigmaBerries[battlerId].holdEffectParam; - } - else - { - battlerHoldEffect = ItemId_GetHoldEffect(gLastUsedItem); - battlerHoldEffectParam = ItemId_GetHoldEffectParam(gLastUsedItem); - } + battlerHoldEffect = GetBattlerHoldEffect(battlerId, TRUE); switch (battlerHoldEffect) { + case HOLD_EFFECT_RESTORE_HP: + if (B_HP_BERRIES >= GEN_4) + effect = ItemHealHp(battlerId, gLastUsedItem, FALSE, FALSE); + break; + case HOLD_EFFECT_RESTORE_PCT_HP: + if (B_BERRIES_INSTANT >= GEN_4) + effect = ItemHealHp(battlerId, gLastUsedItem, FALSE, TRUE); + break; case HOLD_EFFECT_CURE_PAR: - if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS) + if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS && !UnnerveOn(battlerId, gLastUsedItem)) { gBattleMons[battlerId].status1 &= ~(STATUS1_PARALYSIS); BattleScriptPushCursor(); @@ -3677,7 +5527,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_CURE_PSN: - if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY) + if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY && !UnnerveOn(battlerId, gLastUsedItem)) { gBattleMons[battlerId].status1 &= ~(STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER); BattleScriptPushCursor(); @@ -3686,7 +5536,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_CURE_BRN: - if (gBattleMons[battlerId].status1 & STATUS1_BURN) + if (gBattleMons[battlerId].status1 & STATUS1_BURN && !UnnerveOn(battlerId, gLastUsedItem)) { gBattleMons[battlerId].status1 &= ~(STATUS1_BURN); BattleScriptPushCursor(); @@ -3695,7 +5545,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_CURE_FRZ: - if (gBattleMons[battlerId].status1 & STATUS1_FREEZE) + if (gBattleMons[battlerId].status1 & STATUS1_FREEZE && !UnnerveOn(battlerId, gLastUsedItem)) { gBattleMons[battlerId].status1 &= ~(STATUS1_FREEZE); BattleScriptPushCursor(); @@ -3704,7 +5554,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_CURE_SLP: - if (gBattleMons[battlerId].status1 & STATUS1_SLEEP) + if (gBattleMons[battlerId].status1 & STATUS1_SLEEP && !UnnerveOn(battlerId, gLastUsedItem)) { gBattleMons[battlerId].status1 &= ~(STATUS1_SLEEP); gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE); @@ -3714,7 +5564,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_CURE_CONFUSION: - if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION) + if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION && !UnnerveOn(battlerId, gLastUsedItem)) { gBattleMons[battlerId].status2 &= ~(STATUS2_CONFUSION); BattleScriptPushCursor(); @@ -3734,7 +5584,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_CURE_STATUS: - if (gBattleMons[battlerId].status1 & STATUS1_ANY || gBattleMons[battlerId].status2 & STATUS2_CONFUSION) + if ((gBattleMons[battlerId].status1 & STATUS1_ANY || gBattleMons[battlerId].status2 & STATUS2_CONFUSION) && !UnnerveOn(battlerId, gLastUsedItem)) { if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY) { @@ -3788,13 +5638,15 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; } + if (effect) { - gBattleScripting.battler = battlerId; - gPotentialItemEffectBattler = battlerId; - gActiveBattler = battlerId; - BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); - MarkBattlerForControllerExec(gActiveBattler); + gActiveBattler = gPotentialItemEffectBattler = gBattleScripting.battler = battlerId; + if (effect == ITEM_STATUS_CHANGE) + { + BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + MarkBattlerForControllerExec(gActiveBattler); + } break; } } @@ -3811,7 +5663,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) && gBattleMoves[gCurrentMove].flags & FLAG_KINGSROCK_AFFECTED && gBattleMons[gBattlerTarget].hp) { - gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_FLINCH; + gBattleScripting.moveEffect = MOVE_EFFECT_FLINCH; BattleScriptPushCursor(); SetMoveEffect(FALSE, 0); BattleScriptPop(); @@ -3840,8 +5692,133 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } } break; + case ITEMEFFECT_TARGET: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + { + GET_MOVE_TYPE(gCurrentMove, moveType); + switch (battlerHoldEffect) + { + case HOLD_EFFECT_AIR_BALLOON: + if (TARGET_TURN_DAMAGED) + { + effect = ITEM_EFFECT_OTHER; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_AirBaloonMsgPop; + } + break; + case HOLD_EFFECT_ROCKY_HELMET: + if (TARGET_TURN_DAMAGED + && IsMoveMakingContact(gCurrentMove, gBattlerAttacker) + && IsBattlerAlive(gBattlerAttacker) + && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) + { + gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 6; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + effect = ITEM_HP_CHANGE; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_RockyHelmetActivates; + PREPARE_ITEM_BUFFER(gBattleTextBuff1, gLastUsedItem); + RecordItemEffectBattle(battlerId, HOLD_EFFECT_ROCKY_HELMET); + } + break; + case HOLD_EFFECT_WEAKNESS_POLICY: + if (IsBattlerAlive(battlerId) + && TARGET_TURN_DAMAGED + && gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) + { + effect = ITEM_STATS_CHANGE; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_WeaknessPolicy; + } + break; + case HOLD_EFFECT_SNOWBALL: + if (IsBattlerAlive(battlerId) + && TARGET_TURN_DAMAGED + && moveType == TYPE_ICE) + { + effect = ITEM_STATS_CHANGE; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_TargetItemStatRaise; + gBattleScripting.statChanger = SET_STATCHANGER(STAT_ATK, 1, FALSE); + } + break; + case HOLD_EFFECT_LUMINOUS_MOSS: + if (IsBattlerAlive(battlerId) + && TARGET_TURN_DAMAGED + && moveType == TYPE_WATER) + { + effect = ITEM_STATS_CHANGE; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_TargetItemStatRaise; + gBattleScripting.statChanger = SET_STATCHANGER(STAT_SPDEF, 1, FALSE); + } + break; + case HOLD_EFFECT_CELL_BATTERY: + if (IsBattlerAlive(battlerId) + && TARGET_TURN_DAMAGED + && moveType == TYPE_ELECTRIC) + { + effect = ITEM_STATS_CHANGE; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_TargetItemStatRaise; + gBattleScripting.statChanger = SET_STATCHANGER(STAT_ATK, 1, FALSE); + } + break; + case HOLD_EFFECT_ABSORB_BULB: + if (IsBattlerAlive(battlerId) + && TARGET_TURN_DAMAGED + && moveType == TYPE_WATER) + { + effect = ITEM_STATS_CHANGE; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_TargetItemStatRaise; + gBattleScripting.statChanger = SET_STATCHANGER(STAT_SPATK, 1, FALSE); + } + break; + } + } + break; + case ITEMEFFECT_ORBS: + switch (battlerHoldEffect) + { + case HOLD_EFFECT_TOXIC_ORB: + if (!gBattleMons[battlerId].status1 + && CanPoisonType(battlerId, battlerId) + && GetBattlerAbility(battlerId) != ABILITY_IMMUNITY) + { + effect = ITEM_STATUS_CHANGE; + gBattleMons[battlerId].status1 = STATUS1_TOXIC_POISON; + BattleScriptExecute(BattleScript_ToxicOrb); + RecordItemEffectBattle(battlerId, battlerHoldEffect); + } + break; + case HOLD_EFFECT_FLAME_ORB: + if (!gBattleMons[battlerId].status1 + && !IS_BATTLER_OF_TYPE(battlerId, TYPE_FIRE) + && GetBattlerAbility(battlerId) != ABILITY_WATER_VEIL) + { + effect = ITEM_STATUS_CHANGE; + gBattleMons[battlerId].status1 = STATUS1_BURN; + BattleScriptExecute(BattleScript_FlameOrb); + RecordItemEffectBattle(battlerId, battlerHoldEffect); + } + break; + } + + if (effect == ITEM_STATUS_CHANGE) + { + gActiveBattler = battlerId; + BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battlerId].status1); + MarkBattlerForControllerExec(gActiveBattler); + } + break; } + // Berry was successfully used on a Pokemon. + if (effect && (gLastUsedItem >= FIRST_BERRY_INDEX && gLastUsedItem <= LAST_BERRY_INDEX)) + gBattleStruct->ateBerry[battlerId & BIT_SIDE] |= gBitTable[gBattlerPartyIndexes[battlerId]]; + return effect; } @@ -3858,11 +5835,33 @@ void HandleAction_RunBattleScript(void) // identical to RunBattleScriptCommands gBattleScriptingCommandsTable[*gBattlescriptCurrInstr](); } +u32 SetRandomTarget(u32 battlerId) +{ + u32 target; + static const u8 targets[2][2] = + { + [B_SIDE_PLAYER] = {B_POSITION_OPPONENT_LEFT, B_POSITION_OPPONENT_RIGHT}, + [B_SIDE_OPPONENT] = {B_POSITION_PLAYER_LEFT, B_POSITION_PLAYER_RIGHT}, + }; + + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + target = GetBattlerAtPosition(targets[GetBattlerSide(battlerId)][Random() % 2]); + if (!IsBattlerAlive(target)) + target ^= BIT_FLANK; + } + else + { + target = GetBattlerAtPosition(targets[GetBattlerSide(battlerId)][0]); + } + + return target; +} + u8 GetMoveTarget(u16 move, u8 setTarget) { u8 targetBattler = 0; - u8 moveTarget; - u8 side; + u32 i, moveTarget, side; if (setTarget) moveTarget = setTarget - 1; @@ -3874,22 +5873,28 @@ u8 GetMoveTarget(u16 move, u8 setTarget) case MOVE_TARGET_SELECTED: side = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE; if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp) + { targetBattler = gSideTimers[side].followmeTarget; + } else { - side = GetBattlerSide(gBattlerAttacker); - do - { - targetBattler = Random() % gBattlersCount; - } while (targetBattler == gBattlerAttacker || side == GetBattlerSide(targetBattler) || gAbsentBattlerFlags & gBitTable[targetBattler]); + targetBattler = SetRandomTarget(gBattlerAttacker); if (gBattleMoves[move].type == TYPE_ELECTRIC - && AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIDE, gBattlerAttacker, ABILITY_LIGHTNING_ROD, 0, 0) + && IsAbilityOnOpposingSide(gBattlerAttacker, ABILITY_LIGHTNING_ROD) && gBattleMons[targetBattler].ability != ABILITY_LIGHTNING_ROD) { targetBattler ^= BIT_FLANK; RecordAbilityBattle(targetBattler, gBattleMons[targetBattler].ability); gSpecialStatuses[targetBattler].lightningRodRedirected = 1; } + else if (gBattleMoves[move].type == TYPE_WATER + && IsAbilityOnOpposingSide(gBattlerAttacker, ABILITY_STORM_DRAIN) + && gBattleMons[targetBattler].ability != ABILITY_STORM_DRAIN) + { + targetBattler ^= BIT_FLANK; + RecordAbilityBattle(targetBattler, gBattleMons[targetBattler].ability); + gSpecialStatuses[targetBattler].stormDrainRedirected = 1; + } } break; case MOVE_TARGET_DEPENDS: @@ -3897,7 +5902,7 @@ u8 GetMoveTarget(u16 move, u8 setTarget) case MOVE_TARGET_FOES_AND_ALLY: case MOVE_TARGET_OPPONENTS_FIELD: targetBattler = GetBattlerAtPosition((GetBattlerPosition(gBattlerAttacker) & BIT_SIDE) ^ BIT_SIDE); - if (gAbsentBattlerFlags & gBitTable[targetBattler]) + if (!IsBattlerAlive(targetBattler)) targetBattler ^= BIT_FLANK; break; case MOVE_TARGET_RANDOM: @@ -3905,31 +5910,21 @@ u8 GetMoveTarget(u16 move, u8 setTarget) if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp) targetBattler = gSideTimers[side].followmeTarget; else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && moveTarget & MOVE_TARGET_RANDOM) - { - if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) - { - if (Random() & 1) - targetBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); - else - targetBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); - } - else - { - if (Random() & 1) - targetBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - else - targetBattler = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); - } - if (gAbsentBattlerFlags & gBitTable[targetBattler]) - targetBattler ^= BIT_FLANK; - } + targetBattler = SetRandomTarget(gBattlerAttacker); else targetBattler = GetBattlerAtPosition((GetBattlerPosition(gBattlerAttacker) & BIT_SIDE) ^ BIT_SIDE); break; case MOVE_TARGET_USER_OR_SELECTED: case MOVE_TARGET_USER: + default: targetBattler = gBattlerAttacker; break; + case MOVE_TARGET_ALLY: + if (IsBattlerAlive(BATTLE_PARTNER(gBattlerAttacker))) + targetBattler = BATTLE_PARTNER(gBattlerAttacker); + else + targetBattler = gBattlerAttacker; + break; } *(gBattleStruct->moveTarget + gBattlerAttacker) = targetBattler; @@ -4045,7 +6040,7 @@ u8 IsMonDisobedient(void) calc -= obedienceLevel; if (calc < obedienceLevel) { - gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerAttacker], MOVE_POUND, 0, 40, 0, gBattlerAttacker, gBattlerAttacker); + gBattleMoveDamage = CalculateMoveDamage(MOVE_NONE, gBattlerAttacker, gBattlerAttacker, TYPE_MYSTERY, 40, FALSE, FALSE, TRUE); gBattlerTarget = gBattlerAttacker; gBattlescriptCurrInstr = BattleScript_IgnoresAndHitsItself; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; @@ -4059,3 +6054,1610 @@ u8 IsMonDisobedient(void) } } } + +u32 GetBattlerHoldEffect(u8 battlerId, bool32 checkNegating) +{ + if (checkNegating) + { + if (gStatuses3[battlerId] & STATUS3_EMBARGO) + return HOLD_EFFECT_NONE; + if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM) + return HOLD_EFFECT_NONE; + if (gBattleMons[battlerId].ability == ABILITY_KLUTZ && !(gStatuses3[battlerId] & STATUS3_GASTRO_ACID)) + return HOLD_EFFECT_NONE; + } + + gPotentialItemEffectBattler = battlerId; + + if (USE_BATTLE_DEBUG && gBattleStruct->debugHoldEffects[battlerId] != 0 && gBattleMons[battlerId].item) + return gBattleStruct->debugHoldEffects[battlerId]; + else if (gBattleMons[battlerId].item == ITEM_ENIGMA_BERRY) + return gEnigmaBerries[battlerId].holdEffect; + else + return ItemId_GetHoldEffect(gBattleMons[battlerId].item); +} + +u32 GetBattlerHoldEffectParam(u8 battlerId) +{ + if (gBattleMons[battlerId].item == ITEM_ENIGMA_BERRY) + return gEnigmaBerries[battlerId].holdEffectParam; + else + return ItemId_GetHoldEffectParam(gBattleMons[battlerId].item); +} + +bool32 IsMoveMakingContact(u16 move, u8 battlerAtk) +{ + if (!(gBattleMoves[move].flags & FLAG_MAKES_CONTACT)) + return FALSE; + else if (GetBattlerAbility(battlerAtk) == ABILITY_LONG_REACH) + return FALSE; + else if (GetBattlerHoldEffect(battlerAtk, TRUE) == HOLD_EFFECT_PROTECTIVE_PADS) + return FALSE; + else + return TRUE; +} + +bool32 IsBattlerGrounded(u8 battlerId) +{ + if (GetBattlerHoldEffect(battlerId, TRUE) == HOLD_EFFECT_IRON_BALL) + return TRUE; + else if (gFieldStatuses & STATUS_FIELD_GRAVITY) + return TRUE; + else if (gStatuses3[battlerId] & STATUS3_ROOTED) + return TRUE; + else if (gStatuses3[battlerId] & STATUS3_SMACKED_DOWN) + return TRUE; + + else if (gStatuses3[battlerId] & STATUS3_TELEKINESIS) + return FALSE; + else if (gStatuses3[battlerId] & STATUS3_MAGNET_RISE) + return FALSE; + else if (GetBattlerHoldEffect(battlerId, TRUE) == HOLD_EFFECT_AIR_BALLOON) + return FALSE; + else if (GetBattlerAbility(battlerId) == ABILITY_LEVITATE) + return FALSE; + else if (IS_BATTLER_OF_TYPE(battlerId, TYPE_FLYING)) + return FALSE; + + else + return TRUE; +} + +bool32 IsBattlerAlive(u8 battlerId) +{ + if (gBattleMons[battlerId].hp == 0) + return FALSE; + else if (battlerId >= gBattlersCount) + return FALSE; + else if (gAbsentBattlerFlags & gBitTable[battlerId]) + return FALSE; + else + return TRUE; +} + +u8 GetBattleMonMoveSlot(struct BattlePokemon *battleMon, u16 move) +{ + u8 i; + + for (i = 0; i < 4; i++) + { + if (battleMon->moves[i] == move) + break; + } + return i; +} + +u32 GetBattlerWeight(u8 battlerId) +{ + u32 i; + u32 weight = GetPokedexHeightWeight(SpeciesToNationalPokedexNum(gBattleMons[battlerId].species), 1); + u32 ability = GetBattlerAbility(battlerId); + u32 holdEffect = GetBattlerHoldEffect(battlerId, TRUE); + + if (ability == ABILITY_HEAVY_METAL) + weight *= 2; + else if (ability == ABILITY_LIGHT_METAL) + weight /= 2; + + if (holdEffect == HOLD_EFFECT_FLOAT_STONE) + weight /= 2; + + for (i = 0; i < gDisableStructs[battlerId].autotomizeCount; i++) + { + if (weight > 1000) + { + weight -= 1000; + } + else if (weight <= 1000) + { + weight = 1; + break; + } + } + + if (weight == 0) + weight = 1; + + return weight; +} + +u32 CountBattlerStatIncreases(u8 battlerId, bool32 countEvasionAcc) +{ + u32 i; + u32 count = 0; + + for (i = 0; i < NUM_BATTLE_STATS; i++) + { + if ((i == STAT_ACC || i == STAT_EVASION) && !countEvasionAcc) + continue; + if (gBattleMons[battlerId].statStages[i] > 6) // Stat is increased. + count += gBattleMons[battlerId].statStages[i] - 6; + } + + return count; +} + +u32 GetMoveTargetCount(u16 move, u8 battlerAtk, u8 battlerDef) +{ + switch (gBattleMoves[move].target) + { + case MOVE_TARGET_BOTH: + return IsBattlerAlive(battlerDef) + + IsBattlerAlive(BATTLE_PARTNER(battlerDef)); + case MOVE_TARGET_FOES_AND_ALLY: + return IsBattlerAlive(battlerDef) + + IsBattlerAlive(BATTLE_PARTNER(battlerDef)) + + IsBattlerAlive(BATTLE_PARTNER(battlerAtk)); + case MOVE_TARGET_OPPONENTS_FIELD: + return 1; + case MOVE_TARGET_DEPENDS: + case MOVE_TARGET_SELECTED: + case MOVE_TARGET_RANDOM: + case MOVE_TARGET_USER_OR_SELECTED: + return IsBattlerAlive(battlerDef); + case MOVE_TARGET_USER: + return IsBattlerAlive(battlerAtk); + default: + return 0; + } +} + +static void MulModifier(u16 *modifier, u16 val) +{ + *modifier = UQ_4_12_TO_INT((*modifier * val) + UQ_4_12_ROUND); +} + +static u32 ApplyModifier(u16 modifier, u32 val) +{ + return UQ_4_12_TO_INT((modifier * val) + UQ_4_12_ROUND); +} + +static const u8 sFlailHpScaleToPowerTable[] = +{ + 1, 200, + 4, 150, + 9, 100, + 16, 80, + 32, 40, + 48, 20 +}; + +// format: min. weight (hectograms), base power +static const u16 sWeightToDamageTable[] = +{ + 100, 20, + 250, 40, + 500, 60, + 1000, 80, + 2000, 100, + 0xFFFF, 0xFFFF +}; + +static const u8 sSpeedDiffPowerTable[] = {40, 60, 80, 120, 150}; +static const u8 sHeatCrushPowerTable[] = {40, 40, 60, 80, 100, 120}; +static const u8 sTrumpCardPowerTable[] = {200, 80, 60, 50, 40}; + +const struct TypePower gNaturalGiftTable[] = +{ + [ITEM_TO_BERRY(ITEM_CHERI_BERRY)] = {TYPE_FIRE, 80}, + [ITEM_TO_BERRY(ITEM_CHESTO_BERRY)] = {TYPE_WATER, 80}, + [ITEM_TO_BERRY(ITEM_PECHA_BERRY)] = {TYPE_ELECTRIC, 80}, + [ITEM_TO_BERRY(ITEM_RAWST_BERRY)] = {TYPE_GRASS, 80}, + [ITEM_TO_BERRY(ITEM_ASPEAR_BERRY)] = {TYPE_ICE, 80}, + [ITEM_TO_BERRY(ITEM_LEPPA_BERRY)] = {TYPE_FIGHTING, 80}, + [ITEM_TO_BERRY(ITEM_ORAN_BERRY)] = {TYPE_POISON, 80}, + [ITEM_TO_BERRY(ITEM_PERSIM_BERRY)] = {TYPE_GROUND, 80}, + [ITEM_TO_BERRY(ITEM_LUM_BERRY)] = {TYPE_FLYING, 80}, + [ITEM_TO_BERRY(ITEM_SITRUS_BERRY)] = {TYPE_PSYCHIC, 80}, + [ITEM_TO_BERRY(ITEM_FIGY_BERRY)] = {TYPE_BUG, 80}, + [ITEM_TO_BERRY(ITEM_WIKI_BERRY)] = {TYPE_ROCK, 80}, + [ITEM_TO_BERRY(ITEM_MAGO_BERRY)] = {TYPE_GHOST, 80}, + [ITEM_TO_BERRY(ITEM_AGUAV_BERRY)] = {TYPE_DRAGON, 80}, + [ITEM_TO_BERRY(ITEM_IAPAPA_BERRY)] = {TYPE_DARK, 80}, + [ITEM_TO_BERRY(ITEM_RAZZ_BERRY)] = {TYPE_STEEL, 80}, + [ITEM_TO_BERRY(ITEM_OCCA_BERRY)] = {TYPE_FIRE, 80}, + [ITEM_TO_BERRY(ITEM_PASSHO_BERRY)] = {TYPE_WATER, 80}, + [ITEM_TO_BERRY(ITEM_WACAN_BERRY)] = {TYPE_ELECTRIC, 80}, + [ITEM_TO_BERRY(ITEM_RINDO_BERRY)] = {TYPE_GRASS, 80}, + [ITEM_TO_BERRY(ITEM_YACHE_BERRY)] = {TYPE_ICE, 80}, + [ITEM_TO_BERRY(ITEM_CHOPLE_BERRY)] = {TYPE_FIGHTING, 80}, + [ITEM_TO_BERRY(ITEM_KEBIA_BERRY)] = {TYPE_POISON, 80}, + [ITEM_TO_BERRY(ITEM_SHUCA_BERRY)] = {TYPE_GROUND, 80}, + [ITEM_TO_BERRY(ITEM_COBA_BERRY)] = {TYPE_FLYING, 80}, + [ITEM_TO_BERRY(ITEM_PAYAPA_BERRY)] = {TYPE_PSYCHIC, 80}, + [ITEM_TO_BERRY(ITEM_TANGA_BERRY)] = {TYPE_BUG, 80}, + [ITEM_TO_BERRY(ITEM_CHARTI_BERRY)] = {TYPE_ROCK, 80}, + [ITEM_TO_BERRY(ITEM_KASIB_BERRY)] = {TYPE_GHOST, 80}, + [ITEM_TO_BERRY(ITEM_HABAN_BERRY)] = {TYPE_DRAGON, 80}, + [ITEM_TO_BERRY(ITEM_COLBUR_BERRY)] = {TYPE_DARK, 80}, + [ITEM_TO_BERRY(ITEM_BABIRI_BERRY)] = {TYPE_STEEL, 80}, + [ITEM_TO_BERRY(ITEM_CHILAN_BERRY)] = {TYPE_NORMAL, 80}, + [ITEM_TO_BERRY(ITEM_ROSELI_BERRY)] = {TYPE_FAIRY, 80}, + [ITEM_TO_BERRY(ITEM_BLUK_BERRY)] = {TYPE_FIRE, 90}, + [ITEM_TO_BERRY(ITEM_NANAB_BERRY)] = {TYPE_WATER, 90}, + [ITEM_TO_BERRY(ITEM_WEPEAR_BERRY)] = {TYPE_ELECTRIC, 90}, + [ITEM_TO_BERRY(ITEM_PINAP_BERRY)] = {TYPE_GRASS, 90}, + [ITEM_TO_BERRY(ITEM_POMEG_BERRY)] = {TYPE_ICE, 90}, + [ITEM_TO_BERRY(ITEM_KELPSY_BERRY)] = {TYPE_FIGHTING, 90}, + [ITEM_TO_BERRY(ITEM_QUALOT_BERRY)] = {TYPE_POISON, 90}, + [ITEM_TO_BERRY(ITEM_HONDEW_BERRY)] = {TYPE_GROUND, 90}, + [ITEM_TO_BERRY(ITEM_GREPA_BERRY)] = {TYPE_FLYING, 90}, + [ITEM_TO_BERRY(ITEM_TAMATO_BERRY)] = {TYPE_PSYCHIC, 90}, + [ITEM_TO_BERRY(ITEM_CORNN_BERRY)] = {TYPE_BUG, 90}, + [ITEM_TO_BERRY(ITEM_MAGOST_BERRY)] = {TYPE_ROCK, 90}, + [ITEM_TO_BERRY(ITEM_RABUTA_BERRY)] = {TYPE_GHOST, 90}, + [ITEM_TO_BERRY(ITEM_NOMEL_BERRY)] = {TYPE_DRAGON, 90}, + [ITEM_TO_BERRY(ITEM_SPELON_BERRY)] = {TYPE_DARK, 90}, + [ITEM_TO_BERRY(ITEM_PAMTRE_BERRY)] = {TYPE_STEEL, 90}, + [ITEM_TO_BERRY(ITEM_WATMEL_BERRY)] = {TYPE_FIRE, 100}, + [ITEM_TO_BERRY(ITEM_DURIN_BERRY)] = {TYPE_WATER, 100}, + [ITEM_TO_BERRY(ITEM_BELUE_BERRY)] = {TYPE_ELECTRIC, 100}, + [ITEM_TO_BERRY(ITEM_LIECHI_BERRY)] = {TYPE_GRASS, 100}, + [ITEM_TO_BERRY(ITEM_GANLON_BERRY)] = {TYPE_ICE, 100}, + [ITEM_TO_BERRY(ITEM_SALAC_BERRY)] = {TYPE_FIGHTING, 100}, + [ITEM_TO_BERRY(ITEM_PETAYA_BERRY)] = {TYPE_POISON, 100}, + [ITEM_TO_BERRY(ITEM_APICOT_BERRY)] = {TYPE_GROUND, 100}, + [ITEM_TO_BERRY(ITEM_LANSAT_BERRY)] = {TYPE_FLYING, 100}, + [ITEM_TO_BERRY(ITEM_STARF_BERRY)] = {TYPE_PSYCHIC, 100}, + [ITEM_TO_BERRY(ITEM_ENIGMA_BERRY)] = {TYPE_BUG, 100}, + [ITEM_TO_BERRY(ITEM_MICLE_BERRY)] = {TYPE_ROCK, 100}, + [ITEM_TO_BERRY(ITEM_CUSTAP_BERRY)] = {TYPE_GHOST, 100}, + [ITEM_TO_BERRY(ITEM_JABOCA_BERRY)] = {TYPE_DRAGON, 100}, + [ITEM_TO_BERRY(ITEM_ROWAP_BERRY)] = {TYPE_DARK, 100}, + [ITEM_TO_BERRY(ITEM_KEE_BERRY)] = {TYPE_FAIRY, 100}, + [ITEM_TO_BERRY(ITEM_MARANGA_BERRY)] = {TYPE_DARK, 100}, +}; + +static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) +{ + u32 i; + u16 basePower = gBattleMoves[move].power; + u32 weight, hpFraction, speed; + + switch (gBattleMoves[move].effect) + { + case EFFECT_PLEDGE: + // todo + break; + case EFFECT_FLING: + // todo: program Fling + Unburden interaction + break; + case EFFECT_ERUPTION: + basePower = gBattleMons[battlerAtk].hp * basePower / gBattleMons[battlerAtk].maxHP; + break; + case EFFECT_FLAIL: + hpFraction = GetScaledHPFraction(gBattleMons[battlerAtk].hp, gBattleMons[battlerAtk].maxHP, 48); + for (i = 0; i < sizeof(sFlailHpScaleToPowerTable); i += 2) + { + if (hpFraction <= sFlailHpScaleToPowerTable[i]) + break; + } + basePower = sFlailHpScaleToPowerTable[i + 1]; + break; + case EFFECT_RETURN: + basePower = 10 * (gBattleMons[battlerAtk].friendship) / 25; + break; + case EFFECT_FRUSTRATION: + basePower = 10 * (255 - gBattleMons[battlerAtk].friendship) / 25; + break; + case EFFECT_FURY_CUTTER: + for (i = 1; i < gDisableStructs[battlerAtk].furyCutterCounter; i++) + basePower *= 2; + break; + case EFFECT_ROLLOUT: + for (i = 1; i < (5 - gDisableStructs[battlerAtk].rolloutTimer); i++) + basePower *= 2; + if (gBattleMons[battlerAtk].status2 & STATUS2_DEFENSE_CURL) + basePower *= 2; + break; + case EFFECT_MAGNITUDE: + basePower = gBattleStruct->magnitudeBasePower; + break; + case EFFECT_PRESENT: + basePower = gBattleStruct->presentBasePower; + break; + case EFFECT_TRIPLE_KICK: + basePower += gBattleScripting.tripleKickPower; + break; + case EFFECT_SPIT_UP: + basePower = 100 * gDisableStructs[battlerAtk].stockpileCounter; + break; + case EFFECT_REVENGE: + if ((gProtectStructs[battlerAtk].physicalDmg + && gProtectStructs[battlerAtk].physicalBattlerId == battlerDef) + || (gProtectStructs[battlerAtk].specialDmg + && gProtectStructs[battlerAtk].specialBattlerId == battlerDef)) + basePower *= 2; + break; + case EFFECT_WEATHER_BALL: + if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_ANY) + basePower *= 2; + break; + case EFFECT_PURSUIT: + if (gActionsByTurnOrder[GetBattlerTurnOrderNum(gBattlerTarget)] == B_ACTION_SWITCH) + basePower *= 2; + break; + case EFFECT_NATURAL_GIFT: + basePower = gNaturalGiftTable[ITEM_TO_BERRY(gBattleMons[battlerAtk].item)].power; + break; + case EFFECT_WAKE_UP_SLAP: + if (gBattleMons[battlerDef].status1 & STATUS1_SLEEP || GetBattlerAbility(battlerDef) == ABILITY_COMATOSE) + basePower *= 2; + break; + case EFFECT_SMELLINGSALT: + if (gBattleMons[battlerDef].status1 & STATUS1_PARALYSIS) + basePower *= 2; + break; + case EFFECT_WRING_OUT: + basePower = 120 * gBattleMons[battlerDef].hp / gBattleMons[battlerDef].maxHP; + break; + case EFFECT_HEX: + if (gBattleMons[battlerDef].status1 & STATUS1_ANY || GetBattlerAbility(battlerDef) == ABILITY_COMATOSE) + basePower *= 2; + break; + case EFFECT_ASSURANCE: + if (gProtectStructs[battlerDef].physicalDmg != 0 || gProtectStructs[battlerDef].specialDmg != 0 || gProtectStructs[battlerDef].confusionSelfDmg != 0) + basePower *= 2; + break; + case EFFECT_TRUMP_CARD: + i = GetBattleMonMoveSlot(&gBattleMons[battlerAtk], move); + if (i != 4) + { + if (gBattleMons[battlerAtk].pp[i] >= ARRAY_COUNT(sTrumpCardPowerTable)) + basePower = sTrumpCardPowerTable[ARRAY_COUNT(sTrumpCardPowerTable) - 1]; + else + basePower = sTrumpCardPowerTable[i]; + } + break; + case EFFECT_ACROBATICS: + if (gBattleMons[battlerAtk].item == ITEM_NONE + // Edge case, because removal of items happens after damage calculation. + || (gSpecialStatuses[battlerAtk].gemBoost && GetBattlerHoldEffect(battlerAtk, FALSE) == HOLD_EFFECT_GEMS)) + basePower *= 2; + break; + case EFFECT_LOW_KICK: + weight = GetBattlerWeight(battlerDef); + for (i = 0; sWeightToDamageTable[i] != 0xFFFF; i += 2) + { + if (sWeightToDamageTable[i] > weight) + break; + } + if (sWeightToDamageTable[i] != 0xFFFF) + basePower = sWeightToDamageTable[i + 1]; + else + basePower = 120; + break; + case EFFECT_HEAT_CRASH: + weight = GetBattlerWeight(battlerAtk) / GetBattlerWeight(battlerDef); + if (weight >= ARRAY_COUNT(sHeatCrushPowerTable)) + basePower = sHeatCrushPowerTable[ARRAY_COUNT(sHeatCrushPowerTable) - 1]; + else + basePower = sHeatCrushPowerTable[i]; + break; + case EFFECT_PUNISHMENT: + basePower = 60 + (CountBattlerStatIncreases(battlerDef, FALSE) * 20); + if (basePower > 200) + basePower = 200; + break; + case EFFECT_STORED_POWER: + basePower += (CountBattlerStatIncreases(battlerAtk, TRUE) * 20); + break; + case EFFECT_ELECTRO_BALL: + speed = GetBattlerTotalSpeedStat(battlerAtk) / GetBattlerTotalSpeedStat(battlerDef); + if (speed >= ARRAY_COUNT(sSpeedDiffPowerTable)) + speed = ARRAY_COUNT(sSpeedDiffPowerTable) - 1; + basePower = sSpeedDiffPowerTable[speed]; + break; + case EFFECT_GYRO_BALL: + basePower = ((25 * GetBattlerTotalSpeedStat(battlerDef)) / GetBattlerTotalSpeedStat(battlerAtk)) + 1; + if (basePower > 150) + basePower = 150; + break; + case EFFECT_ECHOED_VOICE: + if (gFieldTimers.echoVoiceCounter != 0) + { + if (gFieldTimers.echoVoiceCounter >= 5) + basePower *= 5; + else + basePower *= gFieldTimers.echoVoiceCounter; + } + break; + case EFFECT_PAYBACK: + if (GetBattlerTurnOrderNum(battlerAtk) > GetBattlerTurnOrderNum(battlerDef) + && (gDisableStructs[battlerDef].isFirstTurn != 2 || B_PAYBACK_SWITCH_BOOST < GEN_5)) + basePower *= 2; + break; + case EFFECT_ROUND: + if (gChosenMoveByBattler[BATTLE_PARTNER(battlerAtk)] == MOVE_ROUND && !(gAbsentBattlerFlags & gBitTable[BATTLE_PARTNER(battlerAtk)])) + basePower *= 2; + break; + case EFFECT_FUSION_COMBO: + if (gBattleMoves[gLastUsedMove].effect == EFFECT_FUSION_COMBO && move != gLastUsedMove) + basePower *= 2; + break; + } + + if (basePower == 0) + basePower = 1; + return basePower; +} + +static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, bool32 updateFlags) +{ + u32 i, ability; + u32 holdEffectAtk, holdEffectParamAtk; + u16 basePower = CalcMoveBasePower(move, battlerAtk, battlerDef); + u16 holdEffectModifier; + u16 modifier = UQ_4_12(1.0); + + // attacker's abilities + switch (GetBattlerAbility(battlerAtk)) + { + case ABILITY_TECHNICIAN: + if (basePower <= 60) + MulModifier(&modifier, UQ_4_12(1.5)); + break; + case ABILITY_FLARE_BOOST: + if (gBattleMons[battlerAtk].status1 & STATUS1_BURN && IS_MOVE_SPECIAL(move)) + MulModifier(&modifier, UQ_4_12(1.5)); + break; + case ABILITY_TOXIC_BOOST: + if (gBattleMons[battlerAtk].status1 & STATUS1_PSN_ANY && IS_MOVE_PHYSICAL(move)) + MulModifier(&modifier, UQ_4_12(1.5)); + break; + case ABILITY_RECKLESS: + if (gBattleMoves[move].flags & FLAG_RECKLESS_BOOST) + MulModifier(&modifier, UQ_4_12(1.2)); + break; + case ABILITY_IRON_FIST: + if (gBattleMoves[move].flags & FLAG_IRON_FIST_BOOST) + MulModifier(&modifier, UQ_4_12(1.2)); + break; + case ABILITY_SHEER_FORCE: + if (gBattleMoves[move].flags & FLAG_SHEER_FORCE_BOOST) + MulModifier(&modifier, UQ_4_12(1.3)); + break; + case ABILITY_SAND_FORCE: + if (moveType == TYPE_STEEL || moveType == TYPE_ROCK || moveType == TYPE_GROUND) + MulModifier(&modifier, UQ_4_12(1.3)); + break; + case ABILITY_RIVALRY: + if (GetGenderFromSpeciesAndPersonality(gBattleMons[battlerAtk].species, gBattleMons[battlerAtk].personality) != MON_GENDERLESS + && GetGenderFromSpeciesAndPersonality(gBattleMons[battlerDef].species, gBattleMons[battlerDef].personality) != MON_GENDERLESS) + { + if (GetGenderFromSpeciesAndPersonality(gBattleMons[battlerAtk].species, gBattleMons[battlerAtk].personality) + == GetGenderFromSpeciesAndPersonality(gBattleMons[battlerDef].species, gBattleMons[battlerDef].personality)) + MulModifier(&modifier, UQ_4_12(1.25)); + else + MulModifier(&modifier, UQ_4_12(0.75)); + } + break; + case ABILITY_ANALYTIC: + if (GetBattlerTurnOrderNum(battlerAtk) == gBattlersCount - 1 && move != MOVE_FUTURE_SIGHT && move != MOVE_DOOM_DESIRE) + MulModifier(&modifier, UQ_4_12(1.3)); + break; + case ABILITY_TOUGH_CLAWS: + if (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + MulModifier(&modifier, UQ_4_12(1.3)); + break; + case ABILITY_STRONG_JAW: + if (gBattleMoves[move].flags & FLAG_STRONG_JAW_BOOST) + MulModifier(&modifier, UQ_4_12(1.5)); + break; + case ABILITY_MEGA_LAUNCHER: + if (gBattleMoves[move].flags & FLAG_MEGA_LAUNCHER_BOOST) + MulModifier(&modifier, UQ_4_12(1.5)); + break; + case ABILITY_WATER_BUBBLE: + if (moveType == TYPE_WATER) + MulModifier(&modifier, UQ_4_12(2.0)); + break; + case ABILITY_STEELWORKER: + if (moveType == TYPE_STEEL) + MulModifier(&modifier, UQ_4_12(1.5)); + break; + case ABILITY_PIXILATE: + if (moveType == TYPE_FAIRY && gBattleStruct->ateBoost[battlerAtk]) + MulModifier(&modifier, UQ_4_12(1.2)); + break; + case ABILITY_GALVANIZE: + if (moveType == TYPE_ELECTRIC && gBattleStruct->ateBoost[battlerAtk]) + MulModifier(&modifier, UQ_4_12(1.2)); + break; + case ABILITY_REFRIGERATE: + if (moveType == TYPE_ICE && gBattleStruct->ateBoost[battlerAtk]) + MulModifier(&modifier, UQ_4_12(1.2)); + break; + case ABILITY_AERILATE: + if (moveType == TYPE_FLYING && gBattleStruct->ateBoost[battlerAtk]) + MulModifier(&modifier, UQ_4_12(1.2)); + break; + case ABILITY_NORMALIZE: + if (moveType == TYPE_NORMAL && gBattleStruct->ateBoost[battlerAtk]) + MulModifier(&modifier, UQ_4_12(1.2)); + break; + } + + // field abilities + if ((IsAbilityOnField(ABILITY_DARK_AURA) && moveType == TYPE_DARK) + || (IsAbilityOnField(ABILITY_FAIRY_AURA) && moveType == TYPE_FAIRY)) + { + if (IsAbilityOnField(ABILITY_AURA_BREAK)) + MulModifier(&modifier, UQ_4_12(0.75)); + else + MulModifier(&modifier, UQ_4_12(1.25)); + } + + // attacker partner's abilities + if (IsBattlerAlive(BATTLE_PARTNER(battlerAtk))) + { + switch (GetBattlerAbility(BATTLE_PARTNER(battlerAtk))) + { + case ABILITY_BATTERY: + if (IS_MOVE_SPECIAL(move)) + MulModifier(&modifier, UQ_4_12(1.3)); + break; + } + } + + // target's abilities + ability = GetBattlerAbility(battlerDef); + switch (ability) + { + case ABILITY_HEATPROOF: + case ABILITY_WATER_BUBBLE: + if (moveType == TYPE_FIRE) + { + MulModifier(&modifier, UQ_4_12(0.5)); + if (updateFlags) + RecordAbilityBattle(battlerDef, ability); + } + break; + case ABILITY_DRY_SKIN: + if (moveType == TYPE_FIRE) + MulModifier(&modifier, UQ_4_12(1.25)); + break; + case ABILITY_FLUFFY: + if (IsMoveMakingContact(move, battlerAtk)) + { + MulModifier(&modifier, UQ_4_12(0.5)); + if (updateFlags) + RecordAbilityBattle(battlerDef, ability); + } + if (moveType == TYPE_FIRE) + MulModifier(&modifier, UQ_4_12(2.0)); + break; + } + + holdEffectAtk = GetBattlerHoldEffect(battlerAtk, TRUE); + holdEffectParamAtk = GetBattlerHoldEffectParam(battlerAtk); + if (holdEffectParamAtk > 100) + holdEffectParamAtk = 100; + + holdEffectModifier = UQ_4_12(1.0) + sPercentToModifier[holdEffectParamAtk]; + + // attacker's hold effect + switch (holdEffectAtk) + { + case HOLD_EFFECT_MUSCLE_BAND: + if (IS_MOVE_PHYSICAL(move)) + MulModifier(&modifier, holdEffectModifier); + break; + case HOLD_EFFECT_WISE_GLASSES: + if (IS_MOVE_SPECIAL(move)) + MulModifier(&modifier, holdEffectModifier); + break; + case HOLD_EFFECT_LUSTROUS_ORB: + if (gBattleMons[battlerAtk].species == SPECIES_PALKIA && (moveType == TYPE_WATER || moveType == TYPE_DRAGON)) + MulModifier(&modifier, holdEffectModifier); + break; + case HOLD_EFFECT_ADAMANT_ORB: + if (gBattleMons[battlerAtk].species == SPECIES_DIALGA && (moveType == TYPE_STEEL || moveType == TYPE_DRAGON)) + MulModifier(&modifier, holdEffectModifier); + break; + case HOLD_EFFECT_GRISEOUS_ORB: + if (gBattleMons[battlerAtk].species == SPECIES_GIRATINA && (moveType == TYPE_GHOST || moveType == TYPE_DRAGON)) + MulModifier(&modifier, holdEffectModifier); + break; + case HOLD_EFFECT_SOUL_DEW: + if ((gBattleMons[battlerAtk].species == SPECIES_LATIAS || gBattleMons[battlerAtk].species == SPECIES_LATIOS) && !(gBattleTypeFlags & BATTLE_TYPE_FRONTIER)) + MulModifier(&modifier, holdEffectModifier); + break; + case HOLD_EFFECT_GEMS: + if (gSpecialStatuses[battlerAtk].gemBoost && gBattleMons[battlerAtk].item) + MulModifier(&modifier, UQ_4_12(1.0) + sPercentToModifier[gSpecialStatuses[battlerAtk].gemParam]); + break; + case HOLD_EFFECT_BUG_POWER: + case HOLD_EFFECT_STEEL_POWER: + case HOLD_EFFECT_GROUND_POWER: + case HOLD_EFFECT_ROCK_POWER: + case HOLD_EFFECT_GRASS_POWER: + case HOLD_EFFECT_DARK_POWER: + case HOLD_EFFECT_FIGHTING_POWER: + case HOLD_EFFECT_ELECTRIC_POWER: + case HOLD_EFFECT_WATER_POWER: + case HOLD_EFFECT_FLYING_POWER: + case HOLD_EFFECT_POISON_POWER: + case HOLD_EFFECT_ICE_POWER: + case HOLD_EFFECT_GHOST_POWER: + case HOLD_EFFECT_PSYCHIC_POWER: + case HOLD_EFFECT_FIRE_POWER: + case HOLD_EFFECT_DRAGON_POWER: + case HOLD_EFFECT_NORMAL_POWER: + case HOLD_EFFECT_FAIRY_POWER: + for (i = 0; i < ARRAY_COUNT(sHoldEffectToType); i++) + { + if (holdEffectAtk == sHoldEffectToType[i][0]) + { + if (moveType == sHoldEffectToType[i][1]) + MulModifier(&modifier, holdEffectModifier); + break; + } + } + break; + } + + // move effect + switch (gBattleMoves[move].effect) + { + case EFFECT_FACADE: + if (gBattleMons[battlerAtk].status1 & (STATUS1_BURN | STATUS1_PSN_ANY | STATUS1_PARALYSIS)) + MulModifier(&modifier, UQ_4_12(2.0)); + break; + case EFFECT_BRINE: + if (gBattleMons[battlerDef].hp <= (gBattleMons[battlerDef].maxHP / 2)) + MulModifier(&modifier, UQ_4_12(2.0)); + break; + case EFFECT_VENOSHOCK: + if (gBattleMons[battlerAtk].status1 & STATUS1_PSN_ANY) + MulModifier(&modifier, UQ_4_12(2.0)); + break; + case EFFECT_RETALITATE: + // todo + break; + case EFFECT_SOLARBEAM: + if (WEATHER_HAS_EFFECT && gBattleWeather & (WEATHER_HAIL_ANY | WEATHER_SANDSTORM_ANY | WEATHER_RAIN_ANY)) + MulModifier(&modifier, UQ_4_12(0.5)); + break; + case EFFECT_STOMPING_TANTRUM: + if (gBattleStruct->lastMoveFailed & gBitTable[battlerAtk]) + MulModifier(&modifier, UQ_4_12(2.0)); + break; + case EFFECT_BULLDOZE: + case EFFECT_MAGNITUDE: + case EFFECT_EARTHQUAKE: + if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && !(gStatuses3[battlerDef] & STATUS3_SEMI_INVULNERABLE)) + MulModifier(&modifier, UQ_4_12(0.5)); + break; + case EFFECT_KNOCK_OFF: + if (gBattleMons[battlerDef].item != ITEM_NONE && GetBattlerAbility(battlerDef) != ABILITY_STICKY_HOLD) + MulModifier(&modifier, UQ_4_12(1.5)); + break; + } + + // various effecs + if (gProtectStructs[battlerAtk].helpingHand) + MulModifier(&modifier, UQ_4_12(1.5)); + if (gStatuses3[battlerAtk] & STATUS3_CHARGED_UP && moveType == TYPE_ELECTRIC) + MulModifier(&modifier, UQ_4_12(2.0)); + if (gStatuses3[battlerAtk] & STATUS3_ME_FIRST) + MulModifier(&modifier, UQ_4_12(1.5)); + if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && moveType == TYPE_GRASS && IsBattlerGrounded(battlerAtk) && !(gStatuses3[battlerAtk] & STATUS3_SEMI_INVULNERABLE)) + MulModifier(&modifier, (B_TERRAIN_TYPE_BOOST >= GEN_8) ? UQ_4_12(1.3) : UQ_4_12(1.5)); + if (gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN && moveType == TYPE_DRAGON && IsBattlerGrounded(battlerDef) && !(gStatuses3[battlerDef] & STATUS3_SEMI_INVULNERABLE)) + MulModifier(&modifier, UQ_4_12(0.5)); + if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && moveType == TYPE_ELECTRIC && IsBattlerGrounded(battlerAtk) && !(gStatuses3[battlerAtk] & STATUS3_SEMI_INVULNERABLE)) + MulModifier(&modifier, (B_TERRAIN_TYPE_BOOST >= GEN_8) ? UQ_4_12(1.3) : UQ_4_12(1.5)); + if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN && moveType == TYPE_PSYCHIC && IsBattlerGrounded(battlerAtk) && !(gStatuses3[battlerAtk] & STATUS3_SEMI_INVULNERABLE)) + MulModifier(&modifier, (B_TERRAIN_TYPE_BOOST >= GEN_8) ? UQ_4_12(1.3) : UQ_4_12(1.5)); + + return ApplyModifier(modifier, basePower); +} + +static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, bool32 isCrit, bool32 updateFlags) +{ + u8 atkStage; + u32 atkStat; + u16 modifier; + + if (gBattleMoves[move].effect == EFFECT_FOUL_PLAY) + { + if (IS_MOVE_PHYSICAL(move)) + { + atkStat = gBattleMons[battlerDef].attack; + atkStage = gBattleMons[battlerDef].statStages[STAT_ATK]; + } + else + { + atkStat = gBattleMons[battlerDef].spAttack; + atkStage = gBattleMons[battlerDef].statStages[STAT_SPATK]; + } + } + else + { + if (IS_MOVE_PHYSICAL(move)) + { + atkStat = gBattleMons[battlerAtk].attack; + atkStage = gBattleMons[battlerAtk].statStages[STAT_ATK]; + } + else + { + atkStat = gBattleMons[battlerAtk].spAttack; + atkStage = gBattleMons[battlerAtk].statStages[STAT_SPATK]; + } + } + + // critical hits ignore attack stat's stage drops + if (isCrit && atkStage < 6) + atkStage = 6; + // pokemon with unaware ignore attack stat changes while taking damage + if (GetBattlerAbility(battlerDef) == ABILITY_UNAWARE) + atkStage = 6; + + atkStat *= gStatStageRatios[atkStage][0]; + atkStat /= gStatStageRatios[atkStage][1]; + + // apply attack stat modifiers + modifier = UQ_4_12(1.0); + + // attacker's abilities + switch (GetBattlerAbility(battlerAtk)) + { + case ABILITY_HUGE_POWER: + case ABILITY_PURE_POWER: + if (IS_MOVE_PHYSICAL(move)) + MulModifier(&modifier, UQ_4_12(2.0)); + break; + case ABILITY_SLOW_START: + if (gDisableStructs[battlerAtk].slowStartTimer != 0) + MulModifier(&modifier, UQ_4_12(0.5)); + break; + case ABILITY_SOLAR_POWER: + if (IS_MOVE_SPECIAL(move) && WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY) + MulModifier(&modifier, UQ_4_12(1.5)); + break; + case ABILITY_DEFEATIST: + if (gBattleMons[battlerAtk].hp <= (gBattleMons[battlerDef].maxHP / 2)) + MulModifier(&modifier, UQ_4_12(0.5)); + break; + case ABILITY_FLASH_FIRE: + if (moveType == TYPE_FIRE && gBattleResources->flags->flags[battlerAtk] & RESOURCE_FLAG_FLASH_FIRE) + MulModifier(&modifier, UQ_4_12(1.5)); + break; + case ABILITY_SWARM: + if (moveType == TYPE_BUG && gBattleMons[battlerAtk].hp <= (gBattleMons[battlerAtk].maxHP / 3)) + MulModifier(&modifier, UQ_4_12(1.5)); + break; + case ABILITY_TORRENT: + if (moveType == TYPE_WATER && gBattleMons[battlerAtk].hp <= (gBattleMons[battlerAtk].maxHP / 3)) + MulModifier(&modifier, UQ_4_12(1.5)); + break; + case ABILITY_BLAZE: + if (moveType == TYPE_FIRE && gBattleMons[battlerAtk].hp <= (gBattleMons[battlerAtk].maxHP / 3)) + MulModifier(&modifier, UQ_4_12(1.5)); + break; + case ABILITY_OVERGROW: + if (moveType == TYPE_GRASS && gBattleMons[battlerAtk].hp <= (gBattleMons[battlerAtk].maxHP / 3)) + MulModifier(&modifier, UQ_4_12(1.5)); + break; + case ABILITY_PLUS: + case ABILITY_MINUS: + if (IsBattlerAlive(BATTLE_PARTNER(battlerAtk))) + { + u32 partnerAbility = GetBattlerAbility(BATTLE_PARTNER(battlerAtk)); + if (partnerAbility == ABILITY_PLUS || partnerAbility == ABILITY_MINUS) + MulModifier(&modifier, UQ_4_12(1.5)); + } + break; + case ABILITY_FLOWER_GIFT: + if (gBattleMons[battlerAtk].species == SPECIES_CHERRIM && WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY) + MulModifier(&modifier, UQ_4_12(1.5)); + break; + case ABILITY_HUSTLE: + if (IS_MOVE_PHYSICAL(move)) + MulModifier(&modifier, UQ_4_12(1.5)); + break; + case ABILITY_STAKEOUT: + if (gDisableStructs[battlerDef].isFirstTurn == 2) // just switched in + MulModifier(&modifier, UQ_4_12(2.0)); + break; + } + + // target's abilities + switch (GetBattlerAbility(battlerDef)) + { + case ABILITY_THICK_FAT: + if (moveType == TYPE_FIRE || moveType == TYPE_ICE) + { + MulModifier(&modifier, UQ_4_12(0.5)); + if (updateFlags) + RecordAbilityBattle(battlerDef, ABILITY_THICK_FAT); + } + break; + } + + // ally's abilities + if (IsBattlerAlive(BATTLE_PARTNER(battlerAtk))) + { + switch (GetBattlerAbility(BATTLE_PARTNER(battlerAtk))) + { + case ABILITY_FLOWER_GIFT: + if (gBattleMons[BATTLE_PARTNER(battlerAtk)].species == SPECIES_CHERRIM) + MulModifier(&modifier, UQ_4_12(1.5)); + break; + } + } + + // attacker's hold effect + switch (GetBattlerHoldEffect(battlerAtk, TRUE)) + { + case HOLD_EFFECT_THICK_CLUB: + if ((gBattleMons[battlerAtk].species == SPECIES_CUBONE || gBattleMons[battlerAtk].species == SPECIES_MAROWAK) && IS_MOVE_PHYSICAL(move)) + MulModifier(&modifier, UQ_4_12(2.0)); + break; + case HOLD_EFFECT_DEEP_SEA_TOOTH: + if (gBattleMons[battlerAtk].species == SPECIES_CLAMPERL && IS_MOVE_SPECIAL(move)) + MulModifier(&modifier, UQ_4_12(2.0)); + break; + case HOLD_EFFECT_LIGHT_BALL: + if (gBattleMons[battlerAtk].species == SPECIES_PIKACHU) + MulModifier(&modifier, UQ_4_12(2.0)); + break; + case HOLD_EFFECT_CHOICE_BAND: + if (IS_MOVE_PHYSICAL(move)) + MulModifier(&modifier, UQ_4_12(1.5)); + break; + case HOLD_EFFECT_CHOICE_SPECS: + if (IS_MOVE_SPECIAL(move)) + MulModifier(&modifier, UQ_4_12(1.5)); + break; + } + + return ApplyModifier(modifier, atkStat); +} + +static bool32 CanEvolve(u32 species) +{ + u32 i; + + for (i = 0; i < EVOS_PER_MON; i++) + { + if (gEvolutionTable[species][i].method && gEvolutionTable[species][i].method != EVO_MEGA_EVOLUTION) + return TRUE; + } + return FALSE; +} + +static u32 CalcDefenseStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, bool32 isCrit, bool32 updateFlags) +{ + bool32 usesDefStat; + u8 defStage; + u32 defStat, def, spDef; + u16 modifier; + + if (gFieldStatuses & STATUS_FIELD_WONDER_ROOM) // the defense stats are swapped + { + def = gBattleMons[battlerDef].spDefense; + spDef = gBattleMons[battlerDef].defense; + } + else + { + def = gBattleMons[battlerDef].defense; + spDef = gBattleMons[battlerDef].spDefense; + } + + if (gBattleMoves[move].effect == EFFECT_PSYSHOCK || IS_MOVE_PHYSICAL(move)) // uses defense stat instead of sp.def + { + defStat = def; + defStage = gBattleMons[battlerDef].statStages[STAT_DEF]; + usesDefStat = TRUE; + } + else // is special + { + defStat = spDef; + defStage = gBattleMons[battlerDef].statStages[STAT_SPDEF]; + usesDefStat = FALSE; + } + + // critical hits ignore positive stat changes + if (isCrit && defStage > 6) + defStage = 6; + // pokemon with unaware ignore defense stat changes while dealing damage + if (GetBattlerAbility(battlerAtk) == ABILITY_UNAWARE) + defStage = 6; + // certain moves also ignore stat changes + if (gBattleMoves[move].flags & FLAG_STAT_STAGES_IGNORED) + defStage = 6; + + defStat *= gStatStageRatios[defStage][0]; + defStat /= gStatStageRatios[defStage][1]; + + // apply defense stat modifiers + modifier = UQ_4_12(1.0); + + // target's abilities + switch (GetBattlerAbility(battlerDef)) + { + case ABILITY_MARVEL_SCALE: + if (gBattleMons[battlerDef].status1 & STATUS1_ANY && usesDefStat) + { + MulModifier(&modifier, UQ_4_12(1.5)); + if (updateFlags) + RecordAbilityBattle(battlerDef, ABILITY_MARVEL_SCALE); + } + break; + case ABILITY_FUR_COAT: + if (usesDefStat) + { + MulModifier(&modifier, UQ_4_12(2.0)); + if (updateFlags) + RecordAbilityBattle(battlerDef, ABILITY_FUR_COAT); + } + break; + case ABILITY_GRASS_PELT: + if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && usesDefStat) + { + MulModifier(&modifier, UQ_4_12(1.5)); + if (updateFlags) + RecordAbilityBattle(battlerDef, ABILITY_GRASS_PELT); + } + break; + case ABILITY_FLOWER_GIFT: + if (gBattleMons[battlerDef].species == SPECIES_CHERRIM && WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY && !usesDefStat) + MulModifier(&modifier, UQ_4_12(1.5)); + break; + } + + // ally's abilities + if (IsBattlerAlive(BATTLE_PARTNER(battlerDef))) + { + switch (GetBattlerAbility(BATTLE_PARTNER(battlerDef))) + { + case ABILITY_FLOWER_GIFT: + if (gBattleMons[BATTLE_PARTNER(battlerDef)].species == SPECIES_CHERRIM && !usesDefStat) + MulModifier(&modifier, UQ_4_12(1.5)); + break; + } + } + + // target's hold effects + switch (GetBattlerHoldEffect(battlerDef, TRUE)) + { + case HOLD_EFFECT_DEEP_SEA_SCALE: + if (gBattleMons[battlerDef].species == SPECIES_CLAMPERL && !usesDefStat) + MulModifier(&modifier, UQ_4_12(2.0)); + break; + case HOLD_EFFECT_METAL_POWDER: + if (gBattleMons[battlerDef].species == SPECIES_DITTO && usesDefStat && !(gBattleMons[battlerDef].status2 & STATUS2_TRANSFORMED)) + MulModifier(&modifier, UQ_4_12(2.0)); + break; + case HOLD_EFFECT_EVIOLITE: + if (CanEvolve(gBattleMons[battlerDef].species)) + MulModifier(&modifier, UQ_4_12(1.5)); + break; + case HOLD_EFFECT_ASSAULT_VEST: + if (!usesDefStat) + MulModifier(&modifier, UQ_4_12(1.5)); + break; + } + + // sandstorm sp.def boost for rock types + if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_ROCK) && WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SANDSTORM_ANY && !usesDefStat) + MulModifier(&modifier, UQ_4_12(1.5)); + + return ApplyModifier(modifier, defStat); +} + +static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, u16 typeEffectivenessModifier, bool32 isCrit, bool32 updateFlags) +{ + u32 percentBoost; + u32 abilityAtk = GetBattlerAbility(battlerAtk); + u32 abilityDef = GetBattlerAbility(battlerDef); + u32 defSide = GET_BATTLER_SIDE(battlerDef); + u16 finalModifier = UQ_4_12(1.0); + + // check multiple targets in double battle + if (GetMoveTargetCount(move, battlerAtk, battlerDef) >= 2) + MulModifier(&finalModifier, UQ_4_12(0.75)); + + // take type effectiveness + MulModifier(&finalModifier, typeEffectivenessModifier); + + // check crit + if (isCrit) + dmg = ApplyModifier((B_CRIT_MULTIPLIER >= GEN_6 ? UQ_4_12(1.5) : UQ_4_12(2.0)), dmg); + + // check burn + if (gBattleMons[battlerAtk].status1 & STATUS1_BURN && IS_MOVE_PHYSICAL(move) + && gBattleMoves[move].effect != EFFECT_FACADE && abilityAtk != ABILITY_GUTS) + dmg = ApplyModifier(UQ_4_12(0.5), dmg); + + // check sunny/rain weather + if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_RAIN_ANY) + { + if (moveType == TYPE_FIRE) + dmg = ApplyModifier(UQ_4_12(0.5), dmg); + else if (moveType == TYPE_WATER) + dmg = ApplyModifier(UQ_4_12(1.5), dmg); + } + else if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY) + { + if (moveType == TYPE_FIRE) + dmg = ApplyModifier(UQ_4_12(1.5), dmg); + else if (moveType == TYPE_WATER) + dmg = ApplyModifier(UQ_4_12(0.5), dmg); + } + + // check stab + if (IS_BATTLER_OF_TYPE(battlerAtk, moveType) && move != MOVE_STRUGGLE) + { + if (abilityAtk == ABILITY_ADAPTABILITY) + MulModifier(&finalModifier, UQ_4_12(2.0)); + else + MulModifier(&finalModifier, UQ_4_12(1.5)); + } + + // reflect, light screen, aurora veil + if (((gSideStatuses[defSide] & SIDE_STATUS_REFLECT && IS_MOVE_PHYSICAL(move)) + || (gSideStatuses[defSide] & SIDE_STATUS_LIGHTSCREEN && IS_MOVE_SPECIAL(move)) + || (gSideStatuses[defSide] & SIDE_STATUS_AURORA_VEIL)) + && abilityAtk != ABILITY_INFILTRATOR) + { + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + MulModifier(&finalModifier, UQ_4_12(0.66)); + else + MulModifier(&finalModifier, UQ_4_12(0.5)); + } + + // attacker's abilities + switch (abilityAtk) + { + case ABILITY_TINTED_LENS: + if (typeEffectivenessModifier <= UQ_4_12(0.5)) + MulModifier(&finalModifier, UQ_4_12(2.0)); + break; + case ABILITY_SNIPER: + if (isCrit) + MulModifier(&finalModifier, UQ_4_12(1.5)); + break; + case ABILITY_NEUROFORCE: + if (typeEffectivenessModifier >= UQ_4_12(2.0)) + MulModifier(&finalModifier, UQ_4_12(1.25)); + break; + } + + // target's abilities + switch (abilityDef) + { + case ABILITY_MULTISCALE: + case ABILITY_SHADOW_SHIELD: + if (BATTLER_MAX_HP(battlerDef)) + MulModifier(&finalModifier, UQ_4_12(0.5)); + break; + case ABILITY_FILTER: + case ABILITY_SOLID_ROCK: + case ABILITY_PRISM_ARMOR: + if (typeEffectivenessModifier >= UQ_4_12(2.0)) + MulModifier(&finalModifier, UQ_4_12(0.75)); + break; + } + + // target's ally's abilities + if (IsBattlerAlive(BATTLE_PARTNER(battlerDef))) + { + switch (GetBattlerAbility(BATTLE_PARTNER(battlerDef))) + { + case ABILITY_FRIEND_GUARD: + MulModifier(&finalModifier, UQ_4_12(0.75)); + break; + } + } + + // attacker's hold effect + switch (GetBattlerHoldEffect(battlerAtk, TRUE)) + { + case HOLD_EFFECT_METRONOME: + percentBoost = min((gBattleStruct->sameMoveTurns[battlerAtk] * GetBattlerHoldEffectParam(battlerAtk)), 100); + MulModifier(&finalModifier, UQ_4_12(1.0) + sPercentToModifier[percentBoost]); + break; + case HOLD_EFFECT_EXPERT_BELT: + if (typeEffectivenessModifier >= UQ_4_12(2.0)) + MulModifier(&finalModifier, UQ_4_12(1.2)); + break; + case HOLD_EFFECT_LIFE_ORB: + MulModifier(&finalModifier, UQ_4_12(1.3)); + break; + } + + // target's hold effect + switch (GetBattlerHoldEffect(battlerDef, TRUE)) + { + // berries reducing dmg + case HOLD_EFFECT_RESIST_BERRY: + if (moveType == GetBattlerHoldEffectParam(battlerDef) + && (moveType == TYPE_NORMAL || typeEffectivenessModifier >= UQ_4_12(2.0))) + { + MulModifier(&finalModifier, UQ_4_12(0.5)); + if (updateFlags) + gSpecialStatuses[battlerDef].berryReduced = 1; + } + break; + } + + if (gBattleMoves[move].flags & FLAG_DMG_MINIMIZE && gStatuses3[battlerDef] & STATUS3_MINIMIZED) + MulModifier(&finalModifier, UQ_4_12(2.0)); + if (gBattleMoves[move].flags & FLAG_DMG_UNDERGROUND && gStatuses3[battlerDef] & STATUS3_UNDERGROUND) + MulModifier(&finalModifier, UQ_4_12(2.0)); + if (gBattleMoves[move].flags & FLAG_DMG_UNDERWATER && gStatuses3[battlerDef] & STATUS3_UNDERWATER) + MulModifier(&finalModifier, UQ_4_12(2.0)); + if (gBattleMoves[move].flags & FLAG_DMG_IN_AIR && gStatuses3[battlerDef] & STATUS3_ON_AIR) + MulModifier(&finalModifier, UQ_4_12(2.0)); + + dmg = ApplyModifier(finalModifier, dmg); + if (dmg == 0) + dmg = 1; + + return dmg; +} + +s32 CalculateMoveDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, s32 fixedBasePower, bool32 isCrit, bool32 randomFactor, bool32 updateFlags) +{ + s32 dmg; + u16 typeEffectivenessModifier; + + typeEffectivenessModifier = CalcTypeEffectivenessMultiplier(move, moveType, battlerAtk, battlerDef, updateFlags); + + // Don't calculate damage if the move has no effect on target. + if (typeEffectivenessModifier == UQ_4_12(0)) + return 0; + + if (fixedBasePower) + gBattleMovePower = fixedBasePower; + else + gBattleMovePower = CalcMoveBasePowerAfterModifiers(move, battlerAtk, battlerDef, moveType, updateFlags); + + // long dmg basic formula + dmg = ((gBattleMons[battlerAtk].level * 2) / 5) + 2; + dmg *= gBattleMovePower; + dmg *= CalcAttackStat(move, battlerAtk, battlerDef, moveType, isCrit, updateFlags); + dmg /= CalcDefenseStat(move, battlerAtk, battlerDef, moveType, isCrit, updateFlags); + dmg = (dmg / 50) + 2; + + // Calculate final modifiers. + dmg = CalcFinalDmg(dmg, move, battlerAtk, battlerDef, moveType, typeEffectivenessModifier, isCrit, updateFlags); + + // Add a random factor. + if (randomFactor) + { + dmg *= 100 - (Random() % 16); + dmg /= 100; + } + + if (dmg == 0) + dmg = 1; + + return dmg; +} + +static void MulByTypeEffectiveness(u16 *modifier, u16 move, u8 moveType, u8 battlerDef, u8 defType, u8 battlerAtk, bool32 recordAbilities) +{ + u16 mod = GetTypeModifier(moveType, defType); + + if (mod == UQ_4_12(0.0) && GetBattlerHoldEffect(battlerDef, TRUE) == HOLD_EFFECT_RING_TARGET) + { + mod = UQ_4_12(1.0); + if (recordAbilities) + RecordItemEffectBattle(battlerDef, HOLD_EFFECT_RING_TARGET); + } + else if ((moveType == TYPE_FIGHTING || moveType == TYPE_NORMAL) && defType == TYPE_GHOST && gBattleMons[battlerDef].status2 & STATUS2_FORESIGHT && mod == UQ_4_12(0.0)) + { + mod = UQ_4_12(1.0); + } + else if ((moveType == TYPE_FIGHTING || moveType == TYPE_NORMAL) && defType == TYPE_GHOST && GetBattlerAbility(battlerAtk) == ABILITY_SCRAPPY && mod == UQ_4_12(0.0)) + { + mod = UQ_4_12(1.0); + if (recordAbilities) + RecordAbilityBattle(battlerAtk, ABILITY_SCRAPPY); + } + + if (moveType == TYPE_PSYCHIC && defType == TYPE_DARK && gStatuses3[battlerDef] & STATUS3_MIRACLE_EYED && mod == UQ_4_12(0.0)) + mod = UQ_4_12(1.0); + if (gBattleMoves[move].effect == EFFECT_FREEZE_DRY && defType == TYPE_WATER) + mod = UQ_4_12(2.0); + if (moveType == TYPE_GROUND && defType == TYPE_FLYING && IsBattlerGrounded(battlerDef) && mod == UQ_4_12(0.0)) + mod = UQ_4_12(1.0); + + if (gProtectStructs[battlerDef].kingsShielded && gBattleMoves[move].effect != EFFECT_FEINT) + mod = UQ_4_12(1.0); + + MulModifier(modifier, mod); +} + +static void UpdateMoveResultFlags(u16 modifier) +{ + if (modifier == UQ_4_12(0.0)) + { + gMoveResultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE; + gMoveResultFlags &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE); + } + else if (modifier == UQ_4_12(1.0)) + { + gMoveResultFlags &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_DOESNT_AFFECT_FOE); + } + else if (modifier > UQ_4_12(1.0)) + { + gMoveResultFlags |= MOVE_RESULT_SUPER_EFFECTIVE; + gMoveResultFlags &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_DOESNT_AFFECT_FOE); + } + else //if (modifier < UQ_4_12(1.0)) + { + gMoveResultFlags |= MOVE_RESULT_NOT_VERY_EFFECTIVE; + gMoveResultFlags &= ~(MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_DOESNT_AFFECT_FOE); + } +} + +static u16 CalcTypeEffectivenessMultiplierInternal(u16 move, u8 moveType, u8 battlerAtk, u8 battlerDef, bool32 recordAbilities, u16 modifier) +{ + MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, gBattleMons[battlerDef].type1, battlerAtk, recordAbilities); + if (gBattleMons[battlerDef].type2 != gBattleMons[battlerDef].type1) + MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, gBattleMons[battlerDef].type2, battlerAtk, recordAbilities); + if (gBattleMons[battlerDef].type3 != TYPE_MYSTERY && gBattleMons[battlerDef].type3 != gBattleMons[battlerDef].type2 + && gBattleMons[battlerDef].type3 != gBattleMons[battlerDef].type1) + MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, gBattleMons[battlerDef].type3, battlerAtk, recordAbilities); + + if (moveType == TYPE_GROUND && !IsBattlerGrounded(battlerDef)) + { + modifier = UQ_4_12(0.0); + if (recordAbilities && GetBattlerAbility(battlerDef) == ABILITY_LEVITATE) + { + gLastUsedAbility = ABILITY_LEVITATE; + gMoveResultFlags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); + gLastLandedMoves[battlerDef] = 0; + gBattleCommunication[6] = 4; + RecordAbilityBattle(battlerDef, ABILITY_LEVITATE); + } + } + if (GetBattlerAbility(battlerDef) == ABILITY_WONDER_GUARD && modifier <= UQ_4_12(1.0) && gBattleMoves[move].power) + { + modifier = UQ_4_12(0.0); + if (recordAbilities) + { + gLastUsedAbility = ABILITY_WONDER_GUARD; + gMoveResultFlags |= MOVE_RESULT_MISSED; + gLastLandedMoves[battlerDef] = 0; + gBattleCommunication[6] = 3; + RecordAbilityBattle(battlerDef, ABILITY_WONDER_GUARD); + } + } + + return modifier; +} + +u16 CalcTypeEffectivenessMultiplier(u16 move, u8 moveType, u8 battlerAtk, u8 battlerDef, bool32 recordAbilities) +{ + u16 modifier = UQ_4_12(1.0); + + if (move != MOVE_STRUGGLE && moveType != TYPE_MYSTERY) + { + modifier = CalcTypeEffectivenessMultiplierInternal(move, moveType, battlerAtk, battlerDef, recordAbilities, modifier); + if (gBattleMoves[move].effect == EFFECT_TWO_TYPED_MOVE) + modifier = CalcTypeEffectivenessMultiplierInternal(move, gBattleMoves[move].argument, battlerAtk, battlerDef, recordAbilities, modifier); + } + + if (recordAbilities) + UpdateMoveResultFlags(modifier); + return modifier; +} + +u16 CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u8 abilityDef) +{ + u16 modifier = UQ_4_12(1.0); + u8 moveType = gBattleMoves[move].type; + + if (move != MOVE_STRUGGLE && moveType != TYPE_MYSTERY) + { + MulByTypeEffectiveness(&modifier, move, moveType, 0, gBaseStats[speciesDef].type1, 0, FALSE); + if (gBaseStats[speciesDef].type2 != gBaseStats[speciesDef].type1) + MulByTypeEffectiveness(&modifier, move, moveType, 0, gBaseStats[speciesDef].type2, 0, FALSE); + + if (moveType == TYPE_GROUND && abilityDef == ABILITY_LEVITATE && !(gFieldStatuses & STATUS_FIELD_GRAVITY)) + modifier = UQ_4_12(0.0); + if (abilityDef == ABILITY_WONDER_GUARD && modifier <= UQ_4_12(1.0) && gBattleMoves[move].power) + modifier = UQ_4_12(0.0); + } + + UpdateMoveResultFlags(modifier); + return modifier; +} + +u16 GetTypeModifier(u8 atkType, u8 defType) +{ + if (B_FLAG_INVERSE_BATTLE != 0 && FlagGet(B_FLAG_INVERSE_BATTLE)) + return sInverseTypeEffectivenessTable[atkType][defType]; + else + return sTypeEffectivenessTable[atkType][defType]; +} + +s32 GetStealthHazardDamage(u8 hazardType, u8 battlerId) +{ + u8 type1 = gBattleMons[battlerId].type1; + u8 type2 = gBattleMons[battlerId].type2; + u32 maxHp = gBattleMons[battlerId].maxHP; + s32 dmg = 0; + u16 modifier = UQ_4_12(1.0); + + MulModifier(&modifier, GetTypeModifier(hazardType, type1)); + if (type2 != type1) + MulModifier(&modifier, GetTypeModifier(hazardType, type2)); + + switch (modifier) + { + case UQ_4_12(0.0): + dmg = 0; + break; + case UQ_4_12(0.25): + dmg = maxHp / 32; + if (dmg == 0) + dmg = 1; + break; + case UQ_4_12(0.5): + dmg = maxHp / 16; + if (dmg == 0) + dmg = 1; + break; + case UQ_4_12(1.0): + dmg = maxHp / 8; + if (dmg == 0) + dmg = 1; + break; + case UQ_4_12(2.0): + dmg = maxHp / 4; + if (dmg == 0) + dmg = 1; + break; + case UQ_4_12(4.0): + dmg = maxHp / 2; + if (dmg == 0) + dmg = 1; + break; + } + + return dmg; +} + +static bool32 IsPartnerMonFromSameTrainer(u8 battlerId) +{ + if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT && gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + return FALSE; + else if (GetBattlerSide(battlerId) == B_SIDE_PLAYER && gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) + return FALSE; + else if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + return FALSE; + else + return TRUE; +} + +u16 GetMegaEvolutionSpecies(u16 preEvoSpecies, u16 heldItemId) +{ + u32 i; + + for (i = 0; i < EVOS_PER_MON; i++) + { + if (gEvolutionTable[preEvoSpecies][i].method == EVO_MEGA_EVOLUTION + && gEvolutionTable[preEvoSpecies][i].param == heldItemId) + return gEvolutionTable[preEvoSpecies][i].targetSpecies; + } + return SPECIES_NONE; +} + +bool32 CanMegaEvolve(u8 battlerId) +{ + u32 itemId, holdEffect; + struct Pokemon *mon; + u8 battlerPosition = GetBattlerPosition(battlerId); + u8 partnerPosition = GetBattlerPosition(BATTLE_PARTNER(battlerId)); + struct MegaEvolutionData *mega = &(((struct ChooseMoveStruct*)(&gBattleResources->bufferA[gActiveBattler][4]))->mega); + + // Check if trainer already mega evolved a pokemon. + if (mega->alreadyEvolved[battlerPosition]) + return FALSE; + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + if (IsPartnerMonFromSameTrainer(battlerId) + && (mega->alreadyEvolved[partnerPosition] || (mega->toEvolve & gBitTable[BATTLE_PARTNER(battlerId)]))) + return FALSE; + } + + // Check if the pokemon holds an appropriate item. + if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT) + mon = &gEnemyParty[gBattlerPartyIndexes[battlerId]]; + else + mon = &gPlayerParty[gBattlerPartyIndexes[battlerId]]; + + itemId = GetMonData(mon, MON_DATA_HELD_ITEM); + if (USE_BATTLE_DEBUG && gBattleStruct->debugHoldEffects[battlerId]) + holdEffect = gBattleStruct->debugHoldEffects[battlerId]; + else if (itemId == ITEM_ENIGMA_BERRY) + holdEffect = gEnigmaBerries[battlerId].holdEffect; + else + holdEffect = ItemId_GetHoldEffect(itemId); + + if (holdEffect != HOLD_EFFECT_MEGA_STONE) + return FALSE; + + // Check if there is an entry in the evolution table. + if (GetMegaEvolutionSpecies(GetMonData(mon, MON_DATA_SPECIES), itemId) == SPECIES_NONE) + return FALSE; + + // All checks passed, the mon CAN mega evolve. + return TRUE; +} + +void UndoMegaEvolution(u32 monId) +{ + if (gBattleStruct->mega.evolvedPartyIds[B_SIDE_PLAYER] & gBitTable[monId]) + { + gBattleStruct->mega.evolvedPartyIds[B_SIDE_PLAYER] &= ~(gBitTable[monId]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleStruct->mega.playerEvolvedSpecies); + CalculateMonStats(&gPlayerParty[monId]); + } + // While not exactly a mega evolution, Zygarde follows the same rules. + else if (GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL) == SPECIES_ZYGARDE_COMPLETE) + { + SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleStruct->changedSpecies[monId]); + gBattleStruct->changedSpecies[monId] = 0; + CalculateMonStats(&gPlayerParty[monId]); + } +} + +void UndoFormChange(u32 monId, u32 side) +{ + u32 i, currSpecies; + struct Pokemon *party = (side == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty; + static const u16 species[][2] = // changed form id, default form id + { + {SPECIES_AEGISLASH_BLADE, SPECIES_AEGISLASH}, + {SPECIES_MIMIKYU_BUSTED, SPECIES_MIMIKYU}, + {SPECIES_DARMANITAN_ZEN, SPECIES_DARMANITAN}, + {SPECIES_MINIOR, SPECIES_MINIOR_CORE}, + {SPECIES_WISHIWASHI_SCHOOL, SPECIES_WISHIWASHI}, + }; + + currSpecies = GetMonData(&party[monId], MON_DATA_SPECIES, NULL); + for (i = 0; i < ARRAY_COUNT(species); i++) + { + if (currSpecies == species[i][0]) + { + SetMonData(&party[monId], MON_DATA_SPECIES, &species[i][1]); + CalculateMonStats(&party[monId]); + break; + } + } +} + +bool32 DoBattlersShareType(u32 battler1, u32 battler2) +{ + s32 i; + u8 types1[3] = {gBattleMons[battler1].type1, gBattleMons[battler1].type2, gBattleMons[battler1].type3}; + u8 types2[3] = {gBattleMons[battler2].type1, gBattleMons[battler2].type2, gBattleMons[battler2].type3}; + + if (types1[2] == TYPE_MYSTERY) + types1[2] = types1[0]; + if (types2[2] == TYPE_MYSTERY) + types2[2] = types2[0]; + + for (i = 0; i < 3; i++) + { + if (types1[i] == types2[0] || types1[i] == types2[1] || types1[i] == types2[2]) + return TRUE; + } + + return FALSE; +} + +bool32 CanBattlerGetOrLoseItem(u8 battlerId, u16 itemId) +{ + u16 species = gBattleMons[battlerId].species; + + if (IS_ITEM_MAIL(itemId)) + return FALSE; + else if (itemId == ITEM_ENIGMA_BERRY) + return FALSE; + else if (species == SPECIES_KYOGRE && itemId == ITEM_BLUE_ORB) + return FALSE; + else if (species == SPECIES_GROUDON && itemId == ITEM_RED_ORB) + return FALSE; + // Mega stone cannot be lost if pokemon can mega evolve with it or is already mega evolved. + else if (ItemId_GetHoldEffect(itemId) == HOLD_EFFECT_MEGA_STONE + && ((GetMegaEvolutionSpecies(species, itemId) != SPECIES_NONE) || gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(battlerId)] & gBitTable[gBattlerPartyIndexes[battlerId]])) + return FALSE; + else if (species == SPECIES_GIRATINA && itemId == ITEM_GRISEOUS_ORB) + return FALSE; + else if (species == SPECIES_GENESECT && GetBattlerHoldEffect(battlerId, FALSE) == HOLD_EFFECT_DRIVE) + return FALSE; + else if (species == SPECIES_SILVALLY && GetBattlerHoldEffect(battlerId, FALSE) == HOLD_EFFECT_MEMORY) + return FALSE; + else + return TRUE; +} + +struct Pokemon *GetIllusionMonPtr(u32 battlerId) +{ + if (gBattleStruct->illusion[battlerId].broken) + return NULL; + if (!gBattleStruct->illusion[battlerId].set) + { + if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) + SetIllusionMon(&gPlayerParty[gBattlerPartyIndexes[battlerId]], battlerId); + else + SetIllusionMon(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId); + } + if (!gBattleStruct->illusion[battlerId].on) + return NULL; + + return gBattleStruct->illusion[battlerId].mon; +} + +void ClearIllusionMon(u32 battlerId) +{ + memset(&gBattleStruct->illusion[battlerId], 0, sizeof(gBattleStruct->illusion[battlerId])); +} + +bool32 SetIllusionMon(struct Pokemon *mon, u32 battlerId) +{ + struct Pokemon *party, *partnerMon; + s32 i, id; + + gBattleStruct->illusion[battlerId].set = 1; + if (GetMonAbility(mon) != ABILITY_ILLUSION) + return FALSE; + + if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) + party = gPlayerParty; + else + party = gEnemyParty; + + if (IsBattlerAlive(BATTLE_PARTNER(battlerId))) + partnerMon = &party[gBattlerPartyIndexes[BATTLE_PARTNER(battlerId)]]; + else + partnerMon = mon; + + // Find last alive non-egg pokemon. + for (i = PARTY_SIZE - 1; i >= 0; i--) + { + id = i; + if (GetMonData(&party[id], MON_DATA_SANITY_HAS_SPECIES) + && GetMonData(&party[id], MON_DATA_HP) + && &party[id] != mon + && &party[id] != partnerMon) + { + gBattleStruct->illusion[battlerId].on = 1; + gBattleStruct->illusion[battlerId].broken = 0; + gBattleStruct->illusion[battlerId].partyId = id; + gBattleStruct->illusion[battlerId].mon = &party[id]; + return TRUE; + } + } + + return FALSE; +} diff --git a/src/battle_util2.c b/src/battle_util2.c index 6d51f51e7d..081b73621c 100644 --- a/src/battle_util2.c +++ b/src/battle_util2.c @@ -13,8 +13,6 @@ void AllocateBattleResources(void) { - gBattleResources = gBattleResources; // something dumb needed to match - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) InitTrainerHillBattleStruct(); diff --git a/src/contest_effect.c b/src/contest_effect.c index 1fe21daaba..1d70b8d128 100644 --- a/src/contest_effect.c +++ b/src/contest_effect.c @@ -59,22 +59,22 @@ static s16 RoundUp(s16); bool8 AreMovesContestCombo(u16 lastMove, u16 nextMove) { - u8 nextMoveComboMoves[4]; + int i; u8 lastMoveComboStarterId = gContestMoves[lastMove].comboStarterId; - nextMoveComboMoves[0] = gContestMoves[nextMove].comboMoves[0]; - nextMoveComboMoves[1] = gContestMoves[nextMove].comboMoves[1]; - nextMoveComboMoves[2] = gContestMoves[nextMove].comboMoves[2]; - nextMoveComboMoves[3] = gContestMoves[nextMove].comboMoves[3]; if (lastMoveComboStarterId == 0) + { return FALSE; - else if (lastMoveComboStarterId == nextMoveComboMoves[0] - || lastMoveComboStarterId == nextMoveComboMoves[1] - || lastMoveComboStarterId == nextMoveComboMoves[2] - || lastMoveComboStarterId == nextMoveComboMoves[3]) - return gComboStarterLookupTable[lastMoveComboStarterId]; + } else + { + for (i = 0; i < MAX_COMBO_MOVES; i++) + { + if (lastMoveComboStarterId == gContestMoves[nextMove].comboMoves[i]) + return TRUE; + } return FALSE; + } } // A highly appealing move. @@ -132,7 +132,7 @@ static void ContestEffect_UserLessEasilyStartled(void) SetContestantEffectStringID(eContestAppealResults.contestant,CONTEST_STRING_STOPPED_CARING); } -// Slightly startles the POKéMON in front. +// Slightly startles the POKéMON in front. static void ContestEffect_StartleFrontMon(void) { u8 idx = 0; @@ -179,7 +179,7 @@ static void ContestEffect_StartlePrevMons(void) SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Startles the POKéMON that appealed before the user. +// Startles the POKéMON that appealed before the user. static void ContestEffect_StartlePrevMon2(void) { u8 rval = Random() % 10; @@ -196,7 +196,7 @@ static void ContestEffect_StartlePrevMon2(void) ContestEffect_StartleFrontMon(); } -// Startles all POKéMON that appealed before the user. +// Startles all POKéMON that appealed before the user. static void ContestEffect_StartlePrevMons2(void) { u8 numStartled = 0; @@ -272,7 +272,7 @@ static void ContestEffect_ShiftJudgeAttention(void) } } -// Startles the POKéMON that has the JUDGE's attention. +// Startles the POKéMON that has the JUDGE's attention. static void ContestEffect_StartleMonWithJudgesAttention(void) { u8 numStartled = 0; @@ -310,7 +310,7 @@ static void ContestEffect_JamsOthersButMissOneTurn(void) SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Startles POKéMON that made a same-type appeal. +// Startles POKéMON that made a same-type appeal. static void ContestEffect_StartleMonsSameTypeAppeal(void) { u16 move = eContestantStatus[eContestAppealResults.contestant].currMove; @@ -318,42 +318,42 @@ static void ContestEffect_StartleMonsSameTypeAppeal(void) SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Badly startles POKéMON that made COOL appeals. +// Badly startles POKéMON that made COOL appeals. static void ContestEffect_StartleMonsCoolAppeal(void) { JamByMoveCategory(CONTEST_CATEGORY_COOL); SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Badly startles POKéMON that made BEAUTY appeals. +// Badly startles POKéMON that made BEAUTY appeals. static void ContestEffect_StartleMonsBeautyAppeal(void) { JamByMoveCategory(CONTEST_CATEGORY_BEAUTY); SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Badly startles POKéMON that made CUTE appeals. +// Badly startles POKéMON that made CUTE appeals. static void ContestEffect_StartleMonsCuteAppeal(void) { JamByMoveCategory(CONTEST_CATEGORY_CUTE); SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Badly startles POKéMON that made SMART appeals. +// Badly startles POKéMON that made SMART appeals. static void ContestEffect_StartleMonsSmartAppeal(void) { JamByMoveCategory(CONTEST_CATEGORY_SMART); SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Badly startles POKéMON that made TOUGH appeals. +// Badly startles POKéMON that made TOUGH appeals. static void ContestEffect_StartleMonsToughAppeal(void) { JamByMoveCategory(CONTEST_CATEGORY_TOUGH); SetContestantEffectStringID(eContestAppealResults.contestant, CONTEST_STRING_ATTEMPT_STARTLE); } -// Makes one POKéMON after the user nervous. +// Makes one POKéMON after the user nervous. static void ContestEffect_MakeFollowingMonNervous(void) { bool32 hitAny = FALSE; @@ -385,7 +385,7 @@ static void ContestEffect_MakeFollowingMonNervous(void) SetContestantEffectStringID2(eContestAppealResults.contestant, CONTEST_STRING_MESSED_UP2); } -// Makes all POKéMON after the user nervous. +// Makes all POKéMON after the user nervous. static void ContestEffect_MakeFollowingMonsNervous(void) { u8 numUnnerved = 0; @@ -427,7 +427,7 @@ static void ContestEffect_MakeFollowingMonsNervous(void) for (i = 0; i < CONTESTANT_COUNT; i++) { if (eContestantStatus[i].hasJudgesAttention && IsContestantAllowedToCombo(i)) - oddsMod[i] = gComboStarterLookupTable[gContestMoves[eContestantStatus[i].prevMove].comboStarterId] * 10; + oddsMod[i] = gContestMoves[eContestantStatus[i].prevMove].comboStarterId == 0 ? 0 : 10; else oddsMod[i] = 0; oddsMod[i] -= (eContestantStatus[i].condition / 10) * 10; @@ -492,7 +492,7 @@ static void ContestEffect_WorsenConditionOfPrevMons(void) SetContestantEffectStringID2(eContestAppealResults.contestant, CONTEST_STRING_IGNORED); } -// Badly startles POKéMON in good condition. +// Badly startles POKéMON in good condition. static void ContestEffect_BadlyStartlesMonsInGoodCondition(void) { u8 numHit = 0; @@ -891,7 +891,7 @@ static void ContestEffect_ExciteAudienceInAnyContest(void) } } -// Badly startles all POKéMON that made good appeals. +// Badly startles all POKéMON that made good appeals. static void ContestEffect_BadlyStartleMonsWithGoodAppeals(void) { int i; diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 008d7d7845..2582272bb3 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -11,6 +11,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, + .split = SPLIT_PHYSICAL, }, [MOVE_POUND] = @@ -24,11 +25,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_KARATE_CHOP] = { - .effect = EFFECT_HIGH_CRITICAL, + .effect = EFFECT_HIT, .power = 50, .type = TYPE_FIGHTING, .accuracy = 100, @@ -36,7 +38,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_HIGH_CRIT, + .split = SPLIT_PHYSICAL, }, [MOVE_DOUBLE_SLAP] = @@ -50,6 +53,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_COMET_PUNCH] = @@ -62,7 +66,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_IRON_FIST_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_MEGA_PUNCH] = @@ -75,7 +80,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_IRON_FIST_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_PAY_DAY] = @@ -89,6 +95,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_FIRE_PUNCH] = @@ -101,7 +108,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_IRON_FIST_BOOST | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_ICE_PUNCH] = @@ -114,7 +122,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_IRON_FIST_BOOST | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_THUNDER_PUNCH] = @@ -127,7 +136,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_IRON_FIST_BOOST | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_SCRATCH] = @@ -141,6 +151,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_VICE_GRIP] = @@ -154,6 +165,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_GUILLOTINE] = @@ -167,11 +179,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_RAZOR_WIND] = { - .effect = EFFECT_RAZOR_WIND, + .effect = EFFECT_TWO_TURNS_ATTACK, .power = 80, .type = TYPE_NORMAL, .accuracy = 100, @@ -179,7 +192,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_HIGH_CRIT, + .split = SPLIT_SPECIAL, }, [MOVE_SWORDS_DANCE] = @@ -192,7 +206,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, - .flags = FLAG_SNATCH_AFFECTED, + .flags = FLAG_SNATCH_AFFECTED | FLAG_DANCE, + .split = SPLIT_STATUS, }, [MOVE_CUT] = @@ -206,6 +221,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_GUST] = @@ -218,7 +234,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_DMG_IN_AIR, + .split = SPLIT_SPECIAL, }, [MOVE_WING_ATTACK] = @@ -232,6 +249,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_WHIRLWIND] = @@ -244,13 +262,14 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = -6, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_FLY] = { .effect = EFFECT_SEMI_INVULNERABLE, - .power = 70, + .power = 90, .type = TYPE_FLYING, .accuracy = 95, .pp = 15, @@ -258,6 +277,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_BIND] = @@ -265,12 +285,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .effect = EFFECT_TRAP, .power = 15, .type = TYPE_NORMAL, - .accuracy = 75, + .accuracy = 85, .pp = 20, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_SLAM] = @@ -284,19 +305,21 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_VINE_WHIP] = { .effect = EFFECT_HIT, - .power = 35, + .power = 45, .type = TYPE_GRASS, .accuracy = 100, - .pp = 10, + .pp = 25, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_STOMP] = @@ -309,7 +332,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_DMG_MINIMIZE, + .split = SPLIT_PHYSICAL, }, [MOVE_DOUBLE_KICK] = @@ -323,6 +347,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_MEGA_KICK] = @@ -336,19 +361,21 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_JUMP_KICK] = { .effect = EFFECT_RECOIL_IF_MISS, - .power = 70, + .power = 100, .type = TYPE_FIGHTING, .accuracy = 95, - .pp = 25, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_RECKLESS_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_ROLLING_KICK] = @@ -361,7 +388,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_SAND_ATTACK] = @@ -375,6 +403,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_HEADBUTT] = @@ -387,7 +416,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_HORN_ATTACK] = @@ -401,6 +431,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_FURY_ATTACK] = @@ -414,6 +445,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_HORN_DRILL] = @@ -427,19 +459,21 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_TACKLE] = { .effect = EFFECT_HIT, - .power = 35, + .power = 40, .type = TYPE_NORMAL, - .accuracy = 95, + .accuracy = 100, .pp = 35, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_BODY_SLAM] = @@ -452,7 +486,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_DMG_MINIMIZE, + .split = SPLIT_PHYSICAL, }, [MOVE_WRAP] = @@ -466,11 +501,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_TAKE_DOWN] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_RECOIL_25, .power = 90, .type = TYPE_NORMAL, .accuracy = 85, @@ -478,25 +514,27 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_RECKLESS_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_THRASH] = { .effect = EFFECT_RAMPAGE, - .power = 90, + .power = 120, .type = TYPE_NORMAL, .accuracy = 100, - .pp = 20, + .pp = 10, .secondaryEffectChance = 100, .target = MOVE_TARGET_RANDOM, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_DOUBLE_EDGE] = { - .effect = EFFECT_DOUBLE_EDGE, + .effect = EFFECT_RECOIL_33, .power = 120, .type = TYPE_NORMAL, .accuracy = 100, @@ -504,7 +542,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_RECKLESS_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_TAIL_WHIP] = @@ -518,6 +557,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_POISON_STING] = @@ -530,7 +570,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_TWINEEDLE] = @@ -543,20 +584,22 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_PIN_MISSILE] = { .effect = EFFECT_MULTI_HIT, - .power = 14, + .power = 25, .type = TYPE_BUG, - .accuracy = 85, + .accuracy = 95, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_LEER] = @@ -570,6 +613,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_BITE] = @@ -582,7 +626,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_STRONG_JAW_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_GROWL] = @@ -595,7 +640,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, + .split = SPLIT_STATUS, }, [MOVE_ROAR] = @@ -608,7 +654,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = -6, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND | FLAG_MAGICCOAT_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_SING] = @@ -621,7 +668,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, + .split = SPLIT_STATUS, }, [MOVE_SUPERSONIC] = @@ -634,7 +682,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, + .split = SPLIT_STATUS, }, [MOVE_SONIC_BOOM] = @@ -648,6 +697,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, [MOVE_DISABLE] = @@ -655,17 +705,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .effect = EFFECT_DISABLE, .power = 0, .type = TYPE_NORMAL, - .accuracy = 55, + .accuracy = 100, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_MAGICCOAT_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_ACID] = { - .effect = EFFECT_DEFENSE_DOWN_HIT, + .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, .power = 40, .type = TYPE_POISON, .accuracy = 100, @@ -673,7 +724,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 10, .target = MOVE_TARGET_BOTH, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_EMBER] = @@ -686,20 +738,22 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_FLAMETHROWER] = { .effect = EFFECT_BURN_HIT, - .power = 95, + .power = 90, .type = TYPE_FIRE, .accuracy = 100, .pp = 15, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_MIST] = @@ -713,6 +767,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_WATER_GUN] = @@ -726,12 +781,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, [MOVE_HYDRO_PUMP] = { .effect = EFFECT_HIT, - .power = 120, + .power = 110, .type = TYPE_WATER, .accuracy = 80, .pp = 5, @@ -739,45 +795,49 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, [MOVE_SURF] = { .effect = EFFECT_HIT, - .power = 95, + .power = 90, .type = TYPE_WATER, .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, - .target = MOVE_TARGET_BOTH, + .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_DMG_UNDERWATER, + .split = SPLIT_SPECIAL, }, [MOVE_ICE_BEAM] = { .effect = EFFECT_FREEZE_HIT, - .power = 95, + .power = 90, .type = TYPE_ICE, .accuracy = 100, .pp = 10, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_BLIZZARD] = { .effect = EFFECT_FREEZE_HIT, - .power = 120, + .power = 110, .type = TYPE_ICE, .accuracy = 70, .pp = 5, .secondaryEffectChance = 10, .target = MOVE_TARGET_BOTH, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_PSYBEAM] = @@ -790,7 +850,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_BUBBLE_BEAM] = @@ -803,7 +864,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_AURORA_BEAM] = @@ -816,7 +878,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_HYPER_BEAM] = @@ -830,6 +893,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, [MOVE_PECK] = @@ -843,6 +907,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_DRILL_PECK] = @@ -856,19 +921,21 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_SUBMISSION] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_RECOIL_25, .power = 80, .type = TYPE_FIGHTING, .accuracy = 80, - .pp = 25, + .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_RECKLESS_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_LOW_KICK] = @@ -882,6 +949,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_COUNTER] = @@ -894,7 +962,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_DEPENDS, .priority = -5, - .flags = FLAG_MAKES_CONTACT | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_SEISMIC_TOSS] = @@ -908,6 +977,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_STRENGTH] = @@ -921,6 +991,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_ABSORB] = @@ -929,11 +1000,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .power = 20, .type = TYPE_GRASS, .accuracy = 100, - .pp = 20, + .pp = 25, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_SPECIAL, }, [MOVE_MEGA_DRAIN] = @@ -942,11 +1014,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .power = 40, .type = TYPE_GRASS, .accuracy = 100, - .pp = 10, + .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_SPECIAL, }, [MOVE_LEECH_SEED] = @@ -960,24 +1033,26 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_GROWTH] = { - .effect = EFFECT_SPECIAL_ATTACK_UP, + .effect = EFFECT_GROWTH, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, - .pp = 40, + .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_RAZOR_LEAF] = { - .effect = EFFECT_HIGH_CRITICAL, + .effect = EFFECT_HIT, .power = 55, .type = TYPE_GRASS, .accuracy = 95, @@ -985,7 +1060,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_HIGH_CRIT, + .split = SPLIT_PHYSICAL, }, [MOVE_SOLAR_BEAM] = @@ -999,6 +1075,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, [MOVE_POISON_POWDER] = @@ -1011,7 +1088,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_POWDER, + .split = SPLIT_STATUS, }, [MOVE_STUN_SPORE] = @@ -1024,7 +1102,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_POWDER, + .split = SPLIT_STATUS, }, [MOVE_SLEEP_POWDER] = @@ -1037,25 +1116,27 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_POWDER, + .split = SPLIT_STATUS, }, [MOVE_PETAL_DANCE] = { .effect = EFFECT_RAMPAGE, - .power = 70, + .power = 120, .type = TYPE_GRASS, .accuracy = 100, - .pp = 20, + .pp = 10, .secondaryEffectChance = 100, .target = MOVE_TARGET_RANDOM, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_DANCE, + .split = SPLIT_SPECIAL, }, [MOVE_STRING_SHOT] = { - .effect = EFFECT_SPEED_DOWN, + .effect = EFFECT_SPEED_DOWN_2, .power = 0, .type = TYPE_BUG, .accuracy = 95, @@ -1064,6 +1145,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_DRAGON_RAGE] = @@ -1077,19 +1159,21 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, [MOVE_FIRE_SPIN] = { .effect = EFFECT_TRAP, - .power = 15, + .power = 35, .type = TYPE_FIRE, - .accuracy = 70, + .accuracy = 85, .pp = 15, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, [MOVE_THUNDER_SHOCK] = @@ -1102,20 +1186,22 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_THUNDERBOLT] = { .effect = EFFECT_PARALYZE_HIT, - .power = 95, + .power = 90, .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 15, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_THUNDER_WAVE] = @@ -1123,25 +1209,27 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .effect = EFFECT_PARALYZE, .power = 0, .type = TYPE_ELECTRIC, - .accuracy = 100, + .accuracy = 90, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_THUNDER] = { .effect = EFFECT_THUNDER, - .power = 120, + .power = 110, .type = TYPE_ELECTRIC, .accuracy = 70, .pp = 10, .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_HIT_IN_AIR, + .split = SPLIT_SPECIAL, }, [MOVE_ROCK_THROW] = @@ -1155,6 +1243,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_EARTHQUAKE] = @@ -1167,7 +1256,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_DMG_UNDERGROUND, + .split = SPLIT_PHYSICAL, }, [MOVE_FISSURE] = @@ -1180,13 +1270,14 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_DMG_UNDERGROUND, + .split = SPLIT_PHYSICAL, }, [MOVE_DIG] = { .effect = EFFECT_SEMI_INVULNERABLE, - .power = 60, + .power = 80, .type = TYPE_GROUND, .accuracy = 100, .pp = 10, @@ -1194,6 +1285,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_TOXIC] = @@ -1201,12 +1293,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .effect = EFFECT_TOXIC, .power = 0, .type = TYPE_POISON, - .accuracy = 85, + .accuracy = 90, .pp = 10, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_CONFUSION] = @@ -1219,7 +1312,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_PSYCHIC] = @@ -1232,7 +1326,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_HYPNOSIS] = @@ -1246,6 +1341,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_MEDITATE] = @@ -1259,6 +1355,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_AGILITY] = @@ -1272,11 +1369,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_QUICK_ATTACK] = { - .effect = EFFECT_QUICK_ATTACK, + .effect = EFFECT_HIT, .power = 40, .type = TYPE_NORMAL, .accuracy = 100, @@ -1285,6 +1383,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 1, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_RAGE] = @@ -1298,6 +1397,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_TELEPORT] = @@ -1311,6 +1411,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, [MOVE_NIGHT_SHADE] = @@ -1324,6 +1425,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, [MOVE_MIMIC] = @@ -1337,6 +1439,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_SCREECH] = @@ -1349,7 +1452,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, + .split = SPLIT_STATUS, }, [MOVE_DOUBLE_TEAM] = @@ -1363,6 +1467,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_RECOVER] = @@ -1371,11 +1476,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .power = 0, .type = TYPE_NORMAL, .accuracy = 0, - .pp = 20, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_HARDEN] = @@ -1389,6 +1495,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_MINIMIZE] = @@ -1397,11 +1504,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .power = 0, .type = TYPE_NORMAL, .accuracy = 0, - .pp = 20, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_SMOKESCREEN] = @@ -1415,6 +1523,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_CONFUSE_RAY] = @@ -1428,6 +1537,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_WITHDRAW] = @@ -1441,6 +1551,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_DEFENSE_CURL] = @@ -1454,6 +1565,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_BARRIER] = @@ -1462,11 +1574,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, - .pp = 30, + .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_LIGHT_SCREEN] = @@ -1480,6 +1593,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_HAZE] = @@ -1493,6 +1607,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_PROTECT_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_REFLECT] = @@ -1506,6 +1621,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_FOCUS_ENERGY] = @@ -1519,6 +1635,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_BIDE] = @@ -1526,12 +1643,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .effect = EFFECT_BIDE, .power = 1, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, - .priority = 0, + .priority = 1, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_METRONOME] = @@ -1545,6 +1663,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_DEPENDS, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, [MOVE_MIRROR_MOVE] = @@ -1558,6 +1677,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_DEPENDS, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, [MOVE_SELF_DESTRUCT] = @@ -1571,6 +1691,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_EGG_BOMB] = @@ -1583,20 +1704,22 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_BALLISTIC, + .split = SPLIT_PHYSICAL, }, [MOVE_LICK] = { .effect = EFFECT_PARALYZE_HIT, - .power = 20, + .power = 30, .type = TYPE_GHOST, .accuracy = 100, .pp = 30, .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_SMOG] = @@ -1605,11 +1728,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .power = 20, .type = TYPE_POISON, .accuracy = 70, - .pp = 20, + .pp = 30, .secondaryEffectChance = 40, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_SLUDGE] = @@ -1622,7 +1746,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_BONE_CLUB] = @@ -1635,33 +1760,36 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_FIRE_BLAST] = { .effect = EFFECT_BURN_HIT, - .power = 120, + .power = 110, .type = TYPE_FIRE, .accuracy = 85, .pp = 5, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_WATERFALL] = { - .effect = EFFECT_HIT, + .effect = EFFECT_FLINCH_HIT, .power = 80, .type = TYPE_WATER, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, + .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_CLAMP] = @@ -1669,17 +1797,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .effect = EFFECT_TRAP, .power = 35, .type = TYPE_WATER, - .accuracy = 75, - .pp = 10, + .accuracy = 85, + .pp = 15, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_SWIFT] = { - .effect = EFFECT_ALWAYS_HIT, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_NORMAL, .accuracy = 0, @@ -1688,19 +1817,21 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, [MOVE_SKULL_BASH] = { .effect = EFFECT_SKULL_BASH, - .power = 100, + .power = 130, .type = TYPE_NORMAL, .accuracy = 100, - .pp = 15, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_SPIKE_CANNON] = @@ -1714,6 +1845,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_CONSTRICT] = @@ -1726,7 +1858,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_AMNESIA] = @@ -1740,6 +1873,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_KINESIS] = @@ -1752,7 +1886,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_MAGICCOAT_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_SOFT_BOILED] = @@ -1766,19 +1901,21 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_HI_JUMP_KICK] = { .effect = EFFECT_RECOIL_IF_MISS, - .power = 85, + .power = 130, .type = TYPE_FIGHTING, .accuracy = 90, - .pp = 20, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_RECKLESS_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_GLARE] = @@ -1786,12 +1923,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .effect = EFFECT_PARALYZE, .power = 0, .type = TYPE_NORMAL, - .accuracy = 75, + .accuracy = 100, .pp = 30, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_DREAM_EATER] = @@ -1805,6 +1943,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_SPECIAL, }, [MOVE_POISON_GAS] = @@ -1812,12 +1951,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .effect = EFFECT_POISON, .power = 0, .type = TYPE_POISON, - .accuracy = 55, + .accuracy = 90, .pp = 40, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_BARRAGE] = @@ -1830,20 +1970,22 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_BALLISTIC, + .split = SPLIT_PHYSICAL, }, [MOVE_LEECH_LIFE] = { .effect = EFFECT_ABSORB, - .power = 20, + .power = 80, .type = TYPE_BUG, .accuracy = 100, - .pp = 15, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_LOVELY_KISS] = @@ -1857,11 +1999,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_SKY_ATTACK] = { - .effect = EFFECT_SKY_ATTACK, + .effect = EFFECT_TWO_TURNS_ATTACK, .power = 140, .type = TYPE_FLYING, .accuracy = 90, @@ -1869,7 +2012,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + .argument = MOVE_EFFECT_FLINCH, }, [MOVE_TRANSFORM] = @@ -1883,19 +2028,21 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, [MOVE_BUBBLE] = { .effect = EFFECT_SPEED_DOWN_HIT, - .power = 20, + .power = 40, .type = TYPE_WATER, .accuracy = 100, .pp = 30, .secondaryEffectChance = 10, .target = MOVE_TARGET_BOTH, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_DIZZY_PUNCH] = @@ -1908,7 +2055,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_IRON_FIST_BOOST | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_SPORE] = @@ -1921,7 +2069,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_POWDER, + .split = SPLIT_STATUS, }, [MOVE_FLASH] = @@ -1929,12 +2078,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .effect = EFFECT_ACCURACY_DOWN, .power = 0, .type = TYPE_NORMAL, - .accuracy = 70, + .accuracy = 100, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_PSYWAVE] = @@ -1942,17 +2092,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .effect = EFFECT_PSYWAVE, .power = 1, .type = TYPE_PSYCHIC, - .accuracy = 80, + .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, [MOVE_SPLASH] = { - .effect = EFFECT_SPLASH, + .effect = EFFECT_DO_NOTHING, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -1961,6 +2112,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, [MOVE_ACID_ARMOR] = @@ -1969,24 +2121,26 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .power = 0, .type = TYPE_POISON, .accuracy = 0, - .pp = 40, + .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_CRABHAMMER] = { - .effect = EFFECT_HIGH_CRITICAL, - .power = 90, + .effect = EFFECT_HIT, + .power = 100, .type = TYPE_WATER, - .accuracy = 85, + .accuracy = 90, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_HIGH_CRIT, + .split = SPLIT_PHYSICAL, }, [MOVE_EXPLOSION] = @@ -2000,6 +2154,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_FURY_SWIPES] = @@ -2013,6 +2168,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_BONEMERANG] = @@ -2026,6 +2182,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_REST] = @@ -2039,6 +2196,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_ROCK_SLIDE] = @@ -2051,7 +2209,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 30, .target = MOVE_TARGET_BOTH, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_HYPER_FANG] = @@ -2064,7 +2223,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_STRONG_JAW_BOOST | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_SHARPEN] = @@ -2078,6 +2238,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_CONVERSION] = @@ -2090,7 +2251,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, - .flags = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_TRI_ATTACK] = @@ -2103,7 +2265,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_SUPER_FANG] = @@ -2117,11 +2280,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_SLASH] = { - .effect = EFFECT_HIGH_CRITICAL, + .effect = EFFECT_HIT, .power = 70, .type = TYPE_NORMAL, .accuracy = 100, @@ -2129,7 +2293,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_HIGH_CRIT, + .split = SPLIT_PHYSICAL, }, [MOVE_SUBSTITUTE] = @@ -2143,19 +2308,21 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_STRUGGLE] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_RECOIL_25, .power = 50, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = 1, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_SKETCH] = @@ -2169,6 +2336,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, [MOVE_TRIPLE_KICK] = @@ -2182,19 +2350,21 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_THIEF] = { .effect = EFFECT_THIEF, - .power = 40, + .power = 60, .type = TYPE_DARK, .accuracy = 100, - .pp = 10, + .pp = 25, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_SPIDER_WEB] = @@ -2207,7 +2377,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_MIND_READER] = @@ -2215,12 +2386,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .effect = EFFECT_LOCK_ON, .power = 0, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_NIGHTMARE] = @@ -2234,6 +2406,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_FLAME_WHEEL] = @@ -2246,33 +2419,36 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_SNORE] = { .effect = EFFECT_SNORE, - .power = 40, + .power = 50, .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_SOUND, + .split = SPLIT_SPECIAL, }, [MOVE_CURSE] = { .effect = EFFECT_CURSE, .power = 0, - .type = TYPE_MYSTERY, + .type = TYPE_GHOST, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, [MOVE_FLAIL] = @@ -2286,6 +2462,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_CONVERSION_2] = @@ -2299,11 +2476,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, [MOVE_AEROBLAST] = { - .effect = EFFECT_HIGH_CRITICAL, + .effect = EFFECT_HIT, .power = 100, .type = TYPE_FLYING, .accuracy = 95, @@ -2311,7 +2489,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_HIGH_CRIT, + .split = SPLIT_SPECIAL, }, [MOVE_COTTON_SPORE] = @@ -2319,12 +2498,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .effect = EFFECT_SPEED_DOWN_2, .power = 0, .type = TYPE_GRASS, - .accuracy = 85, + .accuracy = 100, .pp = 40, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_POWDER, + .split = SPLIT_STATUS, }, [MOVE_REVERSAL] = @@ -2338,6 +2518,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_SPITE] = @@ -2350,7 +2531,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_MAGICCOAT_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_POWDER_SNOW] = @@ -2363,7 +2545,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 10, .target = MOVE_TARGET_BOTH, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_PROTECT] = @@ -2376,12 +2559,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 3, - .flags = 0, + .flags = FLAG_PROTECTION_MOVE, + .split = SPLIT_STATUS, }, [MOVE_MACH_PUNCH] = { - .effect = EFFECT_QUICK_ATTACK, + .effect = EFFECT_HIT, .power = 40, .type = TYPE_FIGHTING, .accuracy = 100, @@ -2389,7 +2573,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 1, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_IRON_FIST_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_SCARY_FACE] = @@ -2397,17 +2582,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .effect = EFFECT_SPEED_DOWN_2, .power = 0, .type = TYPE_NORMAL, - .accuracy = 90, + .accuracy = 100, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_FAINT_ATTACK] = { - .effect = EFFECT_ALWAYS_HIT, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_DARK, .accuracy = 0, @@ -2416,19 +2602,21 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_SWEET_KISS] = { .effect = EFFECT_CONFUSE, .power = 0, - .type = TYPE_NORMAL, + .type = TYPE_FAIRY, .accuracy = 75, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_BELLY_DRUM] = @@ -2442,6 +2630,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_SLUDGE_BOMB] = @@ -2454,7 +2643,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_BALLISTIC, + .split = SPLIT_SPECIAL, }, [MOVE_MUD_SLAP] = @@ -2467,7 +2657,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_OCTAZOOKA] = @@ -2480,7 +2671,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 50, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_BALLISTIC | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_SPIKES] = @@ -2493,20 +2685,22 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_OPPONENTS_FIELD, .priority = 0, - .flags = 0, + .flags = FLAG_MAGICCOAT_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_ZAP_CANNON] = { .effect = EFFECT_PARALYZE_HIT, - .power = 100, + .power = 120, .type = TYPE_ELECTRIC, .accuracy = 50, .pp = 5, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_BALLISTIC, + .split = SPLIT_SPECIAL, }, [MOVE_FORESIGHT] = @@ -2514,12 +2708,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .effect = EFFECT_FORESIGHT, .power = 0, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = 40, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_MAGICCOAT_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_DESTINY_BOND] = @@ -2533,6 +2728,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, [MOVE_PERISH_SONG] = @@ -2545,7 +2741,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, - .flags = 0, + .flags = FLAG_SOUND, + .split = SPLIT_STATUS, }, [MOVE_ICY_WIND] = @@ -2558,7 +2755,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 100, .target = MOVE_TARGET_BOTH, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_DETECT] = @@ -2571,7 +2769,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 3, - .flags = 0, + .flags = FLAG_PROTECTION_MOVE, + .split = SPLIT_STATUS, }, [MOVE_BONE_RUSH] = @@ -2579,12 +2778,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .effect = EFFECT_MULTI_HIT, .power = 25, .type = TYPE_GROUND, - .accuracy = 80, + .accuracy = 90, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_LOCK_ON] = @@ -2592,25 +2792,27 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .effect = EFFECT_LOCK_ON, .power = 0, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_OUTRAGE] = { .effect = EFFECT_RAMPAGE, - .power = 90, + .power = 120, .type = TYPE_DRAGON, .accuracy = 100, - .pp = 15, + .pp = 10, .secondaryEffectChance = 100, .target = MOVE_TARGET_RANDOM, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_SANDSTORM] = @@ -2624,19 +2826,21 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, [MOVE_GIGA_DRAIN] = { .effect = EFFECT_ABSORB, - .power = 60, + .power = 75, .type = TYPE_GRASS, .accuracy = 100, - .pp = 5, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_SPECIAL, }, [MOVE_ENDURE] = @@ -2649,20 +2853,22 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 3, - .flags = 0, + .flags = FLAG_PROTECTION_MOVE, + .split = SPLIT_STATUS, }, [MOVE_CHARM] = { .effect = EFFECT_ATTACK_DOWN_2, .power = 0, - .type = TYPE_NORMAL, + .type = TYPE_FAIRY, .accuracy = 100, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_ROLLOUT] = @@ -2676,6 +2882,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_FALSE_SWIPE] = @@ -2689,6 +2896,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_SWAGGER] = @@ -2696,12 +2904,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .effect = EFFECT_SWAGGER, .power = 0, .type = TYPE_NORMAL, - .accuracy = 90, + .accuracy = 85, .pp = 15, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_MILK_DRINK] = @@ -2715,6 +2924,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_SPARK] = @@ -2727,13 +2937,14 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_FURY_CUTTER] = { .effect = EFFECT_FURY_CUTTER, - .power = 10, + .power = 40, .type = TYPE_BUG, .accuracy = 95, .pp = 20, @@ -2741,6 +2952,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_STEEL_WING] = @@ -2753,7 +2965,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_MEAN_LOOK] = @@ -2766,7 +2979,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_ATTRACT] = @@ -2780,6 +2994,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_SLEEP_TALK] = @@ -2793,6 +3008,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_DEPENDS, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, [MOVE_HEAL_BELL] = @@ -2805,7 +3021,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, - .flags = FLAG_SNATCH_AFFECTED, + .flags = FLAG_SNATCH_AFFECTED | FLAG_SOUND, + .split = SPLIT_STATUS, }, [MOVE_RETURN] = @@ -2819,6 +3036,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_PRESENT] = @@ -2832,6 +3050,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_FRUSTRATION] = @@ -2845,6 +3064,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_SAFEGUARD] = @@ -2858,6 +3078,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_PAIN_SPLIT] = @@ -2865,12 +3086,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .effect = EFFECT_PAIN_SPLIT, .power = 0, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_SACRED_FIRE] = @@ -2883,7 +3105,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 50, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_MAGNITUDE] = @@ -2896,7 +3119,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_DMG_UNDERGROUND, + .split = SPLIT_PHYSICAL, }, [MOVE_DYNAMIC_PUNCH] = @@ -2909,7 +3133,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_IRON_FIST_BOOST | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_MEGAHORN] = @@ -2923,6 +3148,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_DRAGON_BREATH] = @@ -2935,7 +3161,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_BATON_PASS] = @@ -2949,6 +3176,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, [MOVE_ENCORE] = @@ -2961,7 +3189,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_MAGICCOAT_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_PURSUIT] = @@ -2975,6 +3204,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_RAPID_SPIN] = @@ -2988,11 +3218,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_SWEET_SCENT] = { - .effect = EFFECT_EVASION_DOWN, + .effect = EFFECT_EVASION_DOWN_2, .power = 0, .type = TYPE_NORMAL, .accuracy = 100, @@ -3001,6 +3232,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_IRON_TAIL] = @@ -3013,7 +3245,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_METAL_CLAW] = @@ -3026,7 +3259,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_VITAL_THROW] = @@ -3040,6 +3274,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = -1, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_MORNING_SUN] = @@ -3053,6 +3288,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_SYNTHESIS] = @@ -3066,25 +3302,27 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_MOONLIGHT] = { .effect = EFFECT_MOONLIGHT, .power = 0, - .type = TYPE_NORMAL, + .type = TYPE_FAIRY, .accuracy = 0, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_HIDDEN_POWER] = { .effect = EFFECT_HIDDEN_POWER, - .power = 1, + .power = 60, .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, @@ -3092,11 +3330,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, [MOVE_CROSS_CHOP] = { - .effect = EFFECT_HIGH_CRITICAL, + .effect = EFFECT_HIT, .power = 100, .type = TYPE_FIGHTING, .accuracy = 80, @@ -3104,7 +3343,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_HIGH_CRIT, + .split = SPLIT_PHYSICAL, }, [MOVE_TWISTER] = @@ -3117,7 +3357,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 20, .target = MOVE_TARGET_BOTH, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_DMG_IN_AIR, + .split = SPLIT_SPECIAL, }, [MOVE_RAIN_DANCE] = @@ -3130,7 +3371,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, - .flags = 0, + .flags = FLAG_DANCE, + .split = SPLIT_STATUS, }, [MOVE_SUNNY_DAY] = @@ -3144,11 +3386,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, [MOVE_CRUNCH] = { - .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, + .effect = EFFECT_DEFENSE_DOWN_HIT, .power = 80, .type = TYPE_DARK, .accuracy = 100, @@ -3156,7 +3399,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_STRONG_JAW_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_MIRROR_COAT] = @@ -3170,6 +3414,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_DEPENDS, .priority = -5, .flags = FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_SPECIAL, }, [MOVE_PSYCH_UP] = @@ -3183,19 +3428,21 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_EXTREME_SPEED] = { - .effect = EFFECT_QUICK_ATTACK, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, - .priority = 1, + .priority = 2, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_ANCIENT_POWER] = @@ -3208,7 +3455,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_SHADOW_BALL] = @@ -3221,46 +3469,50 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_BALLISTIC, + .split = SPLIT_SPECIAL, }, [MOVE_FUTURE_SIGHT] = { .effect = EFFECT_FUTURE_SIGHT, - .power = 80, + .power = 120, .type = TYPE_PSYCHIC, - .accuracy = 90, - .pp = 15, + .accuracy = 100, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, + .split = SPLIT_SPECIAL, }, [MOVE_ROCK_SMASH] = { .effect = EFFECT_DEFENSE_DOWN_HIT, - .power = 20, + .power = 40, .type = TYPE_FIGHTING, .accuracy = 100, .pp = 15, .secondaryEffectChance = 50, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_WHIRLPOOL] = { .effect = EFFECT_TRAP, - .power = 15, + .power = 35, .type = TYPE_WATER, - .accuracy = 70, + .accuracy = 85, .pp = 15, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_DMG_UNDERWATER, + .split = SPLIT_SPECIAL, }, [MOVE_BEAT_UP] = @@ -3274,6 +3526,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_FAKE_OUT] = @@ -3283,23 +3536,25 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 1, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_UPROAR] = { .effect = EFFECT_UPROAR, - .power = 50, + .power = 90, .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, .secondaryEffectChance = 100, .target = MOVE_TARGET_RANDOM, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SOUND, + .split = SPLIT_SPECIAL, }, [MOVE_STOCKPILE] = @@ -3308,11 +3563,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .power = 0, .type = TYPE_NORMAL, .accuracy = 0, - .pp = 10, + .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_SPIT_UP] = @@ -3326,6 +3582,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, [MOVE_SWALLOW] = @@ -3339,19 +3596,21 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_HEAT_WAVE] = { .effect = EFFECT_BURN_HIT, - .power = 100, + .power = 95, .type = TYPE_FIRE, .accuracy = 90, .pp = 10, .secondaryEffectChance = 10, .target = MOVE_TARGET_BOTH, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_HAIL] = @@ -3365,6 +3624,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_PROTECT_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_TORMENT] = @@ -3377,7 +3637,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_MAGICCOAT_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_FLATTER] = @@ -3391,6 +3652,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_WILL_O_WISP] = @@ -3398,12 +3660,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .effect = EFFECT_WILL_O_WISP, .power = 0, .type = TYPE_FIRE, - .accuracy = 75, + .accuracy = 85, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_MEMENTO] = @@ -3417,6 +3680,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_FACADE] = @@ -3430,6 +3694,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_FOCUS_PUNCH] = @@ -3442,13 +3707,14 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = -3, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_IRON_FIST_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_SMELLING_SALT] = { .effect = EFFECT_SMELLINGSALT, - .power = 60, + .power = 70, .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, @@ -3456,6 +3722,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_PHYSICAL, + .argument = STATUS1_PARALYSIS, }, [MOVE_FOLLOW_ME] = @@ -3469,6 +3737,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 3, .flags = 0, + .split = SPLIT_STATUS, }, [MOVE_NATURE_POWER] = @@ -3482,6 +3751,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_DEPENDS, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, [MOVE_CHARGE] = @@ -3495,6 +3765,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_TAUNT] = @@ -3507,7 +3778,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_HELPING_HAND] = @@ -3521,6 +3793,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 5, .flags = 0, + .split = SPLIT_STATUS, }, [MOVE_TRICK] = @@ -3534,6 +3807,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_ROLE_PLAY] = @@ -3547,6 +3821,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, [MOVE_WISH] = @@ -3559,7 +3834,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_ASSIST] = @@ -3573,6 +3849,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_DEPENDS, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, [MOVE_INGRAIN] = @@ -3586,6 +3863,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_SUPERPOWER] = @@ -3599,6 +3877,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_MAGIC_COAT] = @@ -3612,6 +3891,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_DEPENDS, .priority = 4, .flags = 0, + .split = SPLIT_STATUS, }, [MOVE_RECYCLE] = @@ -3624,7 +3904,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, - .flags = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_REVENGE] = @@ -3638,6 +3919,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = -4, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_BRICK_BREAK] = @@ -3651,6 +3933,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_YAWN] = @@ -3664,12 +3947,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_KNOCK_OFF] = { .effect = EFFECT_KNOCK_OFF, - .power = 20, + .power = 65, .type = TYPE_DARK, .accuracy = 100, .pp = 20, @@ -3677,6 +3961,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_ENDEAVOR] = @@ -3690,6 +3975,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_ERUPTION] = @@ -3703,6 +3989,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, [MOVE_SKILL_SWAP] = @@ -3716,6 +4003,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_IMPRISON] = @@ -3728,7 +4016,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_REFRESH] = @@ -3742,6 +4031,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_GRUDGE] = @@ -3755,6 +4045,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_SNATCH] = @@ -3768,6 +4059,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_DEPENDS, .priority = 4, .flags = FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_SECRET_POWER] = @@ -3780,13 +4072,14 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_DIVE] = { .effect = EFFECT_SEMI_INVULNERABLE, - .power = 60, + .power = 80, .type = TYPE_WATER, .accuracy = 100, .pp = 10, @@ -3794,6 +4087,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_ARM_THRUST] = @@ -3807,6 +4101,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_CAMOUFLAGE] = @@ -3820,11 +4115,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_TAIL_GLOW] = { - .effect = EFFECT_SPECIAL_ATTACK_UP_2, + .effect = EFFECT_SPECIAL_ATTACK_UP_3, .power = 0, .type = TYPE_BUG, .accuracy = 100, @@ -3833,6 +4129,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_LUSTER_PURGE] = @@ -3845,7 +4142,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 50, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_MIST_BALL] = @@ -3858,7 +4156,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 50, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_BALLISTIC | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_FEATHER_DANCE] = @@ -3871,7 +4170,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_DANCE, + .split = SPLIT_STATUS, }, [MOVE_TEETER_DANCE] = @@ -3884,12 +4184,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_DANCE, + .split = SPLIT_STATUS, }, [MOVE_BLAZE_KICK] = { - .effect = EFFECT_BLAZE_KICK, + .effect = EFFECT_BURN_HIT, .power = 85, .type = TYPE_FIRE, .accuracy = 90, @@ -3897,7 +4198,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_HIGH_CRIT | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_MUD_SPORT] = @@ -3911,6 +4213,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, [MOVE_ICE_BALL] = @@ -3923,7 +4226,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_BALLISTIC, + .split = SPLIT_PHYSICAL, }, [MOVE_NEEDLE_ARM] = @@ -3936,7 +4240,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_SLACK_OFF] = @@ -3950,6 +4255,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_HYPER_VOICE] = @@ -3962,7 +4268,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, + .split = SPLIT_SPECIAL, }, [MOVE_POISON_FANG] = @@ -3975,7 +4282,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_STRONG_JAW_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_CRUSH_CLAW] = @@ -3988,7 +4296,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 50, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_BLAST_BURN] = @@ -4002,6 +4311,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, [MOVE_HYDRO_CANNON] = @@ -4015,19 +4325,21 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, [MOVE_METEOR_MASH] = { .effect = EFFECT_ATTACK_UP_HIT, - .power = 100, + .power = 90, .type = TYPE_STEEL, - .accuracy = 85, + .accuracy = 90, .pp = 10, .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_IRON_FIST_BOOST | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_ASTONISH] = @@ -4040,7 +4352,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_WEATHER_BALL] = @@ -4053,7 +4366,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_BALLISTIC, + .split = SPLIT_SPECIAL, }, [MOVE_AROMATHERAPY] = @@ -4067,6 +4381,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_FAKE_TEARS] = @@ -4080,25 +4395,27 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_AIR_CUTTER] = { - .effect = EFFECT_HIGH_CRITICAL, - .power = 55, + .effect = EFFECT_HIT, + .power = 60, .type = TYPE_FLYING, .accuracy = 95, .pp = 25, .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_HIGH_CRIT, + .split = SPLIT_SPECIAL, }, [MOVE_OVERHEAT] = { .effect = EFFECT_OVERHEAT, - .power = 140, + .power = 130, .type = TYPE_FIRE, .accuracy = 90, .pp = 5, @@ -4106,6 +4423,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, [MOVE_ODOR_SLEUTH] = @@ -4113,25 +4431,27 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .effect = EFFECT_FORESIGHT, .power = 0, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = 40, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_MAGICCOAT_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_ROCK_TOMB] = { .effect = EFFECT_SPEED_DOWN_HIT, - .power = 50, + .power = 60, .type = TYPE_ROCK, - .accuracy = 80, - .pp = 10, + .accuracy = 95, + .pp = 15, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_SILVER_WIND] = @@ -4144,7 +4464,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_METAL_SOUND] = @@ -4157,7 +4478,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, + .split = SPLIT_STATUS, }, [MOVE_GRASS_WHISTLE] = @@ -4170,7 +4492,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, + .split = SPLIT_STATUS, }, [MOVE_TICKLE] = @@ -4184,6 +4507,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_COSMIC_POWER] = @@ -4197,6 +4521,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_WATER_SPOUT] = @@ -4210,6 +4535,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_SPECIAL, }, [MOVE_SIGNAL_BEAM] = @@ -4222,12 +4548,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_SHADOW_PUNCH] = { - .effect = EFFECT_ALWAYS_HIT, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_GHOST, .accuracy = 0, @@ -4235,7 +4562,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_IRON_FIST_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_EXTRASENSORY] = @@ -4244,11 +4572,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .power = 80, .type = TYPE_PSYCHIC, .accuracy = 100, - .pp = 30, + .pp = 20, .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_SKY_UPPERCUT] = @@ -4261,20 +4590,22 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_IRON_FIST_BOOST | FLAG_HIT_IN_AIR, + .split = SPLIT_PHYSICAL, }, [MOVE_SAND_TOMB] = { .effect = EFFECT_TRAP, - .power = 15, + .power = 35, .type = TYPE_GROUND, - .accuracy = 70, + .accuracy = 85, .pp = 15, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_SHEER_COLD] = @@ -4288,37 +4619,40 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_SPECIAL, }, [MOVE_MUDDY_WATER] = { .effect = EFFECT_ACCURACY_DOWN_HIT, - .power = 95, + .power = 90, .type = TYPE_WATER, .accuracy = 85, .pp = 10, .secondaryEffectChance = 30, .target = MOVE_TARGET_BOTH, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_BULLET_SEED] = { .effect = EFFECT_MULTI_HIT, - .power = 10, + .power = 25, .type = TYPE_GRASS, .accuracy = 100, .pp = 30, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_BALLISTIC, + .split = SPLIT_PHYSICAL, }, [MOVE_AERIAL_ACE] = { - .effect = EFFECT_ALWAYS_HIT, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_FLYING, .accuracy = 0, @@ -4327,12 +4661,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_ICICLE_SPEAR] = { .effect = EFFECT_MULTI_HIT, - .power = 10, + .power = 25, .type = TYPE_ICE, .accuracy = 100, .pp = 30, @@ -4340,6 +4675,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_IRON_DEFENSE] = @@ -4353,6 +4689,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_BLOCK] = @@ -4365,7 +4702,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_HOWL] = @@ -4379,6 +4717,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_DRAGON_CLAW] = @@ -4392,6 +4731,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_FRENZY_PLANT] = @@ -4405,6 +4745,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, [MOVE_BULK_UP] = @@ -4418,6 +4759,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_BOUNCE] = @@ -4430,7 +4772,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + .argument = MOVE_EFFECT_PARALYSIS, }, [MOVE_MUD_SHOT] = @@ -4443,12 +4787,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_POISON_TAIL] = { - .effect = EFFECT_POISON_TAIL, + .effect = EFFECT_POISON_HIT, .power = 50, .type = TYPE_POISON, .accuracy = 100, @@ -4456,38 +4801,42 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_HIGH_CRIT | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, }, [MOVE_COVET] = { .effect = EFFECT_THIEF, - .power = 40, + .power = 60, .type = TYPE_NORMAL, .accuracy = 100, - .pp = 40, + .pp = 25, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_PHYSICAL, }, [MOVE_VOLT_TACKLE] = { - .effect = EFFECT_DOUBLE_EDGE, + .effect = EFFECT_RECOIL_33_STATUS, .power = 120, .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, + .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_RECKLESS_BOOST | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + .argument = STATUS1_PARALYSIS, }, [MOVE_MAGICAL_LEAF] = { - .effect = EFFECT_ALWAYS_HIT, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_GRASS, .accuracy = 0, @@ -4496,6 +4845,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, [MOVE_WATER_SPORT] = @@ -4509,6 +4859,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, [MOVE_CALM_MIND] = @@ -4522,19 +4873,21 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, [MOVE_LEAF_BLADE] = { - .effect = EFFECT_HIGH_CRITICAL, - .power = 70, + .effect = EFFECT_HIT, + .power = 90, .type = TYPE_GRASS, .accuracy = 100, .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_HIGH_CRIT, + .split = SPLIT_PHYSICAL, }, [MOVE_DRAGON_DANCE] = @@ -4547,7 +4900,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, - .flags = FLAG_SNATCH_AFFECTED, + .flags = FLAG_SNATCH_AFFECTED | FLAG_DANCE, + .split = SPLIT_STATUS, }, [MOVE_ROCK_BLAST] = @@ -4555,17 +4909,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .effect = EFFECT_MULTI_HIT, .power = 25, .type = TYPE_ROCK, - .accuracy = 80, + .accuracy = 90, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_BALLISTIC, + .split = SPLIT_PHYSICAL, }, [MOVE_SHOCK_WAVE] = { - .effect = EFFECT_ALWAYS_HIT, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_ELECTRIC, .accuracy = 0, @@ -4574,6 +4929,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, [MOVE_WATER_PULSE] = @@ -4586,20 +4942,22 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_MEGA_LAUNCHER_BOOST, + .split = SPLIT_SPECIAL, }, [MOVE_DOOM_DESIRE] = { .effect = EFFECT_FUTURE_SIGHT, - .power = 120, + .power = 140, .type = TYPE_STEEL, - .accuracy = 85, + .accuracy = 100, .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, + .split = SPLIT_SPECIAL, }, [MOVE_PSYCHO_BOOST] = @@ -4613,5 +4971,5023 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_ROOST] = + { + .effect = EFFECT_ROOST, + .power = 0, + .type = TYPE_FLYING, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_GRAVITY] = + { + .effect = EFFECT_GRAVITY, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + + [MOVE_MIRACLE_EYE] = + { + .effect = EFFECT_MIRACLE_EYE, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 40, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_WAKE_UP_SLAP] = + { + .effect = EFFECT_WAKE_UP_SLAP, + .power = 70, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + .argument = STATUS1_SLEEP, + }, + + [MOVE_HAMMER_ARM] = + { + .effect = EFFECT_HAMMER_ARM, + .power = 100, + .type = TYPE_FIGHTING, + .accuracy = 90, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_IRON_FIST_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_GYRO_BALL] = + { + .effect = EFFECT_GYRO_BALL, + .power = 1, + .type = TYPE_STEEL, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_BALLISTIC, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_HEALING_WISH] = + { + .effect = EFFECT_HEALING_WISH, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_BRINE] = + { + .effect = EFFECT_BRINE, + .power = 65, + .type = TYPE_WATER, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_NATURAL_GIFT] = + { + .effect = EFFECT_NATURAL_GIFT, + .power = 1, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_FEINT] = + { + .effect = EFFECT_FEINT, + .power = 30, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 2, + .flags = FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_PLUCK] = + { + .effect = EFFECT_BUG_BITE, + .power = 60, + .type = TYPE_FLYING, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_TAILWIND] = + { + .effect = EFFECT_TAILWIND, + .power = 0, + .type = TYPE_FLYING, + .accuracy = 0, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_ACUPRESSURE] = + { + .effect = EFFECT_ACUPRESSURE, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 30, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER | MOVE_TARGET_ALLY, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + + [MOVE_METAL_BURST] = + { + .effect = EFFECT_METAL_BURST, + .power = 0, + .type = TYPE_STEEL, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_DEPENDS, + .priority = 0, + .flags = 0, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_U_TURN] = + { + .effect = EFFECT_HIT_ESCAPE, + .power = 70, + .type = TYPE_BUG, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_CLOSE_COMBAT] = + { + .effect = EFFECT_CLOSE_COMBAT, + .power = 120, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_PAYBACK] = + { + .effect = EFFECT_PAYBACK, + .power = 50, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_ASSURANCE] = + { + .effect = EFFECT_ASSURANCE, + .power = 60, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_EMBARGO] = + { + .effect = EFFECT_EMBARGO, + .power = 0, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_FLING] = + { + .effect = EFFECT_FLING, + .power = 1, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_PSYCHO_SHIFT] = + { + .effect = EFFECT_PSYCHO_SHIFT, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_TRUMP_CARD] = + { + .effect = EFFECT_TRUMP_CARD, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_HEAL_BLOCK] = + { + .effect = EFFECT_HEAL_BLOCK, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_WRING_OUT] = + { + .effect = EFFECT_WRING_OUT, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_POWER_TRICK] = + { + .effect = EFFECT_POWER_TRICK, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_GASTRO_ACID] = + { + .effect = EFFECT_GASTRO_ACID, + .power = 0, + .type = TYPE_POISON, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_LUCKY_CHANT] = + { + .effect = EFFECT_LUCKY_CHANT, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 30, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_ME_FIRST] = + { + .effect = EFFECT_ME_FIRST, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_COPYCAT] = + { + .effect = EFFECT_COPYCAT, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_DEPENDS, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + + [MOVE_POWER_SWAP] = + { + .effect = EFFECT_POWER_SWAP, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_GUARD_SWAP] = + { + .effect = EFFECT_GUARD_SWAP, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_PUNISHMENT] = + { + .effect = EFFECT_PUNISHMENT, + .power = 60, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_LAST_RESORT] = + { + .effect = EFFECT_LAST_RESORT, + .power = 140, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_WORRY_SEED] = + { + .effect = EFFECT_WORRY_SEED, + .power = 0, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_SUCKER_PUNCH] = + { + .effect = EFFECT_SUCKER_PUNCH, + .power = 70, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 1, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_TOXIC_SPIKES] = + { + .effect = EFFECT_TOXIC_SPIKES, + .power = 0, + .type = TYPE_POISON, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_OPPONENTS_FIELD, + .priority = 0, + .flags = FLAG_MAGICCOAT_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_HEART_SWAP] = + { + .effect = EFFECT_HEART_SWAP, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_AQUA_RING] = + { + .effect = EFFECT_AQUA_RING, + .power = 0, + .type = TYPE_WATER, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_MAGNET_RISE] = + { + .effect = EFFECT_MAGNET_RISE, + .power = 0, + .type = TYPE_ELECTRIC, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_FLARE_BLITZ] = + { + .effect = EFFECT_RECOIL_33_STATUS, + .power = 120, + .type = TYPE_FIRE, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 10, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_RECKLESS_BOOST, + .split = SPLIT_PHYSICAL, + .argument = STATUS1_BURN, + }, + + [MOVE_FORCE_PALM] = + { + .effect = EFFECT_PARALYZE_HIT, + .power = 60, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 30, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_AURA_SPHERE] = + { + .effect = EFFECT_HIT, + .power = 80, + .type = TYPE_FIGHTING, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_MEGA_LAUNCHER_BOOST | FLAG_BALLISTIC, + .split = SPLIT_SPECIAL, + }, + + [MOVE_ROCK_POLISH] = + { + .effect = EFFECT_SPEED_UP_2, + .power = 0, + .type = TYPE_ROCK, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_POISON_JAB] = + { + .effect = EFFECT_POISON_HIT, + .power = 80, + .type = TYPE_POISON, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 30, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_DARK_PULSE] = + { + .effect = EFFECT_FLINCH_HIT, + .power = 80, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 20, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_MEGA_LAUNCHER_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_NIGHT_SLASH] = + { + .effect = EFFECT_HIT, + .power = 70, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_HIGH_CRIT, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_AQUA_TAIL] = + { + .effect = EFFECT_HIT, + .power = 90, + .type = TYPE_WATER, + .accuracy = 90, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_SEED_BOMB] = + { + .effect = EFFECT_HIT, + .power = 80, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_AIR_SLASH] = + { + .effect = EFFECT_FLINCH_HIT, + .power = 75, + .type = TYPE_FLYING, + .accuracy = 95, + .pp = 15, + .secondaryEffectChance = 30, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_X_SCISSOR] = + { + .effect = EFFECT_HIT, + .power = 80, + .type = TYPE_BUG, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_BUG_BUZZ] = + { + .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, + .power = 90, + .type = TYPE_BUG, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 10, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SOUND | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_DRAGON_PULSE] = + { + .effect = EFFECT_HIT, + .power = 85, + .type = TYPE_DRAGON, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_MEGA_LAUNCHER_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_DRAGON_RUSH] = + { + .effect = EFFECT_FLINCH_HIT, + .power = 100, + .type = TYPE_DRAGON, + .accuracy = 75, + .pp = 10, + .secondaryEffectChance = 20, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_DMG_MINIMIZE, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_POWER_GEM] = + { + .effect = EFFECT_HIT, + .power = 80, + .type = TYPE_ROCK, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_DRAIN_PUNCH] = + { + .effect = EFFECT_ABSORB, + .power = 75, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_IRON_FIST_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_VACUUM_WAVE] = + { + .effect = EFFECT_HIT, + .power = 40, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 30, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 1, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_FOCUS_BLAST] = + { + .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, + .power = 120, + .type = TYPE_FIGHTING, + .accuracy = 70, + .pp = 5, + .secondaryEffectChance = 10, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_BALLISTIC, + .split = SPLIT_SPECIAL, + }, + + [MOVE_ENERGY_BALL] = + { + .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, + .power = 90, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 10, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_BALLISTIC | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_BRAVE_BIRD] = + { + .effect = EFFECT_RECOIL_33, + .power = 120, + .type = TYPE_FLYING, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_RECKLESS_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_EARTH_POWER] = + { + .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, + .power = 90, + .type = TYPE_GROUND, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 10, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_SWITCHEROO] = + { + .effect = EFFECT_TRICK, + .power = 0, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_GIGA_IMPACT] = + { + .effect = EFFECT_RECHARGE, + .power = 150, + .type = TYPE_NORMAL, + .accuracy = 90, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_NASTY_PLOT] = + { + .effect = EFFECT_SPECIAL_ATTACK_UP_2, + .power = 0, + .type = TYPE_DARK, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_BULLET_PUNCH] = + { + .effect = EFFECT_HIT, + .power = 40, + .type = TYPE_STEEL, + .accuracy = 100, + .pp = 30, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 1, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_IRON_FIST_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_AVALANCHE] = + { + .effect = EFFECT_REVENGE, + .power = 60, + .type = TYPE_ICE, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_BOTH, + .priority = -4, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_ICE_SHARD] = + { + .effect = EFFECT_HIT, + .power = 40, + .type = TYPE_ICE, + .accuracy = 100, + .pp = 30, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 1, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_SHADOW_CLAW] = + { + .effect = EFFECT_HIT, + .power = 70, + .type = TYPE_GHOST, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_HIGH_CRIT, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_THUNDER_FANG] = + { + .effect = EFFECT_FLINCH_STATUS, + .power = 65, + .type = TYPE_ELECTRIC, + .accuracy = 95, + .pp = 15, + .secondaryEffectChance = 10, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_STRONG_JAW_BOOST, + .split = SPLIT_PHYSICAL, + .argument = STATUS1_PARALYSIS, + }, + + [MOVE_ICE_FANG] = + { + .effect = EFFECT_FLINCH_STATUS, + .power = 65, + .type = TYPE_ICE, + .accuracy = 95, + .pp = 15, + .secondaryEffectChance = 10, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_STRONG_JAW_BOOST, + .split = SPLIT_PHYSICAL, + .argument = STATUS1_FREEZE, + }, + + [MOVE_FIRE_FANG] = + { + .effect = EFFECT_FLINCH_STATUS, + .power = 65, + .type = TYPE_FIRE, + .accuracy = 95, + .pp = 15, + .secondaryEffectChance = 10, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_STRONG_JAW_BOOST, + .split = SPLIT_PHYSICAL, + .argument = STATUS1_BURN, + }, + + [MOVE_SHADOW_SNEAK] = + { + .effect = EFFECT_HIT, + .power = 40, + .type = TYPE_GHOST, + .accuracy = 100, + .pp = 30, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 1, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_MUD_BOMB] = + { + .effect = EFFECT_ACCURACY_DOWN_HIT, + .power = 65, + .type = TYPE_GROUND, + .accuracy = 85, + .pp = 10, + .secondaryEffectChance = 30, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_BALLISTIC, + .split = SPLIT_SPECIAL, + }, + + [MOVE_PSYCHO_CUT] = + { + .effect = EFFECT_HIT, + .power = 70, + .type = TYPE_PSYCHIC, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_HIGH_CRIT, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_ZEN_HEADBUTT] = + { + .effect = EFFECT_FLINCH_HIT, + .power = 80, + .type = TYPE_PSYCHIC, + .accuracy = 90, + .pp = 15, + .secondaryEffectChance = 20, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_MIRROR_SHOT] = + { + .effect = EFFECT_ACCURACY_DOWN_HIT, + .power = 65, + .type = TYPE_STEEL, + .accuracy = 85, + .pp = 10, + .secondaryEffectChance = 30, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_FLASH_CANNON] = + { + .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, + .power = 80, + .type = TYPE_STEEL, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 10, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_ROCK_CLIMB] = + { + .effect = EFFECT_CONFUSE_HIT, + .power = 90, + .type = TYPE_NORMAL, + .accuracy = 85, + .pp = 20, + .secondaryEffectChance = 20, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_DEFOG] = + { + .effect = EFFECT_DEFOG, + .power = 0, + .type = TYPE_FLYING, + .accuracy = 0, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_TRICK_ROOM] = + { + .effect = EFFECT_TRICK_ROOM, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = -7, + .flags = 0, + .split = SPLIT_STATUS, + }, + + [MOVE_DRACO_METEOR] = + { + .effect = EFFECT_OVERHEAT, + .power = 130, + .type = TYPE_DRAGON, + .accuracy = 90, + .pp = 5, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_DISCHARGE] = + { + .effect = EFFECT_PARALYZE_HIT, + .power = 80, + .type = TYPE_ELECTRIC, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 30, + .target = MOVE_TARGET_FOES_AND_ALLY, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_LAVA_PLUME] = + { + .effect = EFFECT_BURN_HIT, + .power = 80, + .type = TYPE_FIRE, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 30, + .target = MOVE_TARGET_FOES_AND_ALLY, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_LEAF_STORM] = + { + .effect = EFFECT_OVERHEAT, + .power = 130, + .type = TYPE_GRASS, + .accuracy = 90, + .pp = 5, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_POWER_WHIP] = + { + .effect = EFFECT_HIT, + .power = 120, + .type = TYPE_GRASS, + .accuracy = 85, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_ROCK_WRECKER] = + { + .effect = EFFECT_RECHARGE, + .power = 150, + .type = TYPE_ROCK, + .accuracy = 90, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_BALLISTIC, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_CROSS_POISON] = + { + .effect = EFFECT_POISON_HIT, + .power = 70, + .type = TYPE_POISON, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 10, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_HIGH_CRIT | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_GUNK_SHOT] = + { + .effect = EFFECT_POISON_HIT, + .power = 120, + .type = TYPE_POISON, + .accuracy = 80, + .pp = 5, + .secondaryEffectChance = 30, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_IRON_HEAD] = + { + .effect = EFFECT_FLINCH_HIT, + .power = 80, + .type = TYPE_STEEL, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 30, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_MAGNET_BOMB] = + { + .effect = EFFECT_HIT, + .power = 60, + .type = TYPE_STEEL, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_BALLISTIC, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_STONE_EDGE] = + { + .effect = EFFECT_HIT, + .power = 100, + .type = TYPE_ROCK, + .accuracy = 80, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_HIGH_CRIT, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_CAPTIVATE] = + { + .effect = EFFECT_CAPTIVATE, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_BOTH, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_STEALTH_ROCK] = + { + .effect = EFFECT_STEALTH_ROCK, + .power = 0, + .type = TYPE_ROCK, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_OPPONENTS_FIELD, + .priority = 0, + .flags = FLAG_MAGICCOAT_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_GRASS_KNOT] = + { + .effect = EFFECT_LOW_KICK, + .power = 1, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_CHATTER] = + { + .effect = EFFECT_CONFUSE_HIT, + .power = 65, + .type = TYPE_FLYING, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_SOUND | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_JUDGMENT] = + { + .effect = EFFECT_JUDGMENT, + .power = 100, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_BUG_BITE] = + { + .effect = EFFECT_BUG_BITE, + .power = 60, + .type = TYPE_BUG, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_CHARGE_BEAM] = + { + .effect = EFFECT_SP_ATTACK_UP_HIT, + .power = 50, + .type = TYPE_ELECTRIC, + .accuracy = 90, + .pp = 10, + .secondaryEffectChance = 70, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_WOOD_HAMMER] = + { + .effect = EFFECT_RECOIL_25, + .power = 120, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_RECKLESS_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_AQUA_JET] = + { + .effect = EFFECT_HIT, + .power = 40, + .type = TYPE_WATER, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 1, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_ATTACK_ORDER] = + { + .effect = EFFECT_HIT, + .power = 90, + .type = TYPE_BUG, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_HIGH_CRIT, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_DEFEND_ORDER] = + { + .effect = EFFECT_COSMIC_POWER, + .power = 0, + .type = TYPE_BUG, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_HEAL_ORDER] = + { + .effect = EFFECT_RESTORE_HP, + .power = 0, + .type = TYPE_BUG, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_HEAD_SMASH] = + { + .effect = EFFECT_RECOIL_50, + .power = 150, + .type = TYPE_ROCK, + .accuracy = 80, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_RECKLESS_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_DOUBLE_HIT] = + { + .effect = EFFECT_DOUBLE_HIT, + .power = 35, + .type = TYPE_NORMAL, + .accuracy = 90, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_ROAR_OF_TIME] = + { + .effect = EFFECT_RECHARGE, + .power = 150, + .type = TYPE_DRAGON, + .accuracy = 90, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_SPACIAL_REND] = + { + .effect = EFFECT_HIT, + .power = 100, + .type = TYPE_DRAGON, + .accuracy = 95, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_HIGH_CRIT, + .split = SPLIT_SPECIAL, + }, + + [MOVE_LUNAR_DANCE] = + { + .effect = EFFECT_HEALING_WISH, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_DANCE | FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_CRUSH_GRIP] = + { + .effect = EFFECT_WRING_OUT, + .power = 1, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_MAGMA_STORM] = + { + .effect = EFFECT_TRAP, + .power = 100, + .type = TYPE_FIRE, + .accuracy = 75, + .pp = 5, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_DARK_VOID] = + { + .effect = EFFECT_SLEEP, + .power = 0, + .type = TYPE_DARK, + .accuracy = 50, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_BOTH, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_SEED_FLARE] = + { + .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2, + .power = 120, + .type = TYPE_GRASS, + .accuracy = 85, + .pp = 5, + .secondaryEffectChance = 40, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_OMINOUS_WIND] = + { + .effect = EFFECT_ALL_STATS_UP_HIT, + .power = 60, + .type = TYPE_GHOST, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 10, + .target = MOVE_TARGET_BOTH, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_SHADOW_FORCE] = + { + .effect = EFFECT_SEMI_INVULNERABLE, + .power = 120, + .type = TYPE_GHOST, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_DMG_MINIMIZE, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_HONE_CLAWS] = + { + .effect = EFFECT_ATTACK_ACCURACY_UP, + .power = 0, + .type = TYPE_DARK, + .accuracy = 0, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_WIDE_GUARD] = + { + .effect = EFFECT_PROTECT, + .power = 0, + .type = TYPE_ROCK, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 3, + .flags = FLAG_PROTECTION_MOVE | FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + .argument = TRUE, // Protects the whole side. + }, + + [MOVE_GUARD_SPLIT] = + { + .effect = EFFECT_GUARD_SPLIT, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_POWER_SPLIT] = + { + .effect = EFFECT_POWER_SPLIT, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_WONDER_ROOM] = + { + .effect = EFFECT_WONDER_ROOM, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + + [MOVE_PSYSHOCK] = + { + .effect = EFFECT_PSYSHOCK, + .power = 80, + .type = TYPE_PSYCHIC, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_VENOSHOCK] = + { + .effect = EFFECT_VENOSHOCK, + .power = 65, + .type = TYPE_POISON, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_AUTOTOMIZE] = + { + .effect = EFFECT_AUTOTOMIZE, + .power = 0, + .type = TYPE_STEEL, + .accuracy = 0, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_RAGE_POWDER] = + { + .effect = EFFECT_FOLLOW_ME, + .power = 0, + .type = TYPE_BUG, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 2, + .flags = FLAG_POWDER, + .split = SPLIT_STATUS, + }, + + [MOVE_TELEKINESIS] = + { + .effect = EFFECT_TELEKINESIS, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_MAGIC_ROOM] = + { + .effect = EFFECT_MAGIC_ROOM, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + + [MOVE_SMACK_DOWN] = + { + .effect = EFFECT_SMACK_DOWN, + .power = 50, + .type = TYPE_ROCK, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_HIT_IN_AIR, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_STORM_THROW] = + { + .effect = EFFECT_ALWAYS_CRIT, + .power = 60, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_FLAME_BURST] = + { + .effect = EFFECT_FLAME_BURST, + .power = 70, + .type = TYPE_FIRE, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_SLUDGE_WAVE] = + { + .effect = EFFECT_POISON_HIT, + .power = 95, + .type = TYPE_POISON, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 10, + .target = MOVE_TARGET_FOES_AND_ALLY, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_QUIVER_DANCE] = + { + .effect = EFFECT_QUIVER_DANCE, + .power = 0, + .type = TYPE_BUG, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED | FLAG_DANCE, + .split = SPLIT_STATUS, + }, + + [MOVE_HEAVY_SLAM] = + { + .effect = EFFECT_HEAT_CRASH, + .power = 1, + .type = TYPE_STEEL, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_SYNCHRONOISE] = + { + .effect = EFFECT_SYNCHRONOISE, + .power = 120, + .type = TYPE_PSYCHIC, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_FOES_AND_ALLY, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_ELECTRO_BALL] = + { + .effect = EFFECT_ELECTRO_BALL, + .power = 1, + .type = TYPE_ELECTRIC, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_BALLISTIC, + .split = SPLIT_SPECIAL, + }, + + [MOVE_SOAK] = + { + .effect = EFFECT_SOAK, + .power = 0, + .type = TYPE_WATER, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_FLAME_CHARGE] = + { + .effect = EFFECT_SPEED_UP_HIT, + .power = 50, + .type = TYPE_FIRE, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_COIL] = + { + .effect = EFFECT_COIL, + .power = 0, + .type = TYPE_POISON, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_LOW_SWEEP] = + { + .effect = EFFECT_SPEED_DOWN_HIT, + .power = 65, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_ACID_SPRAY] = + { + .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2, + .power = 40, + .type = TYPE_POISON, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_BALLISTIC | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_FOUL_PLAY] = + { + .effect = EFFECT_FOUL_PLAY, + .power = 95, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_SIMPLE_BEAM] = + { + .effect = EFFECT_SIMPLE_BEAM, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_ENTRAINMENT] = + { + .effect = EFFECT_ENTRAINMENT, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_AFTER_YOU] = + { + .effect = EFFECT_AFTER_YOU, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + + [MOVE_ROUND] = + { + .effect = EFFECT_ROUND, + .power = 60, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_ECHOED_VOICE] = + { + .effect = EFFECT_ECHOED_VOICE, + .power = 40, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SOUND, + .split = SPLIT_SPECIAL, + }, + + [MOVE_CHIP_AWAY] = + { + .effect = EFFECT_HIT, + .power = 70, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_STAT_STAGES_IGNORED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_CLEAR_SMOG] = + { + .effect = EFFECT_CLEAR_SMOG, + .power = 50, + .type = TYPE_POISON, + .accuracy = 0, + .pp = 15, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_STORED_POWER] = + { + .effect = EFFECT_STORED_POWER, + .power = 20, + .type = TYPE_PSYCHIC, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_QUICK_GUARD] = + { + .effect = EFFECT_PROTECT, + .power = 0, + .type = TYPE_FIGHTING, + .accuracy = 0, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 3, + .flags = FLAG_PROTECTION_MOVE | FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + .argument = TRUE, // Protects the whole side. + }, + + [MOVE_ALLY_SWITCH] = + { + .effect = EFFECT_ALLY_SWITCH, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 1, + .flags = 0, + .split = SPLIT_STATUS, + }, + + [MOVE_SCALD] = + { + .effect = EFFECT_SCALD, + .power = 80, + .type = TYPE_WATER, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 30, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_SHELL_SMASH] = + { + .effect = EFFECT_SHELL_SMASH, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_HEAL_PULSE] = + { + .effect = EFFECT_HEAL_PULSE, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_MEGA_LAUNCHER_BOOST, + .split = SPLIT_STATUS, + }, + + [MOVE_HEX] = + { + .effect = EFFECT_HEX, + .power = 65, + .type = TYPE_GHOST, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_SKY_DROP] = + { + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .power = 60, + .type = TYPE_FLYING, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_SHIFT_GEAR] = + { + .effect = EFFECT_SHIFT_GEAR, + .power = 0, + .type = TYPE_STEEL, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_CIRCLE_THROW] = + { + .effect = EFFECT_HIT_SWITCH_TARGET, + .power = 60, + .type = TYPE_FIGHTING, + .accuracy = 90, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = -6, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_INCINERATE] = + { + .effect = EFFECT_INCINERATE, + .power = 60, + .type = TYPE_FIRE, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_BOTH, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_QUASH] = + { + .effect = EFFECT_QUASH, + .power = 0, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_ACROBATICS] = + { + .effect = EFFECT_ACROBATICS, + .power = 55, + .type = TYPE_FLYING, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_REFLECT_TYPE] = + { + .effect = EFFECT_REFLECT_TYPE, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_RETALIATE] = + { + .effect = EFFECT_RETALITATE, + .power = 70, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_FINAL_GAMBIT] = + { + .effect = EFFECT_HIT_SWITCH_TARGET, + .power = 1, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_BESTOW] = + { + .effect = EFFECT_BESTOW, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_INFERNO] = + { + .effect = EFFECT_BURN_HIT, + .power = 100, + .type = TYPE_FIRE, + .accuracy = 50, + .pp = 5, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_WATER_PLEDGE] = + { + .effect = EFFECT_PLEDGE, + .power = 80, + .type = TYPE_WATER, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_FIRE_PLEDGE] = + { + .effect = EFFECT_PLEDGE, + .power = 80, + .type = TYPE_FIRE, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_GRASS_PLEDGE] = + { + .effect = EFFECT_PLEDGE, + .power = 80, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_VOLT_SWITCH] = + { + .effect = EFFECT_HIT_ESCAPE, + .power = 70, + .type = TYPE_ELECTRIC, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_STRUGGLE_BUG] = + { + .effect = EFFECT_SPECIAL_ATTACK_DOWN_HIT, + .power = 50, + .type = TYPE_BUG, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_BOTH, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_BULLDOZE] = + { + .effect = EFFECT_BULLDOZE, + .power = 60, + .type = TYPE_GROUND, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_FOES_AND_ALLY, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_FROST_BREATH] = + { + .effect = EFFECT_ALWAYS_CRIT, + .power = 60, + .type = TYPE_ICE, + .accuracy = 90, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_DRAGON_TAIL] = + { + .effect = EFFECT_HIT_SWITCH_TARGET, + .power = 60, + .type = TYPE_DRAGON, + .accuracy = 90, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = -6, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_WORK_UP] = + { + .effect = EFFECT_ATTACK_SPATK_UP, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 30, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_ELECTROWEB] = + { + .effect = EFFECT_SPEED_DOWN_HIT, + .power = 55, + .type = TYPE_ELECTRIC, + .accuracy = 95, + .pp = 15, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_BOTH, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_WILD_CHARGE] = + { + .effect = EFFECT_RECOIL_25, + .power = 90, + .type = TYPE_ELECTRIC, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_RECKLESS_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_DRILL_RUN] = + { + .effect = EFFECT_HIT, + .power = 80, + .type = TYPE_GROUND, + .accuracy = 95, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_HIGH_CRIT, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_DUAL_CHOP] = + { + .effect = EFFECT_DOUBLE_HIT, + .power = 40, + .type = TYPE_DRAGON, + .accuracy = 90, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_HEART_STAMP] = + { + .effect = EFFECT_FLINCH_HIT, + .power = 60, + .type = TYPE_PSYCHIC, + .accuracy = 100, + .pp = 25, + .secondaryEffectChance = 30, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_HORN_LEECH] = + { + .effect = EFFECT_ABSORB, + .power = 75, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_SACRED_SWORD] = + { + .effect = EFFECT_HIT, + .power = 90, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_STAT_STAGES_IGNORED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_RAZOR_SHELL] = + { + .effect = EFFECT_DEFENSE_DOWN_HIT, + .power = 75, + .type = TYPE_WATER, + .accuracy = 95, + .pp = 10, + .secondaryEffectChance = 50, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_HEAT_CRASH] = + { + .effect = EFFECT_HEAT_CRASH, + .power = 1, + .type = TYPE_FIRE, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_DMG_MINIMIZE, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_LEAF_TORNADO] = + { + .effect = EFFECT_ACCURACY_DOWN_HIT, + .power = 65, + .type = TYPE_GRASS, + .accuracy = 90, + .pp = 10, + .secondaryEffectChance = 50, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_STEAMROLLER] = + { + .effect = EFFECT_FLINCH_MINIMIZE_HIT, + .power = 65, + .type = TYPE_BUG, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 30, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_DMG_MINIMIZE | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_COTTON_GUARD] = + { + .effect = EFFECT_DEFENSE_UP_3, + .power = 0, + .type = TYPE_GRASS, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_NIGHT_DAZE] = + { + .effect = EFFECT_ACCURACY_DOWN_HIT, + .power = 85, + .type = TYPE_DARK, + .accuracy = 95, + .pp = 10, + .secondaryEffectChance = 40, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_PSYSTRIKE] = + { + .effect = EFFECT_PSYSHOCK, + .power = 100, + .type = TYPE_PSYCHIC, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_TAIL_SLAP] = + { + .effect = EFFECT_MULTI_HIT, + .power = 25, + .type = TYPE_NORMAL, + .accuracy = 85, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_HURRICANE] = + { + .effect = EFFECT_HURRICANE, + .power = 110, + .type = TYPE_FLYING, + .accuracy = 70, + .pp = 10, + .secondaryEffectChance = 30, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_HIT_IN_AIR, + .split = SPLIT_SPECIAL, + }, + + [MOVE_HEAD_CHARGE] = + { + .effect = EFFECT_RECOIL_25, + .power = 120, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_RECKLESS_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_GEAR_GRIND] = + { + .effect = EFFECT_DOUBLE_HIT, + .power = 50, + .type = TYPE_STEEL, + .accuracy = 85, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_SEARING_SHOT] = + { + .effect = EFFECT_BURN_HIT, + .power = 100, + .type = TYPE_FIRE, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 30, + .target = MOVE_TARGET_FOES_AND_ALLY, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_BALLISTIC | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_TECHNO_BLAST] = + { + .effect = EFFECT_TECHNO_BLAST, + .power = 120, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_RELIC_SONG] = + { + .effect = EFFECT_SLEEP_HIT, + .power = 75, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 10, + .target = MOVE_TARGET_BOTH, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_SECRET_SWORD] = + { + .effect = EFFECT_PSYSHOCK, + .power = 85, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_GLACIATE] = + { + .effect = EFFECT_SPEED_DOWN_HIT, + .power = 65, + .type = TYPE_ICE, + .accuracy = 95, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_BOTH, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_BOLT_STRIKE] = + { + .effect = EFFECT_PARALYZE_HIT, + .power = 130, + .type = TYPE_ELECTRIC, + .accuracy = 85, + .pp = 5, + .secondaryEffectChance = 20, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_BLUE_FLARE] = + { + .effect = EFFECT_BURN_HIT, + .power = 130, + .type = TYPE_FIRE, + .accuracy = 85, + .pp = 5, + .secondaryEffectChance = 20, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_FIERY_DANCE] = + { + .effect = EFFECT_SP_ATTACK_UP_HIT, + .power = 80, + .type = TYPE_FIRE, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 50, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_DANCE | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_FREEZE_SHOCK] = + { + .effect = EFFECT_TWO_TURNS_ATTACK, + .power = 140, + .type = TYPE_ICE, + .accuracy = 90, + .pp = 5, + .secondaryEffectChance = 30, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + .argument = MOVE_EFFECT_PARALYSIS, + }, + + [MOVE_ICE_BURN] = + { + .effect = EFFECT_TWO_TURNS_ATTACK, + .power = 140, + .type = TYPE_ICE, + .accuracy = 90, + .pp = 5, + .secondaryEffectChance = 30, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + .argument = MOVE_EFFECT_BURN, + }, + + [MOVE_SNARL] = + { + .effect = EFFECT_SPECIAL_ATTACK_DOWN_HIT, + .power = 55, + .type = TYPE_DARK, + .accuracy = 95, + .pp = 15, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_BOTH, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_SOUND, + .split = SPLIT_SPECIAL, + }, + + [MOVE_ICICLE_CRASH] = + { + .effect = EFFECT_FLINCH_HIT, + .power = 85, + .type = TYPE_ICE, + .accuracy = 90, + .pp = 10, + .secondaryEffectChance = 30, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_V_CREATE] = + { + .effect = EFFECT_V_CREATE, + .power = 180, + .type = TYPE_FIRE, + .accuracy = 95, + .pp = 5, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_FUSION_FLARE] = + { + .effect = EFFECT_FUSION_COMBO, + .power = 100, + .type = TYPE_FIRE, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_FUSION_BOLT] = + { + .effect = EFFECT_FUSION_COMBO, + .power = 100, + .type = TYPE_ELECTRIC, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_FLYING_PRESS] = + { + .effect = EFFECT_TWO_TYPED_MOVE, + .power = 100, + .type = TYPE_FIGHTING, + .accuracy = 95, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_DMG_MINIMIZE, + .split = SPLIT_PHYSICAL, + .argument = TYPE_FLYING, + }, + + [MOVE_MAT_BLOCK] = + { + .effect = EFFECT_MAT_BLOCK, + .power = 0, + .type = TYPE_FIGHTING, + .accuracy = 0, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + .argument = TRUE, // Protects the whole side. + }, + + [MOVE_BELCH] = + { + .effect = EFFECT_BELCH, + .power = 120, + .type = TYPE_POISON, + .accuracy = 90, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_ROTOTILLER] = + { + .effect = EFFECT_ROTOTILLER, + .power = 0, + .type = TYPE_GROUND, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_USER, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + + [MOVE_STICKY_WEB] = + { + .effect = EFFECT_STICKY_WEB, + .power = 0, + .type = TYPE_BUG, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_OPPONENTS_FIELD, + .priority = 0, + .flags = FLAG_MAGICCOAT_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_FELL_STINGER] = + { + .effect = EFFECT_FELL_STINGER, + .power = 50, + .type = TYPE_BUG, + .accuracy = 100, + .pp = 25, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_PHANTOM_FORCE] = + { + .effect = EFFECT_SEMI_INVULNERABLE, + .power = 90, + .type = TYPE_GHOST, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_DMG_MINIMIZE, + .split = SPLIT_PHYSICAL, + .argument = MOVE_EFFECT_FEINT, + }, + + [MOVE_TRICK_OR_TREAT] = + { + .effect = EFFECT_THIRD_TYPE, + .power = 0, + .type = TYPE_GHOST, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + .argument = TYPE_GHOST, + }, + + [MOVE_NOBLE_ROAR] = + { + .effect = EFFECT_NOBLE_ROAR, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 30, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, + .split = SPLIT_STATUS, + }, + + [MOVE_ION_DELUGE] = + { + .effect = EFFECT_ION_DELUGE, + .power = 0, + .type = TYPE_ELECTRIC, + .accuracy = 0, + .pp = 25, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 1, + .flags = 0, + .split = SPLIT_STATUS, + }, + + [MOVE_PARABOLIC_CHARGE] = + { + .effect = EFFECT_ABSORB, + .power = 65, + .type = TYPE_ELECTRIC, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_FOES_AND_ALLY, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_FORESTS_CURSE] = + { + .effect = EFFECT_THIRD_TYPE, + .power = 0, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + .argument = TYPE_GRASS, + }, + + [MOVE_PETAL_BLIZZARD] = + { + .effect = EFFECT_HIT, + .power = 90, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_FOES_AND_ALLY, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_FREEZE_DRY] = + { + .effect = EFFECT_FREEZE_DRY, + .power = 70, + .type = TYPE_ICE, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 10, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_DISARMING_VOICE] = + { + .effect = EFFECT_HIT, + .power = 40, + .type = TYPE_FAIRY, + .accuracy = 0, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_BOTH, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SOUND, + .split = SPLIT_SPECIAL, + }, + + [MOVE_PARTING_SHOT] = + { + .effect = EFFECT_PARTING_SHOT, + .power = 0, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, + .split = SPLIT_STATUS, + }, + + [MOVE_TOPSY_TURVY] = + { + .effect = EFFECT_TOPSY_TURVY, + .power = 0, + .type = TYPE_DARK, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_DRAINING_KISS] = + { + .effect = EFFECT_ABSORB, + .power = 50, + .type = TYPE_FAIRY, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, // restores 75% HP instead of 50% HP + .argument = 75, + }, + + [MOVE_CRAFTY_SHIELD] = + { + .effect = EFFECT_PROTECT, + .power = 0, + .type = TYPE_FAIRY, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 3, + .flags = 0, + .split = SPLIT_STATUS, + .argument = TRUE, // Protects the whole side. + }, + + [MOVE_FLOWER_SHIELD] = + { + .effect = EFFECT_FLOWER_SHIELD, + .power = 0, + .type = TYPE_FAIRY, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER | MOVE_TARGET_FOES_AND_ALLY, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + + [MOVE_GRASSY_TERRAIN] = + { + .effect = EFFECT_GRASSY_TERRAIN, + .power = 0, + .type = TYPE_GRASS, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + + [MOVE_MISTY_TERRAIN] = + { + .effect = EFFECT_MISTY_TERRAIN, + .power = 0, + .type = TYPE_FAIRY, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + + [MOVE_ELECTRIFY] = + { + .effect = EFFECT_ELECTRIFY, + .power = 0, + .type = TYPE_ELECTRIC, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + + [MOVE_PLAY_ROUGH] = + { + .effect = EFFECT_ATTACK_DOWN_HIT, + .power = 90, + .type = TYPE_FAIRY, + .accuracy = 90, + .pp = 10, + .secondaryEffectChance = 10, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_FAIRY_WIND] = + { + .effect = EFFECT_HIT, + .power = 40, + .type = TYPE_FAIRY, + .accuracy = 100, + .pp = 30, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_MOONBLAST] = + { + .effect = EFFECT_SPECIAL_ATTACK_DOWN_HIT, + .power = 95, + .type = TYPE_FAIRY, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 30, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_BOOMBURST] = + { + .effect = EFFECT_HIT, + .power = 140, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_FOES_AND_ALLY, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SOUND, + .split = SPLIT_SPECIAL, + }, + + [MOVE_FAIRY_LOCK] = + { + .effect = EFFECT_FAIRY_LOCK, + .power = 0, + .type = TYPE_FAIRY, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + + [MOVE_KINGS_SHIELD] = + { + .effect = EFFECT_PROTECT, + .power = 0, + .type = TYPE_STEEL, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 4, + .flags = FLAG_PROTECTION_MOVE, + .split = SPLIT_STATUS, + }, + + [MOVE_PLAY_NICE] = + { + .effect = EFFECT_ATTACK_DOWN, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_CONFIDE] = + { + .effect = EFFECT_SPECIAL_ATTACK_DOWN, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, + .split = SPLIT_STATUS, + }, + + [MOVE_DIAMOND_STORM] = + { + .effect = EFFECT_DEFENSE_UP2_HIT, + .power = 100, + .type = TYPE_ROCK, + .accuracy = 95, + .pp = 5, + .secondaryEffectChance = 50, + .target = MOVE_TARGET_BOTH, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_STEAM_ERUPTION] = + { + .effect = EFFECT_SCALD, + .power = 110, + .type = TYPE_WATER, + .accuracy = 95, + .pp = 5, + .secondaryEffectChance = 30, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_HYPERSPACE_HOLE] = + { + .effect = EFFECT_FEINT, + .power = 80, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_WATER_SHURIKEN] = + { + .effect = EFFECT_MULTI_HIT, + .power = 15, + .type = TYPE_WATER, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 1, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_MYSTICAL_FIRE] = + { + .effect = EFFECT_SPECIAL_ATTACK_DOWN_HIT, + .power = 75, + .type = TYPE_FIRE, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_SPIKY_SHIELD] = + { + .effect = EFFECT_PROTECT, + .power = 0, + .type = TYPE_GRASS, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 4, + .flags = FLAG_PROTECTION_MOVE, + .split = SPLIT_STATUS, + }, + + [MOVE_AROMATIC_MIST] = + { + .effect = EFFECT_AROMATIC_MIST, + .power = 0, + .type = TYPE_FAIRY, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_ALLY, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + + [MOVE_EERIE_IMPULSE] = + { + .effect = EFFECT_SPECIAL_ATTACK_DOWN_2, + .power = 0, + .type = TYPE_ELECTRIC, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_VENOM_DRENCH] = + { + .effect = EFFECT_VENOM_DRENCH, + .power = 0, + .type = TYPE_POISON, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_BOTH, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_POWDER] = + { + .effect = EFFECT_POWDER, + .power = 0, + .type = TYPE_BUG, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 1, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_POWDER, + .split = SPLIT_STATUS, + }, + + [MOVE_GEOMANCY] = + { + .effect = EFFECT_GEOMANCY, + .power = 0, + .type = TYPE_FAIRY, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + + [MOVE_MAGNETIC_FLUX] = + { + .effect = EFFECT_MAGNETIC_FLUX, + .power = 0, + .type = TYPE_ELECTRIC, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_HAPPY_HOUR] = + { + .effect = EFFECT_DO_NOTHING, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 30, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + + [MOVE_ELECTRIC_TERRAIN] = + { + .effect = EFFECT_ELECTRIC_TERRAIN, + .power = 0, + .type = TYPE_ELECTRIC, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + + [MOVE_DAZZLING_GLEAM] = + { + .effect = EFFECT_HIT, + .power = 80, + .type = TYPE_FAIRY, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_BOTH, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_CELEBRATE] = + { + .effect = EFFECT_DO_NOTHING, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 40, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + + [MOVE_HOLD_HANDS] = + { + .effect = EFFECT_DO_NOTHING, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 40, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_ALLY, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + + [MOVE_BABY_DOLL_EYES] = + { + .effect = EFFECT_ATTACK_DOWN, + .power = 0, + .type = TYPE_FAIRY, + .accuracy = 100, + .pp = 30, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 1, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_NUZZLE] = + { + .effect = EFFECT_PARALYZE_HIT, + .power = 20, + .type = TYPE_ELECTRIC, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_HOLD_BACK] = + { + .effect = EFFECT_FALSE_SWIPE, + .power = 40, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 40, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_INFESTATION] = + { + .effect = EFFECT_TRAP, + .power = 20, + .type = TYPE_BUG, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_POWER_UP_PUNCH] = + { + .effect = EFFECT_ATTACK_UP_HIT, + .power = 40, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_IRON_FIST_BOOST | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_OBLIVION_WING] = + { + .effect = EFFECT_ABSORB, + .power = 80, + .type = TYPE_FLYING, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + .argument = 75, // restores 75% HP instead of 50% HP + }, + + [MOVE_THOUSAND_ARROWS] = + { + .effect = EFFECT_SMACK_DOWN, + .power = 90, + .type = TYPE_GROUND, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_BOTH, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_HIT_IN_AIR, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_THOUSAND_WAVES] = + { + .effect = EFFECT_HIT_PREVENT_ESCAPE, + .power = 90, + .type = TYPE_GROUND, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_BOTH, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_LANDS_WRATH] = + { + .effect = EFFECT_HIT, + .power = 90, + .type = TYPE_GROUND, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_BOTH, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_LIGHT_OF_RUIN] = + { + .effect = EFFECT_RECOIL_50, + .power = 140, + .type = TYPE_FAIRY, + .accuracy = 90, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_RECKLESS_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_ORIGIN_PULSE] = + { + .effect = EFFECT_HIT, + .power = 110, + .type = TYPE_WATER, + .accuracy = 85, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_BOTH, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_MEGA_LAUNCHER_BOOST, + .split = SPLIT_SPECIAL, + }, + + [MOVE_PRECIPICE_BLADES] = + { + .effect = EFFECT_HIT, + .power = 120, + .type = TYPE_GROUND, + .accuracy = 85, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_BOTH, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_DRAGON_ASCENT] = + { + .effect = EFFECT_CLOSE_COMBAT, + .power = 120, + .type = TYPE_FLYING, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_HYPERSPACE_FURY] = + { + .effect = EFFECT_PLACEHOLDER, + .power = 0, + .type = TYPE_MYSTERY, + .accuracy = 0, + .pp = 0, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_SHORE_UP] = + { + .effect = EFFECT_SHORE_UP, + .power = 0, + .type = TYPE_GROUND, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_FIRST_IMPRESSION] = + { + .effect = EFFECT_FAKE_OUT, + .power = 90, + .type = TYPE_BUG, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 2, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_BANEFUL_BUNKER] = + { + .effect = EFFECT_PROTECT, + .power = 0, + .type = TYPE_POISON, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 4, + .flags = FLAG_PROTECTION_MOVE, + .split = SPLIT_STATUS, + }, + + [MOVE_SPIRIT_SHACKLE] = + { + .effect = EFFECT_HIT_PREVENT_ESCAPE, + .power = 80, + .type = TYPE_GHOST, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_DARKEST_LARIAT] = + { + .effect = EFFECT_HIT, + .power = 85, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_STAT_STAGES_IGNORED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_SPARKLING_ARIA] = + { + .effect = EFFECT_SPARKLING_ARIA, + .power = 90, + .type = TYPE_WATER, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SOUND | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_SPECIAL, + .argument = STATUS1_BURN, + }, + + [MOVE_ICE_HAMMER] = + { + .effect = EFFECT_HAMMER_ARM, + .power = 100, + .type = TYPE_ICE, + .accuracy = 90, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_FLORAL_HEALING] = + { + .effect = EFFECT_HEAL_PULSE, + .power = 0, + .type = TYPE_FAIRY, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_HIGH_HORSEPOWER] = + { + .effect = EFFECT_HIT, + .power = 95, + .type = TYPE_GROUND, + .accuracy = 95, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_STRENGTH_SAP] = + { + .effect = EFFECT_STRENGTH_SAP, + .power = 0, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_SOLAR_BLADE] = + { + .effect = EFFECT_SOLARBEAM, + .power = 125, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_LEAFAGE] = + { + .effect = EFFECT_HIT, + .power = 40, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 40, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_SPOTLIGHT] = + { + .effect = EFFECT_FOLLOW_ME, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 3, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_TOXIC_THREAD] = + { + .effect = EFFECT_TOXIC_THREAD, + .power = 0, + .type = TYPE_POISON, + .accuracy = 100, + .pp = 0, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_LASER_FOCUS] = + { + .effect = EFFECT_LASER_FOCUS, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 30, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_GEAR_UP] = + { + .effect = EFFECT_GEAR_UP, + .power = 0, + .type = TYPE_STEEL, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_THROAT_CHOP] = + { + .effect = EFFECT_THROAT_CHOP, + .power = 80, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_POLLEN_PUFF] = + { + .effect = EFFECT_HIT_ENEMY_HEAL_ALLY, + .power = 90, + .type = TYPE_BUG, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_ANCHOR_SHOT] = + { + .effect = EFFECT_HIT_PREVENT_ESCAPE, + .power = 80, + .type = TYPE_STEEL, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_PSYCHIC_TERRAIN] = + { + .effect = EFFECT_PSYCHIC_TERRAIN, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + + [MOVE_LUNGE] = + { + .effect = EFFECT_ATTACK_DOWN_HIT, + .power = 80, + .type = TYPE_BUG, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_FIRE_LASH] = + { + .effect = EFFECT_DEFENSE_DOWN_HIT, + .power = 80, + .type = TYPE_FIRE, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_POWER_TRIP] = + { + .effect = EFFECT_STORED_POWER, + .power = 20, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_BURN_UP] = + { + .effect = EFFECT_BURN_UP, + .power = 130, + .type = TYPE_FIRE, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_SPEED_SWAP] = + { + .effect = EFFECT_SPEED_SWAP, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_SMART_STRIKE] = + { + .effect = EFFECT_HIT, + .power = 70, + .type = TYPE_STEEL, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_PURIFY] = + { + .effect = EFFECT_PURIFY, + .power = 0, + .type = TYPE_POISON, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_REVELATION_DANCE] = + { + .effect = EFFECT_REVELATION_DANCE, + .power = 90, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_DANCE, + .split = SPLIT_SPECIAL, + }, + + [MOVE_CORE_ENFORCER] = + { + .effect = EFFECT_CORE_ENFORCER, + .power = 100, + .type = TYPE_DRAGON, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_TROP_KICK] = + { + .effect = EFFECT_ATTACK_DOWN_HIT, + .power = 70, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_INSTRUCT] = + { + .effect = EFFECT_INSTRUCT, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_BEAK_BLAST] = + { + .effect = EFFECT_PLACEHOLDER, + .power = 100, + .type = TYPE_FLYING, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = -3, + .flags = FLAG_PROTECT_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_CLANGING_SCALES] = + { + .effect = EFFECT_DEFENSE_DOWN_HIT, + .power = 110, + .type = TYPE_DRAGON, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, + .split = SPLIT_SPECIAL, + }, + + [MOVE_DRAGON_HAMMER] = + { + .effect = EFFECT_HIT, + .power = 90, + .type = TYPE_DRAGON, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_BRUTAL_SWING] = + { + .effect = EFFECT_HIT, + .power = 60, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_FOES_AND_ALLY, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_AURORA_VEIL] = + { + .effect = EFFECT_AURORA_VEIL, + .power = 0, + .type = TYPE_ICE, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_SHELL_TRAP] = + { + .effect = EFFECT_PLACEHOLDER, + .power = 150, + .type = TYPE_FIRE, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = -3, + .flags = FLAG_PROTECT_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_FLEUR_CANNON] = + { + .effect = EFFECT_OVERHEAT, + .power = 130, + .type = TYPE_FAIRY, + .accuracy = 90, + .pp = 5, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_PSYCHIC_FANGS] = + { + .effect = EFFECT_BRICK_BREAK, + .power = 75, + .type = TYPE_PSYCHIC, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_STOMPING_TANTRUM] = + { + .effect = EFFECT_STOMPING_TANTRUM, + .power = 75, + .type = TYPE_GROUND, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_SHADOW_BONE] = + { + .effect = EFFECT_DEFENSE_DOWN_HIT, + .power = 85, + .type = TYPE_GHOST, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 20, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_ACCELEROCK] = + { + .effect = EFFECT_HIT, + .power = 40, + .type = TYPE_ROCK, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 1, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_LIQUIDATION] = + { + .effect = EFFECT_DEFENSE_DOWN_HIT, + .power = 85, + .type = TYPE_WATER, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 20, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_PRISMATIC_LASER] = + { + .effect = EFFECT_RECHARGE, + .power = 160, + .type = TYPE_PSYCHIC, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_SPECTRAL_THIEF] = + { + .effect = EFFECT_SPECTRAL_THIEF, + .power = 90, + .type = TYPE_GHOST, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_SUNSTEEL_STRIKE] = + { + .effect = EFFECT_HIT, + .power = 100, + .type = TYPE_STEEL, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_TARGET_ABILITY_IGNORED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_MOONGEIST_BEAM] = + { + .effect = EFFECT_HIT, + .power = 100, + .type = TYPE_GHOST, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_TARGET_ABILITY_IGNORED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_TEARFUL_LOOK] = + { + .effect = EFFECT_NOBLE_ROAR, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_ZING_ZAP] = + { + .effect = EFFECT_FLINCH_HIT, + .power = 80, + .type = TYPE_ELECTRIC, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 30, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_NATURES_MADNESS] = + { + .effect = EFFECT_SUPER_FANG, + .power = 1, + .type = TYPE_FAIRY, + .accuracy = 90, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_MULTI_ATTACK] = + { + .effect = EFFECT_PLACEHOLDER, + .power = 90, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_MIND_BLOWN] = + { + .effect = EFFECT_MIND_BLOWN, + .power = 150, + .type = TYPE_FIRE, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_FOES_AND_ALLY, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_PLASMA_FISTS] = + { + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .power = 100, + .type = TYPE_ELECTRIC, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_FOES_AND_ALLY, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_PHOTON_GEYSER] = + { + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .power = 100, + .type = TYPE_PSYCHIC, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_FOES_AND_ALLY, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_DOUBLE_IRON_BASH] = + { + .effect = EFFECT_FLINCH_HIT, + .power = 60, + .type = TYPE_STEEL, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 30, + .target = MOVE_TARGET_FOES_AND_ALLY, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_DYNAMAX_CANNON] = + { + .effect = EFFECT_HIT, + .power = 100, + .type = TYPE_DRAGON, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_SNIPE_SHOT] = + { + .effect = EFFECT_PLACEHOLDER, //TODO + .power = 80, + .type = TYPE_WATER, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_JAW_LOCK] = + { + .effect = EFFECT_MEAN_LOOK, + .power = 80, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_STUFF_CHEEKS] = + { + .effect = EFFECT_DEFENSE_UP_2, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_NO_RETREAT] = + { + .effect = EFFECT_PLACEHOLDER, //TODO + .power = 0, + .type = TYPE_FIGHTING, + .accuracy = 0, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_TAR_SHOT] = + { + .effect = EFFECT_SPEED_DOWN, + .power = 0, + .type = TYPE_ROCK, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_MAGIC_POWDER] = + { + .effect = EFFECT_THIRD_TYPE, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + .argument = TYPE_PSYCHIC, + }, + + [MOVE_DRAGON_DARTS] = + { + .effect = EFFECT_MULTI_HIT, //TODO + .power = 50, + .type = TYPE_DRAGON, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_TEATIME] = + { + .effect = EFFECT_PLACEHOLDER, //TODO + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + + [MOVE_OCTOLOCK] = + { + .effect = EFFECT_MEAN_LOOK, + .power = 0, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_BOLT_BEAK] = + { + .effect = EFFECT_PLACEHOLDER, //TODO + .power = 85, + .type = TYPE_ELECTRIC, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_FISHIOUS_REND] = + { + .effect = EFFECT_PLACEHOLDER, //TODO. same as bolt beak + .power = 85, + .type = TYPE_WATER, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_COURT_CHANGE] = + { + .effect = EFFECT_PLACEHOLDER, //TODO + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_CLANGOROUS_SOUL] = + { + .effect = EFFECT_PLACEHOLDER, //TODO + .power = 0, + .type = TYPE_DRAGON, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED | FLAG_SOUND, + .split = SPLIT_STATUS, + }, + + [MOVE_BODY_PRESS] = + { + .effect = EFFECT_PLACEHOLDER, //TODO + .power = 80, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_DECORATE] = + { + .effect = EFFECT_PLACEHOLDER, // TODO .. EFFECT_DECORATE + .power = 0, + .type = TYPE_FAIRY, + .accuracy = 0, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + + [MOVE_DRUM_BEATING] = + { + .effect = EFFECT_SPEED_DOWN_HIT, + .power = 80, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_SNAP_TRAP] = + { + .effect = EFFECT_TRAP, //TODO: add case/effect + .power = 35, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_PYRO_BALL] = + { + .effect = EFFECT_BURN_HIT, + .power = 120, + .type = TYPE_FIRE, + .accuracy = 90, + .pp = 5, + .secondaryEffectChance = 10, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_BEHEMOTH_BLADE] = + { + .effect = EFFECT_HIT, //TODO: 2x damage if dynamaxed? meh... + .power = 100, + .type = TYPE_STEEL, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_BEHEMOTH_BASH] = + { + .effect = EFFECT_HIT, //TODO: 2x damage if dynamaxed? meh... + .power = 100, + .type = TYPE_STEEL, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_AURA_WHEEL] = + { + .effect = EFFECT_SPEED_UP_HIT, + .power = 110, + .type = TYPE_ELECTRIC, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_BREAKING_SWIPE] = + { + .effect = EFFECT_ATTACK_DOWN_HIT, + .power = 60, + .type = TYPE_DRAGON, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_BOTH, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_BRANCH_POKE] = + { + .effect = EFFECT_HIT, + .power = 40, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 40, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_OVERDRIVE] = + { + .effect = EFFECT_HIT, + .power = 80, + .type = TYPE_ELECTRIC, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_BOTH, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SOUND, + .split = SPLIT_SPECIAL, + }, + + [MOVE_APPLE_ACID] = + { + .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, + .power = 80, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_GRAV_APPLE] = + { + .effect = EFFECT_DEFENSE_DOWN_HIT, + .power = 80, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_SPIRIT_BREAK] = + { + .effect = EFFECT_SPECIAL_ATTACK_DOWN_HIT, + .power = 75, + .type = TYPE_FAIRY, + .accuracy = 100, + .pp = 15, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_STRANGE_STEAM] = + { + .effect = EFFECT_CONFUSE_HIT, + .power = 90, + .type = TYPE_FAIRY, + .accuracy = 95, + .pp = 10, + .secondaryEffectChance = 20, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_LIFE_DEW] = + { + .effect = EFFECT_RESTORE_HP, + .power = 0, + .type = TYPE_WATER, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + + [MOVE_OBSTRUCT] = + { + .effect = EFFECT_PLACEHOLDER, //TODO. EFFECT_PROTECT? + .power = 0, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 4, + .flags = 0, + .split = SPLIT_STATUS, + }, + + [MOVE_FALSE_SURRENDER] = + { + .effect = EFFECT_HIT, + .power = 80, + .type = TYPE_DARK, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_METEOR_ASSAULT] = + { + .effect = EFFECT_RECHARGE, + .power = 150, + .type = TYPE_FIGHTING, + .accuracy = 100, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + + [MOVE_ETERNABEAM] = + { + .effect = EFFECT_RECHARGE, + .power = 160, + .type = TYPE_DRAGON, + .accuracy = 90, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, + }, + + [MOVE_STEEL_BEAM] = + { + .effect = EFFECT_RECOIL_50, + .power = 140, + .type = TYPE_STEEL, + .accuracy = 95, + .pp = 5, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, }; diff --git a/src/data/contest_moves.h b/src/data/contest_moves.h index 658528210a..682c15e970 100644 --- a/src/data/contest_moves.h +++ b/src/data/contest_moves.h @@ -1,3 +1,4 @@ +// gen 4+ data from urpg's contest movedex const struct ContestMove gContestMoves[MOVES_COUNT] = { [MOVE_NONE] = {0}, @@ -7,7 +8,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = COMBO_STARTER_POUND, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_KARATE_CHOP] = @@ -31,7 +32,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_MEGA_PUNCH] = @@ -47,7 +48,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_FIRE_PUNCH] = @@ -55,7 +56,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = COMBO_STARTER_FIRE_PUNCH, - .comboMoves = {COMBO_STARTER_SUNNY_DAY, COMBO_STARTER_THUNDER_PUNCH, COMBO_STARTER_ICE_PUNCH}, + .comboMoves = {COMBO_STARTER_ICE_PUNCH, COMBO_STARTER_SUNNY_DAY, COMBO_STARTER_THUNDER_PUNCH}, }, [MOVE_ICE_PUNCH] = @@ -63,7 +64,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = COMBO_STARTER_ICE_PUNCH, - .comboMoves = {COMBO_STARTER_THUNDER_PUNCH, COMBO_STARTER_FIRE_PUNCH}, + .comboMoves = {COMBO_STARTER_FIRE_PUNCH, COMBO_STARTER_THUNDER_PUNCH}, }, [MOVE_THUNDER_PUNCH] = @@ -87,7 +88,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = COMBO_STARTER_VICE_GRIP, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_GUILLOTINE] = @@ -103,7 +104,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SWORDS_DANCE] = @@ -111,7 +112,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = COMBO_STARTER_SWORDS_DANCE, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_CUT] = @@ -127,7 +128,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_WING_ATTACK] = @@ -135,7 +136,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_WHIRLWIND] = @@ -143,7 +144,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_FLY] = @@ -151,7 +152,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_BIND] = @@ -182,7 +183,8 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = { .effect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_TOUGH, - .comboStarterId = 0,{0, COMBO_STARTER_LEER}, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_LEER}, }, [MOVE_DOUBLE_KICK] = @@ -190,7 +192,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_MEGA_KICK] = @@ -214,7 +216,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SAND_ATTACK] = @@ -262,7 +264,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = 0, - .comboMoves = {COMBO_STARTER_DEFENSE_CURL, COMBO_STARTER_LEER, COMBO_STARTER_HARDEN}, + .comboMoves = {COMBO_STARTER_DEFENSE_CURL, COMBO_STARTER_HARDEN, COMBO_STARTER_LEER}, }, [MOVE_BODY_SLAM] = @@ -270,7 +272,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_WRAP] = @@ -278,7 +280,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_TAKE_DOWN] = @@ -318,7 +320,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_PREV_MON, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_TWINEEDLE] = @@ -326,7 +328,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_PREV_MON, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_PIN_MISSILE] = @@ -334,7 +336,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_LEER] = @@ -366,7 +368,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SING] = @@ -374,7 +376,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = COMBO_STARTER_SING, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SUPERSONIC] = @@ -382,7 +384,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SONIC_BOOM] = @@ -390,7 +392,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_DISABLE] = @@ -398,7 +400,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_ACID] = @@ -406,7 +408,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_EMBER] = @@ -430,7 +432,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_WATER_GUN] = @@ -438,7 +440,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {COMBO_STARTER_RAIN_DANCE, COMBO_STARTER_WATER_SPORT, COMBO_STARTER_MUD_SPORT}, + .comboMoves = {COMBO_STARTER_MUD_SPORT, COMBO_STARTER_RAIN_DANCE, COMBO_STARTER_WATER_SPORT}, }, [MOVE_HYDRO_PUMP] = @@ -454,7 +456,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = COMBO_STARTER_SURF, - .comboMoves = {COMBO_STARTER_RAIN_DANCE, COMBO_STARTER_DIVE}, + .comboMoves = {COMBO_STARTER_DIVE, COMBO_STARTER_RAIN_DANCE}, }, [MOVE_ICE_BEAM] = @@ -462,7 +464,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {COMBO_STARTER_HAIL}, }, [MOVE_BLIZZARD] = @@ -470,7 +472,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = 0, - .comboMoves = {COMBO_STARTER_POWDER_SNOW, COMBO_STARTER_HAIL}, + .comboMoves = {COMBO_STARTER_HAIL, COMBO_STARTER_POWDER_SNOW}, }, [MOVE_PSYBEAM] = @@ -494,7 +496,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {COMBO_STARTER_HAIL}, }, [MOVE_HYPER_BEAM] = @@ -502,7 +504,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_PECK] = @@ -510,7 +512,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = COMBO_STARTER_PECK, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_DRILL_PECK] = @@ -534,7 +536,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_COUNTER] = @@ -558,7 +560,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_ABSORB] = @@ -581,8 +583,8 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = { .effect = CONTEST_EFFECT_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, - .comboStarterId = 0, - .comboMoves = {0}, + .comboStarterId = COMBO_STARTER_LEECH_SEED, + .comboMoves = {COMBO_STARTER_GROWTH, COMBO_STARTER_WORRY_SEED}, }, [MOVE_GROWTH] = @@ -590,7 +592,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = COMBO_STARTER_GROWTH, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_RAZOR_LEAF] = @@ -606,7 +608,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {COMBO_STARTER_SUNNY_DAY, COMBO_STARTER_GROWTH}, + .comboMoves = {COMBO_STARTER_GROWTH, COMBO_STARTER_SUNNY_DAY}, }, [MOVE_POISON_POWDER] = @@ -646,7 +648,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_PREV_MON, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = COMBO_STARTER_STRING_SHOT, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_DRAGON_RAGE] = @@ -654,7 +656,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_WHEN_LATER, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = COMBO_STARTER_DRAGON_RAGE, - .comboMoves = {COMBO_STARTER_DRAGON_BREATH, COMBO_STARTER_DRAGON_DANCE}, + .comboMoves = {COMBO_STARTER_DRAGON_BREATH, COMBO_STARTER_DRAGON_DANCE, COMBO_STARTER_DRAGON_RUSH, COMBO_STARTER_DRAGON_TAIL}, }, [MOVE_FIRE_SPIN] = @@ -694,7 +696,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {COMBO_STARTER_CHARGE, COMBO_STARTER_RAIN_DANCE, COMBO_STARTER_LOCK_ON}, + .comboMoves = {COMBO_STARTER_CHARGE, COMBO_STARTER_LOCK_ON, COMBO_STARTER_RAIN_DANCE}, }, [MOVE_ROCK_THROW] = @@ -702,7 +704,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = COMBO_STARTER_ROCK_THROW, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_EARTHQUAKE] = @@ -710,7 +712,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = COMBO_STARTER_EARTHQUAKE, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_FISSURE] = @@ -726,15 +728,15 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_TOXIC] = { .effect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, - .comboStarterId = 0, - .comboMoves = {0}, + .comboStarterId = COMBO_STARTER_TOXIC, + .comboMoves = {0} }, [MOVE_CONFUSION] = @@ -742,7 +744,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_PREV_MON, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = COMBO_STARTER_CONFUSION, - .comboMoves = {COMBO_STARTER_PSYCHIC, COMBO_STARTER_KINESIS, COMBO_STARTER_CALM_MIND}, + .comboMoves = {COMBO_STARTER_CALM_MIND, COMBO_STARTER_KINESIS, COMBO_STARTER_PSYCHIC}, }, [MOVE_PSYCHIC] = @@ -750,7 +752,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = COMBO_STARTER_PSYCHIC, - .comboMoves = {COMBO_STARTER_KINESIS, COMBO_STARTER_CONFUSION, COMBO_STARTER_CALM_MIND}, + .comboMoves = {COMBO_STARTER_CALM_MIND, COMBO_STARTER_CONFUSION, COMBO_STARTER_KINESIS}, }, [MOVE_HYPNOSIS] = @@ -758,7 +760,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = COMBO_STARTER_HYPNOSIS, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_MEDITATE] = @@ -790,7 +792,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_REPETITION_NOT_BORING, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = COMBO_STARTER_RAGE, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_TELEPORT] = @@ -798,7 +800,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {COMBO_STARTER_DOUBLE_TEAM, COMBO_STARTER_PSYCHIC, COMBO_STARTER_KINESIS, COMBO_STARTER_CONFUSION}, + .comboMoves = {COMBO_STARTER_CONFUSION, COMBO_STARTER_DOUBLE_TEAM, COMBO_STARTER_KINESIS, COMBO_STARTER_PSYCHIC}, }, [MOVE_NIGHT_SHADE] = @@ -806,7 +808,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_MIMIC] = @@ -814,7 +816,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SCREECH] = @@ -822,7 +824,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_DOUBLE_TEAM] = @@ -830,7 +832,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = COMBO_STARTER_DOUBLE_TEAM, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_RECOVER] = @@ -838,7 +840,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_HARDEN] = @@ -846,7 +848,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = COMBO_STARTER_HARDEN, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_MINIMIZE] = @@ -854,7 +856,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SMOKESCREEN] = @@ -870,7 +872,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_WITHDRAW] = @@ -886,7 +888,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = COMBO_STARTER_DEFENSE_CURL, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_BARRIER] = @@ -894,7 +896,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_LIGHT_SCREEN] = @@ -910,7 +912,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {COMBO_STARTER_HAIL}, }, [MOVE_REFLECT] = @@ -926,7 +928,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = COMBO_STARTER_FOCUS_ENERGY, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_BIDE] = @@ -934,7 +936,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_METRONOME] = @@ -942,7 +944,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_REPETITION_NOT_BORING, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_MIRROR_MOVE] = @@ -950,7 +952,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SELF_DESTRUCT] = @@ -958,7 +960,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_EGG_BOMB] = @@ -974,7 +976,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SMOG] = @@ -982,7 +984,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = COMBO_STARTER_SMOG, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SLUDGE] = @@ -998,7 +1000,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = COMBO_STARTER_BONE_CLUB, - .comboMoves = {COMBO_STARTER_BONEMERANG, COMBO_STARTER_BONE_RUSH}, + .comboMoves = {COMBO_STARTER_BONEMERANG, COMBO_STARTER_BONE_RUSH, COMBO_STARTER_SHADOW_BONE}, }, [MOVE_FIRE_BLAST] = @@ -1030,7 +1032,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_IF_FIRST, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SKULL_BASH] = @@ -1038,7 +1040,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SPIKE_CANNON] = @@ -1046,7 +1048,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_CONSTRICT] = @@ -1054,7 +1056,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_PREV_MON, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_AMNESIA] = @@ -1062,7 +1064,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_KINESIS] = @@ -1070,7 +1072,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = COMBO_STARTER_KINESIS, - .comboMoves = {COMBO_STARTER_PSYCHIC, COMBO_STARTER_CONFUSION}, + .comboMoves = {COMBO_STARTER_CONFUSION, COMBO_STARTER_PSYCHIC}, }, [MOVE_SOFT_BOILED] = @@ -1078,7 +1080,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = COMBO_STARTER_SOFT_BOILED, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_HI_JUMP_KICK] = @@ -1102,7 +1104,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {COMBO_STARTER_HYPNOSIS, COMBO_STARTER_CALM_MIND}, + .comboMoves = {COMBO_STARTER_CALM_MIND, COMBO_STARTER_HYPNOSIS}, }, [MOVE_POISON_GAS] = @@ -1110,7 +1112,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_BARRAGE] = @@ -1118,7 +1120,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_LEECH_LIFE] = @@ -1126,7 +1128,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_PREV_MON, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_LOVELY_KISS] = @@ -1134,7 +1136,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SKY_ATTACK] = @@ -1142,7 +1144,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_TRANSFORM] = @@ -1150,13 +1152,13 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_REPETITION_NOT_BORING, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_BUBBLE] = { .effect = CONTEST_EFFECT_STARTLE_PREV_MONS, - .contestCategory = CONTEST_CATEGORY_CUTE, + .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, .comboMoves = {COMBO_STARTER_RAIN_DANCE}, }, @@ -1166,7 +1168,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SPORE] = @@ -1174,7 +1176,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_FLASH] = @@ -1182,7 +1184,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_PSYWAVE] = @@ -1198,7 +1200,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_IF_LAST, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_ACID_ARMOR] = @@ -1206,7 +1208,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_CRABHAMMER] = @@ -1222,7 +1224,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_FURY_SWIPES] = @@ -1238,7 +1240,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = COMBO_STARTER_BONEMERANG, - .comboMoves = {COMBO_STARTER_BONE_CLUB, COMBO_STARTER_BONE_RUSH}, + .comboMoves = {COMBO_STARTER_BONE_CLUB, COMBO_STARTER_BONE_RUSH, COMBO_STARTER_SHADOW_BONE}, }, [MOVE_REST] = @@ -1262,7 +1264,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SHARPEN] = @@ -1270,7 +1272,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_CONVERSION] = @@ -1278,7 +1280,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_TRI_ATTACK] = @@ -1302,7 +1304,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {COMBO_STARTER_SWORDS_DANCE, COMBO_STARTER_SCRATCH}, + .comboMoves = {COMBO_STARTER_SCRATCH, COMBO_STARTER_SWORDS_DANCE}, }, [MOVE_SUBSTITUTE] = @@ -1310,23 +1312,17 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, - [MOVE_STRUGGLE] = - { - .effect = CONTEST_EFFECT_HIGHLY_APPEALING, - .contestCategory = CONTEST_CATEGORY_COOL, - .comboStarterId = 0, - .comboMoves = {0}, - }, + [MOVE_STRUGGLE] = {0}, [MOVE_SKETCH] = { .effect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_TRIPLE_KICK] = @@ -1342,7 +1338,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SPIDER_WEB] = @@ -1358,7 +1354,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = COMBO_STARTER_MIND_READER, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_NIGHTMARE] = @@ -1366,7 +1362,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {COMBO_STARTER_HYPNOSIS}, + .comboMoves = {0} }, [MOVE_FLAME_WHEEL] = @@ -1390,7 +1386,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_NEXT_APPEAL_LATER, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = COMBO_STARTER_CURSE, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_FLAIL] = @@ -1406,7 +1402,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_AEROBLAST] = @@ -1414,7 +1410,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_COTTON_SPORE] = @@ -1422,7 +1418,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_REVERSAL] = @@ -1462,7 +1458,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SCARY_FACE] = @@ -1470,7 +1466,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = COMBO_STARTER_SCARY_FACE, - .comboMoves = {COMBO_STARTER_RAGE, COMBO_STARTER_LEER}, + .comboMoves = {COMBO_STARTER_LEER, COMBO_STARTER_RAGE}, }, [MOVE_FAINT_ATTACK] = @@ -1494,7 +1490,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = COMBO_STARTER_BELLY_DRUM, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SLUDGE_BOMB] = @@ -1510,7 +1506,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = COMBO_STARTER_MUD_SLAP, - .comboMoves = {COMBO_STARTER_SAND_ATTACK, COMBO_STARTER_MUD_SPORT, COMBO_STARTER_SANDSTORM}, + .comboMoves = {COMBO_STARTER_MUD_SPORT, COMBO_STARTER_SAND_ATTACK, COMBO_STARTER_SANDSTORM}, }, [MOVE_OCTAZOOKA] = @@ -1518,7 +1514,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = 0, - .comboMoves = {COMBO_STARTER_RAIN_DANCE, COMBO_STARTER_LOCK_ON}, + .comboMoves = {COMBO_STARTER_LOCK_ON, COMBO_STARTER_RAIN_DANCE}, }, [MOVE_SPIKES] = @@ -1526,7 +1522,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_ZAP_CANNON] = @@ -1534,7 +1530,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {COMBO_STARTER_LOCK_ON}, + .comboMoves = {COMBO_STARTER_CHARGE, COMBO_STARTER_LOCK_ON}, }, [MOVE_FORESIGHT] = @@ -1542,7 +1538,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_DESTINY_BOND] = @@ -1550,7 +1546,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {COMBO_STARTER_MEAN_LOOK, COMBO_STARTER_CURSE, COMBO_STARTER_ENDURE}, + .comboMoves = {COMBO_STARTER_CURSE, COMBO_STARTER_ENDURE, COMBO_STARTER_MEAN_LOOK}, }, [MOVE_PERISH_SONG] = @@ -1566,7 +1562,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {COMBO_STARTER_HAIL}, }, [MOVE_DETECT] = @@ -1582,7 +1578,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = COMBO_STARTER_BONE_RUSH, - .comboMoves = {COMBO_STARTER_FOCUS_ENERGY, COMBO_STARTER_BONE_CLUB, COMBO_STARTER_BONEMERANG}, + .comboMoves = {COMBO_STARTER_BONE_CLUB, COMBO_STARTER_BONEMERANG, COMBO_STARTER_FOCUS_ENERGY, COMBO_STARTER_SHADOW_BONE}, }, [MOVE_LOCK_ON] = @@ -1590,7 +1586,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = COMBO_STARTER_LOCK_ON, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_OUTRAGE] = @@ -1598,7 +1594,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SANDSTORM] = @@ -1606,7 +1602,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = COMBO_STARTER_SANDSTORM, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_GIGA_DRAIN] = @@ -1622,7 +1618,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = COMBO_STARTER_ENDURE, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_CHARM] = @@ -1630,7 +1626,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = COMBO_STARTER_CHARM, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_ROLLOUT] = @@ -1654,7 +1650,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_IF_FIRST, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_MILK_DRINK] = @@ -1662,7 +1658,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SPARK] = @@ -1686,7 +1682,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_MEAN_LOOK] = @@ -1702,7 +1698,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SLEEP_TALK] = @@ -1717,8 +1713,8 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = { .effect = CONTEST_EFFECT_BETTER_IF_LAST, .contestCategory = CONTEST_CATEGORY_BEAUTY, - .comboStarterId = 0, - .comboMoves = {0}, + .comboStarterId = COMBO_STARTER_HEAL_BELL, + .comboMoves = {COMBO_STARTER_LUCKY_CHANT}, }, [MOVE_RETURN] = @@ -1726,7 +1722,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_PRESENT] = @@ -1734,7 +1730,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_REPETITION_NOT_BORING, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_FRUSTRATION] = @@ -1742,7 +1738,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SAFEGUARD] = @@ -1750,7 +1746,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_PAIN_SPLIT] = @@ -1774,7 +1770,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_DYNAMIC_PUNCH] = @@ -1790,7 +1786,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_DRAGON_BREATH] = @@ -1798,7 +1794,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = COMBO_STARTER_DRAGON_BREATH, - .comboMoves = {COMBO_STARTER_DRAGON_RAGE, COMBO_STARTER_DRAGON_DANCE}, + .comboMoves = {COMBO_STARTER_DRAGON_DANCE, COMBO_STARTER_DRAGON_RAGE, COMBO_STARTER_DRAGON_RUSH, COMBO_STARTER_DRAGON_TAIL}, }, [MOVE_BATON_PASS] = @@ -1806,7 +1802,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_ENCORE] = @@ -1814,7 +1810,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_PURSUIT] = @@ -1822,7 +1818,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_RAPID_SPIN] = @@ -1830,7 +1826,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SWEET_SCENT] = @@ -1838,7 +1834,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = COMBO_STARTER_SWEET_SCENT, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_IRON_TAIL] = @@ -1846,7 +1842,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_METAL_CLAW] = @@ -1894,7 +1890,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_REPETITION_NOT_BORING, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_CROSS_CHOP] = @@ -1910,7 +1906,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_RAIN_DANCE] = @@ -1918,7 +1914,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = COMBO_STARTER_RAIN_DANCE, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SUNNY_DAY] = @@ -1926,7 +1922,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = COMBO_STARTER_SUNNY_DAY, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_CRUNCH] = @@ -1950,7 +1946,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_EXTREME_SPEED] = @@ -1958,7 +1954,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_ANCIENT_POWER] = @@ -1966,7 +1962,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SHADOW_BALL] = @@ -1974,7 +1970,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_FUTURE_SIGHT] = @@ -1982,7 +1978,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {COMBO_STARTER_PSYCHIC, COMBO_STARTER_KINESIS, COMBO_STARTER_CONFUSION, COMBO_STARTER_CALM_MIND}, + .comboMoves = {COMBO_STARTER_CALM_MIND, COMBO_STARTER_CONFUSION, COMBO_STARTER_KINESIS, COMBO_STARTER_PSYCHIC}, }, [MOVE_ROCK_SMASH] = @@ -1990,7 +1986,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_WHIRLPOOL] = @@ -2006,7 +2002,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_FAKE_OUT] = @@ -2014,7 +2010,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = COMBO_STARTER_FAKE_OUT, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_UPROAR] = @@ -2022,7 +2018,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_STOCKPILE] = @@ -2030,7 +2026,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = COMBO_STARTER_STOCKPILE, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SPIT_UP] = @@ -2062,7 +2058,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = COMBO_STARTER_HAIL, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_TORMENT] = @@ -2070,7 +2066,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_FLATTER] = @@ -2094,7 +2090,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_FACADE] = @@ -2118,7 +2114,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_PREV_MON, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_FOLLOW_ME] = @@ -2126,7 +2122,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_NATURE_POWER] = @@ -2134,7 +2130,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_CHARGE] = @@ -2142,7 +2138,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = COMBO_STARTER_CHARGE, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_TAUNT] = @@ -2150,7 +2146,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = COMBO_STARTER_TAUNT, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_HELPING_HAND] = @@ -2158,7 +2154,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_TRICK] = @@ -2166,7 +2162,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_ROLE_PLAY] = @@ -2174,7 +2170,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_WISH] = @@ -2182,7 +2178,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_ASSIST] = @@ -2190,7 +2186,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_INGRAIN] = @@ -2198,7 +2194,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SUPERPOWER] = @@ -2206,7 +2202,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = 0, - .comboMoves = {COMBO_STARTER_LOCK_ON}, + .comboMoves = {COMBO_STARTER_LOCK_ON, COMBO_STARTER_MIND_READER}, }, [MOVE_MAGIC_COAT] = @@ -2214,7 +2210,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_RECYCLE] = @@ -2222,15 +2218,15 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_REPETITION_NOT_BORING, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_REVENGE] = { .effect = CONTEST_EFFECT_NEXT_APPEAL_LATER, .contestCategory = CONTEST_CATEGORY_TOUGH, - .comboStarterId = 0, - .comboMoves = {0}, + .comboStarterId = COMBO_STARTER_REVENGE, + .comboMoves = {COMBO_STARTER_PAYBACK}, }, [MOVE_BRICK_BREAK] = @@ -2246,7 +2242,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = COMBO_STARTER_YAWN, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_KNOCK_OFF] = @@ -2270,7 +2266,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_WHEN_LATER, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = 0, - .comboMoves = {COMBO_STARTER_ENDURE, COMBO_STARTER_EARTHQUAKE, COMBO_STARTER_SUNNY_DAY}, + .comboMoves = {COMBO_STARTER_EARTHQUAKE, COMBO_STARTER_ENDURE, COMBO_STARTER_SUNNY_DAY}, }, [MOVE_SKILL_SWAP] = @@ -2278,7 +2274,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_IMPRISON] = @@ -2286,7 +2282,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_REFRESH] = @@ -2294,7 +2290,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {COMBO_STARTER_WATER_SPORT, COMBO_STARTER_SING}, + .comboMoves = {COMBO_STARTER_SING, COMBO_STARTER_WATER_SPORT}, }, [MOVE_GRUDGE] = @@ -2310,7 +2306,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SECRET_POWER] = @@ -2318,7 +2314,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_DIVE] = @@ -2334,7 +2330,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = 0, - .comboMoves = {COMBO_STARTER_FOCUS_ENERGY, COMBO_STARTER_FAKE_OUT}, + .comboMoves = {COMBO_STARTER_FAKE_OUT, COMBO_STARTER_FOCUS_ENERGY}, }, [MOVE_CAMOUFLAGE] = @@ -2342,7 +2338,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_TAIL_GLOW] = @@ -2350,7 +2346,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_LUSTER_PURGE] = @@ -2374,7 +2370,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_IF_LAST, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_TEETER_DANCE] = @@ -2382,7 +2378,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_BLAZE_KICK] = @@ -2398,7 +2394,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = COMBO_STARTER_MUD_SPORT, - .comboMoves = {COMBO_STARTER_MUD_SLAP, COMBO_STARTER_WATER_SPORT}, + .comboMoves = {COMBO_STARTER_MUD_SLAP, COMBO_STARTER_SANDSTORM, COMBO_STARTER_WATER_SPORT}, }, [MOVE_ICE_BALL] = @@ -2406,7 +2402,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {COMBO_STARTER_HAIL}, }, [MOVE_NEEDLE_ARM] = @@ -2414,7 +2410,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SLACK_OFF] = @@ -2422,7 +2418,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_WHEN_LATER, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {COMBO_STARTER_YAWN}, + .comboMoves = {0} }, [MOVE_HYPER_VOICE] = @@ -2430,7 +2426,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_POISON_FANG] = @@ -2438,7 +2434,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_CRUSH_CLAW] = @@ -2460,7 +2456,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = [MOVE_HYDRO_CANNON] = { .effect = CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, - .contestCategory = CONTEST_CATEGORY_BEAUTY, + .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, .comboMoves = {COMBO_STARTER_RAIN_DANCE}, }, @@ -2470,7 +2466,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_ASTONISH] = @@ -2478,7 +2474,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_PREV_MON, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_WEATHER_BALL] = @@ -2486,7 +2482,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {COMBO_STARTER_RAIN_DANCE, COMBO_STARTER_SUNNY_DAY, COMBO_STARTER_HAIL, COMBO_STARTER_SANDSTORM}, + .comboMoves = {COMBO_STARTER_HAIL, COMBO_STARTER_RAIN_DANCE, COMBO_STARTER_SANDSTORM, COMBO_STARTER_SUNNY_DAY}, }, [MOVE_AROMATHERAPY] = @@ -2494,7 +2490,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_IF_LAST, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_FAKE_TEARS] = @@ -2502,7 +2498,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_IF_LAST, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_AIR_CUTTER] = @@ -2510,7 +2506,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_OVERHEAT] = @@ -2526,7 +2522,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_ROCK_TOMB] = @@ -2542,7 +2538,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_METAL_SOUND] = @@ -2550,7 +2546,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = COMBO_STARTER_METAL_SOUND, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_GRASS_WHISTLE] = @@ -2558,7 +2554,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_TICKLE] = @@ -2566,7 +2562,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_COSMIC_POWER] = @@ -2574,7 +2570,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_WATER_SPOUT] = @@ -2590,7 +2586,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SHADOW_PUNCH] = @@ -2598,7 +2594,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_IF_FIRST, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_EXTRASENSORY] = @@ -2606,7 +2602,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SKY_UPPERCUT] = @@ -2630,7 +2626,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {COMBO_STARTER_HAIL, COMBO_STARTER_MIND_READER}, }, [MOVE_MUDDY_WATER] = @@ -2654,7 +2650,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_IF_FIRST, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_ICICLE_SPEAR] = @@ -2662,7 +2658,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_IRON_DEFENSE] = @@ -2670,7 +2666,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_BLOCK] = @@ -2678,7 +2674,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_HOWL] = @@ -2686,7 +2682,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_DRAGON_CLAW] = @@ -2694,7 +2690,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {COMBO_STARTER_DRAGON_BREATH, COMBO_STARTER_DRAGON_RAGE, COMBO_STARTER_DRAGON_DANCE}, + .comboMoves = {COMBO_STARTER_DRAGON_BREATH, COMBO_STARTER_DRAGON_DANCE, COMBO_STARTER_DRAGON_RAGE, COMBO_STARTER_DRAGON_RUSH, COMBO_STARTER_DRAGON_TAIL}, }, [MOVE_FRENZY_PLANT] = @@ -2710,7 +2706,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_BEAUTY, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_BOUNCE] = @@ -2718,7 +2714,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_MUD_SHOT] = @@ -2726,7 +2722,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {COMBO_STARTER_SANDSTORM}, }, [MOVE_POISON_TAIL] = @@ -2734,7 +2730,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_COVET] = @@ -2742,7 +2738,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_VOLT_TACKLE] = @@ -2750,7 +2746,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {COMBO_STARTER_CHARGE}, + .comboMoves = {0} }, [MOVE_MAGICAL_LEAF] = @@ -2766,7 +2762,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_CUTE, .comboStarterId = COMBO_STARTER_WATER_SPORT, - .comboMoves = {COMBO_STARTER_RAIN_DANCE, COMBO_STARTER_MUD_SPORT}, + .comboMoves = {COMBO_STARTER_MUD_SPORT, COMBO_STARTER_RAIN_DANCE}, }, [MOVE_CALM_MIND] = @@ -2774,7 +2770,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, .contestCategory = CONTEST_CATEGORY_SMART, .comboStarterId = COMBO_STARTER_CALM_MIND, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_LEAF_BLADE] = @@ -2782,7 +2778,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_DRAGON_DANCE] = @@ -2790,7 +2786,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = COMBO_STARTER_DRAGON_DANCE, - .comboMoves = {COMBO_STARTER_DRAGON_RAGE, COMBO_STARTER_DRAGON_BREATH}, + .comboMoves = {COMBO_STARTER_DRAGON_BREATH, COMBO_STARTER_DRAGON_RAGE, COMBO_STARTER_DRAGON_RUSH, COMBO_STARTER_DRAGON_TAIL}, }, [MOVE_ROCK_BLAST] = @@ -2798,7 +2794,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_SHOCK_WAVE] = @@ -2822,7 +2818,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .effect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_COOL, .comboStarterId = 0, - .comboMoves = {0}, + .comboMoves = {0} }, [MOVE_PSYCHO_BOOST] = @@ -2832,6 +2828,2576 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .comboStarterId = 0, .comboMoves = {COMBO_STARTER_CALM_MIND}, }, + + [MOVE_ROOST] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_BRAVE_BIRD}, + }, + + [MOVE_GRAVITY] = + { + .effect = CONTEST_EFFECT_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_MIRACLE_EYE] = + { + .effect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_WAKE_UP_SLAP] = + { + .effect = CONTEST_EFFECT_STARTLE_PREV_MON, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_HAMMER_ARM] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_FOCUS_ENERGY}, + }, + + [MOVE_GYRO_BALL] = + { + .effect = CONTEST_EFFECT_BETTER_IF_LAST, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_HEALING_WISH] = + { + .effect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_BRINE] = + { + .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_RAIN_DANCE}, + }, + + [MOVE_NATURAL_GIFT] = + { + .effect = CONTEST_EFFECT_BETTER_WHEN_LATER, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FEINT] = + { + .effect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_PLUCK] = + { + .effect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_TAILWIND] = + { + .effect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_ACUPRESSURE] = + { + .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_METAL_BURST] = + { + .effect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_METAL_SOUND}, + }, + + [MOVE_U_TURN] = + { + .effect = CONTEST_EFFECT_AVOID_STARTLE, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_CLOSE_COMBAT] = + { + .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_FOCUS_ENERGY, COMBO_STARTER_MIND_READER}, + }, + + [MOVE_PAYBACK] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = COMBO_STARTER_PAYBACK, + .comboMoves = {COMBO_STARTER_REVENGE}, + }, + + [MOVE_ASSURANCE] = + { + .effect = CONTEST_EFFECT_BETTER_IF_LAST, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_PAYBACK, COMBO_STARTER_REVENGE}, + }, + + [MOVE_EMBARGO] = + { + .effect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FLING] = + { + .effect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_PSYCHO_SHIFT] = + { + .effect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_TRUMP_CARD] = + { + .effect = CONTEST_EFFECT_BETTER_WHEN_LATER, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_HEAL_BLOCK] = + { + .effect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_WRING_OUT] = + { + .effect = CONTEST_EFFECT_STARTLE_PREV_MON, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_POWER_TRICK] = + { + .effect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_GASTRO_ACID] = + { + .effect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_LUCKY_CHANT] = + { + .effect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = COMBO_STARTER_LUCKY_CHANT, + .comboMoves = {COMBO_STARTER_HEAL_BELL}, + }, + + [MOVE_ME_FIRST] = + { + .effect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_COPYCAT] = + { + .effect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_POWER_SWAP] = + { + .effect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_GUARD_SWAP] = + { + .effect = CONTEST_EFFECT_AVOID_STARTLE, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_PUNISHMENT] = + { + .effect = CONTEST_EFFECT_BETTER_WHEN_LATER, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_LAST_RESORT] = + { + .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_WORRY_SEED] = + { + .effect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = COMBO_STARTER_WORRY_SEED, + .comboMoves = {COMBO_STARTER_LEECH_SEED}, + }, + + [MOVE_SUCKER_PUNCH] = + { + .effect = CONTEST_EFFECT_BETTER_IF_FIRST, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_TOXIC_SPIKES] = + { + .effect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_HEART_SWAP] = + { + .effect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_AQUA_RING] = + { + .effect = CONTEST_EFFECT_AVOID_STARTLE, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_MAGNET_RISE] = + { + .effect = CONTEST_EFFECT_AVOID_STARTLE, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FLARE_BLITZ] = + { + .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_SUNNY_DAY}, + }, + + [MOVE_FORCE_PALM] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_AURA_SPHERE] = + { + .effect = CONTEST_EFFECT_BETTER_IF_FIRST, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_ROCK_POLISH] = + { + .effect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_POISON_JAB] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_DARK_PULSE] = + { + .effect = CONTEST_EFFECT_BETTER_IF_LAST, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_NIGHT_SLASH] = + { + .effect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_AQUA_TAIL] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_RAIN_DANCE}, + }, + + [MOVE_SEED_BOMB] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_AIR_SLASH] = + { + .effect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_X_SCISSOR] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_SWORDS_DANCE}, + }, + + [MOVE_BUG_BUZZ] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_DRAGON_PULSE] = + { + .effect = CONTEST_EFFECT_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_DRAGON_RUSH] = + { + .effect = CONTEST_EFFECT_BETTER_IF_FIRST, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = COMBO_STARTER_DRAGON_RUSH, + .comboMoves = {COMBO_STARTER_DRAGON_BREATH, COMBO_STARTER_DRAGON_DANCE, COMBO_STARTER_DRAGON_RAGE, COMBO_STARTER_DRAGON_TAIL}, + }, + + [MOVE_POWER_GEM] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_DRAIN_PUNCH] = + { + .effect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_FOCUS_ENERGY}, + }, + + [MOVE_VACUUM_WAVE] = + { + .effect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FOCUS_BLAST] = + { + .effect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_FOCUS_ENERGY}, + }, + + [MOVE_ENERGY_BALL] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_GROWTH}, + }, + + [MOVE_BRAVE_BIRD] = + { + .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = COMBO_STARTER_BRAVE_BIRD, + .comboMoves = {0} + }, + + [MOVE_EARTH_POWER] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_SWITCHEROO] = + { + .effect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_GIGA_IMPACT] = + { + .effect = CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_NASTY_PLOT] = + { + .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_BULLET_PUNCH] = + { + .effect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_AVALANCHE] = + { + .effect = CONTEST_EFFECT_NEXT_APPEAL_LATER, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_ICE_SHARD] = + { + .effect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_SHADOW_CLAW] = + { + .effect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_THUNDER_FANG] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = COMBO_STARTER_THUNDER_FANG, + .comboMoves = {COMBO_STARTER_CHARGE, COMBO_STARTER_FIRE_FANG, COMBO_STARTER_ICE_FANG}, + }, + + [MOVE_ICE_FANG] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = COMBO_STARTER_ICE_FANG, + .comboMoves = {COMBO_STARTER_FIRE_FANG, COMBO_STARTER_THUNDER_FANG}, + }, + + [MOVE_FIRE_FANG] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = COMBO_STARTER_FIRE_FANG, + .comboMoves = {COMBO_STARTER_ICE_FANG, COMBO_STARTER_THUNDER_FANG}, + }, + + [MOVE_SHADOW_SNEAK] = + { + .effect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_MUD_BOMB] = + { + .effect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_PSYCHO_CUT] = + { + .effect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_ZEN_HEADBUTT] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_MIRROR_SHOT] = + { + .effect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FLASH_CANNON] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_ROCK_CLIMB] = + { + .effect = CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_DEFOG] = + { + .effect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_TRICK_ROOM] = + { + .effect = CONTEST_EFFECT_NEXT_APPEAL_LATER, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_DRACO_METEOR] = + { + .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_DISCHARGE] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_CHARGE}, + }, + + [MOVE_LAVA_PLUME] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_SUNNY_DAY}, + }, + + [MOVE_LEAF_STORM] = + { + .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_POWER_WHIP] = + { + .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_GROWTH}, + }, + + [MOVE_ROCK_WRECKER] = + { + .effect = CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_CROSS_POISON] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_GUNK_SHOT] = + { + .effect = CONTEST_EFFECT_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_IRON_HEAD] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_MAGNET_BOMB] = + { + .effect = CONTEST_EFFECT_BETTER_IF_FIRST, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_STONE_EDGE] = + { + .effect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_CAPTIVATE] = + { + .effect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_CHARM}, + }, + + [MOVE_STEALTH_ROCK] = + { + .effect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_GRASS_KNOT] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_CHATTER] = + { + .effect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_JUDGMENT] = + { + .effect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_BUG_BITE] = + { + .effect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_CHARGE_BEAM] = + { + .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_CHARGE}, + }, + + [MOVE_WOOD_HAMMER] = + { + .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_AQUA_JET] = + { + .effect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_RAIN_DANCE}, + }, + + [MOVE_ATTACK_ORDER] = + { + .effect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = COMBO_STARTER_ATTACK_ORDER, + .comboMoves = {COMBO_STARTER_DEFEND_ORDER, COMBO_STARTER_HEAL_ORDER}, + }, + + [MOVE_DEFEND_ORDER] = + { + .effect = CONTEST_EFFECT_AVOID_STARTLE, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = COMBO_STARTER_DEFEND_ORDER, + .comboMoves = {COMBO_STARTER_ATTACK_ORDER, COMBO_STARTER_HEAL_ORDER}, + }, + + [MOVE_HEAL_ORDER] = + { + .effect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = COMBO_STARTER_HEAL_ORDER, + .comboMoves = {COMBO_STARTER_ATTACK_ORDER, COMBO_STARTER_DEFEND_ORDER}, + }, + + [MOVE_HEAD_SMASH] = + { + .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_DOUBLE_HIT] = + { + .effect = CONTEST_EFFECT_REPETITION_NOT_BORING, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_ROAR_OF_TIME] = + { + .effect = CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_SPACIAL_REND] = + { + .effect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_LUNAR_DANCE] = + { + .effect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_CRUSH_GRIP] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_MAGMA_STORM] = + { + .effect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_SUNNY_DAY}, + }, + + [MOVE_DARK_VOID] = + { + .effect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_SEED_FLARE] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_OMINOUS_WIND] = + { + .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_SHADOW_FORCE] = + { + .effect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_HONE_CLAWS] = + { + .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_WIDE_GUARD] = + { + .effect = CONTEST_EFFECT_AVOID_STARTLE, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_GUARD_SPLIT] = + { + .effect = CONTEST_EFFECT_AVOID_STARTLE, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_POWER_SPLIT] = + { + .effect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_WONDER_ROOM] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_PSYSHOCK] = + { + .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_VENOSHOCK] = + { + .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_TOXIC}, + }, + + [MOVE_AUTOTOMIZE] = + { + .effect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_RAGE_POWDER] = + { + .effect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_TELEKINESIS] = + { + .effect = CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_MAGIC_ROOM] = + { + .effect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_SMACK_DOWN] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_STORM_THROW] = + { + .effect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FLAME_BURST] = + { + .effect = CONTEST_EFFECT_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_SLUDGE_WAVE] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_QUIVER_DANCE] = + { + .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_HEAVY_SLAM] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_SYNCHRONOISE] = + { + .effect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_ELECTRO_BALL] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_SOAK] = + { + .effect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FLAME_CHARGE] = + { + .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_COIL] = + { + .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_LOW_SWEEP] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_ACID_SPRAY] = + { + .effect = CONTEST_EFFECT_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FOUL_PLAY] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_SIMPLE_BEAM] = + { + .effect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_ENTRAINMENT] = + { + .effect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_AFTER_YOU] = + { + .effect = CONTEST_EFFECT_NEXT_APPEAL_LATER, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_ROUND] = + { + .effect = CONTEST_EFFECT_REPETITION_NOT_BORING, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_ECHOED_VOICE] = + { + .effect = CONTEST_EFFECT_REPETITION_NOT_BORING, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_CHIP_AWAY] = + { + .effect = CONTEST_EFFECT_REPETITION_NOT_BORING, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_CLEAR_SMOG] = + { + .effect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_STORED_POWER] = + { + .effect = CONTEST_EFFECT_BETTER_WHEN_LATER, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_QUICK_GUARD] = + { + .effect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_ALLY_SWITCH] = + { + .effect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_SCALD] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = COMBO_STARTER_SCALD, + .comboMoves = {0} + }, + + [MOVE_SHELL_SMASH] = + { + .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_HEAL_PULSE] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_HEX] = + { + .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_TOXIC}, + }, + + [MOVE_SKY_DROP] = + { + .effect = CONTEST_EFFECT_AVOID_STARTLE, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_SHIFT_GEAR] = + { + .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_CIRCLE_THROW] = + { + .effect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_INCINERATE] = + { + .effect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_QUASH] = + { + .effect = CONTEST_EFFECT_NEXT_APPEAL_LATER, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_ACROBATICS] = + { + .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_REFLECT_TYPE] = + { + .effect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_RETALIATE] = + { + .effect = CONTEST_EFFECT_NEXT_APPEAL_LATER, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FINAL_GAMBIT] = + { + .effect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_BESTOW] = + { + .effect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_INFERNO] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_WATER_PLEDGE] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FIRE_PLEDGE] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_GRASS_PLEDGE] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_VOLT_SWITCH] = + { + .effect = CONTEST_EFFECT_AVOID_STARTLE, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_STRUGGLE_BUG] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_BULLDOZE] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FROST_BREATH] = + { + .effect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_DRAGON_TAIL] = + { + .effect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = COMBO_STARTER_DRAGON_TAIL, + .comboMoves = {COMBO_STARTER_DRAGON_BREATH, COMBO_STARTER_DRAGON_DANCE, COMBO_STARTER_DRAGON_RAGE, COMBO_STARTER_DRAGON_RUSH}, + }, + + [MOVE_WORK_UP] = + { + .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_ELECTROWEB] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_WILD_CHARGE] = + { + .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_DRILL_RUN] = + { + .effect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_DUAL_CHOP] = + { + .effect = CONTEST_EFFECT_REPETITION_NOT_BORING, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_HEART_STAMP] = + { + .effect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_HORN_LEECH] = + { + .effect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_SACRED_SWORD] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_RAZOR_SHELL] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_HEAT_CRASH] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_LEAF_TORNADO] = + { + .effect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_STEAMROLLER] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_COTTON_GUARD] = + { + .effect = CONTEST_EFFECT_AVOID_STARTLE, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_NIGHT_DAZE] = + { + .effect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_PSYSTRIKE] = + { + .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_TAIL_SLAP] = + { + .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_HURRICANE] = + { + .effect = CONTEST_EFFECT_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_HEAD_CHARGE] = + { + .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_GEAR_GRIND] = + { + .effect = CONTEST_EFFECT_REPETITION_NOT_BORING, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_SEARING_SHOT] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_TECHNO_BLAST] = + { + .effect = CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_RELIC_SONG] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_SECRET_SWORD] = + { + .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_GLACIATE] = + { + .effect = CONTEST_EFFECT_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_BOLT_STRIKE] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_BLUE_FLARE] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FIERY_DANCE] = + { + .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FREEZE_SHOCK] = + { + .effect = CONTEST_EFFECT_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_ICE_BURN] = + { + .effect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_SNARL] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_ICICLE_CRASH] = + { + .effect = CONTEST_EFFECT_STARTLE_PREV_MON, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_V_CREATE] = + { + .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FUSION_FLARE] = + { + .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FUSION_BOLT] = + { + .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FLYING_PRESS] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_MAT_BLOCK] = + { + .effect = CONTEST_EFFECT_AVOID_STARTLE, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_BELCH] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_ROTOTILLER] = + { + .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_STICKY_WEB] = + { + .effect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FELL_STINGER] = + { + .effect = CONTEST_EFFECT_BETTER_IF_LAST, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_PHANTOM_FORCE] = + { + .effect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_TRICK_OR_TREAT] = + { + .effect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_NOBLE_ROAR] = + { + .effect = CONTEST_EFFECT_BETTER_IF_LAST, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_ION_DELUGE] = + { + .effect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_PARABOLIC_CHARGE] = + { + .effect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FORESTS_CURSE] = + { + .effect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_PETAL_BLIZZARD] = + { + .effect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FREEZE_DRY] = + { + .effect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_DISARMING_VOICE] = + { + .effect = CONTEST_EFFECT_BETTER_IF_FIRST, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_PARTING_SHOT] = + { + .effect = CONTEST_EFFECT_AVOID_STARTLE, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_TOPSY_TURVY] = + { + .effect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_DRAINING_KISS] = + { + .effect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_CRAFTY_SHIELD] = + { + .effect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FLOWER_SHIELD] = + { + .effect = CONTEST_EFFECT_AVOID_STARTLE, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_GRASSY_TERRAIN] = + { + .effect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_MISTY_TERRAIN] = + { + .effect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_ELECTRIFY] = + { + .effect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_PLAY_ROUGH] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FAIRY_WIND] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_MOONBLAST] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_BOOMBURST] = + { + .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FAIRY_LOCK] = + { + .effect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_KINGS_SHIELD] = + { + .effect = CONTEST_EFFECT_AVOID_STARTLE, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_PLAY_NICE] = + { + .effect = CONTEST_EFFECT_BETTER_IF_LAST, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_CONFIDE] = + { + .effect = CONTEST_EFFECT_BETTER_IF_LAST, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_DIAMOND_STORM] = + { + .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_STEAM_ERUPTION] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_SCALD}, + }, + + [MOVE_HYPERSPACE_HOLE] = + { + .effect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = COMBO_STARTER_HYPERSPACE_HOLE, + .comboMoves = {COMBO_STARTER_HYPERSPACE_FURY}, + }, + + [MOVE_WATER_SHURIKEN] = + { + .effect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_MYSTICAL_FIRE] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_SPIKY_SHIELD] = + { + .effect = CONTEST_EFFECT_AVOID_STARTLE, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_AROMATIC_MIST] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_EERIE_IMPULSE] = + { + .effect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_VENOM_DRENCH] = + { + .effect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_TOXIC}, + }, + + [MOVE_POWDER] = + { + .effect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_GEOMANCY] = + { + .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_MAGNETIC_FLUX] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_HAPPY_HOUR] = + { + .effect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_ELECTRIC_TERRAIN] = + { + .effect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_DAZZLING_GLEAM] = + { + .effect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_CELEBRATE] = + { + .effect = CONTEST_EFFECT_BETTER_IF_FIRST, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_HOLD_HANDS] = + { + .effect = CONTEST_EFFECT_AVOID_STARTLE, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_BABY_DOLL_EYES] = + { + .effect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_NUZZLE] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_HOLD_BACK] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_INFESTATION] = + { + .effect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_POWER_UP_PUNCH] = + { + .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_OBLIVION_WING] = + { + .effect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_THOUSAND_ARROWS] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = COMBO_STARTER_THOUSAND_ARROWS, + .comboMoves = {COMBO_STARTER_THOUSAND_WAVES}, + }, + + [MOVE_THOUSAND_WAVES] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = COMBO_STARTER_THOUSAND_WAVES, + .comboMoves = {COMBO_STARTER_THOUSAND_ARROWS}, + }, + + [MOVE_LANDS_WRATH] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_LIGHT_OF_RUIN] = {0}, // undefined in urpg + + [MOVE_ORIGIN_PULSE] = + { + .effect = CONTEST_EFFECT_BETTER_IF_FIRST, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_PRECIPICE_BLADES] = + { + .effect = CONTEST_EFFECT_BETTER_IF_LAST, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_DRAGON_ASCENT] = + { + .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_HYPERSPACE_FURY] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = COMBO_STARTER_HYPERSPACE_FURY, + .comboMoves = {COMBO_STARTER_HYPERSPACE_HOLE}, + }, + + [MOVE_SHORE_UP] = + { + .effect = CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_SANDSTORM} + }, + + [MOVE_FIRST_IMPRESSION] = + { + .effect = CONTEST_EFFECT_BETTER_IF_FIRST, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_BANEFUL_BUNKER] = + { + .effect = CONTEST_EFFECT_AVOID_STARTLE, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_SPIRIT_SHACKLE] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_DARKEST_LARIAT] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_SPARKLING_ARIA] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_SCALD}, + }, + + [MOVE_ICE_HAMMER] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_HAIL}, + }, + + [MOVE_FLORAL_HEALING] = + { + .effect = CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_HIGH_HORSEPOWER] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_STRENGTH_SAP] = + { + .effect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_SOLAR_BLADE] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_SUNNY_DAY}, + }, + + [MOVE_LEAFAGE] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_GROWTH}, + }, + + [MOVE_SPOTLIGHT] = + { + .effect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_TOXIC_THREAD] = + { + .effect = CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_TOXIC}, + }, + + [MOVE_LASER_FOCUS] = + { + .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_GEAR_UP] = + { + .effect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_THROAT_CHOP] = + { + .effect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_POLLEN_PUFF] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_ANCHOR_SHOT] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_PSYCHIC_TERRAIN] = + { + .effect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_LUNGE] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FIRE_LASH] = + { + .effect = CONTEST_EFFECT_STARTLE_PREV_MON, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_SUNNY_DAY}, + }, + + [MOVE_POWER_TRIP] = + { + .effect = CONTEST_EFFECT_BETTER_WHEN_LATER, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_BURN_UP] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_SUNNY_DAY}, + }, + + [MOVE_SPEED_SWAP] = + { + .effect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_SMART_STRIKE] = + { + .effect = CONTEST_EFFECT_BETTER_IF_FIRST, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_PURIFY] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_REVELATION_DANCE] = + { + .effect = CONTEST_EFFECT_REPETITION_NOT_BORING, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_CORE_ENFORCER] = + { + .effect = CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_TROP_KICK] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_INSTRUCT] = + { + .effect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_BEAK_BLAST] = + { + .effect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_CLANGING_SCALES] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_DRAGON_HAMMER] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_DRAGON_BREATH, COMBO_STARTER_DRAGON_DANCE, COMBO_STARTER_DRAGON_RAGE, COMBO_STARTER_DRAGON_RUSH, COMBO_STARTER_DRAGON_TAIL}, + }, + + [MOVE_BRUTAL_SWING] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_AURORA_VEIL] = + { + .effect = CONTEST_EFFECT_AVOID_STARTLE, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_HAIL}, + }, + + [MOVE_SHELL_TRAP] = + { + .effect = CONTEST_EFFECT_BETTER_IF_LAST, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_FLEUR_CANNON] = + { + .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_PSYCHIC_FANGS] = + { + .effect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_STOMPING_TANTRUM] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_SHADOW_BONE] = + { + .effect = CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = COMBO_STARTER_SHADOW_BONE, + .comboMoves = {COMBO_STARTER_BONE_CLUB, COMBO_STARTER_BONEMERANG, COMBO_STARTER_BONE_RUSH}, + }, + + [MOVE_ACCELEROCK] = + { + .effect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_LIQUIDATION] = + { + .effect = CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_RAIN_DANCE}, + }, + + [MOVE_PRISMATIC_LASER] = + { + .effect = CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_SPECTRAL_THIEF] = + { + .effect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_SUNSTEEL_STRIKE] = + { + .effect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_MOONGEIST_BEAM] = + { + .effect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_TEARFUL_LOOK] = + { + .effect = CONTEST_EFFECT_BETTER_IF_LAST, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_ZING_ZAP] = + { + .effect = CONTEST_EFFECT_HIGHLY_APPEALING, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {COMBO_STARTER_CHARGE}, + }, + + [MOVE_NATURES_MADNESS] = + { + .effect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, + .contestCategory = CONTEST_CATEGORY_CUTE, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_MULTI_ATTACK] = + { + .effect = CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_MIND_BLOWN] = + { + .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, + .contestCategory = CONTEST_CATEGORY_BEAUTY, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_PLASMA_FISTS] = + { + .effect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, + .contestCategory = CONTEST_CATEGORY_COOL, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_PHOTON_GEYSER] = + { + .effect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, + .contestCategory = CONTEST_CATEGORY_SMART, + .comboStarterId = 0, + .comboMoves = {0} + }, + + [MOVE_DOUBLE_IRON_BASH] = + { + .effect = CONTEST_EFFECT_REPETITION_NOT_BORING, + .contestCategory = CONTEST_CATEGORY_TOUGH, + .comboStarterId = 0, + .comboMoves = {0} + }, }; const struct ContestEffect gContestEffects[] = @@ -3126,75 +5692,6 @@ const struct ContestEffect gContestEffects[] = }, }; -// A lookup table with TRUE for each combo starter ID and FALSE for ID 0, -// which means "not a combo starter move". -const bool8 gComboStarterLookupTable[] = -{ - FALSE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE, - TRUE -}; - void (*const gContestEffectFuncs[])(void) = { ContestEffect_HighlyAppealing, diff --git a/src/data/pokemon/base_stats.h b/src/data/pokemon/base_stats.h index d851dfbe1a..141631643b 100644 --- a/src/data/pokemon/base_stats.h +++ b/src/data/pokemon/base_stats.h @@ -1134,8 +1134,8 @@ const struct BaseStats gBaseStats[] = .baseSpeed = 35, .baseSpAttack = 60, .baseSpDefense = 65, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, + .type1 = TYPE_FAIRY, + .type2 = TYPE_FAIRY, .catchRate = 150, .expYield = 68, .evYield_HP = 2, @@ -1166,8 +1166,8 @@ const struct BaseStats gBaseStats[] = .baseSpeed = 60, .baseSpAttack = 85, .baseSpDefense = 90, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, + .type1 = TYPE_FAIRY, + .type2 = TYPE_FAIRY, .catchRate = 25, .expYield = 129, .evYield_HP = 3, @@ -1263,7 +1263,7 @@ const struct BaseStats gBaseStats[] = .baseSpAttack = 45, .baseSpDefense = 25, .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, + .type2 = TYPE_FAIRY, .catchRate = 170, .expYield = 76, .evYield_HP = 2, @@ -1295,7 +1295,7 @@ const struct BaseStats gBaseStats[] = .baseSpAttack = 75, .baseSpDefense = 50, .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, + .type2 = TYPE_FAIRY, .catchRate = 50, .expYield = 109, .evYield_HP = 3, @@ -3919,7 +3919,7 @@ const struct BaseStats gBaseStats[] = .baseSpAttack = 100, .baseSpDefense = 120, .type1 = TYPE_PSYCHIC, - .type2 = TYPE_PSYCHIC, + .type2 = TYPE_FAIRY, .catchRate = 45, .expYield = 136, .evYield_HP = 0, @@ -5550,8 +5550,8 @@ const struct BaseStats gBaseStats[] = .baseSpeed = 15, .baseSpAttack = 45, .baseSpDefense = 55, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, + .type1 = TYPE_FAIRY, + .type2 = TYPE_FAIRY, .catchRate = 150, .expYield = 37, .evYield_HP = 0, @@ -5583,7 +5583,7 @@ const struct BaseStats gBaseStats[] = .baseSpAttack = 40, .baseSpDefense = 20, .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, + .type2 = TYPE_FAIRY, .catchRate = 170, .expYield = 39, .evYield_HP = 1, @@ -5614,8 +5614,8 @@ const struct BaseStats gBaseStats[] = .baseSpeed = 20, .baseSpAttack = 40, .baseSpDefense = 65, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, + .type1 = TYPE_FAIRY, + .type2 = TYPE_FAIRY, .catchRate = 190, .expYield = 74, .evYield_HP = 0, @@ -5646,7 +5646,7 @@ const struct BaseStats gBaseStats[] = .baseSpeed = 40, .baseSpAttack = 80, .baseSpDefense = 105, - .type1 = TYPE_NORMAL, + .type1 = TYPE_FAIRY, .type2 = TYPE_FLYING, .catchRate = 75, .expYield = 114, @@ -5871,7 +5871,7 @@ const struct BaseStats gBaseStats[] = .baseSpAttack = 20, .baseSpDefense = 50, .type1 = TYPE_WATER, - .type2 = TYPE_WATER, + .type2 = TYPE_FAIRY, .catchRate = 190, .expYield = 58, .evYield_HP = 2, @@ -5903,7 +5903,7 @@ const struct BaseStats gBaseStats[] = .baseSpAttack = 50, .baseSpDefense = 80, .type1 = TYPE_WATER, - .type2 = TYPE_WATER, + .type2 = TYPE_FAIRY, .catchRate = 75, .expYield = 153, .evYield_HP = 3, @@ -6702,8 +6702,8 @@ const struct BaseStats gBaseStats[] = .baseSpeed = 30, .baseSpAttack = 40, .baseSpDefense = 40, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, + .type1 = TYPE_FAIRY, + .type2 = TYPE_FAIRY, .catchRate = 190, .expYield = 63, .evYield_HP = 0, @@ -6734,8 +6734,8 @@ const struct BaseStats gBaseStats[] = .baseSpeed = 45, .baseSpAttack = 60, .baseSpDefense = 60, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, + .type1 = TYPE_FAIRY, + .type2 = TYPE_FAIRY, .catchRate = 75, .expYield = 178, .evYield_HP = 0, @@ -7296,7 +7296,7 @@ const struct BaseStats gBaseStats[] = .growthRate = GROWTH_SLOW, .eggGroup1 = EGG_GROUP_FLYING, .eggGroup2 = EGG_GROUP_FLYING, - .abilities = {ABILITY_KEEN_EYE, ABILITY_STURDY}, + .abilities = {ABILITY_STURDY, ABILITY_KEEN_EYE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, @@ -10465,7 +10465,7 @@ const struct BaseStats gBaseStats[] = .baseSpAttack = 20, .baseSpDefense = 40, .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, + .type2 = TYPE_FAIRY, .catchRate = 150, .expYield = 33, .evYield_HP = 1, @@ -10625,7 +10625,7 @@ const struct BaseStats gBaseStats[] = .baseSpAttack = 55, .baseSpDefense = 55, .type1 = TYPE_STEEL, - .type2 = TYPE_STEEL, + .type2 = TYPE_FAIRY, .catchRate = 45, .expYield = 98, .evYield_HP = 0, @@ -11809,7 +11809,7 @@ const struct BaseStats gBaseStats[] = .baseSpAttack = 45, .baseSpDefense = 35, .type1 = TYPE_PSYCHIC, - .type2 = TYPE_PSYCHIC, + .type2 = TYPE_FAIRY, .catchRate = 235, .expYield = 70, .evYield_HP = 0, @@ -11841,7 +11841,7 @@ const struct BaseStats gBaseStats[] = .baseSpAttack = 65, .baseSpDefense = 55, .type1 = TYPE_PSYCHIC, - .type2 = TYPE_PSYCHIC, + .type2 = TYPE_FAIRY, .catchRate = 120, .expYield = 140, .evYield_HP = 0, @@ -11873,7 +11873,7 @@ const struct BaseStats gBaseStats[] = .baseSpAttack = 125, .baseSpDefense = 115, .type1 = TYPE_PSYCHIC, - .type2 = TYPE_PSYCHIC, + .type2 = TYPE_FAIRY, .catchRate = 45, .expYield = 208, .evYield_HP = 0, diff --git a/src/data/pokemon/level_up_learnset_pointers.h b/src/data/pokemon/level_up_learnset_pointers.h index 5ac7b3bd74..ffb1394a96 100644 --- a/src/data/pokemon/level_up_learnset_pointers.h +++ b/src/data/pokemon/level_up_learnset_pointers.h @@ -1,4 +1,4 @@ -const u16 *const gLevelUpLearnsets[NUM_SPECIES] = +const struct LevelUpMove *const gLevelUpLearnsets[NUM_SPECIES] = { [SPECIES_NONE] = sBulbasaurLevelUpLearnset, [SPECIES_BULBASAUR] = sBulbasaurLevelUpLearnset, diff --git a/src/data/pokemon/level_up_learnsets.h b/src/data/pokemon/level_up_learnsets.h index c78b9ef0a7..46c685572e 100644 --- a/src/data/pokemon/level_up_learnsets.h +++ b/src/data/pokemon/level_up_learnsets.h @@ -1,347 +1,462 @@ -#define LEVEL_UP_MOVE(lvl, move) ((lvl << 9) | move) +#define LEVEL_UP_MOVE(lvl, moveLearned) {.move = moveLearned, .level = lvl} +#define LEVEL_UP_END (0xffff) -static const u16 sBulbasaurLevelUpLearnset[] = { +static const struct LevelUpMove sBulbasaurLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 4, MOVE_GROWL), + LEVEL_UP_MOVE( 3, MOVE_GROWL), LEVEL_UP_MOVE( 7, MOVE_LEECH_SEED), - LEVEL_UP_MOVE(10, MOVE_VINE_WHIP), - LEVEL_UP_MOVE(15, MOVE_POISON_POWDER), - LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER), - LEVEL_UP_MOVE(20, MOVE_RAZOR_LEAF), - LEVEL_UP_MOVE(25, MOVE_SWEET_SCENT), - LEVEL_UP_MOVE(32, MOVE_GROWTH), - LEVEL_UP_MOVE(39, MOVE_SYNTHESIS), - LEVEL_UP_MOVE(46, MOVE_SOLAR_BEAM), + LEVEL_UP_MOVE( 9, MOVE_VINE_WHIP), + LEVEL_UP_MOVE(13, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(13, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(15, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(19, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE(21, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE(25, MOVE_GROWTH), + LEVEL_UP_MOVE(27, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(31, MOVE_WORRY_SEED), + LEVEL_UP_MOVE(33, MOVE_SYNTHESIS), + LEVEL_UP_MOVE(37, MOVE_SEED_BOMB), LEVEL_UP_END }; -static const u16 sIvysaurLevelUpLearnset[] = { +static const struct LevelUpMove sIvysaurLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_GROWL), LEVEL_UP_MOVE( 1, MOVE_LEECH_SEED), - LEVEL_UP_MOVE( 4, MOVE_GROWL), + LEVEL_UP_MOVE( 3, MOVE_GROWL), LEVEL_UP_MOVE( 7, MOVE_LEECH_SEED), - LEVEL_UP_MOVE(10, MOVE_VINE_WHIP), - LEVEL_UP_MOVE(15, MOVE_POISON_POWDER), - LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER), - LEVEL_UP_MOVE(22, MOVE_RAZOR_LEAF), - LEVEL_UP_MOVE(29, MOVE_SWEET_SCENT), - LEVEL_UP_MOVE(38, MOVE_GROWTH), - LEVEL_UP_MOVE(47, MOVE_SYNTHESIS), - LEVEL_UP_MOVE(56, MOVE_SOLAR_BEAM), + LEVEL_UP_MOVE( 9, MOVE_VINE_WHIP), + LEVEL_UP_MOVE(13, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(13, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(15, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(20, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE(23, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE(28, MOVE_GROWTH), + LEVEL_UP_MOVE(31, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(36, MOVE_WORRY_SEED), + LEVEL_UP_MOVE(39, MOVE_SYNTHESIS), + LEVEL_UP_MOVE(44, MOVE_SOLAR_BEAM), LEVEL_UP_END }; -static const u16 sVenusaurLevelUpLearnset[] = { +static const struct LevelUpMove sVenusaurLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_PETAL_DANCE), + LEVEL_UP_MOVE( 1, MOVE_PETAL_DANCE), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_GROWL), LEVEL_UP_MOVE( 1, MOVE_LEECH_SEED), LEVEL_UP_MOVE( 1, MOVE_VINE_WHIP), - LEVEL_UP_MOVE( 4, MOVE_GROWL), + LEVEL_UP_MOVE( 3, MOVE_GROWL), LEVEL_UP_MOVE( 7, MOVE_LEECH_SEED), - LEVEL_UP_MOVE(10, MOVE_VINE_WHIP), - LEVEL_UP_MOVE(15, MOVE_POISON_POWDER), - LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER), - LEVEL_UP_MOVE(22, MOVE_RAZOR_LEAF), - LEVEL_UP_MOVE(29, MOVE_SWEET_SCENT), - LEVEL_UP_MOVE(41, MOVE_GROWTH), - LEVEL_UP_MOVE(53, MOVE_SYNTHESIS), - LEVEL_UP_MOVE(65, MOVE_SOLAR_BEAM), + LEVEL_UP_MOVE( 9, MOVE_VINE_WHIP), + LEVEL_UP_MOVE(13, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(13, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(15, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(20, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE(23, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE(28, MOVE_GROWTH), + LEVEL_UP_MOVE(31, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(39, MOVE_WORRY_SEED), + LEVEL_UP_MOVE(45, MOVE_SYNTHESIS), + LEVEL_UP_MOVE(50, MOVE_PETAL_BLIZZARD), + LEVEL_UP_MOVE(53, MOVE_SOLAR_BEAM), LEVEL_UP_END }; -static const u16 sCharmanderLevelUpLearnset[] = { +static const struct LevelUpMove sCharmanderLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SCRATCH), LEVEL_UP_MOVE( 1, MOVE_GROWL), LEVEL_UP_MOVE( 7, MOVE_EMBER), - LEVEL_UP_MOVE(13, MOVE_SMOKESCREEN), - LEVEL_UP_MOVE(19, MOVE_RAGE), - LEVEL_UP_MOVE(25, MOVE_SCARY_FACE), - LEVEL_UP_MOVE(31, MOVE_FLAMETHROWER), - LEVEL_UP_MOVE(37, MOVE_SLASH), - LEVEL_UP_MOVE(43, MOVE_DRAGON_RAGE), - LEVEL_UP_MOVE(49, MOVE_FIRE_SPIN), + LEVEL_UP_MOVE(10, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE(16, MOVE_DRAGON_RAGE), + LEVEL_UP_MOVE(19, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(25, MOVE_FIRE_FANG), + LEVEL_UP_MOVE(28, MOVE_FLAME_BURST), + LEVEL_UP_MOVE(34, MOVE_SLASH), + LEVEL_UP_MOVE(37, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(43, MOVE_FIRE_SPIN), + LEVEL_UP_MOVE(46, MOVE_INFERNO), LEVEL_UP_END }; -static const u16 sCharmeleonLevelUpLearnset[] = { +static const struct LevelUpMove sCharmeleonLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SCRATCH), LEVEL_UP_MOVE( 1, MOVE_GROWL), LEVEL_UP_MOVE( 1, MOVE_EMBER), LEVEL_UP_MOVE( 7, MOVE_EMBER), - LEVEL_UP_MOVE(13, MOVE_SMOKESCREEN), - LEVEL_UP_MOVE(20, MOVE_RAGE), - LEVEL_UP_MOVE(27, MOVE_SCARY_FACE), - LEVEL_UP_MOVE(34, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(10, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE(17, MOVE_DRAGON_RAGE), + LEVEL_UP_MOVE(21, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(28, MOVE_FIRE_FANG), + LEVEL_UP_MOVE(32, MOVE_FLAME_BURST), + LEVEL_UP_MOVE(39, MOVE_SLASH), + LEVEL_UP_MOVE(43, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(50, MOVE_FIRE_SPIN), + LEVEL_UP_MOVE(54, MOVE_INFERNO), + LEVEL_UP_END +}; + +static const struct LevelUpMove sCharizardLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_WING_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_WING_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_FLARE_BLITZ), + LEVEL_UP_MOVE( 1, MOVE_HEAT_WAVE), + LEVEL_UP_MOVE( 1, MOVE_DRAGON_CLAW), + LEVEL_UP_MOVE( 1, MOVE_SHADOW_CLAW), + LEVEL_UP_MOVE( 1, MOVE_AIR_SLASH), + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_EMBER), + LEVEL_UP_MOVE( 7, MOVE_EMBER), + LEVEL_UP_MOVE(10, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE(17, MOVE_DRAGON_RAGE), + LEVEL_UP_MOVE(21, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(28, MOVE_FIRE_FANG), + LEVEL_UP_MOVE(32, MOVE_FLAME_BURST), LEVEL_UP_MOVE(41, MOVE_SLASH), - LEVEL_UP_MOVE(48, MOVE_DRAGON_RAGE), - LEVEL_UP_MOVE(55, MOVE_FIRE_SPIN), + LEVEL_UP_MOVE(47, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(56, MOVE_FIRE_SPIN), + LEVEL_UP_MOVE(62, MOVE_INFERNO), + LEVEL_UP_MOVE(71, MOVE_HEAT_WAVE), + LEVEL_UP_MOVE(77, MOVE_FLARE_BLITZ), LEVEL_UP_END }; -static const u16 sCharizardLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_SCRATCH), - LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 1, MOVE_EMBER), - LEVEL_UP_MOVE( 1, MOVE_SMOKESCREEN), - LEVEL_UP_MOVE( 7, MOVE_EMBER), - LEVEL_UP_MOVE(13, MOVE_SMOKESCREEN), - LEVEL_UP_MOVE(20, MOVE_RAGE), - LEVEL_UP_MOVE(27, MOVE_SCARY_FACE), - LEVEL_UP_MOVE(34, MOVE_FLAMETHROWER), - LEVEL_UP_MOVE(36, MOVE_WING_ATTACK), - LEVEL_UP_MOVE(44, MOVE_SLASH), - LEVEL_UP_MOVE(54, MOVE_DRAGON_RAGE), - LEVEL_UP_MOVE(64, MOVE_FIRE_SPIN), - LEVEL_UP_END -}; - -static const u16 sSquirtleLevelUpLearnset[] = { +static const struct LevelUpMove sSquirtleLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 4, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 7, MOVE_BUBBLE), + LEVEL_UP_MOVE( 7, MOVE_WATER_GUN), LEVEL_UP_MOVE(10, MOVE_WITHDRAW), - LEVEL_UP_MOVE(13, MOVE_WATER_GUN), - LEVEL_UP_MOVE(18, MOVE_BITE), - LEVEL_UP_MOVE(23, MOVE_RAPID_SPIN), - LEVEL_UP_MOVE(28, MOVE_PROTECT), - LEVEL_UP_MOVE(33, MOVE_RAIN_DANCE), - LEVEL_UP_MOVE(40, MOVE_SKULL_BASH), - LEVEL_UP_MOVE(47, MOVE_HYDRO_PUMP), - LEVEL_UP_END -}; - -static const u16 sWartortleLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 1, MOVE_BUBBLE), - LEVEL_UP_MOVE( 4, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 7, MOVE_BUBBLE), - LEVEL_UP_MOVE(10, MOVE_WITHDRAW), - LEVEL_UP_MOVE(13, MOVE_WATER_GUN), - LEVEL_UP_MOVE(19, MOVE_BITE), - LEVEL_UP_MOVE(25, MOVE_RAPID_SPIN), - LEVEL_UP_MOVE(31, MOVE_PROTECT), + LEVEL_UP_MOVE(13, MOVE_BUBBLE), + LEVEL_UP_MOVE(16, MOVE_BITE), + LEVEL_UP_MOVE(19, MOVE_RAPID_SPIN), + LEVEL_UP_MOVE(22, MOVE_PROTECT), + LEVEL_UP_MOVE(25, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(28, MOVE_AQUA_TAIL), + LEVEL_UP_MOVE(31, MOVE_SKULL_BASH), + LEVEL_UP_MOVE(34, MOVE_IRON_DEFENSE), LEVEL_UP_MOVE(37, MOVE_RAIN_DANCE), - LEVEL_UP_MOVE(45, MOVE_SKULL_BASH), - LEVEL_UP_MOVE(53, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(40, MOVE_HYDRO_PUMP), LEVEL_UP_END }; -static const u16 sBlastoiseLevelUpLearnset[] = { +static const struct LevelUpMove sWartortleLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 1, MOVE_BUBBLE), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 4, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 7, MOVE_WATER_GUN), + LEVEL_UP_MOVE(10, MOVE_WITHDRAW), + LEVEL_UP_MOVE(13, MOVE_BUBBLE), + LEVEL_UP_MOVE(17, MOVE_BITE), + LEVEL_UP_MOVE(21, MOVE_RAPID_SPIN), + LEVEL_UP_MOVE(25, MOVE_PROTECT), + LEVEL_UP_MOVE(29, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(33, MOVE_AQUA_TAIL), + LEVEL_UP_MOVE(37, MOVE_SKULL_BASH), + LEVEL_UP_MOVE(41, MOVE_IRON_DEFENSE), + LEVEL_UP_MOVE(45, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(49, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +static const struct LevelUpMove sBlastoiseLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_FLASH_CANNON), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), LEVEL_UP_MOVE( 1, MOVE_WITHDRAW), LEVEL_UP_MOVE( 4, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 7, MOVE_BUBBLE), + LEVEL_UP_MOVE( 7, MOVE_WATER_GUN), LEVEL_UP_MOVE(10, MOVE_WITHDRAW), - LEVEL_UP_MOVE(13, MOVE_WATER_GUN), - LEVEL_UP_MOVE(19, MOVE_BITE), - LEVEL_UP_MOVE(25, MOVE_RAPID_SPIN), - LEVEL_UP_MOVE(31, MOVE_PROTECT), - LEVEL_UP_MOVE(42, MOVE_RAIN_DANCE), - LEVEL_UP_MOVE(55, MOVE_SKULL_BASH), - LEVEL_UP_MOVE(68, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(13, MOVE_BUBBLE), + LEVEL_UP_MOVE(17, MOVE_BITE), + LEVEL_UP_MOVE(21, MOVE_RAPID_SPIN), + LEVEL_UP_MOVE(25, MOVE_PROTECT), + LEVEL_UP_MOVE(29, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(33, MOVE_AQUA_TAIL), + LEVEL_UP_MOVE(40, MOVE_SKULL_BASH), + LEVEL_UP_MOVE(47, MOVE_IRON_DEFENSE), + LEVEL_UP_MOVE(54, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(60, MOVE_HYDRO_PUMP), LEVEL_UP_END }; -static const u16 sCaterpieLevelUpLearnset[] = { +static const struct LevelUpMove sCaterpieLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_STRING_SHOT), + LEVEL_UP_MOVE( 9, MOVE_BUG_BITE), LEVEL_UP_END }; -static const u16 sMetapodLevelUpLearnset[] = { +static const struct LevelUpMove sMetapodLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_HARDEN), LEVEL_UP_MOVE( 1, MOVE_HARDEN), - LEVEL_UP_MOVE( 7, MOVE_HARDEN), LEVEL_UP_END }; -static const u16 sButterfreeLevelUpLearnset[] = { +static const struct LevelUpMove sButterfreeLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_GUST), + LEVEL_UP_MOVE( 1, MOVE_GUST), LEVEL_UP_MOVE( 1, MOVE_CONFUSION), - LEVEL_UP_MOVE(10, MOVE_CONFUSION), + LEVEL_UP_MOVE(11, MOVE_CONFUSION), LEVEL_UP_MOVE(13, MOVE_POISON_POWDER), - LEVEL_UP_MOVE(14, MOVE_STUN_SPORE), - LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER), - LEVEL_UP_MOVE(18, MOVE_SUPERSONIC), - LEVEL_UP_MOVE(23, MOVE_WHIRLWIND), - LEVEL_UP_MOVE(28, MOVE_GUST), - LEVEL_UP_MOVE(34, MOVE_PSYBEAM), - LEVEL_UP_MOVE(40, MOVE_SAFEGUARD), - LEVEL_UP_MOVE(47, MOVE_SILVER_WIND), + LEVEL_UP_MOVE(13, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(13, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(17, MOVE_PSYBEAM), + LEVEL_UP_MOVE(19, MOVE_SILVER_WIND), + LEVEL_UP_MOVE(23, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(25, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(29, MOVE_WHIRLWIND), + LEVEL_UP_MOVE(31, MOVE_BUG_BUZZ), + LEVEL_UP_MOVE(35, MOVE_RAGE_POWDER), + LEVEL_UP_MOVE(37, MOVE_CAPTIVATE), + LEVEL_UP_MOVE(41, MOVE_TAILWIND), + LEVEL_UP_MOVE(43, MOVE_AIR_SLASH), + LEVEL_UP_MOVE(47, MOVE_QUIVER_DANCE), LEVEL_UP_END }; -static const u16 sWeedleLevelUpLearnset[] = { +static const struct LevelUpMove sWeedleLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_POISON_STING), LEVEL_UP_MOVE( 1, MOVE_STRING_SHOT), + LEVEL_UP_MOVE( 9, MOVE_BUG_BITE), LEVEL_UP_END }; -static const u16 sKakunaLevelUpLearnset[] = { +static const struct LevelUpMove sKakunaLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_HARDEN), LEVEL_UP_MOVE( 1, MOVE_HARDEN), - LEVEL_UP_MOVE( 7, MOVE_HARDEN), LEVEL_UP_END }; -static const u16 sBeedrillLevelUpLearnset[] = { +static const struct LevelUpMove sBeedrillLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_TWINEEDLE), + LEVEL_UP_MOVE( 1, MOVE_TWINEEDLE), LEVEL_UP_MOVE( 1, MOVE_FURY_ATTACK), - LEVEL_UP_MOVE(10, MOVE_FURY_ATTACK), - LEVEL_UP_MOVE(15, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE(20, MOVE_TWINEEDLE), - LEVEL_UP_MOVE(25, MOVE_RAGE), - LEVEL_UP_MOVE(30, MOVE_PURSUIT), - LEVEL_UP_MOVE(35, MOVE_PIN_MISSILE), - LEVEL_UP_MOVE(40, MOVE_AGILITY), - LEVEL_UP_MOVE(45, MOVE_ENDEAVOR), - LEVEL_UP_END -}; - -static const u16 sPidgeyLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 5, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE( 9, MOVE_GUST), - LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(19, MOVE_WHIRLWIND), - LEVEL_UP_MOVE(25, MOVE_WING_ATTACK), - LEVEL_UP_MOVE(31, MOVE_FEATHER_DANCE), - LEVEL_UP_MOVE(39, MOVE_AGILITY), - LEVEL_UP_MOVE(47, MOVE_MIRROR_MOVE), - LEVEL_UP_END -}; - -static const u16 sPidgeottoLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE( 1, MOVE_GUST), - LEVEL_UP_MOVE( 5, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE( 9, MOVE_GUST), - LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(20, MOVE_WHIRLWIND), - LEVEL_UP_MOVE(27, MOVE_WING_ATTACK), - LEVEL_UP_MOVE(34, MOVE_FEATHER_DANCE), - LEVEL_UP_MOVE(43, MOVE_AGILITY), - LEVEL_UP_MOVE(52, MOVE_MIRROR_MOVE), - LEVEL_UP_END -}; - -static const u16 sPidgeotLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE( 1, MOVE_GUST), - LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE( 5, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE( 9, MOVE_GUST), - LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(20, MOVE_WHIRLWIND), - LEVEL_UP_MOVE(27, MOVE_WING_ATTACK), - LEVEL_UP_MOVE(34, MOVE_FEATHER_DANCE), - LEVEL_UP_MOVE(48, MOVE_AGILITY), - LEVEL_UP_MOVE(62, MOVE_MIRROR_MOVE), - LEVEL_UP_END -}; - -static const u16 sRattataLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 7, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(13, MOVE_HYPER_FANG), + LEVEL_UP_MOVE(11, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(14, MOVE_RAGE), + LEVEL_UP_MOVE(17, MOVE_PURSUIT), LEVEL_UP_MOVE(20, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE(27, MOVE_PURSUIT), - LEVEL_UP_MOVE(34, MOVE_SUPER_FANG), + LEVEL_UP_MOVE(23, MOVE_VENOSHOCK), + LEVEL_UP_MOVE(26, MOVE_ASSURANCE), + LEVEL_UP_MOVE(29, MOVE_TOXIC_SPIKES), + LEVEL_UP_MOVE(32, MOVE_PIN_MISSILE), + LEVEL_UP_MOVE(35, MOVE_POISON_JAB), + LEVEL_UP_MOVE(38, MOVE_AGILITY), LEVEL_UP_MOVE(41, MOVE_ENDEAVOR), + LEVEL_UP_MOVE(44, MOVE_FELL_STINGER), LEVEL_UP_END }; -static const u16 sRaticateLevelUpLearnset[] = { +static const struct LevelUpMove sPidgeyLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 5, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 9, MOVE_GUST), + LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(17, MOVE_WHIRLWIND), + LEVEL_UP_MOVE(21, MOVE_TWISTER), + LEVEL_UP_MOVE(25, MOVE_FEATHER_DANCE), + LEVEL_UP_MOVE(29, MOVE_AGILITY), + LEVEL_UP_MOVE(33, MOVE_WING_ATTACK), + LEVEL_UP_MOVE(37, MOVE_ROOST), + LEVEL_UP_MOVE(41, MOVE_TAILWIND), + LEVEL_UP_MOVE(45, MOVE_MIRROR_MOVE), + LEVEL_UP_MOVE(49, MOVE_AIR_SLASH), + LEVEL_UP_MOVE(53, MOVE_HURRICANE), + LEVEL_UP_END +}; + +static const struct LevelUpMove sPidgeottoLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_GUST), + LEVEL_UP_MOVE( 5, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 9, MOVE_GUST), + LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(17, MOVE_WHIRLWIND), + LEVEL_UP_MOVE(22, MOVE_TWISTER), + LEVEL_UP_MOVE(27, MOVE_FEATHER_DANCE), + LEVEL_UP_MOVE(32, MOVE_AGILITY), + LEVEL_UP_MOVE(37, MOVE_WING_ATTACK), + LEVEL_UP_MOVE(42, MOVE_ROOST), + LEVEL_UP_MOVE(47, MOVE_TAILWIND), + LEVEL_UP_MOVE(52, MOVE_MIRROR_MOVE), + LEVEL_UP_MOVE(57, MOVE_AIR_SLASH), + LEVEL_UP_MOVE(62, MOVE_HURRICANE), + LEVEL_UP_END +}; + +static const struct LevelUpMove sPidgeotLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_HURRICANE), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_GUST), + LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 5, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 9, MOVE_GUST), + LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(17, MOVE_WHIRLWIND), + LEVEL_UP_MOVE(22, MOVE_TWISTER), + LEVEL_UP_MOVE(27, MOVE_FEATHER_DANCE), + LEVEL_UP_MOVE(32, MOVE_AGILITY), + LEVEL_UP_MOVE(38, MOVE_WING_ATTACK), + LEVEL_UP_MOVE(44, MOVE_ROOST), + LEVEL_UP_MOVE(50, MOVE_TAILWIND), + LEVEL_UP_MOVE(56, MOVE_MIRROR_MOVE), + LEVEL_UP_MOVE(62, MOVE_AIR_SLASH), + LEVEL_UP_MOVE(68, MOVE_HURRICANE), + LEVEL_UP_END +}; + +static const struct LevelUpMove sRattataLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 4, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 7, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(10, MOVE_BITE), + LEVEL_UP_MOVE(13, MOVE_PURSUIT), + LEVEL_UP_MOVE(16, MOVE_HYPER_FANG), + LEVEL_UP_MOVE(19, MOVE_ASSURANCE), + LEVEL_UP_MOVE(22, MOVE_CRUNCH), + LEVEL_UP_MOVE(25, MOVE_SUCKER_PUNCH), + LEVEL_UP_MOVE(28, MOVE_SUPER_FANG), + LEVEL_UP_MOVE(31, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(34, MOVE_ENDEAVOR), + LEVEL_UP_END +}; + +static const struct LevelUpMove sRaticateLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_SCARY_FACE), + LEVEL_UP_MOVE( 1, MOVE_SCARY_FACE), + LEVEL_UP_MOVE( 1, MOVE_SWORDS_DANCE), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE( 7, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(13, MOVE_HYPER_FANG), - LEVEL_UP_MOVE(20, MOVE_SCARY_FACE), - LEVEL_UP_MOVE(30, MOVE_PURSUIT), - LEVEL_UP_MOVE(40, MOVE_SUPER_FANG), - LEVEL_UP_MOVE(50, MOVE_ENDEAVOR), + LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 4, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 7, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(10, MOVE_BITE), + LEVEL_UP_MOVE(13, MOVE_PURSUIT), + LEVEL_UP_MOVE(16, MOVE_HYPER_FANG), + LEVEL_UP_MOVE(19, MOVE_ASSURANCE), + LEVEL_UP_MOVE(24, MOVE_CRUNCH), + LEVEL_UP_MOVE(29, MOVE_SUCKER_PUNCH), + LEVEL_UP_MOVE(34, MOVE_SUPER_FANG), + LEVEL_UP_MOVE(39, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(44, MOVE_ENDEAVOR), LEVEL_UP_END }; -static const u16 sSpearowLevelUpLearnset[] = { +static const struct LevelUpMove sSpearowLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_PECK), LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 7, MOVE_LEER), - LEVEL_UP_MOVE(13, MOVE_FURY_ATTACK), - LEVEL_UP_MOVE(19, MOVE_PURSUIT), - LEVEL_UP_MOVE(25, MOVE_AERIAL_ACE), - LEVEL_UP_MOVE(31, MOVE_MIRROR_MOVE), - LEVEL_UP_MOVE(37, MOVE_DRILL_PECK), - LEVEL_UP_MOVE(43, MOVE_AGILITY), + LEVEL_UP_MOVE( 4, MOVE_LEER), + LEVEL_UP_MOVE( 8, MOVE_PURSUIT), + LEVEL_UP_MOVE(11, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(15, MOVE_AERIAL_ACE), + LEVEL_UP_MOVE(18, MOVE_MIRROR_MOVE), + LEVEL_UP_MOVE(22, MOVE_ASSURANCE), + LEVEL_UP_MOVE(25, MOVE_AGILITY), + LEVEL_UP_MOVE(29, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(32, MOVE_ROOST), + LEVEL_UP_MOVE(36, MOVE_DRILL_PECK), LEVEL_UP_END }; -static const u16 sFearowLevelUpLearnset[] = { +static const struct LevelUpMove sFearowLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_DRILL_RUN), + LEVEL_UP_MOVE( 1, MOVE_PLUCK), LEVEL_UP_MOVE( 1, MOVE_PECK), LEVEL_UP_MOVE( 1, MOVE_GROWL), LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 1, MOVE_FURY_ATTACK), - LEVEL_UP_MOVE( 7, MOVE_LEER), - LEVEL_UP_MOVE(13, MOVE_FURY_ATTACK), - LEVEL_UP_MOVE(26, MOVE_PURSUIT), - LEVEL_UP_MOVE(32, MOVE_MIRROR_MOVE), - LEVEL_UP_MOVE(40, MOVE_DRILL_PECK), - LEVEL_UP_MOVE(47, MOVE_AGILITY), + LEVEL_UP_MOVE( 1, MOVE_PURSUIT), + LEVEL_UP_MOVE( 4, MOVE_LEER), + LEVEL_UP_MOVE( 8, MOVE_PURSUIT), + LEVEL_UP_MOVE(11, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(15, MOVE_AERIAL_ACE), + LEVEL_UP_MOVE(18, MOVE_MIRROR_MOVE), + LEVEL_UP_MOVE(23, MOVE_ASSURANCE), + LEVEL_UP_MOVE(27, MOVE_AGILITY), + LEVEL_UP_MOVE(32, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(36, MOVE_ROOST), + LEVEL_UP_MOVE(41, MOVE_DRILL_PECK), + LEVEL_UP_MOVE(45, MOVE_DRILL_RUN), LEVEL_UP_END }; -static const u16 sEkansLevelUpLearnset[] = { +static const struct LevelUpMove sEkansLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_WRAP), LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 8, MOVE_POISON_STING), - LEVEL_UP_MOVE(13, MOVE_BITE), - LEVEL_UP_MOVE(20, MOVE_GLARE), - LEVEL_UP_MOVE(25, MOVE_SCREECH), - LEVEL_UP_MOVE(32, MOVE_ACID), - LEVEL_UP_MOVE(37, MOVE_STOCKPILE), - LEVEL_UP_MOVE(37, MOVE_SWALLOW), - LEVEL_UP_MOVE(37, MOVE_SPIT_UP), - LEVEL_UP_MOVE(44, MOVE_HAZE), + LEVEL_UP_MOVE( 4, MOVE_POISON_STING), + LEVEL_UP_MOVE( 9, MOVE_BITE), + LEVEL_UP_MOVE(12, MOVE_GLARE), + LEVEL_UP_MOVE(17, MOVE_SCREECH), + LEVEL_UP_MOVE(20, MOVE_ACID), + LEVEL_UP_MOVE(25, MOVE_STOCKPILE), + LEVEL_UP_MOVE(25, MOVE_SWALLOW), + LEVEL_UP_MOVE(25, MOVE_SPIT_UP), + LEVEL_UP_MOVE(28, MOVE_ACID_SPRAY), + LEVEL_UP_MOVE(33, MOVE_MUD_BOMB), + LEVEL_UP_MOVE(36, MOVE_GASTRO_ACID), + LEVEL_UP_MOVE(38, MOVE_BELCH), + LEVEL_UP_MOVE(41, MOVE_HAZE), + LEVEL_UP_MOVE(44, MOVE_COIL), + LEVEL_UP_MOVE(49, MOVE_GUNK_SHOT), LEVEL_UP_END }; -static const u16 sArbokLevelUpLearnset[] = { +static const struct LevelUpMove sArbokLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_CRUNCH), + LEVEL_UP_MOVE( 1, MOVE_CRUNCH), + LEVEL_UP_MOVE( 1, MOVE_ICE_FANG), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_FANG), + LEVEL_UP_MOVE( 1, MOVE_FIRE_FANG), LEVEL_UP_MOVE( 1, MOVE_WRAP), LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_POISON_STING), LEVEL_UP_MOVE( 1, MOVE_BITE), - LEVEL_UP_MOVE( 8, MOVE_POISON_STING), - LEVEL_UP_MOVE(13, MOVE_BITE), - LEVEL_UP_MOVE(20, MOVE_GLARE), - LEVEL_UP_MOVE(28, MOVE_SCREECH), - LEVEL_UP_MOVE(38, MOVE_ACID), - LEVEL_UP_MOVE(46, MOVE_STOCKPILE), - LEVEL_UP_MOVE(46, MOVE_SWALLOW), - LEVEL_UP_MOVE(46, MOVE_SPIT_UP), - LEVEL_UP_MOVE(56, MOVE_HAZE), + LEVEL_UP_MOVE( 4, MOVE_POISON_STING), + LEVEL_UP_MOVE( 9, MOVE_BITE), + LEVEL_UP_MOVE(12, MOVE_GLARE), + LEVEL_UP_MOVE(17, MOVE_SCREECH), + LEVEL_UP_MOVE(20, MOVE_ACID), + LEVEL_UP_MOVE(27, MOVE_STOCKPILE), + LEVEL_UP_MOVE(27, MOVE_SWALLOW), + LEVEL_UP_MOVE(27, MOVE_SPIT_UP), + LEVEL_UP_MOVE(32, MOVE_ACID_SPRAY), + LEVEL_UP_MOVE(39, MOVE_MUD_BOMB), + LEVEL_UP_MOVE(44, MOVE_GASTRO_ACID), + LEVEL_UP_MOVE(48, MOVE_BELCH), + LEVEL_UP_MOVE(51, MOVE_HAZE), + LEVEL_UP_MOVE(56, MOVE_COIL), + LEVEL_UP_MOVE(63, MOVE_GUNK_SHOT), LEVEL_UP_END }; -static const u16 sPikachuLevelUpLearnset[] = { +static const struct LevelUpMove sPikachuLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE( 1, MOVE_THUNDER_SHOCK), - LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 6, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 8, MOVE_THUNDER_WAVE), - LEVEL_UP_MOVE(11, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(15, MOVE_DOUBLE_TEAM), - LEVEL_UP_MOVE(20, MOVE_SLAM), - LEVEL_UP_MOVE(26, MOVE_THUNDERBOLT), - LEVEL_UP_MOVE(33, MOVE_AGILITY), - LEVEL_UP_MOVE(41, MOVE_THUNDER), - LEVEL_UP_MOVE(50, MOVE_LIGHT_SCREEN), + 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(18, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE(21, MOVE_FEINT), + LEVEL_UP_MOVE(23, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE(26, MOVE_SPARK), + LEVEL_UP_MOVE(29, MOVE_NUZZLE), + LEVEL_UP_MOVE(34, MOVE_DISCHARGE), + LEVEL_UP_MOVE(37, MOVE_SLAM), + LEVEL_UP_MOVE(42, MOVE_THUNDERBOLT), + LEVEL_UP_MOVE(45, MOVE_AGILITY), + LEVEL_UP_MOVE(50, MOVE_WILD_CHARGE), + LEVEL_UP_MOVE(53, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(58, MOVE_THUNDER), LEVEL_UP_END }; -static const u16 sRaichuLevelUpLearnset[] = { +static const struct LevelUpMove sRaichuLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_THUNDER_SHOCK), LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), @@ -349,126 +464,176 @@ static const u16 sRaichuLevelUpLearnset[] = { LEVEL_UP_END }; -static const u16 sSandshrewLevelUpLearnset[] = { +static const struct LevelUpMove sSandshrewLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SCRATCH), - LEVEL_UP_MOVE( 6, MOVE_DEFENSE_CURL), - LEVEL_UP_MOVE(11, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(17, MOVE_POISON_STING), - LEVEL_UP_MOVE(23, MOVE_SLASH), - LEVEL_UP_MOVE(30, MOVE_SWIFT), - LEVEL_UP_MOVE(37, MOVE_FURY_SWIPES), - LEVEL_UP_MOVE(45, MOVE_SAND_TOMB), - LEVEL_UP_MOVE(53, MOVE_SANDSTORM), + LEVEL_UP_MOVE( 1, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE( 3, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 5, MOVE_POISON_STING), + LEVEL_UP_MOVE( 7, MOVE_ROLLOUT), + LEVEL_UP_MOVE( 9, MOVE_RAPID_SPIN), + LEVEL_UP_MOVE(11, MOVE_FURY_CUTTER), + LEVEL_UP_MOVE(14, MOVE_MAGNITUDE), + LEVEL_UP_MOVE(17, MOVE_SWIFT), + LEVEL_UP_MOVE(20, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(23, MOVE_SAND_TOMB), + LEVEL_UP_MOVE(26, MOVE_SLASH), + LEVEL_UP_MOVE(30, MOVE_DIG), + LEVEL_UP_MOVE(34, MOVE_GYRO_BALL), + LEVEL_UP_MOVE(38, MOVE_SWORDS_DANCE), + LEVEL_UP_MOVE(42, MOVE_SANDSTORM), + LEVEL_UP_MOVE(46, MOVE_EARTHQUAKE), LEVEL_UP_END }; -static const u16 sSandslashLevelUpLearnset[] = { +static const struct LevelUpMove sSandslashLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_CRUSH_CLAW), + LEVEL_UP_MOVE( 1, MOVE_CRUSH_CLAW), LEVEL_UP_MOVE( 1, MOVE_SCRATCH), LEVEL_UP_MOVE( 1, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE( 6, MOVE_DEFENSE_CURL), - LEVEL_UP_MOVE(11, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(17, MOVE_POISON_STING), - LEVEL_UP_MOVE(24, MOVE_SLASH), - LEVEL_UP_MOVE(33, MOVE_SWIFT), - LEVEL_UP_MOVE(42, MOVE_FURY_SWIPES), - LEVEL_UP_MOVE(52, MOVE_SAND_TOMB), - LEVEL_UP_MOVE(62, MOVE_SANDSTORM), + LEVEL_UP_MOVE( 1, MOVE_POISON_STING), + LEVEL_UP_MOVE( 3, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 5, MOVE_POISON_STING), + LEVEL_UP_MOVE( 7, MOVE_ROLLOUT), + LEVEL_UP_MOVE( 9, MOVE_RAPID_SPIN), + LEVEL_UP_MOVE(11, MOVE_FURY_CUTTER), + LEVEL_UP_MOVE(14, MOVE_MAGNITUDE), + LEVEL_UP_MOVE(17, MOVE_SWIFT), + LEVEL_UP_MOVE(20, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(24, MOVE_SAND_TOMB), + LEVEL_UP_MOVE(28, MOVE_SLASH), + LEVEL_UP_MOVE(33, MOVE_DIG), + LEVEL_UP_MOVE(38, MOVE_GYRO_BALL), + LEVEL_UP_MOVE(43, MOVE_SWORDS_DANCE), + LEVEL_UP_MOVE(48, MOVE_SANDSTORM), + LEVEL_UP_MOVE(53, MOVE_EARTHQUAKE), LEVEL_UP_END }; -static const u16 sNidoranFLevelUpLearnset[] = { +static const struct LevelUpMove sNidoranMLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_GROWL), LEVEL_UP_MOVE( 1, MOVE_SCRATCH), - LEVEL_UP_MOVE( 8, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE(12, MOVE_DOUBLE_KICK), - LEVEL_UP_MOVE(17, MOVE_POISON_STING), - LEVEL_UP_MOVE(20, MOVE_BITE), - LEVEL_UP_MOVE(23, MOVE_HELPING_HAND), - LEVEL_UP_MOVE(30, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE( 7, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 9, MOVE_DOUBLE_KICK), + LEVEL_UP_MOVE(13, MOVE_POISON_STING), + LEVEL_UP_MOVE(19, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(21, MOVE_BITE), + LEVEL_UP_MOVE(25, MOVE_HELPING_HAND), + LEVEL_UP_MOVE(31, MOVE_TOXIC_SPIKES), + LEVEL_UP_MOVE(33, MOVE_FLATTER), + LEVEL_UP_MOVE(37, MOVE_CRUNCH), + LEVEL_UP_MOVE(43, MOVE_CAPTIVATE), + LEVEL_UP_MOVE(45, MOVE_POISON_FANG), + LEVEL_UP_END +}; + +static const struct LevelUpMove sNidorinaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 7, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 9, MOVE_DOUBLE_KICK), + LEVEL_UP_MOVE(13, MOVE_POISON_STING), + LEVEL_UP_MOVE(20, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(23, MOVE_BITE), + LEVEL_UP_MOVE(28, MOVE_HELPING_HAND), + LEVEL_UP_MOVE(35, MOVE_TOXIC_SPIKES), LEVEL_UP_MOVE(38, MOVE_FLATTER), - LEVEL_UP_MOVE(47, MOVE_CRUNCH), + LEVEL_UP_MOVE(43, MOVE_CRUNCH), + LEVEL_UP_MOVE(50, MOVE_CAPTIVATE), + LEVEL_UP_MOVE(58, MOVE_POISON_FANG), LEVEL_UP_END }; -static const u16 sNidorinaLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 1, MOVE_SCRATCH), - LEVEL_UP_MOVE( 8, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE(12, MOVE_DOUBLE_KICK), - LEVEL_UP_MOVE(18, MOVE_POISON_STING), - LEVEL_UP_MOVE(22, MOVE_BITE), - LEVEL_UP_MOVE(26, MOVE_HELPING_HAND), - LEVEL_UP_MOVE(34, MOVE_FURY_SWIPES), - LEVEL_UP_MOVE(43, MOVE_FLATTER), - LEVEL_UP_MOVE(53, MOVE_CRUNCH), - LEVEL_UP_END -}; - -static const u16 sNidoqueenLevelUpLearnset[] = { +static const struct LevelUpMove sNidoqueenLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SUPERPOWER), LEVEL_UP_MOVE( 1, MOVE_SCRATCH), LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE( 1, MOVE_DOUBLE_KICK), LEVEL_UP_MOVE( 1, MOVE_POISON_STING), - LEVEL_UP_MOVE(23, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(23, MOVE_CHIP_AWAY), + LEVEL_UP_MOVE(35, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(43, MOVE_EARTH_POWER), + LEVEL_UP_MOVE(58, MOVE_SUPERPOWER), LEVEL_UP_END }; -static const u16 sNidoranMLevelUpLearnset[] = { +static const struct LevelUpMove sNidoranFLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_PECK), - LEVEL_UP_MOVE( 8, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE(12, MOVE_DOUBLE_KICK), - LEVEL_UP_MOVE(17, MOVE_POISON_STING), - LEVEL_UP_MOVE(20, MOVE_HORN_ATTACK), - LEVEL_UP_MOVE(23, MOVE_HELPING_HAND), - LEVEL_UP_MOVE(30, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE( 7, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 9, MOVE_DOUBLE_KICK), + LEVEL_UP_MOVE(13, MOVE_POISON_STING), + LEVEL_UP_MOVE(19, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(21, MOVE_HORN_ATTACK), + LEVEL_UP_MOVE(25, MOVE_HELPING_HAND), + LEVEL_UP_MOVE(31, MOVE_TOXIC_SPIKES), + LEVEL_UP_MOVE(33, MOVE_FLATTER), + LEVEL_UP_MOVE(37, MOVE_POISON_JAB), + LEVEL_UP_MOVE(43, MOVE_CAPTIVATE), + LEVEL_UP_MOVE(45, MOVE_HORN_DRILL), + LEVEL_UP_END +}; + +static const struct LevelUpMove sNidorinoLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_PECK), + LEVEL_UP_MOVE( 7, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 9, MOVE_DOUBLE_KICK), + LEVEL_UP_MOVE(13, MOVE_POISON_STING), + LEVEL_UP_MOVE(20, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(23, MOVE_HORN_ATTACK), + LEVEL_UP_MOVE(28, MOVE_HELPING_HAND), + LEVEL_UP_MOVE(35, MOVE_TOXIC_SPIKES), LEVEL_UP_MOVE(38, MOVE_FLATTER), - LEVEL_UP_MOVE(47, MOVE_HORN_DRILL), + LEVEL_UP_MOVE(43, MOVE_POISON_JAB), + LEVEL_UP_MOVE(50, MOVE_CAPTIVATE), + LEVEL_UP_MOVE(58, MOVE_HORN_DRILL), LEVEL_UP_END }; -static const u16 sNidorinoLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 1, MOVE_PECK), - LEVEL_UP_MOVE( 8, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE(12, MOVE_DOUBLE_KICK), - LEVEL_UP_MOVE(18, MOVE_POISON_STING), - LEVEL_UP_MOVE(22, MOVE_HORN_ATTACK), - LEVEL_UP_MOVE(26, MOVE_HELPING_HAND), - LEVEL_UP_MOVE(34, MOVE_FURY_ATTACK), - LEVEL_UP_MOVE(43, MOVE_FLATTER), - LEVEL_UP_MOVE(53, MOVE_HORN_DRILL), - LEVEL_UP_END -}; - -static const u16 sNidokingLevelUpLearnset[] = { +static const struct LevelUpMove sNidokingLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_MEGAHORN), LEVEL_UP_MOVE( 1, MOVE_PECK), LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE( 1, MOVE_DOUBLE_KICK), LEVEL_UP_MOVE( 1, MOVE_POISON_STING), - LEVEL_UP_MOVE(23, MOVE_THRASH), + LEVEL_UP_MOVE(23, MOVE_CHIP_AWAY), + LEVEL_UP_MOVE(35, MOVE_THRASH), + LEVEL_UP_MOVE(43, MOVE_EARTH_POWER), + LEVEL_UP_MOVE(58, MOVE_MEGAHORN), LEVEL_UP_END }; -static const u16 sClefairyLevelUpLearnset[] = { +static const struct LevelUpMove sClefairyLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SPOTLIGHT), + LEVEL_UP_MOVE( 1, MOVE_DISARMING_VOICE), LEVEL_UP_MOVE( 1, MOVE_POUND), LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 5, MOVE_ENCORE), - LEVEL_UP_MOVE( 9, MOVE_SING), - LEVEL_UP_MOVE(13, MOVE_DOUBLE_SLAP), - LEVEL_UP_MOVE(17, MOVE_FOLLOW_ME), - LEVEL_UP_MOVE(21, MOVE_MINIMIZE), - LEVEL_UP_MOVE(25, MOVE_DEFENSE_CURL), - LEVEL_UP_MOVE(29, MOVE_METRONOME), - LEVEL_UP_MOVE(33, MOVE_COSMIC_POWER), - LEVEL_UP_MOVE(37, MOVE_MOONLIGHT), - LEVEL_UP_MOVE(41, MOVE_LIGHT_SCREEN), - LEVEL_UP_MOVE(45, MOVE_METEOR_MASH), + LEVEL_UP_MOVE( 1, MOVE_ENCORE), + LEVEL_UP_MOVE( 7, MOVE_SING), + LEVEL_UP_MOVE(10, MOVE_DOUBLE_SLAP), + LEVEL_UP_MOVE(13, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE(16, MOVE_FOLLOW_ME), + LEVEL_UP_MOVE(19, MOVE_BESTOW), + LEVEL_UP_MOVE(22, MOVE_WAKE_UP_SLAP), + LEVEL_UP_MOVE(25, MOVE_MINIMIZE), + LEVEL_UP_MOVE(28, MOVE_STORED_POWER), + LEVEL_UP_MOVE(31, MOVE_METRONOME), + LEVEL_UP_MOVE(34, MOVE_COSMIC_POWER), + LEVEL_UP_MOVE(37, MOVE_LUCKY_CHANT), + LEVEL_UP_MOVE(40, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(43, MOVE_MOONLIGHT), + LEVEL_UP_MOVE(46, MOVE_MOONBLAST), + LEVEL_UP_MOVE(49, MOVE_GRAVITY), + LEVEL_UP_MOVE(50, MOVE_METEOR_MASH), + LEVEL_UP_MOVE(55, MOVE_HEALING_WISH), + LEVEL_UP_MOVE(58, MOVE_AFTER_YOU), LEVEL_UP_END }; -static const u16 sClefableLevelUpLearnset[] = { +static const struct LevelUpMove sClefableLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SPOTLIGHT), + LEVEL_UP_MOVE( 1, MOVE_DISARMING_VOICE), LEVEL_UP_MOVE( 1, MOVE_SING), LEVEL_UP_MOVE( 1, MOVE_DOUBLE_SLAP), LEVEL_UP_MOVE( 1, MOVE_MINIMIZE), @@ -476,2303 +641,3365 @@ static const u16 sClefableLevelUpLearnset[] = { LEVEL_UP_END }; -static const u16 sVulpixLevelUpLearnset[] = { +static const struct LevelUpMove sVulpixLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_EMBER), - LEVEL_UP_MOVE( 5, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 9, MOVE_ROAR), - LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(17, MOVE_WILL_O_WISP), - LEVEL_UP_MOVE(21, MOVE_CONFUSE_RAY), - LEVEL_UP_MOVE(25, MOVE_IMPRISON), - LEVEL_UP_MOVE(29, MOVE_FLAMETHROWER), - LEVEL_UP_MOVE(33, MOVE_SAFEGUARD), - LEVEL_UP_MOVE(37, MOVE_GRUDGE), - LEVEL_UP_MOVE(41, MOVE_FIRE_SPIN), + LEVEL_UP_MOVE( 4, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 7, MOVE_ROAR), + LEVEL_UP_MOVE( 9, MOVE_BABY_DOLL_EYES), + LEVEL_UP_MOVE(10, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(12, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(15, MOVE_FIRE_SPIN), + LEVEL_UP_MOVE(18, MOVE_PAYBACK), + LEVEL_UP_MOVE(20, MOVE_WILL_O_WISP), + LEVEL_UP_MOVE(23, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(26, MOVE_HEX), + LEVEL_UP_MOVE(28, MOVE_FLAME_BURST), + LEVEL_UP_MOVE(31, MOVE_EXTRASENSORY), + LEVEL_UP_MOVE(34, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(36, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(39, MOVE_IMPRISON), + LEVEL_UP_MOVE(42, MOVE_FIRE_BLAST), + LEVEL_UP_MOVE(44, MOVE_GRUDGE), + LEVEL_UP_MOVE(47, MOVE_CAPTIVATE), + LEVEL_UP_MOVE(50, MOVE_INFERNO), LEVEL_UP_END }; -static const u16 sNinetalesLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_EMBER), +static const struct LevelUpMove sNinetalesLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_IMPRISON), + LEVEL_UP_MOVE( 1, MOVE_NASTY_PLOT), + LEVEL_UP_MOVE( 1, MOVE_FLAMETHROWER), LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE( 1, MOVE_CONFUSE_RAY), LEVEL_UP_MOVE( 1, MOVE_SAFEGUARD), - LEVEL_UP_MOVE(45, MOVE_FIRE_SPIN), LEVEL_UP_END }; -static const u16 sJigglypuffLevelUpLearnset[] = { +static const struct LevelUpMove sJigglypuffLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SING), - LEVEL_UP_MOVE( 4, MOVE_DEFENSE_CURL), - LEVEL_UP_MOVE( 9, MOVE_POUND), + LEVEL_UP_MOVE( 3, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE( 5, MOVE_POUND), + LEVEL_UP_MOVE( 9, MOVE_PLAY_NICE), + LEVEL_UP_MOVE(11, MOVE_DISARMING_VOICE), LEVEL_UP_MOVE(14, MOVE_DISABLE), - LEVEL_UP_MOVE(19, MOVE_ROLLOUT), - LEVEL_UP_MOVE(24, MOVE_DOUBLE_SLAP), - LEVEL_UP_MOVE(29, MOVE_REST), - LEVEL_UP_MOVE(34, MOVE_BODY_SLAM), - LEVEL_UP_MOVE(39, MOVE_MIMIC), - LEVEL_UP_MOVE(44, MOVE_HYPER_VOICE), - LEVEL_UP_MOVE(49, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(17, MOVE_DOUBLE_SLAP), + LEVEL_UP_MOVE(20, MOVE_ROLLOUT), + LEVEL_UP_MOVE(22, MOVE_ROUND), + LEVEL_UP_MOVE(25, MOVE_STOCKPILE), + LEVEL_UP_MOVE(25, MOVE_SWALLOW), + LEVEL_UP_MOVE(25, MOVE_SPIT_UP), + LEVEL_UP_MOVE(27, MOVE_WAKE_UP_SLAP), + LEVEL_UP_MOVE(30, MOVE_REST), + LEVEL_UP_MOVE(32, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(35, MOVE_GYRO_BALL), + LEVEL_UP_MOVE(38, MOVE_MIMIC), + LEVEL_UP_MOVE(41, MOVE_HYPER_VOICE), + LEVEL_UP_MOVE(45, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; -static const u16 sWigglytuffLevelUpLearnset[] = { +static const struct LevelUpMove sWigglytuffLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE( 1, MOVE_PLAY_ROUGH), LEVEL_UP_MOVE( 1, MOVE_SING), - LEVEL_UP_MOVE( 1, MOVE_DISABLE), LEVEL_UP_MOVE( 1, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE( 1, MOVE_DISABLE), LEVEL_UP_MOVE( 1, MOVE_DOUBLE_SLAP), LEVEL_UP_END }; -static const u16 sZubatLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_LEECH_LIFE), - LEVEL_UP_MOVE( 6, MOVE_SUPERSONIC), - LEVEL_UP_MOVE(11, MOVE_ASTONISH), - LEVEL_UP_MOVE(16, MOVE_BITE), - LEVEL_UP_MOVE(21, MOVE_WING_ATTACK), - LEVEL_UP_MOVE(26, MOVE_CONFUSE_RAY), - LEVEL_UP_MOVE(31, MOVE_AIR_CUTTER), - LEVEL_UP_MOVE(36, MOVE_MEAN_LOOK), - LEVEL_UP_MOVE(41, MOVE_POISON_FANG), - LEVEL_UP_MOVE(46, MOVE_HAZE), +static const struct LevelUpMove sZubatLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ABSORB), + LEVEL_UP_MOVE( 5, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 7, MOVE_ASTONISH), + LEVEL_UP_MOVE(11, MOVE_BITE), + LEVEL_UP_MOVE(13, MOVE_WING_ATTACK), + LEVEL_UP_MOVE(17, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(19, MOVE_AIR_CUTTER), + LEVEL_UP_MOVE(23, MOVE_SWIFT), + LEVEL_UP_MOVE(25, MOVE_POISON_FANG), + LEVEL_UP_MOVE(29, MOVE_MEAN_LOOK), + LEVEL_UP_MOVE(31, MOVE_LEECH_LIFE), + LEVEL_UP_MOVE(35, MOVE_HAZE), + LEVEL_UP_MOVE(37, MOVE_VENOSHOCK), + LEVEL_UP_MOVE(41, MOVE_AIR_SLASH), + LEVEL_UP_MOVE(43, MOVE_QUICK_GUARD), LEVEL_UP_END }; -static const u16 sGolbatLevelUpLearnset[] = { +static const struct LevelUpMove sGolbatLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SCREECH), - LEVEL_UP_MOVE( 1, MOVE_LEECH_LIFE), + LEVEL_UP_MOVE( 1, MOVE_ABSORB), LEVEL_UP_MOVE( 1, MOVE_SUPERSONIC), LEVEL_UP_MOVE( 1, MOVE_ASTONISH), - LEVEL_UP_MOVE( 6, MOVE_SUPERSONIC), - LEVEL_UP_MOVE(11, MOVE_ASTONISH), - LEVEL_UP_MOVE(16, MOVE_BITE), - LEVEL_UP_MOVE(21, MOVE_WING_ATTACK), - LEVEL_UP_MOVE(28, MOVE_CONFUSE_RAY), - LEVEL_UP_MOVE(35, MOVE_AIR_CUTTER), - LEVEL_UP_MOVE(42, MOVE_MEAN_LOOK), - LEVEL_UP_MOVE(49, MOVE_POISON_FANG), - LEVEL_UP_MOVE(56, MOVE_HAZE), + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 5, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 7, MOVE_ASTONISH), + LEVEL_UP_MOVE(11, MOVE_BITE), + LEVEL_UP_MOVE(13, MOVE_WING_ATTACK), + LEVEL_UP_MOVE(17, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(19, MOVE_AIR_CUTTER), + LEVEL_UP_MOVE(24, MOVE_SWIFT), + LEVEL_UP_MOVE(27, MOVE_POISON_FANG), + LEVEL_UP_MOVE(32, MOVE_MEAN_LOOK), + LEVEL_UP_MOVE(35, MOVE_LEECH_LIFE), + LEVEL_UP_MOVE(40, MOVE_HAZE), + LEVEL_UP_MOVE(43, MOVE_VENOSHOCK), + LEVEL_UP_MOVE(48, MOVE_AIR_SLASH), + LEVEL_UP_MOVE(51, MOVE_QUICK_GUARD), LEVEL_UP_END }; -static const u16 sOddishLevelUpLearnset[] = { +static const struct LevelUpMove sOddishLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_ABSORB), - LEVEL_UP_MOVE( 7, MOVE_SWEET_SCENT), - LEVEL_UP_MOVE(14, MOVE_POISON_POWDER), - LEVEL_UP_MOVE(16, MOVE_STUN_SPORE), - LEVEL_UP_MOVE(18, MOVE_SLEEP_POWDER), - LEVEL_UP_MOVE(23, MOVE_ACID), - LEVEL_UP_MOVE(32, MOVE_MOONLIGHT), - LEVEL_UP_MOVE(39, MOVE_PETAL_DANCE), + LEVEL_UP_MOVE( 1, MOVE_GROWTH), + LEVEL_UP_MOVE( 5, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE( 9, MOVE_ACID), + LEVEL_UP_MOVE(13, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(14, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(19, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(23, MOVE_LUCKY_CHANT), + LEVEL_UP_MOVE(27, MOVE_MOONLIGHT), + LEVEL_UP_MOVE(31, MOVE_GIGA_DRAIN), + LEVEL_UP_MOVE(35, MOVE_TOXIC), + LEVEL_UP_MOVE(39, MOVE_NATURAL_GIFT), + LEVEL_UP_MOVE(43, MOVE_MOONBLAST), + LEVEL_UP_MOVE(47, MOVE_GRASSY_TERRAIN), + LEVEL_UP_MOVE(51, MOVE_PETAL_DANCE), LEVEL_UP_END }; -static const u16 sGloomLevelUpLearnset[] = { +static const struct LevelUpMove sGloomLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_ABSORB), + LEVEL_UP_MOVE( 1, MOVE_GROWTH), LEVEL_UP_MOVE( 1, MOVE_SWEET_SCENT), - LEVEL_UP_MOVE( 1, MOVE_POISON_POWDER), - LEVEL_UP_MOVE( 7, MOVE_SWEET_SCENT), - LEVEL_UP_MOVE(14, MOVE_POISON_POWDER), - LEVEL_UP_MOVE(16, MOVE_STUN_SPORE), - LEVEL_UP_MOVE(18, MOVE_SLEEP_POWDER), - LEVEL_UP_MOVE(24, MOVE_ACID), - LEVEL_UP_MOVE(35, MOVE_MOONLIGHT), - LEVEL_UP_MOVE(44, MOVE_PETAL_DANCE), + LEVEL_UP_MOVE( 1, MOVE_ACID), + LEVEL_UP_MOVE( 5, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE( 9, MOVE_ACID), + LEVEL_UP_MOVE(13, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(14, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(19, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(24, MOVE_LUCKY_CHANT), + LEVEL_UP_MOVE(29, MOVE_MOONLIGHT), + LEVEL_UP_MOVE(34, MOVE_GIGA_DRAIN), + LEVEL_UP_MOVE(39, MOVE_TOXIC), + LEVEL_UP_MOVE(44, MOVE_NATURAL_GIFT), + LEVEL_UP_MOVE(49, MOVE_PETAL_BLIZZARD), + LEVEL_UP_MOVE(54, MOVE_GRASSY_TERRAIN), + LEVEL_UP_MOVE(59, MOVE_PETAL_DANCE), LEVEL_UP_END }; -static const u16 sVileplumeLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_ABSORB), - LEVEL_UP_MOVE( 1, MOVE_AROMATHERAPY), - LEVEL_UP_MOVE( 1, MOVE_STUN_SPORE), +static const struct LevelUpMove sVileplumeLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_MEGA_DRAIN), - LEVEL_UP_MOVE(44, MOVE_PETAL_DANCE), + LEVEL_UP_MOVE( 1, MOVE_AROMATHERAPY), + LEVEL_UP_MOVE( 1, MOVE_POISON_POWDER), + LEVEL_UP_MOVE( 1, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(49, MOVE_PETAL_BLIZZARD), + LEVEL_UP_MOVE(59, MOVE_PETAL_DANCE), + LEVEL_UP_MOVE(69, MOVE_SOLAR_BEAM), LEVEL_UP_END }; -static const u16 sParasLevelUpLearnset[] = { +static const struct LevelUpMove sParasLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SCRATCH), - LEVEL_UP_MOVE( 7, MOVE_STUN_SPORE), - LEVEL_UP_MOVE(13, MOVE_POISON_POWDER), - LEVEL_UP_MOVE(19, MOVE_LEECH_LIFE), - LEVEL_UP_MOVE(25, MOVE_SPORE), - LEVEL_UP_MOVE(31, MOVE_SLASH), - LEVEL_UP_MOVE(37, MOVE_GROWTH), - LEVEL_UP_MOVE(43, MOVE_GIGA_DRAIN), - LEVEL_UP_MOVE(49, MOVE_AROMATHERAPY), + LEVEL_UP_MOVE( 6, MOVE_STUN_SPORE), + LEVEL_UP_MOVE( 6, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(11, MOVE_ABSORB), + LEVEL_UP_MOVE(17, MOVE_FURY_CUTTER), + LEVEL_UP_MOVE(22, MOVE_SPORE), + LEVEL_UP_MOVE(27, MOVE_SLASH), + LEVEL_UP_MOVE(33, MOVE_GROWTH), + LEVEL_UP_MOVE(38, MOVE_GIGA_DRAIN), + LEVEL_UP_MOVE(43, MOVE_AROMATHERAPY), + LEVEL_UP_MOVE(49, MOVE_RAGE_POWDER), + LEVEL_UP_MOVE(54, MOVE_X_SCISSOR), LEVEL_UP_END }; -static const u16 sParasectLevelUpLearnset[] = { +static const struct LevelUpMove sParasectLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_CROSS_POISON), LEVEL_UP_MOVE( 1, MOVE_SCRATCH), LEVEL_UP_MOVE( 1, MOVE_STUN_SPORE), LEVEL_UP_MOVE( 1, MOVE_POISON_POWDER), - LEVEL_UP_MOVE( 7, MOVE_STUN_SPORE), - LEVEL_UP_MOVE(13, MOVE_POISON_POWDER), - LEVEL_UP_MOVE(19, MOVE_LEECH_LIFE), - LEVEL_UP_MOVE(27, MOVE_SPORE), - LEVEL_UP_MOVE(35, MOVE_SLASH), - LEVEL_UP_MOVE(43, MOVE_GROWTH), - LEVEL_UP_MOVE(51, MOVE_GIGA_DRAIN), - LEVEL_UP_MOVE(59, MOVE_AROMATHERAPY), + LEVEL_UP_MOVE( 1, MOVE_ABSORB), + LEVEL_UP_MOVE( 6, MOVE_STUN_SPORE), + LEVEL_UP_MOVE( 6, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(11, MOVE_ABSORB), + LEVEL_UP_MOVE(17, MOVE_FURY_CUTTER), + LEVEL_UP_MOVE(22, MOVE_SPORE), + LEVEL_UP_MOVE(29, MOVE_SLASH), + LEVEL_UP_MOVE(37, MOVE_GROWTH), + LEVEL_UP_MOVE(44, MOVE_GIGA_DRAIN), + LEVEL_UP_MOVE(51, MOVE_AROMATHERAPY), + LEVEL_UP_MOVE(59, MOVE_RAGE_POWDER), + LEVEL_UP_MOVE(66, MOVE_X_SCISSOR), LEVEL_UP_END }; -static const u16 sVenonatLevelUpLearnset[] = { +static const struct LevelUpMove sVenonatLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_DISABLE), LEVEL_UP_MOVE( 1, MOVE_FORESIGHT), - LEVEL_UP_MOVE( 9, MOVE_SUPERSONIC), - LEVEL_UP_MOVE(17, MOVE_CONFUSION), - LEVEL_UP_MOVE(20, MOVE_POISON_POWDER), - LEVEL_UP_MOVE(25, MOVE_LEECH_LIFE), - LEVEL_UP_MOVE(28, MOVE_STUN_SPORE), - LEVEL_UP_MOVE(33, MOVE_PSYBEAM), - LEVEL_UP_MOVE(36, MOVE_SLEEP_POWDER), - LEVEL_UP_MOVE(41, MOVE_PSYCHIC), + LEVEL_UP_MOVE( 5, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(11, MOVE_CONFUSION), + LEVEL_UP_MOVE(13, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(17, MOVE_PSYBEAM), + LEVEL_UP_MOVE(23, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(25, MOVE_SIGNAL_BEAM), + LEVEL_UP_MOVE(29, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(35, MOVE_LEECH_LIFE), + LEVEL_UP_MOVE(37, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(41, MOVE_POISON_FANG), + LEVEL_UP_MOVE(47, MOVE_PSYCHIC), LEVEL_UP_END }; -static const u16 sVenomothLevelUpLearnset[] = { +static const struct LevelUpMove sVenomothLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_GUST), + LEVEL_UP_MOVE( 1, MOVE_GUST), + LEVEL_UP_MOVE( 1, MOVE_QUIVER_DANCE), + LEVEL_UP_MOVE( 1, MOVE_BUG_BUZZ), LEVEL_UP_MOVE( 1, MOVE_SILVER_WIND), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_DISABLE), LEVEL_UP_MOVE( 1, MOVE_FORESIGHT), LEVEL_UP_MOVE( 1, MOVE_SUPERSONIC), - LEVEL_UP_MOVE( 9, MOVE_SUPERSONIC), - LEVEL_UP_MOVE(17, MOVE_CONFUSION), - LEVEL_UP_MOVE(20, MOVE_POISON_POWDER), - LEVEL_UP_MOVE(25, MOVE_LEECH_LIFE), - LEVEL_UP_MOVE(28, MOVE_STUN_SPORE), - LEVEL_UP_MOVE(31, MOVE_GUST), - LEVEL_UP_MOVE(36, MOVE_PSYBEAM), - LEVEL_UP_MOVE(42, MOVE_SLEEP_POWDER), - LEVEL_UP_MOVE(52, MOVE_PSYCHIC), + LEVEL_UP_MOVE( 5, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(11, MOVE_CONFUSION), + LEVEL_UP_MOVE(13, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(17, MOVE_PSYBEAM), + LEVEL_UP_MOVE(23, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(25, MOVE_SIGNAL_BEAM), + LEVEL_UP_MOVE(29, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(37, MOVE_LEECH_LIFE), + LEVEL_UP_MOVE(41, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(47, MOVE_POISON_FANG), + LEVEL_UP_MOVE(55, MOVE_PSYCHIC), + LEVEL_UP_MOVE(59, MOVE_BUG_BUZZ), + LEVEL_UP_MOVE(63, MOVE_QUIVER_DANCE), LEVEL_UP_END }; -static const u16 sDiglettLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_SCRATCH), +static const struct LevelUpMove sDiglettLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE( 5, MOVE_GROWL), - LEVEL_UP_MOVE( 9, MOVE_MAGNITUDE), - LEVEL_UP_MOVE(17, MOVE_DIG), - LEVEL_UP_MOVE(25, MOVE_MUD_SLAP), - LEVEL_UP_MOVE(33, MOVE_SLASH), - LEVEL_UP_MOVE(41, MOVE_EARTHQUAKE), - LEVEL_UP_MOVE(49, MOVE_FISSURE), + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 4, MOVE_GROWL), + LEVEL_UP_MOVE( 7, MOVE_ASTONISH), + LEVEL_UP_MOVE(10, MOVE_MUD_SLAP), + LEVEL_UP_MOVE(14, MOVE_MAGNITUDE), + LEVEL_UP_MOVE(18, MOVE_BULLDOZE), + LEVEL_UP_MOVE(22, MOVE_SUCKER_PUNCH), + LEVEL_UP_MOVE(25, MOVE_MUD_BOMB), + LEVEL_UP_MOVE(28, MOVE_EARTH_POWER), + LEVEL_UP_MOVE(31, MOVE_DIG), + LEVEL_UP_MOVE(35, MOVE_SLASH), + LEVEL_UP_MOVE(39, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(43, MOVE_FISSURE), LEVEL_UP_END }; -static const u16 sDugtrioLevelUpLearnset[] = { +static const struct LevelUpMove sDugtrioLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_SAND_TOMB), + LEVEL_UP_MOVE( 1, MOVE_SAND_TOMB), + LEVEL_UP_MOVE( 1, MOVE_ROTOTILLER), + LEVEL_UP_MOVE( 1, MOVE_NIGHT_SLASH), LEVEL_UP_MOVE( 1, MOVE_TRI_ATTACK), LEVEL_UP_MOVE( 1, MOVE_SCRATCH), LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 5, MOVE_GROWL), - LEVEL_UP_MOVE( 9, MOVE_MAGNITUDE), - LEVEL_UP_MOVE(17, MOVE_DIG), - LEVEL_UP_MOVE(25, MOVE_MUD_SLAP), - LEVEL_UP_MOVE(26, MOVE_SAND_TOMB), - LEVEL_UP_MOVE(38, MOVE_SLASH), - LEVEL_UP_MOVE(51, MOVE_EARTHQUAKE), - LEVEL_UP_MOVE(64, MOVE_FISSURE), + LEVEL_UP_MOVE( 4, MOVE_GROWL), + LEVEL_UP_MOVE( 7, MOVE_ASTONISH), + LEVEL_UP_MOVE(10, MOVE_MUD_SLAP), + LEVEL_UP_MOVE(14, MOVE_MAGNITUDE), + LEVEL_UP_MOVE(18, MOVE_BULLDOZE), + LEVEL_UP_MOVE(22, MOVE_SUCKER_PUNCH), + LEVEL_UP_MOVE(25, MOVE_MUD_BOMB), + LEVEL_UP_MOVE(30, MOVE_EARTH_POWER), + LEVEL_UP_MOVE(35, MOVE_DIG), + LEVEL_UP_MOVE(41, MOVE_SLASH), + LEVEL_UP_MOVE(47, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(53, MOVE_FISSURE), LEVEL_UP_END }; -static const u16 sMeowthLevelUpLearnset[] = { +static const struct LevelUpMove sMeowthLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SCRATCH), LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE(11, MOVE_BITE), - LEVEL_UP_MOVE(20, MOVE_PAY_DAY), - LEVEL_UP_MOVE(28, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE(35, MOVE_SCREECH), - LEVEL_UP_MOVE(41, MOVE_FURY_SWIPES), - LEVEL_UP_MOVE(46, MOVE_SLASH), - LEVEL_UP_MOVE(50, MOVE_FAKE_OUT), + LEVEL_UP_MOVE( 6, MOVE_BITE), + LEVEL_UP_MOVE( 9, MOVE_FAKE_OUT), + LEVEL_UP_MOVE(14, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(17, MOVE_SCREECH), + LEVEL_UP_MOVE(22, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(25, MOVE_TAUNT), + LEVEL_UP_MOVE(30, MOVE_PAY_DAY), + LEVEL_UP_MOVE(33, MOVE_SLASH), + LEVEL_UP_MOVE(38, MOVE_NASTY_PLOT), + LEVEL_UP_MOVE(41, MOVE_ASSURANCE), + LEVEL_UP_MOVE(46, MOVE_CAPTIVATE), + LEVEL_UP_MOVE(49, MOVE_NIGHT_SLASH), + LEVEL_UP_MOVE(50, MOVE_FEINT), LEVEL_UP_END }; -static const u16 sPersianLevelUpLearnset[] = { +static const struct LevelUpMove sPersianLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_SWIFT), + LEVEL_UP_MOVE( 1, MOVE_SWIFT), + LEVEL_UP_MOVE( 1, MOVE_PLAY_ROUGH), + LEVEL_UP_MOVE( 1, MOVE_SWITCHEROO), LEVEL_UP_MOVE( 1, MOVE_SCRATCH), LEVEL_UP_MOVE( 1, MOVE_GROWL), LEVEL_UP_MOVE( 1, MOVE_BITE), - LEVEL_UP_MOVE(11, MOVE_BITE), - LEVEL_UP_MOVE(20, MOVE_PAY_DAY), - LEVEL_UP_MOVE(29, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE(38, MOVE_SCREECH), - LEVEL_UP_MOVE(46, MOVE_FURY_SWIPES), - LEVEL_UP_MOVE(53, MOVE_SLASH), - LEVEL_UP_MOVE(59, MOVE_FAKE_OUT), + LEVEL_UP_MOVE( 1, MOVE_FAKE_OUT), + LEVEL_UP_MOVE( 6, MOVE_BITE), + LEVEL_UP_MOVE( 9, MOVE_FAKE_OUT), + LEVEL_UP_MOVE(14, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(17, MOVE_SCREECH), + LEVEL_UP_MOVE(22, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(25, MOVE_TAUNT), + LEVEL_UP_MOVE(32, MOVE_POWER_GEM), + LEVEL_UP_MOVE(37, MOVE_SLASH), + LEVEL_UP_MOVE(44, MOVE_NASTY_PLOT), + LEVEL_UP_MOVE(49, MOVE_ASSURANCE), + LEVEL_UP_MOVE(56, MOVE_CAPTIVATE), + LEVEL_UP_MOVE(61, MOVE_NIGHT_SLASH), + LEVEL_UP_MOVE(65, MOVE_FEINT), LEVEL_UP_END }; -static const u16 sPsyduckLevelUpLearnset[] = { +static const struct LevelUpMove sPsyduckLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_WATER_SPORT), LEVEL_UP_MOVE( 1, MOVE_SCRATCH), - LEVEL_UP_MOVE( 5, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE(10, MOVE_DISABLE), - LEVEL_UP_MOVE(16, MOVE_CONFUSION), - LEVEL_UP_MOVE(23, MOVE_SCREECH), - LEVEL_UP_MOVE(31, MOVE_PSYCH_UP), - LEVEL_UP_MOVE(40, MOVE_FURY_SWIPES), - LEVEL_UP_MOVE(50, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE( 4, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 7, MOVE_WATER_GUN), + LEVEL_UP_MOVE(10, MOVE_CONFUSION), + LEVEL_UP_MOVE(13, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(16, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(19, MOVE_DISABLE), + LEVEL_UP_MOVE(22, MOVE_SCREECH), + LEVEL_UP_MOVE(25, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(28, MOVE_AQUA_TAIL), + LEVEL_UP_MOVE(31, MOVE_SOAK), + LEVEL_UP_MOVE(34, MOVE_PSYCH_UP), + LEVEL_UP_MOVE(37, MOVE_AMNESIA), + LEVEL_UP_MOVE(40, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(43, MOVE_WONDER_ROOM), LEVEL_UP_END }; -static const u16 sGolduckLevelUpLearnset[] = { +static const struct LevelUpMove sGolduckLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ME_FIRST), + LEVEL_UP_MOVE( 1, MOVE_AQUA_JET), LEVEL_UP_MOVE( 1, MOVE_WATER_SPORT), LEVEL_UP_MOVE( 1, MOVE_SCRATCH), LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 1, MOVE_DISABLE), - LEVEL_UP_MOVE( 5, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE(10, MOVE_DISABLE), - LEVEL_UP_MOVE(16, MOVE_CONFUSION), - LEVEL_UP_MOVE(23, MOVE_SCREECH), - LEVEL_UP_MOVE(31, MOVE_PSYCH_UP), - LEVEL_UP_MOVE(44, MOVE_FURY_SWIPES), - LEVEL_UP_MOVE(58, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 4, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 7, MOVE_WATER_GUN), + LEVEL_UP_MOVE(10, MOVE_CONFUSION), + LEVEL_UP_MOVE(13, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(16, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(19, MOVE_DISABLE), + LEVEL_UP_MOVE(22, MOVE_SCREECH), + LEVEL_UP_MOVE(25, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(28, MOVE_AQUA_TAIL), + LEVEL_UP_MOVE(31, MOVE_SOAK), + LEVEL_UP_MOVE(36, MOVE_PSYCH_UP), + LEVEL_UP_MOVE(41, MOVE_AMNESIA), + LEVEL_UP_MOVE(46, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(51, MOVE_WONDER_ROOM), LEVEL_UP_END }; -static const u16 sMankeyLevelUpLearnset[] = { +static const struct LevelUpMove sMankeyLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_COVET), LEVEL_UP_MOVE( 1, MOVE_SCRATCH), - LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 9, MOVE_LOW_KICK), - LEVEL_UP_MOVE(15, MOVE_KARATE_CHOP), - LEVEL_UP_MOVE(21, MOVE_FURY_SWIPES), - LEVEL_UP_MOVE(27, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE(33, MOVE_SEISMIC_TOSS), - LEVEL_UP_MOVE(39, MOVE_CROSS_CHOP), - LEVEL_UP_MOVE(45, MOVE_SCREECH), - LEVEL_UP_MOVE(51, MOVE_THRASH), - LEVEL_UP_END -}; - -static const u16 sPrimeapeLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_SCRATCH), - LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_LOW_KICK), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 5, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE( 8, MOVE_KARATE_CHOP), + LEVEL_UP_MOVE(12, MOVE_PURSUIT), + LEVEL_UP_MOVE(15, MOVE_SEISMIC_TOSS), + LEVEL_UP_MOVE(19, MOVE_SWAGGER), + LEVEL_UP_MOVE(22, MOVE_CROSS_CHOP), + LEVEL_UP_MOVE(26, MOVE_ASSURANCE), + LEVEL_UP_MOVE(29, MOVE_PUNISHMENT), + LEVEL_UP_MOVE(33, MOVE_THRASH), + LEVEL_UP_MOVE(36, MOVE_CLOSE_COMBAT), + LEVEL_UP_MOVE(40, MOVE_SCREECH), + LEVEL_UP_MOVE(43, MOVE_STOMPING_TANTRUM), + LEVEL_UP_MOVE(47, MOVE_OUTRAGE), + LEVEL_UP_MOVE(50, MOVE_FINAL_GAMBIT), + LEVEL_UP_END +}; + +static const struct LevelUpMove sPrimeapeLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_RAGE), LEVEL_UP_MOVE( 1, MOVE_RAGE), - LEVEL_UP_MOVE( 9, MOVE_LOW_KICK), - LEVEL_UP_MOVE(15, MOVE_KARATE_CHOP), - LEVEL_UP_MOVE(21, MOVE_FURY_SWIPES), - LEVEL_UP_MOVE(27, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE(28, MOVE_RAGE), - LEVEL_UP_MOVE(36, MOVE_SEISMIC_TOSS), - LEVEL_UP_MOVE(45, MOVE_CROSS_CHOP), - LEVEL_UP_MOVE(54, MOVE_SCREECH), - LEVEL_UP_MOVE(63, MOVE_THRASH), + LEVEL_UP_MOVE( 1, MOVE_FINAL_GAMBIT), + LEVEL_UP_MOVE( 1, MOVE_FLING), + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_LOW_KICK), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 5, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE( 8, MOVE_KARATE_CHOP), + LEVEL_UP_MOVE(12, MOVE_PURSUIT), + LEVEL_UP_MOVE(15, MOVE_SEISMIC_TOSS), + LEVEL_UP_MOVE(19, MOVE_SWAGGER), + LEVEL_UP_MOVE(22, MOVE_CROSS_CHOP), + LEVEL_UP_MOVE(26, MOVE_ASSURANCE), + LEVEL_UP_MOVE(30, MOVE_PUNISHMENT), + LEVEL_UP_MOVE(35, MOVE_THRASH), + LEVEL_UP_MOVE(39, MOVE_CLOSE_COMBAT), + LEVEL_UP_MOVE(44, MOVE_SCREECH), + LEVEL_UP_MOVE(48, MOVE_STOMPING_TANTRUM), + LEVEL_UP_MOVE(53, MOVE_OUTRAGE), + LEVEL_UP_MOVE(57, MOVE_FINAL_GAMBIT), LEVEL_UP_END }; -static const u16 sGrowlitheLevelUpLearnset[] = { +static const struct LevelUpMove sGrowlitheLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_BITE), LEVEL_UP_MOVE( 1, MOVE_ROAR), - LEVEL_UP_MOVE( 7, MOVE_EMBER), - LEVEL_UP_MOVE(13, MOVE_LEER), - LEVEL_UP_MOVE(19, MOVE_ODOR_SLEUTH), - LEVEL_UP_MOVE(25, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(31, MOVE_FLAME_WHEEL), - LEVEL_UP_MOVE(37, MOVE_HELPING_HAND), - LEVEL_UP_MOVE(43, MOVE_AGILITY), - LEVEL_UP_MOVE(49, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE( 6, MOVE_EMBER), + LEVEL_UP_MOVE( 8, MOVE_LEER), + LEVEL_UP_MOVE(10, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE(12, MOVE_HELPING_HAND), + LEVEL_UP_MOVE(17, MOVE_FLAME_WHEEL), + LEVEL_UP_MOVE(19, MOVE_REVERSAL), + LEVEL_UP_MOVE(21, MOVE_FIRE_FANG), + LEVEL_UP_MOVE(23, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(28, MOVE_FLAME_BURST), + LEVEL_UP_MOVE(30, MOVE_AGILITY), + LEVEL_UP_MOVE(32, MOVE_RETALIATE), + LEVEL_UP_MOVE(34, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(39, MOVE_CRUNCH), + LEVEL_UP_MOVE(41, MOVE_HEAT_WAVE), + LEVEL_UP_MOVE(43, MOVE_OUTRAGE), + LEVEL_UP_MOVE(45, MOVE_FLARE_BLITZ), LEVEL_UP_END }; -static const u16 sArcanineLevelUpLearnset[] = { +static const struct LevelUpMove sArcanineLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_THUNDER_FANG), LEVEL_UP_MOVE( 1, MOVE_BITE), LEVEL_UP_MOVE( 1, MOVE_ROAR), - LEVEL_UP_MOVE( 1, MOVE_EMBER), LEVEL_UP_MOVE( 1, MOVE_ODOR_SLEUTH), - LEVEL_UP_MOVE(49, MOVE_EXTREME_SPEED), + LEVEL_UP_MOVE( 1, MOVE_FIRE_FANG), + LEVEL_UP_MOVE(34, MOVE_EXTREME_SPEED), LEVEL_UP_END }; -static const u16 sPoliwagLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_BUBBLE), - LEVEL_UP_MOVE( 7, MOVE_HYPNOSIS), - LEVEL_UP_MOVE(13, MOVE_WATER_GUN), - LEVEL_UP_MOVE(19, MOVE_DOUBLE_SLAP), - LEVEL_UP_MOVE(25, MOVE_RAIN_DANCE), - LEVEL_UP_MOVE(31, MOVE_BODY_SLAM), - LEVEL_UP_MOVE(37, MOVE_BELLY_DRUM), - LEVEL_UP_MOVE(43, MOVE_HYDRO_PUMP), +static const struct LevelUpMove sPoliwagLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WATER_SPORT), + LEVEL_UP_MOVE( 5, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 8, MOVE_HYPNOSIS), + LEVEL_UP_MOVE(11, MOVE_BUBBLE), + LEVEL_UP_MOVE(15, MOVE_DOUBLE_SLAP), + LEVEL_UP_MOVE(18, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(21, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(25, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(28, MOVE_MUD_SHOT), + LEVEL_UP_MOVE(31, MOVE_BELLY_DRUM), + LEVEL_UP_MOVE(35, MOVE_WAKE_UP_SLAP), + LEVEL_UP_MOVE(38, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(41, MOVE_MUD_BOMB), LEVEL_UP_END }; -static const u16 sPoliwhirlLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_BUBBLE), +static const struct LevelUpMove sPoliwhirlLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WATER_SPORT), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), LEVEL_UP_MOVE( 1, MOVE_HYPNOSIS), - LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), - LEVEL_UP_MOVE( 7, MOVE_HYPNOSIS), - LEVEL_UP_MOVE(13, MOVE_WATER_GUN), - LEVEL_UP_MOVE(19, MOVE_DOUBLE_SLAP), - LEVEL_UP_MOVE(27, MOVE_RAIN_DANCE), - LEVEL_UP_MOVE(35, MOVE_BODY_SLAM), - LEVEL_UP_MOVE(43, MOVE_BELLY_DRUM), - LEVEL_UP_MOVE(51, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE( 5, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 8, MOVE_HYPNOSIS), + LEVEL_UP_MOVE(11, MOVE_BUBBLE), + LEVEL_UP_MOVE(15, MOVE_DOUBLE_SLAP), + LEVEL_UP_MOVE(18, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(21, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(27, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(32, MOVE_MUD_SHOT), + LEVEL_UP_MOVE(37, MOVE_BELLY_DRUM), + LEVEL_UP_MOVE(43, MOVE_WAKE_UP_SLAP), + LEVEL_UP_MOVE(48, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(53, MOVE_MUD_BOMB), LEVEL_UP_END }; -static const u16 sPoliwrathLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), +static const struct LevelUpMove sPoliwrathLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_SUBMISSION), + LEVEL_UP_MOVE( 1, MOVE_SUBMISSION), + LEVEL_UP_MOVE( 1, MOVE_CIRCLE_THROW), + LEVEL_UP_MOVE( 1, MOVE_BUBBLE_BEAM), LEVEL_UP_MOVE( 1, MOVE_HYPNOSIS), LEVEL_UP_MOVE( 1, MOVE_DOUBLE_SLAP), - LEVEL_UP_MOVE( 1, MOVE_SUBMISSION), - LEVEL_UP_MOVE(35, MOVE_SUBMISSION), - LEVEL_UP_MOVE(51, MOVE_MIND_READER), + LEVEL_UP_MOVE(32, MOVE_DYNAMIC_PUNCH), + LEVEL_UP_MOVE(43, MOVE_MIND_READER), + LEVEL_UP_MOVE(53, MOVE_CIRCLE_THROW), LEVEL_UP_END }; -static const u16 sAbraLevelUpLearnset[] = { +static const struct LevelUpMove sAbraLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TELEPORT), LEVEL_UP_END }; -static const u16 sKadabraLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TELEPORT), +static const struct LevelUpMove sKadabraLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_KINESIS), LEVEL_UP_MOVE( 1, MOVE_KINESIS), + LEVEL_UP_MOVE( 1, MOVE_TELEPORT), LEVEL_UP_MOVE( 1, MOVE_CONFUSION), LEVEL_UP_MOVE(16, MOVE_CONFUSION), LEVEL_UP_MOVE(18, MOVE_DISABLE), LEVEL_UP_MOVE(21, MOVE_PSYBEAM), - LEVEL_UP_MOVE(23, MOVE_REFLECT), - LEVEL_UP_MOVE(25, MOVE_RECOVER), - LEVEL_UP_MOVE(30, MOVE_FUTURE_SIGHT), - LEVEL_UP_MOVE(33, MOVE_ROLE_PLAY), - LEVEL_UP_MOVE(36, MOVE_PSYCHIC), - LEVEL_UP_MOVE(43, MOVE_TRICK), + LEVEL_UP_MOVE(23, MOVE_MIRACLE_EYE), + LEVEL_UP_MOVE(26, MOVE_REFLECT), + LEVEL_UP_MOVE(28, MOVE_PSYCHO_CUT), + LEVEL_UP_MOVE(31, MOVE_RECOVER), + LEVEL_UP_MOVE(33, MOVE_TELEKINESIS), + LEVEL_UP_MOVE(36, MOVE_ALLY_SWITCH), + LEVEL_UP_MOVE(38, MOVE_PSYCHIC), + LEVEL_UP_MOVE(41, MOVE_ROLE_PLAY), + LEVEL_UP_MOVE(43, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(46, MOVE_TRICK), LEVEL_UP_END }; -static const u16 sAlakazamLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TELEPORT), +static const struct LevelUpMove sAlakazamLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_KINESIS), LEVEL_UP_MOVE( 1, MOVE_KINESIS), + LEVEL_UP_MOVE( 1, MOVE_TELEPORT), LEVEL_UP_MOVE( 1, MOVE_CONFUSION), LEVEL_UP_MOVE(16, MOVE_CONFUSION), LEVEL_UP_MOVE(18, MOVE_DISABLE), LEVEL_UP_MOVE(21, MOVE_PSYBEAM), - LEVEL_UP_MOVE(23, MOVE_REFLECT), - LEVEL_UP_MOVE(25, MOVE_RECOVER), - LEVEL_UP_MOVE(30, MOVE_FUTURE_SIGHT), - LEVEL_UP_MOVE(33, MOVE_CALM_MIND), - LEVEL_UP_MOVE(36, MOVE_PSYCHIC), - LEVEL_UP_MOVE(43, MOVE_TRICK), + LEVEL_UP_MOVE(23, MOVE_MIRACLE_EYE), + LEVEL_UP_MOVE(26, MOVE_REFLECT), + LEVEL_UP_MOVE(28, MOVE_PSYCHO_CUT), + LEVEL_UP_MOVE(31, MOVE_RECOVER), + LEVEL_UP_MOVE(33, MOVE_TELEKINESIS), + LEVEL_UP_MOVE(36, MOVE_ALLY_SWITCH), + LEVEL_UP_MOVE(38, MOVE_PSYCHIC), + LEVEL_UP_MOVE(41, MOVE_CALM_MIND), + LEVEL_UP_MOVE(43, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(46, MOVE_TRICK), LEVEL_UP_END }; -static const u16 sMachopLevelUpLearnset[] = { +static const struct LevelUpMove sMachopLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_LOW_KICK), LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 7, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE(13, MOVE_KARATE_CHOP), - LEVEL_UP_MOVE(19, MOVE_SEISMIC_TOSS), - LEVEL_UP_MOVE(22, MOVE_FORESIGHT), - LEVEL_UP_MOVE(25, MOVE_REVENGE), - LEVEL_UP_MOVE(31, MOVE_VITAL_THROW), - LEVEL_UP_MOVE(37, MOVE_SUBMISSION), - LEVEL_UP_MOVE(40, MOVE_CROSS_CHOP), + LEVEL_UP_MOVE( 3, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 7, MOVE_KARATE_CHOP), + LEVEL_UP_MOVE( 9, MOVE_FORESIGHT), + LEVEL_UP_MOVE(13, MOVE_LOW_SWEEP), + LEVEL_UP_MOVE(15, MOVE_SEISMIC_TOSS), + LEVEL_UP_MOVE(19, MOVE_REVENGE), + LEVEL_UP_MOVE(21, MOVE_KNOCK_OFF), + LEVEL_UP_MOVE(25, MOVE_VITAL_THROW), + LEVEL_UP_MOVE(27, MOVE_WAKE_UP_SLAP), + LEVEL_UP_MOVE(31, MOVE_DUAL_CHOP), + LEVEL_UP_MOVE(33, MOVE_SUBMISSION), + LEVEL_UP_MOVE(37, MOVE_BULK_UP), + LEVEL_UP_MOVE(39, MOVE_CROSS_CHOP), LEVEL_UP_MOVE(43, MOVE_SCARY_FACE), - LEVEL_UP_MOVE(49, MOVE_DYNAMIC_PUNCH), + LEVEL_UP_MOVE(45, MOVE_DYNAMIC_PUNCH), LEVEL_UP_END }; -static const u16 sMachokeLevelUpLearnset[] = { +static const struct LevelUpMove sMachokeLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_LOW_KICK), LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE( 7, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE(13, MOVE_KARATE_CHOP), - LEVEL_UP_MOVE(19, MOVE_SEISMIC_TOSS), - LEVEL_UP_MOVE(22, MOVE_FORESIGHT), - LEVEL_UP_MOVE(25, MOVE_REVENGE), - LEVEL_UP_MOVE(33, MOVE_VITAL_THROW), - LEVEL_UP_MOVE(41, MOVE_SUBMISSION), - LEVEL_UP_MOVE(46, MOVE_CROSS_CHOP), - LEVEL_UP_MOVE(51, MOVE_SCARY_FACE), - LEVEL_UP_MOVE(59, MOVE_DYNAMIC_PUNCH), + LEVEL_UP_MOVE( 1, MOVE_KARATE_CHOP), + LEVEL_UP_MOVE( 3, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 7, MOVE_KARATE_CHOP), + LEVEL_UP_MOVE( 9, MOVE_FORESIGHT), + LEVEL_UP_MOVE(13, MOVE_LOW_SWEEP), + LEVEL_UP_MOVE(15, MOVE_SEISMIC_TOSS), + LEVEL_UP_MOVE(19, MOVE_REVENGE), + LEVEL_UP_MOVE(21, MOVE_KNOCK_OFF), + LEVEL_UP_MOVE(25, MOVE_VITAL_THROW), + LEVEL_UP_MOVE(27, MOVE_WAKE_UP_SLAP), + LEVEL_UP_MOVE(33, MOVE_DUAL_CHOP), + LEVEL_UP_MOVE(37, MOVE_SUBMISSION), + LEVEL_UP_MOVE(43, MOVE_BULK_UP), + LEVEL_UP_MOVE(47, MOVE_CROSS_CHOP), + LEVEL_UP_MOVE(53, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(57, MOVE_DYNAMIC_PUNCH), LEVEL_UP_END }; -static const u16 sMachampLevelUpLearnset[] = { +static const struct LevelUpMove sMachampLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_STRENGTH), + LEVEL_UP_MOVE( 1, MOVE_STRENGTH), + LEVEL_UP_MOVE( 1, MOVE_WIDE_GUARD), LEVEL_UP_MOVE( 1, MOVE_LOW_KICK), LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE( 7, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE(13, MOVE_KARATE_CHOP), - LEVEL_UP_MOVE(19, MOVE_SEISMIC_TOSS), - LEVEL_UP_MOVE(22, MOVE_FORESIGHT), - LEVEL_UP_MOVE(25, MOVE_REVENGE), - LEVEL_UP_MOVE(33, MOVE_VITAL_THROW), - LEVEL_UP_MOVE(41, MOVE_SUBMISSION), - LEVEL_UP_MOVE(46, MOVE_CROSS_CHOP), - LEVEL_UP_MOVE(51, MOVE_SCARY_FACE), - LEVEL_UP_MOVE(59, MOVE_DYNAMIC_PUNCH), + LEVEL_UP_MOVE( 1, MOVE_KARATE_CHOP), + LEVEL_UP_MOVE( 3, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 7, MOVE_KARATE_CHOP), + LEVEL_UP_MOVE( 9, MOVE_FORESIGHT), + LEVEL_UP_MOVE(13, MOVE_LOW_SWEEP), + LEVEL_UP_MOVE(15, MOVE_SEISMIC_TOSS), + LEVEL_UP_MOVE(19, MOVE_REVENGE), + LEVEL_UP_MOVE(21, MOVE_KNOCK_OFF), + LEVEL_UP_MOVE(25, MOVE_VITAL_THROW), + LEVEL_UP_MOVE(27, MOVE_WAKE_UP_SLAP), + LEVEL_UP_MOVE(33, MOVE_DUAL_CHOP), + LEVEL_UP_MOVE(37, MOVE_SUBMISSION), + LEVEL_UP_MOVE(43, MOVE_BULK_UP), + LEVEL_UP_MOVE(47, MOVE_CROSS_CHOP), + LEVEL_UP_MOVE(53, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(57, MOVE_DYNAMIC_PUNCH), LEVEL_UP_END }; -static const u16 sBellsproutLevelUpLearnset[] = { +static const struct LevelUpMove sBellsproutLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_VINE_WHIP), - LEVEL_UP_MOVE( 6, MOVE_GROWTH), + LEVEL_UP_MOVE( 7, MOVE_GROWTH), LEVEL_UP_MOVE(11, MOVE_WRAP), - LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER), - LEVEL_UP_MOVE(17, MOVE_POISON_POWDER), - LEVEL_UP_MOVE(19, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(13, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(15, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(17, MOVE_STUN_SPORE), LEVEL_UP_MOVE(23, MOVE_ACID), - LEVEL_UP_MOVE(30, MOVE_SWEET_SCENT), - LEVEL_UP_MOVE(37, MOVE_RAZOR_LEAF), - LEVEL_UP_MOVE(45, MOVE_SLAM), + LEVEL_UP_MOVE(27, MOVE_KNOCK_OFF), + LEVEL_UP_MOVE(29, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE(35, MOVE_GASTRO_ACID), + LEVEL_UP_MOVE(39, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE(41, MOVE_POISON_JAB), + LEVEL_UP_MOVE(47, MOVE_SLAM), + LEVEL_UP_MOVE(50, MOVE_WRING_OUT), LEVEL_UP_END }; -static const u16 sWeepinbellLevelUpLearnset[] = { +static const struct LevelUpMove sWeepinbellLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_VINE_WHIP), LEVEL_UP_MOVE( 1, MOVE_GROWTH), LEVEL_UP_MOVE( 1, MOVE_WRAP), - LEVEL_UP_MOVE( 6, MOVE_GROWTH), + LEVEL_UP_MOVE( 7, MOVE_GROWTH), LEVEL_UP_MOVE(11, MOVE_WRAP), - LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER), - LEVEL_UP_MOVE(17, MOVE_POISON_POWDER), - LEVEL_UP_MOVE(19, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(13, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(15, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(17, MOVE_STUN_SPORE), LEVEL_UP_MOVE(24, MOVE_ACID), - LEVEL_UP_MOVE(33, MOVE_SWEET_SCENT), - LEVEL_UP_MOVE(42, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE(29, MOVE_KNOCK_OFF), + LEVEL_UP_MOVE(32, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE(39, MOVE_GASTRO_ACID), + LEVEL_UP_MOVE(44, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE(47, MOVE_POISON_JAB), LEVEL_UP_MOVE(54, MOVE_SLAM), + LEVEL_UP_MOVE(58, MOVE_WRING_OUT), LEVEL_UP_END }; -static const u16 sVictreebelLevelUpLearnset[] = { +static const struct LevelUpMove sVictreebelLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_LEAF_TORNADO), + LEVEL_UP_MOVE( 1, MOVE_LEAF_TORNADO), + LEVEL_UP_MOVE( 1, MOVE_STOCKPILE), + LEVEL_UP_MOVE( 1, MOVE_SWALLOW), + LEVEL_UP_MOVE( 1, MOVE_SPIT_UP), LEVEL_UP_MOVE( 1, MOVE_VINE_WHIP), LEVEL_UP_MOVE( 1, MOVE_SLEEP_POWDER), LEVEL_UP_MOVE( 1, MOVE_SWEET_SCENT), LEVEL_UP_MOVE( 1, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE(32, MOVE_LEAF_STORM), + LEVEL_UP_MOVE(44, MOVE_LEAF_BLADE), LEVEL_UP_END }; -static const u16 sTentacoolLevelUpLearnset[] = { +static const struct LevelUpMove sTentacoolLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_POISON_STING), - LEVEL_UP_MOVE( 6, MOVE_SUPERSONIC), - LEVEL_UP_MOVE(12, MOVE_CONSTRICT), - LEVEL_UP_MOVE(19, MOVE_ACID), + LEVEL_UP_MOVE( 4, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 7, MOVE_CONSTRICT), + LEVEL_UP_MOVE(10, MOVE_ACID), + LEVEL_UP_MOVE(13, MOVE_TOXIC_SPIKES), + LEVEL_UP_MOVE(16, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(19, MOVE_WRAP), + LEVEL_UP_MOVE(22, MOVE_ACID_SPRAY), LEVEL_UP_MOVE(25, MOVE_BUBBLE_BEAM), - LEVEL_UP_MOVE(30, MOVE_WRAP), - LEVEL_UP_MOVE(36, MOVE_BARRIER), - LEVEL_UP_MOVE(43, MOVE_SCREECH), - LEVEL_UP_MOVE(49, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(28, MOVE_BARRIER), + LEVEL_UP_MOVE(31, MOVE_POISON_JAB), + LEVEL_UP_MOVE(34, MOVE_BRINE), + LEVEL_UP_MOVE(37, MOVE_SCREECH), + LEVEL_UP_MOVE(40, MOVE_HEX), + LEVEL_UP_MOVE(43, MOVE_SLUDGE_WAVE), + LEVEL_UP_MOVE(46, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(49, MOVE_WRING_OUT), LEVEL_UP_END }; -static const u16 sTentacruelLevelUpLearnset[] = { +static const struct LevelUpMove sTentacruelLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_REFLECT_TYPE), + LEVEL_UP_MOVE( 1, MOVE_WRING_OUT), LEVEL_UP_MOVE( 1, MOVE_POISON_STING), LEVEL_UP_MOVE( 1, MOVE_SUPERSONIC), LEVEL_UP_MOVE( 1, MOVE_CONSTRICT), - LEVEL_UP_MOVE( 6, MOVE_SUPERSONIC), - LEVEL_UP_MOVE(12, MOVE_CONSTRICT), - LEVEL_UP_MOVE(19, MOVE_ACID), + LEVEL_UP_MOVE( 1, MOVE_ACID), + LEVEL_UP_MOVE( 4, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 7, MOVE_CONSTRICT), + LEVEL_UP_MOVE(10, MOVE_ACID), + LEVEL_UP_MOVE(13, MOVE_TOXIC_SPIKES), + LEVEL_UP_MOVE(16, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(19, MOVE_WRAP), + LEVEL_UP_MOVE(22, MOVE_ACID_SPRAY), LEVEL_UP_MOVE(25, MOVE_BUBBLE_BEAM), - LEVEL_UP_MOVE(30, MOVE_WRAP), - LEVEL_UP_MOVE(38, MOVE_BARRIER), - LEVEL_UP_MOVE(47, MOVE_SCREECH), - LEVEL_UP_MOVE(55, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(28, MOVE_BARRIER), + LEVEL_UP_MOVE(32, MOVE_POISON_JAB), + LEVEL_UP_MOVE(36, MOVE_BRINE), + LEVEL_UP_MOVE(40, MOVE_SCREECH), + LEVEL_UP_MOVE(44, MOVE_HEX), + LEVEL_UP_MOVE(48, MOVE_SLUDGE_WAVE), + LEVEL_UP_MOVE(52, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(56, MOVE_WRING_OUT), LEVEL_UP_END }; -static const u16 sGeodudeLevelUpLearnset[] = { +static const struct LevelUpMove sGeodudeLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_DEFENSE_CURL), - LEVEL_UP_MOVE( 6, MOVE_MUD_SPORT), - LEVEL_UP_MOVE(11, MOVE_ROCK_THROW), - LEVEL_UP_MOVE(16, MOVE_MAGNITUDE), - LEVEL_UP_MOVE(21, MOVE_SELF_DESTRUCT), - LEVEL_UP_MOVE(26, MOVE_ROLLOUT), - LEVEL_UP_MOVE(31, MOVE_ROCK_BLAST), - LEVEL_UP_MOVE(36, MOVE_EARTHQUAKE), - LEVEL_UP_MOVE(41, MOVE_EXPLOSION), - LEVEL_UP_MOVE(46, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE( 4, MOVE_MUD_SPORT), + LEVEL_UP_MOVE( 6, MOVE_ROCK_POLISH), + LEVEL_UP_MOVE(10, MOVE_ROLLOUT), + LEVEL_UP_MOVE(12, MOVE_MAGNITUDE), + LEVEL_UP_MOVE(16, MOVE_ROCK_THROW), + LEVEL_UP_MOVE(18, MOVE_SMACK_DOWN), + LEVEL_UP_MOVE(22, MOVE_BULLDOZE), + LEVEL_UP_MOVE(24, MOVE_SELF_DESTRUCT), + LEVEL_UP_MOVE(28, MOVE_STEALTH_ROCK), + LEVEL_UP_MOVE(30, MOVE_ROCK_BLAST), + LEVEL_UP_MOVE(34, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(36, MOVE_EXPLOSION), + LEVEL_UP_MOVE(40, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(42, MOVE_STONE_EDGE), LEVEL_UP_END }; -static const u16 sGravelerLevelUpLearnset[] = { +static const struct LevelUpMove sGravelerLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE( 1, MOVE_MUD_SPORT), - LEVEL_UP_MOVE( 1, MOVE_ROCK_THROW), - LEVEL_UP_MOVE( 6, MOVE_MUD_SPORT), - LEVEL_UP_MOVE(11, MOVE_ROCK_THROW), - LEVEL_UP_MOVE(16, MOVE_MAGNITUDE), - LEVEL_UP_MOVE(21, MOVE_SELF_DESTRUCT), - LEVEL_UP_MOVE(29, MOVE_ROLLOUT), - LEVEL_UP_MOVE(37, MOVE_ROCK_BLAST), - LEVEL_UP_MOVE(45, MOVE_EARTHQUAKE), - LEVEL_UP_MOVE(53, MOVE_EXPLOSION), - LEVEL_UP_MOVE(62, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE( 1, MOVE_ROCK_POLISH), + LEVEL_UP_MOVE( 4, MOVE_MUD_SPORT), + LEVEL_UP_MOVE( 6, MOVE_ROCK_POLISH), + LEVEL_UP_MOVE(10, MOVE_ROLLOUT), + LEVEL_UP_MOVE(12, MOVE_MAGNITUDE), + LEVEL_UP_MOVE(16, MOVE_ROCK_THROW), + LEVEL_UP_MOVE(18, MOVE_SMACK_DOWN), + LEVEL_UP_MOVE(22, MOVE_BULLDOZE), + LEVEL_UP_MOVE(24, MOVE_SELF_DESTRUCT), + LEVEL_UP_MOVE(30, MOVE_STEALTH_ROCK), + LEVEL_UP_MOVE(34, MOVE_ROCK_BLAST), + LEVEL_UP_MOVE(40, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(44, MOVE_EXPLOSION), + LEVEL_UP_MOVE(50, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(54, MOVE_STONE_EDGE), LEVEL_UP_END }; -static const u16 sGolemLevelUpLearnset[] = { +static const struct LevelUpMove sGolemLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_HEAVY_SLAM), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE( 1, MOVE_MUD_SPORT), - LEVEL_UP_MOVE( 1, MOVE_ROCK_THROW), - LEVEL_UP_MOVE( 6, MOVE_MUD_SPORT), - LEVEL_UP_MOVE(11, MOVE_ROCK_THROW), - LEVEL_UP_MOVE(16, MOVE_MAGNITUDE), - LEVEL_UP_MOVE(21, MOVE_SELF_DESTRUCT), - LEVEL_UP_MOVE(29, MOVE_ROLLOUT), - LEVEL_UP_MOVE(37, MOVE_ROCK_BLAST), - LEVEL_UP_MOVE(45, MOVE_EARTHQUAKE), - LEVEL_UP_MOVE(53, MOVE_EXPLOSION), - LEVEL_UP_MOVE(62, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE( 1, MOVE_ROCK_POLISH), + LEVEL_UP_MOVE( 4, MOVE_MUD_SPORT), + LEVEL_UP_MOVE( 6, MOVE_ROCK_POLISH), + LEVEL_UP_MOVE(10, MOVE_STEAMROLLER), + LEVEL_UP_MOVE(12, MOVE_MAGNITUDE), + LEVEL_UP_MOVE(16, MOVE_ROCK_THROW), + LEVEL_UP_MOVE(18, MOVE_SMACK_DOWN), + LEVEL_UP_MOVE(22, MOVE_BULLDOZE), + LEVEL_UP_MOVE(24, MOVE_SELF_DESTRUCT), + LEVEL_UP_MOVE(30, MOVE_STEALTH_ROCK), + LEVEL_UP_MOVE(34, MOVE_ROCK_BLAST), + LEVEL_UP_MOVE(40, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(44, MOVE_EXPLOSION), + LEVEL_UP_MOVE(50, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(54, MOVE_STONE_EDGE), + LEVEL_UP_MOVE(60, MOVE_HEAVY_SLAM), LEVEL_UP_END }; -static const u16 sPonytaLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 5, MOVE_GROWL), - LEVEL_UP_MOVE( 9, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE(14, MOVE_EMBER), - LEVEL_UP_MOVE(19, MOVE_STOMP), - LEVEL_UP_MOVE(25, MOVE_FIRE_SPIN), - LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(38, MOVE_AGILITY), - LEVEL_UP_MOVE(45, MOVE_BOUNCE), - LEVEL_UP_MOVE(53, MOVE_FIRE_BLAST), - LEVEL_UP_END -}; - -static const u16 sRapidashLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TACKLE), +static const struct LevelUpMove sPonytaLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 4, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 9, MOVE_EMBER), + LEVEL_UP_MOVE(13, MOVE_FLAME_WHEEL), + LEVEL_UP_MOVE(17, MOVE_STOMP), + LEVEL_UP_MOVE(21, MOVE_FLAME_CHARGE), + LEVEL_UP_MOVE(25, MOVE_FIRE_SPIN), + LEVEL_UP_MOVE(29, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(33, MOVE_INFERNO), + LEVEL_UP_MOVE(37, MOVE_AGILITY), + LEVEL_UP_MOVE(41, MOVE_FIRE_BLAST), + LEVEL_UP_MOVE(45, MOVE_BOUNCE), + LEVEL_UP_MOVE(49, MOVE_FLARE_BLITZ), + LEVEL_UP_END +}; + +static const struct LevelUpMove sRapidashLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_POISON_JAB), + LEVEL_UP_MOVE( 1, MOVE_MEGAHORN), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE( 1, MOVE_EMBER), - LEVEL_UP_MOVE( 5, MOVE_GROWL), - LEVEL_UP_MOVE( 9, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE(14, MOVE_EMBER), - LEVEL_UP_MOVE(19, MOVE_STOMP), + LEVEL_UP_MOVE( 4, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 9, MOVE_EMBER), + LEVEL_UP_MOVE(13, MOVE_FLAME_WHEEL), + LEVEL_UP_MOVE(17, MOVE_STOMP), + LEVEL_UP_MOVE(21, MOVE_FLAME_CHARGE), LEVEL_UP_MOVE(25, MOVE_FIRE_SPIN), - LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(38, MOVE_AGILITY), - LEVEL_UP_MOVE(40, MOVE_FURY_ATTACK), - LEVEL_UP_MOVE(50, MOVE_BOUNCE), - LEVEL_UP_MOVE(63, MOVE_FIRE_BLAST), + LEVEL_UP_MOVE(29, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(33, MOVE_INFERNO), + LEVEL_UP_MOVE(37, MOVE_AGILITY), + LEVEL_UP_MOVE(41, MOVE_FIRE_BLAST), + LEVEL_UP_MOVE(45, MOVE_BOUNCE), + LEVEL_UP_MOVE(49, MOVE_FLARE_BLITZ), LEVEL_UP_END }; -static const u16 sSlowpokeLevelUpLearnset[] = { +static const struct LevelUpMove sSlowpokeLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_CURSE), LEVEL_UP_MOVE( 1, MOVE_YAWN), LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 6, MOVE_GROWL), - LEVEL_UP_MOVE(15, MOVE_WATER_GUN), - LEVEL_UP_MOVE(20, MOVE_CONFUSION), - LEVEL_UP_MOVE(29, MOVE_DISABLE), - LEVEL_UP_MOVE(34, MOVE_HEADBUTT), + LEVEL_UP_MOVE( 5, MOVE_GROWL), + LEVEL_UP_MOVE( 9, MOVE_WATER_GUN), + LEVEL_UP_MOVE(14, MOVE_CONFUSION), + LEVEL_UP_MOVE(19, MOVE_DISABLE), + LEVEL_UP_MOVE(23, MOVE_HEADBUTT), + LEVEL_UP_MOVE(28, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(32, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(36, MOVE_SLACK_OFF), + LEVEL_UP_MOVE(41, MOVE_AMNESIA), + LEVEL_UP_MOVE(45, MOVE_PSYCHIC), + LEVEL_UP_MOVE(49, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(54, MOVE_PSYCH_UP), + LEVEL_UP_MOVE(58, MOVE_HEAL_PULSE), + LEVEL_UP_END +}; + +static const struct LevelUpMove sSlowbroLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_WITHDRAW), + LEVEL_UP_MOVE( 1, MOVE_WITHDRAW), + LEVEL_UP_MOVE( 1, MOVE_HEAL_PULSE), + LEVEL_UP_MOVE( 1, MOVE_CURSE), + LEVEL_UP_MOVE( 1, MOVE_YAWN), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 5, MOVE_GROWL), + LEVEL_UP_MOVE( 9, MOVE_WATER_GUN), + LEVEL_UP_MOVE(14, MOVE_CONFUSION), + LEVEL_UP_MOVE(19, MOVE_DISABLE), + LEVEL_UP_MOVE(23, MOVE_HEADBUTT), + LEVEL_UP_MOVE(28, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(32, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(36, MOVE_SLACK_OFF), LEVEL_UP_MOVE(43, MOVE_AMNESIA), - LEVEL_UP_MOVE(48, MOVE_PSYCHIC), + LEVEL_UP_MOVE(49, MOVE_PSYCHIC), + LEVEL_UP_MOVE(55, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(62, MOVE_PSYCH_UP), + LEVEL_UP_MOVE(68, MOVE_HEAL_PULSE), LEVEL_UP_END }; -static const u16 sSlowbroLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_CURSE), - LEVEL_UP_MOVE( 1, MOVE_YAWN), +static const struct LevelUpMove sMagnemiteLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 6, MOVE_GROWL), - LEVEL_UP_MOVE(15, MOVE_WATER_GUN), - LEVEL_UP_MOVE(20, MOVE_CONFUSION), - LEVEL_UP_MOVE(29, MOVE_DISABLE), - LEVEL_UP_MOVE(34, MOVE_HEADBUTT), - LEVEL_UP_MOVE(37, MOVE_WITHDRAW), - LEVEL_UP_MOVE(46, MOVE_AMNESIA), - LEVEL_UP_MOVE(54, MOVE_PSYCHIC), + LEVEL_UP_MOVE( 1, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 5, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE( 7, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE(11, MOVE_MAGNET_BOMB), + LEVEL_UP_MOVE(13, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(17, MOVE_SONIC_BOOM), + LEVEL_UP_MOVE(19, MOVE_SPARK), + LEVEL_UP_MOVE(23, MOVE_MIRROR_SHOT), + LEVEL_UP_MOVE(25, MOVE_METAL_SOUND), + LEVEL_UP_MOVE(29, MOVE_ELECTRO_BALL), + LEVEL_UP_MOVE(31, MOVE_FLASH_CANNON), + LEVEL_UP_MOVE(35, MOVE_SCREECH), + LEVEL_UP_MOVE(37, MOVE_DISCHARGE), + LEVEL_UP_MOVE(41, MOVE_LOCK_ON), + LEVEL_UP_MOVE(43, MOVE_MAGNET_RISE), + LEVEL_UP_MOVE(47, MOVE_GYRO_BALL), + LEVEL_UP_MOVE(49, MOVE_ZAP_CANNON), LEVEL_UP_END }; -static const u16 sMagnemiteLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_METAL_SOUND), - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 6, MOVE_THUNDER_SHOCK), - LEVEL_UP_MOVE(11, MOVE_SUPERSONIC), - LEVEL_UP_MOVE(16, MOVE_SONIC_BOOM), - LEVEL_UP_MOVE(21, MOVE_THUNDER_WAVE), - LEVEL_UP_MOVE(26, MOVE_SPARK), - LEVEL_UP_MOVE(32, MOVE_LOCK_ON), - LEVEL_UP_MOVE(38, MOVE_SWIFT), - LEVEL_UP_MOVE(44, MOVE_SCREECH), - LEVEL_UP_MOVE(50, MOVE_ZAP_CANNON), - LEVEL_UP_END -}; - -static const u16 sMagnetonLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_METAL_SOUND), +static const struct LevelUpMove sMagnetonLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_TRI_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_TRI_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_ZAP_CANNON), + LEVEL_UP_MOVE( 1, MOVE_ELECTRIC_TERRAIN), LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_SUPERSONIC), LEVEL_UP_MOVE( 1, MOVE_THUNDER_SHOCK), - LEVEL_UP_MOVE( 1, MOVE_SUPERSONIC), - LEVEL_UP_MOVE( 6, MOVE_THUNDER_SHOCK), - LEVEL_UP_MOVE(11, MOVE_SUPERSONIC), - LEVEL_UP_MOVE(16, MOVE_SONIC_BOOM), - LEVEL_UP_MOVE(21, MOVE_THUNDER_WAVE), - LEVEL_UP_MOVE(26, MOVE_SPARK), - LEVEL_UP_MOVE(35, MOVE_LOCK_ON), - LEVEL_UP_MOVE(44, MOVE_TRI_ATTACK), - LEVEL_UP_MOVE(53, MOVE_SCREECH), - LEVEL_UP_MOVE(62, MOVE_ZAP_CANNON), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE( 5, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE( 7, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE(11, MOVE_MAGNET_BOMB), + LEVEL_UP_MOVE(13, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(17, MOVE_SONIC_BOOM), + LEVEL_UP_MOVE(19, MOVE_SPARK), + LEVEL_UP_MOVE(23, MOVE_MIRROR_SHOT), + LEVEL_UP_MOVE(25, MOVE_METAL_SOUND), + LEVEL_UP_MOVE(29, MOVE_ELECTRO_BALL), + LEVEL_UP_MOVE(33, MOVE_FLASH_CANNON), + LEVEL_UP_MOVE(39, MOVE_SCREECH), + LEVEL_UP_MOVE(43, MOVE_DISCHARGE), + LEVEL_UP_MOVE(49, MOVE_LOCK_ON), + LEVEL_UP_MOVE(53, MOVE_MAGNET_RISE), + LEVEL_UP_MOVE(59, MOVE_GYRO_BALL), + LEVEL_UP_MOVE(63, MOVE_ZAP_CANNON), LEVEL_UP_END }; -static const u16 sFarfetchdLevelUpLearnset[] = { +static const struct LevelUpMove sFarfetchdLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BRAVE_BIRD), + LEVEL_UP_MOVE( 1, MOVE_POISON_JAB), LEVEL_UP_MOVE( 1, MOVE_PECK), - LEVEL_UP_MOVE( 6, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(11, MOVE_LEER), - LEVEL_UP_MOVE(16, MOVE_FURY_ATTACK), - LEVEL_UP_MOVE(21, MOVE_KNOCK_OFF), - LEVEL_UP_MOVE(26, MOVE_FURY_CUTTER), - LEVEL_UP_MOVE(31, MOVE_SWORDS_DANCE), - LEVEL_UP_MOVE(36, MOVE_AGILITY), - LEVEL_UP_MOVE(41, MOVE_SLASH), - LEVEL_UP_MOVE(46, MOVE_FALSE_SWIPE), + LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_FURY_CUTTER), + LEVEL_UP_MOVE( 7, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE( 9, MOVE_AERIAL_ACE), + LEVEL_UP_MOVE(13, MOVE_KNOCK_OFF), + LEVEL_UP_MOVE(19, MOVE_SLASH), + LEVEL_UP_MOVE(21, MOVE_AIR_CUTTER), + LEVEL_UP_MOVE(25, MOVE_SWORDS_DANCE), + LEVEL_UP_MOVE(31, MOVE_AGILITY), + LEVEL_UP_MOVE(33, MOVE_NIGHT_SLASH), + LEVEL_UP_MOVE(37, MOVE_ACROBATICS), + LEVEL_UP_MOVE(43, MOVE_FEINT), + LEVEL_UP_MOVE(45, MOVE_FALSE_SWIPE), + LEVEL_UP_MOVE(49, MOVE_AIR_SLASH), + LEVEL_UP_MOVE(55, MOVE_BRAVE_BIRD), LEVEL_UP_END }; -static const u16 sDoduoLevelUpLearnset[] = { +static const struct LevelUpMove sDoduoLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_PECK), LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 9, MOVE_PURSUIT), - LEVEL_UP_MOVE(13, MOVE_FURY_ATTACK), - LEVEL_UP_MOVE(21, MOVE_TRI_ATTACK), - LEVEL_UP_MOVE(25, MOVE_RAGE), - LEVEL_UP_MOVE(33, MOVE_UPROAR), - LEVEL_UP_MOVE(37, MOVE_DRILL_PECK), - LEVEL_UP_MOVE(45, MOVE_AGILITY), + LEVEL_UP_MOVE( 5, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 8, MOVE_RAGE), + LEVEL_UP_MOVE(12, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(15, MOVE_PURSUIT), + LEVEL_UP_MOVE(19, MOVE_PLUCK), + LEVEL_UP_MOVE(22, MOVE_DOUBLE_HIT), + LEVEL_UP_MOVE(26, MOVE_AGILITY), + LEVEL_UP_MOVE(29, MOVE_UPROAR), + LEVEL_UP_MOVE(33, MOVE_ACUPRESSURE), + LEVEL_UP_MOVE(36, MOVE_SWORDS_DANCE), + LEVEL_UP_MOVE(40, MOVE_JUMP_KICK), + LEVEL_UP_MOVE(43, MOVE_DRILL_PECK), + LEVEL_UP_MOVE(47, MOVE_ENDEAVOR), + LEVEL_UP_MOVE(50, MOVE_THRASH), LEVEL_UP_END }; -static const u16 sDodrioLevelUpLearnset[] = { +static const struct LevelUpMove sDodrioLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_TRI_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_TRI_ATTACK), LEVEL_UP_MOVE( 1, MOVE_PECK), LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 1, MOVE_PURSUIT), - LEVEL_UP_MOVE( 1, MOVE_FURY_ATTACK), - LEVEL_UP_MOVE( 9, MOVE_PURSUIT), - LEVEL_UP_MOVE(13, MOVE_FURY_ATTACK), - LEVEL_UP_MOVE(21, MOVE_TRI_ATTACK), - LEVEL_UP_MOVE(25, MOVE_RAGE), - LEVEL_UP_MOVE(38, MOVE_UPROAR), + LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_RAGE), + LEVEL_UP_MOVE( 5, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 8, MOVE_RAGE), + LEVEL_UP_MOVE(12, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(15, MOVE_PURSUIT), + LEVEL_UP_MOVE(19, MOVE_PLUCK), + LEVEL_UP_MOVE(22, MOVE_DOUBLE_HIT), + LEVEL_UP_MOVE(26, MOVE_AGILITY), + LEVEL_UP_MOVE(29, MOVE_UPROAR), + LEVEL_UP_MOVE(34, MOVE_ACUPRESSURE), + LEVEL_UP_MOVE(38, MOVE_SWORDS_DANCE), + LEVEL_UP_MOVE(43, MOVE_JUMP_KICK), LEVEL_UP_MOVE(47, MOVE_DRILL_PECK), - LEVEL_UP_MOVE(60, MOVE_AGILITY), + LEVEL_UP_MOVE(52, MOVE_ENDEAVOR), + LEVEL_UP_MOVE(56, MOVE_THRASH), LEVEL_UP_END }; -static const u16 sSeelLevelUpLearnset[] = { +static const struct LevelUpMove sSeelLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_HEADBUTT), - LEVEL_UP_MOVE( 9, MOVE_GROWL), - LEVEL_UP_MOVE(17, MOVE_ICY_WIND), - LEVEL_UP_MOVE(21, MOVE_AURORA_BEAM), - LEVEL_UP_MOVE(29, MOVE_REST), + LEVEL_UP_MOVE( 3, MOVE_GROWL), + LEVEL_UP_MOVE( 7, MOVE_WATER_SPORT), + LEVEL_UP_MOVE(11, MOVE_ICY_WIND), + LEVEL_UP_MOVE(13, MOVE_ENCORE), + LEVEL_UP_MOVE(17, MOVE_ICE_SHARD), + LEVEL_UP_MOVE(21, MOVE_REST), + LEVEL_UP_MOVE(23, MOVE_AQUA_RING), + LEVEL_UP_MOVE(27, MOVE_AURORA_BEAM), + LEVEL_UP_MOVE(31, MOVE_AQUA_JET), + LEVEL_UP_MOVE(33, MOVE_BRINE), LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(41, MOVE_ICE_BEAM), - LEVEL_UP_MOVE(49, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(41, MOVE_DIVE), + LEVEL_UP_MOVE(43, MOVE_AQUA_TAIL), + LEVEL_UP_MOVE(47, MOVE_ICE_BEAM), + LEVEL_UP_MOVE(51, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(53, MOVE_HAIL), LEVEL_UP_END }; -static const u16 sDewgongLevelUpLearnset[] = { +static const struct LevelUpMove sDewgongLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_SHEER_COLD), + LEVEL_UP_MOVE( 1, MOVE_SHEER_COLD), LEVEL_UP_MOVE( 1, MOVE_HEADBUTT), LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_SIGNAL_BEAM), LEVEL_UP_MOVE( 1, MOVE_ICY_WIND), - LEVEL_UP_MOVE( 1, MOVE_AURORA_BEAM), - LEVEL_UP_MOVE( 9, MOVE_GROWL), - LEVEL_UP_MOVE(17, MOVE_ICY_WIND), - LEVEL_UP_MOVE(21, MOVE_AURORA_BEAM), - LEVEL_UP_MOVE(29, MOVE_REST), - LEVEL_UP_MOVE(34, MOVE_SHEER_COLD), - LEVEL_UP_MOVE(42, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(51, MOVE_ICE_BEAM), - LEVEL_UP_MOVE(64, MOVE_SAFEGUARD), + LEVEL_UP_MOVE( 3, MOVE_GROWL), + LEVEL_UP_MOVE( 7, MOVE_SIGNAL_BEAM), + LEVEL_UP_MOVE(11, MOVE_ICY_WIND), + LEVEL_UP_MOVE(13, MOVE_ENCORE), + LEVEL_UP_MOVE(17, MOVE_ICE_SHARD), + LEVEL_UP_MOVE(21, MOVE_REST), + LEVEL_UP_MOVE(23, MOVE_AQUA_RING), + LEVEL_UP_MOVE(27, MOVE_AURORA_BEAM), + LEVEL_UP_MOVE(31, MOVE_AQUA_JET), + LEVEL_UP_MOVE(33, MOVE_BRINE), + LEVEL_UP_MOVE(39, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(45, MOVE_DIVE), + LEVEL_UP_MOVE(49, MOVE_AQUA_TAIL), + LEVEL_UP_MOVE(55, MOVE_ICE_BEAM), + LEVEL_UP_MOVE(61, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(65, MOVE_HAIL), LEVEL_UP_END }; -static const u16 sGrimerLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_POISON_GAS), +static const struct LevelUpMove sGrimerLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 1, MOVE_POISON_GAS), LEVEL_UP_MOVE( 4, MOVE_HARDEN), - LEVEL_UP_MOVE( 8, MOVE_DISABLE), - LEVEL_UP_MOVE(13, MOVE_SLUDGE), - LEVEL_UP_MOVE(19, MOVE_MINIMIZE), - LEVEL_UP_MOVE(26, MOVE_SCREECH), - LEVEL_UP_MOVE(34, MOVE_ACID_ARMOR), - LEVEL_UP_MOVE(43, MOVE_SLUDGE_BOMB), - LEVEL_UP_MOVE(53, MOVE_MEMENTO), + LEVEL_UP_MOVE( 7, MOVE_MUD_SLAP), + LEVEL_UP_MOVE(12, MOVE_DISABLE), + LEVEL_UP_MOVE(15, MOVE_SLUDGE), + LEVEL_UP_MOVE(18, MOVE_MUD_BOMB), + LEVEL_UP_MOVE(21, MOVE_MINIMIZE), + LEVEL_UP_MOVE(26, MOVE_FLING), + LEVEL_UP_MOVE(29, MOVE_SLUDGE_BOMB), + LEVEL_UP_MOVE(32, MOVE_SLUDGE_WAVE), + LEVEL_UP_MOVE(37, MOVE_SCREECH), + LEVEL_UP_MOVE(40, MOVE_GUNK_SHOT), + LEVEL_UP_MOVE(43, MOVE_ACID_ARMOR), + LEVEL_UP_MOVE(46, MOVE_BELCH), + LEVEL_UP_MOVE(48, MOVE_MEMENTO), LEVEL_UP_END }; -static const u16 sMukLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_POISON_GAS), +static const struct LevelUpMove sMukLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_VENOM_DRENCH), + LEVEL_UP_MOVE( 1, MOVE_VENOM_DRENCH), LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 1, MOVE_POISON_GAS), LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 1, MOVE_MUD_SLAP), LEVEL_UP_MOVE( 4, MOVE_HARDEN), - LEVEL_UP_MOVE( 8, MOVE_DISABLE), - LEVEL_UP_MOVE(13, MOVE_SLUDGE), - LEVEL_UP_MOVE(19, MOVE_MINIMIZE), - LEVEL_UP_MOVE(26, MOVE_SCREECH), - LEVEL_UP_MOVE(34, MOVE_ACID_ARMOR), - LEVEL_UP_MOVE(47, MOVE_SLUDGE_BOMB), - LEVEL_UP_MOVE(61, MOVE_MEMENTO), + LEVEL_UP_MOVE( 7, MOVE_MUD_SLAP), + LEVEL_UP_MOVE(12, MOVE_DISABLE), + LEVEL_UP_MOVE(15, MOVE_SLUDGE), + LEVEL_UP_MOVE(18, MOVE_MUD_BOMB), + LEVEL_UP_MOVE(21, MOVE_MINIMIZE), + LEVEL_UP_MOVE(26, MOVE_FLING), + LEVEL_UP_MOVE(29, MOVE_SLUDGE_BOMB), + LEVEL_UP_MOVE(32, MOVE_SLUDGE_WAVE), + LEVEL_UP_MOVE(37, MOVE_SCREECH), + LEVEL_UP_MOVE(40, MOVE_GUNK_SHOT), + LEVEL_UP_MOVE(46, MOVE_ACID_ARMOR), + LEVEL_UP_MOVE(52, MOVE_BELCH), + LEVEL_UP_MOVE(57, MOVE_MEMENTO), LEVEL_UP_END }; -static const u16 sShellderLevelUpLearnset[] = { +static const struct LevelUpMove sShellderLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 1, MOVE_WITHDRAW), - LEVEL_UP_MOVE( 9, MOVE_SUPERSONIC), - LEVEL_UP_MOVE(17, MOVE_AURORA_BEAM), - LEVEL_UP_MOVE(25, MOVE_PROTECT), - LEVEL_UP_MOVE(33, MOVE_LEER), - LEVEL_UP_MOVE(41, MOVE_CLAMP), - LEVEL_UP_MOVE(49, MOVE_ICE_BEAM), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 4, MOVE_WITHDRAW), + LEVEL_UP_MOVE( 8, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(13, MOVE_ICICLE_SPEAR), + LEVEL_UP_MOVE(16, MOVE_PROTECT), + LEVEL_UP_MOVE(20, MOVE_LEER), + LEVEL_UP_MOVE(25, MOVE_CLAMP), + LEVEL_UP_MOVE(28, MOVE_ICE_SHARD), + LEVEL_UP_MOVE(32, MOVE_RAZOR_SHELL), + LEVEL_UP_MOVE(37, MOVE_AURORA_BEAM), + LEVEL_UP_MOVE(40, MOVE_WHIRLPOOL), + LEVEL_UP_MOVE(44, MOVE_BRINE), + LEVEL_UP_MOVE(49, MOVE_IRON_DEFENSE), + LEVEL_UP_MOVE(52, MOVE_ICE_BEAM), + LEVEL_UP_MOVE(56, MOVE_SHELL_SMASH), + LEVEL_UP_MOVE(61, MOVE_HYDRO_PUMP), LEVEL_UP_END }; -static const u16 sCloysterLevelUpLearnset[] = { +static const struct LevelUpMove sCloysterLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE( 1, MOVE_SHELL_SMASH), + LEVEL_UP_MOVE( 1, MOVE_TOXIC_SPIKES), LEVEL_UP_MOVE( 1, MOVE_WITHDRAW), LEVEL_UP_MOVE( 1, MOVE_SUPERSONIC), - LEVEL_UP_MOVE( 1, MOVE_AURORA_BEAM), LEVEL_UP_MOVE( 1, MOVE_PROTECT), - LEVEL_UP_MOVE(33, MOVE_SPIKES), - LEVEL_UP_MOVE(41, MOVE_SPIKE_CANNON), + LEVEL_UP_MOVE( 1, MOVE_AURORA_BEAM), + LEVEL_UP_MOVE(13, MOVE_SPIKE_CANNON), + LEVEL_UP_MOVE(28, MOVE_SPIKES), + LEVEL_UP_MOVE(50, MOVE_ICICLE_CRASH), LEVEL_UP_END }; -static const u16 sGastlyLevelUpLearnset[] = { +static const struct LevelUpMove sGastlyLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_HYPNOSIS), LEVEL_UP_MOVE( 1, MOVE_LICK), - LEVEL_UP_MOVE( 8, MOVE_SPITE), - LEVEL_UP_MOVE(13, MOVE_MEAN_LOOK), - LEVEL_UP_MOVE(16, MOVE_CURSE), - LEVEL_UP_MOVE(21, MOVE_NIGHT_SHADE), - LEVEL_UP_MOVE(28, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE( 5, MOVE_SPITE), + LEVEL_UP_MOVE( 8, MOVE_MEAN_LOOK), + LEVEL_UP_MOVE(12, MOVE_CURSE), + LEVEL_UP_MOVE(15, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE(19, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(22, MOVE_SUCKER_PUNCH), + LEVEL_UP_MOVE(26, MOVE_PAYBACK), + LEVEL_UP_MOVE(29, MOVE_SHADOW_BALL), LEVEL_UP_MOVE(33, MOVE_DREAM_EATER), - LEVEL_UP_MOVE(36, MOVE_DESTINY_BOND), + LEVEL_UP_MOVE(36, MOVE_DARK_PULSE), + LEVEL_UP_MOVE(40, MOVE_DESTINY_BOND), + LEVEL_UP_MOVE(43, MOVE_HEX), + LEVEL_UP_MOVE(47, MOVE_NIGHTMARE), LEVEL_UP_END }; -static const u16 sHaunterLevelUpLearnset[] = { +static const struct LevelUpMove sHaunterLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_SHADOW_PUNCH), + LEVEL_UP_MOVE( 1, MOVE_SHADOW_PUNCH), LEVEL_UP_MOVE( 1, MOVE_HYPNOSIS), LEVEL_UP_MOVE( 1, MOVE_LICK), LEVEL_UP_MOVE( 1, MOVE_SPITE), - LEVEL_UP_MOVE( 8, MOVE_SPITE), - LEVEL_UP_MOVE(13, MOVE_MEAN_LOOK), - LEVEL_UP_MOVE(16, MOVE_CURSE), - LEVEL_UP_MOVE(21, MOVE_NIGHT_SHADE), - LEVEL_UP_MOVE(25, MOVE_SHADOW_PUNCH), - LEVEL_UP_MOVE(31, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE( 5, MOVE_SPITE), + LEVEL_UP_MOVE( 8, MOVE_MEAN_LOOK), + LEVEL_UP_MOVE(12, MOVE_CURSE), + LEVEL_UP_MOVE(15, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE(19, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(22, MOVE_SUCKER_PUNCH), + LEVEL_UP_MOVE(28, MOVE_PAYBACK), + LEVEL_UP_MOVE(33, MOVE_SHADOW_BALL), LEVEL_UP_MOVE(39, MOVE_DREAM_EATER), - LEVEL_UP_MOVE(48, MOVE_DESTINY_BOND), + LEVEL_UP_MOVE(44, MOVE_DARK_PULSE), + LEVEL_UP_MOVE(50, MOVE_DESTINY_BOND), + LEVEL_UP_MOVE(55, MOVE_HEX), + LEVEL_UP_MOVE(61, MOVE_NIGHTMARE), LEVEL_UP_END }; -static const u16 sGengarLevelUpLearnset[] = { +static const struct LevelUpMove sGengarLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_SHADOW_PUNCH), + LEVEL_UP_MOVE( 1, MOVE_SHADOW_PUNCH), LEVEL_UP_MOVE( 1, MOVE_HYPNOSIS), LEVEL_UP_MOVE( 1, MOVE_LICK), LEVEL_UP_MOVE( 1, MOVE_SPITE), - LEVEL_UP_MOVE( 8, MOVE_SPITE), - LEVEL_UP_MOVE(13, MOVE_MEAN_LOOK), - LEVEL_UP_MOVE(16, MOVE_CURSE), - LEVEL_UP_MOVE(21, MOVE_NIGHT_SHADE), - LEVEL_UP_MOVE(25, MOVE_SHADOW_PUNCH), - LEVEL_UP_MOVE(31, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE( 5, MOVE_SPITE), + LEVEL_UP_MOVE( 8, MOVE_MEAN_LOOK), + LEVEL_UP_MOVE(12, MOVE_CURSE), + LEVEL_UP_MOVE(15, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE(19, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(22, MOVE_SUCKER_PUNCH), + LEVEL_UP_MOVE(28, MOVE_PAYBACK), + LEVEL_UP_MOVE(33, MOVE_SHADOW_BALL), LEVEL_UP_MOVE(39, MOVE_DREAM_EATER), - LEVEL_UP_MOVE(48, MOVE_DESTINY_BOND), + LEVEL_UP_MOVE(44, MOVE_DARK_PULSE), + LEVEL_UP_MOVE(50, MOVE_DESTINY_BOND), + LEVEL_UP_MOVE(55, MOVE_HEX), + LEVEL_UP_MOVE(61, MOVE_NIGHTMARE), LEVEL_UP_END }; -static const u16 sOnixLevelUpLearnset[] = { +static const struct LevelUpMove sOnixLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_MUD_SPORT), LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 1, MOVE_SCREECH), - LEVEL_UP_MOVE( 9, MOVE_BIND), - LEVEL_UP_MOVE(13, MOVE_ROCK_THROW), - LEVEL_UP_MOVE(21, MOVE_HARDEN), - LEVEL_UP_MOVE(25, MOVE_RAGE), - LEVEL_UP_MOVE(33, MOVE_SANDSTORM), - LEVEL_UP_MOVE(37, MOVE_SLAM), - LEVEL_UP_MOVE(45, MOVE_IRON_TAIL), - LEVEL_UP_MOVE(49, MOVE_SAND_TOMB), - LEVEL_UP_MOVE(57, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 1, MOVE_BIND), + LEVEL_UP_MOVE( 4, MOVE_CURSE), + LEVEL_UP_MOVE( 7, MOVE_ROCK_THROW), + LEVEL_UP_MOVE(10, MOVE_ROCK_TOMB), + LEVEL_UP_MOVE(13, MOVE_RAGE), + LEVEL_UP_MOVE(16, MOVE_STEALTH_ROCK), + LEVEL_UP_MOVE(19, MOVE_ROCK_POLISH), + LEVEL_UP_MOVE(20, MOVE_GYRO_BALL), + LEVEL_UP_MOVE(22, MOVE_SMACK_DOWN), + LEVEL_UP_MOVE(25, MOVE_DRAGON_BREATH), + LEVEL_UP_MOVE(28, MOVE_SLAM), + LEVEL_UP_MOVE(31, MOVE_SCREECH), + LEVEL_UP_MOVE(34, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(37, MOVE_SAND_TOMB), + LEVEL_UP_MOVE(40, MOVE_IRON_TAIL), + LEVEL_UP_MOVE(43, MOVE_DIG), + LEVEL_UP_MOVE(46, MOVE_STONE_EDGE), + LEVEL_UP_MOVE(49, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(52, MOVE_SANDSTORM), LEVEL_UP_END }; -static const u16 sDrowzeeLevelUpLearnset[] = { +static const struct LevelUpMove sDrowzeeLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_POUND), LEVEL_UP_MOVE( 1, MOVE_HYPNOSIS), - LEVEL_UP_MOVE(10, MOVE_DISABLE), - LEVEL_UP_MOVE(18, MOVE_CONFUSION), - LEVEL_UP_MOVE(25, MOVE_HEADBUTT), - LEVEL_UP_MOVE(31, MOVE_POISON_GAS), - LEVEL_UP_MOVE(36, MOVE_MEDITATE), - LEVEL_UP_MOVE(40, MOVE_PSYCHIC), - LEVEL_UP_MOVE(43, MOVE_PSYCH_UP), - LEVEL_UP_MOVE(45, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE( 5, MOVE_DISABLE), + LEVEL_UP_MOVE( 9, MOVE_CONFUSION), + LEVEL_UP_MOVE(13, MOVE_HEADBUTT), + LEVEL_UP_MOVE(17, MOVE_POISON_GAS), + LEVEL_UP_MOVE(21, MOVE_MEDITATE), + LEVEL_UP_MOVE(25, MOVE_PSYBEAM), + LEVEL_UP_MOVE(29, MOVE_WAKE_UP_SLAP), + LEVEL_UP_MOVE(33, MOVE_PSYCH_UP), + LEVEL_UP_MOVE(37, MOVE_SYNCHRONOISE), + LEVEL_UP_MOVE(41, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(45, MOVE_SWAGGER), + LEVEL_UP_MOVE(49, MOVE_PSYCHIC), + LEVEL_UP_MOVE(53, MOVE_NASTY_PLOT), + LEVEL_UP_MOVE(57, MOVE_PSYSHOCK), + LEVEL_UP_MOVE(61, MOVE_FUTURE_SIGHT), LEVEL_UP_END }; -static const u16 sHypnoLevelUpLearnset[] = { +static const struct LevelUpMove sHypnoLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE( 1, MOVE_NASTY_PLOT), + LEVEL_UP_MOVE( 1, MOVE_NIGHTMARE), + LEVEL_UP_MOVE( 1, MOVE_SWITCHEROO), LEVEL_UP_MOVE( 1, MOVE_POUND), LEVEL_UP_MOVE( 1, MOVE_HYPNOSIS), LEVEL_UP_MOVE( 1, MOVE_DISABLE), LEVEL_UP_MOVE( 1, MOVE_CONFUSION), - LEVEL_UP_MOVE(10, MOVE_DISABLE), - LEVEL_UP_MOVE(18, MOVE_CONFUSION), - LEVEL_UP_MOVE(25, MOVE_HEADBUTT), - LEVEL_UP_MOVE(33, MOVE_POISON_GAS), - LEVEL_UP_MOVE(40, MOVE_MEDITATE), + LEVEL_UP_MOVE( 5, MOVE_DISABLE), + LEVEL_UP_MOVE( 9, MOVE_CONFUSION), + LEVEL_UP_MOVE(13, MOVE_HEADBUTT), + LEVEL_UP_MOVE(17, MOVE_POISON_GAS), + LEVEL_UP_MOVE(21, MOVE_MEDITATE), + LEVEL_UP_MOVE(25, MOVE_PSYBEAM), + LEVEL_UP_MOVE(29, MOVE_WAKE_UP_SLAP), + LEVEL_UP_MOVE(33, MOVE_PSYCH_UP), + LEVEL_UP_MOVE(37, MOVE_SYNCHRONOISE), + LEVEL_UP_MOVE(41, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(45, MOVE_SWAGGER), LEVEL_UP_MOVE(49, MOVE_PSYCHIC), - LEVEL_UP_MOVE(55, MOVE_PSYCH_UP), - LEVEL_UP_MOVE(60, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(53, MOVE_NASTY_PLOT), + LEVEL_UP_MOVE(57, MOVE_PSYSHOCK), + LEVEL_UP_MOVE(61, MOVE_FUTURE_SIGHT), LEVEL_UP_END }; -static const u16 sKrabbyLevelUpLearnset[] = { +static const struct LevelUpMove sKrabbyLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_MUD_SPORT), LEVEL_UP_MOVE( 1, MOVE_BUBBLE), - LEVEL_UP_MOVE( 5, MOVE_LEER), - LEVEL_UP_MOVE(12, MOVE_VICE_GRIP), - LEVEL_UP_MOVE(16, MOVE_HARDEN), - LEVEL_UP_MOVE(23, MOVE_MUD_SHOT), - LEVEL_UP_MOVE(27, MOVE_STOMP), - LEVEL_UP_MOVE(34, MOVE_GUILLOTINE), - LEVEL_UP_MOVE(41, MOVE_PROTECT), - LEVEL_UP_MOVE(45, MOVE_CRABHAMMER), + LEVEL_UP_MOVE( 5, MOVE_VICE_GRIP), + LEVEL_UP_MOVE( 9, MOVE_LEER), + LEVEL_UP_MOVE(11, MOVE_HARDEN), + LEVEL_UP_MOVE(15, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(19, MOVE_MUD_SHOT), + LEVEL_UP_MOVE(21, MOVE_METAL_CLAW), + LEVEL_UP_MOVE(25, MOVE_STOMP), + LEVEL_UP_MOVE(29, MOVE_PROTECT), + LEVEL_UP_MOVE(31, MOVE_GUILLOTINE), + LEVEL_UP_MOVE(35, MOVE_SLAM), + LEVEL_UP_MOVE(39, MOVE_BRINE), + LEVEL_UP_MOVE(41, MOVE_CRABHAMMER), + LEVEL_UP_MOVE(45, MOVE_FLAIL), LEVEL_UP_END }; -static const u16 sKinglerLevelUpLearnset[] = { +static const struct LevelUpMove sKinglerLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WIDE_GUARD), + LEVEL_UP_MOVE( 1, MOVE_MUD_SPORT), LEVEL_UP_MOVE( 1, MOVE_BUBBLE), - LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_VICE_GRIP), - LEVEL_UP_MOVE( 5, MOVE_LEER), - LEVEL_UP_MOVE(12, MOVE_VICE_GRIP), - LEVEL_UP_MOVE(16, MOVE_HARDEN), - LEVEL_UP_MOVE(23, MOVE_MUD_SHOT), - LEVEL_UP_MOVE(27, MOVE_STOMP), - LEVEL_UP_MOVE(38, MOVE_GUILLOTINE), - LEVEL_UP_MOVE(49, MOVE_PROTECT), - LEVEL_UP_MOVE(57, MOVE_CRABHAMMER), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 5, MOVE_VICE_GRIP), + LEVEL_UP_MOVE( 9, MOVE_LEER), + LEVEL_UP_MOVE(11, MOVE_HARDEN), + LEVEL_UP_MOVE(15, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(19, MOVE_MUD_SHOT), + LEVEL_UP_MOVE(21, MOVE_METAL_CLAW), + LEVEL_UP_MOVE(25, MOVE_STOMP), + LEVEL_UP_MOVE(32, MOVE_PROTECT), + LEVEL_UP_MOVE(37, MOVE_GUILLOTINE), + LEVEL_UP_MOVE(44, MOVE_SLAM), + LEVEL_UP_MOVE(51, MOVE_BRINE), + LEVEL_UP_MOVE(56, MOVE_CRABHAMMER), + LEVEL_UP_MOVE(63, MOVE_FLAIL), LEVEL_UP_END }; -static const u16 sVoltorbLevelUpLearnset[] = { +static const struct LevelUpMove sVoltorbLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_CHARGE), LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 8, MOVE_SCREECH), - LEVEL_UP_MOVE(15, MOVE_SONIC_BOOM), - LEVEL_UP_MOVE(21, MOVE_SPARK), - LEVEL_UP_MOVE(27, MOVE_SELF_DESTRUCT), - LEVEL_UP_MOVE(32, MOVE_ROLLOUT), - LEVEL_UP_MOVE(37, MOVE_LIGHT_SCREEN), - LEVEL_UP_MOVE(42, MOVE_SWIFT), - LEVEL_UP_MOVE(46, MOVE_EXPLOSION), - LEVEL_UP_MOVE(49, MOVE_MIRROR_COAT), + LEVEL_UP_MOVE( 4, MOVE_SONIC_BOOM), + LEVEL_UP_MOVE( 6, MOVE_EERIE_IMPULSE), + LEVEL_UP_MOVE( 9, MOVE_SPARK), + LEVEL_UP_MOVE(11, MOVE_ROLLOUT), + LEVEL_UP_MOVE(13, MOVE_SCREECH), + LEVEL_UP_MOVE(16, MOVE_CHARGE_BEAM), + LEVEL_UP_MOVE(20, MOVE_SWIFT), + LEVEL_UP_MOVE(22, MOVE_ELECTRO_BALL), + LEVEL_UP_MOVE(26, MOVE_SELF_DESTRUCT), + LEVEL_UP_MOVE(29, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(34, MOVE_MAGNET_RISE), + LEVEL_UP_MOVE(37, MOVE_DISCHARGE), + LEVEL_UP_MOVE(41, MOVE_EXPLOSION), + LEVEL_UP_MOVE(46, MOVE_GYRO_BALL), + LEVEL_UP_MOVE(48, MOVE_MIRROR_COAT), LEVEL_UP_END }; -static const u16 sElectrodeLevelUpLearnset[] = { +static const struct LevelUpMove sElectrodeLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_MAGNETIC_FLUX), LEVEL_UP_MOVE( 1, MOVE_CHARGE), LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 1, MOVE_SCREECH), LEVEL_UP_MOVE( 1, MOVE_SONIC_BOOM), - LEVEL_UP_MOVE( 8, MOVE_SCREECH), - LEVEL_UP_MOVE(15, MOVE_SONIC_BOOM), - LEVEL_UP_MOVE(21, MOVE_SPARK), - LEVEL_UP_MOVE(27, MOVE_SELF_DESTRUCT), - LEVEL_UP_MOVE(34, MOVE_ROLLOUT), - LEVEL_UP_MOVE(41, MOVE_LIGHT_SCREEN), - LEVEL_UP_MOVE(48, MOVE_SWIFT), - LEVEL_UP_MOVE(54, MOVE_EXPLOSION), - LEVEL_UP_MOVE(59, MOVE_MIRROR_COAT), + LEVEL_UP_MOVE( 1, MOVE_EERIE_IMPULSE), + LEVEL_UP_MOVE( 4, MOVE_SONIC_BOOM), + LEVEL_UP_MOVE( 6, MOVE_EERIE_IMPULSE), + LEVEL_UP_MOVE( 9, MOVE_SPARK), + LEVEL_UP_MOVE(11, MOVE_ROLLOUT), + LEVEL_UP_MOVE(13, MOVE_SCREECH), + LEVEL_UP_MOVE(16, MOVE_CHARGE_BEAM), + LEVEL_UP_MOVE(20, MOVE_SWIFT), + LEVEL_UP_MOVE(22, MOVE_ELECTRO_BALL), + LEVEL_UP_MOVE(26, MOVE_SELF_DESTRUCT), + LEVEL_UP_MOVE(29, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(36, MOVE_MAGNET_RISE), + LEVEL_UP_MOVE(41, MOVE_DISCHARGE), + LEVEL_UP_MOVE(47, MOVE_EXPLOSION), + LEVEL_UP_MOVE(54, MOVE_GYRO_BALL), + LEVEL_UP_MOVE(58, MOVE_MIRROR_COAT), LEVEL_UP_END }; -static const u16 sExeggcuteLevelUpLearnset[] = { +static const struct LevelUpMove sExeggcuteLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_BARRAGE), LEVEL_UP_MOVE( 1, MOVE_UPROAR), LEVEL_UP_MOVE( 1, MOVE_HYPNOSIS), LEVEL_UP_MOVE( 7, MOVE_REFLECT), - LEVEL_UP_MOVE(13, MOVE_LEECH_SEED), - LEVEL_UP_MOVE(19, MOVE_CONFUSION), - LEVEL_UP_MOVE(25, MOVE_STUN_SPORE), - LEVEL_UP_MOVE(31, MOVE_POISON_POWDER), - LEVEL_UP_MOVE(37, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(11, MOVE_LEECH_SEED), + LEVEL_UP_MOVE(17, MOVE_BULLET_SEED), + LEVEL_UP_MOVE(19, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(21, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(23, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(27, MOVE_CONFUSION), + LEVEL_UP_MOVE(33, MOVE_WORRY_SEED), + LEVEL_UP_MOVE(37, MOVE_NATURAL_GIFT), LEVEL_UP_MOVE(43, MOVE_SOLAR_BEAM), + LEVEL_UP_MOVE(47, MOVE_EXTRASENSORY), + LEVEL_UP_MOVE(50, MOVE_BESTOW), LEVEL_UP_END }; -static const u16 sExeggutorLevelUpLearnset[] = { +static const struct LevelUpMove sExeggutorLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_STOMP), + LEVEL_UP_MOVE( 1, MOVE_STOMP), + LEVEL_UP_MOVE( 1, MOVE_SEED_BOMB), LEVEL_UP_MOVE( 1, MOVE_BARRAGE), LEVEL_UP_MOVE( 1, MOVE_HYPNOSIS), LEVEL_UP_MOVE( 1, MOVE_CONFUSION), - LEVEL_UP_MOVE(19, MOVE_STOMP), - LEVEL_UP_MOVE(31, MOVE_EGG_BOMB), + LEVEL_UP_MOVE(17, MOVE_PSYSHOCK), + LEVEL_UP_MOVE(27, MOVE_EGG_BOMB), + LEVEL_UP_MOVE(37, MOVE_WOOD_HAMMER), + LEVEL_UP_MOVE(47, MOVE_LEAF_STORM), LEVEL_UP_END }; -static const u16 sCuboneLevelUpLearnset[] = { +static const struct LevelUpMove sCuboneLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 5, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 9, MOVE_BONE_CLUB), - LEVEL_UP_MOVE(13, MOVE_HEADBUTT), - LEVEL_UP_MOVE(17, MOVE_LEER), - LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE(25, MOVE_BONEMERANG), - LEVEL_UP_MOVE(29, MOVE_RAGE), - LEVEL_UP_MOVE(33, MOVE_FALSE_SWIPE), - LEVEL_UP_MOVE(37, MOVE_THRASH), - LEVEL_UP_MOVE(41, MOVE_BONE_RUSH), - LEVEL_UP_MOVE(45, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE( 3, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 7, MOVE_BONE_CLUB), + LEVEL_UP_MOVE(11, MOVE_HEADBUTT), + LEVEL_UP_MOVE(13, MOVE_LEER), + LEVEL_UP_MOVE(17, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(21, MOVE_BONEMERANG), + LEVEL_UP_MOVE(23, MOVE_RAGE), + LEVEL_UP_MOVE(27, MOVE_FALSE_SWIPE), + LEVEL_UP_MOVE(31, MOVE_THRASH), + LEVEL_UP_MOVE(33, MOVE_FLING), + LEVEL_UP_MOVE(37, MOVE_STOMPING_TANTRUM), + LEVEL_UP_MOVE(41, MOVE_ENDEAVOR), + LEVEL_UP_MOVE(43, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(47, MOVE_RETALIATE), + LEVEL_UP_MOVE(51, MOVE_BONE_RUSH), LEVEL_UP_END }; -static const u16 sMarowakLevelUpLearnset[] = { +static const struct LevelUpMove sMarowakLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_GROWL), LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE( 1, MOVE_BONE_CLUB), LEVEL_UP_MOVE( 1, MOVE_HEADBUTT), - LEVEL_UP_MOVE( 5, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 9, MOVE_BONE_CLUB), - LEVEL_UP_MOVE(13, MOVE_HEADBUTT), - LEVEL_UP_MOVE(17, MOVE_LEER), - LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE(25, MOVE_BONEMERANG), - LEVEL_UP_MOVE(32, MOVE_RAGE), - LEVEL_UP_MOVE(39, MOVE_FALSE_SWIPE), - LEVEL_UP_MOVE(46, MOVE_THRASH), - LEVEL_UP_MOVE(53, MOVE_BONE_RUSH), - LEVEL_UP_MOVE(61, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE( 3, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 7, MOVE_BONE_CLUB), + LEVEL_UP_MOVE(11, MOVE_HEADBUTT), + LEVEL_UP_MOVE(13, MOVE_LEER), + LEVEL_UP_MOVE(17, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(21, MOVE_BONEMERANG), + LEVEL_UP_MOVE(23, MOVE_RAGE), + LEVEL_UP_MOVE(27, MOVE_FALSE_SWIPE), + LEVEL_UP_MOVE(33, MOVE_THRASH), + LEVEL_UP_MOVE(37, MOVE_FLING), + LEVEL_UP_MOVE(43, MOVE_STOMPING_TANTRUM), + LEVEL_UP_MOVE(49, MOVE_ENDEAVOR), + LEVEL_UP_MOVE(53, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(59, MOVE_RETALIATE), + LEVEL_UP_MOVE(65, MOVE_BONE_RUSH), LEVEL_UP_END }; -static const u16 sHitmonleeLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_REVENGE), +static const struct LevelUpMove sHitmonleeLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_DOUBLE_KICK), LEVEL_UP_MOVE( 1, MOVE_DOUBLE_KICK), - LEVEL_UP_MOVE( 6, MOVE_MEDITATE), - LEVEL_UP_MOVE(11, MOVE_ROLLING_KICK), - LEVEL_UP_MOVE(16, MOVE_JUMP_KICK), - LEVEL_UP_MOVE(20, MOVE_BRICK_BREAK), - LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE(26, MOVE_HI_JUMP_KICK), - LEVEL_UP_MOVE(31, MOVE_MIND_READER), - LEVEL_UP_MOVE(36, MOVE_FORESIGHT), - LEVEL_UP_MOVE(41, MOVE_ENDURE), - LEVEL_UP_MOVE(46, MOVE_MEGA_KICK), - LEVEL_UP_MOVE(51, MOVE_REVERSAL), - LEVEL_UP_END -}; - -static const u16 sHitmonchanLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_REVERSAL), + LEVEL_UP_MOVE( 1, MOVE_CLOSE_COMBAT), + LEVEL_UP_MOVE( 1, MOVE_MEGA_KICK), LEVEL_UP_MOVE( 1, MOVE_REVENGE), + LEVEL_UP_MOVE( 1, MOVE_MEDITATE), + LEVEL_UP_MOVE( 1, MOVE_ROLLING_KICK), + LEVEL_UP_MOVE( 1, MOVE_JUMP_KICK), + LEVEL_UP_MOVE( 5, MOVE_MEDITATE), + LEVEL_UP_MOVE( 9, MOVE_ROLLING_KICK), + LEVEL_UP_MOVE(13, MOVE_JUMP_KICK), + LEVEL_UP_MOVE(17, MOVE_BRICK_BREAK), + LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(25, MOVE_FEINT), + LEVEL_UP_MOVE(29, MOVE_HI_JUMP_KICK), + LEVEL_UP_MOVE(33, MOVE_MIND_READER), + LEVEL_UP_MOVE(37, MOVE_FORESIGHT), + LEVEL_UP_MOVE(41, MOVE_WIDE_GUARD), + LEVEL_UP_MOVE(45, MOVE_BLAZE_KICK), + LEVEL_UP_MOVE(49, MOVE_ENDURE), + LEVEL_UP_MOVE(53, MOVE_MEGA_KICK), + LEVEL_UP_MOVE(57, MOVE_CLOSE_COMBAT), + LEVEL_UP_MOVE(61, MOVE_REVERSAL), + LEVEL_UP_END +}; + +static const struct LevelUpMove sHitmonchanLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_COMET_PUNCH), LEVEL_UP_MOVE( 1, MOVE_COMET_PUNCH), - LEVEL_UP_MOVE( 7, MOVE_AGILITY), - LEVEL_UP_MOVE(13, MOVE_PURSUIT), - LEVEL_UP_MOVE(20, MOVE_MACH_PUNCH), - LEVEL_UP_MOVE(26, MOVE_THUNDER_PUNCH), - LEVEL_UP_MOVE(26, MOVE_ICE_PUNCH), - LEVEL_UP_MOVE(26, MOVE_FIRE_PUNCH), - LEVEL_UP_MOVE(32, MOVE_SKY_UPPERCUT), - LEVEL_UP_MOVE(38, MOVE_MEGA_PUNCH), - LEVEL_UP_MOVE(44, MOVE_DETECT), - LEVEL_UP_MOVE(50, MOVE_COUNTER), + LEVEL_UP_MOVE( 1, MOVE_CLOSE_COMBAT), + LEVEL_UP_MOVE( 1, MOVE_COUNTER), + LEVEL_UP_MOVE( 1, MOVE_FOCUS_PUNCH), + LEVEL_UP_MOVE( 1, MOVE_REVENGE), + LEVEL_UP_MOVE( 1, MOVE_AGILITY), + LEVEL_UP_MOVE( 1, MOVE_PURSUIT), + LEVEL_UP_MOVE( 1, MOVE_MACH_PUNCH), + LEVEL_UP_MOVE( 6, MOVE_AGILITY), + LEVEL_UP_MOVE(11, MOVE_PURSUIT), + LEVEL_UP_MOVE(16, MOVE_MACH_PUNCH), + LEVEL_UP_MOVE(16, MOVE_BULLET_PUNCH), + LEVEL_UP_MOVE(21, MOVE_FEINT), + LEVEL_UP_MOVE(26, MOVE_VACUUM_WAVE), + LEVEL_UP_MOVE(31, MOVE_QUICK_GUARD), + LEVEL_UP_MOVE(36, MOVE_THUNDER_PUNCH), + LEVEL_UP_MOVE(36, MOVE_ICE_PUNCH), + LEVEL_UP_MOVE(36, MOVE_FIRE_PUNCH), + LEVEL_UP_MOVE(41, MOVE_SKY_UPPERCUT), + LEVEL_UP_MOVE(46, MOVE_MEGA_PUNCH), + LEVEL_UP_MOVE(50, MOVE_DETECT), + LEVEL_UP_MOVE(56, MOVE_FOCUS_PUNCH), + LEVEL_UP_MOVE(61, MOVE_COUNTER), + LEVEL_UP_MOVE(66, MOVE_CLOSE_COMBAT), LEVEL_UP_END }; -static const u16 sLickitungLevelUpLearnset[] = { +static const struct LevelUpMove sLickitungLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_LICK), - LEVEL_UP_MOVE( 7, MOVE_SUPERSONIC), - LEVEL_UP_MOVE(12, MOVE_DEFENSE_CURL), - LEVEL_UP_MOVE(18, MOVE_KNOCK_OFF), - LEVEL_UP_MOVE(23, MOVE_STOMP), - LEVEL_UP_MOVE(29, MOVE_WRAP), - LEVEL_UP_MOVE(34, MOVE_DISABLE), - LEVEL_UP_MOVE(40, MOVE_SLAM), - LEVEL_UP_MOVE(45, MOVE_SCREECH), - LEVEL_UP_MOVE(51, MOVE_REFRESH), + LEVEL_UP_MOVE( 5, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 9, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE(13, MOVE_KNOCK_OFF), + LEVEL_UP_MOVE(17, MOVE_WRAP), + LEVEL_UP_MOVE(21, MOVE_STOMP), + LEVEL_UP_MOVE(25, MOVE_DISABLE), + LEVEL_UP_MOVE(29, MOVE_SLAM), + LEVEL_UP_MOVE(33, MOVE_ROLLOUT), + LEVEL_UP_MOVE(37, MOVE_CHIP_AWAY), + LEVEL_UP_MOVE(41, MOVE_ME_FIRST), + LEVEL_UP_MOVE(45, MOVE_REFRESH), + LEVEL_UP_MOVE(49, MOVE_SCREECH), + LEVEL_UP_MOVE(53, MOVE_POWER_WHIP), + LEVEL_UP_MOVE(57, MOVE_WRING_OUT), LEVEL_UP_END }; -static const u16 sKoffingLevelUpLearnset[] = { +static const struct LevelUpMove sKoffingLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_POISON_GAS), LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 9, MOVE_SMOG), - LEVEL_UP_MOVE(17, MOVE_SELF_DESTRUCT), - LEVEL_UP_MOVE(21, MOVE_SLUDGE), - LEVEL_UP_MOVE(25, MOVE_SMOKESCREEN), - LEVEL_UP_MOVE(33, MOVE_HAZE), - LEVEL_UP_MOVE(41, MOVE_EXPLOSION), - LEVEL_UP_MOVE(45, MOVE_DESTINY_BOND), - LEVEL_UP_MOVE(49, MOVE_MEMENTO), + LEVEL_UP_MOVE( 4, MOVE_SMOG), + LEVEL_UP_MOVE( 7, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE(12, MOVE_ASSURANCE), + LEVEL_UP_MOVE(15, MOVE_CLEAR_SMOG), + LEVEL_UP_MOVE(18, MOVE_SLUDGE), + LEVEL_UP_MOVE(23, MOVE_SELF_DESTRUCT), + LEVEL_UP_MOVE(26, MOVE_HAZE), + LEVEL_UP_MOVE(29, MOVE_GYRO_BALL), + LEVEL_UP_MOVE(34, MOVE_SLUDGE_BOMB), + LEVEL_UP_MOVE(37, MOVE_EXPLOSION), + LEVEL_UP_MOVE(40, MOVE_DESTINY_BOND), + LEVEL_UP_MOVE(42, MOVE_BELCH), + LEVEL_UP_MOVE(45, MOVE_MEMENTO), LEVEL_UP_END }; -static const u16 sWeezingLevelUpLearnset[] = { +static const struct LevelUpMove sWeezingLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_DOUBLE_HIT), + LEVEL_UP_MOVE( 1, MOVE_DOUBLE_HIT), LEVEL_UP_MOVE( 1, MOVE_POISON_GAS), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_SMOG), - LEVEL_UP_MOVE( 1, MOVE_SELF_DESTRUCT), - LEVEL_UP_MOVE( 9, MOVE_SMOG), - LEVEL_UP_MOVE(17, MOVE_SELF_DESTRUCT), - LEVEL_UP_MOVE(21, MOVE_SLUDGE), - LEVEL_UP_MOVE(25, MOVE_SMOKESCREEN), - LEVEL_UP_MOVE(33, MOVE_HAZE), - LEVEL_UP_MOVE(44, MOVE_EXPLOSION), - LEVEL_UP_MOVE(51, MOVE_DESTINY_BOND), - LEVEL_UP_MOVE(58, MOVE_MEMENTO), + LEVEL_UP_MOVE( 1, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE( 4, MOVE_SMOG), + LEVEL_UP_MOVE( 7, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE(12, MOVE_ASSURANCE), + LEVEL_UP_MOVE(15, MOVE_CLEAR_SMOG), + LEVEL_UP_MOVE(18, MOVE_SLUDGE), + LEVEL_UP_MOVE(23, MOVE_SELF_DESTRUCT), + LEVEL_UP_MOVE(26, MOVE_HAZE), + LEVEL_UP_MOVE(29, MOVE_GYRO_BALL), + LEVEL_UP_MOVE(34, MOVE_SLUDGE_BOMB), + LEVEL_UP_MOVE(40, MOVE_EXPLOSION), + LEVEL_UP_MOVE(46, MOVE_DESTINY_BOND), + LEVEL_UP_MOVE(51, MOVE_BELCH), + LEVEL_UP_MOVE(57, MOVE_MEMENTO), LEVEL_UP_END }; -static const u16 sRhyhornLevelUpLearnset[] = { +static const struct LevelUpMove sRhyhornLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_HORN_ATTACK), LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE(10, MOVE_STOMP), - LEVEL_UP_MOVE(15, MOVE_FURY_ATTACK), - LEVEL_UP_MOVE(24, MOVE_SCARY_FACE), + LEVEL_UP_MOVE( 5, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE( 9, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(13, MOVE_SMACK_DOWN), + LEVEL_UP_MOVE(17, MOVE_STOMP), + LEVEL_UP_MOVE(21, MOVE_BULLDOZE), + LEVEL_UP_MOVE(25, MOVE_CHIP_AWAY), LEVEL_UP_MOVE(29, MOVE_ROCK_BLAST), - LEVEL_UP_MOVE(38, MOVE_HORN_DRILL), - LEVEL_UP_MOVE(43, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(52, MOVE_EARTHQUAKE), - LEVEL_UP_MOVE(57, MOVE_MEGAHORN), + LEVEL_UP_MOVE(33, MOVE_DRILL_RUN), + LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(41, MOVE_STONE_EDGE), + LEVEL_UP_MOVE(45, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(49, MOVE_MEGAHORN), + LEVEL_UP_MOVE(53, MOVE_HORN_DRILL), LEVEL_UP_END }; -static const u16 sRhydonLevelUpLearnset[] = { +static const struct LevelUpMove sRhydonLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_HAMMER_ARM), + LEVEL_UP_MOVE( 1, MOVE_HAMMER_ARM), + LEVEL_UP_MOVE( 1, MOVE_HORN_DRILL), LEVEL_UP_MOVE( 1, MOVE_HORN_ATTACK), LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 1, MOVE_STOMP), LEVEL_UP_MOVE( 1, MOVE_FURY_ATTACK), - LEVEL_UP_MOVE(10, MOVE_STOMP), - LEVEL_UP_MOVE(15, MOVE_FURY_ATTACK), - LEVEL_UP_MOVE(24, MOVE_SCARY_FACE), + LEVEL_UP_MOVE( 1, MOVE_SCARY_FACE), + LEVEL_UP_MOVE( 5, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE( 9, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(13, MOVE_SMACK_DOWN), + LEVEL_UP_MOVE(17, MOVE_STOMP), + LEVEL_UP_MOVE(21, MOVE_BULLDOZE), + LEVEL_UP_MOVE(25, MOVE_CHIP_AWAY), LEVEL_UP_MOVE(29, MOVE_ROCK_BLAST), - LEVEL_UP_MOVE(38, MOVE_HORN_DRILL), - LEVEL_UP_MOVE(46, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(58, MOVE_EARTHQUAKE), - LEVEL_UP_MOVE(66, MOVE_MEGAHORN), + LEVEL_UP_MOVE(33, MOVE_DRILL_RUN), + LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(41, MOVE_STONE_EDGE), + LEVEL_UP_MOVE(48, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(55, MOVE_MEGAHORN), + LEVEL_UP_MOVE(62, MOVE_HORN_DRILL), LEVEL_UP_END }; -static const u16 sChanseyLevelUpLearnset[] = { +static const struct LevelUpMove sChanseyLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE( 1, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE( 1, MOVE_POUND), LEVEL_UP_MOVE( 1, MOVE_GROWL), LEVEL_UP_MOVE( 5, MOVE_TAIL_WHIP), LEVEL_UP_MOVE( 9, MOVE_REFRESH), - LEVEL_UP_MOVE(13, MOVE_SOFT_BOILED), - LEVEL_UP_MOVE(17, MOVE_DOUBLE_SLAP), + LEVEL_UP_MOVE(12, MOVE_DOUBLE_SLAP), + LEVEL_UP_MOVE(16, MOVE_SOFT_BOILED), + LEVEL_UP_MOVE(20, MOVE_BESTOW), LEVEL_UP_MOVE(23, MOVE_MINIMIZE), - LEVEL_UP_MOVE(29, MOVE_SING), - LEVEL_UP_MOVE(35, MOVE_EGG_BOMB), - LEVEL_UP_MOVE(41, MOVE_DEFENSE_CURL), - LEVEL_UP_MOVE(49, MOVE_LIGHT_SCREEN), - LEVEL_UP_MOVE(57, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(27, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(31, MOVE_SING), + LEVEL_UP_MOVE(35, MOVE_FLING), + LEVEL_UP_MOVE(39, MOVE_HEAL_PULSE), + LEVEL_UP_MOVE(44, MOVE_EGG_BOMB), + LEVEL_UP_MOVE(50, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(57, MOVE_HEALING_WISH), + LEVEL_UP_MOVE(65, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; -static const u16 sTangelaLevelUpLearnset[] = { +static const struct LevelUpMove sTangelaLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_INGRAIN), LEVEL_UP_MOVE( 1, MOVE_CONSTRICT), LEVEL_UP_MOVE( 4, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE( 7, MOVE_VINE_WHIP), LEVEL_UP_MOVE(10, MOVE_ABSORB), - LEVEL_UP_MOVE(13, MOVE_GROWTH), - LEVEL_UP_MOVE(19, MOVE_POISON_POWDER), - LEVEL_UP_MOVE(22, MOVE_VINE_WHIP), - LEVEL_UP_MOVE(28, MOVE_BIND), - LEVEL_UP_MOVE(31, MOVE_MEGA_DRAIN), - LEVEL_UP_MOVE(37, MOVE_STUN_SPORE), - LEVEL_UP_MOVE(40, MOVE_SLAM), - LEVEL_UP_MOVE(46, MOVE_TICKLE), + LEVEL_UP_MOVE(14, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(17, MOVE_BIND), + LEVEL_UP_MOVE(20, MOVE_GROWTH), + LEVEL_UP_MOVE(23, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(27, MOVE_KNOCK_OFF), + LEVEL_UP_MOVE(30, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(33, MOVE_NATURAL_GIFT), + LEVEL_UP_MOVE(36, MOVE_GIGA_DRAIN), + LEVEL_UP_MOVE(38, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(41, MOVE_SLAM), + LEVEL_UP_MOVE(44, MOVE_TICKLE), + LEVEL_UP_MOVE(46, MOVE_WRING_OUT), + LEVEL_UP_MOVE(48, MOVE_GRASSY_TERRAIN), + LEVEL_UP_MOVE(50, MOVE_POWER_WHIP), LEVEL_UP_END }; -static const u16 sKangaskhanLevelUpLearnset[] = { +static const struct LevelUpMove sKangaskhanLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_COMET_PUNCH), LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 7, MOVE_BITE), - LEVEL_UP_MOVE(13, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE(19, MOVE_FAKE_OUT), + LEVEL_UP_MOVE( 7, MOVE_FAKE_OUT), + LEVEL_UP_MOVE(10, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE(13, MOVE_BITE), + LEVEL_UP_MOVE(19, MOVE_DOUBLE_HIT), + LEVEL_UP_MOVE(22, MOVE_RAGE), LEVEL_UP_MOVE(25, MOVE_MEGA_PUNCH), - LEVEL_UP_MOVE(31, MOVE_RAGE), - LEVEL_UP_MOVE(37, MOVE_ENDURE), - LEVEL_UP_MOVE(43, MOVE_DIZZY_PUNCH), - LEVEL_UP_MOVE(49, MOVE_REVERSAL), + LEVEL_UP_MOVE(31, MOVE_CHIP_AWAY), + LEVEL_UP_MOVE(34, MOVE_DIZZY_PUNCH), + LEVEL_UP_MOVE(37, MOVE_CRUNCH), + LEVEL_UP_MOVE(43, MOVE_ENDURE), + LEVEL_UP_MOVE(46, MOVE_OUTRAGE), + LEVEL_UP_MOVE(49, MOVE_SUCKER_PUNCH), + LEVEL_UP_MOVE(50, MOVE_REVERSAL), LEVEL_UP_END }; -static const u16 sHorseaLevelUpLearnset[] = { +static const struct LevelUpMove sHorseaLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_BUBBLE), - LEVEL_UP_MOVE( 8, MOVE_SMOKESCREEN), - LEVEL_UP_MOVE(15, MOVE_LEER), - LEVEL_UP_MOVE(22, MOVE_WATER_GUN), - LEVEL_UP_MOVE(29, MOVE_TWISTER), + LEVEL_UP_MOVE( 5, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE( 9, MOVE_LEER), + LEVEL_UP_MOVE(13, MOVE_WATER_GUN), + LEVEL_UP_MOVE(17, MOVE_TWISTER), + LEVEL_UP_MOVE(21, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(26, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(31, MOVE_BRINE), LEVEL_UP_MOVE(36, MOVE_AGILITY), - LEVEL_UP_MOVE(43, MOVE_HYDRO_PUMP), - LEVEL_UP_MOVE(50, MOVE_DRAGON_DANCE), + LEVEL_UP_MOVE(41, MOVE_DRAGON_PULSE), + LEVEL_UP_MOVE(46, MOVE_DRAGON_DANCE), + LEVEL_UP_MOVE(52, MOVE_HYDRO_PUMP), LEVEL_UP_END }; -static const u16 sSeadraLevelUpLearnset[] = { +static const struct LevelUpMove sSeadraLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_HYDRO_PUMP), LEVEL_UP_MOVE( 1, MOVE_BUBBLE), LEVEL_UP_MOVE( 1, MOVE_SMOKESCREEN), LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), - LEVEL_UP_MOVE( 8, MOVE_SMOKESCREEN), - LEVEL_UP_MOVE(15, MOVE_LEER), - LEVEL_UP_MOVE(22, MOVE_WATER_GUN), - LEVEL_UP_MOVE(29, MOVE_TWISTER), - LEVEL_UP_MOVE(40, MOVE_AGILITY), - LEVEL_UP_MOVE(51, MOVE_HYDRO_PUMP), - LEVEL_UP_MOVE(62, MOVE_DRAGON_DANCE), + LEVEL_UP_MOVE( 5, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE( 9, MOVE_LEER), + LEVEL_UP_MOVE(13, MOVE_WATER_GUN), + LEVEL_UP_MOVE(17, MOVE_TWISTER), + LEVEL_UP_MOVE(21, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(26, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(31, MOVE_BRINE), + LEVEL_UP_MOVE(38, MOVE_AGILITY), + LEVEL_UP_MOVE(45, MOVE_DRAGON_PULSE), + LEVEL_UP_MOVE(52, MOVE_DRAGON_DANCE), + LEVEL_UP_MOVE(60, MOVE_HYDRO_PUMP), LEVEL_UP_END }; -static const u16 sGoldeenLevelUpLearnset[] = { +static const struct LevelUpMove sGoldeenLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_PECK), LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE( 1, MOVE_WATER_SPORT), - LEVEL_UP_MOVE(10, MOVE_SUPERSONIC), - LEVEL_UP_MOVE(15, MOVE_HORN_ATTACK), - LEVEL_UP_MOVE(24, MOVE_FLAIL), - LEVEL_UP_MOVE(29, MOVE_FURY_ATTACK), - LEVEL_UP_MOVE(38, MOVE_WATERFALL), - LEVEL_UP_MOVE(43, MOVE_HORN_DRILL), - LEVEL_UP_MOVE(52, MOVE_AGILITY), + LEVEL_UP_MOVE( 5, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 8, MOVE_HORN_ATTACK), + LEVEL_UP_MOVE(13, MOVE_FLAIL), + LEVEL_UP_MOVE(16, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(21, MOVE_AQUA_RING), + LEVEL_UP_MOVE(24, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(29, MOVE_AGILITY), + LEVEL_UP_MOVE(32, MOVE_WATERFALL), + LEVEL_UP_MOVE(37, MOVE_HORN_DRILL), + LEVEL_UP_MOVE(40, MOVE_SOAK), + LEVEL_UP_MOVE(45, MOVE_MEGAHORN), LEVEL_UP_END }; -static const u16 sSeakingLevelUpLearnset[] = { +static const struct LevelUpMove sSeakingLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_MEGAHORN), + LEVEL_UP_MOVE( 1, MOVE_POISON_JAB), LEVEL_UP_MOVE( 1, MOVE_PECK), LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE( 1, MOVE_WATER_SPORT), LEVEL_UP_MOVE( 1, MOVE_SUPERSONIC), - LEVEL_UP_MOVE(10, MOVE_SUPERSONIC), - LEVEL_UP_MOVE(15, MOVE_HORN_ATTACK), - LEVEL_UP_MOVE(24, MOVE_FLAIL), - LEVEL_UP_MOVE(29, MOVE_FURY_ATTACK), - LEVEL_UP_MOVE(41, MOVE_WATERFALL), - LEVEL_UP_MOVE(49, MOVE_HORN_DRILL), - LEVEL_UP_MOVE(61, MOVE_AGILITY), + LEVEL_UP_MOVE( 5, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 8, MOVE_HORN_ATTACK), + LEVEL_UP_MOVE(13, MOVE_FLAIL), + LEVEL_UP_MOVE(16, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(21, MOVE_AQUA_RING), + LEVEL_UP_MOVE(24, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(29, MOVE_AGILITY), + LEVEL_UP_MOVE(32, MOVE_WATERFALL), + LEVEL_UP_MOVE(40, MOVE_HORN_DRILL), + LEVEL_UP_MOVE(46, MOVE_SOAK), + LEVEL_UP_MOVE(54, MOVE_MEGAHORN), LEVEL_UP_END }; -static const u16 sStaryuLevelUpLearnset[] = { +static const struct LevelUpMove sStaryuLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_HARDEN), - LEVEL_UP_MOVE( 6, MOVE_WATER_GUN), - LEVEL_UP_MOVE(10, MOVE_RAPID_SPIN), - LEVEL_UP_MOVE(15, MOVE_RECOVER), - LEVEL_UP_MOVE(19, MOVE_CAMOUFLAGE), - LEVEL_UP_MOVE(24, MOVE_SWIFT), - LEVEL_UP_MOVE(28, MOVE_BUBBLE_BEAM), - LEVEL_UP_MOVE(33, MOVE_MINIMIZE), - LEVEL_UP_MOVE(37, MOVE_LIGHT_SCREEN), - LEVEL_UP_MOVE(42, MOVE_COSMIC_POWER), - LEVEL_UP_MOVE(46, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE( 4, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 7, MOVE_RAPID_SPIN), + LEVEL_UP_MOVE(10, MOVE_RECOVER), + LEVEL_UP_MOVE(13, MOVE_PSYWAVE), + LEVEL_UP_MOVE(16, MOVE_SWIFT), + LEVEL_UP_MOVE(18, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(22, MOVE_CAMOUFLAGE), + LEVEL_UP_MOVE(24, MOVE_GYRO_BALL), + LEVEL_UP_MOVE(28, MOVE_BRINE), + LEVEL_UP_MOVE(31, MOVE_MINIMIZE), + LEVEL_UP_MOVE(35, MOVE_REFLECT_TYPE), + LEVEL_UP_MOVE(37, MOVE_POWER_GEM), + LEVEL_UP_MOVE(40, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(42, MOVE_PSYCHIC), + LEVEL_UP_MOVE(46, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(49, MOVE_COSMIC_POWER), + LEVEL_UP_MOVE(53, MOVE_HYDRO_PUMP), LEVEL_UP_END }; -static const u16 sStarmieLevelUpLearnset[] = { +static const struct LevelUpMove sStarmieLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE( 1, MOVE_SPOTLIGHT), LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), LEVEL_UP_MOVE( 1, MOVE_RAPID_SPIN), LEVEL_UP_MOVE( 1, MOVE_RECOVER), LEVEL_UP_MOVE( 1, MOVE_SWIFT), - LEVEL_UP_MOVE(33, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(40, MOVE_CONFUSE_RAY), LEVEL_UP_END }; -static const u16 sMrmimeLevelUpLearnset[] = { +static const struct LevelUpMove sMrmimeLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_MISTY_TERRAIN), + LEVEL_UP_MOVE( 1, MOVE_MAGICAL_LEAF), + LEVEL_UP_MOVE( 1, MOVE_QUICK_GUARD), + LEVEL_UP_MOVE( 1, MOVE_WIDE_GUARD), + LEVEL_UP_MOVE( 1, MOVE_POWER_SWAP), + LEVEL_UP_MOVE( 1, MOVE_GUARD_SWAP), LEVEL_UP_MOVE( 1, MOVE_BARRIER), - LEVEL_UP_MOVE( 5, MOVE_CONFUSION), - LEVEL_UP_MOVE( 9, MOVE_SUBSTITUTE), - LEVEL_UP_MOVE(13, MOVE_MEDITATE), - LEVEL_UP_MOVE(17, MOVE_DOUBLE_SLAP), - LEVEL_UP_MOVE(21, MOVE_LIGHT_SCREEN), - LEVEL_UP_MOVE(21, MOVE_REFLECT), - LEVEL_UP_MOVE(25, MOVE_ENCORE), - LEVEL_UP_MOVE(29, MOVE_PSYBEAM), - LEVEL_UP_MOVE(33, MOVE_RECYCLE), - LEVEL_UP_MOVE(37, MOVE_TRICK), - LEVEL_UP_MOVE(41, MOVE_ROLE_PLAY), - LEVEL_UP_MOVE(45, MOVE_PSYCHIC), - LEVEL_UP_MOVE(49, MOVE_BATON_PASS), - LEVEL_UP_MOVE(53, MOVE_SAFEGUARD), + LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 1, MOVE_CONFUSION), + LEVEL_UP_MOVE( 4, MOVE_COPYCAT), + LEVEL_UP_MOVE( 8, MOVE_MEDITATE), + LEVEL_UP_MOVE(11, MOVE_DOUBLE_SLAP), + LEVEL_UP_MOVE(15, MOVE_MIMIC), + LEVEL_UP_MOVE(15, MOVE_PSYWAVE), + LEVEL_UP_MOVE(18, MOVE_ENCORE), + LEVEL_UP_MOVE(22, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(22, MOVE_REFLECT), + LEVEL_UP_MOVE(25, MOVE_PSYBEAM), + LEVEL_UP_MOVE(29, MOVE_SUBSTITUTE), + LEVEL_UP_MOVE(32, MOVE_RECYCLE), + LEVEL_UP_MOVE(36, MOVE_TRICK), + LEVEL_UP_MOVE(39, MOVE_PSYCHIC), + LEVEL_UP_MOVE(43, MOVE_ROLE_PLAY), + LEVEL_UP_MOVE(46, MOVE_BATON_PASS), + LEVEL_UP_MOVE(50, MOVE_SAFEGUARD), LEVEL_UP_END }; -static const u16 sScytherLevelUpLearnset[] = { +static const struct LevelUpMove sScytherLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_VACUUM_WAVE), LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 6, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE(11, MOVE_PURSUIT), - LEVEL_UP_MOVE(16, MOVE_FALSE_SWIPE), - LEVEL_UP_MOVE(21, MOVE_AGILITY), - LEVEL_UP_MOVE(26, MOVE_WING_ATTACK), - LEVEL_UP_MOVE(31, MOVE_SLASH), - LEVEL_UP_MOVE(36, MOVE_SWORDS_DANCE), - LEVEL_UP_MOVE(41, MOVE_DOUBLE_TEAM), - LEVEL_UP_MOVE(46, MOVE_FURY_CUTTER), + LEVEL_UP_MOVE( 5, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 9, MOVE_PURSUIT), + LEVEL_UP_MOVE(13, MOVE_FALSE_SWIPE), + LEVEL_UP_MOVE(17, MOVE_AGILITY), + LEVEL_UP_MOVE(21, MOVE_WING_ATTACK), + LEVEL_UP_MOVE(25, MOVE_FURY_CUTTER), + LEVEL_UP_MOVE(29, MOVE_SLASH), + LEVEL_UP_MOVE(33, MOVE_RAZOR_WIND), + LEVEL_UP_MOVE(37, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE(41, MOVE_X_SCISSOR), + LEVEL_UP_MOVE(45, MOVE_NIGHT_SLASH), + LEVEL_UP_MOVE(49, MOVE_DOUBLE_HIT), + LEVEL_UP_MOVE(50, MOVE_AIR_SLASH), + LEVEL_UP_MOVE(57, MOVE_SWORDS_DANCE), + LEVEL_UP_MOVE(61, MOVE_FEINT), LEVEL_UP_END }; -static const u16 sJynxLevelUpLearnset[] = { +static const struct LevelUpMove sJynxLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_DRAINING_KISS), + LEVEL_UP_MOVE( 1, MOVE_PERISH_SONG), LEVEL_UP_MOVE( 1, MOVE_POUND), LEVEL_UP_MOVE( 1, MOVE_LICK), LEVEL_UP_MOVE( 1, MOVE_LOVELY_KISS), LEVEL_UP_MOVE( 1, MOVE_POWDER_SNOW), - LEVEL_UP_MOVE( 9, MOVE_LOVELY_KISS), - LEVEL_UP_MOVE(13, MOVE_POWDER_SNOW), - LEVEL_UP_MOVE(21, MOVE_DOUBLE_SLAP), - LEVEL_UP_MOVE(25, MOVE_ICE_PUNCH), - LEVEL_UP_MOVE(35, MOVE_MEAN_LOOK), - LEVEL_UP_MOVE(41, MOVE_FAKE_TEARS), - LEVEL_UP_MOVE(51, MOVE_BODY_SLAM), - LEVEL_UP_MOVE(57, MOVE_PERISH_SONG), - LEVEL_UP_MOVE(67, MOVE_BLIZZARD), + LEVEL_UP_MOVE( 5, MOVE_LICK), + LEVEL_UP_MOVE( 8, MOVE_LOVELY_KISS), + LEVEL_UP_MOVE(11, MOVE_POWDER_SNOW), + LEVEL_UP_MOVE(15, MOVE_DOUBLE_SLAP), + LEVEL_UP_MOVE(18, MOVE_ICE_PUNCH), + LEVEL_UP_MOVE(21, MOVE_HEART_STAMP), + LEVEL_UP_MOVE(25, MOVE_MEAN_LOOK), + LEVEL_UP_MOVE(28, MOVE_FAKE_TEARS), + LEVEL_UP_MOVE(33, MOVE_WAKE_UP_SLAP), + LEVEL_UP_MOVE(39, MOVE_AVALANCHE), + LEVEL_UP_MOVE(44, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(49, MOVE_WRING_OUT), + LEVEL_UP_MOVE(55, MOVE_PERISH_SONG), + LEVEL_UP_MOVE(60, MOVE_BLIZZARD), LEVEL_UP_END }; -static const u16 sElectabuzzLevelUpLearnset[] = { +static const struct LevelUpMove sElectabuzzLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 1, MOVE_THUNDER_PUNCH), - LEVEL_UP_MOVE( 9, MOVE_THUNDER_PUNCH), - LEVEL_UP_MOVE(17, MOVE_LIGHT_SCREEN), - LEVEL_UP_MOVE(25, MOVE_SWIFT), - LEVEL_UP_MOVE(36, MOVE_SCREECH), - LEVEL_UP_MOVE(47, MOVE_THUNDERBOLT), - LEVEL_UP_MOVE(58, MOVE_THUNDER), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE( 5, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE( 8, MOVE_LOW_KICK), + LEVEL_UP_MOVE(12, MOVE_SWIFT), + LEVEL_UP_MOVE(15, MOVE_SHOCK_WAVE), + LEVEL_UP_MOVE(19, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE(22, MOVE_ELECTRO_BALL), + LEVEL_UP_MOVE(26, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(29, MOVE_THUNDER_PUNCH), + LEVEL_UP_MOVE(36, MOVE_DISCHARGE), + LEVEL_UP_MOVE(42, MOVE_SCREECH), + LEVEL_UP_MOVE(49, MOVE_THUNDERBOLT), + LEVEL_UP_MOVE(55, MOVE_THUNDER), LEVEL_UP_END }; -static const u16 sMagmarLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_EMBER), - LEVEL_UP_MOVE( 1, MOVE_LEER), +static const struct LevelUpMove sMagmarLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SMOG), - LEVEL_UP_MOVE( 1, MOVE_FIRE_PUNCH), - LEVEL_UP_MOVE( 7, MOVE_LEER), - LEVEL_UP_MOVE(13, MOVE_SMOG), - LEVEL_UP_MOVE(19, MOVE_FIRE_PUNCH), - LEVEL_UP_MOVE(25, MOVE_SMOKESCREEN), - LEVEL_UP_MOVE(33, MOVE_SUNNY_DAY), - LEVEL_UP_MOVE(41, MOVE_FLAMETHROWER), - LEVEL_UP_MOVE(49, MOVE_CONFUSE_RAY), - LEVEL_UP_MOVE(57, MOVE_FIRE_BLAST), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_EMBER), + LEVEL_UP_MOVE( 5, MOVE_EMBER), + LEVEL_UP_MOVE( 8, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE(12, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(15, MOVE_FIRE_SPIN), + LEVEL_UP_MOVE(19, MOVE_CLEAR_SMOG), + LEVEL_UP_MOVE(22, MOVE_FLAME_BURST), + LEVEL_UP_MOVE(26, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(29, MOVE_FIRE_PUNCH), + LEVEL_UP_MOVE(36, MOVE_LAVA_PLUME), + LEVEL_UP_MOVE(42, MOVE_SUNNY_DAY), + LEVEL_UP_MOVE(49, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(55, MOVE_FIRE_BLAST), LEVEL_UP_END }; -static const u16 sPinsirLevelUpLearnset[] = { +static const struct LevelUpMove sPinsirLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_VICE_GRIP), LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE( 7, MOVE_BIND), - LEVEL_UP_MOVE(13, MOVE_SEISMIC_TOSS), - LEVEL_UP_MOVE(19, MOVE_HARDEN), - LEVEL_UP_MOVE(25, MOVE_REVENGE), - LEVEL_UP_MOVE(31, MOVE_BRICK_BREAK), - LEVEL_UP_MOVE(37, MOVE_GUILLOTINE), - LEVEL_UP_MOVE(43, MOVE_SUBMISSION), - LEVEL_UP_MOVE(49, MOVE_SWORDS_DANCE), - LEVEL_UP_END -}; - -static const u16 sTaurosLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 4, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 8, MOVE_RAGE), - LEVEL_UP_MOVE(13, MOVE_HORN_ATTACK), - LEVEL_UP_MOVE(19, MOVE_SCARY_FACE), - LEVEL_UP_MOVE(26, MOVE_PURSUIT), - LEVEL_UP_MOVE(34, MOVE_REST), + LEVEL_UP_MOVE( 4, MOVE_BIND), + LEVEL_UP_MOVE( 8, MOVE_SEISMIC_TOSS), + LEVEL_UP_MOVE(11, MOVE_HARDEN), + LEVEL_UP_MOVE(15, MOVE_REVENGE), + LEVEL_UP_MOVE(18, MOVE_VITAL_THROW), + LEVEL_UP_MOVE(22, MOVE_DOUBLE_HIT), + LEVEL_UP_MOVE(26, MOVE_BRICK_BREAK), + LEVEL_UP_MOVE(29, MOVE_X_SCISSOR), + LEVEL_UP_MOVE(33, MOVE_SUBMISSION), + LEVEL_UP_MOVE(36, MOVE_STORM_THROW), + LEVEL_UP_MOVE(40, MOVE_SWORDS_DANCE), LEVEL_UP_MOVE(43, MOVE_THRASH), - LEVEL_UP_MOVE(53, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(47, MOVE_SUPERPOWER), + LEVEL_UP_MOVE(50, MOVE_GUILLOTINE), LEVEL_UP_END }; -static const u16 sMagikarpLevelUpLearnset[] = { +static const struct LevelUpMove sTaurosLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 3, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 5, MOVE_RAGE), + LEVEL_UP_MOVE( 8, MOVE_HORN_ATTACK), + LEVEL_UP_MOVE(11, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(15, MOVE_PURSUIT), + LEVEL_UP_MOVE(19, MOVE_REST), + LEVEL_UP_MOVE(24, MOVE_PAYBACK), + LEVEL_UP_MOVE(29, MOVE_WORK_UP), + LEVEL_UP_MOVE(35, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(41, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(48, MOVE_SWAGGER), + LEVEL_UP_MOVE(55, MOVE_THRASH), + LEVEL_UP_MOVE(63, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(71, MOVE_GIGA_IMPACT), + LEVEL_UP_END +}; + +static const struct LevelUpMove sMagikarpLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SPLASH), LEVEL_UP_MOVE(15, MOVE_TACKLE), LEVEL_UP_MOVE(30, MOVE_FLAIL), LEVEL_UP_END }; -static const u16 sGyaradosLevelUpLearnset[] = { +static const struct LevelUpMove sGyaradosLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_BITE), + LEVEL_UP_MOVE( 1, MOVE_BITE), LEVEL_UP_MOVE( 1, MOVE_THRASH), - LEVEL_UP_MOVE(20, MOVE_BITE), - LEVEL_UP_MOVE(25, MOVE_DRAGON_RAGE), - LEVEL_UP_MOVE(30, MOVE_LEER), - LEVEL_UP_MOVE(35, MOVE_TWISTER), - LEVEL_UP_MOVE(40, MOVE_HYDRO_PUMP), - LEVEL_UP_MOVE(45, MOVE_RAIN_DANCE), - LEVEL_UP_MOVE(50, MOVE_DRAGON_DANCE), - LEVEL_UP_MOVE(55, MOVE_HYPER_BEAM), + LEVEL_UP_MOVE(21, MOVE_LEER), + LEVEL_UP_MOVE(24, MOVE_TWISTER), + LEVEL_UP_MOVE(27, MOVE_ICE_FANG), + LEVEL_UP_MOVE(30, MOVE_AQUA_TAIL), + LEVEL_UP_MOVE(33, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(36, MOVE_DRAGON_RAGE), + LEVEL_UP_MOVE(39, MOVE_CRUNCH), + LEVEL_UP_MOVE(42, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(45, MOVE_DRAGON_DANCE), + LEVEL_UP_MOVE(48, MOVE_HURRICANE), + LEVEL_UP_MOVE(51, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(54, MOVE_HYPER_BEAM), LEVEL_UP_END }; -static const u16 sLaprasLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), - LEVEL_UP_MOVE( 1, MOVE_GROWL), +static const struct LevelUpMove sLaprasLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SING), - LEVEL_UP_MOVE( 7, MOVE_MIST), - LEVEL_UP_MOVE(13, MOVE_BODY_SLAM), - LEVEL_UP_MOVE(19, MOVE_CONFUSE_RAY), - LEVEL_UP_MOVE(25, MOVE_PERISH_SONG), - LEVEL_UP_MOVE(31, MOVE_ICE_BEAM), - LEVEL_UP_MOVE(37, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 4, MOVE_MIST), + LEVEL_UP_MOVE( 7, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(10, MOVE_ICE_SHARD), + LEVEL_UP_MOVE(14, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(18, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(22, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(27, MOVE_PERISH_SONG), + LEVEL_UP_MOVE(32, MOVE_ICE_BEAM), + LEVEL_UP_MOVE(37, MOVE_BRINE), LEVEL_UP_MOVE(43, MOVE_SAFEGUARD), - LEVEL_UP_MOVE(49, MOVE_HYDRO_PUMP), - LEVEL_UP_MOVE(55, MOVE_SHEER_COLD), + LEVEL_UP_MOVE(47, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(50, MOVE_SHEER_COLD), LEVEL_UP_END }; -static const u16 sDittoLevelUpLearnset[] = { +static const struct LevelUpMove sDittoLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TRANSFORM), LEVEL_UP_END }; -static const u16 sEeveeLevelUpLearnset[] = { +static const struct LevelUpMove sEeveeLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_COVET), + LEVEL_UP_MOVE( 1, MOVE_HELPING_HAND), + LEVEL_UP_MOVE( 1, MOVE_GROWL), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 1, MOVE_HELPING_HAND), - LEVEL_UP_MOVE( 8, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(16, MOVE_GROWL), - LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(30, MOVE_BITE), - LEVEL_UP_MOVE(36, MOVE_BATON_PASS), - LEVEL_UP_MOVE(42, MOVE_TAKE_DOWN), - LEVEL_UP_END -}; - -static const u16 sVaporeonLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 1, MOVE_HELPING_HAND), - LEVEL_UP_MOVE( 8, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(16, MOVE_WATER_GUN), - LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(30, MOVE_BITE), - LEVEL_UP_MOVE(36, MOVE_AURORA_BEAM), - LEVEL_UP_MOVE(42, MOVE_HAZE), - LEVEL_UP_MOVE(47, MOVE_ACID_ARMOR), - LEVEL_UP_MOVE(52, MOVE_HYDRO_PUMP), - LEVEL_UP_END -}; - -static const u16 sJolteonLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 1, MOVE_HELPING_HAND), - LEVEL_UP_MOVE( 8, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(16, MOVE_THUNDER_SHOCK), - LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(30, MOVE_DOUBLE_KICK), - LEVEL_UP_MOVE(36, MOVE_PIN_MISSILE), - LEVEL_UP_MOVE(42, MOVE_THUNDER_WAVE), - LEVEL_UP_MOVE(47, MOVE_AGILITY), - LEVEL_UP_MOVE(52, MOVE_THUNDER), - LEVEL_UP_END -}; - -static const u16 sFlareonLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 1, MOVE_HELPING_HAND), - LEVEL_UP_MOVE( 8, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(16, MOVE_EMBER), - LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(30, MOVE_BITE), - LEVEL_UP_MOVE(36, MOVE_FIRE_SPIN), - LEVEL_UP_MOVE(42, MOVE_SMOG), - LEVEL_UP_MOVE(47, MOVE_LEER), - LEVEL_UP_MOVE(52, MOVE_FLAMETHROWER), - LEVEL_UP_END -}; - -static const u16 sPorygonLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_CONVERSION_2), - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 1, MOVE_CONVERSION), - LEVEL_UP_MOVE( 9, MOVE_AGILITY), - LEVEL_UP_MOVE(12, MOVE_PSYBEAM), - LEVEL_UP_MOVE(20, MOVE_RECOVER), - LEVEL_UP_MOVE(24, MOVE_SHARPEN), - LEVEL_UP_MOVE(32, MOVE_LOCK_ON), - LEVEL_UP_MOVE(36, MOVE_TRI_ATTACK), - LEVEL_UP_MOVE(44, MOVE_RECYCLE), - LEVEL_UP_MOVE(48, MOVE_ZAP_CANNON), - LEVEL_UP_END -}; - -static const u16 sOmanyteLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_CONSTRICT), - LEVEL_UP_MOVE( 1, MOVE_WITHDRAW), - LEVEL_UP_MOVE(13, MOVE_BITE), - LEVEL_UP_MOVE(19, MOVE_WATER_GUN), - LEVEL_UP_MOVE(25, MOVE_MUD_SHOT), - LEVEL_UP_MOVE(31, MOVE_LEER), - LEVEL_UP_MOVE(37, MOVE_PROTECT), - LEVEL_UP_MOVE(43, MOVE_TICKLE), - LEVEL_UP_MOVE(49, MOVE_ANCIENT_POWER), - LEVEL_UP_MOVE(55, MOVE_HYDRO_PUMP), - LEVEL_UP_END -}; - -static const u16 sOmastarLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_CONSTRICT), - LEVEL_UP_MOVE( 1, MOVE_WITHDRAW), - LEVEL_UP_MOVE( 1, MOVE_BITE), - LEVEL_UP_MOVE(13, MOVE_BITE), - LEVEL_UP_MOVE(19, MOVE_WATER_GUN), - LEVEL_UP_MOVE(25, MOVE_MUD_SHOT), - LEVEL_UP_MOVE(31, MOVE_LEER), - LEVEL_UP_MOVE(37, MOVE_PROTECT), - LEVEL_UP_MOVE(40, MOVE_SPIKE_CANNON), - LEVEL_UP_MOVE(46, MOVE_TICKLE), - LEVEL_UP_MOVE(55, MOVE_ANCIENT_POWER), - LEVEL_UP_MOVE(65, MOVE_HYDRO_PUMP), - LEVEL_UP_END -}; - -static const u16 sKabutoLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_SCRATCH), - LEVEL_UP_MOVE( 1, MOVE_HARDEN), - LEVEL_UP_MOVE(13, MOVE_ABSORB), - LEVEL_UP_MOVE(19, MOVE_LEER), - LEVEL_UP_MOVE(25, MOVE_MUD_SHOT), - LEVEL_UP_MOVE(31, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(37, MOVE_ENDURE), - LEVEL_UP_MOVE(43, MOVE_METAL_SOUND), - LEVEL_UP_MOVE(49, MOVE_MEGA_DRAIN), - LEVEL_UP_MOVE(55, MOVE_ANCIENT_POWER), - LEVEL_UP_END -}; - -static const u16 sKabutopsLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_SCRATCH), - LEVEL_UP_MOVE( 1, MOVE_HARDEN), - LEVEL_UP_MOVE( 1, MOVE_ABSORB), - LEVEL_UP_MOVE(13, MOVE_ABSORB), - LEVEL_UP_MOVE(19, MOVE_LEER), - LEVEL_UP_MOVE(25, MOVE_MUD_SHOT), - LEVEL_UP_MOVE(31, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(37, MOVE_ENDURE), - LEVEL_UP_MOVE(40, MOVE_SLASH), - LEVEL_UP_MOVE(46, MOVE_METAL_SOUND), - LEVEL_UP_MOVE(55, MOVE_MEGA_DRAIN), - LEVEL_UP_MOVE(65, MOVE_ANCIENT_POWER), - LEVEL_UP_END -}; - -static const u16 sAerodactylLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_WING_ATTACK), - LEVEL_UP_MOVE( 8, MOVE_AGILITY), - LEVEL_UP_MOVE(15, MOVE_BITE), - LEVEL_UP_MOVE(22, MOVE_SUPERSONIC), - LEVEL_UP_MOVE(29, MOVE_ANCIENT_POWER), - LEVEL_UP_MOVE(36, MOVE_SCARY_FACE), - LEVEL_UP_MOVE(43, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(50, MOVE_HYPER_BEAM), - LEVEL_UP_END -}; - -static const u16 sSnorlaxLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 6, MOVE_AMNESIA), - LEVEL_UP_MOVE(10, MOVE_DEFENSE_CURL), - LEVEL_UP_MOVE(15, MOVE_BELLY_DRUM), - LEVEL_UP_MOVE(19, MOVE_HEADBUTT), - LEVEL_UP_MOVE(24, MOVE_YAWN), - LEVEL_UP_MOVE(28, MOVE_REST), - LEVEL_UP_MOVE(28, MOVE_SNORE), - LEVEL_UP_MOVE(33, MOVE_BODY_SLAM), - LEVEL_UP_MOVE(37, MOVE_BLOCK), - LEVEL_UP_MOVE(42, MOVE_COVET), - LEVEL_UP_MOVE(46, MOVE_ROLLOUT), - LEVEL_UP_MOVE(51, MOVE_HYPER_BEAM), - LEVEL_UP_END -}; - -static const u16 sArticunoLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_GUST), - LEVEL_UP_MOVE( 1, MOVE_POWDER_SNOW), - LEVEL_UP_MOVE(13, MOVE_MIST), - LEVEL_UP_MOVE(25, MOVE_AGILITY), - LEVEL_UP_MOVE(37, MOVE_MIND_READER), - LEVEL_UP_MOVE(49, MOVE_ICE_BEAM), - LEVEL_UP_MOVE(61, MOVE_REFLECT), - LEVEL_UP_MOVE(73, MOVE_BLIZZARD), - LEVEL_UP_MOVE(85, MOVE_SHEER_COLD), - LEVEL_UP_END -}; - -static const u16 sZapdosLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_PECK), - LEVEL_UP_MOVE( 1, MOVE_THUNDER_SHOCK), - LEVEL_UP_MOVE(13, MOVE_THUNDER_WAVE), - LEVEL_UP_MOVE(25, MOVE_AGILITY), - LEVEL_UP_MOVE(37, MOVE_DETECT), - LEVEL_UP_MOVE(49, MOVE_DRILL_PECK), - LEVEL_UP_MOVE(61, MOVE_CHARGE), - LEVEL_UP_MOVE(73, MOVE_LIGHT_SCREEN), - LEVEL_UP_MOVE(85, MOVE_THUNDER), - LEVEL_UP_END -}; - -static const u16 sMoltresLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_WING_ATTACK), - LEVEL_UP_MOVE( 1, MOVE_EMBER), - LEVEL_UP_MOVE(13, MOVE_FIRE_SPIN), - LEVEL_UP_MOVE(25, MOVE_AGILITY), - LEVEL_UP_MOVE(37, MOVE_ENDURE), - LEVEL_UP_MOVE(49, MOVE_FLAMETHROWER), - LEVEL_UP_MOVE(61, MOVE_SAFEGUARD), - LEVEL_UP_MOVE(73, MOVE_HEAT_WAVE), - LEVEL_UP_MOVE(85, MOVE_SKY_ATTACK), - LEVEL_UP_END -}; - -static const u16 sDratiniLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_WRAP), - LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 8, MOVE_THUNDER_WAVE), - LEVEL_UP_MOVE(15, MOVE_TWISTER), - LEVEL_UP_MOVE(22, MOVE_DRAGON_RAGE), - LEVEL_UP_MOVE(29, MOVE_SLAM), - LEVEL_UP_MOVE(36, MOVE_AGILITY), - LEVEL_UP_MOVE(43, MOVE_SAFEGUARD), - LEVEL_UP_MOVE(50, MOVE_OUTRAGE), - LEVEL_UP_MOVE(57, MOVE_HYPER_BEAM), - LEVEL_UP_END -}; - -static const u16 sDragonairLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_WRAP), - LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 1, MOVE_THUNDER_WAVE), - LEVEL_UP_MOVE( 1, MOVE_TWISTER), - LEVEL_UP_MOVE( 8, MOVE_THUNDER_WAVE), - LEVEL_UP_MOVE(15, MOVE_TWISTER), - LEVEL_UP_MOVE(22, MOVE_DRAGON_RAGE), - LEVEL_UP_MOVE(29, MOVE_SLAM), - LEVEL_UP_MOVE(38, MOVE_AGILITY), - LEVEL_UP_MOVE(47, MOVE_SAFEGUARD), - LEVEL_UP_MOVE(56, MOVE_OUTRAGE), - LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM), - LEVEL_UP_END -}; - -static const u16 sDragoniteLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_WRAP), - LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 1, MOVE_THUNDER_WAVE), - LEVEL_UP_MOVE( 1, MOVE_TWISTER), - LEVEL_UP_MOVE( 8, MOVE_THUNDER_WAVE), - LEVEL_UP_MOVE(15, MOVE_TWISTER), - LEVEL_UP_MOVE(22, MOVE_DRAGON_RAGE), - LEVEL_UP_MOVE(29, MOVE_SLAM), - LEVEL_UP_MOVE(38, MOVE_AGILITY), - LEVEL_UP_MOVE(47, MOVE_SAFEGUARD), - LEVEL_UP_MOVE(55, MOVE_WING_ATTACK), - LEVEL_UP_MOVE(61, MOVE_OUTRAGE), - LEVEL_UP_MOVE(75, MOVE_HYPER_BEAM), - LEVEL_UP_END -}; - -static const u16 sMewtwoLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_CONFUSION), - LEVEL_UP_MOVE( 1, MOVE_DISABLE), - LEVEL_UP_MOVE(11, MOVE_BARRIER), - LEVEL_UP_MOVE(22, MOVE_SWIFT), - LEVEL_UP_MOVE(33, MOVE_PSYCH_UP), - LEVEL_UP_MOVE(44, MOVE_FUTURE_SIGHT), - LEVEL_UP_MOVE(55, MOVE_MIST), - LEVEL_UP_MOVE(66, MOVE_PSYCHIC), - LEVEL_UP_MOVE(77, MOVE_AMNESIA), - LEVEL_UP_MOVE(88, MOVE_RECOVER), - LEVEL_UP_MOVE(99, MOVE_SAFEGUARD), - LEVEL_UP_END -}; - -static const u16 sMewLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_POUND), - LEVEL_UP_MOVE(10, MOVE_TRANSFORM), - LEVEL_UP_MOVE(20, MOVE_MEGA_PUNCH), - LEVEL_UP_MOVE(30, MOVE_METRONOME), - LEVEL_UP_MOVE(40, MOVE_PSYCHIC), - LEVEL_UP_MOVE(50, MOVE_ANCIENT_POWER), - LEVEL_UP_END -}; - -static const u16 sChikoritaLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 8, MOVE_RAZOR_LEAF), - LEVEL_UP_MOVE(12, MOVE_REFLECT), - LEVEL_UP_MOVE(15, MOVE_POISON_POWDER), - LEVEL_UP_MOVE(22, MOVE_SYNTHESIS), - LEVEL_UP_MOVE(29, MOVE_BODY_SLAM), - LEVEL_UP_MOVE(36, MOVE_LIGHT_SCREEN), - LEVEL_UP_MOVE(43, MOVE_SAFEGUARD), - LEVEL_UP_MOVE(50, MOVE_SOLAR_BEAM), - LEVEL_UP_END -}; - -static const u16 sBayleefLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 1, MOVE_RAZOR_LEAF), - LEVEL_UP_MOVE( 1, MOVE_REFLECT), - LEVEL_UP_MOVE( 8, MOVE_RAZOR_LEAF), - LEVEL_UP_MOVE(12, MOVE_REFLECT), - LEVEL_UP_MOVE(15, MOVE_POISON_POWDER), - LEVEL_UP_MOVE(23, MOVE_SYNTHESIS), - LEVEL_UP_MOVE(31, MOVE_BODY_SLAM), - LEVEL_UP_MOVE(39, MOVE_LIGHT_SCREEN), - LEVEL_UP_MOVE(47, MOVE_SAFEGUARD), - LEVEL_UP_MOVE(55, MOVE_SOLAR_BEAM), - LEVEL_UP_END -}; - -static const u16 sMeganiumLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 1, MOVE_RAZOR_LEAF), - LEVEL_UP_MOVE( 1, MOVE_REFLECT), - LEVEL_UP_MOVE( 8, MOVE_RAZOR_LEAF), - LEVEL_UP_MOVE(12, MOVE_REFLECT), - LEVEL_UP_MOVE(15, MOVE_POISON_POWDER), - LEVEL_UP_MOVE(23, MOVE_SYNTHESIS), - LEVEL_UP_MOVE(31, MOVE_BODY_SLAM), - LEVEL_UP_MOVE(41, MOVE_LIGHT_SCREEN), - LEVEL_UP_MOVE(51, MOVE_SAFEGUARD), - LEVEL_UP_MOVE(61, MOVE_SOLAR_BEAM), - LEVEL_UP_END -}; - -static const u16 sCyndaquilLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 6, MOVE_SMOKESCREEN), - LEVEL_UP_MOVE(12, MOVE_EMBER), - LEVEL_UP_MOVE(19, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(27, MOVE_FLAME_WHEEL), - LEVEL_UP_MOVE(36, MOVE_SWIFT), - LEVEL_UP_MOVE(46, MOVE_FLAMETHROWER), - LEVEL_UP_END -}; - -static const u16 sQuilavaLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 1, MOVE_SMOKESCREEN), - LEVEL_UP_MOVE( 6, MOVE_SMOKESCREEN), - LEVEL_UP_MOVE(12, MOVE_EMBER), - LEVEL_UP_MOVE(21, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(31, MOVE_FLAME_WHEEL), - LEVEL_UP_MOVE(42, MOVE_SWIFT), - LEVEL_UP_MOVE(54, MOVE_FLAMETHROWER), - LEVEL_UP_END -}; - -static const u16 sTyphlosionLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 1, MOVE_SMOKESCREEN), - LEVEL_UP_MOVE( 1, MOVE_EMBER), - LEVEL_UP_MOVE( 6, MOVE_SMOKESCREEN), - LEVEL_UP_MOVE(12, MOVE_EMBER), - LEVEL_UP_MOVE(21, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(31, MOVE_FLAME_WHEEL), - LEVEL_UP_MOVE(45, MOVE_SWIFT), - LEVEL_UP_MOVE(60, MOVE_FLAMETHROWER), - LEVEL_UP_END -}; - -static const u16 sTotodileLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_SCRATCH), - LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 7, MOVE_RAGE), - LEVEL_UP_MOVE(13, MOVE_WATER_GUN), - LEVEL_UP_MOVE(20, MOVE_BITE), - LEVEL_UP_MOVE(27, MOVE_SCARY_FACE), - LEVEL_UP_MOVE(35, MOVE_SLASH), - LEVEL_UP_MOVE(43, MOVE_SCREECH), - LEVEL_UP_MOVE(52, MOVE_HYDRO_PUMP), - LEVEL_UP_END -}; - -static const u16 sCroconawLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_SCRATCH), - LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 1, MOVE_RAGE), - LEVEL_UP_MOVE( 7, MOVE_RAGE), - LEVEL_UP_MOVE(13, MOVE_WATER_GUN), - LEVEL_UP_MOVE(21, MOVE_BITE), - LEVEL_UP_MOVE(28, MOVE_SCARY_FACE), - LEVEL_UP_MOVE(37, MOVE_SLASH), - LEVEL_UP_MOVE(45, MOVE_SCREECH), - LEVEL_UP_MOVE(55, MOVE_HYDRO_PUMP), - LEVEL_UP_END -}; - -static const u16 sFeraligatrLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_SCRATCH), - LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 1, MOVE_RAGE), - LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), - LEVEL_UP_MOVE( 7, MOVE_RAGE), - LEVEL_UP_MOVE(13, MOVE_WATER_GUN), - LEVEL_UP_MOVE(21, MOVE_BITE), - LEVEL_UP_MOVE(28, MOVE_SCARY_FACE), - LEVEL_UP_MOVE(38, MOVE_SLASH), - LEVEL_UP_MOVE(47, MOVE_SCREECH), - LEVEL_UP_MOVE(58, MOVE_HYDRO_PUMP), - LEVEL_UP_END -}; - -static const u16 sSentretLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_SCRATCH), - LEVEL_UP_MOVE( 4, MOVE_DEFENSE_CURL), - LEVEL_UP_MOVE( 7, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(12, MOVE_FURY_SWIPES), - LEVEL_UP_MOVE(17, MOVE_HELPING_HAND), - LEVEL_UP_MOVE(24, MOVE_SLAM), - LEVEL_UP_MOVE(31, MOVE_FOLLOW_ME), - LEVEL_UP_MOVE(40, MOVE_REST), - LEVEL_UP_MOVE(49, MOVE_AMNESIA), - LEVEL_UP_END -}; - -static const u16 sFurretLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_SCRATCH), - LEVEL_UP_MOVE( 1, MOVE_DEFENSE_CURL), - LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE( 4, MOVE_DEFENSE_CURL), - LEVEL_UP_MOVE( 7, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(12, MOVE_FURY_SWIPES), - LEVEL_UP_MOVE(19, MOVE_HELPING_HAND), - LEVEL_UP_MOVE(28, MOVE_SLAM), - LEVEL_UP_MOVE(37, MOVE_FOLLOW_ME), - LEVEL_UP_MOVE(48, MOVE_REST), - LEVEL_UP_MOVE(59, MOVE_AMNESIA), - LEVEL_UP_END -}; - -static const u16 sHoothootLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 6, MOVE_FORESIGHT), - LEVEL_UP_MOVE(11, MOVE_PECK), - LEVEL_UP_MOVE(16, MOVE_HYPNOSIS), - LEVEL_UP_MOVE(22, MOVE_REFLECT), - LEVEL_UP_MOVE(28, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(34, MOVE_CONFUSION), - LEVEL_UP_MOVE(48, MOVE_DREAM_EATER), - LEVEL_UP_END -}; - -static const u16 sNoctowlLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 1, MOVE_FORESIGHT), - LEVEL_UP_MOVE( 1, MOVE_PECK), - LEVEL_UP_MOVE( 6, MOVE_FORESIGHT), - LEVEL_UP_MOVE(11, MOVE_PECK), - LEVEL_UP_MOVE(16, MOVE_HYPNOSIS), - LEVEL_UP_MOVE(25, MOVE_REFLECT), - LEVEL_UP_MOVE(33, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(41, MOVE_CONFUSION), - LEVEL_UP_MOVE(57, MOVE_DREAM_EATER), - LEVEL_UP_END -}; - -static const u16 sLedybaLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 8, MOVE_SUPERSONIC), - LEVEL_UP_MOVE(15, MOVE_COMET_PUNCH), - LEVEL_UP_MOVE(22, MOVE_LIGHT_SCREEN), - LEVEL_UP_MOVE(22, MOVE_REFLECT), - LEVEL_UP_MOVE(22, MOVE_SAFEGUARD), - LEVEL_UP_MOVE(29, MOVE_BATON_PASS), - LEVEL_UP_MOVE(36, MOVE_SWIFT), - LEVEL_UP_MOVE(43, MOVE_AGILITY), - LEVEL_UP_MOVE(50, MOVE_DOUBLE_EDGE), - LEVEL_UP_END -}; - -static const u16 sLedianLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 1, MOVE_SUPERSONIC), - LEVEL_UP_MOVE( 8, MOVE_SUPERSONIC), - LEVEL_UP_MOVE(15, MOVE_COMET_PUNCH), - LEVEL_UP_MOVE(24, MOVE_LIGHT_SCREEN), - LEVEL_UP_MOVE(24, MOVE_REFLECT), - LEVEL_UP_MOVE(24, MOVE_SAFEGUARD), + LEVEL_UP_MOVE( 5, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 9, MOVE_BABY_DOLL_EYES), + LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(17, MOVE_BITE), + LEVEL_UP_MOVE(17, MOVE_SWIFT), + LEVEL_UP_MOVE(20, MOVE_REFRESH), + LEVEL_UP_MOVE(25, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(29, MOVE_CHARM), LEVEL_UP_MOVE(33, MOVE_BATON_PASS), - LEVEL_UP_MOVE(42, MOVE_SWIFT), - LEVEL_UP_MOVE(51, MOVE_AGILITY), - LEVEL_UP_MOVE(60, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(37, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(41, MOVE_LAST_RESORT), + LEVEL_UP_MOVE(45, MOVE_TRUMP_CARD), LEVEL_UP_END }; -static const u16 sSpinarakLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_POISON_STING), - LEVEL_UP_MOVE( 1, MOVE_STRING_SHOT), - LEVEL_UP_MOVE( 6, MOVE_SCARY_FACE), - LEVEL_UP_MOVE(11, MOVE_CONSTRICT), - LEVEL_UP_MOVE(17, MOVE_NIGHT_SHADE), - LEVEL_UP_MOVE(23, MOVE_LEECH_LIFE), - LEVEL_UP_MOVE(30, MOVE_FURY_SWIPES), - LEVEL_UP_MOVE(37, MOVE_SPIDER_WEB), - LEVEL_UP_MOVE(45, MOVE_AGILITY), - LEVEL_UP_MOVE(53, MOVE_PSYCHIC), - LEVEL_UP_END -}; - -static const u16 sAriadosLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_POISON_STING), - LEVEL_UP_MOVE( 1, MOVE_STRING_SHOT), - LEVEL_UP_MOVE( 1, MOVE_SCARY_FACE), - LEVEL_UP_MOVE( 1, MOVE_CONSTRICT), - LEVEL_UP_MOVE( 6, MOVE_SCARY_FACE), - LEVEL_UP_MOVE(11, MOVE_CONSTRICT), - LEVEL_UP_MOVE(17, MOVE_NIGHT_SHADE), - LEVEL_UP_MOVE(25, MOVE_LEECH_LIFE), - LEVEL_UP_MOVE(34, MOVE_FURY_SWIPES), - LEVEL_UP_MOVE(43, MOVE_SPIDER_WEB), - LEVEL_UP_MOVE(53, MOVE_AGILITY), - LEVEL_UP_MOVE(63, MOVE_PSYCHIC), - LEVEL_UP_END -}; - -static const u16 sCrobatLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_SCREECH), - LEVEL_UP_MOVE( 1, MOVE_LEECH_LIFE), - LEVEL_UP_MOVE( 1, MOVE_SUPERSONIC), - LEVEL_UP_MOVE( 1, MOVE_ASTONISH), - LEVEL_UP_MOVE( 6, MOVE_SUPERSONIC), - LEVEL_UP_MOVE(11, MOVE_ASTONISH), - LEVEL_UP_MOVE(16, MOVE_BITE), - LEVEL_UP_MOVE(21, MOVE_WING_ATTACK), - LEVEL_UP_MOVE(28, MOVE_CONFUSE_RAY), - LEVEL_UP_MOVE(35, MOVE_AIR_CUTTER), - LEVEL_UP_MOVE(42, MOVE_MEAN_LOOK), - LEVEL_UP_MOVE(49, MOVE_POISON_FANG), - LEVEL_UP_MOVE(56, MOVE_HAZE), - LEVEL_UP_END -}; - -static const u16 sChinchouLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_BUBBLE), - LEVEL_UP_MOVE( 1, MOVE_THUNDER_WAVE), - LEVEL_UP_MOVE( 5, MOVE_SUPERSONIC), - LEVEL_UP_MOVE(13, MOVE_FLAIL), - LEVEL_UP_MOVE(17, MOVE_WATER_GUN), - LEVEL_UP_MOVE(25, MOVE_SPARK), - LEVEL_UP_MOVE(29, MOVE_CONFUSE_RAY), - LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(41, MOVE_HYDRO_PUMP), - LEVEL_UP_MOVE(49, MOVE_CHARGE), - LEVEL_UP_END -}; - -static const u16 sLanturnLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_BUBBLE), - LEVEL_UP_MOVE( 1, MOVE_THUNDER_WAVE), - LEVEL_UP_MOVE( 1, MOVE_SUPERSONIC), - LEVEL_UP_MOVE( 5, MOVE_SUPERSONIC), - LEVEL_UP_MOVE(13, MOVE_FLAIL), - LEVEL_UP_MOVE(17, MOVE_WATER_GUN), - LEVEL_UP_MOVE(25, MOVE_SPARK), - LEVEL_UP_MOVE(32, MOVE_CONFUSE_RAY), - LEVEL_UP_MOVE(43, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(50, MOVE_HYDRO_PUMP), - LEVEL_UP_MOVE(61, MOVE_CHARGE), - LEVEL_UP_END -}; - -static const u16 sPichuLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_THUNDER_SHOCK), - LEVEL_UP_MOVE( 1, MOVE_CHARM), - LEVEL_UP_MOVE( 6, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 8, MOVE_THUNDER_WAVE), - LEVEL_UP_MOVE(11, MOVE_SWEET_KISS), - LEVEL_UP_END -}; - -static const u16 sCleffaLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_POUND), - LEVEL_UP_MOVE( 1, MOVE_CHARM), - LEVEL_UP_MOVE( 4, MOVE_ENCORE), - LEVEL_UP_MOVE( 8, MOVE_SING), - LEVEL_UP_MOVE(13, MOVE_SWEET_KISS), - LEVEL_UP_END -}; - -static const u16 sIgglybuffLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_SING), - LEVEL_UP_MOVE( 1, MOVE_CHARM), - LEVEL_UP_MOVE( 4, MOVE_DEFENSE_CURL), - LEVEL_UP_MOVE( 9, MOVE_POUND), - LEVEL_UP_MOVE(14, MOVE_SWEET_KISS), - LEVEL_UP_END -}; - -static const u16 sTogepiLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 1, MOVE_CHARM), - LEVEL_UP_MOVE( 6, MOVE_METRONOME), - LEVEL_UP_MOVE(11, MOVE_SWEET_KISS), - LEVEL_UP_MOVE(16, MOVE_YAWN), - LEVEL_UP_MOVE(21, MOVE_ENCORE), - LEVEL_UP_MOVE(26, MOVE_FOLLOW_ME), - LEVEL_UP_MOVE(31, MOVE_WISH), - LEVEL_UP_MOVE(36, MOVE_SAFEGUARD), - LEVEL_UP_MOVE(41, MOVE_DOUBLE_EDGE), - LEVEL_UP_END -}; - -static const u16 sTogeticLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 1, MOVE_CHARM), - LEVEL_UP_MOVE( 6, MOVE_METRONOME), - LEVEL_UP_MOVE(11, MOVE_SWEET_KISS), - LEVEL_UP_MOVE(16, MOVE_YAWN), - LEVEL_UP_MOVE(21, MOVE_ENCORE), - LEVEL_UP_MOVE(26, MOVE_FOLLOW_ME), - LEVEL_UP_MOVE(31, MOVE_WISH), - LEVEL_UP_MOVE(36, MOVE_SAFEGUARD), - LEVEL_UP_MOVE(41, MOVE_DOUBLE_EDGE), - LEVEL_UP_END -}; - -static const u16 sNatuLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_PECK), - LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE(10, MOVE_NIGHT_SHADE), - LEVEL_UP_MOVE(20, MOVE_TELEPORT), - LEVEL_UP_MOVE(30, MOVE_WISH), - LEVEL_UP_MOVE(30, MOVE_FUTURE_SIGHT), - LEVEL_UP_MOVE(40, MOVE_CONFUSE_RAY), - LEVEL_UP_MOVE(50, MOVE_PSYCHIC), - LEVEL_UP_END -}; - -static const u16 sXatuLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_PECK), - LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE(10, MOVE_NIGHT_SHADE), - LEVEL_UP_MOVE(20, MOVE_TELEPORT), - LEVEL_UP_MOVE(35, MOVE_WISH), - LEVEL_UP_MOVE(35, MOVE_FUTURE_SIGHT), - LEVEL_UP_MOVE(50, MOVE_CONFUSE_RAY), - LEVEL_UP_MOVE(65, MOVE_PSYCHIC), - LEVEL_UP_END -}; - -static const u16 sMareepLevelUpLearnset[] = { +static const struct LevelUpMove sVaporeonLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 1, MOVE_HELPING_HAND), LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 9, MOVE_THUNDER_SHOCK), - LEVEL_UP_MOVE(16, MOVE_THUNDER_WAVE), - LEVEL_UP_MOVE(23, MOVE_COTTON_SPORE), - LEVEL_UP_MOVE(30, MOVE_LIGHT_SCREEN), - LEVEL_UP_MOVE(37, MOVE_THUNDER), - LEVEL_UP_END -}; - -static const u16 sFlaaffyLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 1, MOVE_THUNDER_SHOCK), - LEVEL_UP_MOVE( 9, MOVE_THUNDER_SHOCK), - LEVEL_UP_MOVE(18, MOVE_THUNDER_WAVE), - LEVEL_UP_MOVE(27, MOVE_COTTON_SPORE), - LEVEL_UP_MOVE(36, MOVE_LIGHT_SCREEN), - LEVEL_UP_MOVE(45, MOVE_THUNDER), - LEVEL_UP_END -}; - -static const u16 sAmpharosLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 1, MOVE_THUNDER_SHOCK), - LEVEL_UP_MOVE( 1, MOVE_THUNDER_WAVE), - LEVEL_UP_MOVE( 9, MOVE_THUNDER_SHOCK), - LEVEL_UP_MOVE(18, MOVE_THUNDER_WAVE), - LEVEL_UP_MOVE(27, MOVE_COTTON_SPORE), - LEVEL_UP_MOVE(30, MOVE_THUNDER_PUNCH), - LEVEL_UP_MOVE(42, MOVE_LIGHT_SCREEN), - LEVEL_UP_MOVE(57, MOVE_THUNDER), - LEVEL_UP_END -}; - -static const u16 sBellossomLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_ABSORB), - LEVEL_UP_MOVE( 1, MOVE_SWEET_SCENT), - LEVEL_UP_MOVE( 1, MOVE_STUN_SPORE), - LEVEL_UP_MOVE( 1, MOVE_MAGICAL_LEAF), - LEVEL_UP_MOVE(44, MOVE_PETAL_DANCE), - LEVEL_UP_MOVE(55, MOVE_SOLAR_BEAM), - LEVEL_UP_END -}; - -static const u16 sMarillLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 3, MOVE_DEFENSE_CURL), - LEVEL_UP_MOVE( 6, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE(10, MOVE_WATER_GUN), - LEVEL_UP_MOVE(15, MOVE_ROLLOUT), - LEVEL_UP_MOVE(21, MOVE_BUBBLE_BEAM), - LEVEL_UP_MOVE(28, MOVE_DOUBLE_EDGE), - LEVEL_UP_MOVE(36, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 5, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 9, MOVE_BABY_DOLL_EYES), + LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(17, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(20, MOVE_AURORA_BEAM), + LEVEL_UP_MOVE(25, MOVE_AQUA_RING), + LEVEL_UP_MOVE(29, MOVE_ACID_ARMOR), + LEVEL_UP_MOVE(33, MOVE_HAZE), + LEVEL_UP_MOVE(37, MOVE_MUDDY_WATER), + LEVEL_UP_MOVE(41, MOVE_LAST_RESORT), LEVEL_UP_MOVE(45, MOVE_HYDRO_PUMP), LEVEL_UP_END }; -static const u16 sAzumarillLevelUpLearnset[] = { +static const struct LevelUpMove sJolteonLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE( 1, MOVE_HELPING_HAND), LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 1, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), - LEVEL_UP_MOVE( 3, MOVE_DEFENSE_CURL), - LEVEL_UP_MOVE( 6, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 5, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 9, MOVE_BABY_DOLL_EYES), + LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(17, MOVE_DOUBLE_KICK), + LEVEL_UP_MOVE(20, MOVE_THUNDER_FANG), + LEVEL_UP_MOVE(25, MOVE_PIN_MISSILE), + LEVEL_UP_MOVE(29, MOVE_AGILITY), + LEVEL_UP_MOVE(33, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE(37, MOVE_DISCHARGE), + LEVEL_UP_MOVE(41, MOVE_LAST_RESORT), + LEVEL_UP_MOVE(45, MOVE_THUNDER), + LEVEL_UP_END +}; + +static const struct LevelUpMove sFlareonLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_EMBER), + LEVEL_UP_MOVE( 1, MOVE_EMBER), + LEVEL_UP_MOVE( 1, MOVE_HELPING_HAND), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 5, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 9, MOVE_BABY_DOLL_EYES), + LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(17, MOVE_BITE), + LEVEL_UP_MOVE(20, MOVE_FIRE_FANG), + LEVEL_UP_MOVE(25, MOVE_FIRE_SPIN), + LEVEL_UP_MOVE(29, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(33, MOVE_SMOG), + LEVEL_UP_MOVE(37, MOVE_LAVA_PLUME), + LEVEL_UP_MOVE(41, MOVE_LAST_RESORT), + LEVEL_UP_MOVE(45, MOVE_FLARE_BLITZ), + LEVEL_UP_END +}; + +static const struct LevelUpMove sPorygon2LevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_CONVERSION_2), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_CONVERSION), + LEVEL_UP_MOVE( 1, MOVE_SHARPEN), + LEVEL_UP_MOVE( 7, MOVE_PSYBEAM), + LEVEL_UP_MOVE(12, MOVE_AGILITY), + LEVEL_UP_MOVE(18, MOVE_RECOVER), + LEVEL_UP_MOVE(23, MOVE_MAGNET_RISE), + LEVEL_UP_MOVE(29, MOVE_SIGNAL_BEAM), + LEVEL_UP_MOVE(34, MOVE_RECYCLE), + LEVEL_UP_MOVE(40, MOVE_DISCHARGE), + LEVEL_UP_MOVE(45, MOVE_LOCK_ON), + LEVEL_UP_MOVE(50, MOVE_TRI_ATTACK), + LEVEL_UP_MOVE(56, MOVE_MAGIC_COAT), + LEVEL_UP_MOVE(62, MOVE_ZAP_CANNON), + LEVEL_UP_END +}; + +static const struct LevelUpMove sOmanyteLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_CONSTRICT), + LEVEL_UP_MOVE( 1, MOVE_WITHDRAW), + LEVEL_UP_MOVE( 7, MOVE_BITE), LEVEL_UP_MOVE(10, MOVE_WATER_GUN), - LEVEL_UP_MOVE(15, MOVE_ROLLOUT), - LEVEL_UP_MOVE(24, MOVE_BUBBLE_BEAM), - LEVEL_UP_MOVE(34, MOVE_DOUBLE_EDGE), - LEVEL_UP_MOVE(45, MOVE_RAIN_DANCE), - LEVEL_UP_MOVE(57, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(16, MOVE_ROLLOUT), + LEVEL_UP_MOVE(19, MOVE_LEER), + LEVEL_UP_MOVE(25, MOVE_MUD_SHOT), + LEVEL_UP_MOVE(28, MOVE_BRINE), + LEVEL_UP_MOVE(34, MOVE_PROTECT), + LEVEL_UP_MOVE(37, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(43, MOVE_TICKLE), + LEVEL_UP_MOVE(46, MOVE_ROCK_BLAST), + LEVEL_UP_MOVE(50, MOVE_SHELL_SMASH), + LEVEL_UP_MOVE(55, MOVE_HYDRO_PUMP), LEVEL_UP_END }; -static const u16 sSudowoodoLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_ROCK_THROW), - LEVEL_UP_MOVE( 1, MOVE_MIMIC), - LEVEL_UP_MOVE( 9, MOVE_FLAIL), - LEVEL_UP_MOVE(17, MOVE_LOW_KICK), - LEVEL_UP_MOVE(25, MOVE_ROCK_SLIDE), - LEVEL_UP_MOVE(33, MOVE_BLOCK), - LEVEL_UP_MOVE(41, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE(49, MOVE_SLAM), - LEVEL_UP_MOVE(57, MOVE_DOUBLE_EDGE), +static const struct LevelUpMove sOmastarLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_SPIKE_CANNON), + LEVEL_UP_MOVE( 1, MOVE_SPIKE_CANNON), + LEVEL_UP_MOVE( 1, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE( 1, MOVE_CONSTRICT), + LEVEL_UP_MOVE( 1, MOVE_WITHDRAW), + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 7, MOVE_BITE), + LEVEL_UP_MOVE(10, MOVE_WATER_GUN), + LEVEL_UP_MOVE(16, MOVE_ROLLOUT), + LEVEL_UP_MOVE(19, MOVE_LEER), + LEVEL_UP_MOVE(25, MOVE_MUD_SHOT), + LEVEL_UP_MOVE(28, MOVE_BRINE), + LEVEL_UP_MOVE(34, MOVE_PROTECT), + LEVEL_UP_MOVE(37, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(48, MOVE_TICKLE), + LEVEL_UP_MOVE(56, MOVE_ROCK_BLAST), + LEVEL_UP_MOVE(67, MOVE_SHELL_SMASH), + LEVEL_UP_MOVE(75, MOVE_HYDRO_PUMP), LEVEL_UP_END }; -static const u16 sPolitoedLevelUpLearnset[] = { +static const struct LevelUpMove sKabutoLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 6, MOVE_ABSORB), + LEVEL_UP_MOVE(11, MOVE_LEER), + LEVEL_UP_MOVE(16, MOVE_MUD_SHOT), + LEVEL_UP_MOVE(21, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(26, MOVE_ENDURE), + LEVEL_UP_MOVE(31, MOVE_AQUA_JET), + LEVEL_UP_MOVE(36, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(41, MOVE_METAL_SOUND), + LEVEL_UP_MOVE(46, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(50, MOVE_WRING_OUT), + LEVEL_UP_END +}; + +static const struct LevelUpMove sKabutopsLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_SLASH), + LEVEL_UP_MOVE( 1, MOVE_SLASH), + LEVEL_UP_MOVE( 1, MOVE_NIGHT_SLASH), + LEVEL_UP_MOVE( 1, MOVE_FEINT), + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 1, MOVE_ABSORB), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 6, MOVE_ABSORB), + LEVEL_UP_MOVE(11, MOVE_LEER), + LEVEL_UP_MOVE(16, MOVE_MUD_SHOT), + LEVEL_UP_MOVE(21, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(26, MOVE_ENDURE), + LEVEL_UP_MOVE(31, MOVE_AQUA_JET), + LEVEL_UP_MOVE(36, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(45, MOVE_METAL_SOUND), + LEVEL_UP_MOVE(54, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(63, MOVE_WRING_OUT), + LEVEL_UP_MOVE(72, MOVE_NIGHT_SLASH), + LEVEL_UP_END +}; + +static const struct LevelUpMove sAerodactylLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_IRON_HEAD), + LEVEL_UP_MOVE( 1, MOVE_ICE_FANG), + LEVEL_UP_MOVE( 1, MOVE_FIRE_FANG), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_FANG), + LEVEL_UP_MOVE( 1, MOVE_WING_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 1, MOVE_SCARY_FACE), + LEVEL_UP_MOVE( 9, MOVE_ROAR), + LEVEL_UP_MOVE(17, MOVE_AGILITY), + LEVEL_UP_MOVE(25, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(33, MOVE_CRUNCH), + LEVEL_UP_MOVE(41, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(49, MOVE_SKY_DROP), + LEVEL_UP_MOVE(57, MOVE_IRON_HEAD), + LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM), + LEVEL_UP_MOVE(73, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(81, MOVE_GIGA_IMPACT), + LEVEL_UP_END +}; + +static const struct LevelUpMove sSnorlaxLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 4, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE( 9, MOVE_AMNESIA), + LEVEL_UP_MOVE(12, MOVE_LICK), + LEVEL_UP_MOVE(17, MOVE_CHIP_AWAY), + LEVEL_UP_MOVE(20, MOVE_YAWN), + LEVEL_UP_MOVE(25, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(28, MOVE_REST), + LEVEL_UP_MOVE(28, MOVE_SNORE), + LEVEL_UP_MOVE(33, MOVE_SLEEP_TALK), + LEVEL_UP_MOVE(35, MOVE_GIGA_IMPACT), + LEVEL_UP_MOVE(36, MOVE_ROLLOUT), + LEVEL_UP_MOVE(41, MOVE_BLOCK), + LEVEL_UP_MOVE(44, MOVE_BELLY_DRUM), + LEVEL_UP_MOVE(49, MOVE_CRUNCH), + LEVEL_UP_MOVE(50, MOVE_HEAVY_SLAM), + LEVEL_UP_MOVE(57, MOVE_HIGH_HORSEPOWER), + LEVEL_UP_END +}; + +static const struct LevelUpMove sArticunoLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_GUST), + LEVEL_UP_MOVE( 1, MOVE_POWDER_SNOW), + LEVEL_UP_MOVE( 8, MOVE_MIST), + LEVEL_UP_MOVE(15, MOVE_ICE_SHARD), + LEVEL_UP_MOVE(22, MOVE_MIND_READER), + LEVEL_UP_MOVE(29, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(36, MOVE_AGILITY), + LEVEL_UP_MOVE(43, MOVE_FREEZE_DRY), + LEVEL_UP_MOVE(50, MOVE_REFLECT), + LEVEL_UP_MOVE(57, MOVE_HAIL), + LEVEL_UP_MOVE(64, MOVE_TAILWIND), + LEVEL_UP_MOVE(71, MOVE_ICE_BEAM), + LEVEL_UP_MOVE(78, MOVE_BLIZZARD), + LEVEL_UP_MOVE(85, MOVE_ROOST), + LEVEL_UP_MOVE(92, MOVE_HURRICANE), + LEVEL_UP_MOVE(99, MOVE_SHEER_COLD), + LEVEL_UP_END +}; + +static const struct LevelUpMove sZapdosLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_PECK), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE( 8, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE(15, MOVE_DETECT), + LEVEL_UP_MOVE(22, MOVE_PLUCK), + LEVEL_UP_MOVE(29, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(36, MOVE_CHARGE), + LEVEL_UP_MOVE(43, MOVE_AGILITY), + LEVEL_UP_MOVE(50, MOVE_DISCHARGE), + LEVEL_UP_MOVE(57, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(64, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(71, MOVE_DRILL_PECK), + LEVEL_UP_MOVE(78, MOVE_THUNDER), + LEVEL_UP_MOVE(85, MOVE_ROOST), + LEVEL_UP_MOVE(92, MOVE_MAGNETIC_FLUX), + LEVEL_UP_MOVE(99, MOVE_ZAP_CANNON), + LEVEL_UP_END +}; + +static const struct LevelUpMove sMoltresLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WING_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_EMBER), + LEVEL_UP_MOVE( 8, MOVE_FIRE_SPIN), + LEVEL_UP_MOVE(15, MOVE_AGILITY), + LEVEL_UP_MOVE(22, MOVE_ENDURE), + LEVEL_UP_MOVE(29, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(36, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(43, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(50, MOVE_AIR_SLASH), + LEVEL_UP_MOVE(57, MOVE_SUNNY_DAY), + LEVEL_UP_MOVE(64, MOVE_HEAT_WAVE), + LEVEL_UP_MOVE(71, MOVE_SOLAR_BEAM), + LEVEL_UP_MOVE(78, MOVE_SKY_ATTACK), + LEVEL_UP_MOVE(85, MOVE_ROOST), + LEVEL_UP_MOVE(92, MOVE_HURRICANE), + LEVEL_UP_MOVE(99, MOVE_BURN_UP), + LEVEL_UP_END +}; + +static const struct LevelUpMove sDratiniLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WRAP), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 5, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE(11, MOVE_TWISTER), + LEVEL_UP_MOVE(15, MOVE_DRAGON_RAGE), + LEVEL_UP_MOVE(21, MOVE_SLAM), + LEVEL_UP_MOVE(25, MOVE_AGILITY), + LEVEL_UP_MOVE(31, MOVE_DRAGON_TAIL), + LEVEL_UP_MOVE(35, MOVE_AQUA_TAIL), + LEVEL_UP_MOVE(41, MOVE_DRAGON_RUSH), + LEVEL_UP_MOVE(45, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(51, MOVE_DRAGON_DANCE), + LEVEL_UP_MOVE(55, MOVE_OUTRAGE), + LEVEL_UP_MOVE(61, MOVE_HYPER_BEAM), + LEVEL_UP_END +}; + +static const struct LevelUpMove sDragonairLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WRAP), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE( 1, MOVE_TWISTER), + LEVEL_UP_MOVE( 5, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE(11, MOVE_TWISTER), + LEVEL_UP_MOVE(15, MOVE_DRAGON_RAGE), + LEVEL_UP_MOVE(21, MOVE_SLAM), + LEVEL_UP_MOVE(25, MOVE_AGILITY), + LEVEL_UP_MOVE(33, MOVE_DRAGON_TAIL), + LEVEL_UP_MOVE(39, MOVE_AQUA_TAIL), + LEVEL_UP_MOVE(47, MOVE_DRAGON_RUSH), + LEVEL_UP_MOVE(53, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(61, MOVE_DRAGON_DANCE), + LEVEL_UP_MOVE(67, MOVE_OUTRAGE), + LEVEL_UP_MOVE(75, MOVE_HYPER_BEAM), + LEVEL_UP_END +}; + +static const struct LevelUpMove sDragoniteLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_WING_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_WING_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_HURRICANE), + LEVEL_UP_MOVE( 1, MOVE_FIRE_PUNCH), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_PUNCH), + LEVEL_UP_MOVE( 1, MOVE_ROOST), + LEVEL_UP_MOVE( 1, MOVE_WRAP), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE( 1, MOVE_TWISTER), + LEVEL_UP_MOVE( 5, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE(11, MOVE_TWISTER), + LEVEL_UP_MOVE(15, MOVE_DRAGON_RAGE), + LEVEL_UP_MOVE(21, MOVE_SLAM), + LEVEL_UP_MOVE(25, MOVE_AGILITY), + LEVEL_UP_MOVE(33, MOVE_DRAGON_TAIL), + LEVEL_UP_MOVE(39, MOVE_AQUA_TAIL), + LEVEL_UP_MOVE(47, MOVE_DRAGON_RUSH), + LEVEL_UP_MOVE(53, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(61, MOVE_DRAGON_DANCE), + LEVEL_UP_MOVE(67, MOVE_OUTRAGE), + LEVEL_UP_MOVE(75, MOVE_HYPER_BEAM), + LEVEL_UP_MOVE(81, MOVE_HURRICANE), + LEVEL_UP_END +}; + +static const struct LevelUpMove sMewtwoLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_LASER_FOCUS), + LEVEL_UP_MOVE( 1, MOVE_PSYWAVE), + LEVEL_UP_MOVE( 1, MOVE_CONFUSION), + LEVEL_UP_MOVE( 1, MOVE_DISABLE), + LEVEL_UP_MOVE( 1, MOVE_SAFEGUARD), + LEVEL_UP_MOVE( 8, MOVE_SWIFT), + LEVEL_UP_MOVE(15, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(22, MOVE_PSYCH_UP), + LEVEL_UP_MOVE(29, MOVE_MIRACLE_EYE), + LEVEL_UP_MOVE(36, MOVE_PSYCHO_CUT), + LEVEL_UP_MOVE(43, MOVE_POWER_SWAP), + LEVEL_UP_MOVE(43, MOVE_GUARD_SWAP), + LEVEL_UP_MOVE(50, MOVE_RECOVER), + LEVEL_UP_MOVE(57, MOVE_PSYCHIC), + LEVEL_UP_MOVE(64, MOVE_BARRIER), + LEVEL_UP_MOVE(70, MOVE_AURA_SPHERE), + LEVEL_UP_MOVE(79, MOVE_AMNESIA), + LEVEL_UP_MOVE(86, MOVE_MIST), + LEVEL_UP_MOVE(93, MOVE_ME_FIRST), + LEVEL_UP_END +}; + +static const struct LevelUpMove sMewLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 1, MOVE_REFLECT_TYPE), + LEVEL_UP_MOVE( 1, MOVE_TRANSFORM), + LEVEL_UP_MOVE(10, MOVE_MEGA_PUNCH), + LEVEL_UP_MOVE(20, MOVE_METRONOME), + LEVEL_UP_MOVE(30, MOVE_PSYCHIC), + LEVEL_UP_MOVE(40, MOVE_BARRIER), + LEVEL_UP_MOVE(50, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(60, MOVE_AMNESIA), + LEVEL_UP_MOVE(70, MOVE_ME_FIRST), + LEVEL_UP_MOVE(80, MOVE_BATON_PASS), + LEVEL_UP_MOVE(90, MOVE_NASTY_PLOT), + LEVEL_UP_END +}; + +static const struct LevelUpMove sChikoritaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 6, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE( 9, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(12, MOVE_SYNTHESIS), + LEVEL_UP_MOVE(17, MOVE_REFLECT), + LEVEL_UP_MOVE(20, MOVE_MAGICAL_LEAF), + LEVEL_UP_MOVE(23, MOVE_NATURAL_GIFT), + LEVEL_UP_MOVE(28, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE(31, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(34, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(39, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(42, MOVE_AROMATHERAPY), + LEVEL_UP_MOVE(45, MOVE_SOLAR_BEAM), + LEVEL_UP_END +}; + +static const struct LevelUpMove sBayleefLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE( 1, MOVE_POISON_POWDER), + LEVEL_UP_MOVE( 6, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE( 9, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(12, MOVE_SYNTHESIS), + LEVEL_UP_MOVE(18, MOVE_REFLECT), + LEVEL_UP_MOVE(22, MOVE_MAGICAL_LEAF), + LEVEL_UP_MOVE(26, MOVE_NATURAL_GIFT), + LEVEL_UP_MOVE(32, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE(36, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(40, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(46, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(50, MOVE_AROMATHERAPY), + LEVEL_UP_MOVE(54, MOVE_SOLAR_BEAM), + LEVEL_UP_END +}; + +static const struct LevelUpMove sMeganiumLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_PETAL_DANCE), + LEVEL_UP_MOVE( 1, MOVE_PETAL_DANCE), + LEVEL_UP_MOVE( 1, MOVE_PETAL_BLIZZARD), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE( 1, MOVE_POISON_POWDER), + LEVEL_UP_MOVE( 6, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE( 9, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(12, MOVE_SYNTHESIS), + LEVEL_UP_MOVE(18, MOVE_REFLECT), + LEVEL_UP_MOVE(22, MOVE_MAGICAL_LEAF), + LEVEL_UP_MOVE(26, MOVE_NATURAL_GIFT), + LEVEL_UP_MOVE(34, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE(40, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(46, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(54, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(60, MOVE_AROMATHERAPY), + LEVEL_UP_MOVE(66, MOVE_SOLAR_BEAM), + LEVEL_UP_MOVE(70, MOVE_PETAL_BLIZZARD), + LEVEL_UP_END +}; + +static const struct LevelUpMove sCyndaquilLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 6, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE(10, MOVE_EMBER), + LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(19, MOVE_FLAME_WHEEL), + LEVEL_UP_MOVE(22, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE(28, MOVE_FLAME_CHARGE), + LEVEL_UP_MOVE(31, MOVE_SWIFT), + LEVEL_UP_MOVE(37, MOVE_LAVA_PLUME), + LEVEL_UP_MOVE(40, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(46, MOVE_INFERNO), + LEVEL_UP_MOVE(49, MOVE_ROLLOUT), + LEVEL_UP_MOVE(55, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(58, MOVE_BURN_UP), + LEVEL_UP_MOVE(64, MOVE_ERUPTION), + LEVEL_UP_END +}; + +static const struct LevelUpMove sQuilavaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE( 6, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE(10, MOVE_EMBER), + LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(20, MOVE_FLAME_WHEEL), + LEVEL_UP_MOVE(24, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE(31, MOVE_SWIFT), + LEVEL_UP_MOVE(35, MOVE_FLAME_CHARGE), + LEVEL_UP_MOVE(42, MOVE_LAVA_PLUME), + LEVEL_UP_MOVE(46, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(53, MOVE_INFERNO), + LEVEL_UP_MOVE(57, MOVE_ROLLOUT), + LEVEL_UP_MOVE(64, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(68, MOVE_BURN_UP), + LEVEL_UP_MOVE(75, MOVE_ERUPTION), + LEVEL_UP_END +}; + +static const struct LevelUpMove sTyphlosionLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ERUPTION), + LEVEL_UP_MOVE( 1, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE( 1, MOVE_GYRO_BALL), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE( 1, MOVE_EMBER), + LEVEL_UP_MOVE( 6, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE(10, MOVE_EMBER), + LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(20, MOVE_FLAME_WHEEL), + LEVEL_UP_MOVE(24, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE(31, MOVE_SWIFT), + LEVEL_UP_MOVE(35, MOVE_FLAME_CHARGE), + LEVEL_UP_MOVE(43, MOVE_LAVA_PLUME), + LEVEL_UP_MOVE(48, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(56, MOVE_INFERNO), + LEVEL_UP_MOVE(61, MOVE_ROLLOUT), + LEVEL_UP_MOVE(69, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(74, MOVE_BURN_UP), + LEVEL_UP_MOVE(82, MOVE_ERUPTION), + LEVEL_UP_END +}; + +static const struct LevelUpMove sTotodileLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 6, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 8, MOVE_RAGE), + LEVEL_UP_MOVE(13, MOVE_BITE), + LEVEL_UP_MOVE(15, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(20, MOVE_ICE_FANG), + LEVEL_UP_MOVE(22, MOVE_FLAIL), + LEVEL_UP_MOVE(27, MOVE_CRUNCH), + LEVEL_UP_MOVE(29, MOVE_CHIP_AWAY), + LEVEL_UP_MOVE(34, MOVE_SLASH), + LEVEL_UP_MOVE(36, MOVE_SCREECH), + LEVEL_UP_MOVE(41, MOVE_THRASH), + LEVEL_UP_MOVE(43, MOVE_AQUA_TAIL), + LEVEL_UP_MOVE(48, MOVE_SUPERPOWER), + LEVEL_UP_MOVE(50, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +static const struct LevelUpMove sCroconawLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 6, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 8, MOVE_RAGE), + LEVEL_UP_MOVE(13, MOVE_BITE), + LEVEL_UP_MOVE(15, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(21, MOVE_ICE_FANG), + LEVEL_UP_MOVE(24, MOVE_FLAIL), + LEVEL_UP_MOVE(30, MOVE_CRUNCH), + LEVEL_UP_MOVE(33, MOVE_CHIP_AWAY), + LEVEL_UP_MOVE(39, MOVE_SLASH), + LEVEL_UP_MOVE(42, MOVE_SCREECH), + LEVEL_UP_MOVE(48, MOVE_THRASH), + LEVEL_UP_MOVE(51, MOVE_AQUA_TAIL), + LEVEL_UP_MOVE(57, MOVE_SUPERPOWER), + LEVEL_UP_MOVE(60, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +static const struct LevelUpMove sFeraligatrLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_AGILITY), + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 1, MOVE_RAGE), + LEVEL_UP_MOVE( 6, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 8, MOVE_RAGE), + LEVEL_UP_MOVE(13, MOVE_BITE), + LEVEL_UP_MOVE(15, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(21, MOVE_ICE_FANG), + LEVEL_UP_MOVE(24, MOVE_FLAIL), + LEVEL_UP_MOVE(32, MOVE_CRUNCH), + LEVEL_UP_MOVE(37, MOVE_CHIP_AWAY), + LEVEL_UP_MOVE(45, MOVE_SLASH), + LEVEL_UP_MOVE(50, MOVE_SCREECH), + LEVEL_UP_MOVE(58, MOVE_THRASH), + LEVEL_UP_MOVE(63, MOVE_AQUA_TAIL), + LEVEL_UP_MOVE(71, MOVE_SUPERPOWER), + LEVEL_UP_MOVE(76, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +static const struct LevelUpMove sSentretLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_FORESIGHT), + LEVEL_UP_MOVE( 4, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE( 7, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(13, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(16, MOVE_HELPING_HAND), + LEVEL_UP_MOVE(19, MOVE_FOLLOW_ME), + LEVEL_UP_MOVE(25, MOVE_SLAM), + LEVEL_UP_MOVE(28, MOVE_REST), + LEVEL_UP_MOVE(31, MOVE_SUCKER_PUNCH), + LEVEL_UP_MOVE(36, MOVE_AMNESIA), + LEVEL_UP_MOVE(39, MOVE_BATON_PASS), + LEVEL_UP_MOVE(42, MOVE_ME_FIRST), + LEVEL_UP_MOVE(47, MOVE_HYPER_VOICE), + LEVEL_UP_END +}; + +static const struct LevelUpMove sFurretLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_AGILITY), + LEVEL_UP_MOVE( 1, MOVE_AGILITY), + LEVEL_UP_MOVE( 1, MOVE_COIL), + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_FORESIGHT), + LEVEL_UP_MOVE( 1, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 4, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE( 7, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(13, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(17, MOVE_HELPING_HAND), + LEVEL_UP_MOVE(21, MOVE_FOLLOW_ME), + LEVEL_UP_MOVE(28, MOVE_SLAM), + LEVEL_UP_MOVE(32, MOVE_REST), + LEVEL_UP_MOVE(36, MOVE_SUCKER_PUNCH), + LEVEL_UP_MOVE(42, MOVE_AMNESIA), + LEVEL_UP_MOVE(46, MOVE_BATON_PASS), + LEVEL_UP_MOVE(50, MOVE_ME_FIRST), + LEVEL_UP_MOVE(56, MOVE_HYPER_VOICE), + LEVEL_UP_END +}; + +static const struct LevelUpMove sHoothootLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_FORESIGHT), + LEVEL_UP_MOVE( 4, MOVE_HYPNOSIS), + LEVEL_UP_MOVE( 7, MOVE_PECK), + LEVEL_UP_MOVE(10, MOVE_CONFUSION), + LEVEL_UP_MOVE(13, MOVE_ECHOED_VOICE), + LEVEL_UP_MOVE(16, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(19, MOVE_PSYCHO_SHIFT), + LEVEL_UP_MOVE(22, MOVE_EXTRASENSORY), + LEVEL_UP_MOVE(25, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(28, MOVE_REFLECT), + LEVEL_UP_MOVE(31, MOVE_AIR_SLASH), + LEVEL_UP_MOVE(34, MOVE_UPROAR), + LEVEL_UP_MOVE(37, MOVE_ROOST), + LEVEL_UP_MOVE(40, MOVE_MOONBLAST), + LEVEL_UP_MOVE(43, MOVE_SYNCHRONOISE), + LEVEL_UP_MOVE(46, MOVE_DREAM_EATER), + LEVEL_UP_END +}; + +static const struct LevelUpMove sNoctowlLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_DREAM_EATER), + LEVEL_UP_MOVE( 1, MOVE_SKY_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_FORESIGHT), + LEVEL_UP_MOVE( 1, MOVE_HYPNOSIS), + LEVEL_UP_MOVE( 4, MOVE_HYPNOSIS), + LEVEL_UP_MOVE( 7, MOVE_PECK), + LEVEL_UP_MOVE(10, MOVE_CONFUSION), + LEVEL_UP_MOVE(13, MOVE_ECHOED_VOICE), + LEVEL_UP_MOVE(16, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(19, MOVE_PSYCHO_SHIFT), + LEVEL_UP_MOVE(23, MOVE_EXTRASENSORY), + LEVEL_UP_MOVE(27, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(31, MOVE_REFLECT), + LEVEL_UP_MOVE(35, MOVE_AIR_SLASH), + LEVEL_UP_MOVE(39, MOVE_UPROAR), + LEVEL_UP_MOVE(43, MOVE_ROOST), + LEVEL_UP_MOVE(47, MOVE_MOONBLAST), + LEVEL_UP_MOVE(51, MOVE_SYNCHRONOISE), + LEVEL_UP_MOVE(55, MOVE_DREAM_EATER), + LEVEL_UP_END +}; + +static const struct LevelUpMove sLedybaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 5, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 8, MOVE_SWIFT), + LEVEL_UP_MOVE(12, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(12, MOVE_REFLECT), + LEVEL_UP_MOVE(12, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(15, MOVE_MACH_PUNCH), + LEVEL_UP_MOVE(19, MOVE_SILVER_WIND), + LEVEL_UP_MOVE(22, MOVE_COMET_PUNCH), + LEVEL_UP_MOVE(26, MOVE_BATON_PASS), + LEVEL_UP_MOVE(29, MOVE_AGILITY), + LEVEL_UP_MOVE(33, MOVE_BUG_BUZZ), + LEVEL_UP_MOVE(36, MOVE_AIR_SLASH), + LEVEL_UP_MOVE(40, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +static const struct LevelUpMove sLedianLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 1, MOVE_SWIFT), + LEVEL_UP_MOVE( 5, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 8, MOVE_SWIFT), + LEVEL_UP_MOVE(12, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(12, MOVE_REFLECT), + LEVEL_UP_MOVE(12, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(15, MOVE_MACH_PUNCH), + LEVEL_UP_MOVE(20, MOVE_SILVER_WIND), + LEVEL_UP_MOVE(24, MOVE_COMET_PUNCH), + LEVEL_UP_MOVE(29, MOVE_BATON_PASS), + LEVEL_UP_MOVE(33, MOVE_AGILITY), + LEVEL_UP_MOVE(38, MOVE_BUG_BUZZ), + LEVEL_UP_MOVE(42, MOVE_AIR_SLASH), + LEVEL_UP_MOVE(47, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +static const struct LevelUpMove sSpinarakLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POISON_STING), + LEVEL_UP_MOVE( 1, MOVE_STRING_SHOT), + LEVEL_UP_MOVE( 1, MOVE_CONSTRICT), + LEVEL_UP_MOVE( 5, MOVE_ABSORB), + LEVEL_UP_MOVE( 8, MOVE_INFESTATION), + LEVEL_UP_MOVE(12, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(15, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE(19, MOVE_SHADOW_SNEAK), + LEVEL_UP_MOVE(22, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(26, MOVE_SUCKER_PUNCH), + LEVEL_UP_MOVE(29, MOVE_SPIDER_WEB), + LEVEL_UP_MOVE(33, MOVE_AGILITY), + LEVEL_UP_MOVE(36, MOVE_PIN_MISSILE), + LEVEL_UP_MOVE(40, MOVE_PSYCHIC), + LEVEL_UP_MOVE(43, MOVE_POISON_JAB), + LEVEL_UP_MOVE(47, MOVE_CROSS_POISON), + LEVEL_UP_MOVE(50, MOVE_STICKY_WEB), + LEVEL_UP_MOVE(54, MOVE_TOXIC_THREAD), + LEVEL_UP_END +}; + +static const struct LevelUpMove sAriadosLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_SWORDS_DANCE), + LEVEL_UP_MOVE( 1, MOVE_SWORDS_DANCE), + LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 1, MOVE_VENOM_DRENCH), + LEVEL_UP_MOVE( 1, MOVE_FELL_STINGER), + LEVEL_UP_MOVE( 1, MOVE_BUG_BITE), + LEVEL_UP_MOVE( 1, MOVE_POISON_STING), + LEVEL_UP_MOVE( 1, MOVE_STRING_SHOT), + LEVEL_UP_MOVE( 1, MOVE_CONSTRICT), + LEVEL_UP_MOVE( 1, MOVE_ABSORB), + LEVEL_UP_MOVE( 5, MOVE_ABSORB), + LEVEL_UP_MOVE( 8, MOVE_INFESTATION), + LEVEL_UP_MOVE(12, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(15, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE(19, MOVE_SHADOW_SNEAK), + LEVEL_UP_MOVE(23, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(28, MOVE_SUCKER_PUNCH), + LEVEL_UP_MOVE(32, MOVE_SPIDER_WEB), + LEVEL_UP_MOVE(37, MOVE_AGILITY), + LEVEL_UP_MOVE(41, MOVE_PIN_MISSILE), + LEVEL_UP_MOVE(46, MOVE_PSYCHIC), + LEVEL_UP_MOVE(50, MOVE_POISON_JAB), + LEVEL_UP_MOVE(55, MOVE_CROSS_POISON), + LEVEL_UP_MOVE(58, MOVE_STICKY_WEB), + LEVEL_UP_MOVE(63, MOVE_TOXIC_THREAD), + LEVEL_UP_END +}; + +static const struct LevelUpMove sCrobatLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_CROSS_POISON), + LEVEL_UP_MOVE( 1, MOVE_CROSS_POISON), + LEVEL_UP_MOVE( 1, MOVE_SCREECH), + LEVEL_UP_MOVE( 1, MOVE_ABSORB), + LEVEL_UP_MOVE( 1, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 1, MOVE_ASTONISH), + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 5, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 7, MOVE_ASTONISH), + LEVEL_UP_MOVE(11, MOVE_BITE), + LEVEL_UP_MOVE(13, MOVE_WING_ATTACK), + LEVEL_UP_MOVE(17, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(19, MOVE_AIR_CUTTER), + LEVEL_UP_MOVE(24, MOVE_SWIFT), + LEVEL_UP_MOVE(27, MOVE_POISON_FANG), + LEVEL_UP_MOVE(32, MOVE_MEAN_LOOK), + LEVEL_UP_MOVE(35, MOVE_LEECH_LIFE), + LEVEL_UP_MOVE(40, MOVE_HAZE), + LEVEL_UP_MOVE(43, MOVE_VENOSHOCK), + LEVEL_UP_MOVE(48, MOVE_AIR_SLASH), + LEVEL_UP_MOVE(51, MOVE_QUICK_GUARD), + LEVEL_UP_END +}; + +static const struct LevelUpMove sChinchouLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BUBBLE), + LEVEL_UP_MOVE( 1, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 6, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE( 9, MOVE_ELECTRO_BALL), + LEVEL_UP_MOVE(12, MOVE_WATER_GUN), + LEVEL_UP_MOVE(17, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(20, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(23, MOVE_SPARK), + LEVEL_UP_MOVE(28, MOVE_SIGNAL_BEAM), + LEVEL_UP_MOVE(31, MOVE_FLAIL), + LEVEL_UP_MOVE(34, MOVE_DISCHARGE), + LEVEL_UP_MOVE(39, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(42, MOVE_AQUA_RING), + LEVEL_UP_MOVE(45, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(47, MOVE_ION_DELUGE), + LEVEL_UP_MOVE(50, MOVE_CHARGE), + LEVEL_UP_END +}; + +static const struct LevelUpMove sLanturnLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_STOCKPILE), + // LEVEL_UP_MOVE( 0, MOVE_SWALLOW), + // LEVEL_UP_MOVE( 0, MOVE_SPIT_UP), + LEVEL_UP_MOVE( 1, MOVE_STOCKPILE), + LEVEL_UP_MOVE( 1, MOVE_SWALLOW), + LEVEL_UP_MOVE( 1, MOVE_SPIT_UP), + LEVEL_UP_MOVE( 1, MOVE_EERIE_IMPULSE), + LEVEL_UP_MOVE( 1, MOVE_SPOTLIGHT), + LEVEL_UP_MOVE( 1, MOVE_BUBBLE), + LEVEL_UP_MOVE( 1, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE( 1, MOVE_ELECTRO_BALL), + LEVEL_UP_MOVE( 6, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE( 9, MOVE_ELECTRO_BALL), + LEVEL_UP_MOVE(12, MOVE_WATER_GUN), + LEVEL_UP_MOVE(17, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(20, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(23, MOVE_SPARK), + LEVEL_UP_MOVE(29, MOVE_SIGNAL_BEAM), + LEVEL_UP_MOVE(33, MOVE_FLAIL), + LEVEL_UP_MOVE(37, MOVE_DISCHARGE), + LEVEL_UP_MOVE(43, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(47, MOVE_AQUA_RING), + LEVEL_UP_MOVE(51, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(54, MOVE_ION_DELUGE), + LEVEL_UP_MOVE(58, MOVE_CHARGE), + LEVEL_UP_END +}; + +static const struct LevelUpMove sPichuLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE( 1, MOVE_CHARM), + LEVEL_UP_MOVE( 5, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE(10, MOVE_SWEET_KISS), + LEVEL_UP_MOVE(13, MOVE_NASTY_PLOT), + LEVEL_UP_MOVE(18, MOVE_THUNDER_WAVE), + LEVEL_UP_END +}; + +static const struct LevelUpMove sCleffaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 1, MOVE_CHARM), + LEVEL_UP_MOVE( 4, MOVE_ENCORE), + LEVEL_UP_MOVE( 7, MOVE_SING), + LEVEL_UP_MOVE(10, MOVE_SWEET_KISS), + LEVEL_UP_MOVE(13, MOVE_COPYCAT), + LEVEL_UP_MOVE(16, MOVE_MAGICAL_LEAF), + LEVEL_UP_END +}; + +static const struct LevelUpMove sIgglybuffLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SING), + LEVEL_UP_MOVE( 1, MOVE_CHARM), + LEVEL_UP_MOVE( 3, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE( 5, MOVE_POUND), + LEVEL_UP_MOVE( 9, MOVE_SWEET_KISS), + LEVEL_UP_MOVE(11, MOVE_COPYCAT), + LEVEL_UP_END +}; + +static const struct LevelUpMove sTogepiLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_CHARM), + LEVEL_UP_MOVE( 5, MOVE_METRONOME), + LEVEL_UP_MOVE( 9, MOVE_SWEET_KISS), + LEVEL_UP_MOVE(13, MOVE_YAWN), + LEVEL_UP_MOVE(17, MOVE_ENCORE), + LEVEL_UP_MOVE(21, MOVE_FOLLOW_ME), + LEVEL_UP_MOVE(25, MOVE_BESTOW), + LEVEL_UP_MOVE(29, MOVE_WISH), + LEVEL_UP_MOVE(33, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(37, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(41, MOVE_BATON_PASS), + LEVEL_UP_MOVE(45, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(49, MOVE_LAST_RESORT), + LEVEL_UP_MOVE(53, MOVE_AFTER_YOU), + LEVEL_UP_END +}; + +static const struct LevelUpMove sTogeticLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_MAGICAL_LEAF), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_CHARM), + LEVEL_UP_MOVE( 1, MOVE_METRONOME), + LEVEL_UP_MOVE( 1, MOVE_SWEET_KISS), + LEVEL_UP_MOVE( 5, MOVE_METRONOME), + LEVEL_UP_MOVE( 9, MOVE_SWEET_KISS), + LEVEL_UP_MOVE(13, MOVE_YAWN), + LEVEL_UP_MOVE(14, MOVE_FAIRY_WIND), + LEVEL_UP_MOVE(17, MOVE_ENCORE), + LEVEL_UP_MOVE(21, MOVE_FOLLOW_ME), + LEVEL_UP_MOVE(25, MOVE_BESTOW), + LEVEL_UP_MOVE(29, MOVE_WISH), + LEVEL_UP_MOVE(33, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(37, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(41, MOVE_BATON_PASS), + LEVEL_UP_MOVE(45, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(49, MOVE_LAST_RESORT), + LEVEL_UP_MOVE(53, MOVE_AFTER_YOU), + LEVEL_UP_END +}; + +static const struct LevelUpMove sNatuLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_PECK), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 6, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE( 9, MOVE_TELEPORT), + LEVEL_UP_MOVE(12, MOVE_LUCKY_CHANT), + LEVEL_UP_MOVE(17, MOVE_STORED_POWER), + LEVEL_UP_MOVE(20, MOVE_OMINOUS_WIND), + LEVEL_UP_MOVE(23, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(28, MOVE_WISH), + LEVEL_UP_MOVE(33, MOVE_PSYCHIC), + LEVEL_UP_MOVE(36, MOVE_MIRACLE_EYE), + LEVEL_UP_MOVE(39, MOVE_PSYCHO_SHIFT), + LEVEL_UP_MOVE(44, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(47, MOVE_POWER_SWAP), + LEVEL_UP_MOVE(47, MOVE_GUARD_SWAP), + LEVEL_UP_MOVE(50, MOVE_ME_FIRST), + LEVEL_UP_END +}; + +static const struct LevelUpMove sXatuLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_AIR_SLASH), + LEVEL_UP_MOVE( 1, MOVE_AIR_SLASH), + LEVEL_UP_MOVE( 1, MOVE_TAILWIND), + LEVEL_UP_MOVE( 1, MOVE_PECK), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE( 1, MOVE_TELEPORT), + LEVEL_UP_MOVE( 6, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE( 9, MOVE_TELEPORT), + LEVEL_UP_MOVE(12, MOVE_LUCKY_CHANT), + LEVEL_UP_MOVE(17, MOVE_STORED_POWER), + LEVEL_UP_MOVE(20, MOVE_OMINOUS_WIND), + LEVEL_UP_MOVE(23, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(29, MOVE_WISH), + LEVEL_UP_MOVE(35, MOVE_PSYCHIC), + LEVEL_UP_MOVE(39, MOVE_MIRACLE_EYE), + LEVEL_UP_MOVE(43, MOVE_PSYCHO_SHIFT), + LEVEL_UP_MOVE(49, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(53, MOVE_POWER_SWAP), + LEVEL_UP_MOVE(53, MOVE_GUARD_SWAP), + LEVEL_UP_MOVE(57, MOVE_ME_FIRST), + LEVEL_UP_END +}; + +static const struct LevelUpMove sMareepLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 4, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE( 8, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE(11, MOVE_COTTON_SPORE), + LEVEL_UP_MOVE(15, MOVE_CHARGE), + LEVEL_UP_MOVE(18, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(22, MOVE_ELECTRO_BALL), + LEVEL_UP_MOVE(25, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(29, MOVE_POWER_GEM), + LEVEL_UP_MOVE(32, MOVE_DISCHARGE), + LEVEL_UP_MOVE(36, MOVE_COTTON_GUARD), + LEVEL_UP_MOVE(39, MOVE_SIGNAL_BEAM), + LEVEL_UP_MOVE(43, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(46, MOVE_THUNDER), + LEVEL_UP_END +}; + +static const struct LevelUpMove sFlaaffyLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE( 4, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE( 8, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE(11, MOVE_COTTON_SPORE), + LEVEL_UP_MOVE(16, MOVE_CHARGE), + LEVEL_UP_MOVE(20, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(25, MOVE_ELECTRO_BALL), + LEVEL_UP_MOVE(29, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(34, MOVE_POWER_GEM), + LEVEL_UP_MOVE(38, MOVE_DISCHARGE), + LEVEL_UP_MOVE(43, MOVE_COTTON_GUARD), + LEVEL_UP_MOVE(47, MOVE_SIGNAL_BEAM), + LEVEL_UP_MOVE(52, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(56, MOVE_THUNDER), + LEVEL_UP_END +}; + +static const struct LevelUpMove sAmpharosLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_THUNDER_PUNCH), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_PUNCH), + LEVEL_UP_MOVE( 1, MOVE_ZAP_CANNON), + LEVEL_UP_MOVE( 1, MOVE_MAGNETIC_FLUX), + LEVEL_UP_MOVE( 1, MOVE_ION_DELUGE), + LEVEL_UP_MOVE( 1, MOVE_DRAGON_PULSE), + LEVEL_UP_MOVE( 1, MOVE_FIRE_PUNCH), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE( 4, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE( 8, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE(11, MOVE_COTTON_SPORE), + LEVEL_UP_MOVE(16, MOVE_CHARGE), + LEVEL_UP_MOVE(20, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(25, MOVE_ELECTRO_BALL), + LEVEL_UP_MOVE(29, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(35, MOVE_POWER_GEM), + LEVEL_UP_MOVE(40, MOVE_DISCHARGE), + LEVEL_UP_MOVE(46, MOVE_COTTON_GUARD), + LEVEL_UP_MOVE(51, MOVE_SIGNAL_BEAM), + LEVEL_UP_MOVE(57, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(62, MOVE_THUNDER), + LEVEL_UP_MOVE(65, MOVE_DRAGON_PULSE), + LEVEL_UP_END +}; + +static const struct LevelUpMove sBellossomLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_MAGICAL_LEAF), + LEVEL_UP_MOVE( 1, MOVE_MAGICAL_LEAF), + LEVEL_UP_MOVE( 1, MOVE_LEAF_STORM), + LEVEL_UP_MOVE( 1, MOVE_LEAF_BLADE), + LEVEL_UP_MOVE( 1, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE( 1, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE( 1, MOVE_STUN_SPORE), + LEVEL_UP_MOVE( 1, MOVE_SUNNY_DAY), + LEVEL_UP_MOVE(39, MOVE_QUIVER_DANCE), + LEVEL_UP_MOVE(49, MOVE_PETAL_BLIZZARD), + LEVEL_UP_MOVE(59, MOVE_PETAL_DANCE), + LEVEL_UP_MOVE(69, MOVE_LEAF_STORM), + LEVEL_UP_END +}; + +static const struct LevelUpMove sMarillLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 2, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 5, MOVE_WATER_SPORT), + LEVEL_UP_MOVE( 7, MOVE_BUBBLE), + LEVEL_UP_MOVE(10, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE(10, MOVE_ROLLOUT), + LEVEL_UP_MOVE(13, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(16, MOVE_HELPING_HAND), + LEVEL_UP_MOVE(20, MOVE_AQUA_TAIL), + LEVEL_UP_MOVE(23, MOVE_PLAY_ROUGH), + LEVEL_UP_MOVE(28, MOVE_AQUA_RING), + LEVEL_UP_MOVE(31, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(37, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(40, MOVE_SUPERPOWER), + LEVEL_UP_MOVE(47, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +static const struct LevelUpMove sAzumarillLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 1, MOVE_WATER_SPORT), + LEVEL_UP_MOVE( 2, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 5, MOVE_WATER_SPORT), + LEVEL_UP_MOVE( 7, MOVE_BUBBLE), + LEVEL_UP_MOVE(10, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE(10, MOVE_ROLLOUT), + LEVEL_UP_MOVE(13, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(16, MOVE_HELPING_HAND), + LEVEL_UP_MOVE(21, MOVE_AQUA_TAIL), + LEVEL_UP_MOVE(25, MOVE_PLAY_ROUGH), + LEVEL_UP_MOVE(31, MOVE_AQUA_RING), + LEVEL_UP_MOVE(35, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(42, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(46, MOVE_SUPERPOWER), + LEVEL_UP_MOVE(55, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +static const struct LevelUpMove sSudowoodoLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_SLAM), + LEVEL_UP_MOVE( 1, MOVE_SLAM), + LEVEL_UP_MOVE( 1, MOVE_WOOD_HAMMER), + LEVEL_UP_MOVE( 1, MOVE_COPYCAT), + LEVEL_UP_MOVE( 1, MOVE_FLAIL), + LEVEL_UP_MOVE( 1, MOVE_LOW_KICK), + LEVEL_UP_MOVE( 1, MOVE_ROCK_THROW), + LEVEL_UP_MOVE( 5, MOVE_FLAIL), + LEVEL_UP_MOVE( 8, MOVE_LOW_KICK), + LEVEL_UP_MOVE(12, MOVE_ROCK_THROW), + LEVEL_UP_MOVE(15, MOVE_MIMIC), + LEVEL_UP_MOVE(19, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(22, MOVE_TEARFUL_LOOK), + LEVEL_UP_MOVE(26, MOVE_ROCK_TOMB), + LEVEL_UP_MOVE(29, MOVE_BLOCK), + LEVEL_UP_MOVE(33, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(36, MOVE_COUNTER), + LEVEL_UP_MOVE(40, MOVE_SUCKER_PUNCH), + LEVEL_UP_MOVE(43, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(47, MOVE_STONE_EDGE), + LEVEL_UP_MOVE(50, MOVE_HAMMER_ARM), + LEVEL_UP_MOVE(54, MOVE_HEAD_SMASH), + LEVEL_UP_END +}; + +static const struct LevelUpMove sPolitoedLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BUBBLE_BEAM), LEVEL_UP_MOVE( 1, MOVE_HYPNOSIS), LEVEL_UP_MOVE( 1, MOVE_DOUBLE_SLAP), LEVEL_UP_MOVE( 1, MOVE_PERISH_SONG), - LEVEL_UP_MOVE(35, MOVE_PERISH_SONG), - LEVEL_UP_MOVE(51, MOVE_SWAGGER), + LEVEL_UP_MOVE(27, MOVE_SWAGGER), + LEVEL_UP_MOVE(37, MOVE_BOUNCE), + LEVEL_UP_MOVE(48, MOVE_HYPER_VOICE), LEVEL_UP_END }; -static const u16 sHoppipLevelUpLearnset[] = { +static const struct LevelUpMove sHoppipLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SPLASH), - LEVEL_UP_MOVE( 5, MOVE_SYNTHESIS), - LEVEL_UP_MOVE( 5, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE(10, MOVE_TACKLE), - LEVEL_UP_MOVE(13, MOVE_POISON_POWDER), - LEVEL_UP_MOVE(15, MOVE_STUN_SPORE), - LEVEL_UP_MOVE(17, MOVE_SLEEP_POWDER), - LEVEL_UP_MOVE(20, MOVE_LEECH_SEED), - LEVEL_UP_MOVE(25, MOVE_COTTON_SPORE), - LEVEL_UP_MOVE(30, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE( 1, MOVE_ABSORB), + LEVEL_UP_MOVE( 4, MOVE_SYNTHESIS), + LEVEL_UP_MOVE( 6, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 8, MOVE_TACKLE), + LEVEL_UP_MOVE(10, MOVE_FAIRY_WIND), + LEVEL_UP_MOVE(12, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(14, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(16, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(19, MOVE_BULLET_SEED), + LEVEL_UP_MOVE(22, MOVE_LEECH_SEED), + LEVEL_UP_MOVE(25, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(28, MOVE_ACROBATICS), + LEVEL_UP_MOVE(31, MOVE_RAGE_POWDER), + LEVEL_UP_MOVE(34, MOVE_COTTON_SPORE), + LEVEL_UP_MOVE(37, MOVE_U_TURN), + LEVEL_UP_MOVE(40, MOVE_WORRY_SEED), + LEVEL_UP_MOVE(43, MOVE_GIGA_DRAIN), + LEVEL_UP_MOVE(46, MOVE_BOUNCE), + LEVEL_UP_MOVE(49, MOVE_MEMENTO), LEVEL_UP_END }; -static const u16 sSkiploomLevelUpLearnset[] = { +static const struct LevelUpMove sSkiploomLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SPLASH), + LEVEL_UP_MOVE( 1, MOVE_ABSORB), LEVEL_UP_MOVE( 1, MOVE_SYNTHESIS), LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 5, MOVE_SYNTHESIS), - LEVEL_UP_MOVE( 5, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE(10, MOVE_TACKLE), - LEVEL_UP_MOVE(13, MOVE_POISON_POWDER), - LEVEL_UP_MOVE(15, MOVE_STUN_SPORE), - LEVEL_UP_MOVE(17, MOVE_SLEEP_POWDER), - LEVEL_UP_MOVE(22, MOVE_LEECH_SEED), - LEVEL_UP_MOVE(29, MOVE_COTTON_SPORE), - LEVEL_UP_MOVE(36, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE( 4, MOVE_SYNTHESIS), + LEVEL_UP_MOVE( 6, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 8, MOVE_TACKLE), + LEVEL_UP_MOVE(10, MOVE_FAIRY_WIND), + LEVEL_UP_MOVE(12, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(14, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(16, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(20, MOVE_BULLET_SEED), + LEVEL_UP_MOVE(24, MOVE_LEECH_SEED), + LEVEL_UP_MOVE(28, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(32, MOVE_ACROBATICS), + LEVEL_UP_MOVE(36, MOVE_RAGE_POWDER), + LEVEL_UP_MOVE(40, MOVE_COTTON_SPORE), + LEVEL_UP_MOVE(44, MOVE_U_TURN), + LEVEL_UP_MOVE(48, MOVE_WORRY_SEED), + LEVEL_UP_MOVE(52, MOVE_GIGA_DRAIN), + LEVEL_UP_MOVE(56, MOVE_BOUNCE), + LEVEL_UP_MOVE(60, MOVE_MEMENTO), LEVEL_UP_END }; -static const u16 sJumpluffLevelUpLearnset[] = { +static const struct LevelUpMove sJumpluffLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SPLASH), + LEVEL_UP_MOVE( 1, MOVE_ABSORB), LEVEL_UP_MOVE( 1, MOVE_SYNTHESIS), LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 5, MOVE_SYNTHESIS), - LEVEL_UP_MOVE( 5, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE(10, MOVE_TACKLE), - LEVEL_UP_MOVE(13, MOVE_POISON_POWDER), - LEVEL_UP_MOVE(15, MOVE_STUN_SPORE), - LEVEL_UP_MOVE(17, MOVE_SLEEP_POWDER), - LEVEL_UP_MOVE(22, MOVE_LEECH_SEED), - LEVEL_UP_MOVE(33, MOVE_COTTON_SPORE), - LEVEL_UP_MOVE(44, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE( 4, MOVE_SYNTHESIS), + LEVEL_UP_MOVE( 6, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 8, MOVE_TACKLE), + LEVEL_UP_MOVE(10, MOVE_FAIRY_WIND), + LEVEL_UP_MOVE(12, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(14, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(16, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(20, MOVE_BULLET_SEED), + LEVEL_UP_MOVE(24, MOVE_LEECH_SEED), + LEVEL_UP_MOVE(29, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(34, MOVE_ACROBATICS), + LEVEL_UP_MOVE(39, MOVE_RAGE_POWDER), + LEVEL_UP_MOVE(44, MOVE_COTTON_SPORE), + LEVEL_UP_MOVE(49, MOVE_U_TURN), + LEVEL_UP_MOVE(54, MOVE_WORRY_SEED), + LEVEL_UP_MOVE(59, MOVE_GIGA_DRAIN), + LEVEL_UP_MOVE(64, MOVE_BOUNCE), + LEVEL_UP_MOVE(69, MOVE_MEMENTO), LEVEL_UP_END }; -static const u16 sAipomLevelUpLearnset[] = { +static const struct LevelUpMove sAipomLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SCRATCH), LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 6, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(13, MOVE_ASTONISH), - LEVEL_UP_MOVE(18, MOVE_BATON_PASS), - LEVEL_UP_MOVE(25, MOVE_TICKLE), - LEVEL_UP_MOVE(31, MOVE_FURY_SWIPES), - LEVEL_UP_MOVE(38, MOVE_SWIFT), - LEVEL_UP_MOVE(43, MOVE_SCREECH), - LEVEL_UP_MOVE(50, MOVE_AGILITY), + LEVEL_UP_MOVE( 4, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 8, MOVE_ASTONISH), + LEVEL_UP_MOVE(11, MOVE_BATON_PASS), + LEVEL_UP_MOVE(15, MOVE_TICKLE), + LEVEL_UP_MOVE(18, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(22, MOVE_SWIFT), + LEVEL_UP_MOVE(25, MOVE_SCREECH), + LEVEL_UP_MOVE(29, MOVE_AGILITY), + LEVEL_UP_MOVE(32, MOVE_DOUBLE_HIT), + LEVEL_UP_MOVE(36, MOVE_FLING), + LEVEL_UP_MOVE(39, MOVE_NASTY_PLOT), + LEVEL_UP_MOVE(43, MOVE_LAST_RESORT), LEVEL_UP_END }; -static const u16 sSunkernLevelUpLearnset[] = { +static const struct LevelUpMove sSunkernLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_ABSORB), - LEVEL_UP_MOVE( 6, MOVE_GROWTH), - LEVEL_UP_MOVE(13, MOVE_MEGA_DRAIN), - LEVEL_UP_MOVE(18, MOVE_INGRAIN), + LEVEL_UP_MOVE( 1, MOVE_GROWTH), + LEVEL_UP_MOVE( 4, MOVE_INGRAIN), + LEVEL_UP_MOVE( 7, MOVE_GRASS_WHISTLE), + LEVEL_UP_MOVE(10, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(13, MOVE_LEECH_SEED), + LEVEL_UP_MOVE(16, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE(19, MOVE_WORRY_SEED), + LEVEL_UP_MOVE(22, MOVE_GIGA_DRAIN), LEVEL_UP_MOVE(25, MOVE_ENDEAVOR), - LEVEL_UP_MOVE(30, MOVE_SUNNY_DAY), - LEVEL_UP_MOVE(37, MOVE_SYNTHESIS), - LEVEL_UP_MOVE(42, MOVE_GIGA_DRAIN), + LEVEL_UP_MOVE(28, MOVE_SYNTHESIS), + LEVEL_UP_MOVE(31, MOVE_NATURAL_GIFT), + LEVEL_UP_MOVE(34, MOVE_SOLAR_BEAM), + LEVEL_UP_MOVE(37, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(40, MOVE_SUNNY_DAY), + LEVEL_UP_MOVE(43, MOVE_SEED_BOMB), LEVEL_UP_END }; -static const u16 sSunfloraLevelUpLearnset[] = { +static const struct LevelUpMove sSunfloraLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_FLOWER_SHIELD), LEVEL_UP_MOVE( 1, MOVE_ABSORB), LEVEL_UP_MOVE( 1, MOVE_POUND), - LEVEL_UP_MOVE( 6, MOVE_GROWTH), - LEVEL_UP_MOVE(13, MOVE_RAZOR_LEAF), - LEVEL_UP_MOVE(18, MOVE_INGRAIN), + LEVEL_UP_MOVE( 1, MOVE_GROWTH), + LEVEL_UP_MOVE( 4, MOVE_INGRAIN), + LEVEL_UP_MOVE( 7, MOVE_GRASS_WHISTLE), + LEVEL_UP_MOVE(10, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(13, MOVE_LEECH_SEED), + LEVEL_UP_MOVE(16, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE(19, MOVE_WORRY_SEED), + LEVEL_UP_MOVE(22, MOVE_GIGA_DRAIN), LEVEL_UP_MOVE(25, MOVE_BULLET_SEED), - LEVEL_UP_MOVE(30, MOVE_SUNNY_DAY), - LEVEL_UP_MOVE(37, MOVE_PETAL_DANCE), - LEVEL_UP_MOVE(42, MOVE_SOLAR_BEAM), + LEVEL_UP_MOVE(28, MOVE_PETAL_DANCE), + LEVEL_UP_MOVE(31, MOVE_NATURAL_GIFT), + LEVEL_UP_MOVE(34, MOVE_SOLAR_BEAM), + LEVEL_UP_MOVE(37, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(40, MOVE_SUNNY_DAY), + LEVEL_UP_MOVE(43, MOVE_LEAF_STORM), + LEVEL_UP_MOVE(50, MOVE_PETAL_BLIZZARD), LEVEL_UP_END }; -static const u16 sYanmaLevelUpLearnset[] = { +static const struct LevelUpMove sYanmaLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_FORESIGHT), - LEVEL_UP_MOVE( 7, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(13, MOVE_DOUBLE_TEAM), - LEVEL_UP_MOVE(19, MOVE_SONIC_BOOM), - LEVEL_UP_MOVE(25, MOVE_DETECT), - LEVEL_UP_MOVE(31, MOVE_SUPERSONIC), - LEVEL_UP_MOVE(37, MOVE_UPROAR), + LEVEL_UP_MOVE( 6, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(11, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE(14, MOVE_SONIC_BOOM), + LEVEL_UP_MOVE(17, MOVE_DETECT), + LEVEL_UP_MOVE(22, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(27, MOVE_UPROAR), + LEVEL_UP_MOVE(30, MOVE_PURSUIT), + LEVEL_UP_MOVE(33, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(38, MOVE_HYPNOSIS), LEVEL_UP_MOVE(43, MOVE_WING_ATTACK), - LEVEL_UP_MOVE(49, MOVE_SCREECH), + LEVEL_UP_MOVE(46, MOVE_SCREECH), + LEVEL_UP_MOVE(49, MOVE_U_TURN), + LEVEL_UP_MOVE(54, MOVE_AIR_SLASH), + LEVEL_UP_MOVE(57, MOVE_BUG_BUZZ), LEVEL_UP_END }; -static const u16 sWooperLevelUpLearnset[] = { +static const struct LevelUpMove sWooperLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE(11, MOVE_SLAM), - LEVEL_UP_MOVE(16, MOVE_MUD_SHOT), - LEVEL_UP_MOVE(21, MOVE_AMNESIA), + LEVEL_UP_MOVE( 5, MOVE_MUD_SPORT), + LEVEL_UP_MOVE( 9, MOVE_MUD_SHOT), + LEVEL_UP_MOVE(15, MOVE_SLAM), + LEVEL_UP_MOVE(19, MOVE_MUD_BOMB), + LEVEL_UP_MOVE(23, MOVE_AMNESIA), + LEVEL_UP_MOVE(29, MOVE_YAWN), + LEVEL_UP_MOVE(33, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(37, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(43, MOVE_MIST), + LEVEL_UP_MOVE(43, MOVE_HAZE), + LEVEL_UP_MOVE(47, MOVE_MUDDY_WATER), + LEVEL_UP_END +}; + +static const struct LevelUpMove sQuagsireLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 1, MOVE_MUD_SPORT), + LEVEL_UP_MOVE( 5, MOVE_MUD_SPORT), + LEVEL_UP_MOVE( 9, MOVE_MUD_SHOT), + LEVEL_UP_MOVE(15, MOVE_SLAM), + LEVEL_UP_MOVE(19, MOVE_MUD_BOMB), + LEVEL_UP_MOVE(24, MOVE_AMNESIA), LEVEL_UP_MOVE(31, MOVE_YAWN), LEVEL_UP_MOVE(36, MOVE_EARTHQUAKE), LEVEL_UP_MOVE(41, MOVE_RAIN_DANCE), - LEVEL_UP_MOVE(51, MOVE_MIST), - LEVEL_UP_MOVE(51, MOVE_HAZE), + LEVEL_UP_MOVE(48, MOVE_MIST), + LEVEL_UP_MOVE(48, MOVE_HAZE), + LEVEL_UP_MOVE(53, MOVE_MUDDY_WATER), LEVEL_UP_END }; -static const u16 sQuagsireLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), - LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE(11, MOVE_SLAM), - LEVEL_UP_MOVE(16, MOVE_MUD_SHOT), - LEVEL_UP_MOVE(23, MOVE_AMNESIA), - LEVEL_UP_MOVE(35, MOVE_YAWN), - LEVEL_UP_MOVE(42, MOVE_EARTHQUAKE), - LEVEL_UP_MOVE(49, MOVE_RAIN_DANCE), - LEVEL_UP_MOVE(61, MOVE_MIST), - LEVEL_UP_MOVE(61, MOVE_HAZE), - LEVEL_UP_END -}; - -static const u16 sEspeonLevelUpLearnset[] = { +static const struct LevelUpMove sEspeonLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_CONFUSION), + LEVEL_UP_MOVE( 1, MOVE_CONFUSION), + LEVEL_UP_MOVE( 1, MOVE_HELPING_HAND), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 1, MOVE_HELPING_HAND), - LEVEL_UP_MOVE( 8, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(16, MOVE_CONFUSION), - LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(30, MOVE_SWIFT), - LEVEL_UP_MOVE(36, MOVE_PSYBEAM), - LEVEL_UP_MOVE(42, MOVE_PSYCH_UP), - LEVEL_UP_MOVE(47, MOVE_PSYCHIC), - LEVEL_UP_MOVE(52, MOVE_MORNING_SUN), + LEVEL_UP_MOVE( 5, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 9, MOVE_BABY_DOLL_EYES), + LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(17, MOVE_SWIFT), + LEVEL_UP_MOVE(20, MOVE_PSYBEAM), + LEVEL_UP_MOVE(25, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(29, MOVE_PSYCH_UP), + LEVEL_UP_MOVE(33, MOVE_MORNING_SUN), + LEVEL_UP_MOVE(37, MOVE_PSYCHIC), + LEVEL_UP_MOVE(41, MOVE_LAST_RESORT), + LEVEL_UP_MOVE(45, MOVE_POWER_SWAP), LEVEL_UP_END }; -static const u16 sUmbreonLevelUpLearnset[] = { +static const struct LevelUpMove sUmbreonLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_PURSUIT), + LEVEL_UP_MOVE( 1, MOVE_PURSUIT), + LEVEL_UP_MOVE( 1, MOVE_HELPING_HAND), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 1, MOVE_HELPING_HAND), - LEVEL_UP_MOVE( 8, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(16, MOVE_PURSUIT), - LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(30, MOVE_CONFUSE_RAY), - LEVEL_UP_MOVE(36, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE(42, MOVE_MEAN_LOOK), - LEVEL_UP_MOVE(47, MOVE_SCREECH), - LEVEL_UP_MOVE(52, MOVE_MOONLIGHT), + LEVEL_UP_MOVE( 5, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 9, MOVE_BABY_DOLL_EYES), + LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(17, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(20, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(25, MOVE_ASSURANCE), + LEVEL_UP_MOVE(29, MOVE_SCREECH), + LEVEL_UP_MOVE(33, MOVE_MOONLIGHT), + LEVEL_UP_MOVE(37, MOVE_MEAN_LOOK), + LEVEL_UP_MOVE(41, MOVE_LAST_RESORT), + LEVEL_UP_MOVE(45, MOVE_GUARD_SWAP), LEVEL_UP_END }; -static const u16 sMurkrowLevelUpLearnset[] = { +static const struct LevelUpMove sMurkrowLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_PECK), - LEVEL_UP_MOVE( 9, MOVE_ASTONISH), - LEVEL_UP_MOVE(14, MOVE_PURSUIT), - LEVEL_UP_MOVE(22, MOVE_HAZE), - LEVEL_UP_MOVE(27, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE( 1, MOVE_ASTONISH), + LEVEL_UP_MOVE( 5, MOVE_PURSUIT), + LEVEL_UP_MOVE(11, MOVE_HAZE), + LEVEL_UP_MOVE(15, MOVE_WING_ATTACK), + LEVEL_UP_MOVE(21, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE(25, MOVE_ASSURANCE), + LEVEL_UP_MOVE(31, MOVE_TAUNT), LEVEL_UP_MOVE(35, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE(40, MOVE_TAUNT), - LEVEL_UP_MOVE(48, MOVE_MEAN_LOOK), + LEVEL_UP_MOVE(41, MOVE_MEAN_LOOK), + LEVEL_UP_MOVE(45, MOVE_FOUL_PLAY), + LEVEL_UP_MOVE(50, MOVE_TAILWIND), + LEVEL_UP_MOVE(55, MOVE_SUCKER_PUNCH), + LEVEL_UP_MOVE(61, MOVE_TORMENT), + LEVEL_UP_MOVE(65, MOVE_QUASH), LEVEL_UP_END }; -static const u16 sSlowkingLevelUpLearnset[] = { +static const struct LevelUpMove sSlowkingLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_HEAL_PULSE), + LEVEL_UP_MOVE( 1, MOVE_POWER_GEM), + LEVEL_UP_MOVE( 1, MOVE_HIDDEN_POWER), LEVEL_UP_MOVE( 1, MOVE_CURSE), LEVEL_UP_MOVE( 1, MOVE_YAWN), LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 6, MOVE_GROWL), - LEVEL_UP_MOVE(15, MOVE_WATER_GUN), - LEVEL_UP_MOVE(20, MOVE_CONFUSION), - LEVEL_UP_MOVE(29, MOVE_DISABLE), - LEVEL_UP_MOVE(34, MOVE_HEADBUTT), - LEVEL_UP_MOVE(43, MOVE_SWAGGER), - LEVEL_UP_MOVE(48, MOVE_PSYCHIC), + LEVEL_UP_MOVE( 5, MOVE_GROWL), + LEVEL_UP_MOVE( 9, MOVE_WATER_GUN), + LEVEL_UP_MOVE(14, MOVE_CONFUSION), + LEVEL_UP_MOVE(19, MOVE_DISABLE), + LEVEL_UP_MOVE(23, MOVE_HEADBUTT), + LEVEL_UP_MOVE(28, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(32, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(36, MOVE_NASTY_PLOT), + LEVEL_UP_MOVE(41, MOVE_SWAGGER), + LEVEL_UP_MOVE(45, MOVE_PSYCHIC), + LEVEL_UP_MOVE(49, MOVE_TRUMP_CARD), + LEVEL_UP_MOVE(54, MOVE_PSYCH_UP), + LEVEL_UP_MOVE(58, MOVE_HEAL_PULSE), LEVEL_UP_END }; -static const u16 sMisdreavusLevelUpLearnset[] = { +static const struct LevelUpMove sMisdreavusLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_GROWL), LEVEL_UP_MOVE( 1, MOVE_PSYWAVE), - LEVEL_UP_MOVE( 6, MOVE_SPITE), - LEVEL_UP_MOVE(11, MOVE_ASTONISH), - LEVEL_UP_MOVE(17, MOVE_CONFUSE_RAY), - LEVEL_UP_MOVE(23, MOVE_MEAN_LOOK), - LEVEL_UP_MOVE(30, MOVE_PSYBEAM), - LEVEL_UP_MOVE(37, MOVE_PAIN_SPLIT), - LEVEL_UP_MOVE(45, MOVE_PERISH_SONG), - LEVEL_UP_MOVE(53, MOVE_GRUDGE), + LEVEL_UP_MOVE( 5, MOVE_SPITE), + LEVEL_UP_MOVE(10, MOVE_ASTONISH), + LEVEL_UP_MOVE(14, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(19, MOVE_MEAN_LOOK), + LEVEL_UP_MOVE(23, MOVE_HEX), + LEVEL_UP_MOVE(28, MOVE_PSYBEAM), + LEVEL_UP_MOVE(32, MOVE_PAIN_SPLIT), + LEVEL_UP_MOVE(37, MOVE_PAYBACK), + LEVEL_UP_MOVE(41, MOVE_SHADOW_BALL), + LEVEL_UP_MOVE(46, MOVE_PERISH_SONG), + LEVEL_UP_MOVE(50, MOVE_GRUDGE), + LEVEL_UP_MOVE(55, MOVE_POWER_GEM), LEVEL_UP_END }; -static const u16 sUnownLevelUpLearnset[] = { +static const struct LevelUpMove sUnownLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_HIDDEN_POWER), LEVEL_UP_END }; -static const u16 sWobbuffetLevelUpLearnset[] = { +static const struct LevelUpMove sWobbuffetLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_COUNTER), LEVEL_UP_MOVE( 1, MOVE_MIRROR_COAT), LEVEL_UP_MOVE( 1, MOVE_SAFEGUARD), @@ -2780,439 +4007,695 @@ static const u16 sWobbuffetLevelUpLearnset[] = { LEVEL_UP_END }; -static const u16 sGirafarigLevelUpLearnset[] = { +static const struct LevelUpMove sGirafarigLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POWER_SWAP), + LEVEL_UP_MOVE( 1, MOVE_GUARD_SWAP), + LEVEL_UP_MOVE( 1, MOVE_ASTONISH), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 7, MOVE_ASTONISH), - LEVEL_UP_MOVE(13, MOVE_CONFUSION), - LEVEL_UP_MOVE(19, MOVE_STOMP), - LEVEL_UP_MOVE(25, MOVE_ODOR_SLEUTH), - LEVEL_UP_MOVE(31, MOVE_AGILITY), - LEVEL_UP_MOVE(37, MOVE_BATON_PASS), - LEVEL_UP_MOVE(43, MOVE_PSYBEAM), - LEVEL_UP_MOVE(49, MOVE_CRUNCH), + LEVEL_UP_MOVE( 1, MOVE_CONFUSION), + LEVEL_UP_MOVE( 5, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE(10, MOVE_ASSURANCE), + LEVEL_UP_MOVE(14, MOVE_STOMP), + LEVEL_UP_MOVE(19, MOVE_PSYBEAM), + LEVEL_UP_MOVE(23, MOVE_AGILITY), + LEVEL_UP_MOVE(28, MOVE_DOUBLE_HIT), + LEVEL_UP_MOVE(32, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(37, MOVE_CRUNCH), + LEVEL_UP_MOVE(41, MOVE_BATON_PASS), + LEVEL_UP_MOVE(46, MOVE_NASTY_PLOT), + LEVEL_UP_MOVE(50, MOVE_PSYCHIC), LEVEL_UP_END }; -static const u16 sPinecoLevelUpLearnset[] = { +static const struct LevelUpMove sPinecoLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_PROTECT), - LEVEL_UP_MOVE( 8, MOVE_SELF_DESTRUCT), - LEVEL_UP_MOVE(15, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(22, MOVE_RAPID_SPIN), - LEVEL_UP_MOVE(29, MOVE_BIDE), - LEVEL_UP_MOVE(36, MOVE_EXPLOSION), - LEVEL_UP_MOVE(43, MOVE_SPIKES), - LEVEL_UP_MOVE(50, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE( 6, MOVE_SELF_DESTRUCT), + LEVEL_UP_MOVE( 9, MOVE_BUG_BITE), + LEVEL_UP_MOVE(12, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(17, MOVE_RAPID_SPIN), + LEVEL_UP_MOVE(20, MOVE_BIDE), + LEVEL_UP_MOVE(23, MOVE_NATURAL_GIFT), + LEVEL_UP_MOVE(28, MOVE_SPIKES), + LEVEL_UP_MOVE(31, MOVE_PAYBACK), + LEVEL_UP_MOVE(34, MOVE_EXPLOSION), + LEVEL_UP_MOVE(39, MOVE_IRON_DEFENSE), + LEVEL_UP_MOVE(42, MOVE_GYRO_BALL), + LEVEL_UP_MOVE(45, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; -static const u16 sForretressLevelUpLearnset[] = { +static const struct LevelUpMove sForretressLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_MIRROR_SHOT), + // LEVEL_UP_MOVE( 0, MOVE_AUTOTOMIZE), + LEVEL_UP_MOVE( 1, MOVE_MIRROR_SHOT), + LEVEL_UP_MOVE( 1, MOVE_AUTOTOMIZE), + LEVEL_UP_MOVE( 1, MOVE_HEAVY_SLAM), + LEVEL_UP_MOVE( 1, MOVE_ZAP_CANNON), + LEVEL_UP_MOVE( 1, MOVE_MAGNET_RISE), + LEVEL_UP_MOVE( 1, MOVE_TOXIC_SPIKES), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_PROTECT), LEVEL_UP_MOVE( 1, MOVE_SELF_DESTRUCT), - LEVEL_UP_MOVE( 8, MOVE_SELF_DESTRUCT), - LEVEL_UP_MOVE(15, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(22, MOVE_RAPID_SPIN), - LEVEL_UP_MOVE(29, MOVE_BIDE), - LEVEL_UP_MOVE(39, MOVE_EXPLOSION), - LEVEL_UP_MOVE(49, MOVE_SPIKES), - LEVEL_UP_MOVE(59, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE( 1, MOVE_BUG_BITE), + LEVEL_UP_MOVE( 6, MOVE_SELF_DESTRUCT), + LEVEL_UP_MOVE( 9, MOVE_BUG_BITE), + LEVEL_UP_MOVE(12, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(17, MOVE_RAPID_SPIN), + LEVEL_UP_MOVE(20, MOVE_BIDE), + LEVEL_UP_MOVE(23, MOVE_NATURAL_GIFT), + LEVEL_UP_MOVE(28, MOVE_SPIKES), + LEVEL_UP_MOVE(32, MOVE_PAYBACK), + LEVEL_UP_MOVE(36, MOVE_EXPLOSION), + LEVEL_UP_MOVE(42, MOVE_IRON_DEFENSE), + LEVEL_UP_MOVE(46, MOVE_GYRO_BALL), + LEVEL_UP_MOVE(50, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(56, MOVE_MAGNET_RISE), + LEVEL_UP_MOVE(60, MOVE_ZAP_CANNON), + LEVEL_UP_MOVE(64, MOVE_HEAVY_SLAM), LEVEL_UP_END }; -static const u16 sDunsparceLevelUpLearnset[] = { +static const struct LevelUpMove sDunsparceLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_RAGE), - LEVEL_UP_MOVE( 4, MOVE_DEFENSE_CURL), - LEVEL_UP_MOVE(11, MOVE_YAWN), - LEVEL_UP_MOVE(14, MOVE_GLARE), - LEVEL_UP_MOVE(21, MOVE_SPITE), - LEVEL_UP_MOVE(24, MOVE_PURSUIT), - LEVEL_UP_MOVE(31, MOVE_SCREECH), - LEVEL_UP_MOVE(34, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE( 1, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE( 3, MOVE_ROLLOUT), + LEVEL_UP_MOVE( 6, MOVE_SPITE), + LEVEL_UP_MOVE( 8, MOVE_PURSUIT), + LEVEL_UP_MOVE(11, MOVE_SCREECH), + LEVEL_UP_MOVE(13, MOVE_MUD_SLAP), + LEVEL_UP_MOVE(16, MOVE_YAWN), + LEVEL_UP_MOVE(18, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(21, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(23, MOVE_DRILL_RUN), + LEVEL_UP_MOVE(26, MOVE_ROOST), + LEVEL_UP_MOVE(28, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(31, MOVE_COIL), + LEVEL_UP_MOVE(33, MOVE_DIG), + LEVEL_UP_MOVE(36, MOVE_GLARE), + LEVEL_UP_MOVE(38, MOVE_DOUBLE_EDGE), LEVEL_UP_MOVE(41, MOVE_ENDEAVOR), + LEVEL_UP_MOVE(43, MOVE_AIR_SLASH), + LEVEL_UP_MOVE(46, MOVE_DRAGON_RUSH), + LEVEL_UP_MOVE(48, MOVE_ENDURE), + LEVEL_UP_MOVE(51, MOVE_FLAIL), LEVEL_UP_END }; -static const u16 sGligarLevelUpLearnset[] = { +static const struct LevelUpMove sGligarLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_POISON_STING), - LEVEL_UP_MOVE( 6, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(13, MOVE_HARDEN), - LEVEL_UP_MOVE(20, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(28, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE(36, MOVE_SLASH), - LEVEL_UP_MOVE(44, MOVE_SCREECH), - LEVEL_UP_MOVE(52, MOVE_GUILLOTINE), + LEVEL_UP_MOVE( 4, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 7, MOVE_HARDEN), + LEVEL_UP_MOVE(10, MOVE_KNOCK_OFF), + LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(16, MOVE_FURY_CUTTER), + LEVEL_UP_MOVE(19, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(22, MOVE_ACROBATICS), + LEVEL_UP_MOVE(27, MOVE_SLASH), + LEVEL_UP_MOVE(30, MOVE_U_TURN), + LEVEL_UP_MOVE(35, MOVE_SCREECH), + LEVEL_UP_MOVE(40, MOVE_X_SCISSOR), + LEVEL_UP_MOVE(45, MOVE_SKY_UPPERCUT), + LEVEL_UP_MOVE(50, MOVE_SWORDS_DANCE), + LEVEL_UP_MOVE(55, MOVE_GUILLOTINE), LEVEL_UP_END }; -static const u16 sSteelixLevelUpLearnset[] = { +static const struct LevelUpMove sSteelixLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_THUNDER_FANG), + LEVEL_UP_MOVE( 1, MOVE_ICE_FANG), + LEVEL_UP_MOVE( 1, MOVE_FIRE_FANG), + LEVEL_UP_MOVE( 1, MOVE_MUD_SPORT), LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 1, MOVE_SCREECH), - LEVEL_UP_MOVE( 9, MOVE_BIND), - LEVEL_UP_MOVE(13, MOVE_ROCK_THROW), - LEVEL_UP_MOVE(21, MOVE_HARDEN), - LEVEL_UP_MOVE(25, MOVE_RAGE), - LEVEL_UP_MOVE(33, MOVE_SANDSTORM), - LEVEL_UP_MOVE(37, MOVE_SLAM), - LEVEL_UP_MOVE(45, MOVE_IRON_TAIL), + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 1, MOVE_BIND), + LEVEL_UP_MOVE( 4, MOVE_CURSE), + LEVEL_UP_MOVE( 7, MOVE_ROCK_THROW), + LEVEL_UP_MOVE(10, MOVE_ROCK_TOMB), + LEVEL_UP_MOVE(13, MOVE_RAGE), + LEVEL_UP_MOVE(16, MOVE_STEALTH_ROCK), + LEVEL_UP_MOVE(19, MOVE_AUTOTOMIZE), + LEVEL_UP_MOVE(20, MOVE_GYRO_BALL), + LEVEL_UP_MOVE(22, MOVE_SMACK_DOWN), + LEVEL_UP_MOVE(25, MOVE_DRAGON_BREATH), + LEVEL_UP_MOVE(28, MOVE_SLAM), + LEVEL_UP_MOVE(31, MOVE_SCREECH), + LEVEL_UP_MOVE(34, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(37, MOVE_CRUNCH), + LEVEL_UP_MOVE(40, MOVE_IRON_TAIL), + LEVEL_UP_MOVE(43, MOVE_DIG), + LEVEL_UP_MOVE(46, MOVE_STONE_EDGE), + LEVEL_UP_MOVE(49, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(52, MOVE_SANDSTORM), + LEVEL_UP_END +}; + +static const struct LevelUpMove sSnubbullLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ICE_FANG), + LEVEL_UP_MOVE( 1, MOVE_FIRE_FANG), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_FANG), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_SCARY_FACE), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 1, MOVE_CHARM), + LEVEL_UP_MOVE( 7, MOVE_BITE), + LEVEL_UP_MOVE(13, MOVE_LICK), + LEVEL_UP_MOVE(19, MOVE_HEADBUTT), + LEVEL_UP_MOVE(25, MOVE_ROAR), + LEVEL_UP_MOVE(31, MOVE_RAGE), + LEVEL_UP_MOVE(37, MOVE_PLAY_ROUGH), + LEVEL_UP_MOVE(43, MOVE_PAYBACK), LEVEL_UP_MOVE(49, MOVE_CRUNCH), - LEVEL_UP_MOVE(57, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; -static const u16 sSnubbullLevelUpLearnset[] = { +static const struct LevelUpMove sGranbullLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_OUTRAGE), + LEVEL_UP_MOVE( 1, MOVE_ICE_FANG), + LEVEL_UP_MOVE( 1, MOVE_FIRE_FANG), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_FANG), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_SCARY_FACE), - LEVEL_UP_MOVE( 4, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 8, MOVE_CHARM), - LEVEL_UP_MOVE(13, MOVE_BITE), - LEVEL_UP_MOVE(19, MOVE_LICK), - LEVEL_UP_MOVE(26, MOVE_ROAR), - LEVEL_UP_MOVE(34, MOVE_RAGE), - LEVEL_UP_MOVE(43, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(53, MOVE_CRUNCH), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 1, MOVE_CHARM), + LEVEL_UP_MOVE( 7, MOVE_BITE), + LEVEL_UP_MOVE(13, MOVE_LICK), + LEVEL_UP_MOVE(19, MOVE_HEADBUTT), + LEVEL_UP_MOVE(27, MOVE_ROAR), + LEVEL_UP_MOVE(35, MOVE_RAGE), + LEVEL_UP_MOVE(43, MOVE_PLAY_ROUGH), + LEVEL_UP_MOVE(51, MOVE_PAYBACK), + LEVEL_UP_MOVE(59, MOVE_CRUNCH), + LEVEL_UP_MOVE(67, MOVE_OUTRAGE), LEVEL_UP_END }; -static const u16 sGranbullLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 1, MOVE_SCARY_FACE), - LEVEL_UP_MOVE( 4, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 8, MOVE_CHARM), - LEVEL_UP_MOVE(13, MOVE_BITE), - LEVEL_UP_MOVE(19, MOVE_LICK), - LEVEL_UP_MOVE(28, MOVE_ROAR), - LEVEL_UP_MOVE(38, MOVE_RAGE), - LEVEL_UP_MOVE(49, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(61, MOVE_CRUNCH), - LEVEL_UP_END -}; - -static const u16 sQwilfishLevelUpLearnset[] = { +static const struct LevelUpMove sQwilfishLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_FELL_STINGER), + LEVEL_UP_MOVE( 1, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE( 1, MOVE_DESTINY_BOND), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), LEVEL_UP_MOVE( 1, MOVE_SPIKES), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_POISON_STING), - LEVEL_UP_MOVE(10, MOVE_HARDEN), - LEVEL_UP_MOVE(10, MOVE_MINIMIZE), - LEVEL_UP_MOVE(19, MOVE_WATER_GUN), - LEVEL_UP_MOVE(28, MOVE_PIN_MISSILE), - LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(46, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE( 9, MOVE_HARDEN), + LEVEL_UP_MOVE( 9, MOVE_MINIMIZE), + LEVEL_UP_MOVE(13, MOVE_BUBBLE), + LEVEL_UP_MOVE(17, MOVE_ROLLOUT), + LEVEL_UP_MOVE(21, MOVE_TOXIC_SPIKES), + LEVEL_UP_MOVE(25, MOVE_STOCKPILE), + LEVEL_UP_MOVE(25, MOVE_SPIT_UP), + LEVEL_UP_MOVE(29, MOVE_REVENGE), + LEVEL_UP_MOVE(33, MOVE_BRINE), + LEVEL_UP_MOVE(37, MOVE_PIN_MISSILE), + LEVEL_UP_MOVE(41, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(45, MOVE_AQUA_TAIL), + LEVEL_UP_MOVE(49, MOVE_POISON_JAB), + LEVEL_UP_MOVE(53, MOVE_DESTINY_BOND), + LEVEL_UP_MOVE(57, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(60, MOVE_FELL_STINGER), LEVEL_UP_END }; -static const u16 sScizorLevelUpLearnset[] = { +static const struct LevelUpMove sScizorLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_FEINT), + LEVEL_UP_MOVE( 1, MOVE_BULLET_PUNCH), LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 6, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE(11, MOVE_PURSUIT), - LEVEL_UP_MOVE(16, MOVE_FALSE_SWIPE), - LEVEL_UP_MOVE(21, MOVE_AGILITY), - LEVEL_UP_MOVE(26, MOVE_METAL_CLAW), - LEVEL_UP_MOVE(31, MOVE_SLASH), - LEVEL_UP_MOVE(36, MOVE_SWORDS_DANCE), - LEVEL_UP_MOVE(41, MOVE_DOUBLE_TEAM), - LEVEL_UP_MOVE(46, MOVE_FURY_CUTTER), + LEVEL_UP_MOVE( 5, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 9, MOVE_PURSUIT), + LEVEL_UP_MOVE(13, MOVE_FALSE_SWIPE), + LEVEL_UP_MOVE(17, MOVE_AGILITY), + LEVEL_UP_MOVE(21, MOVE_METAL_CLAW), + LEVEL_UP_MOVE(25, MOVE_FURY_CUTTER), + LEVEL_UP_MOVE(29, MOVE_SLASH), + LEVEL_UP_MOVE(33, MOVE_RAZOR_WIND), + LEVEL_UP_MOVE(37, MOVE_IRON_DEFENSE), + LEVEL_UP_MOVE(41, MOVE_X_SCISSOR), + LEVEL_UP_MOVE(45, MOVE_NIGHT_SLASH), + LEVEL_UP_MOVE(49, MOVE_DOUBLE_HIT), + LEVEL_UP_MOVE(50, MOVE_IRON_HEAD), + LEVEL_UP_MOVE(57, MOVE_SWORDS_DANCE), + LEVEL_UP_MOVE(61, MOVE_FEINT), LEVEL_UP_END }; -static const u16 sShuckleLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_CONSTRICT), +static const struct LevelUpMove sShuckleLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_STICKY_WEB), LEVEL_UP_MOVE( 1, MOVE_WITHDRAW), + LEVEL_UP_MOVE( 1, MOVE_CONSTRICT), + LEVEL_UP_MOVE( 1, MOVE_BIDE), + LEVEL_UP_MOVE( 1, MOVE_ROLLOUT), + LEVEL_UP_MOVE( 5, MOVE_ENCORE), LEVEL_UP_MOVE( 9, MOVE_WRAP), - LEVEL_UP_MOVE(14, MOVE_ENCORE), - LEVEL_UP_MOVE(23, MOVE_SAFEGUARD), - LEVEL_UP_MOVE(28, MOVE_BIDE), - LEVEL_UP_MOVE(37, MOVE_REST), + LEVEL_UP_MOVE(12, MOVE_STRUGGLE_BUG), + LEVEL_UP_MOVE(16, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(20, MOVE_REST), + LEVEL_UP_MOVE(23, MOVE_ROCK_THROW), + LEVEL_UP_MOVE(27, MOVE_GASTRO_ACID), + LEVEL_UP_MOVE(31, MOVE_POWER_TRICK), + LEVEL_UP_MOVE(34, MOVE_SHELL_SMASH), + LEVEL_UP_MOVE(38, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(42, MOVE_BUG_BITE), + LEVEL_UP_MOVE(45, MOVE_POWER_SPLIT), + LEVEL_UP_MOVE(45, MOVE_GUARD_SPLIT), + LEVEL_UP_MOVE(49, MOVE_STONE_EDGE), + LEVEL_UP_MOVE(53, MOVE_STICKY_WEB), LEVEL_UP_END }; -static const u16 sHeracrossLevelUpLearnset[] = { +static const struct LevelUpMove sHeracrossLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ARM_THRUST), + LEVEL_UP_MOVE( 1, MOVE_BULLET_SEED), + LEVEL_UP_MOVE( 1, MOVE_NIGHT_SLASH), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 6, MOVE_HORN_ATTACK), - LEVEL_UP_MOVE(11, MOVE_ENDURE), - LEVEL_UP_MOVE(17, MOVE_FURY_ATTACK), - LEVEL_UP_MOVE(23, MOVE_BRICK_BREAK), - LEVEL_UP_MOVE(30, MOVE_COUNTER), - LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(45, MOVE_REVERSAL), - LEVEL_UP_MOVE(53, MOVE_MEGAHORN), + LEVEL_UP_MOVE( 1, MOVE_HORN_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_ENDURE), + LEVEL_UP_MOVE( 7, MOVE_FEINT), + LEVEL_UP_MOVE(10, MOVE_AERIAL_ACE), + LEVEL_UP_MOVE(16, MOVE_CHIP_AWAY), + LEVEL_UP_MOVE(19, MOVE_COUNTER), + LEVEL_UP_MOVE(25, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(28, MOVE_BRICK_BREAK), + LEVEL_UP_MOVE(31, MOVE_PIN_MISSILE), + LEVEL_UP_MOVE(34, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(37, MOVE_MEGAHORN), + LEVEL_UP_MOVE(43, MOVE_CLOSE_COMBAT), + LEVEL_UP_MOVE(46, MOVE_REVERSAL), LEVEL_UP_END }; -static const u16 sSneaselLevelUpLearnset[] = { +static const struct LevelUpMove sSneaselLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SCRATCH), LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_TAUNT), LEVEL_UP_MOVE( 8, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(15, MOVE_SCREECH), - LEVEL_UP_MOVE(22, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE(29, MOVE_FURY_SWIPES), - LEVEL_UP_MOVE(36, MOVE_AGILITY), - LEVEL_UP_MOVE(43, MOVE_ICY_WIND), - LEVEL_UP_MOVE(50, MOVE_SLASH), - LEVEL_UP_MOVE(57, MOVE_BEAT_UP), - LEVEL_UP_MOVE(64, MOVE_METAL_CLAW), + LEVEL_UP_MOVE(10, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(14, MOVE_ICY_WIND), + LEVEL_UP_MOVE(16, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(20, MOVE_AGILITY), + LEVEL_UP_MOVE(22, MOVE_METAL_CLAW), + LEVEL_UP_MOVE(25, MOVE_HONE_CLAWS), + LEVEL_UP_MOVE(28, MOVE_BEAT_UP), + LEVEL_UP_MOVE(32, MOVE_SCREECH), + LEVEL_UP_MOVE(35, MOVE_SLASH), + LEVEL_UP_MOVE(40, MOVE_SNATCH), + LEVEL_UP_MOVE(44, MOVE_PUNISHMENT), + LEVEL_UP_MOVE(47, MOVE_ICE_SHARD), LEVEL_UP_END }; -static const u16 sTeddiursaLevelUpLearnset[] = { +static const struct LevelUpMove sTeddiursaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_FLING), + LEVEL_UP_MOVE( 1, MOVE_COVET), LEVEL_UP_MOVE( 1, MOVE_SCRATCH), - LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 7, MOVE_LICK), - LEVEL_UP_MOVE(13, MOVE_FURY_SWIPES), - LEVEL_UP_MOVE(19, MOVE_FAKE_TEARS), - LEVEL_UP_MOVE(25, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE(31, MOVE_REST), - LEVEL_UP_MOVE(37, MOVE_SLASH), + LEVEL_UP_MOVE( 1, MOVE_BABY_DOLL_EYES), + LEVEL_UP_MOVE( 1, MOVE_LICK), + LEVEL_UP_MOVE( 1, MOVE_FAKE_TEARS), + LEVEL_UP_MOVE( 8, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(15, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(22, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE(25, MOVE_PLAY_NICE), + LEVEL_UP_MOVE(29, MOVE_SLASH), + LEVEL_UP_MOVE(36, MOVE_CHARM), + LEVEL_UP_MOVE(43, MOVE_REST), LEVEL_UP_MOVE(43, MOVE_SNORE), - LEVEL_UP_MOVE(49, MOVE_THRASH), + LEVEL_UP_MOVE(50, MOVE_THRASH), + LEVEL_UP_MOVE(57, MOVE_FLING), LEVEL_UP_END }; -static const u16 sUrsaringLevelUpLearnset[] = { +static const struct LevelUpMove sUrsaringLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_HAMMER_ARM), + LEVEL_UP_MOVE( 1, MOVE_COVET), LEVEL_UP_MOVE( 1, MOVE_SCRATCH), LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_LICK), - LEVEL_UP_MOVE( 1, MOVE_FURY_SWIPES), - LEVEL_UP_MOVE( 7, MOVE_LICK), - LEVEL_UP_MOVE(13, MOVE_FURY_SWIPES), - LEVEL_UP_MOVE(19, MOVE_FAKE_TEARS), - LEVEL_UP_MOVE(25, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE(31, MOVE_REST), - LEVEL_UP_MOVE(37, MOVE_SLASH), - LEVEL_UP_MOVE(43, MOVE_SNORE), - LEVEL_UP_MOVE(49, MOVE_THRASH), + LEVEL_UP_MOVE( 1, MOVE_FAKE_TEARS), + LEVEL_UP_MOVE( 8, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(15, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(22, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE(25, MOVE_PLAY_NICE), + LEVEL_UP_MOVE(29, MOVE_SLASH), + LEVEL_UP_MOVE(38, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(47, MOVE_REST), + LEVEL_UP_MOVE(49, MOVE_SNORE), + LEVEL_UP_MOVE(58, MOVE_THRASH), + LEVEL_UP_MOVE(67, MOVE_HAMMER_ARM), LEVEL_UP_END }; -static const u16 sSlugmaLevelUpLearnset[] = { +static const struct LevelUpMove sSlugmaLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_YAWN), LEVEL_UP_MOVE( 1, MOVE_SMOG), - LEVEL_UP_MOVE( 8, MOVE_EMBER), - LEVEL_UP_MOVE(15, MOVE_ROCK_THROW), - LEVEL_UP_MOVE(22, MOVE_HARDEN), - LEVEL_UP_MOVE(29, MOVE_AMNESIA), - LEVEL_UP_MOVE(36, MOVE_FLAMETHROWER), - LEVEL_UP_MOVE(43, MOVE_ROCK_SLIDE), - LEVEL_UP_MOVE(50, MOVE_BODY_SLAM), + LEVEL_UP_MOVE( 6, MOVE_EMBER), + LEVEL_UP_MOVE( 8, MOVE_ROCK_THROW), + LEVEL_UP_MOVE(13, MOVE_HARDEN), + LEVEL_UP_MOVE(15, MOVE_INCINERATE), + LEVEL_UP_MOVE(20, MOVE_CLEAR_SMOG), + LEVEL_UP_MOVE(22, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(27, MOVE_FLAME_BURST), + LEVEL_UP_MOVE(29, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(34, MOVE_LAVA_PLUME), + LEVEL_UP_MOVE(36, MOVE_AMNESIA), + LEVEL_UP_MOVE(41, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(43, MOVE_RECOVER), + LEVEL_UP_MOVE(48, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(50, MOVE_EARTH_POWER), LEVEL_UP_END }; -static const u16 sMagcargoLevelUpLearnset[] = { +static const struct LevelUpMove sMagcargoLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_SHELL_SMASH), + LEVEL_UP_MOVE( 1, MOVE_SHELL_SMASH), + LEVEL_UP_MOVE( 1, MOVE_EARTH_POWER), LEVEL_UP_MOVE( 1, MOVE_YAWN), LEVEL_UP_MOVE( 1, MOVE_SMOG), LEVEL_UP_MOVE( 1, MOVE_EMBER), LEVEL_UP_MOVE( 1, MOVE_ROCK_THROW), - LEVEL_UP_MOVE( 8, MOVE_EMBER), - LEVEL_UP_MOVE(15, MOVE_ROCK_THROW), - LEVEL_UP_MOVE(22, MOVE_HARDEN), - LEVEL_UP_MOVE(29, MOVE_AMNESIA), - LEVEL_UP_MOVE(36, MOVE_FLAMETHROWER), - LEVEL_UP_MOVE(48, MOVE_ROCK_SLIDE), - LEVEL_UP_MOVE(60, MOVE_BODY_SLAM), + LEVEL_UP_MOVE( 6, MOVE_EMBER), + LEVEL_UP_MOVE( 8, MOVE_ROCK_THROW), + LEVEL_UP_MOVE(13, MOVE_HARDEN), + LEVEL_UP_MOVE(15, MOVE_INCINERATE), + LEVEL_UP_MOVE(20, MOVE_CLEAR_SMOG), + LEVEL_UP_MOVE(22, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(27, MOVE_FLAME_BURST), + LEVEL_UP_MOVE(29, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(34, MOVE_LAVA_PLUME), + LEVEL_UP_MOVE(36, MOVE_AMNESIA), + LEVEL_UP_MOVE(43, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(47, MOVE_RECOVER), + LEVEL_UP_MOVE(54, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(58, MOVE_EARTH_POWER), LEVEL_UP_END }; -static const u16 sSwinubLevelUpLearnset[] = { +static const struct LevelUpMove sSwinubLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_ODOR_SLEUTH), - LEVEL_UP_MOVE(10, MOVE_POWDER_SNOW), - LEVEL_UP_MOVE(19, MOVE_ENDURE), + LEVEL_UP_MOVE( 5, MOVE_MUD_SPORT), + LEVEL_UP_MOVE( 8, MOVE_POWDER_SNOW), + LEVEL_UP_MOVE(11, MOVE_MUD_SLAP), + LEVEL_UP_MOVE(14, MOVE_ENDURE), + LEVEL_UP_MOVE(18, MOVE_MUD_BOMB), + LEVEL_UP_MOVE(21, MOVE_ICY_WIND), + LEVEL_UP_MOVE(24, MOVE_ICE_SHARD), + LEVEL_UP_MOVE(28, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(35, MOVE_MIST), + LEVEL_UP_MOVE(37, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(40, MOVE_FLAIL), + LEVEL_UP_MOVE(44, MOVE_BLIZZARD), + LEVEL_UP_MOVE(48, MOVE_AMNESIA), + LEVEL_UP_END +}; + +static const struct LevelUpMove sPiloswineLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE( 1, MOVE_PECK), + LEVEL_UP_MOVE( 1, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE( 1, MOVE_MUD_SPORT), + LEVEL_UP_MOVE( 1, MOVE_POWDER_SNOW), + LEVEL_UP_MOVE( 5, MOVE_MUD_SPORT), + LEVEL_UP_MOVE( 8, MOVE_POWDER_SNOW), + LEVEL_UP_MOVE(11, MOVE_MUD_SLAP), + LEVEL_UP_MOVE(14, MOVE_ENDURE), + LEVEL_UP_MOVE(18, MOVE_MUD_BOMB), + LEVEL_UP_MOVE(21, MOVE_ICY_WIND), + LEVEL_UP_MOVE(24, MOVE_ICE_FANG), LEVEL_UP_MOVE(28, MOVE_TAKE_DOWN), LEVEL_UP_MOVE(37, MOVE_MIST), - LEVEL_UP_MOVE(46, MOVE_BLIZZARD), - LEVEL_UP_MOVE(55, MOVE_AMNESIA), + LEVEL_UP_MOVE(41, MOVE_THRASH), + LEVEL_UP_MOVE(46, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(52, MOVE_BLIZZARD), + LEVEL_UP_MOVE(58, MOVE_AMNESIA), LEVEL_UP_END }; -static const u16 sPiloswineLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_HORN_ATTACK), - LEVEL_UP_MOVE( 1, MOVE_ODOR_SLEUTH), - LEVEL_UP_MOVE( 1, MOVE_POWDER_SNOW), - LEVEL_UP_MOVE( 1, MOVE_ENDURE), - LEVEL_UP_MOVE(10, MOVE_POWDER_SNOW), - LEVEL_UP_MOVE(19, MOVE_ENDURE), - LEVEL_UP_MOVE(28, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(33, MOVE_FURY_ATTACK), - LEVEL_UP_MOVE(42, MOVE_MIST), - LEVEL_UP_MOVE(56, MOVE_BLIZZARD), - LEVEL_UP_MOVE(70, MOVE_AMNESIA), - LEVEL_UP_END -}; - -static const u16 sCorsolaLevelUpLearnset[] = { +static const struct LevelUpMove sCorsolaLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 6, MOVE_HARDEN), - LEVEL_UP_MOVE(12, MOVE_BUBBLE), - LEVEL_UP_MOVE(17, MOVE_RECOVER), - LEVEL_UP_MOVE(17, MOVE_REFRESH), - LEVEL_UP_MOVE(23, MOVE_BUBBLE_BEAM), - LEVEL_UP_MOVE(28, MOVE_SPIKE_CANNON), - LEVEL_UP_MOVE(34, MOVE_ROCK_BLAST), - LEVEL_UP_MOVE(39, MOVE_MIRROR_COAT), - LEVEL_UP_MOVE(45, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 4, MOVE_BUBBLE), + LEVEL_UP_MOVE( 8, MOVE_RECOVER), + LEVEL_UP_MOVE(10, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(13, MOVE_REFRESH), + LEVEL_UP_MOVE(17, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(20, MOVE_SPIKE_CANNON), + LEVEL_UP_MOVE(23, MOVE_LUCKY_CHANT), + LEVEL_UP_MOVE(27, MOVE_BRINE), + LEVEL_UP_MOVE(29, MOVE_IRON_DEFENSE), + LEVEL_UP_MOVE(31, MOVE_ROCK_BLAST), + LEVEL_UP_MOVE(35, MOVE_ENDURE), + LEVEL_UP_MOVE(38, MOVE_AQUA_RING), + LEVEL_UP_MOVE(41, MOVE_POWER_GEM), + LEVEL_UP_MOVE(45, MOVE_MIRROR_COAT), + LEVEL_UP_MOVE(47, MOVE_EARTH_POWER), + LEVEL_UP_MOVE(50, MOVE_FLAIL), LEVEL_UP_END }; -static const u16 sRemoraidLevelUpLearnset[] = { +static const struct LevelUpMove sRemoraidLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), - LEVEL_UP_MOVE(11, MOVE_LOCK_ON), - LEVEL_UP_MOVE(22, MOVE_PSYBEAM), - LEVEL_UP_MOVE(22, MOVE_AURORA_BEAM), - LEVEL_UP_MOVE(22, MOVE_BUBBLE_BEAM), - LEVEL_UP_MOVE(33, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE(44, MOVE_ICE_BEAM), - LEVEL_UP_MOVE(55, MOVE_HYPER_BEAM), + LEVEL_UP_MOVE( 6, MOVE_LOCK_ON), + LEVEL_UP_MOVE(10, MOVE_PSYBEAM), + LEVEL_UP_MOVE(14, MOVE_AURORA_BEAM), + LEVEL_UP_MOVE(18, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(22, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(26, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(30, MOVE_SIGNAL_BEAM), + LEVEL_UP_MOVE(34, MOVE_ICE_BEAM), + LEVEL_UP_MOVE(38, MOVE_BULLET_SEED), + LEVEL_UP_MOVE(42, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(46, MOVE_HYPER_BEAM), + LEVEL_UP_MOVE(50, MOVE_SOAK), LEVEL_UP_END }; -static const u16 sOctilleryLevelUpLearnset[] = { +static const struct LevelUpMove sOctilleryLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_OCTAZOOKA), + LEVEL_UP_MOVE( 1, MOVE_OCTAZOOKA), + LEVEL_UP_MOVE( 1, MOVE_GUNK_SHOT), + LEVEL_UP_MOVE( 1, MOVE_ROCK_BLAST), LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), - LEVEL_UP_MOVE(11, MOVE_CONSTRICT), - LEVEL_UP_MOVE(22, MOVE_PSYBEAM), - LEVEL_UP_MOVE(22, MOVE_AURORA_BEAM), - LEVEL_UP_MOVE(22, MOVE_BUBBLE_BEAM), - LEVEL_UP_MOVE(25, MOVE_OCTAZOOKA), - LEVEL_UP_MOVE(38, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE(54, MOVE_ICE_BEAM), - LEVEL_UP_MOVE(70, MOVE_HYPER_BEAM), + LEVEL_UP_MOVE( 1, MOVE_CONSTRICT), + LEVEL_UP_MOVE( 1, MOVE_PSYBEAM), + LEVEL_UP_MOVE( 1, MOVE_AURORA_BEAM), + LEVEL_UP_MOVE( 6, MOVE_CONSTRICT), + LEVEL_UP_MOVE(10, MOVE_PSYBEAM), + LEVEL_UP_MOVE(14, MOVE_AURORA_BEAM), + LEVEL_UP_MOVE(18, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(22, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(28, MOVE_WRING_OUT), + LEVEL_UP_MOVE(34, MOVE_SIGNAL_BEAM), + LEVEL_UP_MOVE(40, MOVE_ICE_BEAM), + LEVEL_UP_MOVE(46, MOVE_BULLET_SEED), + LEVEL_UP_MOVE(52, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(58, MOVE_HYPER_BEAM), + LEVEL_UP_MOVE(64, MOVE_SOAK), LEVEL_UP_END }; -static const u16 sDelibirdLevelUpLearnset[] = { +static const struct LevelUpMove sDelibirdLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_PRESENT), + LEVEL_UP_MOVE(25, MOVE_DRILL_PECK), LEVEL_UP_END }; -static const u16 sMantineLevelUpLearnset[] = { +static const struct LevelUpMove sMantineLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_PSYBEAM), + LEVEL_UP_MOVE( 1, MOVE_BULLET_SEED), + LEVEL_UP_MOVE( 1, MOVE_SIGNAL_BEAM), + LEVEL_UP_MOVE( 1, MOVE_ROOST), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_BUBBLE), - LEVEL_UP_MOVE( 8, MOVE_SUPERSONIC), - LEVEL_UP_MOVE(15, MOVE_BUBBLE_BEAM), - LEVEL_UP_MOVE(22, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(29, MOVE_AGILITY), - LEVEL_UP_MOVE(36, MOVE_WING_ATTACK), - LEVEL_UP_MOVE(43, MOVE_WATER_PULSE), - LEVEL_UP_MOVE(50, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE( 1, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 1, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE( 3, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 7, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(11, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(14, MOVE_WING_ATTACK), + LEVEL_UP_MOVE(16, MOVE_HEADBUTT), + LEVEL_UP_MOVE(19, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(23, MOVE_WIDE_GUARD), + LEVEL_UP_MOVE(27, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(32, MOVE_AGILITY), + LEVEL_UP_MOVE(36, MOVE_AIR_SLASH), + LEVEL_UP_MOVE(39, MOVE_AQUA_RING), + LEVEL_UP_MOVE(46, MOVE_BOUNCE), + LEVEL_UP_MOVE(49, MOVE_HYDRO_PUMP), LEVEL_UP_END }; -static const u16 sSkarmoryLevelUpLearnset[] = { +static const struct LevelUpMove sSkarmoryLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_PECK), - LEVEL_UP_MOVE(10, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(13, MOVE_SWIFT), - LEVEL_UP_MOVE(16, MOVE_AGILITY), - LEVEL_UP_MOVE(26, MOVE_FURY_ATTACK), - LEVEL_UP_MOVE(29, MOVE_AIR_CUTTER), - LEVEL_UP_MOVE(32, MOVE_STEEL_WING), - LEVEL_UP_MOVE(42, MOVE_SPIKES), - LEVEL_UP_MOVE(45, MOVE_METAL_SOUND), + LEVEL_UP_MOVE( 6, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 9, MOVE_METAL_CLAW), + LEVEL_UP_MOVE(12, MOVE_AIR_CUTTER), + LEVEL_UP_MOVE(17, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(20, MOVE_FEINT), + LEVEL_UP_MOVE(23, MOVE_SWIFT), + LEVEL_UP_MOVE(28, MOVE_SPIKES), + LEVEL_UP_MOVE(31, MOVE_AGILITY), + LEVEL_UP_MOVE(34, MOVE_STEEL_WING), + LEVEL_UP_MOVE(39, MOVE_SLASH), + LEVEL_UP_MOVE(42, MOVE_METAL_SOUND), + LEVEL_UP_MOVE(45, MOVE_AIR_SLASH), + LEVEL_UP_MOVE(50, MOVE_AUTOTOMIZE), + LEVEL_UP_MOVE(53, MOVE_NIGHT_SLASH), LEVEL_UP_END }; -static const u16 sHoundourLevelUpLearnset[] = { +static const struct LevelUpMove sHoundourLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_EMBER), - LEVEL_UP_MOVE( 7, MOVE_HOWL), - LEVEL_UP_MOVE(13, MOVE_SMOG), - LEVEL_UP_MOVE(19, MOVE_ROAR), - LEVEL_UP_MOVE(25, MOVE_BITE), - LEVEL_UP_MOVE(31, MOVE_ODOR_SLEUTH), - LEVEL_UP_MOVE(37, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE(43, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE( 4, MOVE_HOWL), + LEVEL_UP_MOVE( 8, MOVE_SMOG), + LEVEL_UP_MOVE(13, MOVE_ROAR), + LEVEL_UP_MOVE(16, MOVE_BITE), + LEVEL_UP_MOVE(20, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE(25, MOVE_BEAT_UP), + LEVEL_UP_MOVE(28, MOVE_FIRE_FANG), + LEVEL_UP_MOVE(32, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(37, MOVE_EMBARGO), + LEVEL_UP_MOVE(40, MOVE_FOUL_PLAY), + LEVEL_UP_MOVE(44, MOVE_FLAMETHROWER), LEVEL_UP_MOVE(49, MOVE_CRUNCH), + LEVEL_UP_MOVE(52, MOVE_NASTY_PLOT), + LEVEL_UP_MOVE(56, MOVE_INFERNO), LEVEL_UP_END }; -static const u16 sHoundoomLevelUpLearnset[] = { +static const struct LevelUpMove sHoundoomLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_INFERNO), + LEVEL_UP_MOVE( 1, MOVE_NASTY_PLOT), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_FANG), LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_EMBER), LEVEL_UP_MOVE( 1, MOVE_HOWL), - LEVEL_UP_MOVE( 7, MOVE_HOWL), - LEVEL_UP_MOVE(13, MOVE_SMOG), - LEVEL_UP_MOVE(19, MOVE_ROAR), - LEVEL_UP_MOVE(27, MOVE_BITE), - LEVEL_UP_MOVE(35, MOVE_ODOR_SLEUTH), - LEVEL_UP_MOVE(43, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE(51, MOVE_FLAMETHROWER), - LEVEL_UP_MOVE(59, MOVE_CRUNCH), + LEVEL_UP_MOVE( 1, MOVE_SMOG), + LEVEL_UP_MOVE( 4, MOVE_HOWL), + LEVEL_UP_MOVE( 8, MOVE_SMOG), + LEVEL_UP_MOVE(13, MOVE_ROAR), + LEVEL_UP_MOVE(16, MOVE_BITE), + LEVEL_UP_MOVE(20, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE(26, MOVE_BEAT_UP), + LEVEL_UP_MOVE(30, MOVE_FIRE_FANG), + LEVEL_UP_MOVE(35, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(41, MOVE_EMBARGO), + LEVEL_UP_MOVE(45, MOVE_FOUL_PLAY), + LEVEL_UP_MOVE(50, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(56, MOVE_CRUNCH), + LEVEL_UP_MOVE(60, MOVE_NASTY_PLOT), + LEVEL_UP_MOVE(65, MOVE_INFERNO), LEVEL_UP_END }; -static const u16 sKingdraLevelUpLearnset[] = { +static const struct LevelUpMove sKingdraLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE( 1, MOVE_YAWN), LEVEL_UP_MOVE( 1, MOVE_BUBBLE), LEVEL_UP_MOVE( 1, MOVE_SMOKESCREEN), LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), - LEVEL_UP_MOVE( 8, MOVE_SMOKESCREEN), - LEVEL_UP_MOVE(15, MOVE_LEER), - LEVEL_UP_MOVE(22, MOVE_WATER_GUN), - LEVEL_UP_MOVE(29, MOVE_TWISTER), - LEVEL_UP_MOVE(40, MOVE_AGILITY), - LEVEL_UP_MOVE(51, MOVE_HYDRO_PUMP), - LEVEL_UP_MOVE(62, MOVE_DRAGON_DANCE), + LEVEL_UP_MOVE( 5, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE( 9, MOVE_LEER), + LEVEL_UP_MOVE(13, MOVE_WATER_GUN), + LEVEL_UP_MOVE(17, MOVE_TWISTER), + LEVEL_UP_MOVE(21, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(26, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(31, MOVE_BRINE), + LEVEL_UP_MOVE(38, MOVE_AGILITY), + LEVEL_UP_MOVE(45, MOVE_DRAGON_PULSE), + LEVEL_UP_MOVE(52, MOVE_DRAGON_DANCE), + LEVEL_UP_MOVE(60, MOVE_HYDRO_PUMP), LEVEL_UP_END }; -static const u16 sPhanpyLevelUpLearnset[] = { +static const struct LevelUpMove sPhanpyLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_ODOR_SLEUTH), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 9, MOVE_DEFENSE_CURL), - LEVEL_UP_MOVE(17, MOVE_FLAIL), - LEVEL_UP_MOVE(25, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(33, MOVE_ROLLOUT), - LEVEL_UP_MOVE(41, MOVE_ENDURE), - LEVEL_UP_MOVE(49, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE( 1, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE( 6, MOVE_FLAIL), + LEVEL_UP_MOVE(10, MOVE_ROLLOUT), + LEVEL_UP_MOVE(15, MOVE_NATURAL_GIFT), + LEVEL_UP_MOVE(19, MOVE_ENDURE), + LEVEL_UP_MOVE(24, MOVE_SLAM), + LEVEL_UP_MOVE(28, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(33, MOVE_CHARM), + LEVEL_UP_MOVE(37, MOVE_LAST_RESORT), + LEVEL_UP_MOVE(42, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; -static const u16 sDonphanLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_ODOR_SLEUTH), +static const struct LevelUpMove sDonphanLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_FIRE_FANG), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_FANG), LEVEL_UP_MOVE( 1, MOVE_HORN_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_BULLDOZE), LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 9, MOVE_DEFENSE_CURL), - LEVEL_UP_MOVE(17, MOVE_FLAIL), - LEVEL_UP_MOVE(25, MOVE_FURY_ATTACK), - LEVEL_UP_MOVE(33, MOVE_ROLLOUT), - LEVEL_UP_MOVE(41, MOVE_RAPID_SPIN), - LEVEL_UP_MOVE(49, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE( 1, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE( 6, MOVE_RAPID_SPIN), + LEVEL_UP_MOVE(10, MOVE_ROLLOUT), + LEVEL_UP_MOVE(15, MOVE_ASSURANCE), + LEVEL_UP_MOVE(19, MOVE_KNOCK_OFF), + LEVEL_UP_MOVE(24, MOVE_SLAM), + LEVEL_UP_MOVE(30, MOVE_MAGNITUDE), + LEVEL_UP_MOVE(37, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(43, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(50, MOVE_GIGA_IMPACT), LEVEL_UP_END }; -static const u16 sPorygon2LevelUpLearnset[] = { +static const struct LevelUpMove sPorygonLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ZAP_CANNON), + LEVEL_UP_MOVE( 1, MOVE_MAGIC_COAT), LEVEL_UP_MOVE( 1, MOVE_CONVERSION_2), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_CONVERSION), - LEVEL_UP_MOVE( 9, MOVE_AGILITY), - LEVEL_UP_MOVE(12, MOVE_PSYBEAM), - LEVEL_UP_MOVE(20, MOVE_RECOVER), - LEVEL_UP_MOVE(24, MOVE_DEFENSE_CURL), - LEVEL_UP_MOVE(32, MOVE_LOCK_ON), - LEVEL_UP_MOVE(36, MOVE_TRI_ATTACK), - LEVEL_UP_MOVE(44, MOVE_RECYCLE), - LEVEL_UP_MOVE(48, MOVE_ZAP_CANNON), + LEVEL_UP_MOVE( 1, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE( 7, MOVE_PSYBEAM), + LEVEL_UP_MOVE(12, MOVE_AGILITY), + LEVEL_UP_MOVE(18, MOVE_RECOVER), + LEVEL_UP_MOVE(23, MOVE_MAGNET_RISE), + LEVEL_UP_MOVE(29, MOVE_SIGNAL_BEAM), + LEVEL_UP_MOVE(34, MOVE_RECYCLE), + LEVEL_UP_MOVE(40, MOVE_DISCHARGE), + LEVEL_UP_MOVE(45, MOVE_LOCK_ON), + LEVEL_UP_MOVE(50, MOVE_TRI_ATTACK), + LEVEL_UP_MOVE(56, MOVE_MAGIC_COAT), + LEVEL_UP_MOVE(62, MOVE_ZAP_CANNON), + LEVEL_UP_MOVE(67, MOVE_HYPER_BEAM), LEVEL_UP_END }; -static const u16 sStantlerLevelUpLearnset[] = { +static const struct LevelUpMove sStantlerLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ME_FIRST), LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 7, MOVE_LEER), - LEVEL_UP_MOVE(13, MOVE_ASTONISH), - LEVEL_UP_MOVE(19, MOVE_HYPNOSIS), - LEVEL_UP_MOVE(25, MOVE_STOMP), - LEVEL_UP_MOVE(31, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(43, MOVE_CONFUSE_RAY), - LEVEL_UP_MOVE(49, MOVE_CALM_MIND), + LEVEL_UP_MOVE( 3, MOVE_LEER), + LEVEL_UP_MOVE( 7, MOVE_ASTONISH), + LEVEL_UP_MOVE(10, MOVE_HYPNOSIS), + LEVEL_UP_MOVE(13, MOVE_STOMP), + LEVEL_UP_MOVE(16, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(21, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(23, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(27, MOVE_CALM_MIND), + LEVEL_UP_MOVE(33, MOVE_ROLE_PLAY), + LEVEL_UP_MOVE(38, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(43, MOVE_JUMP_KICK), + LEVEL_UP_MOVE(49, MOVE_IMPRISON), + LEVEL_UP_MOVE(50, MOVE_CAPTIVATE), + LEVEL_UP_MOVE(55, MOVE_ME_FIRST), LEVEL_UP_END }; -static const u16 sSmeargleLevelUpLearnset[] = { +static const struct LevelUpMove sSmeargleLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SKETCH), LEVEL_UP_MOVE(11, MOVE_SKETCH), LEVEL_UP_MOVE(21, MOVE_SKETCH), @@ -3226,1554 +4709,2048 @@ static const u16 sSmeargleLevelUpLearnset[] = { LEVEL_UP_END }; -static const u16 sTyrogueLevelUpLearnset[] = { +static const struct LevelUpMove sTyrogueLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_HELPING_HAND), + LEVEL_UP_MOVE( 1, MOVE_FAKE_OUT), + LEVEL_UP_MOVE( 1, MOVE_FORESIGHT), LEVEL_UP_END }; -static const u16 sHitmontopLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_REVENGE), +static const struct LevelUpMove sHitmontopLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_ROLLING_KICK), LEVEL_UP_MOVE( 1, MOVE_ROLLING_KICK), - LEVEL_UP_MOVE( 7, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE(13, MOVE_PURSUIT), - LEVEL_UP_MOVE(19, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(20, MOVE_TRIPLE_KICK), - LEVEL_UP_MOVE(25, MOVE_RAPID_SPIN), - LEVEL_UP_MOVE(31, MOVE_COUNTER), + LEVEL_UP_MOVE( 1, MOVE_ENDEAVOR), + LEVEL_UP_MOVE( 1, MOVE_CLOSE_COMBAT), + LEVEL_UP_MOVE( 1, MOVE_DETECT), + LEVEL_UP_MOVE( 1, MOVE_REVENGE), + LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 1, MOVE_PURSUIT), + LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 6, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(10, MOVE_PURSUIT), + LEVEL_UP_MOVE(15, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(19, MOVE_RAPID_SPIN), + LEVEL_UP_MOVE(24, MOVE_FEINT), + LEVEL_UP_MOVE(28, MOVE_COUNTER), + LEVEL_UP_MOVE(33, MOVE_TRIPLE_KICK), LEVEL_UP_MOVE(37, MOVE_AGILITY), - LEVEL_UP_MOVE(43, MOVE_DETECT), - LEVEL_UP_MOVE(49, MOVE_ENDEAVOR), + LEVEL_UP_MOVE(42, MOVE_GYRO_BALL), + LEVEL_UP_MOVE(46, MOVE_WIDE_GUARD), + LEVEL_UP_MOVE(46, MOVE_QUICK_GUARD), + LEVEL_UP_MOVE(50, MOVE_DETECT), + LEVEL_UP_MOVE(55, MOVE_CLOSE_COMBAT), + LEVEL_UP_MOVE(60, MOVE_ENDEAVOR), LEVEL_UP_END }; -static const u16 sSmoochumLevelUpLearnset[] = { +static const struct LevelUpMove sSmoochumLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_POUND), - LEVEL_UP_MOVE( 1, MOVE_LICK), - LEVEL_UP_MOVE( 9, MOVE_SWEET_KISS), - LEVEL_UP_MOVE(13, MOVE_POWDER_SNOW), - LEVEL_UP_MOVE(21, MOVE_CONFUSION), - LEVEL_UP_MOVE(25, MOVE_SING), - LEVEL_UP_MOVE(33, MOVE_MEAN_LOOK), - LEVEL_UP_MOVE(37, MOVE_FAKE_TEARS), - LEVEL_UP_MOVE(45, MOVE_PSYCHIC), - LEVEL_UP_MOVE(49, MOVE_PERISH_SONG), - LEVEL_UP_MOVE(57, MOVE_BLIZZARD), + LEVEL_UP_MOVE( 5, MOVE_LICK), + LEVEL_UP_MOVE( 8, MOVE_SWEET_KISS), + LEVEL_UP_MOVE(11, MOVE_POWDER_SNOW), + LEVEL_UP_MOVE(15, MOVE_CONFUSION), + LEVEL_UP_MOVE(18, MOVE_SING), + LEVEL_UP_MOVE(21, MOVE_HEART_STAMP), + LEVEL_UP_MOVE(25, MOVE_MEAN_LOOK), + LEVEL_UP_MOVE(28, MOVE_FAKE_TEARS), + LEVEL_UP_MOVE(31, MOVE_LUCKY_CHANT), + LEVEL_UP_MOVE(35, MOVE_AVALANCHE), + LEVEL_UP_MOVE(38, MOVE_PSYCHIC), + LEVEL_UP_MOVE(41, MOVE_COPYCAT), + LEVEL_UP_MOVE(45, MOVE_PERISH_SONG), + LEVEL_UP_MOVE(48, MOVE_BLIZZARD), LEVEL_UP_END }; -static const u16 sElekidLevelUpLearnset[] = { +static const struct LevelUpMove sElekidLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 9, MOVE_THUNDER_PUNCH), - LEVEL_UP_MOVE(17, MOVE_LIGHT_SCREEN), - LEVEL_UP_MOVE(25, MOVE_SWIFT), - LEVEL_UP_MOVE(33, MOVE_SCREECH), - LEVEL_UP_MOVE(41, MOVE_THUNDERBOLT), - LEVEL_UP_MOVE(49, MOVE_THUNDER), + LEVEL_UP_MOVE( 5, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE( 8, MOVE_LOW_KICK), + LEVEL_UP_MOVE(12, MOVE_SWIFT), + LEVEL_UP_MOVE(15, MOVE_SHOCK_WAVE), + LEVEL_UP_MOVE(19, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE(22, MOVE_ELECTRO_BALL), + LEVEL_UP_MOVE(26, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(29, MOVE_THUNDER_PUNCH), + LEVEL_UP_MOVE(33, MOVE_DISCHARGE), + LEVEL_UP_MOVE(36, MOVE_SCREECH), + LEVEL_UP_MOVE(40, MOVE_THUNDERBOLT), + LEVEL_UP_MOVE(43, MOVE_THUNDER), LEVEL_UP_END }; -static const u16 sMagbyLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_EMBER), - LEVEL_UP_MOVE( 7, MOVE_LEER), - LEVEL_UP_MOVE(13, MOVE_SMOG), - LEVEL_UP_MOVE(19, MOVE_FIRE_PUNCH), - LEVEL_UP_MOVE(25, MOVE_SMOKESCREEN), - LEVEL_UP_MOVE(31, MOVE_SUNNY_DAY), - LEVEL_UP_MOVE(37, MOVE_FLAMETHROWER), - LEVEL_UP_MOVE(43, MOVE_CONFUSE_RAY), - LEVEL_UP_MOVE(49, MOVE_FIRE_BLAST), +static const struct LevelUpMove sMagbyLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SMOG), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 5, MOVE_EMBER), + LEVEL_UP_MOVE( 8, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE(12, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(15, MOVE_FIRE_SPIN), + LEVEL_UP_MOVE(19, MOVE_CLEAR_SMOG), + LEVEL_UP_MOVE(22, MOVE_FLAME_BURST), + LEVEL_UP_MOVE(26, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(29, MOVE_FIRE_PUNCH), + LEVEL_UP_MOVE(33, MOVE_LAVA_PLUME), + LEVEL_UP_MOVE(36, MOVE_SUNNY_DAY), + LEVEL_UP_MOVE(40, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(43, MOVE_FIRE_BLAST), LEVEL_UP_END }; -static const u16 sMiltankLevelUpLearnset[] = { +static const struct LevelUpMove sMiltankLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 4, MOVE_GROWL), - LEVEL_UP_MOVE( 8, MOVE_DEFENSE_CURL), - LEVEL_UP_MOVE(13, MOVE_STOMP), - LEVEL_UP_MOVE(19, MOVE_MILK_DRINK), - LEVEL_UP_MOVE(26, MOVE_BIDE), - LEVEL_UP_MOVE(34, MOVE_ROLLOUT), - LEVEL_UP_MOVE(43, MOVE_BODY_SLAM), - LEVEL_UP_MOVE(53, MOVE_HEAL_BELL), + LEVEL_UP_MOVE( 3, MOVE_GROWL), + LEVEL_UP_MOVE( 5, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE( 8, MOVE_STOMP), + LEVEL_UP_MOVE(11, MOVE_MILK_DRINK), + LEVEL_UP_MOVE(15, MOVE_BIDE), + LEVEL_UP_MOVE(19, MOVE_ROLLOUT), + LEVEL_UP_MOVE(24, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(29, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(35, MOVE_CAPTIVATE), + LEVEL_UP_MOVE(41, MOVE_GYRO_BALL), + LEVEL_UP_MOVE(48, MOVE_HEAL_BELL), + LEVEL_UP_MOVE(50, MOVE_WAKE_UP_SLAP), LEVEL_UP_END }; -static const u16 sBlisseyLevelUpLearnset[] = { +static const struct LevelUpMove sBlisseyLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE( 1, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE( 1, MOVE_POUND), LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 4, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 7, MOVE_REFRESH), - LEVEL_UP_MOVE(10, MOVE_SOFT_BOILED), - LEVEL_UP_MOVE(13, MOVE_DOUBLE_SLAP), - LEVEL_UP_MOVE(18, MOVE_MINIMIZE), - LEVEL_UP_MOVE(23, MOVE_SING), - LEVEL_UP_MOVE(28, MOVE_EGG_BOMB), - LEVEL_UP_MOVE(33, MOVE_DEFENSE_CURL), - LEVEL_UP_MOVE(40, MOVE_LIGHT_SCREEN), - LEVEL_UP_MOVE(47, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE( 5, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 9, MOVE_REFRESH), + LEVEL_UP_MOVE(12, MOVE_DOUBLE_SLAP), + LEVEL_UP_MOVE(16, MOVE_SOFT_BOILED), + LEVEL_UP_MOVE(20, MOVE_BESTOW), + LEVEL_UP_MOVE(23, MOVE_MINIMIZE), + LEVEL_UP_MOVE(27, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(31, MOVE_SING), + LEVEL_UP_MOVE(34, MOVE_FLING), + LEVEL_UP_MOVE(39, MOVE_HEAL_PULSE), + LEVEL_UP_MOVE(44, MOVE_EGG_BOMB), + LEVEL_UP_MOVE(50, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(57, MOVE_HEALING_WISH), + LEVEL_UP_MOVE(65, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; -static const u16 sRaikouLevelUpLearnset[] = { +static const struct LevelUpMove sRaikouLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_EXTRASENSORY), + LEVEL_UP_MOVE( 1, MOVE_DISCHARGE), LEVEL_UP_MOVE( 1, MOVE_BITE), LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE(11, MOVE_THUNDER_SHOCK), - LEVEL_UP_MOVE(21, MOVE_ROAR), - LEVEL_UP_MOVE(31, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(41, MOVE_SPARK), - LEVEL_UP_MOVE(51, MOVE_REFLECT), - LEVEL_UP_MOVE(61, MOVE_CRUNCH), - LEVEL_UP_MOVE(71, MOVE_THUNDER), - LEVEL_UP_MOVE(81, MOVE_CALM_MIND), - LEVEL_UP_END -}; - -static const u16 sEnteiLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_BITE), - LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE(11, MOVE_EMBER), - LEVEL_UP_MOVE(21, MOVE_ROAR), - LEVEL_UP_MOVE(31, MOVE_FIRE_SPIN), - LEVEL_UP_MOVE(41, MOVE_STOMP), - LEVEL_UP_MOVE(51, MOVE_FLAMETHROWER), - LEVEL_UP_MOVE(61, MOVE_SWAGGER), - LEVEL_UP_MOVE(71, MOVE_FIRE_BLAST), - LEVEL_UP_MOVE(81, MOVE_CALM_MIND), - LEVEL_UP_END -}; - -static const u16 sSuicuneLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_BITE), - LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE(11, MOVE_BUBBLE_BEAM), - LEVEL_UP_MOVE(21, MOVE_RAIN_DANCE), - LEVEL_UP_MOVE(31, MOVE_GUST), - LEVEL_UP_MOVE(41, MOVE_AURORA_BEAM), - LEVEL_UP_MOVE(51, MOVE_MIST), - LEVEL_UP_MOVE(61, MOVE_MIRROR_COAT), - LEVEL_UP_MOVE(71, MOVE_HYDRO_PUMP), - LEVEL_UP_MOVE(81, MOVE_CALM_MIND), - LEVEL_UP_END -}; - -static const u16 sLarvitarLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_BITE), - LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 8, MOVE_SANDSTORM), - LEVEL_UP_MOVE(15, MOVE_SCREECH), - LEVEL_UP_MOVE(22, MOVE_ROCK_SLIDE), - LEVEL_UP_MOVE(29, MOVE_THRASH), - LEVEL_UP_MOVE(36, MOVE_SCARY_FACE), + LEVEL_UP_MOVE( 8, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE(15, MOVE_ROAR), + LEVEL_UP_MOVE(22, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(29, MOVE_SPARK), + LEVEL_UP_MOVE(36, MOVE_REFLECT), LEVEL_UP_MOVE(43, MOVE_CRUNCH), - LEVEL_UP_MOVE(50, MOVE_EARTHQUAKE), - LEVEL_UP_MOVE(57, MOVE_HYPER_BEAM), + LEVEL_UP_MOVE(50, MOVE_THUNDER_FANG), + LEVEL_UP_MOVE(57, MOVE_DISCHARGE), + LEVEL_UP_MOVE(64, MOVE_EXTRASENSORY), + LEVEL_UP_MOVE(71, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(78, MOVE_CALM_MIND), + LEVEL_UP_MOVE(85, MOVE_THUNDER), LEVEL_UP_END }; -static const u16 sPupitarLevelUpLearnset[] = { +static const struct LevelUpMove sEnteiLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SACRED_FIRE), + LEVEL_UP_MOVE( 1, MOVE_ERUPTION), + LEVEL_UP_MOVE( 1, MOVE_EXTRASENSORY), + LEVEL_UP_MOVE( 1, MOVE_LAVA_PLUME), + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 8, MOVE_EMBER), + LEVEL_UP_MOVE(15, MOVE_ROAR), + LEVEL_UP_MOVE(22, MOVE_FIRE_SPIN), + LEVEL_UP_MOVE(29, MOVE_STOMP), + LEVEL_UP_MOVE(36, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(43, MOVE_SWAGGER), + LEVEL_UP_MOVE(50, MOVE_FIRE_FANG), + LEVEL_UP_MOVE(57, MOVE_LAVA_PLUME), + LEVEL_UP_MOVE(64, MOVE_EXTRASENSORY), + LEVEL_UP_MOVE(71, MOVE_FIRE_BLAST), + LEVEL_UP_MOVE(78, MOVE_CALM_MIND), + LEVEL_UP_MOVE(85, MOVE_ERUPTION), + LEVEL_UP_END +}; + +static const struct LevelUpMove sSuicuneLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SHEER_COLD), + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE( 1, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE( 8, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(15, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(22, MOVE_GUST), + LEVEL_UP_MOVE(29, MOVE_AURORA_BEAM), + LEVEL_UP_MOVE(36, MOVE_MIST), + LEVEL_UP_MOVE(43, MOVE_MIRROR_COAT), + LEVEL_UP_MOVE(50, MOVE_ICE_FANG), + LEVEL_UP_MOVE(57, MOVE_TAILWIND), + LEVEL_UP_MOVE(64, MOVE_EXTRASENSORY), + LEVEL_UP_MOVE(71, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(78, MOVE_CALM_MIND), + LEVEL_UP_MOVE(85, MOVE_BLIZZARD), + LEVEL_UP_END +}; + +static const struct LevelUpMove sLarvitarLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 5, MOVE_SANDSTORM), + LEVEL_UP_MOVE(10, MOVE_SCREECH), + LEVEL_UP_MOVE(14, MOVE_CHIP_AWAY), + LEVEL_UP_MOVE(19, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(23, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(28, MOVE_THRASH), + LEVEL_UP_MOVE(32, MOVE_DARK_PULSE), + LEVEL_UP_MOVE(37, MOVE_PAYBACK), + LEVEL_UP_MOVE(41, MOVE_CRUNCH), + LEVEL_UP_MOVE(46, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(50, MOVE_STONE_EDGE), + LEVEL_UP_MOVE(55, MOVE_HYPER_BEAM), + LEVEL_UP_END +}; + +static const struct LevelUpMove sPupitarLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_BITE), LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_SANDSTORM), LEVEL_UP_MOVE( 1, MOVE_SCREECH), - LEVEL_UP_MOVE( 8, MOVE_SANDSTORM), - LEVEL_UP_MOVE(15, MOVE_SCREECH), - LEVEL_UP_MOVE(22, MOVE_ROCK_SLIDE), - LEVEL_UP_MOVE(29, MOVE_THRASH), - LEVEL_UP_MOVE(38, MOVE_SCARY_FACE), + LEVEL_UP_MOVE( 5, MOVE_SANDSTORM), + LEVEL_UP_MOVE(10, MOVE_SCREECH), + LEVEL_UP_MOVE(14, MOVE_CHIP_AWAY), + LEVEL_UP_MOVE(19, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(23, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(28, MOVE_THRASH), + LEVEL_UP_MOVE(34, MOVE_DARK_PULSE), + LEVEL_UP_MOVE(41, MOVE_PAYBACK), LEVEL_UP_MOVE(47, MOVE_CRUNCH), - LEVEL_UP_MOVE(56, MOVE_EARTHQUAKE), - LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM), + LEVEL_UP_MOVE(54, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(60, MOVE_STONE_EDGE), + LEVEL_UP_MOVE(67, MOVE_HYPER_BEAM), LEVEL_UP_END }; -static const u16 sTyranitarLevelUpLearnset[] = { +static const struct LevelUpMove sTyranitarLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_THUNDER_FANG), + LEVEL_UP_MOVE( 1, MOVE_ICE_FANG), + LEVEL_UP_MOVE( 1, MOVE_FIRE_FANG), LEVEL_UP_MOVE( 1, MOVE_BITE), LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_SANDSTORM), LEVEL_UP_MOVE( 1, MOVE_SCREECH), - LEVEL_UP_MOVE( 8, MOVE_SANDSTORM), - LEVEL_UP_MOVE(15, MOVE_SCREECH), - LEVEL_UP_MOVE(22, MOVE_ROCK_SLIDE), - LEVEL_UP_MOVE(29, MOVE_THRASH), - LEVEL_UP_MOVE(38, MOVE_SCARY_FACE), + LEVEL_UP_MOVE( 5, MOVE_SANDSTORM), + LEVEL_UP_MOVE(10, MOVE_SCREECH), + LEVEL_UP_MOVE(14, MOVE_CHIP_AWAY), + LEVEL_UP_MOVE(19, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(23, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(28, MOVE_THRASH), + LEVEL_UP_MOVE(34, MOVE_DARK_PULSE), + LEVEL_UP_MOVE(41, MOVE_PAYBACK), LEVEL_UP_MOVE(47, MOVE_CRUNCH), - LEVEL_UP_MOVE(61, MOVE_EARTHQUAKE), - LEVEL_UP_MOVE(75, MOVE_HYPER_BEAM), + LEVEL_UP_MOVE(54, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(63, MOVE_STONE_EDGE), + LEVEL_UP_MOVE(73, MOVE_HYPER_BEAM), + LEVEL_UP_MOVE(82, MOVE_GIGA_IMPACT), LEVEL_UP_END }; -static const u16 sLugiaLevelUpLearnset[] = { +static const struct LevelUpMove sLugiaLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_WHIRLWIND), - LEVEL_UP_MOVE(11, MOVE_SAFEGUARD), - LEVEL_UP_MOVE(22, MOVE_GUST), - LEVEL_UP_MOVE(33, MOVE_RECOVER), - LEVEL_UP_MOVE(44, MOVE_HYDRO_PUMP), - LEVEL_UP_MOVE(55, MOVE_RAIN_DANCE), - LEVEL_UP_MOVE(66, MOVE_SWIFT), - LEVEL_UP_MOVE(77, MOVE_AEROBLAST), - LEVEL_UP_MOVE(88, MOVE_ANCIENT_POWER), - LEVEL_UP_MOVE(99, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE( 1, MOVE_WEATHER_BALL), + LEVEL_UP_MOVE( 9, MOVE_GUST), + LEVEL_UP_MOVE(15, MOVE_DRAGON_RUSH), + LEVEL_UP_MOVE(23, MOVE_EXTRASENSORY), + LEVEL_UP_MOVE(29, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(37, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(43, MOVE_AEROBLAST), + LEVEL_UP_MOVE(50, MOVE_PUNISHMENT), + LEVEL_UP_MOVE(57, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(65, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(71, MOVE_RECOVER), + LEVEL_UP_MOVE(79, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(85, MOVE_NATURAL_GIFT), + LEVEL_UP_MOVE(93, MOVE_CALM_MIND), + LEVEL_UP_MOVE(99, MOVE_SKY_ATTACK), LEVEL_UP_END }; -static const u16 sHoOhLevelUpLearnset[] = { +static const struct LevelUpMove sHoOhLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_WHIRLWIND), - LEVEL_UP_MOVE(11, MOVE_SAFEGUARD), - LEVEL_UP_MOVE(22, MOVE_GUST), - LEVEL_UP_MOVE(33, MOVE_RECOVER), - LEVEL_UP_MOVE(44, MOVE_FIRE_BLAST), - LEVEL_UP_MOVE(55, MOVE_SUNNY_DAY), - LEVEL_UP_MOVE(66, MOVE_SWIFT), - LEVEL_UP_MOVE(77, MOVE_SACRED_FIRE), - LEVEL_UP_MOVE(88, MOVE_ANCIENT_POWER), - LEVEL_UP_MOVE(99, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE( 1, MOVE_WEATHER_BALL), + LEVEL_UP_MOVE( 9, MOVE_GUST), + LEVEL_UP_MOVE(15, MOVE_BRAVE_BIRD), + LEVEL_UP_MOVE(23, MOVE_EXTRASENSORY), + LEVEL_UP_MOVE(29, MOVE_SUNNY_DAY), + LEVEL_UP_MOVE(37, MOVE_FIRE_BLAST), + LEVEL_UP_MOVE(43, MOVE_SACRED_FIRE), + LEVEL_UP_MOVE(50, MOVE_PUNISHMENT), + LEVEL_UP_MOVE(57, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(65, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(71, MOVE_RECOVER), + LEVEL_UP_MOVE(79, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(85, MOVE_NATURAL_GIFT), + LEVEL_UP_MOVE(93, MOVE_CALM_MIND), + LEVEL_UP_MOVE(99, MOVE_SKY_ATTACK), LEVEL_UP_END }; -static const u16 sCelebiLevelUpLearnset[] = { +static const struct LevelUpMove sCelebiLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_LEECH_SEED), LEVEL_UP_MOVE( 1, MOVE_CONFUSION), LEVEL_UP_MOVE( 1, MOVE_RECOVER), LEVEL_UP_MOVE( 1, MOVE_HEAL_BELL), LEVEL_UP_MOVE(10, MOVE_SAFEGUARD), - LEVEL_UP_MOVE(20, MOVE_ANCIENT_POWER), - LEVEL_UP_MOVE(30, MOVE_FUTURE_SIGHT), - LEVEL_UP_MOVE(40, MOVE_BATON_PASS), - LEVEL_UP_MOVE(50, MOVE_PERISH_SONG), + LEVEL_UP_MOVE(19, MOVE_MAGICAL_LEAF), + LEVEL_UP_MOVE(28, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(37, MOVE_BATON_PASS), + LEVEL_UP_MOVE(46, MOVE_NATURAL_GIFT), + LEVEL_UP_MOVE(55, MOVE_HEAL_BLOCK), + LEVEL_UP_MOVE(64, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(73, MOVE_HEALING_WISH), + LEVEL_UP_MOVE(82, MOVE_LEAF_STORM), + LEVEL_UP_MOVE(91, MOVE_PERISH_SONG), LEVEL_UP_END }; -static const u16 sSpecies252LevelUpLearnset[] = { +static const struct LevelUpMove sSpecies252LevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_END }; -static const u16 sSpecies253LevelUpLearnset[] = { +static const struct LevelUpMove sSpecies253LevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_END }; -static const u16 sSpecies254LevelUpLearnset[] = { +static const struct LevelUpMove sSpecies254LevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_END }; -static const u16 sSpecies255LevelUpLearnset[] = { +static const struct LevelUpMove sSpecies255LevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_END }; -static const u16 sSpecies256LevelUpLearnset[] = { +static const struct LevelUpMove sSpecies256LevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_END }; -static const u16 sSpecies257LevelUpLearnset[] = { +static const struct LevelUpMove sSpecies257LevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_END }; -static const u16 sSpecies258LevelUpLearnset[] = { +static const struct LevelUpMove sSpecies258LevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_END }; -static const u16 sSpecies259LevelUpLearnset[] = { +static const struct LevelUpMove sSpecies259LevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_END }; -static const u16 sSpecies260LevelUpLearnset[] = { +static const struct LevelUpMove sSpecies260LevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_END }; -static const u16 sSpecies261LevelUpLearnset[] = { +static const struct LevelUpMove sSpecies261LevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_END }; -static const u16 sSpecies262LevelUpLearnset[] = { +static const struct LevelUpMove sSpecies262LevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_END }; -static const u16 sSpecies263LevelUpLearnset[] = { +static const struct LevelUpMove sSpecies263LevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_END }; -static const u16 sSpecies264LevelUpLearnset[] = { +static const struct LevelUpMove sSpecies264LevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_END }; -static const u16 sSpecies265LevelUpLearnset[] = { +static const struct LevelUpMove sSpecies265LevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_END }; -static const u16 sSpecies266LevelUpLearnset[] = { +static const struct LevelUpMove sSpecies266LevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_END }; -static const u16 sSpecies267LevelUpLearnset[] = { +static const struct LevelUpMove sSpecies267LevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_END }; -static const u16 sSpecies268LevelUpLearnset[] = { +static const struct LevelUpMove sSpecies268LevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_END }; -static const u16 sSpecies269LevelUpLearnset[] = { +static const struct LevelUpMove sSpecies269LevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_END }; -static const u16 sSpecies270LevelUpLearnset[] = { +static const struct LevelUpMove sSpecies270LevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_END }; -static const u16 sSpecies271LevelUpLearnset[] = { +static const struct LevelUpMove sSpecies271LevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_END }; -static const u16 sSpecies272LevelUpLearnset[] = { +static const struct LevelUpMove sSpecies272LevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_END }; -static const u16 sSpecies273LevelUpLearnset[] = { +static const struct LevelUpMove sSpecies273LevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_END }; -static const u16 sSpecies274LevelUpLearnset[] = { +static const struct LevelUpMove sSpecies274LevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_END }; -static const u16 sSpecies275LevelUpLearnset[] = { +static const struct LevelUpMove sSpecies275LevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_END }; -static const u16 sSpecies276LevelUpLearnset[] = { +static const struct LevelUpMove sSpecies276LevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_END }; -static const u16 sTreeckoLevelUpLearnset[] = { +static const struct LevelUpMove sTreeckoLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_POUND), LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 6, MOVE_ABSORB), - LEVEL_UP_MOVE(11, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(16, MOVE_PURSUIT), - LEVEL_UP_MOVE(21, MOVE_SCREECH), - LEVEL_UP_MOVE(26, MOVE_MEGA_DRAIN), - LEVEL_UP_MOVE(31, MOVE_AGILITY), - LEVEL_UP_MOVE(36, MOVE_SLAM), - LEVEL_UP_MOVE(41, MOVE_DETECT), - LEVEL_UP_MOVE(46, MOVE_GIGA_DRAIN), + LEVEL_UP_MOVE( 5, MOVE_ABSORB), + LEVEL_UP_MOVE( 9, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(13, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(17, MOVE_PURSUIT), + LEVEL_UP_MOVE(21, MOVE_GIGA_DRAIN), + LEVEL_UP_MOVE(25, MOVE_AGILITY), + LEVEL_UP_MOVE(29, MOVE_SLAM), + LEVEL_UP_MOVE(33, MOVE_DETECT), + LEVEL_UP_MOVE(37, MOVE_ENERGY_BALL), + LEVEL_UP_MOVE(41, MOVE_QUICK_GUARD), + LEVEL_UP_MOVE(45, MOVE_ENDEAVOR), + LEVEL_UP_MOVE(49, MOVE_SCREECH), LEVEL_UP_END }; -static const u16 sGrovyleLevelUpLearnset[] = { +static const struct LevelUpMove sGrovyleLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_FURY_CUTTER), + LEVEL_UP_MOVE( 1, MOVE_FURY_CUTTER), LEVEL_UP_MOVE( 1, MOVE_POUND), LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_ABSORB), LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE( 6, MOVE_ABSORB), - LEVEL_UP_MOVE(11, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(16, MOVE_FURY_CUTTER), - LEVEL_UP_MOVE(17, MOVE_PURSUIT), - LEVEL_UP_MOVE(23, MOVE_SCREECH), - LEVEL_UP_MOVE(29, MOVE_LEAF_BLADE), - LEVEL_UP_MOVE(35, MOVE_AGILITY), - LEVEL_UP_MOVE(41, MOVE_SLAM), - LEVEL_UP_MOVE(47, MOVE_DETECT), - LEVEL_UP_MOVE(53, MOVE_FALSE_SWIPE), + LEVEL_UP_MOVE( 5, MOVE_ABSORB), + LEVEL_UP_MOVE( 9, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(13, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(18, MOVE_PURSUIT), + LEVEL_UP_MOVE(23, MOVE_LEAF_BLADE), + LEVEL_UP_MOVE(28, MOVE_AGILITY), + LEVEL_UP_MOVE(33, MOVE_SLAM), + LEVEL_UP_MOVE(38, MOVE_DETECT), + LEVEL_UP_MOVE(43, MOVE_X_SCISSOR), + LEVEL_UP_MOVE(48, MOVE_FALSE_SWIPE), + LEVEL_UP_MOVE(53, MOVE_QUICK_GUARD), + LEVEL_UP_MOVE(58, MOVE_LEAF_STORM), + LEVEL_UP_MOVE(63, MOVE_SCREECH), LEVEL_UP_END }; -static const u16 sSceptileLevelUpLearnset[] = { +static const struct LevelUpMove sSceptileLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_DUAL_CHOP), + LEVEL_UP_MOVE( 1, MOVE_DUAL_CHOP), + LEVEL_UP_MOVE( 1, MOVE_FURY_CUTTER), + LEVEL_UP_MOVE( 1, MOVE_LEAF_STORM), + LEVEL_UP_MOVE( 1, MOVE_NIGHT_SLASH), LEVEL_UP_MOVE( 1, MOVE_POUND), LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_ABSORB), LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE( 6, MOVE_ABSORB), - LEVEL_UP_MOVE(11, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(16, MOVE_FURY_CUTTER), - LEVEL_UP_MOVE(17, MOVE_PURSUIT), - LEVEL_UP_MOVE(23, MOVE_SCREECH), - LEVEL_UP_MOVE(29, MOVE_LEAF_BLADE), - LEVEL_UP_MOVE(35, MOVE_AGILITY), - LEVEL_UP_MOVE(43, MOVE_SLAM), - LEVEL_UP_MOVE(51, MOVE_DETECT), - LEVEL_UP_MOVE(59, MOVE_FALSE_SWIPE), + LEVEL_UP_MOVE( 5, MOVE_ABSORB), + LEVEL_UP_MOVE( 9, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(13, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(18, MOVE_PURSUIT), + LEVEL_UP_MOVE(23, MOVE_LEAF_BLADE), + LEVEL_UP_MOVE(28, MOVE_AGILITY), + LEVEL_UP_MOVE(33, MOVE_SLAM), + LEVEL_UP_MOVE(39, MOVE_DETECT), + LEVEL_UP_MOVE(45, MOVE_X_SCISSOR), + LEVEL_UP_MOVE(51, MOVE_FALSE_SWIPE), + LEVEL_UP_MOVE(57, MOVE_QUICK_GUARD), + LEVEL_UP_MOVE(63, MOVE_LEAF_STORM), + LEVEL_UP_MOVE(69, MOVE_SCREECH), LEVEL_UP_END }; -static const u16 sTorchicLevelUpLearnset[] = { +static const struct LevelUpMove sTorchicLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SCRATCH), LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 7, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE(10, MOVE_EMBER), - LEVEL_UP_MOVE(16, MOVE_PECK), - LEVEL_UP_MOVE(19, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(25, MOVE_FIRE_SPIN), - LEVEL_UP_MOVE(28, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(34, MOVE_SLASH), - LEVEL_UP_MOVE(37, MOVE_MIRROR_MOVE), - LEVEL_UP_MOVE(43, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE( 5, MOVE_EMBER), + LEVEL_UP_MOVE(10, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(14, MOVE_PECK), + LEVEL_UP_MOVE(19, MOVE_FIRE_SPIN), + LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(28, MOVE_FLAME_BURST), + LEVEL_UP_MOVE(32, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(37, MOVE_SLASH), + LEVEL_UP_MOVE(41, MOVE_MIRROR_MOVE), + LEVEL_UP_MOVE(46, MOVE_FLAMETHROWER), LEVEL_UP_END }; -static const u16 sCombuskenLevelUpLearnset[] = { +static const struct LevelUpMove sCombuskenLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_DOUBLE_KICK), + LEVEL_UP_MOVE( 1, MOVE_DOUBLE_KICK), LEVEL_UP_MOVE( 1, MOVE_SCRATCH), LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE( 1, MOVE_EMBER), - LEVEL_UP_MOVE( 7, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE(13, MOVE_EMBER), - LEVEL_UP_MOVE(16, MOVE_DOUBLE_KICK), - LEVEL_UP_MOVE(17, MOVE_PECK), - LEVEL_UP_MOVE(21, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(28, MOVE_BULK_UP), - LEVEL_UP_MOVE(32, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(39, MOVE_SLASH), - LEVEL_UP_MOVE(43, MOVE_MIRROR_MOVE), - LEVEL_UP_MOVE(50, MOVE_SKY_UPPERCUT), - LEVEL_UP_END -}; - -static const u16 sBlazikenLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_FIRE_PUNCH), - LEVEL_UP_MOVE( 1, MOVE_SCRATCH), - LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE( 1, MOVE_EMBER), - LEVEL_UP_MOVE( 7, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE(13, MOVE_EMBER), - LEVEL_UP_MOVE(16, MOVE_DOUBLE_KICK), - LEVEL_UP_MOVE(17, MOVE_PECK), - LEVEL_UP_MOVE(21, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(28, MOVE_BULK_UP), - LEVEL_UP_MOVE(32, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(36, MOVE_BLAZE_KICK), + LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 5, MOVE_EMBER), + LEVEL_UP_MOVE(10, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(14, MOVE_PECK), + LEVEL_UP_MOVE(20, MOVE_FLAME_CHARGE), + LEVEL_UP_MOVE(25, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(31, MOVE_BULK_UP), + LEVEL_UP_MOVE(36, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE(42, MOVE_SLASH), - LEVEL_UP_MOVE(49, MOVE_MIRROR_MOVE), - LEVEL_UP_MOVE(59, MOVE_SKY_UPPERCUT), + LEVEL_UP_MOVE(47, MOVE_MIRROR_MOVE), + LEVEL_UP_MOVE(53, MOVE_SKY_UPPERCUT), + LEVEL_UP_MOVE(58, MOVE_FLARE_BLITZ), LEVEL_UP_END }; -static const u16 sMudkipLevelUpLearnset[] = { +static const struct LevelUpMove sBlazikenLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_BLAZE_KICK), + LEVEL_UP_MOVE( 1, MOVE_BLAZE_KICK), + LEVEL_UP_MOVE( 1, MOVE_DOUBLE_KICK), + LEVEL_UP_MOVE( 1, MOVE_FLARE_BLITZ), + LEVEL_UP_MOVE( 1, MOVE_FIRE_PUNCH), + LEVEL_UP_MOVE( 1, MOVE_HI_JUMP_KICK), + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_EMBER), + LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 5, MOVE_EMBER), + LEVEL_UP_MOVE(10, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(14, MOVE_PECK), + LEVEL_UP_MOVE(20, MOVE_FLAME_CHARGE), + LEVEL_UP_MOVE(25, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(31, MOVE_BULK_UP), + LEVEL_UP_MOVE(37, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(44, MOVE_SLASH), + LEVEL_UP_MOVE(50, MOVE_BRAVE_BIRD), + LEVEL_UP_MOVE(57, MOVE_SKY_UPPERCUT), + LEVEL_UP_MOVE(63, MOVE_FLARE_BLITZ), + LEVEL_UP_END +}; + +static const struct LevelUpMove sMudkipLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 6, MOVE_MUD_SLAP), - LEVEL_UP_MOVE(10, MOVE_WATER_GUN), - LEVEL_UP_MOVE(15, MOVE_BIDE), - LEVEL_UP_MOVE(19, MOVE_FORESIGHT), - LEVEL_UP_MOVE(24, MOVE_MUD_SPORT), - LEVEL_UP_MOVE(28, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE( 4, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 9, MOVE_MUD_SLAP), + LEVEL_UP_MOVE(12, MOVE_FORESIGHT), + LEVEL_UP_MOVE(17, MOVE_BIDE), + LEVEL_UP_MOVE(20, MOVE_MUD_SPORT), + LEVEL_UP_MOVE(25, MOVE_ROCK_THROW), + LEVEL_UP_MOVE(28, MOVE_PROTECT), LEVEL_UP_MOVE(33, MOVE_WHIRLPOOL), - LEVEL_UP_MOVE(37, MOVE_PROTECT), - LEVEL_UP_MOVE(42, MOVE_HYDRO_PUMP), - LEVEL_UP_MOVE(46, MOVE_ENDEAVOR), + LEVEL_UP_MOVE(36, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(41, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(44, MOVE_ENDEAVOR), LEVEL_UP_END }; -static const u16 sMarshtompLevelUpLearnset[] = { +static const struct LevelUpMove sMarshtompLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_MUD_SHOT), + LEVEL_UP_MOVE( 1, MOVE_MUD_SHOT), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 1, MOVE_MUD_SLAP), LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), - LEVEL_UP_MOVE( 6, MOVE_MUD_SLAP), - LEVEL_UP_MOVE(10, MOVE_WATER_GUN), - LEVEL_UP_MOVE(15, MOVE_BIDE), - LEVEL_UP_MOVE(16, MOVE_MUD_SHOT), - LEVEL_UP_MOVE(20, MOVE_FORESIGHT), - LEVEL_UP_MOVE(25, MOVE_MUD_SPORT), - LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(37, MOVE_MUDDY_WATER), - LEVEL_UP_MOVE(42, MOVE_PROTECT), - LEVEL_UP_MOVE(46, MOVE_EARTHQUAKE), - LEVEL_UP_MOVE(53, MOVE_ENDEAVOR), + LEVEL_UP_MOVE( 1, MOVE_MUD_SLAP), + LEVEL_UP_MOVE( 4, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 9, MOVE_MUD_SLAP), + LEVEL_UP_MOVE(12, MOVE_FORESIGHT), + LEVEL_UP_MOVE(18, MOVE_BIDE), + LEVEL_UP_MOVE(22, MOVE_MUD_BOMB), + LEVEL_UP_MOVE(28, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(32, MOVE_PROTECT), + LEVEL_UP_MOVE(38, MOVE_MUDDY_WATER), + LEVEL_UP_MOVE(42, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(48, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(52, MOVE_ENDEAVOR), LEVEL_UP_END }; -static const u16 sSwampertLevelUpLearnset[] = { +static const struct LevelUpMove sSwampertLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_MUD_SHOT), + LEVEL_UP_MOVE( 1, MOVE_HAMMER_ARM), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 1, MOVE_MUD_SLAP), LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), - LEVEL_UP_MOVE( 6, MOVE_MUD_SLAP), - LEVEL_UP_MOVE(10, MOVE_WATER_GUN), - LEVEL_UP_MOVE(15, MOVE_BIDE), - LEVEL_UP_MOVE(16, MOVE_MUD_SHOT), - LEVEL_UP_MOVE(20, MOVE_FORESIGHT), - LEVEL_UP_MOVE(25, MOVE_MUD_SPORT), - LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE( 1, MOVE_MUD_SLAP), + LEVEL_UP_MOVE( 4, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 9, MOVE_MUD_SLAP), + LEVEL_UP_MOVE(12, MOVE_FORESIGHT), + LEVEL_UP_MOVE(18, MOVE_BIDE), + LEVEL_UP_MOVE(22, MOVE_MUD_BOMB), + LEVEL_UP_MOVE(28, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(32, MOVE_PROTECT), LEVEL_UP_MOVE(39, MOVE_MUDDY_WATER), - LEVEL_UP_MOVE(46, MOVE_PROTECT), - LEVEL_UP_MOVE(52, MOVE_EARTHQUAKE), - LEVEL_UP_MOVE(61, MOVE_ENDEAVOR), + LEVEL_UP_MOVE(44, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(51, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(56, MOVE_ENDEAVOR), + LEVEL_UP_MOVE(63, MOVE_HAMMER_ARM), LEVEL_UP_END }; -static const u16 sPoochyenaLevelUpLearnset[] = { +static const struct LevelUpMove sPoochyenaLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 5, MOVE_HOWL), - LEVEL_UP_MOVE( 9, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(13, MOVE_BITE), - LEVEL_UP_MOVE(17, MOVE_ODOR_SLEUTH), - LEVEL_UP_MOVE(21, MOVE_ROAR), - LEVEL_UP_MOVE(25, MOVE_SWAGGER), - LEVEL_UP_MOVE(29, MOVE_SCARY_FACE), - LEVEL_UP_MOVE(33, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(37, MOVE_TAUNT), - LEVEL_UP_MOVE(41, MOVE_CRUNCH), - LEVEL_UP_MOVE(45, MOVE_THIEF), + LEVEL_UP_MOVE( 4, MOVE_HOWL), + LEVEL_UP_MOVE( 7, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(10, MOVE_BITE), + LEVEL_UP_MOVE(13, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE(16, MOVE_ROAR), + LEVEL_UP_MOVE(19, MOVE_SWAGGER), + LEVEL_UP_MOVE(22, MOVE_ASSURANCE), + LEVEL_UP_MOVE(25, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(28, MOVE_EMBARGO), + LEVEL_UP_MOVE(31, MOVE_TAUNT), + LEVEL_UP_MOVE(34, MOVE_CRUNCH), + LEVEL_UP_MOVE(37, MOVE_YAWN), + LEVEL_UP_MOVE(40, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(43, MOVE_SUCKER_PUNCH), + LEVEL_UP_MOVE(46, MOVE_PLAY_ROUGH), LEVEL_UP_END }; -static const u16 sMightyenaLevelUpLearnset[] = { +static const struct LevelUpMove sMightyenaLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_SNARL), + LEVEL_UP_MOVE( 1, MOVE_SNARL), + LEVEL_UP_MOVE( 1, MOVE_FIRE_FANG), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_FANG), + LEVEL_UP_MOVE( 1, MOVE_ICE_FANG), + LEVEL_UP_MOVE( 1, MOVE_CRUNCH), + LEVEL_UP_MOVE( 1, MOVE_THIEF), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_HOWL), LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), LEVEL_UP_MOVE( 1, MOVE_BITE), - LEVEL_UP_MOVE( 5, MOVE_HOWL), - LEVEL_UP_MOVE( 9, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(13, MOVE_BITE), - LEVEL_UP_MOVE(17, MOVE_ODOR_SLEUTH), - LEVEL_UP_MOVE(22, MOVE_ROAR), - LEVEL_UP_MOVE(27, MOVE_SWAGGER), - LEVEL_UP_MOVE(32, MOVE_SCARY_FACE), - LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(42, MOVE_TAUNT), - LEVEL_UP_MOVE(47, MOVE_CRUNCH), - LEVEL_UP_MOVE(52, MOVE_THIEF), + LEVEL_UP_MOVE( 4, MOVE_HOWL), + LEVEL_UP_MOVE( 7, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(10, MOVE_BITE), + LEVEL_UP_MOVE(13, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE(16, MOVE_ROAR), + LEVEL_UP_MOVE(20, MOVE_SWAGGER), + LEVEL_UP_MOVE(24, MOVE_ASSURANCE), + LEVEL_UP_MOVE(28, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(32, MOVE_EMBARGO), + LEVEL_UP_MOVE(36, MOVE_TAUNT), + LEVEL_UP_MOVE(40, MOVE_CRUNCH), + LEVEL_UP_MOVE(44, MOVE_YAWN), + LEVEL_UP_MOVE(48, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(52, MOVE_SUCKER_PUNCH), + LEVEL_UP_MOVE(56, MOVE_PLAY_ROUGH), LEVEL_UP_END }; -static const u16 sZigzagoonLevelUpLearnset[] = { +static const struct LevelUpMove sZigzagoonLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_GROWL), LEVEL_UP_MOVE( 5, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 9, MOVE_HEADBUTT), - LEVEL_UP_MOVE(13, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(17, MOVE_ODOR_SLEUTH), - LEVEL_UP_MOVE(21, MOVE_MUD_SPORT), - LEVEL_UP_MOVE(25, MOVE_PIN_MISSILE), - LEVEL_UP_MOVE(29, MOVE_COVET), - LEVEL_UP_MOVE(33, MOVE_FLAIL), - LEVEL_UP_MOVE(37, MOVE_REST), - LEVEL_UP_MOVE(41, MOVE_BELLY_DRUM), + LEVEL_UP_MOVE( 7, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(11, MOVE_HEADBUTT), + LEVEL_UP_MOVE(12, MOVE_BABY_DOLL_EYES), + LEVEL_UP_MOVE(13, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE(17, MOVE_MUD_SPORT), + LEVEL_UP_MOVE(19, MOVE_PIN_MISSILE), + LEVEL_UP_MOVE(23, MOVE_COVET), + LEVEL_UP_MOVE(25, MOVE_BESTOW), + LEVEL_UP_MOVE(29, MOVE_FLAIL), + LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(35, MOVE_REST), + LEVEL_UP_MOVE(37, MOVE_BELLY_DRUM), + LEVEL_UP_MOVE(41, MOVE_FLING), LEVEL_UP_END }; -static const u16 sLinooneLevelUpLearnset[] = { +static const struct LevelUpMove sLinooneLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_PLAY_ROUGH), + LEVEL_UP_MOVE( 1, MOVE_ROTOTILLER), + LEVEL_UP_MOVE( 1, MOVE_SWITCHEROO), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_GROWL), LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 1, MOVE_HEADBUTT), + LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), LEVEL_UP_MOVE( 5, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 9, MOVE_HEADBUTT), - LEVEL_UP_MOVE(13, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(17, MOVE_ODOR_SLEUTH), - LEVEL_UP_MOVE(23, MOVE_MUD_SPORT), - LEVEL_UP_MOVE(29, MOVE_FURY_SWIPES), - LEVEL_UP_MOVE(35, MOVE_COVET), - LEVEL_UP_MOVE(41, MOVE_SLASH), - LEVEL_UP_MOVE(47, MOVE_REST), - LEVEL_UP_MOVE(53, MOVE_BELLY_DRUM), + LEVEL_UP_MOVE( 7, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(11, MOVE_HEADBUTT), + LEVEL_UP_MOVE(13, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE(17, MOVE_MUD_SPORT), + LEVEL_UP_MOVE(19, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(24, MOVE_COVET), + LEVEL_UP_MOVE(27, MOVE_BESTOW), + LEVEL_UP_MOVE(32, MOVE_SLASH), + LEVEL_UP_MOVE(35, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(40, MOVE_REST), + LEVEL_UP_MOVE(43, MOVE_BELLY_DRUM), + LEVEL_UP_MOVE(48, MOVE_FLING), LEVEL_UP_END }; -static const u16 sWurmpleLevelUpLearnset[] = { +static const struct LevelUpMove sWurmpleLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_STRING_SHOT), LEVEL_UP_MOVE( 5, MOVE_POISON_STING), + LEVEL_UP_MOVE(15, MOVE_BUG_BITE), LEVEL_UP_END }; -static const u16 sSilcoonLevelUpLearnset[] = { +static const struct LevelUpMove sSilcoonLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_HARDEN), LEVEL_UP_MOVE( 1, MOVE_HARDEN), - LEVEL_UP_MOVE( 7, MOVE_HARDEN), LEVEL_UP_END }; -static const u16 sBeautiflyLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_ABSORB), - LEVEL_UP_MOVE(10, MOVE_ABSORB), - LEVEL_UP_MOVE(13, MOVE_GUST), - LEVEL_UP_MOVE(17, MOVE_STUN_SPORE), - LEVEL_UP_MOVE(20, MOVE_MORNING_SUN), - LEVEL_UP_MOVE(24, MOVE_MEGA_DRAIN), - LEVEL_UP_MOVE(27, MOVE_WHIRLWIND), - LEVEL_UP_MOVE(31, MOVE_ATTRACT), - LEVEL_UP_MOVE(34, MOVE_SILVER_WIND), - LEVEL_UP_MOVE(38, MOVE_GIGA_DRAIN), +static const struct LevelUpMove sBeautiflyLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_GUST), + LEVEL_UP_MOVE( 1, MOVE_GUST), + LEVEL_UP_MOVE(12, MOVE_ABSORB), + LEVEL_UP_MOVE(15, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(17, MOVE_MORNING_SUN), + LEVEL_UP_MOVE(20, MOVE_AIR_CUTTER), + LEVEL_UP_MOVE(22, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(25, MOVE_SILVER_WIND), + LEVEL_UP_MOVE(27, MOVE_ATTRACT), + LEVEL_UP_MOVE(30, MOVE_WHIRLWIND), + LEVEL_UP_MOVE(32, MOVE_GIGA_DRAIN), + LEVEL_UP_MOVE(35, MOVE_BUG_BUZZ), + LEVEL_UP_MOVE(37, MOVE_RAGE), + LEVEL_UP_MOVE(40, MOVE_QUIVER_DANCE), LEVEL_UP_END }; -static const u16 sCascoonLevelUpLearnset[] = { +static const struct LevelUpMove sCascoonLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_HARDEN), LEVEL_UP_MOVE( 1, MOVE_HARDEN), - LEVEL_UP_MOVE( 7, MOVE_HARDEN), LEVEL_UP_END }; -static const u16 sDustoxLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_CONFUSION), - LEVEL_UP_MOVE(10, MOVE_CONFUSION), - LEVEL_UP_MOVE(13, MOVE_GUST), - LEVEL_UP_MOVE(17, MOVE_PROTECT), - LEVEL_UP_MOVE(20, MOVE_MOONLIGHT), - LEVEL_UP_MOVE(24, MOVE_PSYBEAM), - LEVEL_UP_MOVE(27, MOVE_WHIRLWIND), - LEVEL_UP_MOVE(31, MOVE_LIGHT_SCREEN), - LEVEL_UP_MOVE(34, MOVE_SILVER_WIND), - LEVEL_UP_MOVE(38, MOVE_TOXIC), +static const struct LevelUpMove sDustoxLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_GUST), + LEVEL_UP_MOVE( 1, MOVE_GUST), + LEVEL_UP_MOVE(12, MOVE_CONFUSION), + LEVEL_UP_MOVE(15, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(17, MOVE_MOONLIGHT), + LEVEL_UP_MOVE(20, MOVE_VENOSHOCK), + LEVEL_UP_MOVE(22, MOVE_PSYBEAM), + LEVEL_UP_MOVE(25, MOVE_SILVER_WIND), + LEVEL_UP_MOVE(27, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(30, MOVE_WHIRLWIND), + LEVEL_UP_MOVE(32, MOVE_TOXIC), + LEVEL_UP_MOVE(35, MOVE_BUG_BUZZ), + LEVEL_UP_MOVE(37, MOVE_PROTECT), + LEVEL_UP_MOVE(40, MOVE_QUIVER_DANCE), LEVEL_UP_END }; -static const u16 sLotadLevelUpLearnset[] = { +static const struct LevelUpMove sLotadLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_ASTONISH), LEVEL_UP_MOVE( 3, MOVE_GROWL), - LEVEL_UP_MOVE( 7, MOVE_ABSORB), - LEVEL_UP_MOVE(13, MOVE_NATURE_POWER), - LEVEL_UP_MOVE(21, MOVE_MIST), - LEVEL_UP_MOVE(31, MOVE_RAIN_DANCE), - LEVEL_UP_MOVE(43, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE( 6, MOVE_ABSORB), + LEVEL_UP_MOVE( 9, MOVE_BUBBLE), + LEVEL_UP_MOVE(12, MOVE_NATURAL_GIFT), + LEVEL_UP_MOVE(15, MOVE_MIST), + LEVEL_UP_MOVE(18, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(21, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(24, MOVE_NATURE_POWER), + LEVEL_UP_MOVE(27, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(30, MOVE_GIGA_DRAIN), + LEVEL_UP_MOVE(33, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(36, MOVE_ENERGY_BALL), LEVEL_UP_END }; -static const u16 sLombreLevelUpLearnset[] = { +static const struct LevelUpMove sLombreLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_ASTONISH), LEVEL_UP_MOVE( 3, MOVE_GROWL), - LEVEL_UP_MOVE( 7, MOVE_ABSORB), - LEVEL_UP_MOVE(13, MOVE_NATURE_POWER), - LEVEL_UP_MOVE(19, MOVE_FAKE_OUT), - LEVEL_UP_MOVE(25, MOVE_FURY_SWIPES), - LEVEL_UP_MOVE(31, MOVE_WATER_SPORT), - LEVEL_UP_MOVE(37, MOVE_THIEF), - LEVEL_UP_MOVE(43, MOVE_UPROAR), - LEVEL_UP_MOVE(49, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE( 6, MOVE_ABSORB), + LEVEL_UP_MOVE( 9, MOVE_BUBBLE), + LEVEL_UP_MOVE(12, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(16, MOVE_FAKE_OUT), + LEVEL_UP_MOVE(20, MOVE_WATER_SPORT), + LEVEL_UP_MOVE(24, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(28, MOVE_NATURE_POWER), + LEVEL_UP_MOVE(32, MOVE_UPROAR), + LEVEL_UP_MOVE(36, MOVE_KNOCK_OFF), + LEVEL_UP_MOVE(40, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(44, MOVE_HYDRO_PUMP), LEVEL_UP_END }; -static const u16 sLudicoloLevelUpLearnset[] = { +static const struct LevelUpMove sLudicoloLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_ASTONISH), LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 1, MOVE_ABSORB), + LEVEL_UP_MOVE( 1, MOVE_MEGA_DRAIN), LEVEL_UP_MOVE( 1, MOVE_NATURE_POWER), LEVEL_UP_END }; -static const u16 sSeedotLevelUpLearnset[] = { +static const struct LevelUpMove sSeedotLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_BIDE), LEVEL_UP_MOVE( 3, MOVE_HARDEN), - LEVEL_UP_MOVE( 7, MOVE_GROWTH), - LEVEL_UP_MOVE(13, MOVE_NATURE_POWER), + LEVEL_UP_MOVE( 9, MOVE_GROWTH), + LEVEL_UP_MOVE(15, MOVE_NATURE_POWER), LEVEL_UP_MOVE(21, MOVE_SYNTHESIS), - LEVEL_UP_MOVE(31, MOVE_SUNNY_DAY), - LEVEL_UP_MOVE(43, MOVE_EXPLOSION), + LEVEL_UP_MOVE(27, MOVE_SUNNY_DAY), + LEVEL_UP_MOVE(33, MOVE_EXPLOSION), LEVEL_UP_END }; -static const u16 sNuzleafLevelUpLearnset[] = { +static const struct LevelUpMove sNuzleafLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE( 1, MOVE_RAZOR_LEAF), LEVEL_UP_MOVE( 1, MOVE_POUND), LEVEL_UP_MOVE( 3, MOVE_HARDEN), - LEVEL_UP_MOVE( 7, MOVE_GROWTH), - LEVEL_UP_MOVE(13, MOVE_NATURE_POWER), - LEVEL_UP_MOVE(19, MOVE_FAKE_OUT), - LEVEL_UP_MOVE(25, MOVE_TORMENT), - LEVEL_UP_MOVE(31, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE(37, MOVE_RAZOR_WIND), - LEVEL_UP_MOVE(43, MOVE_SWAGGER), - LEVEL_UP_MOVE(49, MOVE_EXTRASENSORY), + LEVEL_UP_MOVE( 6, MOVE_GROWTH), + LEVEL_UP_MOVE( 9, MOVE_TORMENT), + LEVEL_UP_MOVE(12, MOVE_FAKE_OUT), + LEVEL_UP_MOVE(16, MOVE_NATURE_POWER), + LEVEL_UP_MOVE(20, MOVE_RAZOR_WIND), + LEVEL_UP_MOVE(24, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(28, MOVE_LEAF_BLADE), + LEVEL_UP_MOVE(32, MOVE_SWAGGER), + LEVEL_UP_MOVE(36, MOVE_EXTRASENSORY), LEVEL_UP_END }; -static const u16 sShiftryLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_POUND), - LEVEL_UP_MOVE( 1, MOVE_HARDEN), - LEVEL_UP_MOVE( 1, MOVE_GROWTH), - LEVEL_UP_MOVE( 1, MOVE_NATURE_POWER), +static const struct LevelUpMove sShiftryLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE( 1, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_WHIRLWIND), + LEVEL_UP_MOVE( 1, MOVE_NASTY_PLOT), + LEVEL_UP_MOVE(20, MOVE_LEAF_TORNADO), + LEVEL_UP_MOVE(32, MOVE_HURRICANE), + LEVEL_UP_MOVE(44, MOVE_LEAF_STORM), LEVEL_UP_END }; -static const u16 sNincadaLevelUpLearnset[] = { +static const struct LevelUpMove sNincadaLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SCRATCH), LEVEL_UP_MOVE( 1, MOVE_HARDEN), - LEVEL_UP_MOVE( 5, MOVE_LEECH_LIFE), + LEVEL_UP_MOVE( 5, MOVE_ABSORB), LEVEL_UP_MOVE( 9, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(14, MOVE_FURY_SWIPES), - LEVEL_UP_MOVE(19, MOVE_MIND_READER), - LEVEL_UP_MOVE(25, MOVE_FALSE_SWIPE), - LEVEL_UP_MOVE(31, MOVE_MUD_SLAP), - LEVEL_UP_MOVE(38, MOVE_METAL_CLAW), - LEVEL_UP_MOVE(45, MOVE_DIG), + LEVEL_UP_MOVE(13, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(17, MOVE_MUD_SLAP), + LEVEL_UP_MOVE(21, MOVE_METAL_CLAW), + LEVEL_UP_MOVE(25, MOVE_MIND_READER), + LEVEL_UP_MOVE(29, MOVE_BIDE), + LEVEL_UP_MOVE(33, MOVE_FALSE_SWIPE), + LEVEL_UP_MOVE(37, MOVE_DIG), LEVEL_UP_END }; -static const u16 sNinjaskLevelUpLearnset[] = { +static const struct LevelUpMove sNinjaskLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_DOUBLE_TEAM), + // LEVEL_UP_MOVE( 0, MOVE_SCREECH), + // LEVEL_UP_MOVE( 0, MOVE_FURY_CUTTER), + LEVEL_UP_MOVE( 1, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE( 1, MOVE_SCREECH), + LEVEL_UP_MOVE( 1, MOVE_FURY_CUTTER), + LEVEL_UP_MOVE( 1, MOVE_BUG_BITE), LEVEL_UP_MOVE( 1, MOVE_SCRATCH), LEVEL_UP_MOVE( 1, MOVE_HARDEN), - LEVEL_UP_MOVE( 1, MOVE_LEECH_LIFE), + LEVEL_UP_MOVE( 1, MOVE_ABSORB), LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE( 5, MOVE_LEECH_LIFE), + LEVEL_UP_MOVE( 5, MOVE_ABSORB), LEVEL_UP_MOVE( 9, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(14, MOVE_FURY_SWIPES), - LEVEL_UP_MOVE(19, MOVE_MIND_READER), - LEVEL_UP_MOVE(20, MOVE_DOUBLE_TEAM), - LEVEL_UP_MOVE(20, MOVE_FURY_CUTTER), - LEVEL_UP_MOVE(20, MOVE_SCREECH), - LEVEL_UP_MOVE(25, MOVE_SWORDS_DANCE), - LEVEL_UP_MOVE(31, MOVE_SLASH), - LEVEL_UP_MOVE(38, MOVE_AGILITY), - LEVEL_UP_MOVE(45, MOVE_BATON_PASS), + LEVEL_UP_MOVE(13, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(17, MOVE_AGILITY), + LEVEL_UP_MOVE(23, MOVE_SLASH), + LEVEL_UP_MOVE(29, MOVE_MIND_READER), + LEVEL_UP_MOVE(35, MOVE_BATON_PASS), + LEVEL_UP_MOVE(41, MOVE_SWORDS_DANCE), + LEVEL_UP_MOVE(47, MOVE_X_SCISSOR), LEVEL_UP_END }; -static const u16 sShedinjaLevelUpLearnset[] = { +static const struct LevelUpMove sShedinjaLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SCRATCH), LEVEL_UP_MOVE( 1, MOVE_HARDEN), - LEVEL_UP_MOVE( 5, MOVE_LEECH_LIFE), + LEVEL_UP_MOVE( 1, MOVE_ABSORB), + LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 5, MOVE_ABSORB), LEVEL_UP_MOVE( 9, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(14, MOVE_FURY_SWIPES), - LEVEL_UP_MOVE(19, MOVE_MIND_READER), - LEVEL_UP_MOVE(25, MOVE_SPITE), - LEVEL_UP_MOVE(31, MOVE_CONFUSE_RAY), - LEVEL_UP_MOVE(38, MOVE_SHADOW_BALL), - LEVEL_UP_MOVE(45, MOVE_GRUDGE), + LEVEL_UP_MOVE(13, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(17, MOVE_SPITE), + LEVEL_UP_MOVE(21, MOVE_SHADOW_SNEAK), + LEVEL_UP_MOVE(25, MOVE_MIND_READER), + LEVEL_UP_MOVE(29, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(33, MOVE_SHADOW_BALL), + LEVEL_UP_MOVE(37, MOVE_GRUDGE), + LEVEL_UP_MOVE(41, MOVE_HEAL_BLOCK), + LEVEL_UP_MOVE(45, MOVE_PHANTOM_FORCE), LEVEL_UP_END }; -static const u16 sTaillowLevelUpLearnset[] = { +static const struct LevelUpMove sTaillowLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_PECK), LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 4, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE( 8, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 5, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 9, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(13, MOVE_WING_ATTACK), - LEVEL_UP_MOVE(19, MOVE_DOUBLE_TEAM), - LEVEL_UP_MOVE(26, MOVE_ENDEAVOR), - LEVEL_UP_MOVE(34, MOVE_AERIAL_ACE), - LEVEL_UP_MOVE(43, MOVE_AGILITY), + LEVEL_UP_MOVE(17, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE(21, MOVE_AERIAL_ACE), + LEVEL_UP_MOVE(25, MOVE_QUICK_GUARD), + LEVEL_UP_MOVE(29, MOVE_AGILITY), + LEVEL_UP_MOVE(33, MOVE_AIR_SLASH), + LEVEL_UP_MOVE(37, MOVE_ENDEAVOR), + LEVEL_UP_MOVE(41, MOVE_BRAVE_BIRD), + LEVEL_UP_MOVE(45, MOVE_REVERSAL), LEVEL_UP_END }; -static const u16 sSwellowLevelUpLearnset[] = { +static const struct LevelUpMove sSwellowLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BRAVE_BIRD), + LEVEL_UP_MOVE( 1, MOVE_AIR_SLASH), + LEVEL_UP_MOVE( 1, MOVE_PLUCK), LEVEL_UP_MOVE( 1, MOVE_PECK), LEVEL_UP_MOVE( 1, MOVE_GROWL), LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE( 4, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE( 8, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 5, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 9, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE(13, MOVE_WING_ATTACK), - LEVEL_UP_MOVE(19, MOVE_DOUBLE_TEAM), - LEVEL_UP_MOVE(28, MOVE_ENDEAVOR), - LEVEL_UP_MOVE(38, MOVE_AERIAL_ACE), - LEVEL_UP_MOVE(49, MOVE_AGILITY), + LEVEL_UP_MOVE(17, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE(21, MOVE_AERIAL_ACE), + LEVEL_UP_MOVE(27, MOVE_QUICK_GUARD), + LEVEL_UP_MOVE(33, MOVE_AGILITY), + LEVEL_UP_MOVE(39, MOVE_AIR_SLASH), + LEVEL_UP_MOVE(45, MOVE_ENDEAVOR), + LEVEL_UP_MOVE(51, MOVE_BRAVE_BIRD), + LEVEL_UP_MOVE(57, MOVE_REVERSAL), LEVEL_UP_END }; -static const u16 sShroomishLevelUpLearnset[] = { +static const struct LevelUpMove sShroomishLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_ABSORB), - LEVEL_UP_MOVE( 4, MOVE_TACKLE), - LEVEL_UP_MOVE( 7, MOVE_STUN_SPORE), - LEVEL_UP_MOVE(10, MOVE_LEECH_SEED), - LEVEL_UP_MOVE(16, MOVE_MEGA_DRAIN), - LEVEL_UP_MOVE(22, MOVE_HEADBUTT), - LEVEL_UP_MOVE(28, MOVE_POISON_POWDER), - LEVEL_UP_MOVE(36, MOVE_GROWTH), - LEVEL_UP_MOVE(45, MOVE_GIGA_DRAIN), - LEVEL_UP_MOVE(54, MOVE_SPORE), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 5, MOVE_STUN_SPORE), + LEVEL_UP_MOVE( 8, MOVE_LEECH_SEED), + LEVEL_UP_MOVE(12, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(15, MOVE_HEADBUTT), + LEVEL_UP_MOVE(19, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(22, MOVE_WORRY_SEED), + LEVEL_UP_MOVE(26, MOVE_GIGA_DRAIN), + LEVEL_UP_MOVE(29, MOVE_GROWTH), + LEVEL_UP_MOVE(33, MOVE_TOXIC), + LEVEL_UP_MOVE(36, MOVE_SEED_BOMB), + LEVEL_UP_MOVE(40, MOVE_SPORE), LEVEL_UP_END }; -static const u16 sBreloomLevelUpLearnset[] = { +static const struct LevelUpMove sBreloomLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_MACH_PUNCH), + LEVEL_UP_MOVE( 1, MOVE_MACH_PUNCH), LEVEL_UP_MOVE( 1, MOVE_ABSORB), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_STUN_SPORE), LEVEL_UP_MOVE( 1, MOVE_LEECH_SEED), - LEVEL_UP_MOVE( 4, MOVE_TACKLE), - LEVEL_UP_MOVE( 7, MOVE_STUN_SPORE), - LEVEL_UP_MOVE(10, MOVE_LEECH_SEED), - LEVEL_UP_MOVE(16, MOVE_MEGA_DRAIN), - LEVEL_UP_MOVE(22, MOVE_HEADBUTT), - LEVEL_UP_MOVE(23, MOVE_MACH_PUNCH), - LEVEL_UP_MOVE(28, MOVE_COUNTER), - LEVEL_UP_MOVE(36, MOVE_SKY_UPPERCUT), - LEVEL_UP_MOVE(45, MOVE_MIND_READER), - LEVEL_UP_MOVE(54, MOVE_DYNAMIC_PUNCH), + LEVEL_UP_MOVE( 5, MOVE_STUN_SPORE), + LEVEL_UP_MOVE( 8, MOVE_LEECH_SEED), + LEVEL_UP_MOVE(12, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(15, MOVE_HEADBUTT), + LEVEL_UP_MOVE(19, MOVE_FEINT), + LEVEL_UP_MOVE(22, MOVE_COUNTER), + LEVEL_UP_MOVE(28, MOVE_FORCE_PALM), + LEVEL_UP_MOVE(33, MOVE_MIND_READER), + LEVEL_UP_MOVE(39, MOVE_SKY_UPPERCUT), + LEVEL_UP_MOVE(44, MOVE_SEED_BOMB), + LEVEL_UP_MOVE(50, MOVE_DYNAMIC_PUNCH), LEVEL_UP_END }; -static const u16 sSpindaLevelUpLearnset[] = { +static const struct LevelUpMove sSpindaLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 5, MOVE_UPROAR), - LEVEL_UP_MOVE(12, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE(16, MOVE_PSYBEAM), - LEVEL_UP_MOVE(23, MOVE_HYPNOSIS), - LEVEL_UP_MOVE(27, MOVE_DIZZY_PUNCH), - LEVEL_UP_MOVE(34, MOVE_TEETER_DANCE), - LEVEL_UP_MOVE(38, MOVE_PSYCH_UP), - LEVEL_UP_MOVE(45, MOVE_DOUBLE_EDGE), - LEVEL_UP_MOVE(49, MOVE_FLAIL), - LEVEL_UP_MOVE(56, MOVE_THRASH), + LEVEL_UP_MOVE( 5, MOVE_COPYCAT), + LEVEL_UP_MOVE(10, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(14, MOVE_PSYBEAM), + LEVEL_UP_MOVE(19, MOVE_HYPNOSIS), + LEVEL_UP_MOVE(23, MOVE_DIZZY_PUNCH), + LEVEL_UP_MOVE(28, MOVE_SUCKER_PUNCH), + LEVEL_UP_MOVE(32, MOVE_TEETER_DANCE), + LEVEL_UP_MOVE(37, MOVE_UPROAR), + LEVEL_UP_MOVE(41, MOVE_PSYCH_UP), + LEVEL_UP_MOVE(46, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(50, MOVE_FLAIL), + LEVEL_UP_MOVE(55, MOVE_THRASH), LEVEL_UP_END }; -static const u16 sWingullLevelUpLearnset[] = { +static const struct LevelUpMove sWingullLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_GROWL), LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), - LEVEL_UP_MOVE( 7, MOVE_SUPERSONIC), - LEVEL_UP_MOVE(13, MOVE_WING_ATTACK), - LEVEL_UP_MOVE(21, MOVE_MIST), - LEVEL_UP_MOVE(31, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(43, MOVE_PURSUIT), - LEVEL_UP_MOVE(55, MOVE_AGILITY), + LEVEL_UP_MOVE( 5, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 8, MOVE_WING_ATTACK), + LEVEL_UP_MOVE(12, MOVE_MIST), + LEVEL_UP_MOVE(15, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(19, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(22, MOVE_AIR_CUTTER), + LEVEL_UP_MOVE(26, MOVE_PURSUIT), + LEVEL_UP_MOVE(29, MOVE_AERIAL_ACE), + LEVEL_UP_MOVE(33, MOVE_ROOST), + LEVEL_UP_MOVE(36, MOVE_AGILITY), + LEVEL_UP_MOVE(40, MOVE_AIR_SLASH), + LEVEL_UP_MOVE(43, MOVE_HURRICANE), LEVEL_UP_END }; -static const u16 sPelipperLevelUpLearnset[] = { +static const struct LevelUpMove sPelipperLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_PROTECT), + LEVEL_UP_MOVE( 1, MOVE_PROTECT), + LEVEL_UP_MOVE( 1, MOVE_HURRICANE), + LEVEL_UP_MOVE( 1, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE( 1, MOVE_TAILWIND), + LEVEL_UP_MOVE( 1, MOVE_SOAK), LEVEL_UP_MOVE( 1, MOVE_GROWL), LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), LEVEL_UP_MOVE( 1, MOVE_WATER_SPORT), LEVEL_UP_MOVE( 1, MOVE_WING_ATTACK), - LEVEL_UP_MOVE( 3, MOVE_WATER_GUN), - LEVEL_UP_MOVE( 7, MOVE_SUPERSONIC), - LEVEL_UP_MOVE(13, MOVE_WING_ATTACK), - LEVEL_UP_MOVE(21, MOVE_MIST), - LEVEL_UP_MOVE(25, MOVE_PROTECT), + LEVEL_UP_MOVE( 5, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 8, MOVE_WING_ATTACK), + LEVEL_UP_MOVE(12, MOVE_MIST), + LEVEL_UP_MOVE(15, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(19, MOVE_PAYBACK), + LEVEL_UP_MOVE(22, MOVE_BRINE), + LEVEL_UP_MOVE(28, MOVE_FLING), LEVEL_UP_MOVE(33, MOVE_STOCKPILE), LEVEL_UP_MOVE(33, MOVE_SWALLOW), - LEVEL_UP_MOVE(47, MOVE_SPIT_UP), - LEVEL_UP_MOVE(61, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(33, MOVE_SPIT_UP), + LEVEL_UP_MOVE(39, MOVE_ROOST), + LEVEL_UP_MOVE(44, MOVE_TAILWIND), + LEVEL_UP_MOVE(50, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(55, MOVE_HURRICANE), LEVEL_UP_END }; -static const u16 sSurskitLevelUpLearnset[] = { +static const struct LevelUpMove sSurskitLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_BUBBLE), - LEVEL_UP_MOVE( 7, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(13, MOVE_SWEET_SCENT), - LEVEL_UP_MOVE(19, MOVE_WATER_SPORT), - LEVEL_UP_MOVE(25, MOVE_BUBBLE_BEAM), - LEVEL_UP_MOVE(31, MOVE_AGILITY), - LEVEL_UP_MOVE(37, MOVE_MIST), - LEVEL_UP_MOVE(37, MOVE_HAZE), + LEVEL_UP_MOVE( 6, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 9, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE(14, MOVE_WATER_SPORT), + LEVEL_UP_MOVE(17, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(22, MOVE_AGILITY), + LEVEL_UP_MOVE(25, MOVE_MIST), + LEVEL_UP_MOVE(25, MOVE_HAZE), + LEVEL_UP_MOVE(30, MOVE_AQUA_JET), + LEVEL_UP_MOVE(35, MOVE_BATON_PASS), + LEVEL_UP_MOVE(38, MOVE_STICKY_WEB), LEVEL_UP_END }; -static const u16 sMasquerainLevelUpLearnset[] = { +static const struct LevelUpMove sMasquerainLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_QUIVER_DANCE), + LEVEL_UP_MOVE( 1, MOVE_WHIRLWIND), + LEVEL_UP_MOVE( 1, MOVE_BUG_BUZZ), + LEVEL_UP_MOVE( 1, MOVE_OMINOUS_WIND), LEVEL_UP_MOVE( 1, MOVE_BUBBLE), LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), LEVEL_UP_MOVE( 1, MOVE_SWEET_SCENT), LEVEL_UP_MOVE( 1, MOVE_WATER_SPORT), - LEVEL_UP_MOVE( 7, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(13, MOVE_SWEET_SCENT), - LEVEL_UP_MOVE(19, MOVE_WATER_SPORT), - LEVEL_UP_MOVE(26, MOVE_GUST), - LEVEL_UP_MOVE(33, MOVE_SCARY_FACE), - LEVEL_UP_MOVE(40, MOVE_STUN_SPORE), - LEVEL_UP_MOVE(47, MOVE_SILVER_WIND), - LEVEL_UP_MOVE(53, MOVE_WHIRLWIND), + LEVEL_UP_MOVE( 6, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 9, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE(14, MOVE_WATER_SPORT), + LEVEL_UP_MOVE(17, MOVE_GUST), + LEVEL_UP_MOVE(22, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(22, MOVE_AIR_CUTTER), + LEVEL_UP_MOVE(26, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(32, MOVE_SILVER_WIND), + LEVEL_UP_MOVE(38, MOVE_AIR_SLASH), + LEVEL_UP_MOVE(42, MOVE_BUG_BUZZ), + LEVEL_UP_MOVE(48, MOVE_WHIRLWIND), + LEVEL_UP_MOVE(52, MOVE_QUIVER_DANCE), LEVEL_UP_END }; -static const u16 sWailmerLevelUpLearnset[] = { +static const struct LevelUpMove sWailmerLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SPLASH), - LEVEL_UP_MOVE( 5, MOVE_GROWL), - LEVEL_UP_MOVE(10, MOVE_WATER_GUN), - LEVEL_UP_MOVE(14, MOVE_ROLLOUT), - LEVEL_UP_MOVE(19, MOVE_WHIRLPOOL), - LEVEL_UP_MOVE(23, MOVE_ASTONISH), - LEVEL_UP_MOVE(28, MOVE_WATER_PULSE), - LEVEL_UP_MOVE(32, MOVE_MIST), - LEVEL_UP_MOVE(37, MOVE_REST), - LEVEL_UP_MOVE(41, MOVE_WATER_SPOUT), - LEVEL_UP_MOVE(46, MOVE_AMNESIA), - LEVEL_UP_MOVE(50, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE( 4, MOVE_GROWL), + LEVEL_UP_MOVE( 7, MOVE_WATER_GUN), + LEVEL_UP_MOVE(10, MOVE_ROLLOUT), + LEVEL_UP_MOVE(13, MOVE_WHIRLPOOL), + LEVEL_UP_MOVE(16, MOVE_ASTONISH), + LEVEL_UP_MOVE(19, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(22, MOVE_MIST), + LEVEL_UP_MOVE(25, MOVE_BRINE), + LEVEL_UP_MOVE(29, MOVE_REST), + LEVEL_UP_MOVE(33, MOVE_WATER_SPOUT), + LEVEL_UP_MOVE(37, MOVE_AMNESIA), + LEVEL_UP_MOVE(41, MOVE_DIVE), + LEVEL_UP_MOVE(45, MOVE_BOUNCE), + LEVEL_UP_MOVE(49, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(53, MOVE_HEAVY_SLAM), LEVEL_UP_END }; -static const u16 sWailordLevelUpLearnset[] = { +static const struct LevelUpMove sWailordLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SOAK), + LEVEL_UP_MOVE( 1, MOVE_NOBLE_ROAR), + LEVEL_UP_MOVE( 1, MOVE_HEAVY_SLAM), LEVEL_UP_MOVE( 1, MOVE_SPLASH), LEVEL_UP_MOVE( 1, MOVE_GROWL), LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), LEVEL_UP_MOVE( 1, MOVE_ROLLOUT), - LEVEL_UP_MOVE( 5, MOVE_GROWL), - LEVEL_UP_MOVE(10, MOVE_WATER_GUN), - LEVEL_UP_MOVE(14, MOVE_ROLLOUT), - LEVEL_UP_MOVE(19, MOVE_WHIRLPOOL), - LEVEL_UP_MOVE(23, MOVE_ASTONISH), - LEVEL_UP_MOVE(28, MOVE_WATER_PULSE), - LEVEL_UP_MOVE(32, MOVE_MIST), - LEVEL_UP_MOVE(37, MOVE_REST), - LEVEL_UP_MOVE(44, MOVE_WATER_SPOUT), - LEVEL_UP_MOVE(52, MOVE_AMNESIA), - LEVEL_UP_MOVE(59, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE( 4, MOVE_GROWL), + LEVEL_UP_MOVE( 7, MOVE_WATER_GUN), + LEVEL_UP_MOVE(10, MOVE_ROLLOUT), + LEVEL_UP_MOVE(13, MOVE_WHIRLPOOL), + LEVEL_UP_MOVE(16, MOVE_ASTONISH), + LEVEL_UP_MOVE(19, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(22, MOVE_MIST), + LEVEL_UP_MOVE(25, MOVE_BRINE), + LEVEL_UP_MOVE(29, MOVE_REST), + LEVEL_UP_MOVE(33, MOVE_WATER_SPOUT), + LEVEL_UP_MOVE(37, MOVE_AMNESIA), + LEVEL_UP_MOVE(44, MOVE_DIVE), + LEVEL_UP_MOVE(51, MOVE_BOUNCE), + LEVEL_UP_MOVE(58, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(65, MOVE_HEAVY_SLAM), LEVEL_UP_END }; -static const u16 sSkittyLevelUpLearnset[] = { +static const struct LevelUpMove sSkittyLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_FAKE_OUT), LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 3, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE( 7, MOVE_ATTRACT), - LEVEL_UP_MOVE(13, MOVE_SING), - LEVEL_UP_MOVE(15, MOVE_DOUBLE_SLAP), - LEVEL_UP_MOVE(19, MOVE_ASSIST), + LEVEL_UP_MOVE( 4, MOVE_FORESIGHT), + LEVEL_UP_MOVE( 7, MOVE_SING), + LEVEL_UP_MOVE(10, MOVE_ATTRACT), + LEVEL_UP_MOVE(13, MOVE_DISARMING_VOICE), + LEVEL_UP_MOVE(16, MOVE_DOUBLE_SLAP), + LEVEL_UP_MOVE(19, MOVE_COPYCAT), + LEVEL_UP_MOVE(22, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(25, MOVE_CHARM), - LEVEL_UP_MOVE(27, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE(31, MOVE_COVET), + LEVEL_UP_MOVE(28, MOVE_WAKE_UP_SLAP), + LEVEL_UP_MOVE(31, MOVE_ASSIST), + LEVEL_UP_MOVE(34, MOVE_COVET), LEVEL_UP_MOVE(37, MOVE_HEAL_BELL), - LEVEL_UP_MOVE(39, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(40, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(43, MOVE_CAPTIVATE), + LEVEL_UP_MOVE(46, MOVE_PLAY_ROUGH), LEVEL_UP_END }; -static const u16 sDelcattyLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 1, MOVE_ATTRACT), +static const struct LevelUpMove sDelcattyLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_FAKE_OUT), LEVEL_UP_MOVE( 1, MOVE_SING), + LEVEL_UP_MOVE( 1, MOVE_ATTRACT), LEVEL_UP_MOVE( 1, MOVE_DOUBLE_SLAP), LEVEL_UP_END }; -static const u16 sKecleonLevelUpLearnset[] = { +static const struct LevelUpMove sKecleonLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_THIEF), LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), LEVEL_UP_MOVE( 1, MOVE_ASTONISH), LEVEL_UP_MOVE( 1, MOVE_LICK), LEVEL_UP_MOVE( 1, MOVE_SCRATCH), LEVEL_UP_MOVE( 4, MOVE_BIND), - LEVEL_UP_MOVE( 7, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE(12, MOVE_FURY_SWIPES), - LEVEL_UP_MOVE(17, MOVE_PSYBEAM), - LEVEL_UP_MOVE(24, MOVE_SCREECH), - LEVEL_UP_MOVE(31, MOVE_SLASH), - LEVEL_UP_MOVE(40, MOVE_SUBSTITUTE), - LEVEL_UP_MOVE(49, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE( 7, MOVE_SHADOW_SNEAK), + LEVEL_UP_MOVE(10, MOVE_FEINT), + LEVEL_UP_MOVE(13, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(16, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(18, MOVE_PSYBEAM), + LEVEL_UP_MOVE(21, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(25, MOVE_SLASH), + LEVEL_UP_MOVE(30, MOVE_CAMOUFLAGE), + LEVEL_UP_MOVE(33, MOVE_SHADOW_CLAW), + LEVEL_UP_MOVE(38, MOVE_SCREECH), + LEVEL_UP_MOVE(42, MOVE_SUBSTITUTE), + LEVEL_UP_MOVE(46, MOVE_SUCKER_PUNCH), + LEVEL_UP_MOVE(50, MOVE_SYNCHRONOISE), LEVEL_UP_END }; -static const u16 sBaltoyLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_CONFUSION), - LEVEL_UP_MOVE( 3, MOVE_HARDEN), - LEVEL_UP_MOVE( 5, MOVE_RAPID_SPIN), - LEVEL_UP_MOVE( 7, MOVE_MUD_SLAP), - LEVEL_UP_MOVE(11, MOVE_PSYBEAM), - LEVEL_UP_MOVE(15, MOVE_ROCK_TOMB), - LEVEL_UP_MOVE(19, MOVE_SELF_DESTRUCT), - LEVEL_UP_MOVE(25, MOVE_ANCIENT_POWER), - LEVEL_UP_MOVE(31, MOVE_SANDSTORM), - LEVEL_UP_MOVE(37, MOVE_COSMIC_POWER), - LEVEL_UP_MOVE(45, MOVE_EXPLOSION), - LEVEL_UP_END -}; - -static const u16 sClaydolLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TELEPORT), - LEVEL_UP_MOVE( 1, MOVE_CONFUSION), +static const struct LevelUpMove sBaltoyLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_HARDEN), - LEVEL_UP_MOVE( 1, MOVE_RAPID_SPIN), - LEVEL_UP_MOVE( 3, MOVE_HARDEN), - LEVEL_UP_MOVE( 5, MOVE_RAPID_SPIN), + LEVEL_UP_MOVE( 1, MOVE_CONFUSION), + LEVEL_UP_MOVE( 4, MOVE_RAPID_SPIN), LEVEL_UP_MOVE( 7, MOVE_MUD_SLAP), - LEVEL_UP_MOVE(11, MOVE_PSYBEAM), - LEVEL_UP_MOVE(15, MOVE_ROCK_TOMB), - LEVEL_UP_MOVE(19, MOVE_SELF_DESTRUCT), - LEVEL_UP_MOVE(25, MOVE_ANCIENT_POWER), - LEVEL_UP_MOVE(31, MOVE_SANDSTORM), - LEVEL_UP_MOVE(36, MOVE_HYPER_BEAM), - LEVEL_UP_MOVE(42, MOVE_COSMIC_POWER), - LEVEL_UP_MOVE(55, MOVE_EXPLOSION), + LEVEL_UP_MOVE(10, MOVE_HEAL_BLOCK), + LEVEL_UP_MOVE(13, MOVE_ROCK_TOMB), + LEVEL_UP_MOVE(16, MOVE_PSYBEAM), + LEVEL_UP_MOVE(19, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(22, MOVE_COSMIC_POWER), + LEVEL_UP_MOVE(25, MOVE_POWER_TRICK), + LEVEL_UP_MOVE(28, MOVE_SELF_DESTRUCT), + LEVEL_UP_MOVE(31, MOVE_EXTRASENSORY), + LEVEL_UP_MOVE(34, MOVE_GUARD_SPLIT), + LEVEL_UP_MOVE(34, MOVE_POWER_SPLIT), + LEVEL_UP_MOVE(37, MOVE_EARTH_POWER), + LEVEL_UP_MOVE(40, MOVE_SANDSTORM), + LEVEL_UP_MOVE(43, MOVE_IMPRISON), + LEVEL_UP_MOVE(46, MOVE_EXPLOSION), LEVEL_UP_END }; -static const u16 sNosepassLevelUpLearnset[] = { +static const struct LevelUpMove sClaydolLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_HYPER_BEAM), + LEVEL_UP_MOVE( 1, MOVE_HYPER_BEAM), + LEVEL_UP_MOVE( 1, MOVE_TELEPORT), + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 1, MOVE_CONFUSION), + LEVEL_UP_MOVE( 1, MOVE_RAPID_SPIN), + LEVEL_UP_MOVE( 4, MOVE_RAPID_SPIN), + LEVEL_UP_MOVE( 7, MOVE_MUD_SLAP), + LEVEL_UP_MOVE(10, MOVE_HEAL_BLOCK), + LEVEL_UP_MOVE(13, MOVE_ROCK_TOMB), + LEVEL_UP_MOVE(16, MOVE_PSYBEAM), + LEVEL_UP_MOVE(19, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(22, MOVE_COSMIC_POWER), + LEVEL_UP_MOVE(25, MOVE_POWER_TRICK), + LEVEL_UP_MOVE(28, MOVE_SELF_DESTRUCT), + LEVEL_UP_MOVE(31, MOVE_EXTRASENSORY), + LEVEL_UP_MOVE(34, MOVE_GUARD_SPLIT), + LEVEL_UP_MOVE(34, MOVE_POWER_SPLIT), + LEVEL_UP_MOVE(40, MOVE_EARTH_POWER), + LEVEL_UP_MOVE(46, MOVE_SANDSTORM), + LEVEL_UP_MOVE(52, MOVE_IMPRISON), + LEVEL_UP_MOVE(58, MOVE_EXPLOSION), + LEVEL_UP_END +}; + +static const struct LevelUpMove sNosepassLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 7, MOVE_HARDEN), - LEVEL_UP_MOVE(13, MOVE_ROCK_THROW), - LEVEL_UP_MOVE(16, MOVE_BLOCK), - LEVEL_UP_MOVE(22, MOVE_THUNDER_WAVE), - LEVEL_UP_MOVE(28, MOVE_ROCK_SLIDE), - LEVEL_UP_MOVE(31, MOVE_SANDSTORM), - LEVEL_UP_MOVE(37, MOVE_REST), + LEVEL_UP_MOVE( 4, MOVE_HARDEN), + LEVEL_UP_MOVE( 7, MOVE_BLOCK), + LEVEL_UP_MOVE(10, MOVE_ROCK_THROW), + LEVEL_UP_MOVE(13, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE(16, MOVE_REST), + LEVEL_UP_MOVE(19, MOVE_SPARK), + LEVEL_UP_MOVE(22, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(25, MOVE_POWER_GEM), + LEVEL_UP_MOVE(28, MOVE_ROCK_BLAST), + LEVEL_UP_MOVE(31, MOVE_DISCHARGE), + LEVEL_UP_MOVE(34, MOVE_SANDSTORM), + LEVEL_UP_MOVE(37, MOVE_EARTH_POWER), + LEVEL_UP_MOVE(40, MOVE_STONE_EDGE), + LEVEL_UP_MOVE(43, MOVE_LOCK_ON), LEVEL_UP_MOVE(43, MOVE_ZAP_CANNON), - LEVEL_UP_MOVE(46, MOVE_LOCK_ON), LEVEL_UP_END }; -static const u16 sTorkoalLevelUpLearnset[] = { +static const struct LevelUpMove sTorkoalLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_EMBER), LEVEL_UP_MOVE( 4, MOVE_SMOG), - LEVEL_UP_MOVE( 7, MOVE_CURSE), - LEVEL_UP_MOVE(14, MOVE_SMOKESCREEN), - LEVEL_UP_MOVE(17, MOVE_FIRE_SPIN), - LEVEL_UP_MOVE(20, MOVE_BODY_SLAM), - LEVEL_UP_MOVE(27, MOVE_PROTECT), - LEVEL_UP_MOVE(30, MOVE_FLAMETHROWER), - LEVEL_UP_MOVE(33, MOVE_IRON_DEFENSE), + LEVEL_UP_MOVE( 7, MOVE_WITHDRAW), + LEVEL_UP_MOVE(10, MOVE_RAPID_SPIN), + LEVEL_UP_MOVE(13, MOVE_FIRE_SPIN), + LEVEL_UP_MOVE(15, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE(18, MOVE_FLAME_WHEEL), + LEVEL_UP_MOVE(22, MOVE_CURSE), + LEVEL_UP_MOVE(25, MOVE_LAVA_PLUME), + LEVEL_UP_MOVE(27, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(30, MOVE_PROTECT), + LEVEL_UP_MOVE(34, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(38, MOVE_IRON_DEFENSE), LEVEL_UP_MOVE(40, MOVE_AMNESIA), - LEVEL_UP_MOVE(43, MOVE_FLAIL), - LEVEL_UP_MOVE(46, MOVE_HEAT_WAVE), + LEVEL_UP_MOVE(42, MOVE_FLAIL), + LEVEL_UP_MOVE(45, MOVE_HEAT_WAVE), + LEVEL_UP_MOVE(47, MOVE_SHELL_SMASH), + LEVEL_UP_MOVE(50, MOVE_INFERNO), LEVEL_UP_END }; -static const u16 sSableyeLevelUpLearnset[] = { +static const struct LevelUpMove sSableyeLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_SCRATCH), - LEVEL_UP_MOVE( 5, MOVE_FORESIGHT), - LEVEL_UP_MOVE( 9, MOVE_NIGHT_SHADE), - LEVEL_UP_MOVE(13, MOVE_ASTONISH), - LEVEL_UP_MOVE(17, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE( 4, MOVE_FORESIGHT), + LEVEL_UP_MOVE( 6, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE( 9, MOVE_ASTONISH), + LEVEL_UP_MOVE(11, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(14, MOVE_DETECT), + LEVEL_UP_MOVE(16, MOVE_SHADOW_SNEAK), + LEVEL_UP_MOVE(19, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(21, MOVE_FAKE_OUT), - LEVEL_UP_MOVE(25, MOVE_DETECT), - LEVEL_UP_MOVE(29, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE(33, MOVE_KNOCK_OFF), - LEVEL_UP_MOVE(37, MOVE_CONFUSE_RAY), - LEVEL_UP_MOVE(41, MOVE_SHADOW_BALL), - LEVEL_UP_MOVE(45, MOVE_MEAN_LOOK), + LEVEL_UP_MOVE(24, MOVE_PUNISHMENT), + LEVEL_UP_MOVE(26, MOVE_KNOCK_OFF), + LEVEL_UP_MOVE(29, MOVE_SHADOW_CLAW), + LEVEL_UP_MOVE(31, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(34, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(36, MOVE_POWER_GEM), + LEVEL_UP_MOVE(39, MOVE_SHADOW_BALL), + LEVEL_UP_MOVE(41, MOVE_FOUL_PLAY), + LEVEL_UP_MOVE(44, MOVE_QUASH), + LEVEL_UP_MOVE(46, MOVE_MEAN_LOOK), LEVEL_UP_END }; -static const u16 sBarboachLevelUpLearnset[] = { +static const struct LevelUpMove sBarboachLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_MUD_SLAP), LEVEL_UP_MOVE( 6, MOVE_MUD_SPORT), LEVEL_UP_MOVE( 6, MOVE_WATER_SPORT), - LEVEL_UP_MOVE(11, MOVE_WATER_GUN), - LEVEL_UP_MOVE(16, MOVE_MAGNITUDE), - LEVEL_UP_MOVE(21, MOVE_AMNESIA), - LEVEL_UP_MOVE(26, MOVE_REST), - LEVEL_UP_MOVE(26, MOVE_SNORE), - LEVEL_UP_MOVE(31, MOVE_EARTHQUAKE), - LEVEL_UP_MOVE(36, MOVE_FUTURE_SIGHT), - LEVEL_UP_MOVE(41, MOVE_FISSURE), + LEVEL_UP_MOVE( 9, MOVE_WATER_GUN), + LEVEL_UP_MOVE(13, MOVE_MUD_BOMB), + LEVEL_UP_MOVE(15, MOVE_AMNESIA), + LEVEL_UP_MOVE(17, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(20, MOVE_MAGNITUDE), + LEVEL_UP_MOVE(25, MOVE_REST), + LEVEL_UP_MOVE(25, MOVE_SNORE), + LEVEL_UP_MOVE(28, MOVE_AQUA_TAIL), + LEVEL_UP_MOVE(32, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(35, MOVE_MUDDY_WATER), + LEVEL_UP_MOVE(39, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(44, MOVE_FISSURE), LEVEL_UP_END }; -static const u16 sWhiscashLevelUpLearnset[] = { +static const struct LevelUpMove sWhiscashLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_THRASH), + LEVEL_UP_MOVE( 1, MOVE_THRASH), + LEVEL_UP_MOVE( 1, MOVE_BELCH), + LEVEL_UP_MOVE( 1, MOVE_ZEN_HEADBUTT), LEVEL_UP_MOVE( 1, MOVE_TICKLE), LEVEL_UP_MOVE( 1, MOVE_MUD_SLAP), LEVEL_UP_MOVE( 1, MOVE_MUD_SPORT), LEVEL_UP_MOVE( 1, MOVE_WATER_SPORT), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), LEVEL_UP_MOVE( 6, MOVE_MUD_SPORT), LEVEL_UP_MOVE( 6, MOVE_WATER_SPORT), - LEVEL_UP_MOVE(11, MOVE_WATER_GUN), - LEVEL_UP_MOVE(16, MOVE_MAGNITUDE), - LEVEL_UP_MOVE(21, MOVE_AMNESIA), - LEVEL_UP_MOVE(26, MOVE_REST), - LEVEL_UP_MOVE(26, MOVE_SNORE), - LEVEL_UP_MOVE(36, MOVE_EARTHQUAKE), - LEVEL_UP_MOVE(46, MOVE_FUTURE_SIGHT), - LEVEL_UP_MOVE(56, MOVE_FISSURE), + LEVEL_UP_MOVE( 9, MOVE_WATER_GUN), + LEVEL_UP_MOVE(13, MOVE_MUD_BOMB), + LEVEL_UP_MOVE(15, MOVE_AMNESIA), + LEVEL_UP_MOVE(17, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(20, MOVE_MAGNITUDE), + LEVEL_UP_MOVE(25, MOVE_REST), + LEVEL_UP_MOVE(25, MOVE_SNORE), + LEVEL_UP_MOVE(28, MOVE_AQUA_TAIL), + LEVEL_UP_MOVE(34, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(39, MOVE_MUDDY_WATER), + LEVEL_UP_MOVE(45, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(52, MOVE_FISSURE), LEVEL_UP_END }; -static const u16 sLuvdiscLevelUpLearnset[] = { +static const struct LevelUpMove sLuvdiscLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 4, MOVE_CHARM), - LEVEL_UP_MOVE(12, MOVE_WATER_GUN), - LEVEL_UP_MOVE(16, MOVE_AGILITY), - LEVEL_UP_MOVE(24, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(28, MOVE_ATTRACT), - LEVEL_UP_MOVE(36, MOVE_SWEET_KISS), - LEVEL_UP_MOVE(40, MOVE_FLAIL), - LEVEL_UP_MOVE(48, MOVE_SAFEGUARD), + LEVEL_UP_MOVE( 1, MOVE_CHARM), + LEVEL_UP_MOVE( 4, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 7, MOVE_AGILITY), + LEVEL_UP_MOVE( 9, MOVE_DRAINING_KISS), + LEVEL_UP_MOVE(13, MOVE_LUCKY_CHANT), + LEVEL_UP_MOVE(17, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(20, MOVE_ATTRACT), + LEVEL_UP_MOVE(22, MOVE_HEART_STAMP), + LEVEL_UP_MOVE(26, MOVE_FLAIL), + LEVEL_UP_MOVE(31, MOVE_SWEET_KISS), + LEVEL_UP_MOVE(34, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(37, MOVE_CAPTIVATE), + LEVEL_UP_MOVE(40, MOVE_AQUA_RING), + LEVEL_UP_MOVE(42, MOVE_SOAK), + LEVEL_UP_MOVE(46, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(49, MOVE_SAFEGUARD), LEVEL_UP_END }; -static const u16 sCorphishLevelUpLearnset[] = { +static const struct LevelUpMove sCorphishLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_BUBBLE), - LEVEL_UP_MOVE( 7, MOVE_HARDEN), - LEVEL_UP_MOVE(10, MOVE_VICE_GRIP), - LEVEL_UP_MOVE(13, MOVE_LEER), - LEVEL_UP_MOVE(20, MOVE_BUBBLE_BEAM), - LEVEL_UP_MOVE(23, MOVE_PROTECT), - LEVEL_UP_MOVE(26, MOVE_KNOCK_OFF), - LEVEL_UP_MOVE(32, MOVE_TAUNT), - LEVEL_UP_MOVE(35, MOVE_CRABHAMMER), - LEVEL_UP_MOVE(38, MOVE_SWORDS_DANCE), - LEVEL_UP_MOVE(44, MOVE_GUILLOTINE), + LEVEL_UP_MOVE( 5, MOVE_HARDEN), + LEVEL_UP_MOVE( 7, MOVE_VICE_GRIP), + LEVEL_UP_MOVE(10, MOVE_LEER), + LEVEL_UP_MOVE(14, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(17, MOVE_PROTECT), + LEVEL_UP_MOVE(20, MOVE_DOUBLE_HIT), + LEVEL_UP_MOVE(23, MOVE_KNOCK_OFF), + LEVEL_UP_MOVE(26, MOVE_NIGHT_SLASH), + LEVEL_UP_MOVE(31, MOVE_RAZOR_SHELL), + LEVEL_UP_MOVE(34, MOVE_TAUNT), + LEVEL_UP_MOVE(37, MOVE_SWORDS_DANCE), + LEVEL_UP_MOVE(39, MOVE_CRUNCH), + LEVEL_UP_MOVE(43, MOVE_CRABHAMMER), + LEVEL_UP_MOVE(48, MOVE_GUILLOTINE), LEVEL_UP_END }; -static const u16 sCrawdauntLevelUpLearnset[] = { +static const struct LevelUpMove sCrawdauntLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_SWIFT), + LEVEL_UP_MOVE( 1, MOVE_SWIFT), LEVEL_UP_MOVE( 1, MOVE_BUBBLE), LEVEL_UP_MOVE( 1, MOVE_HARDEN), LEVEL_UP_MOVE( 1, MOVE_VICE_GRIP), LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 7, MOVE_HARDEN), - LEVEL_UP_MOVE(10, MOVE_VICE_GRIP), - LEVEL_UP_MOVE(13, MOVE_LEER), - LEVEL_UP_MOVE(20, MOVE_BUBBLE_BEAM), - LEVEL_UP_MOVE(23, MOVE_PROTECT), - LEVEL_UP_MOVE(26, MOVE_KNOCK_OFF), - LEVEL_UP_MOVE(34, MOVE_TAUNT), - LEVEL_UP_MOVE(39, MOVE_CRABHAMMER), - LEVEL_UP_MOVE(44, MOVE_SWORDS_DANCE), - LEVEL_UP_MOVE(52, MOVE_GUILLOTINE), + LEVEL_UP_MOVE( 5, MOVE_HARDEN), + LEVEL_UP_MOVE( 7, MOVE_VICE_GRIP), + LEVEL_UP_MOVE(10, MOVE_LEER), + LEVEL_UP_MOVE(14, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(17, MOVE_PROTECT), + LEVEL_UP_MOVE(20, MOVE_DOUBLE_HIT), + LEVEL_UP_MOVE(23, MOVE_KNOCK_OFF), + LEVEL_UP_MOVE(26, MOVE_NIGHT_SLASH), + LEVEL_UP_MOVE(32, MOVE_RAZOR_SHELL), + LEVEL_UP_MOVE(36, MOVE_TAUNT), + LEVEL_UP_MOVE(40, MOVE_SWORDS_DANCE), + LEVEL_UP_MOVE(43, MOVE_CRUNCH), + LEVEL_UP_MOVE(48, MOVE_CRABHAMMER), + LEVEL_UP_MOVE(54, MOVE_GUILLOTINE), LEVEL_UP_END }; -static const u16 sFeebasLevelUpLearnset[] = { +static const struct LevelUpMove sFeebasLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SPLASH), LEVEL_UP_MOVE(15, MOVE_TACKLE), LEVEL_UP_MOVE(30, MOVE_FLAIL), LEVEL_UP_END }; -static const u16 sMiloticLevelUpLearnset[] = { +static const struct LevelUpMove sMiloticLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_WATER_PULSE), + LEVEL_UP_MOVE( 1, MOVE_WATER_PULSE), + LEVEL_UP_MOVE( 1, MOVE_WRAP), LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), - LEVEL_UP_MOVE( 5, MOVE_WRAP), - LEVEL_UP_MOVE(10, MOVE_WATER_SPORT), - LEVEL_UP_MOVE(15, MOVE_REFRESH), - LEVEL_UP_MOVE(20, MOVE_WATER_PULSE), - LEVEL_UP_MOVE(25, MOVE_TWISTER), - LEVEL_UP_MOVE(30, MOVE_RECOVER), - LEVEL_UP_MOVE(35, MOVE_RAIN_DANCE), - LEVEL_UP_MOVE(40, MOVE_HYDRO_PUMP), - LEVEL_UP_MOVE(45, MOVE_ATTRACT), - LEVEL_UP_MOVE(50, MOVE_SAFEGUARD), + LEVEL_UP_MOVE( 1, MOVE_WATER_SPORT), + LEVEL_UP_MOVE( 1, MOVE_REFRESH), + LEVEL_UP_MOVE( 4, MOVE_WATER_SPORT), + LEVEL_UP_MOVE( 7, MOVE_REFRESH), + LEVEL_UP_MOVE(11, MOVE_DISARMING_VOICE), + LEVEL_UP_MOVE(14, MOVE_TWISTER), + LEVEL_UP_MOVE(17, MOVE_AQUA_RING), + LEVEL_UP_MOVE(21, MOVE_CAPTIVATE), + LEVEL_UP_MOVE(24, MOVE_DRAGON_TAIL), + LEVEL_UP_MOVE(27, MOVE_RECOVER), + LEVEL_UP_MOVE(31, MOVE_AQUA_TAIL), + LEVEL_UP_MOVE(34, MOVE_ATTRACT), + LEVEL_UP_MOVE(37, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(41, MOVE_COIL), + LEVEL_UP_MOVE(44, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(47, MOVE_RAIN_DANCE), LEVEL_UP_END }; -static const u16 sCarvanhaLevelUpLearnset[] = { +static const struct LevelUpMove sCarvanhaLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_BITE), - LEVEL_UP_MOVE( 7, MOVE_RAGE), - LEVEL_UP_MOVE(13, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE(16, MOVE_SCARY_FACE), - LEVEL_UP_MOVE(22, MOVE_CRUNCH), - LEVEL_UP_MOVE(28, MOVE_SCREECH), - LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(37, MOVE_SWAGGER), - LEVEL_UP_MOVE(43, MOVE_AGILITY), + LEVEL_UP_MOVE( 4, MOVE_RAGE), + LEVEL_UP_MOVE( 8, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(11, MOVE_AQUA_JET), + LEVEL_UP_MOVE(15, MOVE_ASSURANCE), + LEVEL_UP_MOVE(18, MOVE_SCREECH), + LEVEL_UP_MOVE(22, MOVE_SWAGGER), + LEVEL_UP_MOVE(25, MOVE_ICE_FANG), + LEVEL_UP_MOVE(29, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(32, MOVE_POISON_FANG), + LEVEL_UP_MOVE(36, MOVE_CRUNCH), + LEVEL_UP_MOVE(39, MOVE_AGILITY), + LEVEL_UP_MOVE(43, MOVE_TAKE_DOWN), LEVEL_UP_END }; -static const u16 sSharpedoLevelUpLearnset[] = { +static const struct LevelUpMove sSharpedoLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_SLASH), + LEVEL_UP_MOVE( 1, MOVE_SLASH), + LEVEL_UP_MOVE( 1, MOVE_NIGHT_SLASH), + LEVEL_UP_MOVE( 1, MOVE_FEINT), LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_BITE), LEVEL_UP_MOVE( 1, MOVE_RAGE), LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE( 7, MOVE_RAGE), - LEVEL_UP_MOVE(13, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE(16, MOVE_SCARY_FACE), + LEVEL_UP_MOVE( 4, MOVE_RAGE), + LEVEL_UP_MOVE( 8, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(11, MOVE_AQUA_JET), + LEVEL_UP_MOVE(15, MOVE_ASSURANCE), + LEVEL_UP_MOVE(18, MOVE_SCREECH), + LEVEL_UP_MOVE(22, MOVE_SWAGGER), + LEVEL_UP_MOVE(25, MOVE_ICE_FANG), + LEVEL_UP_MOVE(29, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(34, MOVE_POISON_FANG), + LEVEL_UP_MOVE(40, MOVE_CRUNCH), + LEVEL_UP_MOVE(45, MOVE_AGILITY), + LEVEL_UP_MOVE(51, MOVE_SKULL_BASH), + LEVEL_UP_MOVE(56, MOVE_TAUNT), + LEVEL_UP_MOVE(62, MOVE_NIGHT_SLASH), + LEVEL_UP_END +}; + +static const struct LevelUpMove sTrapinchLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 1, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_BIDE), + LEVEL_UP_MOVE( 5, MOVE_MUD_SLAP), + LEVEL_UP_MOVE( 8, MOVE_BULLDOZE), + LEVEL_UP_MOVE(12, MOVE_SAND_TOMB), + LEVEL_UP_MOVE(15, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(19, MOVE_DIG), LEVEL_UP_MOVE(22, MOVE_CRUNCH), - LEVEL_UP_MOVE(28, MOVE_SCREECH), - LEVEL_UP_MOVE(33, MOVE_SLASH), - LEVEL_UP_MOVE(38, MOVE_TAUNT), - LEVEL_UP_MOVE(43, MOVE_SWAGGER), - LEVEL_UP_MOVE(48, MOVE_SKULL_BASH), - LEVEL_UP_MOVE(53, MOVE_AGILITY), + LEVEL_UP_MOVE(26, MOVE_EARTH_POWER), + LEVEL_UP_MOVE(29, MOVE_FEINT), + LEVEL_UP_MOVE(33, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(36, MOVE_SANDSTORM), + LEVEL_UP_MOVE(40, MOVE_SUPERPOWER), + LEVEL_UP_MOVE(43, MOVE_HYPER_BEAM), + LEVEL_UP_MOVE(47, MOVE_FISSURE), LEVEL_UP_END }; -static const u16 sTrapinchLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_BITE), - LEVEL_UP_MOVE( 9, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(17, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE(25, MOVE_SAND_TOMB), - LEVEL_UP_MOVE(33, MOVE_CRUNCH), - LEVEL_UP_MOVE(41, MOVE_DIG), - LEVEL_UP_MOVE(49, MOVE_SANDSTORM), - LEVEL_UP_MOVE(57, MOVE_HYPER_BEAM), - LEVEL_UP_END -}; - -static const u16 sVibravaLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_BITE), +static const struct LevelUpMove sVibravaLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_DRAGON_BREATH), + LEVEL_UP_MOVE( 1, MOVE_DRAGON_BREATH), LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_SONIC_BOOM), LEVEL_UP_MOVE( 1, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE( 1, MOVE_SAND_TOMB), - LEVEL_UP_MOVE( 9, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(17, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE(25, MOVE_SAND_TOMB), - LEVEL_UP_MOVE(33, MOVE_CRUNCH), - LEVEL_UP_MOVE(35, MOVE_DRAGON_BREATH), - LEVEL_UP_MOVE(41, MOVE_SCREECH), - LEVEL_UP_MOVE(49, MOVE_SANDSTORM), - LEVEL_UP_MOVE(57, MOVE_HYPER_BEAM), + LEVEL_UP_MOVE( 1, MOVE_BIDE), + LEVEL_UP_MOVE( 5, MOVE_MUD_SLAP), + LEVEL_UP_MOVE( 8, MOVE_BULLDOZE), + LEVEL_UP_MOVE(12, MOVE_SAND_TOMB), + LEVEL_UP_MOVE(15, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(19, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(22, MOVE_SCREECH), + LEVEL_UP_MOVE(26, MOVE_EARTH_POWER), + LEVEL_UP_MOVE(29, MOVE_BUG_BUZZ), + LEVEL_UP_MOVE(33, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(36, MOVE_SANDSTORM), + LEVEL_UP_MOVE(40, MOVE_UPROAR), + LEVEL_UP_MOVE(43, MOVE_HYPER_BEAM), + LEVEL_UP_MOVE(47, MOVE_BOOMBURST), LEVEL_UP_END }; -static const u16 sFlygonLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_BITE), +static const struct LevelUpMove sFlygonLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_DRAGON_CLAW), + LEVEL_UP_MOVE( 1, MOVE_DRAGON_CLAW), + LEVEL_UP_MOVE( 1, MOVE_DRAGON_BREATH), + LEVEL_UP_MOVE( 1, MOVE_DRAGON_DANCE), LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_SONIC_BOOM), LEVEL_UP_MOVE( 1, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE( 1, MOVE_SAND_TOMB), - LEVEL_UP_MOVE( 9, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(17, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE(25, MOVE_SAND_TOMB), - LEVEL_UP_MOVE(33, MOVE_CRUNCH), - LEVEL_UP_MOVE(35, MOVE_DRAGON_BREATH), - LEVEL_UP_MOVE(41, MOVE_SCREECH), - LEVEL_UP_MOVE(53, MOVE_SANDSTORM), - LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM), + LEVEL_UP_MOVE( 1, MOVE_BIDE), + LEVEL_UP_MOVE( 5, MOVE_MUD_SLAP), + LEVEL_UP_MOVE( 8, MOVE_BULLDOZE), + LEVEL_UP_MOVE(12, MOVE_SAND_TOMB), + LEVEL_UP_MOVE(15, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(19, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(22, MOVE_SCREECH), + LEVEL_UP_MOVE(26, MOVE_EARTH_POWER), + LEVEL_UP_MOVE(29, MOVE_DRAGON_TAIL), + LEVEL_UP_MOVE(33, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(36, MOVE_SANDSTORM), + LEVEL_UP_MOVE(40, MOVE_UPROAR), + LEVEL_UP_MOVE(43, MOVE_HYPER_BEAM), + LEVEL_UP_MOVE(47, MOVE_DRAGON_RUSH), LEVEL_UP_END }; -static const u16 sMakuhitaLevelUpLearnset[] = { +static const struct LevelUpMove sMakuhitaLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE( 4, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(10, MOVE_ARM_THRUST), - LEVEL_UP_MOVE(13, MOVE_VITAL_THROW), - LEVEL_UP_MOVE(19, MOVE_FAKE_OUT), - LEVEL_UP_MOVE(22, MOVE_WHIRLWIND), - LEVEL_UP_MOVE(28, MOVE_KNOCK_OFF), - LEVEL_UP_MOVE(31, MOVE_SMELLING_SALT), - LEVEL_UP_MOVE(37, MOVE_BELLY_DRUM), - LEVEL_UP_MOVE(40, MOVE_ENDURE), - LEVEL_UP_MOVE(46, MOVE_SEISMIC_TOSS), - LEVEL_UP_MOVE(49, MOVE_REVERSAL), + LEVEL_UP_MOVE( 7, MOVE_ARM_THRUST), + LEVEL_UP_MOVE(10, MOVE_FAKE_OUT), + LEVEL_UP_MOVE(13, MOVE_FORCE_PALM), + LEVEL_UP_MOVE(16, MOVE_WHIRLWIND), + LEVEL_UP_MOVE(19, MOVE_KNOCK_OFF), + LEVEL_UP_MOVE(22, MOVE_VITAL_THROW), + LEVEL_UP_MOVE(25, MOVE_BELLY_DRUM), + LEVEL_UP_MOVE(28, MOVE_SMELLING_SALT), + LEVEL_UP_MOVE(31, MOVE_SEISMIC_TOSS), + LEVEL_UP_MOVE(34, MOVE_WAKE_UP_SLAP), + LEVEL_UP_MOVE(37, MOVE_ENDURE), + LEVEL_UP_MOVE(40, MOVE_CLOSE_COMBAT), + LEVEL_UP_MOVE(43, MOVE_REVERSAL), + LEVEL_UP_MOVE(46, MOVE_HEAVY_SLAM), LEVEL_UP_END }; -static const u16 sHariyamaLevelUpLearnset[] = { +static const struct LevelUpMove sHariyamaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BRINE), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), LEVEL_UP_MOVE( 1, MOVE_ARM_THRUST), LEVEL_UP_MOVE( 4, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(10, MOVE_ARM_THRUST), - LEVEL_UP_MOVE(13, MOVE_VITAL_THROW), - LEVEL_UP_MOVE(19, MOVE_FAKE_OUT), - LEVEL_UP_MOVE(22, MOVE_WHIRLWIND), - LEVEL_UP_MOVE(29, MOVE_KNOCK_OFF), - LEVEL_UP_MOVE(33, MOVE_SMELLING_SALT), - LEVEL_UP_MOVE(40, MOVE_BELLY_DRUM), - LEVEL_UP_MOVE(44, MOVE_ENDURE), - LEVEL_UP_MOVE(51, MOVE_SEISMIC_TOSS), - LEVEL_UP_MOVE(55, MOVE_REVERSAL), + LEVEL_UP_MOVE( 7, MOVE_ARM_THRUST), + LEVEL_UP_MOVE(10, MOVE_FAKE_OUT), + LEVEL_UP_MOVE(13, MOVE_FORCE_PALM), + LEVEL_UP_MOVE(16, MOVE_WHIRLWIND), + LEVEL_UP_MOVE(19, MOVE_KNOCK_OFF), + LEVEL_UP_MOVE(22, MOVE_VITAL_THROW), + LEVEL_UP_MOVE(26, MOVE_BELLY_DRUM), + LEVEL_UP_MOVE(30, MOVE_SMELLING_SALT), + LEVEL_UP_MOVE(34, MOVE_SEISMIC_TOSS), + LEVEL_UP_MOVE(38, MOVE_WAKE_UP_SLAP), + LEVEL_UP_MOVE(42, MOVE_ENDURE), + LEVEL_UP_MOVE(46, MOVE_CLOSE_COMBAT), + LEVEL_UP_MOVE(50, MOVE_REVERSAL), + LEVEL_UP_MOVE(54, MOVE_HEAVY_SLAM), LEVEL_UP_END }; -static const u16 sElectrikeLevelUpLearnset[] = { +static const struct LevelUpMove sElectrikeLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 4, MOVE_THUNDER_WAVE), - LEVEL_UP_MOVE( 9, MOVE_LEER), - LEVEL_UP_MOVE(12, MOVE_HOWL), - LEVEL_UP_MOVE(17, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(20, MOVE_SPARK), - LEVEL_UP_MOVE(25, MOVE_ODOR_SLEUTH), - LEVEL_UP_MOVE(28, MOVE_ROAR), - LEVEL_UP_MOVE(33, MOVE_BITE), - LEVEL_UP_MOVE(36, MOVE_THUNDER), - LEVEL_UP_MOVE(41, MOVE_CHARGE), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE( 4, MOVE_LEER), + LEVEL_UP_MOVE( 7, MOVE_HOWL), + LEVEL_UP_MOVE(10, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(13, MOVE_SPARK), + LEVEL_UP_MOVE(16, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE(19, MOVE_THUNDER_FANG), + LEVEL_UP_MOVE(24, MOVE_BITE), + LEVEL_UP_MOVE(29, MOVE_DISCHARGE), + LEVEL_UP_MOVE(34, MOVE_ROAR), + LEVEL_UP_MOVE(39, MOVE_WILD_CHARGE), + LEVEL_UP_MOVE(44, MOVE_CHARGE), + LEVEL_UP_MOVE(49, MOVE_THUNDER), LEVEL_UP_END }; -static const u16 sManectricLevelUpLearnset[] = { +static const struct LevelUpMove sManectricLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ELECTRIC_TERRAIN), + LEVEL_UP_MOVE( 1, MOVE_FIRE_FANG), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_THUNDER_WAVE), LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_HOWL), - LEVEL_UP_MOVE( 4, MOVE_THUNDER_WAVE), - LEVEL_UP_MOVE( 9, MOVE_LEER), - LEVEL_UP_MOVE(12, MOVE_HOWL), - LEVEL_UP_MOVE(17, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(20, MOVE_SPARK), - LEVEL_UP_MOVE(25, MOVE_ODOR_SLEUTH), - LEVEL_UP_MOVE(31, MOVE_ROAR), - LEVEL_UP_MOVE(39, MOVE_BITE), - LEVEL_UP_MOVE(45, MOVE_THUNDER), - LEVEL_UP_MOVE(53, MOVE_CHARGE), + LEVEL_UP_MOVE( 4, MOVE_LEER), + LEVEL_UP_MOVE( 7, MOVE_HOWL), + LEVEL_UP_MOVE(10, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(13, MOVE_SPARK), + LEVEL_UP_MOVE(16, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE(19, MOVE_THUNDER_FANG), + LEVEL_UP_MOVE(24, MOVE_BITE), + LEVEL_UP_MOVE(30, MOVE_DISCHARGE), + LEVEL_UP_MOVE(36, MOVE_ROAR), + LEVEL_UP_MOVE(42, MOVE_WILD_CHARGE), + LEVEL_UP_MOVE(48, MOVE_CHARGE), + LEVEL_UP_MOVE(54, MOVE_THUNDER), + LEVEL_UP_MOVE(60, MOVE_ELECTRIC_TERRAIN), LEVEL_UP_END }; -static const u16 sNumelLevelUpLearnset[] = { +static const struct LevelUpMove sNumelLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_GROWL), LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE(11, MOVE_EMBER), - LEVEL_UP_MOVE(19, MOVE_MAGNITUDE), - LEVEL_UP_MOVE(25, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE(29, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(31, MOVE_AMNESIA), - LEVEL_UP_MOVE(35, MOVE_EARTHQUAKE), - LEVEL_UP_MOVE(41, MOVE_FLAMETHROWER), - LEVEL_UP_MOVE(49, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE( 5, MOVE_EMBER), + LEVEL_UP_MOVE( 8, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(12, MOVE_MAGNITUDE), + LEVEL_UP_MOVE(15, MOVE_FLAME_BURST), + LEVEL_UP_MOVE(19, MOVE_AMNESIA), + LEVEL_UP_MOVE(22, MOVE_LAVA_PLUME), + LEVEL_UP_MOVE(26, MOVE_EARTH_POWER), + LEVEL_UP_MOVE(29, MOVE_CURSE), + LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(36, MOVE_YAWN), + LEVEL_UP_MOVE(40, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(43, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(47, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; -static const u16 sCameruptLevelUpLearnset[] = { +static const struct LevelUpMove sCameruptLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE( 1, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE( 1, MOVE_FISSURE), + LEVEL_UP_MOVE( 1, MOVE_ERUPTION), LEVEL_UP_MOVE( 1, MOVE_GROWL), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_EMBER), - LEVEL_UP_MOVE( 1, MOVE_MAGNITUDE), - LEVEL_UP_MOVE(11, MOVE_EMBER), - LEVEL_UP_MOVE(19, MOVE_MAGNITUDE), - LEVEL_UP_MOVE(25, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE(29, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(31, MOVE_AMNESIA), - LEVEL_UP_MOVE(33, MOVE_ROCK_SLIDE), - LEVEL_UP_MOVE(37, MOVE_EARTHQUAKE), - LEVEL_UP_MOVE(45, MOVE_ERUPTION), - LEVEL_UP_MOVE(55, MOVE_FISSURE), + LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 8, MOVE_EMBER), + LEVEL_UP_MOVE( 8, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(12, MOVE_MAGNITUDE), + LEVEL_UP_MOVE(15, MOVE_FLAME_BURST), + LEVEL_UP_MOVE(19, MOVE_AMNESIA), + LEVEL_UP_MOVE(22, MOVE_LAVA_PLUME), + LEVEL_UP_MOVE(26, MOVE_EARTH_POWER), + LEVEL_UP_MOVE(29, MOVE_CURSE), + LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(39, MOVE_YAWN), + LEVEL_UP_MOVE(46, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(52, MOVE_ERUPTION), + LEVEL_UP_MOVE(59, MOVE_FISSURE), LEVEL_UP_END }; -static const u16 sSphealLevelUpLearnset[] = { +static const struct LevelUpMove sSphealLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE( 1, MOVE_POWDER_SNOW), LEVEL_UP_MOVE( 1, MOVE_GROWL), LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), - LEVEL_UP_MOVE( 7, MOVE_ENCORE), + LEVEL_UP_MOVE( 5, MOVE_ROLLOUT), + LEVEL_UP_MOVE( 9, MOVE_ENCORE), LEVEL_UP_MOVE(13, MOVE_ICE_BALL), - LEVEL_UP_MOVE(19, MOVE_BODY_SLAM), - LEVEL_UP_MOVE(25, MOVE_AURORA_BEAM), - LEVEL_UP_MOVE(31, MOVE_HAIL), - LEVEL_UP_MOVE(37, MOVE_REST), - LEVEL_UP_MOVE(37, MOVE_SNORE), - LEVEL_UP_MOVE(43, MOVE_BLIZZARD), - LEVEL_UP_MOVE(49, MOVE_SHEER_COLD), + LEVEL_UP_MOVE(17, MOVE_BRINE), + LEVEL_UP_MOVE(21, MOVE_AURORA_BEAM), + LEVEL_UP_MOVE(26, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(31, MOVE_REST), + LEVEL_UP_MOVE(31, MOVE_SNORE), + LEVEL_UP_MOVE(36, MOVE_HAIL), + LEVEL_UP_MOVE(41, MOVE_BLIZZARD), + LEVEL_UP_MOVE(46, MOVE_SHEER_COLD), LEVEL_UP_END }; -static const u16 sSealeoLevelUpLearnset[] = { +static const struct LevelUpMove sSealeoLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_SWAGGER), + LEVEL_UP_MOVE( 1, MOVE_SWAGGER), + LEVEL_UP_MOVE( 1, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE( 1, MOVE_POWDER_SNOW), LEVEL_UP_MOVE( 1, MOVE_GROWL), LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), - LEVEL_UP_MOVE( 1, MOVE_ENCORE), - LEVEL_UP_MOVE( 7, MOVE_ENCORE), + LEVEL_UP_MOVE( 5, MOVE_ROLLOUT), + LEVEL_UP_MOVE( 9, MOVE_ENCORE), LEVEL_UP_MOVE(13, MOVE_ICE_BALL), - LEVEL_UP_MOVE(19, MOVE_BODY_SLAM), - LEVEL_UP_MOVE(25, MOVE_AURORA_BEAM), - LEVEL_UP_MOVE(31, MOVE_HAIL), - LEVEL_UP_MOVE(39, MOVE_REST), - LEVEL_UP_MOVE(39, MOVE_SNORE), - LEVEL_UP_MOVE(47, MOVE_BLIZZARD), - LEVEL_UP_MOVE(55, MOVE_SHEER_COLD), + LEVEL_UP_MOVE(17, MOVE_BRINE), + LEVEL_UP_MOVE(21, MOVE_AURORA_BEAM), + LEVEL_UP_MOVE(26, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(31, MOVE_REST), + LEVEL_UP_MOVE(31, MOVE_SNORE), + LEVEL_UP_MOVE(38, MOVE_HAIL), + LEVEL_UP_MOVE(45, MOVE_BLIZZARD), + LEVEL_UP_MOVE(52, MOVE_SHEER_COLD), LEVEL_UP_END }; -static const u16 sWalreinLevelUpLearnset[] = { +static const struct LevelUpMove sWalreinLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_ICE_FANG), + LEVEL_UP_MOVE( 1, MOVE_ICE_FANG), + LEVEL_UP_MOVE( 1, MOVE_SWAGGER), + LEVEL_UP_MOVE( 1, MOVE_CRUNCH), + LEVEL_UP_MOVE( 1, MOVE_DEFENSE_CURL), LEVEL_UP_MOVE( 1, MOVE_POWDER_SNOW), LEVEL_UP_MOVE( 1, MOVE_GROWL), LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), - LEVEL_UP_MOVE( 1, MOVE_ENCORE), + LEVEL_UP_MOVE( 7, MOVE_ROLLOUT), LEVEL_UP_MOVE( 7, MOVE_ENCORE), LEVEL_UP_MOVE(13, MOVE_ICE_BALL), - LEVEL_UP_MOVE(19, MOVE_BODY_SLAM), - LEVEL_UP_MOVE(25, MOVE_AURORA_BEAM), - LEVEL_UP_MOVE(31, MOVE_HAIL), - LEVEL_UP_MOVE(39, MOVE_REST), - LEVEL_UP_MOVE(39, MOVE_SNORE), - LEVEL_UP_MOVE(50, MOVE_BLIZZARD), - LEVEL_UP_MOVE(61, MOVE_SHEER_COLD), + LEVEL_UP_MOVE(19, MOVE_BRINE), + LEVEL_UP_MOVE(19, MOVE_AURORA_BEAM), + LEVEL_UP_MOVE(25, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(31, MOVE_REST), + LEVEL_UP_MOVE(31, MOVE_SNORE), + LEVEL_UP_MOVE(38, MOVE_HAIL), + LEVEL_UP_MOVE(49, MOVE_BLIZZARD), + LEVEL_UP_MOVE(60, MOVE_SHEER_COLD), LEVEL_UP_END }; -static const u16 sCacneaLevelUpLearnset[] = { +static const struct LevelUpMove sCacneaLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_POISON_STING), LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 5, MOVE_ABSORB), - LEVEL_UP_MOVE( 9, MOVE_GROWTH), - LEVEL_UP_MOVE(13, MOVE_LEECH_SEED), - LEVEL_UP_MOVE(17, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(21, MOVE_PIN_MISSILE), - LEVEL_UP_MOVE(25, MOVE_INGRAIN), - LEVEL_UP_MOVE(29, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE(33, MOVE_SPIKES), - LEVEL_UP_MOVE(37, MOVE_NEEDLE_ARM), - LEVEL_UP_MOVE(41, MOVE_COTTON_SPORE), - LEVEL_UP_MOVE(45, MOVE_SANDSTORM), + LEVEL_UP_MOVE( 4, MOVE_ABSORB), + LEVEL_UP_MOVE( 7, MOVE_GROWTH), + LEVEL_UP_MOVE(10, MOVE_LEECH_SEED), + LEVEL_UP_MOVE(13, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(16, MOVE_NEEDLE_ARM), + LEVEL_UP_MOVE(19, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(22, MOVE_INGRAIN), + LEVEL_UP_MOVE(26, MOVE_PAYBACK), + LEVEL_UP_MOVE(30, MOVE_SPIKES), + LEVEL_UP_MOVE(34, MOVE_SUCKER_PUNCH), + LEVEL_UP_MOVE(38, MOVE_PIN_MISSILE), + LEVEL_UP_MOVE(42, MOVE_ENERGY_BALL), + LEVEL_UP_MOVE(46, MOVE_COTTON_SPORE), + LEVEL_UP_MOVE(50, MOVE_SANDSTORM), + LEVEL_UP_MOVE(54, MOVE_DESTINY_BOND), LEVEL_UP_END }; -static const u16 sCacturneLevelUpLearnset[] = { +static const struct LevelUpMove sCacturneLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_SPIKY_SHIELD), + LEVEL_UP_MOVE( 1, MOVE_SPIKY_SHIELD), + LEVEL_UP_MOVE( 1, MOVE_DESTINY_BOND), + LEVEL_UP_MOVE( 1, MOVE_REVENGE), LEVEL_UP_MOVE( 1, MOVE_POISON_STING), LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_ABSORB), LEVEL_UP_MOVE( 1, MOVE_GROWTH), - LEVEL_UP_MOVE( 5, MOVE_ABSORB), - LEVEL_UP_MOVE( 9, MOVE_GROWTH), - LEVEL_UP_MOVE(13, MOVE_LEECH_SEED), - LEVEL_UP_MOVE(17, MOVE_SAND_ATTACK), - LEVEL_UP_MOVE(21, MOVE_PIN_MISSILE), - LEVEL_UP_MOVE(25, MOVE_INGRAIN), - LEVEL_UP_MOVE(29, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE(35, MOVE_SPIKES), - LEVEL_UP_MOVE(41, MOVE_NEEDLE_ARM), - LEVEL_UP_MOVE(47, MOVE_COTTON_SPORE), - LEVEL_UP_MOVE(53, MOVE_SANDSTORM), + LEVEL_UP_MOVE( 4, MOVE_ABSORB), + LEVEL_UP_MOVE( 7, MOVE_GROWTH), + LEVEL_UP_MOVE(10, MOVE_LEECH_SEED), + LEVEL_UP_MOVE(13, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(16, MOVE_NEEDLE_ARM), + LEVEL_UP_MOVE(19, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(22, MOVE_INGRAIN), + LEVEL_UP_MOVE(26, MOVE_PAYBACK), + LEVEL_UP_MOVE(30, MOVE_SPIKES), + LEVEL_UP_MOVE(35, MOVE_SUCKER_PUNCH), + LEVEL_UP_MOVE(38, MOVE_PIN_MISSILE), + LEVEL_UP_MOVE(44, MOVE_ENERGY_BALL), + LEVEL_UP_MOVE(49, MOVE_COTTON_SPORE), + LEVEL_UP_MOVE(54, MOVE_SANDSTORM), + LEVEL_UP_MOVE(59, MOVE_DESTINY_BOND), LEVEL_UP_END }; -static const u16 sSnoruntLevelUpLearnset[] = { +static const struct LevelUpMove sSnoruntLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_POWDER_SNOW), LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 7, MOVE_DOUBLE_TEAM), - LEVEL_UP_MOVE(10, MOVE_BITE), - LEVEL_UP_MOVE(16, MOVE_ICY_WIND), - LEVEL_UP_MOVE(19, MOVE_HEADBUTT), - LEVEL_UP_MOVE(25, MOVE_PROTECT), - LEVEL_UP_MOVE(28, MOVE_CRUNCH), - LEVEL_UP_MOVE(34, MOVE_ICE_BEAM), - LEVEL_UP_MOVE(37, MOVE_HAIL), - LEVEL_UP_MOVE(43, MOVE_BLIZZARD), + LEVEL_UP_MOVE( 5, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE(10, MOVE_ICE_SHARD), + LEVEL_UP_MOVE(14, MOVE_ICY_WIND), + LEVEL_UP_MOVE(19, MOVE_BITE), + LEVEL_UP_MOVE(23, MOVE_ICE_FANG), + LEVEL_UP_MOVE(28, MOVE_HEADBUTT), + LEVEL_UP_MOVE(32, MOVE_PROTECT), + LEVEL_UP_MOVE(37, MOVE_FROST_BREATH), + LEVEL_UP_MOVE(41, MOVE_CRUNCH), + LEVEL_UP_MOVE(46, MOVE_BLIZZARD), + LEVEL_UP_MOVE(50, MOVE_HAIL), LEVEL_UP_END }; -static const u16 sGlalieLevelUpLearnset[] = { +static const struct LevelUpMove sGlalieLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_FREEZE_DRY), + LEVEL_UP_MOVE( 1, MOVE_FREEZE_DRY), + LEVEL_UP_MOVE( 1, MOVE_SHEER_COLD), LEVEL_UP_MOVE( 1, MOVE_POWDER_SNOW), LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_DOUBLE_TEAM), - LEVEL_UP_MOVE( 1, MOVE_BITE), - LEVEL_UP_MOVE( 7, MOVE_DOUBLE_TEAM), - LEVEL_UP_MOVE(10, MOVE_BITE), - LEVEL_UP_MOVE(16, MOVE_ICY_WIND), - LEVEL_UP_MOVE(19, MOVE_HEADBUTT), - LEVEL_UP_MOVE(25, MOVE_PROTECT), - LEVEL_UP_MOVE(28, MOVE_CRUNCH), - LEVEL_UP_MOVE(34, MOVE_ICE_BEAM), - LEVEL_UP_MOVE(42, MOVE_HAIL), - LEVEL_UP_MOVE(53, MOVE_BLIZZARD), + LEVEL_UP_MOVE( 1, MOVE_ICE_SHARD), + LEVEL_UP_MOVE( 5, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE(10, MOVE_ICE_SHARD), + LEVEL_UP_MOVE(14, MOVE_ICY_WIND), + LEVEL_UP_MOVE(19, MOVE_BITE), + LEVEL_UP_MOVE(23, MOVE_ICE_FANG), + LEVEL_UP_MOVE(28, MOVE_HEADBUTT), + LEVEL_UP_MOVE(32, MOVE_PROTECT), + LEVEL_UP_MOVE(37, MOVE_FROST_BREATH), + LEVEL_UP_MOVE(41, MOVE_CRUNCH), + LEVEL_UP_MOVE(48, MOVE_BLIZZARD), + LEVEL_UP_MOVE(54, MOVE_HAIL), LEVEL_UP_MOVE(61, MOVE_SHEER_COLD), LEVEL_UP_END }; -static const u16 sLunatoneLevelUpLearnset[] = { +static const struct LevelUpMove sLunatoneLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POWER_GEM), + LEVEL_UP_MOVE( 1, MOVE_PSYSHOCK), + LEVEL_UP_MOVE( 1, MOVE_MOONBLAST), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_HARDEN), - LEVEL_UP_MOVE( 7, MOVE_CONFUSION), - LEVEL_UP_MOVE(13, MOVE_ROCK_THROW), - LEVEL_UP_MOVE(19, MOVE_HYPNOSIS), - LEVEL_UP_MOVE(25, MOVE_PSYWAVE), - LEVEL_UP_MOVE(31, MOVE_COSMIC_POWER), - LEVEL_UP_MOVE(37, MOVE_PSYCHIC), - LEVEL_UP_MOVE(43, MOVE_FUTURE_SIGHT), - LEVEL_UP_MOVE(49, MOVE_EXPLOSION), + LEVEL_UP_MOVE( 1, MOVE_CONFUSION), + LEVEL_UP_MOVE( 1, MOVE_ROCK_THROW), + LEVEL_UP_MOVE( 5, MOVE_HYPNOSIS), + LEVEL_UP_MOVE( 9, MOVE_ROCK_POLISH), + LEVEL_UP_MOVE(13, MOVE_PSYWAVE), + LEVEL_UP_MOVE(17, MOVE_EMBARGO), + LEVEL_UP_MOVE(21, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(25, MOVE_COSMIC_POWER), + LEVEL_UP_MOVE(29, MOVE_PSYCHIC), + LEVEL_UP_MOVE(33, MOVE_HEAL_BLOCK), + LEVEL_UP_MOVE(37, MOVE_STONE_EDGE), + LEVEL_UP_MOVE(41, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(45, MOVE_EXPLOSION), + LEVEL_UP_MOVE(49, MOVE_MAGIC_ROOM), LEVEL_UP_END }; -static const u16 sSolrockLevelUpLearnset[] = { +static const struct LevelUpMove sSolrockLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_FLARE_BLITZ), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_HARDEN), - LEVEL_UP_MOVE( 7, MOVE_CONFUSION), - LEVEL_UP_MOVE(13, MOVE_ROCK_THROW), - LEVEL_UP_MOVE(19, MOVE_FIRE_SPIN), - LEVEL_UP_MOVE(25, MOVE_PSYWAVE), - LEVEL_UP_MOVE(31, MOVE_COSMIC_POWER), - LEVEL_UP_MOVE(37, MOVE_ROCK_SLIDE), - LEVEL_UP_MOVE(43, MOVE_SOLAR_BEAM), - LEVEL_UP_MOVE(49, MOVE_EXPLOSION), + LEVEL_UP_MOVE( 1, MOVE_CONFUSION), + LEVEL_UP_MOVE( 1, MOVE_ROCK_THROW), + LEVEL_UP_MOVE( 5, MOVE_FIRE_SPIN), + LEVEL_UP_MOVE( 9, MOVE_ROCK_POLISH), + LEVEL_UP_MOVE(13, MOVE_PSYWAVE), + LEVEL_UP_MOVE(17, MOVE_EMBARGO), + LEVEL_UP_MOVE(21, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(25, MOVE_COSMIC_POWER), + LEVEL_UP_MOVE(29, MOVE_PSYCHIC), + LEVEL_UP_MOVE(33, MOVE_HEAL_BLOCK), + LEVEL_UP_MOVE(37, MOVE_STONE_EDGE), + LEVEL_UP_MOVE(41, MOVE_SOLAR_BEAM), + LEVEL_UP_MOVE(45, MOVE_EXPLOSION), + LEVEL_UP_MOVE(49, MOVE_WONDER_ROOM), LEVEL_UP_END }; -static const u16 sAzurillLevelUpLearnset[] = { +static const struct LevelUpMove sAzurillLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SPLASH), - LEVEL_UP_MOVE( 3, MOVE_CHARM), - LEVEL_UP_MOVE( 6, MOVE_TAIL_WHIP), - LEVEL_UP_MOVE(10, MOVE_BUBBLE), - LEVEL_UP_MOVE(15, MOVE_SLAM), - LEVEL_UP_MOVE(21, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 2, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 5, MOVE_WATER_SPORT), + LEVEL_UP_MOVE( 7, MOVE_BUBBLE), + LEVEL_UP_MOVE(10, MOVE_CHARM), + LEVEL_UP_MOVE(13, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(16, MOVE_HELPING_HAND), + LEVEL_UP_MOVE(20, MOVE_SLAM), + LEVEL_UP_MOVE(23, MOVE_BOUNCE), LEVEL_UP_END }; -static const u16 sSpoinkLevelUpLearnset[] = { +static const struct LevelUpMove sSpoinkLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SPLASH), LEVEL_UP_MOVE( 7, MOVE_PSYWAVE), LEVEL_UP_MOVE(10, MOVE_ODOR_SLEUTH), - LEVEL_UP_MOVE(16, MOVE_PSYBEAM), - LEVEL_UP_MOVE(19, MOVE_PSYCH_UP), - LEVEL_UP_MOVE(25, MOVE_CONFUSE_RAY), - LEVEL_UP_MOVE(28, MOVE_MAGIC_COAT), - LEVEL_UP_MOVE(34, MOVE_PSYCHIC), - LEVEL_UP_MOVE(37, MOVE_REST), - LEVEL_UP_MOVE(37, MOVE_SNORE), - LEVEL_UP_MOVE(43, MOVE_BOUNCE), + LEVEL_UP_MOVE(14, MOVE_PSYBEAM), + LEVEL_UP_MOVE(15, MOVE_PSYCH_UP), + LEVEL_UP_MOVE(18, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(21, MOVE_MAGIC_COAT), + LEVEL_UP_MOVE(26, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(29, MOVE_POWER_GEM), + LEVEL_UP_MOVE(29, MOVE_REST), + LEVEL_UP_MOVE(33, MOVE_SNORE), + LEVEL_UP_MOVE(38, MOVE_PSYSHOCK), + LEVEL_UP_MOVE(40, MOVE_PAYBACK), + LEVEL_UP_MOVE(44, MOVE_PSYCHIC), + LEVEL_UP_MOVE(50, MOVE_BOUNCE), LEVEL_UP_END }; -static const u16 sGrumpigLevelUpLearnset[] = { +static const struct LevelUpMove sGrumpigLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_TEETER_DANCE), + LEVEL_UP_MOVE( 1, MOVE_TEETER_DANCE), + LEVEL_UP_MOVE( 1, MOVE_BELCH), LEVEL_UP_MOVE( 1, MOVE_SPLASH), LEVEL_UP_MOVE( 1, MOVE_PSYWAVE), LEVEL_UP_MOVE( 1, MOVE_ODOR_SLEUTH), LEVEL_UP_MOVE( 1, MOVE_PSYBEAM), LEVEL_UP_MOVE( 7, MOVE_PSYWAVE), LEVEL_UP_MOVE(10, MOVE_ODOR_SLEUTH), - LEVEL_UP_MOVE(16, MOVE_PSYBEAM), - LEVEL_UP_MOVE(19, MOVE_PSYCH_UP), - LEVEL_UP_MOVE(25, MOVE_CONFUSE_RAY), - LEVEL_UP_MOVE(28, MOVE_MAGIC_COAT), - LEVEL_UP_MOVE(37, MOVE_PSYCHIC), - LEVEL_UP_MOVE(43, MOVE_REST), - LEVEL_UP_MOVE(43, MOVE_SNORE), - LEVEL_UP_MOVE(55, MOVE_BOUNCE), + LEVEL_UP_MOVE(14, MOVE_PSYBEAM), + LEVEL_UP_MOVE(15, MOVE_PSYCH_UP), + LEVEL_UP_MOVE(18, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(21, MOVE_MAGIC_COAT), + LEVEL_UP_MOVE(26, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(29, MOVE_POWER_GEM), + LEVEL_UP_MOVE(35, MOVE_REST), + LEVEL_UP_MOVE(35, MOVE_SNORE), + LEVEL_UP_MOVE(42, MOVE_PSYSHOCK), + LEVEL_UP_MOVE(46, MOVE_PAYBACK), + LEVEL_UP_MOVE(52, MOVE_PSYCHIC), + LEVEL_UP_MOVE(60, MOVE_BOUNCE), LEVEL_UP_END }; -static const u16 sPlusleLevelUpLearnset[] = { +static const struct LevelUpMove sPlusleLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_NUZZLE), + LEVEL_UP_MOVE( 1, MOVE_PLAY_NICE), LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 4, MOVE_THUNDER_WAVE), - LEVEL_UP_MOVE(10, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(13, MOVE_HELPING_HAND), - LEVEL_UP_MOVE(19, MOVE_SPARK), - LEVEL_UP_MOVE(22, MOVE_ENCORE), - LEVEL_UP_MOVE(28, MOVE_FAKE_TEARS), - LEVEL_UP_MOVE(31, MOVE_CHARGE), - LEVEL_UP_MOVE(37, MOVE_THUNDER), - LEVEL_UP_MOVE(40, MOVE_BATON_PASS), - LEVEL_UP_MOVE(47, MOVE_AGILITY), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 4, MOVE_HELPING_HAND), + LEVEL_UP_MOVE( 7, MOVE_SPARK), + LEVEL_UP_MOVE(10, MOVE_ENCORE), + LEVEL_UP_MOVE(13, MOVE_BESTOW), + LEVEL_UP_MOVE(16, MOVE_SWIFT), + LEVEL_UP_MOVE(19, MOVE_ELECTRO_BALL), + LEVEL_UP_MOVE(22, MOVE_COPYCAT), + LEVEL_UP_MOVE(25, MOVE_CHARM), + LEVEL_UP_MOVE(28, MOVE_CHARGE), + LEVEL_UP_MOVE(31, MOVE_DISCHARGE), + LEVEL_UP_MOVE(34, MOVE_BATON_PASS), + LEVEL_UP_MOVE(37, MOVE_AGILITY), + LEVEL_UP_MOVE(40, MOVE_LAST_RESORT), + LEVEL_UP_MOVE(43, MOVE_THUNDER), + LEVEL_UP_MOVE(46, MOVE_NASTY_PLOT), + LEVEL_UP_MOVE(49, MOVE_ENTRAINMENT), LEVEL_UP_END }; -static const u16 sMinunLevelUpLearnset[] = { +static const struct LevelUpMove sMinunLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_NUZZLE), + LEVEL_UP_MOVE( 1, MOVE_PLAY_NICE), LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 4, MOVE_THUNDER_WAVE), - LEVEL_UP_MOVE(10, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(13, MOVE_HELPING_HAND), - LEVEL_UP_MOVE(19, MOVE_SPARK), - LEVEL_UP_MOVE(22, MOVE_ENCORE), - LEVEL_UP_MOVE(28, MOVE_CHARM), - LEVEL_UP_MOVE(31, MOVE_CHARGE), - LEVEL_UP_MOVE(37, MOVE_THUNDER), - LEVEL_UP_MOVE(40, MOVE_BATON_PASS), - LEVEL_UP_MOVE(47, MOVE_AGILITY), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 4, MOVE_HELPING_HAND), + LEVEL_UP_MOVE( 7, MOVE_SPARK), + LEVEL_UP_MOVE(10, MOVE_ENCORE), + LEVEL_UP_MOVE(13, MOVE_SWITCHEROO), + LEVEL_UP_MOVE(16, MOVE_SWIFT), + LEVEL_UP_MOVE(19, MOVE_ELECTRO_BALL), + LEVEL_UP_MOVE(22, MOVE_COPYCAT), + LEVEL_UP_MOVE(25, MOVE_FAKE_TEARS), + LEVEL_UP_MOVE(28, MOVE_CHARGE), + LEVEL_UP_MOVE(31, MOVE_DISCHARGE), + LEVEL_UP_MOVE(34, MOVE_BATON_PASS), + LEVEL_UP_MOVE(37, MOVE_AGILITY), + LEVEL_UP_MOVE(40, MOVE_TRUMP_CARD), + LEVEL_UP_MOVE(43, MOVE_THUNDER), + LEVEL_UP_MOVE(46, MOVE_NASTY_PLOT), + LEVEL_UP_MOVE(49, MOVE_ENTRAINMENT), LEVEL_UP_END }; -static const u16 sMawileLevelUpLearnset[] = { +static const struct LevelUpMove sMawileLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_PLAY_ROUGH), + LEVEL_UP_MOVE( 1, MOVE_IRON_HEAD), + LEVEL_UP_MOVE( 1, MOVE_TAUNT), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_FAIRY_WIND), LEVEL_UP_MOVE( 1, MOVE_ASTONISH), - LEVEL_UP_MOVE( 6, MOVE_FAKE_TEARS), - LEVEL_UP_MOVE(11, MOVE_BITE), - LEVEL_UP_MOVE(16, MOVE_SWEET_SCENT), - LEVEL_UP_MOVE(21, MOVE_VICE_GRIP), - LEVEL_UP_MOVE(26, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE(31, MOVE_BATON_PASS), - LEVEL_UP_MOVE(36, MOVE_CRUNCH), - LEVEL_UP_MOVE(41, MOVE_IRON_DEFENSE), - LEVEL_UP_MOVE(46, MOVE_STOCKPILE), - LEVEL_UP_MOVE(46, MOVE_SWALLOW), - LEVEL_UP_MOVE(46, MOVE_SPIT_UP), + LEVEL_UP_MOVE( 5, MOVE_FAKE_TEARS), + LEVEL_UP_MOVE( 9, MOVE_BITE), + LEVEL_UP_MOVE(13, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE(17, MOVE_VICE_GRIP), + LEVEL_UP_MOVE(21, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(25, MOVE_BATON_PASS), + LEVEL_UP_MOVE(29, MOVE_CRUNCH), + LEVEL_UP_MOVE(33, MOVE_IRON_DEFENSE), + LEVEL_UP_MOVE(37, MOVE_SUCKER_PUNCH), + LEVEL_UP_MOVE(41, MOVE_STOCKPILE), + LEVEL_UP_MOVE(41, MOVE_SWALLOW), + LEVEL_UP_MOVE(41, MOVE_SPIT_UP), + LEVEL_UP_MOVE(45, MOVE_IRON_HEAD), + LEVEL_UP_MOVE(49, MOVE_PLAY_ROUGH), LEVEL_UP_END }; -static const u16 sMedititeLevelUpLearnset[] = { +static const struct LevelUpMove sMedititeLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_BIDE), LEVEL_UP_MOVE( 4, MOVE_MEDITATE), - LEVEL_UP_MOVE( 9, MOVE_CONFUSION), - LEVEL_UP_MOVE(12, MOVE_DETECT), - LEVEL_UP_MOVE(18, MOVE_HIDDEN_POWER), - LEVEL_UP_MOVE(22, MOVE_MIND_READER), - LEVEL_UP_MOVE(28, MOVE_CALM_MIND), - LEVEL_UP_MOVE(32, MOVE_HI_JUMP_KICK), - LEVEL_UP_MOVE(38, MOVE_PSYCH_UP), - LEVEL_UP_MOVE(42, MOVE_REVERSAL), - LEVEL_UP_MOVE(48, MOVE_RECOVER), + LEVEL_UP_MOVE( 7, MOVE_CONFUSION), + LEVEL_UP_MOVE( 9, MOVE_DETECT), + LEVEL_UP_MOVE(12, MOVE_ENDURE), + LEVEL_UP_MOVE(15, MOVE_FEINT), + LEVEL_UP_MOVE(17, MOVE_FORCE_PALM), + LEVEL_UP_MOVE(20, MOVE_HIDDEN_POWER), + LEVEL_UP_MOVE(23, MOVE_CALM_MIND), + LEVEL_UP_MOVE(25, MOVE_MIND_READER), + LEVEL_UP_MOVE(28, MOVE_HI_JUMP_KICK), + LEVEL_UP_MOVE(31, MOVE_PSYCH_UP), + LEVEL_UP_MOVE(33, MOVE_ACUPRESSURE), + LEVEL_UP_MOVE(36, MOVE_POWER_TRICK), + LEVEL_UP_MOVE(39, MOVE_REVERSAL), + LEVEL_UP_MOVE(41, MOVE_RECOVER), + LEVEL_UP_MOVE(44, MOVE_COUNTER), LEVEL_UP_END }; -static const u16 sMedichamLevelUpLearnset[] = { +static const struct LevelUpMove sMedichamLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ZEN_HEADBUTT), LEVEL_UP_MOVE( 1, MOVE_FIRE_PUNCH), LEVEL_UP_MOVE( 1, MOVE_THUNDER_PUNCH), LEVEL_UP_MOVE( 1, MOVE_ICE_PUNCH), @@ -4782,53 +6759,74 @@ static const u16 sMedichamLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_CONFUSION), LEVEL_UP_MOVE( 1, MOVE_DETECT), LEVEL_UP_MOVE( 4, MOVE_MEDITATE), - LEVEL_UP_MOVE( 9, MOVE_CONFUSION), - LEVEL_UP_MOVE(12, MOVE_DETECT), - LEVEL_UP_MOVE(18, MOVE_HIDDEN_POWER), - LEVEL_UP_MOVE(22, MOVE_MIND_READER), - LEVEL_UP_MOVE(28, MOVE_CALM_MIND), - LEVEL_UP_MOVE(32, MOVE_HI_JUMP_KICK), - LEVEL_UP_MOVE(40, MOVE_PSYCH_UP), - LEVEL_UP_MOVE(46, MOVE_REVERSAL), - LEVEL_UP_MOVE(54, MOVE_RECOVER), + LEVEL_UP_MOVE( 7, MOVE_CONFUSION), + LEVEL_UP_MOVE( 9, MOVE_DETECT), + LEVEL_UP_MOVE(12, MOVE_ENDURE), + LEVEL_UP_MOVE(15, MOVE_FEINT), + LEVEL_UP_MOVE(17, MOVE_FORCE_PALM), + LEVEL_UP_MOVE(20, MOVE_HIDDEN_POWER), + LEVEL_UP_MOVE(23, MOVE_CALM_MIND), + LEVEL_UP_MOVE(25, MOVE_MIND_READER), + LEVEL_UP_MOVE(28, MOVE_HI_JUMP_KICK), + LEVEL_UP_MOVE(31, MOVE_PSYCH_UP), + LEVEL_UP_MOVE(33, MOVE_ACUPRESSURE), + LEVEL_UP_MOVE(36, MOVE_POWER_TRICK), + LEVEL_UP_MOVE(42, MOVE_REVERSAL), + LEVEL_UP_MOVE(47, MOVE_RECOVER), + LEVEL_UP_MOVE(53, MOVE_COUNTER), LEVEL_UP_END }; -static const u16 sSwabluLevelUpLearnset[] = { +static const struct LevelUpMove sSwabluLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_PECK), LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 8, MOVE_ASTONISH), - LEVEL_UP_MOVE(11, MOVE_SING), - LEVEL_UP_MOVE(18, MOVE_FURY_ATTACK), - LEVEL_UP_MOVE(21, MOVE_SAFEGUARD), - LEVEL_UP_MOVE(28, MOVE_MIST), - LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(38, MOVE_MIRROR_MOVE), - LEVEL_UP_MOVE(41, MOVE_REFRESH), - LEVEL_UP_MOVE(48, MOVE_PERISH_SONG), + LEVEL_UP_MOVE( 3, MOVE_ASTONISH), + LEVEL_UP_MOVE( 5, MOVE_SING), + LEVEL_UP_MOVE( 7, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE( 9, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(11, MOVE_DISARMING_VOICE), + LEVEL_UP_MOVE(14, MOVE_MIST), + LEVEL_UP_MOVE(17, MOVE_ROUND), + LEVEL_UP_MOVE(20, MOVE_NATURAL_GIFT), + LEVEL_UP_MOVE(23, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(26, MOVE_REFRESH), + LEVEL_UP_MOVE(30, MOVE_MIRROR_MOVE), + LEVEL_UP_MOVE(34, MOVE_COTTON_GUARD), + LEVEL_UP_MOVE(38, MOVE_DRAGON_PULSE), + LEVEL_UP_MOVE(42, MOVE_PERISH_SONG), + LEVEL_UP_MOVE(46, MOVE_MOONBLAST), LEVEL_UP_END }; -static const u16 sAltariaLevelUpLearnset[] = { +static const struct LevelUpMove sAltariaLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_DRAGON_BREATH), + LEVEL_UP_MOVE( 1, MOVE_DRAGON_BREATH), + LEVEL_UP_MOVE( 1, MOVE_SKY_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_PLUCK), LEVEL_UP_MOVE( 1, MOVE_PECK), LEVEL_UP_MOVE( 1, MOVE_GROWL), LEVEL_UP_MOVE( 1, MOVE_ASTONISH), LEVEL_UP_MOVE( 1, MOVE_SING), - LEVEL_UP_MOVE( 8, MOVE_ASTONISH), - LEVEL_UP_MOVE(11, MOVE_SING), - LEVEL_UP_MOVE(18, MOVE_FURY_ATTACK), - LEVEL_UP_MOVE(21, MOVE_SAFEGUARD), - LEVEL_UP_MOVE(28, MOVE_MIST), - LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(35, MOVE_DRAGON_BREATH), - LEVEL_UP_MOVE(40, MOVE_DRAGON_DANCE), - LEVEL_UP_MOVE(45, MOVE_REFRESH), - LEVEL_UP_MOVE(54, MOVE_PERISH_SONG), + LEVEL_UP_MOVE( 3, MOVE_ASTONISH), + LEVEL_UP_MOVE( 5, MOVE_SING), + LEVEL_UP_MOVE( 7, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE( 9, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(11, MOVE_DISARMING_VOICE), + LEVEL_UP_MOVE(14, MOVE_MIST), + LEVEL_UP_MOVE(17, MOVE_ROUND), + LEVEL_UP_MOVE(20, MOVE_NATURAL_GIFT), + LEVEL_UP_MOVE(23, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(26, MOVE_REFRESH), + LEVEL_UP_MOVE(30, MOVE_DRAGON_DANCE), + LEVEL_UP_MOVE(34, MOVE_COTTON_GUARD), + LEVEL_UP_MOVE(40, MOVE_DRAGON_PULSE), + LEVEL_UP_MOVE(46, MOVE_PERISH_SONG), + LEVEL_UP_MOVE(52, MOVE_MOONBLAST), LEVEL_UP_MOVE(59, MOVE_SKY_ATTACK), LEVEL_UP_END }; -static const u16 sWynautLevelUpLearnset[] = { +static const struct LevelUpMove sWynautLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SPLASH), LEVEL_UP_MOVE( 1, MOVE_CHARM), LEVEL_UP_MOVE( 1, MOVE_ENCORE), @@ -4839,736 +6837,1010 @@ static const u16 sWynautLevelUpLearnset[] = { LEVEL_UP_END }; -static const u16 sDuskullLevelUpLearnset[] = { +static const struct LevelUpMove sDuskullLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_NIGHT_SHADE), - LEVEL_UP_MOVE( 5, MOVE_DISABLE), - LEVEL_UP_MOVE(12, MOVE_FORESIGHT), - LEVEL_UP_MOVE(16, MOVE_ASTONISH), - LEVEL_UP_MOVE(23, MOVE_CONFUSE_RAY), - LEVEL_UP_MOVE(27, MOVE_PURSUIT), - LEVEL_UP_MOVE(34, MOVE_CURSE), - LEVEL_UP_MOVE(38, MOVE_WILL_O_WISP), - LEVEL_UP_MOVE(45, MOVE_MEAN_LOOK), - LEVEL_UP_MOVE(49, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE( 6, MOVE_DISABLE), + LEVEL_UP_MOVE( 9, MOVE_ASTONISH), + LEVEL_UP_MOVE(14, MOVE_FORESIGHT), + LEVEL_UP_MOVE(17, MOVE_SHADOW_SNEAK), + LEVEL_UP_MOVE(22, MOVE_PURSUIT), + LEVEL_UP_MOVE(25, MOVE_WILL_O_WISP), + LEVEL_UP_MOVE(30, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(33, MOVE_CURSE), + LEVEL_UP_MOVE(38, MOVE_HEX), + LEVEL_UP_MOVE(41, MOVE_SHADOW_BALL), + LEVEL_UP_MOVE(46, MOVE_MEAN_LOOK), + LEVEL_UP_MOVE(49, MOVE_PAYBACK), + LEVEL_UP_MOVE(54, MOVE_FUTURE_SIGHT), LEVEL_UP_END }; -static const u16 sDusclopsLevelUpLearnset[] = { +static const struct LevelUpMove sDusclopsLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_SHADOW_PUNCH), + LEVEL_UP_MOVE( 1, MOVE_SHADOW_PUNCH), + LEVEL_UP_MOVE( 1, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE( 1, MOVE_FIRE_PUNCH), + LEVEL_UP_MOVE( 1, MOVE_ICE_PUNCH), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_PUNCH), + LEVEL_UP_MOVE( 1, MOVE_GRAVITY), LEVEL_UP_MOVE( 1, MOVE_BIND), LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_NIGHT_SHADE), LEVEL_UP_MOVE( 1, MOVE_DISABLE), - LEVEL_UP_MOVE( 5, MOVE_DISABLE), - LEVEL_UP_MOVE(12, MOVE_FORESIGHT), - LEVEL_UP_MOVE(16, MOVE_ASTONISH), - LEVEL_UP_MOVE(23, MOVE_CONFUSE_RAY), - LEVEL_UP_MOVE(27, MOVE_PURSUIT), - LEVEL_UP_MOVE(34, MOVE_CURSE), - LEVEL_UP_MOVE(37, MOVE_SHADOW_PUNCH), - LEVEL_UP_MOVE(41, MOVE_WILL_O_WISP), - LEVEL_UP_MOVE(51, MOVE_MEAN_LOOK), - LEVEL_UP_MOVE(58, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE( 1, MOVE_ASTONISH), + LEVEL_UP_MOVE( 6, MOVE_DISABLE), + LEVEL_UP_MOVE( 9, MOVE_ASTONISH), + LEVEL_UP_MOVE(14, MOVE_FORESIGHT), + LEVEL_UP_MOVE(17, MOVE_SHADOW_SNEAK), + LEVEL_UP_MOVE(22, MOVE_PURSUIT), + LEVEL_UP_MOVE(25, MOVE_WILL_O_WISP), + LEVEL_UP_MOVE(30, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(33, MOVE_CURSE), + LEVEL_UP_MOVE(40, MOVE_HEX), + LEVEL_UP_MOVE(45, MOVE_SHADOW_BALL), + LEVEL_UP_MOVE(52, MOVE_MEAN_LOOK), + LEVEL_UP_MOVE(57, MOVE_PAYBACK), + LEVEL_UP_MOVE(64, MOVE_FUTURE_SIGHT), LEVEL_UP_END }; -static const u16 sRoseliaLevelUpLearnset[] = { +static const struct LevelUpMove sRoseliaLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_ABSORB), - LEVEL_UP_MOVE( 5, MOVE_GROWTH), - LEVEL_UP_MOVE( 9, MOVE_POISON_STING), - LEVEL_UP_MOVE(13, MOVE_STUN_SPORE), - LEVEL_UP_MOVE(17, MOVE_MEGA_DRAIN), - LEVEL_UP_MOVE(21, MOVE_LEECH_SEED), - LEVEL_UP_MOVE(25, MOVE_MAGICAL_LEAF), - LEVEL_UP_MOVE(29, MOVE_GRASS_WHISTLE), - LEVEL_UP_MOVE(33, MOVE_GIGA_DRAIN), - LEVEL_UP_MOVE(37, MOVE_SWEET_SCENT), - LEVEL_UP_MOVE(41, MOVE_INGRAIN), - LEVEL_UP_MOVE(45, MOVE_TOXIC), - LEVEL_UP_MOVE(49, MOVE_PETAL_DANCE), - LEVEL_UP_MOVE(53, MOVE_AROMATHERAPY), - LEVEL_UP_MOVE(57, MOVE_SYNTHESIS), + LEVEL_UP_MOVE( 4, MOVE_GROWTH), + LEVEL_UP_MOVE( 7, MOVE_POISON_STING), + LEVEL_UP_MOVE(10, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(13, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(16, MOVE_LEECH_SEED), + LEVEL_UP_MOVE(19, MOVE_MAGICAL_LEAF), + LEVEL_UP_MOVE(22, MOVE_GRASS_WHISTLE), + LEVEL_UP_MOVE(25, MOVE_GIGA_DRAIN), + LEVEL_UP_MOVE(28, MOVE_TOXIC_SPIKES), + LEVEL_UP_MOVE(31, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE(34, MOVE_INGRAIN), + LEVEL_UP_MOVE(37, MOVE_PETAL_BLIZZARD), + LEVEL_UP_MOVE(40, MOVE_TOXIC), + LEVEL_UP_MOVE(43, MOVE_AROMATHERAPY), + LEVEL_UP_MOVE(46, MOVE_SYNTHESIS), + LEVEL_UP_MOVE(50, MOVE_PETAL_DANCE), LEVEL_UP_END }; -static const u16 sSlakothLevelUpLearnset[] = { +static const struct LevelUpMove sSlakothLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SCRATCH), LEVEL_UP_MOVE( 1, MOVE_YAWN), - LEVEL_UP_MOVE( 7, MOVE_ENCORE), - LEVEL_UP_MOVE(13, MOVE_SLACK_OFF), - LEVEL_UP_MOVE(19, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE(25, MOVE_AMNESIA), - LEVEL_UP_MOVE(31, MOVE_COVET), - LEVEL_UP_MOVE(37, MOVE_COUNTER), - LEVEL_UP_MOVE(43, MOVE_FLAIL), + LEVEL_UP_MOVE( 6, MOVE_ENCORE), + LEVEL_UP_MOVE( 9, MOVE_SLACK_OFF), + LEVEL_UP_MOVE(14, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(17, MOVE_AMNESIA), + LEVEL_UP_MOVE(22, MOVE_COVET), + LEVEL_UP_MOVE(25, MOVE_CHIP_AWAY), + LEVEL_UP_MOVE(30, MOVE_COUNTER), + LEVEL_UP_MOVE(33, MOVE_FLAIL), + LEVEL_UP_MOVE(38, MOVE_PLAY_ROUGH), LEVEL_UP_END }; -static const u16 sVigorothLevelUpLearnset[] = { +static const struct LevelUpMove sVigorothLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_REVERSAL), LEVEL_UP_MOVE( 1, MOVE_SCRATCH), LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), LEVEL_UP_MOVE( 1, MOVE_ENCORE), LEVEL_UP_MOVE( 1, MOVE_UPROAR), - LEVEL_UP_MOVE( 7, MOVE_ENCORE), - LEVEL_UP_MOVE(13, MOVE_UPROAR), - LEVEL_UP_MOVE(19, MOVE_FURY_SWIPES), - LEVEL_UP_MOVE(25, MOVE_ENDURE), - LEVEL_UP_MOVE(31, MOVE_SLASH), - LEVEL_UP_MOVE(37, MOVE_COUNTER), - LEVEL_UP_MOVE(43, MOVE_FOCUS_PUNCH), - LEVEL_UP_MOVE(49, MOVE_REVERSAL), + LEVEL_UP_MOVE( 6, MOVE_ENCORE), + LEVEL_UP_MOVE( 9, MOVE_UPROAR), + LEVEL_UP_MOVE(14, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(17, MOVE_ENDURE), + LEVEL_UP_MOVE(23, MOVE_SLASH), + LEVEL_UP_MOVE(27, MOVE_CHIP_AWAY), + LEVEL_UP_MOVE(33, MOVE_COUNTER), + LEVEL_UP_MOVE(37, MOVE_FOCUS_PUNCH), + LEVEL_UP_MOVE(43, MOVE_REVERSAL), LEVEL_UP_END }; -static const u16 sSlakingLevelUpLearnset[] = { +static const struct LevelUpMove sSlakingLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_SWAGGER), + LEVEL_UP_MOVE( 1, MOVE_SWAGGER), + LEVEL_UP_MOVE( 1, MOVE_HAMMER_ARM), + LEVEL_UP_MOVE( 1, MOVE_PUNISHMENT), + LEVEL_UP_MOVE( 1, MOVE_FLING), LEVEL_UP_MOVE( 1, MOVE_SCRATCH), LEVEL_UP_MOVE( 1, MOVE_YAWN), LEVEL_UP_MOVE( 1, MOVE_ENCORE), LEVEL_UP_MOVE( 1, MOVE_SLACK_OFF), - LEVEL_UP_MOVE( 7, MOVE_ENCORE), - LEVEL_UP_MOVE(13, MOVE_SLACK_OFF), - LEVEL_UP_MOVE(19, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE(25, MOVE_AMNESIA), - LEVEL_UP_MOVE(31, MOVE_COVET), - LEVEL_UP_MOVE(36, MOVE_SWAGGER), - LEVEL_UP_MOVE(37, MOVE_COUNTER), - LEVEL_UP_MOVE(43, MOVE_FLAIL), - LEVEL_UP_END -}; - -static const u16 sGulpinLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_POUND), - LEVEL_UP_MOVE( 6, MOVE_YAWN), - LEVEL_UP_MOVE( 9, MOVE_POISON_GAS), - LEVEL_UP_MOVE(14, MOVE_SLUDGE), + LEVEL_UP_MOVE( 6, MOVE_ENCORE), + LEVEL_UP_MOVE( 9, MOVE_SLACK_OFF), + LEVEL_UP_MOVE(14, MOVE_FAINT_ATTACK), LEVEL_UP_MOVE(17, MOVE_AMNESIA), - LEVEL_UP_MOVE(23, MOVE_ENCORE), - LEVEL_UP_MOVE(28, MOVE_TOXIC), - LEVEL_UP_MOVE(34, MOVE_STOCKPILE), - LEVEL_UP_MOVE(34, MOVE_SPIT_UP), - LEVEL_UP_MOVE(34, MOVE_SWALLOW), - LEVEL_UP_MOVE(39, MOVE_SLUDGE_BOMB), + LEVEL_UP_MOVE(23, MOVE_COVET), + LEVEL_UP_MOVE(27, MOVE_CHIP_AWAY), + LEVEL_UP_MOVE(33, MOVE_COUNTER), + LEVEL_UP_MOVE(39, MOVE_FLAIL), + LEVEL_UP_MOVE(47, MOVE_FLING), + LEVEL_UP_MOVE(53, MOVE_PUNISHMENT), + LEVEL_UP_MOVE(61, MOVE_HAMMER_ARM), LEVEL_UP_END }; -static const u16 sSwalotLevelUpLearnset[] = { +static const struct LevelUpMove sGulpinLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 5, MOVE_YAWN), + LEVEL_UP_MOVE( 8, MOVE_POISON_GAS), + LEVEL_UP_MOVE(10, MOVE_SLUDGE), + LEVEL_UP_MOVE(12, MOVE_AMNESIA), + LEVEL_UP_MOVE(17, MOVE_ACID_SPRAY), + LEVEL_UP_MOVE(20, MOVE_ENCORE), + LEVEL_UP_MOVE(25, MOVE_TOXIC), + LEVEL_UP_MOVE(28, MOVE_STOCKPILE), + LEVEL_UP_MOVE(28, MOVE_SPIT_UP), + LEVEL_UP_MOVE(28, MOVE_SWALLOW), + LEVEL_UP_MOVE(33, MOVE_SLUDGE_BOMB), + LEVEL_UP_MOVE(36, MOVE_GASTRO_ACID), + LEVEL_UP_MOVE(41, MOVE_BELCH), + LEVEL_UP_MOVE(44, MOVE_WRING_OUT), + LEVEL_UP_MOVE(49, MOVE_GUNK_SHOT), + LEVEL_UP_END +}; + +static const struct LevelUpMove sSwalotLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_BODY_SLAM), + LEVEL_UP_MOVE( 1, MOVE_BODY_SLAM), + LEVEL_UP_MOVE( 1, MOVE_VENOM_DRENCH), + LEVEL_UP_MOVE( 1, MOVE_GUNK_SHOT), + LEVEL_UP_MOVE( 1, MOVE_WRING_OUT), LEVEL_UP_MOVE( 1, MOVE_POUND), LEVEL_UP_MOVE( 1, MOVE_YAWN), LEVEL_UP_MOVE( 1, MOVE_POISON_GAS), LEVEL_UP_MOVE( 1, MOVE_SLUDGE), - LEVEL_UP_MOVE( 6, MOVE_YAWN), - LEVEL_UP_MOVE( 9, MOVE_POISON_GAS), - LEVEL_UP_MOVE(14, MOVE_SLUDGE), - LEVEL_UP_MOVE(17, MOVE_AMNESIA), - LEVEL_UP_MOVE(23, MOVE_ENCORE), - LEVEL_UP_MOVE(26, MOVE_BODY_SLAM), - LEVEL_UP_MOVE(31, MOVE_TOXIC), - LEVEL_UP_MOVE(40, MOVE_STOCKPILE), - LEVEL_UP_MOVE(40, MOVE_SPIT_UP), - LEVEL_UP_MOVE(40, MOVE_SWALLOW), - LEVEL_UP_MOVE(48, MOVE_SLUDGE_BOMB), + LEVEL_UP_MOVE( 5, MOVE_YAWN), + LEVEL_UP_MOVE( 8, MOVE_POISON_GAS), + LEVEL_UP_MOVE(10, MOVE_SLUDGE), + LEVEL_UP_MOVE(12, MOVE_AMNESIA), + LEVEL_UP_MOVE(17, MOVE_ACID_SPRAY), + LEVEL_UP_MOVE(20, MOVE_ENCORE), + LEVEL_UP_MOVE(25, MOVE_TOXIC), + LEVEL_UP_MOVE(30, MOVE_STOCKPILE), + LEVEL_UP_MOVE(30, MOVE_SPIT_UP), + LEVEL_UP_MOVE(30, MOVE_SWALLOW), + LEVEL_UP_MOVE(37, MOVE_SLUDGE_BOMB), + LEVEL_UP_MOVE(42, MOVE_GASTRO_ACID), + LEVEL_UP_MOVE(49, MOVE_BELCH), + LEVEL_UP_MOVE(54, MOVE_WRING_OUT), + LEVEL_UP_MOVE(61, MOVE_GUNK_SHOT), LEVEL_UP_END }; -static const u16 sTropiusLevelUpLearnset[] = { +static const struct LevelUpMove sTropiusLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_LEAF_STORM), LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_GUST), - LEVEL_UP_MOVE( 7, MOVE_GROWTH), - LEVEL_UP_MOVE(11, MOVE_RAZOR_LEAF), - LEVEL_UP_MOVE(17, MOVE_STOMP), - LEVEL_UP_MOVE(21, MOVE_SWEET_SCENT), - LEVEL_UP_MOVE(27, MOVE_WHIRLWIND), - LEVEL_UP_MOVE(31, MOVE_MAGICAL_LEAF), - LEVEL_UP_MOVE(37, MOVE_BODY_SLAM), - LEVEL_UP_MOVE(41, MOVE_SOLAR_BEAM), - LEVEL_UP_MOVE(47, MOVE_SYNTHESIS), + LEVEL_UP_MOVE( 1, MOVE_GROWTH), + LEVEL_UP_MOVE( 1, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE( 6, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE(10, MOVE_STOMP), + LEVEL_UP_MOVE(16, MOVE_MAGICAL_LEAF), + LEVEL_UP_MOVE(21, MOVE_WHIRLWIND), + LEVEL_UP_MOVE(26, MOVE_LEAF_TORNADO), + LEVEL_UP_MOVE(30, MOVE_NATURAL_GIFT), + LEVEL_UP_MOVE(36, MOVE_AIR_SLASH), + LEVEL_UP_MOVE(41, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(46, MOVE_BESTOW), + LEVEL_UP_MOVE(50, MOVE_SYNTHESIS), + LEVEL_UP_MOVE(56, MOVE_SOLAR_BEAM), + LEVEL_UP_MOVE(61, MOVE_LEAF_STORM), LEVEL_UP_END }; -static const u16 sWhismurLevelUpLearnset[] = { +static const struct LevelUpMove sWhismurLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_POUND), - LEVEL_UP_MOVE( 5, MOVE_UPROAR), - LEVEL_UP_MOVE(11, MOVE_ASTONISH), - LEVEL_UP_MOVE(15, MOVE_HOWL), - LEVEL_UP_MOVE(21, MOVE_SUPERSONIC), - LEVEL_UP_MOVE(25, MOVE_STOMP), - LEVEL_UP_MOVE(31, MOVE_SCREECH), - LEVEL_UP_MOVE(35, MOVE_ROAR), - LEVEL_UP_MOVE(41, MOVE_REST), + LEVEL_UP_MOVE( 4, MOVE_ECHOED_VOICE), + LEVEL_UP_MOVE( 8, MOVE_ASTONISH), + LEVEL_UP_MOVE(11, MOVE_HOWL), + LEVEL_UP_MOVE(15, MOVE_SCREECH), + LEVEL_UP_MOVE(18, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(22, MOVE_STOMP), + LEVEL_UP_MOVE(25, MOVE_UPROAR), + LEVEL_UP_MOVE(29, MOVE_ROAR), + LEVEL_UP_MOVE(32, MOVE_REST), + LEVEL_UP_MOVE(36, MOVE_SLEEP_TALK), + LEVEL_UP_MOVE(39, MOVE_HYPER_VOICE), + LEVEL_UP_MOVE(43, MOVE_SYNCHRONOISE), + LEVEL_UP_END +}; + +static const struct LevelUpMove sLoudredLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_BITE), + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 1, MOVE_ECHOED_VOICE), + LEVEL_UP_MOVE( 1, MOVE_ASTONISH), + LEVEL_UP_MOVE( 1, MOVE_HOWL), + LEVEL_UP_MOVE( 4, MOVE_ECHOED_VOICE), + LEVEL_UP_MOVE( 9, MOVE_ASTONISH), + LEVEL_UP_MOVE(11, MOVE_HOWL), + LEVEL_UP_MOVE(15, MOVE_SCREECH), + LEVEL_UP_MOVE(18, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(23, MOVE_STOMP), + LEVEL_UP_MOVE(27, MOVE_UPROAR), + LEVEL_UP_MOVE(32, MOVE_ROAR), + LEVEL_UP_MOVE(36, MOVE_REST), LEVEL_UP_MOVE(41, MOVE_SLEEP_TALK), LEVEL_UP_MOVE(45, MOVE_HYPER_VOICE), + LEVEL_UP_MOVE(50, MOVE_SYNCHRONOISE), LEVEL_UP_END }; -static const u16 sLoudredLevelUpLearnset[] = { +static const struct LevelUpMove sExploudLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_CRUNCH), + LEVEL_UP_MOVE( 1, MOVE_CRUNCH), + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 1, MOVE_BOOMBURST), + LEVEL_UP_MOVE( 1, MOVE_ICE_FANG), + LEVEL_UP_MOVE( 1, MOVE_FIRE_FANG), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_FANG), LEVEL_UP_MOVE( 1, MOVE_POUND), - LEVEL_UP_MOVE( 1, MOVE_UPROAR), + LEVEL_UP_MOVE( 1, MOVE_ECHOED_VOICE), LEVEL_UP_MOVE( 1, MOVE_ASTONISH), LEVEL_UP_MOVE( 1, MOVE_HOWL), - LEVEL_UP_MOVE( 5, MOVE_UPROAR), - LEVEL_UP_MOVE(11, MOVE_ASTONISH), - LEVEL_UP_MOVE(15, MOVE_HOWL), - LEVEL_UP_MOVE(23, MOVE_SUPERSONIC), - LEVEL_UP_MOVE(29, MOVE_STOMP), - LEVEL_UP_MOVE(37, MOVE_SCREECH), - LEVEL_UP_MOVE(43, MOVE_ROAR), - LEVEL_UP_MOVE(51, MOVE_REST), - LEVEL_UP_MOVE(51, MOVE_SLEEP_TALK), - LEVEL_UP_MOVE(57, MOVE_HYPER_VOICE), + LEVEL_UP_MOVE( 4, MOVE_ECHOED_VOICE), + LEVEL_UP_MOVE( 9, MOVE_ASTONISH), + LEVEL_UP_MOVE(11, MOVE_HOWL), + LEVEL_UP_MOVE(15, MOVE_SCREECH), + LEVEL_UP_MOVE(18, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(23, MOVE_STOMP), + LEVEL_UP_MOVE(27, MOVE_UPROAR), + LEVEL_UP_MOVE(32, MOVE_ROAR), + LEVEL_UP_MOVE(36, MOVE_REST), + LEVEL_UP_MOVE(42, MOVE_SLEEP_TALK), + LEVEL_UP_MOVE(47, MOVE_HYPER_VOICE), + LEVEL_UP_MOVE(53, MOVE_SYNCHRONOISE), + LEVEL_UP_MOVE(58, MOVE_BOOMBURST), + LEVEL_UP_MOVE(64, MOVE_HYPER_BEAM), LEVEL_UP_END }; -static const u16 sExploudLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_POUND), - LEVEL_UP_MOVE( 1, MOVE_UPROAR), - LEVEL_UP_MOVE( 1, MOVE_ASTONISH), - LEVEL_UP_MOVE( 1, MOVE_HOWL), - LEVEL_UP_MOVE( 5, MOVE_UPROAR), - LEVEL_UP_MOVE(11, MOVE_ASTONISH), - LEVEL_UP_MOVE(15, MOVE_HOWL), - LEVEL_UP_MOVE(23, MOVE_SUPERSONIC), - LEVEL_UP_MOVE(29, MOVE_STOMP), - LEVEL_UP_MOVE(37, MOVE_SCREECH), - LEVEL_UP_MOVE(40, MOVE_HYPER_BEAM), - LEVEL_UP_MOVE(45, MOVE_ROAR), - LEVEL_UP_MOVE(55, MOVE_REST), - LEVEL_UP_MOVE(55, MOVE_SLEEP_TALK), - LEVEL_UP_MOVE(63, MOVE_HYPER_VOICE), - LEVEL_UP_END -}; - -static const u16 sClamperlLevelUpLearnset[] = { +static const struct LevelUpMove sClamperlLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_CLAMP), LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), LEVEL_UP_MOVE( 1, MOVE_WHIRLPOOL), LEVEL_UP_MOVE( 1, MOVE_IRON_DEFENSE), + LEVEL_UP_MOVE(50, MOVE_SHELL_SMASH), LEVEL_UP_END }; -static const u16 sHuntailLevelUpLearnset[] = { +static const struct LevelUpMove sHuntailLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_WHIRLPOOL), - LEVEL_UP_MOVE( 8, MOVE_BITE), - LEVEL_UP_MOVE(15, MOVE_SCREECH), - LEVEL_UP_MOVE(22, MOVE_WATER_PULSE), - LEVEL_UP_MOVE(29, MOVE_SCARY_FACE), - LEVEL_UP_MOVE(36, MOVE_CRUNCH), - LEVEL_UP_MOVE(43, MOVE_BATON_PASS), + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 5, MOVE_SCREECH), + LEVEL_UP_MOVE( 9, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(11, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(14, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(16, MOVE_ICE_FANG), + LEVEL_UP_MOVE(19, MOVE_BRINE), + LEVEL_UP_MOVE(23, MOVE_SUCKER_PUNCH), + LEVEL_UP_MOVE(26, MOVE_DIVE), + LEVEL_UP_MOVE(29, MOVE_BATON_PASS), + LEVEL_UP_MOVE(34, MOVE_CRUNCH), + LEVEL_UP_MOVE(39, MOVE_AQUA_TAIL), + LEVEL_UP_MOVE(45, MOVE_COIL), LEVEL_UP_MOVE(50, MOVE_HYDRO_PUMP), LEVEL_UP_END }; -static const u16 sGorebyssLevelUpLearnset[] = { +static const struct LevelUpMove sGorebyssLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_WHIRLPOOL), - LEVEL_UP_MOVE( 8, MOVE_CONFUSION), - LEVEL_UP_MOVE(15, MOVE_AGILITY), - LEVEL_UP_MOVE(22, MOVE_WATER_PULSE), - LEVEL_UP_MOVE(29, MOVE_AMNESIA), - LEVEL_UP_MOVE(36, MOVE_PSYCHIC), - LEVEL_UP_MOVE(43, MOVE_BATON_PASS), + LEVEL_UP_MOVE( 1, MOVE_CONFUSION), + LEVEL_UP_MOVE( 5, MOVE_WATER_SPORT), + LEVEL_UP_MOVE( 9, MOVE_AGILITY), + LEVEL_UP_MOVE(11, MOVE_DRAINING_KISS), + LEVEL_UP_MOVE(14, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(16, MOVE_AMNESIA), + LEVEL_UP_MOVE(19, MOVE_AQUA_RING), + LEVEL_UP_MOVE(23, MOVE_CAPTIVATE), + LEVEL_UP_MOVE(26, MOVE_DIVE), + LEVEL_UP_MOVE(29, MOVE_BATON_PASS), + LEVEL_UP_MOVE(34, MOVE_PSYCHIC), + LEVEL_UP_MOVE(39, MOVE_AQUA_TAIL), + LEVEL_UP_MOVE(45, MOVE_COIL), LEVEL_UP_MOVE(50, MOVE_HYDRO_PUMP), LEVEL_UP_END }; -static const u16 sAbsolLevelUpLearnset[] = { +static const struct LevelUpMove sAbsolLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_PERISH_SONG), + LEVEL_UP_MOVE( 1, MOVE_FUTURE_SIGHT), LEVEL_UP_MOVE( 1, MOVE_SCRATCH), - LEVEL_UP_MOVE( 5, MOVE_LEER), - LEVEL_UP_MOVE( 9, MOVE_TAUNT), - LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(17, MOVE_RAZOR_WIND), - LEVEL_UP_MOVE(21, MOVE_BITE), - LEVEL_UP_MOVE(26, MOVE_SWORDS_DANCE), - LEVEL_UP_MOVE(31, MOVE_DOUBLE_TEAM), - LEVEL_UP_MOVE(36, MOVE_SLASH), - LEVEL_UP_MOVE(41, MOVE_FUTURE_SIGHT), - LEVEL_UP_MOVE(46, MOVE_PERISH_SONG), + LEVEL_UP_MOVE( 1, MOVE_FEINT), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 4, MOVE_LEER), + LEVEL_UP_MOVE( 7, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(10, MOVE_PURSUIT), + LEVEL_UP_MOVE(13, MOVE_TAUNT), + LEVEL_UP_MOVE(16, MOVE_BITE), + LEVEL_UP_MOVE(19, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE(22, MOVE_SLASH), + LEVEL_UP_MOVE(25, MOVE_SWORDS_DANCE), + LEVEL_UP_MOVE(29, MOVE_NIGHT_SLASH), + LEVEL_UP_MOVE(33, MOVE_DETECT), + LEVEL_UP_MOVE(37, MOVE_PSYCHO_CUT), + LEVEL_UP_MOVE(41, MOVE_ME_FIRST), + LEVEL_UP_MOVE(45, MOVE_SUCKER_PUNCH), + LEVEL_UP_MOVE(49, MOVE_RAZOR_WIND), + LEVEL_UP_MOVE(53, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(57, MOVE_PERISH_SONG), LEVEL_UP_END }; -static const u16 sShuppetLevelUpLearnset[] = { +static const struct LevelUpMove sShuppetLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_KNOCK_OFF), - LEVEL_UP_MOVE( 8, MOVE_SCREECH), - LEVEL_UP_MOVE(13, MOVE_NIGHT_SHADE), - LEVEL_UP_MOVE(20, MOVE_CURSE), - LEVEL_UP_MOVE(25, MOVE_SPITE), - LEVEL_UP_MOVE(32, MOVE_WILL_O_WISP), - LEVEL_UP_MOVE(37, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE(44, MOVE_SHADOW_BALL), - LEVEL_UP_MOVE(49, MOVE_SNATCH), - LEVEL_UP_MOVE(56, MOVE_GRUDGE), + LEVEL_UP_MOVE( 4, MOVE_SCREECH), + LEVEL_UP_MOVE( 7, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE(10, MOVE_SPITE), + LEVEL_UP_MOVE(13, MOVE_SHADOW_SNEAK), + LEVEL_UP_MOVE(16, MOVE_WILL_O_WISP), + LEVEL_UP_MOVE(19, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(22, MOVE_HEX), + LEVEL_UP_MOVE(26, MOVE_CURSE), + LEVEL_UP_MOVE(30, MOVE_SHADOW_BALL), + LEVEL_UP_MOVE(34, MOVE_EMBARGO), + LEVEL_UP_MOVE(38, MOVE_SUCKER_PUNCH), + LEVEL_UP_MOVE(42, MOVE_SNATCH), + LEVEL_UP_MOVE(46, MOVE_GRUDGE), + LEVEL_UP_MOVE(50, MOVE_TRICK), + LEVEL_UP_MOVE(54, MOVE_PHANTOM_FORCE), LEVEL_UP_END }; -static const u16 sBanetteLevelUpLearnset[] = { +static const struct LevelUpMove sBanetteLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_PHANTOM_FORCE), LEVEL_UP_MOVE( 1, MOVE_KNOCK_OFF), LEVEL_UP_MOVE( 1, MOVE_SCREECH), LEVEL_UP_MOVE( 1, MOVE_NIGHT_SHADE), - LEVEL_UP_MOVE( 1, MOVE_CURSE), - LEVEL_UP_MOVE( 8, MOVE_SCREECH), - LEVEL_UP_MOVE(13, MOVE_NIGHT_SHADE), - LEVEL_UP_MOVE(20, MOVE_CURSE), - LEVEL_UP_MOVE(25, MOVE_SPITE), - LEVEL_UP_MOVE(32, MOVE_WILL_O_WISP), - LEVEL_UP_MOVE(39, MOVE_FAINT_ATTACK), - LEVEL_UP_MOVE(48, MOVE_SHADOW_BALL), - LEVEL_UP_MOVE(55, MOVE_SNATCH), - LEVEL_UP_MOVE(64, MOVE_GRUDGE), + LEVEL_UP_MOVE( 1, MOVE_SPITE), + LEVEL_UP_MOVE( 4, MOVE_SCREECH), + LEVEL_UP_MOVE( 7, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE(10, MOVE_SPITE), + LEVEL_UP_MOVE(13, MOVE_SHADOW_SNEAK), + LEVEL_UP_MOVE(16, MOVE_WILL_O_WISP), + LEVEL_UP_MOVE(19, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(22, MOVE_HEX), + LEVEL_UP_MOVE(26, MOVE_CURSE), + LEVEL_UP_MOVE(30, MOVE_SHADOW_BALL), + LEVEL_UP_MOVE(34, MOVE_EMBARGO), + LEVEL_UP_MOVE(40, MOVE_SUCKER_PUNCH), + LEVEL_UP_MOVE(46, MOVE_SNATCH), + LEVEL_UP_MOVE(52, MOVE_GRUDGE), + LEVEL_UP_MOVE(58, MOVE_TRICK), + LEVEL_UP_MOVE(64, MOVE_PHANTOM_FORCE), LEVEL_UP_END }; -static const u16 sSeviperLevelUpLearnset[] = { +static const struct LevelUpMove sSeviperLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_WRAP), - LEVEL_UP_MOVE( 7, MOVE_LICK), - LEVEL_UP_MOVE(10, MOVE_BITE), - LEVEL_UP_MOVE(16, MOVE_POISON_TAIL), - LEVEL_UP_MOVE(19, MOVE_SCREECH), - LEVEL_UP_MOVE(25, MOVE_GLARE), - LEVEL_UP_MOVE(28, MOVE_CRUNCH), - LEVEL_UP_MOVE(34, MOVE_POISON_FANG), - LEVEL_UP_MOVE(37, MOVE_SWAGGER), - LEVEL_UP_MOVE(43, MOVE_HAZE), + LEVEL_UP_MOVE( 1, MOVE_SWAGGER), + LEVEL_UP_MOVE( 4, MOVE_BITE), + LEVEL_UP_MOVE( 6, MOVE_LICK), + LEVEL_UP_MOVE( 9, MOVE_POISON_TAIL), + LEVEL_UP_MOVE(11, MOVE_FEINT), + LEVEL_UP_MOVE(14, MOVE_SCREECH), + LEVEL_UP_MOVE(16, MOVE_VENOSHOCK), + LEVEL_UP_MOVE(19, MOVE_GLARE), + LEVEL_UP_MOVE(21, MOVE_POISON_FANG), + LEVEL_UP_MOVE(24, MOVE_VENOM_DRENCH), + LEVEL_UP_MOVE(26, MOVE_NIGHT_SLASH), + LEVEL_UP_MOVE(29, MOVE_GASTRO_ACID), + LEVEL_UP_MOVE(31, MOVE_POISON_JAB), + LEVEL_UP_MOVE(34, MOVE_HAZE), + LEVEL_UP_MOVE(36, MOVE_SWORDS_DANCE), + LEVEL_UP_MOVE(39, MOVE_CRUNCH), + LEVEL_UP_MOVE(41, MOVE_BELCH), + LEVEL_UP_MOVE(44, MOVE_COIL), + LEVEL_UP_MOVE(46, MOVE_WRING_OUT), LEVEL_UP_END }; -static const u16 sZangooseLevelUpLearnset[] = { +static const struct LevelUpMove sZangooseLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SCRATCH), - LEVEL_UP_MOVE( 4, MOVE_LEER), - LEVEL_UP_MOVE( 7, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(10, MOVE_SWORDS_DANCE), - LEVEL_UP_MOVE(13, MOVE_FURY_CUTTER), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 5, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 8, MOVE_FURY_CUTTER), + LEVEL_UP_MOVE(12, MOVE_PURSUIT), + LEVEL_UP_MOVE(15, MOVE_HONE_CLAWS), LEVEL_UP_MOVE(19, MOVE_SLASH), - LEVEL_UP_MOVE(25, MOVE_PURSUIT), - LEVEL_UP_MOVE(31, MOVE_CRUSH_CLAW), - LEVEL_UP_MOVE(37, MOVE_TAUNT), - LEVEL_UP_MOVE(46, MOVE_DETECT), - LEVEL_UP_MOVE(55, MOVE_FALSE_SWIPE), + LEVEL_UP_MOVE(22, MOVE_REVENGE), + LEVEL_UP_MOVE(26, MOVE_CRUSH_CLAW), + LEVEL_UP_MOVE(29, MOVE_FALSE_SWIPE), + LEVEL_UP_MOVE(33, MOVE_EMBARGO), + LEVEL_UP_MOVE(36, MOVE_DETECT), + LEVEL_UP_MOVE(40, MOVE_X_SCISSOR), + LEVEL_UP_MOVE(43, MOVE_TAUNT), + LEVEL_UP_MOVE(47, MOVE_SWORDS_DANCE), + LEVEL_UP_MOVE(50, MOVE_CLOSE_COMBAT), LEVEL_UP_END }; -static const u16 sRelicanthLevelUpLearnset[] = { +static const struct LevelUpMove sRelicanthLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_FLAIL), + LEVEL_UP_MOVE( 1, MOVE_HEAD_SMASH), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_HARDEN), - LEVEL_UP_MOVE( 8, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 1, MOVE_MUD_SPORT), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 6, MOVE_MUD_SPORT), + LEVEL_UP_MOVE(10, MOVE_WATER_GUN), LEVEL_UP_MOVE(15, MOVE_ROCK_TOMB), - LEVEL_UP_MOVE(22, MOVE_YAWN), - LEVEL_UP_MOVE(29, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(36, MOVE_MUD_SPORT), - LEVEL_UP_MOVE(43, MOVE_ANCIENT_POWER), - LEVEL_UP_MOVE(50, MOVE_REST), - LEVEL_UP_MOVE(57, MOVE_DOUBLE_EDGE), - LEVEL_UP_MOVE(64, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(21, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(26, MOVE_DIVE), + LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(35, MOVE_YAWN), + LEVEL_UP_MOVE(41, MOVE_REST), + LEVEL_UP_MOVE(46, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(50, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(56, MOVE_HEAD_SMASH), LEVEL_UP_END }; -static const u16 sAronLevelUpLearnset[] = { +static const struct LevelUpMove sAronLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 4, MOVE_HARDEN), - LEVEL_UP_MOVE( 7, MOVE_MUD_SLAP), - LEVEL_UP_MOVE(10, MOVE_HEADBUTT), - LEVEL_UP_MOVE(13, MOVE_METAL_CLAW), - LEVEL_UP_MOVE(17, MOVE_IRON_DEFENSE), - LEVEL_UP_MOVE(21, MOVE_ROAR), - LEVEL_UP_MOVE(25, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(29, MOVE_IRON_TAIL), - LEVEL_UP_MOVE(34, MOVE_PROTECT), - LEVEL_UP_MOVE(39, MOVE_METAL_SOUND), - LEVEL_UP_MOVE(44, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 4, MOVE_MUD_SLAP), + LEVEL_UP_MOVE( 7, MOVE_HEADBUTT), + LEVEL_UP_MOVE(10, MOVE_METAL_CLAW), + LEVEL_UP_MOVE(13, MOVE_ROCK_TOMB), + LEVEL_UP_MOVE(16, MOVE_PROTECT), + LEVEL_UP_MOVE(19, MOVE_ROAR), + LEVEL_UP_MOVE(22, MOVE_IRON_HEAD), + LEVEL_UP_MOVE(25, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(28, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(31, MOVE_METAL_SOUND), + LEVEL_UP_MOVE(34, MOVE_IRON_TAIL), + LEVEL_UP_MOVE(37, MOVE_IRON_DEFENSE), + LEVEL_UP_MOVE(40, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(43, MOVE_AUTOTOMIZE), + LEVEL_UP_MOVE(46, MOVE_HEAVY_SLAM), + LEVEL_UP_MOVE(49, MOVE_METAL_BURST), LEVEL_UP_END }; -static const u16 sLaironLevelUpLearnset[] = { +static const struct LevelUpMove sLaironLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_HARDEN), LEVEL_UP_MOVE( 1, MOVE_MUD_SLAP), LEVEL_UP_MOVE( 1, MOVE_HEADBUTT), - LEVEL_UP_MOVE( 4, MOVE_HARDEN), - LEVEL_UP_MOVE( 7, MOVE_MUD_SLAP), - LEVEL_UP_MOVE(10, MOVE_HEADBUTT), - LEVEL_UP_MOVE(13, MOVE_METAL_CLAW), - LEVEL_UP_MOVE(17, MOVE_IRON_DEFENSE), - LEVEL_UP_MOVE(21, MOVE_ROAR), - LEVEL_UP_MOVE(25, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(29, MOVE_IRON_TAIL), - LEVEL_UP_MOVE(37, MOVE_PROTECT), - LEVEL_UP_MOVE(45, MOVE_METAL_SOUND), - LEVEL_UP_MOVE(53, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE( 4, MOVE_MUD_SLAP), + LEVEL_UP_MOVE( 7, MOVE_HEADBUTT), + LEVEL_UP_MOVE(10, MOVE_METAL_CLAW), + LEVEL_UP_MOVE(13, MOVE_ROCK_TOMB), + LEVEL_UP_MOVE(16, MOVE_PROTECT), + LEVEL_UP_MOVE(19, MOVE_ROAR), + LEVEL_UP_MOVE(22, MOVE_IRON_HEAD), + LEVEL_UP_MOVE(25, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(28, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(31, MOVE_METAL_SOUND), + LEVEL_UP_MOVE(35, MOVE_IRON_TAIL), + LEVEL_UP_MOVE(39, MOVE_IRON_DEFENSE), + LEVEL_UP_MOVE(43, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(47, MOVE_AUTOTOMIZE), + LEVEL_UP_MOVE(51, MOVE_HEAVY_SLAM), + LEVEL_UP_MOVE(55, MOVE_METAL_BURST), LEVEL_UP_END }; -static const u16 sAggronLevelUpLearnset[] = { +static const struct LevelUpMove sAggronLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 1, MOVE_HARDEN), LEVEL_UP_MOVE( 1, MOVE_MUD_SLAP), LEVEL_UP_MOVE( 1, MOVE_HEADBUTT), - LEVEL_UP_MOVE( 4, MOVE_HARDEN), - LEVEL_UP_MOVE( 7, MOVE_MUD_SLAP), - LEVEL_UP_MOVE(10, MOVE_HEADBUTT), - LEVEL_UP_MOVE(13, MOVE_METAL_CLAW), - LEVEL_UP_MOVE(17, MOVE_IRON_DEFENSE), - LEVEL_UP_MOVE(21, MOVE_ROAR), - LEVEL_UP_MOVE(25, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(29, MOVE_IRON_TAIL), - LEVEL_UP_MOVE(37, MOVE_PROTECT), - LEVEL_UP_MOVE(50, MOVE_METAL_SOUND), - LEVEL_UP_MOVE(63, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE( 4, MOVE_MUD_SLAP), + LEVEL_UP_MOVE( 7, MOVE_HEADBUTT), + LEVEL_UP_MOVE(10, MOVE_METAL_CLAW), + LEVEL_UP_MOVE(13, MOVE_ROCK_TOMB), + LEVEL_UP_MOVE(16, MOVE_PROTECT), + LEVEL_UP_MOVE(19, MOVE_ROAR), + LEVEL_UP_MOVE(22, MOVE_IRON_HEAD), + LEVEL_UP_MOVE(25, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(28, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(31, MOVE_METAL_SOUND), + LEVEL_UP_MOVE(35, MOVE_IRON_TAIL), + LEVEL_UP_MOVE(39, MOVE_IRON_DEFENSE), + LEVEL_UP_MOVE(45, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(51, MOVE_AUTOTOMIZE), + LEVEL_UP_MOVE(57, MOVE_HEAVY_SLAM), + LEVEL_UP_MOVE(63, MOVE_METAL_BURST), LEVEL_UP_END }; -static const u16 sCastformLevelUpLearnset[] = { +static const struct LevelUpMove sCastformLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE(10, MOVE_WATER_GUN), LEVEL_UP_MOVE(10, MOVE_EMBER), LEVEL_UP_MOVE(10, MOVE_POWDER_SNOW), + LEVEL_UP_MOVE(15, MOVE_HEADBUTT), LEVEL_UP_MOVE(20, MOVE_RAIN_DANCE), LEVEL_UP_MOVE(20, MOVE_SUNNY_DAY), LEVEL_UP_MOVE(20, MOVE_HAIL), - LEVEL_UP_MOVE(30, MOVE_WEATHER_BALL), + LEVEL_UP_MOVE(25, MOVE_WEATHER_BALL), + LEVEL_UP_MOVE(35, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(35, MOVE_FIRE_BLAST), + LEVEL_UP_MOVE(35, MOVE_BLIZZARD), + LEVEL_UP_MOVE(45, MOVE_HURRICANE), LEVEL_UP_END }; -static const u16 sVolbeatLevelUpLearnset[] = { +static const struct LevelUpMove sVolbeatLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_FLASH), LEVEL_UP_MOVE( 1, MOVE_TACKLE), - LEVEL_UP_MOVE( 5, MOVE_CONFUSE_RAY), - LEVEL_UP_MOVE( 9, MOVE_DOUBLE_TEAM), - LEVEL_UP_MOVE(13, MOVE_MOONLIGHT), - LEVEL_UP_MOVE(17, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(21, MOVE_TAIL_GLOW), - LEVEL_UP_MOVE(25, MOVE_SIGNAL_BEAM), + LEVEL_UP_MOVE( 5, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE( 8, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(12, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(15, MOVE_STRUGGLE_BUG), + LEVEL_UP_MOVE(19, MOVE_MOONLIGHT), + LEVEL_UP_MOVE(22, MOVE_TAIL_GLOW), + LEVEL_UP_MOVE(26, MOVE_SIGNAL_BEAM), LEVEL_UP_MOVE(29, MOVE_PROTECT), - LEVEL_UP_MOVE(33, MOVE_HELPING_HAND), - LEVEL_UP_MOVE(37, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(33, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(36, MOVE_HELPING_HAND), + LEVEL_UP_MOVE(40, MOVE_BUG_BUZZ), + LEVEL_UP_MOVE(43, MOVE_PLAY_ROUGH), + LEVEL_UP_MOVE(47, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(50, MOVE_INFESTATION), LEVEL_UP_END }; -static const u16 sIllumiseLevelUpLearnset[] = { +static const struct LevelUpMove sIllumiseLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_PLAY_NICE), LEVEL_UP_MOVE( 1, MOVE_TACKLE), LEVEL_UP_MOVE( 5, MOVE_SWEET_SCENT), LEVEL_UP_MOVE( 9, MOVE_CHARM), - LEVEL_UP_MOVE(13, MOVE_MOONLIGHT), - LEVEL_UP_MOVE(17, MOVE_QUICK_ATTACK), - LEVEL_UP_MOVE(21, MOVE_WISH), - LEVEL_UP_MOVE(25, MOVE_ENCORE), + LEVEL_UP_MOVE(12, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(15, MOVE_STRUGGLE_BUG), + LEVEL_UP_MOVE(19, MOVE_MOONLIGHT), + LEVEL_UP_MOVE(22, MOVE_WISH), + LEVEL_UP_MOVE(26, MOVE_ENCORE), LEVEL_UP_MOVE(29, MOVE_FLATTER), - LEVEL_UP_MOVE(33, MOVE_HELPING_HAND), - LEVEL_UP_MOVE(37, MOVE_COVET), + LEVEL_UP_MOVE(33, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(36, MOVE_HELPING_HAND), + LEVEL_UP_MOVE(40, MOVE_BUG_BUZZ), + LEVEL_UP_MOVE(43, MOVE_PLAY_ROUGH), + LEVEL_UP_MOVE(47, MOVE_COVET), + LEVEL_UP_MOVE(50, MOVE_INFESTATION), LEVEL_UP_END }; -static const u16 sLileepLevelUpLearnset[] = { +static const struct LevelUpMove sLileepLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_ASTONISH), - LEVEL_UP_MOVE( 8, MOVE_CONSTRICT), - LEVEL_UP_MOVE(15, MOVE_ACID), - LEVEL_UP_MOVE(22, MOVE_INGRAIN), - LEVEL_UP_MOVE(29, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE( 1, MOVE_CONSTRICT), + LEVEL_UP_MOVE( 5, MOVE_ACID), + LEVEL_UP_MOVE( 9, MOVE_INGRAIN), + LEVEL_UP_MOVE(13, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(17, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(21, MOVE_BRINE), + LEVEL_UP_MOVE(26, MOVE_GIGA_DRAIN), + LEVEL_UP_MOVE(31, MOVE_GASTRO_ACID), LEVEL_UP_MOVE(36, MOVE_AMNESIA), - LEVEL_UP_MOVE(43, MOVE_ANCIENT_POWER), - LEVEL_UP_MOVE(50, MOVE_STOCKPILE), - LEVEL_UP_MOVE(50, MOVE_SPIT_UP), - LEVEL_UP_MOVE(50, MOVE_SWALLOW), + LEVEL_UP_MOVE(41, MOVE_ENERGY_BALL), + LEVEL_UP_MOVE(46, MOVE_STOCKPILE), + LEVEL_UP_MOVE(46, MOVE_SPIT_UP), + LEVEL_UP_MOVE(46, MOVE_SWALLOW), + LEVEL_UP_MOVE(52, MOVE_WRING_OUT), LEVEL_UP_END }; -static const u16 sCradilyLevelUpLearnset[] = { +static const struct LevelUpMove sCradilyLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WRING_OUT), LEVEL_UP_MOVE( 1, MOVE_ASTONISH), LEVEL_UP_MOVE( 1, MOVE_CONSTRICT), LEVEL_UP_MOVE( 1, MOVE_ACID), LEVEL_UP_MOVE( 1, MOVE_INGRAIN), - LEVEL_UP_MOVE( 8, MOVE_CONSTRICT), - LEVEL_UP_MOVE(15, MOVE_ACID), - LEVEL_UP_MOVE(22, MOVE_INGRAIN), - LEVEL_UP_MOVE(29, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE( 5, MOVE_ACID), + LEVEL_UP_MOVE( 9, MOVE_INGRAIN), + LEVEL_UP_MOVE(13, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(17, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(21, MOVE_BRINE), + LEVEL_UP_MOVE(26, MOVE_GIGA_DRAIN), + LEVEL_UP_MOVE(31, MOVE_GASTRO_ACID), LEVEL_UP_MOVE(36, MOVE_AMNESIA), - LEVEL_UP_MOVE(48, MOVE_ANCIENT_POWER), - LEVEL_UP_MOVE(60, MOVE_STOCKPILE), - LEVEL_UP_MOVE(60, MOVE_SPIT_UP), - LEVEL_UP_MOVE(60, MOVE_SWALLOW), + LEVEL_UP_MOVE(44, MOVE_ENERGY_BALL), + LEVEL_UP_MOVE(52, MOVE_STOCKPILE), + LEVEL_UP_MOVE(52, MOVE_SPIT_UP), + LEVEL_UP_MOVE(52, MOVE_SWALLOW), + LEVEL_UP_MOVE(61, MOVE_WRING_OUT), LEVEL_UP_END }; -static const u16 sAnorithLevelUpLearnset[] = { +static const struct LevelUpMove sAnorithLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SCRATCH), - LEVEL_UP_MOVE( 7, MOVE_HARDEN), - LEVEL_UP_MOVE(13, MOVE_MUD_SPORT), - LEVEL_UP_MOVE(19, MOVE_WATER_GUN), - LEVEL_UP_MOVE(25, MOVE_METAL_CLAW), - LEVEL_UP_MOVE(31, MOVE_PROTECT), - LEVEL_UP_MOVE(37, MOVE_ANCIENT_POWER), - LEVEL_UP_MOVE(43, MOVE_FURY_CUTTER), - LEVEL_UP_MOVE(49, MOVE_SLASH), + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 4, MOVE_MUD_SPORT), + LEVEL_UP_MOVE( 7, MOVE_WATER_GUN), + LEVEL_UP_MOVE(10, MOVE_FURY_CUTTER), + LEVEL_UP_MOVE(13, MOVE_SMACK_DOWN), + LEVEL_UP_MOVE(17, MOVE_METAL_CLAW), + LEVEL_UP_MOVE(21, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(25, MOVE_BUG_BITE), + LEVEL_UP_MOVE(29, MOVE_BRINE), + LEVEL_UP_MOVE(34, MOVE_SLASH), + LEVEL_UP_MOVE(39, MOVE_CRUSH_CLAW), + LEVEL_UP_MOVE(44, MOVE_X_SCISSOR), + LEVEL_UP_MOVE(49, MOVE_PROTECT), LEVEL_UP_MOVE(55, MOVE_ROCK_BLAST), LEVEL_UP_END }; -static const u16 sArmaldoLevelUpLearnset[] = { +static const struct LevelUpMove sArmaldoLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_SCRATCH), LEVEL_UP_MOVE( 1, MOVE_HARDEN), LEVEL_UP_MOVE( 1, MOVE_MUD_SPORT), LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), - LEVEL_UP_MOVE( 7, MOVE_HARDEN), - LEVEL_UP_MOVE(13, MOVE_MUD_SPORT), - LEVEL_UP_MOVE(19, MOVE_WATER_GUN), - LEVEL_UP_MOVE(25, MOVE_METAL_CLAW), - LEVEL_UP_MOVE(31, MOVE_PROTECT), - LEVEL_UP_MOVE(37, MOVE_ANCIENT_POWER), - LEVEL_UP_MOVE(46, MOVE_FURY_CUTTER), - LEVEL_UP_MOVE(55, MOVE_SLASH), - LEVEL_UP_MOVE(64, MOVE_ROCK_BLAST), + LEVEL_UP_MOVE( 4, MOVE_MUD_SPORT), + LEVEL_UP_MOVE( 7, MOVE_WATER_GUN), + LEVEL_UP_MOVE(10, MOVE_FURY_CUTTER), + LEVEL_UP_MOVE(13, MOVE_SMACK_DOWN), + LEVEL_UP_MOVE(17, MOVE_METAL_CLAW), + LEVEL_UP_MOVE(21, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(25, MOVE_BUG_BITE), + LEVEL_UP_MOVE(29, MOVE_BRINE), + LEVEL_UP_MOVE(34, MOVE_SLASH), + LEVEL_UP_MOVE(39, MOVE_CRUSH_CLAW), + LEVEL_UP_MOVE(46, MOVE_X_SCISSOR), + LEVEL_UP_MOVE(53, MOVE_PROTECT), + LEVEL_UP_MOVE(61, MOVE_ROCK_BLAST), LEVEL_UP_END }; -static const u16 sRaltsLevelUpLearnset[] = { +static const struct LevelUpMove sRaltsLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 6, MOVE_CONFUSION), - LEVEL_UP_MOVE(11, MOVE_DOUBLE_TEAM), - LEVEL_UP_MOVE(16, MOVE_TELEPORT), - LEVEL_UP_MOVE(21, MOVE_CALM_MIND), - LEVEL_UP_MOVE(26, MOVE_PSYCHIC), - LEVEL_UP_MOVE(31, MOVE_IMPRISON), - LEVEL_UP_MOVE(36, MOVE_FUTURE_SIGHT), - LEVEL_UP_MOVE(41, MOVE_HYPNOSIS), - LEVEL_UP_MOVE(46, MOVE_DREAM_EATER), + LEVEL_UP_MOVE( 4, MOVE_CONFUSION), + LEVEL_UP_MOVE( 6, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE( 9, MOVE_TELEPORT), + LEVEL_UP_MOVE(11, MOVE_DISARMING_VOICE), + LEVEL_UP_MOVE(14, MOVE_LUCKY_CHANT), + LEVEL_UP_MOVE(17, MOVE_MAGICAL_LEAF), + LEVEL_UP_MOVE(19, MOVE_HEAL_PULSE), + LEVEL_UP_MOVE(22, MOVE_DRAINING_KISS), + LEVEL_UP_MOVE(24, MOVE_CALM_MIND), + LEVEL_UP_MOVE(27, MOVE_PSYCHIC), + LEVEL_UP_MOVE(29, MOVE_IMPRISON), + LEVEL_UP_MOVE(32, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(34, MOVE_CHARM), + LEVEL_UP_MOVE(37, MOVE_HYPNOSIS), + LEVEL_UP_MOVE(39, MOVE_DREAM_EATER), + LEVEL_UP_MOVE(42, MOVE_STORED_POWER), LEVEL_UP_END }; -static const u16 sKirliaLevelUpLearnset[] = { +static const struct LevelUpMove sKirliaLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_GROWL), LEVEL_UP_MOVE( 1, MOVE_CONFUSION), LEVEL_UP_MOVE( 1, MOVE_DOUBLE_TEAM), LEVEL_UP_MOVE( 1, MOVE_TELEPORT), - LEVEL_UP_MOVE( 6, MOVE_CONFUSION), - LEVEL_UP_MOVE(11, MOVE_DOUBLE_TEAM), - LEVEL_UP_MOVE(16, MOVE_TELEPORT), - LEVEL_UP_MOVE(21, MOVE_CALM_MIND), - LEVEL_UP_MOVE(26, MOVE_PSYCHIC), + LEVEL_UP_MOVE( 4, MOVE_CONFUSION), + LEVEL_UP_MOVE( 6, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE( 9, MOVE_TELEPORT), + LEVEL_UP_MOVE(11, MOVE_DISARMING_VOICE), + LEVEL_UP_MOVE(14, MOVE_LUCKY_CHANT), + LEVEL_UP_MOVE(17, MOVE_MAGICAL_LEAF), + LEVEL_UP_MOVE(19, MOVE_HEAL_PULSE), + LEVEL_UP_MOVE(23, MOVE_DRAINING_KISS), + LEVEL_UP_MOVE(26, MOVE_CALM_MIND), + LEVEL_UP_MOVE(30, MOVE_PSYCHIC), LEVEL_UP_MOVE(33, MOVE_IMPRISON), + LEVEL_UP_MOVE(37, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(40, MOVE_CHARM), + LEVEL_UP_MOVE(44, MOVE_HYPNOSIS), + LEVEL_UP_MOVE(47, MOVE_DREAM_EATER), + LEVEL_UP_MOVE(51, MOVE_STORED_POWER), + LEVEL_UP_END +}; + +static const struct LevelUpMove sGardevoirLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_MOONBLAST), + LEVEL_UP_MOVE( 1, MOVE_STORED_POWER), + LEVEL_UP_MOVE( 1, MOVE_MISTY_TERRAIN), + LEVEL_UP_MOVE( 1, MOVE_HEALING_WISH), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_CONFUSION), + LEVEL_UP_MOVE( 1, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE( 1, MOVE_TELEPORT), + LEVEL_UP_MOVE( 4, MOVE_CONFUSION), + LEVEL_UP_MOVE( 6, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE( 9, MOVE_TELEPORT), + LEVEL_UP_MOVE(11, MOVE_DISARMING_VOICE), + LEVEL_UP_MOVE(14, MOVE_WISH), + LEVEL_UP_MOVE(17, MOVE_MAGICAL_LEAF), + LEVEL_UP_MOVE(19, MOVE_HEAL_PULSE), + LEVEL_UP_MOVE(23, MOVE_DRAINING_KISS), + LEVEL_UP_MOVE(26, MOVE_CALM_MIND), + LEVEL_UP_MOVE(31, MOVE_PSYCHIC), + LEVEL_UP_MOVE(35, MOVE_IMPRISON), LEVEL_UP_MOVE(40, MOVE_FUTURE_SIGHT), - LEVEL_UP_MOVE(47, MOVE_HYPNOSIS), - LEVEL_UP_MOVE(54, MOVE_DREAM_EATER), + LEVEL_UP_MOVE(44, MOVE_CAPTIVATE), + LEVEL_UP_MOVE(49, MOVE_HYPNOSIS), + LEVEL_UP_MOVE(53, MOVE_DREAM_EATER), + LEVEL_UP_MOVE(58, MOVE_STORED_POWER), + LEVEL_UP_MOVE(62, MOVE_MOONBLAST), LEVEL_UP_END }; -static const u16 sGardevoirLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_GROWL), - LEVEL_UP_MOVE( 1, MOVE_CONFUSION), - LEVEL_UP_MOVE( 1, MOVE_DOUBLE_TEAM), - LEVEL_UP_MOVE( 1, MOVE_TELEPORT), - LEVEL_UP_MOVE( 6, MOVE_CONFUSION), - LEVEL_UP_MOVE(11, MOVE_DOUBLE_TEAM), - LEVEL_UP_MOVE(16, MOVE_TELEPORT), - LEVEL_UP_MOVE(21, MOVE_CALM_MIND), - LEVEL_UP_MOVE(26, MOVE_PSYCHIC), - LEVEL_UP_MOVE(33, MOVE_IMPRISON), - LEVEL_UP_MOVE(42, MOVE_FUTURE_SIGHT), - LEVEL_UP_MOVE(51, MOVE_HYPNOSIS), - LEVEL_UP_MOVE(60, MOVE_DREAM_EATER), - LEVEL_UP_END -}; - -static const u16 sBagonLevelUpLearnset[] = { +static const struct LevelUpMove sBagonLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_RAGE), - LEVEL_UP_MOVE( 5, MOVE_BITE), - LEVEL_UP_MOVE( 9, MOVE_LEER), + LEVEL_UP_MOVE( 4, MOVE_EMBER), + LEVEL_UP_MOVE( 7, MOVE_LEER), + LEVEL_UP_MOVE(10, MOVE_BITE), + LEVEL_UP_MOVE(13, MOVE_DRAGON_BREATH), LEVEL_UP_MOVE(17, MOVE_HEADBUTT), LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE(25, MOVE_EMBER), - LEVEL_UP_MOVE(33, MOVE_DRAGON_BREATH), - LEVEL_UP_MOVE(37, MOVE_SCARY_FACE), - LEVEL_UP_MOVE(41, MOVE_CRUNCH), - LEVEL_UP_MOVE(49, MOVE_DRAGON_CLAW), - LEVEL_UP_MOVE(53, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(25, MOVE_CRUNCH), + LEVEL_UP_MOVE(29, MOVE_DRAGON_CLAW), + LEVEL_UP_MOVE(34, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(39, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(44, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(49, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; -static const u16 sShelgonLevelUpLearnset[] = { +static const struct LevelUpMove sShelgonLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_PROTECT), + LEVEL_UP_MOVE( 1, MOVE_PROTECT), LEVEL_UP_MOVE( 1, MOVE_RAGE), - LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 1, MOVE_EMBER), LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 1, MOVE_HEADBUTT), - LEVEL_UP_MOVE( 5, MOVE_BITE), - LEVEL_UP_MOVE( 9, MOVE_LEER), - LEVEL_UP_MOVE(17, MOVE_HEADBUTT), - LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE(25, MOVE_EMBER), - LEVEL_UP_MOVE(30, MOVE_PROTECT), - LEVEL_UP_MOVE(38, MOVE_DRAGON_BREATH), - LEVEL_UP_MOVE(47, MOVE_SCARY_FACE), - LEVEL_UP_MOVE(56, MOVE_CRUNCH), - LEVEL_UP_MOVE(69, MOVE_DRAGON_CLAW), - LEVEL_UP_MOVE(78, MOVE_DOUBLE_EDGE), - LEVEL_UP_END -}; - -static const u16 sSalamenceLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_RAGE), LEVEL_UP_MOVE( 1, MOVE_BITE), - LEVEL_UP_MOVE( 1, MOVE_LEER), - LEVEL_UP_MOVE( 1, MOVE_HEADBUTT), - LEVEL_UP_MOVE( 5, MOVE_BITE), - LEVEL_UP_MOVE( 9, MOVE_LEER), + LEVEL_UP_MOVE( 4, MOVE_EMBER), + LEVEL_UP_MOVE( 7, MOVE_LEER), + LEVEL_UP_MOVE(10, MOVE_BITE), + LEVEL_UP_MOVE(13, MOVE_DRAGON_BREATH), LEVEL_UP_MOVE(17, MOVE_HEADBUTT), LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY), - LEVEL_UP_MOVE(25, MOVE_EMBER), - LEVEL_UP_MOVE(30, MOVE_PROTECT), - LEVEL_UP_MOVE(38, MOVE_DRAGON_BREATH), - LEVEL_UP_MOVE(47, MOVE_SCARY_FACE), - LEVEL_UP_MOVE(50, MOVE_FLY), - LEVEL_UP_MOVE(61, MOVE_CRUNCH), - LEVEL_UP_MOVE(79, MOVE_DRAGON_CLAW), - LEVEL_UP_MOVE(93, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(25, MOVE_CRUNCH), + LEVEL_UP_MOVE(29, MOVE_DRAGON_CLAW), + LEVEL_UP_MOVE(35, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(42, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(49, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(56, MOVE_DOUBLE_EDGE), LEVEL_UP_END }; -static const u16 sBeldumLevelUpLearnset[] = { +static const struct LevelUpMove sSalamenceLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_FLY), + LEVEL_UP_MOVE( 1, MOVE_FLY), + LEVEL_UP_MOVE( 1, MOVE_PROTECT), + LEVEL_UP_MOVE( 1, MOVE_DRAGON_TAIL), + LEVEL_UP_MOVE( 1, MOVE_FIRE_FANG), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_FANG), + LEVEL_UP_MOVE( 1, MOVE_RAGE), + LEVEL_UP_MOVE( 1, MOVE_EMBER), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 4, MOVE_EMBER), + LEVEL_UP_MOVE( 7, MOVE_LEER), + LEVEL_UP_MOVE(10, MOVE_BITE), + LEVEL_UP_MOVE(13, MOVE_DRAGON_BREATH), + LEVEL_UP_MOVE(17, MOVE_HEADBUTT), + LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(25, MOVE_CRUNCH), + LEVEL_UP_MOVE(29, MOVE_DRAGON_CLAW), + LEVEL_UP_MOVE(35, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(42, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(49, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(63, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +static const struct LevelUpMove sBeldumLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TAKE_DOWN), LEVEL_UP_END }; -static const u16 sMetangLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(20, MOVE_CONFUSION), - LEVEL_UP_MOVE(20, MOVE_METAL_CLAW), - LEVEL_UP_MOVE(26, MOVE_SCARY_FACE), - LEVEL_UP_MOVE(32, MOVE_PURSUIT), - LEVEL_UP_MOVE(38, MOVE_PSYCHIC), - LEVEL_UP_MOVE(44, MOVE_IRON_DEFENSE), - LEVEL_UP_MOVE(50, MOVE_METEOR_MASH), - LEVEL_UP_MOVE(56, MOVE_AGILITY), - LEVEL_UP_MOVE(62, MOVE_HYPER_BEAM), - LEVEL_UP_END -}; - -static const u16 sMetagrossLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_TAKE_DOWN), +static const struct LevelUpMove sMetangLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_CONFUSION), + // LEVEL_UP_MOVE( 0, MOVE_METAL_CLAW), LEVEL_UP_MOVE( 1, MOVE_CONFUSION), LEVEL_UP_MOVE( 1, MOVE_METAL_CLAW), - LEVEL_UP_MOVE( 1, MOVE_SCARY_FACE), - LEVEL_UP_MOVE(20, MOVE_CONFUSION), - LEVEL_UP_MOVE(20, MOVE_METAL_CLAW), - LEVEL_UP_MOVE(26, MOVE_SCARY_FACE), - LEVEL_UP_MOVE(32, MOVE_PURSUIT), + LEVEL_UP_MOVE( 1, MOVE_MAGNET_RISE), + LEVEL_UP_MOVE( 1, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(23, MOVE_PURSUIT), + LEVEL_UP_MOVE(26, MOVE_BULLET_PUNCH), + LEVEL_UP_MOVE(29, MOVE_MIRACLE_EYE), + LEVEL_UP_MOVE(32, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(35, MOVE_SCARY_FACE), LEVEL_UP_MOVE(38, MOVE_PSYCHIC), - LEVEL_UP_MOVE(44, MOVE_IRON_DEFENSE), - LEVEL_UP_MOVE(55, MOVE_METEOR_MASH), - LEVEL_UP_MOVE(66, MOVE_AGILITY), - LEVEL_UP_MOVE(77, MOVE_HYPER_BEAM), + LEVEL_UP_MOVE(41, MOVE_AGILITY), + LEVEL_UP_MOVE(44, MOVE_METEOR_MASH), + LEVEL_UP_MOVE(47, MOVE_IRON_DEFENSE), + LEVEL_UP_MOVE(50, MOVE_HYPER_BEAM), LEVEL_UP_END }; -static const u16 sRegirockLevelUpLearnset[] = { +static const struct LevelUpMove sMetagrossLevelUpLearnset[] = { + // LEVEL_UP_MOVE( 0, MOVE_HAMMER_ARM), + LEVEL_UP_MOVE( 1, MOVE_HAMMER_ARM), + LEVEL_UP_MOVE( 1, MOVE_CONFUSION), + LEVEL_UP_MOVE( 1, MOVE_METAL_CLAW), + LEVEL_UP_MOVE( 1, MOVE_MAGNET_RISE), + LEVEL_UP_MOVE( 1, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(23, MOVE_PURSUIT), + LEVEL_UP_MOVE(26, MOVE_BULLET_PUNCH), + LEVEL_UP_MOVE(29, MOVE_MIRACLE_EYE), + LEVEL_UP_MOVE(32, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(35, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(38, MOVE_PSYCHIC), + LEVEL_UP_MOVE(41, MOVE_AGILITY), + LEVEL_UP_MOVE(44, MOVE_METEOR_MASH), + LEVEL_UP_MOVE(52, MOVE_IRON_DEFENSE), + LEVEL_UP_MOVE(60, MOVE_HYPER_BEAM), + LEVEL_UP_END +}; + +static const struct LevelUpMove sRegirockLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_EXPLOSION), - LEVEL_UP_MOVE( 9, MOVE_ROCK_THROW), - LEVEL_UP_MOVE(17, MOVE_CURSE), - LEVEL_UP_MOVE(25, MOVE_SUPERPOWER), - LEVEL_UP_MOVE(33, MOVE_ANCIENT_POWER), - LEVEL_UP_MOVE(41, MOVE_IRON_DEFENSE), - LEVEL_UP_MOVE(49, MOVE_ZAP_CANNON), - LEVEL_UP_MOVE(57, MOVE_LOCK_ON), - LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM), + LEVEL_UP_MOVE( 1, MOVE_STOMP), + LEVEL_UP_MOVE( 1, MOVE_ROCK_THROW), + LEVEL_UP_MOVE( 1, MOVE_CHARGE_BEAM), + LEVEL_UP_MOVE( 1, MOVE_BULLDOZE), + LEVEL_UP_MOVE( 7, MOVE_ROCK_THROW), + LEVEL_UP_MOVE(13, MOVE_CHARGE_BEAM), + LEVEL_UP_MOVE(19, MOVE_BULLDOZE), + LEVEL_UP_MOVE(25, MOVE_CURSE), + LEVEL_UP_MOVE(31, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(37, MOVE_IRON_DEFENSE), + LEVEL_UP_MOVE(43, MOVE_STONE_EDGE), + LEVEL_UP_MOVE(49, MOVE_HAMMER_ARM), + LEVEL_UP_MOVE(55, MOVE_LOCK_ON), + LEVEL_UP_MOVE(55, MOVE_ZAP_CANNON), + LEVEL_UP_MOVE(61, MOVE_SUPERPOWER), + LEVEL_UP_MOVE(67, MOVE_HYPER_BEAM), LEVEL_UP_END }; -static const u16 sRegiceLevelUpLearnset[] = { +static const struct LevelUpMove sRegiceLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_EXPLOSION), - LEVEL_UP_MOVE( 9, MOVE_ICY_WIND), - LEVEL_UP_MOVE(17, MOVE_CURSE), - LEVEL_UP_MOVE(25, MOVE_SUPERPOWER), - LEVEL_UP_MOVE(33, MOVE_ANCIENT_POWER), - LEVEL_UP_MOVE(41, MOVE_AMNESIA), - LEVEL_UP_MOVE(49, MOVE_ZAP_CANNON), - LEVEL_UP_MOVE(57, MOVE_LOCK_ON), - LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM), + LEVEL_UP_MOVE( 1, MOVE_STOMP), + LEVEL_UP_MOVE( 1, MOVE_ICY_WIND), + LEVEL_UP_MOVE( 1, MOVE_CHARGE_BEAM), + LEVEL_UP_MOVE( 1, MOVE_BULLDOZE), + LEVEL_UP_MOVE( 7, MOVE_ICY_WIND), + LEVEL_UP_MOVE(13, MOVE_CHARGE_BEAM), + LEVEL_UP_MOVE(19, MOVE_BULLDOZE), + LEVEL_UP_MOVE(25, MOVE_CURSE), + LEVEL_UP_MOVE(31, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(37, MOVE_AMNESIA), + LEVEL_UP_MOVE(43, MOVE_ICE_BEAM), + LEVEL_UP_MOVE(49, MOVE_HAMMER_ARM), + LEVEL_UP_MOVE(55, MOVE_LOCK_ON), + LEVEL_UP_MOVE(55, MOVE_ZAP_CANNON), + LEVEL_UP_MOVE(61, MOVE_SUPERPOWER), + LEVEL_UP_MOVE(67, MOVE_HYPER_BEAM), LEVEL_UP_END }; -static const u16 sRegisteelLevelUpLearnset[] = { +static const struct LevelUpMove sRegisteelLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_EXPLOSION), - LEVEL_UP_MOVE( 9, MOVE_METAL_CLAW), - LEVEL_UP_MOVE(17, MOVE_CURSE), - LEVEL_UP_MOVE(25, MOVE_SUPERPOWER), - LEVEL_UP_MOVE(33, MOVE_ANCIENT_POWER), - LEVEL_UP_MOVE(41, MOVE_IRON_DEFENSE), - LEVEL_UP_MOVE(41, MOVE_AMNESIA), - LEVEL_UP_MOVE(49, MOVE_ZAP_CANNON), - LEVEL_UP_MOVE(57, MOVE_LOCK_ON), - LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM), + LEVEL_UP_MOVE( 1, MOVE_STOMP), + LEVEL_UP_MOVE( 1, MOVE_METAL_CLAW), + LEVEL_UP_MOVE( 1, MOVE_CHARGE_BEAM), + LEVEL_UP_MOVE( 1, MOVE_BULLDOZE), + LEVEL_UP_MOVE( 7, MOVE_METAL_CLAW), + LEVEL_UP_MOVE(13, MOVE_CHARGE_BEAM), + LEVEL_UP_MOVE(19, MOVE_BULLDOZE), + LEVEL_UP_MOVE(25, MOVE_CURSE), + LEVEL_UP_MOVE(31, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(37, MOVE_IRON_DEFENSE), + LEVEL_UP_MOVE(37, MOVE_AMNESIA), + LEVEL_UP_MOVE(43, MOVE_IRON_HEAD), + LEVEL_UP_MOVE(43, MOVE_FLASH_CANNON), + LEVEL_UP_MOVE(49, MOVE_HAMMER_ARM), + LEVEL_UP_MOVE(55, MOVE_LOCK_ON), + LEVEL_UP_MOVE(55, MOVE_ZAP_CANNON), + LEVEL_UP_MOVE(61, MOVE_SUPERPOWER), + LEVEL_UP_MOVE(67, MOVE_HYPER_BEAM), LEVEL_UP_END }; -static const u16 sKyogreLevelUpLearnset[] = { +static const struct LevelUpMove sKyogreLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ANCIENT_POWER), LEVEL_UP_MOVE( 1, MOVE_WATER_PULSE), LEVEL_UP_MOVE( 5, MOVE_SCARY_FACE), - LEVEL_UP_MOVE(15, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(15, MOVE_AQUA_TAIL), LEVEL_UP_MOVE(20, MOVE_BODY_SLAM), - LEVEL_UP_MOVE(30, MOVE_CALM_MIND), + LEVEL_UP_MOVE(30, MOVE_AQUA_RING), LEVEL_UP_MOVE(35, MOVE_ICE_BEAM), - LEVEL_UP_MOVE(45, MOVE_HYDRO_PUMP), - LEVEL_UP_MOVE(50, MOVE_REST), - LEVEL_UP_MOVE(60, MOVE_SHEER_COLD), - LEVEL_UP_MOVE(65, MOVE_DOUBLE_EDGE), - LEVEL_UP_MOVE(75, MOVE_WATER_SPOUT), + LEVEL_UP_MOVE(45, MOVE_ORIGIN_PULSE), + LEVEL_UP_MOVE(50, MOVE_CALM_MIND), + LEVEL_UP_MOVE(60, MOVE_MUDDY_WATER), + LEVEL_UP_MOVE(65, MOVE_SHEER_COLD), + LEVEL_UP_MOVE(75, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(80, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(90, MOVE_WATER_SPOUT), LEVEL_UP_END }; -static const u16 sGroudonLevelUpLearnset[] = { +static const struct LevelUpMove sGroudonLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ANCIENT_POWER), LEVEL_UP_MOVE( 1, MOVE_MUD_SHOT), LEVEL_UP_MOVE( 5, MOVE_SCARY_FACE), - LEVEL_UP_MOVE(15, MOVE_ANCIENT_POWER), - LEVEL_UP_MOVE(20, MOVE_SLASH), - LEVEL_UP_MOVE(30, MOVE_BULK_UP), + LEVEL_UP_MOVE(15, MOVE_EARTH_POWER), + LEVEL_UP_MOVE(20, MOVE_LAVA_PLUME), + LEVEL_UP_MOVE(30, MOVE_REST), LEVEL_UP_MOVE(35, MOVE_EARTHQUAKE), - LEVEL_UP_MOVE(45, MOVE_FIRE_BLAST), - LEVEL_UP_MOVE(50, MOVE_REST), - LEVEL_UP_MOVE(60, MOVE_FISSURE), - LEVEL_UP_MOVE(65, MOVE_SOLAR_BEAM), - LEVEL_UP_MOVE(75, MOVE_ERUPTION), + LEVEL_UP_MOVE(45, MOVE_PRECIPICE_BLADES), + LEVEL_UP_MOVE(50, MOVE_BULK_UP), + LEVEL_UP_MOVE(60, MOVE_SOLAR_BEAM), + LEVEL_UP_MOVE(65, MOVE_FISSURE), + LEVEL_UP_MOVE(75, MOVE_FIRE_BLAST), + LEVEL_UP_MOVE(80, MOVE_HAMMER_ARM), + LEVEL_UP_MOVE(90, MOVE_ERUPTION), LEVEL_UP_END }; -static const u16 sRayquazaLevelUpLearnset[] = { +static const struct LevelUpMove sRayquazaLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_TWISTER), LEVEL_UP_MOVE( 5, MOVE_SCARY_FACE), LEVEL_UP_MOVE(15, MOVE_ANCIENT_POWER), - LEVEL_UP_MOVE(20, MOVE_DRAGON_CLAW), - LEVEL_UP_MOVE(30, MOVE_DRAGON_DANCE), - LEVEL_UP_MOVE(35, MOVE_CRUNCH), - LEVEL_UP_MOVE(45, MOVE_FLY), - LEVEL_UP_MOVE(50, MOVE_REST), - LEVEL_UP_MOVE(60, MOVE_EXTREME_SPEED), - LEVEL_UP_MOVE(65, MOVE_OUTRAGE), - LEVEL_UP_MOVE(75, MOVE_HYPER_BEAM), + LEVEL_UP_MOVE(20, MOVE_CRUNCH), + LEVEL_UP_MOVE(30, MOVE_AIR_SLASH), + LEVEL_UP_MOVE(35, MOVE_REST), + LEVEL_UP_MOVE(45, MOVE_EXTREME_SPEED), + LEVEL_UP_MOVE(50, MOVE_DRAGON_PULSE), + LEVEL_UP_MOVE(60, MOVE_DRAGON_DANCE), + LEVEL_UP_MOVE(65, MOVE_FLY), + LEVEL_UP_MOVE(75, MOVE_HYPER_VOICE), + LEVEL_UP_MOVE(80, MOVE_OUTRAGE), + LEVEL_UP_MOVE(90, MOVE_HYPER_BEAM), LEVEL_UP_END }; -static const u16 sLatiasLevelUpLearnset[] = { +static const struct LevelUpMove sLatiasLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_HEALING_WISH), + LEVEL_UP_MOVE( 1, MOVE_HELPING_HAND), + LEVEL_UP_MOVE( 1, MOVE_WISH), LEVEL_UP_MOVE( 1, MOVE_PSYWAVE), - LEVEL_UP_MOVE( 5, MOVE_WISH), - LEVEL_UP_MOVE(10, MOVE_HELPING_HAND), - LEVEL_UP_MOVE(15, MOVE_SAFEGUARD), + LEVEL_UP_MOVE( 1, MOVE_SAFEGUARD), + LEVEL_UP_MOVE( 4, MOVE_WATER_SPORT), + LEVEL_UP_MOVE( 7, MOVE_CHARM), + LEVEL_UP_MOVE(10, MOVE_STORED_POWER), + LEVEL_UP_MOVE(13, MOVE_REFRESH), + LEVEL_UP_MOVE(16, MOVE_HEAL_PULSE), LEVEL_UP_MOVE(20, MOVE_DRAGON_BREATH), - LEVEL_UP_MOVE(25, MOVE_WATER_SPORT), - LEVEL_UP_MOVE(30, MOVE_REFRESH), - LEVEL_UP_MOVE(35, MOVE_MIST_BALL), - LEVEL_UP_MOVE(40, MOVE_PSYCHIC), - LEVEL_UP_MOVE(45, MOVE_RECOVER), - LEVEL_UP_MOVE(50, MOVE_CHARM), + LEVEL_UP_MOVE(24, MOVE_MIST_BALL), + LEVEL_UP_MOVE(28, MOVE_PSYCHO_SHIFT), + LEVEL_UP_MOVE(32, MOVE_RECOVER), + LEVEL_UP_MOVE(36, MOVE_REFLECT_TYPE), + LEVEL_UP_MOVE(41, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(46, MOVE_GUARD_SPLIT), + LEVEL_UP_MOVE(51, MOVE_PSYCHIC), + LEVEL_UP_MOVE(56, MOVE_DRAGON_PULSE), + LEVEL_UP_MOVE(61, MOVE_HEALING_WISH), LEVEL_UP_END }; -static const u16 sLatiosLevelUpLearnset[] = { +static const struct LevelUpMove sLatiosLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_MEMENTO), + LEVEL_UP_MOVE( 1, MOVE_HELPING_HAND), + LEVEL_UP_MOVE( 1, MOVE_HEAL_BLOCK), LEVEL_UP_MOVE( 1, MOVE_PSYWAVE), - LEVEL_UP_MOVE( 5, MOVE_MEMENTO), - LEVEL_UP_MOVE(10, MOVE_HELPING_HAND), - LEVEL_UP_MOVE(15, MOVE_SAFEGUARD), + LEVEL_UP_MOVE( 1, MOVE_SAFEGUARD), + LEVEL_UP_MOVE( 4, MOVE_PROTECT), + LEVEL_UP_MOVE( 7, MOVE_DRAGON_DANCE), + LEVEL_UP_MOVE(10, MOVE_STORED_POWER), + LEVEL_UP_MOVE(13, MOVE_REFRESH), + LEVEL_UP_MOVE(16, MOVE_HEAL_PULSE), LEVEL_UP_MOVE(20, MOVE_DRAGON_BREATH), - LEVEL_UP_MOVE(25, MOVE_PROTECT), - LEVEL_UP_MOVE(30, MOVE_REFRESH), - LEVEL_UP_MOVE(35, MOVE_LUSTER_PURGE), - LEVEL_UP_MOVE(40, MOVE_PSYCHIC), - LEVEL_UP_MOVE(45, MOVE_RECOVER), - LEVEL_UP_MOVE(50, MOVE_DRAGON_DANCE), + LEVEL_UP_MOVE(24, MOVE_LUSTER_PURGE), + LEVEL_UP_MOVE(28, MOVE_PSYCHO_SHIFT), + LEVEL_UP_MOVE(32, MOVE_RECOVER), + LEVEL_UP_MOVE(36, MOVE_TELEKINESIS), + LEVEL_UP_MOVE(41, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(46, MOVE_POWER_SPLIT), + LEVEL_UP_MOVE(51, MOVE_PSYCHIC), + LEVEL_UP_MOVE(56, MOVE_DRAGON_PULSE), + LEVEL_UP_MOVE(61, MOVE_MEMENTO), LEVEL_UP_END }; -static const u16 sJirachiLevelUpLearnset[] = { +static const struct LevelUpMove sJirachiLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_WISH), LEVEL_UP_MOVE( 1, MOVE_CONFUSION), LEVEL_UP_MOVE( 5, MOVE_REST), @@ -5576,42 +7848,56 @@ static const u16 sJirachiLevelUpLearnset[] = { LEVEL_UP_MOVE(15, MOVE_HELPING_HAND), LEVEL_UP_MOVE(20, MOVE_PSYCHIC), LEVEL_UP_MOVE(25, MOVE_REFRESH), - LEVEL_UP_MOVE(30, MOVE_REST), - LEVEL_UP_MOVE(35, MOVE_DOUBLE_EDGE), - LEVEL_UP_MOVE(40, MOVE_FUTURE_SIGHT), - LEVEL_UP_MOVE(45, MOVE_COSMIC_POWER), - LEVEL_UP_MOVE(50, MOVE_DOOM_DESIRE), + LEVEL_UP_MOVE(30, MOVE_LUCKY_CHANT), + LEVEL_UP_MOVE(35, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(40, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(45, MOVE_GRAVITY), + LEVEL_UP_MOVE(50, MOVE_HEALING_WISH), + LEVEL_UP_MOVE(55, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(60, MOVE_COSMIC_POWER), + LEVEL_UP_MOVE(65, MOVE_LAST_RESORT), + LEVEL_UP_MOVE(70, MOVE_DOOM_DESIRE), LEVEL_UP_END }; -static const u16 sDeoxysLevelUpLearnset[] = { +static const struct LevelUpMove sDeoxysLevelUpLearnset[] = { LEVEL_UP_MOVE( 1, MOVE_LEER), LEVEL_UP_MOVE( 1, MOVE_WRAP), - LEVEL_UP_MOVE( 5, MOVE_NIGHT_SHADE), - LEVEL_UP_MOVE(10, MOVE_DOUBLE_TEAM), - LEVEL_UP_MOVE(15, MOVE_KNOCK_OFF), - LEVEL_UP_MOVE(20, MOVE_PURSUIT), - LEVEL_UP_MOVE(25, MOVE_PSYCHIC), - LEVEL_UP_MOVE(30, MOVE_SWIFT), - LEVEL_UP_MOVE(35, MOVE_AGILITY), - LEVEL_UP_MOVE(40, MOVE_RECOVER), - LEVEL_UP_MOVE(45, MOVE_PSYCHO_BOOST), - LEVEL_UP_MOVE(50, MOVE_EXTREME_SPEED), + LEVEL_UP_MOVE( 7, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE(13, MOVE_TELEPORT), + LEVEL_UP_MOVE(19, MOVE_KNOCK_OFF), + LEVEL_UP_MOVE(25, MOVE_PURSUIT), + LEVEL_UP_MOVE(31, MOVE_PSYCHIC), + LEVEL_UP_MOVE(37, MOVE_SNATCH), + LEVEL_UP_MOVE(43, MOVE_PSYCHO_SHIFT), + LEVEL_UP_MOVE(49, MOVE_ZEN_HEADBUTT), + LEVEL_UP_MOVE(55, MOVE_COSMIC_POWER), + LEVEL_UP_MOVE(61, MOVE_RECOVER), + LEVEL_UP_MOVE(67, MOVE_PSYCHO_BOOST), + LEVEL_UP_MOVE(73, MOVE_HYPER_BEAM), LEVEL_UP_END }; -static const u16 sChimechoLevelUpLearnset[] = { - LEVEL_UP_MOVE( 1, MOVE_WRAP), - LEVEL_UP_MOVE( 6, MOVE_GROWL), - LEVEL_UP_MOVE( 9, MOVE_ASTONISH), - LEVEL_UP_MOVE(14, MOVE_CONFUSION), - LEVEL_UP_MOVE(17, MOVE_TAKE_DOWN), - LEVEL_UP_MOVE(22, MOVE_UPROAR), - LEVEL_UP_MOVE(25, MOVE_YAWN), - LEVEL_UP_MOVE(30, MOVE_PSYWAVE), - LEVEL_UP_MOVE(33, MOVE_DOUBLE_EDGE), - LEVEL_UP_MOVE(38, MOVE_HEAL_BELL), - LEVEL_UP_MOVE(41, MOVE_SAFEGUARD), - LEVEL_UP_MOVE(46, MOVE_PSYCHIC), - LEVEL_UP_END +static const struct LevelUpMove sChimechoLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_HEALING_WISH), + LEVEL_UP_MOVE( 1, MOVE_SYNCHRONOISE), + LEVEL_UP_MOVE( 1, MOVE_WRAP), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_ASTONISH), + LEVEL_UP_MOVE( 1, MOVE_CONFUSION), + LEVEL_UP_MOVE( 4, MOVE_GROWL), + LEVEL_UP_MOVE( 7, MOVE_ASTONISH), + LEVEL_UP_MOVE(10, MOVE_CONFUSION), + LEVEL_UP_MOVE(13, MOVE_YAWN), + LEVEL_UP_MOVE(16, MOVE_PSYWAVE), + LEVEL_UP_MOVE(19, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(22, MOVE_EXTRASENSORY), + LEVEL_UP_MOVE(27, MOVE_HEAL_BELL), + LEVEL_UP_MOVE(32, MOVE_UPROAR), + LEVEL_UP_MOVE(37, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(42, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(47, MOVE_HEAL_PULSE), + LEVEL_UP_MOVE(52, MOVE_SYNCHRONOISE), + LEVEL_UP_MOVE(57, MOVE_HEALING_WISH), + LEVEL_UP_END }; diff --git a/src/data/text/abilities.h b/src/data/text/abilities.h index 093119726d..11b6ffaf7f 100644 --- a/src/data/text/abilities.h +++ b/src/data/text/abilities.h @@ -1,7 +1,7 @@ static const u8 sNoneDescription[] = _("No special ability."); static const u8 sStenchDescription[] = _("Helps repel wild POKéMON."); static const u8 sDrizzleDescription[] = _("Summons rain in battle."); -static const u8 sSpeedBoostDescription[] = _("Gradually boosts SPEED."); +static const u8 sSpeedBoostDescription[] = _("Gradually boosts Speed."); static const u8 sBattleArmorDescription[] = _("Blocks critical hits."); static const u8 sSturdyDescription[] = _("Negates 1-hit KO attacks."); static const u8 sDampDescription[] = _("Prevents self-destruction."); @@ -20,27 +20,27 @@ static const u8 sFlashFireDescription[] = _("Powers up if hit by fire."); static const u8 sShieldDustDescription[] = _("Prevents added effects."); static const u8 sOwnTempoDescription[] = _("Prevents confusion."); static const u8 sSuctionCupsDescription[] = _("Firmly anchors the body."); -static const u8 sIntimidateDescription[] = _("Lowers the foe's ATTACK."); +static const u8 sIntimidateDescription[] = _("Lowers the foe's Attack."); static const u8 sShadowTagDescription[] = _("Prevents the foe's escape."); static const u8 sRoughSkinDescription[] = _("Hurts to touch."); static const u8 sWonderGuardDescription[] = _("“Super effective†hits."); -static const u8 sLevitateDescription[] = _("Not hit by GROUND attacks."); +static const u8 sLevitateDescription[] = _("Not hit by Ground attacks."); static const u8 sEffectSporeDescription[] = _("Leaves spores on contact."); static const u8 sSynchronizeDescription[] = _("Passes on status problems."); static const u8 sClearBodyDescription[] = _("Prevents ability reduction."); static const u8 sNaturalCureDescription[] = _("Heals upon switching out."); static const u8 sLightningRodDescription[] = _("Draws electrical moves."); static const u8 sSereneGraceDescription[] = _("Promotes added effects."); -static const u8 sSwiftSwimDescription[] = _("Raises SPEED in rain."); -static const u8 sChlorophyllDescription[] = _("Raises SPEED in sunshine."); +static const u8 sSwiftSwimDescription[] = _("Raises Speed in rain."); +static const u8 sChlorophyllDescription[] = _("Raises Speed in sunshine."); static const u8 sIlluminateDescription[] = _("Encounter rate increases."); static const u8 sTraceDescription[] = _("Copies special ability."); -static const u8 sHugePowerDescription[] = _("Raises ATTACK."); +static const u8 sHugePowerDescription[] = _("Raises Attack."); static const u8 sPoisonPointDescription[] = _("Poisons foe on contact."); static const u8 sInnerFocusDescription[] = _("Prevents flinching."); static const u8 sMagmaArmorDescription[] = _("Prevents freezing."); static const u8 sWaterVeilDescription[] = _("Prevents burns."); -static const u8 sMagnetPullDescription[] = _("Traps STEEL-type POKéMON."); +static const u8 sMagnetPullDescription[] = _("Traps Steel-type POKéMON."); static const u8 sSoundproofDescription[] = _("Avoids sound-based moves."); static const u8 sRainDishDescription[] = _("Slight HP recovery in rain."); static const u8 sSandStreamDescription[] = _("Summons a sandstorm."); @@ -50,116 +50,418 @@ static const u8 sEarlyBirdDescription[] = _("Awakens quickly from sleep."); static const u8 sFlameBodyDescription[] = _("Burns the foe on contact."); static const u8 sRunAwayDescription[] = _("Makes escaping easier."); static const u8 sKeenEyeDescription[] = _("Prevents loss of accuracy."); -static const u8 sHyperCutterDescription[] = _("Prevents ATTACK reduction."); +static const u8 sHyperCutterDescription[] = _("Prevents Attack reduction."); static const u8 sPickupDescription[] = _("May pick up items."); static const u8 sTruantDescription[] = _("Moves only every two turns."); static const u8 sHustleDescription[] = _("Trades accuracy for power."); static const u8 sCuteCharmDescription[] = _("Infatuates on contact."); -static const u8 sPlusDescription[] = _("Powers up with MINUS."); -static const u8 sMinusDescription[] = _("Powers up with PLUS."); +static const u8 sPlusDescription[] = _("Powers up with Minus."); +static const u8 sMinusDescription[] = _("Powers up with Plus."); static const u8 sForecastDescription[] = _("Changes with the weather."); static const u8 sStickyHoldDescription[] = _("Prevents item theft."); static const u8 sShedSkinDescription[] = _("Heals the body by shedding."); -static const u8 sGutsDescription[] = _("Ups ATTACK if suffering."); -static const u8 sMarvelScaleDescription[] = _("Ups DEFENSE if suffering."); +static const u8 sGutsDescription[] = _("Ups Attack if suffering."); +static const u8 sMarvelScaleDescription[] = _("Ups Defense if suffering."); static const u8 sLiquidOozeDescription[] = _("Draining causes injury."); -static const u8 sOvergrowDescription[] = _("Ups GRASS moves in a pinch."); -static const u8 sBlazeDescription[] = _("Ups FIRE moves in a pinch."); -static const u8 sTorrentDescription[] = _("Ups WATER moves in a pinch."); -static const u8 sSwarmDescription[] = _("Ups BUG moves in a pinch."); +static const u8 sOvergrowDescription[] = _("Ups Grass moves in a pinch."); +static const u8 sBlazeDescription[] = _("Ups Fire moves in a pinch."); +static const u8 sTorrentDescription[] = _("Ups Water moves in a pinch."); +static const u8 sSwarmDescription[] = _("Ups Bug moves in a pinch."); static const u8 sRockHeadDescription[] = _("Prevents recoil damage."); static const u8 sDroughtDescription[] = _("Summons sunlight in battle."); static const u8 sArenaTrapDescription[] = _("Prevents fleeing."); static const u8 sVitalSpiritDescription[] = _("Prevents sleep."); static const u8 sWhiteSmokeDescription[] = _("Prevents ability reduction."); -static const u8 sPurePowerDescription[] = _("Raises ATTACK."); +static const u8 sPurePowerDescription[] = _("Raises Attack."); static const u8 sShellArmorDescription[] = _("Blocks critical hits."); static const u8 sCacophonyDescription[] = _("Avoids sound-based moves."); static const u8 sAirLockDescription[] = _("Negates weather effects."); +static const u8 sTangledFeetDescription[] = _("Ups evasion if confused."); +static const u8 sMotorDriveDescription[] = _("Electricity raises Speed."); +static const u8 sRivalryDescription[] = _("Powers up against rivals."); +static const u8 sSteadfastDescription[] = _("Flinching raises Speed."); +static const u8 sSnowCloakDescription[] = _("Ups evasion in Hail."); +static const u8 sGluttonyDescription[] = _("Eats Berries early."); +static const u8 sAngerPointDescription[] = _("Critical hits raise Attack."); +static const u8 sUnburdenDescription[] = _("Using a hold item ups Speed."); +static const u8 sHeatproofDescription[] = _("Heat and burn protection."); +static const u8 sSimpleDescription[] = _("Prone to wild stat changes."); +static const u8 sDrySkinDescription[] = _("Prefers moisture to heat."); +static const u8 sDownloadDescription[] = _("Adjusts power favorably."); +static const u8 sIronFistDescription[] = _("Boosts punching moves."); +static const u8 sPoisonHealDescription[] = _("Restores HP if poisoned."); +static const u8 sAdaptabilityDescription[] = _("Boosts same type attacks."); +static const u8 sSkillLinkDescription[] = _("Multi-hit moves hit 5 times."); +static const u8 sHydrationDescription[] = _("Cures status in rain."); +static const u8 sSolarPowerDescription[] = _("Powers up in sunshine."); +static const u8 sQuickFeetDescription[] = _("Ups Speed if suffering."); +static const u8 sNormalizeDescription[] = _("Moves become Normal-type."); +static const u8 sSniperDescription[] = _("Boosts critical hits."); +static const u8 sMagicGuardDescription[] = _("Only damaged by attacks."); +static const u8 sNoGuardDescription[] = _("Ensures that all moves hit."); +static const u8 sStallDescription[] = _("Always moves last."); +static const u8 sTechnicianDescription[] = _("Boosts weaker moves."); +static const u8 sLeafGuardDescription[] = _("Blocks status in sunshine."); +static const u8 sKlutzDescription[] = _("Can't use hold items."); +static const u8 sMoldBreakerDescription[] = _("Moves hit through abilities."); +static const u8 sSuperLuckDescription[] = _("Critical hits land often."); +static const u8 sAftermathDescription[] = _("Fainting damages the foe."); +static const u8 sAnticipationDescription[] = _("Senses dangerous moves."); +static const u8 sForewarnDescription[] = _("Determines a foe's move."); +static const u8 sUnawareDescription[] = _("Ignores stat changes."); +static const u8 sTintedLensDescription[] = _("Ups “not very effective“."); +static const u8 sFilterDescription[] = _("Weakens “super effective.“."); +static const u8 sSlowStartDescription[] = _("Takes a while to get going."); +static const u8 sScrappyDescription[] = _("Hits Ghost-type Pokémon."); +static const u8 sStormDrainDescription[] = _("Draws in Water moves."); +static const u8 sIceBodyDescription[] = _("Slight HP recovery in Hail."); +static const u8 sSnowWarningDescription[] = _("Summons a hailstorm."); +static const u8 sHoneyGatherDescription[] = _("May gather Honey."); +static const u8 sFriskDescription[] = _("Checks a foe's item."); +static const u8 sRecklessDescription[] = _("Boosts moves with recoil."); +static const u8 sMultitypeDescription[] = _("Changes type to its Plate."); +static const u8 sFlowerGiftDescription[] = _("Transforms in sunshine."); +static const u8 sBadDreamsDescription[] = _("Damages sleeping Pokémon."); +static const u8 sPickpocketDescription[] = _("Steals the foe's held item."); +static const u8 sSheerForceDescription[] = _("Trades effects for power."); +static const u8 sContraryDescription[] = _("Inverts stat changes."); +static const u8 sUnnerveDescription[] = _("Foes can't eat Berries."); +static const u8 sDefiantDescription[] = _("Lowered stats up Attack."); +static const u8 sDefeatistDescription[] = _("Gives up at half HP."); +static const u8 sCursedBodyDescription[] = _("Disables moves on contact."); +static const u8 sHealerDescription[] = _("Heals partner Pokémon."); +static const u8 sFriendGuardDescription[] = _("Lowers damage to partner."); +static const u8 sWeakArmorDescription[] = _("Its stats change when hit."); +static const u8 sHeavyMetalDescription[] = _("Doubles weight."); +static const u8 sLightMetalDescription[] = _("Halves weight."); +static const u8 sMultiscaleDescription[] = _("Halves damage at full HP."); +static const u8 sToxicBoostDescription[] = _("Ups Attack if poisoned."); +static const u8 sFlareBoostDescription[] = _("Ups Sp. Atk if burned."); +static const u8 sHarvestDescription[] = _("May recycle a used Berry."); +static const u8 sTelepathyDescription[] = _("Can't be damaged by an ally."); +static const u8 sMoodyDescription[] = _("Stats change gradually."); +static const u8 sOvercoatDescription[] = _("Blocks weather and powder."); +static const u8 sBigPecksDescription[] = _("Prevents Defense loss."); +static const u8 sSandRushDescription[] = _("Ups Speed in a sandstorm."); +static const u8 sWonderSkinDescription[] = _("May avoid status problems."); +static const u8 sAnalyticDescription[] = _("Moving last boosts power."); +static const u8 sIllusionDescription[] = _("Appears as a partner."); +static const u8 sImposterDescription[] = _("Transforms into the foe."); +static const u8 sInfiltratorDescription[] = _("Passes through barriers."); +static const u8 sMummyDescription[] = _("Spreads with contact."); +static const u8 sMoxieDescription[] = _("KOs raise Attack."); +static const u8 sJustifiedDescription[] = _("Dark hits raise Attack."); +static const u8 sRattledDescription[] = _("Raises Speed when scared."); +static const u8 sMagicBounceDescription[] = _("Reflects status moves."); +static const u8 sSapSipperDescription[] = _("Grass increases Attack."); +static const u8 sPranksterDescription[] = _("Status moves go first."); +static const u8 sSandForceDescription[] = _("Powers up in a sandstorm."); +static const u8 sZenModeDescription[] = _("Transforms at half HP."); +static const u8 sVictoryStarDescription[] = _("Raises party accuracy."); +static const u8 sAromaVeilDescription[] = _("Prevents limiting of moves."); +static const u8 sFlowerVeilDescription[] = _("Protects Grass-types."); +static const u8 sCheekPouchDescription[] = _("Eating Berries restores HP."); +static const u8 sProteanDescription[] = _("Changes type to used move."); +static const u8 sFurCoatDescription[] = _("Raises Defense."); +static const u8 sBulletproofDescription[] = _("Avoids some projectiles."); +static const u8 sCompetitiveDescription[] = _("Lowered stats up Sp. Atk."); +static const u8 sStrongJawDescription[] = _("Boosts biting moves."); +static const u8 sRefrigerateDescription[] = _("Normal moves become Ice."); +static const u8 sSweetVeilDescription[] = _("Prevents party from sleep."); +static const u8 sStanceChangeDescription[] = _("Transforms as it battles."); +static const u8 sGaleWingsDescription[] = _("Flying moves go first."); +static const u8 sMegaLauncherDescription[] = _("Boosts pulse moves."); +static const u8 sGrassPeltDescription[] = _("Ups Defense in grass."); +static const u8 sSymbiosisDescription[] = _("Passes its item to an ally."); +static const u8 sToughClawsDescription[] = _("Boosts contact moves."); +static const u8 sPixilateDescription[] = _("Normal moves become Fairy."); +static const u8 sGooeyDescription[] = _("Lowers Speed on contact."); +static const u8 sAerilateDescription[] = _("Normal moves become Flying."); +static const u8 sParentalBondDescription[] = _("Moves hit twice."); +static const u8 sDarkAuraDescription[] = _("Boosts Dark moves."); +static const u8 sFairyAuraDescription[] = _("Boosts Fairy moves."); +static const u8 sAuraBreakDescription[] = _("Reverse aura abilities."); +static const u8 sPrimordialSeaDescription[] = _("Summons heavy rain."); +static const u8 sDesolateLandDescription[] = _("Summons intense sunlight."); +static const u8 sDeltaStreamDescription[] = _("Summons strong winds."); +static const u8 sStaminaDescription[] = _("Boosts Defense when hit."); +static const u8 sWimpOutDescription[] = _("Flees at half HP."); +static const u8 sWaterCompactionDescription[] = _("Water boosts Defense."); +static const u8 sMercilessDescription[] = _("Criticals poisoned foes."); +static const u8 sShieldsDownDescription[] = _("Shell breaks at half HP."); +static const u8 sStakeoutDescription[] = _("Stronger as foes switch in."); +static const u8 sWaterBubbleDescription[] = _("Guards from fire and burns."); +static const u8 sSteelworkerDescription[] = _("Powers up Steel moves."); +static const u8 sBerserkDescription[] = _("Boosts Sp. Atk at low HP."); +static const u8 sSlushRushDescription[] = _("Raises Speed in hail."); +static const u8 sLongReachDescription[] = _("Never makes contact."); +static const u8 sLiquidVoiceDescription[] = _("Makes sound moves Water."); +static const u8 sTriageDescription[] = _("Healing moves go first."); +static const u8 sGalvanizeDescription[] = _("Normal moves turn Electric."); +static const u8 sSurgeSurferDescription[] = _("Faster on electricity."); +static const u8 sSchoolingDescription[] = _("Forms a school when strong."); +static const u8 sDisguiseDescription[] = _("Decoy protects it once."); +static const u8 sBattleBondDescription[] = _("Changes form after a KO."); +static const u8 sPowerConstructDescription[] = _("Cells aid it when weakened."); +static const u8 sCorrosionDescription[] = _("Poisons any type."); +static const u8 sComatoseDescription[] = _("Always drowsing."); +static const u8 sQueenlyMajestyDescription[] = _("Protects from priority."); +static const u8 sInnardsOutDescription[] = _("Hurts foe when defeated."); +static const u8 sDancerDescription[] = _("Dances along with others."); +static const u8 sBatteryDescription[] = _("Boosts ally's Sp. Atk."); +static const u8 sFluffyDescription[] = _("Tougher but flammable."); +static const u8 sSoulHeartDescription[] = _("KOs raise Sp. Atk."); +static const u8 sTanglingHairDescription[] = _("Contact lowers Speed."); +static const u8 sReceiverDescription[] = _("Copies ally's ability."); +static const u8 sBeastBoostDescription[] = _("KOs boost best stat."); +static const u8 sRKSSystemDescription[] = _("Memories change its type."); +static const u8 sElectricSurgeDescription[] = _("Field becomes Electric."); +static const u8 sPsychicSurgeDescription[] = _("Field becomes weird."); +static const u8 sMistySurgeDescription[] = _("Field becomes misty."); +static const u8 sGrassySurgeDescription[] = _("Field becomes grassy."); +static const u8 sFullMetalBodyDescription[] = _("Prevents stat reduction."); +static const u8 sNeuroforceDescription[] = _("Ups “super effective.“."); -const u8 gAbilityNames[ABILITIES_COUNT][ABILITY_NAME_LENGTH + 1] = +const u8 gAbilityNames[ABILITIES_COUNT_GEN7][ABILITY_NAME_LENGTH + 1] = { [ABILITY_NONE] = _("-------"), - [ABILITY_STENCH] = _("STENCH"), - [ABILITY_DRIZZLE] = _("DRIZZLE"), - [ABILITY_SPEED_BOOST] = _("SPEED BOOST"), - [ABILITY_BATTLE_ARMOR] = _("BATTLE ARMOR"), - [ABILITY_STURDY] = _("STURDY"), - [ABILITY_DAMP] = _("DAMP"), - [ABILITY_LIMBER] = _("LIMBER"), - [ABILITY_SAND_VEIL] = _("SAND VEIL"), - [ABILITY_STATIC] = _("STATIC"), - [ABILITY_VOLT_ABSORB] = _("VOLT ABSORB"), - [ABILITY_WATER_ABSORB] = _("WATER ABSORB"), - [ABILITY_OBLIVIOUS] = _("OBLIVIOUS"), - [ABILITY_CLOUD_NINE] = _("CLOUD NINE"), - [ABILITY_COMPOUND_EYES] = _("COMPOUNDEYES"), - [ABILITY_INSOMNIA] = _("INSOMNIA"), - [ABILITY_COLOR_CHANGE] = _("COLOR CHANGE"), - [ABILITY_IMMUNITY] = _("IMMUNITY"), - [ABILITY_FLASH_FIRE] = _("FLASH FIRE"), - [ABILITY_SHIELD_DUST] = _("SHIELD DUST"), - [ABILITY_OWN_TEMPO] = _("OWN TEMPO"), - [ABILITY_SUCTION_CUPS] = _("SUCTION CUPS"), - [ABILITY_INTIMIDATE] = _("INTIMIDATE"), - [ABILITY_SHADOW_TAG] = _("SHADOW TAG"), - [ABILITY_ROUGH_SKIN] = _("ROUGH SKIN"), - [ABILITY_WONDER_GUARD] = _("WONDER GUARD"), - [ABILITY_LEVITATE] = _("LEVITATE"), - [ABILITY_EFFECT_SPORE] = _("EFFECT SPORE"), - [ABILITY_SYNCHRONIZE] = _("SYNCHRONIZE"), - [ABILITY_CLEAR_BODY] = _("CLEAR BODY"), - [ABILITY_NATURAL_CURE] = _("NATURAL CURE"), - [ABILITY_LIGHTNING_ROD] = _("LIGHTNINGROD"), - [ABILITY_SERENE_GRACE] = _("SERENE GRACE"), - [ABILITY_SWIFT_SWIM] = _("SWIFT SWIM"), - [ABILITY_CHLOROPHYLL] = _("CHLOROPHYLL"), - [ABILITY_ILLUMINATE] = _("ILLUMINATE"), - [ABILITY_TRACE] = _("TRACE"), - [ABILITY_HUGE_POWER] = _("HUGE POWER"), - [ABILITY_POISON_POINT] = _("POISON POINT"), - [ABILITY_INNER_FOCUS] = _("INNER FOCUS"), - [ABILITY_MAGMA_ARMOR] = _("MAGMA ARMOR"), - [ABILITY_WATER_VEIL] = _("WATER VEIL"), - [ABILITY_MAGNET_PULL] = _("MAGNET PULL"), - [ABILITY_SOUNDPROOF] = _("SOUNDPROOF"), - [ABILITY_RAIN_DISH] = _("RAIN DISH"), - [ABILITY_SAND_STREAM] = _("SAND STREAM"), + [ABILITY_STENCH] = _("Stench"), + [ABILITY_DRIZZLE] = _("Drizzle"), + [ABILITY_SPEED_BOOST] = _("Speed Boost"), + [ABILITY_BATTLE_ARMOR] = _("Battle Armor"), + [ABILITY_STURDY] = _("Sturdy"), + [ABILITY_DAMP] = _("Damp"), + [ABILITY_LIMBER] = _("Limber"), + [ABILITY_SAND_VEIL] = _("Sand Veil"), + [ABILITY_STATIC] = _("Static"), + [ABILITY_VOLT_ABSORB] = _("Volt Absorb"), + [ABILITY_WATER_ABSORB] = _("Water Absorb"), + [ABILITY_OBLIVIOUS] = _("Oblivious"), + [ABILITY_CLOUD_NINE] = _("Cloud Nine"), + [ABILITY_COMPOUND_EYES] = _("CompoundEyes"), + [ABILITY_INSOMNIA] = _("Insomnia"), + [ABILITY_COLOR_CHANGE] = _("Color Change"), + [ABILITY_IMMUNITY] = _("Immunity"), + [ABILITY_FLASH_FIRE] = _("Flash Fire"), + [ABILITY_SHIELD_DUST] = _("Shield Dust"), + [ABILITY_OWN_TEMPO] = _("Own Tempo"), + [ABILITY_SUCTION_CUPS] = _("Suction Cups"), + [ABILITY_INTIMIDATE] = _("Intimidate"), + [ABILITY_SHADOW_TAG] = _("Shadow Tag"), + [ABILITY_ROUGH_SKIN] = _("Rough Skin"), + [ABILITY_WONDER_GUARD] = _("Wonder Guard"), + [ABILITY_LEVITATE] = _("Levitate"), + [ABILITY_EFFECT_SPORE] = _("Effect Spore"), + [ABILITY_SYNCHRONIZE] = _("Synchronize"), + [ABILITY_CLEAR_BODY] = _("Clear Body"), + [ABILITY_NATURAL_CURE] = _("Natural Cure"), + [ABILITY_LIGHTNING_ROD] = _("Lightningrod"), + [ABILITY_SERENE_GRACE] = _("Serene Grace"), + [ABILITY_SWIFT_SWIM] = _("Swift Swim"), + [ABILITY_CHLOROPHYLL] = _("Chlorophyll"), + [ABILITY_ILLUMINATE] = _("Illuminate"), + [ABILITY_TRACE] = _("Trace"), + [ABILITY_HUGE_POWER] = _("Huge Power"), + [ABILITY_POISON_POINT] = _("Poison Point"), + [ABILITY_INNER_FOCUS] = _("Inner Focus"), + [ABILITY_MAGMA_ARMOR] = _("Magma Armor"), + [ABILITY_WATER_VEIL] = _("Water Veil"), + [ABILITY_MAGNET_PULL] = _("Magnet Pull"), + [ABILITY_SOUNDPROOF] = _("Soundproof"), + [ABILITY_RAIN_DISH] = _("Rain Dish"), + [ABILITY_SAND_STREAM] = _("Sand Stream"), [ABILITY_PRESSURE] = _("PRESSURE"), - [ABILITY_THICK_FAT] = _("THICK FAT"), - [ABILITY_EARLY_BIRD] = _("EARLY BIRD"), - [ABILITY_FLAME_BODY] = _("FLAME BODY"), - [ABILITY_RUN_AWAY] = _("RUN AWAY"), - [ABILITY_KEEN_EYE] = _("KEEN EYE"), - [ABILITY_HYPER_CUTTER] = _("HYPER CUTTER"), - [ABILITY_PICKUP] = _("PICKUP"), - [ABILITY_TRUANT] = _("TRUANT"), - [ABILITY_HUSTLE] = _("HUSTLE"), - [ABILITY_CUTE_CHARM] = _("CUTE CHARM"), - [ABILITY_PLUS] = _("PLUS"), - [ABILITY_MINUS] = _("MINUS"), - [ABILITY_FORECAST] = _("FORECAST"), - [ABILITY_STICKY_HOLD] = _("STICKY HOLD"), - [ABILITY_SHED_SKIN] = _("SHED SKIN"), - [ABILITY_GUTS] = _("GUTS"), - [ABILITY_MARVEL_SCALE] = _("MARVEL SCALE"), - [ABILITY_LIQUID_OOZE] = _("LIQUID OOZE"), - [ABILITY_OVERGROW] = _("OVERGROW"), - [ABILITY_BLAZE] = _("BLAZE"), - [ABILITY_TORRENT] = _("TORRENT"), - [ABILITY_SWARM] = _("SWARM"), - [ABILITY_ROCK_HEAD] = _("ROCK HEAD"), - [ABILITY_DROUGHT] = _("DROUGHT"), - [ABILITY_ARENA_TRAP] = _("ARENA TRAP"), - [ABILITY_VITAL_SPIRIT] = _("VITAL SPIRIT"), - [ABILITY_WHITE_SMOKE] = _("WHITE SMOKE"), - [ABILITY_PURE_POWER] = _("PURE POWER"), - [ABILITY_SHELL_ARMOR] = _("SHELL ARMOR"), - [ABILITY_CACOPHONY] = _("CACOPHONY"), - [ABILITY_AIR_LOCK] = _("AIR LOCK"), + [ABILITY_THICK_FAT] = _("Thick Fat"), + [ABILITY_EARLY_BIRD] = _("Early Bird"), + [ABILITY_FLAME_BODY] = _("Flame Body"), + [ABILITY_RUN_AWAY] = _("Run Away"), + [ABILITY_KEEN_EYE] = _("Keen Eye"), + [ABILITY_HYPER_CUTTER] = _("Hyper Cutter"), + [ABILITY_PICKUP] = _("Pickup"), + [ABILITY_TRUANT] = _("Truant"), + [ABILITY_HUSTLE] = _("Hustle"), + [ABILITY_CUTE_CHARM] = _("Cute Charm"), + [ABILITY_PLUS] = _("Plus"), + [ABILITY_MINUS] = _("Minus"), + [ABILITY_FORECAST] = _("Forecast"), + [ABILITY_STICKY_HOLD] = _("Sticky Hold"), + [ABILITY_SHED_SKIN] = _("Shed Skin"), + [ABILITY_GUTS] = _("Guts"), + [ABILITY_MARVEL_SCALE] = _("Marvel Scale"), + [ABILITY_LIQUID_OOZE] = _("Liquid Ooze"), + [ABILITY_OVERGROW] = _("Overgrow"), + [ABILITY_BLAZE] = _("Blaze"), + [ABILITY_TORRENT] = _("Torrent"), + [ABILITY_SWARM] = _("Swarm"), + [ABILITY_ROCK_HEAD] = _("Rock Head"), + [ABILITY_DROUGHT] = _("Drought"), + [ABILITY_ARENA_TRAP] = _("Arena Trap"), + [ABILITY_VITAL_SPIRIT] = _("Vital Spirit"), + [ABILITY_WHITE_SMOKE] = _("White Smoke"), + [ABILITY_PURE_POWER] = _("Pure Power"), + [ABILITY_SHELL_ARMOR] = _("Shell Armor"), + [ABILITY_CACOPHONY] = _("Cacophony"), + [ABILITY_AIR_LOCK] = _("Air Lock"), + [ABILITY_TANGLED_FEET] = _("Tangled Feet"), + [ABILITY_MOTOR_DRIVE] = _("Motor Drive"), + [ABILITY_RIVALRY] = _("Rivalry"), + [ABILITY_STEADFAST] = _("Steadfast"), + [ABILITY_SNOW_CLOAK] = _("Snow Cloak"), + [ABILITY_GLUTTONY] = _("Gluttony"), + [ABILITY_ANGER_POINT] = _("Anger Point"), + [ABILITY_UNBURDEN] = _("Unburden"), + [ABILITY_HEATPROOF] = _("Heatproof"), + [ABILITY_SIMPLE] = _("Simple"), + [ABILITY_DRY_SKIN] = _("Dry Skin"), + [ABILITY_DOWNLOAD] = _("Download"), + [ABILITY_IRON_FIST] = _("Iron Fist"), + [ABILITY_POISON_HEAL] = _("Poison Heal"), + [ABILITY_ADAPTABILITY] = _("Adaptability"), + [ABILITY_SKILL_LINK] = _("Skill Link"), + [ABILITY_HYDRATION] = _("Hydration"), + [ABILITY_SOLAR_POWER] = _("Solar Power"), + [ABILITY_QUICK_FEET] = _("Quick Feet"), + [ABILITY_NORMALIZE] = _("Normalize"), + [ABILITY_SNIPER] = _("Sniper"), + [ABILITY_MAGIC_GUARD] = _("Magic Guard"), + [ABILITY_NO_GUARD] = _("No Guard"), + [ABILITY_STALL] = _("Stall"), + [ABILITY_TECHNICIAN] = _("Technician"), + [ABILITY_LEAF_GUARD] = _("Leaf Guard"), + [ABILITY_KLUTZ] = _("Klutz"), + [ABILITY_MOLD_BREAKER] = _("Mold Breaker"), + [ABILITY_SUPER_LUCK] = _("Super Luck"), + [ABILITY_AFTERMATH] = _("Aftermath"), + [ABILITY_ANTICIPATION] = _("Anticipation"), + [ABILITY_FOREWARN] = _("Forewarn"), + [ABILITY_UNAWARE] = _("Unaware"), + [ABILITY_TINTED_LENS] = _("Tinted Lens"), + [ABILITY_FILTER] = _("Filter"), + [ABILITY_SLOW_START] = _("Slow Start"), + [ABILITY_SCRAPPY] = _("Scrappy"), + [ABILITY_STORM_DRAIN] = _("Storm Drain"), + [ABILITY_ICE_BODY] = _("Ice Body"), + [ABILITY_SOLID_ROCK] = _("Solid Rock"), + [ABILITY_SNOW_WARNING] = _("Snow Warning"), + [ABILITY_HONEY_GATHER] = _("Honey Gather"), + [ABILITY_FRISK] = _("Frisk"), + [ABILITY_RECKLESS] = _("Reckless"), + [ABILITY_MULTITYPE] = _("Multitype"), + [ABILITY_FLOWER_GIFT] = _("Flower Gift"), + [ABILITY_BAD_DREAMS] = _("Bad Dreams"), + [ABILITY_PICKPOCKET] = _("Pickpocket"), + [ABILITY_SHEER_FORCE] = _("Sheer Force"), + [ABILITY_CONTRARY] = _("Contrary"), + [ABILITY_UNNERVE] = _("Unnerve"), + [ABILITY_DEFIANT] = _("Defiant"), + [ABILITY_DEFEATIST] = _("Defeatist"), + [ABILITY_CURSED_BODY] = _("Cursed Body"), + [ABILITY_HEALER] = _("Healer"), + [ABILITY_FRIEND_GUARD] = _("Friend Guard"), + [ABILITY_WEAK_ARMOR] = _("Weak Armor"), + [ABILITY_HEAVY_METAL] = _("Heavy Metal"), + [ABILITY_LIGHT_METAL] = _("Light Metal"), + [ABILITY_MULTISCALE] = _("Multiscale"), + [ABILITY_TOXIC_BOOST] = _("Toxic Boost"), + [ABILITY_FLARE_BOOST] = _("Flare Boost"), + [ABILITY_HARVEST] = _("Harvest"), + [ABILITY_TELEPATHY] = _("Telepathy"), + [ABILITY_MOODY] = _("Moody"), + [ABILITY_OVERCOAT] = _("Overcoat"), + [ABILITY_POISON_TOUCH] = _("Poison Touch"), + [ABILITY_REGENERATOR] = _("Regenerator"), + [ABILITY_BIG_PECKS] = _("Big Pecks"), + [ABILITY_SAND_RUSH] = _("Sand Rush"), + [ABILITY_WONDER_SKIN] = _("Wonder Skin"), + [ABILITY_ANALYTIC] = _("Analytic"), + [ABILITY_ILLUSION] = _("Illusion"), + [ABILITY_IMPOSTER] = _("Imposter"), + [ABILITY_INFILTRATOR] = _("Infiltrator"), + [ABILITY_MUMMY] = _("Mummy"), + [ABILITY_MOXIE] = _("Moxie"), + [ABILITY_JUSTIFIED] = _("Justified"), + [ABILITY_RATTLED] = _("Rattled"), + [ABILITY_MAGIC_BOUNCE] = _("Magic Bounce"), + [ABILITY_SAP_SIPPER] = _("Sap Sipper"), + [ABILITY_PRANKSTER] = _("Prankster"), + [ABILITY_SAND_FORCE] = _("Sand Force"), + [ABILITY_IRON_BARBS] = _("Iron Barbs"), + [ABILITY_ZEN_MODE] = _("Zen Mode"), + [ABILITY_VICTORY_STAR] = _("Victory Star"), + [ABILITY_TURBOBLAZE] = _("Turboblaze"), + [ABILITY_TERAVOLT] = _("Teravolt"), + [ABILITY_AROMA_VEIL] = _("Aroma Veil"), + [ABILITY_FLOWER_VEIL] = _("Flower Veil"), + [ABILITY_CHEEK_POUCH] = _("Cheek Pouch"), + [ABILITY_PROTEAN] = _("Protean"), + [ABILITY_FUR_COAT] = _("Fur Coat"), + [ABILITY_MAGICIAN] = _("Magician"), + [ABILITY_BULLETPROOF] = _("Bulletproof"), + [ABILITY_COMPETITIVE] = _("Competitive"), + [ABILITY_STRONG_JAW] = _("Strong Jaw"), + [ABILITY_REFRIGERATE] = _("Refrigerate"), + [ABILITY_SWEET_VEIL] = _("Sweet Veil"), + [ABILITY_STANCE_CHANGE] = _("StanceChange"), + [ABILITY_GALE_WINGS] = _("Gale Wings"), + [ABILITY_MEGA_LAUNCHER] = _("MegaLauncher"), + [ABILITY_GRASS_PELT] = _("Grass Pelt"), + [ABILITY_SYMBIOSIS] = _("Symbiosis"), + [ABILITY_TOUGH_CLAWS] = _("Tough Claws"), + [ABILITY_PIXILATE] = _("Pixilate"), + [ABILITY_GOOEY] = _("Gooey"), + [ABILITY_AERILATE] = _("Aerilate"), + [ABILITY_PARENTAL_BOND] = _("ParentalBond"), + [ABILITY_DARK_AURA] = _("Dark Aura"), + [ABILITY_FAIRY_AURA] = _("Fairy Aura"), + [ABILITY_AURA_BREAK] = _("Aura Break"), + [ABILITY_PRIMORDIAL_SEA] = _("Primordial S"), + [ABILITY_DESOLATE_LAND] = _("DesolateLand"), + [ABILITY_DELTA_STREAM] = _("Delta Stream"), + [ABILITY_STAMINA] = _("Stamina"), + [ABILITY_WIMP_OUT] = _("Wimp Out"), + [ABILITY_EMERGENCY_EXIT] = _("Emergency Ex"), + [ABILITY_WATER_COMPACTION] = _("Water Compac"), + [ABILITY_MERCILESS] = _("Merciless"), + [ABILITY_SHIELDS_DOWN] = _("Shields Down"), + [ABILITY_STAKEOUT] = _("Stakeout"), + [ABILITY_WATER_BUBBLE] = _("Water Bubble"), + [ABILITY_STEELWORKER] = _("Steelworker"), + [ABILITY_BERSERK] = _("Berserk"), + [ABILITY_SLUSH_RUSH] = _("Slush Rush"), + [ABILITY_LONG_REACH] = _("Long Reach"), + [ABILITY_LIQUID_VOICE] = _("Liquid Voice"), + [ABILITY_TRIAGE] = _("Triage"), + [ABILITY_GALVANIZE] = _("Galvanize"), + [ABILITY_SURGE_SURFER] = _("Surge Surfer"), + [ABILITY_SCHOOLING] = _("Schooling"), + [ABILITY_DISGUISE] = _("Disguise"), + [ABILITY_BATTLE_BOND] = _("Battle Bond"), + [ABILITY_POWER_CONSTRUCT] = _("Power Constr"), + [ABILITY_CORROSION] = _("Corrosion"), + [ABILITY_COMATOSE] = _("Comatose"), + [ABILITY_QUEENLY_MAJESTY] = _("QueenMajesty"), + [ABILITY_INNARDS_OUT] = _("Innards Out"), + [ABILITY_DANCER] = _("Dancer"), + [ABILITY_BATTERY] = _("Battery"), + [ABILITY_FLUFFY] = _("Fluffy"), + [ABILITY_DAZZLING] = _("Dazzling"), + [ABILITY_SOUL_HEART] = _("Soul-Heart"), + [ABILITY_TANGLING_HAIR] = _("TanglingHair"), + [ABILITY_RECEIVER] = _("Receiver"), + [ABILITY_POWER_OF_ALCHEMY] = _("Power Of Alc"), + [ABILITY_BEAST_BOOST] = _("Beast Boost"), + [ABILITY_RKS_SYSTEM] = _("RKS System"), + [ABILITY_ELECTRIC_SURGE] = _("Elec Surge"), + [ABILITY_PSYCHIC_SURGE] = _("Psy Surge"), + [ABILITY_MISTY_SURGE] = _("Misty Surge"), + [ABILITY_GRASSY_SURGE] = _("Grassy Surge"), + [ABILITY_FULL_METAL_BODY] = _("FullMetalBod"), + [ABILITY_SHADOW_SHIELD] = _("ShadowShield"), + [ABILITY_PRISM_ARMOR] = _("Prism Armor"), + [ABILITY_NEUROFORCE] = _("Neuroforce"), }; -const u8 *const gAbilityDescriptionPointers[ABILITIES_COUNT] = +const u8 *const gAbilityDescriptionPointers[ABILITIES_COUNT_GEN7] = { [ABILITY_NONE] = sNoneDescription, [ABILITY_STENCH] = sStenchDescription, @@ -239,4 +541,161 @@ const u8 *const gAbilityDescriptionPointers[ABILITIES_COUNT] = [ABILITY_SHELL_ARMOR] = sShellArmorDescription, [ABILITY_CACOPHONY] = sCacophonyDescription, [ABILITY_AIR_LOCK] = sAirLockDescription, + [ABILITY_TANGLED_FEET] = sTangledFeetDescription, + [ABILITY_MOTOR_DRIVE] = sMotorDriveDescription, + [ABILITY_RIVALRY] = sRivalryDescription, + [ABILITY_STEADFAST] = sSteadfastDescription, + [ABILITY_SNOW_CLOAK] = sSnowCloakDescription, + [ABILITY_GLUTTONY] = sGluttonyDescription, + [ABILITY_ANGER_POINT] = sAngerPointDescription, + [ABILITY_UNBURDEN] = sUnburdenDescription, + [ABILITY_HEATPROOF] = sHeatproofDescription, + [ABILITY_SIMPLE] = sSimpleDescription, + [ABILITY_DRY_SKIN] = sDrySkinDescription, + [ABILITY_DOWNLOAD] = sDownloadDescription, + [ABILITY_IRON_FIST] = sIronFistDescription, + [ABILITY_POISON_HEAL] = sPoisonHealDescription, + [ABILITY_ADAPTABILITY] = sAdaptabilityDescription, + [ABILITY_SKILL_LINK] = sSkillLinkDescription, + [ABILITY_HYDRATION] = sHydrationDescription, + [ABILITY_SOLAR_POWER] = sSolarPowerDescription, + [ABILITY_QUICK_FEET] = sQuickFeetDescription, + [ABILITY_NORMALIZE] = sNormalizeDescription, + [ABILITY_SNIPER] = sSniperDescription, + [ABILITY_MAGIC_GUARD] = sMagicGuardDescription, + [ABILITY_NO_GUARD] = sNoGuardDescription, + [ABILITY_STALL] = sStallDescription, + [ABILITY_TECHNICIAN] = sTechnicianDescription, + [ABILITY_LEAF_GUARD] = sLeafGuardDescription, + [ABILITY_KLUTZ] = sKlutzDescription, + [ABILITY_MOLD_BREAKER] = sMoldBreakerDescription, + [ABILITY_SUPER_LUCK] = sSuperLuckDescription, + [ABILITY_AFTERMATH] = sAftermathDescription, + [ABILITY_ANTICIPATION] = sAnticipationDescription, + [ABILITY_FOREWARN] = sForewarnDescription, + [ABILITY_UNAWARE] = sUnawareDescription, + [ABILITY_TINTED_LENS] = sTintedLensDescription, + [ABILITY_FILTER] = sFilterDescription, + [ABILITY_SLOW_START] = sSlowStartDescription, + [ABILITY_SCRAPPY] = sScrappyDescription, + [ABILITY_STORM_DRAIN] = sStormDrainDescription, + [ABILITY_ICE_BODY] = sIceBodyDescription, + [ABILITY_SOLID_ROCK] = sFilterDescription, + [ABILITY_SNOW_WARNING] = sSnowWarningDescription, + [ABILITY_HONEY_GATHER] = sHoneyGatherDescription, + [ABILITY_FRISK] = sFriskDescription, + [ABILITY_RECKLESS] = sRecklessDescription, + [ABILITY_MULTITYPE] = sMultitypeDescription, + [ABILITY_FLOWER_GIFT] = sFlowerGiftDescription, + [ABILITY_BAD_DREAMS] = sBadDreamsDescription, + [ABILITY_PICKPOCKET] = sPickpocketDescription, + [ABILITY_SHEER_FORCE] = sSheerForceDescription, + [ABILITY_CONTRARY] = sContraryDescription, + [ABILITY_UNNERVE] = sUnnerveDescription, + [ABILITY_DEFIANT] = sDefiantDescription, + [ABILITY_DEFEATIST] = sDefeatistDescription, + [ABILITY_CURSED_BODY] = sCursedBodyDescription, + [ABILITY_HEALER] = sHealerDescription, + [ABILITY_FRIEND_GUARD] = sFriendGuardDescription, + [ABILITY_WEAK_ARMOR] = sWeakArmorDescription, + [ABILITY_HEAVY_METAL] = sHeavyMetalDescription, + [ABILITY_LIGHT_METAL] = sLightMetalDescription, + [ABILITY_MULTISCALE] = sMultiscaleDescription, + [ABILITY_TOXIC_BOOST] = sToxicBoostDescription, + [ABILITY_FLARE_BOOST] = sFlareBoostDescription, + [ABILITY_HARVEST] = sHarvestDescription, + [ABILITY_TELEPATHY] = sTelepathyDescription, + [ABILITY_MOODY] = sMoodyDescription, + [ABILITY_OVERCOAT] = sOvercoatDescription, + [ABILITY_POISON_TOUCH] = sPoisonPointDescription, + [ABILITY_REGENERATOR] = sNaturalCureDescription, + [ABILITY_BIG_PECKS] = sBigPecksDescription, + [ABILITY_SAND_RUSH] = sSandRushDescription, + [ABILITY_WONDER_SKIN] = sWonderSkinDescription, + [ABILITY_ANALYTIC] = sAnalyticDescription, + [ABILITY_ILLUSION] = sIllusionDescription, + [ABILITY_IMPOSTER] = sImposterDescription, + [ABILITY_INFILTRATOR] = sInfiltratorDescription, + [ABILITY_MUMMY] = sMummyDescription, + [ABILITY_MOXIE] = sMoxieDescription, + [ABILITY_JUSTIFIED] = sJustifiedDescription, + [ABILITY_RATTLED] = sRattledDescription, + [ABILITY_MAGIC_BOUNCE] = sMagicBounceDescription, + [ABILITY_SAP_SIPPER] = sSapSipperDescription, + [ABILITY_PRANKSTER] = sPranksterDescription, + [ABILITY_SAND_FORCE] = sSandForceDescription, + [ABILITY_IRON_BARBS] = sRoughSkinDescription, + [ABILITY_ZEN_MODE] = sZenModeDescription, + [ABILITY_VICTORY_STAR] = sVictoryStarDescription, + [ABILITY_TURBOBLAZE] = sMoldBreakerDescription, + [ABILITY_TERAVOLT] = sMoldBreakerDescription, + [ABILITY_AROMA_VEIL] = sAromaVeilDescription, + [ABILITY_FLOWER_VEIL] = sFlowerVeilDescription, + [ABILITY_CHEEK_POUCH] = sCheekPouchDescription, + [ABILITY_PROTEAN] = sProteanDescription, + [ABILITY_FUR_COAT] = sFurCoatDescription, + [ABILITY_MAGICIAN] = sPickpocketDescription, + [ABILITY_BULLETPROOF] = sBulletproofDescription, + [ABILITY_COMPETITIVE] = sCompetitiveDescription, + [ABILITY_STRONG_JAW] = sStrongJawDescription, + [ABILITY_REFRIGERATE] = sRefrigerateDescription, + [ABILITY_SWEET_VEIL] = sSweetVeilDescription, + [ABILITY_STANCE_CHANGE] = sStanceChangeDescription, + [ABILITY_GALE_WINGS] = sGaleWingsDescription, + [ABILITY_MEGA_LAUNCHER] = sMegaLauncherDescription, + [ABILITY_GRASS_PELT] = sGrassPeltDescription, + [ABILITY_SYMBIOSIS] = sSymbiosisDescription, + [ABILITY_TOUGH_CLAWS] = sToughClawsDescription, + [ABILITY_PIXILATE] = sPixilateDescription, + [ABILITY_GOOEY] = sGooeyDescription, + [ABILITY_AERILATE] = sAerilateDescription, + [ABILITY_PARENTAL_BOND] = sParentalBondDescription, + [ABILITY_DARK_AURA] = sDarkAuraDescription, + [ABILITY_FAIRY_AURA] = sFairyAuraDescription, + [ABILITY_AURA_BREAK] = sAuraBreakDescription, + [ABILITY_PRIMORDIAL_SEA] = sPrimordialSeaDescription, + [ABILITY_DESOLATE_LAND] = sDesolateLandDescription, + [ABILITY_DELTA_STREAM] = sDeltaStreamDescription, + [ABILITY_STAMINA] = sStaminaDescription, + [ABILITY_WIMP_OUT] = sWimpOutDescription, + [ABILITY_EMERGENCY_EXIT] = sWimpOutDescription, + [ABILITY_WATER_COMPACTION] = sWaterCompactionDescription, + [ABILITY_MERCILESS] = sMercilessDescription, + [ABILITY_SHIELDS_DOWN] = sShieldsDownDescription, + [ABILITY_STAKEOUT] = sStakeoutDescription, + [ABILITY_WATER_BUBBLE] = sWaterBubbleDescription, + [ABILITY_STEELWORKER] = sSteelworkerDescription, + [ABILITY_BERSERK] = sBerserkDescription, + [ABILITY_SLUSH_RUSH] = sSlushRushDescription, + [ABILITY_LONG_REACH] = sLongReachDescription, + [ABILITY_LIQUID_VOICE] = sLiquidVoiceDescription, + [ABILITY_TRIAGE] = sTriageDescription, + [ABILITY_GALVANIZE] = sGalvanizeDescription, + [ABILITY_SURGE_SURFER] = sSurgeSurferDescription, + [ABILITY_SCHOOLING] = sSchoolingDescription, + [ABILITY_DISGUISE] = sDisguiseDescription, + [ABILITY_BATTLE_BOND] = sBattleBondDescription, + [ABILITY_POWER_CONSTRUCT] = sPowerConstructDescription, + [ABILITY_CORROSION] = sCorrosionDescription, + [ABILITY_COMATOSE] = sComatoseDescription, + [ABILITY_QUEENLY_MAJESTY] = sQueenlyMajestyDescription, + [ABILITY_INNARDS_OUT] = sInnardsOutDescription, + [ABILITY_DANCER] = sDancerDescription, + [ABILITY_BATTERY] = sBatteryDescription, + [ABILITY_FLUFFY] = sFluffyDescription, + [ABILITY_DAZZLING] = sQueenlyMajestyDescription, + [ABILITY_SOUL_HEART] = sSoulHeartDescription, + [ABILITY_TANGLING_HAIR] = sGooeyDescription, + [ABILITY_RECEIVER] = sReceiverDescription, + [ABILITY_POWER_OF_ALCHEMY] = sReceiverDescription, + [ABILITY_BEAST_BOOST] = sBeastBoostDescription, + [ABILITY_RKS_SYSTEM] = sRKSSystemDescription, + [ABILITY_ELECTRIC_SURGE] = sElectricSurgeDescription, + [ABILITY_PSYCHIC_SURGE] = sPsychicSurgeDescription, + [ABILITY_MISTY_SURGE] = sMistySurgeDescription, + [ABILITY_GRASSY_SURGE] = sGrassySurgeDescription, + [ABILITY_FULL_METAL_BODY] = sFullMetalBodyDescription, + [ABILITY_SHADOW_SHIELD] = sMultiscaleDescription, + [ABILITY_PRISM_ARMOR] = sFilterDescription, + [ABILITY_NEUROFORCE] = sNeuroforceDescription, }; diff --git a/src/data/text/move_descriptions.h b/src/data/text/move_descriptions.h index 34880f16d2..573c8785f8 100644 --- a/src/data/text/move_descriptions.h +++ b/src/data/text/move_descriptions.h @@ -967,7 +967,7 @@ static const u8 sSunnyDayDescription[] = _( static const u8 sCrunchDescription[] = _( "Crunches with sharp fangs.\n" - "May lower SP. DEF."); + "May lower DEFENSE."); static const u8 sMirrorCoatDescription[] = _( "Counters the foe's special\n" @@ -1417,6 +1417,1359 @@ static const u8 sPsychoBoostDescription[] = _( "Allows a full-power attack,\n" "but sharply lowers SP. ATK."); +static const u8 sROOSTDescription[] = _( + "Restores the user's HP by\n" + "half of its max HP."); + +static const u8 sGRAVITYDescription[] = _( + "Gravity is intensified\n" + "negating levitation."); + +static const u8 sMIRACLE_EYEDescription[] = _( + "Makes GHOSTS and evasive\n" + "foes easier to hit."); + +static const u8 sWAKE_UP_SLAPDescription[] = _( + "Powerful against sleeping\n" + "foes, but also heals them."); + +static const u8 sHAMMER_ARMDescription[] = _( + "A swinging fist attack\n" + "that also lowers Speed."); + +static const u8 sGYRO_BALLDescription[] = _( + "A high-speed spin that does\n" + "more damage to faster foes."); + +static const u8 sHEALING_WISHDescription[] = _( + "The user faints to heal up\n" + "the recipient."); + +static const u8 sBRINEDescription[] = _( + "Does double damage to foes\n" + "with half HP."); + +static const u8 sNATURAL_GIFTDescription[] = _( + "The effectiveness varies\n" + "with the held Berry."); + +static const u8 sFEINTDescription[] = _( + "An attack that hits foes\n" + "using moves like Protect."); + +static const u8 sPLUCKDescription[] = _( + "Eats the foe's held Berry\n" + "gaining its effect."); + +static const u8 sTAILWINDDescription[] = _( + "Whips up a turbulent breeze\n" + "that raises Speed."); + +static const u8 sACUPRESSUREDescription[] = _( + "The user sharply raises\n" + "one of its stats."); + +static const u8 sMETAL_BURSTDescription[] = _( + "Retaliates any hit with\n" + "greater power."); + +static const u8 sU_TURNDescription[] = _( + "Does damage then switches\n" + "out the user."); + +static const u8 sCLOSE_COMBATDescription[] = _( + "A strong attack but lowers\n" + "the defensive stats."); + +static const u8 sPAYBACKDescription[] = _( + "An attack that gains power\n" + "if the user moves last."); + +static const u8 sASSURANCEDescription[] = _( + "An attack that gains power\n" + "if the foe has been hurt."); + +static const u8 sEMBARGODescription[] = _( + "Prevents the foe from\n" + "using any items."); + +static const u8 sFLINGDescription[] = _( + "The effectiveness varies\n" + "with the held item."); + +static const u8 sPSYCHO_SHIFTDescription[] = _( + "Transfers status problems\n" + "to the foe."); + +static const u8 sTRUMP_CARDDescription[] = _( + "The less PP the move has\n" + "the more damage it does."); + +static const u8 sHEAL_BLOCKDescription[] = _( + "Prevents the foe from\n" + "recovering any HP."); + +static const u8 sWRING_OUTDescription[] = _( + "The higher the foe's HP\n" + "the more damage caused."); + +static const u8 sPOWER_TRICKDescription[] = _( + "The user swaps its Attack\n" + "and Defense stats."); + +static const u8 sGASTRO_ACIDDescription[] = _( + "Stomach acid suppresses\n" + "the foe's ability."); + +static const u8 sLUCKY_CHANTDescription[] = _( + "Prevents the foe from\n" + "landing critical hits."); + +static const u8 sME_FIRSTDescription[] = _( + "Executes the foe's attack\n" + "with greater power."); + +static const u8 sCOPYCATDescription[] = _( + "The user mimics the last\n" + "move used by a foe."); + +static const u8 sPOWER_SWAPDescription[] = _( + "Swaps changes to Attack\n" + "and Sp. Atk with the foe."); + +static const u8 sGUARD_SWAPDescription[] = _( + "Swaps changes to Defense\n" + "and Sp. Def with the foe."); + +static const u8 sPUNISHMENTDescription[] = _( + "Does more damage if the\n" + "foe has powered up."); + +static const u8 sLAST_RESORTDescription[] = _( + "Can only be used if every\n" + "other move has been used."); + +static const u8 sWORRY_SEEDDescription[] = _( + "Plants a seed on the foe\n" + "giving it Insomnia."); + +static const u8 sSUCKER_PUNCHDescription[] = _( + "Strikes first if the foe\n" + "is preparing an attack."); + +static const u8 sTOXIC_SPIKESDescription[] = _( + "Sets spikes that poison a\n" + "foe switching in."); + +static const u8 sHEART_SWAPDescription[] = _( + "Swaps any stat changes\n" + "with the foe."); + +static const u8 sAQUA_RINGDescription[] = _( + "Forms a veil of water\n" + "that restores HP."); + +static const u8 sMAGNET_RISEDescription[] = _( + "The user levitates with\n" + "electromagnetism."); + +static const u8 sFLARE_BLITZDescription[] = _( + "A charge that may burn the\n" + "foe. Also hurts the user."); + +static const u8 sFORCE_PALMDescription[] = _( + "A shock wave attack that\n" + "may paralyze the foe."); + +static const u8 sAURA_SPHEREDescription[] = _( + "Attacks with an aura blast\n" + "that cannot be evaded."); + +static const u8 sROCK_POLISHDescription[] = _( + "Polishes the body to\n" + "sharply raise Speed."); + +static const u8 sPOISON_JABDescription[] = _( + "A stabbing attack that\n" + "may poison the foe."); + +static const u8 sDARK_PULSEDescription[] = _( + "Attacks with a horrible\n" + "aura. May cause flinching."); + +static const u8 sNIGHT_SLASHDescription[] = _( + "Hits as soon as possible.\n" + "High critical-hit ratio."); + +static const u8 sAQUA_TAILDescription[] = _( + "The user swings its tail\n" + "like a wave to attack."); + +static const u8 sSEED_BOMBDescription[] = _( + "A barrage of hard seeds\n" + "is fired at the foe."); + +static const u8 sAIR_SLASHDescription[] = _( + "Attacks with a blade of\n" + "air. May cause flinching."); + +static const u8 sX_SCISSORDescription[] = _( + "Slashes the foe with crossed\n" + "scythes, claws, etc."); + +static const u8 sBUG_BUZZDescription[] = _( + "A damaging sound wave that\n" + "may lower Sp. Def."); + +static const u8 sDRAGON_PULSEDescription[] = _( + "Generates a shock wave to\n" + "damage the foe."); + +static const u8 sDRAGON_RUSHDescription[] = _( + "Tackles the foe with menace.\n" + "May cause flinching."); + +static const u8 sPOWER_GEMDescription[] = _( + "Attacks with rays of light\n" + "that sparkle like diamonds."); + +static const u8 sVACUUM_WAVEDescription[] = _( + "Whirls its fists to send\n" + "a wave that strikes first."); + +static const u8 sFOCUS_BLASTDescription[] = _( + "Attacks at full power.\n" + "May lower Sp. Def."); + +static const u8 sENERGY_BALLDescription[] = _( + "Draws power from nature to\n" + "attack. May lower Sp. Def."); + +static const u8 sBRAVE_BIRDDescription[] = _( + "A low altitude charge that\n" + "also hurts the user."); + +static const u8 sEARTH_POWERDescription[] = _( + "Makes the ground erupt with\n" + "power. May lower Sp. Def."); + +static const u8 sSWITCHEROODescription[] = _( + "Swaps items with the foe\n" + "faster than the eye can see."); + +static const u8 sNASTY_PLOTDescription[] = _( + "Thinks bad thoughts to\n" + "sharply boost Sp. Atk."); + +static const u8 sBULLET_PUNCHDescription[] = _( + "Punches as fast as a bul-\n" + "let. It always hits first."); + +static const u8 sICE_SHARDDescription[] = _( + "Hurls a chunk of ice that\n" + "always strike first."); + +static const u8 sSHADOW_CLAWDescription[] = _( + "Strikes with a shadow claw.\n" + "High critical-hit ratio."); + +static const u8 sTHUNDER_FANGDescription[] = _( + "May cause flinching or\n" + "leave the foe paralyzed."); + +static const u8 sICE_FANGDescription[] = _( + "May cause flinching or\n" + "leave the foe frozen."); + +static const u8 sFIRE_FANGDescription[] = _( + "May cause flinching or\n" + "leave the foe with a burn."); + +static const u8 sSHADOW_SNEAKDescription[] = _( + "Extends the user's shadow\n" + "to strike first."); + +static const u8 sMUD_BOMBDescription[] = _( + "Throws a blob of mud to\n" + "damage and cut accuracy."); + +static const u8 sPSYCHO_CUTDescription[] = _( + "Tears with psychic blades.\n" + "High critical-hit ratio."); + +static const u8 sZEN_HEADBUTTDescription[] = _( + "Hits with a strong head-\n" + "butt. May cause flinching."); + +static const u8 sMIRROR_SHOTDescription[] = _( + "Emits a flash of energy to\n" + "damage and cut accuracy."); + +static const u8 sFLASH_CANNONDescription[] = _( + "Releases a blast of light\n" + "that may lower Sp. Def."); + +static const u8 sROCK_CLIMBDescription[] = _( + "A charging attack that may\n" + "confuse the foe."); + +static const u8 sDEFOGDescription[] = _( + "Removes obstacles and\n" + "lowers evasion."); + +static const u8 sTRICK_ROOMDescription[] = _( + "Slower POKéMON get to move\n" + "first for 5 turns."); + +static const u8 sDRACO_METEORDescription[] = _( + "Casts comets onto the foe.\n" + "Harshly lowers the Sp. Atk."); + +static const u8 sDISCHARGEDescription[] = _( + "Zaps the foes with electri-\n" + "city. May paralyze them."); + +static const u8 sPOWER_WHIPDescription[] = _( + "Violently lashes the foe\n" + "with vines or tentacles."); + +static const u8 sCROSS_POISONDescription[] = _( + "A slash that may poison a\n" + "foe and do critical damage."); + +static const u8 sGUNK_SHOTDescription[] = _( + "Shoots filthy garbage at\n" + "the foe. May also poison."); + +static const u8 sIRON_HEADDescription[] = _( + "Slams the foe with a hard\n" + "head. May cause flinching."); + +static const u8 sMAGNET_BOMBDescription[] = _( + "Launches a magnet that\n" + "strikes without fail."); + +static const u8 sSTONE_EDGEDescription[] = _( + "Stabs the foe with stones.\n" + "High critical-hit ratio."); + +static const u8 sCAPTIVATEDescription[] = _( + "Makes the opposite gender\n" + "sharply reduce its Sp. Atk."); + +static const u8 sSTEALTH_ROCKDescription[] = _( + "Sets floating stones that\n" + "hurt a foe switching in."); + +static const u8 sGRASS_KNOTDescription[] = _( + "A snare attack that does\n" + "more damage to heavier foes."); + +static const u8 sCHATTERDescription[] = _( + "Attacks with a sound wave\n" + "that causes confusion."); + +static const u8 sJUDGMENTDescription[] = _( + "The type varies with the\n" + "kind of Plate held."); + +static const u8 sCHARGE_BEAMDescription[] = _( + "Fires a beam of electricity.\n" + "May raise Sp. Atk."); + +static const u8 sWOOD_HAMMERDescription[] = _( + "Slams the body into a foe\n" + "The user gets hurt too."); + +static const u8 sAQUA_JETDescription[] = _( + "Strikes first by dashing\n" + "at the foe at a high speed."); + +static const u8 sATTACK_ORDERDescription[] = _( + "Underlings pummel the foe.\n" + "High critical-hit ratio."); + +static const u8 sDEFEND_ORDERDescription[] = _( + "Raises Defense and Sp. Def\n" + "with a living shield."); + +static const u8 sHEAL_ORDERDescription[] = _( + "The user's underlings show\n" + "up to heal half its max HP."); + +static const u8 sHEAD_SMASHDescription[] = _( + "A life-risking headbutt that\n" + "seriously hurts the user."); + +static const u8 sDOUBLE_HITDescription[] = _( + "Slams the foe with a tail\n" + "etc. Strikes twice."); + +static const u8 sROAR_OF_TIMEDescription[] = _( + "Powerful, but leaves the\n" + "user immobile the next turn."); + +static const u8 sSPACIAL_RENDDescription[] = _( + "Tears the foe, and space.\n" + "High critical-hit ratio."); + +static const u8 sMAGMA_STORMDescription[] = _( + "Traps the foe in a vortex\n" + "of fire for 2 to 5 turns."); + +static const u8 sDARK_VOIDDescription[] = _( + "Drags the foe into total\n" + "darkness, inducing Sleep."); + +static const u8 sSEED_FLAREDescription[] = _( + "Generates a shock wave that\n" + "sharply reduces Sp. Def."); + +static const u8 sOMINOUS_WINDDescription[] = _( + "A repulsive attack that may\n" + "raise all stats."); + +static const u8 sSHADOW_FORCEDescription[] = _( + "Vanishes on the first turn\n" + "then strikes the next turn."); + +static const u8 sHONE_CLAWSDescription[] = _( + "Sharpens its claws to raise\n" + "Attack and Accuracy."); + +static const u8 sWIDE_GUARDDescription[] = _( + "Evades wide-ranging attacks\n" + "for one turn."); + +static const u8 sGUARD_SPLITDescription[] = _( + "Averages changes to Defense\n" + "and Sp. Def with the foe."); + +static const u8 sPOWER_SPLITDescription[] = _( + "Averages changes to Attack\n" + "and Sp. Atk with the foe."); + +static const u8 sWONDER_ROOMDescription[] = _( + "Defense and Sp. Def stats\n" + "are swapped for 5 turns."); + +static const u8 sPSYSHOCKDescription[] = _( + "Attacks with a psychic wave\n" + "that does physical damage."); + +static const u8 sTAIL_SLAPDescription[] = _( + "Strikes the foe with its\n" + "tail 2 to 5 times."); + +static const u8 sVENOSHOCKDescription[] = _( + "Does double damage if the\n" + "foe is poisoned."); + +static const u8 sAUTOTOMIZEDescription[] = _( + "Sheds additional weight to\n" + "sharply boost Speed."); + +static const u8 sRAGE_POWDERDescription[] = _( + "Scatters powder to make\n" + "foes attack only the user."); + +static const u8 sTELEKINESISDescription[] = _( + "Makes the foe float. It is\n" + "easier to hit for 3 turns."); + +static const u8 sMAGIC_ROOMDescription[] = _( + "Hold items lose their\n" + "effects for 5 turns."); + +static const u8 sSMACK_DOWNDescription[] = _( + "Throws a rock to knock the\n" + "foe down to the ground."); + +static const u8 sSTORM_THROWDescription[] = _( + "This attack always results\n" + "in a critical hit."); + +static const u8 sFLAME_BURSTDescription[] = _( + "A bursting flame that does\n" + "damage to all foes."); + +static const u8 sSLUDGE_WAVEDescription[] = _( + "Swamps the foe with a wave\n" + "of sludge. May also poison."); + +static const u8 sQUIVER_DANCEDescription[] = _( + "Dances to raise Sp. Atk\n" + "Sp. Def and Speed."); + +static const u8 sHEAVY_SLAMDescription[] = _( + "Does more damage if the\n" + "user outweighs the foe."); + +static const u8 sSYNCHRONOISEDescription[] = _( + "An odd shock wave that only\n" + "damages same-type foes."); + +static const u8 sELECTRO_BALLDescription[] = _( + "Hurls an orb that does more\n" + "damage to slower foes."); + +static const u8 sSOAKDescription[] = _( + "Sprays water at the foe\n" + "making it Water-type."); + +static const u8 sFLAME_CHARGEDescription[] = _( + "Attacks in a cloak of\n" + "flames. Raises Speed."); + +static const u8 sCOILDescription[] = _( + "Coils up to raise Attack\n" + "Defense and Accuracy."); + +static const u8 sLOW_SWEEPDescription[] = _( + "Attacks the foe's legs\n" + "lowering its Speed."); + +static const u8 sACID_SPRAYDescription[] = _( + "Sprays a hide-melting acid.\n" + "Sharply reduces Sp. Def."); + +static const u8 sFOUL_PLAYDescription[] = _( + "The higher the foe's Attack\n" + "the more damage caused."); + +static const u8 sSIMPLE_BEAMDescription[] = _( + "A beam that changes the\n" + "foe's ability to Simple."); + +static const u8 sENTRAINMENTDescription[] = _( + "Makes the foe mimic the\n" + "user, gaining its ability."); + +static const u8 sAFTER_YOUDescription[] = _( + "Helps out the foe, letting\n" + "it move next."); + +static const u8 sROUNDDescription[] = _( + "A song that inflicts damage.\n" + "Others can join in too."); + +static const u8 sECHOED_VOICEDescription[] = _( + "Does more damage every turn\n" + "it is used."); + +static const u8 sCHIP_AWAYDescription[] = _( + "Strikes through the foe's\n" + "stat changes."); + +static const u8 sCLEAR_SMOGDescription[] = _( + "Attacks with white haze that\n" + "eliminates all stat changes."); + +static const u8 sSTORED_POWERDescription[] = _( + "The higher the user's stats\n" + "the more damage caused."); + +static const u8 sQUICK_GUARDDescription[] = _( + "Evades priority attacks\n" + "for one turn."); + +static const u8 sALLY_SWITCHDescription[] = _( + "The user switches places\n" + "with its partner."); + +static const u8 sSCALDDescription[] = _( + "Shoots boiling water at the\n" + "foe. May inflict a burn."); + +static const u8 sSHELL_SMASHDescription[] = _( + "Raises offensive stats, but\n" + "lowers defensive stats."); + +static const u8 sHEAL_PULSEDescription[] = _( + "Recovers up to half the\n" + "target's maximum HP."); + +static const u8 sHEXDescription[] = _( + "Does double damage if the\n" + "foe has a status problem."); + +static const u8 sSKY_DROPDescription[] = _( + "Takes the foe into the sky\n" + "then drops it the next turn."); + +static const u8 sSHIFT_GEARDescription[] = _( + "Rotates its gears to raise\n" + "Attack and Speed."); + +static const u8 sCIRCLE_THROWDescription[] = _( + "Knocks the foe away to end\n" + "the battle."); + +static const u8 sINCINERATEDescription[] = _( + "Burns up Berries and Gems\n" + "preventing their use."); + +static const u8 sQUASHDescription[] = _( + "Suppresses the foe, making\n" + "it move last."); + +static const u8 sACROBATICSDescription[] = _( + "Does double damage if the\n" + "user has no item."); + +static const u8 sREFLECT_TYPEDescription[] = _( + "The user reflects the foe's\n" + "type, copying it."); + +static const u8 sRETALIATEDescription[] = _( + "An attack that does more\n" + "damage if an ally fainted."); + +static const u8 sFINAL_GAMBITDescription[] = _( + "The user faints to damage\n" + "the foe equal to its HP."); + +static const u8 sBESTOWDescription[] = _( + "The user gives its held\n" + "item to the foe."); + +static const u8 sINFERNODescription[] = _( + "Powerful and sure to inflict\n" + "a burn, but inaccurate."); + +static const u8 sWATER_PLEDGEDescription[] = _( + "Attacks with a column of\n" + "water. May make a rainbow."); + +static const u8 sFIRE_PLEDGEDescription[] = _( + "Attacks with a column of\n" + "fire. May burn the grass."); + +static const u8 sGRASS_PLEDGEDescription[] = _( + "Attacks with a column of\n" + "grass. May create a swamp."); + +static const u8 sSTRUGGLE_BUGDescription[] = _( + "Resisting, the user attacks\n" + "the foe. Lowers Sp. Atk."); + +static const u8 sBULLDOZEDescription[] = _( + "Stomps down on the ground.\n" + "Lowers Speed."); + +static const u8 sWORK_UPDescription[] = _( + "The user is roused.\n" + "Ups Attack and Sp. Atk."); + +static const u8 sELECTROWEBDescription[] = _( + "Snares the foe with an\n" + "electric net. Lowers Speed."); + +static const u8 sWILD_CHARGEDescription[] = _( + "An electrical tackle that\n" + "also hurts the user."); + +static const u8 sDRILL_RUNDescription[] = _( + "Spins its body like a drill.\n" + "High critical-hit ratio."); + +static const u8 sDUAL_CHOPDescription[] = _( + "Attacks with brutal hits\n" + "that strike twice."); + +static const u8 sHEART_STAMPDescription[] = _( + "A sudden blow after a cute\n" + "act. May cause flinching."); + +static const u8 sRAZOR_SHELLDescription[] = _( + "Tears at the foe with sharp\n" + "shells. May lower Defense."); + +static const u8 sLEAF_TORNADODescription[] = _( + "Circles the foe with leaves\n" + "to damage and cut accuracy."); + +static const u8 sSTEAMROLLERDescription[] = _( + "Crushes the foe with its\n" + "body. May cause flinching."); + +static const u8 sCOTTON_GUARDDescription[] = _( + "Wraps its body in cotton.\n" + "Drastically raises Defense."); + +static const u8 sNIGHT_DAZEDescription[] = _( + "Looses a pitch-black shock\n" + "wave. May lower accuracy."); + +static const u8 sHURRICANEDescription[] = _( + "Traps the foe in a fierce\n" + "wind. May cause confusion."); + +static const u8 sHEAD_CHARGEDescription[] = _( + "A charge using guard hair.\n" + "It hurts the user a little."); + +static const u8 sGEAR_GRINDDescription[] = _( + "Throws two steel gears\n" + "that strike twice."); + +static const u8 sTECHNO_BLASTDescription[] = _( + "The type varies with the\n" + "kind of Drive held."); + +static const u8 sRELIC_SONGDescription[] = _( + "Attacks with an ancient\n" + "song. May induce sleep."); + +static const u8 sSECRET_SWORDDescription[] = _( + "Cuts with a long horn that\n" + "does physical damage."); + +static const u8 sGLACIATEDescription[] = _( + "Blows very cold air at the\n" + "foe. It lowers their Speed."); + +static const u8 sBOLT_STRIKEDescription[] = _( + "Strikes with a great amount\n" + "of lightning. May paralyze."); + +static const u8 sBLUE_FLAREDescription[] = _( + "Engulfs the foe in a blue\n" + "flame. May inflict a burn."); + +static const u8 sFIERY_DANCEDescription[] = _( + "Dances cloaked in flames.\n" + "May raise Sp. Atk."); + +static const u8 sFREEZE_SHOCKDescription[] = _( + "A powerful 2-turn move that\n" + "may paralyze the foe."); + +static const u8 sICE_BURNDescription[] = _( + "A powerful 2-turn move that\n" + "may inflict a burn."); + +static const u8 sSNARLDescription[] = _( + "Yells and rants at the foe\n" + "lowering its Sp. Atk."); + +static const u8 sICICLE_CRASHDescription[] = _( + "Drops large icicles on the\n" + "foe. May cause flinching."); + +static const u8 sV_CREATEDescription[] = _( + "Very powerful, but lowers\n" + "Defense, Sp. Def and Speed."); + +static const u8 sFUSION_FLAREDescription[] = _( + "Summons a fireball. Works\n" + "well with a thunderbolt."); + +static const u8 sFUSION_BOLTDescription[] = _( + "Summons a thunderbolt.\n" + "Works well with a fireball."); + +static const u8 sFLYING_PRESSDescription[] = _( + "This attack does FightingDash\n" + "and Flying-type damage."); + +static const u8 sMAT_BLOCKDescription[] = _( + "Evades damaging moves\n" + "for one turn."); + +static const u8 sBELCHDescription[] = _( + "Lets out a loud belch.\n" + "Must eat a Berry to use it."); + +static const u8 sROTOTILLERDescription[] = _( + "Ups the Attack and Sp. Atk\n" + "of Grass-type POKéMON."); + +static const u8 sSTICKY_WEBDescription[] = _( + "Weaves a sticky net that\n" + "slows foes switching in."); + +static const u8 sFELL_STINGERDescription[] = _( + "If it knocks out a foe\n" + "the Attack stat is raised."); + +static const u8 sTRICK_OR_TREATDescription[] = _( + "Goes trick-or-treating\n" + "making the foe Ghost-type."); + +static const u8 sNOBLE_ROARDescription[] = _( + "Intimidates the foe, to cut\n" + "Attack and Sp. Atk."); + +static const u8 sION_DELUGEDescription[] = _( + "Electrifies Normal-type\n" + "moves with charged atoms."); + +static const u8 sPARABOLIC_CHARGEDescription[] = _( + "Damages adjacent Pokémon and\n" + "heals up by half of it."); + +static const u8 sFORESTS_CURSEDescription[] = _( + "Puts a curse on the foe\n" + "making the foe Grass-type."); + +static const u8 sPETAL_BLIZZARDDescription[] = _( + "Stirs up a violent storm\n" + "of petals to attack."); + +static const u8 sFREEZE_DRYDescription[] = _( + "Super effective on WaterDash\n" + "types. May cause freezing."); + +static const u8 sDISARMING_VOICEDescription[] = _( + "Lets out a charming cry\n" + "that cannot be evaded."); + +static const u8 sPARTING_SHOTDescription[] = _( + "Lowers the foe's Attack and\n" + "Sp. Atk, then switches out."); + +static const u8 sTOPSY_TURVYDescription[] = _( + "Swaps all stat changes that\n" + "affect the target."); + +static const u8 sDRAINING_KISSDescription[] = _( + "An attack that absorbs over\n" + "half the damage inflicted."); + +static const u8 sCRAFTY_SHIELDDescription[] = _( + "Evades status moves for\n" + "one turn."); + +static const u8 sFLOWER_SHIELDDescription[] = _( + "Raises the Defense of\n" + "Grass-type POKéMON."); + +static const u8 sGRASSY_TERRAINDescription[] = _( + "The ground turns to grass\n" + "for 5 turns. Restores HP."); + +static const u8 sMISTY_TERRAINDescription[] = _( + "Covers the ground with mist\n" + "for 5 turns. Blocks status."); + +static const u8 sELECTRIFYDescription[] = _( + "Electrifies the foe, making\n" + "its next move Electric-type."); + +static const u8 sPLAY_ROUGHDescription[] = _( + "Plays rough with the foe.\n" + "May lower Attack."); + +static const u8 sFAIRY_WINDDescription[] = _( + "Stirs up a fairy wind to\n" + "strike the foe."); + +static const u8 sMOONBLASTDescription[] = _( + "Attacks with the power of\n" + "the moon. May lower Sp. Atk."); + +static const u8 sBOOMBURSTDescription[] = _( + "Attacks everything with a\n" + "destructive sound wave."); + +static const u8 sFAIRY_LOCKDescription[] = _( + "Locks down the battlefield\n" + "preventing escape next turn."); + +static const u8 sKINGS_SHIELDDescription[] = _( + "Evades damage, and sharply\n" + "reduces Attack if struck."); + +static const u8 sPLAY_NICEDescription[] = _( + "Befriend the foe, lowering\n" + "its Attack without fail."); + +static const u8 sCONFIDEDescription[] = _( + "Shares a secret with the\n" + "foe, lowering Sp. Atk."); + +static const u8 sDIAMOND_STORMDescription[] = _( + "Whips up a storm of\n" + "diamonds. May up Defense."); + +static const u8 sSTEAM_ERUPTIONDescription[] = _( + "Immerses the foe in heated\n" + "steam. May inflict a burn."); + +static const u8 sHYPERSPACE_HOLEDescription[] = _( + "Uses a warp hole to attack.\n" + "Can't be evaded."); + +static const u8 sWATER_SHURIKENDescription[] = _( + "Throws 2 to 5 stars that\n" + "are sure to strike first."); + +static const u8 sMYSTICAL_FIREDescription[] = _( + "Breathes a special, hot\n" + "fire. May lower Sp. Atk."); + +static const u8 sSPIKY_SHIELDDescription[] = _( + "Evades attack, and damages\n" + "the foe if struck."); + +static const u8 sAROMATIC_MISTDescription[] = _( + "Raises the Sp. Def of a\n" + "partner POKéMON."); + +static const u8 sEERIE_IMPULSEDescription[] = _( + "Exposes the foe to a pulse\n" + "that sharply cuts Sp. Atk."); + +static const u8 sVENOM_DRENCHDescription[] = _( + "Lowers the Attack, Sp. Atk\n" + "and Speed of a poisoned foe."); + +static const u8 sPOWDERDescription[] = _( + "Damages the foe if it uses\n" + "a Fire-type move."); + +static const u8 sGEOMANCYDescription[] = _( + "Raises Sp. Atk, Sp. Def and\n" + "Speed on the 2nd turn."); + +static const u8 sMAGNETIC_FLUXDescription[] = _( + "Boosts the defenses of\n" + "those with Plus or Minus."); + +static const u8 sHAPPY_HOURDescription[] = _( + "Doubles the amount of\n" + "Prize Money received."); + +static const u8 sELECTRIC_TERRAINDescription[] = _( + "Electrifies the ground for\n" + "5 turns. Prevents sleep."); + +static const u8 sDAZZLING_GLEAMDescription[] = _( + "Damages foes by emitting\n" + "a bright flash."); + +static const u8 sCELEBRATEDescription[] = _( + "Congratulates you on your\n" + "special day."); + +static const u8 sHOLD_HANDSDescription[] = _( + "The user and ally hold hands\n" + "making them happy."); + +static const u8 sBABYDOLL_EYESDescription[] = _( + "Lowers the foe's Attack\n" + "before it can move."); + +static const u8 sNUZZLEDescription[] = _( + "Rubs its cheecks against\n" + "the foe, paralyzing it."); + +static const u8 sINFESTATIONDescription[] = _( + "The foe is infested and\n" + "attacked for 2 to 5 turns."); + +static const u8 sPOWER_UP_PUNCHDescription[] = _( + "A hard punch that raises\n" + "the user's Attack."); + +static const u8 sTHOUSAND_ARROWSDescription[] = _( + "Can hit Flying foes, then\n" + "knocks them to the ground."); + +static const u8 sTHOUSAND_WAVESDescription[] = _( + "Those hit by the wave can\n" + "no longer escape."); + +static const u8 sLANDS_WRATHDescription[] = _( + "Gathers the energy of the\n" + "land to attack every foe."); + +static const u8 sLIGHT_OF_RUINDescription[] = _( + "Fires a great beam of light\n" + "that also hurts the user."); + +static const u8 sORIGIN_PULSEDescription[] = _( + "Beams of glowing blue light\n" + "blast both foes."); + +static const u8 sPRECIPICE_BLADESDescription[] = _( + "Fearsome blades of stone\n" + "attack both foes."); + +static const u8 sLAVA_PLUMEDescription[] = _( + "Scarlet flames torch\n" + "everything around the user."); + +static const u8 sLEAF_STORMDescription[] = _( + "Whips up a storm of leaves.\n" + "Harshly lowers the Sp. Atk."); + +static const u8 sSHORE_UPDescription[] = _( + "Restores the user's HP.\n" + "More HP in a sandstorm."); + +static const u8 sFIRST_IMPRESSIONDescription[] = _( + "Hits hard and first.\n" + "Only works first turn."); + +static const u8 sBANEFUL_BUNKERDescription[] = _( + "Protects user and poisons\n" + "foes on contact."); + +static const u8 sSPIRIT_SHACKLEDescription[] = _( + "After being hit, foes can\n" + "no longer escape."); + +static const u8 sDARKEST_LARIATDescription[] = _( + "Swings the arms to strike\n" + "It ignores stat changes."); + +static const u8 sSPARKLING_ARIADescription[] = _( + "Sings with bubbles. Cures\n" + "burns on contact."); + +static const u8 sICE_HAMMERDescription[] = _( + "Swings the fist to strike.\n" + "Lowers the user's SPEED."); + +static const u8 sFLORAL_HEALINGDescription[] = _( + "Restores an ally's HP.\n" + "Heals more on grass."); + +static const u8 sHIGH_HORSEPOWERDescription[] = _( + "Slams hard into the foe with\n" + "its entire body."); + +static const u8 sSTRENGTH_SAPDescription[] = _( + "Saps the foe's Attack to\n" + "heal HP, then drops Attack."); + +static const u8 sSOLAR_BLADEDescription[] = _( + "Charges first turn, then\n" + "chops with a blade of light."); + +static const u8 sLEAFAGEDescription[] = _( + "Attacks with a flurry of\n" + "small leaves."); + +static const u8 sSPOTLIGHTDescription[] = _( + "Makes the foe attack the\n" + "spotlighted POKéMON."); + +static const u8 sTOXIC_THREADDescription[] = _( + "Attacks with a thread that\n" + "poisons and drops Speed."); + +static const u8 sLASER_FOCUSDescription[] = _( + "Guarantees the next move\n" + "will be a critical hit."); + +static const u8 sGEAR_UPDescription[] = _( + "Boosts the attacks of\n" + "those with Plus or Minus."); + +static const u8 sTHROAT_CHOPDescription[] = _( + "Chops the throat to disable\n" + "sound moves for a while."); + +static const u8 sPOLLEN_PUFFDescription[] = _( + "Explodes on foes, but\n" + "restores ally's HP."); + +static const u8 sANCHOR_SHOTDescription[] = _( + "Strangles the foe with a\n" + "chain. The foe can't flinch."); + +static const u8 sPSYCHIC_TERRAINDescription[] = _( + "The ground turns weird for\n" + "5 turns. Blocks priority."); + +static const u8 sLUNGEDescription[] = _( + "Lunges at the foe to lower\n" + "its Attack stat."); + +static const u8 sFIRE_LASHDescription[] = _( + "Whips the foe with fire\n" + "lowering its Defense."); + +static const u8 sPOWER_TRIPDescription[] = _( + "It hits harder the more\n" + "stat boosts the user has."); + +static const u8 sBURN_UPDescription[] = _( + "Burns out the user fully\n" + "removing the Fire type."); + +static const u8 sSPEED_SWAPDescription[] = _( + "Swaps user's Speed with\n" + "the target's."); + +static const u8 sSMART_STRIKEDescription[] = _( + "Hits with an accurate\n" + "horn that never misses."); + +static const u8 sPURIFYDescription[] = _( + "Cures the foe's status\n" + "to restore HP."); + +static const u8 sREVELATION_DANCEDescription[] = _( + "Dances with mystical power.\n" + "Matches user's first type."); + +static const u8 sCORE_ENFORCERDescription[] = _( + "Hits with a ray that\n" + "nullifies the foe's ability."); + +static const u8 sTROP_KICKDescription[] = _( + "An intense kick from the\n" + "tropics. Lowers Attack."); + +static const u8 sINSTRUCTDescription[] = _( + "Orders the target to use\n" + "its last move again."); + +static const u8 sBEAK_BLASTDescription[] = _( + "Heats up beak to attack.\n" + "Burns foe on contact."); + +static const u8 sCLANGING_SCALESDescription[] = _( + "Makes a big noise with\n" + "its scales. Drops Defense."); + +static const u8 sDRAGON_HAMMERDescription[] = _( + "Swings its whole body\n" + "like a hammer to damage."); + +static const u8 sBRUTAL_SWINGDescription[] = _( + "Violently swings around\n" + "to hurt everyone nearby."); + +static const u8 sAURORA_VEILDescription[] = _( + "Weakens all attacks, but\n" + "only usable with hail."); + +static const u8 sSHELL_TRAPDescription[] = _( + "Sets a shell trap that\n" + "damages on contact."); + +static const u8 sFLEUR_CANNONDescription[] = _( + "A strong ray that harshly\n" + "lowers Sp. Attack."); + +static const u8 sPSYCHIC_FANGSDescription[] = _( + "Chomps with psychic fangs.\n" + "Destroys any barriers."); + +static const u8 sSTOMPING_TANTRUMDescription[] = _( + "Stomps around angrily.\n" + "Stronger after a failure."); + +static const u8 sSHADOW_BONEDescription[] = _( + "Strikes with a haunted\n" + "bone. Might drop Defense."); + +static const u8 sACCELEROCKDescription[] = _( + "Hits with a high-speed\n" + "rock that always goes first."); + +static const u8 sLIQUIDATIONDescription[] = _( + "Slams the foe with water.\n" + "Can lower Defense."); + +static const u8 sPRISMATIC_LASERDescription[] = _( + "A high power laser that\n" + "forces recharge next turn."); + +static const u8 sSPECTRAL_THIEFDescription[] = _( + "Steals the target's stat\n" + "boosts, then attacks."); + +static const u8 sSUNSTEEL_STRIKEDescription[] = _( + "A sun-fueled strike that\n" + "ignores abilities."); + +static const u8 sMOONGEIST_BEAMDescription[] = _( + "A moon-powered beam that\n" + "ignores abilities."); + +static const u8 sTEARFUL_LOOKDescription[] = _( + "The user tears up, dropping\n" + "Attack and Sp. Attack."); + +static const u8 sZING_ZAPDescription[] = _( + "An electrified impact that\n" + "can cause flinching."); + +static const u8 sNATURES_MADNESSDescription[] = _( + "Halves the foe's HP with\n" + "the power of nature."); + +static const u8 sMULTI_ATTACKDescription[] = _( + "An attack that changes\n" + "with Memories."); + +static const u8 sMIND_BLOWNDescription[] = _( + "It explodes the user's head\n" + "to damage everything around."); + +static const u8 sPLASMA_FISTSDescription[] = _( + "Hits with electrical fists.\n" + "Normal moves become Electric."); + +static const u8 sPHOTON_GEYSERDescription[] = _( + "The foe's highest offensive\n" + "determines its category."); + +static const u8 sDOUBLE_IRON_BASHDescription[] = _( + "The user spins and hits with\n" + "its arms. May cause flinch."); + +// GEN 8 +static const u8 sDYNAMAX_CANNONDescription[] = _( + "Fires a strong beam. Deals\n" + "2x damage to Dynamaxed foes."); + +static const u8 sSNIPE_SHOTDescription[] = _( + "The user ignores effects\n" + "that draw in moves."); + +static const u8 sJAW_LOCKDescription[] = _( + "Prevents the user and\n" + "the target from escaping."); + +static const u8 sSTUFF_CHEEKSDescription[] = _( + "Consumes the user's Berry,\n" + "then sharply raises Def."); + +static const u8 sNO_RETREATDescription[] = _( + "Raises all of the user's\n" + "stats but prevents escape."); + +static const u8 sTAR_SHOTDescription[] = _( + "Lowers the foe's Speed and\n" + "makes it weak to Fire."); + +static const u8 sMAGIC_POWDERDescription[] = _( + "Magic powder changes the\n" + "target into a Psychic-type."); + +static const u8 sDRAGON_DARTSDescription[] = _( + "The user attacks twice. Two\n" + "targets are hit once each."); + +static const u8 sTEATIMEDescription[] = _( + "All Pokémon have teatime\n" + "and eat their Berries."); + +static const u8 sOCTOLOCKDescription[] = _( + "Traps the foe to lower Def\n" + "and Sp. Def fall each turn."); + +static const u8 sBOLT_BEAKDescription[] = _( + "Double power if the user\n" + "moves before the target."); + +static const u8 sFISHIOUS_RENDDescription[] = _( + "Double power if the user\n" + "moves before the target."); + +static const u8 sCOURT_CHANGEDescription[] = _( + "The user swaps effects on\n" + "either side of the field."); + +static const u8 sCLANGOROUS_SOULDescription[] = _( + "The user uses some of its\n" + "HP to raise all its stats."); + +static const u8 sBODY_PRESSDescription[] = _( + "Does more damage the\n" + "higher the user's Def."); + +static const u8 sDECORATEDescription[] = _( + "The user sharply raises\n" + "the target's Atk and Sp.Atk"); + +static const u8 sDRUM_BEATINGDescription[] = _( + "Plays a drum to attack.\n" + "The foe's Speed is lowered."); + +static const u8 sSNAP_TRAPDescription[] = _( + "Snares the target in a snap\n" + "trap for four to five turns."); + +static const u8 sPYRO_BALLDescription[] = _( + "Launches a fiery ball at the\n" + "target. It may cause a burn."); + +static const u8 sBEHEMOTH_BLADEDescription[] = _( + "Strikes as a sword. It deals\n" + "2x damage to Dynamaxed foes."); + +static const u8 sBEHEMOTH_BASHDescription[] = _( + "Attacks as a sheild. Deals\n" + "2x damage to Dynamaxed foes."); + +static const u8 sAURA_WHEELDescription[] = _( + "Raises Speed to attack. The\n" + "Type is based on its form."); + +static const u8 sBREAKING_SWIPEDescription[] = _( + "Swings its tail to attack.\n" + "Lowers the Atk of those hit."); + +static const u8 sBRANCH_POKEDescription[] = _( + "The user pokes the target\n" + "with a pointed branch."); + +static const u8 sOVERDRIVEDescription[] = _( + "The user twangs its guitar,\n" + "causing strong vibrations."); + +static const u8 sAPPLE_ACIDDescription[] = _( + "Attacks with tart apple acid\n" + "to lower the foe's Sp. Def."); + +static const u8 sGRAV_APPLEDescription[] = _( + "Drops an apple from above.\n" + "Lowers the foe's Defense."); + +static const u8 sSPIRIT_BREAKDescription[] = _( + "Attacks with spirit-breaking\n" + "force. Lowers Sp. Atk."); + +static const u8 sSTRANGE_STEAMDescription[] = _( + "Emits a strange steam to\n" + "potentially confuse the foe."); + +static const u8 sLIFE_DEWDescription[] = _( + "Scatters water to restore\n" + "the HP of itself and allies."); + +static const u8 sOBSTRUCTDescription[] = _( + "Protects itself, harshly\n" + "lowering Def on contact."); + +static const u8 sFALSE_SURRENDERDescription[] = _( + "Bows to stab the foe\n" + "with hair. It never misses."); + +static const u8 sMETEOR_ASSAULTDescription[] = _( + "Attacks with a thick leek.\n" + "The user must then rest."); + +static const u8 sETERNABEAMDescription[] = _( + "Eternatus' strongest move.\n" + "The user rests next turn."); + +static const u8 sSTEEL_BEAMDescription[] = _( + "Fires a beam of steel from\n" + "its body. It hurts the user."); + +static const u8 sNotDoneYetDescription[] = _( + "Not done yet."); + + // MOVE_NONE is ignored in this table. Make sure to always subtract 1 before getting the right pointer. const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] = { @@ -1774,4 +3127,362 @@ const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] = [MOVE_WATER_PULSE - 1] = sWaterPulseDescription, [MOVE_DOOM_DESIRE - 1] = sDoomDesireDescription, [MOVE_PSYCHO_BOOST - 1] = sPsychoBoostDescription, + [MOVE_ROOST - 1] = sROOSTDescription, + [MOVE_GRAVITY - 1] = sGRAVITYDescription, + [MOVE_MIRACLE_EYE - 1] = sMIRACLE_EYEDescription, + [MOVE_WAKE_UP_SLAP - 1] = sWAKE_UP_SLAPDescription, + [MOVE_HAMMER_ARM - 1] = sHAMMER_ARMDescription, + [MOVE_GYRO_BALL - 1] = sGYRO_BALLDescription, + [MOVE_HEALING_WISH - 1] = sHEALING_WISHDescription, + [MOVE_BRINE - 1] = sBRINEDescription, + [MOVE_NATURAL_GIFT - 1] = sNATURAL_GIFTDescription, + [MOVE_FEINT - 1] = sFEINTDescription, + [MOVE_PLUCK - 1] = sPLUCKDescription, + [MOVE_TAILWIND - 1] = sTAILWINDDescription, + [MOVE_ACUPRESSURE - 1] = sACUPRESSUREDescription, + [MOVE_METAL_BURST - 1] = sMETAL_BURSTDescription, + [MOVE_U_TURN - 1] = sU_TURNDescription, + [MOVE_CLOSE_COMBAT - 1] = sCLOSE_COMBATDescription, + [MOVE_PAYBACK - 1] = sPAYBACKDescription, + [MOVE_ASSURANCE - 1] = sASSURANCEDescription, + [MOVE_EMBARGO - 1] = sEMBARGODescription, + [MOVE_FLING - 1] = sFLINGDescription, + [MOVE_PSYCHO_SHIFT - 1] = sPSYCHO_SHIFTDescription, + [MOVE_TRUMP_CARD - 1] = sTRUMP_CARDDescription, + [MOVE_HEAL_BLOCK - 1] = sHEAL_BLOCKDescription, + [MOVE_WRING_OUT - 1] = sWRING_OUTDescription, + [MOVE_POWER_TRICK - 1] = sPOWER_TRICKDescription, + [MOVE_GASTRO_ACID - 1] = sGASTRO_ACIDDescription, + [MOVE_LUCKY_CHANT - 1] = sLUCKY_CHANTDescription, + [MOVE_ME_FIRST - 1] = sME_FIRSTDescription, + [MOVE_COPYCAT - 1] = sCOPYCATDescription, + [MOVE_POWER_SWAP - 1] = sPOWER_SWAPDescription, + [MOVE_GUARD_SWAP - 1] = sGUARD_SWAPDescription, + [MOVE_PUNISHMENT - 1] = sPUNISHMENTDescription, + [MOVE_LAST_RESORT - 1] = sLAST_RESORTDescription, + [MOVE_WORRY_SEED - 1] = sWORRY_SEEDDescription, + [MOVE_SUCKER_PUNCH - 1] = sSUCKER_PUNCHDescription, + [MOVE_TOXIC_SPIKES - 1] = sTOXIC_SPIKESDescription, + [MOVE_HEART_SWAP - 1] = sHEART_SWAPDescription, + [MOVE_AQUA_RING - 1] = sAQUA_RINGDescription, + [MOVE_MAGNET_RISE - 1] = sMAGNET_RISEDescription, + [MOVE_FLARE_BLITZ - 1] = sFLARE_BLITZDescription, + [MOVE_FORCE_PALM - 1] = sFORCE_PALMDescription, + [MOVE_AURA_SPHERE - 1] = sAURA_SPHEREDescription, + [MOVE_ROCK_POLISH - 1] = sROCK_POLISHDescription, + [MOVE_POISON_JAB - 1] = sPOISON_JABDescription, + [MOVE_DARK_PULSE - 1] = sDARK_PULSEDescription, + [MOVE_NIGHT_SLASH - 1] = sNIGHT_SLASHDescription, + [MOVE_AQUA_TAIL - 1] = sAQUA_TAILDescription, + [MOVE_SEED_BOMB - 1] = sSEED_BOMBDescription, + [MOVE_AIR_SLASH - 1] = sAIR_SLASHDescription, + [MOVE_X_SCISSOR - 1] = sX_SCISSORDescription, + [MOVE_BUG_BUZZ - 1] = sBUG_BUZZDescription, + [MOVE_DRAGON_PULSE - 1] = sDRAGON_PULSEDescription, + [MOVE_DRAGON_RUSH - 1] = sDRAGON_RUSHDescription, + [MOVE_POWER_GEM - 1] = sPOWER_GEMDescription, + [MOVE_DRAIN_PUNCH - 1] = sDRAINING_KISSDescription, + [MOVE_VACUUM_WAVE - 1] = sVACUUM_WAVEDescription, + [MOVE_FOCUS_BLAST - 1] = sFOCUS_BLASTDescription, + [MOVE_ENERGY_BALL - 1] = sENERGY_BALLDescription, + [MOVE_BRAVE_BIRD - 1] = sBRAVE_BIRDDescription, + [MOVE_EARTH_POWER - 1] = sEARTH_POWERDescription, + [MOVE_SWITCHEROO - 1] = sSWITCHEROODescription, + [MOVE_GIGA_IMPACT - 1] = sHyperBeamDescription, + [MOVE_NASTY_PLOT - 1] = sNASTY_PLOTDescription, + [MOVE_BULLET_PUNCH - 1] = sBULLET_PUNCHDescription, + [MOVE_AVALANCHE - 1] = sRevengeDescription, + [MOVE_ICE_SHARD - 1] = sICE_SHARDDescription, + [MOVE_SHADOW_CLAW - 1] = sSHADOW_CLAWDescription, + [MOVE_THUNDER_FANG - 1] = sTHUNDER_FANGDescription, + [MOVE_ICE_FANG - 1] = sICE_FANGDescription, + [MOVE_FIRE_FANG - 1] = sFIRE_FANGDescription, + [MOVE_SHADOW_SNEAK - 1] = sSHADOW_SNEAKDescription, + [MOVE_MUD_BOMB - 1] = sMUD_BOMBDescription, + [MOVE_PSYCHO_CUT - 1] = sPSYCHO_CUTDescription, + [MOVE_ZEN_HEADBUTT - 1] = sZEN_HEADBUTTDescription, + [MOVE_MIRROR_SHOT - 1] = sMIRROR_SHOTDescription, + [MOVE_FLASH_CANNON - 1] = sFLASH_CANNONDescription, + [MOVE_ROCK_CLIMB - 1] = sROCK_CLIMBDescription, + [MOVE_DEFOG - 1] = sDEFOGDescription, + [MOVE_TRICK_ROOM - 1] = sTRICK_ROOMDescription, + [MOVE_DRACO_METEOR - 1] = sDRACO_METEORDescription, + [MOVE_DISCHARGE - 1] = sDISCHARGEDescription, + [MOVE_LAVA_PLUME - 1] = sLAVA_PLUMEDescription, + [MOVE_LEAF_STORM - 1] = sLEAF_STORMDescription, + [MOVE_POWER_WHIP - 1] = sPOWER_WHIPDescription, + [MOVE_ROCK_WRECKER - 1] = sHyperBeamDescription, + [MOVE_CROSS_POISON - 1] = sCROSS_POISONDescription, + [MOVE_GUNK_SHOT - 1] = sGUNK_SHOTDescription, + [MOVE_IRON_HEAD - 1] = sIRON_HEADDescription, + [MOVE_MAGNET_BOMB - 1] = sMAGNET_BOMBDescription, + [MOVE_STONE_EDGE - 1] = sSTONE_EDGEDescription, + [MOVE_CAPTIVATE - 1] = sCAPTIVATEDescription, + [MOVE_STEALTH_ROCK - 1] = sSTEALTH_ROCKDescription, + [MOVE_GRASS_KNOT - 1] = sGRASS_KNOTDescription, + [MOVE_CHATTER - 1] = sCHATTERDescription, + [MOVE_JUDGMENT - 1] = sJUDGMENTDescription, + [MOVE_BUG_BITE - 1] = sPLUCKDescription, + [MOVE_CHARGE_BEAM - 1] = sCHARGE_BEAMDescription, + [MOVE_WOOD_HAMMER - 1] = sWOOD_HAMMERDescription, + [MOVE_AQUA_JET - 1] = sAQUA_JETDescription, + [MOVE_ATTACK_ORDER - 1] = sATTACK_ORDERDescription, + [MOVE_DEFEND_ORDER - 1] = sDEFEND_ORDERDescription, + [MOVE_HEAL_ORDER - 1] = sHEAL_ORDERDescription, + [MOVE_HEAD_SMASH - 1] = sHEAD_SMASHDescription, + [MOVE_DOUBLE_HIT - 1] = sDOUBLE_HITDescription, + [MOVE_ROAR_OF_TIME - 1] = sROAR_OF_TIMEDescription, + [MOVE_SPACIAL_REND - 1] = sSPACIAL_RENDDescription, + [MOVE_LUNAR_DANCE - 1] = sHEALING_WISHDescription, + [MOVE_CRUSH_GRIP - 1] = sWRING_OUTDescription, + [MOVE_MAGMA_STORM - 1] = sMAGMA_STORMDescription, + [MOVE_DARK_VOID - 1] = sDARK_VOIDDescription, + [MOVE_SEED_FLARE - 1] = sSEED_FLAREDescription, + [MOVE_OMINOUS_WIND - 1] = sOMINOUS_WINDDescription, + [MOVE_SHADOW_FORCE - 1] = sSHADOW_FORCEDescription, + [MOVE_HONE_CLAWS - 1] = sHONE_CLAWSDescription, + [MOVE_WIDE_GUARD - 1] = sWIDE_GUARDDescription, + [MOVE_GUARD_SPLIT - 1] = sGUARD_SPLITDescription, + [MOVE_POWER_SPLIT - 1] = sPOWER_SPLITDescription, + [MOVE_WONDER_ROOM - 1] = sWONDER_ROOMDescription, + [MOVE_PSYSHOCK - 1] = sPSYSHOCKDescription, + [MOVE_VENOSHOCK - 1] = sVENOSHOCKDescription, + [MOVE_AUTOTOMIZE - 1] = sAUTOTOMIZEDescription, + [MOVE_RAGE_POWDER - 1] = sRAGE_POWDERDescription, + [MOVE_TELEKINESIS - 1] = sTELEKINESISDescription, + [MOVE_MAGIC_ROOM - 1] = sMAGIC_ROOMDescription, + [MOVE_SMACK_DOWN - 1] = sSMACK_DOWNDescription, + [MOVE_STORM_THROW - 1] = sSTORM_THROWDescription, + [MOVE_FLAME_BURST - 1] = sFLAME_BURSTDescription, + [MOVE_SLUDGE_WAVE - 1] = sSLUDGE_WAVEDescription, + [MOVE_QUIVER_DANCE - 1] = sQUIVER_DANCEDescription, + [MOVE_HEAVY_SLAM - 1] = sHEAVY_SLAMDescription, + [MOVE_SYNCHRONOISE - 1] = sSYNCHRONOISEDescription, + [MOVE_ELECTRO_BALL - 1] = sELECTRO_BALLDescription, + [MOVE_SOAK - 1] = sSOAKDescription, + [MOVE_FLAME_CHARGE - 1] = sFLAME_CHARGEDescription, + [MOVE_COIL - 1] = sCOILDescription, + [MOVE_LOW_SWEEP - 1] = sLOW_SWEEPDescription, + [MOVE_ACID_SPRAY - 1] = sACID_SPRAYDescription, + [MOVE_FOUL_PLAY - 1] = sFOUL_PLAYDescription, + [MOVE_SIMPLE_BEAM - 1] = sSIMPLE_BEAMDescription, + [MOVE_ENTRAINMENT - 1] = sENTRAINMENTDescription, + [MOVE_AFTER_YOU - 1] = sAFTER_YOUDescription, + [MOVE_ROUND - 1] = sROUNDDescription, + [MOVE_ECHOED_VOICE - 1] = sECHOED_VOICEDescription, + [MOVE_CHIP_AWAY - 1] = sCHIP_AWAYDescription, + [MOVE_CLEAR_SMOG - 1] = sCLEAR_SMOGDescription, + [MOVE_STORED_POWER - 1] = sSTORED_POWERDescription, + [MOVE_QUICK_GUARD - 1] = sQUICK_GUARDDescription, + [MOVE_ALLY_SWITCH - 1] = sALLY_SWITCHDescription, + [MOVE_SCALD - 1] = sSCALDDescription, + [MOVE_SHELL_SMASH - 1] = sSHELL_SMASHDescription, + [MOVE_HEAL_PULSE - 1] = sHEAL_PULSEDescription, + [MOVE_HEX - 1] = sHEXDescription, + [MOVE_SKY_DROP - 1] = sSKY_DROPDescription, + [MOVE_SHIFT_GEAR - 1] = sSHIFT_GEARDescription, + [MOVE_CIRCLE_THROW - 1] = sCIRCLE_THROWDescription, + [MOVE_INCINERATE - 1] = sINCINERATEDescription, + [MOVE_QUASH - 1] = sQUASHDescription, + [MOVE_ACROBATICS - 1] = sACROBATICSDescription, + [MOVE_REFLECT_TYPE - 1] = sREFLECT_TYPEDescription, + [MOVE_RETALIATE - 1] = sRETALIATEDescription, + [MOVE_FINAL_GAMBIT - 1] = sFINAL_GAMBITDescription, + [MOVE_BESTOW - 1] = sBESTOWDescription, + [MOVE_INFERNO - 1] = sINFERNODescription, + [MOVE_WATER_PLEDGE - 1] = sWATER_PLEDGEDescription, + [MOVE_FIRE_PLEDGE - 1] = sFIRE_PLEDGEDescription, + [MOVE_GRASS_PLEDGE - 1] = sGRASS_PLEDGEDescription, + [MOVE_VOLT_SWITCH - 1] = sU_TURNDescription, + [MOVE_STRUGGLE_BUG - 1] = sSTRUGGLE_BUGDescription, + [MOVE_BULLDOZE - 1] = sBULLDOZEDescription, + [MOVE_FROST_BREATH - 1] = sSTORM_THROWDescription, + [MOVE_DRAGON_TAIL - 1] = sCIRCLE_THROWDescription, + [MOVE_WORK_UP - 1] = sWORK_UPDescription, + [MOVE_ELECTROWEB - 1] = sELECTROWEBDescription, + [MOVE_WILD_CHARGE - 1] = sWILD_CHARGEDescription, + [MOVE_DRILL_RUN - 1] = sDRILL_RUNDescription, + [MOVE_DUAL_CHOP - 1] = sDUAL_CHOPDescription, + [MOVE_HEART_STAMP - 1] = sHEART_STAMPDescription, + [MOVE_HORN_LEECH - 1] = sMegaDrainDescription, + [MOVE_SACRED_SWORD - 1] = sCHIP_AWAYDescription, + [MOVE_RAZOR_SHELL - 1] = sRAZOR_SHELLDescription, + [MOVE_HEAT_CRASH - 1] = sHEAVY_SLAMDescription, + [MOVE_LEAF_TORNADO - 1] = sLEAF_TORNADODescription, + [MOVE_STEAMROLLER - 1] = sSTEAMROLLERDescription, + [MOVE_COTTON_GUARD - 1] = sCOTTON_GUARDDescription, + [MOVE_NIGHT_DAZE - 1] = sNIGHT_DAZEDescription, + [MOVE_PSYSTRIKE - 1] = sPSYSHOCKDescription, + [MOVE_TAIL_SLAP - 1] = sTAIL_SLAPDescription, + [MOVE_HURRICANE - 1] = sHURRICANEDescription, + [MOVE_HEAD_CHARGE - 1] = sHEAD_CHARGEDescription, + [MOVE_GEAR_GRIND - 1] = sGEAR_GRINDDescription, + [MOVE_SEARING_SHOT - 1] = sLAVA_PLUMEDescription, + [MOVE_TECHNO_BLAST - 1] = sTECHNO_BLASTDescription, + [MOVE_RELIC_SONG - 1] = sRELIC_SONGDescription, + [MOVE_SECRET_SWORD - 1] = sSECRET_SWORDDescription, + [MOVE_GLACIATE - 1] = sGLACIATEDescription, + [MOVE_BOLT_STRIKE - 1] = sBOLT_STRIKEDescription, + [MOVE_BLUE_FLARE - 1] = sBLUE_FLAREDescription, + [MOVE_FIERY_DANCE - 1] = sFIERY_DANCEDescription, + [MOVE_FREEZE_SHOCK - 1] = sFREEZE_SHOCKDescription, + [MOVE_ICE_BURN - 1] = sICE_BURNDescription, + [MOVE_SNARL - 1] = sSNARLDescription, + [MOVE_ICICLE_CRASH - 1] = sICICLE_CRASHDescription, + [MOVE_V_CREATE - 1] = sV_CREATEDescription, + [MOVE_FUSION_FLARE - 1] = sFUSION_FLAREDescription, + [MOVE_FUSION_BOLT - 1] = sFUSION_BOLTDescription, + [MOVE_FLYING_PRESS - 1] = sFLYING_PRESSDescription, + [MOVE_MAT_BLOCK - 1] = sMAT_BLOCKDescription, + [MOVE_BELCH - 1] = sBELCHDescription, + [MOVE_ROTOTILLER - 1] = sROTOTILLERDescription, + [MOVE_STICKY_WEB - 1] = sSTICKY_WEBDescription, + [MOVE_FELL_STINGER - 1] = sFELL_STINGERDescription, + [MOVE_PHANTOM_FORCE - 1] = sSHADOW_FORCEDescription, + [MOVE_TRICK_OR_TREAT - 1] = sTRICK_OR_TREATDescription, + [MOVE_NOBLE_ROAR - 1] = sNOBLE_ROARDescription, + [MOVE_ION_DELUGE - 1] = sION_DELUGEDescription, + [MOVE_PARABOLIC_CHARGE - 1] = sPARABOLIC_CHARGEDescription, + [MOVE_FORESTS_CURSE - 1] = sFORESTS_CURSEDescription, + [MOVE_PETAL_BLIZZARD - 1] = sPETAL_BLIZZARDDescription, + [MOVE_FREEZE_DRY - 1] = sFREEZE_DRYDescription, + [MOVE_DISARMING_VOICE - 1] = sDISARMING_VOICEDescription, + [MOVE_PARTING_SHOT - 1] = sPARTING_SHOTDescription, + [MOVE_TOPSY_TURVY - 1] = sTOPSY_TURVYDescription, + [MOVE_DRAINING_KISS - 1] = sDRAINING_KISSDescription, + [MOVE_CRAFTY_SHIELD - 1] = sCRAFTY_SHIELDDescription, + [MOVE_FLOWER_SHIELD - 1] = sFLOWER_SHIELDDescription, + [MOVE_GRASSY_TERRAIN - 1] = sGRASSY_TERRAINDescription, + [MOVE_MISTY_TERRAIN - 1] = sMISTY_TERRAINDescription, + [MOVE_ELECTRIFY - 1] = sELECTRIFYDescription, + [MOVE_PLAY_ROUGH - 1] = sPLAY_ROUGHDescription, + [MOVE_FAIRY_WIND - 1] = sFAIRY_WINDDescription, + [MOVE_MOONBLAST - 1] = sMOONBLASTDescription, + [MOVE_BOOMBURST - 1] = sBOOMBURSTDescription, + [MOVE_FAIRY_LOCK - 1] = sFAIRY_LOCKDescription, + [MOVE_KINGS_SHIELD - 1] = sKINGS_SHIELDDescription, + [MOVE_PLAY_NICE - 1] = sPLAY_NICEDescription, + [MOVE_CONFIDE - 1] = sCONFIDEDescription, + [MOVE_DIAMOND_STORM - 1] = sDIAMOND_STORMDescription, + [MOVE_STEAM_ERUPTION - 1] = sSTEAM_ERUPTIONDescription, + [MOVE_HYPERSPACE_HOLE - 1] = sHYPERSPACE_HOLEDescription, + [MOVE_WATER_SHURIKEN - 1] = sWATER_SHURIKENDescription, + [MOVE_MYSTICAL_FIRE - 1] = sMYSTICAL_FIREDescription, + [MOVE_SPIKY_SHIELD - 1] = sSPIKY_SHIELDDescription, + [MOVE_AROMATIC_MIST - 1] = sAROMATIC_MISTDescription, + [MOVE_EERIE_IMPULSE - 1] = sEERIE_IMPULSEDescription, + [MOVE_VENOM_DRENCH - 1] = sVENOM_DRENCHDescription, + [MOVE_POWDER - 1] = sPOWDERDescription, + [MOVE_GEOMANCY - 1] = sGEOMANCYDescription, + [MOVE_MAGNETIC_FLUX - 1] = sMAGNETIC_FLUXDescription, + [MOVE_HAPPY_HOUR - 1] = sHAPPY_HOURDescription, + [MOVE_ELECTRIC_TERRAIN - 1] = sELECTRIC_TERRAINDescription, + [MOVE_DAZZLING_GLEAM - 1] = sDAZZLING_GLEAMDescription, + [MOVE_CELEBRATE - 1] = sCELEBRATEDescription, + [MOVE_HOLD_HANDS - 1] = sHOLD_HANDSDescription, + [MOVE_BABY_DOLL_EYES - 1] = sBABYDOLL_EYESDescription, + [MOVE_NUZZLE - 1] = sNUZZLEDescription, + [MOVE_HOLD_BACK - 1] = sFalseSwipeDescription, + [MOVE_INFESTATION - 1] = sINFESTATIONDescription, + [MOVE_POWER_UP_PUNCH - 1] = sPOWER_UP_PUNCHDescription, + [MOVE_OBLIVION_WING - 1] = sDRAINING_KISSDescription, + [MOVE_THOUSAND_ARROWS - 1] = sTHOUSAND_ARROWSDescription, + [MOVE_THOUSAND_WAVES - 1] = sTHOUSAND_WAVESDescription, + [MOVE_LANDS_WRATH - 1] = sLANDS_WRATHDescription, + [MOVE_LIGHT_OF_RUIN - 1] = sLIGHT_OF_RUINDescription, + [MOVE_ORIGIN_PULSE - 1] = sORIGIN_PULSEDescription, + [MOVE_PRECIPICE_BLADES - 1] = sPRECIPICE_BLADESDescription, + [MOVE_DRAGON_ASCENT - 1] = sCLOSE_COMBATDescription, + [MOVE_HYPERSPACE_FURY - 1] = sHYPERSPACE_HOLEDescription, + [MOVE_SHORE_UP - 1] = sSHORE_UPDescription, + [MOVE_FIRST_IMPRESSION - 1] = sFIRST_IMPRESSIONDescription, + [MOVE_BANEFUL_BUNKER - 1] = sBANEFUL_BUNKERDescription, + [MOVE_SPIRIT_SHACKLE - 1] = sSPIRIT_SHACKLEDescription, + [MOVE_DARKEST_LARIAT - 1] = sDARKEST_LARIATDescription, + [MOVE_SPARKLING_ARIA - 1] = sSPARKLING_ARIADescription, + [MOVE_ICE_HAMMER - 1] = sICE_HAMMERDescription, + [MOVE_FLORAL_HEALING - 1] = sFLORAL_HEALINGDescription, + [MOVE_HIGH_HORSEPOWER - 1] = sHIGH_HORSEPOWERDescription, + [MOVE_STRENGTH_SAP - 1] = sSTRENGTH_SAPDescription, + [MOVE_SOLAR_BLADE - 1] = sSOLAR_BLADEDescription, + [MOVE_LEAFAGE - 1] = sLEAFAGEDescription, + [MOVE_SPOTLIGHT - 1] = sSPOTLIGHTDescription, + [MOVE_TOXIC_THREAD - 1] = sTOXIC_THREADDescription, + [MOVE_LASER_FOCUS - 1] = sLASER_FOCUSDescription, + [MOVE_GEAR_UP - 1] = sGEAR_UPDescription, + [MOVE_THROAT_CHOP - 1] = sTHROAT_CHOPDescription, + [MOVE_POLLEN_PUFF - 1] = sPOLLEN_PUFFDescription, + [MOVE_ANCHOR_SHOT - 1] = sANCHOR_SHOTDescription, + [MOVE_PSYCHIC_TERRAIN - 1] = sPSYCHIC_TERRAINDescription, + [MOVE_LUNGE - 1] = sLUNGEDescription, + [MOVE_FIRE_LASH - 1] = sFIRE_LASHDescription, + [MOVE_POWER_TRIP - 1] = sPOWER_TRIPDescription, + [MOVE_BURN_UP - 1] = sBURN_UPDescription, + [MOVE_SPEED_SWAP - 1] = sSPEED_SWAPDescription, + [MOVE_SMART_STRIKE - 1] = sSMART_STRIKEDescription, + [MOVE_PURIFY - 1] = sPURIFYDescription, + [MOVE_REVELATION_DANCE - 1] = sREVELATION_DANCEDescription, + [MOVE_CORE_ENFORCER - 1] = sCORE_ENFORCERDescription, + [MOVE_TROP_KICK - 1] = sTROP_KICKDescription, + [MOVE_INSTRUCT - 1] = sINSTRUCTDescription, + [MOVE_BEAK_BLAST - 1] = sBEAK_BLASTDescription, + [MOVE_CLANGING_SCALES - 1] = sCLANGING_SCALESDescription, + [MOVE_DRAGON_HAMMER - 1] = sDRAGON_HAMMERDescription, + [MOVE_BRUTAL_SWING - 1] = sBRUTAL_SWINGDescription, + [MOVE_AURORA_VEIL - 1] = sAURORA_VEILDescription, + [MOVE_SHELL_TRAP - 1] = sSHELL_TRAPDescription, + [MOVE_FLEUR_CANNON - 1] = sFLEUR_CANNONDescription, + [MOVE_PSYCHIC_FANGS - 1] = sPSYCHIC_FANGSDescription, + [MOVE_STOMPING_TANTRUM - 1] = sSTOMPING_TANTRUMDescription, + [MOVE_SHADOW_BONE - 1] = sSHADOW_BONEDescription, + [MOVE_ACCELEROCK - 1] = sACCELEROCKDescription, + [MOVE_LIQUIDATION - 1] = sLIQUIDATIONDescription, + [MOVE_PRISMATIC_LASER - 1] = sPRISMATIC_LASERDescription, + [MOVE_SPECTRAL_THIEF - 1] = sSPECTRAL_THIEFDescription, + [MOVE_SUNSTEEL_STRIKE - 1] = sSUNSTEEL_STRIKEDescription, + [MOVE_MOONGEIST_BEAM - 1] = sMOONGEIST_BEAMDescription, + [MOVE_TEARFUL_LOOK - 1] = sTEARFUL_LOOKDescription, + [MOVE_ZING_ZAP - 1] = sZING_ZAPDescription, + [MOVE_NATURES_MADNESS - 1] = sNATURES_MADNESSDescription, + [MOVE_MULTI_ATTACK - 1] = sMULTI_ATTACKDescription, + [MOVE_MIND_BLOWN - 1] = sMIND_BLOWNDescription, + [MOVE_PLASMA_FISTS - 1] = sPLASMA_FISTSDescription, + [MOVE_PHOTON_GEYSER - 1] = sPHOTON_GEYSERDescription, + [MOVE_DOUBLE_IRON_BASH - 1] = sDOUBLE_IRON_BASHDescription, + //GEN 8 + [MOVE_DYNAMAX_CANNON - 1] = sDYNAMAX_CANNONDescription, + [MOVE_SNIPE_SHOT - 1] = sSNIPE_SHOTDescription, + [MOVE_JAW_LOCK - 1] = sJAW_LOCKDescription, + [MOVE_STUFF_CHEEKS - 1] = sSTUFF_CHEEKSDescription, + [MOVE_NO_RETREAT - 1] = sNO_RETREATDescription, + [MOVE_TAR_SHOT - 1] = sTAR_SHOTDescription, + [MOVE_MAGIC_POWDER - 1] = sMAGIC_POWDERDescription, + [MOVE_DRAGON_DARTS - 1] = sDRAGON_DARTSDescription, + [MOVE_TEATIME - 1] = sTEATIMEDescription, + [MOVE_OCTOLOCK - 1] = sOCTOLOCKDescription, + [MOVE_BOLT_BEAK - 1] = sBOLT_BEAKDescription, + [MOVE_FISHIOUS_REND - 1] = sFISHIOUS_RENDDescription, + [MOVE_COURT_CHANGE - 1] = sCOURT_CHANGEDescription, + [MOVE_CLANGOROUS_SOUL - 1] = sCLANGOROUS_SOULDescription, + [MOVE_BODY_PRESS - 1] = sBODY_PRESSDescription, + [MOVE_DECORATE - 1] = sDECORATEDescription, + [MOVE_DRUM_BEATING - 1] = sDRUM_BEATINGDescription, + [MOVE_SNAP_TRAP - 1] = sSNAP_TRAPDescription, + [MOVE_PYRO_BALL - 1] = sPYRO_BALLDescription, + [MOVE_BEHEMOTH_BLADE - 1] = sBEHEMOTH_BLADEDescription, + [MOVE_BEHEMOTH_BASH - 1] = sBEHEMOTH_BASHDescription, + [MOVE_AURA_WHEEL - 1] = sAURA_WHEELDescription, + [MOVE_BREAKING_SWIPE - 1] = sBREAKING_SWIPEDescription, + [MOVE_BRANCH_POKE - 1] = sBRANCH_POKEDescription, + [MOVE_OVERDRIVE - 1] = sOVERDRIVEDescription, + [MOVE_APPLE_ACID - 1] = sAPPLE_ACIDDescription, + [MOVE_GRAV_APPLE - 1] = sGRAV_APPLEDescription, + [MOVE_SPIRIT_BREAK - 1] = sSPIRIT_BREAKDescription, + [MOVE_STRANGE_STEAM - 1] = sSTRANGE_STEAMDescription, + [MOVE_LIFE_DEW - 1] = sLIFE_DEWDescription, + [MOVE_OBSTRUCT - 1] = sOBSTRUCTDescription, + [MOVE_FALSE_SURRENDER - 1] = sFALSE_SURRENDERDescription, + [MOVE_METEOR_ASSAULT - 1] = sMETEOR_ASSAULTDescription, + [MOVE_ETERNABEAM - 1] = sETERNABEAMDescription, + [MOVE_STEEL_BEAM - 1] = sSTEEL_BEAMDescription, }; diff --git a/src/data/text/move_names.h b/src/data/text/move_names.h index 9f540f1d68..2b56c06411 100644 --- a/src/data/text/move_names.h +++ b/src/data/text/move_names.h @@ -1,358 +1,716 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = { [MOVE_NONE] = _("-"), - [MOVE_POUND] = _("POUND"), - [MOVE_KARATE_CHOP] = _("KARATE CHOP"), - [MOVE_DOUBLE_SLAP] = _("DOUBLESLAP"), - [MOVE_COMET_PUNCH] = _("COMET PUNCH"), - [MOVE_MEGA_PUNCH] = _("MEGA PUNCH"), - [MOVE_PAY_DAY] = _("PAY DAY"), - [MOVE_FIRE_PUNCH] = _("FIRE PUNCH"), - [MOVE_ICE_PUNCH] = _("ICE PUNCH"), - [MOVE_THUNDER_PUNCH] = _("THUNDERPUNCH"), - [MOVE_SCRATCH] = _("SCRATCH"), - [MOVE_VICE_GRIP] = _("VICEGRIP"), - [MOVE_GUILLOTINE] = _("GUILLOTINE"), - [MOVE_RAZOR_WIND] = _("RAZOR WIND"), - [MOVE_SWORDS_DANCE] = _("SWORDS DANCE"), - [MOVE_CUT] = _("CUT"), - [MOVE_GUST] = _("GUST"), - [MOVE_WING_ATTACK] = _("WING ATTACK"), - [MOVE_WHIRLWIND] = _("WHIRLWIND"), - [MOVE_FLY] = _("FLY"), - [MOVE_BIND] = _("BIND"), - [MOVE_SLAM] = _("SLAM"), - [MOVE_VINE_WHIP] = _("VINE WHIP"), - [MOVE_STOMP] = _("STOMP"), - [MOVE_DOUBLE_KICK] = _("DOUBLE KICK"), - [MOVE_MEGA_KICK] = _("MEGA KICK"), - [MOVE_JUMP_KICK] = _("JUMP KICK"), - [MOVE_ROLLING_KICK] = _("ROLLING KICK"), - [MOVE_SAND_ATTACK] = _("SAND-ATTACK"), - [MOVE_HEADBUTT] = _("HEADBUTT"), - [MOVE_HORN_ATTACK] = _("HORN ATTACK"), - [MOVE_FURY_ATTACK] = _("FURY ATTACK"), - [MOVE_HORN_DRILL] = _("HORN DRILL"), - [MOVE_TACKLE] = _("TACKLE"), - [MOVE_BODY_SLAM] = _("BODY SLAM"), - [MOVE_WRAP] = _("WRAP"), - [MOVE_TAKE_DOWN] = _("TAKE DOWN"), - [MOVE_THRASH] = _("THRASH"), - [MOVE_DOUBLE_EDGE] = _("DOUBLE-EDGE"), - [MOVE_TAIL_WHIP] = _("TAIL WHIP"), - [MOVE_POISON_STING] = _("POISON STING"), - [MOVE_TWINEEDLE] = _("TWINEEDLE"), - [MOVE_PIN_MISSILE] = _("PIN MISSILE"), - [MOVE_LEER] = _("LEER"), - [MOVE_BITE] = _("BITE"), - [MOVE_GROWL] = _("GROWL"), - [MOVE_ROAR] = _("ROAR"), - [MOVE_SING] = _("SING"), - [MOVE_SUPERSONIC] = _("SUPERSONIC"), - [MOVE_SONIC_BOOM] = _("SONICBOOM"), - [MOVE_DISABLE] = _("DISABLE"), - [MOVE_ACID] = _("ACID"), - [MOVE_EMBER] = _("EMBER"), - [MOVE_FLAMETHROWER] = _("FLAMETHROWER"), - [MOVE_MIST] = _("MIST"), - [MOVE_WATER_GUN] = _("WATER GUN"), - [MOVE_HYDRO_PUMP] = _("HYDRO PUMP"), - [MOVE_SURF] = _("SURF"), - [MOVE_ICE_BEAM] = _("ICE BEAM"), - [MOVE_BLIZZARD] = _("BLIZZARD"), - [MOVE_PSYBEAM] = _("PSYBEAM"), - [MOVE_BUBBLE_BEAM] = _("BUBBLEBEAM"), - [MOVE_AURORA_BEAM] = _("AURORA BEAM"), - [MOVE_HYPER_BEAM] = _("HYPER BEAM"), - [MOVE_PECK] = _("PECK"), - [MOVE_DRILL_PECK] = _("DRILL PECK"), - [MOVE_SUBMISSION] = _("SUBMISSION"), - [MOVE_LOW_KICK] = _("LOW KICK"), - [MOVE_COUNTER] = _("COUNTER"), - [MOVE_SEISMIC_TOSS] = _("SEISMIC TOSS"), - [MOVE_STRENGTH] = _("STRENGTH"), - [MOVE_ABSORB] = _("ABSORB"), - [MOVE_MEGA_DRAIN] = _("MEGA DRAIN"), - [MOVE_LEECH_SEED] = _("LEECH SEED"), - [MOVE_GROWTH] = _("GROWTH"), - [MOVE_RAZOR_LEAF] = _("RAZOR LEAF"), - [MOVE_SOLAR_BEAM] = _("SOLARBEAM"), - [MOVE_POISON_POWDER] = _("POISONPOWDER"), - [MOVE_STUN_SPORE] = _("STUN SPORE"), - [MOVE_SLEEP_POWDER] = _("SLEEP POWDER"), - [MOVE_PETAL_DANCE] = _("PETAL DANCE"), - [MOVE_STRING_SHOT] = _("STRING SHOT"), - [MOVE_DRAGON_RAGE] = _("DRAGON RAGE"), - [MOVE_FIRE_SPIN] = _("FIRE SPIN"), - [MOVE_THUNDER_SHOCK] = _("THUNDERSHOCK"), - [MOVE_THUNDERBOLT] = _("THUNDERBOLT"), - [MOVE_THUNDER_WAVE] = _("THUNDER WAVE"), - [MOVE_THUNDER] = _("THUNDER"), - [MOVE_ROCK_THROW] = _("ROCK THROW"), - [MOVE_EARTHQUAKE] = _("EARTHQUAKE"), - [MOVE_FISSURE] = _("FISSURE"), - [MOVE_DIG] = _("DIG"), - [MOVE_TOXIC] = _("TOXIC"), - [MOVE_CONFUSION] = _("CONFUSION"), - [MOVE_PSYCHIC] = _("PSYCHIC"), - [MOVE_HYPNOSIS] = _("HYPNOSIS"), - [MOVE_MEDITATE] = _("MEDITATE"), - [MOVE_AGILITY] = _("AGILITY"), - [MOVE_QUICK_ATTACK] = _("QUICK ATTACK"), - [MOVE_RAGE] = _("RAGE"), - [MOVE_TELEPORT] = _("TELEPORT"), - [MOVE_NIGHT_SHADE] = _("NIGHT SHADE"), - [MOVE_MIMIC] = _("MIMIC"), - [MOVE_SCREECH] = _("SCREECH"), - [MOVE_DOUBLE_TEAM] = _("DOUBLE TEAM"), - [MOVE_RECOVER] = _("RECOVER"), - [MOVE_HARDEN] = _("HARDEN"), - [MOVE_MINIMIZE] = _("MINIMIZE"), - [MOVE_SMOKESCREEN] = _("SMOKESCREEN"), - [MOVE_CONFUSE_RAY] = _("CONFUSE RAY"), - [MOVE_WITHDRAW] = _("WITHDRAW"), - [MOVE_DEFENSE_CURL] = _("DEFENSE CURL"), - [MOVE_BARRIER] = _("BARRIER"), - [MOVE_LIGHT_SCREEN] = _("LIGHT SCREEN"), - [MOVE_HAZE] = _("HAZE"), - [MOVE_REFLECT] = _("REFLECT"), - [MOVE_FOCUS_ENERGY] = _("FOCUS ENERGY"), - [MOVE_BIDE] = _("BIDE"), - [MOVE_METRONOME] = _("METRONOME"), - [MOVE_MIRROR_MOVE] = _("MIRROR MOVE"), - [MOVE_SELF_DESTRUCT] = _("SELFDESTRUCT"), - [MOVE_EGG_BOMB] = _("EGG BOMB"), - [MOVE_LICK] = _("LICK"), - [MOVE_SMOG] = _("SMOG"), - [MOVE_SLUDGE] = _("SLUDGE"), - [MOVE_BONE_CLUB] = _("BONE CLUB"), - [MOVE_FIRE_BLAST] = _("FIRE BLAST"), - [MOVE_WATERFALL] = _("WATERFALL"), - [MOVE_CLAMP] = _("CLAMP"), - [MOVE_SWIFT] = _("SWIFT"), - [MOVE_SKULL_BASH] = _("SKULL BASH"), - [MOVE_SPIKE_CANNON] = _("SPIKE CANNON"), - [MOVE_CONSTRICT] = _("CONSTRICT"), - [MOVE_AMNESIA] = _("AMNESIA"), - [MOVE_KINESIS] = _("KINESIS"), - [MOVE_SOFT_BOILED] = _("SOFTBOILED"), - [MOVE_HI_JUMP_KICK] = _("HI JUMP KICK"), - [MOVE_GLARE] = _("GLARE"), - [MOVE_DREAM_EATER] = _("DREAM EATER"), - [MOVE_POISON_GAS] = _("POISON GAS"), - [MOVE_BARRAGE] = _("BARRAGE"), - [MOVE_LEECH_LIFE] = _("LEECH LIFE"), - [MOVE_LOVELY_KISS] = _("LOVELY KISS"), - [MOVE_SKY_ATTACK] = _("SKY ATTACK"), - [MOVE_TRANSFORM] = _("TRANSFORM"), - [MOVE_BUBBLE] = _("BUBBLE"), - [MOVE_DIZZY_PUNCH] = _("DIZZY PUNCH"), - [MOVE_SPORE] = _("SPORE"), - [MOVE_FLASH] = _("FLASH"), - [MOVE_PSYWAVE] = _("PSYWAVE"), - [MOVE_SPLASH] = _("SPLASH"), - [MOVE_ACID_ARMOR] = _("ACID ARMOR"), - [MOVE_CRABHAMMER] = _("CRABHAMMER"), - [MOVE_EXPLOSION] = _("EXPLOSION"), - [MOVE_FURY_SWIPES] = _("FURY SWIPES"), - [MOVE_BONEMERANG] = _("BONEMERANG"), - [MOVE_REST] = _("REST"), - [MOVE_ROCK_SLIDE] = _("ROCK SLIDE"), - [MOVE_HYPER_FANG] = _("HYPER FANG"), - [MOVE_SHARPEN] = _("SHARPEN"), - [MOVE_CONVERSION] = _("CONVERSION"), - [MOVE_TRI_ATTACK] = _("TRI ATTACK"), - [MOVE_SUPER_FANG] = _("SUPER FANG"), - [MOVE_SLASH] = _("SLASH"), - [MOVE_SUBSTITUTE] = _("SUBSTITUTE"), - [MOVE_STRUGGLE] = _("STRUGGLE"), - [MOVE_SKETCH] = _("SKETCH"), - [MOVE_TRIPLE_KICK] = _("TRIPLE KICK"), - [MOVE_THIEF] = _("THIEF"), - [MOVE_SPIDER_WEB] = _("SPIDER WEB"), - [MOVE_MIND_READER] = _("MIND READER"), - [MOVE_NIGHTMARE] = _("NIGHTMARE"), - [MOVE_FLAME_WHEEL] = _("FLAME WHEEL"), - [MOVE_SNORE] = _("SNORE"), - [MOVE_CURSE] = _("CURSE"), - [MOVE_FLAIL] = _("FLAIL"), - [MOVE_CONVERSION_2] = _("CONVERSION 2"), - [MOVE_AEROBLAST] = _("AEROBLAST"), - [MOVE_COTTON_SPORE] = _("COTTON SPORE"), - [MOVE_REVERSAL] = _("REVERSAL"), - [MOVE_SPITE] = _("SPITE"), - [MOVE_POWDER_SNOW] = _("POWDER SNOW"), - [MOVE_PROTECT] = _("PROTECT"), - [MOVE_MACH_PUNCH] = _("MACH PUNCH"), - [MOVE_SCARY_FACE] = _("SCARY FACE"), - [MOVE_FAINT_ATTACK] = _("FAINT ATTACK"), - [MOVE_SWEET_KISS] = _("SWEET KISS"), - [MOVE_BELLY_DRUM] = _("BELLY DRUM"), - [MOVE_SLUDGE_BOMB] = _("SLUDGE BOMB"), - [MOVE_MUD_SLAP] = _("MUD-SLAP"), - [MOVE_OCTAZOOKA] = _("OCTAZOOKA"), - [MOVE_SPIKES] = _("SPIKES"), - [MOVE_ZAP_CANNON] = _("ZAP CANNON"), - [MOVE_FORESIGHT] = _("FORESIGHT"), - [MOVE_DESTINY_BOND] = _("DESTINY BOND"), - [MOVE_PERISH_SONG] = _("PERISH SONG"), - [MOVE_ICY_WIND] = _("ICY WIND"), - [MOVE_DETECT] = _("DETECT"), - [MOVE_BONE_RUSH] = _("BONE RUSH"), - [MOVE_LOCK_ON] = _("LOCK-ON"), - [MOVE_OUTRAGE] = _("OUTRAGE"), - [MOVE_SANDSTORM] = _("SANDSTORM"), - [MOVE_GIGA_DRAIN] = _("GIGA DRAIN"), - [MOVE_ENDURE] = _("ENDURE"), - [MOVE_CHARM] = _("CHARM"), - [MOVE_ROLLOUT] = _("ROLLOUT"), - [MOVE_FALSE_SWIPE] = _("FALSE SWIPE"), - [MOVE_SWAGGER] = _("SWAGGER"), - [MOVE_MILK_DRINK] = _("MILK DRINK"), - [MOVE_SPARK] = _("SPARK"), - [MOVE_FURY_CUTTER] = _("FURY CUTTER"), - [MOVE_STEEL_WING] = _("STEEL WING"), - [MOVE_MEAN_LOOK] = _("MEAN LOOK"), - [MOVE_ATTRACT] = _("ATTRACT"), - [MOVE_SLEEP_TALK] = _("SLEEP TALK"), - [MOVE_HEAL_BELL] = _("HEAL BELL"), - [MOVE_RETURN] = _("RETURN"), - [MOVE_PRESENT] = _("PRESENT"), - [MOVE_FRUSTRATION] = _("FRUSTRATION"), - [MOVE_SAFEGUARD] = _("SAFEGUARD"), - [MOVE_PAIN_SPLIT] = _("PAIN SPLIT"), - [MOVE_SACRED_FIRE] = _("SACRED FIRE"), - [MOVE_MAGNITUDE] = _("MAGNITUDE"), - [MOVE_DYNAMIC_PUNCH] = _("DYNAMICPUNCH"), - [MOVE_MEGAHORN] = _("MEGAHORN"), - [MOVE_DRAGON_BREATH] = _("DRAGONBREATH"), - [MOVE_BATON_PASS] = _("BATON PASS"), - [MOVE_ENCORE] = _("ENCORE"), - [MOVE_PURSUIT] = _("PURSUIT"), - [MOVE_RAPID_SPIN] = _("RAPID SPIN"), - [MOVE_SWEET_SCENT] = _("SWEET SCENT"), - [MOVE_IRON_TAIL] = _("IRON TAIL"), - [MOVE_METAL_CLAW] = _("METAL CLAW"), - [MOVE_VITAL_THROW] = _("VITAL THROW"), - [MOVE_MORNING_SUN] = _("MORNING SUN"), - [MOVE_SYNTHESIS] = _("SYNTHESIS"), - [MOVE_MOONLIGHT] = _("MOONLIGHT"), - [MOVE_HIDDEN_POWER] = _("HIDDEN POWER"), - [MOVE_CROSS_CHOP] = _("CROSS CHOP"), - [MOVE_TWISTER] = _("TWISTER"), - [MOVE_RAIN_DANCE] = _("RAIN DANCE"), - [MOVE_SUNNY_DAY] = _("SUNNY DAY"), - [MOVE_CRUNCH] = _("CRUNCH"), - [MOVE_MIRROR_COAT] = _("MIRROR COAT"), - [MOVE_PSYCH_UP] = _("PSYCH UP"), - [MOVE_EXTREME_SPEED] = _("EXTREMESPEED"), - [MOVE_ANCIENT_POWER] = _("ANCIENTPOWER"), - [MOVE_SHADOW_BALL] = _("SHADOW BALL"), - [MOVE_FUTURE_SIGHT] = _("FUTURE SIGHT"), - [MOVE_ROCK_SMASH] = _("ROCK SMASH"), - [MOVE_WHIRLPOOL] = _("WHIRLPOOL"), - [MOVE_BEAT_UP] = _("BEAT UP"), - [MOVE_FAKE_OUT] = _("FAKE OUT"), - [MOVE_UPROAR] = _("UPROAR"), - [MOVE_STOCKPILE] = _("STOCKPILE"), - [MOVE_SPIT_UP] = _("SPIT UP"), - [MOVE_SWALLOW] = _("SWALLOW"), - [MOVE_HEAT_WAVE] = _("HEAT WAVE"), - [MOVE_HAIL] = _("HAIL"), - [MOVE_TORMENT] = _("TORMENT"), - [MOVE_FLATTER] = _("FLATTER"), - [MOVE_WILL_O_WISP] = _("WILL-O-WISP"), - [MOVE_MEMENTO] = _("MEMENTO"), - [MOVE_FACADE] = _("FACADE"), - [MOVE_FOCUS_PUNCH] = _("FOCUS PUNCH"), - [MOVE_SMELLING_SALT] = _("SMELLINGSALT"), - [MOVE_FOLLOW_ME] = _("FOLLOW ME"), - [MOVE_NATURE_POWER] = _("NATURE POWER"), - [MOVE_CHARGE] = _("CHARGE"), - [MOVE_TAUNT] = _("TAUNT"), - [MOVE_HELPING_HAND] = _("HELPING HAND"), - [MOVE_TRICK] = _("TRICK"), - [MOVE_ROLE_PLAY] = _("ROLE PLAY"), - [MOVE_WISH] = _("WISH"), - [MOVE_ASSIST] = _("ASSIST"), - [MOVE_INGRAIN] = _("INGRAIN"), - [MOVE_SUPERPOWER] = _("SUPERPOWER"), - [MOVE_MAGIC_COAT] = _("MAGIC COAT"), - [MOVE_RECYCLE] = _("RECYCLE"), - [MOVE_REVENGE] = _("REVENGE"), - [MOVE_BRICK_BREAK] = _("BRICK BREAK"), - [MOVE_YAWN] = _("YAWN"), - [MOVE_KNOCK_OFF] = _("KNOCK OFF"), - [MOVE_ENDEAVOR] = _("ENDEAVOR"), - [MOVE_ERUPTION] = _("ERUPTION"), - [MOVE_SKILL_SWAP] = _("SKILL SWAP"), - [MOVE_IMPRISON] = _("IMPRISON"), - [MOVE_REFRESH] = _("REFRESH"), - [MOVE_GRUDGE] = _("GRUDGE"), - [MOVE_SNATCH] = _("SNATCH"), - [MOVE_SECRET_POWER] = _("SECRET POWER"), - [MOVE_DIVE] = _("DIVE"), - [MOVE_ARM_THRUST] = _("ARM THRUST"), - [MOVE_CAMOUFLAGE] = _("CAMOUFLAGE"), - [MOVE_TAIL_GLOW] = _("TAIL GLOW"), - [MOVE_LUSTER_PURGE] = _("LUSTER PURGE"), - [MOVE_MIST_BALL] = _("MIST BALL"), - [MOVE_FEATHER_DANCE] = _("FEATHERDANCE"), - [MOVE_TEETER_DANCE] = _("TEETER DANCE"), - [MOVE_BLAZE_KICK] = _("BLAZE KICK"), - [MOVE_MUD_SPORT] = _("MUD SPORT"), - [MOVE_ICE_BALL] = _("ICE BALL"), - [MOVE_NEEDLE_ARM] = _("NEEDLE ARM"), - [MOVE_SLACK_OFF] = _("SLACK OFF"), - [MOVE_HYPER_VOICE] = _("HYPER VOICE"), - [MOVE_POISON_FANG] = _("POISON FANG"), - [MOVE_CRUSH_CLAW] = _("CRUSH CLAW"), - [MOVE_BLAST_BURN] = _("BLAST BURN"), - [MOVE_HYDRO_CANNON] = _("HYDRO CANNON"), - [MOVE_METEOR_MASH] = _("METEOR MASH"), - [MOVE_ASTONISH] = _("ASTONISH"), - [MOVE_WEATHER_BALL] = _("WEATHER BALL"), - [MOVE_AROMATHERAPY] = _("AROMATHERAPY"), - [MOVE_FAKE_TEARS] = _("FAKE TEARS"), - [MOVE_AIR_CUTTER] = _("AIR CUTTER"), - [MOVE_OVERHEAT] = _("OVERHEAT"), - [MOVE_ODOR_SLEUTH] = _("ODOR SLEUTH"), - [MOVE_ROCK_TOMB] = _("ROCK TOMB"), - [MOVE_SILVER_WIND] = _("SILVER WIND"), - [MOVE_METAL_SOUND] = _("METAL SOUND"), - [MOVE_GRASS_WHISTLE] = _("GRASSWHISTLE"), - [MOVE_TICKLE] = _("TICKLE"), - [MOVE_COSMIC_POWER] = _("COSMIC POWER"), - [MOVE_WATER_SPOUT] = _("WATER SPOUT"), - [MOVE_SIGNAL_BEAM] = _("SIGNAL BEAM"), - [MOVE_SHADOW_PUNCH] = _("SHADOW PUNCH"), - [MOVE_EXTRASENSORY] = _("EXTRASENSORY"), - [MOVE_SKY_UPPERCUT] = _("SKY UPPERCUT"), - [MOVE_SAND_TOMB] = _("SAND TOMB"), - [MOVE_SHEER_COLD] = _("SHEER COLD"), - [MOVE_MUDDY_WATER] = _("MUDDY WATER"), - [MOVE_BULLET_SEED] = _("BULLET SEED"), - [MOVE_AERIAL_ACE] = _("AERIAL ACE"), - [MOVE_ICICLE_SPEAR] = _("ICICLE SPEAR"), - [MOVE_IRON_DEFENSE] = _("IRON DEFENSE"), - [MOVE_BLOCK] = _("BLOCK"), - [MOVE_HOWL] = _("HOWL"), - [MOVE_DRAGON_CLAW] = _("DRAGON CLAW"), - [MOVE_FRENZY_PLANT] = _("FRENZY PLANT"), - [MOVE_BULK_UP] = _("BULK UP"), - [MOVE_BOUNCE] = _("BOUNCE"), - [MOVE_MUD_SHOT] = _("MUD SHOT"), - [MOVE_POISON_TAIL] = _("POISON TAIL"), - [MOVE_COVET] = _("COVET"), - [MOVE_VOLT_TACKLE] = _("VOLT TACKLE"), - [MOVE_MAGICAL_LEAF] = _("MAGICAL LEAF"), - [MOVE_WATER_SPORT] = _("WATER SPORT"), - [MOVE_CALM_MIND] = _("CALM MIND"), - [MOVE_LEAF_BLADE] = _("LEAF BLADE"), - [MOVE_DRAGON_DANCE] = _("DRAGON DANCE"), - [MOVE_ROCK_BLAST] = _("ROCK BLAST"), - [MOVE_SHOCK_WAVE] = _("SHOCK WAVE"), - [MOVE_WATER_PULSE] = _("WATER PULSE"), - [MOVE_DOOM_DESIRE] = _("DOOM DESIRE"), - [MOVE_PSYCHO_BOOST] = _("PSYCHO BOOST"), + [MOVE_POUND] = _("Pound"), + [MOVE_KARATE_CHOP] = _("Karate Chop"), + [MOVE_DOUBLE_SLAP] = _("Double Slap"), + [MOVE_COMET_PUNCH] = _("Comet Punch"), + [MOVE_MEGA_PUNCH] = _("Mega Punch"), + [MOVE_PAY_DAY] = _("Pay Day"), + [MOVE_FIRE_PUNCH] = _("Fire Punch"), + [MOVE_ICE_PUNCH] = _("Ice Punch"), + [MOVE_THUNDER_PUNCH] = _("ThunderPunch"), + [MOVE_SCRATCH] = _("Scratch"), + [MOVE_VICE_GRIP] = _("Vice Grip"), + [MOVE_GUILLOTINE] = _("Guillotine"), + [MOVE_RAZOR_WIND] = _("Razor Wind"), + [MOVE_SWORDS_DANCE] = _("Swords Dance"), + [MOVE_CUT] = _("Cut"), + [MOVE_GUST] = _("Gust"), + [MOVE_WING_ATTACK] = _("Wing Attack"), + [MOVE_WHIRLWIND] = _("Whirlwind"), + [MOVE_FLY] = _("Fly"), + [MOVE_BIND] = _("Bind"), + [MOVE_SLAM] = _("Slam"), + [MOVE_VINE_WHIP] = _("Vine Whip"), + [MOVE_STOMP] = _("Stomp"), + [MOVE_DOUBLE_KICK] = _("Double Kick"), + [MOVE_MEGA_KICK] = _("Mega Kick"), + [MOVE_JUMP_KICK] = _("Jump Kick"), + [MOVE_ROLLING_KICK] = _("Rolling Kick"), + [MOVE_SAND_ATTACK] = _("Sand-Attack"), + [MOVE_HEADBUTT] = _("Headbutt"), + [MOVE_HORN_ATTACK] = _("Horn Attack"), + [MOVE_FURY_ATTACK] = _("Fury Attack"), + [MOVE_HORN_DRILL] = _("Horn Drill"), + [MOVE_TACKLE] = _("Tackle"), + [MOVE_BODY_SLAM] = _("Body Slam"), + [MOVE_WRAP] = _("Wrap"), + [MOVE_TAKE_DOWN] = _("Take Down"), + [MOVE_THRASH] = _("Thrash"), + [MOVE_DOUBLE_EDGE] = _("Double-Edge"), + [MOVE_TAIL_WHIP] = _("Tail Whip"), + [MOVE_POISON_STING] = _("Poison Sting"), + [MOVE_TWINEEDLE] = _("Twineedle"), + [MOVE_PIN_MISSILE] = _("Pin Missile"), + [MOVE_LEER] = _("Leer"), + [MOVE_BITE] = _("Bite"), + [MOVE_GROWL] = _("Growl"), + [MOVE_ROAR] = _("Roar"), + [MOVE_SING] = _("Sing"), + [MOVE_SUPERSONIC] = _("Supersonic"), + [MOVE_SONIC_BOOM] = _("Sonic Boom"), + [MOVE_DISABLE] = _("Disable"), + [MOVE_ACID] = _("Acid"), + [MOVE_EMBER] = _("Ember"), + [MOVE_FLAMETHROWER] = _("Flamethrower"), + [MOVE_MIST] = _("Mist"), + [MOVE_WATER_GUN] = _("Water Gun"), + [MOVE_HYDRO_PUMP] = _("Hydro Pump"), + [MOVE_SURF] = _("Surf"), + [MOVE_ICE_BEAM] = _("Ice Beam"), + [MOVE_BLIZZARD] = _("Blizzard"), + [MOVE_PSYBEAM] = _("Psybeam"), + [MOVE_BUBBLE_BEAM] = _("Bubble Beam"), + [MOVE_AURORA_BEAM] = _("Aurora Beam"), + [MOVE_HYPER_BEAM] = _("Hyper Beam"), + [MOVE_PECK] = _("Peck"), + [MOVE_DRILL_PECK] = _("Drill Peck"), + [MOVE_SUBMISSION] = _("Submission"), + [MOVE_LOW_KICK] = _("Low Kick"), + [MOVE_COUNTER] = _("Counter"), + [MOVE_SEISMIC_TOSS] = _("Seismic Toss"), + [MOVE_STRENGTH] = _("Strength"), + [MOVE_ABSORB] = _("Absorb"), + [MOVE_MEGA_DRAIN] = _("Mega Drain"), + [MOVE_LEECH_SEED] = _("Leech Seed"), + [MOVE_GROWTH] = _("Growth"), + [MOVE_RAZOR_LEAF] = _("Razor Leaf"), + [MOVE_SOLAR_BEAM] = _("Solar Beam"), + [MOVE_POISON_POWDER] = _("PoisonPowder"), + [MOVE_STUN_SPORE] = _("Stun Spore"), + [MOVE_SLEEP_POWDER] = _("Sleep Powder"), + [MOVE_PETAL_DANCE] = _("Petal Dance"), + [MOVE_STRING_SHOT] = _("String Shot"), + [MOVE_DRAGON_RAGE] = _("Dragon Rage"), + [MOVE_FIRE_SPIN] = _("Fire Spin"), + [MOVE_THUNDER_SHOCK] = _("ThunderShock"), + [MOVE_THUNDERBOLT] = _("Thunderbolt"), + [MOVE_THUNDER_WAVE] = _("Thunder Wave"), + [MOVE_THUNDER] = _("Thunder"), + [MOVE_ROCK_THROW] = _("Rock Throw"), + [MOVE_EARTHQUAKE] = _("Earthquake"), + [MOVE_FISSURE] = _("Fissure"), + [MOVE_DIG] = _("Dig"), + [MOVE_TOXIC] = _("Toxic"), + [MOVE_CONFUSION] = _("Confusion"), + [MOVE_PSYCHIC] = _("Psychic"), + [MOVE_HYPNOSIS] = _("Hypnosis"), + [MOVE_MEDITATE] = _("Meditate"), + [MOVE_AGILITY] = _("Agility"), + [MOVE_QUICK_ATTACK] = _("Quick Attack"), + [MOVE_RAGE] = _("Rage"), + [MOVE_TELEPORT] = _("Teleport"), + [MOVE_NIGHT_SHADE] = _("Night Shade"), + [MOVE_MIMIC] = _("Mimic"), + [MOVE_SCREECH] = _("Screech"), + [MOVE_DOUBLE_TEAM] = _("Double Team"), + [MOVE_RECOVER] = _("Recover"), + [MOVE_HARDEN] = _("Harden"), + [MOVE_MINIMIZE] = _("Minimize"), + [MOVE_SMOKESCREEN] = _("SmokeScreen"), + [MOVE_CONFUSE_RAY] = _("Confuse Ray"), + [MOVE_WITHDRAW] = _("Withdraw"), + [MOVE_DEFENSE_CURL] = _("Defense Curl"), + [MOVE_BARRIER] = _("Barrier"), + [MOVE_LIGHT_SCREEN] = _("Light Screen"), + [MOVE_HAZE] = _("Haze"), + [MOVE_REFLECT] = _("Reflect"), + [MOVE_FOCUS_ENERGY] = _("Focus Energy"), + [MOVE_BIDE] = _("Bide"), + [MOVE_METRONOME] = _("Metronome"), + [MOVE_MIRROR_MOVE] = _("Mirror Move"), + [MOVE_SELF_DESTRUCT] = _("Selfdestruct"), + [MOVE_EGG_BOMB] = _("Egg Bomb"), + [MOVE_LICK] = _("Lick"), + [MOVE_SMOG] = _("Smog"), + [MOVE_SLUDGE] = _("Sludge"), + [MOVE_BONE_CLUB] = _("Bone Club"), + [MOVE_FIRE_BLAST] = _("Fire Blast"), + [MOVE_WATERFALL] = _("Waterfall"), + [MOVE_CLAMP] = _("Clamp"), + [MOVE_SWIFT] = _("Swift"), + [MOVE_SKULL_BASH] = _("Skull Bash"), + [MOVE_SPIKE_CANNON] = _("Spike Cannon"), + [MOVE_CONSTRICT] = _("Constrict"), + [MOVE_AMNESIA] = _("Amnesia"), + [MOVE_KINESIS] = _("Kinesis"), + [MOVE_SOFT_BOILED] = _("Softboiled"), + [MOVE_HI_JUMP_KICK] = _("Hi Jump Kick"), + [MOVE_GLARE] = _("Glare"), + [MOVE_DREAM_EATER] = _("Dream Eater"), + [MOVE_POISON_GAS] = _("Poison Gas"), + [MOVE_BARRAGE] = _("Barrage"), + [MOVE_LEECH_LIFE] = _("Leech Life"), + [MOVE_LOVELY_KISS] = _("Lovely Kiss"), + [MOVE_SKY_ATTACK] = _("Sky Attack"), + [MOVE_TRANSFORM] = _("Transform"), + [MOVE_BUBBLE] = _("Bubble"), + [MOVE_DIZZY_PUNCH] = _("Dizzy Punch"), + [MOVE_SPORE] = _("Spore"), + [MOVE_FLASH] = _("Flash"), + [MOVE_PSYWAVE] = _("Psywave"), + [MOVE_SPLASH] = _("Splash"), + [MOVE_ACID_ARMOR] = _("Acid Armor"), + [MOVE_CRABHAMMER] = _("Crabhammer"), + [MOVE_EXPLOSION] = _("Explosion"), + [MOVE_FURY_SWIPES] = _("Fury Swipes"), + [MOVE_BONEMERANG] = _("Bonemerang"), + [MOVE_REST] = _("Rest"), + [MOVE_ROCK_SLIDE] = _("Rock Slide"), + [MOVE_HYPER_FANG] = _("Hyper Fang"), + [MOVE_SHARPEN] = _("Sharpen"), + [MOVE_CONVERSION] = _("Conversion"), + [MOVE_TRI_ATTACK] = _("Tri Attack"), + [MOVE_SUPER_FANG] = _("Super Fang"), + [MOVE_SLASH] = _("Slash"), + [MOVE_SUBSTITUTE] = _("Substitute"), + [MOVE_STRUGGLE] = _("Struggle"), + [MOVE_SKETCH] = _("Sketch"), + [MOVE_TRIPLE_KICK] = _("Triple Kick"), + [MOVE_THIEF] = _("Thief"), + [MOVE_SPIDER_WEB] = _("Spider Web"), + [MOVE_MIND_READER] = _("Mind Reader"), + [MOVE_NIGHTMARE] = _("Nightmare"), + [MOVE_FLAME_WHEEL] = _("Flame Wheel"), + [MOVE_SNORE] = _("Snore"), + [MOVE_CURSE] = _("Curse"), + [MOVE_FLAIL] = _("Flail"), + [MOVE_CONVERSION_2] = _("Conversion 2"), + [MOVE_AEROBLAST] = _("Aeroblast"), + [MOVE_COTTON_SPORE] = _("Cotton Spore"), + [MOVE_REVERSAL] = _("Reversal"), + [MOVE_SPITE] = _("Spite"), + [MOVE_POWDER_SNOW] = _("Powder Snow"), + [MOVE_PROTECT] = _("Protect"), + [MOVE_MACH_PUNCH] = _("Mach Punch"), + [MOVE_SCARY_FACE] = _("Scary Face"), + [MOVE_FAINT_ATTACK] = _("Faint Attack"), + [MOVE_SWEET_KISS] = _("Sweet Kiss"), + [MOVE_BELLY_DRUM] = _("Belly Drum"), + [MOVE_SLUDGE_BOMB] = _("Sludge Bomb"), + [MOVE_MUD_SLAP] = _("Mud-Slap"), + [MOVE_OCTAZOOKA] = _("Octazooka"), + [MOVE_SPIKES] = _("Spikes"), + [MOVE_ZAP_CANNON] = _("Zap Cannon"), + [MOVE_FORESIGHT] = _("Foresight"), + [MOVE_DESTINY_BOND] = _("Destiny Bond"), + [MOVE_PERISH_SONG] = _("Perish Song"), + [MOVE_ICY_WIND] = _("Icy Wind"), + [MOVE_DETECT] = _("Detect"), + [MOVE_BONE_RUSH] = _("Bone Rush"), + [MOVE_LOCK_ON] = _("Lock-On"), + [MOVE_OUTRAGE] = _("Outrage"), + [MOVE_SANDSTORM] = _("Sandstorm"), + [MOVE_GIGA_DRAIN] = _("Giga Drain"), + [MOVE_ENDURE] = _("Endure"), + [MOVE_CHARM] = _("Charm"), + [MOVE_ROLLOUT] = _("Rollout"), + [MOVE_FALSE_SWIPE] = _("False Swipe"), + [MOVE_SWAGGER] = _("Swagger"), + [MOVE_MILK_DRINK] = _("Milk Drink"), + [MOVE_SPARK] = _("Spark"), + [MOVE_FURY_CUTTER] = _("Fury Cutter"), + [MOVE_STEEL_WING] = _("Steel Wing"), + [MOVE_MEAN_LOOK] = _("Mean Look"), + [MOVE_ATTRACT] = _("Attract"), + [MOVE_SLEEP_TALK] = _("Sleep Talk"), + [MOVE_HEAL_BELL] = _("Heal Bell"), + [MOVE_RETURN] = _("Return"), + [MOVE_PRESENT] = _("Present"), + [MOVE_FRUSTRATION] = _("Frustration"), + [MOVE_SAFEGUARD] = _("Safeguard"), + [MOVE_PAIN_SPLIT] = _("Pain Split"), + [MOVE_SACRED_FIRE] = _("Sacred Fire"), + [MOVE_MAGNITUDE] = _("Magnitude"), + [MOVE_DYNAMIC_PUNCH] = _("DynamicPunch"), + [MOVE_MEGAHORN] = _("Megahorn"), + [MOVE_DRAGON_BREATH] = _("DragonBreath"), + [MOVE_BATON_PASS] = _("Baton Pass"), + [MOVE_ENCORE] = _("Encore"), + [MOVE_PURSUIT] = _("Pursuit"), + [MOVE_RAPID_SPIN] = _("Rapid Spin"), + [MOVE_SWEET_SCENT] = _("Sweet Scent"), + [MOVE_IRON_TAIL] = _("Iron Tail"), + [MOVE_METAL_CLAW] = _("Metal Claw"), + [MOVE_VITAL_THROW] = _("Vital Throw"), + [MOVE_MORNING_SUN] = _("Morning Sun"), + [MOVE_SYNTHESIS] = _("Synthesis"), + [MOVE_MOONLIGHT] = _("Moonlight"), + [MOVE_HIDDEN_POWER] = _("Hidden Power"), + [MOVE_CROSS_CHOP] = _("Cross Chop"), + [MOVE_TWISTER] = _("Twister"), + [MOVE_RAIN_DANCE] = _("Rain Dance"), + [MOVE_SUNNY_DAY] = _("Sunny Day"), + [MOVE_CRUNCH] = _("Crunch"), + [MOVE_MIRROR_COAT] = _("Mirror Coat"), + [MOVE_PSYCH_UP] = _("Psych Up"), + [MOVE_EXTREME_SPEED] = _("ExtremeSpeed"), + [MOVE_ANCIENT_POWER] = _("AncientPower"), + [MOVE_SHADOW_BALL] = _("Shadow Ball"), + [MOVE_FUTURE_SIGHT] = _("Future Sight"), + [MOVE_ROCK_SMASH] = _("Rock Smash"), + [MOVE_WHIRLPOOL] = _("Whirlpool"), + [MOVE_BEAT_UP] = _("Beat Up"), + [MOVE_FAKE_OUT] = _("Fake Out"), + [MOVE_UPROAR] = _("Uproar"), + [MOVE_STOCKPILE] = _("Stockpile"), + [MOVE_SPIT_UP] = _("Spit Up"), + [MOVE_SWALLOW] = _("Swallow"), + [MOVE_HEAT_WAVE] = _("Heat Wave"), + [MOVE_HAIL] = _("Hail"), + [MOVE_TORMENT] = _("Torment"), + [MOVE_FLATTER] = _("Flatter"), + [MOVE_WILL_O_WISP] = _("Will-o-Wisp"), + [MOVE_MEMENTO] = _("Memento"), + [MOVE_FACADE] = _("Facade"), + [MOVE_FOCUS_PUNCH] = _("Focus Punch"), + [MOVE_SMELLING_SALT] = _("SmellingSalt"), + [MOVE_FOLLOW_ME] = _("Follow Me"), + [MOVE_NATURE_POWER] = _("Nature Power"), + [MOVE_CHARGE] = _("Charge"), + [MOVE_TAUNT] = _("Taunt"), + [MOVE_HELPING_HAND] = _("Helping Hand"), + [MOVE_TRICK] = _("Trick"), + [MOVE_ROLE_PLAY] = _("Role Play"), + [MOVE_WISH] = _("Wish"), + [MOVE_ASSIST] = _("Assist"), + [MOVE_INGRAIN] = _("Ingrain"), + [MOVE_SUPERPOWER] = _("Superpower"), + [MOVE_MAGIC_COAT] = _("Magic Coat"), + [MOVE_RECYCLE] = _("Recycle"), + [MOVE_REVENGE] = _("Revenge"), + [MOVE_BRICK_BREAK] = _("Brick Break"), + [MOVE_YAWN] = _("Yawn"), + [MOVE_KNOCK_OFF] = _("Knock Off"), + [MOVE_ENDEAVOR] = _("Endeavor"), + [MOVE_ERUPTION] = _("Eruption"), + [MOVE_SKILL_SWAP] = _("Skill Swap"), + [MOVE_IMPRISON] = _("Imprison"), + [MOVE_REFRESH] = _("Refresh"), + [MOVE_GRUDGE] = _("Grudge"), + [MOVE_SNATCH] = _("Snatch"), + [MOVE_SECRET_POWER] = _("Secret Power"), + [MOVE_DIVE] = _("Dive"), + [MOVE_ARM_THRUST] = _("Arm Thrust"), + [MOVE_CAMOUFLAGE] = _("Camouflage"), + [MOVE_TAIL_GLOW] = _("Tail Glow"), + [MOVE_LUSTER_PURGE] = _("Luster Purge"), + [MOVE_MIST_BALL] = _("Mist Ball"), + [MOVE_FEATHER_DANCE] = _("FeatherDance"), + [MOVE_TEETER_DANCE] = _("Teeter Dance"), + [MOVE_BLAZE_KICK] = _("Blaze Kick"), + [MOVE_MUD_SPORT] = _("Mud Sport"), + [MOVE_ICE_BALL] = _("Ice Ball"), + [MOVE_NEEDLE_ARM] = _("Needle Arm"), + [MOVE_SLACK_OFF] = _("Slack Off"), + [MOVE_HYPER_VOICE] = _("Hyper Voice"), + [MOVE_POISON_FANG] = _("Poison Fang"), + [MOVE_CRUSH_CLAW] = _("Crush Claw"), + [MOVE_BLAST_BURN] = _("Blast Burn"), + [MOVE_HYDRO_CANNON] = _("Hydro Cannon"), + [MOVE_METEOR_MASH] = _("Meteor Mash"), + [MOVE_ASTONISH] = _("Astonish"), + [MOVE_WEATHER_BALL] = _("Weather Ball"), + [MOVE_AROMATHERAPY] = _("Aromatherapy"), + [MOVE_FAKE_TEARS] = _("Fake Tears"), + [MOVE_AIR_CUTTER] = _("Air Cutter"), + [MOVE_OVERHEAT] = _("Overheat"), + [MOVE_ODOR_SLEUTH] = _("Odor Sleuth"), + [MOVE_ROCK_TOMB] = _("Rock Tomb"), + [MOVE_SILVER_WIND] = _("Silver Wind"), + [MOVE_METAL_SOUND] = _("Metal Sound"), + [MOVE_GRASS_WHISTLE] = _("GrassWhistle"), + [MOVE_TICKLE] = _("Tickle"), + [MOVE_COSMIC_POWER] = _("Cosmic Power"), + [MOVE_WATER_SPOUT] = _("Water Spout"), + [MOVE_SIGNAL_BEAM] = _("Signal Beam"), + [MOVE_SHADOW_PUNCH] = _("Shadow Punch"), + [MOVE_EXTRASENSORY] = _("Extrasensory"), + [MOVE_SKY_UPPERCUT] = _("Sky Uppercut"), + [MOVE_SAND_TOMB] = _("Sand Tomb"), + [MOVE_SHEER_COLD] = _("Sheer Cold"), + [MOVE_MUDDY_WATER] = _("Muddy Water"), + [MOVE_BULLET_SEED] = _("Bullet Seed"), + [MOVE_AERIAL_ACE] = _("Aerial Ace"), + [MOVE_ICICLE_SPEAR] = _("Icicle Spear"), + [MOVE_IRON_DEFENSE] = _("Iron Defense"), + [MOVE_BLOCK] = _("Block"), + [MOVE_HOWL] = _("Howl"), + [MOVE_DRAGON_CLAW] = _("Dragon Claw"), + [MOVE_FRENZY_PLANT] = _("Frenzy Plant"), + [MOVE_BULK_UP] = _("Bulk Up"), + [MOVE_BOUNCE] = _("Bounce"), + [MOVE_MUD_SHOT] = _("Mud Shot"), + [MOVE_POISON_TAIL] = _("Poison Tail"), + [MOVE_COVET] = _("Covet"), + [MOVE_VOLT_TACKLE] = _("Volt Tackle"), + [MOVE_MAGICAL_LEAF] = _("Magical Leaf"), + [MOVE_WATER_SPORT] = _("Water Sport"), + [MOVE_CALM_MIND] = _("Calm Mind"), + [MOVE_LEAF_BLADE] = _("Leaf Blade"), + [MOVE_DRAGON_DANCE] = _("Dragon Dance"), + [MOVE_ROCK_BLAST] = _("Rock Blast"), + [MOVE_SHOCK_WAVE] = _("Shock Wave"), + [MOVE_WATER_PULSE] = _("Water Pulse"), + [MOVE_DOOM_DESIRE] = _("Doom Desire"), + [MOVE_PSYCHO_BOOST] = _("Psycho Boost"), + [MOVE_ROOST] = _("Roost"), + [MOVE_GRAVITY] = _("Gravity"), + [MOVE_MIRACLE_EYE] = _("Miracle Eye"), + [MOVE_WAKE_UP_SLAP] = _("Wake Up Slap"), + [MOVE_HAMMER_ARM] = _("Hammer Arm"), + [MOVE_GYRO_BALL] = _("Gyro Ball"), + [MOVE_HEALING_WISH] = _("Healing Wish"), + [MOVE_BRINE] = _("Brine"), + [MOVE_NATURAL_GIFT] = _("Natural Gift"), + [MOVE_FEINT] = _("Feint"), + [MOVE_PLUCK] = _("Pluck"), + [MOVE_TAILWIND] = _("Tailwind"), + [MOVE_ACUPRESSURE] = _("Acupressure"), + [MOVE_METAL_BURST] = _("Metal Burst"), + [MOVE_U_TURN] = _("U-Turn"), + [MOVE_CLOSE_COMBAT] = _("Close Combat"), + [MOVE_PAYBACK] = _("Payback"), + [MOVE_ASSURANCE] = _("Assurance"), + [MOVE_EMBARGO] = _("Embargo"), + [MOVE_FLING] = _("Fling"), + [MOVE_PSYCHO_SHIFT] = _("Psycho Shift"), + [MOVE_TRUMP_CARD] = _("Trump Card"), + [MOVE_HEAL_BLOCK] = _("Heal Block"), + [MOVE_WRING_OUT] = _("Wring Out"), + [MOVE_POWER_TRICK] = _("Power Trick"), + [MOVE_GASTRO_ACID] = _("Gastro Acid"), + [MOVE_LUCKY_CHANT] = _("Lucky Chant"), + [MOVE_ME_FIRST] = _("Me First"), + [MOVE_COPYCAT] = _("Copycat"), + [MOVE_POWER_SWAP] = _("Power Swap"), + [MOVE_GUARD_SWAP] = _("Guard Swap"), + [MOVE_PUNISHMENT] = _("Punishment"), + [MOVE_LAST_RESORT] = _("Last Resort"), + [MOVE_WORRY_SEED] = _("Worry Seed"), + [MOVE_SUCKER_PUNCH] = _("Sucker Punch"), + [MOVE_TOXIC_SPIKES] = _("Toxic Spikes"), + [MOVE_HEART_SWAP] = _("Heart Swap"), + [MOVE_AQUA_RING] = _("Aqua Ring"), + [MOVE_MAGNET_RISE] = _("Magnet Rise"), + [MOVE_FLARE_BLITZ] = _("Flare Blitz"), + [MOVE_FORCE_PALM] = _("Force Palm"), + [MOVE_AURA_SPHERE] = _("Aura Sphere"), + [MOVE_ROCK_POLISH] = _("Rock Polish"), + [MOVE_POISON_JAB] = _("Poison Jab"), + [MOVE_DARK_PULSE] = _("Dark Pulse"), + [MOVE_NIGHT_SLASH] = _("Night Slash"), + [MOVE_AQUA_TAIL] = _("Aqua Tail"), + [MOVE_SEED_BOMB] = _("Seed Bomb"), + [MOVE_AIR_SLASH] = _("Air Slash"), + [MOVE_X_SCISSOR] = _("X Scissor"), + [MOVE_BUG_BUZZ] = _("Bug Buzz"), + [MOVE_DRAGON_PULSE] = _("Dragon Pulse"), + [MOVE_DRAGON_RUSH] = _("Dragon Rush"), + [MOVE_POWER_GEM] = _("Power Gem"), + [MOVE_DRAIN_PUNCH] = _("Drain Punch"), + [MOVE_VACUUM_WAVE] = _("Vacuum Wave"), + [MOVE_FOCUS_BLAST] = _("Focus Blast"), + [MOVE_ENERGY_BALL] = _("Energy Ball"), + [MOVE_BRAVE_BIRD] = _("Brave Bird"), + [MOVE_EARTH_POWER] = _("Earth Power"), + [MOVE_SWITCHEROO] = _("Switcheroo"), + [MOVE_GIGA_IMPACT] = _("Giga Impact"), + [MOVE_NASTY_PLOT] = _("Nasty Plot"), + [MOVE_BULLET_PUNCH] = _("Bullet Punch"), + [MOVE_AVALANCHE] = _("Avalanche"), + [MOVE_ICE_SHARD] = _("Ice Shard"), + [MOVE_SHADOW_CLAW] = _("Shadow Claw"), + [MOVE_THUNDER_FANG] = _("Thunder Fang"), + [MOVE_ICE_FANG] = _("Ice Fang"), + [MOVE_FIRE_FANG] = _("Fire Fang"), + [MOVE_SHADOW_SNEAK] = _("Shadow Sneak"), + [MOVE_MUD_BOMB] = _("Mud Bomb"), + [MOVE_PSYCHO_CUT] = _("Psycho Cut"), + [MOVE_ZEN_HEADBUTT] = _("Zen Headbutt"), + [MOVE_MIRROR_SHOT] = _("Mirror Shot"), + [MOVE_FLASH_CANNON] = _("Flash Cannon"), + [MOVE_ROCK_CLIMB] = _("Rock Climb"), + [MOVE_DEFOG] = _("Defog"), + [MOVE_TRICK_ROOM] = _("Trick Room"), + [MOVE_DRACO_METEOR] = _("Draco Meteor"), + [MOVE_DISCHARGE] = _("Discharge"), + [MOVE_LAVA_PLUME] = _("Lava Plume"), + [MOVE_LEAF_STORM] = _("Leaf Storm"), + [MOVE_POWER_WHIP] = _("Power Whip"), + [MOVE_ROCK_WRECKER] = _("Rock Wrecker"), + [MOVE_CROSS_POISON] = _("Cross Poison"), + [MOVE_GUNK_SHOT] = _("Gunk Shot"), + [MOVE_IRON_HEAD] = _("Iron Head"), + [MOVE_MAGNET_BOMB] = _("Magnet Bomb"), + [MOVE_STONE_EDGE] = _("Stone Edge"), + [MOVE_CAPTIVATE] = _("Captivate"), + [MOVE_STEALTH_ROCK] = _("Stealth Rock"), + [MOVE_GRASS_KNOT] = _("Grass Knot"), + [MOVE_CHATTER] = _("Chatter"), + [MOVE_JUDGMENT] = _("Judgment"), + [MOVE_BUG_BITE] = _("Bug Bite"), + [MOVE_CHARGE_BEAM] = _("Charge Beam"), + [MOVE_WOOD_HAMMER] = _("Wood Hammer"), + [MOVE_AQUA_JET] = _("Aqua Jet"), + [MOVE_ATTACK_ORDER] = _("Attack Order"), + [MOVE_DEFEND_ORDER] = _("Defend Order"), + [MOVE_HEAL_ORDER] = _("Heal Order"), + [MOVE_HEAD_SMASH] = _("Head Smash"), + [MOVE_DOUBLE_HIT] = _("Double Hit"), + [MOVE_ROAR_OF_TIME] = _("Roar Of Time"), + [MOVE_SPACIAL_REND] = _("Spacial Rend"), + [MOVE_LUNAR_DANCE] = _("Lunar Dance"), + [MOVE_CRUSH_GRIP] = _("Crush Grip"), + [MOVE_MAGMA_STORM] = _("Magma Storm"), + [MOVE_DARK_VOID] = _("Dark Void"), + [MOVE_SEED_FLARE] = _("Seed Flare"), + [MOVE_OMINOUS_WIND] = _("Ominous Wind"), + [MOVE_SHADOW_FORCE] = _("Shadow Force"), + [MOVE_HONE_CLAWS] = _("Hone Claws"), + [MOVE_WIDE_GUARD] = _("Wide Guard"), + [MOVE_GUARD_SPLIT] = _("Guard Split"), + [MOVE_POWER_SPLIT] = _("Power Split"), + [MOVE_WONDER_ROOM] = _("Wonder Room"), + [MOVE_PSYSHOCK] = _("Psyshock"), + [MOVE_VENOSHOCK] = _("Venoshock"), + [MOVE_AUTOTOMIZE] = _("Autotomize"), + [MOVE_RAGE_POWDER] = _("Rage Powder"), + [MOVE_TELEKINESIS] = _("Telekinesis"), + [MOVE_MAGIC_ROOM] = _("Magic Room"), + [MOVE_SMACK_DOWN] = _("Smack Down"), + [MOVE_STORM_THROW] = _("Storm Throw"), + [MOVE_FLAME_BURST] = _("Flame Burst"), + [MOVE_SLUDGE_WAVE] = _("Sludge Wave"), + [MOVE_QUIVER_DANCE] = _("Quiver Dance"), + [MOVE_HEAVY_SLAM] = _("Heavy Slam"), + [MOVE_SYNCHRONOISE] = _("Synchronoise"), + [MOVE_ELECTRO_BALL] = _("Electro Ball"), + [MOVE_SOAK] = _("Soak"), + [MOVE_FLAME_CHARGE] = _("Flame Charge"), + [MOVE_COIL] = _("Coil"), + [MOVE_LOW_SWEEP] = _("Low Sweep"), + [MOVE_ACID_SPRAY] = _("Acid Spray"), + [MOVE_FOUL_PLAY] = _("Foul Play"), + [MOVE_SIMPLE_BEAM] = _("Simple Beam"), + [MOVE_ENTRAINMENT] = _("Entrainment"), + [MOVE_AFTER_YOU] = _("After You"), + [MOVE_ROUND] = _("Round"), + [MOVE_ECHOED_VOICE] = _("Echoed Voice"), + [MOVE_CHIP_AWAY] = _("Chip Away"), + [MOVE_CLEAR_SMOG] = _("Clear Smog"), + [MOVE_STORED_POWER] = _("Stored Power"), + [MOVE_QUICK_GUARD] = _("Quick Guard"), + [MOVE_ALLY_SWITCH] = _("Ally Switch"), + [MOVE_SCALD] = _("Scald"), + [MOVE_SHELL_SMASH] = _("Shell Smash"), + [MOVE_HEAL_PULSE] = _("Heal Pulse"), + [MOVE_HEX] = _("Hex"), + [MOVE_SKY_DROP] = _("Sky Drop"), + [MOVE_SHIFT_GEAR] = _("Shift Gear"), + [MOVE_CIRCLE_THROW] = _("Circle Throw"), + [MOVE_INCINERATE] = _("Incinerate"), + [MOVE_QUASH] = _("Quash"), + [MOVE_ACROBATICS] = _("Acrobatics"), + [MOVE_REFLECT_TYPE] = _("Reflect Type"), + [MOVE_RETALIATE] = _("Retaliate"), + [MOVE_FINAL_GAMBIT] = _("Final Gambit"), + [MOVE_BESTOW] = _("Bestow"), + [MOVE_INFERNO] = _("Inferno"), + [MOVE_WATER_PLEDGE] = _("Water Pledge"), + [MOVE_FIRE_PLEDGE] = _("Fire Pledge"), + [MOVE_GRASS_PLEDGE] = _("Grass Pledge"), + [MOVE_VOLT_SWITCH] = _("Volt Switch"), + [MOVE_STRUGGLE_BUG] = _("Struggle Bug"), + [MOVE_BULLDOZE] = _("Bulldoze"), + [MOVE_FROST_BREATH] = _("Frost Breath"), + [MOVE_DRAGON_TAIL] = _("Dragon Tail"), + [MOVE_WORK_UP] = _("Work Up"), + [MOVE_ELECTROWEB] = _("Electroweb"), + [MOVE_WILD_CHARGE] = _("Wild Charge"), + [MOVE_DRILL_RUN] = _("Drill Run"), + [MOVE_DUAL_CHOP] = _("Dual Chop"), + [MOVE_HEART_STAMP] = _("Heart Stamp"), + [MOVE_HORN_LEECH] = _("Horn Leech"), + [MOVE_SACRED_SWORD] = _("Sacred Sword"), + [MOVE_RAZOR_SHELL] = _("Razor Shell"), + [MOVE_HEAT_CRASH] = _("Heat Crash"), + [MOVE_LEAF_TORNADO] = _("Leaf Tornado"), + [MOVE_STEAMROLLER] = _("Steamroller"), + [MOVE_COTTON_GUARD] = _("Cotton Guard"), + [MOVE_NIGHT_DAZE] = _("Night Daze"), + [MOVE_PSYSTRIKE] = _("Psystrike"), + [MOVE_TAIL_SLAP] = _("Tail Slap"), + [MOVE_HURRICANE] = _("Hurricane"), + [MOVE_HEAD_CHARGE] = _("Head Charge"), + [MOVE_GEAR_GRIND] = _("Gear Grind"), + [MOVE_SEARING_SHOT] = _("Searing Shot"), + [MOVE_TECHNO_BLAST] = _("Techno Blast"), + [MOVE_RELIC_SONG] = _("Relic Song"), + [MOVE_SECRET_SWORD] = _("Secret Sword"), + [MOVE_GLACIATE] = _("Glaciate"), + [MOVE_BOLT_STRIKE] = _("Bolt Strike"), + [MOVE_BLUE_FLARE] = _("Blue Flare"), + [MOVE_FIERY_DANCE] = _("Fiery Dance"), + [MOVE_FREEZE_SHOCK] = _("Freeze Shock"), + [MOVE_ICE_BURN] = _("Ice Burn"), + [MOVE_SNARL] = _("Snarl"), + [MOVE_ICICLE_CRASH] = _("Icicle Crash"), + [MOVE_V_CREATE] = _("V-create"), + [MOVE_FUSION_FLARE] = _("Fusion Flare"), + [MOVE_FUSION_BOLT] = _("Fusion Bolt"), + [MOVE_FLYING_PRESS] = _("Flying Press"), + [MOVE_MAT_BLOCK] = _("Mat Block"), + [MOVE_BELCH] = _("Belch"), + [MOVE_ROTOTILLER] = _("Rototiller"), + [MOVE_STICKY_WEB] = _("Sticky Web"), + [MOVE_FELL_STINGER] = _("Fell Stinger"), + [MOVE_PHANTOM_FORCE] = _("PhantomForce"), + [MOVE_TRICK_OR_TREAT] = _("Halloween"), + [MOVE_NOBLE_ROAR] = _("Noble Roar"), + [MOVE_ION_DELUGE] = _("Ion Deluge"), + [MOVE_PARABOLIC_CHARGE] = _("Parabolic Ch"), + [MOVE_FORESTS_CURSE] = _("ForestsCurse"), + [MOVE_PETAL_BLIZZARD] = _("Petal Storm"), + [MOVE_FREEZE_DRY] = _("Freeze-Dry"), + [MOVE_DISARMING_VOICE] = _("Disarming Vo"), + [MOVE_PARTING_SHOT] = _("Parting Shot"), + [MOVE_TOPSY_TURVY] = _("Topsy Turvy"), + [MOVE_DRAINING_KISS] = _("DrainingKiss"), + [MOVE_CRAFTY_SHIELD] = _("CraftyShield"), + [MOVE_FLOWER_SHIELD] = _("FlowerShield"), + [MOVE_GRASSY_TERRAIN] = _("GrassTerrain"), + [MOVE_MISTY_TERRAIN] = _("MistyTerrain"), + [MOVE_ELECTRIFY] = _("Electrify"), + [MOVE_PLAY_ROUGH] = _("Play Rough"), + [MOVE_FAIRY_WIND] = _("Fairy Wind"), + [MOVE_MOONBLAST] = _("Moonblast"), + [MOVE_BOOMBURST] = _("Boomburst"), + [MOVE_FAIRY_LOCK] = _("Fairy Lock"), + [MOVE_KINGS_SHIELD] = _("Kings Shield"), + [MOVE_PLAY_NICE] = _("Play Nice"), + [MOVE_CONFIDE] = _("Confide"), + [MOVE_DIAMOND_STORM] = _("DiamondStorm"), + [MOVE_STEAM_ERUPTION] = _("Steam Erupt"), + [MOVE_HYPERSPACE_HOLE] = _("Hyperspace H"), + [MOVE_WATER_SHURIKEN] = _("Water Shuri"), + [MOVE_MYSTICAL_FIRE] = _("MysticalFire"), + [MOVE_SPIKY_SHIELD] = _("Spiky Shield"), + [MOVE_AROMATIC_MIST] = _("AromaticMist"), + [MOVE_EERIE_IMPULSE] = _("EerieImpulse"), + [MOVE_VENOM_DRENCH] = _("Venom Drench"), + [MOVE_POWDER] = _("Powder"), + [MOVE_GEOMANCY] = _("Geomancy"), + [MOVE_MAGNETIC_FLUX] = _("MagneticFlux"), + [MOVE_HAPPY_HOUR] = _("Happy Hour"), + [MOVE_ELECTRIC_TERRAIN] = _("Electric Ter"), + [MOVE_DAZZLING_GLEAM] = _("Dazzling Gle"), + [MOVE_CELEBRATE] = _("Celebrate"), + [MOVE_HOLD_HANDS] = _("Hold Hands"), + [MOVE_BABY_DOLL_EYES] = _("BabyDollEyes"), + [MOVE_NUZZLE] = _("Nuzzle"), + [MOVE_HOLD_BACK] = _("Hold Back"), + [MOVE_INFESTATION] = _("Infestation"), + [MOVE_POWER_UP_PUNCH] = _("PowerUpPunch"), + [MOVE_OBLIVION_WING] = _("OblivionWing"), + [MOVE_THOUSAND_ARROWS] = _("Thousand Ar"), + [MOVE_THOUSAND_WAVES] = _("Thousand Wav"), + [MOVE_LANDS_WRATH] = _("Lands Wrath"), + [MOVE_LIGHT_OF_RUIN] = _("LightOfRuin"), + [MOVE_ORIGIN_PULSE] = _("Origin Pulse"), + [MOVE_PRECIPICE_BLADES] = _("Precipice Bl"), + [MOVE_DRAGON_ASCENT] = _("DragonAscent"), + [MOVE_HYPERSPACE_FURY] = _("Hyperspace F"), + [MOVE_SHORE_UP] = _("Shore Up"), + [MOVE_FIRST_IMPRESSION] = _("First Impres"), + [MOVE_BANEFUL_BUNKER] = _("Baneful Bunk"), + [MOVE_SPIRIT_SHACKLE] = _("Spirit Shack"), + [MOVE_DARKEST_LARIAT] = _("Darkest Lari"), + [MOVE_SPARKLING_ARIA] = _("Sparkling Ar"), + [MOVE_ICE_HAMMER] = _("Ice Hammer"), + [MOVE_FLORAL_HEALING] = _("Floral Heali"), + [MOVE_HIGH_HORSEPOWER] = _("High Horsepo"), + [MOVE_STRENGTH_SAP] = _("Strength Sap"), + [MOVE_SOLAR_BLADE] = _("Solar Blade"), + [MOVE_LEAFAGE] = _("Leafage"), + [MOVE_SPOTLIGHT] = _("Spotlight"), + [MOVE_TOXIC_THREAD] = _("Toxic Thread"), + [MOVE_LASER_FOCUS] = _("Laser Focus"), + [MOVE_GEAR_UP] = _("Gear Up"), + [MOVE_THROAT_CHOP] = _("Throat Chop"), + [MOVE_POLLEN_PUFF] = _("Pollen Puff"), + [MOVE_ANCHOR_SHOT] = _("Anchor Shot"), + [MOVE_PSYCHIC_TERRAIN] = _("Psychic Terr"), + [MOVE_LUNGE] = _("Lunge"), + [MOVE_FIRE_LASH] = _("Fire Lash"), + [MOVE_POWER_TRIP] = _("Power Trip"), + [MOVE_BURN_UP] = _("Burn Up"), + [MOVE_SPEED_SWAP] = _("Speed Swap"), + [MOVE_SMART_STRIKE] = _("Smart Strike"), + [MOVE_PURIFY] = _("Purify"), + [MOVE_REVELATION_DANCE] = _("Revelation D"), + [MOVE_CORE_ENFORCER] = _("CoreEnforcer"), + [MOVE_TROP_KICK] = _("Trop Kick"), + [MOVE_INSTRUCT] = _("Instruct"), + [MOVE_BEAK_BLAST] = _("Beak Blast"), + [MOVE_CLANGING_SCALES] = _("Clanging Sca"), + [MOVE_DRAGON_HAMMER] = _("DragonHammer"), + [MOVE_BRUTAL_SWING] = _("Brutal Swing"), + [MOVE_AURORA_VEIL] = _("Aurora Veil"), + [MOVE_SHELL_TRAP] = _("Shell Trap"), + [MOVE_FLEUR_CANNON] = _("Fleur Cannon"), + [MOVE_PSYCHIC_FANGS] = _("PsychicFangs"), + [MOVE_STOMPING_TANTRUM] = _("Stomping Tan"), + [MOVE_SHADOW_BONE] = _("Shadow Bone"), + [MOVE_ACCELEROCK] = _("Accelerock"), + [MOVE_LIQUIDATION] = _("Liquidation"), + [MOVE_PRISMATIC_LASER] = _("Prismatic La"), + [MOVE_SPECTRAL_THIEF] = _("Spectral Thi"), + [MOVE_SUNSTEEL_STRIKE] = _("Sunsteel Str"), + [MOVE_MOONGEIST_BEAM] = _("Moongeist Be"), + [MOVE_TEARFUL_LOOK] = _("Tearful Look"), + [MOVE_ZING_ZAP] = _("Zing Zap"), + [MOVE_NATURES_MADNESS] = _("Nature's Mad"), + [MOVE_MULTI_ATTACK] = _("Multi-Attack"), + [MOVE_MIND_BLOWN] = _("Mind Blown"), + [MOVE_PLASMA_FISTS] = _("Plasma Fists"), + [MOVE_PHOTON_GEYSER] = _("PhotonGeyser"), + [MOVE_DOUBLE_IRON_BASH] = _("D. Iron Bash"), + //GEN 8 + [MOVE_DYNAMAX_CANNON] = _("Dyna Cannon"), + [MOVE_SNIPE_SHOT] = _("Snipe Shot"), + [MOVE_JAW_LOCK] = _("Jaw Lock"), + [MOVE_STUFF_CHEEKS] = _("StuffCheeks"), + [MOVE_NO_RETREAT] = _("No Retreat"), + [MOVE_TAR_SHOT] = _("Tar Shot"), + [MOVE_MAGIC_POWDER] = _("MagicPowder"), + [MOVE_DRAGON_DARTS] = _("DragonDarts"), + [MOVE_TEATIME] = _("Teatime"), + [MOVE_OCTOLOCK] = _("Octolock"), + [MOVE_BOLT_BEAK] = _("Bolt Beak"), + [MOVE_FISHIOUS_REND] = _("Fishy Rend"), + [MOVE_COURT_CHANGE] = _("CourtChange"), + [MOVE_CLANGOROUS_SOUL] = _("Clangy Soul"), + [MOVE_BODY_PRESS] = _("Body Press"), + [MOVE_DECORATE] = _("Decorate"), + [MOVE_DRUM_BEATING] = _("Drum Beat"), + [MOVE_SNAP_TRAP] = _("Snap Trap"), + [MOVE_PYRO_BALL] = _("Pyro Ball"), + [MOVE_BEHEMOTH_BLADE] = _("Behemoth Bl"), + [MOVE_BEHEMOTH_BASH] = _("Behemoth Ba"), + [MOVE_AURA_WHEEL] = _("Aura Wheel"), + [MOVE_BREAKING_SWIPE] = _("Break Swipe"), + [MOVE_BRANCH_POKE] = _("Branch Poke"), + [MOVE_OVERDRIVE] = _("Overdrive"), + [MOVE_APPLE_ACID] = _("Apple Acid"), + [MOVE_GRAV_APPLE] = _("Grav Apple"), + [MOVE_SPIRIT_BREAK] = _("Spirit Break"), + [MOVE_STRANGE_STEAM] = _("Weird Steam"), + [MOVE_LIFE_DEW] = _("Life Dew"), + [MOVE_OBSTRUCT] = _("Obstruct"), + [MOVE_FALSE_SURRENDER] = _("False Yield"), + [MOVE_METEOR_ASSAULT] = _("Meteor Ass."), + [MOVE_ETERNABEAM] = _("Eternabeam"), + [MOVE_STEEL_BEAM] = _("Steel Beam"), }; diff --git a/src/graphics.c b/src/graphics.c index 3973c15076..c7eff52374 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -20,6 +20,271 @@ const u32 gSmokescreenImpactPalette[] = INCBIN_U32("graphics/battle_anims/sprite const u32 gBlankGfxCompressed[] = INCBIN_U32("graphics/interface/blank.4bpp.lz"); +// New Battle anims Particles +const u32 gBattleAnimSpriteGfx_WhiteStreak[] = INCBIN_U32("graphics/battle_anims/sprites/white_streak.4bpp.lz"); +const u32 gBattleAnimSpritePal_WhiteStreak[] = INCBIN_U32("graphics/battle_anims/sprites/white_streak.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_PurpleJab[] = INCBIN_U32("graphics/battle_anims/sprites/purple_jab.4bpp.lz"); +const u32 gBattleAnimSpritePal_PurpleJab[] = INCBIN_U32("graphics/battle_anims/sprites/purple_jab.gbapal.lz"); + +const u32 gBattleAnimSpritePal_ToxicSpikes[] = INCBIN_U32("graphics/battle_anims/sprites/toxic_spikes.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_EnergyBall[] = INCBIN_U32("graphics/battle_anims/sprites/energy_ball.4bpp.lz"); +const u32 gBattleAnimSpritePal_EnergyBall[] = INCBIN_U32("graphics/battle_anims/sprites/energy_ball.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_MegaStone[] = INCBIN_U32("graphics/battle_anims/sprites/mega_stone.4bpp.lz"); +const u32 gBattleAnimSpritePal_MegaStone[] = INCBIN_U32("graphics/battle_anims/sprites/mega_stone.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_MegaParticles[] = INCBIN_U32("graphics/battle_anims/sprites/mega_particles.4bpp.lz"); +const u32 gBattleAnimSpritePal_MegaParticles[] = INCBIN_U32("graphics/battle_anims/sprites/mega_particles.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_MegaSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/mega_symbol.4bpp.lz"); +const u32 gBattleAnimSpritePal_MegaSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/mega_symbol.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_FlashCannonBall[] = INCBIN_U32("graphics/battle_anims/sprites/flash_cannon_ball.4bpp.lz"); +const u32 gBattleAnimSpritePal_FlashCannonBall[] = INCBIN_U32("graphics/battle_anims/sprites/flash_cannon_ball.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_WaterGun[] = INCBIN_U32("graphics/battle_anims/sprites/water_gun.4bpp.lz"); +const u32 gBattleAnimSpritePal_WaterGun[] = INCBIN_U32("graphics/battle_anims/sprites/water_gun.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_Punishment[] = INCBIN_U32("graphics/battle_anims/sprites/punishment.4bpp.lz"); +const u32 gBattleAnimSpritePal_Punishment[] = INCBIN_U32("graphics/battle_anims/sprites/punishment.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_QuickGuard[] = INCBIN_U32("graphics/battle_anims/sprites/quick_guard.4bpp.lz"); +const u32 gBattleAnimSpritePal_QuickGuard[] = INCBIN_U32("graphics/battle_anims/sprites/quick_guard.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_AcupressureFinger[] = INCBIN_U32("graphics/battle_anims/sprites/new/acupressure_finger.4bpp.lz"); +const u32 gBattleAnimSpritePal_AcupressureFinger[] = INCBIN_U32("graphics/battle_anims/sprites/new/acupressure_finger.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_AlphaStone[] = INCBIN_U32("graphics/battle_anims/sprites/new/alpha_stone.4bpp.lz"); +const u32 gBattleAnimSpritePal_AlphaStone[] = INCBIN_U32("graphics/battle_anims/sprites/new/alpha_stone.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_Anchor[] = INCBIN_U32("graphics/battle_anims/sprites/new/anchor.4bpp.lz"); + +const u32 gBattleAnimSpriteGfx_Apple[] = INCBIN_U32("graphics/battle_anims/sprites/new/apple.4bpp.lz"); +const u32 gBattleAnimSpritePal_Apple[] = INCBIN_U32("graphics/battle_anims/sprites/new/apple.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_Arrows[] = INCBIN_U32("graphics/battle_anims/sprites/new/arrows.4bpp.lz"); + +const u32 gBattleAnimSpriteGfx_AssuranceHand[] = INCBIN_U32("graphics/battle_anims/sprites/new/assurance_hand.4bpp.lz"); +const u32 gBattleAnimSpritePal_AssuranceHand[] = INCBIN_U32("graphics/battle_anims/sprites/new/assurance_hand.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_AuraSphere[] = INCBIN_U32("graphics/battle_anims/sprites/new/aura_sphere.4bpp.lz"); +const u32 gBattleAnimSpritePal_AuraSphere[] = INCBIN_U32("graphics/battle_anims/sprites/new/aura_sphere.gbapal.lz"); + +const u32 gBattleAnimSpritePal_AvalancheRocks[] = INCBIN_U32("graphics/battle_anims/sprites/new/avalanche_rocks.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_NewPokeball[] = INCBIN_U32("graphics/battle_anims/sprites/new/baton_pass_ball.4bpp.lz"); +const u32 gBattleAnimSpritePal_NewPokeball[] = INCBIN_U32("graphics/battle_anims/sprites/new/baton_pass_ball.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_BerryEaten[] = INCBIN_U32("graphics/battle_anims/sprites/new/berry_eaten.4bpp.lz"); +const u32 gBattleAnimSpritePal_BerryEaten[] = INCBIN_U32("graphics/battle_anims/sprites/new/berry_eaten.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_BerryNormal[] = INCBIN_U32("graphics/battle_anims/sprites/new/berry_normal.4bpp.lz"); +const u32 gBattleAnimSpritePal_BerryNormal[] = INCBIN_U32("graphics/battle_anims/sprites/new/berry_normal.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_BigRock[] = INCBIN_U32("graphics/battle_anims/sprites/new/big_rock.4bpp.lz"); +const u32 gBattleAnimSpritePal_BigRock[] = INCBIN_U32("graphics/battle_anims/sprites/new/big_rock.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_BlacephalonHead[] = INCBIN_U32("graphics/battle_anims/sprites/new/blacephalon_head.4bpp.lz"); +const u32 gBattleAnimSpritePal_BlacephalonHead[] = INCBIN_U32("graphics/battle_anims/sprites/new/blacephalon_head.gbapal.lz"); + +const u32 gBattleAnimSpritePal_BlueFlare[] = INCBIN_U32("graphics/battle_anims/sprites/new/blue_flare.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_Branch[] = INCBIN_U32("graphics/battle_anims/sprites/new/branch.4bpp.lz"); +const u32 gBattleAnimSpritePal_Branch[] = INCBIN_U32("graphics/battle_anims/sprites/new/branch.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_Brine[] = INCBIN_U32("graphics/battle_anims/sprites/new/brine.4bpp.lz"); +const u32 gBattleAnimSpritePal_Brine[] = INCBIN_U32("graphics/battle_anims/sprites/new/brine.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_ChainLink[] = INCBIN_U32("graphics/battle_anims/sprites/new/chain_link.4bpp.lz"); +const u32 gBattleAnimSpritePal_ChainLink[] = INCBIN_U32("graphics/battle_anims/sprites/new/chain_link.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_Chop[] = INCBIN_U32("graphics/battle_anims/sprites/new/chop.4bpp.lz"); +const u32 gBattleAnimSpritePal_Chop[] = INCBIN_U32("graphics/battle_anims/sprites/new/chop.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_Cacoon[] = INCBIN_U32("graphics/battle_anims/sprites/new/cacoon.4bpp.lz"); +const u32 gBattleAnimSpritePal_Cacoon[] = INCBIN_U32("graphics/battle_anims/sprites/new/cacoon.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_Confide[] = INCBIN_U32("graphics/battle_anims/sprites/new/confide.4bpp.lz"); +const u32 gBattleAnimSpritePal_Confide[] = INCBIN_U32("graphics/battle_anims/sprites/new/confide.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_CraftyShield[] = INCBIN_U32("graphics/battle_anims/sprites/new/crafty_shield.4bpp.lz"); +const u32 gBattleAnimSpritePal_CraftyShield[] = INCBIN_U32("graphics/battle_anims/sprites/new/crafty_shield.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_NewNail[] = INCBIN_U32("graphics/battle_anims/sprites/new/curse_nail.4bpp.lz"); +const u32 gBattleAnimSpritePal_NewNail[] = INCBIN_U32("graphics/battle_anims/sprites/new/curse_nail.gbapal.lz"); + +const u32 gBattleAnimSpritePal_DracoMeteor[] = INCBIN_U32("graphics/battle_anims/sprites/new/draco_meteor.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_DragonPulseRing[] = INCBIN_U32("graphics/battle_anims/sprites/new/dragon_pulse_ring.4bpp.lz"); +const u32 gBattleAnimSpritePal_DragonPulseRing[] = INCBIN_U32("graphics/battle_anims/sprites/new/dragon_pulse_ring.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_DreepyMissile[] = INCBIN_U32("graphics/battle_anims/sprites/new/dreepy_missile.4bpp.lz"); +const u32 gBattleAnimSpritePal_DreepyMissile[] = INCBIN_U32("graphics/battle_anims/sprites/new/dreepy_missile.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_Drill[] = INCBIN_U32("graphics/battle_anims/sprites/new/drill.4bpp.lz"); +const u32 gBattleAnimSpritePal_Drill[] = INCBIN_U32("graphics/battle_anims/sprites/new/drill.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_NewEmbers[] = INCBIN_U32("graphics/battle_anims/sprites/new/embers.4bpp.lz"); +const u32 gBattleAnimSpritePal_NewEmbers[] = INCBIN_U32("graphics/battle_anims/sprites/new/embers.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_FairyLockChains[] = INCBIN_U32("graphics/battle_anims/sprites/new/fairy_lock_chains.4bpp.lz"); + +const u32 gBattleAnimSpriteGfx_Fishies[] = INCBIN_U32("graphics/battle_anims/sprites/new/fishies.4bpp.lz"); +const u32 gBattleAnimSpritePal_Fishies[] = INCBIN_U32("graphics/battle_anims/sprites/new/fishies.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_NewFly[] = INCBIN_U32("graphics/battle_anims/sprites/new/fly.4bpp.lz"); +const u32 gBattleAnimSpritePal_NewFly[] = INCBIN_U32("graphics/battle_anims/sprites/new/fly.gbapal.lz"); + +const u32 gBattleAnimSpritePal_FusionFlare[] = INCBIN_U32("graphics/battle_anims/sprites/new/fusion_flare.gbapal.lz"); + +const u32 gBattleAnimSpritePal_GarbagePoisonPillar[] = INCBIN_U32("graphics/battle_anims/sprites/new/garbage_poison_column.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_Gear[] = INCBIN_U32("graphics/battle_anims/sprites/new/gear.4bpp.lz"); +const u32 gBattleAnimSpritePal_Gear[] = INCBIN_U32("graphics/battle_anims/sprites/new/gear.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_GigavoltHavocSpear[] = INCBIN_U32("graphics/battle_anims/sprites/new/gigavolt_havoc_spear.4bpp.lz"); +const u32 gBattleAnimSpritePal_GigavoltHavocSpear[] = INCBIN_U32("graphics/battle_anims/sprites/new/gigavolt_havoc_spear.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_GoldenApple[] = INCBIN_U32("graphics/battle_anims/sprites/new/golden_apple.4bpp.lz"); +const u32 gBattleAnimSpritePal_GoldenApple[] = INCBIN_U32("graphics/battle_anims/sprites/new/golden_apple.gbapal.lz"); + +const u32 gBattleAnimSpritePal_GreenDrake[] = INCBIN_U32("graphics/battle_anims/sprites/new/green_drake.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_NewGreenStar[] = INCBIN_U32("graphics/battle_anims/sprites/new/green_star.4bpp.lz"); +const u32 gBattleAnimSpritePal_NewGreenStar[] = INCBIN_U32("graphics/battle_anims/sprites/new/green_star.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_HeartStamp[] = INCBIN_U32("graphics/battle_anims/sprites/new/heart_stamp.4bpp.lz"); +const u32 gBattleAnimSpritePal_HeartStamp[] = INCBIN_U32("graphics/battle_anims/sprites/new/heart_stamp.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_ZygardeHexes[] = INCBIN_U32("graphics/battle_anims/sprites/new/hexes.4bpp.lz"); +const u32 gBattleAnimSpritePal_ZygardeHexes[] = INCBIN_U32("graphics/battle_anims/sprites/new/hexes.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_HoopaHand[] = INCBIN_U32("graphics/battle_anims/sprites/new/hoopa_hand.4bpp.lz"); +const u32 gBattleAnimSpritePal_HoopaHand[] = INCBIN_U32("graphics/battle_anims/sprites/new/hoopa_hand.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_HoopaRing[] = INCBIN_U32("graphics/battle_anims/sprites/new/hoopa_ring.4bpp.lz"); +const u32 gBattleAnimSpritePal_HoopaRing[] = INCBIN_U32("graphics/battle_anims/sprites/new/hoopa_ring.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_NewHornHit[] = INCBIN_U32("graphics/battle_anims/sprites/new/horn.4bpp.lz"); +const u32 gBattleAnimSpritePal_NewHornHit[] = INCBIN_U32("graphics/battle_anims/sprites/new/horn.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_HornLeech[] = INCBIN_U32("graphics/battle_anims/sprites/new/horn_leech.4bpp.lz"); +const u32 gBattleAnimSpritePal_HornLeech[] = INCBIN_U32("graphics/battle_anims/sprites/new/horn_leech.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_HorseshoeFist[] = INCBIN_U32("graphics/battle_anims/sprites/new/horseshoe_fist.4bpp.lz"); +const u32 gBattleAnimSpritePal_HorseshoeFist[] = INCBIN_U32("graphics/battle_anims/sprites/new/horseshoe_fist.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_HydroPump[] = INCBIN_U32("graphics/battle_anims/sprites/new/hydro_pump.4bpp.lz"); +const u32 gBattleAnimSpritePal_HydroPump[] = INCBIN_U32("graphics/battle_anims/sprites/new/hydro_pump.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_IceRock[] = INCBIN_U32("graphics/battle_anims/sprites/new/ice_rock.4bpp.lz"); +const u32 gBattleAnimSpritePal_IceRock[] = INCBIN_U32("graphics/battle_anims/sprites/new/ice_rock.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_LargeSpike[] = INCBIN_U32("graphics/battle_anims/sprites/new/large_spike.4bpp.lz"); +const u32 gBattleAnimSpritePal_LargeSpike[] = INCBIN_U32("graphics/battle_anims/sprites/new/large_spike.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_NewLeaf[] = INCBIN_U32("graphics/battle_anims/sprites/new/leaves.4bpp.lz"); +const u32 gBattleAnimSpritePal_NewLeaf[] = INCBIN_U32("graphics/battle_anims/sprites/new/leaves.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_NewLeechSeed[] = INCBIN_U32("graphics/battle_anims/sprites/new/leech_seed.4bpp.lz"); +const u32 gBattleAnimSpritePal_NewLeechSeed[] = INCBIN_U32("graphics/battle_anims/sprites/new/leech_seed.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_LightningRain[] = INCBIN_U32("graphics/battle_anims/sprites/new/lightning_rain.4bpp.lz"); +const u32 gBattleAnimSpritePal_LightningRain[] = INCBIN_U32("graphics/battle_anims/sprites/new/lightning_rain.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_NewEye[] = INCBIN_U32("graphics/battle_anims/sprites/new/mean_look.4bpp.lz"); +const u32 gBattleAnimSpritePal_NewEye[] = INCBIN_U32("graphics/battle_anims/sprites/new/mean_look.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_MetalBits[] = INCBIN_U32("graphics/battle_anims/sprites/new/metal_bits.4bpp.lz"); + +const u32 gBattleAnimSpriteGfx_MudBomb[] = INCBIN_U32("graphics/battle_anims/sprites/new/mud_bomb.4bpp.lz"); +const u32 gBattleAnimSpritePal_MudBomb[] = INCBIN_U32("graphics/battle_anims/sprites/new/mud_bomb.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_Mushroom[] = INCBIN_U32("graphics/battle_anims/sprites/new/mushroom.4bpp.lz"); +const u32 gBattleAnimSpritePal_Mushroom[] = INCBIN_U32("graphics/battle_anims/sprites/new/mushroom.gbapal.lz"); + +const u32 gBattleAnimSpritePal_NaturalGiftRing[] = INCBIN_U32("graphics/battle_anims/sprites/new/natural_gift_ring.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_NecrozmaStar[] = INCBIN_U32("graphics/battle_anims/sprites/new/necrozma_star.4bpp.lz"); +const u32 gBattleAnimSpritePal_NecrozmaStar[] = INCBIN_U32("graphics/battle_anims/sprites/new/necrozma_star.gbapal.lz"); + +const u32 gBattleAnimSpritePal_NewImpact[] = INCBIN_U32("graphics/battle_anims/sprites/new/impact.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_Obstruct[] = INCBIN_U32("graphics/battle_anims/sprites/new/obstruct.4bpp.lz"); +const u32 gBattleAnimSpritePal_Obstruct[] = INCBIN_U32("graphics/battle_anims/sprites/new/obstruct.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_OmegaStone[] = INCBIN_U32("graphics/battle_anims/sprites/new/omega_stone.4bpp.lz"); +const u32 gBattleAnimSpritePal_OmegaStone[] = INCBIN_U32("graphics/battle_anims/sprites/new/omega_stone.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_PinkDiamond[] = INCBIN_U32("graphics/battle_anims/sprites/new/pink_diamond.4bpp.lz"); +const u32 gBattleAnimSpritePal_PinkDiamond[] = INCBIN_U32("graphics/battle_anims/sprites/new/pink_diamond.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_PoisonColumn[] = INCBIN_U32("graphics/battle_anims/sprites/new/poison_column.4bpp.lz"); +const u32 gBattleAnimSpritePal_PoisonColumn[] = INCBIN_U32("graphics/battle_anims/sprites/new/poison_column.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_PowerTrick[] = INCBIN_U32("graphics/battle_anims/sprites/new/power_trick.4bpp.lz"); +const u32 gBattleAnimSpritePal_PowerTrick[] = INCBIN_U32("graphics/battle_anims/sprites/new/power_trick.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_PurpleDrake[] = INCBIN_U32("graphics/battle_anims/sprites/new/purple_drake.4bpp.lz"); +const u32 gBattleAnimSpritePal_PurpleDrake[] = INCBIN_U32("graphics/battle_anims/sprites/new/purple_drake.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_RazorShell[] = INCBIN_U32("graphics/battle_anims/sprites/new/razor_shell.4bpp.lz"); +const u32 gBattleAnimSpritePal_RazorShell[] = INCBIN_U32("graphics/battle_anims/sprites/new/razor_shell.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_RocksSmall[] = INCBIN_U32("graphics/battle_anims/sprites/new/rock_small.4bpp.lz"); + +const u32 gBattleAnimSpriteGfx_NewRocks[] = INCBIN_U32("graphics/battle_anims/sprites/new/rocks.4bpp.lz"); +const u32 gBattleAnimSpritePal_NewRocks[] = INCBIN_U32("graphics/battle_anims/sprites/new/rocks.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_ShellLeft[] = INCBIN_U32("graphics/battle_anims/sprites/new/shell_left.4bpp.lz"); +const u32 gBattleAnimSpritePal_ShellLeft[] = INCBIN_U32("graphics/battle_anims/sprites/new/shell_left.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_ShellRight[] = INCBIN_U32("graphics/battle_anims/sprites/new/shell_right.4bpp.lz"); + +const u32 gBattleAnimSpritePal_SpacialRendSlices[] = INCBIN_U32("graphics/battle_anims/sprites/new/spacial_rend_slices.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_NewSpikes[] = INCBIN_U32("graphics/battle_anims/sprites/new/spikes.4bpp.lz"); +const u32 gBattleAnimSpritePal_NewSpikes[] = INCBIN_U32("graphics/battle_anims/sprites/new/spikes.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_SpiritShackleArrow[] = INCBIN_U32("graphics/battle_anims/sprites/new/spirit_shackle_arrow.4bpp.lz"); +const u32 gBattleAnimSpritePal_SpiritShackleArrow[] = INCBIN_U32("graphics/battle_anims/sprites/new/spirit_shackle_arrow.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_SteamEruption[] = INCBIN_U32("graphics/battle_anims/sprites/new/steam_eruption.4bpp.lz"); +const u32 gBattleAnimSpritePal_SteamEruption[] = INCBIN_U32("graphics/battle_anims/sprites/new/steam_eruption.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_Steamroller[] = INCBIN_U32("graphics/battle_anims/sprites/new/steamroller.4bpp.lz"); +const u32 gBattleAnimSpritePal_Steamroller[] = INCBIN_U32("graphics/battle_anims/sprites/new/steamroller.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_StonePillar[] = INCBIN_U32("graphics/battle_anims/sprites/new/stone_pillar.4bpp.lz"); +const u32 gBattleAnimSpritePal_StonePillar[] = INCBIN_U32("graphics/battle_anims/sprites/new/stone_pillar.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_StraightBeam[] = INCBIN_U32("graphics/battle_anims/sprites/new/straight_beam.4bpp.lz"); +const u32 gBattleAnimSpritePal_StraightBeam[] = INCBIN_U32("graphics/battle_anims/sprites/new/straight_beam.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_SubstituteBack[] = INCBIN_U32("graphics/battle_anims/sprites/new/substitute_back.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_NewSubstituteFront[] = INCBIN_U32("graphics/battle_anims/sprites/new/substitute_front.4bpp.lz"); +const u32 gBattleAnimSpritePal_NewSubstituteFront[] = INCBIN_U32("graphics/battle_anims/sprites/new/substitute_front.gbapal.lz"); + +const u32 gBattleAnimSpritePal_NewSurf[] = INCBIN_U32("graphics/battle_anims/sprites/new/surf_new.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_NewSword[] = INCBIN_U32("graphics/battle_anims/sprites/new/sword.4bpp.lz"); +const u32 gBattleAnimSpritePal_NewSword[] = INCBIN_U32("graphics/battle_anims/sprites/new/sword.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_NewTeeth[] = INCBIN_U32("graphics/battle_anims/sprites/new/teeth.4bpp.lz"); +const u32 gBattleAnimSpritePal_NewTeeth[] = INCBIN_U32("graphics/battle_anims/sprites/new/teeth.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_NewHandsAndFeet[] = INCBIN_U32("graphics/battle_anims/sprites/new/thrash.4bpp.lz"); +const u32 gBattleAnimSpritePal_NewHandsAndFeet[] = INCBIN_U32("graphics/battle_anims/sprites/new/thrash.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_Tornado[] = INCBIN_U32("graphics/battle_anims/sprites/new/tornado.4bpp.lz"); +const u32 gBattleAnimSpritePal_Tornado[] = INCBIN_U32("graphics/battle_anims/sprites/new/tornado.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_ZMoveSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/new/z_move_symbol.4bpp.lz"); +const u32 gBattleAnimSpritePal_ZMoveSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/new/z_move_symbol.gbapal.lz"); + + // Battle anims const u32 gBattleAnimSpriteGfx_Bubble[] = INCBIN_U32("graphics/battle_anims/sprites/bubble.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Bone[] = INCBIN_U32("graphics/battle_anims/sprites/bone.4bpp.lz"); @@ -27,6 +292,7 @@ const u32 gBattleAnimSpriteGfx_AirWave[] = INCBIN_U32("graphics/battle_anims/spr const u32 gBattleAnimSpriteGfx_Orb[] = INCBIN_U32("graphics/battle_anims/sprites/orb.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Sword[] = INCBIN_U32("graphics/battle_anims/sprites/sword.4bpp.lz"); const u32 gBattleAnimSpriteGfx_Seed[] = INCBIN_U32("graphics/battle_anims/sprites/seed.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_SeedBrown[] = INCBIN_U32("graphics/battle_anims/sprites/seed_new.4bpp.lz"); const u32 gBattleAnimSpritePal_RainDrops[] = INCBIN_U32("graphics/battle_anims/sprites/rain_drops.gbapal.lz"); const u32 gBattleAnimSpritePal_Bone[] = INCBIN_U32("graphics/battle_anims/sprites/bone.gbapal.lz"); @@ -34,6 +300,7 @@ const u32 gBattleAnimSpritePal_AirWave[] = INCBIN_U32("graphics/battle_anims/spr const u32 gBattleAnimSpritePal_Orb[] = INCBIN_U32("graphics/battle_anims/sprites/orb.gbapal.lz"); const u32 gBattleAnimSpritePal_Sword[] = INCBIN_U32("graphics/battle_anims/sprites/sword.gbapal.lz"); const u32 gBattleAnimSpritePal_Seed[] = INCBIN_U32("graphics/battle_anims/sprites/seed.gbapal.lz"); +const u32 gBattleAnimSpritePal_SeedBrown[] = INCBIN_U32("graphics/battle_anims/sprites/seed_new.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Needle[] = INCBIN_U32("graphics/battle_anims/sprites/needle.4bpp.lz"); const u32 gBattleAnimSpritePal_Needle[] = INCBIN_U32("graphics/battle_anims/sprites/needle.gbapal.lz"); @@ -93,6 +360,21 @@ const u32 gBattleAnimSpritePal_Hit2[] = INCBIN_U32("graphics/battle_anims/sprite const u32 gBattleAnimSpritePal_WavingHand[] = INCBIN_U32("graphics/battle_anims/sprites/waving_hand.gbapal.lz"); const u32 gBattleAnimSpriteGfx_WavingHand[] = INCBIN_U32("graphics/battle_anims/sprites/waving_hand.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Feint[] = INCBIN_U32("graphics/battle_anims/sprites/feint_punch.4bpp.lz"); +const u32 gBattleAnimSpritePal_Feint[] = INCBIN_U32("graphics/battle_anims/sprites/feint_punch.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_TrumpCard[] = INCBIN_U32("graphics/battle_anims/sprites/trump_cards.4bpp.lz"); +const u32 gBattleAnimSpritePal_TrumpCard[] = INCBIN_U32("graphics/battle_anims/sprites/trump_cards.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_TrumpCardParticles[] = INCBIN_U32("graphics/battle_anims/sprites/trump_card_particles.4bpp.lz"); +const u32 gBattleAnimSpritePal_TrumpCardParticles[] = INCBIN_U32("graphics/battle_anims/sprites/trump_card_particles.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_Accupressure[] = INCBIN_U32("graphics/battle_anims/sprites/accupressure.4bpp.lz"); +const u32 gBattleAnimSpritePal_Accupressure[] = INCBIN_U32("graphics/battle_anims/sprites/accupressure.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_WringOut[] = INCBIN_U32("graphics/battle_anims/sprites/wring_out.4bpp.lz"); +const u32 gBattleAnimSpritePal_WringOut[] = INCBIN_U32("graphics/battle_anims/sprites/wring_out.gbapal.lz"); + const u32 gBattleAnimSpriteGfx_ClosingEye[] = INCBIN_U32("graphics/battle_anims/sprites/closing_eye.4bpp.lz"); const u32 gBattleAnimSpritePal_ClosingEye[] = INCBIN_U32("graphics/battle_anims/sprites/closing_eye.gbapal.lz"); @@ -128,6 +410,39 @@ const u32 gBattleAnimSpriteGfx_Lightning2[] = INCBIN_U32("graphics/battle_anims/ const u32 gBattleAnimSpriteGfx_Lightning[] = INCBIN_U32("graphics/battle_anims/sprites/lightning.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_ColoredOrbs[] = INCBIN_U32("graphics/battle_anims/sprites/colored_orbs.4bpp.lz"); +const u32 gBattleAnimSpritePal_ColoredOrbs[] = INCBIN_U32("graphics/battle_anims/sprites/colored_orbs.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_WorrySeed[] = INCBIN_U32("graphics/battle_anims/sprites/worry_seed.4bpp.lz"); +const u32 gBattleAnimSpritePal_WorrySeed[] = INCBIN_U32("graphics/battle_anims/sprites/worry_seed.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_SmallCloud[] = INCBIN_U32("graphics/battle_anims/sprites/small_cloud.4bpp.lz"); +const u32 gBattleAnimSpritePal_SmallCloud[] = INCBIN_U32("graphics/battle_anims/sprites/small_cloud.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_AttackOrder[] = INCBIN_U32("graphics/battle_anims/sprites/attack_order.4bpp.lz"); +const u32 gBattleAnimSpritePal_AttackOrder[] = INCBIN_U32("graphics/battle_anims/sprites/attack_order.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_DragonPulse[] = INCBIN_U32("graphics/battle_anims/sprites/dragon_pulse.4bpp.lz"); +const u32 gBattleAnimSpritePal_DragonPulse[] = INCBIN_U32("graphics/battle_anims/sprites/dragon_pulse.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_WoodHammer[] = INCBIN_U32("graphics/battle_anims/sprites/wood_hammer.4bpp.lz"); +const u32 gBattleAnimSpritePal_WoodHammer[] = INCBIN_U32("graphics/battle_anims/sprites/wood_hammer.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_PsychoCut[] = INCBIN_U32("graphics/battle_anims/sprites/psycho_cut.4bpp.lz"); +const u32 gBattleAnimSpritePal_PsychoCut[] = INCBIN_U32("graphics/battle_anims/sprites/psycho_cut.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_PowerGem[] = INCBIN_U32("graphics/battle_anims/sprites/power_gem.4bpp.lz"); +const u32 gBattleAnimSpritePal_PowerGem[] = INCBIN_U32("graphics/battle_anims/sprites/power_gem.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_StoneEdge[] = INCBIN_U32("graphics/battle_anims/sprites/stone_edge.4bpp.lz"); +const u32 gBattleAnimSpritePal_StoneEdge[] = INCBIN_U32("graphics/battle_anims/sprites/stone_edge.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_StealthRock[] = INCBIN_U32("graphics/battle_anims/sprites/stealth_rock.4bpp.lz"); +const u32 gBattleAnimSpritePal_StealthRock[] = INCBIN_U32("graphics/battle_anims/sprites/stealth_rock.gbapal.lz"); + +const u32 gBattleAnimSpriteGfx_PoisonJab[] = INCBIN_U32("graphics/battle_anims/sprites/poison_jab.4bpp.lz"); +const u32 gBattleAnimSpritePal_PoisonJab[] = INCBIN_U32("graphics/battle_anims/sprites/poison_jab.gbapal.lz"); + const u32 gUnknownGfx_C06D98[] = INCBIN_U32("graphics/unknown/unknown_C06D98.4bpp.lz"); const u32 gUnknownPal_C06D98[] = INCBIN_U32("graphics/unknown/unknown_C06D98.gbapal.lz"); const u32 gUnknownPal_C06D98_2[] = INCBIN_U32("graphics/unknown/unknown_C06D98_2.gbapal.lz"); @@ -1065,6 +1380,207 @@ const u32 gBattleAnimSpritePal_WhipHit[] = INCBIN_U32("graphics/battle_anims/spr const u32 gBattleAnimBgPalette_Solarbeam[] = INCBIN_U32("graphics/battle_anims/backgrounds/solarbeam.gbapal.lz"); +const u32 gBattleAnimBgPalette_MagmaStorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/magma_storm.gbapal.lz"); + +//new battle bgs +const u32 gBattleAnimBgPalette_GigaImpact[] = INCBIN_U32("graphics/battle_anims/backgrounds/giga_impact.gbapal.lz"); + +//const u32 gBattleAnimBgImage_TrickRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/trick_room.4bpp.lz"); +//const u32 gBattleAnimBgPalette_TrickRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/trick_room.gbapal.lz"); +//const u32 gBattleAnimBgTilemap_TrickRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/trick_room_map.bin.lz"); + +const u32 gBattleAnimBgImage_RockWrecker[] = INCBIN_U32("graphics/battle_anims/backgrounds/rock_wrecker.4bpp.lz"); +const u32 gBattleAnimBgPalette_RockWrecker[] = INCBIN_U32("graphics/battle_anims/backgrounds/rock_wrecker.gbapal.lz"); +const u32 gBattleAnimBgTilemap_RockWrecker[] = INCBIN_U32("graphics/battle_anims/backgrounds/rock_wrecker_map.bin.lz"); + +const u32 gBattleAnimBgImage_SpacialRendOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/spacial_rend_opponent.4bpp.lz"); +const u32 gBattleAnimBgPalette_SpacialRendOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/spacial_rend_opponent.gbapal.lz"); +const u32 gBattleAnimBgTilemap_SpacialRendOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/spacial_rend_opponent.bin"); + +const u32 gBattleAnimBgImage_SpacialRendPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/spacial_rend_player.4bpp.lz"); +const u32 gBattleAnimBgPalette_SpacialRendPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/spacial_rend_player.gbapal.lz"); +const u32 gBattleAnimBgTilemap_SpacialRendPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/spacial_rend_player.bin"); + +const u32 gBattleAnimBgImage_DarkVoid[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark_void.4bpp.lz"); +const u32 gBattleAnimBgPalette_DarkVoid[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark_void.gbapal.lz"); +const u32 gBattleAnimBgTilemap_DarkVoid[] = INCBIN_U32("graphics/battle_anims/backgrounds/dark_void.bin"); + + +const u32 gBattleAnimBgPalette_SludgeWave[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/sludge_wave.gbapal.lz"); + +const u32 gBattleAnimBgImage_Aeroblast[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/aeroblast_tiles.4bpp.lz"); +const u32 gBattleAnimBgPalette_Aeroblast[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/aeroblast.gbapal.lz"); +const u32 gBattleAnimBgTilemap_Aeroblast[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/aeroblast_map.bin"); + +const u32 gBattleAnimBgPalette_AuraSphere[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/aura_sphere.gbapal.lz"); + +const u32 gBattleAnimBgImage_BlackholeEclipse[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/blackhole_eclipse.4bpp.lz"); +const u32 gBattleAnimBgPalette_BlackholeEclipse[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/blackhole_eclipse.gbapal.lz"); +const u32 gBattleAnimBgTilemap_BlackholeEclipse[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/blackhole_eclipse.bin"); + +const u32 gBattleAnimBgImage_BloomDoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/bloom_doom.4bpp.lz"); +const u32 gBattleAnimBgPalette_BloomDoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/bloom_doom.gbapal.lz"); +const u32 gBattleAnimBgTilemap_BloomDoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/bloom_doom.bin"); + +const u32 gBattleAnimBgImage_BoltStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/bolt_strike.4bpp.lz"); +const u32 gBattleAnimBgPalette_BoltStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/bolt_strike.gbapal.lz"); +const u32 gBattleAnimBgTilemap_BoltStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/bolt_strike.bin"); + +const u32 gBattleAnimBgImage_ClangorousSoulblaze[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/clangorous_soulblaze.4bpp.lz"); +const u32 gBattleAnimBgPalette_ClangorousSoulblaze[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/clangorous_soulblaze.gbapal.lz"); +const u32 gBattleAnimBgTilemap_ClangorousSoulblaze[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/clangorous_soulblaze.bin"); + +//const u32 gBattleAnimBgImage_DarkVoid[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/dark_void.4bpp.lz"); +//const u32 gBattleAnimBgPalette_DarkVoid[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/dark_void.gbapal.lz"); +//const u32 gBattleAnimBgTilemap_DarkVoid[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/dark_void.bin"); + +const u32 gBattleAnimBgPalette_DynamaxCannon[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/dynamax_cannon.gbapal.lz"); + +const u32 gBattleAnimBgImage_ElectricTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/electric_terrain.4bpp.lz"); +const u32 gBattleAnimBgPalette_ElectricTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/electric_terrain.gbapal.lz"); +const u32 gBattleAnimBgTilemap_ElectricTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/electric_terrain.bin"); + +const u32 gBattleAnimBgImage_Fire1[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/fire1.4bpp.lz"); +const u32 gBattleAnimBgPalette_Fire1[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/fire1.gbapal.lz"); +const u32 gBattleAnimBgTilemap_Fire1[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/fire1.bin"); + +const u32 gBattleAnimBgPalette_Fire2[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/fire2.gbapal.lz"); + +const u32 gBattleAnimBgImage_FocusBlast[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/focus_blast.4bpp.lz"); +const u32 gBattleAnimBgPalette_FocusBlast[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/focus_blast.gbapal.lz"); +const u32 gBattleAnimBgTilemap_FocusBlast[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/focus_blast.bin"); + +const u32 gBattleAnimBgPalette_GarbageFalls[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/garbage_falls.gbapal.lz"); + +const u32 gBattleAnimBgImage_GigaImpactOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/giga_impact_opponent.4bpp.lz"); +const u32 gBattleAnimBgPalette_GigaImpactOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/giga_impact_opponent.gbapal.lz"); +const u32 gBattleAnimBgTilemap_GigaImpactOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/giga_impact_opponent.bin"); + +const u32 gBattleAnimBgImage_GigaImpactPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/giga_impact_player.4bpp.lz"); +const u32 gBattleAnimBgPalette_GigaImpactPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/giga_impact_player.gbapal.lz"); +const u32 gBattleAnimBgTilemap_GigaImpactPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/giga_impact_player.bin"); + +const u32 gBattleAnimBgImage_GrassyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/grassy_terrain.4bpp.lz"); +const u32 gBattleAnimBgPalette_GrassyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/grassy_terrain.gbapal.lz"); +const u32 gBattleAnimBgTilemap_GrassyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/grassy_terrain.bin"); + +const u32 gBattleAnimBgPalette_GunkShot[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/gunk_shot.gbapal.lz"); + +const u32 gBattleAnimBgImage_HighSpeed[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/high_speed.4bpp.lz"); +const u32 gBattleAnimBgPalette_HighSpeed[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/high_speed.gbapal.lz"); +const u32 gBattleAnimBgTilemap_HighSpeed[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/high_speed.bin"); + +const u32 gBattleAnimBgImage_HydroCannon[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/hydro_cannon.4bpp.lz"); +const u32 gBattleAnimBgPalette_HydroCannon[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/hydro_cannon.gbapal.lz"); +const u32 gBattleAnimBgTilemap_HydroCannon[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/hydro_cannon.bin"); + +const u32 gBattleAnimBgImage_HydroPump[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/hydro_pump.4bpp.lz"); +const u32 gBattleAnimBgPalette_HydroPump[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/hydro_pump.gbapal.lz"); +const u32 gBattleAnimBgTilemap_HydroPump[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/hydro_pump.bin"); + +const u32 gBattleAnimBgPalette_HyperBeam[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/hyper_beam.gbapal.lz"); + +const u32 gBattleAnimBgPalette_HyperspaceFury[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/hyperspace_fury.gbapal.lz"); + +const u32 gBattleAnimBgImage_InfernoOverdrive[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/inferno_overdrive.4bpp.lz"); +const u32 gBattleAnimBgPalette_InfernoOverdrive[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/inferno_overdrive.gbapal.lz"); +const u32 gBattleAnimBgTilemap_InfernoOverdrive[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/inferno_overdrive.bin"); + +const u32 gBattleAnimBgImage_LeafStorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/leaf_storm.4bpp.lz"); +const u32 gBattleAnimBgPalette_LeafStorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/leaf_storm.gbapal.lz"); +const u32 gBattleAnimBgTilemap_LeafStorm[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/leaf_storm.bin"); + +const u32 gBattleAnimBgPalette_MagicRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/magic_room.gbapal.lz"); + +const u32 gBattleAnimBgImage_MaliciousMoonsault[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/malicious_moonsault.4bpp.lz"); +const u32 gBattleAnimBgPalette_MaliciousMoonsault[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/malicious_moonsault.gbapal.lz"); +const u32 gBattleAnimBgTilemap_MaliciousMoonsault[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/malicious_moonsault.bin"); + +const u32 gBattleAnimBgImage_MaxLightning[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/max_lightning.4bpp.lz"); +const u32 gBattleAnimBgPalette_MaxLightning[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/max_lightning.gbapal.lz"); +const u32 gBattleAnimBgTilemap_MaxLightning[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/max_lightning.bin"); + +const u32 gBattleAnimBgImage_MistyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/misty_terrain.4bpp.lz"); +const u32 gBattleAnimBgPalette_MistyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/misty_terrain.gbapal.lz"); +const u32 gBattleAnimBgTilemap_MistyTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/misty_terrain.bin"); + +const u32 gBattleAnimBgImage_NeverendingNightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/neverending_nightmare.4bpp.lz"); +const u32 gBattleAnimBgPalette_NeverendingNightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/neverending_nightmare.gbapal.lz"); +const u32 gBattleAnimBgTilemap_NeverendingNightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/neverending_nightmare.bin"); + +const u32 gBattleAnimBgImage_Nightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/nightmare.4bpp.lz"); +const u32 gBattleAnimBgPalette_Nightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/nightmare.gbapal.lz"); +const u32 gBattleAnimBgTilemap_Nightmare[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/nightmare.bin"); + +const u32 gBattleAnimBgPalette_PoisonFalls[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/poison_falls.gbapal.lz"); + +const u32 gBattleAnimBgPalette_PsychicNew[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/psychic.gbapal.lz"); + +const u32 gBattleAnimBgImage_PsychicTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/psychic_terrain.4bpp.lz"); +const u32 gBattleAnimBgPalette_PsychicTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/psychic_terrain.gbapal.lz"); +const u32 gBattleAnimBgTilemap_PsychicTerrain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/psychic_terrain.bin"); + +//const u32 gBattleAnimBgImage_RockWrecker[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/rock_wrecker.4bpp.lz"); +//const u32 gBattleAnimBgPalette_RockWrecker[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/rock_wrecker.gbapal.lz"); +//const u32 gBattleAnimBgTilemap_RockWrecker[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/rock_wrecker.bin"); + +const u32 gBattleAnimBgImage_ShatteredPsyche[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/shattered_psyche.4bpp.lz"); +const u32 gBattleAnimBgPalette_ShatteredPsyche[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/shattered_psyche.gbapal.lz"); +const u32 gBattleAnimBgTilemap_ShatteredPsyche[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/shattered_psyche.bin"); + +const u32 gBattleAnimBgImage_SkyDay[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/sky_day.4bpp.lz"); +const u32 gBattleAnimBgPalette_SkyDay[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/sky_day.gbapal.lz"); +const u32 gBattleAnimBgTilemap_SkyDay[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/sky_day.bin"); + +const u32 gBattleAnimBgPalette_SkyAfternoon[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/sky_afternoon.gbapal.lz"); + +const u32 gBattleAnimBgPalette_SkyNight[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/sky_night.gbapal.lz"); + +const u32 gBattleAnimBgImage_SnuggleForever[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/snuggle_forever.4bpp.lz"); +const u32 gBattleAnimBgPalette_SnuggleForever[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/snuggle_forever.gbapal.lz"); +const u32 gBattleAnimBgTilemap_SnuggleForever[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/snuggle_forever.bin"); + +const u32 gBattleAnimBgImage_SoulStealing7StarStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.4bpp.lz"); +const u32 gBattleAnimBgPalette_SoulStealing7StarStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.gbapal.lz"); +const u32 gBattleAnimBgTilemap_SoulStealing7StarStrike[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.bin"); + +//const u32 gBattleAnimBgImage_SpacialRendOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/spacial_rend_opponent.4bpp.lz"); +//const u32 gBattleAnimBgPalette_SpacialRendOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/spacial_rend_opponent.gbapal.lz"); +//const u32 gBattleAnimBgTilemap_SpacialRendOpponent[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/spacial_rend_opponent.bin"); +//const u32 gBattleAnimBgImage_SpacialRendPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/spacial_rend_player.4bpp.lz"); +//const u32 gBattleAnimBgPalette_SpacialRendPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/spacial_rend_player.gbapal.lz"); +//const u32 gBattleAnimBgTilemap_SpacialRendPlayer[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/spacial_rend_player.bin"); + +const u32 gBattleAnimBgPalette_TectonicRage[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/tectonic_rage.gbapal.lz"); + +const u32 gBattleAnimBgImage_TrickRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/trick_room.4bpp.lz"); +const u32 gBattleAnimBgPalette_TrickRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/trick_room.gbapal.lz"); +const u32 gBattleAnimBgTilemap_TrickRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/trick_room.bin"); + +const u32 gBattleAnimBgImage_TwinkleTackle[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/twinkle_tackle.4bpp.lz"); +const u32 gBattleAnimBgPalette_TwinkleTackle[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/twinkle_tackle.gbapal.lz"); +const u32 gBattleAnimBgTilemap_TwinkleTackle[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/twinkle_tackle.bin"); + +const u32 gBattleAnimBgImage_WaterPulse[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/water_pulse.4bpp.lz"); +const u32 gBattleAnimBgPalette_WaterPulse[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/water_pulse.gbapal.lz"); +const u32 gBattleAnimBgTilemap_WaterPulse[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/water_pulse.bin"); + +const u32 gBattleAnimBgImage_Waterfall[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/waterfall.4bpp.lz"); +const u32 gBattleAnimBgPalette_Waterfall[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/waterfall.gbapal.lz"); +const u32 gBattleAnimBgTilemap_Waterfall[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/waterfall.bin"); + +const u32 gBattleAnimBgPalette_WonderRoom[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/wonder_room.gbapal.lz"); + +const u32 gBattleAnimBgImage_ZMoveActivate[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/zmove_activate.4bpp.lz"); +const u32 gBattleAnimBgPalette_ZMoveActivate[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/zmove_activate.gbapal.lz"); +const u32 gBattleAnimBgTilemap_ZMoveActivate[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/zmove_activate.bin"); + +const u32 gBattleAnimBgImage_ZMoveMountain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/zmove_mountain.4bpp.lz"); +const u32 gBattleAnimBgPalette_ZMoveMountain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/zmove_mountain.gbapal.lz"); +const u32 gBattleAnimBgTilemap_ZMoveMountain[] = INCBIN_U32("graphics/battle_anims/backgrounds/new/zmove_mountain.bin"); + + +// misc const u32 gUnknown_E6BC04[] = INCBIN_U32("graphics/unknown/unknown_E6BC04.bin.lz"); const u32 gBerryBlenderCenter_Gfx[] = INCBIN_U32("graphics/berry_blender/center.8bpp.lz"); diff --git a/src/item_use.c b/src/item_use.c index f9d1ff824b..001a960cdd 100755 --- a/src/item_use.c +++ b/src/item_use.c @@ -1,6 +1,7 @@ #include "global.h" #include "item_use.h" #include "battle.h" +#include "battle_anim.h" #include "battle_pyramid.h" #include "battle_pyramid_bag.h" #include "berry.h" @@ -510,7 +511,7 @@ static void SetDistanceOfClosestHiddenItem(u8 taskId, s16 itemDistanceX, s16 ite } else { - if (oldItemAbsX + oldItemAbsY == newItemAbsX + newItemAbsY + if (oldItemAbsX + oldItemAbsY == newItemAbsX + newItemAbsY && (oldItemAbsY > newItemAbsY || (oldItemAbsY == newItemAbsY && tItemDistanceY < itemDistanceY))) { // If items are equal distance, use whichever is closer on the Y axis or further south @@ -938,7 +939,27 @@ void ItemUseOutOfBattle_EvolutionStone(u8 taskId) void ItemUseInBattle_PokeBall(u8 taskId) { - if (IsPlayerPartyAndPokemonStorageFull() == FALSE) // have room for mon? + if (IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) + && IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT))) // There are two present pokemon. + { + static const u8 textCantThrowPokeBall[] = _("Cannot throw a ball!\nThere are two pokemon out there!\p"); + + if (!InBattlePyramid()) + DisplayItemMessage(taskId, 1, textCantThrowPokeBall, BagMenu_InitListsMenu); + else + DisplayItemMessageInBattlePyramid(taskId, textCantThrowPokeBall, Task_CloseBattlePyramidBagMessage); + } + else if (gBattlerInMenuId == GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT) + && IsBattlerAlive(GetBattlerAtPosition(B_POSITION_PLAYER_LEFT))) // Attempting to throw a ball with the second pokemon while both are alive. + { + static const u8 textCantThrowPokeBall[] = _("Cannot throw a ball!\p"); + + if (!InBattlePyramid()) + DisplayItemMessage(taskId, 1, textCantThrowPokeBall, BagMenu_InitListsMenu); + else + DisplayItemMessageInBattlePyramid(taskId, textCantThrowPokeBall, Task_CloseBattlePyramidBagMessage); + } + else if (IsPlayerPartyAndPokemonStorageFull() == FALSE) // have room for mon? { RemoveBagItem(gSpecialVar_ItemId, 1); if (!InBattlePyramid()) @@ -946,12 +967,13 @@ void ItemUseInBattle_PokeBall(u8 taskId) else CloseBattlePyramidBagAndSetCallback(taskId); } - else if (!InBattlePyramid()) - { - DisplayItemMessage(taskId, 1, gText_BoxFull, BagMenu_InitListsMenu); - } else - DisplayItemMessageInBattlePyramid(taskId, gText_BoxFull, Task_CloseBattlePyramidBagMessage); + { + if (!InBattlePyramid()) + DisplayItemMessage(taskId, 1, gText_BoxFull, BagMenu_InitListsMenu); + else + DisplayItemMessageInBattlePyramid(taskId, gText_BoxFull, Task_CloseBattlePyramidBagMessage); + } } static void Task_CloseStatIncreaseMessage(u8 taskId) diff --git a/src/party_menu.c b/src/party_menu.c index 1d49523756..a5e7c68b07 100755 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -1129,7 +1129,7 @@ static void DrawCancelConfirmButtons(void) bool8 IsMultiBattle(void) { - if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattleTypeFlags & BATTLE_TYPE_TRAINER && gMain.inBattle) + if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gMain.inBattle) return TRUE; else return FALSE; diff --git a/src/pokeball.c b/src/pokeball.c index 92081a296e..d7f385e791 100644 --- a/src/pokeball.c +++ b/src/pokeball.c @@ -341,11 +341,8 @@ u8 DoPokeballSendOutAnimation(s16 pan, u8 kindOfThrow) static void Task_DoPokeballSendOutAnim(u8 taskId) { - u16 throwCaseId; - u8 battlerId; - u16 itemId, ballId; - u8 ballSpriteId; - bool8 notSendOut = FALSE; + u32 throwCaseId, ballId, battlerId, ballSpriteId; + bool32 notSendOut = FALSE; if (gTasks[taskId].tFrames == 0) { @@ -355,13 +352,7 @@ static void Task_DoPokeballSendOutAnim(u8 taskId) throwCaseId = gTasks[taskId].tThrowId; battlerId = gTasks[taskId].tBattler; - - if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) - itemId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_POKEBALL); - else - itemId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_POKEBALL); - - ballId = ItemIdToBallId(itemId); + ballId = ItemIdToBallId(GetBattlerPokeballItemId(battlerId)); LoadBallGfx(ballId); ballSpriteId = CreateSprite(&gBallSpriteTemplates[ballId], 32, 80, 29); gSprites[ballSpriteId].data[0] = 0x80; @@ -744,8 +735,7 @@ static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite) if (gMain.inBattle) { - struct Pokemon *mon; - u16 species; + struct Pokemon *mon, *illusionMon; s8 pan; u16 wantedCryCase; u8 taskId; @@ -761,7 +751,6 @@ static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite) pan = -25; } - species = GetMonData(mon, MON_DATA_SPECIES); if ((battlerId == GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) || battlerId == GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) && IsDoubleBattle() && gBattleSpritesDataPtr->animationData->field_9_x1) { @@ -784,9 +773,14 @@ static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite) wantedCryCase = 2; gBattleSpritesDataPtr->healthBoxesData[battlerId].field_1_x40 = 1; - taskId = CreateTask(Task_PlayCryWhenReleasedFromBall, 3); - gTasks[taskId].tCryTaskSpecies = species; + + illusionMon = GetIllusionMonPtr(battlerId); + if (illusionMon != NULL) + gTasks[taskId].tCryTaskSpecies = GetMonData(illusionMon, MON_DATA_SPECIES); + else + gTasks[taskId].tCryTaskSpecies = GetMonData(mon, MON_DATA_SPECIES); + gTasks[taskId].tCryTaskPan = pan; gTasks[taskId].tCryTaskWantedCry = wantedCryCase; gTasks[taskId].tCryTaskBattler = battlerId; @@ -1270,8 +1264,16 @@ void FreeBallGfx(u8 ballId) static u16 GetBattlerPokeballItemId(u8 battlerId) { + struct Pokemon *mon, *illusionMon; + if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) - return GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_POKEBALL); + mon = &gPlayerParty[gBattlerPartyIndexes[battlerId]]; else - return GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_POKEBALL); + mon = &gEnemyParty[gBattlerPartyIndexes[battlerId]]; + + illusionMon = GetIllusionMonPtr(battlerId); + if (illusionMon != NULL) + mon = illusionMon; + + return GetMonData(mon, MON_DATA_POKEBALL); } diff --git a/src/pokemon.c b/src/pokemon.c index 8767207d7b..e38befa4a1 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -1884,7 +1884,7 @@ const u8 gStatStageRatios[MAX_STAT_STAGE + 1][2] = {40, 10}, // +6, MAX_STAT_STAGE }; -static const u16 sDeoxysBaseStats[] = +static const u8 sDeoxysBaseStats[] = { [STAT_HP] = 50, [STAT_ATK] = 95, @@ -1916,27 +1916,6 @@ const u16 gLinkPlayerFacilityClasses[NUM_MALE_LINK_FACILITY_CLASSES + NUM_FEMALE FACILITY_CLASS_BEAUTY }; -static const u8 sHoldEffectToType[][2] = -{ - {HOLD_EFFECT_BUG_POWER, TYPE_BUG}, - {HOLD_EFFECT_STEEL_POWER, TYPE_STEEL}, - {HOLD_EFFECT_GROUND_POWER, TYPE_GROUND}, - {HOLD_EFFECT_ROCK_POWER, TYPE_ROCK}, - {HOLD_EFFECT_GRASS_POWER, TYPE_GRASS}, - {HOLD_EFFECT_DARK_POWER, TYPE_DARK}, - {HOLD_EFFECT_FIGHTING_POWER, TYPE_FIGHTING}, - {HOLD_EFFECT_ELECTRIC_POWER, TYPE_ELECTRIC}, - {HOLD_EFFECT_WATER_POWER, TYPE_WATER}, - {HOLD_EFFECT_FLYING_POWER, TYPE_FLYING}, - {HOLD_EFFECT_POISON_POWER, TYPE_POISON}, - {HOLD_EFFECT_ICE_POWER, TYPE_ICE}, - {HOLD_EFFECT_GHOST_POWER, TYPE_GHOST}, - {HOLD_EFFECT_PSYCHIC_POWER, TYPE_PSYCHIC}, - {HOLD_EFFECT_FIRE_POWER, TYPE_FIRE}, - {HOLD_EFFECT_DRAGON_POWER, TYPE_DRAGON}, - {HOLD_EFFECT_NORMAL_POWER, TYPE_NORMAL}, -}; - const struct SpriteTemplate gUnknown_08329D98[MAX_BATTLERS_COUNT] = { { // B_POSITION_PLAYER_LEFT @@ -2969,20 +2948,12 @@ void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon) s32 level = GetLevelFromBoxMonExp(boxMon); s32 i; - for (i = 0; gLevelUpLearnsets[species][i] != LEVEL_UP_END; i++) + for (i = 0; gLevelUpLearnsets[species][i].move != LEVEL_UP_END; i++) { - u16 moveLevel; - u16 move; - - moveLevel = (gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_LV); - - if (moveLevel > (level << 9)) + if (gLevelUpLearnsets[species][i].level > level) break; - - move = (gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_ID); - - if (GiveMoveToBoxMon(boxMon, move) == MON_HAS_MAX_MOVES) - DeleteFirstMoveAndGiveMoveToBoxMon(boxMon, move); + if (GiveMoveToBoxMon(boxMon, gLevelUpLearnsets[species][i].move) == MON_HAS_MAX_MOVES) + DeleteFirstMoveAndGiveMoveToBoxMon(boxMon, gLevelUpLearnsets[species][i].move); } } @@ -3000,17 +2971,17 @@ u16 MonTryLearningNewMove(struct Pokemon *mon, bool8 firstMove) { sLearningMoveTableID = 0; - while ((gLevelUpLearnsets[species][sLearningMoveTableID] & LEVEL_UP_MOVE_LV) != (level << 9)) + while (gLevelUpLearnsets[species][sLearningMoveTableID].level != level) { sLearningMoveTableID++; - if (gLevelUpLearnsets[species][sLearningMoveTableID] == LEVEL_UP_END) + if (gLevelUpLearnsets[species][sLearningMoveTableID].move == LEVEL_UP_END) return 0; } } - if ((gLevelUpLearnsets[species][sLearningMoveTableID] & LEVEL_UP_MOVE_LV) == (level << 9)) + if (gLevelUpLearnsets[species][sLearningMoveTableID].level == level) { - gMoveToLearn = (gLevelUpLearnsets[species][sLearningMoveTableID] & LEVEL_UP_MOVE_ID); + gMoveToLearn = gLevelUpLearnsets[species][sLearningMoveTableID].move; sLearningMoveTableID++; retVal = GiveMoveToMon(mon, gMoveToLearn); } @@ -3072,262 +3043,6 @@ void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move) SetBoxMonData(boxMon, MON_DATA_PP_BONUSES, &ppBonuses); } -#define APPLY_STAT_MOD(var, mon, stat, statIndex) \ -{ \ - (var) = (stat) * (gStatStageRatios)[(mon)->statStages[(statIndex)]][0]; \ - (var) /= (gStatStageRatios)[(mon)->statStages[(statIndex)]][1]; \ -} - -s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 sideStatus, u16 powerOverride, u8 typeOverride, u8 battlerIdAtk, u8 battlerIdDef) -{ - u32 i; - s32 damage = 0; - s32 damageHelper; - u8 type; - u16 attack, defense; - u16 spAttack, spDefense; - u8 defenderHoldEffect; - u8 defenderHoldEffectParam; - u8 attackerHoldEffect; - u8 attackerHoldEffectParam; - - if (!powerOverride) - gBattleMovePower = gBattleMoves[move].power; - else - gBattleMovePower = powerOverride; - - if (!typeOverride) - type = gBattleMoves[move].type; - else - type = typeOverride & 0x3F; - - attack = attacker->attack; - defense = defender->defense; - spAttack = attacker->spAttack; - spDefense = defender->spDefense; - - if (attacker->item == ITEM_ENIGMA_BERRY) - { - attackerHoldEffect = gEnigmaBerries[battlerIdAtk].holdEffect; - attackerHoldEffectParam = gEnigmaBerries[battlerIdAtk].holdEffectParam; - } - else - { - attackerHoldEffect = ItemId_GetHoldEffect(attacker->item); - attackerHoldEffectParam = ItemId_GetHoldEffectParam(attacker->item); - } - - if (defender->item == ITEM_ENIGMA_BERRY) - { - defenderHoldEffect = gEnigmaBerries[battlerIdDef].holdEffect; - defenderHoldEffectParam = gEnigmaBerries[battlerIdDef].holdEffectParam; - } - else - { - defenderHoldEffect = ItemId_GetHoldEffect(defender->item); - defenderHoldEffectParam = ItemId_GetHoldEffectParam(defender->item); - } - - if (attacker->ability == ABILITY_HUGE_POWER || attacker->ability == ABILITY_PURE_POWER) - attack *= 2; - - if (ShouldGetStatBadgeBoost(FLAG_BADGE01_GET, battlerIdAtk)) - attack = (110 * attack) / 100; - if (ShouldGetStatBadgeBoost(FLAG_BADGE05_GET, battlerIdDef)) - defense = (110 * defense) / 100; - if (ShouldGetStatBadgeBoost(FLAG_BADGE07_GET, battlerIdAtk)) - spAttack = (110 * spAttack) / 100; - if (ShouldGetStatBadgeBoost(FLAG_BADGE07_GET, battlerIdDef)) - spDefense = (110 * spDefense) / 100; - - for (i = 0; i < ARRAY_COUNT(sHoldEffectToType); i++) - { - if (attackerHoldEffect == sHoldEffectToType[i][0] - && type == sHoldEffectToType[i][1]) - { - if (IS_TYPE_PHYSICAL(type)) - attack = (attack * (attackerHoldEffectParam + 100)) / 100; - else - spAttack = (spAttack * (attackerHoldEffectParam + 100)) / 100; - break; - } - } - - if (attackerHoldEffect == HOLD_EFFECT_CHOICE_BAND) - attack = (150 * attack) / 100; - if (attackerHoldEffect == HOLD_EFFECT_SOUL_DEW && !(gBattleTypeFlags & (BATTLE_TYPE_FRONTIER)) && (attacker->species == SPECIES_LATIAS || attacker->species == SPECIES_LATIOS)) - spAttack = (150 * spAttack) / 100; - if (defenderHoldEffect == HOLD_EFFECT_SOUL_DEW && !(gBattleTypeFlags & (BATTLE_TYPE_FRONTIER)) && (defender->species == SPECIES_LATIAS || defender->species == SPECIES_LATIOS)) - spDefense = (150 * spDefense) / 100; - if (attackerHoldEffect == HOLD_EFFECT_DEEP_SEA_TOOTH && attacker->species == SPECIES_CLAMPERL) - spAttack *= 2; - if (defenderHoldEffect == HOLD_EFFECT_DEEP_SEA_SCALE && defender->species == SPECIES_CLAMPERL) - spDefense *= 2; - if (attackerHoldEffect == HOLD_EFFECT_LIGHT_BALL && attacker->species == SPECIES_PIKACHU) - spAttack *= 2; - if (defenderHoldEffect == HOLD_EFFECT_METAL_POWDER && defender->species == SPECIES_DITTO) - defense *= 2; - if (attackerHoldEffect == HOLD_EFFECT_THICK_CLUB && (attacker->species == SPECIES_CUBONE || attacker->species == SPECIES_MAROWAK)) - attack *= 2; - if (defender->ability == ABILITY_THICK_FAT && (type == TYPE_FIRE || type == TYPE_ICE)) - spAttack /= 2; - if (attacker->ability == ABILITY_HUSTLE) - attack = (150 * attack) / 100; - if (attacker->ability == ABILITY_PLUS && ABILITY_ON_FIELD2(ABILITY_MINUS)) - spAttack = (150 * spAttack) / 100; - if (attacker->ability == ABILITY_MINUS && ABILITY_ON_FIELD2(ABILITY_PLUS)) - spAttack = (150 * spAttack) / 100; - if (attacker->ability == ABILITY_GUTS && attacker->status1) - attack = (150 * attack) / 100; - if (defender->ability == ABILITY_MARVEL_SCALE && defender->status1) - defense = (150 * defense) / 100; - if (type == TYPE_ELECTRIC && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, 0, 0xFD, 0)) - gBattleMovePower /= 2; - if (type == TYPE_FIRE && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, 0, 0xFE, 0)) - gBattleMovePower /= 2; - if (type == TYPE_GRASS && attacker->ability == ABILITY_OVERGROW && attacker->hp <= (attacker->maxHP / 3)) - gBattleMovePower = (150 * gBattleMovePower) / 100; - if (type == TYPE_FIRE && attacker->ability == ABILITY_BLAZE && attacker->hp <= (attacker->maxHP / 3)) - gBattleMovePower = (150 * gBattleMovePower) / 100; - if (type == TYPE_WATER && attacker->ability == ABILITY_TORRENT && attacker->hp <= (attacker->maxHP / 3)) - gBattleMovePower = (150 * gBattleMovePower) / 100; - if (type == TYPE_BUG && attacker->ability == ABILITY_SWARM && attacker->hp <= (attacker->maxHP / 3)) - gBattleMovePower = (150 * gBattleMovePower) / 100; - if (gBattleMoves[gCurrentMove].effect == EFFECT_EXPLOSION) - defense /= 2; - - if (IS_TYPE_PHYSICAL(type)) - { - if (gCritMultiplier == 2) - { - if (attacker->statStages[STAT_ATK] > DEFAULT_STAT_STAGE) - APPLY_STAT_MOD(damage, attacker, attack, STAT_ATK) - else - damage = attack; - } - else - APPLY_STAT_MOD(damage, attacker, attack, STAT_ATK) - - damage = damage * gBattleMovePower; - damage *= (2 * attacker->level / 5 + 2); - - if (gCritMultiplier == 2) - { - if (defender->statStages[STAT_DEF] < DEFAULT_STAT_STAGE) - APPLY_STAT_MOD(damageHelper, defender, defense, STAT_DEF) - else - damageHelper = defense; - } - else - APPLY_STAT_MOD(damageHelper, defender, defense, STAT_DEF) - - damage = damage / damageHelper; - damage /= 50; - - if ((attacker->status1 & STATUS1_BURN) && attacker->ability != ABILITY_GUTS) - damage /= 2; - - if ((sideStatus & SIDE_STATUS_REFLECT) && gCritMultiplier == 1) - { - if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) == 2) - damage = 2 * (damage / 3); - else - damage /= 2; - } - - if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == MOVE_TARGET_BOTH && CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) == 2) - damage /= 2; - - // moves always do at least 1 damage. - if (damage == 0) - damage = 1; - } - - if (type == TYPE_MYSTERY) - damage = 0; // is ??? type. does 0 damage. - - if (IS_TYPE_SPECIAL(type)) - { - if (gCritMultiplier == 2) - { - if (attacker->statStages[STAT_SPATK] > DEFAULT_STAT_STAGE) - APPLY_STAT_MOD(damage, attacker, spAttack, STAT_SPATK) - else - damage = spAttack; - } - else - APPLY_STAT_MOD(damage, attacker, spAttack, STAT_SPATK) - - damage = damage * gBattleMovePower; - damage *= (2 * attacker->level / 5 + 2); - - if (gCritMultiplier == 2) - { - if (defender->statStages[STAT_SPDEF] < DEFAULT_STAT_STAGE) - APPLY_STAT_MOD(damageHelper, defender, spDefense, STAT_SPDEF) - else - damageHelper = spDefense; - } - else - APPLY_STAT_MOD(damageHelper, defender, spDefense, STAT_SPDEF) - - damage = (damage / damageHelper); - damage /= 50; - - if ((sideStatus & SIDE_STATUS_LIGHTSCREEN) && gCritMultiplier == 1) - { - if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) == 2) - damage = 2 * (damage / 3); - else - damage /= 2; - } - - if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == MOVE_TARGET_BOTH && CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) == 2) - damage /= 2; - - // are effects of weather negated with cloud nine or air lock - if (WEATHER_HAS_EFFECT2) - { - if (gBattleWeather & WEATHER_RAIN_TEMPORARY) - { - switch (type) - { - case TYPE_FIRE: - damage /= 2; - break; - case TYPE_WATER: - damage = (15 * damage) / 10; - break; - } - } - - // any weather except sun weakens solar beam - if ((gBattleWeather & (WEATHER_RAIN_ANY | WEATHER_SANDSTORM_ANY | WEATHER_HAIL_ANY)) && gCurrentMove == MOVE_SOLAR_BEAM) - damage /= 2; - - // sunny - if (gBattleWeather & WEATHER_SUN_ANY) - { - switch (type) - { - case TYPE_FIRE: - damage = (15 * damage) / 10; - break; - case TYPE_WATER: - damage /= 2; - break; - } - } - } - - // flash fire triggered - if ((gBattleResources->flags->flags[battlerIdAtk] & RESOURCE_FLAG_FLASH_FIRE) && type == TYPE_FIRE) - damage = (15 * damage) / 10; - } - - return damage + 2; -} - u8 CountAliveMonsInBattle(u8 caseId) { s32 i; @@ -4578,57 +4293,58 @@ void RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex) mon->ppBonuses &= gPPUpSetMask[moveIndex]; } -void CopyPlayerPartyMonToBattleData(u8 battlerId, u8 partyIndex) +void PokemonToBattleMon(struct Pokemon *src, struct BattlePokemon *dst) { - u16* hpSwitchout; s32 i; u8 nickname[POKEMON_NAME_LENGTH * 2]; - gBattleMons[battlerId].species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL); - gBattleMons[battlerId].item = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HELD_ITEM, NULL); - for (i = 0; i < MAX_MON_MOVES; i++) { - gBattleMons[battlerId].moves[i] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MOVE1 + i, NULL); - gBattleMons[battlerId].pp[i] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PP1 + i, NULL); + dst->moves[i] = GetMonData(src, MON_DATA_MOVE1 + i, NULL); + dst->pp[i] = GetMonData(src, MON_DATA_PP1 + i, NULL); } - gBattleMons[battlerId].ppBonuses = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PP_BONUSES, NULL); - gBattleMons[battlerId].friendship = GetMonData(&gPlayerParty[partyIndex], MON_DATA_FRIENDSHIP, NULL); - gBattleMons[battlerId].experience = GetMonData(&gPlayerParty[partyIndex], MON_DATA_EXP, NULL); - gBattleMons[battlerId].hpIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP_IV, NULL); - gBattleMons[battlerId].attackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK_IV, NULL); - gBattleMons[battlerId].defenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF_IV, NULL); - gBattleMons[battlerId].speedIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPEED_IV, NULL); - gBattleMons[battlerId].spAttackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK_IV, NULL); - gBattleMons[battlerId].spDefenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF_IV, NULL); - gBattleMons[battlerId].personality = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PERSONALITY, NULL); - gBattleMons[battlerId].status1 = GetMonData(&gPlayerParty[partyIndex], MON_DATA_STATUS, NULL); - gBattleMons[battlerId].level = GetMonData(&gPlayerParty[partyIndex], MON_DATA_LEVEL, NULL); - gBattleMons[battlerId].hp = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP, NULL); - gBattleMons[battlerId].maxHP = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MAX_HP, NULL); - gBattleMons[battlerId].attack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK, NULL); - gBattleMons[battlerId].defense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF, NULL); - gBattleMons[battlerId].speed = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPEED, NULL); - gBattleMons[battlerId].spAttack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK, NULL); - gBattleMons[battlerId].spDefense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF, NULL); - gBattleMons[battlerId].isEgg = GetMonData(&gPlayerParty[partyIndex], MON_DATA_IS_EGG, NULL); - gBattleMons[battlerId].abilityNum = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ABILITY_NUM, NULL); - gBattleMons[battlerId].otId = GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_ID, NULL); - gBattleMons[battlerId].type1 = gBaseStats[gBattleMons[battlerId].species].type1; - gBattleMons[battlerId].type2 = gBaseStats[gBattleMons[battlerId].species].type2; - gBattleMons[battlerId].ability = GetAbilityBySpecies(gBattleMons[battlerId].species, gBattleMons[battlerId].abilityNum); - GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, nickname); - StringCopy10(gBattleMons[battlerId].nickname, nickname); - GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_NAME, gBattleMons[battlerId].otName); - - hpSwitchout = &gBattleStruct->hpOnSwitchout[GetBattlerSide(battlerId)]; - *hpSwitchout = gBattleMons[battlerId].hp; + dst->species = GetMonData(src, MON_DATA_SPECIES, NULL); + dst->item = GetMonData(src, MON_DATA_HELD_ITEM, NULL); + dst->ppBonuses = GetMonData(src, MON_DATA_PP_BONUSES, NULL); + dst->friendship = GetMonData(src, MON_DATA_FRIENDSHIP, NULL); + dst->experience = GetMonData(src, MON_DATA_EXP, NULL); + dst->hpIV = GetMonData(src, MON_DATA_HP_IV, NULL); + dst->attackIV = GetMonData(src, MON_DATA_ATK_IV, NULL); + dst->defenseIV = GetMonData(src, MON_DATA_DEF_IV, NULL); + dst->speedIV = GetMonData(src, MON_DATA_SPEED_IV, NULL); + dst->spAttackIV = GetMonData(src, MON_DATA_SPATK_IV, NULL); + dst->spDefenseIV = GetMonData(src, MON_DATA_SPDEF_IV, NULL); + dst->personality = GetMonData(src, MON_DATA_PERSONALITY, NULL); + dst->status1 = GetMonData(src, MON_DATA_STATUS, NULL); + dst->level = GetMonData(src, MON_DATA_LEVEL, NULL); + dst->hp = GetMonData(src, MON_DATA_HP, NULL); + dst->maxHP = GetMonData(src, MON_DATA_MAX_HP, NULL); + dst->attack = GetMonData(src, MON_DATA_ATK, NULL); + dst->defense = GetMonData(src, MON_DATA_DEF, NULL); + dst->speed = GetMonData(src, MON_DATA_SPEED, NULL); + dst->spAttack = GetMonData(src, MON_DATA_SPATK, NULL); + dst->spDefense = GetMonData(src, MON_DATA_SPDEF, NULL); + dst->abilityNum = GetMonData(src, MON_DATA_ABILITY_NUM, NULL); + dst->otId = GetMonData(src, MON_DATA_OT_ID, NULL); + dst->type1 = gBaseStats[dst->species].type1; + dst->type2 = gBaseStats[dst->species].type2; + dst->type3 = TYPE_MYSTERY; + dst->ability = GetAbilityBySpecies(dst->species, dst->abilityNum); + GetMonData(src, MON_DATA_NICKNAME, nickname); + StringCopy10(dst->nickname, nickname); + GetMonData(src, MON_DATA_OT_NAME, dst->otName); for (i = 0; i < NUM_BATTLE_STATS; i++) - gBattleMons[battlerId].statStages[i] = DEFAULT_STAT_STAGE; + dst->statStages[i] = 6; - gBattleMons[battlerId].status2 = 0; + dst->status2 = 0; +} + +void CopyPlayerPartyMonToBattleData(u8 battlerId, u8 partyIndex) +{ + PokemonToBattleMon(&gPlayerParty[partyIndex], &gBattleMons[battlerId]); + gBattleStruct->hpOnSwitchout[GetBattlerSide(battlerId)] = gBattleMons[battlerId].hp; UpdateSentPokesToOpponentValue(battlerId); ClearTemporarySpeciesSpriteData(battlerId, FALSE); } @@ -6149,23 +5865,23 @@ u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves) { u16 moveLevel; - if (gLevelUpLearnsets[species][i] == LEVEL_UP_END) + if (gLevelUpLearnsets[species][i].move == LEVEL_UP_END) break; - moveLevel = gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_LV; + moveLevel = gLevelUpLearnsets[species][i].level; - if (moveLevel <= (level << 9)) + if (moveLevel <= level) { - for (j = 0; j < MAX_MON_MOVES && learnedMoves[j] != (gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_ID); j++) + for (j = 0; j < MAX_MON_MOVES && learnedMoves[j] != gLevelUpLearnsets[species][i].move; j++) ; if (j == MAX_MON_MOVES) { - for (k = 0; k < numMoves && moves[k] != (gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_ID); k++) + for (k = 0; k < numMoves && moves[k] != gLevelUpLearnsets[species][i].move; k++) ; if (k == numMoves) - moves[numMoves++] = gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_ID; + moves[numMoves++] = gLevelUpLearnsets[species][i].move; } } } @@ -6178,8 +5894,8 @@ u8 GetLevelUpMovesBySpecies(u16 species, u16 *moves) u8 numMoves = 0; int i; - for (i = 0; i < MAX_LEVEL_UP_MOVES && gLevelUpLearnsets[species][i] != LEVEL_UP_END; i++) - moves[numMoves++] = gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_ID; + for (i = 0; i < MAX_LEVEL_UP_MOVES && gLevelUpLearnsets[species][i].move != LEVEL_UP_END; i++) + moves[numMoves++] = gLevelUpLearnsets[species][i].move; return numMoves; } @@ -6203,23 +5919,23 @@ u8 GetNumberOfRelearnableMoves(struct Pokemon *mon) { u16 moveLevel; - if (gLevelUpLearnsets[species][i] == LEVEL_UP_END) + if (gLevelUpLearnsets[species][i].move == LEVEL_UP_END) break; - moveLevel = gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_LV; + moveLevel = gLevelUpLearnsets[species][i].level; - if (moveLevel <= (level << 9)) + if (moveLevel <= level) { - for (j = 0; j < MAX_MON_MOVES && learnedMoves[j] != (gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_ID); j++) + for (j = 0; j < MAX_MON_MOVES && learnedMoves[j] != gLevelUpLearnsets[species][i].move; j++) ; if (j == MAX_MON_MOVES) { - for (k = 0; k < numMoves && moves[k] != (gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_ID); k++) + for (k = 0; k < numMoves && moves[k] != gLevelUpLearnsets[species][i].move; k++) ; if (k == numMoves) - moves[numMoves++] = gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_ID; + moves[numMoves++] = gLevelUpLearnsets[species][i].move; } } } @@ -6499,51 +6215,61 @@ static s32 GetWildMonTableIdInAlteringCave(u16 species) void SetWildMonHeldItem(void) { - if (!(gBattleTypeFlags & (BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_TRAINER | BATTLE_TYPE_PYRAMID | BATTLE_TYPE_PIKE))) + u16 rnd, species, var1, var2, i, count; + if (gBattleTypeFlags & (BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_TRAINER | BATTLE_TYPE_PYRAMID | BATTLE_TYPE_PIKE)) + return; + + count = (WILD_DOUBLE_BATTLE) ? 2 : 1; + if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG, 0) + && (GetMonAbility(&gPlayerParty[0]) == ABILITY_COMPOUND_EYES + || GetMonAbility(&gPlayerParty[0]) == ABILITY_SUPER_LUCK)) { - u16 rnd = Random() % 100; - u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, 0); - u16 var1 = 45; - u16 var2 = 95; - if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG, 0) - && GetMonAbility(&gPlayerParty[0]) == ABILITY_COMPOUND_EYES) - { - var1 = 20; - var2 = 80; - } + var1 = 20; + var2 = 80; + } + else + { + var1 = 45; + var2 = 95; + } + + for (i = 0; i < count; i++) + { + rnd = Random() % 100; + species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES, 0); if (gMapHeader.mapLayoutId == LAYOUT_ALTERING_CAVE) { s32 alteringCaveId = GetWildMonTableIdInAlteringCave(species); if (alteringCaveId != 0) { if (rnd < var2) - return; - SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &sAlteringCaveWildMonHeldItems[alteringCaveId].item); + continue; + SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &sAlteringCaveWildMonHeldItems[alteringCaveId].item); } else { if (rnd < var1) - return; + continue; if (rnd < var2) - SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gBaseStats[species].item1); + SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBaseStats[species].item1); else - SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gBaseStats[species].item2); + SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBaseStats[species].item2); } } else { if (gBaseStats[species].item1 == gBaseStats[species].item2 && gBaseStats[species].item1 != 0) { - SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gBaseStats[species].item1); + SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBaseStats[species].item1); } else { if (rnd < var1) - return; + continue; if (rnd < var2) - SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gBaseStats[species].item1); + SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBaseStats[species].item1); else - SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gBaseStats[species].item2); + SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBaseStats[species].item2); } } } diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index c80c4c5c47..040a5dccda 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -172,7 +172,9 @@ static EWRAM_DATA struct PokemonSummaryScreenData bool8 unk40EF; s16 switchCounter; // Used for various switch statement cases that decompress/load graphics or pokemon data u8 unk_filler4[6]; + u8 splitIconSpriteId; } *sMonSummaryScreen = NULL; + EWRAM_DATA u8 gLastViewedMonIndex = 0; static EWRAM_DATA u8 sMoveSlotToReplace = 0; ALIGNED(4) static EWRAM_DATA u8 sUnknownTaskId = 0; @@ -716,6 +718,66 @@ static const u8 sMovesPPLayout[] = _("{PP}{DYNAMIC 0}/{DYNAMIC 1}"); #define TAG_MON_STATUS 30001 #define TAG_MOVE_TYPES 30002 #define TAG_MON_MARKINGS 30003 +#define TAG_SPLIT_ICONS 30004 + +static const u16 sSplitIcons_Pal[] = INCBIN_U16("graphics/interface/split_icons.gbapal"); +static const u32 sSplitIcons_Gfx[] = INCBIN_U32("graphics/interface/split_icons.4bpp.lz"); + +static const struct OamData sOamData_SplitIcons = +{ + .size = SPRITE_SIZE(16x16), + .shape = SPRITE_SHAPE(16x16), + .priority = 0, +}; + +static const struct CompressedSpriteSheet sSpriteSheet_SplitIcons = +{ + .data = sSplitIcons_Gfx, + .size = 16*16*3/2, + .tag = TAG_SPLIT_ICONS, +}; + +static const struct SpritePalette sSpritePal_SplitIcons = +{ + .data = sSplitIcons_Pal, + .tag = TAG_SPLIT_ICONS +}; + +static const union AnimCmd sSpriteAnim_SplitIcon0[] = +{ + ANIMCMD_FRAME(0, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_SplitIcon1[] = +{ + ANIMCMD_FRAME(4, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_SplitIcon2[] = +{ + ANIMCMD_FRAME(8, 0), + ANIMCMD_END +}; + +static const union AnimCmd *const sSpriteAnimTable_SplitIcons[] = +{ + sSpriteAnim_SplitIcon0, + sSpriteAnim_SplitIcon1, + sSpriteAnim_SplitIcon2, +}; + +static const struct SpriteTemplate sSpriteTemplate_SplitIcons = +{ + .tileTag = TAG_SPLIT_ICONS, + .paletteTag = TAG_SPLIT_ICONS, + .oam = &sOamData_SplitIcons, + .anims = sSpriteAnimTable_SplitIcons, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; static const struct OamData sOamData_MoveTypes = { @@ -805,6 +867,10 @@ static const union AnimCmd sSpriteAnim_TypeDark[] = { ANIMCMD_FRAME(TYPE_DARK * 8, 0, FALSE, FALSE), ANIMCMD_END }; +static const union AnimCmd sSpriteAnim_TypeFairy[] = { + ANIMCMD_FRAME(TYPE_FAIRY * 8, 0, FALSE, FALSE), + ANIMCMD_END +}; static const union AnimCmd sSpriteAnim_CategoryCool[] = { ANIMCMD_FRAME((CONTEST_CATEGORY_COOL + NUMBER_OF_MON_TYPES) * 8, 0, FALSE, FALSE), ANIMCMD_END @@ -844,6 +910,7 @@ static const union AnimCmd *const sSpriteAnimTable_MoveTypes[NUMBER_OF_MON_TYPES sSpriteAnim_TypeIce, sSpriteAnim_TypeDragon, sSpriteAnim_TypeDark, + sSpriteAnim_TypeFairy, sSpriteAnim_CategoryCool, sSpriteAnim_CategoryBeauty, sSpriteAnim_CategoryCute, @@ -887,6 +954,7 @@ static const u8 sMoveTypeToOamPaletteNum[NUMBER_OF_MON_TYPES + CONTEST_CATEGORIE [TYPE_ICE] = 14, [TYPE_DRAGON] = 15, [TYPE_DARK] = 13, + [TYPE_FAIRY] = 14, [NUMBER_OF_MON_TYPES + CONTEST_CATEGORY_COOL] = 13, [NUMBER_OF_MON_TYPES + CONTEST_CATEGORY_BEAUTY] = 14, [NUMBER_OF_MON_TYPES + CONTEST_CATEGORY_CUTE] = 14, @@ -1060,6 +1128,23 @@ static const struct SpriteTemplate sSpriteTemplate_StatusCondition = static const u16 sSummaryMarkingsPalette[] = INCBIN_U16("graphics/interface/summary_markings.gbapal"); // code +static u8 ShowSplitIcon(u32 split) +{ + if (sMonSummaryScreen->splitIconSpriteId == 0xFF) + sMonSummaryScreen->splitIconSpriteId = CreateSprite(&sSpriteTemplate_SplitIcons, 48, 129, 0); + + gSprites[sMonSummaryScreen->splitIconSpriteId].invisible = FALSE; + StartSpriteAnim(&gSprites[sMonSummaryScreen->splitIconSpriteId], split); + return sMonSummaryScreen->splitIconSpriteId; +} + +static void DestroySplitIcon(void) +{ + if (sMonSummaryScreen->splitIconSpriteId != 0xFF) + DestroySprite(&gSprites[sMonSummaryScreen->splitIconSpriteId]); + sMonSummaryScreen->splitIconSpriteId = 0xFF; +} + void ShowPokemonSummaryScreen(u8 mode, void *mons, u8 monIndex, u8 maxMonIndex, void (*callback)(void)) { sMonSummaryScreen = AllocZeroed(sizeof(*sMonSummaryScreen)); @@ -1094,6 +1179,7 @@ void ShowPokemonSummaryScreen(u8 mode, void *mons, u8 monIndex, u8 maxMonIndex, } sMonSummaryScreen->currPageIndex = sMonSummaryScreen->minPageIndex; + sMonSummaryScreen->splitIconSpriteId = 0xFF; SummaryScreen_SetUnknownTaskId(0xFF); if (gMonSpritesGfxPtr == NULL) @@ -1340,6 +1426,8 @@ static bool8 DecompressGraphics(void) break; case 12: LoadCompressedPalette(gMoveTypes_Pal, 0x1D0, 0x60); + LoadCompressedSpriteSheet(&sSpriteSheet_SplitIcons); + LoadSpritePalette(&sSpritePal_SplitIcons); sMonSummaryScreen->switchCounter = 0; return TRUE; } @@ -1968,6 +2056,7 @@ static void ChangeSelectedMove(s16 *taskData, s8 direction, u8 *moveIndexPtr) { ClearWindowTilemap(PSS_LABEL_WINDOW_MOVES_POWER_ACC); ClearWindowTilemap(PSS_LABEL_WINDOW_MOVES_APPEAL_JAM); + DestroySplitIcon(); ScheduleBgCopyTilemapToVram(0); HandlePowerAccTilemap(0, 3); HandleAppealJamTilemap(0, 3, 0); @@ -1994,6 +2083,7 @@ static void CloseMoveSelectMode(u8 taskId) { ClearWindowTilemap(PSS_LABEL_WINDOW_MOVES_POWER_ACC); ClearWindowTilemap(PSS_LABEL_WINDOW_MOVES_APPEAL_JAM); + DestroySplitIcon(); HandlePowerAccTilemap(0, 3); HandleAppealJamTilemap(0, 3, 0); } @@ -2220,6 +2310,7 @@ static void ShowCantForgetHMsWindow(u8 taskId) { ClearWindowTilemap(PSS_LABEL_WINDOW_MOVES_POWER_ACC); ClearWindowTilemap(PSS_LABEL_WINDOW_MOVES_APPEAL_JAM); + gSprites[sMonSummaryScreen->splitIconSpriteId].invisible = TRUE; ScheduleBgCopyTilemapToVram(0); HandlePowerAccTilemap(0, 3); HandleAppealJamTilemap(0, 3, 0); @@ -2909,7 +3000,10 @@ static void ClearPageWindowTilemaps(u8 page) if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE) { if (sMonSummaryScreen->newMove != MOVE_NONE || sMonSummaryScreen->firstMoveIndex != MAX_MON_MOVES) + { ClearWindowTilemap(PSS_LABEL_WINDOW_MOVES_POWER_ACC); + gSprites[sMonSummaryScreen->splitIconSpriteId].invisible = TRUE; + } } else { @@ -3612,8 +3706,9 @@ static void PrintMoveDetails(u16 move) FillWindowPixelBuffer(windowId, PIXEL_FILL(0)); if (move != MOVE_NONE) { - if (sMonSummaryScreen->currPageIndex == PSS_MODE_BOX) + if (sMonSummaryScreen->currPageIndex == PSS_PAGE_BATTLE_MOVES) { + ShowSplitIcon(gBattleMoves[move].split); PrintMovePowerAndAccuracy(move); PrintTextOnWindow(windowId, gMoveDescriptionPointers[move - 1], 6, 1, 0, 0); } diff --git a/src/reset_rtc_screen.c b/src/reset_rtc_screen.c index d0e815816b..770e4f3709 100644 --- a/src/reset_rtc_screen.c +++ b/src/reset_rtc_screen.c @@ -129,7 +129,7 @@ static const struct SpriteFrameImage sSpriteImageTable_85104B4[] = obj_frame_tiles(sResetRtcScreen_RightArrowGfx) }; -static const struct SpritePalette sSpritePalette_Arrow = +const struct SpritePalette gSpritePalette_RtcArrow = { sResetRtcScreen_ArrowPal, 0x1000 }; @@ -159,7 +159,7 @@ static const union AnimCmd *const sSpriteAnimTable_85104E4[] = sSpriteAnim_85104DC, }; -static const struct SpriteTemplate sSpriteTemplate_85104F0 = +const struct SpriteTemplate gSpriteTemplate_RtcArrow = { .tileTag = 0xFFFF, .paletteTag = 0x1000, @@ -271,14 +271,14 @@ static void CreateCursor(u8 taskId) { u32 spriteId; - LoadSpritePalette(&sSpritePalette_Arrow); + LoadSpritePalette(&gSpritePalette_RtcArrow); - spriteId = CreateSpriteAtEnd(&sSpriteTemplate_85104F0, 53, 68, 0); + spriteId = CreateSpriteAtEnd(&gSpriteTemplate_RtcArrow, 53, 68, 0); gSprites[spriteId].callback = SpriteCB_ResetRtcCursor0; gSprites[spriteId].data[0] = taskId; gSprites[spriteId].data[1] = -1; - spriteId = CreateSpriteAtEnd(&sSpriteTemplate_85104F0, 53, 68, 0); + spriteId = CreateSpriteAtEnd(&gSpriteTemplate_RtcArrow, 53, 68, 0); gSprites[spriteId].callback = SpriteCB_ResetRtcCursor1; gSprites[spriteId].data[0] = taskId; gSprites[spriteId].data[1] = -1; @@ -286,7 +286,7 @@ static void CreateCursor(u8 taskId) static void FreeCursorPalette(void) { - FreeSpritePaletteByTag(sSpritePalette_Arrow.tag); + FreeSpritePaletteByTag(gSpritePalette_RtcArrow.tag); } static void HideChooseTimeWindow(u8 windowId) diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c index d8d75a0e03..4a6611b205 100644 --- a/src/reshow_battle_screen.c +++ b/src/reshow_battle_screen.c @@ -220,6 +220,8 @@ static void CreateBattlerSprite(u8 battler) { if (GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_HP) == 0) return; + if (gBattleScripting.monCaught) // Don't create opponent sprite if it has been caught. + return; SetMultiuseSpriteTemplateToPokemon(GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES), GetBattlerPosition(battler)); gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battler, 2), posY, GetBattlerSpriteSubpriority(battler)); diff --git a/src/wild_encounter.c b/src/wild_encounter.c index 9f81a3b3ed..0ff3e08ab1 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -14,9 +14,11 @@ #include "tv.h" #include "link.h" #include "script.h" +#include "battle_debug.h" #include "battle_pike.h" #include "battle_pyramid.h" #include "constants/abilities.h" +#include "constants/battle_config.h" #include "constants/game_stat.h" #include "constants/items.h" #include "constants/layouts.h" @@ -325,7 +327,7 @@ static u8 PickWildMonNature(void) // check synchronize for a pokemon with the same ability if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG) && GetMonAbility(&gPlayerParty[0]) == ABILITY_SYNCHRONIZE - && Random() % 2 == 0) + && ((B_SYNCHRONIZE_NATURE >= GEN_8) || Random() % 2 == 0)) { return GetMonData(&gPlayerParty[0], MON_DATA_PERSONALITY) % NUM_NATURES; } @@ -395,12 +397,30 @@ static bool8 TryGenerateWildMon(const struct WildPokemonInfo *wildMonInfo, u8 ar break; if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_ELECTRIC, ABILITY_STATIC, &wildMonIndex)) break; + if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_ELECTRIC, ABILITY_LIGHTNING_ROD, &wildMonIndex)) + break; + if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_FIRE, ABILITY_FLASH_FIRE, &wildMonIndex)) + break; + if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_GRASS, ABILITY_HARVEST, &wildMonIndex)) + break; + if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_WATER, ABILITY_STORM_DRAIN, &wildMonIndex)) + break; wildMonIndex = ChooseWildMonIndex_Land(); break; case WILD_AREA_WATER: + if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_STEEL, ABILITY_MAGNET_PULL, &wildMonIndex)) + break; if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_ELECTRIC, ABILITY_STATIC, &wildMonIndex)) break; + if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_ELECTRIC, ABILITY_LIGHTNING_ROD, &wildMonIndex)) + break; + if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_FIRE, ABILITY_FLASH_FIRE, &wildMonIndex)) + break; + if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_GRASS, ABILITY_HARVEST, &wildMonIndex)) + break; + if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_WATER, ABILITY_STORM_DRAIN, &wildMonIndex)) + break; wildMonIndex = ChooseWildMonIndex_WaterRock(); break; @@ -485,6 +505,14 @@ static bool8 DoWildEncounterRateTest(u32 encounterRate, bool8 ignoreAbility) encounterRate *= 2; else if (ability == ABILITY_SAND_VEIL && gSaveBlock1Ptr->weather == WEATHER_SANDSTORM) encounterRate /= 2; + else if (ability == ABILITY_SNOW_CLOAK && gSaveBlock1Ptr->weather == WEATHER_SNOW) + encounterRate /= 2; + else if (ability == ABILITY_QUICK_FEET) + encounterRate /= 2; + else if (ability == ABILITY_INFILTRATOR) + encounterRate /= 2; + else if (ability == ABILITY_NO_GUARD) + encounterRate = encounterRate * 3 / 2; } if (encounterRate > 2880) encounterRate = 2880; @@ -582,7 +610,17 @@ bool8 StandardWildEncounter(u16 currMetaTileBehavior, u16 previousMetaTileBehavi // try a regular wild land encounter if (TryGenerateWildMon(gWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, WILD_CHECK_REPEL | WILD_CHECK_KEEN_EYE) == TRUE) { - BattleSetup_StartWildBattle(); + if (USE_BATTLE_DEBUG && !GetSafariZoneFlag() && GetMonsStateToDoubles() == PLAYER_HAS_TWO_USABLE_MONS) + { + struct Pokemon mon1 = gEnemyParty[0]; + TryGenerateWildMon(gWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, WILD_CHECK_KEEN_EYE); + gEnemyParty[1] = mon1; + BattleSetup_StartDoubleWildBattle(); + } + else + { + BattleSetup_StartWildBattle(); + } return TRUE; }