From 626b80106e137af8d889c705ec6d46148f6083d1 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 13 Jul 2018 23:00:56 +0200 Subject: [PATCH 001/667] Basic Battle Debug Menu is done --- include/battle.h | 3 + include/battle_controllers.h | 2 + include/battle_debug.h | 8 + include/battle_dome_cards.h | 2 +- include/battle_message.h | 5 + include/constants/battle.h | 2 +- include/reset_rtc_screen.h | 3 + ld_script.txt | 2 + src/battle_controller_player.c | 22 + src/battle_controllers.c | 6 + src/battle_debug.c | 1195 ++++++++++++++++++++++++++++++++ src/battle_main.c | 7 + src/battle_message.c | 18 +- src/reset_rtc_screen.c | 12 +- 14 files changed, 1270 insertions(+), 17 deletions(-) create mode 100644 include/battle_debug.h create mode 100644 src/battle_debug.c diff --git a/include/battle.h b/include/battle.h index fba5fb460a..474de3098a 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) @@ -33,6 +34,7 @@ #define B_ACTION_CANCEL_PARTNER 12 // when choosing an action #define B_ACTION_FINISHED 12 // when executing 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 @@ -545,6 +547,7 @@ struct BattleStruct u8 field_2A0; u8 field_2A1; u8 field_2A2; + u8 debugBattler; }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 8ba45fad14..105cb4eef5 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -170,6 +170,7 @@ enum CONTROLLER_LINKSTANDBYMSG, CONTROLLER_RESETACTIONMOVESELECTION, CONTROLLER_55, + CONTROLLER_DEBUGMENU, /*new controllers should go here*/ CONTROLLER_TERMINATOR_NOP, CONTROLLER_CMDS_COUNT @@ -240,6 +241,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..42dd97f5a7 --- /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 + +extern void CB2_BattleDebugMenu(void); + +#endif // GUARD_BATTLE_DEBUG_H diff --git a/include/battle_dome_cards.h b/include/battle_dome_cards.h index a0696d1563..88e490c905 100644 --- a/include/battle_dome_cards.h +++ b/include/battle_dome_cards.h @@ -10,4 +10,4 @@ u16 sub_818D8F0(u16 spriteId); u16 sub_818D938(u16 species, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId); u8 sub_818D97C(u8 a0, u8 a1); -#endif //GUARD_BATTLE_DOME_CARDS_H +#endif // GUARD_BATTLE_DOME_CARDS_H diff --git a/include/battle_message.h b/include/battle_message.h index 147bfa501c..587ae88a0f 100644 --- a/include/battle_message.h +++ b/include/battle_message.h @@ -246,6 +246,11 @@ extern const u8 gText_BattleSwitchWhich2[]; extern const u8 gText_BattleSwitchWhich3[]; extern const u8 gText_BattleSwitchWhich4[]; extern const u8 gText_BattleSwitchWhich5[]; +extern const u8 gText_Attack[]; +extern const u8 gText_Defense[]; +extern const u8 gText_SpAtk[]; +extern const u8 gText_SpDef[]; +extern const u8 gText_Speed[]; extern const u8 gText_SafariBalls[]; extern const u8 gText_SafariBallLeft[]; extern const u8 gText_Sleep[]; diff --git a/include/constants/battle.h b/include/constants/battle.h index b3f9d919ad..6aad8e486b 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -137,8 +137,8 @@ #define STATUS3_ON_AIR 0x40 #define STATUS3_UNDERGROUND 0x80 #define STATUS3_MINIMIZED 0x100 -#define STATUS3_ROOTED 0x400 #define STATUS3_CHARGED_UP 0x200 +#define STATUS3_ROOTED 0x400 #define STATUS3_YAWN 0x1800 // two bits #define STATUS3_IMPRISONED_OTHERS 0x2000 #define STATUS3_GRUDGE 0x4000 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 6d5e31a25a..52ecc41b3c 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -268,6 +268,7 @@ SECTIONS { src/unk_transition.o(.text); src/international_string_util.o(.text); asm/international_string_util.o(.text); + src/battle_debug.o(.text); } =0 script_data : @@ -541,6 +542,7 @@ SECTIONS { data/mystery_event_msg.o(.rodata); src/m4a_tables.o(.rodata); data/sound_data.o(.rodata); + src/battle_debug.o(.rodata); } =0 song_data : diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 8f69dab068..d8fa817a91 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -107,6 +107,7 @@ static void PlayerHandleBattleAnimation(void); static void PlayerHandleLinkStandbyMsg(void); static void PlayerHandleResetActionMoveSelection(void); static void PlayerHandleCmd55(void); +static void PlayerHandleBattleDebug(void); static void nullsub_22(void); static void PlayerBufferRunCommand(void); @@ -194,6 +195,7 @@ static void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(void) = PlayerHandleLinkStandbyMsg, PlayerHandleResetActionMoveSelection, PlayerHandleCmd55, + PlayerHandleBattleDebug, nullsub_22 }; @@ -343,6 +345,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 @@ -3111,6 +3118,21 @@ static void PlayerHandleCmd55(void) 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 nullsub_22(void) { } diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 1ce5d30998..052c5f610c 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -1520,3 +1520,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..309374bb84 --- /dev/null +++ b/src/battle_debug.c @@ -0,0 +1,1195 @@ +#include "global.h" +#include "battle.h" +#include "battle_message.h" +#include "main.h" +#include "menu.h" +#include "menu_helpers.h" +#include "scanline_effect.h" +#include "palette.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 "list_menu.h" +#include "malloc.h" +#include "string_util.h" +#include "data2.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; + u16 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]; +}; + +struct __attribute__((__packed__)) BitfieldInfo +{ + u8 bitsCount; + u8 currBit; +}; + +enum +{ + LIST_ITEM_MOVES, + LIST_ITEM_ABILITY, + LIST_ITEM_HELD_ITEM, + LIST_ITEM_STATS, + LIST_ITEM_STAT_STAGES, + LIST_ITEM_STATUS1, + LIST_ITEM_STATUS2, + LIST_ITEM_STATUS3, + LIST_ITEM_SIDE_STATUS, + 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 +}; + +enum +{ + LIST_SIDE_REFLECT, + LIST_SIDE_LIGHTSCREEN, + LIST_SIDE_SPIKES, + LIST_SIDE_SAFEGUARD, + LIST_SIDE_MIST +}; + +// 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_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_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}, +}; + +static const struct ListMenuItem sMainListItems[] = +{ + {sText_Moves, LIST_ITEM_MOVES}, + {sText_Ability, LIST_ITEM_ABILITY}, + {sText_HeldItem, LIST_ITEM_HELD_ITEM}, + {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}, +}; + +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}, +}; + +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}, +}; + +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, + .unk_08 = NULL, + .totalItems = ARRAY_COUNT(sMainListItems), + .maxShowed = 6, + .windowId = 0, + .unk_11 = 0, + .unk_12 = 8, + .cursor_X = 0, + .upText_Y = 1, + .cursorPal = 2, + .fillValue = 1, + .cursorShadowPal = 3, + .lettersSpacing = 1, + .unk_16_3 = 0, + .scrollMultiple = LIST_NO_MULTIPLE_SCROLL, + .fontId = 1, + .cursorKind = 0 +}; + +static const struct ListMenuTemplate sSecondaryListTemplate = +{ + .items = sSecondaryListItems, + .moveCursorFunc = NULL, + .unk_08 = NULL, + .totalItems = 0, + .maxShowed = 0, + .windowId = 0, + .unk_11 = 0, + .unk_12 = 8, + .cursor_X = 0, + .upText_Y = 1, + .cursorPal = 2, + .fillValue = 1, + .cursorShadowPal = 3, + .lettersSpacing = 1, + .unk_16_3 = 0, + .scrollMultiple = LIST_NO_MULTIPLE_SCROLL, + .fontId = 1, + .cursorKind = 0 +}; + + +static const struct WindowTemplate sMainListWindowTemplate = +{ + .priority = 0, + .tilemapLeft = 1, + .tilemapTop = 3, + .width = 9, + .height = 12, + .paletteNum = 0xF, + .baseBlock = 0x2 +}; + +static const struct WindowTemplate sSecondaryListWindowTemplate = +{ + .priority = 0, + .tilemapLeft = 12, + .tilemapTop = 3, + .width = 10, + .height = 2, + .paletteNum = 0xF, + .baseBlock = 0xA0 +}; + +static const struct WindowTemplate sModifyWindowTemplate = +{ + .priority = 0, + .tilemapLeft = 25, + .tilemapTop = 2, + .width = 4, + .height = 2, + .paletteNum = 0xF, + .baseBlock = 0x200 +}; + +static const struct WindowTemplate sBattlerWindowTemplate = +{ + .priority = 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 = 2, + .mapBaseIndex = 29, + .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_ABILITY] = 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); + +// 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 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 = ListMenuHandleInputGetItemId(data->mainListTaskId); + if (listItemId != LIST_B_PRESSED && listItemId != LIST_NOTHING_CHOSEN && listItemId < LIST_ITEM_COUNT) + { + 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 = ListMenuHandleInputGetItemId(data->secondaryListTaskId); + if (listItemId == LIST_B_PRESSED) + { + DestroyListMenuTask(data->secondaryListTaskId, NULL, NULL); + sub_8198070(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)) + { + sub_8198070(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); + PrintTextOnWindow(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: + case LIST_ITEM_HELD_ITEM: + itemsCount = 1; + break; + case LIST_ITEM_MOVES: + itemsCount = 4; + break; + case LIST_ITEM_STATS: + listTemplate.items = sStatsListItems; + itemsCount = ARRAY_COUNT(sStatsListItems); + break; + case LIST_ITEM_STAT_STAGES: + itemsCount = 7; + 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_SIDE_STATUS: + listTemplate.items = sSideStatusListItems; + itemsCount = ARRAY_COUNT(sSideStatusListItems); + break; + } + + 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 void PrintSecondaryEntries(struct BattleDebugMenu *data) +{ + u8 text[20]; + s32 i; + struct TextSubPrinter printer; + u8 yMultiplier; + + // Do not print entries if they are not changing. + if (!sHasChangeableEntries[data->currentMainListItemId]) + return; + + yMultiplier = (GetFontAttribute(sSecondaryListTemplate.fontId, 1) + sSecondaryListTemplate.unk_16_3); + + printer.windowId = data->secondaryListWindowId; + printer.fontId = 1; + printer.fontColor_l = 0; + printer.letterSpacing = 0; + printer.lineSpacing = 1; + printer.fgColor = 2; + printer.bgColor = 1; + printer.shadowColor = 3; + printer.x = sSecondaryListTemplate.unk_12; + printer.currentX = sSecondaryListTemplate.unk_12; + printer.current_text_offset = text; + + switch (data->currentMainListItemId) + { + case LIST_ITEM_MOVES: + 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); + } + 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); + break; + case LIST_ITEM_STAT_STAGES: + for (i = 0; i < 7; 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); + } + 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; + + PrintTextOnWindow(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) +{ + switch (data->modifyArrows.typeOfVal) + { + case VAL_U8: + *(u8*)(data->modifyArrows.modifiedValPtr) = data->modifyArrows.currValue; + break; + case VAL_U16: + *(u16*)(data->modifyArrows.modifiedValPtr) = 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; + } + 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) + *(u16*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_REFLECT; + else + *(u16*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_REFLECT); + sideTimer->reflectBattlerId = data->battlerId; + } + return &sideTimer->reflectTimer; + case LIST_SIDE_LIGHTSCREEN: + if (changeStatus) + { + if (statusTrue) + *(u16*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_LIGHTSCREEN; + else + *(u16*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_LIGHTSCREEN); + sideTimer->lightscreenBattlerId = data->battlerId; + } + return &sideTimer->lightscreenTimer; + case LIST_SIDE_SPIKES: + if (changeStatus) + { + if (statusTrue) + *(u16*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_SPIKES; + else + *(u16*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_SPIKES); + } + return &sideTimer->spikesAmount; + case LIST_SIDE_SAFEGUARD: + if (changeStatus) + { + if (statusTrue) + *(u16*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_SAFEGUARD; + else + *(u16*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_SAFEGUARD); + sideTimer->safeguardBattlerId = data->battlerId; + } + return &sideTimer->safeguardTimer; + case LIST_SIDE_MIST: + if (changeStatus) + { + if (statusTrue) + *(u16*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_MIST; + else + *(u16*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_MIST); + sideTimer->mistBattlerId = data->battlerId; + } + return &sideTimer->mistTimer; + 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 - 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 - 1; + data->modifyArrows.maxDigits = 3; + data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].moves[data->currentSecondaryListItemId]; + data->modifyArrows.typeOfVal = VAL_U16; + data->modifyArrows.currValue = gBattleMons[data->battlerId].moves[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_U16; + data->modifyArrows.currValue = gBattleMons[data->battlerId].item; + 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.maxValue = gBattleMons[data->battlerId].maxHP; + } + else if (data->currentSecondaryListItemId == 1) + { + data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].maxHP; + 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; + 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_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_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 + 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_main.c b/src/battle_main.c index 88422574f8..85d4733940 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4323,6 +4323,10 @@ static void HandleTurnActionSelectionState(void) BtlController_EmitEndBounceEffect(0); MarkBattlerForControllerExec(gActiveBattler); return; + case B_ACTION_DEBUG: + BtlController_EmitDebugMenu(0); + MarkBattlerForControllerExec(gActiveBattler); + break; } if (gBattleTypeFlags & BATTLE_TYPE_TRAINER @@ -4462,6 +4466,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; diff --git a/src/battle_message.c b/src/battle_message.c index 32097fd761..2c0eb56008 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -440,7 +440,7 @@ 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"); +const u8 gText_Speed[] = _("SPEED"); static const u8 sText_SpAtk2[] = _("SP. ATK"); static const u8 sText_SpDef2[] = _("SP. DEF"); static const u8 sText_Accuracy[] = _("accuracy"); @@ -449,7 +449,7 @@ static const u8 sText_Evasiveness[] = _("evasiveness"); const u8 * const gStatNamesTable[] = { sText_HP2, sText_Attack2, sText_Defense2, - sText_Speed, sText_SpAtk2, sText_SpDef2, + gText_Speed, sText_SpAtk2, sText_SpDef2, sText_Accuracy, sText_Evasiveness }; @@ -1184,16 +1184,16 @@ 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 sText_HP[] = _("HP"); +const u8 gText_Attack[] = _("ATTACK"); +const u8 gText_Defense[] = _("DEFENSE"); +const u8 gText_SpAtk[] = _("SP. ATK"); +const u8 gText_SpDef[] = _("SP. DEF"); const u8 * const gStatNamesTable2[] = { - sText_HP, sText_SpAtk, sText_Attack, - sText_SpDef, sText_Defense, sText_Speed + sText_HP, gText_SpAtk, gText_Attack, + gText_SpDef, gText_Defense, gText_Speed }; const u8 gText_SafariBalls[] = _("{HIGHLIGHT DARK_GREY}SAFARI BALLS"); diff --git a/src/reset_rtc_screen.c b/src/reset_rtc_screen.c index 9bd462b60a..f63c6a9a54 100644 --- a/src/reset_rtc_screen.c +++ b/src/reset_rtc_screen.c @@ -128,7 +128,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 }; @@ -158,7 +158,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, @@ -270,14 +270,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; @@ -285,7 +285,7 @@ static void CreateCursor(u8 taskId) static void FreeCursorPalette(void) { - FreeSpritePaletteByTag(sSpritePalette_Arrow.tag); + FreeSpritePaletteByTag(gSpritePalette_RtcArrow.tag); } static void HideChooseTimeWindow(u8 windowId) From e94a0e2ddf171e2a6e76e648f0b5277ba743f452 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 13 Jul 2018 23:31:00 +0200 Subject: [PATCH 002/667] Add new gen constants. --- include/constants/abilities.h | 176 ++++++++++++++++++- include/constants/hold_effects.h | 29 ++++ include/constants/moves.h | 283 ++++++++++++++++++++++++++++++- 3 files changed, 486 insertions(+), 2 deletions(-) diff --git a/include/constants/abilities.h b/include/constants/abilities.h index 4ad54c86fa..3f7b595e73 100644 --- a/include/constants/abilities.h +++ b/include/constants/abilities.h @@ -80,6 +80,180 @@ #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 ABILITIES_COUNT_GEN7 234 + +#define ABILITIES_COUNT ABILITIES_COUNT_GEN4 #endif // GUARD_CONSTANTS_ABILITIES_H diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index b653f5a92f..4dc9e80487 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -69,4 +69,33 @@ #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_WIDE_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 + + #endif // GUARD_HOLD_EFFECTS_H diff --git a/include/constants/moves.h b/include/constants/moves.h index 85c02e3da5..f026614d6c 100644 --- a/include/constants/moves.h +++ b/include/constants/moves.h @@ -357,6 +357,287 @@ #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_FOREST_S_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_KING_S_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_LAND_S_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 + +#define MOVES_COUNT MOVES_COUNT_GEN4 #endif // GUARD_CONSTANTS_MOVES_H From c9d1ee3c4a7cd41c030da3b032d6410c4186d804 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 14 Jul 2018 10:11:38 +0200 Subject: [PATCH 003/667] Move high crit to a flag and update move table --- data/battle_scripts_1.s | 21 +- include/constants/battle_move_effects.h | 8 +- include/constants/pokemon.h | 3 +- include/data/battle_moves.h | 3605 ++++++++++++++++++++++- include/pokemon.h | 6 + src/battle_debug.c | 2 + src/battle_script_commands.c | 5 +- 7 files changed, 3602 insertions(+), 48 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 0487199b53..0f9b0ec819 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -57,7 +57,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectSuperFang .4byte BattleScript_EffectDragonRage .4byte BattleScript_EffectTrap - .4byte BattleScript_EffectHighCritical + .4byte BattleScript_EffectPlaceholder43 .4byte BattleScript_EffectDoubleHit .4byte BattleScript_EffectRecoilIfMiss .4byte BattleScript_EffectMist @@ -110,14 +110,14 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectConversion2 .4byte BattleScript_EffectLockOn .4byte BattleScript_EffectSketch - .4byte BattleScript_EffectUnused60//Thaw + .4byte BattleScript_EffectUnused60 .4byte BattleScript_EffectSleepTalk .4byte BattleScript_EffectDestinyBond .4byte BattleScript_EffectFlail .4byte BattleScript_EffectSpite .4byte BattleScript_EffectFalseSwipe .4byte BattleScript_EffectHealBell - .4byte BattleScript_EffectQuickAttack + .4byte BattleScript_EffectPlaceholder103 .4byte BattleScript_EffectTripleKick .4byte BattleScript_EffectThief .4byte BattleScript_EffectMeanLook @@ -214,7 +214,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectSecretPower .4byte BattleScript_EffectDoubleEdge .4byte BattleScript_EffectTeeterDance - .4byte BattleScript_EffectBlazeKick + .4byte BattleScript_EffectPlaceholder200 .4byte BattleScript_EffectMudSport .4byte BattleScript_EffectPoisonFang .4byte BattleScript_EffectWeatherBall @@ -223,7 +223,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectCosmicPower .4byte BattleScript_EffectSkyUppercut .4byte BattleScript_EffectBulkUp - .4byte BattleScript_EffectPoisonTail + .4byte BattleScript_EffectPlaceholder209 .4byte BattleScript_EffectWaterSport .4byte BattleScript_EffectCalmMind .4byte BattleScript_EffectDragonDance @@ -235,7 +235,7 @@ BattleScript_EffectAccuracyUp:: BattleScript_EffectAlwaysHit:: BattleScript_EffectSpecialAttackDown:: BattleScript_EffectSpecialDefenseDown:: -BattleScript_EffectHighCritical:: +BattleScript_EffectPlaceholder43:: BattleScript_EffectAccuracyUp2:: BattleScript_EffectEvasionUp2:: BattleScript_EffectSpecialAttackDown2:: @@ -245,12 +245,14 @@ BattleScript_EffectEvasionDownHit:: BattleScript_EffectVitalThrow:: BattleScript_EffectUnused60:: BattleScript_EffectFalseSwipe:: -BattleScript_EffectQuickAttack:: +BattleScript_EffectPlaceholder103:: BattleScript_EffectUnused6e:: BattleScript_EffectPursuit:: BattleScript_EffectUnused83:: BattleScript_EffectUnused8d:: BattleScript_EffectUnusedA3:: +BattleScript_EffectPlaceholder200:: +BattleScript_EffectPlaceholder209: BattleScript_EffectHit:: jumpifnotmove MOVE_SURF, BattleScript_HitFromAtkCanceler jumpifnostatus3 BS_TARGET, STATUS3_UNDERWATER, BattleScript_HitFromAtkCanceler @@ -288,7 +290,7 @@ BattleScript_MoveEnd:: end BattleScript_MakeMoveMissed:: - orbyte gMoveResultFlags, MOVE_RESULT_MISSED + orhalfword gMoveResultFlags, MOVE_RESULT_MISSED BattleScript_PrintMoveMissed:: attackstring ppreduce @@ -335,8 +337,7 @@ BattleScript_CantMakeAsleep:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectPoisonHit:: -BattleScript_EffectPoisonTail:: +BattleScript_EffectPoisonHit: setmoveeffect MOVE_EFFECT_POISON goto BattleScript_EffectHit diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index b54f013538..4f71dbe879 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -44,7 +44,7 @@ #define EFFECT_SUPER_FANG 40 #define EFFECT_DRAGON_RAGE 41 #define EFFECT_TRAP 42 -#define EFFECT_HIGH_CRITICAL 43 +#define EFFECT_PLACEHOLDER_43 43 #define EFFECT_DOUBLE_HIT 44 #define EFFECT_RECOIL_IF_MISS 45 #define EFFECT_MIST 46 @@ -104,7 +104,7 @@ #define EFFECT_SPITE 100 #define EFFECT_FALSE_SWIPE 101 #define EFFECT_HEAL_BELL 102 -#define EFFECT_QUICK_ATTACK 103 +#define EFFECT_PLACEHOLDER_103 103 #define EFFECT_TRIPLE_KICK 104 #define EFFECT_THIEF 105 #define EFFECT_MEAN_LOOK 106 @@ -201,7 +201,7 @@ #define EFFECT_SECRET_POWER 197 #define EFFECT_DOUBLE_EDGE 198 #define EFFECT_TEETER_DANCE 199 -#define EFFECT_BLAZE_KICK 200 +#define EFFECT_PLACEHOLDER_200 200 #define EFFECT_MUD_SPORT 201 #define EFFECT_POISON_FANG 202 #define EFFECT_WEATHER_BALL 203 @@ -210,7 +210,7 @@ #define EFFECT_COSMIC_POWER 206 #define EFFECT_SKY_UPPERCUT 207 #define EFFECT_BULK_UP 208 -#define EFFECT_POISON_TAIL 209 +#define EFFECT_PLACEHOLDER_209 209 #define EFFECT_WATER_SPORT 210 #define EFFECT_CALM_MIND 211 #define EFFECT_DRAGON_DANCE 212 diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 78c1583b4f..bc66cd07e4 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -20,7 +20,8 @@ #define TYPE_ICE 0x0f #define TYPE_DRAGON 0x10 #define TYPE_DARK 0x11 -#define NUMBER_OF_MON_TYPES 0x12 +#define TYPE_FAIRY 0x12 +#define NUMBER_OF_MON_TYPES 0x13 // Pokemon egg groups #define EGG_GROUP_NONE 0 diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index 00a6f7fdbe..13cc3ccc91 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -1,7 +1,7 @@ #ifndef GUARD_DATA_BATTLE_MOVES #define GUARD_DATA_BATTLE_MOVES -const struct BattleMove gBattleMoves[MOVES_COUNT] = +const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = { { // MOVE_NONE .effect = EFFECT_HIT, @@ -13,6 +13,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, + .split = SPLIT_PHYSICAL, }, { // MOVE_POUND .effect = EFFECT_HIT, @@ -24,9 +25,10 @@ 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, @@ -34,7 +36,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 .effect = EFFECT_MULTI_HIT, @@ -46,6 +49,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 .effect = EFFECT_MULTI_HIT, @@ -57,6 +61,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_PUNCH .effect = EFFECT_HIT, @@ -68,6 +73,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_PAY_DAY .effect = EFFECT_PAY_DAY, @@ -79,6 +85,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 .effect = EFFECT_BURN_HIT, @@ -90,6 +97,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_ICE_PUNCH .effect = EFFECT_FREEZE_HIT, @@ -101,6 +109,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_THUNDER_PUNCH .effect = EFFECT_PARALYZE_HIT, @@ -112,6 +121,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_SCRATCH .effect = EFFECT_HIT, @@ -123,6 +133,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 .effect = EFFECT_HIT, @@ -134,6 +145,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 .effect = EFFECT_OHKO, @@ -145,6 +157,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_RAZOR_WIND .effect = EFFECT_RAZOR_WIND, @@ -156,6 +169,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_SWORDS_DANCE .effect = EFFECT_ATTACK_UP_2, @@ -167,6 +181,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_CUT .effect = EFFECT_HIT, @@ -178,6 +193,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 .effect = EFFECT_GUST, @@ -189,6 +205,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_WING_ATTACK .effect = EFFECT_HIT, @@ -200,6 +217,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 .effect = EFFECT_ROAR, @@ -211,6 +229,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = -6, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_FLY .effect = EFFECT_SEMI_INVULNERABLE, @@ -222,6 +241,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 .effect = EFFECT_TRAP, @@ -233,6 +253,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_SLAM .effect = EFFECT_HIT, @@ -244,6 +265,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_VINE_WHIP .effect = EFFECT_HIT, @@ -255,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_STOMP .effect = EFFECT_FLINCH_MINIMIZE_HIT, @@ -266,6 +289,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_DOUBLE_KICK .effect = EFFECT_DOUBLE_HIT, @@ -277,6 +301,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 .effect = EFFECT_HIT, @@ -288,6 +313,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_JUMP_KICK .effect = EFFECT_RECOIL_IF_MISS, @@ -299,6 +325,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_ROLLING_KICK .effect = EFFECT_FLINCH_HIT, @@ -310,6 +337,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_SAND_ATTACK .effect = EFFECT_ACCURACY_DOWN, @@ -321,6 +349,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 .effect = EFFECT_FLINCH_HIT, @@ -332,6 +361,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_HORN_ATTACK .effect = EFFECT_HIT, @@ -343,6 +373,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 .effect = EFFECT_MULTI_HIT, @@ -354,6 +385,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 .effect = EFFECT_OHKO, @@ -365,6 +397,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_TACKLE .effect = EFFECT_HIT, @@ -376,6 +409,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_BODY_SLAM .effect = EFFECT_PARALYZE_HIT, @@ -387,6 +421,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_WRAP .effect = EFFECT_TRAP, @@ -398,6 +433,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_TAKE_DOWN .effect = EFFECT_RECOIL, @@ -409,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_THRASH .effect = EFFECT_RAMPAGE, @@ -420,6 +457,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .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, @@ -431,6 +469,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_TAIL_WHIP .effect = EFFECT_DEFENSE_DOWN, @@ -442,6 +481,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 .effect = EFFECT_POISON_HIT, @@ -453,6 +493,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_TWINEEDLE .effect = EFFECT_TWINEEDLE, @@ -464,6 +505,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_PIN_MISSILE .effect = EFFECT_MULTI_HIT, @@ -475,6 +517,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_LEER .effect = EFFECT_DEFENSE_DOWN, @@ -486,6 +529,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 .effect = EFFECT_FLINCH_HIT, @@ -497,6 +541,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_GROWL .effect = EFFECT_ATTACK_DOWN, @@ -508,6 +553,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_ROAR .effect = EFFECT_ROAR, @@ -519,6 +565,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = -6, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_SING .effect = EFFECT_SLEEP, @@ -530,6 +577,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_SUPERSONIC .effect = EFFECT_CONFUSE, @@ -541,6 +589,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_SONIC_BOOM .effect = EFFECT_SONICBOOM, @@ -552,6 +601,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 .effect = EFFECT_DISABLE, @@ -563,6 +613,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_ACID .effect = EFFECT_DEFENSE_DOWN_HIT, @@ -574,6 +625,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_EMBER .effect = EFFECT_BURN_HIT, @@ -585,6 +637,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_FLAMETHROWER .effect = EFFECT_BURN_HIT, @@ -596,6 +649,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_MIST .effect = EFFECT_MIST, @@ -607,6 +661,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_WATER_GUN .effect = EFFECT_HIT, @@ -618,6 +673,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_PUMP .effect = EFFECT_HIT, @@ -629,6 +685,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_SURF .effect = EFFECT_HIT, @@ -640,6 +697,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_ICE_BEAM .effect = EFFECT_FREEZE_HIT, @@ -651,6 +709,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_BLIZZARD .effect = EFFECT_FREEZE_HIT, @@ -662,6 +721,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_PSYBEAM .effect = EFFECT_CONFUSE_HIT, @@ -673,6 +733,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_BUBBLE_BEAM .effect = EFFECT_SPEED_DOWN_HIT, @@ -684,6 +745,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_AURORA_BEAM .effect = EFFECT_ATTACK_DOWN_HIT, @@ -695,6 +757,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_HYPER_BEAM .effect = EFFECT_RECHARGE, @@ -706,6 +769,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 .effect = EFFECT_HIT, @@ -717,6 +781,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 .effect = EFFECT_HIT, @@ -728,6 +793,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_SUBMISSION .effect = EFFECT_RECOIL, @@ -739,6 +805,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_LOW_KICK .effect = EFFECT_LOW_KICK, @@ -750,6 +817,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 .effect = EFFECT_COUNTER, @@ -761,6 +829,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_DEPENDS, .priority = -5, .flags = FLAG_MAKES_CONTACT | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_PHYSICAL, }, { // MOVE_SEISMIC_TOSS .effect = EFFECT_LEVEL_DAMAGE, @@ -772,6 +841,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 .effect = EFFECT_HIT, @@ -783,6 +853,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 .effect = EFFECT_ABSORB, @@ -794,6 +865,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_MEGA_DRAIN .effect = EFFECT_ABSORB, @@ -805,6 +877,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_LEECH_SEED .effect = EFFECT_LEECH_SEED, @@ -816,6 +889,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_GROWTH .effect = EFFECT_SPECIAL_ATTACK_UP, @@ -827,9 +901,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .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, @@ -837,7 +912,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_SOLAR_BEAM .effect = EFFECT_SOLARBEAM, @@ -849,6 +925,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 .effect = EFFECT_POISON, @@ -860,6 +937,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_STUN_SPORE .effect = EFFECT_PARALYZE, @@ -871,6 +949,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_POWDER .effect = EFFECT_SLEEP, @@ -882,6 +961,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_PETAL_DANCE .effect = EFFECT_RAMPAGE, @@ -893,6 +973,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_RANDOM, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, { // MOVE_STRING_SHOT .effect = EFFECT_SPEED_DOWN, @@ -904,6 +985,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 .effect = EFFECT_DRAGON_RAGE, @@ -915,6 +997,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_FIRE_SPIN .effect = EFFECT_TRAP, @@ -926,6 +1009,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_THUNDER_SHOCK .effect = EFFECT_PARALYZE_HIT, @@ -937,6 +1021,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_THUNDERBOLT .effect = EFFECT_PARALYZE_HIT, @@ -948,6 +1033,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_THUNDER_WAVE .effect = EFFECT_PARALYZE, @@ -959,6 +1045,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_THUNDER .effect = EFFECT_THUNDER, @@ -970,6 +1057,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_ROCK_THROW .effect = EFFECT_HIT, @@ -981,6 +1069,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 .effect = EFFECT_EARTHQUAKE, @@ -992,6 +1081,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_FISSURE .effect = EFFECT_OHKO, @@ -1003,6 +1093,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_DIG .effect = EFFECT_SEMI_INVULNERABLE, @@ -1014,6 +1105,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 .effect = EFFECT_TOXIC, @@ -1025,6 +1117,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_CONFUSION .effect = EFFECT_CONFUSE_HIT, @@ -1036,6 +1129,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_PSYCHIC .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, @@ -1047,6 +1141,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_HYPNOSIS .effect = EFFECT_SLEEP, @@ -1058,6 +1153,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 .effect = EFFECT_ATTACK_UP, @@ -1069,6 +1165,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_AGILITY .effect = EFFECT_SPEED_UP_2, @@ -1080,9 +1177,10 @@ 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, @@ -1091,6 +1189,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 .effect = EFFECT_RAGE, @@ -1102,6 +1201,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 .effect = EFFECT_TELEPORT, @@ -1113,6 +1213,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, { // MOVE_NIGHT_SHADE .effect = EFFECT_LEVEL_DAMAGE, @@ -1124,6 +1225,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 .effect = EFFECT_MIMIC, @@ -1135,6 +1237,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_SCREECH .effect = EFFECT_DEFENSE_DOWN_2, @@ -1146,6 +1249,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_DOUBLE_TEAM .effect = EFFECT_EVASION_UP, @@ -1157,6 +1261,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_RECOVER .effect = EFFECT_RESTORE_HP, @@ -1168,6 +1273,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_HARDEN .effect = EFFECT_DEFENSE_UP, @@ -1179,6 +1285,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_MINIMIZE .effect = EFFECT_MINIMIZE, @@ -1190,6 +1297,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_SMOKESCREEN .effect = EFFECT_ACCURACY_DOWN, @@ -1201,6 +1309,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 .effect = EFFECT_CONFUSE, @@ -1212,6 +1321,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 .effect = EFFECT_DEFENSE_UP, @@ -1223,6 +1333,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_DEFENSE_CURL .effect = EFFECT_DEFENSE_CURL, @@ -1234,6 +1345,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_BARRIER .effect = EFFECT_DEFENSE_UP_2, @@ -1245,6 +1357,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_LIGHT_SCREEN .effect = EFFECT_LIGHT_SCREEN, @@ -1256,6 +1369,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_HAZE .effect = EFFECT_HAZE, @@ -1267,6 +1381,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_PROTECT_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_REFLECT .effect = EFFECT_REFLECT, @@ -1278,6 +1393,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_FOCUS_ENERGY .effect = EFFECT_FOCUS_ENERGY, @@ -1289,6 +1405,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_BIDE .effect = EFFECT_BIDE, @@ -1298,8 +1415,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .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 .effect = EFFECT_METRONOME, @@ -1311,6 +1429,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_DEPENDS, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, { // MOVE_MIRROR_MOVE .effect = EFFECT_MIRROR_MOVE, @@ -1322,6 +1441,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_DEPENDS, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, { // MOVE_SELF_DESTRUCT .effect = EFFECT_EXPLOSION, @@ -1333,6 +1453,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 .effect = EFFECT_HIT, @@ -1344,6 +1465,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_LICK .effect = EFFECT_PARALYZE_HIT, @@ -1355,6 +1477,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_SMOG .effect = EFFECT_POISON_HIT, @@ -1366,6 +1489,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_SLUDGE .effect = EFFECT_POISON_HIT, @@ -1377,6 +1501,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_BONE_CLUB .effect = EFFECT_FLINCH_HIT, @@ -1388,6 +1513,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_FIRE_BLAST .effect = EFFECT_BURN_HIT, @@ -1399,6 +1525,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_WATERFALL .effect = EFFECT_HIT, @@ -1410,6 +1537,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_CLAMP .effect = EFFECT_TRAP, @@ -1421,6 +1549,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_SWIFT .effect = EFFECT_ALWAYS_HIT, @@ -1432,6 +1561,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_SKULL_BASH .effect = EFFECT_SKULL_BASH, @@ -1443,6 +1573,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_SPIKE_CANNON .effect = EFFECT_MULTI_HIT, @@ -1454,6 +1585,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 .effect = EFFECT_SPEED_DOWN_HIT, @@ -1465,6 +1597,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_AMNESIA .effect = EFFECT_SPECIAL_DEFENSE_UP_2, @@ -1476,6 +1609,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_KINESIS .effect = EFFECT_ACCURACY_DOWN, @@ -1487,6 +1621,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_SOFT_BOILED .effect = EFFECT_SOFTBOILED, @@ -1498,6 +1633,7 @@ 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, @@ -1509,6 +1645,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_GLARE .effect = EFFECT_PARALYZE, @@ -1520,6 +1657,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_DREAM_EATER .effect = EFFECT_DREAM_EATER, @@ -1531,6 +1669,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_POISON_GAS .effect = EFFECT_POISON, @@ -1542,6 +1681,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_BARRAGE .effect = EFFECT_MULTI_HIT, @@ -1553,6 +1693,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_LEECH_LIFE .effect = EFFECT_ABSORB, @@ -1564,6 +1705,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_LOVELY_KISS .effect = EFFECT_SLEEP, @@ -1575,6 +1717,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_SKY_ATTACK .effect = EFFECT_SKY_ATTACK, @@ -1586,6 +1729,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_TRANSFORM .effect = EFFECT_TRANSFORM, @@ -1597,6 +1741,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, { // MOVE_BUBBLE .effect = EFFECT_SPEED_DOWN_HIT, @@ -1608,6 +1753,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_DIZZY_PUNCH .effect = EFFECT_CONFUSE_HIT, @@ -1619,6 +1765,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_SPORE .effect = EFFECT_SLEEP, @@ -1630,6 +1777,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_FLASH .effect = EFFECT_ACCURACY_DOWN, @@ -1641,6 +1789,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_PSYWAVE .effect = EFFECT_PSYWAVE, @@ -1652,6 +1801,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_SPLASH .effect = EFFECT_SPLASH, @@ -1663,6 +1813,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, { // MOVE_ACID_ARMOR .effect = EFFECT_DEFENSE_UP_2, @@ -1674,9 +1825,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_CRABHAMMER - .effect = EFFECT_HIGH_CRITICAL, + .effect = EFFECT_HIT, .power = 90, .type = TYPE_WATER, .accuracy = 85, @@ -1684,7 +1836,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_EXPLOSION .effect = EFFECT_EXPLOSION, @@ -1696,6 +1849,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 .effect = EFFECT_MULTI_HIT, @@ -1707,6 +1861,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 .effect = EFFECT_DOUBLE_HIT, @@ -1718,6 +1873,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 .effect = EFFECT_REST, @@ -1729,6 +1885,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_ROCK_SLIDE .effect = EFFECT_FLINCH_HIT, @@ -1740,6 +1897,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_PHYSICAL, }, { // MOVE_HYPER_FANG .effect = EFFECT_FLINCH_HIT, @@ -1751,6 +1909,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_SHARPEN .effect = EFFECT_ATTACK_UP, @@ -1762,6 +1921,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_CONVERSION .effect = EFFECT_CONVERSION, @@ -1773,6 +1933,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, { // MOVE_TRI_ATTACK .effect = EFFECT_TRI_ATTACK, @@ -1784,6 +1945,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_SUPER_FANG .effect = EFFECT_SUPER_FANG, @@ -1795,9 +1957,10 @@ 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, @@ -1805,7 +1968,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 .effect = EFFECT_SUBSTITUTE, @@ -1817,6 +1981,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_STRUGGLE .effect = EFFECT_RECOIL, @@ -1828,6 +1993,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_SKETCH .effect = EFFECT_SKETCH, @@ -1839,6 +2005,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, { // MOVE_TRIPLE_KICK .effect = EFFECT_TRIPLE_KICK, @@ -1850,6 +2017,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_THIEF .effect = EFFECT_THIEF, @@ -1861,6 +2029,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_SPIDER_WEB .effect = EFFECT_MEAN_LOOK, @@ -1872,6 +2041,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_MIND_READER .effect = EFFECT_LOCK_ON, @@ -1883,6 +2053,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_NIGHTMARE .effect = EFFECT_NIGHTMARE, @@ -1894,6 +2065,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 .effect = EFFECT_THAW_HIT, @@ -1905,6 +2077,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_SNORE .effect = EFFECT_SNORE, @@ -1916,17 +2089,19 @@ 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_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 .effect = EFFECT_FLAIL, @@ -1938,6 +2113,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 .effect = EFFECT_CONVERSION_2, @@ -1949,9 +2125,10 @@ 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, @@ -1959,7 +2136,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 .effect = EFFECT_SPEED_DOWN_2, @@ -1971,6 +2149,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_REVERSAL .effect = EFFECT_FLAIL, @@ -1982,6 +2161,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 .effect = EFFECT_SPITE, @@ -1993,6 +2173,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_POWDER_SNOW .effect = EFFECT_FREEZE_HIT, @@ -2004,6 +2185,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_PROTECT .effect = EFFECT_PROTECT, @@ -2015,9 +2197,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 3, .flags = 0, + .split = SPLIT_STATUS, }, { // MOVE_MACH_PUNCH - .effect = EFFECT_QUICK_ATTACK, + .effect = EFFECT_HIT, .power = 40, .type = TYPE_FIGHTING, .accuracy = 100, @@ -2026,6 +2209,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_SCARY_FACE .effect = EFFECT_SPEED_DOWN_2, @@ -2037,6 +2221,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_FAINT_ATTACK .effect = EFFECT_ALWAYS_HIT, @@ -2048,6 +2233,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_SWEET_KISS .effect = EFFECT_CONFUSE, @@ -2059,6 +2245,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_BELLY_DRUM .effect = EFFECT_BELLY_DRUM, @@ -2070,6 +2257,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_SLUDGE_BOMB .effect = EFFECT_POISON_HIT, @@ -2081,6 +2269,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_MUD_SLAP .effect = EFFECT_ACCURACY_DOWN_HIT, @@ -2092,6 +2281,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_OCTAZOOKA .effect = EFFECT_ACCURACY_DOWN_HIT, @@ -2103,6 +2293,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_SPIKES .effect = EFFECT_SPIKES, @@ -2114,6 +2305,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_OPPONENTS_FIELD, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, { // MOVE_ZAP_CANNON .effect = EFFECT_PARALYZE_HIT, @@ -2125,6 +2317,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_FORESIGHT .effect = EFFECT_FORESIGHT, @@ -2136,6 +2329,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_DESTINY_BOND .effect = EFFECT_DESTINY_BOND, @@ -2147,6 +2341,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, { // MOVE_PERISH_SONG .effect = EFFECT_PERISH_SONG, @@ -2158,6 +2353,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, { // MOVE_ICY_WIND .effect = EFFECT_SPEED_DOWN_HIT, @@ -2169,6 +2365,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_DETECT .effect = EFFECT_PROTECT, @@ -2180,6 +2377,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 3, .flags = 0, + .split = SPLIT_STATUS, }, { // MOVE_BONE_RUSH .effect = EFFECT_MULTI_HIT, @@ -2191,6 +2389,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_LOCK_ON .effect = EFFECT_LOCK_ON, @@ -2202,6 +2401,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_OUTRAGE .effect = EFFECT_RAMPAGE, @@ -2213,6 +2413,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .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 .effect = EFFECT_SANDSTORM, @@ -2224,6 +2425,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, { // MOVE_GIGA_DRAIN .effect = EFFECT_ABSORB, @@ -2235,6 +2437,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_ENDURE .effect = EFFECT_ENDURE, @@ -2246,17 +2449,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 3, .flags = 0, + .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 .effect = EFFECT_ROLLOUT, @@ -2268,6 +2473,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 .effect = EFFECT_FALSE_SWIPE, @@ -2279,6 +2485,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 .effect = EFFECT_SWAGGER, @@ -2290,6 +2497,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_MILK_DRINK .effect = EFFECT_SOFTBOILED, @@ -2301,6 +2509,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 .effect = EFFECT_PARALYZE_HIT, @@ -2312,6 +2521,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_SPECIAL, }, { // MOVE_FURY_CUTTER .effect = EFFECT_FURY_CUTTER, @@ -2323,6 +2533,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 .effect = EFFECT_DEFENSE_UP_HIT, @@ -2334,6 +2545,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_MEAN_LOOK .effect = EFFECT_MEAN_LOOK, @@ -2345,6 +2557,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_ATTRACT .effect = EFFECT_ATTRACT, @@ -2356,6 +2569,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 .effect = EFFECT_SLEEP_TALK, @@ -2367,6 +2581,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_DEPENDS, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, { // MOVE_HEAL_BELL .effect = EFFECT_HEAL_BELL, @@ -2378,6 +2593,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_RETURN .effect = EFFECT_RETURN, @@ -2389,6 +2605,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 .effect = EFFECT_PRESENT, @@ -2400,6 +2617,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 .effect = EFFECT_FRUSTRATION, @@ -2411,6 +2629,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 .effect = EFFECT_SAFEGUARD, @@ -2422,6 +2641,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_PAIN_SPLIT .effect = EFFECT_PAIN_SPLIT, @@ -2433,6 +2653,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_SACRED_FIRE .effect = EFFECT_THAW_HIT, @@ -2444,6 +2665,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_MAGNITUDE .effect = EFFECT_MAGNITUDE, @@ -2455,6 +2677,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_DYNAMIC_PUNCH .effect = EFFECT_CONFUSE_HIT, @@ -2466,6 +2689,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_MEGAHORN .effect = EFFECT_HIT, @@ -2477,6 +2701,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 .effect = EFFECT_PARALYZE_HIT, @@ -2488,6 +2713,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_BATON_PASS .effect = EFFECT_BATON_PASS, @@ -2499,6 +2725,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, { // MOVE_ENCORE .effect = EFFECT_ENCORE, @@ -2510,6 +2737,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_PURSUIT .effect = EFFECT_PURSUIT, @@ -2521,6 +2749,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 .effect = EFFECT_RAPID_SPIN, @@ -2532,6 +2761,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_SWEET_SCENT .effect = EFFECT_EVASION_DOWN, @@ -2543,6 +2773,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 .effect = EFFECT_DEFENSE_DOWN_HIT, @@ -2554,6 +2785,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_METAL_CLAW .effect = EFFECT_ATTACK_UP_HIT, @@ -2565,6 +2797,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_VITAL_THROW .effect = EFFECT_VITAL_THROW, @@ -2576,6 +2809,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 .effect = EFFECT_MORNING_SUN, @@ -2587,6 +2821,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_SYNTHESIS .effect = EFFECT_SYNTHESIS, @@ -2598,6 +2833,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_MOONLIGHT .effect = EFFECT_MOONLIGHT, @@ -2609,10 +2845,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .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, @@ -2620,9 +2857,10 @@ 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, @@ -2630,7 +2868,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 .effect = EFFECT_TWISTER, @@ -2642,6 +2881,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_RAIN_DANCE .effect = EFFECT_RAIN_DANCE, @@ -2653,6 +2893,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, { // MOVE_SUNNY_DAY .effect = EFFECT_SUNNY_DAY, @@ -2664,6 +2905,7 @@ 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, @@ -2675,6 +2917,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_MIRROR_COAT .effect = EFFECT_MIRROR_COAT, @@ -2686,6 +2929,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_DEPENDS, .priority = -5, .flags = FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_SPECIAL, }, { // MOVE_PSYCH_UP .effect = EFFECT_PSYCH_UP, @@ -2697,17 +2941,19 @@ 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 .effect = EFFECT_ALL_STATS_UP_HIT, @@ -2719,6 +2965,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_SPECIAL, }, { // MOVE_SHADOW_BALL .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, @@ -2730,6 +2977,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_FUTURE_SIGHT .effect = EFFECT_FUTURE_SIGHT, @@ -2741,6 +2989,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, + .split = SPLIT_SPECIAL, }, { // MOVE_ROCK_SMASH .effect = EFFECT_DEFENSE_DOWN_HIT, @@ -2752,6 +3001,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_WHIRLPOOL .effect = EFFECT_TRAP, @@ -2763,6 +3013,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_BEAT_UP .effect = EFFECT_BEAT_UP, @@ -2774,6 +3025,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 .effect = EFFECT_FAKE_OUT, @@ -2785,6 +3037,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 1, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_PHYSICAL, }, { // MOVE_UPROAR .effect = EFFECT_UPROAR, @@ -2796,6 +3049,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_RANDOM, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, { // MOVE_STOCKPILE .effect = EFFECT_STOCKPILE, @@ -2807,6 +3061,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_SPIT_UP .effect = EFFECT_SPIT_UP, @@ -2818,6 +3073,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 .effect = EFFECT_SWALLOW, @@ -2829,6 +3085,7 @@ 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, @@ -2840,6 +3097,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_HAIL .effect = EFFECT_HAIL, @@ -2851,6 +3109,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_PROTECT_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_TORMENT .effect = EFFECT_TORMENT, @@ -2862,6 +3121,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_FLATTER .effect = EFFECT_FLATTER, @@ -2873,6 +3133,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 .effect = EFFECT_WILL_O_WISP, @@ -2884,6 +3145,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_MEMENTO .effect = EFFECT_MEMENTO, @@ -2895,6 +3157,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 .effect = EFFECT_FACADE, @@ -2906,6 +3169,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 .effect = EFFECT_FOCUS_PUNCH, @@ -2917,6 +3181,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = -3, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED, + .split = SPLIT_PHYSICAL, }, { // MOVE_SMELLING_SALT .effect = EFFECT_SMELLINGSALT, @@ -2928,6 +3193,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_FOLLOW_ME .effect = EFFECT_FOLLOW_ME, @@ -2939,6 +3205,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 3, .flags = 0, + .split = SPLIT_STATUS, }, { // MOVE_NATURE_POWER .effect = EFFECT_NATURE_POWER, @@ -2950,6 +3217,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_DEPENDS, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, { // MOVE_CHARGE .effect = EFFECT_CHARGE, @@ -2961,6 +3229,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_TAUNT .effect = EFFECT_TAUNT, @@ -2972,6 +3241,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_HELPING_HAND .effect = EFFECT_HELPING_HAND, @@ -2983,6 +3253,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 5, .flags = 0, + .split = SPLIT_STATUS, }, { // MOVE_TRICK .effect = EFFECT_TRICK, @@ -2994,6 +3265,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 .effect = EFFECT_ROLE_PLAY, @@ -3005,6 +3277,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, { // MOVE_WISH .effect = EFFECT_WISH, @@ -3016,6 +3289,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_PROTECT_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_ASSIST .effect = EFFECT_ASSIST, @@ -3027,6 +3301,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_DEPENDS, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, { // MOVE_INGRAIN .effect = EFFECT_INGRAIN, @@ -3038,6 +3313,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_SUPERPOWER .effect = EFFECT_SUPERPOWER, @@ -3049,6 +3325,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 .effect = EFFECT_MAGIC_COAT, @@ -3060,6 +3337,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_DEPENDS, .priority = 4, .flags = 0, + .split = SPLIT_STATUS, }, { // MOVE_RECYCLE .effect = EFFECT_RECYCLE, @@ -3071,6 +3349,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, { // MOVE_REVENGE .effect = EFFECT_REVENGE, @@ -3082,6 +3361,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 .effect = EFFECT_BRICK_BREAK, @@ -3093,6 +3373,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 .effect = EFFECT_YAWN, @@ -3104,6 +3385,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_KNOCK_OFF .effect = EFFECT_KNOCK_OFF, @@ -3115,6 +3397,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 .effect = EFFECT_ENDEAVOR, @@ -3126,6 +3409,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 .effect = EFFECT_ERUPTION, @@ -3137,6 +3421,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 .effect = EFFECT_SKILL_SWAP, @@ -3148,6 +3433,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 .effect = EFFECT_IMPRISON, @@ -3159,6 +3445,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_PROTECT_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_REFRESH .effect = EFFECT_REFRESH, @@ -3170,6 +3457,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_GRUDGE .effect = EFFECT_GRUDGE, @@ -3181,6 +3469,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 .effect = EFFECT_SNATCH, @@ -3192,6 +3481,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_DEPENDS, .priority = 4, .flags = FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_SECRET_POWER .effect = EFFECT_SECRET_POWER, @@ -3203,6 +3493,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_DIVE .effect = EFFECT_SEMI_INVULNERABLE, @@ -3214,6 +3505,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 .effect = EFFECT_MULTI_HIT, @@ -3225,6 +3517,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 .effect = EFFECT_CAMOUFLAGE, @@ -3236,6 +3529,7 @@ 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, @@ -3247,6 +3541,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_LUSTER_PURGE .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, @@ -3258,6 +3553,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_MIST_BALL .effect = EFFECT_SPECIAL_ATTACK_DOWN_HIT, @@ -3269,6 +3565,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_FEATHER_DANCE .effect = EFFECT_ATTACK_DOWN_2, @@ -3280,6 +3577,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_TEETER_DANCE .effect = EFFECT_TEETER_DANCE, @@ -3291,9 +3589,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .flags = FLAG_PROTECT_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_BLAZE_KICK - .effect = EFFECT_BLAZE_KICK, + .effect = EFFECT_BURN_HIT, .power = 85, .type = TYPE_FIRE, .accuracy = 90, @@ -3301,7 +3600,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, + .split = SPLIT_PHYSICAL, }, { // MOVE_MUD_SPORT .effect = EFFECT_MUD_SPORT, @@ -3313,6 +3613,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, { // MOVE_ICE_BALL .effect = EFFECT_ROLLOUT, @@ -3324,6 +3625,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_NEEDLE_ARM .effect = EFFECT_FLINCH_MINIMIZE_HIT, @@ -3335,6 +3637,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_SLACK_OFF .effect = EFFECT_RESTORE_HP, @@ -3346,6 +3649,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_HYPER_VOICE .effect = EFFECT_HIT, @@ -3357,6 +3661,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_POISON_FANG .effect = EFFECT_POISON_FANG, @@ -3368,6 +3673,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_CRUSH_CLAW .effect = EFFECT_DEFENSE_DOWN_HIT, @@ -3379,6 +3685,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_BLAST_BURN .effect = EFFECT_RECHARGE, @@ -3390,6 +3697,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 .effect = EFFECT_RECHARGE, @@ -3401,6 +3709,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_METEOR_MASH .effect = EFFECT_ATTACK_UP_HIT, @@ -3412,6 +3721,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_ASTONISH .effect = EFFECT_FLINCH_MINIMIZE_HIT, @@ -3423,6 +3733,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_WEATHER_BALL .effect = EFFECT_WEATHER_BALL, @@ -3434,6 +3745,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_AROMATHERAPY .effect = EFFECT_HEAL_BELL, @@ -3445,6 +3757,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_FAKE_TEARS .effect = EFFECT_SPECIAL_DEFENSE_DOWN_2, @@ -3456,9 +3769,10 @@ 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, + .effect = EFFECT_HIT, .power = 55, .type = TYPE_FLYING, .accuracy = 95, @@ -3466,7 +3780,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_OVERHEAT .effect = EFFECT_OVERHEAT, @@ -3478,6 +3793,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 .effect = EFFECT_FORESIGHT, @@ -3489,6 +3805,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_ROCK_TOMB .effect = EFFECT_SPEED_DOWN_HIT, @@ -3500,6 +3817,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_SILVER_WIND .effect = EFFECT_ALL_STATS_UP_HIT, @@ -3511,6 +3829,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_METAL_SOUND .effect = EFFECT_SPECIAL_DEFENSE_DOWN_2, @@ -3522,6 +3841,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_GRASS_WHISTLE .effect = EFFECT_SLEEP, @@ -3533,6 +3853,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_TICKLE .effect = EFFECT_TICKLE, @@ -3544,6 +3865,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 .effect = EFFECT_COSMIC_POWER, @@ -3555,6 +3877,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_WATER_SPOUT .effect = EFFECT_ERUPTION, @@ -3566,6 +3889,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 .effect = EFFECT_CONFUSE_HIT, @@ -3577,6 +3901,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_SHADOW_PUNCH .effect = EFFECT_ALWAYS_HIT, @@ -3588,6 +3913,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_EXTRASENSORY .effect = EFFECT_FLINCH_MINIMIZE_HIT, @@ -3599,6 +3925,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_SKY_UPPERCUT .effect = EFFECT_SKY_UPPERCUT, @@ -3610,6 +3937,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_SAND_TOMB .effect = EFFECT_TRAP, @@ -3621,6 +3949,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_SHEER_COLD .effect = EFFECT_OHKO, @@ -3632,6 +3961,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_MUDDY_WATER .effect = EFFECT_ACCURACY_DOWN_HIT, @@ -3643,6 +3973,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_BULLET_SEED .effect = EFFECT_MULTI_HIT, @@ -3654,6 +3985,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_AERIAL_ACE .effect = EFFECT_ALWAYS_HIT, @@ -3665,6 +3997,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_ICICLE_SPEAR .effect = EFFECT_MULTI_HIT, @@ -3676,6 +4009,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 .effect = EFFECT_DEFENSE_UP_2, @@ -3687,6 +4021,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_BLOCK .effect = EFFECT_MEAN_LOOK, @@ -3698,6 +4033,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_HOWL .effect = EFFECT_ATTACK_UP, @@ -3709,6 +4045,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_DRAGON_CLAW .effect = EFFECT_HIT, @@ -3720,6 +4057,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 .effect = EFFECT_RECHARGE, @@ -3731,6 +4069,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 .effect = EFFECT_BULK_UP, @@ -3742,6 +4081,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_BOUNCE .effect = EFFECT_SEMI_INVULNERABLE, @@ -3753,6 +4093,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_MUD_SHOT .effect = EFFECT_SPEED_DOWN_HIT, @@ -3764,9 +4105,10 @@ 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_TAIL - .effect = EFFECT_POISON_TAIL, + .effect = EFFECT_POISON_HIT, .power = 50, .type = TYPE_POISON, .accuracy = 100, @@ -3774,7 +4116,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_HIGH_CRIT, + .split = SPLIT_PHYSICAL, }, { // MOVE_COVET .effect = EFFECT_THIEF, @@ -3786,6 +4129,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_VOLT_TACKLE .effect = EFFECT_DOUBLE_EDGE, @@ -3797,6 +4141,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_MAGICAL_LEAF .effect = EFFECT_ALWAYS_HIT, @@ -3808,6 +4153,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 .effect = EFFECT_WATER_SPORT, @@ -3819,6 +4165,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, + .split = SPLIT_STATUS, }, { // MOVE_CALM_MIND .effect = EFFECT_CALM_MIND, @@ -3830,9 +4177,10 @@ 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, + .effect = EFFECT_HIT, .power = 70, .type = TYPE_GRASS, .accuracy = 100, @@ -3840,7 +4188,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_DRAGON_DANCE .effect = EFFECT_DRAGON_DANCE, @@ -3852,6 +4201,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_ROCK_BLAST .effect = EFFECT_MULTI_HIT, @@ -3863,6 +4213,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_SHOCK_WAVE .effect = EFFECT_ALWAYS_HIT, @@ -3874,6 +4225,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 .effect = EFFECT_CONFUSE_HIT, @@ -3885,6 +4237,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_DOOM_DESIRE .effect = EFFECT_FUTURE_SIGHT, @@ -3896,6 +4249,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, + .split = SPLIT_SPECIAL, }, { // MOVE_PSYCHO_BOOST .effect = EFFECT_OVERHEAT, @@ -3907,6 +4261,3199 @@ 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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + }, + { // MOVE_HAMMER_ARM + .effect = EFFECT_PLACEHOLDER_209, + .power = 100, + .type = TYPE_FIGHTING, + .accuracy = 90, + .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_GYRO_BALL + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_HEALING_WISH + .effect = EFFECT_PLACEHOLDER_209, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + { // MOVE_BRINE + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .power = 30, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 2, + .flags = FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_PLUCK + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 30, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + { // MOVE_METAL_BURST + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_GUARD_SWAP + .effect = EFFECT_PLACEHOLDER_209, + .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_PUNISHMENT + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .power = 0, + .type = TYPE_POISON, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAGICCOAT_AFFECTED, + .split = SPLIT_STATUS, + }, + { // MOVE_HEART_SWAP + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_FORCE_PALM + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_AURA_SPHERE + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_ROCK_POLISH + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_DARK_PULSE + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_NIGHT_SLASH + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_X_SCISSOR + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_DRAGON_PULSE + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_DRAGON_RUSH + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_POWER_GEM + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_VACUUM_WAVE + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_ENERGY_BALL + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_BRAVE_BIRD + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_EARTH_POWER + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_SWITCHEROO + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_AVALANCHE + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_ICE_FANG + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_FIRE_FANG + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_SHADOW_SNEAK + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_PSYCHO_CUT + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_MIRROR_SHOT + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_FLASH_CANNON + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_ROCK_CLIMB + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_DEFOG + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_LAVA_PLUME + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_LEAF_STORM + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_CROSS_POISON + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_GUNK_SHOT + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_IRON_HEAD + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_MAGNET_BOMB + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_STONE_EDGE + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .power = 0, + .type = TYPE_ROCK, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAGICCOAT_AFFECTED, + .split = SPLIT_STATUS, + }, + { // MOVE_GRASS_KNOT + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .power = 65, + .type = TYPE_FLYING, + .accuracy = 100, + .pp = 20, + .secondaryEffectChance = 100, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED, + .split = SPLIT_SPECIAL, + }, + { // MOVE_JUDGMENT + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_WOOD_HAMMER + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_AQUA_JET + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_DOUBLE_HIT + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .power = 0, + .type = TYPE_PSYCHIC, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + { // MOVE_CRUSH_GRIP + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_OMINOUS_WIND + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_SHADOW_FORCE + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_HONE_CLAWS + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .power = 0, + .type = TYPE_ROCK, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 3, + .flags = 0, + .split = SPLIT_STATUS, + }, + { // MOVE_GUARD_SPLIT + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .power = 0, + .type = TYPE_BUG, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 2, + .flags = 0, + .split = SPLIT_STATUS, + }, + { // MOVE_TELEKINESIS + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .power = 50, + .type = TYPE_ROCK, + .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_STORM_THROW + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_QUIVER_DANCE + .effect = EFFECT_PLACEHOLDER_209, + .power = 0, + .type = TYPE_BUG, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + { // MOVE_HEAVY_SLAM + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_SOAK + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_COIL + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_ACID_SPRAY + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_FOUL_PLAY + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_CHIP_AWAY + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_CLEAR_SMOG + .effect = EFFECT_PLACEHOLDER_209, + .power = 50, + .type = TYPE_POISON, + .accuracy = 0, + .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_STORED_POWER + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .power = 0, + .type = TYPE_FIGHTING, + .accuracy = 0, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 3, + .flags = 0, + .split = SPLIT_STATUS, + }, + { // MOVE_ALLY_SWITCH + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_SHELL_SMASH + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_STATUS, + }, + { // MOVE_HEX + .effect = EFFECT_PLACEHOLDER_209, + .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_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, + }, + { // MOVE_INFERNO + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_WATER_PLEDGE + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_BULLDOZE + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_FROST_BREATH + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_WILD_CHARGE + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_DRILL_RUN + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_HORN_LEECH + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_RAZOR_SHELL + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_HEAT_CRASH + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_LEAF_TORNADO + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_STEAMROLLER + .effect = EFFECT_PLACEHOLDER_209, + .power = 65, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_COTTON_GUARD + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_PSYSTRIKE + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_HEAD_CHARGE + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_GEAR_GRIND + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_TECHNO_BLAST + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_SECRET_SWORD + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_BOLT_STRIKE + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_BLUE_FLARE + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_FIERY_DANCE + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_FREEZE_SHOCK + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_ICE_BURN + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_SNARL + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_ICICLE_CRASH + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_V_CREATE + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_MAT_BLOCK + .effect = EFFECT_PLACEHOLDER_209, + .power = 0, + .type = TYPE_FIGHTING, + .accuracy = 0, + .pp = 15, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + { // MOVE_BELCH + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .power = 0, + .type = TYPE_GROUND, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + { // MOVE_STICKY_WEB + .effect = EFFECT_PLACEHOLDER_209, + .power = 0, + .type = TYPE_BUG, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAGICCOAT_AFFECTED, + .split = SPLIT_STATUS, + }, + { // MOVE_FELL_STINGER + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .power = 90, + .type = TYPE_GHOST, + .accuracy = 100, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_TRICK_OR_TREAT + .effect = EFFECT_PLACEHOLDER_209, + .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, + }, + { // MOVE_NOBLE_ROAR + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_STATUS, + }, + { // MOVE_ION_DELUGE + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_FOREST_S_CURSE + .effect = EFFECT_PLACEHOLDER_209, + .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, + }, + { // MOVE_PETAL_BLIZZARD + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_DISARMING_VOICE + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_PARTING_SHOT + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_STATUS, + }, + { // MOVE_TOPSY_TURVY + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + }, + { // MOVE_CRAFTY_SHIELD + .effect = EFFECT_PLACEHOLDER_209, + .power = 0, + .type = TYPE_FAIRY, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 3, + .flags = 0, + .split = SPLIT_STATUS, + }, + { // MOVE_FLOWER_SHIELD + .effect = EFFECT_PLACEHOLDER_209, + .power = 0, + .type = TYPE_FAIRY, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + { // MOVE_GRASSY_TERRAIN + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_FAIRY_WIND + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_BOOMBURST + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_FAIRY_LOCK + .effect = EFFECT_PLACEHOLDER_209, + .power = 0, + .type = TYPE_FAIRY, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + { // MOVE_KING_S_SHIELD + .effect = EFFECT_PLACEHOLDER_209, + .power = 0, + .type = TYPE_STEEL, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 4, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, + }, + { // MOVE_PLAY_NICE + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_DIAMOND_STORM + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_STEAM_ERUPTION + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_HYPERSPACE_HOLE + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_SPIKY_SHIELD + .effect = EFFECT_PLACEHOLDER_209, + .power = 0, + .type = TYPE_GRASS, + .accuracy = 0, + .pp = 10, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 4, + .flags = 0, + .split = SPLIT_STATUS, + }, + { // MOVE_AROMATIC_MIST + .effect = EFFECT_PLACEHOLDER_209, + .power = 0, + .type = TYPE_FAIRY, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + { // MOVE_EERIE_IMPULSE + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_STATUS, + }, + { // MOVE_GEOMANCY + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .power = 0, + .type = TYPE_ELECTRIC, + .accuracy = 0, + .pp = 20, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + { // MOVE_HAPPY_HOUR + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .power = 0, + .type = TYPE_NORMAL, + .accuracy = 0, + .pp = 40, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_USER, + .priority = 0, + .flags = 0, + .split = SPLIT_STATUS, + }, + { // MOVE_BABY_DOLL_EYES + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_HOLD_BACK + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_OBLIVION_WING + .effect = EFFECT_PLACEHOLDER_209, + .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, + }, + { // MOVE_THOUSAND_ARROWS + .effect = EFFECT_PLACEHOLDER_209, + .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_THOUSAND_WAVES + .effect = EFFECT_PLACEHOLDER_209, + .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_LAND_S_WRATH + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_ORIGIN_PULSE + .effect = EFFECT_PLACEHOLDER_209, + .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, + .split = SPLIT_SPECIAL, + }, + { // MOVE_PRECIPICE_BLADES + .effect = EFFECT_PLACEHOLDER_209, + .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_PLACEHOLDER_209, + .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, }, }; diff --git a/include/pokemon.h b/include/pokemon.h index a60ad66bed..3bffb98c14 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -364,6 +364,7 @@ struct BattleMove u8 target; s8 priority; u8 flags; + u8 split; }; #define FLAG_MAKES_CONTACT 0x1 @@ -372,6 +373,11 @@ struct BattleMove #define FLAG_SNATCH_AFFECTED 0x8 #define FLAG_MIRROR_MOVE_AFFECTED 0x10 #define FLAG_KINGSROCK_AFFECTED 0x20 +#define FLAG_HIGH_CRIT 0x40 + +#define SPLIT_PHYSICAL 0x0 +#define SPLIT_SPECIAL 0x1 +#define SPLIT_STATUS 0x2 struct SpindaSpot { diff --git a/src/battle_debug.c b/src/battle_debug.c index 309374bb84..1f68129644 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -82,6 +82,7 @@ enum LIST_ITEM_STATUS2, LIST_ITEM_STATUS3, LIST_ITEM_SIDE_STATUS, + LIST_ITEM_VARIOUS, LIST_ITEM_COUNT }; @@ -156,6 +157,7 @@ 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_EmptyString[] = _(""); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index eb6feb2a07..07cd56af1d 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1282,10 +1282,7 @@ static void atk04_critcalc(void) 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) + + ((gBattleMoves[gCurrentMove].flags & FLAG_HIGH_CRIT) != 0) + (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); From fe15e56f31f2f943c23dec37c6a32be3b8e8d2a1 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 14 Jul 2018 10:57:34 +0200 Subject: [PATCH 004/667] Add Gen4 move names and fairy type name --- data/text/move_names.inc | 113 +++++++++++++++++++++++++++++++++++++++ src/battle_main.c | 1 + 2 files changed, 114 insertions(+) diff --git a/data/text/move_names.inc b/data/text/move_names.inc index 5efb85fc7a..0060c27a5e 100644 --- a/data/text/move_names.inc +++ b/data/text/move_names.inc @@ -354,3 +354,116 @@ gMoveNames:: @ 831977C .string "WATER PULSE$", 13 .string "DOOM DESIRE$", 13 .string "PSYCHO BOOST$", 13 + .string "Roost$", 13 + .string "Gravity$", 13 + .string "Miracle Eye$", 13 + .string "Wake Up Slap$", 13 + .string "Hammer Arm$", 13 + .string "Gyro Ball$", 13 + .string "Healing Wish$", 13 + .string "Brine$", 13 + .string "Natural Gift$", 13 + .string "Feint$", 13 + .string "Pluck$", 13 + .string "Tailwind$", 13 + .string "Acupressure$", 13 + .string "Metal Burst$", 13 + .string "U Turn$", 13 + .string "Close Combat$", 13 + .string "Payback$", 13 + .string "Assurance$", 13 + .string "Embargo$", 13 + .string "Fling$", 13 + .string "Psycho Shift$", 13 + .string "Trump Card$", 13 + .string "Heal Block$", 13 + .string "Wring Out$", 13 + .string "Power Trick$", 13 + .string "Gastro Acid$", 13 + .string "Lucky Chant$", 13 + .string "Me First$", 13 + .string "Copycat$", 13 + .string "Power Swap$", 13 + .string "Guard Swap$", 13 + .string "Punishment$", 13 + .string "Last Resort$", 13 + .string "Worry Seed$", 13 + .string "Sucker Punch$", 13 + .string "Toxic Spikes$", 13 + .string "Heart Swap$", 13 + .string "Aqua Ring$", 13 + .string "Magnet Rise$", 13 + .string "Flare Blitz$", 13 + .string "Force Palm$", 13 + .string "Aura Sphere$", 13 + .string "Rock Polish$", 13 + .string "Poison Jab$", 13 + .string "Dark Pulse$", 13 + .string "Night Slash$", 13 + .string "Aqua Tail$", 13 + .string "Seed Bomb$", 13 + .string "Air Slash$", 13 + .string "X Scissor$", 13 + .string "Bug Buzz$", 13 + .string "Dragon Pulse$", 13 + .string "Dragon Rush$", 13 + .string "Power Gem$", 13 + .string "Drain Punch$", 13 + .string "Vacuum Wave$", 13 + .string "Focus Blast$", 13 + .string "Energy Ball$", 13 + .string "Brave Bird$", 13 + .string "Earth Power$", 13 + .string "Switcheroo$", 13 + .string "Giga Impact$", 13 + .string "Nasty Plot$", 13 + .string "Bullet Punch$", 13 + .string "Avalanche$", 13 + .string "Ice Shard$", 13 + .string "Shadow Claw$", 13 + .string "Thunder Fang$", 13 + .string "Ice Fang$", 13 + .string "Fire Fang$", 13 + .string "Shadow Sneak$", 13 + .string "Mud Bomb$", 13 + .string "Psycho Cut$", 13 + .string "Zen Headbutt$", 13 + .string "Mirror Shot$", 13 + .string "Flash Cannon$", 13 + .string "Rock Climb$", 13 + .string "Defog$", 13 + .string "Trick Room$", 13 + .string "Draco Meteor$", 13 + .string "Discharge$", 13 + .string "Lava Plume$", 13 + .string "Leaf Storm$", 13 + .string "Power Whip$", 13 + .string "Rock Wrecker$", 13 + .string "Cross Poison$", 13 + .string "Gunk Shot$", 13 + .string "Iron Head$", 13 + .string "Magnet Bomb$", 13 + .string "Stone Edge$", 13 + .string "Captivate$", 13 + .string "Stealth Rock$", 13 + .string "Grass Knot$", 13 + .string "Chatter$", 13 + .string "Judgment$", 13 + .string "Bug Bite$", 13 + .string "Charge Beam$", 13 + .string "Wood Hammer$", 13 + .string "Aqua Jet$", 13 + .string "Attack Order$", 13 + .string "Defend Order$", 13 + .string "Heal Order$", 13 + .string "Head Smash$", 13 + .string "Double Hit$", 13 + .string "Roar Of Time$", 13 + .string "Spacial Rend$", 13 + .string "Lunar Dance$", 13 + .string "Crush Grip$", 13 + .string "Magma Storm$", 13 + .string "Dark Void$", 13 + .string "Seed Flare$", 13 + .string "Ominous Wind$", 13 + .string "Shadow Force$", 13 diff --git a/src/battle_main.c b/src/battle_main.c index 85d4733940..cbfaba2d79 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -445,6 +445,7 @@ const u8 gTypeNames[][TYPE_NAME_LENGTH + 1] = _("ICE"), _("DRAGON"), _("DARK"), + _("FAIRY"), }; // This is a factor in how much money you get for beating a trainer. From 1afbcda042732575d3b523664e27fa3d668d4b86 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 14 Jul 2018 11:20:57 +0200 Subject: [PATCH 005/667] Add ability names --- include/data/text/abilities.h | 158 +++++++++++++++++++++++++++++++++- 1 file changed, 157 insertions(+), 1 deletion(-) diff --git a/include/data/text/abilities.h b/include/data/text/abilities.h index 3a1e989d2b..d498d6d8f7 100644 --- a/include/data/text/abilities.h +++ b/include/data/text/abilities.h @@ -80,7 +80,7 @@ static const u8 gShellArmorAbilityDescription[] = _("Blocks critical hits."); static const u8 gCacophonyAbilityDescription[] = _("Avoids sound-based moves."); static const u8 gAirLockAbilityDescription[] = _("Negates weather effects."); -const u8 gAbilityNames[ABILITIES_COUNT][ABILITY_NAME_LENGTH + 1] = +const u8 gAbilityNames[ABILITIES_COUNT_GEN7][ABILITY_NAME_LENGTH + 1] = { _("-------"), _("STENCH"), @@ -160,6 +160,162 @@ const u8 gAbilityNames[ABILITIES_COUNT][ABILITY_NAME_LENGTH + 1] = _("SHELL ARMOR"), _("CACOPHONY"), _("AIR LOCK"), + _("TANGLED FEET"), + _("MOTOR DRIVE"), + _("RIVALRY"), + _("STEADFAST"), + _("SNOW CLOAK"), + _("GLUTTONY"), + _("ANGER POINT"), + _("UNBURDEN"), + _("HEATPROOF"), + _("SIMPLE"), + _("DRY SKIN"), + _("DOWNLOAD"), + _("IRON FIST"), + _("POISON HEAL"), + _("ADAPTABILITY"), + _("SKILL LINK"), + _("HYDRATION"), + _("SOLAR POWER"), + _("QUICK FEET"), + _("NORMALIZE"), + _("SNIPER"), + _("MAGIC GUARD"), + _("NO GUARD"), + _("STALL"), + _("TECHNICIAN"), + _("LEAF GUARD"), + _("KLUTZ"), + _("MOLD BREAKER"), + _("SUPER LUCK"), + _("AFTERMATH"), + _("ANTICIPATION"), + _("FOREWARN"), + _("UNAWARE"), + _("TINTED LENS"), + _("FILTER"), + _("SLOW START"), + _("SCRAPPY"), + _("STORM DRAIN"), + _("ICE BODY"), + _("SOLID ROCK"), + _("SNOW WARNING"), + _("HONEY GATHER"), + _("FRISK"), + _("RECKLESS"), + _("MULTITYPE"), + _("FLOWER GIFT"), + _("BAD DREAMS"), + _("PICKPOCKET"), + _("SHEER FORCE"), + _("CONTRARY"), + _("UNNERVE"), + _("DEFIANT"), + _("DEFEATIST"), + _("CURSED BODY"), + _("HEALER"), + _("FRIEND GUARD"), + _("WEAK ARMOR"), + _("HEAVY METAL"), + _("LIGHT METAL"), + _("MULTISCALE"), + _("TOXIC BOOST"), + _("FLARE BOOST"), + _("HARVEST"), + _("TELEPATHY"), + _("MOODY"), + _("OVERCOAT"), + _("POISON TOUCH"), + _("REGENERATOR"), + _("BIG PECKS"), + _("SAND RUSH"), + _("WONDER SKIN"), + _("ANALYTIC"), + _("ILLUSION"), + _("IMPOSTER"), + _("INFILTRATOR"), + _("MUMMY"), + _("MOXIE"), + _("JUSTIFIED"), + _("RATTLED"), + _("MAGIC BOUNCE"), + _("SAP SIPPER"), + _("PRANKSTER"), + _("SAND FORCE"), + _("IRON BARBS"), + _("ZEN MODE"), + _("VICTORY STAR"), + _("TURBOBLAZE"), + _("TERAVOLT"), + _("AROMA VEIL"), + _("FLOWER VEIL"), + _("CHEEK POUCH"), + _("PROTEAN"), + _("FUR COAT"), + _("MAGICIAN"), + _("BULLETPROOF"), + _("COMPETITIVE"), + _("STRONG JAW"), + _("REFRIGERATE"), + _("SWEET VEIL"), + _("STANCE CHANG"), + _("GALE WINGS"), + _("MEGA LAUNCHE"), + _("GRASS PELT"), + _("SYMBIOSIS"), + _("TOUGH CLAWS"), + _("PIXILATE"), + _("GOOEY"), + _("AERILATE"), + _("PARENTAL BON"), + _("DARK AURA"), + _("FAIRY AURA"), + _("AURA BREAK"), + _("PRIMORDIAL S"), + _("DESOLATE LAN"), + _("DELTA STREAM"), + _("STAMINA"), + _("WIMP OUT"), + _("EMERGENCY EX"), + _("WATER COMPAC"), + _("MERCILESS"), + _("SHIELDS DOWN"), + _("STAKEOUT"), + _("WATER BUBBLE"), + _("STEELWORKER"), + _("BERSERK"), + _("SLUSH RUSH"), + _("LONG REACH"), + _("LIQUID VOICE"), + _("TRIAGE"), + _("GALVANIZE"), + _("SURGE SURFER"), + _("SCHOOLING"), + _("DISGUISE"), + _("BATTLE BOND"), + _("POWER CONSTR"), + _("CORROSION"), + _("COMATOSE"), + _("QUEENLY MAJE"), + _("INNARDS OUT"), + _("DANCER"), + _("BATTERY"), + _("FLUFFY"), + _("DAZZLING"), + _("SOUL HEART"), + _("TANGLING HAI"), + _("RECEIVER"), + _("POWER OF ALC"), + _("BEAST BOOST"), + _("RKS SYSTEM"), + _("ELECTRIC SUR"), + _("PSYCHIC SUR"), + _("MISTY SURGE"), + _("GRASSY SURGE"), + _("FULL METAL B"), + _("SHADOW SHIEL"), + _("PRISM ARMOR"), }; const u8 *const gAbilityDescriptionPointers[ABILITIES_COUNT] = From 2293d1ddbcff5466c7865772bfae1b733e8fe9d9 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 14 Jul 2018 12:02:29 +0200 Subject: [PATCH 006/667] Get rid of duplicate bs command jumpiftype --- asm/macros/battle_script.inc | 5 +---- data/battle_scripts_1.s | 2 +- src/battle_gfx_sfx_util.c | 5 ++++- src/battle_script_commands.c | 13 ++++--------- 4 files changed, 10 insertions(+), 15 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index c03d78df75..307b902198 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -356,11 +356,8 @@ .4byte \param0 .endm - .macro jumpiftype2 bank, type, param2 + .macro jumpiftype2 .byte 0x42 - .byte \bank - .byte \type - .4byte \param2 .endm .macro jumpifabilitypresent ability, param1 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 0f9b0ec819..a79ecff5d0 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1508,7 +1508,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 diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 8f17d488e5..b1fdcf35a5 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -502,7 +502,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_GEN3 - 1)) + return TRUE; + else + return FALSE; } bool8 mplay_80342A4(u8 battlerId) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 07cd56af1d..6e1c93e749 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -156,7 +156,7 @@ static void atk3E_end2(void); static void atk3F_end3(void); static void atk40_jumpifaffectedbyprotect(void); static void atk41_call(void); -static void atk42_jumpiftype2(void); +static void atk42_nop(void); static void atk43_jumpifabilitypresent(void); static void atk44_endselectionscript(void); static void atk45_playanimation(void); @@ -408,7 +408,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atk3F_end3, atk40_jumpifaffectedbyprotect, atk41_call, - atk42_jumpiftype2, + atk42_nop, atk43_jumpifabilitypresent, atk44_endselectionscript, atk45_playanimation, @@ -4265,14 +4265,9 @@ static void atk41_call(void) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } -static void atk42_jumpiftype2(void) +static void atk42_nop(void) { - u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - - if (gBattlescriptCurrInstr[2] == gBattleMons[battlerId].type1 || gBattlescriptCurrInstr[2] == gBattleMons[battlerId].type2) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); - else - gBattlescriptCurrInstr += 7; + gBattlescriptCurrInstr++; } static void atk43_jumpifabilitypresent(void) From 3a10ae9a94e7eeb7b3f6cc3613a27593c764ee94 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 14 Jul 2018 12:54:12 +0200 Subject: [PATCH 007/667] Crit changes accomodated to ai scripts --- asm/macros/battle_ai_script.inc | 4 +++- asm/macros/battle_script.inc | 2 +- data/battle_ai_scripts.s | 13 ++++++++----- include/constants/pokemon.h | 14 ++++++++++++++ include/pokemon.h | 12 ------------ src/battle_ai_script_commands.c | 12 +++++++++--- 6 files changed, 35 insertions(+), 22 deletions(-) diff --git a/asm/macros/battle_ai_script.inc b/asm/macros/battle_ai_script.inc index 5e81686bf9..40b01d1ec5 100644 --- a/asm/macros/battle_ai_script.inc +++ b/asm/macros/battle_ai_script.inc @@ -467,8 +467,10 @@ .byte \bank .endm - .macro nullsub_52 + .macro if_move_flag flag jumpptr .byte 0x52 + .hword \flag + .word \jumpptr .endm .macro nullsub_53 diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 307b902198..1908350b23 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -356,7 +356,7 @@ .4byte \param0 .endm - .macro jumpiftype2 + .macro nop_42 .byte 0x42 .endm diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 2db1c5728e..77be2f3549 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -656,6 +656,7 @@ Score_Plus10: AI_TryToFaint: if_target_is_ally AI_Ret + 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 @@ -688,7 +689,6 @@ AI_TryToFaint: 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_ATTACK_UP_2, AI_CV_AttackUp if_effect EFFECT_DEFENSE_UP_2, AI_CV_DefenseUp @@ -768,18 +768,20 @@ AI_TryToFaint: 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 end +AI_CV_Hit: + if_move_flag FLAG_HIGH_CRIT AI_CV_HighCrit + end + AI_CV_Sleep: @ 82DCA92 if_has_move_with_effect AI_TARGET, EFFECT_DREAM_EATER, AI_CV_SleepEncourageSlpDamage if_has_move_with_effect AI_TARGET, EFFECT_NIGHTMARE, AI_CV_SleepEncourageSlpDamage @@ -2771,7 +2773,7 @@ BattleAIScript_82DDE57: AI_TryToFaint_TryToEncourageQuickAttack: if_effect EFFECT_EXPLOSION, AI_TryToFaint_End - if_not_effect EFFECT_QUICK_ATTACK, AI_TryToFaint_ScoreUp4 + if_move_flag FLAG_HIGH_CRIT AI_TryToFaint_ScoreUp4 score +2 AI_TryToFaint_ScoreUp4: @@ -2863,7 +2865,9 @@ AI_PreferStrongestMove_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 @@ -2875,7 +2879,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 diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index bc66cd07e4..821ad3e5b9 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -78,4 +78,18 @@ #define STAT_ACC 6 // only in battles #define STAT_EVASION 7 // only in battles +// Move flags. +#define FLAG_MAKES_CONTACT 0x1 +#define FLAG_PROTECT_AFFECTED 0x2 +#define FLAG_MAGICCOAT_AFFECTED 0x4 +#define FLAG_SNATCH_AFFECTED 0x8 +#define FLAG_MIRROR_MOVE_AFFECTED 0x10 +#define FLAG_KINGSROCK_AFFECTED 0x20 +#define FLAG_HIGH_CRIT 0x40 + +// Split defines. +#define SPLIT_PHYSICAL 0x0 +#define SPLIT_SPECIAL 0x1 +#define SPLIT_STATUS 0x2 + #endif // GUARD_CONSTANTS_POKEMON_H diff --git a/include/pokemon.h b/include/pokemon.h index 3bffb98c14..a010268038 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -367,18 +367,6 @@ struct BattleMove u8 split; }; -#define FLAG_MAKES_CONTACT 0x1 -#define FLAG_PROTECT_AFFECTED 0x2 -#define FLAG_MAGICCOAT_AFFECTED 0x4 -#define FLAG_SNATCH_AFFECTED 0x8 -#define FLAG_MIRROR_MOVE_AFFECTED 0x10 -#define FLAG_KINGSROCK_AFFECTED 0x20 -#define FLAG_HIGH_CRIT 0x40 - -#define SPLIT_PHYSICAL 0x0 -#define SPLIT_SPECIAL 0x1 -#define SPLIT_STATUS 0x2 - struct SpindaSpot { u8 x, y; diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index e82d225762..1fc13c65bf 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -135,7 +135,7 @@ static void BattleAICmd_get_move_type_from_result(void); static void BattleAICmd_get_move_power_from_result(void); static void BattleAICmd_get_move_effect_from_result(void); static void BattleAICmd_get_protect_count(void); -static void BattleAICmd_nullsub_52(void); +static void BattleAICmd_if_move_flag(void); static void BattleAICmd_nullsub_53(void); static void BattleAICmd_nullsub_54(void); static void BattleAICmd_nullsub_55(void); @@ -244,7 +244,7 @@ static const BattleAICmdFunc sBattleAICmdTable[] = BattleAICmd_get_move_power_from_result, // 0x4F BattleAICmd_get_move_effect_from_result, // 0x50 BattleAICmd_get_protect_count, // 0x51 - BattleAICmd_nullsub_52, // 0x52 + BattleAICmd_if_move_flag, // 0x52 BattleAICmd_nullsub_53, // 0x53 BattleAICmd_nullsub_54, // 0x54 BattleAICmd_nullsub_55, // 0x55 @@ -2123,8 +2123,14 @@ static void BattleAICmd_get_protect_count(void) gAIScriptPtr += 2; } -static void BattleAICmd_nullsub_52(void) +static void BattleAICmd_if_move_flag(void) { + u16 flag = T1_READ_16(gAIScriptPtr + 1); + + if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].flags & flag) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); + else + gAIScriptPtr += 7; } static void BattleAICmd_nullsub_53(void) From b24427f3bf5e0adeb1d56ef6b626c76bb90cdb70 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 14 Jul 2018 13:17:10 +0200 Subject: [PATCH 008/667] Introduce Field Statuses --- include/battle.h | 15 +++++++++++++++ include/battle_util.h | 3 --- include/constants/battle.h | 16 ++++++++++++++-- src/battle_ai_switch_items.c | 2 +- src/battle_controllers.c | 2 +- src/battle_main.c | 4 +++- src/battle_script_commands.c | 10 ++++++---- src/battle_util.c | 29 ----------------------------- src/pokemon.c | 13 ++++++------- 9 files changed, 46 insertions(+), 48 deletions(-) diff --git a/include/battle.h b/include/battle.h index 474de3098a..22080e3382 100644 --- a/include/battle.h +++ b/include/battle.h @@ -248,6 +248,19 @@ struct SideTimer /*0x0B*/ u8 fieldB; }; +struct FieldTimer +{ + u8 mudSportTimer; + u8 waterSportTimer; + u8 wonderRoomTimer; + u8 magicRoomTimer; + u8 trickRoomTimer; + u8 grassyTerrainTimer; + u8 mistyTerrainTimer; + u8 electricTerrainTimer; + u8 psychicTerrainTimer; +}; + struct WishFutureKnock { u8 futureSightCounter[MAX_BATTLERS_COUNT]; @@ -800,6 +813,8 @@ 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 void (*gPreBattleCallback1)(void); extern void (*gBattleMainFunc)(void); diff --git a/include/battle_util.h b/include/battle_util.h index 0531966dfc..df44b6fac1 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -22,7 +22,6 @@ #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 @@ -32,12 +31,10 @@ #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 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))) u8 GetBattlerForBattleScript(u8 caseId); void PressurePPLose(u8 bankDef, u8 bankAtk, u16 move); diff --git a/include/constants/battle.h b/include/constants/battle.h index 6aad8e486b..baad2712ac 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -143,8 +143,8 @@ #define STATUS3_IMPRISONED_OTHERS 0x2000 #define STATUS3_GRUDGE 0x4000 #define STATUS3_CANT_SCORE_A_CRIT 0x8000 -#define STATUS3_MUDSPORT 0x10000 -#define STATUS3_WATERSPORT 0x20000 +// #define STATUS3_MUDSPORT 0x10000 +// #define STATUS3_WATERSPORT 0x20000 #define STATUS3_UNDERWATER 0x40000 #define STATUS3_INTIMIDATE_POKES 0x80000 #define STATUS3_TRACE 0x100000 @@ -188,6 +188,18 @@ #define SIDE_STATUS_MIST (1 << 8) #define SIDE_STATUS_SPIKES_DAMAGED (1 << 9) +// 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 + // Flags describing move's result #define MOVE_RESULT_MISSED (1 << 0) #define MOVE_RESULT_SUPER_EFFECTIVE (1 << 1) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index a105e7edfb..4e2e13635a 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -438,7 +438,7 @@ static bool8 ShouldSwitch(void) 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 (ABILITY_ON_FIELD(ABILITY_MAGNET_PULL)) { if (gBattleMons[gActiveBattler].type1 == TYPE_STEEL) return FALSE; diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 052c5f610c..418f875b95 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -1063,7 +1063,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; diff --git a/src/battle_main.c b/src/battle_main.c index cbfaba2d79..a7d870e727 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -288,6 +288,8 @@ 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}; // IWRAM common vars void (*gPreBattleCallback1)(void); @@ -3116,7 +3118,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++) { diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 6e1c93e749..6ddfa98467 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -9941,18 +9941,20 @@ static void atkE8_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; } diff --git a/src/battle_util.c b/src/battle_util.c index 6e3fc3e7fd..df5fb9232d 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2390,35 +2390,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } } 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++) { diff --git a/src/pokemon.c b/src/pokemon.c index 5406cfee99..113a4b2aa6 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -2293,17 +2293,17 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de spAttack /= 2; if (attacker->ability == ABILITY_HUSTLE) attack = (150 * attack) / 100; - if (attacker->ability == ABILITY_PLUS && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_MINUS, 0, 0)) + if (attacker->ability == ABILITY_PLUS && ABILITY_ON_FIELD(ABILITY_MINUS)) spAttack = (150 * spAttack) / 100; - if (attacker->ability == ABILITY_MINUS && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_PLUS, 0, 0)) + if (attacker->ability == ABILITY_MINUS && ABILITY_ON_FIELD(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)) + if (type == TYPE_ELECTRIC && gFieldStatuses & STATUS_FIELD_MUDSPORT) gBattleMovePower /= 2; - if (type == TYPE_FIRE && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, 0, 0xFE, 0)) + if (type == TYPE_FIRE && gFieldStatuses & STATUS_FIELD_WATERSPORT) gBattleMovePower /= 2; if (type == TYPE_GRASS && attacker->ability == ABILITY_OVERGROW && attacker->hp <= (attacker->maxHP / 3)) gBattleMovePower = (150 * gBattleMovePower) / 100; @@ -2405,9 +2405,8 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == 8 && CountAliveMonsInBattle(2) == 2) damage /= 2; - // are effects of weather negated with cloud nine or air lock - if (!AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_CLOUD_NINE, 0, 0) - && !AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_AIR_LOCK, 0, 0)) + // Are effects of weather negated with cloud nine or air lock? + if (WEATHER_HAS_EFFECT) { if (gBattleWeather & WEATHER_RAIN_TEMPORARY) { From 939127bfff1fb86458ddc5230ea2bcd22df527a7 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 14 Jul 2018 16:41:14 +0200 Subject: [PATCH 009/667] Important battle util functions --- asm/macros/battle_ai_script.inc | 4 +- data/battle_ai_scripts.s | 4 +- include/battle.h | 4 +- include/battle_util.h | 7 + include/constants/battle.h | 7 +- include/constants/battle_move_effects.h | 25 +++ include/constants/hold_effects.h | 8 + src/battle_ai_script_commands.c | 12 +- src/battle_util.c | 235 ++++++++++++++++++++++++ 9 files changed, 297 insertions(+), 9 deletions(-) diff --git a/asm/macros/battle_ai_script.inc b/asm/macros/battle_ai_script.inc index 40b01d1ec5..bc6e3e5a06 100644 --- a/asm/macros/battle_ai_script.inc +++ b/asm/macros/battle_ai_script.inc @@ -473,8 +473,10 @@ .word \jumpptr .endm - .macro nullsub_53 + .macro if_field_status flag jumpptr .byte 0x53 + .word \flag + .word \jumpptr .endm .macro nullsub_54 diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 77be2f3549..502a3028ad 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -570,7 +570,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 +589,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 diff --git a/include/battle.h b/include/battle.h index 22080e3382..d2f592f129 100644 --- a/include/battle.h +++ b/include/battle.h @@ -171,7 +171,8 @@ struct DisableStruct /*0x18*/ u8 unk18_a_2:2; /*0x18*/ u8 unk18_b:4; /*0x19*/ u8 rechargeCounter; - /*0x1A*/ u8 unk1A[2]; + /*0x1A*/ u8 autonomizeCount; + /*0x1B*/ u8 slowStartTimer; }; struct ProtectStruct @@ -259,6 +260,7 @@ struct FieldTimer u8 mistyTerrainTimer; u8 electricTerrainTimer; u8 psychicTerrainTimer; + u8 echoVoiceCounter; }; struct WishFutureKnock diff --git a/include/battle_util.h b/include/battle_util.h index df44b6fac1..74b43d55e0 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -72,5 +72,12 @@ void ClearFuryCutterDestinyBondGrudge(u8 battlerId); void HandleAction_RunBattleScript(void); u8 GetMoveTarget(u16 move, u8 setTarget); u8 IsMonDisobedient(void); +u32 GetBattlerAbility(u8 battlerId); +u32 GetBattlerHoldEffect(u8 battlerId, bool32 checkNegating); +u32 GetBattlerHoldEffectParam(u8 battlerId); +bool32 IsMoveMakingContact(u16 move, u8 battlerAtk); +bool32 IsBattlerGrounded(u8 battlerId); +u8 GetBattleMonMoveSlot(struct BattlePokemon *battleMon, u16 move); +u32 GetBattlerWeight(u8 battlerId); #endif // GUARD_BATTLE_UTIL_H diff --git a/include/constants/battle.h b/include/constants/battle.h index baad2712ac..31cdbb6cee 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -143,11 +143,14 @@ #define STATUS3_IMPRISONED_OTHERS 0x2000 #define STATUS3_GRUDGE 0x4000 #define STATUS3_CANT_SCORE_A_CRIT 0x8000 -// #define STATUS3_MUDSPORT 0x10000 -// #define STATUS3_WATERSPORT 0x20000 +#define STATUS3_GASTRO_ACID 0x10000 +#define STATUS3_EMBARGO 0x20000 #define STATUS3_UNDERWATER 0x40000 #define STATUS3_INTIMIDATE_POKES 0x80000 #define STATUS3_TRACE 0x100000 +#define STATUS3_SMACKED_DOWN 0x200000 +#define STATUS3_ME_FIRST 0x400000 +#define STATUS3_TELEKINESIS 0x800000 #define STATUS3_SEMI_INVULNERABLE (STATUS3_UNDERGROUND | STATUS3_ON_AIR | STATUS3_UNDERWATER) // Not really sure what a "hitmarker" is. diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 4f71dbe879..9a8ed60fc2 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -216,4 +216,29 @@ #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 + #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index 4dc9e80487..60c65e0394 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -97,5 +97,13 @@ #define HOLD_EFFECT_DESTINY_KNOT 91 #define HOLD_EFFECT_SHED_SHELL 92 +// Gen5 hold effects +#define HOLD_EFFECT_FLOAT_STONE 115 + +// Gen6 hold effects +#define HOLD_EFFECT_FAIRY_POWER 130 + +// Gen7 hold effects +#define HOLD_EFFECT_PROTECTIVE_PADS 150 #endif // GUARD_HOLD_EFFECTS_H diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 1fc13c65bf..2f7f79df23 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -136,7 +136,7 @@ static void BattleAICmd_get_move_power_from_result(void); static void BattleAICmd_get_move_effect_from_result(void); static void BattleAICmd_get_protect_count(void); static void BattleAICmd_if_move_flag(void); -static void BattleAICmd_nullsub_53(void); +static void BattleAICmd_if_field_status(void); static void BattleAICmd_nullsub_54(void); static void BattleAICmd_nullsub_55(void); static void BattleAICmd_nullsub_56(void); @@ -245,7 +245,7 @@ static const BattleAICmdFunc sBattleAICmdTable[] = BattleAICmd_get_move_effect_from_result, // 0x50 BattleAICmd_get_protect_count, // 0x51 BattleAICmd_if_move_flag, // 0x52 - BattleAICmd_nullsub_53, // 0x53 + BattleAICmd_if_field_status, // 0x53 BattleAICmd_nullsub_54, // 0x54 BattleAICmd_nullsub_55, // 0x55 BattleAICmd_nullsub_56, // 0x56 @@ -2133,8 +2133,14 @@ static void BattleAICmd_if_move_flag(void) gAIScriptPtr += 7; } -static void BattleAICmd_nullsub_53(void) +static void BattleAICmd_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 BattleAICmd_nullsub_54(void) diff --git a/src/battle_util.c b/src/battle_util.c index df5fb9232d..f8b726eb47 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -22,6 +22,7 @@ #include "event_data.h" #include "link.h" #include "berry.h" +#include "pokedex.h" extern u8 weather_get_current(void); @@ -3369,3 +3370,237 @@ u8 IsMonDisobedient(void) } } } + +static const u8 sAbilitiesAffectedByMoldBreaker[] = +{ + [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, +}; + +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) + && sAbilitiesAffectedByMoldBreaker[gBattleMons[battlerId].ability] + && gBattlerByTurnOrder[gCurrentTurnActionNumber] == gBattlerAttacker + && gActionsByTurnOrder[gBattlerByTurnOrder[gBattlerAttacker]] == B_ACTION_USE_MOVE + && gCurrentTurnActionNumber < gBattlersCount + && !(gStatuses3[gBattlerAttacker] & STATUS3_GASTRO_ACID)) + return ABILITY_NONE; + else + return gBattleMons[battlerId].ability; +} + +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 (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 (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 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; + + if (gDisableStructs[battlerId].autonomizeCount) + weight -= 1000 * gDisableStructs[battlerId].autonomizeCount; + + if (weight == 0) + weight = 1; + + return weight; +} + +u32 CountBattlerStatIncreases(u8 battlerId, bool32 countEvasionAcc) +{ + u32 i; + u32 count = 0; + + for (i = 0; i < BATTLE_STATS_NO; 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; + } +} From baf172d605e9255d9497c4f5933d4798fb7b4a00 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 14 Jul 2018 18:44:38 +0200 Subject: [PATCH 010/667] Prepare damage calc huge changes --- asm/macros/battle_script.inc | 4 +-- data/battle_scripts_1.s | 23 ++------------- src/battle_script_commands.c | 55 ++++-------------------------------- 3 files changed, 11 insertions(+), 71 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 1908350b23..82d06cefb6 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -860,7 +860,7 @@ .byte 0xab .endm - .macro remaininghptopower + .macro nop_AC .byte 0xac .endm @@ -1085,7 +1085,7 @@ .4byte \param0 .endm - .macro weightdamagecalculation + .macro nop_DD .byte 0xdd .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index a79ecff5d0..605d859aca 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -254,6 +254,9 @@ BattleScript_EffectUnusedA3:: BattleScript_EffectPlaceholder200:: BattleScript_EffectPlaceholder209: BattleScript_EffectHit:: +BattleScript_EffectLowKick: +BattleScript_EffectFlail: +BattleScript_EffectFacade: jumpifnotmove MOVE_SURF, BattleScript_HitFromAtkCanceler jumpifnostatus3 BS_TARGET, STATUS3_UNDERWATER, BattleScript_HitFromAtkCanceler orword gHitMarker, HITMARKER_IGNORE_UNDERWATER @@ -1368,10 +1371,6 @@ BattleScript_EffectDestinyBond:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectFlail:: - remaininghptopower - goto BattleScript_EffectHit - BattleScript_EffectSpite:: attackcanceler attackstring @@ -2277,14 +2276,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 @@ -2581,14 +2572,6 @@ 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 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 6ddfa98467..be3f3589ea 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -262,7 +262,7 @@ static void atkA8_copymovepermanently(void); static void atkA9_trychoosesleeptalkmove(void); static void atkAA_setdestinybond(void); static void atkAB_trysetdestinybondtohappen(void); -static void atkAC_remaininghptopower(void); +static void atkAC_nop(void); static void atkAD_tryspiteppreduce(void); static void atkAE_healpartystatus(void); static void atkAF_cursetarget(void); @@ -311,7 +311,7 @@ static void atkD9_scaledamagebyhealthratio(void); static void atkDA_tryswapabilities(void); static void atkDB_tryimprision(void); static void atkDC_trysetgrudge(void); -static void atkDD_weightdamagecalculation(void); +static void atkDD_nop(void); static void atkDE_asistattackselect(void); static void atkDF_trysetmagiccoat(void); static void atkE0_trysetsnatch(void); @@ -514,7 +514,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atkA9_trychoosesleeptalkmove, atkAA_setdestinybond, atkAB_trysetdestinybondtohappen, - atkAC_remaininghptopower, + atkAC_nop, atkAD_tryspiteppreduce, atkAE_healpartystatus, atkAF_cursetarget, @@ -563,7 +563,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atkDA_tryswapabilities, atkDB_tryimprision, atkDC_trysetgrudge, - atkDD_weightdamagecalculation, + atkDD_nop, atkDE_asistattackselect, atkDF_trysetmagiccoat, atkE0_trysetsnatch, @@ -798,16 +798,6 @@ static const u16 sMovesForbiddenToCopy[] = METRONOME_FORBIDDEN_END }; -static const u8 sFlailHpScaleToPowerTable[] = -{ - 1, 200, - 4, 150, - 9, 100, - 16, 80, - 32, 40, - 48, 20 -}; - static const u16 sNaturePowerMoves[] = { MOVE_STUN_SPORE, @@ -822,17 +812,6 @@ static const u16 sNaturePowerMoves[] = 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, @@ -8514,18 +8493,8 @@ static void atkAB_trysetdestinybondtohappen(void) gBattlescriptCurrInstr++; } -static void atkAC_remaininghptopower(void) +static void atkAC_nop(void) { - s32 i; - s32 hpFraction = GetScaledHPFraction(gBattleMons[gBattlerAttacker].hp, gBattleMons[gBattlerAttacker].maxHP, 48); - - for (i = 0; i < (s32) sizeof(sFlailHpScaleToPowerTable); i += 2) - { - if (hpFraction <= sFlailHpScaleToPowerTable[i]) - break; - } - - gDynamicBasePower = sFlailHpScaleToPowerTable[i + 1]; gBattlescriptCurrInstr++; } @@ -9650,20 +9619,8 @@ static void atkDC_trysetgrudge(void) } } -static void atkDD_weightdamagecalculation(void) +static void atkDD_nop(void) { - s32 i; - for (i = 0; sWeightToDamageTable[i] != 0xFFFF; i += 2) - { - if (sWeightToDamageTable[i] > GetPokedexHeightWeight(SpeciesToNationalPokedexNum(gBattleMons[gBattlerTarget].species), 1)) - break; - } - - if (sWeightToDamageTable[i] != 0xFFFF) - gDynamicBasePower = sWeightToDamageTable[i + 1]; - else - gDynamicBasePower = 120; - gBattlescriptCurrInstr++; } From 2ebf14a83d0ebc37f1a1b42f270b2aa31db406a9 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 14 Jul 2018 18:58:45 +0200 Subject: [PATCH 011/667] Get rid of scripting dmg multiplier --- asm/macros/battle_script.inc | 2 +- data/battle_scripts_1.s | 73 +++----- include/battle.h | 2 +- include/constants/battle_script_commands.h | 1 - src/battle_ai_script_commands.c | 5 - src/battle_ai_switch_items.c | 1 - src/battle_main.c | 1 - src/battle_script_commands.c | 21 +-- src/battle_util.c | 183 +++++++++++++-------- src/pokemon.c | 34 ---- 10 files changed, 150 insertions(+), 173 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 82d06cefb6..7561ba169a 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1052,7 +1052,7 @@ .4byte \param0 .endm - .macro doubledamagedealtifdamaged + .macro nop_D6 .byte 0xd6 .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 605d859aca..21ad5a5a50 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -229,38 +229,38 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectDragonDance .4byte BattleScript_EffectCamouflage -BattleScript_EffectSpeedUp:: -BattleScript_EffectSpecialDefenseUp:: -BattleScript_EffectAccuracyUp:: -BattleScript_EffectAlwaysHit:: -BattleScript_EffectSpecialAttackDown:: -BattleScript_EffectSpecialDefenseDown:: -BattleScript_EffectPlaceholder43:: -BattleScript_EffectAccuracyUp2:: -BattleScript_EffectEvasionUp2:: -BattleScript_EffectSpecialAttackDown2:: -BattleScript_EffectAccuracyDown2:: -BattleScript_EffectEvasionDown2:: -BattleScript_EffectEvasionDownHit:: -BattleScript_EffectVitalThrow:: -BattleScript_EffectUnused60:: -BattleScript_EffectFalseSwipe:: -BattleScript_EffectPlaceholder103:: -BattleScript_EffectUnused6e:: -BattleScript_EffectPursuit:: -BattleScript_EffectUnused83:: -BattleScript_EffectUnused8d:: -BattleScript_EffectUnusedA3:: -BattleScript_EffectPlaceholder200:: +BattleScript_EffectSpeedUp: +BattleScript_EffectSpecialDefenseUp: +BattleScript_EffectAccuracyUp: +BattleScript_EffectAlwaysHit: +BattleScript_EffectSpecialAttackDown: +BattleScript_EffectSpecialDefenseDown: +BattleScript_EffectPlaceholder43: +BattleScript_EffectAccuracyUp2: +BattleScript_EffectEvasionUp2: +BattleScript_EffectSpecialAttackDown2: +BattleScript_EffectAccuracyDown2: +BattleScript_EffectEvasionDown2: +BattleScript_EffectEvasionDownHit: +BattleScript_EffectVitalThrow: +BattleScript_EffectUnused60: +BattleScript_EffectFalseSwipe: +BattleScript_EffectPlaceholder103: +BattleScript_EffectUnused6e: +BattleScript_EffectPursuit: +BattleScript_EffectUnused83: +BattleScript_EffectUnused8d: +BattleScript_EffectUnusedA3: +BattleScript_EffectPlaceholder200: BattleScript_EffectPlaceholder209: BattleScript_EffectHit:: BattleScript_EffectLowKick: BattleScript_EffectFlail: BattleScript_EffectFacade: +BattleScript_EffectRevenge: jumpifnotmove MOVE_SURF, BattleScript_HitFromAtkCanceler jumpifnostatus3 BS_TARGET, STATUS3_UNDERWATER, BattleScript_HitFromAtkCanceler orword gHitMarker, HITMARKER_IGNORE_UNDERWATER - setbyte sDMG_MULTIPLIER, 0x2 BattleScript_HitFromAtkCanceler:: attackcanceler BattleScript_HitFromAccCheck:: @@ -860,7 +860,6 @@ 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 @@ -1850,11 +1849,11 @@ BattleScript_EffectSkullBash:: BattleScript_SkullBashEnd:: goto BattleScript_MoveEnd -BattleScript_EffectTwister:: +BattleScript_EffectTwister: jumpifnostatus3 BS_TARGET, STATUS3_ON_AIR, BattleScript_FlinchEffect orword gHitMarker, HITMARKER_IGNORE_ON_AIR - setbyte sDMG_MULTIPLIER, 0x2 -BattleScript_FlinchEffect:: +BattleScript_FlinchEffect: +BattleScript_EffectStomp: setmoveeffect MOVE_EFFECT_FLINCH goto BattleScript_EffectHit @@ -1867,11 +1866,9 @@ 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 @@ -1921,14 +1918,8 @@ BattleScript_EffectFutureSight:: 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 @@ -2287,11 +2278,6 @@ BattleScript_EffectFocusPunch:: 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 goto BattleScript_EffectHit BattleScript_EffectFollowMe:: @@ -2431,10 +2417,6 @@ BattleScript_EffectRecycle:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectRevenge:: - doubledamagedealtifdamaged - goto BattleScript_EffectHit - BattleScript_EffectBrickBreak:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -3096,7 +3078,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 diff --git a/include/battle.h b/include/battle.h index d2f592f129..43662b7ccb 100644 --- a/include/battle.h +++ b/include/battle.h @@ -598,7 +598,7 @@ struct BattleScripting s32 painSplitHp; s32 bideDmg; u8 multihitString[6]; - u8 dmgMultiplier; + u8 unused_E; u8 twoTurnsMoveStringId; u8 animArg1; u8 animArg2; diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index c820a1114d..d13ee7d812 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -5,7 +5,6 @@ #define sPAINSPLIT_HP gBattleScripting #define sBIDE_DMG gBattleScripting + 4 #define sMULTIHIT_STRING gBattleScripting + 8 -#define sDMG_MULTIPLIER gBattleScripting + 0xE #define sTWOTURN_STRINGID gBattleScripting + 0xF #define sB_ANIM_ARG1 gBattleScripting + 0x10 #define sB_ANIM_ARG2 gBattleScripting + 0x11 diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 2f7f79df23..850dbf0301 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -1179,7 +1179,6 @@ static void BattleAICmd_get_how_powerful_move_is(void) { gDynamicBasePower = 0; *(&gBattleStruct->dynamicMoveType) = 0; - gBattleScripting.dmgMultiplier = 1; gMoveResultFlags = 0; gCritMultiplier = 1; @@ -1460,7 +1459,6 @@ static void BattleAICmd_get_highest_type_effectiveness(void) gDynamicBasePower = 0; dynamicMoveType = &gBattleStruct->dynamicMoveType; *dynamicMoveType = 0; - gBattleScripting.dmgMultiplier = 1; gMoveResultFlags = 0; gCritMultiplier = 1; AI_THINKING_STRUCT->funcResult = 0; @@ -1500,7 +1498,6 @@ static void BattleAICmd_if_type_effectiveness(void) gDynamicBasePower = 0; gBattleStruct->dynamicMoveType = 0; - gBattleScripting.dmgMultiplier = 1; gMoveResultFlags = 0; gCritMultiplier = 1; @@ -1712,7 +1709,6 @@ static void BattleAICmd_if_can_faint(void) gDynamicBasePower = 0; gBattleStruct->dynamicMoveType = 0; - gBattleScripting.dmgMultiplier = 1; gMoveResultFlags = 0; gCritMultiplier = 1; gCurrentMove = AI_THINKING_STRUCT->moveConsidered; @@ -1741,7 +1737,6 @@ static void BattleAICmd_if_cant_faint(void) gDynamicBasePower = 0; gBattleStruct->dynamicMoveType = 0; - gBattleScripting.dmgMultiplier = 1; gMoveResultFlags = 0; gCritMultiplier = 1; gCurrentMove = AI_THINKING_STRUCT->moveConsidered; diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 4e2e13635a..559323ee75 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -735,7 +735,6 @@ u8 GetMostSuitableMonToSwitchInto(void) gDynamicBasePower = 0; gBattleStruct->dynamicMoveType = 0; - gBattleScripting.dmgMultiplier = 1; gMoveResultFlags = 0; gCritMultiplier = 1; bestDmg = 0; diff --git a/src/battle_main.c b/src/battle_main.c index a7d870e727..4bc5b6eb05 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5296,7 +5296,6 @@ static void HandleAction_UseMove(void) } gCritMultiplier = 1; - gBattleScripting.dmgMultiplier = 1; gBattleStruct->atkCancellerTracker = 0; gMoveResultFlags = 0; gMultiHitCounter = 0; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index be3f3589ea..fff95d2861 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -304,7 +304,7 @@ static void atkD2_tryswapitems(void); static void atkD3_trycopyability(void); static void atkD4_trywish(void); static void atkD5_trysetroots(void); -static void atkD6_doubledamagedealtifdamaged(void); +static void atkD6_nop(void); static void atkD7_setyawn(void); static void atkD8_setdamagetohealthdifference(void); static void atkD9_scaledamagebyhealthratio(void); @@ -556,7 +556,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atkD3_trycopyability, atkD4_trywish, atkD5_trysetroots, - atkD6_doubledamagedealtifdamaged, + atkD6_nop, atkD7_setyawn, atkD8_setdamagetohealthdifference, atkD9_scaledamagebyhealthratio, @@ -1286,7 +1286,7 @@ static void atk05_damagecalc(void) gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerTarget], gCurrentMove, sideStatus, gDynamicBasePower, gBattleStruct->dynamicMoveType, gBattlerAttacker, gBattlerTarget); - gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * gBattleScripting.dmgMultiplier; + gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier; if (gStatuses3[gBattlerAttacker] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) gBattleMoveDamage *= 2; @@ -1303,7 +1303,7 @@ void AI_CalcDmg(u8 attacker, u8 defender) sideStatus, gDynamicBasePower, gBattleStruct->dynamicMoveType, attacker, defender); gDynamicBasePower = 0; - gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * gBattleScripting.dmgMultiplier; + gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier; if (gStatuses3[attacker] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) gBattleMoveDamage *= 2; @@ -3882,7 +3882,6 @@ static void atk24(void) static void MoveValuesCleanUp(void) { gMoveResultFlags = 0; - gBattleScripting.dmgMultiplier = 1; gCritMultiplier = 1; gBattleCommunication[MOVE_EFFECT_BYTE] = 0; gBattleCommunication[6] = 0; @@ -9492,16 +9491,8 @@ static void atkD5_trysetroots(void) // ingrain } } -static void atkD6_doubledamagedealtifdamaged(void) +static void atkD6_nop(void) { - if ((gProtectStructs[gBattlerAttacker].physicalDmg - && gProtectStructs[gBattlerAttacker].physicalBattlerId == gBattlerTarget) - || (gProtectStructs[gBattlerAttacker].specialDmg - && gProtectStructs[gBattlerAttacker].specialBattlerId == gBattlerTarget)) - { - gBattleScripting.dmgMultiplier = 2; - } - gBattlescriptCurrInstr++; } @@ -9927,8 +9918,6 @@ static void atkE9_setweatherballtype(void) { 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) diff --git a/src/battle_util.c b/src/battle_util.c index f8b726eb47..02a799d7fc 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -33,6 +33,122 @@ static const u16 sSoundMovesTable[] = MOVE_UPROAR, MOVE_METAL_SOUND, MOVE_GRASS_WHISTLE, MOVE_HYPER_VOICE, 0xFFFF }; +static const u8 sAbilitiesAffectedByMoldBreaker[] = +{ + [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 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 u16 sSpeedDiffToDmgTable[] = +{ + 40, 60, 80, 120, 150 +}; + +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}, +}; + +// code u8 GetBattlerForBattleScript(u8 caseId) { u8 ret = 0; @@ -3371,73 +3487,6 @@ u8 IsMonDisobedient(void) } } -static const u8 sAbilitiesAffectedByMoldBreaker[] = -{ - [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, -}; - u32 GetBattlerAbility(u8 battlerId) { if (gStatuses3[battlerId] & STATUS3_GASTRO_ACID) diff --git a/src/pokemon.c b/src/pokemon.c index 113a4b2aa6..3acc244efa 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -1036,27 +1036,6 @@ const u16 gUnknown_08329D54[] = 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 @@ -2260,19 +2239,6 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de 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 (type <= 8) - 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)) From c00fa14b669a385553ac7e337909f3c81f1743a0 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 14 Jul 2018 19:29:25 +0200 Subject: [PATCH 012/667] Create template of new dmg calc --- include/battle_util.h | 1 + include/pokemon.h | 1 - src/battle_script_commands.c | 38 +----- src/battle_tv.c | 4 +- src/battle_util.c | 9 +- src/pokemon.c | 245 +---------------------------------- 6 files changed, 14 insertions(+), 284 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index 74b43d55e0..04ccced1b3 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -79,5 +79,6 @@ bool32 IsMoveMakingContact(u16 move, u8 battlerAtk); bool32 IsBattlerGrounded(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); #endif // GUARD_BATTLE_UTIL_H diff --git a/include/pokemon.h b/include/pokemon.h index a010268038..f7166a60f3 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -488,7 +488,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 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index fff95d2861..915fe59d67 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1282,33 +1282,16 @@ static void atk04_critcalc(void) static void atk05_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; - - 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, gCritMultiplier); 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; - - if (gStatuses3[attacker] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) - gBattleMoveDamage *= 2; - if (gProtectStructs[attacker].helpingHand) - gBattleMoveDamage = gBattleMoveDamage * 15 / 10; + // To modify. } static void ModulateDmgByType(u8 multiplier) @@ -7121,14 +7104,7 @@ static void atk86_stockpiletobasedamage(void) { 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; @@ -9106,12 +9082,6 @@ static void atkC3_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; diff --git a/src/battle_tv.c b/src/battle_tv.c index 6f9ee414e6..783ecc95dd 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -1430,9 +1430,7 @@ static void TrySetBattleSeminarShow(void) { u8 moveResultFlags; u16 sideStatus = gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)]; - gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerTarget], gCurrentMove, - sideStatus, powerOverride, - 0, gBattlerAttacker, gBattlerTarget); + gBattleMoveDamage = CalculateMoveDamage(gCurrentMove, gBattlerAttacker, gBattlerTarget, gBattleMoves[gCurrentMove].type, powerOverride, FALSE); if (gStatuses3[gBattlerAttacker] & STATUS3_CHARGED_UP && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) gBattleMoveDamage *= 2; diff --git a/src/battle_util.c b/src/battle_util.c index 02a799d7fc..d5abd6d255 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1552,7 +1552,7 @@ u8 AtkCanceller_UnableToUseMove(void) { 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); gProtectStructs[gBattlerAttacker].confusionSelfDmg = 1; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; } @@ -3472,7 +3472,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); gBattlerTarget = gBattlerAttacker; gBattlescriptCurrInstr = BattleScript_82DB6F0; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; @@ -3653,3 +3653,8 @@ u32 GetMoveTargetCount(u16 move, u8 battlerAtk, u8 battlerDef) return 0; } } + +s32 CalculateMoveDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, s32 fixedBasePower, bool32 isCrit) +{ + +} diff --git a/src/pokemon.c b/src/pokemon.c index 3acc244efa..f3b1b1fb3b 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -1016,7 +1016,7 @@ const u8 gStatStageRatios[][2] = {40, 10}, // +6 }; -static const u16 sDeoxysBaseStats[] = +static const u8 sDeoxysBaseStats[] = { 50, // Hp 95, // Attack @@ -2171,249 +2171,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; - - 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_FIELD(ABILITY_MINUS)) - spAttack = (150 * spAttack) / 100; - if (attacker->ability == ABILITY_MINUS && ABILITY_ON_FIELD(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 && gFieldStatuses & STATUS_FIELD_MUDSPORT) - gBattleMovePower /= 2; - if (type == TYPE_FIRE && gFieldStatuses & STATUS_FIELD_WATERSPORT) - 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 (type < TYPE_MYSTERY) // is physical - { - if (gCritMultiplier == 2) - { - if (attacker->statStages[STAT_ATK] > 6) - 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] < 6) - 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(2) == 2) - damage = 2 * (damage / 3); - else - damage /= 2; - } - - if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == 8 && CountAliveMonsInBattle(2) == 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 (type > TYPE_MYSTERY) // is special? - { - if (gCritMultiplier == 2) - { - if (attacker->statStages[STAT_SPATK] > 6) - 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] < 6) - 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(2) == 2) - damage = 2 * (damage / 3); - else - damage /= 2; - } - - if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == 8 && CountAliveMonsInBattle(2) == 2) - damage /= 2; - - // Are effects of weather negated with cloud nine or air lock? - if (WEATHER_HAS_EFFECT) - { - 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)) && 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] & UNKNOWN_FLAG_FLASH_FIRE) && type == TYPE_FIRE) - damage = (15 * damage) / 10; - } - - return damage + 2; -} - u8 CountAliveMonsInBattle(u8 caseId) { s32 i; From 5a38bb61db8a78df8eae35b20a7b491f2bcae018 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 14 Jul 2018 22:56:03 +0200 Subject: [PATCH 013/667] Basic damage calc is ready. --- asm/macros/battle_script.inc | 6 +- data/battle_scripts_1.s | 64 +- include/battle.h | 17 +- include/battle_main.h | 1 + include/battle_util.h | 3 +- include/constants/battle.h | 4 + include/constants/hold_effects.h | 7 + include/constants/pokemon.h | 9 + include/constants/species.h | 6 + include/global.h | 6 + include/pokemon.h | 2 +- src/battle_ai_script_commands.c | 9 +- src/battle_ai_switch_items.c | 1 - src/battle_main.c | 155 ++--- src/battle_script_commands.c | 176 ++--- src/battle_tv.c | 9 +- src/battle_util.c | 1069 +++++++++++++++++++++++++++++- 17 files changed, 1251 insertions(+), 293 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 7561ba169a..df8bb78d3d 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 nop_08 .byte 0x8 .endm @@ -558,7 +558,7 @@ .byte 0x68 .endm - .macro adjustsetdamage + .macro nop_69 .byte 0x69 .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 21ad5a5a50..cd6244d36a 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -271,8 +271,7 @@ BattleScript_HitFromAtkString:: BattleScript_HitFromCritCalc:: critcalc damagecalc - typecalc - adjustnormaldamage + adjustdamage BattleScript_HitFromAtkAnimation:: attackanimation waitanimation @@ -351,8 +350,7 @@ BattleScript_EffectAbsorb:: ppreduce critcalc damagecalc - typecalc - adjustnormaldamage + adjustdamage attackanimation waitanimation effectivenesssound @@ -413,8 +411,7 @@ BattleScript_82D8B96:: movevaluescleanup critcalc damagecalc - typecalc - adjustnormaldamage + adjustdamage accuracycheck BattleScript_82D8BCF, ACC_CURR_MOVE effectivenesssound hitanimation BS_TARGET @@ -463,8 +460,7 @@ BattleScript_82D8C18:: ppreduce critcalc damagecalc - typecalc - adjustnormaldamage + adjustdamage attackanimation waitanimation effectivenesssound @@ -645,9 +641,8 @@ BattleScript_DoMultiHit:: copybyte cEFFECT_CHOOSER, sMULTIHIT_EFFECT critcalc damagecalc - typecalc jumpifmovehadnoeffect BattleScript_MultiHitNoMoreHits - adjustnormaldamage + adjustdamage attackanimation waitanimation effectivenesssound @@ -853,7 +848,7 @@ BattleScript_EffectDragonRage:: typecalc bicbyte gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE setword gBattleMoveDamage, 40 - adjustsetdamage + adjustdamage goto BattleScript_HitFromAtkAnimation BattleScript_EffectTrap:: @@ -889,7 +884,7 @@ BattleScript_MoveMissedDoDamage:: waitmessage 0x40 damagecalc typecalc - adjustnormaldamage + adjustdamage manipulatedamage ATK80_DMG_HALF_BY_TWO_NOT_MORE_THAN_HALF_MAX_HP bicbyte gMoveResultFlags, MOVE_RESULT_MISSED orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE @@ -910,7 +905,7 @@ BattleScript_EffectMist:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectFocusEnergy:: +BattleScript_EffectFocusEnergy: attackcanceler attackstring ppreduce @@ -922,13 +917,13 @@ BattleScript_EffectFocusEnergy:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectRecoil:: +BattleScript_EffectRecoil: setmoveeffect MOVE_EFFECT_RECOIL_25 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN jumpifnotmove MOVE_STRUGGLE, BattleScript_EffectHit incrementgamestat 0x1B goto BattleScript_EffectHit -BattleScript_EffectConfuse:: +BattleScript_EffectConfuse: attackcanceler attackstring ppreduce @@ -1228,7 +1223,7 @@ BattleScript_EffectLevelDamage:: typecalc bicbyte gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE dmgtolevel - adjustsetdamage + adjustdamage goto BattleScript_HitFromAtkAnimation BattleScript_EffectPsywave:: @@ -1239,7 +1234,7 @@ BattleScript_EffectPsywave:: typecalc bicbyte gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE psywavedamageeffect - adjustsetdamage + adjustdamage goto BattleScript_HitFromAtkAnimation BattleScript_EffectCounter:: @@ -1249,7 +1244,7 @@ BattleScript_EffectCounter:: attackstring ppreduce typecalc2 - adjustsetdamage + adjustdamage goto BattleScript_HitFromAtkAnimation BattleScript_EffectEncore:: @@ -1425,8 +1420,7 @@ BattleScript_DoTripleKickAttack:: copyhword gDynamicBasePower, sTRIPLE_KICK_POWER critcalc damagecalc - typecalc - adjustnormaldamage + adjustdamage jumpifmovehadnoeffect BattleScript_TripleKickNoMoreHits attackanimation waitanimation @@ -1663,9 +1657,8 @@ BattleScript_FuryCutterHit:: furycuttercalc critcalc damagecalc - typecalc jumpifmovehadnoeffect BattleScript_FuryCutterHit - adjustnormaldamage + adjustdamage goto BattleScript_HitFromAtkAnimation BattleScript_EffectAttract:: @@ -1751,7 +1744,7 @@ BattleScript_EffectSonicboom:: typecalc bicbyte gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE setword gBattleMoveDamage, 20 - adjustsetdamage + adjustdamage goto BattleScript_HitFromAtkAnimation BattleScript_EffectMorningSun:: @@ -1831,7 +1824,7 @@ BattleScript_EffectMirrorCoat:: attackstring ppreduce typecalc2 - adjustsetdamage + adjustdamage goto BattleScript_HitFromAtkAnimation BattleScript_EffectSkullBash:: @@ -1873,8 +1866,7 @@ BattleScript_DoHitAllWithUndergroundBonus:: accuracycheck BattleScript_HitAllWithUndergroundBonusMissed, ACC_CURR_MOVE critcalc damagecalc - typecalc - adjustnormaldamage + adjustdamage attackanimation waitanimation effectivenesssound @@ -1969,10 +1961,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 ATK80_DMG_DOUBLED BattleScript_BeatUpAttack:: - adjustnormaldamage + adjustdamage attackanimation waitanimation effectivenesssound @@ -2120,7 +2112,7 @@ BattleScript_EffectSpitUp:: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE stockpiletobasedamage BattleScript_SpitUpFail typecalc - adjustsetdamage + adjustdamage goto BattleScript_HitFromAtkAnimation BattleScript_SpitUpFail:: pause 0x20 @@ -2425,8 +2417,7 @@ 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 BattleScript_BrickBreakAnim:: @@ -2489,7 +2480,7 @@ BattleScript_EffectEndeavor:: jumpifmovehadnoeffect BattleScript_HitFromAtkAnimation bicbyte gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE copyword gBattleMoveDamage, gHpDealt - adjustsetdamage + adjustdamage goto BattleScript_HitFromAtkAnimation BattleScript_EffectEruption:: @@ -3117,8 +3108,7 @@ BattleScript_PursuitDmgOnSwitchOut:: ppreduce critcalc damagecalc - typecalc - adjustnormaldamage + adjustdamage attackanimation waitanimation effectivenesssound @@ -3291,7 +3281,7 @@ BattleScript_BideAttack:: typecalc bicbyte gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE copyword gBattleMoveDamage, sBIDE_DMG - adjustsetdamage + adjustdamage setbyte sB_ANIM_TURN, 0x1 attackanimation waitanimation @@ -3510,7 +3500,7 @@ BattleScript_MonTookFutureAttack:: BattleScript_CheckDoomDesireMiss:: accuracycheck BattleScript_FutureAttackMiss, MOVE_DOOM_DESIRE BattleScript_FutureAttackAnimate:: - adjustnormaldamage2 + adjustdamage jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, 0x0, BattleScript_FutureHitAnimDoomDesire playanimation BS_ATTACKER, B_ANIM_FUTURE_SIGHT_HIT, NULL goto BattleScript_DoFutureAttackHit @@ -3798,7 +3788,7 @@ BattleScript_MoveUsedIsConfused:: jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x0, BattleScript_MoveUsedIsConfusedRet BattleScript_DoSelfConfusionDmg:: cancelmultiturnmoves BS_ATTACKER - adjustnormaldamage2 + adjustdamage printstring STRINGID_ITHURTCONFUSION waitmessage 0x40 effectivenesssound diff --git a/include/battle.h b/include/battle.h index 43662b7ccb..74b2e5095b 100644 --- a/include/battle.h +++ b/include/battle.h @@ -215,15 +215,15 @@ struct ProtectStruct struct SpecialStatus { - u8 statLowered:1; // 0x1 - u8 lightningRodRedirected:1; // 0x2 - u8 restoredBankSprite: 1; // 0x4 - u8 intimidatedPoke:1; // 0x8 - u8 traced:1; // 0x10 + u8 statLowered:1; + u8 lightningRodRedirected:1; + u8 restoredBankSprite: 1; + u8 intimidatedPoke:1; + u8 traced:1; u8 flag20:1; u8 flag40:1; u8 focusBanded:1; - u8 field1[3]; + u8 focusSashed:1; s32 dmg; s32 physicalDmg; s32 specialDmg; @@ -563,6 +563,8 @@ struct BattleStruct u8 field_2A1; u8 field_2A2; u8 debugBattler; + u8 magnitudeBasePower; + u8 presentBasePower; }; #define GET_MOVE_TYPE(move, typeArg) \ @@ -576,6 +578,7 @@ struct BattleStruct #define IS_MOVE_PHYSICAL(moveType)(moveType < TYPE_MYSTERY) #define IS_MOVE_SPECIAL(moveType)(moveType > TYPE_MYSTERY) +#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)) @@ -759,7 +762,7 @@ 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; diff --git a/include/battle_main.h b/include/battle_main.h index 27e61c8fc2..31768e844a 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -65,6 +65,7 @@ void BattleTurnPassed(void); u8 IsRunningFromBattleImpossible(void); void sub_803BDA0(u8 battlerId); void SwapTurnOrder(u8 id1, u8 id2); +u32 GetBattlerTotalSpeedStat(u8 battlerId); u8 GetWhoStrikesFirst(u8 battlerId1, u8 battlerId2, bool8 ignoreChosenMoves); void RunBattleScriptCommands_PopCallbacksStack(void); void RunBattleScriptCommands(void); diff --git a/include/battle_util.h b/include/battle_util.h index 04ccced1b3..fedfcba77d 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -79,6 +79,7 @@ bool32 IsMoveMakingContact(u16 move, u8 battlerAtk); bool32 IsBattlerGrounded(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); +s32 CalculateMoveDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, s32 fixedBasePower, bool32 isCrit, bool32 randomFactor); +u16 CalcTypeEffectivenessMultiplier(u16 move, u8 moveType, u8 battlerAtk, u8 battlerDef, bool32 recordAbilities); #endif // GUARD_BATTLE_UTIL_H diff --git a/include/constants/battle.h b/include/constants/battle.h index 31cdbb6cee..80ed2b7e23 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -151,6 +151,8 @@ #define STATUS3_SMACKED_DOWN 0x200000 #define STATUS3_ME_FIRST 0x400000 #define STATUS3_TELEKINESIS 0x800000 +#define STATUS3_UNBURDEN 0x1000000 +#define STATUS3_MIRACLE_EYED 0x2000000 #define STATUS3_SEMI_INVULNERABLE (STATUS3_UNDERGROUND | STATUS3_ON_AIR | STATUS3_UNDERWATER) // Not really sure what a "hitmarker" is. @@ -190,6 +192,8 @@ #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) // Field affecting statuses. #define STATUS_FIELD_MAGIC_ROOM 0x1 diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index 60c65e0394..e788e71472 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -96,9 +96,16 @@ #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 // Gen5 hold effects #define HOLD_EFFECT_FLOAT_STONE 115 +#define HOLD_EFFECT_WISE_GLASSES 116 +#define HOLD_EFFECT_EVIOLITE 117 +#define HOLD_EFFECT_ASSAULT_VEST 118 // Gen6 hold effects #define HOLD_EFFECT_FAIRY_POWER 130 diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 821ad3e5b9..b176964bc4 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -86,6 +86,15 @@ #define FLAG_MIRROR_MOVE_AFFECTED 0x10 #define FLAG_KINGSROCK_AFFECTED 0x20 #define FLAG_HIGH_CRIT 0x40 +#define FLAG_RECKLESS_BOOST 0x80 +#define FLAG_IRON_FIST_BOOST 0x100 +#define FLAG_SHEER_FORCE_BOOST 0x200 +#define FLAG_STRONG_JAW_BOOST 0x400 +#define FLAG_MEGA_LAUNCHER_BOOST 0x800 +#define FLAG_STAT_STAGES_IGNORED 0x1000 +#define FLAG_DMG_MINIMIZE 0x2000 +#define FLAG_DMG_UNDERGROUND 0x4000 +#define FLAG_DMG_UNDERWATER 0x8000 // Split defines. #define SPLIT_PHYSICAL 0x0 diff --git a/include/constants/species.h b/include/constants/species.h index f698ada14a..115ea03577 100644 --- a/include/constants/species.h +++ b/include/constants/species.h @@ -447,4 +447,10 @@ #define NUM_SPECIES SPECIES_EGG +// Todo +#define SPECIES_DIALGA 0 +#define SPECIES_PALKIA 0 +#define SPECIES_GIRATINA 0 +#define SPECIES_CHERRIM 0 + #endif // GUARD_CONSTANTS_SPECIES_H diff --git a/include/global.h b/include/global.h index 7153ef2606..0d5dfb8b72 100644 --- a/include/global.h +++ b/include/global.h @@ -34,6 +34,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) * 256)) @@ -43,10 +44,15 @@ // 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 PARTY_SIZE 6 #define POKEMON_SLOTS_NUMBER 412 diff --git a/include/pokemon.h b/include/pokemon.h index f7166a60f3..16829bdb58 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -363,7 +363,7 @@ struct BattleMove u8 secondaryEffectChance; u8 target; s8 priority; - u8 flags; + u32 flags; u8 split; }; diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 850dbf0301..f4eca8c8e4 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -1180,7 +1180,6 @@ static void BattleAICmd_get_how_powerful_move_is(void) gDynamicBasePower = 0; *(&gBattleStruct->dynamicMoveType) = 0; gMoveResultFlags = 0; - gCritMultiplier = 1; for (checkedMove = 0; checkedMove < 4; checkedMove++) { @@ -1460,7 +1459,7 @@ static void BattleAICmd_get_highest_type_effectiveness(void) dynamicMoveType = &gBattleStruct->dynamicMoveType; *dynamicMoveType = 0; gMoveResultFlags = 0; - gCritMultiplier = 1; + gIsCriticalHit = 1; AI_THINKING_STRUCT->funcResult = 0; for (i = 0; i < 4; i++) @@ -1499,7 +1498,7 @@ static void BattleAICmd_if_type_effectiveness(void) gDynamicBasePower = 0; gBattleStruct->dynamicMoveType = 0; gMoveResultFlags = 0; - gCritMultiplier = 1; + gIsCriticalHit = 1; gBattleMoveDamage = AI_EFFECTIVENESS_x1; gCurrentMove = AI_THINKING_STRUCT->moveConsidered; @@ -1710,7 +1709,7 @@ static void BattleAICmd_if_can_faint(void) gDynamicBasePower = 0; gBattleStruct->dynamicMoveType = 0; gMoveResultFlags = 0; - gCritMultiplier = 1; + gIsCriticalHit = 1; gCurrentMove = AI_THINKING_STRUCT->moveConsidered; AI_CalcDmg(sBattler_AI, gBattlerTarget); TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget); @@ -1738,7 +1737,7 @@ static void BattleAICmd_if_cant_faint(void) gDynamicBasePower = 0; gBattleStruct->dynamicMoveType = 0; gMoveResultFlags = 0; - gCritMultiplier = 1; + gIsCriticalHit = 1; gCurrentMove = AI_THINKING_STRUCT->moveConsidered; AI_CalcDmg(sBattler_AI, gBattlerTarget); TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget); diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 559323ee75..f4d1672756 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -736,7 +736,6 @@ u8 GetMostSuitableMonToSwitchInto(void) gDynamicBasePower = 0; gBattleStruct->dynamicMoveType = 0; gMoveResultFlags = 0; - gCritMultiplier = 1; bestDmg = 0; bestMonId = 6; diff --git a/src/battle_main.c b/src/battle_main.c index 4bc5b6eb05..2a7e016e9c 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -231,7 +231,7 @@ 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; @@ -4615,99 +4615,80 @@ void SwapTurnOrder(u8 id1, u8 id2) 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; + + // 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 (holdEffect == HOLD_EFFECT_MACHO_BRACE) + 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 (gStatuses3[battlerId] & STATUS3_UNBURDEN) + speed *= 2; + + // paralysis drop + if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS && ability != ABILITY_QUICK_FEET) + speed /= 4; + + return speed; +} + 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; - 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; - - 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; - } - - 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 = GetBattlerTotalSpeedStat(battler1); + if (GetBattlerHoldEffect(battler1, TRUE) == HOLD_EFFECT_QUICK_CLAW + && gRandomTurnNumber < (0xFFFF * GetBattlerHoldEffectParam(battler1)) / 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 = GetBattlerTotalSpeedStat(battler2); + if (GetBattlerHoldEffect(battler2, TRUE) == HOLD_EFFECT_QUICK_CLAW + && gRandomTurnNumber < (0xFFFF * GetBattlerHoldEffectParam(battler2)) / 100) speedBattler2 = UINT_MAX; if (ignoreChosenMoves) @@ -5295,7 +5276,7 @@ static void HandleAction_UseMove(void) return; } - gCritMultiplier = 1; + gIsCriticalHit = FALSE; gBattleStruct->atkCancellerTracker = 0; gMoveResultFlags = 0; gMultiHitCounter = 0; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 915fe59d67..b8acec8a59 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -97,8 +97,8 @@ static void atk03_ppreduce(void); static void atk04_critcalc(void); static void atk05_damagecalc(void); static void atk06_typecalc(void); -static void atk07_adjustnormaldamage(void); -static void atk08_adjustnormaldamage2(void); +static void atk07_adjustdamage(void); +static void atk08_nop(void); static void atk09_attackanimation(void); static void atk0A_waitanimation(void); static void atk0B_healthbarupdate(void); @@ -195,7 +195,7 @@ static void atk65_status2animation(void); static void atk66_chosenstatusanimation(void); static void atk67_yesnobox(void); static void atk68_cancelallactions(void); -static void atk69_adjustsetdamage(void); +static void atk69_nop(void); static void atk6A_removeitem(void); static void atk6B_atknameinbuff1(void); static void atk6C_drawlvlupbox(void); @@ -349,8 +349,8 @@ void (* const gBattleScriptingCommandsTable[])(void) = atk04_critcalc, atk05_damagecalc, atk06_typecalc, - atk07_adjustnormaldamage, - atk08_adjustnormaldamage2, + atk07_adjustdamage, + atk08_nop, atk09_attackanimation, atk0A_waitanimation, atk0B_healthbarupdate, @@ -447,7 +447,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atk66_chosenstatusanimation, atk67_yesnobox, atk68_cancelallactions, - atk69_adjustsetdamage, + atk69_nop, atk6A_removeitem, atk6B_atknameinbuff1, atk6C_drawlvlupbox, @@ -1273,9 +1273,9 @@ static void atk04_critcalc(void) && !(gStatuses3[gBattlerAttacker] & STATUS3_CANT_SCORE_A_CRIT) && !(gBattleTypeFlags & (BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_FIRST_BATTLE)) && !(Random() % sCriticalHitChance[critChance])) - gCritMultiplier = 2; + gIsCriticalHit = TRUE; else - gCritMultiplier = 1; + gIsCriticalHit = FALSE; gBattlescriptCurrInstr++; } @@ -1285,7 +1285,7 @@ static void atk05_damagecalc(void) u8 moveType; GET_MOVE_TYPE(gCurrentMove, moveType); - gBattleMoveDamage = CalculateMoveDamage(gCurrentMove, gBattlerAttacker, gBattlerTarget, moveType, 0, gCritMultiplier); + gBattleMoveDamage = CalculateMoveDamage(gCurrentMove, gBattlerAttacker, gBattlerTarget, moveType, 0, gIsCriticalHit, TRUE); gBattlescriptCurrInstr++; } @@ -1610,120 +1610,60 @@ u8 AI_TypeCalc(u16 move, u16 targetSpecies, u8 targetAbility) 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 atk07_adjustnormaldamage(void) +static void atk07_adjustdamage(void) { u8 holdEffect, param; - ApplyRandomDmgMultiplier(); - + holdEffect = GetBattlerHoldEffect(gBattlerTarget, TRUE); 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 (gBattleMons[gBattlerTarget].status2 & STATUS2_SUBSTITUTE) + goto END; + if (gBattleMons[gBattlerTarget].hp > gBattleMoveDamage) + goto END; + if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < param) { RecordItemEffectBattle(gBattlerTarget, holdEffect); gSpecialStatuses[gBattlerTarget].focusBanded = 1; } - if (gBattleMons[gBattlerTarget].status2 & STATUS2_SUBSTITUTE) - goto END; - if (gBattleMoves[gCurrentMove].effect != EFFECT_FALSE_SWIPE && !gProtectStructs[gBattlerTarget].endured - && !gSpecialStatuses[gBattlerTarget].focusBanded) - goto END; - - if (gBattleMons[gBattlerTarget].hp > gBattleMoveDamage) - goto END; - - 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; - } - - END: - gBattlescriptCurrInstr++; -} - -static void atk08_adjustnormaldamage2(void) // The same as 0x7 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) - goto END; - if (!gProtectStructs[gBattlerTarget].endured && !gSpecialStatuses[gBattlerTarget].focusBanded) - goto END; - if (gBattleMons[gBattlerTarget].hp > gBattleMoveDamage) + + if (gBattleMoves[gCurrentMove].effect != EFFECT_FALSE_SWIPE + && !gProtectStructs[gBattlerTarget].endured + && !gSpecialStatuses[gBattlerTarget].focusBanded + && !gSpecialStatuses[gBattlerTarget].focusSashed) 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) + else if (gSpecialStatuses[gBattlerTarget].focusBanded || gSpecialStatuses[gBattlerTarget].focusSashed) { gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON; gLastUsedItem = gBattleMons[gBattlerTarget].item; } - END: - gBattlescriptCurrInstr++; +END: + gBattlescriptCurrInstr++; +} + +static void atk08_nop(void) +{ + } static void atk09_attackanimation(void) @@ -1952,7 +1892,7 @@ static void atk0D_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; @@ -3865,7 +3805,7 @@ static void atk24(void) static void MoveValuesCleanUp(void) { gMoveResultFlags = 0; - gCritMultiplier = 1; + gIsCriticalHit = FALSE; gBattleCommunication[MOVE_EFFECT_BYTE] = 0; gBattleCommunication[6] = 0; gHitMarker &= ~(HITMARKER_DESTINYBOND); @@ -6100,56 +6040,14 @@ static void atk68_cancelallactions(void) gBattlescriptCurrInstr++; } -static void atk69_adjustsetdamage(void) // The same as 0x7, except there's no random damage multiplier. +static void atk69_nop(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); - } - - gPotentialItemEffectBattler = gBattlerTarget; - - if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < param) - { - RecordItemEffectBattle(gBattlerTarget, holdEffect); - gSpecialStatuses[gBattlerTarget].focusBanded = 1; - } - if (gBattleMons[gBattlerTarget].status2 & STATUS2_SUBSTITUTE) - goto END; - if (gBattleMoves[gCurrentMove].effect != EFFECT_FALSE_SWIPE && !gProtectStructs[gBattlerTarget].endured - && !gSpecialStatuses[gBattlerTarget].focusBanded) - goto END; - - if (gBattleMons[gBattlerTarget].hp > gBattleMoveDamage) - goto END; - - 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; - } - - END: - gBattlescriptCurrInstr++; + gBattlescriptCurrInstr++; } static void atk6A_removeitem(void) { - u16* usedHeldItem; + u16 *usedHeldItem; gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); diff --git a/src/battle_tv.c b/src/battle_tv.c index 783ecc95dd..2bad9ff4bc 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -1430,14 +1430,7 @@ static void TrySetBattleSeminarShow(void) { u8 moveResultFlags; u16 sideStatus = gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)]; - gBattleMoveDamage = CalculateMoveDamage(gCurrentMove, gBattlerAttacker, gBattlerTarget, gBattleMoves[gCurrentMove].type, powerOverride, FALSE); - - 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); dmgByMove[i] = gBattleMoveDamage; if (dmgByMove[i] == 0 && !(moveResultFlags & MOVE_RESULT_NO_EFFECT)) dmgByMove[i] = 1; diff --git a/src/battle_util.c b/src/battle_util.c index d5abd6d255..cf88d168d8 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1,5 +1,6 @@ #include "global.h" #include "battle.h" +#include "battle_interface.h" #include "constants/battle_script_commands.h" #include "constants/abilities.h" #include "constants/moves.h" @@ -148,6 +149,141 @@ static const u8 sHoldEffectToType[][2] = {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 + +}; + +#undef X + // code u8 GetBattlerForBattleScript(u8 caseId) { @@ -1552,7 +1688,7 @@ u8 AtkCanceller_UnableToUseMove(void) { gBattleCommunication[MULTISTRING_CHOOSER] = 1; gBattlerTarget = gBattlerAttacker; - gBattleMoveDamage = CalculateMoveDamage(MOVE_NONE, gBattlerAttacker, gBattlerAttacker, TYPE_MYSTERY, 40, FALSE); + gBattleMoveDamage = CalculateMoveDamage(MOVE_NONE, gBattlerAttacker, gBattlerAttacker, TYPE_MYSTERY, 40, FALSE, FALSE); gProtectStructs[gBattlerAttacker].confusionSelfDmg = 1; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; } @@ -3472,7 +3608,7 @@ u8 IsMonDisobedient(void) calc -= obedienceLevel; if (calc < obedienceLevel) { - gBattleMoveDamage = CalculateMoveDamage(MOVE_NONE, gBattlerAttacker, gBattlerAttacker, TYPE_MYSTERY, 40, FALSE); + gBattleMoveDamage = CalculateMoveDamage(MOVE_NONE, gBattlerAttacker, gBattlerAttacker, TYPE_MYSTERY, 40, FALSE, FALSE); gBattlerTarget = gBattlerAttacker; gBattlescriptCurrInstr = BattleScript_82DB6F0; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; @@ -3654,7 +3790,932 @@ u32 GetMoveTargetCount(u16 move, u8 battlerAtk, u8 battlerDef) } } -s32 CalculateMoveDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, s32 fixedBasePower, bool32 isCrit) +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 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 + 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].rolloutCounter1); 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 (gCurrentActionFuncId == B_ACTION_SWITCH) + basePower *= 2; + break; + case EFFECT_NATURAL_GIFT: + // todo + break; + case EFFECT_WAKE_UP_SLAP: + if (gBattleMons[battlerDef].status1 & STATUS1_SLEEP) + 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) + basePower *= 2; + break; + case EFFECT_ASSURANCE: + if (gSpecialStatuses[battlerDef].physicalDmg != 0 || gSpecialStatuses[battlerDef].specialDmg != 0) + basePower *= 2; + break; + case EFFECT_TRUMP_CARD: + i = GetBattleMonMoveSlot(&gBattleMons[battlerAtk], move); + if (i != 4) + { + switch (gBattleMons[battlerAtk].pp[i]) + { + case 0: + basePower = 200; + break; + case 1: + basePower = 80; + break; + case 2: + basePower = 60; + break; + case 3: + basePower = 50; + break; + default: + basePower = 40; + break; + } + } + break; + case EFFECT_ACROBATICS: + if (gBattleMons[battlerAtk].item == ITEM_NONE) + 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 >= 5) + basePower = 120; + else if (weight == 4) + basePower = 100; + else if (weight == 3) + basePower = 80; + else if (weight == 2) + basePower = 60; + else + basePower = 40; + break; + case EFFECT_PUNISHMENT: + basePower = 60 + (CountBattlerStatIncreases(battlerAtk, FALSE) * 20); + if (basePower > 200) + basePower = 200; + break; + case EFFECT_STORED_POWER: + basePower = 60 + (CountBattlerStatIncreases(battlerAtk, TRUE) * 20); + break; + case EFFECT_ELECTRO_BALL: + speed = GetBattlerTotalSpeedStat(battlerAtk) / GetBattlerTotalSpeedStat(battlerDef); + if (speed >= ARRAY_COUNT(sSpeedDiffToDmgTable)) + speed = ARRAY_COUNT(sSpeedDiffToDmgTable) - 1; + basePower = sSpeedDiffToDmgTable[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)) + basePower *= 2; + break; + case EFFECT_GUST: + case EFFECT_TWISTER: + if (gStatuses3[battlerDef] & STATUS3_ON_AIR) + basePower *= 2; + break; + case EFFECT_ROUND: + if (gChosenMoveByBattler[BATTLE_PARTNER(battlerAtk)] == MOVE_ROUND && !(gAbsentBattlerFlags & gBitTable[BATTLE_PARTNER(battlerAtk)])) + basePower *= 2; + break; + } + + if (basePower == 0) + basePower = 1; + return basePower; +} + +static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType) +{ + u32 i; + 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; + } + + // field abilities + if ((ABILITY_ON_FIELD(ABILITY_DARK_AURA) && moveType == TYPE_DARK) + || (ABILITY_ON_FIELD(ABILITY_FAIRY_AURA) && moveType == TYPE_FAIRY)) + { + if (ABILITY_ON_FIELD(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 + switch (GetBattlerAbility(battlerDef)) + { + case ABILITY_HEATPROOF: + case ABILITY_WATER_BUBBLE: + if (moveType == TYPE_FIRE) + MulModifier(&modifier, UQ_4_12(0.5)); + 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 (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_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[battlerAtk].hp <= (gBattleMons[battlerAtk].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_BULLDOZE: + case EFFECT_MAGNITUDE: + case EFFECT_EARTHQUAKE: + if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && IsBattlerGrounded(battlerDef)) + 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)) + MulModifier(&modifier, UQ_4_12(1.5)); + if (gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN && moveType == TYPE_DRAGON && IsBattlerGrounded(battlerDef)) + MulModifier(&modifier, UQ_4_12(0.5)); + if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && moveType == TYPE_ELECTRIC && IsBattlerGrounded(battlerAtk)) + MulModifier(&modifier, UQ_4_12(1.5)); + if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN && moveType == TYPE_PSYCHIC && IsBattlerGrounded(battlerAtk)) + MulModifier(&modifier, UQ_4_12(1.5)); + + return ApplyModifier(modifier, basePower); +} + +static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, bool32 isCrit) +{ + u8 atkStage; + u32 atkStat; + u16 modifier; + + if (gBattleMoves[move].effect == EFFECT_FOUL_PLAY) + { + if (IS_MOVE_PHYSICAL(move)) + atkStat = gBattleMons[battlerDef].attack; + else + atkStat = gBattleMons[battlerDef].spAttack; + + atkStage = gBattleMons[battlerDef].statStages[STAT_ATK]; + } + else + { + if (IS_MOVE_PHYSICAL(move)) + atkStat = gBattleMons[battlerAtk].attack; + else + atkStat = gBattleMons[battlerAtk].spAttack; + + atkStage = gBattleMons[battlerAtk].statStages[STAT_ATK]; + } + + // 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] & UNKNOWN_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; + } + + // target's abilities + switch (GetBattlerAbility(battlerDef)) + { + case ABILITY_THICK_FAT: + if (moveType == TYPE_FIRE || moveType == TYPE_ICE) + MulModifier(&modifier, UQ_4_12(0.5)); + 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 u32 CalcDefenseStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, bool32 isCrit) +{ + 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)); + break; + case ABILITY_FUR_COAT: + if (usesDefStat) + MulModifier(&modifier, UQ_4_12(2.0)); + break; + case ABILITY_GRASS_PELT: + if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && usesDefStat) + MulModifier(&modifier, UQ_4_12(1.5)); + 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: + // todo + break; + case HOLD_EFFECT_ASSAULT_VEST: + if (!usesDefStat) + MulModifier(&modifier, UQ_4_12(1.5)); + break; + } + + return ApplyModifier(modifier, defStat); +} + +static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, u16 typeEffectivenessModifier, bool32 isCrit) +{ + 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(UQ_4_12(1.5), dmg); + + // check burn + if (gBattleMons[battlerAtk].status1 & STATUS1_BURN && 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)) + { + 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; + } + + // target's abilities + switch (abilityDef) + { + case ABILITY_MULTISCALE: + 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: + // todo + 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 + } + + 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)); + + 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) +{ + s32 dmg; + u16 finalModifier, typeEffectivenessModifier; + + typeEffectivenessModifier = CalcTypeEffectivenessMultiplier(move, moveType, battlerAtk, battlerDef, randomFactor); + + // 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); + + // long dmg basic formula + dmg = ((gBattleMons[battlerAtk].level * 2) / 5) + 2; + dmg *= gBattleMovePower; + dmg *= CalcAttackStat(move, battlerAtk, battlerDef, moveType, isCrit); + dmg /= CalcDefenseStat(move, battlerAtk, battlerDef, moveType, isCrit); + dmg = (dmg / 50) + 2; + + // Calculate final modifiers. + dmg = CalcFinalDmg(dmg, move, battlerAtk, battlerDef, moveType, typeEffectivenessModifier, isCrit); + + // Add a random factor. + if (randomFactor) + { + dmg *= 100 - (Random() % 16); + dmg /= 100; + } + + if (dmg == 0) + dmg = 1; + + return dmg; +} + +static inline void MulByTypeEffectiveness(u16 *modifier, u16 move, u8 moveType, u8 battlerDef, u8 defType) +{ + u16 mod = sTypeEffectivenessTable[moveType][defType]; + + if ((moveType == TYPE_FIGHTING || moveType == TYPE_NORMAL) && defType == TYPE_GHOST && gBattleMons[battlerDef].status2 & STATUS2_FORESIGHT) + mod = UQ_4_12(1.0); + if (moveType == TYPE_PSYCHIC && defType == TYPE_DARK && gStatuses3[battlerDef] & STATUS3_MIRACLE_EYED) + mod = UQ_4_12(1.0); + if (move == MOVE_FREEZE_DRY && defType == TYPE_WATER) + mod = UQ_4_12(2.0); + + MulModifier(modifier, mod); +} + +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) + { + MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, gBattleMons[battlerDef].type1); + if (gBattleMons[battlerDef].type2 != gBattleMons[battlerDef].type1) + MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, gBattleMons[battlerDef].type2); + + 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] = moveType; + 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); + } + } + } + + 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); + } + + return modifier; } From 9c7db9f45e43732342ad72a8110bb8439c96f790 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 15 Jul 2018 12:39:07 +0200 Subject: [PATCH 014/667] New AI damage and type functions --- asm/battle_frontier_1.s | 6 +- include/battle_ai_script_commands.h | 3 + include/battle_script_commands.h | 3 - include/battle_util.h | 2 + src/battle_ai_script_commands.c | 140 +++++++++------- src/battle_ai_switch_items.c | 112 +++++-------- src/battle_script_commands.c | 238 +--------------------------- src/battle_util.c | 70 +++++--- 8 files changed, 185 insertions(+), 389 deletions(-) diff --git a/asm/battle_frontier_1.s b/asm/battle_frontier_1.s index 522c5d5f5e..561bd26517 100644 --- a/asm/battle_frontier_1.s +++ b/asm/battle_frontier_1.s @@ -10109,9 +10109,9 @@ _08194074: lsls r0, r4, 1 add r0, r10 ldrh r0, [r0] - bl AI_TypeCalc - lsls r0, 24 - lsrs r5, r0, 24 + bl CalcPartyMonTypeEffectivenessMultiplier + ldr r5, =gMoveResultFlags + ldrb r5, [r5] movs r0, 0x6 ands r0, r5 cmp r0, 0x6 diff --git a/include/battle_ai_script_commands.h b/include/battle_ai_script_commands.h index d23ad048a5..dbf72a8c20 100644 --- a/include/battle_ai_script_commands.h +++ b/include/battle_ai_script_commands.h @@ -6,6 +6,9 @@ #define AI_CHOICE_FLEE 4 #define AI_CHOICE_WATCH 5 +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_HandleItemUseBeforeAISetup(u8 defaultScoreMoves); void BattleAI_SetupAIData(u8 defaultScoreMoves); u8 BattleAI_ChooseMoveOrAction(void); diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index 142ac1f7b3..83a0a3057a 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -4,9 +4,6 @@ #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); u8 GetBattlerTurnOrderNum(u8 battlerId); void SetMoveEffect(bool8 primary, u8 certain); void BattleDestroyYesNoCursorAt(u8 cursorPosition); diff --git a/include/battle_util.h b/include/battle_util.h index fedfcba77d..35f4546523 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -81,5 +81,7 @@ 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); 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); #endif // GUARD_BATTLE_UTIL_H diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index f4eca8c8e4..f8169e6cfb 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -652,6 +652,21 @@ void ClearBattlerItemEffectHistory(u8 battlerId) BATTLE_HISTORY->itemEffects[battlerId] = 0; } +s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef) +{ + return CalculateMoveDamage(move, battlerAtk, battlerDef, gBattleMoves[move].type, 0, FALSE, FALSE); +} + +s32 AI_CalcPartyMonDamage(u16 move, u8 battlerAtk, u8 battlerDef, struct Pokemon *mon) +{ + return 0; +} + +u16 AI_GetTypeEffectiveness(u16 move, u8 battlerAtk, u8 battlerDef) +{ + return CalcTypeEffectivenessMultiplier(move, gBattleMoves[move].type, battlerAtk, battlerDef, FALSE); +} + static void BattleAICmd_if_random_less_than(void) { u16 random = Random(); @@ -1194,9 +1209,8 @@ static void BattleAICmd_get_how_powerful_move_is(void) && gBattleMoves[gBattleMons[sBattler_AI].moves[checkedMove]].power > 1) { 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; + moveDmgs[checkedMove] = AI_CalcDamage(gCurrentMove, sBattler_AI, gBattlerTarget); + moveDmgs[checkedMove] = moveDmgs[checkedMove] * AI_THINKING_STRUCT->simulatedRNG[checkedMove] / 100; if (moveDmgs[checkedMove] == 0) moveDmgs[checkedMove] = 1; } @@ -1456,32 +1470,39 @@ static void BattleAICmd_get_highest_type_effectiveness(void) u8 *dynamicMoveType; gDynamicBasePower = 0; - dynamicMoveType = &gBattleStruct->dynamicMoveType; - *dynamicMoveType = 0; + gBattleStruct->dynamicMoveType = 0; gMoveResultFlags = 0; - gIsCriticalHit = 1; AI_THINKING_STRUCT->funcResult = 0; for (i = 0; i < 4; 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; @@ -1494,31 +1515,36 @@ static void BattleAICmd_get_highest_type_effectiveness(void) static void BattleAICmd_if_type_effectiveness(void) { u8 damageVar; + u32 effectivenessMultiplier; gDynamicBasePower = 0; gBattleStruct->dynamicMoveType = 0; gMoveResultFlags = 0; - gIsCriticalHit = 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); @@ -1578,7 +1604,7 @@ static void BattleAICmd_if_status_not_in_party(void) u32 statusToCompareTo; u8 battlerId; - switch(gAIScriptPtr[1]) + switch (gAIScriptPtr[1]) { case 1: battlerId = sBattler_AI; @@ -1600,8 +1626,8 @@ static void BattleAICmd_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; } } @@ -1700,6 +1726,8 @@ static void BattleAICmd_if_stat_level_not_equal(void) static void BattleAICmd_if_can_faint(void) { + s32 dmg; + if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power < 2) { gAIScriptPtr += 5; @@ -1709,18 +1737,14 @@ static void BattleAICmd_if_can_faint(void) gDynamicBasePower = 0; gBattleStruct->dynamicMoveType = 0; gMoveResultFlags = 0; - gIsCriticalHit = 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; + dmg = AI_CalcDamage(AI_THINKING_STRUCT->moveConsidered, sBattler_AI, gBattlerTarget); + dmg = dmg * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100; // Moves always do at least 1 damage. - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + if (dmg == 0) + dmg = 1; - if (gBattleMons[gBattlerTarget].hp <= gBattleMoveDamage) + if (gBattleMons[gBattlerTarget].hp <= dmg) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); else gAIScriptPtr += 5; @@ -1728,6 +1752,8 @@ static void BattleAICmd_if_can_faint(void) static void BattleAICmd_if_cant_faint(void) { + s32 dmg; + if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power < 2) { gAIScriptPtr += 5; @@ -1737,16 +1763,14 @@ static void BattleAICmd_if_cant_faint(void) gDynamicBasePower = 0; gBattleStruct->dynamicMoveType = 0; gMoveResultFlags = 0; - gIsCriticalHit = 1; - gCurrentMove = AI_THINKING_STRUCT->moveConsidered; - AI_CalcDmg(sBattler_AI, gBattlerTarget); - TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget); + dmg = AI_CalcDamage(AI_THINKING_STRUCT->moveConsidered, sBattler_AI, gBattlerTarget); + dmg = dmg * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100; - gBattleMoveDamage = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100; + // Moves always do at least 1 damage. + if (dmg == 0) + dmg = 1; - // This macro is missing the damage 0 = 1 assumption. - - if (gBattleMons[gBattlerTarget].hp > gBattleMoveDamage) + if (gBattleMons[gBattlerTarget].hp > dmg) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); else gAIScriptPtr += 5; diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index f4d1672756..babf3004eb 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -1,5 +1,6 @@ #include "global.h" #include "battle.h" +#include "battle_ai_script_commands.h" #include "battle_controllers.h" #include "constants/abilities.h" #include "constants/moves.h" @@ -11,7 +12,7 @@ // 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); static bool8 ShouldSwitchIfPerishSong(void) @@ -33,7 +34,6 @@ static bool8 ShouldSwitchIfWonderGuard(void) { u8 opposingPosition; u8 opposingBattler; - u8 moveFlags; s32 i, j; s32 firstId; s32 lastId; // + 1 @@ -52,12 +52,11 @@ static bool8 ShouldSwitchIfWonderGuard(void) for (opposingBattler = GetBattlerAtPosition(opposingPosition), i = 0; i < 4; 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. @@ -90,22 +89,18 @@ static bool8 ShouldSwitchIfWonderGuard(void) if (i == gBattlerPartyIndexes[gActiveBattler]) continue; - GetMonData(&party[i], MON_DATA_SPECIES); // Unused return value. - GetMonData(&party[i], MON_DATA_ALT_ABILITY); // Unused return value. - for (opposingBattler = GetBattlerAtPosition(opposingPosition), j = 0; j < 4; 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; + } } } } @@ -254,7 +249,6 @@ static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng) u8 opposingPosition; u8 opposingBattler; s32 i; - u8 moveFlags; u16 move; opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(gActiveBattler)); @@ -268,8 +262,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; @@ -291,8 +284,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; @@ -319,7 +311,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; @@ -327,7 +319,6 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent) struct Pokemon *party; s32 i, j; u16 move; - u8 moveFlags; if (gLastLandedMoves[gActiveBattler] == 0) return FALSE; @@ -395,8 +386,8 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent) else monAbility = gBaseStats[species].ability1; - moveFlags = AI_TypeCalc(gLastLandedMoves[gActiveBattler], species, monAbility); - if (moveFlags & flags) + CalcPartyMonTypeEffectivenessMultiplier(gLastLandedMoves[gActiveBattler], species, monAbility); + if (gMoveResultFlags & flags) { battlerIn1 = gLastHitBy[gActiveBattler]; @@ -406,8 +397,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); @@ -598,34 +588,10 @@ 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) -{ - s32 i = 0; - - while (TYPE_EFFECT_ATK_TYPE(i) != TYPE_ENDTABLE) - { - if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT) - { - i += 3; - continue; - } - else if (TYPE_EFFECT_ATK_TYPE(i) == atkType) - { - // 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; - } - i += 3; - } -} - u8 GetMostSuitableMonToSwitchInto(void) { u8 opposingBattler; - u8 bestDmg; // Note : should be changed to u32 for obvious reasons. + u32 bestDmg; u8 bestMonId; u8 battlerIn1, battlerIn2; s32 firstId; @@ -695,11 +661,22 @@ u8 GetMostSuitableMonToSwitchInto(void) && 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); + 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; @@ -718,7 +695,7 @@ u8 GetMostSuitableMonToSwitchInto(void) for (i = 0; i < 4; i++) { move = GetMonData(&party[bestMonId], MON_DATA_MOVE1 + i); - if (move != MOVE_NONE && TypeCalc(move, gActiveBattler, opposingBattler) & MOVE_RESULT_SUPER_EFFECTIVE) + if (move != MOVE_NONE && AI_GetTypeEffectiveness(move, gActiveBattler, opposingBattler) >= UQ_4_12(2.0)) break; } @@ -757,16 +734,15 @@ u8 GetMostSuitableMonToSwitchInto(void) for (j = 0; j < 4; j++) { + s32 dmg = 0; 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); + dmg = AI_CalcPartyMonDamage(move, gActiveBattler, opposingBattler, &party[i]); } - if (bestDmg < gBattleMoveDamage) + if (bestDmg < dmg) { - bestDmg = gBattleMoveDamage; + bestDmg = dmg; bestMonId = i; } } @@ -776,7 +752,7 @@ u8 GetMostSuitableMonToSwitchInto(void) } // TODO: use PokemonItemEffect struct instead of u8 once it's documented. -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_script_commands.c b/src/battle_script_commands.c index b8acec8a59..36aa9ba8af 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1289,112 +1289,12 @@ static void atk05_damagecalc(void) gBattlescriptCurrInstr++; } -void AI_CalcDmg(u8 attacker, u8 defender) -{ - // To modify. -} - -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 atk06_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++; } @@ -1474,142 +1374,6 @@ static void CheckWonderGuardAndLevitate(void) } } -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; -} - static void atk07_adjustdamage(void) { u8 holdEffect, param; diff --git a/src/battle_util.c b/src/battle_util.c index cf88d168d8..7848124881 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4661,6 +4661,29 @@ static inline void MulByTypeEffectiveness(u16 *modifier, u16 move, u8 moveType, 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); + } +} + u16 CalcTypeEffectivenessMultiplier(u16 move, u8 moveType, u8 battlerAtk, u8 battlerDef, bool32 recordAbilities) { u16 modifier = UQ_4_12(1.0); @@ -4697,25 +4720,32 @@ u16 CalcTypeEffectivenessMultiplier(u16 move, u8 moveType, u8 battlerAtk, u8 bat } } - 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); - } - + 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); + if (gBaseStats[speciesDef].type2 != gBaseStats[speciesDef].type1) + MulByTypeEffectiveness(&modifier, move, moveType, 0, gBaseStats[speciesDef].type2); + + 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) +{ + return sTypeEffectivenessTable[atkType][defType]; +} From 967117093da6a27ec5d7bb1f9b8865c0cdbeb744 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 15 Jul 2018 12:51:45 +0200 Subject: [PATCH 015/667] Add type modyfing option to debug --- src/battle_debug.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/battle_debug.c b/src/battle_debug.c index 1f68129644..bddc017f7f 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -76,6 +76,7 @@ enum LIST_ITEM_MOVES, LIST_ITEM_ABILITY, LIST_ITEM_HELD_ITEM, + LIST_ITEM_TYPES, LIST_ITEM_STATS, LIST_ITEM_STAT_STAGES, LIST_ITEM_STATUS1, @@ -158,6 +159,7 @@ 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_EmptyString[] = _(""); @@ -216,6 +218,7 @@ static const struct ListMenuItem sMainListItems[] = {sText_Moves, LIST_ITEM_MOVES}, {sText_Ability, LIST_ITEM_ABILITY}, {sText_HeldItem, LIST_ITEM_HELD_ITEM}, + {sText_Types, LIST_ITEM_TYPES}, {sText_Stats, LIST_ITEM_STATS}, {sText_StatStages, LIST_ITEM_STAT_STAGES}, {sText_Status1, LIST_ITEM_STATUS1}, @@ -429,6 +432,7 @@ static const bool8 sHasChangeableEntries[LIST_ITEM_COUNT] = { [LIST_ITEM_MOVES] = TRUE, [LIST_ITEM_ABILITY] = TRUE, + [LIST_ITEM_TYPES] = TRUE, [LIST_ITEM_HELD_ITEM] = TRUE, [LIST_ITEM_STAT_STAGES] = TRUE, }; @@ -739,6 +743,9 @@ static void CreateSecondaryListMenu(struct BattleDebugMenu *data) case LIST_ITEM_HELD_ITEM: itemsCount = 1; break; + case LIST_ITEM_TYPES: + itemsCount = 2; + break; case LIST_ITEM_MOVES: itemsCount = 4; break; @@ -843,6 +850,16 @@ static void PrintSecondaryEntries(struct BattleDebugMenu *data) printer.currentY = printer.y = sSecondaryListTemplate.upText_Y; AddTextPrinter(&printer, 0, NULL); break; + case LIST_ITEM_TYPES: + for (i = 0; i < 2; 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 < 7; i++) { @@ -1063,6 +1080,14 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) data->modifyArrows.typeOfVal = VAL_U16; data->modifyArrows.currValue = gBattleMons[data->battlerId].item; 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; From 6f484c20ce2bd54918813bce386de97ec8246ff1 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 15 Jul 2018 18:07:01 +0200 Subject: [PATCH 016/667] Final ai damage calc touches --- include/battle.h | 9 +++ include/pokemon.h | 1 + src/battle_ai_script_commands.c | 122 +++++++++++++++++++++++++++++++- src/battle_util2.c | 2 - src/pokemon.c | 81 ++++++++++----------- 5 files changed, 170 insertions(+), 45 deletions(-) diff --git a/include/battle.h b/include/battle.h index 74b2e5095b..07ca708def 100644 --- a/include/battle.h +++ b/include/battle.h @@ -275,6 +275,14 @@ struct WishFutureKnock u8 knockedOffPokes[2]; }; +struct AI_SavedBattleMon +{ + u8 ability; + u16 moves[4]; + u16 heldItem; + u16 species; +}; + struct AI_ThinkingStruct { u8 aiState; @@ -287,6 +295,7 @@ struct AI_ThinkingStruct u8 aiLogicId; u8 filler12[6]; u8 simulatedRNG[4]; + struct AI_SavedBattleMon saved[4]; }; struct UsedMoves diff --git a/include/pokemon.h b/include/pokemon.h index 16829bdb58..5d34106c1f 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -529,6 +529,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/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index f8169e6cfb..c76beafb39 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -11,6 +11,7 @@ #include "constants/battle_move_effects.h" #include "constants/moves.h" #include "util.h" +#include "malloc.h" #include "constants/battle_ai.h" #define AI_ACTION_DONE 0x0001 @@ -624,6 +625,25 @@ static void RecordLastUsedMoveByTarget(void) } } +static bool8 IsBattlerAIControlled(u8 battlerId) +{ + switch (GetBattlerPosition(battlerId)) + { + case B_POSITION_PLAYER_LEFT: + default: + return FALSE; + case B_POSITION_OPPONENT_LEFT: + return TRUE; + case B_POSITION_PLAYER_RIGHT: + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) + return FALSE; + else + return TRUE; + case B_POSITION_OPPONENT_RIGHT: + return TRUE; + } +} + void ClearBattlerMoveHistory(u8 battlerId) { s32 i; @@ -652,19 +672,115 @@ 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)) + { + 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].ability2 == ABILITY_NONE) + gBattleMons[battlerId].ability = gBaseStats[gBattleMons[battlerId].species].ability1; + else + // The ability is unknown. + 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].moves[i] == 0) + gBattleMons[battlerId].moves[i] = 0; + } + } +} + +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]; + } +} + s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef) { - return CalculateMoveDamage(move, battlerAtk, battlerDef, gBattleMoves[move].type, 0, FALSE, FALSE); + s32 dmg; + + SaveBattlerData(battlerAtk); + SaveBattlerData(battlerDef); + + SetBattlerData(battlerAtk); + SetBattlerData(battlerDef); + + dmg = CalculateMoveDamage(move, battlerAtk, battlerDef, gBattleMoves[move].type, 0, FALSE, FALSE); + + RestoreBattlerData(battlerAtk); + RestoreBattlerData(battlerDef); + + return dmg; } s32 AI_CalcPartyMonDamage(u16 move, u8 battlerAtk, u8 battlerDef, struct Pokemon *mon) { - return 0; + 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) { - return CalcTypeEffectivenessMultiplier(move, gBattleMoves[move].type, battlerAtk, battlerDef, FALSE); + u16 typeEffectiveness; + + SaveBattlerData(battlerAtk); + SaveBattlerData(battlerDef); + + SetBattlerData(battlerAtk); + SetBattlerData(battlerDef); + + typeEffectiveness = CalcTypeEffectivenessMultiplier(move, gBattleMoves[move].type, battlerAtk, battlerDef, FALSE); + + RestoreBattlerData(battlerAtk); + RestoreBattlerData(battlerDef); + + return typeEffectiveness; } static void BattleAICmd_if_random_less_than(void) diff --git a/src/battle_util2.c b/src/battle_util2.c index 1d2f1e95b4..a3800ffabd 100644 --- a/src/battle_util2.c +++ b/src/battle_util2.c @@ -17,8 +17,6 @@ extern void sub_81B8FB0(u8, u8); void AllocateBattleResources(void) { - gBattleResources = gBattleResources; // something dumb needed to match - if (gBattleTypeFlags & BATTLE_TYPE_x4000000) sub_81D55D0(); diff --git a/src/pokemon.c b/src/pokemon.c index f3b1b1fb3b..32ac2ea1dc 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -3420,57 +3420,58 @@ void RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex) mon->ppBonuses &= gUnknown_08329D26[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 < 4; 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].altAbility = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ALT_ABILITY, 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].altAbility); - GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, nickname); - StringCopy10(gBattleMons[battlerId].nickname, nickname); - GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_NAME, gBattleMons[battlerId].otName); + 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->isEgg = GetMonData(src, MON_DATA_IS_EGG, NULL); + dst->altAbility = GetMonData(src, MON_DATA_ALT_ABILITY, NULL); + dst->otId = GetMonData(src, MON_DATA_OT_ID, NULL); + dst->type1 = gBaseStats[dst->species].type1; + dst->type2 = gBaseStats[dst->species].type2; + dst->ability = GetAbilityBySpecies(dst->species, dst->altAbility); + GetMonData(src, MON_DATA_NICKNAME, nickname); + StringCopy10(dst->nickname, nickname); + GetMonData(src, MON_DATA_OT_NAME, dst->otName); - hpSwitchout = &gBattleStruct->hpOnSwitchout[GetBattlerSide(battlerId)]; - *hpSwitchout = gBattleMons[battlerId].hp; + for (i = 0; i < BATTLE_STATS_NO; i++) + dst->statStages[i] = 6; - for (i = 0; i < 8; i++) - gBattleMons[battlerId].statStages[i] = 6; + dst->status2 = 0; +} - gBattleMons[battlerId].status2 = 0; +void CopyPlayerPartyMonToBattleData(u8 battlerId, u8 partyIndex) +{ + PokemonToBattleMon(&gPlayerParty[partyIndex], &gBattleMons[battlerId]); + gBattleStruct->hpOnSwitchout[GetBattlerSide(battlerId)] = gBattleMons[battlerId].hp; sub_803FA70(battlerId); ClearTemporarySpeciesSpriteData(battlerId, FALSE); } From 5318cc656afad3972f64d1fb82ad3f880b758a44 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 15 Jul 2018 18:53:43 +0200 Subject: [PATCH 017/667] Add some new battlestrings. --- charmap.txt | 2 + include/battle_message.h | 2 + include/constants/battle_string_ids.h | 54 ++++- src/battle_message.c | 309 +++++++++++++++++++------- 4 files changed, 289 insertions(+), 78 deletions(-) diff --git a/charmap.txt b/charmap.txt index a0d9f7ecf3..02a9651066 100644 --- a/charmap.txt +++ b/charmap.txt @@ -394,6 +394,8 @@ 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 @ indicates the end of a town/city name (before " TOWN" or " CITY") NAME_END = FC 00 diff --git a/include/battle_message.h b/include/battle_message.h index 587ae88a0f..2332f89192 100644 --- a/include/battle_message.h +++ b/include/battle_message.h @@ -57,6 +57,8 @@ #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 // for B_TXT_BUFF1, B_TXT_BUFF2 and B_TXT_BUFF3 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index db9ed59bd8..300ea9e404 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -1,7 +1,7 @@ #ifndef GUARD_CONSTANTS_BATTLE_STRING_IDS_H #define GUARD_CONSTANTS_BATTLE_STRING_IDS_H -#define BATTLESTRINGS_COUNT 369 +#define BATTLESTRINGS_COUNT 420 #define BATTLESTRINGS_ID_ADDER 12 // all battlestrings have its ID + 12, because first 5 are reserved @@ -383,4 +383,56 @@ #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_PROTECTSTEAMFROMPRIORITY 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 + #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_message.c b/src/battle_message.c index 2c0eb56008..996511a396 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -522,7 +522,59 @@ 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 your 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 your\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_LAST_ABILITY}!"); +static const u8 sText_PoisonSpikesScattered[] = _("Poison Spikes were scattered\nall around the foe’s team’s\pfeet!"); +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 your foe’s 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[] =_("Wide Guard protected your 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 bizarra 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} stat changes\nwere removed!"); +static const u8 sText_ProtectsTeamFromPriority[] =_("Quick Guard protected your team!"); +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} recieved {B_LAST_ITEM}\nfrom {B_ATK_NAME_WITH_PREFIX}"); + +const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { sText_Trainer1LoseText, // 12 sText_PkmnGainedEXP, // 13 @@ -893,6 +945,58 @@ const u8 * const gBattleStringsTable[BATTLESTRINGS_COUNT] = gText_PkmnBoxLanettesPCFull, // 378 sText_Trainer1WinText, // 379 sText_Trainer2WinText, // 380 + // new battle strings + sText_EnduredViaSturdy, // 381 + sText_PowerHerbActivation, // 382 + sText_HurtByItem, // 383 + sText_BadlyPoisonedByItem, // 384 + sText_BurnedByItem, // 385 + sText_TargetAbilityActivates, // 386 + sText_GravityIntensified, // 387 + sText_TargetIdentified, // 388 + sText_TargetWokeUp, // 389 + sText_PkmnStoleAndAteItem, // 390 + sText_TailWindBlew, // 391 + sText_PkmnWentBack, // 392 + sText_PkmnCantUseItemsAnymore, // 393 + sText_PkmnFlung, // 394 + sText_PkmnPreventedFromHealing, // 395 + sText_PkmnSwitchedAtkAndDef, // 396 + sText_PkmnsAbilitySuppressed, // 397 + sText_ShieldedFromCriticalHits, // 398 + sText_SwitchedAtkAndSpAtk, // 399 + sText_SwitchedDefAndSpDef, // 400 + sText_PkmnAcquiredAbility, // 401 + sText_PoisonSpikesScattered, // 402 + sText_PkmnSwitchedStatChanges, // 403 + sText_PkmnSurroundedWithVeilOfWater, // 404 + sText_PkmnLevitatedOnElectromagnetism, // 405 + sText_PkmnTwistedDimensions, // 406 + sText_PointedStonesFloat, // 407 + sText_CloakedInMysticalMoonlight, // 408 + sText_TrappedBySwirlingMagma, // 409 + sText_VanishedInstantly, // 410 + sText_ProtectedTeam, // 411 + sText_SharedItsGuard, // 412 + sText_SharedItsPower, // 413 + sText_SwapsDefAndSpDefOfAllPkmn, // 414 + sText_BecameNimble, // 415 + sText_HurledIntoTheAir, // 416 + sText_HeldItemsLoseEffects, // 417 + sText_FellStraightDown, // 418 + sText_TransformedIntoWaterType, // 419 + sText_PkmnAcquiredSimple, // 420 + sText_EmptyString4, // 421 + sText_KindOffer, // 422 + sText_ResetsTargetsStatLevels, // 423 + sText_ProtectsTeamFromPriority, // 424 + sText_AllySwitchPosition, // 425 + sText_RestoreTargetsHealth, // 426 + sText_TookPkmnIntoTheSky, // 427 + sText_FreedFromSkyDrop, // 428 + sText_PostponeTargetMove, // 429 + sText_ReflectTargetsType, // 430 + sText_TransferHeldItem, // 431 }; const u16 gMissStringIds[] = @@ -2298,6 +2402,73 @@ static const u8* TryGetStatusString(u8 *src) StringGetEnd10(text); \ toCpy = text; +static const u8 *BattleStringGetTrainerName(u16 trainerId, u8 *text, u8 multiplierId) +{ + 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_OPPONENT_C00) + { + toCpy = gLinkPlayers[multiplierId ^ 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_x4000000) + { + sub_81D5554(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 *BattleStringGetTrainerClass(u16 trainerId) +{ + const u8 *toCpy; + + if (gBattleTypeFlags & BATTLE_TYPE_SECRET_BASE) + toCpy = gTrainerClassNames[GetSecretBaseTrainerClass()]; + else if (trainerId == TRAINER_OPPONENT_C00) + toCpy = gTrainerClassNames[sub_8068BB0()]; + else if (trainerId == TRAINER_FRONTIER_BRAIN) + toCpy = gTrainerClassNames[GetFrontierBrainTrainerClass()]; + else if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) + toCpy = gTrainerClassNames[GetFrontierOpponentClass(trainerId)]; + else if (gBattleTypeFlags & BATTLE_TYPE_x4000000) + toCpy = gTrainerClassNames[sub_81D5530(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? @@ -2313,6 +2484,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) while (*src != EOS) { + toCpy = NULL; if (*src == PLACEHOLDER_BEGIN) { src++; @@ -2505,58 +2677,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_OPPONENT_C00) - toCpy = gTrainerClassNames[sub_8068BB0()]; - 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_x4000000) - toCpy = gTrainerClassNames[sub_81D5530(gTrainerBattleOpponent_A)]; - else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) - toCpy = gTrainerClassNames[GetEreaderTrainerClassId()]; - else - toCpy = gTrainerClassNames[gTrainers[gTrainerBattleOpponent_A].trainerClass]; + toCpy = BattleStringGetTrainerClass(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_OPPONENT_C00) - { - 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_x4000000) - { - sub_81D5554(text, gTrainerBattleOpponent_A); - toCpy = text; - } - else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) - { - GetEreaderTrainerName(text); - toCpy = text; - } - else - { - toCpy = gTrainers[gTrainerBattleOpponent_A].trainerName; - } + toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_A, text, multiplayerID); break; case B_TXT_1E: // link player name? toCpy = gLinkPlayers[multiplayerID].name; @@ -2608,7 +2732,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) } break; case B_TXT_26: // ? - HANDLE_NICKNAME_STRING_CASE(gBattleScripting.battler, *(&gBattleStruct->field_52)) + HANDLE_NICKNAME_STRING_CASE(gBattleScripting.battler, *(&gBattleStruct->field_52)); break; case B_TXT_PC_CREATOR_NAME: // lanette pc if (FlagGet(FLAG_SYS_PC_LANETTE)) @@ -2653,28 +2777,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_x4000000) - toCpy = gTrainerClassNames[sub_81D5530(gTrainerBattleOpponent_B)]; - else - toCpy = gTrainerClassNames[gTrainers[gTrainerBattleOpponent_B].trainerClass]; + toCpy = BattleStringGetTrainerClass(gTrainerBattleOpponent_B); break; case B_TXT_TRAINER2_NAME: - if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) - { - GetFrontierTrainerName(text, gTrainerBattleOpponent_B); - toCpy = text; - } - else if (gBattleTypeFlags & BATTLE_TYPE_x4000000) - { - sub_81D5554(text, gTrainerBattleOpponent_B); - toCpy = text; - } - else - { - toCpy = gTrainers[gTrainerBattleOpponent_B].trainerName; - } + toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_B, text, multiplayerID); break; case B_TXT_TRAINER2_LOSE_TEXT: if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) @@ -2711,15 +2817,64 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) GetFrontierTrainerName(text, gPartnerTrainerId); toCpy = text; break; + case B_TXT_ATK_TRAINER_NAME: + switch (GetBattlerPosition(gBattlerAttacker)) + { + case B_POSITION_PLAYER_LEFT: + toCpy = gSaveBlock2Ptr->playerName; + break; + case B_POSITION_PLAYER_RIGHT: + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) + { + GetFrontierTrainerName(text, gPartnerTrainerId); + toCpy = text; + } + else + { + toCpy = gSaveBlock2Ptr->playerName; + } + break; + case B_POSITION_OPPONENT_LEFT: + toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_A, text, multiplayerID); + break; + case B_POSITION_OPPONENT_RIGHT: + if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_B, text, multiplayerID); + else + toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_A, text, multiplayerID); + break; + } + 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 = BattleStringGetTrainerClass(gTrainerBattleOpponent_A); + break; + case B_POSITION_OPPONENT_RIGHT: + if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + toCpy = BattleStringGetTrainerClass(gTrainerBattleOpponent_B); + else + toCpy = BattleStringGetTrainerClass(gTrainerBattleOpponent_A); + break; + } + 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) { From f250436db011f9664ae6f20292a898473bee80df Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 16 Jul 2018 21:04:56 +0200 Subject: [PATCH 018/667] Working physical special split --- include/battle.h | 4 ++-- src/battle_script_commands.c | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/battle.h b/include/battle.h index 07ca708def..8d8647144e 100644 --- a/include/battle.h +++ b/include/battle.h @@ -584,8 +584,8 @@ struct BattleStruct typeArg = gBattleMoves[move].type; \ } -#define IS_MOVE_PHYSICAL(moveType)(moveType < TYPE_MYSTERY) -#define IS_MOVE_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)) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 36aa9ba8af..9123a3732a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1151,7 +1151,7 @@ static void atk01_accuracycheck(void) 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_MOVE_PHYSICAL(type)) + if (gBattleMons[gBattlerAttacker].ability == ABILITY_HUSTLE && IS_MOVE_PHYSICAL(move)) calc = (calc * 80) / 100; // 1.2 hustle loss if (gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY) @@ -1607,7 +1607,7 @@ static void atk0C_datahpupdate(void) if (!gSpecialStatuses[gActiveBattler].dmg && !(gHitMarker & HITMARKER_x100000)) gSpecialStatuses[gActiveBattler].dmg = gHpDealt; - if (IS_MOVE_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; @@ -1622,7 +1622,7 @@ static void atk0C_datahpupdate(void) gSpecialStatuses[gActiveBattler].physicalBattlerId = gBattlerTarget; } } - else if (!IS_MOVE_PHYSICAL(moveType) && !(gHitMarker & HITMARKER_x100000)) + else if (!IS_MOVE_PHYSICAL(gCurrentMove) && !(gHitMarker & HITMARKER_x100000)) { gProtectStructs[gActiveBattler].specialDmg = gHpDealt; gSpecialStatuses[gActiveBattler].specialDmg = gHpDealt; From 0852cba111a3b660f26e679ce9edfb11083e4dbf Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 16 Jul 2018 21:42:03 +0200 Subject: [PATCH 019/667] Fix dynamic move power moves, get rid of gDynamicBasePower' ' --- asm/macros/battle_script.inc | 8 +-- data/battle_scripts_1.s | 19 ++---- include/battle.h | 1 - src/battle_ai_script_commands.c | 5 -- src/battle_ai_switch_items.c | 1 - src/battle_main.c | 9 +-- src/battle_script_commands.c | 106 ++++++++++++-------------------- 7 files changed, 49 insertions(+), 100 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index df8bb78d3d..1b3cd28a82 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -892,7 +892,7 @@ .4byte \param0 .endm - .macro rolloutdamagecalculation + .macro handlerollout .byte 0xb3 .endm @@ -902,11 +902,11 @@ .4byte \param1 .endm - .macro furycuttercalc + .macro handlefurycutter .byte 0xb5 .endm - .macro happinesstodamagecalculation + .macro nop_B6 .byte 0xb6 .endm @@ -1066,7 +1066,7 @@ .4byte \param0 .endm - .macro scaledamagebyhealthratio + .macro nop_D9 .byte 0xd9 .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index cd6244d36a..65e3c060ee 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -258,6 +258,9 @@ BattleScript_EffectLowKick: BattleScript_EffectFlail: BattleScript_EffectFacade: BattleScript_EffectRevenge: +BattleScript_EffectReturn: +BattleScript_EffectFrustration: +BattleScript_EffectEruption: jumpifnotmove MOVE_SURF, BattleScript_HitFromAtkCanceler jumpifnostatus3 BS_TARGET, STATUS3_UNDERWATER, BattleScript_HitFromAtkCanceler orword gHitMarker, HITMARKER_IGNORE_UNDERWATER @@ -1417,7 +1420,6 @@ BattleScript_DoTripleKickAttack:: movevaluescleanup addbyte sTRIPLE_KICK_POWER, 10 addbyte sMULTIHIT_STRING + 4, 0x1 - copyhword gDynamicBasePower, sTRIPLE_KICK_POWER critcalc damagecalc adjustdamage @@ -1622,7 +1624,7 @@ BattleScript_RolloutCheckAccuracy:: accuracycheck BattleScript_RolloutHit, ACC_CURR_MOVE BattleScript_RolloutHit:: typecalc2 - rolloutdamagecalculation + handlerollout goto BattleScript_HitFromCritCalc BattleScript_EffectSwagger:: @@ -1654,7 +1656,7 @@ BattleScript_EffectFuryCutter:: ppreduce accuracycheck BattleScript_FuryCutterHit, ACC_CURR_MOVE BattleScript_FuryCutterHit:: - furycuttercalc + handlefurycutter critcalc damagecalc jumpifmovehadnoeffect BattleScript_FuryCutterHit @@ -1673,13 +1675,6 @@ BattleScript_EffectAttract:: waitmessage 0x40 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 @@ -2483,10 +2478,6 @@ BattleScript_EffectEndeavor:: adjustdamage goto BattleScript_HitFromAtkAnimation -BattleScript_EffectEruption:: - scaledamagebyhealthratio - goto BattleScript_EffectHit - BattleScript_EffectSkillSwap:: attackcanceler attackstring diff --git a/include/battle.h b/include/battle.h index 8d8647144e..e32a5e8274 100644 --- a/include/battle.h +++ b/include/battle.h @@ -805,7 +805,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; diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index c76beafb39..ae9ba92de6 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -1308,7 +1308,6 @@ static void BattleAICmd_get_how_powerful_move_is(void) if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power > 1 && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF) { - gDynamicBasePower = 0; *(&gBattleStruct->dynamicMoveType) = 0; gMoveResultFlags = 0; @@ -1585,7 +1584,6 @@ static void BattleAICmd_get_highest_type_effectiveness(void) s32 i; u8 *dynamicMoveType; - gDynamicBasePower = 0; gBattleStruct->dynamicMoveType = 0; gMoveResultFlags = 0; AI_THINKING_STRUCT->funcResult = 0; @@ -1633,7 +1631,6 @@ static void BattleAICmd_if_type_effectiveness(void) u8 damageVar; u32 effectivenessMultiplier; - gDynamicBasePower = 0; gBattleStruct->dynamicMoveType = 0; gMoveResultFlags = 0; gCurrentMove = AI_THINKING_STRUCT->moveConsidered; @@ -1850,7 +1847,6 @@ static void BattleAICmd_if_can_faint(void) return; } - gDynamicBasePower = 0; gBattleStruct->dynamicMoveType = 0; gMoveResultFlags = 0; dmg = AI_CalcDamage(AI_THINKING_STRUCT->moveConsidered, sBattler_AI, gBattlerTarget); @@ -1876,7 +1872,6 @@ static void BattleAICmd_if_cant_faint(void) return; } - gDynamicBasePower = 0; gBattleStruct->dynamicMoveType = 0; gMoveResultFlags = 0; dmg = AI_CalcDamage(AI_THINKING_STRUCT->moveConsidered, sBattler_AI, gBattlerTarget); diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index babf3004eb..234d6b1f2e 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -710,7 +710,6 @@ u8 GetMostSuitableMonToSwitchInto(void) } } - gDynamicBasePower = 0; gBattleStruct->dynamicMoveType = 0; gMoveResultFlags = 0; bestDmg = 0; diff --git a/src/battle_main.c b/src/battle_main.c index 2a7e016e9c..d3456ad09e 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -266,7 +266,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}; @@ -4922,12 +4921,7 @@ static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void) TryClearRageStatuses(); gCurrentTurnActionNumber = 0; -{ - // something stupid needed to match - u8 zero; - gCurrentActionFuncId = gActionsByTurnOrder[(zero = 0)]; -} - gDynamicBasePower = 0; + gCurrentActionFuncId = gActionsByTurnOrder[0]; gBattleStruct->dynamicMoveType = 0; gBattleMainFunc = RunTurnActionsFunctions; gBattleCommunication[3] = 0; @@ -5842,7 +5836,6 @@ static void HandleAction_ActionFinished(void) gLastLandedMoves[gBattlerAttacker] = 0; gLastHitByType[gBattlerAttacker] = 0; gBattleStruct->dynamicMoveType = 0; - gDynamicBasePower = 0; gBattleScripting.atk49_state = 0; gBattleCommunication[3] = 0; gBattleCommunication[4] = 0; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 9123a3732a..e2bd03fac6 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -269,10 +269,10 @@ static void atkAF_cursetarget(void); static void atkB0_trysetspikes(void); static void atkB1_setforesight(void); static void atkB2_trysetperishsong(void); -static void atkB3_rolloutdamagecalculation(void); +static void atkB3_handlerollout(void); static void atkB4_jumpifconfusedandstatmaxed(void); -static void atkB5_furycuttercalc(void); -static void atkB6_happinesstodamagecalculation(void); +static void atkB5_handlefurycutter(void); +static void atkB6_nop(void); static void atkB7_presentdamagecalculation(void); static void atkB8_setsafeguard(void); static void atkB9_magnitudedamagecalculation(void); @@ -307,7 +307,7 @@ static void atkD5_trysetroots(void); static void atkD6_nop(void); static void atkD7_setyawn(void); static void atkD8_setdamagetohealthdifference(void); -static void atkD9_scaledamagebyhealthratio(void); +static void atkD9_nop(void); static void atkDA_tryswapabilities(void); static void atkDB_tryimprision(void); static void atkDC_trysetgrudge(void); @@ -521,10 +521,10 @@ void (* const gBattleScriptingCommandsTable[])(void) = atkB0_trysetspikes, atkB1_setforesight, atkB2_trysetperishsong, - atkB3_rolloutdamagecalculation, + atkB3_handlerollout, atkB4_jumpifconfusedandstatmaxed, - atkB5_furycuttercalc, - atkB6_happinesstodamagecalculation, + atkB5_handlefurycutter, + atkB6_nop, atkB7_presentdamagecalculation, atkB8_setsafeguard, atkB9_magnitudedamagecalculation, @@ -559,7 +559,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atkD6_nop, atkD7_setyawn, atkD8_setdamagetohealthdifference, - atkD9_scaledamagebyhealthratio, + atkD9_nop, atkDA_tryswapabilities, atkDB_tryimprision, atkDC_trysetgrudge, @@ -8350,7 +8350,7 @@ static void atkB2_trysetperishsong(void) gBattlescriptCurrInstr += 5; } -static void atkB3_rolloutdamagecalculation(void) +static void atkB3_handlerollout(void) { if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) { @@ -8359,28 +8359,18 @@ static void atkB3_rolloutdamagecalculation(void) } else { - s32 i; - - if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) // first hit + if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) // First hit. { gDisableStructs[gBattlerAttacker].rolloutCounter1 = 5; gDisableStructs[gBattlerAttacker].rolloutCounter2 = 5; gBattleMons[gBattlerAttacker].status2 |= STATUS2_MULTIPLETURNS; gLockedMoves[gBattlerAttacker] = gCurrentMove; } - if (--gDisableStructs[gBattlerAttacker].rolloutCounter1 == 0) // last hit + if (--gDisableStructs[gBattlerAttacker].rolloutCounter1 == 0) // Last hit. { gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_MULTIPLETURNS); } - gDynamicBasePower = gBattleMoves[gCurrentMove].power; - - for (i = 1; i < (5 - gDisableStructs[gBattlerAttacker].rolloutCounter1); i++) - gDynamicBasePower *= 2; - - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_DEFENSE_CURL) - gDynamicBasePower *= 2; - gBattlescriptCurrInstr++; } } @@ -8394,7 +8384,7 @@ static void atkB4_jumpifconfusedandstatmaxed(void) gBattlescriptCurrInstr += 6; } -static void atkB5_furycuttercalc(void) +static void atkB5_handlefurycutter(void) { if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) { @@ -8403,40 +8393,34 @@ static void atkB5_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 atkB6_happinesstodamagecalculation(void) +static void atkB6_nop(void) { - if (gBattleMoves[gCurrentMove].effect == EFFECT_RETURN) - gDynamicBasePower = 10 * (gBattleMons[gBattlerAttacker].friendship) / 25; - else // EFFECT_FRUSTRATION - gDynamicBasePower = 10 * (255 - gBattleMons[gBattlerAttacker].friendship) / 25; - gBattlescriptCurrInstr++; } static void atkB7_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; @@ -8444,10 +8428,15 @@ static void atkB7_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); @@ -8475,52 +8464,52 @@ static void atkB8_setsafeguard(void) static void atkB9_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; } @@ -8693,16 +8682,8 @@ static void atkC0_recoverbasedonsunlight(void) static void atkC1_hiddenpowercalc(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) @@ -8710,8 +8691,6 @@ static void atkC1_hiddenpowercalc(void) | ((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++; @@ -9155,15 +9134,8 @@ static void atkD8_setdamagetohealthdifference(void) } } -static void atkD9_scaledamagebyhealthratio(void) +static void atkD9_nop(void) { - if (gDynamicBasePower == 0) - { - u8 power = gBattleMoves[gCurrentMove].power; - gDynamicBasePower = gBattleMons[gBattlerAttacker].hp * power / gBattleMons[gBattlerAttacker].maxHP; - if (gDynamicBasePower == 0) - gDynamicBasePower = 1; - } gBattlescriptCurrInstr++; } From 988e00b8e4fea4bbe98af5b774f0842632c2ca28 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 16 Jul 2018 21:56:11 +0200 Subject: [PATCH 020/667] Small change --- data/battle_scripts_1.s | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 65e3c060ee..a777bef1f8 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1643,19 +1643,19 @@ 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 setmoveeffect MOVE_EFFECT_CONFUSION seteffectprimary goto BattleScript_MoveEnd -BattleScript_EffectFuryCutter:: +BattleScript_EffectFuryCutter: attackcanceler attackstring ppreduce accuracycheck BattleScript_FuryCutterHit, ACC_CURR_MOVE -BattleScript_FuryCutterHit:: +BattleScript_FuryCutterHit: handlefurycutter critcalc damagecalc From f3be5ad22dd06f97c9d0400e18917496ad4ab3e1 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 18 Jul 2018 22:07:48 +0200 Subject: [PATCH 021/667] Do new battler end turn effects. --- data/battle_scripts_1.s | 26 +++++ include/battle.h | 4 + include/battle_scripts.h | 5 + include/battle_util.h | 2 +- include/constants/battle.h | 3 + include/constants/battle_string_ids.h | 15 ++- src/battle_main.c | 2 +- src/battle_message.c | 28 +++++ src/battle_util.c | 153 +++++++++++++++++++++----- 9 files changed, 209 insertions(+), 29 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index a777bef1f8..96479fd34c 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3588,11 +3588,17 @@ 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 @@ -3862,6 +3868,26 @@ BattleScript_YawnMakesAsleep:: waitstate makevisible BS_EFFECT_BATTLER end2 + +BattleScript_EmbargoEndTurn:: + printstring STRINGID_EMBARGOENDS + waitmessage 0x40 + end2 + +BattleScript_MagnetRiseEndTurn:: + printstring STRINGID_MAGNETRISEENDS + waitmessage 0x40 + end2 + +BattleScript_TelekinesisEndTurn:: + printstring STRINGID_TELEKINESISENDS + waitmessage 0x40 + end2 + +BattleScript_HealBlockEndTurn:: + printstring STRINGID_HEALBLOCKENDS + waitmessage 0x40 + end2 BattleScript_MoveEffectPoison:: statusanimation BS_EFFECT_BATTLER diff --git a/include/battle.h b/include/battle.h index 9bee3a6826..6c91466a82 100644 --- a/include/battle.h +++ b/include/battle.h @@ -173,6 +173,10 @@ struct DisableStruct /*0x19*/ u8 rechargeCounter; /*0x1A*/ u8 autonomizeCount; /*0x1B*/ u8 slowStartTimer; + u8 embargoTimer; + u8 magnetRiseTimer; + u8 telekinesisTimer; + u8 healBlockTimer; }; struct ProtectStruct diff --git a/include/battle_scripts.h b/include/battle_scripts.h index ffd9996602..febe816235 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -286,5 +286,10 @@ extern const u8 BattleScript_ActionWatchesCarefully[]; extern const u8 BattleScript_ActionGetNear[]; extern const u8 BattleScript_ActionThrowPokeblock[]; extern const u8 BattleScript_82DBEE3[]; +extern const u8 BattleScript_EmbargoEndTurn[]; +extern const u8 BattleScript_MagnetRiseEndTurn[]; +extern const u8 BattleScript_TelekinesisEndTurn[]; +extern const u8 BattleScript_HealBlockEndTurn[]; +extern const u8 BattleScript_AquaRingHeal[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/battle_util.h b/include/battle_util.h index 35f4546523..3032009e72 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -57,7 +57,7 @@ u8 CheckMoveLimitations(u8 battlerId, u8 unusableMoves, u8 check); bool8 AreAllMovesUnusable(void); u8 GetImprisonedMovesCount(u8 battlerId, u16 move); u8 UpdateTurnCounters(void); -u8 TurnBasedEffects(void); +u8 DoBattlerEndTurnEffects(void); bool8 HandleWishPerishSongOnTurnEnd(void); bool8 HandleFaintedMonActions(void); void TryClearRageStatuses(void); diff --git a/include/constants/battle.h b/include/constants/battle.h index 80ed2b7e23..045fa2ecc0 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -153,6 +153,9 @@ #define STATUS3_TELEKINESIS 0x800000 #define STATUS3_UNBURDEN 0x1000000 #define STATUS3_MIRACLE_EYED 0x2000000 +#define STATUS3_MAGNET_RISE 0x4000000 +#define STATUS3_HEAL_BLOCK 0x8000000 +#define STATUS3_AQUA_RING 0x10000000 #define STATUS3_SEMI_INVULNERABLE (STATUS3_UNDERGROUND | STATUS3_ON_AIR | STATUS3_UNDERWATER) // Not really sure what a "hitmarker" is. diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 300ea9e404..9cd3cf4005 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -1,7 +1,7 @@ #ifndef GUARD_CONSTANTS_BATTLE_STRING_IDS_H #define GUARD_CONSTANTS_BATTLE_STRING_IDS_H -#define BATTLESTRINGS_COUNT 420 +#define BATTLESTRINGS_COUNT 433 #define BATTLESTRINGS_ID_ADDER 12 // all battlestrings have its ID + 12, because first 5 are reserved @@ -434,5 +434,18 @@ #define STRINGID_POSTPONETARGETMOVE 429 #define STRINGID_REFLECTTARGETSTYPE 430 #define STRINGID_TRANSFERHELDITEM 431 +#define STRINGID_EMBARGOENDS 432 +#define STRINGID_MAGNETRISEENDS 433 +#define STRINGID_HEALBLOCKENDS 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 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_main.c b/src/battle_main.c index 4e67d00020..9453bc184a 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3968,7 +3968,7 @@ void BattleTurnPassed(void) { if (UpdateTurnCounters()) return; - if (TurnBasedEffects()) + if (DoBattlerEndTurnEffects()) return; } if (HandleFaintedMonActions()) diff --git a/src/battle_message.c b/src/battle_message.c index d4d038315b..574406165f 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -574,6 +574,21 @@ static const u8 sText_PostponeTargetMove[] =_("{B_DEF_NAME_WITH_PREFIX}’s move 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} recieved {B_LAST_ITEM}\nfrom {B_ATK_NAME_WITH_PREFIX}"); +// These strings are currently placeholders, to be fixed. +static const u8 sText_EmbargoEnds[] = _(""); +static const u8 sText_MagnetRiseEnds[] = _(""); +static const u8 sText_HealBlockEnds[] = _(""); +static const u8 sText_TelekinesisEnds[] = _(""); +static const u8 sText_TailwindEnds[] = _(""); +static const u8 sText_LuckyChantEnds[] = _(""); +static const u8 sText_TrickRoomEnds[] = _(""); +static const u8 sText_WonderRoomEnds[] = _(""); +static const u8 sText_MagicRoomEnds[] = _(""); +static const u8 sText_MudSportEnds[] = _(""); +static const u8 sText_WaterSportEnds[] = _(""); +static const u8 sText_GravityEnds[] = _(""); +static const u8 sText_AquaRingHeal[] = _(""); + const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { sText_Trainer1LoseText, // 12 @@ -997,6 +1012,19 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_PostponeTargetMove, // 429 sText_ReflectTargetsType, // 430 sText_TransferHeldItem, // 431 + sText_EmbargoEnds, // 432 + sText_MagnetRiseEnds, // 433 + sText_HealBlockEnds, // 434 + sText_TelekinesisEnds, // 435 + sText_TailwindEnds, // 436 + sText_LuckyChantEnds, // 437 + sText_TrickRoomEnds, // 438 + sText_WonderRoomEnds, // 439 + sText_MagicRoomEnds, // 440 + sText_MudSportEnds, // 441 + sText_WaterSportEnds, // 442 + sText_GravityEnds, // 443 + sText_AquaRingHeal, // 444 }; const u16 gMissStringIds[] = diff --git a/src/battle_util.c b/src/battle_util.c index b32238675c..29e610de2d 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -999,14 +999,41 @@ u8 UpdateTurnCounters(void) return (gBattleMainFunc != BattleTurnPassed); } -#define TURNBASED_MAX_CASE 19 - -u8 TurnBasedEffects(void) +enum { - u8 effect = 0; + 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_MAGNET_RISE, + ENDTURN_TELEKINESIS, + ENDTURN_HEALBLOCK, + ENDTURN_EMBARGO, + ENDTURN_LOCK_ON, + ENDTURN_CHARGE, + ENDTURN_TAUNT, + ENDTURN_YAWN, + ENDTURN_ITEMS2, + ENDTURN_BATTLER_COUNT +}; + +u8 DoBattlerEndTurnEffects(void) +{ + u8 effect = FALSE; gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_x20); - while (gBattleStruct->turnEffectsBattlerId < gBattlersCount && gBattleStruct->turnEffectsTracker <= TURNBASED_MAX_CASE) + while (gBattleStruct->turnEffectsBattlerId < gBattlersCount && gBattleStruct->turnEffectsTracker <= ENDTURN_BATTLER_COUNT) { gActiveBattler = gBattlerAttacker = gBattlerByTurnOrder[gBattleStruct->turnEffectsBattlerId]; if (gAbsentBattlerFlags & gBitTable[gActiveBattler]) @@ -1017,9 +1044,10 @@ u8 TurnBasedEffects(void) { switch (gBattleStruct->turnEffectsTracker) { - case 0: // ingrain + case ENDTURN_INGRAIN: // ingrain if ((gStatuses3[gActiveBattler] & STATUS3_ROOTED) - && gBattleMons[gActiveBattler].hp != gBattleMons[gActiveBattler].maxHP + && !BATTLER_MAX_HP(gActiveBattler) + && !(gStatuses3[gActiveBattler] & STATUS3_HEAL_BLOCK) && gBattleMons[gActiveBattler].hp != 0) { gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16; @@ -1031,22 +1059,37 @@ u8 TurnBasedEffects(void) } gBattleStruct->turnEffectsTracker++; break; - case 1: // end turn abilities + 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 = gBattleMons[gActiveBattler].maxHP / 16; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage *= -1; + 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 2: // item effects + case ENDTURN_ITEMS1: // item effects if (ItemBattleEffects(1, gActiveBattler, 0)) effect++; gBattleStruct->turnEffectsTracker++; break; - case 18: // item effects again + case ENDTURN_ITEMS2: // item effects again if (ItemBattleEffects(1, gActiveBattler, 1)) effect++; gBattleStruct->turnEffectsTracker++; break; - case 3: // leech seed + case ENDTURN_LEECH_SEED: // leech seed if ((gStatuses3[gActiveBattler] & STATUS3_LEECHSEED) && gBattleMons[gStatuses3[gActiveBattler] & STATUS3_LEECHSEED_BATTLER].hp != 0 && gBattleMons[gActiveBattler].hp != 0) @@ -1062,7 +1105,7 @@ u8 TurnBasedEffects(void) } gBattleStruct->turnEffectsTracker++; break; - case 4: // poison + case ENDTURN_POISON: // poison if ((gBattleMons[gActiveBattler].status1 & STATUS1_POISON) && gBattleMons[gActiveBattler].hp != 0) { gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; @@ -1073,7 +1116,7 @@ u8 TurnBasedEffects(void) } gBattleStruct->turnEffectsTracker++; break; - case 5: // toxic poison + case ENDTURN_BAD_POISON: // toxic poison if ((gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_POISON) && gBattleMons[gActiveBattler].hp != 0) { gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16; @@ -1087,7 +1130,7 @@ u8 TurnBasedEffects(void) } gBattleStruct->turnEffectsTracker++; break; - case 6: // burn + case ENDTURN_BURN: // burn if ((gBattleMons[gActiveBattler].status1 & STATUS1_BURN) && gBattleMons[gActiveBattler].hp != 0) { gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; @@ -1098,7 +1141,7 @@ u8 TurnBasedEffects(void) } gBattleStruct->turnEffectsTracker++; break; - case 7: // spooky nightmares + 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 @@ -1118,7 +1161,7 @@ u8 TurnBasedEffects(void) } gBattleStruct->turnEffectsTracker++; break; - case 8: // curse + case ENDTURN_CURSE: // curse if ((gBattleMons[gActiveBattler].status2 & STATUS2_CURSED) && gBattleMons[gActiveBattler].hp != 0) { gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 4; @@ -1129,7 +1172,7 @@ u8 TurnBasedEffects(void) } gBattleStruct->turnEffectsTracker++; break; - case 9: // wrap + case ENDTURN_WRAP: // wrap if ((gBattleMons[gActiveBattler].status2 & STATUS2_WRAPPED) && gBattleMons[gActiveBattler].hp != 0) { gBattleMons[gActiveBattler].status2 -= 0x2000; @@ -1162,7 +1205,7 @@ u8 TurnBasedEffects(void) } gBattleStruct->turnEffectsTracker++; break; - case 10: // uproar + case ENDTURN_UPROAR: // uproar if (gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR) { for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount; gBattlerAttacker++) @@ -1211,7 +1254,7 @@ u8 TurnBasedEffects(void) if (effect != 2) gBattleStruct->turnEffectsTracker++; break; - case 11: // thrash + case ENDTURN_THRASH: // thrash if (gBattleMons[gActiveBattler].status2 & STATUS2_LOCK_CONFUSE) { gBattleMons[gActiveBattler].status2 -= 0x400; @@ -1233,7 +1276,7 @@ u8 TurnBasedEffects(void) } gBattleStruct->turnEffectsTracker++; break; - case 12: // disable + case ENDTURN_DISABLE: // disable if (gDisableStructs[gActiveBattler].disableTimer1 != 0) { s32 i; @@ -1256,7 +1299,7 @@ u8 TurnBasedEffects(void) } gBattleStruct->turnEffectsTracker++; break; - case 13: // encore + case ENDTURN_ENCORE: // encore if (gDisableStructs[gActiveBattler].encoreTimer1 != 0) { if (gBattleMons[gActiveBattler].moves[gDisableStructs[gActiveBattler].encoredMovePos] != gDisableStructs[gActiveBattler].encoredMove) // pokemon does not have the encored move anymore @@ -1275,22 +1318,22 @@ u8 TurnBasedEffects(void) } gBattleStruct->turnEffectsTracker++; break; - case 14: // lock-on decrement + case ENDTURN_LOCK_ON: // lock-on decrement if (gStatuses3[gActiveBattler] & STATUS3_ALWAYS_HITS) gStatuses3[gActiveBattler] -= 0x8; gBattleStruct->turnEffectsTracker++; break; - case 15: // charge + case ENDTURN_CHARGE: // charge if (gDisableStructs[gActiveBattler].chargeTimer1 && --gDisableStructs[gActiveBattler].chargeTimer1 == 0) gStatuses3[gActiveBattler] &= ~STATUS3_CHARGED_UP; gBattleStruct->turnEffectsTracker++; break; - case 16: // taunt + case ENDTURN_TAUNT: // taunt if (gDisableStructs[gActiveBattler].tauntTimer1) gDisableStructs[gActiveBattler].tauntTimer1--; gBattleStruct->turnEffectsTracker++; break; - case 17: // yawn + case ENDTURN_YAWN: // yawn if (gStatuses3[gActiveBattler] & STATUS3_YAWN) { gStatuses3[gActiveBattler] -= 0x800; @@ -1309,7 +1352,63 @@ u8 TurnBasedEffects(void) } gBattleStruct->turnEffectsTracker++; break; - case 19: // done + case ENDTURN_EMBARGO: + if (gStatuses3[gActiveBattler] & STATUS3_EMBARGO) + { + if (gDisableStructs[gActiveBattler].embargoTimer != 0) + gDisableStructs[gActiveBattler].embargoTimer--; + if (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--; + if (gDisableStructs[gActiveBattler].magnetRiseTimer == 0) + { + gStatuses3[gActiveBattler] &= ~(STATUS3_MAGNET_RISE); + BattleScriptExecute(BattleScript_MagnetRiseEndTurn); + effect++; + } + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_TELEKINESIS: + if (gStatuses3[gActiveBattler] & STATUS3_TELEKINESIS) + { + if (gDisableStructs[gActiveBattler].telekinesisTimer != 0) + gDisableStructs[gActiveBattler].telekinesisTimer--; + if (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--; + if (gDisableStructs[gActiveBattler].healBlockTimer == 0) + { + gStatuses3[gActiveBattler] &= ~(STATUS3_HEAL_BLOCK); + BattleScriptExecute(BattleScript_HealBlockEndTurn); + effect++; + } + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_BATTLER_COUNT: // done gBattleStruct->turnEffectsTracker = 0; gBattleStruct->turnEffectsBattlerId++; break; @@ -3693,6 +3792,8 @@ bool32 IsBattlerGrounded(u8 battlerId) else if (gStatuses3[battlerId] & STATUS3_TELEKINESIS) return FALSE; + else if (gStatuses3[battlerId] & STATUS3_MAGNET_RISE) + return FALSE; else if (GetBattlerAbility(battlerId) == ABILITY_LEVITATE) return FALSE; else if (IS_BATTLER_OF_TYPE(battlerId, TYPE_FLYING)) From e8f7699c2c6cc25ef954a2431f0673a8261ed7f6 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 18 Jul 2018 22:33:40 +0200 Subject: [PATCH 022/667] Add five new statuses3 to debug. --- src/battle_debug.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/battle_debug.c b/src/battle_debug.c index f3cba4c45b..0863b36b58 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -160,6 +160,11 @@ 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_Unburden[] = _("Unburden"); +static const u8 sText_MiracleEye[] = _("Miracle Eye"); +static const u8 sText_AquaRing[] = _("Aqua Ring"); static const u8 sText_EmptyString[] = _(""); @@ -211,6 +216,19 @@ static const struct BitfieldInfo sStatus3Bitfield[] = {/*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, + {/*Unburden*/ 1, 24}, + {/*Miracle Eyed*/ 1, 25}, + // Magnet Rise 1, 26, + // Heal Block 1, 27, + {/*Aqua Ring*/ 1, 28}, }; static const struct ListMenuItem sMainListItems[] = @@ -279,6 +297,11 @@ static const struct ListMenuItem sStatus3ListItems[] = {sText_Yawned, 4}, {sText_Imprisoned, 5}, {sText_NoCrit, 6}, + {sText_GastroAcid, 7}, + {sText_SmackDown, 8}, + {sText_Unburden, 9}, + {sText_MiracleEye, 10}, + {sText_AquaRing, 11}, }; static const struct ListMenuItem sSideStatusListItems[] = From ad6fa078c9ddbcac1e1a3f0e5b0cfec6f8ce5ba7 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 19 Jul 2018 20:24:52 +0200 Subject: [PATCH 023/667] =?UTF-8?q?=C2=9AFix=20BattleMove=20struct=20acces?= =?UTF-8?q?s=20in=20asm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- asm/battle_frontier_1.s | 8 ++------ asm/contest.s | 4 +--- asm/pokemon_summary_screen.s | 12 +++--------- asm/pokenav.s | 4 +--- 4 files changed, 7 insertions(+), 21 deletions(-) diff --git a/asm/battle_frontier_1.s b/asm/battle_frontier_1.s index 561bd26517..52d91cf9b6 100644 --- a/asm/battle_frontier_1.s +++ b/asm/battle_frontier_1.s @@ -2563,9 +2563,7 @@ sub_818FFC0: @ 818FFC0 cmp r3, r0 beq _0818FFF0 ldr r0, =gBattleMoves - lsls r1, r3, 1 - adds r1, r3 - lsls r1, 2 + lsls r1, r3, 4 adds r3, r1, r0 ldrb r0, [r3, 0x1] cmp r0, 0 @@ -10002,9 +10000,7 @@ _08193F8C: lsls r1, 1 add r1, r10 ldrh r2, [r1] - lsls r1, r2, 1 - adds r1, r2 - lsls r1, 2 + lsls r1, r2, 4 adds r1, r0 ldrb r6, [r1, 0x1] cmp r6, 0 diff --git a/asm/contest.s b/asm/contest.s index 453ecb04c3..9e7a817a28 100644 --- a/asm/contest.s +++ b/asm/contest.s @@ -13856,9 +13856,7 @@ sub_80DEAA8: @ 80DEAA8 lsls r0, 16 lsrs r0, 16 ldr r2, =gBattleMoves - lsls r1, r0, 1 - adds r1, r0 - lsls r1, 2 + lsls r1, r0, 4 adds r1, r2 ldrb r0, [r1, 0x6] cmp r0, 0x20 diff --git a/asm/pokemon_summary_screen.s b/asm/pokemon_summary_screen.s index 988aaf41e8..319bdea92a 100644 --- a/asm/pokemon_summary_screen.s +++ b/asm/pokemon_summary_screen.s @@ -203,9 +203,7 @@ _081C3FD0: _081C3FEC: ldr r4, =gStringVar1 ldr r1, =gBattleMoves - lsls r0, r5, 1 - adds r0, r5 - lsls r0, 2 + lsls r0, r5, 4 adds r0, r1 ldrb r1, [r0, 0x4] adds r0, r4, 0 @@ -724,9 +722,7 @@ _081C442E: cmp r0, 0 beq _081C4468 adds r1, r0, 0 - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 2 + lsls r0, r1, 4 adds r0, r6 ldrb r0, [r0, 0x2] lsls r2, r4, 28 @@ -836,9 +832,7 @@ _081C4514: bne _081C4540 ldr r2, =gBattleMoves ldrh r1, [r3] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 2 + lsls r0, r1, 4 adds r0, r2 ldrb r0, [r0, 0x2] movs r1, 0x55 diff --git a/asm/pokenav.s b/asm/pokenav.s index 1ad4354a23..cf8864bc71 100644 --- a/asm/pokenav.s +++ b/asm/pokenav.s @@ -22461,9 +22461,7 @@ sub_81D28FC: @ 81D28FC .pool _081D29C4: mov r1, r9 - lsls r0, r1, 1 - add r0, r9 - lsls r0, 2 + lsls r0, r1, 4 ldr r1, =gBattleMoves adds r6, r0, r1 ldrb r1, [r6, 0x2] From 1468107002a7d17bf28a2a6af9e8b6d0874f1048 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 19 Jul 2018 21:18:20 +0200 Subject: [PATCH 024/667] Add Roost endturn effect --- include/battle.h | 4 +++- src/battle_ai_script_commands.c | 2 +- src/battle_util.c | 16 +++++++++++++--- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/include/battle.h b/include/battle.h index 6c91466a82..b29186c4ce 100644 --- a/include/battle.h +++ b/include/battle.h @@ -137,7 +137,8 @@ struct UnknownFlags u32 flags[4]; }; -#define UNKNOWN_FLAG_FLASH_FIRE 1 +#define RESOURCE_FLAG_FLASH_FIRE 0x1 +#define RESOURCE_FLAG_ROOST 0x2 struct DisableStruct { @@ -578,6 +579,7 @@ struct BattleStruct u8 debugBattler; u8 magnitudeBasePower; u8 presentBasePower; + u8 roostTypes[MAX_BATTLERS_COUNT][3]; }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index c5b8f58d1c..f8bfc9ec5c 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -2358,7 +2358,7 @@ static void BattleAICmd_if_flash_fired(void) { u8 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); - if (gBattleResources->flags->flags[battlerId] & UNKNOWN_FLAG_FLASH_FIRE) + if (gBattleResources->flags->flags[battlerId] & RESOURCE_FLAG_FLASH_FIRE) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); else gAIScriptPtr += 6; diff --git a/src/battle_util.c b/src/battle_util.c index 29e610de2d..aa85b77018 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1025,6 +1025,7 @@ enum ENDTURN_TAUNT, ENDTURN_YAWN, ENDTURN_ITEMS2, + ENDTURN_ROOST, ENDTURN_BATTLER_COUNT }; @@ -1408,6 +1409,15 @@ u8 DoBattlerEndTurnEffects(void) } 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_BATTLER_COUNT: // done gBattleStruct->turnEffectsTracker = 0; gBattleStruct->turnEffectsBattlerId++; @@ -2338,7 +2348,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA case ABILITY_FLASH_FIRE: if (moveType == TYPE_FIRE && !(gBattleMons[battler].status1 & STATUS1_FREEZE)) { - if (!(gBattleResources->flags->flags[battler] & UNKNOWN_FLAG_FLASH_FIRE)) + if (!(gBattleResources->flags->flags[battler] & RESOURCE_FLAG_FLASH_FIRE)) { gBattleCommunication[MULTISTRING_CHOOSER] = 0; if (gProtectStructs[gBattlerAttacker].notFirstStrike) @@ -2346,7 +2356,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA else gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss; - gBattleResources->flags->flags[battler] |= UNKNOWN_FLAG_FLASH_FIRE; + gBattleResources->flags->flags[battler] |= RESOURCE_FLAG_FLASH_FIRE; effect = 2; } else @@ -4387,7 +4397,7 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b MulModifier(&modifier, UQ_4_12(0.5)); break; case ABILITY_FLASH_FIRE: - if (moveType == TYPE_FIRE && gBattleResources->flags->flags[battlerAtk] & UNKNOWN_FLAG_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: From e411bad2f3287e8615ff4efb6cef228c7b39b7d3 Mon Sep 17 00:00:00 2001 From: Tetrable Date: Fri, 20 Jul 2018 15:39:40 +0100 Subject: [PATCH 025/667] added more battle strings --- src/battle_message.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/battle_message.c b/src/battle_message.c index 574406165f..c1dd5bdd42 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -575,19 +575,19 @@ static const u8 sText_ReflectTargetsType[] =_("{B_ATK_NAME_WITH_PREFIX}’s type static const u8 sText_TransferHeldItem[] =_("{B_DEF_NAME_WITH_PREFIX} recieved {B_LAST_ITEM}\nfrom {B_ATK_NAME_WITH_PREFIX}"); // These strings are currently placeholders, to be fixed. -static const u8 sText_EmbargoEnds[] = _(""); -static const u8 sText_MagnetRiseEnds[] = _(""); -static const u8 sText_HealBlockEnds[] = _(""); -static const u8 sText_TelekinesisEnds[] = _(""); -static const u8 sText_TailwindEnds[] = _(""); -static const u8 sText_LuckyChantEnds[] = _(""); -static const u8 sText_TrickRoomEnds[] = _(""); -static const u8 sText_WonderRoomEnds[] = _(""); -static const u8 sText_MagicRoomEnds[] = _(""); -static const u8 sText_MudSportEnds[] = _(""); -static const u8 sText_WaterSportEnds[] = _(""); -static const u8 sText_GravityEnds[] = _(""); -static const u8 sText_AquaRingHeal[] = _(""); +static const u8 sText_EmbargoEnds[] = _("{B_DEF_NAME_WITH_PREFIX}can\nuse items again!"); +static const u8 sText_MagnetRiseEnds[] = _("{B_ATK_NAME_WITH_PREFIX}’s electromagnetism\nwore off!"); +static const u8 sText_HealBlockEnds[] = _("{B_DEF_NAME_WITH_PREFIX}’s Heal Block\nwore off!"); +static const u8 sText_TelekinesisEnds[] = _("{B_DEF_NAME_WITH_PREFIX} was freed\nfrom the telekinesis!"); +static const u8 sText_TailwindEnds[] = _("The tailwind petered out!"); +static const u8 sText_LuckyChantEnds[] = _("Lucky Chant 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!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { From 382f640809d06c9c702f3563b5824a2e9356c104 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 21 Jul 2018 12:10:08 +0200 Subject: [PATCH 026/667] Start Side/Field end turn --- include/battle.h | 10 ++++- include/battle_util.h | 2 +- src/battle_main.c | 4 +- src/battle_util.c | 87 ++++++++++++++++++++++++------------------- 4 files changed, 60 insertions(+), 43 deletions(-) diff --git a/include/battle.h b/include/battle.h index b29186c4ce..6f009b1823 100644 --- a/include/battle.h +++ b/include/battle.h @@ -251,7 +251,13 @@ struct SideTimer /*0x08*/ u8 followmeTimer; /*0x09*/ u8 followmeTarget; /*0x0A*/ u8 spikesAmount; - /*0x0B*/ u8 fieldB; + u8 toxicSpikesAmount; + bool8 stealthRock; + bool8 stickyWeb; + u8 auroraVeilTimer; + u8 auroraVeilBattlerId; + u8 tailwindTimer; + u8 tailwindBattlerId; }; struct FieldTimer @@ -554,7 +560,7 @@ struct BattleStruct u8 intimidateBattler; u8 switchInItemsCounter; u8 field_DA; - u8 turnSideTracker; + u8 turnEffectsSide; u8 fillerDC[0xDF-0xDC]; u8 field_DF; u8 mirrorMoveArrays[32]; diff --git a/include/battle_util.h b/include/battle_util.h index 3032009e72..28d5f65f5d 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -56,7 +56,7 @@ u8 TrySetCantSelectMoveBattleScript(void); u8 CheckMoveLimitations(u8 battlerId, u8 unusableMoves, u8 check); bool8 AreAllMovesUnusable(void); u8 GetImprisonedMovesCount(u8 battlerId, u16 move); -u8 UpdateTurnCounters(void); +u8 DoFieldEndTurnEffects(void); u8 DoBattlerEndTurnEffects(void); bool8 HandleWishPerishSongOnTurnEnd(void); bool8 HandleFaintedMonActions(void); diff --git a/src/battle_main.c b/src/battle_main.c index 9453bc184a..0fd16dcb92 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3966,7 +3966,7 @@ void BattleTurnPassed(void) TurnValuesCleanUp(TRUE); if (gBattleOutcome == 0) { - if (UpdateTurnCounters()) + if (DoFieldEndTurnEffects()) return; if (DoBattlerEndTurnEffects()) return; @@ -4010,7 +4010,7 @@ void BattleTurnPassed(void) gChosenMoveByBattler[i] = MOVE_NONE; } - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_BATTLERS_COUNT; i++) *(gBattleStruct->monToSwitchIntoId + i) = PARTY_SIZE; *(&gBattleStruct->field_91) = gAbsentBattlerFlags; diff --git a/src/battle_util.c b/src/battle_util.c index aa85b77018..8a67faf1af 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -743,7 +743,22 @@ u8 GetImprisonedMovesCount(u8 battlerId, u16 move) return imprisionedMoves; } -u8 UpdateTurnCounters(void) +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, +}; + +u8 DoFieldEndTurnEffects(void) { u8 effect = 0; s32 i; @@ -761,7 +776,7 @@ u8 UpdateTurnCounters(void) switch (gBattleStruct->turnCountersTracker) { - case 0: + case ENDTURN_ORDER: for (i = 0; i < gBattlersCount; i++) { gBattlerByTurnOrder[i] = i; @@ -776,17 +791,13 @@ u8 UpdateTurnCounters(void) } } - // It's stupid, but won't match without it - { - u8* var = &gBattleStruct->turnCountersTracker; - (*var)++; - gBattleStruct->turnSideTracker = 0; - } + gBattleStruct->turnCountersTracker++; + gBattleStruct->turnEffectsSide = 0; // fall through - case 1: - while (gBattleStruct->turnSideTracker < 2) + case ENDTURN_REFLECT: + while (gBattleStruct->turnEffectsSide < 2) { - side = gBattleStruct->turnSideTracker; + side = gBattleStruct->turnEffectsSide; gActiveBattler = gBattlerAttacker = gSideTimers[side].reflectBattlerId; if (gSideStatuses[side] & SIDE_STATUS_REFLECT) { @@ -798,20 +809,20 @@ u8 UpdateTurnCounters(void) effect++; } } - gBattleStruct->turnSideTracker++; + gBattleStruct->turnEffectsSide++; if (effect) break; } if (!effect) { gBattleStruct->turnCountersTracker++; - gBattleStruct->turnSideTracker = 0; + gBattleStruct->turnEffectsSide = 0; } break; - case 2: - while (gBattleStruct->turnSideTracker < 2) + case ENDTURN_LIGHT_SCREEN: + while (gBattleStruct->turnEffectsSide < 2) { - side = gBattleStruct->turnSideTracker; + side = gBattleStruct->turnEffectsSide; gActiveBattler = gBattlerAttacker = gSideTimers[side].lightscreenBattlerId; if (gSideStatuses[side] & SIDE_STATUS_LIGHTSCREEN) { @@ -824,20 +835,20 @@ u8 UpdateTurnCounters(void) effect++; } } - gBattleStruct->turnSideTracker++; + gBattleStruct->turnEffectsSide++; if (effect) break; } if (!effect) { gBattleStruct->turnCountersTracker++; - gBattleStruct->turnSideTracker = 0; + gBattleStruct->turnEffectsSide = 0; } break; - case 3: - while (gBattleStruct->turnSideTracker < 2) + case ENDTURN_MIST: + while (gBattleStruct->turnEffectsSide < 2) { - side = gBattleStruct->turnSideTracker; + side = gBattleStruct->turnEffectsSide; gActiveBattler = gBattlerAttacker = gSideTimers[side].mistBattlerId; if (gSideTimers[side].mistTimer != 0 && --gSideTimers[side].mistTimer == 0) @@ -848,20 +859,20 @@ u8 UpdateTurnCounters(void) PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_MIST); effect++; } - gBattleStruct->turnSideTracker++; + gBattleStruct->turnEffectsSide++; if (effect) break; } if (!effect) { gBattleStruct->turnCountersTracker++; - gBattleStruct->turnSideTracker = 0; + gBattleStruct->turnEffectsSide = 0; } break; - case 4: - while (gBattleStruct->turnSideTracker < 2) + case ENDTURN_SAFEGUARD: + while (gBattleStruct->turnEffectsSide < 2) { - side = gBattleStruct->turnSideTracker; + side = gBattleStruct->turnEffectsSide; gActiveBattler = gBattlerAttacker = gSideTimers[side].safeguardBattlerId; if (gSideStatuses[side] & SIDE_STATUS_SAFEGUARD) { @@ -872,20 +883,20 @@ u8 UpdateTurnCounters(void) effect++; } } - gBattleStruct->turnSideTracker++; + gBattleStruct->turnEffectsSide++; if (effect) break; } if (!effect) { gBattleStruct->turnCountersTracker++; - gBattleStruct->turnSideTracker = 0; + gBattleStruct->turnEffectsSide = 0; } break; - case 5: - while (gBattleStruct->turnSideTracker < gBattlersCount) + case ENDTURN_WISH: + while (gBattleStruct->turnEffectsSide < gBattlersCount) { - gActiveBattler = gBattlerByTurnOrder[gBattleStruct->turnSideTracker]; + gActiveBattler = gBattlerByTurnOrder[gBattleStruct->turnEffectsSide]; if (gWishFutureKnock.wishCounter[gActiveBattler] != 0 && --gWishFutureKnock.wishCounter[gActiveBattler] == 0 && gBattleMons[gActiveBattler].hp != 0) @@ -894,7 +905,7 @@ u8 UpdateTurnCounters(void) BattleScriptExecute(BattleScript_WishComesTrue); effect++; } - gBattleStruct->turnSideTracker++; + gBattleStruct->turnEffectsSide++; if (effect) break; } @@ -903,7 +914,7 @@ u8 UpdateTurnCounters(void) gBattleStruct->turnCountersTracker++; } break; - case 6: + case ENDTURN_RAIN: if (gBattleWeather & WEATHER_RAIN_ANY) { if (!(gBattleWeather & WEATHER_RAIN_PERMANENT)) @@ -933,7 +944,7 @@ u8 UpdateTurnCounters(void) } gBattleStruct->turnCountersTracker++; break; - case 7: + case ENDTURN_SANDSTORM: if (gBattleWeather & WEATHER_SANDSTORM_ANY) { if (!(gBattleWeather & WEATHER_SANDSTORM_PERMANENT) && --gWishFutureKnock.weatherDuration == 0) @@ -953,7 +964,7 @@ u8 UpdateTurnCounters(void) } gBattleStruct->turnCountersTracker++; break; - case 8: + case ENDTURN_SUN: if (gBattleWeather & WEATHER_SUN_ANY) { if (!(gBattleWeather & WEATHER_SUN_PERMANENT) && --gWishFutureKnock.weatherDuration == 0) @@ -971,8 +982,8 @@ u8 UpdateTurnCounters(void) } gBattleStruct->turnCountersTracker++; break; - case 9: - if (gBattleWeather & WEATHER_HAIL) + case ENDTURN_HAIL: + if (gBattleWeather & WEATHER_HAIL_ANY) { if (--gWishFutureKnock.weatherDuration == 0) { @@ -991,7 +1002,7 @@ u8 UpdateTurnCounters(void) } gBattleStruct->turnCountersTracker++; break; - case 10: + case ENDTURN_FIELD_COUNT: effect++; break; } From 66a3c13f49f629fe7c971ec671af3f4a73f16438 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 21 Jul 2018 12:56:07 +0200 Subject: [PATCH 027/667] Add new Side turn effects --- charmap.txt | 1 + data/battle_scripts_1.s | 15 ++++++ include/battle.h | 2 + include/battle_message.h | 1 + include/battle_scripts.h | 3 ++ include/constants/battle.h | 1 + include/constants/battle_string_ids.h | 5 +- src/battle_debug.c | 41 ++++++++++++++- src/battle_message.c | 17 ++++-- src/battle_util.c | 75 +++++++++++++++++++++++++++ 10 files changed, 154 insertions(+), 7 deletions(-) diff --git a/charmap.txt b/charmap.txt index 02a9651066..523545c70b 100644 --- a/charmap.txt +++ b/charmap.txt @@ -396,6 +396,7 @@ B_PARTNER_NAME = FD 33 B_BUFF3 = FD 34 B_ATK_TRAINER_NAME = FD 35 B_ATK_TRAINER_CLASS = FD 36 +B_ATK_TEAM = FD 37 @ indicates the end of a town/city name (before " TOWN" or " CITY") NAME_END = FC 00 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 96479fd34c..5c0092ac1d 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3222,6 +3222,21 @@ BattleScript_SideStatusWoreOff:: printstring STRINGID_PKMNSXWOREOFF waitmessage 0x40 end2 + +BattleScript_AuroraVeilEnds:: + printstring STRINGID_AURORAVEILENDS + waitmessage 0x40 + end2 + +BattleScript_LuckyChantEnds:: + printstring STRINGID_LUCKYCHANTENDS + waitmessage 0x40 + end2 + +BattleScript_TailwindEnds:: + printstring STRINGID_TAILWINDENDS + waitmessage 0x40 + end2 BattleScript_SafeguardProtected:: pause 0x20 diff --git a/include/battle.h b/include/battle.h index 6f009b1823..b573419080 100644 --- a/include/battle.h +++ b/include/battle.h @@ -258,6 +258,8 @@ struct SideTimer u8 auroraVeilBattlerId; u8 tailwindTimer; u8 tailwindBattlerId; + u8 luckyChantTimer; + u8 luckyChantBattlerId; }; struct FieldTimer diff --git a/include/battle_message.h b/include/battle_message.h index 2332f89192..5efb762678 100644 --- a/include/battle_message.h +++ b/include/battle_message.h @@ -59,6 +59,7 @@ #define B_TXT_BUFF3 0x34 #define B_TXT_ATK_TRAINER_NAME 0x35 #define B_TXT_ATK_TRAINER_CLASS 0x36 +#define B_TXT_ATK_TEAM 0x37 // for B_TXT_BUFF1, B_TXT_BUFF2 and B_TXT_BUFF3 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index febe816235..0fdee16fe8 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -291,5 +291,8 @@ extern const u8 BattleScript_MagnetRiseEndTurn[]; extern const u8 BattleScript_TelekinesisEndTurn[]; extern const u8 BattleScript_HealBlockEndTurn[]; extern const u8 BattleScript_AquaRingHeal[]; +extern const u8 BattleScript_AuroraVeilEnds[]; +extern const u8 BattleScript_LuckyChantEnds[]; +extern const u8 BattleScript_TailwindEnds[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle.h b/include/constants/battle.h index 045fa2ecc0..546ce4dba0 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -197,6 +197,7 @@ #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) // Field affecting statuses. #define STATUS_FIELD_MAGIC_ROOM 0x1 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 9cd3cf4005..e14e18dae1 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 433 - #define BATTLESTRINGS_ID_ADDER 12 // all battlestrings have its ID + 12, because first 5 are reserved #define STRINGID_INTROMSG 0 @@ -447,5 +445,8 @@ #define STRINGID_WATERSPORTENDS 442 #define STRINGID_GRAVITYENDS 443 #define STRINGID_AQUARINGHEAL 444 +#define STRINGID_AURORAVEILENDS 445 + +#define BATTLESTRINGS_COUNT 434 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_debug.c b/src/battle_debug.c index 0863b36b58..3f19e6df54 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -111,7 +111,10 @@ enum LIST_SIDE_LIGHTSCREEN, LIST_SIDE_SPIKES, LIST_SIDE_SAFEGUARD, - LIST_SIDE_MIST + LIST_SIDE_MIST, + LIST_SIDE_AURORA_VEIL, + LIST_SIDE_LUCKY_CHANT, + LIST_SIDE_TAILWIND }; // const rom data @@ -165,6 +168,9 @@ static const u8 sText_SmackDown[] = _("Smacked Down"); static const u8 sText_Unburden[] = _("Unburden"); 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_EmptyString[] = _(""); @@ -311,6 +317,9 @@ static const struct ListMenuItem sSideStatusListItems[] = {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}, }; static const struct ListMenuItem sSecondaryListItems[] = @@ -1066,6 +1075,36 @@ static u8 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus, sideTimer->mistBattlerId = data->battlerId; } return &sideTimer->mistTimer; + case LIST_SIDE_AURORA_VEIL: + if (changeStatus) + { + if (statusTrue) + *(u16*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_AURORA_VEIL; + else + *(u16*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_AURORA_VEIL); + sideTimer->auroraVeilBattlerId = data->battlerId; + } + return &sideTimer->auroraVeilTimer; + case LIST_SIDE_LUCKY_CHANT: + if (changeStatus) + { + if (statusTrue) + *(u16*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_LUCKY_CHANT; + else + *(u16*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_LUCKY_CHANT); + sideTimer->luckyChantBattlerId = data->battlerId; + } + return &sideTimer->luckyChantTimer; + case LIST_SIDE_TAILWIND: + if (changeStatus) + { + if (statusTrue) + *(u16*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_TAILWIND; + else + *(u16*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_TAILWIND); + sideTimer->tailwindBattlerId = data->battlerId; + } + return &sideTimer->tailwindTimer; default: return NULL; } diff --git a/src/battle_message.c b/src/battle_message.c index c1dd5bdd42..1b04d361ee 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -573,14 +573,12 @@ static const u8 sText_FreedFromSkyDrop[] =_("{B_DEF_NAME_WITH_PREFIX} was freed\ 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} recieved {B_LAST_ITEM}\nfrom {B_ATK_NAME_WITH_PREFIX}"); - -// These strings are currently placeholders, to be fixed. static const u8 sText_EmbargoEnds[] = _("{B_DEF_NAME_WITH_PREFIX}can\nuse items again!"); static const u8 sText_MagnetRiseEnds[] = _("{B_ATK_NAME_WITH_PREFIX}’s electromagnetism\nwore off!"); static const u8 sText_HealBlockEnds[] = _("{B_DEF_NAME_WITH_PREFIX}’s Heal Block\nwore off!"); static const u8 sText_TelekinesisEnds[] = _("{B_DEF_NAME_WITH_PREFIX} was freed\nfrom the telekinesis!"); -static const u8 sText_TailwindEnds[] = _("The tailwind petered out!"); -static const u8 sText_LuckyChantEnds[] = _("Lucky Chant wore off!"); +static const u8 sText_TailwindEnds[] = _("{B_ATK_TEAM}’s tailwind\n petered out!"); +static const u8 sText_LuckyChantEnds[] = _("{B_ATK_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!"); @@ -589,6 +587,9 @@ static const u8 sText_WaterSportEnds[] = _("The effects of Water Sport have fade 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!"); +// These strings are currently placeholders, to be fixed. +static const u8 sText_AuroraVeilEnds[] = _(""); + const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { sText_Trainer1LoseText, // 12 @@ -1455,6 +1456,8 @@ 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_20}\nwants to battle!{PAUSE 49}"); static const u8 sText_TwoLinkTrainersWantToBattlePause[] = _("{B_20} and {B_21}\nwant to battle!{PAUSE 49}"); +static const u8 sText_YourTeam[] = _("Your team"); +static const u8 sText_OpposingTeam[] = _("The opposing team"); // 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. @@ -2891,6 +2894,12 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) break; } break; + case B_TXT_ATK_TEAM: + if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) + toCpy = sText_YourTeam; + else + toCpy = sText_OpposingTeam; + break; } if (toCpy != NULL) diff --git a/src/battle_util.c b/src/battle_util.c index 8a67faf1af..fc426d94eb 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -748,8 +748,11 @@ enum 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, @@ -845,6 +848,30 @@ u8 DoFieldEndTurnEffects(void) gBattleStruct->turnEffectsSide = 0; } break; + case ENDTURN_AURORA_VEIL: + while (gBattleStruct->turnEffectsSide < 2) + { + side = gBattleStruct->turnEffectsSide; + 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_AuroraVeilEnds); + effect++; + } + } + gBattleStruct->turnEffectsSide++; + if (effect) + break; + } + if (!effect) + { + gBattleStruct->turnCountersTracker++; + gBattleStruct->turnEffectsSide = 0; + } + break; case ENDTURN_MIST: while (gBattleStruct->turnEffectsSide < 2) { @@ -893,6 +920,54 @@ u8 DoFieldEndTurnEffects(void) gBattleStruct->turnEffectsSide = 0; } break; + case ENDTURN_LUCKY_CHANT: + while (gBattleStruct->turnEffectsSide < 2) + { + side = gBattleStruct->turnEffectsSide; + 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->turnEffectsSide++; + if (effect) + break; + } + if (!effect) + { + gBattleStruct->turnCountersTracker++; + gBattleStruct->turnEffectsSide = 0; + } + break; + case ENDTURN_TAILWIND: + while (gBattleStruct->turnEffectsSide < 2) + { + side = gBattleStruct->turnEffectsSide; + 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->turnEffectsSide++; + if (effect) + break; + } + if (!effect) + { + gBattleStruct->turnCountersTracker++; + gBattleStruct->turnEffectsSide = 0; + } + break; case ENDTURN_WISH: while (gBattleStruct->turnEffectsSide < gBattlersCount) { From 6cffd5b045667ed7cd8578376a348b35e901c5fc Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 21 Jul 2018 13:24:20 +0200 Subject: [PATCH 028/667] Add new field end turn effects --- data/battle_scripts_1.s | 45 +++++++++++++ include/battle_scripts.h | 9 +++ include/constants/battle_string_ids.h | 6 +- src/battle_message.c | 9 +++ src/battle_util.c | 93 ++++++++++++++++++++++++++- 5 files changed, 160 insertions(+), 2 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 5c0092ac1d..f47bbbf903 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3237,6 +3237,51 @@ 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_SafeguardProtected:: pause 0x20 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 0fdee16fe8..6286af6788 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -294,5 +294,14 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index e14e18dae1..98e8940f20 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -446,7 +446,11 @@ #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 BATTLESTRINGS_COUNT 434 +#define BATTLESTRINGS_COUNT 438 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_message.c b/src/battle_message.c index 1b04d361ee..d5e78aff18 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -589,6 +589,10 @@ static const u8 sText_AquaRingHeal[] = _("Aqua Ring restored\n{B_ATK_NAME_WITH_P // These strings are currently placeholders, to be fixed. static const u8 sText_AuroraVeilEnds[] = _(""); +static const u8 sText_ElectricTerrainEnds[] = _(""); +static const u8 sText_MistyTerrainEnds[] = _(""); +static const u8 sText_PsychicTerrainEnds[] = _(""); +static const u8 sText_GrassyTerrainEnds[] = _(""); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { @@ -1026,6 +1030,11 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_WaterSportEnds, // 442 sText_GravityEnds, // 443 sText_AquaRingHeal, // 444 + sText_AuroraVeilEnds, // 445 + sText_ElectricTerrainEnds, // 446 + sText_MistyTerrainEnds, // 447 + sText_PsychicTerrainEnds, // 448 + sText_GrassyTerrainEnds, // 449 }; const u16 gMissStringIds[] = diff --git a/src/battle_util.c b/src/battle_util.c index fc426d94eb..995ccf5b1c 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -758,13 +758,21 @@ enum ENDTURN_SANDSTORM, ENDTURN_SUN, ENDTURN_HAIL, + 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_FIELD_COUNT, }; u8 DoFieldEndTurnEffects(void) { u8 effect = 0; - s32 i; for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount && gAbsentBattlerFlags & gBitTable[gBattlerAttacker]; gBattlerAttacker++) { @@ -775,6 +783,7 @@ u8 DoFieldEndTurnEffects(void) do { + s32 i; u8 side; switch (gBattleStruct->turnCountersTracker) @@ -1077,11 +1086,93 @@ 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 && --gFieldTimers.grassyTerrainTimer == 0) + { + gFieldStatuses &= ~(STATUS_FIELD_GRASSY_TERRAIN); + BattleScriptExecute(BattleScript_GrassyTerrainEnds); + 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_FIELD_COUNT: effect++; break; } } while (effect == 0); + return (gBattleMainFunc != BattleTurnPassed); } From 12bd67f0f9187e4a98470210e9b4a9e9e3f96909 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 21 Jul 2018 13:38:51 +0200 Subject: [PATCH 029/667] Add PP modyfing to debug --- src/battle_debug.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/battle_debug.c b/src/battle_debug.c index 3f19e6df54..145a408aef 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -76,6 +76,7 @@ enum LIST_ITEM_MOVES, LIST_ITEM_ABILITY, LIST_ITEM_HELD_ITEM, + LIST_ITEM_PP, LIST_ITEM_TYPES, LIST_ITEM_STATS, LIST_ITEM_STAT_STAGES, @@ -171,6 +172,7 @@ 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_EmptyString[] = _(""); @@ -242,6 +244,7 @@ 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}, @@ -463,6 +466,7 @@ static const u8 sBitsToMaxDigit[] = static const bool8 sHasChangeableEntries[LIST_ITEM_COUNT] = { [LIST_ITEM_MOVES] = TRUE, + [LIST_ITEM_PP] = TRUE, [LIST_ITEM_ABILITY] = TRUE, [LIST_ITEM_TYPES] = TRUE, [LIST_ITEM_HELD_ITEM] = TRUE, @@ -779,6 +783,7 @@ static void CreateSecondaryListMenu(struct BattleDebugMenu *data) itemsCount = 2; break; case LIST_ITEM_MOVES: + case LIST_ITEM_PP: itemsCount = 4; break; case LIST_ITEM_STATS: @@ -865,6 +870,7 @@ static void PrintSecondaryEntries(struct BattleDebugMenu *data) 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); @@ -1134,6 +1140,14 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) data->modifyArrows.typeOfVal = VAL_U16; data->modifyArrows.currValue = gBattleMons[data->battlerId].moves[data->currentSecondaryListItemId]; 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; From 9d4d8c5dac8b98b23a456677360ad947228931c7 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 21 Jul 2018 15:11:13 +0200 Subject: [PATCH 030/667] Add new Sturdy effect --- asm/macros/battle_script.inc | 2 +- data/battle_scripts_1.s | 54 +++++++++++++++------------ include/battle.h | 3 +- include/battle_scripts.h | 1 + include/constants/battle.h | 1 + src/battle_main.c | 2 +- src/battle_script_commands.c | 71 +++++++++++++++++++++++++++++------- 7 files changed, 93 insertions(+), 41 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 1b3cd28a82..03f0196d76 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -33,7 +33,7 @@ .byte 0x7 .endm - .macro nop_08 + .macro multihitresultmessage .byte 0x8 .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index f47bbbf903..52fe703a3f 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -442,10 +442,10 @@ BattleScript_82D8BCF:: end BattleScript_82D8BEA:: - 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:: @@ -492,7 +492,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 @@ -655,6 +655,7 @@ BattleScript_DoMultiHit:: datahpupdate BS_TARGET critmessage waitmessage 0x40 + multihitresultmessage printstring STRINGID_EMPTYSTRING3 waitmessage 0x1 addbyte sMULTIHIT_STRING + 4, 0x1 @@ -839,7 +840,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 @@ -849,7 +850,7 @@ 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 adjustdamage goto BattleScript_HitFromAtkAnimation @@ -889,12 +890,12 @@ BattleScript_MoveMissedDoDamage:: typecalc adjustdamage manipulatedamage ATK80_DMG_HALF_BY_TWO_NOT_MORE_THAN_HALF_MAX_HP - 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:: @@ -1224,7 +1225,7 @@ 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 adjustdamage goto BattleScript_HitFromAtkAnimation @@ -1235,7 +1236,7 @@ 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 adjustdamage goto BattleScript_HitFromAtkAnimation @@ -1443,7 +1444,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 @@ -1737,7 +1738,7 @@ 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 adjustdamage goto BattleScript_HitFromAtkAnimation @@ -2065,14 +2066,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 @@ -2414,7 +2415,7 @@ BattleScript_EffectBrickBreak:: damagecalc 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 @@ -2473,7 +2474,7 @@ 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 adjustdamage goto BattleScript_HitFromAtkAnimation @@ -2656,7 +2657,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 @@ -2742,7 +2743,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 @@ -3330,7 +3331,7 @@ 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 adjustdamage setbyte sB_ANIM_TURN, 0x1 @@ -3572,16 +3573,16 @@ BattleScript_FutureAttackEnd:: moveend 0x1, 0x0 setbyte sMOVEEND_STATE, 0xB moveend 0x2, 0xE - setbyte gMoveResultFlags, 0 + sethword gMoveResultFlags, 0 end2 BattleScript_FutureAttackMiss:: pause 0x20 - setbyte gMoveResultFlags, 0 - orbyte gMoveResultFlags, MOVE_RESULT_FAILED + sethword gMoveResultFlags, 0 + orhalfword gMoveResultFlags, MOVE_RESULT_FAILED resultmessage waitmessage 0x40 - setbyte gMoveResultFlags, 0 + sethword gMoveResultFlags, 0 end2 BattleScript_NoMovesLeft:: @@ -3734,6 +3735,11 @@ BattleScript_EnduredMsg:: printstring STRINGID_PKMNENDUREDHIT waitmessage 0x40 return + +BattleScript_SturdiedMsg:: + printstring STRINGID_ENDUREDSTURDY + waitmessage 0x40 + return BattleScript_OneHitKOMsg:: printstring STRINGID_ONEHITKO @@ -4151,7 +4157,7 @@ BattleScript_MoveHPDrain:: 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_MonMadeMoveUseless_PPLoss:: @@ -4161,7 +4167,7 @@ BattleScript_MonMadeMoveUseless:: pause 0x20 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:: diff --git a/include/battle.h b/include/battle.h index b573419080..2ff032cef2 100644 --- a/include/battle.h +++ b/include/battle.h @@ -229,6 +229,7 @@ struct SpecialStatus u8 flag40:1; u8 focusBanded:1; u8 focusSashed:1; + u8 sturdied:1; s32 dmg; s32 physicalDmg; s32 specialDmg; @@ -800,7 +801,7 @@ extern u16 gLastResultingMoves[MAX_BATTLERS_COUNT]; extern u16 gLockedMoves[MAX_BATTLERS_COUNT]; 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; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 6286af6788..1bd00027da 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -303,5 +303,6 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle.h b/include/constants/battle.h index 546ce4dba0..7b0b003564 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -220,6 +220,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 diff --git a/src/battle_main.c b/src/battle_main.c index 0fd16dcb92..e66468cafd 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -246,7 +246,7 @@ EWRAM_DATA u16 gLastResultingMoves[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gLockedMoves[MAX_BATTLERS_COUNT] = {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}; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index dc7839b58d..20476282f7 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -99,7 +99,7 @@ static void atk04_critcalc(void); static void atk05_damagecalc(void); static void atk06_typecalc(void); static void atk07_adjustdamage(void); -static void atk08_nop(void); +static void atk08_multihitresultmessage(void); static void atk09_attackanimation(void); static void atk0A_waitanimation(void); static void atk0B_healthbarupdate(void); @@ -351,7 +351,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atk05_damagecalc, atk06_typecalc, atk07_adjustdamage, - atk08_nop, + atk08_multihitresultmessage, atk09_attackanimation, atk0A_waitanimation, atk0B_healthbarupdate, @@ -1380,19 +1380,16 @@ static void atk07_adjustdamage(void) { u8 holdEffect, param; - holdEffect = GetBattlerHoldEffect(gBattlerTarget, TRUE); - if (gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY) - param = gEnigmaBerries[gBattlerTarget].holdEffectParam; - else - param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item); - - gPotentialItemEffectBattler = gBattlerTarget; - if (gBattleMons[gBattlerTarget].status2 & STATUS2_SUBSTITUTE) goto END; if (gBattleMons[gBattlerTarget].hp > gBattleMoveDamage) goto END; + holdEffect = GetBattlerHoldEffect(gBattlerTarget, TRUE); + param = GetBattlerHoldEffectParam(gBattlerTarget); + + gPotentialItemEffectBattler = gBattlerTarget; + if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < param) { RecordItemEffectBattle(gBattlerTarget, holdEffect); @@ -1403,14 +1400,20 @@ static void atk07_adjustdamage(void) RecordItemEffectBattle(gBattlerTarget, holdEffect); gSpecialStatuses[gBattlerTarget].focusSashed = 1; } + else if (GetBattlerAbility(gBattlerTarget) == ABILITY_STURDY && BATTLER_MAX_HP(gBattlerTarget)) + { + 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].focusSashed + && !gSpecialStatuses[gBattlerTarget].sturdied) goto END; - // Handle reducing the dmg to 1 hp + // Handle reducing the dmg to 1 hp. gBattleMoveDamage = gBattleMons[gBattlerTarget].hp - 1; if (gProtectStructs[gBattlerTarget].endured) @@ -1422,14 +1425,45 @@ static void atk07_adjustdamage(void) gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON; gLastUsedItem = gBattleMons[gBattlerTarget].item; } + else if (gSpecialStatuses[gBattlerTarget].sturdied) + { + gMoveResultFlags |= MOVE_RESULT_STURDIED; + gLastUsedAbility = ABILITY_STURDY; + } END: gBattlescriptCurrInstr++; } -static void atk08_nop(void) +static void atk08_multihitresultmessage(void) { + if (gBattleControllerExecFlags) + return; + if (!(gMoveResultFlags & MOVE_RESULT_FAILED) && !(gMoveResultFlags & MOVE_RESULT_FOE_ENDURED)) + { + if (gMoveResultFlags & MOVE_RESULT_STURDIED) + { + 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 (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++; } static void atk09_attackanimation(void) @@ -1692,6 +1726,7 @@ static void atk0E_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) { @@ -1729,7 +1764,7 @@ static void atk0F_resultmessage(void) else { gBattleCommunication[MSG_DISPLAY] = 1; - switch (gMoveResultFlags & (u8)(~(MOVE_RESULT_MISSED))) + switch (gMoveResultFlags & (~MOVE_RESULT_MISSED)) { case MOVE_RESULT_SUPER_EFFECTIVE: stringId = STRINGID_SUPEREFFECTIVE; @@ -1770,6 +1805,14 @@ static void atk0F_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); From b203cf4ca4a36c6767b0ab6f5b1db8c3ce9344f9 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 21 Jul 2018 16:34:43 +0200 Subject: [PATCH 031/667] Add a couple of gen4 moves battlescripts --- asm/macros/battle_script.inc | 17 ++-- data/battle_scripts_1.s | 120 +++++++++++++++++++++- include/battle.h | 1 + include/battle_scripts.h | 1 + include/constants/battle_move_effects.h | 6 ++ include/data/battle_moves.h | 12 +-- src/battle_script_commands.c | 126 +++++++++++++++++++----- src/battle_util.c | 10 ++ 8 files changed, 257 insertions(+), 36 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 03f0196d76..e79afe0cd0 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -356,7 +356,7 @@ .4byte \param0 .endm - .macro nop_42 + .macro setroost .byte 0x42 .endm @@ -558,8 +558,9 @@ .byte 0x68 .endm - .macro nop_69 + .macro setgravity ptr .byte 0x69 + .word \ptr .endm .macro removeitem bank @@ -676,8 +677,9 @@ .4byte \param0 .endm - .macro nop + .macro setmiracleeye ptr .byte 0x83 + .4byte \ptr .endm .macro jumpifcantmakeasleep param0 @@ -860,8 +862,9 @@ .byte 0xab .endm - .macro nop_AC + .macro settailwind ptr .byte 0xac + .word \ptr .endm .macro tryspiteppreduce param0 @@ -906,8 +909,9 @@ .byte 0xb5 .endm - .macro nop_B6 + .macro setembargo ptr .byte 0xb6 + .word \ptr .endm .macro presentdamagecalculation @@ -1052,8 +1056,9 @@ .4byte \param0 .endm - .macro nop_D6 + .macro setaquaring ptr .byte 0xd6 + .word \ptr .endm .macro setyawn param0 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 52fe703a3f..669e27f8f0 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -228,6 +228,96 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .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_EffectHeat_crash + .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 + +BattleScript_EffectAquaRing: + attackcanceler + attackstring + ppreduce + setaquaring 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_PKMNIDENTIFIED + 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 + goto BattleScript_MoveEnd + +BattleScript_EffectRoost: + attackcanceler + attackstring + ppreduce + tryhealhalfhealth BattleScript_AlreadyAtFullHp, BS_TARGET + setroost + goto BattleScript_PresentHealTarget BattleScript_EffectSpeedUp: BattleScript_EffectSpecialDefenseUp: @@ -261,6 +351,29 @@ BattleScript_EffectRevenge: BattleScript_EffectReturn: BattleScript_EffectFrustration: BattleScript_EffectEruption: +BattleScript_EffectPledge: +BattleScript_EffectFling: +BattleScript_EffectNaturalGift: +BattleScript_EffectWakeUpSlap: +BattleScript_EffectWringOut: +BattleScript_EffectHex: +BattleScript_EffectAssurance: +BattleScript_EffectTrump_card: +BattleScript_EffectAcrobatics: +BattleScript_EffectHeat_crash: +BattleScript_EffectPunishment: +BattleScript_EffectStoredPower: +BattleScript_EffectElectroBall: +BattleScript_EffectGyroBall: +BattleScript_EffectEchoedVoice: +BattleScript_EffectPayback: +BattleScript_EffectRound: +BattleScript_EffectBrine: +BattleScript_EffectVenoshock: +BattleScript_EffectRetalitate: +BattleScript_EffectBulldoze: +BattleScript_EffectFoulPlay: +BattleScript_EffectPsyshock: jumpifnotmove MOVE_SURF, BattleScript_HitFromAtkCanceler jumpifnostatus3 BS_TARGET, STATUS3_UNDERWATER, BattleScript_HitFromAtkCanceler orword gHitMarker, HITMARKER_IGNORE_UNDERWATER @@ -1581,6 +1694,7 @@ BattleScript_EffectForesight:: attackstring ppreduce setforesight +BattleScript_IdentifiedFoe: attackanimation waitanimation printstring STRINGID_PKMNIDENTIFIED @@ -2086,7 +2200,6 @@ BattleScript_EffectUproar:: jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_UproarHit ppreduce BattleScript_UproarHit:: - nop goto BattleScript_HitFromCritCalc BattleScript_EffectStockpile:: @@ -3283,6 +3396,11 @@ BattleScript_WaterSportEnds:: printstring STRINGID_WATERSPORTENDS waitmessage 0x40 end2 + +BattleScript_GravityEnds:: + printstring STRINGID_GRAVITYENDS + waitmessage 0x40 + end2 BattleScript_SafeguardProtected:: pause 0x20 diff --git a/include/battle.h b/include/battle.h index 2ff032cef2..c534d6745c 100644 --- a/include/battle.h +++ b/include/battle.h @@ -275,6 +275,7 @@ struct FieldTimer u8 electricTerrainTimer; u8 psychicTerrainTimer; u8 echoVoiceCounter; + u8 gravityTimer; }; struct WishFutureKnock diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 1bd00027da..a8789c0a17 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -304,5 +304,6 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 9a8ed60fc2..d1fbe40791 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -240,5 +240,11 @@ #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 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index 13cc3ccc91..c70e246153 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -4264,7 +4264,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_ROOST - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_ROOST, .power = 0, .type = TYPE_FLYING, .accuracy = 0, @@ -4276,7 +4276,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_GRAVITY - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_GRAVITY, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -4288,7 +4288,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_MIRACLE_EYE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_MIRACLE_EYE, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -4396,7 +4396,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_TAILWIND - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_TAILWIND, .power = 0, .type = TYPE_FLYING, .accuracy = 0, @@ -4480,7 +4480,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_EMBARGO - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_EMBARGO, .power = 0, .type = TYPE_DARK, .accuracy = 100, @@ -4708,7 +4708,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_AQUA_RING - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_AQUA_RING, .power = 0, .type = TYPE_WATER, .accuracy = 0, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 20476282f7..a798600fb3 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -157,7 +157,7 @@ static void atk3E_end2(void); static void atk3F_end3(void); static void atk40_jumpifaffectedbyprotect(void); static void atk41_call(void); -static void atk42_nop(void); +static void atk42_setroost(void); static void atk43_jumpifabilitypresent(void); static void atk44_endselectionscript(void); static void atk45_playanimation(void); @@ -196,7 +196,7 @@ static void atk65_status2animation(void); static void atk66_chosenstatusanimation(void); static void atk67_yesnobox(void); static void atk68_cancelallactions(void); -static void atk69_nop(void); +static void atk69_setgravity(void); static void atk6A_removeitem(void); static void atk6B_atknameinbuff1(void); static void atk6C_drawlvlupbox(void); @@ -222,7 +222,7 @@ static void atk7F_setseeded(void); static void atk80_manipulatedamage(void); static void atk81_trysetrest(void); static void atk82_jumpifnotfirstturn(void); -static void atk83_nop(void); +static void atk83_setmiracleeye(void); static void atk84_jumpifcantmakeasleep(void); static void atk85_stockpile(void); static void atk86_stockpiletobasedamage(void); @@ -263,7 +263,7 @@ static void atkA8_copymovepermanently(void); static void atkA9_trychoosesleeptalkmove(void); static void atkAA_setdestinybond(void); static void atkAB_trysetdestinybondtohappen(void); -static void atkAC_nop(void); +static void atkAC_settailwind(void); static void atkAD_tryspiteppreduce(void); static void atkAE_healpartystatus(void); static void atkAF_cursetarget(void); @@ -273,7 +273,7 @@ static void atkB2_trysetperishsong(void); static void atkB3_handlerollout(void); static void atkB4_jumpifconfusedandstatmaxed(void); static void atkB5_handlefurycutter(void); -static void atkB6_nop(void); +static void atkB6_setembargo(void); static void atkB7_presentdamagecalculation(void); static void atkB8_setsafeguard(void); static void atkB9_magnitudedamagecalculation(void); @@ -305,7 +305,7 @@ static void atkD2_tryswapitems(void); static void atkD3_trycopyability(void); static void atkD4_trywish(void); static void atkD5_trysetroots(void); -static void atkD6_nop(void); +static void atkD6_setaquaring(void); static void atkD7_setyawn(void); static void atkD8_setdamagetohealthdifference(void); static void atkD9_nop(void); @@ -409,7 +409,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atk3F_end3, atk40_jumpifaffectedbyprotect, atk41_call, - atk42_nop, + atk42_setroost, atk43_jumpifabilitypresent, atk44_endselectionscript, atk45_playanimation, @@ -448,7 +448,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atk66_chosenstatusanimation, atk67_yesnobox, atk68_cancelallactions, - atk69_nop, + atk69_setgravity, atk6A_removeitem, atk6B_atknameinbuff1, atk6C_drawlvlupbox, @@ -474,7 +474,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atk80_manipulatedamage, atk81_trysetrest, atk82_jumpifnotfirstturn, - atk83_nop, + atk83_setmiracleeye, atk84_jumpifcantmakeasleep, atk85_stockpile, atk86_stockpiletobasedamage, @@ -515,7 +515,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atkA9_trychoosesleeptalkmove, atkAA_setdestinybond, atkAB_trysetdestinybondtohappen, - atkAC_nop, + atkAC_settailwind, atkAD_tryspiteppreduce, atkAE_healpartystatus, atkAF_cursetarget, @@ -525,7 +525,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atkB3_handlerollout, atkB4_jumpifconfusedandstatmaxed, atkB5_handlefurycutter, - atkB6_nop, + atkB6_setembargo, atkB7_presentdamagecalculation, atkB8_setsafeguard, atkB9_magnitudedamagecalculation, @@ -557,7 +557,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atkD3_trycopyability, atkD4_trywish, atkD5_trysetroots, - atkD6_nop, + atkD6_setaquaring, atkD7_setyawn, atkD8_setdamagetohealthdifference, atkD9_nop, @@ -3975,8 +3975,36 @@ static void atk41_call(void) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } -static void atk42_nop(void) +static void atk42_setroost(void) { + gBattleResources->flags->flags[gBattlerAttacker] |= RESOURCE_FLAG_ROOST; + + // 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++; } @@ -5849,9 +5877,24 @@ static void atk68_cancelallactions(void) gBattlescriptCurrInstr++; } -static void atk69_nop(void) +static void atk69_setgravity(void) { - gBattlescriptCurrInstr++; + if (gFieldStatuses & STATUS_FIELD_GRAVITY) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + } + else + { + u32 i; + + gFieldStatuses |= STATUS_FIELD_GRAVITY; + gFieldTimers.gravityTimer = 5; + + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + gStatuses3[i] &= ~(STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS | STATUS3_ON_AIR); + + gBattlescriptCurrInstr += 5; + } } static void atk6A_removeitem(void) @@ -6728,9 +6771,17 @@ static void atk82_jumpifnotfirstturn(void) gBattlescriptCurrInstr = failJump; } -static void atk83_nop(void) +static void atk83_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) @@ -8175,9 +8226,21 @@ static void atkAB_trysetdestinybondtohappen(void) gBattlescriptCurrInstr++; } -static void atkAC_nop(void) +static void atkAC_settailwind(void) { - gBattlescriptCurrInstr++; + u8 side = GetBattlerSide(gBattlerAttacker); + + if (!(gSideStatuses[side] & SIDE_STATUS_TAILWIND)) + { + gSideStatuses[side] |= SIDE_STATUS_TAILWIND; + gSideTimers[side].tailwindBattlerId = gBattlerAttacker; + gSideTimers[side].tailwindTimer = 3; + gBattlescriptCurrInstr += 5; + } + else + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + } } static void atkAD_tryspiteppreduce(void) @@ -8445,9 +8508,18 @@ static void atkB5_handlefurycutter(void) } } -static void atkB6_nop(void) +static void atkB6_setembargo(void) { - 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 atkB7_presentdamagecalculation(void) @@ -9147,9 +9219,17 @@ static void atkD5_trysetroots(void) // ingrain } } -static void atkD6_nop(void) +static void atkD6_setaquaring(void) { - gBattlescriptCurrInstr++; + if (gStatuses3[gBattlerAttacker] & STATUS3_AQUA_RING) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + } + else + { + gStatuses3[gBattlerAttacker] |= STATUS3_AQUA_RING; + gBattlescriptCurrInstr += 5; + } } static void atkD7_setyawn(void) diff --git a/src/battle_util.c b/src/battle_util.c index 995ccf5b1c..841325cf39 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -758,6 +758,7 @@ enum ENDTURN_SANDSTORM, ENDTURN_SUN, ENDTURN_HAIL, + ENDTURN_GRAVITY, ENDTURN_WATER_SPORT, ENDTURN_MUD_SPORT, ENDTURN_TRICK_ROOM, @@ -1167,6 +1168,15 @@ u8 DoFieldEndTurnEffects(void) } 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_FIELD_COUNT: effect++; break; From fcca2afc81f0c3157c1e60d27927ec6233bf8505 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 21 Jul 2018 21:58:07 +0200 Subject: [PATCH 032/667] More gen4 move effects battlescrips. --- asm/macros/battle_script.inc | 27 ++-- data/battle_scripts_1.s | 172 +++++++++++++++++++----- include/battle.h | 2 - include/constants/battle.h | 2 + include/constants/battle_move_effects.h | 16 ++- src/battle_message.c | 8 ++ src/battle_script_commands.c | 129 ++++++++++++++---- 7 files changed, 279 insertions(+), 77 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index e79afe0cd0..9dac5beff4 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -560,7 +560,7 @@ .macro setgravity ptr .byte 0x69 - .word \ptr + .4byte \ptr .endm .macro removeitem bank @@ -864,7 +864,7 @@ .macro settailwind ptr .byte 0xac - .word \ptr + .4byte \ptr .endm .macro tryspiteppreduce param0 @@ -911,7 +911,7 @@ .macro setembargo ptr .byte 0xb6 - .word \ptr + .4byte \ptr .endm .macro presentdamagecalculation @@ -1051,14 +1051,14 @@ .4byte \param1 .endm - .macro trysetroots param0 + .macro settoxicspikes ptr .byte 0xd5 - .4byte \param0 + .4byte \ptr .endm - .macro setaquaring ptr + .macro setgastroacid ptr .byte 0xd6 - .word \ptr + .4byte \ptr .endm .macro setyawn param0 @@ -1071,7 +1071,7 @@ .4byte \param0 .endm - .macro nop_D9 + .macro setroom .byte 0xd9 .endm @@ -1085,13 +1085,15 @@ .4byte \param0 .endm - .macro trysetgrudge param0 + .macro setstealthrock param0 .byte 0xdc .4byte \param0 .endm - .macro nop_DD + .macro setuserstatus3 flags ptr .byte 0xdd + .4byte \flags + .4byte \ptr .endm .macro asistattackselect param0 @@ -1216,6 +1218,11 @@ .byte \param0 .endm + .macro settelekinesis ptr + .byte 0xf9 + .4byte \ptr + .endm + @ various command changed to more readable macros .macro cancelmultiturnmoves bank various \bank, VARIOUS_CANCEL_MULTI_TURN_MOVES diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 669e27f8f0..3feef40568 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -237,7 +237,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectAssurance .4byte BattleScript_EffectTrump_card .4byte BattleScript_EffectAcrobatics - .4byte BattleScript_EffectHeat_crash + .4byte BattleScript_EffectHeatCrash .4byte BattleScript_EffectPunishment .4byte BattleScript_EffectStoredPower .4byte BattleScript_EffectElectroBall @@ -257,12 +257,90 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .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 + +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 STRINGID_POINTEDSTONESFLOAT + attackanimation + waitanimation + printstring STRINGID_POISONSPIKESSCATTERED + 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 - setaquaring BattleScript_ButItFailed + setuserstatus3 STATUS3_AQUA_RING BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNSURROUNDEDWITHVEILOFWATER @@ -319,18 +397,8 @@ BattleScript_EffectRoost: setroost goto BattleScript_PresentHealTarget -BattleScript_EffectSpeedUp: -BattleScript_EffectSpecialDefenseUp: -BattleScript_EffectAccuracyUp: BattleScript_EffectAlwaysHit: -BattleScript_EffectSpecialAttackDown: -BattleScript_EffectSpecialDefenseDown: BattleScript_EffectPlaceholder43: -BattleScript_EffectAccuracyUp2: -BattleScript_EffectEvasionUp2: -BattleScript_EffectSpecialAttackDown2: -BattleScript_EffectAccuracyDown2: -BattleScript_EffectEvasionDown2: BattleScript_EffectEvasionDownHit: BattleScript_EffectVitalThrow: BattleScript_EffectUnused60: @@ -360,7 +428,7 @@ BattleScript_EffectHex: BattleScript_EffectAssurance: BattleScript_EffectTrump_card: BattleScript_EffectAcrobatics: -BattleScript_EffectHeat_crash: +BattleScript_EffectHeatCrash: BattleScript_EffectPunishment: BattleScript_EffectStoredPower: BattleScript_EffectElectroBall: @@ -621,6 +689,18 @@ BattleScript_EffectDefenseUp:: 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 @@ -651,25 +731,33 @@ BattleScript_StatUp:: 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_EffectSpecialAttackDown: + setstatchanger STAT_SPATK, 1, TRUE + goto BattleScript_EffectStatDown -BattleScript_EffectEvasionDown:: +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 accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -1083,6 +1171,14 @@ BattleScript_EffectSpecialAttackUp2:: 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 @@ -1095,21 +1191,33 @@ 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 @@ -2471,7 +2579,7 @@ BattleScript_EffectWish:: waitanimation goto BattleScript_MoveEnd -BattleScript_EffectAssist:: +BattleScript_EffectAssist: attackcanceler attackstring asistattackselect BattleScript_ButItFailedPpReduce @@ -2481,22 +2589,22 @@ BattleScript_EffectAssist:: setbyte sB_ANIM_TARGETS_HIT, 0x0 jumptorandomattack 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_EffectMagicCoat: attackcanceler trysetmagiccoat BattleScript_ButItFailedAtkStringPpReduce attackstring @@ -2615,7 +2723,7 @@ BattleScript_EffectImprison:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectRefresh:: +BattleScript_EffectRefresh: attackcanceler attackstring ppreduce @@ -2627,18 +2735,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 diff --git a/include/battle.h b/include/battle.h index c534d6745c..1753c9a3eb 100644 --- a/include/battle.h +++ b/include/battle.h @@ -253,8 +253,6 @@ struct SideTimer /*0x09*/ u8 followmeTarget; /*0x0A*/ u8 spikesAmount; u8 toxicSpikesAmount; - bool8 stealthRock; - bool8 stickyWeb; u8 auroraVeilTimer; u8 auroraVeilBattlerId; u8 tailwindTimer; diff --git a/include/constants/battle.h b/include/constants/battle.h index 7b0b003564..74544ddc43 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -198,6 +198,8 @@ #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) // Field affecting statuses. #define STATUS_FIELD_MAGIC_ROOM 0x1 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index d1fbe40791..72b569e62c 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -22,8 +22,8 @@ #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 @@ -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_UNUSED_8D 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 @@ -246,5 +246,13 @@ #define EFFECT_TAILWIND 240 #define EFFECT_EMBARGO 241 #define EFFECT_AQUA_RING 242 +#define EFFECT_TRICK_TOOM 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 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/src/battle_message.c b/src/battle_message.c index d5e78aff18..cd6cb83352 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -1304,6 +1304,14 @@ const u16 gTrappingMoves[] = MOVE_BIND, MOVE_WRAP, MOVE_FIRE_SPIN, MOVE_CLAMP, MOVE_WHIRLPOOL, MOVE_SAND_TOMB, 0xFFFF }; +const u16 gRoomsStringIds[] = +{ + STRINGID_PKMNTWISTEDDIMENSIONS, STRINGID_TRICKROOMENDS, + STRINGID_SWAPSDEFANDSPDEFOFALLPOKEMON, STRINGID_WONDERROOMENDS, + STRINGID_HELDITEMSLOSEEFFECTS, STRINGID_MAGICROOMENDS, + STRINGID_EMPTYSTRING3 +}; + 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}!{UNKNOWN_A}\p"); const u8 gText_PkmnStoppedEvolving[] = _("Huh? {STR_VAR_1}\nstopped evolving!\p"); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a798600fb3..339b571f22 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -304,15 +304,15 @@ static void atkD1_trysethelpinghand(void); static void atkD2_tryswapitems(void); static void atkD3_trycopyability(void); static void atkD4_trywish(void); -static void atkD5_trysetroots(void); -static void atkD6_setaquaring(void); +static void atkD5_settoxicspikes(void); +static void atkD6_setgastroacid(void); static void atkD7_setyawn(void); static void atkD8_setdamagetohealthdifference(void); -static void atkD9_nop(void); +static void atkD9_setroom(void); static void atkDA_tryswapabilities(void); static void atkDB_tryimprision(void); -static void atkDC_trysetgrudge(void); -static void atkDD_nop(void); +static void atkDC_setstealthrock(void); +static void atkDD_setuserstatus3(void); static void atkDE_asistattackselect(void); static void atkDF_trysetmagiccoat(void); static void atkE0_trysetsnatch(void); @@ -340,6 +340,7 @@ static void atkF5_removeattackerstatus1(void); static void atkF6_finishaction(void); static void atkF7_finishturn(void); static void atkF8_trainerslideout(void); +static void atkF9_settelekinesis(void); void (* const gBattleScriptingCommandsTable[])(void) = { @@ -556,15 +557,15 @@ void (* const gBattleScriptingCommandsTable[])(void) = atkD2_tryswapitems, atkD3_trycopyability, atkD4_trywish, - atkD5_trysetroots, - atkD6_setaquaring, + atkD5_settoxicspikes, + atkD6_setgastroacid, atkD7_setyawn, atkD8_setdamagetohealthdifference, - atkD9_nop, + atkD9_setroom, atkDA_tryswapabilities, atkDB_tryimprision, - atkDC_trysetgrudge, - atkDD_nop, + atkDC_setstealthrock, + atkDD_setuserstatus3, atkDE_asistattackselect, atkDF_trysetmagiccoat, atkE0_trysetsnatch, @@ -591,7 +592,8 @@ void (* const gBattleScriptingCommandsTable[])(void) = atkF5_removeattackerstatus1, atkF6_finishaction, atkF7_finishturn, - atkF8_trainerslideout + atkF8_trainerslideout, + atkF9_settelekinesis, }; struct StatFractions @@ -9206,29 +9208,40 @@ static void atkD4_trywish(void) } } -static void atkD5_trysetroots(void) // ingrain +static void atkD5_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 atkD6_setaquaring(void) +static void atkD6_setgastroacid(void) { - if (gStatuses3[gBattlerAttacker] & STATUS3_AQUA_RING) + switch (gBattleMons[gBattlerTarget].ability) { + 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); - } - else - { - gStatuses3[gBattlerAttacker] |= STATUS3_AQUA_RING; + break; + default: + gStatuses3[gBattlerTarget] |= STATUS3_GASTRO_ACID; gBattlescriptCurrInstr += 5; + break; } } @@ -9259,8 +9272,39 @@ static void atkD8_setdamagetohealthdifference(void) } } -static void atkD9_nop(void) +static void HandleRoomMove(u32 statusFlag, u8 *timer, u8 stringId) { + if (gFieldStatuses & statusFlag) + { + gFieldStatuses &= ~(statusFlag); + *timer = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = stringId + 1; + } + else + { + gFieldStatuses |= statusFlag; + *timer = 5; + gBattleCommunication[MULTISTRING_CHOOSER] = stringId; + } +} + +static void atkD9_setroom(void) +{ + switch (gCurrentMove) + { + case MOVE_TRICK_ROOM: + HandleRoomMove(STATUS_FIELD_TRICK_ROOM, &gFieldTimers.trickRoomTimer, 0); + break; + case MOVE_WONDER_ROOM: + HandleRoomMove(STATUS_FIELD_WONDER_ROOM, &gFieldTimers.wonderRoomTimer, 2); + break; + case MOVE_MAGIC_ROOM: + HandleRoomMove(STATUS_FIELD_MAGIC_ROOM, &gFieldTimers.magicRoomTimer, 4); + break; + default: + gBattleCommunication[MULTISTRING_CHOOSER] = 6; + break; + } gBattlescriptCurrInstr++; } @@ -9280,7 +9324,7 @@ static void atkDA_tryswapabilities(void) // skill swap gBattleMons[gBattlerAttacker].ability = gBattleMons[gBattlerTarget].ability; gBattleMons[gBattlerTarget].ability = abilityAtk; - gBattlescriptCurrInstr += 5; + gBattlescriptCurrInstr += 5; } } @@ -9321,27 +9365,38 @@ static void atkDB_tryimprision(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 atkDC_trysetgrudge(void) +static void atkDC_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; gBattlescriptCurrInstr += 5; } } -static void atkDD_nop(void) +static void atkDD_setuserstatus3(void) { - gBattlescriptCurrInstr++; + u32 flags = T1_READ_32(gBattlescriptCurrInstr + 1); + + if (gStatuses3[gBattlerAttacker] & flags) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 5); + } + else + { + gStatuses3[gBattlerAttacker] |= flags; + gBattlescriptCurrInstr += 9; + } } static void atkDE_asistattackselect(void) @@ -9356,7 +9411,7 @@ static void atkDE_asistattackselect(void) else party = gPlayerParty; - for (monId = 0; monId < 6; monId++) + for (monId = 0; monId < PARTY_SIZE; monId++) { if (monId == gBattlerPartyIndexes[gBattlerAttacker]) continue; @@ -10176,3 +10231,19 @@ static void atkF8_trainerslideout(void) gBattlescriptCurrInstr += 2; } + +static void atkF9_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; + } +} From 4ec43cbed17145f6c10071350f312ce2c2ed2a00 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 21 Jul 2018 23:12:10 +0200 Subject: [PATCH 033/667] Gen 5 move names, telekinesis, power/guard split/swap --- asm/macros/battle_script.inc | 10 +++ data/battle_scripts_1.s | 77 +++++++++++++++++++- data/text/move_names.inc | 93 +++++++++++++++++++++++++ include/constants/battle_move_effects.h | 5 ++ include/data/battle_moves.h | 2 +- src/battle_debug.c | 2 +- src/battle_script_commands.c | 29 ++++++++ 7 files changed, 215 insertions(+), 3 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 9dac5beff4..66d989b9d5 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1223,6 +1223,16 @@ .4byte \ptr .endm + .macro swapstatstages stat + .byte 0xfa + .byte \stat + .endm + + .macro averagestats stat + .byte 0xfb + .byte \stat + .endm + @ various command changed to more readable macros .macro cancelmultiturnmoves bank various \bank, VARIOUS_CANCEL_MULTI_TURN_MOVES diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 3feef40568..46e4aec6ba 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -265,6 +265,81 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectGastroAcid .4byte BattleScript_EffectStealthRock .4byte BattleScript_EffectTelekinesis + .4byte BattleScript_EffectPowerSwap + .4byte BattleScript_EffectGuardSwap + .4byte BattleScript_EffectHeartSwap + .4byte BattleScript_EffectPowerSplit + .4byte BattleScript_EffectGuardSplit + +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_EffectTelekinesis: attackcanceler @@ -2700,7 +2775,7 @@ BattleScript_EffectEndeavor:: adjustdamage goto BattleScript_HitFromAtkAnimation -BattleScript_EffectSkillSwap:: +BattleScript_EffectSkillSwap: attackcanceler attackstring ppreduce diff --git a/data/text/move_names.inc b/data/text/move_names.inc index 0060c27a5e..0406e53b4d 100644 --- a/data/text/move_names.inc +++ b/data/text/move_names.inc @@ -467,3 +467,96 @@ gMoveNames:: @ 831977C .string "Seed Flare$", 13 .string "Ominous Wind$", 13 .string "Shadow Force$", 13 + .string "Hone Claws$", 13 + .string "Wide Guard$", 13 + .string "Guard Split$", 13 + .string "Power Split$", 13 + .string "Wonder Room$", 13 + .string "Psyshock$", 13 + .string "Venoshock$", 13 + .string "Autotomize$", 13 + .string "Rage Powder$", 13 + .string "Telekinesis$", 13 + .string "Magic Room$", 13 + .string "Smack Down$", 13 + .string "Storm Throw$", 13 + .string "Flame Burst$", 13 + .string "Sludge Wave$", 13 + .string "Quiver Dance$", 13 + .string "Heavy Slam$", 13 + .string "Synchronoise$", 13 + .string "Electro Ball$", 13 + .string "Soak$", 13 + .string "Flame Charge$", 13 + .string "Coil$", 13 + .string "Low Sweep$", 13 + .string "Acid Spray$", 13 + .string "Foul Play$", 13 + .string "Simple Beam$", 13 + .string "Entrainment$", 13 + .string "After You$", 13 + .string "Round$", 13 + .string "Echoed Voice$", 13 + .string "Chip Away$", 13 + .string "Clear Smog$", 13 + .string "Stored Power$", 13 + .string "Quick Guard$", 13 + .string "Ally Switch$", 13 + .string "Scald$", 13 + .string "Shell Smash$", 13 + .string "Heal Pulse$", 13 + .string "Hex$", 13 + .string "Sky Drop$", 13 + .string "Shift Gear$", 13 + .string "Circle Throw$", 13 + .string "Incinerate$", 13 + .string "Quash$", 13 + .string "Acrobatics$", 13 + .string "Reflect Type$", 13 + .string "Retaliate$", 13 + .string "Final Gambit$", 13 + .string "Bestow$", 13 + .string "Inferno$", 13 + .string "Water Pledge$", 13 + .string "Fire Pledge$", 13 + .string "Grass Pledge$", 13 + .string "Volt Switch$", 13 + .string "Struggle Bug$", 13 + .string "Bulldoze$", 13 + .string "Frost Breath$", 13 + .string "Dragon Tail$", 13 + .string "Work Up$", 13 + .string "Electroweb$", 13 + .string "Wild Charge$", 13 + .string "Drill Run$", 13 + .string "Dual Chop$", 13 + .string "Heart Stamp$", 13 + .string "Horn Leech$", 13 + .string "Sacred Sword$", 13 + .string "Razor Shell$", 13 + .string "Heat Crash$", 13 + .string "Leaf Tornado$", 13 + .string "Steamroller$", 13 + .string "Cotton Guard$", 13 + .string "Night Daze$", 13 + .string "Psystrike$", 13 + .string "Tail Slap$", 13 + .string "Hurricane$", 13 + .string "Head Charge$", 13 + .string "Gear Grind$", 13 + .string "Searing Shot$", 13 + .string "Techno Blast$", 13 + .string "Relic Song$", 13 + .string "Secret Sword$", 13 + .string "Glaciate$", 13 + .string "Bolt Strike$", 13 + .string "Blue Flare$", 13 + .string "Fiery Dance$", 13 + .string "Freeze Shock$", 13 + .string "Ice Burn$", 13 + .string "Snarl$", 13 + .string "Icicle Crash$", 13 + .string "V Create$", 13 + .string "Fusion Flare$", 13 + .string "Fusion Bolt$", 13 + .string "Flying Press$", 13 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 72b569e62c..4ee416b3cb 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -254,5 +254,10 @@ #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 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index c70e246153..6cd5cd7095 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -5656,7 +5656,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_POWER_SPLIT - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_POWER_SPLIT, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, diff --git a/src/battle_debug.c b/src/battle_debug.c index 145a408aef..105af0aa5a 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -1134,7 +1134,7 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) break; case LIST_ITEM_MOVES: data->modifyArrows.minValue = 0; - data->modifyArrows.maxValue = MOVES_COUNT - 1; + data->modifyArrows.maxValue = MOVES_COUNT_GEN5 - 1; data->modifyArrows.maxDigits = 3; data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].moves[data->currentSecondaryListItemId]; data->modifyArrows.typeOfVal = VAL_U16; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 339b571f22..f28ec7a802 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -341,6 +341,8 @@ static void atkF6_finishaction(void); static void atkF7_finishturn(void); static void atkF8_trainerslideout(void); static void atkF9_settelekinesis(void); +static void atkFA_swapstatstages(void); +static void atkFB_averagestats(void); void (* const gBattleScriptingCommandsTable[])(void) = { @@ -594,6 +596,8 @@ void (* const gBattleScriptingCommandsTable[])(void) = atkF7_finishturn, atkF8_trainerslideout, atkF9_settelekinesis, + atkFA_swapstatstages, + atkFB_averagestats, }; struct StatFractions @@ -10247,3 +10251,28 @@ static void atkF9_settelekinesis(void) gBattlescriptCurrInstr += 5; } } + +static void atkFA_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 atkFB_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; +} From 51dc76c7e8772c53dadf9b54c27db27dfdcb534d Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 22 Jul 2018 15:08:32 +0200 Subject: [PATCH 034/667] Captivate and new accuracy calc --- asm/macros/battle_script.inc | 5 ++ data/battle_scripts_1.s | 14 +++- include/battle_util.h | 1 + include/constants/battle_move_effects.h | 2 +- src/battle_script_commands.c | 90 +++++++++++++++++-------- 5 files changed, 80 insertions(+), 32 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 66d989b9d5..f3507ee79a 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1233,6 +1233,11 @@ .byte \stat .endm + .macro jumpifoppositegenders ptr + .byte 0xfc + .4byte \ptr + .endm + @ various command changed to more readable macros .macro cancelmultiturnmoves bank various \bank, VARIOUS_CANCEL_MULTI_TURN_MOVES diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 46e4aec6ba..cea7b1d748 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -145,7 +145,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 @@ -471,6 +471,16 @@ BattleScript_EffectRoost: tryhealhalfhealth BattleScript_AlreadyAtFullHp, BS_TARGET setroost goto BattleScript_PresentHealTarget + +BattleScript_EffectCaptivate: + setstatchanger STAT_SPATK, 2, TRUE + attackcanceler + jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailedAtkStringPpReduce + jumpifoppositegenders BattleScript_CaptivateCheckAcc + goto BattleScript_ButItFailedAtkStringPpReduce +BattleScript_CaptivateCheckAcc: + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + goto BattleScript_StatDownFromAttackString BattleScript_EffectAlwaysHit: BattleScript_EffectPlaceholder43: @@ -481,7 +491,6 @@ BattleScript_EffectFalseSwipe: BattleScript_EffectPlaceholder103: BattleScript_EffectUnused6e: BattleScript_EffectPursuit: -BattleScript_EffectUnused83: BattleScript_EffectUnused8d: BattleScript_EffectUnusedA3: BattleScript_EffectPlaceholder200: @@ -836,6 +845,7 @@ BattleScript_EffectStatDown: attackcanceler jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailedAtkStringPpReduce accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE +BattleScript_StatDownFromAttackString: attackstring ppreduce statbuffchange 0x1, BattleScript_StatDownEnd diff --git a/include/battle_util.h b/include/battle_util.h index 28d5f65f5d..2086de722a 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -77,6 +77,7 @@ 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); diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 4ee416b3cb..200ad6ff95 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -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 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f28ec7a802..c972144251 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -343,6 +343,7 @@ static void atkF8_trainerslideout(void); static void atkF9_settelekinesis(void); static void atkFA_swapstatstages(void); static void atkFB_averagestats(void); +static void atkFC_jumpifoppositegenders(void); void (* const gBattleScriptingCommandsTable[])(void) = { @@ -598,6 +599,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atkF9_settelekinesis, atkFA_swapstatstages, atkFB_averagestats, + atkFC_jumpifoppositegenders, }; struct StatFractions @@ -1063,6 +1065,11 @@ static bool8 AccuracyCalcHelper(u16 move) JumpIfMoveFailed(7, move); return TRUE; } + else if (gBattleMoves[move].effect == EFFECT_TOXIC && IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_POISON)) + { + JumpIfMoveFailed(7, move); + return TRUE; + } if (!(gHitMarker & HITMARKER_IGNORE_ON_AIR) && gStatuses3[gBattlerTarget] & STATUS3_ON_AIR) { @@ -1116,9 +1123,9 @@ static void atk01_accuracycheck(void) } else { - u8 type, moveAcc, holdEffect, param; - s8 buff; - u16 calc; + u8 type, moveAcc, atkHoldEffect, atkParam, defHoldEffect, defParam, atkAbility, defAbility; + s8 buff, accStage, evasionStage; + u32 calc; if (move == 0) move = gCurrentMove; @@ -1130,16 +1137,22 @@ static void atk01_accuracycheck(void) if (AccuracyCalcHelper(move)) return; - if (gBattleMons[gBattlerTarget].status2 & STATUS2_FORESIGHT) - { - u8 acc = gBattleMons[gBattlerAttacker].statStages[STAT_ACC]; - buff = acc; - } + atkAbility = GetBattlerAbility(gBattlerAttacker); + defAbility = GetBattlerAbility(gBattlerTarget); + + accStage = gBattleMons[gBattlerAttacker].statStages[STAT_ACC]; + evasionStage = gBattleMons[gBattlerTarget].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[gBattlerTarget].status2 & STATUS2_FORESIGHT || gStatuses3[gBattlerTarget] & STATUS3_MIRACLE_EYED) + buff = accStage; else - { - u8 acc = gBattleMons[gBattlerAttacker].statStages[STAT_ACC]; - buff = acc + 6 - gBattleMons[gBattlerTarget].statStages[STAT_EVASION]; - } + buff = accStage + 6 - evasionStage; if (buff < 0) buff = 0; @@ -1154,29 +1167,37 @@ static void atk01_accuracycheck(void) calc = sAccuracyStageRatios[buff].dividend * moveAcc; calc /= sAccuracyStageRatios[buff].divisor; - if (gBattleMons[gBattlerAttacker].ability == ABILITY_COMPOUND_EYES) + if (atkAbility == 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 + else if (atkAbility == ABILITY_VICTORY_STAR) + calc = (calc * 110) / 100; // 1.1 victory star boost + if (IsBattlerAlive(BATTLE_PARTNER(gBattlerAttacker)) && GetBattlerAbility(BATTLE_PARTNER(gBattlerAttacker)) == ABILITY_VICTORY_STAR) + calc = (calc * 110) / 100; // 1.1 ally's victory star boost - if (gBattleMons[gBattlerAttacker].ability == ABILITY_HUSTLE && IS_MOVE_PHYSICAL(move)) + 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[gBattlerTarget].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 (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); - } - + defHoldEffect = GetBattlerHoldEffect(gBattlerTarget, TRUE); + defParam = GetBattlerHoldEffectParam(gBattlerTarget); gPotentialItemEffectBattler = gBattlerTarget; - if (holdEffect == HOLD_EFFECT_EVASION_UP) - calc = (calc * (100 - param)) / 100; + atkHoldEffect = GetBattlerHoldEffect(gBattlerAttacker, TRUE); + atkParam = GetBattlerHoldEffectParam(gBattlerAttacker); + + 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(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)); + calc = (calc * (100 + atkParam)) / 100; // final calculation if ((Random() % 100 + 1) > calc) @@ -10276,3 +10297,14 @@ static void atkFB_averagestats(void) gBattlescriptCurrInstr += 2; } + +static void atkFC_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; +} From fee81d03abd96f68809fdaf67bb2f8502c0ef86c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 22 Jul 2018 18:40:18 +0200 Subject: [PATCH 035/667] A couple of gen4 abilities --- asm/macros/battle_script.inc | 10 +- data/battle_scripts_1.s | 64 + include/battle_scripts.h | 7 + include/constants/battle_script_commands.h | 2 + include/constants/battle_string_ids.h | 6 +- src/battle_message.c | 17 +- src/battle_script_commands.c | 47 +- src/battle_util.c | 1504 +++++++++++--------- 8 files changed, 934 insertions(+), 723 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index f3507ee79a..3b67ac7315 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -589,7 +589,7 @@ .byte \bank .endm - .macro recordlastability bank + .macro recordability bank .byte 0x70 .byte \bank .endm @@ -1347,6 +1347,14 @@ various \bank, VARIOUS_PLAY_TRAINER_DEFEATED_MUSIC .endm + .macro stattextbuffer battler + various \battler, VARIOUS_STAT_TEXT_BUFFER + .endm + + .macro switchinabilities battler + various \battler, VARIOUS_SWITCHIN_ABILITIES + .endm + @ helpful macros .macro setstatchanger stat, stages, down setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index cea7b1d748..5d39fae94d 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4108,6 +4108,16 @@ BattleScript_DoTurnDmg:: atk24 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:: printstring STRINGID_PKMNHURTBYBURN @@ -4142,7 +4152,20 @@ BattleScript_MoveUsedIsParalyzed:: 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 | 0x1, BattleScript_MoveUsedFlinchedEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_MoveUsedFlinchedEnd + setgraphicalstatchangevalues + playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + setbyte gBattleCommunication STAT_SPEED + stattextbuffer BS_ATTACKER + printstring STRINGID_TARGETABILITYSTATRAISE + waitmessage 0x40 + goto BattleScript_MoveUsedFlinchedEnd BattleScript_PrintUproarOverTurns:: printfromtable gUproarOverTurnStringIds @@ -4354,6 +4377,7 @@ BattleScript_TraceActivates:: pause 0x20 printstring STRINGID_PKMNTRACED waitmessage 0x40 + switchinabilities BS_ATTACKER end3 BattleScript_RainDishActivates:: @@ -4470,6 +4494,18 @@ BattleScript_MoveHPDrain:: waitmessage 0x40 orhalfword gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE goto BattleScript_MoveEnd + +BattleScript_MoveStatDrain_PPLoss:: + ppreduce +BattleScript_MoveStatDrain:: + attackstring + pause 0x20 + setgraphicalstatchangevalues + playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + waitanimation + printstring STRINGID_TARGETABILITYSTATRAISE + waitmessage 0x40 + goto BattleScript_MoveEnd BattleScript_MonMadeMoveUseless_PPLoss:: ppreduce @@ -4563,6 +4599,34 @@ BattleScript_ColorChangeActivates:: printstring STRINGID_PKMNCHANGEDTYPEWITH waitmessage 0x40 return + +BattleScript_AngryPointActivates:: + setbyte sB_ANIM_ARG1 0x38 + setbyte sB_ANIM_ARG2 0x0 + playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + printstring STRINGID_ANGRYPOINTACTIVATES + waitmessage 0x40 + return + +BattleScript_TargetAbilityStatRaise:: + setgraphicalstatchangevalues + playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + waitanimation + printstring STRINGID_TARGETABILITYSTATRAISE + waitmessage 0x40 + return + +BattleScript_AttackerAbilityStatRaise:: + setgraphicalstatchangevalues + playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 + waitanimation + printstring STRINGID_ATTACKERABILITYSTATRAISE + waitmessage 0x40 + return + +BattleScript_AttackerAbilityStatRaiseEnd3:: + call BattleScript_AttackerAbilityStatRaise + end3 BattleScript_RoughSkinActivates:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index a8789c0a17..520e32b00e 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -305,5 +305,12 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index d13ee7d812..3e1906442b 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -72,6 +72,8 @@ #define VARIOUS_RETURN_OPPONENT_MON2 20 #define VARIOUS_SET_TELEPORT_OUTCOME 25 #define VARIOUS_PLAY_TRAINER_DEFEATED_MUSIC 26 +#define VARIOUS_STAT_TEXT_BUFFER 27 +#define VARIOUS_SWITCHIN_ABILITIES 28 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 98e8940f20..c2fc1ca108 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -450,7 +450,11 @@ #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 BATTLESTRINGS_COUNT 438 +#define BATTLESTRINGS_COUNT 442 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_message.c b/src/battle_message.c index cd6cb83352..213770fdd9 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -431,7 +431,7 @@ 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[] = _("!"); @@ -586,6 +586,8 @@ 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_ATK_ABILITY}\n raised its {B_BUFF1}!"); +static const u8 sText_AttackerAbilityRaisedStat[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_ATK_ABILITY}\n raised its {B_BUFF1}!"); // These strings are currently placeholders, to be fixed. static const u8 sText_AuroraVeilEnds[] = _(""); @@ -593,6 +595,8 @@ static const u8 sText_ElectricTerrainEnds[] = _(""); static const u8 sText_MistyTerrainEnds[] = _(""); static const u8 sText_PsychicTerrainEnds[] = _(""); static const u8 sText_GrassyTerrainEnds[] = _(""); +static const u8 sText_AngryPointActivates[] = _(""); +static const u8 sText_PoisonHealHpUp[] = _(""); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { @@ -1035,6 +1039,10 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_MistyTerrainEnds, // 447 sText_PsychicTerrainEnds, // 448 sText_GrassyTerrainEnds, // 449 + sText_TargetAbilityRaisedStat, // 450 + sText_AngryPointActivates, // 451 + sText_AttackerAbilityRaisedStat, // 452 + sText_PoisonHealHpUp, // 453 }; const u16 gMissStringIds[] = @@ -2297,14 +2305,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 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c972144251..fd95bbb280 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -203,7 +203,7 @@ static void atk6C_drawlvlupbox(void); static void atk6D_resetsentmonsvalue(void); static void atk6E_setatktoplayer0(void); static void atk6F_makevisible(void); -static void atk70_recordlastability(void); +static void atk70_recordability(void); static void atk71_buffermovetolearn(void); static void atk72_jumpifplayerran(void); static void atk73_hpthresholds(void); @@ -459,7 +459,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atk6D_resetsentmonsvalue, atk6E_setatktoplayer0, atk6F_makevisible, - atk70_recordlastability, + atk70_recordability, atk71_buffermovetolearn, atk72_jumpifplayerran, atk73_hpthresholds, @@ -1013,22 +1013,23 @@ static void atk00_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 atk40_jumpifaffectedbyprotect(void) @@ -1058,7 +1059,7 @@ 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) { @@ -1070,6 +1071,18 @@ static bool8 AccuracyCalcHelper(u16 move) 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) { @@ -6242,11 +6255,11 @@ static void atk6F_makevisible(void) gBattlescriptCurrInstr += 2; } -static void atk70_recordlastability(void) +static void atk70_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) @@ -6502,6 +6515,13 @@ static void atk76_various(void) BtlController_EmitPlayFanfareOrBGM(0, MUS_KACHI1, 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); + return; } gBattlescriptCurrInstr += 3; @@ -7158,6 +7178,9 @@ static void atk8D_setmultihitcounter(void) gMultiHitCounter = (Random() & 3) + 2; else gMultiHitCounter += 2; + + if (GetBattlerAbility(gBattlerAttacker) == ABILITY_SKILL_LINK) + gMultiHitCounter = 5; } gBattlescriptCurrInstr += 2; diff --git a/src/battle_util.c b/src/battle_util.c index 841325cf39..f90f08bd6c 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1230,6 +1230,7 @@ u8 DoBattlerEndTurnEffects(void) } else { + u8 ability = GetBattlerAbility(gActiveBattler); switch (gBattleStruct->turnEffectsTracker) { case ENDTURN_INGRAIN: // ingrain @@ -1294,32 +1295,68 @@ u8 DoBattlerEndTurnEffects(void) gBattleStruct->turnEffectsTracker++; break; case ENDTURN_POISON: // poison - if ((gBattleMons[gActiveBattler].status1 & STATUS1_POISON) && gBattleMons[gActiveBattler].hp != 0) + if ((gBattleMons[gActiveBattler].status1 & STATUS1_POISON) + && gBattleMons[gActiveBattler].hp != 0 + && ability != ABILITY_MAGIC_GUARD) { - gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - BattleScriptExecute(BattleScript_PoisonTurnDmg); - effect++; + if (ability == ABILITY_POISON_HEAL) + { + if (!BATTLER_MAX_HP(gActiveBattler)) + { + gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage *= -1; + BattleScriptExecute(BattleScript_PoisonHealActivates); + effect++; + } + } + else + { + gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + BattleScriptExecute(BattleScript_PoisonTurnDmg); + effect++; + } } gBattleStruct->turnEffectsTracker++; break; case ENDTURN_BAD_POISON: // toxic poison - if ((gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_POISON) && gBattleMons[gActiveBattler].hp != 0) + if ((gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_POISON) + && gBattleMons[gActiveBattler].hp != 0 + && ability != ABILITY_MAGIC_GUARD) { - gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - if ((gBattleMons[gActiveBattler].status1 & 0xF00) != 0xF00) // not 16 turns - gBattleMons[gActiveBattler].status1 += 0x100; - gBattleMoveDamage *= (gBattleMons[gActiveBattler].status1 & 0xF00) >> 8; - BattleScriptExecute(BattleScript_PoisonTurnDmg); - effect++; + if (ability == ABILITY_POISON_HEAL) + { + if (!BATTLER_MAX_HP(gActiveBattler)) + { + 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) + gBattleMoveDamage = 1; + if ((gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_COUNTER) != STATUS1_TOXIC_COUNTER) // not 16 turns + gBattleMons[gActiveBattler].status1 += 0x100; + gBattleMoveDamage *= (gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_COUNTER) >> 8; + BattleScriptExecute(BattleScript_PoisonTurnDmg); + effect++; + } } gBattleStruct->turnEffectsTracker++; break; case ENDTURN_BURN: // burn - if ((gBattleMons[gActiveBattler].status1 & STATUS1_BURN) && gBattleMons[gActiveBattler].hp != 0) + if ((gBattleMons[gActiveBattler].status1 & STATUS1_BURN) + && gBattleMons[gActiveBattler].hp != 0 + && ability != ABILITY_MAGIC_GUARD) { gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; if (gBattleMoveDamage == 0) @@ -1330,7 +1367,9 @@ u8 DoBattlerEndTurnEffects(void) gBattleStruct->turnEffectsTracker++; break; case ENDTURN_NIGHTMARES: // spooky nightmares - if ((gBattleMons[gActiveBattler].status2 & STATUS2_NIGHTMARE) && gBattleMons[gActiveBattler].hp != 0) + if ((gBattleMons[gActiveBattler].status2 & STATUS2_NIGHTMARE) + && gBattleMons[gActiveBattler].hp != 0 + && ability != ABILITY_MAGIC_GUARD) { // 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. @@ -1350,7 +1389,9 @@ u8 DoBattlerEndTurnEffects(void) gBattleStruct->turnEffectsTracker++; break; case ENDTURN_CURSE: // curse - if ((gBattleMons[gActiveBattler].status2 & STATUS2_CURSED) && gBattleMons[gActiveBattler].hp != 0) + if ((gBattleMons[gActiveBattler].status2 & STATUS2_CURSED) + && gBattleMons[gActiveBattler].hp != 0 + && ability != ABILITY_MAGIC_GUARD) { gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 4; if (gBattleMoveDamage == 0) @@ -2263,740 +2304,797 @@ u8 CastformDataTypeChange(u8 battler) 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; + u32 i; + u32 move; + u8 side; + u8 target1; + + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + return; 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; + + gLastUsedAbility = GetBattlerAbility(battler); + + if (moveArg) + move = moveArg; else - pokeAtk = &gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker]]; + move = gCurrentMove; - if (gBattlerTarget >= gBattlersCount) - gBattlerTarget = battler; + GET_MOVE_TYPE(move, moveType); - if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER) - pokeDef = &gPlayerParty[gBattlerPartyIndexes[gBattlerTarget]]; - else - pokeDef = &gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]]; - - speciesAtk = GetMonData(pokeAtk, MON_DATA_SPECIES); - pidAtk = GetMonData(pokeAtk, MON_DATA_PERSONALITY); - - 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 + 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 (weather_get_current()) { - switch (weather_get_current()) + case 3: + case 5: + case 13: + if (!(gBattleWeather & WEATHER_RAIN_ANY)) { - case 3: - case 5: - case 13: - if (!(gBattleWeather & WEATHER_RAIN_ANY)) - { - gBattleWeather = (WEATHER_RAIN_TEMPORARY | WEATHER_RAIN_PERMANENT); - gBattleScripting.animArg1 = B_ANIM_RAIN_CONTINUES; - gBattleScripting.battler = battler; - effect++; - } - break; - case 8: - if (!(gBattleWeather & WEATHER_SANDSTORM_ANY)) - { - gBattleWeather = (WEATHER_SANDSTORM_PERMANENT | WEATHER_SANDSTORM_TEMPORARY); - gBattleScripting.animArg1 = B_ANIM_SANDSTORM_CONTINUES; - gBattleScripting.battler = battler; - effect++; - } - break; - case 12: - 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] = weather_get_current(); - BattleScriptPushCursorAndCallback(BattleScript_OverworldWeatherStarts); - } - break; - case ABILITY_DRIZZLE: - if (!(gBattleWeather & WEATHER_RAIN_PERMANENT)) - { - gBattleWeather = (WEATHER_RAIN_PERMANENT | WEATHER_RAIN_TEMPORARY); - BattleScriptPushCursorAndCallback(BattleScript_DrizzleActivates); - gBattleScripting.battler = battler; - 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); - 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] < 0xC && gDisableStructs[battler].isFirstTurn != 2) - { - gBattleMons[battler].statStages[STAT_SPEED]++; - gBattleScripting.animArg1 = 0x11; - gBattleScripting.animArg2 = 0; - BattleScriptPushCursorAndCallback(BattleScript_SpeedBoostActivates); + gBattleWeather = (WEATHER_RAIN_TEMPORARY | WEATHER_RAIN_PERMANENT); + gBattleScripting.animArg1 = B_ANIM_RAIN_CONTINUES; gBattleScripting.battler = battler; effect++; } break; - case ABILITY_TRUANT: - gDisableStructs[gBattlerAttacker].truantCounter ^= 1; + case 8: + if (!(gBattleWeather & WEATHER_SANDSTORM_ANY)) + { + gBattleWeather = (WEATHER_SANDSTORM_PERMANENT | WEATHER_SANDSTORM_TEMPORARY); + gBattleScripting.animArg1 = B_ANIM_SANDSTORM_CONTINUES; + gBattleScripting.battler = battler; + effect++; + } + break; + case 12: + if (!(gBattleWeather & WEATHER_SUN_ANY)) + { + gBattleWeather = (WEATHER_SUN_PERMANENT | WEATHER_SUN_TEMPORARY); + gBattleScripting.animArg1 = B_ANIM_SUN_CONTINUES; + gBattleScripting.battler = battler; + effect++; + } break; } } - break; - case ABILITYEFFECT_MOVES_BLOCK: // 2 - if (gLastUsedAbility == ABILITY_SOUNDPROOF) + if (effect) { - for (i = 0; sSoundMovesTable[i] != 0xFFFF; i++) + gBattleCommunication[MULTISTRING_CHOOSER] = weather_get_current(); + BattleScriptPushCursorAndCallback(BattleScript_OverworldWeatherStarts); + } + break; + case ABILITY_DOWNLOAD: + { + u8 statId; + u32 opposingBattler = BATTLE_OPPOSITE(battler); + u32 opposingDef = gBattleMons[opposingBattler].defense + * gStatStageRatios[gBattleMons[opposingBattler].statStages[STAT_DEF]][0] + / gStatStageRatios[gBattleMons[opposingBattler].statStages[STAT_DEF]][1]; + u32 opposingSpDef = gBattleMons[opposingBattler].spDefense + * gStatStageRatios[gBattleMons[opposingBattler].statStages[STAT_SPDEF]][0] + / gStatStageRatios[gBattleMons[opposingBattler].statStages[STAT_SPDEF]][1]; + + opposingBattler = BATTLE_PARTNER(opposingBattler); + if (IsBattlerAlive(opposingBattler)) { - if (sSoundMovesTable[i] == move) - break; + 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 (sSoundMovesTable[i] != 0xFFFF) + + if (opposingSpDef > opposingDef) + statId = STAT_SPATK; + else + statId = STAT_ATK; + + if (gBattleMons[battler].statStages[statId] != 0xC) { - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS) - gHitMarker |= HITMARKER_NO_PPDEDUCT; - gBattlescriptCurrInstr = BattleScript_SoundproofProtected; - effect = 1; + gBattleMons[battler].statStages[statId]++; + SET_STATCHANGER(statId, 1, FALSE); + PREPARE_STAT_BUFFER(gBattleTextBuff1, statId); + BattleScriptPushCursorAndCallback(BattleScript_AttackerAbilityStatRaiseEnd3); + effect++; } } break; - case ABILITYEFFECT_ABSORBING: // 3 - if (move) + case ABILITY_DRIZZLE: + if (!(gBattleWeather & WEATHER_RAIN_PERMANENT)) { - 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; - } - } + gBattleWeather = (WEATHER_RAIN_PERMANENT | WEATHER_RAIN_TEMPORARY); + BattleScriptPushCursorAndCallback(BattleScript_DrizzleActivates); + gBattleScripting.battler = battler; + effect++; } break; - case ABILITYEFFECT_CONTACT: // 4 - switch (gLastUsedAbility) + case ABILITY_SAND_STREAM: + if (!(gBattleWeather & WEATHER_SANDSTORM_PERMANENT)) { - 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; + gBattleWeather = (WEATHER_SANDSTORM_PERMANENT | WEATHER_SANDSTORM_TEMPORARY); + BattleScriptPushCursorAndCallback(BattleScript_SandstreamActivates); + gBattleScripting.battler = battler; + effect++; } break; - case ABILITYEFFECT_IMMUNITY: // 5 - for (battler = 0; battler < gBattlersCount; battler++) + case ABILITY_DROUGHT: + if (!(gBattleWeather & WEATHER_SUN_PERMANENT)) { - 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; - } + gBattleWeather = (WEATHER_SUN_PERMANENT | WEATHER_SUN_TEMPORARY); + BattleScriptPushCursorAndCallback(BattleScript_DroughtActivates); + gBattleScripting.battler = battler; + effect++; } break; - case ABILITYEFFECT_FORECAST: // 6 - for (battler = 0; battler < gBattlersCount; battler++) + case ABILITY_INTIMIDATE: + if (!(gSpecialStatuses[battler].intimidatedMon)) { - if (gBattleMons[battler].ability == ABILITY_FORECAST) + gStatuses3[battler] |= STATUS3_INTIMIDATE_POKES; + gSpecialStatuses[battler].intimidatedMon = 1; + } + break; + case ABILITY_FORECAST: + effect = CastformDataTypeChange(battler); + 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(battler); - if (effect) + effect = CastformDataTypeChange(target1); + if (effect != 0) { BattleScriptPushCursorAndCallback(BattleScript_CastformChange); - gBattleScripting.battler = battler; + gBattleScripting.battler = target1; *(&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; - 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_82DB4B8); - 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_82DB4C1; - 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_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_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] < 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_TRUANT: + gDisableStructs[gBattlerAttacker].truantCounter ^= 1; + break; + } + } + break; + case ABILITYEFFECT_MOVES_BLOCK: // 2 + if (gLastUsedAbility == ABILITY_SOUNDPROOF) + { + 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) + { + 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 (moveArg == TYPE_GRASS) + effect = 2, statId = STAT_ATK; + 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; - if (effect && caseID < ABILITYEFFECT_CHECK_OTHER_SIDE && gLastUsedAbility != 0xFF) - RecordAbilityBattle(battler, gLastUsedAbility); + 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) // Drain Hp ability. + { + if (gBattleMons[battler].maxHP == gBattleMons[battler].hp) + { + 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_CONTACT: // 4 + switch (gLastUsedAbility) + { + case ABILITY_ANGER_POINT: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && gIsCriticalHit + && TARGET_TURN_DAMAGED + && IsBattlerAlive(battler) + && gBattleMons[battler].statStages[STAT_ATK] != 0xC) + { + gBattleMons[battler].statStages[STAT_ATK] = 0xC; + 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_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; + 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_82DB4B8); + 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_82DB4C1; + 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_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; } + if (effect && caseID < ABILITYEFFECT_CHECK_OTHER_SIDE && gLastUsedAbility != 0xFF) + RecordAbilityBattle(battler, gLastUsedAbility); + return effect; } From c2f8d176dcae91b1cd8d295c2829bd1f6f45bd6a Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 22 Jul 2018 19:02:41 +0200 Subject: [PATCH 036/667] Trick Room, Stall, Lagging Tail --- src/battle_main.c | 72 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 50 insertions(+), 22 deletions(-) diff --git a/src/battle_main.c b/src/battle_main.c index e66468cafd..fb851aac75 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4679,16 +4679,20 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) u8 strikesFirst = 0; u32 speedBattler1 = 0, speedBattler2 = 0; u16 moveBattler1 = 0, moveBattler2 = 0; + u32 holdEffectBattler1 = 0, holdEffectBattler2 = 0; + bool32 quickClawBattler1 = FALSE, quickClawBattler2 = FALSE; speedBattler1 = GetBattlerTotalSpeedStat(battler1); - if (GetBattlerHoldEffect(battler1, TRUE) == HOLD_EFFECT_QUICK_CLAW + holdEffectBattler1 = GetBattlerHoldEffect(battler1, TRUE); + if (holdEffectBattler1 == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (0xFFFF * GetBattlerHoldEffectParam(battler1)) / 100) - speedBattler1 = UINT_MAX; + quickClawBattler1 = TRUE; speedBattler2 = GetBattlerTotalSpeedStat(battler2); - if (GetBattlerHoldEffect(battler2, TRUE) == HOLD_EFFECT_QUICK_CLAW + holdEffectBattler2 = GetBattlerHoldEffect(battler2, TRUE); + if (holdEffectBattler2 == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (0xFFFF * GetBattlerHoldEffectParam(battler2)) / 100) - speedBattler2 = UINT_MAX; + quickClawBattler2 = TRUE; if (ignoreChosenMoves) { @@ -4718,35 +4722,59 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) moveBattler2 = MOVE_NONE; } - // both move priorities are different than 0 - if (gBattleMoves[moveBattler1].priority != 0 || gBattleMoves[moveBattler2].priority != 0) + + if (gBattleMoves[moveBattler1].priority == gBattleMoves[moveBattler2].priority) { - // 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 (gBattleMoves[moveBattler1].priority < gBattleMoves[moveBattler2].priority) + { + 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; } From fdd8765256cb38819e696d2c799be03e304ba78d Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 22 Jul 2018 19:34:13 +0200 Subject: [PATCH 037/667] Add Storm Drain redirection --- include/battle.h | 1 + src/battle_main.c | 18 ++++++++++++------ src/battle_script_commands.c | 8 ++++++++ src/battle_util.c | 37 ++++++++++++++++++++++++++++-------- 4 files changed, 50 insertions(+), 14 deletions(-) diff --git a/include/battle.h b/include/battle.h index 1753c9a3eb..7ad418626c 100644 --- a/include/battle.h +++ b/include/battle.h @@ -230,6 +230,7 @@ struct SpecialStatus u8 focusBanded:1; u8 focusSashed:1; u8 sturdied:1; + u8 stormDrainRedirected:1; s32 dmg; s32 physicalDmg; s32 specialDmg; diff --git a/src/battle_main.c b/src/battle_main.c index fb851aac75..d0ce224313 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5365,17 +5365,20 @@ static 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 && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) + || (gBattleMons[*(gBattleStruct->moveTarget + gBattlerAttacker)].ability != ABILITY_STORM_DRAIN && gBattleMoves[gCurrentMove].type == 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 + && ((gBattleMons[gActiveBattler].ability == ABILITY_LIGHTNING_ROD && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) + || (gBattleMons[gActiveBattler].ability == ABILITY_STORM_DRAIN && gBattleMoves[gCurrentMove].type == TYPE_WATER) + ) && GetBattlerTurnOrderNum(gActiveBattler) < var) { var = GetBattlerTurnOrderNum(gActiveBattler); @@ -5423,7 +5426,10 @@ static 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; } } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index fd95bbb280..a43f58b0be 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -996,6 +996,14 @@ static void atk00_attackcanceler(void) gBattlescriptCurrInstr = BattleScript_TookAttack; RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); } + else if (gSpecialStatuses[gBattlerTarget].stormDrainRedirected) + { + gSpecialStatuses[gBattlerTarget].stormDrainRedirected = 0; + gLastUsedAbility = ABILITY_STORM_DRAIN; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_TookAttack; + RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); + } else if (DEFENDER_IS_PROTECTED && (gCurrentMove != MOVE_CURSE || IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST)) && ((!IsTwoTurnsMove(gCurrentMove) || (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)))) diff --git a/src/battle_util.c b/src/battle_util.c index f90f08bd6c..caa9bdd380 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2493,10 +2493,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA switch (gLastUsedAbility) { case ABILITY_RAIN_DISH: - if (WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_RAIN_ANY) + 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) @@ -2505,9 +2505,18 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA 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) @@ -2518,8 +2527,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA 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 + gBattleMons[battler].status2 &= ~(STATUS2_NIGHTMARE); gBattleScripting.battler = gActiveBattler = battler; BattleScriptPushCursorAndCallback(BattleScript_ShedSkinActivates); BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); @@ -3847,6 +3857,14 @@ u8 GetMoveTarget(u16 move, u8 setTarget) RecordAbilityBattle(targetBattler, gBattleMons[targetBattler].ability); gSpecialStatuses[targetBattler].lightningRodRedirected = 1; } + else if (gBattleMoves[move].type == TYPE_WATER + && AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIDE, gBattlerAttacker, ABILITY_STORM_DRAIN, 0, 0) + && gBattleMons[targetBattler].ability != ABILITY_STORM_DRAIN) + { + targetBattler ^= BIT_FLANK; + RecordAbilityBattle(targetBattler, gBattleMons[targetBattler].ability); + gSpecialStatuses[targetBattler].stormDrainRedirected = 1; + } } break; case MOVE_TARGET_DEPENDS: @@ -5043,12 +5061,14 @@ s32 CalculateMoveDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, s32 return dmg; } -static inline void MulByTypeEffectiveness(u16 *modifier, u16 move, u8 moveType, u8 battlerDef, u8 defType) +static inline void MulByTypeEffectiveness(u16 *modifier, u16 move, u8 moveType, u8 battlerDef, u8 defType, u8 atkAblity) { u16 mod = sTypeEffectivenessTable[moveType][defType]; if ((moveType == TYPE_FIGHTING || moveType == TYPE_NORMAL) && defType == TYPE_GHOST && gBattleMons[battlerDef].status2 & STATUS2_FORESIGHT) mod = UQ_4_12(1.0); + if ((moveType == TYPE_FIGHTING || moveType == TYPE_NORMAL) && defType == TYPE_GHOST && atkAblity == ABILITY_SCRAPPY) + mod = UQ_4_12(1.0); if (moveType == TYPE_PSYCHIC && defType == TYPE_DARK && gStatuses3[battlerDef] & STATUS3_MIRACLE_EYED) mod = UQ_4_12(1.0); if (move == MOVE_FREEZE_DRY && defType == TYPE_WATER) @@ -5086,9 +5106,10 @@ u16 CalcTypeEffectivenessMultiplier(u16 move, u8 moveType, u8 battlerAtk, u8 bat if (move != MOVE_STRUGGLE && moveType != TYPE_MYSTERY) { - MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, gBattleMons[battlerDef].type1); + u32 atkAbility = GetBattlerAbility(battlerAtk); + MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, gBattleMons[battlerDef].type1, atkAbility); if (gBattleMons[battlerDef].type2 != gBattleMons[battlerDef].type1) - MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, gBattleMons[battlerDef].type2); + MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, gBattleMons[battlerDef].type2, atkAbility); if (moveType == TYPE_GROUND && !IsBattlerGrounded(battlerDef)) { @@ -5127,9 +5148,9 @@ u16 CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u8 ability if (move != MOVE_STRUGGLE && moveType != TYPE_MYSTERY) { - MulByTypeEffectiveness(&modifier, move, moveType, 0, gBaseStats[speciesDef].type1); + MulByTypeEffectiveness(&modifier, move, moveType, 0, gBaseStats[speciesDef].type1, ABILITY_NONE); if (gBaseStats[speciesDef].type2 != gBaseStats[speciesDef].type1) - MulByTypeEffectiveness(&modifier, move, moveType, 0, gBaseStats[speciesDef].type2); + MulByTypeEffectiveness(&modifier, move, moveType, 0, gBaseStats[speciesDef].type2, ABILITY_NONE); if (moveType == TYPE_GROUND && abilityDef == ABILITY_LEVITATE && !(gFieldStatuses & STATUS_FIELD_GRAVITY)) modifier = UQ_4_12(0.0); From 6a7d58003b8962ce50e0528b5963c75122503710 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 22 Jul 2018 21:05:12 +0200 Subject: [PATCH 038/667] Add Bad Dreams --- asm/macros/battle_script.inc | 9 ++++++++ data/battle_scripts_1.s | 18 ++++++++++++++++ include/battle_scripts.h | 1 + include/constants/battle_script_commands.h | 1 + include/constants/battle_string_ids.h | 3 ++- src/battle_message.c | 2 ++ src/battle_script_commands.c | 24 ++++++++++++++++++++++ src/battle_util.c | 7 +++++++ 8 files changed, 64 insertions(+), 1 deletion(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 3b67ac7315..55b681b802 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1238,6 +1238,11 @@ .4byte \ptr .endm + .macro trygetbaddreamstarget ptr + .byte 0xfd + .4byte \ptr + .endm + @ various command changed to more readable macros .macro cancelmultiturnmoves bank various \bank, VARIOUS_CANCEL_MULTI_TURN_MOVES @@ -1431,3 +1436,7 @@ .macro jumpifnotbattletype flags, jumpptr jumpifword CMP_NO_COMMON_BITS, gBattleTypeFlags, \flags, \jumpptr .endm + + .macro dmg_1_8_targethp + manipulatedamage ATK80_1_8_TARGET_HP + .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 5d39fae94d..a2b1bbee4b 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4461,6 +4461,24 @@ BattleScript_DroughtActivates:: playanimation BS_BATTLER_0, B_ANIM_SUN_CONTINUES, NULL call BattleScript_WeatherFormChanges end3 + +BattleScript_BadDreamsActivates:: + setbyte gBattlerTarget, 0 +BattleScript_BadDreamsLoop: + trygetbaddreamstarget BattleScript_BadDreamsEnd + dmg_1_8_targethp + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + printstring STRINGID_BADDREAMSDMG + waitmessage 0x40 + 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 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 520e32b00e..0971b11820 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -312,5 +312,6 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 3e1906442b..bf88aba9c3 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -79,6 +79,7 @@ #define ATK80_DMG_CHANGE_SIGN 0 #define ATK80_DMG_HALF_BY_TWO_NOT_MORE_THAN_HALF_MAX_HP 1 #define ATK80_DMG_DOUBLED 2 +#define ATK80_1_8_TARGET_HP 3 // atk4F, a flag used for the jumpifcantswitch command #define ATK4F_DONT_CHECK_STATUSES 0x80 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index c2fc1ca108..80c57af878 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -454,7 +454,8 @@ #define STRINGID_ANGRYPOINTACTIVATES 451 #define STRINGID_ATTACKERABILITYSTATRAISE 452 #define STRINGID_POISONHEALHPUP 453 +#define STRINGID_BADDREAMSDMG 454 -#define BATTLESTRINGS_COUNT 442 +#define BATTLESTRINGS_COUNT 443 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_message.c b/src/battle_message.c index 213770fdd9..43e845b3e5 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -597,6 +597,7 @@ static const u8 sText_PsychicTerrainEnds[] = _(""); static const u8 sText_GrassyTerrainEnds[] = _(""); static const u8 sText_AngryPointActivates[] = _(""); static const u8 sText_PoisonHealHpUp[] = _(""); +static const u8 sText_BadDreamsDmg[] = _(""); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { @@ -1043,6 +1044,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_AngryPointActivates, // 451 sText_AttackerAbilityRaisedStat, // 452 sText_PoisonHealHpUp, // 453 + sText_BadDreamsDmg, // 454 }; const u16 gMissStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a43f58b0be..7205cfb474 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -344,6 +344,7 @@ static void atkF9_settelekinesis(void); static void atkFA_swapstatstages(void); static void atkFB_averagestats(void); static void atkFC_jumpifoppositegenders(void); +static void atkFD_trygetbaddreamstarget(void); void (* const gBattleScriptingCommandsTable[])(void) = { @@ -600,6 +601,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atkFA_swapstatstages, atkFB_averagestats, atkFC_jumpifoppositegenders, + atkFD_trygetbaddreamstarget, }; struct StatFractions @@ -6787,6 +6789,11 @@ static void atk80_manipulatedamage(void) case ATK80_DMG_DOUBLED: gBattleMoveDamage *= 2; break; + case ATK80_1_8_TARGET_HP: + gBattleMoveDamage = gBattleMons[gBattlerTarget].maxHP / 8; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + break; } gBattlescriptCurrInstr += 2; @@ -10339,3 +10346,20 @@ static void atkFC_jumpifoppositegenders(void) else gBattlescriptCurrInstr += 5; } + +static void atkFD_trygetbaddreamstarget(void) +{ + u8 badDreamsMonSide = GetBattlerSide(gBattlerAttacker); + for (;gBattlerTarget < gBattlersCount; gBattlerTarget++) + { + if (GetBattlerSide(gBattlerTarget) == badDreamsMonSide) + continue; + if (gBattleMons[gBattlerTarget].status1 & STATUS1_SLEEP && IsBattlerAlive(gBattlerTarget)) + break; + } + + if (gBattlerTarget >= gBattlersCount) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + else + gBattlescriptCurrInstr += 5; +} diff --git a/src/battle_util.c b/src/battle_util.c index caa9bdd380..6ef1c1dd81 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2551,6 +2551,13 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA case ABILITY_TRUANT: gDisableStructs[gBattlerAttacker].truantCounter ^= 1; break; + case ABILITY_BAD_DREAMS: + if (gBattleMons[BATTLE_OPPOSITE(battler)].status1 & STATUS1_SLEEP || gBattleMons[BATTLE_OPPOSITE(battler)].status1 & STATUS1_SLEEP) + { + BattleScriptPushCursorAndCallback(BattleScript_BadDreamsActivates); + effect++; + } + break; } } break; From 831816e9b2b32f262d42968d388d1014568b2fce Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 22 Jul 2018 22:21:47 +0200 Subject: [PATCH 039/667] Switch-in abilities with a message --- data/battle_scripts_1.s | 5 ++ include/battle.h | 1 + include/battle_scripts.h | 1 + include/constants/battle_string_ids.h | 20 +++++++- src/battle_message.c | 41 +++++++++++++++++ src/battle_script_commands.c | 1 + src/battle_util.c | 66 +++++++++++++++++++++++---- 7 files changed, 124 insertions(+), 11 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index a2b1bbee4b..c2116784e3 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4645,6 +4645,11 @@ BattleScript_AttackerAbilityStatRaise:: BattleScript_AttackerAbilityStatRaiseEnd3:: call BattleScript_AttackerAbilityStatRaise end3 + +BattleScript_SwitchInAbilityMsg:: + printfromtable gSwitchInAbilityStringIds + waitmessage 0x40 + end3 BattleScript_RoughSkinActivates:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 diff --git a/include/battle.h b/include/battle.h index 7ad418626c..4dd4629303 100644 --- a/include/battle.h +++ b/include/battle.h @@ -231,6 +231,7 @@ struct SpecialStatus u8 focusSashed:1; u8 sturdied:1; u8 stormDrainRedirected:1; + u8 switchInAbilityDone:1; s32 dmg; s32 physicalDmg; s32 specialDmg; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 0971b11820..f07670c51e 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -313,5 +313,6 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 80c57af878..a3d6cb8f86 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -455,7 +455,25 @@ #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 BATTLESTRINGS_COUNT 443 +#define BATTLESTRINGS_COUNT 463 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_message.c b/src/battle_message.c index 43e845b3e5..9265c21563 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -598,6 +598,24 @@ static const u8 sText_GrassyTerrainEnds[] = _(""); static const u8 sText_AngryPointActivates[] = _(""); static const u8 sText_PoisonHealHpUp[] = _(""); static const u8 sText_BadDreamsDmg[] = _(""); +static const u8 sText_MoldBreakerEnters[] = _(""); +static const u8 sText_TeravoltEnters[] = _(""); +static const u8 sText_TurboblazeEnters[] = _(""); +static const u8 sText_SlowStartEnters[] = _(""); +static const u8 sText_SlowStartEnd[] = _(""); +static const u8 sText_SolarPowerHpDrop[] = _(""); +static const u8 sText_AftermathDmg[] = _(""); +static const u8 sText_AnticipationActivates[] = _(""); +static const u8 sText_ForewarnActivates[] = _(""); +static const u8 sText_IceBodyHpGain[] = _(""); +static const u8 sText_SnowWarningHail[] = _(""); +static const u8 sText_FriskActivates[] = _(""); +static const u8 sText_UnnerveEnters[] = _(""); +static const u8 sText_HarvestBerry[] = _(""); +static const u8 sText_MoxieAtkRise[] = _(""); +static const u8 sText_MagicBounceActivates[] = _(""); +static const u8 sText_ProteanTypeChange[] = _(""); +static const u8 sText_SymbiosisItemPass[] = _(""); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { @@ -1045,6 +1063,29 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_AttackerAbilityRaisedStat, // 452 sText_PoisonHealHpUp, // 453 sText_BadDreamsDmg, // 454 + sText_MoldBreakerEnters, + sText_TeravoltEnters, + sText_TurboblazeEnters, + sText_SlowStartEnters, + sText_SlowStartEnd, + sText_SolarPowerHpDrop, + sText_AftermathDmg, + sText_AnticipationActivates, + sText_ForewarnActivates, + sText_IceBodyHpGain, + sText_SnowWarningHail, + sText_FriskActivates, + sText_UnnerveEnters, + sText_HarvestBerry, + sText_MoxieAtkRise, + sText_MagicBounceActivates, + sText_ProteanTypeChange, + sText_SymbiosisItemPass, +}; + +const u16 gSwitchInAbilityStringIds[] = +{ + STRINGID_MOLDBREAKERENTERS, STRINGID_TERAVOLTENTERS, STRINGID_TURBOBLAZEENTERS, STRINGID_SLOWSTARTENTERS, STRINGID_UNNERVEENTERS }; const u16 gMissStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 7205cfb474..5306822ed3 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6386,6 +6386,7 @@ static void atk76_various(void) 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) diff --git a/src/battle_util.c b/src/battle_util.c index 6ef1c1dd81..0c7dfcf9e1 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2380,7 +2380,53 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA BattleScriptPushCursorAndCallback(BattleScript_OverworldWeatherStarts); } 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) + { + 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_DOWNLOAD: + if (!gSpecialStatuses[battler].switchInAbilityDone) { u8 statId; u32 opposingBattler = BATTLE_OPPOSITE(battler); @@ -2407,6 +2453,8 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA else statId = STAT_ATK; + gSpecialStatuses[battler].switchInAbilityDone = 1; + if (gBattleMons[battler].statStages[statId] != 0xC) { gBattleMons[battler].statStages[statId]++; @@ -2469,18 +2517,16 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA 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++) { - // 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) { - effect = CastformDataTypeChange(target1); - if (effect != 0) - { - BattleScriptPushCursorAndCallback(BattleScript_CastformChange); - gBattleScripting.battler = target1; - *(&gBattleStruct->formToChangeInto) = effect - 1; - break; - } + BattleScriptPushCursorAndCallback(BattleScript_CastformChange); + gBattleScripting.battler = target1; + *(&gBattleStruct->formToChangeInto) = effect - 1; + break; } } break; From 194adf0ab2753a9ec16bdf39a93a5a6087a257f2 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 22 Jul 2018 22:41:13 +0200 Subject: [PATCH 040/667] Abilities affected by weather conditions --- data/battle_scripts_1.s | 8 +++++++- src/battle_script_commands.c | 28 +++++++++++++++++++--------- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index c2116784e3..6500a2488f 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3486,11 +3486,17 @@ 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: + 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 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 5306822ed3..effce629fe 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7608,15 +7608,15 @@ static void atk96_weatherdamage(void) { if (WEATHER_HAS_EFFECT) { + u32 ability = GetBattlerAbility(gBattlerAttacker); 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 + 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 && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERGROUND) && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER)) { @@ -7629,9 +7629,19 @@ static void atk96_weatherdamage(void) gBattleMoveDamage = 0; } } - if (gBattleWeather & WEATHER_HAIL) + if (gBattleWeather & WEATHER_HAIL_ANY) { - if (!IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ICE) + if (ability == ABILITY_ICE_BODY + && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERGROUND) + && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER)) + { + 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 && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERGROUND) && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER)) { From b790a7585381fda20a748fadc84c71a375d53a44 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 23 Jul 2018 08:45:59 -0300 Subject: [PATCH 041/667] Update battle_moves.h Assigned the following flags to the relevant moves: FLAG_RECKLESS_BOOST, FLAG_IRON_FIST_BOOST, FLAG_SHEER_FORCE_BOOST, FLAG_STRONG_JAW_BOOST, FLAG_MEGA_LAUNCHER_BOOST, FLAG_DMG_UNDERGROUND and FLAG_DMG_UNDERWATER. Assigned the effect EFFECT_SEMI_INVULNERABLE to MOVE_PHANTOM_FORCE and MOVE_SHADOW_FORCE. The only flags that are not assigned yet, in theory, are FLAG_STAT_STAGES_IGNORED and FLAG_DMG_MINIMIZE. --- include/data/battle_moves.h | 224 ++++++++++++++++++------------------ 1 file changed, 112 insertions(+), 112 deletions(-) diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index 6cd5cd7095..596ed0c32c 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -60,7 +60,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -72,7 +72,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -96,7 +96,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -108,7 +108,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -120,7 +120,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -288,7 +288,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_DOUBLE_KICK @@ -324,7 +324,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -360,7 +360,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -420,7 +420,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_WRAP @@ -444,7 +444,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -468,7 +468,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -492,7 +492,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -540,7 +540,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -636,7 +636,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -648,7 +648,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -696,7 +696,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_DMG_UNDERWATER, .split = SPLIT_SPECIAL, }, { // MOVE_ICE_BEAM @@ -708,7 +708,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -720,7 +720,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -744,7 +744,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -804,7 +804,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -1032,7 +1032,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -1056,7 +1056,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_ROCK_THROW @@ -1080,7 +1080,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -1128,7 +1128,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -1140,7 +1140,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -1524,7 +1524,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -1536,7 +1536,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_SHEER_FORCE_BOOST, .split = SPLIT_PHYSICAL, }, { // MOVE_CLAMP @@ -1644,7 +1644,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -1728,7 +1728,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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, }, { // MOVE_TRANSFORM @@ -1752,7 +1752,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -1764,7 +1764,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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, .split = SPLIT_PHYSICAL, }, { // MOVE_SPORE @@ -1896,7 +1896,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -1908,7 +1908,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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, .split = SPLIT_PHYSICAL, }, { // MOVE_SHARPEN @@ -2076,7 +2076,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -2088,7 +2088,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_CURSE @@ -2208,7 +2208,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -2268,7 +2268,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_MUD_SLAP @@ -2280,7 +2280,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_OCTAZOOKA @@ -2316,7 +2316,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_FORESIGHT @@ -2364,7 +2364,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -2544,7 +2544,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -2676,7 +2676,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -2688,7 +2688,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -2712,7 +2712,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -2784,7 +2784,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -2796,7 +2796,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -2880,7 +2880,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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, .split = SPLIT_SPECIAL, }, { // MOVE_RAIN_DANCE @@ -2916,7 +2916,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -2964,7 +2964,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -2976,7 +2976,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_FUTURE_SIGHT @@ -3000,7 +3000,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -3012,7 +3012,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -3036,7 +3036,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 1, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, .split = SPLIT_PHYSICAL, }, { // MOVE_UPROAR @@ -3096,7 +3096,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -3180,7 +3180,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -3492,7 +3492,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -3672,7 +3672,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -3684,7 +3684,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -3720,7 +3720,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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, .split = SPLIT_SPECIAL, }, { // MOVE_ASTONISH @@ -3732,7 +3732,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -3816,7 +3816,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -3900,7 +3900,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -3912,7 +3912,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -3924,7 +3924,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -3936,7 +3936,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_SAND_TOMB @@ -4104,7 +4104,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -4116,7 +4116,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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, + .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 @@ -4140,7 +4140,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_MAGICAL_LEAF @@ -4236,7 +4236,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -4320,7 +4320,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 100, .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_GYRO_BALL @@ -4740,7 +4740,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 | FLAG_RECKLESS_BOOST, .split = SPLIT_PHYSICAL, }, { // MOVE_FORCE_PALM @@ -4752,7 +4752,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_AURA_SPHERE @@ -4764,7 +4764,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_MEGA_LAUNCHER_BOOST, .split = SPLIT_SPECIAL, }, { // MOVE_ROCK_POLISH @@ -4788,7 +4788,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_DARK_PULSE @@ -4800,7 +4800,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_MEGA_LAUNCHER_BOOST, .split = SPLIT_SPECIAL, }, { // MOVE_NIGHT_SLASH @@ -4848,7 +4848,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_X_SCISSOR @@ -4884,7 +4884,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_MEGA_LAUNCHER_BOOST, .split = SPLIT_SPECIAL, }, { // MOVE_DRAGON_RUSH @@ -4896,7 +4896,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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, .split = SPLIT_PHYSICAL, }, { // MOVE_POWER_GEM @@ -4920,7 +4920,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_VACUUM_WAVE @@ -4944,7 +4944,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_ENERGY_BALL @@ -4968,7 +4968,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_EARTH_POWER @@ -4980,7 +4980,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_SWITCHEROO @@ -5028,7 +5028,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_AVALANCHE @@ -5076,7 +5076,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 | FLAG_STRONG_JAW_BOOST, .split = SPLIT_PHYSICAL, }, { // MOVE_ICE_FANG @@ -5088,7 +5088,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 | FLAG_STRONG_JAW_BOOST, .split = SPLIT_PHYSICAL, }, { // MOVE_FIRE_FANG @@ -5100,7 +5100,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 | FLAG_STRONG_JAW_BOOST, .split = SPLIT_PHYSICAL, }, { // MOVE_SHADOW_SNEAK @@ -5124,7 +5124,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_PSYCHO_CUT @@ -5148,7 +5148,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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, .split = SPLIT_PHYSICAL, }, { // MOVE_MIRROR_SHOT @@ -5172,7 +5172,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_ROCK_CLIMB @@ -5184,7 +5184,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_DEFOG @@ -5244,7 +5244,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 30, .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_SHEER_FORCE_BOOST, .split = SPLIT_SPECIAL, }, { // MOVE_LEAF_STORM @@ -5304,7 +5304,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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, }, { // MOVE_IRON_HEAD @@ -5316,7 +5316,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_MAGNET_BOMB @@ -5424,7 +5424,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 70, .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_WOOD_HAMMER @@ -5436,7 +5436,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_AQUA_JET @@ -5496,7 +5496,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_DOUBLE_HIT @@ -5608,7 +5608,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_SHADOW_FORCE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_SEMI_INVULNERABLE, .power = 120, .type = TYPE_GHOST, .accuracy = 100, @@ -5796,7 +5796,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 10, .target = MOVE_TARGET_FOES_AND_ALLY, .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_QUIVER_DANCE @@ -5868,7 +5868,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 100, .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_COIL @@ -5892,7 +5892,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 100, .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_ACID_SPRAY @@ -6048,7 +6048,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_SHELL_SMASH @@ -6072,7 +6072,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_MEGA_LAUNCHER_BOOST, .split = SPLIT_STATUS, }, { // MOVE_HEX @@ -6276,7 +6276,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_BULLDOZE @@ -6288,7 +6288,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 100, .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_SHEER_FORCE_BOOST, .split = SPLIT_PHYSICAL, }, { // MOVE_FROST_BREATH @@ -6348,7 +6348,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_DRILL_RUN @@ -6528,7 +6528,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_GEAR_GRIND @@ -6672,7 +6672,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 100, .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_ICICLE_CRASH @@ -6796,7 +6796,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_PHANTOM_FORCE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_SEMI_INVULNERABLE, .power = 90, .type = TYPE_GHOST, .accuracy = 100, @@ -7008,7 +7008,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_FAIRY_WIND @@ -7356,7 +7356,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 100, .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_OBLIVION_WING @@ -7416,7 +7416,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_RECKLESS_BOOST, .split = SPLIT_SPECIAL, }, { // MOVE_ORIGIN_PULSE @@ -7428,7 +7428,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_MEGA_LAUNCHER_BOOST, .split = SPLIT_SPECIAL, }, { // MOVE_PRECIPICE_BLADES From 8f87dd7fac6caaae9e29c5ce7be9ef16867261ad Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 23 Jul 2018 10:39:35 -0300 Subject: [PATCH 042/667] Update battle_moves.h Assigned the FLAG_DMG_MINIMIZE to the relevant moves. --- include/data/battle_moves.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index 596ed0c32c..994ec61d2e 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -288,7 +288,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_DMG_MINIMIZE, .split = SPLIT_PHYSICAL, }, { // MOVE_DOUBLE_KICK @@ -420,7 +420,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_DMG_MINIMIZE, .split = SPLIT_PHYSICAL, }, { // MOVE_WRAP @@ -4896,7 +4896,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_DMG_MINIMIZE, .split = SPLIT_PHYSICAL, }, { // MOVE_POWER_GEM @@ -5616,7 +5616,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_DMG_MINIMIZE, .split = SPLIT_PHYSICAL, }, { // MOVE_HONE_CLAWS @@ -6432,7 +6432,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_DMG_MINIMIZE, .split = SPLIT_PHYSICAL, }, { // MOVE_LEAF_TORNADO @@ -6456,7 +6456,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 0, .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_DMG_MINIMIZE, .split = SPLIT_PHYSICAL, }, { // MOVE_COTTON_GUARD @@ -6732,7 +6732,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_DMG_MINIMIZE, .split = SPLIT_PHYSICAL, }, { // MOVE_MAT_BLOCK @@ -6804,7 +6804,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_DMG_MINIMIZE, .split = SPLIT_PHYSICAL, }, { // MOVE_TRICK_OR_TREAT From b2b416a2b136bd04264b2274e33e6ab8e4c05b40 Mon Sep 17 00:00:00 2001 From: Tetrable Date: Mon, 23 Jul 2018 14:41:01 +0100 Subject: [PATCH 043/667] add new move effects to battle_moves.h --- include/data/battle_moves.h | 70 ++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index 6cd5cd7095..0ead4220ac 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -4300,7 +4300,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_WAKE_UP_SLAP - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_WAKE_UP_SLAP, .power = 70, .type = TYPE_FIGHTING, .accuracy = 100, @@ -4324,7 +4324,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_GYRO_BALL - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_GYRO_BALL, .power = 1, .type = TYPE_STEEL, .accuracy = 100, @@ -4348,7 +4348,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_BRINE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_BRINE, .power = 65, .type = TYPE_WATER, .accuracy = 100, @@ -4360,7 +4360,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_NATURAL_GIFT - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_NATURAL_GIFT, .power = 1, .type = TYPE_NORMAL, .accuracy = 100, @@ -4456,7 +4456,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_PAYBACK - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PAYBACK, .power = 50, .type = TYPE_DARK, .accuracy = 100, @@ -4468,7 +4468,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_ASSURANCE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_ASSURANCE, .power = 60, .type = TYPE_DARK, .accuracy = 100, @@ -4492,7 +4492,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_FLING - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_FLING, .power = 1, .type = TYPE_DARK, .accuracy = 100, @@ -4516,7 +4516,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_TRUMP_CARD - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_TRUMP_CARD, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -4540,7 +4540,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_WRING_OUT - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_WRING_OUT, .power = 0, .type = TYPE_NORMAL, .accuracy = 100, @@ -4564,7 +4564,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_GASTRO_ACID - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_GASTRO_ACID, .power = 0, .type = TYPE_POISON, .accuracy = 100, @@ -4612,7 +4612,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_POWER_SWAP - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_POWER_SWAP, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -4624,7 +4624,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_GUARD_SWAP - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_GUARD_SWAP, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -4636,7 +4636,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_PUNISHMENT - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PUNISHMENT, .power = 60, .type = TYPE_DARK, .accuracy = 100, @@ -4684,7 +4684,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_TOXIC_SPIKES - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_TOXIC_SPIKES, .power = 0, .type = TYPE_POISON, .accuracy = 0, @@ -4696,7 +4696,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_HEART_SWAP - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HEART_SWAP, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -4720,7 +4720,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_MAGNET_RISE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_MAGNET_RISE, .power = 0, .type = TYPE_ELECTRIC, .accuracy = 0, @@ -5200,7 +5200,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_TRICK_ROOM - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_TRICK_TOOM, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -5356,7 +5356,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_STEALTH_ROCK - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_STEALTH_ROCK, .power = 0, .type = TYPE_ROCK, .accuracy = 0, @@ -5644,7 +5644,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_GUARD_SPLIT - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_GUARD_SPLIT, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -5668,7 +5668,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_WONDER_ROOM - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_WONDER_ROOM, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -5680,7 +5680,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_PSYSHOCK - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PSYSHOCK, .power = 80, .type = TYPE_PSYCHIC, .accuracy = 100, @@ -5692,7 +5692,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_VENOSHOCK - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_VENOSHOCK, .power = 65, .type = TYPE_POISON, .accuracy = 100, @@ -5728,7 +5728,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_TELEKINESIS - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_TELEKINESIS, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -5740,7 +5740,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_MAGIC_ROOM - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_MAGIC_ROOM, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -5836,7 +5836,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_ELECTRO_BALL - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_ELECTRO_BALL, .power = 1, .type = TYPE_ELECTRIC, .accuracy = 100, @@ -5908,7 +5908,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_FOUL_PLAY - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_FOUL_PLAY, .power = 95, .type = TYPE_DARK, .accuracy = 100, @@ -5956,7 +5956,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_ROUND - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_ROUND, .power = 60, .type = TYPE_NORMAL, .accuracy = 100, @@ -5968,7 +5968,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_ECHOED_VOICE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_ECHOED_VOICE, .power = 40, .type = TYPE_NORMAL, .accuracy = 100, @@ -6004,7 +6004,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_STORED_POWER - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_STORED_POWER, .power = 20, .type = TYPE_PSYCHIC, .accuracy = 100, @@ -6076,7 +6076,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_HEX - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HEX, .power = 65, .type = TYPE_GHOST, .accuracy = 100, @@ -6148,7 +6148,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_ACROBATICS - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_ACROBATICS, .power = 55, .type = TYPE_FLYING, .accuracy = 100, @@ -6172,7 +6172,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_RETALIATE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_RETALITATE, .power = 70, .type = TYPE_NORMAL, .accuracy = 100, @@ -6220,7 +6220,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_WATER_PLEDGE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLEDGE, .power = 80, .type = TYPE_WATER, .accuracy = 100, @@ -6280,7 +6280,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_BULLDOZE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_BULLDOZE, .power = 60, .type = TYPE_GROUND, .accuracy = 100, @@ -6424,7 +6424,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_HEAT_CRASH - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HEAT_CRASH, .power = 1, .type = TYPE_FIRE, .accuracy = 100, From 65703244320e2a44f4f4604ff57e0d232003f85e Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 23 Jul 2018 21:36:05 +0200 Subject: [PATCH 044/667] New crit calculator. --- data/battle_scripts_1.s | 4 +- include/battle.h | 1 + include/battle_script_commands.h | 1 + include/constants/battle.h | 1 + include/constants/battle_move_effects.h | 2 +- src/battle_ai_script_commands.c | 36 ++++++++++++- src/battle_script_commands.c | 70 +++++++++++++++++-------- src/battle_util.c | 11 ++++ 8 files changed, 100 insertions(+), 26 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 6500a2488f..bcc85341d7 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -117,7 +117,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectSpite .4byte BattleScript_EffectFalseSwipe .4byte BattleScript_EffectHealBell - .4byte BattleScript_EffectPlaceholder103 + .4byte BattleScript_EffectAlwaysCrit .4byte BattleScript_EffectTripleKick .4byte BattleScript_EffectThief .4byte BattleScript_EffectMeanLook @@ -488,7 +488,7 @@ BattleScript_EffectEvasionDownHit: BattleScript_EffectVitalThrow: BattleScript_EffectUnused60: BattleScript_EffectFalseSwipe: -BattleScript_EffectPlaceholder103: +BattleScript_EffectAlwaysCrit: BattleScript_EffectUnused6e: BattleScript_EffectPursuit: BattleScript_EffectUnused8d: diff --git a/include/battle.h b/include/battle.h index 4dd4629303..ff19aebbb0 100644 --- a/include/battle.h +++ b/include/battle.h @@ -178,6 +178,7 @@ struct DisableStruct u8 magnetRiseTimer; u8 telekinesisTimer; u8 healBlockTimer; + u8 laserFocusTimer; }; struct ProtectStruct diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index 83a0a3057a..0f56ca213d 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -4,6 +4,7 @@ #define WINDOW_CLEAR 0x1 #define WINDOW_x80 0x80 +s32 CalcCritChanceStage(u8 battlerAtk, u8 battlerDef, u32 move, bool32 recordAbility); u8 GetBattlerTurnOrderNum(u8 battlerId); void SetMoveEffect(bool8 primary, u8 certain); void BattleDestroyYesNoCursorAt(u8 cursorPosition); diff --git a/include/constants/battle.h b/include/constants/battle.h index 74544ddc43..8f31578b73 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -156,6 +156,7 @@ #define STATUS3_MAGNET_RISE 0x4000000 #define STATUS3_HEAL_BLOCK 0x8000000 #define STATUS3_AQUA_RING 0x10000000 +#define STATUS3_LASER_FOCUS 0x20000000 #define STATUS3_SEMI_INVULNERABLE (STATUS3_UNDERGROUND | STATUS3_ON_AIR | STATUS3_UNDERWATER) // Not really sure what a "hitmarker" is. diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 200ad6ff95..e572cf730e 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -104,7 +104,7 @@ #define EFFECT_SPITE 100 #define EFFECT_FALSE_SWIPE 101 #define EFFECT_HEAL_BELL 102 -#define EFFECT_PLACEHOLDER_103 103 +#define EFFECT_ALWAYS_CRIT 103 #define EFFECT_TRIPLE_KICK 104 #define EFFECT_THIEF 105 #define EFFECT_MEAN_LOOK 106 diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index f8bfc9ec5c..9e2e3a85ba 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -727,6 +727,40 @@ static void RestoreBattlerData(u8 battlerId) } } +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 3: + case 4: + isCrit = TRUE; + break; + } + + return isCrit; +} + s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef) { s32 dmg; @@ -737,7 +771,7 @@ s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef) SetBattlerData(battlerAtk); SetBattlerData(battlerDef); - dmg = CalculateMoveDamage(move, battlerAtk, battlerDef, gBattleMoves[move].type, 0, FALSE, FALSE); + dmg = CalculateMoveDamage(move, battlerAtk, battlerDef, gBattleMoves[move].type, 0, AI_GetIfCrit(move, battlerAtk, battlerDef), FALSE); RestoreBattlerData(battlerAtk); RestoreBattlerData(battlerDef); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index effce629fe..4c5f43b884 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -627,9 +627,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[] = { 0x00000000, @@ -1298,33 +1295,62 @@ static void atk03_ppreduce(void) gBattlescriptCurrInstr++; } -static void atk04_critcalc(void) +s32 CalcCritChanceStage(u8 battlerAtk, u8 battlerDef, u32 move, bool32 recordAbility) { - u8 holdEffect; - u16 item, critChance; + s32 critChance = 0; + u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); + u32 abilityDef = GetBattlerAbility(gBattlerTarget); - item = gBattleMons[gBattlerAttacker].item; - - if (item == ITEM_ENIGMA_BERRY) - holdEffect = gEnigmaBerries[gBattlerAttacker].holdEffect; + 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 = 4; + } else - holdEffect = ItemId_GetHoldEffect(item); + { + u32 holdEffectAtk = GetBattlerHoldEffect(battlerAtk, TRUE); - gPotentialItemEffectBattler = gBattlerAttacker; - - critChance = 2 * ((gBattleMons[gBattlerAttacker].status2 & STATUS2_FOCUS_ENERGY) != 0) - + ((gBattleMoves[gCurrentMove].flags & FLAG_HIGH_CRIT) != 0) - + (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); + 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 > 4) critChance = 4; - 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])) + return critChance; +} + +// The chance is 1/N for each stage. +static const u8 sCriticalHitChanceGen3[] = {16, 8, 4, 3, 2}; // Gens 2,3,4,5 +static const u8 sCriticalHitChanceGen6[] = {16, 8, 2, 1, 1}; +static const u8 sCriticalHitChanceGen7[] = {24, 8, 2, 1, 1}; + +static void atk04_critcalc(void) +{ + s32 critChance = CalcCritChanceStage(gBattlerAttacker, gBattlerTarget, gCurrentMove, TRUE); + gPotentialItemEffectBattler = gBattlerAttacker; + + if (gBattleTypeFlags & (BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_FIRST_BATTLE)) + gIsCriticalHit = FALSE; + else if (critChance == -1) + gIsCriticalHit = FALSE; + else if (Random() % sCriticalHitChanceGen3[critChance] == 0) gIsCriticalHit = TRUE; else gIsCriticalHit = FALSE; diff --git a/src/battle_util.c b/src/battle_util.c index 0c7dfcf9e1..2ad7508d79 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1209,6 +1209,7 @@ enum ENDTURN_EMBARGO, ENDTURN_LOCK_ON, ENDTURN_CHARGE, + ENDTURN_LASER_FOCUS, ENDTURN_TAUNT, ENDTURN_YAWN, ENDTURN_ITEMS2, @@ -1581,6 +1582,16 @@ u8 DoBattlerEndTurnEffects(void) } gBattleStruct->turnEffectsTracker++; break; + case ENDTURN_LASER_FOCUS: + if (gStatuses3[gActiveBattler] & STATUS3_LASER_FOCUS) + { + if (gDisableStructs[gActiveBattler].laserFocusTimer != 0) + gDisableStructs[gActiveBattler].laserFocusTimer--; + if (gDisableStructs[gActiveBattler].laserFocusTimer == 0) + gStatuses3[gActiveBattler] &= ~(STATUS3_LASER_FOCUS); + } + gBattleStruct->turnEffectsTracker++; + break; case ENDTURN_EMBARGO: if (gStatuses3[gActiveBattler] & STATUS3_EMBARGO) { From 567a0240f35359c62a75800d7010926122e54d00 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 23 Jul 2018 22:18:56 +0200 Subject: [PATCH 045/667] Fix crits and do Worry Seed --- asm/macros/battle_script.inc | 5 +++++ data/battle_scripts_1.s | 19 +++++++++++++++---- include/constants/battle_move_effects.h | 2 +- include/data/battle_moves.h | 6 +++--- src/battle_ai_script_commands.c | 1 + src/battle_message.c | 2 +- src/battle_script_commands.c | 23 ++++++++++++++++++++++- 7 files changed, 48 insertions(+), 10 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 55b681b802..83876e013a 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1243,6 +1243,11 @@ .4byte \ptr .endm + .macro tryworryseed ptr + .byte 0xfe + .4byte \ptr + .endm + @ various command changed to more readable macros .macro cancelmultiturnmoves bank various \bank, VARIOUS_CANCEL_MULTI_TURN_MOVES diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index bcc85341d7..4033aad494 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -177,7 +177,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 @@ -271,6 +271,18 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectPowerSplit .4byte BattleScript_EffectGuardSplit +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 @@ -357,10 +369,10 @@ BattleScript_EffectStealthRock: attackcanceler attackstring ppreduce - setstealthrock STRINGID_POINTEDSTONESFLOAT + setstealthrock BattleScript_ButItFailed attackanimation waitanimation - printstring STRINGID_POISONSPIKESSCATTERED + printstring STRINGID_POINTEDSTONESFLOAT waitmessage 0x40 goto BattleScript_MoveEnd @@ -492,7 +504,6 @@ BattleScript_EffectAlwaysCrit: BattleScript_EffectUnused6e: BattleScript_EffectPursuit: BattleScript_EffectUnused8d: -BattleScript_EffectUnusedA3: BattleScript_EffectPlaceholder200: BattleScript_EffectPlaceholder209: BattleScript_EffectHit:: diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index e572cf730e..cedebfe85b 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -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 diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index 88a3826293..6ec868467d 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -4660,7 +4660,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_WORRY_SEED - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_WORRY_SEED, .power = 0, .type = TYPE_GRASS, .accuracy = 100, @@ -5764,7 +5764,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_STORM_THROW - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_ALWAYS_CRIT, .power = 60, .type = TYPE_FIGHTING, .accuracy = 100, @@ -6292,7 +6292,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_FROST_BREATH - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_ALWAYS_CRIT, .power = 60, .type = TYPE_ICE, .accuracy = 90, diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 9e2e3a85ba..9a7cf395b9 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -752,6 +752,7 @@ static bool32 AI_GetIfCrit(u32 move, u8 battlerAtk, u8 battlerDef) else isCrit = FALSE; break; + case -2: case 3: case 4: isCrit = TRUE; diff --git a/src/battle_message.c b/src/battle_message.c index 9265c21563..4a4fe36bb8 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -543,7 +543,7 @@ static const u8 sText_PkmnsAbilitySuppressed[] = _("{B_DEF_NAME_WITH_PREFIX}’s static const u8 sText_ShieldedFromCriticalHits[] = _("The {B_CURRENT_MOVE} shielded your\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_LAST_ABILITY}!"); +static const u8 sText_PkmnAcquiredAbility[] = _("{B_DEF_NAME_WITH_PREFIX} acquired\n{B_DEF_ABILITY}!"); static const u8 sText_PoisonSpikesScattered[] = _("Poison Spikes were scattered\nall around the foe’s team’s\pfeet!"); 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!"); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 4c5f43b884..e654ddbb24 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -345,6 +345,7 @@ static void atkFA_swapstatstages(void); static void atkFB_averagestats(void); static void atkFC_jumpifoppositegenders(void); static void atkFD_trygetbaddreamstarget(void); +static void atkFE_tryworryseed(void); void (* const gBattleScriptingCommandsTable[])(void) = { @@ -602,6 +603,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atkFB_averagestats, atkFC_jumpifoppositegenders, atkFD_trygetbaddreamstarget, + atkFE_tryworryseed, }; struct StatFractions @@ -1316,7 +1318,7 @@ s32 CalcCritChanceStage(u8 battlerAtk, u8 battlerDef, u32 move, bool32 recordAbi || gBattleMoves[move].effect == EFFECT_ALWAYS_CRIT || (abilityAtk == ABILITY_MERCILESS && gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY)) { - critChance = 4; + critChance = -2; } else { @@ -1350,6 +1352,8 @@ static void atk04_critcalc(void) gIsCriticalHit = FALSE; else if (critChance == -1) gIsCriticalHit = FALSE; + else if (critChance == -2) + gIsCriticalHit = TRUE; else if (Random() % sCriticalHitChanceGen3[critChance] == 0) gIsCriticalHit = TRUE; else @@ -10400,3 +10404,20 @@ static void atkFD_trygetbaddreamstarget(void) else gBattlescriptCurrInstr += 5; } + +static void atkFE_tryworryseed(void) +{ + switch (gBattleMons[gBattlerTarget].ability) + { + case ABILITY_INSOMNIA: + case ABILITY_MULTITYPE: + case ABILITY_TRUANT: + case ABILITY_STANCE_CHANGE: + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + break; + default: + gBattleMons[gBattlerTarget].ability = ABILITY_INSOMNIA; + gBattlescriptCurrInstr += 5; + break; + } +} From 74cac75a385194863d61ba97d577eb58b017e425 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 23 Jul 2018 17:32:34 -0300 Subject: [PATCH 046/667] Update battle_message.c Assigned the abilities' In-Battle strings from Line 593 to Line 618. --- src/battle_message.c | 64 ++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/src/battle_message.c b/src/battle_message.c index 4a4fe36bb8..68e67c22c6 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -543,7 +543,7 @@ static const u8 sText_PkmnsAbilitySuppressed[] = _("{B_DEF_NAME_WITH_PREFIX}’s static const u8 sText_ShieldedFromCriticalHits[] = _("The {B_CURRENT_MOVE} shielded your\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_PkmnAcquiredAbility[] = _("{B_DEF_NAME_WITH_PREFIX} acquired\n{B_LAST_ABILITY}!"); static const u8 sText_PoisonSpikesScattered[] = _("Poison Spikes were scattered\nall around the foe’s team’s\pfeet!"); 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!"); @@ -590,32 +590,32 @@ static const u8 sText_TargetAbilityRaisedStat[] = _("{B_DEF_NAME_WITH_PREFIX}’ static const u8 sText_AttackerAbilityRaisedStat[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_ATK_ABILITY}\n raised its {B_BUFF1}!"); // These strings are currently placeholders, to be fixed. -static const u8 sText_AuroraVeilEnds[] = _(""); -static const u8 sText_ElectricTerrainEnds[] = _(""); -static const u8 sText_MistyTerrainEnds[] = _(""); -static const u8 sText_PsychicTerrainEnds[] = _(""); -static const u8 sText_GrassyTerrainEnds[] = _(""); -static const u8 sText_AngryPointActivates[] = _(""); -static const u8 sText_PoisonHealHpUp[] = _(""); -static const u8 sText_BadDreamsDmg[] = _(""); -static const u8 sText_MoldBreakerEnters[] = _(""); -static const u8 sText_TeravoltEnters[] = _(""); -static const u8 sText_TurboblazeEnters[] = _(""); -static const u8 sText_SlowStartEnters[] = _(""); -static const u8 sText_SlowStartEnd[] = _(""); -static const u8 sText_SolarPowerHpDrop[] = _(""); -static const u8 sText_AftermathDmg[] = _(""); -static const u8 sText_AnticipationActivates[] = _(""); -static const u8 sText_ForewarnActivates[] = _(""); -static const u8 sText_IceBodyHpGain[] = _(""); -static const u8 sText_SnowWarningHail[] = _(""); -static const u8 sText_FriskActivates[] = _(""); -static const u8 sText_UnnerveEnters[] = _(""); -static const u8 sText_HarvestBerry[] = _(""); -static const u8 sText_MoxieAtkRise[] = _(""); -static const u8 sText_MagicBounceActivates[] = _(""); -static const u8 sText_ProteanTypeChange[] = _(""); -static const u8 sText_SymbiosisItemPass[] = _(""); +static const u8 sText_AuroraVeilEnds[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\nwore off!"); +static const u8 sText_ElectricTerrainEnds[] = _("{B_ATK_ABILITY} wore off."); +static const u8 sText_MistyTerrainEnds[] = _("{B_ATK_ABILITY} wore off."); +static const u8 sText_PsychicTerrainEnds[] = _("{B_ATK_ABILITY} wore off."); +static const u8 sText_GrassyTerrainEnds[] = _("{B_ATK_ABILITY} wore off."); +static const u8 sText_AngryPointActivates[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_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[] = _("The {B_DEF_NAME_WITH_PREFIX} is tormented\nby {B_DEF_ABILITY}!"); +static const u8 sText_MoldBreakerEnters[] = _("The {B_DEF_NAME_WITH_PREFIX} breaks the mold!"); +static const u8 sText_TeravoltEnters[] = _("{B_ATK_NAME_WITH_PREFIX} is radiating a bursting aura!"); +static const u8 sText_TurboblazeEnters[] = _("{B_ATK_NAME_WITH_PREFIX} is radiating a blazing aura!"); +static const u8 sText_SlowStartEnters[] = _("{B_ATK_NAME_WITH_PREFIX} can't get it going!"); +static const u8 sText_SlowStartEnd[] = _("{B_ATK_NAME_WITH_PREFIX} finally got its 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[] = _("The {B_DEF_NAME_WITH_PREFIX}\nsuffers the {B_DEF_ABILITY}!"); +static const u8 sText_AnticipationActivates[] = _("The {B_ATK_NAME_WITH_PREFIX} shuddered in {B_ATK_ABILITY}!"); +static const u8 sText_ForewarnActivates[] = _("{B_ATK_ABILITY} alerted the {B_ATK_NAME_WITH_PREFIX} to the\n{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[] = _("{B_ATK_NAME_WITH_PREFIX} is too nervous to eat Berries!"); +static const u8 sText_HarvestBerry[] = _("{B_ATK_NAME_WITH_PREFIX} harvested its {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}!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { @@ -3116,7 +3116,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) { @@ -3146,17 +3146,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) { From 3f7e6e9fe01133c6dd76f8a40c9276b3f331e156 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 23 Jul 2018 22:43:05 +0200 Subject: [PATCH 047/667] Add U-turn effect --- data/battle_scripts_1.s | 45 +++++++++++++++++++++++-- include/constants/battle_move_effects.h | 2 +- include/data/battle_moves.h | 4 +-- 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 4033aad494..34921fd234 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -214,7 +214,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectSecretPower .4byte BattleScript_EffectDoubleEdge .4byte BattleScript_EffectTeeterDance - .4byte BattleScript_EffectPlaceholder200 + .4byte BattleScript_EffectHitEscape .4byte BattleScript_EffectMudSport .4byte BattleScript_EffectPoisonFang .4byte BattleScript_EffectWeatherBall @@ -493,6 +493,48 @@ BattleScript_EffectCaptivate: BattleScript_CaptivateCheckAcc: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE goto BattleScript_StatDownFromAttackString + +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 + setbyte sMOVEEND_STATE, 0x0 + moveend 0x0, 0x0 + atk24 BattleScript_HitEscapeEnd + jumpifbyte CMP_NOT_EQUAL gBattleOutcome 0 BattleScript_HitEscapeEnd + jumpifcantswitch ATK4F_DONT_CHECK_STATUSES | BS_ATTACKER, BattleScript_HitEscapeEnd + openpartyscreen 0x1, 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_EffectAlwaysHit: BattleScript_EffectPlaceholder43: @@ -504,7 +546,6 @@ BattleScript_EffectAlwaysCrit: BattleScript_EffectUnused6e: BattleScript_EffectPursuit: BattleScript_EffectUnused8d: -BattleScript_EffectPlaceholder200: BattleScript_EffectPlaceholder209: BattleScript_EffectHit:: BattleScript_EffectLowKick: diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index cedebfe85b..0924d6576c 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -201,7 +201,7 @@ #define EFFECT_SECRET_POWER 197 #define EFFECT_DOUBLE_EDGE 198 #define EFFECT_TEETER_DANCE 199 -#define EFFECT_PLACEHOLDER_200 200 +#define EFFECT_HIT_ESCAPE 200 #define EFFECT_MUD_SPORT 201 #define EFFECT_POISON_FANG 202 #define EFFECT_WEATHER_BALL 203 diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index 6ec868467d..3d33820c7c 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -4432,7 +4432,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_U_TURN - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HIT_ESCAPE, .power = 70, .type = TYPE_BUG, .accuracy = 100, @@ -6256,7 +6256,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_VOLT_SWITCH - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HIT_ESCAPE, .power = 70, .type = TYPE_ELECTRIC, .accuracy = 100, From 45bc76d94c7015c46f7d0be7b194fc794d65a3bf Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 24 Jul 2018 20:13:02 +0200 Subject: [PATCH 048/667] Side Status from u16 to u32 --- asm/macros/battle_script.inc | 2 +- include/battle.h | 2 +- src/battle_debug.c | 32 ++++++++++++++++---------------- src/battle_main.c | 2 +- src/battle_message.c | 24 ++++++++++++------------ src/battle_script_commands.c | 10 +++++----- src/battle_tv.c | 4 +--- 7 files changed, 37 insertions(+), 39 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 83876e013a..bceb584afe 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -150,7 +150,7 @@ .macro jumpifsideaffecting bank, sidestatus, param2 .byte 0x1f .byte \bank - .2byte \sidestatus + .4byte \sidestatus .4byte \param2 .endm diff --git a/include/battle.h b/include/battle.h index ff19aebbb0..219005692a 100644 --- a/include/battle.h +++ b/include/battle.h @@ -807,7 +807,7 @@ 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]; diff --git a/src/battle_debug.c b/src/battle_debug.c index 105af0aa5a..c51c0514c9 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -1036,9 +1036,9 @@ static u8 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus, if (changeStatus) { if (statusTrue) - *(u16*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_REFLECT; + *(u32*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_REFLECT; else - *(u16*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_REFLECT); + *(u32*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_REFLECT); sideTimer->reflectBattlerId = data->battlerId; } return &sideTimer->reflectTimer; @@ -1046,9 +1046,9 @@ static u8 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus, if (changeStatus) { if (statusTrue) - *(u16*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_LIGHTSCREEN; + *(u32*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_LIGHTSCREEN; else - *(u16*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_LIGHTSCREEN); + *(u32*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_LIGHTSCREEN); sideTimer->lightscreenBattlerId = data->battlerId; } return &sideTimer->lightscreenTimer; @@ -1056,18 +1056,18 @@ static u8 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus, if (changeStatus) { if (statusTrue) - *(u16*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_SPIKES; + *(u32*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_SPIKES; else - *(u16*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_SPIKES); + *(u32*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_SPIKES); } return &sideTimer->spikesAmount; case LIST_SIDE_SAFEGUARD: if (changeStatus) { if (statusTrue) - *(u16*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_SAFEGUARD; + *(u32*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_SAFEGUARD; else - *(u16*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_SAFEGUARD); + *(u32*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_SAFEGUARD); sideTimer->safeguardBattlerId = data->battlerId; } return &sideTimer->safeguardTimer; @@ -1075,9 +1075,9 @@ static u8 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus, if (changeStatus) { if (statusTrue) - *(u16*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_MIST; + *(u32*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_MIST; else - *(u16*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_MIST); + *(u32*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_MIST); sideTimer->mistBattlerId = data->battlerId; } return &sideTimer->mistTimer; @@ -1085,9 +1085,9 @@ static u8 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus, if (changeStatus) { if (statusTrue) - *(u16*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_AURORA_VEIL; + *(u32*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_AURORA_VEIL; else - *(u16*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_AURORA_VEIL); + *(u32*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_AURORA_VEIL); sideTimer->auroraVeilBattlerId = data->battlerId; } return &sideTimer->auroraVeilTimer; @@ -1095,9 +1095,9 @@ static u8 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus, if (changeStatus) { if (statusTrue) - *(u16*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_LUCKY_CHANT; + *(u32*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_LUCKY_CHANT; else - *(u16*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_LUCKY_CHANT); + *(u32*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_LUCKY_CHANT); sideTimer->luckyChantBattlerId = data->battlerId; } return &sideTimer->luckyChantTimer; @@ -1105,9 +1105,9 @@ static u8 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus, if (changeStatus) { if (statusTrue) - *(u16*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_TAILWIND; + *(u32*)(data->modifyArrows.modifiedValPtr) |= SIDE_STATUS_TAILWIND; else - *(u16*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_TAILWIND); + *(u32*)(data->modifyArrows.modifiedValPtr) &= ~(SIDE_STATUS_TAILWIND); sideTimer->tailwindBattlerId = data->battlerId; } return &sideTimer->tailwindTimer; diff --git a/src/battle_main.c b/src/battle_main.c index d0ce224313..aece1df424 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -251,7 +251,7 @@ 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}; diff --git a/src/battle_message.c b/src/battle_message.c index 68e67c22c6..6b5cbf1621 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -55,7 +55,7 @@ extern void sub_81A36D0(u8 arg0, u16 trainerId); // battle_frontier_2 extern void sub_81D572C(u8 arg0, u16 trainerId); // pokenav extern void GetFrontierTrainerName(u8 *dst, u16 trainerId); -// this file's functions +// this file’s functions static void ChooseMoveUsedParticle(u8 *textPtr); static void ChooseTypeOfMoveUsedString(u8 *dst); static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst); @@ -590,31 +590,31 @@ static const u8 sText_TargetAbilityRaisedStat[] = _("{B_DEF_NAME_WITH_PREFIX}’ static const u8 sText_AttackerAbilityRaisedStat[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_ATK_ABILITY}\n raised its {B_BUFF1}!"); // These strings are currently placeholders, to be fixed. -static const u8 sText_AuroraVeilEnds[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY}\nwore off!"); +static const u8 sText_AuroraVeilEnds[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nwore off!"); static const u8 sText_ElectricTerrainEnds[] = _("{B_ATK_ABILITY} wore off."); static const u8 sText_MistyTerrainEnds[] = _("{B_ATK_ABILITY} wore off."); static const u8 sText_PsychicTerrainEnds[] = _("{B_ATK_ABILITY} wore off."); static const u8 sText_GrassyTerrainEnds[] = _("{B_ATK_ABILITY} wore off."); -static const u8 sText_AngryPointActivates[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} maxed\nits attack!"); +static const u8 sText_AngryPointActivates[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_ATK_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[] = _("The {B_DEF_NAME_WITH_PREFIX} is tormented\nby {B_DEF_ABILITY}!"); static const u8 sText_MoldBreakerEnters[] = _("The {B_DEF_NAME_WITH_PREFIX} breaks the mold!"); static const u8 sText_TeravoltEnters[] = _("{B_ATK_NAME_WITH_PREFIX} is radiating a bursting aura!"); static const u8 sText_TurboblazeEnters[] = _("{B_ATK_NAME_WITH_PREFIX} is radiating a blazing aura!"); -static const u8 sText_SlowStartEnters[] = _("{B_ATK_NAME_WITH_PREFIX} can't get it going!"); +static const u8 sText_SlowStartEnters[] = _("{B_ATK_NAME_WITH_PREFIX} can’t get it going!"); static const u8 sText_SlowStartEnd[] = _("{B_ATK_NAME_WITH_PREFIX} finally got its act together!"); -static const u8 sText_SolarPowerHpDrop[] = _("The {B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY}\ntakes its toll!"); +static const u8 sText_SolarPowerHpDrop[] = _("The {B_ATK_NAME_WITH_PREFIX}’s {B_ATK_ABILITY}\ntakes its toll!"); static const u8 sText_AftermathDmg[] = _("The {B_DEF_NAME_WITH_PREFIX}\nsuffers the {B_DEF_ABILITY}!"); static const u8 sText_AnticipationActivates[] = _("The {B_ATK_NAME_WITH_PREFIX} shuddered in {B_ATK_ABILITY}!"); -static const u8 sText_ForewarnActivates[] = _("{B_ATK_ABILITY} alerted the {B_ATK_NAME_WITH_PREFIX} to the\n{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_ForewarnActivates[] = _("{B_ATK_ABILITY} alerted the {B_ATK_NAME_WITH_PREFIX} to the\n{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[] = _("{B_ATK_NAME_WITH_PREFIX} is too nervous to eat Berries!"); static const u8 sText_HarvestBerry[] = _("{B_ATK_NAME_WITH_PREFIX} harvested its {B_LAST_ITEM}!"); -static const u8 sText_MoxieAtkRise[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} raised its Attack!"); +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_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}!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = @@ -3136,7 +3136,7 @@ static void ChooseMoveUsedParticle(u8* textBuff) if (counter <= 2) StringCopy(textBuff, sText_SpaceIs); // is else if (counter <= 4) - StringCopy(textBuff, sText_ApostropheS); // 's + StringCopy(textBuff, sText_ApostropheS); // ’s } } @@ -3144,7 +3144,7 @@ static void ChooseMoveUsedParticle(u8* textBuff) // into the table of moves at sGrammarMoveUsedTable and varied the line accordingly. // // sText_ExclamationMark was a plain "!", used for any attack not on the list. -// It resulted in the translation "'s !". +// It resulted in the translation "’s !". // // sText_ExclamationMark2 was "? ????!". This resulted in the translation // " used !", which was used for all attacks in English. @@ -3157,7 +3157,7 @@ static void ChooseMoveUsedParticle(u8* textBuff) // " did an !". // // sText_ExclamationMark5 was " ????!" This resulted in a translation of -// "'s attack!". +// "’s attack!". static void ChooseTypeOfMoveUsedString(u8* dst) { s32 counter = 0; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e654ddbb24..3081e6d305 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2942,21 +2942,21 @@ static void atk1E_jumpifability(void) static void atk1F_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 atk20_jumpifstat(void) diff --git a/src/battle_tv.c b/src/battle_tv.c index 2bad9ff4bc..1d70f7ab91 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -1428,11 +1428,9 @@ static void TrySetBattleSeminarShow(void) powerOverride = 0; if (ShouldCalculateDamage(gCurrentMove, &dmgByMove[i], &powerOverride)) { - u8 moveResultFlags; - u16 sideStatus = gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)]; gBattleMoveDamage = CalculateMoveDamage(gCurrentMove, gBattlerAttacker, gBattlerTarget, gBattleMoves[gCurrentMove].type, powerOverride, 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; } } From f8b1f0a45cb9ca815f3dbb1ec972463400f7b47c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 24 Jul 2018 21:47:00 +0200 Subject: [PATCH 049/667] Stealth Rock and Toxic Spikes --- data/battle_scripts_1.s | 41 +++++++++----- include/battle.h | 1 + include/battle_scripts.h | 8 ++- include/battle_util.h | 1 + include/constants/battle.h | 29 +++++----- include/constants/battle_string_ids.h | 5 +- src/battle_debug.c | 28 ++++++++- src/battle_message.c | 13 ++++- src/battle_script_commands.c | 82 ++++++++++++++++++++------- src/battle_util.c | 47 +++++++++++++++ 10 files changed, 202 insertions(+), 53 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 34921fd234..db1effac89 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3789,58 +3789,71 @@ 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 setbyte sMOVEEND_STATE, 0x0 moveend 0x0, 0x0 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 setbyte sMOVEEND_STATE, 0x0 moveend 0x0, 0x0 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 setbyte sMOVEEND_STATE, 0x0 moveend 0x0, 0x0 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_PerishSongTakesLife:: printstring STRINGID_PKMNPERISHCOUNTFELL diff --git a/include/battle.h b/include/battle.h index 219005692a..cb1abd43c3 100644 --- a/include/battle.h +++ b/include/battle.h @@ -256,6 +256,7 @@ struct SideTimer /*0x09*/ u8 followmeTarget; /*0x0A*/ u8 spikesAmount; u8 toxicSpikesAmount; + u8 stealthRockAmount; u8 auroraVeilTimer; u8 auroraVeilBattlerId; u8 tailwindTimer; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index f07670c51e..8c809671f3 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -78,11 +78,11 @@ 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_DmgHazardsOnAttacker[]; extern const u8 BattleScript_82DAE7A[]; -extern const u8 BattleScript_SpikesOnTarget[]; +extern const u8 BattleScript_DmgHazardsOnTarget[]; extern const u8 BattleScript_82DAEB1[]; -extern const u8 BattleScript_SpikesOnFaintedBattler[]; +extern const u8 BattleScript_DmgHazardsOnFaintedBattler[]; extern const u8 BattleScript_82DAEE8[]; extern const u8 BattleScript_82DAEFE[]; extern const u8 BattleScript_PerishSongTakesLife[]; @@ -314,5 +314,7 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/battle_util.h b/include/battle_util.h index 2086de722a..fa3120c006 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -84,5 +84,6 @@ s32 CalculateMoveDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, s32 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); #endif // GUARD_BATTLE_UTIL_H diff --git a/include/constants/battle.h b/include/constants/battle.h index 8f31578b73..f1dee674ec 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -188,19 +188,22 @@ #define HITMARKER_UNK(battler) (0x10000000 << 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_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_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) // Field affecting statuses. #define STATUS_FIELD_MAGIC_ROOM 0x1 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index a3d6cb8f86..558dfcef9c 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -473,7 +473,10 @@ #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 BATTLESTRINGS_COUNT 463 +#define BATTLESTRINGS_COUNT 466 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_debug.c b/src/battle_debug.c index c51c0514c9..94ec9db24d 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -115,7 +115,9 @@ enum LIST_SIDE_MIST, LIST_SIDE_AURORA_VEIL, LIST_SIDE_LUCKY_CHANT, - LIST_SIDE_TAILWIND + LIST_SIDE_TAILWIND, + LIST_SIDE_STEALTH_ROCK, + LIST_SIDE_TOXIC_SPIKES, }; // const rom data @@ -173,6 +175,8 @@ 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_EmptyString[] = _(""); @@ -323,6 +327,8 @@ static const struct ListMenuItem sSideStatusListItems[] = {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}, }; static const struct ListMenuItem sSecondaryListItems[] = @@ -1111,6 +1117,24 @@ static u8 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus, 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; default: return NULL; } @@ -1219,6 +1243,8 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) if (data->currentSecondaryListItemId == LIST_SIDE_SPIKES) data->modifyArrows.maxValue = 3; + else if (data->currentSecondaryListItemId == LIST_SIDE_STEALTH_ROCK) + data->modifyArrows.maxValue = 1; else data->modifyArrows.maxValue = 9; diff --git a/src/battle_message.c b/src/battle_message.c index 6b5cbf1621..fd0cfed585 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -588,8 +588,6 @@ 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_ATK_ABILITY}\n raised its {B_BUFF1}!"); static const u8 sText_AttackerAbilityRaisedStat[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_ATK_ABILITY}\n raised its {B_BUFF1}!"); - -// These strings are currently placeholders, to be fixed. static const u8 sText_AuroraVeilEnds[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nwore off!"); static const u8 sText_ElectricTerrainEnds[] = _("{B_ATK_ABILITY} wore off."); static const u8 sText_MistyTerrainEnds[] = _("{B_ATK_ABILITY} wore off."); @@ -616,6 +614,9 @@ static const u8 sText_MoxieAtkRise[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_ATK_AB 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[] = _(""); +static const u8 sText_ToxicSpikesPoisoned[] = _(""); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { @@ -1081,6 +1082,14 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_MagicBounceActivates, sText_ProteanTypeChange, sText_SymbiosisItemPass, + sText_StealthRockDmg, + sText_ToxicSpikesAbsorbed, + sText_ToxicSpikesPoisoned, +}; + +const u16 gDmgHazardsStringIds[] = +{ + STRINGID_PKMNHURTBYSPIKES, STRINGID_STEALTHROCKDMG }; const u16 gSwitchInAbilityStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 3081e6d305..80e70dc8a8 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2765,7 +2765,7 @@ static void atk19_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 { @@ -5315,6 +5315,22 @@ static void atk51_switchhandleorder(void) 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 atk52_switchineffects(void) { s32 i; @@ -5327,30 +5343,57 @@ static void atk52_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) + && 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)) + { + 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 { @@ -5362,7 +5405,7 @@ static void atk52_switchineffects(void) if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gActiveBattler, 0, 0, 0) == 0 && ItemBattleEffects(0, gActiveBattler, 0) == 0) { - 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); for (i = 0; i < gBattlersCount; i++) { @@ -9484,6 +9527,7 @@ static void atkDC_setstealthrock(void) else { gSideStatuses[targetSide] |= SIDE_STATUS_STEALTH_ROCK; + gSideTimers[targetSide].stealthRockAmount = 1; gBattlescriptCurrInstr += 5; } } diff --git a/src/battle_util.c b/src/battle_util.c index 2ad7508d79..05f682691b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5230,3 +5230,50 @@ u16 GetTypeModifier(u8 atkType, u8 defType) { 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; +} From 100ce73a12a741dd8da25e6dc610af001be0bce5 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 24 Jul 2018 22:09:55 +0200 Subject: [PATCH 050/667] Sticky Web done --- asm/macros/battle_script.inc | 8 ++++++++ data/battle_scripts_1.s | 20 ++++++++++++++++++++ include/battle.h | 2 ++ include/battle_scripts.h | 1 + include/constants/battle_script_commands.h | 2 ++ include/constants/battle_string_ids.h | 3 ++- src/battle_debug.c | 14 +++++++++++++- src/battle_message.c | 2 ++ src/battle_script_commands.c | 16 ++++++++++++++++ 9 files changed, 66 insertions(+), 2 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index bceb584afe..bd6a2ac7ed 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1365,6 +1365,14 @@ various \battler, VARIOUS_SWITCHIN_ABILITIES .endm + .macro savetarget + various BS_TARGET, VARIOUS_SAVE_TARGET + .endm + + .macro restoretarget + various BS_TARGET, VARIOUS_RESTORE_TARGET + .endm + @ helpful macros .macro setstatchanger stat, stages, down setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index db1effac89..0d20dd5edb 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3854,6 +3854,26 @@ BattleScript_ToxicSpikesPoisoned:: updatestatusicon BS_SCRIPTING waitstate return + +BattleScript_StickyWebOnSwitchIn:: + savetarget + copybyte gBattlerTarget sBANK + printstring STRINGID_STICKYWEBSWITCHIN + waitmessage 0x40 + statbuffchange 0x1, 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 diff --git a/include/battle.h b/include/battle.h index cb1abd43c3..37bccc3cd3 100644 --- a/include/battle.h +++ b/include/battle.h @@ -257,6 +257,7 @@ struct SideTimer /*0x0A*/ u8 spikesAmount; u8 toxicSpikesAmount; u8 stealthRockAmount; + u8 stickyWebAmount; u8 auroraVeilTimer; u8 auroraVeilBattlerId; u8 tailwindTimer; @@ -592,6 +593,7 @@ struct BattleStruct u8 magnitudeBasePower; u8 presentBasePower; u8 roostTypes[MAX_BATTLERS_COUNT][3]; + u8 savedBattlerTarget; }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 8c809671f3..ef220ee56a 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -316,5 +316,6 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index bf88aba9c3..2e73bd8086 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -74,6 +74,8 @@ #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 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 558dfcef9c..3ba5c7b4d3 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -476,7 +476,8 @@ #define STRINGID_STEALTHROCKDMG 473 #define STRINGID_TOXICSPIKESABSORBED 474 #define STRINGID_TOXICSPIKESPOISONED 475 +#define STRINGID_STICKYWEBSWITCHIN 476 -#define BATTLESTRINGS_COUNT 466 +#define BATTLESTRINGS_COUNT 467 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_debug.c b/src/battle_debug.c index 94ec9db24d..e0b69c4b68 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -118,6 +118,7 @@ enum LIST_SIDE_TAILWIND, LIST_SIDE_STEALTH_ROCK, LIST_SIDE_TOXIC_SPIKES, + LIST_SIDE_STICKY_WEB, }; // const rom data @@ -177,6 +178,7 @@ 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_EmptyString[] = _(""); @@ -329,6 +331,7 @@ static const struct ListMenuItem sSideStatusListItems[] = {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[] = @@ -1135,6 +1138,15 @@ static u8 *GetSideStatusValue(struct BattleDebugMenu *data, bool32 changeStatus, *(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; } @@ -1243,7 +1255,7 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) if (data->currentSecondaryListItemId == LIST_SIDE_SPIKES) data->modifyArrows.maxValue = 3; - else if (data->currentSecondaryListItemId == LIST_SIDE_STEALTH_ROCK) + else if (data->currentSecondaryListItemId == LIST_SIDE_STEALTH_ROCK || data->currentSecondaryListItemId == LIST_SIDE_STICKY_WEB) data->modifyArrows.maxValue = 1; else data->modifyArrows.maxValue = 9; diff --git a/src/battle_message.c b/src/battle_message.c index fd0cfed585..df02f9fcd6 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -617,6 +617,7 @@ static const u8 sText_SymbiosisItemPass[] = _("{B_ATK_NAME_WITH_PREFIX} passed i static const u8 sText_StealthRockDmg[] = _("Pointed stones dug into\n{B_SCR_ACTIVE_NAME_WITH_PREFIX}!"); static const u8 sText_ToxicSpikesAbsorbed[] = _(""); static const u8 sText_ToxicSpikesPoisoned[] = _(""); +static const u8 sText_StickyWebSwitchIn[] = _(""); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { @@ -1085,6 +1086,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_StealthRockDmg, sText_ToxicSpikesAbsorbed, sText_ToxicSpikesPoisoned, + sText_StickyWebSwitchIn, }; const u16 gDmgHazardsStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 80e70dc8a8..4605830712 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5395,6 +5395,16 @@ static void atk52_switchineffects(void) } } } + 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 { if (gBattleMons[gActiveBattler].ability == ABILITY_TRUANT && !gDisableStructs[gActiveBattler].truantUnknownBit) @@ -6606,6 +6616,12 @@ static void atk76_various(void) gBattlescriptCurrInstr += 3; AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gActiveBattler, 0, 0, 0); return; + case VARIOUS_SAVE_TARGET: + gBattleStruct->savedBattlerTarget = gBattlerTarget; + break; + case VARIOUS_RESTORE_TARGET: + gBattlerTarget = gBattleStruct->savedBattlerTarget; + break; } gBattlescriptCurrInstr += 3; From 1c95c36338addcaccb218f8444284dd715d7f966 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 26 Jul 2018 20:36:16 +0200 Subject: [PATCH 051/667] Healing Wish and Lunar Dance --- asm/macros/battle_script.inc | 20 +++++++++ data/battle_scripts_1.s | 51 ++++++++++++++++++++-- include/constants/battle_move_effects.h | 2 +- include/constants/battle_script_commands.h | 4 ++ include/constants/battle_string_ids.h | 5 ++- include/data/battle_moves.h | 4 +- src/battle_controller_opponent.c | 7 +++ src/battle_message.c | 11 +++++ src/battle_script_commands.c | 37 ++++++++++++++-- 9 files changed, 131 insertions(+), 10 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index bd6a2ac7ed..9bc4b06870 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1373,6 +1373,18 @@ various BS_TARGET, VARIOUS_RESTORE_TARGET .endm + .macro instanthpdrop battler + various \battler, VARIOUS_INSTANT_HP_DROP + .endm + + .macro clearstatus battler + various \battler, VARIOUS_CLEAR_STATUS + .endm + + .macro restorepp battler + various \battler, VARIOUS_RESTORE_PP + .endm + @ helpful macros .macro setstatchanger stat, stages, down setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7 @@ -1430,6 +1442,10 @@ jumpifhalfword CMP_NOT_EQUAL, gCurrentMove, \move, \jumpptr .endm + .macro jumpifnotchosenmove move, jumpptr + jumpifhalfword CMP_NOT_EQUAL, gChosenMove, \move, \jumpptr + .endm + .macro jumpifstatus3 bank, status, jumpptr jumpifstatus3condition \bank, \status, 0x0, \jumpptr .endm @@ -1453,3 +1469,7 @@ .macro dmg_1_8_targethp manipulatedamage ATK80_1_8_TARGET_HP .endm + + .macro dmgtomaxattackerhp + manipulatedamage ATK80_FULL_ATTACKER_HP + .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 0d20dd5edb..5ec5c41a58 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -124,7 +124,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectNightmare .4byte BattleScript_EffectMinimize .4byte BattleScript_EffectCurse - .4byte BattleScript_EffectUnused6e + .4byte BattleScript_EffectHealingWish .4byte BattleScript_EffectProtect .4byte BattleScript_EffectSpikes .4byte BattleScript_EffectForesight @@ -271,6 +271,52 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectPowerSplit .4byte BattleScript_EffectGuardSplit +BattleScript_EffectHealingWish: + attackcanceler + attackstring + ppreduce + attackanimation + waitanimation + instanthpdrop BS_ATTACKER + setatkhptozero + tryfaintmon BS_ATTACKER, FALSE, NULL + jumpifcantswitch ATK4F_DONT_CHECK_STATUSES | BS_ATTACKER, BattleScript_EffectHealingWishEnd + 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 ATK80_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: + setbyte sMOVEEND_STATE, 0x0 + moveend 0x0, 0x0 + end + BattleScript_EffectWorrySeed: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -543,7 +589,6 @@ BattleScript_EffectVitalThrow: BattleScript_EffectUnused60: BattleScript_EffectFalseSwipe: BattleScript_EffectAlwaysCrit: -BattleScript_EffectUnused6e: BattleScript_EffectPursuit: BattleScript_EffectUnused8d: BattleScript_EffectPlaceholder209: @@ -2073,7 +2118,7 @@ BattleScript_EffectBatonPass:: jumpifcantswitch ATK4F_DONT_CHECK_STATUSES | BS_ATTACKER, BattleScript_ButItFailed attackanimation waitanimation - openpartyscreen 0x1, BattleScript_ButItFailed + openpartyscreen BS_ATTACKER, BattleScript_ButItFailed switchoutabilities BS_ATTACKER waitstate switchhandleorder BS_ATTACKER, 0x2 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 0924d6576c..e5f2a678ef 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -111,7 +111,7 @@ #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 diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 2e73bd8086..fdce1e686e 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -76,12 +76,16 @@ #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 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 #define ATK80_DMG_HALF_BY_TWO_NOT_MORE_THAN_HALF_MAX_HP 1 #define ATK80_DMG_DOUBLED 2 #define ATK80_1_8_TARGET_HP 3 +#define ATK80_FULL_ATTACKER_HP 4 // atk4F, a flag used for the jumpifcantswitch command #define ATK4F_DONT_CHECK_STATUSES 0x80 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 3ba5c7b4d3..42c5c05667 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -477,7 +477,10 @@ #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 BATTLESTRINGS_COUNT 467 +#define BATTLESTRINGS_COUNT 490 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index 3d33820c7c..30583abb0a 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -4336,7 +4336,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_HEALING_WISH - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HEALING_WISH, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -5536,7 +5536,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_LUNAR_DANCE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HEALING_WISH, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 1eaa9da18f..940f1b77aa 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -101,6 +101,7 @@ static void OpponentHandleBattleAnimation(void); static void OpponentHandleLinkStandbyMsg(void); static void OpponentHandleResetActionMoveSelection(void); static void OpponentHandleCmd55(void); +static void OpponentHandleDebugMenu(void); static void nullsub_91(void); static void OpponentBufferRunCommand(void); @@ -173,6 +174,7 @@ static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void) = OpponentHandleLinkStandbyMsg, OpponentHandleResetActionMoveSelection, OpponentHandleCmd55, + OpponentHandleDebugMenu, nullsub_91 }; @@ -2007,6 +2009,11 @@ static void OpponentHandleCmd55(void) OpponentBufferExecCompleted(); } +static void OpponentHandleDebugMenu(void) +{ + OpponentBufferExecCompleted(); +} + static void nullsub_91(void) { } diff --git a/src/battle_message.c b/src/battle_message.c index df02f9fcd6..258ff58e50 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -618,6 +618,9 @@ static const u8 sText_StealthRockDmg[] = _("Pointed stones dug into\n{B_SCR_ACTI static const u8 sText_ToxicSpikesAbsorbed[] = _(""); static const u8 sText_ToxicSpikesPoisoned[] = _(""); static const u8 sText_StickyWebSwitchIn[] = _(""); +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!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { @@ -1087,6 +1090,14 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_ToxicSpikesAbsorbed, sText_ToxicSpikesPoisoned, sText_StickyWebSwitchIn, + sText_HealingWishCameTrue, + sText_HealingWishHealed, + sText_LunarDanceCameTrue, +}; + +const u16 gHealingWishStringIds[] = +{ + STRINGID_HEALINGWISHCAMETRUE, STRINGID_LUNARDANCECAMETRUE }; const u16 gDmgHazardsStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 4605830712..ce0c494302 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4395,7 +4395,10 @@ static void atk49_moveend(void) if (!(gHitMarker & HITMARKER_OBEYS) || holdEffectAtk != HOLD_EFFECT_CHOICE_BAND || gChosenMove == MOVE_STRUGGLE || (*choicedMoveAtk != 0 && *choicedMoveAtk != 0xFFFF)) goto LOOP; - 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.atk49_state++; break; @@ -4499,7 +4502,8 @@ static void atk49_moveend(void) } 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) { @@ -5308,7 +5312,6 @@ static void atk51_switchhandleorder(void) PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerAttacker].species) PREPARE_MON_NICK_BUFFER(gBattleTextBuff2, gActiveBattler, gBattleBufferB[gActiveBattler][1]) - break; } @@ -6341,6 +6344,9 @@ static void atk6E_setatktoplayer0(void) static void atk6F_makevisible(void) { + if (gBattleControllerExecFlags) + return; + gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); BtlController_EmitSpriteInvisibility(0, FALSE); MarkBattlerForControllerExec(gActiveBattler); @@ -6438,6 +6444,10 @@ static void atk76_various(void) { u8 side; s32 i; + u8 data[10]; + + if (gBattleControllerExecFlags) + return; gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); @@ -6622,6 +6632,24 @@ static void atk76_various(void) 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); + break; } gBattlescriptCurrInstr += 3; @@ -6884,6 +6912,9 @@ static void atk80_manipulatedamage(void) if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; break; + case ATK80_FULL_ATTACKER_HP: + gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP; + break; } gBattlescriptCurrInstr += 2; From 16d38f5343f5be0a272ac8b4c7616814dd20494f Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 26 Jul 2018 21:56:23 +0200 Subject: [PATCH 052/667] Add a couple of gen5 abilities --- data/battle_scripts_1.s | 50 ++++++++++++++ include/battle_scripts.h | 4 ++ include/constants/battle_string_ids.h | 6 +- src/battle_debug.c | 2 +- src/battle_message.c | 12 +++- src/battle_script_commands.c | 17 ++++- src/battle_util.c | 95 ++++++++++++++++++++++++++- 7 files changed, 179 insertions(+), 7 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 5ec5c41a58..76fa21a7c0 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4523,6 +4523,15 @@ BattleScript_RainDishActivates:: healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER end3 + +BattleScript_SolarPowerActivates:: + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + healthbarupdate BS_ATTACKER + datahpupdate BS_ATTACKER + printstring STRINGID_SOLARPOWERHPDROP + waitmessage 0x40 + tryfaintmon BS_ATTACKER, FALSE, NULL + end3 BattleScript_SandstreamActivates:: pause 0x20 @@ -4754,6 +4763,16 @@ BattleScript_ColorChangeActivates:: waitmessage 0x40 return +BattleScript_CursedBodyActivates:: + printstring STRINGID_CUSEDBODYDISABLED + waitmessage 0x40 + return + +BattleScript_MummyActivates:: + printstring STRINGID_ATTACKERACQUIREDABILITY + waitmessage 0x40 + return + BattleScript_AngryPointActivates:: setbyte sB_ANIM_ARG1 0x38 setbyte sB_ANIM_ARG2 0x0 @@ -4770,6 +4789,37 @@ BattleScript_TargetAbilityStatRaise:: waitmessage 0x40 return +BattleScript_WeakArmorActivates:: + setstatchanger STAT_DEF, 1, TRUE + statbuffchange 0x1, 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, 1, FALSE + statbuffchange 0x1, 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:: setgraphicalstatchangevalues playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index ef220ee56a..b5835676f1 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -317,5 +317,9 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 42c5c05667..ad4ffd8921 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -480,7 +480,11 @@ #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 BATTLESTRINGS_COUNT 490 +#define BATTLESTRINGS_COUNT 496 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_debug.c b/src/battle_debug.c index e0b69c4b68..d625cdd70a 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -1162,7 +1162,7 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) { case LIST_ITEM_ABILITY: data->modifyArrows.minValue = 0; - data->modifyArrows.maxValue = ABILITIES_COUNT - 1; + data->modifyArrows.maxValue = ABILITIES_COUNT_GEN5 - 1; data->modifyArrows.maxDigits = 3; data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].ability; data->modifyArrows.typeOfVal = VAL_U8; diff --git a/src/battle_message.c b/src/battle_message.c index 258ff58e50..5bdbe97053 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -586,8 +586,9 @@ 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_ATK_ABILITY}\n raised its {B_BUFF1}!"); -static const u8 sText_AttackerAbilityRaisedStat[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_ATK_ABILITY}\n raised its {B_BUFF1}!"); +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_AuroraVeilEnds[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nwore off!"); static const u8 sText_ElectricTerrainEnds[] = _("{B_ATK_ABILITY} wore off."); static const u8 sText_MistyTerrainEnds[] = _("{B_ATK_ABILITY} wore off."); @@ -621,6 +622,9 @@ static const u8 sText_StickyWebSwitchIn[] = _(""); 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!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { @@ -1093,6 +1097,10 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_HealingWishCameTrue, sText_HealingWishHealed, sText_LunarDanceCameTrue, + sText_CursedBodyDisabled, + sText_AttackerAquiredAbility, + sText_TargetAbilityLoweredStat, + sText_TargetStatWontGoHigher, }; const u16 gHealingWishStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ce0c494302..8ff4fddbf6 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1182,9 +1182,12 @@ static void atk01_accuracycheck(void) buff = 0xC; moveAcc = gBattleMoves[move].accuracy; - // check Thunder on sunny weather + // Check Thunder on sunny weather. if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY && gBattleMoves[move].effect == EFFECT_THUNDER) 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; @@ -7737,6 +7740,7 @@ static void atk96_weatherdamage(void) && ability != ABILITY_SAND_VEIL && ability != ABILITY_SAND_FORCE && ability != ABILITY_SAND_RUSH + && ability != ABILITY_OVERCOAT && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERGROUND) && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER)) { @@ -7762,6 +7766,7 @@ static void atk96_weatherdamage(void) } else if (!IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ICE) && ability != ABILITY_SNOW_CLOAK + && ability != ABILITY_OVERCOAT && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERGROUND) && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER)) { @@ -9703,13 +9708,21 @@ static void atkE2_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) + gBattleMons[gActiveBattler].maxHP = gBattleMons[gActiveBattler].maxHP; + BtlController_EmitSetMonData(0, REQUEST_HP_BATTLE, gBitTable[*(gBattleStruct->field_58 + gActiveBattler)], 2, &gBattleMoveDamage); + MarkBattlerForControllerExec(gActiveBattler); + break; } gBattlescriptCurrInstr += 2; diff --git a/src/battle_util.c b/src/battle_util.c index 05f682691b..c4dacd71d1 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2615,6 +2615,16 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA effect++; } break; + 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; } } break; @@ -2741,6 +2751,88 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA case ABILITYEFFECT_CONTACT: // 4 switch (gLastUsedAbility) { + case ABILITY_JUSTIFIED: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && TARGET_TURN_DAMAGED + && IsBattlerAlive(battler) + && moveType == TYPE_DARK + && gBattleMons[battler].statStages[STAT_ATK] != 0xC) + { + gBattleMons[battler].statStages[STAT_ATK]++; + 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] != 0xC) + { + gBattleMons[battler].statStages[STAT_SPEED]++; + SET_STATCHANGER(STAT_SPEED, 1, FALSE); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaise; + effect++; + } + break; + case ABILITY_WEAK_ARMOR: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && TARGET_TURN_DAMAGED + && IsBattlerAlive(battler) + && (gBattleMons[battler].statStages[STAT_SPEED] != 0xC || 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) + && ((i = GetBattleMonMoveSlot(&gBattleMons[gBattlerAttacker], gChosenMove)) != 4) + && (Random() % 3) == 0) + { + gDisableStructs[gBattlerAttacker].disabledMove = gChosenMove; + gDisableStructs[gBattlerAttacker].disableTimer1 = 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 @@ -2770,13 +2862,14 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } 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 && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)) { - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16; + gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 8; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; BattleScriptPushCursor(); From d991d669da0bf6f4a7aaf555815c3082c6543835 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 26 Jul 2018 22:52:13 +0200 Subject: [PATCH 053/667] Add Moxie --- asm/macros/battle_script.inc | 4 + data/battle_scripts_1.s | 1 + include/constants/battle_script_commands.h | 3 +- src/battle_script_commands.c | 349 +++------------------ 4 files changed, 49 insertions(+), 308 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 9bc4b06870..999081be6e 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1385,6 +1385,10 @@ various \battler, VARIOUS_RESTORE_PP .endm + .macro tryactivatemoxie battler + various \battler, VARIOUS_TRY_ACTIVATE_MOXIE + .endm + @ helpful macros .macro setstatchanger stat, stages, down setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 76fa21a7c0..459520e096 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3201,6 +3201,7 @@ BattleScript_FaintTarget:: dofaintanimation BS_TARGET cleareffectsonfaint BS_TARGET printstring STRINGID_TARGETFAINTED + tryactivatemoxie BS_ATTACKER return BattleScript_GiveExp:: diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index fdce1e686e..5fa34f0b22 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -78,7 +78,8 @@ #define VARIOUS_RESTORE_TARGET 30 #define VARIOUS_INSTANT_HP_DROP 31 #define VARIOUS_CLEAR_STATUS 32 -#define VARIOUS_RESTORE_PP 33 +#define VARIOUS_RESTORE_PP 33 +#define VARIOUS_TRY_ACTIVATE_MOXIE 34 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 8ff4fddbf6..180a1161fa 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3316,14 +3316,10 @@ static void atk23_getexp(void) } } -#ifdef NONMATCHING -static void atk24(void) +static bool32 IsBattleLostForPlayer(void) { - u16 HP_count = 0; - s32 i; - - if (gBattleControllerExecFlags) - return; + u32 i; + u32 HP_count = 0; if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId == TRAINER_STEVEN_PARTNER) { @@ -3335,7 +3331,7 @@ static void atk24(void) } else { - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) && (!(gBattleTypeFlags & BATTLE_TYPE_ARENA) || !(gBattleStruct->field_2A0 & gBitTable[i]))) @@ -3345,10 +3341,15 @@ static void atk24(void) } } - if (HP_count == 0) - gBattleOutcome |= B_OUTCOME_LOST; + return (HP_count == 0); +} - for (HP_count = 0, i = 0; i < 6; i++) +static bool32 IsBattleWonForPlayer(void) +{ + u32 i; + u32 HP_count = 0; + + for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES) && !GetMonData(&gEnemyParty[i], MON_DATA_IS_EGG) && (!(gBattleTypeFlags & BATTLE_TYPE_ARENA) || !(gBattleStruct->field_2A1 & gBitTable[i]))) @@ -3357,11 +3358,22 @@ static void atk24(void) } } - if (HP_count == 0) + return (HP_count == 0); +} + +static void atk24(void) +{ + if (gBattleControllerExecFlags) + return; + + if (IsBattleLostForPlayer()) + gBattleOutcome |= B_OUTCOME_LOST; + if (IsBattleWonForPlayer()) gBattleOutcome |= B_OUTCOME_WON; if (gBattleOutcome == 0 && (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))) { + s32 i; s32 foundPlayer; s32 foundOpponent; @@ -3398,301 +3410,6 @@ static void atk24(void) gBattlescriptCurrInstr += 5; } } -#else -NAKED -static void atk24(void) -{ - asm("\n\ - .syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - movs r6, 0\n\ - ldr r0, =gBattleControllerExecFlags\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - beq _0804ACE2\n\ - b _0804AF22\n\ - _0804ACE2:\n\ - ldr r0, =gBattleTypeFlags\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 15\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0804AD48\n\ - ldr r0, =gPartnerTrainerId\n\ - ldrh r1, [r0]\n\ - ldr r0, =0x00000c03\n\ - cmp r1, r0\n\ - bne _0804AD48\n\ - movs r5, 0\n\ - _0804ACFC:\n\ - movs r0, 0x64\n\ - adds r1, r5, 0\n\ - muls r1, r0\n\ - ldr r0, =gPlayerParty\n\ - adds r4, r1, r0\n\ - adds r0, r4, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _0804AD2C\n\ - adds r0, r4, 0\n\ - movs r1, 0x2D\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - bne _0804AD2C\n\ - adds r0, r4, 0\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - adds r0, r6, r0\n\ - lsls r0, 16\n\ - lsrs r6, r0, 16\n\ - _0804AD2C:\n\ - adds r5, 0x1\n\ - cmp r5, 0x2\n\ - ble _0804ACFC\n\ - b _0804ADA8\n\ - .pool\n\ - _0804AD48:\n\ - movs r5, 0\n\ - _0804AD4A:\n\ - movs r0, 0x64\n\ - adds r1, r5, 0\n\ - muls r1, r0\n\ - ldr r0, =gPlayerParty\n\ - adds r4, r1, r0\n\ - adds r0, r4, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _0804ADA2\n\ - adds r0, r4, 0\n\ - movs r1, 0x2D\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - bne _0804ADA2\n\ - ldr r0, =gBattleTypeFlags\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 11\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0804AD94\n\ - ldr r0, =gBattleStruct\n\ - ldr r0, [r0]\n\ - movs r1, 0xA8\n\ - lsls r1, 2\n\ - adds r0, r1\n\ - ldrb r1, [r0]\n\ - ldr r2, =gBitTable\n\ - lsls r0, r5, 2\n\ - adds r0, r2\n\ - ldr r0, [r0]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - bne _0804ADA2\n\ - _0804AD94:\n\ - adds r0, r4, 0\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - adds r0, r6, r0\n\ - lsls r0, 16\n\ - lsrs r6, r0, 16\n\ - _0804ADA2:\n\ - adds r5, 0x1\n\ - cmp r5, 0x5\n\ - ble _0804AD4A\n\ - _0804ADA8:\n\ - cmp r6, 0\n\ - bne _0804ADB6\n\ - ldr r0, =gBattleOutcome\n\ - ldrb r1, [r0]\n\ - movs r2, 0x2\n\ - orrs r1, r2\n\ - strb r1, [r0]\n\ - _0804ADB6:\n\ - movs r6, 0\n\ - movs r5, 0\n\ - _0804ADBA:\n\ - movs r0, 0x64\n\ - adds r1, r5, 0\n\ - muls r1, r0\n\ - ldr r0, =gEnemyParty\n\ - adds r4, r1, r0\n\ - adds r0, r4, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _0804AE10\n\ - adds r0, r4, 0\n\ - movs r1, 0x2D\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - bne _0804AE10\n\ - ldr r0, =gBattleTypeFlags\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 11\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0804AE02\n\ - ldr r0, =gBattleStruct\n\ - ldr r0, [r0]\n\ - ldr r1, =0x000002a1\n\ - adds r0, r1\n\ - ldrb r1, [r0]\n\ - ldr r2, =gBitTable\n\ - lsls r0, r5, 2\n\ - adds r0, r2\n\ - ldr r0, [r0]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - bne _0804AE10\n\ - _0804AE02:\n\ - adds r0, r4, 0\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - adds r0, r6, r0\n\ - lsls r0, 16\n\ - lsrs r6, r0, 16\n\ - _0804AE10:\n\ - adds r5, 0x1\n\ - cmp r5, 0x5\n\ - ble _0804ADBA\n\ - ldr r2, =gBattleOutcome\n\ - cmp r6, 0\n\ - bne _0804AE24\n\ - ldrb r0, [r2]\n\ - movs r1, 0x1\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - _0804AE24:\n\ - ldrb r0, [r2]\n\ - cmp r0, 0\n\ - bne _0804AF1A\n\ - ldr r0, =gBattleTypeFlags\n\ - ldr r1, [r0]\n\ - ldr r2, =0x02000002\n\ - ands r1, r2\n\ - mov r8, r0\n\ - cmp r1, 0\n\ - beq _0804AF1A\n\ - movs r3, 0\n\ - movs r5, 0\n\ - ldr r0, =gBattlersCount\n\ - ldrb r1, [r0]\n\ - mov r12, r0\n\ - ldr r7, =gBattlescriptCurrInstr\n\ - cmp r3, r1\n\ - bge _0804AE70\n\ - ldr r0, =gHitMarker\n\ - movs r6, 0x80\n\ - lsls r6, 21\n\ - ldr r4, [r0]\n\ - adds r2, r1, 0\n\ - ldr r1, =gSpecialStatuses\n\ - _0804AE54:\n\ - adds r0, r6, 0\n\ - lsls r0, r5\n\ - ands r0, r4\n\ - cmp r0, 0\n\ - beq _0804AE68\n\ - ldrb r0, [r1]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _0804AE68\n\ - adds r3, 0x1\n\ - _0804AE68:\n\ - adds r1, 0x28\n\ - adds r5, 0x2\n\ - cmp r5, r2\n\ - blt _0804AE54\n\ - _0804AE70:\n\ - movs r2, 0\n\ - movs r5, 0x1\n\ - mov r4, r12\n\ - ldrb r1, [r4]\n\ - cmp r5, r1\n\ - bge _0804AEAA\n\ - ldr r0, =gHitMarker\n\ - movs r4, 0x80\n\ - lsls r4, 21\n\ - mov r12, r4\n\ - ldr r6, [r0]\n\ - ldr r0, =gSpecialStatuses\n\ - adds r4, r1, 0\n\ - adds r1, r0, 0\n\ - adds r1, 0x14\n\ - _0804AE8E:\n\ - mov r0, r12\n\ - lsls r0, r5\n\ - ands r0, r6\n\ - cmp r0, 0\n\ - beq _0804AEA2\n\ - ldrb r0, [r1]\n\ - lsls r0, 25\n\ - cmp r0, 0\n\ - blt _0804AEA2\n\ - adds r2, 0x1\n\ - _0804AEA2:\n\ - adds r1, 0x28\n\ - adds r5, 0x2\n\ - cmp r5, r4\n\ - blt _0804AE8E\n\ - _0804AEAA:\n\ - mov r1, r8\n\ - ldr r0, [r1]\n\ - movs r1, 0x40\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0804AEF0\n\ - adds r0, r2, r3\n\ - cmp r0, 0x1\n\ - bgt _0804AEF8\n\ - b _0804AF12\n\ - .pool\n\ - _0804AEF0:\n\ - cmp r2, 0\n\ - beq _0804AF12\n\ - cmp r3, 0\n\ - beq _0804AF12\n\ - _0804AEF8:\n\ - ldr r2, [r7]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - adds r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - adds r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - lsls r0, 24\n\ - adds r1, r0\n\ - str r1, [r7]\n\ - b _0804AF22\n\ - _0804AF12:\n\ - ldr r0, [r7]\n\ - adds r0, 0x5\n\ - str r0, [r7]\n\ - b _0804AF22\n\ - _0804AF1A:\n\ - ldr r1, =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x5\n\ - str r0, [r1]\n\ - _0804AF22:\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .pool\n\ - .syntax divided"); -} - -#endif // NONMATCHING static void MoveValuesCleanUp(void) { @@ -6653,6 +6370,24 @@ static void atk76_various(void) data[i] = gBattleMons[gActiveBattler].ppBonuses; BtlController_EmitSetMonData(0, REQUEST_PP_DATA_BATTLE, 0, 5, data); break; + case VARIOUS_TRY_ACTIVATE_MOXIE: + if (GetBattlerAbility(gActiveBattler) == ABILITY_MOXIE + && (gLastHitBy[gBattlerTarget] == 0xFF || gLastHitBy[gBattlerTarget] == gBattlerAttacker) + && gBattleStruct->moveTarget[gBattlerAttacker] == gBattlerTarget + && gBattlerTarget != gBattlerAttacker + && gCurrentTurnActionNumber == GetBattlerTurnOrderNum(gBattlerAttacker) + && !IsBattleLostForPlayer() + && !IsBattleWonForPlayer() + && gBattleMons[gBattlerAttacker].statStages[STAT_ATK] != 0xC) + { + 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; } gBattlescriptCurrInstr += 3; From f51812d0fe1f80259f1ea27c336a1af55dc5ba2b Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 26 Jul 2018 23:40:55 +0200 Subject: [PATCH 054/667] Add Fell Stinger --- asm/macros/battle_script.inc | 4 +++ data/battle_scripts_1.s | 15 +++++++-- include/battle_scripts.h | 1 + include/constants/battle_move_effects.h | 2 +- include/constants/battle_script_commands.h | 1 + include/data/battle_moves.h | 2 +- src/battle_script_commands.c | 37 +++++++++++++++++++--- 7 files changed, 54 insertions(+), 8 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 999081be6e..659b3de642 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1389,6 +1389,10 @@ various \battler, VARIOUS_TRY_ACTIVATE_MOXIE .endm + .macro tryactivatefellstinger battler + various \battler, VARIOUS_TRY_ACTIVATE_FELL_STINGER + .endm + @ helpful macros .macro setstatchanger stat, stages, down setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 459520e096..0ae1c4e013 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -155,7 +155,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 @@ -590,7 +590,7 @@ BattleScript_EffectUnused60: BattleScript_EffectFalseSwipe: BattleScript_EffectAlwaysCrit: BattleScript_EffectPursuit: -BattleScript_EffectUnused8d: +BattleScript_EffectFellStinger: BattleScript_EffectPlaceholder209: BattleScript_EffectHit:: BattleScript_EffectLowKick: @@ -3202,6 +3202,7 @@ BattleScript_FaintTarget:: cleareffectsonfaint BS_TARGET printstring STRINGID_TARGETFAINTED tryactivatemoxie BS_ATTACKER + tryactivatefellstinger BS_ATTACKER return BattleScript_GiveExp:: @@ -4829,6 +4830,16 @@ BattleScript_AttackerAbilityStatRaise:: waitmessage 0x40 return +BattleScript_FellStingerRaisesStat:: + statbuffchange MOVE_EFFECT_AFFECTS_USER | 0x1, 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 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index b5835676f1..5850fca067 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -321,5 +321,6 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index e5f2a678ef..329cd0a999 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -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 +#define EFFECT_FELL_STINGER 141 #define EFFECT_BELLY_DRUM 142 #define EFFECT_PSYCH_UP 143 #define EFFECT_MIRROR_COAT 144 diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 5fa34f0b22..ceeb21b196 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -80,6 +80,7 @@ #define VARIOUS_CLEAR_STATUS 32 #define VARIOUS_RESTORE_PP 33 #define VARIOUS_TRY_ACTIVATE_MOXIE 34 +#define VARIOUS_TRY_ACTIVATE_FELL_STINGER 35 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index 30583abb0a..21cc9aa5cf 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -6784,7 +6784,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_FELL_STINGER - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_FELL_STINGER, .power = 50, .type = TYPE_BUG, .accuracy = 100, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 180a1161fa..4a0bfa3717 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6160,6 +6160,20 @@ static void atk75_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]) + return TRUE; + else + return FALSE; +} + static void atk76_various(void) { u8 side; @@ -6372,10 +6386,7 @@ static void atk76_various(void) break; case VARIOUS_TRY_ACTIVATE_MOXIE: if (GetBattlerAbility(gActiveBattler) == ABILITY_MOXIE - && (gLastHitBy[gBattlerTarget] == 0xFF || gLastHitBy[gBattlerTarget] == gBattlerAttacker) - && gBattleStruct->moveTarget[gBattlerAttacker] == gBattlerTarget - && gBattlerTarget != gBattlerAttacker - && gCurrentTurnActionNumber == GetBattlerTurnOrderNum(gBattlerAttacker) + && HasAttackerFaintedTarget() && !IsBattleLostForPlayer() && !IsBattleWonForPlayer() && gBattleMons[gBattlerAttacker].statStages[STAT_ATK] != 0xC) @@ -6388,6 +6399,24 @@ static void atk76_various(void) return; } break; + case VARIOUS_TRY_ACTIVATE_FELL_STINGER: + if (gBattleMoves[gCurrentMove].effect == EFFECT_FELL_STINGER + && HasAttackerFaintedTarget() + && !IsBattleLostForPlayer() + && !IsBattleWonForPlayer() + && gBattleMons[gBattlerAttacker].statStages[STAT_ATK] != 0xC) + { + if (gBattleMons[gBattlerAttacker].statStages[STAT_ATK] >= 0xB) + SET_STATCHANGER(STAT_ATK, 1, FALSE); + else + SET_STATCHANGER(STAT_ATK, 2, FALSE); + + PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK); + BattleScriptPush(gBattlescriptCurrInstr + 3); + gBattlescriptCurrInstr = BattleScript_FellStingerRaisesStat; + return; + } + break; } gBattlescriptCurrInstr += 3; From 8f4f851780b9a0cf81b266863168b06be6256b94 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Fri, 27 Jul 2018 06:55:55 -0300 Subject: [PATCH 055/667] Update battle_message.c Fixed sText_PoisonSpikesScattered and added a string for sText_ToxicSpikesAbsorbed, sText_ToxicSpikesPoisoned and sText_StickyWebSwitchIn. --- src/battle_message.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/battle_message.c b/src/battle_message.c index 5bdbe97053..02dbda201d 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -544,7 +544,7 @@ static const u8 sText_ShieldedFromCriticalHits[] = _("The {B_CURRENT_MOVE} shiel 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_LAST_ABILITY}!"); -static const u8 sText_PoisonSpikesScattered[] = _("Poison Spikes were scattered\nall around the foe’s team’s\pfeet!"); +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!"); @@ -616,9 +616,9 @@ static const u8 sText_MagicBounceActivates[] = _("The {B_DEF_NAME_WITH_PREFIX} b 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[] = _(""); -static const u8 sText_ToxicSpikesPoisoned[] = _(""); -static const u8 sText_StickyWebSwitchIn[] = _(""); +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!"); From 232a1849ebdc99c35d05cc746ef6d0921aa97cbd Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Fri, 27 Jul 2018 16:46:49 -0300 Subject: [PATCH 056/667] Update battle_message.c Fixed the text string of "sText_AngryPointActivates". --- src/battle_message.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_message.c b/src/battle_message.c index 02dbda201d..96528fe5aa 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -594,7 +594,7 @@ static const u8 sText_ElectricTerrainEnds[] = _("{B_ATK_ABILITY} wore off."); static const u8 sText_MistyTerrainEnds[] = _("{B_ATK_ABILITY} wore off."); static const u8 sText_PsychicTerrainEnds[] = _("{B_ATK_ABILITY} wore off."); static const u8 sText_GrassyTerrainEnds[] = _("{B_ATK_ABILITY} wore off."); -static const u8 sText_AngryPointActivates[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_ATK_ABILITY} maxed\nits attack!"); +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[] = _("The {B_DEF_NAME_WITH_PREFIX} is tormented\nby {B_DEF_ABILITY}!"); static const u8 sText_MoldBreakerEnters[] = _("The {B_DEF_NAME_WITH_PREFIX} breaks the mold!"); From 2537ed6eb1bcde002f9d1e6425ea0516fa06e831 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 27 Jul 2018 22:24:07 +0200 Subject: [PATCH 057/667] Fix Lunar Dance pp issue --- src/battle_script_commands.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 4a0bfa3717..addaa14060 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6383,6 +6383,7 @@ static void atk76_various(void) } 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 From 9088c0bdb55da1383af758c214f2c97bcbc42733 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 27 Jul 2018 23:40:10 +0200 Subject: [PATCH 058/667] Introduce battle config; Snow Warning Done. --- data/battle_scripts_1.s | 8 +++++ include/battle_scripts.h | 1 + include/battle_util.h | 1 + include/constants/battle.h | 12 +++++-- include/constants/battle_config.h | 14 ++++++++ src/battle_debug.c | 2 +- src/battle_script_commands.c | 37 ++++++++++---------- src/battle_util.c | 58 +++++++++++++++++++++++++------ 8 files changed, 101 insertions(+), 32 deletions(-) create mode 100644 include/constants/battle_config.h diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 0ae1c4e013..2589811252 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4609,6 +4609,14 @@ BattleScript_DroughtActivates:: call BattleScript_WeatherFormChanges end3 +BattleScript_SnowWarningActivates:: + pause 0x20 + printstring STRINGID_SNOWWARNINGHAIL + waitstate + playanimation BS_BATTLER_0, B_ANIM_HAIL_CONTINUES, NULL + call BattleScript_WeatherFormChanges + end3 + BattleScript_BadDreamsActivates:: setbyte gBattlerTarget, 0 BattleScript_BadDreamsLoop: diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 5850fca067..e26eb5278f 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -322,5 +322,6 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/battle_util.h b/include/battle_util.h index fa3120c006..e25fbb5425 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -64,6 +64,7 @@ void TryClearRageStatuses(void); u8 AtkCanceller_UnableToUseMove(void); bool8 HasNoMonsToSwitch(u8 battlerId, u8 r1, u8 r2); u8 CastformDataTypeChange(u8 battlerId); +bool32 TryChangeBattleWeather(u8 battler, u32 weatherEnumId, bool32 viaAbility); u8 AbilityBattleEffects(u8 caseID, u8 battlerId, u8 ability, u8 special, u16 moveArg); void BattleScriptExecute(const u8* BS_ptr); void BattleScriptPushCursorAndCallback(const u8* BS_ptr); diff --git a/include/constants/battle.h b/include/constants/battle.h index f1dee674ec..55aeb349f6 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -240,10 +240,18 @@ #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) +// 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 + // Move Effects #define MOVE_EFFECT_SLEEP 0x1 #define MOVE_EFFECT_POISON 0x2 diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h new file mode 100644 index 0000000000..4fab97fd71 --- /dev/null +++ b/include/constants/battle_config.h @@ -0,0 +1,14 @@ +#ifndef GUARD_CONSTANTS_BATTLE_CONFIG_H +#define GUARD_CONSTANTS_BATTLE_CONFIG_H + +#define GEN_3 0 +#define GEN_4 1 +#define GEN_5 2 +#define GEN_6 3 +#define GEN_7 4 + +#define B_CRIT_CHANCE GEN_6 // Chances of a critical hit landing. See atk04_critcalc. +#define B_FELL_STINGER_STAT_RAISE GEN_6 // Gen6 Atk+2, Gen7 Atk+3. +#define B_ABILITY_WEATHER GEN_6 // Up to gen5 - weather induced by abilities such as Drought or Drizzle lasted till the battle's end or weather change by a move. From Gen6 onwards, weather caused by abilities lasts the same amount of turns as induced from a move. + +#endif // GUARD_CONSTANTS_BATTLE_CONFIG_H diff --git a/src/battle_debug.c b/src/battle_debug.c index d625cdd70a..a6aa4c9eb5 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -1162,7 +1162,7 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) { case LIST_ITEM_ABILITY: data->modifyArrows.minValue = 0; - data->modifyArrows.maxValue = ABILITIES_COUNT_GEN5 - 1; + data->modifyArrows.maxValue = ABILITIES_COUNT_GEN6 - 1; data->modifyArrows.maxDigits = 3; data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].ability; data->modifyArrows.typeOfVal = VAL_U8; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index addaa14060..139ffcd6e2 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" extern u16 gBattle_BG1_X; extern u16 gBattle_BG1_Y; @@ -1342,9 +1343,13 @@ s32 CalcCritChanceStage(u8 battlerAtk, u8 battlerDef, u32 move, bool32 recordAbi } // The chance is 1/N for each stage. -static const u8 sCriticalHitChanceGen3[] = {16, 8, 4, 3, 2}; // Gens 2,3,4,5 -static const u8 sCriticalHitChanceGen6[] = {16, 8, 2, 1, 1}; -static const u8 sCriticalHitChanceGen7[] = {24, 8, 2, 1, 1}; +#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 static void atk04_critcalc(void) { @@ -1357,7 +1362,7 @@ static void atk04_critcalc(void) gIsCriticalHit = FALSE; else if (critChance == -2) gIsCriticalHit = TRUE; - else if (Random() % sCriticalHitChanceGen3[critChance] == 0) + else if (Random() % sCriticalHitChance[critChance] == 0) gIsCriticalHit = TRUE; else gIsCriticalHit = FALSE; @@ -6390,7 +6395,7 @@ static void atk76_various(void) && HasAttackerFaintedTarget() && !IsBattleLostForPlayer() && !IsBattleWonForPlayer() - && gBattleMons[gBattlerAttacker].statStages[STAT_ATK] != 0xC) + && gBattleMons[gBattlerAttacker].statStages[STAT_ATK] != 12) { gBattleMons[gBattlerAttacker].statStages[STAT_ATK]++; SET_STATCHANGER(STAT_ATK, 1, FALSE); @@ -6405,10 +6410,12 @@ static void atk76_various(void) && HasAttackerFaintedTarget() && !IsBattleLostForPlayer() && !IsBattleWonForPlayer() - && gBattleMons[gBattlerAttacker].statStages[STAT_ATK] != 0xC) + && gBattleMons[gBattlerAttacker].statStages[STAT_ATK] != 12) { - if (gBattleMons[gBattlerAttacker].statStages[STAT_ATK] >= 0xB) + if (gBattleMons[gBattlerAttacker].statStages[STAT_ATK] >= 11) SET_STATCHANGER(STAT_ATK, 1, FALSE); + else if (gBattleMons[gBattlerAttacker].statStages[STAT_ATK] <= 9 && B_FELL_STINGER_STAT_RAISE == GEN_7) + SET_STATCHANGER(STAT_ATK, 3, FALSE); else SET_STATCHANGER(STAT_ATK, 2, FALSE); @@ -6601,16 +6608,14 @@ static void atk7C_trymirrormove(void) static void atk7D_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++; } @@ -7478,16 +7483,14 @@ static void atk94_damagetohalftargethp(void) // super fang static void atk95_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++; } @@ -8645,16 +8648,14 @@ static void atkBA_jumpifnopursuitswitchdmg(void) static void atkBB_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++; @@ -8911,16 +8912,14 @@ static void atkC7_setminimize(void) static void atkC8_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++; diff --git a/src/battle_util.c b/src/battle_util.c index c4dacd71d1..fd4f6028c1 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -24,6 +24,7 @@ #include "link.h" #include "berry.h" #include "pokedex.h" +#include "constants/battle_config.h" extern u8 weather_get_current(void); @@ -1070,9 +1071,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 @@ -2311,7 +2312,39 @@ u8 CastformDataTypeChange(u8 battler) return formChange; } -// The largest function in the game, but even it could not save itself from decompiling. +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}, +}; + +bool32 TryChangeBattleWeather(u8 battler, u32 weatherEnumId, bool32 viaAbility) +{ + if (viaAbility && B_ABILITY_WEATHER <= GEN_5 + && !(gBattleWeather & sWeatherFlagsInfo[weatherEnumId][1])) + { + gBattleWeather = (sWeatherFlagsInfo[weatherEnumId][0] | sWeatherFlagsInfo[weatherEnumId][1]); + return TRUE; + } + else if (B_ABILITY_WEATHER > GEN_5 + && !(gBattleWeather & (sWeatherFlagsInfo[weatherEnumId][0] | sWeatherFlagsInfo[weatherEnumId][1]))) + { + gBattleWeather = (sWeatherFlagsInfo[weatherEnumId][0]); + if (GetBattlerHoldEffect(battler, TRUE) == sWeatherFlagsInfo[weatherEnumId][2]) + gWishFutureKnock.weatherDuration = 8; + else + gWishFutureKnock.weatherDuration = 5; + + return TRUE; + } + else + { + return FALSE; + } +} + u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveArg) { u8 effect = 0; @@ -2477,32 +2510,37 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } break; case ABILITY_DRIZZLE: - if (!(gBattleWeather & WEATHER_RAIN_PERMANENT)) + if (TryChangeBattleWeather(battler, ENUM_WEATHER_RAIN, TRUE)) { - gBattleWeather = (WEATHER_RAIN_PERMANENT | WEATHER_RAIN_TEMPORARY); BattleScriptPushCursorAndCallback(BattleScript_DrizzleActivates); gBattleScripting.battler = battler; effect++; } break; case ABILITY_SAND_STREAM: - if (!(gBattleWeather & WEATHER_SANDSTORM_PERMANENT)) + if (TryChangeBattleWeather(battler, ENUM_WEATHER_SANDSTORM, TRUE)) { - gBattleWeather = (WEATHER_SANDSTORM_PERMANENT | WEATHER_SANDSTORM_TEMPORARY); - BattleScriptPushCursorAndCallback(BattleScript_SandstreamActivates); + BattleScriptPushCursorAndCallback(BattleScript_DrizzleActivates); gBattleScripting.battler = battler; effect++; } break; case ABILITY_DROUGHT: - if (!(gBattleWeather & WEATHER_SUN_PERMANENT)) + if (TryChangeBattleWeather(battler, ENUM_WEATHER_SUN, TRUE)) { - gBattleWeather = (WEATHER_SUN_PERMANENT | WEATHER_SUN_TEMPORARY); BattleScriptPushCursorAndCallback(BattleScript_DroughtActivates); gBattleScripting.battler = battler; effect++; } break; + case ABILITY_SNOW_WARNING: + if (TryChangeBattleWeather(battler, ENUM_WEATHER_HAIL, TRUE)) + { + BattleScriptPushCursorAndCallback(BattleScript_SnowWarningActivates); + gBattleScripting.battler = battler; + effect++; + } + break; case ABILITY_INTIMIDATE: if (!(gSpecialStatuses[battler].intimidatedMon)) { From a452661cb95fbe9e16160718a1520d8ebc1aee96 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 28 Jul 2018 00:25:02 +0200 Subject: [PATCH 059/667] Prankster and Gale Wings --- include/constants/abilities.h | 2 +- include/constants/battle_config.h | 1 + include/constants/moves.h | 2 +- src/battle_debug.c | 2 +- src/battle_main.c | 60 +++++++++++++++++-------------- 5 files changed, 37 insertions(+), 30 deletions(-) diff --git a/include/constants/abilities.h b/include/constants/abilities.h index 3f7b595e73..59250e521f 100644 --- a/include/constants/abilities.h +++ b/include/constants/abilities.h @@ -254,6 +254,6 @@ #define ABILITIES_COUNT_GEN7 234 -#define ABILITIES_COUNT ABILITIES_COUNT_GEN4 +#define ABILITIES_COUNT ABILITIES_COUNT_GEN6 #endif // GUARD_CONSTANTS_ABILITIES_H diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 4fab97fd71..1d247a20b5 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -10,5 +10,6 @@ #define B_CRIT_CHANCE GEN_6 // Chances of a critical hit landing. See atk04_critcalc. #define B_FELL_STINGER_STAT_RAISE GEN_6 // Gen6 Atk+2, Gen7 Atk+3. #define B_ABILITY_WEATHER GEN_6 // Up to gen5 - weather induced by abilities such as Drought or Drizzle lasted till the battle's end or weather change by a move. From Gen6 onwards, weather caused by abilities lasts the same amount of turns as induced from a move. +#define B_GALE_WINGS GEN_6 // Gen7 requires full hp. #endif // GUARD_CONSTANTS_BATTLE_CONFIG_H diff --git a/include/constants/moves.h b/include/constants/moves.h index f026614d6c..f8683edbc8 100644 --- a/include/constants/moves.h +++ b/include/constants/moves.h @@ -638,6 +638,6 @@ #define MOVES_COUNT_GEN6 622 -#define MOVES_COUNT MOVES_COUNT_GEN4 +#define MOVES_COUNT MOVES_COUNT_GEN5 #endif // GUARD_CONSTANTS_MOVES_H diff --git a/src/battle_debug.c b/src/battle_debug.c index a6aa4c9eb5..5b8b847f51 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -1170,7 +1170,7 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) break; case LIST_ITEM_MOVES: data->modifyArrows.minValue = 0; - data->modifyArrows.maxValue = MOVES_COUNT_GEN5 - 1; + data->modifyArrows.maxValue = MOVES_COUNT_GEN6 - 1; data->modifyArrows.maxDigits = 3; data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].moves[data->currentSecondaryListItemId]; data->modifyArrows.typeOfVal = VAL_U16; diff --git a/src/battle_main.c b/src/battle_main.c index c1c072d346..39ce130856 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -52,6 +52,7 @@ #include "international_string_util.h" #include "pokeball.h" #include "party_menu.h" +#include "constants\battle_config.h" struct UnknownPokemonStruct4 { @@ -4674,13 +4675,39 @@ u32 GetBattlerTotalSpeedStat(u8 battlerId) return speed; } +static s8 GetMovePriority(u8 battlerId) +{ + s8 priority; + u16 move; + + if (gProtectStructs[battlerId].noValidMoves) + move = MOVE_STRUGGLE; + else + move = gBattleMons[battlerId].moves[*(gBattleStruct->chosenMovePositions + battlerId)]; + + 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++; + } + + return priority; +} + u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) { u8 strikesFirst = 0; u32 speedBattler1 = 0, speedBattler2 = 0; - u16 moveBattler1 = 0, moveBattler2 = 0; u32 holdEffectBattler1 = 0, holdEffectBattler2 = 0; bool32 quickClawBattler1 = FALSE, quickClawBattler2 = FALSE; + s8 priority1 = 0, priority2 = 0; speedBattler1 = GetBattlerTotalSpeedStat(battler1); holdEffectBattler1 = GetBattlerHoldEffect(battler1, TRUE); @@ -4694,36 +4721,15 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) && gRandomTurnNumber < (0xFFFF * GetBattlerHoldEffectParam(battler2)) / 100) quickClawBattler2 = TRUE; - 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 = GetMovePriority(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 = GetMovePriority(battler2); } - - if (gBattleMoves[moveBattler1].priority == gBattleMoves[moveBattler2].priority) + if (priority1 == priority2) { // QUICK CLAW - always first // LAGGING TAIL - always last @@ -4765,7 +4771,7 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) } } } - else if (gBattleMoves[moveBattler1].priority < gBattleMoves[moveBattler2].priority) + else if (priority1 < priority2) { strikesFirst = 1; // battler2's move has greater priority } From 43fc4b69331558afc20de6603c5644eaffaca78c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 28 Jul 2018 10:41:20 +0200 Subject: [PATCH 060/667] Add Magic Bounce --- data/battle_scripts_1.s | 2 +- include/battle.h | 3 +-- include/constants/battle_string_ids.h | 1 + src/battle_main.c | 2 +- src/battle_message.c | 7 +++++++ src/battle_script_commands.c | 23 +++++++++++++++++++++-- 6 files changed, 32 insertions(+), 6 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 2589811252..b6008134c0 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4163,7 +4163,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 diff --git a/include/battle.h b/include/battle.h index facd30c0b0..7705cd22f0 100644 --- a/include/battle.h +++ b/include/battle.h @@ -209,8 +209,7 @@ struct ProtectStruct u32 flag_x20:1; // 0x20 u32 flag_x40:1; // 0x40 u32 flag_x80:1; // 0x80 - /* field_3 */ - u32 field3:8; + u32 usesBouncedMove:1; /* field_4 */ u32 physicalDmg; /* field_8 */ u32 specialDmg; diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index ad4ffd8921..92040daf49 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -484,6 +484,7 @@ #define STRINGID_ATTACKERACQUIREDABILITY 481 #define STRINGID_TARGETABILITYSTATLOWER 482 #define STRINGID_TARGETSTATWONTGOHIGHER 483 +#define STRINGID_PKMNMOVEBOUNCEDABILITY 484 #define BATTLESTRINGS_COUNT 496 diff --git a/src/battle_main.c b/src/battle_main.c index 39ce130856..21ac3a39e6 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -52,7 +52,7 @@ #include "international_string_util.h" #include "pokeball.h" #include "party_menu.h" -#include "constants\battle_config.h" +#include "constants/battle_config.h" struct UnknownPokemonStruct4 { diff --git a/src/battle_message.c b/src/battle_message.c index ed713e961f..af10c7bf59 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -625,6 +625,7 @@ static const u8 sText_LunarDanceCameTrue[] = _("{B_ATK_NAME_WITH_PREFIX} became 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}!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { @@ -1101,6 +1102,12 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_AttackerAquiredAbility, sText_TargetAbilityLoweredStat, sText_TargetStatWontGoHigher, + sText_PkmnMoveBouncedViaAbility, +}; + +const u16 gMagicCoatBounceStringIds[] = +{ + STRINGID_PKMNMOVEBOUNCED, STRINGID_PKMNMOVEBOUNCEDABILITY }; const u16 gHealingWishStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 139ffcd6e2..b1b75c6e3e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -968,10 +968,25 @@ static void atk00_attackcanceler(void) gHitMarker |= HITMARKER_OBEYS; - 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; @@ -4031,7 +4046,7 @@ static void atk48_playstatchangeanimation(void) } } -#define ATK49_LAST_CASE 17 +#define ATK49_LAST_CASE 18 static void atk49_moveend(void) { @@ -4307,6 +4322,10 @@ static void atk49_moveend(void) } gBattleScripting.atk49_state++; break; + case 17: // Clear bits active just while using a move. + gProtectStructs[gBattlerAttacker].usesBouncedMove = 0; + gBattleScripting.atk49_state++; + break; case ATK49_LAST_CASE: break; } From ef3c39fbae7da92cd181e09c1422b58366254462 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 28 Jul 2018 10:58:47 +0200 Subject: [PATCH 061/667] Fix Counter and Mirror Coat --- asm/macros/battle_script.inc | 2 +- data/battle_scripts_1.s | 10 ++-- src/battle_script_commands.c | 96 ++---------------------------------- 3 files changed, 10 insertions(+), 98 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 659b3de642..27e052c337 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -401,7 +401,7 @@ .byte \param1 .endm - .macro typecalc2 + .macro nop_4A .byte 0x4a .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index b6008134c0..11650c811a 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1650,7 +1650,8 @@ BattleScript_EffectCounter:: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce - typecalc2 + typecalc + bichalfword gMoveResultFlags, MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE adjustdamage goto BattleScript_HitFromAtkAnimation @@ -2028,7 +2029,7 @@ BattleScript_EffectRollout:: BattleScript_RolloutCheckAccuracy:: accuracycheck BattleScript_RolloutHit, ACC_CURR_MOVE BattleScript_RolloutHit:: - typecalc2 + typecalc handlerollout goto BattleScript_HitFromCritCalc @@ -2223,7 +2224,8 @@ BattleScript_EffectMirrorCoat:: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce - typecalc2 + typecalc + bichalfword gMoveResultFlags, MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE adjustdamage goto BattleScript_HitFromAtkAnimation @@ -2826,7 +2828,7 @@ BattleScript_BrickBreakAnim:: printstring STRINGID_THEWALLSHATTERED waitmessage 0x40 BattleScript_BrickBreakDoHit:: - typecalc2 + typecalc effectivenesssound hitanimation BS_TARGET waitstate diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b1b75c6e3e..77ddd61f37 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -166,7 +166,7 @@ static void atk46_playanimation2(void); static void atk47_setgraphicalstatchangevalues(void); static void atk48_playstatchangeanimation(void); static void atk49_moveend(void); -static void atk4A_typecalc2(void); +static void atk4A_nop(void); static void atk4B_returnatktoball(void); static void atk4C_getswitchedmondata(void); static void atk4D_switchindataupdate(void); @@ -424,7 +424,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atk47_setgraphicalstatchangevalues, atk48_playstatchangeanimation, atk49_moveend, - atk4A_typecalc2, + atk4A_nop, atk4B_returnatktoball, atk4C_getswitchedmondata, atk4D_switchindataupdate, @@ -4341,98 +4341,8 @@ static void atk49_moveend(void) gBattlescriptCurrInstr += 3; } -static void atk4A_typecalc2(void) +static void atk4A_nop(void) { - u8 flags = 0; - s32 i = 0; - u8 moveType = gBattleMoves[gCurrentMove].type; - - 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; - 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; - } - 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; - } - } - - 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++; } From b3e6dc8457a8051a627d7fb235359b86df617506 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 28 Jul 2018 16:33:01 +0200 Subject: [PATCH 062/667] Add Gluttony --- include/data/battle_moves.h | 2 +- src/battle_util.c | 104 +++++++++++++++--------------------- 2 files changed, 44 insertions(+), 62 deletions(-) diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index 21cc9aa5cf..b66be7327b 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -742,7 +742,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .accuracy = 100, .pp = 20, .secondaryEffectChance = 10, - .target = MOVE_TARGET_SELECTED, + .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, .split = SPLIT_SPECIAL, diff --git a/src/battle_util.c b/src/battle_util.c index fd4f6028c1..cb66ea6c4b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3329,51 +3329,41 @@ enum ITEM_STATS_CHANGE, // 5 }; +// second argument is 1/X of current hp compared to max hp +static bool32 HasEnoughHpToEatBerry(u8 battlerId, u32 hpFraction) +{ + if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / hpFraction) + { + return TRUE; + } + else if (hpFraction <= 4 && GetBattlerAbility(battlerId) == ABILITY_GLUTTONY + && gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2) + { + RecordAbilityBattle(battlerId, ABILITY_GLUTTONY); + return TRUE; + } + else + { + return FALSE; + } +} + u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) { int i = 0; u8 effect = ITEM_NO_EFFECT; u8 changedPP = 0; - u8 battlerHoldEffect, atkHoldEffect, defHoldEffect; - u8 battlerHoldEffectParam, atkHoldEffectParam, defHoldEffectParam; - u16 atkItem, defItem; + u8 battlerHoldEffect, atkHoldEffect; + u8 battlerHoldEffectParam, 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); + battlerHoldEffectParam = GetBattlerHoldEffectParam(battlerId); 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) { @@ -3409,7 +3399,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) switch (battlerHoldEffect) { case HOLD_EFFECT_RESTORE_HP: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn) + if (!moveTurn && HasEnoughHpToEatBerry(battlerId, 2)) { gBattleMoveDamage = battlerHoldEffectParam; if (gBattleMons[battlerId].hp + battlerHoldEffectParam > gBattleMons[battlerId].maxHP) @@ -3488,7 +3478,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) 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) + if (!moveTurn && HasEnoughHpToEatBerry(battlerId, 2)) { PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SPICY); @@ -3506,7 +3496,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_CONFUSE_DRY: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn) + if (!moveTurn && HasEnoughHpToEatBerry(battlerId, 2)) { PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_DRY); @@ -3524,7 +3514,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_CONFUSE_SWEET: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn) + if (!moveTurn && HasEnoughHpToEatBerry(battlerId, 2)) { PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SWEET); @@ -3542,7 +3532,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_CONFUSE_BITTER: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn) + if (!moveTurn && HasEnoughHpToEatBerry(battlerId, 2)) { PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_BITTER); @@ -3560,7 +3550,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_CONFUSE_SOUR: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn) + if (!moveTurn && HasEnoughHpToEatBerry(battlerId, 2)) { PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SOUR); @@ -3579,7 +3569,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) break; // copy/paste again, smh case HOLD_EFFECT_ATTACK_UP: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && gBattleMons[battlerId].statStages[STAT_ATK] < 0xC) + if (!moveTurn && gBattleMons[battlerId].statStages[STAT_ATK] < 0xC && HasEnoughHpToEatBerry(battlerId, battlerHoldEffectParam)) { PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK); PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATROSE); @@ -3593,7 +3583,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_DEFENSE_UP: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && gBattleMons[battlerId].statStages[STAT_DEF] < 0xC) + if (!moveTurn && gBattleMons[battlerId].statStages[STAT_DEF] < 0xC && HasEnoughHpToEatBerry(battlerId, battlerHoldEffectParam)) { PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_DEF); @@ -3606,7 +3596,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_SPEED_UP: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && gBattleMons[battlerId].statStages[STAT_SPEED] < 0xC) + if (!moveTurn && gBattleMons[battlerId].statStages[STAT_SPEED] < 0xC && HasEnoughHpToEatBerry(battlerId, battlerHoldEffectParam)) { PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPEED); @@ -3619,7 +3609,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_SP_ATTACK_UP: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && gBattleMons[battlerId].statStages[STAT_SPATK] < 0xC) + if (!moveTurn && gBattleMons[battlerId].statStages[STAT_SPATK] < 0xC && HasEnoughHpToEatBerry(battlerId, battlerHoldEffectParam)) { PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPATK); @@ -3632,7 +3622,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_SP_DEFENSE_UP: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && gBattleMons[battlerId].statStages[STAT_SPDEF] < 0xC) + if (!moveTurn && gBattleMons[battlerId].statStages[STAT_SPDEF] < 0xC && HasEnoughHpToEatBerry(battlerId, battlerHoldEffectParam)) { PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPDEF); @@ -3645,7 +3635,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } 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, battlerHoldEffectParam)) { gBattleMons[battlerId].status2 |= STATUS2_FOCUS_ENERGY; BattleScriptExecute(BattleScript_BerryFocusEnergyEnd2); @@ -3653,14 +3643,14 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_RANDOM_STAT_UP: - if (!moveTurn && gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam) + if (!moveTurn) { for (i = 0; i < 5; i++) { if (gBattleMons[battlerId].statStages[STAT_ATK + i] < 0xC) break; } - if (i != 5) + if (i != 5 && HasEnoughHpToEatBerry(battlerId, battlerHoldEffectParam)) { do { @@ -3817,16 +3807,8 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) 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); + battlerHoldEffectParam = GetBattlerHoldEffectParam(battlerId); switch (battlerHoldEffect) { case HOLD_EFFECT_CURE_PAR: @@ -3946,7 +3928,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) gPotentialItemEffectBattler = battlerId; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_WhiteHerbRet; - return effect; // unnecessary return + return effect; } break; } From 3a0c244f40a11cdecf0dcf25da8356bcb06e520e Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 28 Jul 2018 17:13:47 +0200 Subject: [PATCH 063/667] Add Harvest --- data/battle_scripts_1.s | 6 ++++++ include/battle_scripts.h | 1 + src/battle_message.c | 2 +- src/battle_util.c | 12 ++++++++++++ 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 11650c811a..bc83108db5 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4528,6 +4528,12 @@ BattleScript_RainDishActivates:: datahpupdate BS_ATTACKER end3 +BattleScript_HarvestActivates:: + pause 0x5 + printstring STRINGID_HARVESTBERRY + waitmessage 0x40 + end3 + BattleScript_SolarPowerActivates:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 healthbarupdate BS_ATTACKER diff --git a/include/battle_scripts.h b/include/battle_scripts.h index e26eb5278f..8d57b9637b 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -323,5 +323,6 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/src/battle_message.c b/src/battle_message.c index af10c7bf59..a8427508ba 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -610,7 +610,7 @@ static const u8 sText_IceBodyHpGain[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_ATK_A 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[] = _("{B_ATK_NAME_WITH_PREFIX} is too nervous to eat Berries!"); -static const u8 sText_HarvestBerry[] = _("{B_ATK_NAME_WITH_PREFIX} harvested its {B_LAST_ITEM}!"); +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!"); diff --git a/src/battle_util.c b/src/battle_util.c index cb66ea6c4b..63b427c9fd 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2587,6 +2587,18 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA 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_RAIN_DISH: if (WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_RAIN_ANY) From ec9693c7975d0d091ac3d4cd79a58de02d50a239 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 28 Jul 2018 18:41:57 +0200 Subject: [PATCH 064/667] ate abilities --- include/battle.h | 1 + include/constants/battle.h | 1 + src/battle_main.c | 30 ++++++++++++++++++++++++++++++ src/battle_script_commands.c | 1 + src/battle_util.c | 20 ++++++++++++++++++++ 5 files changed, 53 insertions(+) diff --git a/include/battle.h b/include/battle.h index 7705cd22f0..b63e4a4b86 100644 --- a/include/battle.h +++ b/include/battle.h @@ -593,6 +593,7 @@ struct BattleStruct u8 presentBasePower; u8 roostTypes[MAX_BATTLERS_COUNT][3]; u8 savedBattlerTarget; + bool8 ateBoost[MAX_BATTLERS_COUNT]; }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/include/constants/battle.h b/include/constants/battle.h index 55aeb349f6..5202b95708 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -216,6 +216,7 @@ #define STATUS_FIELD_MISTY_TERRAIN 0x80 #define STATUS_FIELD_ELECTRIC_TERRAIN 0x100 #define STATUS_FIELD_PSYCHIC_TERRAIN 0x200 +#define STATUS_FIELD_ION_DELUGE 0x400 // Flags describing move's result #define MOVE_RESULT_MISSED (1 << 0) diff --git a/src/battle_main.c b/src/battle_main.c index 21ac3a39e6..3fa9561021 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5295,6 +5295,8 @@ static void HandleAction_UseMove(void) { u8 side; u8 var = 4; + u32 attackerAbility; + u32 ateType; gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; @@ -5510,6 +5512,34 @@ static void HandleAction_UseMove(void) if (gBattleTypeFlags & BATTLE_TYPE_ARENA) sub_81A56E8(gBattlerAttacker); + attackerAbility = GetBattlerAbility(gBattlerAttacker); + // Set move type. + if (gFieldStatuses & STATUS_FIELD_ION_DELUGE) // All moves become Electric-type this turn. + { + gBattleStruct->dynamicMoveType = 0x80 | TYPE_ELECTRIC; + } + else if (gBattleMoves[gChosenMove].type == TYPE_NORMAL + && gBattleMoves[gChosenMove].effect != EFFECT_HIDDEN_POWER + && gBattleMoves[gChosenMove].effect != EFFECT_WEATHER_BALL + && ((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[gBattlerAttacker] = 1; + } + else if (gBattleMoves[gChosenMove].type != TYPE_NORMAL + && gBattleMoves[gChosenMove].effect != EFFECT_HIDDEN_POWER + && gBattleMoves[gChosenMove].effect != EFFECT_WEATHER_BALL + && attackerAbility == ABILITY_NORMALIZE) + { + gBattleStruct->dynamicMoveType = 0x80 | TYPE_NORMAL; + gBattleStruct->ateBoost[gBattlerAttacker] = 1; + } + gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 77ddd61f37..75cc21c4a9 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4324,6 +4324,7 @@ static void atk49_moveend(void) break; case 17: // Clear bits active just while using a move. gProtectStructs[gBattlerAttacker].usesBouncedMove = 0; + gBattleStruct->ateBoost[gBattlerAttacker] = 0; gBattleScripting.atk49_state++; break; case ATK49_LAST_CASE: diff --git a/src/battle_util.c b/src/battle_util.c index 63b427c9fd..51a8288714 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4669,6 +4669,26 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe 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 From a3d5096d9ccfb2c17044991595f85e003da318b7 Mon Sep 17 00:00:00 2001 From: Tetrable Date: Sat, 28 Jul 2018 17:55:23 +0100 Subject: [PATCH 065/667] add existing effects to gen 4 moves, label needed move effects --- include/data/battle_moves.h | 168 ++++++++++++++++++------------------ 1 file changed, 84 insertions(+), 84 deletions(-) diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index b66be7327b..a664191210 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -4312,7 +4312,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_HAMMER_ARM - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_SPEED_DOWN, .power = 100, .type = TYPE_FIGHTING, .accuracy = 90, @@ -4372,7 +4372,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_FEINT - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 30, .type = TYPE_NORMAL, .accuracy = 100, @@ -4384,7 +4384,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_PLUCK - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (Bug Bite and Pluck should have the same move effect) .power = 60, .type = TYPE_FLYING, .accuracy = 100, @@ -4408,7 +4408,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_ACUPRESSURE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -4420,7 +4420,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_METAL_BURST - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (Counters 1.5x damage) .power = 0, .type = TYPE_STEEL, .accuracy = 100, @@ -4444,7 +4444,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_CLOSE_COMBAT - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 120, .type = TYPE_FIGHTING, .accuracy = 100, @@ -4504,7 +4504,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_PSYCHO_SHIFT - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_PSYCHIC, .accuracy = 100, @@ -4528,7 +4528,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_HEAL_BLOCK - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_PSYCHIC, .accuracy = 100, @@ -4552,7 +4552,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_POWER_TRICK - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -4576,7 +4576,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_LUCKY_CHANT - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -4588,7 +4588,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_ME_FIRST - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -4600,7 +4600,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_COPYCAT - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -4648,7 +4648,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_LAST_RESORT - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 140, .type = TYPE_NORMAL, .accuracy = 100, @@ -4672,7 +4672,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_SUCKER_PUNCH - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 70, .type = TYPE_DARK, .accuracy = 100, @@ -4732,7 +4732,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_FLARE_BLITZ - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 120, .type = TYPE_FIRE, .accuracy = 100, @@ -4744,7 +4744,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_FORCE_PALM - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PARALYZE_HIT, .power = 60, .type = TYPE_FIGHTING, .accuracy = 100, @@ -4756,7 +4756,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_AURA_SPHERE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_ALWAYS_HIT, .power = 80, .type = TYPE_FIGHTING, .accuracy = 0, @@ -4768,7 +4768,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_ROCK_POLISH - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_SPEED_UP_2, .power = 0, .type = TYPE_ROCK, .accuracy = 0, @@ -4780,7 +4780,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_POISON_JAB - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_POISON_HIT, .power = 80, .type = TYPE_POISON, .accuracy = 100, @@ -4792,7 +4792,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_DARK_PULSE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_FLINCH_HIT, .power = 80, .type = TYPE_DARK, .accuracy = 100, @@ -4804,7 +4804,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_NIGHT_SLASH - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HIT, .power = 70, .type = TYPE_DARK, .accuracy = 100, @@ -4816,7 +4816,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_AQUA_TAIL - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HIT, .power = 90, .type = TYPE_WATER, .accuracy = 90, @@ -4828,7 +4828,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_SEED_BOMB - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_GRASS, .accuracy = 100, @@ -4840,7 +4840,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_AIR_SLASH - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_FLINCH_HIT, .power = 75, .type = TYPE_FLYING, .accuracy = 95, @@ -4852,7 +4852,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_X_SCISSOR - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_BUG, .accuracy = 100, @@ -4864,7 +4864,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_BUG_BUZZ - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, .power = 90, .type = TYPE_BUG, .accuracy = 100, @@ -4876,7 +4876,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_DRAGON_PULSE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HIT, .power = 85, .type = TYPE_DRAGON, .accuracy = 100, @@ -4888,7 +4888,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_DRAGON_RUSH - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_FLINCH_HIT, .power = 100, .type = TYPE_DRAGON, .accuracy = 75, @@ -4900,7 +4900,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_POWER_GEM - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_ROCK, .accuracy = 100, @@ -4912,7 +4912,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_DRAIN_PUNCH - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_ABSORB, .power = 75, .type = TYPE_FIGHTING, .accuracy = 100, @@ -4924,7 +4924,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_VACUUM_WAVE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HIT, .power = 40, .type = TYPE_FIGHTING, .accuracy = 100, @@ -4936,7 +4936,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_FOCUS_BLAST - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, .power = 120, .type = TYPE_FIGHTING, .accuracy = 70, @@ -4948,7 +4948,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_ENERGY_BALL - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, .power = 90, .type = TYPE_GRASS, .accuracy = 100, @@ -4960,7 +4960,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_BRAVE_BIRD - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_DOUBLE_EDGE, .power = 120, .type = TYPE_FLYING, .accuracy = 100, @@ -4972,7 +4972,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_EARTH_POWER - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, .power = 90, .type = TYPE_GROUND, .accuracy = 100, @@ -4984,7 +4984,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_SWITCHEROO - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_TRICK, .power = 0, .type = TYPE_DARK, .accuracy = 100, @@ -4996,7 +4996,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_GIGA_IMPACT - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_RECHARGE, .power = 150, .type = TYPE_NORMAL, .accuracy = 90, @@ -5008,7 +5008,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_NASTY_PLOT - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_SPECIAL_ATTACK_UP_2, .power = 0, .type = TYPE_DARK, .accuracy = 0, @@ -5020,7 +5020,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_BULLET_PUNCH - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HIT, .power = 40, .type = TYPE_STEEL, .accuracy = 100, @@ -5032,7 +5032,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_AVALANCHE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_REVENGE, .power = 60, .type = TYPE_ICE, .accuracy = 100, @@ -5044,7 +5044,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_ICE_SHARD - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HIT, .power = 40, .type = TYPE_ICE, .accuracy = 100, @@ -5056,7 +5056,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_SHADOW_CLAW - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HIT, .power = 70, .type = TYPE_GHOST, .accuracy = 100, @@ -5068,7 +5068,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_THUNDER_FANG - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (10% paralyze AND 10% flinch) .power = 65, .type = TYPE_ELECTRIC, .accuracy = 95, @@ -5080,7 +5080,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_ICE_FANG - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (10% paralyze AND 10% flinch) .power = 65, .type = TYPE_ICE, .accuracy = 95, @@ -5092,7 +5092,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_FIRE_FANG - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (10% paralyze AND 10% flinch) .power = 65, .type = TYPE_FIRE, .accuracy = 95, @@ -5104,7 +5104,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_SHADOW_SNEAK - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HIT, .power = 40, .type = TYPE_GHOST, .accuracy = 100, @@ -5116,7 +5116,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_MUD_BOMB - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_ACCURACY_DOWN_HIT, .power = 65, .type = TYPE_GROUND, .accuracy = 85, @@ -5128,7 +5128,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_PSYCHO_CUT - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HIT, .power = 70, .type = TYPE_PSYCHIC, .accuracy = 100, @@ -5140,7 +5140,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_ZEN_HEADBUTT - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_FLINCH_HIT, .power = 80, .type = TYPE_PSYCHIC, .accuracy = 90, @@ -5152,7 +5152,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_MIRROR_SHOT - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_ACCURACY_DOWN_HIT, .power = 65, .type = TYPE_STEEL, .accuracy = 85, @@ -5164,7 +5164,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_FLASH_CANNON - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_SPECIAL_DEFENSE_DOWN, .power = 80, .type = TYPE_STEEL, .accuracy = 100, @@ -5176,7 +5176,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_ROCK_CLIMB - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_CONFUSE_HIT, .power = 90, .type = TYPE_NORMAL, .accuracy = 85, @@ -5188,7 +5188,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_DEFOG - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_FLYING, .accuracy = 0, @@ -5212,7 +5212,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_DRACO_METEOR - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_SPECIAL_ATTACK_DOWN_2, .power = 130, .type = TYPE_DRAGON, .accuracy = 90, @@ -5224,7 +5224,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_DISCHARGE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PARALYZE_HIT, .power = 80, .type = TYPE_ELECTRIC, .accuracy = 100, @@ -5236,7 +5236,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_LAVA_PLUME - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_BURN_HIT, .power = 80, .type = TYPE_FIRE, .accuracy = 100, @@ -5248,7 +5248,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_LEAF_STORM - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_SPECIAL_ATTACK_DOWN_2, .power = 130, .type = TYPE_GRASS, .accuracy = 90, @@ -5260,7 +5260,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_POWER_WHIP - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HIT, .power = 120, .type = TYPE_GRASS, .accuracy = 85, @@ -5272,7 +5272,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_ROCK_WRECKER - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_RECHARGE, .power = 150, .type = TYPE_ROCK, .accuracy = 90, @@ -5284,7 +5284,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_CROSS_POISON - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_POISON_HIT, .power = 70, .type = TYPE_POISON, .accuracy = 100, @@ -5296,7 +5296,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_GUNK_SHOT - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_POISON_HIT, .power = 120, .type = TYPE_POISON, .accuracy = 80, @@ -5308,7 +5308,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_IRON_HEAD - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_FLINCH_HIT, .power = 80, .type = TYPE_STEEL, .accuracy = 100, @@ -5320,7 +5320,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_MAGNET_BOMB - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_ALWAYS_HIT, .power = 60, .type = TYPE_STEEL, .accuracy = 0, @@ -5332,7 +5332,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_STONE_EDGE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HIT, .power = 100, .type = TYPE_ROCK, .accuracy = 80, @@ -5344,7 +5344,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_CAPTIVATE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 100, @@ -5368,7 +5368,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_GRASS_KNOT - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_LOW_KICK, .power = 1, .type = TYPE_GRASS, .accuracy = 100, @@ -5380,7 +5380,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_CHATTER - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_CONFUSE_HIT, .power = 65, .type = TYPE_FLYING, .accuracy = 100, @@ -5392,7 +5392,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_JUDGMENT - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 100, .type = TYPE_NORMAL, .accuracy = 100, @@ -5404,7 +5404,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_BUG_BITE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (Bug Bite and Pluck should have the same move effect) .power = 60, .type = TYPE_BUG, .accuracy = 100, @@ -5416,7 +5416,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_CHARGE_BEAM - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_SPECIAL_ATTACK_UP, .power = 50, .type = TYPE_ELECTRIC, .accuracy = 90, @@ -5428,7 +5428,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_WOOD_HAMMER - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_RECOIL, .power = 120, .type = TYPE_GRASS, .accuracy = 100, @@ -5440,7 +5440,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_AQUA_JET - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HIT, .power = 40, .type = TYPE_WATER, .accuracy = 100, @@ -5452,7 +5452,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_ATTACK_ORDER - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HIT, .power = 90, .type = TYPE_BUG, .accuracy = 100, @@ -5464,7 +5464,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_DEFEND_ORDER - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_BUG, .accuracy = 0, @@ -5476,7 +5476,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_HEAL_ORDER - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_RESTORE_HP, .power = 0, .type = TYPE_BUG, .accuracy = 0, @@ -5488,7 +5488,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_HEAD_SMASH - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (1/2 recoil instead of 1/3 recoil) .power = 150, .type = TYPE_ROCK, .accuracy = 80, @@ -5500,7 +5500,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_DOUBLE_HIT - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 35, .type = TYPE_NORMAL, .accuracy = 90, @@ -5512,7 +5512,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_ROAR_OF_TIME - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_RECHARGE, .power = 150, .type = TYPE_DRAGON, .accuracy = 90, @@ -5524,7 +5524,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_SPACIAL_REND - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HIT, .power = 100, .type = TYPE_DRAGON, .accuracy = 95, @@ -5548,7 +5548,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_CRUSH_GRIP - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_WRING_OUT, .power = 1, .type = TYPE_NORMAL, .accuracy = 100, @@ -5560,7 +5560,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_MAGMA_STORM - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_TRAP, .power = 100, .type = TYPE_FIRE, .accuracy = 75, @@ -5572,7 +5572,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_DARK_VOID - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_SLEEP, .power = 0, .type = TYPE_DARK, .accuracy = 50, @@ -5584,7 +5584,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_SEED_FLARE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_SPECIAL_DEFENSE_DOWN_2, .power = 120, .type = TYPE_GRASS, .accuracy = 85, @@ -5596,7 +5596,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_OMINOUS_WIND - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_ALL_STATS_UP_HIT, .power = 60, .type = TYPE_GHOST, .accuracy = 100, From d628d1f5fd76c581ed2f66b23ab19a1e6e3a2f80 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 29 Jul 2018 11:32:40 +0200 Subject: [PATCH 066/667] Move Weather Ball, Hidden power, AI support for dynamic type moves and AI debug support --- asm/macros/battle_script.inc | 4 +- data/battle_scripts_1.s | 10 +-- include/battle.h | 2 + include/battle_main.h | 1 + include/constants/battle.h | 1 + src/battle_ai_script_commands.c | 53 ++++++++++------ src/battle_debug.c | 41 ++++++++++++- src/battle_main.c | 105 +++++++++++++++++++++++--------- src/battle_script_commands.c | 40 ++---------- src/battle_util.c | 5 ++ 10 files changed, 168 insertions(+), 94 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 27e052c337..3c13ee676e 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -958,7 +958,7 @@ .4byte \param0 .endm - .macro hiddenpowercalc + .macro nop_C1 .byte 0xc1 .endm @@ -1148,7 +1148,7 @@ .4byte \param0 .endm - .macro setweatherballtype + .macro nop_E9 .byte 0xe9 .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index bc83108db5..0a7d51c3a2 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -623,6 +623,8 @@ BattleScript_EffectRetalitate: BattleScript_EffectBulldoze: BattleScript_EffectFoulPlay: BattleScript_EffectPsyshock: +BattleScript_EffectWeatherBall: +BattleScript_EffectHiddenPower: jumpifnotmove MOVE_SURF, BattleScript_HitFromAtkCanceler jumpifnostatus3 BS_TARGET, STATUS3_UNDERWATER, BattleScript_HitFromAtkCanceler orword gHitMarker, HITMARKER_IGNORE_UNDERWATER @@ -2157,10 +2159,6 @@ BattleScript_EffectMoonlight:: recoverbasedonsunlight BattleScript_AlreadyAtFullHp goto BattleScript_PresentHealTarget -BattleScript_EffectHiddenPower:: - hiddenpowercalc - goto BattleScript_EffectHit - BattleScript_EffectRainDance:: attackcanceler attackstring @@ -3024,10 +3022,6 @@ 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 diff --git a/include/battle.h b/include/battle.h index b63e4a4b86..e62d8d7e9b 100644 --- a/include/battle.h +++ b/include/battle.h @@ -594,6 +594,8 @@ struct BattleStruct u8 roostTypes[MAX_BATTLERS_COUNT][3]; u8 savedBattlerTarget; bool8 ateBoost[MAX_BATTLERS_COUNT]; + u32 debugAIFlags; + bool8 notfirstTimeAIFlags; }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/include/battle_main.h b/include/battle_main.h index 31768e844a..678f4e2db6 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -70,6 +70,7 @@ u8 GetWhoStrikesFirst(u8 battlerId1, u8 battlerId2, bool8 ignoreChosenMoves); void RunBattleScriptCommands_PopCallbacksStack(void); void RunBattleScriptCommands(void); bool8 TryRunFromBattle(u8 battlerId); +void SetTypeBeforeUsingMove(u16 move, u8 battlerAtk); extern const u8 gTypeEffectiveness[336]; extern const u8 gTypeNames[][TYPE_NAME_LENGTH + 1]; diff --git a/include/constants/battle.h b/include/constants/battle.h index 5202b95708..e0b888dd86 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -157,6 +157,7 @@ #define STATUS3_HEAL_BLOCK 0x8000000 #define STATUS3_AQUA_RING 0x10000000 #define STATUS3_LASER_FOCUS 0x20000000 +#define STATUS3_ELECTRIFIED 0x40000000 #define STATUS3_SEMI_INVULNERABLE (STATUS3_UNDERGROUND | STATUS3_ON_AIR | STATUS3_UNDERWATER) // Not really sure what a "hitmarker" is. diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 9a7cf395b9..41d740e802 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -360,25 +360,35 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves) } // 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_x4000000 | 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 (!gBattleStruct->notfirstTimeAIFlags || !USE_BATTLE_DEBUG) + { + 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_x4000000 | 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 + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + AI_THINKING_STRUCT->aiFlags |= AI_SCRIPT_DOUBLE_BATTLE; // Act smart in doubles and don't attack your partner. + + gBattleStruct->debugAIFlags = AI_THINKING_STRUCT->aiFlags; + gBattleStruct->notfirstTimeAIFlags = TRUE; + } + else + { + AI_THINKING_STRUCT->aiFlags = gBattleStruct->debugAIFlags; + } } u8 BattleAI_ChooseMoveOrAction(void) @@ -764,7 +774,7 @@ static bool32 AI_GetIfCrit(u32 move, u8 battlerAtk, u8 battlerDef) s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef) { - s32 dmg; + s32 dmg, moveType; SaveBattlerData(battlerAtk); SaveBattlerData(battlerDef); @@ -772,7 +782,10 @@ s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef) SetBattlerData(battlerAtk); SetBattlerData(battlerDef); - dmg = CalculateMoveDamage(move, battlerAtk, battlerDef, gBattleMoves[move].type, 0, AI_GetIfCrit(move, battlerAtk, battlerDef), FALSE); + gBattleStruct->dynamicMoveType = 0; + SetTypeBeforeUsingMove(move, battlerAtk); + GET_MOVE_TYPE(move, moveType); + dmg = CalculateMoveDamage(move, battlerAtk, battlerDef, moveType, 0, AI_GetIfCrit(move, battlerAtk, battlerDef), FALSE); RestoreBattlerData(battlerAtk); RestoreBattlerData(battlerDef); diff --git a/src/battle_debug.c b/src/battle_debug.c index 5b8b847f51..c7bfa4832b 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -84,7 +84,7 @@ enum LIST_ITEM_STATUS2, LIST_ITEM_STATUS3, LIST_ITEM_SIDE_STATUS, - LIST_ITEM_VARIOUS, + LIST_ITEM_AI, LIST_ITEM_COUNT }; @@ -179,6 +179,13 @@ 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_EmptyString[] = _(""); @@ -245,6 +252,17 @@ static const struct BitfieldInfo sStatus3Bitfield[] = {/*Aqua Ring*/ 1, 28}, }; +static const struct BitfieldInfo sAIBitfield[] = +{ + {/*Check bad move*/ 1, 0}, + {/*Viability*/ 1, 1}, + {/*Try To Faint*/ 1, 2}, + {/*Set up first turn*/ 1, 3}, + {/*Risky*/ 1, 4}, + {/*Prefer Strongest Move*/ 1, 5}, +}; + + static const struct ListMenuItem sMainListItems[] = { {sText_Moves, LIST_ITEM_MOVES}, @@ -258,6 +276,17 @@ static const struct ListMenuItem sMainListItems[] = {sText_Status2, LIST_ITEM_STATUS2}, {sText_Status3, LIST_ITEM_STATUS3}, {sText_SideStatus, LIST_ITEM_SIDE_STATUS}, + {sText_AI, LIST_ITEM_AI}, +}; + +static const struct ListMenuItem sAIListItems[] = +{ + {sText_NoBadMoves, 0}, + {sText_Viability, 1}, + {sText_TryFaint, 2}, + {sText_SetUpFirstTurn, 3}, + {sText_Risky, 4}, + {sText_StrongestMove, 5}, }; static const struct ListMenuItem sStatsListItems[] = @@ -818,6 +847,11 @@ static void CreateSecondaryListMenu(struct BattleDebugMenu *data) 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_SIDE_STATUS: listTemplate.items = sSideStatusListItems; itemsCount = ARRAY_COUNT(sSideStatusListItems); @@ -1245,6 +1279,11 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) 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 = &gBattleStruct->debugAIFlags; + data->modifyArrows.currValue = GetBitfieldValue(gBattleStruct->debugAIFlags, 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; diff --git a/src/battle_main.c b/src/battle_main.c index 3fa9561021..84fc6531ba 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4936,6 +4936,8 @@ static void SpecialStatusesClear(void) static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void) { + u32 i; + if (!(gHitMarker & HITMARKER_RUN)) { while (gBattleStruct->focusPunchBattlerId < gBattlersCount) @@ -4957,6 +4959,8 @@ static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void) gCurrentTurnActionNumber = 0; gCurrentActionFuncId = gActionsByTurnOrder[0]; gBattleStruct->dynamicMoveType = 0; + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + gBattleStruct->ateBoost[i] = FALSE; gBattleMainFunc = RunTurnActionsFunctions; gBattleCommunication[3] = 0; gBattleCommunication[4] = 0; @@ -5291,12 +5295,80 @@ void RunBattleScriptCommands(void) gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); } +void SetTypeBeforeUsingMove(u16 move, u8 battlerAtk) +{ + u32 moveType, ateType, attackerAbility; + + if (move == MOVE_STRUGGLE) + return; + + 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; + } + + 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 + && ((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; + } +} + static void HandleAction_UseMove(void) { u8 side; u8 var = 4; u32 attackerAbility; - u32 ateType; + u32 ateType, moveType; gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; @@ -5483,7 +5555,7 @@ static void HandleAction_UseMove(void) } } - // choose battlescript + // Choose battlescript. if (gBattleTypeFlags & BATTLE_TYPE_PALACE && gProtectStructs[gBattlerAttacker].flag_x10) { @@ -5512,33 +5584,8 @@ static void HandleAction_UseMove(void) if (gBattleTypeFlags & BATTLE_TYPE_ARENA) sub_81A56E8(gBattlerAttacker); - attackerAbility = GetBattlerAbility(gBattlerAttacker); - // Set move type. - if (gFieldStatuses & STATUS_FIELD_ION_DELUGE) // All moves become Electric-type this turn. - { - gBattleStruct->dynamicMoveType = 0x80 | TYPE_ELECTRIC; - } - else if (gBattleMoves[gChosenMove].type == TYPE_NORMAL - && gBattleMoves[gChosenMove].effect != EFFECT_HIDDEN_POWER - && gBattleMoves[gChosenMove].effect != EFFECT_WEATHER_BALL - && ((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[gBattlerAttacker] = 1; - } - else if (gBattleMoves[gChosenMove].type != TYPE_NORMAL - && gBattleMoves[gChosenMove].effect != EFFECT_HIDDEN_POWER - && gBattleMoves[gChosenMove].effect != EFFECT_WEATHER_BALL - && attackerAbility == ABILITY_NORMALIZE) - { - gBattleStruct->dynamicMoveType = 0x80 | TYPE_NORMAL; - gBattleStruct->ateBoost[gBattlerAttacker] = 1; - } + // Set dynamic move type. + SetTypeBeforeUsingMove(gChosenMove, gBattlerAttacker); gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 75cc21c4a9..50afec434e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -285,7 +285,7 @@ static void atkBD_copyfoestats(void); static void atkBE_rapidspinfree(void); static void atkBF_setdefensecurlbit(void); static void atkC0_recoverbasedonsunlight(void); -static void atkC1_hiddenpowercalc(void); +static void atkC1_nop(void); static void atkC2_selectfirstvalidtarget(void); static void atkC3_trysetfutureattack(void); static void atkC4_trydobeatup(void); @@ -325,7 +325,7 @@ static void atkE5_pickup(void); static void atkE6_docastformchangeanimation(void); static void atkE7_trycastformdatachange(void); static void atkE8_settypebasedhalvers(void); -static void atkE9_setweatherballtype(void); +static void atkE9_nop(void); static void atkEA_tryrecycleitem(void); static void atkEB_settypetoterrain(void); static void atkEC_pursuitrelated(void); @@ -543,7 +543,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atkBE_rapidspinfree, atkBF_setdefensecurlbit, atkC0_recoverbasedonsunlight, - atkC1_hiddenpowercalc, + atkC1_nop, atkC2_selectfirstvalidtarget, atkC3_trysetfutureattack, atkC4_trydobeatup, @@ -583,7 +583,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atkE6_docastformchangeanimation, atkE7_trycastformdatachange, atkE8_settypebasedhalvers, - atkE9_setweatherballtype, + atkE9_nop, atkEA_tryrecycleitem, atkEB_settypetoterrain, atkEC_pursuitrelated, @@ -8694,22 +8694,8 @@ static void atkC0_recoverbasedonsunlight(void) } } -static void atkC1_hiddenpowercalc(void) +static void atkC1_nop(void) { - u8 typeBits; - - 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); - - gBattleStruct->dynamicMoveType = (15 * typeBits) / 63 + 1; - if (gBattleStruct->dynamicMoveType >= TYPE_MYSTERY) - gBattleStruct->dynamicMoveType++; - gBattleStruct->dynamicMoveType |= 0xC0; - gBattlescriptCurrInstr++; } @@ -9600,22 +9586,8 @@ static void atkE8_settypebasedhalvers(void) // water and mud sport gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } -static void atkE9_setweatherballtype(void) +static void atkE9_nop(void) { - 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; - } - gBattlescriptCurrInstr++; } diff --git a/src/battle_util.c b/src/battle_util.c index 51a8288714..c5305efafc 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1215,6 +1215,7 @@ enum ENDTURN_YAWN, ENDTURN_ITEMS2, ENDTURN_ROOST, + ENDTURN_ELECTRIFY, ENDTURN_BATTLER_COUNT }; @@ -1658,6 +1659,10 @@ u8 DoBattlerEndTurnEffects(void) } gBattleStruct->turnEffectsTracker++; break; + case ENDTURN_ELECTRIFY: + gStatuses3[gActiveBattler] &= ~(STATUS3_ELECTRIFIED); + gBattleStruct->turnEffectsTracker++; + break; case ENDTURN_BATTLER_COUNT: // done gBattleStruct->turnEffectsTracker = 0; gBattleStruct->turnEffectsBattlerId++; From 3d93da7133a86a73529344ddfb931799f8a14d24 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 29 Jul 2018 12:21:28 +0200 Subject: [PATCH 067/667] Add Imposter --- asm/macros/battle_script.inc | 5 +++++ data/battle_scripts_1.s | 8 ++++++++ include/battle_scripts.h | 1 + include/constants/battle_script_commands.h | 1 + include/constants/battle_string_ids.h | 1 + src/battle_message.c | 2 ++ src/battle_script_commands.c | 5 +++++ src/battle_util.c | 10 ++++++++++ 8 files changed, 33 insertions(+) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 3c13ee676e..0285b0f323 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1393,6 +1393,11 @@ various \battler, VARIOUS_TRY_ACTIVATE_FELL_STINGER .endm + .macro playmoveanimation battler move + various \battler, VARIOUS_PLAY_MOVE_ANIMATION + .2byte \move + .endm + @ helpful macros .macro setstatchanger stat, stages, down setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 0a7d51c3a2..d80cd229bf 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4858,6 +4858,14 @@ BattleScript_SwitchInAbilityMsg:: printfromtable gSwitchInAbilityStringIds waitmessage 0x40 end3 + +BattleScript_ImposterActivates:: + transformdataexecution + playmoveanimation BS_ATTACKER MOVE_TRANSFORM + waitanimation + printstring STRINGID_IMPOSTERTRANSFORM + waitmessage 0x40 + end3 BattleScript_RoughSkinActivates:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 8d57b9637b..c3ef0bfaf6 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -324,5 +324,6 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index ceeb21b196..fdf68fba60 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -81,6 +81,7 @@ #define VARIOUS_RESTORE_PP 33 #define VARIOUS_TRY_ACTIVATE_MOXIE 34 #define VARIOUS_TRY_ACTIVATE_FELL_STINGER 35 +#define VARIOUS_PLAY_MOVE_ANIMATION 36 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 92040daf49..008d622adb 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -485,6 +485,7 @@ #define STRINGID_TARGETABILITYSTATLOWER 482 #define STRINGID_TARGETSTATWONTGOHIGHER 483 #define STRINGID_PKMNMOVEBOUNCEDABILITY 484 +#define STRINGID_IMPOSTERTRANSFORM 485 #define BATTLESTRINGS_COUNT 496 diff --git a/src/battle_message.c b/src/battle_message.c index a8427508ba..a04f904044 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -626,6 +626,7 @@ static const u8 sText_CursedBodyDisabled[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_ 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}!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { @@ -1103,6 +1104,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_TargetAbilityLoweredStat, sText_TargetStatWontGoHigher, sText_PkmnMoveBouncedViaAbility, + sText_ImposterTransform, }; const u16 gMagicCoatBounceStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 50afec434e..189c4e6bcd 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6355,6 +6355,11 @@ static void atk76_various(void) 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; } gBattlescriptCurrInstr += 3; diff --git a/src/battle_util.c b/src/battle_util.c index c5305efafc..005b33d949 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2429,6 +2429,16 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA 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)) + { + gBattlerTarget = BATTLE_OPPOSITE(battler); + BattleScriptPushCursorAndCallback(BattleScript_ImposterActivates); + effect++; + } + break; case ABILITY_MOLD_BREAKER: if (!gSpecialStatuses[battler].switchInAbilityDone) { From 2f6cc2be80642a694b6a96d8a974df71ac0cfb6d Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 29 Jul 2018 12:45:08 +0200 Subject: [PATCH 068/667] Electric types immune to paralysis --- data/battle_scripts_1.s | 1 + src/battle_script_commands.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index d80cd229bf..a5b43daf87 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1445,6 +1445,7 @@ BattleScript_EffectParalyze:: typecalc jumpifmovehadnoeffect BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_PARALYSIS, BattleScript_AlreadyParalyzed + jumpiftype BS_TARGET, TYPE_ELECTRIC, BattleScript_NotAffected jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 189c4e6bcd..b7f7d55b68 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2230,6 +2230,20 @@ void SetMoveEffect(bool8 primary, u8 certain) else break; } + if ((IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_ELECTRIC)) + && (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) + && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_PRLZPrevention; + + gBattleCommunication[MULTISTRING_CHOOSER] = 2; + RESET_RETURN + } + if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_ELECTRIC)) + break; + if (gBattleMons[gEffectBattler].ability == ABILITY_LIMBER) + break; if (gBattleMons[gEffectBattler].status1) break; From cc764d8b779129f8f3e818a4d1840ea772253207 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 29 Jul 2018 17:19:57 +0200 Subject: [PATCH 069/667] Debug option to show opponents hp --- src/battle_debug.c | 35 ++++++++++++++++++++++++++++++++++- src/battle_interface.c | 16 +++++++++------- 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/src/battle_debug.c b/src/battle_debug.c index c7bfa4832b..734eadc0d8 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -85,6 +85,7 @@ enum LIST_ITEM_STATUS3, LIST_ITEM_SIDE_STATUS, LIST_ITEM_AI, + LIST_ITEM_VARIOUS, LIST_ITEM_COUNT }; @@ -103,7 +104,8 @@ enum VAL_BITFIELD_8, VAL_BITFIELD_16, VAL_BITFIELD_32, - VAR_SIDE_STATUS + VAR_SIDE_STATUS, + VAR_SHOW_HP, }; enum @@ -121,6 +123,11 @@ enum LIST_SIDE_STICKY_WEB, }; +enum +{ + VARIOUS_SHOW_HP, +}; + // const rom data static const u8 sText_Ability[] = _("Ability"); static const u8 sText_Moves[] = _("Moves"); @@ -186,6 +193,8 @@ 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_EmptyString[] = _(""); @@ -277,6 +286,12 @@ static const struct ListMenuItem sMainListItems[] = {sText_Status3, LIST_ITEM_STATUS3}, {sText_SideStatus, LIST_ITEM_SIDE_STATUS}, {sText_AI, LIST_ITEM_AI}, + {sText_Various, LIST_ITEM_VARIOUS}, +}; + +static const struct ListMenuItem sVariousListItems[] = +{ + {sText_ShowHP, VARIOUS_SHOW_HP}, }; static const struct ListMenuItem sAIListItems[] = @@ -852,6 +867,10 @@ static void CreateSecondaryListMenu(struct BattleDebugMenu *data) 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); @@ -1024,6 +1043,9 @@ static void UpdateBattlerValue(struct BattleDebugMenu *data) 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; } data->battlerWasChanged[data->battlerId] = TRUE; } @@ -1264,6 +1286,17 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) 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; + } + 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); diff --git a/src/battle_interface.c b/src/battle_interface.c index 278edb6f43..e8c9fad912 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -22,6 +22,7 @@ #include "battle_anim.h" #include "constants/rgb.h" #include "data2.h" +#include "battle_debug.h" struct TestingBar { @@ -1218,7 +1219,7 @@ 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); } @@ -1237,12 +1238,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++) @@ -2193,9 +2194,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; @@ -2245,6 +2243,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); From 0a4b2ba45634d1fe9ececd2ba4634554c98e0857 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 29 Jul 2018 17:28:56 +0200 Subject: [PATCH 070/667] Make it harder to break with battle debug --- src/battle_debug.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/battle_debug.c b/src/battle_debug.c index 734eadc0d8..9653d64dca 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -1264,11 +1264,13 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) { 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 From 0663c142b73f81e8464f911049205bae7f0484bb Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 29 Jul 2018 19:54:23 +0200 Subject: [PATCH 071/667] Add split icons --- graphics/misc/split_icons.png | Bin 0 -> 5451 bytes ld_script.txt | 1 + src/pokemon_summary_screen.c | 98 ++++++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 graphics/misc/split_icons.png diff --git a/graphics/misc/split_icons.png b/graphics/misc/split_icons.png new file mode 100644 index 0000000000000000000000000000000000000000..1c7d63c9eb775ab15aefe3456b2ac3cb8c47ede7 GIT binary patch literal 5451 zcmV-R6}0M!P)T%~}000y3dQ@0+Qek%> zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3*tb|km4h5us}ZwZ)(WzBUvl1?m`cqpXUo6XV)LB`)jt28pU%en{r$y$Joxs! z2_G+bp3*Px6M4VKcb-qb-caKE{P_O7Df2x~eNXgp$@hdoSN1%3kE`#Af`6WO@9(C) z@9Xi)?Y#fDbr)~ld(iK{$3ihy;(Wmyzk>^w@AoQ!6@(f(KMUV|XkO1W9!GxbJdQut z&ZP8n@jf5@Ry*6@=fn3>7@OY%@^3YIpLgl!+T99$U6K2B+S;k^C&?@R5@S@oR# z++B~EN@erj)W@ydM;tgPWw>w4d=>srJTCXE@m0CSNyir59DGgVn)6iqxagMa?znw_ zPB&R%^xGGHdOv-*&(%dPHpXvQ-1$cIVSg8K5g7I&}P?)9dtTzNT;^p2A` z-tmVo^V5@m=j-!C=Lova+4|H8SgDPTx6-hPd}9Za{( zl^g7KJf|4R{lZqbeGVL#Y%~w(tt;z20VU$vVg?uJfXyx>mz^!%7w4#Br9YjO`w;!0 z11=@MoH_I+giLd)*R^?1araoC{PQ%_LL*Yhj7`Kad%@^K0$I!Wpo9rMxA@uCg@Xs@2x z>SFZjoO))PXDE`VYc8od%c)~@FmC75ai6{W)ww_In@RCM>YM*poil3P|Dtn7t$RE7 z$G-j0wbiepgxerZp=xTwf!I!*-Pi6%SfrKw%!`+>|7?4Iqfci`&_JUxW0Gpu2jQ)^wC1L+)H3edrNWkIp;b@ za#;6-o=f99zf+iVTn~rVh7rzboRs@L@X?uhxD(s(b)UXl_Y4o58a*#J*XE8C2>KnV z#R35007rAD*lng3b?)NJG1Ct&oc4N58`yCyetIe9O2>Gyl?>%uQn@Y25W=$M;ht)H{nn)2M%?XikWJ2VDr_*Cc2skUT?OKTjAR;aVw``kTk z*G4O29D7oq$6GCJ9PdgmcH{1Hb|9?A(NdY=&>Zh(3e_79sD8$NYGbT6MLs)bcqb;V zRLe}domuL|(T-u+au!RX(3Kh6+{G?#gQHtI28EWSJz=npZsd}}c40H@oEi|99;DI$ znqFk!23aJ)j*=V+i+S*tN?f{iw@&o;)`4W^rWj6ocbh-gt~A8bn;j-TEK^a}GX5-< zU}#ZGFu|ZEA%o<)ZCtg-z2U>i_}9gKRn;h;02_q1>Rij?``YK?xHaFC?FZa#;clQfMa*uqzrw%-ouLt-JI!Ahr%2Fa{nvXs6nJ;F(<901ji@i|q!l(}qpMXvLt7 zDV0vAX%(PI^w6B@)W}RD7aBg{!R_y8z*h`RD;s>5%VwP>p0KGzsOQeznYHwLG1E^@ zcV=wsV*%f(mfVB9(;ESFyT8-UK6fwEV>pVv7aOpzhI(a#f}lQ;@j(IPQ5KWqUbF}L znPEK+snB6ep2}zH2y*czb!ssX$FbWKRu^eAoCcs6VQ@g*LP^L=ZJOE547i$o$Ta}F z14|sQQCtwofXQ}k-i%SQKlGq4`>`?~@r{%mdd_sMj5Ai^N;ym#$1U5YTNX*d1Blm7 z9i>fVjOOTg&Wy4s-;Ukt#B0Uss^44UGBX7(hhBwVfjBf$;KF#^n8^AtIMxXk(U$@( z`ZN-9mz#H_5Cm_=42G$^6T%btffLf)Z8@P5>40J)dB&^>v+a({Mk0<~Bm2fuS8@~S z{En3`P(kNkm}%sJnfbsOiYKIXM52U^)WfK2ie0_NpsrU%LCrjs37KJwWJ6t)E*-O( zq_S`qhq-cs-CizZ_DKLt9g(5rJ$tFReK2!StC=J6zUxA`nAgw>-o%_X#Odg2U~Pqw z6#YOltZ}CF=tje8T)_-XJBOWiLA*T}7G@o0v{ck>S6Q-#1G+cq@G@t5h}^~p_3l0o zwDWU<4IhV|R%<5-2{D;;cB72p&c%PRGV`&tzqzt{auKyyqbCv`>y9PU3F}?qJ0F+- zdhxB3BB67{Eg@%+9&6FhJrN;b&u8%fcRJ359lbZzdSi`s^gmzs2u2mF1qyVD?{S<7 zbP>@J8$j_9V9{qr9CvEPfuMWCj1i*<1+a*P5a9eBRGVSj!$Labd1|ICE@LOxjwHWU zTxK})&Q%*8g%blt8wsXJIA_F{!p;osDK(?h`=DBjJD3Z@=44P0Gll){vHF;KrtW^R z&Ac;jXcs(*+M(Szw$(U6eV7!F)FmJ>X{+L||4ayg!F+h%bjQSL?hHzRnK~-9@VFI+ zI9U9I9!G=Q#$E>uJl*mxmNm9Ndk@28YXZx)J`5LN+%IEyNwAuU+;surltgV^7N??SOT0wWWczf#JNL) zGX&|3D~V$&0B430!4GcE5WVaT2%$^Z7Lel-z9c?&G<47gKa935-T;(fC73B(E}$Ha zj7B)7dYlHR0|Z3&S@8aDy9$`+RqPFb#n*hAHW=XAwq1<9RT%q9FFMb#K>;CH27FVab1>0FzhgCuJ;cV6tcU%PqK4h3*>T@zCUn5!4h@L~t> zkee{UEyqQe=rC!HOr!);K&xbKP6KMDgb|*C4~Y*zV&$8UA_5D87z-0oPB)?l{$K?U z3d}IQv5SBA!nn1})smnLA#=AiY7X$_;nNS8m88cNisocYjzSAb8h?+;!4Z=HXSNC* z%m;+*uf}+fA=D<=H4y-)8^Sr%PRJe5qy~EeXP;%y=`vUCT#sP$Sco0aDNQy7Rl`JX z^BPTaou+&ymL9iCT-b7h)bKi#Z&r0;EUu0z%glY|&~^ZqP3RgHkN0^Bg}0M7MhDLF za%aW?2?PZ@&JmMhW~^ztx}pQx07iq3*ui|=3{PiEJ~j_tfHQZzs+5VS-+=Oj zQxPcixeXp-_wapvO|C%qNj`?rBFa!MwU(i{#uzjZmkts1WX5SJRD%C7C?*%&jv;%z z+GcFQ_6pczwCQ>UF9p_M5J@EVA4VZ}l$aU<9_=KoEqpue`g)=}dEvOK+<$`5K1nay zv|eFERXs}-lvu!$owvsk}o2)BO z!kP$!-RDfAMrkQBy1!@)g$HI<{&k&Z@Y?_nz6?0yp0&l4EZl)6bh&Idxz6KS)WvI!z%@GC|Y8DzTYxCuUY!;*t}YmTPtJ@2FJyVJv_XsX}dNh+{}(C9#LZ1A26n*xvn#Uzv>o_8IsPQ_nQ(5TEBA4Ez(uF=lk+S_4f=Wpx`G z10WNOFv>(Yq9%z)?CfS{P-dwOya`wa)!v1+vu14=a#fT?n~?BTO|oc2;U=VML#ASaAtYOdNrSMX z?ZFnO@=dpO!t)Z4Wv`fF0UvwXZQR$i9=%_vOEELm_kNhQqnW!2=hA}W{Y5mS0Y@c- z!C`udsdBPc6hqk6CuoishnpxeswRx}C}yc>Egt=D%RUbMXD%O*48d{Ca@{W=xNd~t zr+qn=DF?B3Xb*NEy*qg*;pYnFn4)h*b_aioD^AQZO9Fc+?OoEh1>Mk4G(oY`3V0@@ z19|vC+JkejAhg6qZo@U^XNPdi#~NYYXO$YS^lTognkX;JT=-7T8Rcu}R8P)z8J@^^z=9SZ}*$NcM4&Ag&sTuYO_rRH(&G$e#g}&E>$Ai^tm0Y3vpnAf-g#aot=JCw4 zC5lbFLuWy`FH5a~KwSmIErB0Nb4Y&E)TT|&mVA>Jz1y9bPo#cE2O|464cJ`X)=QairW5t!6_|iiAnXtbT-Yr%KW}cPPNoN{g+HOVuKhItMpOjb+VVuiVr32x zUNi&lLB&_#8mymW3v}VVahM$d4zA2}nR3z)S>G_V;ok@vPznq^@YV~Sg;|5QCF5v0 zd(kBjxFZqm4MruHn&ssWVtkBm49R{s2VcB_lL_GMc<_{>746s@i2A-C!T{aygw=q1gHv9(I;{Gl*B!bkCUQSn97ND$oT9D zo;!M}z7-L$7)#!)z)#pmgpnXwZ6d^D!8fMzbQw?NJe~T;Qwk(VA_h*s2J8u0mT6cH z09>*dL1@F8D&GcalY--%EAt;Zb7#&e;%q#mHa>_B14fmKi9E+lPbjtx3ED&9eoy8WP>7s0ZO!(Sav_0$ zbluCuXo3fAw+$x&o+_w#ZbTvk?1EGdbO;6iSKaa<-dJBzoS~0NGH(uY2oPRzJx9Y$ zC(7do?{)f zt93j*v)&3eB0&G}4z|2fs;zy!5cG*2!a`JQC@sq*2}o%aX%=AgJLxlN2l2TkYes{S zbV9=A2oi+?i7%7VyB60NBOCEBZV^g`$(AbPw697@7;|khoQ*oruA^9dKSyFc3)gi& z9c)9pC`4EDFrAah$EriAM955lg%MC6rh!~Bi4}6TC)cWd769UVwlH_ek)q2$!AJ1u z^Lb2;YbhyV`aa+-^pd+n!^{3yHb^fx{xDFWlusL zUQ8eLWd>P)EEa^L;uegwP)lvQ;5H4^0XQ9bDYig<#UnC#aARb;xYUyH(`;tB@ov&F zfe9GSDPICfovc4SI7~k@_k0FQsG1*Juspnu$kz+P-ku$$Yivfoxu8?&-SfNeEu*zp zlNpS-T$Tmp;nBzA+2|bJ>93sBd_C*ele)cpS~L9BQ<|R_`tMH(Kx{tszM(=Yrl2Z8 zK1INyfO0nwlJ>_pNz8)?RPksZYd3w)eUww7LyamS67Qub72u=&Ziahp(7>BSrvC@b zB>vHF`t5!I001yhOjJdW@v-rNF~Kn@xuN+|L0004EOGiWihy@);00009a7bBm000tn000tn0p4aGcmMzZ z2XskIMF-*s9T6%H5}C=&EHf&l5a7feM{K zTei||1U))--xxx)cu@bVx^5l2S6F50i(3ih9R|*9a>8Do}jPE*cn%Me&-16 zpXerjY)j|_*n|R*0+CIO$+?*kJW;fakdp0)M4l0?bHVfSOf>QGBRc2LfB$FK&=sf| z6(E<^YGzsplitIconSpriteId == 0xFF) + gUnknown_0203CF1C->splitIconSpriteId = CreateSprite(&sSpriteTemplate_SplitIcons, 48, 129, 0); + + StartSpriteAnim(&gSprites[gUnknown_0203CF1C->splitIconSpriteId], split); + return gUnknown_0203CF1C->splitIconSpriteId; +} + +static void DestroySplitIcon(void) +{ + FreeSpritePaletteByTag(SPLIT_ICONS_TAG); + FreeSpriteTilesByTag(SPLIT_ICONS_TAG); + if (gUnknown_0203CF1C->splitIconSpriteId != 0xFF) + DestroySprite(&gSprites[gUnknown_0203CF1C->splitIconSpriteId]); + gUnknown_0203CF1C->splitIconSpriteId = 0xFF; +} + void sub_81BF8EC(u8 a, void *b, u8 c, u8 d, void *e) { u8 byte; @@ -359,6 +453,7 @@ void sub_81BF8EC(u8 a, void *b, u8 c, u8 d, void *e) gUnknown_0203CF1C->unk40BE = c; gUnknown_0203CF1C->unk40BF = d; gUnknown_0203CF1C->unk4 = e; + gUnknown_0203CF1C->splitIconSpriteId = 0xFF; if (a == 2) gUnknown_0203CF1C->unk40BD = 1; else @@ -1255,6 +1350,7 @@ void sub_81C1070(s16 *a, s8 b, u8 *c) { ClearWindowTilemap(14); ClearWindowTilemap(15); + DestroySplitIcon(); schedule_bg_copy_tilemap_to_vram(0); sub_81C1DA4(0, 3); sub_81C1EFC(0, 3, 0); @@ -1279,6 +1375,7 @@ void sub_81C11F4(u8 taskId) { ClearWindowTilemap(14); ClearWindowTilemap(15); + DestroySplitIcon(); sub_81C1DA4(0, 3); sub_81C1EFC(0, 3, 0); } @@ -3522,6 +3619,7 @@ void sub_81C3C5C(u16 move) u8 *text; if (move != 0) { + ShowSplitIcon(gBattleMoves[move].split); FillWindowPixelRect(14, 0, 0x35, 0, 0x13, 0x20); if (gBattleMoves[move].power <= 1) text = gText_ThreeDashes; From 05b763964c87f8927b5ef39525cd2e9df5461894 Mon Sep 17 00:00:00 2001 From: Tetrable Date: Sun, 29 Jul 2018 19:13:24 +0100 Subject: [PATCH 072/667] add existing effects to remaining moves, labelled needed custom effects --- include/data/battle_moves.h | 270 ++++++++++++++++++------------------ 1 file changed, 135 insertions(+), 135 deletions(-) diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index a664191210..66c47a5798 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -5212,7 +5212,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_DRACO_METEOR - .effect = EFFECT_SPECIAL_ATTACK_DOWN_2, + .effect = EFFECT_SPECIAL_ATTACK_DOWN_2, .power = 130, .type = TYPE_DRAGON, .accuracy = 90, @@ -5500,7 +5500,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_DOUBLE_HIT - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_DOUBLE_HIT, .power = 35, .type = TYPE_NORMAL, .accuracy = 90, @@ -5620,7 +5620,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_HONE_CLAWS - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_DARK, .accuracy = 0, @@ -5632,7 +5632,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_WIDE_GUARD - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_ROCK, .accuracy = 0, @@ -5704,7 +5704,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_AUTOTOMIZE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (raises the user's Speed stat by two stages BUT also decreases the user's weight by 100kg) .power = 0, .type = TYPE_STEEL, .accuracy = 0, @@ -5716,7 +5716,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_RAGE_POWDER - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_FOLLOW_ME, .power = 0, .type = TYPE_BUG, .accuracy = 0, @@ -5752,7 +5752,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_SMACK_DOWN - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 50, .type = TYPE_ROCK, .accuracy = 100, @@ -5776,7 +5776,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_FLAME_BURST - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 70, .type = TYPE_FIRE, .accuracy = 100, @@ -5788,7 +5788,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_SLUDGE_WAVE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_POISON_HIT, .power = 95, .type = TYPE_POISON, .accuracy = 100, @@ -5800,7 +5800,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_QUIVER_DANCE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_BUG, .accuracy = 0, @@ -5812,7 +5812,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_HEAVY_SLAM - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 1, .type = TYPE_STEEL, .accuracy = 100, @@ -5824,7 +5824,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_SYNCHRONOISE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 120, .type = TYPE_PSYCHIC, .accuracy = 100, @@ -5848,7 +5848,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_SOAK - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_WATER, .accuracy = 100, @@ -5860,7 +5860,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_FLAME_CHARGE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_SPEED_UP, .power = 50, .type = TYPE_FIRE, .accuracy = 100, @@ -5872,7 +5872,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_COIL - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_POISON, .accuracy = 0, @@ -5884,7 +5884,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_LOW_SWEEP - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_SPEED_DOWN_HIT, .power = 65, .type = TYPE_FIGHTING, .accuracy = 100, @@ -5896,7 +5896,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_ACID_SPRAY - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 40, .type = TYPE_POISON, .accuracy = 100, @@ -5920,7 +5920,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_SIMPLE_BEAM - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 100, @@ -5932,7 +5932,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_ENTRAINMENT - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 100, @@ -5944,7 +5944,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_AFTER_YOU - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -5956,7 +5956,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_ROUND - .effect = EFFECT_ROUND, + .effect = EFFECT_ROUND, // Needs a custom move effect .power = 60, .type = TYPE_NORMAL, .accuracy = 100, @@ -5980,7 +5980,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_CHIP_AWAY - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 70, .type = TYPE_NORMAL, .accuracy = 100, @@ -5992,7 +5992,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_CLEAR_SMOG - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (Always bypasses accuracy, but same as Haze) .power = 50, .type = TYPE_POISON, .accuracy = 0, @@ -6016,7 +6016,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_QUICK_GUARD - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_FIGHTING, .accuracy = 0, @@ -6028,7 +6028,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_ALLY_SWITCH - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -6040,7 +6040,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_SCALD - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (30% burn + always thaws ice even if it misses) .power = 80, .type = TYPE_WATER, .accuracy = 100, @@ -6052,7 +6052,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_SHELL_SMASH - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -6064,7 +6064,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_HEAL_PULSE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (always bypasses accuracy checks) .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -6088,7 +6088,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_SKY_DROP - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 60, .type = TYPE_FLYING, .accuracy = 100, @@ -6100,7 +6100,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_SHIFT_GEAR - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_STEEL, .accuracy = 0, @@ -6112,7 +6112,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_CIRCLE_THROW - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (similar to whirlwind, but different) .power = 60, .type = TYPE_FIGHTING, .accuracy = 90, @@ -6124,7 +6124,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_INCINERATE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 60, .type = TYPE_FIRE, .accuracy = 100, @@ -6136,7 +6136,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_QUASH - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_DARK, .accuracy = 100, @@ -6160,7 +6160,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_REFLECT_TYPE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -6184,7 +6184,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_FINAL_GAMBIT - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 1, .type = TYPE_FIGHTING, .accuracy = 100, @@ -6196,7 +6196,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_BESTOW - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -6208,7 +6208,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_INFERNO - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_BURN_HIT, .power = 100, .type = TYPE_FIRE, .accuracy = 50, @@ -6220,7 +6220,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_WATER_PLEDGE - .effect = EFFECT_PLEDGE, + .effect = EFFECT_PLEDGE .power = 80, .type = TYPE_WATER, .accuracy = 100, @@ -6232,7 +6232,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_FIRE_PLEDGE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLEDGE .power = 80, .type = TYPE_FIRE, .accuracy = 100, @@ -6244,7 +6244,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_GRASS_PLEDGE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLEDGE .power = 80, .type = TYPE_GRASS, .accuracy = 100, @@ -6268,7 +6268,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_STRUGGLE_BUG - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_SPECIAL_ATTACK_DOWN_HIT, .power = 50, .type = TYPE_BUG, .accuracy = 100, @@ -6304,7 +6304,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_DRAGON_TAIL - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 60, .type = TYPE_DRAGON, .accuracy = 90, @@ -6316,7 +6316,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_WORK_UP - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -6328,7 +6328,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_ELECTROWEB - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_SPEED_DOWN_HIT, .power = 55, .type = TYPE_ELECTRIC, .accuracy = 95, @@ -6340,7 +6340,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_WILD_CHARGE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (recoil damage but 1/4 instead of 1/3) .power = 90, .type = TYPE_ELECTRIC, .accuracy = 100, @@ -6352,7 +6352,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_DRILL_RUN - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_GROUND, .accuracy = 95, @@ -6364,7 +6364,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_DUAL_CHOP - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_DOUBLE_HIT, .power = 40, .type = TYPE_DRAGON, .accuracy = 90, @@ -6376,7 +6376,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_HEART_STAMP - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_FLINCH_HIT, .power = 60, .type = TYPE_PSYCHIC, .accuracy = 100, @@ -6388,7 +6388,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_HORN_LEECH - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_ABSORB, .power = 75, .type = TYPE_GRASS, .accuracy = 100, @@ -6400,7 +6400,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_SACRED_SWORD - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 90, .type = TYPE_FIGHTING, .accuracy = 100, @@ -6412,7 +6412,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_RAZOR_SHELL - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_DEFENSE_DOWN_HIT, .power = 75, .type = TYPE_WATER, .accuracy = 95, @@ -6424,7 +6424,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_HEAT_CRASH - .effect = EFFECT_HEAT_CRASH, + .effect = EFFECT_HEAT_CRASH, // Needs a custom move effect (maybe the same as heavy slam?) .power = 1, .type = TYPE_FIRE, .accuracy = 100, @@ -6436,7 +6436,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_LEAF_TORNADO - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_ACCURACY_DOWN_HIT, .power = 65, .type = TYPE_GRASS, .accuracy = 90, @@ -6448,7 +6448,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_STEAMROLLER - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 65, .type = TYPE_BUG, .accuracy = 100, @@ -6460,7 +6460,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_COTTON_GUARD - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_GRASS, .accuracy = 0, @@ -6472,7 +6472,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_NIGHT_DAZE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_ACCURACY_DOWN_HIT, .power = 85, .type = TYPE_DARK, .accuracy = 95, @@ -6484,7 +6484,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_PSYSTRIKE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PSYSHOCK, .power = 100, .type = TYPE_PSYCHIC, .accuracy = 100, @@ -6496,7 +6496,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_TAIL_SLAP - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (different percentages for hitting compared to doubleslap) .power = 25, .type = TYPE_NORMAL, .accuracy = 85, @@ -6508,7 +6508,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_HURRICANE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 110, .type = TYPE_FLYING, .accuracy = 70, @@ -6520,7 +6520,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_HEAD_CHARGE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (same as WILD_CHARGE) .power = 120, .type = TYPE_NORMAL, .accuracy = 100, @@ -6532,7 +6532,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_GEAR_GRIND - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_DOUBLE_HIT, .power = 50, .type = TYPE_STEEL, .accuracy = 85, @@ -6544,7 +6544,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_SEARING_SHOT - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (30% burn, does not affect opponents with BULLETPROOF) .power = 100, .type = TYPE_FIRE, .accuracy = 100, @@ -6556,7 +6556,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_TECHNO_BLAST - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 120, .type = TYPE_NORMAL, .accuracy = 100, @@ -6568,7 +6568,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_RELIC_SONG - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_SLEEP, .power = 75, .type = TYPE_NORMAL, .accuracy = 100, @@ -6580,7 +6580,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_SECRET_SWORD - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PSYSHOCK, .power = 85, .type = TYPE_FIGHTING, .accuracy = 100, @@ -6592,7 +6592,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_GLACIATE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_SPEED_DOWN_HIT, .power = 65, .type = TYPE_ICE, .accuracy = 95, @@ -6604,7 +6604,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_BOLT_STRIKE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PARALYZE_HIT, .power = 130, .type = TYPE_ELECTRIC, .accuracy = 85, @@ -6616,7 +6616,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_BLUE_FLARE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_BURN_HIT, .power = 130, .type = TYPE_FIRE, .accuracy = 85, @@ -6628,7 +6628,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_FIERY_DANCE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_SPECIAL_ATTACK_UP, .power = 80, .type = TYPE_FIRE, .accuracy = 100, @@ -6640,7 +6640,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_FREEZE_SHOCK - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 140, .type = TYPE_ICE, .accuracy = 90, @@ -6652,7 +6652,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_ICE_BURN - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 140, .type = TYPE_ICE, .accuracy = 90, @@ -6664,7 +6664,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_SNARL - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_SPECIAL_ATTACK_DOWN_HIT, .power = 55, .type = TYPE_DARK, .accuracy = 95, @@ -6676,7 +6676,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_ICICLE_CRASH - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_FLINCH_HIT, .power = 85, .type = TYPE_ICE, .accuracy = 90, @@ -6688,7 +6688,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_V_CREATE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 180, .type = TYPE_FIRE, .accuracy = 95, @@ -6700,7 +6700,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_FUSION_FLARE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 100, .type = TYPE_FIRE, .accuracy = 100, @@ -6712,7 +6712,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_FUSION_BOLT - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 100, .type = TYPE_ELECTRIC, .accuracy = 100, @@ -6724,7 +6724,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_FLYING_PRESS - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 100, .type = TYPE_FIGHTING, .accuracy = 95, @@ -6736,7 +6736,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_MAT_BLOCK - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_FIGHTING, .accuracy = 0, @@ -6748,7 +6748,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_BELCH - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 120, .type = TYPE_POISON, .accuracy = 90, @@ -6760,7 +6760,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_ROTOTILLER - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_GROUND, .accuracy = 0, @@ -6772,7 +6772,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_STICKY_WEB - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_BUG, .accuracy = 0, @@ -6808,7 +6808,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_TRICK_OR_TREAT - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_GHOST, .accuracy = 100, @@ -6820,7 +6820,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_NOBLE_ROAR - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 100, @@ -6832,7 +6832,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_ION_DELUGE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_ELECTRIC, .accuracy = 0, @@ -6844,7 +6844,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_PARABOLIC_CHARGE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_ABSORB, .power = 65, .type = TYPE_ELECTRIC, .accuracy = 100, @@ -6856,7 +6856,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_FOREST_S_CURSE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_GRASS, .accuracy = 100, @@ -6868,7 +6868,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_PETAL_BLIZZARD - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HIT, .power = 90, .type = TYPE_GRASS, .accuracy = 100, @@ -6880,7 +6880,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_FREEZE_DRY - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 70, .type = TYPE_ICE, .accuracy = 100, @@ -6892,7 +6892,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_DISARMING_VOICE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 40, .type = TYPE_FAIRY, .accuracy = 0, @@ -6904,7 +6904,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_PARTING_SHOT - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_DARK, .accuracy = 100, @@ -6916,7 +6916,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_TOPSY_TURVY - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_DARK, .accuracy = 0, @@ -6928,7 +6928,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_DRAINING_KISS - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (restores 75% HP instead of 50% HP) .power = 50, .type = TYPE_FAIRY, .accuracy = 100, @@ -6940,7 +6940,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_CRAFTY_SHIELD - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_FAIRY, .accuracy = 0, @@ -6952,7 +6952,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_FLOWER_SHIELD - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_FAIRY, .accuracy = 0, @@ -6964,7 +6964,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_GRASSY_TERRAIN - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_GRASS, .accuracy = 0, @@ -6976,7 +6976,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_MISTY_TERRAIN - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_FAIRY, .accuracy = 0, @@ -6988,7 +6988,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_ELECTRIFY - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_ELECTRIC, .accuracy = 0, @@ -7000,7 +7000,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_PLAY_ROUGH - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_ATTACK_DOWN_HIT, .power = 90, .type = TYPE_FAIRY, .accuracy = 90, @@ -7012,7 +7012,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_FAIRY_WIND - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HIT, .power = 40, .type = TYPE_FAIRY, .accuracy = 100, @@ -7024,7 +7024,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_MOONBLAST - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_SPECIAL_ATTACK_DOWN_HIT, .power = 95, .type = TYPE_FAIRY, .accuracy = 100, @@ -7036,7 +7036,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_BOOMBURST - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (Doesn't affect pokemon with SOUNDPROOF) .power = 140, .type = TYPE_NORMAL, .accuracy = 100, @@ -7048,7 +7048,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_FAIRY_LOCK - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_FAIRY, .accuracy = 0, @@ -7060,7 +7060,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_KING_S_SHIELD - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect, as it changes Aegislash's form .power = 0, .type = TYPE_STEEL, .accuracy = 0, @@ -7072,7 +7072,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_PLAY_NICE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -7084,7 +7084,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_CONFIDE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -7096,7 +7096,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_DIAMOND_STORM - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 100, .type = TYPE_ROCK, .accuracy = 95, @@ -7108,7 +7108,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_STEAM_ERUPTION - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (Same as SCALD) .power = 110, .type = TYPE_WATER, .accuracy = 95, @@ -7120,7 +7120,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_HYPERSPACE_HOLE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (Same as SCALD) .power = 80, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -7132,7 +7132,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_WATER_SHURIKEN - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (Same with tail slap, HOWEVER If Battle Bond is activated, Water Shuriken's power rises from 15 to 20, and it always hits three times, giving it an average power of 60) .power = 15, .type = TYPE_WATER, .accuracy = 100, @@ -7144,7 +7144,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_MYSTICAL_FIRE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_SPECIAL_ATTACK_DOWN_HIT, .power = 75, .type = TYPE_FIRE, .accuracy = 100, @@ -7156,7 +7156,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_SPIKY_SHIELD - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_GRASS, .accuracy = 0, @@ -7168,7 +7168,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_AROMATIC_MIST - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_FAIRY, .accuracy = 0, @@ -7180,7 +7180,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_EERIE_IMPULSE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (Lowers TARGET's (not user's) special attack by 2 stages) .power = 0, .type = TYPE_ELECTRIC, .accuracy = 100, @@ -7192,7 +7192,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_VENOM_DRENCH - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_POISON, .accuracy = 100, @@ -7204,7 +7204,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_POWDER - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_BUG, .accuracy = 100, @@ -7216,7 +7216,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_GEOMANCY - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_FAIRY, .accuracy = 0, @@ -7228,7 +7228,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_MAGNETIC_FLUX - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_ELECTRIC, .accuracy = 0, @@ -7240,7 +7240,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_HAPPY_HOUR - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -7252,7 +7252,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_ELECTRIC_TERRAIN - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_ELECTRIC, .accuracy = 0, @@ -7264,7 +7264,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_DAZZLING_GLEAM - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_FAIRY, .accuracy = 100, @@ -7276,7 +7276,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_CELEBRATE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -7288,7 +7288,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_HOLD_HANDS - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -7300,7 +7300,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_BABY_DOLL_EYES - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_ATTACK_DOWN, .power = 0, .type = TYPE_FAIRY, .accuracy = 100, @@ -7312,7 +7312,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_NUZZLE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PARALYZE_HIT, .power = 20, .type = TYPE_ELECTRIC, .accuracy = 100, @@ -7324,7 +7324,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_HOLD_BACK - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_FALSE_SWIPE, .power = 40, .type = TYPE_NORMAL, .accuracy = 100, @@ -7336,7 +7336,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_INFESTATION - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 20, .type = TYPE_BUG, .accuracy = 100, @@ -7348,7 +7348,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_POWER_UP_PUNCH - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_ATTACK_UP_HIT, .power = 40, .type = TYPE_FIGHTING, .accuracy = 100, @@ -7360,7 +7360,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_OBLIVION_WING - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (Restores 75% of damage dealt back to user) .power = 80, .type = TYPE_FLYING, .accuracy = 100, @@ -7372,7 +7372,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_THOUSAND_ARROWS - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 90, .type = TYPE_GROUND, .accuracy = 100, @@ -7384,7 +7384,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_THOUSAND_WAVES - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (not sure if this is like Mean Look lol, might be) .power = 90, .type = TYPE_GROUND, .accuracy = 100, @@ -7396,7 +7396,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_LAND_S_WRATH - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HIT, .power = 90, .type = TYPE_GROUND, .accuracy = 100, @@ -7408,7 +7408,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_LIGHT_OF_RUIN - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (same as HEAD_SMASH) .power = 140, .type = TYPE_FAIRY, .accuracy = 90, @@ -7420,7 +7420,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_ORIGIN_PULSE - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HIT, .power = 110, .type = TYPE_WATER, .accuracy = 85, @@ -7432,7 +7432,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_PRECIPICE_BLADES - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_HIT, .power = 120, .type = TYPE_GROUND, .accuracy = 85, @@ -7444,7 +7444,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_DRAGON_ASCENT - .effect = EFFECT_PLACEHOLDER_209, + .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect .power = 120, .type = TYPE_FLYING, .accuracy = 100, From d24ab9daaccf33c919f389adcbe99a1ea89c758c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 29 Jul 2018 21:44:35 +0200 Subject: [PATCH 073/667] Little move table fixes --- include/data/battle_moves.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index 66c47a5798..731d14f269 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -5212,7 +5212,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_DRACO_METEOR - .effect = EFFECT_SPECIAL_ATTACK_DOWN_2, + .effect = EFFECT_OVERHEAT, .power = 130, .type = TYPE_DRAGON, .accuracy = 90, @@ -5248,7 +5248,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_LEAF_STORM - .effect = EFFECT_SPECIAL_ATTACK_DOWN_2, + .effect = EFFECT_OVERHEAT, .power = 130, .type = TYPE_GRASS, .accuracy = 90, @@ -5344,7 +5344,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_CAPTIVATE - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_CAPTIVATE, .power = 0, .type = TYPE_NORMAL, .accuracy = 100, @@ -5980,7 +5980,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_CHIP_AWAY - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_HIT .power = 70, .type = TYPE_NORMAL, .accuracy = 100, @@ -5988,7 +5988,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_STAT_STAGES_IGNORED, .split = SPLIT_PHYSICAL, }, { // MOVE_CLEAR_SMOG @@ -6400,7 +6400,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_SACRED_SWORD - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_HIT, .power = 90, .type = TYPE_FIGHTING, .accuracy = 100, @@ -6408,7 +6408,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_STAT_STAGES_IGNORED, .split = SPLIT_PHYSICAL, }, { // MOVE_RAZOR_SHELL @@ -7180,7 +7180,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_EERIE_IMPULSE - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (Lowers TARGET's (not user's) special attack by 2 stages) + .effect = EFFECT_SPECIAL_ATTACK_DOWN_2, .power = 0, .type = TYPE_ELECTRIC, .accuracy = 100, From 44a454ecb418f49452b59c3f7ad7654553d4df8b Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 30 Jul 2018 20:41:16 +0200 Subject: [PATCH 074/667] Moves with accuracy 0 bypass accuracy checks; Heal Block move effect done --- asm/macros/battle_script.inc | 3 ++- data/battle_scripts_1.s | 17 +++++++++++++--- include/constants/battle_move_effects.h | 2 +- include/constants/battle_script_commands.h | 1 - include/data/battle_moves.h | 20 +++++++++---------- src/battle_message.c | 4 ++-- src/battle_script_commands.c | 23 +++++++++++++++------- 7 files changed, 45 insertions(+), 25 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 0285b0f323..dd4deaad79 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -401,8 +401,9 @@ .byte \param1 .endm - .macro nop_4A + .macro sethealblock ptr .byte 0x4a + .4byte \ptr .endm .macro returnatktoball diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index a5b43daf87..e4a5d2ee9a 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -57,7 +57,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectSuperFang .4byte BattleScript_EffectDragonRage .4byte BattleScript_EffectTrap - .4byte BattleScript_EffectPlaceholder43 + .4byte BattleScript_EffectHealBlock .4byte BattleScript_EffectDoubleHit .4byte BattleScript_EffectRecoilIfMiss .4byte BattleScript_EffectMist @@ -540,6 +540,18 @@ BattleScript_CaptivateCheckAcc: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE goto BattleScript_StatDownFromAttackString +BattleScript_EffectHealBlock: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + sethealblock BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_PKMNPREVENTEDFROMHEALING + waitmessage 0x40 + goto BattleScript_MoveEnd + BattleScript_EffectHitEscape: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -583,7 +595,6 @@ BattleScript_HitEscapeEnd: end BattleScript_EffectAlwaysHit: -BattleScript_EffectPlaceholder43: BattleScript_EffectEvasionDownHit: BattleScript_EffectVitalThrow: BattleScript_EffectUnused60: @@ -1875,7 +1886,7 @@ 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 attackanimation diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 329cd0a999..4c94337abf 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -44,7 +44,7 @@ #define EFFECT_SUPER_FANG 40 #define EFFECT_DRAGON_RAGE 41 #define EFFECT_TRAP 42 -#define EFFECT_PLACEHOLDER_43 43 +#define EFFECT_HEAL_BLOCK 43 #define EFFECT_DOUBLE_HIT 44 #define EFFECT_RECOIL_IF_MISS 45 #define EFFECT_MIST 46 diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index fdf68fba60..98964c3bf0 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -47,7 +47,6 @@ #define BS_OPPONENT2 14 // atk 01, accuracy calc -#define NO_ACC_CALC 0xFFFE #define NO_ACC_CALC_CHECK_LOCK_ON 0xFFFF #define ACC_CURR_MOVE 0 diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index 731d14f269..78cd16fe68 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -4528,7 +4528,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_HEAL_BLOCK - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_HEAL_BLOCK, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 100, @@ -5812,7 +5812,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_HEAVY_SLAM - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_HEAT_CRASH, .power = 1, .type = TYPE_STEEL, .accuracy = 100, @@ -5980,7 +5980,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_CHIP_AWAY - .effect = EFFECT_HIT + .effect = EFFECT_HIT, .power = 70, .type = TYPE_NORMAL, .accuracy = 100, @@ -6220,7 +6220,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_WATER_PLEDGE - .effect = EFFECT_PLEDGE + .effect = EFFECT_PLEDGE, .power = 80, .type = TYPE_WATER, .accuracy = 100, @@ -6232,7 +6232,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_FIRE_PLEDGE - .effect = EFFECT_PLEDGE + .effect = EFFECT_PLEDGE, .power = 80, .type = TYPE_FIRE, .accuracy = 100, @@ -6244,7 +6244,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_GRASS_PLEDGE - .effect = EFFECT_PLEDGE + .effect = EFFECT_PLEDGE, .power = 80, .type = TYPE_GRASS, .accuracy = 100, @@ -6448,7 +6448,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_STEAMROLLER - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_FLINCH_MINIMIZE_HIT, .power = 65, .type = TYPE_BUG, .accuracy = 100, @@ -6496,7 +6496,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_TAIL_SLAP - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (different percentages for hitting compared to doubleslap) + .effect = EFFECT_MULTI_HIT, .power = 25, .type = TYPE_NORMAL, .accuracy = 85, @@ -7036,7 +7036,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_BOOMBURST - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (Doesn't affect pokemon with SOUNDPROOF) + .effect = EFFECT_HIT, .power = 140, .type = TYPE_NORMAL, .accuracy = 100, @@ -7084,7 +7084,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_CONFIDE - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_SPECIAL_ATTACK_DOWN, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, diff --git a/src/battle_message.c b/src/battle_message.c index a04f904044..d64b0dba1a 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -575,8 +575,8 @@ static const u8 sText_ReflectTargetsType[] =_("{B_ATK_NAME_WITH_PREFIX}’s type static const u8 sText_TransferHeldItem[] =_("{B_DEF_NAME_WITH_PREFIX} recieved {B_LAST_ITEM}\nfrom {B_ATK_NAME_WITH_PREFIX}"); static const u8 sText_EmbargoEnds[] = _("{B_DEF_NAME_WITH_PREFIX}can\nuse items again!"); static const u8 sText_MagnetRiseEnds[] = _("{B_ATK_NAME_WITH_PREFIX}’s electromagnetism\nwore off!"); -static const u8 sText_HealBlockEnds[] = _("{B_DEF_NAME_WITH_PREFIX}’s Heal Block\nwore off!"); -static const u8 sText_TelekinesisEnds[] = _("{B_DEF_NAME_WITH_PREFIX} was freed\nfrom the telekinesis!"); +static const u8 sText_HealBlockEnds[] = _("{B_ATK_NAME_WITH_PREFIX}’s Heal Block\nwore off!"); +static const u8 sText_TelekinesisEnds[] = _("{B_ATK_NAME_WITH_PREFIX} was freed\nfrom the telekinesis!"); static const u8 sText_TailwindEnds[] = _("{B_ATK_TEAM}’s tailwind\n petered out!"); static const u8 sText_LuckyChantEnds[] = _("{B_ATK_TEAM}’s Lucky Chant\n wore off!"); static const u8 sText_TrickRoomEnds[] = _("The twisted dimensions returned to\nnormal!"); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b7f7d55b68..1aef220a79 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -166,7 +166,7 @@ static void atk46_playanimation2(void); static void atk47_setgraphicalstatchangevalues(void); static void atk48_playstatchangeanimation(void); static void atk49_moveend(void); -static void atk4A_nop(void); +static void atk4A_sethealblock(void); static void atk4B_returnatktoball(void); static void atk4C_getswitchedmondata(void); static void atk4D_switchindataupdate(void); @@ -424,7 +424,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atk47_setgraphicalstatchangevalues, atk48_playstatchangeanimation, atk49_moveend, - atk4A_nop, + atk4A_sethealblock, atk4B_returnatktoball, atk4C_getswitchedmondata, atk4D_switchindataupdate, @@ -1150,11 +1150,11 @@ static void atk01_accuracycheck(void) { u16 move = T2_READ_16(gBattlescriptCurrInstr + 5); - if (move == 0xFFFE || move == 0xFFFF) + if (move == NO_ACC_CALC_CHECK_LOCK_ON || gBattleMoves[move].accuracy == 0) { - if (gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS && move == 0xFFFF && 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; @@ -4356,9 +4356,18 @@ static void atk49_moveend(void) gBattlescriptCurrInstr += 3; } -static void atk4A_nop(void) +static void atk4A_sethealblock(void) { - gBattlescriptCurrInstr++; + if (gStatuses3[gBattlerTarget] & STATUS3_HEAL_BLOCK) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + } + else + { + gStatuses3[gBattlerTarget] |= STATUS3_HEAL_BLOCK; + gDisableStructs[gBattlerTarget].healBlockTimer = 5; + gBattlescriptCurrInstr += 5; + } } static void atk4B_returnatktoball(void) From 991e0411816b764422845adb0f8afda82642e905 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 31 Jul 2018 22:21:43 +0200 Subject: [PATCH 075/667] Add more AI scripts to debug menu --- src/battle_debug.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/battle_debug.c b/src/battle_debug.c index 9653d64dca..0685ae57cb 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -195,6 +195,10 @@ 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_EmptyString[] = _(""); @@ -269,6 +273,10 @@ static const struct BitfieldInfo sAIBitfield[] = {/*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}, }; @@ -302,6 +310,10 @@ static const struct ListMenuItem sAIListItems[] = {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[] = From b73075f822cfec02b34dcfb1da24591d4ff8bf6b Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 31 Jul 2018 23:09:47 +0200 Subject: [PATCH 076/667] Update Unusable Moves --- data/battle_scripts_1.s | 30 ++++++ include/battle_scripts.h | 7 ++ include/constants/battle_string_ids.h | 5 +- include/constants/hold_effects.h | 2 + src/battle_message.c | 9 ++ src/battle_script_commands.c | 7 +- src/battle_util.c | 137 +++++++++++++++++++++----- 7 files changed, 167 insertions(+), 30 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e4a5d2ee9a..adcfcd3d78 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4082,6 +4082,32 @@ BattleScript_MoveUsedIsTaunted:: BattleScript_SelectingNotAllowedMoveTauntInPalace:: printstring STRINGID_PKMNCANTUSEMOVETAUNT goto BattleScript_SelectingUnusableMoveInPalace + +BattleScript_SelectingNotAllowedMoveGravity:: + printselectionstring STRINGID_GRAVITYPREVENTSUSAGE + endselectionscript + +BattleScript_MoveUsedGravityPrevents:: + printstring STRINGID_GRAVITYPREVENTSUSAGE + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_SelectingNotAllowedMoveGravityInPalace:: + printstring STRINGID_GRAVITYPREVENTSUSAGE + goto BattleScript_SelectingUnusableMoveInPalace + +BattleScript_SelectingNotAllowedMoveHealBlock:: + printselectionstring STRINGID_GRAVITYPREVENTSUSAGE + endselectionscript + +BattleScript_MoveUsedHealBlockPrevents:: + printstring STRINGID_GRAVITYPREVENTSUSAGE + waitmessage 0x40 + goto BattleScript_MoveEnd + +BattleScript_SelectingNotAllowedMoveHealBlockInPalace:: + printstring STRINGID_GRAVITYPREVENTSUSAGE + goto BattleScript_SelectingUnusableMoveInPalace BattleScript_WishComesTrue:: trywish 0x1, BattleScript_WishButFullHp @@ -5086,6 +5112,10 @@ BattleScript_ItemHealHP_Ret:: BattleScript_SelectingNotAllowedMoveChoiceItem:: printselectionstring STRINGID_ITEMALLOWSONLYYMOVE endselectionscript + +BattleScript_SelectingNotAllowedMoveAssaultVest:: + printselectionstring STRINGID_ASSAULTVESTDOESNTALLOW + endselectionscript BattleScript_HangedOnMsg:: playanimation BS_TARGET, B_ANIM_HANGED_ON, NULL diff --git a/include/battle_scripts.h b/include/battle_scripts.h index c3ef0bfaf6..274af5caef 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -325,5 +325,12 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 008d622adb..a04fe449e0 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -486,7 +486,10 @@ #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 BATTLESTRINGS_COUNT 496 +#define BATTLESTRINGS_COUNT 501 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index e788e71472..b2c9fc9e8c 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -113,4 +113,6 @@ // Gen7 hold effects #define HOLD_EFFECT_PROTECTIVE_PADS 150 +#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/src/battle_message.c b/src/battle_message.c index d64b0dba1a..d0eca7bcc7 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -628,6 +628,12 @@ static const u8 sText_TargetStatWontGoHigher[] = _("{B_DEF_NAME_WITH_PREFIX}’s 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}!"); +// New selection strings, they must end with "\p". +// Use {B_LAST_ITEM} and {B_CURRENT_MOVE}. +static const u8 sText_AssaultVestDoesntAllow[] = _("\p"); +static const u8 sText_GravityPreventsUsage[] = _("\p"); +static const u8 sText_HealBlockPreventsUsage[] = _("\p"); + const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { sText_Trainer1LoseText, // 12 @@ -1105,6 +1111,9 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_TargetStatWontGoHigher, sText_PkmnMoveBouncedViaAbility, sText_ImposterTransform, + sText_AssaultVestDoesntAllow, + sText_GravityPreventsUsage, + sText_HealBlockPreventsUsage, }; const u16 gMagicCoatBounceStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1aef220a79..2845ed1774 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4146,7 +4146,7 @@ static void atk49_moveend(void) gBattleScripting.atk49_state++; break; case 6: // update choice band move - if (!(gHitMarker & HITMARKER_OBEYS) || holdEffectAtk != HOLD_EFFECT_CHOICE_BAND + if (!(gHitMarker & HITMARKER_OBEYS) || !HOLD_EFFECT_CHOICE(holdEffectAtk) || gChosenMove == MOVE_STRUGGLE || (*choicedMoveAtk != 0 && *choicedMoveAtk != 0xFFFF)) goto LOOP; if ((gBattleMoves[gChosenMove].effect == EFFECT_BATON_PASS @@ -7483,7 +7483,9 @@ static void atk96_weatherdamage(void) { if (ability == ABILITY_ICE_BODY && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERGROUND) - && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER)) + && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER) + && !BATTLER_MAX_HP(gBattlerAttacker) + && !gStatuses3[gBattlerAttacker] & STATUS3_HEAL_BLOCK) { gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16; if (gBattleMoveDamage == 0) @@ -7493,6 +7495,7 @@ static void atk96_weatherdamage(void) else if (!IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ICE) && ability != ABILITY_SNOW_CLOAK && ability != ABILITY_OVERCOAT + && ability != ABILITY_ICE_BODY && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERGROUND) && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER)) { diff --git a/src/battle_util.c b/src/battle_util.c index 005b33d949..d6ddc04457 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -561,11 +561,54 @@ 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(u8 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: + return TRUE; + default: + return FALSE; + } +} + u8 TrySetCantSelectMoveBattleScript(void) { u8 limitations = 0; - u16 move = gBattleMons[gActiveBattler].moves[gBattleBufferB[gActiveBattler][2]]; - u8 holdEffect; + u32 move = gBattleMons[gActiveBattler].moves[gBattleBufferB[gActiveBattler][2]]; + u32 holdEffect = GetBattlerHoldEffect(gActiveBattler, TRUE); u16* choicedMove = &gBattleStruct->choicedMove[gActiveBattler]; if (gDisableStructs[gActiveBattler].disabledMove == move && move != 0) @@ -580,7 +623,7 @@ u8 TrySetCantSelectMoveBattleScript(void) else { gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingDisabledMove; - limitations = 1; + limitations++; } } @@ -629,14 +672,38 @@ 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].flag_x10 = 1; + } + else + { + gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveGravity; + limitations++; + } + } + + if (IsHealBlockPreventingMove(gActiveBattler, move)) + { + gCurrentMove = move; + if (gBattleTypeFlags & BATTLE_TYPE_PALACE) + { + gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveHealBlockInPalace; + gProtectStructs[gActiveBattler].flag_x10 = 1; + } + else + { + gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveHealBlock; + 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; @@ -650,6 +717,20 @@ 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].flag_x10 = 1; + } + else + { + gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveAssaultVest; + limitations++; + } + } if (gBattleMons[gActiveBattler].pp[gBattleBufferB[gActiveBattler][2]] == 0) { @@ -669,34 +750,35 @@ 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_BATTLERS_COUNT; i++) + for (i = 0; i < 4; 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].tauntTimer1 && check & MOVE_LIMITATION_TAUNT && gBattleMoves[gBattleMons[battlerId].moves[i]].power == 0) + else if (gDisableStructs[battlerId].tauntTimer1 && check & MOVE_LIMITATION_TAUNT && gBattleMoves[gBattleMons[battlerId].moves[i]].power == 0) unusableMoves |= gBitTable[i]; - if (GetImprisonedMovesCount(battlerId, gBattleMons[battlerId].moves[i]) && check & MOVE_LIMITATION_IMPRISION) + else if (GetImprisonedMovesCount(battlerId, gBattleMons[battlerId].moves[i]) && check & MOVE_LIMITATION_IMPRISION) unusableMoves |= gBitTable[i]; - if (gDisableStructs[battlerId].encoreTimer1 && gDisableStructs[battlerId].encoredMove != gBattleMons[battlerId].moves[i]) + else if (gDisableStructs[battlerId].encoreTimer1 && 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]; } return unusableMoves; @@ -1304,7 +1386,7 @@ u8 DoBattlerEndTurnEffects(void) { if (ability == ABILITY_POISON_HEAL) { - if (!BATTLER_MAX_HP(gActiveBattler)) + if (!BATTLER_MAX_HP(gActiveBattler) && !(gStatuses3[gActiveBattler] & STATUS3_HEAL_BLOCK)) { gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; if (gBattleMoveDamage == 0) @@ -1332,7 +1414,7 @@ u8 DoBattlerEndTurnEffects(void) { if (ability == ABILITY_POISON_HEAL) { - if (!BATTLER_MAX_HP(gActiveBattler)) + if (!BATTLER_MAX_HP(gActiveBattler) && !(gStatuses3[gActiveBattler] & STATUS3_HEAL_BLOCK)) { gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; if (gBattleMoveDamage == 0) @@ -2617,7 +2699,8 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA case ABILITY_RAIN_DISH: if (WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_RAIN_ANY) - && gBattleMons[battler].maxHP > gBattleMons[battler].hp) + && !BATTLER_MAX_HP(battler) + && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) { BattleScriptPushCursorAndCallback(BattleScript_RainDishActivates); gBattleMoveDamage = gBattleMons[battler].maxHP / 16; @@ -2770,7 +2853,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } if (effect == 1) // Drain Hp ability. { - if (gBattleMons[battler].maxHP == gBattleMons[battler].hp) + if (BATTLER_MAX_HP(battler) || gStatuses3[battler] & STATUS3_HEAL_BLOCK) { if ((gProtectStructs[gBattlerAttacker].notFirstStrike)) gBattlescriptCurrInstr = BattleScript_MonMadeMoveUseless; From 0f29610a61a6af9b8fc5fae849231b61619b7dfb Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 31 Jul 2018 23:21:42 +0200 Subject: [PATCH 077/667] Flying type pokemon can take ground type moves damage if grounded --- src/battle_util.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/battle_util.c b/src/battle_util.c index d6ddc04457..77923db9dd 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5380,6 +5380,8 @@ static inline void MulByTypeEffectiveness(u16 *modifier, u16 move, u8 moveType, mod = UQ_4_12(1.0); if (move == MOVE_FREEZE_DRY && defType == TYPE_WATER) mod = UQ_4_12(2.0); + if (moveType == TYPE_GROUND && defType == TYPE_FLYING && IsBattlerGrounded(battlerDef)) + mod = UQ_4_12(1.0); MulModifier(modifier, mod); } From a62bd511c85dcc18118700843a5db20ed0ae68a0 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 1 Aug 2018 22:01:37 +0200 Subject: [PATCH 078/667] Fix opponent hp bar issue --- src/battle_interface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_interface.c b/src/battle_interface.c index e8c9fad912..a7c0b884ef 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -1223,7 +1223,7 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent) { UpdateHpTextInHealthboxInDoubles(healthboxSpriteId, value, maxOrCurrent); } - else + else if (gBattleSpritesDataPtr->battlerData[battler].hpNumbersNoBars) // don't print text if only bars are visible { u32 var; u8 i; From 4c3de6f58ae210ae94fad1a8439335a6a8c519ec Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 1 Aug 2018 22:39:42 +0200 Subject: [PATCH 079/667] Fix moves always hitting --- src/battle_script_commands.c | 86 +++--------------------------------- 1 file changed, 5 insertions(+), 81 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 2845ed1774..2ebf51df29 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -79,7 +79,6 @@ extern u16 get_unknown_box_id(void); 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 bool32 IsMonGettingExpSentOut(void); static void sub_804F17C(void); @@ -1150,6 +1149,9 @@ static void atk01_accuracycheck(void) { u16 move = T2_READ_16(gBattlescriptCurrInstr + 5); + if (move == ACC_CURR_MOVE) + move = gCurrentMove; + if (move == NO_ACC_CALC_CHECK_LOCK_ON || gBattleMoves[move].accuracy == 0) { if (gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker) @@ -1165,9 +1167,6 @@ static void atk01_accuracycheck(void) s8 buff, accStage, evasionStage; u32 calc; - if (move == 0) - move = gCurrentMove; - GET_MOVE_TYPE(move, type); if (JumpIfMoveAffectedByProtect(move)) @@ -1250,7 +1249,7 @@ static void atk01_accuracycheck(void) else gBattleCommunication[6] = 0; - CheckWonderGuardAndLevitate(); + CalcTypeEffectivenessMultiplier(move, type, gBattlerAttacker, gBattlerTarget, TRUE); } JumpIfMoveFailed(7, move); } @@ -1404,81 +1403,6 @@ static void atk06_typecalc(void) 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 atk07_adjustdamage(void) { u8 holdEffect, param; @@ -1812,7 +1736,7 @@ static void atk0E_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_KOUKA_H); From 5e27cd53a90e75eafc148c90af3a59ad1b9cc2d7 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 1 Aug 2018 23:14:02 +0200 Subject: [PATCH 080/667] Add Substitute handler to debug --- src/battle_debug.c | 26 ++++++++++++++++++++++++++ src/battle_script_commands.c | 6 +----- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/battle_debug.c b/src/battle_debug.c index 0685ae57cb..94a5ec8ae6 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -106,6 +106,7 @@ enum VAL_BITFIELD_32, VAR_SIDE_STATUS, VAR_SHOW_HP, + VAR_SUBSTITUTE, }; enum @@ -126,6 +127,7 @@ enum enum { VARIOUS_SHOW_HP, + VARIOUS_SUBSTITUTE_HP, }; // const rom data @@ -153,6 +155,7 @@ 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"); @@ -300,6 +303,7 @@ static const struct ListMenuItem sMainListItems[] = static const struct ListMenuItem sVariousListItems[] = { {sText_ShowHP, VARIOUS_SHOW_HP}, + {sText_SubstituteHp, VARIOUS_SUBSTITUTE_HP}, }; static const struct ListMenuItem sAIListItems[] = @@ -1058,6 +1062,19 @@ static void UpdateBattlerValue(struct BattleDebugMenu *data) 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; } data->battlerWasChanged[data->battlerId] = TRUE; } @@ -1310,6 +1327,15 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) 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; + } break; case LIST_ITEM_STATUS1: data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].status1; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 2ebf51df29..b42298da59 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7682,11 +7682,7 @@ static void atk9E_metronome(void) { s32 i; - gCurrentMove = (Random() & 0x1FF) + 1; - if (gCurrentMove >= MOVES_COUNT) - continue; - - for (i = 0; i < 4; i++); // ? + gCurrentMove = (Random() % MOVES_COUNT) + 1; i = -1; while (1) From 198a1a8646dc4b6218bcf2e738213490fcef5ca0 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 2 Aug 2018 20:24:18 +0200 Subject: [PATCH 081/667] Proper Sound moves and substitute --- asm/macros/battle_script.inc | 3 ++- data/battle_scripts_1.s | 44 +++++++++++++++---------------- include/battle_script_commands.h | 1 + include/constants/battle_config.h | 1 + include/constants/pokemon.h | 1 + include/data/battle_moves.h | 44 +++++++++++++++---------------- src/battle_script_commands.c | 35 +++++++++++++++++------- src/battle_util.c | 25 +++++------------- 8 files changed, 79 insertions(+), 75 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index dd4deaad79..e879dfd056 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1149,8 +1149,9 @@ .4byte \param0 .endm - .macro nop_E9 + .macro jumpifsubstituteblocks ptr .byte 0xe9 + .4byte \ptr .endm .macro tryrecycleitem param0 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index adcfcd3d78..fb4b6c824a 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -533,7 +533,7 @@ BattleScript_EffectRoost: BattleScript_EffectCaptivate: setstatchanger STAT_SPATK, 2, TRUE attackcanceler - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailedAtkStringPpReduce + jumpifsubstituteblocks BattleScript_ButItFailedAtkStringPpReduce jumpifoppositegenders BattleScript_CaptivateCheckAcc goto BattleScript_ButItFailedAtkStringPpReduce BattleScript_CaptivateCheckAcc: @@ -686,7 +686,7 @@ 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 jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed @@ -825,7 +825,7 @@ BattleScript_82D8BEA:: BattleScript_EffectDreamEater:: attackcanceler - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_82D8C0E + jumpifsubstituteblocks BattleScript_82D8C0E jumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_82D8C18 BattleScript_82D8C0E:: attackstring @@ -953,7 +953,7 @@ BattleScript_EffectEvasionDown: setstatchanger STAT_EVASION, 1, TRUE BattleScript_EffectStatDown: attackcanceler - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailedAtkStringPpReduce + jumpifsubstituteblocks BattleScript_ButItFailedAtkStringPpReduce accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE BattleScript_StatDownFromAttackString: attackstring @@ -1112,7 +1112,7 @@ BattleScript_EffectToxic:: attackstring ppreduce jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + jumpifsubstituteblocks BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_POISON, BattleScript_AlreadyPoisoned jumpifstatus BS_TARGET, STATUS1_TOXIC_POISON, BattleScript_AlreadyPoisoned jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed @@ -1328,7 +1328,7 @@ BattleScript_EffectConfuse: 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 @@ -1431,7 +1431,7 @@ BattleScript_EffectPoison:: attackstring ppreduce jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + 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 @@ -1452,7 +1452,7 @@ BattleScript_EffectParalyze:: attackstring ppreduce jumpifability BS_TARGET, ABILITY_LIMBER, BattleScript_LimberProtected - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + jumpifsubstituteblocks BattleScript_ButItFailed typecalc jumpifmovehadnoeffect BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_PARALYSIS, BattleScript_AlreadyParalyzed @@ -1579,7 +1579,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 @@ -1603,7 +1603,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 @@ -1732,7 +1732,7 @@ BattleScript_EffectLockOn:: attackcanceler attackstring ppreduce - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed + jumpifsubstituteblocks BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE setalwayshitflag attackanimation @@ -1745,7 +1745,6 @@ BattleScript_EffectSketch:: attackcanceler attackstring ppreduce - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_ButItFailed copymovepermanently BattleScript_ButItFailed attackanimation waitanimation @@ -1888,7 +1887,7 @@ BattleScript_EffectMeanLook:: ppreduce 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 @@ -1901,7 +1900,7 @@ 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 goto BattleScript_ButItFailed @@ -1956,7 +1955,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 @@ -2049,7 +2047,7 @@ BattleScript_RolloutHit:: BattleScript_EffectSwagger:: attackcanceler - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_MakeMoveMissed + jumpifsubstituteblocks BattleScript_MakeMoveMissed accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce @@ -2574,7 +2572,7 @@ BattleScript_EffectTorment:: BattleScript_EffectFlatter:: attackcanceler - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_MakeMoveMissed + jumpifsubstituteblocks BattleScript_MakeMoveMissed accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce @@ -2599,7 +2597,7 @@ 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 @@ -2634,7 +2632,7 @@ BattleScript_EffectMemento:: setatkhptozero attackanimation waitanimation - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_82DA148 + jumpifsubstituteblocks BattleScript_82DA148 setbyte sFIELD_1B, 0x0 playstatchangeanimation BS_TARGET, 0x12, 0x7 playstatchangeanimation BS_TARGET, 0x2, 0x3 @@ -2679,7 +2677,7 @@ BattleScript_EffectFocusPunch:: goto BattleScript_MoveEnd BattleScript_EffectSmellingsalt:: - jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_EffectHit + jumpifsubstituteblocks BattleScript_EffectHit setmoveeffect MOVE_EFFECT_REMOVE_PARALYSIS | MOVE_EFFECT_CERTAIN goto BattleScript_EffectHit @@ -2741,7 +2739,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 @@ -2858,7 +2856,7 @@ 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 + jumpifsubstituteblocks BattleScript_ButItFailed jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifcantmakeasleep BattleScript_ButItFailed @@ -2970,7 +2968,7 @@ 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 diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index 0f56ca213d..92593e4a6d 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -12,6 +12,7 @@ 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); extern void (* const gBattleScriptingCommandsTable[])(void); extern const u8 gUnknown_0831C494[][4]; diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 1d247a20b5..c6809c094d 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -11,5 +11,6 @@ #define B_FELL_STINGER_STAT_RAISE GEN_6 // Gen6 Atk+2, Gen7 Atk+3. #define B_ABILITY_WEATHER GEN_6 // Up to gen5 - weather induced by abilities such as Drought or Drizzle lasted till the battle's end or weather change by a move. From Gen6 onwards, weather caused by abilities lasts the same amount of turns as induced from a move. #define B_GALE_WINGS GEN_6 // Gen7 requires full hp. +#define B_SOUND_SUBSTITUTE GEN_6 // Starting from gen6 sound moves bypass Substitute. #endif // GUARD_CONSTANTS_BATTLE_CONFIG_H diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index b176964bc4..5dd095c790 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -95,6 +95,7 @@ #define FLAG_DMG_MINIMIZE 0x2000 #define FLAG_DMG_UNDERGROUND 0x4000 #define FLAG_DMG_UNDERWATER 0x8000 +#define FLAG_SOUND 0x10000 // Split defines. #define SPLIT_PHYSICAL 0x0 diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index 78cd16fe68..f422ece123 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -552,7 +552,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -564,7 +564,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = -6, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, .split = SPLIT_STATUS, }, { // MOVE_SING @@ -576,7 +576,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -588,7 +588,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -1248,7 +1248,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -2088,7 +2088,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_SOUND, .split = SPLIT_SPECIAL, }, { // MOVE_CURSE @@ -2352,7 +2352,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, - .flags = 0, + .flags = FLAG_SOUND, .split = SPLIT_STATUS, }, { // MOVE_ICY_WIND @@ -2592,7 +2592,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, - .flags = FLAG_SNATCH_AFFECTED, + .flags = FLAG_SNATCH_AFFECTED | FLAG_SOUND, .split = SPLIT_STATUS, }, { // MOVE_RETURN @@ -3048,7 +3048,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -3660,7 +3660,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -3840,7 +3840,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -3852,7 +3852,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -4872,7 +4872,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_SOUND, .split = SPLIT_SPECIAL, }, { // MOVE_DRAGON_PULSE @@ -5388,7 +5388,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_SOUND, .split = SPLIT_SPECIAL, }, { // MOVE_JUDGMENT @@ -5976,7 +5976,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_SOUND, .split = SPLIT_SPECIAL, }, { // MOVE_CHIP_AWAY @@ -6576,7 +6576,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_SOUND, .split = SPLIT_SPECIAL, }, { // MOVE_SECRET_SWORD @@ -6672,7 +6672,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 100, .target = MOVE_TARGET_BOTH, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_SOUND, .split = SPLIT_SPECIAL, }, { // MOVE_ICICLE_CRASH @@ -6828,7 +6828,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_ION_DELUGE @@ -6900,7 +6900,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_SOUND, .split = SPLIT_SPECIAL, }, { // MOVE_PARTING_SHOT @@ -6912,7 +6912,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_TOPSY_TURVY @@ -7044,7 +7044,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_SOUND, .split = SPLIT_SPECIAL, }, { // MOVE_FAIRY_LOCK @@ -7092,7 +7092,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, .split = SPLIT_STATUS, }, { // MOVE_DIAMOND_STORM diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b42298da59..2d31a0af4e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -324,7 +324,7 @@ static void atkE5_pickup(void); static void atkE6_docastformchangeanimation(void); static void atkE7_trycastformdatachange(void); static void atkE8_settypebasedhalvers(void); -static void atkE9_nop(void); +static void atkE9_jumpifsubstituteblocks(void); static void atkEA_tryrecycleitem(void); static void atkEB_settypetoterrain(void); static void atkEC_pursuitrelated(void); @@ -582,7 +582,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atkE6_docastformchangeanimation, atkE7_trycastformdatachange, atkE8_settypebasedhalvers, - atkE9_nop, + atkE9_jumpifsubstituteblocks, atkEA_tryrecycleitem, atkEB_settypetoterrain, atkEC_pursuitrelated, @@ -1407,7 +1407,7 @@ static void atk07_adjustdamage(void) { u8 holdEffect, param; - if (gBattleMons[gBattlerTarget].status2 & STATUS2_SUBSTITUTE) + if (DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) goto END; if (gBattleMons[gBattlerTarget].hp > gBattleMoveDamage) goto END; @@ -1562,7 +1562,7 @@ static void atk0B_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); } @@ -1606,7 +1606,7 @@ static void atk0C_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) { @@ -2002,7 +2002,7 @@ void SetMoveEffect(bool8 primary, u8 certain) && gBattleCommunication[MOVE_EFFECT_BYTE] != 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] <= 6) // status change @@ -5321,7 +5321,7 @@ static void atk5C_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); @@ -7828,7 +7828,7 @@ static void atkA4_trysetencore(void) static void atkA5_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; @@ -9537,9 +9537,24 @@ static void atkE8_settypebasedhalvers(void) // water and mud sport gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } -static void atkE9_nop(void) +bool32 DoesSubstituteBlockMove(u8 battlerAtk, u8 battlerDef, u32 move) { - gBattlescriptCurrInstr++; + 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; +} + +static void atkE9_jumpifsubstituteblocks(void) +{ + if (DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + else + gBattlescriptCurrInstr += 5; } static void atkEA_tryrecycleitem(void) diff --git a/src/battle_util.c b/src/battle_util.c index 77923db9dd..863ce9f184 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -29,11 +29,6 @@ extern u8 weather_get_current(void); // rom const data -static const u16 sSoundMovesTable[] = -{ - MOVE_GROWL, MOVE_ROAR, MOVE_SING, MOVE_SUPERSONIC, MOVE_SCREECH, MOVE_SNORE, - MOVE_UPROAR, MOVE_METAL_SOUND, MOVE_GRASS_WHISTLE, MOVE_HYPER_VOICE, 0xFFFF -}; static const u8 sAbilitiesAffectedByMoldBreaker[] = { @@ -2777,24 +2772,16 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } break; case ABILITYEFFECT_MOVES_BLOCK: // 2 - if (gLastUsedAbility == ABILITY_SOUNDPROOF) + if (gLastUsedAbility == ABILITY_SOUNDPROOF && gBattleMoves[move].flags & FLAG_SOUND) { - 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; - } + if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS) + gHitMarker |= HITMARKER_NO_PPDEDUCT; + gBattlescriptCurrInstr = BattleScript_SoundproofProtected; + effect = 1; } break; case ABILITYEFFECT_ABSORBING: // 3 - if (move) + if (move != MOVE_NONE) { u8 statId; switch (gLastUsedAbility) From c7baa71a5ec043b508fde16a9d9a62ae7b008a9e Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 2 Aug 2018 20:32:13 +0200 Subject: [PATCH 082/667] Add placeholder string for not done moves. --- data/battle_scripts_1.s | 8 +- include/constants/battle_move_effects.h | 2 +- include/constants/battle_string_ids.h | 1 + include/data/battle_moves.h | 206 ++++++++++++------------ src/battle_message.c | 5 +- 5 files changed, 115 insertions(+), 107 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index fb4b6c824a..3e02968cf1 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -223,7 +223,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectCosmicPower .4byte BattleScript_EffectSkyUppercut .4byte BattleScript_EffectBulkUp - .4byte BattleScript_EffectPlaceholder209 + .4byte BattleScript_EffectPlaceholder .4byte BattleScript_EffectWaterSport .4byte BattleScript_EffectCalmMind .4byte BattleScript_EffectDragonDance @@ -593,6 +593,11 @@ BattleScript_EffectHitEscape: switchineffects BS_ATTACKER BattleScript_HitEscapeEnd: end + +BattleScript_EffectPlaceholder: + attackcanceler + printstring STRINGID_NOTDONEYET + goto BattleScript_MoveEnd BattleScript_EffectAlwaysHit: BattleScript_EffectEvasionDownHit: @@ -602,7 +607,6 @@ BattleScript_EffectFalseSwipe: BattleScript_EffectAlwaysCrit: BattleScript_EffectPursuit: BattleScript_EffectFellStinger: -BattleScript_EffectPlaceholder209: BattleScript_EffectHit:: BattleScript_EffectLowKick: BattleScript_EffectFlail: diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 4c94337abf..2c3c2f666c 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -210,7 +210,7 @@ #define EFFECT_COSMIC_POWER 206 #define EFFECT_SKY_UPPERCUT 207 #define EFFECT_BULK_UP 208 -#define EFFECT_PLACEHOLDER_209 209 +#define EFFECT_PLACEHOLDER 209 #define EFFECT_WATER_SPORT 210 #define EFFECT_CALM_MIND 211 #define EFFECT_DRAGON_DANCE 212 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index a04fe449e0..528e4419cb 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -489,6 +489,7 @@ #define STRINGID_ASSAULTVESTDOESNTALLOW 486 #define STRINGID_GRAVITYPREVENTSUSAGE 487 #define STRINGID_HEALBLOCKPREVENTSUSAGE 488 +#define STRINGID_NOTDONEYET 489 #define BATTLESTRINGS_COUNT 501 diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index f422ece123..70a815b7e7 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -4372,7 +4372,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_FEINT - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 30, .type = TYPE_NORMAL, .accuracy = 100, @@ -4384,7 +4384,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_PLUCK - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (Bug Bite and Pluck should have the same move effect) + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (Bug Bite and Pluck should have the same move effect) .power = 60, .type = TYPE_FLYING, .accuracy = 100, @@ -4408,7 +4408,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_ACUPRESSURE - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -4420,7 +4420,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_METAL_BURST - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (Counters 1.5x damage) + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (Counters 1.5x damage) .power = 0, .type = TYPE_STEEL, .accuracy = 100, @@ -4444,7 +4444,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_CLOSE_COMBAT - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 120, .type = TYPE_FIGHTING, .accuracy = 100, @@ -4504,7 +4504,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_PSYCHO_SHIFT - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_PSYCHIC, .accuracy = 100, @@ -4552,7 +4552,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_POWER_TRICK - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -4576,7 +4576,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_LUCKY_CHANT - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -4588,7 +4588,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_ME_FIRST - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -4600,7 +4600,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_COPYCAT - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -4648,7 +4648,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_LAST_RESORT - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 140, .type = TYPE_NORMAL, .accuracy = 100, @@ -4672,7 +4672,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_SUCKER_PUNCH - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 70, .type = TYPE_DARK, .accuracy = 100, @@ -4732,7 +4732,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_FLARE_BLITZ - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 120, .type = TYPE_FIRE, .accuracy = 100, @@ -5068,7 +5068,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_THUNDER_FANG - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (10% paralyze AND 10% flinch) + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (10% paralyze AND 10% flinch) .power = 65, .type = TYPE_ELECTRIC, .accuracy = 95, @@ -5080,7 +5080,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_ICE_FANG - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (10% paralyze AND 10% flinch) + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (10% paralyze AND 10% flinch) .power = 65, .type = TYPE_ICE, .accuracy = 95, @@ -5092,7 +5092,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_FIRE_FANG - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (10% paralyze AND 10% flinch) + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (10% paralyze AND 10% flinch) .power = 65, .type = TYPE_FIRE, .accuracy = 95, @@ -5188,7 +5188,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_DEFOG - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_FLYING, .accuracy = 0, @@ -5392,7 +5392,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_JUDGMENT - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 100, .type = TYPE_NORMAL, .accuracy = 100, @@ -5404,7 +5404,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_BUG_BITE - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (Bug Bite and Pluck should have the same move effect) + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (Bug Bite and Pluck should have the same move effect) .power = 60, .type = TYPE_BUG, .accuracy = 100, @@ -5464,7 +5464,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_DEFEND_ORDER - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_BUG, .accuracy = 0, @@ -5488,7 +5488,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_HEAD_SMASH - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (1/2 recoil instead of 1/3 recoil) + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (1/2 recoil instead of 1/3 recoil) .power = 150, .type = TYPE_ROCK, .accuracy = 80, @@ -5620,7 +5620,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_HONE_CLAWS - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_DARK, .accuracy = 0, @@ -5632,7 +5632,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_WIDE_GUARD - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_ROCK, .accuracy = 0, @@ -5704,7 +5704,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_AUTOTOMIZE - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (raises the user's Speed stat by two stages BUT also decreases the user's weight by 100kg) + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (raises the user's Speed stat by two stages BUT also decreases the user's weight by 100kg) .power = 0, .type = TYPE_STEEL, .accuracy = 0, @@ -5752,7 +5752,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_SMACK_DOWN - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 50, .type = TYPE_ROCK, .accuracy = 100, @@ -5776,7 +5776,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_FLAME_BURST - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 70, .type = TYPE_FIRE, .accuracy = 100, @@ -5800,7 +5800,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_QUIVER_DANCE - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_BUG, .accuracy = 0, @@ -5824,7 +5824,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_SYNCHRONOISE - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 120, .type = TYPE_PSYCHIC, .accuracy = 100, @@ -5848,7 +5848,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_SOAK - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_WATER, .accuracy = 100, @@ -5872,7 +5872,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_COIL - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_POISON, .accuracy = 0, @@ -5896,7 +5896,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_ACID_SPRAY - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 40, .type = TYPE_POISON, .accuracy = 100, @@ -5920,7 +5920,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_SIMPLE_BEAM - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 100, @@ -5932,7 +5932,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_ENTRAINMENT - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 100, @@ -5944,7 +5944,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_AFTER_YOU - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -5992,7 +5992,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_CLEAR_SMOG - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (Always bypasses accuracy, but same as Haze) + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (Always bypasses accuracy, but same as Haze) .power = 50, .type = TYPE_POISON, .accuracy = 0, @@ -6016,7 +6016,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_QUICK_GUARD - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_FIGHTING, .accuracy = 0, @@ -6028,7 +6028,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_ALLY_SWITCH - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -6040,7 +6040,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_SCALD - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (30% burn + always thaws ice even if it misses) + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (30% burn + always thaws ice even if it misses) .power = 80, .type = TYPE_WATER, .accuracy = 100, @@ -6052,7 +6052,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_SHELL_SMASH - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -6064,7 +6064,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_HEAL_PULSE - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (always bypasses accuracy checks) + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (always bypasses accuracy checks) .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -6088,7 +6088,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_SKY_DROP - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 60, .type = TYPE_FLYING, .accuracy = 100, @@ -6100,7 +6100,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_SHIFT_GEAR - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_STEEL, .accuracy = 0, @@ -6112,7 +6112,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_CIRCLE_THROW - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (similar to whirlwind, but different) + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (similar to whirlwind, but different) .power = 60, .type = TYPE_FIGHTING, .accuracy = 90, @@ -6124,7 +6124,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_INCINERATE - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 60, .type = TYPE_FIRE, .accuracy = 100, @@ -6136,7 +6136,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_QUASH - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_DARK, .accuracy = 100, @@ -6160,7 +6160,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_REFLECT_TYPE - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -6184,7 +6184,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_FINAL_GAMBIT - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 1, .type = TYPE_FIGHTING, .accuracy = 100, @@ -6196,7 +6196,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_BESTOW - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -6304,7 +6304,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_DRAGON_TAIL - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 60, .type = TYPE_DRAGON, .accuracy = 90, @@ -6316,7 +6316,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_WORK_UP - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -6340,7 +6340,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_WILD_CHARGE - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (recoil damage but 1/4 instead of 1/3) + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (recoil damage but 1/4 instead of 1/3) .power = 90, .type = TYPE_ELECTRIC, .accuracy = 100, @@ -6460,7 +6460,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_COTTON_GUARD - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_GRASS, .accuracy = 0, @@ -6508,7 +6508,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_HURRICANE - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 110, .type = TYPE_FLYING, .accuracy = 70, @@ -6520,7 +6520,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_HEAD_CHARGE - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (same as WILD_CHARGE) + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (same as WILD_CHARGE) .power = 120, .type = TYPE_NORMAL, .accuracy = 100, @@ -6544,7 +6544,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_SEARING_SHOT - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (30% burn, does not affect opponents with BULLETPROOF) + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (30% burn, does not affect opponents with BULLETPROOF) .power = 100, .type = TYPE_FIRE, .accuracy = 100, @@ -6556,7 +6556,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_TECHNO_BLAST - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 120, .type = TYPE_NORMAL, .accuracy = 100, @@ -6640,7 +6640,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_FREEZE_SHOCK - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 140, .type = TYPE_ICE, .accuracy = 90, @@ -6652,7 +6652,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_ICE_BURN - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 140, .type = TYPE_ICE, .accuracy = 90, @@ -6688,7 +6688,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_V_CREATE - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 180, .type = TYPE_FIRE, .accuracy = 95, @@ -6700,7 +6700,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_FUSION_FLARE - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 100, .type = TYPE_FIRE, .accuracy = 100, @@ -6712,7 +6712,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_FUSION_BOLT - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 100, .type = TYPE_ELECTRIC, .accuracy = 100, @@ -6724,7 +6724,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_FLYING_PRESS - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 100, .type = TYPE_FIGHTING, .accuracy = 95, @@ -6736,7 +6736,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_MAT_BLOCK - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_FIGHTING, .accuracy = 0, @@ -6748,7 +6748,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_BELCH - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 120, .type = TYPE_POISON, .accuracy = 90, @@ -6760,7 +6760,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_ROTOTILLER - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_GROUND, .accuracy = 0, @@ -6772,7 +6772,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_STICKY_WEB - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_BUG, .accuracy = 0, @@ -6808,7 +6808,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_TRICK_OR_TREAT - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_GHOST, .accuracy = 100, @@ -6820,7 +6820,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_NOBLE_ROAR - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 100, @@ -6832,7 +6832,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_ION_DELUGE - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_ELECTRIC, .accuracy = 0, @@ -6856,7 +6856,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_FOREST_S_CURSE - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_GRASS, .accuracy = 100, @@ -6880,7 +6880,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_FREEZE_DRY - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 70, .type = TYPE_ICE, .accuracy = 100, @@ -6892,7 +6892,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_DISARMING_VOICE - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 40, .type = TYPE_FAIRY, .accuracy = 0, @@ -6904,7 +6904,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_PARTING_SHOT - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_DARK, .accuracy = 100, @@ -6916,7 +6916,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_TOPSY_TURVY - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_DARK, .accuracy = 0, @@ -6928,7 +6928,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_DRAINING_KISS - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (restores 75% HP instead of 50% HP) + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (restores 75% HP instead of 50% HP) .power = 50, .type = TYPE_FAIRY, .accuracy = 100, @@ -6940,7 +6940,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_CRAFTY_SHIELD - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_FAIRY, .accuracy = 0, @@ -6952,7 +6952,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_FLOWER_SHIELD - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_FAIRY, .accuracy = 0, @@ -6964,7 +6964,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_GRASSY_TERRAIN - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_GRASS, .accuracy = 0, @@ -6976,7 +6976,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_MISTY_TERRAIN - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_FAIRY, .accuracy = 0, @@ -6988,7 +6988,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_ELECTRIFY - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_ELECTRIC, .accuracy = 0, @@ -7048,7 +7048,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_FAIRY_LOCK - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_FAIRY, .accuracy = 0, @@ -7060,7 +7060,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_KING_S_SHIELD - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect, as it changes Aegislash's form + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect, as it changes Aegislash's form .power = 0, .type = TYPE_STEEL, .accuracy = 0, @@ -7072,7 +7072,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_PLAY_NICE - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -7096,7 +7096,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_DIAMOND_STORM - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 100, .type = TYPE_ROCK, .accuracy = 95, @@ -7108,7 +7108,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_STEAM_ERUPTION - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (Same as SCALD) + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (Same as SCALD) .power = 110, .type = TYPE_WATER, .accuracy = 95, @@ -7120,7 +7120,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_HYPERSPACE_HOLE - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (Same as SCALD) + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (Same as SCALD) .power = 80, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -7132,7 +7132,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_WATER_SHURIKEN - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (Same with tail slap, HOWEVER If Battle Bond is activated, Water Shuriken's power rises from 15 to 20, and it always hits three times, giving it an average power of 60) + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (Same with tail slap, HOWEVER If Battle Bond is activated, Water Shuriken's power rises from 15 to 20, and it always hits three times, giving it an average power of 60) .power = 15, .type = TYPE_WATER, .accuracy = 100, @@ -7156,7 +7156,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_SPIKY_SHIELD - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_GRASS, .accuracy = 0, @@ -7168,7 +7168,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_AROMATIC_MIST - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_FAIRY, .accuracy = 0, @@ -7192,7 +7192,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_VENOM_DRENCH - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_POISON, .accuracy = 100, @@ -7204,7 +7204,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_POWDER - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_BUG, .accuracy = 100, @@ -7216,7 +7216,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_GEOMANCY - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_FAIRY, .accuracy = 0, @@ -7228,7 +7228,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_MAGNETIC_FLUX - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_ELECTRIC, .accuracy = 0, @@ -7240,7 +7240,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_HAPPY_HOUR - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -7252,7 +7252,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_ELECTRIC_TERRAIN - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_ELECTRIC, .accuracy = 0, @@ -7276,7 +7276,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_CELEBRATE - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -7288,7 +7288,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_HOLD_HANDS - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -7336,7 +7336,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_INFESTATION - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 20, .type = TYPE_BUG, .accuracy = 100, @@ -7360,7 +7360,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_OBLIVION_WING - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (Restores 75% of damage dealt back to user) + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (Restores 75% of damage dealt back to user) .power = 80, .type = TYPE_FLYING, .accuracy = 100, @@ -7372,7 +7372,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_THOUSAND_ARROWS - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 90, .type = TYPE_GROUND, .accuracy = 100, @@ -7384,7 +7384,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_THOUSAND_WAVES - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (not sure if this is like Mean Look lol, might be) + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (not sure if this is like Mean Look lol, might be) .power = 90, .type = TYPE_GROUND, .accuracy = 100, @@ -7408,7 +7408,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_LIGHT_OF_RUIN - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect (same as HEAD_SMASH) + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (same as HEAD_SMASH) .power = 140, .type = TYPE_FAIRY, .accuracy = 90, @@ -7444,7 +7444,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_DRAGON_ASCENT - .effect = EFFECT_PLACEHOLDER_209, // Needs a custom move effect + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 120, .type = TYPE_FLYING, .accuracy = 100, diff --git a/src/battle_message.c b/src/battle_message.c index d0eca7bcc7..b1387dd16a 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -627,6 +627,7 @@ static const u8 sText_AttackerAquiredAbility[] = _("{B_ATK_NAME_WITH_PREFIX} acq 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"); // New selection strings, they must end with "\p". // Use {B_LAST_ITEM} and {B_CURRENT_MOVE}. @@ -1114,6 +1115,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_AssaultVestDoesntAllow, sText_GravityPreventsUsage, sText_HealBlockPreventsUsage, + sText_NotDoneYet, }; const u16 gMagicCoatBounceStringIds[] = @@ -1488,7 +1490,8 @@ static const u8 sATypeMove_Table[][17] = _("a PSYCHIC move"), _("an ICE move"), _("a DRAGON move"), - _("a DARK move") + _("a DARK move"), + _("a FAIRY move"), }; const u8 gText_BattleTourney[] = _("BATTLE TOURNEY"); From 92f3d89598427b8ca25ae75fb0681423a4e5486c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 2 Aug 2018 21:27:28 +0200 Subject: [PATCH 083/667] Gravity and Heal Block preventing after choosing a move --- include/battle.h | 2 ++ src/battle_main.c | 3 ++ src/battle_util.c | 79 +++++++++++++++++++++++++++++++++++++---------- 3 files changed, 67 insertions(+), 17 deletions(-) diff --git a/include/battle.h b/include/battle.h index e62d8d7e9b..f3b9ff266b 100644 --- a/include/battle.h +++ b/include/battle.h @@ -210,6 +210,8 @@ struct ProtectStruct u32 flag_x40:1; // 0x40 u32 flag_x80:1; // 0x80 u32 usesBouncedMove:1; + u32 usedHealBlockedMove:1; + u32 usedGravityPreventedMove:1; /* field_4 */ u32 physicalDmg; /* field_8 */ u32 specialDmg; diff --git a/src/battle_main.c b/src/battle_main.c index 84fc6531ba..0829d24559 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3253,6 +3253,9 @@ 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; gDisableStructs[gActiveBattler].isFirstTurn = 2; diff --git a/src/battle_util.c b/src/battle_util.c index 863ce9f184..6c190bd798 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -477,6 +477,8 @@ 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) @@ -1948,7 +1950,26 @@ void TryClearRageStatuses(void) } } -#define ATKCANCELLER_MAX_CASE 14 +enum +{ + CANCELLER_FLAGS, + CANCELLER_ASLEEP, + CANCELLER_FROZEN, + CANCELLER_TRUANT, + CANCELLER_RECHARGE, + CANCELLER_FLINCH, + CANCELLER_DISABLED, + CANCELLER_GRAVITY, + CANCELLER_HEAL_BLOCKED, + CANCELLER_TAUNTED, + CANCELLER_IMPRISONED, + CANCELLER_CONFUSED, + CANCELLER_PARALYSED, + CANCELLER_IN_LOVE, + CANCELLER_BIDE, + CANCELLER_THAW, + CANCELLER_END, +}; u8 AtkCanceller_UnableToUseMove(void) { @@ -1958,12 +1979,12 @@ u8 AtkCanceller_UnableToUseMove(void) { switch (gBattleStruct->atkCancellerTracker) { - case 0: // flags clear + case CANCELLER_FLAGS: // flags clear gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_DESTINY_BOND); gStatuses3[gBattlerAttacker] &= ~(STATUS3_GRUDGE); gBattleStruct->atkCancellerTracker++; break; - case 1: // check being asleep + case CANCELLER_ASLEEP: // check being asleep if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) { if (UproarWakeUpCheck(gBattlerAttacker)) @@ -2007,7 +2028,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 2: // check being frozen + case CANCELLER_FROZEN: // check being frozen if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE) { if (Random() % 5) @@ -2034,7 +2055,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 3: // truant + case CANCELLER_TRUANT: // truant if (gBattleMons[gBattlerAttacker].ability == ABILITY_TRUANT && gDisableStructs[gBattlerAttacker].truantCounter) { CancelMultiTurnMoves(gBattlerAttacker); @@ -2046,7 +2067,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 4: // recharge + case CANCELLER_RECHARGE: // recharge if (gBattleMons[gBattlerAttacker].status2 & STATUS2_RECHARGE) { gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_RECHARGE); @@ -2058,7 +2079,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 5: // flinch + case CANCELLER_FLINCH: // flinch if (gBattleMons[gBattlerAttacker].status2 & STATUS2_FLINCHED) { gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_FLINCHED); @@ -2070,7 +2091,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 6: // disabled move + case CANCELLER_DISABLED: // disabled move if (gDisableStructs[gBattlerAttacker].disabledMove == gCurrentMove && gDisableStructs[gBattlerAttacker].disabledMove != 0) { gProtectStructs[gBattlerAttacker].usedDisabledMove = 1; @@ -2082,7 +2103,31 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 7: // taunt + 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].tauntTimer1 && gBattleMoves[gCurrentMove].power == 0) { gProtectStructs[gBattlerAttacker].usedTauntedMove = 1; @@ -2093,7 +2138,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 8: // imprisoned + case CANCELLER_IMPRISONED: // imprisoned if (GetImprisonedMovesCount(gBattlerAttacker, gCurrentMove)) { gProtectStructs[gBattlerAttacker].usedImprisionedMove = 1; @@ -2104,7 +2149,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 9: // confusion + case CANCELLER_CONFUSED: // confusion if (gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION) { gBattleMons[gBattlerAttacker].status2--; @@ -2134,7 +2179,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 10: // paralysis + case CANCELLER_PARALYSED: // paralysis if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS) && (Random() % 4) == 0) { gProtectStructs[gBattlerAttacker].prlzImmobility = 1; @@ -2146,7 +2191,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 11: // infatuation + case CANCELLER_IN_LOVE: // infatuation if (gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) { gBattleScripting.battler = CountTrailingZeroBits((gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) >> 0x10); @@ -2166,7 +2211,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 12: // bide + case CANCELLER_BIDE: // bide if (gBattleMons[gBattlerAttacker].status2 & STATUS2_BIDE) { gBattleMons[gBattlerAttacker].status2 -= 0x100; @@ -2196,7 +2241,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 13: // move thawing + case CANCELLER_THAW: // move thawing if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE) { if (gBattleMoves[gCurrentMove].effect == EFFECT_THAW_HIT) @@ -2210,11 +2255,11 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case ATKCANCELLER_MAX_CASE: + case CANCELLER_END: break; } - } while (gBattleStruct->atkCancellerTracker != ATKCANCELLER_MAX_CASE && effect == 0); + } while (gBattleStruct->atkCancellerTracker != CANCELLER_END && effect == 0); if (effect == 2) { From 28b4d0d9dc0bbd8392d280fe5231a094e8400118 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 3 Aug 2018 00:21:40 +0200 Subject: [PATCH 084/667] Make it compile --- data/battle_scripts_1.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 3849299416..c4befebb8f 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2636,7 +2636,7 @@ BattleScript_EffectMemento:: setatkhptozero attackanimation waitanimation - jumpifsubstituteblocks BattleScript_82DA148 + jumpifsubstituteblocks BattleScript_EffectMementoPrintNoEffect setbyte sSTAT_ANIM_PLAYED, FALSE playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, ATK48_STAT_NEGATIVE | ATK48_STAT_BY_TWO | ATK48_ONLY_MULTIPLE playstatchangeanimation BS_TARGET, BIT_ATK, ATK48_STAT_NEGATIVE | ATK48_STAT_BY_TWO From 39f9b1ddf08e9e69d4a00a1ba4a227973612494a Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 3 Aug 2018 18:01:14 +0200 Subject: [PATCH 085/667] Experience on caught mon --- data/battle_scripts_2.s | 7 +++++++ include/battle.h | 3 ++- include/constants/battle_config.h | 1 + include/constants/battle_script_commands.h | 2 ++ src/battle_main.c | 2 ++ src/reshow_battle_screen.c | 2 ++ 6 files changed, 16 insertions(+), 1 deletion(-) diff --git a/data/battle_scripts_2.s b/data/battle_scripts_2.s index 1fbaa9536b..c2dc928dbf 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 "asm/macros.inc" @@ -61,10 +62,16 @@ BattleScript_SafariBallThrow:: handleballthrow BattleScript_SuccessBallThrow:: + setbyte sMON_CAUGHT, TRUE jumpifhalfword CMP_EQUAL, gLastUsedItem, ITEM_SAFARI_BALL, BattleScript_PrintCaughtMonInfo incrementgamestat 0xB 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 diff --git a/include/battle.h b/include/battle.h index 17c6de3060..c57c7760ce 100644 --- a/include/battle.h +++ b/include/battle.h @@ -635,7 +635,7 @@ struct BattleScripting s32 painSplitHp; s32 bideDmg; u8 multihitString[6]; - u8 unused_E; + bool8 expOnCatch; u8 twoTurnsMoveStringId; u8 animArg1; u8 animArg2; @@ -658,6 +658,7 @@ struct BattleScripting u8 field_23; u8 windowsType; // 0 - normal, 1 - battle arena u8 multiplayerId; + bool8 monCaught; }; // rom_80A5C6C diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index c6809c094d..0be88b4421 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -12,5 +12,6 @@ #define B_ABILITY_WEATHER GEN_6 // Up to gen5 - weather induced by abilities such as Drought or Drizzle lasted till the battle's end or weather change by a move. From Gen6 onwards, weather caused by abilities lasts the same amount of turns as induced from a move. #define B_GALE_WINGS GEN_6 // Gen7 requires full hp. #define B_SOUND_SUBSTITUTE GEN_6 // Starting from gen6 sound moves bypass Substitute. +#define B_EXP_CATCH GEN_6 // Starting from gen6, pokemon get experience from catching. #endif // GUARD_CONSTANTS_BATTLE_CONFIG_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index a999ccdd18..66de41c2ad 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -5,6 +5,7 @@ #define sPAINSPLIT_HP gBattleScripting #define sBIDE_DMG gBattleScripting + 4 #define sMULTIHIT_STRING gBattleScripting + 8 +#define sEXP_CATCH gBattleScripting + 0xE #define sTWOTURN_STRINGID gBattleScripting + 0xF #define sB_ANIM_ARG1 gBattleScripting + 0x10 #define sB_ANIM_ARG2 gBattleScripting + 0x11 @@ -27,6 +28,7 @@ #define sFIELD_23 gBattleScripting + 0x23 #define sFIELD_24 gBattleScripting + 0x24 #define sMULTIPLAYER_ID gBattleScripting + 0x25 +#define sMON_CAUGHT gBattleScripting + 0x26 #define cEFFECT_CHOOSER gBattleCommunication + 3 #define cMULTISTRING_CHOOSER gBattleCommunication + 5 diff --git a/src/battle_main.c b/src/battle_main.c index 0829d24559..837eebf9a6 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3036,6 +3036,8 @@ static void BattleStartClearSetData(void) gHitMarker |= HITMARKER_NO_ANIMATIONS; gBattleScripting.battleStyle = gSaveBlock2Ptr->optionsBattleStyle; + gBattleScripting.expOnCatch = (B_EXP_CATCH >= GEN_6); + gBattleScripting.monCaught = FALSE; gMultiHitCounter = 0; gBattleOutcome = 0; diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c index 60580ef2d7..c68a003cf9 100644 --- a/src/reshow_battle_screen.c +++ b/src/reshow_battle_screen.c @@ -233,6 +233,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, sub_80A82E4(battler)); From 2d73637ff47c48af8361e9ddc701f5ff89c557be Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 3 Aug 2018 19:01:03 +0200 Subject: [PATCH 086/667] Introduce argument and do Draining kiss --- asm/macros/battle_script.inc | 2 +- data/battle_scripts_1.s | 4 ++-- include/data/battle_moves.h | 5 +++-- include/pokemon.h | 1 + src/battle_script_commands.c | 12 ++++++++---- 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index e879dfd056..ac1f3b5f02 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -702,7 +702,7 @@ .4byte \param0 .endm - .macro negativedamage + .macro setdrainedhp .byte 0x88 .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index c4befebb8f..cf6e8ef8a3 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -744,7 +744,7 @@ 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 @@ -854,7 +854,7 @@ BattleScript_82D8C18:: waitmessage 0x40 resultmessage waitmessage 0x40 - negativedamage + setdrainedhp orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index 70a815b7e7..c127bc1e14 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -6928,7 +6928,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_DRAINING_KISS - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (restores 75% HP instead of 50% HP) + .effect = EFFECT_ABSORB, .power = 50, .type = TYPE_FAIRY, .accuracy = 100, @@ -6937,7 +6937,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, - .split = SPLIT_SPECIAL, + .split = SPLIT_SPECIAL, // restores 75% HP instead of 50% HP + .argument = 75, }, { // MOVE_CRAFTY_SHIELD .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect diff --git a/include/pokemon.h b/include/pokemon.h index 5d34106c1f..d979d9b5e4 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -365,6 +365,7 @@ struct BattleMove s8 priority; u32 flags; u8 split; + u8 argument; }; struct SpindaSpot diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 187fca7d6a..e5f351f36b 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -227,7 +227,7 @@ static void atk84_jumpifcantmakeasleep(void); static void atk85_stockpile(void); static void atk86_stockpiletobasedamage(void); static void atk87_stockpiletohpheal(void); -static void atk88_negativedamage(void); +static void atk88_setdrainedhp(void); static void atk89_statbuffchange(void); static void atk8A_normalisebuffs(void); static void atk8B_setbide(void); @@ -485,7 +485,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atk85_stockpile, atk86_stockpiletobasedamage, atk87_stockpiletohpheal, - atk88_negativedamage, + atk88_setdrainedhp, atk89_statbuffchange, atk8A_normalisebuffs, atk8B_setbide, @@ -6739,9 +6739,13 @@ static void atk87_stockpiletohpheal(void) } } -static void atk88_negativedamage(void) +static void atk88_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; From f8f46244fb7a2c4ae5cb7e7dc430cca7047c1424 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 3 Aug 2018 22:45:27 +0200 Subject: [PATCH 087/667] Add Infatuation to debug. --- include/data/battle_moves.h | 5 +++-- src/battle_debug.c | 27 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index c127bc1e14..1f6c3d159c 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -5464,7 +5464,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_DEFEND_ORDER - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_COSMIC_POWER, .power = 0, .type = TYPE_BUG, .accuracy = 0, @@ -7361,7 +7361,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_OBLIVION_WING - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (Restores 75% of damage dealt back to user) + .effect = EFFECT_ABSORB, .power = 80, .type = TYPE_FLYING, .accuracy = 100, @@ -7371,6 +7371,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_PLACEHOLDER, // Needs a custom move effect diff --git a/src/battle_debug.c b/src/battle_debug.c index 94a5ec8ae6..021d0465d4 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -19,6 +19,7 @@ #include "list_menu.h" #include "malloc.h" #include "string_util.h" +#include "util.h" #include "data2.h" #include "reset_rtc_screen.h" #include "reshow_battle_screen.h" @@ -107,6 +108,7 @@ enum VAR_SIDE_STATUS, VAR_SHOW_HP, VAR_SUBSTITUTE, + VAR_IN_LOVE, }; enum @@ -128,6 +130,7 @@ enum { VARIOUS_SHOW_HP, VARIOUS_SUBSTITUTE_HP, + VARIOUS_IN_LOVE, }; // const rom data @@ -202,6 +205,7 @@ 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_EmptyString[] = _(""); @@ -304,6 +308,7 @@ 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[] = @@ -1075,6 +1080,19 @@ static void UpdateBattlerValue(struct BattleDebugMenu *data) 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; } data->battlerWasChanged[data->battlerId] = TRUE; } @@ -1336,6 +1354,15 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) 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; From 9ff7b0e8496611dfc16aa0200ca3ac4bc4dd797c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 4 Aug 2018 20:36:24 +0200 Subject: [PATCH 088/667] Effect to u16, Lucky Chant, Sucker Punch, Sticky Web and Metal Burst --- asm/macros/battle_script.inc | 18 ++++- data/battle_scripts_1.s | 43 ++++++++++++ include/constants/battle_move_effects.h | 4 ++ include/constants/battle_script_commands.h | 2 + include/constants/battle_string_ids.h | 3 +- include/data/battle_moves.h | 8 +-- include/pokemon.h | 6 +- src/battle_message.c | 2 + src/battle_script_commands.c | 80 ++++++++++++++++++++-- 9 files changed, 154 insertions(+), 12 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index ac1f3b5f02..95b3a23039 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -959,8 +959,9 @@ .4byte \param0 .endm - .macro nop_C1 + .macro setstickyweb ptr .byte 0xc1 + .4byte \ptr .endm .macro selectfirstvalidtarget @@ -1250,6 +1251,11 @@ .4byte \ptr .endm + .macro metalburstdamagecalculator ptr + .byte 0xff + .4byte \ptr + .endm + @ various command changed to more readable macros .macro cancelmultiturnmoves bank various \bank, VARIOUS_CANCEL_MULTI_TURN_MOVES @@ -1400,6 +1406,16 @@ .2byte \move .endm + .macro setluckychant battler ptr + various \battler VARIOUS_SET_LUCKY_CHANT + .4byte \ptr + .endm + + .macro suckerpunchcheck ptr + various BS_ATTACKER, VARIOUS_SUCKER_PUNCH_CHECK + .4byte \ptr + .endm + @ helpful macros .macro setstatchanger stat, stages, down setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index cf6e8ef8a3..fed31bb516 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -270,6 +270,38 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectHeartSwap .4byte BattleScript_EffectPowerSplit .4byte BattleScript_EffectGuardSplit + .4byte BattleScript_EffectStickyWeb + .4byte BattleScript_EffectMetalBurst + .4byte BattleScript_EffectLuckyChant + .4byte BattleScript_EffectSuckerPunch + +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 @@ -422,6 +454,17 @@ BattleScript_EffectStealthRock: 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 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 2c3c2f666c..dab3b46be4 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -259,5 +259,9 @@ #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 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 66de41c2ad..e8706ed316 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -83,6 +83,8 @@ #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 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 528e4419cb..63bbf599f5 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -490,7 +490,8 @@ #define STRINGID_GRAVITYPREVENTSUSAGE 487 #define STRINGID_HEALBLOCKPREVENTSUSAGE 488 #define STRINGID_NOTDONEYET 489 +#define STRINGID_STICKYWEBUSED 490 -#define BATTLESTRINGS_COUNT 501 +#define BATTLESTRINGS_COUNT 506 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index 1f6c3d159c..c7dcd5749e 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -4420,7 +4420,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_METAL_BURST - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (Counters 1.5x damage) + .effect = EFFECT_METAL_BURST, .power = 0, .type = TYPE_STEEL, .accuracy = 100, @@ -4576,7 +4576,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_LUCKY_CHANT - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_LUCKY_CHANT, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -4672,7 +4672,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_SUCKER_PUNCH - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_SUCKER_PUNCH, .power = 70, .type = TYPE_DARK, .accuracy = 100, @@ -6772,7 +6772,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_STICKY_WEB - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_STICKY_WEB, .power = 0, .type = TYPE_BUG, .accuracy = 0, diff --git a/include/pokemon.h b/include/pokemon.h index d979d9b5e4..9b03e0001a 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -353,9 +353,11 @@ struct BaseStats u8 noFlip : 1; }; +// Argument and effect field are temporarily switched till functions referencing gBattleMoves are decompiled. + struct BattleMove { - u8 effect; + u8 argument; u8 power; u8 type; u8 accuracy; @@ -365,7 +367,7 @@ struct BattleMove s8 priority; u32 flags; u8 split; - u8 argument; + u16 effect; }; struct SpindaSpot diff --git a/src/battle_message.c b/src/battle_message.c index b1387dd16a..ecaa88aadf 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -628,6 +628,7 @@ static const u8 sText_TargetStatWontGoHigher[] = _("{B_DEF_NAME_WITH_PREFIX}’s 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_StickyWebUsed[] = _(""); // New selection strings, they must end with "\p". // Use {B_LAST_ITEM} and {B_CURRENT_MOVE}. @@ -1116,6 +1117,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_GravityPreventsUsage, sText_HealBlockPreventsUsage, sText_NotDoneYet, + sText_StickyWebUsed, }; const u16 gMagicCoatBounceStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e5f351f36b..6a086fd569 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -284,7 +284,7 @@ static void atkBD_copyfoestats(void); static void atkBE_rapidspinfree(void); static void atkBF_setdefensecurlbit(void); static void atkC0_recoverbasedonsunlight(void); -static void atkC1_nop(void); +static void atkC1_setstickyweb(void); static void atkC2_selectfirstvalidtarget(void); static void atkC3_trysetfutureattack(void); static void atkC4_trydobeatup(void); @@ -346,6 +346,7 @@ static void atkFB_averagestats(void); static void atkFC_jumpifoppositegenders(void); static void atkFD_trygetbaddreamstarget(void); static void atkFE_tryworryseed(void); +static void atkFF_metalburstdamagecalculator(void); void (* const gBattleScriptingCommandsTable[])(void) = { @@ -542,7 +543,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atkBE_rapidspinfree, atkBF_setdefensecurlbit, atkC0_recoverbasedonsunlight, - atkC1_nop, + atkC1_setstickyweb, atkC2_selectfirstvalidtarget, atkC3_trysetfutureattack, atkC4_trydobeatup, @@ -604,6 +605,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atkFC_jumpifoppositegenders, atkFD_trygetbaddreamstarget, atkFE_tryworryseed, + atkFF_metalburstdamagecalculator, }; struct StatFractions @@ -6307,6 +6309,27 @@ static void atk76_various(void) 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; } gBattlescriptCurrInstr += 3; @@ -8649,9 +8672,19 @@ static void atkC0_recoverbasedonsunlight(void) } } -static void atkC1_nop(void) +static void atkC1_setstickyweb(void) { - 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 atkC2_selectfirstvalidtarget(void) @@ -10161,3 +10194,42 @@ static void atkFE_tryworryseed(void) break; } } + +static void atkFF_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].flag20 = 1; + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + } +} + From 222ea7269d9dd160d1c59f4c9453feeb69624c29 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 4 Aug 2018 22:23:07 +0200 Subject: [PATCH 089/667] Rapid Spin blews all hazards, Quash and a couple of new move effects --- asm/macros/battle_script.inc | 24 ++++ data/battle_scripts_1.s | 76 ++++++++++++ include/battle_scripts.h | 3 + include/constants/battle_move_effects.h | 5 + include/constants/battle_script_commands.h | 5 + include/constants/battle_string_ids.h | 4 + include/data/battle_moves.h | 10 +- src/battle_message.c | 8 ++ src/battle_script_commands.c | 131 ++++++++++++++++++++- 9 files changed, 257 insertions(+), 9 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 95b3a23039..cc89e0aaeb 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1416,6 +1416,30 @@ .4byte \ptr .endm + .macro setabilitysimple battler ptr + various \battler VARIOUS_SET_SIMPLE_BEAM + .4byte \ptr + .endm + + .macro tryentrainment ptr + various BS_ATTACKER, VARIOUS_TRY_ENTRAINMENT + .4byte \ptr + .endm + + .macro setlastusedability battler + various \battler, VARIOUS_SET_LAST_USED_ABILITY + .endm + + .macro tryhealpulse battler ptr + various \battler, VARIOUS_TRY_HEAL_PULSE + .4byte \ptr + .endm + + .macro tryquash ptr + various BS_ATTACKER, VARIOUS_TRY_QUASH + .4byte \ptr + .endm + @ helpful macros .macro setstatchanger stat, stages, down setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index fed31bb516..4f877d11ab 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -274,6 +274,63 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectMetalBurst .4byte BattleScript_EffectLuckyChant .4byte BattleScript_EffectSuckerPunch + .4byte BattleScript_EffectSpecialDefenseDownHit2 + .4byte BattleScript_EffectSimpleBeam + .4byte BattleScript_EffectEntrainment + .4byte BattleScript_EffectHealPulse + .4byte BattleScript_EffectQuash + +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 @@ -1547,6 +1604,10 @@ BattleScript_EffectSpecialAttackDownHit:: 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 @@ -4044,6 +4105,21 @@ BattleScript_SpikesFree:: printstring STRINGID_PKMNBLEWAWAYSPIKES 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 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 274af5caef..f9333ca418 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -332,5 +332,8 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index dab3b46be4..c81d259f8c 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -263,5 +263,10 @@ #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 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index e8706ed316..eef80d6088 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -85,6 +85,11 @@ #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 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 63bbf599f5..abab41bb84 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -491,6 +491,10 @@ #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 BATTLESTRINGS_COUNT 506 diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index c7dcd5749e..3db40d970a 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -5896,7 +5896,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_ACID_SPRAY - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2, .power = 40, .type = TYPE_POISON, .accuracy = 100, @@ -5920,7 +5920,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_SIMPLE_BEAM - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_SIMPLE_BEAM, .power = 0, .type = TYPE_NORMAL, .accuracy = 100, @@ -5932,7 +5932,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_ENTRAINMENT - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_ENTRAINMENT, .power = 0, .type = TYPE_NORMAL, .accuracy = 100, @@ -6064,7 +6064,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_HEAL_PULSE - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (always bypasses accuracy checks) + .effect = EFFECT_HEAL_PULSE, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -6136,7 +6136,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_QUASH - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_QUASH, .power = 0, .type = TYPE_DARK, .accuracy = 100, diff --git a/src/battle_message.c b/src/battle_message.c index ecaa88aadf..c8207b0a8d 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -629,6 +629,10 @@ static const u8 sText_PkmnMoveBouncedViaAbility[] = _("{B_ATK_NAME_WITH_PREFIX} 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_StickyWebUsed[] = _(""); +static const u8 sText_QuashSuccess[] = _(""); +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!"); // New selection strings, they must end with "\p". // Use {B_LAST_ITEM} and {B_CURRENT_MOVE}. @@ -1118,6 +1122,10 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_HealBlockPreventsUsage, sText_NotDoneYet, sText_StickyWebUsed, + sText_QuashSuccess, + sText_PkmnBlewAwayToxicSpikes, + sText_PkmnBlewAwayStickyWeb, + sText_PkmnBlewAwayStealthRock, }; const u16 gMagicCoatBounceStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 6a086fd569..bbb783d795 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6061,7 +6061,7 @@ static bool32 HasAttackerFaintedTarget(void) static void atk76_various(void) { u8 side; - s32 i; + s32 i, j; u8 data[10]; if (gBattleControllerExecFlags) @@ -6330,6 +6330,106 @@ static void atk76_various(void) 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_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; } gBattlescriptCurrInstr += 3; @@ -8606,6 +8706,8 @@ static void atkBD_copyfoestats(void) // psych up static void atkBE_rapidspinfree(void) { + u8 atkSide = GetBattlerSide(gBattlerAttacker); + if (gBattleMons[gBattlerAttacker].status2 & STATUS2_WRAPPED) { gBattleScripting.battler = gBattlerTarget; @@ -8628,13 +8730,34 @@ static void atkBE_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++; From 2218949d7cbc4338257a0c6a87f18a95bf81c321 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 4 Aug 2018 23:34:29 +0200 Subject: [PATCH 090/667] Topsy Turvy and Ion Deluge. --- asm/macros/battle_script.inc | 4 +++ data/battle_scripts_1.s | 36 ++++++++++++++++++++++ include/constants/battle_move_effects.h | 3 ++ include/constants/battle_script_commands.h | 1 + include/constants/battle_string_ids.h | 4 ++- include/data/battle_moves.h | 6 ++-- src/battle_message.c | 4 +++ src/battle_script_commands.c | 9 ++++++ src/battle_util.c | 7 ++++- 9 files changed, 69 insertions(+), 5 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index cc89e0aaeb..debac5acb7 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1440,6 +1440,10 @@ .4byte \ptr .endm + .macro invertstatstages battler + various \battler, VARIOUS_INVERT_STAT_STAGES + .endm + @ helpful macros .macro setstatchanger stat, stages, down setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 4f877d11ab..e8a6f2ad3a 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -279,6 +279,41 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectEntrainment .4byte BattleScript_EffectHealPulse .4byte BattleScript_EffectQuash + .4byte BattleScript_EffectIonDeluge + .4byte BattleScript_EffectFreezeDry + .4byte BattleScript_EffectTopsyTurvy + +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 @@ -740,6 +775,7 @@ BattleScript_EffectFoulPlay: BattleScript_EffectPsyshock: BattleScript_EffectWeatherBall: BattleScript_EffectHiddenPower: +BattleScript_EffectFreezeDry: jumpifnotmove MOVE_SURF, BattleScript_HitFromAtkCanceler jumpifnostatus3 BS_TARGET, STATUS3_UNDERWATER, BattleScript_HitFromAtkCanceler orword gHitMarker, HITMARKER_IGNORE_UNDERWATER diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index c81d259f8c..ab05359933 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -268,5 +268,8 @@ #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 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index eef80d6088..0156f967b0 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -90,6 +90,7 @@ #define VARIOUS_SET_LAST_USED_ABILITY 41 #define VARIOUS_TRY_HEAL_PULSE 42 #define VARIOUS_TRY_QUASH 43 +#define VARIOUS_INVERT_STAT_STAGES 44 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index abab41bb84..2745146477 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -495,7 +495,9 @@ #define STRINGID_PKMNBLEWAWAYTOXICSPIKES 492 #define STRINGID_PKMNBLEWAWAYSTICKYWEB 493 #define STRINGID_PKMNBLEWAWAYSTEALTHROCK 494 +#define STRINGID_IONDELUGEON 495 +#define STRINGID_TOPSYTURVYSWITCHEDSTATS 496 -#define BATTLESTRINGS_COUNT 506 +#define BATTLESTRINGS_COUNT 516 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index 3db40d970a..74ed8974dc 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -6832,7 +6832,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_ION_DELUGE - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_ION_DELUGE, .power = 0, .type = TYPE_ELECTRIC, .accuracy = 0, @@ -6880,7 +6880,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_FREEZE_DRY - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_FREEZE_DRY, .power = 70, .type = TYPE_ICE, .accuracy = 100, @@ -6916,7 +6916,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_TOPSY_TURVY - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_TOPSY_TURVY, .power = 0, .type = TYPE_DARK, .accuracy = 0, diff --git a/src/battle_message.c b/src/battle_message.c index c8207b0a8d..fbf8f516da 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -633,6 +633,8 @@ static const u8 sText_QuashSuccess[] = _(""); 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_IonDelugeOn[] = _(""); +static const u8 sText_TopsyTurvySwitchedStats[] = _(""); // New selection strings, they must end with "\p". // Use {B_LAST_ITEM} and {B_CURRENT_MOVE}. @@ -1126,6 +1128,8 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_PkmnBlewAwayToxicSpikes, sText_PkmnBlewAwayStickyWeb, sText_PkmnBlewAwayStealthRock, + sText_IonDelugeOn, + sText_TopsyTurvySwitchedStats, }; const u16 gMagicCoatBounceStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index bbb783d795..df89ddd92b 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6430,6 +6430,15 @@ static void atk76_various(void) gBattlescriptCurrInstr += 7; } return; + case VARIOUS_INVERT_STAT_STAGES: + for (i = 0; i < BATTLE_STATS_NO; 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; } gBattlescriptCurrInstr += 3; diff --git a/src/battle_util.c b/src/battle_util.c index 6c190bd798..2f3d1cdede 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -848,6 +848,7 @@ enum ENDTURN_MISTY_TERRAIN, ENDTURN_GRASSY_TERRAIN, ENDTURN_PSYCHIC_TERRAIN, + ENDTURN_ION_DELUGE, ENDTURN_FIELD_COUNT, }; @@ -1257,6 +1258,10 @@ u8 DoFieldEndTurnEffects(void) } gBattleStruct->turnCountersTracker++; break; + case ENDTURN_ION_DELUGE: + gFieldStatuses &= ~(STATUS_FIELD_ION_DELUGE); + gBattleStruct->turnCountersTracker++; + break; case ENDTURN_FIELD_COUNT: effect++; break; @@ -5410,7 +5415,7 @@ static inline void MulByTypeEffectiveness(u16 *modifier, u16 move, u8 moveType, mod = UQ_4_12(1.0); if (moveType == TYPE_PSYCHIC && defType == TYPE_DARK && gStatuses3[battlerDef] & STATUS3_MIRACLE_EYED) mod = UQ_4_12(1.0); - if (move == MOVE_FREEZE_DRY && defType == TYPE_WATER) + 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(1.0); From 065032bf354b3ff4c7afc6f90001aa83167c98d8 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 5 Aug 2018 12:43:57 +0200 Subject: [PATCH 091/667] Moves changing terrains --- asm/macros/battle_script.inc | 5 +++ data/battle_scripts_1.s | 18 ++++++++ include/constants/battle_move_effects.h | 6 ++- include/constants/battle_script_commands.h | 1 + include/constants/battle_string_ids.h | 4 ++ include/data/battle_moves.h | 8 ++-- src/battle_message.c | 19 ++++++++- src/battle_script_commands.c | 49 ++++++++++++++++++++-- 8 files changed, 99 insertions(+), 11 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index debac5acb7..59d98a6c1d 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1444,6 +1444,11 @@ various \battler, VARIOUS_INVERT_STAT_STAGES .endm + .macro setterrain ptr + various BS_ATTACKER, VARIOUS_SET_TERRAIN + .4byte \ptr + .endm + @ helpful macros .macro setstatchanger stat, stages, down setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e8a6f2ad3a..e880bf88bc 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -282,6 +282,24 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectIonDeluge .4byte BattleScript_EffectFreezeDry .4byte BattleScript_EffectTopsyTurvy + .4byte BattleScript_EffectMistyTerrain + .4byte BattleScript_EffectGrassyTerrain + .4byte BattleScript_EffectElectricTerrain + .4byte BattleScript_EffectPsychicTerrain + +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 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index ab05359933..4fb18611a1 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -246,7 +246,7 @@ #define EFFECT_TAILWIND 240 #define EFFECT_EMBARGO 241 #define EFFECT_AQUA_RING 242 -#define EFFECT_TRICK_TOOM 243 +#define EFFECT_TRICK_ROOM 243 #define EFFECT_WONDER_ROOM 244 #define EFFECT_MAGIC_ROOM 245 #define EFFECT_MAGNET_RISE 246 @@ -271,5 +271,9 @@ #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 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 0156f967b0..d301a76605 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -91,6 +91,7 @@ #define VARIOUS_TRY_HEAL_PULSE 42 #define VARIOUS_TRY_QUASH 43 #define VARIOUS_INVERT_STAT_STAGES 44 +#define VARIOUS_SET_TERRAIN 45 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 2745146477..3d78389816 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -497,6 +497,10 @@ #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 BATTLESTRINGS_COUNT 516 diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index 74ed8974dc..fb5ca5b63c 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -5200,7 +5200,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_TRICK_ROOM - .effect = EFFECT_TRICK_TOOM, + .effect = EFFECT_TRICK_ROOM, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -6965,7 +6965,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_GRASSY_TERRAIN - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_GRASSY_TERRAIN, .power = 0, .type = TYPE_GRASS, .accuracy = 0, @@ -6977,7 +6977,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_MISTY_TERRAIN - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_MISTY_TERRAIN, .power = 0, .type = TYPE_FAIRY, .accuracy = 0, @@ -7253,7 +7253,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_ELECTRIC_TERRAIN - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_ELECTRIC_TERRAIN, .power = 0, .type = TYPE_ELECTRIC, .accuracy = 0, diff --git a/src/battle_message.c b/src/battle_message.c index fbf8f516da..4c011cced5 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -628,13 +628,19 @@ static const u8 sText_TargetStatWontGoHigher[] = _("{B_DEF_NAME_WITH_PREFIX}’s 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_StickyWebUsed[] = _(""); -static const u8 sText_QuashSuccess[] = _(""); 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!"); + +// To do. +static const u8 sText_StickyWebUsed[] = _(""); +static const u8 sText_QuashSuccess[] = _(""); static const u8 sText_IonDelugeOn[] = _(""); static const u8 sText_TopsyTurvySwitchedStats[] = _(""); +static const u8 sText_TerrainBecomesMisty[] = _(""); +static const u8 sText_TerrainBecomesGrassy[] = _(""); +static const u8 sText_TerrainBecomesElectric[] = _(""); +static const u8 sText_TerrainBecomesPsychic[] = _(""); // New selection strings, they must end with "\p". // Use {B_LAST_ITEM} and {B_CURRENT_MOVE}. @@ -1130,6 +1136,15 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_PkmnBlewAwayStealthRock, sText_IonDelugeOn, sText_TopsyTurvySwitchedStats, + sText_TerrainBecomesMisty, + sText_TerrainBecomesGrassy, + sText_TerrainBecomesElectric, + sText_TerrainBecomesPsychic, +}; + +const u16 gTerrainStringIds[] = +{ + STRINGID_TERRAINBECOMESMISTY, STRINGID_TERRAINBECOMESGRASSY, STRINGID_TERRAINBECOMESELECTRIC, STRINGID_TERRAINBECOMESPSYCHIC }; const u16 gMagicCoatBounceStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index df89ddd92b..1740d9c389 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6058,6 +6058,44 @@ static bool32 HasAttackerFaintedTarget(void) 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 | EFFECT_ELECTRIC_TERRAIN | EFFECT_PSYCHIC_TERRAIN); + gFieldStatuses |= statusFlag; + *timer = 5; + gBattlescriptCurrInstr += 7; + } +} + static void atk76_various(void) { u8 side; @@ -6439,6 +6477,9 @@ static void atk76_various(void) gBattleMons[gActiveBattler].statStages[i] = 6 - (gBattleMons[gActiveBattler].statStages[i] - 6); } break; + case VARIOUS_SET_TERRAIN: + HandleTerrainMove(gBattleMoves[gCurrentMove].effect); + return; } gBattlescriptCurrInstr += 3; @@ -9289,15 +9330,15 @@ static void HandleRoomMove(u32 statusFlag, u8 *timer, u8 stringId) static void atkD9_setroom(void) { - switch (gCurrentMove) + switch (gBattleMoves[gCurrentMove].effect) { - case MOVE_TRICK_ROOM: + case EFFECT_TRICK_ROOM: HandleRoomMove(STATUS_FIELD_TRICK_ROOM, &gFieldTimers.trickRoomTimer, 0); break; - case MOVE_WONDER_ROOM: + case EFFECT_WONDER_ROOM: HandleRoomMove(STATUS_FIELD_WONDER_ROOM, &gFieldTimers.wonderRoomTimer, 2); break; - case MOVE_MAGIC_ROOM: + case EFFECT_MAGIC_ROOM: HandleRoomMove(STATUS_FIELD_MAGIC_ROOM, &gFieldTimers.magicRoomTimer, 4); break; default: From 5fbeef860ca9dd9bcbf48dce4bf815cdd25a5d46 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 5 Aug 2018 13:39:22 +0200 Subject: [PATCH 092/667] Bulletproof and a couple of new moves --- data/battle_scripts_1.s | 62 ++++++++++++++++++++++++- include/constants/battle_move_effects.h | 3 ++ include/constants/pokemon.h | 1 + include/data/battle_moves.h | 52 ++++++++++----------- src/battle_script_commands.c | 6 +-- src/battle_util.c | 3 +- 6 files changed, 95 insertions(+), 32 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e880bf88bc..8a758e09f1 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -286,7 +286,60 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectGrassyTerrain .4byte BattleScript_EffectElectricTerrain .4byte BattleScript_EffectPsychicTerrain + .4byte BattleScript_EffectAttackAccUp + .4byte BattleScript_EffectAttackSpAttackUp + .4byte BattleScript_EffectHurricane +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_SPATK | BIT_SPDEF, 0x0 + setstatchanger STAT_ATK, 1, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | 0x1, BattleScript_AttackSpAttackUpTrySpDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_AttackSpAttackUpTrySpDef + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_AttackSpAttackUpTrySpDef:: + setstatchanger STAT_SPATK, 1, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | 0x1, 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 | 0x1, 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 | 0x1, 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: @@ -2501,12 +2554,17 @@ BattleScript_SolarbeamOnFirstTurn:: ppreduce goto BattleScript_TwoTurnMovesSecondTurn -BattleScript_EffectThunder:: +BattleScript_EffectThunder: setmoveeffect MOVE_EFFECT_PARALYSIS orword gHitMarker, HITMARKER_IGNORE_ON_AIR goto BattleScript_EffectHit + +BattleScript_EffectHurricane: + setmoveeffect MOVE_EFFECT_CONFUSION + orword gHitMarker, HITMARKER_IGNORE_ON_AIR + goto BattleScript_EffectHit -BattleScript_EffectTeleport:: +BattleScript_EffectTeleport: attackcanceler attackstring ppreduce diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 4fb18611a1..6f20a8f1b9 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -275,5 +275,8 @@ #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 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 5dd095c790..a0900fff0f 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -96,6 +96,7 @@ #define FLAG_DMG_UNDERGROUND 0x4000 #define FLAG_DMG_UNDERWATER 0x8000 #define FLAG_SOUND 0x10000 +#define FLAG_BALLISTIC 0x20000 // Split defines. #define SPLIT_PHYSICAL 0x0 diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index fb5ca5b63c..970f2f5a86 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -1464,7 +1464,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -1692,7 +1692,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -2268,7 +2268,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_BALLISTIC, .split = SPLIT_SPECIAL, }, { // MOVE_MUD_SLAP @@ -2292,7 +2292,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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, .split = SPLIT_SPECIAL, }, { // MOVE_SPIKES @@ -2316,7 +2316,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_BALLISTIC, .split = SPLIT_SPECIAL, }, { // MOVE_FORESIGHT @@ -2976,7 +2976,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_BALLISTIC, .split = SPLIT_SPECIAL, }, { // MOVE_FUTURE_SIGHT @@ -3564,7 +3564,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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, .split = SPLIT_SPECIAL, }, { // MOVE_FEATHER_DANCE @@ -3624,7 +3624,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -3744,7 +3744,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -3984,7 +3984,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -4212,7 +4212,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 @@ -4332,7 +4332,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_HEALING_WISH @@ -4764,7 +4764,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_MEGA_LAUNCHER_BOOST, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_MEGA_LAUNCHER_BOOST | FLAG_BALLISTIC, .split = SPLIT_SPECIAL, }, { // MOVE_ROCK_POLISH @@ -4944,7 +4944,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_BALLISTIC, .split = SPLIT_SPECIAL, }, { // MOVE_ENERGY_BALL @@ -4956,7 +4956,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_BALLISTIC, .split = SPLIT_SPECIAL, }, { // MOVE_BRAVE_BIRD @@ -5124,7 +5124,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_BALLISTIC, .split = SPLIT_SPECIAL, }, { // MOVE_PSYCHO_CUT @@ -5280,7 +5280,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_CROSS_POISON @@ -5328,7 +5328,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_STONE_EDGE @@ -5620,7 +5620,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_HONE_CLAWS - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_ATTACK_ACCURACY_UP, .power = 0, .type = TYPE_DARK, .accuracy = 0, @@ -5844,7 +5844,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_SOAK @@ -5904,7 +5904,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_BALLISTIC, .split = SPLIT_SPECIAL, }, { // MOVE_FOUL_PLAY @@ -6316,7 +6316,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_WORK_UP - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_ATTACK_SPATK_UP, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -6424,7 +6424,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_HEAT_CRASH - .effect = EFFECT_HEAT_CRASH, // Needs a custom move effect (maybe the same as heavy slam?) + .effect = EFFECT_HEAT_CRASH, .power = 1, .type = TYPE_FIRE, .accuracy = 100, @@ -6508,7 +6508,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_HURRICANE - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_HURRICANE, .power = 110, .type = TYPE_FLYING, .accuracy = 70, @@ -6544,7 +6544,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_SEARING_SHOT - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (30% burn, does not affect opponents with BULLETPROOF) + .effect = EFFECT_BURN_HIT, .power = 100, .type = TYPE_FIRE, .accuracy = 100, @@ -6552,7 +6552,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .secondaryEffectChance = 30, .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_BALLISTIC, .split = SPLIT_SPECIAL, }, { // MOVE_TECHNO_BLAST diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1740d9c389..dcdb39c3a5 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1137,7 +1137,7 @@ static bool32 AccuracyCalcHelper(u16 move) gHitMarker &= ~HITMARKER_IGNORE_UNDERWATER; - if ((WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_RAIN_ANY) && gBattleMoves[move].effect == EFFECT_THUNDER) + if ((WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_RAIN_ANY) && (gBattleMoves[move].effect == EFFECT_THUNDER || gBattleMoves[move].effect == EFFECT_HURRICANE)) || (gBattleMoves[move].effect == EFFECT_ALWAYS_HIT || gBattleMoves[move].effect == EFFECT_VITAL_THROW)) { JumpIfMoveFailed(7, move); @@ -1199,8 +1199,8 @@ static void atk01_accuracycheck(void) buff = 0xC; moveAcc = gBattleMoves[move].accuracy; - // Check Thunder on sunny weather. - if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY && gBattleMoves[move].effect == EFFECT_THUNDER) + // 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) diff --git a/src/battle_util.c b/src/battle_util.c index 2f3d1cdede..3c03ae4f7c 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2822,7 +2822,8 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } break; case ABILITYEFFECT_MOVES_BLOCK: // 2 - if (gLastUsedAbility == ABILITY_SOUNDPROOF && gBattleMoves[move].flags & FLAG_SOUND) + 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; From de85f88bbbe2994723082b540502b480a21e38a9 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 5 Aug 2018 13:57:37 +0200 Subject: [PATCH 093/667] Support for two typed moves. --- data/battle_scripts_1.s | 2 + include/constants/battle_move_effects.h | 1 + include/data/battle_moves.h | 3 +- src/battle_util.c | 67 ++++++++++++++----------- 4 files changed, 43 insertions(+), 30 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 8a758e09f1..484fbb96b9 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -289,6 +289,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectAttackAccUp .4byte BattleScript_EffectAttackSpAttackUp .4byte BattleScript_EffectHurricane + .4byte BattleScript_EffectTwoTypedMove BattleScript_EffectAttackSpAttackUp: attackcanceler @@ -847,6 +848,7 @@ BattleScript_EffectPsyshock: BattleScript_EffectWeatherBall: BattleScript_EffectHiddenPower: BattleScript_EffectFreezeDry: +BattleScript_EffectTwoTypedMove: jumpifnotmove MOVE_SURF, BattleScript_HitFromAtkCanceler jumpifnostatus3 BS_TARGET, STATUS3_UNDERWATER, BattleScript_HitFromAtkCanceler orword gHitMarker, HITMARKER_IGNORE_UNDERWATER diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 6f20a8f1b9..37f79c14e1 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -278,5 +278,6 @@ #define EFFECT_ATTACK_ACCURACY_UP 272 #define EFFECT_ATTACK_SPATK_UP 273 #define EFFECT_HURRICANE 274 +#define EFFECT_TWO_TYPED_MOVE 275 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index 970f2f5a86..bfeaa8ca8e 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -6724,7 +6724,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_FLYING_PRESS - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_TWO_TYPED_MOVE, .power = 100, .type = TYPE_FIGHTING, .accuracy = 95, @@ -6734,6 +6734,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_PLACEHOLDER, // Needs a custom move effect diff --git a/src/battle_util.c b/src/battle_util.c index 3c03ae4f7c..9a49d60a6d 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5447,41 +5447,50 @@ static void UpdateMoveResultFlags(u16 modifier) } } +static u16 CalcTypeEffectivenessMultiplierInternal(u16 move, u8 moveType, u8 battlerAtk, u8 battlerDef, bool32 recordAbilities, u16 modifier) +{ + u32 atkAbility = GetBattlerAbility(battlerAtk); + MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, gBattleMons[battlerDef].type1, atkAbility); + if (gBattleMons[battlerDef].type2 != gBattleMons[battlerDef].type1) + MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, gBattleMons[battlerDef].type2, atkAbility); + + 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] = moveType; + 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) { - u32 atkAbility = GetBattlerAbility(battlerAtk); - MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, gBattleMons[battlerDef].type1, atkAbility); - if (gBattleMons[battlerDef].type2 != gBattleMons[battlerDef].type1) - MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, gBattleMons[battlerDef].type2, atkAbility); - - 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] = moveType; - 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); - } - } + 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); } UpdateMoveResultFlags(modifier); From d230d986fabd5388e99670f61452970e0663f0f4 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 5 Aug 2018 16:43:07 +0200 Subject: [PATCH 094/667] Me First. --- asm/macros/battle_script.inc | 5 ++++ data/battle_scripts_1.s | 11 ++++++++ include/constants/battle_move_effects.h | 1 + include/constants/battle_script_commands.h | 1 + include/data/battle_moves.h | 2 +- src/battle_script_commands.c | 32 ++++++++++++++++++++++ 6 files changed, 51 insertions(+), 1 deletion(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 59d98a6c1d..94f9bb4333 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1449,6 +1449,11 @@ .4byte \ptr .endm + .macro trymefirst ptr + various BS_ATTACKER, VARIOUS_TRY_ME_FIRST + .4byte \ptr + .endm + @ helpful macros .macro setstatchanger stat, stages, down setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 484fbb96b9..df19350939 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -290,6 +290,17 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectAttackSpAttackUp .4byte BattleScript_EffectHurricane .4byte BattleScript_EffectTwoTypedMove + .4byte BattleScript_EffectMeFirst + +BattleScript_EffectMeFirst: + attackcanceler + attackstring + trymefirst BattleScript_ButItFailedPpReduce + attackanimation + waitanimation + setbyte sB_ANIM_TURN, 0x0 + setbyte sB_ANIM_TARGETS_HIT, 0x0 + jumptorandomattack TRUE BattleScript_EffectAttackSpAttackUp: attackcanceler diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 37f79c14e1..8bc7acad6b 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -279,5 +279,6 @@ #define EFFECT_ATTACK_SPATK_UP 273 #define EFFECT_HURRICANE 274 #define EFFECT_TWO_TYPED_MOVE 275 +#define EFFECT_ME_FIRST 276 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index d301a76605..bfff72ea81 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -92,6 +92,7 @@ #define VARIOUS_TRY_QUASH 43 #define VARIOUS_INVERT_STAT_STAGES 44 #define VARIOUS_SET_TERRAIN 45 +#define VARIOUS_TRY_ME_FIRST 46 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index bfeaa8ca8e..3f826c00cc 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -4588,7 +4588,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_ME_FIRST - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_ME_FIRST, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index dcdb39c3a5..1b0e7d327a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4265,6 +4265,7 @@ static void atk49_moveend(void) case 17: // Clear bits active just while using a move. gProtectStructs[gBattlerAttacker].usesBouncedMove = 0; gBattleStruct->ateBoost[gBattlerAttacker] = 0; + gStatuses3[gBattlerAttacker] &= ~(STATUS3_ME_FIRST); gBattleScripting.atk49_state++; break; case ATK49_LAST_CASE: @@ -6480,6 +6481,37 @@ static void atk76_various(void) 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: + gRandomMove = move; + gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); + gBattlerTarget = GetMoveTarget(gRandomMove, 0); + gStatuses3[gBattlerAttacker] |= STATUS3_ME_FIRST; + gBattlescriptCurrInstr += 7; + break; + } + } + return; } gBattlescriptCurrInstr += 3; From 674d35861c73797017afd3549974506438a8c9b9 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 11 Aug 2018 12:16:00 +0200 Subject: [PATCH 095/667] Couple bug fixes --- asm/macros/battle_ai_script.inc | 21 +++++++--- asm/macros/battle_script.inc | 5 +++ data/battle_ai_scripts.s | 4 +- data/battle_scripts_1.s | 21 ++++++---- data/battle_scripts_2.s | 1 + include/battle_util.h | 2 +- include/constants/battle_move_effects.h | 3 +- include/constants/battle_script_commands.h | 1 + include/data/battle_moves.h | 8 ++-- src/battle_ai_script_commands.c | 48 +++++++++++++++------- src/battle_main.c | 5 ++- src/battle_script_commands.c | 11 ++++- src/battle_util.c | 6 ++- 13 files changed, 95 insertions(+), 41 deletions(-) diff --git a/asm/macros/battle_ai_script.inc b/asm/macros/battle_ai_script.inc index bc6e3e5a06..2e2b54c579 100644 --- a/asm/macros/battle_ai_script.inc +++ b/asm/macros/battle_ai_script.inc @@ -469,8 +469,8 @@ .macro if_move_flag flag jumpptr .byte 0x52 - .hword \flag - .word \jumpptr + .2byte \flag + .4byte \jumpptr .endm .macro if_field_status flag jumpptr @@ -479,16 +479,20 @@ .word \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 + .2byte \flag + .4byte \ptr .endm .macro nullsub_57 @@ -621,3 +625,8 @@ .macro if_any_move_encored bank, ptr if_any_move_disabled_or_encored \bank, 1, \ptr .endm + + .macro call_if_always_hit ptr + get_move_accuracy + call_if_eq 0, \ptr + .endm diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 94f9bb4333..3ae02e6ac4 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1454,6 +1454,11 @@ .4byte \ptr .endm + .macro jumpifbattleend ptr + various BS_ATTACKER, VARIOUS_JUMP_IF_BATTLE_END + .4byte \ptr + .endm + @ helpful macros .macro setstatchanger stat, stages, down setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7 diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 502a3028ad..d0e580459c 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -656,6 +656,8 @@ Score_Plus10: AI_TryToFaint: if_target_is_ally AI_Ret + call_if_always_hit AI_CV_AlwaysHit + call_if_move_flag FLAG_HIGH_CRIT, AI_CV_HighCrit if_effect EFFECT_HIT, AI_CV_Hit if_effect EFFECT_SLEEP, AI_CV_Sleep if_effect EFFECT_ABSORB, AI_CV_Absorb @@ -669,7 +671,6 @@ AI_TryToFaint: 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 @@ -779,7 +780,6 @@ AI_TryToFaint: end AI_CV_Hit: - if_move_flag FLAG_HIGH_CRIT AI_CV_HighCrit end AI_CV_Sleep: @ 82DCA92 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index df19350939..8caab496b9 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -31,7 +31,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectSpecialDefenseUp .4byte BattleScript_EffectAccuracyUp .4byte BattleScript_EffectEvasionUp - .4byte BattleScript_EffectAlwaysHit + .4byte BattleScript_EffectUnused17 .4byte BattleScript_EffectAttackDown .4byte BattleScript_EffectDefenseDown .4byte BattleScript_EffectSpeedDown @@ -291,6 +291,11 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectHurricane .4byte BattleScript_EffectTwoTypedMove .4byte BattleScript_EffectMeFirst + .4byte BattleScript_EffectSpeedUpHit + +BattleScript_EffectSpeedUpHit: + setmoveeffect MOVE_EFFECT_SPD_PLUS_1 | MOVE_EFFECT_AFFECTS_USER + goto BattleScript_EffectHit BattleScript_EffectMeFirst: attackcanceler @@ -794,7 +799,7 @@ BattleScript_EffectHitEscape: tryfaintmon BS_TARGET, FALSE, NULL setbyte sMOVEEND_STATE, 0x0 moveend 0x0, 0x0 - atk24 BattleScript_HitEscapeEnd + jumpifbattleend BattleScript_HitEscapeEnd jumpifbyte CMP_NOT_EQUAL gBattleOutcome 0 BattleScript_HitEscapeEnd jumpifcantswitch ATK4F_DONT_CHECK_STATUSES | BS_ATTACKER, BattleScript_HitEscapeEnd openpartyscreen 0x1, BattleScript_HitEscapeEnd @@ -817,7 +822,7 @@ BattleScript_EffectPlaceholder: printstring STRINGID_NOTDONEYET goto BattleScript_MoveEnd -BattleScript_EffectAlwaysHit: +BattleScript_EffectUnused17: BattleScript_EffectEvasionDownHit: BattleScript_EffectVitalThrow: BattleScript_EffectUnused60: @@ -1671,7 +1676,7 @@ BattleScript_EffectPoison:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectParalyze:: +BattleScript_EffectParalyze: attackcanceler attackstring ppreduce @@ -1684,6 +1689,7 @@ BattleScript_EffectParalyze:: jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected + bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE attackanimation waitanimation setmoveeffect MOVE_EFFECT_PARALYSIS @@ -1692,7 +1698,7 @@ BattleScript_EffectParalyze:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_AlreadyParalyzed:: +BattleScript_AlreadyParalyzed: various23 BS_ATTACKER pause 0x20 printstring STRINGID_PKMNISALREADYPARALYZED @@ -2219,11 +2225,12 @@ 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 diff --git a/data/battle_scripts_2.s b/data/battle_scripts_2.s index 564fda2612..aeee5f1c77 100644 --- a/data/battle_scripts_2.s +++ b/data/battle_scripts_2.s @@ -128,6 +128,7 @@ BattleScript_OpponentUsesHealItem:: playse SE_KAIFUKU printstring STRINGID_TRAINER1USEDITEM waitmessage 0x40 + bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT useitemonopponent orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_ATTACKER diff --git a/include/battle_util.h b/include/battle_util.h index e25fbb5425..5ebc01f17f 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -60,7 +60,7 @@ u8 DoFieldEndTurnEffects(void); u8 DoBattlerEndTurnEffects(void); bool8 HandleWishPerishSongOnTurnEnd(void); bool8 HandleFaintedMonActions(void); -void TryClearRageStatuses(void); +void TryClearRageAndFuryCutter(void); u8 AtkCanceller_UnableToUseMove(void); bool8 HasNoMonsToSwitch(u8 battlerId, u8 r1, u8 r2); u8 CastformDataTypeChange(u8 battlerId); diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 8bc7acad6b..488aca722c 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -18,7 +18,7 @@ #define EFFECT_SPECIAL_DEFENSE_UP 14 #define EFFECT_ACCURACY_UP 15 #define EFFECT_EVASION_UP 16 -#define EFFECT_ALWAYS_HIT 17 +#define EFFECT_UNUSED_17 17 #define EFFECT_ATTACK_DOWN 18 #define EFFECT_DEFENSE_DOWN 19 #define EFFECT_SPEED_DOWN 20 @@ -280,5 +280,6 @@ #define EFFECT_HURRICANE 274 #define EFFECT_TWO_TYPED_MOVE 275 #define EFFECT_ME_FIRST 276 +#define EFFECT_SPEED_UP_HIT 277 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index bfff72ea81..f360635d75 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -93,6 +93,7 @@ #define VARIOUS_INVERT_STAT_STAGES 44 #define VARIOUS_SET_TERRAIN 45 #define VARIOUS_TRY_ME_FIRST 46 +#define VARIOUS_JUMP_IF_BATTLE_END 47 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index 3f826c00cc..f251d5fa99 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -1669,7 +1669,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, - .split = SPLIT_PHYSICAL, + .split = SPLIT_SPECIAL, }, { // MOVE_POISON_GAS .effect = EFFECT_POISON, @@ -2323,7 +2323,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .effect = EFFECT_FORESIGHT, .power = 0, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = 40, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, @@ -3799,7 +3799,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .effect = EFFECT_FORESIGHT, .power = 0, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = 40, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, @@ -5860,7 +5860,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_FLAME_CHARGE - .effect = EFFECT_SPEED_UP, + .effect = EFFECT_SPEED_UP_HIT, .power = 50, .type = TYPE_FIRE, .accuracy = 100, diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 41d740e802..53e5e4c23c 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -138,9 +138,9 @@ static void BattleAICmd_get_move_effect_from_result(void); static void BattleAICmd_get_protect_count(void); static void BattleAICmd_if_move_flag(void); static void BattleAICmd_if_field_status(void); -static void BattleAICmd_nullsub_54(void); -static void BattleAICmd_nullsub_55(void); -static void BattleAICmd_nullsub_56(void); +static void BattleAICmd_get_move_accuracy(void); +static void BattleAICmd_call_if_eq(void); +static void BattleAICmd_call_if_move_flag(void); static void BattleAICmd_nullsub_57(void); static void BattleAICmd_call(void); static void BattleAICmd_goto(void); @@ -247,9 +247,9 @@ static const BattleAICmdFunc sBattleAICmdTable[] = BattleAICmd_get_protect_count, // 0x51 BattleAICmd_if_move_flag, // 0x52 BattleAICmd_if_field_status, // 0x53 - BattleAICmd_nullsub_54, // 0x54 - BattleAICmd_nullsub_55, // 0x55 - BattleAICmd_nullsub_56, // 0x56 + BattleAICmd_get_move_accuracy, // 0x54 + BattleAICmd_call_if_eq, // 0x55 + BattleAICmd_call_if_move_flag, // 0x56 BattleAICmd_nullsub_57, // 0x57 BattleAICmd_call, // 0x58 BattleAICmd_goto, // 0x59 @@ -2255,12 +2255,7 @@ static void BattleAICmd_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; } @@ -2320,16 +2315,39 @@ static void BattleAICmd_if_field_status(void) gAIScriptPtr += 9; } -static void BattleAICmd_nullsub_54(void) +static void BattleAICmd_get_move_accuracy(void) { + AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].accuracy; + + gAIScriptPtr++; } -static void BattleAICmd_nullsub_55(void) +static void BattleAICmd_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 BattleAICmd_nullsub_56(void) +static void BattleAICmd_call_if_move_flag(void) { + u16 flag = T1_READ_16(gAIScriptPtr + 1); + + if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].flags & flag) + { + AIStackPushVar(gAIScriptPtr + 7); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); + } + else + { + gAIScriptPtr += 7; + } } static void BattleAICmd_nullsub_57(void) diff --git a/src/battle_main.c b/src/battle_main.c index 837eebf9a6..153f618a30 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3008,6 +3008,9 @@ static void BattleStartClearSetData(void) gPalaceSelectionBattleScripts[i] = 0; } + gFieldStatuses = 0; + memset(&gFieldTimers, 0, sizeof(gFieldTimers)); + for (i = 0; i < 2; i++) { gSideStatuses[i] = 0; @@ -4960,7 +4963,7 @@ static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void) } } - TryClearRageStatuses(); + TryClearRageAndFuryCutter(); gCurrentTurnActionNumber = 0; gCurrentActionFuncId = gActionsByTurnOrder[0]; gBattleStruct->dynamicMoveType = 0; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1b0e7d327a..0499cf40d0 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1138,7 +1138,8 @@ static bool32 AccuracyCalcHelper(u16 move) gHitMarker &= ~HITMARKER_IGNORE_UNDERWATER; if ((WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_RAIN_ANY) && (gBattleMoves[move].effect == EFFECT_THUNDER || gBattleMoves[move].effect == EFFECT_HURRICANE)) - || (gBattleMoves[move].effect == EFFECT_ALWAYS_HIT || gBattleMoves[move].effect == EFFECT_VITAL_THROW)) + || (gBattleMoves[move].effect == EFFECT_VITAL_THROW) + || (gBattleMoves[move].accuracy == 0)) { JumpIfMoveFailed(7, move); return TRUE; @@ -1154,7 +1155,7 @@ static void atk01_accuracycheck(void) if (move == ACC_CURR_MOVE) move = gCurrentMove; - if (move == NO_ACC_CALC_CHECK_LOCK_ON || gBattleMoves[move].accuracy == 0) + if (move == NO_ACC_CALC_CHECK_LOCK_ON) { if (gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker) gBattlescriptCurrInstr += 7; @@ -6512,6 +6513,12 @@ static void atk76_various(void) } } return; + case VARIOUS_JUMP_IF_BATTLE_END: + if (IsBattleLostForPlayer() || IsBattleWonForPlayer()) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else + gBattlescriptCurrInstr += 7; + return; } gBattlescriptCurrInstr += 3; diff --git a/src/battle_util.c b/src/battle_util.c index 9a49d60a6d..f6cfaecf82 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1945,13 +1945,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; } } @@ -5008,7 +5010,7 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b else atkStat = gBattleMons[battlerAtk].spAttack; - atkStage = gBattleMons[battlerAtk].statStages[STAT_ATK]; + atkStage = gBattleMons[battlerAtk].statStages[STAT_SPATK]; } // critical hits ignore attack stat's stage drops From e259000dc37257c97d8217d8290be817d1a14bb5 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 11 Aug 2018 12:29:01 +0200 Subject: [PATCH 096/667] Coil and Quiver Dance --- data/battle_scripts_1.s | 66 +++++++++++++++++++++++++ include/constants/battle_move_effects.h | 2 + include/data/battle_moves.h | 20 ++++---- 3 files changed, 78 insertions(+), 10 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 8caab496b9..31662bbd86 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -292,6 +292,72 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectTwoTypedMove .4byte BattleScript_EffectMeFirst .4byte BattleScript_EffectSpeedUpHit + .4byte BattleScript_EffectQuiverDance + .4byte BattleScript_EffectCoil + +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_SPATK | BIT_SPDEF | BIT_SPEED, 0x0 + setstatchanger STAT_ATK, 1, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | 0x1, 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 | 0x1, 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 | 0x1, 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 | 0x1, 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 | 0x1, 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 | 0x1, 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 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 488aca722c..c1fa0fdd17 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -281,5 +281,7 @@ #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 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index f251d5fa99..9c346c0212 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -1552,7 +1552,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_SWIFT - .effect = EFFECT_ALWAYS_HIT, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_NORMAL, .accuracy = 0, @@ -2224,7 +2224,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_FAINT_ATTACK - .effect = EFFECT_ALWAYS_HIT, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_DARK, .accuracy = 0, @@ -3904,7 +3904,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_SHADOW_PUNCH - .effect = EFFECT_ALWAYS_HIT, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_GHOST, .accuracy = 0, @@ -3988,7 +3988,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_AERIAL_ACE - .effect = EFFECT_ALWAYS_HIT, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_FLYING, .accuracy = 0, @@ -4144,7 +4144,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_MAGICAL_LEAF - .effect = EFFECT_ALWAYS_HIT, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_GRASS, .accuracy = 0, @@ -4216,7 +4216,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_SHOCK_WAVE - .effect = EFFECT_ALWAYS_HIT, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_ELECTRIC, .accuracy = 0, @@ -4756,7 +4756,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_AURA_SPHERE - .effect = EFFECT_ALWAYS_HIT, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_FIGHTING, .accuracy = 0, @@ -5320,7 +5320,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_MAGNET_BOMB - .effect = EFFECT_ALWAYS_HIT, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_STEEL, .accuracy = 0, @@ -5800,7 +5800,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_QUIVER_DANCE - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_QUIVER_DANCE, .power = 0, .type = TYPE_BUG, .accuracy = 0, @@ -5872,7 +5872,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_COIL - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_COIL, .power = 0, .type = TYPE_POISON, .accuracy = 0, From 4cb1e880daa66d0af8563457f1ab06d0728f2600 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 11 Aug 2018 13:30:34 +0200 Subject: [PATCH 097/667] Reflect Type and SOAK --- asm/macros/battle_script.inc | 15 +++++++ data/battle_scripts_1.s | 44 ++++++++++++++++++ include/constants/battle_move_effects.h | 4 ++ include/constants/battle_script_commands.h | 3 ++ include/constants/battle_string_ids.h | 1 + include/constants/species.h | 2 + include/data/battle_moves.h | 8 ++-- src/battle_message.c | 2 + src/battle_script_commands.c | 52 +++++++++++++++++++++- 9 files changed, 126 insertions(+), 5 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 3ae02e6ac4..6a2e678695 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1459,6 +1459,21 @@ .4byte \ptr .endm + .macro tryelectrify ptr + various BS_ATTACKER, VARIOUS_TRY_ELECTRIFY + .4byte \ptr + .endm + + .macro tryreflecttype ptr + various BS_ATTACKER, VARIOUS_TRY_REFLECT_TYPE + .4byte \ptr + .endm + + .macro trysoak ptr + various BS_ATTACKER, VARIOUS_TRY_SOAK + .4byte \ptr + .endm + @ helpful macros .macro setstatchanger stat, stages, down setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 31662bbd86..7fdd567e1f 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -294,6 +294,49 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectSpeedUpHit .4byte BattleScript_EffectQuiverDance .4byte BattleScript_EffectCoil + .4byte BattleScript_EffectElectrify + .4byte BattleScript_EffectScald + .4byte BattleScript_EffectReflectType + .4byte BattleScript_EffectSoak + +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_EffectCoil: attackcanceler @@ -1056,6 +1099,7 @@ BattleScript_AbsorbTryFainting:: BattleScript_EffectBurnHit:: BattleScript_EffectBlazeKick:: +BattleScript_EffectScald: setmoveeffect MOVE_EFFECT_BURN goto BattleScript_EffectHit diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index c1fa0fdd17..37f97c9a7b 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -283,5 +283,9 @@ #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 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index f360635d75..7ece2db4d8 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -94,6 +94,9 @@ #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 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 3d78389816..cdb0f34b0a 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -501,6 +501,7 @@ #define STRINGID_TERRAINBECOMESGRASSY 498 #define STRINGID_TERRAINBECOMESELECTRIC 499 #define STRINGID_TERRAINBECOMESPSYCHIC 500 +#define STRINGID_TARGETELECTRIFIED 501 #define BATTLESTRINGS_COUNT 516 diff --git a/include/constants/species.h b/include/constants/species.h index 115ea03577..ed25ef15ac 100644 --- a/include/constants/species.h +++ b/include/constants/species.h @@ -452,5 +452,7 @@ #define SPECIES_PALKIA 0 #define SPECIES_GIRATINA 0 #define SPECIES_CHERRIM 0 +#define SPECIES_ARCEUS 0 +#define SPECIES_SILVALLY 0 #endif // GUARD_CONSTANTS_SPECIES_H diff --git a/include/data/battle_moves.h b/include/data/battle_moves.h index 9c346c0212..c21f1b546b 100644 --- a/include/data/battle_moves.h +++ b/include/data/battle_moves.h @@ -5848,7 +5848,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_SOAK - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_SOAK, .power = 0, .type = TYPE_WATER, .accuracy = 100, @@ -6040,7 +6040,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_SCALD - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (30% burn + always thaws ice even if it misses) + .effect = EFFECT_SCALD, .power = 80, .type = TYPE_WATER, .accuracy = 100, @@ -6160,7 +6160,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_REFLECT_TYPE - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_REFLECT_TYPE, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -6990,7 +6990,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_ELECTRIFY - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_ELECTRIFY, .power = 0, .type = TYPE_ELECTRIC, .accuracy = 0, diff --git a/src/battle_message.c b/src/battle_message.c index 4c011cced5..62c31e736e 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -641,6 +641,7 @@ static const u8 sText_TerrainBecomesMisty[] = _(""); static const u8 sText_TerrainBecomesGrassy[] = _(""); static const u8 sText_TerrainBecomesElectric[] = _(""); static const u8 sText_TerrainBecomesPsychic[] = _(""); +static const u8 sText_TargetElectrified[] = _(""); // New selection strings, they must end with "\p". // Use {B_LAST_ITEM} and {B_CURRENT_MOVE}. @@ -1140,6 +1141,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_TerrainBecomesGrassy, sText_TerrainBecomesElectric, sText_TerrainBecomesPsychic, + sText_TargetElectrified, }; const u16 gTerrainStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 0499cf40d0..70915e1621 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4039,7 +4039,7 @@ static void atk49_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; @@ -6519,6 +6519,56 @@ static void atk76_various(void) 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; } gBattlescriptCurrInstr += 3; From 5bb3af11bde60d7f2f6575b214a9655902bae2ac Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sat, 11 Aug 2018 13:53:10 -0300 Subject: [PATCH 098/667] Update battle_message.c Added strings for Sticky Web, Quash, Ion Deluge, Topsy-Turby, Misty Terrain, Grassy Terrain, Electric Terrain, Psychic Terrain, Electrify, Assault Vest, Gravity and Heal Block. --- src/battle_message.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/battle_message.c b/src/battle_message.c index 62c31e736e..38613cf753 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -633,21 +633,21 @@ static const u8 sText_PkmnBlewAwayStickyWeb[] = _("{B_ATK_NAME_WITH_PREFIX} blew static const u8 sText_PkmnBlewAwayStealthRock[] = _("{B_ATK_NAME_WITH_PREFIX} blew away\nSTEALTH ROCK!"); // To do. -static const u8 sText_StickyWebUsed[] = _(""); -static const u8 sText_QuashSuccess[] = _(""); -static const u8 sText_IonDelugeOn[] = _(""); -static const u8 sText_TopsyTurvySwitchedStats[] = _(""); -static const u8 sText_TerrainBecomesMisty[] = _(""); -static const u8 sText_TerrainBecomesGrassy[] = _(""); -static const u8 sText_TerrainBecomesElectric[] = _(""); -static const u8 sText_TerrainBecomesPsychic[] = _(""); -static const u8 sText_TargetElectrified[] = _(""); +static const u8 sText_StickyWebUsed[] = _("A sticky web spreads out on the\nground around your 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_ATK_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 opposing {B_ATK_NAME_WITH_PREFIX}’s moves\nhave been electrified!"); // New selection strings, they must end with "\p". // Use {B_LAST_ITEM} and {B_CURRENT_MOVE}. -static const u8 sText_AssaultVestDoesntAllow[] = _("\p"); -static const u8 sText_GravityPreventsUsage[] = _("\p"); -static const u8 sText_HealBlockPreventsUsage[] = _("\p"); +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_SCR_ACTIVE_NAME_WITH_PREFIX} can’t use {B_CURRENT_MOVE}\nbecause of gravity!\p"); +static const u8 sText_HealBlockPreventsUsage[] = _("The opposing {B_ATK_NAME_WITH_PREFIX} was\nprevented from healing!\p"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { From f3e5c488a362d6db05514f03015cd4fb7aab2e4b Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 1 Sep 2018 17:36:09 +0200 Subject: [PATCH 099/667] DONT SPAM HELPING HAND IN DOUBLES --- asm/macros/battle_ai_script.inc | 10 +++++++ data/battle_ai_scripts.s | 29 ++++++++++++++++++++- src/battle_ai_script_commands.c | 46 ++++++++++++++++++++++++++++++++- src/data/trainers.h | 2 +- 4 files changed, 84 insertions(+), 3 deletions(-) diff --git a/asm/macros/battle_ai_script.inc b/asm/macros/battle_ai_script.inc index 2e2b54c579..b91f518fdb 100644 --- a/asm/macros/battle_ai_script.inc +++ b/asm/macros/battle_ai_script.inc @@ -559,6 +559,16 @@ .4byte \param2 .endm + .macro get_ally_chosen_move bank + .byte 0x63 + .endm + + .macro if_has_no_attacking_moves bank, param1 + .byte 0x64 + .byte \bank + .4byte \param1 + .endm + @ useful script macros .macro get_curr_move_type get_type AI_TYPE_MOVE diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index d0e580459c..1c86dbd286 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -2943,8 +2943,35 @@ BattleAIScript_82DDF7B: BattleAIScript_82DDFB3: end - + +AI_ConsiderAllyChosenMove: + get_ally_chosen_move + if_equal 0, AI_ConsiderAllyChosenMoveRet + get_move_effect_from_result + if_equal EFFECT_HELPING_HAND, AI_PartnerChoseHelpingHand +AI_ConsiderAllyChosenMoveRet: + end + +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_Minus3 + 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 + end + +AI_HelpingHandInDoubles: + if_has_no_attacking_moves AI_USER_PARTNER, Score_Minus3 + end + AI_DoubleBattle: + call AI_ConsiderAllyChosenMove + call AI_ConsiderAllyKnownMoves if_target_is_ally AI_TryOnAlly if_move MOVE_SKILL_SWAP, BattleAIScript_82DE04B get_curr_move_type diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 53e5e4c23c..0817bbca01 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -153,6 +153,8 @@ static void BattleAICmd_is_of_type(void); static void BattleAICmd_if_target_is_ally(void); static void BattleAICmd_if_flash_fired(void); static void BattleAICmd_if_holds_item(void); +static void BattleAICmd_get_ally_chosen_move(void); +static void BattleAICmd_if_has_no_attacking_moves(void); // ewram EWRAM_DATA const u8 *gAIScriptPtr = NULL; @@ -262,6 +264,8 @@ static const BattleAICmdFunc sBattleAICmdTable[] = BattleAICmd_check_ability, // 0x60 BattleAICmd_if_flash_fired, // 0x61 BattleAICmd_if_holds_item, // 0x62 + BattleAICmd_get_ally_chosen_move, // 0x63 + BattleAICmd_if_has_no_attacking_moves, // 0x64 }; static const u16 sDiscouragedPowerfulMoveEffects[] = @@ -379,7 +383,7 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves) else AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent_A].aiFlags; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE || gTrainers[gTrainerBattleOpponent_A].doubleBattle) AI_THINKING_STRUCT->aiFlags |= AI_SCRIPT_DOUBLE_BATTLE; // Act smart in doubles and don't attack your partner. gBattleStruct->debugAIFlags = AI_THINKING_STRUCT->aiFlags; @@ -2453,3 +2457,43 @@ static bool8 AIStackPop(void) return FALSE; } } + +static void BattleAICmd_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 BattleAICmd_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].moves[i] != 0 && gBattleMoves[BATTLE_HISTORY->usedMoves[battlerId].moves[i]].power != 0) + break; + } + } + + if (i == 4) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + else + gAIScriptPtr += 5; +} diff --git a/src/data/trainers.h b/src/data/trainers.h index 19e210acc0..9e16629954 100644 --- a/src/data/trainers.h +++ b/src/data/trainers.h @@ -4249,7 +4249,7 @@ const struct Trainer gTrainers[] = { .trainerPic = TRAINER_PIC_WINSTRATE_F, .trainerName = _("ISABEL"), .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, - .doubleBattle = FALSE, + .doubleBattle = 1, .aiFlags = 0x1, .partySize = 2, .party = {.ItemDefaultMoves = gTrainerParty_Isabel2 } From 7ba59334d0fb29f7620cb0a98e4d7d65c9f3a8a6 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 1 Sep 2018 17:40:49 +0200 Subject: [PATCH 100/667] Revert testing trainer --- src/data/trainers.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/trainers.h b/src/data/trainers.h index 9e16629954..19e210acc0 100644 --- a/src/data/trainers.h +++ b/src/data/trainers.h @@ -4249,7 +4249,7 @@ const struct Trainer gTrainers[] = { .trainerPic = TRAINER_PIC_WINSTRATE_F, .trainerName = _("ISABEL"), .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, - .doubleBattle = 1, + .doubleBattle = FALSE, .aiFlags = 0x1, .partySize = 2, .party = {.ItemDefaultMoves = gTrainerParty_Isabel2 } From 15b91a3c89fc2f939b3bb235a5dfda2c2342ffb0 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 2 Sep 2018 15:50:18 +0200 Subject: [PATCH 101/667] AI handling for new moves --- asm/macros/battle_ai_script.inc | 34 ++++-- data/battle_ai_scripts.s | 196 ++++++++++++++++++++++++++++---- src/battle_ai_script_commands.c | 78 +++++++++---- 3 files changed, 251 insertions(+), 57 deletions(-) diff --git a/asm/macros/battle_ai_script.inc b/asm/macros/battle_ai_script.inc index bc55db7408..b7287d3f92 100644 --- a/asm/macros/battle_ai_script.inc +++ b/asm/macros/battle_ai_script.inc @@ -315,13 +315,13 @@ .macro if_effect param0, param1 .byte 0x37 - .byte \param0 + .2byte \param0 .4byte \param1 .endm .macro if_not_effect param0, param1 .byte 0x38 - .byte \param0 + .2byte \param0 .4byte \param1 .endm @@ -469,14 +469,14 @@ .macro if_move_flag flag jumpptr .byte 0x52 - .2byte \flag + .4byte \flag .4byte \jumpptr .endm .macro if_field_status flag jumpptr .byte 0x53 - .word \flag - .word \jumpptr + .4byte \flag + .4byte \jumpptr .endm .macro get_move_accuracy @@ -491,7 +491,7 @@ .macro call_if_move_flag flag ptr .byte 0x52 - .2byte \flag + .4byte \flag .4byte \ptr .endm @@ -559,17 +559,33 @@ .4byte \param2 .endm - .macro get_ally_chosen_move bank + .macro get_ally_chosen_move .byte 0x63 .endm - .macro if_has_no_attacking_moves bank, param1 + .macro if_has_no_attacking_moves battler, param1 .byte 0x64 - .byte \bank + .byte \battler .4byte \param1 .endm + .macro get_hazards_count battler, effect + .byte 0x65 + .byte \battler + .2byte \effect + .endm + + .macro if_doesnt_hold_berry battler, ptr + .byte 0x66 + .byte \battler + .4byte \ptr + .endm + @ useful script macros + .macro if_holds_no_item battler, ptr + if_holds_item \battler, 0, \ptr + .endm + .macro get_curr_move_type get_type AI_TYPE_MOVE .endm diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 3d4f31018d..5c8262260c 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -50,58 +50,53 @@ AI_CheckBadMove: 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 + if_equal 0, AI_CheckBadMove_CheckEffect AI_CBM_CheckIfNegatesType: @ 82DBF92 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_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, AI_CheckBadMove_CheckEffect + goto AI_CheckBadMove_CheckEffect CheckIfWaterAbsorbCancelsWater: @ 82DBFCA get_curr_move_type if_equal_ TYPE_WATER, Score_Minus12 - goto AI_CheckBadMove_CheckSoundproof_ + goto AI_CheckBadMove_CheckEffect CheckIfFlashFireCancelsFire: @ 82DBFD7 get_curr_move_type if_equal_ TYPE_FIRE, Score_Minus12 - goto AI_CheckBadMove_CheckSoundproof_ + goto AI_CheckBadMove_CheckEffect CheckIfWonderGuardCancelsMove: @ 82DBFE4 - if_type_effectiveness AI_EFFECTIVENESS_x2, AI_CheckBadMove_CheckSoundproof_ + if_type_effectiveness AI_EFFECTIVENESS_x2, 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 - AI_CheckBadMove_CheckEffect: @ 82DC045 if_effect EFFECT_SLEEP, AI_CBM_Sleep if_effect EFFECT_EXPLOSION, AI_CBM_Explosion @@ -212,8 +207,156 @@ 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 + end + +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 + +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 + end + +AI_CBM_StealthRock: + if_side_affecting AI_TARGET, SIDE_STATUS_STEALTH_ROCK, Score_Minus10 end +AI_CBM_StickyWeb: + if_side_affecting AI_TARGET, SIDE_STATUS_STICKY_WEB, Score_Minus10 + end + AI_CBM_Sleep: @ 82DC2D4 get_ability AI_TARGET if_equal ABILITY_INSOMNIA, Score_Minus10 @@ -441,11 +584,14 @@ AI_CBM_Curse: @ 82DC5BB end AI_CBM_Spikes: @ 82DC5CC - if_side_affecting AI_TARGET, SIDE_STATUS_SPIKES, Score_Minus10 + 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 diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 0817bbca01..999beafc65 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -155,6 +155,8 @@ static void BattleAICmd_if_flash_fired(void); static void BattleAICmd_if_holds_item(void); static void BattleAICmd_get_ally_chosen_move(void); static void BattleAICmd_if_has_no_attacking_moves(void); +static void BattleAICmd_get_hazards_count(void); +static void BattleAICmd_if_doesnt_hold_berry(void); // ewram EWRAM_DATA const u8 *gAIScriptPtr = NULL; @@ -266,6 +268,8 @@ static const BattleAICmdFunc sBattleAICmdTable[] = BattleAICmd_if_holds_item, // 0x62 BattleAICmd_get_ally_chosen_move, // 0x63 BattleAICmd_if_has_no_attacking_moves, // 0x64 + BattleAICmd_get_hazards_count, // 0x65 + BattleAICmd_if_doesnt_hold_berry, // 0x66 }; static const u16 sDiscouragedPowerfulMoveEffects[] = @@ -1815,18 +1819,18 @@ static void BattleAICmd_get_weather(void) static void BattleAICmd_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 BattleAICmd_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 BattleAICmd_if_stat_level_less_than(void) @@ -2047,8 +2051,7 @@ static void BattleAICmd_if_has_move_with_effect(void) case AI_TARGET_PARTNER: for (i = 0; i < 4; 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].moves[i]].effect == gAIScriptPtr[2]) break; } if (i == 4) @@ -2184,18 +2187,13 @@ static void BattleAICmd_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; @@ -2301,12 +2299,12 @@ static void BattleAICmd_get_protect_count(void) static void BattleAICmd_if_move_flag(void) { - u16 flag = T1_READ_16(gAIScriptPtr + 1); + u32 flag = T1_READ_32(gAIScriptPtr + 1); if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].flags & flag) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5); else - gAIScriptPtr += 7; + gAIScriptPtr += 9; } static void BattleAICmd_if_field_status(void) @@ -2341,16 +2339,16 @@ static void BattleAICmd_call_if_eq(void) static void BattleAICmd_call_if_move_flag(void) { - u16 flag = T1_READ_16(gAIScriptPtr + 1); + u32 flag = T1_READ_32(gAIScriptPtr + 1); if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].flags & flag) { - AIStackPushVar(gAIScriptPtr + 7); - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); + AIStackPushVar(gAIScriptPtr + 9); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5); } else { - gAIScriptPtr += 7; + gAIScriptPtr += 9; } } @@ -2493,7 +2491,41 @@ static void BattleAICmd_if_has_no_attacking_moves(void) } if (i == 4) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); else - gAIScriptPtr += 5; + gAIScriptPtr += 6; +} + +static void BattleAICmd_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 BattleAICmd_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 + T1_READ_PTR(gAIScriptPtr + 2); } From c74d38c7b8e21f94ee96e6bed5fc9fc82756d58d Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sat, 8 Sep 2018 05:31:26 -0300 Subject: [PATCH 102/667] Update pokemon_summary_screen.c Added Fairy Type related code. --- src/pokemon_summary_screen.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index c57c0a94f5..e87153a430 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -556,6 +556,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 @@ -595,6 +599,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, @@ -638,6 +643,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, From d20189234e5b908527fe4afdbe05836770163f0c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 10 Sep 2018 17:11:16 +0200 Subject: [PATCH 103/667] Shyly begin move animations --- data/battle_anim_80FE840.s | 2 +- data/battle_anim_scripts.s | 1208 ++++++++++++++++++++++++++++++++++ src/battle_gfx_sfx_util.c | 2 +- src/pokemon_summary_screen.c | 4 +- 4 files changed, 1212 insertions(+), 4 deletions(-) diff --git a/data/battle_anim_80FE840.s b/data/battle_anim_80FE840.s index 749db42f85..1da9e6ed71 100644 --- a/data/battle_anim_80FE840.s +++ b/data/battle_anim_80FE840.s @@ -3880,4 +3880,4 @@ gUnknown_08597424:: @ 8597424 .4byte task_battle_intro_80BC47C .4byte task_battle_intro_80BC47C .4byte task_battle_intro_anim - .4byte task_battle_intro_anim + .4byte task_battle_intro_anim \ No newline at end of file diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 624a5c69f5..99c071aac2 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -366,6 +366,273 @@ gBattleAnims_Moves:: @ 82C8D6C .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 .4byte Move_COUNT @ cannot be reached, because last move is Psycho Boost .align 2 @@ -415,6 +682,947 @@ gBattleAnims_Special:: @ 82C937C .4byte Anim_SafariBallThrow .4byte Anim_SubstituteToMon .4byte Anim_MonToSubstitute + +Move_ROOST: + loadspritegfx 0x281e + monbg ANIM_DEF_PARTNER + monbgprio_29 + playsewithpan 0xca, 0x3f + delay 0x0 + createsprite gUnknown_08596388, 0x80, 0x0, 0xfff0, 0x40, 0x2, 0x68, 0x2c28, 0x20, 0x1 + delay 0x6 + createsprite gUnknown_08596388, 0x80, 0x0, 0xfff0, 0x20, 0x2, 0x68, 0x2c28, 0x20, 0x1 + createsprite gUnknown_08596388, 0x80, 0x0, 0xfff0, 0x0, 0x2, 0x68, 0x2c28, 0x20, 0x1 + delay 0x6 + createsprite gUnknown_08596388, 0x80, 0x0, 0xfff0, 0xe0, 0x2, 0x68, 0x2c28, 0x20, 0x1 + createsprite gUnknown_08596388, 0x80, 0x0, 0xfff0, 0x80, 0x2, 0x68, 0x2c28, 0x20, 0x1 + delay 0x6 + createsprite gUnknown_08596388, 0x80, 0x0, 0xfff0, 0xc0, 0x2, 0x68, 0x2c28, 0x20, 0x1 + createsprite gUnknown_08596388, 0x80, 0x0, 0xfff0, 0xa0, 0x2, 0x68, 0x2c28, 0x20, 0x1 + delay 0x6 + createsprite gUnknown_08596388, 0x80, 0x0, 0xfff0, 0x60, 0x2, 0x68, 0x2c28, 0x20, 0x1 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + loadspritegfx 0x272f + waitforvisualfinish + blendoff + delay 0x1 + call AnimScript_82D79DF + waitforvisualfinish + end + +MOVE_GRAVITY: + fadetobg BG_COSMIC + waitbgfadein + createvisualtask sub_8117660, 0x2, 0x0, 0x80, 0x0, 0xffff + createvisualtask sub_81080E4, 0x5, 0x0 + playsewithpan 0xa2, 0xc0 + delay 0x2c + playsewithpan 0xe9, 0xc0 + waitforvisualfinish + restorebg + waitbgfadeout + setarg 0x7, 0xffff + waitbgfadein + waitforvisualfinish + end + +MOVE_MIRACLE_EYE: + createsprite gUnknown_08597274, 0x2, 0x1, 0x1, 0x0, 0x6, 0x0 + waitforvisualfinish + loadspritegfx 0x27cd + loadspritegfx 0x27ce + loadspritegfx 0x27cf + monbg ANIM_DEF_PARTNER + playsewithpan 0xc4, 0x3f + createsprite gUnknown_085CE07C, 0x5, 0x0, 0x0, 0x1, 0x0 + createsprite gUnknown_085CE094, 0x5, + delay 0x28 + playsewithpan 0xc0, 0x3f + createvisualtask sub_8115A04, 0x2, 0x1, 0x1, 0x2, 0x0, 0xa, 0x0 + call AnimScript_82CF608 + createsprite gUnknown_08597274, 0x2, 0x1, 0x1, 0x6, 0x0, 0x0 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + end + +MOVE_WAKE_UP_SLAP: + loadspritegfx 0x279f + loadspritegfx 0x2797 + loadspritegfx 0x27a5 + monbg ANIM_TARGET + setalpha 0x80c + playsewithpan 0x87, 0x3f + createsprite gUnknown_08595E68, 0x2, 0xfff0, 0x0, 0x0, 0x0, 0xa, 0x1, 0x3, 0x0 + waitforvisualfinish + playsewithpan 0x8b, 0x3f + @ createsprite TEMPL_0x9f2b4d8, 0x3, 0x4, 0x0, 0x0, 0x1, 0x2 + createvisualtask sub_80D51AC, 0x5, ANIM_TARGET, 0x4, 0x0, 0x6, 0x1 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + end + +MOVE_HAMMER_ARM: + loadspritegfx 0x283a + loadspritegfx 0x2797 + monbg ANIM_TARGET + setalpha 0x80c + playsewithpan 0x87, 0x3f + @createsprite TEMPL_0x9f2b564, 0x3, 0x3, 0x0, 0xffe0, 0xf + delay 0x13 + createsprite gUnknown_08597358, 0x2, 0x0, 0xfff8, 0x1, 0x1 + createvisualtask sub_80D51AC, 0x2, ANIM_TARGET, 0x0, 0x4, 0x9, 0x1 + playsewithpan 0x8d, 0x3f + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + createvisualtask sub_81152DC, 0x5, 0x5, 0x0, 0x32 + createvisualtask sub_81152DC, 0x5, 0x5, 0x0, 0x32 + createvisualtask sub_81152DC, 0x5, 0x4, 0x0, 0x32 + loopsewithpan 0xd6, 0x3f, 0x8, 0xa + end + +MOVE_GYRO_BALL: + loadspritegfx 0x2797 + loadspritegfx 0x27f5 + loopsewithpan 0x78, 0xc0, 0x1c, 0x2 + createvisualtask sub_81144F8 , 0x5, 0x1, 0x0, 0x0 + waitforvisualfinish + setalpha 0x80c + createsprite gUnknown_0857FE28, 0xa, + createsprite gUnknown_085CE288, 0x2, 0x0, 0x0, 0x20, 0xffe0, 0x28, 0xfffe + createvisualtask sub_815ADB0, 0x2, 0x3, 0x0, 0x2, 0x0 + loopsewithpan 0xa0, 0xc0, 0x8, 0x4 + waitforvisualfinish + createsprite gUnknown_08597358, 0x82, 0x0, 0x0, 0x1, 0x2 + createvisualtask sub_80D6388, 0x2, 0x5, 0x0, 0x1, 0xa, 0x1, 0x0 + playsewithpan 0x86, 0x3f + waitforvisualfinish + delay 0x8 + createvisualtask sub_815ADB0, 0x2, 0x3, 0x0, 0x2, 0x1 + loopsewithpan 0xa0, 0xc0, 0x8, 0x4 + waitforvisualfinish + createvisualtask sub_811489C, 0x5, 0x2, 0x0, 0x1 + blendoff + unloadspritegfx 0x2797 + unloadspritegfx 0x27f5 + end + +MOVE_HEALING_WISH: + loadspritegfx 0x27d2 + loadspritegfx 0x27d3 + loadspritegfx 0x272f + loadspritegfx 0x27f9 + loadspritegfx 0x2741 + loopsewithpan 0xc3, 0xc0, 0x10, 0x3 + call AnimScript_82D79B4 + waitforvisualfinish + createsprite gUnknown_08597274, 0x5, 0x1, 0x2, 0x0, 0x9, 0x0 + waitforvisualfinish + playsewithpan 0xd3, 0x0 + createsprite gUnknown_08592EEC, 0x28, 0xfff4, 0x0 + delay 0x1E + createsprite gUnknown_08592EEC, 0x28, 0xffe8, 0x0 + delay 0x1E + createsprite gUnknown_08592EEC, 0x28, 0x15, 0x0 + delay 0x1E + createsprite gUnknown_08592EEC, 0x28, 0x0, 0x0 + delay 0x1E + createsprite gUnknown_08592EEC, 0x28, 0x0 + delay 0x20 + createvisualtask sub_81025C0, 0x3, 0x0 + waitforvisualfinish + createsprite gUnknown_08597274, 0x2, 0x1, 0x3, 0x0, 0xa, 0x0 + waitforvisualfinish + panse_27 0xcf, 0x3f, 0xc0, 0xfd, 0x0 + createsprite gUnknown_085CE388, 0x28, + waitforvisualfinish + delay 0x2c + createsprite gUnknown_08597274, 0x2, 0x1, 0x3, 0xa, 0x0, 0x0 + waitforvisualfinish + end + +MOVE_BRINE: + end + +MOVE_NATURAL_GIFT: + end + +MOVE_FEINT: + end + +MOVE_PLUCK: + end + +MOVE_TAILWIND: + end + +MOVE_ACUPRESSURE: + end + +MOVE_METAL_BURST: + end + +MOVE_U_TURN: + end + +MOVE_CLOSE_COMBAT: + end + +MOVE_PAYBACK: + end + +MOVE_ASSURANCE: + end + +MOVE_EMBARGO: + end + +MOVE_FLING: + end + +MOVE_PSYCHO_SHIFT: + end + +MOVE_TRUMP_CARD: + end + +MOVE_HEAL_BLOCK: + end + +MOVE_WRING_OUT: + end + +MOVE_POWER_TRICK: + end + +MOVE_GASTRO_ACID: + end + +MOVE_LUCKY_CHANT: + end + +MOVE_ME_FIRST: + end + +MOVE_COPYCAT: + end + +MOVE_POWER_SWAP: + end + +MOVE_GUARD_SWAP: + end + +MOVE_PUNISHMENT: + end + +MOVE_LAST_RESORT: + end + +MOVE_WORRY_SEED: + end + +MOVE_SUCKER_PUNCH: + end + +MOVE_TOXIC_SPIKES: + end + +MOVE_HEART_SWAP: + end + +MOVE_AQUA_RING: + end + +MOVE_MAGNET_RISE: + end + +MOVE_FLARE_BLITZ: + end + +MOVE_FORCE_PALM: + end + +MOVE_AURA_SPHERE: + end + +MOVE_ROCK_POLISH: + end + +MOVE_POISON_JAB: + end + +MOVE_DARK_PULSE: + end + +MOVE_NIGHT_SLASH: + end + +MOVE_AQUA_TAIL: + end + +MOVE_SEED_BOMB: + end + +MOVE_AIR_SLASH: + end + +MOVE_XSCISSOR: + end + +MOVE_BUG_BUZZ: + end + +MOVE_DRAGON_PULSE: + end + +MOVE_DRAGON_RUSH: + end + +MOVE_POWER_GEM: + end + +MOVE_DRAIN_PUNCH: + end + +MOVE_VACUUM_WAVE: + end + +MOVE_FOCUS_BLAST: + end + +MOVE_ENERGY_BALL: + end + +MOVE_BRAVE_BIRD: + end + +MOVE_EARTH_POWER: + end + +MOVE_SWITCHEROO: + end + +MOVE_GIGA_IMPACT: + end + +MOVE_NASTY_PLOT: + end + +MOVE_BULLET_PUNCH: + end + +MOVE_AVALANCHE: + end + +MOVE_ICE_SHARD: + end + +MOVE_SHADOW_CLAW: + end + +MOVE_THUNDER_FANG: + end + +MOVE_ICE_FANG: + end + +MOVE_FIRE_FANG: + end + +MOVE_SHADOW_SNEAK: + end + +MOVE_MUD_BOMB: + end + +MOVE_PSYCHO_CUT: + end + +MOVE_ZEN_HEADBUTT: + end + +MOVE_MIRROR_SHOT: + end + +MOVE_FLASH_CANNON: + end + +MOVE_ROCK_CLIMB: + end + +MOVE_DEFOG: + end + +MOVE_TRICK_ROOM: + end + +MOVE_DRACO_METEOR: + end + +MOVE_DISCHARGE: + end + +MOVE_LAVA_PLUME: + end + +MOVE_LEAF_STORM: + end + +MOVE_POWER_WHIP: + end + +MOVE_ROCK_WRECKER: + end + +MOVE_CROSS_POISON: + end + +MOVE_GUNK_SHOT: + end + +MOVE_IRON_HEAD: + end + +MOVE_MAGNET_BOMB: + end + +MOVE_STONE_EDGE: + end + +MOVE_CAPTIVATE: + end + +MOVE_STEALTH_ROCK: + end + +MOVE_GRASS_KNOT: + end + +MOVE_CHATTER: + end + +MOVE_JUDGMENT: + end + +MOVE_BUG_BITE: + end + +MOVE_CHARGE_BEAM: + end + +MOVE_WOOD_HAMMER: + end + +MOVE_AQUA_JET: + end + +MOVE_ATTACK_ORDER: + end + +MOVE_DEFEND_ORDER: + end + +MOVE_HEAL_ORDER: + end + +MOVE_HEAD_SMASH: + end + +MOVE_DOUBLE_HIT: + end + +MOVE_ROAR_OF_TIME: + end + +MOVE_SPECIAL_REND: + end + +MOVE_LUNAR_DANCE: + end + +MOVE_CRUSH_GRIP: + end + +MOVE_MAGMA_STORM: + end + +MOVE_DARK_VOID: + end + +MOVE_SEED_FLARE: + end + +MOVE_OMINOUS_WIND: + end + +MOVE_SHADOW_FORCE: + end + +MOVE_HONE_CLAWS: + end + +MOVE_WIDE_GUARD: + end + +MOVE_GUARD_SPLIT: + end + +MOVE_POWER_SPLIT: + end + +MOVE_WONDER_ROOM: + end + +MOVE_PSYSHOCK: + end + +MOVE_VENOSHOCK: + end + +MOVE_AUTOTOMIZE: + end + +MOVE_RAGE_POWDER: + end + +MOVE_TELEKINESIS: + end + +MOVE_MAGIC_ROOM: + end + +MOVE_SMACK_DOWN: + end + +MOVE_STORM_THROW: + end + +MOVE_FLAME_BURST: + end + +MOVE_SLUDGE_WAVE: + end + +MOVE_QUIVER_DANCE: + end + +MOVE_HEAVY_SLAM: + end + +MOVE_SYCHRONOISE: + end + +MOVE_ELECTRO_BALL: + end + +MOVE_SOAK: + end + +MOVE_FLAME_CHARGE: + end + +MOVE_COIL: + end + +MOVE_LOW_SWEEP: + end + +MOVE_ACID_SPRAY: + end + +MOVE_FOUL_PLAY: + end + +MOVE_SIMPLE_BEAM: + end + +MOVE_ENTRAINMENT: + end + +MOVE_AFTER_YOU: + end + +MOVE_ROUND: + end + +MOVE_ECHOED_VOICE: + end + +MOVE_CHIP_AWAY: + end + +MOVE_CLEAR_SMOG: + end + +MOVE_STORED_POWER: + end + +MOVE_QUICK_GUARD: + end + +MOVE_ALLY_SWITCH: + end + +MOVE_SCALD: + end + +MOVE_SHELL_SMASH: + end + +MOVE_HEAL_PULSE: + end + +MOVE_HEX: + end + +MOVE_SKY_DROP: + end + +MOVE_SHIFT_GEAR: + end + +MOVE_CIRCLE_THROW: + end + +MOVE_INCINERATE: + end + +MOVE_QUASH: + end + +MOVE_ACROBATICS: + end + +MOVE_REFLECT_TYPE: + end + +MOVE_RETALITATE: + end + +MOVE_FINAL_GAMBIT: + end + +MOVE_BESTOW: + end + +MOVE_INFERNO: + end + +MOVE_WATER_PLEDGE: + end + +MOVE_FIRE_PLEDGE: + end + +MOVE_GRASS_PLEDGE: + end + +MOVE_VOLT_SWITCH: + end + +MOVE_STRUGGLE_BUG: + end + +MOVE_BULLDOZE: + end + +MOVE_FROST_BREATH: + end + +MOVE_DRAGON_TAIL: + end + +MOVE_WORK_UP: + end + +MOVE_ELECTROWEB: + end + +MOVE_WILD_CHARGE: + end + +MOVE_DRILL_RUN: + end + +MOVE_DUAL_CHOP: + end + +MOVE_HEART_STAMP: + end + +MOVE_HORN_LEECH: + end + +MOVE_SACRED_SWORD: + end + +MOVE_RAZOR_SHELL: + end + +MOVE_HEAT_CRASH: + end + +MOVE_LEAF_TORNADO: + end + +MOVE_STEAMROLLER: + end + +MOVE_COTTON_GUARD: + end + +MOVE_NIGHT_DAZE: + end + +MOVE_PSYSTRIKE: + end + +MOVE_TAIL_SLAP: + end + +MOVE_HURRICANE: + end + +MOVE_HEAD_CHARGE: + end + +MOVE_GEAR_GRIND: + end + +MOVE_SEARING_SHOT: + end + +MOVE_TECHNO_BLAST: + end + +MOVE_RELIC_SONG: + end + +MOVE_SECRET_SWORD: + end + +MOVE_GLACIATE: + end + +MOVE_BOLT_STRIKE: + end + +MOVE_BLUE_FLARE: + end + +MOVE_FIERY_DANCE: + end + +MOVE_FREEZE_SHOCK: + end + +MOVE_ICE_BURN: + end + +MOVE_SNARL: + end + +MOVE_ICICLE_CRASH: + end + +MOVE_V_CREATE: + end + +MOVE_FUSION_FLARE: + end + +MOVE_FUSION_BOLT: + end + +MOVE_FLYING_PRESS: + end + +MOVE_MAT_BLOCK: + end + +MOVE_BELCH: + end + +MOVE_ROTOTILLER: + end + +MOVE_STICKY_WEB: + end + +MOVE_FELL_STINGER: + end + +MOVE_PHANTOM_FORCE: + end + +MOVE_TRICK_OR_TREAT: + end + +MOVE_NOBLE_ROAR: + end + +MOVE_ION_DELUGE: + end + +MOVE_PARABOLIC_CHARGE: + end + +MOVE_FORESTS_CURSE: + end + +MOVE_PETAL_BLIZZARD: + end + +MOVE_FREEZE_DRY: + end + +MOVE_DISARMING_VOICE: + end + +MOVE_PARTING_SHOT: + end + +MOVE_TOPSY_TURVY: + end + +MOVE_DRAINING_KISS: + end + +MOVE_CRAFTY_SHIELD: + end + +MOVE_FLOWER_SHIELD: + end + +MOVE_GRASSY_TERRAIN: + end + +MOVE_MISTY_TERRAIN: + end + +MOVE_ELECTRIFY: + end + +MOVE_PLAY_ROUGH: + end + +MOVE_FAIRY_WIND: + end + +MOVE_MOONBLAST: + end + +MOVE_BOOMBURST: + end + +MOVE_FAIRY_LOCK: + end + +MOVE_KINGS_SHIELD: + end + +MOVE_PLAY_NICE: + end + +MOVE_CONFIDE: + end + +MOVE_DIAMOND_STORM: + end + +MOVE_STEAM_ERUPTION: + end + +MOVE_HYPERSPACE_HOLE: + end + +MOVE_WATER_SHURIKEN: + end + +MOVE_MYSTICAL_FIRE: + end + +MOVE_SPIKY_SHIELD: + end + +MOVE_AROMATIC_MIST: + end + +MOVE_EERIE_IMPULSE: + end + +MOVE_VENOM_DRENCH: + end + +MOVE_POWDER: + end + +MOVE_GEOMANCY: + end + +MOVE_MAGNETIC_FLUX: + end + +MOVE_HAPPY_HOUR: + end + +MOVE_ELECTRIC_TERRAIN: + end + +MOVE_DAZZLING_GLEAM: + end + +MOVE_CELEBRATE: + end + +MOVE_HOLD_HANDS: + end + +MOVE_BABY_DOLL_EYES: + end + +MOVE_NUZZLE: + end + +MOVE_HOLD_BACK: + end + +MOVE_INFESTATION: + end + +MOVE_POWER_UP_PUNCH: + end + +MOVE_OBLIVION_WING: + end + +MOVE_THOUSAND_ARROWS: + end + +MOVE_THOUSAND_WAVES: + end + +MOVE_LANDS_WRATH: + end + +MOVE_LIGHT_OF_RUIN: + end + +MOVE_ORIGIN_PULSE: + end + +MOVE_PRECIPICE_BLADES: + end + +MOVE_DRAGON_ASCENT: + end + +MOVE_HYPERSPACE_FURY: + end Move_NONE: Move_MIRROR_MOVE: diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index b1fdcf35a5..03e0f10a33 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -502,7 +502,7 @@ static void Task_ClearBitWhenSpecialAnimDone(u8 taskId) // Great function to include newly added moves that don't have animation yet. bool8 IsMoveWithoutAnimation(u16 moveId, u8 animationTurn) { - if (moveId >= (MOVES_COUNT_GEN3 - 1)) + if (moveId >= (MOVES_COUNT_GEN6 - 1)) return TRUE; else return FALSE; diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index cd7bd82bb9..28b2a4cbb0 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -855,7 +855,7 @@ static const union AnimCmd *const sSpriteAnimTable_MoveTypes[NUMBER_OF_MON_TYPES sSpriteAnim_TypeIce, sSpriteAnim_TypeDragon, sSpriteAnim_TypeDark, - sSpriteAnim_TypeFairy, + sSpriteAnim_TypeFairy, sSpriteAnim_CategoryCool, sSpriteAnim_CategoryBeauty, sSpriteAnim_CategoryCute, @@ -899,7 +899,7 @@ static const u8 sMoveTypeToOamPaletteNum[NUMBER_OF_MON_TYPES + CONTEST_CATEGORIE [TYPE_ICE] = 14, [TYPE_DRAGON] = 15, [TYPE_DARK] = 13, - [TYPE_FAIRY] = 14, + [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, From c3a50019452788a5700c396be6c792aa9ad89a92 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 16 Sep 2018 10:18:35 +0200 Subject: [PATCH 104/667] Add Ability Descriptions: credits to BluRose :3 --- src/battle_debug.c | 4 +- src/battle_main.c | 2 +- src/data/text/abilities.h | 1087 +++++++++++++++++++++++-------------- 3 files changed, 694 insertions(+), 399 deletions(-) diff --git a/src/battle_debug.c b/src/battle_debug.c index e06dc7ab27..cf5fb881ae 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -814,7 +814,7 @@ static void PrintOnBattlerWindow(u8 windowId, u8 battlerId) StringCopy(&text[4], gBattleMons[battlerId].nickname); FillWindowPixelBuffer(windowId, 0x11); - PrintTextOnWindow(windowId, 1, text, 0, 0, 0, NULL); + AddTextPrinterParameterized(windowId, 1, text, 0, 0, 0, NULL); CopyWindowToVram(windowId, 3); } @@ -1025,7 +1025,7 @@ static void PrintDigitChars(struct BattleDebugMenu *data) text[i] = EOS; - PrintTextOnWindow(data->modifyWindowId, 1, text, 3, 0, 0, NULL); + AddTextPrinterParameterized(data->modifyWindowId, 1, text, 3, 0, 0, NULL); } static const u32 GetBitfieldToAndValue(u32 currBit, u32 bitsCount) diff --git a/src/battle_main.c b/src/battle_main.c index 7fe3825404..b23930dd9f 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4615,7 +4615,7 @@ static void sub_803CDF8(void) void SwapTurnOrder(u8 id1, u8 id2) { u32 temp; - + SWAP(gActionsByTurnOrder[id1], gActionsByTurnOrder[id2], temp); SWAP(gBattlerByTurnOrder[id1], gBattlerByTurnOrder[id2], temp); } diff --git a/src/data/text/abilities.h b/src/data/text/abilities.h index d498d6d8f7..8a96d26c6d 100644 --- a/src/data/text/abilities.h +++ b/src/data/text/abilities.h @@ -1,403 +1,698 @@ -#ifndef POKEEMERALD_DATA_TEXT_ABILITIES_H -#define POKEEMERALD_DATA_TEXT_ABILITIES_H - -static const u8 gNoneAbilityDescription[] = _("No special ability."); -static const u8 gStenchAbilityDescription[] = _("Helps repel wild POKéMON."); -static const u8 gDrizzleAbilityDescription[] = _("Summons rain in battle."); -static const u8 gSpeedBoostAbilityDescription[] = _("Gradually boosts SPEED."); -static const u8 gBattleArmorAbilityDescription[] = _("Blocks critical hits."); -static const u8 gSturdyAbilityDescription[] = _("Negates 1-hit KO attacks."); -static const u8 gDampAbilityDescription[] = _("Prevents self-destruction."); -static const u8 gLimberAbilityDescription[] = _("Prevents paralysis."); -static const u8 gSandVeilAbilityDescription[] = _("Ups evasion in a sandstorm."); -static const u8 gStaticAbilityDescription[] = _("Paralyzes on contact."); -static const u8 gVoltAbsorbAbilityDescription[] = _("Turns electricity into HP."); -static const u8 gWaterAbsorbAbilityDescription[] = _("Changes water into HP."); -static const u8 gObliviousAbilityDescription[] = _("Prevents attraction."); -static const u8 gCloudNineAbilityDescription[] = _("Negates weather effects."); -static const u8 gCompoundEyesAbilityDescription[] = _("Raises accuracy."); -static const u8 gInsomniaAbilityDescription[] = _("Prevents sleep."); -static const u8 gColorChangeAbilityDescription[] = _("Changes type to foe’s move."); -static const u8 gImmunityAbilityDescription[] = _("Prevents poisoning."); -static const u8 gFlashFireAbilityDescription[] = _("Powers up if hit by fire."); -static const u8 gShieldDustAbilityDescription[] = _("Prevents added effects."); -static const u8 gOwnTempoAbilityDescription[] = _("Prevents confusion."); -static const u8 gSuctionCupsAbilityDescription[] = _("Firmly anchors the body."); -static const u8 gIntimidateAbilityDescription[] = _("Lowers the foe’s ATTACK."); -static const u8 gShadowTagAbilityDescription[] = _("Prevents the foe’s escape."); -static const u8 gRoughSkinAbilityDescription[] = _("Hurts to touch."); -static const u8 gWonderGuardAbilityDescription[] = _("“Super effective” hits."); -static const u8 gLevitateAbilityDescription[] = _("Not hit by GROUND attacks."); -static const u8 gEffectSporeAbilityDescription[] = _("Leaves spores on contact."); -static const u8 gSynchronizeAbilityDescription[] = _("Passes on status problems."); -static const u8 gClearBodyAbilityDescription[] = _("Prevents ability reduction."); -static const u8 gNaturalCureAbilityDescription[] = _("Heals upon switching out."); -static const u8 gLightningRodAbilityDescription[] = _("Draws electrical moves."); -static const u8 gSereneGraceAbilityDescription[] = _("Promotes added effects."); -static const u8 gSwiftSwimAbilityDescription[] = _("Raises SPEED in rain."); -static const u8 gChlorophyllAbilityDescription[] = _("Raises SPEED in sunshine."); -static const u8 gIlluminateAbilityDescription[] = _("Encounter rate increases."); -static const u8 gTraceAbilityDescription[] = _("Copies special ability."); -static const u8 gHugePowerAbilityDescription[] = _("Raises ATTACK."); -static const u8 gPoisonPointAbilityDescription[] = _("Poisons foe on contact."); -static const u8 gInnerFocusAbilityDescription[] = _("Prevents flinching."); -static const u8 gMagmaArmorAbilityDescription[] = _("Prevents freezing."); -static const u8 gWaterVeilAbilityDescription[] = _("Prevents burns."); -static const u8 gMagnetPullAbilityDescription[] = _("Traps STEEL-type POKéMON."); -static const u8 gSoundproofAbilityDescription[] = _("Avoids sound-based moves."); -static const u8 gRainDishAbilityDescription[] = _("Slight HP recovery in rain."); -static const u8 gSandStreamAbilityDescription[] = _("Summons a sandstorm."); -static const u8 gPressureAbilityDescription[] = _("Raises foe’s PP usage."); -static const u8 gThickFatAbilityDescription[] = _("Heat-and-cold protection."); -static const u8 gEarlyBirdAbilityDescription[] = _("Awakens quickly from sleep."); -static const u8 gFlameBodyAbilityDescription[] = _("Burns the foe on contact."); -static const u8 gRunAwayAbilityDescription[] = _("Makes escaping easier."); -static const u8 gKeenEyeAbilityDescription[] = _("Prevents loss of accuracy."); -static const u8 gHyperCutterAbilityDescription[] = _("Prevents ATTACK reduction."); -static const u8 gPickupAbilityDescription[] = _("May pick up items."); -static const u8 gTruantAbilityDescription[] = _("Moves only every two turns."); -static const u8 gHustleAbilityDescription[] = _("Trades accuracy for power."); -static const u8 gCuteCharmAbilityDescription[] = _("Infatuates on contact."); -static const u8 gPlusAbilityDescription[] = _("Powers up with MINUS."); -static const u8 gMinusAbilityDescription[] = _("Powers up with PLUS."); -static const u8 gForecastAbilityDescription[] = _("Changes with the weather."); -static const u8 gStickyHoldAbilityDescription[] = _("Prevents item theft."); -static const u8 gShedSkinAbilityDescription[] = _("Heals the body by shedding."); -static const u8 gGutsAbilityDescription[] = _("Ups ATTACK if suffering."); -static const u8 gMarvelScaleAbilityDescription[] = _("Ups DEFENSE if suffering."); -static const u8 gLiquidOozeAbilityDescription[] = _("Draining causes injury."); -static const u8 gOvergrowAbilityDescription[] = _("Ups GRASS moves in a pinch."); -static const u8 gBlazeAbilityDescription[] = _("Ups FIRE moves in a pinch."); -static const u8 gTorrentAbilityDescription[] = _("Ups WATER moves in a pinch."); -static const u8 gSwarmAbilityDescription[] = _("Ups BUG moves in a pinch."); -static const u8 gRockHeadAbilityDescription[] = _("Prevents recoil damage."); -static const u8 gDroughtAbilityDescription[] = _("Summons sunlight in battle."); -static const u8 gArenaTrapAbilityDescription[] = _("Prevents fleeing."); -static const u8 gVitalSpiritAbilityDescription[] = _("Prevents sleep."); -static const u8 gWhiteSmokeAbilityDescription[] = _("Prevents ability reduction."); -static const u8 gPurePowerAbilityDescription[] = _("Raises ATTACK."); -static const u8 gShellArmorAbilityDescription[] = _("Blocks critical hits."); -static const u8 gCacophonyAbilityDescription[] = _("Avoids sound-based moves."); -static const u8 gAirLockAbilityDescription[] = _("Negates weather effects."); +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 sBattleArmorDescription[] = _("Blocks critical hits."); +static const u8 sSturdyDescription[] = _("Negates 1-hit KO attacks."); +static const u8 sDampDescription[] = _("Prevents self-destruction."); +static const u8 sLimberDescription[] = _("Prevents paralysis."); +static const u8 sSandVeilDescription[] = _("Ups evasion in a sandstorm."); +static const u8 sStaticDescription[] = _("Paralyzes on contact."); +static const u8 sVoltAbsorbDescription[] = _("Turns electricity into HP."); +static const u8 sWaterAbsorbDescription[] = _("Changes water into HP."); +static const u8 sObliviousDescription[] = _("Prevents attraction."); +static const u8 sCloudNineDescription[] = _("Negates weather effects."); +static const u8 sCompoundEyesDescription[] = _("Raises accuracy."); +static const u8 sInsomniaDescription[] = _("Prevents sleep."); +static const u8 sColorChangeDescription[] = _("Changes type to foe’s move."); +static const u8 sImmunityDescription[] = _("Prevents poisoning."); +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 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 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 sIlluminateDescription[] = _("Encounter rate increases."); +static const u8 sTraceDescription[] = _("Copies special ability."); +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 sSoundproofDescription[] = _("Avoids sound-based moves."); +static const u8 sRainDishDescription[] = _("Slight HP recovery in rain."); +static const u8 sSandStreamDescription[] = _("Summons a sandstorm."); +static const u8 sPressureDescription[] = _("Raises foe’s PP usage."); +static const u8 sThickFatDescription[] = _("Heat-and-cold protection."); +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 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 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 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 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 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[] = _("Turns grass into 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"); const u8 gAbilityNames[ABILITIES_COUNT_GEN7][ABILITY_NAME_LENGTH + 1] = { - _("-------"), - _("STENCH"), - _("DRIZZLE"), - _("SPEED BOOST"), - _("BATTLE ARMOR"), - _("STURDY"), - _("DAMP"), - _("LIMBER"), - _("SAND VEIL"), - _("STATIC"), - _("VOLT ABSORB"), - _("WATER ABSORB"), - _("OBLIVIOUS"), - _("CLOUD NINE"), - _("COMPOUNDEYES"), - _("INSOMNIA"), - _("COLOR CHANGE"), - _("IMMUNITY"), - _("FLASH FIRE"), - _("SHIELD DUST"), - _("OWN TEMPO"), - _("SUCTION CUPS"), - _("INTIMIDATE"), - _("SHADOW TAG"), - _("ROUGH SKIN"), - _("WONDER GUARD"), - _("LEVITATE"), - _("EFFECT SPORE"), - _("SYNCHRONIZE"), - _("CLEAR BODY"), - _("NATURAL CURE"), - _("LIGHTNINGROD"), - _("SERENE GRACE"), - _("SWIFT SWIM"), - _("CHLOROPHYLL"), - _("ILLUMINATE"), - _("TRACE"), - _("HUGE POWER"), - _("POISON POINT"), - _("INNER FOCUS"), - _("MAGMA ARMOR"), - _("WATER VEIL"), - _("MAGNET PULL"), - _("SOUNDPROOF"), - _("RAIN DISH"), - _("SAND STREAM"), - _("PRESSURE"), - _("THICK FAT"), - _("EARLY BIRD"), - _("FLAME BODY"), - _("RUN AWAY"), - _("KEEN EYE"), - _("HYPER CUTTER"), - _("PICKUP"), - _("TRUANT"), - _("HUSTLE"), - _("CUTE CHARM"), - _("PLUS"), - _("MINUS"), - _("FORECAST"), - _("STICKY HOLD"), - _("SHED SKIN"), - _("GUTS"), - _("MARVEL SCALE"), - _("LIQUID OOZE"), - _("OVERGROW"), - _("BLAZE"), - _("TORRENT"), - _("SWARM"), - _("ROCK HEAD"), - _("DROUGHT"), - _("ARENA TRAP"), - _("VITAL SPIRIT"), - _("WHITE SMOKE"), - _("PURE POWER"), - _("SHELL ARMOR"), - _("CACOPHONY"), - _("AIR LOCK"), - _("TANGLED FEET"), - _("MOTOR DRIVE"), - _("RIVALRY"), - _("STEADFAST"), - _("SNOW CLOAK"), - _("GLUTTONY"), - _("ANGER POINT"), - _("UNBURDEN"), - _("HEATPROOF"), - _("SIMPLE"), - _("DRY SKIN"), - _("DOWNLOAD"), - _("IRON FIST"), - _("POISON HEAL"), - _("ADAPTABILITY"), - _("SKILL LINK"), - _("HYDRATION"), - _("SOLAR POWER"), - _("QUICK FEET"), - _("NORMALIZE"), - _("SNIPER"), - _("MAGIC GUARD"), - _("NO GUARD"), - _("STALL"), - _("TECHNICIAN"), - _("LEAF GUARD"), - _("KLUTZ"), - _("MOLD BREAKER"), - _("SUPER LUCK"), - _("AFTERMATH"), - _("ANTICIPATION"), - _("FOREWARN"), - _("UNAWARE"), - _("TINTED LENS"), - _("FILTER"), - _("SLOW START"), - _("SCRAPPY"), - _("STORM DRAIN"), - _("ICE BODY"), - _("SOLID ROCK"), - _("SNOW WARNING"), - _("HONEY GATHER"), - _("FRISK"), - _("RECKLESS"), - _("MULTITYPE"), - _("FLOWER GIFT"), - _("BAD DREAMS"), - _("PICKPOCKET"), - _("SHEER FORCE"), - _("CONTRARY"), - _("UNNERVE"), - _("DEFIANT"), - _("DEFEATIST"), - _("CURSED BODY"), - _("HEALER"), - _("FRIEND GUARD"), - _("WEAK ARMOR"), - _("HEAVY METAL"), - _("LIGHT METAL"), - _("MULTISCALE"), - _("TOXIC BOOST"), - _("FLARE BOOST"), - _("HARVEST"), - _("TELEPATHY"), - _("MOODY"), - _("OVERCOAT"), - _("POISON TOUCH"), - _("REGENERATOR"), - _("BIG PECKS"), - _("SAND RUSH"), - _("WONDER SKIN"), - _("ANALYTIC"), - _("ILLUSION"), - _("IMPOSTER"), - _("INFILTRATOR"), - _("MUMMY"), - _("MOXIE"), - _("JUSTIFIED"), - _("RATTLED"), - _("MAGIC BOUNCE"), - _("SAP SIPPER"), - _("PRANKSTER"), - _("SAND FORCE"), - _("IRON BARBS"), - _("ZEN MODE"), - _("VICTORY STAR"), - _("TURBOBLAZE"), - _("TERAVOLT"), - _("AROMA VEIL"), - _("FLOWER VEIL"), - _("CHEEK POUCH"), - _("PROTEAN"), - _("FUR COAT"), - _("MAGICIAN"), - _("BULLETPROOF"), - _("COMPETITIVE"), - _("STRONG JAW"), - _("REFRIGERATE"), - _("SWEET VEIL"), - _("STANCE CHANG"), - _("GALE WINGS"), - _("MEGA LAUNCHE"), - _("GRASS PELT"), - _("SYMBIOSIS"), - _("TOUGH CLAWS"), - _("PIXILATE"), - _("GOOEY"), - _("AERILATE"), - _("PARENTAL BON"), - _("DARK AURA"), - _("FAIRY AURA"), - _("AURA BREAK"), - _("PRIMORDIAL S"), - _("DESOLATE LAN"), - _("DELTA STREAM"), - _("STAMINA"), - _("WIMP OUT"), - _("EMERGENCY EX"), - _("WATER COMPAC"), - _("MERCILESS"), - _("SHIELDS DOWN"), - _("STAKEOUT"), - _("WATER BUBBLE"), - _("STEELWORKER"), - _("BERSERK"), - _("SLUSH RUSH"), - _("LONG REACH"), - _("LIQUID VOICE"), - _("TRIAGE"), - _("GALVANIZE"), - _("SURGE SURFER"), - _("SCHOOLING"), - _("DISGUISE"), - _("BATTLE BOND"), - _("POWER CONSTR"), - _("CORROSION"), - _("COMATOSE"), - _("QUEENLY MAJE"), - _("INNARDS OUT"), - _("DANCER"), - _("BATTERY"), - _("FLUFFY"), - _("DAZZLING"), - _("SOUL HEART"), - _("TANGLING HAI"), - _("RECEIVER"), - _("POWER OF ALC"), - _("BEAST BOOST"), - _("RKS SYSTEM"), - _("ELECTRIC SUR"), - _("PSYCHIC SUR"), - _("MISTY SURGE"), - _("GRASSY SURGE"), - _("FULL METAL B"), - _("SHADOW SHIEL"), - _("PRISM ARMOR"), + [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_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_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] = _("STANCE CHANG"), + [ABILITY_GALE_WINGS] = _("GALE WINGS"), + [ABILITY_MEGA_LAUNCHER] = _("MEGA LAUNCHE"), + [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] = _("PARENTAL BON"), + [ABILITY_DARK_AURA] = _("DARK AURA"), + [ABILITY_FAIRY_AURA] = _("FAIRY AURA"), + [ABILITY_AURA_BREAK] = _("AURA BREAK"), + [ABILITY_PRIMORDIAL_SEA] = _("PRIMORDIAL S"), + [ABILITY_DESOLATE_LAND] = _("DESOLATE LAN"), + [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] = _("QUEENLY MAJE"), + [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] = _("TANGLING HAI"), + [ABILITY_RECEIVER] = _("RECEIVER"), + [ABILITY_POWER_OF_ALCHEMY] = _("POWER OF ALC"), + [ABILITY_BEAST_BOOST] = _("BEAST BOOST"), + [ABILITY_RKS_SYSTEM] = _("RKS SYSTEM"), + [ABILITY_ELECTRIC_SURGE] = _("ELECTRIC SUR"), + [ABILITY_PSYCHIC_SURGE] = _("PSYCHIC SUR"), + [ABILITY_MISTY_SURGE] = _("MISTY SURGE"), + [ABILITY_GRASSY_SURGE] = _("GRASSY SURGE"), + [ABILITY_FULL_METAL_BODY] = _("FULL METAL B"), + [ABILITY_SHADOW_SHIELD] = _("SHADOW SHIEL"), + [ABILITY_PRISM_ARMOR] = _("PRISM ARMOR"), }; -const u8 *const gAbilityDescriptionPointers[ABILITIES_COUNT] = +const u8 *const gAbilityDescriptionPointers[ABILITIES_COUNT_GEN7] = { - gNoneAbilityDescription, - gStenchAbilityDescription, - gDrizzleAbilityDescription, - gSpeedBoostAbilityDescription, - gBattleArmorAbilityDescription, - gSturdyAbilityDescription, - gDampAbilityDescription, - gLimberAbilityDescription, - gSandVeilAbilityDescription, - gStaticAbilityDescription, - gVoltAbsorbAbilityDescription, - gWaterAbsorbAbilityDescription, - gObliviousAbilityDescription, - gCloudNineAbilityDescription, - gCompoundEyesAbilityDescription, - gInsomniaAbilityDescription, - gColorChangeAbilityDescription, - gImmunityAbilityDescription, - gFlashFireAbilityDescription, - gShieldDustAbilityDescription, - gOwnTempoAbilityDescription, - gSuctionCupsAbilityDescription, - gIntimidateAbilityDescription, - gShadowTagAbilityDescription, - gRoughSkinAbilityDescription, - gWonderGuardAbilityDescription, - gLevitateAbilityDescription, - gEffectSporeAbilityDescription, - gSynchronizeAbilityDescription, - gClearBodyAbilityDescription, - gNaturalCureAbilityDescription, - gLightningRodAbilityDescription, - gSereneGraceAbilityDescription, - gSwiftSwimAbilityDescription, - gChlorophyllAbilityDescription, - gIlluminateAbilityDescription, - gTraceAbilityDescription, - gHugePowerAbilityDescription, - gPoisonPointAbilityDescription, - gInnerFocusAbilityDescription, - gMagmaArmorAbilityDescription, - gWaterVeilAbilityDescription, - gMagnetPullAbilityDescription, - gSoundproofAbilityDescription, - gRainDishAbilityDescription, - gSandStreamAbilityDescription, - gPressureAbilityDescription, - gThickFatAbilityDescription, - gEarlyBirdAbilityDescription, - gFlameBodyAbilityDescription, - gRunAwayAbilityDescription, - gKeenEyeAbilityDescription, - gHyperCutterAbilityDescription, - gPickupAbilityDescription, - gTruantAbilityDescription, - gHustleAbilityDescription, - gCuteCharmAbilityDescription, - gPlusAbilityDescription, - gMinusAbilityDescription, - gForecastAbilityDescription, - gStickyHoldAbilityDescription, - gShedSkinAbilityDescription, - gGutsAbilityDescription, - gMarvelScaleAbilityDescription, - gLiquidOozeAbilityDescription, - gOvergrowAbilityDescription, - gBlazeAbilityDescription, - gTorrentAbilityDescription, - gSwarmAbilityDescription, - gRockHeadAbilityDescription, - gDroughtAbilityDescription, - gArenaTrapAbilityDescription, - gVitalSpiritAbilityDescription, - gWhiteSmokeAbilityDescription, - gPurePowerAbilityDescription, - gShellArmorAbilityDescription, - gCacophonyAbilityDescription, - gAirLockAbilityDescription, + [ABILITY_NONE] = sNoneDescription, + [ABILITY_STENCH] = sStenchDescription, + [ABILITY_DRIZZLE] = sDrizzleDescription, + [ABILITY_SPEED_BOOST] = sSpeedBoostDescription, + [ABILITY_BATTLE_ARMOR] = sBattleArmorDescription, + [ABILITY_STURDY] = sSturdyDescription, + [ABILITY_DAMP] = sDampDescription, + [ABILITY_LIMBER] = sLimberDescription, + [ABILITY_SAND_VEIL] = sSandVeilDescription, + [ABILITY_STATIC] = sStaticDescription, + [ABILITY_VOLT_ABSORB] = sVoltAbsorbDescription, + [ABILITY_WATER_ABSORB] = sWaterAbsorbDescription, + [ABILITY_OBLIVIOUS] = sObliviousDescription, + [ABILITY_CLOUD_NINE] = sCloudNineDescription, + [ABILITY_COMPOUND_EYES] = sCompoundEyesDescription, + [ABILITY_INSOMNIA] = sInsomniaDescription, + [ABILITY_COLOR_CHANGE] = sColorChangeDescription, + [ABILITY_IMMUNITY] = sImmunityDescription, + [ABILITY_FLASH_FIRE] = sFlashFireDescription, + [ABILITY_SHIELD_DUST] = sShieldDustDescription, + [ABILITY_OWN_TEMPO] = sOwnTempoDescription, + [ABILITY_SUCTION_CUPS] = sSuctionCupsDescription, + [ABILITY_INTIMIDATE] = sIntimidateDescription, + [ABILITY_SHADOW_TAG] = sShadowTagDescription, + [ABILITY_ROUGH_SKIN] = sRoughSkinDescription, + [ABILITY_WONDER_GUARD] = sWonderGuardDescription, + [ABILITY_LEVITATE] = sLevitateDescription, + [ABILITY_EFFECT_SPORE] = sEffectSporeDescription, + [ABILITY_SYNCHRONIZE] = sSynchronizeDescription, + [ABILITY_CLEAR_BODY] = sClearBodyDescription, + [ABILITY_NATURAL_CURE] = sNaturalCureDescription, + [ABILITY_LIGHTNING_ROD] = sLightningRodDescription, + [ABILITY_SERENE_GRACE] = sSereneGraceDescription, + [ABILITY_SWIFT_SWIM] = sSwiftSwimDescription, + [ABILITY_CHLOROPHYLL] = sChlorophyllDescription, + [ABILITY_ILLUMINATE] = sIlluminateDescription, + [ABILITY_TRACE] = sTraceDescription, + [ABILITY_HUGE_POWER] = sHugePowerDescription, + [ABILITY_POISON_POINT] = sPoisonPointDescription, + [ABILITY_INNER_FOCUS] = sInnerFocusDescription, + [ABILITY_MAGMA_ARMOR] = sMagmaArmorDescription, + [ABILITY_WATER_VEIL] = sWaterVeilDescription, + [ABILITY_MAGNET_PULL] = sMagnetPullDescription, + [ABILITY_SOUNDPROOF] = sSoundproofDescription, + [ABILITY_RAIN_DISH] = sRainDishDescription, + [ABILITY_SAND_STREAM] = sSandStreamDescription, + [ABILITY_PRESSURE] = sPressureDescription, + [ABILITY_THICK_FAT] = sThickFatDescription, + [ABILITY_EARLY_BIRD] = sEarlyBirdDescription, + [ABILITY_FLAME_BODY] = sFlameBodyDescription, + [ABILITY_RUN_AWAY] = sRunAwayDescription, + [ABILITY_KEEN_EYE] = sKeenEyeDescription, + [ABILITY_HYPER_CUTTER] = sHyperCutterDescription, + [ABILITY_PICKUP] = sPickupDescription, + [ABILITY_TRUANT] = sTruantDescription, + [ABILITY_HUSTLE] = sHustleDescription, + [ABILITY_CUTE_CHARM] = sCuteCharmDescription, + [ABILITY_PLUS] = sPlusDescription, + [ABILITY_MINUS] = sMinusDescription, + [ABILITY_FORECAST] = sForecastDescription, + [ABILITY_STICKY_HOLD] = sStickyHoldDescription, + [ABILITY_SHED_SKIN] = sShedSkinDescription, + [ABILITY_GUTS] = sGutsDescription, + [ABILITY_MARVEL_SCALE] = sMarvelScaleDescription, + [ABILITY_LIQUID_OOZE] = sLiquidOozeDescription, + [ABILITY_OVERGROW] = sOvergrowDescription, + [ABILITY_BLAZE] = sBlazeDescription, + [ABILITY_TORRENT] = sTorrentDescription, + [ABILITY_SWARM] = sSwarmDescription, + [ABILITY_ROCK_HEAD] = sRockHeadDescription, + [ABILITY_DROUGHT] = sDroughtDescription, + [ABILITY_ARENA_TRAP] = sArenaTrapDescription, + [ABILITY_VITAL_SPIRIT] = sVitalSpiritDescription, + [ABILITY_WHITE_SMOKE] = sWhiteSmokeDescription, + [ABILITY_PURE_POWER] = sPurePowerDescription, + [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, }; - -#endif // POKEEMERALD_DATA_TEXT_ABILITIES_H From cd0934a39928e13fb104a384d115e498177fa3c9 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 16 Sep 2018 10:45:22 +0200 Subject: [PATCH 105/667] Add Fairy Type icon --- graphics/types/fairy.png | Bin 0 -> 245 bytes graphics_file_rules.mk | 2 +- src/graphics.c | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 graphics/types/fairy.png diff --git a/graphics/types/fairy.png b/graphics/types/fairy.png new file mode 100644 index 0000000000000000000000000000000000000000..d8170f64f50157808a63ba5e1f75cd84d70528e0 GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!VDx^^%Amx6id3JuOkD)#(wTUiL5}rL4Z$) zE08{W^#7VE--@H=WKH=t=ia@m|KE982K|rf{(p4Kl%%93j!W(}@0~JbNpp4a|NsAY zm>#qR>R~Ji@(X5gcy=QV$Vv8eaSV~ToZ9cm)!@M48hdSR^tOzPW-lCAor@>--*Yf- zliJeGWhXL4!#J;T>Ng>al`1hI!OhFV9EEk(ObvY^y5fSmUE-t1C$t0BXR=1^GI;yw q5Np{Uvx$7sN%a>D*q7b^Za&#@%Yu6yUCKb~7(8A5T-G@yGywp~ZeLvh literal 0 HcmV?d00001 diff --git a/graphics_file_rules.mk b/graphics_file_rules.mk index fb250ad82a..95180028b6 100644 --- a/graphics_file_rules.mk +++ b/graphics_file_rules.mk @@ -21,7 +21,7 @@ PSSGFXDIR := graphics/pokemon_storage EVENTOBJGFXDIR := graphics/event_objects 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 $(MONSTILLFRONTGFXDIR)/castform_still_front_pic.4bpp: $(MONSTILLFRONTGFXDIR)/castform_normal_form_still_front_pic.4bpp \ diff --git a/src/graphics.c b/src/graphics.c index 38a79ce3c4..8409586a18 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1485,7 +1485,7 @@ const u16 gUnknown_08DD4C4C[] = INCBIN_U16("graphics/link/link_winedge.bin.lz"); const u8 gUnknown_08DD4CF8[] = INCBIN_U8("graphics/interface/unk_change_case.4bpp.lz"); -const u16 gTilesetPalettes_General[][16] = +const u16 gTilesetPalettes_General[][16] = { INCBIN_U16("data/tilesets/primary/general/palettes/00.gbapal"), INCBIN_U16("data/tilesets/primary/general/palettes/01.gbapal"), From 33b6ec8c0aa9844ee9c3185f0a18995ccce1313c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 16 Sep 2018 15:59:17 +0200 Subject: [PATCH 106/667] Add move descriptions for moves --- src/data/text/move_descriptions.h | 3844 +++++++++++++++++++++++------ 1 file changed, 3135 insertions(+), 709 deletions(-) diff --git a/src/data/text/move_descriptions.h b/src/data/text/move_descriptions.h index f8830c5937..a77991eb98 100644 --- a/src/data/text/move_descriptions.h +++ b/src/data/text/move_descriptions.h @@ -1,714 +1,3140 @@ -static const u8 sNullMoveDescription[] = _(""); -static const u8 sPoundMoveDescription[] = _("Pounds the foe with\nforelegs or tail."); -static const u8 sKarateChopMoveDescription[] = _("A chopping attack with a\nhigh critical-hit ratio."); -static const u8 sDoubleSlapMoveDescription[] = _("Repeatedly slaps the foe\n2 to 5 times."); -static const u8 sCometPunchMoveDescription[] = _("Repeatedly punches the foe\n2 to 5 times."); -static const u8 sMegaPunchMoveDescription[] = _("A strong punch thrown with\nincredible power."); -static const u8 sPayDayMoveDescription[] = _("Throws coins at the foe.\nMoney is recovered after."); -static const u8 sFirePunchMoveDescription[] = _("A fiery punch that may burn\nthe foe."); -static const u8 sIcePunchMoveDescription[] = _("An icy punch that may\nfreeze the foe."); -static const u8 sThunderPunchMoveDescription[] = _("An electrified punch that\nmay paralyze the foe."); -static const u8 sScratchMoveDescription[] = _("Scratches the foe with\nsharp claws."); -static const u8 sViceGripMoveDescription[] = _("Grips the foe with large and\npowerful pincers."); -static const u8 sGuillotineMoveDescription[] = _("A powerful pincer attack\nthat may cause fainting."); -static const u8 sRazorWindMoveDescription[] = _("A 2-turn move that strikes\nthe foe on the 2nd turn."); -static const u8 sSwordsDanceMoveDescription[] = _("A fighting dance that\nsharply raises ATTACK."); -static const u8 sCutMoveDescription[] = _("Cuts the foe with sharp\nscythes, claws, etc."); -static const u8 sGustMoveDescription[] = _("Strikes the foe with a gust\nof wind whipped up by wings."); -static const u8 sWingAttackMoveDescription[] = _("Strikes the foe with wings\nspread wide."); -static const u8 sWhirlwindMoveDescription[] = _("Blows away the foe with\nwind and ends the battle."); -static const u8 sFlyMoveDescription[] = _("Flies up on the first turn,\nthen strikes the next turn."); -static const u8 sBindMoveDescription[] = _("Binds and squeezes the foe\nfor 2 to 5 turns."); -static const u8 sSlamMoveDescription[] = _("Slams the foe with a long\ntail, vine, etc."); -static const u8 sVineWhipMoveDescription[] = _("Strikes the foe with\nslender, whiplike vines."); -static const u8 sStompMoveDescription[] = _("Stomps the enemy with a big\nfoot. May cause flinching."); -static const u8 sDoubleKickMoveDescription[] = _("A double-kicking attack\nthat strikes the foe twice."); -static const u8 sMegaKickMoveDescription[] = _("An extremely powerful kick\nwith intense force."); -static const u8 sJumpKickMoveDescription[] = _("A strong jumping kick. May\nmiss and hurt the kicker."); -static const u8 sRollingKickMoveDescription[] = _("A fast kick delivered from\na rapid spin."); -static const u8 sSandAttackMoveDescription[] = _("Reduces the foe’s accuracy\nby hurling sand in its face."); -static const u8 sHeadbuttMoveDescription[] = _("A ramming attack that may\ncause flinching."); -static const u8 sHornAttackMoveDescription[] = _("Jabs the foe with sharp\nhorns."); -static const u8 sFuryAttackMoveDescription[] = _("Jabs the foe 2 to 5 times\nwith sharp horns, etc."); -static const u8 sHornDrillMoveDescription[] = _("A one-hit KO attack that\nuses a horn like a drill."); -static const u8 sTackleMoveDescription[] = _("Charges the foe with a full-\nbody tackle."); -static const u8 sBodySlamMoveDescription[] = _("A full-body slam that may\ncause paralysis."); -static const u8 sWrapMoveDescription[] = _("Wraps and squeezes the foe\n2 to 5 times with vines, etc."); -static const u8 sTakeDownMoveDescription[] = _("A reckless charge attack\nthat also hurts the user."); -static const u8 sThrashMoveDescription[] = _("A rampage of 2 to 3 turns\nthat confuses the user."); -static const u8 sDoubleEdgeMoveDescription[] = _("A life-risking tackle that\nalso hurts the user."); -static const u8 sTailWhipMoveDescription[] = _("Wags the tail to lower the\nfoe’s DEFENSE."); -static const u8 sPoisonStingMoveDescription[] = _("A toxic attack with barbs,\netc., that may poison."); -static const u8 sTwineedleMoveDescription[] = _("Stingers on the forelegs\njab the foe twice."); -static const u8 sPinMissileMoveDescription[] = _("Sharp pins are fired to\nstrike 2 to 5 times."); -static const u8 sLeerMoveDescription[] = _("Frightens the foe with a\nleer to lower DEFENSE."); -static const u8 sBiteMoveDescription[] = _("Bites with vicious fangs.\nMay cause flinching."); -static const u8 sGrowlMoveDescription[] = _("Growls cutely to reduce the\nfoe’s ATTACK."); -static const u8 sRoarMoveDescription[] = _("Makes the foe flee to end\nthe battle."); -static const u8 sSingMoveDescription[] = _("A soothing song lulls the\nfoe into a deep slumber."); -static const u8 sSupersonicMoveDescription[] = _("Emits bizarre sound waves\nthat may confuse the foe."); -static const u8 sSonicBoomMoveDescription[] = _("Launches shock waves that\nalways inflict 20 HP damage."); -static const u8 sDisableMoveDescription[] = _("Psychically disables one of\nthe foe’s moves."); -static const u8 sAcidMoveDescription[] = _("Sprays a hide-melting acid.\nMay lower DEFENSE."); -static const u8 sEmberMoveDescription[] = _("A weak fire attack that may\ninflict a burn."); -static const u8 sFlamethrowerMoveDescription[] = _("A powerful fire attack that\nmay inflict a burn."); -static const u8 sMistMoveDescription[] = _("Creates a mist that stops\nreduction of abilities."); -static const u8 sWaterGunMoveDescription[] = _("Squirts water to attack\nthe foe."); -static const u8 sHydroPumpMoveDescription[] = _("Blasts water at high power\nto strike the foe."); -static const u8 sSurfMoveDescription[] = _("Creates a huge wave, then\ncrashes it down on the foe."); -static const u8 sIceBeamMoveDescription[] = _("Blasts the foe with an icy\nbeam that may freeze it."); -static const u8 sBlizzardMoveDescription[] = _("Hits the foe with an icy\nstorm that may freeze it."); -static const u8 sPsybeamMoveDescription[] = _("Fires a peculiar ray that\nmay confuse the foe."); -static const u8 sBubbleBeamMoveDescription[] = _("Forcefully sprays bubbles\nthat may lower SPEED."); -static const u8 sAuroraBeamMoveDescription[] = _("Fires a rainbow-colored\nbeam that may lower ATTACK."); -static const u8 sHyperBeamMoveDescription[] = _("Powerful, but leaves the\nuser immobile the next turn."); -static const u8 sPeckMoveDescription[] = _("Attacks the foe with a\njabbing beak, etc."); -static const u8 sDrillPeckMoveDescription[] = _("A corkscrewing attack with\nthe beak acting as a drill."); -static const u8 sSubmissionMoveDescription[] = _("A reckless body slam that\nalso hurts the user."); -static const u8 sLowKickMoveDescription[] = _("A kick that inflicts more\ndamage on heavier foes."); -static const u8 sCounterMoveDescription[] = _("Retaliates any physical hit\nwith double the power."); -static const u8 sSeismicTossMoveDescription[] = _("Inflicts damage identical\nto the user’s level."); -static const u8 sStrengthMoveDescription[] = _("Builds enormous power,\nthen slams the foe."); -static const u8 sAbsorbMoveDescription[] = _("An attack that absorbs\nhalf the damage inflicted."); -static const u8 sMegaDrainMoveDescription[] = _("An attack that absorbs\nhalf the damage inflicted."); -static const u8 sLeechSeedMoveDescription[] = _("Plants a seed on the foe to\nsteal HP on every turn."); -static const u8 sGrowthMoveDescription[] = _("Forces the body to grow\nand heightens SP. ATK."); -static const u8 sRazorLeafMoveDescription[] = _("Cuts the enemy with leaves.\nHigh critical-hit ratio."); -static const u8 sSolarBeamMoveDescription[] = _("Absorbs light in one turn,\nthen attacks next turn."); -static const u8 sPoisonPowderMoveDescription[] = _("Scatters a toxic powder\nthat may poison the foe."); -static const u8 sStunSporeMoveDescription[] = _("Scatters a powder that may\nparalyze the foe."); -static const u8 sSleepPowderMoveDescription[] = _("Scatters a powder that may\ncause the foe to sleep."); -static const u8 sPetalDanceMoveDescription[] = _("A rampage of 2 to 3 turns\nthat confuses the user."); -static const u8 sStringShotMoveDescription[] = _("Binds the foe with string\nto reduce its SPEED."); -static const u8 sDragonRageMoveDescription[] = _("Launches shock waves that\nalways inflict 40 HP damage."); -static const u8 sFireSpinMoveDescription[] = _("Traps the foe in a ring of\nfire for 2 to 5 turns."); -static const u8 sThunderShockMoveDescription[] = _("An electrical attack that\nmay paralyze the foe."); -static const u8 sThunderboltMoveDescription[] = _("A strong electrical attack\nthat may paralyze the foe."); -static const u8 sThunderWaveMoveDescription[] = _("A weak jolt of electricity\nthat paralyzes the foe."); -static const u8 sThunderMoveDescription[] = _("A lightning attack that may\ncause paralysis."); -static const u8 sRockThrowMoveDescription[] = _("Throws small rocks to\nstrike the foe."); -static const u8 sEarthquakeMoveDescription[] = _("A powerful quake, but has\nno effect on flying foes."); -static const u8 sFissureMoveDescription[] = _("A one-hit KO move that\ndrops the foe in a fissure."); -static const u8 sDigMoveDescription[] = _("Digs underground the first\nturn and strikes next turn."); -static const u8 sToxicMoveDescription[] = _("Poisons the foe with an\nintensifying toxin."); -static const u8 sConfusionMoveDescription[] = _("A psychic attack that may\ncause confusion."); -static const u8 sPsychicMoveDescription[] = _("A powerful psychic attack\nthat may lower SP. DEF."); -static const u8 sHypnosisMoveDescription[] = _("A hypnotizing move that\nmay induce sleep."); -static const u8 sMeditateMoveDescription[] = _("Meditates in a peaceful\nfashion to raise ATTACK."); -static const u8 sAgilityMoveDescription[] = _("Relaxes the body to sharply\nboost SPEED."); -static const u8 sQuickAttackMoveDescription[] = _("An extremely fast attack\nthat always strikes first."); -static const u8 sRageMoveDescription[] = _("Raises the user’s ATTACK\nevery time it is hit."); -static const u8 sTeleportMoveDescription[] = _("A psychic move for fleeing\nfrom battle instantly."); -static const u8 sNightShadeMoveDescription[] = _("Inflicts damage identical\nto the user’s level."); -static const u8 sMimicMoveDescription[] = _("Copies a move used by the\nfoe during one battle."); -static const u8 sScreechMoveDescription[] = _("Emits a screech to sharply\nreduce the foe’s DEFENSE."); -static const u8 sDoubleTeamMoveDescription[] = _("Creates illusory copies to\nraise evasiveness."); -static const u8 sRecoverMoveDescription[] = _("Recovers up to half the\nuser’s maximum HP."); -static const u8 sHardenMoveDescription[] = _("Stiffens the body’s \nmuscles to raise DEFENSE."); -static const u8 sMinimizeMoveDescription[] = _("Minimizes the user’s size\nto raise evasiveness."); -static const u8 sSmokescreenMoveDescription[] = _("Lowers the foe’s accuracy\nusing smoke, ink, etc."); -static const u8 sConfuseRayMoveDescription[] = _("A sinister ray that\nconfuses the foe."); -static const u8 sWithdrawMoveDescription[] = _("Withdraws the body into its\nhard shell to raise DEFENSE."); -static const u8 sDefenseCurlMoveDescription[] = _("Curls up to conceal weak\nspots and raise DEFENSE."); -static const u8 sBarrierMoveDescription[] = _("Creates a barrier that\nsharply raises DEFENSE."); -static const u8 sLightScreenMoveDescription[] = _("Creates a wall of light that\nlowers SP. ATK damage."); -static const u8 sHazeMoveDescription[] = _("Creates a black haze that\neliminates all stat changes."); -static const u8 sReflectMoveDescription[] = _("Creates a wall of light that\nweakens physical attacks."); -static const u8 sFocusEnergyMoveDescription[] = _("Focuses power to raise the\ncritical-hit ratio."); -static const u8 sBideMoveDescription[] = _("Endures attack for 2\nturns to retaliate double."); -static const u8 sMetronomeMoveDescription[] = _("Waggles a finger to use any\nPOKéMON move at random."); -static const u8 sMirrorMoveMoveDescription[] = _("Counters the foe’s attack\nwith the same move."); -static const u8 sSelfDestructMoveDescription[] = _("Inflicts severe damage but\nmakes the user faint."); -static const u8 sEggBombMoveDescription[] = _("An egg is forcibly hurled at\nthe foe."); -static const u8 sLickMoveDescription[] = _("Licks with a long tongue to\ninjure. May also paralyze."); -static const u8 sSmogMoveDescription[] = _("An exhaust-gas attack\nthat may also poison."); -static const u8 sSludgeMoveDescription[] = _("Sludge is hurled to inflict\ndamage. May also poison."); -static const u8 sBoneClubMoveDescription[] = _("Clubs the foe with a bone.\nMay cause flinching."); -static const u8 sFireBlastMoveDescription[] = _("Incinerates everything it\nstrikes. May cause a burn."); -static const u8 sWaterfallMoveDescription[] = _("Charges the foe with speed\nto climb waterfalls."); -static const u8 sClampMoveDescription[] = _("Traps and squeezes the\nfoe for 2 to 5 turns."); -static const u8 sSwiftMoveDescription[] = _("Sprays star-shaped rays\nthat never miss."); -static const u8 sSkullBashMoveDescription[] = _("Tucks in the head, then\nattacks on the next turn."); -static const u8 sSpikeCannonMoveDescription[] = _("Launches sharp spikes that\nstrike 2 to 5 times."); -static const u8 sConstrictMoveDescription[] = _("Constricts to inflict pain.\nMay lower SPEED."); -static const u8 sAmnesiaMoveDescription[] = _("Forgets about something\nand sharply raises SP. DEF."); -static const u8 sKinesisMoveDescription[] = _("Distracts the foe.\nMay lower accuracy."); -static const u8 sSoftBoiledMoveDescription[] = _("Recovers up to half the\nuser’s maximum HP."); -static const u8 sHiJumpKickMoveDescription[] = _("A jumping knee kick. If it\nmisses, the user is hurt."); -static const u8 sGlareMoveDescription[] = _("Intimidates and frightens\nthe foe into paralysis."); -static const u8 sDreamEaterMoveDescription[] = _("Takes one half the damage\ninflicted on a sleeping foe."); -static const u8 sPoisonGasMoveDescription[] = _("Envelops the foe in a toxic\ngas that may poison."); -static const u8 sBarrageMoveDescription[] = _("Hurls round objects at the\nfoe 2 to 5 times."); -static const u8 sLeechLifeMoveDescription[] = _("An attack that steals half\nthe damage inflicted."); -static const u8 sLovelyKissMoveDescription[] = _("Demands a kiss with a scary\nface that induces sleep."); -static const u8 sSkyAttackMoveDescription[] = _("Searches out weak spots,\nthen strikes the next turn."); -static const u8 sTransformMoveDescription[] = _("Alters the user’s cells to\nbecome a copy of the foe."); -static const u8 sBubbleMoveDescription[] = _("An attack using bubbles.\nMay lower the foe’s SPEED."); -static const u8 sDizzyPunchMoveDescription[] = _("A rhythmic punch that may\nconfuse the foe."); -static const u8 sSporeMoveDescription[] = _("Scatters a cloud of spores\nthat always induce sleep."); -static const u8 sFlashMoveDescription[] = _("Looses a powerful blast of\nlight that cuts accuracy."); -static const u8 sPsywaveMoveDescription[] = _("Attacks with a psychic\nwave of varying intensity."); -static const u8 sSplashMoveDescription[] = _("It’s just a splash...\nHas no effect whatsoever."); -static const u8 sAcidArmorMoveDescription[] = _("Liquifies the user’s body\nto sharply raise DEFENSE."); -static const u8 sCrabhammerMoveDescription[] = _("Hammers with a pincer. Has a\nhigh critical-hit ratio."); -static const u8 sExplosionMoveDescription[] = _("Inflicts severe damage but\nmakes the user faint."); -static const u8 sFurySwipesMoveDescription[] = _("Rakes the foe with sharp\nclaws, etc., 2 to 5 times."); -static const u8 sBonemerangMoveDescription[] = _("Throws a bone boomerang\nthat strikes twice."); -static const u8 sRestMoveDescription[] = _("The user sleeps for 2 turns,\nrestoring HP and status."); -static const u8 sRockSlideMoveDescription[] = _("Large boulders are hurled.\nMay cause flinching."); -static const u8 sHyperFangMoveDescription[] = _("Attacks with sharp fangs.\nMay cause flinching."); -static const u8 sSharpenMoveDescription[] = _("Reduces the polygon count\nand raises ATTACK."); -static const u8 sConversionMoveDescription[] = _("Changes the user’s type\ninto a known move’s type."); -static const u8 sTriAttackMoveDescription[] = _("Fires three types of beams\nat the same time."); -static const u8 sSuperFangMoveDescription[] = _("Attacks with sharp fangs\nand cuts half the foe’s HP."); -static const u8 sSlashMoveDescription[] = _("Slashes with claws, etc. Has\na high critical-hit ratio."); -static const u8 sSubstituteMoveDescription[] = _("Creates a decoy using 1/4\nof the user’s maximum HP."); -static const u8 sStruggleMoveDescription[] = _("Used only if all PP are gone.\nAlso hurts the user a little."); -static const u8 sSketchMoveDescription[] = _("Copies the foe’s last move\npermanently."); -static const u8 sTripleKickMoveDescription[] = _("Kicks the foe 3 times in a\nrow with rising intensity."); -static const u8 sThiefMoveDescription[] = _("While attacking, it may\nsteal the foe’s held item."); -static const u8 sSpiderWebMoveDescription[] = _("Ensnares the foe to stop it\nfrom fleeing or switching."); -static const u8 sMindReaderMoveDescription[] = _("Senses the foe’s action to\nensure the next move’s hit."); -static const u8 sNightmareMoveDescription[] = _("Inflicts 1/4 damage on a\nsleeping foe every turn."); -static const u8 sFlameWheelMoveDescription[] = _("A fiery charge attack that\nmay inflict a burn."); -static const u8 sSnoreMoveDescription[] = _("A loud attack that can be\nused only while asleep."); -static const u8 sCurseMoveDescription[] = _("A move that functions\ndifferently for GHOSTS."); -static const u8 sFlailMoveDescription[] = _("Inflicts more damage when\nthe user’s HP is down."); -static const u8 sConversion2MoveDescription[] = _("Makes the user resistant\nto the last attack’s type."); -static const u8 sAeroblastMoveDescription[] = _("Launches a vacuumed blast.\nHigh critical-hit ratio."); -static const u8 sCottonSporeMoveDescription[] = _("Spores cling to the foe,\nsharply reducing SPEED."); -static const u8 sReversalMoveDescription[] = _("Inflicts more damage when\nthe user’s HP is down."); -static const u8 sSpiteMoveDescription[] = _("Spitefully cuts the PP\nof the foe’s last move."); -static const u8 sPowderSnowMoveDescription[] = _("Blasts the foe with a snowy\ngust. May cause freezing."); -static const u8 sProtectMoveDescription[] = _("Evades attack, but may fail\nif used in succession."); -static const u8 sMachPunchMoveDescription[] = _("A punch is thrown at wicked\nspeed to strike first."); -static const u8 sScaryFaceMoveDescription[] = _("Frightens with a scary face\nto sharply reduce SPEED."); -static const u8 sFaintAttackMoveDescription[] = _("Draws the foe close, then\nstrikes without fail."); -static const u8 sSweetKissMoveDescription[] = _("Demands a kiss with a cute\nlook. May cause confusion."); -static const u8 sBellyDrumMoveDescription[] = _("Maximizes ATTACK while\nsacrificing HP."); -static const u8 sSludgeBombMoveDescription[] = _("Sludge is hurled to inflict\ndamage. May also poison."); -static const u8 sMudSlapMoveDescription[] = _("Hurls mud in the foe’s face\nto reduce its accuracy."); -static const u8 sOctazookaMoveDescription[] = _("Fires a lump of ink to\ndamage and cut accuracy."); -static const u8 sSpikesMoveDescription[] = _("Sets spikes that hurt a \nfoe switching in."); -static const u8 sZapCannonMoveDescription[] = _("Powerful and sure to cause\nparalysis, but inaccurate."); -static const u8 sForesightMoveDescription[] = _("Negates the foe’s efforts\nto heighten evasiveness."); -static const u8 sDestinyBondMoveDescription[] = _("If the user faints, the foe\nis also made to faint."); -static const u8 sPerishSongMoveDescription[] = _("Any POKéMON hearing this\nsong faints in 3 turns."); -static const u8 sIcyWindMoveDescription[] = _("A chilling attack that\nlowers the foe’s SPEED."); -static const u8 sDetectMoveDescription[] = _("Evades attack, but may fail\nif used in succession."); -static const u8 sBoneRushMoveDescription[] = _("Strikes the foe with a bone\nin hand 2 to 5 times."); -static const u8 sLockOnMoveDescription[] = _("Locks on to the foe to\nensure the next move hits."); -static const u8 sOutrageMoveDescription[] = _("A rampage of 2 to 3 turns\nthat confuses the user."); -static const u8 sSandstormMoveDescription[] = _("Causes a sandstorm that\nrages for several turns."); -static const u8 sGigaDrainMoveDescription[] = _("An attack that steals half\nthe damage inflicted."); -static const u8 sEndureMoveDescription[] = _("Endures any attack for\n1 turn, leaving at least 1HP."); -static const u8 sCharmMoveDescription[] = _("Charms the foe and sharply\nreduces its ATTACK."); -static const u8 sRolloutMoveDescription[] = _("An attack lasting 5 turns\nwith rising intensity."); -static const u8 sFalseSwipeMoveDescription[] = _("An attack that leaves the\nfoe with at least 1 HP."); -static const u8 sSwaggerMoveDescription[] = _("Confuses the foe, but also\nsharply raises ATTACK."); -static const u8 sMilkDrinkMoveDescription[] = _("Recovers up to half the\nuser’s maximum HP."); -static const u8 sSparkMoveDescription[] = _("An electrified tackle that\nmay paralyze the foe."); -static const u8 sFuryCutterMoveDescription[] = _("An attack that intensifies\non each successive hit."); -static const u8 sSteelWingMoveDescription[] = _("Strikes the foe with hard\nwings spread wide."); -static const u8 sMeanLookMoveDescription[] = _("Fixes the foe with a mean\nlook that prevents escape."); -static const u8 sAttractMoveDescription[] = _("Makes the opposite gender\nless likely to attack."); -static const u8 sSleepTalkMoveDescription[] = _("Uses an available move\nrandomly while asleep."); -static const u8 sHealBellMoveDescription[] = _("Chimes soothingly to heal\nall status abnormalities."); -static const u8 sReturnMoveDescription[] = _("An attack that increases\nin power with friendship."); -static const u8 sPresentMoveDescription[] = _("A gift in the form of a\nbomb. May restore HP."); -static const u8 sFrustrationMoveDescription[] = _("An attack that is stronger\nif the TRAINER is disliked."); -static const u8 sSafeguardMoveDescription[] = _("A mystical force prevents\nall status problems."); -static const u8 sPainSplitMoveDescription[] = _("Adds the user and foe’s HP,\nthen shares them equally."); -static const u8 sSacredFireMoveDescription[] = _("A mystical fire attack that\nmay inflict a burn."); -static const u8 sMagnitudeMoveDescription[] = _("A ground-shaking attack\nof random intensity."); -static const u8 sDynamicPunchMoveDescription[] = _("Powerful and sure to cause\nconfusion, but inaccurate."); -static const u8 sMegahornMoveDescription[] = _("A brutal ramming attack\nusing out-thrust horns."); -static const u8 sDragonBreathMoveDescription[] = _("Strikes the foe with an\nincredible blast of breath."); -static const u8 sBatonPassMoveDescription[] = _("Switches out the user while\nkeeping effects in play."); -static const u8 sEncoreMoveDescription[] = _("Makes the foe repeat its\nlast move over 2 to 6 turns."); -static const u8 sPursuitMoveDescription[] = _("Inflicts bad damage if used\non a foe switching out."); -static const u8 sRapidSpinMoveDescription[] = _("Spins the body at high\nspeed to strike the foe."); -static const u8 sSweetScentMoveDescription[] = _("Allures the foe to reduce\nevasiveness."); -static const u8 sIronTailMoveDescription[] = _("Attacks with a rock-hard\ntail. May lower DEFENSE."); -static const u8 sMetalClawMoveDescription[] = _("A claw attack that may\nraise the user’s ATTACK."); -static const u8 sVitalThrowMoveDescription[] = _("Makes the user’s move last,\nbut it never misses."); -static const u8 sMorningSunMoveDescription[] = _("Restores HP. The amount\nvaries with the weather."); -static const u8 sSynthesisMoveDescription[] = _("Restores HP. The amount\nvaries with the weather."); -static const u8 sMoonlightMoveDescription[] = _("Restores HP. The amount\nvaries with the weather."); -static const u8 sHiddenPowerMoveDescription[] = _("The effectiveness varies\nwith the user."); -static const u8 sCrossChopMoveDescription[] = _("A double-chopping attack.\nHigh critical-hit ratio."); -static const u8 sTwisterMoveDescription[] = _("Whips up a vicious twister\nto tear at the foe."); -static const u8 sRainDanceMoveDescription[] = _("Boosts the power of WATER-\ntype moves for 5 turns."); -static const u8 sSunnyDayMoveDescription[] = _("Boosts the power of FIRE-\ntype moves for 5 turns."); -static const u8 sCrunchMoveDescription[] = _("Crunches with sharp fangs.\nMay lower SP. DEF."); -static const u8 sMirrorCoatMoveDescription[] = _("Counters the foe’s special\nattack at double the power."); -static const u8 sPsychUpMoveDescription[] = _("Copies the foe’s effect(s)\nand gives to the user."); -static const u8 sExtremeSpeedMoveDescription[] = _("An extremely fast and\npowerful attack."); -static const u8 sAncientPowerMoveDescription[] = _("An attack that may raise\nall stats."); -static const u8 sShadowBallMoveDescription[] = _("Hurls a black blob that may\nlower the foe’s SP. DEF."); -static const u8 sFutureSightMoveDescription[] = _("Heightens inner power to\nstrike 2 turns later."); -static const u8 sRockSmashMoveDescription[] = _("A rock-crushing attack\nthat may lower DEFENSE."); -static const u8 sWhirlpoolMoveDescription[] = _("Traps and hurts the foe in\na whirlpool for 2 to 5 turns."); -static const u8 sBeatUpMoveDescription[] = _("Summons party POKéMON to\njoin in the attack."); -static const u8 sFakeOutMoveDescription[] = _("A 1st-turn, 1st-strike move\nthat causes flinching."); -static const u8 sUproarMoveDescription[] = _("Causes an uproar for 2 to 5\nturns and prevents sleep."); -static const u8 sStockpileMoveDescription[] = _("Charges up power for up to\n3 turns."); -static const u8 sSpitUpMoveDescription[] = _("Releases stockpiled power\n(the more the better)."); -static const u8 sSwallowMoveDescription[] = _("Absorbs stockpiled power\nand restores HP."); -static const u8 sHeatWaveMoveDescription[] = _("Exhales a hot breath on the\nfoe. May inflict a burn."); -static const u8 sHailMoveDescription[] = _("Summons a hailstorm that\nstrikes every turn."); -static const u8 sTormentMoveDescription[] = _("Torments the foe and stops\nsuccessive use of a move."); -static const u8 sFlatterMoveDescription[] = _("Confuses the foe, but\nraises its SP. ATK."); -static const u8 sWillOWispMoveDescription[] = _("Inflicts a burn on the foe\nwith intense fire."); -static const u8 sMementoMoveDescription[] = _("The user faints and lowers\nthe foe’s abilities."); -static const u8 sFacadeMoveDescription[] = _("Boosts ATTACK when burned,\nparalyzed, or poisoned."); -static const u8 sFocusPunchMoveDescription[] = _("A powerful loyalty attack.\nThe user flinches if hit."); -static const u8 sSmellingSaltMoveDescription[] = _("Powerful against paralyzed\nfoes, but also heals them."); -static const u8 sFollowMeMoveDescription[] = _("Draws attention to make\nfoes attack only the user."); -static const u8 sNaturePowerMoveDescription[] = _("The type of attack varies\ndepending on the location."); -static const u8 sChargeMoveDescription[] = _("Charges power to boost the\nelectric move used next."); -static const u8 sTauntMoveDescription[] = _("Taunts the foe into only\nusing attack moves."); -static const u8 sHelpingHandMoveDescription[] = _("Boosts the power of the\nrecipient’s moves."); -static const u8 sTrickMoveDescription[] = _("Tricks the foe into trading\nheld items."); -static const u8 sRolePlayMoveDescription[] = _("Mimics the target and\ncopies its special ability."); -static const u8 sWishMoveDescription[] = _("A wish that restores HP.\nIt takes time to work."); -static const u8 sAssistMoveDescription[] = _("Attacks randomly with one\nof the partner’s moves."); -static const u8 sIngrainMoveDescription[] = _("Lays roots that restore HP.\nThe user can’t switch out."); -static const u8 sSuperpowerMoveDescription[] = _("Boosts strength sharply,\nbut lowers abilities."); -static const u8 sMagicCoatMoveDescription[] = _("Reflects special effects\nback to the attacker."); -static const u8 sRecycleMoveDescription[] = _("Recycles a used item for\none more use."); -static const u8 sRevengeMoveDescription[] = _("An attack that gains power\nif injured by the foe."); -static const u8 sBrickBreakMoveDescription[] = _("Destroys barriers such as\nREFLECT and causes damage."); -static const u8 sYawnMoveDescription[] = _("Lulls the foe into yawning,\nthen sleeping next turn."); -static const u8 sKnockOffMoveDescription[] = _("Knocks down the foe’s held\nitem to prevent its use."); -static const u8 sEndeavorMoveDescription[] = _("Gains power if the user’s HP\nis lower than the foe’s HP."); -static const u8 sEruptionMoveDescription[] = _("The higher the user’s HP,\nthe more damage caused."); -static const u8 sSkillSwapMoveDescription[] = _("The user swaps special\nabilities with the target."); -static const u8 sImprisonMoveDescription[] = _("Prevents foes from using\nmoves known by the user."); -static const u8 sRefreshMoveDescription[] = _("Heals poisoning, paralysis,\nor a burn."); -static const u8 sGrudgeMoveDescription[] = _("If the user faints, deletes\nall PP of foe’s last move."); -static const u8 sSnatchMoveDescription[] = _("Steals the effects of the\nmove the target uses next."); -static const u8 sSecretPowerMoveDescription[] = _("An attack with effects\nthat vary by location."); -static const u8 sDiveMoveDescription[] = _("Dives underwater the first\nturn and strikes next turn."); -static const u8 sArmThrustMoveDescription[] = _("Straight-arm punches that\nstrike the foe 2 to 5 times."); -static const u8 sCamouflageMoveDescription[] = _("Alters the POKéMON’s type\ndepending on the location."); -static const u8 sTailGlowMoveDescription[] = _("Flashes a light that sharply\nraises SP. ATK."); -static const u8 sLusterPurgeMoveDescription[] = _("Attacks with a burst of\nlight. May lower SP. DEF."); -static const u8 sMistBallMoveDescription[] = _("Attacks with a flurry of\ndown. May lower SP. ATK."); -static const u8 sFeatherDanceMoveDescription[] = _("Envelops the foe with down\nto sharply reduce ATTACK."); -static const u8 sTeeterDanceMoveDescription[] = _("Confuses all POKéMON on\nthe scene."); -static const u8 sBlazeKickMoveDescription[] = _("A kick with a high critical-\nhit ratio. May cause a burn."); -static const u8 sMudSportMoveDescription[] = _("Covers the user in mud to\nraise electrical resistance."); -static const u8 sIceBallMoveDescription[] = _("A 5-turn attack that gains\npower on successive hits."); -static const u8 sNeedleArmMoveDescription[] = _("Attacks with thorny arms.\nMay cause flinching."); -static const u8 sSlackOffMoveDescription[] = _("Slacks off and restores\nhalf the maximum HP."); -static const u8 sHyperVoiceMoveDescription[] = _("A loud attack that uses\nsound waves to injure."); -static const u8 sPoisonFangMoveDescription[] = _("A sharp-fanged attack.\nMay badly poison the foe."); -static const u8 sCrushClawMoveDescription[] = _("Tears at the foe with sharp\nclaws. May lower DEFENSE."); -static const u8 sBlastBurnMoveDescription[] = _("Powerful, but leaves the\nuser immobile the next turn."); -static const u8 sHydroCannonMoveDescription[] = _("Powerful, but leaves the\nuser immobile the next turn."); -static const u8 sMeteorMashMoveDescription[] = _("Fires a meteor-like punch.\nMay raise ATTACK."); -static const u8 sAstonishMoveDescription[] = _("An attack that may shock\nthe foe into flinching."); -static const u8 sWeatherBallMoveDescription[] = _("The move’s type and power\nchange with the weather."); -static const u8 sAromatherapyMoveDescription[] = _("Heals all status problems\nwith a soothing scent."); -static const u8 sFakeTearsMoveDescription[] = _("Feigns crying to sharply\nlower the foe’s SP. DEF."); -static const u8 sAirCutterMoveDescription[] = _("Hacks with razorlike wind.\nHigh critical-hit ratio."); -static const u8 sOverheatMoveDescription[] = _("Allows a full-power attack,\nbut sharply lowers SP. ATK."); -static const u8 sOdorSleuthMoveDescription[] = _("Negates the foe’s efforts\nto heighten evasiveness."); -static const u8 sRockTombMoveDescription[] = _("Stops the foe from moving\nwith rocks and cuts SPEED."); -static const u8 sSilverWindMoveDescription[] = _("A powdery attack that may\nraise abilities."); -static const u8 sMetalSoundMoveDescription[] = _("Emits a horrible screech\nthat sharply lowers SP. DEF."); -static const u8 sGrassWhistleMoveDescription[] = _("Lulls the foe into sleep\nwith a pleasant melody."); -static const u8 sTickleMoveDescription[] = _("Makes the foe laugh to\nlower ATTACK and DEFENSE."); -static const u8 sCosmicPowerMoveDescription[] = _("Raises DEFENSE and SP. DEF\nwith a mystic power."); -static const u8 sWaterSpoutMoveDescription[] = _("Inflicts more damage if the\nuser’s HP is high."); -static const u8 sSignalBeamMoveDescription[] = _("A strange beam attack that\nmay confuse the foe."); -static const u8 sShadowPunchMoveDescription[] = _("An unavoidable punch that\nis thrown from shadows."); -static const u8 sExtrasensoryMoveDescription[] = _("Attacks with a peculiar\npower. May cause flinching."); -static const u8 sSkyUppercutMoveDescription[] = _("An uppercut thrown as if\nleaping into the sky."); -static const u8 sSandTombMoveDescription[] = _("Traps and hurts the foe in\nquicksand for 2 to 5 turns."); -static const u8 sSheerColdMoveDescription[] = _("A chilling attack that\ncauses fainting if it hits."); -static const u8 sMuddyWaterMoveDescription[] = _("Attacks with muddy water.\nMay lower accuracy."); -static const u8 sBulletSeedMoveDescription[] = _("Shoots 2 to 5 seeds in a row\nto strike the foe."); -static const u8 sAerialAceMoveDescription[] = _("An extremely speedy and\nunavoidable attack."); -static const u8 sIcicleSpearMoveDescription[] = _("Attacks the foe by firing\n2 to 5 icicles in a row."); -static const u8 sIronDefenseMoveDescription[] = _("Hardens the body’s surface\nto sharply raise DEFENSE."); -static const u8 sBlockMoveDescription[] = _("Blocks the foe’s way to\nprevent escape."); -static const u8 sHowlMoveDescription[] = _("Howls to raise the spirit\nand boosts ATTACK."); -static const u8 sDragonClawMoveDescription[] = _("Slashes the foe with sharp\nclaws."); -static const u8 sFrenzyPlantMoveDescription[] = _("Powerful, but leaves the\nuser immobile the next turn."); -static const u8 sBulkUpMoveDescription[] = _("Bulks up the body to boost\nboth ATTACK and DEFENSE."); -static const u8 sBounceMoveDescription[] = _("Bounces up, then down the\nnext turn. May paralyze."); -static const u8 sMudShotMoveDescription[] = _("Hurls mud at the foe and\nreduces SPEED."); -static const u8 sPoisonTailMoveDescription[] = _("Has a high critical-hit\nratio. May also poison."); -static const u8 sCovetMoveDescription[] = _("Cutely begs to obtain an\nitem held by the foe."); -static const u8 sVoltTackleMoveDescription[] = _("A life-risking tackle that\nslightly hurts the user."); -static const u8 sMagicalLeafMoveDescription[] = _("Attacks with a strange leaf\nthat cannot be evaded."); -static const u8 sWaterSportMoveDescription[] = _("The user becomes soaked to\nraise resistance to fire."); -static const u8 sCalmMindMoveDescription[] = _("Raises SP. ATK and SP. DEF\nby focusing the mind."); -static const u8 sLeafBladeMoveDescription[] = _("Slashes with a sharp leaf.\nHigh critical-hit ratio."); -static const u8 sDragonDanceMoveDescription[] = _("A mystical dance that ups\nATTACK and SPEED."); -static const u8 sRockBlastMoveDescription[] = _("Hurls boulders at the foe\n2 to 5 times in a row."); -static const u8 sShockWaveMoveDescription[] = _("A fast and unavoidable\nelectric attack."); -static const u8 sWaterPulseMoveDescription[] = _("Attacks with ultrasonic\nwaves. May confuse the foe."); -static const u8 sDoomDesireMoveDescription[] = _("Summons strong sunlight to\nattack 2 turns later."); -static const u8 sPsychoBoostMoveDescription[] = _("Allows a full-power attack,\nbut sharply lowers SP. ATK."); +static const u8 sNullDescription[] = _( + ""); + +static const u8 sPoundDescription[] = _( + "Pounds the foe with\n" + "forelegs or tail."); + +static const u8 sKarateChopDescription[] = _( + "A chopping attack with a\n" + "high critical-hit ratio."); + +static const u8 sDoubleSlapDescription[] = _( + "Repeatedly slaps the foe\n" + "2 to 5 times."); + +static const u8 sCometPunchDescription[] = _( + "Repeatedly punches the foe\n" + "2 to 5 times."); + +static const u8 sMegaPunchDescription[] = _( + "A strong punch thrown with\n" + "incredible power."); + +static const u8 sPayDayDescription[] = _( + "Throws coins at the foe.\n" + "Money is recovered after."); + +static const u8 sFirePunchDescription[] = _( + "A fiery punch that may burn\n" + "the foe."); + +static const u8 sIcePunchDescription[] = _( + "An icy punch that may\n" + "freeze the foe."); + +static const u8 sThunderPunchDescription[] = _( + "An electrified punch that\n" + "may paralyze the foe."); + +static const u8 sScratchDescription[] = _( + "Scratches the foe with\n" + "sharp claws."); + +static const u8 sViceGripDescription[] = _( + "Grips the foe with large and\n" + "powerful pincers."); + +static const u8 sGuillotineDescription[] = _( + "A powerful pincer attack\n" + "that may cause fainting."); + +static const u8 sRazorWindDescription[] = _( + "A 2-turn move that strikes\n" + "the foe on the 2nd turn."); + +static const u8 sSwordsDanceDescription[] = _( + "A fighting dance that\n" + "sharply raises ATTACK."); + +static const u8 sCutDescription[] = _( + "Cuts the foe with sharp\n" + "scythes, claws, etc."); + +static const u8 sGustDescription[] = _( + "Strikes the foe with a gust\n" + "of wind whipped up by wings."); + +static const u8 sWingAttackDescription[] = _( + "Strikes the foe with wings\n" + "spread wide."); + +static const u8 sWhirlwindDescription[] = _( + "Blows away the foe with\n" + "wind and ends the battle."); + +static const u8 sFlyDescription[] = _( + "Flies up on the first turn,\n" + "then strikes the next turn."); + +static const u8 sBindDescription[] = _( + "Binds and squeezes the foe\n" + "for 2 to 5 turns."); + +static const u8 sSlamDescription[] = _( + "Slams the foe with a long\n" + "tail, vine, etc."); + +static const u8 sVineWhipDescription[] = _( + "Strikes the foe with\n" + "slender, whiplike vines."); + +static const u8 sStompDescription[] = _( + "Stomps the enemy with a big\n" + "foot. May cause flinching."); + +static const u8 sDoubleKickDescription[] = _( + "A double-kicking attack\n" + "that strikes the foe twice."); + +static const u8 sMegaKickDescription[] = _( + "An extremely powerful kick\n" + "with intense force."); + +static const u8 sJumpKickDescription[] = _( + "A strong jumping kick. May\n" + "miss and hurt the kicker."); + +static const u8 sRollingKickDescription[] = _( + "A fast kick delivered from\n" + "a rapid spin."); + +static const u8 sSandAttackDescription[] = _( + "Reduces the foe’s accuracy\n" + "by hurling sand in its face."); + +static const u8 sHeadbuttDescription[] = _( + "A ramming attack that may\n" + "cause flinching."); + +static const u8 sHornAttackDescription[] = _( + "Jabs the foe with sharp\n" + "horns."); + +static const u8 sFuryAttackDescription[] = _( + "Jabs the foe 2 to 5 times\n" + "with sharp horns, etc."); + +static const u8 sHornDrillDescription[] = _( + "A one-hit KO attack that\n" + "uses a horn like a drill."); + +static const u8 sTackleDescription[] = _( + "Charges the foe with a full-\n" + "body tackle."); + +static const u8 sBodySlamDescription[] = _( + "A full-body slam that may\n" + "cause paralysis."); + +static const u8 sWrapDescription[] = _( + "Wraps and squeezes the foe\n" + "2 to 5 times with vines, etc."); + +static const u8 sTakeDownDescription[] = _( + "A reckless charge attack\n" + "that also hurts the user."); + +static const u8 sThrashDescription[] = _( + "A rampage of 2 to 3 turns\n" + "that confuses the user."); + +static const u8 sDoubleEdgeDescription[] = _( + "A life-risking tackle that\n" + "also hurts the user."); + +static const u8 sTailWhipDescription[] = _( + "Wags the tail to lower the\n" + "foe’s DEFENSE."); + +static const u8 sPoisonStingDescription[] = _( + "A toxic attack with barbs,\n" + "etc., that may poison."); + +static const u8 sTwineedleDescription[] = _( + "Stingers on the forelegs\n" + "jab the foe twice."); + +static const u8 sPinMissileDescription[] = _( + "Sharp pins are fired to\n" + "strike 2 to 5 times."); + +static const u8 sLeerDescription[] = _( + "Frightens the foe with a\n" + "leer to lower DEFENSE."); + +static const u8 sBiteDescription[] = _( + "Bites with vicious fangs.\n" + "May cause flinching."); + +static const u8 sGrowlDescription[] = _( + "Growls cutely to reduce the\n" + "foe’s ATTACK."); + +static const u8 sRoarDescription[] = _( + "Makes the foe flee to end\n" + "the battle."); + +static const u8 sSingDescription[] = _( + "A soothing song lulls the\n" + "foe into a deep slumber."); + +static const u8 sSupersonicDescription[] = _( + "Emits bizarre sound waves\n" + "that may confuse the foe."); + +static const u8 sSonicBoomDescription[] = _( + "Launches shock waves that\n" + "always inflict 20 HP damage."); + +static const u8 sDisableDescription[] = _( + "Psychically disables one of\n" + "the foe’s moves."); + +static const u8 sAcidDescription[] = _( + "Sprays a hide-melting acid.\n" + "May lower DEFENSE."); + +static const u8 sEmberDescription[] = _( + "A weak fire attack that may\n" + "inflict a burn."); + +static const u8 sFlamethrowerDescription[] = _( + "A powerful fire attack that\n" + "may inflict a burn."); + +static const u8 sMistDescription[] = _( + "Creates a mist that stops\n" + "reduction of abilities."); + +static const u8 sWaterGunDescription[] = _( + "Squirts water to attack\n" + "the foe."); + +static const u8 sHydroPumpDescription[] = _( + "Blasts water at high power\n" + "to strike the foe."); + +static const u8 sSurfDescription[] = _( + "Creates a huge wave, then\n" + "crashes it down on the foe."); + +static const u8 sIceBeamDescription[] = _( + "Blasts the foe with an icy\n" + "beam that may freeze it."); + +static const u8 sBlizzardDescription[] = _( + "Hits the foe with an icy\n" + "storm that may freeze it."); + +static const u8 sPsybeamDescription[] = _( + "Fires a peculiar ray that\n" + "may confuse the foe."); + +static const u8 sBubbleBeamDescription[] = _( + "Forcefully sprays bubbles\n" + "that may lower SPEED."); + +static const u8 sAuroraBeamDescription[] = _( + "Fires a rainbow-colored\n" + "beam that may lower ATTACK."); + +static const u8 sHyperBeamDescription[] = _( + "Powerful, but leaves the\n" + "user immobile the next turn."); + +static const u8 sPeckDescription[] = _( + "Attacks the foe with a\n" + "jabbing beak, etc."); + +static const u8 sDrillPeckDescription[] = _( + "A corkscrewing attack with\n" + "the beak acting as a drill."); + +static const u8 sSubmissionDescription[] = _( + "A reckless body slam that\n" + "also hurts the user."); + +static const u8 sLowKickDescription[] = _( + "A kick that inflicts more\n" + "damage on heavier foes."); + +static const u8 sCounterDescription[] = _( + "Retaliates any physical hit\n" + "with double the power."); + +static const u8 sSeismicTossDescription[] = _( + "Inflicts damage identical\n" + "to the user’s level."); + +static const u8 sStrengthDescription[] = _( + "Builds enormous power,\n" + "then slams the foe."); + +static const u8 sAbsorbDescription[] = _( + "An attack that absorbs\n" + "half the damage inflicted."); + +static const u8 sMegaDrainDescription[] = _( + "An attack that absorbs\n" + "half the damage inflicted."); + +static const u8 sLeechSeedDescription[] = _( + "Plants a seed on the foe to\n" + "steal HP on every turn."); + +static const u8 sGrowthDescription[] = _( + "Forces the body to grow\n" + "and heightens SP. ATK."); + +static const u8 sRazorLeafDescription[] = _( + "Cuts the enemy with leaves.\n" + "High critical-hit ratio."); + +static const u8 sSolarBeamDescription[] = _( + "Absorbs light in one turn,\n" + "then attacks next turn."); + +static const u8 sPoisonPowderDescription[] = _( + "Scatters a toxic powder\n" + "that may poison the foe."); + +static const u8 sStunSporeDescription[] = _( + "Scatters a powder that may\n" + "paralyze the foe."); + +static const u8 sSleepPowderDescription[] = _( + "Scatters a powder that may\n" + "cause the foe to sleep."); + +static const u8 sPetalDanceDescription[] = _( + "A rampage of 2 to 3 turns\n" + "that confuses the user."); + +static const u8 sStringShotDescription[] = _( + "Binds the foe with string\n" + "to reduce its SPEED."); + +static const u8 sDragonRageDescription[] = _( + "Launches shock waves that\n" + "always inflict 40 HP damage."); + +static const u8 sFireSpinDescription[] = _( + "Traps the foe in a ring of\n" + "fire for 2 to 5 turns."); + +static const u8 sThunderShockDescription[] = _( + "An electrical attack that\n" + "may paralyze the foe."); + +static const u8 sThunderboltDescription[] = _( + "A strong electrical attack\n" + "that may paralyze the foe."); + +static const u8 sThunderWaveDescription[] = _( + "A weak jolt of electricity\n" + "that paralyzes the foe."); + +static const u8 sThunderDescription[] = _( + "A lightning attack that may\n" + "cause paralysis."); + +static const u8 sRockThrowDescription[] = _( + "Throws small rocks to\n" + "strike the foe."); + +static const u8 sEarthquakeDescription[] = _( + "A powerful quake, but has\n" + "no effect on flying foes."); + +static const u8 sFissureDescription[] = _( + "A one-hit KO move that\n" + "drops the foe in a fissure."); + +static const u8 sDigDescription[] = _( + "Digs underground the first\n" + "turn and strikes next turn."); + +static const u8 sToxicDescription[] = _( + "Poisons the foe with an\n" + "intensifying toxin."); + +static const u8 sConfusionDescription[] = _( + "A psychic attack that may\n" + "cause confusion."); + +static const u8 sPsychicDescription[] = _( + "A powerful psychic attack\n" + "that may lower SP. DEF."); + +static const u8 sHypnosisDescription[] = _( + "A hypnotizing move that\n" + "may induce sleep."); + +static const u8 sMeditateDescription[] = _( + "Meditates in a peaceful\n" + "fashion to raise ATTACK."); + +static const u8 sAgilityDescription[] = _( + "Relaxes the body to sharply\n" + "boost SPEED."); + +static const u8 sQuickAttackDescription[] = _( + "An extremely fast attack\n" + "that always strikes first."); + +static const u8 sRageDescription[] = _( + "Raises the user’s ATTACK\n" + "every time it is hit."); + +static const u8 sTeleportDescription[] = _( + "A psychic move for fleeing\n" + "from battle instantly."); + +static const u8 sNightShadeDescription[] = _( + "Inflicts damage identical\n" + "to the user’s level."); + +static const u8 sMimicDescription[] = _( + "Copies a move used by the\n" + "foe during one battle."); + +static const u8 sScreechDescription[] = _( + "Emits a screech to sharply\n" + "reduce the foe’s DEFENSE."); + +static const u8 sDoubleTeamDescription[] = _( + "Creates illusory copies to\n" + "raise evasiveness."); + +static const u8 sRecoverDescription[] = _( + "Recovers up to half the\n" + "user’s maximum HP."); + +static const u8 sHardenDescription[] = _( + "Stiffens the body’s \n" + "muscles to raise DEFENSE."); + +static const u8 sMinimizeDescription[] = _( + "Minimizes the user’s size\n" + "to raise evasiveness."); + +static const u8 sSmokescreenDescription[] = _( + "Lowers the foe’s accuracy\n" + "using smoke, ink, etc."); + +static const u8 sConfuseRayDescription[] = _( + "A sinister ray that\n" + "confuses the foe."); + +static const u8 sWithdrawDescription[] = _( + "Withdraws the body into its\n" + "hard shell to raise DEFENSE."); + +static const u8 sDefenseCurlDescription[] = _( + "Curls up to conceal weak\n" + "spots and raise DEFENSE."); + +static const u8 sBarrierDescription[] = _( + "Creates a barrier that\n" + "sharply raises DEFENSE."); + +static const u8 sLightScreenDescription[] = _( + "Creates a wall of light that\n" + "lowers SP. ATK damage."); + +static const u8 sHazeDescription[] = _( + "Creates a black haze that\n" + "eliminates all stat changes."); + +static const u8 sReflectDescription[] = _( + "Creates a wall of light that\n" + "weakens physical attacks."); + +static const u8 sFocusEnergyDescription[] = _( + "Focuses power to raise the\n" + "critical-hit ratio."); + +static const u8 sBideDescription[] = _( + "Endures attack for 2\n" + "turns to retaliate double."); + +static const u8 sMetronomeDescription[] = _( + "Waggles a finger to use any\n" + "POKéMON move at random."); + +static const u8 sMirrorMoveDescription[] = _( + "Counters the foe’s attack\n" + "with the same move."); + +static const u8 sSelfDestructDescription[] = _( + "Inflicts severe damage but\n" + "makes the user faint."); + +static const u8 sEggBombDescription[] = _( + "An egg is forcibly hurled at\n" + "the foe."); + +static const u8 sLickDescription[] = _( + "Licks with a long tongue to\n" + "injure. May also paralyze."); + +static const u8 sSmogDescription[] = _( + "An exhaust-gas attack\n" + "that may also poison."); + +static const u8 sSludgeDescription[] = _( + "Sludge is hurled to inflict\n" + "damage. May also poison."); + +static const u8 sBoneClubDescription[] = _( + "Clubs the foe with a bone.\n" + "May cause flinching."); + +static const u8 sFireBlastDescription[] = _( + "Incinerates everything it\n" + "strikes. May cause a burn."); + +static const u8 sWaterfallDescription[] = _( + "Charges the foe with speed\n" + "to climb waterfalls."); + +static const u8 sClampDescription[] = _( + "Traps and squeezes the\n" + "foe for 2 to 5 turns."); + +static const u8 sSwiftDescription[] = _( + "Sprays star-shaped rays\n" + "that never miss."); + +static const u8 sSkullBashDescription[] = _( + "Tucks in the head, then\n" + "attacks on the next turn."); + +static const u8 sSpikeCannonDescription[] = _( + "Launches sharp spikes that\n" + "strike 2 to 5 times."); + +static const u8 sConstrictDescription[] = _( + "Constricts to inflict pain.\n" + "May lower SPEED."); + +static const u8 sAmnesiaDescription[] = _( + "Forgets about something\n" + "and sharply raises SP. DEF."); + +static const u8 sKinesisDescription[] = _( + "Distracts the foe.\n" + "May lower accuracy."); + +static const u8 sSoftBoiledDescription[] = _( + "Recovers up to half the\n" + "user’s maximum HP."); + +static const u8 sHiJumpKickDescription[] = _( + "A jumping knee kick. If it\n" + "misses, the user is hurt."); + +static const u8 sGlareDescription[] = _( + "Intimidates and frightens\n" + "the foe into paralysis."); + +static const u8 sDreamEaterDescription[] = _( + "Takes one half the damage\n" + "inflicted on a sleeping foe."); + +static const u8 sPoisonGasDescription[] = _( + "Envelops the foe in a toxic\n" + "gas that may poison."); + +static const u8 sBarrageDescription[] = _( + "Hurls round objects at the\n" + "foe 2 to 5 times."); + +static const u8 sLeechLifeDescription[] = _( + "An attack that steals half\n" + "the damage inflicted."); + +static const u8 sLovelyKissDescription[] = _( + "Demands a kiss with a scary\n" + "face that induces sleep."); + +static const u8 sSkyAttackDescription[] = _( + "Searches out weak spots,\n" + "then strikes the next turn."); + +static const u8 sTransformDescription[] = _( + "Alters the user’s cells to\n" + "become a copy of the foe."); + +static const u8 sBubbleDescription[] = _( + "An attack using bubbles.\n" + "May lower the foe’s SPEED."); + +static const u8 sDizzyPunchDescription[] = _( + "A rhythmic punch that may\n" + "confuse the foe."); + +static const u8 sSporeDescription[] = _( + "Scatters a cloud of spores\n" + "that always induce sleep."); + +static const u8 sFlashDescription[] = _( + "Looses a powerful blast of\n" + "light that cuts accuracy."); + +static const u8 sPsywaveDescription[] = _( + "Attacks with a psychic\n" + "wave of varying intensity."); + +static const u8 sSplashDescription[] = _( + "It’s just a splash...\n" + "Has no effect whatsoever."); + +static const u8 sAcidArmorDescription[] = _( + "Liquifies the user’s body\n" + "to sharply raise DEFENSE."); + +static const u8 sCrabhammerDescription[] = _( + "Hammers with a pincer. Has a\n" + "high critical-hit ratio."); + +static const u8 sExplosionDescription[] = _( + "Inflicts severe damage but\n" + "makes the user faint."); + +static const u8 sFurySwipesDescription[] = _( + "Rakes the foe with sharp\n" + "claws, etc., 2 to 5 times."); + +static const u8 sBonemerangDescription[] = _( + "Throws a bone boomerang\n" + "that strikes twice."); + +static const u8 sRestDescription[] = _( + "The user sleeps for 2 turns,\n" + "restoring HP and status."); + +static const u8 sRockSlideDescription[] = _( + "Large boulders are hurled.\n" + "May cause flinching."); + +static const u8 sHyperFangDescription[] = _( + "Attacks with sharp fangs.\n" + "May cause flinching."); + +static const u8 sSharpenDescription[] = _( + "Reduces the polygon count\n" + "and raises ATTACK."); + +static const u8 sConversionDescription[] = _( + "Changes the user’s type\n" + "into a known move’s type."); + +static const u8 sTriAttackDescription[] = _( + "Fires three types of beams\n" + "at the same time."); + +static const u8 sSuperFangDescription[] = _( + "Attacks with sharp fangs\n" + "and cuts half the foe’s HP."); + +static const u8 sSlashDescription[] = _( + "Slashes with claws, etc. Has\n" + "a high critical-hit ratio."); + +static const u8 sSubstituteDescription[] = _( + "Creates a decoy using 1/4\n" + "of the user’s maximum HP."); + +static const u8 sStruggleDescription[] = _( + "Used only if all PP are gone.\n" + "Also hurts the user a little."); + +static const u8 sSketchDescription[] = _( + "Copies the foe’s last move\n" + "permanently."); + +static const u8 sTripleKickDescription[] = _( + "Kicks the foe 3 times in a\n" + "row with rising intensity."); + +static const u8 sThiefDescription[] = _( + "While attacking, it may\n" + "steal the foe’s held item."); + +static const u8 sSpiderWebDescription[] = _( + "Ensnares the foe to stop it\n" + "from fleeing or switching."); + +static const u8 sMindReaderDescription[] = _( + "Senses the foe’s action to\n" + "ensure the next move’s hit."); + +static const u8 sNightmareDescription[] = _( + "Inflicts 1/4 damage on a\n" + "sleeping foe every turn."); + +static const u8 sFlameWheelDescription[] = _( + "A fiery charge attack that\n" + "may inflict a burn."); + +static const u8 sSnoreDescription[] = _( + "A loud attack that can be\n" + "used only while asleep."); + +static const u8 sCurseDescription[] = _( + "A move that functions\n" + "differently for GHOSTS."); + +static const u8 sFlailDescription[] = _( + "Inflicts more damage when\n" + "the user’s HP is down."); + +static const u8 sConversion2Description[] = _( + "Makes the user resistant\n" + "to the last attack’s type."); + +static const u8 sAeroblastDescription[] = _( + "Launches a vacuumed blast.\n" + "High critical-hit ratio."); + +static const u8 sCottonSporeDescription[] = _( + "Spores cling to the foe,\n" + "sharply reducing SPEED."); + +static const u8 sReversalDescription[] = _( + "Inflicts more damage when\n" + "the user’s HP is down."); + +static const u8 sSpiteDescription[] = _( + "Spitefully cuts the PP\n" + "of the foe’s last move."); + +static const u8 sPowderSnowDescription[] = _( + "Blasts the foe with a snowy\n" + "gust. May cause freezing."); + +static const u8 sProtectDescription[] = _( + "Evades attack, but may fail\n" + "if used in succession."); + +static const u8 sMachPunchDescription[] = _( + "A punch is thrown at wicked\n" + "speed to strike first."); + +static const u8 sScaryFaceDescription[] = _( + "Frightens with a scary face\n" + "to sharply reduce SPEED."); + +static const u8 sFaintAttackDescription[] = _( + "Draws the foe close, then\n" + "strikes without fail."); + +static const u8 sSweetKissDescription[] = _( + "Demands a kiss with a cute\n" + "look. May cause confusion."); + +static const u8 sBellyDrumDescription[] = _( + "Maximizes ATTACK while\n" + "sacrificing HP."); + +static const u8 sSludgeBombDescription[] = _( + "Sludge is hurled to inflict\n" + "damage. May also poison."); + +static const u8 sMudSlapDescription[] = _( + "Hurls mud in the foe’s face\n" + "to reduce its accuracy."); + +static const u8 sOctazookaDescription[] = _( + "Fires a lump of ink to\n" + "damage and cut accuracy."); + +static const u8 sSpikesDescription[] = _( + "Sets spikes that hurt a \n" + "foe switching in."); + +static const u8 sZapCannonDescription[] = _( + "Powerful and sure to cause\n" + "paralysis, but inaccurate."); + +static const u8 sForesightDescription[] = _( + "Negates the foe’s efforts\n" + "to heighten evasiveness."); + +static const u8 sDestinyBondDescription[] = _( + "If the user faints, the foe\n" + "is also made to faint."); + +static const u8 sPerishSongDescription[] = _( + "Any POKéMON hearing this\n" + "song faints in 3 turns."); + +static const u8 sIcyWindDescription[] = _( + "A chilling attack that\n" + "lowers the foe’s SPEED."); + +static const u8 sDetectDescription[] = _( + "Evades attack, but may fail\n" + "if used in succession."); + +static const u8 sBoneRushDescription[] = _( + "Strikes the foe with a bone\n" + "in hand 2 to 5 times."); + +static const u8 sLockOnDescription[] = _( + "Locks on to the foe to\n" + "ensure the next move hits."); + +static const u8 sOutrageDescription[] = _( + "A rampage of 2 to 3 turns\n" + "that confuses the user."); + +static const u8 sSandstormDescription[] = _( + "Causes a sandstorm that\n" + "rages for several turns."); + +static const u8 sGigaDrainDescription[] = _( + "An attack that steals half\n" + "the damage inflicted."); + +static const u8 sEndureDescription[] = _( + "Endures any attack for\n" + "1 turn, leaving at least 1HP."); + +static const u8 sCharmDescription[] = _( + "Charms the foe and sharply\n" + "reduces its ATTACK."); + +static const u8 sRolloutDescription[] = _( + "An attack lasting 5 turns\n" + "with rising intensity."); + +static const u8 sFalseSwipeDescription[] = _( + "An attack that leaves the\n" + "foe with at least 1 HP."); + +static const u8 sSwaggerDescription[] = _( + "Confuses the foe, but also\n" + "sharply raises ATTACK."); + +static const u8 sMilkDrinkDescription[] = _( + "Recovers up to half the\n" + "user’s maximum HP."); + +static const u8 sSparkDescription[] = _( + "An electrified tackle that\n" + "may paralyze the foe."); + +static const u8 sFuryCutterDescription[] = _( + "An attack that intensifies\n" + "on each successive hit."); + +static const u8 sSteelWingDescription[] = _( + "Strikes the foe with hard\n" + "wings spread wide."); + +static const u8 sMeanLookDescription[] = _( + "Fixes the foe with a mean\n" + "look that prevents escape."); + +static const u8 sAttractDescription[] = _( + "Makes the opposite gender\n" + "less likely to attack."); + +static const u8 sSleepTalkDescription[] = _( + "Uses an available move\n" + "randomly while asleep."); + +static const u8 sHealBellDescription[] = _( + "Chimes soothingly to heal\n" + "all status abnormalities."); + +static const u8 sReturnDescription[] = _( + "An attack that increases\n" + "in power with friendship."); + +static const u8 sPresentDescription[] = _( + "A gift in the form of a\n" + "bomb. May restore HP."); + +static const u8 sFrustrationDescription[] = _( + "An attack that is stronger\n" + "if the TRAINER is disliked."); + +static const u8 sSafeguardDescription[] = _( + "A mystical force prevents\n" + "all status problems."); + +static const u8 sPainSplitDescription[] = _( + "Adds the user and foe’s HP,\n" + "then shares them equally."); + +static const u8 sSacredFireDescription[] = _( + "A mystical fire attack that\n" + "may inflict a burn."); + +static const u8 sMagnitudeDescription[] = _( + "A ground-shaking attack\n" + "of random intensity."); + +static const u8 sDynamicPunchDescription[] = _( + "Powerful and sure to cause\n" + "confusion, but inaccurate."); + +static const u8 sMegahornDescription[] = _( + "A brutal ramming attack\n" + "using out-thrust horns."); + +static const u8 sDragonBreathDescription[] = _( + "Strikes the foe with an\n" + "incredible blast of breath."); + +static const u8 sBatonPassDescription[] = _( + "Switches out the user while\n" + "keeping effects in play."); + +static const u8 sEncoreDescription[] = _( + "Makes the foe repeat its\n" + "last move over 2 to 6 turns."); + +static const u8 sPursuitDescription[] = _( + "Inflicts bad damage if used\n" + "on a foe switching out."); + +static const u8 sRapidSpinDescription[] = _( + "Spins the body at high\n" + "speed to strike the foe."); + +static const u8 sSweetScentDescription[] = _( + "Allures the foe to reduce\n" + "evasiveness."); + +static const u8 sIronTailDescription[] = _( + "Attacks with a rock-hard\n" + "tail. May lower DEFENSE."); + +static const u8 sMetalClawDescription[] = _( + "A claw attack that may\n" + "raise the user’s ATTACK."); + +static const u8 sVitalThrowDescription[] = _( + "Makes the user’s move last,\n" + "but it never misses."); + +static const u8 sMorningSunDescription[] = _( + "Restores HP. The amount\n" + "varies with the weather."); + +static const u8 sSynthesisDescription[] = _( + "Restores HP. The amount\n" + "varies with the weather."); + +static const u8 sMoonlightDescription[] = _( + "Restores HP. The amount\n" + "varies with the weather."); + +static const u8 sHiddenPowerDescription[] = _( + "The effectiveness varies\n" + "with the user."); + +static const u8 sCrossChopDescription[] = _( + "A double-chopping attack.\n" + "High critical-hit ratio."); + +static const u8 sTwisterDescription[] = _( + "Whips up a vicious twister\n" + "to tear at the foe."); + +static const u8 sRainDanceDescription[] = _( + "Boosts the power of WATER-\n" + "type moves for 5 turns."); + +static const u8 sSunnyDayDescription[] = _( + "Boosts the power of FIRE-\n" + "type moves for 5 turns."); + +static const u8 sCrunchDescription[] = _( + "Crunches with sharp fangs.\n" + "May lower SP. DEF."); + +static const u8 sMirrorCoatDescription[] = _( + "Counters the foe’s special\n" + "attack at double the power."); + +static const u8 sPsychUpDescription[] = _( + "Copies the foe’s effect(s)\n" + "and gives to the user."); + +static const u8 sExtremeSpeedDescription[] = _( + "An extremely fast and\n" + "powerful attack."); + +static const u8 sAncientPowerDescription[] = _( + "An attack that may raise\n" + "all stats."); + +static const u8 sShadowBallDescription[] = _( + "Hurls a black blob that may\n" + "lower the foe’s SP. DEF."); + +static const u8 sFutureSightDescription[] = _( + "Heightens inner power to\n" + "strike 2 turns later."); + +static const u8 sRockSmashDescription[] = _( + "A rock-crushing attack\n" + "that may lower DEFENSE."); + +static const u8 sWhirlpoolDescription[] = _( + "Traps and hurts the foe in\n" + "a whirlpool for 2 to 5 turns."); + +static const u8 sBeatUpDescription[] = _( + "Summons party POKéMON to\n" + "join in the attack."); + +static const u8 sFakeOutDescription[] = _( + "A 1st-turn, 1st-strike move\n" + "that causes flinching."); + +static const u8 sUproarDescription[] = _( + "Causes an uproar for 2 to 5\n" + "turns and prevents sleep."); + +static const u8 sStockpileDescription[] = _( + "Charges up power for up to\n" + "3 turns."); + +static const u8 sSpitUpDescription[] = _( + "Releases stockpiled power\n" + "(the more the better)."); + +static const u8 sSwallowDescription[] = _( + "Absorbs stockpiled power\n" + "and restores HP."); + +static const u8 sHeatWaveDescription[] = _( + "Exhales a hot breath on the\n" + "foe. May inflict a burn."); + +static const u8 sHailDescription[] = _( + "Summons a hailstorm that\n" + "strikes every turn."); + +static const u8 sTormentDescription[] = _( + "Torments the foe and stops\n" + "successive use of a move."); + +static const u8 sFlatterDescription[] = _( + "Confuses the foe, but\n" + "raises its SP. ATK."); + +static const u8 sWillOWispDescription[] = _( + "Inflicts a burn on the foe\n" + "with intense fire."); + +static const u8 sMementoDescription[] = _( + "The user faints and lowers\n" + "the foe’s abilities."); + +static const u8 sFacadeDescription[] = _( + "Boosts ATTACK when burned,\n" + "paralyzed, or poisoned."); + +static const u8 sFocusPunchDescription[] = _( + "A powerful loyalty attack.\n" + "The user flinches if hit."); + +static const u8 sSmellingSaltDescription[] = _( + "Powerful against paralyzed\n" + "foes, but also heals them."); + +static const u8 sFollowMeDescription[] = _( + "Draws attention to make\n" + "foes attack only the user."); + +static const u8 sNaturePowerDescription[] = _( + "The type of attack varies\n" + "depending on the location."); + +static const u8 sChargeDescription[] = _( + "Charges power to boost the\n" + "electric move used next."); + +static const u8 sTauntDescription[] = _( + "Taunts the foe into only\n" + "using attack moves."); + +static const u8 sHelpingHandDescription[] = _( + "Boosts the power of the\n" + "recipient’s moves."); + +static const u8 sTrickDescription[] = _( + "Tricks the foe into trading\n" + "held items."); + +static const u8 sRolePlayDescription[] = _( + "Mimics the target and\n" + "copies its special ability."); + +static const u8 sWishDescription[] = _( + "A wish that restores HP.\n" + "It takes time to work."); + +static const u8 sAssistDescription[] = _( + "Attacks randomly with one\n" + "of the partner’s moves."); + +static const u8 sIngrainDescription[] = _( + "Lays roots that restore HP.\n" + "The user can’t switch out."); + +static const u8 sSuperpowerDescription[] = _( + "Boosts strength sharply,\n" + "but lowers abilities."); + +static const u8 sMagicCoatDescription[] = _( + "Reflects special effects\n" + "back to the attacker."); + +static const u8 sRecycleDescription[] = _( + "Recycles a used item for\n" + "one more use."); + +static const u8 sRevengeDescription[] = _( + "An attack that gains power\n" + "if injured by the foe."); + +static const u8 sBrickBreakDescription[] = _( + "Destroys barriers such as\n" + "REFLECT and causes damage."); + +static const u8 sYawnDescription[] = _( + "Lulls the foe into yawning,\n" + "then sleeping next turn."); + +static const u8 sKnockOffDescription[] = _( + "Knocks down the foe’s held\n" + "item to prevent its use."); + +static const u8 sEndeavorDescription[] = _( + "Gains power if the user’s HP\n" + "is lower than the foe’s HP."); + +static const u8 sEruptionDescription[] = _( + "The higher the user’s HP,\n" + "the more damage caused."); + +static const u8 sSkillSwapDescription[] = _( + "The user swaps special\n" + "abilities with the target."); + +static const u8 sImprisonDescription[] = _( + "Prevents foes from using\n" + "moves known by the user."); + +static const u8 sRefreshDescription[] = _( + "Heals poisoning, paralysis,\n" + "or a burn."); + +static const u8 sGrudgeDescription[] = _( + "If the user faints, deletes\n" + "all PP of foe’s last move."); + +static const u8 sSnatchDescription[] = _( + "Steals the effects of the\n" + "move the target uses next."); + +static const u8 sSecretPowerDescription[] = _( + "An attack with effects\n" + "that vary by location."); + +static const u8 sDiveDescription[] = _( + "Dives underwater the first\n" + "turn and strikes next turn."); + +static const u8 sArmThrustDescription[] = _( + "Straight-arm punches that\n" + "strike the foe 2 to 5 times."); + +static const u8 sCamouflageDescription[] = _( + "Alters the POKéMON’s type\n" + "depending on the location."); + +static const u8 sTailGlowDescription[] = _( + "Flashes a light that sharply\n" + "raises SP. ATK."); + +static const u8 sLusterPurgeDescription[] = _( + "Attacks with a burst of\n" + "light. May lower SP. DEF."); + +static const u8 sMistBallDescription[] = _( + "Attacks with a flurry of\n" + "down. May lower SP. ATK."); + +static const u8 sFeatherDanceDescription[] = _( + "Envelops the foe with down\n" + "to sharply reduce ATTACK."); + +static const u8 sTeeterDanceDescription[] = _( + "Confuses all POKéMON on\n" + "the scene."); + +static const u8 sBlazeKickDescription[] = _( + "A kick with a high critical-\n" + "hit ratio. May cause a burn."); + +static const u8 sMudSportDescription[] = _( + "Covers the user in mud to\n" + "raise electrical resistance."); + +static const u8 sIceBallDescription[] = _( + "A 5-turn attack that gains\n" + "power on successive hits."); + +static const u8 sNeedleArmDescription[] = _( + "Attacks with thorny arms.\n" + "May cause flinching."); + +static const u8 sSlackOffDescription[] = _( + "Slacks off and restores\n" + "half the maximum HP."); + +static const u8 sHyperVoiceDescription[] = _( + "A loud attack that uses\n" + "sound waves to injure."); + +static const u8 sPoisonFangDescription[] = _( + "A sharp-fanged attack.\n" + "May badly poison the foe."); + +static const u8 sCrushClawDescription[] = _( + "Tears at the foe with sharp\n" + "claws. May lower DEFENSE."); + +static const u8 sBlastBurnDescription[] = _( + "Powerful, but leaves the\n" + "user immobile the next turn."); + +static const u8 sHydroCannonDescription[] = _( + "Powerful, but leaves the\n" + "user immobile the next turn."); + +static const u8 sMeteorMashDescription[] = _( + "Fires a meteor-like punch.\n" + "May raise ATTACK."); + +static const u8 sAstonishDescription[] = _( + "An attack that may shock\n" + "the foe into flinching."); + +static const u8 sWeatherBallDescription[] = _( + "The move’s type and power\n" + "change with the weather."); + +static const u8 sAromatherapyDescription[] = _( + "Heals all status problems\n" + "with a soothing scent."); + +static const u8 sFakeTearsDescription[] = _( + "Feigns crying to sharply\n" + "lower the foe’s SP. DEF."); + +static const u8 sAirCutterDescription[] = _( + "Hacks with razorlike wind.\n" + "High critical-hit ratio."); + +static const u8 sOverheatDescription[] = _( + "Allows a full-power attack,\n" + "but sharply lowers SP. ATK."); + +static const u8 sOdorSleuthDescription[] = _( + "Negates the foe’s efforts\n" + "to heighten evasiveness."); + +static const u8 sRockTombDescription[] = _( + "Stops the foe from moving\n" + "with rocks and cuts SPEED."); + +static const u8 sSilverWindDescription[] = _( + "A powdery attack that may\n" + "raise abilities."); + +static const u8 sMetalSoundDescription[] = _( + "Emits a horrible screech\n" + "that sharply lowers SP. DEF."); + +static const u8 sGrassWhistleDescription[] = _( + "Lulls the foe into sleep\n" + "with a pleasant melody."); + +static const u8 sTickleDescription[] = _( + "Makes the foe laugh to\n" + "lower ATTACK and DEFENSE."); + +static const u8 sCosmicPowerDescription[] = _( + "Raises DEFENSE and SP. DEF\n" + "with a mystic power."); + +static const u8 sWaterSpoutDescription[] = _( + "Inflicts more damage if the\n" + "user’s HP is high."); + +static const u8 sSignalBeamDescription[] = _( + "A strange beam attack that\n" + "may confuse the foe."); + +static const u8 sShadowPunchDescription[] = _( + "An unavoidable punch that\n" + "is thrown from shadows."); + +static const u8 sExtrasensoryDescription[] = _( + "Attacks with a peculiar\n" + "power. May cause flinching."); + +static const u8 sSkyUppercutDescription[] = _( + "An uppercut thrown as if\n" + "leaping into the sky."); + +static const u8 sSandTombDescription[] = _( + "Traps and hurts the foe in\n" + "quicksand for 2 to 5 turns."); + +static const u8 sSheerColdDescription[] = _( + "A chilling attack that\n" + "causes fainting if it hits."); + +static const u8 sMuddyWaterDescription[] = _( + "Attacks with muddy water.\n" + "May lower accuracy."); + +static const u8 sBulletSeedDescription[] = _( + "Shoots 2 to 5 seeds in a row\n" + "to strike the foe."); + +static const u8 sAerialAceDescription[] = _( + "An extremely speedy and\n" + "unavoidable attack."); + +static const u8 sIcicleSpearDescription[] = _( + "Attacks the foe by firing\n" + "2 to 5 icicles in a row."); + +static const u8 sIronDefenseDescription[] = _( + "Hardens the body’s surface\n" + "to sharply raise DEFENSE."); + +static const u8 sBlockDescription[] = _( + "Blocks the foe’s way to\n" + "prevent escape."); + +static const u8 sHowlDescription[] = _( + "Howls to raise the spirit\n" + "and boosts ATTACK."); + +static const u8 sDragonClawDescription[] = _( + "Slashes the foe with sharp\n" + "claws."); + +static const u8 sFrenzyPlantDescription[] = _( + "Powerful, but leaves the\n" + "user immobile the next turn."); + +static const u8 sBulkUpDescription[] = _( + "Bulks up the body to boost\n" + "both ATTACK and DEFENSE."); + +static const u8 sBounceDescription[] = _( + "Bounces up, then down the\n" + "next turn. May paralyze."); + +static const u8 sMudShotDescription[] = _( + "Hurls mud at the foe and\n" + "reduces SPEED."); + +static const u8 sPoisonTailDescription[] = _( + "Has a high critical-hit\n" + "ratio. May also poison."); + +static const u8 sCovetDescription[] = _( + "Cutely begs to obtain an\n" + "item held by the foe."); + +static const u8 sVoltTackleDescription[] = _( + "A life-risking tackle that\n" + "slightly hurts the user."); + +static const u8 sMagicalLeafDescription[] = _( + "Attacks with a strange leaf\n" + "that cannot be evaded."); + +static const u8 sWaterSportDescription[] = _( + "The user becomes soaked to\n" + "raise resistance to fire."); + +static const u8 sCalmMindDescription[] = _( + "Raises SP. ATK and SP. DEF\n" + "by focusing the mind."); + +static const u8 sLeafBladeDescription[] = _( + "Slashes with a sharp leaf.\n" + "High critical-hit ratio."); + +static const u8 sDragonDanceDescription[] = _( + "A mystical dance that ups\n" + "ATTACK and SPEED."); + +static const u8 sRockBlastDescription[] = _( + "Hurls boulders at the foe\n" + "2 to 5 times in a row."); + +static const u8 sShockWaveDescription[] = _( + "A fast and unavoidable\n" + "electric attack."); + +static const u8 sWaterPulseDescription[] = _( + "Attacks with ultrasonic\n" + "waves. May confuse the foe."); + +static const u8 sDoomDesireDescription[] = _( + "Summons strong sunlight to\n" + "attack 2 turns later."); + +static const u8 sPsychoBoostDescription[] = _( + "Allows a full-power attack,\n" + "but sharply lowers SP. ATK."); + +static const u8 sGRAVITYDescription[] = _( + "Gravity is intensified\n" + "negating levitation."); + +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 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 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 sICE_SHARDDescription[] = _( + "Hurls a chunk of ice that\n" + "always strike first."); + +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 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 sPOWER_WHIPDescription[] = _( + "Violently lashes the foe\n" + "with vines or tentacles."); + +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 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 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 sSPACIAL_RENDDescription[] = _( + "Tears the foe, and space.\n" + "High critical-hit ratio."); + +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 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 foeApos, 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 foeApos, 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 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 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 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" + "CanApos, 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 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 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 sSPARKLING_ARIADescription[] = _( + "Sings with bubbles. Cures\n" + "burns on contact."); + +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 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 sBURN_UPDescription[] = _( + "Burns out the user fully\n" + "removing the Fire type."); + +static const u8 sSPEED_SWAPDescription[] = _( + "Swaps user’s Speed with\n" + "the targetApos, 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 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] = { - [MOVE_POUND - 1] = sPoundMoveDescription, - [MOVE_KARATE_CHOP - 1] = sKarateChopMoveDescription, - [MOVE_DOUBLE_SLAP - 1] = sDoubleSlapMoveDescription, - [MOVE_COMET_PUNCH - 1] = sCometPunchMoveDescription, - [MOVE_MEGA_PUNCH - 1] = sMegaPunchMoveDescription, - [MOVE_PAY_DAY - 1] = sPayDayMoveDescription, - [MOVE_FIRE_PUNCH - 1] = sFirePunchMoveDescription, - [MOVE_ICE_PUNCH - 1] = sIcePunchMoveDescription, - [MOVE_THUNDER_PUNCH - 1] = sThunderPunchMoveDescription, - [MOVE_SCRATCH - 1] = sScratchMoveDescription, - [MOVE_VICE_GRIP - 1] = sViceGripMoveDescription, - [MOVE_GUILLOTINE - 1] = sGuillotineMoveDescription, - [MOVE_RAZOR_WIND - 1] = sRazorWindMoveDescription, - [MOVE_SWORDS_DANCE - 1] = sSwordsDanceMoveDescription, - [MOVE_CUT - 1] = sCutMoveDescription, - [MOVE_GUST - 1] = sGustMoveDescription, - [MOVE_WING_ATTACK - 1] = sWingAttackMoveDescription, - [MOVE_WHIRLWIND - 1] = sWhirlwindMoveDescription, - [MOVE_FLY - 1] = sFlyMoveDescription, - [MOVE_BIND - 1] = sBindMoveDescription, - [MOVE_SLAM - 1] = sSlamMoveDescription, - [MOVE_VINE_WHIP - 1] = sVineWhipMoveDescription, - [MOVE_STOMP - 1] = sStompMoveDescription, - [MOVE_DOUBLE_KICK - 1] = sDoubleKickMoveDescription, - [MOVE_MEGA_KICK - 1] = sMegaKickMoveDescription, - [MOVE_JUMP_KICK - 1] = sJumpKickMoveDescription, - [MOVE_ROLLING_KICK - 1] = sRollingKickMoveDescription, - [MOVE_SAND_ATTACK - 1] = sSandAttackMoveDescription, - [MOVE_HEADBUTT - 1] = sHeadbuttMoveDescription, - [MOVE_HORN_ATTACK - 1] = sHornAttackMoveDescription, - [MOVE_FURY_ATTACK - 1] = sFuryAttackMoveDescription, - [MOVE_HORN_DRILL - 1] = sHornDrillMoveDescription, - [MOVE_TACKLE - 1] = sTackleMoveDescription, - [MOVE_BODY_SLAM - 1] = sBodySlamMoveDescription, - [MOVE_WRAP - 1] = sWrapMoveDescription, - [MOVE_TAKE_DOWN - 1] = sTakeDownMoveDescription, - [MOVE_THRASH - 1] = sThrashMoveDescription, - [MOVE_DOUBLE_EDGE - 1] = sDoubleEdgeMoveDescription, - [MOVE_TAIL_WHIP - 1] = sTailWhipMoveDescription, - [MOVE_POISON_STING - 1] = sPoisonStingMoveDescription, - [MOVE_TWINEEDLE - 1] = sTwineedleMoveDescription, - [MOVE_PIN_MISSILE - 1] = sPinMissileMoveDescription, - [MOVE_LEER - 1] = sLeerMoveDescription, - [MOVE_BITE - 1] = sBiteMoveDescription, - [MOVE_GROWL - 1] = sGrowlMoveDescription, - [MOVE_ROAR - 1] = sRoarMoveDescription, - [MOVE_SING - 1] = sSingMoveDescription, - [MOVE_SUPERSONIC - 1] = sSupersonicMoveDescription, - [MOVE_SONIC_BOOM - 1] = sSonicBoomMoveDescription, - [MOVE_DISABLE - 1] = sDisableMoveDescription, - [MOVE_ACID - 1] = sAcidMoveDescription, - [MOVE_EMBER - 1] = sEmberMoveDescription, - [MOVE_FLAMETHROWER - 1] = sFlamethrowerMoveDescription, - [MOVE_MIST - 1] = sMistMoveDescription, - [MOVE_WATER_GUN - 1] = sWaterGunMoveDescription, - [MOVE_HYDRO_PUMP - 1] = sHydroPumpMoveDescription, - [MOVE_SURF - 1] = sSurfMoveDescription, - [MOVE_ICE_BEAM - 1] = sIceBeamMoveDescription, - [MOVE_BLIZZARD - 1] = sBlizzardMoveDescription, - [MOVE_PSYBEAM - 1] = sPsybeamMoveDescription, - [MOVE_BUBBLE_BEAM - 1] = sBubbleBeamMoveDescription, - [MOVE_AURORA_BEAM - 1] = sAuroraBeamMoveDescription, - [MOVE_HYPER_BEAM - 1] = sHyperBeamMoveDescription, - [MOVE_PECK - 1] = sPeckMoveDescription, - [MOVE_DRILL_PECK - 1] = sDrillPeckMoveDescription, - [MOVE_SUBMISSION - 1] = sSubmissionMoveDescription, - [MOVE_LOW_KICK - 1] = sLowKickMoveDescription, - [MOVE_COUNTER - 1] = sCounterMoveDescription, - [MOVE_SEISMIC_TOSS - 1] = sSeismicTossMoveDescription, - [MOVE_STRENGTH - 1] = sStrengthMoveDescription, - [MOVE_ABSORB - 1] = sAbsorbMoveDescription, - [MOVE_MEGA_DRAIN - 1] = sMegaDrainMoveDescription, - [MOVE_LEECH_SEED - 1] = sLeechSeedMoveDescription, - [MOVE_GROWTH - 1] = sGrowthMoveDescription, - [MOVE_RAZOR_LEAF - 1] = sRazorLeafMoveDescription, - [MOVE_SOLAR_BEAM - 1] = sSolarBeamMoveDescription, - [MOVE_POISON_POWDER - 1] = sPoisonPowderMoveDescription, - [MOVE_STUN_SPORE - 1] = sStunSporeMoveDescription, - [MOVE_SLEEP_POWDER - 1] = sSleepPowderMoveDescription, - [MOVE_PETAL_DANCE - 1] = sPetalDanceMoveDescription, - [MOVE_STRING_SHOT - 1] = sStringShotMoveDescription, - [MOVE_DRAGON_RAGE - 1] = sDragonRageMoveDescription, - [MOVE_FIRE_SPIN - 1] = sFireSpinMoveDescription, - [MOVE_THUNDER_SHOCK - 1] = sThunderShockMoveDescription, - [MOVE_THUNDERBOLT - 1] = sThunderboltMoveDescription, - [MOVE_THUNDER_WAVE - 1] = sThunderWaveMoveDescription, - [MOVE_THUNDER - 1] = sThunderMoveDescription, - [MOVE_ROCK_THROW - 1] = sRockThrowMoveDescription, - [MOVE_EARTHQUAKE - 1] = sEarthquakeMoveDescription, - [MOVE_FISSURE - 1] = sFissureMoveDescription, - [MOVE_DIG - 1] = sDigMoveDescription, - [MOVE_TOXIC - 1] = sToxicMoveDescription, - [MOVE_CONFUSION - 1] = sConfusionMoveDescription, - [MOVE_PSYCHIC - 1] = sPsychicMoveDescription, - [MOVE_HYPNOSIS - 1] = sHypnosisMoveDescription, - [MOVE_MEDITATE - 1] = sMeditateMoveDescription, - [MOVE_AGILITY - 1] = sAgilityMoveDescription, - [MOVE_QUICK_ATTACK - 1] = sQuickAttackMoveDescription, - [MOVE_RAGE - 1] = sRageMoveDescription, - [MOVE_TELEPORT - 1] = sTeleportMoveDescription, - [MOVE_NIGHT_SHADE - 1] = sNightShadeMoveDescription, - [MOVE_MIMIC - 1] = sMimicMoveDescription, - [MOVE_SCREECH - 1] = sScreechMoveDescription, - [MOVE_DOUBLE_TEAM - 1] = sDoubleTeamMoveDescription, - [MOVE_RECOVER - 1] = sRecoverMoveDescription, - [MOVE_HARDEN - 1] = sHardenMoveDescription, - [MOVE_MINIMIZE - 1] = sMinimizeMoveDescription, - [MOVE_SMOKESCREEN - 1] = sSmokescreenMoveDescription, - [MOVE_CONFUSE_RAY - 1] = sConfuseRayMoveDescription, - [MOVE_WITHDRAW - 1] = sWithdrawMoveDescription, - [MOVE_DEFENSE_CURL - 1] = sDefenseCurlMoveDescription, - [MOVE_BARRIER - 1] = sBarrierMoveDescription, - [MOVE_LIGHT_SCREEN - 1] = sLightScreenMoveDescription, - [MOVE_HAZE - 1] = sHazeMoveDescription, - [MOVE_REFLECT - 1] = sReflectMoveDescription, - [MOVE_FOCUS_ENERGY - 1] = sFocusEnergyMoveDescription, - [MOVE_BIDE - 1] = sBideMoveDescription, - [MOVE_METRONOME - 1] = sMetronomeMoveDescription, - [MOVE_MIRROR_MOVE - 1] = sMirrorMoveMoveDescription, - [MOVE_SELF_DESTRUCT - 1] = sSelfDestructMoveDescription, - [MOVE_EGG_BOMB - 1] = sEggBombMoveDescription, - [MOVE_LICK - 1] = sLickMoveDescription, - [MOVE_SMOG - 1] = sSmogMoveDescription, - [MOVE_SLUDGE - 1] = sSludgeMoveDescription, - [MOVE_BONE_CLUB - 1] = sBoneClubMoveDescription, - [MOVE_FIRE_BLAST - 1] = sFireBlastMoveDescription, - [MOVE_WATERFALL - 1] = sWaterfallMoveDescription, - [MOVE_CLAMP - 1] = sClampMoveDescription, - [MOVE_SWIFT - 1] = sSwiftMoveDescription, - [MOVE_SKULL_BASH - 1] = sSkullBashMoveDescription, - [MOVE_SPIKE_CANNON - 1] = sSpikeCannonMoveDescription, - [MOVE_CONSTRICT - 1] = sConstrictMoveDescription, - [MOVE_AMNESIA - 1] = sAmnesiaMoveDescription, - [MOVE_KINESIS - 1] = sKinesisMoveDescription, - [MOVE_SOFT_BOILED - 1] = sSoftBoiledMoveDescription, - [MOVE_HI_JUMP_KICK - 1] = sHiJumpKickMoveDescription, - [MOVE_GLARE - 1] = sGlareMoveDescription, - [MOVE_DREAM_EATER - 1] = sDreamEaterMoveDescription, - [MOVE_POISON_GAS - 1] = sPoisonGasMoveDescription, - [MOVE_BARRAGE - 1] = sBarrageMoveDescription, - [MOVE_LEECH_LIFE - 1] = sLeechLifeMoveDescription, - [MOVE_LOVELY_KISS - 1] = sLovelyKissMoveDescription, - [MOVE_SKY_ATTACK - 1] = sSkyAttackMoveDescription, - [MOVE_TRANSFORM - 1] = sTransformMoveDescription, - [MOVE_BUBBLE - 1] = sBubbleMoveDescription, - [MOVE_DIZZY_PUNCH - 1] = sDizzyPunchMoveDescription, - [MOVE_SPORE - 1] = sSporeMoveDescription, - [MOVE_FLASH - 1] = sFlashMoveDescription, - [MOVE_PSYWAVE - 1] = sPsywaveMoveDescription, - [MOVE_SPLASH - 1] = sSplashMoveDescription, - [MOVE_ACID_ARMOR - 1] = sAcidArmorMoveDescription, - [MOVE_CRABHAMMER - 1] = sCrabhammerMoveDescription, - [MOVE_EXPLOSION - 1] = sExplosionMoveDescription, - [MOVE_FURY_SWIPES - 1] = sFurySwipesMoveDescription, - [MOVE_BONEMERANG - 1] = sBonemerangMoveDescription, - [MOVE_REST - 1] = sRestMoveDescription, - [MOVE_ROCK_SLIDE - 1] = sRockSlideMoveDescription, - [MOVE_HYPER_FANG - 1] = sHyperFangMoveDescription, - [MOVE_SHARPEN - 1] = sSharpenMoveDescription, - [MOVE_CONVERSION - 1] = sConversionMoveDescription, - [MOVE_TRI_ATTACK - 1] = sTriAttackMoveDescription, - [MOVE_SUPER_FANG - 1] = sSuperFangMoveDescription, - [MOVE_SLASH - 1] = sSlashMoveDescription, - [MOVE_SUBSTITUTE - 1] = sSubstituteMoveDescription, - [MOVE_STRUGGLE - 1] = sStruggleMoveDescription, - [MOVE_SKETCH - 1] = sSketchMoveDescription, - [MOVE_TRIPLE_KICK - 1] = sTripleKickMoveDescription, - [MOVE_THIEF - 1] = sThiefMoveDescription, - [MOVE_SPIDER_WEB - 1] = sSpiderWebMoveDescription, - [MOVE_MIND_READER - 1] = sMindReaderMoveDescription, - [MOVE_NIGHTMARE - 1] = sNightmareMoveDescription, - [MOVE_FLAME_WHEEL - 1] = sFlameWheelMoveDescription, - [MOVE_SNORE - 1] = sSnoreMoveDescription, - [MOVE_CURSE - 1] = sCurseMoveDescription, - [MOVE_FLAIL - 1] = sFlailMoveDescription, - [MOVE_CONVERSION_2 - 1] = sConversion2MoveDescription, - [MOVE_AEROBLAST - 1] = sAeroblastMoveDescription, - [MOVE_COTTON_SPORE - 1] = sCottonSporeMoveDescription, - [MOVE_REVERSAL - 1] = sReversalMoveDescription, - [MOVE_SPITE - 1] = sSpiteMoveDescription, - [MOVE_POWDER_SNOW - 1] = sPowderSnowMoveDescription, - [MOVE_PROTECT - 1] = sProtectMoveDescription, - [MOVE_MACH_PUNCH - 1] = sMachPunchMoveDescription, - [MOVE_SCARY_FACE - 1] = sScaryFaceMoveDescription, - [MOVE_FAINT_ATTACK - 1] = sFaintAttackMoveDescription, - [MOVE_SWEET_KISS - 1] = sSweetKissMoveDescription, - [MOVE_BELLY_DRUM - 1] = sBellyDrumMoveDescription, - [MOVE_SLUDGE_BOMB - 1] = sSludgeBombMoveDescription, - [MOVE_MUD_SLAP - 1] = sMudSlapMoveDescription, - [MOVE_OCTAZOOKA - 1] = sOctazookaMoveDescription, - [MOVE_SPIKES - 1] = sSpikesMoveDescription, - [MOVE_ZAP_CANNON - 1] = sZapCannonMoveDescription, - [MOVE_FORESIGHT - 1] = sForesightMoveDescription, - [MOVE_DESTINY_BOND - 1] = sDestinyBondMoveDescription, - [MOVE_PERISH_SONG - 1] = sPerishSongMoveDescription, - [MOVE_ICY_WIND - 1] = sIcyWindMoveDescription, - [MOVE_DETECT - 1] = sDetectMoveDescription, - [MOVE_BONE_RUSH - 1] = sBoneRushMoveDescription, - [MOVE_LOCK_ON - 1] = sLockOnMoveDescription, - [MOVE_OUTRAGE - 1] = sOutrageMoveDescription, - [MOVE_SANDSTORM - 1] = sSandstormMoveDescription, - [MOVE_GIGA_DRAIN - 1] = sGigaDrainMoveDescription, - [MOVE_ENDURE - 1] = sEndureMoveDescription, - [MOVE_CHARM - 1] = sCharmMoveDescription, - [MOVE_ROLLOUT - 1] = sRolloutMoveDescription, - [MOVE_FALSE_SWIPE - 1] = sFalseSwipeMoveDescription, - [MOVE_SWAGGER - 1] = sSwaggerMoveDescription, - [MOVE_MILK_DRINK - 1] = sMilkDrinkMoveDescription, - [MOVE_SPARK - 1] = sSparkMoveDescription, - [MOVE_FURY_CUTTER - 1] = sFuryCutterMoveDescription, - [MOVE_STEEL_WING - 1] = sSteelWingMoveDescription, - [MOVE_MEAN_LOOK - 1] = sMeanLookMoveDescription, - [MOVE_ATTRACT - 1] = sAttractMoveDescription, - [MOVE_SLEEP_TALK - 1] = sSleepTalkMoveDescription, - [MOVE_HEAL_BELL - 1] = sHealBellMoveDescription, - [MOVE_RETURN - 1] = sReturnMoveDescription, - [MOVE_PRESENT - 1] = sPresentMoveDescription, - [MOVE_FRUSTRATION - 1] = sFrustrationMoveDescription, - [MOVE_SAFEGUARD - 1] = sSafeguardMoveDescription, - [MOVE_PAIN_SPLIT - 1] = sPainSplitMoveDescription, - [MOVE_SACRED_FIRE - 1] = sSacredFireMoveDescription, - [MOVE_MAGNITUDE - 1] = sMagnitudeMoveDescription, - [MOVE_DYNAMIC_PUNCH - 1] = sDynamicPunchMoveDescription, - [MOVE_MEGAHORN - 1] = sMegahornMoveDescription, - [MOVE_DRAGON_BREATH - 1] = sDragonBreathMoveDescription, - [MOVE_BATON_PASS - 1] = sBatonPassMoveDescription, - [MOVE_ENCORE - 1] = sEncoreMoveDescription, - [MOVE_PURSUIT - 1] = sPursuitMoveDescription, - [MOVE_RAPID_SPIN - 1] = sRapidSpinMoveDescription, - [MOVE_SWEET_SCENT - 1] = sSweetScentMoveDescription, - [MOVE_IRON_TAIL - 1] = sIronTailMoveDescription, - [MOVE_METAL_CLAW - 1] = sMetalClawMoveDescription, - [MOVE_VITAL_THROW - 1] = sVitalThrowMoveDescription, - [MOVE_MORNING_SUN - 1] = sMorningSunMoveDescription, - [MOVE_SYNTHESIS - 1] = sSynthesisMoveDescription, - [MOVE_MOONLIGHT - 1] = sMoonlightMoveDescription, - [MOVE_HIDDEN_POWER - 1] = sHiddenPowerMoveDescription, - [MOVE_CROSS_CHOP - 1] = sCrossChopMoveDescription, - [MOVE_TWISTER - 1] = sTwisterMoveDescription, - [MOVE_RAIN_DANCE - 1] = sRainDanceMoveDescription, - [MOVE_SUNNY_DAY - 1] = sSunnyDayMoveDescription, - [MOVE_CRUNCH - 1] = sCrunchMoveDescription, - [MOVE_MIRROR_COAT - 1] = sMirrorCoatMoveDescription, - [MOVE_PSYCH_UP - 1] = sPsychUpMoveDescription, - [MOVE_EXTREME_SPEED - 1] = sExtremeSpeedMoveDescription, - [MOVE_ANCIENT_POWER - 1] = sAncientPowerMoveDescription, - [MOVE_SHADOW_BALL - 1] = sShadowBallMoveDescription, - [MOVE_FUTURE_SIGHT - 1] = sFutureSightMoveDescription, - [MOVE_ROCK_SMASH - 1] = sRockSmashMoveDescription, - [MOVE_WHIRLPOOL - 1] = sWhirlpoolMoveDescription, - [MOVE_BEAT_UP - 1] = sBeatUpMoveDescription, - [MOVE_FAKE_OUT - 1] = sFakeOutMoveDescription, - [MOVE_UPROAR - 1] = sUproarMoveDescription, - [MOVE_STOCKPILE - 1] = sStockpileMoveDescription, - [MOVE_SPIT_UP - 1] = sSpitUpMoveDescription, - [MOVE_SWALLOW - 1] = sSwallowMoveDescription, - [MOVE_HEAT_WAVE - 1] = sHeatWaveMoveDescription, - [MOVE_HAIL - 1] = sHailMoveDescription, - [MOVE_TORMENT - 1] = sTormentMoveDescription, - [MOVE_FLATTER - 1] = sFlatterMoveDescription, - [MOVE_WILL_O_WISP - 1] = sWillOWispMoveDescription, - [MOVE_MEMENTO - 1] = sMementoMoveDescription, - [MOVE_FACADE - 1] = sFacadeMoveDescription, - [MOVE_FOCUS_PUNCH - 1] = sFocusPunchMoveDescription, - [MOVE_SMELLING_SALT - 1] = sSmellingSaltMoveDescription, - [MOVE_FOLLOW_ME - 1] = sFollowMeMoveDescription, - [MOVE_NATURE_POWER - 1] = sNaturePowerMoveDescription, - [MOVE_CHARGE - 1] = sChargeMoveDescription, - [MOVE_TAUNT - 1] = sTauntMoveDescription, - [MOVE_HELPING_HAND - 1] = sHelpingHandMoveDescription, - [MOVE_TRICK - 1] = sTrickMoveDescription, - [MOVE_ROLE_PLAY - 1] = sRolePlayMoveDescription, - [MOVE_WISH - 1] = sWishMoveDescription, - [MOVE_ASSIST - 1] = sAssistMoveDescription, - [MOVE_INGRAIN - 1] = sIngrainMoveDescription, - [MOVE_SUPERPOWER - 1] = sSuperpowerMoveDescription, - [MOVE_MAGIC_COAT - 1] = sMagicCoatMoveDescription, - [MOVE_RECYCLE - 1] = sRecycleMoveDescription, - [MOVE_REVENGE - 1] = sRevengeMoveDescription, - [MOVE_BRICK_BREAK - 1] = sBrickBreakMoveDescription, - [MOVE_YAWN - 1] = sYawnMoveDescription, - [MOVE_KNOCK_OFF - 1] = sKnockOffMoveDescription, - [MOVE_ENDEAVOR - 1] = sEndeavorMoveDescription, - [MOVE_ERUPTION - 1] = sEruptionMoveDescription, - [MOVE_SKILL_SWAP - 1] = sSkillSwapMoveDescription, - [MOVE_IMPRISON - 1] = sImprisonMoveDescription, - [MOVE_REFRESH - 1] = sRefreshMoveDescription, - [MOVE_GRUDGE - 1] = sGrudgeMoveDescription, - [MOVE_SNATCH - 1] = sSnatchMoveDescription, - [MOVE_SECRET_POWER - 1] = sSecretPowerMoveDescription, - [MOVE_DIVE - 1] = sDiveMoveDescription, - [MOVE_ARM_THRUST - 1] = sArmThrustMoveDescription, - [MOVE_CAMOUFLAGE - 1] = sCamouflageMoveDescription, - [MOVE_TAIL_GLOW - 1] = sTailGlowMoveDescription, - [MOVE_LUSTER_PURGE - 1] = sLusterPurgeMoveDescription, - [MOVE_MIST_BALL - 1] = sMistBallMoveDescription, - [MOVE_FEATHER_DANCE - 1] = sFeatherDanceMoveDescription, - [MOVE_TEETER_DANCE - 1] = sTeeterDanceMoveDescription, - [MOVE_BLAZE_KICK - 1] = sBlazeKickMoveDescription, - [MOVE_MUD_SPORT - 1] = sMudSportMoveDescription, - [MOVE_ICE_BALL - 1] = sIceBallMoveDescription, - [MOVE_NEEDLE_ARM - 1] = sNeedleArmMoveDescription, - [MOVE_SLACK_OFF - 1] = sSlackOffMoveDescription, - [MOVE_HYPER_VOICE - 1] = sHyperVoiceMoveDescription, - [MOVE_POISON_FANG - 1] = sPoisonFangMoveDescription, - [MOVE_CRUSH_CLAW - 1] = sCrushClawMoveDescription, - [MOVE_BLAST_BURN - 1] = sBlastBurnMoveDescription, - [MOVE_HYDRO_CANNON - 1] = sHydroCannonMoveDescription, - [MOVE_METEOR_MASH - 1] = sMeteorMashMoveDescription, - [MOVE_ASTONISH - 1] = sAstonishMoveDescription, - [MOVE_WEATHER_BALL - 1] = sWeatherBallMoveDescription, - [MOVE_AROMATHERAPY - 1] = sAromatherapyMoveDescription, - [MOVE_FAKE_TEARS - 1] = sFakeTearsMoveDescription, - [MOVE_AIR_CUTTER - 1] = sAirCutterMoveDescription, - [MOVE_OVERHEAT - 1] = sOverheatMoveDescription, - [MOVE_ODOR_SLEUTH - 1] = sOdorSleuthMoveDescription, - [MOVE_ROCK_TOMB - 1] = sRockTombMoveDescription, - [MOVE_SILVER_WIND - 1] = sSilverWindMoveDescription, - [MOVE_METAL_SOUND - 1] = sMetalSoundMoveDescription, - [MOVE_GRASS_WHISTLE - 1] = sGrassWhistleMoveDescription, - [MOVE_TICKLE - 1] = sTickleMoveDescription, - [MOVE_COSMIC_POWER - 1] = sCosmicPowerMoveDescription, - [MOVE_WATER_SPOUT - 1] = sWaterSpoutMoveDescription, - [MOVE_SIGNAL_BEAM - 1] = sSignalBeamMoveDescription, - [MOVE_SHADOW_PUNCH - 1] = sShadowPunchMoveDescription, - [MOVE_EXTRASENSORY - 1] = sExtrasensoryMoveDescription, - [MOVE_SKY_UPPERCUT - 1] = sSkyUppercutMoveDescription, - [MOVE_SAND_TOMB - 1] = sSandTombMoveDescription, - [MOVE_SHEER_COLD - 1] = sSheerColdMoveDescription, - [MOVE_MUDDY_WATER - 1] = sMuddyWaterMoveDescription, - [MOVE_BULLET_SEED - 1] = sBulletSeedMoveDescription, - [MOVE_AERIAL_ACE - 1] = sAerialAceMoveDescription, - [MOVE_ICICLE_SPEAR - 1] = sIcicleSpearMoveDescription, - [MOVE_IRON_DEFENSE - 1] = sIronDefenseMoveDescription, - [MOVE_BLOCK - 1] = sBlockMoveDescription, - [MOVE_HOWL - 1] = sHowlMoveDescription, - [MOVE_DRAGON_CLAW - 1] = sDragonClawMoveDescription, - [MOVE_FRENZY_PLANT - 1] = sFrenzyPlantMoveDescription, - [MOVE_BULK_UP - 1] = sBulkUpMoveDescription, - [MOVE_BOUNCE - 1] = sBounceMoveDescription, - [MOVE_MUD_SHOT - 1] = sMudShotMoveDescription, - [MOVE_POISON_TAIL - 1] = sPoisonTailMoveDescription, - [MOVE_COVET - 1] = sCovetMoveDescription, - [MOVE_VOLT_TACKLE - 1] = sVoltTackleMoveDescription, - [MOVE_MAGICAL_LEAF - 1] = sMagicalLeafMoveDescription, - [MOVE_WATER_SPORT - 1] = sWaterSportMoveDescription, - [MOVE_CALM_MIND - 1] = sCalmMindMoveDescription, - [MOVE_LEAF_BLADE - 1] = sLeafBladeMoveDescription, - [MOVE_DRAGON_DANCE - 1] = sDragonDanceMoveDescription, - [MOVE_ROCK_BLAST - 1] = sRockBlastMoveDescription, - [MOVE_SHOCK_WAVE - 1] = sShockWaveMoveDescription, - [MOVE_WATER_PULSE - 1] = sWaterPulseMoveDescription, - [MOVE_DOOM_DESIRE - 1] = sDoomDesireMoveDescription, - [MOVE_PSYCHO_BOOST - 1] = sPsychoBoostMoveDescription, + [MOVE_POUND - 1] = sPoundDescription, + [MOVE_KARATE_CHOP - 1] = sKarateChopDescription, + [MOVE_DOUBLE_SLAP - 1] = sDoubleSlapDescription, + [MOVE_COMET_PUNCH - 1] = sCometPunchDescription, + [MOVE_MEGA_PUNCH - 1] = sMegaPunchDescription, + [MOVE_PAY_DAY - 1] = sPayDayDescription, + [MOVE_FIRE_PUNCH - 1] = sFirePunchDescription, + [MOVE_ICE_PUNCH - 1] = sIcePunchDescription, + [MOVE_THUNDER_PUNCH - 1] = sThunderPunchDescription, + [MOVE_SCRATCH - 1] = sScratchDescription, + [MOVE_VICE_GRIP - 1] = sViceGripDescription, + [MOVE_GUILLOTINE - 1] = sGuillotineDescription, + [MOVE_RAZOR_WIND - 1] = sRazorWindDescription, + [MOVE_SWORDS_DANCE - 1] = sSwordsDanceDescription, + [MOVE_CUT - 1] = sCutDescription, + [MOVE_GUST - 1] = sGustDescription, + [MOVE_WING_ATTACK - 1] = sWingAttackDescription, + [MOVE_WHIRLWIND - 1] = sWhirlwindDescription, + [MOVE_FLY - 1] = sFlyDescription, + [MOVE_BIND - 1] = sBindDescription, + [MOVE_SLAM - 1] = sSlamDescription, + [MOVE_VINE_WHIP - 1] = sVineWhipDescription, + [MOVE_STOMP - 1] = sStompDescription, + [MOVE_DOUBLE_KICK - 1] = sDoubleKickDescription, + [MOVE_MEGA_KICK - 1] = sMegaKickDescription, + [MOVE_JUMP_KICK - 1] = sJumpKickDescription, + [MOVE_ROLLING_KICK - 1] = sRollingKickDescription, + [MOVE_SAND_ATTACK - 1] = sSandAttackDescription, + [MOVE_HEADBUTT - 1] = sHeadbuttDescription, + [MOVE_HORN_ATTACK - 1] = sHornAttackDescription, + [MOVE_FURY_ATTACK - 1] = sFuryAttackDescription, + [MOVE_HORN_DRILL - 1] = sHornDrillDescription, + [MOVE_TACKLE - 1] = sTackleDescription, + [MOVE_BODY_SLAM - 1] = sBodySlamDescription, + [MOVE_WRAP - 1] = sWrapDescription, + [MOVE_TAKE_DOWN - 1] = sTakeDownDescription, + [MOVE_THRASH - 1] = sThrashDescription, + [MOVE_DOUBLE_EDGE - 1] = sDoubleEdgeDescription, + [MOVE_TAIL_WHIP - 1] = sTailWhipDescription, + [MOVE_POISON_STING - 1] = sPoisonStingDescription, + [MOVE_TWINEEDLE - 1] = sTwineedleDescription, + [MOVE_PIN_MISSILE - 1] = sPinMissileDescription, + [MOVE_LEER - 1] = sLeerDescription, + [MOVE_BITE - 1] = sBiteDescription, + [MOVE_GROWL - 1] = sGrowlDescription, + [MOVE_ROAR - 1] = sRoarDescription, + [MOVE_SING - 1] = sSingDescription, + [MOVE_SUPERSONIC - 1] = sSupersonicDescription, + [MOVE_SONIC_BOOM - 1] = sSonicBoomDescription, + [MOVE_DISABLE - 1] = sDisableDescription, + [MOVE_ACID - 1] = sAcidDescription, + [MOVE_EMBER - 1] = sEmberDescription, + [MOVE_FLAMETHROWER - 1] = sFlamethrowerDescription, + [MOVE_MIST - 1] = sMistDescription, + [MOVE_WATER_GUN - 1] = sWaterGunDescription, + [MOVE_HYDRO_PUMP - 1] = sHydroPumpDescription, + [MOVE_SURF - 1] = sSurfDescription, + [MOVE_ICE_BEAM - 1] = sIceBeamDescription, + [MOVE_BLIZZARD - 1] = sBlizzardDescription, + [MOVE_PSYBEAM - 1] = sPsybeamDescription, + [MOVE_BUBBLE_BEAM - 1] = sBubbleBeamDescription, + [MOVE_AURORA_BEAM - 1] = sAuroraBeamDescription, + [MOVE_HYPER_BEAM - 1] = sHyperBeamDescription, + [MOVE_PECK - 1] = sPeckDescription, + [MOVE_DRILL_PECK - 1] = sDrillPeckDescription, + [MOVE_SUBMISSION - 1] = sSubmissionDescription, + [MOVE_LOW_KICK - 1] = sLowKickDescription, + [MOVE_COUNTER - 1] = sCounterDescription, + [MOVE_SEISMIC_TOSS - 1] = sSeismicTossDescription, + [MOVE_STRENGTH - 1] = sStrengthDescription, + [MOVE_ABSORB - 1] = sAbsorbDescription, + [MOVE_MEGA_DRAIN - 1] = sMegaDrainDescription, + [MOVE_LEECH_SEED - 1] = sLeechSeedDescription, + [MOVE_GROWTH - 1] = sGrowthDescription, + [MOVE_RAZOR_LEAF - 1] = sRazorLeafDescription, + [MOVE_SOLAR_BEAM - 1] = sSolarBeamDescription, + [MOVE_POISON_POWDER - 1] = sPoisonPowderDescription, + [MOVE_STUN_SPORE - 1] = sStunSporeDescription, + [MOVE_SLEEP_POWDER - 1] = sSleepPowderDescription, + [MOVE_PETAL_DANCE - 1] = sPetalDanceDescription, + [MOVE_STRING_SHOT - 1] = sStringShotDescription, + [MOVE_DRAGON_RAGE - 1] = sDragonRageDescription, + [MOVE_FIRE_SPIN - 1] = sFireSpinDescription, + [MOVE_THUNDER_SHOCK - 1] = sThunderShockDescription, + [MOVE_THUNDERBOLT - 1] = sThunderboltDescription, + [MOVE_THUNDER_WAVE - 1] = sThunderWaveDescription, + [MOVE_THUNDER - 1] = sThunderDescription, + [MOVE_ROCK_THROW - 1] = sRockThrowDescription, + [MOVE_EARTHQUAKE - 1] = sEarthquakeDescription, + [MOVE_FISSURE - 1] = sFissureDescription, + [MOVE_DIG - 1] = sDigDescription, + [MOVE_TOXIC - 1] = sToxicDescription, + [MOVE_CONFUSION - 1] = sConfusionDescription, + [MOVE_PSYCHIC - 1] = sPsychicDescription, + [MOVE_HYPNOSIS - 1] = sHypnosisDescription, + [MOVE_MEDITATE - 1] = sMeditateDescription, + [MOVE_AGILITY - 1] = sAgilityDescription, + [MOVE_QUICK_ATTACK - 1] = sQuickAttackDescription, + [MOVE_RAGE - 1] = sRageDescription, + [MOVE_TELEPORT - 1] = sTeleportDescription, + [MOVE_NIGHT_SHADE - 1] = sNightShadeDescription, + [MOVE_MIMIC - 1] = sMimicDescription, + [MOVE_SCREECH - 1] = sScreechDescription, + [MOVE_DOUBLE_TEAM - 1] = sDoubleTeamDescription, + [MOVE_RECOVER - 1] = sRecoverDescription, + [MOVE_HARDEN - 1] = sHardenDescription, + [MOVE_MINIMIZE - 1] = sMinimizeDescription, + [MOVE_SMOKESCREEN - 1] = sSmokescreenDescription, + [MOVE_CONFUSE_RAY - 1] = sConfuseRayDescription, + [MOVE_WITHDRAW - 1] = sWithdrawDescription, + [MOVE_DEFENSE_CURL - 1] = sDefenseCurlDescription, + [MOVE_BARRIER - 1] = sBarrierDescription, + [MOVE_LIGHT_SCREEN - 1] = sLightScreenDescription, + [MOVE_HAZE - 1] = sHazeDescription, + [MOVE_REFLECT - 1] = sReflectDescription, + [MOVE_FOCUS_ENERGY - 1] = sFocusEnergyDescription, + [MOVE_BIDE - 1] = sBideDescription, + [MOVE_METRONOME - 1] = sMetronomeDescription, + [MOVE_MIRROR_MOVE - 1] = sMirrorMoveDescription, + [MOVE_SELF_DESTRUCT - 1] = sSelfDestructDescription, + [MOVE_EGG_BOMB - 1] = sEggBombDescription, + [MOVE_LICK - 1] = sLickDescription, + [MOVE_SMOG - 1] = sSmogDescription, + [MOVE_SLUDGE - 1] = sSludgeDescription, + [MOVE_BONE_CLUB - 1] = sBoneClubDescription, + [MOVE_FIRE_BLAST - 1] = sFireBlastDescription, + [MOVE_WATERFALL - 1] = sWaterfallDescription, + [MOVE_CLAMP - 1] = sClampDescription, + [MOVE_SWIFT - 1] = sSwiftDescription, + [MOVE_SKULL_BASH - 1] = sSkullBashDescription, + [MOVE_SPIKE_CANNON - 1] = sSpikeCannonDescription, + [MOVE_CONSTRICT - 1] = sConstrictDescription, + [MOVE_AMNESIA - 1] = sAmnesiaDescription, + [MOVE_KINESIS - 1] = sKinesisDescription, + [MOVE_SOFT_BOILED - 1] = sSoftBoiledDescription, + [MOVE_HI_JUMP_KICK - 1] = sHiJumpKickDescription, + [MOVE_GLARE - 1] = sGlareDescription, + [MOVE_DREAM_EATER - 1] = sDreamEaterDescription, + [MOVE_POISON_GAS - 1] = sPoisonGasDescription, + [MOVE_BARRAGE - 1] = sBarrageDescription, + [MOVE_LEECH_LIFE - 1] = sLeechLifeDescription, + [MOVE_LOVELY_KISS - 1] = sLovelyKissDescription, + [MOVE_SKY_ATTACK - 1] = sSkyAttackDescription, + [MOVE_TRANSFORM - 1] = sTransformDescription, + [MOVE_BUBBLE - 1] = sBubbleDescription, + [MOVE_DIZZY_PUNCH - 1] = sDizzyPunchDescription, + [MOVE_SPORE - 1] = sSporeDescription, + [MOVE_FLASH - 1] = sFlashDescription, + [MOVE_PSYWAVE - 1] = sPsywaveDescription, + [MOVE_SPLASH - 1] = sSplashDescription, + [MOVE_ACID_ARMOR - 1] = sAcidArmorDescription, + [MOVE_CRABHAMMER - 1] = sCrabhammerDescription, + [MOVE_EXPLOSION - 1] = sExplosionDescription, + [MOVE_FURY_SWIPES - 1] = sFurySwipesDescription, + [MOVE_BONEMERANG - 1] = sBonemerangDescription, + [MOVE_REST - 1] = sRestDescription, + [MOVE_ROCK_SLIDE - 1] = sRockSlideDescription, + [MOVE_HYPER_FANG - 1] = sHyperFangDescription, + [MOVE_SHARPEN - 1] = sSharpenDescription, + [MOVE_CONVERSION - 1] = sConversionDescription, + [MOVE_TRI_ATTACK - 1] = sTriAttackDescription, + [MOVE_SUPER_FANG - 1] = sSuperFangDescription, + [MOVE_SLASH - 1] = sSlashDescription, + [MOVE_SUBSTITUTE - 1] = sSubstituteDescription, + [MOVE_STRUGGLE - 1] = sStruggleDescription, + [MOVE_SKETCH - 1] = sSketchDescription, + [MOVE_TRIPLE_KICK - 1] = sTripleKickDescription, + [MOVE_THIEF - 1] = sThiefDescription, + [MOVE_SPIDER_WEB - 1] = sSpiderWebDescription, + [MOVE_MIND_READER - 1] = sMindReaderDescription, + [MOVE_NIGHTMARE - 1] = sNightmareDescription, + [MOVE_FLAME_WHEEL - 1] = sFlameWheelDescription, + [MOVE_SNORE - 1] = sSnoreDescription, + [MOVE_CURSE - 1] = sCurseDescription, + [MOVE_FLAIL - 1] = sFlailDescription, + [MOVE_CONVERSION_2 - 1] = sConversion2Description, + [MOVE_AEROBLAST - 1] = sAeroblastDescription, + [MOVE_COTTON_SPORE - 1] = sCottonSporeDescription, + [MOVE_REVERSAL - 1] = sReversalDescription, + [MOVE_SPITE - 1] = sSpiteDescription, + [MOVE_POWDER_SNOW - 1] = sPowderSnowDescription, + [MOVE_PROTECT - 1] = sProtectDescription, + [MOVE_MACH_PUNCH - 1] = sMachPunchDescription, + [MOVE_SCARY_FACE - 1] = sScaryFaceDescription, + [MOVE_FAINT_ATTACK - 1] = sFaintAttackDescription, + [MOVE_SWEET_KISS - 1] = sSweetKissDescription, + [MOVE_BELLY_DRUM - 1] = sBellyDrumDescription, + [MOVE_SLUDGE_BOMB - 1] = sSludgeBombDescription, + [MOVE_MUD_SLAP - 1] = sMudSlapDescription, + [MOVE_OCTAZOOKA - 1] = sOctazookaDescription, + [MOVE_SPIKES - 1] = sSpikesDescription, + [MOVE_ZAP_CANNON - 1] = sZapCannonDescription, + [MOVE_FORESIGHT - 1] = sForesightDescription, + [MOVE_DESTINY_BOND - 1] = sDestinyBondDescription, + [MOVE_PERISH_SONG - 1] = sPerishSongDescription, + [MOVE_ICY_WIND - 1] = sIcyWindDescription, + [MOVE_DETECT - 1] = sDetectDescription, + [MOVE_BONE_RUSH - 1] = sBoneRushDescription, + [MOVE_LOCK_ON - 1] = sLockOnDescription, + [MOVE_OUTRAGE - 1] = sOutrageDescription, + [MOVE_SANDSTORM - 1] = sSandstormDescription, + [MOVE_GIGA_DRAIN - 1] = sGigaDrainDescription, + [MOVE_ENDURE - 1] = sEndureDescription, + [MOVE_CHARM - 1] = sCharmDescription, + [MOVE_ROLLOUT - 1] = sRolloutDescription, + [MOVE_FALSE_SWIPE - 1] = sFalseSwipeDescription, + [MOVE_SWAGGER - 1] = sSwaggerDescription, + [MOVE_MILK_DRINK - 1] = sMilkDrinkDescription, + [MOVE_SPARK - 1] = sSparkDescription, + [MOVE_FURY_CUTTER - 1] = sFuryCutterDescription, + [MOVE_STEEL_WING - 1] = sSteelWingDescription, + [MOVE_MEAN_LOOK - 1] = sMeanLookDescription, + [MOVE_ATTRACT - 1] = sAttractDescription, + [MOVE_SLEEP_TALK - 1] = sSleepTalkDescription, + [MOVE_HEAL_BELL - 1] = sHealBellDescription, + [MOVE_RETURN - 1] = sReturnDescription, + [MOVE_PRESENT - 1] = sPresentDescription, + [MOVE_FRUSTRATION - 1] = sFrustrationDescription, + [MOVE_SAFEGUARD - 1] = sSafeguardDescription, + [MOVE_PAIN_SPLIT - 1] = sPainSplitDescription, + [MOVE_SACRED_FIRE - 1] = sSacredFireDescription, + [MOVE_MAGNITUDE - 1] = sMagnitudeDescription, + [MOVE_DYNAMIC_PUNCH - 1] = sDynamicPunchDescription, + [MOVE_MEGAHORN - 1] = sMegahornDescription, + [MOVE_DRAGON_BREATH - 1] = sDragonBreathDescription, + [MOVE_BATON_PASS - 1] = sBatonPassDescription, + [MOVE_ENCORE - 1] = sEncoreDescription, + [MOVE_PURSUIT - 1] = sPursuitDescription, + [MOVE_RAPID_SPIN - 1] = sRapidSpinDescription, + [MOVE_SWEET_SCENT - 1] = sSweetScentDescription, + [MOVE_IRON_TAIL - 1] = sIronTailDescription, + [MOVE_METAL_CLAW - 1] = sMetalClawDescription, + [MOVE_VITAL_THROW - 1] = sVitalThrowDescription, + [MOVE_MORNING_SUN - 1] = sMorningSunDescription, + [MOVE_SYNTHESIS - 1] = sSynthesisDescription, + [MOVE_MOONLIGHT - 1] = sMoonlightDescription, + [MOVE_HIDDEN_POWER - 1] = sHiddenPowerDescription, + [MOVE_CROSS_CHOP - 1] = sCrossChopDescription, + [MOVE_TWISTER - 1] = sTwisterDescription, + [MOVE_RAIN_DANCE - 1] = sRainDanceDescription, + [MOVE_SUNNY_DAY - 1] = sSunnyDayDescription, + [MOVE_CRUNCH - 1] = sCrunchDescription, + [MOVE_MIRROR_COAT - 1] = sMirrorCoatDescription, + [MOVE_PSYCH_UP - 1] = sPsychUpDescription, + [MOVE_EXTREME_SPEED - 1] = sExtremeSpeedDescription, + [MOVE_ANCIENT_POWER - 1] = sAncientPowerDescription, + [MOVE_SHADOW_BALL - 1] = sShadowBallDescription, + [MOVE_FUTURE_SIGHT - 1] = sFutureSightDescription, + [MOVE_ROCK_SMASH - 1] = sRockSmashDescription, + [MOVE_WHIRLPOOL - 1] = sWhirlpoolDescription, + [MOVE_BEAT_UP - 1] = sBeatUpDescription, + [MOVE_FAKE_OUT - 1] = sFakeOutDescription, + [MOVE_UPROAR - 1] = sUproarDescription, + [MOVE_STOCKPILE - 1] = sStockpileDescription, + [MOVE_SPIT_UP - 1] = sSpitUpDescription, + [MOVE_SWALLOW - 1] = sSwallowDescription, + [MOVE_HEAT_WAVE - 1] = sHeatWaveDescription, + [MOVE_HAIL - 1] = sHailDescription, + [MOVE_TORMENT - 1] = sTormentDescription, + [MOVE_FLATTER - 1] = sFlatterDescription, + [MOVE_WILL_O_WISP - 1] = sWillOWispDescription, + [MOVE_MEMENTO - 1] = sMementoDescription, + [MOVE_FACADE - 1] = sFacadeDescription, + [MOVE_FOCUS_PUNCH - 1] = sFocusPunchDescription, + [MOVE_SMELLING_SALT - 1] = sSmellingSaltDescription, + [MOVE_FOLLOW_ME - 1] = sFollowMeDescription, + [MOVE_NATURE_POWER - 1] = sNaturePowerDescription, + [MOVE_CHARGE - 1] = sChargeDescription, + [MOVE_TAUNT - 1] = sTauntDescription, + [MOVE_HELPING_HAND - 1] = sHelpingHandDescription, + [MOVE_TRICK - 1] = sTrickDescription, + [MOVE_ROLE_PLAY - 1] = sRolePlayDescription, + [MOVE_WISH - 1] = sWishDescription, + [MOVE_ASSIST - 1] = sAssistDescription, + [MOVE_INGRAIN - 1] = sIngrainDescription, + [MOVE_SUPERPOWER - 1] = sSuperpowerDescription, + [MOVE_MAGIC_COAT - 1] = sMagicCoatDescription, + [MOVE_RECYCLE - 1] = sRecycleDescription, + [MOVE_REVENGE - 1] = sRevengeDescription, + [MOVE_BRICK_BREAK - 1] = sBrickBreakDescription, + [MOVE_YAWN - 1] = sYawnDescription, + [MOVE_KNOCK_OFF - 1] = sKnockOffDescription, + [MOVE_ENDEAVOR - 1] = sEndeavorDescription, + [MOVE_ERUPTION - 1] = sEruptionDescription, + [MOVE_SKILL_SWAP - 1] = sSkillSwapDescription, + [MOVE_IMPRISON - 1] = sImprisonDescription, + [MOVE_REFRESH - 1] = sRefreshDescription, + [MOVE_GRUDGE - 1] = sGrudgeDescription, + [MOVE_SNATCH - 1] = sSnatchDescription, + [MOVE_SECRET_POWER - 1] = sSecretPowerDescription, + [MOVE_DIVE - 1] = sDiveDescription, + [MOVE_ARM_THRUST - 1] = sArmThrustDescription, + [MOVE_CAMOUFLAGE - 1] = sCamouflageDescription, + [MOVE_TAIL_GLOW - 1] = sTailGlowDescription, + [MOVE_LUSTER_PURGE - 1] = sLusterPurgeDescription, + [MOVE_MIST_BALL - 1] = sMistBallDescription, + [MOVE_FEATHER_DANCE - 1] = sFeatherDanceDescription, + [MOVE_TEETER_DANCE - 1] = sTeeterDanceDescription, + [MOVE_BLAZE_KICK - 1] = sBlazeKickDescription, + [MOVE_MUD_SPORT - 1] = sMudSportDescription, + [MOVE_ICE_BALL - 1] = sIceBallDescription, + [MOVE_NEEDLE_ARM - 1] = sNeedleArmDescription, + [MOVE_SLACK_OFF - 1] = sSlackOffDescription, + [MOVE_HYPER_VOICE - 1] = sHyperVoiceDescription, + [MOVE_POISON_FANG - 1] = sPoisonFangDescription, + [MOVE_CRUSH_CLAW - 1] = sCrushClawDescription, + [MOVE_BLAST_BURN - 1] = sBlastBurnDescription, + [MOVE_HYDRO_CANNON - 1] = sHydroCannonDescription, + [MOVE_METEOR_MASH - 1] = sMeteorMashDescription, + [MOVE_ASTONISH - 1] = sAstonishDescription, + [MOVE_WEATHER_BALL - 1] = sWeatherBallDescription, + [MOVE_AROMATHERAPY - 1] = sAromatherapyDescription, + [MOVE_FAKE_TEARS - 1] = sFakeTearsDescription, + [MOVE_AIR_CUTTER - 1] = sAirCutterDescription, + [MOVE_OVERHEAT - 1] = sOverheatDescription, + [MOVE_ODOR_SLEUTH - 1] = sOdorSleuthDescription, + [MOVE_ROCK_TOMB - 1] = sRockTombDescription, + [MOVE_SILVER_WIND - 1] = sSilverWindDescription, + [MOVE_METAL_SOUND - 1] = sMetalSoundDescription, + [MOVE_GRASS_WHISTLE - 1] = sGrassWhistleDescription, + [MOVE_TICKLE - 1] = sTickleDescription, + [MOVE_COSMIC_POWER - 1] = sCosmicPowerDescription, + [MOVE_WATER_SPOUT - 1] = sWaterSpoutDescription, + [MOVE_SIGNAL_BEAM - 1] = sSignalBeamDescription, + [MOVE_SHADOW_PUNCH - 1] = sShadowPunchDescription, + [MOVE_EXTRASENSORY - 1] = sExtrasensoryDescription, + [MOVE_SKY_UPPERCUT - 1] = sSkyUppercutDescription, + [MOVE_SAND_TOMB - 1] = sSandTombDescription, + [MOVE_SHEER_COLD - 1] = sSheerColdDescription, + [MOVE_MUDDY_WATER - 1] = sMuddyWaterDescription, + [MOVE_BULLET_SEED - 1] = sBulletSeedDescription, + [MOVE_AERIAL_ACE - 1] = sAerialAceDescription, + [MOVE_ICICLE_SPEAR - 1] = sIcicleSpearDescription, + [MOVE_IRON_DEFENSE - 1] = sIronDefenseDescription, + [MOVE_BLOCK - 1] = sBlockDescription, + [MOVE_HOWL - 1] = sHowlDescription, + [MOVE_DRAGON_CLAW - 1] = sDragonClawDescription, + [MOVE_FRENZY_PLANT - 1] = sFrenzyPlantDescription, + [MOVE_BULK_UP - 1] = sBulkUpDescription, + [MOVE_BOUNCE - 1] = sBounceDescription, + [MOVE_MUD_SHOT - 1] = sMudShotDescription, + [MOVE_POISON_TAIL - 1] = sPoisonTailDescription, + [MOVE_COVET - 1] = sCovetDescription, + [MOVE_VOLT_TACKLE - 1] = sVoltTackleDescription, + [MOVE_MAGICAL_LEAF - 1] = sMagicalLeafDescription, + [MOVE_WATER_SPORT - 1] = sWaterSportDescription, + [MOVE_CALM_MIND - 1] = sCalmMindDescription, + [MOVE_LEAF_BLADE - 1] = sLeafBladeDescription, + [MOVE_DRAGON_DANCE - 1] = sDragonDanceDescription, + [MOVE_ROCK_BLAST - 1] = sRockBlastDescription, + [MOVE_SHOCK_WAVE - 1] = sShockWaveDescription, + [MOVE_WATER_PULSE - 1] = sWaterPulseDescription, + [MOVE_DOOM_DESIRE - 1] = sDoomDesireDescription, + [MOVE_PSYCHO_BOOST - 1] = sPsychoBoostDescription, + [MOVE_ROOST - 1] = sNotDoneYetDescription, + [MOVE_GRAVITY - 1] = sGRAVITYDescription, + [MOVE_MIRACLE_EYE - 1] = sNotDoneYetDescription, + [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] = sNotDoneYetDescription, + [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] = sNotDoneYetDescription, + [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] = sNotDoneYetDescription, + [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] = sNotDoneYetDescription, + [MOVE_NASTY_PLOT - 1] = sNASTY_PLOTDescription, + [MOVE_BULLET_PUNCH - 1] = sNotDoneYetDescription, + [MOVE_AVALANCHE - 1] = sNotDoneYetDescription, + [MOVE_ICE_SHARD - 1] = sICE_SHARDDescription, + [MOVE_SHADOW_CLAW - 1] = sNotDoneYetDescription, + [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] = sNotDoneYetDescription, + [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] = sNotDoneYetDescription, + [MOVE_DISCHARGE - 1] = sNotDoneYetDescription, + [MOVE_LAVA_PLUME - 1] = sLAVA_PLUMEDescription, + [MOVE_LEAF_STORM - 1] = sNotDoneYetDescription, + [MOVE_POWER_WHIP - 1] = sPOWER_WHIPDescription, + [MOVE_ROCK_WRECKER - 1] = sNotDoneYetDescription, + [MOVE_CROSS_POISON - 1] = sNotDoneYetDescription, + [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] = sNotDoneYetDescription, + [MOVE_AQUA_JET - 1] = sNotDoneYetDescription, + [MOVE_ATTACK_ORDER - 1] = sATTACK_ORDERDescription, + [MOVE_DEFEND_ORDER - 1] = sDEFEND_ORDERDescription, + [MOVE_HEAL_ORDER - 1] = sNotDoneYetDescription, + [MOVE_HEAD_SMASH - 1] = sHEAD_SMASHDescription, + [MOVE_DOUBLE_HIT - 1] = sDOUBLE_HITDescription, + [MOVE_ROAR_OF_TIME - 1] = sNotDoneYetDescription, + [MOVE_SPACIAL_REND - 1] = sSPACIAL_RENDDescription, + [MOVE_LUNAR_DANCE - 1] = sHEALING_WISHDescription, + [MOVE_CRUSH_GRIP - 1] = sWRING_OUTDescription, + [MOVE_MAGMA_STORM - 1] = sNotDoneYetDescription, + [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] = sNotDoneYetDescription, + [MOVE_DRILL_RUN - 1] = sDRILL_RUNDescription, + [MOVE_DUAL_CHOP - 1] = sDUAL_CHOPDescription, + [MOVE_HEART_STAMP - 1] = sHEART_STAMPDescription, + [MOVE_HORN_LEECH - 1] = sNotDoneYetDescription, + [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] = sNotDoneYetDescription, + [MOVE_HURRICANE - 1] = sHURRICANEDescription, + [MOVE_HEAD_CHARGE - 1] = sHEAD_CHARGEDescription, + [MOVE_GEAR_GRIND - 1] = sGEAR_GRINDDescription, + [MOVE_SEARING_SHOT - 1] = sNotDoneYetDescription, + [MOVE_TECHNO_BLAST - 1] = sTECHNO_BLASTDescription, + [MOVE_RELIC_SONG - 1] = sRELIC_SONGDescription, + [MOVE_SECRET_SWORD - 1] = sSECRET_SWORDDescription, + [MOVE_GLACIATE - 1] = sNotDoneYetDescription, + [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] = sNotDoneYetDescription, + [MOVE_FOREST_S_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_KING_S_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] = sNotDoneYetDescription, + [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_LAND_S_WRATH - 1] = sNotDoneYetDescription, + [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, }; From 8d4d5b501c58db2493d1e0c0bcf89bf256b9e2d6 Mon Sep 17 00:00:00 2001 From: Tetrable Date: Sun, 16 Sep 2018 16:36:47 +0100 Subject: [PATCH 107/667] Add periods to the end of ability descriptions. --- include/constants/moves.h | 49 ++++++- src/data/text/abilities.h | 286 +++++++++++++++++++------------------- 2 files changed, 189 insertions(+), 146 deletions(-) diff --git a/include/constants/moves.h b/include/constants/moves.h index 9fdc00c429..657a963e13 100644 --- a/include/constants/moves.h +++ b/include/constants/moves.h @@ -359,7 +359,8 @@ #define MOVES_COUNT_GEN3 355 -// Gen4 moves. +// Gen 4 Moves + #define MOVE_ROOST 355 #define MOVE_GRAVITY 356 #define MOVE_MIRACLE_EYE 357 @@ -476,7 +477,8 @@ #define MOVES_COUNT_GEN4 468 -// Gen5 moves. +// Gen 5 Moves + #define MOVE_HONE_CLAWS 468 #define MOVE_WIDE_GUARD 469 #define MOVE_GUARD_SPLIT 470 @@ -572,7 +574,8 @@ #define MOVES_COUNT_GEN5 560 -// Gen6 moves. +// Gen 6 Moves + #define MOVE_FLYING_PRESS 560 #define MOVE_MAT_BLOCK 561 #define MOVE_BELCH 562 @@ -638,6 +641,46 @@ #define MOVES_COUNT_GEN6 622 +// Gen 7 Moves + +#define MOVE_BREAKNECK_BLITZ_PHYSICAL 622 +#define MOVE_BREAKNECK_BLITZ_SPECIAL 623 +#define MOVE_ALL_OUT_PUMMELING_PHYSICAL 624 +#define MOVE_ALL_OUT_PUMMELING_SPECIAL 625 +#define MOVE_SUPERSONIC_SKYSTRIKE_PHYSICAL 626 +#define MOVE_SUPERSONIC_SKYSTRIKE_SPECIAL 627 +#define MOVE_ACID_DOWNPOUR_PHYSICAL 628 +#define MOVE_ACID_DOWNPOUR_SPECIAL 629 +#define MOVE_TECTONIC_RAGE_PHYSICAL 630 +#define MOVE_TECTONIC_RAGE_SPECIAL 631 +#define MOVE_CONTINENTAL_CRUSH_PHYSICAL 632 +#define MOVE_CONTINENTAL_CRUSH_SPECIAL 633 +#define MOVE_SAVAGE_SPIN_OUT_PHYSICAL 634 +#define MOVE_SAVAGE_SPIN_OUT_SPECIAL 635 +#define MOVE_NEVER_ENDING_NIGHTMARE_PHYSICAL 636 +#define MOVE_NEVER_ENDING_NIGHTMARE_SPECIAL 637 +#define MOVE_CORKSCREW_CRASH_PHYSICAL 638 +#define MOVE_CORKSCREW_CRASH_SPECIAL 639 +#define MOVE_INFERNO_OVERDRIVE_PHYSICAL 640 +#define MOVE_INFERNO_OVERDRIVE_SPECIAL 641 +#define MOVE_HYDRO_VORTEX_PHYSICAL 642 +#define MOVE_HYDRO_VORTEX_SPECIAL 643 +#define MOVE_BLOOM_DOOM_PHYSICAL 644 +#define MOVE_BLOOM_DOOM_SPECIAL 645 +#define MOVE_GIGAVOLT_HAVOC_PHYSICAL 646 +#define MOVE_GIGAVOLT_HAVOC_SPECIAL 647 +#define MOVE_SHATTERED_PSYCHE_PHYSICAL 648 +#define MOVE_SHATTERED_PSYCHE_SPECIAL 649 +#define MOVE_SUBZERO_SLAMMER_PHYSICAL 650 +#define MOVE_SUBZERO_SLAMMER_SPECIAL 651 +#define MOVE_DEVASTATING_DRAKE_PHYSICAL 652 +#define MOVE_DEVASTATING_DRAKE_SPECIAL 653 +#define MOVE_BLACK_HOLE_ECLIPSE_PHYSICAL 654 +#define MOVE_BLACK_HOLE_ECLIPSE_SPECIAL 655 +#define MOVE_TWINKLE_TACKLE_PHYSICAL 656 +#define MOVE_TWINKLE_TACKLE_SPECIAL 657 +#define MOVE_CATASTROPIKA 658 + #define MOVES_COUNT MOVES_COUNT_GEN6 #endif // GUARD_CONSTANTS_MOVES_H diff --git a/src/data/text/abilities.h b/src/data/text/abilities.h index 8a96d26c6d..8f62d68280 100644 --- a/src/data/text/abilities.h +++ b/src/data/text/abilities.h @@ -76,150 +76,150 @@ 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 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[] = _("Turns grass into 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 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."); const u8 gAbilityNames[ABILITIES_COUNT_GEN7][ABILITY_NAME_LENGTH + 1] = { From 9397618d9d703bfa65a4225494589820c2f11f90 Mon Sep 17 00:00:00 2001 From: Tetrable Date: Sun, 16 Sep 2018 16:40:02 +0100 Subject: [PATCH 108/667] Missed a description --- include/constants/moves.h | 328 +------------------------------------- src/data/text/abilities.h | 2 +- 2 files changed, 3 insertions(+), 327 deletions(-) diff --git a/include/constants/moves.h b/include/constants/moves.h index 657a963e13..a635193301 100644 --- a/include/constants/moves.h +++ b/include/constants/moves.h @@ -357,330 +357,6 @@ #define MOVE_DOOM_DESIRE 353 #define MOVE_PSYCHO_BOOST 354 -#define MOVES_COUNT_GEN3 355 +#define MOVES_COUNT 355 -// Gen 4 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 - -// Gen 5 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 - -// Gen 6 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_FOREST_S_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_KING_S_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_LAND_S_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 - -// Gen 7 Moves - -#define MOVE_BREAKNECK_BLITZ_PHYSICAL 622 -#define MOVE_BREAKNECK_BLITZ_SPECIAL 623 -#define MOVE_ALL_OUT_PUMMELING_PHYSICAL 624 -#define MOVE_ALL_OUT_PUMMELING_SPECIAL 625 -#define MOVE_SUPERSONIC_SKYSTRIKE_PHYSICAL 626 -#define MOVE_SUPERSONIC_SKYSTRIKE_SPECIAL 627 -#define MOVE_ACID_DOWNPOUR_PHYSICAL 628 -#define MOVE_ACID_DOWNPOUR_SPECIAL 629 -#define MOVE_TECTONIC_RAGE_PHYSICAL 630 -#define MOVE_TECTONIC_RAGE_SPECIAL 631 -#define MOVE_CONTINENTAL_CRUSH_PHYSICAL 632 -#define MOVE_CONTINENTAL_CRUSH_SPECIAL 633 -#define MOVE_SAVAGE_SPIN_OUT_PHYSICAL 634 -#define MOVE_SAVAGE_SPIN_OUT_SPECIAL 635 -#define MOVE_NEVER_ENDING_NIGHTMARE_PHYSICAL 636 -#define MOVE_NEVER_ENDING_NIGHTMARE_SPECIAL 637 -#define MOVE_CORKSCREW_CRASH_PHYSICAL 638 -#define MOVE_CORKSCREW_CRASH_SPECIAL 639 -#define MOVE_INFERNO_OVERDRIVE_PHYSICAL 640 -#define MOVE_INFERNO_OVERDRIVE_SPECIAL 641 -#define MOVE_HYDRO_VORTEX_PHYSICAL 642 -#define MOVE_HYDRO_VORTEX_SPECIAL 643 -#define MOVE_BLOOM_DOOM_PHYSICAL 644 -#define MOVE_BLOOM_DOOM_SPECIAL 645 -#define MOVE_GIGAVOLT_HAVOC_PHYSICAL 646 -#define MOVE_GIGAVOLT_HAVOC_SPECIAL 647 -#define MOVE_SHATTERED_PSYCHE_PHYSICAL 648 -#define MOVE_SHATTERED_PSYCHE_SPECIAL 649 -#define MOVE_SUBZERO_SLAMMER_PHYSICAL 650 -#define MOVE_SUBZERO_SLAMMER_SPECIAL 651 -#define MOVE_DEVASTATING_DRAKE_PHYSICAL 652 -#define MOVE_DEVASTATING_DRAKE_SPECIAL 653 -#define MOVE_BLACK_HOLE_ECLIPSE_PHYSICAL 654 -#define MOVE_BLACK_HOLE_ECLIPSE_SPECIAL 655 -#define MOVE_TWINKLE_TACKLE_PHYSICAL 656 -#define MOVE_TWINKLE_TACKLE_SPECIAL 657 -#define MOVE_CATASTROPIKA 658 - -#define MOVES_COUNT MOVES_COUNT_GEN6 - -#endif // GUARD_CONSTANTS_MOVES_H +#endif // GUARD_CONSTANTS_MOVES_H \ No newline at end of file diff --git a/src/data/text/abilities.h b/src/data/text/abilities.h index 8f62d68280..3fdff062d3 100644 --- a/src/data/text/abilities.h +++ b/src/data/text/abilities.h @@ -129,7 +129,7 @@ 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 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."); From 967eb2a27657364733544efc69fcc227aef66ba0 Mon Sep 17 00:00:00 2001 From: Tetrable Date: Sun, 16 Sep 2018 16:41:52 +0100 Subject: [PATCH 109/667] Accidentally got rid of move defines, added them back --- include/constants/moves.h | 283 +++++++++++++++++++++++++++++++++++++- 1 file changed, 282 insertions(+), 1 deletion(-) diff --git a/include/constants/moves.h b/include/constants/moves.h index a635193301..e9e43627ad 100644 --- a/include/constants/moves.h +++ b/include/constants/moves.h @@ -357,6 +357,287 @@ #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_FOREST_S_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_KING_S_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_LAND_S_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 + +#define MOVES_COUNT MOVES_COUNT_GEN6 #endif // GUARD_CONSTANTS_MOVES_H \ No newline at end of file From 55f21c17763dcfa9a6b4385fd9a97c5738111fd5 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 16 Sep 2018 18:55:32 +0200 Subject: [PATCH 110/667] Mega Evolution support is mostly done. --- asm/macros/battle_script.inc | 4 ++ data/battle_anim_scripts.s | 4 ++ data/battle_scripts_1.s | 10 ++++ include/battle.h | 5 ++ include/battle_controllers.h | 1 + include/battle_scripts.h | 1 + include/battle_util.h | 1 + include/constants/battle_anim.h | 1 + include/constants/battle_script_commands.h | 1 + include/constants/battle_string_ids.h | 2 + include/constants/hold_effects.h | 1 + include/constants/items.h | 2 +- include/pokemon.h | 2 + src/battle_controller_opponent.c | 10 ++-- src/battle_main.c | 37 ++++++++++++-- src/battle_message.c | 9 ++-- src/battle_script_commands.c | 23 +++++++++ src/battle_util.c | 57 ++++++++++++++++++++++ src/data/items.h | 6 +-- src/data/pokemon/evolution.h | 3 +- 20 files changed, 162 insertions(+), 18 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 3994de2174..cdec01dbd8 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1473,6 +1473,10 @@ .4byte \ptr .endm + .macro handlemegaevo battler + various \battler, VARIOUS_HANDLE_MEGA_EVO + .endm + @ helpful macros .macro setstatchanger stat, stages, down setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7 diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 99c071aac2..46719eb3e7 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -672,6 +672,7 @@ gBattleAnims_VariousTable:: @ 82C9320 .4byte Anim_Table_x14 .4byte Status_Ingrain .4byte Anim_WishHeal + .4byte General_MegaEvolution .align 2 gBattleAnims_Special:: @ 82C937C @@ -12054,6 +12055,9 @@ Anim_WishHeal: waitforvisualfinish createsprite gUnknown_08597274, 0x2, 1, 3, 10, 0, 0 end + +General_MegaEvolution: + end AnimScript_82D85A3: createvisualtask sub_8172E9C, 0x2 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index c2ea15b0e7..0402dc5262 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4610,6 +4610,16 @@ BattleScript_FocusPunchSetUp:: printstring STRINGID_PKMNTIGHTENINGFOCUS waitmessage 0x40 end2 + +BattleScript_MegaEvolution:: + printstring STRINGID_MEGAEVOREACTING + waitmessage 0x40 + playanimation BS_ATTACKER, B_ANIM_MEGA_EVOLUTION, NULL + waitanimation + handlemegaevo BS_ATTACKER + printstring STRINGID_MEGAEVOEVOLVED + waitmessage 0x40 + end2 BattleScript_MoveUsedIsAsleep:: printstring STRINGID_PKMNFASTASLEEP diff --git a/include/battle.h b/include/battle.h index c57c7760ce..cedba63c0f 100644 --- a/include/battle.h +++ b/include/battle.h @@ -598,6 +598,11 @@ struct BattleStruct bool8 ateBoost[MAX_BATTLERS_COUNT]; u32 debugAIFlags; bool8 notfirstTimeAIFlags; + u8 toMegaEvolve; // As flags using gBitTable. + u8 megaEvolvedPartyIds[2]; // As flags using gBitTable; + bool8 alreadyMegaEvolved[4]; // Array id is used for mon position. + u16 speciesToMegaEvolve[MAX_BATTLERS_COUNT]; + u8 megaEvoBattlerId; }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/include/battle_controllers.h b/include/battle_controllers.h index f0ec036a9a..50e37c917c 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -84,6 +84,7 @@ enum // Special return values in gBattleBufferB from Battle Controller functions. #define RET_VALUE_LEVELED_UP 11 +#define RET_MEGA_EVOLUTION 0x80 struct UnusedControllerStruct { diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 43a368a60e..f897158e85 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -271,5 +271,6 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/battle_util.h b/include/battle_util.h index 69df37e663..cf445cfa5e 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -88,5 +88,6 @@ u16 CalcTypeEffectivenessMultiplier(u16 move, u8 moveType, u8 battlerAtk, u8 bat u16 CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u8 abilityDef); u16 GetTypeModifier(u8 atkType, u8 defType); s32 GetStealthHazardDamage(u8 hazardType, u8 battlerId); +bool32 CanMegaEvolve(u8 battlerId); #endif // GUARD_BATTLE_UTIL_H diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index 270ac55e01..2b98412a35 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -60,6 +60,7 @@ #define B_ANIM_x14 0x14 #define B_ANIM_INGRAIN_HEAL 0x15 #define B_ANIM_WISH_HEAL 0x16 +#define B_ANIM_MEGA_EVOLUTION 0x17 // special animations table #define B_ANIM_LVL_UP 0x0 diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 09f70e1316..cdb3bae3f8 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -99,6 +99,7 @@ #define VARIOUS_TRY_ELECTRIFY 48 #define VARIOUS_TRY_REFLECT_TYPE 49 #define VARIOUS_TRY_SOAK 50 +#define VARIOUS_HANDLE_MEGA_EVO 51 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index cdb0f34b0a..aab8dd837a 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -502,6 +502,8 @@ #define STRINGID_TERRAINBECOMESELECTRIC 499 #define STRINGID_TERRAINBECOMESPSYCHIC 500 #define STRINGID_TARGETELECTRIFIED 501 +#define STRINGID_MEGAEVOREACTING 502 +#define STRINGID_MEGAEVOEVOLVED 503 #define BATTLESTRINGS_COUNT 516 diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index b2c9fc9e8c..df9b9c27dc 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -109,6 +109,7 @@ // Gen6 hold effects #define HOLD_EFFECT_FAIRY_POWER 130 +#define HOLD_EFFECT_MEGA_STONE 131 // Gen7 hold effects #define HOLD_EFFECT_PROTECTIVE_PADS 150 diff --git a/include/constants/items.h b/include/constants/items.h index 294499c8bc..2121220a2b 100644 --- a/include/constants/items.h +++ b/include/constants/items.h @@ -239,7 +239,7 @@ #define ITEM_METAL_POWDER 223 #define ITEM_THICK_CLUB 224 #define ITEM_STICK 225 -#define ITEM_0E2 226 +#define ITEM_MEGA_STONE_TESTING 226 #define ITEM_0E3 227 #define ITEM_0E4 228 #define ITEM_0E5 229 diff --git a/include/pokemon.h b/include/pokemon.h index fa2842d880..0d836cc428 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -422,6 +422,8 @@ enum #define EVO_LEVEL_SHEDINJA 0x000e // Pokémon reaches the specified level (special value for Shedinja) #define EVO_BEAUTY 0x000f // Pokémon levels up with beauty ≥ specified value +#define EVO_MEGA_EVOLUTION 0xffff // Not an actual evolution, used to temporarily mega evolve in battle. + struct Evolution { u16 method; diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index bfc7099469..4c43c74c5e 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -1548,16 +1548,15 @@ static void OpponentHandleChooseMove(void) if (gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_SAFARI | BATTLE_TYPE_ROAMER)) { - BattleAI_SetupAIData(0xF); chosenMoveId = BattleAI_ChooseMoveOrAction(); switch (chosenMoveId) { - case 5: + case AI_CHOICE_WATCH: BtlController_EmitTwoReturnValues(1, B_ACTION_SAFARI_WATCH_CAREFULLY, 0); break; - case 4: + case AI_CHOICE_FLEE: BtlController_EmitTwoReturnValues(1, B_ACTION_RUN, 0); break; case 6: @@ -1572,7 +1571,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 | RET_MEGA_EVOLUTION, (chosenMoveId) | (gBattlerTarget << 8)); + else + BtlController_EmitTwoReturnValues(1, 10, (chosenMoveId) | (gBattlerTarget << 8)); break; } OpponentBufferExecCompleted(); diff --git a/src/battle_main.c b/src/battle_main.c index b23930dd9f..1f0dc57fea 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -166,6 +166,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); @@ -4375,9 +4376,12 @@ static void HandleTurnActionSelectionState(void) case STATE_WAIT_ACTION_CASE_CHOSEN: if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC)))) { + bool32 shouldMegaEvolve; switch (gChosenActionByBattler[gActiveBattler]) { case B_ACTION_USE_MOVE: + shouldMegaEvolve = gBattleBufferB[gActiveBattler][1] & RET_MEGA_EVOLUTION; + gBattleBufferB[gActiveBattler][1] &= ~(RET_MEGA_EVOLUTION); switch (gBattleBufferB[gActiveBattler][1]) { case 3: @@ -4419,6 +4423,8 @@ static void HandleTurnActionSelectionState(void) *(gBattleStruct->chosenMovePositions + gActiveBattler) = gBattleBufferB[gActiveBattler][2]; gChosenMoveByBattler[gActiveBattler] = gBattleMons[gActiveBattler].moves[*(gBattleStruct->chosenMovePositions + gActiveBattler)]; *(gBattleStruct->moveTarget + gActiveBattler) = gBattleBufferB[gActiveBattler][3]; + if (shouldMegaEvolve) + gBattleStruct->toMegaEvolve |= gBitTable[gActiveBattler]; gBattleCommunication[gActiveBattler]++; } break; @@ -4844,8 +4850,8 @@ static void SetActionsAndBattlersTurnOrder(void) turnOrderId++; } } - gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts; - gBattleStruct->focusPunchBattlerId = 0; + gBattleMainFunc = CheckMegaEvolutionBeforeTurn; + gBattleStruct->megaEvoBattlerId = 0; return; } else @@ -4886,8 +4892,8 @@ static void SetActionsAndBattlersTurnOrder(void) } } } - gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts; - gBattleStruct->focusPunchBattlerId = 0; + gBattleMainFunc = CheckMegaEvolutionBeforeTurn; + gBattleStruct->megaEvoBattlerId = 0; } static void TurnValuesCleanUp(bool8 var0) @@ -4939,6 +4945,29 @@ static void SpecialStatusesClear(void) } } +static void CheckMegaEvolutionBeforeTurn(void) +{ + if (!(gHitMarker & HITMARKER_RUN)) + { + while (gBattleStruct->megaEvoBattlerId < gBattlersCount) + { + gActiveBattler = gBattlerAttacker = gBattleStruct->megaEvoBattlerId; + gBattleStruct->megaEvoBattlerId++; + if (gBattleStruct->toMegaEvolve & gBitTable[gActiveBattler] + && !(gProtectStructs[gActiveBattler].noValidMoves)) + { + gBattleStruct->toMegaEvolve &= ~(gBitTable[gActiveBattler]); + gLastUsedItem = gBattleMons[gActiveBattler].item; + BattleScriptExecute(BattleScript_MegaEvolution); + return; + } + } + } + + gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts; + gBattleStruct->focusPunchBattlerId = 0; +} + static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void) { u32 i; diff --git a/src/battle_message.c b/src/battle_message.c index 238b79b180..cc592b7d6f 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -631,8 +631,6 @@ 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!"); - -// To do. static const u8 sText_StickyWebUsed[] = _("A sticky web spreads out on the\nground around your 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!"); @@ -642,12 +640,11 @@ static const u8 sText_TerrainBecomesGrassy[] = _("Grass grew to cover\nthe battl 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 opposing {B_ATK_NAME_WITH_PREFIX}’s moves\nhave been electrified!"); - -// New selection strings, they must end with "\p". -// Use {B_LAST_ITEM} and {B_CURRENT_MOVE}. 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_SCR_ACTIVE_NAME_WITH_PREFIX} can’t use {B_CURRENT_MOVE}\nbecause of gravity!\p"); static const u8 sText_HealBlockPreventsUsage[] = _("The opposing {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 reacting\nto {B_ATK_TRAINER_NAME}’s Mega Ring!"); +static const u8 sText_MegaEvoEvolved[] = _("{B_ATK_NAME_WITH_PREFIX} has Mega\nEvolved into Mega {B_BUFF1}!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { @@ -1142,6 +1139,8 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_TerrainBecomesElectric, sText_TerrainBecomesPsychic, sText_TargetElectrified, + sText_MegaEvoReacting, + sText_MegaEvoEvolved, }; const u16 gTerrainStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index bbd9715cb8..e23342bb61 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6119,6 +6119,7 @@ static void HandleTerrainMove(u32 moveEffect) static void atk76_various(void) { + struct Pokemon *mon; u8 side; s32 i, j; u8 data[10]; @@ -6588,6 +6589,28 @@ static void atk76_various(void) gBattlescriptCurrInstr += 7; } return; + case VARIOUS_HANDLE_MEGA_EVO: + if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT) + mon = &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]; + else + mon = &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]; + gBattleMons[gActiveBattler].species = gBattleStruct->speciesToMegaEvolve[gActiveBattler]; + SetMonData(mon, MON_DATA_SPECIES, &gBattleMons[gActiveBattler].species); + PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gActiveBattler].species); + + CalculateMonStats(mon); + gBattleMons[gActiveBattler].hp = GetMonData(mon, MON_DATA_HP); + gBattleMons[gActiveBattler].maxHP = GetMonData(mon, MON_DATA_MAX_HP); + gBattleMons[gActiveBattler].attack = GetMonData(mon, MON_DATA_ATK); + gBattleMons[gActiveBattler].defense = GetMonData(mon, MON_DATA_DEF); + gBattleMons[gActiveBattler].speed = GetMonData(mon, MON_DATA_SPEED); + gBattleMons[gActiveBattler].spAttack = GetMonData(mon, MON_DATA_SPATK); + gBattleMons[gActiveBattler].spDefense = GetMonData(mon, MON_DATA_SPDEF); + UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], mon, HEALTHBOX_ALL); + + gBattleStruct->alreadyMegaEvolved[GetBattlerPosition(gActiveBattler)] = TRUE; + gBattleStruct->megaEvolvedPartyIds[GetBattlerSide(gActiveBattler)] |= gBitTable[gBattlerPartyIndexes[gActiveBattler]]; + break; } gBattlescriptCurrInstr += 3; diff --git a/src/battle_util.c b/src/battle_util.c index 75f4a293b3..c6e40ddb85 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5572,3 +5572,60 @@ s32 GetStealthHazardDamage(u8 hazardType, u8 battlerId) 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; +} + +bool32 CanMegaEvolve(u8 battlerId) +{ + u32 i; + u16 species, itemId; + u8 battlerPosition = GetBattlerPosition(battlerId); + u8 partnerPosition = GetBattlerPosition(BATTLE_PARTNER(battlerId)); + + // Check if trainer already mega evolved a pokemon. + if (gBattleStruct->alreadyMegaEvolved[battlerPosition]) + return FALSE; + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + if (IsPartnerMonFromSameTrainer(battlerId) && gBattleStruct->alreadyMegaEvolved[partnerPosition]) + return FALSE; + } + else + { + if (gBattleStruct->alreadyMegaEvolved[partnerPosition]) + return FALSE; + } + + // Check if the pokemon holds an appropriate item, + if (GetBattlerHoldEffect(battlerId, FALSE) != HOLD_EFFECT_MEGA_STONE) + return FALSE; + + // Check if there is an entry in the evolution table. + species = gBattleMons[battlerId].species; + itemId = gBattleMons[battlerId].item; + for (i = 0; i < EVOS_PER_MON; i++) + { + if (gEvolutionTable[species][i].method == EVO_MEGA_EVOLUTION + && gEvolutionTable[species][i].param == itemId) + { + gBattleStruct->speciesToMegaEvolve[battlerId] = gEvolutionTable[species][i].targetSpecies; + break; + } + } + + if (i == EVOS_PER_MON) + return FALSE; + + // All checks passed, the mon CAN mega evolve. + return TRUE; +} diff --git a/src/data/items.h b/src/data/items.h index 49f981faf4..13702cda49 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -3649,10 +3649,10 @@ const struct Item gItems[] = .secondaryId = 0, }, { - .name = _("????????"), - .itemId = ITEM_NONE, + .name = _("Mega Stone"), + .itemId = ITEM_MEGA_STONE_TESTING, .price = 0, - .holdEffect = HOLD_EFFECT_NONE, + .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, .description = gDummyItemDescription, .importance = 0, diff --git a/src/data/pokemon/evolution.h b/src/data/pokemon/evolution.h index 8629ac9b16..4bd3df292f 100644 --- a/src/data/pokemon/evolution.h +++ b/src/data/pokemon/evolution.h @@ -173,7 +173,8 @@ const struct Evolution gEvolutionTable[NUM_SPECIES][EVOS_PER_MON] = [SPECIES_VIGOROTH] = {{EVO_LEVEL, 36, SPECIES_SLAKING}}, [SPECIES_GULPIN] = {{EVO_LEVEL, 26, SPECIES_SWALOT}}, [SPECIES_WHISMUR] = {{EVO_LEVEL, 20, SPECIES_LOUDRED}}, - [SPECIES_LOUDRED] = {{EVO_LEVEL, 40, SPECIES_EXPLOUD}}, + [SPECIES_LOUDRED] = {{EVO_LEVEL, 40, SPECIES_EXPLOUD}, + {EVO_MEGA_EVOLUTION, ITEM_MEGA_STONE_TESTING, SPECIES_HO_OH}}, [SPECIES_CLAMPERL] = {{EVO_TRADE_ITEM, ITEM_DEEP_SEA_TOOTH, SPECIES_HUNTAIL}, {EVO_TRADE_ITEM, ITEM_DEEP_SEA_SCALE, SPECIES_GOREBYSS}}, [SPECIES_SHUPPET] = {{EVO_LEVEL, 37, SPECIES_BANETTE}}, From 2042788fdc7a0d0e0c072d93c86cc2326ea1b6e9 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 16 Sep 2018 21:08:49 +0200 Subject: [PATCH 111/667] Mega Evolution done except sprites. --- data/battle_anim_scripts.s | 2 ++ data/battle_scripts_1.s | 2 +- include/battle.h | 4 ++++ include/battle_util.h | 1 + src/battle_controller_player.c | 25 +++++++++++++++++++++++-- src/battle_main.c | 10 ++++++++++ src/battle_script_commands.c | 4 ++++ src/battle_util.c | 18 +++++++++++++----- 8 files changed, 58 insertions(+), 8 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 46719eb3e7..863153b9d7 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -12057,6 +12057,8 @@ Anim_WishHeal: end General_MegaEvolution: + createvisualtask sub_815B7D0, 0x2, 0 + waitforvisualfinish end AnimScript_82D85A3: diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 0402dc5262..dbd0761404 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4614,9 +4614,9 @@ BattleScript_FocusPunchSetUp:: BattleScript_MegaEvolution:: printstring STRINGID_MEGAEVOREACTING waitmessage 0x40 + handlemegaevo BS_ATTACKER playanimation BS_ATTACKER, B_ANIM_MEGA_EVOLUTION, NULL waitanimation - handlemegaevo BS_ATTACKER printstring STRINGID_MEGAEVOEVOLVED waitmessage 0x40 end2 diff --git a/include/battle.h b/include/battle.h index cedba63c0f..ee2323215d 100644 --- a/include/battle.h +++ b/include/battle.h @@ -602,7 +602,11 @@ struct BattleStruct u8 megaEvolvedPartyIds[2]; // As flags using gBitTable; bool8 alreadyMegaEvolved[4]; // Array id is used for mon position. u16 speciesToMegaEvolve[MAX_BATTLERS_COUNT]; + u16 playerSpeciesThatMegaEvolved; u8 megaEvoBattlerId; + bool8 playerMegaEvoSelect; + u8 megaEvoTriggerSpriteId; + u8 megaEvoIndicatorSpriteId[MAX_BATTLERS_COUNT]; }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/include/battle_util.h b/include/battle_util.h index cf445cfa5e..aa69a020bd 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -89,5 +89,6 @@ u16 CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u8 ability u16 GetTypeModifier(u8 atkType, u8 defType); s32 GetStealthHazardDamage(u8 hazardType, u8 battlerId); bool32 CanMegaEvolve(u8 battlerId); +void UndoMegaEvolution(u8 monId); #endif // GUARD_BATTLE_UTIL_H diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 7334b5e79c..1e417194dc 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -386,7 +386,10 @@ static void HandleInputChooseTarget(void) { PlaySE(SE_SELECT); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = sub_8039B2C; - BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); + if (gBattleStruct->playerMegaEvoSelect) + BtlController_EmitTwoReturnValues(1, 10 | RET_MEGA_EVOLUTION, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); + else + BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); EndBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX); PlayerBufferExecCompleted(); } @@ -540,7 +543,10 @@ static void HandleInputChooseMove(void) if (!canSelectTarget) { - BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); + if (gBattleStruct->playerMegaEvoSelect) + BtlController_EmitTwoReturnValues(1, 10 | RET_MEGA_EVOLUTION, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); + else + BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); PlayerBufferExecCompleted(); } else @@ -560,6 +566,7 @@ static void HandleInputChooseMove(void) else if (gMain.newKeys & B_BUTTON || gPlayerDpadHoldFrames > 59) { PlaySE(SE_SELECT); + gBattleStruct->playerMegaEvoSelect = FALSE; BtlController_EmitTwoReturnValues(1, 10, 0xFFFF); PlayerBufferExecCompleted(); } @@ -629,6 +636,15 @@ static void HandleInputChooseMove(void) gBattlerControllerFuncs[gActiveBattler] = HandleMoveSwitchting; } } + else if (gMain.newKeys & START_BUTTON) + { + if (gBattleStruct->megaEvoTriggerSpriteId != 0xFF) + { + gBattleStruct->playerMegaEvoSelect ^= 1; + // StartSpriteAnim(&gSprites[gBattleStruct->megaEvoTriggerSpriteId], gBattleStruct->playerMegaEvoSelect); + PlaySE(SE_SELECT); + } + } } u32 sub_8057FBC(void) // unused @@ -2628,6 +2644,11 @@ static void PlayerHandleChooseMove(void) { InitMoveSelectionsVarsAndStrings(); gBattlerControllerFuncs[gActiveBattler] = HandleChooseMoveAfterDma3; + gBattleStruct->playerMegaEvoSelect = FALSE; + if (CanMegaEvolve(gActiveBattler) && gBattleStruct->megaEvoTriggerSpriteId == 0xFF) + gBattleStruct->megaEvoTriggerSpriteId = CreateSprite(&gDummySpriteTemplate, 100, 100, 0); + else + gBattleStruct->megaEvoTriggerSpriteId = 0xFF; } } diff --git a/src/battle_main.c b/src/battle_main.c index 1f0dc57fea..50a69ec872 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3098,6 +3098,10 @@ static void BattleStartClearSetData(void) gBattleStruct->field_2A0 = 0; gBattleStruct->field_2A1 = 0; + + gBattleStruct->megaEvoTriggerSpriteId = 0xFF; + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + gBattleStruct->megaEvoIndicatorSpriteId[i] = 0xFF; } void SwitchInClearSetData(void) @@ -3306,6 +3310,8 @@ void FaintClearSetData(void) ClearBattlerMoveHistory(gActiveBattler); ClearBattlerAbilityHistory(gActiveBattler); + if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) + UndoMegaEvolution(gBattlerPartyIndexes[gActiveBattler]); } static void BattleIntroGetMonsData(void) @@ -5165,6 +5171,8 @@ static void HandleEndTurn_MonFled(void) static void HandleEndTurn_FinishBattle(void) { + u32 i; + if (gCurrentActionFuncId == 0xB || gCurrentActionFuncId == 0xC) { if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK @@ -5210,6 +5218,8 @@ static void HandleEndTurn_FinishBattle(void) sub_8186444(); BeginFastPaletteFade(3); FadeOutMapMusic(5); + for (i = 0; i < PARTY_SIZE; i++) + UndoMegaEvolution(i); gBattleMainFunc = FreeResetData_ReturnToOvOrDoEvolutions; gCB2_AfterEvolution = BattleMainCB2; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e23342bb61..e19a082389 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6599,6 +6599,7 @@ static void atk76_various(void) PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gActiveBattler].species); CalculateMonStats(mon); + gBattleMons[gActiveBattler].level = GetMonData(mon, MON_DATA_LEVEL); gBattleMons[gActiveBattler].hp = GetMonData(mon, MON_DATA_HP); gBattleMons[gActiveBattler].maxHP = GetMonData(mon, MON_DATA_MAX_HP); gBattleMons[gActiveBattler].attack = GetMonData(mon, MON_DATA_ATK); @@ -6606,6 +6607,9 @@ static void atk76_various(void) gBattleMons[gActiveBattler].speed = GetMonData(mon, MON_DATA_SPEED); gBattleMons[gActiveBattler].spAttack = GetMonData(mon, MON_DATA_SPATK); gBattleMons[gActiveBattler].spDefense = GetMonData(mon, MON_DATA_SPDEF); + gBattleMons[gActiveBattler].ability = GetMonAbility(mon); + gBattleMons[gActiveBattler].type1 = gBaseStats[gBattleMons[gActiveBattler].species].type1; + gBattleMons[gActiveBattler].type2 = gBaseStats[gBattleMons[gActiveBattler].species].type2; UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], mon, HEALTHBOX_ALL); gBattleStruct->alreadyMegaEvolved[GetBattlerPosition(gActiveBattler)] = TRUE; diff --git a/src/battle_util.c b/src/battle_util.c index c6e40ddb85..2cf0d88ac1 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5600,11 +5600,6 @@ bool32 CanMegaEvolve(u8 battlerId) if (IsPartnerMonFromSameTrainer(battlerId) && gBattleStruct->alreadyMegaEvolved[partnerPosition]) return FALSE; } - else - { - if (gBattleStruct->alreadyMegaEvolved[partnerPosition]) - return FALSE; - } // Check if the pokemon holds an appropriate item, if (GetBattlerHoldEffect(battlerId, FALSE) != HOLD_EFFECT_MEGA_STONE) @@ -5619,6 +5614,9 @@ bool32 CanMegaEvolve(u8 battlerId) && gEvolutionTable[species][i].param == itemId) { gBattleStruct->speciesToMegaEvolve[battlerId] = gEvolutionTable[species][i].targetSpecies; + if (battlerPosition == B_POSITION_PLAYER_LEFT + || (battlerPosition == B_POSITION_PLAYER_RIGHT && !(gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER)))) + gBattleStruct->playerSpeciesThatMegaEvolved = species; break; } } @@ -5629,3 +5627,13 @@ bool32 CanMegaEvolve(u8 battlerId) // All checks passed, the mon CAN mega evolve. return TRUE; } + +void UndoMegaEvolution(u8 monId) +{ + if (gBattleStruct->megaEvolvedPartyIds[B_SIDE_PLAYER] & gBitTable[monId]) + { + gBattleStruct->megaEvolvedPartyIds[B_SIDE_PLAYER] &= ~(gBitTable[monId]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleStruct->playerSpeciesThatMegaEvolved); + CalculateMonStats(&gPlayerParty[monId]); + } +} From abebf479a6cfebc68260a6aacd3726bb3de23dd9 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 17 Sep 2018 20:37:33 +0200 Subject: [PATCH 112/667] Tweak mega evo to hopefully be compatibile with recorded battles. --- include/constants/moves.h | 2 +- src/battle_controller_opponent.c | 2 +- src/battle_controller_player.c | 4 ++-- src/battle_main.c | 7 ++----- src/battle_util.c | 5 +++-- 5 files changed, 9 insertions(+), 11 deletions(-) diff --git a/include/constants/moves.h b/include/constants/moves.h index e9e43627ad..9fdc00c429 100644 --- a/include/constants/moves.h +++ b/include/constants/moves.h @@ -640,4 +640,4 @@ #define MOVES_COUNT MOVES_COUNT_GEN6 -#endif // GUARD_CONSTANTS_MOVES_H \ No newline at end of file +#endif // GUARD_CONSTANTS_MOVES_H diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 4c43c74c5e..5db5f4e135 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -1572,7 +1572,7 @@ static void OpponentHandleChooseMove(void) gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); } if (CanMegaEvolve(gActiveBattler)) // If opponent can mega evolve, do it. - BtlController_EmitTwoReturnValues(1, 10 | RET_MEGA_EVOLUTION, (chosenMoveId) | (gBattlerTarget << 8)); + BtlController_EmitTwoReturnValues(1, 10, (chosenMoveId) | (RET_MEGA_EVOLUTION) | (gBattlerTarget << 8)); else BtlController_EmitTwoReturnValues(1, 10, (chosenMoveId) | (gBattlerTarget << 8)); break; diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 1e417194dc..cf5b266d27 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -387,7 +387,7 @@ static void HandleInputChooseTarget(void) PlaySE(SE_SELECT); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = sub_8039B2C; if (gBattleStruct->playerMegaEvoSelect) - BtlController_EmitTwoReturnValues(1, 10 | RET_MEGA_EVOLUTION, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); + BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | RET_MEGA_EVOLUTION | (gMultiUsePlayerCursor << 8)); else BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); EndBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX); @@ -544,7 +544,7 @@ static void HandleInputChooseMove(void) if (!canSelectTarget) { if (gBattleStruct->playerMegaEvoSelect) - BtlController_EmitTwoReturnValues(1, 10 | RET_MEGA_EVOLUTION, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); + BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | RET_MEGA_EVOLUTION | (gMultiUsePlayerCursor << 8)); else BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); PlayerBufferExecCompleted(); diff --git a/src/battle_main.c b/src/battle_main.c index 50a69ec872..4e79f7ad16 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4382,12 +4382,9 @@ static void HandleTurnActionSelectionState(void) case STATE_WAIT_ACTION_CASE_CHOSEN: if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC)))) { - bool32 shouldMegaEvolve; switch (gChosenActionByBattler[gActiveBattler]) { case B_ACTION_USE_MOVE: - shouldMegaEvolve = gBattleBufferB[gActiveBattler][1] & RET_MEGA_EVOLUTION; - gBattleBufferB[gActiveBattler][1] &= ~(RET_MEGA_EVOLUTION); switch (gBattleBufferB[gActiveBattler][1]) { case 3: @@ -4426,10 +4423,10 @@ static void HandleTurnActionSelectionState(void) RecordedBattle_SetBattlerAction(gActiveBattler, gBattleBufferB[gActiveBattler][2]); RecordedBattle_SetBattlerAction(gActiveBattler, gBattleBufferB[gActiveBattler][3]); } - *(gBattleStruct->chosenMovePositions + gActiveBattler) = gBattleBufferB[gActiveBattler][2]; + *(gBattleStruct->chosenMovePositions + gActiveBattler) = gBattleBufferB[gActiveBattler][2] & ~(RET_MEGA_EVOLUTION); gChosenMoveByBattler[gActiveBattler] = gBattleMons[gActiveBattler].moves[*(gBattleStruct->chosenMovePositions + gActiveBattler)]; *(gBattleStruct->moveTarget + gActiveBattler) = gBattleBufferB[gActiveBattler][3]; - if (shouldMegaEvolve) + if (gBattleBufferB[gActiveBattler][2] & RET_MEGA_EVOLUTION) gBattleStruct->toMegaEvolve |= gBitTable[gActiveBattler]; gBattleCommunication[gActiveBattler]++; } diff --git a/src/battle_util.c b/src/battle_util.c index 2cf0d88ac1..4af0d24bc4 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -604,7 +604,8 @@ static bool32 IsHealBlockPreventingMove(u8 battler, u32 move) u8 TrySetCantSelectMoveBattleScript(void) { u8 limitations = 0; - u32 move = gBattleMons[gActiveBattler].moves[gBattleBufferB[gActiveBattler][2]]; + u8 moveId = gBattleBufferB[gActiveBattler][2] & ~(RET_MEGA_EVOLUTION); + u32 move = gBattleMons[gActiveBattler].moves[moveId]; u32 holdEffect = GetBattlerHoldEffect(gActiveBattler, TRUE); u16* choicedMove = &gBattleStruct->choicedMove[gActiveBattler]; @@ -729,7 +730,7 @@ u8 TrySetCantSelectMoveBattleScript(void) } } - if (gBattleMons[gActiveBattler].pp[gBattleBufferB[gActiveBattler][2]] == 0) + if (gBattleMons[gActiveBattler].pp[moveId] == 0) { if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { From add1f4910c03ae86ebfb641d93eace374ae609b0 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 17 Sep 2018 22:40:49 +0200 Subject: [PATCH 113/667] Add mega trigger png --- graphics/battle_interface/mega_trigger.png | Bin 0 -> 1005 bytes .../battle_interface/mega_trigger_off.pal | 259 ++++++++++++++++++ graphics/battle_interface/mega_trigger_on.pal | 259 ++++++++++++++++++ include/battle_interface.h | 8 + src/battle_controller_player.c | 11 +- src/battle_interface.c | 104 +++++++ 6 files changed, 636 insertions(+), 5 deletions(-) create mode 100644 graphics/battle_interface/mega_trigger.png create mode 100644 graphics/battle_interface/mega_trigger_off.pal create mode 100644 graphics/battle_interface/mega_trigger_on.pal diff --git a/graphics/battle_interface/mega_trigger.png b/graphics/battle_interface/mega_trigger.png new file mode 100644 index 0000000000000000000000000000000000000000..b189e6529db4348808636d4c8cf24a8dda9fc6fb GIT binary patch literal 1005 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U}gyL32~jVqoZO%LqJA?f(65e z1r0L-CRhYG+}LoTW5_hnQKz!X+D8FdXkyv)>mJBeSFc=Vs>@WjIU4MUGiCQ db^HIoxT#xNrKeRo^#Gm6;OXk;vd$@?2>_%CYis}j literal 0 HcmV?d00001 diff --git a/graphics/battle_interface/mega_trigger_off.pal b/graphics/battle_interface/mega_trigger_off.pal new file mode 100644 index 0000000000..643b1c3f44 --- /dev/null +++ b/graphics/battle_interface/mega_trigger_off.pal @@ -0,0 +1,259 @@ +JASC-PAL +0100 +256 +152 184 136 +112 136 120 +80 104 96 +32 32 32 +160 160 160 +80 80 80 +48 48 48 +176 176 176 +160 160 160 +200 200 200 +184 184 184 +216 216 216 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +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_interface/mega_trigger_on.pal b/graphics/battle_interface/mega_trigger_on.pal new file mode 100644 index 0000000000..b3239a17e0 --- /dev/null +++ b/graphics/battle_interface/mega_trigger_on.pal @@ -0,0 +1,259 @@ +JASC-PAL +0100 +256 +152 184 136 +120 144 128 +80 104 96 +32 56 0 +240 160 128 +152 80 144 +56 80 64 +216 176 208 +136 184 224 +184 224 240 +184 208 104 +232 232 104 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +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/include/battle_interface.h b/include/battle_interface.h index 3145939d0c..c4ee835f02 100644 --- a/include/battle_interface.h +++ b/include/battle_interface.h @@ -39,11 +39,16 @@ enum #define TAG_STATUS_SUMMARY_BAR_TILE 0xD70C #define TAG_STATUS_SUMMARY_BALLS_TILE 0xD714 +#define TAG_MEGA_TRIGGER_TILE 0xD777 + #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_OFF_PAL 0xD777 +#define TAG_MEGA_TRIGGER_ON_PAL 0xD778 + enum { HEALTHBOX_ALL, @@ -71,6 +76,9 @@ void UpdateOamPriorityInAllHealthboxes(u8 priority); void InitBattlerHealthboxCoords(u8 battler); void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent); void SwapHpBarsWithHpText(void); +void SetMegaTriggerSpritePal(u8 spriteId, u8 palId); +void CreateMegaTriggerSprite(u8 battlerId, u8 palId); +void DestroyMegaTriggerSprite(void); 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); diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index cf5b266d27..56c4540415 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -391,6 +391,7 @@ static void HandleInputChooseTarget(void) else BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); EndBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX); + DestroyMegaTriggerSprite(); PlayerBufferExecCompleted(); } else if (gMain.newKeys & B_BUTTON || gPlayerDpadHoldFrames > 59) @@ -547,6 +548,7 @@ static void HandleInputChooseMove(void) BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | RET_MEGA_EVOLUTION | (gMultiUsePlayerCursor << 8)); else BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); + DestroyMegaTriggerSprite(); PlayerBufferExecCompleted(); } else @@ -568,6 +570,7 @@ static void HandleInputChooseMove(void) PlaySE(SE_SELECT); gBattleStruct->playerMegaEvoSelect = FALSE; BtlController_EmitTwoReturnValues(1, 10, 0xFFFF); + DestroyMegaTriggerSprite(); PlayerBufferExecCompleted(); } else if (gMain.newKeys & DPAD_LEFT) @@ -641,7 +644,7 @@ static void HandleInputChooseMove(void) if (gBattleStruct->megaEvoTriggerSpriteId != 0xFF) { gBattleStruct->playerMegaEvoSelect ^= 1; - // StartSpriteAnim(&gSprites[gBattleStruct->megaEvoTriggerSpriteId], gBattleStruct->playerMegaEvoSelect); + SetMegaTriggerSpritePal(gBattleStruct->megaEvoTriggerSpriteId, gBattleStruct->playerMegaEvoSelect); PlaySE(SE_SELECT); } } @@ -2645,10 +2648,8 @@ static void PlayerHandleChooseMove(void) InitMoveSelectionsVarsAndStrings(); gBattlerControllerFuncs[gActiveBattler] = HandleChooseMoveAfterDma3; gBattleStruct->playerMegaEvoSelect = FALSE; - if (CanMegaEvolve(gActiveBattler) && gBattleStruct->megaEvoTriggerSpriteId == 0xFF) - gBattleStruct->megaEvoTriggerSpriteId = CreateSprite(&gDummySpriteTemplate, 100, 100, 0); - else - gBattleStruct->megaEvoTriggerSpriteId = 0xFF; + if (CanMegaEvolve(gActiveBattler)) + CreateMegaTriggerSprite(gActiveBattler, 0); } } diff --git a/src/battle_interface.c b/src/battle_interface.c index 07eac0b88b..d47cb69408 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -197,6 +197,8 @@ 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 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); @@ -558,6 +560,51 @@ 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 sMegaTriggerOnPal[] = INCBIN_U16("graphics/battle_interface/mega_trigger_on.gbapal"); +static const u16 sMegaTriggerOffPal[] = INCBIN_U16("graphics/battle_interface/mega_trigger_off.gbapal"); + +static const struct SpriteSheet sSpriteSheet_MegaTrigger = +{ + sMegaTriggerGfx, sizeof(sMegaTriggerGfx), TAG_MEGA_TRIGGER_TILE +}; +static const struct SpritePalette sSpritePalette_MegaTriggerOn = +{ + sMegaTriggerOnPal, TAG_MEGA_TRIGGER_ON_PAL +}; +static const struct SpritePalette sSpritePalette_MegaTriggerOff = +{ + sMegaTriggerOffPal, TAG_MEGA_TRIGGER_OFF_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 struct SpriteTemplate sSpriteTemplate_MegaTrigger = +{ + .tileTag = TAG_MEGA_TRIGGER_TILE, + .paletteTag = TAG_MEGA_TRIGGER_ON_PAL, + .oam = &sOamData_MegaTrigger, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCb_MegaTrigger +}; + // code static s32 DummiedOutFunction(s16 unused1, s16 unused2, s32 unused3) @@ -1484,6 +1531,63 @@ void SwapHpBarsWithHpText(void) } } +// Mega Evolution gfx functions. +void SetMegaTriggerSpritePal(u8 spriteId, u8 palId) +{ + switch (palId) + { + case 0: // off + FreeSpritePaletteByTag(TAG_MEGA_TRIGGER_ON_PAL); + LoadSpritePalette(&sSpritePalette_MegaTriggerOff); + if (spriteId != 0xFF) + gSprites[spriteId].oam.paletteNum = IndexOfSpritePaletteTag(TAG_MEGA_TRIGGER_OFF_PAL); + break; + case 1: // on + FreeSpritePaletteByTag(TAG_MEGA_TRIGGER_OFF_PAL); + LoadSpritePalette(&sSpritePalette_MegaTriggerOn); + if (spriteId != 0xFF) + gSprites[spriteId].oam.paletteNum = IndexOfSpritePaletteTag(TAG_MEGA_TRIGGER_ON_PAL); + break; + } +} + +#define MEGA_TRIGGER_POS_X_DIFF 19 +#define MEGA_TRIGGER_POS_Y_DIFF 1 + +void CreateMegaTriggerSprite(u8 battlerId, u8 palId) +{ + if (GetSpriteTileStartByTag(TAG_MEGA_TRIGGER_TILE) == 0xFFFF) + LoadSpriteSheet(&sSpriteSheet_MegaTrigger); + if (gBattleStruct->megaEvoTriggerSpriteId == 0xFF) + { + gBattleStruct->megaEvoTriggerSpriteId = CreateSprite(&sSpriteTemplate_MegaTrigger, + gSprites[gHealthboxSpriteIds[battlerId]].pos1.x - MEGA_TRIGGER_POS_X_DIFF, + gSprites[gHealthboxSpriteIds[battlerId]].pos1.y - MEGA_TRIGGER_POS_Y_DIFF, 0); + gSprites[gBattleStruct->megaEvoTriggerSpriteId].data[0] = battlerId; + } + + SetMegaTriggerSpritePal(gBattleStruct->megaEvoTriggerSpriteId, palId); +} + +static void SpriteCb_MegaTrigger(struct Sprite *sprite) +{ + sprite->pos1.x = gSprites[gHealthboxSpriteIds[sprite->data[0]]].pos1.x - MEGA_TRIGGER_POS_X_DIFF; + sprite->pos1.y = gSprites[gHealthboxSpriteIds[sprite->data[0]]].pos1.y - MEGA_TRIGGER_POS_Y_DIFF; + + sprite->pos2.x = gSprites[gHealthboxSpriteIds[sprite->data[0]]].pos2.x - MEGA_TRIGGER_POS_X_DIFF; + sprite->pos2.y = gSprites[gHealthboxSpriteIds[sprite->data[0]]].pos2.y - MEGA_TRIGGER_POS_Y_DIFF; +} + +void DestroyMegaTriggerSprite(void) +{ + FreeSpritePaletteByTag(TAG_MEGA_TRIGGER_OFF_PAL); + FreeSpritePaletteByTag(TAG_MEGA_TRIGGER_ON_PAL); + FreeSpriteTilesByTag(TAG_MEGA_TRIGGER_TILE); + if (gBattleStruct->megaEvoTriggerSpriteId != 0xFF) + DestroySprite(&gSprites[gBattleStruct->megaEvoTriggerSpriteId]); + gBattleStruct->megaEvoTriggerSpriteId = 0xFF; +} + #define tBattler data[0] #define tSummaryBarSpriteId data[1] #define tBallIconSpriteId(n) data[3 + n] From 49cf3eb396aaa82102e7e3b0fc60aad9aa3f5cf4 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 18 Sep 2018 00:26:22 -0300 Subject: [PATCH 114/667] Update move_descriptions.h Descriptions for Roar of Time and Magma Storm. I think that I did things correctly, but please check before merging, just in case. --- src/data/text/move_descriptions.h | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/data/text/move_descriptions.h b/src/data/text/move_descriptions.h index a77991eb98..b09f974c68 100644 --- a/src/data/text/move_descriptions.h +++ b/src/data/text/move_descriptions.h @@ -1753,10 +1753,18 @@ 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."); @@ -2974,11 +2982,11 @@ const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] = [MOVE_HEAL_ORDER - 1] = sNotDoneYetDescription, [MOVE_HEAD_SMASH - 1] = sHEAD_SMASHDescription, [MOVE_DOUBLE_HIT - 1] = sDOUBLE_HITDescription, - [MOVE_ROAR_OF_TIME - 1] = sNotDoneYetDescription, + [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] = sNotDoneYetDescription, + [MOVE_MAGMA_STORM - 1] = sMAGMA_STORMDescription, [MOVE_DARK_VOID - 1] = sDARK_VOIDDescription, [MOVE_SEED_FLARE - 1] = sSEED_FLAREDescription, [MOVE_OMINOUS_WIND - 1] = sOMINOUS_WINDDescription, From facd83811272d156dfef186d472dccd65719be61 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 18 Sep 2018 21:51:10 +0200 Subject: [PATCH 115/667] Add debug controller to all controllers --- src/battle_controller_link_opponent.c | 7 +++++++ src/battle_controller_link_partner.c | 7 +++++++ src/battle_controller_player_partner.c | 7 +++++++ src/battle_controller_recorded_opponent.c | 7 +++++++ src/battle_controller_safari.c | 7 +++++++ src/battle_controller_wally.c | 7 +++++++ 6 files changed, 42 insertions(+) diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index 637b8c7027..12350496c4 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -95,6 +95,7 @@ static void LinkOpponentHandleBattleAnimation(void); static void LinkOpponentHandleLinkStandbyMsg(void); static void LinkOpponentHandleResetActionMoveSelection(void); static void LinkOpponentHandleCmd55(void); +static void LinkOpponentHandleBattleDebug(void); static void nullsub_92(void); static void LinkOpponentBufferRunCommand(void); @@ -167,6 +168,7 @@ static void (*const sLinkOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void) = LinkOpponentHandleLinkStandbyMsg, LinkOpponentHandleResetActionMoveSelection, LinkOpponentHandleCmd55, + LinkOpponentHandleBattleDebug, nullsub_92 }; @@ -1860,6 +1862,11 @@ static void LinkOpponentHandleCmd55(void) gBattlerControllerFuncs[gActiveBattler] = sub_80587B0; } +static void LinkOpponentHandleBattleDebug(void) +{ + LinkOpponentBufferExecCompleted(); +} + static void nullsub_92(void) { } diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index bfaaf9e82c..54172fd483 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -94,6 +94,7 @@ static void LinkPartnerHandleBattleAnimation(void); static void LinkPartnerHandleLinkStandbyMsg(void); static void LinkPartnerHandleResetActionMoveSelection(void); static void LinkPartnerHandleCmd55(void); +static void LinkPartnerHandleBattleDebug(void); static void nullsub_113(void); static void LinkPartnerBufferRunCommand(void); @@ -165,6 +166,7 @@ static void (*const sLinkPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(void) = LinkPartnerHandleLinkStandbyMsg, LinkPartnerHandleResetActionMoveSelection, LinkPartnerHandleCmd55, + LinkPartnerHandleBattleDebug, nullsub_113 }; @@ -1691,6 +1693,11 @@ static void LinkPartnerHandleCmd55(void) gBattlerControllerFuncs[gActiveBattler] = sub_80587B0; } +static void LinkPartnerHandleBattleDebug(void) +{ + LinkPartnerBufferExecCompleted(); +} + static void nullsub_113(void) { } diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 7795c56566..163af3c197 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -95,6 +95,7 @@ static void PlayerPartnerHandleBattleAnimation(void); static void PlayerPartnerHandleLinkStandbyMsg(void); static void PlayerPartnerHandleResetActionMoveSelection(void); static void PlayerPartnerHandleCmd55(void); +static void PlayerPartnerHandleBattleDebug(void); static void nullsub_128(void); static void PlayerPartnerBufferRunCommand(void); @@ -172,6 +173,7 @@ static void (*const sPlayerPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(void) = PlayerPartnerHandleLinkStandbyMsg, PlayerPartnerHandleResetActionMoveSelection, PlayerPartnerHandleCmd55, + PlayerPartnerHandleBattleDebug, nullsub_128 }; @@ -1933,6 +1935,11 @@ static void PlayerPartnerHandleCmd55(void) gBattlerControllerFuncs[gActiveBattler] = sub_80587B0; } +static void PlayerPartnerHandleBattleDebug(void) +{ + PlayerPartnerBufferExecCompleted(); +} + static void nullsub_128(void) { } diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index 963c535dbb..9ed985fac1 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -97,6 +97,7 @@ static void RecordedOpponentHandleBattleAnimation(void); static void RecordedOpponentHandleLinkStandbyMsg(void); static void RecordedOpponentHandleResetActionMoveSelection(void); static void RecordedOpponentHandleCmd55(void); +static void RecordedOpponentHandleBattleDebug(void); static void nullsub_119(void); static void RecordedOpponentBufferRunCommand(void); @@ -169,6 +170,7 @@ static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void RecordedOpponentHandleLinkStandbyMsg, RecordedOpponentHandleResetActionMoveSelection, RecordedOpponentHandleCmd55, + RecordedOpponentHandleBattleDebug, nullsub_119 }; @@ -1797,6 +1799,11 @@ static void RecordedOpponentHandleCmd55(void) gBattlerControllerFuncs[gActiveBattler] = sub_80587B0; } +static void RecordedOpponentHandleBattleDebug(void) +{ + RecordedOpponentBufferExecCompleted(); +} + static void nullsub_119(void) { } diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c index aab804b417..e158e08cac 100644 --- a/src/battle_controller_safari.c +++ b/src/battle_controller_safari.c @@ -87,6 +87,7 @@ static void SafariHandleBattleAnimation(void); static void SafariHandleLinkStandbyMsg(void); static void SafariHandleResetActionMoveSelection(void); static void SafariHandleCmd55(void); +static void SafariHandleBattleDebug(void); static void nullsub_115(void); static void SafariBufferRunCommand(void); @@ -151,6 +152,7 @@ static void (*const sSafariBufferCommands[CONTROLLER_CMDS_COUNT])(void) = SafariHandleLinkStandbyMsg, SafariHandleResetActionMoveSelection, SafariHandleCmd55, + SafariHandleBattleDebug, nullsub_115 }; @@ -691,6 +693,11 @@ static void SafariHandleCmd55(void) gBattlerControllerFuncs[gActiveBattler] = sub_81595E4; } +static void SafariHandleBattleDebug(void) +{ + SafariBufferExecCompleted(); +} + static void nullsub_115(void) { } diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c index 747aa29878..8276f1b5c9 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -97,6 +97,7 @@ static void WallyHandleBattleAnimation(void); static void WallyHandleLinkStandbyMsg(void); static void WallyHandleResetActionMoveSelection(void); static void WallyHandleCmd55(void); +static void WallyHandleBattleDebug(void); static void nullsub_118(void); static void WallyBufferRunCommand(void); @@ -166,6 +167,7 @@ static void (*const sWallyBufferCommands[CONTROLLER_CMDS_COUNT])(void) = WallyHandleLinkStandbyMsg, WallyHandleResetActionMoveSelection, WallyHandleCmd55, + WallyHandleBattleDebug, nullsub_118 }; @@ -1564,6 +1566,11 @@ static void WallyHandleCmd55(void) gBattlerControllerFuncs[gActiveBattler] = sub_80587B0; } +static void WallyHandleBattleDebug(void) +{ + WallyBufferExecCompleted(); +} + static void nullsub_118(void) { } From 602c1322e45f10a46a8136eea276caaebfe96b98 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 20 Sep 2018 11:23:12 +0200 Subject: [PATCH 116/667] almost full support for link battles mega evolution --- data/battle_scripts_1.s | 2 +- include/battle.h | 2 +- include/battle_interface.h | 2 ++ include/battle_util.h | 1 + src/battle_controller_player.c | 12 ++++---- src/battle_interface.c | 54 +++++++++++++++++++++++++++++----- src/battle_message.c | 40 +++++++++++++------------ src/battle_script_commands.c | 15 ++++++++-- src/battle_util.c | 49 +++++++++++++++++------------- src/data/pokemon/evolution.h | 2 ++ 10 files changed, 125 insertions(+), 54 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index dbd0761404..d7fa9580d1 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4610,7 +4610,7 @@ BattleScript_FocusPunchSetUp:: printstring STRINGID_PKMNTIGHTENINGFOCUS waitmessage 0x40 end2 - + BattleScript_MegaEvolution:: printstring STRINGID_MEGAEVOREACTING waitmessage 0x40 diff --git a/include/battle.h b/include/battle.h index ee2323215d..f839f8b964 100644 --- a/include/battle.h +++ b/include/battle.h @@ -601,7 +601,7 @@ struct BattleStruct u8 toMegaEvolve; // As flags using gBitTable. u8 megaEvolvedPartyIds[2]; // As flags using gBitTable; bool8 alreadyMegaEvolved[4]; // Array id is used for mon position. - u16 speciesToMegaEvolve[MAX_BATTLERS_COUNT]; + u16 speciesThatMegaEvolved[MAX_BATTLERS_COUNT]; u16 playerSpeciesThatMegaEvolved; u8 megaEvoBattlerId; bool8 playerMegaEvoSelect; diff --git a/include/battle_interface.h b/include/battle_interface.h index c4ee835f02..cbd0bc3c6d 100644 --- a/include/battle_interface.h +++ b/include/battle_interface.h @@ -78,6 +78,8 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent); void SwapHpBarsWithHpText(void); void SetMegaTriggerSpritePal(u8 spriteId, u8 palId); void CreateMegaTriggerSprite(u8 battlerId, u8 palId); +bool32 IsMegaTriggerSpriteActive(void); +void HideMegaTriggerSprite(void); void DestroyMegaTriggerSprite(void); u8 CreatePartyStatusSummarySprites(u8 battler, struct HpAndStatus *partyInfo, u8 arg2, bool8 isBattleStart); void Task_HidePartyStatusSummary(u8 taskId); diff --git a/include/battle_util.h b/include/battle_util.h index aa69a020bd..727f9d07f3 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -88,6 +88,7 @@ u16 CalcTypeEffectivenessMultiplier(u16 move, u8 moveType, u8 battlerAtk, u8 bat 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(u8 monId); diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 56c4540415..6d6f665f28 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -391,7 +391,7 @@ static void HandleInputChooseTarget(void) else BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); EndBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX); - DestroyMegaTriggerSprite(); + HideMegaTriggerSprite(); PlayerBufferExecCompleted(); } else if (gMain.newKeys & B_BUTTON || gPlayerDpadHoldFrames > 59) @@ -548,7 +548,7 @@ static void HandleInputChooseMove(void) BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | RET_MEGA_EVOLUTION | (gMultiUsePlayerCursor << 8)); else BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); - DestroyMegaTriggerSprite(); + HideMegaTriggerSprite(); PlayerBufferExecCompleted(); } else @@ -570,7 +570,7 @@ static void HandleInputChooseMove(void) PlaySE(SE_SELECT); gBattleStruct->playerMegaEvoSelect = FALSE; BtlController_EmitTwoReturnValues(1, 10, 0xFFFF); - DestroyMegaTriggerSprite(); + HideMegaTriggerSprite(); PlayerBufferExecCompleted(); } else if (gMain.newKeys & DPAD_LEFT) @@ -641,7 +641,7 @@ static void HandleInputChooseMove(void) } else if (gMain.newKeys & START_BUTTON) { - if (gBattleStruct->megaEvoTriggerSpriteId != 0xFF) + if (CanMegaEvolve(gActiveBattler)) { gBattleStruct->playerMegaEvoSelect ^= 1; SetMegaTriggerSpritePal(gBattleStruct->megaEvoTriggerSpriteId, gBattleStruct->playerMegaEvoSelect); @@ -2646,10 +2646,12 @@ static void PlayerHandleChooseMove(void) else { InitMoveSelectionsVarsAndStrings(); - gBattlerControllerFuncs[gActiveBattler] = HandleChooseMoveAfterDma3; gBattleStruct->playerMegaEvoSelect = FALSE; + if (!IsMegaTriggerSpriteActive()) + gBattleStruct->megaEvoTriggerSpriteId = 0xFF; if (CanMegaEvolve(gActiveBattler)) CreateMegaTriggerSprite(gActiveBattler, 0); + gBattlerControllerFuncs[gActiveBattler] = HandleChooseMoveAfterDma3; } } diff --git a/src/battle_interface.c b/src/battle_interface.c index d47cb69408..736b3be588 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -589,7 +589,7 @@ static const struct OamData sOamData_MegaTrigger = .matrixNum = 0, .size = 2, .tileNum = 0, - .priority = 1, + .priority = 3, .paletteNum = 0, .affineParam = 0, }; @@ -1554,6 +1554,9 @@ void SetMegaTriggerSpritePal(u8 spriteId, u8 palId) #define MEGA_TRIGGER_POS_X_DIFF 19 #define MEGA_TRIGGER_POS_Y_DIFF 1 +#define tBattler data[0] +#define tHide data[1] + void CreateMegaTriggerSprite(u8 battlerId, u8 palId) { if (GetSpriteTileStartByTag(TAG_MEGA_TRIGGER_TILE) == 0xFFFF) @@ -1561,21 +1564,55 @@ void CreateMegaTriggerSprite(u8 battlerId, u8 palId) if (gBattleStruct->megaEvoTriggerSpriteId == 0xFF) { gBattleStruct->megaEvoTriggerSpriteId = CreateSprite(&sSpriteTemplate_MegaTrigger, - gSprites[gHealthboxSpriteIds[battlerId]].pos1.x - MEGA_TRIGGER_POS_X_DIFF, + gSprites[gHealthboxSpriteIds[battlerId]].pos1.x, gSprites[gHealthboxSpriteIds[battlerId]].pos1.y - MEGA_TRIGGER_POS_Y_DIFF, 0); - gSprites[gBattleStruct->megaEvoTriggerSpriteId].data[0] = battlerId; + gSprites[gBattleStruct->megaEvoTriggerSpriteId].tBattler = battlerId; } + gSprites[gBattleStruct->megaEvoTriggerSpriteId].tHide = FALSE; SetMegaTriggerSpritePal(gBattleStruct->megaEvoTriggerSpriteId, palId); } static void SpriteCb_MegaTrigger(struct Sprite *sprite) { - sprite->pos1.x = gSprites[gHealthboxSpriteIds[sprite->data[0]]].pos1.x - MEGA_TRIGGER_POS_X_DIFF; - sprite->pos1.y = gSprites[gHealthboxSpriteIds[sprite->data[0]]].pos1.y - MEGA_TRIGGER_POS_Y_DIFF; + if (sprite->tHide) + { + if (sprite->pos1.x != gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos1.x + MEGA_TRIGGER_POS_X_DIFF) + sprite->pos1.x++; + if (sprite->pos2.x != gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos2.x + MEGA_TRIGGER_POS_X_DIFF) + sprite->pos2.x++; - sprite->pos2.x = gSprites[gHealthboxSpriteIds[sprite->data[0]]].pos2.x - MEGA_TRIGGER_POS_X_DIFF; - sprite->pos2.y = gSprites[gHealthboxSpriteIds[sprite->data[0]]].pos2.y - MEGA_TRIGGER_POS_Y_DIFF; + sprite->pos1.y = gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos1.y - MEGA_TRIGGER_POS_Y_DIFF; + sprite->pos2.y = gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos2.y - MEGA_TRIGGER_POS_Y_DIFF; + if (sprite->pos1.x == gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos1.x + MEGA_TRIGGER_POS_X_DIFF + && sprite->pos2.x == gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos2.x + MEGA_TRIGGER_POS_X_DIFF) + DestroyMegaTriggerSprite(); + } + else + { + if (sprite->pos1.x != gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos1.x - MEGA_TRIGGER_POS_X_DIFF) + sprite->pos1.x--; + if (sprite->pos2.x != gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos2.x - MEGA_TRIGGER_POS_X_DIFF) + sprite->pos2.x--; + + sprite->pos1.y = gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos1.y - MEGA_TRIGGER_POS_Y_DIFF; + sprite->pos2.y = gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos2.y - MEGA_TRIGGER_POS_Y_DIFF; + } +} + +bool32 IsMegaTriggerSpriteActive(void) +{ + if (GetSpriteTileStartByTag(TAG_MEGA_TRIGGER_TILE) == 0xFFFF) + return FALSE; + else if (IndexOfSpritePaletteTag(TAG_MEGA_TRIGGER_OFF_PAL) != 0xFF || IndexOfSpritePaletteTag(TAG_MEGA_TRIGGER_ON_PAL) != 0xFF) + return TRUE; + else + return FALSE; +} + +void HideMegaTriggerSprite(void) +{ + gSprites[gBattleStruct->megaEvoTriggerSpriteId].tHide = TRUE; } void DestroyMegaTriggerSprite(void) @@ -1588,6 +1625,9 @@ void DestroyMegaTriggerSprite(void) gBattleStruct->megaEvoTriggerSpriteId = 0xFF; } +#undef tBattler +#undef tHide + #define tBattler data[0] #define tSummaryBarSpriteId data[1] #define tBallIconSpriteId(n) data[3 + n] diff --git a/src/battle_message.c b/src/battle_message.c index cc592b7d6f..c08b838225 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -2579,7 +2579,7 @@ static const u8* TryGetStatusString(u8 *src) StringGetEnd10(text); \ toCpy = text; -static const u8 *BattleStringGetTrainerName(u16 trainerId, u8 *text, u8 multiplierId) +static const u8 *BattleStringGetTrainerName(u16 trainerId, u8 *text, u8 multiplayerId, u8 battlerId) { const u8 *toCpy; @@ -2594,7 +2594,11 @@ static const u8 *BattleStringGetTrainerName(u16 trainerId, u8 *text, u8 multipli } else if (trainerId == TRAINER_OPPONENT_C00) { - toCpy = gLinkPlayers[multiplierId ^ BIT_SIDE].name; + toCpy = gLinkPlayers[multiplayerId ^ BIT_SIDE].name; + } + else if (trainerId == TRAINER_LINK_OPPONENT && gBattleTypeFlags & BATTLE_TYPE_LINK && battlerId != 0xFF) + { + toCpy = gLinkPlayers[GetBattlerMultiplayerId(battlerId)].name; } else if (trainerId == TRAINER_FRONTIER_BRAIN) { @@ -2651,13 +2655,13 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) u32 dstID = 0; // if they used dstID, why not use srcID as well? const u8 *toCpy = NULL; u8 text[30]; - u8 multiplayerID; + u8 multiplayerId; s32 i; if (gBattleTypeFlags & BATTLE_TYPE_x2000000) - multiplayerID = gUnknown_0203C7B4; + multiplayerId = gUnknown_0203C7B4; else - multiplayerID = GetMultiplayerId(); + multiplayerId = GetMultiplayerId(); while (*src != EOS) { @@ -2732,25 +2736,25 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) toCpy = text; break; case B_TXT_LINK_PLAYER_MON1_NAME: // link first player poke name - GetMonData(&gPlayerParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].id]], + GetMonData(&gPlayerParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerId].id]], MON_DATA_NICKNAME, text); StringGetEnd10(text); toCpy = text; break; case B_TXT_LINK_OPPONENT_MON1_NAME: // link first opponent poke name - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].id ^ 1]], + GetMonData(&gEnemyParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerId].id ^ 1]], MON_DATA_NICKNAME, text); StringGetEnd10(text); toCpy = text; break; case B_TXT_LINK_PLAYER_MON2_NAME: // link second player poke name - GetMonData(&gPlayerParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].id ^ 2]], + GetMonData(&gPlayerParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerId].id ^ 2]], MON_DATA_NICKNAME, text); StringGetEnd10(text); toCpy = text; break; case B_TXT_LINK_OPPONENT_MON2_NAME: // link second opponent poke name - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].id ^ 3]], + GetMonData(&gEnemyParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerId].id ^ 3]], MON_DATA_NICKNAME, text); StringGetEnd10(text); toCpy = text; @@ -2857,19 +2861,19 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) toCpy = BattleStringGetTrainerClass(gTrainerBattleOpponent_A); break; case B_TXT_TRAINER1_NAME: // trainer1 name - toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_A, text, multiplayerID); + toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_A, text, multiplayerId, 0xFF); break; case B_TXT_1E: // link player name? - toCpy = gLinkPlayers[multiplayerID].name; + toCpy = gLinkPlayers[multiplayerId].name; break; case B_TXT_1F: // link partner name? - toCpy = gLinkPlayers[GetBattlerMultiplayerId(2 ^ gLinkPlayers[multiplayerID].id)].name; + toCpy = gLinkPlayers[GetBattlerMultiplayerId(2 ^ gLinkPlayers[multiplayerId].id)].name; break; case B_TXT_20: // link opponent 1 name? - toCpy = gLinkPlayers[GetBattlerMultiplayerId(1 ^ gLinkPlayers[multiplayerID].id)].name; + toCpy = gLinkPlayers[GetBattlerMultiplayerId(1 ^ gLinkPlayers[multiplayerId].id)].name; break; case B_TXT_21: // link opponent 2 name? - toCpy = gLinkPlayers[GetBattlerMultiplayerId(3 ^ gLinkPlayers[multiplayerID].id)].name; + toCpy = gLinkPlayers[GetBattlerMultiplayerId(3 ^ gLinkPlayers[multiplayerId].id)].name; break; case B_TXT_22: // link scripting active name toCpy = gLinkPlayers[GetBattlerMultiplayerId(gBattleScripting.battler)].name; @@ -2957,7 +2961,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) toCpy = BattleStringGetTrainerClass(gTrainerBattleOpponent_B); break; case B_TXT_TRAINER2_NAME: - toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_B, text, multiplayerID); + toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_B, text, multiplayerId, 0xFF); break; case B_TXT_TRAINER2_LOSE_TEXT: if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) @@ -3012,13 +3016,13 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) } break; case B_POSITION_OPPONENT_LEFT: - toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_A, text, multiplayerID); + toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_A, text, multiplayerId, gBattlerAttacker); break; case B_POSITION_OPPONENT_RIGHT: if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) - toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_B, text, multiplayerID); + toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_B, text, multiplayerId, gBattlerAttacker); else - toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_A, text, multiplayerID); + toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_A, text, multiplayerId, gBattlerAttacker); break; } break; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e19a082389..4db5eb4b1c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6594,7 +6594,15 @@ static void atk76_various(void) mon = &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]; else mon = &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]; - gBattleMons[gActiveBattler].species = gBattleStruct->speciesToMegaEvolve[gActiveBattler]; + + gBattleStruct->speciesThatMegaEvolved[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->playerSpeciesThatMegaEvolved = gBattleStruct->speciesThatMegaEvolved[gActiveBattler]; + } + + gBattleMons[gActiveBattler].species = GetMegaEvolutionSpecies(gBattleStruct->speciesThatMegaEvolved[gActiveBattler], gBattleMons[gActiveBattler].item); SetMonData(mon, MON_DATA_SPECIES, &gBattleMons[gActiveBattler].species); PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gActiveBattler].species); @@ -6610,10 +6618,13 @@ static void atk76_various(void) gBattleMons[gActiveBattler].ability = GetMonAbility(mon); gBattleMons[gActiveBattler].type1 = gBaseStats[gBattleMons[gActiveBattler].species].type1; gBattleMons[gActiveBattler].type2 = gBaseStats[gBattleMons[gActiveBattler].species].type2; - UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], mon, HEALTHBOX_ALL); + UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], mon, HEALTHBOX_ALL); gBattleStruct->alreadyMegaEvolved[GetBattlerPosition(gActiveBattler)] = TRUE; gBattleStruct->megaEvolvedPartyIds[GetBattlerSide(gActiveBattler)] |= gBitTable[gBattlerPartyIndexes[gActiveBattler]]; + + BtlController_EmitSetMonData(0, REQUEST_ALL_BATTLE, gBitTable[gBattlerPartyIndexes[gActiveBattler]], sizeof(struct BattlePokemon), &gBattleMons[gActiveBattler]); + MarkBattlerForControllerExec(gActiveBattler); break; } diff --git a/src/battle_util.c b/src/battle_util.c index 4af0d24bc4..b6e3af4d96 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5586,10 +5586,23 @@ static bool32 IsPartnerMonFromSameTrainer(u8 battlerId) return TRUE; } -bool32 CanMegaEvolve(u8 battlerId) +u16 GetMegaEvolutionSpecies(u16 preEvoSpecies, u16 heldItemId) { u32 i; - u16 species, itemId; + + 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)); @@ -5602,27 +5615,23 @@ bool32 CanMegaEvolve(u8 battlerId) return FALSE; } - // Check if the pokemon holds an appropriate item, - if (GetBattlerHoldEffect(battlerId, FALSE) != HOLD_EFFECT_MEGA_STONE) + // 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 (itemId != ITEM_ENIGMA_BERRY) + holdEffect = ItemId_GetHoldEffect(itemId); + else + holdEffect = gEnigmaBerries[battlerId].holdEffect; + + if (holdEffect != HOLD_EFFECT_MEGA_STONE) return FALSE; // Check if there is an entry in the evolution table. - species = gBattleMons[battlerId].species; - itemId = gBattleMons[battlerId].item; - for (i = 0; i < EVOS_PER_MON; i++) - { - if (gEvolutionTable[species][i].method == EVO_MEGA_EVOLUTION - && gEvolutionTable[species][i].param == itemId) - { - gBattleStruct->speciesToMegaEvolve[battlerId] = gEvolutionTable[species][i].targetSpecies; - if (battlerPosition == B_POSITION_PLAYER_LEFT - || (battlerPosition == B_POSITION_PLAYER_RIGHT && !(gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER)))) - gBattleStruct->playerSpeciesThatMegaEvolved = species; - break; - } - } - - if (i == EVOS_PER_MON) + if (GetMegaEvolutionSpecies(GetMonData(mon, MON_DATA_SPECIES), itemId) == SPECIES_NONE) return FALSE; // All checks passed, the mon CAN mega evolve. diff --git a/src/data/pokemon/evolution.h b/src/data/pokemon/evolution.h index 4bd3df292f..1c8a4a73aa 100644 --- a/src/data/pokemon/evolution.h +++ b/src/data/pokemon/evolution.h @@ -188,6 +188,8 @@ const struct Evolution gEvolutionTable[NUM_SPECIES][EVOS_PER_MON] = [SPECIES_SHELGON] = {{EVO_LEVEL, 50, SPECIES_SALAMENCE}}, [SPECIES_BELDUM] = {{EVO_LEVEL, 20, SPECIES_METANG}}, [SPECIES_METANG] = {{EVO_LEVEL, 45, SPECIES_METAGROSS}}, + [SPECIES_SKARMORY] = {{EVO_LEVEL, 40, SPECIES_EXPLOUD}, + {EVO_MEGA_EVOLUTION, ITEM_MEGA_STONE_TESTING, SPECIES_HO_OH}}, }; #endif //POKEEMERALD_EVOLUTION_H From c7ca7b6e8e4b18090a3ad4ac6111169f0d6b124c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 20 Sep 2018 12:55:12 +0200 Subject: [PATCH 117/667] Fix mega evolution allowing to evolve two mons in doubles --- src/battle_interface.c | 2 +- src/battle_main.c | 2 ++ src/battle_util.c | 3 ++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/battle_interface.c b/src/battle_interface.c index 736b3be588..3506e63826 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -1566,8 +1566,8 @@ void CreateMegaTriggerSprite(u8 battlerId, u8 palId) gBattleStruct->megaEvoTriggerSpriteId = CreateSprite(&sSpriteTemplate_MegaTrigger, gSprites[gHealthboxSpriteIds[battlerId]].pos1.x, gSprites[gHealthboxSpriteIds[battlerId]].pos1.y - MEGA_TRIGGER_POS_Y_DIFF, 0); - gSprites[gBattleStruct->megaEvoTriggerSpriteId].tBattler = battlerId; } + gSprites[gBattleStruct->megaEvoTriggerSpriteId].tBattler = battlerId; gSprites[gBattleStruct->megaEvoTriggerSpriteId].tHide = FALSE; SetMegaTriggerSpritePal(gBattleStruct->megaEvoTriggerSpriteId, palId); diff --git a/src/battle_main.c b/src/battle_main.c index 4e79f7ad16..f01d1b52bc 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4338,6 +4338,8 @@ static void HandleTurnActionSelectionState(void) { RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))), 3); } + + gBattleStruct->toMegaEvolve &= ~(gBitTable[BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))]); BtlController_EmitEndBounceEffect(0); MarkBattlerForControllerExec(gActiveBattler); return; diff --git a/src/battle_util.c b/src/battle_util.c index b6e3af4d96..549f16bac9 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5611,7 +5611,8 @@ bool32 CanMegaEvolve(u8 battlerId) return FALSE; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { - if (IsPartnerMonFromSameTrainer(battlerId) && gBattleStruct->alreadyMegaEvolved[partnerPosition]) + if (IsPartnerMonFromSameTrainer(battlerId) + && (gBattleStruct->alreadyMegaEvolved[partnerPosition] || (gBattleStruct->toMegaEvolve & gBitTable[BATTLE_PARTNER(battlerId)]))) return FALSE; } From 13e434f87412e74da8799d170a87ea321d6bad8a Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 20 Sep 2018 17:22:16 +0200 Subject: [PATCH 118/667] Fix trainer name getter function --- src/battle_message.c | 120 +++++++++++++++++++++++++++---------------- 1 file changed, 77 insertions(+), 43 deletions(-) diff --git a/src/battle_message.c b/src/battle_message.c index c08b838225..64b7dc92c2 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -2579,7 +2579,7 @@ static const u8* TryGetStatusString(u8 *src) StringGetEnd10(text); \ toCpy = text; -static const u8 *BattleStringGetTrainerName(u16 trainerId, u8 *text, u8 multiplayerId, u8 battlerId) +static const u8 *BattleStringGetOpponentNameByTrainerId(u16 trainerId, u8 *text, u8 multiplayerId, u8 battlerId) { const u8 *toCpy; @@ -2596,9 +2596,12 @@ static const u8 *BattleStringGetTrainerName(u16 trainerId, u8 *text, u8 multipla { toCpy = gLinkPlayers[multiplayerId ^ BIT_SIDE].name; } - else if (trainerId == TRAINER_LINK_OPPONENT && gBattleTypeFlags & BATTLE_TYPE_LINK && battlerId != 0xFF) + else if (trainerId == TRAINER_LINK_OPPONENT) { - toCpy = gLinkPlayers[GetBattlerMultiplayerId(battlerId)].name; + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + toCpy = gLinkPlayers[GetBattlerMultiplayerId(battlerId)].name; + else + toCpy = gLinkPlayers[GetBattlerMultiplayerId(battlerId) & BIT_SIDE].name; } else if (trainerId == TRAINER_FRONTIER_BRAIN) { @@ -2628,7 +2631,67 @@ static const u8 *BattleStringGetTrainerName(u16 trainerId, u8 *text, u8 multipla return toCpy; } -static const u8 *BattleStringGetTrainerClass(u16 trainerId) +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)) + 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_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; @@ -2858,10 +2921,10 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) toCpy = gAbilityNames[sBattlerAbilities[gEffectBattler]]; break; case B_TXT_TRAINER1_CLASS: // trainer class name - toCpy = BattleStringGetTrainerClass(gTrainerBattleOpponent_A); + toCpy = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_A); break; case B_TXT_TRAINER1_NAME: // trainer1 name - toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_A, text, multiplayerId, 0xFF); + toCpy = BattleStringGetOpponentNameByTrainerId(gTrainerBattleOpponent_A, text, multiplayerId, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)); break; case B_TXT_1E: // link player name? toCpy = gLinkPlayers[multiplayerId].name; @@ -2879,10 +2942,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) @@ -2958,10 +3018,10 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) toCpy = sText_FoePkmnPrefix4; break; case B_TXT_TRAINER2_CLASS: - toCpy = BattleStringGetTrainerClass(gTrainerBattleOpponent_B); + toCpy = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_B); break; case B_TXT_TRAINER2_NAME: - toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_B, text, multiplayerId, 0xFF); + toCpy = BattleStringGetOpponentNameByTrainerId(gTrainerBattleOpponent_B, text, multiplayerId, GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)); break; case B_TXT_TRAINER2_LOSE_TEXT: if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) @@ -2995,36 +3055,10 @@ 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: - switch (GetBattlerPosition(gBattlerAttacker)) - { - case B_POSITION_PLAYER_LEFT: - toCpy = gSaveBlock2Ptr->playerName; - break; - case B_POSITION_PLAYER_RIGHT: - if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) - { - GetFrontierTrainerName(text, gPartnerTrainerId); - toCpy = text; - } - else - { - toCpy = gSaveBlock2Ptr->playerName; - } - break; - case B_POSITION_OPPONENT_LEFT: - toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_A, text, multiplayerId, gBattlerAttacker); - break; - case B_POSITION_OPPONENT_RIGHT: - if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) - toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_B, text, multiplayerId, gBattlerAttacker); - else - toCpy = BattleStringGetTrainerName(gTrainerBattleOpponent_A, text, multiplayerId, gBattlerAttacker); - break; - } + toCpy = BattleStringGetTrainerName(text, multiplayerId, gBattlerAttacker); break; case B_TXT_ATK_TRAINER_CLASS: switch (GetBattlerPosition(gBattlerAttacker)) @@ -3034,13 +3068,13 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) toCpy = gTrainerClassNames[GetFrontierOpponentClass(gPartnerTrainerId)]; break; case B_POSITION_OPPONENT_LEFT: - toCpy = BattleStringGetTrainerClass(gTrainerBattleOpponent_A); + toCpy = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_A); break; case B_POSITION_OPPONENT_RIGHT: if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) - toCpy = BattleStringGetTrainerClass(gTrainerBattleOpponent_B); + toCpy = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_B); else - toCpy = BattleStringGetTrainerClass(gTrainerBattleOpponent_A); + toCpy = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_A); break; } break; From 2bae70a66b88250c415f910ccb18e75e6d88d4a1 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 20 Sep 2018 17:33:27 +0200 Subject: [PATCH 119/667] Convert mega related struct fields to a seperate struct --- include/battle.h | 23 ++++++++++++++--------- src/battle_controller_player.c | 14 +++++++------- src/battle_interface.c | 18 +++++++++--------- src/battle_main.c | 22 +++++++++++----------- src/battle_script_commands.c | 10 +++++----- src/battle_util.c | 10 +++++----- 6 files changed, 51 insertions(+), 46 deletions(-) diff --git a/include/battle.h b/include/battle.h index f839f8b964..b605e352b3 100644 --- a/include/battle.h +++ b/include/battle.h @@ -478,6 +478,19 @@ 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; + u8 indicatorSpriteIds[MAX_BATTLERS_COUNT]; +}; + struct BattleStruct { u8 turnEffectsTracker; @@ -598,15 +611,7 @@ struct BattleStruct bool8 ateBoost[MAX_BATTLERS_COUNT]; u32 debugAIFlags; bool8 notfirstTimeAIFlags; - u8 toMegaEvolve; // As flags using gBitTable. - u8 megaEvolvedPartyIds[2]; // As flags using gBitTable; - bool8 alreadyMegaEvolved[4]; // Array id is used for mon position. - u16 speciesThatMegaEvolved[MAX_BATTLERS_COUNT]; - u16 playerSpeciesThatMegaEvolved; - u8 megaEvoBattlerId; - bool8 playerMegaEvoSelect; - u8 megaEvoTriggerSpriteId; - u8 megaEvoIndicatorSpriteId[MAX_BATTLERS_COUNT]; + struct MegaEvolutionData mega; }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 6d6f665f28..23a01616e5 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -386,7 +386,7 @@ static void HandleInputChooseTarget(void) { PlaySE(SE_SELECT); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = sub_8039B2C; - if (gBattleStruct->playerMegaEvoSelect) + if (gBattleStruct->mega.playerSelect) BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | RET_MEGA_EVOLUTION | (gMultiUsePlayerCursor << 8)); else BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); @@ -544,7 +544,7 @@ static void HandleInputChooseMove(void) if (!canSelectTarget) { - if (gBattleStruct->playerMegaEvoSelect) + if (gBattleStruct->mega.playerSelect) BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | RET_MEGA_EVOLUTION | (gMultiUsePlayerCursor << 8)); else BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); @@ -568,7 +568,7 @@ static void HandleInputChooseMove(void) else if (gMain.newKeys & B_BUTTON || gPlayerDpadHoldFrames > 59) { PlaySE(SE_SELECT); - gBattleStruct->playerMegaEvoSelect = FALSE; + gBattleStruct->mega.playerSelect = FALSE; BtlController_EmitTwoReturnValues(1, 10, 0xFFFF); HideMegaTriggerSprite(); PlayerBufferExecCompleted(); @@ -643,8 +643,8 @@ static void HandleInputChooseMove(void) { if (CanMegaEvolve(gActiveBattler)) { - gBattleStruct->playerMegaEvoSelect ^= 1; - SetMegaTriggerSpritePal(gBattleStruct->megaEvoTriggerSpriteId, gBattleStruct->playerMegaEvoSelect); + gBattleStruct->mega.playerSelect ^= 1; + SetMegaTriggerSpritePal(gBattleStruct->mega.triggerSpriteId, gBattleStruct->mega.playerSelect); PlaySE(SE_SELECT); } } @@ -2646,9 +2646,9 @@ static void PlayerHandleChooseMove(void) else { InitMoveSelectionsVarsAndStrings(); - gBattleStruct->playerMegaEvoSelect = FALSE; + gBattleStruct->mega.playerSelect = FALSE; if (!IsMegaTriggerSpriteActive()) - gBattleStruct->megaEvoTriggerSpriteId = 0xFF; + gBattleStruct->mega.triggerSpriteId = 0xFF; if (CanMegaEvolve(gActiveBattler)) CreateMegaTriggerSprite(gActiveBattler, 0); gBattlerControllerFuncs[gActiveBattler] = HandleChooseMoveAfterDma3; diff --git a/src/battle_interface.c b/src/battle_interface.c index 3506e63826..d8b103762f 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -1561,16 +1561,16 @@ void CreateMegaTriggerSprite(u8 battlerId, u8 palId) { if (GetSpriteTileStartByTag(TAG_MEGA_TRIGGER_TILE) == 0xFFFF) LoadSpriteSheet(&sSpriteSheet_MegaTrigger); - if (gBattleStruct->megaEvoTriggerSpriteId == 0xFF) + if (gBattleStruct->mega.triggerSpriteId == 0xFF) { - gBattleStruct->megaEvoTriggerSpriteId = CreateSprite(&sSpriteTemplate_MegaTrigger, + gBattleStruct->mega.triggerSpriteId = CreateSprite(&sSpriteTemplate_MegaTrigger, gSprites[gHealthboxSpriteIds[battlerId]].pos1.x, gSprites[gHealthboxSpriteIds[battlerId]].pos1.y - MEGA_TRIGGER_POS_Y_DIFF, 0); } - gSprites[gBattleStruct->megaEvoTriggerSpriteId].tBattler = battlerId; - gSprites[gBattleStruct->megaEvoTriggerSpriteId].tHide = FALSE; + gSprites[gBattleStruct->mega.triggerSpriteId].tBattler = battlerId; + gSprites[gBattleStruct->mega.triggerSpriteId].tHide = FALSE; - SetMegaTriggerSpritePal(gBattleStruct->megaEvoTriggerSpriteId, palId); + SetMegaTriggerSpritePal(gBattleStruct->mega.triggerSpriteId, palId); } static void SpriteCb_MegaTrigger(struct Sprite *sprite) @@ -1612,7 +1612,7 @@ bool32 IsMegaTriggerSpriteActive(void) void HideMegaTriggerSprite(void) { - gSprites[gBattleStruct->megaEvoTriggerSpriteId].tHide = TRUE; + gSprites[gBattleStruct->mega.triggerSpriteId].tHide = TRUE; } void DestroyMegaTriggerSprite(void) @@ -1620,9 +1620,9 @@ void DestroyMegaTriggerSprite(void) FreeSpritePaletteByTag(TAG_MEGA_TRIGGER_OFF_PAL); FreeSpritePaletteByTag(TAG_MEGA_TRIGGER_ON_PAL); FreeSpriteTilesByTag(TAG_MEGA_TRIGGER_TILE); - if (gBattleStruct->megaEvoTriggerSpriteId != 0xFF) - DestroySprite(&gSprites[gBattleStruct->megaEvoTriggerSpriteId]); - gBattleStruct->megaEvoTriggerSpriteId = 0xFF; + if (gBattleStruct->mega.triggerSpriteId != 0xFF) + DestroySprite(&gSprites[gBattleStruct->mega.triggerSpriteId]); + gBattleStruct->mega.triggerSpriteId = 0xFF; } #undef tBattler diff --git a/src/battle_main.c b/src/battle_main.c index f01d1b52bc..98e28ec1d7 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3099,9 +3099,9 @@ static void BattleStartClearSetData(void) gBattleStruct->field_2A0 = 0; gBattleStruct->field_2A1 = 0; - gBattleStruct->megaEvoTriggerSpriteId = 0xFF; + gBattleStruct->mega.triggerSpriteId = 0xFF; for (i = 0; i < MAX_BATTLERS_COUNT; i++) - gBattleStruct->megaEvoIndicatorSpriteId[i] = 0xFF; + gBattleStruct->mega.indicatorSpriteIds[i] = 0xFF; } void SwitchInClearSetData(void) @@ -4339,7 +4339,7 @@ static void HandleTurnActionSelectionState(void) RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))), 3); } - gBattleStruct->toMegaEvolve &= ~(gBitTable[BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))]); + gBattleStruct->mega.toEvolve &= ~(gBitTable[BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))]); BtlController_EmitEndBounceEffect(0); MarkBattlerForControllerExec(gActiveBattler); return; @@ -4429,7 +4429,7 @@ static void HandleTurnActionSelectionState(void) gChosenMoveByBattler[gActiveBattler] = gBattleMons[gActiveBattler].moves[*(gBattleStruct->chosenMovePositions + gActiveBattler)]; *(gBattleStruct->moveTarget + gActiveBattler) = gBattleBufferB[gActiveBattler][3]; if (gBattleBufferB[gActiveBattler][2] & RET_MEGA_EVOLUTION) - gBattleStruct->toMegaEvolve |= gBitTable[gActiveBattler]; + gBattleStruct->mega.toEvolve |= gBitTable[gActiveBattler]; gBattleCommunication[gActiveBattler]++; } break; @@ -4856,7 +4856,7 @@ static void SetActionsAndBattlersTurnOrder(void) } } gBattleMainFunc = CheckMegaEvolutionBeforeTurn; - gBattleStruct->megaEvoBattlerId = 0; + gBattleStruct->mega.battlerId = 0; return; } else @@ -4898,7 +4898,7 @@ static void SetActionsAndBattlersTurnOrder(void) } } gBattleMainFunc = CheckMegaEvolutionBeforeTurn; - gBattleStruct->megaEvoBattlerId = 0; + gBattleStruct->mega.battlerId = 0; } static void TurnValuesCleanUp(bool8 var0) @@ -4954,14 +4954,14 @@ static void CheckMegaEvolutionBeforeTurn(void) { if (!(gHitMarker & HITMARKER_RUN)) { - while (gBattleStruct->megaEvoBattlerId < gBattlersCount) + while (gBattleStruct->mega.battlerId < gBattlersCount) { - gActiveBattler = gBattlerAttacker = gBattleStruct->megaEvoBattlerId; - gBattleStruct->megaEvoBattlerId++; - if (gBattleStruct->toMegaEvolve & gBitTable[gActiveBattler] + gActiveBattler = gBattlerAttacker = gBattleStruct->mega.battlerId; + gBattleStruct->mega.battlerId++; + if (gBattleStruct->mega.toEvolve & gBitTable[gActiveBattler] && !(gProtectStructs[gActiveBattler].noValidMoves)) { - gBattleStruct->toMegaEvolve &= ~(gBitTable[gActiveBattler]); + gBattleStruct->mega.toEvolve &= ~(gBitTable[gActiveBattler]); gLastUsedItem = gBattleMons[gActiveBattler].item; BattleScriptExecute(BattleScript_MegaEvolution); return; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 4db5eb4b1c..68fe31bbcd 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6595,14 +6595,14 @@ static void atk76_various(void) else mon = &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]; - gBattleStruct->speciesThatMegaEvolved[gActiveBattler] = gBattleMons[gActiveBattler].species; + 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->playerSpeciesThatMegaEvolved = gBattleStruct->speciesThatMegaEvolved[gActiveBattler]; + gBattleStruct->mega.playerEvolvedSpecies = gBattleStruct->mega.evolvedSpecies[gActiveBattler]; } - gBattleMons[gActiveBattler].species = GetMegaEvolutionSpecies(gBattleStruct->speciesThatMegaEvolved[gActiveBattler], gBattleMons[gActiveBattler].item); + gBattleMons[gActiveBattler].species = GetMegaEvolutionSpecies(gBattleStruct->mega.evolvedSpecies[gActiveBattler], gBattleMons[gActiveBattler].item); SetMonData(mon, MON_DATA_SPECIES, &gBattleMons[gActiveBattler].species); PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gActiveBattler].species); @@ -6620,8 +6620,8 @@ static void atk76_various(void) gBattleMons[gActiveBattler].type2 = gBaseStats[gBattleMons[gActiveBattler].species].type2; UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], mon, HEALTHBOX_ALL); - gBattleStruct->alreadyMegaEvolved[GetBattlerPosition(gActiveBattler)] = TRUE; - gBattleStruct->megaEvolvedPartyIds[GetBattlerSide(gActiveBattler)] |= gBitTable[gBattlerPartyIndexes[gActiveBattler]]; + gBattleStruct->mega.alreadyEvolved[GetBattlerPosition(gActiveBattler)] = TRUE; + gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(gActiveBattler)] |= gBitTable[gBattlerPartyIndexes[gActiveBattler]]; BtlController_EmitSetMonData(0, REQUEST_ALL_BATTLE, gBitTable[gBattlerPartyIndexes[gActiveBattler]], sizeof(struct BattlePokemon), &gBattleMons[gActiveBattler]); MarkBattlerForControllerExec(gActiveBattler); diff --git a/src/battle_util.c b/src/battle_util.c index 549f16bac9..ffa409d7f3 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5607,12 +5607,12 @@ bool32 CanMegaEvolve(u8 battlerId) u8 partnerPosition = GetBattlerPosition(BATTLE_PARTNER(battlerId)); // Check if trainer already mega evolved a pokemon. - if (gBattleStruct->alreadyMegaEvolved[battlerPosition]) + if (gBattleStruct->mega.alreadyEvolved[battlerPosition]) return FALSE; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { if (IsPartnerMonFromSameTrainer(battlerId) - && (gBattleStruct->alreadyMegaEvolved[partnerPosition] || (gBattleStruct->toMegaEvolve & gBitTable[BATTLE_PARTNER(battlerId)]))) + && (gBattleStruct->mega.alreadyEvolved[partnerPosition] || (gBattleStruct->mega.toEvolve & gBitTable[BATTLE_PARTNER(battlerId)]))) return FALSE; } @@ -5641,10 +5641,10 @@ bool32 CanMegaEvolve(u8 battlerId) void UndoMegaEvolution(u8 monId) { - if (gBattleStruct->megaEvolvedPartyIds[B_SIDE_PLAYER] & gBitTable[monId]) + if (gBattleStruct->mega.evolvedPartyIds[B_SIDE_PLAYER] & gBitTable[monId]) { - gBattleStruct->megaEvolvedPartyIds[B_SIDE_PLAYER] &= ~(gBitTable[monId]); - SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleStruct->playerSpeciesThatMegaEvolved); + gBattleStruct->mega.evolvedPartyIds[B_SIDE_PLAYER] &= ~(gBitTable[monId]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleStruct->mega.playerEvolvedSpecies); CalculateMonStats(&gPlayerParty[monId]); } } From 0755240fbc3379d12f50ad955632e0abd5fddeec Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 20 Sep 2018 17:59:17 +0200 Subject: [PATCH 120/667] link battles mega evo fix hopefully????? --- include/battle_controllers.h | 1 + src/battle_main.c | 1 + src/battle_util.c | 5 +++-- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 50e37c917c..cdc1adf79e 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -113,6 +113,7 @@ struct ChooseMoveStruct u16 species; u8 monType1; u8 monType2; + struct MegaEvolutionData mega; }; enum diff --git a/src/battle_main.c b/src/battle_main.c index 98e28ec1d7..165fa79115 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4224,6 +4224,7 @@ 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; diff --git a/src/battle_util.c b/src/battle_util.c index ffa409d7f3..1b90f8cd2c 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5605,14 +5605,15 @@ bool32 CanMegaEvolve(u8 battlerId) struct Pokemon *mon; u8 battlerPosition = GetBattlerPosition(battlerId); u8 partnerPosition = GetBattlerPosition(BATTLE_PARTNER(battlerId)); + struct MegaEvolutionData *mega = &(((struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBattler][4]))->mega); // Check if trainer already mega evolved a pokemon. - if (gBattleStruct->mega.alreadyEvolved[battlerPosition]) + if (mega->alreadyEvolved[battlerPosition]) return FALSE; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { if (IsPartnerMonFromSameTrainer(battlerId) - && (gBattleStruct->mega.alreadyEvolved[partnerPosition] || (gBattleStruct->mega.toEvolve & gBitTable[BATTLE_PARTNER(battlerId)]))) + && (mega->alreadyEvolved[partnerPosition] || (mega->toEvolve & gBitTable[BATTLE_PARTNER(battlerId)]))) return FALSE; } From d05875dd04003ebf291d1b9b96d580cde8503b1d Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 20 Sep 2018 20:59:00 +0200 Subject: [PATCH 121/667] New mega trigger sprite --- graphics/battle_interface/mega_trigger.pal | 19 ++ graphics/battle_interface/mega_trigger.png | Bin 1005 -> 3454 bytes .../battle_interface/mega_trigger_off.pal | 259 ------------------ graphics/battle_interface/mega_trigger_on.pal | 259 ------------------ include/battle_interface.h | 5 +- src/battle_controller_player.c | 2 +- src/battle_interface.c | 131 +++++---- 7 files changed, 105 insertions(+), 570 deletions(-) create mode 100644 graphics/battle_interface/mega_trigger.pal delete mode 100644 graphics/battle_interface/mega_trigger_off.pal delete mode 100644 graphics/battle_interface/mega_trigger_on.pal 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 index b189e6529db4348808636d4c8cf24a8dda9fc6fb..a269ee738cd1905d9caba94efc346bf6a44e7be2 100644 GIT binary patch delta 3445 zcmV-*4T|#Z2mTt67k@wm0{{R3iJ)km000Z%dQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)I zW&i+q+Rd10lHAG-g#Xtmd<52ts^ioe;T!n){s6M4N1BoJp2Lo?IyCI&QVWooNYL$n z{qwkg@GoY$T*^{QE9K%}YN>_JmwMg*?xVkw{k4DLxy0`u&VRe~x)3-OImY{E+0Xr* z^ZEUNJP-Ks<9R3Z8K*u2Jr`aBMx9xg@!VIRfnvDN`{%c7&vQL}+RpQTtmj<54?q7- zLNHclyck^A(Z`FwHcMm$vBu7^@t5D>b;ieJ=kxcmbM+U&`}p=#?5_Ttk3WXOUFEr< z{1l_-ywBgq&VM5Gc}4y`^A8u+e1-RG?9N&BoPF=Er$VHPdp7mjihbk8K`5g=R`>}2 zGvCENjZbBZlZ-8<8+@ko%?F}=eDce8fBd%N^pho~u!C?6VTNeuYLw8zw4@~c_!ET0 zEJsE{oMbI>I()3f+q})@o4zvh^4u9bgL$6#@^Rmt{C`hA9|N7EvGx9{cbuvvI4GuB zhGtIxau*5l=ZR^y_}a&P!p-$5v5^dB3v*?I{TlZWBl|bDqUAYqU%ryNZfba0&j5so zxigFLkqlhL$Lx#0Bn0uEI9Br0S$T*l3^L$z4$HekZelDXrv{yyXT;mRA&2`k(n2C~ zEKx`e)PEsaDP`~@se+-NV@@vTT(abvTka*6RB|arifUAsC`qyu5vkIo*H}}{wN$CK zw%S{05edt!G;yuA)_P~s&d{BwJ9qRx!iXb{Jj#$!M;mf3LiwA0SJY}s|U-49qh@uZVaIdbZ0r+6!V{>hqVEZKeX z&KjphUPE}5ldL%-VnzdlwGZ3a z9hl8C^1d)dsiE;Td~K*?NT(#J$fR zd9mABYqa~%(XHJNkD?RFStqx7KeSt3(SLVvQ2Shc3?x6M1FR|&qttt@!%dr&E;j~i zWWTnPEvt+b!XPBI`(9;no#Y*{Y1(4b%mW^DKLT3YA~SIWm)5ElUpDM(_9<&M|HaXR zg^QT(>32SR57}qx>V0w1R}0sY5G`Dn28;~9LiVeGy~9<;l;-rIXak&4EXgA*;eXq; z*>r&|r_5n7lfFlXES13kblysVeX7Vz*-?MEl@U@t)TO%YA%McP3-}ao;mo*kzBuSiX^^Ry|IeU^jFj4Yxz~k6MC4v^>LWpq&0;N{LHh5~u>J;@bNS>BR z_ApaC`{o~@ghXg|$s6vTRzWMvg5D-5)LjSwLQ7NxWdyQ+MHdC_MO61aQ-4#raa|*+ zU#q~Jb|5a7tBOj8D`O8JR*dUoIf54-+TS*x}Jf(5w(Nl4QXxoKYqoZlAc zUM*ap!3{Px*z)pX!RGq7W7dX2X^{>XSZCMgYFb^8Uln1*5-g+%;uHReWD;hJJqDLC zfQN$CyDr&GQGd$30a$LXu!6>J$8e`Fk%wiTfWJBBKXa_SIhI}=OJj1= zLoX+ys&YJ$f+5X>bixnnjuKNkR)nU-50IZaAv@PlfWm&mHhC?IKtuK;nMdzXUK!gi z@YT!O#U21q6~$1w@+t_orUu!pm!Pfg#$GzN;xQ6ii@-<{kBkF5(0@qMu0W6v)7uRf@tB;lr~W z%PLtDBS!^9MPouyQGeiRmU@OX$Sf$uXCaA{?o;~NN1;RKfLh0=2Fh`zr?~?7ZM$NH zD4l2**D8rq1-=wpi29wKutq65*U+@KGuB}~b}jBQWyay7M5;zSOiEQGZKegpd1!EZ z>sX?wtk9}iY)f~=P(HY01w#p;^&)|zJgLxg46Pe)_JvRElYjGO-+I{RUM22Zd_b|h znp7huMb3bD^PeT*#>Tm{tzsXJ)%;dXe?CeZN0+HPtocJrM-ioHK`ubU-2Zsgi_a((R?YVDJ!c1i+_7=U}3n^sjGuN3J*1hivS7| zNExHJUT3D|!2LHGs$N%;a@+sGd_Ob--yB1GnFRN1d29<7QIx4aY!J=P82|bd0!3*- zoz;ip*{^ciVK8Sg&Ct5Zd-wP#Ti ze$0et`oxS{g`QaVP;a26DNOW#0j})I*vJ4f4rS@@01nBcydipfnc#I*Z!fel^di;D zr_ujX!iWNWwWz(!Fb^t^6+mGXejtTIT7+AlQG~1046@;)3 zfg_U918lEBf-hDGYis6vaeg*g%fNJRG=C)&-P#2@Aw4ZB(LNJNqU~Dydifcm_v+8< z%WP&U4_y^~wpVLC=pc0`T6NfG?klcLTc(@Wip3Hc$f6+Xk>fHGAJ?=vL`-hQ;SCSk zo!2)4TPUF8ekY*)b~Lw-Mpx~*`z&l{tke(^_)MSxKe?&e25GAWF0>c1=wG^O?SHWp zaKCVhEBTFtM>R@N&Ej>}=>hv0@cS;T?SQd6(tJlVa}aEE%O6JbsNH=lrtA4LoN+{7 z0bT#}_GIf@zqfs4kgt7I>4F51(cy!>YWRjB`uaekYsQhB%oY#T($`|u@A;Ff>XOzZ zfun+v)>lbt&0ej1Ak)4(Pj)GDOMkNr=jzO24!_j!Jh6!9+-Nd zLl><&N}kkfqH@5WZEenlJu6+`XEbQ7V(%Juy{Xv-S!XAkMa_ft?#L9Kdw*h2ziHI( zKHdG;s8f4$+7WdUXnntQxzY}(J+*$lrL*UsUJ<$P{3d+>?iUs`Qs?muJBHLSuNjX) zmz=K_s7_2A>$Man>ij9VQC)|ELW3MWRb)c0HeS`apvd-Tn8Wh5!HmnO8&U>3xC!-<6a1!_UckmxllV00000c4Rt)00001VoOIv0Eh)0 zNRurC7=H(JNliru;t3QG4h6UT$l(A00O(0XK~y-)?UFeT!Y~j;!vT=;#bTCB!4VKO z1uYUqBvNt&id56!f+J9-r^+2DQc)pcA+QjaA#8~!907heU(X)PdY<=69iB)XS!K4d zD2&pQ0Gk-_%M;3K?G`l)%dsdJ#7 z-0=Vai(<_hnQKz!X+D8FdXkyv)>mJBeSFc=Vs>@WjIU4MUGiCQ db^HIoxT#xNrKeRo^#Gm6;OXk;vd$@?2>_%CYis}j diff --git a/graphics/battle_interface/mega_trigger_off.pal b/graphics/battle_interface/mega_trigger_off.pal deleted file mode 100644 index 643b1c3f44..0000000000 --- a/graphics/battle_interface/mega_trigger_off.pal +++ /dev/null @@ -1,259 +0,0 @@ -JASC-PAL -0100 -256 -152 184 136 -112 136 120 -80 104 96 -32 32 32 -160 160 160 -80 80 80 -48 48 48 -176 176 176 -160 160 160 -200 200 200 -184 184 184 -216 216 216 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -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_interface/mega_trigger_on.pal b/graphics/battle_interface/mega_trigger_on.pal deleted file mode 100644 index b3239a17e0..0000000000 --- a/graphics/battle_interface/mega_trigger_on.pal +++ /dev/null @@ -1,259 +0,0 @@ -JASC-PAL -0100 -256 -152 184 136 -120 144 128 -80 104 96 -32 56 0 -240 160 128 -152 80 144 -56 80 64 -216 176 208 -136 184 224 -184 224 240 -184 208 104 -232 232 104 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -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/include/battle_interface.h b/include/battle_interface.h index cbd0bc3c6d..308ab3bdf5 100644 --- a/include/battle_interface.h +++ b/include/battle_interface.h @@ -46,8 +46,7 @@ enum #define TAG_STATUS_SUMMARY_BAR_PAL 0xD710 #define TAG_STATUS_SUMMARY_BALLS_PAL 0xD712 -#define TAG_MEGA_TRIGGER_OFF_PAL 0xD777 -#define TAG_MEGA_TRIGGER_ON_PAL 0xD778 +#define TAG_MEGA_TRIGGER_PAL 0xD777 enum { @@ -76,7 +75,7 @@ void UpdateOamPriorityInAllHealthboxes(u8 priority); void InitBattlerHealthboxCoords(u8 battler); void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent); void SwapHpBarsWithHpText(void); -void SetMegaTriggerSpritePal(u8 spriteId, u8 palId); +void ChangeMegaTriggerSprite(u8 spriteId, u8 animId); void CreateMegaTriggerSprite(u8 battlerId, u8 palId); bool32 IsMegaTriggerSpriteActive(void); void HideMegaTriggerSprite(void); diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 23a01616e5..e4083f567e 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -644,7 +644,7 @@ static void HandleInputChooseMove(void) if (CanMegaEvolve(gActiveBattler)) { gBattleStruct->mega.playerSelect ^= 1; - SetMegaTriggerSpritePal(gBattleStruct->mega.triggerSpriteId, gBattleStruct->mega.playerSelect); + ChangeMegaTriggerSprite(gBattleStruct->mega.triggerSpriteId, gBattleStruct->mega.playerSelect); PlaySE(SE_SELECT); } } diff --git a/src/battle_interface.c b/src/battle_interface.c index d8b103762f..36e0d6aaae 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -561,20 +561,15 @@ 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 sMegaTriggerOnPal[] = INCBIN_U16("graphics/battle_interface/mega_trigger_on.gbapal"); -static const u16 sMegaTriggerOffPal[] = INCBIN_U16("graphics/battle_interface/mega_trigger_off.gbapal"); +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_MegaTriggerOn = +static const struct SpritePalette sSpritePalette_MegaTrigger = { - sMegaTriggerOnPal, TAG_MEGA_TRIGGER_ON_PAL -}; -static const struct SpritePalette sSpritePalette_MegaTriggerOff = -{ - sMegaTriggerOffPal, TAG_MEGA_TRIGGER_OFF_PAL + sMegaTriggerPal, TAG_MEGA_TRIGGER_PAL }; static const struct OamData sOamData_MegaTrigger = @@ -589,17 +584,35 @@ static const struct OamData sOamData_MegaTrigger = .matrixNum = 0, .size = 2, .tileNum = 0, - .priority = 3, + .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_ON_PAL, + .paletteTag = TAG_MEGA_TRIGGER_PAL, .oam = &sOamData_MegaTrigger, - .anims = gDummySpriteAnimTable, + .anims = sSpriteAnimTable_MegaTrigger, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCb_MegaTrigger @@ -1532,71 +1545,93 @@ void SwapHpBarsWithHpText(void) } // Mega Evolution gfx functions. -void SetMegaTriggerSpritePal(u8 spriteId, u8 palId) +void ChangeMegaTriggerSprite(u8 spriteId, u8 animId) { - switch (palId) - { - case 0: // off - FreeSpritePaletteByTag(TAG_MEGA_TRIGGER_ON_PAL); - LoadSpritePalette(&sSpritePalette_MegaTriggerOff); - if (spriteId != 0xFF) - gSprites[spriteId].oam.paletteNum = IndexOfSpritePaletteTag(TAG_MEGA_TRIGGER_OFF_PAL); - break; - case 1: // on - FreeSpritePaletteByTag(TAG_MEGA_TRIGGER_OFF_PAL); - LoadSpritePalette(&sSpritePalette_MegaTriggerOn); - if (spriteId != 0xFF) - gSprites[spriteId].oam.paletteNum = IndexOfSpritePaletteTag(TAG_MEGA_TRIGGER_ON_PAL); - break; - } + StartSpriteAnim(&gSprites[spriteId], animId); } -#define MEGA_TRIGGER_POS_X_DIFF 19 -#define MEGA_TRIGGER_POS_Y_DIFF 1 +#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) { - gBattleStruct->mega.triggerSpriteId = CreateSprite(&sSpriteTemplate_MegaTrigger, - gSprites[gHealthboxSpriteIds[battlerId]].pos1.x, - gSprites[gHealthboxSpriteIds[battlerId]].pos1.y - MEGA_TRIGGER_POS_Y_DIFF, 0); + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + 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); + else + 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); } gSprites[gBattleStruct->mega.triggerSpriteId].tBattler = battlerId; gSprites[gBattleStruct->mega.triggerSpriteId].tHide = FALSE; - SetMegaTriggerSpritePal(gBattleStruct->mega.triggerSpriteId, palId); + 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 + MEGA_TRIGGER_POS_X_DIFF) + if (sprite->pos1.x != gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos1.x - xSlide) sprite->pos1.x++; - if (sprite->pos2.x != gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos2.x + MEGA_TRIGGER_POS_X_DIFF) - sprite->pos2.x++; - sprite->pos1.y = gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos1.y - MEGA_TRIGGER_POS_Y_DIFF; - sprite->pos2.y = gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos2.y - MEGA_TRIGGER_POS_Y_DIFF; - if (sprite->pos1.x == gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos1.x + MEGA_TRIGGER_POS_X_DIFF - && sprite->pos2.x == gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos2.x + MEGA_TRIGGER_POS_X_DIFF) + if (sprite->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 - MEGA_TRIGGER_POS_X_DIFF) + if (sprite->pos1.x != gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos1.x - xOptimal) sprite->pos1.x--; - if (sprite->pos2.x != gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos2.x - MEGA_TRIGGER_POS_X_DIFF) - sprite->pos2.x--; - sprite->pos1.y = gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos1.y - MEGA_TRIGGER_POS_Y_DIFF; - sprite->pos2.y = gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos2.y - MEGA_TRIGGER_POS_Y_DIFF; + if (sprite->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; } } @@ -1604,7 +1639,7 @@ bool32 IsMegaTriggerSpriteActive(void) { if (GetSpriteTileStartByTag(TAG_MEGA_TRIGGER_TILE) == 0xFFFF) return FALSE; - else if (IndexOfSpritePaletteTag(TAG_MEGA_TRIGGER_OFF_PAL) != 0xFF || IndexOfSpritePaletteTag(TAG_MEGA_TRIGGER_ON_PAL) != 0xFF) + else if (IndexOfSpritePaletteTag(TAG_MEGA_TRIGGER_PAL) != 0xFF) return TRUE; else return FALSE; @@ -1612,13 +1647,13 @@ bool32 IsMegaTriggerSpriteActive(void) void HideMegaTriggerSprite(void) { + ChangeMegaTriggerSprite(gBattleStruct->mega.triggerSpriteId, 0); gSprites[gBattleStruct->mega.triggerSpriteId].tHide = TRUE; } void DestroyMegaTriggerSprite(void) { - FreeSpritePaletteByTag(TAG_MEGA_TRIGGER_OFF_PAL); - FreeSpritePaletteByTag(TAG_MEGA_TRIGGER_ON_PAL); + FreeSpritePaletteByTag(TAG_MEGA_TRIGGER_PAL); FreeSpriteTilesByTag(TAG_MEGA_TRIGGER_TILE); if (gBattleStruct->mega.triggerSpriteId != 0xFF) DestroySprite(&gSprites[gBattleStruct->mega.triggerSpriteId]); From 7b60a654b259748b4f5773731f223bf4d3ff5f25 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 22 Sep 2018 01:01:13 +0200 Subject: [PATCH 122/667] Growth gen6 effect --- data/battle_ai_scripts.s | 1 + data/battle_scripts_1.s | 44 ++++++++++++++++++++++--- include/constants/battle_move_effects.h | 1 + src/battle_interface.c | 12 +++---- src/data/battle_moves.h | 2 +- 5 files changed, 49 insertions(+), 11 deletions(-) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 5c8262260c..e852ae8386 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -234,6 +234,7 @@ AI_CheckBadMove_CheckEffect: @ 82DC045 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 end AI_CBM_AtkAccUp: diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 4d74c2d17f..a3cead061b 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -298,6 +298,42 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectScald .4byte BattleScript_EffectReflectType .4byte BattleScript_EffectSoak + .4byte BattleScript_EffectGrowth + +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 | 0x1, 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 | 0x1, BattleScript_GrowthEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_GrowthEnd + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_GrowthEnd: + goto BattleScript_MoveEnd BattleScript_EffectSoak: attackcanceler @@ -426,13 +462,13 @@ BattleScript_AttackSpAttackUpDoMoveAnim:: attackanimation waitanimation setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_SPATK | BIT_SPDEF, 0x0 + playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_SPATK, 0x0 setstatchanger STAT_ATK, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | 0x1, BattleScript_AttackSpAttackUpTrySpDef - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_AttackSpAttackUpTrySpDef + statbuffchange MOVE_EFFECT_AFFECTS_USER | 0x1, BattleScript_AttackSpAttackUpTrySpAtk + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_AttackSpAttackUpTrySpAtk printfromtable gStatUpStringIds waitmessage 0x40 -BattleScript_AttackSpAttackUpTrySpDef:: +BattleScript_AttackSpAttackUpTrySpAtk:: setstatchanger STAT_SPATK, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | 0x1, BattleScript_AttackSpAttackUpEnd jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_AttackSpAttackUpEnd diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 37f97c9a7b..7394a34043 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -287,5 +287,6 @@ #define EFFECT_SCALD 281 #define EFFECT_REFLECT_TYPE 282 #define EFFECT_SOAK 283 +#define EFFECT_GROWTH 284 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/src/battle_interface.c b/src/battle_interface.c index 36e0d6aaae..a58ea00fe7 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -1571,13 +1571,13 @@ void CreateMegaTriggerSprite(u8 battlerId, u8 palId) if (gBattleStruct->mega.triggerSpriteId == 0xFF) { if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - 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); - else 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; @@ -1610,7 +1610,7 @@ static void SpriteCb_MegaTrigger(struct Sprite *sprite) if (sprite->pos1.x != gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos1.x - xSlide) sprite->pos1.x++; - if (sprite->pos1.x >= xPriority) + if (sprite->pos1.x >= gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos1.x - xPriority) sprite->oam.priority = 2; else sprite->oam.priority = 1; @@ -1625,7 +1625,7 @@ static void SpriteCb_MegaTrigger(struct Sprite *sprite) if (sprite->pos1.x != gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos1.x - xOptimal) sprite->pos1.x--; - if (sprite->pos1.x >= xPriority) + if (sprite->pos1.x >= gSprites[gHealthboxSpriteIds[sprite->tBattler]].pos1.x - xPriority) sprite->oam.priority = 2; else sprite->oam.priority = 1; diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index c21f1b546b..2f2c932452 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -892,7 +892,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_GROWTH - .effect = EFFECT_SPECIAL_ATTACK_UP, + .effect = EFFECT_GROWTH, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, From 23a06c08369d8a4dbcb1e5f5b10a7d6c404d3e35 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 22 Sep 2018 01:12:27 +0200 Subject: [PATCH 123/667] Close combat effect --- data/battle_scripts_1.s | 36 ++++++++++++++++++++----- include/battle_scripts.h | 1 + include/constants/battle.h | 2 +- include/constants/battle_move_effects.h | 1 + src/battle_script_commands.c | 4 +++ src/data/battle_moves.h | 2 +- 6 files changed, 38 insertions(+), 8 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index a3cead061b..d57063bd95 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -299,6 +299,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectReflectType .4byte BattleScript_EffectSoak .4byte BattleScript_EffectGrowth + .4byte BattleScript_EffectCloseCombat BattleScript_EffectGrowth: attackcanceler @@ -3181,6 +3182,10 @@ BattleScript_EffectIngrain: BattleScript_EffectSuperpower: setmoveeffect MOVE_EFFECT_ATK_DEF_DOWN | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN goto BattleScript_EffectHit + +BattleScript_EffectCloseCombat: + setmoveeffect MOVE_EFFECT_DEF_SPDEF_DOWN | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN + goto BattleScript_EffectHit BattleScript_EffectMagicCoat: attackcanceler @@ -4554,18 +4559,37 @@ BattleScript_AtkDefDown:: playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_ATK, ATK48_DONT_CHECK_LOWER | ATK48_STAT_NEGATIVE | ATK48_ONLY_MULTIPLE playstatchangeanimation BS_ATTACKER, BIT_ATK, ATK48_DONT_CHECK_LOWER | ATK48_STAT_NEGATIVE setstatchanger STAT_ATK, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | 0x1, BattleScript_82DB144 - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_82DB144 + statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | 0x1, BattleScript_AtkDefDownTryDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_AtkDefDownTryDef printfromtable gStatDownStringIds waitmessage 0x40 -BattleScript_82DB144:: +BattleScript_AtkDefDownTryDef:: playstatchangeanimation BS_ATTACKER, BIT_DEF, ATK48_DONT_CHECK_LOWER | ATK48_STAT_NEGATIVE setstatchanger STAT_DEF, 1, TRUE - statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | 0x1, BattleScript_82DB167 - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_82DB167 + statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | 0x1, BattleScript_AtkDefDownRet + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_AtkDefDownRet printfromtable gStatDownStringIds waitmessage 0x40 -BattleScript_82DB167:: +BattleScript_AtkDefDownRet:: + return + +BattleScript_DefSpDefDown:: + setbyte sSTAT_ANIM_PLAYED, FALSE + playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF, ATK48_DONT_CHECK_LOWER | ATK48_STAT_NEGATIVE | ATK48_ONLY_MULTIPLE + playstatchangeanimation BS_ATTACKER, BIT_DEF, ATK48_DONT_CHECK_LOWER | ATK48_STAT_NEGATIVE + setstatchanger STAT_DEF, 1, TRUE + statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | 0x1, BattleScript_DefSpDefDownTrySpDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_DefSpDefDownTrySpDef + printfromtable gStatDownStringIds + waitmessage 0x40 +BattleScript_DefSpDefDownTrySpDef:: + playstatchangeanimation BS_ATTACKER, BIT_SPDEF, ATK48_DONT_CHECK_LOWER | ATK48_STAT_NEGATIVE + setstatchanger STAT_SPDEF, 1, TRUE + statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | 0x1, BattleScript_DefSpDefDownRet + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_DefSpDefDownRet + printfromtable gStatDownStringIds + waitmessage 0x40 +BattleScript_DefSpDefDownRet:: return BattleScript_KnockedOff:: diff --git a/include/battle_scripts.h b/include/battle_scripts.h index f897158e85..f1c80da4bd 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -86,6 +86,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_SelectingImprisionedMove[]; diff --git a/include/constants/battle.h b/include/constants/battle.h index 3a15ba5ef1..6eb81e0ef4 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -309,7 +309,7 @@ #define MOVE_EFFECT_EVS_MINUS_2 0x34 #define MOVE_EFFECT_THRASH 0x35 #define MOVE_EFFECT_KNOCK_OFF 0x36 -#define MOVE_EFFECT_NOTHING_37 0x37 +#define MOVE_EFFECT_DEF_SPDEF_DOWN 0x37 #define MOVE_EFFECT_NOTHING_38 0x38 #define MOVE_EFFECT_NOTHING_39 0x39 #define MOVE_EFFECT_NOTHING_3A 0x3A diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 7394a34043..3ebf8f6a3b 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -288,5 +288,6 @@ #define EFFECT_REFLECT_TYPE 282 #define EFFECT_SOAK 283 #define EFFECT_GROWTH 284 +#define EFFECT_CLOSE_COMBAT 285 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c92d4f156c..5fa738f08e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2594,6 +2594,10 @@ void SetMoveEffect(bool8 primary, u8 certain) BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_AtkDefDown; break; + case MOVE_EFFECT_DEF_SPDEF_DOWN: // Close Combat + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_DefSpDefDown; + break; case MOVE_EFFECT_RECOIL_33: // Double Edge gBattleMoveDamage = gHpDealt / 3; if (gBattleMoveDamage == 0) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 2f2c932452..569539f5c2 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -4444,7 +4444,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_CLOSE_COMBAT - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_CLOSE_COMBAT, .power = 120, .type = TYPE_FIGHTING, .accuracy = 100, From 1284bb94f1d08aa9bbecabef6f2936cb1ef3b101 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 22 Sep 2018 10:45:43 +0200 Subject: [PATCH 124/667] Last Resort, Fangs and Flare Blitz/Volt Tackle --- asm/macros/battle_script.inc | 9 +++ data/battle_scripts_1.s | 53 ++++++++++++++++- include/battle.h | 2 + include/battle_scripts.h | 2 + include/constants/battle.h | 2 +- include/constants/battle_move_effects.h | 3 + include/constants/battle_script_commands.h | 3 + src/battle_script_commands.c | 68 +++++++++++++++++++++- src/data/battle_moves.h | 19 +++--- 9 files changed, 148 insertions(+), 13 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index cdec01dbd8..69f382046f 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1477,6 +1477,15 @@ various \battler, VARIOUS_HANDLE_MEGA_EVO .endm + .macro jumpifcantuselastresort battler ptr + various \battler, VARIOUS_TRY_LAST_RESORT + .4byte \ptr + .endm + + .macro argumentstatuseffect + various BS_ATTACKER, VARIOUS_ARGUMENT_STATUS_EFFECT + .endm + @ helpful macros .macro setstatchanger stat, stages, down setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index d57063bd95..2c0abf1dcc 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -300,6 +300,17 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectSoak .4byte BattleScript_EffectGrowth .4byte BattleScript_EffectCloseCombat + .4byte BattleScript_EffectLastResort + .4byte BattleScript_EffectRecoil33WithStatus + .4byte BattleScript_EffectFlinchWithStatus + +BattleScript_EffectLastResort: + attackcanceler + attackstring + ppreduce + jumpifcantuselastresort BS_ATTACKER, BattleScript_ButItFailed + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + goto BattleScript_HitFromCritCalc BattleScript_EffectGrowth: attackcanceler @@ -1468,7 +1479,32 @@ BattleScript_EffectConversion:: 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 @@ -3348,6 +3384,10 @@ BattleScript_EffectSecretPower:: BattleScript_EffectDoubleEdge:: 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_EffectTeeterDance:: attackcanceler @@ -4563,14 +4603,14 @@ BattleScript_AtkDefDown:: jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_AtkDefDownTryDef printfromtable gStatDownStringIds waitmessage 0x40 -BattleScript_AtkDefDownTryDef:: +BattleScript_AtkDefDownTryDef: playstatchangeanimation BS_ATTACKER, BIT_DEF, ATK48_DONT_CHECK_LOWER | ATK48_STAT_NEGATIVE setstatchanger STAT_DEF, 1, TRUE statbuffchange MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN | 0x1, BattleScript_AtkDefDownRet jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_AtkDefDownRet printfromtable gStatDownStringIds waitmessage 0x40 -BattleScript_AtkDefDownRet:: +BattleScript_AtkDefDownRet: return BattleScript_DefSpDefDown:: @@ -4945,6 +4985,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 @@ -4957,6 +5000,10 @@ BattleScript_DoRecoil:: tryfaintmon BS_ATTACKER, FALSE, NULL BattleScript_RecoilEnd:: return + +BattleScript_EffectWithChance:: + seteffectwithchance + return BattleScript_ItemSteal:: playanimation BS_TARGET, B_ANIM_ITEM_STEAL, NULL diff --git a/include/battle.h b/include/battle.h index b605e352b3..85bf5937fa 100644 --- a/include/battle.h +++ b/include/battle.h @@ -179,6 +179,7 @@ struct DisableStruct u8 telekinesisTimer; u8 healBlockTimer; u8 laserFocusTimer; + u8 usedMoves:4; }; struct ProtectStruct @@ -673,6 +674,7 @@ struct BattleScripting u8 windowsType; // 0 - normal, 1 - battle arena u8 multiplayerId; bool8 monCaught; + s32 savedDmg; }; // rom_80A5C6C diff --git a/include/battle_scripts.h b/include/battle_scripts.h index f1c80da4bd..70733b41a3 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -273,5 +273,7 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle.h b/include/constants/battle.h index 6eb81e0ef4..2fedc4aa36 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -310,7 +310,7 @@ #define MOVE_EFFECT_THRASH 0x35 #define MOVE_EFFECT_KNOCK_OFF 0x36 #define MOVE_EFFECT_DEF_SPDEF_DOWN 0x37 -#define MOVE_EFFECT_NOTHING_38 0x38 +#define MOVE_EFFECT_RECOIL_33_STATUS 0x38 #define MOVE_EFFECT_NOTHING_39 0x39 #define MOVE_EFFECT_NOTHING_3A 0x3A #define MOVE_EFFECT_SP_ATK_TWO_DOWN 0x3B diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 3ebf8f6a3b..f9c550318f 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -289,5 +289,8 @@ #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 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index cdb3bae3f8..830c2a7d57 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -29,6 +29,7 @@ #define sFIELD_24 gBattleScripting + 0x24 #define sMULTIPLAYER_ID gBattleScripting + 0x25 #define sMON_CAUGHT gBattleScripting + 0x26 +#define sSAVED_DMG gBattleScripting + 0x28 #define cEFFECT_CHOOSER gBattleCommunication + 3 #define cMULTISTRING_CHOOSER gBattleCommunication + 5 @@ -100,6 +101,8 @@ #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 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 5fa738f08e..f457fdb86d 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2297,7 +2297,7 @@ void SetMoveEffect(bool8 primary, u8 certain) } 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) { @@ -2606,6 +2606,14 @@ void SetMoveEffect(bool8 primary, u8 certain) BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; 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) { @@ -2667,7 +2675,7 @@ static void atk15_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; @@ -4193,6 +4201,7 @@ static void atk49_moveend(void) gBattleScripting.atk49_state++; break; case ATK49_UPDATE_LAST_MOVES: + gDisableStructs[gBattlerAttacker].usedMoves |= gBitTable[gCurrMovePos]; if (gHitMarker & HITMARKER_SWAP_ATTACKER_TARGET) { gActiveBattler = gBattlerAttacker; @@ -6121,6 +6130,25 @@ static void HandleTerrainMove(u32 moveEffect) } } +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 (gDisableStructs[battlerId].usedMoves & gBitTable[i]) + usedMovesCount++; + } + + if (knownMovesCount >= 2 && usedMovesCount >= knownMovesCount - 1) + return TRUE; + else + return FALSE; +} + static void atk76_various(void) { struct Pokemon *mon; @@ -6630,6 +6658,41 @@ static void atk76_various(void) BtlController_EmitSetMonData(0, REQUEST_ALL_BATTLE, gBitTable[gBattlerPartyIndexes[gActiveBattler]], sizeof(struct BattlePokemon), &gBattleMons[gActiveBattler]); MarkBattlerForControllerExec(gActiveBattler); break; + 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: + gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_BURN; + break; + case STATUS1_FREEZE: + gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_FREEZE; + break; + case STATUS1_PARALYSIS: + gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_PARALYSIS; + break; + case STATUS1_POISON: + gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_POISON; + break; + case STATUS1_TOXIC_POISON: + gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_TOXIC; + break; + default: + gBattleCommunication[MOVE_EFFECT_BYTE] = 0; + break; + } + if (gBattleCommunication[MOVE_EFFECT_BYTE] != 0) + { + BattleScriptPush(gBattlescriptCurrInstr + 3); + gBattlescriptCurrInstr = BattleScript_EffectWithChance; + return; + } + break; } gBattlescriptCurrInstr += 3; @@ -7901,6 +7964,7 @@ static void atk9B_transformdataexecution(void) gDisableStructs[gBattlerAttacker].disableTimer1 = 0; gDisableStructs[gBattlerAttacker].transformedMonPersonality = gBattleMons[gBattlerTarget].personality; gDisableStructs[gBattlerAttacker].unk18_b = 0; + gDisableStructs[gBattlerAttacker].usedMoves = 0; PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerTarget].species) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 569539f5c2..6c9498ad02 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -4132,16 +4132,17 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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 | FLAG_RECKLESS_BOOST, .split = SPLIT_PHYSICAL, + .argument = STATUS1_PARALYSIS, }, { // MOVE_MAGICAL_LEAF .effect = EFFECT_HIT, @@ -4648,7 +4649,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_LAST_RESORT - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_LAST_RESORT, .power = 140, .type = TYPE_NORMAL, .accuracy = 100, @@ -4732,7 +4733,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_FLARE_BLITZ - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_RECOIL_33_STATUS, .power = 120, .type = TYPE_FIRE, .accuracy = 100, @@ -4742,6 +4743,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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, @@ -5068,7 +5070,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_THUNDER_FANG - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (10% paralyze AND 10% flinch) + .effect = EFFECT_FLINCH_STATUS, .power = 65, .type = TYPE_ELECTRIC, .accuracy = 95, @@ -5078,9 +5080,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_PLACEHOLDER, // Needs a custom move effect (10% paralyze AND 10% flinch) + .effect = EFFECT_FLINCH_STATUS, .power = 65, .type = TYPE_ICE, .accuracy = 95, @@ -5090,9 +5093,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_PLACEHOLDER, // Needs a custom move effect (10% paralyze AND 10% flinch) + .effect = EFFECT_FLINCH_STATUS, .power = 65, .type = TYPE_FIRE, .accuracy = 95, @@ -5102,6 +5106,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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, From f455f663f490fd86b1e2b96804c7e3b07c6de8a9 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 22 Sep 2018 11:13:17 +0200 Subject: [PATCH 125/667] Shell Smash move effect --- data/battle_scripts_1.s | 56 ++++++++++++++++++++++++- include/constants/battle.h | 2 +- include/constants/battle_move_effects.h | 2 + src/battle_script_commands.c | 8 ++++ src/data/battle_moves.h | 6 +-- 5 files changed, 69 insertions(+), 5 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 2c0abf1dcc..102cdd7c8c 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -303,6 +303,56 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectLastResort .4byte BattleScript_EffectRecoil33WithStatus .4byte BattleScript_EffectFlinchWithStatus + .4byte BattleScript_EffectRecoil50 + .4byte BattleScript_EffectShellSmash + +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, ATK48_STAT_NEGATIVE | ATK48_DONT_CHECK_LOWER + setstatchanger STAT_DEF, 1, TRUE + statbuffchange MOVE_EFFECT_AFFECTS_USER | 0x1, 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 | 0x1, 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, ATK48_STAT_BY_TWO + setstatchanger STAT_ATK, 2, FALSE + statbuffchange MOVE_EFFECT_AFFECTS_USER | 0x1, 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 | 0x1, 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 | 0x1, BattleScript_ShellSmashEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_ShellSmashEnd + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_ShellSmashEnd: + goto BattleScript_MoveEnd BattleScript_EffectLastResort: attackcanceler @@ -397,7 +447,7 @@ BattleScript_CoilDoMoveAnim: attackanimation waitanimation setbyte sSTAT_ANIM_PLAYED, FALSE - playstatchangeanimation BS_ATTACKER, BIT_SPATK | BIT_SPDEF | BIT_SPEED, 0x0 + playstatchangeanimation BS_ATTACKER, BIT_ATK | BIT_DEF | BIT_ACC, 0x0 setstatchanger STAT_ATK, 1, FALSE statbuffchange MOVE_EFFECT_AFFECTS_USER | 0x1, BattleScript_CoilTryDef jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_CoilTryDef @@ -3388,6 +3438,10 @@ BattleScript_EffectDoubleEdge:: 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 diff --git a/include/constants/battle.h b/include/constants/battle.h index 2fedc4aa36..62fcef780b 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -311,7 +311,7 @@ #define MOVE_EFFECT_KNOCK_OFF 0x36 #define MOVE_EFFECT_DEF_SPDEF_DOWN 0x37 #define MOVE_EFFECT_RECOIL_33_STATUS 0x38 -#define MOVE_EFFECT_NOTHING_39 0x39 +#define MOVE_EFFECT_RECOIL_50 0x39 #define MOVE_EFFECT_NOTHING_3A 0x3A #define MOVE_EFFECT_SP_ATK_TWO_DOWN 0x3B #define MOVE_EFFECT_NOTHING_3C 0x3C diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index f9c550318f..d8b1383754 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -292,5 +292,7 @@ #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 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f457fdb86d..c63e1e6d4d 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2606,6 +2606,14 @@ void SetMoveEffect(bool8 primary, u8 certain) BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; + case MOVE_EFFECT_RECOIL_50: // Head Smash + 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) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 6c9498ad02..d9370da997 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -5493,7 +5493,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_HEAD_SMASH - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (1/2 recoil instead of 1/3 recoil) + .effect = EFFECT_RECOIL_50, .power = 150, .type = TYPE_ROCK, .accuracy = 80, @@ -5961,7 +5961,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_ROUND - .effect = EFFECT_ROUND, // Needs a custom move effect + .effect = EFFECT_ROUND, .power = 60, .type = TYPE_NORMAL, .accuracy = 100, @@ -6057,7 +6057,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_SHELL_SMASH - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_SHELL_SMASH, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, From ca9876b0b42f8dabbcb6c8a26c56045392855ace Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 22 Sep 2018 12:20:33 +0200 Subject: [PATCH 126/667] Updated Wrap Mechanics, Infestation, stat changing move effects --- data/battle_scripts_1.s | 106 ++++++++++++++++++++++++ include/battle.h | 1 + include/constants/battle.h | 2 +- include/constants/battle_move_effects.h | 4 + include/constants/battle_string_ids.h | 5 +- include/constants/hold_effects.h | 1 + src/battle_message.c | 11 ++- src/battle_script_commands.c | 24 +++++- src/battle_util.c | 10 ++- src/data/battle_moves.h | 22 ++--- 10 files changed, 166 insertions(+), 20 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 102cdd7c8c..fbff3f0e73 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -305,6 +305,77 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectFlinchWithStatus .4byte BattleScript_EffectRecoil50 .4byte BattleScript_EffectShellSmash + .4byte BattleScript_EffectShiftGear + .4byte BattleScript_EffectDefenseUp3 + .4byte BattleScript_EffectNobleRoar + .4byte BattleScript_EffectvVenomDrench + +BattleScript_EffectvVenomDrench: + attackcanceler + attackstring + ppreduce + jumpifstatus BS_TARGET, STATUS1_PSN_ANY, BattleScript_EffectvVenomDrenchCanBeUsed + goto BattleScript_ButItFailed +BattleScript_EffectvVenomDrenchCanBeUsed: + 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, ATK48_STAT_NEGATIVE | ATK48_ONLY_MULTIPLE + playstatchangeanimation BS_TARGET, BIT_ATK, ATK48_STAT_NEGATIVE + setstatchanger STAT_ATK, 1, TRUE + statbuffchange 0x1, BattleScript_VenomDrenchTryLowerSpAtk + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_VenomDrenchTryLowerSpAtk + printfromtable gStatDownStringIds + waitmessage 0x40 +BattleScript_VenomDrenchTryLowerSpAtk:: + playstatchangeanimation BS_TARGET, BIT_SPATK, ATK48_STAT_NEGATIVE + setstatchanger STAT_SPATK, 1, TRUE + statbuffchange 0x1, BattleScript_VenomDrenchTryLowerSpeed + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_VenomDrenchTryLowerSpeed + printfromtable gStatDownStringIds + waitmessage 0x40 +BattleScript_VenomDrenchTryLowerSpeed:: + playstatchangeanimation BS_TARGET, BIT_SPEED, ATK48_STAT_NEGATIVE + setstatchanger STAT_SPEED, 1, TRUE + statbuffchange 0x1, 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, ATK48_STAT_NEGATIVE | ATK48_ONLY_MULTIPLE + playstatchangeanimation BS_TARGET, BIT_ATK, ATK48_STAT_NEGATIVE + setstatchanger STAT_ATK, 1, TRUE + statbuffchange 0x1, BattleScript_NobleRoarTryLowerSpAtk + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_NobleRoarTryLowerSpAtk + printfromtable gStatDownStringIds + waitmessage 0x40 +BattleScript_NobleRoarTryLowerSpAtk:: + playstatchangeanimation BS_TARGET, BIT_SPATK, ATK48_STAT_NEGATIVE + setstatchanger STAT_SPATK, 1, TRUE + statbuffchange 0x1, BattleScript_NobleRoarEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_NobleRoarEnd + printfromtable gStatDownStringIds + waitmessage 0x40 +BattleScript_NobleRoarEnd:: + goto BattleScript_MoveEnd BattleScript_EffectShellSmash: attackcanceler @@ -436,6 +507,37 @@ BattleScript_EffectElectrify: 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, ATK48_STAT_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 | 0x1, 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 | 0x1, BattleScript_ShiftGearEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_ShiftGearEnd + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_ShiftGearEnd: + goto BattleScript_MoveEnd + BattleScript_EffectCoil: attackcanceler attackstring @@ -1816,6 +1918,10 @@ BattleScript_EffectAttackUp2:: 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 diff --git a/include/battle.h b/include/battle.h index 85bf5937fa..e35f2e635a 100644 --- a/include/battle.h +++ b/include/battle.h @@ -180,6 +180,7 @@ struct DisableStruct u8 healBlockTimer; u8 laserFocusTimer; u8 usedMoves:4; + u8 wrapTurns; }; struct ProtectStruct diff --git a/include/constants/battle.h b/include/constants/battle.h index 62fcef780b..89f548cc7c 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -113,7 +113,7 @@ #define STATUS2_BIDE 0x00000300 // two bits 0x100, 0x200 #define STATUS2_LOCK_CONFUSE 0x00000C00 #define STATUS2_MULTIPLETURNS 0x00001000 -#define STATUS2_WRAPPED 0x0000E000 +#define STATUS2_WRAPPED 0x00002000 #define STATUS2_INFATUATION 0x000F0000 // 4 bits, one for every battler #define STATUS2_INFATUATED_WITH(battler) (gBitTable[battler] << 16) #define STATUS2_FOCUS_ENERGY 0x00100000 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index d8b1383754..78d2c56285 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -294,5 +294,9 @@ #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 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index aab8dd837a..1c4e489751 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -504,7 +504,10 @@ #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 BATTLESTRINGS_COUNT 516 +#define BATTLESTRINGS_COUNT 519 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index df9b9c27dc..dd8f907ac1 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -106,6 +106,7 @@ #define HOLD_EFFECT_WISE_GLASSES 116 #define HOLD_EFFECT_EVIOLITE 117 #define HOLD_EFFECT_ASSAULT_VEST 118 +#define HOLD_EFFECT_BINDING_BAND 119 // Gen6 hold effects #define HOLD_EFFECT_FAIRY_POWER 130 diff --git a/src/battle_message.c b/src/battle_message.c index 416e05d1f3..a2c8003142 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -645,6 +645,9 @@ static const u8 sText_GravityPreventsUsage[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX static const u8 sText_HealBlockPreventsUsage[] = _("The opposing {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 reacting\nto {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}!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { @@ -1141,6 +1144,9 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_TargetElectrified, sText_MegaEvoReacting, sText_MegaEvoEvolved, + sText_drastically, + sText_severely, + sText_Infestation, }; const u16 gTerrainStringIds[] = @@ -1274,7 +1280,8 @@ const u16 gFirstTurnOfTwoStringIds[] = const u16 gWrappedStringIds[] = { STRINGID_PKMNSQUEEZEDBYBIND, STRINGID_PKMNWRAPPEDBY, STRINGID_PKMNTRAPPEDINVORTEX, - STRINGID_PKMNCLAMPED, STRINGID_PKMNTRAPPEDINVORTEX, STRINGID_PKMNTRAPPEDBYSANDTOMB + STRINGID_PKMNCLAMPED, STRINGID_PKMNTRAPPEDINVORTEX, STRINGID_PKMNTRAPPEDBYSANDTOMB, + STRINGID_INFESTATION, }; const u16 gMistUsedStringIds[] = @@ -1432,7 +1439,7 @@ 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[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c63e1e6d4d..003bfa80ef 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2368,7 +2368,11 @@ void SetMoveEffect(bool8 primary, u8 certain) } else { - gBattleMons[gEffectBattler].status2 |= ((Random() & 3) + 3) << 0xD; + gBattleMons[gEffectBattler].status2 |= STATUS2_WRAPPED; + if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_GRIP_CLAW) + gDisableStructs[gEffectBattler].wrapTurns = 7; + else + gDisableStructs[gEffectBattler].wrapTurns = ((Random() % 2) + 4); *(gBattleStruct->wrappedMove + gEffectBattler * 2 + 0) = gCurrentMove; *(gBattleStruct->wrappedMove + gEffectBattler * 2 + 1) = gCurrentMove >> 8; @@ -2379,7 +2383,7 @@ void SetMoveEffect(bool8 primary, u8 certain) 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; @@ -3894,12 +3898,14 @@ static void atk47_setgraphicalstatchangevalues(void) value = 0xF; break; case SET_STAT_BUFF_VALUE(2): // +2 + case SET_STAT_BUFF_VALUE(3): // +3 value = 0x27; break; case SET_STAT_BUFF_VALUE(1) | STAT_BUFF_NEGATIVE: // -1 value = 0x16; break; case SET_STAT_BUFF_VALUE(2) | STAT_BUFF_NEGATIVE: // -2 + case SET_STAT_BUFF_VALUE(3) | STAT_BUFF_NEGATIVE: // -3 value = 0x2E; break; } @@ -7260,6 +7266,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; @@ -7287,6 +7300,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; diff --git a/src/battle_util.c b/src/battle_util.c index 1b90f8cd2c..239e904ce7 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1492,8 +1492,7 @@ u8 DoBattlerEndTurnEffects(void) case ENDTURN_WRAP: // wrap if ((gBattleMons[gActiveBattler].status2 & STATUS2_WRAPPED) && gBattleMons[gActiveBattler].hp != 0) { - gBattleMons[gActiveBattler].status2 -= 0x2000; - if (gBattleMons[gActiveBattler].status2 & STATUS2_WRAPPED) // damaged by wrap + if (--gDisableStructs[gActiveBattler].wrapTurns != 0) // damaged by wrap { // This is the only way I could get this array access to match. gBattleScripting.animArg1 = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 0); @@ -1504,12 +1503,17 @@ u8 DoBattlerEndTurnEffects(void) gBattleTextBuff1[3] = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 1); gBattleTextBuff1[4] = EOS; gBattlescriptCurrInstr = BattleScript_WrapTurnDmg; - gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16; + if (GetBattlerHoldEffect(gBattleStruct->wrappedBy[gActiveBattler], TRUE) == HOLD_EFFECT_BINDING_BAND) + gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; + else + gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16; + if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; } else // broke free { + gBattleMons[gActiveBattler].status2 &= ~(STATUS2_WRAPPED); gBattleTextBuff1[0] = B_BUFF_PLACEHOLDER_BEGIN; gBattleTextBuff1[1] = B_BUFF_MOVE; gBattleTextBuff1[2] = *(gBattleStruct->wrappedMove + gActiveBattler * 2 + 0); diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index d9370da997..7ccf94a893 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -6105,7 +6105,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_SHIFT_GEAR - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_SHIFT_GEAR, .power = 0, .type = TYPE_STEEL, .accuracy = 0, @@ -6345,7 +6345,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_WILD_CHARGE - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (recoil damage but 1/4 instead of 1/3) + .effect = EFFECT_RECOIL, .power = 90, .type = TYPE_ELECTRIC, .accuracy = 100, @@ -6465,7 +6465,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_COTTON_GUARD - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_DEFENSE_UP_3, .power = 0, .type = TYPE_GRASS, .accuracy = 0, @@ -6525,7 +6525,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_HEAD_CHARGE - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (same as WILD_CHARGE) + .effect = EFFECT_RECOIL, .power = 120, .type = TYPE_NORMAL, .accuracy = 100, @@ -6826,7 +6826,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_NOBLE_ROAR - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_NOBLE_ROAR, .power = 0, .type = TYPE_NORMAL, .accuracy = 100, @@ -7079,7 +7079,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_PLAY_NICE - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_ATTACK_DOWN, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -7115,7 +7115,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_STEAM_ERUPTION - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (Same as SCALD) + .effect = EFFECT_SCALD, .power = 110, .type = TYPE_WATER, .accuracy = 95, @@ -7127,7 +7127,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_HYPERSPACE_HOLE - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (Same as SCALD) + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 80, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -7139,7 +7139,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_SPECIAL, }, { // MOVE_WATER_SHURIKEN - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (Same with tail slap, HOWEVER If Battle Bond is activated, Water Shuriken's power rises from 15 to 20, and it always hits three times, giving it an average power of 60) + .effect = EFFECT_MULTI_HIT, .power = 15, .type = TYPE_WATER, .accuracy = 100, @@ -7199,7 +7199,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_STATUS, }, { // MOVE_VENOM_DRENCH - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_VENOM_DRENCH, .power = 0, .type = TYPE_POISON, .accuracy = 100, @@ -7343,7 +7343,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .split = SPLIT_PHYSICAL, }, { // MOVE_INFESTATION - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_TRAP, .power = 20, .type = TYPE_BUG, .accuracy = 100, From fff4336a632a9382273b5351d05bd03b7c796a0a Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sat, 22 Sep 2018 08:03:39 -0300 Subject: [PATCH 127/667] Update move_descriptions.h Fixed Magma Storm's description. Sorry, I didn't know that it was working like in Gen. 5+ --- src/data/text/move_descriptions.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/text/move_descriptions.h b/src/data/text/move_descriptions.h index b09f974c68..a0461ca1a7 100644 --- a/src/data/text/move_descriptions.h +++ b/src/data/text/move_descriptions.h @@ -11,7 +11,7 @@ static const u8 sKarateChopDescription[] = _( static const u8 sDoubleSlapDescription[] = _( "Repeatedly slaps the foe\n" - "2 to 5 times."); + "4 to 5 times."); static const u8 sCometPunchDescription[] = _( "Repeatedly punches the foe\n" From bf11c35eaf9aef956912596ff5baac29187258bd Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 22 Sep 2018 13:52:38 +0200 Subject: [PATCH 128/667] Add gen7 learsnets for pokemon --- include/constants/moves.h | 55 + include/pokemon.h | 8 +- src/data/pokemon/level_up_learnset_pointers.h | 2 +- src/data/pokemon/level_up_learnsets.h | 9786 ++++++++++------- src/data/text/move_descriptions.h | 8 +- src/pokemon.c | 52 +- 6 files changed, 6119 insertions(+), 3792 deletions(-) diff --git a/include/constants/moves.h b/include/constants/moves.h index 9fdc00c429..49a59c2c9f 100644 --- a/include/constants/moves.h +++ b/include/constants/moves.h @@ -638,6 +638,61 @@ #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 MOVES_COUNT_GEN7 673 + #define MOVES_COUNT MOVES_COUNT_GEN6 #endif // GUARD_CONSTANTS_MOVES_H diff --git a/include/pokemon.h b/include/pokemon.h index 0d836cc428..5ea2f1187b 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -376,10 +376,10 @@ struct SpindaSpot u16 image[16]; }; -struct __attribute__((packed)) LevelUpMove +struct LevelUpMove { - u16 move:9; - u16 level:7; + u16 move; + u16 level; }; enum @@ -447,7 +447,7 @@ extern const struct BaseStats gBaseStats[]; extern const u8 *const gItemEffectTable[]; extern const struct Evolution gEvolutionTable[][EVOS_PER_MON]; extern const u32 gExperienceTables[][MAX_MON_LEVEL + 1]; -extern const u16 *const gLevelUpLearnsets[]; +extern const struct LevelUpMove *const gLevelUpLearnsets[]; extern const u8 gUnknown_08329D22[]; extern const u8 gUnknown_08329D26[]; extern const u8 gUnknown_08329D2A[]; diff --git a/src/data/pokemon/level_up_learnset_pointers.h b/src/data/pokemon/level_up_learnset_pointers.h index 0f648526c8..1c69a8c471 100644 --- a/src/data/pokemon/level_up_learnset_pointers.h +++ b/src/data/pokemon/level_up_learnset_pointers.h @@ -1,7 +1,7 @@ #ifndef POKEEMERALD_LEVEL_UP_LEARNSET_POINTERS_H #define POKEEMERALD_LEVEL_UP_LEARNSET_POINTERS_H -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 062873aee4..46c685572e 100644 --- a/src/data/pokemon/level_up_learnsets.h +++ b/src/data/pokemon/level_up_learnsets.h @@ -1,351 +1,462 @@ -#ifndef POKEEMERALD_LEVEL_UP_LEARNSETS_H -#define POKEEMERALD_LEVEL_UP_LEARNSETS_H +#define LEVEL_UP_MOVE(lvl, moveLearned) {.move = moveLearned, .level = lvl} +#define LEVEL_UP_END (0xffff) -#define LEVEL_UP_MOVE(lvl, move) ((lvl << 9) | move) -#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), @@ -353,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), @@ -480,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), @@ -2784,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), @@ -3230,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), @@ -4786,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), @@ -4843,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), @@ -5580,44 +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 }; - -#endif //POKEEMERALD_LEVEL_UP_LEARNSETS_H diff --git a/src/data/text/move_descriptions.h b/src/data/text/move_descriptions.h index b09f974c68..3a6f0c61a6 100644 --- a/src/data/text/move_descriptions.h +++ b/src/data/text/move_descriptions.h @@ -1902,7 +1902,7 @@ static const u8 sECHOED_VOICEDescription[] = _( "it is used."); static const u8 sCHIP_AWAYDescription[] = _( - "Strikes through the foeApos, s\n" + "Strikes through the foe’s\n" "stat changes."); static const u8 sCLEAR_SMOGDescription[] = _( @@ -1962,7 +1962,7 @@ static const u8 sACROBATICSDescription[] = _( "user has no item."); static const u8 sREFLECT_TYPEDescription[] = _( - "The user reflects the foeApos, s\n" + "The user reflects the foe’s\n" "type, copying it."); static const u8 sRETALIATEDescription[] = _( @@ -2231,7 +2231,7 @@ static const u8 sSTEAM_ERUPTIONDescription[] = _( static const u8 sHYPERSPACE_HOLEDescription[] = _( "Uses a warp hole to attack.\n" - "CanApos, t be evaded."); + "Can’t be evaded."); static const u8 sWATER_SHURIKENDescription[] = _( "Throws 2 to 5 stars that\n" @@ -2411,7 +2411,7 @@ static const u8 sBURN_UPDescription[] = _( static const u8 sSPEED_SWAPDescription[] = _( "Swaps user’s Speed with\n" - "the targetApos, s."); + "the target’s."); static const u8 sSMART_STRIKEDescription[] = _( "Hits with an accurate\n" diff --git a/src/pokemon.c b/src/pokemon.c index 53637a6357..e93b0e982d 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -3312,20 +3312,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] & 0xFE00); - - if (moveLevel > (level << 9)) + if (gLevelUpLearnsets[species][i].level > level) break; - - move = (gLevelUpLearnsets[species][i] & 0x1FF); - - if (GiveMoveToBoxMon(boxMon, move) == 0xFFFF) - DeleteFirstMoveAndGiveMoveToBoxMon(boxMon, move); + if (GiveMoveToBoxMon(boxMon, gLevelUpLearnsets[species][i].move) == 0xFFFF) + DeleteFirstMoveAndGiveMoveToBoxMon(boxMon, gLevelUpLearnsets[species][i].move); } } @@ -3343,17 +3335,17 @@ u16 MonTryLearningNewMove(struct Pokemon *mon, bool8 firstMove) { sLearningMoveTableID = 0; - while ((gLevelUpLearnsets[species][sLearningMoveTableID] & 0xFE00) != (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] & 0xFE00) == (level << 9)) + if (gLevelUpLearnsets[species][sLearningMoveTableID].level == level) { - gMoveToLearn = (gLevelUpLearnsets[species][sLearningMoveTableID] & 0x1FF); + gMoveToLearn = gLevelUpLearnsets[species][sLearningMoveTableID].move; sLearningMoveTableID++; retVal = GiveMoveToMon(mon, gMoveToLearn); } @@ -6223,23 +6215,23 @@ u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves) { u16 moveLevel; - if (gLevelUpLearnsets[species][i] == 0xFFFF) + if (gLevelUpLearnsets[species][i].move == LEVEL_UP_END) break; - moveLevel = gLevelUpLearnsets[species][i] & 0xFE00; + moveLevel = gLevelUpLearnsets[species][i].level; - if (moveLevel <= (level << 9)) + if (moveLevel <= level) { - for (j = 0; j < 4 && learnedMoves[j] != (gLevelUpLearnsets[species][i] & 0x1FF); j++) + for (j = 0; j < 4 && learnedMoves[j] != gLevelUpLearnsets[species][i].move; j++) ; if (j == 4) { - for (k = 0; k < numMoves && moves[k] != (gLevelUpLearnsets[species][i] & 0x1FF); k++) + for (k = 0; k < numMoves && moves[k] != gLevelUpLearnsets[species][i].move; k++) ; if (k == numMoves) - moves[numMoves++] = gLevelUpLearnsets[species][i] & 0x1FF; + moves[numMoves++] = gLevelUpLearnsets[species][i].move; } } } @@ -6252,8 +6244,8 @@ u8 GetLevelUpMovesBySpecies(u16 species, u16 *moves) u8 numMoves = 0; int i; - for (i = 0; i < 20 && gLevelUpLearnsets[species][i] != 0xFFFF; i++) - moves[numMoves++] = gLevelUpLearnsets[species][i] & 0x1FF; + for (i = 0; i < 20 && gLevelUpLearnsets[species][i].move != 0xFFFF; i++) + moves[numMoves++] = gLevelUpLearnsets[species][i].move; return numMoves; } @@ -6277,23 +6269,23 @@ u8 GetNumberOfRelearnableMoves(struct Pokemon *mon) { u16 moveLevel; - if (gLevelUpLearnsets[species][i] == 0xFFFF) + if (gLevelUpLearnsets[species][i].move == LEVEL_UP_END) break; - moveLevel = gLevelUpLearnsets[species][i] & 0xFE00; + moveLevel = gLevelUpLearnsets[species][i].level; - if (moveLevel <= (level << 9)) + if (moveLevel <= level) { - for (j = 0; j < 4 && learnedMoves[j] != (gLevelUpLearnsets[species][i] & 0x1FF); j++) + for (j = 0; j < 4 && learnedMoves[j] != gLevelUpLearnsets[species][i].move; j++) ; if (j == 4) { - for (k = 0; k < numMoves && moves[k] != (gLevelUpLearnsets[species][i] & 0x1FF); k++) + for (k = 0; k < numMoves && moves[k] != gLevelUpLearnsets[species][i].move; k++) ; if (k == numMoves) - moves[numMoves++] = gLevelUpLearnsets[species][i] & 0x1FF; + moves[numMoves++] = gLevelUpLearnsets[species][i].move; } } } From fd15e23419ea90b526ce4666ee02169e9c7aa049 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 22 Sep 2018 14:04:15 +0200 Subject: [PATCH 129/667] Placeholder entries for gen7 moves --- include/constants/moves.h | 2 +- src/data/battle_moves.h | 626 +++++++++++++++++++++++++++++++++++++- 2 files changed, 626 insertions(+), 2 deletions(-) diff --git a/include/constants/moves.h b/include/constants/moves.h index 49a59c2c9f..9edf402efd 100644 --- a/include/constants/moves.h +++ b/include/constants/moves.h @@ -693,6 +693,6 @@ #define MOVES_COUNT_GEN7 673 -#define MOVES_COUNT MOVES_COUNT_GEN6 +#define MOVES_COUNT MOVES_COUNT_GEN7 #endif // GUARD_CONSTANTS_MOVES_H diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 7ccf94a893..714d8fe253 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -1,7 +1,7 @@ #ifndef GUARD_DATA_BATTLE_MOVES #define GUARD_DATA_BATTLE_MOVES -const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = +const struct BattleMove gBattleMoves[MOVES_COUNT] = { { // MOVE_NONE .effect = EFFECT_HIT, @@ -7463,6 +7463,630 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_GEN6] = .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_PLACEHOLDER, + .power = 0, + .type = TYPE_MYSTERY, + .accuracy = 0, + .pp = 0, + .secondaryEffectChance = 0, + .target = MOVE_TARGET_SELECTED, + .priority = 0, + .flags = 0, + .split = SPLIT_PHYSICAL, + }, + { // MOVE_FIRST_IMPRESSION + .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_BANEFUL_BUNKER + .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_SPIRIT_SHACKLE + .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_DARKEST_LARIAT + .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_SPARKLING_ARIA + .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_ICE_HAMMER + .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_FLORAL_HEALING + .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_HIGH_HORSEPOWER + .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_STRENGTH_SAP + .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_SOLAR_BLADE + .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_LEAFAGE + .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_SPOTLIGHT + .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_TOXIC_THREAD + .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_LASER_FOCUS + .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_GEAR_UP + .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_THROAT_CHOP + .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_POLLEN_PUFF + .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_ANCHOR_SHOT + .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_PSYCHIC_TERRAIN + .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_LUNGE + .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_FIRE_LASH + .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_POWER_TRIP + .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_BURN_UP + .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_SPEED_SWAP + .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_SMART_STRIKE + .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_PURIFY + .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_REVELATION_DANCE + .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_CORE_ENFORCER + .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_TROP_KICK + .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_INSTRUCT + .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_BEAK_BLAST + .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_CLANGING_SCALES + .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_DRAGON_HAMMER + .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_BRUTAL_SWING + .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_AURORA_VEIL + .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_SHELL_TRAP + .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_FLEUR_CANNON + .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_PSYCHIC_FANGS + .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_STOMPING_TANTRUM + .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_SHADOW_BONE + .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_ACCELEROCK + .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_LIQUIDATION + .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_PRISMATIC_LASER + .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_SPECTRAL_THIEF + .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_SUNSTEEL_STRIKE + .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_MOONGEIST_BEAM + .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_TEARFUL_LOOK + .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_ZING_ZAP + .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_NATURES_MADNESS + .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_MULTI_ATTACK + .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, + }, }; #endif // GUARD_DATA_BATTLE_MOVES From 9474254e4d9b0d36c52ffdbf772d0c2e0fbe386f Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 22 Sep 2018 16:15:00 +0200 Subject: [PATCH 130/667] Final Gambit, Dragon Tail --- asm/macros/battle_script.inc | 9 ++ data/battle_scripts_1.s | 107 ++++++++++++++++++++- include/battle_scripts.h | 2 + include/constants/battle.h | 2 +- include/constants/battle_move_effects.h | 4 + include/constants/battle_script_commands.h | 2 + src/battle_message.c | 2 +- src/battle_script_commands.c | 41 ++++++-- src/data/battle_moves.h | 12 +-- 9 files changed, 161 insertions(+), 20 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 69f382046f..a1b1d326c9 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1486,6 +1486,11 @@ various BS_ATTACKER, VARIOUS_ARGUMENT_STATUS_EFFECT .endm + .macro tryhitswitchtarget ptr + various BS_ATTACKER, VARIOUS_TRY_HIT_SWITCH_TARGET + .4byte \ptr + .endm + @ helpful macros .macro setstatchanger stat, stages, down setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7 @@ -1574,3 +1579,7 @@ .macro dmgtomaxattackerhp manipulatedamage ATK80_FULL_ATTACKER_HP .endm + + .macro dmgtocurrattackerhp + manipulatedamage ATK80_CURR_ATTACKER_HP + .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index fbff3f0e73..172bf97458 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -308,15 +308,108 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectShiftGear .4byte BattleScript_EffectDefenseUp3 .4byte BattleScript_EffectNobleRoar - .4byte BattleScript_EffectvVenomDrench + .4byte BattleScript_EffectVenomDrench + .4byte BattleScript_EffectToxicThread + .4byte BattleScript_EffectClearSmog + .4byte BattleScript_EffectHitSwitchTarget + .4byte BattleScript_EffectFinalGambit -BattleScript_EffectvVenomDrench: +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: + setbyte sMOVEEND_STATE, 0x0 + moveend 0x0, 0x0 + 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 0x1, 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_EffectvVenomDrenchCanBeUsed + jumpifstatus BS_TARGET, STATUS1_PSN_ANY, BattleScript_EffectVenomDrenchCanBeUsed goto BattleScript_ButItFailed -BattleScript_EffectvVenomDrenchCanBeUsed: +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 @@ -1559,6 +1652,7 @@ BattleScript_EffectRoar:: 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:: @@ -4862,6 +4956,11 @@ BattleScript_SAtkDown2:: waitmessage 0x40 BattleScript_SAtkDown2End:: return + +BattleScript_MoveEffectClearSmog:: + printstring STRINGID_RESETSTARGETSSTATLEVELS + waitmessage 0x40 + return BattleScript_FocusPunchSetUp:: printstring STRINGID_EMPTYSTRING3 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 70733b41a3..91e0a8df62 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -275,5 +275,7 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle.h b/include/constants/battle.h index 89f548cc7c..a583da05ca 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -312,7 +312,7 @@ #define MOVE_EFFECT_DEF_SPDEF_DOWN 0x37 #define MOVE_EFFECT_RECOIL_33_STATUS 0x38 #define MOVE_EFFECT_RECOIL_50 0x39 -#define MOVE_EFFECT_NOTHING_3A 0x3A +#define MOVE_EFFECT_CLEAR_SMOG 0x3A #define MOVE_EFFECT_SP_ATK_TWO_DOWN 0x3B #define MOVE_EFFECT_NOTHING_3C 0x3C #define MOVE_EFFECT_NOTHING_3D 0x3D diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 78d2c56285..a93cb2a0ec 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -298,5 +298,9 @@ #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 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 830c2a7d57..67d434964c 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -103,6 +103,7 @@ #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 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 @@ -110,6 +111,7 @@ #define ATK80_DMG_DOUBLED 2 #define ATK80_1_8_TARGET_HP 3 #define ATK80_FULL_ATTACKER_HP 4 +#define ATK80_CURR_ATTACKER_HP 5 // atk4F, a flag used for the jumpifcantswitch command #define ATK4F_DONT_CHECK_STATUSES 0x80 diff --git a/src/battle_message.c b/src/battle_message.c index a2c8003142..d5bbbebcc8 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -564,7 +564,7 @@ static const u8 sText_FellStraightDown[] =_("{B_DEF_NAME_WITH_PREFIX} fell\nstra 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} stat changes\nwere removed!"); +static const u8 sText_ResetsTargetsStatLevels[] =_("{B_DEF_NAME_WITH_PREFIX}’s stat changes\nwere removed!"); static const u8 sText_ProtectsTeamFromPriority[] =_("Quick Guard protected your team!"); 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!"); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 003bfa80ef..47ac3cc9b9 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1975,6 +1975,7 @@ u8 GetBattlerTurnOrderNum(u8 battlerId) void SetMoveEffect(bool8 primary, u8 certain) { + s32 i; bool32 statusChanged = FALSE; u8 affectsUser = 0; // 0x40 otherwise bool32 noSunCanFreeze = TRUE; @@ -2676,6 +2677,20 @@ void SetMoveEffect(bool8 primary, u8 certain) BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_SAtkDown2; break; + case MOVE_EFFECT_CLEAR_SMOG: + for (i = 0; i < BATTLE_STATS_NO; i++) + { + if (gBattleMons[gEffectBattler].statStages[i] != 6) + break; + } + if ((gSpecialStatuses[gEffectBattler].physicalDmg || gSpecialStatuses[gEffectBattler].specialDmg) && i != BATTLE_STATS_NO) + { + for (i = 0; i < BATTLE_STATS_NO; i++) + gBattleMons[gEffectBattler].statStages[i] = 6; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectClearSmog; + } + break; } } } @@ -6707,6 +6722,19 @@ static void atk76_various(void) 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; } gBattlescriptCurrInstr += 3; @@ -6970,6 +6998,9 @@ static void atk80_manipulatedamage(void) case ATK80_FULL_ATTACKER_HP: gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP; break; + case ATK80_CURR_ATTACKER_HP: + gBattleMoveDamage = gBattleMons[gBattlerAttacker].hp; + break; } gBattlescriptCurrInstr += 2; @@ -7428,16 +7459,10 @@ static void atk8F_forcerandomswitch(void) s32 i; s32 battler1PartyId = 0; s32 battler2PartyId = 0; - - #ifdef NONMATCHING - s32 lastMonId = 0; // + 1 - #else - register s32 lastMonId asm("r8") = 0; // + 1 - #endif // NONMATCHING - + s32 lastMonId = 0; // + 1 s32 firstMonId = 0; s32 monsCount = 0; - struct Pokemon* party = NULL; + struct Pokemon *party = NULL; s32 validMons = 0; s32 minNeeded = 0; diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 714d8fe253..d335c49ea7 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -5997,12 +5997,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_PHYSICAL, }, { // MOVE_CLEAR_SMOG - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (Always bypasses accuracy, but same as Haze) + .effect = EFFECT_CLEAR_SMOG, .power = 50, .type = TYPE_POISON, .accuracy = 0, .pp = 15, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, @@ -6117,7 +6117,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_STATUS, }, { // MOVE_CIRCLE_THROW - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (similar to whirlwind, but different) + .effect = EFFECT_HIT_SWITCH_TARGET, .power = 60, .type = TYPE_FIGHTING, .accuracy = 90, @@ -6189,7 +6189,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_PHYSICAL, }, { // MOVE_FINAL_GAMBIT - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_FINAL_GAMBIT, .power = 1, .type = TYPE_FIGHTING, .accuracy = 100, @@ -6309,7 +6309,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_SPECIAL, }, { // MOVE_DRAGON_TAIL - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_HIT_SWITCH_TARGET, .power = 60, .type = TYPE_DRAGON, .accuracy = 90, @@ -7632,7 +7632,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_PHYSICAL, }, { // MOVE_TOXIC_THREAD - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_TOXIC_THREAD, .power = 0, .type = TYPE_MYSTERY, .accuracy = 0, From 3c6b405dd87c77e976a2818ab551347af5ee4a72 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sat, 22 Sep 2018 12:24:47 -0300 Subject: [PATCH 131/667] Update battle_moves.h Gen. 7 moves data. --- src/data/battle_moves.h | 590 ++++++++++++++++++++-------------------- 1 file changed, 295 insertions(+), 295 deletions(-) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index d335c49ea7..bfa1b779c9 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -4621,7 +4621,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, .split = SPLIT_STATUS, }, { // MOVE_GUARD_SWAP @@ -4633,7 +4633,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, .split = SPLIT_STATUS, }, { // MOVE_PUNISHMENT @@ -5997,12 +5997,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_PHYSICAL, }, { // MOVE_CLEAR_SMOG - .effect = EFFECT_CLEAR_SMOG, + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (Always bypasses accuracy, but same as Haze) .power = 50, .type = TYPE_POISON, .accuracy = 0, .pp = 15, - .secondaryEffectChance = 100, + .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, @@ -6117,7 +6117,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_STATUS, }, { // MOVE_CIRCLE_THROW - .effect = EFFECT_HIT_SWITCH_TARGET, + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (similar to whirlwind, but different) .power = 60, .type = TYPE_FIGHTING, .accuracy = 90, @@ -6189,7 +6189,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_PHYSICAL, }, { // MOVE_FINAL_GAMBIT - .effect = EFFECT_FINAL_GAMBIT, + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 1, .type = TYPE_FIGHTING, .accuracy = 100, @@ -6309,7 +6309,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_SPECIAL, }, { // MOVE_DRAGON_TAIL - .effect = EFFECT_HIT_SWITCH_TARGET, + .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect .power = 60, .type = TYPE_DRAGON, .accuracy = 90, @@ -7478,613 +7478,613 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = { // MOVE_SHORE_UP .effect = EFFECT_PLACEHOLDER, .power = 0, - .type = TYPE_MYSTERY, + .type = TYPE_GROUND, .accuracy = 0, - .pp = 0, + .pp = 10, .secondaryEffectChance = 0, - .target = MOVE_TARGET_SELECTED, + .target = MOVE_TARGET_USER, .priority = 0, - .flags = 0, - .split = SPLIT_PHYSICAL, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_FIRST_IMPRESSION .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .power = 90, + .type = TYPE_BUG, + .accuracy = 100, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, - .priority = 0, - .flags = 0, + .priority = 2, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, .split = SPLIT_PHYSICAL, }, { // MOVE_BANEFUL_BUNKER - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_PLACEHOLDER, .power = 0, - .type = TYPE_MYSTERY, + .type = TYPE_POISON, .accuracy = 0, - .pp = 0, + .pp = 10, .secondaryEffectChance = 0, - .target = MOVE_TARGET_SELECTED, - .priority = 0, + .target = MOVE_TARGET_USER, + .priority = 4, .flags = 0, - .split = SPLIT_PHYSICAL, + .split = SPLIT_STATUS, }, { // MOVE_SPIRIT_SHACKLE - .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .effect = EFFECT_MEAN_LOOK, + .power = 80, + .type = TYPE_GHOST, + .accuracy = 100, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, .split = SPLIT_PHYSICAL, }, { // MOVE_DARKEST_LARIAT - .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .effect = EFFECT_HIT, + .power = 85, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_STAT_STAGES_IGNORED, .split = SPLIT_PHYSICAL, }, { // MOVE_SPARKLING_ARIA .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .power = 00, + .type = TYPE_WATER, + .accuracy = 100, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, - .split = SPLIT_PHYSICAL, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SOUND, + .split = SPLIT_SPECIAL, }, { // MOVE_ICE_HAMMER - .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .effect = EFFECT_SPEED_DOWN_HIT, + .power = 100, + .type = TYPE_ICE, + .accuracy = 90, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, .split = SPLIT_PHYSICAL, }, { // MOVE_FLORAL_HEALING - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_HEAL_PULSE, .power = 0, - .type = TYPE_MYSTERY, + .type = TYPE_FAIRY, .accuracy = 0, - .pp = 0, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, - .split = SPLIT_PHYSICAL, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_HIGH_HORSEPOWER - .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .effect = EFFECT_HIT, + .power = 95, + .type = TYPE_GROUND, + .accuracy = 95, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, .split = SPLIT_PHYSICAL, }, { // MOVE_STRENGTH_SAP .effect = EFFECT_PLACEHOLDER, .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, - .split = SPLIT_PHYSICAL, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_SOLAR_BLADE - .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .effect = EFFECT_SOLARBEAM, + .power = 125, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, .split = SPLIT_PHYSICAL, }, { // MOVE_LEAFAGE - .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .effect = EFFECT_HIT, + .power = 40, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 40, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, .split = SPLIT_PHYSICAL, }, { // MOVE_SPOTLIGHT - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_FOLLOW_ME, .power = 0, - .type = TYPE_MYSTERY, + .type = TYPE_NORMAL, .accuracy = 0, - .pp = 0, + .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, - .priority = 0, - .flags = 0, - .split = SPLIT_PHYSICAL, + .priority = 3, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_TOXIC_THREAD - .effect = EFFECT_TOXIC_THREAD, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, + .effect = EFFECT_PLACEHOLDER, + .power = 20, + .type = TYPE_POISON, + .accuracy = 100, .pp = 0, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, - .split = SPLIT_PHYSICAL, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_LASER_FOCUS .effect = EFFECT_PLACEHOLDER, .power = 0, - .type = TYPE_MYSTERY, + .type = TYPE_NORMAL, .accuracy = 0, - .pp = 0, + .pp = 30, .secondaryEffectChance = 0, - .target = MOVE_TARGET_SELECTED, + .target = MOVE_TARGET_USER, .priority = 0, - .flags = 0, - .split = SPLIT_PHYSICAL, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_GEAR_UP .effect = EFFECT_PLACEHOLDER, .power = 0, - .type = TYPE_MYSTERY, + .type = TYPE_STEEL, .accuracy = 0, - .pp = 0, + .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, - .split = SPLIT_PHYSICAL, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_THROAT_CHOP .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .power = 80, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, .split = SPLIT_PHYSICAL, }, { // MOVE_POLLEN_PUFF .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .power = 90, + .type = TYPE_BUG, + .accuracy = 100, + .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, - .split = SPLIT_PHYSICAL, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, { // MOVE_ANCHOR_SHOT - .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .effect = EFFECT_MEAN_LOOK, + .power = 80, + .type = TYPE_STEEL, + .accuracy = 100, + .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, .split = SPLIT_PHYSICAL, }, { // MOVE_PSYCHIC_TERRAIN .effect = EFFECT_PLACEHOLDER, .power = 0, - .type = TYPE_MYSTERY, + .type = TYPE_PSYCHIC, .accuracy = 0, - .pp = 0, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = 0, - .split = SPLIT_PHYSICAL, + .split = SPLIT_STATUS, }, { // MOVE_LUNGE - .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .effect = EFFECT_ATTACK_DOWN, + .power = 80, + .type = TYPE_BUG, + .accuracy = 100, + .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, .split = SPLIT_PHYSICAL, }, { // MOVE_FIRE_LASH - .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .effect = EFFECT_DEFENSE_DOWN, + .power = 80, + .type = TYPE_FIRE, + .accuracy = 100, + .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, .split = SPLIT_PHYSICAL, }, { // MOVE_POWER_TRIP - .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .effect = EFFECT_STORED_POWER, + .power = 20, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, .split = SPLIT_PHYSICAL, }, { // MOVE_BURN_UP .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .power = 130, + .type = TYPE_FIRE, + .accuracy = 100, + .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, - .split = SPLIT_PHYSICAL, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, { // MOVE_SPEED_SWAP .effect = EFFECT_PLACEHOLDER, .power = 0, - .type = TYPE_MYSTERY, + .type = TYPE_PSYCHIC, .accuracy = 0, - .pp = 0, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, - .split = SPLIT_PHYSICAL, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_SMART_STRIKE .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, + .power = 70, + .type = TYPE_STEEL, .accuracy = 0, - .pp = 0, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, .split = SPLIT_PHYSICAL, }, { // MOVE_PURIFY .effect = EFFECT_PLACEHOLDER, .power = 0, - .type = TYPE_MYSTERY, + .type = TYPE_POISON, .accuracy = 0, - .pp = 0, + .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, - .split = SPLIT_PHYSICAL, + .flags = 0FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_REVELATION_DANCE .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .power = 90, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, - .split = SPLIT_PHYSICAL, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_CORE_ENFORCER .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .power = 100, + .type = TYPE_DRAGON, + .accuracy = 100, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, - .split = SPLIT_PHYSICAL, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_SPECIAL, }, { // MOVE_TROP_KICK - .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .effect = EFFECT_ATTACK_DOWN_HIT, + .power = 70, + .type = TYPE_GRASS, + .accuracy = 100, + .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, .split = SPLIT_PHYSICAL, }, { // MOVE_INSTRUCT .effect = EFFECT_PLACEHOLDER, .power = 0, - .type = TYPE_MYSTERY, + .type = TYPE_PSYCHIC, .accuracy = 0, - .pp = 0, + .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, - .split = SPLIT_PHYSICAL, + .flags = FLAG_PROTECT_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_BEAK_BLAST .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .power = 100, + .type = TYPE_FLYING, + .accuracy = 100, + .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, - .priority = 0, - .flags = 0, + .priority = -3, + .flags = FLAG_PROTECT_AFFECTED, .split = SPLIT_PHYSICAL, }, { // MOVE_CLANGING_SCALES - .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .effect = EFFECT_DEFENSE_DOWN_HIT, + .power = 110, + .type = TYPE_DRAGON, + .accuracy = 100, + .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, - .split = SPLIT_PHYSICAL, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, + .split = SPLIT_SPECIAL, }, { // MOVE_DRAGON_HAMMER - .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .effect = EFFECT_HIT, + .power = 90, + .type = TYPE_DRAGON, + .accuracy = 100, + .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, .split = SPLIT_PHYSICAL, }, { // MOVE_BRUTAL_SWING - .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .effect = EFFECT_HIT, + .power = 60, + .type = TYPE_DARK, + .accuracy = 100, + .pp = 20, .secondaryEffectChance = 0, - .target = MOVE_TARGET_SELECTED, + .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, - .flags = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, .split = SPLIT_PHYSICAL, }, { // MOVE_AURORA_VEIL .effect = EFFECT_PLACEHOLDER, .power = 0, - .type = TYPE_MYSTERY, + .type = TYPE_ICE, .accuracy = 0, - .pp = 0, + .pp = 20, .secondaryEffectChance = 0, - .target = MOVE_TARGET_SELECTED, + .target = MOVE_TARGET_USER, .priority = 0, - .flags = 0, - .split = SPLIT_PHYSICAL, + .flags = FLAG_SNATCH_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_SHELL_TRAP .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .power = 150, + .type = TYPE_FIRE, + .accuracy = 100, + .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, - .priority = 0, - .flags = 0, - .split = SPLIT_PHYSICAL, + .priority = -3, + .flags = FLAG_PROTECT_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, { // MOVE_FLEUR_CANNON - .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .effect = EFFECT_OVERHEAT, + .power = 130, + .type = TYPE_FAIRY, + .accuracy = 90, + .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, - .split = SPLIT_PHYSICAL, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_SPECIAL, }, { // MOVE_PSYCHIC_FANGS - .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .effect = EFFECT_BRICK_BREAK, + .power = 75, + .type = TYPE_PSYCHIC, + .accuracy = 100, + .pp = 15, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, .split = SPLIT_PHYSICAL, }, { // MOVE_STOMPING_TANTRUM .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .power = 75, + .type = TYPE_GROUND, + .accuracy = 100, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, .split = SPLIT_PHYSICAL, }, { // MOVE_SHADOW_BONE - .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .effect = EFFECT_DEFENSE_DOWN_HIT, + .power = 85, + .type = TYPE_GHOST, + .accuracy = 100, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, .split = SPLIT_PHYSICAL, }, { // MOVE_ACCELEROCK - .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .effect = EFFECT_HIT, + .power = 40, + .type = TYPE_ROCK, + .accuracy = 100, + .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, - .priority = 0, - .flags = 0, + .priority = 1, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, .split = SPLIT_PHYSICAL, }, { // MOVE_LIQUIDATION - .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .effect = EFFECT_DEFENSE_DOWN_HIT, + .power = 85, + .type = TYPE_WATER, + .accuracy = 100, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, .split = SPLIT_PHYSICAL, }, { // MOVE_PRISMATIC_LASER - .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .effect = EFFECT_RECHARGE, + .power = 160, + .type = TYPE_PSYCHIC, + .accuracy = 100, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, - .split = SPLIT_PHYSICAL, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, { // MOVE_SPECTRAL_THIEF .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .power = 90, + .type = TYPE_GHOST, + .accuracy = 100, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, .split = SPLIT_PHYSICAL, }, { // MOVE_SUNSTEEL_STRIKE .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .power = 100, + .type = TYPE_STEEL, + .accuracy = 100, + .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, .split = SPLIT_PHYSICAL, }, { // MOVE_MOONGEIST_BEAM .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .power = 100, + .type = TYPE_GHOST, + .accuracy = 100, + .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, - .split = SPLIT_PHYSICAL, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, { // MOVE_TEARFUL_LOOK .effect = EFFECT_PLACEHOLDER, .power = 0, - .type = TYPE_MYSTERY, + .type = TYPE_NORMAL, .accuracy = 0, - .pp = 0, + .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, - .split = SPLIT_PHYSICAL, + .flags = FLAG_MAGICCOAT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .split = SPLIT_STATUS, }, { // MOVE_ZING_ZAP - .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .effect = EFFECT_FLINCH_HIT, + .power = 80, + .type = TYPE_ELECTRIC, + .accuracy = 100, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, .split = SPLIT_PHYSICAL, }, { // MOVE_NATURES_MADNESS - .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .effect = EFFECT_SUPER_FANG, + .power = 1, + .type = TYPE_FAIRY, + .accuracy = 90, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, - .split = SPLIT_PHYSICAL, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, + .split = SPLIT_SPECIAL, }, { // MOVE_MULTI_ATTACK .effect = EFFECT_PLACEHOLDER, - .power = 0, - .type = TYPE_MYSTERY, - .accuracy = 0, - .pp = 0, + .power = 90, + .type = TYPE_NORMAL, + .accuracy = 100, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, .split = SPLIT_PHYSICAL, }, }; From db44a7e25aa7a9bd6c65723a52a2c3ec1a09b1c8 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 22 Sep 2018 17:27:51 +0200 Subject: [PATCH 132/667] Techno Blast and Autotomize --- asm/macros/battle_script.inc | 5 ++++ data/battle_scripts_1.s | 30 ++++++++++++++++++++++ include/constants/battle_move_effects.h | 3 +++ include/constants/battle_script_commands.h | 1 + include/constants/hold_effects.h | 1 + src/battle_main.c | 10 ++++++++ src/battle_script_commands.c | 11 ++++++++ src/battle_util.c | 15 +++++++++-- src/data/battle_moves.h | 6 ++--- 9 files changed, 77 insertions(+), 5 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index a1b1d326c9..fb34f4fc5b 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1491,6 +1491,11 @@ .4byte \ptr .endm + .macro tryautonomize battler ptr + various \battler, VARIOUS_TRY_AUTONOMIZE + .4byte \ptr + .endm + @ helpful macros .macro setstatchanger stat, stages, down setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 172bf97458..efd3e8e39e 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -313,6 +313,34 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectClearSmog .4byte BattleScript_EffectHitSwitchTarget .4byte BattleScript_EffectFinalGambit + .4byte BattleScript_EffectTechnoBlast + .4byte BattleScript_EffectJudgment + .4byte BattleScript_EffectAutonomize + +BattleScript_EffectAutonomize: + setstatchanger STAT_SPEED, 2, FALSE + attackcanceler + attackstring + ppreduce + statbuffchange MOVE_EFFECT_AFFECTS_USER | 0x1, BattleScript_AutonomizeWeightLoss + jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_AutonomizeAttackAnim + pause 0x20 + goto BattleScript_AutonomizePrintString +BattleScript_AutonomizeAttackAnim:: + attackanimation + waitanimation +BattleScript_AutonomizeDoAnim:: + setgraphicalstatchangevalues + playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 +BattleScript_AutonomizePrintString:: + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_AutonomizeWeightLoss:: + jumpifmovehadnoeffect BattleScript_MoveEnd + tryautonomize BS_ATTACKER, BattleScript_MoveEnd + printstring STRINGID_BECAMENIMBLE + waitmessage 0x40 + goto BattleScript_MoveEnd BattleScript_EffectFinalGambit: attackcanceler @@ -1267,6 +1295,8 @@ BattleScript_EffectWeatherBall: BattleScript_EffectHiddenPower: BattleScript_EffectFreezeDry: BattleScript_EffectTwoTypedMove: +BattleScript_EffectTechnoBlast: +BattleScript_EffectJudgment: jumpifnotmove MOVE_SURF, BattleScript_HitFromAtkCanceler jumpifnostatus3 BS_TARGET, STATUS3_UNDERWATER, BattleScript_HitFromAtkCanceler orword gHitMarker, HITMARKER_IGNORE_UNDERWATER diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index a93cb2a0ec..93f4f727e6 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -302,5 +302,8 @@ #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_AUTONOMIZE 301 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 67d434964c..062db7ccc5 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -104,6 +104,7 @@ #define VARIOUS_TRY_LAST_RESORT 52 #define VARIOUS_ARGUMENT_STATUS_EFFECT 53 #define VARIOUS_TRY_HIT_SWITCH_TARGET 54 +#define VARIOUS_TRY_AUTONOMIZE 55 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index dd8f907ac1..1845c77f9e 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -107,6 +107,7 @@ #define HOLD_EFFECT_EVIOLITE 117 #define HOLD_EFFECT_ASSAULT_VEST 118 #define HOLD_EFFECT_BINDING_BAND 119 +#define HOLD_EFFECT_DRIVE 120 // Gen6 hold effects #define HOLD_EFFECT_FAIRY_POWER 130 diff --git a/src/battle_main.c b/src/battle_main.c index 2f79ed9ca1..cbd4945e70 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5376,6 +5376,15 @@ void SetTypeBeforeUsingMove(u16 move, u8 battlerAtk) 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 (gBattleMoves[move].effect == EFFECT_JUDGMENT) + { + // TODO: + } attackerAbility = GetBattlerAbility(battlerAtk); GET_MOVE_TYPE(move, moveType); @@ -5387,6 +5396,7 @@ void SetTypeBeforeUsingMove(u16 move, u8 battlerAtk) else if (gBattleMoves[move].type == TYPE_NORMAL && gBattleMoves[move].effect != EFFECT_HIDDEN_POWER && gBattleMoves[move].effect != EFFECT_WEATHER_BALL + && gBattleMoves[move].effect != EFFECT_JUDGMENT && ((attackerAbility == ABILITY_PIXILATE && (ateType = TYPE_FAIRY)) || (attackerAbility == ABILITY_REFRIGERATE && (ateType = TYPE_ICE)) || (attackerAbility == ABILITY_AERILATE && (ateType = TYPE_FLYING)) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 47ac3cc9b9..ec4d6bca73 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6735,6 +6735,17 @@ static void atk76_various(void) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); } return; + case VARIOUS_TRY_AUTONOMIZE: + if (GetBattlerWeight(gActiveBattler) > 1) + { + gDisableStructs[gActiveBattler].autonomizeCount++; + gBattlescriptCurrInstr += 7; + } + else + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + } + return; } gBattlescriptCurrInstr += 3; diff --git a/src/battle_util.c b/src/battle_util.c index 239e904ce7..178f9ae2c2 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4475,6 +4475,7 @@ u8 GetBattleMonMoveSlot(struct BattlePokemon *battleMon, u16 move) u32 GetBattlerWeight(u8 battlerId) { + u32 i; u32 weight = GetPokedexHeightWeight(SpeciesToNationalPokedexNum(gBattleMons[battlerId].species), 1); u32 ability = GetBattlerAbility(battlerId); u32 holdEffect = GetBattlerHoldEffect(battlerId, TRUE); @@ -4487,8 +4488,18 @@ u32 GetBattlerWeight(u8 battlerId) if (holdEffect == HOLD_EFFECT_FLOAT_STONE) weight /= 2; - if (gDisableStructs[battlerId].autonomizeCount) - weight -= 1000 * gDisableStructs[battlerId].autonomizeCount; + for (i = 0; i < gDisableStructs[battlerId].autonomizeCount; i++) + { + if (weight > 1000) + { + weight -= 1000; + } + else if (weight <= 1000) + { + weight = 1; + break; + } + } if (weight == 0) weight = 1; diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index d335c49ea7..93265a3405 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -5397,7 +5397,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_SPECIAL, }, { // MOVE_JUDGMENT - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_JUDGMENT, .power = 100, .type = TYPE_NORMAL, .accuracy = 100, @@ -5709,7 +5709,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_SPECIAL, }, { // MOVE_AUTOTOMIZE - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (raises the user's Speed stat by two stages BUT also decreases the user's weight by 100kg) + .effect = EFFECT_AUTONOMIZE, .power = 0, .type = TYPE_STEEL, .accuracy = 0, @@ -6561,7 +6561,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_SPECIAL, }, { // MOVE_TECHNO_BLAST - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_TECHNO_BLAST, .power = 120, .type = TYPE_NORMAL, .accuracy = 100, From fafcedc722d47d091c8b587459452b9c8464f35f Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 22 Sep 2018 17:35:30 +0200 Subject: [PATCH 133/667] Clean gen7 moves data merge --- src/data/battle_moves.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 217ed61e47..6858d869e9 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -5997,12 +5997,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_PHYSICAL, }, { // MOVE_CLEAR_SMOG - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (Always bypasses accuracy, but same as Haze) + .effect = EFFECT_CLEAR_SMOG, .power = 50, .type = TYPE_POISON, .accuracy = 0, .pp = 15, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, @@ -6117,7 +6117,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_STATUS, }, { // MOVE_CIRCLE_THROW - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (similar to whirlwind, but different) + .effect = EFFECT_HIT_SWITCH_TARGET, .power = 60, .type = TYPE_FIGHTING, .accuracy = 90, @@ -6189,7 +6189,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_PHYSICAL, }, { // MOVE_FINAL_GAMBIT - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_HIT_SWITCH_TARGET, .power = 1, .type = TYPE_FIGHTING, .accuracy = 100, @@ -6309,7 +6309,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_SPECIAL, }, { // MOVE_DRAGON_TAIL - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_HIT_SWITCH_TARGET, .power = 60, .type = TYPE_DRAGON, .accuracy = 90, @@ -7500,7 +7500,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_PHYSICAL, }, { // MOVE_BANEFUL_BUNKER - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_PLACEHOLDER, .power = 0, .type = TYPE_POISON, .accuracy = 0, @@ -7632,7 +7632,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_STATUS, }, { // MOVE_TOXIC_THREAD - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_TOXIC_THREAD, .power = 20, .type = TYPE_POISON, .accuracy = 100, @@ -7704,7 +7704,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_PHYSICAL, }, { // MOVE_PSYCHIC_TERRAIN - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_PSYCHIC_TERRAIN, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -7796,7 +7796,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = 0FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MAGICCOAT_AFFECTED, .split = SPLIT_STATUS, }, { // MOVE_REVELATION_DANCE From 19e1606595e8bfa1a74b7283b7563c381ab65790 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 22 Sep 2018 18:37:03 +0200 Subject: [PATCH 134/667] Add Copycat --- asm/macros/battle_script.inc | 5 ++++ data/battle_scripts_1.s | 13 ++++++++++ include/battle.h | 1 + include/constants/battle_move_effects.h | 1 + include/constants/battle_script_commands.h | 1 + src/battle_main.c | 2 ++ src/battle_script_commands.c | 30 ++++++++++++++++++++++ src/data/battle_moves.h | 2 +- 8 files changed, 54 insertions(+), 1 deletion(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index fb34f4fc5b..12bc6f531b 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1496,6 +1496,11 @@ .4byte \ptr .endm + .macro trycopycat ptr + various BS_ATTACKER, VARIOUS_TRY_COPYCAT + .4byte \ptr + .endm + @ helpful macros .macro setstatchanger stat, stages, down setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index efd3e8e39e..fd27394fee 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -316,6 +316,19 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectTechnoBlast .4byte BattleScript_EffectJudgment .4byte BattleScript_EffectAutonomize + .4byte BattleScript_EffectCopycat + +BattleScript_EffectCopycat: + attackcanceler + attackstring + pause 0x5 + trycopycat BattleScript_CopycatFail + attackanimation + waitanimation + jumptorandomattack TRUE +BattleScript_CopycatFail: + ppreduce + goto BattleScript_ButItFailed BattleScript_EffectAutonomize: setstatchanger STAT_SPEED, 2, FALSE diff --git a/include/battle.h b/include/battle.h index e35f2e635a..576388243b 100644 --- a/include/battle.h +++ b/include/battle.h @@ -827,6 +827,7 @@ 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 u16 gMoveResultFlags; diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 93f4f727e6..c67ea43a1c 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -305,5 +305,6 @@ #define EFFECT_TECHNO_BLAST 299 #define EFFECT_JUDGMENT 300 #define EFFECT_AUTONOMIZE 301 +#define EFFECT_COPYCAT 302 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 062db7ccc5..9dc0f664c5 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -105,6 +105,7 @@ #define VARIOUS_ARGUMENT_STATUS_EFFECT 53 #define VARIOUS_TRY_HIT_SWITCH_TARGET 54 #define VARIOUS_TRY_AUTONOMIZE 55 +#define VARIOUS_TRY_COPYCAT 56 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/src/battle_main.c b/src/battle_main.c index cbd4945e70..638fc3e580 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -246,6 +246,7 @@ 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 u16 gMoveResultFlags = 0; @@ -3009,6 +3010,7 @@ static void BattleStartClearSetData(void) gPalaceSelectionBattleScripts[i] = 0; } + gLastUsedMove = 0; gFieldStatuses = 0; memset(&gFieldTimers, 0, sizeof(gFieldTimers)); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ec4d6bca73..e22eed110e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -785,9 +785,11 @@ static const u16 sProtectSuccessRates[] = {USHRT_MAX, USHRT_MAX / 2, USHRT_MAX / #define MIMIC_FORBIDDEN_END 0xFFFE #define METRONOME_FORBIDDEN_END 0xFFFF #define ASSIST_FORBIDDEN_END 0xFFFF +#define COPYCAT_FORBIDDEN_END 0xFFFF static const u16 sMovesForbiddenToCopy[] = { + MOVE_TRANSFORM, MOVE_METRONOME, MOVE_STRUGGLE, MOVE_SKETCH, @@ -807,6 +809,15 @@ static const u16 sMovesForbiddenToCopy[] = MOVE_COVET, MOVE_TRICK, MOVE_FOCUS_PUNCH, + MOVE_CIRCLE_THROW, + MOVE_DRAGON_TAIL, + MOVE_RAGE_POWDER, + MOVE_MAT_BLOCK, + MOVE_SPIKY_SHIELD, + MOVE_SHELL_TRAP, + MOVE_SPOTLIGHT, + MOVE_FEINT, + MOVE_KING_S_SHIELD, METRONOME_FORBIDDEN_END }; @@ -4241,6 +4252,7 @@ static void atk49_moveend(void) if (gHitMarker & HITMARKER_ATTACKSTRING_PRINTED) { gLastPrintedMoves[gBattlerAttacker] = gChosenMove; + gLastUsedMove = gCurrentMove; } if (!(gAbsentBattlerFlags & gBitTable[gBattlerAttacker]) && !(gBattleStruct->field_91 & gBitTable[gBattlerAttacker]) @@ -6746,6 +6758,24 @@ static void atk76_various(void) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); } return; + case VARIOUS_TRY_COPYCAT: + for (i = 0; sMovesForbiddenToCopy[i] != COPYCAT_FORBIDDEN_END; i++) + { + if (sMovesForbiddenToCopy[i] == gLastUsedMove) + break; + } + if (gLastUsedMove == 0 || gLastUsedMove == 0xFFFF || sMovesForbiddenToCopy[i] != COPYCAT_FORBIDDEN_END) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + } + else + { + gRandomMove = gLastUsedMove; + gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); + gBattlerTarget = GetMoveTarget(gRandomMove, 0); + gBattlescriptCurrInstr += 7; + } + return; } gBattlescriptCurrInstr += 3; diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 6858d869e9..50c202328a 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -4601,7 +4601,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_STATUS, }, { // MOVE_COPYCAT - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_COPYCAT, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, From 37d8859404a7a4758807ca905c0248d1547c793a Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 22 Sep 2018 19:27:56 +0200 Subject: [PATCH 135/667] random move to called move --- data/battle_scripts_1.s | 4 ++-- src/battle_script_commands.c | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 6fa9059cae..19406a750e 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -325,7 +325,7 @@ BattleScript_EffectCopycat: trycopycat BattleScript_CopycatFail attackanimation waitanimation - jumptorandomattack TRUE + jumptocalledmove TRUE BattleScript_CopycatFail: ppreduce goto BattleScript_ButItFailed @@ -748,7 +748,7 @@ BattleScript_EffectMeFirst: waitanimation setbyte sB_ANIM_TURN, 0x0 setbyte sB_ANIM_TARGETS_HIT, 0x0 - jumptorandomattack TRUE + jumptocalledmove TRUE BattleScript_EffectAttackSpAttackUp: attackcanceler diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c315624ae7..c352f7521f 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6597,9 +6597,9 @@ static void atk76_various(void) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); break; default: - gRandomMove = move; + gCalledMove = move; gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gBattlerTarget = GetMoveTarget(gRandomMove, 0); + gBattlerTarget = GetMoveTarget(gCalledMove, 0); gStatuses3[gBattlerAttacker] |= STATUS3_ME_FIRST; gBattlescriptCurrInstr += 7; break; @@ -6770,9 +6770,9 @@ static void atk76_various(void) } else { - gRandomMove = gLastUsedMove; + gCalledMove = gLastUsedMove; gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gBattlerTarget = GetMoveTarget(gRandomMove, 0); + gBattlerTarget = GetMoveTarget(gCalledMove, 0); gBattlescriptCurrInstr += 7; } return; From 80523b4257bbfce349faf1b33231cb12dc46ddf4 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sun, 23 Sep 2018 01:01:57 -0300 Subject: [PATCH 136/667] Update move_names.h Gen. 7 moves' names --- src/data/text/move_names.h | 50 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/data/text/move_names.h b/src/data/text/move_names.h index 032496a860..c26a10d993 100644 --- a/src/data/text/move_names.h +++ b/src/data/text/move_names.h @@ -622,4 +622,54 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [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_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"), }; From aa7fab8b66dc3c6fc10e549984428388d107c0e5 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sun, 23 Sep 2018 01:41:12 -0300 Subject: [PATCH 137/667] Update move_descriptions.h -Added 4 move descriptions that were missing (Darkest Lariat, Ice Hammer, Anchor Shot and Power Trip). -Added the table with the pointers for the Gen. 7 moves descriptions. --- src/data/text/move_descriptions.h | 66 +++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/src/data/text/move_descriptions.h b/src/data/text/move_descriptions.h index 1a4e46af41..ef27190f24 100644 --- a/src/data/text/move_descriptions.h +++ b/src/data/text/move_descriptions.h @@ -2345,10 +2345,18 @@ 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."); @@ -2393,6 +2401,10 @@ 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."); @@ -2405,6 +2417,10 @@ 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."); @@ -3145,4 +3161,54 @@ const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] = [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_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, }; From 6b7a171dbe46012006c06bb7fde3676d25e38d3e Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 23 Sep 2018 14:24:06 +0200 Subject: [PATCH 138/667] Ability pop-up fail, maybe will do something about it later --- asm/macros/battle_script.inc | 4 + data/battle_scripts_1.s | 1 + graphics/battle_interface/ability_pop_up.png | Bin 0 -> 343 bytes include/battle_interface.h | 1 + include/constants/battle_script_commands.h | 1 + src/battle_interface.c | 265 +++++++++++++++++++ src/battle_script_commands.c | 3 + 7 files changed, 275 insertions(+) create mode 100644 graphics/battle_interface/ability_pop_up.png diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 393f7f708f..dd9aab55a3 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1501,6 +1501,10 @@ .4byte \ptr .endm + .macro testabilitypopup battler + various \battler, VARIOUS_ABILITY_POPUP + .endm + @ helpful macros .macro setstatchanger stat, stages, down setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 19406a750e..ced9acefe9 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1261,6 +1261,7 @@ BattleScript_HitEscapeEnd: end BattleScript_EffectPlaceholder: + testabilitypopup BS_BATTLER_0 attackcanceler printstring STRINGID_NOTDONEYET goto BattleScript_MoveEnd diff --git a/graphics/battle_interface/ability_pop_up.png b/graphics/battle_interface/ability_pop_up.png new file mode 100644 index 0000000000000000000000000000000000000000..4a36c3e697dcbc56485196a2e65756d262d26897 GIT binary patch literal 343 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e_7YEDSN2DoVj>32o1(=20fod% zTq8 0) + { + do + { + 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 + 1]; + u8 text2[MAX_CHARS_PRINTED + 1]; + + for (i = 0; i < MAX_CHARS_PRINTED; 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); + RemoveWindow(windowId); + + if (i == MAX_CHARS_PRINTED) + { + 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); + 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, + 1, + 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); +} + +void CreateAbilityPopUp(u8 battlerId, u32 ability) +{ + u8 spriteId1, spriteId2; + + LoadSpriteSheet(&sSpriteSheet_AbilityPopUp); + LoadSpritePalette(&sSpritePalette_AbilityPopUp); + + spriteId1 = CreateSprite(&sSpriteTemplate_AbilityPopUp1, + sAbilityPopUpCoords[battlerId][0] + ABILITY_POP_UP_POS_X_SLIDE, + sAbilityPopUpCoords[battlerId][1], 0); + spriteId2 = CreateSprite(&sSpriteTemplate_AbilityPopUp2, + sAbilityPopUpCoords[battlerId][0] + ABILITY_POP_UP_POS_X_SLIDE + ABILITY_POP_UP_POS_X_DIFF, + sAbilityPopUpCoords[battlerId][1], 0); + + StartSpriteAnim(&gSprites[spriteId1], 0); + StartSpriteAnim(&gSprites[spriteId2], 0); + + gSprites[spriteId1].tBattlerId = battlerId; + gSprites[spriteId2].tBattlerId = battlerId; + + PrintBattlerOnAbilityPopUp(battlerId, spriteId1, spriteId2); + PrintAbilityOnAbilityPopUp(ability, spriteId1, spriteId2); +} + +static void SpriteCb_AbilityPopUp1(struct Sprite *sprite) +{ + if (!sprite->tHide) // Show + { + sprite->pos1.x -= 3; + if (sprite->pos1.x <= sAbilityPopUpCoords[sprite->tBattlerId][0]) + { + sprite->pos1.x = sAbilityPopUpCoords[sprite->tBattlerId][0]; + sprite->tHide = TRUE; + sprite->tFrames = 42; + } + } + else // Hide + { + if (sprite->tFrames == 0) + { + sprite->pos1.x += 3; + if (sprite->pos1.x >= sAbilityPopUpCoords[sprite->tBattlerId][0] + ABILITY_POP_UP_POS_X_SLIDE) + { + DestroySprite(sprite); + FreeSpriteTilesByTag(ABILITY_POP_UP_TAG); + FreeSpritePaletteByTag(ABILITY_POP_UP_TAG); + } + } + else + { + sprite->tFrames--; + } + } +} + +static void SpriteCb_AbilityPopUp2(struct Sprite *sprite) +{ + if (!sprite->tHide) // Show + { + sprite->pos1.x -= 3; + if (sprite->pos1.x <= sAbilityPopUpCoords[sprite->tBattlerId][0] + ABILITY_POP_UP_POS_X_DIFF) + { + sprite->pos1.x = sAbilityPopUpCoords[sprite->tBattlerId][0] + ABILITY_POP_UP_POS_X_DIFF; + sprite->tHide = TRUE; + sprite->tFrames = 42; + } + } + else // Hide + { + if (sprite->tFrames == 0) + { + sprite->pos1.x += 3; + if (sprite->pos1.x >= sAbilityPopUpCoords[sprite->tBattlerId][0] + ABILITY_POP_UP_POS_X_SLIDE + ABILITY_POP_UP_POS_X_DIFF) + { + DestroySprite(sprite); + FreeSpriteTilesByTag(ABILITY_POP_UP_TAG); + FreeSpritePaletteByTag(ABILITY_POP_UP_TAG); + } + } + else + { + sprite->tFrames--; + } + } +} diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c352f7521f..12b8f020bc 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6776,6 +6776,9 @@ static void atk76_various(void) gBattlescriptCurrInstr += 7; } return; + case VARIOUS_ABILITY_POPUP: + CreateAbilityPopUp(gActiveBattler, ABILITY_SPEED_BOOST); + break; } gBattlescriptCurrInstr += 3; From 3f2beff5542619ab54fa027d2fb272ce8e0dd951 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 23 Sep 2018 19:03:53 +0200 Subject: [PATCH 139/667] Defog --- asm/macros/battle_script.inc | 6 +++ data/battle_scripts_1.s | 41 +++++++++++++-- include/battle_message.h | 2 +- include/battle_scripts.h | 1 + include/constants/battle_move_effects.h | 1 + include/constants/battle_script_commands.h | 1 + src/battle_script_commands.c | 59 ++++++++++++++++++++++ src/battle_util.c | 4 +- src/data/battle_moves.h | 2 +- 9 files changed, 111 insertions(+), 6 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index dd9aab55a3..7ab193591f 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1505,6 +1505,12 @@ various \battler, VARIOUS_ABILITY_POPUP .endm + .macro defogclear battler, clear, ptr + various \battler, VARIOUS_DEFOG + .byte \clear + .4byte \ptr + .endm + @ helpful macros .macro setstatchanger stat, stages, down setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index ced9acefe9..f88bbf8b5b 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -317,6 +317,41 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectJudgment .4byte BattleScript_EffectAutonomize .4byte BattleScript_EffectCopycat + .4byte BattleScript_EffectDefog + +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 0x1, 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 @@ -4370,10 +4405,10 @@ BattleScript_SideStatusWoreOff:: waitmessage 0x40 end2 -BattleScript_AuroraVeilEnds:: - printstring STRINGID_AURORAVEILENDS +BattleScript_SideStatusWoreOffReturn:: + printstring STRINGID_PKMNSXWOREOFF waitmessage 0x40 - end2 + return BattleScript_LuckyChantEnds:: printstring STRINGID_LUCKYCHANTENDS diff --git a/include/battle_message.h b/include/battle_message.h index 6e3522c4f4..9923230c02 100644 --- a/include/battle_message.h +++ b/include/battle_message.h @@ -157,7 +157,7 @@ { \ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \ textVar[1] = B_BUFF_MOVE; \ - textVar[2] = move; \ + textVar[2] = move & 0xFF; \ textVar[3] = (move & 0xFF00) >> 8; \ textVar[4] = B_BUFF_EOS; \ } diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 91e0a8df62..4370504e75 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -277,5 +277,6 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index c67ea43a1c..76e5182fdd 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -306,5 +306,6 @@ #define EFFECT_JUDGMENT 300 #define EFFECT_AUTONOMIZE 301 #define EFFECT_COPYCAT 302 +#define EFFECT_DEFOG 303 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 856e3f7955..656bed8ddb 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -107,6 +107,7 @@ #define VARIOUS_TRY_AUTONOMIZE 55 #define VARIOUS_TRY_COPYCAT 56 #define VARIOUS_ABILITY_POPUP 57 +#define VARIOUS_DEFOG 58 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 12b8f020bc..d48ce23fbc 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6190,6 +6190,49 @@ bool32 CanUseLastResort(u8 battlerId) return FALSE; } +#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; +} + static void atk76_various(void) { struct Pokemon *mon; @@ -6779,6 +6822,22 @@ static void atk76_various(void) case VARIOUS_ABILITY_POPUP: CreateAbilityPopUp(gActiveBattler, ABILITY_SPEED_BOOST); 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; } gBattlescriptCurrInstr += 3; diff --git a/src/battle_util.c b/src/battle_util.c index ac18098220..aca2a4dea0 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -950,7 +950,9 @@ u8 DoFieldEndTurnEffects(void) if (--gSideTimers[side].auroraVeilTimer == 0) { gSideStatuses[side] &= ~SIDE_STATUS_AURORA_VEIL; - BattleScriptExecute(BattleScript_AuroraVeilEnds); + BattleScriptExecute(BattleScript_SideStatusWoreOff); + gBattleCommunication[MULTISTRING_CHOOSER] = side; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_AURORA_VEIL); effect++; } } diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 50c202328a..50a83ebc31 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -5193,7 +5193,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_PHYSICAL, }, { // MOVE_DEFOG - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_DEFOG, .power = 0, .type = TYPE_FLYING, .accuracy = 0, From 312d3a42d27ef63ecc6911ae6d7756ec0067f3cd Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 24 Sep 2018 20:29:06 +0200 Subject: [PATCH 140/667] Fix jumpifsideaffecting glitch --- asm/macros/battle_script.inc | 1 + 1 file changed, 1 insertion(+) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 7ab193591f..7334d0d912 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -149,6 +149,7 @@ .macro jumpifsideaffecting battler, sidestatus, param2 .byte 0x1f + .byte \battler .4byte \sidestatus .4byte \param2 .endm From 731ff38067882c0d0728e1bc98b31d716262f1fa Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 29 Sep 2018 12:47:35 +0200 Subject: [PATCH 141/667] Ability pop-up functionality is done --- data/battle_scripts_1.s | 2 +- graphics/battle_interface/ability_pop_up.png | Bin 343 -> 365 bytes include/battle.h | 1 + include/battle_interface.h | 2 +- src/battle_interface.c | 276 ++++++++++++++----- src/battle_script_commands.c | 2 +- 6 files changed, 213 insertions(+), 70 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index f88bbf8b5b..bcd5fa9382 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1296,7 +1296,7 @@ BattleScript_HitEscapeEnd: end BattleScript_EffectPlaceholder: - testabilitypopup BS_BATTLER_0 + testabilitypopup BS_TARGET attackcanceler printstring STRINGID_NOTDONEYET goto BattleScript_MoveEnd diff --git a/graphics/battle_interface/ability_pop_up.png b/graphics/battle_interface/ability_pop_up.png index 4a36c3e697dcbc56485196a2e65756d262d26897..4b549b1b5380aa3dae7759e635044ff58ea47d3d 100644 GIT binary patch delta 254 zcmcc4^pok1J~8ciI*mt_}4RTjP7ronjW3+?-*(=ADAAQ`~3aapMU=|-~f&D zXI}wIF(!GtyZm3u{^=-?GttwJY$in_-iv$BTw< zw(Qp>-8qZzzBj4dtR(bQc-_dV-LW2QF_E)hJ8EazrUY1pZh@QPDnKf@R90}k(nnD@Ssw_&zk lUA0niLyqMy)&~#wD5(F|^xyBACDsG-g{P~Z%Q~loCIE(;UqS!? delta 232 zcmaFMbe(B}4u_bC0rRFPv40ay{OgrB`t~+XPmM10bqu$Z4^EBDfBydK&%gf}aDXi) ztE_-hj7i?^F8`OZe>w`}RC~HOhE&XXJLMp6g8~EdYUve)j7M2{tQrbg!!HQN-2e6A zc3s7U6SX_pO>`M 0) { do { - CpuCopy32(windowTileData + 20, dest + 20, 12); + if (arg3) + CpuCopy32(windowTileData + 16, dest + 16, 16); + else + CpuCopy32(windowTileData + 20, dest + 20, 12); dest += 32, windowTileData += 32; arg2--; } while (arg2 != 0); @@ -2943,7 +2959,7 @@ static void PrintOnAbilityPopUp(const u8 *str, u8 *spriteTileData1, u8 *spriteTi u8 text1[MAX_CHARS_PRINTED + 1]; u8 text2[MAX_CHARS_PRINTED + 1]; - for (i = 0; i < MAX_CHARS_PRINTED; i++) + for (i = 0; i < MAX_CHARS_PRINTED + 1; i++) { text1[i] = str[i]; if (text1[i] == EOS) @@ -2952,10 +2968,10 @@ static void PrintOnAbilityPopUp(const u8 *str, u8 *spriteTileData1, u8 *spriteTi text1[i] = EOS; windowTileData = AddTextPrinterAndCreateWindowOnAbilityPopUp(text1, x1, y, color1, color2, color3, &windowId); - TextIntoAbilityPopUp(spriteTileData1, windowTileData, 8); + TextIntoAbilityPopUp(spriteTileData1, windowTileData, 8, (y == 0)); RemoveWindow(windowId); - if (i == MAX_CHARS_PRINTED) + if (i == MAX_CHARS_PRINTED + 1) { for (i = 0; i < MAX_CHARS_PRINTED; i++) { @@ -2966,7 +2982,7 @@ static void PrintOnAbilityPopUp(const u8 *str, u8 *spriteTileData1, u8 *spriteTi text2[i] = EOS; windowTileData = AddTextPrinterAndCreateWindowOnAbilityPopUp(text2, x2, y, color1, color2, color3, &windowId); - TextIntoAbilityPopUp(spriteTileData2, windowTileData, 1); + TextIntoAbilityPopUp(spriteTileData2, windowTileData, 1, (y == 0)); RemoveWindow(windowId); } } @@ -2977,7 +2993,7 @@ static void PrintBattlerOnAbilityPopUp(u8 battlerId, u8 spriteId1, u8 spriteId2) (void*)(OBJ_VRAM0) + (gSprites[spriteId1].oam.tileNum * 32), (void*)(OBJ_VRAM0) + (gSprites[spriteId2].oam.tileNum * 32), 7, 0, - 1, + 0, 2, 7, 1); } @@ -2991,52 +3007,197 @@ static void PrintAbilityOnAbilityPopUp(u32 ability, u8 spriteId1, u8 spriteId2) 7, 9, 1); } -void CreateAbilityPopUp(u8 battlerId, u32 ability) +#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] = { - u8 spriteId1, spriteId2; + {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}, - LoadSpriteSheet(&sSpriteSheet_AbilityPopUp); - LoadSpritePalette(&sSpritePalette_AbilityPopUp); + {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}, - spriteId1 = CreateSprite(&sSpriteTemplate_AbilityPopUp1, - sAbilityPopUpCoords[battlerId][0] + ABILITY_POP_UP_POS_X_SLIDE, - sAbilityPopUpCoords[battlerId][1], 0); - spriteId2 = CreateSprite(&sSpriteTemplate_AbilityPopUp2, - sAbilityPopUpCoords[battlerId][0] + ABILITY_POP_UP_POS_X_SLIDE + ABILITY_POP_UP_POS_X_DIFF, - sAbilityPopUpCoords[battlerId][1], 0); + {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}, - StartSpriteAnim(&gSprites[spriteId1], 0); - StartSpriteAnim(&gSprites[spriteId2], 0); + {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 (!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].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)); } -static void SpriteCb_AbilityPopUp1(struct Sprite *sprite) +#define FRAMES_TO_WAIT 48 + +static void SpriteCb_AbilityPopUp(struct Sprite *sprite) { if (!sprite->tHide) // Show { - sprite->pos1.x -= 3; - if (sprite->pos1.x <= sAbilityPopUpCoords[sprite->tBattlerId][0]) + if ((!sprite->tRightToLeft && (sprite->pos1.x -= 3) <= sprite->tOriginalX) + || (sprite->tRightToLeft && (sprite->pos1.x += 3) >= sprite->tOriginalX) + ) { - sprite->pos1.x = sAbilityPopUpCoords[sprite->tBattlerId][0]; + sprite->pos1.x = sprite->tOriginalX; sprite->tHide = TRUE; - sprite->tFrames = 42; + sprite->tFrames = FRAMES_TO_WAIT; } } else // Hide { if (sprite->tFrames == 0) { - sprite->pos1.x += 3; - if (sprite->pos1.x >= sAbilityPopUpCoords[sprite->tBattlerId][0] + ABILITY_POP_UP_POS_X_SLIDE) + if ((!sprite->tRightToLeft && (sprite->pos1.x += 3) >= sprite->tOriginalX + ABILITY_POP_UP_POS_X_SLIDE) + ||(sprite->tRightToLeft && (sprite->pos1.x -= 3) <= sprite->tOriginalX - ABILITY_POP_UP_POS_X_SLIDE) + ) { + gBattleStruct->activeAbilityPopUps &= ~(gBitTable[sprite->tBattlerId]); DestroySprite(sprite); - FreeSpriteTilesByTag(ABILITY_POP_UP_TAG); - FreeSpritePaletteByTag(ABILITY_POP_UP_TAG); } } else @@ -3046,33 +3207,14 @@ static void SpriteCb_AbilityPopUp1(struct Sprite *sprite) } } -static void SpriteCb_AbilityPopUp2(struct Sprite *sprite) +static void Task_FreeAbilityPopUpGfx(u8 taskId) { - if (!sprite->tHide) // Show + if (!gSprites[gTasks[taskId].tSpriteId1].inUse + && !gSprites[gTasks[taskId].tSpriteId2].inUse + && !gBattleStruct->activeAbilityPopUps) { - sprite->pos1.x -= 3; - if (sprite->pos1.x <= sAbilityPopUpCoords[sprite->tBattlerId][0] + ABILITY_POP_UP_POS_X_DIFF) - { - sprite->pos1.x = sAbilityPopUpCoords[sprite->tBattlerId][0] + ABILITY_POP_UP_POS_X_DIFF; - sprite->tHide = TRUE; - sprite->tFrames = 42; - } - } - else // Hide - { - if (sprite->tFrames == 0) - { - sprite->pos1.x += 3; - if (sprite->pos1.x >= sAbilityPopUpCoords[sprite->tBattlerId][0] + ABILITY_POP_UP_POS_X_SLIDE + ABILITY_POP_UP_POS_X_DIFF) - { - DestroySprite(sprite); - FreeSpriteTilesByTag(ABILITY_POP_UP_TAG); - FreeSpritePaletteByTag(ABILITY_POP_UP_TAG); - } - } - else - { - sprite->tFrames--; - } + FreeSpriteTilesByTag(ABILITY_POP_UP_TAG); + FreeSpritePaletteByTag(ABILITY_POP_UP_TAG); + DestroyTask(taskId); } } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d48ce23fbc..15b50f6eda 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6820,7 +6820,7 @@ static void atk76_various(void) } return; case VARIOUS_ABILITY_POPUP: - CreateAbilityPopUp(gActiveBattler, ABILITY_SPEED_BOOST); + CreateAbilityPopUp(gActiveBattler, gBattleMons[gActiveBattler].ability, (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) != 0); break; case VARIOUS_DEFOG: if (T1_READ_8(gBattlescriptCurrInstr + 3)) // Clear From cbaae44f9f48453dc2ad085fa6142d7084d2f63a Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 29 Sep 2018 13:36:33 +0200 Subject: [PATCH 142/667] Add pop-up to battlescripts --- asm/macros/battle_script.inc | 2 +- data/battle_scripts_1.s | 53 ++++++++++++++++++++-- include/battle.h | 1 + include/constants/battle_script_commands.h | 1 + src/battle_interface.c | 8 +++- src/battle_main.c | 1 + src/battle_util.c | 8 +++- 7 files changed, 66 insertions(+), 8 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 7334d0d912..19755a579a 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1502,7 +1502,7 @@ .4byte \ptr .endm - .macro testabilitypopup battler + .macro showabilitypopup battler various \battler, VARIOUS_ABILITY_POPUP .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index bcd5fa9382..5e4b11218c 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1296,7 +1296,7 @@ BattleScript_HitEscapeEnd: end BattleScript_EffectPlaceholder: - testabilitypopup BS_TARGET + showabilitypopup BS_TARGET attackcanceler printstring STRINGID_NOTDONEYET goto BattleScript_MoveEnd @@ -5351,13 +5351,21 @@ 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_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 @@ -5365,12 +5373,14 @@ BattleScript_SpeedBoostActivates:: BattleScript_TraceActivates:: pause 0x20 + call BattleScript_AbilityPopUp printstring STRINGID_PKMNTRACED waitmessage 0x40 switchinabilities BS_ATTACKER end3 BattleScript_RainDishActivates:: + call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXRESTOREDHPALITTLE2 waitmessage 0x40 orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE @@ -5380,12 +5390,14 @@ BattleScript_RainDishActivates:: 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 @@ -5395,6 +5407,7 @@ BattleScript_SolarPowerActivates:: BattleScript_SandstreamActivates:: pause 0x20 + call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXWHIPPEDUPSANDSTORM waitstate playanimation BS_BATTLER_0, B_ANIM_SANDSTORM_CONTINUES, NULL @@ -5402,6 +5415,7 @@ BattleScript_SandstreamActivates:: end3 BattleScript_ShedSkinActivates:: + call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXCUREDYPROBLEM waitmessage 0x40 updatestatusicon BS_ATTACKER @@ -5420,6 +5434,7 @@ BattleScript_CastformChange:: end3 BattleScript_82DB4AF:: + call BattleScript_AbilityPopUp docastformchangeanimation waitstate printstring STRINGID_PKMNTRANSFORMED @@ -5435,6 +5450,7 @@ BattleScript_PauseIntimidateActivates: BattleScript_IntimidateActivates:: setbyte gBattlerTarget, 0x0 setstatchanger STAT_ATK, 1, TRUE + call BattleScript_AbilityPopUp BattleScript_IntimidateActivatesLoop: trygetintimidatetarget BattleScript_IntimidateActivatesReturn jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_IntimidateActivatesLoopIncrement @@ -5460,6 +5476,7 @@ BattleScript_IntimidatePrevented: BattleScript_DroughtActivates:: pause 0x20 + call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXINTENSIFIEDSUN waitstate playanimation BS_BATTLER_0, B_ANIM_SUN_CONTINUES, NULL @@ -5468,6 +5485,7 @@ BattleScript_DroughtActivates:: BattleScript_SnowWarningActivates:: pause 0x20 + call BattleScript_AbilityPopUp printstring STRINGID_SNOWWARNINGHAIL waitstate playanimation BS_BATTLER_0, B_ANIM_HAIL_CONTINUES, NULL @@ -5476,6 +5494,7 @@ BattleScript_SnowWarningActivates:: BattleScript_BadDreamsActivates:: setbyte gBattlerTarget, 0 + call BattleScript_AbilityPopUp BattleScript_BadDreamsLoop: trygetbaddreamstarget BattleScript_BadDreamsEnd dmg_1_8_targethp @@ -5502,12 +5521,14 @@ BattleScript_TookAttack:: BattleScript_SturdyPreventsOHKO:: pause 0x20 + call BattleScript_AbilityPopUp printstring STRINGID_PKMNPROTECTEDBY pause 0x40 goto BattleScript_MoveEnd BattleScript_DampStopsExplosion:: pause 0x20 + call BattleScript_AbilityPopUp printstring STRINGID_PKMNPREVENTSUSAGE pause 0x40 goto BattleScript_MoveEnd @@ -5542,6 +5563,7 @@ BattleScript_MonMadeMoveUseless_PPLoss:: BattleScript_MonMadeMoveUseless:: attackstring pause 0x20 + call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXMADEYUSELESS waitmessage 0x40 orhalfword gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE @@ -5552,18 +5574,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 @@ -5588,18 +5613,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 @@ -5608,12 +5636,14 @@ BattleScript_SoundproofProtected:: attackstring ppreduce pause 0x20 + call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXBLOCKSY waitmessage 0x40 goto BattleScript_MoveEnd BattleScript_AbilityNoSpecificStatLoss:: pause 0x20 + call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXPREVENTSYLOSS waitmessage 0x40 setbyte cMULTISTRING_CHOOSER, 0x3 @@ -5621,21 +5651,25 @@ 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_CursedBodyActivates:: + call BattleScript_AbilityPopUp printstring STRINGID_CUSEDBODYDISABLED waitmessage 0x40 return BattleScript_MummyActivates:: + call BattleScript_AbilityPopUp printstring STRINGID_ATTACKERACQUIREDABILITY waitmessage 0x40 return @@ -5643,6 +5677,7 @@ BattleScript_MummyActivates:: BattleScript_AngryPointActivates:: setbyte sB_ANIM_ARG1 0x38 setbyte sB_ANIM_ARG2 0x0 + call BattleScript_AbilityPopUp playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printstring STRINGID_ANGRYPOINTACTIVATES waitmessage 0x40 @@ -5650,6 +5685,7 @@ BattleScript_AngryPointActivates:: BattleScript_TargetAbilityStatRaise:: setgraphicalstatchangevalues + call BattleScript_AbilityPopUp playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 waitanimation printstring STRINGID_TARGETABILITYSTATRAISE @@ -5658,6 +5694,7 @@ BattleScript_TargetAbilityStatRaise:: BattleScript_WeakArmorActivates:: setstatchanger STAT_DEF, 1, TRUE + call BattleScript_AbilityPopUp statbuffchange 0x1, BattleScript_WeakArmorActivatesSpeed jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, 0x2, BattleScript_WeakArmorDefAnim jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x3, BattleScript_WeakArmorActivatesSpeed @@ -5689,6 +5726,7 @@ BattleScript_WeakArmorActivatesEnd: BattleScript_AttackerAbilityStatRaise:: setgraphicalstatchangevalues + call BattleScript_AbilityPopUp playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 waitanimation printstring STRINGID_ATTACKERABILITYSTATRAISE @@ -5716,7 +5754,8 @@ BattleScript_SwitchInAbilityMsg:: BattleScript_ImposterActivates:: transformdataexecution - playmoveanimation BS_ATTACKER MOVE_TRANSFORM + call BattleScript_AbilityPopUp + playmoveanimation BS_ATTACKER, MOVE_TRANSFORM waitanimation printstring STRINGID_IMPOSTERTRANSFORM waitmessage 0x40 @@ -5724,6 +5763,7 @@ BattleScript_ImposterActivates:: BattleScript_RoughSkinActivates:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + call BattleScript_AbilityPopUp healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER printstring STRINGID_PKMNHURTSWITH @@ -5732,6 +5772,7 @@ BattleScript_RoughSkinActivates:: return BattleScript_CuteCharmActivates:: + call BattleScript_AbilityPopUp status2animation BS_ATTACKER, STATUS2_INFATUATION printstring STRINGID_PKMNSXINFATUATEDY waitmessage 0x40 @@ -5744,6 +5785,7 @@ BattleScript_ApplySecondaryEffect:: BattleScript_SynchronizeActivates:: waitstate + call BattleScript_AbilityPopUp seteffectprimary return @@ -5754,6 +5796,7 @@ BattleScript_NoItemSteal:: return BattleScript_AbilityCuredStatus:: + call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXCUREDITSYPROBLEM waitmessage 0x40 updatestatusicon BS_SCRIPTING @@ -5772,6 +5815,7 @@ BattleScript_IgnoresAndUsesRandomMove:: jumptocalledmove FALSE BattleScript_MoveUsedLoafingAround:: + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x0, BattleScript_TruantLoafingAround jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, 0x4, BattleScript_82DB6C7 setbyte gBattleCommunication, 0x0 various24 BS_ATTACKER @@ -5781,7 +5825,10 @@ BattleScript_82DB6C7:: waitmessage 0x40 setbyte sMOVEEND_STATE, 0x0 moveend 0x2, 0x10 - end + end +BattleScript_TruantLoafingAround: + call BattleScript_AbilityPopUp + goto BattleScript_82DB6C7 BattleScript_IgnoresAndFallsAsleep:: printstring STRINGID_PKMNBEGANTONAP diff --git a/include/battle.h b/include/battle.h index 46c52145c5..f6e3066e18 100644 --- a/include/battle.h +++ b/include/battle.h @@ -873,6 +873,7 @@ extern u16 gMoveToLearn; extern u8 gBattleMonForms[MAX_BATTLERS_COUNT]; extern u32 gFieldStatuses; extern struct FieldTimer gFieldTimers; +extern u8 gBattlerAbility; extern void (*gPreBattleCallback1)(void); extern void (*gBattleMainFunc)(void); diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 656bed8ddb..90e72e717d 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -48,6 +48,7 @@ #define BS_OPPONENT1 12 #define BS_PLAYER2 13 #define BS_OPPONENT2 14 +#define BS_ABILITY_BATTLER 15 // atk 01, accuracy calc #define NO_ACC_CALC_CHECK_LOCK_ON 0xFFFF diff --git a/src/battle_interface.c b/src/battle_interface.c index 00a40c336f..69d38fc50a 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -2824,6 +2824,7 @@ static void SafariTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 ar #define tFrames data[2] #define tRightToLeft data[3] #define tBattlerId data[4] +#define tIsMain data[5] // for task #define tSpriteId1 data[6] @@ -2907,9 +2908,9 @@ static const struct SpriteTemplate sSpriteTemplate_AbilityPopUp2 = static const s16 sAbilityPopUpCoordsDoubles[MAX_BATTLERS_COUNT][2] = { - {204, 23}, // player left + {29, 80}, // player left {204, 19}, // opponent left - {204, 23}, // player right + {29, 97}, // player right {204, 36}, // opponent right }; @@ -3162,6 +3163,7 @@ void CreateAbilityPopUp(u8 battlerId, u32 ability, bool32 isDoubleBattle) gTasks[taskId].tSpriteId1 = spriteId1; gTasks[taskId].tSpriteId2 = spriteId2; + gSprites[spriteId1].tIsMain = TRUE; gSprites[spriteId1].tBattlerId = battlerId; gSprites[spriteId2].tBattlerId = battlerId; @@ -3179,6 +3181,8 @@ 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 -= 3) <= sprite->tOriginalX) || (sprite->tRightToLeft && (sprite->pos1.x += 3) >= sprite->tOriginalX) ) diff --git a/src/battle_main.c b/src/battle_main.c index abcc543f5e..ce500099f3 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -292,6 +292,7 @@ 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; // IWRAM common vars void (*gPreBattleCallback1)(void); diff --git a/src/battle_util.c b/src/battle_util.c index aca2a4dea0..244c77cd3a 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -275,7 +275,6 @@ static const u16 sTypeEffectivenessTable[NUMBER_OF_MON_TYPES][NUMBER_OF_MON_TYPE {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 - }; #undef X @@ -323,6 +322,8 @@ u8 GetBattlerForBattleScript(u8 caseId) case BS_OPPONENT2: ret = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); break; + case BS_ABILITY_BATTLER: + ret = gBattlerAbility; } return ret; } @@ -2075,6 +2076,7 @@ u8 AtkCanceller_UnableToUseMove(void) CancelMultiTurnMoves(gBattlerAttacker); gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattlerAbility = gBattlerAttacker; gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; gMoveResultFlags |= MOVE_RESULT_MISSED; effect = 1; @@ -3301,7 +3303,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gLastUsedAbility = ABILITY_INTIMIDATE; gStatuses3[i] &= ~(STATUS3_INTIMIDATE_POKES); BattleScriptPushCursorAndCallback(BattleScript_IntimidateActivatesEnd3); - gBattleStruct->intimidateBattler = i; + gBattlerAbility = gBattleStruct->intimidateBattler = i; effect++; break; } @@ -3457,6 +3459,8 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA if (effect && caseID < ABILITYEFFECT_CHECK_OTHER_SIDE && gLastUsedAbility != 0xFF) RecordAbilityBattle(battler, gLastUsedAbility); + if (effect && caseID <= ABILITYEFFECT_MOVE_END) + gBattlerAbility = battler; return effect; } From 2ebffb991283eb90c3310b5746049276720f9a23 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 29 Sep 2018 13:53:37 +0200 Subject: [PATCH 143/667] allow gen7 moves and abilities for debug --- src/battle_debug.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle_debug.c b/src/battle_debug.c index cf5fb881ae..b69f9e0a80 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -1265,7 +1265,7 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) { case LIST_ITEM_ABILITY: data->modifyArrows.minValue = 0; - data->modifyArrows.maxValue = ABILITIES_COUNT_GEN6 - 1; + data->modifyArrows.maxValue = ABILITIES_COUNT_GEN7 - 1; data->modifyArrows.maxDigits = 3; data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].ability; data->modifyArrows.typeOfVal = VAL_U8; @@ -1273,7 +1273,7 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) break; case LIST_ITEM_MOVES: data->modifyArrows.minValue = 0; - data->modifyArrows.maxValue = MOVES_COUNT_GEN6 - 1; + data->modifyArrows.maxValue = MOVES_COUNT_GEN7 - 1; data->modifyArrows.maxDigits = 3; data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].moves[data->currentSecondaryListItemId]; data->modifyArrows.typeOfVal = VAL_U16; From 597299136f766890385d7394af6f9daf856c131c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 29 Sep 2018 14:10:53 +0200 Subject: [PATCH 144/667] Add Pollen Puff effect --- asm/macros/battle_script.inc | 5 +++++ data/battle_scripts_1.s | 5 +++++ include/constants/battle_move_effects.h | 1 + include/constants/battle_script_commands.h | 1 + src/battle_script_commands.c | 6 ++++++ src/data/battle_moves.h | 18 +++++++++--------- 6 files changed, 27 insertions(+), 9 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 19755a579a..689cd8855a 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1512,6 +1512,11 @@ .4byte \ptr .endm + .macro jumpiftargetally ptr + various BS_ATTACKER, VARIOUS_JUMP_IF_TARGET_ALLY + .4byte \ptr + .endm + @ helpful macros .macro setstatchanger stat, stages, down setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 5e4b11218c..1f487d87a7 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -318,6 +318,11 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectAutonomize .4byte BattleScript_EffectCopycat .4byte BattleScript_EffectDefog + .4byte BattleScript_EffectHitEnemyHealAlly + +BattleScript_EffectHitEnemyHealAlly: + jumpiftargetally BattleScript_EffectHealPulse + goto BattleScript_EffectHit BattleScript_EffectDefog: setstatchanger STAT_EVASION, 1, TRUE diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 76e5182fdd..fb641e3299 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -307,5 +307,6 @@ #define EFFECT_AUTONOMIZE 301 #define EFFECT_COPYCAT 302 #define EFFECT_DEFOG 303 +#define EFFECT_HIT_ENEMY_HEAL_ALLY 304 // Pollen Puff #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 90e72e717d..518c6a1036 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -109,6 +109,7 @@ #define VARIOUS_TRY_COPYCAT 56 #define VARIOUS_ABILITY_POPUP 57 #define VARIOUS_DEFOG 58 +#define VARIOUS_JUMP_IF_TARGET_ALLY 59 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 15b50f6eda..4a41b34ad4 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6838,6 +6838,12 @@ static void atk76_various(void) 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; } gBattlescriptCurrInstr += 3; diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 50a83ebc31..ecef5a3a45 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -7680,7 +7680,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_PHYSICAL, }, { // MOVE_POLLEN_PUFF - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_HIT_ENEMY_HEAL_ALLY, .power = 90, .type = TYPE_BUG, .accuracy = 100, @@ -7721,7 +7721,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .type = TYPE_BUG, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, @@ -7733,7 +7733,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .type = TYPE_FIRE, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, @@ -7829,7 +7829,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .type = TYPE_GRASS, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, @@ -7865,7 +7865,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .type = TYPE_DRAGON, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, @@ -7925,7 +7925,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .type = TYPE_FAIRY, .accuracy = 90, .pp = 5, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, @@ -7961,7 +7961,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .type = TYPE_GHOST, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, @@ -7985,7 +7985,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .type = TYPE_WATER, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, @@ -8057,7 +8057,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, From 258f1ea606c9b55a90a71daf4d6c5ab6ccc5d401 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sat, 29 Sep 2018 10:06:10 -0300 Subject: [PATCH 145/667] Update move_names.h Decapped move names and fixed U-Turn's, --- src/data/text/move_names.h | 710 ++++++++++++++++++------------------- 1 file changed, 355 insertions(+), 355 deletions(-) diff --git a/src/data/text/move_names.h b/src/data/text/move_names.h index c26a10d993..79166f1c81 100644 --- a/src/data/text/move_names.h +++ b/src/data/text/move_names.h @@ -1,360 +1,360 @@ 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] = _("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_ROOST] = _("Roost"), [MOVE_GRAVITY] = _("Gravity"), [MOVE_MIRACLE_EYE] = _("Miracle Eye"), @@ -369,7 +369,7 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_TAILWIND] = _("Tailwind"), [MOVE_ACUPRESSURE] = _("Acupressure"), [MOVE_METAL_BURST] = _("Metal Burst"), - [MOVE_U_TURN] = _("U Turn"), + [MOVE_U_TURN] = _("U-Turn"), [MOVE_CLOSE_COMBAT] = _("Close Combat"), [MOVE_PAYBACK] = _("Payback"), [MOVE_ASSURANCE] = _("Assurance"), From ada76cbe4f90c1436eed43a933960a9013703ca7 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 29 Sep 2018 15:43:56 +0200 Subject: [PATCH 146/667] Synchronoise and Smack Down --- asm/macros/battle_script.inc | 5 ++ data/battle_scripts_1.s | 53 ++++++++++++++++++++++ include/battle_scripts.h | 1 + include/battle_util.h | 1 + include/constants/battle.h | 2 +- include/constants/battle_move_effects.h | 2 + include/constants/battle_script_commands.h | 1 + include/constants/battle_string_ids.h | 1 + src/battle_interface.c | 8 ++-- src/battle_message.c | 2 + src/battle_script_commands.c | 15 ++++++ src/battle_util.c | 10 ++++ src/data/battle_moves.h | 8 ++-- 13 files changed, 100 insertions(+), 9 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 689cd8855a..7db4856fad 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1497,6 +1497,11 @@ .4byte \ptr .endm + .macro jumpifcantusesynchronoise ptr + various BS_ATTACKER, VARIOUS_TRY_SYNCHRONOISE + .4byte \ptr + .endm + .macro trycopycat ptr various BS_ATTACKER, VARIOUS_TRY_COPYCAT .4byte \ptr diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 1f487d87a7..125b077f28 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -319,6 +319,59 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectCopycat .4byte BattleScript_EffectDefog .4byte BattleScript_EffectHitEnemyHealAlly + .4byte BattleScript_EffectSmackDown + .4byte BattleScript_EffectSynchronoise + +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: + setbyte sMOVEEND_STATE, 0x0 + moveend 0x2, 0x10 + 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 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 4370504e75..e96babfb5f 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -278,5 +278,6 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/battle_util.h b/include/battle_util.h index 727f9d07f3..3f14bd59f3 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -91,5 +91,6 @@ s32 GetStealthHazardDamage(u8 hazardType, u8 battlerId); u16 GetMegaEvolutionSpecies(u16 preEvoSpecies, u16 heldItemId); bool32 CanMegaEvolve(u8 battlerId); void UndoMegaEvolution(u8 monId); +bool32 DoBattlersShareType(u32 battler1, u32 battler2); #endif // GUARD_BATTLE_UTIL_H diff --git a/include/constants/battle.h b/include/constants/battle.h index a583da05ca..0e61152450 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -314,7 +314,7 @@ #define MOVE_EFFECT_RECOIL_50 0x39 #define MOVE_EFFECT_CLEAR_SMOG 0x3A #define MOVE_EFFECT_SP_ATK_TWO_DOWN 0x3B -#define MOVE_EFFECT_NOTHING_3C 0x3C +#define MOVE_EFFECT_SMACK_DOWN 0x3C #define MOVE_EFFECT_NOTHING_3D 0x3D #define MOVE_EFFECT_NOTHING_3E 0x3E #define MOVE_EFFECT_NOTHING_3F 0x3F diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index fb641e3299..b2d3788012 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -308,5 +308,7 @@ #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 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 518c6a1036..96503f298d 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -110,6 +110,7 @@ #define VARIOUS_ABILITY_POPUP 57 #define VARIOUS_DEFOG 58 #define VARIOUS_JUMP_IF_TARGET_ALLY 59 +#define VARIOUS_TRY_SYNCHRONOISE 60 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 1c4e489751..ba44bdeb1e 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -507,6 +507,7 @@ #define STRINGID_DRASTICALLY 504 #define STRINGID_SEVERELY 505 #define STRINGID_INFESTATION 506 +#define STRINGID_NOEFFECTONTARGET 507 #define BATTLESTRINGS_COUNT 519 diff --git a/src/battle_interface.c b/src/battle_interface.c index 69d38fc50a..f0a3af8420 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -3183,8 +3183,8 @@ static void SpriteCb_AbilityPopUp(struct Sprite *sprite) { if (sprite->tIsMain && ++sprite->tFrames == 4) PlaySE(SE_SELECT); - if ((!sprite->tRightToLeft && (sprite->pos1.x -= 3) <= sprite->tOriginalX) - || (sprite->tRightToLeft && (sprite->pos1.x += 3) >= sprite->tOriginalX) + if ((!sprite->tRightToLeft && (sprite->pos1.x -= 4) <= sprite->tOriginalX) + || (sprite->tRightToLeft && (sprite->pos1.x += 4) >= sprite->tOriginalX) ) { sprite->pos1.x = sprite->tOriginalX; @@ -3196,8 +3196,8 @@ static void SpriteCb_AbilityPopUp(struct Sprite *sprite) { if (sprite->tFrames == 0) { - if ((!sprite->tRightToLeft && (sprite->pos1.x += 3) >= sprite->tOriginalX + ABILITY_POP_UP_POS_X_SLIDE) - ||(sprite->tRightToLeft && (sprite->pos1.x -= 3) <= sprite->tOriginalX - ABILITY_POP_UP_POS_X_SLIDE) + 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]); diff --git a/src/battle_message.c b/src/battle_message.c index d5bbbebcc8..22a32638a6 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -648,6 +648,7 @@ static const u8 sText_MegaEvoEvolved[] = _("{B_ATK_NAME_WITH_PREFIX} has Mega\nE 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}!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { @@ -1147,6 +1148,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_drastically, sText_severely, sText_Infestation, + sText_NoEffectOnTarget, }; const u16 gTerrainStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 4a41b34ad4..e1e58616ad 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2702,6 +2702,15 @@ void SetMoveEffect(bool8 primary, u8 certain) 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; } } } @@ -6844,6 +6853,12 @@ static void atk76_various(void) 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; } gBattlescriptCurrInstr += 3; diff --git a/src/battle_util.c b/src/battle_util.c index 244c77cd3a..17ce185af7 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5670,3 +5670,13 @@ void UndoMegaEvolution(u8 monId) CalculateMonStats(&gPlayerParty[monId]); } } + +bool32 DoBattlersShareType(u32 battler1, u32 battler2) +{ + if (gBattleMons[battler1].type1 == gBattleMons[battler2].type1 || gBattleMons[battler1].type1 == gBattleMons[battler2].type2) + return TRUE; + else if (gBattleMons[battler1].type2 == gBattleMons[battler2].type1 || gBattleMons[battler1].type2 == gBattleMons[battler2].type2) + return TRUE; + else + return FALSE; +} diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index ecef5a3a45..fd25be5de4 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -5757,12 +5757,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_STATUS, }, { // MOVE_SMACK_DOWN - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_SMACK_DOWN, .power = 50, .type = TYPE_ROCK, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, @@ -5829,7 +5829,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_PHYSICAL, }, { // MOVE_SYNCHRONOISE - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_SYNCHRONOISE, .power = 120, .type = TYPE_PSYCHIC, .accuracy = 100, @@ -7416,7 +7416,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_PHYSICAL, }, { // MOVE_LIGHT_OF_RUIN - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (same as HEAD_SMASH) + .effect = EFFECT_RECOIL_50, .power = 140, .type = TYPE_FAIRY, .accuracy = 90, From dddefbb0e3ec43595aed88340924f71da6101f4b Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 29 Sep 2018 16:41:25 +0200 Subject: [PATCH 147/667] Full support for moves hitting all battlers --- asm/macros/battle_script.inc | 1 + data/battle_scripts_1.s | 7 ++++-- include/battle.h | 1 + include/constants/battle_script_commands.h | 1 + src/battle_main.c | 1 + src/battle_script_commands.c | 29 ++++++++++++++++++---- 6 files changed, 33 insertions(+), 7 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 7db4856fad..3174166085 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1529,6 +1529,7 @@ .macro setmoveeffect effect setbyte cEFFECT_CHOOSER \effect + setbyte sSAVED_MOVE_EFFECT \effect .endm .macro chosenstatus1animation battler, status diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 125b077f28..a4948dc898 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1395,7 +1395,6 @@ BattleScript_EffectRound: BattleScript_EffectBrine: BattleScript_EffectVenoshock: BattleScript_EffectRetalitate: -BattleScript_EffectBulldoze: BattleScript_EffectFoulPlay: BattleScript_EffectPsyshock: BattleScript_EffectWeatherBall: @@ -3065,13 +3064,16 @@ BattleScript_EffectStomp: setmoveeffect MOVE_EFFECT_FLINCH goto BattleScript_EffectHit -BattleScript_EffectEarthquake:: +BattleScript_EffectBulldoze: + setmoveeffect MOVE_EFFECT_SPD_MINUS_1 +BattleScript_EffectEarthquake: attackcanceler attackstring ppreduce selectfirstvalidtarget BattleScript_HitsAllWithUndergroundBonusLoop:: movevaluescleanup + copybyte cEFFECT_CHOOSER, sSAVED_MOVE_EFFECT jumpifnostatus3 BS_TARGET, STATUS3_UNDERGROUND, BattleScript_HitsAllNoUndergroundBonus orword gHitMarker, HITMARKER_IGNORE_UNDERGROUND goto BattleScript_DoHitAllWithUndergroundBonus @@ -3093,6 +3095,7 @@ BattleScript_DoHitAllWithUndergroundBonus:: waitmessage 0x40 resultmessage waitmessage 0x40 + seteffectwithchance printstring STRINGID_EMPTYSTRING3 waitmessage 0x1 tryfaintmon BS_TARGET, FALSE, NULL diff --git a/include/battle.h b/include/battle.h index f6e3066e18..d46563a760 100644 --- a/include/battle.h +++ b/include/battle.h @@ -677,6 +677,7 @@ struct BattleScripting u8 multiplayerId; bool8 monCaught; s32 savedDmg; + u8 savedMoveEffect; // For moves hitting multiple targets. }; // rom_80A5C6C diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 96503f298d..6f6595e5c8 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -30,6 +30,7 @@ #define sMULTIPLAYER_ID gBattleScripting + 0x25 #define sMON_CAUGHT gBattleScripting + 0x26 #define sSAVED_DMG gBattleScripting + 0x28 +#define sSAVED_MOVE_EFFECT gBattleScripting + 0x2C #define cEFFECT_CHOOSER gBattleCommunication + 3 #define cMULTISTRING_CHOOSER gBattleCommunication + 5 diff --git a/src/battle_main.c b/src/battle_main.c index ce500099f3..ba8752f6c2 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5440,6 +5440,7 @@ static void HandleAction_UseMove(void) gMoveResultFlags = 0; gMultiHitCounter = 0; gBattleCommunication[6] = 0; + gBattleScripting.savedMoveEffect = 0; gCurrMovePos = gChosenMovePos = *(gBattleStruct->chosenMovePositions + gBattlerAttacker); // choose move diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e1e58616ad..3b16de8ba1 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4323,17 +4323,36 @@ static void atk49_moveend(void) gBattleScripting.atk49_state++; break; case ATK49_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) + { + 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 (battlerId < gBattlersCount && gBattleMons[battlerId].hp != 0) { gBattlerTarget = battlerId; - gHitMarker |= HITMARKER_NO_ATTACKSTRING; gBattleScripting.atk49_state = 0; MoveValuesCleanUp(); + gBattleCommunication[MOVE_EFFECT_BYTE] = gBattleScripting.savedMoveEffect; BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]); gBattlescriptCurrInstr = BattleScript_FlushMessageBox; return; From 0621d5ceb79b0abd9b6f0a966b545f620d81a810 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sat, 29 Sep 2018 12:39:27 -0300 Subject: [PATCH 148/667] Update battle_moves.h When I made the Gen. 7 moves data, I screwed up Spirit Shackle's effect. I should have gave it EFFECT_PLACEHOLDER as it will probably need a new effect. --- src/data/battle_moves.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index fd25be5de4..ac02f1d333 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -7512,7 +7512,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_STATUS, }, { // MOVE_SPIRIT_SHACKLE - .effect = EFFECT_MEAN_LOOK, + .effect = EFFECT_PLACEHOLDER, .power = 80, .type = TYPE_GHOST, .accuracy = 100, From b9cf1fdcfe530c12c5cdefe7d23bd1e29cba677a Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 29 Sep 2018 18:40:14 +0200 Subject: [PATCH 149/667] Psycho Shift, Power Trick, Flame Burst --- asm/macros/battle_script.inc | 13 ++ data/battle_scripts_1.s | 50 +++++++ include/battle_scripts.h | 1 + include/constants/battle.h | 3 +- include/constants/battle_move_effects.h | 3 + include/constants/battle_script_commands.h | 3 + include/constants/battle_string_ids.h | 3 +- src/battle_main.c | 2 + src/battle_message.c | 7 + src/battle_script_commands.c | 148 +++++++++++++++++---- src/data/battle_moves.h | 6 +- 11 files changed, 211 insertions(+), 28 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 3174166085..97a776f3e7 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1522,6 +1522,19 @@ .4byte \ptr .endm + .macro trypsychoshift ptr + various BS_ATTACKER, VARIOUS_PSYCHO_SHIFT + .4byte \ptr + .endm + + .macro curestatus battler + various \battler, VARIOUS_CURE_STATUS + .endm + + .macro powertrick battler + various \battler, VARIOUS_POWER_TRICK + .endm + @ helpful macros .macro setstatchanger stat, stages, down setbyte sSTATCHANGER \stat | \stages << 4 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index a4948dc898..c36ca54e2e 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -321,6 +321,56 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectHitEnemyHealAlly .4byte BattleScript_EffectSmackDown .4byte BattleScript_EffectSynchronoise + .4byte BattleScript_EffectPsychoShift + .4byte BattleScript_EffectPowerTrick + .4byte BattleScript_EffectFlameBurst + +BattleScript_EffectFlameBurst: + setmoveeffect MOVE_EFFECT_FLAME_BURST | MOVE_EFFECT_AFFECTS_USER + goto BattleScript_EffectHit + +BattleScript_MoveEffectFlameBurst:: + printstring STRINGID_BURSTINGFLAMESHIT + waitmessage 0x40 + healthbarupdate BS_SCRIPTING + datahpupdate BS_SCRIPTING + tryfaintmon BS_SCRIPTING, FALSE, NULL + return + +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 + jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected + trypsychoshift BattleScript_MoveEnd + attackanimation + waitanimation + 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 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index e96babfb5f..40bebc1c34 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -279,5 +279,6 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle.h b/include/constants/battle.h index 0e61152450..a0b193e6ad 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -158,6 +158,7 @@ #define STATUS3_AQUA_RING 0x10000000 #define STATUS3_LASER_FOCUS 0x20000000 #define STATUS3_ELECTRIFIED 0x40000000 +#define STATUS3_POWER_TRICK 0x80000000 #define STATUS3_SEMI_INVULNERABLE (STATUS3_UNDERGROUND | STATUS3_ON_AIR | STATUS3_UNDERWATER) // Not really sure what a "hitmarker" is. @@ -315,7 +316,7 @@ #define MOVE_EFFECT_CLEAR_SMOG 0x3A #define MOVE_EFFECT_SP_ATK_TWO_DOWN 0x3B #define MOVE_EFFECT_SMACK_DOWN 0x3C -#define MOVE_EFFECT_NOTHING_3D 0x3D +#define MOVE_EFFECT_FLAME_BURST 0x3D #define MOVE_EFFECT_NOTHING_3E 0x3E #define MOVE_EFFECT_NOTHING_3F 0x3F #define MOVE_EFFECT_AFFECTS_USER 0x40 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index b2d3788012..63e51f6f04 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -310,5 +310,8 @@ #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 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 6f6595e5c8..a9e7f656d3 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -112,6 +112,9 @@ #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 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index ba44bdeb1e..667dc13d75 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -508,7 +508,8 @@ #define STRINGID_SEVERELY 505 #define STRINGID_INFESTATION 506 #define STRINGID_NOEFFECTONTARGET 507 +#define STRINGID_BURSTINGFLAMESHIT 508 -#define BATTLESTRINGS_COUNT 519 +#define BATTLESTRINGS_COUNT 521 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_main.c b/src/battle_main.c index ba8752f6c2..0f2015bd03 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3143,6 +3143,8 @@ void SwitchInClearSetData(void) gStatuses3[i] |= 0x10; } } + if (gStatuses3[gActiveBattler] & STATUS3_POWER_TRICK) + SWAP(gBattleMons[gActiveBattler].attack, gBattleMons[gActiveBattler].defense, i); } else { diff --git a/src/battle_message.c b/src/battle_message.c index 22a32638a6..2f43cc84b7 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -649,6 +649,7 @@ 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}!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { @@ -1149,6 +1150,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_severely, sText_Infestation, sText_NoEffectOnTarget, + sText_BurstingFlames, }; const u16 gTerrainStringIds[] = @@ -1452,6 +1454,11 @@ const u16 gRoomsStringIds[] = 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}!{UNKNOWN_A}\p"); const u8 gText_PkmnStoppedEvolving[] = _("Huh? {STR_VAR_1}\nstopped evolving!\p"); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 3b16de8ba1..9dc47e7d94 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2711,6 +2711,17 @@ void SetMoveEffect(bool8 primary, u8 certain) 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; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectFlameBurst; + } + break; } } } @@ -3261,6 +3272,7 @@ static void atk23_getexp(void) gActiveBattler = gBattleStruct->expGetterBattlerId; if (gBattleBufferB[gActiveBattler][0] == CONTROLLER_TWORETURNVALUES && gBattleBufferB[gActiveBattler][1] == RET_VALUE_LEVELED_UP) { + u16 temp, battlerId = 0xFF; if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gBattlerPartyIndexes[gActiveBattler] == gBattleStruct->expGetterMonId) HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); @@ -3276,33 +3288,25 @@ static void atk23_getexp(void) // 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.atk23_state = 5; } else @@ -6878,6 +6882,104 @@ static void atk76_various(void) else gBattlescriptCurrInstr += 7; 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; + 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; } gBattlescriptCurrInstr += 3; diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index fd25be5de4..e9698a41ba 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -4505,7 +4505,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_PHYSICAL, }, { // MOVE_PSYCHO_SHIFT - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_PSYCHO_SHIFT, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 100, @@ -4553,7 +4553,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_SPECIAL, }, { // MOVE_POWER_TRICK - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_POWER_TRICK, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -5781,7 +5781,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_PHYSICAL, }, { // MOVE_FLAME_BURST - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_FLAME_BURST, .power = 70, .type = TYPE_FIRE, .accuracy = 100, From 7623eabdeee9c0d21d1f575fed692934502d5ec3 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 29 Sep 2018 19:37:39 +0200 Subject: [PATCH 150/667] After you --- asm/macros/battle_script.inc | 5 ++++ data/battle_scripts_1.s | 13 ++++++++++ include/constants/battle_move_effects.h | 1 + include/constants/battle_script_commands.h | 1 + src/battle_script_commands.c | 30 ++++++++++++++++++++++ src/data/battle_moves.h | 2 +- 6 files changed, 51 insertions(+), 1 deletion(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 97a776f3e7..ca7f453d53 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1440,6 +1440,11 @@ .4byte \ptr .endm + .macro tryafteryou ptr + various BS_ATTACKER, VARIOUS_AFTER_YOU + .4byte \ptr + .endm + .macro invertstatstages battler various \battler, VARIOUS_INVERT_STAT_STAGES .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index c36ca54e2e..3aa4f2149d 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -324,6 +324,19 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectPsychoShift .4byte BattleScript_EffectPowerTrick .4byte BattleScript_EffectFlameBurst + .4byte BattleScript_EffectAfterYou + +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 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 63e51f6f04..9963a59b70 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -313,5 +313,6 @@ #define EFFECT_PSYCHO_SHIFT 307 #define EFFECT_POWER_TRICK 308 #define EFFECT_FLAME_BURST 309 +#define EFFECT_AFTER_YOU 310 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index a9e7f656d3..e6a6b8d66f 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -115,6 +115,7 @@ #define VARIOUS_PSYCHO_SHIFT 61 #define VARIOUS_CURE_STATUS 62 #define VARIOUS_POWER_TRICK 63 +#define VARIOUS_AFTER_YOU 64 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 9dc47e7d94..db5f39a660 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6980,6 +6980,36 @@ static void atk76_various(void) 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; } gBattlescriptCurrInstr += 3; diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index e9698a41ba..d01557f408 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -5949,7 +5949,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_STATUS, }, { // MOVE_AFTER_YOU - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_AFTER_YOU, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, From 162c83fcff2ee8d3b07331c62bafe60334d3a4a5 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 30 Sep 2018 12:27:51 +0200 Subject: [PATCH 151/667] Bestow --- asm/macros/battle_script.inc | 5 ++++ data/battle_scripts_1.s | 14 +++++++++ include/battle_util.h | 1 + include/constants/battle_move_effects.h | 1 + include/constants/battle_script_commands.h | 1 + include/constants/battle_string_ids.h | 1 + src/battle_message.c | 2 ++ src/battle_script_commands.c | 33 +++++++++++++++++++--- src/battle_util.c | 19 +++++++++++++ src/data/battle_moves.h | 2 +- 10 files changed, 74 insertions(+), 5 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index ca7f453d53..d24a0e293c 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1445,6 +1445,11 @@ .4byte \ptr .endm + .macro trybestow ptr + various BS_ATTACKER, VARIOUS_BESTOW + .4byte \ptr + .endm + .macro invertstatstages battler various \battler, VARIOUS_INVERT_STAT_STAGES .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 3aa4f2149d..38e6f853f3 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -325,6 +325,20 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectPowerTrick .4byte BattleScript_EffectFlameBurst .4byte BattleScript_EffectAfterYou + .4byte BattleScript_EffectBestow + +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 diff --git a/include/battle_util.h b/include/battle_util.h index 3f14bd59f3..ede49e10dd 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -92,5 +92,6 @@ u16 GetMegaEvolutionSpecies(u16 preEvoSpecies, u16 heldItemId); bool32 CanMegaEvolve(u8 battlerId); void UndoMegaEvolution(u8 monId); bool32 DoBattlersShareType(u32 battler1, u32 battler2); +bool32 CanBattlerGetOrLoseItem(u8 battlerId, u16 itemId); #endif // GUARD_BATTLE_UTIL_H diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 9963a59b70..1816d3a502 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -314,5 +314,6 @@ #define EFFECT_POWER_TRICK 308 #define EFFECT_FLAME_BURST 309 #define EFFECT_AFTER_YOU 310 +#define EFFECT_BESTOW 311 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index e6a6b8d66f..bd70f718b6 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -116,6 +116,7 @@ #define VARIOUS_CURE_STATUS 62 #define VARIOUS_POWER_TRICK 63 #define VARIOUS_AFTER_YOU 64 +#define VARIOUS_BESTOW 65 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 667dc13d75..8f2e52908a 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -509,6 +509,7 @@ #define STRINGID_INFESTATION 506 #define STRINGID_NOEFFECTONTARGET 507 #define STRINGID_BURSTINGFLAMESHIT 508 +#define STRINGID_BESTOWITEMGIVING 509 #define BATTLESTRINGS_COUNT 521 diff --git a/src/battle_message.c b/src/battle_message.c index 2f43cc84b7..0ff8d1806b 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -650,6 +650,7 @@ 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}!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { @@ -1151,6 +1152,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_Infestation, sText_NoEffectOnTarget, sText_BurstingFlames, + sText_BestowItemGiving, }; const u16 gTerrainStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index db5f39a660..7bd15de9a6 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7010,6 +7010,31 @@ static void atk76_various(void) 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); + + gActiveBattler = gBattlerTarget; + gBattleMons[gActiveBattler].item = gLastUsedItem; + BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBattler].item); + MarkBattlerForControllerExec(gActiveBattler); + + gBattlescriptCurrInstr += 7; + } + return; } gBattlescriptCurrInstr += 3; @@ -9687,10 +9712,10 @@ static void atkD2_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); } diff --git a/src/battle_util.c b/src/battle_util.c index 17ce185af7..2e29241012 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -24,6 +24,7 @@ #include "link.h" #include "berry.h" #include "pokedex.h" +#include "mail.h" #include "constants/battle_config.h" extern u8 weather_get_current(void); @@ -5680,3 +5681,21 @@ bool32 DoBattlersShareType(u32 battler1, u32 battler2) else 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; + else if (ItemId_GetHoldEffect(itemId) == HOLD_EFFECT_MEGA_STONE && GetMegaEvolutionSpecies(species, itemId) != SPECIES_NONE) + return FALSE; + else + return TRUE; +} diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 5e7637a0e7..0a42485409 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -6201,7 +6201,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_SPECIAL, }, { // MOVE_BESTOW - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_BESTOW, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, From de9e9072fc9482ad5d237a9c83d0f40547560ea3 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 30 Sep 2018 14:04:46 +0200 Subject: [PATCH 152/667] Rototiller and 2 turn moves --- asm/macros/battle_script.inc | 9 +++ data/battle_ai_scripts.s | 4 +- data/battle_scripts_1.s | 84 ++++++++++++++++++---- include/constants/battle_move_effects.h | 5 +- include/constants/battle_script_commands.h | 2 + include/text.h | 1 + src/battle_script_commands.c | 44 ++++++------ src/battle_util.c | 4 ++ src/data/battle_moves.h | 19 ++--- 9 files changed, 123 insertions(+), 49 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index d24a0e293c..4b323ab8ff 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1544,6 +1544,15 @@ .macro powertrick battler various \battler, VARIOUS_POWER_TRICK .endm + + .macro argumenttomoveeffect + various BS_ATTACKER, VARIOUS_ARGUMENT_TO_MOVE_EFFECT + .endm + + .macro jumpifnotgrounded battler, ptr + various \battler, VARIOUS_JUMP_IF_NOT_GROUNDED + .4byte \ptr + .endm @ helpful macros .macro setstatchanger stat, stages, down diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index e852ae8386..02904e3f61 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -121,7 +121,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 @@ -834,7 +833,6 @@ AI_CheckViability: 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_CONFUSE, AI_CV_Confuse @@ -857,7 +855,7 @@ AI_CheckViability: 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 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 38e6f853f3..75a05198d5 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -53,7 +53,7 @@ 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 @@ -89,7 +89,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 @@ -326,6 +326,50 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectFlameBurst .4byte BattleScript_EffectAfterYou .4byte BattleScript_EffectBestow + .4byte BattleScript_EffectRototiller + +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 0x1, BattleScript_RototillerTrySpAtk + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_RototillerTrySpAtk + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_RototillerTrySpAtk:: + setstatchanger STAT_SPATK, 1, FALSE + statbuffchange 0x1, BattleScript_RototillerMoveTargetEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_RototillerMoveTargetEnd + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_RototillerMoveTargetEnd: + setbyte sMOVEEND_STATE, 0x0 + moveend 0x2, 0x10 + jumpifnexttargetvalid BattleScript_RototillerLoop + end +BattleScript_RototillerCantRaiseMultipleStats: + printstring STRINGID_STATSWONTINCREASE2 + waitmessage 0x40 + goto BattleScript_RototillerMoveTargetEnd BattleScript_EffectBestow: attackcanceler @@ -1431,8 +1475,10 @@ BattleScript_HitEscapeEnd: end BattleScript_EffectPlaceholder: - showabilitypopup BS_TARGET attackcanceler + attackstring + ppreduce + pause 0x5 printstring STRINGID_NOTDONEYET goto BattleScript_MoveEnd @@ -1480,6 +1526,7 @@ BattleScript_EffectFreezeDry: BattleScript_EffectTwoTypedMove: BattleScript_EffectTechnoBlast: BattleScript_EffectJudgment: +BattleScript_EffectFusionCombo: jumpifnotmove MOVE_SURF, BattleScript_HitFromAtkCanceler jumpifnostatus3 BS_TARGET, STATUS3_UNDERWATER, BattleScript_HitFromAtkCanceler orword gHitMarker, HITMARKER_IGNORE_UNDERWATER @@ -2070,21 +2117,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, 0x0 - 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:: @@ -2385,12 +2424,29 @@ BattleScript_EffectAccuracyDownHit:: setmoveeffect MOVE_EFFECT_ACC_MINUS_1 goto BattleScript_EffectHit -BattleScript_EffectSkyAttack:: +BattleScript_EffectTwoTurnsAttack:: jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_TwoTurnMovesSecondTurn jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING, BattleScript_TwoTurnMovesSecondTurn - setbyte sTWOTURN_STRINGID, 0x3 + 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 goto BattleScript_MoveEnd +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, 0x0 + goto BattleScript_EffectTwoTurnsAttackContinue BattleScript_EffectConfuseHit:: setmoveeffect MOVE_EFFECT_CONFUSION diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 1816d3a502..ac179b7480 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -40,7 +40,7 @@ #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 @@ -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 @@ -315,5 +315,6 @@ #define EFFECT_FLAME_BURST 309 #define EFFECT_AFTER_YOU 310 #define EFFECT_BESTOW 311 +#define EFFECT_ROTOTILLER 312 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index bd70f718b6..c1c1aca2bf 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -117,6 +117,8 @@ #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 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/text.h b/include/text.h index e2120efa33..f7d970d61a 100644 --- a/include/text.h +++ b/include/text.h @@ -17,6 +17,7 @@ #define CHAR_PERIOD 0xAD #define CHAR_HYPHEN 0xAE #define CHAR_ELLIPSIS 0xB0 +#define CHAR_APOS 0xB4 #define CHAR_MALE 0xB5 #define CHAR_FEMALE 0xB6 #define CHAR_CURRENCY 0xB7 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 7bd15de9a6..c4ea457b1c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7035,6 +7035,15 @@ static void atk76_various(void) gBattlescriptCurrInstr += 7; } return; + case VARIOUS_ARGUMENT_TO_MOVE_EFFECT: + gBattleCommunication[MOVE_EFFECT_BYTE] = gBattleMoves[gCurrentMove].argument; + break; + case VARIOUS_JUMP_IF_NOT_GROUNDED: + if (!IsBattlerGrounded(gActiveBattler)) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else + gBattlescriptCurrInstr += 7; + return; } gBattlescriptCurrInstr += 3; @@ -7127,30 +7136,23 @@ static void atk7A_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 (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) + break; + } - if (gBattlerTarget >= gBattlersCount) - gBattlescriptCurrInstr += 5; - else - gBattlescriptCurrInstr = jumpPtr; - } - else - { + if (gBattlerTarget >= gBattlersCount) gBattlescriptCurrInstr += 5; - } + else + gBattlescriptCurrInstr = jumpPtr; } static void atk7B_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; @@ -8718,8 +8720,7 @@ static void atkA8_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) @@ -8745,8 +8746,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) @@ -9431,7 +9431,7 @@ static void atkC2_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])) break; diff --git a/src/battle_util.c b/src/battle_util.c index 2e29241012..4176769897 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4750,6 +4750,10 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) 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) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 0a42485409..d4f00fbca3 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -160,7 +160,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_PHYSICAL, }, { // MOVE_RAZOR_WIND - .effect = EFFECT_RAZOR_WIND, + .effect = EFFECT_TWO_TURNS_ATTACK, .power = 80, .type = TYPE_NORMAL, .accuracy = 100, @@ -1720,7 +1720,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_STATUS, }, { // MOVE_SKY_ATTACK - .effect = EFFECT_SKY_ATTACK, + .effect = EFFECT_TWO_TURNS_ATTACK, .power = 140, .type = TYPE_FLYING, .accuracy = 90, @@ -1730,6 +1730,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, .split = SPLIT_PHYSICAL, + .argument = MOVE_EFFECT_FLINCH, }, { // MOVE_TRANSFORM .effect = EFFECT_TRANSFORM, @@ -6645,7 +6646,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_SPECIAL, }, { // MOVE_FREEZE_SHOCK - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_TWO_TURNS_ATTACK, .power = 140, .type = TYPE_ICE, .accuracy = 90, @@ -6655,9 +6656,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, .split = SPLIT_PHYSICAL, + .argument = MOVE_EFFECT_PARALYSIS, }, { // MOVE_ICE_BURN - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_TWO_TURNS_ATTACK, .power = 140, .type = TYPE_ICE, .accuracy = 90, @@ -6667,6 +6669,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, .split = SPLIT_SPECIAL, + .argument = MOVE_EFFECT_BURN, }, { // MOVE_SNARL .effect = EFFECT_SPECIAL_ATTACK_DOWN_HIT, @@ -6705,7 +6708,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_PHYSICAL, }, { // MOVE_FUSION_FLARE - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_FUSION_COMBO, .power = 100, .type = TYPE_FIRE, .accuracy = 100, @@ -6717,7 +6720,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_SPECIAL, }, { // MOVE_FUSION_BOLT - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_FUSION_COMBO, .power = 100, .type = TYPE_ELECTRIC, .accuracy = 100, @@ -6766,13 +6769,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_SPECIAL, }, { // MOVE_ROTOTILLER - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_ROTOTILLER, .power = 0, .type = TYPE_GROUND, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, - .target = MOVE_TARGET_SELECTED, + .target = MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_USER, .priority = 0, .flags = 0, .split = SPLIT_STATUS, From 6b5c52e926b867c020b92decdf1843255b264a4e Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 6 Oct 2018 15:50:35 +0200 Subject: [PATCH 153/667] Flower Shield and protect moves --- data/battle_scripts_1.s | 55 ++++++++++++++++++ include/battle.h | 67 +++++++++++----------- include/constants/battle_move_effects.h | 3 + include/constants/battle_string_ids.h | 2 +- include/constants/pokemon.h | 1 + src/battle_ai_script_commands.c | 2 - src/battle_main.c | 10 ++++ src/battle_message.c | 7 +-- src/battle_script_commands.c | 74 ++++++++++++++++++++----- src/data/battle_moves.h | 46 +++++++-------- 10 files changed, 188 insertions(+), 79 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 75a05198d5..6022c4f20b 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -327,6 +327,45 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectAfterYou .4byte BattleScript_EffectBestow .4byte BattleScript_EffectRototiller + .4byte BattleScript_EffectFlowerShield + .4byte BattleScript_EffectHitPreventEscape + .4byte BattleScript_EffectSpeedSwap + +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 0x1, 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: + setbyte sMOVEEND_STATE, 0x0 + moveend 0x2, 0x10 + jumpifnexttargetvalid BattleScript_FlowerShieldLoop + end BattleScript_EffectRototiller: attackcanceler @@ -1268,6 +1307,18 @@ BattleScript_EffectGuardSwap: 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 @@ -2816,6 +2867,10 @@ BattleScript_TripleKickEnd:: BattleScript_EffectThief:: setmoveeffect MOVE_EFFECT_STEAL_ITEM goto BattleScript_EffectHit + +BattleScript_EffectHitPreventEscape: + setmoveeffect MOVE_EFFECT_PREVENT_ESCAPE + goto BattleScript_EffectHit BattleScript_EffectMeanLook:: attackcanceler diff --git a/include/battle.h b/include/battle.h index d46563a760..a886098bda 100644 --- a/include/battle.h +++ b/include/battle.h @@ -185,41 +185,38 @@ struct DisableStruct struct ProtectStruct { - /* field_0 */ - u32 protected:1; - u32 endured:1; - u32 noValidMoves:1; - u32 helpingHand:1; - u32 bounceMove:1; - u32 stealMove:1; - u32 flag0Unknown:1; - u32 prlzImmobility:1; - /* field_1 */ - u32 confusionSelfDmg:1; - u32 targetNotAffected:1; - u32 chargingTurn:1; - u32 fleeFlag:2; // for RunAway and Smoke Ball - u32 usedImprisionedMove:1; - u32 loveImmobility:1; - u32 usedDisabledMove:1; - /* field_2 */ - u32 usedTauntedMove:1; // 0x1 - u32 flag2Unknown:1; // 0x2 - u32 flinchImmobility:1; // 0x4 - u32 notFirstStrike:1; // 0x8 - u32 flag_x10:1; // 0x10 - u32 flag_x20:1; // 0x20 - u32 flag_x40:1; // 0x40 - u32 flag_x80:1; // 0x80 - u32 usesBouncedMove:1; - u32 usedHealBlockedMove:1; - u32 usedGravityPreventedMove:1; - - /* field_4 */ u32 physicalDmg; - /* field_8 */ u32 specialDmg; - /* field_C */ u8 physicalBattlerId; - /* field_D */ u8 specialBattlerId; - /* field_E */ u16 fieldE; + u8 protected:1; + u8 wideGuarded:1; + u8 quickGuarded:1; + u8 spikyShielded:1; + u8 kingsShielded:1; + u8 banefulBunkered:1; + u8 endured:1; + u8 noValidMoves:1; + u8 helpingHand:1; + u8 bounceMove:1; + u8 stealMove:1; + u8 flag0Unknown:1; + u8 prlzImmobility:1; + u8 confusionSelfDmg:1; + u8 targetNotAffected:1; + u8 chargingTurn:1; + u8 fleeFlag:2; // for RunAway and Smoke Ball + u8 usedImprisionedMove:1; + u8 loveImmobility:1; + u8 usedDisabledMove:1; + u8 usedTauntedMove:1; + u8 flag2Unknown:1; + u8 flinchImmobility:1; + u8 notFirstStrike:1; + u8 flag_x10:1; + u8 usesBouncedMove:1; + u8 usedHealBlockedMove:1; + u8 usedGravityPreventedMove:1; + u32 physicalDmg; + u32 specialDmg; + u8 physicalBattlerId; + u8 specialBattlerId; }; struct SpecialStatus diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index ac179b7480..1524353d35 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -316,5 +316,8 @@ #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 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 8f2e52908a..ac0b0bc3c2 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -424,7 +424,7 @@ #define STRINGID_EMPTYSTRING5 421 #define STRINGID_KINDOFFER 422 #define STRINGID_RESETSTARGETSSTATLEVELS 423 -#define STRINGID_PROTECTSTEAMFROMPRIORITY 424 +#define STRINGID_EMPTYSTRING6 424 #define STRINGID_ALLYSWITCHPOSITION 425 #define STRINGID_RESTORETARGETSHEALTH 426 #define STRINGID_TOOKPJMNINTOTHESKY 427 diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index a0900fff0f..94c205babd 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -97,6 +97,7 @@ #define FLAG_DMG_UNDERWATER 0x8000 #define FLAG_SOUND 0x10000 #define FLAG_BALLISTIC 0x20000 +#define FLAG_PROTECTION_MOVE 0x40000 // Split defines. #define SPLIT_PHYSICAL 0x0 diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index fab8e53c64..abd545f052 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -276,8 +276,6 @@ static const u16 sDiscouragedPowerfulMoveEffects[] = { EFFECT_EXPLOSION, EFFECT_DREAM_EATER, - EFFECT_RAZOR_WIND, - EFFECT_SKY_ATTACK, EFFECT_RECHARGE, EFFECT_SKULL_BASH, EFFECT_SOLARBEAM, diff --git a/src/battle_main.c b/src/battle_main.c index 0f2015bd03..6237952190 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3250,6 +3250,11 @@ void FaintClearSetData(void) ptr[i] = 0; gProtectStructs[gActiveBattler].protected = 0; + gProtectStructs[gActiveBattler].wideGuarded = 0; + gProtectStructs[gActiveBattler].quickGuarded = 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; @@ -4918,6 +4923,11 @@ static void TurnValuesCleanUp(bool8 var0) { gProtectStructs[gActiveBattler].protected = 0; gProtectStructs[gActiveBattler].endured = 0; + gProtectStructs[gActiveBattler].wideGuarded = 0; + gProtectStructs[gActiveBattler].quickGuarded = 0; + gProtectStructs[gActiveBattler].spikyShielded = 0; + gProtectStructs[gActiveBattler].kingsShielded = 0; + gProtectStructs[gActiveBattler].banefulBunkered = 0; } else { diff --git a/src/battle_message.c b/src/battle_message.c index 0ff8d1806b..5594fd7fb4 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -553,7 +553,7 @@ static const u8 sText_PointedStonesFloat[] =_("Pointed stones float in the air\n 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[] =_("Wide Guard protected your team!"); +static const u8 sText_ProtectedTeam[] =_("{B_CURRENT_MOVE} protected\nyour 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!"); @@ -565,7 +565,6 @@ static const u8 sText_TransformedIntoWaterType[] =_("{B_DEF_NAME_WITH_PREFIX} tr 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_ProtectsTeamFromPriority[] =_("Quick Guard protected your team!"); 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!"); @@ -1067,7 +1066,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_EmptyString4, // 421 sText_KindOffer, // 422 sText_ResetsTargetsStatLevels, // 423 - sText_ProtectsTeamFromPriority, // 424 + sText_EmptyString4, // 424 sText_AllySwitchPosition, // 425 sText_RestoreTargetsHealth, // 426 sText_TookPkmnIntoTheSky, // 427 @@ -1221,7 +1220,7 @@ const u16 gRainContinuesStringIds[] = const u16 gProtectLikeUsedStringIds[] = { - STRINGID_PKMNPROTECTEDITSELF2, STRINGID_PKMNBRACEDITSELF, STRINGID_BUTITFAILED + STRINGID_PKMNPROTECTEDITSELF2, STRINGID_PKMNBRACEDITSELF, STRINGID_BUTITFAILED, STRINGID_PROTECTEDTEAM, }; const u16 gReflectLightScreenSafeguardStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c4ea457b1c..a34d066e9d 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -73,8 +73,6 @@ extern u16 GetBattlePyramidPickupItemId(void); extern u8 sub_813B21C(void); extern u16 get_unknown_box_id(void); -#define DEFENDER_IS_PROTECTED ((gProtectStructs[gBattlerTarget].protected) && (gBattleMoves[gCurrentMove].flags & FLAG_PROTECT_AFFECTED)) - // this file's functions static bool8 IsTwoTurnsMove(u16 move); static void TrySetDestinyBondToHappen(void); @@ -933,6 +931,28 @@ static const u8 sUnknown_0831C4F8[] = 0x03, 0x00, 0x00, 0x00 }; +bool32 IsBattlerProtected(u8 battlerId, u16 move) +{ + if (!(gBattleMoves[move].flags & FLAG_PROTECT_AFFECTED)) + return FALSE; + else if (gProtectStructs[battlerId].protected) + return TRUE; + else if ((gProtectStructs[battlerId].wideGuarded || gProtectStructs[BATTLE_PARTNER(battlerId)].wideGuarded) + && 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 ((gProtectStructs[battlerId].quickGuarded || gProtectStructs[BATTLE_PARTNER(battlerId)].quickGuarded) + && gBattleMoves[move].priority > 0) + return TRUE; + else + return FALSE; +} + static void atk00_attackcanceler(void) { s32 i; @@ -1033,7 +1053,7 @@ static void atk00_attackcanceler(void) gBattlescriptCurrInstr = BattleScript_TookAttack; RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); } - else if (DEFENDER_IS_PROTECTED + else if (IsBattlerProtected(gBattlerTarget, gCurrentMove) && (gCurrentMove != MOVE_CURSE || IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST)) && ((!IsTwoTurnsMove(gCurrentMove) || (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)))) { @@ -1071,7 +1091,7 @@ static bool32 JumpIfMoveFailed(u8 adder, u16 move) static void atk40_jumpifaffectedbyprotect(void) { - if (DEFENDER_IS_PROTECTED) + if (IsBattlerProtected(gBattlerTarget, gCurrentMove)) { gMoveResultFlags |= MOVE_RESULT_MISSED; JumpIfMoveFailed(5, 0); @@ -1086,7 +1106,7 @@ static void atk40_jumpifaffectedbyprotect(void) bool8 JumpIfMoveAffectedByProtect(u16 move) { bool8 affected = FALSE; - if (DEFENDER_IS_PROTECTED) + if (IsBattlerProtected(gBattlerTarget, move)) { gMoveResultFlags |= MOVE_RESULT_MISSED; JumpIfMoveFailed(7, move); @@ -7051,10 +7071,9 @@ static void atk76_various(void) static void atk77_setprotectlike(void) // protect and endure { - bool8 notLastTurn = TRUE; - u16 lastMove = gLastResultingMoves[gBattlerAttacker]; + 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)) @@ -7062,16 +7081,41 @@ static void atk77_setprotectlike(void) // protect and endure if (sProtectSuccessRates[gDisableStructs[gBattlerAttacker].protectUses] >= Random() && notLastTurn) { - if (gBattleMoves[gCurrentMove].effect == EFFECT_PROTECT) - { - 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_KING_S_SHIELD) + { + gProtectStructs[gBattlerAttacker].kingsShielded = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + else if (gCurrentMove == MOVE_BANEFUL_BUNKER) + { + gProtectStructs[gBattlerAttacker].banefulBunkered = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + } + else if (gCurrentMove == MOVE_WIDE_GUARD) + { + gProtectStructs[gBattlerAttacker].wideGuarded = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + } + else if (gCurrentMove == MOVE_QUICK_GUARD) + { + gProtectStructs[gBattlerAttacker].quickGuarded = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 3; + } gDisableStructs[gBattlerAttacker].protectUses++; } else @@ -8428,7 +8472,9 @@ static void atk9E_metronome(void) { s32 i; - gCurrentMove = (Random() % MOVES_COUNT) + 1; + gCurrentMove = (Random() % (MOVES_COUNT - 1)) + 1; + if (gBattleMoves[gCurrentMove].effect == EFFECT_PLACEHOLDER) + continue; i = -1; while (1) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index d4f00fbca3..639e9c50be 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -2197,7 +2197,7 @@ 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 @@ -2377,7 +2377,7 @@ 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 @@ -2449,7 +2449,7 @@ 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 @@ -5638,7 +5638,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_STATUS, }, { // MOVE_WIDE_GUARD - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_PROTECT, .power = 0, .type = TYPE_ROCK, .accuracy = 0, @@ -5646,7 +5646,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 3, - .flags = 0, + .flags = FLAG_PROTECTION_MOVE, .split = SPLIT_STATUS, }, { // MOVE_GUARD_SPLIT @@ -6022,7 +6022,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_SPECIAL, }, { // MOVE_QUICK_GUARD - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_PROTECT, .power = 0, .type = TYPE_FIGHTING, .accuracy = 0, @@ -6030,7 +6030,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 3, - .flags = 0, + .flags = FLAG_PROTECTION_MOVE, .split = SPLIT_STATUS, }, { // MOVE_ALLY_SWITCH @@ -6901,7 +6901,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_SPECIAL, }, { // MOVE_DISARMING_VOICE - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_HIT, .power = 40, .type = TYPE_FAIRY, .accuracy = 0, @@ -6962,13 +6962,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_STATUS, }, { // MOVE_FLOWER_SHIELD - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_FLOWER_SHIELD, .power = 0, .type = TYPE_FAIRY, .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, - .target = MOVE_TARGET_USER, + .target = MOVE_TARGET_USER | MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .flags = 0, .split = SPLIT_STATUS, @@ -7070,7 +7070,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_STATUS, }, { // MOVE_KING_S_SHIELD - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect, as it changes Aegislash's form + .effect = EFFECT_PROTECT, .power = 0, .type = TYPE_STEEL, .accuracy = 0, @@ -7078,7 +7078,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 4, - .flags = FLAG_SNATCH_AFFECTED, + .flags = FLAG_PROTECTION_MOVE, .split = SPLIT_STATUS, }, { // MOVE_PLAY_NICE @@ -7166,7 +7166,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_SPECIAL, }, { // MOVE_SPIKY_SHIELD - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_PROTECT, .power = 0, .type = TYPE_GRASS, .accuracy = 0, @@ -7174,7 +7174,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 4, - .flags = 0, + .flags = FLAG_PROTECTION_MOVE, .split = SPLIT_STATUS, }, { // MOVE_AROMATIC_MIST @@ -7395,7 +7395,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_PHYSICAL, }, { // MOVE_THOUSAND_WAVES - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (not sure if this is like Mean Look lol, might be) + .effect = EFFECT_HIT_PREVENT_ESCAPE, .power = 90, .type = TYPE_GROUND, .accuracy = 100, @@ -7503,7 +7503,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_PHYSICAL, }, { // MOVE_BANEFUL_BUNKER - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_PROTECT, .power = 0, .type = TYPE_POISON, .accuracy = 0, @@ -7511,11 +7511,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 4, - .flags = 0, + .flags = FLAG_PROTECTION_MOVE, .split = SPLIT_STATUS, }, { // MOVE_SPIRIT_SHACKLE - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_HIT_PREVENT_ESCAPE, .power = 80, .type = TYPE_GHOST, .accuracy = 100, @@ -7540,7 +7540,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_SPARKLING_ARIA .effect = EFFECT_PLACEHOLDER, - .power = 00, + .power = 90, .type = TYPE_WATER, .accuracy = 100, .pp = 10, @@ -7695,7 +7695,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_SPECIAL, }, { // MOVE_ANCHOR_SHOT - .effect = EFFECT_MEAN_LOOK, + .effect = EFFECT_HIT_PREVENT_ESCAPE, .power = 80, .type = TYPE_STEEL, .accuracy = 100, @@ -7767,7 +7767,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_SPECIAL, }, { // MOVE_SPEED_SWAP - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_SPEED_SWAP, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -7779,7 +7779,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_STATUS, }, { // MOVE_SMART_STRIKE - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_HIT, .power = 70, .type = TYPE_STEEL, .accuracy = 0, @@ -8043,7 +8043,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_SPECIAL, }, { // MOVE_TEARFUL_LOOK - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_NOBLE_ROAR, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, From e44fef30ffad4589cbde98053f3c5ac74c9f2edf Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 7 Oct 2018 19:57:17 +0200 Subject: [PATCH 154/667] Fix move animations --- data/battle_anim_scripts.s | 1064 ++++++++++++++++++------------------ 1 file changed, 532 insertions(+), 532 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index a89e470641..c825cccc51 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -371,272 +371,272 @@ gBattleAnims_Moves:: .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 + .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 .4byte Move_COUNT @ cannot be reached, because last move is Psycho Boost .align 2 @@ -691,7 +691,7 @@ gBattleAnims_Special:: Move_ROOST: end -MOVE_GRAVITY: +Move_GRAVITY: fadetobg BG_COSMIC waitbgfadein createvisualtask sub_8117660, 0x2, 0x0, 0x80, 0x0, 0xffff @@ -707,799 +707,799 @@ MOVE_GRAVITY: waitforvisualfinish end -MOVE_MIRACLE_EYE: +Move_MIRACLE_EYE: end -MOVE_WAKE_UP_SLAP: +Move_WAKE_UP_SLAP: end -MOVE_HAMMER_ARM: +Move_HAMMER_ARM: end -MOVE_GYRO_BALL: +Move_GYRO_BALL: end -MOVE_HEALING_WISH: +Move_HEALING_WISH: end -MOVE_BRINE: +Move_BRINE: end -MOVE_NATURAL_GIFT: +Move_NATURAL_GIFT: end -MOVE_FEINT: +Move_FEINT: end -MOVE_PLUCK: +Move_PLUCK: end -MOVE_TAILWIND: +Move_TAILWIND: end -MOVE_ACUPRESSURE: +Move_ACUPRESSURE: end -MOVE_METAL_BURST: +Move_METAL_BURST: end -MOVE_U_TURN: +Move_U_TURN: end -MOVE_CLOSE_COMBAT: +Move_CLOSE_COMBAT: end -MOVE_PAYBACK: +Move_PAYBACK: end -MOVE_ASSURANCE: +Move_ASSURANCE: end -MOVE_EMBARGO: +Move_EMBARGO: end -MOVE_FLING: +Move_FLING: end -MOVE_PSYCHO_SHIFT: +Move_PSYCHO_SHIFT: end -MOVE_TRUMP_CARD: +Move_TRUMP_CARD: end -MOVE_HEAL_BLOCK: +Move_HEAL_BLOCK: end -MOVE_WRING_OUT: +Move_WRING_OUT: end -MOVE_POWER_TRICK: +Move_POWER_TRICK: end -MOVE_GASTRO_ACID: +Move_GASTRO_ACID: end -MOVE_LUCKY_CHANT: +Move_LUCKY_CHANT: end -MOVE_ME_FIRST: +Move_ME_FIRST: end -MOVE_COPYCAT: +Move_COPYCAT: end -MOVE_POWER_SWAP: +Move_POWER_SWAP: end -MOVE_GUARD_SWAP: +Move_GUARD_SWAP: end -MOVE_PUNISHMENT: +Move_PUNISHMENT: end -MOVE_LAST_RESORT: +Move_LAST_RESORT: end -MOVE_WORRY_SEED: +Move_WORRY_SEED: end -MOVE_SUCKER_PUNCH: +Move_SUCKER_PUNCH: end -MOVE_TOXIC_SPIKES: +Move_TOXIC_SPIKES: end -MOVE_HEART_SWAP: +Move_HEART_SWAP: end -MOVE_AQUA_RING: +Move_AQUA_RING: end -MOVE_MAGNET_RISE: +Move_MAGNET_RISE: end -MOVE_FLARE_BLITZ: +Move_FLARE_BLITZ: end -MOVE_FORCE_PALM: +Move_FORCE_PALM: end -MOVE_AURA_SPHERE: +Move_AURA_SPHERE: end -MOVE_ROCK_POLISH: +Move_ROCK_POLISH: end -MOVE_POISON_JAB: +Move_POISON_JAB: end -MOVE_DARK_PULSE: +Move_DARK_PULSE: end -MOVE_NIGHT_SLASH: +Move_NIGHT_SLASH: end -MOVE_AQUA_TAIL: +Move_AQUA_TAIL: end -MOVE_SEED_BOMB: +Move_SEED_BOMB: end -MOVE_AIR_SLASH: +Move_AIR_SLASH: end -MOVE_XSCISSOR: +Move_XSCISSOR: end -MOVE_BUG_BUZZ: +Move_BUG_BUZZ: end -MOVE_DRAGON_PULSE: +Move_DRAGON_PULSE: end -MOVE_DRAGON_RUSH: +Move_DRAGON_RUSH: end -MOVE_POWER_GEM: +Move_POWER_GEM: end -MOVE_DRAIN_PUNCH: +Move_DRAIN_PUNCH: end -MOVE_VACUUM_WAVE: +Move_VACUUM_WAVE: end -MOVE_FOCUS_BLAST: +Move_FOCUS_BLAST: end -MOVE_ENERGY_BALL: +Move_ENERGY_BALL: end -MOVE_BRAVE_BIRD: +Move_BRAVE_BIRD: end -MOVE_EARTH_POWER: +Move_EARTH_POWER: end -MOVE_SWITCHEROO: +Move_SWITCHEROO: end -MOVE_GIGA_IMPACT: +Move_GIGA_IMPACT: end -MOVE_NASTY_PLOT: +Move_NASTY_PLOT: end -MOVE_BULLET_PUNCH: +Move_BULLET_PUNCH: end -MOVE_AVALANCHE: +Move_AVALANCHE: end -MOVE_ICE_SHARD: +Move_ICE_SHARD: end -MOVE_SHADOW_CLAW: +Move_SHADOW_CLAW: end -MOVE_THUNDER_FANG: +Move_THUNDER_FANG: end -MOVE_ICE_FANG: +Move_ICE_FANG: end -MOVE_FIRE_FANG: +Move_FIRE_FANG: end -MOVE_SHADOW_SNEAK: +Move_SHADOW_SNEAK: end -MOVE_MUD_BOMB: +Move_MUD_BOMB: end -MOVE_PSYCHO_CUT: +Move_PSYCHO_CUT: end -MOVE_ZEN_HEADBUTT: +Move_ZEN_HEADBUTT: end -MOVE_MIRROR_SHOT: +Move_MIRROR_SHOT: end -MOVE_FLASH_CANNON: +Move_FLASH_CANNON: end -MOVE_ROCK_CLIMB: +Move_ROCK_CLIMB: end -MOVE_DEFOG: +Move_DEFOG: end -MOVE_TRICK_ROOM: +Move_TRICK_ROOM: end -MOVE_DRACO_METEOR: +Move_DRACO_METEOR: end -MOVE_DISCHARGE: +Move_DISCHARGE: end -MOVE_LAVA_PLUME: +Move_LAVA_PLUME: end -MOVE_LEAF_STORM: +Move_LEAF_STORM: end -MOVE_POWER_WHIP: +Move_POWER_WHIP: end -MOVE_ROCK_WRECKER: +Move_ROCK_WRECKER: end -MOVE_CROSS_POISON: +Move_CROSS_POISON: end -MOVE_GUNK_SHOT: +Move_GUNK_SHOT: end -MOVE_IRON_HEAD: +Move_IRON_HEAD: end -MOVE_MAGNET_BOMB: +Move_MAGNET_BOMB: end -MOVE_STONE_EDGE: +Move_STONE_EDGE: end -MOVE_CAPTIVATE: +Move_CAPTIVATE: end -MOVE_STEALTH_ROCK: +Move_STEALTH_ROCK: end -MOVE_GRASS_KNOT: +Move_GRASS_KNOT: end -MOVE_CHATTER: +Move_CHATTER: end -MOVE_JUDGMENT: +Move_JUDGMENT: end -MOVE_BUG_BITE: +Move_BUG_BITE: end -MOVE_CHARGE_BEAM: +Move_CHARGE_BEAM: end -MOVE_WOOD_HAMMER: +Move_WOOD_HAMMER: end -MOVE_AQUA_JET: +Move_AQUA_JET: end -MOVE_ATTACK_ORDER: +Move_ATTACK_ORDER: end -MOVE_DEFEND_ORDER: +Move_DEFEND_ORDER: end -MOVE_HEAL_ORDER: +Move_HEAL_ORDER: end -MOVE_HEAD_SMASH: +Move_HEAD_SMASH: end -MOVE_DOUBLE_HIT: +Move_DOUBLE_HIT: end -MOVE_ROAR_OF_TIME: +Move_ROAR_OF_TIME: end -MOVE_SPECIAL_REND: +Move_SPECIAL_REND: end -MOVE_LUNAR_DANCE: +Move_LUNAR_DANCE: end -MOVE_CRUSH_GRIP: +Move_CRUSH_GRIP: end -MOVE_MAGMA_STORM: +Move_MAGMA_STORM: end -MOVE_DARK_VOID: +Move_DARK_VOID: end -MOVE_SEED_FLARE: +Move_SEED_FLARE: end -MOVE_OMINOUS_WIND: +Move_OMINOUS_WIND: end -MOVE_SHADOW_FORCE: +Move_SHADOW_FORCE: end -MOVE_HONE_CLAWS: +Move_HONE_CLAWS: end -MOVE_WIDE_GUARD: +Move_WIDE_GUARD: end -MOVE_GUARD_SPLIT: +Move_GUARD_SPLIT: end -MOVE_POWER_SPLIT: +Move_POWER_SPLIT: end -MOVE_WONDER_ROOM: +Move_WONDER_ROOM: end -MOVE_PSYSHOCK: +Move_PSYSHOCK: end -MOVE_VENOSHOCK: +Move_VENOSHOCK: end -MOVE_AUTOTOMIZE: +Move_AUTOTOMIZE: end -MOVE_RAGE_POWDER: +Move_RAGE_POWDER: end -MOVE_TELEKINESIS: +Move_TELEKINESIS: end -MOVE_MAGIC_ROOM: +Move_MAGIC_ROOM: end -MOVE_SMACK_DOWN: +Move_SMACK_DOWN: end -MOVE_STORM_THROW: +Move_STORM_THROW: end -MOVE_FLAME_BURST: +Move_FLAME_BURST: end -MOVE_SLUDGE_WAVE: +Move_SLUDGE_WAVE: end -MOVE_QUIVER_DANCE: +Move_QUIVER_DANCE: end -MOVE_HEAVY_SLAM: +Move_HEAVY_SLAM: end -MOVE_SYCHRONOISE: +Move_SYCHRONOISE: end -MOVE_ELECTRO_BALL: +Move_ELECTRO_BALL: end -MOVE_SOAK: +Move_SOAK: end -MOVE_FLAME_CHARGE: +Move_FLAME_CHARGE: end -MOVE_COIL: +Move_COIL: end -MOVE_LOW_SWEEP: +Move_LOW_SWEEP: end -MOVE_ACID_SPRAY: +Move_ACID_SPRAY: end -MOVE_FOUL_PLAY: +Move_FOUL_PLAY: end -MOVE_SIMPLE_BEAM: +Move_SIMPLE_BEAM: end -MOVE_ENTRAINMENT: +Move_ENTRAINMENT: end -MOVE_AFTER_YOU: +Move_AFTER_YOU: end -MOVE_ROUND: +Move_ROUND: end -MOVE_ECHOED_VOICE: +Move_ECHOED_VOICE: end -MOVE_CHIP_AWAY: +Move_CHIP_AWAY: end -MOVE_CLEAR_SMOG: +Move_CLEAR_SMOG: end -MOVE_STORED_POWER: +Move_STORED_POWER: end -MOVE_QUICK_GUARD: +Move_QUICK_GUARD: end -MOVE_ALLY_SWITCH: +Move_ALLY_SWITCH: end -MOVE_SCALD: +Move_SCALD: end -MOVE_SHELL_SMASH: +Move_SHELL_SMASH: end -MOVE_HEAL_PULSE: +Move_HEAL_PULSE: end -MOVE_HEX: +Move_HEX: end -MOVE_SKY_DROP: +Move_SKY_DROP: end -MOVE_SHIFT_GEAR: +Move_SHIFT_GEAR: end -MOVE_CIRCLE_THROW: +Move_CIRCLE_THROW: end -MOVE_INCINERATE: +Move_INCINERATE: end -MOVE_QUASH: +Move_QUASH: end -MOVE_ACROBATICS: +Move_ACROBATICS: end -MOVE_REFLECT_TYPE: +Move_REFLECT_TYPE: end -MOVE_RETALITATE: +Move_RETALITATE: end -MOVE_FINAL_GAMBIT: +Move_FINAL_GAMBIT: end -MOVE_BESTOW: +Move_BESTOW: end -MOVE_INFERNO: +Move_INFERNO: end -MOVE_WATER_PLEDGE: +Move_WATER_PLEDGE: end -MOVE_FIRE_PLEDGE: +Move_FIRE_PLEDGE: end -MOVE_GRASS_PLEDGE: +Move_GRASS_PLEDGE: end -MOVE_VOLT_SWITCH: +Move_VOLT_SWITCH: end -MOVE_STRUGGLE_BUG: +Move_STRUGGLE_BUG: end -MOVE_BULLDOZE: +Move_BULLDOZE: end -MOVE_FROST_BREATH: +Move_FROST_BREATH: end -MOVE_DRAGON_TAIL: +Move_DRAGON_TAIL: end -MOVE_WORK_UP: +Move_WORK_UP: end -MOVE_ELECTROWEB: +Move_ELECTROWEB: end -MOVE_WILD_CHARGE: +Move_WILD_CHARGE: end -MOVE_DRILL_RUN: +Move_DRILL_RUN: end -MOVE_DUAL_CHOP: +Move_DUAL_CHOP: end -MOVE_HEART_STAMP: +Move_HEART_STAMP: end -MOVE_HORN_LEECH: +Move_HORN_LEECH: end -MOVE_SACRED_SWORD: +Move_SACRED_SWORD: end -MOVE_RAZOR_SHELL: +Move_RAZOR_SHELL: end -MOVE_HEAT_CRASH: +Move_HEAT_CRASH: end -MOVE_LEAF_TORNADO: +Move_LEAF_TORNADO: end -MOVE_STEAMROLLER: +Move_STEAMROLLER: end -MOVE_COTTON_GUARD: +Move_COTTON_GUARD: end -MOVE_NIGHT_DAZE: +Move_NIGHT_DAZE: end -MOVE_PSYSTRIKE: +Move_PSYSTRIKE: end -MOVE_TAIL_SLAP: +Move_TAIL_SLAP: end -MOVE_HURRICANE: +Move_HURRICANE: end -MOVE_HEAD_CHARGE: +Move_HEAD_CHARGE: end -MOVE_GEAR_GRIND: +Move_GEAR_GRIND: end -MOVE_SEARING_SHOT: +Move_SEARING_SHOT: end -MOVE_TECHNO_BLAST: +Move_TECHNO_BLAST: end -MOVE_RELIC_SONG: +Move_RELIC_SONG: end -MOVE_SECRET_SWORD: +Move_SECRET_SWORD: end -MOVE_GLACIATE: +Move_GLACIATE: end -MOVE_BOLT_STRIKE: +Move_BOLT_STRIKE: end -MOVE_BLUE_FLARE: +Move_BLUE_FLARE: end -MOVE_FIERY_DANCE: +Move_FIERY_DANCE: end -MOVE_FREEZE_SHOCK: +Move_FREEZE_SHOCK: end -MOVE_ICE_BURN: +Move_ICE_BURN: end -MOVE_SNARL: +Move_SNARL: end -MOVE_ICICLE_CRASH: +Move_ICICLE_CRASH: end -MOVE_V_CREATE: +Move_V_CREATE: end -MOVE_FUSION_FLARE: +Move_FUSION_FLARE: end -MOVE_FUSION_BOLT: +Move_FUSION_BOLT: end -MOVE_FLYING_PRESS: +Move_FLYING_PRESS: end -MOVE_MAT_BLOCK: +Move_MAT_BLOCK: end -MOVE_BELCH: +Move_BELCH: end -MOVE_ROTOTILLER: +Move_ROTOTILLER: end -MOVE_STICKY_WEB: +Move_STICKY_WEB: end -MOVE_FELL_STINGER: +Move_FELL_STINGER: end -MOVE_PHANTOM_FORCE: +Move_PHANTOM_FORCE: end -MOVE_TRICK_OR_TREAT: +Move_TRICK_OR_TREAT: end -MOVE_NOBLE_ROAR: +Move_NOBLE_ROAR: end -MOVE_ION_DELUGE: +Move_ION_DELUGE: end -MOVE_PARABOLIC_CHARGE: +Move_PARABOLIC_CHARGE: end -MOVE_FORESTS_CURSE: +Move_FORESTS_CURSE: end -MOVE_PETAL_BLIZZARD: +Move_PETAL_BLIZZARD: end -MOVE_FREEZE_DRY: +Move_FREEZE_DRY: end -MOVE_DISARMING_VOICE: +Move_DISARMING_VOICE: end -MOVE_PARTING_SHOT: +Move_PARTING_SHOT: end -MOVE_TOPSY_TURVY: +Move_TOPSY_TURVY: end -MOVE_DRAINING_KISS: +Move_DRAINING_KISS: end -MOVE_CRAFTY_SHIELD: +Move_CRAFTY_SHIELD: end -MOVE_FLOWER_SHIELD: +Move_FLOWER_SHIELD: end -MOVE_GRASSY_TERRAIN: +Move_GRASSY_TERRAIN: end -MOVE_MISTY_TERRAIN: +Move_MISTY_TERRAIN: end -MOVE_ELECTRIFY: +Move_ELECTRIFY: end -MOVE_PLAY_ROUGH: +Move_PLAY_ROUGH: end -MOVE_FAIRY_WIND: +Move_FAIRY_WIND: end -MOVE_MOONBLAST: +Move_MOONBLAST: end -MOVE_BOOMBURST: +Move_BOOMBURST: end -MOVE_FAIRY_LOCK: +Move_FAIRY_LOCK: end -MOVE_KINGS_SHIELD: +Move_KINGS_SHIELD: end -MOVE_PLAY_NICE: +Move_PLAY_NICE: end -MOVE_CONFIDE: +Move_CONFIDE: end -MOVE_DIAMOND_STORM: +Move_DIAMOND_STORM: end -MOVE_STEAM_ERUPTION: +Move_STEAM_ERUPTION: end -MOVE_HYPERSPACE_HOLE: +Move_HYPERSPACE_HOLE: end -MOVE_WATER_SHURIKEN: +Move_WATER_SHURIKEN: end -MOVE_MYSTICAL_FIRE: +Move_MYSTICAL_FIRE: end -MOVE_SPIKY_SHIELD: +Move_SPIKY_SHIELD: end -MOVE_AROMATIC_MIST: +Move_AROMATIC_MIST: end -MOVE_EERIE_IMPULSE: +Move_EERIE_IMPULSE: end -MOVE_VENOM_DRENCH: +Move_VENOM_DRENCH: end -MOVE_POWDER: +Move_POWDER: end -MOVE_GEOMANCY: +Move_GEOMANCY: end -MOVE_MAGNETIC_FLUX: +Move_MAGNETIC_FLUX: end -MOVE_HAPPY_HOUR: +Move_HAPPY_HOUR: end -MOVE_ELECTRIC_TERRAIN: +Move_ELECTRIC_TERRAIN: end -MOVE_DAZZLING_GLEAM: +Move_DAZZLING_GLEAM: end -MOVE_CELEBRATE: +Move_CELEBRATE: end -MOVE_HOLD_HANDS: +Move_HOLD_HANDS: end -MOVE_BABY_DOLL_EYES: +Move_BABY_DOLL_EYES: end -MOVE_NUZZLE: +Move_NUZZLE: end -MOVE_HOLD_BACK: +Move_HOLD_BACK: end -MOVE_INFESTATION: +Move_INFESTATION: end -MOVE_POWER_UP_PUNCH: +Move_POWER_UP_PUNCH: end -MOVE_OBLIVION_WING: +Move_OBLIVION_WING: end -MOVE_THOUSAND_ARROWS: +Move_THOUSAND_ARROWS: end -MOVE_THOUSAND_WAVES: +Move_THOUSAND_WAVES: end -MOVE_LANDS_WRATH: +Move_LANDS_WRATH: end -MOVE_LIGHT_OF_RUIN: +Move_LIGHT_OF_RUIN: end -MOVE_ORIGIN_PULSE: +Move_ORIGIN_PULSE: end -MOVE_PRECIPICE_BLADES: +Move_PRECIPICE_BLADES: end -MOVE_DRAGON_ASCENT: +Move_DRAGON_ASCENT: end -MOVE_HYPERSPACE_FURY: +Move_HYPERSPACE_FURY: end Move_NONE: From ef11706dc7f36699c07a0a1cd8f40b74d9c0f2be Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 14 Oct 2018 22:37:07 +0200 Subject: [PATCH 155/667] Begin wild double battles --- include/battle_setup.h | 1 + src/battle_script_commands.c | 30 ++++++++++++++++-------------- src/battle_setup.c | 13 ++++++++++--- src/item_use.c | 14 +++++++++++++- src/wild_encounter.c | 13 ++++++++++++- 5 files changed, 52 insertions(+), 19 deletions(-) diff --git a/include/battle_setup.h b/include/battle_setup.h index 0caa3df27c..88100cf4e0 100644 --- a/include/battle_setup.h +++ b/include/battle_setup.h @@ -37,6 +37,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); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 16192425cf..f4debb8fef 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10489,6 +10489,8 @@ static void atkEF_handleballthrow(void) gActiveBattler = gBattlerAttacker; gBattlerTarget = gBattlerAttacker ^ BIT_SIDE; + if (!IsBattlerAlive(gBattlerTarget)) + gBattlerTarget ^= BIT_FLANK; if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { @@ -10630,18 +10632,18 @@ static void atkEF_handleballthrow(void) static void atkF0_givecaughtmon(void) { - if (GiveMonToPlayer(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]]) != MON_GIVEN_TO_PARTY) + if (GiveMonToPlayer(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]]) != MON_GIVEN_TO_PARTY) { if (!sub_813B21C()) { gBattleCommunication[MULTISTRING_CHOOSER] = 0; StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_STORAGE_UNKNOWN))); - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gStringVar2); + GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_NICKNAME, gStringVar2); } else { StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_STORAGE_UNKNOWN))); - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gStringVar2); + GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_NICKNAME, gStringVar2); StringCopy(gStringVar3, GetBoxNamePtr(get_unknown_box_id())); gBattleCommunication[MULTISTRING_CHOOSER] = 2; } @@ -10650,17 +10652,17 @@ static void atkF0_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[gBattlerTarget]], MON_DATA_SPECIES, NULL); + GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_NICKNAME, gBattleResults.caughtMonNick); + gBattleResults.caughtMonBall = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_POKEBALL, NULL); gBattlescriptCurrInstr++; } static void atkF1_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[gBattlerTarget]], MON_DATA_SPECIES, NULL); + u32 personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_PERSONALITY, NULL); if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)) { @@ -10675,7 +10677,7 @@ static void atkF1_trysetcaughtmondexflags(void) static void atkF2_displaydexinfo(void) { - u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL); + u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_SPECIES, NULL); switch (gBattleCommunication[0]) { @@ -10840,13 +10842,13 @@ static void atkF3_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]++; @@ -10855,7 +10857,7 @@ static void atkF3_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; diff --git a/src/battle_setup.c b/src/battle_setup.c index f9fab3d172..96c2de5197 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -80,7 +80,7 @@ extern void CopyTrainerHillTrainerText(u8 a0, u16 arg1); // 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); @@ -378,7 +378,12 @@ void BattleSetup_StartWildBattle(void) if (GetSafariZoneFlag()) DoSafariBattle(); else - DoStandardWildBattle(); + DoStandardWildBattle(FALSE); +} + +void BattleSetup_StartDoubleWildBattle(void) +{ + DoStandardWildBattle(TRUE); } void BattleSetup_StartBattlePikeWildBattle(void) @@ -386,13 +391,15 @@ void BattleSetup_StartBattlePikeWildBattle(void) DoBattlePikeWildBattle(); } -static void DoStandardWildBattle(void) +static void DoStandardWildBattle(bool32 isDouble) { ScriptContext2_Enable(); FreezeEventObjects(); sub_808BCF4(); gMain.savedCallback = CB2_EndWildBattle; gBattleTypeFlags = 0; + if (isDouble) + gBattleTypeFlags |= BATTLE_TYPE_DOUBLE; if (InBattlePyramid()) { VarSet(VAR_TEMP_E, 0); diff --git a/src/item_use.c b/src/item_use.c index 633d975a8c..6099c0b65c 100755 --- a/src/item_use.c +++ b/src/item_use.c @@ -931,7 +931,17 @@ 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. + { + u8 textCantThrowPokeBall[] = _("Cannot throw a ball!\nThere are two pokemon out there!\p"); + + if (!InBattlePyramid()) + DisplayItemMessage(taskId, 1, textCantThrowPokeBall, bag_menu_inits_lists_menu); + else + DisplayItemMessageInBattlePyramid(taskId, textCantThrowPokeBall, sub_81C6714); + } + else if (IsPlayerPartyAndPokemonStorageFull() == FALSE) // have room for mon? { RemoveBagItem(gSpecialVar_ItemId, 1); if (!InBattlePyramid()) @@ -944,7 +954,9 @@ void ItemUseInBattle_PokeBall(u8 taskId) DisplayItemMessage(taskId, 1, gText_BoxFull, bag_menu_inits_lists_menu); } else + { DisplayItemMessageInBattlePyramid(taskId, gText_BoxFull, sub_81C6714); + } } void sub_80FE408(u8 taskId) diff --git a/src/wild_encounter.c b/src/wild_encounter.c index 9a22323ffc..8a3ee01488 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -18,6 +18,7 @@ #include "tv.h" #include "link.h" #include "script.h" +#include "battle_debug.h" #include "constants/items.h" #include "constants/maps.h" @@ -5146,7 +5147,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 && 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; } From 67384c08be02e3f00a9090c50da26543abd53f59 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 15 Oct 2018 21:19:52 +0200 Subject: [PATCH 156/667] Implement double wild battle functionality --- charmap.txt | 1 + include/battle.h | 1 + include/battle_message.h | 1 + src/battle_controller_player.c | 4 +-- src/battle_main.c | 62 ++++++++++++++++++++++------------ src/battle_message.c | 19 ++++++++--- src/battle_script_commands.c | 34 +++++++++++-------- src/item_use.c | 9 +++++ 8 files changed, 88 insertions(+), 43 deletions(-) diff --git a/charmap.txt b/charmap.txt index 89ca96f558..8c7a99c364 100644 --- a/charmap.txt +++ b/charmap.txt @@ -399,6 +399,7 @@ B_BUFF3 = FD 34 B_ATK_TRAINER_NAME = FD 35 B_ATK_TRAINER_CLASS = FD 36 B_ATK_TEAM = FD 37 +B_DEF_NAME = FD 38 @ indicates the end of a town/city name (before " TOWN" or " CITY") NAME_END = FC 00 diff --git a/include/battle.h b/include/battle.h index 9be4a745bb..cb13251d5f 100644 --- a/include/battle.h +++ b/include/battle.h @@ -581,6 +581,7 @@ struct BattleStruct u32 debugAIFlags; bool8 notfirstTimeAIFlags; u8 activeAbilityPopUps; // as bits for each battler + bool8 throwingPokeBall; struct MegaEvolutionData mega; }; diff --git a/include/battle_message.h b/include/battle_message.h index 9923230c02..449df1fb33 100644 --- a/include/battle_message.h +++ b/include/battle_message.h @@ -60,6 +60,7 @@ #define B_TXT_ATK_TRAINER_NAME 0x35 #define B_TXT_ATK_TRAINER_CLASS 0x36 #define B_TXT_ATK_TEAM 0x37 +#define B_TXT_DEF_NAME 0x38 // for B_TXT_BUFF1, B_TXT_BUFF2 and B_TXT_BUFF3 diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index e4083f567e..12f1f37afb 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -2452,7 +2452,7 @@ 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); + InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gBattlerTarget, B_ANIM_BALL_THROW); gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone; } @@ -2462,7 +2462,7 @@ static void PlayerHandleBallThrowAnim(void) gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId; gDoingBattleAnim = TRUE; - InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW); + InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gBattlerTarget, B_ANIM_BALL_THROW); gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone; } diff --git a/src/battle_main.c b/src/battle_main.c index 184435024b..13f90aa053 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4063,6 +4063,19 @@ u8 IsRunningFromBattleImpossible(void) gPotentialItemEffectBattler = gActiveBattler; + 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 + && gBattleTypeFlags & BATTLE_TYPE_DOUBLE + && !(gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK))) // The second pokemon cannot run from a double wild battle. + { + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + return 1; + } + if (holdEffect == HOLD_EFFECT_CAN_ALWAYS_RUN) return 0; if (gBattleTypeFlags & BATTLE_TYPE_LINK) @@ -4107,11 +4120,6 @@ u8 IsRunningFromBattleImpossible(void) gBattleCommunication[MULTISTRING_CHOOSER] = 0; return 1; } - if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) - { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - return 1; - } return 0; } @@ -4197,6 +4205,13 @@ static void HandleTurnActionSelectionState(void) gChosenActionByBattler[gActiveBattler] = B_ACTION_USE_MOVE; gBattleCommunication[gActiveBattler] = STATE_WAIT_ACTION_CONFIRMED_STANDBY; } + else if (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)); @@ -4454,6 +4469,8 @@ static void HandleTurnActionSelectionState(void) else { gLastUsedItem = (gBattleBufferB[gActiveBattler][1] | (gBattleBufferB[gActiveBattler][2] << 8)); + if (ItemId_GetPocket(gLastUsedItem) == POCKET_POKE_BALLS) + gBattleStruct->throwingPokeBall = TRUE; gBattleCommunication[gActiveBattler]++; } break; @@ -5804,25 +5821,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 = sub_81A9E28(); - 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 = sub_81A9E28(); + 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++; diff --git a/src/battle_message.c b/src/battle_message.c index 5594fd7fb4..e16ffcac18 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -477,13 +477,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!{UNKNOWN_A}{PLAY_BGM MUS_KACHI22}\p"); -static const u8 sText_GotchaPkmnCaught2[] = _("Gotcha!\n{B_OPPONENT_MON1_NAME} was caught!{UNKNOWN_A}{PLAY_BGM MUS_KACHI22}{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!{UNKNOWN_A}{PLAY_BGM MUS_KACHI22}\p"); +static const u8 sText_GotchaPkmnCaught2[] = _("Gotcha!\n{B_DEF_NAME} was caught!{UNKNOWN_A}{PLAY_BGM MUS_KACHI22}{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"); @@ -2858,6 +2858,15 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) case B_TXT_DEF_NAME_WITH_PREFIX: // target name with prefix HANDLE_NICKNAME_STRING_CASE(gBattlerTarget, gBattlerPartyIndexes[gBattlerTarget]) break; + case B_TXT_DEF_NAME: // target name + if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER) + GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_NICKNAME, text); + else + GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], 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]) break; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f4debb8fef..ef8c0b582e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10480,6 +10480,14 @@ static void atkEE_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 atkEF_handleballthrow(void) { u8 ballMultiplier = 0; @@ -10488,9 +10496,7 @@ static void atkEF_handleballthrow(void) return; gActiveBattler = gBattlerAttacker; - gBattlerTarget = gBattlerAttacker ^ BIT_SIDE; - if (!IsBattlerAlive(gBattlerTarget)) - gBattlerTarget ^= BIT_FLANK; + gBattlerTarget = GetCatchingBattler(); if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { @@ -10632,18 +10638,18 @@ static void atkEF_handleballthrow(void) static void atkF0_givecaughtmon(void) { - if (GiveMonToPlayer(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]]) != MON_GIVEN_TO_PARTY) + if (GiveMonToPlayer(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]]) != MON_GIVEN_TO_PARTY) { if (!sub_813B21C()) { gBattleCommunication[MULTISTRING_CHOOSER] = 0; StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_STORAGE_UNKNOWN))); - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_NICKNAME, gStringVar2); + GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_NICKNAME, gStringVar2); } else { StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_STORAGE_UNKNOWN))); - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_NICKNAME, gStringVar2); + GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_NICKNAME, gStringVar2); StringCopy(gStringVar3, GetBoxNamePtr(get_unknown_box_id())); gBattleCommunication[MULTISTRING_CHOOSER] = 2; } @@ -10652,17 +10658,17 @@ static void atkF0_givecaughtmon(void) gBattleCommunication[MULTISTRING_CHOOSER]++; } - gBattleResults.caughtMonSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_SPECIES, NULL); - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_NICKNAME, gBattleResults.caughtMonNick); - gBattleResults.caughtMonBall = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], 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 atkF1_trysetcaughtmondexflags(void) { - u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_SPECIES, NULL); - u32 personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], 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)) { @@ -10677,7 +10683,7 @@ static void atkF1_trysetcaughtmondexflags(void) static void atkF2_displaydexinfo(void) { - u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_SPECIES, NULL); + u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetCatchingBattler()]], MON_DATA_SPECIES, NULL); switch (gBattleCommunication[0]) { @@ -10690,8 +10696,8 @@ static void atkF2_displaydexinfo(void) { FreeAllWindowBuffers(); gBattleCommunication[TASK_ID] = CreateDexDisplayMonDataTask(SpeciesToNationalPokedexNum(species), - gBattleMons[gBattlerTarget].otId, - gBattleMons[gBattlerTarget].personality); + gBattleMons[GetCatchingBattler()].otId, + gBattleMons[GetCatchingBattler()].personality); gBattleCommunication[0]++; } break; diff --git a/src/item_use.c b/src/item_use.c index 6099c0b65c..b218012875 100755 --- a/src/item_use.c +++ b/src/item_use.c @@ -941,6 +941,15 @@ void ItemUseInBattle_PokeBall(u8 taskId) else DisplayItemMessageInBattlePyramid(taskId, textCantThrowPokeBall, sub_81C6714); } + else if (gBattlerInMenuId == GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT)) // Attempting to throw a ball with the second pokemon. + { + u8 textCantThrowPokeBall[] = _("Cannot throw a ball!\p"); + + if (!InBattlePyramid()) + DisplayItemMessage(taskId, 1, textCantThrowPokeBall, bag_menu_inits_lists_menu); + else + DisplayItemMessageInBattlePyramid(taskId, textCantThrowPokeBall, sub_81C6714); + } else if (IsPlayerPartyAndPokemonStorageFull() == FALSE) // have room for mon? { RemoveBagItem(gSpecialVar_ItemId, 1); From d3215ff96f79b8ceafc8e0778187d6dd14d844dc Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 16 Oct 2018 22:19:53 +0200 Subject: [PATCH 157/667] Fix wild double battle issues --- include/constants/battle.h | 2 ++ src/battle_main.c | 17 +++++++++++------ src/battle_script_commands.c | 8 ++++++-- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/include/constants/battle.h b/include/constants/battle.h index 31d77f3aee..5448b1ab8a 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -79,6 +79,8 @@ #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)))) + // Battle Outcome defines #define B_OUTCOME_WON 0x1 #define B_OUTCOME_LOST 0x2 diff --git a/src/battle_main.c b/src/battle_main.c index 13f90aa053..eb260a196b 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -2633,7 +2633,10 @@ void oac_poke_opponent(struct Sprite *sprite) { sprite->callback = sub_803980C; 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 sub_803980C(struct Sprite *sprite) @@ -2656,7 +2659,10 @@ static void sub_8039838(struct Sprite *sprite) SetHealthboxSpriteVisible(gHealthboxSpriteIds[sprite->sBattler]); sprite->callback = sub_8039894; 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)); } } @@ -4068,9 +4074,7 @@ u8 IsRunningFromBattleImpossible(void) gBattleCommunication[MULTISTRING_CHOOSER] = 1; return 1; } - if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT - && gBattleTypeFlags & BATTLE_TYPE_DOUBLE - && !(gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK))) // The second pokemon cannot run from a double wild battle. + if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT && WILD_DOUBLE_BATTLE) // The second pokemon cannot run from a double wild battle. { gBattleCommunication[MULTISTRING_CHOOSER] = 0; return 1; @@ -4205,7 +4209,8 @@ static void HandleTurnActionSelectionState(void) gChosenActionByBattler[gActiveBattler] = B_ACTION_USE_MOVE; gBattleCommunication[gActiveBattler] = STATE_WAIT_ACTION_CONFIRMED_STANDBY; } - else if (position == B_POSITION_PLAYER_RIGHT + else if (WILD_DOUBLE_BATTLE + && position == B_POSITION_PLAYER_RIGHT && (gBattleStruct->throwingPokeBall || gChosenActionByBattler[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)] == B_ACTION_RUN)) { gBattleStruct->throwingPokeBall = FALSE; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ef8c0b582e..8f96a2692d 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3196,8 +3196,12 @@ static void atk23_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_KACHI2); From 68d94ad3162d560f2decf3a846a73f79f0ea2d45 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 3 Nov 2018 01:17:16 +0100 Subject: [PATCH 158/667] Implement trainer sliding --- asm/macros/battle_script.inc | 13 ++++ data/battle_scripts_1.s | 3 + data/battle_scripts_2.s | 14 ++++ include/battle.h | 2 + include/battle_message.h | 8 ++ include/battle_scripts.h | 2 + include/constants/battle_script_commands.h | 3 + include/constants/battle_string_ids.h | 1 + src/battle_main.c | 2 + src/battle_message.c | 88 ++++++++++++++++++++++ src/battle_script_commands.c | 36 +++++++++ 11 files changed, 172 insertions(+) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 4b323ab8ff..d6645f602b 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1553,6 +1553,19 @@ various \battler, VARIOUS_JUMP_IF_NOT_GROUNDED .4byte \ptr .endm + + .macro handletrainerslidemsg battler, field + various \battler, VARIOUS_HANDLE_TRAINER_SLIDE_MSG + .byte \field + .endm + + .macro trytrainerslidefirstdownmsg battler + various \battler, VARIOUS_TRY_TRAINER_SLIDE_MSG_FIRST_OFF + .endm + + .macro trytrainerslidelastonmsg battler + various \battler, VARIOUS_TRY_TRAINER_SLIDE_MSG_LAST_ON + .endm @ helpful macros .macro setstatchanger stat, stages, down diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index b0fb9ba0c1..657cbf4214 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4213,6 +4213,7 @@ BattleScript_FaintAttacker:: dofaintanimation BS_ATTACKER cleareffectsonfaint BS_ATTACKER printstring STRINGID_ATTACKERFAINTED + trytrainerslidefirstdownmsg BS_ATTACKER return BattleScript_FaintTarget:: @@ -4223,6 +4224,7 @@ BattleScript_FaintTarget:: printstring STRINGID_TARGETFAINTED tryactivatemoxie BS_ATTACKER tryactivatefellstinger BS_ATTACKER + trytrainerslidefirstdownmsg BS_TARGET return BattleScript_GiveExp:: @@ -4288,6 +4290,7 @@ BattleScript_FaintedMonChooseAnother:: switchinanim BS_FAINTED, FALSE waitstate various7 BS_ATTACKER + trytrainerslidelastonmsg BS_FAINTED switchineffects BS_FAINTED jumpifbattletype BATTLE_TYPE_DOUBLE, BattleScript_FaintedMonEnd cancelallactions diff --git a/data/battle_scripts_2.s b/data/battle_scripts_2.s index 86ef91e71e..53c4cf901d 100644 --- a/data/battle_scripts_2.s +++ b/data/battle_scripts_2.s @@ -213,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/include/battle.h b/include/battle.h index 6240a51b04..8764ebadf8 100644 --- a/include/battle.h +++ b/include/battle.h @@ -583,6 +583,8 @@ struct BattleStruct u8 activeAbilityPopUps; // as bits for each battler bool8 throwingPokeBall; struct MegaEvolutionData mega; + const u8 *trainerSlideMsg; + bool8 trainerSlideLowHpMsgDone; }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/include/battle_message.h b/include/battle_message.h index 449df1fb33..cb39fa7fec 100644 --- a/include/battle_message.h +++ b/include/battle_message.h @@ -214,12 +214,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 arg1); void SetPpNumbersPaletteInMoveSelection(void); u8 GetCurrentPpToMaxPpState(u8 currentPp, u8 maxPp); +bool32 ShouldDoTrainerSlide(u32 battlerId, u32 trainerId, u32 which); extern struct BattleMsgData *gBattleMsgDataPtr; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 40bebc1c34..736da30fc3 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -280,5 +280,7 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 899e619f57..8d0117d676 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -120,6 +120,9 @@ #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 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index ac0b0bc3c2..fa8c359b25 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -9,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 diff --git a/src/battle_main.c b/src/battle_main.c index 2604359a29..3ffaad8920 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4052,6 +4052,8 @@ void BattleTurnPassed(void) BattleScriptExecute(BattleScript_82DB881); else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->field_DA == 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) diff --git a/src/battle_message.c b/src/battle_message.c index 46e951b2bc..b78c8252cd 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -3,6 +3,7 @@ #include "battle_message.h" #include "constants/battle_string_ids.h" #include "constants/moves.h" +#include "constants/species.h" #include "text.h" #include "string_util.h" #include "constants/items.h" @@ -2519,6 +2520,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) { @@ -3457,3 +3461,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_script_commands.c b/src/battle_script_commands.c index 693482bcb2..d8bf50be17 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7073,6 +7073,42 @@ static void atk76_various(void) else gBattlescriptCurrInstr += 7; return; + case VARIOUS_HANDLE_TRAINER_SLIDE_MSG: + if (gBattlescriptCurrInstr[3] == 0) + { + gBattleScripting.savedDmg = gBattlerSpriteIds[gActiveBattler]; + } + else if (gBattlescriptCurrInstr[3] == 1) + { + BtlController_EmitPrintString(0, STRINGID_TRAINERSLIDE); + MarkBattlerForControllerExec(gActiveBattler); + } + else + { + gBattlerSpriteIds[gActiveBattler] = gBattleScripting.savedDmg; + if (gBattleMons[gActiveBattler].hp != 0) + { + 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; } gBattlescriptCurrInstr += 3; From 52a68f6f1c8e8a853d45ece9085eacd8cab4285a Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 3 Nov 2018 10:51:51 +0100 Subject: [PATCH 159/667] Introduce ability pop-up define --- include/constants/battle_config.h | 1 + src/battle_interface.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 0be88b4421..2e44012c2d 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -13,5 +13,6 @@ #define B_GALE_WINGS GEN_6 // Gen7 requires full hp. #define B_SOUND_SUBSTITUTE GEN_6 // Starting from gen6 sound moves bypass Substitute. #define B_EXP_CATCH GEN_6 // Starting from gen6, pokemon get experience from catching. +#define B_ABILITY_POP_UP GEN_6 // Starting from gen5, the pokemon abilities are displayed in a pop-up, when they activate in battle. #endif // GUARD_CONSTANTS_BATTLE_CONFIG_H diff --git a/src/battle_interface.c b/src/battle_interface.c index 6691b6f33c..b2664487b1 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -26,6 +26,7 @@ #include "data2.h" #include "battle_debug.h" #include "malloc.h" +#include "constants/battle_config.h" struct TestingBar { @@ -3110,6 +3111,9 @@ 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); From bc42de5f600bd6787111c6b0972c3866ea098a01 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 3 Nov 2018 14:35:45 +0100 Subject: [PATCH 160/667] Aurora Veil, Revelation Dance, Diamond Storm --- asm/macros/battle_script.inc | 4 +++ data/battle_scripts_1.s | 15 +++++++++++ include/constants/battle_move_effects.h | 3 +++ include/constants/battle_script_commands.h | 1 + src/battle_main.c | 7 +++++ src/battle_script_commands.c | 31 ++++++++++++++++++++-- src/data/battle_moves.h | 12 ++++----- 7 files changed, 65 insertions(+), 8 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index d6645f602b..d5984c322c 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1566,6 +1566,10 @@ .macro trytrainerslidelastonmsg battler various \battler, VARIOUS_TRY_TRAINER_SLIDE_MSG_LAST_ON .endm + + .macro setauroraveil battler + various \battler, VARIOUS_SET_AURORA_VEIL + .endm @ helpful macros .macro setstatchanger stat, stages, down diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 657cbf4214..b006698466 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -331,6 +331,13 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectFlowerShield .4byte BattleScript_EffectHitPreventEscape .4byte BattleScript_EffectSpeedSwap + .4byte BattleScript_EffectDefenseUp2Hit + .4byte BattleScript_EffectRevelationDance + .4byte BattleScript_EffectAuroraVeil + +BattleScript_EffectDefenseUp2Hit: + setmoveeffect MOVE_EFFECT_DEF_PLUS_2 | MOVE_EFFECT_AFFECTS_USER + goto BattleScript_EffectHit BattleScript_EffectFlowerShield: attackcanceler @@ -1579,6 +1586,7 @@ BattleScript_EffectTwoTypedMove: BattleScript_EffectTechnoBlast: BattleScript_EffectJudgment: BattleScript_EffectFusionCombo: +BattleScript_EffectRevelationDance: jumpifnotmove MOVE_SURF, BattleScript_HitFromAtkCanceler jumpifnostatus3 BS_TARGET, STATUS3_UNDERWATER, BattleScript_HitFromAtkCanceler orword gHitMarker, HITMARKER_IGNORE_UNDERWATER @@ -2114,6 +2122,13 @@ BattleScript_ImmunityProtected:: BattleScript_EffectPayDay:: setmoveeffect MOVE_EFFECT_PAYDAY goto BattleScript_EffectHit + +BattleScript_EffectAuroraVeil: + attackcanceler + attackstring + ppreduce + setauroraveil BS_ATTACKER + goto BattleScript_PrintReflectLightScreenSafeguardString BattleScript_EffectLightScreen:: attackcanceler diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 1524353d35..d8cf1e6ad7 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -319,5 +319,8 @@ #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 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 8d0117d676..1b9183cf47 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -123,6 +123,7 @@ #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 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/src/battle_main.c b/src/battle_main.c index 3ffaad8920..e0c7c3d1b6 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5422,6 +5422,13 @@ void SetTypeBeforeUsingMove(u16 move, u8 battlerAtk) { // 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; + } attackerAbility = GetBattlerAbility(battlerAtk); GET_MOVE_TYPE(move, moveType); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d8bf50be17..cb95fb6fab 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7109,6 +7109,27 @@ static void atk76_various(void) return; } break; + case VARIOUS_SET_AURORA_VEIL: + if (gSideStatuses[GET_BATTLER_SIDE(gActiveBattler)] & SIDE_STATUS_AURORA_VEIL) + { + 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; } gBattlescriptCurrInstr += 3; @@ -7331,7 +7352,10 @@ static void atk7E_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) @@ -8090,7 +8114,10 @@ static void atk92_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) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 639e9c50be..936d2e76c3 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -7106,7 +7106,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_STATUS, }, { // MOVE_DIAMOND_STORM - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_DEFENSE_UP2_HIT, .power = 100, .type = TYPE_ROCK, .accuracy = 95, @@ -7383,7 +7383,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .argument = 75, // restores 75% HP instead of 50% HP }, { // MOVE_THOUSAND_ARROWS - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_SMACK_DOWN, .power = 90, .type = TYPE_GROUND, .accuracy = 100, @@ -7455,7 +7455,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_PHYSICAL, }, { // MOVE_DRAGON_ASCENT - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_CLOSE_COMBAT, .power = 120, .type = TYPE_FLYING, .accuracy = 100, @@ -7803,7 +7803,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_STATUS, }, { // MOVE_REVELATION_DANCE - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_REVELATION_DANCE, .power = 90, .type = TYPE_NORMAL, .accuracy = 100, @@ -7812,7 +7812,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_STATUS, + .split = SPLIT_SPECIAL, }, { // MOVE_CORE_ENFORCER .effect = EFFECT_PLACEHOLDER, @@ -7899,7 +7899,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_PHYSICAL, }, { // MOVE_AURORA_VEIL - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_AURORA_VEIL, .power = 0, .type = TYPE_ICE, .accuracy = 0, From c3eac92af85224ef6d8dbe01db2404e3a335a771 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 3 Nov 2018 23:32:18 +0100 Subject: [PATCH 161/667] fix protect --- data/battle_ai_scripts.s | 2 ++ src/battle_script_commands.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 02904e3f61..b1b9f795fb 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -2918,8 +2918,10 @@ AI_TryToFaint_DoubleSuperEffective: AI_TryToFaint_TryToEncourageQuickAttack: if_effect EFFECT_EXPLOSION, AI_TryToFaint_End + if_user_faster AI_TryToFaint_ScoreUp4 if_move_flag FLAG_HIGH_CRIT AI_TryToFaint_ScoreUp4 score +2 + end AI_TryToFaint_ScoreUp4: score +4 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index cb95fb6fab..9b5e8351d0 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7139,7 +7139,7 @@ static void atk77_setprotectlike(void) // protect and endure { bool32 notLastTurn = TRUE; - if (gBattleMoves[gLastResultingMoves[gBattlerAttacker]].flags & FLAG_PROTECTION_MOVE) + if (!(gBattleMoves[gLastResultingMoves[gBattlerAttacker]].flags & FLAG_PROTECTION_MOVE)) gDisableStructs[gBattlerAttacker].protectUses = 0; if (gCurrentTurnActionNumber == (gBattlersCount - 1)) From 15b8046b2b67d352a67d03ba853c4dff3dc40299 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 17 Nov 2018 12:10:24 +0100 Subject: [PATCH 162/667] Add third type --- asm/macros/battle_script.inc | 5 +++++ data/battle_scripts_1.s | 13 +++++++++++++ include/battle.h | 11 ++++++----- include/battle_controllers.h | 1 + include/constants/battle_move_effects.h | 1 + include/constants/battle_script_commands.h | 1 + include/constants/battle_string_ids.h | 1 + include/pokemon.h | 2 +- src/battle_controller_player.c | 2 +- src/battle_debug.c | 4 ++-- src/battle_gfx_sfx_util.c | 2 +- src/battle_main.c | 5 +++++ src/battle_message.c | 2 ++ src/battle_script_commands.c | 12 ++++++++++++ src/battle_util.c | 3 +++ src/data/battle_moves.h | 6 ++++-- 16 files changed, 59 insertions(+), 12 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 055edbbce3..8a8e12e9a7 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1570,6 +1570,11 @@ .macro setauroraveil battler various \battler, VARIOUS_SET_AURORA_VEIL .endm + + .macro trysetthirdtype battler, ptr + various \battler, VARIOUS_TRY_THIRD_TYPE + .4byte \ptr + .endm @ helpful macros .macro setstatchanger stat, stages, down diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 37b4433eb2..3a4df269d7 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -334,6 +334,19 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectDefenseUp2Hit .4byte BattleScript_EffectRevelationDance .4byte BattleScript_EffectAuroraVeil + .4byte BattleScript_EffectThirdType + +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 diff --git a/include/battle.h b/include/battle.h index f6c8045195..3aab577abd 100644 --- a/include/battle.h +++ b/include/battle.h @@ -603,11 +603,12 @@ struct BattleStruct #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 diff --git a/include/battle_controllers.h b/include/battle_controllers.h index b60dfb469f..dae1dd8f01 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -111,6 +111,7 @@ struct ChooseMoveStruct u16 species; u8 monType1; u8 monType2; + u8 monType3; struct MegaEvolutionData mega; }; diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index d8cf1e6ad7..6b956aed7d 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -322,5 +322,6 @@ #define EFFECT_DEFENSE_UP2_HIT 316 #define EFFECT_REVELATION_DANCE 317 #define EFFECT_AURORA_VEIL 318 +#define EFFECT_THIRD_TYPE 319 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index f32622f0d0..c4ba51f132 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -131,6 +131,7 @@ #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 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index fa8c359b25..3205a30372 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -511,6 +511,7 @@ #define STRINGID_NOEFFECTONTARGET 507 #define STRINGID_BURSTINGFLAMESHIT 508 #define STRINGID_BESTOWITEMGIVING 509 +#define STRINGID_THIRDTYPEADDED 510 #define BATTLESTRINGS_COUNT 521 diff --git a/include/pokemon.h b/include/pokemon.h index ba5802c77f..e0b44775e7 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -316,7 +316,7 @@ struct BattlePokemon /*0x20*/ u8 ability; /*0x21*/ u8 type1; /*0x22*/ u8 type2; - /*0x23*/ u8 unknown; + /*0x23*/ u8 type3; /*0x24*/ u8 pp[4]; /*0x28*/ u16 hp; /*0x2A*/ u8 level; diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 49d5d5cfe1..7a0da96e54 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -506,7 +506,7 @@ static void HandleInputChooseMove(void) 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; diff --git a/src/battle_debug.c b/src/battle_debug.c index 91d597d464..d7e5cd393c 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -854,7 +854,7 @@ static void CreateSecondaryListMenu(struct BattleDebugMenu *data) itemsCount = 1; break; case LIST_ITEM_TYPES: - itemsCount = 2; + itemsCount = 3; break; case LIST_ITEM_MOVES: case LIST_ITEM_PP: @@ -972,7 +972,7 @@ static void PrintSecondaryEntries(struct BattleDebugMenu *data) AddTextPrinter(&printer, 0, NULL); break; case LIST_ITEM_TYPES: - for (i = 0; i < 2; i++) + for (i = 0; i < 3; i++) { u8 *types = &gBattleMons[data->battlerId].type1; diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 3acc97d06a..7ad886bdd7 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -221,7 +221,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) var1 = MOVE_TARGET_USER; else var1 = MOVE_TARGET_SELECTED; diff --git a/src/battle_main.c b/src/battle_main.c index 3d10ac40dc..1c2538c1ae 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3319,6 +3319,7 @@ void FaintClearSetData(void) 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); @@ -3389,6 +3390,7 @@ static void BattleIntroDrawTrainersOrMonsSprites(void) 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].altAbility); hpOnSwitchout = &gBattleStruct->hpOnSwitchout[GetBattlerSide(gActiveBattler)]; *hpOnSwitchout = gBattleMons[gActiveBattler].hp; @@ -4256,6 +4258,7 @@ static void HandleTurnActionSelectionState(void) moveInfo.species = gBattleMons[gActiveBattler].species; moveInfo.monType1 = gBattleMons[gActiveBattler].type1; moveInfo.monType2 = gBattleMons[gActiveBattler].type2; + moveInfo.monType3 = gBattleMons[gActiveBattler].type3; for (i = 0; i < 4; i++) { @@ -5426,6 +5429,8 @@ void SetTypeBeforeUsingMove(u16 move, u8 battlerAtk) 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; } attackerAbility = GetBattlerAbility(battlerAtk); diff --git a/src/battle_message.c b/src/battle_message.c index 590bbabc97..e5ba3d30b1 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -648,6 +648,7 @@ static const u8 sText_Infestation[] = _("{B_DEF_NAME_WITH_PREFIX} has been affli 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}!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { @@ -1150,6 +1151,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_NoEffectOnTarget, sText_BurstingFlames, sText_BestowItemGiving, + sText_ThirdTypeAdded, }; const u16 gTerrainStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d632677f05..39af970dad 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7127,6 +7127,18 @@ static void atk76_various(void) 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; diff --git a/src/battle_util.c b/src/battle_util.c index 49da1613ea..7dffd85f32 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5483,6 +5483,9 @@ static u16 CalcTypeEffectivenessMultiplierInternal(u16 move, u8 moveType, u8 bat MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, gBattleMons[battlerDef].type1, atkAbility); if (gBattleMons[battlerDef].type2 != gBattleMons[battlerDef].type1) MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, gBattleMons[battlerDef].type2, atkAbility); + 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, atkAbility); if (moveType == TYPE_GROUND && !IsBattlerGrounded(battlerDef)) { diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 936d2e76c3..aa023a9216 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -6817,7 +6817,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_PHYSICAL, }, { // MOVE_TRICK_OR_TREAT - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_THIRD_TYPE, .power = 0, .type = TYPE_GHOST, .accuracy = 100, @@ -6827,6 +6827,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, .split = SPLIT_STATUS, + .argument = TYPE_GHOST, }, { // MOVE_NOBLE_ROAR .effect = EFFECT_NOBLE_ROAR, @@ -6865,7 +6866,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_SPECIAL, }, { // MOVE_FOREST_S_CURSE - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_THIRD_TYPE, .power = 0, .type = TYPE_GRASS, .accuracy = 100, @@ -6875,6 +6876,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, .split = SPLIT_STATUS, + .argument = TYPE_GRASS, }, { // MOVE_PETAL_BLIZZARD .effect = EFFECT_HIT, From fe8c70b9f8b1baafda3becd928f38dc2dc8fdbe2 Mon Sep 17 00:00:00 2001 From: PALPATlNE Date: Sat, 17 Nov 2018 19:59:03 +0100 Subject: [PATCH 163/667] Fix --- data/battle_anim_scripts.s | 569 ++++++++++++++++++++++++++++++++++++- 1 file changed, 563 insertions(+), 6 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 9cd1005cff..9f96797b4e 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -689,43 +689,203 @@ gBattleAnims_Special:: .4byte Special_MonToSubstitute Move_ROOST: + loadspritegfx ANIM_TAG_WHITE_FEATHER + loadspritegfx ANIM_TAG_BLUE_STAR + monbg ANIM_DEF_PARTNER + monbgprio_29 + playsewithpan SE_W080, SOUND_PAN_TARGET + delay 0 + createsprite gUnknown_08596388, 128, 0, -16, 64, 2, 104, 11304, 32, 1 + delay 6 + createsprite gUnknown_08596388, 128, 0, -16, 32, 2, 104, 11304, 32, 1 + createsprite gUnknown_08596388, 128, 0, -16, 0, 2, 104, 11304, 32, 1 + delay 6 + createsprite gUnknown_08596388, 128, 0, -16, 224, 2, 104, 11304, 32, 1 + createsprite gUnknown_08596388, 128, 0, -16, 128, 2, 104, 11304, 32, 1 + delay 6 + createsprite gUnknown_08596388, 128, 0, -16, 192, 2, 104, 11304, 32, 1 + createsprite gUnknown_08596388, 128, 0, -16, 160, 2, 104, 11304, 32, 1 + delay 6 + createsprite gUnknown_08596388, 128, 0, -16, 96, 2, 104, 11304, 32, 1 + waitforvisualfinish + call HealingEffect + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER end Move_GRAVITY: fadetobg BG_COSMIC waitbgfadein - createvisualtask sub_8117660, 0x2, 0x0, 0x80, 0x0, 0xffff - createvisualtask sub_81080E4, 0x5, 0x0 - playsewithpan 0xa2, 0xc0 - delay 0x2c - playsewithpan 0xe9, 0xc0 + playsewithpan SE_W036, 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: - end + loadspritegfx ANIM_TAG_TEAL_ALERT + loadspritegfx ANIM_TAG_OPENING_EYE + loadspritegfx ANIM_TAG_ROUND_WHITE_HALO + monbg ANIM_DEF_PARTNER + call SetPsychicBackground + playsewithpan SE_W109, SOUND_PAN_TARGET + createsprite gUnknown_085CE07C, ANIM_ATTACKER, 5, 0, 0, 1, 0 + createsprite gUnknown_085CE094, ANIM_ATTACKER, 5 + delay 40 + playsewithpan SE_W043, SOUND_PAN_TARGET + createvisualtask sub_8115A04, 2, 1, 1, 2, 0, 10, RGB_BLACK + call MindReaderEffect + waitforvisualfinish + call UnsetPsychicBackground + 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_W104, SOUND_PAN_TARGET + createsprite gUnknown_08595E68, 2, -16, 0, 0, 0, 10, 1, 3, 0 + waitforvisualfinish + playsewithpan SE_W003, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, 3, 0, 0, 1, 2 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 2 + waitforvisualfinish + createsprite gUnknown_085CE894, 130, 1, 8, 3 + loopsewithpan SE_W207B, +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_W004, SOUND_PAN_ATTACKER + createsprite gSlideMonToOffsetSpriteTemplate, 2, 0, 20, 3, 0, 4 + delay 1 + createsprite gUnknown_085928D0, 2, 0, 0 + delay 3 + setarg 7, 0 + createsprite gBasicHitSplatSpriteTemplate, 131, 10, -8, 1, 1 + playsewithpan SE_W088, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 5, 1 + createsprite gUnknown_08596CB0, 130, -12, 32, 3, 4 + createsprite gUnknown_08596CB0, 130, 8, 31, 2, 2 + createsprite gUnknown_08596CB0, 130, -4, 28, 2, 3 + createsprite gUnknown_08596CB0, 130, 12, 30, 4, 3 + createsprite gSlideMonToOriginalPosSpriteTemplate, 2, 0, 0, 5 + clearmonbg ANIM_TARGET + blendoff end Move_GYRO_BALL: + loadspritegfx ANIM_TAG_IMPACT + loopsewithpan SE_W231, SOUND_PAN_ATTACKER, 28, 2 + createvisualtask sub_81144F8, 5, 0, 0, 0 + waitforvisualfinish + playsewithpan SE_W207, SOUND_PAN_ATTACKER + waitplaysewithpan SE_W207, SOUND_PAN_ATTACKER, 8 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 2, 4 + waitforvisualfinish + createsprite gSlideMonToOffsetSpriteTemplate, 2, 0, 20, 0, 0, 4 + delay 3 + waitforvisualfinish + playsewithpan SE_W025B, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, 132, -10, 0, 1, 0 + createsprite gSlideMonToOffsetSpriteTemplate, 2, 1, -32, 0, 0, 3 + waitforvisualfinish + createvisualtask sub_80D6134, 2, 8, -256, 0, 0 + createvisualtask sub_80D6134, 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 sub_80D6134, 2, 8, -256, 0, 1 + createvisualtask sub_80D6134, 2, 8, -256, 1, 1 + waitforvisualfinish + createsprite gSlideMonToOriginalPosSpriteTemplate, 2, 0, 0, 5 + delay 3 + createsprite gSlideMonToOriginalPosSpriteTemplate, 2, 1, 0, 7 + waitforvisualfinish end Move_HEALING_WISH: + loadspritegfx ANIM_TAG_GREEN_SPARKLE + setalpha 0, 16 + createvisualtask sub_80A7A74, 3, 0, 16, 16, 0, 1 + playsewithpan SE_W236, 0 + delay 30 + createsprite gBattleAnimSpriteTemplate_8592EEC, 40, -12, 0 + delay 30 + createsprite gBattleAnimSpriteTemplate_8592EEC, 40, -24, 0 + delay 30 + createsprite gBattleAnimSpriteTemplate_8592EEC, 40, 21, 0 + delay 30 + createsprite gBattleAnimSpriteTemplate_8592EEC, 40, 0, 0 + delay 30 + createsprite gBattleAnimSpriteTemplate_8592EEC, 40, 10, 0 + delay 20 + createvisualtask sub_81025C0, 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_W291, -64 + waitforvisualfinish + delay 16 + createvisualtask sub_81085C8, 5 + playsewithpan SE_W057, +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 sub_8115A04, 2, 2, 2, 2, 0, 16, RGB(27, 31, 18) + playsewithpan SE_W025, -64 + call GrantingStarsEffect + waitforvisualfinish + delay 1 + createvisualtask sub_81133E8, 5 + playsewithpan SE_W100, -64 + delay 8 + createvisualtask sub_80A7CB4, 5, 10249, 19456, 14, 0, 3 + createsprite gUnknown_08596F98, 2, 0 + createsprite gUnknown_08596F98, 2, 43 + createsprite gUnknown_08596F98, 2, 85 + createsprite gUnknown_08596F98, 2, 128 + createsprite gUnknown_08596F98, 2, 170 + createsprite gUnknown_08596F98, 2, 213 + delay 30 + playsewithpan SE_W100, -64 + delay 30 + playsewithpan SE_W100, -64 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + delay 1 end Move_FEINT: @@ -735,33 +895,223 @@ Move_PLUCK: end Move_TAILWIND: + loadspritegfx ANIM_TAG_FLYING_DIRT + playsewithpan SE_W201, 0 + createvisualtask AnimTask_LoadSandstormBackground, 5, FALSE + createvisualtask AnimTask_BlendBackground, 6, 6, RGB_WHITE + delay 16 + createsprite gBattleAnimSpriteTemplate_8596BA0, 40, 10, 2304, 96, 0 + delay 10 + createsprite gBattleAnimSpriteTemplate_8596BA0, 40, 90, 2048, 96, 0 + delay 10 + createsprite gBattleAnimSpriteTemplate_8596BA0, 40, 50, 2560, 96, 0 + delay 10 + createsprite gBattleAnimSpriteTemplate_8596BA0, 40, 20, 2304, 96, 0 + delay 10 + createsprite gBattleAnimSpriteTemplate_8596BA0, 40, 70, 1984, 96, 0 + delay 10 + createsprite gBattleAnimSpriteTemplate_8596BA0, 40, 0, 2816, 96, 0 + delay 10 + createsprite gBattleAnimSpriteTemplate_8596BA0, 40, 60, 2560, 96, 0 end Move_ACUPRESSURE: end Move_METAL_BURST: + loadspritegfx ANIM_TAG_ECLIPSING_ORB + loadspritegfx ANIM_TAG_RED_ORB + loopsewithpan SE_W161, -64, 18, 3 + createvisualtask sub_811489C, 5, 0, 0 + createvisualtask sub_815B338, 5 + waitforvisualfinish + setarg 7, -1 + playsewithpan SE_W115, -64 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0 + createsprite gHiddenPowerOrbScatterSpriteTemplate, 130, 0 + createsprite gHiddenPowerOrbScatterSpriteTemplate, 130, 32 + createsprite gHiddenPowerOrbScatterSpriteTemplate, 130, 64 + createsprite gHiddenPowerOrbScatterSpriteTemplate, 130, 96 + createsprite gHiddenPowerOrbScatterSpriteTemplate, 130, 128 + createsprite gHiddenPowerOrbScatterSpriteTemplate, 130, 160 + createsprite gHiddenPowerOrbScatterSpriteTemplate, 130, 192 + createsprite gHiddenPowerOrbScatterSpriteTemplate, 130, 224 + waitforvisualfinish + createvisualtask sub_811489C, 5, 0, 1 + waitforvisualfinish end Move_U_TURN: + loadspritegfx ANIM_TAG_ROUND_SHADOW + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_DEF_PARTNER + setalpha 12, 8 + playsewithpan SE_W019, -64 + createsprite gUnknown_08596340, 2, 0, 0, 13, 336 + waitforvisualfinish + playsewithpan SE_W104, -64 + createsprite gUnknown_08596358, 2, 20 + delay 20 + createsprite gBasicHitSplatSpriteTemplate, 2, 0, 0, 1, 0 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 + playsewithpan SE_W013, +63 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff end Move_CLOSE_COMBAT: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_HANDS_AND_FEET + fadetobg BG_HIGHSPEED_OPPONENT + delay 20 + createsprite gUnknown_08595EB0, 131, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 + playsewithpan SE_W004, +63 + delay 10 + createsprite gUnknown_08595EB0, 131, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 + playsewithpan SE_W233B, +63 + delay 10 + createsprite gUnknown_08595EB0, 131, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 + playsewithpan SE_W025B, +63 + delay 10 + createsprite gUnknown_08595EB0, 131, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 + playsewithpan SE_W004, +63 + delay 10 + createsprite gUnknown_08595EB0, 131, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 + playsewithpan SE_W233B, +63 + delay 10 + createsprite gUnknown_08595EB0, 131, 1, 10, 0 + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 + playsewithpan SE_W025B, +63 + delay 10 + restorebg + waitbgfadeout + setarg 7, -1 + waitbgfadein + 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, 3, 0, 0, 1, 0 + playsewithpan SE_W004, +63 + delay 5 + createsprite gBasicHitSplatSpriteTemplate, 3, 24, 8, 1, 0 + playsewithpan SE_W004, +63 + delay 5 + createsprite gBasicHitSplatSpriteTemplate, 3, -24, -16, 1, 0 + playsewithpan SE_W004, +63 + delay 5 + createsprite gBasicHitSplatSpriteTemplate, 3, 8, 4, 1, 0 + playsewithpan SE_W004, +63 + delay 5 + createsprite gBasicHitSplatSpriteTemplate, 3, -16, 19, 1, 0 + playsewithpan SE_W004, +63 + delay 5 + createsprite gBasicHitSplatSpriteTemplate, 3, 18, -18, 1, 0 + playsewithpan SE_W004, +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, 131, 0, 0, 8, 1, 0 + playsewithpan SE_W233B, -64 + createsprite gBasicHitSplatSpriteTemplate, 130, 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_W077, +63, 18, 10 + call EmbargoOrbs1 + call EmbargoOrbs1 + call EmbargoOrbs1 + waitforvisualfinish + createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 10, 1 + playsewithpan SE_W171, +63 + clearmonbg ANIM_DEF_PARTNER end +EmbargoOrbs1: + createsprite gPowerOrbs_Float, 2, 0, -20, 85, 80, 0 + delay 12 + createsprite gPowerOrbs_Float, 2, 0, -10, 170, 80, 0 + delay 12 + createsprite gPowerOrbs_Float, 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 gUnknown_085CE050, 130, 20, 0, 0, 0, 35, -25 + playsewithpan SE_W207, -64 + waitforvisualfinish + createsprite gBasicHitSplatSpriteTemplate, 2, 0, 0, 1, 2 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_W233, +63 + clearmonbg ANIM_DEF_PARTNER + blendoff end Move_PSYCHO_SHIFT: + loadspritegfx ANIM_TAG_ELECTRIC_ORBS + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT + loadspritegfx ANIM_TAG_THIN_RING + monbg ANIM_ATTACKER + setalpha 12, 8 + playsewithpan SE_W025, -64 + createsprite gUnknown_08596F98, ANIM_ATTACKER, 2, 0 + delay 30 + waitforvisualfinish + createsprite gUnknown_08593850, 40, 0, 0, 1, 0 + playsewithpan SE_W048, -64 + delay 14 + createsprite gUnknown_08593850, 40, 0, 0, 1, 0 + playsewithpan SE_W048, -64 + delay 14 + createsprite gUnknown_08593850, 40, 0, 0, 1, 0 + playsewithpan SE_W048, -64 + waitforvisualfinish + clearmonbg ANIM_ATK_PARTNER + end + clearmonbg ANIM_ATTACKER + blendoff end Move_TRUMP_CARD: @@ -774,9 +1124,54 @@ Move_WRING_OUT: end Move_POWER_TRICK: + loadspritegfx ANIM_TAG_THIN_RING + monbg ANIM_ATK_PARTNER + waitforvisualfinish + createsprite gUnknown_08593850, 40, 0, 0, 0, 0 + playsewithpan SE_W048, -64 + delay 14 + createsprite gUnknown_08593850, 40, 0, 0, 0, 0 + playsewithpan SE_W048, -64 + delay 14 + createsprite gUnknown_08593850, 40, 0, 0, 0, 0 + playsewithpan SE_W048, -64 + waitforvisualfinish + createvisualtask sub_81177E4, 5, 0 + waitforvisualfinish + clearmonbg ANIM_ATK_PARTNER end Move_GASTRO_ACID: + loadspritegfx ANIM_TAG_POISON_BUBBLE + monbg ANIM_DEF_PARTNER + createsprite gGreenPoisonBubble, 130, 20, 0, 40, 1, 0, 0 + playsewithpan SE_W145C, SOUND_PAN_ATTACKER + delay 5 + createsprite gGreenPoisonBubble, 130, 20, 0, 40, 1, 24, 0 + playsewithpan SE_W145C, SOUND_PAN_ATTACKER + delay 5 + createsprite gGreenPoisonBubble, 130, 20, 0, 40, 1, -24, 0 + playsewithpan SE_W145C, 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 sub_8115A04, 2, 20, 2, 2, 0, 12, RGB(30, 0, 31) + createsprite gGreenPoisonDrip, 130, 0, -22, 0, 15, 55 + playsewithpan SE_W145, SOUND_PAN_TARGET + delay 10 + createsprite gGreenPoisonDrip, 130, -26, -24, 0, 15, 55 + playsewithpan SE_W145, SOUND_PAN_TARGET + delay 10 + createsprite gGreenPoisonDrip, 130, 15, -27, 0, 15, 50 + playsewithpan SE_W145, SOUND_PAN_TARGET + delay 10 + createsprite gGreenPoisonDrip, 130, -15, -17, 0, 10, 45 + playsewithpan SE_W145, SOUND_PAN_TARGET + delay 10 + createsprite gGreenPoisonDrip, 130, 27, -22, 0, 15, 50 + playsewithpan SE_W145, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER end Move_LUCKY_CHANT: @@ -786,6 +1181,25 @@ Move_ME_FIRST: end Move_COPYCAT: + loadspritegfx ANIM_TAG_GRAY_ORB + loadspritegfx ANIM_TAG_THIN_RING + playsewithpan SE_W025, SOUND_PAN_ATTACKER + createvisualtask sub_8115A04, 2, 2, 8, 1, 0, 12, RGB_WHITE + createvisualtask sub_815B65C, 5 + call Stockpile1 + call Stockpile1 + waitforvisualfinish + createsprite gSimplePaletteBlendSpriteTemplate, 2, 2, 0, 12, 0, RGB_WHITE + waitforvisualfinish + createsprite gUnknown_08593850, 40, 0, 0, 0, 0 + playsewithpan SE_W048, -64 + delay 14 + createsprite gUnknown_08593850, 40, 0, 0, 0, 0 + playsewithpan SE_W048, -64 + delay 14 + createsprite gUnknown_08593850, 40, 0, 0, 0, 0 + playsewithpan SE_W048, -64 + waitforvisualfinish end Move_POWER_SWAP: @@ -819,12 +1233,113 @@ Move_MAGNET_RISE: end Move_FLARE_BLITZ: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_HANDS_AND_FEET + loadspritegfx ANIM_TAG_SMALL_EMBER + monbg ANIM_TARGET + delay 2 + createsprite gSimplePaletteBlendSpriteTemplate, 2, 1, 0, 0, 16, RGB_BLACK + setalpha 12, 8 + monbg ANIM_DEF_PARTNER + monbgprio_2A ANIM_TARGET + createsprite gBattleAnimSpriteTemplate_8595584, 3, 0, 0, 56, 0 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + delay 2 + createsprite gBattleAnimSpriteTemplate_8595584, 3, 0, 0, 56, 4 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + delay 2 + createsprite gBattleAnimSpriteTemplate_8595584, 3, 0, 0, 56, 8 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + delay 2 + createsprite gBattleAnimSpriteTemplate_8595584, 3, 0, 0, 56, 12 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + delay 2 + createsprite gBattleAnimSpriteTemplate_8595584, 3, 0, 0, 56, 16 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + delay 2 + createsprite gBattleAnimSpriteTemplate_8595584, 3, 0, 0, 56, 20 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + delay 2 + createsprite gBattleAnimSpriteTemplate_8595584, 3, 0, 0, 56, 24 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + waitforvisualfinish + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 4, 1, 4 + waitforvisualfinish + createsprite gSlideMonToOffsetSpriteTemplate, 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, 3, 0, 0, 1, 0 + createsprite gUnknown_08595380, 0x81, 0, 10, 192, 176, 40 + playsewithpan SE_W004, +63 + delay 5 + createsprite gBasicHitSplatSpriteTemplate, 3, 24, 8, 1, 0 + createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB_RED, 12, 1, 1 + createsprite gUnknown_08595380, 0x81, 0, 10, -192, 240, 40 + playsewithpan SE_W004, +63 + delay 5 + createsprite gBasicHitSplatSpriteTemplate, 3, -24, -16, 1, 0 + createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB_RED, 12, 1, 1 + createsprite gUnknown_08595380, 0x81, 0, 10, 192, -160, 40 + playsewithpan SE_W004, +63 + delay 5 + createsprite gBasicHitSplatSpriteTemplate, 3, 8, 4, 1, 0 + createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB_RED, 12, 1, 1 + createsprite gUnknown_08595380, 0x81, 0, 10, -192, -112, 40 + playsewithpan SE_W004, +63 + delay 5 + createsprite gBasicHitSplatSpriteTemplate, 3, -16, 19, 1, 0 + createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB_RED, 12, 1, 1 + createsprite gUnknown_08595380, 0x81, 0, 10, 160, 48, 40 + playsewithpan SE_W004, +63 + delay 5 + createsprite gBasicHitSplatSpriteTemplate, 3, 18, -18, 1, 0 + createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB_RED, 12, 1, 1 + createsprite gUnknown_08595380, 0x81, 0, 10, -224, -32, 40 + createsprite gUnknown_08595380, 0x81, 0, 10, 112, -128, 40 + playsewithpan SE_W004, +63 + createvisualtask sub_8116620, 10, 4, 2, 0, 0, RGB_BLACK + playsewithpan SE_W004, +63 + waitforvisualfinish + createsprite gSlideMonToOriginalPosSpriteTemplate, 2, 0, 0, 9 + clearmonbg ANIM_TARGET + blendoff + delay 2 + restorebg + waitbgfadein end + Move_FORCE_PALM: 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 + createvisualtask AnimTask_IsAttackerOpponentSide, 2 + fadetobg BG_HIGHSPEED_OPPONENT + waitbgfadeout + createvisualtask sub_8117660, 5, -2304, 0, 1, -1 + waitbgfadein + playsewithpan SE_W327, 0 + delay 60 + createsprite gAuraSphereBlast, 131, 0 + playsewithpan SE_W207, SOUND_PAN_ATTACKER + delay 16 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 8, 0, 16, 1 + playsewithpan SE_W025B, SOUND_PAN_TARGET + waitforvisualfinish + restorebg + waitbgfadeout + setarg 7, -1 + waitbgfadein + clearmonbg ANIM_ATK_PARTNER + blendoff + delay 1 end Move_ROCK_POLISH: @@ -864,12 +1379,54 @@ Move_POWER_GEM: 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_W233B, -64 + createsprite gFistFootSpriteTemplate, 131, 0, 0, 8, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, 130, 0, 0, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 + delay 20 + call MegaDrainEffect + waitforvisualfinish + delay 15 + call HealingEffect + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff end Move_VACUUM_WAVE: end Move_FOCUS_BLAST: + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT + loadspritegfx ANIM_TAG_METEOR + loadspritegfx ANIM_TAG_FLAT_ROCK + monbg ANIM_ATK_PARTNER + monbgprio_28 ANIM_ATTACKER + setalpha 12, 8 + createvisualtask AnimTask_IsAttackerOpponentSide, 2 + fadetobg BG_HIGHSPEED_OPPONENT + waitbgfadeout + createvisualtask sub_8117660, 5, -2304, 0, 1, -1 + waitbgfadein + createsprite gUnknown_08595FEC, 130, 0 + playsewithpan SE_W025, SOUND_PAN_ATTACKER + waitforvisualfinish + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 8, 0, 16, 1 + playsewithpan SE_W025B, SOUND_PAN_TARGET + waitforvisualfinish + restorebg + waitbgfadeout + setarg 7, -1 + waitbgfadein + clearmonbg ANIM_TARGET + blendoff + delay 1 end Move_ENERGY_BALL: From a5ba0558149e92d825dfed165c0778711e943c72 Mon Sep 17 00:00:00 2001 From: PALPATlNE Date: Sat, 17 Nov 2018 20:15:38 +0100 Subject: [PATCH 164/667] Added new move animations --- src/effects_1.c | 11 +++++++++++ src/fight.c | 22 ++++++++++++++++++++++ src/poison.c | 22 ++++++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/src/effects_1.c b/src/effects_1.c index 36676b70df..09d398e668 100644 --- a/src/effects_1.c +++ b/src/effects_1.c @@ -2091,3 +2091,14 @@ const struct SpriteTemplate gUnknown_0859324C = .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_8103390, }; + +const struct SpriteTemplate gPowerOrbs_Float = +{ + .tileTag = ANIM_TAG_RED_ORB, + .paletteTag = ANIM_TAG_RED_ORB, + .oam = &gUnknown_0852490C, + .anims = gUnknown_085922E4, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80FED28, +}; \ No newline at end of file diff --git a/src/fight.c b/src/fight.c index 89fe5900be..26e829ca55 100644 --- a/src/fight.c +++ b/src/fight.c @@ -396,3 +396,25 @@ const struct SpriteTemplate gUnknown_08596104 = .affineAnims = gUnknown_08596100, .callback = sub_810DA7C, }; + +const struct SpriteTemplate gPalmSpriteTemplate = +{ + .tileTag = ANIM_TAG_PURPLE_HAND_OUTLINE, + .paletteTag = ANIM_TAG_PURPLE_HAND_OUTLINE, + .oam = &gUnknown_08524914, + .anims = gUnknown_08595E54, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_810CEE0, +}; + +const struct SpriteTemplate gAuraSphereBlast = +{ + .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, + .oam = &gUnknown_0852491C, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_810D874, +}; \ No newline at end of file diff --git a/src/poison.c b/src/poison.c index f0d8ec5538..5df63257c7 100644 --- a/src/poison.c +++ b/src/poison.c @@ -183,3 +183,25 @@ const struct SpriteTemplate gWaterBubbleSpriteTemplate = .affineAnims = gUnknown_0859623C, .callback = sub_810DDC4, }; + +const struct SpriteTemplate gGreenPoisonDrip = +{ + .tileTag = ANIM_TAG_POISON_BUBBLE, + .paletteTag = ANIM_TAG_UNUSED_VINE , + .oam = &gUnknown_085249CC, + .anims = gUnknown_08596168, + .images = NULL, + .affineAnims = gUnknown_08596208, + .callback = sub_810DD50, +}; + +const struct SpriteTemplate gGreenPoisonBubble = +{ + .tileTag = ANIM_TAG_POISON_BUBBLE, + .paletteTag = ANIM_TAG_UNUSED_VINE , + .oam = &gUnknown_085249CC, + .anims = gUnknown_08596164, + .images = NULL, + .affineAnims = gUnknown_085961A0, + .callback = sub_810DC2C, +}; \ No newline at end of file From 4284816d813801f01de26dbaa4d156cf7f3043a7 Mon Sep 17 00:00:00 2001 From: PALPATlNE Date: Sat, 17 Nov 2018 21:16:48 +0100 Subject: [PATCH 165/667] Fixed Createsprite command arguments --- data/battle_anim_scripts.s | 218 ++++++++++++++++++------------------- src/effects_1.c | 2 +- src/fight.c | 2 +- src/poison.c | 2 +- 4 files changed, 112 insertions(+), 112 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 9f96797b4e..8c1a7494d9 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -695,18 +695,18 @@ Move_ROOST: monbgprio_29 playsewithpan SE_W080, SOUND_PAN_TARGET delay 0 - createsprite gUnknown_08596388, 128, 0, -16, 64, 2, 104, 11304, 32, 1 + createsprite gUnknown_08596388, ANIM_TARGET, 0, 0, -16, 64, 2, 104, 11304, 32, 1 delay 6 - createsprite gUnknown_08596388, 128, 0, -16, 32, 2, 104, 11304, 32, 1 - createsprite gUnknown_08596388, 128, 0, -16, 0, 2, 104, 11304, 32, 1 + createsprite gUnknown_08596388, ANIM_TARGET, 0, 0, -16, 32, 2, 104, 11304, 32, 1 + createsprite gUnknown_08596388, ANIM_TARGET, 0, 0, -16, 0, 2, 104, 11304, 32, 1 delay 6 - createsprite gUnknown_08596388, 128, 0, -16, 224, 2, 104, 11304, 32, 1 - createsprite gUnknown_08596388, 128, 0, -16, 128, 2, 104, 11304, 32, 1 + createsprite gUnknown_08596388, ANIM_TARGET, 0, 0, -16, 224, 2, 104, 11304, 32, 1 + createsprite gUnknown_08596388, ANIM_TARGET, 0, 0, -16, 128, 2, 104, 11304, 32, 1 delay 6 - createsprite gUnknown_08596388, 128, 0, -16, 192, 2, 104, 11304, 32, 1 - createsprite gUnknown_08596388, 128, 0, -16, 160, 2, 104, 11304, 32, 1 + createsprite gUnknown_08596388, ANIM_TARGET, 0, 0, -16, 192, 2, 104, 11304, 32, 1 + createsprite gUnknown_08596388, ANIM_TARGET, 0, 0, -16, 160, 2, 104, 11304, 32, 1 delay 6 - createsprite gUnknown_08596388, 128, 0, -16, 96, 2, 104, 11304, 32, 1 + createsprite gUnknown_08596388, ANIM_TARGET, 0, 0, -16, 96, 2, 104, 11304, 32, 1 waitforvisualfinish call HealingEffect waitforvisualfinish @@ -759,13 +759,13 @@ Move_WAKE_UP_SLAP: monbgprio_28 ANIM_TARGET setalpha 12, 8 playsewithpan SE_W104, SOUND_PAN_TARGET - createsprite gUnknown_08595E68, 2, -16, 0, 0, 0, 10, 1, 3, 0 + createsprite gUnknown_08595E68, ANIM_ATTACKER, 2, -16, 0, 0, 0, 10, 1, 3, 0 waitforvisualfinish playsewithpan SE_W003, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, 3, 0, 0, 1, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTCKER, 3, 0, 0, 1, 2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 2 waitforvisualfinish - createsprite gUnknown_085CE894, 130, 1, 8, 3 + createsprite gUnknown_085CE894, ANIM_TARGET, 2, 1, 8, 3 loopsewithpan SE_W207B, +63, 16, 3 clearmonbg ANIM_DEF_PARTNER blendoff @@ -778,19 +778,19 @@ Move_HAMMER_ARM: monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_W004, SOUND_PAN_ATTACKER - createsprite gSlideMonToOffsetSpriteTemplate, 2, 0, 20, 3, 0, 4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 3, 0, 4 delay 1 - createsprite gUnknown_085928D0, 2, 0, 0 + createsprite gUnknown_085928D0, ANIM_ATTCKER, 2, 0, 0 delay 3 setarg 7, 0 - createsprite gBasicHitSplatSpriteTemplate, 131, 10, -8, 1, 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 10, -8, 1, 1 playsewithpan SE_W088, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 5, 1 - createsprite gUnknown_08596CB0, 130, -12, 32, 3, 4 - createsprite gUnknown_08596CB0, 130, 8, 31, 2, 2 - createsprite gUnknown_08596CB0, 130, -4, 28, 2, 3 - createsprite gUnknown_08596CB0, 130, 12, 30, 4, 3 - createsprite gSlideMonToOriginalPosSpriteTemplate, 2, 0, 0, 5 + createsprite gUnknown_08596CB0, ANIM_TARGET, 2, -12, 32, 3, 4 + createsprite gUnknown_08596CB0, ANIM_TARGET, 2, 8, 31, 2, 2 + createsprite gUnknown_08596CB0, ANIM_TARGET, 2, -4, 28, 2, 3 + createsprite gUnknown_08596CB0, ANIM_TARGET, 2, 12, 30, 4, 3 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_TARGET, 2, 0, 0, 5 clearmonbg ANIM_TARGET blendoff end @@ -804,12 +804,12 @@ Move_GYRO_BALL: waitplaysewithpan SE_W207, SOUND_PAN_ATTACKER, 8 createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 2, 4 waitforvisualfinish - createsprite gSlideMonToOffsetSpriteTemplate, 2, 0, 20, 0, 0, 4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 delay 3 waitforvisualfinish playsewithpan SE_W025B, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, 132, -10, 0, 1, 0 - createsprite gSlideMonToOffsetSpriteTemplate, 2, 1, -32, 0, 0, 3 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, 1, 0 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -32, 0, 0, 3 waitforvisualfinish createvisualtask sub_80D6134, 2, 8, -256, 0, 0 createvisualtask sub_80D6134, 2, 8, -256, 1, 0 @@ -819,9 +819,9 @@ Move_GYRO_BALL: createvisualtask sub_80D6134, 2, 8, -256, 0, 1 createvisualtask sub_80D6134, 2, 8, -256, 1, 1 waitforvisualfinish - createsprite gSlideMonToOriginalPosSpriteTemplate, 2, 0, 0, 5 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 delay 3 - createsprite gSlideMonToOriginalPosSpriteTemplate, 2, 1, 0, 7 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7 waitforvisualfinish end @@ -831,15 +831,15 @@ Move_HEALING_WISH: createvisualtask sub_80A7A74, 3, 0, 16, 16, 0, 1 playsewithpan SE_W236, 0 delay 30 - createsprite gBattleAnimSpriteTemplate_8592EEC, 40, -12, 0 + createsprite gBattleAnimSpriteTemplate_8592EEC, ANIM_ATTACKER, 40, -12, 0 delay 30 - createsprite gBattleAnimSpriteTemplate_8592EEC, 40, -24, 0 + createsprite gBattleAnimSpriteTemplate_8592EEC, ANIM_ATTACKER, 40, -24, 0 delay 30 - createsprite gBattleAnimSpriteTemplate_8592EEC, 40, 21, 0 + createsprite gBattleAnimSpriteTemplate_8592EEC, ANIM_ATTACKER, 40, 21, 0 delay 30 - createsprite gBattleAnimSpriteTemplate_8592EEC, 40, 0, 0 + createsprite gBattleAnimSpriteTemplate_8592EEC, ANIM_ATTACKER, 40, 0, 0 delay 30 - createsprite gBattleAnimSpriteTemplate_8592EEC, 40, 10, 0 + createsprite gBattleAnimSpriteTemplate_8592EEC, ANIM_ATTACKER, 40, 10, 0 delay 20 createvisualtask sub_81025C0, 2 waitforvisualfinish @@ -873,12 +873,12 @@ Move_NATURAL_GIFT: playsewithpan SE_W100, -64 delay 8 createvisualtask sub_80A7CB4, 5, 10249, 19456, 14, 0, 3 - createsprite gUnknown_08596F98, 2, 0 - createsprite gUnknown_08596F98, 2, 43 - createsprite gUnknown_08596F98, 2, 85 - createsprite gUnknown_08596F98, 2, 128 - createsprite gUnknown_08596F98, 2, 170 - createsprite gUnknown_08596F98, 2, 213 + createsprite gUnknown_08596F98, ANIM_ATTACKER, 2, 0 + createsprite gUnknown_08596F98, ANIM_ATTACKER, 2, 43 + createsprite gUnknown_08596F98, ANIM_ATTACKER, 2, 85 + createsprite gUnknown_08596F98, ANIM_ATTACKER, 2, 128 + createsprite gUnknown_08596F98, ANIM_ATTACKER, 2, 170 + createsprite gUnknown_08596F98, ANIM_ATTACKER, 2, 213 delay 30 playsewithpan SE_W100, -64 delay 30 @@ -900,19 +900,19 @@ Move_TAILWIND: createvisualtask AnimTask_LoadSandstormBackground, 5, FALSE createvisualtask AnimTask_BlendBackground, 6, 6, RGB_WHITE delay 16 - createsprite gBattleAnimSpriteTemplate_8596BA0, 40, 10, 2304, 96, 0 + createsprite gBattleAnimSpriteTemplate_8596BA0, ANIM_ATTACKER, 40, 10, 2304, 96, 0 delay 10 - createsprite gBattleAnimSpriteTemplate_8596BA0, 40, 90, 2048, 96, 0 + createsprite gBattleAnimSpriteTemplate_8596BA0, ANIM_ATTACKER, 40, 90, 2048, 96, 0 delay 10 - createsprite gBattleAnimSpriteTemplate_8596BA0, 40, 50, 2560, 96, 0 + createsprite gBattleAnimSpriteTemplate_8596BA0, ANIM_ATTACKER, 40, 50, 2560, 96, 0 delay 10 - createsprite gBattleAnimSpriteTemplate_8596BA0, 40, 20, 2304, 96, 0 + createsprite gBattleAnimSpriteTemplate_8596BA0, ANIM_ATTACKER, 40, 20, 2304, 96, 0 delay 10 - createsprite gBattleAnimSpriteTemplate_8596BA0, 40, 70, 1984, 96, 0 + createsprite gBattleAnimSpriteTemplate_8596BA0, ANIM_ATTACKER, 40, 70, 1984, 96, 0 delay 10 - createsprite gBattleAnimSpriteTemplate_8596BA0, 40, 0, 2816, 96, 0 + createsprite gBattleAnimSpriteTemplate_8596BA0, ANIM_ATTACKER, 40, 0, 2816, 96, 0 delay 10 - createsprite gBattleAnimSpriteTemplate_8596BA0, 40, 60, 2560, 96, 0 + createsprite gBattleAnimSpriteTemplate_8596BA0, ANIM_ATTACKER, 40, 60, 2560, 96, 0 end Move_ACUPRESSURE: @@ -928,14 +928,14 @@ Move_METAL_BURST: setarg 7, -1 playsewithpan SE_W115, -64 createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0 - createsprite gHiddenPowerOrbScatterSpriteTemplate, 130, 0 - createsprite gHiddenPowerOrbScatterSpriteTemplate, 130, 32 - createsprite gHiddenPowerOrbScatterSpriteTemplate, 130, 64 - createsprite gHiddenPowerOrbScatterSpriteTemplate, 130, 96 - createsprite gHiddenPowerOrbScatterSpriteTemplate, 130, 128 - createsprite gHiddenPowerOrbScatterSpriteTemplate, 130, 160 - createsprite gHiddenPowerOrbScatterSpriteTemplate, 130, 192 - createsprite gHiddenPowerOrbScatterSpriteTemplate, 130, 224 + 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 sub_811489C, 5, 0, 1 waitforvisualfinish @@ -947,10 +947,10 @@ Move_U_TURN: monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_W019, -64 - createsprite gUnknown_08596340, 2, 0, 0, 13, 336 + createsprite gUnknown_08596340, ANIM_ATTACKER, 2, 0, 0, 13, 336 waitforvisualfinish playsewithpan SE_W104, -64 - createsprite gUnknown_08596358, 2, 20 + createsprite gUnknown_08596358, ANIM_ATTACKER, 2, 20 delay 20 createsprite gBasicHitSplatSpriteTemplate, 2, 0, 0, 1, 0 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 @@ -965,27 +965,27 @@ Move_CLOSE_COMBAT: loadspritegfx ANIM_TAG_HANDS_AND_FEET fadetobg BG_HIGHSPEED_OPPONENT delay 20 - createsprite gUnknown_08595EB0, 131, 1, 10, 0 + createsprite gUnknown_08595EB0, ANIM_TARGET, 3, 1, 10, 0 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 playsewithpan SE_W004, +63 delay 10 - createsprite gUnknown_08595EB0, 131, 1, 10, 0 + createsprite gUnknown_08595EB0, ANIM_TARGET, 3, 1, 10, 0 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 playsewithpan SE_W233B, +63 delay 10 - createsprite gUnknown_08595EB0, 131, 1, 10, 0 + createsprite gUnknown_08595EB0, ANIM_TARGET, 3, 1, 10, 0 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 playsewithpan SE_W025B, +63 delay 10 - createsprite gUnknown_08595EB0, 131, 1, 10, 0 + createsprite gUnknown_08595EB0, ANIM_TARGET, 3, 1, 10, 0 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 playsewithpan SE_W004, +63 delay 10 - createsprite gUnknown_08595EB0, 131, 1, 10, 0 + createsprite gUnknown_08595EB0, ANIM_TARGET, 3, 1, 10, 0 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 playsewithpan SE_W233B, +63 delay 10 - createsprite gUnknown_08595EB0, 131, 1, 10, 0 + createsprite gUnknown_08595EB0, ANIM_TARGET, 3, 1, 10, 0 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 playsewithpan SE_W025B, +63 delay 10 @@ -1008,22 +1008,22 @@ Move_PAYBACK: delay 0 setalpha 12, 8 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 30, 1 - createsprite gBasicHitSplatSpriteTemplate, 3, 0, 0, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 0 playsewithpan SE_W004, +63 delay 5 - createsprite gBasicHitSplatSpriteTemplate, 3, 24, 8, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 24, 8, 1, 0 playsewithpan SE_W004, +63 delay 5 - createsprite gBasicHitSplatSpriteTemplate, 3, -24, -16, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -24, -16, 1, 0 playsewithpan SE_W004, +63 delay 5 - createsprite gBasicHitSplatSpriteTemplate, 3, 8, 4, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 8, 4, 1, 0 playsewithpan SE_W004, +63 delay 5 - createsprite gBasicHitSplatSpriteTemplate, 3, -16, 19, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -16, 19, 1, 0 playsewithpan SE_W004, +63 delay 5 - createsprite gBasicHitSplatSpriteTemplate, 3, 18, -18, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 18, -18, 1, 0 playsewithpan SE_W004, +63 waitforvisualfinish clearmonbg ANIM_TARGET @@ -1040,9 +1040,9 @@ Move_ASSURANCE: waitbgfadein delay 0 setalpha 12, 8 - createsprite gPalmSpriteTemplate, 131, 0, 0, 8, 1, 0 + createsprite gPalmSpriteTemplate, ANIM_TARGET, 3, 0, 0, 8, 1, 0 playsewithpan SE_W233B, -64 - createsprite gBasicHitSplatSpriteTemplate, 130, 0, 0, 1, 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, 1, 1 waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -1065,11 +1065,11 @@ Move_EMBARGO: clearmonbg ANIM_DEF_PARTNER end EmbargoOrbs1: - createsprite gPowerOrbs_Float, 2, 0, -20, 85, 80, 0 + createsprite gPowerOrbs_Float, ANIM_ATTACKER, 2, 0, -20, 85, 80, 0 delay 12 - createsprite gPowerOrbs_Float, 2, 0, -10, 170, 80, 0 + createsprite gPowerOrbs_Float, ANIM_ATTACKER, 2, 0, -10, 170, 80, 0 delay 12 - createsprite gPowerOrbs_Float, 2, 0, -15, 0, 80, 0 + createsprite gPowerOrbs_Float, ANIM_ATTACKER, 2, 0, -15, 0, 80, 0 delay 12 return @@ -1079,10 +1079,10 @@ Move_FLING: monbg ANIM_DEF_PARTNER monbgprio_28 ANIM_TARGET setalpha 12, 8 - createsprite gUnknown_085CE050, 130, 20, 0, 0, 0, 35, -25 + createsprite gUnknown_085CE050, ANIM_TARGET, 2, 20, 0, 0, 0, 35, -25 playsewithpan SE_W207, -64 waitforvisualfinish - createsprite gBasicHitSplatSpriteTemplate, 2, 0, 0, 1, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_W233, +63 clearmonbg ANIM_DEF_PARTNER @@ -1099,13 +1099,13 @@ Move_PSYCHO_SHIFT: createsprite gUnknown_08596F98, ANIM_ATTACKER, 2, 0 delay 30 waitforvisualfinish - createsprite gUnknown_08593850, 40, 0, 0, 1, 0 + createsprite gUnknown_08593850, ANIM_ATTACKER, 40, 0, 0, 1, 0 playsewithpan SE_W048, -64 delay 14 - createsprite gUnknown_08593850, 40, 0, 0, 1, 0 + createsprite gUnknown_08593850, ANIM_ATTACKER, 40, 0, 0, 1, 0 playsewithpan SE_W048, -64 delay 14 - createsprite gUnknown_08593850, 40, 0, 0, 1, 0 + createsprite gUnknown_08593850, ANIM_ATTACKER, 40, 0, 0, 1, 0 playsewithpan SE_W048, -64 waitforvisualfinish clearmonbg ANIM_ATK_PARTNER @@ -1127,13 +1127,13 @@ Move_POWER_TRICK: loadspritegfx ANIM_TAG_THIN_RING monbg ANIM_ATK_PARTNER waitforvisualfinish - createsprite gUnknown_08593850, 40, 0, 0, 0, 0 + createsprite gUnknown_08593850, ANIM_ATTACKER, 40, 0, 0, 0, 0 playsewithpan SE_W048, -64 delay 14 - createsprite gUnknown_08593850, 40, 0, 0, 0, 0 + createsprite gUnknown_08593850, ANIM_ATTACKER, 40, 0, 0, 0, 0 playsewithpan SE_W048, -64 delay 14 - createsprite gUnknown_08593850, 40, 0, 0, 0, 0 + createsprite gUnknown_08593850, ANIM_ATTACKER, 40, 0, 0, 0, 0 playsewithpan SE_W048, -64 waitforvisualfinish createvisualtask sub_81177E4, 5, 0 @@ -1144,31 +1144,31 @@ Move_POWER_TRICK: Move_GASTRO_ACID: loadspritegfx ANIM_TAG_POISON_BUBBLE monbg ANIM_DEF_PARTNER - createsprite gGreenPoisonBubble, 130, 20, 0, 40, 1, 0, 0 + createsprite gGreenPoisonBubble, ANIM_TARGET, 2, 20, 0, 40, 1, 0, 0 playsewithpan SE_W145C, SOUND_PAN_ATTACKER delay 5 - createsprite gGreenPoisonBubble, 130, 20, 0, 40, 1, 24, 0 + createsprite gGreenPoisonBubble, ANIM_TARGET, 2, 20, 0, 40, 1, 24, 0 playsewithpan SE_W145C, SOUND_PAN_ATTACKER delay 5 - createsprite gGreenPoisonBubble, 130, 20, 0, 40, 1, -24, 0 + createsprite gGreenPoisonBubble, ANIM_TARGET, 2, 20, 0, 40, 1, -24, 0 playsewithpan SE_W145C, 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 sub_8115A04, 2, 20, 2, 2, 0, 12, RGB(30, 0, 31) - createsprite gGreenPoisonDrip, 130, 0, -22, 0, 15, 55 + createsprite gGreenPoisonDrip, ANIM_TARGET, 2, 0, -22, 0, 15, 55 playsewithpan SE_W145, SOUND_PAN_TARGET delay 10 - createsprite gGreenPoisonDrip, 130, -26, -24, 0, 15, 55 + createsprite gGreenPoisonDrip, ANIM_TARGET, 2, -26, -24, 0, 15, 55 playsewithpan SE_W145, SOUND_PAN_TARGET delay 10 - createsprite gGreenPoisonDrip, 130, 15, -27, 0, 15, 50 + createsprite gGreenPoisonDrip, ANIM_TARGET, 2, 15, -27, 0, 15, 50 playsewithpan SE_W145, SOUND_PAN_TARGET delay 10 - createsprite gGreenPoisonDrip, 130, -15, -17, 0, 10, 45 + createsprite gGreenPoisonDrip, ANIM_TARGET, 2, -15, -17, 0, 10, 45 playsewithpan SE_W145, SOUND_PAN_TARGET delay 10 - createsprite gGreenPoisonDrip, 130, 27, -22, 0, 15, 50 + createsprite gGreenPoisonDrip, ANIM_TARGET, 2, 27, -22, 0, 15, 50 playsewithpan SE_W145, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -1189,15 +1189,15 @@ Move_COPYCAT: call Stockpile1 call Stockpile1 waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, 2, 2, 0, 12, 0, RGB_WHITE + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 2, 0, 12, 0, RGB_WHITE waitforvisualfinish - createsprite gUnknown_08593850, 40, 0, 0, 0, 0 + createsprite gUnknown_08593850, ANIM_ATTACKER, 40, 0, 0, 0, 0 playsewithpan SE_W048, -64 delay 14 - createsprite gUnknown_08593850, 40, 0, 0, 0, 0 + createsprite gUnknown_08593850, ANIM_ATTACKER, 40, 0, 0, 0, 0 playsewithpan SE_W048, -64 delay 14 - createsprite gUnknown_08593850, 40, 0, 0, 0, 0 + createsprite gUnknown_08593850, ANIM_ATTACKER, 40, 0, 0, 0, 0 playsewithpan SE_W048, -64 waitforvisualfinish end @@ -1238,63 +1238,63 @@ Move_FLARE_BLITZ: loadspritegfx ANIM_TAG_SMALL_EMBER monbg ANIM_TARGET delay 2 - createsprite gSimplePaletteBlendSpriteTemplate, 2, 1, 0, 0, 16, RGB_BLACK + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 0, 16, RGB_BLACK setalpha 12, 8 monbg ANIM_DEF_PARTNER monbgprio_2A ANIM_TARGET - createsprite gBattleAnimSpriteTemplate_8595584, 3, 0, 0, 56, 0 + createsprite gBattleAnimSpriteTemplate_8595584, ANIM_ATTACKER, 3, 0, 0, 56, 0 playsewithpan SE_W172, SOUND_PAN_ATTACKER delay 2 - createsprite gBattleAnimSpriteTemplate_8595584, 3, 0, 0, 56, 4 + createsprite gBattleAnimSpriteTemplate_8595584, ANIM_ATTACKER, 3, 0, 0, 56, 4 playsewithpan SE_W172, SOUND_PAN_ATTACKER delay 2 - createsprite gBattleAnimSpriteTemplate_8595584, 3, 0, 0, 56, 8 + createsprite gBattleAnimSpriteTemplate_8595584, ANIM_ATTACKER, 3, 0, 0, 56, 8 playsewithpan SE_W172, SOUND_PAN_ATTACKER delay 2 - createsprite gBattleAnimSpriteTemplate_8595584, 3, 0, 0, 56, 12 + createsprite gBattleAnimSpriteTemplate_8595584, ANIM_ATTACKER, 3, 0, 0, 56, 12 playsewithpan SE_W172, SOUND_PAN_ATTACKER delay 2 - createsprite gBattleAnimSpriteTemplate_8595584, 3, 0, 0, 56, 16 + createsprite gBattleAnimSpriteTemplate_8595584, ANIM_ATTACKER, 3, 0, 0, 56, 16 playsewithpan SE_W172, SOUND_PAN_ATTACKER delay 2 - createsprite gBattleAnimSpriteTemplate_8595584, 3, 0, 0, 56, 20 + createsprite gBattleAnimSpriteTemplate_8595584, ANIM_ATTACKER, 3, 0, 0, 56, 20 playsewithpan SE_W172, SOUND_PAN_ATTACKER delay 2 - createsprite gBattleAnimSpriteTemplate_8595584, 3, 0, 0, 56, 24 + createsprite gBattleAnimSpriteTemplate_8595584, ANIM_ATTACKER, 3, 0, 0, 56, 24 playsewithpan SE_W172, SOUND_PAN_ATTACKER waitforvisualfinish createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 4, 1, 4 waitforvisualfinish - createsprite gSlideMonToOffsetSpriteTemplate, 2, 0, 24, 0, 0, 6 + 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, 3, 0, 0, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 0 createsprite gUnknown_08595380, 0x81, 0, 10, 192, 176, 40 playsewithpan SE_W004, +63 delay 5 - createsprite gBasicHitSplatSpriteTemplate, 3, 24, 8, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 24, 8, 1, 0 createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB_RED, 12, 1, 1 createsprite gUnknown_08595380, 0x81, 0, 10, -192, 240, 40 playsewithpan SE_W004, +63 delay 5 - createsprite gBasicHitSplatSpriteTemplate, 3, -24, -16, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -24, -16, 1, 0 createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB_RED, 12, 1, 1 createsprite gUnknown_08595380, 0x81, 0, 10, 192, -160, 40 playsewithpan SE_W004, +63 delay 5 - createsprite gBasicHitSplatSpriteTemplate, 3, 8, 4, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 8, 4, 1, 0 createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB_RED, 12, 1, 1 createsprite gUnknown_08595380, 0x81, 0, 10, -192, -112, 40 playsewithpan SE_W004, +63 delay 5 - createsprite gBasicHitSplatSpriteTemplate, 3, -16, 19, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -16, 19, 1, 0 createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB_RED, 12, 1, 1 createsprite gUnknown_08595380, 0x81, 0, 10, 160, 48, 40 playsewithpan SE_W004, +63 delay 5 - createsprite gBasicHitSplatSpriteTemplate, 3, 18, -18, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 18, -18, 1, 0 createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB_RED, 12, 1, 1 createsprite gUnknown_08595380, 0x81, 0, 10, -224, -32, 40 createsprite gUnknown_08595380, 0x81, 0, 10, 112, -128, 40 @@ -1302,7 +1302,7 @@ Move_FLARE_BLITZ: createvisualtask sub_8116620, 10, 4, 2, 0, 0, RGB_BLACK playsewithpan SE_W004, +63 waitforvisualfinish - createsprite gSlideMonToOriginalPosSpriteTemplate, 2, 0, 0, 9 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 9 clearmonbg ANIM_TARGET blendoff delay 2 @@ -1327,7 +1327,7 @@ Move_AURA_SPHERE: waitbgfadein playsewithpan SE_W327, 0 delay 60 - createsprite gAuraSphereBlast, 131, 0 + createsprite gAuraSphereBlast, ANIM_TARGET, 3, 0 playsewithpan SE_W207, SOUND_PAN_ATTACKER delay 16 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 8, 0, 16, 1 @@ -1386,8 +1386,8 @@ Move_DRAIN_PUNCH: monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_W233B, -64 - createsprite gFistFootSpriteTemplate, 131, 0, 0, 8, 1, 0 - createsprite gBasicHitSplatSpriteTemplate, 130, 0, 0, 1, 1 + 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 MegaDrainEffect @@ -1414,7 +1414,7 @@ Move_FOCUS_BLAST: waitbgfadeout createvisualtask sub_8117660, 5, -2304, 0, 1, -1 waitbgfadein - createsprite gUnknown_08595FEC, 130, 0 + createsprite gUnknown_08595FEC, ANIM_TARGET, 2, 0 playsewithpan SE_W025, SOUND_PAN_ATTACKER waitforvisualfinish createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 8, 0, 16, 1 diff --git a/src/effects_1.c b/src/effects_1.c index 09d398e668..c96ad03aab 100644 --- a/src/effects_1.c +++ b/src/effects_1.c @@ -2101,4 +2101,4 @@ const struct SpriteTemplate gPowerOrbs_Float = .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_80FED28, -}; \ No newline at end of file +}; diff --git a/src/fight.c b/src/fight.c index 26e829ca55..e439c8fabd 100644 --- a/src/fight.c +++ b/src/fight.c @@ -417,4 +417,4 @@ const struct SpriteTemplate gAuraSphereBlast = .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_810D874, -}; \ No newline at end of file +}; diff --git a/src/poison.c b/src/poison.c index 5df63257c7..5d2df9ecf3 100644 --- a/src/poison.c +++ b/src/poison.c @@ -204,4 +204,4 @@ const struct SpriteTemplate gGreenPoisonBubble = .images = NULL, .affineAnims = gUnknown_085961A0, .callback = sub_810DC2C, -}; \ No newline at end of file +}; From c798d0f1d13ed08bca25d61086f22eccdc8289af Mon Sep 17 00:00:00 2001 From: Kurausukun Date: Sat, 17 Nov 2018 16:48:22 -0500 Subject: [PATCH 166/667] mud-slap should be special, not physical --- src/data/battle_moves.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index aa023a9216..423cc3d641 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -2282,7 +2282,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, - .split = SPLIT_PHYSICAL, + .split = SPLIT_SPECIAL, }, { // MOVE_OCTAZOOKA .effect = EFFECT_ACCURACY_DOWN_HIT, From f7cd950b69e4ec46bad847f727feca0d1c375b5c Mon Sep 17 00:00:00 2001 From: PALPATlNE Date: Sat, 17 Nov 2018 23:17:41 +0100 Subject: [PATCH 167/667] Fixed U-turn --- data/battle_anim_scripts.s | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 8c1a7494d9..3669a8f906 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -946,20 +946,20 @@ Move_U_TURN: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 - playsewithpan SE_W019, -64 + playsewithpan SE_W019, SOUND_PAN_ATTACKER createsprite gUnknown_08596340, ANIM_ATTACKER, 2, 0, 0, 13, 336 - waitforvisualfinish - playsewithpan SE_W104, -64 + playsewithpan SE_W104, SOUND_PAN_ATTACKER createsprite gUnknown_08596358, ANIM_ATTACKER, 2, 20 delay 20 - createsprite gBasicHitSplatSpriteTemplate, 2, 0, 0, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 0 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 - playsewithpan SE_W013, +63 + playsewithpan SE_W013, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff + waitforvisualfinish end - + Move_CLOSE_COMBAT: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_HANDS_AND_FEET From c2a3cff8142edc15b0b553bf5aae548a5918ac24 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 17 Nov 2018 23:47:35 +0100 Subject: [PATCH 168/667] Fix physical atk stat stage and third type --- src/battle_script_commands.c | 6 ++++-- src/battle_util.c | 18 +++++++++++++----- src/pokemon.c | 1 + 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 39af970dad..6aff255f1a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4475,6 +4475,7 @@ static void atk4D_switchindataupdate(void) 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].altAbility); // check knocked off item @@ -8059,7 +8060,8 @@ static void atk90_tryconversiontypechange(void) // randomly changes user's type moveType = TYPE_NORMAL; } if (moveType != gBattleMons[gBattlerAttacker].type1 - && moveType != gBattleMons[gBattlerAttacker].type2) + && moveType != gBattleMons[gBattlerAttacker].type2 + && moveType != gBattleMons[gBattlerAttacker].type3) { break; } @@ -8086,7 +8088,7 @@ static void atk90_tryconversiontypechange(void) // randomly changes user's type 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); diff --git a/src/battle_util.c b/src/battle_util.c index 7dffd85f32..8ad3e85e17 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5016,7 +5016,7 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe return ApplyModifier(modifier, basePower); } -static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, bool32 isCrit) +u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, bool32 isCrit) { u8 atkStage; u32 atkStat; @@ -5025,20 +5025,28 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b 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_ATK]; + 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]; + atkStage = gBattleMons[battlerAtk].statStages[STAT_SPATK]; + } } // critical hits ignore attack stat's stage drops diff --git a/src/pokemon.c b/src/pokemon.c index 13ab027937..0b661cee9b 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4689,6 +4689,7 @@ void PokemonToBattleMon(struct Pokemon *src, struct BattlePokemon *dst) 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->altAbility); GetMonData(src, MON_DATA_NICKNAME, nickname); StringCopy10(dst->nickname, nickname); From a98ecc08aaf91bbbd0b2829ea9393e9c848e9df8 Mon Sep 17 00:00:00 2001 From: Kurausukun Date: Sat, 17 Nov 2018 21:16:33 -0500 Subject: [PATCH 169/667] fix Aurora Veil's name --- src/data/text/move_names.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/data/text/move_names.h b/src/data/text/move_names.h index 79166f1c81..8e4dc86365 100644 --- a/src/data/text/move_names.h +++ b/src/data/text/move_names.h @@ -657,6 +657,7 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [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"), From 98ebd7ef5a1eb4fa0198dd32824aac6f41607f48 Mon Sep 17 00:00:00 2001 From: Kurausukun Date: Sat, 17 Nov 2018 21:29:46 -0500 Subject: [PATCH 170/667] fix indentation --- src/data/text/move_names.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/text/move_names.h b/src/data/text/move_names.h index 8e4dc86365..569323d640 100644 --- a/src/data/text/move_names.h +++ b/src/data/text/move_names.h @@ -657,7 +657,7 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_CLANGING_SCALES] = _("Clanging Sca"), [MOVE_DRAGON_HAMMER] = _("DragonHammer"), [MOVE_BRUTAL_SWING] = _("Brutal Swing"), - [MOVE_AURORA_VEIL] = _("Aurora Veil"), + [MOVE_AURORA_VEIL] = _("Aurora Veil"), [MOVE_SHELL_TRAP] = _("Shell Trap"), [MOVE_FLEUR_CANNON] = _("Fleur Cannon"), [MOVE_PSYCHIC_FANGS] = _("PsychicFangs"), From febb4a612a5904b9b770d49a2ca358fab27b1e62 Mon Sep 17 00:00:00 2001 From: Kurausukun Date: Sat, 17 Nov 2018 21:32:03 -0500 Subject: [PATCH 171/667] Update Gen 1-3 moves to be consistent with Gen 7 --- src/data/battle_moves.h | 200 ++++++++++++++++++++-------------------- 1 file changed, 100 insertions(+), 100 deletions(-) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 423cc3d641..a00ac461ed 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -233,7 +233,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_FLY .effect = EFFECT_SEMI_INVULNERABLE, - .power = 70, + .power = 90, .type = TYPE_FLYING, .accuracy = 95, .pp = 15, @@ -269,10 +269,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // 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, @@ -401,9 +401,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_TACKLE .effect = EFFECT_HIT, - .power = 35, + .power = 40, .type = TYPE_NORMAL, - .accuracy = 95, + .accuracy = 100, .pp = 35, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, @@ -449,10 +449,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // 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, @@ -509,9 +509,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // 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, @@ -616,7 +616,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_STATUS, }, { // MOVE_ACID - .effect = EFFECT_DEFENSE_DOWN_HIT, + .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, .power = 40, .type = TYPE_POISON, .accuracy = 100, @@ -641,7 +641,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_FLAMETHROWER .effect = EFFECT_BURN_HIT, - .power = 95, + .power = 90, .type = TYPE_FIRE, .accuracy = 100, .pp = 15, @@ -677,7 +677,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_HYDRO_PUMP .effect = EFFECT_HIT, - .power = 120, + .power = 110, .type = TYPE_WATER, .accuracy = 80, .pp = 5, @@ -689,7 +689,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_SURF .effect = EFFECT_HIT, - .power = 95, + .power = 90, .type = TYPE_WATER, .accuracy = 100, .pp = 15, @@ -701,7 +701,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_ICE_BEAM .effect = EFFECT_FREEZE_HIT, - .power = 95, + .power = 90, .type = TYPE_ICE, .accuracy = 100, .pp = 10, @@ -713,7 +713,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_BLIZZARD .effect = EFFECT_FREEZE_HIT, - .power = 120, + .power = 110, .type = TYPE_ICE, .accuracy = 70, .pp = 5, @@ -800,7 +800,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .power = 80, .type = TYPE_FIGHTING, .accuracy = 80, - .pp = 25, + .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, @@ -860,7 +860,7 @@ 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, @@ -872,7 +872,7 @@ 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, @@ -896,7 +896,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .power = 0, .type = TYPE_NORMAL, .accuracy = 0, - .pp = 40, + .pp = 20, .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, @@ -965,10 +965,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // 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, @@ -1001,9 +1001,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // 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, @@ -1025,7 +1025,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_THUNDERBOLT .effect = EFFECT_PARALYZE_HIT, - .power = 95, + .power = 90, .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 15, @@ -1039,7 +1039,7 @@ 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, @@ -1049,7 +1049,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_THUNDER .effect = EFFECT_THUNDER, - .power = 120, + .power = 110, .type = TYPE_ELECTRIC, .accuracy = 70, .pp = 10, @@ -1097,7 +1097,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_DIG .effect = EFFECT_SEMI_INVULNERABLE, - .power = 60, + .power = 80, .type = TYPE_GROUND, .accuracy = 100, .pp = 10, @@ -1111,7 +1111,7 @@ 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, @@ -1268,7 +1268,7 @@ 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, @@ -1292,7 +1292,7 @@ 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, @@ -1352,7 +1352,7 @@ 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, @@ -1411,7 +1411,7 @@ 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, @@ -1469,7 +1469,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_LICK .effect = EFFECT_PARALYZE_HIT, - .power = 20, + .power = 30, .type = TYPE_GHOST, .accuracy = 100, .pp = 30, @@ -1484,7 +1484,7 @@ 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, @@ -1517,7 +1517,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_FIRE_BLAST .effect = EFFECT_BURN_HIT, - .power = 120, + .power = 110, .type = TYPE_FIRE, .accuracy = 85, .pp = 5, @@ -1543,8 +1543,8 @@ 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, @@ -1565,10 +1565,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // 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, @@ -1637,7 +1637,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_HI_JUMP_KICK .effect = EFFECT_RECOIL_IF_MISS, - .power = 85, + .power = 100, .type = TYPE_FIGHTING, .accuracy = 90, .pp = 20, @@ -1651,7 +1651,7 @@ 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, @@ -1675,7 +1675,7 @@ 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, @@ -1697,10 +1697,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // 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, @@ -1746,7 +1746,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_BUBBLE .effect = EFFECT_SPEED_DOWN_HIT, - .power = 20, + .power = 40, .type = TYPE_WATER, .accuracy = 100, .pp = 30, @@ -1784,7 +1784,7 @@ 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, @@ -1796,7 +1796,7 @@ 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, @@ -1821,7 +1821,7 @@ 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, @@ -1830,9 +1830,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_CRABHAMMER .effect = EFFECT_HIT, - .power = 90, + .power = 100, .type = TYPE_WATER, - .accuracy = 85, + .accuracy = 90, .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, @@ -1988,7 +1988,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .effect = EFFECT_RECOIL, .power = 50, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = 1, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, @@ -2022,10 +2022,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // 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, @@ -2048,7 +2048,7 @@ 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, @@ -2082,7 +2082,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_SNORE .effect = EFFECT_SNORE, - .power = 40, + .power = 50, .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, @@ -2144,7 +2144,7 @@ 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, @@ -2216,7 +2216,7 @@ 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, @@ -2239,7 +2239,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = { // MOVE_SWEET_KISS .effect = EFFECT_CONFUSE, .power = 0, - .type = TYPE_NORMAL, + .type = TYPE_FAIRY, .accuracy = 75, .pp = 10, .secondaryEffectChance = 0, @@ -2310,7 +2310,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_ZAP_CANNON .effect = EFFECT_PARALYZE_HIT, - .power = 100, + .power = 120, .type = TYPE_ELECTRIC, .accuracy = 50, .pp = 5, @@ -2384,7 +2384,7 @@ 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, @@ -2396,7 +2396,7 @@ 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, @@ -2406,10 +2406,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // 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, @@ -2430,10 +2430,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // 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, @@ -2492,7 +2492,7 @@ 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, @@ -2526,7 +2526,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_FURY_CUTTER .effect = EFFECT_FURY_CUTTER, - .power = 10, + .power = 40, .type = TYPE_BUG, .accuracy = 95, .pp = 20, @@ -2648,7 +2648,7 @@ 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, @@ -2839,7 +2839,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = { // MOVE_MOONLIGHT .effect = EFFECT_MOONLIGHT, .power = 0, - .type = TYPE_NORMAL, + .type = TYPE_FAIRY, .accuracy = 0, .pp = 5, .secondaryEffectChance = 0, @@ -2982,10 +2982,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // 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, @@ -2994,7 +2994,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_ROCK_SMASH .effect = EFFECT_DEFENSE_DOWN_HIT, - .power = 20, + .power = 40, .type = TYPE_FIGHTING, .accuracy = 100, .pp = 15, @@ -3006,9 +3006,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_WHIRLPOOL .effect = EFFECT_TRAP, - .power = 15, + .power = 35, .type = TYPE_WATER, - .accuracy = 70, + .accuracy = 85, .pp = 15, .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, @@ -3042,7 +3042,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_UPROAR .effect = EFFECT_UPROAR, - .power = 50, + .power = 90, .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, @@ -3057,7 +3057,7 @@ 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, @@ -3090,7 +3090,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_HEAT_WAVE .effect = EFFECT_BURN_HIT, - .power = 100, + .power = 95, .type = TYPE_FIRE, .accuracy = 90, .pp = 10, @@ -3140,7 +3140,7 @@ 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, @@ -3186,7 +3186,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_SMELLING_SALT .effect = EFFECT_SMELLINGSALT, - .power = 60, + .power = 70, .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, @@ -3390,7 +3390,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_KNOCK_OFF .effect = EFFECT_KNOCK_OFF, - .power = 20, + .power = 65, .type = TYPE_DARK, .accuracy = 100, .pp = 20, @@ -3714,9 +3714,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // 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, @@ -3774,7 +3774,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_AIR_CUTTER .effect = EFFECT_HIT, - .power = 55, + .power = 60, .type = TYPE_FLYING, .accuracy = 95, .pp = 25, @@ -3786,7 +3786,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_OVERHEAT .effect = EFFECT_OVERHEAT, - .power = 140, + .power = 130, .type = TYPE_FIRE, .accuracy = 90, .pp = 5, @@ -3810,10 +3810,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // 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, @@ -3921,7 +3921,7 @@ 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, @@ -3942,9 +3942,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // 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, @@ -3966,7 +3966,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_MUDDY_WATER .effect = EFFECT_ACCURACY_DOWN_HIT, - .power = 95, + .power = 90, .type = TYPE_WATER, .accuracy = 85, .pp = 10, @@ -3978,7 +3978,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_BULLET_SEED .effect = EFFECT_MULTI_HIT, - .power = 10, + .power = 25, .type = TYPE_GRASS, .accuracy = 100, .pp = 30, @@ -4002,7 +4002,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_ICICLE_SPEAR .effect = EFFECT_MULTI_HIT, - .power = 10, + .power = 25, .type = TYPE_ICE, .accuracy = 100, .pp = 30, @@ -4122,10 +4122,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // 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, @@ -4183,7 +4183,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_LEAF_BLADE .effect = EFFECT_HIT, - .power = 70, + .power = 90, .type = TYPE_GRASS, .accuracy = 100, .pp = 15, @@ -4209,7 +4209,7 @@ 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, @@ -4243,9 +4243,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // 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, From 6cb262aa204e38389453505ae3c3b4b1e9901ce5 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 18 Nov 2018 11:09:40 +0100 Subject: [PATCH 172/667] un-static a function --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 8ad3e85e17..879110398b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5016,7 +5016,7 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe return ApplyModifier(modifier, basePower); } -u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, bool32 isCrit) +static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, bool32 isCrit) { u8 atkStage; u32 atkStat; From e4fba4bc7e704bfe1ef7650fc3eea570ec16085e Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 19 Nov 2018 20:49:38 +0100 Subject: [PATCH 173/667] make it assemble --- data/battle_anim_scripts.s | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 9a13e0c21d..f1a302256c 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1320,7 +1320,7 @@ Move_AURA_SPHERE: monbg ANIM_ATK_PARTNER monbgprio_28 ANIM_ATTACKER setalpha 12, 8 - createvisualtask AnimTask_IsAttackerOpponentSide, 2 + createvisualtask AnimTask_GetAttackerSide, 2 fadetobg BG_HIGHSPEED_OPPONENT waitbgfadeout createvisualtask sub_8117660, 5, -2304, 0, 1, -1 @@ -1409,7 +1409,7 @@ Move_FOCUS_BLAST: monbg ANIM_ATK_PARTNER monbgprio_28 ANIM_ATTACKER setalpha 12, 8 - createvisualtask AnimTask_IsAttackerOpponentSide, 2 + createvisualtask AnimTask_GetAttackerSide, 2 fadetobg BG_HIGHSPEED_OPPONENT waitbgfadeout createvisualtask sub_8117660, 5, -2304, 0, 1, -1 From 67375ba3c80e8434a004887aaa131d0a3c1c9e50 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 19 Nov 2018 21:45:15 -0300 Subject: [PATCH 174/667] Update battle_anim_scripts.s New mega evolution animation. --- data/battle_anim_scripts.s | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index f1a302256c..72e7932844 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -12301,11 +12301,33 @@ General_WishHeal: waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 3, 10, 0, RGB_BLACK end - + General_MegaEvolution: - createvisualtask sub_815B7D0, 0x2, 0 - waitforvisualfinish - end + loadspritegfx ANIM_TAG_ORBS + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT + loadspritegfx ANIM_TAG_METEOR + loadspritegfx ANIM_TAG_FLAT_ROCK + monbg ANIM_ATK_PARTNER + setalpha 12, 8 + createvisualtask sub_8115A04, 2, 2, 1, 4, 0, 11, RGB(31, 31, 11) + playsewithpan SE_W025, -64 + call SolarBeamSetUp1 + waitforvisualfinish + createsprite gUnknown_08595FEC, 130, 0 + playsewithpan SE_W025, -64 + delay 15 + createsprite gBattleAnimSpriteTemplate_85972D8, 2, 4, 1, 180, 1 + createvisualtask sub_8159244, 5, 234, 0 + delay 20 + createvisualtask sub_815B7D0, 2, 0 + delay 4 + createvisualtask sub_8117494, 50 + waitforvisualfinish + createvisualtask sub_8117494, 2 + playsewithpan SE_W043, -64 + blendoff + clearmonbg ANIM_ATTACKER + end AnimScript_82D85A3: createvisualtask sub_8172E9C, 2 From 9d93817319777fb07ddab67000451a305f208220 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 21 Nov 2018 18:27:35 -0300 Subject: [PATCH 175/667] Update battle_anim_scripts.s --- data/battle_anim_scripts.s | 50 +++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 72e7932844..a3e1cc89ef 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -12303,31 +12303,31 @@ General_WishHeal: end General_MegaEvolution: - loadspritegfx ANIM_TAG_ORBS - loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT - loadspritegfx ANIM_TAG_METEOR - loadspritegfx ANIM_TAG_FLAT_ROCK - monbg ANIM_ATK_PARTNER - setalpha 12, 8 - createvisualtask sub_8115A04, 2, 2, 1, 4, 0, 11, RGB(31, 31, 11) - playsewithpan SE_W025, -64 - call SolarBeamSetUp1 - waitforvisualfinish - createsprite gUnknown_08595FEC, 130, 0 - playsewithpan SE_W025, -64 - delay 15 - createsprite gBattleAnimSpriteTemplate_85972D8, 2, 4, 1, 180, 1 - createvisualtask sub_8159244, 5, 234, 0 - delay 20 - createvisualtask sub_815B7D0, 2, 0 - delay 4 - createvisualtask sub_8117494, 50 - waitforvisualfinish - createvisualtask sub_8117494, 2 - playsewithpan SE_W043, -64 - blendoff - clearmonbg ANIM_ATTACKER - end + loadspritegfx ANIM_TAG_ORBS + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT + loadspritegfx ANIM_TAG_METEOR + loadspritegfx ANIM_TAG_FLAT_ROCK + monbg ANIM_ATK_PARTNER + setalpha 12, 8 + createvisualtask sub_8115A04, 2, 2, 1, 4, 0, 11, RGB(31, 31, 11) + playsewithpan SE_W025, -64 + call SolarBeamSetUp1 + waitforvisualfinish + createsprite gUnknown_08595FEC, ANIM_TARGET, 2, 0 + playsewithpan SE_W025, -64 + delay 15 + createsprite gBattleAnimSpriteTemplate_85972D8, ANIM_ATTACKER, 2, 4, 1, 180, 1 + createvisualtask sub_8159244, 5, 234, 0 + delay 20 + createvisualtask sub_815B7D0, 2, 0 + delay 4 + createvisualtask sub_8117494, 50 + waitforvisualfinish + createvisualtask sub_8117494, 2 + playsewithpan SE_W043, -64 + blendoff + clearmonbg ANIM_ATTACKER + end AnimScript_82D85A3: createvisualtask sub_8172E9C, 2 From c6a207c37b052c954b1e3ccd1bddbc86f0f2b0b3 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 23 Nov 2018 22:26:36 +0100 Subject: [PATCH 176/667] Fix Teleport in double wild battles --- src/battle_script_commands.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f793dad2e8..d4175643f0 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6456,10 +6456,25 @@ static void atk76_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_KACHI1, TRUE); From 5fea7e3216900e3e3c478731ad7734168f227d4b Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 23 Nov 2018 23:07:02 +0100 Subject: [PATCH 177/667] Fix overworld weather --- src/battle_util.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 15c301dab5..8b75da4afa 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2512,7 +2512,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA speciesDef = gBattleMons[gBattlerTarget].species; pidDef = gBattleMons[gBattlerTarget].personality; - gLastUsedAbility = GetBattlerAbility(battler); + if (special) + gLastUsedAbility = special; + else + gLastUsedAbility = GetBattlerAbility(battler); if (moveArg) move = moveArg; From 10671a4f32cbdb03170e29bea219de5cdbe91280 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 23 Nov 2018 23:16:48 +0100 Subject: [PATCH 178/667] Fix split icons - hm cant forget --- src/pokemon_summary_screen.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 6ccb0dc1fa..838d585909 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -1082,6 +1082,8 @@ static u8 ShowSplitIcon(u8 split) LoadSpriteSheet(&sSpriteSheet_SplitIcons); if (pssData->splitIconSpriteId == 0xFF) pssData->splitIconSpriteId = CreateSprite(&sSpriteTemplate_SplitIcons, 48, 129, 0); + else if (gSprites[pssData->splitIconSpriteId].invisible) + gSprites[pssData->splitIconSpriteId].invisible = FALSE; StartSpriteAnim(&gSprites[pssData->splitIconSpriteId], split); return pssData->splitIconSpriteId; @@ -2260,6 +2262,7 @@ static void sub_81C18F4(u8 taskId) { ClearWindowTilemap(14); ClearWindowTilemap(15); + gSprites[pssData->splitIconSpriteId].invisible = TRUE; schedule_bg_copy_tilemap_to_vram(0); sub_81C1DA4(0, 3); sub_81C1EFC(0, 3, 0); From 539b05ff73da122a34f9b806b3a134f986acc13e Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 24 Nov 2018 01:02:02 +0100 Subject: [PATCH 179/667] Begin working on custom multi battles --- asm/battle_intro.s | 3 ++ .../scripts.inc | 5 ++++ include/battle.h | 1 + include/battle_setup.h | 1 + include/constants/battle_frontier.h | 1 + include/constants/trainers.h | 1 + src/battle_bg.c | 2 +- src/battle_controller_player.c | 4 +-- src/battle_controller_player_partner.c | 13 +++++++- src/battle_main.c | 6 ++-- src/battle_message.c | 2 +- src/battle_script_commands.c | 2 +- src/battle_setup.c | 3 +- src/battle_tower.c | 30 +++++++++++++++++++ 14 files changed, 63 insertions(+), 11 deletions(-) diff --git a/asm/battle_intro.s b/asm/battle_intro.s index 04a0301ce4..f65bc33075 100644 --- a/asm/battle_intro.s +++ b/asm/battle_intro.s @@ -228,6 +228,9 @@ HandleIntroSlide: @ 81181D4 ldr r0, =0x00000c03 cmp r1, r0 beq _08118208 + adds r0, r0, #1 + cmp r1, r0 + bhi _08118208 ldr r0, =sub_8118D68 b _08118258 .pool diff --git a/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc b/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc index b4046d0225..4e46bd1d0e 100644 --- a/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc +++ b/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc @@ -47,6 +47,11 @@ EverGrandeCity_PokemonLeague_1F_Pokemart_229624: @ 8229624 end EverGrandeCity_PokemonLeague_1F_EventScript_229636:: @ 8229636 + setvar VAR_0x8004, 11 + setvar VAR_0x8006, 404 + setvar VAR_0x8007, 3 + special DoSpecialTrainerBattle + waitstate lockall checkflag FLAG_0x107 goto_eq EverGrandeCity_PokemonLeague_1F_EventScript_2296BB diff --git a/include/battle.h b/include/battle.h index d25ee3a338..bbdc3a7a3a 100644 --- a/include/battle.h +++ b/include/battle.h @@ -861,6 +861,7 @@ 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_setup.h b/include/battle_setup.h index 88100cf4e0..4e6f8ebe28 100644 --- a/include/battle_setup.h +++ b/include/battle_setup.h @@ -47,6 +47,7 @@ void BattleSetup_StartLegendaryBattle(void); void StartGroudonKyogreBattle(void); void StartRegiBattle(void); u8 BattleSetup_GetTerrainId(void); +u8 GetTrainerBattleTransition(void); u8 sub_80B100C(s32 arg0); void ChooseStarter(void); void ResetTrainerOpponentIds(void); diff --git a/include/constants/battle_frontier.h b/include/constants/battle_frontier.h index b5ad4f072e..61d9ccb08e 100644 --- a/include/constants/battle_frontier.h +++ b/include/constants/battle_frontier.h @@ -37,6 +37,7 @@ #define SPECIAL_BATTLE_STEVEN 8 #define SPECIAL_BATTLE_PIKE_DOUBLE 9 #define SPECIAL_BATTLE_PYRAMID 10 +#define SPECIAL_BATTLE_MULTI 11 // For 'ShowFacilityResultsWindow' function which is a part of the 'CallFrontierUtilFunc' special. #define RESULTS_LINK_CONTEST 7 diff --git a/include/constants/trainers.h b/include/constants/trainers.h index 2ea9f7c621..9b333b5317 100644 --- a/include/constants/trainers.h +++ b/include/constants/trainers.h @@ -13,6 +13,7 @@ #define TRAINER_LINK_OPPONENT 2048 #define TRAINER_OPPONENT_C00 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/src/battle_bg.c b/src/battle_bg.c index 51138040ce..7bc042bfd4 100644 --- a/src/battle_bg.c +++ b/src/battle_bg.c @@ -1107,7 +1107,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*)(VRAM + 0x4000)); LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void*)(VRAM + 0xE000)); diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 5da609b15f..9f7acdbf0c 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -2318,7 +2318,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].coords) * 4 + 80; @@ -2336,7 +2336,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); diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 65e6c2dd8e..3ab8869aac 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -1315,6 +1315,12 @@ static void PlayerPartnerHandleDrawTrainerPic(void) xPos = 90; yPos = (8 - gTrainerBackPicCoords[trainerPicId].coords) * 4 + 80; } + else if (gPartnerTrainerId >= TRAINER_CUSTOM_PARTNER) + { + trainerPicId = gPartnerSpriteId; + xPos = 90; + yPos = (8 - gTrainerBackPicCoords[trainerPicId].coords) * 4 + 80; + } else { trainerPicId = GetFrontierTrainerFrontSpriteId(gPartnerTrainerId); @@ -1323,7 +1329,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)); @@ -1799,6 +1805,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); diff --git a/src/battle_main.c b/src/battle_main.c index e2101a9c4c..6d4a960ff6 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -191,7 +191,6 @@ EWRAM_DATA u8 gDisplayedStringBattle[300] = {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; @@ -288,6 +287,7 @@ 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); @@ -616,7 +616,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; @@ -2693,7 +2693,7 @@ static void sub_80398D0(struct Sprite *sprite) { sprite->invisible = FALSE; sprite->callback = SpriteCallbackDummy_2; - sUnusedUnknownArray[0] = 0; + // sUnusedUnknownArray[0] = 0; } } } diff --git a/src/battle_message.c b/src/battle_message.c index e5ba3d30b1..ee47ad46f8 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -2684,7 +2684,7 @@ static const u8 *BattleStringGetPlayerName(u8 *text, u8 battlerId) toCpy = gSaveBlock2Ptr->playerName; break; case B_POSITION_PLAYER_RIGHT: - if (gBattleTypeFlags & (BATTLE_TYPE_RECORDED | BATTLE_TYPE_MULTI)) + if (gBattleTypeFlags & BATTLE_TYPE_LINK && gBattleTypeFlags & (BATTLE_TYPE_RECORDED | BATTLE_TYPE_MULTI)) { toCpy = gLinkPlayers[2].name; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d4175643f0..7d856dae6e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3360,7 +3360,7 @@ static bool32 IsBattleLostForPlayer(void) u32 i; u32 HP_count = 0; - 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 < 3; i++) { diff --git a/src/battle_setup.c b/src/battle_setup.c index 3913cabb1d..d42f572370 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -79,7 +79,6 @@ 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 sub_80B1218(void); static void sub_80B1234(void); static void CB2_GiveStarter(void); @@ -795,7 +794,7 @@ static u8 GetWildBattleTransition(void) } } -static u8 GetTrainerBattleTransition(void) +u8 GetTrainerBattleTransition(void) { u8 minPartyCount; u8 transitionType; diff --git a/src/battle_tower.c b/src/battle_tower.c index 165b6bf648..b4a92a8467 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -792,6 +792,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 < TRAINER_RECORD_MIXING_FRIEND) { trainerClass = gFacilityClassToTrainerClass[gFacilityTrainers[trainerId].facilityClass]; @@ -875,6 +879,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 < TRAINER_RECORD_MIXING_FRIEND) { for (i = 0; i < PLAYER_NAME_LENGTH; i++) @@ -1463,6 +1472,19 @@ void DoSpecialTrainerBattle(void) PlayMapChosenOrBattleBGM(0); BattleTransition_StartOnField(B_TRANSITION_MAGMA); break; + case SPECIAL_BATTLE_MULTI: + gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER; + gPartnerSpriteId = gSpecialVar_0x8007; + FillPartnerParty(gSpecialVar_0x8006 + TRAINER_CUSTOM_PARTNER); + gApproachingTrainerId = 0; + BattleSetup_ConfigureTrainerBattle(MossdeepCity_SpaceCenter_2F_EventScript_224157 + 1); + gApproachingTrainerId = 1; + BattleSetup_ConfigureTrainerBattle(MossdeepCity_SpaceCenter_2F_EventScript_224166 + 1); + gPartnerTrainerId = gSpecialVar_0x8006 + TRAINER_CUSTOM_PARTNER; + CreateTask(Task_StartBattleAfterTransition, 1); + PlayMapChosenOrBattleBGM(0); + BattleTransition_StartOnField(GetTrainerBattleTransition()); + break; } } @@ -2307,6 +2329,14 @@ static void FillPartnerParty(u16 trainerId) CalculateMonStats(&gPlayerParty[3 + i]); } } + else if (trainerId >= TRAINER_CUSTOM_PARTNER) + { + for (i = 0; i < 3; i++) + { + // Temporary. + CreateMon(&gPlayerParty[3 + i], Random() % NUM_SPECIES, Random() % MAX_LEVEL, Random() % 31, 0, 0, 0, 0); + } + } else if (trainerId == TRAINER_EREADER) { // Scrapped, lol. From d52016bc310ca6d476067b0cb27c40c20ee1946d Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 24 Nov 2018 13:29:10 +0100 Subject: [PATCH 180/667] Mon creation in custom multi battles --- .../scripts.inc | 2 + include/battle_debug.h | 2 +- src/battle_ai_script_commands.c | 2 +- src/battle_setup.c | 4 +- src/battle_tower.c | 68 +++++++++++++++++-- 5 files changed, 67 insertions(+), 11 deletions(-) diff --git a/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc b/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc index 4e46bd1d0e..27ac842afc 100644 --- a/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc +++ b/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc @@ -47,6 +47,8 @@ EverGrandeCity_PokemonLeague_1F_Pokemart_229624: @ 8229624 end EverGrandeCity_PokemonLeague_1F_EventScript_229636:: @ 8229636 + trainerbattle 10, 406, 0, NULL, EverGrandeCity_PokemonLeague_1F_Text_2297EF, NULL + trainerbattle 11, 402, 0, NULL, EverGrandeCity_PokemonLeague_1F_Text_2297EF, NULL setvar VAR_0x8004, 11 setvar VAR_0x8006, 404 setvar VAR_0x8007, 3 diff --git a/include/battle_debug.h b/include/battle_debug.h index 42dd97f5a7..271f875538 100644 --- a/include/battle_debug.h +++ b/include/battle_debug.h @@ -3,6 +3,6 @@ #define USE_BATTLE_DEBUG TRUE -extern void CB2_BattleDebugMenu(void); +void CB2_BattleDebugMenu(void); #endif // GUARD_BATTLE_DEBUG_H diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 91baf4d7c3..db63a5c68e 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -2524,5 +2524,5 @@ static void BattleAICmd_if_doesnt_hold_berry(void) if (ItemId_GetPocket(item) == POCKET_BERRIES) gAIScriptPtr += 6; else - T1_READ_PTR(gAIScriptPtr + 2); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); } diff --git a/src/battle_setup.c b/src/battle_setup.c index d42f572370..7770815b13 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -1143,10 +1143,10 @@ const u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data) return EventScript_271362; 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_12: if (gApproachingTrainerId == 0) { diff --git a/src/battle_tower.c b/src/battle_tower.c index b4a92a8467..2131b5d11c 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -1476,10 +1476,6 @@ void DoSpecialTrainerBattle(void) gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER; gPartnerSpriteId = gSpecialVar_0x8007; FillPartnerParty(gSpecialVar_0x8006 + TRAINER_CUSTOM_PARTNER); - gApproachingTrainerId = 0; - BattleSetup_ConfigureTrainerBattle(MossdeepCity_SpaceCenter_2F_EventScript_224157 + 1); - gApproachingTrainerId = 1; - BattleSetup_ConfigureTrainerBattle(MossdeepCity_SpaceCenter_2F_EventScript_224166 + 1); gPartnerTrainerId = gSpecialVar_0x8006 + TRAINER_CUSTOM_PARTNER; CreateTask(Task_StartBattleAfterTransition, 1); PlayMapChosenOrBattleBGM(0); @@ -2302,7 +2298,7 @@ static void FillPartnerParty(u16 trainerId) u32 friendship; u16 monSetId; u32 otID; - u8 trainerName[PLAYER_NAME_LENGTH + 1]; + u8 trainerName[(PLAYER_NAME_LENGTH * 3) + 1]; SetFacilityPtrsGetLevel(); if (trainerId == TRAINER_STEVEN_PARTNER) @@ -2331,10 +2327,68 @@ static void FillPartnerParty(u16 trainerId) } 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++) { - // Temporary. - CreateMon(&gPlayerParty[3 + i], Random() % NUM_SPECIES, Random() % MAX_LEVEL, Random() % 31, 0, 0, 0, 0); + 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) From 1c8e574646168acb0768fe68672c99d3ba674c0d Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 24 Nov 2018 17:06:48 +0100 Subject: [PATCH 181/667] Custom Multi Battles - fix defeat msg --- .../maps/EverGrandeCity_PokemonLeague_1F/scripts.inc | 12 ++++++++++-- src/battle_setup.c | 3 ++- src/battle_tower.c | 7 +++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc b/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc index 27ac842afc..e94e9c0973 100644 --- a/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc +++ b/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc @@ -47,13 +47,21 @@ EverGrandeCity_PokemonLeague_1F_Pokemart_229624: @ 8229624 end EverGrandeCity_PokemonLeague_1F_EventScript_229636:: @ 8229636 - trainerbattle 10, 406, 0, NULL, EverGrandeCity_PokemonLeague_1F_Text_2297EF, NULL - trainerbattle 11, 402, 0, NULL, EverGrandeCity_PokemonLeague_1F_Text_2297EF, NULL + special SavePlayerParty + + trainerbattle 10, 406, 0, NULL, EverGrandeCity_PokemonLeague_1F_Text_2297EF + trainerbattle 11, 402, 0, NULL, EverGrandeCity_PokemonLeague_1F_Text_2297EF + setvar VAR_0x8004, 11 + setvar VAR_0x8005, 0 setvar VAR_0x8006, 404 setvar VAR_0x8007, 3 special DoSpecialTrainerBattle + waitstate + + special LoadPlayerParty + lockall checkflag FLAG_0x107 goto_eq EverGrandeCity_PokemonLeague_1F_EventScript_2296BB diff --git a/src/battle_setup.c b/src/battle_setup.c index 7770815b13..f9b1be91e5 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -1086,7 +1086,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) diff --git a/src/battle_tower.c b/src/battle_tower.c index 2131b5d11c..f881d4bccc 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -1330,6 +1330,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); From cc635c5e6d27a4d4b658b528a2d7422819e2a1be Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 24 Nov 2018 17:31:45 +0100 Subject: [PATCH 182/667] Custom wild multi battles functionality --- asm/party_menu.s | 4 ++-- data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc | 4 ++-- include/battle_setup.h | 1 + src/battle_main.c | 2 +- src/battle_setup.c | 3 +-- src/battle_tower.c | 10 ++++++++-- 6 files changed, 15 insertions(+), 9 deletions(-) diff --git a/asm/party_menu.s b/asm/party_menu.s index 231cb72d79..5d818a3a5a 100644 --- a/asm/party_menu.s +++ b/asm/party_menu.s @@ -2180,9 +2180,9 @@ sub_81B1250: @ 81B1250 push {lr} ldr r0, =gBattleTypeFlags ldr r0, [r0] - movs r1, 0x49 + movs r1, 0x41 ands r0, r1 - cmp r0, 0x49 + cmp r0, 0x41 bne _081B1280 ldr r0, =gMain ldr r1, =0x00000439 diff --git a/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc b/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc index e94e9c0973..76cf301d64 100644 --- a/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc +++ b/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc @@ -49,8 +49,8 @@ EverGrandeCity_PokemonLeague_1F_Pokemart_229624: @ 8229624 EverGrandeCity_PokemonLeague_1F_EventScript_229636:: @ 8229636 special SavePlayerParty - trainerbattle 10, 406, 0, NULL, EverGrandeCity_PokemonLeague_1F_Text_2297EF - trainerbattle 11, 402, 0, NULL, EverGrandeCity_PokemonLeague_1F_Text_2297EF + trainerbattle 10, 264, 0, NULL, EverGrandeCity_PokemonLeague_1F_Text_2297EF + trainerbattle 11, 263, 0, NULL, EverGrandeCity_PokemonLeague_1F_Text_2297EF setvar VAR_0x8004, 11 setvar VAR_0x8005, 0 diff --git a/include/battle_setup.h b/include/battle_setup.h index 4e6f8ebe28..e7129641cf 100644 --- a/include/battle_setup.h +++ b/include/battle_setup.h @@ -47,6 +47,7 @@ void BattleSetup_StartLegendaryBattle(void); void StartGroudonKyogreBattle(void); void StartRegiBattle(void); u8 BattleSetup_GetTerrainId(void); +u8 GetWildBattleTransition(void); u8 GetTrainerBattleTransition(void); u8 sub_80B100C(s32 arg0); void ChooseStarter(void); diff --git a/src/battle_main.c b/src/battle_main.c index 6d4a960ff6..3cc0015656 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3442,7 +3442,7 @@ static void BattleIntroDrawTrainersOrMonsSprites(void) if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT - || GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_RIGHT) + || (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_RIGHT && gBattleTypeFlags & BATTLE_TYPE_TRAINER)) { BtlController_EmitDrawTrainerPic(0); MarkBattlerForControllerExec(gActiveBattler); diff --git a/src/battle_setup.c b/src/battle_setup.c index f9b1be91e5..f311b17661 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -78,7 +78,6 @@ static void DoSafariBattle(void); static void DoStandardWildBattle(bool32 isDouble); static void CB2_EndWildBattle(void); static void CB2_EndScriptedWildBattle(void); -static u8 GetWildBattleTransition(void); static void sub_80B1218(void); static void sub_80B1234(void); static void CB2_GiveStarter(void); @@ -772,7 +771,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); diff --git a/src/battle_tower.c b/src/battle_tower.c index f881d4bccc..b6bcfe04ba 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -1480,13 +1480,19 @@ void DoSpecialTrainerBattle(void) BattleTransition_StartOnField(B_TRANSITION_MAGMA); break; case SPECIAL_BATTLE_MULTI: - gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER; + if (gSpecialVar_0x8005 & 1) + gBattleTypeFlags = BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER; + else + gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER; gPartnerSpriteId = gSpecialVar_0x8007; FillPartnerParty(gSpecialVar_0x8006 + TRAINER_CUSTOM_PARTNER); gPartnerTrainerId = gSpecialVar_0x8006 + TRAINER_CUSTOM_PARTNER; CreateTask(Task_StartBattleAfterTransition, 1); PlayMapChosenOrBattleBGM(0); - BattleTransition_StartOnField(GetTrainerBattleTransition()); + if (gSpecialVar_0x8005 & 1) + BattleTransition_StartOnField(GetWildBattleTransition()); + else + BattleTransition_StartOnField(GetTrainerBattleTransition()); break; } } From 194139a35b665592d92ea0d0e6bab26493ae7f5c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 24 Nov 2018 19:37:10 +0100 Subject: [PATCH 183/667] Add Move Effect - Feint --- data/battle_scripts_1.s | 10 ++++++++++ .../scripts.inc | 10 +++++----- include/battle_scripts.h | 1 + include/constants/battle.h | 2 +- include/constants/battle_move_effects.h | 1 + include/constants/battle_string_ids.h | 3 ++- src/battle_message.c | 2 ++ src/battle_script_commands.c | 20 +++++++++++++++++++ src/data/battle_moves.h | 4 ++-- 9 files changed, 44 insertions(+), 9 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 3a4df269d7..a7d105b4e6 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -335,6 +335,16 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectRevelationDance .4byte BattleScript_EffectAuroraVeil .4byte BattleScript_EffectThirdType + .4byte BattleScript_EffectFeint + +BattleScript_MoveEffectFeint:: + printstring STRINGID_FELLFORFEINT + waitmessage 0x40 + return + +BattleScript_EffectFeint: + setmoveeffect MOVE_EFFECT_FEINT + goto BattleScript_EffectHit BattleScript_EffectThirdType: attackcanceler diff --git a/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc b/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc index 76cf301d64..32c4c038b3 100644 --- a/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc +++ b/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc @@ -49,13 +49,13 @@ EverGrandeCity_PokemonLeague_1F_Pokemart_229624: @ 8229624 EverGrandeCity_PokemonLeague_1F_EventScript_229636:: @ 8229636 special SavePlayerParty - trainerbattle 10, 264, 0, NULL, EverGrandeCity_PokemonLeague_1F_Text_2297EF - trainerbattle 11, 263, 0, NULL, EverGrandeCity_PokemonLeague_1F_Text_2297EF + trainerbattle 10, TRAINER_DRAKE, 0, NULL, EverGrandeCity_PokemonLeague_1F_Text_2297EF + trainerbattle 11, TRAINER_GLACIA, 0, NULL, EverGrandeCity_PokemonLeague_1F_Text_2297EF - setvar VAR_0x8004, 11 + setvar VAR_0x8004, SPECIAL_BATTLE_MULTI setvar VAR_0x8005, 0 - setvar VAR_0x8006, 404 - setvar VAR_0x8007, 3 + setvar VAR_0x8006, TRAINER_EDWARDO + setvar VAR_0x8007, TRAINER_BACK_PIC_LEAF special DoSpecialTrainerBattle waitstate diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 63aaab13e0..1a3ef5ed78 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -282,5 +282,6 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle.h b/include/constants/battle.h index 5448b1ab8a..d61e040fd2 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -319,7 +319,7 @@ #define MOVE_EFFECT_SP_ATK_TWO_DOWN 0x3B #define MOVE_EFFECT_SMACK_DOWN 0x3C #define MOVE_EFFECT_FLAME_BURST 0x3D -#define MOVE_EFFECT_NOTHING_3E 0x3E +#define MOVE_EFFECT_FEINT 0x3E #define MOVE_EFFECT_NOTHING_3F 0x3F #define MOVE_EFFECT_AFFECTS_USER 0x40 #define MOVE_EFFECT_CERTAIN 0x80 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 6b956aed7d..d3c569a1eb 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -323,5 +323,6 @@ #define EFFECT_REVELATION_DANCE 317 #define EFFECT_AURORA_VEIL 318 #define EFFECT_THIRD_TYPE 319 +#define EFFECT_FEINT 320 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 3205a30372..214591ed96 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -512,7 +512,8 @@ #define STRINGID_BURSTINGFLAMESHIT 508 #define STRINGID_BESTOWITEMGIVING 509 #define STRINGID_THIRDTYPEADDED 510 +#define STRINGID_FELLFORFEINT 511 -#define BATTLESTRINGS_COUNT 521 +#define BATTLESTRINGS_COUNT 525 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_message.c b/src/battle_message.c index ee47ad46f8..dcd7601cbf 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -649,6 +649,7 @@ static const u8 sText_NoEffectOnTarget[] = _("It had no effect\non {B_DEF_NAME_W 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!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { @@ -1152,6 +1153,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_BurstingFlames, sText_BestowItemGiving, sText_ThirdTypeAdded, + sText_FellForFeint, }; const u16 gTerrainStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 7d856dae6e..d5180cb0b0 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -926,6 +926,8 @@ 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 ((gProtectStructs[battlerId].wideGuarded || gProtectStructs[BATTLE_PARTNER(battlerId)].wideGuarded) @@ -2733,6 +2735,24 @@ void SetMoveEffect(bool8 primary, u8 certain) gBattlescriptCurrInstr = BattleScript_MoveEffectFlameBurst; } break; + case MOVE_EFFECT_FEINT: + if (gProtectStructs[gBattlerTarget].protected + || gProtectStructs[gBattlerTarget].wideGuarded + || gProtectStructs[gBattlerTarget].quickGuarded + || gProtectStructs[gBattlerTarget].spikyShielded + || gProtectStructs[gBattlerTarget].kingsShielded + || gProtectStructs[gBattlerTarget].banefulBunkered) + { + gProtectStructs[gBattlerTarget].protected = 0; + gProtectStructs[gBattlerTarget].wideGuarded = 0; + gProtectStructs[gBattlerTarget].quickGuarded = 0; + gProtectStructs[gBattlerTarget].spikyShielded = 0; + gProtectStructs[gBattlerTarget].kingsShielded = 0; + gProtectStructs[gBattlerTarget].banefulBunkered = 0; + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectFeint; + } + break; } } } diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index a00ac461ed..7038e30727 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -4374,12 +4374,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_PHYSICAL, }, { // MOVE_FEINT - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_FEINT, .power = 30, .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 2, .flags = FLAG_MIRROR_MOVE_AFFECTED, From 434e25794345bf0589ac026f9a158dd8c851aabe Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 24 Nov 2018 21:06:53 +0100 Subject: [PATCH 184/667] Add Acupressure --- asm/macros/battle_script.inc | 5 + data/battle_scripts_1.s | 26 +++- include/battle.h | 1 + include/constants/battle.h | 2 +- include/constants/battle_move_effects.h | 2 + include/constants/battle_script_commands.h | 1 + src/battle_controller_player.c | 134 ++++++++++++--------- src/battle_script_commands.c | 36 +++++- src/data/battle_moves.h | 13 +- 9 files changed, 148 insertions(+), 72 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 8a8e12e9a7..ad323a8196 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1575,6 +1575,11 @@ various \battler, VARIOUS_TRY_THIRD_TYPE .4byte \ptr .endm + + .macro tryaccupressure battler, ptr + various \battler, VARIOUS_ACUPRESSURE + .4byte \ptr + .endm @ helpful macros .macro setstatchanger stat, stages, down diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index a7d105b4e6..122b0f26e0 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -336,6 +336,23 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectAuroraVeil .4byte BattleScript_EffectThirdType .4byte BattleScript_EffectFeint + .4byte BattleScript_EffectSparklingAria + .4byte BattleScript_EffectAcupressure + +BattleScript_EffectAcupressure: + attackcanceler + jumpifbyteequal gBattlerTarget, gBattlerAttacker, BattleScript_EffectAcupressureTry + jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_PrintMoveMissed +BattleScript_EffectAcupressureTry: + attackstring + ppreduce + tryaccupressure BS_TARGET, BattleScript_ButItFailed + 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 @@ -1583,7 +1600,6 @@ BattleScript_EffectEruption: BattleScript_EffectPledge: BattleScript_EffectFling: BattleScript_EffectNaturalGift: -BattleScript_EffectWakeUpSlap: BattleScript_EffectWringOut: BattleScript_EffectHex: BattleScript_EffectAssurance: @@ -3511,7 +3527,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:: @@ -3716,9 +3732,11 @@ BattleScript_EffectFocusPunch:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_EffectSmellingsalt:: +BattleScript_EffectSmellingsalt: +BattleScript_EffectWakeUpSlap: +BattleScript_EffectSparklingAria: jumpifsubstituteblocks BattleScript_EffectHit - setmoveeffect MOVE_EFFECT_REMOVE_PARALYSIS | MOVE_EFFECT_CERTAIN + setmoveeffect MOVE_EFFECT_REMOVE_STATUS | MOVE_EFFECT_CERTAIN goto BattleScript_EffectHit BattleScript_EffectFollowMe:: diff --git a/include/battle.h b/include/battle.h index bbdc3a7a3a..cf4daf276a 100644 --- a/include/battle.h +++ b/include/battle.h @@ -60,6 +60,7 @@ #define MOVE_TARGET_USER 0x10 #define MOVE_TARGET_FOES_AND_ALLY 0x20 #define MOVE_TARGET_OPPONENTS_FIELD 0x40 +#define MOVE_TARGET_ALLY 0x80 #define BATTLE_BUFFER_LINK_SIZE 0x1000 diff --git a/include/constants/battle.h b/include/constants/battle.h index d61e040fd2..99eb49053c 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -293,7 +293,7 @@ #define MOVE_EFFECT_NIGHTMARE 0x21 #define MOVE_EFFECT_ALL_STATS_UP 0x22 #define MOVE_EFFECT_RAPIDSPIN 0x23 -#define MOVE_EFFECT_REMOVE_PARALYSIS 0x24 +#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 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index d3c569a1eb..554b8d9344 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -324,5 +324,7 @@ #define EFFECT_AURORA_VEIL 318 #define EFFECT_THIRD_TYPE 319 #define EFFECT_FEINT 320 +#define EFFECT_SPARKLING_ARIA 321 +#define EFFECT_ACUPRESSURE 322 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index c4ba51f132..9c345f91c6 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -132,6 +132,7 @@ #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 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 9f7acdbf0c..fb461fa163 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -359,6 +359,7 @@ static void HandleInputChooseTarget(void) { s32 i; u8 identities[4]; + u16 move = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + gMoveSelectionCursor[gActiveBattler]); memcpy(identities, sTargetIdentities, ARRAY_COUNT(sTargetIdentities)); DoBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX, 15, 1); @@ -406,41 +407,48 @@ static void HandleInputChooseTarget(void) PlaySE(SE_SELECT); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = sub_8039B2C; - 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 = 4; // 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 = sub_8039AD8; } else if (gMain.newKeys & (DPAD_RIGHT | DPAD_DOWN)) @@ -448,41 +456,49 @@ static void HandleInputChooseTarget(void) PlaySE(SE_SELECT); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = sub_8039B2C; - 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 = sub_8039AD8; } } @@ -528,6 +544,8 @@ static void HandleInputChooseMove(void) { 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_USER | MOVE_TARGET_ALLY) && IsBattlerAlive(BATTLE_PARTNER(gActiveBattler))) + canSelectTarget++; if (moveInfo->currentPp[gMoveSelectionCursor[gActiveBattler]] == 0) { diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d5180cb0b0..00c8991587 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -722,7 +722,7 @@ static const u8* const sMoveEffectBS_Ptrs[] = 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_REMOVE_STATUS BattleScript_MoveEffectSleep, // MOVE_EFFECT_ATK_DEF_DOWN BattleScript_MoveEffectRecoil, // MOVE_EFFECT_RECOIL_33 }; @@ -2602,14 +2602,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); @@ -6311,6 +6311,7 @@ static void atk76_various(void) u8 side; s32 i, j; u8 data[10]; + u32 bits; if (gBattleControllerExecFlags) return; @@ -6319,6 +6320,33 @@ static void atk76_various(void) switch (gBattlescriptCurrInstr[2]) { + 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; + } while (!(bits & gBitTable[statId])); + + if (gBattleMons[gActiveBattler].statStages[statId] >= 11) + SET_STATCHANGER(statId, 1, FALSE); + else + SET_STATCHANGER(statId, 2, FALSE); + + gBattlescriptCurrInstr += 7; + } + else + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + } + return; case VARIOUS_CANCEL_MULTI_TURN_MOVES: CancelMultiTurnMoves(gActiveBattler); break; diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 7038e30727..098f431c8b 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -3034,7 +3034,7 @@ 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 | FLAG_SHEER_FORCE_BOOST, @@ -3195,6 +3195,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, .split = SPLIT_PHYSICAL, + .argument = STATUS1_PARALYSIS, }, { // MOVE_FOLLOW_ME .effect = EFFECT_FOLLOW_ME, @@ -4312,6 +4313,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .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_SPEED_DOWN, @@ -4410,13 +4412,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_STATUS, }, { // MOVE_ACUPRESSURE - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_ACUPRESSURE, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, .secondaryEffectChance = 0, - .target = MOVE_TARGET_USER, + .target = MOVE_TARGET_USER | MOVE_TARGET_ALLY, .priority = 0, .flags = 0, .split = SPLIT_STATUS, @@ -7493,7 +7495,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_STATUS, }, { // MOVE_FIRST_IMPRESSION - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_FAKE_OUT, .power = 90, .type = TYPE_BUG, .accuracy = 100, @@ -7541,7 +7543,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_PHYSICAL, }, { // MOVE_SPARKLING_ARIA - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_SPARKLING_ARIA, .power = 90, .type = TYPE_WATER, .accuracy = 100, @@ -7551,6 +7553,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SOUND, .split = SPLIT_SPECIAL, + .argument = STATUS1_BURN, }, { // MOVE_ICE_HAMMER .effect = EFFECT_SPEED_DOWN_HIT, From 13ea841e32d3cc2dd7d97dfd6f13258dd21f4fe5 Mon Sep 17 00:00:00 2001 From: Kurausukun Date: Sat, 24 Nov 2018 21:16:32 -0500 Subject: [PATCH 185/667] change pokemon types to use fairy type --- src/data/pokemon/base_stats.h | 46 +++++++++++++++++------------------ 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/data/pokemon/base_stats.h b/src/data/pokemon/base_stats.h index bc6572b46b..cafdeb532b 100644 --- a/src/data/pokemon/base_stats.h +++ b/src/data/pokemon/base_stats.h @@ -1139,8 +1139,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, @@ -1172,8 +1172,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, @@ -1272,7 +1272,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, @@ -1305,7 +1305,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, @@ -4011,7 +4011,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, @@ -5693,8 +5693,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, @@ -5759,8 +5759,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, @@ -5792,7 +5792,7 @@ const struct BaseStats gBaseStats[] = .baseSpeed = 40, .baseSpAttack = 80, .baseSpDefense = 105, - .type1 = TYPE_NORMAL, + .type1 = TYPE_FAIRY, .type2 = TYPE_FLYING, .catchRate = 75, .expYield = 114, @@ -6024,7 +6024,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, @@ -6057,7 +6057,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, @@ -6881,8 +6881,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, @@ -6914,8 +6914,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, @@ -11535,7 +11535,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, @@ -11700,7 +11700,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, @@ -12921,7 +12921,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, @@ -12954,7 +12954,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, @@ -12987,7 +12987,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, From 690f2671cb157f6a41a302a69a4dbc163bf0785b Mon Sep 17 00:00:00 2001 From: Kurausukun Date: Sun, 25 Nov 2018 05:54:32 -0500 Subject: [PATCH 186/667] oops, forgot Igglybuff --- src/data/pokemon/base_stats.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/pokemon/base_stats.h b/src/data/pokemon/base_stats.h index cafdeb532b..39ea7aa96b 100644 --- a/src/data/pokemon/base_stats.h +++ b/src/data/pokemon/base_stats.h @@ -5727,7 +5727,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, From a0699dba52608e7dae6b407156787b48dc89315f Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 25 Nov 2018 12:59:22 +0100 Subject: [PATCH 187/667] Add Aromatic Mist --- data/battle_scripts_1.s | 26 +++++++++++++++++++ .../scripts.inc | 4 +-- include/constants/battle_move_effects.h | 1 + src/battle_controller_player.c | 2 +- src/battle_main.c | 7 +++++ src/battle_util.c | 7 +++++ src/data/battle_moves.h | 6 ++--- 7 files changed, 47 insertions(+), 6 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 122b0f26e0..2f899daca2 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -338,6 +338,32 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectFeint .4byte BattleScript_EffectSparklingAria .4byte BattleScript_EffectAcupressure + .4byte BattleScript_EffectAromaticMist + +BattleScript_EffectAromaticMist: + attackcanceler + attackstring + ppreduce + jumpifbyteequal gBattlerTarget, gBattlerAttacker, BattleScript_ButItFailed + jumpiftargetally BattleScript_EffectAromaticMistWorks + goto BattleScript_ButItFailed +BattleScript_EffectAromaticMistWorks: + setstatchanger STAT_SPDEF, 1, FALSE + statbuffchange 0x1, 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_EffectAcupressure: attackcanceler diff --git a/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc b/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc index 32c4c038b3..3dde1b31c7 100644 --- a/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc +++ b/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc @@ -49,8 +49,8 @@ EverGrandeCity_PokemonLeague_1F_Pokemart_229624: @ 8229624 EverGrandeCity_PokemonLeague_1F_EventScript_229636:: @ 8229636 special SavePlayerParty - trainerbattle 10, TRAINER_DRAKE, 0, NULL, EverGrandeCity_PokemonLeague_1F_Text_2297EF - trainerbattle 11, TRAINER_GLACIA, 0, NULL, EverGrandeCity_PokemonLeague_1F_Text_2297EF + trainerbattle 10, TRAINER_ALBERT, 0, NULL, EverGrandeCity_PokemonLeague_1F_Text_2296E8 + trainerbattle 11, TRAINER_ALEXA, 0, NULL, EverGrandeCity_PokemonLeague_1F_Text_2297EF setvar VAR_0x8004, SPECIAL_BATTLE_MULTI setvar VAR_0x8005, 0 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 554b8d9344..6407d93a12 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -326,5 +326,6 @@ #define EFFECT_FEINT 320 #define EFFECT_SPARKLING_ARIA 321 #define EFFECT_ACUPRESSURE 322 +#define EFFECT_AROMATIC_MIST 323 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index fb461fa163..21e9453175 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -542,7 +542,7 @@ static void HandleInputChooseMove(void) } 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))) + 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++; // either selected or user if (moveTarget == (MOVE_TARGET_USER | MOVE_TARGET_ALLY) && IsBattlerAlive(BATTLE_PARTNER(gActiveBattler))) canSelectTarget++; diff --git a/src/battle_main.c b/src/battle_main.c index 3cc0015656..993a728165 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5638,6 +5638,13 @@ static 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 { gBattlerTarget = *(gBattleStruct->moveTarget + gBattlerAttacker); diff --git a/src/battle_util.c b/src/battle_util.c index 8b75da4afa..3ebec364bd 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4246,8 +4246,15 @@ u8 GetMoveTarget(u16 move, u8 setTarget) 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; diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 098f431c8b..2762a6aa10 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -7134,7 +7134,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_SPECIAL, }, { // MOVE_HYPERSPACE_HOLE - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_FEINT, .power = 80, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -7182,13 +7182,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_STATUS, }, { // MOVE_AROMATIC_MIST - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_AROMATIC_MIST, .power = 0, .type = TYPE_FAIRY, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, - .target = MOVE_TARGET_USER, + .target = MOVE_TARGET_ALLY, .priority = 0, .flags = 0, .split = SPLIT_STATUS, From c8bc40e3e8014aaf8d2b57b56c33fa1258d425ef Mon Sep 17 00:00:00 2001 From: Kurausukun Date: Fri, 30 Nov 2018 00:56:53 -0500 Subject: [PATCH 188/667] Update battle_moves.h --- src/data/battle_moves.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 098f431c8b..4b16298da0 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -3499,7 +3499,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = }, { // MOVE_DIVE .effect = EFFECT_SEMI_INVULNERABLE, - .power = 60, + .power = 80, .type = TYPE_WATER, .accuracy = 100, .pp = 10, From 7a69f9cb0d99aeca973b92cb87a1f8d5fbc59c06 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 30 Nov 2018 20:48:43 +0100 Subject: [PATCH 189/667] Add Dream Eater blocked by heal block --- src/battle_util.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/battle_util.c b/src/battle_util.c index 3ebec364bd..ca60e8c9ca 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -597,6 +597,7 @@ static bool32 IsHealBlockPreventingMove(u8 battler, u32 move) case EFFECT_ROOST: case EFFECT_HEALING_WISH: case EFFECT_WISH: + case EFFECT_DREAM_EATER: return TRUE; default: return FALSE; From 5aff99b0158166bd1ffa151913cd19f14cb45549 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 30 Nov 2018 20:52:39 +0100 Subject: [PATCH 190/667] Fix Stored Power's Power --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index ca60e8c9ca..3564ca2a29 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4726,7 +4726,7 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) basePower = 200; break; case EFFECT_STORED_POWER: - basePower = 60 + (CountBattlerStatIncreases(battlerAtk, TRUE) * 20); + basePower += (CountBattlerStatIncreases(battlerAtk, TRUE) * 20); break; case EFFECT_ELECTRO_BALL: speed = GetBattlerTotalSpeedStat(battlerAtk) / GetBattlerTotalSpeedStat(battlerDef); From 0329175f06fbf8745a88d9a7d9adca81fe3b08fd Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 30 Nov 2018 21:21:43 +0100 Subject: [PATCH 191/667] Add Protean --- data/battle_scripts_1.s | 6 ++++++ include/battle_scripts.h | 1 + src/battle_main.c | 18 +++++++++--------- src/battle_script_commands.c | 16 ++++++++++++++++ 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 2f899daca2..0f6d7c7666 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5997,6 +5997,12 @@ BattleScript_ColorChangeActivates:: waitmessage 0x40 return +BattleScript_ProteanActivates:: + call BattleScript_AbilityPopUp + printstring STRINGID_PKMNCHANGEDTYPE + waitmessage 0x40 + return + BattleScript_CursedBodyActivates:: call BattleScript_AbilityPopUp printstring STRINGID_CUSEDBODYDISABLED diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 1a3ef5ed78..42079436ba 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -283,5 +283,6 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/src/battle_main.c b/src/battle_main.c index bde1732564..0deb7f0638 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5467,8 +5467,7 @@ static void HandleAction_UseMove(void) { u8 side; u8 var = 4; - u32 attackerAbility; - u32 ateType, moveType; + u32 moveType; gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; @@ -5535,6 +5534,10 @@ static 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 @@ -5547,8 +5550,8 @@ static 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) - || (gBattleMons[*(gBattleStruct->moveTarget + gBattlerAttacker)].ability != ABILITY_STORM_DRAIN && gBattleMoves[gCurrentMove].type == TYPE_WATER) + && ((gBattleMons[*(gBattleStruct->moveTarget + gBattlerAttacker)].ability != ABILITY_LIGHTNING_ROD && moveType == TYPE_ELECTRIC) + || (gBattleMons[*(gBattleStruct->moveTarget + gBattlerAttacker)].ability != ABILITY_STORM_DRAIN && moveType == TYPE_WATER) ) ) { @@ -5557,8 +5560,8 @@ static void HandleAction_UseMove(void) { if (side != GetBattlerSide(gActiveBattler) && *(gBattleStruct->moveTarget + gBattlerAttacker) != gActiveBattler - && ((gBattleMons[gActiveBattler].ability == ABILITY_LIGHTNING_ROD && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC) - || (gBattleMons[gActiveBattler].ability == ABILITY_STORM_DRAIN && gBattleMoves[gCurrentMove].type == TYPE_WATER) + && ((gBattleMons[gActiveBattler].ability == ABILITY_LIGHTNING_ROD && moveType == TYPE_ELECTRIC) + || (gBattleMons[gActiveBattler].ability == ABILITY_STORM_DRAIN && moveType == TYPE_WATER) ) && GetBattlerTurnOrderNum(gActiveBattler) < var) { @@ -5692,9 +5695,6 @@ static void HandleAction_UseMove(void) if (gBattleTypeFlags & BATTLE_TYPE_ARENA) BattleArena_AddMindPoints(gBattlerAttacker); - // Set dynamic move type. - SetTypeBeforeUsingMove(gChosenMove, gBattlerAttacker); - gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 00c8991587..f9847fca47 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -949,6 +949,7 @@ bool32 IsBattlerProtected(u8 battlerId, u16 move) static void atk00_attackcanceler(void) { s32 i; + u32 moveType; if (gBattleOutcome != 0) { @@ -963,6 +964,21 @@ static void atk00_attackcanceler(void) } 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); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ProteanActivates; + return; + } + if (AbilityBattleEffects(ABILITYEFFECT_MOVES_BLOCK, gBattlerTarget, 0, 0, 0)) return; if (!gBattleMons[gBattlerAttacker].pp[gCurrMovePos] && gCurrentMove != MOVE_STRUGGLE && !(gHitMarker & 0x800200) From dc7be39894b5ba7e9f28a213175f59896bc24a65 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 30 Nov 2018 21:42:30 +0100 Subject: [PATCH 192/667] Add Triage --- src/battle_main.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/battle_main.c b/src/battle_main.c index 0deb7f0638..11b86d8438 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4746,6 +4746,26 @@ static s8 GetMovePriority(u8 battlerId) { 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; } From 1a8859b1d8a0de64fb7e7d3e06005c73ebad92fc Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 30 Nov 2018 22:12:18 +0100 Subject: [PATCH 193/667] Add Dazzling --- data/battle_scripts_1.s | 9 +++++++++ include/battle.h | 1 + include/battle_scripts.h | 1 + include/constants/battle_string_ids.h | 1 + src/battle_main.c | 12 +++++------- src/battle_message.c | 2 ++ src/battle_script_commands.c | 2 +- src/battle_util.c | 11 +++++++++++ 8 files changed, 31 insertions(+), 8 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 0f6d7c7666..8f5177043e 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5975,6 +5975,15 @@ BattleScript_SoundproofProtected:: 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_AbilityNoSpecificStatLoss:: pause 0x20 diff --git a/include/battle.h b/include/battle.h index cf4daf276a..fe725fffab 100644 --- a/include/battle.h +++ b/include/battle.h @@ -588,6 +588,7 @@ struct BattleStruct struct MegaEvolutionData mega; const u8 *trainerSlideMsg; bool8 trainerSlideLowHpMsgDone; + s8 movePriorities[MAX_BATTLERS_COUNT]; }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 42079436ba..dd0334fce7 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -284,5 +284,6 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 214591ed96..6089b6aa73 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -513,6 +513,7 @@ #define STRINGID_BESTOWITEMGIVING 509 #define STRINGID_THIRDTYPEADDED 510 #define STRINGID_FELLFORFEINT 511 +#define STRINGID_POKEMONCANNOTUSEMOVE 512 #define BATTLESTRINGS_COUNT 525 diff --git a/src/battle_main.c b/src/battle_main.c index 11b86d8438..baa0f82cdd 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4726,7 +4726,6 @@ u32 GetBattlerTotalSpeedStat(u8 battlerId) static s8 GetMovePriority(u8 battlerId) { - s8 priority; u16 move; if (gProtectStructs[battlerId].noValidMoves) @@ -4734,17 +4733,17 @@ static s8 GetMovePriority(u8 battlerId) else move = gBattleMons[battlerId].moves[*(gBattleStruct->chosenMovePositions + battlerId)]; - priority = gBattleMoves[move].priority; + gBattleStruct->movePriorities[battlerId] = gBattleMoves[move].priority; if (GetBattlerAbility(battlerId) == ABILITY_GALE_WINGS && gBattleMoves[move].type == TYPE_FLYING && (B_GALE_WINGS == GEN_6 || BATTLER_MAX_HP(battlerId))) { - priority++; + gBattleStruct->movePriorities[battlerId]++; } else if (GetBattlerAbility(battlerId) == ABILITY_PRANKSTER && gBattleMoves[move].split == SPLIT_STATUS) { - priority++; + gBattleStruct->movePriorities[battlerId]++; } else if (GetBattlerAbility(battlerId) == ABILITY_TRIAGE) { @@ -4762,12 +4761,12 @@ static s8 GetMovePriority(u8 battlerId) case EFFECT_SOFTBOILED: case EFFECT_ABSORB: case EFFECT_ROOST: - priority += 3; + gBattleStruct->movePriorities[battlerId] += 3; break; } } - return priority; + return gBattleStruct->movePriorities[battlerId]; } u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) @@ -4849,7 +4848,6 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) strikesFirst = 0; // battler1's move has greater priority } - return strikesFirst; } diff --git a/src/battle_message.c b/src/battle_message.c index 1027e2e4ed..5a36b42de6 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -650,6 +650,7 @@ static const u8 sText_BurstingFlames[] = _("The bursting flames\nhit {B_SCR_ACTI 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}!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { @@ -1154,6 +1155,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_BestowItemGiving, sText_ThirdTypeAdded, sText_FellForFeint, + sText_PokemonCannotUseMove, }; const u16 gTerrainStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f9847fca47..b2c9860b21 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -940,7 +940,7 @@ bool32 IsBattlerProtected(u8 battlerId, u16 move) else if (gProtectStructs[battlerId].kingsShielded && gBattleMoves[move].power != 0) return TRUE; else if ((gProtectStructs[battlerId].quickGuarded || gProtectStructs[BATTLE_PARTNER(battlerId)].quickGuarded) - && gBattleMoves[move].priority > 0) + && gBattleStruct->movePriorities[battlerId] > 0) return TRUE; else return FALSE; diff --git a/src/battle_util.c b/src/battle_util.c index 3564ca2a29..0d713c9ee6 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2846,6 +2846,17 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gBattlescriptCurrInstr = BattleScript_SoundproofProtected; effect = 1; } + else if ((gLastUsedAbility == ABILITY_DAZZLING + || (IsBattlerAlive(battler ^= BIT_FLANK) && GetBattlerAbility(battler) == ABILITY_DAZZLING) + ) + && gBattleStruct->movePriorities[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) From 3be070f0c395971c687a95392f74de0224645aea Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 1 Dec 2018 11:12:31 +0100 Subject: [PATCH 194/667] Fix string overflowing issue --- include/battle.h | 2 +- src/battle_main.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/battle.h b/include/battle.h index fe725fffab..6eaa6e30f0 100644 --- a/include/battle.h +++ b/include/battle.h @@ -766,7 +766,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]; diff --git a/src/battle_main.c b/src/battle_main.c index baa0f82cdd..36c53d8830 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -187,7 +187,7 @@ 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}; From 6ae949e360a3144f7895e47a4f1b13724a065661 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 1 Dec 2018 11:35:49 +0100 Subject: [PATCH 195/667] Psychic Terrain blocks priority moves --- data/battle_scripts_1.s | 5 +++++ include/battle_scripts.h | 1 + include/battle_util.h | 1 + src/battle_script_commands.c | 2 ++ src/battle_util.c | 34 ++++++++++++++++++++++++++++++++++ 5 files changed, 43 insertions(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 8f5177043e..d8aedafedf 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5984,6 +5984,11 @@ BattleScript_DazzlingProtected:: printstring STRINGID_POKEMONCANNOTUSEMOVE waitmessage 0x40 goto BattleScript_MoveEnd + +BattleScript_MoveUsedPsychicTerrainPrevents:: + printstring STRINGID_POKEMONCANNOTUSEMOVE + waitmessage 0x40 + goto BattleScript_MoveEnd BattleScript_AbilityNoSpecificStatLoss:: pause 0x20 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index dd0334fce7..4855d52b1d 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -285,5 +285,6 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/battle_util.h b/include/battle_util.h index ede49e10dd..ad166571e1 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -64,6 +64,7 @@ bool8 HandleWishPerishSongOnTurnEnd(void); bool8 HandleFaintedMonActions(void); void TryClearRageAndFuryCutter(void); u8 AtkCanceller_UnableToUseMove(void); +u8 AtkCanceller_UnableToUseMove2(void); bool8 HasNoMonsToSwitch(u8 battlerId, u8 r1, u8 r2); u8 CastformDataTypeChange(u8 battlerId); bool32 TryChangeBattleWeather(u8 battler, u32 weatherEnumId, bool32 viaAbility); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 5e57de5748..f6d00e62dd 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -979,6 +979,8 @@ static void atk00_attackcanceler(void) 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)) diff --git a/src/battle_util.c b/src/battle_util.c index 0d713c9ee6..065e969c19 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1986,6 +1986,8 @@ enum CANCELLER_BIDE, CANCELLER_THAW, CANCELLER_END, + CANCELLER_PSYCHIC_TERRAIN, + CANCELLER_END2, }; u8 AtkCanceller_UnableToUseMove(void) @@ -2288,6 +2290,38 @@ 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(gBattlerAttacker) + && gBattleStruct->movePriorities[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; From 945575f5d659ec6c9e212d37359206757585df41 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 2 Dec 2018 17:58:21 +0100 Subject: [PATCH 196/667] Fix atk canceller --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 065e969c19..b66692d469 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2279,7 +2279,7 @@ u8 AtkCanceller_UnableToUseMove(void) break; } - } while (gBattleStruct->atkCancellerTracker != CANCELLER_END && effect == 0); + } while (gBattleStruct->atkCancellerTracker != CANCELLER_END && gBattleStruct->atkCancellerTracker != CANCELLER_END2 && effect == 0); if (effect == 2) { From d46c3ebe5b49e6eb2bc3de16d32a5d441bd6d609 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 2 Dec 2018 18:47:39 +0100 Subject: [PATCH 197/667] Fix Future Sight --- data/battle_scripts_1.s | 10 +++++++--- include/battle.h | 1 - src/battle_util.c | 11 ++++------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index d8aedafedf..77b4adb6c3 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5121,7 +5121,10 @@ BattleScript_MonTookFutureAttack:: BattleScript_CheckDoomDesireMiss:: accuracycheck BattleScript_FutureAttackMiss, MOVE_DOOM_DESIRE BattleScript_FutureAttackAnimate:: + 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 @@ -5133,6 +5136,9 @@ BattleScript_DoFutureAttackHit:: waitstate healthbarupdate BS_TARGET datahpupdate BS_TARGET + critmessage + waitmessage 0x40 +BattleScript_DoFutureAttackResult: resultmessage waitmessage 0x40 tryfaintmon BS_TARGET, FALSE, NULL @@ -5144,11 +5150,9 @@ BattleScript_FutureAttackEnd:: moveend 0x2, 0xE sethword gMoveResultFlags, 0 end2 - BattleScript_FutureAttackMiss:: pause 0x20 - sethword gMoveResultFlags, 0 - orhalfword gMoveResultFlags, MOVE_RESULT_FAILED + sethword gMoveResultFlags, MOVE_RESULT_FAILED resultmessage waitmessage 0x40 sethword gMoveResultFlags, 0 diff --git a/include/battle.h b/include/battle.h index 6eaa6e30f0..c7aa1132dc 100644 --- a/include/battle.h +++ b/include/battle.h @@ -273,7 +273,6 @@ 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]; diff --git a/src/battle_util.c b/src/battle_util.c index b66692d469..b4ed7458c7 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1800,8 +1800,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 @@ -1812,12 +1813,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) From 52d1e69591163670dbee25d151b5dc64200b5940 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 2 Dec 2018 23:50:51 +0100 Subject: [PATCH 198/667] Add AI support for newly added moves --- asm/macros/battle_ai_script.inc | 13 +++++ data/battle_ai_scripts.s | 81 ++++++++++++++++++++++++++++++++ include/battle_script_commands.h | 1 + src/battle_ai_script_commands.c | 25 ++++++++++ 4 files changed, 120 insertions(+) diff --git a/asm/macros/battle_ai_script.inc b/asm/macros/battle_ai_script.inc index f3e2436196..4d0cd23af9 100644 --- a/asm/macros/battle_ai_script.inc +++ b/asm/macros/battle_ai_script.inc @@ -581,6 +581,19 @@ .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 + @ useful script macros .macro if_holds_no_item battler, ptr:req if_holds_item \battler, 0, \ptr diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index b1b9f795fb..c58b87a4ef 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -234,8 +234,89 @@ AI_CheckBadMove_CheckEffect: @ 82DC045 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_AUTONOMIZE, 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 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 diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index 92593e4a6d..4c3841d1f0 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -13,6 +13,7 @@ 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 CanUseLastResort(u8 battlerId); extern void (* const gBattleScriptingCommandsTable[])(void); extern const u8 gUnknown_0831C494[][4]; diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index db63a5c68e..75cc8ccf2b 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -156,6 +156,8 @@ static void BattleAICmd_get_ally_chosen_move(void); static void BattleAICmd_if_has_no_attacking_moves(void); static void BattleAICmd_get_hazards_count(void); static void BattleAICmd_if_doesnt_hold_berry(void); +static void BattleAICmd_if_share_type(void); +static void BattleAICmd_if_cant_use_last_resort(void); // ewram EWRAM_DATA const u8 *gAIScriptPtr = NULL; @@ -269,6 +271,8 @@ static const BattleAICmdFunc sBattleAICmdTable[] = BattleAICmd_if_has_no_attacking_moves, // 0x64 BattleAICmd_get_hazards_count, // 0x65 BattleAICmd_if_doesnt_hold_berry, // 0x66 + BattleAICmd_if_share_type, // 0x67 + BattleAICmd_if_cant_use_last_resort, // 0x68 }; static const u16 sDiscouragedPowerfulMoveEffects[] = @@ -2526,3 +2530,24 @@ static void BattleAICmd_if_doesnt_hold_berry(void) else gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); } + +static void BattleAICmd_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 BattleAICmd_if_cant_use_last_resort(void) +{ + u8 battler = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + + if (CanUseLastResort(battler)) + gAIScriptPtr += 6; + else + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); +} From b9e711bbf47dafb929fa8013ecbb428b0edca5b4 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 3 Dec 2018 12:50:32 +0100 Subject: [PATCH 199/667] Add Powder --- asm/macros/battle_script.inc | 4 +++ data/battle_anim_scripts.s | 4 +++ data/battle_scripts_1.s | 33 ++++++++++++++++++++++ include/battle.h | 1 + include/battle_scripts.h | 1 + include/constants/battle.h | 1 + include/constants/battle_move_effects.h | 1 + include/constants/battle_script_commands.h | 1 + include/constants/battle_string_ids.h | 2 ++ src/battle_message.c | 4 +++ src/battle_script_commands.c | 3 ++ src/battle_util.c | 23 +++++++++++++-- src/data/battle_moves.h | 2 +- 13 files changed, 77 insertions(+), 3 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 5c263b11db..ba5a371d9a 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1580,6 +1580,10 @@ various \battler, VARIOUS_ACUPRESSURE .4byte \ptr .endm + + .macro setpowder battler:req + various \battler, VARIOUS_SET_POWDER + .endm @ helpful macros .macro setstatchanger stat:req, stages:req, down:req diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index a3e1cc89ef..491277060b 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -650,6 +650,7 @@ gBattleAnims_StatusConditions:: .4byte Status_Freeze .4byte Status_Curse .4byte Status_Nightmare + .4byte Status_Powder .align 2 gBattleAnims_General:: @@ -11929,6 +11930,9 @@ Status_Nightmare: waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end + +Status_Powder: + end General_CastformChange: createvisualtask sub_815BB18, 2 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 77b4adb6c3..ac9cd6cb05 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -339,6 +339,20 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectSparklingAria .4byte BattleScript_EffectAcupressure .4byte BattleScript_EffectAromaticMist + .4byte BattleScript_EffectPowder + +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 @@ -5522,6 +5536,25 @@ BattleScript_DoSelfConfusionDmg:: goto BattleScript_MoveEnd 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 diff --git a/include/battle.h b/include/battle.h index c7aa1132dc..7d84043dff 100644 --- a/include/battle.h +++ b/include/battle.h @@ -203,6 +203,7 @@ struct ProtectStruct u32 usesBouncedMove:1; u32 usedHealBlockedMove:1; u32 usedGravityPreventedMove:1; + u32 powderSelfDmg:1; u32 physicalDmg; u32 specialDmg; u8 physicalBattlerId; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 4855d52b1d..3961a44bbc 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -286,5 +286,6 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle.h b/include/constants/battle.h index 99eb49053c..b801f90a1b 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -116,6 +116,7 @@ #define STATUS2_LOCK_CONFUSE 0x00000C00 #define STATUS2_MULTIPLETURNS 0x00001000 #define STATUS2_WRAPPED 0x00002000 +#define STATUS2_POWDER 0x00004000 #define STATUS2_INFATUATION 0x000F0000 // 4 bits, one for every battler #define STATUS2_INFATUATED_WITH(battler) (gBitTable[battler] << 16) #define STATUS2_FOCUS_ENERGY 0x00100000 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 6407d93a12..31ffec84ea 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -327,5 +327,6 @@ #define EFFECT_SPARKLING_ARIA 321 #define EFFECT_ACUPRESSURE 322 #define EFFECT_AROMATIC_MIST 323 +#define EFFECT_POWDER 324 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 9c345f91c6..da1c073e4b 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -133,6 +133,7 @@ #define VARIOUS_SET_AURORA_VEIL 71 #define VARIOUS_TRY_THIRD_TYPE 72 #define VARIOUS_ACUPRESSURE 73 +#define VARIOUS_SET_POWDER 74 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 6089b6aa73..77f4e86a80 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -514,6 +514,8 @@ #define STRINGID_THIRDTYPEADDED 510 #define STRINGID_FELLFORFEINT 511 #define STRINGID_POKEMONCANNOTUSEMOVE 512 +#define STRINGID_COVEREDINPOWDER 513 +#define STRINGID_POWDEREXPLODES 514 #define BATTLESTRINGS_COUNT 525 diff --git a/src/battle_message.c b/src/battle_message.c index 5a36b42de6..4cdb4b2e25 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -651,6 +651,8 @@ static const u8 sText_BestowItemGiving[] = _("{B_DEF_NAME_WITH_PREFIX} received 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!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { @@ -1156,6 +1158,8 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = sText_ThirdTypeAdded, sText_FellForFeint, sText_PokemonCannotUseMove, + sText_CoveredInPowder, + sText_PowderExplodes, }; const u16 gTerrainStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f6d00e62dd..e003adaf79 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6338,6 +6338,9 @@ static void atk76_various(void) switch (gBattlescriptCurrInstr[2]) { + case VARIOUS_SET_POWDER: + gBattleMons[gActiveBattler].status2 |= STATUS2_POWDER; + break; case VARIOUS_ACUPRESSURE: bits = 0; for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) diff --git a/src/battle_util.c b/src/battle_util.c index b4ed7458c7..83b0f0cb76 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -483,7 +483,8 @@ bool8 WasUnableToUseMove(u8 battler) || gProtectStructs[battler].usedHealBlockedMove || gProtectStructs[battler].flag2Unknown || gProtectStructs[battler].flinchImmobility - || gProtectStructs[battler].confusionSelfDmg) + || gProtectStructs[battler].confusionSelfDmg + || gProtectStructs[battler].powderSelfDmg) return TRUE; else return FALSE; @@ -1306,6 +1307,7 @@ enum ENDTURN_ITEMS2, ENDTURN_ROOST, ENDTURN_ELECTRIFY, + ENDTURN_POWDER, ENDTURN_BATTLER_COUNT }; @@ -1756,7 +1758,9 @@ u8 DoBattlerEndTurnEffects(void) case ENDTURN_ELECTRIFY: gStatuses3[gActiveBattler] &= ~(STATUS3_ELECTRIFIED); gBattleStruct->turnEffectsTracker++; - break; + case ENDTURN_POWDER: + gBattleMons[gActiveBattler].status2 &= ~(STATUS2_POWDER); + gBattleStruct->turnEffectsTracker++; case ENDTURN_BATTLER_COUNT: // done gBattleStruct->turnEffectsTracker = 0; gBattleStruct->turnEffectsBattlerId++; @@ -1982,6 +1986,7 @@ enum CANCELLER_IN_LOVE, CANCELLER_BIDE, CANCELLER_THAW, + CANCELLER_POWDER, CANCELLER_END, CANCELLER_PSYCHIC_TERRAIN, CANCELLER_END2, @@ -2272,6 +2277,20 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; + case CANCELLER_POWDER: + 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; + } + } + gBattleStruct->atkCancellerTracker++; + break; case CANCELLER_END: break; } diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index d6535d82a3..daa8f6a2bc 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -7218,7 +7218,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_STATUS, }, { // MOVE_POWDER - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_POWDER, .power = 0, .type = TYPE_BUG, .accuracy = 100, From 35d0ea5ff5ac72751a6c01fe8b451c08cd9ec98d Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 8 Dec 2018 00:09:39 +0100 Subject: [PATCH 200/667] Fix moves hitting all 3 pokemon --- src/battle_main.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/battle_main.c b/src/battle_main.c index 4ceae5fae3..585713b503 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5605,6 +5605,16 @@ static 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 (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) + break; + } + } else { gBattlerTarget = *(gBattleStruct->moveTarget + gBattlerAttacker); @@ -5666,6 +5676,17 @@ static void HandleAction_UseMove(void) 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 (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) + break; + } + } else { gBattlerTarget = *(gBattleStruct->moveTarget + gBattlerAttacker); From 43d620f13a3c594dce0e33f526068080aaa45e19 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 8 Dec 2018 00:13:06 +0100 Subject: [PATCH 201/667] Surf hits 3 opponent --- src/data/battle_moves.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 53d5016b8d..33eb60d089 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -806,7 +806,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .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 | FLAG_DMG_UNDERWATER, .split = SPLIT_SPECIAL, From d52fe8ac581b058a25b12ff7a685fc1c6ef306c3 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 8 Dec 2018 00:14:35 +0100 Subject: [PATCH 202/667] Flash Cannon effect --- src/data/battle_moves.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 33eb60d089..a6e8061d8f 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -6030,7 +6030,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_FLASH_CANNON] = { - .effect = EFFECT_SPECIAL_DEFENSE_DOWN, + .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, .power = 80, .type = TYPE_STEEL, .accuracy = 100, From b60915539d2d4f19c8f65c0732971c62628d17c6 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 8 Dec 2018 16:19:50 +0100 Subject: [PATCH 203/667] Fix Phantom Force --- data/battle_anim_scripts.s | 8 ++++++++ data/battle_scripts_1.s | 11 ++++++----- include/battle.h | 1 + include/constants/battle.h | 4 ++-- src/battle_debug.c | 8 +++----- src/battle_main.c | 2 +- src/battle_message.c | 4 ++-- src/battle_script_commands.c | 36 +++++++++++++++++------------------- src/data/battle_moves.h | 4 +++- 9 files changed, 43 insertions(+), 35 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 491277060b..cc73938d85 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1893,7 +1893,15 @@ Move_FELL_STINGER: 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 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index ac9cd6cb05..a05302cc83 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3495,17 +3495,19 @@ BattleScript_EffectSemiInvulnerable:: jumpifmove MOVE_FLY, BattleScript_FirstTurnFly jumpifmove MOVE_DIVE, BattleScript_FirstTurnDive jumpifmove MOVE_BOUNCE, BattleScript_FirstTurnBounce + jumpifmove MOVE_PHANTOM_FORCE, BattleScript_FirstTurnPhantomForce + jumpifmove MOVE_SHADOW_FORCE, BattleScript_FirstTurnPhantomForce setbyte sTWOTURN_STRINGID, 0x5 goto BattleScript_FirstTurnSemiInvulnerable - BattleScript_FirstTurnBounce:: setbyte sTWOTURN_STRINGID, 0x7 goto BattleScript_FirstTurnSemiInvulnerable - BattleScript_FirstTurnDive:: setbyte sTWOTURN_STRINGID, 0x6 goto BattleScript_FirstTurnSemiInvulnerable - +BattleScript_FirstTurnPhantomForce: + setbyte sTWOTURN_STRINGID, 0x8 + goto BattleScript_FirstTurnSemiInvulnerable BattleScript_FirstTurnFly:: setbyte sTWOTURN_STRINGID, 0x4 BattleScript_FirstTurnSemiInvulnerable:: @@ -3519,8 +3521,7 @@ BattleScript_SecondTurnSemiInvulnerable:: 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 diff --git a/include/battle.h b/include/battle.h index 7d84043dff..4c4af3d198 100644 --- a/include/battle.h +++ b/include/battle.h @@ -129,6 +129,7 @@ struct UnknownFlags #define RESOURCE_FLAG_FLASH_FIRE 0x1 #define RESOURCE_FLAG_ROOST 0x2 +#define RESOURCE_FLAG_UNBURDEN 0x4 struct DisableStruct { diff --git a/include/constants/battle.h b/include/constants/battle.h index b801f90a1b..22f7be7c61 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -154,7 +154,7 @@ #define STATUS3_SMACKED_DOWN 0x200000 #define STATUS3_ME_FIRST 0x400000 #define STATUS3_TELEKINESIS 0x800000 -#define STATUS3_UNBURDEN 0x1000000 +#define STATUS3_PHANTOM_FORCE 0x1000000 #define STATUS3_MIRACLE_EYED 0x2000000 #define STATUS3_MAGNET_RISE 0x4000000 #define STATUS3_HEAL_BLOCK 0x8000000 @@ -162,7 +162,7 @@ #define STATUS3_LASER_FOCUS 0x20000000 #define STATUS3_ELECTRIFIED 0x40000000 #define STATUS3_POWER_TRICK 0x80000000 -#define STATUS3_SEMI_INVULNERABLE (STATUS3_UNDERGROUND | STATUS3_ON_AIR | STATUS3_UNDERWATER) +#define STATUS3_SEMI_INVULNERABLE (STATUS3_UNDERGROUND | STATUS3_ON_AIR | STATUS3_UNDERWATER | STATUS3_PHANTOM_FORCE) // Not really sure what a "hitmarker" is. #define HITMARKER_x10 0x00000010 diff --git a/src/battle_debug.c b/src/battle_debug.c index d7e5cd393c..d1c2568023 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -182,7 +182,6 @@ 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_Unburden[] = _("Unburden"); static const u8 sText_MiracleEye[] = _("Miracle Eye"); static const u8 sText_AquaRing[] = _("Aqua Ring"); static const u8 sText_AuroraVeil[] = _("Aurora Veil"); @@ -265,7 +264,7 @@ static const struct BitfieldInfo sStatus3Bitfield[] = {/*Smacked Down*/ 1, 21}, // Me First 1, 22, // Telekinesis 1, 23, - {/*Unburden*/ 1, 24}, + // Phantom Force 1, 24}, {/*Miracle Eyed*/ 1, 25}, // Magnet Rise 1, 26, // Heal Block 1, 27, @@ -379,9 +378,8 @@ static const struct ListMenuItem sStatus3ListItems[] = {sText_NoCrit, 6}, {sText_GastroAcid, 7}, {sText_SmackDown, 8}, - {sText_Unburden, 9}, - {sText_MiracleEye, 10}, - {sText_AquaRing, 11}, + {sText_MiracleEye, 9}, + {sText_AquaRing, 10}, }; static const struct ListMenuItem sSideStatusListItems[] = diff --git a/src/battle_main.c b/src/battle_main.c index 585713b503..96280c24b1 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4714,7 +4714,7 @@ u32 GetBattlerTotalSpeedStat(u8 battlerId) // various effects if (gSideStatuses[GET_BATTLER_SIDE(battlerId)] & SIDE_STATUS_TAILWIND) speed *= 2; - if (gStatuses3[battlerId] & STATUS3_UNBURDEN) + if (gBattleResources->flags->flags[battlerId] & RESOURCE_FLAG_UNBURDEN) speed *= 2; // paralysis drop diff --git a/src/battle_message.c b/src/battle_message.c index 42cc6aef16..b29583c934 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -550,7 +550,7 @@ static const u8 sText_PkmnTwistedDimensions[] = _("{B_ATK_NAME_WITH_PREFIX} twis static const u8 sText_PointedStonesFloat[] =_("Pointed stones float in the air\naround your foe's 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_VanishedInstantly[] =_("{B_ATK_NAME_WITH_PREFIX} vanished\ninstantly!"); static const u8 sText_ProtectedTeam[] =_("{B_CURRENT_MOVE} protected\nyour 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!"); @@ -1287,7 +1287,7 @@ const u16 gStatDownStringIds[] = const u16 gFirstTurnOfTwoStringIds[] = { STRINGID_PKMNWHIPPEDWHIRLWIND, STRINGID_PKMNTOOKSUNLIGHT, STRINGID_PKMNLOWEREDHEAD, STRINGID_PKMNISGLOWING, - STRINGID_PKMNFLEWHIGH, STRINGID_PKMNDUGHOLE, STRINGID_PKMNHIDUNDERWATER, STRINGID_PKMNSPRANGUP + STRINGID_PKMNFLEWHIGH, STRINGID_PKMNDUGHOLE, STRINGID_PKMNHIDUNDERWATER, STRINGID_PKMNSPRANGUP, STRINGID_VANISHEDINSTANTLY }; const u16 gWrappedStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e003adaf79..145ea24a34 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1158,7 +1158,6 @@ static bool32 AccuracyCalcHelper(u16 move) JumpIfMoveFailed(7, move); return TRUE; } - gHitMarker &= ~HITMARKER_IGNORE_ON_AIR; if (!(gHitMarker & HITMARKER_IGNORE_UNDERGROUND) && gStatuses3[gBattlerTarget] & STATUS3_UNDERGROUND) @@ -1167,7 +1166,6 @@ static bool32 AccuracyCalcHelper(u16 move) JumpIfMoveFailed(7, move); return TRUE; } - gHitMarker &= ~HITMARKER_IGNORE_UNDERGROUND; if (!(gHitMarker & HITMARKER_IGNORE_UNDERWATER) && gStatuses3[gBattlerTarget] & STATUS3_UNDERWATER) @@ -1176,9 +1174,15 @@ static bool32 AccuracyCalcHelper(u16 move) JumpIfMoveFailed(7, move); return TRUE; } - gHitMarker &= ~HITMARKER_IGNORE_UNDERWATER; + if (gStatuses3[gBattlerTarget] & STATUS3_PHANTOM_FORCE) + { + gMoveResultFlags |= MOVE_RESULT_MISSED; + JumpIfMoveFailed(7, move); + return TRUE; + } + if ((WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_RAIN_ANY) && (gBattleMoves[move].effect == EFFECT_THUNDER || gBattleMoves[move].effect == EFFECT_HURRICANE)) || (gBattleMoves[move].effect == EFFECT_VITAL_THROW) || (gBattleMoves[move].accuracy == 0)) @@ -2767,8 +2771,11 @@ void SetMoveEffect(bool8 primary, u8 certain) gProtectStructs[gBattlerTarget].spikyShielded = 0; gProtectStructs[gBattlerTarget].kingsShielded = 0; gProtectStructs[gBattlerTarget].banefulBunkered = 0; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectFeint; + if (gCurrentMove == MOVE_FEINT) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectFeint; + } } break; } @@ -9728,6 +9735,10 @@ static void atkC5_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++; @@ -9735,20 +9746,7 @@ static void atkC5_setsemiinvulnerablebit(void) static void atkC6_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++; } diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index a6e8061d8f..9c6ded27c2 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -4774,6 +4774,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, .split = SPLIT_PHYSICAL, + .argument = MOVE_EFFECT_PARALYSIS, }, [MOVE_MUD_SHOT] = @@ -7942,11 +7943,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .type = TYPE_GHOST, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, + .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] = From a00eb2f5d8cadc63f56831d3be58d8662719138a Mon Sep 17 00:00:00 2001 From: ultima-soul Date: Thu, 13 Dec 2018 09:31:47 -0800 Subject: [PATCH 204/667] Added new battle items. --- include/constants/hold_effects.h | 17 +- include/constants/items.h | 120 +- src/data/items.h | 1872 ++++++++++++++++++++++++++++++ 3 files changed, 1997 insertions(+), 12 deletions(-) diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index 1845c77f9e..e13280f454 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -85,7 +85,7 @@ #define HOLD_EFFECT_METRONOME 79 #define HOLD_EFFECT_MUSCLE_BAND 80 #define HOLD_EFFECT_WIDE_LENS 81 -#define HOLD_EFFECT_WIDE_GLASSES 82 +#define HOLD_EFFECT_WISE_GLASSES 82 #define HOLD_EFFECT_ZOOM_LENS 83 #define HOLD_EFFECT_LAGGING_TAIL 84 #define HOLD_EFFECT_FOCUS_SASH 85 @@ -103,18 +103,17 @@ // Gen5 hold effects #define HOLD_EFFECT_FLOAT_STONE 115 -#define HOLD_EFFECT_WISE_GLASSES 116 -#define HOLD_EFFECT_EVIOLITE 117 -#define HOLD_EFFECT_ASSAULT_VEST 118 -#define HOLD_EFFECT_BINDING_BAND 119 -#define HOLD_EFFECT_DRIVE 120 +#define HOLD_EFFECT_EVIOLITE 116 +#define HOLD_EFFECT_ASSAULT_VEST 117 +#define HOLD_EFFECT_BINDING_BAND 118 +#define HOLD_EFFECT_DRIVE 119 // Gen6 hold effects -#define HOLD_EFFECT_FAIRY_POWER 130 -#define HOLD_EFFECT_MEGA_STONE 131 +#define HOLD_EFFECT_FAIRY_POWER 129 +#define HOLD_EFFECT_MEGA_STONE 130 // Gen7 hold effects -#define HOLD_EFFECT_PROTECTIVE_PADS 150 +#define HOLD_EFFECT_PROTECTIVE_PADS 149 #define HOLD_EFFECT_CHOICE(holdEffect)((holdEffect == HOLD_EFFECT_CHOICE_BAND || holdEffect == HOLD_EFFECT_CHOICE_SCARF || holdEffect == HOLD_EFFECT_CHOICE_SPECS)) diff --git a/include/constants/items.h b/include/constants/items.h index 2121220a2b..212aef6e53 100644 --- a/include/constants/items.h +++ b/include/constants/items.h @@ -462,7 +462,121 @@ #define ITEM_MAGMA_EMBLEM 375 #define ITEM_OLD_SEA_MAP 376 -#define ITEMS_COUNT 377 +// Gen 4 Items +#define ITEM_WIDE_LENS 377 +#define ITEM_MUSCLE_BAND 378 +#define ITEM_WISE_GLASSES 379 +#define ITEM_EXPERT_BELT 380 +#define ITEM_LIGHT_CLAY 381 +#define ITEM_LIFE_ORB 382 +#define ITEM_POWER_HERB 383 +#define ITEM_TOXIC_ORB 384 +#define ITEM_FLAME_ORB 385 +#define ITEM_QUICK_POWDER 386 +#define ITEM_FOCUS_SASH 387 +#define ITEM_ZOOM_LENS 388 +#define ITEM_METRONOME 389 +#define ITEM_IRON_BALL 390 +#define ITEM_LAGGING_TAIL 391 +#define ITEM_DESTINY_KNOT 392 +#define ITEM_BLACK_SLUDGE 393 +#define ITEM_ICY_ROCK 394 +#define ITEM_SMOOTH_ROCK 395 +#define ITEM_HEAT_ROCK 396 +#define ITEM_DAMP_ROCK 397 +#define ITEM_GRIP_CLAW 398 +#define ITEM_CHOICE_SCARF 399 +#define ITEM_STICKY_BARB 400 +#define ITEM_SHED_SHELL 401 +#define ITEM_BIG_ROOT 402 +#define ITEM_CHOICE_SPECS 403 +#define ITEM_ADAMANT_ORB 404 +#define ITEM_LUSTROUS_ORB 405 +#define ITEM_GRISEOUS_ORB 406 +#define ITEM_FLAME_PLATE 407 +#define ITEM_SPLASH_PLATE 408 +#define ITEM_ZAP_PLATE 409 +#define ITEM_MEADOW_PLATE 410 +#define ITEM_ICICLE_PLATE 411 +#define ITEM_FIST_PLATE 412 +#define ITEM_TOXIC_PLATE 413 +#define ITEM_EARTH_PLATE 414 +#define ITEM_SKY_PLATE 415 +#define ITEM_MIND_PLATE 416 +#define ITEM_INSECT_PLATE 417 +#define ITEM_STONE_PLATE 418 +#define ITEM_SPOOKY_PLATE 419 +#define ITEM_DRACO_PLATE 420 +#define ITEM_DREAD_PLATE 421 +#define ITEM_IRON_PLATE 422 + + +// Gen 5 Items +#define ITEM_EVIOLITE 423 +#define ITEM_FLOAT_STONE 424 +#define ITEM_BINDING_BAND 425 +#define ITEM_DOUSE_DRIVE 426 +#define ITEM_SHOCK_DRIVE 427 +#define ITEM_BURN_DRIVE 428 +#define ITEM_CHILL_DRIVE 429 + + +// Gen6 Items +#define ITEM_ASSAULT_VEST 430 +#define ITEM_PIXIE_PLATE 431 +#define ITEM_GENGARITE 432 +#define ITEM_GARDEVOIRITE 433 +#define ITEM_AMPHAROSITE 434 +#define ITEM_VENUSAURITE 435 +#define ITEM_CHARIZARDITE_X 436 +#define ITEM_BLASTOISINITE 437 +#define ITEM_MEWTWONITE_X 438 +#define ITEM_MEWTWONITE_Y 439 +#define ITEM_BLAZIKENITE 440 +#define ITEM_MEDICHAMITE 441 +#define ITEM_HOUNDOOMINITE 442 +#define ITEM_AGGRONITE 443 +#define ITEM_BANETTITE 444 +#define ITEM_TYRANITARITE 445 +#define ITEM_SCIZORITE 446 +#define ITEM_PINSIRITE 447 +#define ITEM_AERODACTYLITE 448 +#define ITEM_LUCARIONITE 449 +#define ITEM_ABOMASITE 450 +#define ITEM_KANGASKHANITE 451 +#define ITEM_GYARADOSITE 452 +#define ITEM_ABSOLITE 453 +#define ITEM_CHARIZARDITE_Y 454 +#define ITEM_ALAKAZITE 455 +#define ITEM_HERACRONITE 456 +#define ITEM_MAWILITE 457 +#define ITEM_MANECTITE 458 +#define ITEM_GARCHOMPITE 459 +#define ITEM_LATIASITE 460 +#define ITEM_LATIOSITE 461 +#define ITEM_SWAMPERTITE 462 +#define ITEM_SCEPTILITE 463 +#define ITEM_SABLENITE 464 +#define ITEM_ALTARIANITE 465 +#define ITEM_GALLADITE 466 +#define ITEM_AUDINITE 467 +#define ITEM_METAGROSSITE 468 +#define ITEM_SHARPEDONITE 469 +#define ITEM_SLOWBRONITE 470 +#define ITEM_STEELIXITE 471 +#define ITEM_PIDGEOTITE 472 +#define ITEM_GLALITITE 473 +#define ITEM_DIANCITE 474 +#define ITEM_CAMERUPTITE 475 +#define ITEM_LOPPUNITE 476 +#define ITEM_SALAMENCITE 477 +#define ITEM_BEEDRILLITE 478 +#define ITEM_KEY_STONE 479 + +// Gen7 hold effects +#define ITEM_PROTECTIVE_PADS 480 + +#define ITEMS_COUNT 481 #define ITEM_FIELD_ARROW ITEMS_COUNT #define FIRST_BERRY_INDEX ITEM_CHERI_BERRY @@ -470,9 +584,9 @@ #define ITEM_TO_BERRY(itemId)(((itemId - FIRST_BERRY_INDEX) + 1)) #define NUM_TECHNICAL_MACHINES 50 -#define NUM_HIDDEN_MACHINES 8 +#define NUM_HIDDEN_MACHINES 8 // Check if the item is one that can be used on a Pokemon. #define IS_POKEMON_ITEM(item) ((item) >= ITEM_POTION && (item) <= ITEM_0B2) -#endif // GUARD_CONSTANTS_ITEMS_H +#endif // GUARD_CONSTANTS_ITEMS_H diff --git a/src/data/items.h b/src/data/items.h index aef42c4cbc..637757fa89 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -6814,4 +6814,1876 @@ const struct Item gItems[] = .battleUseFunc = NULL, .secondaryId = 0, }, + + [ITEM_WIDE_LENS] = + { + .name = _("WIDE LENS"), + .itemId = ITEM_WIDE_LENS, + .price = 200, + .holdEffect = HOLD_EFFECT_WIDE_LENS, + .holdEffectParam = 10, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_MUSCLE_BAND] = + { + .name = _("MUSCLE BAND"), + .itemId = ITEM_MUSCLE_BAND, + .price = 200, + .holdEffect = HOLD_EFFECT_MUSCLE_BAND, + .holdEffectParam = 10, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_WISE_GLASSES] = + { + .name = _("WISE GLASSES"), + .itemId = ITEM_WISE_GLASSES, + .price = 200, + .holdEffect = HOLD_EFFECT_WISE_GLASSES, + .holdEffectParam = 10, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_EXPERT_BELT] = + { + .name = _("EXPERT BELT"), + .itemId = ITEM_EXPERT_BELT, + .price = 200, + .holdEffect = HOLD_EFFECT_EXPERT_BELT, + .holdEffectParam = 20, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_LIGHT_CLAY] = + { + .name = _("LIGHT CLAY"), + .itemId = ITEM_LIGHT_CLAY, + .price = 200, + .holdEffect = HOLD_EFFECT_LIGHT_CLAY, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_LIFE_ORB] = + { + .name = _("LIFE ORB"), + .itemId = ITEM_LIFE_ORB, + .price = 200, + .holdEffect = HOLD_EFFECT_LIFE_ORB, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_POWER_HERB] = + { + .name = _("POWER HERB"), + .itemId = ITEM_POWER_HERB, + .price = 200, + .holdEffect = HOLD_EFFECT_POWER_HERB, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_TOXIC_ORB] = + { + .name = _("TOXIC ORB"), + .itemId = ITEM_TOXIC_ORB, + .price = 200, + .holdEffect = HOLD_EFFECT_TOXIC_ORB, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_FLAME_ORB] = + { + .name = _("FLAME ORB"), + .itemId = ITEM_FLAME_ORB, + .price = 200, + .holdEffect = HOLD_EFFECT_FLAME_ORB, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_QUICK_POWDER] = + { + .name = _("QUICK POWDER"), + .itemId = ITEM_QUICK_POWDER, + .price = 200, + .holdEffect = HOLD_EFFECT_QUICK_POWDER, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_FOCUS_SASH] = + { + .name = _("FOCUS SASH"), + .itemId = ITEM_FOCUS_SASH, + .price = 200, + .holdEffect = HOLD_EFFECT_FOCUS_SASH, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_ZOOM_LENS] = + { + .name = _("ZOOM LENS"), + .itemId = ITEM_ZOOM_LENS, + .price = 200, + .holdEffect = HOLD_EFFECT_ZOOM_LENS, + .holdEffectParam = 20, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_METRONOME] = + { + .name = _("METRONOME"), + .itemId = ITEM_METRONOME, + .price = 200, + .holdEffect = HOLD_EFFECT_METRONOME, + .holdEffectParam = 20, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_IRON_BALL] = + { + .name = _("IRON BALL"), + .itemId = ITEM_IRON_BALL, + .price = 200, + .holdEffect = HOLD_EFFECT_IRON_BALL, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_LAGGING_TAIL] = + { + .name = _("LAGGING TAIL"), + .itemId = ITEM_LAGGING_TAIL, + .price = 200, + .holdEffect = HOLD_EFFECT_LAGGING_TAIL, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_DESTINY_KNOT] = + { + .name = _("DESTINY KNOT"), + .itemId = ITEM_DESTINY_KNOT, + .price = 200, + .holdEffect = HOLD_EFFECT_DESTINY_KNOT, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_BLACK_SLUDGE] = + { + .name = _("BLACK SLUDGE"), + .itemId = ITEM_BLACK_SLUDGE, + .price = 200, + .holdEffect = HOLD_EFFECT_BLACK_SLUDGE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_ICY_ROCK] = + { + .name = _("ICY ROCK"), + .itemId = ITEM_ICY_ROCK, + .price = 200, + .holdEffect = HOLD_EFFECT_ICY_ROCK, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_SMOOTH_ROCK] = + { + .name = _("SMOOTH ROCK"), + .itemId = ITEM_SMOOTH_ROCK, + .price = 200, + .holdEffect = HOLD_EFFECT_SMOOTH_ROCK, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_HEAT_ROCK] = + { + .name = _("HEAT ROCK"), + .itemId = ITEM_HEAT_ROCK, + .price = 200, + .holdEffect = HOLD_EFFECT_HEAT_ROCK, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_DAMP_ROCK] = + { + .name = _("DAMP ROCK"), + .itemId = ITEM_DAMP_ROCK, + .price = 200, + .holdEffect = HOLD_EFFECT_DAMP_ROCK, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_GRIP_CLAW] = + { + .name = _("GRIP CLAW"), + .itemId = ITEM_GRIP_CLAW, + .price = 200, + .holdEffect = HOLD_EFFECT_GRIP_CLAW, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_CHOICE_SCARF] = + { + .name = _("CHOICE SCARF"), + .itemId = ITEM_CHOICE_SCARF, + .price = 200, + .holdEffect = HOLD_EFFECT_CHOICE_SCARF, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_STICKY_BARB] = + { + .name = _("STICKY BARB"), + .itemId = ITEM_STICKY_BARB, + .price = 200, + .holdEffect = HOLD_EFFECT_STICKY_BARB, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_SHED_SHELL] = + { + .name = _("SHED SHELL"), + .itemId = ITEM_SHED_SHELL, + .price = 200, + .holdEffect = HOLD_EFFECT_SHED_SHELL, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_BIG_ROOT] = + { + .name = _("BIG ROOT"), + .itemId = ITEM_BIG_ROOT, + .price = 200, + .holdEffect = HOLD_EFFECT_BIG_ROOT, + .holdEffectParam = 30, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_CHOICE_SPECS] = + { + .name = _("CHOICE SPECS"), + .itemId = ITEM_CHOICE_SPECS, + .price = 200, + .holdEffect = HOLD_EFFECT_CHOICE_SPECS, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_ADAMANT_ORB] = + { + .name = _("ADAMANT ORB"), + .itemId = ITEM_ADAMANT_ORB, + .price = 200, + .holdEffect = HOLD_EFFECT_ADAMANT_ORB, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_LUSTROUS_ORB] = + { + .name = _("LUSTROUS ORB"), + .itemId = ITEM_LUSTROUS_ORB, + .price = 200, + .holdEffect = HOLD_EFFECT_LUSTROUS_ORB, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_GRISEOUS_ORB] = + { + .name = _("GRISEOUS ORB"), + .itemId = ITEM_GRISEOUS_ORB, + .price = 200, + .holdEffect = HOLD_EFFECT_GRISEOUS_ORB, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_FLAME_PLATE] = + { + .name = _("FLAME PLATE"), + .itemId = ITEM_FLAME_PLATE, + .price = 200, + .holdEffect = HOLD_EFFECT_FIRE_POWER, + .holdEffectParam = 20, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_SPLASH_PLATE] = + { + .name = _("SPLASH PLATE"), + .itemId = ITEM_SPLASH_PLATE, + .price = 200, + .holdEffect = HOLD_EFFECT_WATER_POWER, + .holdEffectParam = 20, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_ZAP_PLATE] = + { + .name = _("ZAP PLATE"), + .itemId = ITEM_ZAP_PLATE, + .price = 200, + .holdEffect = HOLD_EFFECT_ELECTRIC_POWER, + .holdEffectParam = 20, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_MEADOW_PLATE] = + { + .name = _("MEADOW PLATE"), + .itemId = ITEM_MEADOW_PLATE, + .price = 200, + .holdEffect = HOLD_EFFECT_GRASS_POWER, + .holdEffectParam = 20, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_ICICLE_PLATE] = + { + .name = _("ICICLE PLATE"), + .itemId = ITEM_ICICLE_PLATE, + .price = 200, + .holdEffect = HOLD_EFFECT_ICE_POWER, + .holdEffectParam = 20, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_FIST_PLATE] = + { + .name = _("FIST PLATE"), + .itemId = ITEM_FIST_PLATE, + .price = 200, + .holdEffect = HOLD_EFFECT_FIGHTING_POWER, + .holdEffectParam = 20, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_TOXIC_PLATE] = + { + .name = _("TOXIC PLATE"), + .itemId = ITEM_TOXIC_PLATE, + .price = 200, + .holdEffect = HOLD_EFFECT_POISON_POWER, + .holdEffectParam = 20, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_EARTH_PLATE] = + { + .name = _("EARTH PLATE"), + .itemId = ITEM_EARTH_PLATE, + .price = 200, + .holdEffect = HOLD_EFFECT_GROUND_POWER, + .holdEffectParam = 20, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_SKY_PLATE] = + { + .name = _("SKY PLATE"), + .itemId = ITEM_SKY_PLATE, + .price = 200, + .holdEffect = HOLD_EFFECT_FLYING_POWER, + .holdEffectParam = 20, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_MIND_PLATE] = + { + .name = _("MIND PLATE"), + .itemId = ITEM_MIND_PLATE, + .price = 200, + .holdEffect = HOLD_EFFECT_PSYCHIC_POWER, + .holdEffectParam = 20, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_INSECT_PLATE] = + { + .name = _("INSECT PLATE"), + .itemId = ITEM_INSECT_PLATE, + .price = 200, + .holdEffect = HOLD_EFFECT_BUG_POWER, + .holdEffectParam = 20, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_STONE_PLATE] = + { + .name = _("STONE PLATE"), + .itemId = ITEM_STONE_PLATE, + .price = 200, + .holdEffect = HOLD_EFFECT_ROCK_POWER, + .holdEffectParam = 20, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_SPOOKY_PLATE] = + { + .name = _("SPOOKY PLATE"), + .itemId = ITEM_SPOOKY_PLATE, + .price = 200, + .holdEffect = HOLD_EFFECT_GHOST_POWER, + .holdEffectParam = 20, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_DRACO_PLATE] = + { + .name = _("DRACO PLATE"), + .itemId = ITEM_DRACO_PLATE, + .price = 200, + .holdEffect = HOLD_EFFECT_DRAGON_POWER, + .holdEffectParam = 20, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_DREAD_PLATE] = + { + .name = _("DREAD PLATE"), + .itemId = ITEM_DREAD_PLATE, + .price = 200, + .holdEffect = HOLD_EFFECT_DARK_POWER, + .holdEffectParam = 20, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_IRON_PLATE] = + { + .name = _("IRON PLATE"), + .itemId = ITEM_IRON_PLATE, + .price = 200, + .holdEffect = HOLD_EFFECT_STEEL_POWER, + .holdEffectParam = 20, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_EVIOLITE] = + { + .name = _("EVIOLITE"), + .itemId = ITEM_EVIOLITE, + .price = 200, + .holdEffect = HOLD_EFFECT_EVIOLITE, + .holdEffectParam = 50, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_FLOAT_STONE] = + { + .name = _("FLOAT STONE"), + .itemId = ITEM_FLOAT_STONE, + .price = 200, + .holdEffect = HOLD_EFFECT_FLOAT_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_BINDING_BAND] = + { + .name = _("BINDING BAND"), + .itemId = ITEM_BINDING_BAND, + .price = 200, + .holdEffect = HOLD_EFFECT_BINDING_BAND, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_DOUSE_DRIVE] = + { + .name = _("DOUSE DRIVE"), + .itemId = ITEM_DOUSE_DRIVE, + .price = 200, + .holdEffect = HOLD_EFFECT_DRIVE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_SHOCK_DRIVE] = + { + .name = _("SHOCK DRIVE"), + .itemId = ITEM_SHOCK_DRIVE, + .price = 200, + .holdEffect = HOLD_EFFECT_DRIVE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_BURN_DRIVE] = + { + .name = _("BURN DRIVE"), + .itemId = ITEM_BURN_DRIVE, + .price = 200, + .holdEffect = HOLD_EFFECT_DRIVE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_CHILL_DRIVE] = + { + .name = _("CHILL DRIVE"), + .itemId = ITEM_CHILL_DRIVE, + .price = 200, + .holdEffect = HOLD_EFFECT_DRIVE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_ASSAULT_VEST] = + { + .name = _("ASSAULT VEST"), + .itemId = ITEM_ASSAULT_VEST, + .price = 200, + .holdEffect = HOLD_EFFECT_ASSAULT_VEST, + .holdEffectParam = 50, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_PIXIE_PLATE] = + { + .name = _("PIXIE PLATE"), + .itemId = ITEM_PIXIE_PLATE, + .price = 200, + .holdEffect = HOLD_EFFECT_FAIRY_POWER, + .holdEffectParam = 20, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_GENGARITE] = + { + .name = _("GENGARITE"), + .itemId = ITEM_GENGARITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_GARDEVOIRITE] = + { + .name = _("GARDEVOIRITE"), + .itemId = ITEM_GARDEVOIRITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_AMPHAROSITE] = + { + .name = _("AMPHAROSITE"), + .itemId = ITEM_AMPHAROSITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_VENUSAURITE] = + { + .name = _("VENUSAURITE"), + .itemId = ITEM_VENUSAURITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_CHARIZARDITE_X] = + { + .name = _("CHARIZARDITEX"), + .itemId = ITEM_CHARIZARDITE_X, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_BLASTOISINITE] = + { + .name = _("BLASTOISINITE"), + .itemId = ITEM_BLASTOISINITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_MEWTWONITE_X] = + { + .name = _("MEWTWONITE X"), + .itemId = ITEM_MEWTWONITE_X, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_MEWTWONITE_Y] = + { + .name = _("MEWTWONITE Y"), + .itemId = ITEM_MEWTWONITE_Y, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_BLAZIKENITE] = + { + .name = _("BLAZIKENITE"), + .itemId = ITEM_BLAZIKENITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_MEDICHAMITE] = + { + .name = _("MEDICHAMITE"), + .itemId = ITEM_MEDICHAMITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_HOUNDOOMINITE] = + { + .name = _("HOUNDOOMINITE"), + .itemId = ITEM_HOUNDOOMINITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_AGGRONITE] = + { + .name = _("AGGRONITE"), + .itemId = ITEM_AGGRONITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_BANETTITE] = + { + .name = _("BANETTITE"), + .itemId = ITEM_BANETTITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_TYRANITARITE] = + { + .name = _("TYRANITARITE"), + .itemId = ITEM_TYRANITARITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_SCIZORITE] = + { + .name = _("SCIZORITE"), + .itemId = ITEM_SCIZORITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_PINSIRITE] = + { + .name = _("PINSIRITE"), + .itemId = ITEM_PINSIRITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_AERODACTYLITE] = + { + .name = _("AERODACTYLITE"), + .itemId = ITEM_AERODACTYLITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_LUCARIONITE] = + { + .name = _("LUCARIONITE"), + .itemId = ITEM_LUCARIONITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_ABOMASITE] = + { + .name = _("ABOMASITE"), + .itemId = ITEM_ABOMASITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_KANGASKHANITE] = + { + .name = _("KANGASKHANITE"), + .itemId = ITEM_KANGASKHANITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_GYARADOSITE] = + { + .name = _("GYARADOSITE"), + .itemId = ITEM_GYARADOSITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_ABSOLITE] = + { + .name = _("ABSOLITE"), + .itemId = ITEM_ABSOLITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_CHARIZARDITE_Y] = + { + .name = _("CHARIZARDITEY"), + .itemId = ITEM_CHARIZARDITE_Y, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_ALAKAZITE] = + { + .name = _("ALAKAZITE"), + .itemId = ITEM_ALAKAZITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_HERACRONITE] = + { + .name = _("HERACRONITE"), + .itemId = ITEM_HERACRONITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_MAWILITE] = + { + .name = _("MAWILITE"), + .itemId = ITEM_MAWILITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_MANECTITE] = + { + .name = _("MANECTITE"), + .itemId = ITEM_MANECTITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_GARCHOMPITE] = + { + .name = _("GARCHOMPITE"), + .itemId = ITEM_GARCHOMPITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_LATIASITE] = + { + .name = _("LATIASITE"), + .itemId = ITEM_LATIASITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_LATIOSITE] = + { + .name = _("LATIOSITE"), + .itemId = ITEM_LATIOSITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_SWAMPERTITE] = + { + .name = _("SWAMPERTITE"), + .itemId = ITEM_SWAMPERTITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_SCEPTILITE] = + { + .name = _("SCEPTILITE"), + .itemId = ITEM_SCEPTILITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_SABLENITE] = + { + .name = _("SABLENITE"), + .itemId = ITEM_SABLENITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_ALTARIANITE] = + { + .name = _("ALTARIANITE"), + .itemId = ITEM_ALTARIANITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_GALLADITE] = + { + .name = _("GALLADITE"), + .itemId = ITEM_GALLADITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_AUDINITE] = + { + .name = _("AUDINITE"), + .itemId = ITEM_AUDINITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_METAGROSSITE] = + { + .name = _("METAGROSSITE"), + .itemId = ITEM_METAGROSSITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_SHARPEDONITE] = + { + .name = _("SHARPEDONITE"), + .itemId = ITEM_SHARPEDONITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_SLOWBRONITE] = + { + .name = _("SLOWBRONITE"), + .itemId = ITEM_SLOWBRONITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_STEELIXITE] = + { + .name = _("STEELIXITE"), + .itemId = ITEM_STEELIXITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_PIDGEOTITE] = + { + .name = _("PIDGEOTITE"), + .itemId = ITEM_PIDGEOTITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_GLALITITE] = + { + .name = _("GLALITITE"), + .itemId = ITEM_GLALITITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_DIANCITE] = + { + .name = _("DIANCITE"), + .itemId = ITEM_DIANCITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_CAMERUPTITE] = + { + .name = _("CAMERUPTITE"), + .itemId = ITEM_CAMERUPTITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_LOPPUNITE] = + { + .name = _("LOPPUNITE"), + .itemId = ITEM_LOPPUNITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_SALAMENCITE] = + { + .name = _("SALAMENCITE"), + .itemId = ITEM_SALAMENCITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_BEEDRILLITE] = + { + .name = _("BEEDRILLITE"), + .itemId = ITEM_BEEDRILLITE, + .price = 200, + .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_KEY_STONE] = + { + .name = _("KEY STONE"), + .itemId = ITEM_KEY_STONE, + .price = 200, + .holdEffect = HOLD_EFFECT_NONE, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_KEY_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_PROTECTIVE_PADS] = + { + .name = _("PROTECT PADS"), // Shortened name from Protective Pads + .itemId = ITEM_PROTECTIVE_PADS, + .price = 200, + .holdEffect = HOLD_EFFECT_PROTECTIVE_PADS, + .holdEffectParam = 0, + .description = gDummyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, }; From fe66019bc5ce829feb0f9bb23ba818aecce1adc6 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Wed, 19 Dec 2018 16:36:55 -0600 Subject: [PATCH 205/667] Fix ROOST healing effect graphical bug --- data/battle_anim_scripts.s | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index cc73938d85..73f357dc7c 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -692,26 +692,26 @@ gBattleAnims_Special:: Move_ROOST: loadspritegfx ANIM_TAG_WHITE_FEATHER loadspritegfx ANIM_TAG_BLUE_STAR - monbg ANIM_DEF_PARTNER + monbg ANIM_ATTACKER monbgprio_29 playsewithpan SE_W080, SOUND_PAN_TARGET delay 0 - createsprite gUnknown_08596388, ANIM_TARGET, 0, 0, -16, 64, 2, 104, 11304, 32, 1 + createsprite gUnknown_08596388, ANIM_ATTACKER, 0, 0, -16, 64, 2, 104, 11304, 32, 1 delay 6 - createsprite gUnknown_08596388, ANIM_TARGET, 0, 0, -16, 32, 2, 104, 11304, 32, 1 - createsprite gUnknown_08596388, ANIM_TARGET, 0, 0, -16, 0, 2, 104, 11304, 32, 1 + createsprite gUnknown_08596388, ANIM_ATTACKER, 0, 0, -16, 32, 2, 104, 11304, 32, 1 + createsprite gUnknown_08596388, ANIM_ATTACKER, 0, 0, -16, 0, 2, 104, 11304, 32, 1 delay 6 - createsprite gUnknown_08596388, ANIM_TARGET, 0, 0, -16, 224, 2, 104, 11304, 32, 1 - createsprite gUnknown_08596388, ANIM_TARGET, 0, 0, -16, 128, 2, 104, 11304, 32, 1 + createsprite gUnknown_08596388, ANIM_ATTACKER, 0, 0, -16, 224, 2, 104, 11304, 32, 1 + createsprite gUnknown_08596388, ANIM_ATTACKER, 0, 0, -16, 128, 2, 104, 11304, 32, 1 delay 6 - createsprite gUnknown_08596388, ANIM_TARGET, 0, 0, -16, 192, 2, 104, 11304, 32, 1 - createsprite gUnknown_08596388, ANIM_TARGET, 0, 0, -16, 160, 2, 104, 11304, 32, 1 + createsprite gUnknown_08596388, ANIM_ATTACKER, 0, 0, -16, 192, 2, 104, 11304, 32, 1 + createsprite gUnknown_08596388, ANIM_ATTACKER, 0, 0, -16, 160, 2, 104, 11304, 32, 1 delay 6 - createsprite gUnknown_08596388, ANIM_TARGET, 0, 0, -16, 96, 2, 104, 11304, 32, 1 + createsprite gUnknown_08596388, ANIM_ATTACKER, 0, 0, -16, 96, 2, 104, 11304, 32, 1 waitforvisualfinish + clearmonbg ANIM_ATTACKER call HealingEffect waitforvisualfinish - clearmonbg ANIM_DEF_PARTNER end Move_GRAVITY: From 0369780db946fcf5553f40770c7b1b76731d0ec0 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Thu, 20 Dec 2018 10:18:17 -0600 Subject: [PATCH 206/667] Add Rock Polish animation --- data/battle_anim_scripts.s | 62 ++++++++ graphics/battle_anims/sprites/289.png | Bin 0 -> 256 bytes include/battle_anim.h | 96 ++++++++----- include/constants/battle_anim.h | 1 + include/graphics.h | 2 + ld_script.txt | 1 + src/battle_anim.c | 2 + src/effects_1.c | 196 ++++++++++++++++++++++++++ src/graphics.c | 4 + 9 files changed, 330 insertions(+), 34 deletions(-) create mode 100755 graphics/battle_anims/sprites/289.png diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 73f357dc7c..fad691e397 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1344,6 +1344,68 @@ Move_AURA_SPHERE: 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 + 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 + 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: diff --git a/graphics/battle_anims/sprites/289.png b/graphics/battle_anims/sprites/289.png new file mode 100755 index 0000000000000000000000000000000000000000..7328ff1512be4b3b973f22bbdcba10081bd8dda2 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv_7YEDSN2CdBK)dKyJcSA0}6?k zxJHx&=ckpFCl;kLxcj&OjZr8|EmAPnGbwCc@(`$mqolyk9VlZAWHWd*XvzaAmUKs7 zM+SzC{oH>NS%G|m0G|-o{|pTO|NlRF^y-u;TR>_F0qwmZQ-Eq1lf2zs7&=&GJ%Ah) zPZ!6KiaE&%3#1Z)M1mH~%S^F$65wIGq3P9Bu)stk#&MlDLk}CXVOxA>C&&U%S3j3^ HP6callback = sub_80A67D8; +} + +// Places a blue sparkle that plays its default animation. +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +void AnimRockPolishSparkle(struct Sprite *sprite) +{ + InitAnimSpritePos(sprite, TRUE); + StoreSpriteCallbackInData6(sprite, move_anim_8074EE0); + sprite->callback = sub_80A67D8; +} diff --git a/src/graphics.c b/src/graphics.c index b2de074bc1..bad142badf 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -564,6 +564,10 @@ const u32 gBattleAnimSpriteSheet_163[] = INCBIN_U32("graphics/battle_anims/sprit const u32 gBattleAnimSpritePalette_163[] = INCBIN_U32("graphics/battle_anims/sprites/163.gbapal.lz"); const u32 gBattleAnimSpritePalette_288[] = INCBIN_U32("graphics/battle_anims/sprites/288.gbapal.lz"); + +const u32 gBattleAnimSpriteSheet_289[] = INCBIN_U32("graphics/battle_anims/sprites/289.4bpp.lz"); +const u32 gBattleAnimSpritePalette_289[] = INCBIN_U32("graphics/battle_anims/sprites/289.gbapal.lz"); + const u32 gBattleAnimSpritePalette_164[] = INCBIN_U32("graphics/battle_anims/sprites/164.gbapal.lz"); const u32 gBattleAnimSpritePalette_165[] = INCBIN_U32("graphics/battle_anims/sprites/165.gbapal.lz"); From ecda59a40619e178d79d67f5570caecbe7c56344 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Thu, 20 Dec 2018 11:58:21 -0600 Subject: [PATCH 207/667] Add Poison Jab animation --- data/battle_anim_scripts.s | 49 ++++++++++++++++++++++++++ graphics/battle_anims/sprites/290.png | Bin 0 -> 282 bytes include/constants/battle_anim.h | 1 + include/graphics.h | 2 ++ src/battle_anim.c | 2 ++ src/effects_1.c | 35 ++++++++++++++++++ src/graphics.c | 3 ++ 7 files changed, 92 insertions(+) create mode 100755 graphics/battle_anims/sprites/290.png diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index fad691e397..dac93b4675 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1386,6 +1386,7 @@ Move_ROCK_POLISH: createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, -21, -16 delay 2 waitforvisualfinish + playsewithpan SE_W213, SOUND_PAN_ATTACKER createsprite gRockPolishSparkleSpriteTemplate, ANIM_ATTACKER, 2, -20, 9 createsprite gRockPolishSparkleSpriteTemplate, ANIM_ATTACKER, 2, -10, -15 createsprite gRockPolishSparkleSpriteTemplate, ANIM_ATTACKER, 2, 1, 17 @@ -1409,6 +1410,54 @@ Move_ROCK_POLISH: end Move_POISON_JAB: + loadspritegfx ANIM_TAG_PURPLE_JAB + loadspritegfx ANIM_TAG_IMPACT + 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_W004, SOUND_PAN_TARGET + createsprite gPoisonJabProjectileSpriteTemplate, ANIM_TARGET, 2, -17, -27, 10 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -4, -6, 1, 3 + playsewithpan SE_W004, 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_W004, SOUND_PAN_TARGET + createsprite gPoisonJabProjectileSpriteTemplate, ANIM_TARGET, 2, 15, -27, 10 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -6, 8, 1, 3 + playsewithpan SE_W004, SOUND_PAN_TARGET + createsprite gPoisonJabProjectileSpriteTemplate, ANIM_TARGET, 2, -31, -2, 10 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 12, 6, 1, 3 + playsewithpan SE_W004, SOUND_PAN_TARGET + createsprite gPoisonJabProjectileSpriteTemplate, ANIM_TARGET, 2, -26, -18, 10 + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -6, -8, 1, 3 + playsewithpan SE_W004, SOUND_PAN_TARGET + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 8, 1, 3 + playsewithpan SE_W004, SOUND_PAN_TARGET + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -8, 0, 1, 3 + playsewithpan SE_W004, SOUND_PAN_TARGET + delay 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -7, -5, 1, 3 + playsewithpan SE_W004, SOUND_PAN_TARGET + waitforvisualfinish + blendoff end Move_DARK_PULSE: diff --git a/graphics/battle_anims/sprites/290.png b/graphics/battle_anims/sprites/290.png new file mode 100755 index 0000000000000000000000000000000000000000..2c15153b9387bad96eced0fee7988640ff00efdc GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!VDx^^%Amx6nlxMuPgf_9uYxxfpFKbWk4bE z64!{5;QX|b^2DN426rD9pfL(%sYMFLdM1UfOCAE1aFi7IxdUa4fouk^22FV&#ggvm z>&U>cv7h@-A}f$@5a1Kyx@1cCYK9MW4Da{gM1&m4F?k)@+tg;?J zj-98AV@SoEmdKI;Vst08c4J0{{R3 literal 0 HcmV?d00001 diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index 2f7dde697e..dea8eca1b0 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -297,6 +297,7 @@ #define ANIM_TAG_WHIP_HIT (ANIM_SPRITES_START + 287) #define ANIM_TAG_BLUE_RING_2 (ANIM_SPRITES_START + 288) #define ANIM_TAG_WHITE_STREAK (ANIM_SPRITES_START + 289) +#define ANIM_TAG_PURPLE_JAB (ANIM_SPRITES_START + 290) // battlers #define ANIM_ATTACKER 0 diff --git a/include/graphics.h b/include/graphics.h index 18394edeac..758879494f 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -4374,6 +4374,7 @@ extern const u32 gBattleAnimSpriteSheet_283[]; extern const u32 gBattleAnimSpriteSheet_284[]; extern const u32 gBattleAnimSpriteSheet_285[]; extern const u32 gBattleAnimSpriteSheet_289[]; +extern const u32 gBattleAnimSpriteSheet_290[]; extern const u32 gBattleAnimSpritePalette_000[]; extern const u32 gBattleAnimSpritePalette_001[]; @@ -4650,6 +4651,7 @@ extern const u32 gBattleAnimSpritePalette_286[]; extern const u32 gBattleAnimSpritePalette_287[]; extern const u32 gBattleAnimSpritePalette_288[]; extern const u32 gBattleAnimSpritePalette_289[]; +extern const u32 gBattleAnimSpritePalette_290[]; extern const u32 gBattleAnimBackgroundImage_00[]; extern const u32 gBattleAnimBackgroundImage_02[]; diff --git a/src/battle_anim.c b/src/battle_anim.c index 0e6eb0f2a7..40e214afda 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -1058,6 +1058,7 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteSheet_056, 0x1000, ANIM_TAG_WHIP_HIT}, {gBattleAnimSpriteSheet_163, 0x0100, ANIM_TAG_BLUE_RING_2}, {gBattleAnimSpriteSheet_289, 0x1000, ANIM_TAG_WHITE_STREAK}, + {gBattleAnimSpriteSheet_290, 0x800, ANIM_TAG_PURPLE_JAB}, }; @@ -1353,6 +1354,7 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePalette_287, ANIM_TAG_WHIP_HIT}, {gBattleAnimSpritePalette_288, ANIM_TAG_BLUE_RING_2}, {gBattleAnimSpritePalette_289, ANIM_TAG_WHITE_STREAK}, + {gBattleAnimSpritePalette_290, ANIM_TAG_PURPLE_JAB}, }; const struct BattleAnimBackground gBattleAnimBackgroundTable[] = diff --git a/src/effects_1.c b/src/effects_1.c index 7b0946ed63..fc29fe6a28 100644 --- a/src/effects_1.c +++ b/src/effects_1.c @@ -2107,6 +2107,7 @@ const struct SpriteTemplate gPowerOrbs_Float = void AnimRockPolishStreak(struct Sprite *); void AnimRockPolishSparkle(struct Sprite *); +void AnimPoisonJabProjectile(struct Sprite *); const union AnimCmd gRockPolishStreak_AnimCmd[] = { @@ -2298,3 +2299,37 @@ void AnimRockPolishSparkle(struct Sprite *sprite) StoreSpriteCallbackInData6(sprite, move_anim_8074EE0); sprite->callback = sub_80A67D8; } + +const struct SpriteTemplate gPoisonJabProjectileSpriteTemplate = +{ + .tileTag = ANIM_TAG_PURPLE_JAB, + .paletteTag = ANIM_TAG_PURPLE_JAB, + .oam = &gUnknown_08524B14, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimPoisonJabProjectile, +}; + +// 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 +void AnimPoisonJabProjectile(struct Sprite *sprite) +{ + s16 targetXPos; + s16 targetYPos; + u16 rotation; + + sub_80A6980(sprite, TRUE); + targetXPos = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); + targetYPos = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_3); + rotation = ArcTan2Neg(targetXPos - sprite->pos1.x, targetYPos - sprite->pos1.y); + sub_80A73E0(sprite, FALSE, 0x100, 0x100, rotation); + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[2] = targetXPos; + sprite->data[4] = targetYPos; + sprite->callback = StartAnimLinearTranslation; + StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); +} diff --git a/src/graphics.c b/src/graphics.c index bad142badf..a90a809cb8 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -568,6 +568,9 @@ const u32 gBattleAnimSpritePalette_288[] = INCBIN_U32("graphics/battle_anims/spr const u32 gBattleAnimSpriteSheet_289[] = INCBIN_U32("graphics/battle_anims/sprites/289.4bpp.lz"); const u32 gBattleAnimSpritePalette_289[] = INCBIN_U32("graphics/battle_anims/sprites/289.gbapal.lz"); +const u32 gBattleAnimSpriteSheet_290[] = INCBIN_U32("graphics/battle_anims/sprites/290.4bpp.lz"); +const u32 gBattleAnimSpritePalette_290[] = INCBIN_U32("graphics/battle_anims/sprites/290.gbapal.lz"); + const u32 gBattleAnimSpritePalette_164[] = INCBIN_U32("graphics/battle_anims/sprites/164.gbapal.lz"); const u32 gBattleAnimSpritePalette_165[] = INCBIN_U32("graphics/battle_anims/sprites/165.gbapal.lz"); From 4aecea2ce84c649444120eb816ae3238734e0536 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Thu, 20 Dec 2018 12:46:08 -0600 Subject: [PATCH 208/667] Add Night Slash animation --- data/battle_anim_scripts.s | 17 ++++++++ src/effects_1.c | 79 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index dac93b4675..912676a1aa 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1464,6 +1464,23 @@ Move_DARK_PULSE: 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_W013, 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_W013, SOUND_PAN_TARGET + waitforvisualfinish + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, 1, 3, 12, 0, RGB_BLACK + waitforvisualfinish end Move_AQUA_TAIL: diff --git a/src/effects_1.c b/src/effects_1.c index fc29fe6a28..0cabed63e0 100644 --- a/src/effects_1.c +++ b/src/effects_1.c @@ -2104,10 +2104,12 @@ const struct SpriteTemplate gPowerOrbs_Float = }; #include "random.h" +#include "util.h" void AnimRockPolishStreak(struct Sprite *); void AnimRockPolishSparkle(struct Sprite *); void AnimPoisonJabProjectile(struct Sprite *); +void AnimNightSlash(struct Sprite *); const union AnimCmd gRockPolishStreak_AnimCmd[] = { @@ -2333,3 +2335,80 @@ void AnimPoisonJabProjectile(struct Sprite *sprite) sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } + +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 = &gUnknown_08524914, + .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 = &gUnknown_08524914, + .anims = gNightSlashRightAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimNightSlash, +}; + +void AnimTask_BlendNightSlash(u8 taskId) +{ + int paletteOffset = IndexOfSpritePaletteTag(ANIM_TAG_SLASH) * 16 + 256; + BlendPalette(paletteOffset, 16, 6, RGB_RED); + DestroyAnimVisualTask(taskId); +} + +void AnimNightSlash(struct Sprite *sprite) +{ + sprite->callback = sub_8101F40; + sprite->callback(sprite); +} From efd7013f62af8a64114738bad6c5fc5683f8f27d Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Thu, 20 Dec 2018 14:58:13 -0600 Subject: [PATCH 209/667] Add poison bubble effect to Poison Jab --- data/battle_anim_scripts.s | 3 +++ 1 file changed, 3 insertions(+) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 912676a1aa..8ae7a19683 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1412,6 +1412,7 @@ Move_ROCK_POLISH: 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 @@ -1457,6 +1458,8 @@ Move_POISON_JAB: createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -7, -5, 1, 3 playsewithpan SE_W004, SOUND_PAN_TARGET waitforvisualfinish + call PoisonBubblesEffect + waitforvisualfinish blendoff end From f7a7ddde0c9a4365e189d87a8c94543d07dce558 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 22 Dec 2018 15:10:24 +0100 Subject: [PATCH 210/667] Fix Quick Guard --- include/battle.h | 3 -- include/battle_main.h | 1 + include/constants/battle.h | 2 + src/battle_debug.c | 33 ++++++++++-- src/battle_main.c | 20 ++++---- src/battle_message.c | 2 +- src/battle_script_commands.c | 97 +++++++++++++++++++++--------------- src/battle_util.c | 4 +- src/data/battle_moves.h | 2 + 9 files changed, 103 insertions(+), 61 deletions(-) diff --git a/include/battle.h b/include/battle.h index deff8df866..43fbd67a1c 100644 --- a/include/battle.h +++ b/include/battle.h @@ -177,8 +177,6 @@ struct DisableStruct struct ProtectStruct { u32 protected:1; - u32 wideGuarded:1; - u32 quickGuarded:1; u32 spikyShielded:1; u32 kingsShielded:1; u32 banefulBunkered:1; @@ -589,7 +587,6 @@ struct BattleStruct struct MegaEvolutionData mega; const u8 *trainerSlideMsg; bool8 trainerSlideLowHpMsgDone; - s8 movePriorities[MAX_BATTLERS_COUNT]; }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/include/battle_main.h b/include/battle_main.h index da716a0be3..b68acfeab9 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -80,6 +80,7 @@ u8 IsRunningFromBattleImpossible(void); void sub_803BDA0(u8 battlerId); void SwapTurnOrder(u8 id1, u8 id2); u32 GetBattlerTotalSpeedStat(u8 battlerId); +s8 GetMovePriority(u8 battlerId); u8 GetWhoStrikesFirst(u8 battlerId1, u8 battlerId2, bool8 ignoreChosenMoves); void RunBattleScriptCommands_PopCallbacksStack(void); void RunBattleScriptCommands(void); diff --git a/include/constants/battle.h b/include/constants/battle.h index 22f7be7c61..17114ba555 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -209,6 +209,8 @@ #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 << 18) // Field affecting statuses. #define STATUS_FIELD_MAGIC_ROOM 0x1 diff --git a/src/battle_debug.c b/src/battle_debug.c index d67271d832..52dd91ccaf 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -109,6 +109,7 @@ enum VAR_SHOW_HP, VAR_SUBSTITUTE, VAR_IN_LOVE, + VAR_U16_4_ENTRIES, }; enum @@ -855,6 +856,8 @@ static void CreateSecondaryListMenu(struct BattleDebugMenu *data) itemsCount = 3; break; case LIST_ITEM_MOVES: + itemsCount = 5; + break; case LIST_ITEM_PP: itemsCount = 4; break; @@ -958,6 +961,15 @@ static void PrintSecondaryEntries(struct BattleDebugMenu *data) 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) + { + u8 textAll[] = _("All"); + + PadString(textAll, 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); @@ -1052,6 +1064,12 @@ static void UpdateBattlerValue(struct BattleDebugMenu *data) 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_U32: *(u32*)(data->modifyArrows.modifiedValPtr) = data->modifyArrows.currValue; break; @@ -1273,9 +1291,18 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) data->modifyArrows.minValue = 0; data->modifyArrows.maxValue = MOVES_COUNT_GEN7 - 1; data->modifyArrows.maxDigits = 3; - data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].moves[data->currentSecondaryListItemId]; - data->modifyArrows.typeOfVal = VAL_U16; - data->modifyArrows.currValue = gBattleMons[data->battlerId].moves[data->currentSecondaryListItemId]; + 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; diff --git a/src/battle_main.c b/src/battle_main.c index d5afc7c2fb..fab12d3edf 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3238,8 +3238,6 @@ void FaintClearSetData(void) ptr[i] = 0; gProtectStructs[gActiveBattler].protected = 0; - gProtectStructs[gActiveBattler].wideGuarded = 0; - gProtectStructs[gActiveBattler].quickGuarded = 0; gProtectStructs[gActiveBattler].spikyShielded = 0; gProtectStructs[gActiveBattler].kingsShielded = 0; gProtectStructs[gActiveBattler].banefulBunkered = 0; @@ -4711,8 +4709,9 @@ u32 GetBattlerTotalSpeedStat(u8 battlerId) return speed; } -static s8 GetMovePriority(u8 battlerId) +s8 GetMovePriority(u8 battlerId) { + s8 priority; u16 move; if (gProtectStructs[battlerId].noValidMoves) @@ -4720,17 +4719,17 @@ static s8 GetMovePriority(u8 battlerId) else move = gBattleMons[battlerId].moves[*(gBattleStruct->chosenMovePositions + battlerId)]; - gBattleStruct->movePriorities[battlerId] = gBattleMoves[move].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))) { - gBattleStruct->movePriorities[battlerId]++; + priority++; } else if (GetBattlerAbility(battlerId) == ABILITY_PRANKSTER && gBattleMoves[move].split == SPLIT_STATUS) { - gBattleStruct->movePriorities[battlerId]++; + priority++; } else if (GetBattlerAbility(battlerId) == ABILITY_TRIAGE) { @@ -4748,12 +4747,12 @@ static s8 GetMovePriority(u8 battlerId) case EFFECT_SOFTBOILED: case EFFECT_ABSORB: case EFFECT_ROOST: - gBattleStruct->movePriorities[battlerId] += 3; + priority += 3; break; } } - return gBattleStruct->movePriorities[battlerId]; + return priority; } u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) @@ -4949,9 +4948,6 @@ static void TurnValuesCleanUp(bool8 var0) if (var0) { gProtectStructs[gActiveBattler].protected = 0; - gProtectStructs[gActiveBattler].endured = 0; - gProtectStructs[gActiveBattler].wideGuarded = 0; - gProtectStructs[gActiveBattler].quickGuarded = 0; gProtectStructs[gActiveBattler].spikyShielded = 0; gProtectStructs[gActiveBattler].kingsShielded = 0; gProtectStructs[gActiveBattler].banefulBunkered = 0; @@ -4977,6 +4973,8 @@ static void TurnValuesCleanUp(bool8 var0) gBattleMons[gActiveBattler].status2 &= ~(STATUS2_SUBSTITUTE); } + gSideStatuses[0] &= ~(SIDE_STATUS_QUICK_GUARD | SIDE_STATUS_WIDE_GUARD); + gSideStatuses[1] &= ~(SIDE_STATUS_QUICK_GUARD | SIDE_STATUS_WIDE_GUARD); gSideTimers[0].followmeTimer = 0; gSideTimers[1].followmeTimer = 0; } diff --git a/src/battle_message.c b/src/battle_message.c index 3eddc22950..0e3ec06522 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -551,7 +551,7 @@ static const u8 sText_PointedStonesFloat[] =_("Pointed stones float in the air\n 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\nyour team!"); +static const u8 sText_ProtectedTeam[] =_("{B_CURRENT_MOVE} protected\n{B_ATK_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!"); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 38dccfad53..5078f0dc97 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -903,7 +903,7 @@ bool32 IsBattlerProtected(u8 battlerId, u16 move) return FALSE; else if (gProtectStructs[battlerId].protected) return TRUE; - else if ((gProtectStructs[battlerId].wideGuarded || gProtectStructs[BATTLE_PARTNER(battlerId)].wideGuarded) + 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) @@ -912,8 +912,8 @@ bool32 IsBattlerProtected(u8 battlerId, u16 move) return TRUE; else if (gProtectStructs[battlerId].kingsShielded && gBattleMoves[move].power != 0) return TRUE; - else if ((gProtectStructs[battlerId].quickGuarded || gProtectStructs[BATTLE_PARTNER(battlerId)].quickGuarded) - && gBattleStruct->movePriorities[battlerId] > 0) + else if (gSideStatuses[GetBattlerSide(battlerId)] & SIDE_STATUS_QUICK_GUARD + && GetMovePriority(gBattlerAttacker) > 0) return TRUE; else return FALSE; @@ -2732,15 +2732,15 @@ void SetMoveEffect(bool8 primary, u8 certain) break; case MOVE_EFFECT_FEINT: if (gProtectStructs[gBattlerTarget].protected - || gProtectStructs[gBattlerTarget].wideGuarded - || gProtectStructs[gBattlerTarget].quickGuarded + || gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_WIDE_GUARD + || gSideStatuses[GetBattlerSide(gBattlerTarget)] & SIDE_STATUS_QUICK_GUARD || gProtectStructs[gBattlerTarget].spikyShielded || gProtectStructs[gBattlerTarget].kingsShielded || gProtectStructs[gBattlerTarget].banefulBunkered) { gProtectStructs[gBattlerTarget].protected = 0; - gProtectStructs[gBattlerTarget].wideGuarded = 0; - gProtectStructs[gBattlerTarget].quickGuarded = 0; + gSideStatuses[GetBattlerSide(gBattlerTarget)] &= ~(SIDE_STATUS_WIDE_GUARD); + gSideStatuses[GetBattlerSide(gBattlerTarget)] &= ~(SIDE_STATUS_QUICK_GUARD); gProtectStructs[gBattlerTarget].spikyShielded = 0; gProtectStructs[gBattlerTarget].kingsShielded = 0; gProtectStructs[gBattlerTarget].banefulBunkered = 0; @@ -7202,8 +7202,9 @@ static void atk76_various(void) gBattlescriptCurrInstr += 3; } -static void atk77_setprotectlike(void) // protect and endure +static void atk77_setprotectlike(void) { + bool32 fail = TRUE; bool32 notLastTurn = TRUE; if (!(gBattleMoves[gLastResultingMoves[gBattlerAttacker]].flags & FLAG_PROTECTION_MOVE)) @@ -7214,44 +7215,58 @@ static void atk77_setprotectlike(void) // protect and endure if (sProtectSuccessRates[gDisableStructs[gBattlerAttacker].protectUses] >= Random() && notLastTurn) { - if (gBattleMoves[gCurrentMove].effect == EFFECT_ENDURE) + if (!gBattleMoves[gCurrentMove].argument) // Protects one mon only. { - gProtectStructs[gBattlerAttacker].endured = 1; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + 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_KING_S_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; } - else if (gCurrentMove == MOVE_DETECT || gCurrentMove == MOVE_PROTECT) + else // Protects the whole side. { - gProtectStructs[gBattlerAttacker].protected = 1; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + 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_SPIKY_SHIELD) - { - gProtectStructs[gBattlerAttacker].spikyShielded = 1; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - else if (gCurrentMove == MOVE_KING_S_SHIELD) - { - gProtectStructs[gBattlerAttacker].kingsShielded = 1; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - else if (gCurrentMove == MOVE_BANEFUL_BUNKER) - { - gProtectStructs[gBattlerAttacker].banefulBunkered = 1; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - } - else if (gCurrentMove == MOVE_WIDE_GUARD) - { - gProtectStructs[gBattlerAttacker].wideGuarded = 1; - gBattleCommunication[MULTISTRING_CHOOSER] = 3; - } - else if (gCurrentMove == MOVE_QUICK_GUARD) - { - gProtectStructs[gBattlerAttacker].quickGuarded = 1; - gBattleCommunication[MULTISTRING_CHOOSER] = 3; - } - gDisableStructs[gBattlerAttacker].protectUses++; } - else + + if (fail) { gDisableStructs[gBattlerAttacker].protectUses = 0; gBattleCommunication[MULTISTRING_CHOOSER] = 2; diff --git a/src/battle_util.c b/src/battle_util.c index 81997b5756..e5f7f5b296 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2319,7 +2319,7 @@ u8 AtkCanceller_UnableToUseMove2(void) case CANCELLER_PSYCHIC_TERRAIN: if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN && IsBattlerGrounded(gBattlerAttacker) - && gBattleStruct->movePriorities[gBattlerAttacker] > 0 + && GetMovePriority(gBattlerAttacker) > 0 && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget)) { CancelMultiTurnMoves(gBattlerAttacker); @@ -2899,7 +2899,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA else if ((gLastUsedAbility == ABILITY_DAZZLING || (IsBattlerAlive(battler ^= BIT_FLANK) && GetBattlerAbility(battler) == ABILITY_DAZZLING) ) - && gBattleStruct->movePriorities[gBattlerAttacker] > 0 + && GetMovePriority(battler) > 0 && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(battler)) { if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 9c6ded27c2..4ea7c9f85a 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -6587,6 +6587,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .priority = 3, .flags = FLAG_PROTECTION_MOVE, .split = SPLIT_STATUS, + .argument = TRUE, // Protects the whole side. }, [MOVE_GUARD_SPLIT] = @@ -7035,6 +7036,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .priority = 3, .flags = FLAG_PROTECTION_MOVE, .split = SPLIT_STATUS, + .argument = TRUE, // Protects the whole side. }, [MOVE_ALLY_SWITCH] = From 53b9d4a2248605768b63a835c8ab06518fcf7679 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 22 Dec 2018 20:57:12 +0100 Subject: [PATCH 211/667] Dont clear AI flags on move choose. Will come in handy in smart ai switch logic --- include/battle.h | 3 -- include/battle_ai_script_commands.h | 3 +- src/battle_ai_script_commands.c | 81 +++++++++++++---------------- src/battle_controllers.c | 4 +- src/battle_debug.c | 4 +- 5 files changed, 43 insertions(+), 52 deletions(-) diff --git a/include/battle.h b/include/battle.h index 43fbd67a1c..7a19532258 100644 --- a/include/battle.h +++ b/include/battle.h @@ -298,7 +298,6 @@ struct AI_ThinkingStruct u32 aiFlags; u8 aiAction; u8 aiLogicId; - u8 filler12[6]; u8 simulatedRNG[4]; struct AI_SavedBattleMon saved[4]; }; @@ -580,8 +579,6 @@ struct BattleStruct u8 roostTypes[MAX_BATTLERS_COUNT][3]; u8 savedBattlerTarget; bool8 ateBoost[MAX_BATTLERS_COUNT]; - u32 debugAIFlags; - bool8 notfirstTimeAIFlags; u8 activeAbilityPopUps; // as bits for each battler bool8 throwingPokeBall; struct MegaEvolutionData mega; diff --git a/include/battle_ai_script_commands.h b/include/battle_ai_script_commands.h index dbf72a8c20..47c6bda9c4 100644 --- a/include/battle_ai_script_commands.h +++ b/include/battle_ai_script_commands.h @@ -9,7 +9,8 @@ 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_HandleItemUseBeforeAISetup(u8 defaultScoreMoves); +void BattleAI_SetupItems(void); +void BattleAI_SetupFlags(void); void BattleAI_SetupAIData(u8 defaultScoreMoves); u8 BattleAI_ChooseMoveOrAction(void); void ClearBattlerMoveHistory(u8 battlerId); diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 92a896458c..d26c96ef16 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -291,7 +291,7 @@ static const u16 sDiscouragedPowerfulMoveEffects[] = }; // code -void BattleAI_HandleItemUseBeforeAISetup(u8 defaultScoreMoves) +void BattleAI_SetupItems(void) { s32 i; u8 *data = (u8 *)BATTLE_HISTORY; @@ -316,19 +316,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 || 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; 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 < 4; i++) @@ -367,37 +388,6 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves) { gBattlerTarget = sBattler_AI ^ BIT_SIDE; } - - // Choose proper trainer ai scripts. - if (!gBattleStruct->notfirstTimeAIFlags || !USE_BATTLE_DEBUG) - { - 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 || gTrainers[gTrainerBattleOpponent_A].doubleBattle) - AI_THINKING_STRUCT->aiFlags |= AI_SCRIPT_DOUBLE_BATTLE; // Act smart in doubles and don't attack your partner. - - gBattleStruct->debugAIFlags = AI_THINKING_STRUCT->aiFlags; - gBattleStruct->notfirstTimeAIFlags = TRUE; - } - else - { - AI_THINKING_STRUCT->aiFlags = gBattleStruct->debugAIFlags; - } } u8 BattleAI_ChooseMoveOrAction(void) @@ -420,17 +410,18 @@ static u8 ChooseMoveOrAction_Singles(void) u8 consideredMoveArray[4]; u8 numOfBestMoves; s32 i; + 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; } @@ -470,7 +461,7 @@ static u8 ChooseMoveOrAction_Doubles(void) { s32 i; s32 j; - s32 scriptsToRun; + u32 flags; s16 bestMovePointsForTarget[4]; s8 mostViableTargetsArray[4]; u8 actionOrMoveIndex[4]; @@ -501,15 +492,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; } diff --git a/src/battle_controllers.c b/src/battle_controllers.c index cc8c63793c..bb13266948 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -60,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) { diff --git a/src/battle_debug.c b/src/battle_debug.c index 52dd91ccaf..4986b09b3c 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -1405,8 +1405,8 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) data->modifyArrows.typeOfVal = VAL_BITFIELD_32; goto CASE_ITEM_STATUS; case LIST_ITEM_AI: - data->modifyArrows.modifiedValPtr = &gBattleStruct->debugAIFlags; - data->modifyArrows.currValue = GetBitfieldValue(gBattleStruct->debugAIFlags, data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount); + 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: From bea1faec10ad78098e2d90d2c0b79674d0223ab0 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 22 Dec 2018 21:43:21 +0100 Subject: [PATCH 212/667] some ai scripts touch --- data/battle_ai_scripts.s | 178 +++++++++++++++++++------------- src/battle_ai_script_commands.c | 2 +- 2 files changed, 107 insertions(+), 73 deletions(-) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index c58b87a4ef..3d4899aed8 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -3015,70 +3015,90 @@ AI_SetupFirstTurn: 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_not_in_hwords AI_SetupFirstTurn_SetupEffectsToEncourage, AI_SetupFirstTurn_End if_random_less_than 80, 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_AUTONOMIZE + .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 -1 AI_PreferStrongestMove: if_target_is_ally AI_Ret @@ -3133,9 +3153,8 @@ AI_PreferBatonPass: 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 + get_considered_move_effect + if_in_hwords sEffectsStatRaise, AI_PreferBatonPass2 if_effect EFFECT_PROTECT, AI_PreferBatonPass_End if_move MOVE_BATON_PASS, AI_PreferBatonPass_EncourageIfHighStats if_random_less_than 20, AI_Risky_End @@ -3153,11 +3172,30 @@ AI_PreferBatonPass_End: score +2 end +.align 1 sMovesTable_ProtectMoves: .2byte MOVE_PROTECT .2byte MOVE_DETECT .2byte -1 +sEffectsStatRaise: + .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_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_EncourageIfHighStats: get_turn_count if_equal 0, Score_Minus2 @@ -3284,7 +3322,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 @@ -3292,7 +3330,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 @@ -3302,7 +3340,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 @@ -3310,16 +3348,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: @@ -3328,7 +3366,7 @@ AI_TryHelpingHandOnAlly: AI_TrySwaggerOnAlly: if_holds_item AI_TARGET, ITEM_PERSIM_BERRY, AI_TrySwaggerOnAlly2 - goto Score_Minus30_ + goto Score_Minus30 AI_TrySwaggerOnAlly2: if_stat_level_more_than AI_TARGET, STAT_ATK, 7, AI_TrySwaggerOnAlly_End @@ -3337,10 +3375,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 diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index d26c96ef16..ed38590086 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -337,7 +337,7 @@ void BattleAI_SetupFlags(void) else AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent_A].aiFlags; - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE || gTrainers[gTrainerBattleOpponent_A].doubleBattle) + 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. } From bd817d70d630c28e1164cbdcbf893ca2cba5cb6a Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 23 Dec 2018 18:47:00 +0100 Subject: [PATCH 213/667] Refactor battle intro, allow to speed it up --- include/battle.h | 1 + include/battle_util.h | 1 + include/constants/battle_config.h | 2 + src/battle_main.c | 832 +++++++++++------------------- src/battle_util.c | 8 + 5 files changed, 303 insertions(+), 541 deletions(-) diff --git a/include/battle.h b/include/battle.h index 7a19532258..73a6799adb 100644 --- a/include/battle.h +++ b/include/battle.h @@ -584,6 +584,7 @@ struct BattleStruct struct MegaEvolutionData mega; const u8 *trainerSlideMsg; bool8 trainerSlideLowHpMsgDone; + u8 introState; }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/include/battle_util.h b/include/battle_util.h index ad166571e1..c2d207bcef 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -43,6 +43,7 @@ void PressurePPLose(u8 bankDef, u8 bankAtk, u16 move); void PressurePPLoseOnUsingPerishSong(u8 bankAtk); void PressurePPLoseOnUsingImprision(u8 bankAtk); void MarkAllBattlersForControllerExec(void); // unused +bool32 IsBattlerMarkedForControllerExec(u8 battlerId); void MarkBattlerForControllerExec(u8 battlerId); void sub_803F850(u8 arg0); void CancelMultiTurnMoves(u8 battlerId); diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 2e44012c2d..8a65728746 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -15,4 +15,6 @@ #define B_EXP_CATCH GEN_6 // Starting from gen6, pokemon get experience from catching. #define B_ABILITY_POP_UP GEN_6 // Starting from gen5, the pokemon abilities are displayed in a pop-up, when they activate in battle. +#define B_FAST_INTRO TRUE // If set to TRUE, battle intro texts print at the same time as animation of a pokemon, as opposing to waiting for the animation to end. + #endif // GUARD_CONSTANTS_BATTLE_CONFIG_H diff --git a/src/battle_main.c b/src/battle_main.c index fab12d3edf..909d51d63b 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -117,18 +117,7 @@ static void SpecialStatusesClear(void); 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); @@ -2013,12 +2002,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. @@ -2661,13 +2644,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) { sprite->data[4]--; @@ -2958,7 +2934,8 @@ void BeginBattleIntro(void) { BattleStartClearSetData(); gBattleCommunication[1] = 0; - gBattleMainFunc = BattleIntroGetMonsData; + gBattleStruct->introState = 0; + gBattleMainFunc = DoBattleIntro; } static void BattleMainCB1(void) @@ -3311,550 +3288,323 @@ void FaintClearSetData(void) 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].type3 = TYPE_MYSTERY; - gBattleMons[gActiveBattler].ability = GetAbilityBySpecies(gBattleMons[gActiveBattler].species, gBattleMons[gActiveBattler].altAbility); - hpOnSwitchout = &gBattleStruct->hpOnSwitchout[GetBattlerSide(gActiveBattler)]; - *hpOnSwitchout = gBattleMons[gActiveBattler].hp; - for (i = 0; i < NUM_BATTLE_STATS; i++) - gBattleMons[gActiveBattler].statStages[i] = 6; - 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], &gBattleBufferB[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].altAbility); + 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)) // 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)) { - 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) - { - if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT - || (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_RIGHT && gBattleTypeFlags & BATTLE_TYPE_TRAINER)) - { - 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) -{ - u32 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) -{ - u32 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; -} - -#ifdef NONMATCHING -static void BattleIntroOpponent1SendsOutMonAnimation(void) -{ - u32 position; - - 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; - - 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; -} -#else -NAKED -static void BattleIntroOpponent1SendsOutMonAnimation(void) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - ldr r0, =gBattleTypeFlags\n\ - ldr r2, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 17\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - beq _0803B298\n\ - movs r0, 0x80\n\ - lsls r0, 18\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - beq _0803B298\n\ - movs r1, 0x80\n\ - lsls r1, 24\n\ - ands r1, r2\n\ - negs r0, r1\n\ - orrs r0, r1\n\ - lsrs r5, r0, 31\n\ - b _0803B29A\n\ - .pool\n\ -_0803B288:\n\ - ldr r1, =gBattleMainFunc\n\ - ldr r0, =BattleIntroOpponent2SendsOutMonAnimation\n\ - b _0803B2F0\n\ - .pool\n\ -_0803B298:\n\ - movs r5, 0x1\n\ -_0803B29A:\n\ - ldr r0, =gBattleControllerExecFlags\n\ - ldr r2, [r0]\n\ - cmp r2, 0\n\ - bne _0803B2F2\n\ - ldr r0, =gActiveBattler\n\ - strb r2, [r0]\n\ - ldr r1, =gBattlersCount\n\ - adds r4, r0, 0\n\ - ldrb r1, [r1]\n\ - cmp r2, r1\n\ - bcs _0803B2EC\n\ - adds r6, r4, 0\n\ -_0803B2B2:\n\ - ldrb r0, [r4]\n\ - bl GetBattlerPosition\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, r5\n\ - bne _0803B2D8\n\ - movs r0, 0\n\ - bl BtlController_EmitIntroTrainerBallThrow\n\ - ldrb r0, [r4]\n\ - bl MarkBattlerForControllerExec\n\ - ldr r0, =gBattleTypeFlags\n\ - ldr r0, [r0]\n\ - ldr r1, =0x00008040\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0803B288\n\ -_0803B2D8:\n\ - ldrb r0, [r6]\n\ - adds r0, 0x1\n\ - strb r0, [r6]\n\ - ldr r1, =gBattlersCount\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - ldr r4, =gActiveBattler\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bcc _0803B2B2\n\ -_0803B2EC:\n\ - ldr r1, =gBattleMainFunc\n\ - ldr r0, =BattleIntroRecordMonsToDex\n\ -_0803B2F0:\n\ - str r0, [r1]\n\ -_0803B2F2:\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .pool\n\ - .syntax divided"); -} -#endif // NONMATCHING - -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; - } -} - -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) -{ - u32 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) -{ - u32 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; -} - -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; } } diff --git a/src/battle_util.c b/src/battle_util.c index e5f7f5b296..3b3a8fd67c 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -440,6 +440,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) From c583559a802a4c17f8c19af2abc4488ddbdcc5e9 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 23 Dec 2018 19:03:42 +0100 Subject: [PATCH 214/667] Get rid of unused stuff --- src/battle_interface.c | 430 ----------------------------------- src/battle_script_commands.c | 7 - 2 files changed, 437 deletions(-) diff --git a/src/battle_interface.c b/src/battle_interface.c index a26bcc33e0..c4d18e73e1 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -28,15 +28,6 @@ #include "battle_debug.h" #include "constants/battle_config.h" -struct TestingBar -{ - s32 maxValue; - s32 oldValue; - s32 receivedValue; - u32 unkC_0:5; - u32 unk10; -}; - enum { HEALTHBOX_GFX_0, @@ -201,7 +192,6 @@ static s32 CalcNewBarValue(s32 maxValue, s32 currValue, s32 receivedValue, s32 * 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); @@ -336,36 +326,6 @@ static const struct SpriteTemplate sHealthbarSpriteTemplates[MAX_BATTLERS_COUNT] } }; -static const struct Subsprite sUnknown_0832C220[] = -{ - {240, 0, 1, 3, 0, 1}, - {48, 0, 0, 2, 32, 1}, - {240, 32, 1, 1, 48, 1}, - {16, 32, 1, 1, 52, 1}, - {48, 32, 1, 1, 56, 1} -}; - -static const struct Subsprite sUnknown_0832C234[] = -{ - {240, 0, 1, 3, 64, 1}, - {48, 0, 0, 2, 96, 1}, - {240, 32, 1, 1, 112, 1}, - {16, 32, 1, 1, 116, 1}, - {48, 32, 1, 1, 120, 1} -}; - -static const struct Subsprite sUnknown_0832C248[] = -{ - {240, 0, 1, 3, 0, 1}, - {48, 0, 0, 2, 32, 1} -}; - -static const struct Subsprite sUnknown_0832C250[] = -{ - {240, 0, 1, 3, 0, 1}, - {48, 0, 0, 2, 32, 1} -}; - static const struct Subsprite sUnknown_0832C258[] = { {240, 0, 1, 1, 0, 1}, @@ -379,15 +339,6 @@ static const struct Subsprite sUnknown_0832C260[] = {224, 0, 0, 0, 8, 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}, @@ -422,9 +373,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 @@ -445,24 +393,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 = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 1, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0, -}; - static const struct OamData sOamData_StatusSummaryBalls = { .y = 0, @@ -620,330 +550,6 @@ static const struct SpriteTemplate sSpriteTemplate_MegaTrigger = // code -static s32 DummiedOutFunction(s16 unused1, s16 unused2, s32 unused3) -{ - return 9; -} - -#ifdef NONMATCHING -static void sub_8072308(s16 arg0, u16 *arg1, u8 arg2) -{ - s8 i, j; - u8 array[4]; - u8 *arrayPtr; - s32 r9, vaaa; - - for (i = 0; i < 4; i++) - array[i] = 0; - - i = 3; - r9 = -1; - arrayPtr = array; - while (1) - { - if (arg0 > 0) - { - array[i] = arg0 % 10; - arg0 = arg0 / 10; - i--; - } - else - { - break; - } - } - - for (; i > -1; i--) - { - array[i] = 0xFF; - } - - if (arrayPtr[3] == 0xFF) - arrayPtr[3] = 0; - - if (arg2 == 0) - { - for (i = 0, j = 0; i < 4; i++) - { - if (array[j] == 0xFF) - { - arg1[j] &= 0xFC00; - arg1[j] |= 0x1E; - - arg1[i + 0x20] &= 0xFC00; - arg1[i + 0x20] |= 0x1E; - } - else - { - arg1[j] &= 0xFC00; - arg1[j] |= array[j] + 0x14; - - arg1[i + 0x20] &= 0xFC00; - arg1[i + 0x20] |= array[i] + 0x34; - } - j++; - } - } - else - { - for (i = 0; i < 4; i++) - { - if (array[i] == 0xFF) - { - arg1[i] &= 0xFC00; - arg1[i] |= 0x1E; - - arg1[i + 0x20] &= 0xFC00; - arg1[i + 0x20] |= 0x1E; - } - else - { - arg1[i] &= 0xFC00; - arg1[i] |= array[i] + 0x14; - - arg1[i + 0x20] &= 0xFC00; - arg1[i + 0x20] |= array[i] + 0x34; - } - } - } -} - -#else -NAKED -static void sub_8072308(s16 arg0, u16 *arg1, u8 arg2) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - adds r7, r1, 0\n\ - lsls r0, 16\n\ - lsrs r5, r0, 16\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - mov r10, r2\n\ - movs r3, 0\n\ - movs r2, 0\n\ -_08072324:\n\ - lsls r0, r3, 24\n\ - asrs r0, 24\n\ - mov r3, sp\n\ - adds r1, r3, r0\n\ - strb r2, [r1]\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - asrs r0, 24\n\ - cmp r0, 0x3\n\ - ble _08072324\n\ - movs r3, 0x3\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - mov r9, r0\n\ - mov r8, sp\n\ -_08072344:\n\ - lsls r0, r5, 16\n\ - asrs r6, r0, 16\n\ - cmp r6, 0\n\ - ble _08072372\n\ - lsls r4, r3, 24\n\ - asrs r4, 24\n\ - mov r1, sp\n\ - adds r5, r1, r4\n\ - adds r0, r6, 0\n\ - movs r1, 0xA\n\ - bl __modsi3\n\ - strb r0, [r5]\n\ - adds r0, r6, 0\n\ - movs r1, 0xA\n\ - bl __divsi3\n\ - lsls r0, 16\n\ - lsrs r5, r0, 16\n\ - subs r4, 0x1\n\ - lsls r4, 24\n\ - lsrs r3, r4, 24\n\ - b _08072344\n\ -_08072372:\n\ - lsls r1, r3, 24\n\ - asrs r0, r1, 24\n\ - cmp r0, r9\n\ - ble _08072396\n\ - movs r4, 0xFF\n\ - movs r3, 0x1\n\ - negs r3, r3\n\ -_08072380:\n\ - asrs r2, r1, 24\n\ - mov r5, sp\n\ - adds r1, r5, r2\n\ - ldrb r0, [r1]\n\ - orrs r0, r4\n\ - strb r0, [r1]\n\ - subs r2, 0x1\n\ - lsls r1, r2, 24\n\ - asrs r0, r1, 24\n\ - cmp r0, r3\n\ - bgt _08072380\n\ -_08072396:\n\ - mov r1, r8\n\ - ldrb r0, [r1, 0x3]\n\ - cmp r0, 0xFF\n\ - bne _080723A2\n\ - movs r0, 0\n\ - strb r0, [r1, 0x3]\n\ -_080723A2:\n\ - mov r2, r10\n\ - cmp r2, 0\n\ - bne _08072432\n\ - movs r3, 0\n\ - movs r1, 0\n\ - movs r6, 0xFC\n\ - lsls r6, 8\n\ - movs r5, 0x1E\n\ - mov r12, r5\n\ -_080723B4:\n\ - lsls r1, 24\n\ - asrs r2, r1, 24\n\ - mov r0, sp\n\ - adds r5, r0, r2\n\ - ldrb r0, [r5]\n\ - mov r8, r1\n\ - cmp r0, 0xFF\n\ - bne _080723EA\n\ - lsls r1, r2, 1\n\ - adds r1, r7\n\ - ldrh r2, [r1]\n\ - adds r0, r6, 0\n\ - ands r0, r2\n\ - mov r2, r12\n\ - orrs r0, r2\n\ - strh r0, [r1]\n\ - lsls r3, 24\n\ - asrs r1, r3, 23\n\ - adds r1, r7\n\ - adds r1, 0x40\n\ - ldrh r2, [r1]\n\ - adds r0, r6, 0\n\ - ands r0, r2\n\ - mov r5, r12\n\ - orrs r0, r5\n\ - strh r0, [r1]\n\ - b _0807241A\n\ -_080723EA:\n\ - lsls r2, 1\n\ - adds r2, r7\n\ - ldrh r0, [r2]\n\ - adds r1, r6, 0\n\ - ands r1, r0\n\ - ldrb r0, [r5]\n\ - adds r0, 0x14\n\ - orrs r1, r0\n\ - strh r1, [r2]\n\ - lsls r4, r3, 24\n\ - asrs r3, r4, 24\n\ - lsls r2, r3, 1\n\ - adds r2, r7\n\ - adds r2, 0x40\n\ - ldrh r0, [r2]\n\ - adds r1, r6, 0\n\ - ands r1, r0\n\ - mov r5, sp\n\ - adds r0, r5, r3\n\ - ldrb r0, [r0]\n\ - adds r0, 0x34\n\ - orrs r1, r0\n\ - strh r1, [r2]\n\ - adds r3, r4, 0\n\ -_0807241A:\n\ - movs r0, 0x80\n\ - lsls r0, 17\n\ - add r0, r8\n\ - lsrs r1, r0, 24\n\ - movs r2, 0x80\n\ - lsls r2, 17\n\ - adds r0, r3, r2\n\ - lsrs r3, r0, 24\n\ - asrs r0, 24\n\ - cmp r0, 0x3\n\ - ble _080723B4\n\ - b _08072496\n\ -_08072432:\n\ - movs r3, 0\n\ - movs r4, 0xFC\n\ - lsls r4, 8\n\ - movs r6, 0x1E\n\ -_0807243A:\n\ - lsls r1, r3, 24\n\ - asrs r2, r1, 24\n\ - mov r3, sp\n\ - adds r5, r3, r2\n\ - ldrb r0, [r5]\n\ - adds r3, r1, 0\n\ - cmp r0, 0xFF\n\ - bne _08072466\n\ - lsls r1, r2, 1\n\ - adds r1, r7\n\ - ldrh r2, [r1]\n\ - adds r0, r4, 0\n\ - ands r0, r2\n\ - orrs r0, r6\n\ - strh r0, [r1]\n\ - adds r1, 0x40\n\ - ldrh r2, [r1]\n\ - adds r0, r4, 0\n\ - ands r0, r2\n\ - orrs r0, r6\n\ - strh r0, [r1]\n\ - b _08072488\n\ -_08072466:\n\ - lsls r2, 1\n\ - adds r2, r7\n\ - ldrh r0, [r2]\n\ - adds r1, r4, 0\n\ - ands r1, r0\n\ - ldrb r0, [r5]\n\ - adds r0, 0x14\n\ - orrs r1, r0\n\ - strh r1, [r2]\n\ - adds r2, 0x40\n\ - ldrh r0, [r2]\n\ - adds r1, r4, 0\n\ - ands r1, r0\n\ - ldrb r0, [r5]\n\ - adds r0, 0x34\n\ - orrs r1, r0\n\ - strh r1, [r2]\n\ -_08072488:\n\ - movs r5, 0x80\n\ - lsls r5, 17\n\ - adds r0, r3, r5\n\ - lsrs r3, r0, 24\n\ - asrs r0, 24\n\ - cmp r0, 0x3\n\ - ble _0807243A\n\ -_08072496:\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided"); -} - -#endif // NONMATCHING - -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. @@ -2667,42 +2273,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; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 5078f0dc97..bd13823209 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -705,13 +705,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 = From 97b246368d61bf4e1c72cc1716cc75a91fcdd58c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 26 Dec 2018 19:12:07 +0100 Subject: [PATCH 215/667] Add Contrary --- src/battle_script_commands.c | 43 +++++++++++++++++++++++++++--------- src/battle_util.c | 13 +++++++++++ 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d656d53bf7..14c662723e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3013,34 +3013,51 @@ static void atk1F_jumpifsideaffecting(void) static void atk20_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; } @@ -7690,7 +7707,13 @@ static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr) notProtectAffected++; flags &= ~(STAT_CHANGE_NOT_PROTECT_AFFECTED); - PREPARE_STAT_BUFFER(gBattleTextBuff1, statId) + if (GetBattlerAbility(gActiveBattler) == ABILITY_CONTRARY) + { + statValue ^= STAT_BUFF_NEGATIVE; + gBattleScripting.statChanger ^= STAT_BUFF_NEGATIVE; + } + + PREPARE_STAT_BUFFER(gBattleTextBuff1, statId); if (statValue <= -1) // Stat decrease. { diff --git a/src/battle_util.c b/src/battle_util.c index 8c42efdcfb..4201f59a05 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -500,6 +500,19 @@ 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; + + if (stringId == STRINGID_STATSWONTDECREASE2 && GetBattlerAbility(battler) == ABILITY_CONTRARY) + stringId = STRINGID_STATSWONTINCREASE2; + else if (stringId == STRINGID_STATSWONTINCREASE2 && GetBattlerAbility(battler) == ABILITY_CONTRARY) + stringId = STRINGID_STATSWONTDECREASE2; + gActiveBattler = battler; BtlController_EmitPrintString(0, stringId); MarkBattlerForControllerExec(gActiveBattler); From 78d7c292909e7760bbb476297ab67891318db731 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 5 Jan 2019 16:00:57 +0100 Subject: [PATCH 216/667] Move buffers to allocated reousrces, get rid of old type effectiveness table --- include/battle.h | 4 +- include/battle_main.h | 12 - src/battle_controller_link_opponent.c | 226 ++++++++--------- src/battle_controller_link_partner.c | 222 ++++++++-------- src/battle_controller_opponent.c | 226 ++++++++--------- src/battle_controller_player.c | 294 +++++++++++----------- src/battle_controller_player_partner.c | 222 ++++++++-------- src/battle_controller_recorded_opponent.c | 220 ++++++++-------- src/battle_controller_recorded_player.c | 216 ++++++++-------- src/battle_controller_safari.c | 26 +- src/battle_controller_wally.c | 190 +++++++------- src/battle_controllers.c | 8 +- src/battle_dome.c | 272 +------------------- src/battle_gfx_sfx_util.c | 2 +- src/battle_main.c | 188 +++----------- src/battle_message.c | 4 +- src/battle_script_commands.c | 81 +++--- src/battle_util.c | 4 +- 18 files changed, 1009 insertions(+), 1408 deletions(-) diff --git a/include/battle.h b/include/battle.h index 52ceb5939f..2cda45f364 100644 --- a/include/battle.h +++ b/include/battle.h @@ -349,6 +349,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 @@ -766,8 +768,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; diff --git a/include/battle_main.h b/include/battle_main.h index 08401289bf..583b0ae396 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -24,17 +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 @@ -92,7 +81,6 @@ extern struct UnknownPokemonStruct4 gUnknown_02022FF8[3]; 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[][TYPE_NAME_LENGTH + 1]; extern const struct TrainerMoney gTrainerMoneyTable[]; extern const u8 gAbilityNames[][ABILITY_NAME_LENGTH + 1]; diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index e3d1fd71a4..0f714b6c8f 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -182,8 +182,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(); } @@ -535,7 +535,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 { @@ -550,13 +550,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) @@ -578,7 +578,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); @@ -644,7 +644,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; @@ -659,7 +659,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: @@ -884,13 +884,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) @@ -903,11 +903,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: { @@ -948,10 +948,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++) @@ -965,165 +965,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(); } @@ -1152,8 +1152,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; } @@ -1162,7 +1162,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); @@ -1191,7 +1191,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; @@ -1394,14 +1394,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 { @@ -1418,8 +1418,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) { @@ -1457,7 +1457,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(); } @@ -1471,7 +1471,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; @@ -1518,7 +1518,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) { @@ -1559,8 +1559,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; } } @@ -1618,7 +1618,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(); } @@ -1663,20 +1663,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(); @@ -1692,7 +1692,7 @@ static void LinkOpponentHandleFaintingCry(void) static void LinkOpponentHandleIntroSlide(void) { - HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); + HandleIntroSlide(gBattleResources->bufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; LinkOpponentBufferExecCompleted(); } @@ -1728,15 +1728,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); } @@ -1754,7 +1754,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(); } @@ -1762,7 +1762,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) { @@ -1775,10 +1775,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; @@ -1810,7 +1810,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(); @@ -1820,8 +1820,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(); @@ -1834,7 +1834,7 @@ static void LinkOpponentHandleBattleAnimation(void) static void LinkOpponentHandleLinkStandbyMsg(void) { - sub_81851A8(&gBattleBufferA[gActiveBattler][2]); + sub_81851A8(&gBattleResources->bufferA[gActiveBattler][2]); LinkOpponentBufferExecCompleted(); } @@ -1845,14 +1845,14 @@ 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.field_CA9_b = gBattleBufferA[gActiveBattler][2]; + gSaveBlock2Ptr->frontier.field_CA9_b = gBattleResources->bufferA[gActiveBattler][2]; FadeOutMapMusic(5); BeginFastPaletteFade(3); LinkOpponentBufferExecCompleted(); diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index f23701799a..99f8690127 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -179,8 +179,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(); } @@ -408,7 +408,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 { @@ -435,13 +435,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) @@ -463,7 +463,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); @@ -529,7 +529,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; @@ -544,7 +544,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: @@ -769,13 +769,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) @@ -788,11 +788,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: { @@ -833,10 +833,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++) @@ -850,154 +850,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; } @@ -1006,11 +1006,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(); } @@ -1036,10 +1036,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; } @@ -1048,7 +1048,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)); @@ -1076,7 +1076,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; @@ -1218,14 +1218,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 { @@ -1242,8 +1242,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) { @@ -1281,7 +1281,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(); } @@ -1295,7 +1295,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; @@ -1342,7 +1342,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) { @@ -1383,8 +1383,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; } } @@ -1442,7 +1442,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(); } @@ -1487,20 +1487,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(); @@ -1516,7 +1516,7 @@ static void LinkPartnerHandleFaintingCry(void) static void LinkPartnerHandleIntroSlide(void) { - HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); + HandleIntroSlide(gBattleResources->bufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; LinkPartnerBufferExecCompleted(); } @@ -1582,15 +1582,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; @@ -1603,17 +1603,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; @@ -1645,7 +1645,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(); @@ -1655,8 +1655,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(); @@ -1669,7 +1669,7 @@ static void LinkPartnerHandleBattleAnimation(void) static void LinkPartnerHandleLinkStandbyMsg(void) { - sub_81851A8(&gBattleBufferA[gActiveBattler][2]); + sub_81851A8(&gBattleResources->bufferA[gActiveBattler][2]); LinkPartnerBufferExecCompleted(); } @@ -1680,9 +1680,9 @@ static void LinkPartnerHandleResetActionMoveSelection(void) static void LinkPartnerHandleCmd55(void) { - sub_81851A8(&gBattleBufferA[gActiveBattler][4]); - gBattleOutcome = gBattleBufferA[gActiveBattler][1]; - gSaveBlock2Ptr->frontier.field_CA9_b = gBattleBufferA[gActiveBattler][2]; + sub_81851A8(&gBattleResources->bufferA[gActiveBattler][4]); + gBattleOutcome = gBattleResources->bufferA[gActiveBattler][1]; + gSaveBlock2Ptr->frontier.field_CA9_b = gBattleResources->bufferA[gActiveBattler][2]; FadeOutMapMusic(5); BeginFastPaletteFade(3); LinkPartnerBufferExecCompleted(); diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 234c471444..4a44d9ed86 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -190,8 +190,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(); } @@ -518,7 +518,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 { @@ -533,13 +533,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) @@ -561,7 +561,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); @@ -627,7 +627,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; @@ -642,7 +642,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: @@ -860,14 +860,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(); } @@ -876,13 +876,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) @@ -895,11 +895,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: { @@ -940,10 +940,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++) @@ -957,165 +957,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(); } @@ -1146,8 +1146,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; } @@ -1156,7 +1156,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); @@ -1185,7 +1185,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; @@ -1431,14 +1431,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 { @@ -1454,8 +1454,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) { @@ -1493,7 +1493,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(); } @@ -1507,7 +1507,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; @@ -1540,7 +1540,7 @@ 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)) { @@ -1669,7 +1669,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) { @@ -1710,8 +1710,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; } } @@ -1769,7 +1769,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(); } @@ -1814,20 +1814,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(); @@ -1843,7 +1843,7 @@ static void OpponentHandleFaintingCry(void) static void OpponentHandleIntroSlide(void) { - HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); + HandleIntroSlide(gBattleResources->bufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; OpponentBufferExecCompleted(); } @@ -1886,20 +1886,20 @@ static void sub_8062828(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_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; } @@ -1910,7 +1910,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(); } @@ -1918,7 +1918,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) { @@ -1931,10 +1931,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; @@ -1966,7 +1966,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(); @@ -1976,8 +1976,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(); diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 8a892c0c10..69e8e65fff 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -215,7 +215,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 { @@ -227,8 +227,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(); } @@ -242,7 +242,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); @@ -320,7 +320,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 <= ITEM_PREMIER_BALL) @@ -502,7 +502,7 @@ static void HandleInputChooseTarget(void) static void HandleInputChooseMove(void) { bool32 canSelectTarget = FALSE; - struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBattler][4]); + struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleResources->bufferA[gActiveBattler][4]); if (gMain.heldKeys & DPAD_ANY && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_L_EQUALS_A) gPlayerDpadHoldFrames++; @@ -531,9 +531,9 @@ 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]) + if (moveTarget & MOVE_TARGET_USER_OR_SELECTED && !gBattleResources->bufferA[gActiveBattler][2]) canSelectTarget++; } else // double battle @@ -724,7 +724,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 @@ -1396,7 +1396,7 @@ static void WaitForMonSelection(void) else BtlController_EmitChosenMonReturnValue(1, 6, NULL); - if ((gBattleBufferA[gActiveBattler][1] & 0xF) == 1) + if ((gBattleResources->bufferA[gActiveBattler][1] & 0xF) == 1) PrintLinkStandbyMsg(); PlayerBufferExecCompleted(); @@ -1487,7 +1487,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++) @@ -1511,11 +1511,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[0] = CHAR_SLASH; txtPtr++; @@ -1527,7 +1527,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[0] = EXT_CTRL_CODE_BEGIN; @@ -1620,13 +1620,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) @@ -1648,7 +1648,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); @@ -1714,7 +1714,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; @@ -1729,7 +1729,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: @@ -1947,14 +1947,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(); } @@ -1963,13 +1963,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) @@ -1982,11 +1982,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: { @@ -2027,10 +2027,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++) @@ -2044,154 +2044,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; } @@ -2200,11 +2200,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(); } @@ -2218,12 +2218,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; } @@ -2232,7 +2232,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)); @@ -2260,7 +2260,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; @@ -2470,7 +2470,7 @@ static void PlayerHandleSuccessBallThrowAnim(void) static void PlayerHandleBallThrowAnim(void) { - u8 ballThrowCaseId = gBattleBufferA[gActiveBattler][1]; + u8 ballThrowCaseId = gBattleResources->bufferA[gActiveBattler][1]; gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId; gDoingBattleAnim = TRUE; @@ -2480,7 +2480,7 @@ static void PlayerHandleBallThrowAnim(void) static void PlayerHandlePause(void) { - u8 var = gBattleBufferA[gActiveBattler][1]; + u8 var = gBattleResources->bufferA[gActiveBattler][1]; // WTF is this?? while (var != 0) @@ -2493,14 +2493,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. { @@ -2517,8 +2517,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) { @@ -2556,7 +2556,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(); } @@ -2570,7 +2570,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; @@ -2688,7 +2688,7 @@ static void PlayerHandleChooseItem(void) gBattlerInMenuId = gActiveBattler; for (i = 0; i < 3; i++) - gUnknown_0203CF00[i] = gBattleBufferA[gActiveBattler][1 + i]; + gUnknown_0203CF00[i] = gBattleResources->bufferA[gActiveBattler][1 + i]; } static void PlayerHandleChoosePokemon(void) @@ -2696,9 +2696,9 @@ static void PlayerHandleChoosePokemon(void) s32 i; for (i = 0; i < 3; i++) - gUnknown_0203CF00[i] = gBattleBufferA[gActiveBattler][4 + i]; + gUnknown_0203CF00[i] = gBattleResources->bufferA[gActiveBattler][4 + i]; - if (gBattleTypeFlags & BATTLE_TYPE_ARENA && (gBattleBufferA[gActiveBattler][1] & 0xF) != PARTY_CANT_SWITCH) + if (gBattleTypeFlags & BATTLE_TYPE_ARENA && (gBattleResources->bufferA[gActiveBattler][1] & 0xF) != PARTY_CANT_SWITCH) { BtlController_EmitChosenMonReturnValue(1, gBattlerPartyIndexes[gActiveBattler] + 1, gUnknown_0203CF00); PlayerBufferExecCompleted(); @@ -2706,10 +2706,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, 0); gBattlerControllerFuncs[gActiveBattler] = OpenPartyMenuToChooseMon; gBattlerInMenuId = gActiveBattler; @@ -2728,7 +2728,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); if (hpVal > 0) gUnknown_0203CD70 += hpVal; @@ -2753,7 +2753,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) { @@ -2766,7 +2766,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; @@ -2797,15 +2797,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(); @@ -2818,13 +2818,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; @@ -2845,7 +2845,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(); } @@ -2886,7 +2886,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(); } @@ -2931,20 +2931,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(); @@ -2960,7 +2960,7 @@ static void PlayerHandleFaintingCry(void) static void PlayerHandleIntroSlide(void) { - HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); + HandleIntroSlide(gBattleResources->bufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; PlayerBufferExecCompleted(); } @@ -3019,15 +3019,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; @@ -3040,17 +3040,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; @@ -3084,7 +3084,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(); @@ -3094,8 +3094,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(); @@ -3108,8 +3108,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(); @@ -3127,7 +3127,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; @@ -3145,9 +3145,9 @@ static void PlayerHandleResetActionMoveSelection(void) static void PlayerHandleCmd55(void) { - sub_81851A8(&gBattleBufferA[gActiveBattler][4]); - gBattleOutcome = gBattleBufferA[gActiveBattler][1]; - gSaveBlock2Ptr->frontier.field_CA9_b = gBattleBufferA[gActiveBattler][2]; + sub_81851A8(&gBattleResources->bufferA[gActiveBattler][4]); + gBattleOutcome = gBattleResources->bufferA[gActiveBattler][1]; + gSaveBlock2Ptr->frontier.field_CA9_b = gBattleResources->bufferA[gActiveBattler][2]; FadeOutMapMusic(5); BeginFastPaletteFade(3); PlayerBufferExecCompleted(); diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 06a7f9b301..d1762ed3fb 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -194,8 +194,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(); } @@ -595,7 +595,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 { @@ -622,13 +622,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) @@ -650,7 +650,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); @@ -716,7 +716,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; @@ -731,7 +731,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: @@ -956,13 +956,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) @@ -975,11 +975,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: { @@ -1020,10 +1020,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++) @@ -1037,154 +1037,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; } @@ -1193,11 +1193,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(); } @@ -1223,10 +1223,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; } @@ -1235,7 +1235,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)); @@ -1263,7 +1263,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; @@ -1418,14 +1418,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 { @@ -1441,8 +1441,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) { @@ -1480,7 +1480,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(); } @@ -1494,7 +1494,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; @@ -1519,7 +1519,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(); @@ -1577,7 +1577,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) { @@ -1598,7 +1598,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) { @@ -1611,7 +1611,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; @@ -1642,8 +1642,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; } } @@ -1701,7 +1701,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(); } @@ -1746,20 +1746,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(); @@ -1775,7 +1775,7 @@ static void PlayerPartnerHandleFaintingCry(void) static void PlayerPartnerHandleIntroSlide(void) { - HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); + HandleIntroSlide(gBattleResources->bufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; PlayerPartnerBufferExecCompleted(); } @@ -1839,15 +1839,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; @@ -1860,17 +1860,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; @@ -1902,7 +1902,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(); @@ -1912,8 +1912,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(); @@ -1934,7 +1934,7 @@ static void PlayerPartnerHandleResetActionMoveSelection(void) static void PlayerPartnerHandleCmd55(void) { - gBattleOutcome = gBattleBufferA[gActiveBattler][1]; + gBattleOutcome = gBattleResources->bufferA[gActiveBattler][1]; FadeOutMapMusic(5); BeginFastPaletteFade(3); PlayerPartnerBufferExecCompleted(); diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index 392d79dad4..a379567d0b 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -183,8 +183,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(); } @@ -518,7 +518,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 { @@ -533,13 +533,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) @@ -561,7 +561,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); @@ -627,7 +627,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; @@ -642,7 +642,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: @@ -867,13 +867,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) @@ -886,11 +886,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: { @@ -931,10 +931,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++) @@ -948,165 +948,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(); } @@ -1135,8 +1135,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; } @@ -1145,7 +1145,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); @@ -1173,7 +1173,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; @@ -1322,14 +1322,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 { @@ -1345,8 +1345,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) { @@ -1384,7 +1384,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(); } @@ -1398,7 +1398,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; @@ -1458,7 +1458,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) { @@ -1499,8 +1499,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; } } @@ -1558,7 +1558,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(); } @@ -1603,20 +1603,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(); @@ -1632,7 +1632,7 @@ static void RecordedOpponentHandleFaintingCry(void) static void RecordedOpponentHandleIntroSlide(void) { - HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); + HandleIntroSlide(gBattleResources->bufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; RecordedOpponentBufferExecCompleted(); } @@ -1668,15 +1668,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; } @@ -1694,7 +1694,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(); } @@ -1702,7 +1702,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) { @@ -1715,10 +1715,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; @@ -1750,7 +1750,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(); @@ -1760,8 +1760,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(); @@ -1782,10 +1782,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); diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index 9055fc16bf..99f50b7bab 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -176,8 +176,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(); } @@ -487,7 +487,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 { @@ -514,13 +514,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) @@ -542,7 +542,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); @@ -608,7 +608,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; @@ -623,7 +623,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: @@ -848,13 +848,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) @@ -867,11 +867,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: { @@ -912,10 +912,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++) @@ -929,154 +929,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; } @@ -1085,11 +1085,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(); } @@ -1115,10 +1115,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; } @@ -1127,7 +1127,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)); @@ -1155,7 +1155,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; @@ -1324,14 +1324,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 { @@ -1347,8 +1347,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) { @@ -1386,7 +1386,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(); } @@ -1400,7 +1400,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; @@ -1476,7 +1476,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) { @@ -1518,8 +1518,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; } } @@ -1577,7 +1577,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(); } @@ -1622,20 +1622,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(); @@ -1651,7 +1651,7 @@ static void RecordedPlayerHandleFaintingCry(void) static void RecordedPlayerHandleIntroSlide(void) { - HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); + HandleIntroSlide(gBattleResources->bufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; RecordedPlayerBufferExecCompleted(); } @@ -1706,15 +1706,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; @@ -1727,17 +1727,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; @@ -1769,7 +1769,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(); @@ -1779,8 +1779,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(); @@ -1801,7 +1801,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 04ca2ce46e..eeccfedd76 100644 --- a/src/battle_controller_safari.c +++ b/src/battle_controller_safari.c @@ -166,8 +166,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(); } @@ -305,7 +305,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 { @@ -400,7 +400,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; @@ -424,7 +424,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; @@ -597,20 +597,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(); @@ -626,7 +626,7 @@ static void SafariHandleFaintingCry(void) static void SafariHandleIntroSlide(void) { - HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); + HandleIntroSlide(gBattleResources->bufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; SafariBufferExecCompleted(); } @@ -661,8 +661,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(); @@ -682,7 +682,7 @@ static void SafariHandleResetActionMoveSelection(void) static void SafariHandleCmd55(void) { - gBattleOutcome = gBattleBufferA[gActiveBattler][1]; + gBattleOutcome = gBattleResources->bufferA[gActiveBattler][1]; FadeOutMapMusic(5); BeginFastPaletteFade(3); SafariBufferExecCompleted(); diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c index dc35545979..90ded9a91b 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -183,8 +183,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(); } @@ -411,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 { @@ -432,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) @@ -460,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); @@ -526,7 +526,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; @@ -541,7 +541,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: @@ -766,13 +766,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) @@ -785,11 +785,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: { @@ -830,10 +830,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++) @@ -847,154 +847,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; } @@ -1018,7 +1018,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; @@ -1087,7 +1087,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; @@ -1102,14 +1102,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 { @@ -1125,7 +1125,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) { @@ -1160,7 +1160,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(); } @@ -1174,7 +1174,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; @@ -1268,7 +1268,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) { @@ -1390,20 +1390,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(); @@ -1419,7 +1419,7 @@ static void WallyHandleFaintingCry(void) static void WallyHandleIntroSlide(void) { - HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); + HandleIntroSlide(gBattleResources->bufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; WallyBufferExecCompleted(); } @@ -1459,7 +1459,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)); @@ -1492,7 +1492,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; @@ -1502,14 +1502,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(); } } @@ -1531,8 +1531,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(); @@ -1552,7 +1552,7 @@ static void WallyHandleResetActionMoveSelection(void) static void WallyHandleCmd55(void) { - gBattleOutcome = gBattleBufferA[gActiveBattler][1]; + gBattleOutcome = gBattleResources->bufferA[gActiveBattler][1]; FadeOutMapMusic(5); BeginFastPaletteFade(3); WallyBufferExecCompleted(); diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 675d4edb4b..166fc61199 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -665,14 +665,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; @@ -887,7 +887,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)) @@ -899,7 +899,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]; diff --git a/src/battle_dome.c b/src/battle_dome.c index 696bebb91f..da4666cfcc 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -3010,8 +3010,6 @@ static s32 sub_818FEB4(s32 *arr, bool8 arg1) #define TYPE_x2 40 #define TYPE_x4 80 -// Functionally equivalent, while loop is impossible to match. -#ifdef NONMATCHING static s32 GetTypeEffectivenessPoints(s32 move, s32 targetSpecies, s32 arg2) { s32 defType1, defType2, defAbility, moveType; @@ -3033,26 +3031,15 @@ static s32 GetTypeEffectivenessPoints(s32 move, s32 targetSpecies, s32 arg2) } else { - while (gTypeEffectiveness[i + 0] != TYPE_ENDTABLE) - { - if (gTypeEffectiveness[i + 0] == TYPE_FORESIGHT) - { - i += 3; - } - else - { - u8 val = gTypeEffectiveness[i + 0]; - if (val == moveType) - { - // BUG: * 2 is not necessary and makes the condition always false if the ability is wonder guard. - if (gTypeEffectiveness[i + 1] == defType1 && (defAbility != ABILITY_WONDER_GUARD || gTypeEffectiveness[i + 2] == TYPE_MUL_SUPER_EFFECTIVE * 2)) - typePower = (gTypeEffectiveness[i + 2] * typePower) / 10; - if (gTypeEffectiveness[i + 1] == defType2 && defType1 != defType2 && (defAbility != ABILITY_WONDER_GUARD || gTypeEffectiveness[i + 2] == TYPE_MUL_SUPER_EFFECTIVE * 2)) - typePower = (gTypeEffectiveness[i + 2] * typePower) / 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) @@ -3129,247 +3116,6 @@ static s32 GetTypeEffectivenessPoints(s32 move, s32 targetSpecies, s32 arg2) return typePower; } -#else -NAKED -static s32 GetTypeEffectivenessPoints(s32 move, s32 species, s32 arg2) -{ - asm_unified("\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x8\n\ - adds r3, r0, 0\n\ - adds r4, r1, 0\n\ - str r2, [sp]\n\ - movs r6, 0\n\ - movs r2, 0x14\n\ - cmp r3, 0\n\ - beq _0818FFF0\n\ - ldr r0, =0x0000ffff\n\ - cmp r3, r0\n\ - beq _0818FFF0\n\ - ldr r0, =gBattleMoves\n\ - lsls r1, r3, 1\n\ - adds r1, r3\n\ - lsls r1, 2\n\ - adds r3, r1, r0\n\ - ldrb r0, [r3, 0x1]\n\ - cmp r0, 0\n\ - bne _0818FFFC\n\ -_0818FFF0:\n\ - movs r0, 0\n\ - b _08190156\n\ - .pool\n\ -_0818FFFC:\n\ - ldr r1, =gBaseStats\n\ - lsls r0, r4, 3\n\ - subs r0, r4\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r1, [r0, 0x6]\n\ - mov r10, r1\n\ - ldrb r1, [r0, 0x7]\n\ - mov r9, r1\n\ - ldrb r0, [r0, 0x16]\n\ - mov r8, r0\n\ - ldrb r3, [r3, 0x2]\n\ - str r3, [sp, 0x4]\n\ - cmp r0, 0x1A\n\ - bne _0819002C\n\ - cmp r3, 0x4\n\ - bne _0819002C\n\ - ldr r0, [sp]\n\ - cmp r0, 0x1\n\ - bne _081900AA\n\ - movs r2, 0x8\n\ - b _081900A4\n\ - .pool\n\ -_0819002C:\n\ - ldr r0, =gTypeEffectiveness\n\ - adds r1, r6, r0\n\ - ldrb r0, [r1]\n\ - ldr r7, =gTypeEffectiveness\n\ - cmp r0, 0xFF\n\ - beq _081900A4\n\ - adds r4, r1, 0\n\ -_0819003A:\n\ - ldrb r0, [r4]\n\ - cmp r0, 0xFE\n\ - beq _08190096\n\ - ldrb r0, [r4]\n\ - ldr r1, [sp, 0x4]\n\ - cmp r0, r1\n\ - bne _08190096\n\ - ldrb r0, [r4, 0x1]\n\ - adds r5, r6, 0x1\n\ - cmp r0, r10\n\ - bne _0819006C\n\ - adds r1, r6, 0x2\n\ - mov r0, r8\n\ - cmp r0, 0x19\n\ - bne _0819005E\n\ - ldrb r0, [r4, 0x2]\n\ - cmp r0, 0x28\n\ - bne _0819006C\n\ -_0819005E:\n\ - adds r0, r1, r7\n\ - ldrb r0, [r0]\n\ - muls r0, r2\n\ - movs r1, 0xA\n\ - bl __divsi3\n\ - adds r2, r0, 0\n\ -_0819006C:\n\ - adds r0, r5, r7\n\ - ldrb r0, [r0]\n\ - cmp r0, r9\n\ - bne _08190096\n\ - cmp r10, r9\n\ - beq _08190096\n\ - adds r1, r6, 0x2\n\ - mov r0, r8\n\ - cmp r0, 0x19\n\ - bne _08190088\n\ - adds r0, r1, r7\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x28\n\ - bne _08190096\n\ -_08190088:\n\ - adds r0, r1, r7\n\ - ldrb r0, [r0]\n\ - muls r0, r2\n\ - movs r1, 0xA\n\ - bl __divsi3\n\ - adds r2, r0, 0\n\ -_08190096:\n\ - adds r4, 0x3\n\ - adds r6, 0x3\n\ - ldr r1, =gTypeEffectiveness\n\ - adds r0, r6, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xFF\n\ - bne _0819003A\n\ -_081900A4:\n\ - ldr r0, [sp]\n\ - cmp r0, 0x1\n\ - beq _081900E0\n\ -_081900AA:\n\ - ldr r1, [sp]\n\ - cmp r1, 0x1\n\ - bgt _081900BC\n\ - cmp r1, 0\n\ - beq _081900C4\n\ - b _08190154\n\ - .pool\n\ -_081900BC:\n\ - ldr r0, [sp]\n\ - cmp r0, 0x2\n\ - beq _08190114\n\ - b _08190154\n\ -_081900C4:\n\ - cmp r2, 0xA\n\ - beq _08190146\n\ - cmp r2, 0xA\n\ - ble _08190146\n\ - cmp r2, 0x28\n\ - beq _0819014A\n\ - cmp r2, 0x28\n\ - bgt _081900DA\n\ - cmp r2, 0x14\n\ - beq _08190104\n\ - b _08190146\n\ -_081900DA:\n\ - cmp r2, 0x50\n\ - bne _08190146\n\ - b _08190100\n\ -_081900E0:\n\ - cmp r2, 0xA\n\ - beq _08190104\n\ - cmp r2, 0xA\n\ - bgt _081900F2\n\ - cmp r2, 0\n\ - beq _08190100\n\ - cmp r2, 0x5\n\ - beq _0819014A\n\ - b _08190146\n\ -_081900F2:\n\ - cmp r2, 0x28\n\ - beq _08190108\n\ - cmp r2, 0x28\n\ - ble _08190146\n\ - cmp r2, 0x50\n\ - beq _0819010E\n\ - b _08190146\n\ -_08190100:\n\ - movs r2, 0x8\n\ - b _08190154\n\ -_08190104:\n\ - movs r2, 0x2\n\ - b _08190154\n\ -_08190108:\n\ - movs r2, 0x2\n\ - negs r2, r2\n\ - b _08190154\n\ -_0819010E:\n\ - movs r2, 0x4\n\ - negs r2, r2\n\ - b _08190154\n\ -_08190114:\n\ - cmp r2, 0xA\n\ - beq _08190146\n\ - cmp r2, 0xA\n\ - bgt _08190126\n\ - cmp r2, 0\n\ - beq _0819013A\n\ - cmp r2, 0x5\n\ - beq _08190140\n\ - b _08190146\n\ -_08190126:\n\ - cmp r2, 0x28\n\ - beq _0819014E\n\ - cmp r2, 0x28\n\ - bgt _08190134\n\ - cmp r2, 0x14\n\ - beq _0819014A\n\ - b _08190146\n\ -_08190134:\n\ - cmp r2, 0x50\n\ - beq _08190152\n\ - b _08190146\n\ -_0819013A:\n\ - movs r2, 0x10\n\ - negs r2, r2\n\ - b _08190154\n\ -_08190140:\n\ - movs r2, 0x8\n\ - negs r2, r2\n\ - b _08190154\n\ -_08190146:\n\ - movs r2, 0\n\ - b _08190154\n\ -_0819014A:\n\ - movs r2, 0x4\n\ - b _08190154\n\ -_0819014E:\n\ - movs r2, 0xC\n\ - b _08190154\n\ -_08190152:\n\ - movs r2, 0x14\n\ -_08190154:\n\ - adds r0, r2, 0\n\ -_08190156:\n\ - add sp, 0x8\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - "); -} -#endif // NONMATCHING static u8 GetDomeTrainerMonIvs(u16 trainerId) { diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index e4a0ff76f6..0cd7bd4c2b 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -120,7 +120,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; diff --git a/src/battle_main.c b/src/battle_main.c index 6202eadce1..d7c47ea78f 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -158,8 +158,6 @@ EWRAM_DATA struct UnknownPokemonStruct4 gUnknown_02022FF8[3] = {0}; // what is i EWRAM_DATA struct UnknownPokemonStruct4* gUnknown_02023058 = NULL; // what is it used for? 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; @@ -327,128 +325,6 @@ 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[][TYPE_NAME_LENGTH + 1] = { _("NORMAL"), @@ -3382,7 +3258,7 @@ static void DoBattleIntro(void) } else { - memcpy(&gBattleMons[gActiveBattler], &gBattleBufferB[gActiveBattler][4], sizeof(struct BattlePokemon)); + 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; @@ -4001,7 +3877,7 @@ static void HandleTurnActionSelectionState(void) } 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]++; } @@ -4011,10 +3887,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()) @@ -4022,7 +3898,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) @@ -4165,7 +4041,7 @@ static void HandleTurnActionSelectionState(void) 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; @@ -4175,13 +4051,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; @@ -4201,7 +4077,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: @@ -4210,7 +4086,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; @@ -4218,7 +4094,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); @@ -4228,7 +4104,7 @@ static void HandleTurnActionSelectionState(void) RecordedBattle_ClearBattlerAction(gActiveBattler, 1); gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT; *(gBattleStruct->selectionScriptFinished + gActiveBattler) = FALSE; - gBattleBufferB[gActiveBattler][1] = 0; + gBattleResources->bufferB[gActiveBattler][1] = 0; *(gBattleStruct->stateIdAfterSelScript + gActiveBattler) = STATE_WAIT_ACTION_CHOSEN; return; } @@ -4236,13 +4112,13 @@ 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] & ~(RET_MEGA_EVOLUTION); + *(gBattleStruct->chosenMovePositions + gActiveBattler) = gBattleResources->bufferB[gActiveBattler][2] & ~(RET_MEGA_EVOLUTION); gChosenMoveByBattler[gActiveBattler] = gBattleMons[gActiveBattler].moves[*(gBattleStruct->chosenMovePositions + gActiveBattler)]; - *(gBattleStruct->moveTarget + gActiveBattler) = gBattleBufferB[gActiveBattler][3]; - if (gBattleBufferB[gActiveBattler][2] & RET_MEGA_EVOLUTION) + *(gBattleStruct->moveTarget + gActiveBattler) = gBattleResources->bufferB[gActiveBattler][3]; + if (gBattleResources->bufferB[gActiveBattler][2] & RET_MEGA_EVOLUTION) gBattleStruct->mega.toEvolve |= gBitTable[gActiveBattler]; gBattleCommunication[gActiveBattler]++; } @@ -4250,20 +4126,20 @@ static void HandleTurnActionSelectionState(void) } 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); @@ -4285,7 +4161,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]++; } @@ -4363,7 +4239,7 @@ static void HandleTurnActionSelectionState(void) case STATE_SELECTION_SCRIPT_MAY_RUN: if (*(gBattleStruct->selectionScriptFinished + gActiveBattler)) { - if (gBattleBufferB[gActiveBattler][1] == 13) + if (gBattleResources->bufferB[gActiveBattler][1] == 13) { gHitMarker |= HITMARKER_RUN; gChosenActionByBattler[gActiveBattler] = B_ACTION_RUN; @@ -4424,18 +4300,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]; } } @@ -5544,7 +5420,7 @@ static void HandleAction_UseItem(void) 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 <= ITEM_PREMIER_BALL) // is ball { @@ -5777,8 +5653,8 @@ static 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++; diff --git a/src/battle_message.c b/src/battle_message.c index 26ef9a6158..d08e52cf27 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -2255,7 +2255,7 @@ 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; @@ -3420,7 +3420,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]]); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 41b9d1c4e4..dcea263225 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3288,7 +3288,7 @@ static void atk23_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->statsBeforeLvlUp->hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MAX_HP); @@ -3309,7 +3309,7 @@ static void atk23_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) @@ -3322,7 +3322,7 @@ static void atk23_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], 0); // update battle mon structure after level up @@ -4487,7 +4487,7 @@ static void atk4D_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; @@ -4893,7 +4893,7 @@ static void atk50_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)); @@ -4909,7 +4909,7 @@ static void atk50_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)); @@ -5020,12 +5020,12 @@ static void atk51_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]; } } @@ -5038,23 +5038,23 @@ static void atk51_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) { @@ -5066,7 +5066,7 @@ static void atk51_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; } @@ -5571,7 +5571,7 @@ static void atk5E(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]; @@ -8823,45 +8823,36 @@ static void atkA6_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; } } diff --git a/src/battle_util.c b/src/battle_util.c index 4201f59a05..5dca40426b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -629,7 +629,7 @@ static bool32 IsHealBlockPreventingMove(u8 battler, u32 move) u8 TrySetCantSelectMoveBattleScript(void) { u8 limitations = 0; - u8 moveId = gBattleBufferB[gActiveBattler][2] & ~(RET_MEGA_EVOLUTION); + 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]; @@ -5735,7 +5735,7 @@ bool32 CanMegaEvolve(u8 battlerId) struct Pokemon *mon; u8 battlerPosition = GetBattlerPosition(battlerId); u8 partnerPosition = GetBattlerPosition(BATTLE_PARTNER(battlerId)); - struct MegaEvolutionData *mega = &(((struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBattler][4]))->mega); + struct MegaEvolutionData *mega = &(((struct ChooseMoveStruct*)(&gBattleResources->bufferA[gActiveBattler][4]))->mega); // Check if trainer already mega evolved a pokemon. if (mega->alreadyEvolved[battlerPosition]) From 81fe0a13390a7c733ed797e92802d09dd1fff776 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 5 Jan 2019 16:02:58 +0100 Subject: [PATCH 217/667] Encore lasts always 3 turns --- src/battle_script_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index dcea263225..a6131fdd27 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8775,7 +8775,7 @@ static void atkA4_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; } From b667c20d809af266ae4392abeb0d1d136c060487 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 5 Jan 2019 18:52:33 +0100 Subject: [PATCH 218/667] Remove unused vars in battle main.c --- include/battle.h | 1 - src/battle_main.c | 9 --------- 2 files changed, 10 deletions(-) diff --git a/include/battle.h b/include/battle.h index 2cda45f364..2be3e3758d 100644 --- a/include/battle.h +++ b/include/battle.h @@ -798,7 +798,6 @@ extern u8 gAbsentBattlerFlags; 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]; diff --git a/src/battle_main.c b/src/battle_main.c index d7c47ea78f..438c680dbc 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -188,7 +188,6 @@ EWRAM_DATA u8 gAbsentBattlerFlags = 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}; @@ -203,7 +202,6 @@ EWRAM_DATA u8 gLastHitBy[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gChosenMoveByBattler[MAX_BATTLERS_COUNT] = {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 u32 gSideStatuses[2] = {0}; @@ -317,12 +315,6 @@ 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}; const u8 gTypeNames[][TYPE_NAME_LENGTH + 1] = @@ -2888,7 +2880,6 @@ static void BattleStartClearSetData(void) dataPtr[j] = 0; gDisableStructs[i].isFirstTurn = 2; - sUnusedBattlersArray[i] = 0; gLastMoves[i] = 0; gLastLandedMoves[i] = 0; gLastHitByType[i] = 0; From aecc87447a1743542be9dce915d7db3429faeb11 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 5 Jan 2019 19:02:01 +0100 Subject: [PATCH 219/667] Use more damage look-up tables --- src/battle_util.c | 91 ++++++++++++++++++----------------------------- 1 file changed, 35 insertions(+), 56 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 5dca40426b..780efa649f 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -98,32 +98,6 @@ static const u8 sAbilitiesAffectedByMoldBreaker[] = [ABILITY_WATER_BUBBLE] = 1, }; -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 u16 sSpeedDiffToDmgTable[] = -{ - 40, 60, 80, 120, 150 -}; - static const u8 sHoldEffectToType[][2] = { {HOLD_EFFECT_BUG_POWER, TYPE_BUG}, @@ -4658,6 +4632,31 @@ 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}; + static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) { u32 i; @@ -4753,24 +4752,10 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) i = GetBattleMonMoveSlot(&gBattleMons[battlerAtk], move); if (i != 4) { - switch (gBattleMons[battlerAtk].pp[i]) - { - case 0: - basePower = 200; - break; - case 1: - basePower = 80; - break; - case 2: - basePower = 60; - break; - case 3: - basePower = 50; - break; - default: - basePower = 40; - break; - } + if (gBattleMons[battlerAtk].pp[i] >= ARRAY_COUNT(sTrumpCardPowerTable)) + basePower = sTrumpCardPowerTable[ARRAY_COUNT(sTrumpCardPowerTable) - 1]; + else + basePower = sTrumpCardPowerTable[i]; } break; case EFFECT_ACROBATICS: @@ -4791,16 +4776,10 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) break; case EFFECT_HEAT_CRASH: weight = GetBattlerWeight(battlerAtk) / GetBattlerWeight(battlerDef); - if (weight >= 5) - basePower = 120; - else if (weight == 4) - basePower = 100; - else if (weight == 3) - basePower = 80; - else if (weight == 2) - basePower = 60; + if (weight >= ARRAY_COUNT(sHeatCrushPowerTable)) + basePower = sHeatCrushPowerTable[ARRAY_COUNT(sHeatCrushPowerTable) - 1]; else - basePower = 40; + basePower = sHeatCrushPowerTable[i]; break; case EFFECT_PUNISHMENT: basePower = 60 + (CountBattlerStatIncreases(battlerAtk, FALSE) * 20); @@ -4812,9 +4791,9 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) break; case EFFECT_ELECTRO_BALL: speed = GetBattlerTotalSpeedStat(battlerAtk) / GetBattlerTotalSpeedStat(battlerDef); - if (speed >= ARRAY_COUNT(sSpeedDiffToDmgTable)) - speed = ARRAY_COUNT(sSpeedDiffToDmgTable) - 1; - basePower = sSpeedDiffToDmgTable[speed]; + 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; From 8c73045fd6dc9fe135508a8bf9487e20e199f6d3 Mon Sep 17 00:00:00 2001 From: Karathan Date: Sat, 12 Jan 2019 04:50:33 +0100 Subject: [PATCH 220/667] add brave bird animation --- data/battle_anim_scripts.s | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 0859f8012c..cab0750c4d 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1565,6 +1565,26 @@ Move_ENERGY_BALL: end Move_BRAVE_BIRD: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_BIRD + call SetFlyingBg + monbg ANIM_ATTACKER + createvisualtask sub_8116620, 10, 2, 0, 0, 16, RGB_WHITE + delay 4 + createvisualtask sub_81136E8, 5, 0 + waitforvisualfinish + createvisualtask sub_8159244, 5, 238, SOUND_PAN_ATTACKER + createsprite gUnknown_08596514, ANIM_TARGET, 2 + delay 14 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 10, 0, 18, 1 + createvisualtask sub_8159210, 5, 141, SOUND_PAN_TARGET + delay 20 + createvisualtask sub_81137E4, 5, 1 + delay 2 + createvisualtask sub_8116620, 10, 2, 0, 15, 0, RGB_WHITE + waitforvisualfinish + clearmonbg ANIM_ATTACKER + call UnsetFlyingBg end Move_EARTH_POWER: From 832c0d63334904171f43285888fe688cbcc2ef8f Mon Sep 17 00:00:00 2001 From: Karathan Date: Sat, 12 Jan 2019 15:59:35 +0100 Subject: [PATCH 221/667] add toxic spike animation --- data/battle_anim_scripts.s | 17 +++++++++++++++++ .../battle_anims/sprites/toxicspike_color.png | Bin 0 -> 214 bytes include/constants/battle_anim.h | 1 + include/graphics.h | 1 + src/battle_anim.c | 2 ++ src/battle_anim_effects_3.c | 11 +++++++++++ src/graphics.c | 2 ++ 7 files changed, 34 insertions(+) create mode 100644 graphics/battle_anims/sprites/toxicspike_color.png diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index cab0750c4d..09639da00e 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1222,6 +1222,23 @@ Move_SUCKER_PUNCH: end Move_TOXIC_SPIKES: + loadspritegfx ANIM_TAG_TOXIC_SPIKES + loadspritegfx ANIM_TAG_POISON_BUBBLE + monbg ANIM_DEF_PARTNER + playsewithpan SE_W026, SOUND_PAN_ATTACKER + waitplaysewithpan SE_W030, SOUND_PAN_TARGET, 28 + createsprite gToxicSpikesSpriteTemplate, ANIM_TARGET, 2, 20, 0, 0, 24, 30 + delay 10 + playsewithpan SE_W026, SOUND_PAN_ATTACKER + waitplaysewithpan SE_W030, SOUND_PAN_TARGET, 28 + createsprite gToxicSpikesSpriteTemplate, ANIM_TARGET, 2, 20, 0, -24, 24, 30 + delay 10 + waitplaysewithpan SE_W030, 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: diff --git a/graphics/battle_anims/sprites/toxicspike_color.png b/graphics/battle_anims/sprites/toxicspike_color.png new file mode 100644 index 0000000000000000000000000000000000000000..3102949fd5867f7814330fccbb6d49d86f6dedaf GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDU{l@Sg$P5Y!TC!xx|NsAw zZYf?eB`Dvr*+(Ktm%;1o*`v+P%|Hcka7Il*63F2!@Q5sCVBi)8VMc~ob0mO*>?NMQ zuI!H)dH6K=-<&(W6)0rs>Eal|aXmTV0Nahugem?FhEfZRp3cqa`P9|NDbP66_<++> sS)Mt@4Nh-F9r&L6u(fe*usX+CFq<*bmgiJnO*z Date: Sat, 12 Jan 2019 16:18:50 +0100 Subject: [PATCH 222/667] add seed bomb animation --- data/battle_anim_scripts.s | 46 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 09639da00e..9fa1aa9de9 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1507,6 +1507,52 @@ Move_AQUA_TAIL: end Move_SEED_BOMB: + loadspritegfx ANIM_TAG_SEED + loadspritegfx ANIM_TAG_EXPLOSION + createsprite gUnknown_0859351C, ANIM_TARGET, 2, 20, 0 + delay 5 + createsprite gUnknown_0859351C, ANIM_TARGET, 2, 20, 0 + delay 5 + createsprite gUnknown_0859351C, ANIM_TARGET, 2, 20, 0 + delay 5 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 30, 1 + createsprite gUnknown_0859351C, ANIM_TARGET, 2, 20, 0 + playsewithpan SE_W120, SOUND_PAN_TARGET + createsprite gBattleAnimSpriteTemplate_859371C, ANIM_TARGET, 4, 6, 5, 1, 0 + delay 6 + createsprite gUnknown_0859351C, ANIM_TARGET, 2, 20, 0 + playsewithpan SE_W120, SOUND_PAN_TARGET + createsprite gBattleAnimSpriteTemplate_859371C, ANIM_TARGET, 4, -16, -15, 1, 0 + delay 6 + createsprite gUnknown_0859351C, ANIM_TARGET, 2, 20, 0 + playsewithpan SE_W120, SOUND_PAN_TARGET + createsprite gBattleAnimSpriteTemplate_859371C, ANIM_TARGET, 4, 16, -5, 1, 0 + delay 6 + createsprite gUnknown_0859351C, ANIM_TARGET, 2, 20, 0 + playsewithpan SE_W120, SOUND_PAN_TARGET + createsprite gBattleAnimSpriteTemplate_859371C, ANIM_TARGET, 4, -12, 18, 1, 0 + delay 6 + createsprite gUnknown_0859351C, ANIM_TARGET, 2, 20, 0 + playsewithpan SE_W120, SOUND_PAN_TARGET + createsprite gBattleAnimSpriteTemplate_859371C, ANIM_TARGET, 4, 0, 5, 1, 0 + delay 6 + createsprite gUnknown_0859351C, ANIM_TARGET, 2, 20, 0 + playsewithpan SE_W120, SOUND_PAN_TARGET + createsprite gBattleAnimSpriteTemplate_859371C, ANIM_TARGET, 4, 6, 5, 1, 0 + delay 6 + createsprite gUnknown_0859351C, ANIM_TARGET, 2, 20, 0 + playsewithpan SE_W120, SOUND_PAN_TARGET + createsprite gBattleAnimSpriteTemplate_859371C, ANIM_TARGET, 4, -16, -15, 1, 0 + delay 6 + createsprite gBattleAnimSpriteTemplate_859371C, ANIM_TARGET, 4, 16, -5, 1, 0 + playsewithpan SE_W120, SOUND_PAN_TARGET + delay 6 + playsewithpan SE_W120, SOUND_PAN_TARGET + createsprite gBattleAnimSpriteTemplate_859371C, ANIM_TARGET, 4, -12, 18, 1, 0 + delay 6 + playsewithpan SE_W120, SOUND_PAN_TARGET + createsprite gBattleAnimSpriteTemplate_859371C, ANIM_TARGET, 4, 0, 5, 1, 0 + waitforvisualfinish end Move_AIR_SLASH: From 768af79b362c7d3cc3a2dfbce5f2c4537c51de64 Mon Sep 17 00:00:00 2001 From: Karathan Date: Sat, 12 Jan 2019 16:31:56 +0100 Subject: [PATCH 223/667] add ice fang animation --- data/battle_anim_scripts.s | 64 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 9fa1aa9de9..d67f272512 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1675,12 +1675,76 @@ Move_SHADOW_CLAW: end Move_THUNDER_FANG: + loadspritegfx ANIM_TAG_SHARP_TEETH + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_W044, SOUND_PAN_TARGET + createsprite gUnknown_08597080, ANIM_ATTACKER, 2, 0, -32, 0, 0, 819, 10 + createsprite gUnknown_08597080, ANIM_ATTACKER, 2, 0, 32, 4, 0, -819, 10 + delay 10 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 2 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 4, 7, 1 + 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 sub_8116620, 10, 4, 2, 0, 9, RGB(12, 26, 31) + delay 20 + playsewithpan SE_W081, SOUND_PAN_TARGET + createsprite gUnknown_08595AE8, ANIM_ATTACKER, 2, 0 + createsprite gUnknown_08595AE8, ANIM_ATTACKER, 2, 64 + createsprite gUnknown_08595AE8, ANIM_ATTACKER, 2, 128 + createsprite gUnknown_08595AE8, ANIM_ATTACKER, 2, 192 + delay 5 + createsprite gUnknown_08595AD0, ANIM_ATTACKER, 2, 32 + createsprite gUnknown_08595AD0, ANIM_ATTACKER, 2, 96 + createsprite gUnknown_08595AD0, ANIM_ATTACKER, 2, 160 + createsprite gUnknown_08595AD0, ANIM_ATTACKER, 2, 224 + + playsewithpan SE_W044, SOUND_PAN_TARGET + createsprite gUnknown_08597080, ANIM_ATTACKER, 2, 0, -32, 0, 0, 819, 10 + createsprite gUnknown_08597080, 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 FreezeEffect1 + delay 5 + createvisualtask sub_8116620, 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_SHARP_TEETH + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_W044, SOUND_PAN_TARGET + createsprite gUnknown_08597080, ANIM_ATTACKER, 2, 0, -32, 0, 0, 819, 10 + createsprite gUnknown_08597080, ANIM_ATTACKER, 2, 0, 32, 4, 0, -819, 10 + delay 10 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 2 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 4, 7, 1 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + delay 1 end Move_SHADOW_SNEAK: From 74ae0a6e83fbaf674a1e25475f7d0e3ab9751719 Mon Sep 17 00:00:00 2001 From: Karathan Date: Sat, 12 Jan 2019 16:55:13 +0100 Subject: [PATCH 224/667] add thunder fang and fire fang animations --- data/battle_anim_scripts.s | 42 +++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index d67f272512..68471a0522 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1675,16 +1675,34 @@ Move_SHADOW_CLAW: end Move_THUNDER_FANG: - loadspritegfx ANIM_TAG_SHARP_TEETH + 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 sub_8115F10, 2, 257, 257, 257 + delay 1 + createsprite gUnknown_085956C0, ANIM_TARGET, 2, 0, -48 + delay 1 + createsprite gUnknown_085956C0, ANIM_ATTACKER, 2, 0, -16 + delay 1 + createsprite gUnknown_085956C0, ANIM_ATTACKER, 2, 0, 16 + delay 1 playsewithpan SE_W044, SOUND_PAN_TARGET createsprite gUnknown_08597080, ANIM_ATTACKER, 2, 0, -32, 0, 0, 819, 10 createsprite gUnknown_08597080, ANIM_ATTACKER, 2, 0, 32, 4, 0, -819, 10 - delay 10 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 2 - createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 4, 7, 1 + delay 1 + playsewithpan SE_W161B, SOUND_PAN_TARGET + createvisualtask sub_8115F10, 2, 257, 257, 257 + 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 @@ -1692,7 +1710,6 @@ Move_THUNDER_FANG: end Move_ICE_FANG: - monbg ANIM_TARGET setalpha 12, 8 loadspritegfx ANIM_TAG_ICE_CRYSTALS @@ -1711,7 +1728,6 @@ Move_ICE_FANG: createsprite gUnknown_08595AD0, ANIM_ATTACKER, 2, 96 createsprite gUnknown_08595AD0, ANIM_ATTACKER, 2, 160 createsprite gUnknown_08595AD0, ANIM_ATTACKER, 2, 224 - playsewithpan SE_W044, SOUND_PAN_TARGET createsprite gUnknown_08597080, ANIM_ATTACKER, 2, 0, -32, 0, 0, 819, 10 createsprite gUnknown_08597080, ANIM_ATTACKER, 2, 0, 32, 4, 0, -819, 10 @@ -1731,16 +1747,28 @@ Move_ICE_FANG: end Move_FIRE_FANG: + loadspritegfx ANIM_TAG_SMALL_EMBER loadspritegfx ANIM_TAG_SHARP_TEETH loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET setalpha 12, 8 - playsewithpan SE_W044, SOUND_PAN_TARGET + createvisualtask sub_8116620, 10, 4, 2, 0, 9, RGB_RED + createsprite gUnknown_08595368, ANIM_TARGET, 1, 0 + createsprite gUnknown_08595368, ANIM_TARGET, 1, 64 + createsprite gUnknown_08595368, ANIM_TARGET, 1, 128 + createsprite gUnknown_08595368, ANIM_TARGET, 1, 196 createsprite gUnknown_08597080, ANIM_ATTACKER, 2, 0, -32, 0, 0, 819, 10 createsprite gUnknown_08597080, ANIM_ATTACKER, 2, 0, 32, 4, 0, -819, 10 + playsewithpan SE_W044, 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 FireMoveEffect + delay 4 + playsewithpan SE_W007, SOUND_PAN_TARGET + waitforvisualfinish + createvisualtask sub_8116620, 10, 4, 0, 9, 0, RGB_RED waitforvisualfinish clearmonbg ANIM_TARGET blendoff From 3a5e5d04e7d180b8de42a4b27d3e4e50e2869b91 Mon Sep 17 00:00:00 2001 From: SBird1337 Date: Sun, 13 Jan 2019 01:21:05 +0100 Subject: [PATCH 225/667] add iceshard --- data/battle_anim_scripts.s | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 68471a0522..a6c1230b3e 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1669,6 +1669,39 @@ Move_AVALANCHE: end Move_ICE_SHARD: + monbg ANIM_TARGET + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + loadspritegfx ANIM_TAG_ICE_CRYSTALS + fadetobg BG_ICE + waitbgfadein + createsoundtask sub_8158C58, 183, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 4, 4, 0, 10 + createsprite gUnknown_08595B2C, ANIM_ATTACKER, 2, -20, 70, 0, 42, 35 + createsprite gUnknown_08595B14, ANIM_ATTACKER, 2, -20, 58, 0, 30, 35 + createsprite gUnknown_08595B2C, ANIM_ATTACKER, 2, -20, -12, 0, 22, 40 + createsprite gUnknown_08595B14, ANIM_ATTACKER, 2, -20, 0, 0, 10, 40 + delay 5 + createsprite gUnknown_08595B2C, ANIM_ATTACKER, 2, -10, -30, 10, -12, 45 + createsprite gUnknown_08595B14, ANIM_ATTACKER, 2, -10, -42, 10, -24, 45 + createsprite gUnknown_08595B2C, ANIM_ATTACKER, 2, -10, -20, 10, -36, 45 + createsprite gUnknown_08595B14, ANIM_ATTACKER, 2, -10, -32, 10, -24, 45 + delay 5 + createsprite gUnknown_08595B2C, ANIM_ATTACKER, 2, 0, 10, 20, 22, 45 + createsprite gUnknown_08595B14, ANIM_ATTACKER, 2, 0, -2, 20, 10, 45 + createsprite gUnknown_08595B2C, ANIM_ATTACKER, 2, 0, 20, 20, -2, 30 + createsprite gUnknown_08595B14, 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 FreezeEffect1 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 4, 5, 7, 0, RGB(0, 20, 31) + waitforvisualfinish + restorebg + waitbgfadein + clearmonbg ANIM_TARGET + blendoff end Move_SHADOW_CLAW: From cb617401a6aa74a969676272ac33530f0940b756 Mon Sep 17 00:00:00 2001 From: Karathan Date: Sun, 13 Jan 2019 17:03:23 +0100 Subject: [PATCH 226/667] add air slash --- data/battle_anim_scripts.s | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index a6c1230b3e..ad287c8d08 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1556,6 +1556,19 @@ Move_SEED_BOMB: end Move_AIR_SLASH: + loadspritegfx ANIM_TAG_CUT + monbg ANIM_TARGET + setalpha 12, 8 + call SetFlyingBg + playsewithpan SE_W015, SOUND_PAN_TARGET + createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 0 + delay 5 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + waitforvisualfinish + call UnsetFlyingBg end Move_XSCISSOR: From bb38edad23f40553249576b579835a8d8fdadd38 Mon Sep 17 00:00:00 2001 From: Karathan Date: Sun, 13 Jan 2019 19:13:37 +0100 Subject: [PATCH 227/667] add x-scissor animation --- data/battle_anim_scripts.s | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index ad287c8d08..d12ec9ad33 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1556,22 +1556,34 @@ Move_SEED_BOMB: end Move_AIR_SLASH: - loadspritegfx ANIM_TAG_CUT - monbg ANIM_TARGET - setalpha 12, 8 + loadspritegfx ANIM_TAG_SLASH call SetFlyingBg - playsewithpan SE_W015, SOUND_PAN_TARGET - createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 0 - delay 5 - createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1 - waitforvisualfinish - clearmonbg ANIM_TARGET - blendoff + createsprite gUnknown_08592D2C, ANIM_TARGET, 2, 1, -8, 0 + playsewithpan SE_W013, SOUND_PAN_TARGET + delay 4 + createsprite gUnknown_08592D2C, ANIM_TARGET, 2, 1, 8, 0 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 18, 1 + playsewithpan SE_W013, SOUND_PAN_TARGET waitforvisualfinish call UnsetFlyingBg end Move_XSCISSOR: + loadspritegfx ANIM_TAG_CUT + monbg ANIM_TARGET + setalpha 12, 8 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 1, 5 + createvisualtask sub_81169C0, 2, 0, 4, 7, 3 + createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 0 + createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 1 + playsewithpan SE_W013B, 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_W013, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff end Move_BUG_BUZZ: From 200f0a09d32884cd9746f783ee525b3c638e2d24 Mon Sep 17 00:00:00 2001 From: Karathan Date: Sun, 13 Jan 2019 19:35:29 +0100 Subject: [PATCH 228/667] add sticky web --- data/battle_anim_scripts.s | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index d12ec9ad33..ee2dc8c12c 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -2251,6 +2251,41 @@ Move_ROTOTILLER: 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_W081, SOUND_PAN_ATTACKER, 9, 6 + call SpiderWeb1 + call SpiderWeb1 + call SpiderWeb1 + call SpiderWeb1 + call SpiderWeb1 + call SpiderWeb1 + call SpiderWeb1 + call SpiderWeb1 + call SpiderWeb1 + call SpiderWeb1 + call SpiderWeb1 + call SpiderWeb1 + call SpiderWeb1 + call SpiderWeb1 + waitforvisualfinish + playsewithpan SE_W081B, SOUND_PAN_TARGET + createsprite gUnknown_08596A2C, ANIM_ATTACKER, 2, 0, 0 + delay 50 + playsewithpan SE_W081B, SOUND_PAN_TARGET + createsprite gUnknown_08596A2C, ANIM_ATTACKER, 2, -30, 30 + delay 50 + playsewithpan SE_W081B, SOUND_PAN_TARGET + createsprite gUnknown_08596A2C, ANIM_ATTACKER, 2, 30, -30 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + delay 1 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, 1, 2, 9, 0, RGB_BLACK end Move_FELL_STINGER: @@ -9500,7 +9535,7 @@ Move_SPIDER_WEB: call SpiderWeb1 waitforvisualfinish playsewithpan SE_W081B, SOUND_PAN_TARGET - createsprite gUnknown_08596A2C, ANIM_ATTACKER, 2 + createsprite gUnknown_08596A2C, ANIM_ATTACKER, 2, 0, 0 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER delay 1 From 5ad85f0d557a9784b6d6b61d0c67a37462f65d80 Mon Sep 17 00:00:00 2001 From: Karathan Date: Mon, 14 Jan 2019 00:21:36 +0100 Subject: [PATCH 229/667] add bullet punch animation --- data/battle_anim_scripts.s | 51 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index ee2dc8c12c..ce79175a47 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1688,6 +1688,57 @@ Move_NASTY_PLOT: 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_W004, 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_W004, 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_W004, 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_W004, 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_W004, 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_W004, 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_W004, 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_W004, 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_W004, 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_W004, SOUND_PAN_TARGET + delay 2 + waitforvisualfinish + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 9, 0, 8, 1 + playsewithpan SE_W004, SOUND_PAN_TARGET + waitforvisualfinish + + clearmonbg ANIM_TARGET + blendoff end Move_AVALANCHE: From 0f19f969c950751867e7ddc75da20dbcc0536f99 Mon Sep 17 00:00:00 2001 From: Karathan Date: Tue, 15 Jan 2019 01:11:34 +0100 Subject: [PATCH 230/667] modify net animation for sticky web --- src/bug.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/bug.c b/src/bug.c index 31d1a97405..fee1eda458 100644 --- a/src/bug.c +++ b/src/bug.c @@ -317,7 +317,12 @@ void sub_811067C(struct Sprite *sprite) { SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); + if (GetBattlerSide(gBattleAnimAttacker)) + sprite->pos1.x -= gBattleAnimArgs[0]; + else + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; sprite->data[0] = 16; sprite->callback = sub_81106A4; } From fac9631235cba72d2741df2f916163fc6e2e6eb0 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 19 Jan 2019 11:22:49 +0100 Subject: [PATCH 231/667] Fix Sandstorm raining --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 780efa649f..378a56c335 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2723,7 +2723,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA case ABILITY_SAND_STREAM: if (TryChangeBattleWeather(battler, ENUM_WEATHER_SANDSTORM, TRUE)) { - BattleScriptPushCursorAndCallback(BattleScript_DrizzleActivates); + BattleScriptPushCursorAndCallback(BattleScript_SandstreamActivates); gBattleScripting.battler = battler; effect++; } From 6653ecf676d5bd435ea6417cf21419fff219d696 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 27 Jan 2019 11:47:36 +0100 Subject: [PATCH 232/667] Fix Safari zone bug --- src/battle_util.c | 2 +- src/wild_encounter.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 378a56c335..b230b8b124 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2547,7 +2547,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA u8 target1; if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - return; + return 0; if (gBattlerAttacker >= gBattlersCount) gBattlerAttacker = battler; diff --git a/src/wild_encounter.c b/src/wild_encounter.c index 2a5e2c609b..cdc602f060 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -584,7 +584,7 @@ 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) { - if (USE_BATTLE_DEBUG && GetMonsStateToDoubles() == PLAYER_HAS_TWO_USABLE_MONS) + 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); From 88b788bfabc689b7b152bd5be6ff49bdddac475b Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 27 Jan 2019 11:57:13 +0100 Subject: [PATCH 233/667] Fix Charge Beam effect --- data/battle_scripts_1.s | 5 +++++ include/constants/battle_move_effects.h | 1 + src/data/battle_moves.h | 4 ++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 23c20f8d77..755ae22d19 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -340,6 +340,11 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectAcupressure .4byte BattleScript_EffectAromaticMist .4byte BattleScript_EffectPowder + .4byte BattleScript_EffectSpAtkUpHit + +BattleScript_EffectSpAtkUpHit: + setmoveeffect MOVE_EFFECT_SP_ATK_PLUS_1 | MOVE_EFFECT_AFFECTS_USER + goto BattleScript_EffectHit BattleScript_EffectPowder: attackcanceler diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 31ffec84ea..db4ea0a1f6 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -328,5 +328,6 @@ #define EFFECT_ACUPRESSURE 322 #define EFFECT_AROMATIC_MIST 323 #define EFFECT_POWDER 324 +#define EFFECT_SP_ATTACK_UP_HIT 325 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 4ea7c9f85a..fc771a4f38 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -6325,7 +6325,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_CHARGE_BEAM] = { - .effect = EFFECT_SPECIAL_ATTACK_UP, + .effect = EFFECT_SP_ATTACK_UP_HIT, .power = 50, .type = TYPE_ELECTRIC, .accuracy = 90, @@ -7741,7 +7741,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_FIERY_DANCE] = { - .effect = EFFECT_SPECIAL_ATTACK_UP, + .effect = EFFECT_SP_ATTACK_UP_HIT, .power = 80, .type = TYPE_FIRE, .accuracy = 100, From abd518b66802c214f1aa545f1329a63d40a2dba7 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 27 Jan 2019 13:52:02 +0100 Subject: [PATCH 234/667] Refactor GF's idiotic coding --- include/battle.h | 16 +--- src/battle_main.c | 145 ++++++++++------------------------- src/battle_script_commands.c | 77 +++++-------------- src/battle_util.c | 19 ++--- 4 files changed, 70 insertions(+), 187 deletions(-) diff --git a/include/battle.h b/include/battle.h index 2be3e3758d..10bedf6399 100644 --- a/include/battle.h +++ b/include/battle.h @@ -481,12 +481,10 @@ 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]; @@ -507,7 +505,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; @@ -517,12 +514,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 field_92; // battle palace related u8 field_93; // related to choosing pokemon? @@ -530,7 +524,7 @@ 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; @@ -539,7 +533,7 @@ struct BattleStruct 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]; @@ -548,9 +542,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; @@ -563,7 +556,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]; diff --git a/src/battle_main.c b/src/battle_main.c index 4e3d365c26..8f76622f62 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -2871,20 +2871,20 @@ 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; gLastMoves[i] = 0; gLastLandedMoves[i] = 0; @@ -2895,29 +2895,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; } gLastUsedMove = 0; gFieldStatuses = 0; - memset(&gFieldTimers, 0, sizeof(gFieldTimers)); - - for (i = 0; i < 2; i++) - { - gSideStatuses[i] = 0; - - dataPtr = (u8 *)&gSideTimers[i]; - for (j = 0; j < sizeof(struct SideTimer); j++) - dataPtr[j] = 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)) @@ -2926,7 +2920,9 @@ 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); @@ -2952,37 +2948,16 @@ 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->field_92 = 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; @@ -2995,9 +2970,8 @@ static void BattleStartClearSetData(void) void SwitchInClearSetData(void) { - struct DisableStruct disableStructCopy = gDisableStructs[gActiveBattler]; s32 i; - u8 *ptr; + struct DisableStruct disableStructCopy = gDisableStructs[gActiveBattler]; if (gBattleMoves[gCurrentMove].effect != EFFECT_BATON_PASS) { @@ -3049,9 +3023,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) { @@ -3072,33 +3044,23 @@ 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->lastTakenMoveFrom[gActiveBattler][0] = 0; + gBattleStruct->lastTakenMoveFrom[gActiveBattler][1] = 0; + gBattleStruct->lastTakenMoveFrom[gActiveBattler][2] = 0; + gBattleStruct->lastTakenMoveFrom[gActiveBattler][3] = 0; gBattleStruct->field_92 &= ~(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; @@ -3110,7 +3072,6 @@ void SwitchInClearSetData(void) void FaintClearSetData(void) { s32 i; - u8 *ptr; for (i = 0; i < NUM_BATTLE_STATS; i++) gBattleMons[gActiveBattler].statStages[i] = 6; @@ -3131,9 +3092,7 @@ 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; @@ -3170,31 +3129,21 @@ 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->lastTakenMove[gActiveBattler] = 0; + gBattleStruct->lastTakenMoveFrom[gActiveBattler][0] = 0; + gBattleStruct->lastTakenMoveFrom[gActiveBattler][1] = 0; + gBattleStruct->lastTakenMoveFrom[gActiveBattler][2] = 0; + gBattleStruct->lastTakenMoveFrom[gActiveBattler][3] = 0; gBattleStruct->field_92 &= ~(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; @@ -4612,7 +4561,6 @@ static void SetActionsAndBattlersTurnOrder(void) static void TurnValuesCleanUp(bool8 var0) { s32 i; - u8 *dataPtr; for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { @@ -4625,9 +4573,7 @@ static void TurnValuesCleanUp(bool8 var0) } 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--; @@ -4652,14 +4598,7 @@ static void TurnValuesCleanUp(bool8 var0) static void SpecialStatusesClear(void) { - for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) - { - s32 i; - u8 *dataPtr = (u8*)(&gSpecialStatuses[gActiveBattler]); - - for (i = 0; i < sizeof(struct SpecialStatus); i++) - dataPtr[i] = 0; - } + memset(&gSpecialStatuses, 0, sizeof(gSpecialStatuses)); } static void CheckMegaEvolutionBeforeTurn(void) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 6a4cc88e78..2b5faf22da 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2383,9 +2383,8 @@ void SetMoveEffect(bool8 primary, u8 certain) else gDisableStructs[gEffectBattler].wrapTurns = ((Random() % 2) + 4); - *(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]]; @@ -2548,8 +2547,7 @@ 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; gActiveBattler = gBattlerAttacker; @@ -2563,8 +2561,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; } } @@ -2673,8 +2670,7 @@ void SetMoveEffect(bool8 primary, u8 certain) BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_KnockedOff; - *(u8*)((u8*)(&gBattleStruct->choicedMove[gEffectBattler]) + 0) = 0; - *(u8*)((u8*)(&gBattleStruct->choicedMove[gEffectBattler]) + 1) = 0; + gBattleStruct->choicedMove[gEffectBattler] = 0; } else { @@ -4228,11 +4224,10 @@ static void atk49_moveend(void) case ATK49_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.atk49_state++; @@ -4354,18 +4349,8 @@ static void atk49_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.atk49_state++; break; @@ -5790,12 +5775,8 @@ static void atk69_setgravity(void) static void atk6A_removeitem(void) { - u16 *usedHeldItem; - gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - - usedHeldItem = &gBattleStruct->usedHeldItems[gActiveBattler]; - *usedHeldItem = gBattleMons[gActiveBattler].item; + gBattleStruct->usedHeldItems[gActiveBattler] = gBattleMons[gActiveBattler].item; gBattleMons[gActiveBattler].item = 0; BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBattler].item); @@ -6385,22 +6366,18 @@ static void atk76_various(void) 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: @@ -7371,18 +7348,13 @@ static void atk7C_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; @@ -7391,9 +7363,7 @@ static void atk7C_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); @@ -9534,13 +9504,7 @@ static void atkBE_rapidspinfree(void) 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; } @@ -9941,11 +9905,8 @@ static void atkD2_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; diff --git a/src/battle_util.c b/src/battle_util.c index b230b8b124..ccae0d4df4 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -606,7 +606,7 @@ u8 TrySetCantSelectMoveBattleScript(void) 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]; + u16 *choicedMove = &gBattleStruct->choicedMove[gActiveBattler]; if (gDisableStructs[gActiveBattler].disabledMove == move && move != 0) { @@ -1496,14 +1496,9 @@ u8 DoBattlerEndTurnEffects(void) { if (--gDisableStructs[gActiveBattler].wrapTurns != 0) // 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; + 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 / 8; @@ -1516,11 +1511,7 @@ u8 DoBattlerEndTurnEffects(void) else // broke free { gBattleMons[gActiveBattler].status2 &= ~(STATUS2_WRAPPED); - 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; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleStruct->wrappedMove[gActiveBattler]); gBattlescriptCurrInstr = BattleScript_WrapEnds; } BattleScriptExecute(gBattlescriptCurrInstr); From dd44ab8150c430f22409d13ce9dcc216e324c461 Mon Sep 17 00:00:00 2001 From: Avara <31101124+Mother-Of-Dragons@users.noreply.github.com> Date: Sun, 27 Jan 2019 17:33:29 +0000 Subject: [PATCH 235/667] Decapitalize item names and add new item descriptions --- src/data/items.h | 914 +++++++++++++++--------------- src/data/text/item_descriptions.h | 481 ++++++++++------ 2 files changed, 749 insertions(+), 646 deletions(-) diff --git a/src/data/items.h b/src/data/items.h index 637757fa89..da20735922 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -22,7 +22,7 @@ const struct Item gItems[] = [ITEM_MASTER_BALL] = { - .name = _("MASTER BALL"), + .name = _("Master Ball"), .itemId = ITEM_MASTER_BALL, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -40,7 +40,7 @@ const struct Item gItems[] = [ITEM_ULTRA_BALL] = { - .name = _("ULTRA BALL"), + .name = _("Ultra Ball"), .itemId = ITEM_ULTRA_BALL, .price = 1200, .holdEffect = HOLD_EFFECT_NONE, @@ -58,7 +58,7 @@ const struct Item gItems[] = [ITEM_GREAT_BALL] = { - .name = _("GREAT BALL"), + .name = _("Great Ball"), .itemId = ITEM_GREAT_BALL, .price = 600, .holdEffect = HOLD_EFFECT_NONE, @@ -76,7 +76,7 @@ const struct Item gItems[] = [ITEM_POKE_BALL] = { - .name = _("POKé BALL"), + .name = _("Poké Ball"), .itemId = ITEM_POKE_BALL, .price = 200, .holdEffect = HOLD_EFFECT_NONE, @@ -94,7 +94,7 @@ const struct Item gItems[] = [ITEM_SAFARI_BALL] = { - .name = _("SAFARI BALL"), + .name = _("Safari Ball"), .itemId = ITEM_SAFARI_BALL, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -112,7 +112,7 @@ const struct Item gItems[] = [ITEM_NET_BALL] = { - .name = _("NET BALL"), + .name = _("Net Ball"), .itemId = ITEM_NET_BALL, .price = 1000, .holdEffect = HOLD_EFFECT_NONE, @@ -130,7 +130,7 @@ const struct Item gItems[] = [ITEM_DIVE_BALL] = { - .name = _("DIVE BALL"), + .name = _("Dive Ball"), .itemId = ITEM_DIVE_BALL, .price = 1000, .holdEffect = HOLD_EFFECT_NONE, @@ -148,7 +148,7 @@ const struct Item gItems[] = [ITEM_NEST_BALL] = { - .name = _("NEST BALL"), + .name = _("Nest Ball"), .itemId = ITEM_NEST_BALL, .price = 1000, .holdEffect = HOLD_EFFECT_NONE, @@ -166,7 +166,7 @@ const struct Item gItems[] = [ITEM_REPEAT_BALL] = { - .name = _("REPEAT BALL"), + .name = _("Repeat Ball"), .itemId = ITEM_REPEAT_BALL, .price = 1000, .holdEffect = HOLD_EFFECT_NONE, @@ -184,7 +184,7 @@ const struct Item gItems[] = [ITEM_TIMER_BALL] = { - .name = _("TIMER BALL"), + .name = _("Timer Ball"), .itemId = ITEM_TIMER_BALL, .price = 1000, .holdEffect = HOLD_EFFECT_NONE, @@ -202,7 +202,7 @@ const struct Item gItems[] = [ITEM_LUXURY_BALL] = { - .name = _("LUXURY BALL"), + .name = _("Luxury Ball"), .itemId = ITEM_LUXURY_BALL, .price = 1000, .holdEffect = HOLD_EFFECT_NONE, @@ -220,7 +220,7 @@ const struct Item gItems[] = [ITEM_PREMIER_BALL] = { - .name = _("PREMIER BALL"), + .name = _("Premier Ball"), .itemId = ITEM_PREMIER_BALL, .price = 200, .holdEffect = HOLD_EFFECT_NONE, @@ -240,7 +240,7 @@ const struct Item gItems[] = [ITEM_POTION] = { - .name = _("POTION"), + .name = _("Potion"), .itemId = ITEM_POTION, .price = 300, .holdEffect = HOLD_EFFECT_NONE, @@ -258,7 +258,7 @@ const struct Item gItems[] = [ITEM_ANTIDOTE] = { - .name = _("ANTIDOTE"), + .name = _("Antidote"), .itemId = ITEM_ANTIDOTE, .price = 100, .holdEffect = HOLD_EFFECT_NONE, @@ -276,7 +276,7 @@ const struct Item gItems[] = [ITEM_BURN_HEAL] = { - .name = _("BURN HEAL"), + .name = _("Burn Heal"), .itemId = ITEM_BURN_HEAL, .price = 250, .holdEffect = HOLD_EFFECT_NONE, @@ -294,7 +294,7 @@ const struct Item gItems[] = [ITEM_ICE_HEAL] = { - .name = _("ICE HEAL"), + .name = _("Ice Heal"), .itemId = ITEM_ICE_HEAL, .price = 250, .holdEffect = HOLD_EFFECT_NONE, @@ -312,7 +312,7 @@ const struct Item gItems[] = [ITEM_AWAKENING] = { - .name = _("AWAKENING"), + .name = _("Awakening"), .itemId = ITEM_AWAKENING, .price = 250, .holdEffect = HOLD_EFFECT_NONE, @@ -330,7 +330,7 @@ const struct Item gItems[] = [ITEM_PARALYZE_HEAL] = { - .name = _("PARLYZ HEAL"), + .name = _("Paralyz Heal"), .itemId = ITEM_PARALYZE_HEAL, .price = 200, .holdEffect = HOLD_EFFECT_NONE, @@ -348,7 +348,7 @@ const struct Item gItems[] = [ITEM_FULL_RESTORE] = { - .name = _("FULL RESTORE"), + .name = _("Full Restore"), .itemId = ITEM_FULL_RESTORE, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, @@ -366,7 +366,7 @@ const struct Item gItems[] = [ITEM_MAX_POTION] = { - .name = _("MAX POTION"), + .name = _("Max Potion"), .itemId = ITEM_MAX_POTION, .price = 2500, .holdEffect = HOLD_EFFECT_NONE, @@ -384,7 +384,7 @@ const struct Item gItems[] = [ITEM_HYPER_POTION] = { - .name = _("HYPER POTION"), + .name = _("Hyper Potion"), .itemId = ITEM_HYPER_POTION, .price = 1200, .holdEffect = HOLD_EFFECT_NONE, @@ -402,7 +402,7 @@ const struct Item gItems[] = [ITEM_SUPER_POTION] = { - .name = _("SUPER POTION"), + .name = _("Super Potion"), .itemId = ITEM_SUPER_POTION, .price = 700, .holdEffect = HOLD_EFFECT_NONE, @@ -420,7 +420,7 @@ const struct Item gItems[] = [ITEM_FULL_HEAL] = { - .name = _("FULL HEAL"), + .name = _("Full Heal"), .itemId = ITEM_FULL_HEAL, .price = 600, .holdEffect = HOLD_EFFECT_NONE, @@ -438,7 +438,7 @@ const struct Item gItems[] = [ITEM_REVIVE] = { - .name = _("REVIVE"), + .name = _("Revive"), .itemId = ITEM_REVIVE, .price = 1500, .holdEffect = HOLD_EFFECT_NONE, @@ -456,7 +456,7 @@ const struct Item gItems[] = [ITEM_MAX_REVIVE] = { - .name = _("MAX REVIVE"), + .name = _("Max Revive"), .itemId = ITEM_MAX_REVIVE, .price = 4000, .holdEffect = HOLD_EFFECT_NONE, @@ -474,7 +474,7 @@ const struct Item gItems[] = [ITEM_FRESH_WATER] = { - .name = _("FRESH WATER"), + .name = _("Fresh Water"), .itemId = ITEM_FRESH_WATER, .price = 200, .holdEffect = HOLD_EFFECT_NONE, @@ -492,7 +492,7 @@ const struct Item gItems[] = [ITEM_SODA_POP] = { - .name = _("SODA POP"), + .name = _("Soda Pop"), .itemId = ITEM_SODA_POP, .price = 300, .holdEffect = HOLD_EFFECT_NONE, @@ -510,7 +510,7 @@ const struct Item gItems[] = [ITEM_LEMONADE] = { - .name = _("LEMONADE"), + .name = _("Lemonade"), .itemId = ITEM_LEMONADE, .price = 350, .holdEffect = HOLD_EFFECT_NONE, @@ -528,7 +528,7 @@ const struct Item gItems[] = [ITEM_MOOMOO_MILK] = { - .name = _("MOOMOO MILK"), + .name = _("Moomoo Milk"), .itemId = ITEM_MOOMOO_MILK, .price = 500, .holdEffect = HOLD_EFFECT_NONE, @@ -546,7 +546,7 @@ const struct Item gItems[] = [ITEM_ENERGY_POWDER] = { - .name = _("ENERGYPOWDER"), + .name = _("Energypowder"), .itemId = ITEM_ENERGY_POWDER, .price = 500, .holdEffect = HOLD_EFFECT_NONE, @@ -564,7 +564,7 @@ const struct Item gItems[] = [ITEM_ENERGY_ROOT] = { - .name = _("ENERGY ROOT"), + .name = _("Energy Root"), .itemId = ITEM_ENERGY_ROOT, .price = 800, .holdEffect = HOLD_EFFECT_NONE, @@ -582,7 +582,7 @@ const struct Item gItems[] = [ITEM_HEAL_POWDER] = { - .name = _("HEAL POWDER"), + .name = _("Heal Powder"), .itemId = ITEM_HEAL_POWDER, .price = 450, .holdEffect = HOLD_EFFECT_NONE, @@ -600,7 +600,7 @@ const struct Item gItems[] = [ITEM_REVIVAL_HERB] = { - .name = _("REVIVAL HERB"), + .name = _("Revival Herb"), .itemId = ITEM_REVIVAL_HERB, .price = 2800, .holdEffect = HOLD_EFFECT_NONE, @@ -618,7 +618,7 @@ const struct Item gItems[] = [ITEM_ETHER] = { - .name = _("ETHER"), + .name = _("Ether"), .itemId = ITEM_ETHER, .price = 1200, .holdEffect = HOLD_EFFECT_NONE, @@ -636,7 +636,7 @@ const struct Item gItems[] = [ITEM_MAX_ETHER] = { - .name = _("MAX ETHER"), + .name = _("Max Ether"), .itemId = ITEM_MAX_ETHER, .price = 2000, .holdEffect = HOLD_EFFECT_NONE, @@ -654,7 +654,7 @@ const struct Item gItems[] = [ITEM_ELIXIR] = { - .name = _("ELIXIR"), + .name = _("Elixir"), .itemId = ITEM_ELIXIR, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, @@ -672,7 +672,7 @@ const struct Item gItems[] = [ITEM_MAX_ELIXIR] = { - .name = _("MAX ELIXIR"), + .name = _("Max Elixir"), .itemId = ITEM_MAX_ELIXIR, .price = 4500, .holdEffect = HOLD_EFFECT_NONE, @@ -690,7 +690,7 @@ const struct Item gItems[] = [ITEM_LAVA_COOKIE] = { - .name = _("LAVA COOKIE"), + .name = _("Lava Cookie"), .itemId = ITEM_LAVA_COOKIE, .price = 200, .holdEffect = HOLD_EFFECT_NONE, @@ -708,7 +708,7 @@ const struct Item gItems[] = [ITEM_BLUE_FLUTE] = { - .name = _("BLUE FLUTE"), + .name = _("Blue Flute"), .itemId = ITEM_BLUE_FLUTE, .price = 100, .holdEffect = HOLD_EFFECT_NONE, @@ -726,7 +726,7 @@ const struct Item gItems[] = [ITEM_YELLOW_FLUTE] = { - .name = _("YELLOW FLUTE"), + .name = _("Yellow Flute"), .itemId = ITEM_YELLOW_FLUTE, .price = 200, .holdEffect = HOLD_EFFECT_NONE, @@ -744,7 +744,7 @@ const struct Item gItems[] = [ITEM_RED_FLUTE] = { - .name = _("RED FLUTE"), + .name = _("Red Flute"), .itemId = ITEM_RED_FLUTE, .price = 300, .holdEffect = HOLD_EFFECT_NONE, @@ -762,7 +762,7 @@ const struct Item gItems[] = [ITEM_BLACK_FLUTE] = { - .name = _("BLACK FLUTE"), + .name = _("Black Flute"), .itemId = ITEM_BLACK_FLUTE, .price = 400, .holdEffect = HOLD_EFFECT_NONE, @@ -780,7 +780,7 @@ const struct Item gItems[] = [ITEM_WHITE_FLUTE] = { - .name = _("WHITE FLUTE"), + .name = _("White Flute"), .itemId = ITEM_WHITE_FLUTE, .price = 500, .holdEffect = HOLD_EFFECT_NONE, @@ -798,7 +798,7 @@ const struct Item gItems[] = [ITEM_BERRY_JUICE] = { - .name = _("BERRY JUICE"), + .name = _("Berry Juice"), .itemId = ITEM_BERRY_JUICE, .price = 100, .holdEffect = HOLD_EFFECT_RESTORE_HP, @@ -816,7 +816,7 @@ const struct Item gItems[] = [ITEM_SACRED_ASH] = { - .name = _("SACRED ASH"), + .name = _("Sacred Ash"), .itemId = ITEM_SACRED_ASH, .price = 200, .holdEffect = HOLD_EFFECT_NONE, @@ -836,7 +836,7 @@ const struct Item gItems[] = [ITEM_SHOAL_SALT] = { - .name = _("SHOAL SALT"), + .name = _("Shoal Salt"), .itemId = ITEM_SHOAL_SALT, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -854,7 +854,7 @@ const struct Item gItems[] = [ITEM_SHOAL_SHELL] = { - .name = _("SHOAL SHELL"), + .name = _("Shoal Shell"), .itemId = ITEM_SHOAL_SHELL, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -872,7 +872,7 @@ const struct Item gItems[] = [ITEM_RED_SHARD] = { - .name = _("RED SHARD"), + .name = _("Red Shard"), .itemId = ITEM_RED_SHARD, .price = 200, .holdEffect = HOLD_EFFECT_NONE, @@ -890,7 +890,7 @@ const struct Item gItems[] = [ITEM_BLUE_SHARD] = { - .name = _("BLUE SHARD"), + .name = _("Blue Shard"), .itemId = ITEM_BLUE_SHARD, .price = 200, .holdEffect = HOLD_EFFECT_NONE, @@ -908,7 +908,7 @@ const struct Item gItems[] = [ITEM_YELLOW_SHARD] = { - .name = _("YELLOW SHARD"), + .name = _("Yellow Shard"), .itemId = ITEM_YELLOW_SHARD, .price = 200, .holdEffect = HOLD_EFFECT_NONE, @@ -926,7 +926,7 @@ const struct Item gItems[] = [ITEM_GREEN_SHARD] = { - .name = _("GREEN SHARD"), + .name = _("Green Shard"), .itemId = ITEM_GREEN_SHARD, .price = 200, .holdEffect = HOLD_EFFECT_NONE, @@ -1144,7 +1144,7 @@ const struct Item gItems[] = [ITEM_HP_UP] = { - .name = _("HP UP"), + .name = _("HP Up"), .itemId = ITEM_HP_UP, .price = 9800, .holdEffect = HOLD_EFFECT_NONE, @@ -1162,7 +1162,7 @@ const struct Item gItems[] = [ITEM_PROTEIN] = { - .name = _("PROTEIN"), + .name = _("Protein"), .itemId = ITEM_PROTEIN, .price = 9800, .holdEffect = HOLD_EFFECT_NONE, @@ -1180,7 +1180,7 @@ const struct Item gItems[] = [ITEM_IRON] = { - .name = _("IRON"), + .name = _("Iron"), .itemId = ITEM_IRON, .price = 9800, .holdEffect = HOLD_EFFECT_NONE, @@ -1198,7 +1198,7 @@ const struct Item gItems[] = [ITEM_CARBOS] = { - .name = _("CARBOS"), + .name = _("Carbos"), .itemId = ITEM_CARBOS, .price = 9800, .holdEffect = HOLD_EFFECT_NONE, @@ -1216,7 +1216,7 @@ const struct Item gItems[] = [ITEM_CALCIUM] = { - .name = _("CALCIUM"), + .name = _("Calcium"), .itemId = ITEM_CALCIUM, .price = 9800, .holdEffect = HOLD_EFFECT_NONE, @@ -1234,7 +1234,7 @@ const struct Item gItems[] = [ITEM_RARE_CANDY] = { - .name = _("RARE CANDY"), + .name = _("Rare Candy"), .itemId = ITEM_RARE_CANDY, .price = 4800, .holdEffect = HOLD_EFFECT_NONE, @@ -1252,7 +1252,7 @@ const struct Item gItems[] = [ITEM_PP_UP] = { - .name = _("PP UP"), + .name = _("PP Up"), .itemId = ITEM_PP_UP, .price = 9800, .holdEffect = HOLD_EFFECT_NONE, @@ -1270,7 +1270,7 @@ const struct Item gItems[] = [ITEM_ZINC] = { - .name = _("ZINC"), + .name = _("Zinc"), .itemId = ITEM_ZINC, .price = 9800, .holdEffect = HOLD_EFFECT_NONE, @@ -1288,7 +1288,7 @@ const struct Item gItems[] = [ITEM_PP_MAX] = { - .name = _("PP MAX"), + .name = _("PP Max"), .itemId = ITEM_PP_MAX, .price = 9800, .holdEffect = HOLD_EFFECT_NONE, @@ -1326,7 +1326,7 @@ const struct Item gItems[] = [ITEM_GUARD_SPEC] = { - .name = _("GUARD SPEC."), + .name = _("Guard Spec."), .itemId = ITEM_GUARD_SPEC, .price = 700, .holdEffect = HOLD_EFFECT_NONE, @@ -1344,7 +1344,7 @@ const struct Item gItems[] = [ITEM_DIRE_HIT] = { - .name = _("DIRE HIT"), + .name = _("Dire Hit"), .itemId = ITEM_DIRE_HIT, .price = 650, .holdEffect = HOLD_EFFECT_NONE, @@ -1362,7 +1362,7 @@ const struct Item gItems[] = [ITEM_X_ATTACK] = { - .name = _("X ATTACK"), + .name = _("X Attack"), .itemId = ITEM_X_ATTACK, .price = 500, .holdEffect = HOLD_EFFECT_NONE, @@ -1380,7 +1380,7 @@ const struct Item gItems[] = [ITEM_X_DEFEND] = { - .name = _("X DEFEND"), + .name = _("X Defend"), .itemId = ITEM_X_DEFEND, .price = 550, .holdEffect = HOLD_EFFECT_NONE, @@ -1398,7 +1398,7 @@ const struct Item gItems[] = [ITEM_X_SPEED] = { - .name = _("X SPEED"), + .name = _("X Speed"), .itemId = ITEM_X_SPEED, .price = 350, .holdEffect = HOLD_EFFECT_NONE, @@ -1416,7 +1416,7 @@ const struct Item gItems[] = [ITEM_X_ACCURACY] = { - .name = _("X ACCURACY"), + .name = _("X Accuracy"), .itemId = ITEM_X_ACCURACY, .price = 950, .holdEffect = HOLD_EFFECT_NONE, @@ -1434,7 +1434,7 @@ const struct Item gItems[] = [ITEM_X_SPECIAL] = { - .name = _("X SPECIAL"), + .name = _("X Special"), .itemId = ITEM_X_SPECIAL, .price = 350, .holdEffect = HOLD_EFFECT_NONE, @@ -1452,7 +1452,7 @@ const struct Item gItems[] = [ITEM_POKE_DOLL] = { - .name = _("POKé DOLL"), + .name = _("Poké Doll"), .itemId = ITEM_POKE_DOLL, .price = 1000, .holdEffect = HOLD_EFFECT_NONE, @@ -1470,7 +1470,7 @@ const struct Item gItems[] = [ITEM_FLUFFY_TAIL] = { - .name = _("FLUFFY TAIL"), + .name = _("Fluffy Tail"), .itemId = ITEM_FLUFFY_TAIL, .price = 1000, .holdEffect = HOLD_EFFECT_NONE, @@ -1508,7 +1508,7 @@ const struct Item gItems[] = [ITEM_SUPER_REPEL] = { - .name = _("SUPER REPEL"), + .name = _("Super Repel"), .itemId = ITEM_SUPER_REPEL, .price = 500, .holdEffect = HOLD_EFFECT_NONE, @@ -1526,7 +1526,7 @@ const struct Item gItems[] = [ITEM_MAX_REPEL] = { - .name = _("MAX REPEL"), + .name = _("Max Repel"), .itemId = ITEM_MAX_REPEL, .price = 700, .holdEffect = HOLD_EFFECT_NONE, @@ -1544,7 +1544,7 @@ const struct Item gItems[] = [ITEM_ESCAPE_ROPE] = { - .name = _("ESCAPE ROPE"), + .name = _("Escape Rope"), .itemId = ITEM_ESCAPE_ROPE, .price = 550, .holdEffect = HOLD_EFFECT_NONE, @@ -1562,7 +1562,7 @@ const struct Item gItems[] = [ITEM_REPEL] = { - .name = _("REPEL"), + .name = _("Repel"), .itemId = ITEM_REPEL, .price = 350, .holdEffect = HOLD_EFFECT_NONE, @@ -1690,7 +1690,7 @@ const struct Item gItems[] = [ITEM_SUN_STONE] = { - .name = _("SUN STONE"), + .name = _("Sun Stone"), .itemId = ITEM_SUN_STONE, .price = 2100, .holdEffect = HOLD_EFFECT_NONE, @@ -1708,7 +1708,7 @@ const struct Item gItems[] = [ITEM_MOON_STONE] = { - .name = _("MOON STONE"), + .name = _("Moon Stone"), .itemId = ITEM_MOON_STONE, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -1726,7 +1726,7 @@ const struct Item gItems[] = [ITEM_FIRE_STONE] = { - .name = _("FIRE STONE"), + .name = _("Fire Stone"), .itemId = ITEM_FIRE_STONE, .price = 2100, .holdEffect = HOLD_EFFECT_NONE, @@ -1744,7 +1744,7 @@ const struct Item gItems[] = [ITEM_THUNDER_STONE] = { - .name = _("THUNDERSTONE"), + .name = _("Thunderstone"), .itemId = ITEM_THUNDER_STONE, .price = 2100, .holdEffect = HOLD_EFFECT_NONE, @@ -1762,7 +1762,7 @@ const struct Item gItems[] = [ITEM_WATER_STONE] = { - .name = _("WATER STONE"), + .name = _("Water Stone"), .itemId = ITEM_WATER_STONE, .price = 2100, .holdEffect = HOLD_EFFECT_NONE, @@ -1780,7 +1780,7 @@ const struct Item gItems[] = [ITEM_LEAF_STONE] = { - .name = _("LEAF STONE"), + .name = _("Leaf Stone"), .itemId = ITEM_LEAF_STONE, .price = 2100, .holdEffect = HOLD_EFFECT_NONE, @@ -1872,7 +1872,7 @@ const struct Item gItems[] = [ITEM_TINY_MUSHROOM] = { - .name = _("TINYMUSHROOM"), + .name = _("Tinymushroom"), .itemId = ITEM_TINY_MUSHROOM, .price = 500, .holdEffect = HOLD_EFFECT_NONE, @@ -1890,7 +1890,7 @@ const struct Item gItems[] = [ITEM_BIG_MUSHROOM] = { - .name = _("BIG MUSHROOM"), + .name = _("Big Mushroom"), .itemId = ITEM_BIG_MUSHROOM, .price = 5000, .holdEffect = HOLD_EFFECT_NONE, @@ -1926,7 +1926,7 @@ const struct Item gItems[] = [ITEM_PEARL] = { - .name = _("PEARL"), + .name = _("Pearl"), .itemId = ITEM_PEARL, .price = 1400, .holdEffect = HOLD_EFFECT_NONE, @@ -1944,7 +1944,7 @@ const struct Item gItems[] = [ITEM_BIG_PEARL] = { - .name = _("BIG PEARL"), + .name = _("Big Pearl"), .itemId = ITEM_BIG_PEARL, .price = 7500, .holdEffect = HOLD_EFFECT_NONE, @@ -1962,7 +1962,7 @@ const struct Item gItems[] = [ITEM_STARDUST] = { - .name = _("STARDUST"), + .name = _("Stardust"), .itemId = ITEM_STARDUST, .price = 2000, .holdEffect = HOLD_EFFECT_NONE, @@ -1980,7 +1980,7 @@ const struct Item gItems[] = [ITEM_STAR_PIECE] = { - .name = _("STAR PIECE"), + .name = _("Star Piece"), .itemId = ITEM_STAR_PIECE, .price = 9800, .holdEffect = HOLD_EFFECT_NONE, @@ -1998,7 +1998,7 @@ const struct Item gItems[] = [ITEM_NUGGET] = { - .name = _("NUGGET"), + .name = _("Nugget"), .itemId = ITEM_NUGGET, .price = 10000, .holdEffect = HOLD_EFFECT_NONE, @@ -2016,7 +2016,7 @@ const struct Item gItems[] = [ITEM_HEART_SCALE] = { - .name = _("HEART SCALE"), + .name = _("Heart Scale"), .itemId = ITEM_HEART_SCALE, .price = 100, .holdEffect = HOLD_EFFECT_NONE, @@ -2197,7 +2197,7 @@ const struct Item gItems[] = // Mail [ITEM_ORANGE_MAIL] = { - .name = _("ORANGE MAIL"), + .name = _("Orange Mail"), .itemId = ITEM_ORANGE_MAIL, .price = 50, .holdEffect = HOLD_EFFECT_NONE, @@ -2215,7 +2215,7 @@ const struct Item gItems[] = [ITEM_HARBOR_MAIL] = { - .name = _("HARBOR MAIL"), + .name = _("Harbor Mail"), .itemId = ITEM_HARBOR_MAIL, .price = 50, .holdEffect = HOLD_EFFECT_NONE, @@ -2233,7 +2233,7 @@ const struct Item gItems[] = [ITEM_GLITTER_MAIL] = { - .name = _("GLITTER MAIL"), + .name = _("Glitter Mail"), .itemId = ITEM_GLITTER_MAIL, .price = 50, .holdEffect = HOLD_EFFECT_NONE, @@ -2251,7 +2251,7 @@ const struct Item gItems[] = [ITEM_MECH_MAIL] = { - .name = _("MECH MAIL"), + .name = _("Mech Mail"), .itemId = ITEM_MECH_MAIL, .price = 50, .holdEffect = HOLD_EFFECT_NONE, @@ -2269,7 +2269,7 @@ const struct Item gItems[] = [ITEM_WOOD_MAIL] = { - .name = _("WOOD MAIL"), + .name = _("Wood Mail"), .itemId = ITEM_WOOD_MAIL, .price = 50, .holdEffect = HOLD_EFFECT_NONE, @@ -2287,7 +2287,7 @@ const struct Item gItems[] = [ITEM_WAVE_MAIL] = { - .name = _("WAVE MAIL"), + .name = _("Wave Mail"), .itemId = ITEM_WAVE_MAIL, .price = 50, .holdEffect = HOLD_EFFECT_NONE, @@ -2305,7 +2305,7 @@ const struct Item gItems[] = [ITEM_BEAD_MAIL] = { - .name = _("BEAD MAIL"), + .name = _("Bead Mail"), .itemId = ITEM_BEAD_MAIL, .price = 50, .holdEffect = HOLD_EFFECT_NONE, @@ -2323,7 +2323,7 @@ const struct Item gItems[] = [ITEM_SHADOW_MAIL] = { - .name = _("SHADOW MAIL"), + .name = _("Shadow Mail"), .itemId = ITEM_SHADOW_MAIL, .price = 50, .holdEffect = HOLD_EFFECT_NONE, @@ -2341,7 +2341,7 @@ const struct Item gItems[] = [ITEM_TROPIC_MAIL] = { - .name = _("TROPIC MAIL"), + .name = _("Tropic Mail"), .itemId = ITEM_TROPIC_MAIL, .price = 50, .holdEffect = HOLD_EFFECT_NONE, @@ -2359,7 +2359,7 @@ const struct Item gItems[] = [ITEM_DREAM_MAIL] = { - .name = _("DREAM MAIL"), + .name = _("Dream Mail"), .itemId = ITEM_DREAM_MAIL, .price = 50, .holdEffect = HOLD_EFFECT_NONE, @@ -2377,7 +2377,7 @@ const struct Item gItems[] = [ITEM_FAB_MAIL] = { - .name = _("FAB MAIL"), + .name = _("Fab Mail"), .itemId = ITEM_FAB_MAIL, .price = 50, .holdEffect = HOLD_EFFECT_NONE, @@ -2395,7 +2395,7 @@ const struct Item gItems[] = [ITEM_RETRO_MAIL] = { - .name = _("RETRO MAIL"), + .name = _("Retro Mail"), .itemId = ITEM_RETRO_MAIL, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -2415,7 +2415,7 @@ const struct Item gItems[] = [ITEM_CHERI_BERRY] = { - .name = _("CHERI BERRY"), + .name = _("Cheri Berry"), .itemId = ITEM_CHERI_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_CURE_PAR, @@ -2433,7 +2433,7 @@ const struct Item gItems[] = [ITEM_CHESTO_BERRY] = { - .name = _("CHESTO BERRY"), + .name = _("Chesto Berry"), .itemId = ITEM_CHESTO_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_CURE_SLP, @@ -2451,7 +2451,7 @@ const struct Item gItems[] = [ITEM_PECHA_BERRY] = { - .name = _("PECHA BERRY"), + .name = _("Pecha Berry"), .itemId = ITEM_PECHA_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_CURE_PSN, @@ -2469,7 +2469,7 @@ const struct Item gItems[] = [ITEM_RAWST_BERRY] = { - .name = _("RAWST BERRY"), + .name = _("Rawst Berry"), .itemId = ITEM_RAWST_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_CURE_BRN, @@ -2487,7 +2487,7 @@ const struct Item gItems[] = [ITEM_ASPEAR_BERRY] = { - .name = _("ASPEAR BERRY"), + .name = _("Aspear Berry"), .itemId = ITEM_ASPEAR_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_CURE_FRZ, @@ -2505,7 +2505,7 @@ const struct Item gItems[] = [ITEM_LEPPA_BERRY] = { - .name = _("LEPPA BERRY"), + .name = _("Leppa Berry"), .itemId = ITEM_LEPPA_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_RESTORE_PP, @@ -2523,7 +2523,7 @@ const struct Item gItems[] = [ITEM_ORAN_BERRY] = { - .name = _("ORAN BERRY"), + .name = _("Oran Berry"), .itemId = ITEM_ORAN_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_RESTORE_HP, @@ -2541,7 +2541,7 @@ const struct Item gItems[] = [ITEM_PERSIM_BERRY] = { - .name = _("PERSIM BERRY"), + .name = _("Persim Berry"), .itemId = ITEM_PERSIM_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_CURE_CONFUSION, @@ -2559,7 +2559,7 @@ const struct Item gItems[] = [ITEM_LUM_BERRY] = { - .name = _("LUM BERRY"), + .name = _("Lum Berry"), .itemId = ITEM_LUM_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_CURE_STATUS, @@ -2577,7 +2577,7 @@ const struct Item gItems[] = [ITEM_SITRUS_BERRY] = { - .name = _("SITRUS BERRY"), + .name = _("Sitrus Berry"), .itemId = ITEM_SITRUS_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_RESTORE_HP, @@ -2595,7 +2595,7 @@ const struct Item gItems[] = [ITEM_FIGY_BERRY] = { - .name = _("FIGY BERRY"), + .name = _("Figy Berry"), .itemId = ITEM_FIGY_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_CONFUSE_SPICY, @@ -2613,7 +2613,7 @@ const struct Item gItems[] = [ITEM_WIKI_BERRY] = { - .name = _("WIKI BERRY"), + .name = _("Wiki Berry"), .itemId = ITEM_WIKI_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_CONFUSE_DRY, @@ -2631,7 +2631,7 @@ const struct Item gItems[] = [ITEM_MAGO_BERRY] = { - .name = _("MAGO BERRY"), + .name = _("Mago Berry"), .itemId = ITEM_MAGO_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_CONFUSE_SWEET, @@ -2649,7 +2649,7 @@ const struct Item gItems[] = [ITEM_AGUAV_BERRY] = { - .name = _("AGUAV BERRY"), + .name = _("Aguav Berry"), .itemId = ITEM_AGUAV_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_CONFUSE_BITTER, @@ -2667,7 +2667,7 @@ const struct Item gItems[] = [ITEM_IAPAPA_BERRY] = { - .name = _("IAPAPA BERRY"), + .name = _("Iapapa Berry"), .itemId = ITEM_IAPAPA_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_CONFUSE_SOUR, @@ -2685,7 +2685,7 @@ const struct Item gItems[] = [ITEM_RAZZ_BERRY] = { - .name = _("RAZZ BERRY"), + .name = _("Razz Berry"), .itemId = ITEM_RAZZ_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2703,7 +2703,7 @@ const struct Item gItems[] = [ITEM_BLUK_BERRY] = { - .name = _("BLUK BERRY"), + .name = _("Bluk Berry"), .itemId = ITEM_BLUK_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2721,7 +2721,7 @@ const struct Item gItems[] = [ITEM_NANAB_BERRY] = { - .name = _("NANAB BERRY"), + .name = _("Nanab Berry"), .itemId = ITEM_NANAB_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2739,7 +2739,7 @@ const struct Item gItems[] = [ITEM_WEPEAR_BERRY] = { - .name = _("WEPEAR BERRY"), + .name = _("Wepear Berry"), .itemId = ITEM_WEPEAR_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2757,7 +2757,7 @@ const struct Item gItems[] = [ITEM_PINAP_BERRY] = { - .name = _("PINAP BERRY"), + .name = _("Pinap Berry"), .itemId = ITEM_PINAP_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2775,7 +2775,7 @@ const struct Item gItems[] = [ITEM_POMEG_BERRY] = { - .name = _("POMEG BERRY"), + .name = _("Pomeg Berry"), .itemId = ITEM_POMEG_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2793,7 +2793,7 @@ const struct Item gItems[] = [ITEM_KELPSY_BERRY] = { - .name = _("KELPSY BERRY"), + .name = _("Kelpsy Berry"), .itemId = ITEM_KELPSY_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2811,7 +2811,7 @@ const struct Item gItems[] = [ITEM_QUALOT_BERRY] = { - .name = _("QUALOT BERRY"), + .name = _("Qualot Berry"), .itemId = ITEM_QUALOT_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2829,7 +2829,7 @@ const struct Item gItems[] = [ITEM_HONDEW_BERRY] = { - .name = _("HONDEW BERRY"), + .name = _("Hondew Berry"), .itemId = ITEM_HONDEW_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2847,7 +2847,7 @@ const struct Item gItems[] = [ITEM_GREPA_BERRY] = { - .name = _("GREPA BERRY"), + .name = _("Grepa Berry"), .itemId = ITEM_GREPA_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2865,7 +2865,7 @@ const struct Item gItems[] = [ITEM_TAMATO_BERRY] = { - .name = _("TAMATO BERRY"), + .name = _("Tamato Berry"), .itemId = ITEM_TAMATO_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2883,7 +2883,7 @@ const struct Item gItems[] = [ITEM_CORNN_BERRY] = { - .name = _("CORNN BERRY"), + .name = _("Cornn Berry"), .itemId = ITEM_CORNN_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2901,7 +2901,7 @@ const struct Item gItems[] = [ITEM_MAGOST_BERRY] = { - .name = _("MAGOST BERRY"), + .name = _("Magost Berry"), .itemId = ITEM_MAGOST_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2919,7 +2919,7 @@ const struct Item gItems[] = [ITEM_RABUTA_BERRY] = { - .name = _("RABUTA BERRY"), + .name = _("Rabuta Berry"), .itemId = ITEM_RABUTA_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2937,7 +2937,7 @@ const struct Item gItems[] = [ITEM_NOMEL_BERRY] = { - .name = _("NOMEL BERRY"), + .name = _("Nomel Berry"), .itemId = ITEM_NOMEL_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2955,7 +2955,7 @@ const struct Item gItems[] = [ITEM_SPELON_BERRY] = { - .name = _("SPELON BERRY"), + .name = _("Spelon Berry"), .itemId = ITEM_SPELON_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2973,7 +2973,7 @@ const struct Item gItems[] = [ITEM_PAMTRE_BERRY] = { - .name = _("PAMTRE BERRY"), + .name = _("Pamtre Berry"), .itemId = ITEM_PAMTRE_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2991,7 +2991,7 @@ const struct Item gItems[] = [ITEM_WATMEL_BERRY] = { - .name = _("WATMEL BERRY"), + .name = _("Watmel Berry"), .itemId = ITEM_WATMEL_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -3009,7 +3009,7 @@ const struct Item gItems[] = [ITEM_DURIN_BERRY] = { - .name = _("DURIN BERRY"), + .name = _("Durin Berry"), .itemId = ITEM_DURIN_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -3027,7 +3027,7 @@ const struct Item gItems[] = [ITEM_BELUE_BERRY] = { - .name = _("BELUE BERRY"), + .name = _("Belue Berry"), .itemId = ITEM_BELUE_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -3045,7 +3045,7 @@ const struct Item gItems[] = [ITEM_LIECHI_BERRY] = { - .name = _("LIECHI BERRY"), + .name = _("Liechi Berry"), .itemId = ITEM_LIECHI_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_ATTACK_UP, @@ -3063,7 +3063,7 @@ const struct Item gItems[] = [ITEM_GANLON_BERRY] = { - .name = _("GANLON BERRY"), + .name = _("Ganlon Berry"), .itemId = ITEM_GANLON_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_DEFENSE_UP, @@ -3081,7 +3081,7 @@ const struct Item gItems[] = [ITEM_SALAC_BERRY] = { - .name = _("SALAC BERRY"), + .name = _("Salac Berry"), .itemId = ITEM_SALAC_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_SPEED_UP, @@ -3099,7 +3099,7 @@ const struct Item gItems[] = [ITEM_PETAYA_BERRY] = { - .name = _("PETAYA BERRY"), + .name = _("Petaya Berry"), .itemId = ITEM_PETAYA_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_SP_ATTACK_UP, @@ -3117,7 +3117,7 @@ const struct Item gItems[] = [ITEM_APICOT_BERRY] = { - .name = _("APICOT BERRY"), + .name = _("Apicot Berry"), .itemId = ITEM_APICOT_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_SP_DEFENSE_UP, @@ -3135,7 +3135,7 @@ const struct Item gItems[] = [ITEM_LANSAT_BERRY] = { - .name = _("LANSAT BERRY"), + .name = _("Lansat Berry"), .itemId = ITEM_LANSAT_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_CRITICAL_UP, @@ -3153,7 +3153,7 @@ const struct Item gItems[] = [ITEM_STARF_BERRY] = { - .name = _("STARF BERRY"), + .name = _("Starf Berry"), .itemId = ITEM_STARF_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_RANDOM_STAT_UP, @@ -3171,7 +3171,7 @@ const struct Item gItems[] = [ITEM_ENIGMA_BERRY] = { - .name = _("ENIGMA BERRY"), + .name = _("Enigma Berry"), .itemId = ITEM_ENIGMA_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -3245,7 +3245,7 @@ const struct Item gItems[] = [ITEM_BRIGHT_POWDER] = { - .name = _("BRIGHTPOWDER"), + .name = _("Brightpowder"), .itemId = ITEM_BRIGHT_POWDER, .price = 10, .holdEffect = HOLD_EFFECT_EVASION_UP, @@ -3263,7 +3263,7 @@ const struct Item gItems[] = [ITEM_WHITE_HERB] = { - .name = _("WHITE HERB"), + .name = _("White Herb"), .itemId = ITEM_WHITE_HERB, .price = 100, .holdEffect = HOLD_EFFECT_RESTORE_STATS, @@ -3281,7 +3281,7 @@ const struct Item gItems[] = [ITEM_MACHO_BRACE] = { - .name = _("MACHO BRACE"), + .name = _("Macho Brace"), .itemId = ITEM_MACHO_BRACE, .price = 3000, .holdEffect = HOLD_EFFECT_MACHO_BRACE, @@ -3299,7 +3299,7 @@ const struct Item gItems[] = [ITEM_EXP_SHARE] = { - .name = _("EXP. SHARE"), + .name = _("Exp. Share"), .itemId = ITEM_EXP_SHARE, .price = 3000, .holdEffect = HOLD_EFFECT_EXP_SHARE, @@ -3317,7 +3317,7 @@ const struct Item gItems[] = [ITEM_QUICK_CLAW] = { - .name = _("QUICK CLAW"), + .name = _("Quick Claw"), .itemId = ITEM_QUICK_CLAW, .price = 100, .holdEffect = HOLD_EFFECT_QUICK_CLAW, @@ -3335,7 +3335,7 @@ const struct Item gItems[] = [ITEM_SOOTHE_BELL] = { - .name = _("SOOTHE BELL"), + .name = _("Soothe Bell"), .itemId = ITEM_SOOTHE_BELL, .price = 100, .holdEffect = HOLD_EFFECT_HAPPINESS_UP, @@ -3353,7 +3353,7 @@ const struct Item gItems[] = [ITEM_MENTAL_HERB] = { - .name = _("MENTAL HERB"), + .name = _("Mental Herb"), .itemId = ITEM_MENTAL_HERB, .price = 100, .holdEffect = HOLD_EFFECT_CURE_ATTRACT, @@ -3371,7 +3371,7 @@ const struct Item gItems[] = [ITEM_CHOICE_BAND] = { - .name = _("CHOICE BAND"), + .name = _("Choice Band"), .itemId = ITEM_CHOICE_BAND, .price = 100, .holdEffect = HOLD_EFFECT_CHOICE_BAND, @@ -3389,7 +3389,7 @@ const struct Item gItems[] = [ITEM_KINGS_ROCK] = { - .name = _("KING'S ROCK"), + .name = _("King's Rock"), .itemId = ITEM_KINGS_ROCK, .price = 100, .holdEffect = HOLD_EFFECT_FLINCH, @@ -3407,7 +3407,7 @@ const struct Item gItems[] = [ITEM_SILVER_POWDER] = { - .name = _("SILVERPOWDER"), + .name = _("Silverpowder"), .itemId = ITEM_SILVER_POWDER, .price = 100, .holdEffect = HOLD_EFFECT_BUG_POWER, @@ -3425,7 +3425,7 @@ const struct Item gItems[] = [ITEM_AMULET_COIN] = { - .name = _("AMULET COIN"), + .name = _("Amulet Coin"), .itemId = ITEM_AMULET_COIN, .price = 100, .holdEffect = HOLD_EFFECT_DOUBLE_PRIZE, @@ -3443,7 +3443,7 @@ const struct Item gItems[] = [ITEM_CLEANSE_TAG] = { - .name = _("CLEANSE TAG"), + .name = _("Cleanse Tag"), .itemId = ITEM_CLEANSE_TAG, .price = 200, .holdEffect = HOLD_EFFECT_REPEL, @@ -3461,7 +3461,7 @@ const struct Item gItems[] = [ITEM_SOUL_DEW] = { - .name = _("SOUL DEW"), + .name = _("Soul Dew"), .itemId = ITEM_SOUL_DEW, .price = 200, .holdEffect = HOLD_EFFECT_SOUL_DEW, @@ -3479,7 +3479,7 @@ const struct Item gItems[] = [ITEM_DEEP_SEA_TOOTH] = { - .name = _("DEEPSEATOOTH"), + .name = _("DeepSeaTooth"), .itemId = ITEM_DEEP_SEA_TOOTH, .price = 200, .holdEffect = HOLD_EFFECT_DEEP_SEA_TOOTH, @@ -3497,7 +3497,7 @@ const struct Item gItems[] = [ITEM_DEEP_SEA_SCALE] = { - .name = _("DEEPSEASCALE"), + .name = _("DeepSeaScale"), .itemId = ITEM_DEEP_SEA_SCALE, .price = 200, .holdEffect = HOLD_EFFECT_DEEP_SEA_SCALE, @@ -3515,7 +3515,7 @@ const struct Item gItems[] = [ITEM_SMOKE_BALL] = { - .name = _("SMOKE BALL"), + .name = _("Smoke Ball"), .itemId = ITEM_SMOKE_BALL, .price = 200, .holdEffect = HOLD_EFFECT_CAN_ALWAYS_RUN, @@ -3533,7 +3533,7 @@ const struct Item gItems[] = [ITEM_EVERSTONE] = { - .name = _("EVERSTONE"), + .name = _("Everstone"), .itemId = ITEM_EVERSTONE, .price = 200, .holdEffect = HOLD_EFFECT_PREVENT_EVOLVE, @@ -3551,7 +3551,7 @@ const struct Item gItems[] = [ITEM_FOCUS_BAND] = { - .name = _("FOCUS BAND"), + .name = _("Focus Band"), .itemId = ITEM_FOCUS_BAND, .price = 200, .holdEffect = HOLD_EFFECT_FOCUS_BAND, @@ -3605,7 +3605,7 @@ const struct Item gItems[] = [ITEM_METAL_COAT] = { - .name = _("METAL COAT"), + .name = _("Metal Coat"), .itemId = ITEM_METAL_COAT, .price = 100, .holdEffect = HOLD_EFFECT_STEEL_POWER, @@ -3623,7 +3623,7 @@ const struct Item gItems[] = [ITEM_LEFTOVERS] = { - .name = _("LEFTOVERS"), + .name = _("Leftovers"), .itemId = ITEM_LEFTOVERS, .price = 200, .holdEffect = HOLD_EFFECT_LEFTOVERS, @@ -3641,7 +3641,7 @@ const struct Item gItems[] = [ITEM_DRAGON_SCALE] = { - .name = _("DRAGON SCALE"), + .name = _("Dragon Scale"), .itemId = ITEM_DRAGON_SCALE, .price = 2100, .holdEffect = HOLD_EFFECT_DRAGON_SCALE, @@ -3659,7 +3659,7 @@ const struct Item gItems[] = [ITEM_LIGHT_BALL] = { - .name = _("LIGHT BALL"), + .name = _("Light Ball"), .itemId = ITEM_LIGHT_BALL, .price = 100, .holdEffect = HOLD_EFFECT_LIGHT_BALL, @@ -3677,7 +3677,7 @@ const struct Item gItems[] = [ITEM_SOFT_SAND] = { - .name = _("SOFT SAND"), + .name = _("Soft Sand"), .itemId = ITEM_SOFT_SAND, .price = 100, .holdEffect = HOLD_EFFECT_GROUND_POWER, @@ -3695,7 +3695,7 @@ const struct Item gItems[] = [ITEM_HARD_STONE] = { - .name = _("HARD STONE"), + .name = _("Hard Stone"), .itemId = ITEM_HARD_STONE, .price = 100, .holdEffect = HOLD_EFFECT_ROCK_POWER, @@ -3713,7 +3713,7 @@ const struct Item gItems[] = [ITEM_MIRACLE_SEED] = { - .name = _("MIRACLE SEED"), + .name = _("Miracle Seed"), .itemId = ITEM_MIRACLE_SEED, .price = 100, .holdEffect = HOLD_EFFECT_GRASS_POWER, @@ -3731,7 +3731,7 @@ const struct Item gItems[] = [ITEM_BLACK_GLASSES] = { - .name = _("BLACKGLASSES"), + .name = _("BlackGlasses"), .itemId = ITEM_BLACK_GLASSES, .price = 100, .holdEffect = HOLD_EFFECT_DARK_POWER, @@ -3749,7 +3749,7 @@ const struct Item gItems[] = [ITEM_BLACK_BELT] = { - .name = _("BLACK BELT"), + .name = _("Black Belt"), .itemId = ITEM_BLACK_BELT, .price = 100, .holdEffect = HOLD_EFFECT_FIGHTING_POWER, @@ -3767,7 +3767,7 @@ const struct Item gItems[] = [ITEM_MAGNET] = { - .name = _("MAGNET"), + .name = _("Magnet"), .itemId = ITEM_MAGNET, .price = 100, .holdEffect = HOLD_EFFECT_ELECTRIC_POWER, @@ -3785,7 +3785,7 @@ const struct Item gItems[] = [ITEM_MYSTIC_WATER] = { - .name = _("MYSTIC WATER"), + .name = _("Mystic Water"), .itemId = ITEM_MYSTIC_WATER, .price = 100, .holdEffect = HOLD_EFFECT_WATER_POWER, @@ -3803,7 +3803,7 @@ const struct Item gItems[] = [ITEM_SHARP_BEAK] = { - .name = _("SHARP BEAK"), + .name = _("Sharp Beak"), .itemId = ITEM_SHARP_BEAK, .price = 100, .holdEffect = HOLD_EFFECT_FLYING_POWER, @@ -3821,7 +3821,7 @@ const struct Item gItems[] = [ITEM_POISON_BARB] = { - .name = _("POISON BARB"), + .name = _("Poison Barb"), .itemId = ITEM_POISON_BARB, .price = 100, .holdEffect = HOLD_EFFECT_POISON_POWER, @@ -3839,7 +3839,7 @@ const struct Item gItems[] = [ITEM_NEVER_MELT_ICE] = { - .name = _("NEVERMELTICE"), + .name = _("Nevermeltice"), .itemId = ITEM_NEVER_MELT_ICE, .price = 100, .holdEffect = HOLD_EFFECT_ICE_POWER, @@ -3857,7 +3857,7 @@ const struct Item gItems[] = [ITEM_SPELL_TAG] = { - .name = _("SPELL TAG"), + .name = _("Spell Tag"), .itemId = ITEM_SPELL_TAG, .price = 100, .holdEffect = HOLD_EFFECT_GHOST_POWER, @@ -3875,7 +3875,7 @@ const struct Item gItems[] = [ITEM_TWISTED_SPOON] = { - .name = _("TWISTEDSPOON"), + .name = _("TwistedSpoon"), .itemId = ITEM_TWISTED_SPOON, .price = 100, .holdEffect = HOLD_EFFECT_PSYCHIC_POWER, @@ -3893,7 +3893,7 @@ const struct Item gItems[] = [ITEM_CHARCOAL] = { - .name = _("CHARCOAL"), + .name = _("Charcoal"), .itemId = ITEM_CHARCOAL, .price = 9800, .holdEffect = HOLD_EFFECT_FIRE_POWER, @@ -3911,7 +3911,7 @@ const struct Item gItems[] = [ITEM_DRAGON_FANG] = { - .name = _("DRAGON FANG"), + .name = _("Dragon Fang"), .itemId = ITEM_DRAGON_FANG, .price = 100, .holdEffect = HOLD_EFFECT_DRAGON_POWER, @@ -3929,7 +3929,7 @@ const struct Item gItems[] = [ITEM_SILK_SCARF] = { - .name = _("SILK SCARF"), + .name = _("Silk Scarf"), .itemId = ITEM_SILK_SCARF, .price = 100, .holdEffect = HOLD_EFFECT_NORMAL_POWER, @@ -3947,7 +3947,7 @@ const struct Item gItems[] = [ITEM_UP_GRADE] = { - .name = _("UP-GRADE"), + .name = _("Up-Grade"), .itemId = ITEM_UP_GRADE, .price = 2100, .holdEffect = HOLD_EFFECT_UP_GRADE, @@ -3965,7 +3965,7 @@ const struct Item gItems[] = [ITEM_SHELL_BELL] = { - .name = _("SHELL BELL"), + .name = _("Shell Bell"), .itemId = ITEM_SHELL_BELL, .price = 200, .holdEffect = HOLD_EFFECT_SHELL_BELL, @@ -3983,7 +3983,7 @@ const struct Item gItems[] = [ITEM_SEA_INCENSE] = { - .name = _("SEA INCENSE"), + .name = _("Sea Incense"), .itemId = ITEM_SEA_INCENSE, .price = 9600, .holdEffect = HOLD_EFFECT_WATER_POWER, @@ -4001,7 +4001,7 @@ const struct Item gItems[] = [ITEM_LAX_INCENSE] = { - .name = _("LAX INCENSE"), + .name = _("Lax Incense"), .itemId = ITEM_LAX_INCENSE, .price = 9600, .holdEffect = HOLD_EFFECT_EVASION_UP, @@ -4019,7 +4019,7 @@ const struct Item gItems[] = [ITEM_LUCKY_PUNCH] = { - .name = _("LUCKY PUNCH"), + .name = _("Lucky Punch"), .itemId = ITEM_LUCKY_PUNCH, .price = 10, .holdEffect = HOLD_EFFECT_LUCKY_PUNCH, @@ -4037,7 +4037,7 @@ const struct Item gItems[] = [ITEM_METAL_POWDER] = { - .name = _("METAL POWDER"), + .name = _("Metal Powder"), .itemId = ITEM_METAL_POWDER, .price = 10, .holdEffect = HOLD_EFFECT_METAL_POWDER, @@ -4055,7 +4055,7 @@ const struct Item gItems[] = [ITEM_THICK_CLUB] = { - .name = _("THICK CLUB"), + .name = _("Thick Club"), .itemId = ITEM_THICK_CLUB, .price = 500, .holdEffect = HOLD_EFFECT_THICK_CLUB, @@ -4073,7 +4073,7 @@ const struct Item gItems[] = [ITEM_STICK] = { - .name = _("STICK"), + .name = _("Stick"), .itemId = ITEM_STICK, .price = 200, .holdEffect = HOLD_EFFECT_STICK, @@ -4595,7 +4595,7 @@ const struct Item gItems[] = [ITEM_RED_SCARF] = { - .name = _("RED SCARF"), + .name = _("Red Scarf"), .itemId = ITEM_RED_SCARF, .price = 100, .holdEffect = HOLD_EFFECT_NONE, @@ -4613,7 +4613,7 @@ const struct Item gItems[] = [ITEM_BLUE_SCARF] = { - .name = _("BLUE SCARF"), + .name = _("Blue Scarf"), .itemId = ITEM_BLUE_SCARF, .price = 100, .holdEffect = HOLD_EFFECT_NONE, @@ -4631,7 +4631,7 @@ const struct Item gItems[] = [ITEM_PINK_SCARF] = { - .name = _("PINK SCARF"), + .name = _("Pink Scarf"), .itemId = ITEM_PINK_SCARF, .price = 100, .holdEffect = HOLD_EFFECT_NONE, @@ -4649,7 +4649,7 @@ const struct Item gItems[] = [ITEM_GREEN_SCARF] = { - .name = _("GREEN SCARF"), + .name = _("Green Scarf"), .itemId = ITEM_GREEN_SCARF, .price = 100, .holdEffect = HOLD_EFFECT_NONE, @@ -4667,7 +4667,7 @@ const struct Item gItems[] = [ITEM_YELLOW_SCARF] = { - .name = _("YELLOW SCARF"), + .name = _("Yellow Scarf"), .itemId = ITEM_YELLOW_SCARF, .price = 100, .holdEffect = HOLD_EFFECT_NONE, @@ -4687,7 +4687,7 @@ const struct Item gItems[] = [ITEM_MACH_BIKE] = { - .name = _("MACH BIKE"), + .name = _("Mach Bike"), .itemId = ITEM_MACH_BIKE, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4705,7 +4705,7 @@ const struct Item gItems[] = [ITEM_COIN_CASE] = { - .name = _("COIN CASE"), + .name = _("Coin Case"), .itemId = ITEM_COIN_CASE, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4723,7 +4723,7 @@ const struct Item gItems[] = [ITEM_ITEMFINDER] = { - .name = _("ITEMFINDER"), + .name = _("Itemfinder"), .itemId = ITEM_ITEMFINDER, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4741,7 +4741,7 @@ const struct Item gItems[] = [ITEM_OLD_ROD] = { - .name = _("OLD ROD"), + .name = _("Old Rod"), .itemId = ITEM_OLD_ROD, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4759,7 +4759,7 @@ const struct Item gItems[] = [ITEM_GOOD_ROD] = { - .name = _("GOOD ROD"), + .name = _("Good Rod"), .itemId = ITEM_GOOD_ROD, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4777,7 +4777,7 @@ const struct Item gItems[] = [ITEM_SUPER_ROD] = { - .name = _("SUPER ROD"), + .name = _("Super Rod"), .itemId = ITEM_SUPER_ROD, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4795,7 +4795,7 @@ const struct Item gItems[] = [ITEM_SS_TICKET] = { - .name = _("S.S. TICKET"), + .name = _("S.S. Ticket"), .itemId = ITEM_SS_TICKET, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4813,7 +4813,7 @@ const struct Item gItems[] = [ITEM_CONTEST_PASS] = { - .name = _("CONTEST PASS"), + .name = _("Contest Pass"), .itemId = ITEM_CONTEST_PASS, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4849,7 +4849,7 @@ const struct Item gItems[] = [ITEM_WAILMER_PAIL] = { - .name = _("WAILMER PAIL"), + .name = _("Wailmer Pail"), .itemId = ITEM_WAILMER_PAIL, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4867,7 +4867,7 @@ const struct Item gItems[] = [ITEM_DEVON_GOODS] = { - .name = _("DEVON GOODS"), + .name = _("Devon Goods"), .itemId = ITEM_DEVON_GOODS, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4885,7 +4885,7 @@ const struct Item gItems[] = [ITEM_SOOT_SACK] = { - .name = _("SOOT SACK"), + .name = _("Soot Sack"), .itemId = ITEM_SOOT_SACK, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4903,7 +4903,7 @@ const struct Item gItems[] = [ITEM_BASEMENT_KEY] = { - .name = _("BASEMENT KEY"), + .name = _("Basement Key"), .itemId = ITEM_BASEMENT_KEY, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4921,7 +4921,7 @@ const struct Item gItems[] = [ITEM_ACRO_BIKE] = { - .name = _("ACRO BIKE"), + .name = _("Acro Bike"), .itemId = ITEM_ACRO_BIKE, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4939,7 +4939,7 @@ const struct Item gItems[] = [ITEM_POKEBLOCK_CASE] = { - .name = _("{POKEBLOCK} CASE"), + .name = _("{POKEBLOCK} Case"), .itemId = ITEM_POKEBLOCK_CASE, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4957,7 +4957,7 @@ const struct Item gItems[] = [ITEM_LETTER] = { - .name = _("LETTER"), + .name = _("Letter"), .itemId = ITEM_LETTER, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4975,7 +4975,7 @@ const struct Item gItems[] = [ITEM_EON_TICKET] = { - .name = _("EON TICKET"), + .name = _("Eon Ticket"), .itemId = ITEM_EON_TICKET, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4993,7 +4993,7 @@ const struct Item gItems[] = [ITEM_RED_ORB] = { - .name = _("RED ORB"), + .name = _("Red Orb"), .itemId = ITEM_RED_ORB, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -5011,7 +5011,7 @@ const struct Item gItems[] = [ITEM_BLUE_ORB] = { - .name = _("BLUE ORB"), + .name = _("Blue Orb"), .itemId = ITEM_BLUE_ORB, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -5029,7 +5029,7 @@ const struct Item gItems[] = [ITEM_SCANNER] = { - .name = _("SCANNER"), + .name = _("Scanner"), .itemId = ITEM_SCANNER, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -5047,7 +5047,7 @@ const struct Item gItems[] = [ITEM_GO_GOGGLES] = { - .name = _("GO-GOGGLES"), + .name = _("Go-Goggles"), .itemId = ITEM_GO_GOGGLES, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -5065,7 +5065,7 @@ const struct Item gItems[] = [ITEM_METEORITE] = { - .name = _("METEORITE"), + .name = _("Meteorite"), .itemId = ITEM_METEORITE, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -5083,7 +5083,7 @@ const struct Item gItems[] = [ITEM_ROOM_1_KEY] = { - .name = _("RM. 1 KEY"), + .name = _("Rm. 1 Key"), .itemId = ITEM_ROOM_1_KEY, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -5101,7 +5101,7 @@ const struct Item gItems[] = [ITEM_ROOM_2_KEY] = { - .name = _("RM. 2 KEY"), + .name = _("Rm. 2 Key"), .itemId = ITEM_ROOM_2_KEY, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -5119,7 +5119,7 @@ const struct Item gItems[] = [ITEM_ROOM_4_KEY] = { - .name = _("RM. 4 KEY"), + .name = _("Rm. 4 Key"), .itemId = ITEM_ROOM_4_KEY, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -5137,7 +5137,7 @@ const struct Item gItems[] = [ITEM_ROOM_6_KEY] = { - .name = _("RM. 6 KEY"), + .name = _("Rm. 6 Key"), .itemId = ITEM_ROOM_6_KEY, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -5155,7 +5155,7 @@ const struct Item gItems[] = [ITEM_STORAGE_KEY] = { - .name = _("STORAGE KEY"), + .name = _("Storage Key"), .itemId = ITEM_STORAGE_KEY, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -5173,7 +5173,7 @@ const struct Item gItems[] = [ITEM_ROOT_FOSSIL] = { - .name = _("ROOT FOSSIL"), + .name = _("Root Fossil"), .itemId = ITEM_ROOT_FOSSIL, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -5191,7 +5191,7 @@ const struct Item gItems[] = [ITEM_CLAW_FOSSIL] = { - .name = _("CLAW FOSSIL"), + .name = _("Claw Fossil"), .itemId = ITEM_CLAW_FOSSIL, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -5209,7 +5209,7 @@ const struct Item gItems[] = [ITEM_DEVON_SCOPE] = { - .name = _("DEVON SCOPE"), + .name = _("Devon Scope"), .itemId = ITEM_DEVON_SCOPE, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6311,7 +6311,7 @@ const struct Item gItems[] = [ITEM_OAKS_PARCEL] = { - .name = _("OAK'S PARCEL"), + .name = _("Oak's Parcel"), .itemId = ITEM_OAKS_PARCEL, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6329,7 +6329,7 @@ const struct Item gItems[] = [ITEM_POKE_FLUTE] = { - .name = _("POKé FLUTE"), + .name = _("Poké Flute"), .itemId = ITEM_POKE_FLUTE, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6347,7 +6347,7 @@ const struct Item gItems[] = [ITEM_SECRET_KEY] = { - .name = _("SECRET KEY"), + .name = _("Secret Key"), .itemId = ITEM_SECRET_KEY, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6365,7 +6365,7 @@ const struct Item gItems[] = [ITEM_BIKE_VOUCHER] = { - .name = _("BIKE VOUCHER"), + .name = _("Bike Voucher"), .itemId = ITEM_BIKE_VOUCHER, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6383,7 +6383,7 @@ const struct Item gItems[] = [ITEM_GOLD_TEETH] = { - .name = _("GOLD TEETH"), + .name = _("Gold Teeth"), .itemId = ITEM_GOLD_TEETH, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6401,7 +6401,7 @@ const struct Item gItems[] = [ITEM_OLD_AMBER] = { - .name = _("OLD AMBER"), + .name = _("Old Amber"), .itemId = ITEM_OLD_AMBER, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6419,7 +6419,7 @@ const struct Item gItems[] = [ITEM_CARD_KEY] = { - .name = _("CARD KEY"), + .name = _("Card Key"), .itemId = ITEM_CARD_KEY, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6437,7 +6437,7 @@ const struct Item gItems[] = [ITEM_LIFT_KEY] = { - .name = _("LIFT KEY"), + .name = _("Lift Key"), .itemId = ITEM_LIFT_KEY, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6455,7 +6455,7 @@ const struct Item gItems[] = [ITEM_HELIX_FOSSIL] = { - .name = _("HELIX FOSSIL"), + .name = _("Helix Fossil"), .itemId = ITEM_HELIX_FOSSIL, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6473,7 +6473,7 @@ const struct Item gItems[] = [ITEM_DOME_FOSSIL] = { - .name = _("DOME FOSSIL"), + .name = _("Dome Fossil"), .itemId = ITEM_DOME_FOSSIL, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6491,7 +6491,7 @@ const struct Item gItems[] = [ITEM_SILPH_SCOPE] = { - .name = _("SILPH SCOPE"), + .name = _("Silph Scope"), .itemId = ITEM_SILPH_SCOPE, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6509,7 +6509,7 @@ const struct Item gItems[] = [ITEM_BICYCLE] = { - .name = _("BICYCLE"), + .name = _("Bicycle"), .itemId = ITEM_BICYCLE, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6527,7 +6527,7 @@ const struct Item gItems[] = [ITEM_TOWN_MAP] = { - .name = _("TOWN MAP"), + .name = _("Town Map"), .itemId = ITEM_TOWN_MAP, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6545,7 +6545,7 @@ const struct Item gItems[] = [ITEM_VS_SEEKER] = { - .name = _("VS SEEKER"), + .name = _("VS Seeker"), .itemId = ITEM_VS_SEEKER, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6563,7 +6563,7 @@ const struct Item gItems[] = [ITEM_FAME_CHECKER] = { - .name = _("FAME CHECKER"), + .name = _("Fame Checker"), .itemId = ITEM_FAME_CHECKER, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6581,7 +6581,7 @@ const struct Item gItems[] = [ITEM_TM_CASE] = { - .name = _("TM CASE"), + .name = _("TM Case"), .itemId = ITEM_TM_CASE, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6599,7 +6599,7 @@ const struct Item gItems[] = [ITEM_BERRY_POUCH] = { - .name = _("BERRY POUCH"), + .name = _("Berry Pouch"), .itemId = ITEM_BERRY_POUCH, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6617,7 +6617,7 @@ const struct Item gItems[] = [ITEM_TEACHY_TV] = { - .name = _("TEACHY TV"), + .name = _("Teachy TV"), .itemId = ITEM_TEACHY_TV, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6635,7 +6635,7 @@ const struct Item gItems[] = [ITEM_TRI_PASS] = { - .name = _("TRI-PASS"), + .name = _("Tri-Pass"), .itemId = ITEM_TRI_PASS, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6653,7 +6653,7 @@ const struct Item gItems[] = [ITEM_RAINBOW_PASS] = { - .name = _("RAINBOW PASS"), + .name = _("Rainbow Pass"), .itemId = ITEM_RAINBOW_PASS, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6671,7 +6671,7 @@ const struct Item gItems[] = [ITEM_TEA] = { - .name = _("TEA"), + .name = _("Tea"), .itemId = ITEM_TEA, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6689,7 +6689,7 @@ const struct Item gItems[] = [ITEM_MYSTIC_TICKET] = { - .name = _("MYSTICTICKET"), + .name = _("MysticTicket"), .itemId = ITEM_MYSTIC_TICKET, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6707,7 +6707,7 @@ const struct Item gItems[] = [ITEM_AURORA_TICKET] = { - .name = _("AURORATICKET"), + .name = _("AuroraTicket"), .itemId = ITEM_AURORA_TICKET, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6725,7 +6725,7 @@ const struct Item gItems[] = [ITEM_POWDER_JAR] = { - .name = _("POWDER JAR"), + .name = _("Powder Jar"), .itemId = ITEM_POWDER_JAR, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6743,7 +6743,7 @@ const struct Item gItems[] = [ITEM_RUBY] = { - .name = _("RUBY"), + .name = _("Ruby"), .itemId = ITEM_RUBY, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6761,7 +6761,7 @@ const struct Item gItems[] = [ITEM_SAPPHIRE] = { - .name = _("SAPPHIRE"), + .name = _("Sapphire"), .itemId = ITEM_SAPPHIRE, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6781,7 +6781,7 @@ const struct Item gItems[] = [ITEM_MAGMA_EMBLEM] = { - .name = _("MAGMA EMBLEM"), + .name = _("Magma Emblem"), .itemId = ITEM_MAGMA_EMBLEM, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6799,7 +6799,7 @@ const struct Item gItems[] = [ITEM_OLD_SEA_MAP] = { - .name = _("OLD SEA MAP"), + .name = _("Old Sea Map"), .itemId = ITEM_OLD_SEA_MAP, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6817,12 +6817,12 @@ const struct Item gItems[] = [ITEM_WIDE_LENS] = { - .name = _("WIDE LENS"), + .name = _("Wide Lens"), .itemId = ITEM_WIDE_LENS, .price = 200, .holdEffect = HOLD_EFFECT_WIDE_LENS, .holdEffectParam = 10, - .description = gDummyItemDescription, + .description = gWideLensItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -6835,12 +6835,12 @@ const struct Item gItems[] = [ITEM_MUSCLE_BAND] = { - .name = _("MUSCLE BAND"), + .name = _("Muscle Band"), .itemId = ITEM_MUSCLE_BAND, .price = 200, .holdEffect = HOLD_EFFECT_MUSCLE_BAND, .holdEffectParam = 10, - .description = gDummyItemDescription, + .description = gMuscleBandItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -6853,12 +6853,12 @@ const struct Item gItems[] = [ITEM_WISE_GLASSES] = { - .name = _("WISE GLASSES"), + .name = _("Wise Glasses"), .itemId = ITEM_WISE_GLASSES, .price = 200, .holdEffect = HOLD_EFFECT_WISE_GLASSES, .holdEffectParam = 10, - .description = gDummyItemDescription, + .description = gWiseGlassesItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -6871,12 +6871,12 @@ const struct Item gItems[] = [ITEM_EXPERT_BELT] = { - .name = _("EXPERT BELT"), + .name = _("Expert Belt"), .itemId = ITEM_EXPERT_BELT, .price = 200, .holdEffect = HOLD_EFFECT_EXPERT_BELT, .holdEffectParam = 20, - .description = gDummyItemDescription, + .description = gExpertBeltItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -6889,12 +6889,12 @@ const struct Item gItems[] = [ITEM_LIGHT_CLAY] = { - .name = _("LIGHT CLAY"), + .name = _("Light Clay"), .itemId = ITEM_LIGHT_CLAY, .price = 200, .holdEffect = HOLD_EFFECT_LIGHT_CLAY, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gLightClayItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -6907,12 +6907,12 @@ const struct Item gItems[] = [ITEM_LIFE_ORB] = { - .name = _("LIFE ORB"), + .name = _("Life Orb"), .itemId = ITEM_LIFE_ORB, .price = 200, .holdEffect = HOLD_EFFECT_LIFE_ORB, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gLifeOrbItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -6925,12 +6925,12 @@ const struct Item gItems[] = [ITEM_POWER_HERB] = { - .name = _("POWER HERB"), + .name = _("Power Herb"), .itemId = ITEM_POWER_HERB, .price = 200, .holdEffect = HOLD_EFFECT_POWER_HERB, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gPowerHerbItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -6943,12 +6943,12 @@ const struct Item gItems[] = [ITEM_TOXIC_ORB] = { - .name = _("TOXIC ORB"), + .name = _("Toxic Orb"), .itemId = ITEM_TOXIC_ORB, .price = 200, .holdEffect = HOLD_EFFECT_TOXIC_ORB, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gToxicOrbItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -6961,12 +6961,12 @@ const struct Item gItems[] = [ITEM_FLAME_ORB] = { - .name = _("FLAME ORB"), + .name = _("Flame Orb"), .itemId = ITEM_FLAME_ORB, .price = 200, .holdEffect = HOLD_EFFECT_FLAME_ORB, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gFlameOrbItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -6979,12 +6979,12 @@ const struct Item gItems[] = [ITEM_QUICK_POWDER] = { - .name = _("QUICK POWDER"), + .name = _("Quick Powder"), .itemId = ITEM_QUICK_POWDER, .price = 200, .holdEffect = HOLD_EFFECT_QUICK_POWDER, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gQuickPowderItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -6997,12 +6997,12 @@ const struct Item gItems[] = [ITEM_FOCUS_SASH] = { - .name = _("FOCUS SASH"), + .name = _("Focus Sash"), .itemId = ITEM_FOCUS_SASH, .price = 200, .holdEffect = HOLD_EFFECT_FOCUS_SASH, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gFocusSashItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7015,12 +7015,12 @@ const struct Item gItems[] = [ITEM_ZOOM_LENS] = { - .name = _("ZOOM LENS"), + .name = _("Zoom Lens"), .itemId = ITEM_ZOOM_LENS, .price = 200, .holdEffect = HOLD_EFFECT_ZOOM_LENS, .holdEffectParam = 20, - .description = gDummyItemDescription, + .description = gZoomLensItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7033,12 +7033,12 @@ const struct Item gItems[] = [ITEM_METRONOME] = { - .name = _("METRONOME"), + .name = _("Metronome"), .itemId = ITEM_METRONOME, .price = 200, .holdEffect = HOLD_EFFECT_METRONOME, .holdEffectParam = 20, - .description = gDummyItemDescription, + .description = gMetronomeItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7051,12 +7051,12 @@ const struct Item gItems[] = [ITEM_IRON_BALL] = { - .name = _("IRON BALL"), + .name = _("Iron Ball"), .itemId = ITEM_IRON_BALL, .price = 200, .holdEffect = HOLD_EFFECT_IRON_BALL, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gIronBallItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7069,12 +7069,12 @@ const struct Item gItems[] = [ITEM_LAGGING_TAIL] = { - .name = _("LAGGING TAIL"), + .name = _("Lagging Tail"), .itemId = ITEM_LAGGING_TAIL, .price = 200, .holdEffect = HOLD_EFFECT_LAGGING_TAIL, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gLaggingTailItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7087,12 +7087,12 @@ const struct Item gItems[] = [ITEM_DESTINY_KNOT] = { - .name = _("DESTINY KNOT"), + .name = _("Destiny Knot"), .itemId = ITEM_DESTINY_KNOT, .price = 200, .holdEffect = HOLD_EFFECT_DESTINY_KNOT, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gDestinyKnotItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7105,12 +7105,12 @@ const struct Item gItems[] = [ITEM_BLACK_SLUDGE] = { - .name = _("BLACK SLUDGE"), + .name = _("Black Sludge"), .itemId = ITEM_BLACK_SLUDGE, .price = 200, .holdEffect = HOLD_EFFECT_BLACK_SLUDGE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gBlackSludgeItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7123,12 +7123,12 @@ const struct Item gItems[] = [ITEM_ICY_ROCK] = { - .name = _("ICY ROCK"), + .name = _("Icy Rock"), .itemId = ITEM_ICY_ROCK, .price = 200, .holdEffect = HOLD_EFFECT_ICY_ROCK, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gIcyRockItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7141,12 +7141,12 @@ const struct Item gItems[] = [ITEM_SMOOTH_ROCK] = { - .name = _("SMOOTH ROCK"), + .name = _("Smooth Rock"), .itemId = ITEM_SMOOTH_ROCK, .price = 200, .holdEffect = HOLD_EFFECT_SMOOTH_ROCK, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gSmoothRockItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7159,12 +7159,12 @@ const struct Item gItems[] = [ITEM_HEAT_ROCK] = { - .name = _("HEAT ROCK"), + .name = _("Heat Rock"), .itemId = ITEM_HEAT_ROCK, .price = 200, .holdEffect = HOLD_EFFECT_HEAT_ROCK, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gHeatRockItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7177,12 +7177,12 @@ const struct Item gItems[] = [ITEM_DAMP_ROCK] = { - .name = _("DAMP ROCK"), + .name = _("Damp Rock"), .itemId = ITEM_DAMP_ROCK, .price = 200, .holdEffect = HOLD_EFFECT_DAMP_ROCK, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gDampRockItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7195,12 +7195,12 @@ const struct Item gItems[] = [ITEM_GRIP_CLAW] = { - .name = _("GRIP CLAW"), + .name = _("Grip Claw"), .itemId = ITEM_GRIP_CLAW, .price = 200, .holdEffect = HOLD_EFFECT_GRIP_CLAW, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gGripClawItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7213,12 +7213,12 @@ const struct Item gItems[] = [ITEM_CHOICE_SCARF] = { - .name = _("CHOICE SCARF"), + .name = _("Choice Scarf"), .itemId = ITEM_CHOICE_SCARF, .price = 200, .holdEffect = HOLD_EFFECT_CHOICE_SCARF, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gChoiceScarfItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7231,12 +7231,12 @@ const struct Item gItems[] = [ITEM_STICKY_BARB] = { - .name = _("STICKY BARB"), + .name = _("Sticky Barb"), .itemId = ITEM_STICKY_BARB, .price = 200, .holdEffect = HOLD_EFFECT_STICKY_BARB, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gStickyBarbItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7249,12 +7249,12 @@ const struct Item gItems[] = [ITEM_SHED_SHELL] = { - .name = _("SHED SHELL"), + .name = _("Shed Shell"), .itemId = ITEM_SHED_SHELL, .price = 200, .holdEffect = HOLD_EFFECT_SHED_SHELL, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gShedShellItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7267,12 +7267,12 @@ const struct Item gItems[] = [ITEM_BIG_ROOT] = { - .name = _("BIG ROOT"), + .name = _("Big Root"), .itemId = ITEM_BIG_ROOT, .price = 200, .holdEffect = HOLD_EFFECT_BIG_ROOT, .holdEffectParam = 30, - .description = gDummyItemDescription, + .description = gBigRootItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7285,12 +7285,12 @@ const struct Item gItems[] = [ITEM_CHOICE_SPECS] = { - .name = _("CHOICE SPECS"), + .name = _("Choice Specs"), .itemId = ITEM_CHOICE_SPECS, .price = 200, .holdEffect = HOLD_EFFECT_CHOICE_SPECS, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gChoiceSpecsItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7303,12 +7303,12 @@ const struct Item gItems[] = [ITEM_ADAMANT_ORB] = { - .name = _("ADAMANT ORB"), + .name = _("Adamant Orb"), .itemId = ITEM_ADAMANT_ORB, .price = 200, .holdEffect = HOLD_EFFECT_ADAMANT_ORB, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gAdamantOrbItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7321,12 +7321,12 @@ const struct Item gItems[] = [ITEM_LUSTROUS_ORB] = { - .name = _("LUSTROUS ORB"), + .name = _("Lustrous Orb"), .itemId = ITEM_LUSTROUS_ORB, .price = 200, .holdEffect = HOLD_EFFECT_LUSTROUS_ORB, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gLustrousOrbItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7339,12 +7339,12 @@ const struct Item gItems[] = [ITEM_GRISEOUS_ORB] = { - .name = _("GRISEOUS ORB"), + .name = _("Griseous Orb"), .itemId = ITEM_GRISEOUS_ORB, .price = 200, .holdEffect = HOLD_EFFECT_GRISEOUS_ORB, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gGriseousOrbItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7357,12 +7357,12 @@ const struct Item gItems[] = [ITEM_FLAME_PLATE] = { - .name = _("FLAME PLATE"), + .name = _("Flame Plate"), .itemId = ITEM_FLAME_PLATE, .price = 200, .holdEffect = HOLD_EFFECT_FIRE_POWER, .holdEffectParam = 20, - .description = gDummyItemDescription, + .description = gFlamePlateItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7375,12 +7375,12 @@ const struct Item gItems[] = [ITEM_SPLASH_PLATE] = { - .name = _("SPLASH PLATE"), + .name = _("Splash Plate"), .itemId = ITEM_SPLASH_PLATE, .price = 200, .holdEffect = HOLD_EFFECT_WATER_POWER, .holdEffectParam = 20, - .description = gDummyItemDescription, + .description = gSplashPlateItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7393,12 +7393,12 @@ const struct Item gItems[] = [ITEM_ZAP_PLATE] = { - .name = _("ZAP PLATE"), + .name = _("Zap Plate"), .itemId = ITEM_ZAP_PLATE, .price = 200, .holdEffect = HOLD_EFFECT_ELECTRIC_POWER, .holdEffectParam = 20, - .description = gDummyItemDescription, + .description = gZapPlateItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7411,12 +7411,12 @@ const struct Item gItems[] = [ITEM_MEADOW_PLATE] = { - .name = _("MEADOW PLATE"), + .name = _("Meadow Plate"), .itemId = ITEM_MEADOW_PLATE, .price = 200, .holdEffect = HOLD_EFFECT_GRASS_POWER, .holdEffectParam = 20, - .description = gDummyItemDescription, + .description = gMeadowPlateItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7429,12 +7429,12 @@ const struct Item gItems[] = [ITEM_ICICLE_PLATE] = { - .name = _("ICICLE PLATE"), + .name = _("Icicle Plate"), .itemId = ITEM_ICICLE_PLATE, .price = 200, .holdEffect = HOLD_EFFECT_ICE_POWER, .holdEffectParam = 20, - .description = gDummyItemDescription, + .description = gIciclePlateItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7447,12 +7447,12 @@ const struct Item gItems[] = [ITEM_FIST_PLATE] = { - .name = _("FIST PLATE"), + .name = _("Fist Plate"), .itemId = ITEM_FIST_PLATE, .price = 200, .holdEffect = HOLD_EFFECT_FIGHTING_POWER, .holdEffectParam = 20, - .description = gDummyItemDescription, + .description = gFistPlateItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7465,12 +7465,12 @@ const struct Item gItems[] = [ITEM_TOXIC_PLATE] = { - .name = _("TOXIC PLATE"), + .name = _("Toxic Plate"), .itemId = ITEM_TOXIC_PLATE, .price = 200, .holdEffect = HOLD_EFFECT_POISON_POWER, .holdEffectParam = 20, - .description = gDummyItemDescription, + .description = gToxicPlateItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7483,12 +7483,12 @@ const struct Item gItems[] = [ITEM_EARTH_PLATE] = { - .name = _("EARTH PLATE"), + .name = _("Earth Plate"), .itemId = ITEM_EARTH_PLATE, .price = 200, .holdEffect = HOLD_EFFECT_GROUND_POWER, .holdEffectParam = 20, - .description = gDummyItemDescription, + .description = gEarthPlateItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7501,12 +7501,12 @@ const struct Item gItems[] = [ITEM_SKY_PLATE] = { - .name = _("SKY PLATE"), + .name = _("Sky Plate"), .itemId = ITEM_SKY_PLATE, .price = 200, .holdEffect = HOLD_EFFECT_FLYING_POWER, .holdEffectParam = 20, - .description = gDummyItemDescription, + .description = gSkyPlateItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7519,12 +7519,12 @@ const struct Item gItems[] = [ITEM_MIND_PLATE] = { - .name = _("MIND PLATE"), + .name = _("Mind Plate"), .itemId = ITEM_MIND_PLATE, .price = 200, .holdEffect = HOLD_EFFECT_PSYCHIC_POWER, .holdEffectParam = 20, - .description = gDummyItemDescription, + .description = gMindPlateItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7537,12 +7537,12 @@ const struct Item gItems[] = [ITEM_INSECT_PLATE] = { - .name = _("INSECT PLATE"), + .name = _("Insect Plate"), .itemId = ITEM_INSECT_PLATE, .price = 200, .holdEffect = HOLD_EFFECT_BUG_POWER, .holdEffectParam = 20, - .description = gDummyItemDescription, + .description = gInsectPlateItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7555,12 +7555,12 @@ const struct Item gItems[] = [ITEM_STONE_PLATE] = { - .name = _("STONE PLATE"), + .name = _("Stone Plate"), .itemId = ITEM_STONE_PLATE, .price = 200, .holdEffect = HOLD_EFFECT_ROCK_POWER, .holdEffectParam = 20, - .description = gDummyItemDescription, + .description = gStonePlateItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7573,12 +7573,12 @@ const struct Item gItems[] = [ITEM_SPOOKY_PLATE] = { - .name = _("SPOOKY PLATE"), + .name = _("Spooky Plate"), .itemId = ITEM_SPOOKY_PLATE, .price = 200, .holdEffect = HOLD_EFFECT_GHOST_POWER, .holdEffectParam = 20, - .description = gDummyItemDescription, + .description = gSpookyPlateItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7591,12 +7591,12 @@ const struct Item gItems[] = [ITEM_DRACO_PLATE] = { - .name = _("DRACO PLATE"), + .name = _("Draco Plate"), .itemId = ITEM_DRACO_PLATE, .price = 200, .holdEffect = HOLD_EFFECT_DRAGON_POWER, .holdEffectParam = 20, - .description = gDummyItemDescription, + .description = gDracoPlateItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7609,12 +7609,12 @@ const struct Item gItems[] = [ITEM_DREAD_PLATE] = { - .name = _("DREAD PLATE"), + .name = _("Dread Plate"), .itemId = ITEM_DREAD_PLATE, .price = 200, .holdEffect = HOLD_EFFECT_DARK_POWER, .holdEffectParam = 20, - .description = gDummyItemDescription, + .description = gDreadPlateItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7627,12 +7627,12 @@ const struct Item gItems[] = [ITEM_IRON_PLATE] = { - .name = _("IRON PLATE"), + .name = _("Iron Plate"), .itemId = ITEM_IRON_PLATE, .price = 200, .holdEffect = HOLD_EFFECT_STEEL_POWER, .holdEffectParam = 20, - .description = gDummyItemDescription, + .description = gIronPlateItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7645,12 +7645,12 @@ const struct Item gItems[] = [ITEM_EVIOLITE] = { - .name = _("EVIOLITE"), + .name = _("Eviolite"), .itemId = ITEM_EVIOLITE, .price = 200, .holdEffect = HOLD_EFFECT_EVIOLITE, .holdEffectParam = 50, - .description = gDummyItemDescription, + .description = gEvioliteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7663,12 +7663,12 @@ const struct Item gItems[] = [ITEM_FLOAT_STONE] = { - .name = _("FLOAT STONE"), + .name = _("Float Stone"), .itemId = ITEM_FLOAT_STONE, .price = 200, .holdEffect = HOLD_EFFECT_FLOAT_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gFloatStoneItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7681,12 +7681,12 @@ const struct Item gItems[] = [ITEM_BINDING_BAND] = { - .name = _("BINDING BAND"), + .name = _("Binding Band"), .itemId = ITEM_BINDING_BAND, .price = 200, .holdEffect = HOLD_EFFECT_BINDING_BAND, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gBindingBandItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7699,12 +7699,12 @@ const struct Item gItems[] = [ITEM_DOUSE_DRIVE] = { - .name = _("DOUSE DRIVE"), + .name = _("Douse Drive"), .itemId = ITEM_DOUSE_DRIVE, .price = 200, .holdEffect = HOLD_EFFECT_DRIVE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gDouseDriveItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7717,12 +7717,12 @@ const struct Item gItems[] = [ITEM_SHOCK_DRIVE] = { - .name = _("SHOCK DRIVE"), + .name = _("Shock Drive"), .itemId = ITEM_SHOCK_DRIVE, .price = 200, .holdEffect = HOLD_EFFECT_DRIVE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gShockDriveItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7735,12 +7735,12 @@ const struct Item gItems[] = [ITEM_BURN_DRIVE] = { - .name = _("BURN DRIVE"), + .name = _("Burn Drive"), .itemId = ITEM_BURN_DRIVE, .price = 200, .holdEffect = HOLD_EFFECT_DRIVE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gBurnDriveItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7753,12 +7753,12 @@ const struct Item gItems[] = [ITEM_CHILL_DRIVE] = { - .name = _("CHILL DRIVE"), + .name = _("Chill Drive"), .itemId = ITEM_CHILL_DRIVE, .price = 200, .holdEffect = HOLD_EFFECT_DRIVE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gChillDriveItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7771,12 +7771,12 @@ const struct Item gItems[] = [ITEM_ASSAULT_VEST] = { - .name = _("ASSAULT VEST"), + .name = _("Assault Vest"), .itemId = ITEM_ASSAULT_VEST, .price = 200, .holdEffect = HOLD_EFFECT_ASSAULT_VEST, .holdEffectParam = 50, - .description = gDummyItemDescription, + .description = gAssaultVestItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7789,12 +7789,12 @@ const struct Item gItems[] = [ITEM_PIXIE_PLATE] = { - .name = _("PIXIE PLATE"), + .name = _("Pixie Plate"), .itemId = ITEM_PIXIE_PLATE, .price = 200, .holdEffect = HOLD_EFFECT_FAIRY_POWER, .holdEffectParam = 20, - .description = gDummyItemDescription, + .description = gPixiePlateItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7807,12 +7807,12 @@ const struct Item gItems[] = [ITEM_GENGARITE] = { - .name = _("GENGARITE"), + .name = _("Gengarite"), .itemId = ITEM_GENGARITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gGengariteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7825,12 +7825,12 @@ const struct Item gItems[] = [ITEM_GARDEVOIRITE] = { - .name = _("GARDEVOIRITE"), + .name = _("Gardevoirite"), .itemId = ITEM_GARDEVOIRITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gGardevoiriteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7843,12 +7843,12 @@ const struct Item gItems[] = [ITEM_AMPHAROSITE] = { - .name = _("AMPHAROSITE"), + .name = _("Ampharosite"), .itemId = ITEM_AMPHAROSITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gAmpharositeItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7861,12 +7861,12 @@ const struct Item gItems[] = [ITEM_VENUSAURITE] = { - .name = _("VENUSAURITE"), + .name = _("Venusaurite"), .itemId = ITEM_VENUSAURITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gVenusauriteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7879,12 +7879,12 @@ const struct Item gItems[] = [ITEM_CHARIZARDITE_X] = { - .name = _("CHARIZARDITEX"), + .name = _("CharizarditeX"), .itemId = ITEM_CHARIZARDITE_X, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gCharizarditeItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7897,12 +7897,12 @@ const struct Item gItems[] = [ITEM_BLASTOISINITE] = { - .name = _("BLASTOISINITE"), + .name = _("Blastoisinite"), .itemId = ITEM_BLASTOISINITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gBlastoisiniteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7915,12 +7915,12 @@ const struct Item gItems[] = [ITEM_MEWTWONITE_X] = { - .name = _("MEWTWONITE X"), + .name = _("Mewtwonite X"), .itemId = ITEM_MEWTWONITE_X, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gMewtwoniteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7933,12 +7933,12 @@ const struct Item gItems[] = [ITEM_MEWTWONITE_Y] = { - .name = _("MEWTWONITE Y"), + .name = _("Mewtwonite Y"), .itemId = ITEM_MEWTWONITE_Y, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gMewtwoniteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7951,12 +7951,12 @@ const struct Item gItems[] = [ITEM_BLAZIKENITE] = { - .name = _("BLAZIKENITE"), + .name = _("Blazikenite"), .itemId = ITEM_BLAZIKENITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gBlazikeniteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7969,12 +7969,12 @@ const struct Item gItems[] = [ITEM_MEDICHAMITE] = { - .name = _("MEDICHAMITE"), + .name = _("Medichamite"), .itemId = ITEM_MEDICHAMITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gMedichamiteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -7987,12 +7987,12 @@ const struct Item gItems[] = [ITEM_HOUNDOOMINITE] = { - .name = _("HOUNDOOMINITE"), + .name = _("Houndoominite"), .itemId = ITEM_HOUNDOOMINITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gHoundoominiteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8005,12 +8005,12 @@ const struct Item gItems[] = [ITEM_AGGRONITE] = { - .name = _("AGGRONITE"), + .name = _("Aggronite"), .itemId = ITEM_AGGRONITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gAggroniteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8023,12 +8023,12 @@ const struct Item gItems[] = [ITEM_BANETTITE] = { - .name = _("BANETTITE"), + .name = _("Banettite"), .itemId = ITEM_BANETTITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gBanettiteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8041,12 +8041,12 @@ const struct Item gItems[] = [ITEM_TYRANITARITE] = { - .name = _("TYRANITARITE"), + .name = _("Tyranitarite"), .itemId = ITEM_TYRANITARITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gTyranitariteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8059,12 +8059,12 @@ const struct Item gItems[] = [ITEM_SCIZORITE] = { - .name = _("SCIZORITE"), + .name = _("Scizorite"), .itemId = ITEM_SCIZORITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gScizoriteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8077,12 +8077,12 @@ const struct Item gItems[] = [ITEM_PINSIRITE] = { - .name = _("PINSIRITE"), + .name = _("Pinsirite"), .itemId = ITEM_PINSIRITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gPinsiriteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8095,12 +8095,12 @@ const struct Item gItems[] = [ITEM_AERODACTYLITE] = { - .name = _("AERODACTYLITE"), + .name = _("Aerodactylite"), .itemId = ITEM_AERODACTYLITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gAerodactyliteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8113,12 +8113,12 @@ const struct Item gItems[] = [ITEM_LUCARIONITE] = { - .name = _("LUCARIONITE"), + .name = _("Lucarionite"), .itemId = ITEM_LUCARIONITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gLucarioniteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8131,12 +8131,12 @@ const struct Item gItems[] = [ITEM_ABOMASITE] = { - .name = _("ABOMASITE"), + .name = _("Abomasite"), .itemId = ITEM_ABOMASITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gAbomasiteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8149,12 +8149,12 @@ const struct Item gItems[] = [ITEM_KANGASKHANITE] = { - .name = _("KANGASKHANITE"), + .name = _("Kangaskhanite"), .itemId = ITEM_KANGASKHANITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gKangaskhaniteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8167,12 +8167,12 @@ const struct Item gItems[] = [ITEM_GYARADOSITE] = { - .name = _("GYARADOSITE"), + .name = _("Gyaradosite"), .itemId = ITEM_GYARADOSITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gGyaradositeItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8185,12 +8185,12 @@ const struct Item gItems[] = [ITEM_ABSOLITE] = { - .name = _("ABSOLITE"), + .name = _("Absolite"), .itemId = ITEM_ABSOLITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gAbsoliteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8203,12 +8203,12 @@ const struct Item gItems[] = [ITEM_CHARIZARDITE_Y] = { - .name = _("CHARIZARDITEY"), + .name = _("CharizarditeY"), .itemId = ITEM_CHARIZARDITE_Y, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gCharizarditeItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8221,12 +8221,12 @@ const struct Item gItems[] = [ITEM_ALAKAZITE] = { - .name = _("ALAKAZITE"), + .name = _("Alakazite"), .itemId = ITEM_ALAKAZITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gAlakaziteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8239,12 +8239,12 @@ const struct Item gItems[] = [ITEM_HERACRONITE] = { - .name = _("HERACRONITE"), + .name = _("Heracronite"), .itemId = ITEM_HERACRONITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gHeracroniteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8257,12 +8257,12 @@ const struct Item gItems[] = [ITEM_MAWILITE] = { - .name = _("MAWILITE"), + .name = _("Mawilite"), .itemId = ITEM_MAWILITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gMawiliteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8275,12 +8275,12 @@ const struct Item gItems[] = [ITEM_MANECTITE] = { - .name = _("MANECTITE"), + .name = _("Manectite"), .itemId = ITEM_MANECTITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gManectiteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8293,12 +8293,12 @@ const struct Item gItems[] = [ITEM_GARCHOMPITE] = { - .name = _("GARCHOMPITE"), + .name = _("Garchompite"), .itemId = ITEM_GARCHOMPITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gGarchompiteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8311,12 +8311,12 @@ const struct Item gItems[] = [ITEM_LATIASITE] = { - .name = _("LATIASITE"), + .name = _("Latiasite"), .itemId = ITEM_LATIASITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gLatiasiteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8329,12 +8329,12 @@ const struct Item gItems[] = [ITEM_LATIOSITE] = { - .name = _("LATIOSITE"), + .name = _("Latiosite"), .itemId = ITEM_LATIOSITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gLatiositeItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8347,12 +8347,12 @@ const struct Item gItems[] = [ITEM_SWAMPERTITE] = { - .name = _("SWAMPERTITE"), + .name = _("Swampertite"), .itemId = ITEM_SWAMPERTITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gSwampertiteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8365,12 +8365,12 @@ const struct Item gItems[] = [ITEM_SCEPTILITE] = { - .name = _("SCEPTILITE"), + .name = _("Sceptilite"), .itemId = ITEM_SCEPTILITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gSceptiliteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8383,12 +8383,12 @@ const struct Item gItems[] = [ITEM_SABLENITE] = { - .name = _("SABLENITE"), + .name = _("Sablenite"), .itemId = ITEM_SABLENITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gSableniteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8401,12 +8401,12 @@ const struct Item gItems[] = [ITEM_ALTARIANITE] = { - .name = _("ALTARIANITE"), + .name = _("Altarianite"), .itemId = ITEM_ALTARIANITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gAltarianiteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8419,12 +8419,12 @@ const struct Item gItems[] = [ITEM_GALLADITE] = { - .name = _("GALLADITE"), + .name = _("Galladite"), .itemId = ITEM_GALLADITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gGalladiteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8437,12 +8437,12 @@ const struct Item gItems[] = [ITEM_AUDINITE] = { - .name = _("AUDINITE"), + .name = _("Audinite"), .itemId = ITEM_AUDINITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gAudiniteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8455,12 +8455,12 @@ const struct Item gItems[] = [ITEM_METAGROSSITE] = { - .name = _("METAGROSSITE"), + .name = _("Metagrossite"), .itemId = ITEM_METAGROSSITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gMetagrossiteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8473,12 +8473,12 @@ const struct Item gItems[] = [ITEM_SHARPEDONITE] = { - .name = _("SHARPEDONITE"), + .name = _("Sharpedonite"), .itemId = ITEM_SHARPEDONITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gSharpedoniteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8491,12 +8491,12 @@ const struct Item gItems[] = [ITEM_SLOWBRONITE] = { - .name = _("SLOWBRONITE"), + .name = _("Slowbronite"), .itemId = ITEM_SLOWBRONITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gSlowbroniteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8509,12 +8509,12 @@ const struct Item gItems[] = [ITEM_STEELIXITE] = { - .name = _("STEELIXITE"), + .name = _("Steelixite"), .itemId = ITEM_STEELIXITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gSteelixiteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8527,12 +8527,12 @@ const struct Item gItems[] = [ITEM_PIDGEOTITE] = { - .name = _("PIDGEOTITE"), + .name = _("Pidgeotite"), .itemId = ITEM_PIDGEOTITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gPidgeotiteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8545,12 +8545,12 @@ const struct Item gItems[] = [ITEM_GLALITITE] = { - .name = _("GLALITITE"), + .name = _("Glalitite"), .itemId = ITEM_GLALITITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gGlalititeItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8563,12 +8563,12 @@ const struct Item gItems[] = [ITEM_DIANCITE] = { - .name = _("DIANCITE"), + .name = _("Diancite"), .itemId = ITEM_DIANCITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gDianciteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8581,12 +8581,12 @@ const struct Item gItems[] = [ITEM_CAMERUPTITE] = { - .name = _("CAMERUPTITE"), + .name = _("Cameruptite"), .itemId = ITEM_CAMERUPTITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gCameruptiteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8599,12 +8599,12 @@ const struct Item gItems[] = [ITEM_LOPPUNITE] = { - .name = _("LOPPUNITE"), + .name = _("Loppunite"), .itemId = ITEM_LOPPUNITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gLoppuniteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8617,12 +8617,12 @@ const struct Item gItems[] = [ITEM_SALAMENCITE] = { - .name = _("SALAMENCITE"), + .name = _("Salamencite"), .itemId = ITEM_SALAMENCITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gSalamenciteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8635,12 +8635,12 @@ const struct Item gItems[] = [ITEM_BEEDRILLITE] = { - .name = _("BEEDRILLITE"), + .name = _("Beedrillite"), .itemId = ITEM_BEEDRILLITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gBeedrilliteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, @@ -8653,12 +8653,12 @@ const struct Item gItems[] = [ITEM_KEY_STONE] = { - .name = _("KEY STONE"), + .name = _("Key Stone"), .itemId = ITEM_KEY_STONE, .price = 200, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gKeyStoneItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_KEY_ITEMS, @@ -8671,12 +8671,12 @@ const struct Item gItems[] = [ITEM_PROTECTIVE_PADS] = { - .name = _("PROTECT PADS"), // Shortened name from Protective Pads + .name = _("Protect Pads"), // Shortened name from Protective Pads .itemId = ITEM_PROTECTIVE_PADS, .price = 200, .holdEffect = HOLD_EFFECT_PROTECTIVE_PADS, .holdEffectParam = 0, - .description = gDummyItemDescription, + .description = gProtectPadsItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, diff --git a/src/data/text/item_descriptions.h b/src/data/text/item_descriptions.h index 1f048e4408..96c9571dd9 100644 --- a/src/data/text/item_descriptions.h +++ b/src/data/text/item_descriptions.h @@ -1,31 +1,31 @@ const u8 gDummyItemDescription[] = _("?????"); // Pokeballs -const u8 gMasterBallItemDescription[] = _("The best BALL that\ncatches a POKéMON\nwithout fail."); -const u8 gUltraBallItemDescription[] = _("A better BALL with\na higher catch rate\nthan a GREAT BALL."); -const u8 gGreatBallItemDescription[] = _("A good BALL with a\nhigher catch rate\nthan a POKé BALL."); -const u8 gPokeBallItemDescription[] = _("A tool used for\ncatching wild\nPOKéMON."); -const u8 gSafariBallItemDescription[] = _("A special BALL that\nis used only in the\nSAFARI ZONE."); -const u8 gNetBallItemDescription[] = _("A BALL that works\nwell on WATER- and\nBUG-type POKéMON."); -const u8 gDiveBallItemDescription[] = _("A BALL that works\nbetter on POKéMON\non the ocean floor."); -const u8 gNestBallItemDescription[] = _("A BALL that works\nbetter on weaker\nPOKéMON."); -const u8 gRepeatBallItemDescription[] = _("A BALL that works\nbetter on POKéMON\ncaught before."); -const u8 gTimerBallItemDescription[] = _("A BALL that gains\npower in battles\ntaking many turns."); -const u8 gLuxuryBallItemDescription[] = _("A cozy BALL that\nmakes POKéMON\nmore friendly."); -const u8 gPremierBallItemDescription[] = _("A rare BALL made\nin commemoration\nof some event."); +const u8 gMasterBallItemDescription[] = _("The best Ball that\ncatches a Pokémon\nwithout fail."); +const u8 gUltraBallItemDescription[] = _("A better Ball with\na higher catch rate\nthan a Great Ball."); +const u8 gGreatBallItemDescription[] = _("A good Ball with a\nhigher catch rate\nthan a Poké Ball."); +const u8 gPokeBallItemDescription[] = _("A tool used for\ncatching wild\nPokémon."); +const u8 gSafariBallItemDescription[] = _("A special Ball that\nis used only in the\nSafari Zone."); +const u8 gNetBallItemDescription[] = _("A Ball that works\nwell on Water- and\nBug-type Pokémon."); +const u8 gDiveBallItemDescription[] = _("A Ball that works\nbetter on Pokémon\non the ocean floor."); +const u8 gNestBallItemDescription[] = _("A Ball that works\nbetter on weaker\nPokémon."); +const u8 gRepeatBallItemDescription[] = _("A Ball that works\nbetter on Pokémon\ncaught before."); +const u8 gTimerBallItemDescription[] = _("A Ball that gains\npower in battles\ntaking many turns."); +const u8 gLuxuryBallItemDescription[] = _("A cozy Ball that\nmakes Pokémon\nmore friendly."); +const u8 gPremierBallItemDescription[] = _("A rare Ball made\nin commemoration\nof some event."); // Medicine -const u8 gPotionItemDescription[] = _("Restores the HP of\na POKéMON by\n20 points."); -const u8 gAntidoteItemDescription[] = _("Heals a poisoned\nPOKéMON."); -const u8 gBurnHealItemDescription[] = _("Heals POKéMON\nof a burn."); -const u8 gIceHealItemDescription[] = _("Defrosts a frozen\nPOKéMON."); -const u8 gAwakeningItemDescription[] = _("Awakens a sleeping\nPOKéMON."); -const u8 gParalyzeHealItemDescription[] = _("Heals a paralyzed\nPOKéMON."); -const u8 gFullRestoreItemDescription[] = _("Fully restores the\nHP and status of a\nPOKéMON."); -const u8 gMaxPotionItemDescription[] = _("Fully restores the\nHP of a POKéMON."); -const u8 gHyperPotionItemDescription[] = _("Restores the HP of\na POKéMON by\n200 points."); -const u8 gSuperPotionItemDescription[] = _("Restores the HP of\na POKéMON by\n50 points."); -const u8 gFullHealItemDescription[] = _("Heals all the\nstatus problems of\none POKéMON."); -const u8 gReviveItemDescription[] = _("Revives a fainted\nPOKéMON with half\nits HP."); -const u8 gMaxReviveItemDescription[] = _("Revives a fainted\nPOKéMON with all\nits HP."); +const u8 gPotionItemDescription[] = _("Restores the HP of\na Pokémon by\n20 points."); +const u8 gAntidoteItemDescription[] = _("Heals a poisoned\nPokémon."); +const u8 gBurnHealItemDescription[] = _("Heals Pokémon\nof a burn."); +const u8 gIceHealItemDescription[] = _("Defrosts a frozen\nPokémon."); +const u8 gAwakeningItemDescription[] = _("Awakens a sleeping\nPokémon."); +const u8 gParalyzeHealItemDescription[] = _("Heals a paralyzed\nPokémon."); +const u8 gFullRestoreItemDescription[] = _("Fully restores the\nHP and status of a\nPokémon."); +const u8 gMaxPotionItemDescription[] = _("Fully restores the\nHP of a Pokémon."); +const u8 gHyperPotionItemDescription[] = _("Restores the HP of\na Pokémon by\n200 points."); +const u8 gSuperPotionItemDescription[] = _("Restores the HP of\na Pokémon by\n50 points."); +const u8 gFullHealItemDescription[] = _("Heals all the\nstatus problems of\none Pokémon."); +const u8 gReviveItemDescription[] = _("Revives a fainted\nPokémon with half\nits HP."); +const u8 gMaxReviveItemDescription[] = _("Revives a fainted\nPokémon with all\nits HP."); const u8 gFreshWaterItemDescription[] = _("A mineral water\nthat restores HP\nby 50 points."); const u8 gSodaPopItemDescription[] = _("A fizzy soda drink\nthat restores HP\nby 60 points."); const u8 gLemonadeItemDescription[] = _("A very sweet drink\nthat restores HP\nby 80 points."); @@ -33,58 +33,58 @@ const u8 gMoomooMilkItemDescription[] = _("A nutritious milk\nthat restores HP\n const u8 gEnergyPowderItemDescription[] = _("A bitter powder\nthat restores HP\nby 50 points."); const u8 gEnergyRootItemDescription[] = _("A bitter root\nthat restores HP\nby 200 points."); const u8 gHealPowderItemDescription[] = _("A bitter powder\nthat heals all\nstatus problems."); -const u8 gRevivalHerbItemDescription[] = _("A very bitter herb\nthat revives a\nfainted POKéMON."); +const u8 gRevivalHerbItemDescription[] = _("A very bitter herb\nthat revives a\nfainted Pokémon."); const u8 gEtherItemDescription[] = _("Restores the PP\nof a selected move\nby 10."); const u8 gMaxEtherItemDescription[] = _("Fully restores the\nPP of a selected\nmove."); const u8 gElixirItemDescription[] = _("Restores the PP\nof all moves by 10."); -const u8 gMaxElixirItemDescription[] = _("Fully restores the\nPP of a POKéMON's\nmoves."); +const u8 gMaxElixirItemDescription[] = _("Fully restores the\nPP of a Pokémon's\nmoves."); const u8 gLavaCookieItemDescription[] = _("A local specialty\nthat heals all\nstatus problems."); -const u8 gBlueFluteItemDescription[] = _("A glass flute that\nawakens sleeping\nPOKéMON."); -const u8 gYellowFluteItemDescription[] = _("A glass flute that\nsnaps POKéMON\nout of confusion."); -const u8 gRedFluteItemDescription[] = _("A glass flute that\nsnaps POKéMON\nout of attraction."); -const u8 gBlackFluteItemDescription[] = _("A glass flute that\nkeeps away wild\nPOKéMON."); -const u8 gWhiteFluteItemDescription[] = _("A glass flute that\nlures wild POKéMON."); +const u8 gBlueFluteItemDescription[] = _("A glass flute that\nawakens sleeping\nPokémon."); +const u8 gYellowFluteItemDescription[] = _("A glass flute that\nsnaps Pokémon\nout of confusion."); +const u8 gRedFluteItemDescription[] = _("A glass flute that\nsnaps Pokémon\nout of attraction."); +const u8 gBlackFluteItemDescription[] = _("A glass flute that\nkeeps away wild\nPokémon."); +const u8 gWhiteFluteItemDescription[] = _("A glass flute that\nlures wild Pokémon."); const u8 gBerryJuiceItemDescription[] = _("A 100% pure juice\nthat restores HP\nby 20 points."); -const u8 gSacredAshItemDescription[] = _("Fully revives and\nrestores all\nfainted POKéMON."); +const u8 gSacredAshItemDescription[] = _("Fully revives and\nrestores all\nfainted Pokémon."); // Collectibles -const u8 gShoalSaltItemDescription[] = _("Salt obtained from\ndeep inside the\nSHOAL CAVE."); -const u8 gShoalShellItemDescription[] = _("A seashell found\ndeep inside the\nSHOAL CAVE."); +const u8 gShoalSaltItemDescription[] = _("Salt obtained from\ndeep inside the\nShoal Cave."); +const u8 gShoalShellItemDescription[] = _("A seashell found\ndeep inside the\nShoal Cave."); const u8 gRedShardItemDescription[] = _("A shard from an\nancient item. Can\nbe sold cheaply."); const u8 gBlueShardItemDescription[] = _("A shard from an\nancient item. Can\nbe sold cheaply."); const u8 gYellowShardItemDescription[] = _("A shard from an\nancient item. Can\nbe sold cheaply."); const u8 gGreenShardItemDescription[] = _("A shard from an\nancient item. Can\nbe sold cheaply."); // Vitamins -const u8 gHPUpItemDescription[] = _("Raises the base HP\nof one POKéMON."); -const u8 gProteinItemDescription[] = _("Raises the base\nATTACK stat of one\nPOKéMON."); -const u8 gIronItemDescription[] = _("Raises the base\nDEFENSE stat of\none POKéMON."); -const u8 gCarbosItemDescription[] = _("Raises the base\nSPEED stat of one\nPOKéMON."); -const u8 gCalciumItemDescription[] = _("Raises the base\nSP. ATK stat of one\nPOKéMON."); -const u8 gRareCandyItemDescription[] = _("Raises the level\nof a POKéMON by\none."); +const u8 gHPUpItemDescription[] = _("Raises the base HP\nof one Pokémon."); +const u8 gProteinItemDescription[] = _("Raises the base\nAttack stat of one\nPokémon."); +const u8 gIronItemDescription[] = _("Raises the base\nDefense stat of\none Pokémon."); +const u8 gCarbosItemDescription[] = _("Raises the base\nSpeed stat of one\nPokémon."); +const u8 gCalciumItemDescription[] = _("Raises the base\nSp. Atk stat of one\nPokémon."); +const u8 gRareCandyItemDescription[] = _("Raises the level\nof a Pokémon by\none."); const u8 gPPUpItemDescription[] = _("Raises the maximum\nPP of a selected\nmove."); -const u8 gZincItemDescription[] = _("Raises the base\nSP. DEF stat of one\nPOKéMON."); +const u8 gZincItemDescription[] = _("Raises the base\nSp. Def stat of one\nPokémon."); const u8 gPPMaxItemDescription[] = _("Raises the PP of a\nmove to its maximum\npoints."); // Battle items const u8 gGuardSpecItemDescription[] = _("Prevents stat\nreduction when\nused in battle."); const u8 gDireHitItemDescription[] = _("Raises the\ncritical-hit ratio\nduring one battle."); -const u8 gXAttackItemDescription[] = _("Raises the stat\nATTACK during one\nbattle."); -const u8 gXDefendItemDescription[] = _("Raises the stat\nDEFENSE during one\nbattle."); -const u8 gXSpeedItemDescription[] = _("Raises the stat\nSPEED during one\nbattle."); +const u8 gXAttackItemDescription[] = _("Raises the stat\nAttack during one\nbattle."); +const u8 gXDefendItemDescription[] = _("Raises the stat\nDefense during one\nbattle."); +const u8 gXSpeedItemDescription[] = _("Raises the stat\nSpeed during one\nbattle."); const u8 gXAccuracyItemDescription[] = _("Raises accuracy\nof attack moves\nduring one battle."); -const u8 gXSpecialItemDescription[] = _("Raises the stat\nSP. ATK during one\nbattle."); -const u8 gPokeDollItemDescription[] = _("Use to flee from\nany battle with\na wild POKéMON."); -const u8 gFluffyTailItemDescription[] = _("Use to flee from\nany battle with\na wild POKéMON."); +const u8 gXSpecialItemDescription[] = _("Raises the stat\nSp. Atk during one\nbattle."); +const u8 gPokeDollItemDescription[] = _("Use to flee from\nany battle with\na wild Pokémon."); +const u8 gFluffyTailItemDescription[] = _("Use to flee from\nany battle with\na wild Pokémon."); // Field items -const u8 gSuperRepelItemDescription[] = _("Repels weak wild\nPOKéMON for 200\nsteps."); -const u8 gMaxRepelItemDescription[] = _("Repels weak wild\nPOKéMON for 250\nsteps."); +const u8 gSuperRepelItemDescription[] = _("Repels weak wild\nPokémon for 200\nsteps."); +const u8 gMaxRepelItemDescription[] = _("Repels weak wild\nPokémon for 250\nsteps."); const u8 gEscapeRopeItemDescription[] = _("Use to escape\ninstantly from a\ncave or a dungeon."); -const u8 gRepelItemDescription[] = _("Repels weak wild\nPOKéMON for 100\nsteps."); +const u8 gRepelItemDescription[] = _("Repels weak wild\nPokémon for 100\nsteps."); // Evolution stones -const u8 gSunStoneItemDescription[] = _("Makes certain\nspecies of POKéMON\nevolve."); -const u8 gMoonStoneItemDescription[] = _("Makes certain\nspecies of POKéMON\nevolve."); -const u8 gFireStoneItemDescription[] = _("Makes certain\nspecies of POKéMON\nevolve."); -const u8 gThunderStoneItemDescription[] = _("Makes certain\nspecies of POKéMON\nevolve."); -const u8 gWaterStoneItemDescription[] = _("Makes certain\nspecies of POKéMON\nevolve."); -const u8 gLeafStoneItemDescription[] = _("Makes certain\nspecies of POKéMON\nevolve."); +const u8 gSunStoneItemDescription[] = _("Makes certain\nspecies of Pokémon\nevolve."); +const u8 gMoonStoneItemDescription[] = _("Makes certain\nspecies of Pokémon\nevolve."); +const u8 gFireStoneItemDescription[] = _("Makes certain\nspecies of Pokémon\nevolve."); +const u8 gThunderStoneItemDescription[] = _("Makes certain\nspecies of Pokémon\nevolve."); +const u8 gWaterStoneItemDescription[] = _("Makes certain\nspecies of Pokémon\nevolve."); +const u8 gLeafStoneItemDescription[] = _("Makes certain\nspecies of Pokémon\nevolve."); // Valuable items const u8 gTinyMushroomItemDescription[] = _("A plain mushroom\nthat would sell\nat a cheap price."); const u8 gBigMushroomItemDescription[] = _("A rare mushroom\nthat would sell at a\nhigh price."); @@ -95,24 +95,24 @@ const u8 gStarPieceItemDescription[] = _("A red gem shard.\nIt would sell for a\ const u8 gNuggetItemDescription[] = _("A nugget of pure\ngold. Can be sold at\na high price."); const u8 gHeartScaleItemDescription[] = _("A lovely scale.\nIt is coveted by\ncollectors."); // Mail -const u8 gOrangeMailItemDescription[] = _("A ZIGZAGOON-print\nMAIL to be held by\na POKéMON."); -const u8 gHarborMailItemDescription[] = _("A WINGULL-print\nMAIL to be held by\na POKéMON."); -const u8 gGlitterMailItemDescription[] = _("A PIKACHU-print\nMAIL to be held by\na POKéMON."); -const u8 gMechMailItemDescription[] = _("A MAGNEMITE-print\nMAIL to be held by\na POKéMON."); -const u8 gWoodMailItemDescription[] = _("A SLAKOTH-print\nMAIL to be held by\na POKéMON."); -const u8 gWaveMailItemDescription[] = _("A WAILMER-print\nMAIL to be held by\na POKéMON."); -const u8 gBeadMailItemDescription[] = _("MAIL featuring a\nsketch of the\nholding POKéMON."); -const u8 gShadowMailItemDescription[] = _("A DUSKULL-print\nMAIL to be held by\na POKéMON."); -const u8 gTropicMailItemDescription[] = _("A BELLOSSOM-print\nMAIL to be held by\na POKéMON."); -const u8 gDreamMailItemDescription[] = _("MAIL featuring a\nsketch of the\nholding POKéMON."); -const u8 gFabMailItemDescription[] = _("A gorgeous-print\nMAIL to be held\nby a POKéMON."); -const u8 gRetroMailItemDescription[] = _("MAIL featuring the\ndrawings of three\nPOKéMON."); +const u8 gOrangeMailItemDescription[] = _("A Zigzagoon-print\nMail to be held by\na Pokémon."); +const u8 gHarborMailItemDescription[] = _("A Wingull-print\nMail to be held by\na Pokémon."); +const u8 gGlitterMailItemDescription[] = _("A Pikachu-print\nMail to be held by\na Pokémon."); +const u8 gMechMailItemDescription[] = _("A Magnemite-print\nMail to be held by\na Pokémon."); +const u8 gWoodMailItemDescription[] = _("A Slakoth-print\nMail to be held by\na Pokémon."); +const u8 gWaveMailItemDescription[] = _("A Wailmer-print\nMail to be held by\na Pokémon."); +const u8 gBeadMailItemDescription[] = _("Mail featuring a\nsketch of the\nholding Pokémon."); +const u8 gShadowMailItemDescription[] = _("A Duskull-print\nMail to be held by\na Pokémon."); +const u8 gTropicMailItemDescription[] = _("A Bellossom-print\nMail to be held by\na Pokémon."); +const u8 gDreamMailItemDescription[] = _("Mail featuring a\nsketch of the\nholding Pokémon."); +const u8 gFabMailItemDescription[] = _("A gorgeous-print\nMail to be held\nby a Pokémon."); +const u8 gRetroMailItemDescription[] = _("Mail featuring the\ndrawings of three\nPokémon."); // Berries const u8 gCheriBerryItemDescription[] = _("A hold item that\nheals paralysis\nin battle."); -const u8 gChestoBerryItemDescription[] = _("A hold item that\nawakens POKéMON\nin battle."); +const u8 gChestoBerryItemDescription[] = _("A hold item that\nawakens Pokémon\nin battle."); const u8 gPechaBerryItemDescription[] = _("A hold item that\nheals poisoning\nin battle."); const u8 gRawstBerryItemDescription[] = _("A hold item that\nheals a burn in\nbattle."); -const u8 gAspearBerryItemDescription[] = _("A hold item that\ndefrosts POKéMON\nin battle."); +const u8 gAspearBerryItemDescription[] = _("A hold item that\ndefrosts Pokémon\nin battle."); const u8 gLeppaBerryItemDescription[] = _("A hold item that\nrestores 10 PP in\nbattle."); const u8 gOranBerryItemDescription[] = _("A hold item that\nrestores 10 HP in\nbattle."); const u8 gPersimBerryItemDescription[] = _("A hold item that\nheals confusion\nin battle."); @@ -123,149 +123,149 @@ const u8 gWikiBerryItemDescription[] = _("A hold item that\nrestores HP but\nmay const u8 gMagoBerryItemDescription[] = _("A hold item that\nrestores HP but\nmay confuse."); const u8 gAguavBerryItemDescription[] = _("A hold item that\nrestores HP but\nmay confuse."); const u8 gIapapaBerryItemDescription[] = _("A hold item that\nrestores HP but\nmay confuse."); -const u8 gRazzBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow RAZZ."); -const u8 gBlukBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow BLUK."); -const u8 gNanabBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow NANAB."); -const u8 gWepearBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow WEPEAR."); -const u8 gPinapBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow PINAP."); -const u8 gPomegBerryItemDescription[] = _("Makes a POKéMON\nfriendly but lowers\nbase HP."); -const u8 gKelpsyBerryItemDescription[] = _("Makes a POKéMON\nfriendly but lowers\nbase ATTACK."); -const u8 gQualotBerryItemDescription[] = _("Makes a POKéMON\nfriendly but lowers\nbase DEFENSE."); -const u8 gHondewBerryItemDescription[] = _("Makes a POKéMON\nfriendly but lowers\nbase SP. ATK."); -const u8 gGrepaBerryItemDescription[] = _("Makes a POKéMON\nfriendly but lowers\nbase SP. DEF."); -const u8 gTamatoBerryItemDescription[] = _("Makes a POKéMON\nfriendly but lowers\nbase SPEED."); -const u8 gCornnBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow CORNN."); -const u8 gMagostBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow MAGOST."); -const u8 gRabutaBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow RABUTA."); -const u8 gNomelBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow NOMEL."); -const u8 gSpelonBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow SPELON."); -const u8 gPamtreBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow PAMTRE."); -const u8 gWatmelBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow WATMEL."); -const u8 gDurinBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow DURIN."); -const u8 gBelueBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow BELUE."); -const u8 gLiechiBerryItemDescription[] = _("A hold item that\nraises ATTACK in\na pinch."); -const u8 gGanlonBerryItemDescription[] = _("A hold item that\nraises DEFENSE in\na pinch."); -const u8 gSalacBerryItemDescription[] = _("A hold item that\nraises SPEED in\na pinch."); -const u8 gPetayaBerryItemDescription[] = _("A hold item that\nraises SP. ATK in\na pinch."); -const u8 gApicotBerryItemDescription[] = _("A hold item that\nraises SP. DEF in\na pinch."); +const u8 gRazzBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow Razz."); +const u8 gBlukBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow Bluk."); +const u8 gNanabBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow Nanab."); +const u8 gWepearBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow Wepear."); +const u8 gPinapBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow Pinap."); +const u8 gPomegBerryItemDescription[] = _("Makes a Pokémon\nfriendly but lowers\nbase HP."); +const u8 gKelpsyBerryItemDescription[] = _("Makes a Pokémon\nfriendly but lowers\nbase Attack."); +const u8 gQualotBerryItemDescription[] = _("Makes a Pokémon\nfriendly but lowers\nbase Defense."); +const u8 gHondewBerryItemDescription[] = _("Makes a Pokémon\nfriendly but lowers\nbase Sp. Atk."); +const u8 gGrepaBerryItemDescription[] = _("Makes a Pokémon\nfriendly but lowers\nbase Sp. Def."); +const u8 gTamatoBerryItemDescription[] = _("Makes a Pokémon\nfriendly but lowers\nbase Speed."); +const u8 gCornnBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow Cornn."); +const u8 gMagostBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow Magost."); +const u8 gRabutaBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow Rabuta."); +const u8 gNomelBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow Nomel."); +const u8 gSpelonBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow Spelon."); +const u8 gPamtreBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow Pamtre."); +const u8 gWatmelBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow Watmel."); +const u8 gDurinBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow Durin."); +const u8 gBelueBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow Belue."); +const u8 gLiechiBerryItemDescription[] = _("A hold item that\nraises Attack in\na pinch."); +const u8 gGanlonBerryItemDescription[] = _("A hold item that\nraises Defense in\na pinch."); +const u8 gSalacBerryItemDescription[] = _("A hold item that\nraises Speed in\na pinch."); +const u8 gPetayaBerryItemDescription[] = _("A hold item that\nraises Sp. Atk in\na pinch."); +const u8 gApicotBerryItemDescription[] = _("A hold item that\nraises Sp. Def in\na pinch."); const u8 gLansatBerryItemDescription[] = _("A hold item that\nups the critical-\nhit rate in a pinch."); const u8 gStarfBerryItemDescription[] = _("A hold item that\nsharply boosts a\nstat in a pinch."); const u8 gEnigmaBerryItemDescription[] = _("{POKEBLOCK} ingredient.\nPlant in loamy soil\nto grow a mystery."); // Hold items const u8 gBrightPowderItemDescription[] = _("A hold item that\ncasts a glare to\nreduce accuracy."); const u8 gWhiteHerbItemDescription[] = _("A hold item that\nrestores any\nlowered stat."); -const u8 gMachoBraceItemDescription[] = _("A hold item that\npromotes growth,\nbut reduces SPEED."); -const u8 gExpShareItemDescription[] = _("A hold item that\ngets EXP. points\nfrom battles."); +const u8 gMachoBraceItemDescription[] = _("A hold item that\npromotes growth,\nbut reduces Speed."); +const u8 gExpShareItemDescription[] = _("A hold item that\ngets Exp. points\nfrom battles."); const u8 gQuickClawItemDescription[] = _("A hold item that\noccasionally allows\nthe first strike."); const u8 gSootheBellItemDescription[] = _("A hold item that\ncalms spirits and\nfosters friendship."); -const u8 gMentalHerbItemDescription[] = _("A hold item that\nsnaps POKéMON out\nof infatuation."); +const u8 gMentalHerbItemDescription[] = _("A hold item that\nsnaps Pokémon out\nof infatuation."); const u8 gChoiceBandItemDescription[] = _("Raises a move's\npower, but permits\nonly that move."); const u8 gKingsRockItemDescription[] = _("A hold item that\nmay cause flinching\nwhen the foe is hit."); -const u8 gSilverPowderItemDescription[] = _("A hold item that\nraises the power of\nBUG-type moves."); +const u8 gSilverPowderItemDescription[] = _("A hold item that\nraises the power of\nBug-type moves."); const u8 gAmuletCoinItemDescription[] = _("Doubles money in\nbattle if the\nholder takes part."); -const u8 gCleanseTagItemDescription[] = _("A hold item that\nhelps repel wild\nPOKéMON."); -const u8 gSoulDewItemDescription[] = _("Hold item: raises\nSP. ATK & SP. DEF of\nLATIOS & LATIAS."); -const u8 gDeepSeaToothItemDescription[] = _("A hold item that\nraises the SP. ATK\nof CLAMPERL."); -const u8 gDeepSeaScaleItemDescription[] = _("A hold item that\nraises the SP. DEF\nof CLAMPERL."); -const u8 gSmokeBallItemDescription[] = _("A hold item that\nassures fleeing\nfrom wild POKéMON."); +const u8 gCleanseTagItemDescription[] = _("A hold item that\nhelps repel wild\nPokémon."); +const u8 gSoulDewItemDescription[] = _("Hold item: raises\nSp. Atk & Sp. Def of\nLatios & Latias."); +const u8 gDeepSeaToothItemDescription[] = _("A hold item that\nraises the Sp. Atk\nof Clamperl."); +const u8 gDeepSeaScaleItemDescription[] = _("A hold item that\nraises the Sp. Def\nof Clamperl."); +const u8 gSmokeBallItemDescription[] = _("A hold item that\nassures fleeing\nfrom wild Pokémon."); const u8 gEverstoneItemDescription[] = _("A wondrous hold\nitem that prevents\nevolution."); const u8 gFocusBandItemDescription[] = _("A hold item that\noccasionally\nprevents fainting."); -const u8 gLuckyEggItemDescription[] = _("A hold item that\nboosts EXP. points\nearned in battle."); +const u8 gLuckyEggItemDescription[] = _("A hold item that\nboosts Exp. points\nearned in battle."); const u8 gScopeLensItemDescription[] = _("A hold item that\nimproves the\ncritical-hit rate."); -const u8 gMetalCoatItemDescription[] = _("A hold item that\nraises the power of\nSTEEL-type moves."); +const u8 gMetalCoatItemDescription[] = _("A hold item that\nraises the power of\nSteel-type moves."); const u8 gLeftoversItemDescription[] = _("A hold item that\ngradually restores\nHP in battle."); -const u8 gDragonScaleItemDescription[] = _("A strange scale\nheld by DRAGON-\ntype POKéMON."); -const u8 gLightBallItemDescription[] = _("A hold item that\nraises the SP. ATK\nof PIKACHU."); -const u8 gSoftSandItemDescription[] = _("A hold item that\nraises the power of\nGROUND-type moves."); -const u8 gHardStoneItemDescription[] = _("A hold item that\nraises the power of\nROCK-type moves."); -const u8 gMiracleSeedItemDescription[] = _("A hold item that\nraises the power of\nGRASS-type moves."); -const u8 gBlackGlassesItemDescription[] = _("A hold item that\nraises the power of\nDARK-type moves."); -const u8 gBlackBeltItemDescription[] = _("A hold item that\nboosts FIGHTING-\ntype moves."); -const u8 gMagnetItemDescription[] = _("A hold item that\nboosts ELECTRIC-\ntype moves."); -const u8 gMysticWaterItemDescription[] = _("A hold item that\nraises the power of\nWATER-type moves."); -const u8 gSharpBeakItemDescription[] = _("A hold item that\nraises the power of\nFLYING-type moves."); -const u8 gPoisonBarbItemDescription[] = _("A hold item that\nraises the power of\nPOISON-type moves."); -const u8 gNeverMeltIceItemDescription[] = _("A hold item that\nraises the power of\nICE-type moves."); -const u8 gSpellTagItemDescription[] = _("A hold item that\nraises the power of\nGHOST-type moves."); -const u8 gTwistedSpoonItemDescription[] = _("A hold item that\nboosts PSYCHIC-\ntype moves."); -const u8 gCharcoalItemDescription[] = _("A hold item that\nraises the power of\nFIRE-type moves."); -const u8 gDragonFangItemDescription[] = _("A hold item that\nraises the power of\nDRAGON-type moves."); -const u8 gSilkScarfItemDescription[] = _("A hold item that\nraises the power of\nNORMAL-type moves."); -const u8 gUpGradeItemDescription[] = _("A peculiar box made\nby SILPH CO."); +const u8 gDragonScaleItemDescription[] = _("A strange scale\nheld by Dragon-\ntype Pokémon."); +const u8 gLightBallItemDescription[] = _("A hold item that\nraises the Sp. Atk\nof Pikachu."); +const u8 gSoftSandItemDescription[] = _("A hold item that\nraises the power of\nGround-type moves."); +const u8 gHardStoneItemDescription[] = _("A hold item that\nraises the power of\nRock-type moves."); +const u8 gMiracleSeedItemDescription[] = _("A hold item that\nraises the power of\nGrass-type moves."); +const u8 gBlackGlassesItemDescription[] = _("A hold item that\nraises the power of\nDark-type moves."); +const u8 gBlackBeltItemDescription[] = _("A hold item that\nboosts Fighting-\ntype moves."); +const u8 gMagnetItemDescription[] = _("A hold item that\nboosts Electric-\ntype moves."); +const u8 gMysticWaterItemDescription[] = _("A hold item that\nraises the power of\nWater-type moves."); +const u8 gSharpBeakItemDescription[] = _("A hold item that\nraises the power of\nFlying-type moves."); +const u8 gPoisonBarbItemDescription[] = _("A hold item that\nraises the power of\nPoison-type moves."); +const u8 gNeverMeltIceItemDescription[] = _("A hold item that\nraises the power of\nIce-type moves."); +const u8 gSpellTagItemDescription[] = _("A hold item that\nraises the power of\nGhost-type moves."); +const u8 gTwistedSpoonItemDescription[] = _("A hold item that\nboosts Psychic-\ntype moves."); +const u8 gCharcoalItemDescription[] = _("A hold item that\nraises the power of\nFire-type moves."); +const u8 gDragonFangItemDescription[] = _("A hold item that\nraises the power of\nDragon-type moves."); +const u8 gSilkScarfItemDescription[] = _("A hold item that\nraises the power of\nNormal-type moves."); +const u8 gUpGradeItemDescription[] = _("A peculiar box made\nby Silph Co."); const u8 gShellBellItemDescription[] = _("A hold item that\nrestores HP upon\nstriking the foe."); -const u8 gSeaIncenseItemDescription[] = _("A hold item that\nslightly boosts\nWATER-type moves."); +const u8 gSeaIncenseItemDescription[] = _("A hold item that\nslightly boosts\nWater-type moves."); const u8 gLaxIncenseItemDescription[] = _("A hold item that\nslightly lowers the\nfoe's accuracy."); -const u8 gLuckyPunchItemDescription[] = _("A hold item that\nraises CHANSEY's\ncritical-hit rate."); -const u8 gMetalPowderItemDescription[] = _("A hold item that\nraises DITTO's\nDEFENSE."); -const u8 gThickClubItemDescription[] = _("A hold item that \nraises CUBONE or\nMAROWAK's ATTACK."); -const u8 gStickItemDescription[] = _("A hold item that\nraises FARFETCH'D's\ncritical-hit ratio."); -const u8 gRedScarfItemDescription[] = _("A hold item that\nraises COOL in\nCONTESTS."); -const u8 gBlueScarfItemDescription[] = _("A hold item that\nraises BEAUTY in\nCONTESTS."); -const u8 gPinkScarfItemDescription[] = _("A hold item that\nraises CUTE in\nCONTESTS."); -const u8 gGreenScarfItemDescription[] = _("A hold item that\nraises SMART in\nCONTESTS."); -const u8 gYellowScarfItemDescription[] = _("A hold item that\nraises TOUGH in\nCONTESTS."); +const u8 gLuckyPunchItemDescription[] = _("A hold item that\nraises Chansey's\ncritical-hit rate."); +const u8 gMetalPowderItemDescription[] = _("A hold item that\nraises Ditto's\nDefense."); +const u8 gThickClubItemDescription[] = _("A hold item that \nraises Cubone or\nMarowak's Attack."); +const u8 gStickItemDescription[] = _("A hold item that\nraises Farfetch'd's\ncritical-hit ratio."); +const u8 gRedScarfItemDescription[] = _("A hold item that\nraises Cool in\nContests."); +const u8 gBlueScarfItemDescription[] = _("A hold item that\nraises Beauty in\nContests."); +const u8 gPinkScarfItemDescription[] = _("A hold item that\nraises Cute in\nContests."); +const u8 gGreenScarfItemDescription[] = _("A hold item that\nraises Smart in\nContests."); +const u8 gYellowScarfItemDescription[] = _("A hold item that\nraises Tough in\nContests."); // Key items const u8 gMachBikeItemDescription[] = _("A folding bicycle\nthat doubles your\nspeed or better."); const u8 gCoinCaseItemDescription[] = _("A case that holds\nup to 9,999 COINS."); const u8 gItemfinderItemDescription[] = _("A device that\nsignals an invisible\nitem by sound."); -const u8 gOldRodItemDescription[] = _("Use by any body of\nwater to fish for\nwild POKéMON."); -const u8 gGoodRodItemDescription[] = _("A decent fishing\nrod for catching\nwild POKéMON."); -const u8 gSuperRodItemDescription[] = _("The best fishing\nrod for catching\nwild POKéMON."); +const u8 gOldRodItemDescription[] = _("Use by any body of\nwater to fish for\nwild Pokémon."); +const u8 gGoodRodItemDescription[] = _("A decent fishing\nrod for catching\nwild Pokémon."); +const u8 gSuperRodItemDescription[] = _("The best fishing\nrod for catching\nwild Pokémon."); const u8 gSSTicketItemDescription[] = _("The ticket required\nfor sailing on a\nferry."); -const u8 gContestPassItemDescription[] = _("The pass required\nfor entering\nPOKéMON CONTESTS."); -const u8 gWailmerPailItemDescription[] = _("A tool used for\nwatering BERRIES\nand plants."); -const u8 gDevonGoodsItemDescription[] = _("A package that\ncontains DEVON's\nmachine parts."); +const u8 gContestPassItemDescription[] = _("The pass required\nfor entering\nPokémon Contests."); +const u8 gWailmerPailItemDescription[] = _("A tool used for\nwatering Berries\nand plants."); +const u8 gDevonGoodsItemDescription[] = _("A package that\ncontains Devon's\nmachine parts."); const u8 gSootSackItemDescription[] = _("A sack used to\ngather and hold\nvolcanic ash."); -const u8 gBasementKeyItemDescription[] = _("The key for NEW\nMAUVILLE beneath\nMAUVILLE CITY."); +const u8 gBasementKeyItemDescription[] = _("The key for New\nMauville beneath\nMauville City."); const u8 gAcroBikeItemDescription[] = _("A folding bicycle\ncapable of jumps\nand wheelies."); -const u8 gPokeblockCaseItemDescription[] = _("A case for holding\n{POKEBLOCK}S made with\na BERRY BLENDER."); -const u8 gLetterItemDescription[] = _("A letter to STEVEN\nfrom the PRESIDENT\nof the DEVON CORP."); +const u8 gPokeblockCaseItemDescription[] = _("A case for holding\n{POKEBLOCK}S made with\na Berry Blender."); +const u8 gLetterItemDescription[] = _("A letter to Steven\nfrom the President\nof the Devon Corp."); const u8 gEonTicketItemDescription[] = _("The ticket for a\nferry to a distant\nsouthern island."); const u8 gRedOrbItemDescription[] = _("A red, glowing orb\nsaid to contain an\nancient power."); const u8 gBlueOrbItemDescription[] = _("A blue, glowing orb\nsaid to contain an\nancient power."); -const u8 gScannerItemDescription[] = _("A device found\ninside the\nABANDONED SHIP."); +const u8 gScannerItemDescription[] = _("A device found\ninside the\nAbandoned Ship."); const u8 gGoGogglesItemDescription[] = _("Nifty goggles that\nprotect eyes from\ndesert sandstorms."); -const u8 gMeteoriteItemDescription[] = _("A meteorite found\nat METEOR FALLS."); -const u8 gRoom1KeyItemDescription[] = _("A key that opens a\ndoor inside the\nABANDONED SHIP."); -const u8 gRoom2KeyItemDescription[] = _("A key that opens a\ndoor inside the\nABANDONED SHIP."); -const u8 gRoom4KeyItemDescription[] = _("A key that opens a\ndoor inside the\nABANDONED SHIP."); -const u8 gRoom6KeyItemDescription[] = _("A key that opens a\ndoor inside the\nABANDONED SHIP."); -const u8 gStorageKeyItemDescription[] = _("The key to the\nstorage inside the\nABANDONED SHIP."); -const u8 gRootFossilItemDescription[] = _("A fossil of an\nancient, seafloor-\ndwelling POKéMON."); -const u8 gClawFossilItemDescription[] = _("A fossil of an\nancient, seafloor-\ndwelling POKéMON."); -const u8 gDevonScopeItemDescription[] = _("A device by DEVON\nthat signals any\nunseeable POKéMON."); +const u8 gMeteoriteItemDescription[] = _("A meteorite found\nat Meteor Falls."); +const u8 gRoom1KeyItemDescription[] = _("A key that opens a\ndoor inside the\nAbandoned Ship."); +const u8 gRoom2KeyItemDescription[] = _("A key that opens a\ndoor inside the\nAbandoned Ship."); +const u8 gRoom4KeyItemDescription[] = _("A key that opens a\ndoor inside the\nAbandoned Ship."); +const u8 gRoom6KeyItemDescription[] = _("A key that opens a\ndoor inside the\nAbandoned Ship."); +const u8 gStorageKeyItemDescription[] = _("The key to the\nstorage inside the\nAbandoned Ship."); +const u8 gRootFossilItemDescription[] = _("A fossil of an\nancient, seafloor-\ndwelling Pokémon."); +const u8 gClawFossilItemDescription[] = _("A fossil of an\nancient, seafloor-\ndwelling Pokémon."); +const u8 gDevonScopeItemDescription[] = _("A device by Devon\nthat signals any\nunseeable Pokémon."); // TMs/HMs const u8 gTM01ItemDescription[] = _("Powerful, but makes\nthe user flinch if\nhit by the foe."); const u8 gTM02ItemDescription[] = _("Hooks and slashes\nthe foe with long,\nsharp claws."); const u8 gTM03ItemDescription[] = _("Generates an\nultrasonic wave\nthat may confuse."); -const u8 gTM04ItemDescription[] = _("Raises SP. ATK and\nSP. DEF by focusing\nthe mind."); +const u8 gTM04ItemDescription[] = _("Raises Sp. Atk and\nSp. Def by focusing\nthe mind."); const u8 gTM05ItemDescription[] = _("A savage roar that\nmakes the foe flee \nto end the battle."); const u8 gTM06ItemDescription[] = _("Poisons the foe\nwith a toxin that\ngradually worsens."); const u8 gTM07ItemDescription[] = _("Creates a hailstorm\nthat damages all\ntypes except ICE."); -const u8 gTM08ItemDescription[] = _("Bulks up the body\nto boost both\nATTACK & DEFENSE."); +const u8 gTM08ItemDescription[] = _("Bulks up the body\nto boost both\nAttack & Defense."); const u8 gTM09ItemDescription[] = _("Shoots 2 to 5 seeds\nin a row to strike\nthe foe."); -const u8 gTM10ItemDescription[] = _("The attack power\nvaries among\ndifferent POKéMON."); -const u8 gTM11ItemDescription[] = _("Raises the power of\nFIRE-type moves\nfor 5 turns."); +const u8 gTM10ItemDescription[] = _("The attack power\nvaries among\ndifferent Pokémon."); +const u8 gTM11ItemDescription[] = _("Raises the power of\nFire-type moves\nfor 5 turns."); const u8 gTM12ItemDescription[] = _("Enrages the foe so\nit can only use\nattack moves."); const u8 gTM13ItemDescription[] = _("Fires an icy cold\nbeam that may\nfreeze the foe."); const u8 gTM14ItemDescription[] = _("A brutal snow-and-\nwind attack that\nmay freeze the foe."); const u8 gTM15ItemDescription[] = _("Powerful, but needs\nrecharging the\nnext turn."); -const u8 gTM16ItemDescription[] = _("Creates a wall of\nlight that lowers\nSP. ATK damage."); +const u8 gTM16ItemDescription[] = _("Creates a wall of\nlight that lowers\nSp. Atk damage."); const u8 gTM17ItemDescription[] = _("Negates all damage,\nbut may fail if used\nin succession."); -const u8 gTM18ItemDescription[] = _("Raises the power of\nWATER-type moves\nfor 5 turns."); +const u8 gTM18ItemDescription[] = _("Raises the power of\nWater-type moves\nfor 5 turns."); const u8 gTM19ItemDescription[] = _("Recovers half the\nHP of the damage \nthis move inflicts."); const u8 gTM20ItemDescription[] = _("Prevents status\nabnormality with a\nmystical power."); const u8 gTM21ItemDescription[] = _("The less the user\nlikes you, the more\npowerful this move."); const u8 gTM22ItemDescription[] = _("Absorbs sunlight in\nthe 1st turn, then\nattacks next turn."); -const u8 gTM23ItemDescription[] = _("Slams the foe with\na hard tail. It may\nlower DEFENSE."); +const u8 gTM23ItemDescription[] = _("Slams the foe with\na hard tail. It may\nlower Defense."); const u8 gTM24ItemDescription[] = _("A powerful electric\nattack that may\ncause paralysis."); const u8 gTM25ItemDescription[] = _("Strikes the foe\nwith a thunderbolt.\nIt may paralyze."); const u8 gTM26ItemDescription[] = _("Causes a quake\nthat has no effect\non flying foes."); const u8 gTM27ItemDescription[] = _("The more the user\nlikes you, the more\npowerful this move."); const u8 gTM28ItemDescription[] = _("Digs underground\nthe 1st turn, then\nstrikes next turn."); -const u8 gTM29ItemDescription[] = _("A powerful psychic\nattack that may\nlower SP. DEF."); -const u8 gTM30ItemDescription[] = _("Hurls a dark lump\nat the foe. It may\nlower SP. DEF."); -const u8 gTM31ItemDescription[] = _("Destroys barriers\nlike LIGHT SCREEN\nand causes damage."); +const u8 gTM29ItemDescription[] = _("A powerful psychic\nattack that may\nlower Sp. Def."); +const u8 gTM30ItemDescription[] = _("Hurls a dark lump\nat the foe. It may\nlower Sp. Def."); +const u8 gTM31ItemDescription[] = _("Destroys barriers\nlike Light Screen\nand causes damage."); const u8 gTM32ItemDescription[] = _("Creates illusory\ncopies to enhance\nelusiveness."); const u8 gTM33ItemDescription[] = _("Creates a wall of\nlight that weakens\nphysical attacks."); const u8 gTM34ItemDescription[] = _("Zaps the foe with a\njolt of electricity\nthat never misses."); @@ -273,10 +273,10 @@ const u8 gTM35ItemDescription[] = _("Looses a stream of\nfire that may burn\nthe const u8 gTM36ItemDescription[] = _("Hurls sludge at the\nfoe. It may poison\nthe foe."); const u8 gTM37ItemDescription[] = _("Causes a sandstorm\nthat hits the foe\nover several turns."); const u8 gTM38ItemDescription[] = _("A powerful fire\nattack that may\nburn the foe."); -const u8 gTM39ItemDescription[] = _("Stops the foe from\nmoving with rocks.\nMay lower SPEED."); +const u8 gTM39ItemDescription[] = _("Stops the foe from\nmoving with rocks.\nMay lower Speed."); const u8 gTM40ItemDescription[] = _("An extremely fast\nattack that can't\nbe avoided."); const u8 gTM41ItemDescription[] = _("Prevents the foe\nfrom using the same\nmove in a row."); -const u8 gTM42ItemDescription[] = _("Raises ATTACK when\npoisoned, burned,\nor paralyzed."); +const u8 gTM42ItemDescription[] = _("Raises Attack when\npoisoned, burned,\nor paralyzed."); const u8 gTM43ItemDescription[] = _("Adds an effect to\nattack depending\non the location."); const u8 gTM44ItemDescription[] = _("The user sleeps for\n2 turns to restore\nhealth and status."); const u8 gTM45ItemDescription[] = _("Makes it tough to\nattack a foe of the\nopposite gender."); @@ -284,43 +284,146 @@ const u8 gTM46ItemDescription[] = _("While attacking,\nit may steal the\nfoe's h const u8 gTM47ItemDescription[] = _("Spreads hard-\nedged wings and\nslams into the foe."); const u8 gTM48ItemDescription[] = _("Switches abilities\nwith the foe on the\nturn this is used."); const u8 gTM49ItemDescription[] = _("Steals the effects\nof the move the foe\nis trying to use."); -const u8 gTM50ItemDescription[] = _("Enables full-power\nattack, but sharply\nlowers SP. ATK."); +const u8 gTM50ItemDescription[] = _("Enables full-power\nattack, but sharply\nlowers Sp. Atk."); const u8 gHM01ItemDescription[] = _("Attacks the foe\nwith sharp blades\nor claws."); const u8 gHM02ItemDescription[] = _("Flies up on the\nfirst turn, then\nattacks next turn."); const u8 gHM03ItemDescription[] = _("Creates a huge\nwave, then crashes\nit down on the foe."); const u8 gHM04ItemDescription[] = _("Builds enormous\npower, then slams\nthe foe."); const u8 gHM05ItemDescription[] = _("Looses a powerful\nblast of light that\nreduces accuracy."); -const u8 gHM06ItemDescription[] = _("A rock-crushingly\ntough attack that\nmay lower DEFENSE."); +const u8 gHM06ItemDescription[] = _("A rock-crushingly\ntough attack that\nmay lower Defense."); const u8 gHM07ItemDescription[] = _("Attacks the foe\nwith enough power\nto climb waterfalls."); const u8 gHM08ItemDescription[] = _("Dives underwater\nthe 1st turn, then\nattacks next turn."); // FireRed/LeafGreen key items -const u8 gOaksParcelItemDescription[] = _("A parcel for PROF.\nOAK from a POKéMON\nMART's clerk."); -const u8 gPokeFluteItemDescription[] = _("A sweet-sounding\nflute that awakens\nPOKéMON."); -const u8 gSecretKeyItemDescription[] = _("The key to the\nCINNABAR ISLAND\nGYM's entrance."); -const u8 gBikeVoucherItemDescription[] = _("A voucher for\nobtaining a bicycle\nfrom the BIKE SHOP."); -const u8 gGoldTeethItemDescription[] = _("Gold dentures lost\nby the SAFARI\nZONE's WARDEN."); -const u8 gOldAmberItemDescription[] = _("A stone containing\nthe genes of an\nancient POKéMON."); -const u8 gCardKeyItemDescription[] = _("A card-type door\nkey used in SILPH\nCO's office."); -const u8 gLiftKeyItemDescription[] = _("An elevator key\nused in TEAM\nROCKET's HIDEOUT."); -const u8 gHelixFossilItemDescription[] = _("A piece of an\nancient marine\nPOKéMON's seashell."); -const u8 gDomeFossilItemDescription[] = _("A piece of an\nancient marine\nPOKéMON's shell."); -const u8 gSilphScopeItemDescription[] = _("SILPH CO's scope\nmakes unseeable\nPOKéMON visible."); -const u8 gBicycleItemDescription[] = _("A folding bicycle\nthat is faster than\nthe RUNNING SHOES."); +const u8 gOaksParcelItemDescription[] = _("A parcel for Prof.\nOak from a Pokémon\nMART's clerk."); +const u8 gPokeFluteItemDescription[] = _("A sweet-sounding\nflute that awakens\nPokémon."); +const u8 gSecretKeyItemDescription[] = _("The key to the\nCinnabar Island\nGym's entrance."); +const u8 gBikeVoucherItemDescription[] = _("A voucher for\nobtaining a bicycle\nfrom the Bike Shp."); +const u8 gGoldTeethItemDescription[] = _("Gold dentures lost\nby the Safari\nZone's Warden."); +const u8 gOldAmberItemDescription[] = _("A stone containing\nthe genes of an\nancient Pokémon."); +const u8 gCardKeyItemDescription[] = _("A card-type door\nkey used in Silph\nCo's office."); +const u8 gLiftKeyItemDescription[] = _("An elevator key\nused in Team\nRocket's Hideout."); +const u8 gHelixFossilItemDescription[] = _("A piece of an\nancient marine\nPokémon's seashell."); +const u8 gDomeFossilItemDescription[] = _("A piece of an\nancient marine\nPokémon's shell."); +const u8 gSilphScopeItemDescription[] = _("Silph Co's scope\nmakes unseeable\nPokémon visible."); +const u8 gBicycleItemDescription[] = _("A folding bicycle\nthat is faster than\nthe Running Shoes."); const u8 gTownMapItemDescription[] = _("Can be viewed\nanytime. Shows your\npresent location."); -const u8 gVSSeekerItemDescription[] = _("A rechargeable unit\nthat flags battle-\nready TRAINERS."); +const u8 gVSSeekerItemDescription[] = _("A rechargeable unit\nthat flags battle-\nready Trainers."); const u8 gFameCheckerItemDescription[] = _("Stores information\non famous people\nfor instant recall."); const u8 gTMCaseItemDescription[] = _("A convenient case \nthat holds TMs and\nHMs."); -const u8 gBerryPouchItemDescription[] = _("A convenient\ncontainer that\nholds BERRIES."); -const u8 gTeachyTVItemDescription[] = _("A TV set tuned to\nan advice program\nfor TRAINERS."); -const u8 gTriPassItemDescription[] = _("A pass for ferries\nbetween ONE, TWO,\nand THREE ISLAND."); -const u8 gRainbowPassItemDescription[] = _("For ferries serving\nVERMILION and the\nSEVII ISLANDS."); +const u8 gBerryPouchItemDescription[] = _("A convenient\ncontainer that\nholds Berries."); +const u8 gTeachyTVItemDescription[] = _("A TV set tuned to\nan advice program\nfor Trainers."); +const u8 gTriPassItemDescription[] = _("A pass for ferries\nbetween One, Two,\nand Three Island."); +const u8 gRainbowPassItemDescription[] = _("For ferries serving\nVermilion and the\nSevii Islands."); const u8 gTeaItemDescription[] = _("A thirst-quenching\ntea prepared by an\nold lady."); -const u8 gMysticTicketItemDescription[] = _("A ticket required\nto board the ship\nto NAVEL ROCK."); -const u8 gAuroraTicketItemDescription[] = _("A ticket required\nto board the ship\nto BIRTH ISLAND."); -const u8 gPowderJarItemDescription[] = _("Stores BERRY\nPOWDER made using\na BERRY CRUSHER."); +const u8 gMysticTicketItemDescription[] = _("A ticket required\nto board the ship\nto Navel Rock."); +const u8 gAuroraTicketItemDescription[] = _("A ticket required\nto board the ship\nto Birth Island."); +const u8 gPowderJarItemDescription[] = _("Stores Berry\nPowder made using\na Berry Crusher."); const u8 gRubyItemDescription[] = _("An exquisite, red-\nglowing gem that\nsymbolizes passion."); const u8 gSapphireItemDescription[] = _("A brilliant blue gem\nthat symbolizes\nhonesty."); // Emerald-specific key items -const u8 gMagmaEmblemItemDescription[] = _("A medal-like item in\nthe same shape as\nTEAM MAGMA's mark."); +const u8 gMagmaEmblemItemDescription[] = _("A medal-like item in\nthe same shape as\nTeam Magma's mark."); const u8 gOldSeaMapItemDescription[] = _("A faded sea chart\nthat shows the way\nto a certain island."); +//New items +const u8 gWideLensItemDescription[] = _("A magnifying lens\nthat boosts the\naccuracy of moves."); +const u8 gMuscleBandItemDescription[] = _("A headband that\nboosts the power of\nphysical moves."); +const u8 gWiseGlassesItemDescription[] = _("A pair of glasses\nthat boosts the power\nof special moves."); +const u8 gExpertBeltItemDescription[] = _("A belt that boosts\nthe power of super\neffective moves."); +const u8 gLightClayItemDescription[] = _("Extends the duration\nof barrier moves\nused by the holder."); +const u8 gLifeOrbItemDescription[] = _("Boosts the power of\nmoves at the cost\nof some HP per turn."); +const u8 gPowerHerbItemDescription[] = _("Allows the immediate\nuse of a move that\ncharges first."); +const u8 gToxicOrbItemDescription[] = _("A bizarre orb that\nbadly poisons the\nholder in battle."); +const u8 gFlameOrbItemDescription[] = _("A bizarre orb that\ninflicts a burn on\nholder in battle."); +const u8 gQuickPowderItemDescription[] = _("An item to be held\nby Ditto. This odd\npowder boosts Speed."); +const u8 gFocusSashItemDescription[] = _("If the holder has\nfull HP, it endures\nKO attacks with 1 HP."); +const u8 gZoomLensItemDescription[] = _("If the holder moves\nafter the foe, its\naccuracy is boosted."); +const u8 gMetronomeItemDescription[] = _("A held item that\nboosts a move used\nconsecutively."); +const u8 gIronBallItemDescription[] = _("Lowers Speed and\nlets Flying-types be\nhit by Ground moves."); +const u8 gLaggingTailItemDescription[] = _("A held item that\nmakes the holder\nmove slower."); +const u8 gDestinyKnotItemDescription[] = _("If the holder becomes\ninfatuated, the\nfoe does too."); +const u8 gBlackSludgeItemDescription[] = _("Gradually restores\nHP of Poison-types.\nDamages others."); +const u8 gIcyRockItemDescription[] = _("Extends the duration\nof the move Hail\nused by the holder."); +const u8 gSmoothRockItemDescription[] = _("Extends the duration\nof Sandstorm if\nused by the holder."); +const u8 gHeatRockItemDescription[] = _("Extends the duration\nof Sunny Day if\nused by the holder."); +const u8 gDampRockItemDescription[] = _("Extends the duration\nof Rain Dance if\nused by the holder."); +const u8 gGripClawItemDescription[] = _("Makes binding moves\nused by the holder\ngo on for 7 turns."); +const u8 gChoiceScarfItemDescription[] = _("Boosts Speed, but\nallows the use of\nonly one move."); +const u8 gStickyBarbItemDescription[] = _("Damages the holder\neach turn. May latch\non to foes."); +const u8 gShedShellItemDescription[] = _("Enables the holder\nto switch out of\nbattle without fail."); +const u8 gBigRootItemDescription[] = _("A held item that\nboosts the power of\nHP-stealing moves."); +const u8 gChoiceSpecsItemDescription[] = _("Boosts Sp. Atk, but\nallows the use of\nonly one move."); +const u8 gAdamantOrbItemDescription[] = _("Boosts the power of\nDialga's Dragon and\nSteel-type moves."); +const u8 gLustrousOrbItemDescription[] = _("Boosts the power of\nPalkia's Dragon and\nWater-type moves."); +const u8 gGriseousOrbItemDescription[] = _("Boosts the power of\nGiratina's Dragon\nand Ghost-type moves."); +const u8 gFlamePlateItemDescription[] = _("A stone tablet that\nboosts the power of\nFire-type moves."); +const u8 gSplashPlateItemDescription[] = _("A stone tablet that\nboosts the power of\nWater-type moves."); +const u8 gZapPlateItemDescription[] = _("A stone tablet that\nboosts the power of\nElectric-type moves."); +const u8 gMeadowPlateItemDescription[] = _("A stone tablet that\nboosts the power of\nGrass-type moves."); +const u8 gIciclePlateItemDescription[] = _("A stone tablet that\nboosts the power of\nIce-type moves."); +const u8 gFistPlateItemDescription[] = _("A stone tablet that\nboosts the power of\nFighting-type moves."); +const u8 gToxicPlateItemDescription[] = _("A stone tablet that\nboosts the power of\nPoison-type moves."); +const u8 gEarthPlateItemDescription[] = _("A stone tablet that\nboosts the power of\nGround-type moves."); +const u8 gSkyPlateItemDescription[] = _("A stone tablet that\nboosts the power of\nFlying-type moves."); +const u8 gMindPlateItemDescription[] = _("A stone tablet that\nboosts the power of\nPsychic-type moves."); +const u8 gInsectPlateItemDescription[] = _("A stone tablet that\nboosts the power of\nBug-type moves."); +const u8 gStonePlateItemDescription[] = _("A stone tablet that\nboosts the power of\nRock-type moves."); +const u8 gSpookyPlateItemDescription[] = _("A stone tablet that\nboosts the power of\nGhost-type moves."); +const u8 gDracoPlateItemDescription[] = _("A stone tablet that\nboosts the power of\nDragon-type moves."); +const u8 gDreadPlateItemDescription[] = _("A stone tablet that\nboosts the power of\nDark-type moves."); +const u8 gIronPlateItemDescription[] = _("A stone tablet that\nboosts the power of\nSteel-type moves."); +const u8 gEvioliteItemDescription[] = _("Raises the Def and\nSp. Def of Pokémon\nthat can still evolve."); +const u8 gFloatStoneItemDescription[] = _("A light stone that\nreduces the weight\nof Pokémon when held."); +const u8 gBindingBandItemDescription[] = _("This band increases\nthe power of binding\nmoves when held."); +const u8 gDouseDriveItemDescription[] = _("Changes Genesect's\nTechno Blast so it\nbecomes Water type."); +const u8 gShockDriveItemDescription[] = _("Changes Genesect's\nTechno Blast so it\nbecomes Electric type."); +const u8 gBurnDriveItemDescription[] = _("Changes Genesect's\nTechno Blast so it\nbecomes Fire type."); +const u8 gChillDriveItemDescription[] = _("Changes Genesect's\nTechno Blast so it\nbecomes Ice type."); +const u8 gAssaultVestItemDescription[] = _("Raises Sp. Def but\nprevents the use of\nstatus moves."); +const u8 gPixiePlateItemDescription[] = _("A stone tablet that\nboosts the power of\nFairy-type moves."); +const u8 gGengariteItemDescription[] = _("This stone enables\nGengar to Mega\nEvolve in battle."); +const u8 gGardevoiriteItemDescription[] = _("This stone enables\nGardevoir to Mega\nEvolve in battle."); +const u8 gAmpharositeItemDescription[] = _("This stone enables\nAmpharos to Mega\nEvolve in battle."); +const u8 gVenusauriteItemDescription[] = _("This stone enables\nVenusaur to Mega\nEvolve in battle."); +const u8 gCharizarditeItemDescription[] = _("This stone enables\nCharizard to Mega\nEvolve in battle."); +const u8 gBlastoisiniteItemDescription[] = _("This stone enables\nBlastoise to Mega\nEvolve in battle."); +const u8 gMewtwoniteItemDescription[] = _("This stone enables\nMewtwo to Mega\nEvolve in battle."); +const u8 gBlazikeniteItemDescription[] = _("This stone enables\nBlaziken to Mega\nEvolve in battle."); +const u8 gMedichamiteItemDescription[] = _("This stone enables\nMedicham to Mega\nEvolve in battle."); +const u8 gHoundoominiteItemDescription[] = _("This stone enables\nHoundoom to Mega\nEvolve in battle."); +const u8 gAggroniteItemDescription[] = _("This stone enables\nAggron to Mega\nEvolve in battle."); +const u8 gBanettiteItemDescription[] = _("This stone enables\nBanette to Mega\nEvolve in battle."); +const u8 gTyranitariteItemDescription[] = _("This stone enables\nTyranitar to Mega\nEvolve in battle."); +const u8 gScizoriteItemDescription[] = _("This stone enables\nScizor to Mega\nEvolve in battle."); +const u8 gPinsiriteItemDescription[] = _("This stone enables\nPinsir to Mega\nEvolve in battle."); +const u8 gAerodactyliteItemDescription[] = _("This stone enables\nAerodactyl to Mega\nEvolve in battle."); +const u8 gLucarioniteItemDescription[] = _("This stone enables\nLucario to Mega\nEvolve in battle."); +const u8 gAbomasiteItemDescription[] = _("This stone enables\nAbomasnow to Mega\nEvolve in battle."); +const u8 gKangaskhaniteItemDescription[] = _("This stone enables\nKangaskhan to Mega\nEvolve in battle."); +const u8 gGyaradositeItemDescription[] = _("This stone enables\nGyarados to Mega\nEvolve in battle."); +const u8 gAbsoliteItemDescription[] = _("This stone enables\nAbsol to Mega\nEvolve in battle."); +const u8 gAlakaziteItemDescription[] = _("This stone enables\nAlakazam to Mega\nEvolve in battle."); +const u8 gHeracroniteItemDescription[] = _("This stone enables\nHeracross to Mega\nEvolve in battle."); +const u8 gMawiliteItemDescription[] = _("This stone enables\nMawile to Mega\nEvolve in battle."); +const u8 gManectiteItemDescription[] = _("This stone enables\nManectric to Mega\nEvolve in battle."); +const u8 gGarchompiteItemDescription[] = _("This stone enables\nGarchomp to Mega\nEvolve in battle."); +const u8 gLatiasiteItemDescription[] = _("This stone enables\nLatias to Mega\nEvolve in battle."); +const u8 gLatiositeItemDescription[] = _("This stone enables\nLatios to Mega\nEvolve in battle."); +const u8 gSwampertiteItemDescription[] = _("This stone enables\nSwampert to Mega\nEvolve in battle."); +const u8 gSceptiliteItemDescription[] = _("This stone enables\nSceptile to Mega\nEvolve in battle."); +const u8 gSableniteItemDescription[] = _("This stone enables\nSableye to Mega\nEvolve in battle."); +const u8 gAltarianiteItemDescription[] = _("This stone enables\nAltaria to Mega\nEvolve in battle."); +const u8 gGalladiteItemDescription[] = _("This stone enables\nGallade to Mega\nEvolve in battle."); +const u8 gAudiniteItemDescription[] = _("This stone enables\nAudino to Mega\nEvolve in battle."); +const u8 gMetagrossiteItemDescription[] = _("This stone enables\nMetagross to Mega\nEvolve in battle."); +const u8 gSharpedoniteItemDescription[] = _("This stone enables\nSharpedo to Mega\nEvolve in battle."); +const u8 gSlowbroniteItemDescription[] = _("This stone enables\nSlowbro to Mega\nEvolve in battle."); +const u8 gSteelixiteItemDescription[] = _("This stone enables\nSteelix to Mega\nEvolve in battle."); +const u8 gPidgeotiteItemDescription[] = _("This stone enables\nPidgeot to Mega\nEvolve in battle."); +const u8 gGlalititeItemDescription[] = _("This stone enables\nGlalie to Mega\nEvolve in battle."); +const u8 gDianciteItemDescription[] = _("This stone enables\nDiancie to Mega\nEvolve in battle."); +const u8 gCameruptiteItemDescription[] = _("This stone enables\nCamerupt to Mega\nEvolve in battle."); +const u8 gLoppuniteItemDescription[] = _("This stone enables\nLoppunny to Mega\nEvolve in battle."); +const u8 gSalamenciteItemDescription[] = _("This stone enables\nSalamence to Mega\nEvolve in battle."); +const u8 gBeedrilliteItemDescription[] = _("This stone enables\nBeedrill to Mega\nEvolve in battle."); +const u8 gKeyStoneItemDescription[] = _("Allows Pokémon holding\na Mega Stone to Mega\nEvolve in battle."); +const u8 gProtectPadsItemDescription[] = _("Protects the holder\nfrom effects caused\nby contact moves."); From 736826e86309afa32354c838e05e8397ed04584f Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 27 Jan 2019 20:54:34 +0100 Subject: [PATCH 236/667] New feature - battle 2 vs 1 opponent --- .../scripts.inc | 2 +- include/battle_ai_switch_items.h | 1 + include/constants/battle.h | 1 + src/battle_ai_switch_items.c | 92 ++++++------------- src/battle_controller_opponent.c | 26 ++---- src/battle_controllers.c | 13 ++- src/battle_main.c | 6 +- src/battle_message.c | 12 ++- src/battle_script_commands.c | 37 ++++++-- src/battle_tower.c | 12 ++- src/battle_util.c | 25 ++++- 11 files changed, 125 insertions(+), 102 deletions(-) diff --git a/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc b/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc index 6df9f946e0..a0a2cf1fba 100644 --- a/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc +++ b/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc @@ -48,7 +48,7 @@ EverGrandeCity_PokemonLeague_1F_Pokemart_229624: @ 8229624 EverGrandeCity_PokemonLeague_1F_EventScript_229636:: @ 8229636 special SavePlayerParty - trainerbattle 10, TRAINER_ALBERT, 0, NULL, EverGrandeCity_PokemonLeague_1F_Text_2296E8 + trainerbattle 10, TRAINER_WALLACE, 0, NULL, EverGrandeCity_PokemonLeague_1F_Text_2296E8 trainerbattle 11, TRAINER_ALEXA, 0, NULL, EverGrandeCity_PokemonLeague_1F_Text_2297EF setvar VAR_0x8004, SPECIAL_BATTLE_MULTI 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/constants/battle.h b/include/constants/battle.h index bf94f48e73..8b8bcda5c9 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -80,6 +80,7 @@ #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 0x1 diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index a046a0e2cc..ec0d20ad0c 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -2,6 +2,7 @@ #include "battle.h" #include "battle_ai_script_commands.h" #include "battle_controllers.h" +#include "battle_setup.h" #include "pokemon.h" #include "random.h" #include "util.h" @@ -15,6 +16,25 @@ static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng); 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 ShouldSwitchIfPerishSong(void) { if (gStatuses3[gActiveBattler] & STATUS3_PERISH_SONG @@ -60,17 +80,7 @@ static bool8 ShouldSwitchIfWonderGuard(void) } // 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; @@ -152,17 +162,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; @@ -343,17 +343,7 @@ static bool8 FindMonWithFlagsAndSuperEffective(u16 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; @@ -453,17 +443,7 @@ static bool8 ShouldSwitch(void) battlerIn2 = *activeBattlerPtr; } - 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; @@ -544,17 +524,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++) { @@ -626,17 +596,7 @@ 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; diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 4a44d9ed86..29ef07729c 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -234,7 +234,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; @@ -297,13 +297,13 @@ static void sub_805F560(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1) sub_8172EF0(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); - if (!(gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) && !(gBattleTypeFlags & BATTLE_TYPE_MULTI) && IsDoubleBattle() && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x1) + if (!(gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) && (!(gBattleTypeFlags & BATTLE_TYPE_MULTI) || BATTLE_TWO_VS_ONE_OPPONENT) && IsDoubleBattle() && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x1) sub_8172EF0(gActiveBattler ^ BIT_FLANK, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]); if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) { 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); @@ -335,7 +335,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) @@ -356,7 +356,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)); @@ -1278,7 +1278,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; @@ -1624,17 +1624,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++) { @@ -1884,7 +1874,7 @@ 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) { gBattleResources->bufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; sub_80613DC(gActiveBattler, FALSE); diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 166fc61199..49a400bead 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 "party_menu.h" @@ -153,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)) { diff --git a/src/battle_main.c b/src/battle_main.c index 8f76622f62..c18e72bf6f 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -573,7 +573,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(); } @@ -3245,7 +3245,7 @@ static void DoBattleIntro(void) case B_POSITION_OPPONENT_RIGHT: if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS)) // opponent 2 if exists + if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS) && !BATTLE_TWO_VS_ONE_OPPONENT) // opponent 2 if exists { BtlController_EmitDrawTrainerPic(0); MarkBattlerForControllerExec(gActiveBattler); @@ -3373,7 +3373,7 @@ static void DoBattleIntro(void) case 12: // nothing (*state)++; case 13: // second opponent's mon send out - if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS)) + if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS) && !BATTLE_TWO_VS_ONE_OPPONENT) { if (gBattleTypeFlags & BATTLE_TYPE_x2000000 && !(gBattleTypeFlags & BATTLE_TYPE_x80000000)) gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); diff --git a/src/battle_message.c b/src/battle_message.c index afc8e614de..4ee5b1a6b3 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -2302,7 +2302,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; @@ -2345,7 +2347,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; @@ -2659,7 +2663,7 @@ static const u8 *BattleStringGetOpponentName(u8 *text, u8 multiplayerId, u8 batt toCpy = BattleStringGetOpponentNameByTrainerId(gTrainerBattleOpponent_A, text, multiplayerId, battlerId); break; case B_POSITION_OPPONENT_RIGHT: - if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_MULTI)) + 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); @@ -3098,7 +3102,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) toCpy = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_A); break; case B_POSITION_OPPONENT_RIGHT: - if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && !BATTLE_TWO_VS_ONE_OPPONENT) toCpy = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_B); else toCpy = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_A); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 2b5faf22da..24cd9ce426 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4541,6 +4541,7 @@ static void atk4F_jumpifcantswitch(void) { s32 i; s32 lastMonId; + u8 battlerIn1, battlerIn2; struct Pokemon *party; gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1] & ~(ATK4F_DONT_CHECK_STATUSES)); @@ -4551,11 +4552,28 @@ static void atk4F_jumpifcantswitch(void) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); } + else if (BATTLE_TWO_VS_ONE_OPPONENT && GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT) + { + 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; + } + + if (i == PARTY_SIZE) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); + else + gBattlescriptCurrInstr += 6; + } else if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) { - #ifndef NONMATCHING - asm("":::"r5"); - #endif // NONMATCHING if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT) party = gEnemyParty; else @@ -4651,8 +4669,6 @@ static void atk4F_jumpifcantswitch(void) } else { - u8 battlerIn1, battlerIn2; - if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT) { battlerIn1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); @@ -7952,7 +7968,16 @@ static void atk8F_forcerandomswitch(void) else party = gEnemyParty; - if ((gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER && gBattleTypeFlags & BATTLE_TYPE_LINK) + if (BATTLE_TWO_VS_ONE_OPPONENT && (gBattlerTarget & BIT_SIDE) == 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)) { diff --git a/src/battle_tower.c b/src/battle_tower.c index f96d9a1df3..079c1edc08 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -2374,10 +2374,20 @@ void DoSpecialTrainerBattle(void) BattleTransition_StartOnField(B_TRANSITION_MAGMA); break; case SPECIAL_BATTLE_MULTI: - if (gSpecialVar_0x8005 & 1) + if (gSpecialVar_0x8005 & 1) // Player + AI against wild mon + { gBattleTypeFlags = BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER; + } + else if (gSpecialVar_0x8005 & 2) // Player + AI against one trainer + { + gTrainerBattleOpponent_B = 0xFFFF; + gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER; + } else + { gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER; + } + gPartnerSpriteId = gSpecialVar_0x8007; FillPartnerParty(gSpecialVar_0x8006 + TRAINER_CUSTOM_PARTNER); gPartnerTrainerId = gSpecialVar_0x8006 + TRAINER_CUSTOM_PARTNER; diff --git a/src/battle_util.c b/src/battle_util.c index ccae0d4df4..c72ef5de46 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2,6 +2,7 @@ #include "battle.h" #include "battle_controllers.h" #include "battle_interface.h" +#include "battle_setup.h" #include "constants/battle_script_commands.h" #include "constants/abilities.h" #include "constants/moves.h" @@ -2333,7 +2334,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; From c3126df436354deb016dad32ebee58544c134a2c Mon Sep 17 00:00:00 2001 From: Kurausukun Date: Mon, 28 Jan 2019 00:49:26 -0500 Subject: [PATCH 237/667] Prevent Skarmory from Evolving via Level --- src/data/pokemon/evolution.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/data/pokemon/evolution.h b/src/data/pokemon/evolution.h index b8fc05c1c0..b8e406c5c4 100644 --- a/src/data/pokemon/evolution.h +++ b/src/data/pokemon/evolution.h @@ -185,6 +185,5 @@ const struct Evolution gEvolutionTable[NUM_SPECIES][EVOS_PER_MON] = [SPECIES_SHELGON] = {{EVO_LEVEL, 50, SPECIES_SALAMENCE}}, [SPECIES_BELDUM] = {{EVO_LEVEL, 20, SPECIES_METANG}}, [SPECIES_METANG] = {{EVO_LEVEL, 45, SPECIES_METAGROSS}}, - [SPECIES_SKARMORY] = {{EVO_LEVEL, 40, SPECIES_EXPLOUD}, - {EVO_MEGA_EVOLUTION, ITEM_MEGA_STONE_TESTING, SPECIES_HO_OH}}, + [SPECIES_SKARMORY] = {{EVO_MEGA_EVOLUTION, ITEM_MEGA_STONE_TESTING, SPECIES_HO_OH}}, }; From fab5b86d31a755756c7579c7eabdb10a47548061 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 1 Feb 2019 13:41:08 +0100 Subject: [PATCH 238/667] Fix Embargo string --- data/battle_scripts_1.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 755ae22d19..b6546b5b2b 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1512,7 +1512,7 @@ BattleScript_EffectEmbargo: setembargo BattleScript_ButItFailed attackanimation waitanimation - printstring STRINGID_PKMNIDENTIFIED + printstring STRINGID_PKMNCANTUSEITEMSANYMORE waitmessage 0x40 goto BattleScript_MoveEnd From a3460c9e45b768bab2e24cd9d6ed8b38924431a9 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 1 Feb 2019 14:17:24 +0100 Subject: [PATCH 239/667] Code Belch effect --- data/battle_scripts_1.s | 10 ++++++++ include/battle.h | 1 + include/battle_scripts.h | 2 ++ include/constants/battle_move_effects.h | 1 + include/constants/battle_string_ids.h | 3 ++- src/battle_message.c | 4 +++- src/battle_util.c | 31 ++++++++++++++++++++++++- src/data/battle_moves.h | 2 +- 8 files changed, 50 insertions(+), 4 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index b6546b5b2b..062c50904d 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -341,6 +341,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectAromaticMist .4byte BattleScript_EffectPowder .4byte BattleScript_EffectSpAtkUpHit + .4byte BattleScript_EffectBelch BattleScript_EffectSpAtkUpHit: setmoveeffect MOVE_EFFECT_SP_ATK_PLUS_1 | MOVE_EFFECT_AFFECTS_USER @@ -1671,6 +1672,7 @@ BattleScript_EffectTechnoBlast: BattleScript_EffectJudgment: BattleScript_EffectFusionCombo: BattleScript_EffectRevelationDance: +BattleScript_EffectBelch: jumpifnotmove MOVE_SURF, BattleScript_HitFromAtkCanceler jumpifnostatus3 BS_TARGET, STATUS3_UNDERWATER, BattleScript_HitFromAtkCanceler orword gHitMarker, HITMARKER_IGNORE_UNDERWATER @@ -5222,6 +5224,14 @@ BattleScript_SelectingNotAllowedMoveTauntInPalace:: BattleScript_SelectingNotAllowedMoveGravity:: printselectionstring STRINGID_GRAVITYPREVENTSUSAGE endselectionscript + +BattleScript_SelectingNotAllowedBelch:: + printselectionstring STRINGID_BELCHCANTSELECT + endselectionscript + +BattleScript_SelectingNotAllowedBelchInPalace:: + printstring STRINGID_PKMNCANTUSEMOVETAUNT + goto BattleScript_SelectingUnusableMoveInPalace BattleScript_MoveUsedGravityPrevents:: printstring STRINGID_GRAVITYPREVENTSUSAGE diff --git a/include/battle.h b/include/battle.h index b2161dd9a3..88aee0a708 100644 --- a/include/battle.h +++ b/include/battle.h @@ -572,6 +572,7 @@ struct BattleStruct const u8 *trainerSlideMsg; bool8 trainerSlideLowHpMsgDone; u8 introState; + u8 ateBerry[2]; // array id determined by side, each party pokemon as bit }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 3961a44bbc..b628531c54 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -287,5 +287,7 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index db4ea0a1f6..7d1f1399ac 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -329,5 +329,6 @@ #define EFFECT_AROMATIC_MIST 323 #define EFFECT_POWDER 324 #define EFFECT_SP_ATTACK_UP_HIT 325 +#define EFFECT_BELCH 326 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 3e0b043771..c1e0dda3bb 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -516,7 +516,8 @@ #define STRINGID_POKEMONCANNOTUSEMOVE 512 #define STRINGID_COVEREDINPOWDER 513 #define STRINGID_POWDEREXPLODES 514 +#define STRINGID_BELCHCANTSELECT 515 -#define BATTLESTRINGS_COUNT 525 +#define BATTLESTRINGS_COUNT 528 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_message.c b/src/battle_message.c index 4ee5b1a6b3..9c79b2a186 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -642,10 +642,12 @@ static const u8 sText_ThirdTypeAdded[] = _("{B_BUFF1} type was added to\n{B_DEF_ 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_PowderExplodes[] = _("When the flame touched the powder\non the Pokémon, it exploded!"); +static const u8 sText_BelchCantUse[] = _("Belch cannot be used!\p"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_BELCHCANTSELECT - 12] = sText_BelchCantUse, [STRINGID_TRAINER1LOSETEXT - 12] = sText_Trainer1LoseText, [STRINGID_PKMNGAINEDEXP - 12] = sText_PkmnGainedEXP, [STRINGID_PKMNGREWTOLV - 12] = sText_PkmnGrewToLv, diff --git a/src/battle_util.c b/src/battle_util.c index 0f3bf45704..892df2eac7 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -579,7 +579,7 @@ static bool32 IsGravityPreventingMove(u32 move) } } -static bool32 IsHealBlockPreventingMove(u8 battler, u32 move) +static bool32 IsHealBlockPreventingMove(u32 battler, u32 move) { if (!(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) return FALSE; @@ -601,6 +601,14 @@ static bool32 IsHealBlockPreventingMove(u8 battler, u32 move) } } +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) { u32 limitations = 0; @@ -700,6 +708,21 @@ u8 TrySetCantSelectMoveBattleScript(void) } } + if (IsBelchPreventingMove(gActiveBattler, move)) + { + gCurrentMove = move; + if (gBattleTypeFlags & BATTLE_TYPE_PALACE) + { + gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedBelchInPalace; + gProtectStructs[gActiveBattler].palaceAbleToUseMove = 1; + } + else + { + gSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedBelch; + limitations++; + } + } + gPotentialItemEffectBattler = gActiveBattler; if (HOLD_EFFECT_CHOICE(holdEffect) && *choicedMove != 0 && *choicedMove != 0xFFFF && *choicedMove != move) { @@ -778,6 +801,8 @@ u8 CheckMoveLimitations(u8 battlerId, u8 unusableMoves, u8 check) 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]; } return unusableMoves; } @@ -4223,6 +4248,10 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) 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; } diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index fc771a4f38..1ff26a96a9 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -7884,7 +7884,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_BELCH] = { - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_BELCH, .power = 120, .type = TYPE_POISON, .accuracy = 90, From a42bba755b42fa26e0b3345ffbb85a8d822ac4b6 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 1 Feb 2019 14:34:16 +0100 Subject: [PATCH 240/667] Add Crafty Shield effect --- data/battle_scripts_1.s | 2 +- include/constants/battle.h | 3 ++- src/battle_main.c | 4 ++-- src/battle_script_commands.c | 12 ++++++++++++ src/data/battle_moves.h | 3 ++- 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 062c50904d..a0ff489b22 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5230,7 +5230,7 @@ BattleScript_SelectingNotAllowedBelch:: endselectionscript BattleScript_SelectingNotAllowedBelchInPalace:: - printstring STRINGID_PKMNCANTUSEMOVETAUNT + printstring STRINGID_BELCHCANTSELECT goto BattleScript_SelectingUnusableMoveInPalace BattleScript_MoveUsedGravityPrevents:: diff --git a/include/constants/battle.h b/include/constants/battle.h index 8b8bcda5c9..b3f5704966 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -211,7 +211,8 @@ #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 << 18) +#define SIDE_STATUS_WIDE_GUARD (1 << 19) +#define SIDE_STATUS_CRAFTY_SHIELD (1 << 20) // Field affecting statuses. #define STATUS_FIELD_MAGIC_ROOM 0x1 diff --git a/src/battle_main.c b/src/battle_main.c index 8b63981bfa..378e01f288 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4590,8 +4590,8 @@ static void TurnValuesCleanUp(bool8 var0) gBattleMons[gActiveBattler].status2 &= ~(STATUS2_SUBSTITUTE); } - gSideStatuses[0] &= ~(SIDE_STATUS_QUICK_GUARD | SIDE_STATUS_WIDE_GUARD); - gSideStatuses[1] &= ~(SIDE_STATUS_QUICK_GUARD | SIDE_STATUS_WIDE_GUARD); + gSideStatuses[0] &= ~(SIDE_STATUS_QUICK_GUARD | SIDE_STATUS_WIDE_GUARD | SIDE_STATUS_CRAFTY_SHIELD); + gSideStatuses[1] &= ~(SIDE_STATUS_QUICK_GUARD | SIDE_STATUS_WIDE_GUARD | SIDE_STATUS_CRAFTY_SHIELD); gSideTimers[0].followmeTimer = 0; gSideTimers[1].followmeTimer = 0; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b6a3e2e3ca..9a2ee03472 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -904,6 +904,9 @@ bool32 IsBattlerProtected(u8 battlerId, u16 move) else if (gSideStatuses[GetBattlerSide(battlerId)] & SIDE_STATUS_QUICK_GUARD && GetMovePriority(gBattlerAttacker) > 0) return TRUE; + else if (gSideStatuses[GetBattlerSide(battlerId)] & SIDE_STATUS_CRAFTY_SHIELD + && gBattleMoves[move].power == 0) + return TRUE; else return FALSE; } @@ -2719,6 +2722,7 @@ void SetMoveEffect(bool8 primary, u8 certain) 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 || gProtectStructs[gBattlerTarget].spikyShielded || gProtectStructs[gBattlerTarget].kingsShielded || gProtectStructs[gBattlerTarget].banefulBunkered) @@ -2726,6 +2730,7 @@ void SetMoveEffect(bool8 primary, u8 certain) 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); gProtectStructs[gBattlerTarget].spikyShielded = 0; gProtectStructs[gBattlerTarget].kingsShielded = 0; gProtectStructs[gBattlerTarget].banefulBunkered = 0; @@ -7264,6 +7269,13 @@ static void atk77_setprotectlike(void) 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; + } } } diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 1ff26a96a9..a45a31dda7 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -8112,7 +8112,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_CRAFTY_SHIELD] = { - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_PROTECT, .power = 0, .type = TYPE_FAIRY, .accuracy = 0, @@ -8122,6 +8122,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .priority = 3, .flags = 0, .split = SPLIT_STATUS, + .argument = TRUE, // Protects the whole side. }, [MOVE_FLOWER_SHIELD] = From a8edf08ee444ed09704553fd9d0ab2069a5c2463 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 4 Feb 2019 12:43:20 +0100 Subject: [PATCH 241/667] Fix Protean ability pop-up --- src/battle_script_commands.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 41e54dd5a0..b475771df9 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -939,6 +939,7 @@ static void atk00_attackcanceler(void) { PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); SET_BATTLER_TYPE(gBattlerAttacker, moveType); + gBattlerAbility = gBattlerAttacker; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ProteanActivates; return; From ed030e5b62e809542d949de024c47e666a969698 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 4 Feb 2019 12:46:04 +0100 Subject: [PATCH 242/667] Fix Aurora Veil description --- src/data/text/move_descriptions.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/data/text/move_descriptions.h b/src/data/text/move_descriptions.h index d64e1a7072..8a33ee98ba 100644 --- a/src/data/text/move_descriptions.h +++ b/src/data/text/move_descriptions.h @@ -3196,6 +3196,7 @@ const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] = [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, From c436cdf38494b13a631c3a8dca06dd101e06f20f Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 4 Feb 2019 13:40:13 +0100 Subject: [PATCH 243/667] Fix Magnet Rise --- src/battle_script_commands.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b475771df9..2b75590dbc 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10199,6 +10199,8 @@ static void atkDD_setuserstatus3(void) else { gStatuses3[gBattlerAttacker] |= flags; + if (flags == STATUS3_MAGNET_RISE) + gDisableStructs[gBattlerAttacker].magnetRiseTimer = 5; gBattlescriptCurrInstr += 9; } } From b10c2ecf04b050437f8cce1eae5c6c0f65d6bb2d Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Mon, 4 Feb 2019 11:55:26 -0500 Subject: [PATCH 244/667] Use Swagger on allies with Own Tempo --- data/battle_ai_scripts.s | 1 + 1 file changed, 1 insertion(+) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 3d4899aed8..d934b19e69 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -3366,6 +3366,7 @@ AI_TryHelpingHandOnAlly: AI_TrySwaggerOnAlly: if_holds_item AI_TARGET, ITEM_PERSIM_BERRY, AI_TrySwaggerOnAlly2 + if_ability AI_USER_PARTNER, ABILITY_OWN_TEMPO, AI_TrySwaggerOnAlly2 goto Score_Minus30 AI_TrySwaggerOnAlly2: From 62fd90caa00fb9dabd19f541a92ee14b0c8d25ee Mon Sep 17 00:00:00 2001 From: Papa Cancer Date: Tue, 5 Feb 2019 21:47:50 +0000 Subject: [PATCH 245/667] Parting Shot Effect plus animation (looks like Snarl) --- data/battle_anim_scripts.s | 15 +++++++++ data/battle_scripts_1.s | 41 +++++++++++++++++++++++++ include/constants/battle_move_effects.h | 1 + src/data/battle_moves.h | 2 +- 4 files changed, 58 insertions(+), 1 deletion(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index ce79175a47..fb3d0389e0 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -2378,6 +2378,21 @@ Move_DISARMING_VOICE: end Move_PARTING_SHOT: + loadspritegfx ANIM_TAG_NOISE_LINE + fadetobg BG_DARK + waitbgfadein + delay 0 + createvisualtask sub_8158E9C, 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 sub_8159078, 5 + waitforvisualfinish + delay 1 + restorebg + waitbgfadein end Move_TOPSY_TURVY: diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index a0ff489b22..7d28143063 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -342,6 +342,47 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectPowder .4byte BattleScript_EffectSpAtkUpHit .4byte BattleScript_EffectBelch + .4byte BattleScript_EffectPartingShot + +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, ATK48_STAT_NEGATIVE | ATK48_ONLY_MULTIPLE + playstatchangeanimation BS_TARGET, BIT_ATK, ATK48_STAT_NEGATIVE + setstatchanger STAT_ATK, 1, TRUE + statbuffchange 0x1, BattleScript_EffectPartingShotTrySpAtk + printfromtable gStatDownStringIds + waitmessage 0x40 +BattleScript_EffectPartingShotTrySpAtk: + playstatchangeanimation BS_TARGET, BIT_SPATK, ATK48_STAT_NEGATIVE + setstatchanger STAT_SPATK, 1, TRUE + statbuffchange 0x1, BattleScript_MoveEnd + printfromtable gStatDownStringIds + waitmessage 0x40 + jumpifcantswitch ATK4F_DONT_CHECK_STATUSES | BS_ATTACKER, BattleScript_MoveEnd + openpartyscreen BS_ATTACKER, BattleScript_ButItFailed + printstring STRINGID_PKMNWENTBACK + switchoutabilities BS_ATTACKER + waitstate + switchhandleorder BS_ATTACKER, 0x2 + returnatktoball + waitstate + getswitchedmondata BS_ATTACKER + switchindataupdate BS_ATTACKER + hpthresholds BS_ATTACKER + printstring STRINGID_SWITCHINMON + switchinanim BS_ATTACKER, TRUE + waitstate + switchineffects BS_ATTACKER + goto BattleScript_MoveEnd BattleScript_EffectSpAtkUpHit: setmoveeffect MOVE_EFFECT_SP_ATK_PLUS_1 | MOVE_EFFECT_AFFECTS_USER diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 7d1f1399ac..d6171a8e01 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -330,5 +330,6 @@ #define EFFECT_POWDER 324 #define EFFECT_SP_ATTACK_UP_HIT 325 #define EFFECT_BELCH 326 +#define EFFECT_PARTING_SHOT 327 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index a45a31dda7..195cb27acf 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -8069,7 +8069,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_PARTING_SHOT] = { - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_PARTING_SHOT, .power = 0, .type = TYPE_DARK, .accuracy = 100, From 40e1dcb1d954d4fead25d03453e2afb0bc6214a8 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 7 Feb 2019 21:26:42 +0100 Subject: [PATCH 246/667] Fix Psycho Shift copying toxic counter --- src/battle_script_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 2b75590dbc..618123d3f5 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7055,7 +7055,7 @@ static void atk76_various(void) if (i == TRUE) { - gBattleMons[gBattlerTarget].status1 = gBattleMons[gBattlerAttacker].status1; + gBattleMons[gBattlerTarget].status1 = gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY; gActiveBattler = gBattlerTarget; BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); From 6a186b5d5a28737203e3bd76d315ad31763b250a Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 7 Feb 2019 21:33:03 +0100 Subject: [PATCH 247/667] Fix Sap Sipper --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 42c55541c1..d5ef03ffff 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2970,7 +2970,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA effect = 2, statId = STAT_SPATK; break; case ABILITY_SAP_SIPPER: - if (moveArg == TYPE_GRASS) + if (moveType == TYPE_GRASS) effect = 2, statId = STAT_ATK; break; case ABILITY_FLASH_FIRE: From e7f8186ccc3829b5d36480431fc757f8d586686e Mon Sep 17 00:00:00 2001 From: PALPATlNE Date: Fri, 8 Feb 2019 03:13:36 +0100 Subject: [PATCH 248/667] Mud bomb and Shadow Sneak Animations --- data/battle_anim_scripts.s | 73 +++++++++++++++++++++++++++++++++++-- src/ground.c | 74 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+), 2 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index ce79175a47..bae8e94769 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -134,7 +134,7 @@ gBattleAnims_Moves:: .4byte Move_FOCUS_ENERGY .4byte Move_BIDE .4byte Move_METRONOME - .4byte Move_MIRROR_MOVE @ doesn't have an actual animation + .4byte Move_MIRROR_MOVE @ doesnt have an actual animation .4byte Move_SELF_DESTRUCT .4byte Move_EGG_BOMB .4byte Move_LICK @@ -1885,11 +1885,80 @@ Move_FIRE_FANG: end Move_SHADOW_SNEAK: + loadspritegfx ANIM_TAG_LICK + setalpha 0, 16 + delay 1 + createvisualtask sub_81143C0, 2 + delay 1 + createvisualtask sub_8113BAC, 5 + playsewithpan SE_W060, SOUND_PAN_ATTACKER + delay 48 + playsewithpan SE_W060B, SOUND_PAN_ATTACKER + waitforvisualfinish + createvisualtask sub_8114470, 2 + setalpha 0, 16 + delay 1 + playsewithpan SE_W122, SOUND_PAN_TARGET + createsprite gUnknown_08596D8C, 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_W145C, SOUND_PAN_ATTACKER + createsprite gMudBombToss, ANIM_TARGET, 2, 20, 0, 0, 0, 35, -25 + delay 5 + playsewithpan SE_W145C, SOUND_PAN_ATTACKER + createsprite gMudBombToss, ANIM_TARGET, 2, 20, 0, 0, 0, 35, -25 + delay 5 + playsewithpan SE_W145C, SOUND_PAN_ATTACKER + createsprite gMudBombToss, ANIM_TARGET, 2, 20, 0, 0, 0, 35, -25 + delay 5 + playsewithpan SE_W145C, 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_W233B, 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_W088, 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_W088, 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_W088, 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: end diff --git a/src/ground.c b/src/ground.c index ae3cf6c3e0..35224672ca 100644 --- a/src/ground.c +++ b/src/ground.c @@ -12,10 +12,14 @@ void AnimDirtScatter(struct Sprite *); void AnimMudSportDirt(struct Sprite *); void AnimFissureDirtPlumeParticle(struct Sprite *); void AnimDigDirtMound(struct Sprite *); +void MudBombParticles(struct Sprite *); +void MudBombBall(struct Sprite *); static void AnimBonemerangProjectileStep(struct Sprite *); static void AnimBonemerangProjectileEnd(struct Sprite *); static void AnimMudSportDirtRising(struct Sprite *); static void AnimMudSportDirtFalling(struct Sprite *); +static void MudBombParticles_Callback(struct Sprite *); +static void MudBombBall_Callback(struct Sprite *); static void sub_8114CFC(u8); static void sub_8114EB4(u8); static void sub_8114F54(u8); @@ -27,6 +31,7 @@ static void sub_81154A4(u8); static void sub_8115588(struct Task *); static void sub_81156D0(u8); + const union AffineAnimCmd gUnknown_08597150[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, 15, 1), @@ -137,6 +142,28 @@ const struct SpriteTemplate gUnknown_08597214 = .callback = AnimDigDirtMound, }; +const struct SpriteTemplate gMudBombSplash = +{ + .tileTag = ANIM_TAG_MUD_SAND, + .paletteTag = ANIM_TAG_MUD_SAND, + .oam = &gUnknown_08524904, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = MudBombParticles, +}; + +const struct SpriteTemplate gMudBombToss = +{ + .tileTag = ANIM_TAG_MUD_SAND , + .paletteTag = ANIM_TAG_MUD_SAND, + .oam = &gUnknown_0852490C, + .anims = gUnknown_085971C8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = MudBombBall, +}; + // Moves a bone projectile towards the target mon, which moves like // a boomerang. After hitting the target mon, it comes back to the user. void AnimBonemerangProjectile(struct Sprite *sprite) @@ -557,6 +584,53 @@ void AnimDigDirtMound(struct Sprite *sprite) sprite->callback = WaitAnimForDuration; } +//Lifted from sludge bomb +void MudBombParticles(struct Sprite *sprite) +{ + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[0]; + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[1]; + + InitSpriteDataForLinearTranslation(sprite); + + sprite->data[5] = sprite->data[1] / gBattleAnimArgs[2]; + sprite->data[6] = sprite->data[2] / gBattleAnimArgs[2]; + + sprite->callback = MudBombParticles_Callback; +} +//also lifted from sludge bomb +static void MudBombParticles_Callback(struct Sprite *sprite) +{ + TranslateSpriteLinearFixedPoint(sprite); + + sprite->data[1] -= sprite->data[5]; + sprite->data[2] -= sprite->data[6]; + + if (!sprite->data[0]) + DestroyAnimSprite(sprite); +} +//lifted from smokescreen +void MudBombBall(struct Sprite *sprite) +{ + InitSpritePosToAnimAttacker(sprite, 1); + if (GetBattlerSide(gBattleAnimAttacker)) + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; + sprite->data[5] = gBattleAnimArgs[5]; + InitAnimArcTranslation(sprite); + + sprite->callback = MudBombBall_Callback; +} +//Also lifted form smokescreen +static void MudBombBall_Callback(struct Sprite *sprite) +{ + if (TranslateAnimHorizontalArc(sprite)) + DestroyAnimSprite(sprite); +} void sub_81152DC(u8 taskId) { u16 i; From 691544fa0bc6abb8ff57fd81f8ae0162a8c78f55 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 9 Feb 2019 13:21:32 +0100 Subject: [PATCH 249/667] AI takes split into account, debug view ai move points --- asm/macros/battle_ai_script.inc | 30 ++++++++++++++++++++++++ data/battle_ai_scripts.s | 7 ++++++ src/battle_ai_script_commands.c | 41 ++++++++++++++++++++++++++++++++- src/battle_debug.c | 22 +++++++++++++++++- 4 files changed, 98 insertions(+), 2 deletions(-) diff --git a/asm/macros/battle_ai_script.inc b/asm/macros/battle_ai_script.inc index 4d0cd23af9..0cb6681e54 100644 --- a/asm/macros/battle_ai_script.inc +++ b/asm/macros/battle_ai_script.inc @@ -594,7 +594,37 @@ .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 + @ 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 diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index d934b19e69..e9130845b4 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -474,6 +474,9 @@ AI_CBM_BellyDrum: @ 82DC341 AI_CBM_AttackUp: @ 82DC348 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 @@ -486,6 +489,9 @@ AI_CBM_SpeedUp: @ 82DC35A AI_CBM_SpAtkUp: @ 82DC363 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 @@ -3365,6 +3371,7 @@ 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 if_ability AI_USER_PARTNER, ABILITY_OWN_TEMPO, AI_TrySwaggerOnAlly2 goto Score_Minus30 diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index da8a33c0c7..4ec4da170a 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -158,6 +158,8 @@ static void BattleAICmd_get_hazards_count(void); static void BattleAICmd_if_doesnt_hold_berry(void); static void BattleAICmd_if_share_type(void); static void BattleAICmd_if_cant_use_last_resort(void); +static void BattleAICmd_if_has_move_with_split(void); +static void BattleAICmd_if_has_no_move_with_split(void); // ewram EWRAM_DATA const u8 *gAIScriptPtr = NULL; @@ -273,6 +275,8 @@ static const BattleAICmdFunc sBattleAICmdTable[] = BattleAICmd_if_doesnt_hold_berry, // 0x66 BattleAICmd_if_share_type, // 0x67 BattleAICmd_if_cant_use_last_resort, // 0x68 + BattleAICmd_if_has_move_with_split, // 0x69 + BattleAICmd_if_has_no_move_with_split, // 0x6A }; static const u16 sDiscouragedPowerfulMoveEffects[] = @@ -635,7 +639,7 @@ static void RecordLastUsedMoveByTarget(void) } } -static bool8 IsBattlerAIControlled(u8 battlerId) +static bool32 IsBattlerAIControlled(u32 battlerId) { switch (GetBattlerPosition(battlerId)) { @@ -2542,3 +2546,38 @@ static void BattleAICmd_if_cant_use_last_resort(void) else gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); } + +static bool32 HasMoveWithSplit(u32 battler, u32 split) +{ + s32 i; + u16 *moves; + + if (IsBattlerAIControlled(battler) || IsBattlerAIControlled(BATTLE_PARTNER(battler))) + moves = gBattleMons[battler].moves; + else + moves = gBattleResources->battleHistory->usedMoves[battler].moves; + + 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 BattleAICmd_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 BattleAICmd_if_has_no_move_with_split(void) +{ + if (!HasMoveWithSplit(BattleAI_GetWantedBattler(gAIScriptPtr[1]), gAIScriptPtr[2])) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); + else + gAIScriptPtr += 7; +} diff --git a/src/battle_debug.c b/src/battle_debug.c index 35cc13f37c..5d1f6f9b5d 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -35,7 +35,7 @@ struct BattleDebugModifyArrows u8 arrowSpriteId[2]; u16 minValue; u16 maxValue; - u16 currValue; + int currValue; u8 currentDigit; u8 maxDigits; u8 charDigits[MAX_MODIFY_DIGITS]; @@ -86,6 +86,7 @@ enum LIST_ITEM_STATUS3, LIST_ITEM_SIDE_STATUS, LIST_ITEM_AI, + LIST_ITEM_AI_MOVES_PTS, LIST_ITEM_VARIOUS, LIST_ITEM_COUNT }; @@ -110,6 +111,7 @@ enum VAR_SUBSTITUTE, VAR_IN_LOVE, VAR_U16_4_ENTRIES, + VAL_S8, }; enum @@ -206,6 +208,7 @@ 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_EmptyString[] = _(""); @@ -301,6 +304,7 @@ static const struct ListMenuItem sMainListItems[] = {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}, }; @@ -539,6 +543,7 @@ static const u8 sBitsToMaxDigit[] = 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, @@ -897,6 +902,9 @@ static void CreateSecondaryListMenu(struct BattleDebugMenu *data) listTemplate.items = sSideStatusListItems; itemsCount = ARRAY_COUNT(sSideStatusListItems); break; + case LIST_ITEM_AI_MOVES_PTS: + itemsCount = 4; + break; } data->secondaryListItemCount = itemsCount; @@ -955,6 +963,7 @@ static void PrintSecondaryEntries(struct BattleDebugMenu *data) { case LIST_ITEM_MOVES: case LIST_ITEM_PP: + case LIST_ITEM_AI_MOVES_PTS: for (i = 0; i < 4; i++) { PadString(gMoveNames[gBattleMons[data->battlerId].moves[i]], text); @@ -1061,6 +1070,9 @@ static void UpdateBattlerValue(struct BattleDebugMenu *data) 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; @@ -1312,6 +1324,14 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) data->modifyArrows.typeOfVal = VAL_U8; data->modifyArrows.currValue = gBattleMons[data->battlerId].pp[data->currentSecondaryListItemId]; break; + case LIST_ITEM_AI_MOVES_PTS: + data->modifyArrows.minValue = 0; + data->modifyArrows.maxValue = 255; + data->modifyArrows.maxDigits = 3; + data->modifyArrows.modifiedValPtr = &gBattleResources->ai->score; + data->modifyArrows.typeOfVal = VAL_S8; + data->modifyArrows.currValue = gBattleResources->ai->score[data->currentSecondaryListItemId]; + break; case LIST_ITEM_HELD_ITEM: data->modifyArrows.minValue = 0; data->modifyArrows.maxValue = ITEMS_COUNT - 1; From 872389b15ca2f0acec0e2a01c57c28b73b8f19fa Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 9 Feb 2019 13:30:45 +0100 Subject: [PATCH 250/667] Fix Download raising the wrong stat --- src/battle_util.c | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index d5ef03ffff..d7313ff415 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2714,30 +2714,27 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA case ABILITY_DOWNLOAD: if (!gSpecialStatuses[battler].switchInAbilityDone) { - u8 statId; - u32 opposingBattler = BATTLE_OPPOSITE(battler); - u32 opposingDef = gBattleMons[opposingBattler].defense - * gStatStageRatios[gBattleMons[opposingBattler].statStages[STAT_DEF]][0] - / gStatStageRatios[gBattleMons[opposingBattler].statStages[STAT_DEF]][1]; - u32 opposingSpDef = gBattleMons[opposingBattler].spDefense - * gStatStageRatios[gBattleMons[opposingBattler].statStages[STAT_SPDEF]][0] - / gStatStageRatios[gBattleMons[opposingBattler].statStages[STAT_SPDEF]][1]; + u32 statId, opposingBattler; + u32 opposingDef = 0, opposingSpDef = 0; - opposingBattler = BATTLE_PARTNER(opposingBattler); - if (IsBattlerAlive(opposingBattler)) + opposingBattler = BATTLE_OPPOSITE(battler); + for (i = 0; i < 2; opposingBattler ^= BIT_SIDE, i++) { - 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 (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 (opposingSpDef > opposingDef) - statId = STAT_SPATK; - else + if (opposingDef < opposingSpDef) statId = STAT_ATK; + else + statId = STAT_SPATK; gSpecialStatuses[battler].switchInAbilityDone = 1; From 3d616dfffed32d6b371a7afb62e8595e45eba317 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 9 Feb 2019 14:30:16 +0100 Subject: [PATCH 251/667] Add Surge Abilities --- data/battle_anim_scripts.s | 16 +++++++++ data/battle_scripts_1.s | 34 ++++++++++++++++++- include/battle_scripts.h | 4 +++ include/constants/battle_anim.h | 58 +++++++++++++++++--------------- include/constants/hold_effects.h | 3 +- src/battle_script_commands.c | 7 ++-- src/battle_util.c | 51 ++++++++++++++++++++++++++-- 7 files changed, 139 insertions(+), 34 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index ce79175a47..bb8cfec050 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -678,6 +678,10 @@ gBattleAnims_General:: .4byte General_IngrainHeal .4byte General_WishHeal .4byte General_MegaEvolution + .4byte General_TerrainMisty + .4byte General_TerrainGrassy + .4byte General_TerrainElectric + .4byte General_TerrainPsychic .align 2 gBattleAnims_Special:: @@ -12790,6 +12794,18 @@ General_MegaEvolution: blendoff clearmonbg ANIM_ATTACKER end + +General_TerrainMisty: + end + +General_TerrainGrassy: + end + +General_TerrainElectric: + end + +General_TerrainPsychic: + end AnimScript_82D85A3: createvisualtask sub_8172E9C, 2 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index a0ff489b22..64d937e1b7 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1602,7 +1602,7 @@ BattleScript_EffectHitEscape: setbyte sMOVEEND_STATE, 0x0 moveend 0x0, 0x0 jumpifbattleend BattleScript_HitEscapeEnd - jumpifbyte CMP_NOT_EQUAL gBattleOutcome 0 BattleScript_HitEscapeEnd + jumpifbyte CMP_NOT_EQUAL gBattleOutcome 0, BattleScript_HitEscapeEnd jumpifcantswitch ATK4F_DONT_CHECK_STATUSES | BS_ATTACKER, BattleScript_HitEscapeEnd openpartyscreen 0x1, BattleScript_HitEscapeEnd switchoutabilities BS_ATTACKER @@ -5880,6 +5880,38 @@ BattleScript_SnowWarningActivates:: 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 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index b628531c54..1fd78d7f96 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -289,5 +289,9 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index b4f18547e0..c1d6d6804c 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -316,7 +316,7 @@ // . . // . . // 127 -// +// #define SOUND_PAN_ATTACKER -64 #define SOUND_PAN_TARGET 63 @@ -374,6 +374,10 @@ #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 // special animations table #define B_ANIM_LVL_UP 0x0 @@ -415,32 +419,32 @@ #define ANIM_WEATHER_HAIL 4 // Battle mon back animations. -#define BACK_ANIM_NONE 0x00 -#define BACK_ANIM_H_SLIDE_QUICK 0x01 -#define BACK_ANIM_H_SLIDE 0x02 -#define BACK_ANIM_H_SLIDE_WITH_V_COMPRESS_1 0x03 -#define BACK_ANIM_H_SLIDE_WITH_V_COMPRESS_2 0x04 -#define BACK_ANIM_SHRINK_GROW_1 0x05 -#define BACK_ANIM_GROW_1 0x06 -#define BACK_ANIM_CIRCLE_MOVE_COUNTERCLOCKWISE 0x07 -#define BACK_ANIM_HORIZONTAL_SHAKE 0x08 -#define BACK_ANIM_VERTICAL_SHAKE 0x09 -#define BACK_ANIM_V_SHAKE_WITH_H_SLIDE 0x0a -#define BACK_ANIM_VERTICAL_STRETCH 0x0b -#define BACK_ANIM_HORIZONTAL_STRETCH 0x0c -#define BACK_ANIM_GROW_2 0x0d -#define BACK_ANIM_V_SHAKE_WITH_PAUSE 0x0e -#define BACK_ANIM_CIRCLE_MOVE_CLOCKWISE 0x0f -#define BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_SMALL 0x10 -#define BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE 0x11 -#define BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE 0x12 -#define BACK_ANIM_DIP_RIGHT_SIDE 0x13 -#define BACK_ANIM_SHRINK_GROW_2 0x14 -#define BACK_ANIM_JOLT_RIGHT 0x15 -#define BACK_ANIM_FLASH_YELLOW_WITH_SHAKE 0x16 -#define BACK_ANIM_FADE_RED_WITH_SHAKE 0x17 -#define BACK_ANIM_FADE_GREEN_WITH_SHAKE 0x18 -#define BACK_ANIM_FADE_BLUE_WITH_SHAKE 0x19 +#define BACK_ANIM_NONE 0x00 +#define BACK_ANIM_H_SLIDE_QUICK 0x01 +#define BACK_ANIM_H_SLIDE 0x02 +#define BACK_ANIM_H_SLIDE_WITH_V_COMPRESS_1 0x03 +#define BACK_ANIM_H_SLIDE_WITH_V_COMPRESS_2 0x04 +#define BACK_ANIM_SHRINK_GROW_1 0x05 +#define BACK_ANIM_GROW_1 0x06 +#define BACK_ANIM_CIRCLE_MOVE_COUNTERCLOCKWISE 0x07 +#define BACK_ANIM_HORIZONTAL_SHAKE 0x08 +#define BACK_ANIM_VERTICAL_SHAKE 0x09 +#define BACK_ANIM_V_SHAKE_WITH_H_SLIDE 0x0a +#define BACK_ANIM_VERTICAL_STRETCH 0x0b +#define BACK_ANIM_HORIZONTAL_STRETCH 0x0c +#define BACK_ANIM_GROW_2 0x0d +#define BACK_ANIM_V_SHAKE_WITH_PAUSE 0x0e +#define BACK_ANIM_CIRCLE_MOVE_CLOCKWISE 0x0f +#define BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_SMALL 0x10 +#define BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE 0x11 +#define BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE 0x12 +#define BACK_ANIM_DIP_RIGHT_SIDE 0x13 +#define BACK_ANIM_SHRINK_GROW_2 0x14 +#define BACK_ANIM_JOLT_RIGHT 0x15 +#define BACK_ANIM_FLASH_YELLOW_WITH_SHAKE 0x16 +#define BACK_ANIM_FADE_RED_WITH_SHAKE 0x17 +#define BACK_ANIM_FADE_GREEN_WITH_SHAKE 0x18 +#define BACK_ANIM_FADE_BLUE_WITH_SHAKE 0x19 #endif // GUARD_CONSTANTS_BATTLE_ANIM_H diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index e13280f454..ca4f08530f 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -113,7 +113,8 @@ #define HOLD_EFFECT_MEGA_STONE 130 // Gen7 hold effects -#define HOLD_EFFECT_PROTECTIVE_PADS 149 +#define HOLD_EFFECT_PROTECTIVE_PADS 149 +#define HOLD_EFFECT_TERRAIN_EXTENDER 150 #define HOLD_EFFECT_CHOICE(holdEffect)((holdEffect == HOLD_EFFECT_CHOICE_BAND || holdEffect == HOLD_EFFECT_CHOICE_SCARF || holdEffect == HOLD_EFFECT_CHOICE_SPECS)) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 618123d3f5..479ad5a2e7 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6245,9 +6245,12 @@ static void HandleTerrainMove(u32 moveEffect) } else { - gFieldStatuses &= ~(STATUS_FIELD_MISTY_TERRAIN | STATUS_FIELD_GRASSY_TERRAIN | EFFECT_ELECTRIC_TERRAIN | EFFECT_PSYCHIC_TERRAIN); + gFieldStatuses &= ~(STATUS_FIELD_MISTY_TERRAIN | STATUS_FIELD_GRASSY_TERRAIN | STATUS_FIELD_ELECTRIC_TERRAIN | STATUS_FIELD_PSYCHIC_TERRAIN); gFieldStatuses |= statusFlag; - *timer = 5; + if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_TERRAIN_EXTENDER) + *timer = 8; + else + *timer = 5; gBattlescriptCurrInstr += 7; } } diff --git a/src/battle_util.c b/src/battle_util.c index d7313ff415..0b7987b770 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2568,10 +2568,27 @@ bool32 TryChangeBattleWeather(u8 battler, u32 weatherEnumId, bool32 viaAbility) return TRUE; } - else + + return FALSE; +} + +static bool32 TryChangeBattleTerrain(u32 battler, u32 statusFlag, u8 *timer) +{ + if (!(gFieldStatuses & statusFlag)) { - return FALSE; + 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; } u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveArg) @@ -2780,6 +2797,34 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA 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)) { @@ -3454,7 +3499,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA { BattleScriptPushCursorAndCallback(BattleScript_TraceActivates); gStatuses3[i] &= ~(STATUS3_TRACE); - gBattleScripting.battler = i; + gBattlerAbility = gBattleScripting.battler = i; PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBattler, gBattlerPartyIndexes[gActiveBattler]) PREPARE_ABILITY_BUFFER(gBattleTextBuff2, gLastUsedAbility) From 10536196f9879dc2f40165fbb9b3d3be1fc06ccc Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 9 Feb 2019 16:45:02 +0100 Subject: [PATCH 252/667] AI edge case with atk up --- asm/macros/battle_ai_script.inc | 7 ++++++ data/battle_ai_scripts.s | 1 + src/battle_ai_script_commands.c | 41 +++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/asm/macros/battle_ai_script.inc b/asm/macros/battle_ai_script.inc index 0cb6681e54..1abc94b19b 100644 --- a/asm/macros/battle_ai_script.inc +++ b/asm/macros/battle_ai_script.inc @@ -608,6 +608,13 @@ .4byte \ptr .endm + .macro if_physical_moves_unusable attacker:req, target:req, ptr:req + .byte 0x6B + .byte \attacker + .byte \target + .4byte \ptr + .endm + @ useful script macros .macro if_has_physical_move battler:req, ptr:req if_has_move_with_split \battler, SPLIT_PHYSICAL, \ptr diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index e9130845b4..b103cd78f4 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -1140,6 +1140,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 diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 4ec4da170a..d73857ee82 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -160,6 +160,7 @@ static void BattleAICmd_if_share_type(void); static void BattleAICmd_if_cant_use_last_resort(void); static void BattleAICmd_if_has_move_with_split(void); static void BattleAICmd_if_has_no_move_with_split(void); +static void BattleAICmd_if_physical_moves_unusable(void); // ewram EWRAM_DATA const u8 *gAIScriptPtr = NULL; @@ -277,6 +278,7 @@ static const BattleAICmdFunc sBattleAICmdTable[] = BattleAICmd_if_cant_use_last_resort, // 0x68 BattleAICmd_if_has_move_with_split, // 0x69 BattleAICmd_if_has_no_move_with_split, // 0x6A + BattleAICmd_if_physical_moves_unusable, // 0x6B }; static const u16 sDiscouragedPowerfulMoveEffects[] = @@ -2581,3 +2583,42 @@ static void BattleAICmd_if_has_no_move_with_split(void) 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; + u16 *moves; + u32 usable = 0; + u32 unusable = CheckMoveLimitations(attacker, 0, 0xFF); + + if (IsBattlerAIControlled(attacker)) + moves = gBattleMons[attacker].moves; + else + moves = gBattleResources->battleHistory->usedMoves[attacker].moves; + + 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 BattleAICmd_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; +} From a1be618c47831afe71a9a02478b65d5da354b8b5 Mon Sep 17 00:00:00 2001 From: Papa Cancer Date: Sat, 9 Feb 2019 16:05:59 +0000 Subject: [PATCH 253/667] Parting Shot v2 With DizzyEgg's amendment --- data/battle_scripts_1.s | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 7d28143063..4dd61cb718 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -367,14 +367,14 @@ BattleScript_EffectPartingShotTrySpAtk: statbuffchange 0x1, BattleScript_MoveEnd printfromtable gStatDownStringIds waitmessage 0x40 - jumpifcantswitch ATK4F_DONT_CHECK_STATUSES | BS_ATTACKER, BattleScript_MoveEnd - openpartyscreen BS_ATTACKER, BattleScript_ButItFailed - printstring STRINGID_PKMNWENTBACK + setbyte sMOVEEND_STATE, 0x0 + moveend 0x0, 0x0 + jumpifcantswitch ATK4F_DONT_CHECK_STATUSES | BS_ATTACKER, BattleScript_PartingShotEnd + openpartyscreen 0x1, BattleScript_PartingShotEnd switchoutabilities BS_ATTACKER waitstate switchhandleorder BS_ATTACKER, 0x2 - returnatktoball - waitstate + returntoball BS_ATTACKER getswitchedmondata BS_ATTACKER switchindataupdate BS_ATTACKER hpthresholds BS_ATTACKER @@ -382,7 +382,8 @@ BattleScript_EffectPartingShotTrySpAtk: switchinanim BS_ATTACKER, TRUE waitstate switchineffects BS_ATTACKER - goto BattleScript_MoveEnd +BattleScript_PartingShotEnd: + end BattleScript_EffectSpAtkUpHit: setmoveeffect MOVE_EFFECT_SP_ATK_PLUS_1 | MOVE_EFFECT_AFFECTS_USER From dd342726209f3d76e442ee30a98c07b7358c648c Mon Sep 17 00:00:00 2001 From: Papa Cancer Date: Sat, 9 Feb 2019 17:40:04 +0000 Subject: [PATCH 254/667] Parting Shot v3 --- data/battle_scripts_1.s | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 4dd61cb718..f7a60b76fc 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -364,9 +364,10 @@ BattleScript_EffectPartingShotTryAtk: BattleScript_EffectPartingShotTrySpAtk: playstatchangeanimation BS_TARGET, BIT_SPATK, ATK48_STAT_NEGATIVE setstatchanger STAT_SPATK, 1, TRUE - statbuffchange 0x1, BattleScript_MoveEnd + statbuffchange 0x1, BattleScript_EffectPartingShotSwitch printfromtable gStatDownStringIds waitmessage 0x40 +BattleScript_EffectPartingShotSwitch: setbyte sMOVEEND_STATE, 0x0 moveend 0x0, 0x0 jumpifcantswitch ATK4F_DONT_CHECK_STATUSES | BS_ATTACKER, BattleScript_PartingShotEnd From 136f767f1f3b004a7b88ccd11167942da67d9bdd Mon Sep 17 00:00:00 2001 From: PALPATlNE Date: Sun, 10 Feb 2019 19:30:00 +0100 Subject: [PATCH 255/667] Replaced tab spaces with 4 spaces --- data/battle_anim_scripts.s | 144 ++++++++++++++++++------------------- 1 file changed, 72 insertions(+), 72 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index bae8e94769..d7b25b4dfa 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1885,79 +1885,79 @@ Move_FIRE_FANG: end Move_SHADOW_SNEAK: - loadspritegfx ANIM_TAG_LICK - setalpha 0, 16 - delay 1 - createvisualtask sub_81143C0, 2 - delay 1 - createvisualtask sub_8113BAC, 5 - playsewithpan SE_W060, SOUND_PAN_ATTACKER - delay 48 - playsewithpan SE_W060B, SOUND_PAN_ATTACKER - waitforvisualfinish - createvisualtask sub_8114470, 2 - setalpha 0, 16 - delay 1 - playsewithpan SE_W122, SOUND_PAN_TARGET - createsprite gUnknown_08596D8C, 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 - + loadspritegfx ANIM_TAG_LICK + setalpha 0, 16 + delay 1 + createvisualtask sub_81143C0, 2 + delay 1 + createvisualtask sub_8113BAC, 5 + playsewithpan SE_W060, SOUND_PAN_ATTACKER + delay 48 + playsewithpan SE_W060B, SOUND_PAN_ATTACKER + waitforvisualfinish + createvisualtask sub_8114470, 2 + setalpha 0, 16 + delay 1 + playsewithpan SE_W122, SOUND_PAN_TARGET + createsprite gUnknown_08596D8C, 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_W145C, SOUND_PAN_ATTACKER - createsprite gMudBombToss, ANIM_TARGET, 2, 20, 0, 0, 0, 35, -25 - delay 5 - playsewithpan SE_W145C, SOUND_PAN_ATTACKER - createsprite gMudBombToss, ANIM_TARGET, 2, 20, 0, 0, 0, 35, -25 - delay 5 - playsewithpan SE_W145C, SOUND_PAN_ATTACKER - createsprite gMudBombToss, ANIM_TARGET, 2, 20, 0, 0, 0, 35, -25 - delay 5 - playsewithpan SE_W145C, 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_W233B, 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_W088, 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_W088, 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_W088, 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 + loadspritegfx ANIM_TAG_MUD_SAND + playsewithpan SE_W145C, SOUND_PAN_ATTACKER + createsprite gMudBombToss, ANIM_TARGET, 2, 20, 0, 0, 0, 35, -25 + delay 5 + playsewithpan SE_W145C, SOUND_PAN_ATTACKER + createsprite gMudBombToss, ANIM_TARGET, 2, 20, 0, 0, 0, 35, -25 + delay 5 + playsewithpan SE_W145C, SOUND_PAN_ATTACKER + createsprite gMudBombToss, ANIM_TARGET, 2, 20, 0, 0, 0, 35, -25 + delay 5 + playsewithpan SE_W145C, 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_W233B, 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_W088, 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_W088, 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_W088, 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: end From 6c717078c65f0f131bdecbae8b916503ab7cb641 Mon Sep 17 00:00:00 2001 From: PALPATlNE Date: Mon, 11 Feb 2019 03:54:54 +0100 Subject: [PATCH 256/667] Fixed tab to 4 spaces in ground.c --- src/ground.c | 78 ++++++++++++++++++++++++++-------------------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/src/ground.c b/src/ground.c index 35224672ca..79d44eaa08 100644 --- a/src/ground.c +++ b/src/ground.c @@ -144,24 +144,24 @@ const struct SpriteTemplate gUnknown_08597214 = const struct SpriteTemplate gMudBombSplash = { - .tileTag = ANIM_TAG_MUD_SAND, - .paletteTag = ANIM_TAG_MUD_SAND, - .oam = &gUnknown_08524904, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = MudBombParticles, + .tileTag = ANIM_TAG_MUD_SAND, + .paletteTag = ANIM_TAG_MUD_SAND, + .oam = &gUnknown_08524904, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = MudBombParticles, }; const struct SpriteTemplate gMudBombToss = { - .tileTag = ANIM_TAG_MUD_SAND , - .paletteTag = ANIM_TAG_MUD_SAND, - .oam = &gUnknown_0852490C, - .anims = gUnknown_085971C8, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = MudBombBall, + .tileTag = ANIM_TAG_MUD_SAND , + .paletteTag = ANIM_TAG_MUD_SAND, + .oam = &gUnknown_0852490C, + .anims = gUnknown_085971C8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = MudBombBall, }; // Moves a bone projectile towards the target mon, which moves like @@ -587,49 +587,49 @@ void AnimDigDirtMound(struct Sprite *sprite) //Lifted from sludge bomb void MudBombParticles(struct Sprite *sprite) { - sprite->data[0] = gBattleAnimArgs[2]; - sprite->data[1] = sprite->pos1.x; - sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[0]; - sprite->data[3] = sprite->pos1.y; - sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[1]; + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[0]; + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[1]; - InitSpriteDataForLinearTranslation(sprite); + InitSpriteDataForLinearTranslation(sprite); - sprite->data[5] = sprite->data[1] / gBattleAnimArgs[2]; - sprite->data[6] = sprite->data[2] / gBattleAnimArgs[2]; + sprite->data[5] = sprite->data[1] / gBattleAnimArgs[2]; + sprite->data[6] = sprite->data[2] / gBattleAnimArgs[2]; - sprite->callback = MudBombParticles_Callback; + sprite->callback = MudBombParticles_Callback; } //also lifted from sludge bomb static void MudBombParticles_Callback(struct Sprite *sprite) { - TranslateSpriteLinearFixedPoint(sprite); + TranslateSpriteLinearFixedPoint(sprite); - sprite->data[1] -= sprite->data[5]; - sprite->data[2] -= sprite->data[6]; + sprite->data[1] -= sprite->data[5]; + sprite->data[2] -= sprite->data[6]; - if (!sprite->data[0]) - DestroyAnimSprite(sprite); + if (!sprite->data[0]) + DestroyAnimSprite(sprite); } //lifted from smokescreen void MudBombBall(struct Sprite *sprite) { - InitSpritePosToAnimAttacker(sprite, 1); - if (GetBattlerSide(gBattleAnimAttacker)) - gBattleAnimArgs[2] = -gBattleAnimArgs[2]; - sprite->data[0] = gBattleAnimArgs[4]; - sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; - sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; - sprite->data[5] = gBattleAnimArgs[5]; - InitAnimArcTranslation(sprite); + InitSpritePosToAnimAttacker(sprite, 1); + if (GetBattlerSide(gBattleAnimAttacker)) + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; + sprite->data[5] = gBattleAnimArgs[5]; + InitAnimArcTranslation(sprite); - sprite->callback = MudBombBall_Callback; + sprite->callback = MudBombBall_Callback; } //Also lifted form smokescreen static void MudBombBall_Callback(struct Sprite *sprite) { - if (TranslateAnimHorizontalArc(sprite)) - DestroyAnimSprite(sprite); + if (TranslateAnimHorizontalArc(sprite)) + DestroyAnimSprite(sprite); } void sub_81152DC(u8 taskId) { From dc39f76a95df8ae759cf6d0ab5d49fe9bb6caa34 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 14 Feb 2019 12:15:53 +0100 Subject: [PATCH 257/667] Spectral Thief effect --- asm/macros/battle_script.inc | 4 ++ data/battle_scripts_1.s | 14 +++++ include/battle.h | 1 + include/battle_message.h | 1 + include/battle_scripts.h | 2 + include/constants/battle.h | 2 +- include/constants/battle_move_effects.h | 1 + include/constants/battle_script_commands.h | 49 ++++++++--------- include/constants/battle_string_ids.h | 1 + src/battle_message.c | 2 + src/battle_script_commands.c | 63 ++++++++++++++++++++-- src/data/battle_moves.h | 6 +-- 12 files changed, 115 insertions(+), 31 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index ba5a371d9a..b37c842f28 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1584,6 +1584,10 @@ .macro setpowder battler:req various \battler, VARIOUS_SET_POWDER .endm + + .macro spectralthiefprintstats + various BS_ATTACKER, VARIOUS_SPECTRAL_THIEF + .endm @ helpful macros .macro setstatchanger stat:req, stages:req, down:req diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 0087f0d279..08ab61d712 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -343,6 +343,19 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectSpAtkUpHit .4byte BattleScript_EffectBelch .4byte BattleScript_EffectPartingShot + .4byte BattleScript_EffectSpectralThief + +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 @@ -2002,6 +2015,7 @@ BattleScript_StatUpEnd:: BattleScript_StatUp:: playanimation BS_EFFECT_BATTLER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 +BattleScript_StatUpMsg:: printfromtable gStatUpStringIds waitmessage 0x40 return diff --git a/include/battle.h b/include/battle.h index 731c5775dc..d8232f9d7c 100644 --- a/include/battle.h +++ b/include/battle.h @@ -573,6 +573,7 @@ struct BattleStruct 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 }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/include/battle_message.h b/include/battle_message.h index cb39fa7fec..b2ca235e2a 100644 --- a/include/battle_message.h +++ b/include/battle_message.h @@ -308,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_scripts.h b/include/battle_scripts.h index 1fd78d7f96..94574f965e 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -293,5 +293,7 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle.h b/include/constants/battle.h index b3f5704966..a41da06e99 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -325,7 +325,7 @@ #define MOVE_EFFECT_SMACK_DOWN 0x3C #define MOVE_EFFECT_FLAME_BURST 0x3D #define MOVE_EFFECT_FEINT 0x3E -#define MOVE_EFFECT_NOTHING_3F 0x3F +#define MOVE_EFFECT_SPECTRAL_THIEF 0x3F #define MOVE_EFFECT_AFFECTS_USER 0x40 #define MOVE_EFFECT_CERTAIN 0x80 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index d6171a8e01..85cac188e3 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -331,5 +331,6 @@ #define EFFECT_SP_ATTACK_UP_HIT 325 #define EFFECT_BELCH 326 #define EFFECT_PARTING_SHOT 327 +#define EFFECT_SPECTRAL_THIEF 328 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index da1c073e4b..b0544a0343 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -50,7 +50,7 @@ #define BS_OPPONENT1 12 #define BS_PLAYER2 13 #define BS_OPPONENT2 14 -#define BS_ABILITY_BATTLER 15 +#define BS_ABILITY_BATTLER 15 // atk 01, accuracy calc #define NO_ACC_CALC_CHECK_LOCK_ON 0xFFFF @@ -110,30 +110,31 @@ #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_AUTONOMIZE 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_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_AUTONOMIZE 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_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 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index c1e0dda3bb..8c863c2a72 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -517,6 +517,7 @@ #define STRINGID_COVEREDINPOWDER 513 #define STRINGID_POWDEREXPLODES 514 #define STRINGID_BELCHCANTSELECT 515 +#define STRINGID_SPECTRALTHIEFSTEAL 516 #define BATTLESTRINGS_COUNT 528 diff --git a/src/battle_message.c b/src/battle_message.c index 1faa6543b2..82060876fa 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -642,9 +642,11 @@ static const u8 sText_PokemonCannotUseMove[] = _("{B_ATK_NAME_WITH_PREFIX} canno 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!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_SPECTRALTHIEFSTEAL - 12] = sText_SpectralThiefSteal, [STRINGID_BELCHCANTSELECT - 12] = sText_BelchCantUse, [STRINGID_TRAINER1LOSETEXT - 12] = sText_Trainer1LoseText, [STRINGID_PKMNGAINEDEXP - 12] = sText_PkmnGainedEXP, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ff6fd67c92..2400a4ab9b 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1987,7 +1987,7 @@ u8 GetBattlerTurnOrderNum(u8 battlerId) void SetMoveEffect(bool8 primary, u8 certain) { - s32 i; + s32 i, byTwo; bool32 statusChanged = FALSE; u8 affectsUser = 0; // 0x40 otherwise bool32 noSunCanFreeze = TRUE; @@ -2742,6 +2742,46 @@ void SetMoveEffect(bool8 primary, u8 certain) } } 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; } } } @@ -6332,6 +6372,23 @@ static void atk76_various(void) switch (gBattlescriptCurrInstr[2]) { + 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(gBattleScripting.statChanger & 0xF0, 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; @@ -7810,7 +7867,7 @@ static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr) gBattleTextBuff2[3] = STRINGID_STATHARSHLY >> 8; index = 4; } - else if (statValue == -3) + else if (statValue <= -3) { gBattleTextBuff2[1] = B_BUFF_STRING; gBattleTextBuff2[2] = STRINGID_SEVERELY & 0xFF; @@ -7844,7 +7901,7 @@ static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr) gBattleTextBuff2[3] = STRINGID_STATSHARPLY >> 8; index = 4; } - else if (statValue == 3) + else if (statValue >= 3) { gBattleTextBuff2[1] = B_BUFF_STRING; gBattleTextBuff2[2] = STRINGID_DRASTICALLY & 0xFF; diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 195cb27acf..ed39e27f52 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -2266,7 +2266,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, - .split = SPLIT_PHYSICAL, + .split = SPLIT_SPECIAL, }, [MOVE_SUPER_FANG] = @@ -9347,12 +9347,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_SPECTRAL_THIEF] = { - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_SPECTRAL_THIEF, .power = 90, .type = TYPE_GHOST, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED, From 94cd547e9a29689df6dd03695734d1d3aa02f9df Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 14 Feb 2019 13:17:27 +0100 Subject: [PATCH 258/667] Change move effect to u16 --- asm/macros/battle_script.inc | 18 +-- data/battle_scripts_1.s | 10 +- include/battle.h | 7 +- include/battle_script_commands.h | 2 +- include/constants/battle.h | 4 +- include/constants/battle_script_commands.h | 5 +- src/battle_script_commands.c | 151 ++++++++++----------- src/battle_util.c | 24 ++-- 8 files changed, 111 insertions(+), 110 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index b37c842f28..2bcefc1c1d 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -708,7 +708,7 @@ .macro statbuffchange param0:req, param1:req .byte 0x89 - .byte \param0 + .2byte \param0 .4byte \param1 .endm @@ -1595,8 +1595,8 @@ .endm .macro setmoveeffect effect:req - setbyte cEFFECT_CHOOSER \effect - setbyte sSAVED_MOVE_EFFECT \effect + sethword sMOVE_EFFECT \effect + sethword sSAVED_MOVE_EFFECT \effect .endm .macro chosenstatus1animation battler:req, status:req @@ -1608,15 +1608,15 @@ .endm .macro sethword dst:req, value:req - setbyte \dst, \value & 0xFF - setbyte \dst + 1, (\value >> 8) & 0xFF + setbyte \dst, (\value) & 0xFF + setbyte \dst + 1, ((\value) >> 8) & 0xFF .endm .macro setword dst:req, value:req - setbyte \dst, \value & 0xFF - setbyte \dst + 1, (\value >> 8) & 0xFF - setbyte \dst + 2, (\value >> 16) & 0xFF - setbyte \dst + 3, (\value >> 24) & 0xFF + setbyte \dst, (\value) & 0xFF + setbyte \dst + 1, ((\value) >> 8) & 0xFF + setbyte \dst + 2, ((\value) >> 16) & 0xFF + setbyte \dst + 3, ((\value) >> 24) & 0xFF .endm .macro copybyte dst:req, src:req diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 08ab61d712..081b92c523 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2125,7 +2125,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 @@ -2133,7 +2133,7 @@ BattleScript_MultiHitLoop:: jumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_MultiHitPrintStrings BattleScript_DoMultiHit:: movevaluescleanup - copybyte cEFFECT_CHOOSER, sMULTIHIT_EFFECT + copyhword sMOVE_EFFECT, sMULTIHIT_EFFECT critcalc damagecalc jumpifmovehadnoeffect BattleScript_MultiHitNoMoreHits @@ -2386,7 +2386,7 @@ BattleScript_EffectDoubleHit:: ppreduce setmultihitcounter 0x2 initmultihitstring - setbyte sMULTIHIT_EFFECT, 0x0 + sethword sMULTIHIT_EFFECT, 0x0 goto BattleScript_MultiHitLoop BattleScript_EffectRecoilIfMiss:: @@ -2665,7 +2665,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 @@ -3420,7 +3420,7 @@ BattleScript_EffectEarthquake: selectfirstvalidtarget BattleScript_HitsAllWithUndergroundBonusLoop:: movevaluescleanup - copybyte cEFFECT_CHOOSER, sSAVED_MOVE_EFFECT + copyhword sMOVE_EFFECT, sSAVED_MOVE_EFFECT jumpifnostatus3 BS_TARGET, STATUS3_UNDERGROUND, BattleScript_HitsAllNoUndergroundBonus orword gHitMarker, HITMARKER_IGNORE_UNDERGROUND goto BattleScript_DoHitAllWithUndergroundBonus diff --git a/include/battle.h b/include/battle.h index d8232f9d7c..63b5073543 100644 --- a/include/battle.h +++ b/include/battle.h @@ -47,7 +47,6 @@ #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 @@ -619,7 +618,7 @@ struct BattleScripting u16 tripleKickPower; u8 atk49_state; u8 battlerWithAbility; - u8 multihitMoveEffect; + u8 unused_16; u8 battler; u8 animTurn; u8 animTargetsHit; @@ -638,7 +637,9 @@ struct BattleScripting u8 specialTrainerBattleType; bool8 monCaught; s32 savedDmg; - u8 savedMoveEffect; // For moves hitting multiple targets. + u16 savedMoveEffect; // For moves hitting multiple targets. + u16 moveEffect; + u16 multihitMoveEffect; }; // rom_80A5C6C diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index 4c3841d1f0..9ceb67ff42 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -6,7 +6,7 @@ s32 CalcCritChanceStage(u8 battlerAtk, u8 battlerDef, u32 move, bool32 recordAbility); u8 GetBattlerTurnOrderNum(u8 battlerId); -void SetMoveEffect(bool8 primary, u8 certain); +void SetMoveEffect(bool32 primary, u32 certain); void BattleDestroyYesNoCursorAt(u8 cursorPosition); void BattleCreateYesNoCursorAt(u8 cursorPosition); void BufferMoveToLearnIntoBattleTextBuff2(void); diff --git a/include/constants/battle.h b/include/constants/battle.h index a41da06e99..a70dce43ab 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -326,8 +326,8 @@ #define MOVE_EFFECT_FLAME_BURST 0x3D #define MOVE_EFFECT_FEINT 0x3E #define MOVE_EFFECT_SPECTRAL_THIEF 0x3F -#define MOVE_EFFECT_AFFECTS_USER 0x40 -#define MOVE_EFFECT_CERTAIN 0x80 +#define MOVE_EFFECT_AFFECTS_USER 0x4000 +#define MOVE_EFFECT_CERTAIN 0x8000 // Battle terrain defines for gBattleTerrain. #define BATTLE_TERRAIN_GRASS 0 diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index b0544a0343..11f57f6fe6 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -12,7 +12,7 @@ #define sTRIPLE_KICK_POWER gBattleScripting + 0x12 #define sMOVEEND_STATE gBattleScripting + 0x14 #define sBATTLER_WITH_ABILITY gBattleScripting + 0x15 -#define sMULTIHIT_EFFECT gBattleScripting + 0x16 +#define sUNUSED_16 gBattleScripting + 0x16 #define sBATTLER gBattleScripting + 0x17 #define sB_ANIM_TURN gBattleScripting + 0x18 #define sB_ANIM_TARGETS_HIT gBattleScripting + 0x19 @@ -32,8 +32,9 @@ #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 cEFFECT_CHOOSER gBattleCommunication + 3 #define cMULTISTRING_CHOOSER gBattleCommunication + 5 // Battle Script defines for getting the wanted battler diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 2400a4ab9b..ede2bad9b7 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -64,7 +64,7 @@ extern u8 sub_813B21C(void); 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 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); @@ -1975,27 +1975,26 @@ u8 GetBattlerTurnOrderNum(u8 battlerId) #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; + 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) + 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 } @@ -2006,24 +2005,24 @@ void SetMoveEffect(bool8 primary, u8 certain) } if (gBattleMons[gEffectBattler].ability == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) - && !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 9) + && !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 (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 (DoesSubstituteBlockMove(gBattlerAttacker, gEffectBattler, gCurrentMove) && affectsUser != MOVE_EFFECT_AFFECTS_USER) INCREMENT_RESET_RETURN - if (gBattleCommunication[MOVE_EFFECT_BYTE] <= 6) // status change + if (gBattleScripting.moveEffect <= 6) // status change { - switch (sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]) + switch (sStatusFlagsForMoveEffects[gBattleScripting.moveEffect]) { case STATUS1_SLEEP: // check active uproar @@ -2242,12 +2241,12 @@ void SetMoveEffect(bool8 primary, u8 certain) { BattleScriptPush(gBattlescriptCurrInstr + 1); - if (sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]] == STATUS1_SLEEP) + if (sStatusFlagsForMoveEffects[gBattleScripting.moveEffect] == STATUS1_SLEEP) gBattleMons[gEffectBattler].status1 |= ((Random() & 3) + 2); 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); @@ -2265,20 +2264,20 @@ 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]; + *synchronizeEffect = gBattleScripting.moveEffect; gHitMarker |= HITMARKER_SYNCHRONISE_EFFECT; } return; } else if (statusChanged == FALSE) { - gBattleCommunication[MOVE_EFFECT_BYTE] = 0; + gBattleScripting.moveEffect = 0; gBattlescriptCurrInstr++; return; } @@ -2286,14 +2285,14 @@ 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 @@ -2306,7 +2305,7 @@ void SetMoveEffect(bool8 primary, u8 certain) gBattleMons[gEffectBattler].status2 |= (((Random()) % 0x4)) + 2; BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect]; } break; case MOVE_EFFECT_FLINCH: @@ -2326,7 +2325,7 @@ 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; @@ -2339,7 +2338,7 @@ void SetMoveEffect(bool8 primary, u8 certain) gBattleMons[gEffectBattler].status2 |= ((Random() & 3) + 2) << 4; BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect]; } else { @@ -2355,7 +2354,7 @@ 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_TRI_ATTACK: if (gBattleMons[gEffectBattler].status1) @@ -2364,7 +2363,7 @@ void SetMoveEffect(bool8 primary, u8 certain) } else { - gBattleCommunication[MOVE_EFFECT_BYTE] = Random() % 3 + 3; + gBattleScripting.moveEffect = Random() % 3 + 3; SetMoveEffect(FALSE, 0); } break; @@ -2391,7 +2390,7 @@ void SetMoveEffect(bool8 primary, u8 certain) 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]++) { @@ -2408,7 +2407,7 @@ void SetMoveEffect(bool8 primary, u8 certain) gBattleMoveDamage = 1; BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect]; break; case MOVE_EFFECT_ATK_PLUS_1: case MOVE_EFFECT_DEF_PLUS_1: @@ -2418,14 +2417,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; @@ -2439,14 +2438,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; @@ -2460,14 +2459,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; @@ -2481,14 +2480,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; @@ -2618,7 +2617,7 @@ void SetMoveEffect(bool8 primary, u8 certain) 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 gBattleMoveDamage = gHpDealt / 2; @@ -2786,7 +2785,7 @@ void SetMoveEffect(bool8 primary, u8 certain) } } - gBattleCommunication[MOVE_EFFECT_BYTE] = 0; + gBattleScripting.moveEffect = 0; } static void atk15_seteffectwithchance(void) @@ -2798,14 +2797,14 @@ static void atk15_seteffectwithchance(void) 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(0, MOVE_EFFECT_CERTAIN); } else if (Random() % 100 < percentChance - && gBattleCommunication[MOVE_EFFECT_BYTE] + && gBattleScripting.moveEffect && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { if (percentChance >= 100) @@ -2818,7 +2817,7 @@ static void atk15_seteffectwithchance(void) gBattlescriptCurrInstr++; } - gBattleCommunication[MOVE_EFFECT_BYTE] = 0; + gBattleScripting.moveEffect = 0; gBattleScripting.multihitMoveEffect = 0; } @@ -2836,12 +2835,12 @@ static void atk18_clearstatusfromeffect(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - if (gBattleCommunication[MOVE_EFFECT_BYTE] <= MOVE_EFFECT_TOXIC) - gBattleMons[gActiveBattler].status1 &= (~sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]); + if (gBattleScripting.moveEffect <= MOVE_EFFECT_TOXIC) + 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; } @@ -3520,7 +3519,7 @@ static void MoveValuesCleanUp(void) { gMoveResultFlags = 0; gIsCriticalHit = FALSE; - gBattleCommunication[MOVE_EFFECT_BYTE] = 0; + gBattleScripting.moveEffect = 0; gBattleCommunication[6] = 0; gHitMarker &= ~(HITMARKER_DESTINYBOND); gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT); @@ -4430,7 +4429,7 @@ static void atk49_moveend(void) gBattlerTarget = battlerId; gBattleScripting.atk49_state = 0; MoveValuesCleanUp(); - gBattleCommunication[MOVE_EFFECT_BYTE] = gBattleScripting.savedMoveEffect; + gBattleScripting.moveEffect = gBattleScripting.savedMoveEffect; BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]); gBattlescriptCurrInstr = BattleScript_FlushMessageBox; return; @@ -6935,25 +6934,25 @@ static void atk76_various(void) switch (gBattleMoves[gCurrentMove].argument) { case STATUS1_BURN: - gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_BURN; + gBattleScripting.moveEffect = MOVE_EFFECT_BURN; break; case STATUS1_FREEZE: - gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_FREEZE; + gBattleScripting.moveEffect = MOVE_EFFECT_FREEZE; break; case STATUS1_PARALYSIS: - gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_PARALYSIS; + gBattleScripting.moveEffect = MOVE_EFFECT_PARALYSIS; break; case STATUS1_POISON: - gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_POISON; + gBattleScripting.moveEffect = MOVE_EFFECT_POISON; break; case STATUS1_TOXIC_POISON: - gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_TOXIC; + gBattleScripting.moveEffect = MOVE_EFFECT_TOXIC; break; default: - gBattleCommunication[MOVE_EFFECT_BYTE] = 0; + gBattleScripting.moveEffect = 0; break; } - if (gBattleCommunication[MOVE_EFFECT_BYTE] != 0) + if (gBattleScripting.moveEffect != 0) { BattleScriptPush(gBattlescriptCurrInstr + 3); gBattlescriptCurrInstr = BattleScript_EffectWithChance; @@ -7187,7 +7186,7 @@ static void atk76_various(void) } return; case VARIOUS_ARGUMENT_TO_MOVE_EFFECT: - gBattleCommunication[MOVE_EFFECT_BYTE] = gBattleMoves[gCurrentMove].argument; + gBattleScripting.moveEffect = gBattleMoves[gCurrentMove].argument; break; case VARIOUS_JUMP_IF_NOT_GROUNDED: if (!IsBattlerGrounded(gActiveBattler)) @@ -7747,10 +7746,10 @@ static void atk88_setdrainedhp(void) gBattlescriptCurrInstr++; } -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) @@ -7939,9 +7938,9 @@ static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr) static void atk89_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_CHANGE_WORKED) - gBattlescriptCurrInstr += 6; + const u8 *jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + if (ChangeStatBuffs(gBattleScripting.statChanger & 0xF0, GET_STAT_BUFF_ID(gBattleScripting.statChanger), T1_READ_16(gBattlescriptCurrInstr + 1), jumpPtr) == STAT_CHANGE_WORKED) + gBattlescriptCurrInstr += 7; } static void atk8A_normalisebuffs(void) // haze @@ -7970,7 +7969,7 @@ static void atk8B_setbide(void) static void atk8C_confuseifrepeatingattackends(void) { if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_LOCK_CONFUSE)) - gBattleCommunication[MOVE_EFFECT_BYTE] = (MOVE_EFFECT_THRASH | MOVE_EFFECT_AFFECTS_USER); + gBattleScripting.moveEffect = (MOVE_EFFECT_THRASH | MOVE_EFFECT_AFFECTS_USER); gBattlescriptCurrInstr++; } @@ -10409,31 +10408,31 @@ static void atkE4_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++; diff --git a/src/battle_util.c b/src/battle_util.c index 0b7987b770..5ba6788c84 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1606,7 +1606,7 @@ u8 DoBattlerEndTurnEffects(void) gBattleMons[gActiveBattler].status2 &= ~(STATUS2_MULTIPLETURNS); if (!(gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION)) { - gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER; + gBattleScripting.moveEffect = MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER; SetMoveEffect(1, 0); if (gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION) BattleScriptExecute(BattleScript_ThrashConfuses); @@ -3227,13 +3227,13 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA { do { - gBattleCommunication[MOVE_EFFECT_BYTE] = Random() & 3; - } while (gBattleCommunication[MOVE_EFFECT_BYTE] == 0); + gBattleScripting.moveEffect = Random() & 3; + } while (gBattleScripting.moveEffect == 0); - if (gBattleCommunication[MOVE_EFFECT_BYTE] == MOVE_EFFECT_BURN) - gBattleCommunication[MOVE_EFFECT_BYTE] += 2; // 5 MOVE_EFFECT_PARALYSIS + if (gBattleScripting.moveEffect == MOVE_EFFECT_BURN) + gBattleScripting.moveEffect += 2; // 5 MOVE_EFFECT_PARALYSIS - gBattleCommunication[MOVE_EFFECT_BYTE] += MOVE_EFFECT_AFFECTS_USER; + gBattleScripting.moveEffect += MOVE_EFFECT_AFFECTS_USER; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; @@ -3248,7 +3248,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) && (Random() % 3) == 0) { - gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_POISON; + gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_POISON; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; @@ -3263,7 +3263,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) && (Random() % 3) == 0) { - gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_PARALYSIS; + gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_PARALYSIS; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; @@ -3278,7 +3278,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && TARGET_TURN_DAMAGED && (Random() % 3) == 0) { - gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_BURN; + gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_BURN; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; @@ -3413,7 +3413,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA if (gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON; - gBattleCommunication[MOVE_EFFECT_BYTE] = gBattleStruct->synchronizeMoveEffect + MOVE_EFFECT_AFFECTS_USER; + gBattleScripting.moveEffect = gBattleStruct->synchronizeMoveEffect + MOVE_EFFECT_AFFECTS_USER; gBattleScripting.battler = gBattlerTarget; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SynchronizeActivates; @@ -3429,7 +3429,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA if (gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON; - gBattleCommunication[MOVE_EFFECT_BYTE] = gBattleStruct->synchronizeMoveEffect; + gBattleScripting.moveEffect = gBattleStruct->synchronizeMoveEffect; gBattleScripting.battler = gBattlerAttacker; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SynchronizeActivates; @@ -4259,7 +4259,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(0, 0); BattleScriptPop(); From 08892d19f2324641476b922010656db844f2dc62 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 14 Feb 2019 19:48:21 +0100 Subject: [PATCH 259/667] Modify the stat changer, so it supports raise/lower by 12 --- asm/macros/battle_script.inc | 2 +- include/battle.h | 10 +++++----- src/battle_script_commands.c | 10 +++++++--- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 2bcefc1c1d..32658412ba 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1591,7 +1591,7 @@ @ 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 diff --git a/include/battle.h b/include/battle.h index 63b5073543..957cc86ed8 100644 --- a/include/battle.h +++ b/include/battle.h @@ -597,14 +597,14 @@ struct BattleStruct 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)) struct BattleScripting { diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ede2bad9b7..94799a6bf0 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4011,7 +4011,7 @@ static void atk46_playanimation2(void) // animation Id is stored in the first po static void atk47_setgraphicalstatchangevalues(void) { u8 value = 0; - switch (GET_STAT_BUFF_VALUE2(gBattleScripting.statChanger)) + switch (GET_STAT_BUFF_VALUE_WITH_SIGN(gBattleScripting.statChanger)) { case SET_STAT_BUFF_VALUE(1): // +1 value = STAT_ANIM_PLUS1; @@ -6379,7 +6379,7 @@ static void atk76_various(void) { gBattleStruct->stolenStats[0] &= ~(gBitTable[i]); SET_STATCHANGER(i, gBattleStruct->stolenStats[i], FALSE); - if (ChangeStatBuffs(gBattleScripting.statChanger & 0xF0, i, MOVE_EFFECT_CERTAIN | MOVE_EFFECT_AFFECTS_USER, NULL) == STAT_CHANGE_WORKED) + 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; @@ -7772,6 +7772,10 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr 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); @@ -7939,7 +7943,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr static void atk89_statbuffchange(void) { const u8 *jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 3); - if (ChangeStatBuffs(gBattleScripting.statChanger & 0xF0, GET_STAT_BUFF_ID(gBattleScripting.statChanger), T1_READ_16(gBattlescriptCurrInstr + 1), jumpPtr) == STAT_CHANGE_WORKED) + if (ChangeStatBuffs(GET_STAT_BUFF_VALUE_WITH_SIGN(gBattleScripting.statChanger), GET_STAT_BUFF_ID(gBattleScripting.statChanger), T1_READ_16(gBattlescriptCurrInstr + 1), jumpPtr) == STAT_CHANGE_WORKED) gBattlescriptCurrInstr += 7; } From c1f90329896401f7d0aa1f121131efd6391688d0 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 16 Feb 2019 12:54:11 +0100 Subject: [PATCH 260/667] Defiant and Competitive --- data/battle_scripts_1.s | 10 ++++++++++ include/battle_scripts.h | 1 + src/battle_script_commands.c | 6 +++--- src/battle_util.c | 16 +++++++++++++++- 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 081b92c523..fe5dd7dd35 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5803,6 +5803,16 @@ BattleScript_DrizzleActivates:: 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 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 94574f965e..b9378cb32e 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -295,5 +295,6 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 94799a6bf0..adc13bae63 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1893,8 +1893,9 @@ static void atk10_printstring(void) if (gBattleControllerExecFlags == 0) { u16 var = T2_READ_16(gBattlescriptCurrInstr + 1); - PrepareStringBattle(var, gBattlerAttacker); + gBattlescriptCurrInstr += 3; + PrepareStringBattle(var, gBattlerAttacker); gBattleCommunication[MSG_DISPLAY] = 1; } } @@ -1938,9 +1939,8 @@ static void atk13_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; } } diff --git a/src/battle_util.c b/src/battle_util.c index 5ba6788c84..3024652b24 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -483,11 +483,25 @@ void PrepareStringBattle(u16 stringId, u8 battler) else if (stringId == STRINGID_STATSWONTINCREASE && gBattleScripting.statChanger & STAT_BUFF_NEGATIVE) stringId = STRINGID_STATSWONTDECREASE; - if (stringId == STRINGID_STATSWONTDECREASE2 && GetBattlerAbility(battler) == ABILITY_CONTRARY) + 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 (((GetBattlerAbility(gBattlerTarget) == ABILITY_DEFIANT && gBattleMons[gBattlerTarget].statStages[STAT_ATK] != 12) + || (GetBattlerAbility(gBattlerTarget) == ABILITY_COMPETITIVE && gBattleMons[gBattlerTarget].statStages[STAT_SPATK] != 12)) + && stringId == STRINGID_PKMNSSTATCHANGED4) + { + 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); From a001faeced0cf8b268fa8e96bc63a1eb4746779c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 16 Feb 2019 14:54:17 +0100 Subject: [PATCH 261/667] New AI command for using priority moves in death situatiions --- asm/macros/battle_ai_script.inc | 5 +++ data/battle_ai_scripts.s | 14 ++++++ include/battle_main.h | 3 +- src/battle_ai_script_commands.c | 76 +++++++++++++++++++++++++++++---- src/battle_main.c | 14 ++++-- src/battle_script_commands.c | 2 +- src/battle_util.c | 4 +- 7 files changed, 101 insertions(+), 17 deletions(-) diff --git a/asm/macros/battle_ai_script.inc b/asm/macros/battle_ai_script.inc index 1abc94b19b..9e467686ae 100644 --- a/asm/macros/battle_ai_script.inc +++ b/asm/macros/battle_ai_script.inc @@ -615,6 +615,11 @@ .4byte \ptr .endm + .macro if_ai_can_go_down ptr:req + .byte 0x6C + .4byte \ptr + .endm + @ useful script macros .macro if_has_physical_move battler:req, ptr:req if_has_move_with_split \battler, SPLIT_PHYSICAL, \ptr diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index b103cd78f4..48d247260e 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -886,11 +886,25 @@ 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 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 if_effect EFFECT_HIT, AI_CV_Hit if_effect EFFECT_SLEEP, AI_CV_Sleep if_effect EFFECT_ABSORB, AI_CV_Absorb diff --git a/include/battle_main.h b/include/battle_main.h index 583b0ae396..b72ec71956 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -69,7 +69,8 @@ u8 IsRunningFromBattleImpossible(void); void sub_803BDA0(u8 battlerId); void SwapTurnOrder(u8 id1, u8 id2); u32 GetBattlerTotalSpeedStat(u8 battlerId); -s8 GetMovePriority(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); diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index d73857ee82..bd194e15c3 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -93,7 +93,7 @@ static void BattleAICmd_get_how_powerful_move_is(void); static void BattleAICmd_get_last_used_battler_move(void); static void BattleAICmd_if_equal_(void); static void BattleAICmd_if_not_equal_(void); -static void BattleAICmd_if_user_goes(void); +void BattleAICmd_if_user_goes(void); static void BattleAICmd_if_user_doesnt_go(void); static void BattleAICmd_nullsub_2A(void); static void BattleAICmd_nullsub_2B(void); @@ -161,6 +161,7 @@ static void BattleAICmd_if_cant_use_last_resort(void); static void BattleAICmd_if_has_move_with_split(void); static void BattleAICmd_if_has_no_move_with_split(void); static void BattleAICmd_if_physical_moves_unusable(void); +static void BattleAICmd_if_ai_can_go_down(void); // ewram EWRAM_DATA const u8 *gAIScriptPtr = NULL; @@ -279,6 +280,7 @@ static const BattleAICmdFunc sBattleAICmdTable[] = BattleAICmd_if_has_move_with_split, // 0x69 BattleAICmd_if_has_no_move_with_split, // 0x6A BattleAICmd_if_physical_moves_unusable, // 0x6B + BattleAICmd_if_ai_can_go_down, // 0x6C }; static const u16 sDiscouragedPowerfulMoveEffects[] = @@ -1434,20 +1436,56 @@ static void BattleAICmd_if_not_equal_(void) // Same as if_not_equal. gAIScriptPtr += 6; } -static void BattleAICmd_if_user_goes(void) +void BattleAICmd_if_user_goes(void) { - if (GetWhoStrikesFirst(sBattler_AI, gBattlerTarget, TRUE) == gAIScriptPtr[1]) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); + u32 fasterAI = 0, fasterPlayer = 0, i; + s8 prioAI, prioPlayer; + + // 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 BattleAICmd_if_user_doesnt_go(void) { - if (GetWhoStrikesFirst(sBattler_AI, gBattlerTarget, TRUE) != gAIScriptPtr[1]) - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); - else - gAIScriptPtr += 6; + // To be changed. Not needed since the above does the same. + gAIScriptPtr += 6; } static void BattleAICmd_nullsub_2A(void) @@ -2622,3 +2660,23 @@ static void BattleAICmd_if_physical_moves_unusable(void) else gAIScriptPtr += 7; } + +// Check if target has means to faint ai mon. +static void BattleAICmd_if_ai_can_go_down(void) +{ + s32 i, dmg; + u32 unusable = CheckMoveLimitations(gBattlerTarget, 0, 0xFF & ~MOVE_LIMITATION_PP); + u16 *moves = gBattleResources->battleHistory->usedMoves[gBattlerTarget].moves; + + 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; +} diff --git a/src/battle_main.c b/src/battle_main.c index 7a4bb25418..b4d80beb14 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4328,9 +4328,8 @@ u32 GetBattlerTotalSpeedStat(u8 battlerId) return speed; } -s8 GetMovePriority(u8 battlerId) +s8 GetChosenMovePriority(u32 battlerId) { - s8 priority; u16 move; if (gProtectStructs[battlerId].noValidMoves) @@ -4338,6 +4337,13 @@ s8 GetMovePriority(u8 battlerId) 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 @@ -4397,9 +4403,9 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) if (!ignoreChosenMoves) { if (gChosenActionByBattler[battler1] == B_ACTION_USE_MOVE) - priority1 = GetMovePriority(battler1); + priority1 = GetChosenMovePriority(battler1); if (gChosenActionByBattler[battler2] == B_ACTION_USE_MOVE) - priority2 = GetMovePriority(battler2); + priority2 = GetChosenMovePriority(battler2); } if (priority1 == priority2) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index adc13bae63..d3be76bf61 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -902,7 +902,7 @@ bool32 IsBattlerProtected(u8 battlerId, u16 move) else if (gProtectStructs[battlerId].kingsShielded && gBattleMoves[move].power != 0) return TRUE; else if (gSideStatuses[GetBattlerSide(battlerId)] & SIDE_STATUS_QUICK_GUARD - && GetMovePriority(gBattlerAttacker) > 0) + && GetChosenMovePriority(gBattlerAttacker) > 0) return TRUE; else if (gSideStatuses[GetBattlerSide(battlerId)] & SIDE_STATUS_CRAFTY_SHIELD && gBattleMoves[move].power == 0) diff --git a/src/battle_util.c b/src/battle_util.c index 3024652b24..dadd4f7016 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2345,7 +2345,7 @@ u8 AtkCanceller_UnableToUseMove2(void) case CANCELLER_PSYCHIC_TERRAIN: if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN && IsBattlerGrounded(gBattlerAttacker) - && GetMovePriority(gBattlerAttacker) > 0 + && GetChosenMovePriority(gBattlerAttacker) > 0 && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget)) { CancelMultiTurnMoves(gBattlerAttacker); @@ -2989,7 +2989,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA else if ((gLastUsedAbility == ABILITY_DAZZLING || (IsBattlerAlive(battler ^= BIT_FLANK) && GetBattlerAbility(battler) == ABILITY_DAZZLING) ) - && GetMovePriority(battler) > 0 + && GetChosenMovePriority(battler) > 0 && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(battler)) { if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS) From 9bc55246bc62309fc57434317ae56f4426f16797 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 16 Feb 2019 18:23:56 +0100 Subject: [PATCH 262/667] AI handle Belch --- asm/macros/battle_ai_script.inc | 6 +++--- data/battle_ai_scripts.s | 5 +++++ src/battle_ai_script_commands.c | 24 ++++++++++++++---------- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/asm/macros/battle_ai_script.inc b/asm/macros/battle_ai_script.inc index 9e467686ae..2faa2a0434 100644 --- a/asm/macros/battle_ai_script.inc +++ b/asm/macros/battle_ai_script.inc @@ -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 diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 48d247260e..6ba2c87489 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -248,6 +248,11 @@ AI_CheckBadMove_CheckEffect: @ 82DC045 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 + end + +AI_CBM_Belch: + if_cant_use_belch AI_USER, Score_Minus10 end AI_CBM_LastResort: diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index bd194e15c3..bdf868c692 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -93,8 +93,8 @@ static void BattleAICmd_get_how_powerful_move_is(void); static void BattleAICmd_get_last_used_battler_move(void); static void BattleAICmd_if_equal_(void); static void BattleAICmd_if_not_equal_(void); -void BattleAICmd_if_user_goes(void); -static void BattleAICmd_if_user_doesnt_go(void); +static void BattleAICmd_if_user_goes(void); +static void BattleAICmd_if_cant_use_belch(void); static void BattleAICmd_nullsub_2A(void); static void BattleAICmd_nullsub_2B(void); static void BattleAICmd_count_usable_party_mons(void); @@ -213,7 +213,7 @@ static const BattleAICmdFunc sBattleAICmdTable[] = BattleAICmd_if_equal_, // 0x26 BattleAICmd_if_not_equal_, // 0x27 BattleAICmd_if_user_goes, // 0x28 - BattleAICmd_if_user_doesnt_go, // 0x29 + BattleAICmd_if_cant_use_belch, // 0x29 BattleAICmd_nullsub_2A, // 0x2A BattleAICmd_nullsub_2B, // 0x2B BattleAICmd_count_usable_party_mons, // 0x2C @@ -1436,7 +1436,7 @@ static void BattleAICmd_if_not_equal_(void) // Same as if_not_equal. gAIScriptPtr += 6; } -void BattleAICmd_if_user_goes(void) +static void BattleAICmd_if_user_goes(void) { u32 fasterAI = 0, fasterPlayer = 0, i; s8 prioAI, prioPlayer; @@ -1482,12 +1482,6 @@ void BattleAICmd_if_user_goes(void) } } -static void BattleAICmd_if_user_doesnt_go(void) -{ - // To be changed. Not needed since the above does the same. - gAIScriptPtr += 6; -} - static void BattleAICmd_nullsub_2A(void) { } @@ -2680,3 +2674,13 @@ static void BattleAICmd_if_ai_can_go_down(void) gAIScriptPtr += 5; } + +static void BattleAICmd_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); +} From b0f46c68b91c036a6d7d39e0addc313a055f4136 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 24 Feb 2019 09:43:07 +0100 Subject: [PATCH 263/667] Fix PSS icons not disappearing when learning mvoe --- src/pokemon_summary_screen.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 0d753e7f52..6b6e5729c5 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -2971,7 +2971,10 @@ static void ClearPageWindowTilemaps(u8 page) if (pssData->mode == PSS_MODE_SELECT_MOVE) { if (pssData->newMove != MOVE_NONE || pssData->firstMoveIndex != MAX_MON_MOVES) + { ClearWindowTilemap(14); + gSprites[pssData->splitIconSpriteId].invisible = TRUE; + } } else { From a16a5f43a0a4c7930f4dde35cacdff8acb4bde67 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 24 Feb 2019 09:55:21 +0100 Subject: [PATCH 264/667] Fix Pursuit dbl damage on switch --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index dadd4f7016..826b8d3209 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4822,7 +4822,7 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) basePower *= 2; break; case EFFECT_PURSUIT: - if (gCurrentActionFuncId == B_ACTION_SWITCH) + if (gActionsByTurnOrder[GetBattlerTurnOrderNum(gBattlerTarget)] == B_ACTION_SWITCH) basePower *= 2; break; case EFFECT_NATURAL_GIFT: From 47dce452e95ca9e76895e2a74d294a7f78292821 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 24 Feb 2019 10:04:21 +0100 Subject: [PATCH 265/667] Fix missing moves mentioning typechart --- src/battle_script_commands.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d3be76bf61..f12583f674 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1264,7 +1264,8 @@ static void atk01_accuracycheck(void) else gBattleCommunication[6] = 0; - CalcTypeEffectivenessMultiplier(move, type, gBattlerAttacker, gBattlerTarget, TRUE); + if (gBattleMoves[move].power) + CalcTypeEffectivenessMultiplier(move, type, gBattlerAttacker, gBattlerTarget, TRUE); } JumpIfMoveFailed(7, move); } From d704b9cd5b3ff640c489fb84c90e3a428ae7f8c1 Mon Sep 17 00:00:00 2001 From: Papa Cancer Date: Fri, 22 Feb 2019 22:48:28 +0000 Subject: [PATCH 266/667] Gravity fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Brings down Pokémon in the middle of a two-turn flying move (only Bounce and Fly at the moment); says the appropriate message for all mons brought to the ground via Gravity --- asm/macros/battle_script.inc | 4 ++++ data/battle_scripts_1.s | 15 ++++++++++++++- include/constants/battle_script_commands.h | 1 + include/constants/battle_string_ids.h | 3 ++- src/battle_message.c | 4 +++- src/battle_script_commands.c | 10 ++++++---- 6 files changed, 30 insertions(+), 7 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 32658412ba..890202a0c8 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1588,6 +1588,10 @@ .macro spectralthiefprintstats various BS_ATTACKER, VARIOUS_SPECTRAL_THIEF .endm + + .macro bringdownairbornebattler battler:req + various \battler, VARIOUS_GRAVITY_ON_AIRBORNE_MONS + .endm @ helpful macros .macro setstatchanger stat:req, stages:req, down:req diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index fe5dd7dd35..087dbd4b4e 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1601,7 +1601,20 @@ BattleScript_EffectGravity: waitanimation printstring STRINGID_GRAVITYINTENSIFIED waitmessage 0x40 - goto BattleScript_MoveEnd + 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: + setbyte sMOVEEND_STATE, 0x0 + moveend 0x2, 0x10 + jumpifnexttargetvalid BattleScript_GravityLoop + end BattleScript_EffectRoost: attackcanceler diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 11f57f6fe6..ac815da69e 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -136,6 +136,7 @@ #define VARIOUS_ACUPRESSURE 73 #define VARIOUS_SET_POWDER 74 #define VARIOUS_SPECTRAL_THIEF 75 +#define VARIOUS_GRAVITY_ON_AIRBORNE_MONS 76 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 8c863c2a72..745fc5469c 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -518,7 +518,8 @@ #define STRINGID_POWDEREXPLODES 514 #define STRINGID_BELCHCANTSELECT 515 #define STRINGID_SPECTRALTHIEFSTEAL 516 +#define STRINGID_GRAVITYGROUNDING 517 -#define BATTLESTRINGS_COUNT 528 +#define BATTLESTRINGS_COUNT 529 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_message.c b/src/battle_message.c index 82060876fa..7034931f01 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -626,7 +626,7 @@ static const u8 sText_TerrainBecomesElectric[] = _("An electric current runs acr static const u8 sText_TerrainBecomesPsychic[] = _("The battlefield got weird!"); static const u8 sText_TargetElectrified[] = _("The opposing {B_ATK_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_SCR_ACTIVE_NAME_WITH_PREFIX} can't use {B_CURRENT_MOVE}\nbecause of gravity!\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[] = _("The opposing {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 reacting\nto {B_ATK_TRAINER_NAME}'s Mega Ring!"); static const u8 sText_MegaEvoEvolved[] = _("{B_ATK_NAME_WITH_PREFIX} has Mega\nEvolved into Mega {B_BUFF1}!"); @@ -643,6 +643,7 @@ static const u8 sText_CoveredInPowder[] = _("{B_DEF_NAME_WITH_PREFIX} is covered 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!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { @@ -1151,6 +1152,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_POKEMONCANNOTUSEMOVE - 12] = sText_PokemonCannotUseMove, [STRINGID_COVEREDINPOWDER - 12] = sText_CoveredInPowder, [STRINGID_POWDEREXPLODES - 12] = sText_PowderExplodes, + [STRINGID_GRAVITYGROUNDING - 12] = sText_GravityGrounding, }; const u16 gTerrainStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d3be76bf61..2a5bfe9e3e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5828,10 +5828,6 @@ static void atk69_setgravity(void) gFieldStatuses |= STATUS_FIELD_GRAVITY; gFieldTimers.gravityTimer = 5; - - for (i = 0; i < MAX_BATTLERS_COUNT; i++) - gStatuses3[i] &= ~(STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS | STATUS3_ON_AIR); - gBattlescriptCurrInstr += 5; } } @@ -6371,6 +6367,12 @@ static void atk76_various(void) switch (gBattlescriptCurrInstr[2]) { + 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++) From df9e6a6889528ec731b3cfff4a2aad7841bb0401 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 25 Feb 2019 16:17:23 +0100 Subject: [PATCH 267/667] Free up two status3 flags --- include/battle.h | 2 ++ include/constants/battle.h | 3 +-- src/battle_util.c | 16 ++++++++-------- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/include/battle.h b/include/battle.h index 957cc86ed8..6ffade63aa 100644 --- a/include/battle.h +++ b/include/battle.h @@ -130,6 +130,8 @@ struct UnknownFlags #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 struct DisableStruct { diff --git a/include/constants/battle.h b/include/constants/battle.h index a70dce43ab..63db1523cd 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -150,8 +150,7 @@ #define STATUS3_GASTRO_ACID 0x10000 #define STATUS3_EMBARGO 0x20000 #define STATUS3_UNDERWATER 0x40000 -#define STATUS3_INTIMIDATE_POKES 0x80000 -#define STATUS3_TRACE 0x100000 + #define STATUS3_SMACKED_DOWN 0x200000 #define STATUS3_ME_FIRST 0x400000 #define STATUS3_TELEKINESIS 0x800000 diff --git a/src/battle_util.c b/src/battle_util.c index 826b8d3209..c93821477f 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2842,7 +2842,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA case ABILITY_INTIMIDATE: if (!(gSpecialStatuses[battler].intimidatedMon)) { - gStatuses3[battler] |= STATUS3_INTIMIDATE_POKES; + gBattleResources->flags->flags[battler] |= RESOURCE_FLAG_INTIMIDATED; gSpecialStatuses[battler].intimidatedMon = 1; } break; @@ -2858,7 +2858,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA case ABILITY_TRACE: if (!(gSpecialStatuses[battler].traced)) { - gStatuses3[battler] |= STATUS3_TRACE; + gBattleResources->flags->flags[battler] |= RESOURCE_FLAG_TRACED; gSpecialStatuses[battler].traced = 1; } break; @@ -3454,10 +3454,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA case ABILITYEFFECT_INTIMIDATE1: // 9 for (i = 0; i < gBattlersCount; i++) { - if (gBattleMons[i].ability == ABILITY_INTIMIDATE && gStatuses3[i] & STATUS3_INTIMIDATE_POKES) + if (gBattleMons[i].ability == ABILITY_INTIMIDATE && gBattleResources->flags->flags[i] & RESOURCE_FLAG_INTIMIDATED) { gLastUsedAbility = ABILITY_INTIMIDATE; - gStatuses3[i] &= ~(STATUS3_INTIMIDATE_POKES); + gBattleResources->flags->flags[i] &= ~(RESOURCE_FLAG_INTIMIDATED); BattleScriptPushCursorAndCallback(BattleScript_IntimidateActivatesEnd3); gBattlerAbility = gBattleStruct->intimidateBattler = i; effect++; @@ -3468,7 +3468,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA case ABILITYEFFECT_TRACE: // 11 for (i = 0; i < gBattlersCount; i++) { - if (gBattleMons[i].ability == ABILITY_TRACE && (gStatuses3[i] & STATUS3_TRACE)) + if (gBattleMons[i].ability == ABILITY_TRACE && (gBattleResources->flags->flags[i] & RESOURCE_FLAG_TRACED)) { u8 target2; side = (GetBattlerPosition(i) ^ BIT_SIDE) & BIT_SIDE; // side of the opposing pokemon @@ -3512,7 +3512,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA if (effect) { BattleScriptPushCursorAndCallback(BattleScript_TraceActivates); - gStatuses3[i] &= ~(STATUS3_TRACE); + gBattleResources->flags->flags[i] &= ~(RESOURCE_FLAG_TRACED); gBattlerAbility = gBattleScripting.battler = i; PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBattler, gBattlerPartyIndexes[gActiveBattler]) @@ -3525,10 +3525,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA case ABILITYEFFECT_INTIMIDATE2: // 10 for (i = 0; i < gBattlersCount; i++) { - if (gBattleMons[i].ability == ABILITY_INTIMIDATE && (gStatuses3[i] & STATUS3_INTIMIDATE_POKES)) + if (gBattleMons[i].ability == ABILITY_INTIMIDATE && (gBattleResources->flags->flags[i] & RESOURCE_FLAG_INTIMIDATED)) { gLastUsedAbility = ABILITY_INTIMIDATE; - gStatuses3[i] &= ~(STATUS3_INTIMIDATE_POKES); + gBattleResources->flags->flags[i] &= ~(RESOURCE_FLAG_INTIMIDATED); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_IntimidateActivates; gBattleStruct->intimidateBattler = i; From 9564de6edb2b0d0ab9d2e36e65f7dc9d48e834ff Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Fri, 1 Mar 2019 00:06:31 -0300 Subject: [PATCH 268/667] Implemented the sprites for the Gen. 4 and 5 items. --- graphics/items/icon_palettes/acro_bike.pal | 0 graphics/items/icon_palettes/adamant_orb.pal | 19 ++ graphics/items/icon_palettes/aguav_berry.pal | 0 graphics/items/icon_palettes/amulet_coin.pal | 0 graphics/items/icon_palettes/antidote.pal | 0 graphics/items/icon_palettes/apicot_berry.pal | 0 graphics/items/icon_palettes/aspear_berry.pal | 0 .../items/icon_palettes/aurora_ticket.pal | 0 graphics/items/icon_palettes/awakening.pal | 0 graphics/items/icon_palettes/bead_mail.pal | 0 graphics/items/icon_palettes/belue_berry.pal | 0 graphics/items/icon_palettes/berry_juice.pal | 0 graphics/items/icon_palettes/berry_pouch.pal | 0 graphics/items/icon_palettes/bicycle.pal | 0 graphics/items/icon_palettes/big_root.pal | 19 ++ graphics/items/icon_palettes/bike_voucher.pal | 0 graphics/items/icon_palettes/binding_band.pal | 19 ++ graphics/items/icon_palettes/black_flute.pal | 0 graphics/items/icon_palettes/black_sludge.pal | 19 ++ .../black_type_enhancing_item.pal | 0 graphics/items/icon_palettes/blue_flute.pal | 0 graphics/items/icon_palettes/blue_orb.pal | 0 graphics/items/icon_palettes/blue_scarf.pal | 0 graphics/items/icon_palettes/blue_shard.pal | 0 graphics/items/icon_palettes/bluk_berry.pal | 0 .../items/icon_palettes/bright_powder.pal | 0 graphics/items/icon_palettes/burn_drive.pal | 19 ++ graphics/items/icon_palettes/burn_heal.pal | 0 graphics/items/icon_palettes/calcium.pal | 0 graphics/items/icon_palettes/carbos.pal | 0 graphics/items/icon_palettes/card_key.pal | 0 graphics/items/icon_palettes/charcoal.pal | 0 graphics/items/icon_palettes/cheri_berry.pal | 0 graphics/items/icon_palettes/chesto_berry.pal | 0 graphics/items/icon_palettes/chill_drive.pal | 19 ++ graphics/items/icon_palettes/choice_band.pal | 0 graphics/items/icon_palettes/choice_scarf.pal | 19 ++ graphics/items/icon_palettes/choice_specs.pal | 19 ++ graphics/items/icon_palettes/cleanse_tag.pal | 0 graphics/items/icon_palettes/coin_case.pal | 0 graphics/items/icon_palettes/contest_pass.pal | 0 graphics/items/icon_palettes/cornn_berry.pal | 0 graphics/items/icon_palettes/damp_rock.pal | 19 ++ graphics/items/icon_palettes/dark_tm_hm.pal | 0 .../items/icon_palettes/deep_sea_scale.pal | 0 .../items/icon_palettes/deep_sea_tooth.pal | 0 graphics/items/icon_palettes/destiny_knot.pal | 19 ++ graphics/items/icon_palettes/devon_goods.pal | 0 graphics/items/icon_palettes/devon_scope.pal | 0 graphics/items/icon_palettes/dire_hit.pal | 0 graphics/items/icon_palettes/dive_ball.pal | 0 graphics/items/icon_palettes/douse_drive.pal | 19 ++ graphics/items/icon_palettes/draco_plate.pal | 19 ++ graphics/items/icon_palettes/dragon_fang.pal | 0 graphics/items/icon_palettes/dragon_scale.pal | 0 graphics/items/icon_palettes/dragon_tm_hm.pal | 0 graphics/items/icon_palettes/dread_plate.pal | 19 ++ graphics/items/icon_palettes/dream_mail.pal | 0 graphics/items/icon_palettes/durin_berry.pal | 0 graphics/items/icon_palettes/earth_plate.pal | 19 ++ .../items/icon_palettes/electric_tm_hm.pal | 0 graphics/items/icon_palettes/elixir.pal | 0 .../items/icon_palettes/energy_powder.pal | 0 graphics/items/icon_palettes/energy_root.pal | 0 graphics/items/icon_palettes/enigma_berry.pal | 0 graphics/items/icon_palettes/eon_ticket.pal | 0 graphics/items/icon_palettes/escape_rope.pal | 0 graphics/items/icon_palettes/ether.pal | 0 graphics/items/icon_palettes/everstone.pal | 0 graphics/items/icon_palettes/eviolite.pal | 19 ++ graphics/items/icon_palettes/exp_share.pal | 0 graphics/items/icon_palettes/expert_belt.pal | 19 ++ graphics/items/icon_palettes/fab_mail.pal | 0 graphics/items/icon_palettes/fame_checker.pal | 0 .../items/icon_palettes/fighting_tm_hm.pal | 0 graphics/items/icon_palettes/figy_berry.pal | 0 graphics/items/icon_palettes/fire_stone.pal | 0 graphics/items/icon_palettes/fire_tm_hm.pal | 0 graphics/items/icon_palettes/fist_plate.pal | 19 ++ graphics/items/icon_palettes/flame_orb.pal | 19 ++ graphics/items/icon_palettes/flame_plate.pal | 19 ++ graphics/items/icon_palettes/float_stone.pal | 19 ++ graphics/items/icon_palettes/fluffy_tail.pal | 0 graphics/items/icon_palettes/flying_tm_hm.pal | 0 graphics/items/icon_palettes/focus_band.pal | 0 graphics/items/icon_palettes/focus_sash.pal | 19 ++ graphics/items/icon_palettes/fresh_water.pal | 0 graphics/items/icon_palettes/full_heal.pal | 0 graphics/items/icon_palettes/full_restore.pal | 0 graphics/items/icon_palettes/ganlon_berry.pal | 0 graphics/items/icon_palettes/ghost_tm_hm.pal | 0 graphics/items/icon_palettes/glitter_mail.pal | 0 graphics/items/icon_palettes/go_goggles.pal | 0 graphics/items/icon_palettes/gold_teeth.pal | 0 graphics/items/icon_palettes/good_rod.pal | 0 graphics/items/icon_palettes/grass_tm_hm.pal | 0 graphics/items/icon_palettes/great_ball.pal | 0 graphics/items/icon_palettes/green_scarf.pal | 0 graphics/items/icon_palettes/green_shard.pal | 0 graphics/items/icon_palettes/grepa_berry.pal | 0 graphics/items/icon_palettes/grip_claw.pal | 19 ++ graphics/items/icon_palettes/griseous_orb.pal | 19 ++ graphics/items/icon_palettes/ground_tm_hm.pal | 0 graphics/items/icon_palettes/guard_spec.pal | 0 graphics/items/icon_palettes/harbor_mail.pal | 0 graphics/items/icon_palettes/hard_stone.pal | 0 graphics/items/icon_palettes/heal_powder.pal | 0 graphics/items/icon_palettes/heart_scale.pal | 0 graphics/items/icon_palettes/heat_rock.pal | 19 ++ graphics/items/icon_palettes/hoenn_fossil.pal | 0 graphics/items/icon_palettes/hondew_berry.pal | 0 graphics/items/icon_palettes/hp_up.pal | 0 graphics/items/icon_palettes/hyper_potion.pal | 0 graphics/items/icon_palettes/iapapa_berry.pal | 0 graphics/items/icon_palettes/ice_heal.pal | 0 graphics/items/icon_palettes/ice_tm_hm.pal | 0 graphics/items/icon_palettes/icicle_plate.pal | 19 ++ graphics/items/icon_palettes/icy_rock.pal | 19 ++ graphics/items/icon_palettes/insect_plate.pal | 19 ++ graphics/items/icon_palettes/iron.pal | 0 graphics/items/icon_palettes/iron_ball.pal | 19 ++ graphics/items/icon_palettes/iron_plate.pal | 19 ++ graphics/items/icon_palettes/itemfinder.pal | 0 graphics/items/icon_palettes/kanto_fossil.pal | 0 graphics/items/icon_palettes/kelpsy_berry.pal | 0 graphics/items/icon_palettes/key.pal | 0 graphics/items/icon_palettes/kings_rock.pal | 0 graphics/items/icon_palettes/lagging_tail.pal | 19 ++ graphics/items/icon_palettes/lansat_berry.pal | 0 .../icon_palettes/lava_cookie_and_letter.pal | 0 graphics/items/icon_palettes/lax_incense.pal | 0 graphics/items/icon_palettes/leaf_stone.pal | 0 graphics/items/icon_palettes/leftovers.pal | 0 graphics/items/icon_palettes/lemonade.pal | 0 graphics/items/icon_palettes/leppa_berry.pal | 0 graphics/items/icon_palettes/liechi_berry.pal | 0 graphics/items/icon_palettes/life_orb.pal | 19 ++ graphics/items/icon_palettes/light_ball.pal | 0 graphics/items/icon_palettes/light_clay.pal | 19 ++ graphics/items/icon_palettes/lucky_egg.pal | 0 graphics/items/icon_palettes/lucky_punch.pal | 0 graphics/items/icon_palettes/lum_berry.pal | 0 graphics/items/icon_palettes/lustrous_orb.pal | 19 ++ graphics/items/icon_palettes/luxury_ball.pal | 0 graphics/items/icon_palettes/mach_bike.pal | 0 graphics/items/icon_palettes/macho_brace.pal | 0 graphics/items/icon_palettes/magma_emblem.pal | 0 graphics/items/icon_palettes/magnet.pal | 0 graphics/items/icon_palettes/mago_berry.pal | 0 graphics/items/icon_palettes/magost_berry.pal | 0 graphics/items/icon_palettes/master_ball.pal | 0 graphics/items/icon_palettes/max_elixir.pal | 0 graphics/items/icon_palettes/max_ether.pal | 0 graphics/items/icon_palettes/max_potion.pal | 0 graphics/items/icon_palettes/max_repel.pal | 0 graphics/items/icon_palettes/meadow_plate.pal | 19 ++ graphics/items/icon_palettes/mech_mail.pal | 0 graphics/items/icon_palettes/mental_herb.pal | 0 graphics/items/icon_palettes/metal_coat.pal | 0 graphics/items/icon_palettes/metal_powder.pal | 0 graphics/items/icon_palettes/meteorite.pal | 0 graphics/items/icon_palettes/metronome.pal | 19 ++ graphics/items/icon_palettes/mind_plate.pal | 19 ++ graphics/items/icon_palettes/miracle_seed.pal | 0 graphics/items/icon_palettes/moomoo_milk.pal | 0 graphics/items/icon_palettes/moon_stone.pal | 0 graphics/items/icon_palettes/muscle_band.pal | 19 ++ graphics/items/icon_palettes/mushroom.pal | 0 .../items/icon_palettes/mystic_ticket.pal | 0 graphics/items/icon_palettes/mystic_water.pal | 0 graphics/items/icon_palettes/nanab_berry.pal | 0 graphics/items/icon_palettes/nest_ball.pal | 0 graphics/items/icon_palettes/net_ball.pal | 0 .../items/icon_palettes/never_melt_ice.pal | 0 graphics/items/icon_palettes/nomel_berry.pal | 0 graphics/items/icon_palettes/normal_tm_hm.pal | 0 graphics/items/icon_palettes/nugget.pal | 0 graphics/items/icon_palettes/oaks_parcel.pal | 0 graphics/items/icon_palettes/old_amber.pal | 0 graphics/items/icon_palettes/old_key.pal | 0 graphics/items/icon_palettes/old_rod.pal | 0 graphics/items/icon_palettes/old_sea_map.pal | 0 graphics/items/icon_palettes/oran_berry.pal | 0 graphics/items/icon_palettes/orange_mail.pal | 0 graphics/items/icon_palettes/pamtre_berry.pal | 0 .../items/icon_palettes/paralyze_heal.pal | 0 graphics/items/icon_palettes/pearl.pal | 0 graphics/items/icon_palettes/pecha_berry.pal | 0 graphics/items/icon_palettes/persim_berry.pal | 0 graphics/items/icon_palettes/petaya_berry.pal | 0 graphics/items/icon_palettes/pinap_berry.pal | 0 graphics/items/icon_palettes/pink_scarf.pal | 0 graphics/items/icon_palettes/poison_barb.pal | 0 graphics/items/icon_palettes/poison_tm_hm.pal | 0 graphics/items/icon_palettes/poke_ball.pal | 0 graphics/items/icon_palettes/poke_doll.pal | 0 graphics/items/icon_palettes/poke_flute.pal | 0 .../items/icon_palettes/pokeblock_case.pal | 0 graphics/items/icon_palettes/pomeg_berry.pal | 0 graphics/items/icon_palettes/potion.pal | 0 graphics/items/icon_palettes/powder_jar.pal | 0 graphics/items/icon_palettes/power_herb.pal | 19 ++ graphics/items/icon_palettes/pp_max.pal | 0 graphics/items/icon_palettes/pp_up.pal | 0 graphics/items/icon_palettes/protein.pal | 0 .../items/icon_palettes/psychic_tm_hm.pal | 0 graphics/items/icon_palettes/qualot_berry.pal | 0 .../items/icon_palettes/question_mark.pal | 0 graphics/items/icon_palettes/quick_claw.pal | 0 graphics/items/icon_palettes/quick_powder.pal | 19 ++ graphics/items/icon_palettes/rabuta_berry.pal | 0 graphics/items/icon_palettes/rainbow_pass.pal | 0 graphics/items/icon_palettes/rare_candy.pal | 0 graphics/items/icon_palettes/rawst_berry.pal | 0 graphics/items/icon_palettes/razz_berry.pal | 0 graphics/items/icon_palettes/red_flute.pal | 0 graphics/items/icon_palettes/red_orb.pal | 0 graphics/items/icon_palettes/red_scarf.pal | 0 graphics/items/icon_palettes/red_shard.pal | 0 graphics/items/icon_palettes/repeat_ball.pal | 0 graphics/items/icon_palettes/repel.pal | 0 graphics/items/icon_palettes/retro_mail.pal | 0 .../icon_palettes/return_to_field_arrow.pal | 0 graphics/items/icon_palettes/revival_herb.pal | 0 graphics/items/icon_palettes/revive.pal | 0 graphics/items/icon_palettes/rock_tm_hm.pal | 0 graphics/items/icon_palettes/ruby.pal | 0 graphics/items/icon_palettes/sacred_ash.pal | 0 graphics/items/icon_palettes/safari_ball.pal | 0 graphics/items/icon_palettes/salac_berry.pal | 0 graphics/items/icon_palettes/sapphire.pal | 0 graphics/items/icon_palettes/scanner.pal | 0 graphics/items/icon_palettes/scope_lens.pal | 0 graphics/items/icon_palettes/sea_incense.pal | 0 graphics/items/icon_palettes/secret_key.pal | 0 graphics/items/icon_palettes/shadow_mail.pal | 0 graphics/items/icon_palettes/sharp_beak.pal | 0 graphics/items/icon_palettes/shed_shell.pal | 19 ++ graphics/items/icon_palettes/shell.pal | 0 graphics/items/icon_palettes/shoal_salt.pal | 0 graphics/items/icon_palettes/shock_drive.pal | 19 ++ graphics/items/icon_palettes/silk_scarf.pal | 0 graphics/items/icon_palettes/silph_scope.pal | 0 .../items/icon_palettes/silver_powder.pal | 0 graphics/items/icon_palettes/sitrus_berry.pal | 0 graphics/items/icon_palettes/sky_plate.pal | 19 ++ graphics/items/icon_palettes/smoke_ball.pal | 0 graphics/items/icon_palettes/smooth_rock.pal | 19 ++ graphics/items/icon_palettes/soda_pop.pal | 0 graphics/items/icon_palettes/soft_sand.pal | 0 graphics/items/icon_palettes/soot_sack.pal | 0 graphics/items/icon_palettes/soothe_bell.pal | 0 graphics/items/icon_palettes/soul_dew.pal | 0 graphics/items/icon_palettes/spell_tag.pal | 0 graphics/items/icon_palettes/spelon_berry.pal | 0 graphics/items/icon_palettes/splash_plate.pal | 19 ++ graphics/items/icon_palettes/spooky_plate.pal | 19 ++ graphics/items/icon_palettes/ss_ticket.pal | 0 graphics/items/icon_palettes/star.pal | 0 graphics/items/icon_palettes/starf_berry.pal | 0 graphics/items/icon_palettes/steel_tm_hm.pal | 0 graphics/items/icon_palettes/stick.pal | 0 graphics/items/icon_palettes/sticky_barb.pal | 19 ++ graphics/items/icon_palettes/stone_plate.pal | 19 ++ graphics/items/icon_palettes/sun_stone.pal | 0 graphics/items/icon_palettes/super_potion.pal | 0 graphics/items/icon_palettes/super_repel.pal | 0 graphics/items/icon_palettes/super_rod.pal | 0 graphics/items/icon_palettes/tamato_berry.pal | 0 graphics/items/icon_palettes/tea.pal | 0 graphics/items/icon_palettes/teachy_tv.pal | 0 graphics/items/icon_palettes/thick_club.pal | 0 .../items/icon_palettes/thunder_stone.pal | 0 graphics/items/icon_palettes/tm_case.pal | 0 graphics/items/icon_palettes/town_map.pal | 0 graphics/items/icon_palettes/toxic_orb.pal | 19 ++ graphics/items/icon_palettes/toxic_plate.pal | 19 ++ graphics/items/icon_palettes/tri_pass.pal | 0 graphics/items/icon_palettes/tropic_mail.pal | 0 .../items/icon_palettes/twisted_spoon.pal | 0 graphics/items/icon_palettes/ultra_ball.pal | 0 graphics/items/icon_palettes/up_grade.pal | 0 graphics/items/icon_palettes/vs_seeker.pal | 0 graphics/items/icon_palettes/wailmer_pail.pal | 0 graphics/items/icon_palettes/water_stone.pal | 0 graphics/items/icon_palettes/water_tm_hm.pal | 0 graphics/items/icon_palettes/watmel_berry.pal | 0 graphics/items/icon_palettes/wave_mail.pal | 0 graphics/items/icon_palettes/wepear_berry.pal | 0 graphics/items/icon_palettes/white_flute.pal | 0 graphics/items/icon_palettes/white_herb.pal | 0 graphics/items/icon_palettes/wide_lens.pal | 19 ++ graphics/items/icon_palettes/wiki_berry.pal | 0 graphics/items/icon_palettes/wise_glasses.pal | 19 ++ graphics/items/icon_palettes/wood_mail.pal | 0 graphics/items/icon_palettes/x_accuracy.pal | 0 graphics/items/icon_palettes/x_attack.pal | 0 graphics/items/icon_palettes/x_defend.pal | 0 graphics/items/icon_palettes/x_special.pal | 0 graphics/items/icon_palettes/x_speed.pal | 0 graphics/items/icon_palettes/yellow_flute.pal | 0 graphics/items/icon_palettes/yellow_scarf.pal | 0 graphics/items/icon_palettes/yellow_shard.pal | 0 graphics/items/icon_palettes/zap_plate.pal | 19 ++ graphics/items/icon_palettes/zinc.pal | 0 graphics/items/icon_palettes/zoom_lens.pal | 19 ++ graphics/items/icons/acro_bike.png | Bin graphics/items/icons/adamant_orb.PNG | Bin 0 -> 321 bytes graphics/items/icons/aguav_berry.png | Bin graphics/items/icons/amulet_coin.png | Bin graphics/items/icons/antidote.png | Bin graphics/items/icons/apicot_berry.png | Bin graphics/items/icons/aspear_berry.png | Bin graphics/items/icons/aurora_ticket.png | Bin graphics/items/icons/basement_key.png | Bin graphics/items/icons/battle_stat_item.png | Bin graphics/items/icons/bead_mail.png | Bin graphics/items/icons/belue_berry.png | Bin graphics/items/icons/berry_juice.png | Bin graphics/items/icons/berry_pouch.png | Bin graphics/items/icons/bicycle.png | Bin graphics/items/icons/big_mushroom.png | Bin graphics/items/icons/big_pearl.png | Bin graphics/items/icons/big_root.PNG | Bin 0 -> 415 bytes graphics/items/icons/bike_voucher.png | Bin graphics/items/icons/binding_band.PNG | Bin 0 -> 221 bytes graphics/items/icons/black_belt.png | Bin graphics/items/icons/black_glasses.png | Bin graphics/items/icons/black_sludge.PNG | Bin 0 -> 364 bytes graphics/items/icons/bluk_berry.png | Bin graphics/items/icons/bright_powder.png | Bin graphics/items/icons/burn_drive.PNG | Bin 0 -> 342 bytes graphics/items/icons/card_key.png | Bin graphics/items/icons/charcoal.png | Bin graphics/items/icons/cheri_berry.png | Bin graphics/items/icons/chesto_berry.png | Bin graphics/items/icons/chill_drive.PNG | Bin 0 -> 342 bytes graphics/items/icons/choice_band.png | Bin graphics/items/icons/choice_scarf.PNG | Bin 0 -> 447 bytes graphics/items/icons/choice_specs.PNG | Bin 0 -> 369 bytes graphics/items/icons/claw_fossil.png | Bin graphics/items/icons/cleanse_tag.png | Bin graphics/items/icons/coin_case.png | Bin graphics/items/icons/contest_pass.png | Bin graphics/items/icons/cornn_berry.png | Bin graphics/items/icons/damp_rock.PNG | Bin 0 -> 429 bytes graphics/items/icons/deep_sea_scale.png | Bin graphics/items/icons/deep_sea_tooth.png | Bin graphics/items/icons/destiny_knot.PNG | Bin 0 -> 396 bytes graphics/items/icons/devon_goods.png | Bin graphics/items/icons/devon_scope.png | Bin graphics/items/icons/dive_ball.png | Bin graphics/items/icons/dome_fossil.png | Bin graphics/items/icons/douse_drive.PNG | Bin 0 -> 342 bytes graphics/items/icons/draco_plate.PNG | Bin 0 -> 355 bytes graphics/items/icons/dragon_fang.png | Bin graphics/items/icons/dragon_scale.png | Bin graphics/items/icons/dread_plate.PNG | Bin 0 -> 355 bytes graphics/items/icons/dream_mail.png | Bin graphics/items/icons/durin_berry.png | Bin graphics/items/icons/earth_plate.PNG | Bin 0 -> 355 bytes graphics/items/icons/energy_root.png | Bin graphics/items/icons/enigma_berry.png | Bin graphics/items/icons/eon_ticket.png | Bin graphics/items/icons/escape_rope.png | Bin graphics/items/icons/ether.png | Bin graphics/items/icons/everstone.png | Bin graphics/items/icons/eviolite.PNG | Bin 0 -> 317 bytes graphics/items/icons/exp_share.png | Bin graphics/items/icons/expert_belt.PNG | Bin 0 -> 383 bytes graphics/items/icons/fab_mail.png | Bin graphics/items/icons/fame_checker.png | Bin graphics/items/icons/figy_berry.png | Bin graphics/items/icons/fire_stone.png | Bin graphics/items/icons/fist_plate.PNG | Bin 0 -> 355 bytes graphics/items/icons/flame_orb.png | Bin 0 -> 237 bytes graphics/items/icons/flame_plate.PNG | Bin 0 -> 355 bytes graphics/items/icons/float_stone.PNG | Bin 0 -> 345 bytes graphics/items/icons/fluffy_tail.png | Bin graphics/items/icons/flute.png | Bin graphics/items/icons/focus_band.png | Bin graphics/items/icons/focus_sash.PNG | Bin 0 -> 392 bytes graphics/items/icons/fresh_water.png | Bin graphics/items/icons/full_heal.png | Bin graphics/items/icons/ganlon_berry.png | Bin graphics/items/icons/gem.png | Bin graphics/items/icons/glitter_mail.png | Bin graphics/items/icons/go_goggles.png | Bin graphics/items/icons/gold_teeth.png | Bin graphics/items/icons/good_rod.png | Bin graphics/items/icons/great_ball.png | Bin graphics/items/icons/grepa_berry.png | Bin graphics/items/icons/grip_claw.PNG | Bin 0 -> 413 bytes graphics/items/icons/griseous_orb.PNG | Bin 0 -> 426 bytes graphics/items/icons/harbor_mail.png | Bin graphics/items/icons/hard_stone.png | Bin graphics/items/icons/heart_scale.png | Bin graphics/items/icons/heat_rock.PNG | Bin 0 -> 434 bytes graphics/items/icons/helix_fossil.png | Bin graphics/items/icons/hm.png | Bin graphics/items/icons/hondew_berry.png | Bin graphics/items/icons/hp_up.png | Bin graphics/items/icons/iapapa_berry.png | Bin graphics/items/icons/icicle_plate.PNG | Bin 0 -> 355 bytes graphics/items/icons/icy_rock.PNG | Bin 0 -> 411 bytes graphics/items/icons/in_battle_herb.png | Bin graphics/items/icons/insect_plate.PNG | Bin 0 -> 355 bytes graphics/items/icons/iron_ball.PNG | Bin 0 -> 352 bytes graphics/items/icons/iron_plate.PNG | Bin 0 -> 355 bytes graphics/items/icons/itemfinder.png | Bin graphics/items/icons/kelpsy_berry.png | Bin graphics/items/icons/kings_rock.png | Bin graphics/items/icons/lagging_tail.PNG | Bin 0 -> 400 bytes graphics/items/icons/lansat_berry.png | Bin graphics/items/icons/large_potion.png | Bin graphics/items/icons/lava_cookie.png | Bin graphics/items/icons/lax_incense.png | Bin graphics/items/icons/leaf_stone.png | Bin graphics/items/icons/leftovers.png | Bin graphics/items/icons/lemonade.png | Bin graphics/items/icons/leppa_berry.png | Bin graphics/items/icons/letter.png | Bin graphics/items/icons/liechi_berry.png | Bin graphics/items/icons/life_orb.PNG | Bin 0 -> 330 bytes graphics/items/icons/lift_key.png | Bin graphics/items/icons/light_ball.png | Bin graphics/items/icons/light_clay.PNG | Bin 0 -> 362 bytes graphics/items/icons/lucky_egg.png | Bin graphics/items/icons/lucky_punch.png | Bin graphics/items/icons/lum_berry.png | Bin graphics/items/icons/lustrous_orb.PNG | Bin 0 -> 458 bytes graphics/items/icons/luxury_ball.png | Bin graphics/items/icons/mach_bike.png | Bin graphics/items/icons/macho_brace.png | Bin graphics/items/icons/magma_emblem.png | Bin graphics/items/icons/magnet.png | Bin graphics/items/icons/mago_berry.png | Bin graphics/items/icons/magost_berry.png | Bin graphics/items/icons/master_ball.png | Bin graphics/items/icons/max_revive.png | Bin graphics/items/icons/meadow_plate.PNG | Bin 0 -> 355 bytes graphics/items/icons/mech_mail.png | Bin graphics/items/icons/metal_coat.png | Bin graphics/items/icons/metal_powder.png | Bin graphics/items/icons/meteorite.png | Bin graphics/items/icons/metronome.PNG | Bin 0 -> 356 bytes graphics/items/icons/mind_plate.PNG | Bin 0 -> 355 bytes graphics/items/icons/miracle_seed.png | Bin graphics/items/icons/moomoo_milk.png | Bin graphics/items/icons/moon_stone.png | Bin graphics/items/icons/muscle_band.PNG | Bin 0 -> 418 bytes graphics/items/icons/mystic_ticket.png | Bin graphics/items/icons/mystic_water.png | Bin graphics/items/icons/nanab_berry.png | Bin graphics/items/icons/nest_ball.png | Bin graphics/items/icons/net_ball.png | Bin graphics/items/icons/never_melt_ice.png | Bin graphics/items/icons/nomel_berry.png | Bin graphics/items/icons/nugget.png | Bin graphics/items/icons/oaks_parcel.png | Bin graphics/items/icons/old_amber.png | Bin graphics/items/icons/old_rod.png | Bin graphics/items/icons/old_sea_map.png | Bin graphics/items/icons/oran_berry.png | Bin graphics/items/icons/orange_mail.png | Bin graphics/items/icons/orb.png | Bin graphics/items/icons/pamtre_berry.png | Bin graphics/items/icons/pearl.png | Bin graphics/items/icons/pecha_berry.png | Bin graphics/items/icons/persim_berry.png | Bin graphics/items/icons/petaya_berry.png | Bin graphics/items/icons/pinap_berry.png | Bin graphics/items/icons/poison_barb.png | Bin graphics/items/icons/poke_ball.png | Bin graphics/items/icons/poke_doll.png | Bin graphics/items/icons/poke_flute.png | Bin graphics/items/icons/pokeblock_case.png | Bin graphics/items/icons/pomeg_berry.png | Bin graphics/items/icons/potion.png | Bin graphics/items/icons/powder.png | Bin graphics/items/icons/powder_jar.png | Bin graphics/items/icons/power_herb.PNG | Bin 0 -> 353 bytes graphics/items/icons/pp_max.png | Bin graphics/items/icons/pp_up.png | Bin graphics/items/icons/premier_ball.png | Bin graphics/items/icons/qualot_berry.png | Bin graphics/items/icons/question_mark.png | Bin graphics/items/icons/quick_claw.png | Bin graphics/items/icons/quick_powder.PNG | Bin 0 -> 392 bytes graphics/items/icons/rabuta_berry.png | Bin graphics/items/icons/rainbow_pass.png | Bin graphics/items/icons/rare_candy.png | Bin graphics/items/icons/rawst_berry.png | Bin graphics/items/icons/razz_berry.png | Bin graphics/items/icons/repeat_ball.png | Bin graphics/items/icons/repel.png | Bin graphics/items/icons/retro_mail.png | Bin .../items/icons/return_to_field_arrow.png | Bin graphics/items/icons/revival_herb.png | Bin graphics/items/icons/revive.png | Bin graphics/items/icons/room1_key.png | Bin graphics/items/icons/room2_key.png | Bin graphics/items/icons/room4_key.png | Bin graphics/items/icons/room6_key.png | Bin graphics/items/icons/root_fossil.png | Bin graphics/items/icons/sacred_ash.png | Bin graphics/items/icons/safari_ball.png | Bin graphics/items/icons/salac_berry.png | Bin graphics/items/icons/scanner.png | Bin graphics/items/icons/scarf.png | Bin graphics/items/icons/scope_lens.png | Bin graphics/items/icons/sea_incense.png | Bin graphics/items/icons/secret_key.png | Bin graphics/items/icons/shadow_mail.png | Bin graphics/items/icons/shard.png | Bin graphics/items/icons/sharp_beak.png | Bin graphics/items/icons/shed_shell.PNG | Bin 0 -> 393 bytes graphics/items/icons/shell_bell.png | Bin graphics/items/icons/shoal_shell.png | Bin graphics/items/icons/shock_drive.PNG | Bin 0 -> 342 bytes graphics/items/icons/silk_scarf.png | Bin graphics/items/icons/silph_scope.png | Bin graphics/items/icons/silver_powder.png | Bin graphics/items/icons/sitrus_berry.png | Bin graphics/items/icons/sky_plate.PNG | Bin 0 -> 355 bytes graphics/items/icons/smoke_ball.png | Bin graphics/items/icons/smooth_rock.PNG | Bin 0 -> 427 bytes graphics/items/icons/soda_pop.png | Bin graphics/items/icons/soft_sand.png | Bin graphics/items/icons/soot_sack.png | Bin graphics/items/icons/soothe_bell.png | Bin graphics/items/icons/soul_dew.png | Bin graphics/items/icons/spell_tag.png | Bin graphics/items/icons/spelon_berry.png | Bin graphics/items/icons/splash_plate.PNG | Bin 0 -> 352 bytes graphics/items/icons/spooky_plate.PNG | Bin 0 -> 355 bytes graphics/items/icons/ss_ticket.png | Bin graphics/items/icons/star_piece.png | Bin graphics/items/icons/stardust.png | Bin graphics/items/icons/starf_berry.png | Bin graphics/items/icons/status_heal.png | Bin graphics/items/icons/stick.png | Bin graphics/items/icons/sticky_barb.PNG | Bin 0 -> 332 bytes graphics/items/icons/stone_plate.PNG | Bin 0 -> 355 bytes graphics/items/icons/storage_key.png | Bin graphics/items/icons/sun_stone.png | Bin graphics/items/icons/super_rod.png | Bin graphics/items/icons/tamato_berry.png | Bin graphics/items/icons/tea.png | Bin graphics/items/icons/teachy_tv.png | Bin graphics/items/icons/thick_club.png | Bin graphics/items/icons/thunder_stone.png | Bin graphics/items/icons/timer_ball.png | Bin graphics/items/icons/tiny_mushroom.png | Bin graphics/items/icons/tm.png | Bin graphics/items/icons/tm_case.png | Bin graphics/items/icons/town_map.png | Bin graphics/items/icons/toxic_orb.PNG | Bin 0 -> 347 bytes graphics/items/icons/toxic_plate.PNG | Bin 0 -> 355 bytes graphics/items/icons/tri_pass.png | Bin graphics/items/icons/tropic_mail.png | Bin graphics/items/icons/twisted_spoon.png | Bin graphics/items/icons/ultra_ball.png | Bin graphics/items/icons/up_grade.png | Bin graphics/items/icons/vitamin.png | Bin graphics/items/icons/vs_seeker.png | Bin graphics/items/icons/wailmer_pail.png | Bin graphics/items/icons/water_stone.png | Bin graphics/items/icons/watmel_berry.png | Bin graphics/items/icons/wave_mail.png | Bin graphics/items/icons/wepear_berry.png | Bin graphics/items/icons/wide_lens.PNG | Bin 0 -> 370 bytes graphics/items/icons/wiki_berry.png | Bin graphics/items/icons/wise_glasses.PNG | Bin 0 -> 333 bytes graphics/items/icons/wood_mail.png | Bin graphics/items/icons/zap_plate.PNG | Bin 0 -> 355 bytes graphics/items/icons/zoom_lens.PNG | Bin 0 -> 385 bytes include/graphics.h | 108 ++++++++++++ src/data/graphics/items.h | 163 ++++++++++++++++++ src/data/item_icon_table.h | 55 ++++++ 580 files changed, 1333 insertions(+) mode change 100644 => 100755 graphics/items/icon_palettes/acro_bike.pal create mode 100755 graphics/items/icon_palettes/adamant_orb.pal mode change 100644 => 100755 graphics/items/icon_palettes/aguav_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/amulet_coin.pal mode change 100644 => 100755 graphics/items/icon_palettes/antidote.pal mode change 100644 => 100755 graphics/items/icon_palettes/apicot_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/aspear_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/aurora_ticket.pal mode change 100644 => 100755 graphics/items/icon_palettes/awakening.pal mode change 100644 => 100755 graphics/items/icon_palettes/bead_mail.pal mode change 100644 => 100755 graphics/items/icon_palettes/belue_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/berry_juice.pal mode change 100644 => 100755 graphics/items/icon_palettes/berry_pouch.pal mode change 100644 => 100755 graphics/items/icon_palettes/bicycle.pal create mode 100755 graphics/items/icon_palettes/big_root.pal mode change 100644 => 100755 graphics/items/icon_palettes/bike_voucher.pal create mode 100755 graphics/items/icon_palettes/binding_band.pal mode change 100644 => 100755 graphics/items/icon_palettes/black_flute.pal create mode 100755 graphics/items/icon_palettes/black_sludge.pal mode change 100644 => 100755 graphics/items/icon_palettes/black_type_enhancing_item.pal mode change 100644 => 100755 graphics/items/icon_palettes/blue_flute.pal mode change 100644 => 100755 graphics/items/icon_palettes/blue_orb.pal mode change 100644 => 100755 graphics/items/icon_palettes/blue_scarf.pal mode change 100644 => 100755 graphics/items/icon_palettes/blue_shard.pal mode change 100644 => 100755 graphics/items/icon_palettes/bluk_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/bright_powder.pal create mode 100755 graphics/items/icon_palettes/burn_drive.pal mode change 100644 => 100755 graphics/items/icon_palettes/burn_heal.pal mode change 100644 => 100755 graphics/items/icon_palettes/calcium.pal mode change 100644 => 100755 graphics/items/icon_palettes/carbos.pal mode change 100644 => 100755 graphics/items/icon_palettes/card_key.pal mode change 100644 => 100755 graphics/items/icon_palettes/charcoal.pal mode change 100644 => 100755 graphics/items/icon_palettes/cheri_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/chesto_berry.pal create mode 100755 graphics/items/icon_palettes/chill_drive.pal mode change 100644 => 100755 graphics/items/icon_palettes/choice_band.pal create mode 100755 graphics/items/icon_palettes/choice_scarf.pal create mode 100755 graphics/items/icon_palettes/choice_specs.pal mode change 100644 => 100755 graphics/items/icon_palettes/cleanse_tag.pal mode change 100644 => 100755 graphics/items/icon_palettes/coin_case.pal mode change 100644 => 100755 graphics/items/icon_palettes/contest_pass.pal mode change 100644 => 100755 graphics/items/icon_palettes/cornn_berry.pal create mode 100755 graphics/items/icon_palettes/damp_rock.pal mode change 100644 => 100755 graphics/items/icon_palettes/dark_tm_hm.pal mode change 100644 => 100755 graphics/items/icon_palettes/deep_sea_scale.pal mode change 100644 => 100755 graphics/items/icon_palettes/deep_sea_tooth.pal create mode 100755 graphics/items/icon_palettes/destiny_knot.pal mode change 100644 => 100755 graphics/items/icon_palettes/devon_goods.pal mode change 100644 => 100755 graphics/items/icon_palettes/devon_scope.pal mode change 100644 => 100755 graphics/items/icon_palettes/dire_hit.pal mode change 100644 => 100755 graphics/items/icon_palettes/dive_ball.pal create mode 100755 graphics/items/icon_palettes/douse_drive.pal create mode 100755 graphics/items/icon_palettes/draco_plate.pal mode change 100644 => 100755 graphics/items/icon_palettes/dragon_fang.pal mode change 100644 => 100755 graphics/items/icon_palettes/dragon_scale.pal mode change 100644 => 100755 graphics/items/icon_palettes/dragon_tm_hm.pal create mode 100755 graphics/items/icon_palettes/dread_plate.pal mode change 100644 => 100755 graphics/items/icon_palettes/dream_mail.pal mode change 100644 => 100755 graphics/items/icon_palettes/durin_berry.pal create mode 100755 graphics/items/icon_palettes/earth_plate.pal mode change 100644 => 100755 graphics/items/icon_palettes/electric_tm_hm.pal mode change 100644 => 100755 graphics/items/icon_palettes/elixir.pal mode change 100644 => 100755 graphics/items/icon_palettes/energy_powder.pal mode change 100644 => 100755 graphics/items/icon_palettes/energy_root.pal mode change 100644 => 100755 graphics/items/icon_palettes/enigma_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/eon_ticket.pal mode change 100644 => 100755 graphics/items/icon_palettes/escape_rope.pal mode change 100644 => 100755 graphics/items/icon_palettes/ether.pal mode change 100644 => 100755 graphics/items/icon_palettes/everstone.pal create mode 100755 graphics/items/icon_palettes/eviolite.pal mode change 100644 => 100755 graphics/items/icon_palettes/exp_share.pal create mode 100755 graphics/items/icon_palettes/expert_belt.pal mode change 100644 => 100755 graphics/items/icon_palettes/fab_mail.pal mode change 100644 => 100755 graphics/items/icon_palettes/fame_checker.pal mode change 100644 => 100755 graphics/items/icon_palettes/fighting_tm_hm.pal mode change 100644 => 100755 graphics/items/icon_palettes/figy_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/fire_stone.pal mode change 100644 => 100755 graphics/items/icon_palettes/fire_tm_hm.pal create mode 100755 graphics/items/icon_palettes/fist_plate.pal create mode 100755 graphics/items/icon_palettes/flame_orb.pal create mode 100755 graphics/items/icon_palettes/flame_plate.pal create mode 100755 graphics/items/icon_palettes/float_stone.pal mode change 100644 => 100755 graphics/items/icon_palettes/fluffy_tail.pal mode change 100644 => 100755 graphics/items/icon_palettes/flying_tm_hm.pal mode change 100644 => 100755 graphics/items/icon_palettes/focus_band.pal create mode 100755 graphics/items/icon_palettes/focus_sash.pal mode change 100644 => 100755 graphics/items/icon_palettes/fresh_water.pal mode change 100644 => 100755 graphics/items/icon_palettes/full_heal.pal mode change 100644 => 100755 graphics/items/icon_palettes/full_restore.pal mode change 100644 => 100755 graphics/items/icon_palettes/ganlon_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/ghost_tm_hm.pal mode change 100644 => 100755 graphics/items/icon_palettes/glitter_mail.pal mode change 100644 => 100755 graphics/items/icon_palettes/go_goggles.pal mode change 100644 => 100755 graphics/items/icon_palettes/gold_teeth.pal mode change 100644 => 100755 graphics/items/icon_palettes/good_rod.pal mode change 100644 => 100755 graphics/items/icon_palettes/grass_tm_hm.pal mode change 100644 => 100755 graphics/items/icon_palettes/great_ball.pal mode change 100644 => 100755 graphics/items/icon_palettes/green_scarf.pal mode change 100644 => 100755 graphics/items/icon_palettes/green_shard.pal mode change 100644 => 100755 graphics/items/icon_palettes/grepa_berry.pal create mode 100755 graphics/items/icon_palettes/grip_claw.pal create mode 100755 graphics/items/icon_palettes/griseous_orb.pal mode change 100644 => 100755 graphics/items/icon_palettes/ground_tm_hm.pal mode change 100644 => 100755 graphics/items/icon_palettes/guard_spec.pal mode change 100644 => 100755 graphics/items/icon_palettes/harbor_mail.pal mode change 100644 => 100755 graphics/items/icon_palettes/hard_stone.pal mode change 100644 => 100755 graphics/items/icon_palettes/heal_powder.pal mode change 100644 => 100755 graphics/items/icon_palettes/heart_scale.pal create mode 100755 graphics/items/icon_palettes/heat_rock.pal mode change 100644 => 100755 graphics/items/icon_palettes/hoenn_fossil.pal mode change 100644 => 100755 graphics/items/icon_palettes/hondew_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/hp_up.pal mode change 100644 => 100755 graphics/items/icon_palettes/hyper_potion.pal mode change 100644 => 100755 graphics/items/icon_palettes/iapapa_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/ice_heal.pal mode change 100644 => 100755 graphics/items/icon_palettes/ice_tm_hm.pal create mode 100755 graphics/items/icon_palettes/icicle_plate.pal create mode 100755 graphics/items/icon_palettes/icy_rock.pal create mode 100755 graphics/items/icon_palettes/insect_plate.pal mode change 100644 => 100755 graphics/items/icon_palettes/iron.pal create mode 100755 graphics/items/icon_palettes/iron_ball.pal create mode 100755 graphics/items/icon_palettes/iron_plate.pal mode change 100644 => 100755 graphics/items/icon_palettes/itemfinder.pal mode change 100644 => 100755 graphics/items/icon_palettes/kanto_fossil.pal mode change 100644 => 100755 graphics/items/icon_palettes/kelpsy_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/key.pal mode change 100644 => 100755 graphics/items/icon_palettes/kings_rock.pal create mode 100755 graphics/items/icon_palettes/lagging_tail.pal mode change 100644 => 100755 graphics/items/icon_palettes/lansat_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/lava_cookie_and_letter.pal mode change 100644 => 100755 graphics/items/icon_palettes/lax_incense.pal mode change 100644 => 100755 graphics/items/icon_palettes/leaf_stone.pal mode change 100644 => 100755 graphics/items/icon_palettes/leftovers.pal mode change 100644 => 100755 graphics/items/icon_palettes/lemonade.pal mode change 100644 => 100755 graphics/items/icon_palettes/leppa_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/liechi_berry.pal create mode 100755 graphics/items/icon_palettes/life_orb.pal mode change 100644 => 100755 graphics/items/icon_palettes/light_ball.pal create mode 100755 graphics/items/icon_palettes/light_clay.pal mode change 100644 => 100755 graphics/items/icon_palettes/lucky_egg.pal mode change 100644 => 100755 graphics/items/icon_palettes/lucky_punch.pal mode change 100644 => 100755 graphics/items/icon_palettes/lum_berry.pal create mode 100755 graphics/items/icon_palettes/lustrous_orb.pal mode change 100644 => 100755 graphics/items/icon_palettes/luxury_ball.pal mode change 100644 => 100755 graphics/items/icon_palettes/mach_bike.pal mode change 100644 => 100755 graphics/items/icon_palettes/macho_brace.pal mode change 100644 => 100755 graphics/items/icon_palettes/magma_emblem.pal mode change 100644 => 100755 graphics/items/icon_palettes/magnet.pal mode change 100644 => 100755 graphics/items/icon_palettes/mago_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/magost_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/master_ball.pal mode change 100644 => 100755 graphics/items/icon_palettes/max_elixir.pal mode change 100644 => 100755 graphics/items/icon_palettes/max_ether.pal mode change 100644 => 100755 graphics/items/icon_palettes/max_potion.pal mode change 100644 => 100755 graphics/items/icon_palettes/max_repel.pal create mode 100755 graphics/items/icon_palettes/meadow_plate.pal mode change 100644 => 100755 graphics/items/icon_palettes/mech_mail.pal mode change 100644 => 100755 graphics/items/icon_palettes/mental_herb.pal mode change 100644 => 100755 graphics/items/icon_palettes/metal_coat.pal mode change 100644 => 100755 graphics/items/icon_palettes/metal_powder.pal mode change 100644 => 100755 graphics/items/icon_palettes/meteorite.pal create mode 100755 graphics/items/icon_palettes/metronome.pal create mode 100755 graphics/items/icon_palettes/mind_plate.pal mode change 100644 => 100755 graphics/items/icon_palettes/miracle_seed.pal mode change 100644 => 100755 graphics/items/icon_palettes/moomoo_milk.pal mode change 100644 => 100755 graphics/items/icon_palettes/moon_stone.pal create mode 100755 graphics/items/icon_palettes/muscle_band.pal mode change 100644 => 100755 graphics/items/icon_palettes/mushroom.pal mode change 100644 => 100755 graphics/items/icon_palettes/mystic_ticket.pal mode change 100644 => 100755 graphics/items/icon_palettes/mystic_water.pal mode change 100644 => 100755 graphics/items/icon_palettes/nanab_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/nest_ball.pal mode change 100644 => 100755 graphics/items/icon_palettes/net_ball.pal mode change 100644 => 100755 graphics/items/icon_palettes/never_melt_ice.pal mode change 100644 => 100755 graphics/items/icon_palettes/nomel_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/normal_tm_hm.pal mode change 100644 => 100755 graphics/items/icon_palettes/nugget.pal mode change 100644 => 100755 graphics/items/icon_palettes/oaks_parcel.pal mode change 100644 => 100755 graphics/items/icon_palettes/old_amber.pal mode change 100644 => 100755 graphics/items/icon_palettes/old_key.pal mode change 100644 => 100755 graphics/items/icon_palettes/old_rod.pal mode change 100644 => 100755 graphics/items/icon_palettes/old_sea_map.pal mode change 100644 => 100755 graphics/items/icon_palettes/oran_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/orange_mail.pal mode change 100644 => 100755 graphics/items/icon_palettes/pamtre_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/paralyze_heal.pal mode change 100644 => 100755 graphics/items/icon_palettes/pearl.pal mode change 100644 => 100755 graphics/items/icon_palettes/pecha_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/persim_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/petaya_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/pinap_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/pink_scarf.pal mode change 100644 => 100755 graphics/items/icon_palettes/poison_barb.pal mode change 100644 => 100755 graphics/items/icon_palettes/poison_tm_hm.pal mode change 100644 => 100755 graphics/items/icon_palettes/poke_ball.pal mode change 100644 => 100755 graphics/items/icon_palettes/poke_doll.pal mode change 100644 => 100755 graphics/items/icon_palettes/poke_flute.pal mode change 100644 => 100755 graphics/items/icon_palettes/pokeblock_case.pal mode change 100644 => 100755 graphics/items/icon_palettes/pomeg_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/potion.pal mode change 100644 => 100755 graphics/items/icon_palettes/powder_jar.pal create mode 100755 graphics/items/icon_palettes/power_herb.pal mode change 100644 => 100755 graphics/items/icon_palettes/pp_max.pal mode change 100644 => 100755 graphics/items/icon_palettes/pp_up.pal mode change 100644 => 100755 graphics/items/icon_palettes/protein.pal mode change 100644 => 100755 graphics/items/icon_palettes/psychic_tm_hm.pal mode change 100644 => 100755 graphics/items/icon_palettes/qualot_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/question_mark.pal mode change 100644 => 100755 graphics/items/icon_palettes/quick_claw.pal create mode 100755 graphics/items/icon_palettes/quick_powder.pal mode change 100644 => 100755 graphics/items/icon_palettes/rabuta_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/rainbow_pass.pal mode change 100644 => 100755 graphics/items/icon_palettes/rare_candy.pal mode change 100644 => 100755 graphics/items/icon_palettes/rawst_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/razz_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/red_flute.pal mode change 100644 => 100755 graphics/items/icon_palettes/red_orb.pal mode change 100644 => 100755 graphics/items/icon_palettes/red_scarf.pal mode change 100644 => 100755 graphics/items/icon_palettes/red_shard.pal mode change 100644 => 100755 graphics/items/icon_palettes/repeat_ball.pal mode change 100644 => 100755 graphics/items/icon_palettes/repel.pal mode change 100644 => 100755 graphics/items/icon_palettes/retro_mail.pal mode change 100644 => 100755 graphics/items/icon_palettes/return_to_field_arrow.pal mode change 100644 => 100755 graphics/items/icon_palettes/revival_herb.pal mode change 100644 => 100755 graphics/items/icon_palettes/revive.pal mode change 100644 => 100755 graphics/items/icon_palettes/rock_tm_hm.pal mode change 100644 => 100755 graphics/items/icon_palettes/ruby.pal mode change 100644 => 100755 graphics/items/icon_palettes/sacred_ash.pal mode change 100644 => 100755 graphics/items/icon_palettes/safari_ball.pal mode change 100644 => 100755 graphics/items/icon_palettes/salac_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/sapphire.pal mode change 100644 => 100755 graphics/items/icon_palettes/scanner.pal mode change 100644 => 100755 graphics/items/icon_palettes/scope_lens.pal mode change 100644 => 100755 graphics/items/icon_palettes/sea_incense.pal mode change 100644 => 100755 graphics/items/icon_palettes/secret_key.pal mode change 100644 => 100755 graphics/items/icon_palettes/shadow_mail.pal mode change 100644 => 100755 graphics/items/icon_palettes/sharp_beak.pal create mode 100755 graphics/items/icon_palettes/shed_shell.pal mode change 100644 => 100755 graphics/items/icon_palettes/shell.pal mode change 100644 => 100755 graphics/items/icon_palettes/shoal_salt.pal create mode 100755 graphics/items/icon_palettes/shock_drive.pal mode change 100644 => 100755 graphics/items/icon_palettes/silk_scarf.pal mode change 100644 => 100755 graphics/items/icon_palettes/silph_scope.pal mode change 100644 => 100755 graphics/items/icon_palettes/silver_powder.pal mode change 100644 => 100755 graphics/items/icon_palettes/sitrus_berry.pal create mode 100755 graphics/items/icon_palettes/sky_plate.pal mode change 100644 => 100755 graphics/items/icon_palettes/smoke_ball.pal create mode 100755 graphics/items/icon_palettes/smooth_rock.pal mode change 100644 => 100755 graphics/items/icon_palettes/soda_pop.pal mode change 100644 => 100755 graphics/items/icon_palettes/soft_sand.pal mode change 100644 => 100755 graphics/items/icon_palettes/soot_sack.pal mode change 100644 => 100755 graphics/items/icon_palettes/soothe_bell.pal mode change 100644 => 100755 graphics/items/icon_palettes/soul_dew.pal mode change 100644 => 100755 graphics/items/icon_palettes/spell_tag.pal mode change 100644 => 100755 graphics/items/icon_palettes/spelon_berry.pal create mode 100755 graphics/items/icon_palettes/splash_plate.pal create mode 100755 graphics/items/icon_palettes/spooky_plate.pal mode change 100644 => 100755 graphics/items/icon_palettes/ss_ticket.pal mode change 100644 => 100755 graphics/items/icon_palettes/star.pal mode change 100644 => 100755 graphics/items/icon_palettes/starf_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/steel_tm_hm.pal mode change 100644 => 100755 graphics/items/icon_palettes/stick.pal create mode 100755 graphics/items/icon_palettes/sticky_barb.pal create mode 100755 graphics/items/icon_palettes/stone_plate.pal mode change 100644 => 100755 graphics/items/icon_palettes/sun_stone.pal mode change 100644 => 100755 graphics/items/icon_palettes/super_potion.pal mode change 100644 => 100755 graphics/items/icon_palettes/super_repel.pal mode change 100644 => 100755 graphics/items/icon_palettes/super_rod.pal mode change 100644 => 100755 graphics/items/icon_palettes/tamato_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/tea.pal mode change 100644 => 100755 graphics/items/icon_palettes/teachy_tv.pal mode change 100644 => 100755 graphics/items/icon_palettes/thick_club.pal mode change 100644 => 100755 graphics/items/icon_palettes/thunder_stone.pal mode change 100644 => 100755 graphics/items/icon_palettes/tm_case.pal mode change 100644 => 100755 graphics/items/icon_palettes/town_map.pal create mode 100755 graphics/items/icon_palettes/toxic_orb.pal create mode 100755 graphics/items/icon_palettes/toxic_plate.pal mode change 100644 => 100755 graphics/items/icon_palettes/tri_pass.pal mode change 100644 => 100755 graphics/items/icon_palettes/tropic_mail.pal mode change 100644 => 100755 graphics/items/icon_palettes/twisted_spoon.pal mode change 100644 => 100755 graphics/items/icon_palettes/ultra_ball.pal mode change 100644 => 100755 graphics/items/icon_palettes/up_grade.pal mode change 100644 => 100755 graphics/items/icon_palettes/vs_seeker.pal mode change 100644 => 100755 graphics/items/icon_palettes/wailmer_pail.pal mode change 100644 => 100755 graphics/items/icon_palettes/water_stone.pal mode change 100644 => 100755 graphics/items/icon_palettes/water_tm_hm.pal mode change 100644 => 100755 graphics/items/icon_palettes/watmel_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/wave_mail.pal mode change 100644 => 100755 graphics/items/icon_palettes/wepear_berry.pal mode change 100644 => 100755 graphics/items/icon_palettes/white_flute.pal mode change 100644 => 100755 graphics/items/icon_palettes/white_herb.pal create mode 100755 graphics/items/icon_palettes/wide_lens.pal mode change 100644 => 100755 graphics/items/icon_palettes/wiki_berry.pal create mode 100755 graphics/items/icon_palettes/wise_glasses.pal mode change 100644 => 100755 graphics/items/icon_palettes/wood_mail.pal mode change 100644 => 100755 graphics/items/icon_palettes/x_accuracy.pal mode change 100644 => 100755 graphics/items/icon_palettes/x_attack.pal mode change 100644 => 100755 graphics/items/icon_palettes/x_defend.pal mode change 100644 => 100755 graphics/items/icon_palettes/x_special.pal mode change 100644 => 100755 graphics/items/icon_palettes/x_speed.pal mode change 100644 => 100755 graphics/items/icon_palettes/yellow_flute.pal mode change 100644 => 100755 graphics/items/icon_palettes/yellow_scarf.pal mode change 100644 => 100755 graphics/items/icon_palettes/yellow_shard.pal create mode 100755 graphics/items/icon_palettes/zap_plate.pal mode change 100644 => 100755 graphics/items/icon_palettes/zinc.pal create mode 100755 graphics/items/icon_palettes/zoom_lens.pal mode change 100644 => 100755 graphics/items/icons/acro_bike.png create mode 100755 graphics/items/icons/adamant_orb.PNG mode change 100644 => 100755 graphics/items/icons/aguav_berry.png mode change 100644 => 100755 graphics/items/icons/amulet_coin.png mode change 100644 => 100755 graphics/items/icons/antidote.png mode change 100644 => 100755 graphics/items/icons/apicot_berry.png mode change 100644 => 100755 graphics/items/icons/aspear_berry.png mode change 100644 => 100755 graphics/items/icons/aurora_ticket.png mode change 100644 => 100755 graphics/items/icons/basement_key.png mode change 100644 => 100755 graphics/items/icons/battle_stat_item.png mode change 100644 => 100755 graphics/items/icons/bead_mail.png mode change 100644 => 100755 graphics/items/icons/belue_berry.png mode change 100644 => 100755 graphics/items/icons/berry_juice.png mode change 100644 => 100755 graphics/items/icons/berry_pouch.png mode change 100644 => 100755 graphics/items/icons/bicycle.png mode change 100644 => 100755 graphics/items/icons/big_mushroom.png mode change 100644 => 100755 graphics/items/icons/big_pearl.png create mode 100755 graphics/items/icons/big_root.PNG mode change 100644 => 100755 graphics/items/icons/bike_voucher.png create mode 100755 graphics/items/icons/binding_band.PNG mode change 100644 => 100755 graphics/items/icons/black_belt.png mode change 100644 => 100755 graphics/items/icons/black_glasses.png create mode 100755 graphics/items/icons/black_sludge.PNG mode change 100644 => 100755 graphics/items/icons/bluk_berry.png mode change 100644 => 100755 graphics/items/icons/bright_powder.png create mode 100755 graphics/items/icons/burn_drive.PNG mode change 100644 => 100755 graphics/items/icons/card_key.png mode change 100644 => 100755 graphics/items/icons/charcoal.png mode change 100644 => 100755 graphics/items/icons/cheri_berry.png mode change 100644 => 100755 graphics/items/icons/chesto_berry.png create mode 100755 graphics/items/icons/chill_drive.PNG mode change 100644 => 100755 graphics/items/icons/choice_band.png create mode 100755 graphics/items/icons/choice_scarf.PNG create mode 100755 graphics/items/icons/choice_specs.PNG mode change 100644 => 100755 graphics/items/icons/claw_fossil.png mode change 100644 => 100755 graphics/items/icons/cleanse_tag.png mode change 100644 => 100755 graphics/items/icons/coin_case.png mode change 100644 => 100755 graphics/items/icons/contest_pass.png mode change 100644 => 100755 graphics/items/icons/cornn_berry.png create mode 100755 graphics/items/icons/damp_rock.PNG mode change 100644 => 100755 graphics/items/icons/deep_sea_scale.png mode change 100644 => 100755 graphics/items/icons/deep_sea_tooth.png create mode 100755 graphics/items/icons/destiny_knot.PNG mode change 100644 => 100755 graphics/items/icons/devon_goods.png mode change 100644 => 100755 graphics/items/icons/devon_scope.png mode change 100644 => 100755 graphics/items/icons/dive_ball.png mode change 100644 => 100755 graphics/items/icons/dome_fossil.png create mode 100755 graphics/items/icons/douse_drive.PNG create mode 100755 graphics/items/icons/draco_plate.PNG mode change 100644 => 100755 graphics/items/icons/dragon_fang.png mode change 100644 => 100755 graphics/items/icons/dragon_scale.png create mode 100755 graphics/items/icons/dread_plate.PNG mode change 100644 => 100755 graphics/items/icons/dream_mail.png mode change 100644 => 100755 graphics/items/icons/durin_berry.png create mode 100755 graphics/items/icons/earth_plate.PNG mode change 100644 => 100755 graphics/items/icons/energy_root.png mode change 100644 => 100755 graphics/items/icons/enigma_berry.png mode change 100644 => 100755 graphics/items/icons/eon_ticket.png mode change 100644 => 100755 graphics/items/icons/escape_rope.png mode change 100644 => 100755 graphics/items/icons/ether.png mode change 100644 => 100755 graphics/items/icons/everstone.png create mode 100755 graphics/items/icons/eviolite.PNG mode change 100644 => 100755 graphics/items/icons/exp_share.png create mode 100755 graphics/items/icons/expert_belt.PNG mode change 100644 => 100755 graphics/items/icons/fab_mail.png mode change 100644 => 100755 graphics/items/icons/fame_checker.png mode change 100644 => 100755 graphics/items/icons/figy_berry.png mode change 100644 => 100755 graphics/items/icons/fire_stone.png create mode 100755 graphics/items/icons/fist_plate.PNG create mode 100755 graphics/items/icons/flame_orb.png create mode 100755 graphics/items/icons/flame_plate.PNG create mode 100755 graphics/items/icons/float_stone.PNG mode change 100644 => 100755 graphics/items/icons/fluffy_tail.png mode change 100644 => 100755 graphics/items/icons/flute.png mode change 100644 => 100755 graphics/items/icons/focus_band.png create mode 100755 graphics/items/icons/focus_sash.PNG mode change 100644 => 100755 graphics/items/icons/fresh_water.png mode change 100644 => 100755 graphics/items/icons/full_heal.png mode change 100644 => 100755 graphics/items/icons/ganlon_berry.png mode change 100644 => 100755 graphics/items/icons/gem.png mode change 100644 => 100755 graphics/items/icons/glitter_mail.png mode change 100644 => 100755 graphics/items/icons/go_goggles.png mode change 100644 => 100755 graphics/items/icons/gold_teeth.png mode change 100644 => 100755 graphics/items/icons/good_rod.png mode change 100644 => 100755 graphics/items/icons/great_ball.png mode change 100644 => 100755 graphics/items/icons/grepa_berry.png create mode 100755 graphics/items/icons/grip_claw.PNG create mode 100755 graphics/items/icons/griseous_orb.PNG mode change 100644 => 100755 graphics/items/icons/harbor_mail.png mode change 100644 => 100755 graphics/items/icons/hard_stone.png mode change 100644 => 100755 graphics/items/icons/heart_scale.png create mode 100755 graphics/items/icons/heat_rock.PNG mode change 100644 => 100755 graphics/items/icons/helix_fossil.png mode change 100644 => 100755 graphics/items/icons/hm.png mode change 100644 => 100755 graphics/items/icons/hondew_berry.png mode change 100644 => 100755 graphics/items/icons/hp_up.png mode change 100644 => 100755 graphics/items/icons/iapapa_berry.png create mode 100755 graphics/items/icons/icicle_plate.PNG create mode 100755 graphics/items/icons/icy_rock.PNG mode change 100644 => 100755 graphics/items/icons/in_battle_herb.png create mode 100755 graphics/items/icons/insect_plate.PNG create mode 100755 graphics/items/icons/iron_ball.PNG create mode 100755 graphics/items/icons/iron_plate.PNG mode change 100644 => 100755 graphics/items/icons/itemfinder.png mode change 100644 => 100755 graphics/items/icons/kelpsy_berry.png mode change 100644 => 100755 graphics/items/icons/kings_rock.png create mode 100755 graphics/items/icons/lagging_tail.PNG mode change 100644 => 100755 graphics/items/icons/lansat_berry.png mode change 100644 => 100755 graphics/items/icons/large_potion.png mode change 100644 => 100755 graphics/items/icons/lava_cookie.png mode change 100644 => 100755 graphics/items/icons/lax_incense.png mode change 100644 => 100755 graphics/items/icons/leaf_stone.png mode change 100644 => 100755 graphics/items/icons/leftovers.png mode change 100644 => 100755 graphics/items/icons/lemonade.png mode change 100644 => 100755 graphics/items/icons/leppa_berry.png mode change 100644 => 100755 graphics/items/icons/letter.png mode change 100644 => 100755 graphics/items/icons/liechi_berry.png create mode 100755 graphics/items/icons/life_orb.PNG mode change 100644 => 100755 graphics/items/icons/lift_key.png mode change 100644 => 100755 graphics/items/icons/light_ball.png create mode 100755 graphics/items/icons/light_clay.PNG mode change 100644 => 100755 graphics/items/icons/lucky_egg.png mode change 100644 => 100755 graphics/items/icons/lucky_punch.png mode change 100644 => 100755 graphics/items/icons/lum_berry.png create mode 100755 graphics/items/icons/lustrous_orb.PNG mode change 100644 => 100755 graphics/items/icons/luxury_ball.png mode change 100644 => 100755 graphics/items/icons/mach_bike.png mode change 100644 => 100755 graphics/items/icons/macho_brace.png mode change 100644 => 100755 graphics/items/icons/magma_emblem.png mode change 100644 => 100755 graphics/items/icons/magnet.png mode change 100644 => 100755 graphics/items/icons/mago_berry.png mode change 100644 => 100755 graphics/items/icons/magost_berry.png mode change 100644 => 100755 graphics/items/icons/master_ball.png mode change 100644 => 100755 graphics/items/icons/max_revive.png create mode 100755 graphics/items/icons/meadow_plate.PNG mode change 100644 => 100755 graphics/items/icons/mech_mail.png mode change 100644 => 100755 graphics/items/icons/metal_coat.png mode change 100644 => 100755 graphics/items/icons/metal_powder.png mode change 100644 => 100755 graphics/items/icons/meteorite.png create mode 100755 graphics/items/icons/metronome.PNG create mode 100755 graphics/items/icons/mind_plate.PNG mode change 100644 => 100755 graphics/items/icons/miracle_seed.png mode change 100644 => 100755 graphics/items/icons/moomoo_milk.png mode change 100644 => 100755 graphics/items/icons/moon_stone.png create mode 100755 graphics/items/icons/muscle_band.PNG mode change 100644 => 100755 graphics/items/icons/mystic_ticket.png mode change 100644 => 100755 graphics/items/icons/mystic_water.png mode change 100644 => 100755 graphics/items/icons/nanab_berry.png mode change 100644 => 100755 graphics/items/icons/nest_ball.png mode change 100644 => 100755 graphics/items/icons/net_ball.png mode change 100644 => 100755 graphics/items/icons/never_melt_ice.png mode change 100644 => 100755 graphics/items/icons/nomel_berry.png mode change 100644 => 100755 graphics/items/icons/nugget.png mode change 100644 => 100755 graphics/items/icons/oaks_parcel.png mode change 100644 => 100755 graphics/items/icons/old_amber.png mode change 100644 => 100755 graphics/items/icons/old_rod.png mode change 100644 => 100755 graphics/items/icons/old_sea_map.png mode change 100644 => 100755 graphics/items/icons/oran_berry.png mode change 100644 => 100755 graphics/items/icons/orange_mail.png mode change 100644 => 100755 graphics/items/icons/orb.png mode change 100644 => 100755 graphics/items/icons/pamtre_berry.png mode change 100644 => 100755 graphics/items/icons/pearl.png mode change 100644 => 100755 graphics/items/icons/pecha_berry.png mode change 100644 => 100755 graphics/items/icons/persim_berry.png mode change 100644 => 100755 graphics/items/icons/petaya_berry.png mode change 100644 => 100755 graphics/items/icons/pinap_berry.png mode change 100644 => 100755 graphics/items/icons/poison_barb.png mode change 100644 => 100755 graphics/items/icons/poke_ball.png mode change 100644 => 100755 graphics/items/icons/poke_doll.png mode change 100644 => 100755 graphics/items/icons/poke_flute.png mode change 100644 => 100755 graphics/items/icons/pokeblock_case.png mode change 100644 => 100755 graphics/items/icons/pomeg_berry.png mode change 100644 => 100755 graphics/items/icons/potion.png mode change 100644 => 100755 graphics/items/icons/powder.png mode change 100644 => 100755 graphics/items/icons/powder_jar.png create mode 100755 graphics/items/icons/power_herb.PNG mode change 100644 => 100755 graphics/items/icons/pp_max.png mode change 100644 => 100755 graphics/items/icons/pp_up.png mode change 100644 => 100755 graphics/items/icons/premier_ball.png mode change 100644 => 100755 graphics/items/icons/qualot_berry.png mode change 100644 => 100755 graphics/items/icons/question_mark.png mode change 100644 => 100755 graphics/items/icons/quick_claw.png create mode 100755 graphics/items/icons/quick_powder.PNG mode change 100644 => 100755 graphics/items/icons/rabuta_berry.png mode change 100644 => 100755 graphics/items/icons/rainbow_pass.png mode change 100644 => 100755 graphics/items/icons/rare_candy.png mode change 100644 => 100755 graphics/items/icons/rawst_berry.png mode change 100644 => 100755 graphics/items/icons/razz_berry.png mode change 100644 => 100755 graphics/items/icons/repeat_ball.png mode change 100644 => 100755 graphics/items/icons/repel.png mode change 100644 => 100755 graphics/items/icons/retro_mail.png mode change 100644 => 100755 graphics/items/icons/return_to_field_arrow.png mode change 100644 => 100755 graphics/items/icons/revival_herb.png mode change 100644 => 100755 graphics/items/icons/revive.png mode change 100644 => 100755 graphics/items/icons/room1_key.png mode change 100644 => 100755 graphics/items/icons/room2_key.png mode change 100644 => 100755 graphics/items/icons/room4_key.png mode change 100644 => 100755 graphics/items/icons/room6_key.png mode change 100644 => 100755 graphics/items/icons/root_fossil.png mode change 100644 => 100755 graphics/items/icons/sacred_ash.png mode change 100644 => 100755 graphics/items/icons/safari_ball.png mode change 100644 => 100755 graphics/items/icons/salac_berry.png mode change 100644 => 100755 graphics/items/icons/scanner.png mode change 100644 => 100755 graphics/items/icons/scarf.png mode change 100644 => 100755 graphics/items/icons/scope_lens.png mode change 100644 => 100755 graphics/items/icons/sea_incense.png mode change 100644 => 100755 graphics/items/icons/secret_key.png mode change 100644 => 100755 graphics/items/icons/shadow_mail.png mode change 100644 => 100755 graphics/items/icons/shard.png mode change 100644 => 100755 graphics/items/icons/sharp_beak.png create mode 100755 graphics/items/icons/shed_shell.PNG mode change 100644 => 100755 graphics/items/icons/shell_bell.png mode change 100644 => 100755 graphics/items/icons/shoal_shell.png create mode 100755 graphics/items/icons/shock_drive.PNG mode change 100644 => 100755 graphics/items/icons/silk_scarf.png mode change 100644 => 100755 graphics/items/icons/silph_scope.png mode change 100644 => 100755 graphics/items/icons/silver_powder.png mode change 100644 => 100755 graphics/items/icons/sitrus_berry.png create mode 100755 graphics/items/icons/sky_plate.PNG mode change 100644 => 100755 graphics/items/icons/smoke_ball.png create mode 100755 graphics/items/icons/smooth_rock.PNG mode change 100644 => 100755 graphics/items/icons/soda_pop.png mode change 100644 => 100755 graphics/items/icons/soft_sand.png mode change 100644 => 100755 graphics/items/icons/soot_sack.png mode change 100644 => 100755 graphics/items/icons/soothe_bell.png mode change 100644 => 100755 graphics/items/icons/soul_dew.png mode change 100644 => 100755 graphics/items/icons/spell_tag.png mode change 100644 => 100755 graphics/items/icons/spelon_berry.png create mode 100755 graphics/items/icons/splash_plate.PNG create mode 100755 graphics/items/icons/spooky_plate.PNG mode change 100644 => 100755 graphics/items/icons/ss_ticket.png mode change 100644 => 100755 graphics/items/icons/star_piece.png mode change 100644 => 100755 graphics/items/icons/stardust.png mode change 100644 => 100755 graphics/items/icons/starf_berry.png mode change 100644 => 100755 graphics/items/icons/status_heal.png mode change 100644 => 100755 graphics/items/icons/stick.png create mode 100755 graphics/items/icons/sticky_barb.PNG create mode 100755 graphics/items/icons/stone_plate.PNG mode change 100644 => 100755 graphics/items/icons/storage_key.png mode change 100644 => 100755 graphics/items/icons/sun_stone.png mode change 100644 => 100755 graphics/items/icons/super_rod.png mode change 100644 => 100755 graphics/items/icons/tamato_berry.png mode change 100644 => 100755 graphics/items/icons/tea.png mode change 100644 => 100755 graphics/items/icons/teachy_tv.png mode change 100644 => 100755 graphics/items/icons/thick_club.png mode change 100644 => 100755 graphics/items/icons/thunder_stone.png mode change 100644 => 100755 graphics/items/icons/timer_ball.png mode change 100644 => 100755 graphics/items/icons/tiny_mushroom.png mode change 100644 => 100755 graphics/items/icons/tm.png mode change 100644 => 100755 graphics/items/icons/tm_case.png mode change 100644 => 100755 graphics/items/icons/town_map.png create mode 100755 graphics/items/icons/toxic_orb.PNG create mode 100755 graphics/items/icons/toxic_plate.PNG mode change 100644 => 100755 graphics/items/icons/tri_pass.png mode change 100644 => 100755 graphics/items/icons/tropic_mail.png mode change 100644 => 100755 graphics/items/icons/twisted_spoon.png mode change 100644 => 100755 graphics/items/icons/ultra_ball.png mode change 100644 => 100755 graphics/items/icons/up_grade.png mode change 100644 => 100755 graphics/items/icons/vitamin.png mode change 100644 => 100755 graphics/items/icons/vs_seeker.png mode change 100644 => 100755 graphics/items/icons/wailmer_pail.png mode change 100644 => 100755 graphics/items/icons/water_stone.png mode change 100644 => 100755 graphics/items/icons/watmel_berry.png mode change 100644 => 100755 graphics/items/icons/wave_mail.png mode change 100644 => 100755 graphics/items/icons/wepear_berry.png create mode 100755 graphics/items/icons/wide_lens.PNG mode change 100644 => 100755 graphics/items/icons/wiki_berry.png create mode 100755 graphics/items/icons/wise_glasses.PNG mode change 100644 => 100755 graphics/items/icons/wood_mail.png create mode 100755 graphics/items/icons/zap_plate.PNG create mode 100755 graphics/items/icons/zoom_lens.PNG 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/adamant_orb.pal b/graphics/items/icon_palettes/adamant_orb.pal new file mode 100755 index 0000000000..d5cb6a7ceb --- /dev/null +++ b/graphics/items/icon_palettes/adamant_orb.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +93 93 93 +39 39 39 +247 247 247 +177 203 247 +220 247 247 +194 229 247 +159 194 247 +151 177 220 +117 159 212 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 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/big_root.pal b/graphics/items/icon_palettes/big_root.pal new file mode 100755 index 0000000000..a93aa2ed77 --- /dev/null +++ b/graphics/items/icon_palettes/big_root.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +39 39 39 +126 77 11 +168 117 46 +220 194 117 +203 151 77 +247 220 151 +0 0 0 +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/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/binding_band.pal b/graphics/items/icon_palettes/binding_band.pal new file mode 100755 index 0000000000..ed678f3ef9 --- /dev/null +++ b/graphics/items/icon_palettes/binding_band.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +152 96 32 +184 128 40 +200 152 80 +0 0 0 +0 0 0 +0 0 0 +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/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_sludge.pal b/graphics/items/icon_palettes/black_sludge.pal new file mode 100755 index 0000000000..0e8504e0ce --- /dev/null +++ b/graphics/items/icon_palettes/black_sludge.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +39 39 39 +101 101 126 +126 126 159 +142 151 168 +61 61 77 +0 0 0 +0 0 0 +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/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_drive.pal b/graphics/items/icon_palettes/burn_drive.pal new file mode 100755 index 0000000000..316e9e718d --- /dev/null +++ b/graphics/items/icon_palettes/burn_drive.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +120 72 64 +248 152 136 +208 40 16 +216 88 64 +224 88 80 +0 0 0 +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/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/chill_drive.pal b/graphics/items/icon_palettes/chill_drive.pal new file mode 100755 index 0000000000..d429ee0036 --- /dev/null +++ b/graphics/items/icon_palettes/chill_drive.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +32 136 144 +208 248 248 +8 184 200 +88 200 224 +96 224 248 +0 0 0 +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/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/choice_scarf.pal b/graphics/items/icon_palettes/choice_scarf.pal new file mode 100755 index 0000000000..19561700fb --- /dev/null +++ b/graphics/items/icon_palettes/choice_scarf.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +54 101 93 +61 69 77 +61 142 212 +69 159 238 +109 185 229 +39 101 142 +117 177 247 +85 168 212 +142 212 247 +39 39 39 +194 229 247 +46 126 177 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/choice_specs.pal b/graphics/items/icon_palettes/choice_specs.pal new file mode 100755 index 0000000000..95c5ebab30 --- /dev/null +++ b/graphics/items/icon_palettes/choice_specs.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +117 117 117 +39 39 39 +229 185 54 +212 117 18 +247 238 203 +159 93 11 +247 247 77 +247 126 54 +238 185 77 +238 18 18 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 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/damp_rock.pal b/graphics/items/icon_palettes/damp_rock.pal new file mode 100755 index 0000000000..f50603adb5 --- /dev/null +++ b/graphics/items/icon_palettes/damp_rock.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +39 39 39 +220 238 229 +159 220 203 +77 177 185 +54 151 159 +69 93 93 +101 142 142 +46 126 134 +77 117 117 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 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/destiny_knot.pal b/graphics/items/icon_palettes/destiny_knot.pal new file mode 100755 index 0000000000..080e8a7f04 --- /dev/null +++ b/graphics/items/icon_palettes/destiny_knot.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +39 39 39 +194 69 69 +247 101 101 +247 85 85 +185 61 61 +134 54 54 +0 0 0 +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/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/douse_drive.pal b/graphics/items/icon_palettes/douse_drive.pal new file mode 100755 index 0000000000..a3e4209f44 --- /dev/null +++ b/graphics/items/icon_palettes/douse_drive.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +48 104 152 +120 208 248 +48 128 200 +56 168 240 +80 184 248 +0 0 0 +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/items/icon_palettes/draco_plate.pal b/graphics/items/icon_palettes/draco_plate.pal new file mode 100755 index 0000000000..27bfff4b28 --- /dev/null +++ b/graphics/items/icon_palettes/draco_plate.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +40 40 40 +173 63 63 +237 112 122 +246 138 138 +201 88 88 +130 56 63 +130 56 40 +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/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/dread_plate.pal b/graphics/items/icon_palettes/dread_plate.pal new file mode 100755 index 0000000000..dddd5e13a9 --- /dev/null +++ b/graphics/items/icon_palettes/dread_plate.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +40 40 40 +71 104 156 +130 165 201 +156 182 228 +104 138 173 +63 96 122 +56 71 88 +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/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/earth_plate.pal b/graphics/items/icon_palettes/earth_plate.pal new file mode 100755 index 0000000000..7b9e07525d --- /dev/null +++ b/graphics/items/icon_palettes/earth_plate.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +40 40 40 +156 104 71 +201 165 112 +209 182 138 +182 138 96 +138 96 63 +112 79 71 +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/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/eviolite.pal b/graphics/items/icon_palettes/eviolite.pal new file mode 100755 index 0000000000..28ba1a4fc3 --- /dev/null +++ b/graphics/items/icon_palettes/eviolite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +88 88 88 +248 200 240 +224 176 232 +48 48 48 +240 224 248 +200 144 224 +176 120 216 +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/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/expert_belt.pal b/graphics/items/icon_palettes/expert_belt.pal new file mode 100755 index 0000000000..cfb6c6a926 --- /dev/null +++ b/graphics/items/icon_palettes/expert_belt.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +39 39 39 +61 54 61 +117 109 117 +85 77 85 +0 0 0 +0 0 0 +0 0 0 +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/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/fist_plate.pal b/graphics/items/icon_palettes/fist_plate.pal new file mode 100755 index 0000000000..470a83c515 --- /dev/null +++ b/graphics/items/icon_palettes/fist_plate.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +40 40 40 +201 104 96 +246 156 138 +255 173 165 +228 130 96 +173 63 63 +130 56 40 +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/items/icon_palettes/flame_orb.pal b/graphics/items/icon_palettes/flame_orb.pal new file mode 100755 index 0000000000..f3ee47e397 --- /dev/null +++ b/graphics/items/icon_palettes/flame_orb.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +39 39 39 +247 126 126 +247 46 46 +238 185 177 +247 247 247 +247 126 85 +247 194 93 +247 247 93 +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/items/icon_palettes/flame_plate.pal b/graphics/items/icon_palettes/flame_plate.pal new file mode 100755 index 0000000000..8b68abf8f5 --- /dev/null +++ b/graphics/items/icon_palettes/flame_plate.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +39 39 39 +212 69 54 +247 117 117 +247 142 142 +247 77 77 +168 18 18 +151 5 5 +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/items/icon_palettes/float_stone.pal b/graphics/items/icon_palettes/float_stone.pal new file mode 100755 index 0000000000..420e4adc6f --- /dev/null +++ b/graphics/items/icon_palettes/float_stone.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +64 64 64 +224 224 208 +200 200 184 +168 168 152 +152 144 136 +136 128 112 +48 48 48 +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/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/focus_sash.pal b/graphics/items/icon_palettes/focus_sash.pal new file mode 100755 index 0000000000..08b56485e0 --- /dev/null +++ b/graphics/items/icon_palettes/focus_sash.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +39 39 39 +77 77 77 +212 101 61 +247 117 117 +247 151 69 +177 39 39 +229 69 69 +247 220 69 +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/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/grip_claw.pal b/graphics/items/icon_palettes/grip_claw.pal new file mode 100755 index 0000000000..ee28f992aa --- /dev/null +++ b/graphics/items/icon_palettes/grip_claw.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +39 39 39 +77 77 77 +247 247 247 +177 212 212 +117 142 142 +61 85 69 +69 101 85 +134 159 159 +101 134 109 +126 151 134 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/griseous_orb.pal b/graphics/items/icon_palettes/griseous_orb.pal new file mode 100755 index 0000000000..29b8f77048 --- /dev/null +++ b/graphics/items/icon_palettes/griseous_orb.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +49 49 49 +123 99 33 +255 255 255 +214 189 24 +255 247 206 +247 231 140 +222 198 57 +156 132 33 +206 181 41 +173 140 24 +189 156 41 +0 0 0 +0 0 0 +0 0 0 +0 0 0 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/heat_rock.pal b/graphics/items/icon_palettes/heat_rock.pal new file mode 100755 index 0000000000..c5b91232df --- /dev/null +++ b/graphics/items/icon_palettes/heat_rock.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +39 39 39 +247 203 212 +247 142 177 +212 85 117 +247 109 151 +142 109 93 +168 134 117 +220 194 185 +212 177 159 +185 61 85 +177 93 93 +101 77 69 +0 0 0 +0 0 0 +0 0 0 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/icicle_plate.pal b/graphics/items/icon_palettes/icicle_plate.pal new file mode 100755 index 0000000000..b1c45e523a --- /dev/null +++ b/graphics/items/icon_palettes/icicle_plate.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +40 40 40 +138 201 192 +209 246 255 +228 246 246 +173 237 237 +56 156 147 +63 122 104 +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/items/icon_palettes/icy_rock.pal b/graphics/items/icon_palettes/icy_rock.pal new file mode 100755 index 0000000000..27f6fbc234 --- /dev/null +++ b/graphics/items/icon_palettes/icy_rock.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +39 39 39 +185 247 247 +126 203 238 +229 247 247 +77 177 220 +54 142 185 +117 134 168 +185 126 93 +134 93 61 +151 101 69 +229 185 159 +142 159 194 +229 168 142 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/insect_plate.pal b/graphics/items/icon_palettes/insect_plate.pal new file mode 100755 index 0000000000..65f65b4bfb --- /dev/null +++ b/graphics/items/icon_palettes/insect_plate.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +40 40 40 +173 218 104 +246 255 147 +246 246 173 +201 246 112 +130 173 26 +96 138 18 +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/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/iron_ball.pal b/graphics/items/icon_palettes/iron_ball.pal new file mode 100755 index 0000000000..4e3ff78911 --- /dev/null +++ b/graphics/items/icon_palettes/iron_ball.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +39 39 39 +46 77 69 +69 109 101 +54 93 85 +77 126 126 +77 177 151 +177 238 220 +247 247 247 +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/items/icon_palettes/iron_plate.pal b/graphics/items/icon_palettes/iron_plate.pal new file mode 100755 index 0000000000..4885bc46cf --- /dev/null +++ b/graphics/items/icon_palettes/iron_plate.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +136 136 136 +208 208 208 +232 232 232 +176 176 176 +120 120 120 +104 104 104 +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/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/lagging_tail.pal b/graphics/items/icon_palettes/lagging_tail.pal new file mode 100755 index 0000000000..8e2a0b1d50 --- /dev/null +++ b/graphics/items/icon_palettes/lagging_tail.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +39 39 39 +229 229 229 +203 203 203 +142 142 142 +101 101 101 +61 61 61 +0 0 0 +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/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/life_orb.pal b/graphics/items/icon_palettes/life_orb.pal new file mode 100755 index 0000000000..e670c6c2d4 --- /dev/null +++ b/graphics/items/icon_palettes/life_orb.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +39 39 39 +212 168 238 +220 54 220 +238 177 238 +247 247 247 +185 39 194 +247 101 101 +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/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/light_clay.pal b/graphics/items/icon_palettes/light_clay.pal new file mode 100755 index 0000000000..02a4a90fbd --- /dev/null +++ b/graphics/items/icon_palettes/light_clay.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +39 39 39 +126 177 69 +177 220 109 +93 117 54 +212 238 185 +247 247 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 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/lustrous_orb.pal b/graphics/items/icon_palettes/lustrous_orb.pal new file mode 100755 index 0000000000..28df1d804f --- /dev/null +++ b/graphics/items/icon_palettes/lustrous_orb.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +69 69 69 +39 39 39 +117 212 220 +203 238 238 +247 247 247 +151 212 238 +168 203 229 +134 194 229 +168 194 229 +151 185 229 +220 185 238 +247 238 238 +247 212 229 +0 0 0 +0 0 0 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/meadow_plate.pal b/graphics/items/icon_palettes/meadow_plate.pal new file mode 100755 index 0000000000..2d97a86191 --- /dev/null +++ b/graphics/items/icon_palettes/meadow_plate.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +40 40 40 +56 192 63 +138 237 130 +173 255 147 +104 228 88 +63 138 63 +63 112 56 +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/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/metronome.pal b/graphics/items/icon_palettes/metronome.pal new file mode 100755 index 0000000000..0294d8b6cb --- /dev/null +++ b/graphics/items/icon_palettes/metronome.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +39 39 39 +39 69 85 +159 203 229 +109 177 220 +77 142 168 +54 93 61 +77 126 93 +177 229 229 +247 247 247 +126 185 220 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/mind_plate.pal b/graphics/items/icon_palettes/mind_plate.pal new file mode 100755 index 0000000000..583a524b66 --- /dev/null +++ b/graphics/items/icon_palettes/mind_plate.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +40 40 40 +209 122 138 +246 209 209 +246 237 228 +255 173 165 +201 104 96 +201 88 88 +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/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/muscle_band.pal b/graphics/items/icon_palettes/muscle_band.pal new file mode 100755 index 0000000000..e93f6f6ddf --- /dev/null +++ b/graphics/items/icon_palettes/muscle_band.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +39 39 39 +168 142 32 +247 247 151 +229 203 39 +126 109 61 +56 56 56 +247 109 109 +203 177 18 +203 93 18 +203 25 25 +238 54 54 +0 0 0 +0 0 0 +0 0 0 +0 0 0 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/power_herb.pal b/graphics/items/icon_palettes/power_herb.pal new file mode 100755 index 0000000000..09501f4812 --- /dev/null +++ b/graphics/items/icon_palettes/power_herb.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +151 69 69 +39 39 39 +229 109 109 +229 46 46 +168 39 39 +212 61 61 +194 61 61 +177 77 77 +238 93 93 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 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/quick_powder.pal b/graphics/items/icon_palettes/quick_powder.pal new file mode 100755 index 0000000000..39410ad529 --- /dev/null +++ b/graphics/items/icon_palettes/quick_powder.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +49 49 49 +156 156 156 +214 214 214 +255 255 255 +239 239 239 +90 90 90 +181 214 255 +123 189 239 +74 107 173 +115 156 206 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 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/shed_shell.pal b/graphics/items/icon_palettes/shed_shell.pal new file mode 100755 index 0000000000..6fb36dd9d5 --- /dev/null +++ b/graphics/items/icon_palettes/shed_shell.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +39 39 39 +229 238 101 +247 247 247 +220 194 109 +159 142 46 +185 168 69 +203 177 61 +117 117 85 +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/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/shock_drive.pal b/graphics/items/icon_palettes/shock_drive.pal new file mode 100755 index 0000000000..1d7d83eb55 --- /dev/null +++ b/graphics/items/icon_palettes/shock_drive.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +144 104 32 +248 216 0 +216 128 16 +248 144 16 +248 168 0 +0 0 0 +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/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/sky_plate.pal b/graphics/items/icon_palettes/sky_plate.pal new file mode 100755 index 0000000000..3c7b1e3f0e --- /dev/null +++ b/graphics/items/icon_palettes/sky_plate.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +40 40 40 +26 165 218 +88 209 237 +112 246 255 +63 192 255 +26 130 173 +33 104 156 +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/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/smooth_rock.pal b/graphics/items/icon_palettes/smooth_rock.pal new file mode 100755 index 0000000000..ccb7076fae --- /dev/null +++ b/graphics/items/icon_palettes/smooth_rock.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +39 39 39 +247 229 134 +247 247 220 +238 212 85 +203 142 54 +212 168 11 +185 126 93 +229 168 142 +142 93 69 +117 77 54 +229 185 159 +168 134 25 +212 151 46 +0 0 0 +0 0 0 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/splash_plate.pal b/graphics/items/icon_palettes/splash_plate.pal new file mode 100755 index 0000000000..cc529d3455 --- /dev/null +++ b/graphics/items/icon_palettes/splash_plate.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +40 40 40 +56 96 201 +122 173 255 +147 192 255 +96 138 255 +33 63 138 +0 0 0 +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/items/icon_palettes/spooky_plate.pal b/graphics/items/icon_palettes/spooky_plate.pal new file mode 100755 index 0000000000..fffede5bc1 --- /dev/null +++ b/graphics/items/icon_palettes/spooky_plate.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +40 40 40 +112 122 138 +165 173 182 +192 192 209 +138 130 165 +104 104 104 +88 88 88 +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/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/sticky_barb.pal b/graphics/items/icon_palettes/sticky_barb.pal new file mode 100755 index 0000000000..a179f618f6 --- /dev/null +++ b/graphics/items/icon_palettes/sticky_barb.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +39 39 39 +185 229 229 +109 177 194 +77 126 142 +238 247 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 diff --git a/graphics/items/icon_palettes/stone_plate.pal b/graphics/items/icon_palettes/stone_plate.pal new file mode 100755 index 0000000000..c67cde98d2 --- /dev/null +++ b/graphics/items/icon_palettes/stone_plate.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +40 40 40 +173 156 130 +228 218 173 +237 237 192 +209 182 138 +156 130 63 +138 96 63 +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/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/toxic_orb.pal b/graphics/items/icon_palettes/toxic_orb.pal new file mode 100755 index 0000000000..c4ddda687e --- /dev/null +++ b/graphics/items/icon_palettes/toxic_orb.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +39 39 39 +168 142 247 +185 85 229 +212 101 238 +159 69 212 +142 61 212 +229 177 238 +247 247 247 +117 54 212 +101 32 212 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/toxic_plate.pal b/graphics/items/icon_palettes/toxic_plate.pal new file mode 100755 index 0000000000..733aae9c7b --- /dev/null +++ b/graphics/items/icon_palettes/toxic_plate.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +40 40 40 +182 88 228 +209 156 237 +246 173 246 +192 122 255 +147 79 201 +112 56 192 +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/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/wide_lens.pal b/graphics/items/icon_palettes/wide_lens.pal new file mode 100755 index 0000000000..cedef34fa0 --- /dev/null +++ b/graphics/items/icon_palettes/wide_lens.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +39 39 39 +220 151 101 +212 101 39 +117 39 18 +247 247 247 +85 85 85 +11 126 151 +18 194 247 +151 151 151 +168 54 25 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 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/wise_glasses.pal b/graphics/items/icon_palettes/wise_glasses.pal new file mode 100755 index 0000000000..1d03864d74 --- /dev/null +++ b/graphics/items/icon_palettes/wise_glasses.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +61 54 61 +39 39 39 +85 77 85 +247 247 247 +85 134 134 +159 247 247 +126 194 194 +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/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/zap_plate.pal b/graphics/items/icon_palettes/zap_plate.pal new file mode 100755 index 0000000000..074a89879d --- /dev/null +++ b/graphics/items/icon_palettes/zap_plate.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +40 40 40 +237 156 63 +246 218 112 +246 228 130 +255 192 88 +173 112 40 +130 96 33 +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/items/icon_palettes/zinc.pal b/graphics/items/icon_palettes/zinc.pal old mode 100644 new mode 100755 diff --git a/graphics/items/icon_palettes/zoom_lens.pal b/graphics/items/icon_palettes/zoom_lens.pal new file mode 100755 index 0000000000..ff950851c0 --- /dev/null +++ b/graphics/items/icon_palettes/zoom_lens.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +39 39 39 +238 220 126 +185 177 46 +85 85 46 +203 61 61 +134 32 32 +142 134 77 +101 185 247 +247 247 247 +229 126 126 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 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/adamant_orb.PNG b/graphics/items/icons/adamant_orb.PNG new file mode 100755 index 0000000000000000000000000000000000000000..5e4f6b2995ea9b0d796ea1f183203b7ccc972b56 GIT binary patch literal 321 zcmV-H0lxl;P)&B_#j=00DGT zPE!Ct=GbNc006;BL_t&-83nM-RimDYiqv#*j#JZ1EIawKc9SL12>oJFvLr+v*M|O9 zQp-Mx_{o*ru_hj;eTp2$Ep1H|DeGW={irl;qG;7sicb+!STOp;xgNIfik=48!T__x$`$g=zoC008h0(%C~g TqLtZc00000NkvXXu0mjfa{h|H literal 0 HcmV?d00001 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/big_root.PNG b/graphics/items/icons/big_root.PNG new file mode 100755 index 0000000000000000000000000000000000000000..e857cc5f301e74dc95dbcdeb839ac9e802f63ab0 GIT binary patch literal 415 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ3JU3wIuj1`3In zxJHx&=ckpFCl;kLxcj&OjZr8|EmAPnGbwCc@(`$mqolyk9VlZAWHWd*XvzaAmUKs7 zM+SzC{oH>NS%G|m0G|-o{|pW4>gsjA+$&1;?i?yTJ>B>Fo#`M=IDqe`^{zlE#w2fd zm;X!IKOF^eN`m}?862M7NCR@VdAc};RLn`8uu<@^0*`B;8bj+2vm4Llrtk{9OHOE- z@Hd>}!RehHtN!<`*H=;e$Hk)YCo_bb{pQk^sU5{-vU#%}Pqu8^Is1{HWxi_Z{odyF zb21wGmh8Mx^hIv(&P@GzZU<%=Jby5a?*QX{)5uxT{O|OGl^-g(Z!%sebc-?P%yNNQ z9~)b=)ask;E?j$XaTOn*T+NP;Oy!!(%-Gx<+8sV~Djb>S*=6kLkh^Z%4+h!2d(JJ? btGy~NQ7ymWo{-cokheWu{an^LB{Ts5u@;T| literal 0 HcmV?d00001 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/binding_band.PNG b/graphics/items/icons/binding_band.PNG new file mode 100755 index 0000000000000000000000000000000000000000..9930640ef1f5f4004558b4faea9be7cc7a9781dd GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G~10G|-o z{|pTV1_m<{6m~RdoR|@?OlxilP>Qi6$S;_|;n|HeAScJu#W6%8d}`lC!2=2$&WX&9 z;uFdk&vWib{y%foiZ9#GhR-|5aKK)1>GjQ97{qq^wFFrmdKI;Vst0E84yVE_OC literal 0 HcmV?d00001 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/black_sludge.PNG b/graphics/items/icons/black_sludge.PNG new file mode 100755 index 0000000000000000000000000000000000000000..2e1fac755f6e1ebd387828cdb667b0172769013b GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ3LaX4w*#fkNUX zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0w`{lmz(&GdMiEkp|>6d%8G=RLq&%f06gF0*}jKHkOslM~*NbaTn9@NqF@)Tyw&r zXPaNu{ye#F^Io0$Q){QTCL;09j{R`U~VKX=Hba4r&Ob=6vQ%Qz- CnQR*X literal 0 HcmV?d00001 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/chill_drive.PNG b/graphics/items/icons/chill_drive.PNG new file mode 100755 index 0000000000000000000000000000000000000000..a2c7e98a6893275c11b47a829d37be8a4e0668c6 GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGU9w93$0Dg0)@m& zTq83f52R}fXaDe?YH#h*L7?Zr+ zUH&g+|8x|@DGBlmW^j0RBMr#O^>lFzshG3&+(F(31s;dM8xB(p9Bwx3Vw81M*Vy!* zV_QPY>Q39e^M!(v>m*;R9e>kS$o^f5v1(;1^V_G>KD5j*dUkZi0e0pWVT%nOsV);c za#m`eK%r3fjj1cb3jf~@*6lAqd+3TQeOJD#tE(S+ z`dzPXBghyqNOArl0%R~IdAqy(U&{XJD2P)Me#DIX)%mUe2>P9foHse9QB^Lkhzgyi?jFmd|A4(r56V!X~{e+%Jr!aK@$B z*+;ikw@EgtE~_v}%P+T0V||p;7SR!!Z|K|0wDJ>=nfLm6IbvK!kxRGSG}u#A)MXrC zKY6$N>>J-sZBRby!1s7n=xUek)z5Z_H?K`hICJlv*sf}&BbhPRqIJ^W_cRqWuuY%7 zJHpYTd-e9|yDgmWoS6}~xBA(cfR4JAFQ+<~g`7U6si$|WEudL9UFz@+o*;*4ajt|m ZL55kG4!R#Dery5-f~TvW%Q~loCIC}|qm}>w literal 0 HcmV?d00001 diff --git a/graphics/items/icons/choice_specs.PNG b/graphics/items/icons/choice_specs.PNG new file mode 100755 index 0000000000000000000000000000000000000000..6c64cb26e4aa3bd5210fa0e2b4a9c95955587586 GIT binary patch literal 369 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ3K1nRyd#1BJv( zTq8xqbooW}w~{gN6AXB_etU0@|DF+*t?yP*cd(v~h!35nIytPNRLYH)~ZGo`MY z#=d&mbS+VBBL>T1;TfI{LW zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0vB2xF4ByUYKj?4OQ;I3+=T!3+-1ZlnP@M?75|Ln`LPUO33ttiZz%@RK=kKg0e6 z5&Hu@KDK%nkKDcb^6rVsPKkHXXa3v{ED^7Mv~m#OJ}Q}+#juJOt@NGkToT{Ca++}LY)`Ws8&?PV&4mr8ms-Dp!$o%(gp%PWds ySL`_@Yr(NJ>G)Az(X8(;Yn_UGs&pRhSt_sc*(ma^*7oTjzk9m+xvXpNXh-*zQy!e<(jwecJsgQRyg9sTP6Q!OBm;cc7ek64o6$JXzt1QIL~5r zzQVE2KoJ?SL;m|3W?Wm<>X_M@^2`yV@f&A#{>gTe~ HDWM4f$Bl^Y literal 0 HcmV?d00001 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/douse_drive.PNG b/graphics/items/icons/douse_drive.PNG new file mode 100755 index 0000000000000000000000000000000000000000..eee5ae35f1efa90dfee9e4e1dc3eec5082c23847 GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGU9xEF_CAt1BJv( zTq83QDe%e64o;O+&Wzf|4u9cSvkl26BXG6o+N{c`SJW*o@1p00i_>zopr0O06t A>Hq)$ literal 0 HcmV?d00001 diff --git a/graphics/items/icons/draco_plate.PNG b/graphics/items/icons/draco_plate.PNG new file mode 100755 index 0000000000000000000000000000000000000000..9b08c31c8df7bbd046af83623c1f118db34a6118 GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ3Ls%=b2E0)@m& zTq8~0qFtt@f%n#_Yj_W2$-awlFmDUE7=0wBp*TXq#zD)8MZ$^c z!ajRRpEjwcvwPG&&l2yuo*_E__?+Shu&z0S@&>UMwS{e^o16zwuK4ZOEbUBi1IOZHuagLzxP#pok34aE@>HV#@&ED}yk z7xvjp`m{+ko!z7Md6szJ^$gMZ$LADB7(dM47Bum@mk|r?80m1&hET zwxVZ?UT0?>b-Tav{=z*0iguZr2HsnzuHik9CHpSI!MrWtV)T)ihT;eb8wV{X76~V& z3;XOPecGg&&hAnBJWIUqdWPuy<8z85j34H23z~dx67#pG8})Ul2=c4&a`RMcubp)>g-)(bC%_proO)Z;bVyfe){_UZITBjg~d%{+I~e?rEDQ{Oyn@Y1`T6=F7kRq+xvXV3!G+{THF{WzG2sYANGp3udja;Jjl|- z^r!R3xuXUt`xiSiZhv+Brf6{9a>LYj4U@KK?piQIrD!wL@ue&qj1QPT?ReT`I(1R0 zZJOimcT*xdYoA8XwrvYtY5i8=U}xEkeJc8G)$(uS7#{@Zx*rhojjlC|lV$4PmlM(9 m{eNbX(8=?UC%*VAsJ-vsKK``hwsYM;p7V6|b6Mw<&;$S|>U=W* literal 0 HcmV?d00001 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/fist_plate.PNG b/graphics/items/icons/fist_plate.PNG new file mode 100755 index 0000000000000000000000000000000000000000..0142938d511cdc336851632b141a898d8c86f63a GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ5f=GkNS%G|m0G|-o{|pTp8X6}v628sp`oDJRlct2V_V!H{8X$exz^ncv6+m&u zByV?@|4Z3F9R+bpg8YIR9G=}s19GZ7T^vIy=A>RY%iEy9!C-0Fbas#0=UL)?*E2-tAD>ekVf-+EThQcllbF9f-H=?j;(3N$`YwhjE6Zn{ Sk%`J6cYC_}xvXNS%G}%0G|-o z{|pW4>gwO?>b~pgz1z9*I}p@`em@lZ{d=sw{Iv$4GRBf1zhDN3XE)M-oB~f5#}J9| zJE12>(#yt)kLP1v+?<3yzpC)Fc5XK!#Q9bF-n6*i6SDaXtfmF3gbov(08 zs!J~qJz$xcc1$ugpf7Uc%t)&_m#57OV|*U6WO}*7R|75Po2i~mK&hxGqbqVE&lgyU d9OYiZ#K0IMDJXqa`!&#R22WQ%mvv4FO#tNRQH=lq literal 0 HcmV?d00001 diff --git a/graphics/items/icons/flame_plate.PNG b/graphics/items/icons/flame_plate.PNG new file mode 100755 index 0000000000000000000000000000000000000000..6f78e5d0205cd2a5a0e0549d8a79df83283ae70d GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ5iFvToi2Kq2uG z*NBqf{Irtt#G+INcOMs^F$!g=MGD4xCWWm_9s-qcloa^617(bXYzD6eO?e>2lJ4m1 z$iT3%pZiZDE0Avx;1lBdpP@lrUHyuy+4s`Y?|psWeSKF52~B4O$zugGO7^<~B^Z;u z-Ch1KW&d;(#3>2#3ubV5b|VeQsq%Dj45^rtdf_Z@g8~n0!i@v-1v&T>7BRnI5jezF z^lZ`V?98KX_gCIuxFqLMd+XFSya%#m-$gi>w*_2`J`&SV93f%jpyk9O;ly-d zpS`3{n^e=;J!+q4iT7R45S@Q~PH}|s!~AVQlg~|J{`Pc3a@~sO8FuNr7^18!pLIqi QDuW#E>FVdQ&MBb@063;?Bme*a literal 0 HcmV?d00001 diff --git a/graphics/items/icons/float_stone.PNG b/graphics/items/icons/float_stone.PNG new file mode 100755 index 0000000000000000000000000000000000000000..61f096fc368efcfd43f7c49a83cf057e7637fdc0 GIT binary patch literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGU9wpq3;{#0ENU$ zTq8+!-m!#Ue*UWsj11X8txG% zPu#e{p>%Xb%91s29`QWZ(44tr*Rp0yB{w%OJw3&T0=lP8om!W-?p=bPVZd&0FA0}r zM{e9WVrsIM;f$s)XCbF&^NaKZ|Kd_!ZT*I*C_a`eAC(#YM~blgcpuULw41@x)z4*} HQ$iB}c3EpE literal 0 HcmV?d00001 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/focus_sash.PNG b/graphics/items/icons/focus_sash.PNG new file mode 100755 index 0000000000000000000000000000000000000000..e0df9798ef492f7d6b2e785b44f7aab2c8710365 GIT binary patch literal 392 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ5h4UsT_z0)@m& zTq8?an+uh~=Qua?rL7b8xzhDN3XE)M-ocW$Ejv*CuO8X7@4jJ&c=FUIRXqKwuta`0W zIK(OGoWRQLX(er{#WRa?Ce2_Gvx%tt`RzZ~f&YgN^UFNH^YRSuhTXcXK3TUoeacwA zokAUX?U&8slc#&h3w;REQO(S)<;P!U2U~$A?KC5hZl2c#`ZcWwW!+r>jZ3C z{PU3NyQj|5>59{~&T;>{t9$mhRokCE?!6WNd=~SHklE3D8B0gt*r+BScFYFlpI^fr(I zNWjdytN_SmO!9Vj`M;F?(@_woB*-tA!Qt7BG$3b-r;B4q#hlm+d-<9b1lSAK`4=qV zUF(-S$4c4%!qU~uo!Z^IyQlZ@so69x@ppI?EEW*0eEIJudpo{kW!x6ecU)`L*&12G zwN=fSJt%8+X93@oUXMVmdKI;Vst0GYd#NdN!< literal 0 HcmV?d00001 diff --git a/graphics/items/icons/griseous_orb.PNG b/graphics/items/icons/griseous_orb.PNG new file mode 100755 index 0000000000000000000000000000000000000000..5140ea3acde5081d0359d061c75956a6582af9da GIT binary patch literal 426 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ5hSS0_qM01Anh zxJHx&=ckpFCl;kLxcj&OjZr8|EmAPnGbwCc@(`$mqolyk9VlZAWHWd*XvzaAmUKs7 zM+SzC{oH>NS%G|m0G|-o{|pU=hKAM2ivR!rzqVK6|Mzp>pZDB5W;v%t@!VF;wLKDh z=V*e=fPrsLt6u@xj7i?^F8`OZe>w`{lmz(&GdMiEkp|=(^mK6yshE?TaDa`4^?{F@ zVzPyMz)@44V~Hh&+}dF+MJh3emZ_UNsfH~{3!CL=8Psij`t+Id22(>l~U~?I`yDHpT&gOII)<$(kV?xR$Vnd9o)RTJfEd#$?o#^QKC|-t}sqY z{Bmn=b$R9tH})G0)7RbIJ$+VYgKp}bM|byDudHN0lB=X=9hT4kN}!==S!E7qla=o+ zW8Jm4IbSimDX1^yd}V$tSF^XNslZ>Em5qskL3M-mHsy~tvp`<NS%G|m0G|-o{|pW4>gwN5U-{m*@k(gv_uT1yxv?wSO79%nd1d4LowlJH zV`Ec&T|vfx0lTZN0+7L&OqNNqvX`Bm%VpWJQWGY;c%j3`dw25 zA-1Ati(Y4E9(B9F^8Ug-0g85+ng-rmr>@~WkR|&r!oj>P;9~TVn1NS%G|m0G|-o{|pW4>gqecf3G|J?&^)2#GK$VBoT}+9QzlH(cJgvLYAT_p`Y1_?Yr2r35wEXU%c)L@)yt-q`?M5ZId$4P z&2dSKQ}08WW4`Hp)58@k($8e)J6K$res0c-9lM{2%uwFAeew5qy~gPdGH#FG?Jlp* zmz>YZQmpgs-j1!SB2G$ZsHUv3%)Z)n?o*Pg!0{D(HZ5Mg*~T=ap)v3%?}?W)G&D3g tt_aD@VoPzjb4Wr)t>eRHg{EF61`9c}?^~Z1{Q$b2!PC{xWt~$(69CRY%iEy9!C-0Fbas#0=UL)?*E2-tAD>ekVf-+EThQcllbF9f-H=?j;(3N$`YwhjE6Zn{ Sk%`J6cYC_}xvX5jgR z3=A9lx&I`x0{I33J|V9E85-2p)%AQ`U2{{-VncoF>U=j&-}vs%_wV09S}_1?XE(?V zj7i?^F8`OZe>w`{lmz(&GdMiEkp|?Hd%8G=RLq&%f0wsGfu|*v`5ZF|$%FSzn4HePu#T~cCI>akqbfP=lq`7Z8V zXQ8OMAf>74$r0X45tmEGOq?+Xf8@BXFTdeGG4i)X+BFYND?{6@@%lAaIlDE5pKezU Q-3@ZFr>mdKI;Vst03NS%A^-pY literal 0 HcmV?d00001 diff --git a/graphics/items/icons/iron_plate.PNG b/graphics/items/icons/iron_plate.PNG new file mode 100755 index 0000000000000000000000000000000000000000..08a3cb8b996487e7d72dc3fd73c903c90a785c6a GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ0}9PdX<11BJv( zTq8RY%iEy9!C-0Fbas#0=UL)?*E2-tAD>ekVf-+EThQcllbF9f-H=?j;(3N$`YwhjE6Zn{ Sk%`J6cYC_}xvX2lJ4m1 z$iT3%pZiZDE0Avx;1lBdpP@lrUH$3Pr>9S!?(6GIO-;46wFPOy0S+j%IGPh&RDpZH>n^T|7DCsPj^Z}vJ-)ofe%`-DLTr)_LW z`zZw$!x=n_7=sus+IILpTcwb!wBGM&thcWIIls^|_f~#pn>0VqsalTV`oTlJ4|j^D z&f;-N+gJ5E$V2w*c7BJsO*$XBZ@5J2v`%ERI=1%d44Dgm>&{B=EtTCNsiL(G2lJ4m1 z$iT3%pZiZDE0Avx;1lBdpP@lrUH!_6cX!P0yxaKh`}glV)en77O$F)01{D5XaRG`m zCV9KN{9nrc=_rU(666=m;PC858jzFd>EaktF()}eLD+zci|fEmCoiuqgLxA+ZQM9f zDa1+jh|bv?97;!5NX?oyjqNGN%$6DA%O#z!a7wCAUpiaW*)r{AW@hRQON~>P1lSC; smMiw8g_wCaM|VAv329$c(HO$OP;V{%pw0Z)9gy=pUHx3vIVCg!0PrAVmH+?% literal 0 HcmV?d00001 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/light_clay.PNG b/graphics/items/icons/light_clay.PNG new file mode 100755 index 0000000000000000000000000000000000000000..7cc3e63801f3d21ad4c7ff73d4e2ca5eae7e01ba GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ9Gtn|ci$fkNUX zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0xLrP+zfrnp`I zId<@|*Es5*oOHg3qh3k!p3UUjMwMqmyk=$Tt~z!6?$M<(&Yb+m()^Yu%+y{ge8^Z_ z(~Pa6m_5?(dTZf^7b0iFs$}K3wcqxYeO!G##{F)pSl8KIjO$meWW2rn+jZ{!k2sz0 ViPa_y_#;y(v%MWFcGRSs4zAAKeTG)HWS!qE#xmcFH->1v4 zWlN3NguO+--Z?8guLwUEwY4bi>%Cru_G5YL=U8s8`7XObJ|sV1U;qBz?*d1PtMlI9 r+xvYB)0NxR=jZHP+o9|5fPtZQO32b2)2{nK&oX$r`njxgN@xNAzx23U literal 0 HcmV?d00001 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/meadow_plate.PNG b/graphics/items/icons/meadow_plate.PNG new file mode 100755 index 0000000000000000000000000000000000000000..5cec7fc16726e4e8acd23eda2d9134c1bd299d39 GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ9FaTn1D8fI{LW zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0wZ5YyVHqcoJdXWp7_#0n&#Je2(&H28uH# zdAqy(U&{XJD2P)M~0qFtt@f%n#_Yj_W2$-awlFmDUE7=0wBp*TXq#zD)8MZ$^c z!ajRRpEjwcvwPG&&l2yuo*_E__?+Sh90nkO4@b z{r3J=AeS-8+uh~=Qua?rL7b8xzhDN3XE)M-oN7-O$B>FS$q5JeSy}~h+>*mtE!@}K z31yfm%<;Tqdix>Eo|n0*3z-VenTYsl#>giBG-=^XQt(^BWaQ3pEK{4mweU#y?91Lx z%?iH`Pl~-1lpxd1r_dmEJY#Ft)m29e`hdjh1@jWN7@3*Hv3_N7xvA7~(x)k*!90dR WB1f$^ilh4!$i1GfelF{r5}E*-Y;raL literal 0 HcmV?d00001 diff --git a/graphics/items/icons/mind_plate.PNG b/graphics/items/icons/mind_plate.PNG new file mode 100755 index 0000000000000000000000000000000000000000..dfe89ddbb51c769af09e9a701fcea47d5488e4d8 GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ9Fk;_WS3Kq2uG z*NBqf{Irtt#G+INcOMs^F$!g=MGD4xCWWm_9s-qcloa^617(bXYzD6eO?e>2lJ4m1 z$iT3%pZiZDE0Avx;1lBdpP@lRL*rsq*SCuozrB6(f9=wf83`vNB0&1E0gfe^GlAla zN#5=*|Ch3VItt>H1o;IsI6S+N2IN$Ex;TbZ%t^g)mbXEHhc)5Gf%$?Qd&K=yi7HQMdam?=RdFplFw=Y2dwe>KfhyS+egU9L(DSE=C`TX(*16uyN3GVv%rS zy0Fh)(x*+T>Fgf0&$Gn)u4jnOKR%~8!uVnSwxG%9CNY0|x*@r4#q$ii^j!>5R+i5? SBNLTD?)G%`b6Mw<&;$VUR&ja& literal 0 HcmV?d00001 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/muscle_band.PNG b/graphics/items/icons/muscle_band.PNG new file mode 100755 index 0000000000000000000000000000000000000000..b374760a7121253f34a3ed229a554c914cabcdbb GIT binary patch literal 418 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ4u;5&DH5Kq2uG z*NBqf{Irtt#G+INcOMs^F$!g=MGD4xCWWm_9s-qcloa^617(bXYzD6eO?e>2lJ4m1 z$iT3%pZiZDE0Avx;1lBdpP@lrU42EL!uRjfpPp8)%eA$zu=t*vdwQeL=~$uDl9KPt z%s^(qz=yh;`#?5hlDE6d|E27oj)FKPL4Lsu4$p3+0XaK8T^vIy=A>S5n sdFhT_)&J*Q<7Z&o@s>lXj$i0CFXLLx;=j{Qs)4-f>FVdQ&MBb@0A7cZE&u=k literal 0 HcmV?d00001 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/power_herb.PNG b/graphics/items/icons/power_herb.PNG new file mode 100755 index 0000000000000000000000000000000000000000..947996c4cdd69bff960934aced314188fc0dd52a GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ4sI$Go4s1`3In zxJHx&=ckpFCl;kLxcj&OjZr8|EmAPnGbwCc@(`$mqolyk9VlZAWHWd*XvzaAmUKs7 zM+SzC{oH>NS%G|m0G|-o{|pV&U0v1H)t~0(KGoA(p{{<#*7lIC?M7eUcd@Y`-KgNn zF6lI&2xF4ByUYKj?4OQ;I3+=T!3+-1Zh&MeJY5_^D&{07D9CeYX=)z0;iRUQ$W^dy zb+*xz!zqs*NyV`})!5xqk>VHD;Mvl0b`HlxfwEFgU47%Gf{>WlTWRM+7&c2bx}~0L z$t*17ZC))@_O-#AVQWk1xfU;j6%498iFtu%=jgN)ESV&9=VMPn;DnP$s)1qnLsD|z Tt!iC4kb6B{{an^LB{Ts5uG?)= literal 0 HcmV?d00001 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/quick_powder.PNG b/graphics/items/icons/quick_powder.PNG new file mode 100755 index 0000000000000000000000000000000000000000..d83b0b506257bad81e85f36d7743592b50f943c2 GIT binary patch literal 392 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ4tH)|#>tfkNUX zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0!^z95 zVBUtV%@Zdvgd93?^k{^q;2}YyB2L~QZ!d=8BbR!dnlDW{@Jb@McT)2dMHx52aAVWd z%_gY=?t641&-z;Wo)l0CylCmGs^NK3V$G_gYpYD2rX+VPofNw|OjX_KM$g-)p{tiU ztesv^o*#en7{^o%&GiwH#}qgoZrNV0>(jg|V#DI(sSJ0Fn>^%{fg!EismvK@-JA^a Nlc%en%Q~loCIIaYged?3 literal 0 HcmV?d00001 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/shed_shell.PNG b/graphics/items/icons/shed_shell.PNG new file mode 100755 index 0000000000000000000000000000000000000000..6e02ff4a3a8b4b93697681c10e91308c6cdb7e82 GIT binary patch literal 393 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ4sscP1K40}6?k zxJHx&=ckpFCl;kLxcj&OjZr8|EmAPnGbwCc@(`$mqolyk9VlZAWHWd*XvzaAmUKs7 zM+SzC{oH>NS%G|m0G|-o{|pW4>grG5rGEeZ{m!A>`F(mjSGb z4=Bi(?(M@T>QYi zhG(;@7{9O`(QPxxdFf=cO*i*yYhl>uPq&}=2LADloHo0Bx!3hhmdyE9O+0f~eO1v~ z+wW51AyCCqnZ;{p+**E{JL>7dH3h6Pn`N0ix<4)x;%Hr0Y_l%F!_}==|9J| zgqGEvwtMFb1tr%>zE(T_rmc|uyA)&9%2ejJPp5ronPK$o=!^sG%rC+g8$427CU)ek z)INbiq3jz|SA-S*za6aGU#f2Sjx%*%$*1Ex8H10CemQq9GY;fjPgg&ebxsLQ04}9$ A+5i9m literal 0 HcmV?d00001 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/sky_plate.PNG b/graphics/items/icons/sky_plate.PNG new file mode 100755 index 0000000000000000000000000000000000000000..f64b14aff6d02b979d950faf395ba04d6bbf7630 GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ4s!UnX~O0ENU$ zTq8wr_!Jf~zhDtK z#8&id(d+EYqi*+C-e0&UK+!H!)4+S{)HS>ZvSi;yIGDEuT#P;v(@-2CVdJ3X#3JFu zbYY*pq)(ev)7d?0pJ$2pUC$7me|%1Hgz>}tZ9$XIO=AA`bVG98isu=2>AM)BtSp~( SMkXqQ-0kV==d#Wzp$P!X`*8yR literal 0 HcmV?d00001 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/smooth_rock.PNG b/graphics/items/icons/smooth_rock.PNG new file mode 100755 index 0000000000000000000000000000000000000000..8db8ef11f5b41f24b0980eb2525088c2cd6ebe91 GIT binary patch literal 427 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ4uaDLPYU0)@m& zTq8TC9N z=lm6Il2@kdflOjx*pV-p0i+m{yxm>?FJ=F96vQbB@(X5gcy=QV$T{Tc;uumfCpqB& zn*{4b3#Tp*p<`_veI1*Xot#b{5nMGfFyP2dRe>Xh!U-bz^A|~JF@#OfxEB~GB4sLg z#53&v#f$gsil6!{5P59aEeiyp#_60)l}T3}{C=OBc{;{n&ePrH+t)`~YMb($m>6kU ze05c%aeAv-laI#yIJ={++0TqN+n*wSX1oT9Wp0&K6#|dP&PfK^68!3YFYw( zi+_CCS+2jF!(pyYT&XVSF~(g{2CU~8nH_kAa?v{l^bLcjtDnm{ Hr-UW|R2r4f literal 0 HcmV?d00001 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/splash_plate.PNG b/graphics/items/icons/splash_plate.PNG new file mode 100755 index 0000000000000000000000000000000000000000..b290e8100142e51ef0d4665b05621671621e2c84 GIT binary patch literal 352 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ4t}GyQTN1BJv( zTq8%6Tn!V^UJKn6oFvCHm!BKfgPqO;=rs*>K+M4F6x58jH)kLR(Bc%ckm|0lC}L L)z4*}Q$iB}?k;TO literal 0 HcmV?d00001 diff --git a/graphics/items/icons/spooky_plate.PNG b/graphics/items/icons/spooky_plate.PNG new file mode 100755 index 0000000000000000000000000000000000000000..215657bcc674f6bbd62d949be4d0595ad4dc07af GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ7&NFKa$10ENU$ zTq8m@mk|r?80m1&hET zwxVZ?UT0?>b-Tav{=z*0iguZr2HsnzuHik9CHpSI!MrWtV)T)ihT;eb8wV{X76~V& z3;XOPecGg&&hAnBJWIUqdWPuy<8z85j34H23z~dx67#pG8sZbxWjD)e^NUs)1`l{H1o;IsI6S+N2IN$Ex;TbZ%t^g)mbXEHhc)5Gf%$?Qd&K=yi7HQMdam?=RdFplFw=Y2dwe>KfhyS+egU9L(DSE=C`TX(*16uyN3GVv%rS zy0Fh)(x*+T>Fgf0&$Gn)u4jnOKR%~8!uVnSwxG%9CNY0|x*@r4#q$ii^j!>5R+i5? SBNLTD?)G%`b6Mw<&;$U_gmC2m literal 0 HcmV?d00001 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/toxic_orb.PNG b/graphics/items/icons/toxic_orb.PNG new file mode 100755 index 0000000000000000000000000000000000000000..d63ad4fa3ab6fca2980204396665a00f1a3fb773 GIT binary patch literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ7(CQb!vzfI{LW zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0j@EUP*m7-}OqL?Ukn+-+ll7z0~YVs=^hJ z0Z8EIy~kcaE@P6nyUYKj?4OQ;I3+=T!3+-1ZlnP@MV>B>Ar*6y6BL9ExVX3u+;sBt z>N1!&VN-F$B&86iy>~5gq6A#J0v8{))ZslPXq0bm#%tQPLYQe&Pp|KSIU6z$o;znS z^TgDHYR49O7%iL0VXL-mvx1CU>VmqRY%iEy9!C-0Fbas#0=UL)?*E2-tAD>ekVf-+EThQcllbF9f-H=?j;(3N$`YwhjE6Zn{ Sk%`J6hkLsExvXNS%G|m0G|-o{|pW4>gsoj)Iyp)$ z$t+vcOoVex9|7c&KNJPfV|4Rzp{7?+l+yy$hBZ tXd291Dyi5b?)pqaic8T_`lhG~6GQAY&i`Llh+hY}(9_k=Wt~$(69DZOU1d zN#5=*|Ch3VItt>H1o;IsI6S+N2IN$Ex;TbZ%t^g)mbXEHhc)5Gf%$?Qd&K=yi7HQMdam?=RdFplFw=Y2dwe>KfhyS+egU9L(DSE=C`TX(*16uyN3GVv%rS zy0Fh)(x*+T>Fgf0&$Gn)u4jnOKR%~8!uVnSwxG%9CNY0|x*@r4#q$ii^j!>5R+i5? SBNLTD?)G%`b6Mw<&;$UnByrsU literal 0 HcmV?d00001 diff --git a/graphics/items/icons/zoom_lens.PNG b/graphics/items/icons/zoom_lens.PNG new file mode 100755 index 0000000000000000000000000000000000000000..167619aa64e1be5dcc7ac0f9d30450678a0f46f6 GIT binary patch literal 385 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ3I_yOTxLfI{LW zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0#wzX|jQ0Qy(P2Kq&2%gr}feb(b z9ZL;90=bMy-tI2{m$H943gVOm`2{mLJiCzwA-lMfJ3z_vuB3|U8^gmlRZJp}N}T!l zCd07I*Q~L~sd0`$@rJ@fatbpqm~>>SIrK$mXk5t Date: Fri, 1 Mar 2019 13:53:06 +0100 Subject: [PATCH 269/667] Fix Sturdy's pop-up --- data/battle_scripts_1.s | 3 +++ src/battle_script_commands.c | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 087dbd4b4e..4cf97c967d 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5455,6 +5455,9 @@ BattleScript_EnduredMsg:: return BattleScript_SturdiedMsg:: + copybyte gBattlerAbility, gBattlerTarget + pause 0x10 + call BattleScript_AbilityPopUp printstring STRINGID_ENDUREDSTURDY waitmessage 0x40 return diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 61d60c0466..0dda4ff83c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6371,7 +6371,7 @@ static void atk76_various(void) 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: From eea162d3d861b178c9a63c6a5eb96958fb4c79b6 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 1 Mar 2019 13:59:08 +0100 Subject: [PATCH 270/667] Effect Spore ability pop-up --- data/battle_scripts_1.s | 3 ++- include/battle_scripts.h | 2 +- src/battle_util.c | 8 ++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 4cf97c967d..869dd6e414 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6301,8 +6301,9 @@ BattleScript_CuteCharmActivates:: waitmessage 0x40 return -BattleScript_ApplySecondaryEffect:: +BattleScript_AbilityStatusEffect:: waitstate + call BattleScript_AbilityPopUp seteffectsecondary return diff --git a/include/battle_scripts.h b/include/battle_scripts.h index b9378cb32e..b0cf7ae0e6 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -169,7 +169,7 @@ 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[]; diff --git a/src/battle_util.c b/src/battle_util.c index c93821477f..c5b5bd3878 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3249,7 +3249,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gBattleScripting.moveEffect += MOVE_EFFECT_AFFECTS_USER; BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; + gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; effect++; } @@ -3264,7 +3264,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA { gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_POISON; BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; + gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; effect++; } @@ -3279,7 +3279,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA { gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_PARALYSIS; BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; + gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; effect++; } @@ -3294,7 +3294,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA { gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_BURN; BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect; + gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; effect++; } From ae3ed962d1ea424df96996351771e7019da42f38 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sat, 2 Mar 2019 01:20:16 -0300 Subject: [PATCH 271/667] Fixed the file extensions of the new item sprites. --- .../icons/{adamant_orb.PNG => adamant_orb.png} | Bin graphics/items/icons/{big_root.PNG => big_root.png} | Bin .../icons/{binding_band.PNG => binding_band.png} | Bin .../icons/{black_sludge.PNG => black_sludge.png} | Bin .../items/icons/{burn_drive.PNG => burn_drive.png} | Bin .../icons/{chill_drive.PNG => chill_drive.png} | Bin .../icons/{choice_scarf.PNG => choice_scarf.png} | Bin .../icons/{choice_specs.PNG => choice_specs.png} | Bin .../items/icons/{damp_rock.PNG => damp_rock.png} | Bin .../icons/{destiny_knot.PNG => destiny_knot.png} | Bin .../icons/{douse_drive.PNG => douse_drive.png} | Bin .../icons/{draco_plate.PNG => draco_plate.png} | Bin .../icons/{dread_plate.PNG => dread_plate.png} | Bin .../icons/{earth_plate.PNG => earth_plate.png} | Bin graphics/items/icons/{eviolite.PNG => eviolite.png} | Bin .../icons/{expert_belt.PNG => expert_belt.png} | Bin .../items/icons/{fist_plate.PNG => fist_plate.png} | Bin .../icons/{flame_plate.PNG => flame_plate.png} | Bin .../icons/{float_stone.PNG => float_stone.png} | Bin .../items/icons/{focus_sash.PNG => focus_sash.png} | Bin .../items/icons/{grip_claw.PNG => grip_claw.png} | Bin .../icons/{griseous_orb.PNG => griseous_orb.png} | Bin .../items/icons/{heat_rock.PNG => heat_rock.png} | Bin .../icons/{icicle_plate.PNG => icicle_plate.png} | Bin graphics/items/icons/{icy_rock.PNG => icy_rock.png} | Bin .../icons/{insect_plate.PNG => insect_plate.png} | Bin .../items/icons/{iron_ball.PNG => iron_ball.png} | Bin .../items/icons/{iron_plate.PNG => iron_plate.png} | Bin .../icons/{lagging_tail.PNG => lagging_tail.png} | Bin graphics/items/icons/{life_orb.PNG => life_orb.png} | Bin .../items/icons/{light_clay.PNG => light_clay.png} | Bin .../icons/{lustrous_orb.PNG => lustrous_orb.png} | Bin .../icons/{meadow_plate.PNG => meadow_plate.png} | Bin .../items/icons/{metronome.PNG => metronome.png} | Bin .../items/icons/{mind_plate.PNG => mind_plate.png} | Bin .../icons/{muscle_band.PNG => muscle_band.png} | Bin .../items/icons/{power_herb.PNG => power_herb.png} | Bin .../icons/{quick_powder.PNG => quick_powder.png} | Bin .../items/icons/{shed_shell.PNG => shed_shell.png} | Bin .../icons/{shock_drive.PNG => shock_drive.png} | Bin .../items/icons/{sky_plate.PNG => sky_plate.png} | Bin .../icons/{smooth_rock.PNG => smooth_rock.png} | Bin .../icons/{splash_plate.PNG => splash_plate.png} | Bin .../icons/{spooky_plate.PNG => spooky_plate.png} | Bin .../icons/{sticky_barb.PNG => sticky_barb.png} | Bin .../icons/{stone_plate.PNG => stone_plate.png} | Bin .../items/icons/{toxic_orb.PNG => toxic_orb.png} | Bin .../icons/{toxic_plate.PNG => toxic_plate.png} | Bin .../items/icons/{wide_lens.PNG => wide_lens.png} | Bin .../icons/{wise_glasses.PNG => wise_glasses.png} | Bin .../items/icons/{zap_plate.PNG => zap_plate.png} | Bin .../items/icons/{zoom_lens.PNG => zoom_lens.png} | Bin 52 files changed, 0 insertions(+), 0 deletions(-) rename graphics/items/icons/{adamant_orb.PNG => adamant_orb.png} (100%) rename graphics/items/icons/{big_root.PNG => big_root.png} (100%) rename graphics/items/icons/{binding_band.PNG => binding_band.png} (100%) rename graphics/items/icons/{black_sludge.PNG => black_sludge.png} (100%) rename graphics/items/icons/{burn_drive.PNG => burn_drive.png} (100%) rename graphics/items/icons/{chill_drive.PNG => chill_drive.png} (100%) rename graphics/items/icons/{choice_scarf.PNG => choice_scarf.png} (100%) rename graphics/items/icons/{choice_specs.PNG => choice_specs.png} (100%) rename graphics/items/icons/{damp_rock.PNG => damp_rock.png} (100%) rename graphics/items/icons/{destiny_knot.PNG => destiny_knot.png} (100%) rename graphics/items/icons/{douse_drive.PNG => douse_drive.png} (100%) rename graphics/items/icons/{draco_plate.PNG => draco_plate.png} (100%) rename graphics/items/icons/{dread_plate.PNG => dread_plate.png} (100%) rename graphics/items/icons/{earth_plate.PNG => earth_plate.png} (100%) rename graphics/items/icons/{eviolite.PNG => eviolite.png} (100%) rename graphics/items/icons/{expert_belt.PNG => expert_belt.png} (100%) rename graphics/items/icons/{fist_plate.PNG => fist_plate.png} (100%) rename graphics/items/icons/{flame_plate.PNG => flame_plate.png} (100%) rename graphics/items/icons/{float_stone.PNG => float_stone.png} (100%) rename graphics/items/icons/{focus_sash.PNG => focus_sash.png} (100%) rename graphics/items/icons/{grip_claw.PNG => grip_claw.png} (100%) rename graphics/items/icons/{griseous_orb.PNG => griseous_orb.png} (100%) rename graphics/items/icons/{heat_rock.PNG => heat_rock.png} (100%) rename graphics/items/icons/{icicle_plate.PNG => icicle_plate.png} (100%) rename graphics/items/icons/{icy_rock.PNG => icy_rock.png} (100%) rename graphics/items/icons/{insect_plate.PNG => insect_plate.png} (100%) rename graphics/items/icons/{iron_ball.PNG => iron_ball.png} (100%) rename graphics/items/icons/{iron_plate.PNG => iron_plate.png} (100%) rename graphics/items/icons/{lagging_tail.PNG => lagging_tail.png} (100%) rename graphics/items/icons/{life_orb.PNG => life_orb.png} (100%) rename graphics/items/icons/{light_clay.PNG => light_clay.png} (100%) rename graphics/items/icons/{lustrous_orb.PNG => lustrous_orb.png} (100%) rename graphics/items/icons/{meadow_plate.PNG => meadow_plate.png} (100%) rename graphics/items/icons/{metronome.PNG => metronome.png} (100%) rename graphics/items/icons/{mind_plate.PNG => mind_plate.png} (100%) rename graphics/items/icons/{muscle_band.PNG => muscle_band.png} (100%) rename graphics/items/icons/{power_herb.PNG => power_herb.png} (100%) rename graphics/items/icons/{quick_powder.PNG => quick_powder.png} (100%) rename graphics/items/icons/{shed_shell.PNG => shed_shell.png} (100%) rename graphics/items/icons/{shock_drive.PNG => shock_drive.png} (100%) rename graphics/items/icons/{sky_plate.PNG => sky_plate.png} (100%) rename graphics/items/icons/{smooth_rock.PNG => smooth_rock.png} (100%) rename graphics/items/icons/{splash_plate.PNG => splash_plate.png} (100%) rename graphics/items/icons/{spooky_plate.PNG => spooky_plate.png} (100%) rename graphics/items/icons/{sticky_barb.PNG => sticky_barb.png} (100%) rename graphics/items/icons/{stone_plate.PNG => stone_plate.png} (100%) rename graphics/items/icons/{toxic_orb.PNG => toxic_orb.png} (100%) rename graphics/items/icons/{toxic_plate.PNG => toxic_plate.png} (100%) rename graphics/items/icons/{wide_lens.PNG => wide_lens.png} (100%) rename graphics/items/icons/{wise_glasses.PNG => wise_glasses.png} (100%) rename graphics/items/icons/{zap_plate.PNG => zap_plate.png} (100%) rename graphics/items/icons/{zoom_lens.PNG => zoom_lens.png} (100%) diff --git a/graphics/items/icons/adamant_orb.PNG b/graphics/items/icons/adamant_orb.png similarity index 100% rename from graphics/items/icons/adamant_orb.PNG rename to graphics/items/icons/adamant_orb.png diff --git a/graphics/items/icons/big_root.PNG b/graphics/items/icons/big_root.png similarity index 100% rename from graphics/items/icons/big_root.PNG rename to graphics/items/icons/big_root.png diff --git a/graphics/items/icons/binding_band.PNG b/graphics/items/icons/binding_band.png similarity index 100% rename from graphics/items/icons/binding_band.PNG rename to graphics/items/icons/binding_band.png diff --git a/graphics/items/icons/black_sludge.PNG b/graphics/items/icons/black_sludge.png similarity index 100% rename from graphics/items/icons/black_sludge.PNG rename to graphics/items/icons/black_sludge.png diff --git a/graphics/items/icons/burn_drive.PNG b/graphics/items/icons/burn_drive.png similarity index 100% rename from graphics/items/icons/burn_drive.PNG rename to graphics/items/icons/burn_drive.png diff --git a/graphics/items/icons/chill_drive.PNG b/graphics/items/icons/chill_drive.png similarity index 100% rename from graphics/items/icons/chill_drive.PNG rename to graphics/items/icons/chill_drive.png diff --git a/graphics/items/icons/choice_scarf.PNG b/graphics/items/icons/choice_scarf.png similarity index 100% rename from graphics/items/icons/choice_scarf.PNG rename to graphics/items/icons/choice_scarf.png diff --git a/graphics/items/icons/choice_specs.PNG b/graphics/items/icons/choice_specs.png similarity index 100% rename from graphics/items/icons/choice_specs.PNG rename to graphics/items/icons/choice_specs.png diff --git a/graphics/items/icons/damp_rock.PNG b/graphics/items/icons/damp_rock.png similarity index 100% rename from graphics/items/icons/damp_rock.PNG rename to graphics/items/icons/damp_rock.png diff --git a/graphics/items/icons/destiny_knot.PNG b/graphics/items/icons/destiny_knot.png similarity index 100% rename from graphics/items/icons/destiny_knot.PNG rename to graphics/items/icons/destiny_knot.png diff --git a/graphics/items/icons/douse_drive.PNG b/graphics/items/icons/douse_drive.png similarity index 100% rename from graphics/items/icons/douse_drive.PNG rename to graphics/items/icons/douse_drive.png diff --git a/graphics/items/icons/draco_plate.PNG b/graphics/items/icons/draco_plate.png similarity index 100% rename from graphics/items/icons/draco_plate.PNG rename to graphics/items/icons/draco_plate.png diff --git a/graphics/items/icons/dread_plate.PNG b/graphics/items/icons/dread_plate.png similarity index 100% rename from graphics/items/icons/dread_plate.PNG rename to graphics/items/icons/dread_plate.png diff --git a/graphics/items/icons/earth_plate.PNG b/graphics/items/icons/earth_plate.png similarity index 100% rename from graphics/items/icons/earth_plate.PNG rename to graphics/items/icons/earth_plate.png diff --git a/graphics/items/icons/eviolite.PNG b/graphics/items/icons/eviolite.png similarity index 100% rename from graphics/items/icons/eviolite.PNG rename to graphics/items/icons/eviolite.png diff --git a/graphics/items/icons/expert_belt.PNG b/graphics/items/icons/expert_belt.png similarity index 100% rename from graphics/items/icons/expert_belt.PNG rename to graphics/items/icons/expert_belt.png diff --git a/graphics/items/icons/fist_plate.PNG b/graphics/items/icons/fist_plate.png similarity index 100% rename from graphics/items/icons/fist_plate.PNG rename to graphics/items/icons/fist_plate.png diff --git a/graphics/items/icons/flame_plate.PNG b/graphics/items/icons/flame_plate.png similarity index 100% rename from graphics/items/icons/flame_plate.PNG rename to graphics/items/icons/flame_plate.png diff --git a/graphics/items/icons/float_stone.PNG b/graphics/items/icons/float_stone.png similarity index 100% rename from graphics/items/icons/float_stone.PNG rename to graphics/items/icons/float_stone.png diff --git a/graphics/items/icons/focus_sash.PNG b/graphics/items/icons/focus_sash.png similarity index 100% rename from graphics/items/icons/focus_sash.PNG rename to graphics/items/icons/focus_sash.png diff --git a/graphics/items/icons/grip_claw.PNG b/graphics/items/icons/grip_claw.png similarity index 100% rename from graphics/items/icons/grip_claw.PNG rename to graphics/items/icons/grip_claw.png diff --git a/graphics/items/icons/griseous_orb.PNG b/graphics/items/icons/griseous_orb.png similarity index 100% rename from graphics/items/icons/griseous_orb.PNG rename to graphics/items/icons/griseous_orb.png diff --git a/graphics/items/icons/heat_rock.PNG b/graphics/items/icons/heat_rock.png similarity index 100% rename from graphics/items/icons/heat_rock.PNG rename to graphics/items/icons/heat_rock.png diff --git a/graphics/items/icons/icicle_plate.PNG b/graphics/items/icons/icicle_plate.png similarity index 100% rename from graphics/items/icons/icicle_plate.PNG rename to graphics/items/icons/icicle_plate.png diff --git a/graphics/items/icons/icy_rock.PNG b/graphics/items/icons/icy_rock.png similarity index 100% rename from graphics/items/icons/icy_rock.PNG rename to graphics/items/icons/icy_rock.png diff --git a/graphics/items/icons/insect_plate.PNG b/graphics/items/icons/insect_plate.png similarity index 100% rename from graphics/items/icons/insect_plate.PNG rename to graphics/items/icons/insect_plate.png diff --git a/graphics/items/icons/iron_ball.PNG b/graphics/items/icons/iron_ball.png similarity index 100% rename from graphics/items/icons/iron_ball.PNG rename to graphics/items/icons/iron_ball.png diff --git a/graphics/items/icons/iron_plate.PNG b/graphics/items/icons/iron_plate.png similarity index 100% rename from graphics/items/icons/iron_plate.PNG rename to graphics/items/icons/iron_plate.png diff --git a/graphics/items/icons/lagging_tail.PNG b/graphics/items/icons/lagging_tail.png similarity index 100% rename from graphics/items/icons/lagging_tail.PNG rename to graphics/items/icons/lagging_tail.png diff --git a/graphics/items/icons/life_orb.PNG b/graphics/items/icons/life_orb.png similarity index 100% rename from graphics/items/icons/life_orb.PNG rename to graphics/items/icons/life_orb.png diff --git a/graphics/items/icons/light_clay.PNG b/graphics/items/icons/light_clay.png similarity index 100% rename from graphics/items/icons/light_clay.PNG rename to graphics/items/icons/light_clay.png diff --git a/graphics/items/icons/lustrous_orb.PNG b/graphics/items/icons/lustrous_orb.png similarity index 100% rename from graphics/items/icons/lustrous_orb.PNG rename to graphics/items/icons/lustrous_orb.png diff --git a/graphics/items/icons/meadow_plate.PNG b/graphics/items/icons/meadow_plate.png similarity index 100% rename from graphics/items/icons/meadow_plate.PNG rename to graphics/items/icons/meadow_plate.png diff --git a/graphics/items/icons/metronome.PNG b/graphics/items/icons/metronome.png similarity index 100% rename from graphics/items/icons/metronome.PNG rename to graphics/items/icons/metronome.png diff --git a/graphics/items/icons/mind_plate.PNG b/graphics/items/icons/mind_plate.png similarity index 100% rename from graphics/items/icons/mind_plate.PNG rename to graphics/items/icons/mind_plate.png diff --git a/graphics/items/icons/muscle_band.PNG b/graphics/items/icons/muscle_band.png similarity index 100% rename from graphics/items/icons/muscle_band.PNG rename to graphics/items/icons/muscle_band.png diff --git a/graphics/items/icons/power_herb.PNG b/graphics/items/icons/power_herb.png similarity index 100% rename from graphics/items/icons/power_herb.PNG rename to graphics/items/icons/power_herb.png diff --git a/graphics/items/icons/quick_powder.PNG b/graphics/items/icons/quick_powder.png similarity index 100% rename from graphics/items/icons/quick_powder.PNG rename to graphics/items/icons/quick_powder.png diff --git a/graphics/items/icons/shed_shell.PNG b/graphics/items/icons/shed_shell.png similarity index 100% rename from graphics/items/icons/shed_shell.PNG rename to graphics/items/icons/shed_shell.png diff --git a/graphics/items/icons/shock_drive.PNG b/graphics/items/icons/shock_drive.png similarity index 100% rename from graphics/items/icons/shock_drive.PNG rename to graphics/items/icons/shock_drive.png diff --git a/graphics/items/icons/sky_plate.PNG b/graphics/items/icons/sky_plate.png similarity index 100% rename from graphics/items/icons/sky_plate.PNG rename to graphics/items/icons/sky_plate.png diff --git a/graphics/items/icons/smooth_rock.PNG b/graphics/items/icons/smooth_rock.png similarity index 100% rename from graphics/items/icons/smooth_rock.PNG rename to graphics/items/icons/smooth_rock.png diff --git a/graphics/items/icons/splash_plate.PNG b/graphics/items/icons/splash_plate.png similarity index 100% rename from graphics/items/icons/splash_plate.PNG rename to graphics/items/icons/splash_plate.png diff --git a/graphics/items/icons/spooky_plate.PNG b/graphics/items/icons/spooky_plate.png similarity index 100% rename from graphics/items/icons/spooky_plate.PNG rename to graphics/items/icons/spooky_plate.png diff --git a/graphics/items/icons/sticky_barb.PNG b/graphics/items/icons/sticky_barb.png similarity index 100% rename from graphics/items/icons/sticky_barb.PNG rename to graphics/items/icons/sticky_barb.png diff --git a/graphics/items/icons/stone_plate.PNG b/graphics/items/icons/stone_plate.png similarity index 100% rename from graphics/items/icons/stone_plate.PNG rename to graphics/items/icons/stone_plate.png diff --git a/graphics/items/icons/toxic_orb.PNG b/graphics/items/icons/toxic_orb.png similarity index 100% rename from graphics/items/icons/toxic_orb.PNG rename to graphics/items/icons/toxic_orb.png diff --git a/graphics/items/icons/toxic_plate.PNG b/graphics/items/icons/toxic_plate.png similarity index 100% rename from graphics/items/icons/toxic_plate.PNG rename to graphics/items/icons/toxic_plate.png diff --git a/graphics/items/icons/wide_lens.PNG b/graphics/items/icons/wide_lens.png similarity index 100% rename from graphics/items/icons/wide_lens.PNG rename to graphics/items/icons/wide_lens.png diff --git a/graphics/items/icons/wise_glasses.PNG b/graphics/items/icons/wise_glasses.png similarity index 100% rename from graphics/items/icons/wise_glasses.PNG rename to graphics/items/icons/wise_glasses.png diff --git a/graphics/items/icons/zap_plate.PNG b/graphics/items/icons/zap_plate.png similarity index 100% rename from graphics/items/icons/zap_plate.PNG rename to graphics/items/icons/zap_plate.png diff --git a/graphics/items/icons/zoom_lens.PNG b/graphics/items/icons/zoom_lens.png similarity index 100% rename from graphics/items/icons/zoom_lens.PNG rename to graphics/items/icons/zoom_lens.png From c9c38024e3d1c6417311a7c50a8cbe64d8321fa4 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 2 Mar 2019 12:13:09 +0100 Subject: [PATCH 272/667] Fix move reminder --- asm/rom_81D1C44.s | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/asm/rom_81D1C44.s b/asm/rom_81D1C44.s index 13664a4b2b..bc501faffe 100644 --- a/asm/rom_81D1C44.s +++ b/asm/rom_81D1C44.s @@ -1768,10 +1768,8 @@ sub_81D28FC: @ 81D28FC b _081D2AB6 .pool _081D29C4: - mov r1, r9 - lsls r0, r1, 1 - add r0, r9 - lsls r0, 2 + mov r0, r9 + lsls r0, 4 ldr r1, =gBattleMoves adds r6, r0, r1 ldrb r1, [r6, 0x2] From 159d1089a73291b9e50789c92584e5f538821c51 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 2 Mar 2019 12:17:41 +0100 Subject: [PATCH 273/667] Crunch lowers Defense --- src/data/battle_moves.h | 2 +- src/data/text/move_descriptions.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index ed39e27f52..01c0b8d40e 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -3391,7 +3391,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_CRUNCH] = { - .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, + .effect = EFFECT_DEFENSE_DOWN_HIT, .power = 80, .type = TYPE_DARK, .accuracy = 100, diff --git a/src/data/text/move_descriptions.h b/src/data/text/move_descriptions.h index 8a33ee98ba..5b959eb97e 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" From 8e9296a42b99c79ab02723aafd88f9c352ba8ae6 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 2 Mar 2019 12:31:07 +0100 Subject: [PATCH 274/667] Fix team messages --- charmap.txt | 5 +++-- include/battle_message.h | 5 +++-- src/battle_message.c | 26 +++++++++++++++++--------- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/charmap.txt b/charmap.txt index 5e5ab4ed40..40a1054184 100644 --- a/charmap.txt +++ b/charmap.txt @@ -398,8 +398,9 @@ B_PARTNER_NAME = FD 33 B_BUFF3 = FD 34 B_ATK_TRAINER_NAME = FD 35 B_ATK_TRAINER_CLASS = FD 36 -B_ATK_TEAM = FD 37 -B_DEF_NAME = FD 38 +B_ATK_TEAM1 = FD 37 +B_ATK_TEAM2 = FD 38 +B_DEF_NAME = FD 39 @ indicates the end of a town/city name (before " TOWN" or " CITY") NAME_END = FC 00 diff --git a/include/battle_message.h b/include/battle_message.h index b2ca235e2a..102398d0d8 100644 --- a/include/battle_message.h +++ b/include/battle_message.h @@ -59,8 +59,9 @@ #define B_TXT_BUFF3 0x34 #define B_TXT_ATK_TRAINER_NAME 0x35 #define B_TXT_ATK_TRAINER_CLASS 0x36 -#define B_TXT_ATK_TEAM 0x37 -#define B_TXT_DEF_NAME 0x38 +#define B_TXT_ATK_TEAM1 0x37 // Your/The opposing +#define B_TXT_ATK_TEAM2 0x38 // your/the opposing +#define B_TXT_DEF_NAME 0x39 // for B_TXT_BUFF1, B_TXT_BUFF2 and B_TXT_BUFF3 diff --git a/src/battle_message.c b/src/battle_message.c index 7034931f01..b66fb0417a 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -526,7 +526,7 @@ static const u8 sText_PkmnFlung[] = _("{B_ATK_NAME_WITH_PREFIX} flung its\n{B_LA 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 your\nteam from critical hits!"); +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_LAST_ABILITY}!"); @@ -539,7 +539,7 @@ static const u8 sText_PointedStonesFloat[] =_("Pointed stones float in the air\n 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_TEAM}!"); +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!"); @@ -562,8 +562,8 @@ static const u8 sText_EmbargoEnds[] = _("{B_DEF_NAME_WITH_PREFIX}can\nuse items static const u8 sText_MagnetRiseEnds[] = _("{B_ATK_NAME_WITH_PREFIX}'s electromagnetism\nwore off!"); static const u8 sText_HealBlockEnds[] = _("{B_ATK_NAME_WITH_PREFIX}'s Heal Block\nwore off!"); static const u8 sText_TelekinesisEnds[] = _("{B_ATK_NAME_WITH_PREFIX} was freed\nfrom the telekinesis!"); -static const u8 sText_TailwindEnds[] = _("{B_ATK_TEAM}'s tailwind\n petered out!"); -static const u8 sText_LuckyChantEnds[] = _("{B_ATK_TEAM}'s Lucky Chant\n wore off!"); +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!"); @@ -1623,8 +1623,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_YourTeam[] = _("Your team"); -static const u8 sText_OpposingTeam[] = _("The opposing team"); +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. @@ -3113,11 +3115,17 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) break; } break; - case B_TXT_ATK_TEAM: + case B_TXT_ATK_TEAM1: if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) - toCpy = sText_YourTeam; + toCpy = sText_Your1; else - toCpy = sText_OpposingTeam; + toCpy = sText_Opposing1; + break; + case B_TXT_ATK_TEAM2: + if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) + toCpy = sText_Your2; + else + toCpy = sText_Opposing2; break; } From bf708617984fd81c82c489d6dd24e0fd5657e688 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 2 Mar 2019 13:08:50 +0100 Subject: [PATCH 275/667] Powder moves on grass types --- data/battle_scripts_1.s | 13 +++++++++++++ include/battle_scripts.h | 1 + include/constants/hold_effects.h | 1 + include/constants/pokemon.h | 1 + src/battle_util.c | 25 +++++++++++++++++++++++-- src/data/battle_moves.h | 14 +++++++------- 6 files changed, 46 insertions(+), 9 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 869dd6e414..9aa89b055a 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5573,6 +5573,19 @@ BattleScript_MoveUsedIsParalyzed:: statusanimation BS_ATTACKER cancelmultiturnmoves BS_ATTACKER goto BattleScript_MoveEnd + +BattleScript_PowderMoveNoEffect:: + attackstring + ppreduce + pause 0x20 + jumpiftype BS_TARGET, TYPE_GRASS, BattleScript_PowderMoveNoEffectPrint + call BattleScript_AbilityPopUp +BattleScript_PowderMoveNoEffectPrint: + printstring STRINGID_ITDOESNTAFFECT + waitmessage 0x40 + cancelmultiturnmoves BS_ATTACKER + sethword gMoveResultFlags, MOVE_RESULT_FAILED + goto BattleScript_MoveEnd BattleScript_MoveUsedFlinched:: printstring STRINGID_PKMNFLINCHED diff --git a/include/battle_scripts.h b/include/battle_scripts.h index b0cf7ae0e6..4b665a7386 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -296,5 +296,6 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index ca4f08530f..54406d9614 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -111,6 +111,7 @@ // Gen6 hold effects #define HOLD_EFFECT_FAIRY_POWER 129 #define HOLD_EFFECT_MEGA_STONE 130 +#define HOLD_EFFECT_SAFETY_GOOGLES 131 // Gen7 hold effects #define HOLD_EFFECT_PROTECTIVE_PADS 149 diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 26863d89fe..d98dd351e1 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -103,6 +103,7 @@ #define FLAG_SOUND 0x10000 #define FLAG_BALLISTIC 0x20000 #define FLAG_PROTECTION_MOVE 0x40000 +#define FLAG_POWDER 0x80000 // Split defines. #define SPLIT_PHYSICAL 0x0 diff --git a/src/battle_util.c b/src/battle_util.c index c5b5bd3878..fbcb62a90d 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2012,7 +2012,8 @@ enum CANCELLER_IN_LOVE, CANCELLER_BIDE, CANCELLER_THAW, - CANCELLER_POWDER, + CANCELLER_POWDER_MOVE, + CANCELLER_POWDER_STATUS, CANCELLER_END, CANCELLER_PSYCHIC_TERRAIN, CANCELLER_END2, @@ -2303,7 +2304,27 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case CANCELLER_POWDER: + case CANCELLER_POWDER_MOVE: + if (gBattleMoves[gCurrentMove].flags & FLAG_POWDER) + { + if (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; diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 01c0b8d40e..3902259bb6 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -1088,7 +1088,7 @@ 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, }, @@ -1102,7 +1102,7 @@ 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, }, @@ -1116,7 +1116,7 @@ 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, }, @@ -2069,7 +2069,7 @@ 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, }, @@ -2503,7 +2503,7 @@ 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, }, @@ -6684,7 +6684,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 2, - .flags = 0, + .flags = FLAG_POWDER, .split = SPLIT_STATUS, }, @@ -8429,7 +8429,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 1, - .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, }, From 07f9bcad1053b1de4263098a7fd3abcef47c2b51 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sat, 2 Mar 2019 12:31:43 -0300 Subject: [PATCH 276/667] Swapped Keystone with Mega Bracelet. --- include/constants/items.h | 2 +- src/data/items.h | 8 ++++---- src/data/text/item_descriptions.h | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/include/constants/items.h b/include/constants/items.h index 212aef6e53..009228345b 100644 --- a/include/constants/items.h +++ b/include/constants/items.h @@ -571,7 +571,7 @@ #define ITEM_LOPPUNITE 476 #define ITEM_SALAMENCITE 477 #define ITEM_BEEDRILLITE 478 -#define ITEM_KEY_STONE 479 +#define ITEM_MEGA_BRACELET 479 // Gen7 hold effects #define ITEM_PROTECTIVE_PADS 480 diff --git a/src/data/items.h b/src/data/items.h index da20735922..4dbff706d9 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -8651,14 +8651,14 @@ const struct Item gItems[] = .secondaryId = 0, }, - [ITEM_KEY_STONE] = + [ITEM_MEGA_BRACELET] = { - .name = _("Key Stone"), - .itemId = ITEM_KEY_STONE, + .name = _("Mega Bracelet"), + .itemId = ITEM_MEGA_BRACELET, .price = 200, .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, - .description = gKeyStoneItemDescription, + .description = gMegaBraceletItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_KEY_ITEMS, diff --git a/src/data/text/item_descriptions.h b/src/data/text/item_descriptions.h index 96c9571dd9..6e2bf5f01b 100644 --- a/src/data/text/item_descriptions.h +++ b/src/data/text/item_descriptions.h @@ -425,5 +425,5 @@ const u8 gCameruptiteItemDescription[] = _("This stone enables\nCamerupt to Mega const u8 gLoppuniteItemDescription[] = _("This stone enables\nLoppunny to Mega\nEvolve in battle."); const u8 gSalamenciteItemDescription[] = _("This stone enables\nSalamence to Mega\nEvolve in battle."); const u8 gBeedrilliteItemDescription[] = _("This stone enables\nBeedrill to Mega\nEvolve in battle."); -const u8 gKeyStoneItemDescription[] = _("Allows Pokémon holding\na Mega Stone to Mega\nEvolve in battle."); +const u8 gMegaBraceletItemDescription[] = _("Allows Pokémon holding\na Mega Stone to Mega\nEvolve in battle."); const u8 gProtectPadsItemDescription[] = _("Protects the holder\nfrom effects caused\nby contact moves."); From e15c745cf56317ec399376dac1f5587171b4a5d6 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sat, 2 Mar 2019 12:35:11 -0300 Subject: [PATCH 277/667] Fixed 2 typos. Loppunite>Lopunnite and Loppunny>Lopunny. --- include/constants/items.h | 2 +- src/data/items.h | 8 ++++---- src/data/text/item_descriptions.h | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/include/constants/items.h b/include/constants/items.h index 009228345b..a26f5e7fd3 100644 --- a/include/constants/items.h +++ b/include/constants/items.h @@ -568,7 +568,7 @@ #define ITEM_GLALITITE 473 #define ITEM_DIANCITE 474 #define ITEM_CAMERUPTITE 475 -#define ITEM_LOPPUNITE 476 +#define ITEM_LOPUNNITE 476 #define ITEM_SALAMENCITE 477 #define ITEM_BEEDRILLITE 478 #define ITEM_MEGA_BRACELET 479 diff --git a/src/data/items.h b/src/data/items.h index 4dbff706d9..c13edcd847 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -8597,14 +8597,14 @@ const struct Item gItems[] = .secondaryId = 0, }, - [ITEM_LOPPUNITE] = + [ITEM_LOPUNNITE] = { - .name = _("Loppunite"), - .itemId = ITEM_LOPPUNITE, + .name = _("Lopunnite"), + .itemId = ITEM_LOPUNNITE, .price = 200, .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 0, - .description = gLoppuniteItemDescription, + .description = gLopunniteItemDescription, .importance = 0, .unk19 = 0, .pocket = POCKET_ITEMS, diff --git a/src/data/text/item_descriptions.h b/src/data/text/item_descriptions.h index 6e2bf5f01b..da99244160 100644 --- a/src/data/text/item_descriptions.h +++ b/src/data/text/item_descriptions.h @@ -422,7 +422,7 @@ const u8 gPidgeotiteItemDescription[] = _("This stone enables\nPidgeot to Mega\n const u8 gGlalititeItemDescription[] = _("This stone enables\nGlalie to Mega\nEvolve in battle."); const u8 gDianciteItemDescription[] = _("This stone enables\nDiancie to Mega\nEvolve in battle."); const u8 gCameruptiteItemDescription[] = _("This stone enables\nCamerupt to Mega\nEvolve in battle."); -const u8 gLoppuniteItemDescription[] = _("This stone enables\nLoppunny to Mega\nEvolve in battle."); +const u8 gLopunniteItemDescription[] = _("This stone enables\nLoppunny to Mega\nEvolve in battle."); const u8 gSalamenciteItemDescription[] = _("This stone enables\nSalamence to Mega\nEvolve in battle."); const u8 gBeedrilliteItemDescription[] = _("This stone enables\nBeedrill to Mega\nEvolve in battle."); const u8 gMegaBraceletItemDescription[] = _("Allows Pokémon holding\na Mega Stone to Mega\nEvolve in battle."); From 5c1cf3063f47e9a08ed06d0add88d74fe3c96edd Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sat, 2 Mar 2019 12:42:53 -0300 Subject: [PATCH 278/667] Implemented the sprites for the Gen. 6 items. --- .../items/icon_palettes/Kangaskhanite.pal | 19 +++ graphics/items/icon_palettes/abomasite.pal | 19 +++ graphics/items/icon_palettes/absolite.pal | 19 +++ .../items/icon_palettes/aerodactylite.pal | 19 +++ graphics/items/icon_palettes/aggronite.pal | 19 +++ graphics/items/icon_palettes/alakazite.pal | 19 +++ graphics/items/icon_palettes/altarianite.pal | 19 +++ graphics/items/icon_palettes/ampharosite.pal | 19 +++ graphics/items/icon_palettes/assault_vest.pal | 19 +++ graphics/items/icon_palettes/audinite.pal | 19 +++ graphics/items/icon_palettes/banettite.pal | 19 +++ graphics/items/icon_palettes/beedrillite.pal | 19 +++ .../items/icon_palettes/blastoisinite.pal | 19 +++ graphics/items/icon_palettes/blazikenite.pal | 19 +++ graphics/items/icon_palettes/cameruptite.pal | 19 +++ .../items/icon_palettes/charizardite_x.pal | 19 +++ .../items/icon_palettes/charizardite_y.pal | 19 +++ graphics/items/icon_palettes/diancite.pal | 19 +++ graphics/items/icon_palettes/galladite.pal | 19 +++ graphics/items/icon_palettes/garchompite.pal | 19 +++ graphics/items/icon_palettes/gardevoirite.pal | 19 +++ graphics/items/icon_palettes/gengarite.pal | 19 +++ graphics/items/icon_palettes/glalitite.pal | 19 +++ graphics/items/icon_palettes/gyaradosite.pal | 19 +++ graphics/items/icon_palettes/heracronite.pal | 19 +++ .../items/icon_palettes/houndoominite.pal | 19 +++ graphics/items/icon_palettes/latiasite.pal | 19 +++ graphics/items/icon_palettes/latiosite.pal | 19 +++ graphics/items/icon_palettes/lopunnite.pal | 19 +++ graphics/items/icon_palettes/lucarionite.pal | 19 +++ graphics/items/icon_palettes/manectite.pal | 19 +++ graphics/items/icon_palettes/mawilite.pal | 19 +++ graphics/items/icon_palettes/medichamite.pal | 19 +++ .../items/icon_palettes/mega_bracelet.pal | 19 +++ graphics/items/icon_palettes/metagrossite.pal | 19 +++ graphics/items/icon_palettes/mewtwonite_x.pal | 19 +++ graphics/items/icon_palettes/mewtwonite_y.pal | 19 +++ graphics/items/icon_palettes/pidgeotite.pal | 19 +++ graphics/items/icon_palettes/pinsirite.pal | 19 +++ graphics/items/icon_palettes/pixie_plate.pal | 19 +++ graphics/items/icon_palettes/sablenite.pal | 19 +++ graphics/items/icon_palettes/salamencite.pal | 19 +++ graphics/items/icon_palettes/sceptilite.pal | 19 +++ graphics/items/icon_palettes/scizorite.pal | 19 +++ graphics/items/icon_palettes/sharpedonite.pal | 19 +++ graphics/items/icon_palettes/slowbronite.pal | 19 +++ graphics/items/icon_palettes/steelixite.pal | 19 +++ graphics/items/icon_palettes/swampertite.pal | 19 +++ graphics/items/icon_palettes/tyranitarite.pal | 19 +++ graphics/items/icon_palettes/venusaurite.pal | 19 +++ graphics/items/icons/Kangaskhanite.png | Bin 0 -> 235 bytes graphics/items/icons/abomasite.png | Bin 0 -> 266 bytes graphics/items/icons/absolite.png | Bin 0 -> 225 bytes graphics/items/icons/aerodactylite.png | Bin 0 -> 264 bytes graphics/items/icons/aggronite.png | Bin 0 -> 235 bytes graphics/items/icons/alakazite.png | Bin 0 -> 232 bytes graphics/items/icons/altarianite.png | Bin 0 -> 227 bytes graphics/items/icons/ampharosite.png | Bin 0 -> 235 bytes graphics/items/icons/assault_vest.png | Bin 0 -> 251 bytes graphics/items/icons/audinite.png | Bin 0 -> 240 bytes graphics/items/icons/banettite.png | Bin 0 -> 235 bytes graphics/items/icons/beedrillite.png | Bin 0 -> 265 bytes graphics/items/icons/blastoisinite.png | Bin 0 -> 232 bytes graphics/items/icons/blazikenite.png | Bin 0 -> 235 bytes graphics/items/icons/cameruptite.png | Bin 0 -> 244 bytes graphics/items/icons/charizardite_x.png | Bin 0 -> 231 bytes graphics/items/icons/charizardite_y.png | Bin 0 -> 232 bytes graphics/items/icons/diancite.png | Bin 0 -> 237 bytes graphics/items/icons/galladite.png | Bin 0 -> 238 bytes graphics/items/icons/garchompite.png | Bin 0 -> 235 bytes graphics/items/icons/gardevoirite.png | Bin 0 -> 235 bytes graphics/items/icons/gengarite.png | Bin 0 -> 232 bytes graphics/items/icons/glalitite.png | Bin 0 -> 241 bytes graphics/items/icons/gyaradosite.png | Bin 0 -> 235 bytes graphics/items/icons/heracronite.png | Bin 0 -> 235 bytes graphics/items/icons/houndoominite.png | Bin 0 -> 235 bytes graphics/items/icons/latiasite.png | Bin 0 -> 235 bytes graphics/items/icons/latiosite.png | Bin 0 -> 235 bytes graphics/items/icons/lopunnite.png | Bin 0 -> 264 bytes graphics/items/icons/lucarionite.png | Bin 0 -> 333 bytes graphics/items/icons/manectite.png | Bin 0 -> 235 bytes graphics/items/icons/mawilite.png | Bin 0 -> 235 bytes graphics/items/icons/medichamite.png | Bin 0 -> 232 bytes graphics/items/icons/mega_bracelet.png | Bin 0 -> 267 bytes graphics/items/icons/metagrossite.png | Bin 0 -> 244 bytes graphics/items/icons/mewtwonite_x.png | Bin 0 -> 236 bytes graphics/items/icons/mewtwonite_y.png | Bin 0 -> 233 bytes graphics/items/icons/pidgeotite.png | Bin 0 -> 244 bytes graphics/items/icons/pinsirite.png | Bin 0 -> 235 bytes graphics/items/icons/pixie_plate.png | Bin 0 -> 243 bytes graphics/items/icons/sablenite.png | Bin 0 -> 240 bytes graphics/items/icons/salamencite.png | Bin 0 -> 244 bytes graphics/items/icons/sceptilite.png | Bin 0 -> 235 bytes graphics/items/icons/scizorite.png | Bin 0 -> 235 bytes graphics/items/icons/sharpedonite.png | Bin 0 -> 244 bytes graphics/items/icons/slowbronite.png | Bin 0 -> 244 bytes graphics/items/icons/steelixite.png | Bin 0 -> 240 bytes graphics/items/icons/swampertite.png | Bin 0 -> 234 bytes graphics/items/icons/tyranitarite.png | Bin 0 -> 235 bytes graphics/items/icons/venusaurite.png | Bin 0 -> 235 bytes include/graphics.h | 101 ++++++++++++ src/data/graphics/items.h | 152 ++++++++++++++++++ src/data/item_icon_table.h | 51 ++++++ 103 files changed, 1254 insertions(+) create mode 100755 graphics/items/icon_palettes/Kangaskhanite.pal create mode 100755 graphics/items/icon_palettes/abomasite.pal create mode 100755 graphics/items/icon_palettes/absolite.pal create mode 100755 graphics/items/icon_palettes/aerodactylite.pal create mode 100755 graphics/items/icon_palettes/aggronite.pal create mode 100755 graphics/items/icon_palettes/alakazite.pal create mode 100755 graphics/items/icon_palettes/altarianite.pal create mode 100755 graphics/items/icon_palettes/ampharosite.pal create mode 100755 graphics/items/icon_palettes/assault_vest.pal create mode 100755 graphics/items/icon_palettes/audinite.pal create mode 100755 graphics/items/icon_palettes/banettite.pal create mode 100755 graphics/items/icon_palettes/beedrillite.pal create mode 100755 graphics/items/icon_palettes/blastoisinite.pal create mode 100755 graphics/items/icon_palettes/blazikenite.pal create mode 100755 graphics/items/icon_palettes/cameruptite.pal create mode 100755 graphics/items/icon_palettes/charizardite_x.pal create mode 100755 graphics/items/icon_palettes/charizardite_y.pal create mode 100755 graphics/items/icon_palettes/diancite.pal create mode 100755 graphics/items/icon_palettes/galladite.pal create mode 100755 graphics/items/icon_palettes/garchompite.pal create mode 100755 graphics/items/icon_palettes/gardevoirite.pal create mode 100755 graphics/items/icon_palettes/gengarite.pal create mode 100755 graphics/items/icon_palettes/glalitite.pal create mode 100755 graphics/items/icon_palettes/gyaradosite.pal create mode 100755 graphics/items/icon_palettes/heracronite.pal create mode 100755 graphics/items/icon_palettes/houndoominite.pal create mode 100755 graphics/items/icon_palettes/latiasite.pal create mode 100755 graphics/items/icon_palettes/latiosite.pal create mode 100755 graphics/items/icon_palettes/lopunnite.pal create mode 100755 graphics/items/icon_palettes/lucarionite.pal create mode 100755 graphics/items/icon_palettes/manectite.pal create mode 100755 graphics/items/icon_palettes/mawilite.pal create mode 100755 graphics/items/icon_palettes/medichamite.pal create mode 100755 graphics/items/icon_palettes/mega_bracelet.pal create mode 100755 graphics/items/icon_palettes/metagrossite.pal create mode 100755 graphics/items/icon_palettes/mewtwonite_x.pal create mode 100755 graphics/items/icon_palettes/mewtwonite_y.pal create mode 100755 graphics/items/icon_palettes/pidgeotite.pal create mode 100755 graphics/items/icon_palettes/pinsirite.pal create mode 100755 graphics/items/icon_palettes/pixie_plate.pal create mode 100755 graphics/items/icon_palettes/sablenite.pal create mode 100755 graphics/items/icon_palettes/salamencite.pal create mode 100755 graphics/items/icon_palettes/sceptilite.pal create mode 100755 graphics/items/icon_palettes/scizorite.pal create mode 100755 graphics/items/icon_palettes/sharpedonite.pal create mode 100755 graphics/items/icon_palettes/slowbronite.pal create mode 100755 graphics/items/icon_palettes/steelixite.pal create mode 100755 graphics/items/icon_palettes/swampertite.pal create mode 100755 graphics/items/icon_palettes/tyranitarite.pal create mode 100755 graphics/items/icon_palettes/venusaurite.pal create mode 100755 graphics/items/icons/Kangaskhanite.png create mode 100755 graphics/items/icons/abomasite.png create mode 100755 graphics/items/icons/absolite.png create mode 100755 graphics/items/icons/aerodactylite.png create mode 100755 graphics/items/icons/aggronite.png create mode 100755 graphics/items/icons/alakazite.png create mode 100755 graphics/items/icons/altarianite.png create mode 100755 graphics/items/icons/ampharosite.png create mode 100755 graphics/items/icons/assault_vest.png create mode 100755 graphics/items/icons/audinite.png create mode 100755 graphics/items/icons/banettite.png create mode 100755 graphics/items/icons/beedrillite.png create mode 100755 graphics/items/icons/blastoisinite.png create mode 100755 graphics/items/icons/blazikenite.png create mode 100755 graphics/items/icons/cameruptite.png create mode 100755 graphics/items/icons/charizardite_x.png create mode 100755 graphics/items/icons/charizardite_y.png create mode 100755 graphics/items/icons/diancite.png create mode 100755 graphics/items/icons/galladite.png create mode 100755 graphics/items/icons/garchompite.png create mode 100755 graphics/items/icons/gardevoirite.png create mode 100755 graphics/items/icons/gengarite.png create mode 100755 graphics/items/icons/glalitite.png create mode 100755 graphics/items/icons/gyaradosite.png create mode 100755 graphics/items/icons/heracronite.png create mode 100755 graphics/items/icons/houndoominite.png create mode 100755 graphics/items/icons/latiasite.png create mode 100755 graphics/items/icons/latiosite.png create mode 100755 graphics/items/icons/lopunnite.png create mode 100755 graphics/items/icons/lucarionite.png create mode 100755 graphics/items/icons/manectite.png create mode 100755 graphics/items/icons/mawilite.png create mode 100755 graphics/items/icons/medichamite.png create mode 100755 graphics/items/icons/mega_bracelet.png create mode 100755 graphics/items/icons/metagrossite.png create mode 100755 graphics/items/icons/mewtwonite_x.png create mode 100755 graphics/items/icons/mewtwonite_y.png create mode 100755 graphics/items/icons/pidgeotite.png create mode 100755 graphics/items/icons/pinsirite.png create mode 100755 graphics/items/icons/pixie_plate.png create mode 100755 graphics/items/icons/sablenite.png create mode 100755 graphics/items/icons/salamencite.png create mode 100755 graphics/items/icons/sceptilite.png create mode 100755 graphics/items/icons/scizorite.png create mode 100755 graphics/items/icons/sharpedonite.png create mode 100755 graphics/items/icons/slowbronite.png create mode 100755 graphics/items/icons/steelixite.png create mode 100755 graphics/items/icons/swampertite.png create mode 100755 graphics/items/icons/tyranitarite.png create mode 100755 graphics/items/icons/venusaurite.png diff --git a/graphics/items/icon_palettes/Kangaskhanite.pal b/graphics/items/icon_palettes/Kangaskhanite.pal new file mode 100755 index 0000000000..dd50b3216f --- /dev/null +++ b/graphics/items/icon_palettes/Kangaskhanite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +184 160 248 +160 128 168 +128 96 96 +248 216 120 +216 192 248 +200 168 192 +192 160 104 +248 248 248 +184 160 232 +216 192 184 +248 240 248 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/abomasite.pal b/graphics/items/icon_palettes/abomasite.pal new file mode 100755 index 0000000000..173d17297b --- /dev/null +++ b/graphics/items/icon_palettes/abomasite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +136 160 232 +248 248 248 +48 136 120 +144 208 184 +200 216 208 +80 160 144 +144 208 176 +192 208 240 +104 168 192 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/absolite.pal b/graphics/items/icon_palettes/absolite.pal new file mode 100755 index 0000000000..5deff2aca3 --- /dev/null +++ b/graphics/items/icon_palettes/absolite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +88 104 160 +152 176 232 +248 248 248 +144 160 208 +200 216 240 +64 72 136 +128 144 192 +192 216 240 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/aerodactylite.pal b/graphics/items/icon_palettes/aerodactylite.pal new file mode 100755 index 0000000000..a0f921cfb3 --- /dev/null +++ b/graphics/items/icon_palettes/aerodactylite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +176 160 208 +64 64 64 +144 64 216 +208 208 248 +88 64 128 +160 80 232 +208 184 232 +248 248 248 +120 112 136 +160 160 168 +168 128 240 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/aggronite.pal b/graphics/items/icon_palettes/aggronite.pal new file mode 100755 index 0000000000..1bba14f16d --- /dev/null +++ b/graphics/items/icon_palettes/aggronite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +160 160 160 +120 120 120 +88 88 88 +208 208 248 +208 208 208 +200 200 200 +152 152 168 +248 248 248 +152 152 152 +192 192 192 +232 232 232 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/alakazite.pal b/graphics/items/icon_palettes/alakazite.pal new file mode 100755 index 0000000000..0d215cb94e --- /dev/null +++ b/graphics/items/icon_palettes/alakazite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +240 184 88 +176 120 152 +144 88 168 +192 208 216 +216 208 200 +208 160 200 +168 152 192 +248 248 248 +232 176 40 +208 192 152 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/altarianite.pal b/graphics/items/icon_palettes/altarianite.pal new file mode 100755 index 0000000000..ecb5f59359 --- /dev/null +++ b/graphics/items/icon_palettes/altarianite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +232 168 216 +136 184 240 +104 208 248 +144 216 248 +184 224 240 +248 248 248 +224 224 224 +224 192 216 +224 184 216 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/ampharosite.pal b/graphics/items/icon_palettes/ampharosite.pal new file mode 100755 index 0000000000..d99ebd6361 --- /dev/null +++ b/graphics/items/icon_palettes/ampharosite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +232 200 56 +248 120 104 +232 64 80 +192 200 232 +248 224 152 +248 176 152 +216 136 160 +248 248 248 +240 200 0 +216 200 120 +216 216 216 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/assault_vest.pal b/graphics/items/icon_palettes/assault_vest.pal new file mode 100755 index 0000000000..b68dfab9d6 --- /dev/null +++ b/graphics/items/icon_palettes/assault_vest.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +200 80 80 +144 48 56 +64 64 64 +96 72 80 +176 56 64 +0 0 0 +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/items/icon_palettes/audinite.pal b/graphics/items/icon_palettes/audinite.pal new file mode 100755 index 0000000000..502636ab7e --- /dev/null +++ b/graphics/items/icon_palettes/audinite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +248 240 208 +184 104 120 +232 104 136 +248 216 224 +240 176 192 +240 192 200 +240 224 208 +248 248 248 +240 200 184 +232 200 192 +224 184 184 +224 160 160 +240 232 208 +0 0 0 diff --git a/graphics/items/icon_palettes/banettite.pal b/graphics/items/icon_palettes/banettite.pal new file mode 100755 index 0000000000..a95929c2c6 --- /dev/null +++ b/graphics/items/icon_palettes/banettite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +80 80 80 +216 152 8 +248 200 24 +240 144 200 +255 255 255 +232 216 136 +248 176 112 +248 248 248 +64 64 64 +208 88 136 +184 184 208 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/beedrillite.pal b/graphics/items/icon_palettes/beedrillite.pal new file mode 100755 index 0000000000..2b25eaa3d5 --- /dev/null +++ b/graphics/items/icon_palettes/beedrillite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +192 184 224 +240 192 24 +56 56 56 +232 224 240 +200 160 8 +184 184 184 +128 104 32 +248 248 248 +216 192 128 +248 224 136 +144 120 40 +88 88 96 +120 120 136 +0 0 0 diff --git a/graphics/items/icon_palettes/blastoisinite.pal b/graphics/items/icon_palettes/blastoisinite.pal new file mode 100755 index 0000000000..4d8882ef59 --- /dev/null +++ b/graphics/items/icon_palettes/blastoisinite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +96 152 240 +88 112 128 +120 88 48 +184 184 184 +176 200 232 +152 136 112 +248 248 248 +64 128 240 +136 168 216 +208 208 208 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/blazikenite.pal b/graphics/items/icon_palettes/blazikenite.pal new file mode 100755 index 0000000000..4530ddbfdf --- /dev/null +++ b/graphics/items/icon_palettes/blazikenite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +216 88 80 +128 56 56 +56 56 56 +216 200 184 +240 168 208 +192 168 168 +136 128 120 +248 248 248 +208 56 56 +208 168 136 +240 240 176 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/cameruptite.pal b/graphics/items/icon_palettes/cameruptite.pal new file mode 100755 index 0000000000..1cc3270ca3 --- /dev/null +++ b/graphics/items/icon_palettes/cameruptite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +184 168 152 +120 96 88 +232 112 80 +200 200 200 +240 176 160 +208 136 120 +248 248 248 +72 72 64 +152 88 72 +152 144 136 +224 224 224 +128 120 112 +200 88 64 +136 80 64 diff --git a/graphics/items/icon_palettes/charizardite_x.pal b/graphics/items/icon_palettes/charizardite_x.pal new file mode 100755 index 0000000000..7073c040fc --- /dev/null +++ b/graphics/items/icon_palettes/charizardite_x.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +56 64 64 +72 96 168 +72 128 248 +72 184 248 +160 152 160 +176 200 248 +72 160 248 +248 248 248 +64 128 152 +136 232 248 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/charizardite_y.pal b/graphics/items/icon_palettes/charizardite_y.pal new file mode 100755 index 0000000000..ddc55c87f1 --- /dev/null +++ b/graphics/items/icon_palettes/charizardite_y.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +216 40 16 +248 176 0 +248 208 0 +216 152 112 +232 200 192 +232 184 56 +248 248 248 +200 24 0 +216 96 64 +216 192 184 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/diancite.pal b/graphics/items/icon_palettes/diancite.pal new file mode 100755 index 0000000000..45e04c8914 --- /dev/null +++ b/graphics/items/icon_palettes/diancite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +240 224 224 +208 152 80 +248 232 160 +240 192 208 +240 192 128 +248 248 248 +224 136 168 +240 184 160 +232 176 192 +232 160 184 +224 176 104 +208 112 136 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/galladite.pal b/graphics/items/icon_palettes/galladite.pal new file mode 100755 index 0000000000..fdc71e0e27 --- /dev/null +++ b/graphics/items/icon_palettes/galladite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +104 176 160 +144 120 128 +216 96 112 +232 232 216 +208 224 224 +232 168 184 +240 200 208 +248 248 248 +88 160 144 +176 208 208 +120 176 168 +216 152 160 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/garchompite.pal b/graphics/items/icon_palettes/garchompite.pal new file mode 100755 index 0000000000..79e932ef5c --- /dev/null +++ b/graphics/items/icon_palettes/garchompite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +152 56 64 +240 160 48 +248 216 56 +72 80 136 +216 136 136 +160 152 96 +248 248 248 +248 216 152 +200 32 32 +104 80 136 +80 120 224 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/gardevoirite.pal b/graphics/items/icon_palettes/gardevoirite.pal new file mode 100755 index 0000000000..c71a12daf7 --- /dev/null +++ b/graphics/items/icon_palettes/gardevoirite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +88 192 120 +168 112 120 +192 48 104 +176 192 232 +160 224 192 +160 168 152 +184 120 168 +248 248 248 +80 184 112 +144 200 160 +208 208 248 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/gengarite.pal b/graphics/items/icon_palettes/gengarite.pal new file mode 100755 index 0000000000..307b1a3b1e --- /dev/null +++ b/graphics/items/icon_palettes/gengarite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +96 56 200 +152 56 144 +208 56 80 +184 144 224 +192 184 248 +200 96 152 +248 248 248 +72 32 208 +144 96 208 +192 192 248 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/glalitite.pal b/graphics/items/icon_palettes/glalitite.pal new file mode 100755 index 0000000000..6cd95b0d82 --- /dev/null +++ b/graphics/items/icon_palettes/glalitite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +208 216 232 +104 112 112 +56 56 56 +152 200 216 +152 152 152 +128 136 144 +248 248 248 +64 152 184 +56 104 120 +136 184 208 +96 168 192 +56 96 112 +64 128 152 +0 0 0 diff --git a/graphics/items/icon_palettes/gyaradosite.pal b/graphics/items/icon_palettes/gyaradosite.pal new file mode 100755 index 0000000000..f485d4ef3c --- /dev/null +++ b/graphics/items/icon_palettes/gyaradosite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +40 96 240 +152 56 112 +208 32 48 +192 144 0 +144 168 248 +248 168 168 +200 88 24 +248 248 248 +16 64 232 +120 120 120 +208 184 152 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/heracronite.pal b/graphics/items/icon_palettes/heracronite.pal new file mode 100755 index 0000000000..6877ae795d --- /dev/null +++ b/graphics/items/icon_palettes/heracronite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +80 80 112 +208 64 8 +248 80 32 +248 216 56 +168 184 184 +248 152 128 +248 152 40 +248 248 248 +32 56 96 +208 160 0 +232 248 184 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/houndoominite.pal b/graphics/items/icon_palettes/houndoominite.pal new file mode 100755 index 0000000000..25f151408a --- /dev/null +++ b/graphics/items/icon_palettes/houndoominite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +96 80 88 +184 40 48 +248 32 32 +136 104 112 +184 160 160 +248 144 144 +192 64 72 +248 248 248 +56 56 64 +120 88 96 +152 144 168 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/latiasite.pal b/graphics/items/icon_palettes/latiasite.pal new file mode 100755 index 0000000000..f93e6a5053 --- /dev/null +++ b/graphics/items/icon_palettes/latiasite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +144 128 216 +192 80 152 +248 48 56 +184 184 248 +216 120 152 +184 192 248 +248 248 248 +248 160 208 +136 96 208 +160 160 240 +240 232 240 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/latiosite.pal b/graphics/items/icon_palettes/latiosite.pal new file mode 100755 index 0000000000..16c3521ad5 --- /dev/null +++ b/graphics/items/icon_palettes/latiosite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +144 128 216 +88 112 224 +40 128 240 +184 184 248 +112 160 248 +184 192 248 +248 248 248 +128 184 232 +136 96 208 +160 160 240 +240 232 240 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/lopunnite.pal b/graphics/items/icon_palettes/lopunnite.pal new file mode 100755 index 0000000000..1815667bb4 --- /dev/null +++ b/graphics/items/icon_palettes/lopunnite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +248 240 184 +72 56 56 +160 96 80 +248 248 248 +104 64 56 +200 168 160 +160 152 120 +160 152 152 +128 72 56 +112 80 64 +176 128 104 +200 168 136 +128 104 88 +0 0 0 diff --git a/graphics/items/icon_palettes/lucarionite.pal b/graphics/items/icon_palettes/lucarionite.pal new file mode 100755 index 0000000000..22e0961a7b --- /dev/null +++ b/graphics/items/icon_palettes/lucarionite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +112 152 208 +120 88 120 +136 32 32 +248 176 96 +160 192 200 +176 120 128 +192 120 64 +248 248 248 +72 136 176 +184 192 176 +208 208 224 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/manectite.pal b/graphics/items/icon_palettes/manectite.pal new file mode 100755 index 0000000000..860c8d0a39 --- /dev/null +++ b/graphics/items/icon_palettes/manectite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +96 168 208 +136 104 120 +224 56 56 +248 248 128 +176 200 224 +248 152 128 +224 152 72 +248 248 248 +72 152 192 +192 200 136 +240 240 240 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/mawilite.pal b/graphics/items/icon_palettes/mawilite.pal new file mode 100755 index 0000000000..688d41649f --- /dev/null +++ b/graphics/items/icon_palettes/mawilite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +112 96 112 +200 184 112 +200 120 168 +192 192 192 +248 248 96 +224 184 136 +248 248 248 +224 216 120 +64 64 80 +152 104 136 +176 176 208 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/medichamite.pal b/graphics/items/icon_palettes/medichamite.pal new file mode 100755 index 0000000000..f8b973bc3e --- /dev/null +++ b/graphics/items/icon_palettes/medichamite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +192 88 136 +224 96 80 +248 136 56 +120 176 208 +248 168 168 +184 160 136 +248 248 248 +192 32 104 +160 136 176 +176 200 192 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/mega_bracelet.pal b/graphics/items/icon_palettes/mega_bracelet.pal new file mode 100755 index 0000000000..8f34e18a12 --- /dev/null +++ b/graphics/items/icon_palettes/mega_bracelet.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +144 160 176 +88 112 128 +200 216 216 +64 80 96 +240 240 240 +176 72 152 +208 112 216 +32 112 24 +88 192 224 +96 200 80 +72 88 192 +184 200 80 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/metagrossite.pal b/graphics/items/icon_palettes/metagrossite.pal new file mode 100755 index 0000000000..d7115db596 --- /dev/null +++ b/graphics/items/icon_palettes/metagrossite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +160 168 144 +152 192 216 +200 200 200 +232 200 168 +232 232 232 +160 192 208 +128 184 208 +248 248 248 +216 152 80 +216 184 136 +160 160 144 +208 216 232 +176 160 128 +176 176 184 diff --git a/graphics/items/icon_palettes/mewtwonite_x.pal b/graphics/items/icon_palettes/mewtwonite_x.pal new file mode 100755 index 0000000000..f1db0ba0c4 --- /dev/null +++ b/graphics/items/icon_palettes/mewtwonite_x.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +152 80 128 +88 80 120 +48 112 136 +192 192 192 +216 176 216 +160 184 192 +120 152 168 +248 248 248 +128 56 104 +216 216 224 +192 160 184 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/mewtwonite_y.pal b/graphics/items/icon_palettes/mewtwonite_y.pal new file mode 100755 index 0000000000..c693248837 --- /dev/null +++ b/graphics/items/icon_palettes/mewtwonite_y.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +152 80 128 +160 80 136 +184 112 168 +192 192 192 +216 176 216 +192 152 184 +248 248 248 +128 56 104 +216 216 224 +192 160 184 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/pidgeotite.pal b/graphics/items/icon_palettes/pidgeotite.pal new file mode 100755 index 0000000000..5f81a5b2c4 --- /dev/null +++ b/graphics/items/icon_palettes/pidgeotite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +240 144 72 +192 120 152 +216 64 112 +240 192 128 +232 152 144 +224 104 88 +248 248 248 +240 232 120 +232 152 112 +240 192 96 +248 216 192 +240 168 80 +168 128 152 +240 184 88 diff --git a/graphics/items/icon_palettes/pinsirite.pal b/graphics/items/icon_palettes/pinsirite.pal new file mode 100755 index 0000000000..0a0fb5fbef --- /dev/null +++ b/graphics/items/icon_palettes/pinsirite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +152 120 112 +192 104 56 +248 80 32 +248 208 56 +200 176 152 +248 144 40 +248 248 248 +248 192 152 +128 96 88 +200 168 80 +248 248 224 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/pixie_plate.pal b/graphics/items/icon_palettes/pixie_plate.pal new file mode 100755 index 0000000000..b7559b5751 --- /dev/null +++ b/graphics/items/icon_palettes/pixie_plate.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +240 176 200 +248 208 248 +248 224 248 +248 192 224 +208 144 200 +192 112 160 +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/items/icon_palettes/sablenite.pal b/graphics/items/icon_palettes/sablenite.pal new file mode 100755 index 0000000000..e270a912a2 --- /dev/null +++ b/graphics/items/icon_palettes/sablenite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +224 40 88 +168 64 120 +120 88 152 +248 216 120 +184 168 200 +168 136 144 +240 144 168 +248 248 248 +240 144 104 +240 232 240 +232 104 96 +232 104 136 +192 80 152 +0 0 0 diff --git a/graphics/items/icon_palettes/salamencite.pal b/graphics/items/icon_palettes/salamencite.pal new file mode 100755 index 0000000000..315807ba5d --- /dev/null +++ b/graphics/items/icon_palettes/salamencite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +192 192 192 +16 112 152 +8 144 184 +240 168 168 +128 192 216 +96 168 192 +248 248 248 +224 88 88 +120 112 136 +200 168 168 +232 232 232 +208 136 136 +24 112 136 +176 72 72 diff --git a/graphics/items/icon_palettes/sceptilite.pal b/graphics/items/icon_palettes/sceptilite.pal new file mode 100755 index 0000000000..579e9c4198 --- /dev/null +++ b/graphics/items/icon_palettes/sceptilite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +80 96 80 +184 40 48 +248 32 32 +128 160 104 +168 192 160 +248 160 152 +192 96 64 +248 248 248 +64 64 64 +96 120 88 +192 208 120 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/scizorite.pal b/graphics/items/icon_palettes/scizorite.pal new file mode 100755 index 0000000000..abcba6719a --- /dev/null +++ b/graphics/items/icon_palettes/scizorite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +168 80 104 +104 32 24 +56 56 56 +168 216 224 +200 160 168 +144 144 144 +112 136 144 +248 248 248 +152 8 0 +168 144 168 +248 248 224 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/sharpedonite.pal b/graphics/items/icon_palettes/sharpedonite.pal new file mode 100755 index 0000000000..ac7dd92e89 --- /dev/null +++ b/graphics/items/icon_palettes/sharpedonite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +200 200 224 +208 168 72 +248 216 120 +160 192 216 +248 232 184 +224 208 176 +248 248 248 +32 112 168 +144 168 144 +144 168 208 +232 232 240 +112 160 200 +208 192 136 +136 168 200 diff --git a/graphics/items/icon_palettes/slowbronite.pal b/graphics/items/icon_palettes/slowbronite.pal new file mode 100755 index 0000000000..41785ae70c --- /dev/null +++ b/graphics/items/icon_palettes/slowbronite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +184 200 184 +224 184 80 +240 232 128 +248 184 192 +240 240 184 +216 216 152 +248 248 248 +240 128 136 +240 176 128 +200 176 168 +224 232 232 +224 152 152 +216 192 128 +216 96 104 diff --git a/graphics/items/icon_palettes/steelixite.pal b/graphics/items/icon_palettes/steelixite.pal new file mode 100755 index 0000000000..f0b9626fcd --- /dev/null +++ b/graphics/items/icon_palettes/steelixite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +144 152 176 +160 168 192 +200 232 240 +128 200 240 +176 192 208 +248 248 248 +8 152 224 +104 192 232 +112 152 192 +200 208 216 +72 152 200 +176 200 216 +152 192 216 +0 0 0 diff --git a/graphics/items/icon_palettes/swampertite.pal b/graphics/items/icon_palettes/swampertite.pal new file mode 100755 index 0000000000..a35c06e7e0 --- /dev/null +++ b/graphics/items/icon_palettes/swampertite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +232 104 88 +96 128 144 +72 80 88 +112 176 216 +232 168 160 +176 208 224 +104 144 168 +248 248 248 +168 104 104 +176 144 152 +136 160 192 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/tyranitarite.pal b/graphics/items/icon_palettes/tyranitarite.pal new file mode 100755 index 0000000000..579e9c4198 --- /dev/null +++ b/graphics/items/icon_palettes/tyranitarite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +80 96 80 +184 40 48 +248 32 32 +128 160 104 +168 192 160 +248 160 152 +192 96 64 +248 248 248 +64 64 64 +96 120 88 +192 208 120 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/venusaurite.pal b/graphics/items/icon_palettes/venusaurite.pal new file mode 100755 index 0000000000..3aadc10929 --- /dev/null +++ b/graphics/items/icon_palettes/venusaurite.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +48 48 48 +24 128 128 +184 72 136 +248 80 192 +96 168 200 +152 192 168 +176 152 184 +176 128 200 +248 248 248 +16 104 72 +40 144 184 +120 216 216 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icons/Kangaskhanite.png b/graphics/items/icons/Kangaskhanite.png new file mode 100755 index 0000000000000000000000000000000000000000..2b614703e38d2771cc6eec04b53e3bccf1098b47 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pTV1_nD8{8-Siq9GyS$Bl{`2Y#Gbap1s$j2}OK>{#&P#(^C_KKzhNnEDT>g|Q^a zFPOpM*^M+HC&|;rF+}2Wa>4>G0TGuZZR^98J&CGv3z-7?GM<%8zviIQ$3Eq-#4erF zM_E_(8J1kt5*81aNWZ@7Xu-LQ3qn`N)GRpG$+XlbVcE$RwzWof9Gk!Ryik&6+);c^ fgFC5QLzRKyvaBR~i{&I~pluAEu6{1-oD!MiJoBT9tHtq4H-t_l zhJ4B}G;3Rx98y%sX=c_`IBmy{Lza%O^z@D`3wYep5OlIJ;IhlqE3uanWR3->eh-WMz*q+lin>#G7cUidHZ06Eyx)z4*}Q$iB}1-50} literal 0 HcmV?d00001 diff --git a/graphics/items/icons/absolite.png b/graphics/items/icons/absolite.png new file mode 100755 index 0000000000000000000000000000000000000000..786aab073225147f5a5ff59dc5f810b27c623796 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}H0G|-o z{|pTV1_lus3ubJ1@#Dvj2@5WqxbeZkqoZNMfde-_yooS>0946X666=m;PC858jzFd z>Eak7aXC3*0hfS?OOm$r;mV$6ih0MF0{RL%W_xc^6gtj(D$zubx4f`%RkDemetuzL zTj8zK+7ITObbI<#Z(hLTmc}4m;f2dQrKG2BKWNco+}oYTbzrV>u(QB!XH7Ec0 U^QIsD4YZ8G)78&qol`;+0B1>2zW@LL literal 0 HcmV?d00001 diff --git a/graphics/items/icons/aerodactylite.png b/graphics/items/icons/aerodactylite.png new file mode 100755 index 0000000000000000000000000000000000000000..e94dee670619a175b7c9f754b0ecea7bb5093009 GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wg8-ip*Z&L+1_lNj7F=*}aG2n5 z5e^Lt0$yC$@#4pi9~A{13l^+c(eMGN90HV_U7dg|fs!D<;QtK&QNYEbXgQ!9 zXMsm#F#`kN5fEmas?8@26io7TaSV}|nw+qJOF+aWY5L5Al|53k*G^$sAhYn?&12mn z6D`65_!duc@7`z_BD;7}xA&%vf<47Yj`E)43@R@)G;5VoXPM&FHdAfYl6RBDI5wMv noU|29(`-)2klgfm!i_0F%i09r*BoNH4|1rdtDnm{r-UW|x8Y-6 literal 0 HcmV?d00001 diff --git a/graphics/items/icons/aggronite.png b/graphics/items/icons/aggronite.png new file mode 100755 index 0000000000000000000000000000000000000000..db5dab16fb579217673407709a109129e7a82f50 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pTV1_lcjEU2ich=_=|aN);=3l~nDI5A_!iXT6I%$PCbz<~oVUc4}S6aEgUg|Q^a zFPOpM*^M+HC&|;rF+}2Wa>4>G0TGuZZR^98J&CGv3z-7?GM<%8zviIQ$3Eq-#4erF zM_E_(8J1kt5*81aNWZ@7Xu-LQ3qn`N)GRpG$+XlbVcE$RwzWof9Gk!Ryik&6+);c^ fgFC5QLzRKyvaBR~i{&I~pluAEu6{1-oD!MNS%G|&0G|-o z{|pTV1_mE?L~N*-F(G2bfeSZoTsU!I!HE?!4*dA>%lD75X%AQ13xrIyteHqV6reAYV>0_UASYnsX>7%Tx z`V331Y6**nOQc_4b+q8zl?9=zV{8^4>ttH$ld#OQjcu*bJdVvJX)lz#8Fv(?X>li& cYp60X)F?<;q|}-?0c~UOboFyt=akR{027E*Bme*a literal 0 HcmV?d00001 diff --git a/graphics/items/icons/altarianite.png b/graphics/items/icons/altarianite.png new file mode 100755 index 0000000000000000000000000000000000000000..ca88b000290569e65a0458d3e66eb60f683600af GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}T0G|-o z{|pTV1_m!y-00ZxA>+c22{(T1c<|xJj~@?!;J}RsJ8rNDEOG-XW-JNv3ubV5b|VeQ zN$_-W43W5;oUnjPK*S|U+xl>2&nm@pUQ7Xf0aYuzCn^aYmpqjil6AVEuyIv#$g39| zg@sLpX(d|@S^7rF%Ie7lJZ@NS%G}@0G|-o z{|pTV1_m!qSp2BSc;OIm;KYj`4`%$>FyltYf*(JAd^o{y<3z=c8#h`PGpqq>VJr#q z3ubV5b|VeQN%C}Y43W5;oUnjPK*S|U+xl>2PvT3tg-ii`8P80nUvp6DW1n(ZVwcY8 zqpYj?3`?$R35$nIq+efkwBX#u1)-~BY8D*pWLoNzuFVdQ&MBb@0PnF{@Bjb+ literal 0 HcmV?d00001 diff --git a/graphics/items/icons/assault_vest.png b/graphics/items/icons/assault_vest.png new file mode 100755 index 0000000000000000000000000000000000000000..c42928b8bf0680ab74e147e93555e6d1ac80b9aa GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}f0G|-o z{|pTV1_mbr0wx$(I5;>Ycm!;)aA^LtjuWVWu_VYZn8D%MjWi&q#nZ(xMB;MqnLw_? z3OsBNDwvIL-ka@kfAs|BE#KHaGps)RTRzcH?3;lE@1!Tp{~2O*+JDHJC&}swR5HA^ zepIU(w!@`bGxh1x|8+}ZP8AF12UcnKWzJDPSGl;+VYA7`J!x#u;#&>}?0ve_%Ujp4 vO=4%(Z~g<<6!mwrMTq-6U-#*6>^lBl73q}=R=dv!x`)Bj)z4*}Q$iB}teRQ- literal 0 HcmV?d00001 diff --git a/graphics/items/icons/audinite.png b/graphics/items/icons/audinite.png new file mode 100755 index 0000000000000000000000000000000000000000..71aaf06af6efee6b73e6cf38f392f17bf8bc1bfb GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}r0G|-o z{|pTV1_nPqT-cFO@gk$+$BhRcHXQhH;KYXq7k>Qs@!`ad7bgxp*svNypz@Va!EmG=SQ+6>K`x=?Jy?o~~W2v$8 m*F3HRbB#Z*RVZr@Vq#FgCsw$pe19&`G6qjqKbLh*2~7aDvtxh& literal 0 HcmV?d00001 diff --git a/graphics/items/icons/banettite.png b/graphics/items/icons/banettite.png new file mode 100755 index 0000000000000000000000000000000000000000..7b3565ba6b9f31a0adb6d242ddd7b2f61d0f5577 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pTV1_l8E0XJrF{5T=;VZw?3|NpCjxCl+w**s-G_L*d7dA2$v({CLnYp+X}fBB7$91E{H3UP%Z@36uo+1^;LGj{+_h zMau!@I14-?iy0XBj({-ZRBb+KpkT76i(`ny)Z~N(Tmm94N!bwxDtlhdUORUh?`;QVy4?ABVNS%G|&0G|-o z{|pTV1_lW;K138WR74o;*s){7i5D|E3V!_f;n47*W5taN7cTH`o34>G0TGuZZR^98J&Bs{7BU6&Ww_1u&QuUOE_*7GXYRC@kC;M_ zOIQ^z>+II<*NS%G}@0G|-o z{|pTV1_n1G0vaqp;Kqp^A68sAuwq3=L&c9DKQ35UTv*ZZ;lqYE+D=D-S{O@${DK)A zp4~_Ta*{k<977~7Cnqf65)g4o(zZTa*^{U$w~#5IFXLIs^lJ_(ee6>XOYG7)eUx=o zpJB;WEn)F+iS+BMjuxD|xFB?OOwEF0olHx85|*88VOwit$Fcc~&kH4K#vR4yG`N$> cHB=cGF3U=?w^&Y+2HM8p>FVdQ&MBb@0D0_FvH$=8 literal 0 HcmV?d00001 diff --git a/graphics/items/icons/cameruptite.png b/graphics/items/icons/cameruptite.png new file mode 100755 index 0000000000000000000000000000000000000000..f064b6da2eb4916d0b568f93fead1392a4a4e558 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G|m0G|-o z{|pTV1_nD;%&16+cu^2=;>3v$8x~yXsQB^Yhlhv5j0lez6FMF|c+gN$a3aE?Bfvpg zJzN>6m$4+sFPOpM*^M+HC&|;rF+}2Wa>4>G0TGuZZR^98J*za|c`*g_1-Q)io~R^r zT=rCA$SkRskC;M_uP`ZoCM2#dk^cNlWWhPbyEBbrYZe^iWL!G$fY0Q>OLKp|Q#f#c%3b=;;7@s&p_K4JYD@<);T3K0RZJ%TpIuY literal 0 HcmV?d00001 diff --git a/graphics/items/icons/charizardite_x.png b/graphics/items/icons/charizardite_x.png new file mode 100755 index 0000000000000000000000000000000000000000..a2986c638f52f6e870fc594c33f329a4bf004cbd GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G|&0G|-o z{|pTV1_l-m4ju_BJQ{v@?D(-@#)1teet0bS0R#>WGdf=U=vC^<0;*>$3GxeOaCmkj z4aiCKba4!kxSX7@fJ;EcB}v=*aAi-Ts@y`RfWC}pCDX4tsPwTUCDtHQZgnAL0M0iVfyyh0}TI5wA*ub8lv;g03*sjM5VrwB1H XM3)P#aFaL!@&JRUtDnm{r-UW|^At{; literal 0 HcmV?d00001 diff --git a/graphics/items/icons/charizardite_y.png b/graphics/items/icons/charizardite_y.png new file mode 100755 index 0000000000000000000000000000000000000000..f193100ed65ad9482efa57a97d2c8e63c96af687 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G|&0G|-o z{|pTV1_n1Y1b%E__;G>Z#*Bg&Cl0*WVe#X~j}sCMHxe9f9N1wXXZ8xHp0OmzFPOpM z*^M+HC&|;rF+}2Wa>4>G0TGuZZR^98J&Bs{7BU6&Ww_1u&QuUOE_*7GXYRC@kC;M_ zOIQ^z>+II<*NS%G}50G|-o z{|pTV1_mDGGj~@>@R(#m8;KhamFBa^0up#3@L5JS@lM{iu z7)yfuf*Bm1-ADs+5&8&@TVym~R?(Ib|}YhJu)Del^0Z54B8;W19erF{o{gu^ervk2zcyd`Gk_ZNS%G}50G|-o z{|pTV1_l`$7EGvUxRFrs;>C>%4<5W&vE##u3qOARh*&UT!-WeK8&=$yvEbv&t;>MA z7)yfuf*Bm1-ADs+l001;LnJOICoJF+5OGP;wmw|hlc*}UkSU-q<5|h{YYr-X>{AX) z?9w@Xlyy~~VaZi3VexQ@^y{mR7M!~>BXo6)&B9}yOiR}t@R`ih8(CVebmr2`h242v j2j&_FhYRd>)?{Reye#E#BD9DfXd8p4tDnm{r-UW|@=06= literal 0 HcmV?d00001 diff --git a/graphics/items/icons/garchompite.png b/graphics/items/icons/garchompite.png new file mode 100755 index 0000000000000000000000000000000000000000..0be15d5addac84a26b0af7f9762cad203e8e86ca GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pTV1_m=M96l^C_;JI+BcS6(N5_I02|s|~#*7mR3K;<%0TmBU9cyd_YGEu1@(X5g zcy=QV$Vu{aaSV~ToSd+LOF+aWN!$8xWly5!yM;^veHm`cy)zYrj?11(NS%G}@0G|-o z{|pTV1_luaDpnL!95Be(aNxy)2L~3cn6aZ`#g8990(KNkII-Zug&$&P>|!;-67!s6i)>DN~sEjV{^LFnq3ngz!?nU?w_EIZl4w${jwWAhiE7fRBMJBrU~ ga3_^(s4_4dTP^Y9^P7!dfwnPty85}Sb4q9e0GlRQ%>V!Z literal 0 HcmV?d00001 diff --git a/graphics/items/icons/gengarite.png b/graphics/items/icons/gengarite.png new file mode 100755 index 0000000000000000000000000000000000000000..22ac015b9a0f180feccbc23a26e1bebcd0880c03 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G|&0G|-o z{|pTV1_lWhCuUeoxL^^mW5R<2JARxd#}J9j$q5U%1Vmhtw5<aCwPybDC6sOXM!=l1W<`?pW@g%DT~d ciVy>XK(Y9y_{6F|K-(BRUHx3vIVCg!0J9rZe*gdg literal 0 HcmV?d00001 diff --git a/graphics/items/icons/glalitite.png b/graphics/items/icons/glalitite.png new file mode 100755 index 0000000000000000000000000000000000000000..cea93a2cb362edf6d3f02ad141b5cd47dfefe757 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}r0G|-o z{|pTV1_l>yyvQghu&}V0apJ~|88aF>Cj9vE!(qk_i;Rkn9TyT-9I!|zaA=q@Ls{7q zsFATG$S;_|;n|HeAScPw#W6(Ua&p1~E&&mjByH=%l|8F8-+3_w^aZ%g_MWIDbX@jS zV#qA1myei2kFPK(ekLTYE|LEHOk{!Id6H>ZfOV#Pgv%u@$$@`s~nrRIA`AD kW!zD06~~!WuA$1n5Sb|MDR}M42B2*Wp00i_>zopr0K{)qkpKVy literal 0 HcmV?d00001 diff --git a/graphics/items/icons/gyaradosite.png b/graphics/items/icons/gyaradosite.png new file mode 100755 index 0000000000000000000000000000000000000000..5a6278df2729b5ca51dfe8f66a19eb4ee3d6bc91 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pTV1_l}lA7)q-Tu?ALFo9vhiXT5#tT+)N@#Du20f!eA6%`kD%rILf@DQklu_VYZ zn8D%MjWi%9$%)~jiK=o7nF9JUo|R0$=AhEYKIO2)E}hdy zSy%NLmR!{m77v$5zrN~d!MTeILRZJsEI8K5wA3eI*~u2RwMKRvo4@$HP?BccQG8B= eJE>elm4V^1tR#DjNS%G}@0G|-o z{|pTV1_l8E1s5DRegr7|xM8tk$BrK}8h*^s`0?Y1f|p!hb^xe_u_VYZ zn8D%MjWi%9$%)~jiK=o7nF9JUo|R0$=AhEYKIO2)E}hdy zSy%NLmR!{m77v$5zrN~d!MTeILRZJsEI8K5wA3eI*~u2RwMKRvo4@$HP?BccQG8B= eJE>elm4V^1tR#DjNS%G}@0G|-o z{|pTV1_lWM5j!*tekdq(WEAXJu;9mp2?rcJe*E}hVc}2_kuYPz3eCgDKY&^oOM?7@ z862M7NCR?`JY5_^BrYc>EZ`ClaY@p)K3v(8s4BORDWEUoS;_Qk4k~@@Qw~e)(m8#U zbyc5X$yF_3@o#L3yoV&OnbahP4f@7UbOMMcSoor!SYh=f<`HRmBC27VT#pg7* elgc$z85l0hO0u_DPLc-N#^CAd=d#Wzp$PzHE>J4~ literal 0 HcmV?d00001 diff --git a/graphics/items/icons/latiasite.png b/graphics/items/icons/latiasite.png new file mode 100755 index 0000000000000000000000000000000000000000..af1d357ee59511f3b83fc5426ebb887f664c6526 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pTV1_l!vZX5`h@x#Dk$BrL2DrW3B@B;)ET%lD75X%AQq0m&Dsj#-ZcEnGZvHD4g$t%|o-vvEX;J7g_QYxPG~-j08OqN|raHdi cTgt+~V1HhU;m{IZFQ9Dzopr0M^x5F#rGn literal 0 HcmV?d00001 diff --git a/graphics/items/icons/latiosite.png b/graphics/items/icons/latiosite.png new file mode 100755 index 0000000000000000000000000000000000000000..f6d4e7d23798f35ee7874cc2aa823c9b40db43f4 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pTV1_l!vZbTG3&}jIuW5mdKI;Vst0Cy@^d;kCd literal 0 HcmV?d00001 diff --git a/graphics/items/icons/lopunnite.png b/graphics/items/icons/lopunnite.png new file mode 100755 index 0000000000000000000000000000000000000000..dcd8d95746daf109d6cafcbf606c8bedac154b58 GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wg8-ip*Z&L+1_lN{KJ4(Yuvm}~ z@Z-mi3Xt_t4bg1l*22Y#3kkMgdSh<%4N4?8J)Ur53IjvdZNd0iS|N-;+Za4u{an^LB{Ts5QkiF( literal 0 HcmV?d00001 diff --git a/graphics/items/icons/lucarionite.png b/graphics/items/icons/lucarionite.png new file mode 100755 index 0000000000000000000000000000000000000000..ea4955c8a0ce049d135b42f8f9e92691c877fc72 GIT binary patch literal 333 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xuOw2s0AyFYmfkNUX zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0X@1Z$2yso`Xnqn*}}Hg$c|(47oQhO(leIwG^J0ODBFHy84Cl$Wm!pfmpM7pL2mMN L^>bP0l+XkK;@oa% literal 0 HcmV?d00001 diff --git a/graphics/items/icons/manectite.png b/graphics/items/icons/manectite.png new file mode 100755 index 0000000000000000000000000000000000000000..af70ce0ae18d8f9f4699b06cd2be30edd4e784ee GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pTV1_lW$E_7s6Jg~6%@uOkGi3dMsG(4E$@#Du2j~NFJoap%Q;luM|_l<#C7)yfu zf*Bm1-ADs+l001;LnJOICoJF+5OGP;wmw|hlc*}UkSU-q<5|h{YYr-X>{AX)?9w@X zlyy~~VaZi3VexQ@^y{mR7M#1dAar$1&4Oc{OiO(dmYr;2TWe&;vH6S73ngjB9mVG~ fxRc5?R2dj9%Sy7hSWc1#+Q#7N>gTe~DWM4fRSs6e literal 0 HcmV?d00001 diff --git a/graphics/items/icons/mawilite.png b/graphics/items/icons/mawilite.png new file mode 100755 index 0000000000000000000000000000000000000000..8505274fdf0903ab19b5cee83fa335b736e0c046 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pTV1_lKQ1t)eCoTylF;J|?&KN247==kyD$AcRc4h{h`GCDSFxL};`a0;k}u_VYZ zn8D%MjWi%9$Soq~IpdHU>{uKbLh*2~7Y)q*nX@ literal 0 HcmV?d00001 diff --git a/graphics/items/icons/medichamite.png b/graphics/items/icons/medichamite.png new file mode 100755 index 0000000000000000000000000000000000000000..e494b4c03daa4439ec84ca14e0266d34950e1884 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G|&0G|-o z{|pTV1_lQrIvykh{OGW#*l^*;iWNH+bo}`74>G0TGuZZR^98J&Bs{7BU6&Ww_1u&QuUOE_*7GXYRC@kC;M_ zOIQ^z>+II<*NS%G}50G|-o z{|pTV1_l!rY=|gmIC0~KLqNiZ4<9yo%(zf+L!m$-;=qH169FC(2X>qYXeqj>0Mx}; z666=m;PC858jw@(>Eak75uTi|fJs0kAt6DeWz$q1Nr{%J2W;G)UvOY!yBHwMD4;HS zh?BYaj*sJ<2ONS%G|m0G|-o z{|pTV1_ldOOqg-t#)%UrUYuC*;>C*v2QD=1xbWl0j~g=rZtUn-uwcT48!t92XxOk} z$8M*_T|m8zB|(0{3=Yq3qyafeo-U3d5|@(`7H|oOxFl&?AFk|KrTI>lDWK2giOKXX zHad+ZoO&lSc-1z}RJ(m~`>X%1 rGnSTHPx~XbGf;38_EKKwlR3R`njxgN@xNAASh&R literal 0 HcmV?d00001 diff --git a/graphics/items/icons/mewtwonite_x.png b/graphics/items/icons/mewtwonite_x.png new file mode 100755 index 0000000000000000000000000000000000000000..5085bf2213ea691b9bfb3a3ac9eadd81ae1b18fd GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pTV1_m<%8X^KJ3<^3995`@e!;J+y4phuo@#Dvj28)avHy#{VutOt+@d{82V@Z%- zFoVOh8)-mJvZsq@3EG6nQyJS&-g%|WG)eac~pT{@?a zvaaegEV-&BEFLc5o_#gRB0c-Us!+Xq0gqjr{nr{b&Qz0?+H$Hw`OKxe3%l2_J~(%C gtxm_?g;N+9GTuoz75;Ut23p79>FVdQ&MBb@0O>ealK=n! literal 0 HcmV?d00001 diff --git a/graphics/items/icons/mewtwonite_y.png b/graphics/items/icons/mewtwonite_y.png new file mode 100755 index 0000000000000000000000000000000000000000..25209bb393bfb8736e1378f296fdbfde5b44cbf7 GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G|&0G|-o z{|pTV1_m<%8Wsd}>?l}q;J|?!8*Ut!vE#>&9}N~6H*P#QuwX}i^;AQkdd89wwQ>F5X$0dj!&6uDakE##HcpO_11; dcL81u4C|MQ{oQeVtv=8?22WQ%mvv4FO#o`DR)zoo literal 0 HcmV?d00001 diff --git a/graphics/items/icons/pidgeotite.png b/graphics/items/icons/pidgeotite.png new file mode 100755 index 0000000000000000000000000000000000000000..8cc9ab6b176fac532c7fb2176b985133ced58979 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G|m0G|-o z{|pTV1_mD{cpRvhal@hD!-0kuGbTL9i1_j2$A=dcFJ=Hm5`Nq`@L@&3iiQ~mdKI;Vst0CeeKZvX%Q literal 0 HcmV?d00001 diff --git a/graphics/items/icons/pinsirite.png b/graphics/items/icons/pinsirite.png new file mode 100755 index 0000000000000000000000000000000000000000..a201c320c0240f83b14ccf4a8419e5e6afd6f0cd GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pTV1_m=K3Jzpg{0LC^alzumh8aI5X#441t>pcclGAirP+ zhi5m^fSe>x7sn8Z%gG4~xCBI8lC-T4SN0@ozFWu?(3j!1+&fc2=(y~uM4s4bPaiRb z9+%jaHMO%_yJvIu)g+7O85dTC>e&T6c4-V!Gq{}M)Ep)$-x67+Rx+`d;f`hc6xNN_ cQ-l~87HpI_UXkh30JM$4)78&qol`;+0Q#3z1^@s6 literal 0 HcmV?d00001 diff --git a/graphics/items/icons/pixie_plate.png b/graphics/items/icons/pixie_plate.png new file mode 100755 index 0000000000000000000000000000000000000000..4c34f22aba95d480536c3c3c73f899a4b1ef62ff GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NSwWHkJ|V9E z85#@>3_ff)@#Dge9}j-~IPl=YgcAn}7OaYeHBN#kg{an^LB{Ts5NDWv1 literal 0 HcmV?d00001 diff --git a/graphics/items/icons/sablenite.png b/graphics/items/icons/sablenite.png new file mode 100755 index 0000000000000000000000000000000000000000..ad348b4352b97d25f999cc2b5e78a642a4950f13 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}r0G|-o z{|pTV1_lo_B33w5R7A}9aie0#iW4h3CVZH%;>V94A0}jcc=6#yM#77XjspQRUc`nf z0W~s~1o;IsI6S+N2IM4qx;TbNTux3{z$GB!lB8{YxUwfv^W8$GfWD09CetrDsPtJ+ zIV`d2;*&>Ap~odwElGLwi0iRVP*7X(wqqKaJ1d-fg;~939`KpW*BfYbk7IL5`HFR0 k8SYr_e$SayuA$1npubxr>(l-=W1wXWp00i_>zopr08MaPQ2+n{ literal 0 HcmV?d00001 diff --git a/graphics/items/icons/salamencite.png b/graphics/items/icons/salamencite.png new file mode 100755 index 0000000000000000000000000000000000000000..557cc29d7dd50a2d897f5982f00833253fda5241 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G|m0G|-o z{|pTV1_lQX91tj&!7*XShZQRt4%|psap1>~9}glTDhfJItXT2l#fu9a9TEi{8$3Lo z+^g*Z>SZhm@(X5gcy=QV$Vu{aaSV~ToSd+LOF+aWN!$8xWzQpX0#X;%D;}%G!gN7+z;ftT^hp@iWji22WQ%mvv4FO#sISUw{Ar literal 0 HcmV?d00001 diff --git a/graphics/items/icons/sceptilite.png b/graphics/items/icons/sceptilite.png new file mode 100755 index 0000000000000000000000000000000000000000..ba61c74aac5ef06efac52f6e0f0258591d0298b7 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pTV1_l8M0XsAdekdq3EXY`KV8M?CGY%v;{P^+1!NDP+BI3Y>iZ6|{w zx~k8xNS%G}@0G|-o z{|pTV1_mnvGBOk-EG#Tm+<0(e!HNkJCKPl``0?Y%3=W1B6IT5A@!-Ez*gT*X#*!ev zUNS%G|m0G|-o z{|pTV1_mciJh-sJs3bBmwNS14-_Vq$omEwSRLNS%G|m0G|-o z{|pTV1_nD$?0B#v;KPfCA3F|w_^{)~jTt|F{P@t&@nJ*5i47|rym;|o#*7;W8g3+H z%&a^b0o2P_666=m;PC858jzFZ>Eak7aXC3*0hfS?OOm$r;mV#>n(w@r0{Q}6W_wRm z5;`t>Dluf1)XPUqp~qL46h9LZSC>eCekQWuoZ{V?#<4XEj&U+Bop-=za^R)8Ki?^w qxn%71`98;ixy8@sE0nbdF)_T(mRNDrapPy8Z492SelF{r5}E)Fpk$T+ literal 0 HcmV?d00001 diff --git a/graphics/items/icons/steelixite.png b/graphics/items/icons/steelixite.png new file mode 100755 index 0000000000000000000000000000000000000000..fa2a8209e654050392cdcccdc7fe708ea4e40d24 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}r0G|-o z{|pTV1_l#mY*?`3z=;6BllH%s8>(#ElsTZhSU7 z`yZ&0u_VYZn8D%MjWi%9(bL5-MB;LC!U8S<5tk%w>%)~jt2Fbxm;(9&DrS05QW84O zdnz#`tGA%AaaD52s~0mKJz{yh=EaMaVzZYeB|9pddxe?2VjE|wtzB}tuw41frMq6W m+gTr+yZJXvV7Id-BZHuYIDf&hjhld$F?hQAxvXNS%G}@0G|-o z{|pTV1_m!OA`%)VcmzZgY`F1a#exkN9%M{d@#Dvj6&V>DCd}wqaNt0DPcBdkV@Z%- zFoVOh8)-mJqNj^vh{WaOgaupzA}&eV)`u&55>@3EG6nQyJS&-g%|WG)eac~pRnwk4 zVhTMjv1-YdBS%G#-CVMS_4$-z8k#$IIQI&(dg(UKRFjihyk(U@T4v>nb483hick4- eCY5WbGBA`kiF`CJ**^(r8H1;*pUXO@geCyMl2zvb literal 0 HcmV?d00001 diff --git a/graphics/items/icons/tyranitarite.png b/graphics/items/icons/tyranitarite.png new file mode 100755 index 0000000000000000000000000000000000000000..ba61c74aac5ef06efac52f6e0f0258591d0298b7 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pTV1_l8M0XsAdekdq3EXY`KV8M?CGY%v;{P^+1!NDP+BI3Y>iZ6|{w zx~k8xNS%G}@0G|-o z{|pTV1_lxh4LdwKegqsySaD*;ffXBO?AXw7;>V940vR3}6LwVGxbe@F=OIuFV@Z%- zFoVOh8)-mJlBbJfh{WaOgaupzA}&eV)`u&55?{(KWD4lZcxE#FnuAIo`;@~HyL3(; zWnI;0SaMZMSUg-J{rak-1?Mg<2wfdhv*1`K(^8*=WhYzM)*9JyZ2sc&LP?r&NAWog f?xb=JRR)G*t0jJXezWl_&^887S3j3^P6 Date: Sat, 2 Mar 2019 12:59:38 -0300 Subject: [PATCH 279/667] Oops. NOW I fixed the 2nd typo. --- src/data/text/item_descriptions.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/text/item_descriptions.h b/src/data/text/item_descriptions.h index da99244160..8654900d47 100644 --- a/src/data/text/item_descriptions.h +++ b/src/data/text/item_descriptions.h @@ -422,7 +422,7 @@ const u8 gPidgeotiteItemDescription[] = _("This stone enables\nPidgeot to Mega\n const u8 gGlalititeItemDescription[] = _("This stone enables\nGlalie to Mega\nEvolve in battle."); const u8 gDianciteItemDescription[] = _("This stone enables\nDiancie to Mega\nEvolve in battle."); const u8 gCameruptiteItemDescription[] = _("This stone enables\nCamerupt to Mega\nEvolve in battle."); -const u8 gLopunniteItemDescription[] = _("This stone enables\nLoppunny to Mega\nEvolve in battle."); +const u8 gLopunniteItemDescription[] = _("This stone enables\nLopunny to Mega\nEvolve in battle."); const u8 gSalamenciteItemDescription[] = _("This stone enables\nSalamence to Mega\nEvolve in battle."); const u8 gBeedrilliteItemDescription[] = _("This stone enables\nBeedrill to Mega\nEvolve in battle."); const u8 gMegaBraceletItemDescription[] = _("Allows Pokémon holding\na Mega Stone to Mega\nEvolve in battle."); From 5c3d755ac634d59b50f80b9b54a3b2e22909d585 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 2 Mar 2019 22:48:55 +0100 Subject: [PATCH 280/667] Effect Spore not affected by overcoat --- src/battle_util.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/battle_util.c b/src/battle_util.c index fbcb62a90d..66f32f36aa 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3258,6 +3258,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && TARGET_TURN_DAMAGED && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GRASS) + && GetBattlerAbility(gBattlerAttacker) != ABILITY_OVERCOAT + && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOOGLES && (Random() % 10) == 0) { do From cfd50eb65a3c630b8ed2c4b5141e1842ed0df266 Mon Sep 17 00:00:00 2001 From: Papa Cancer Date: Thu, 28 Feb 2019 14:02:54 +0000 Subject: [PATCH 281/667] Grassy Terrain + minor fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Includes strings for all Fixes: ・Psychic Terrain blocks priority if the TARGET is grounded, not the user ・Psychic Terrain no longer targets an opponent ・Terrains no longer boost (or nerf, for Misty) the power of certain moves if the affect mon is semi-invulnerable ・Small fix: Meteor Mash corrected to being a physical attack --- asm/macros/battle_script.inc | 5 +++++ data/battle_scripts_1.s | 17 +++++++++++++++++ include/battle_scripts.h | 2 ++ include/constants/battle_script_commands.h | 1 + include/constants/battle_string_ids.h | 4 ++++ src/battle_message.c | 13 +++++++++++++ src/battle_script_commands.c | 16 ++++++++++++++++ src/battle_util.c | 17 +++++++++++------ src/data/battle_moves.h | 4 ++-- 9 files changed, 71 insertions(+), 8 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 890202a0c8..b3438cd12d 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1592,6 +1592,11 @@ .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 @ helpful macros .macro setstatchanger stat:req, stages:req, down:req diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 087dbd4b4e..971a566dc8 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6155,6 +6155,23 @@ BattleScript_MoveUsedPsychicTerrainPrevents:: waitmessage 0x40 goto BattleScript_MoveEnd +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 | HITMARKER_GRUDGE + healthbarupdate BS_ATTACKER + datahpupdate BS_ATTACKER +BattleScript_GrassyTerrainLoopIncrement:: + jumpifbyte CMP_NOT_EQUAL, gBattleOutcome, 0, BattleScript_GrassyTerrainLoopEnd + addbyte gBattleCommunication, 0x1 + jumpifbytenotequal gBattleCommunication, gBattlersCount, BattleScript_GrassyTerrainLoop +BattleScript_GrassyTerrainLoopEnd:: + bicword gHitMarker, HITMARKER_x20 | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 | HITMARKER_GRUDGE + end2 + BattleScript_AbilityNoSpecificStatLoss:: pause 0x20 call BattleScript_AbilityPopUp diff --git a/include/battle_scripts.h b/include/battle_scripts.h index b9378cb32e..a3687ddbe5 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -296,5 +296,7 @@ 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_GrassyTerrainLoop[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index ac815da69e..23fbf75b3c 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -137,6 +137,7 @@ #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 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 745fc5469c..48737382b7 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -519,6 +519,10 @@ #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 BATTLESTRINGS_COUNT 529 diff --git a/src/battle_message.c b/src/battle_message.c index 7034931f01..a6d52fd510 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -644,6 +644,10 @@ static const u8 sText_PowderExplodes[] = _("When the flame touched the powder\no 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!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { @@ -1153,6 +1157,10 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [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[] = @@ -1160,6 +1168,11 @@ 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 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 61d60c0466..ceaa5ece3a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6368,6 +6368,22 @@ static void atk76_various(void) switch (gBattlescriptCurrInstr[2]) { + case VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS: + if ((gStatuses3[gActiveBattler] & (STATUS3_SEMI_INVULNERABLE)) || BATTLER_MAX_HP(gActiveBattler) || !(IsBattlerGrounded(gActiveBattler))) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + return; + } + gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage *= -1; + + if (gAbsentBattlerFlags & gBitTable[gBattlerAttacker]) + gBattleMoveDamage = 0; + + gBattlescriptCurrInstr += 7; + return; case VARIOUS_GRAVITY_ON_AIRBORNE_MONS: if (gStatuses3[gActiveBattler] & STATUS3_ON_AIR) CancelMultiTurnMoves(gActiveBattler); diff --git a/src/battle_util.c b/src/battle_util.c index c93821477f..a5bee1ae17 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1256,6 +1256,11 @@ u8 DoFieldEndTurnEffects(void) gBattleStruct->turnCountersTracker++; break; case ENDTURN_GRASSY_TERRAIN: + if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN) + { + BattleScriptExecute(BattleScript_GrassyTerrainLoop); + effect++; + } if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && --gFieldTimers.grassyTerrainTimer == 0) { gFieldStatuses &= ~(STATUS_FIELD_GRASSY_TERRAIN); @@ -2344,7 +2349,7 @@ u8 AtkCanceller_UnableToUseMove2(void) gBattleStruct->atkCancellerTracker++; case CANCELLER_PSYCHIC_TERRAIN: if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN - && IsBattlerGrounded(gBattlerAttacker) + && IsBattlerGrounded(gBattlerTarget) && GetChosenMovePriority(gBattlerAttacker) > 0 && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget)) { @@ -5159,7 +5164,7 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe case EFFECT_BULLDOZE: case EFFECT_MAGNITUDE: case EFFECT_EARTHQUAKE: - if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && IsBattlerGrounded(battlerDef)) + if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && !(gStatuses3[battlerDef] & STATUS3_SEMI_INVULNERABLE)) MulModifier(&modifier, UQ_4_12(0.5)); break; case EFFECT_KNOCK_OFF: @@ -5175,13 +5180,13 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe 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)) + if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && moveType == TYPE_GRASS && IsBattlerGrounded(battlerAtk) && !(gStatuses3[battlerAtk] & STATUS3_SEMI_INVULNERABLE)) MulModifier(&modifier, UQ_4_12(1.5)); - if (gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN && moveType == TYPE_DRAGON && IsBattlerGrounded(battlerDef)) + 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)) + if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && moveType == TYPE_ELECTRIC && IsBattlerGrounded(battlerAtk) && !(gStatuses3[battlerAtk] & STATUS3_SEMI_INVULNERABLE)) MulModifier(&modifier, UQ_4_12(1.5)); - if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN && moveType == TYPE_PSYCHIC && IsBattlerGrounded(battlerAtk)) + if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN && moveType == TYPE_PSYCHIC && IsBattlerGrounded(battlerAtk) && !(gStatuses3[battlerAtk] & STATUS3_SEMI_INVULNERABLE)) MulModifier(&modifier, UQ_4_12(1.5)); return ApplyModifier(modifier, basePower); diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index ed39e27f52..6e21f43473 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -4339,7 +4339,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 | FLAG_IRON_FIST_BOOST, - .split = SPLIT_SPECIAL, + .split = SPLIT_PHYSICAL, }, [MOVE_ASTONISH] = @@ -9003,7 +9003,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 0, .pp = 10, .secondaryEffectChance = 0, - .target = MOVE_TARGET_SELECTED, + .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, .split = SPLIT_STATUS, From 7a8f524bc590cf1468afd2ee3ee7a1d85ca72fbb Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 6 Mar 2019 12:09:34 +0100 Subject: [PATCH 282/667] Proper Roar handling in double battles --- asm/macros/battle_script.inc | 5 ++ data/battle_scripts_1.s | 29 ++++---- include/battle_scripts.h | 3 +- include/battle_util.h | 2 + include/constants/battle_script_commands.h | 1 + src/battle_script_commands.c | 81 ++++++++++++---------- 6 files changed, 73 insertions(+), 48 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 4ce3df4d1e..63ef3861b8 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1597,6 +1597,11 @@ various \battler, VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS .4byte \ptr .endm + + .macro jumpifroarfails ptr:req + various BS_ATTACKER, VARIOUS_JUMP_IF_ROAR_FAILS + .4byte \ptr + .endm @ helpful macros .macro setstatchanger stat:req, stages:req, down:req diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e168bb36d9..ab594e81d5 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2123,6 +2123,7 @@ 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 @@ -4967,18 +4968,9 @@ BattleScript_BideNoEnergyToAttack:: printstring STRINGID_PKMNUNLEASHEDENERGY 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 @@ -4986,6 +4978,19 @@ BattleScript_TrainerBattleForceOut:: printstring STRINGID_PKMNWASDRAGGEDOUT 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_MistProtected:: pause 0x20 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 587d866abc..098eda042c 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -53,7 +53,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[]; diff --git a/include/battle_util.h b/include/battle_util.h index d1f0b72592..d056fb018c 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -38,6 +38,8 @@ #define WEATHER_HAS_EFFECT ((!ABILITY_ON_FIELD(ABILITY_CLOUD_NINE) && !ABILITY_ON_FIELD(ABILITY_AIR_LOCK))) +#define IS_WHOLE_SIDE_ALIVE(battler)((IsBattlerAlive(battler) && IsBattlerAlive(BATTLE_PARTNER(battler)))) + u8 GetBattlerForBattleScript(u8 caseId); void PressurePPLose(u8 target, u8 attacker, u16 move); void PressurePPLoseOnUsingPerishSong(u8 attacker); diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 23fbf75b3c..b79184d231 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -138,6 +138,7 @@ #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 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 4838fc8e2c..29fb9cddc4 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6368,6 +6368,21 @@ static void atk76_various(void) 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_CHECK_IF_GRASSY_TERRAIN_HEALS: if ((gStatuses3[gActiveBattler] & (STATUS3_SEMI_INVULNERABLE)) || BATTLER_MAX_HP(gActiveBattler) @@ -8027,27 +8042,6 @@ static void atk8E_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 atk8F_forcerandomswitch(void) { s32 i; @@ -8060,14 +8054,26 @@ static void atk8F_forcerandomswitch(void) s32 validMons = 0; s32 minNeeded = 0; - 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 (BATTLE_TWO_VS_ONE_OPPONENT && (gBattlerTarget & BIT_SIDE) == B_SIDE_OPPONENT) + if (BATTLE_TWO_VS_ONE_OPPONENT && GetBattlerSide(gBattlerTarget) == B_SIDE_OPPONENT) { firstMonId = 0; lastMonId = 6; @@ -8175,19 +8181,20 @@ static void atk8F_forcerandomswitch(void) } else { - if (TryDoForceSwitchOut()) + *(gBattleStruct->field_58 + gBattlerTarget) = gBattlerPartyIndexes[gBattlerTarget]; + gBattlescriptCurrInstr = BattleScript_RoarSuccessSwitch; + + do { - do - { - 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); + 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()) @@ -8208,7 +8215,11 @@ static void atk8F_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); } } From 666e2ac58451eac4e8b4b37b5fe46a9c627c0c93 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 6 Mar 2019 12:13:37 +0100 Subject: [PATCH 283/667] Fix allowing the player to run from wild double battles --- data/battle_scripts_1.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index ab594e81d5..603e2c5ce9 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4410,7 +4410,7 @@ BattleScript_GiveExp:: BattleScript_HandleFaintedMon:: 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 From 36421d81eb60fffc8b7f093fcee3d4564f88c6ca Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 6 Mar 2019 15:07:25 -0300 Subject: [PATCH 284/667] Reordered the Item IDs a little bit, in order to include battle items like the Gen. 5 Gems and the Gen. 7 Seeds. --- include/constants/items.h | 129 ++++++++++++++++++++++---------------- 1 file changed, 76 insertions(+), 53 deletions(-) diff --git a/include/constants/items.h b/include/constants/items.h index a26f5e7fd3..bdd4212e11 100644 --- a/include/constants/items.h +++ b/include/constants/items.h @@ -519,64 +519,87 @@ #define ITEM_SHOCK_DRIVE 427 #define ITEM_BURN_DRIVE 428 #define ITEM_CHILL_DRIVE 429 - +#define ITEM_FIRE_GEM 430 +#define ITEM_WATER_GEM 431 +#define ITEM_ELECTRIC_GEM 432 +#define ITEM_GRASS_GEM 433 +#define ITEM_ICE_GEM 434 +#define ITEM_FIGHTING_GEM 435 +#define ITEM_POISON_GEM 436 +#define ITEM_GROUND_GEM 437 +#define ITEM_FLYING_GEM 438 +#define ITEM_PSYCHIC_GEM 439 +#define ITEM_BUG_GEM 440 +#define ITEM_ROCK_GEM 441 +#define ITEM_GHOST_GEM 442 +#define ITEM_DRAGON_GEM 443 +#define ITEM_DARK_GEM 444 +#define ITEM_STEEL_GEM 445 +#define ITEM_NORMAL_GEM 446 +#define ITEM_FAIRY_GEM 447 // Gen6 Items -#define ITEM_ASSAULT_VEST 430 -#define ITEM_PIXIE_PLATE 431 -#define ITEM_GENGARITE 432 -#define ITEM_GARDEVOIRITE 433 -#define ITEM_AMPHAROSITE 434 -#define ITEM_VENUSAURITE 435 -#define ITEM_CHARIZARDITE_X 436 -#define ITEM_BLASTOISINITE 437 -#define ITEM_MEWTWONITE_X 438 -#define ITEM_MEWTWONITE_Y 439 -#define ITEM_BLAZIKENITE 440 -#define ITEM_MEDICHAMITE 441 -#define ITEM_HOUNDOOMINITE 442 -#define ITEM_AGGRONITE 443 -#define ITEM_BANETTITE 444 -#define ITEM_TYRANITARITE 445 -#define ITEM_SCIZORITE 446 -#define ITEM_PINSIRITE 447 -#define ITEM_AERODACTYLITE 448 -#define ITEM_LUCARIONITE 449 -#define ITEM_ABOMASITE 450 -#define ITEM_KANGASKHANITE 451 -#define ITEM_GYARADOSITE 452 -#define ITEM_ABSOLITE 453 -#define ITEM_CHARIZARDITE_Y 454 -#define ITEM_ALAKAZITE 455 -#define ITEM_HERACRONITE 456 -#define ITEM_MAWILITE 457 -#define ITEM_MANECTITE 458 -#define ITEM_GARCHOMPITE 459 -#define ITEM_LATIASITE 460 -#define ITEM_LATIOSITE 461 -#define ITEM_SWAMPERTITE 462 -#define ITEM_SCEPTILITE 463 -#define ITEM_SABLENITE 464 -#define ITEM_ALTARIANITE 465 -#define ITEM_GALLADITE 466 -#define ITEM_AUDINITE 467 -#define ITEM_METAGROSSITE 468 -#define ITEM_SHARPEDONITE 469 -#define ITEM_SLOWBRONITE 470 -#define ITEM_STEELIXITE 471 -#define ITEM_PIDGEOTITE 472 -#define ITEM_GLALITITE 473 -#define ITEM_DIANCITE 474 -#define ITEM_CAMERUPTITE 475 -#define ITEM_LOPUNNITE 476 -#define ITEM_SALAMENCITE 477 -#define ITEM_BEEDRILLITE 478 -#define ITEM_MEGA_BRACELET 479 +#define ITEM_ASSAULT_VEST 448 +#define ITEM_PIXIE_PLATE 449 +#define ITEM_GENGARITE 450 +#define ITEM_GARDEVOIRITE 451 +#define ITEM_AMPHAROSITE 452 +#define ITEM_VENUSAURITE 453 +#define ITEM_CHARIZARDITE_X 454 +#define ITEM_BLASTOISINITE 455 +#define ITEM_MEWTWONITE_X 456 +#define ITEM_MEWTWONITE_Y 457 +#define ITEM_BLAZIKENITE 458 +#define ITEM_MEDICHAMITE 459 +#define ITEM_HOUNDOOMINITE 460 +#define ITEM_AGGRONITE 461 +#define ITEM_BANETTITE 462 +#define ITEM_TYRANITARITE 463 +#define ITEM_SCIZORITE 464 +#define ITEM_PINSIRITE 465 +#define ITEM_AERODACTYLITE 466 +#define ITEM_LUCARIONITE 467 +#define ITEM_ABOMASITE 468 +#define ITEM_KANGASKHANITE 469 +#define ITEM_GYARADOSITE 470 +#define ITEM_ABSOLITE 471 +#define ITEM_CHARIZARDITE_Y 472 +#define ITEM_ALAKAZITE 473 +#define ITEM_HERACRONITE 474 +#define ITEM_MAWILITE 475 +#define ITEM_MANECTITE 476 +#define ITEM_GARCHOMPITE 477 +#define ITEM_LATIASITE 478 +#define ITEM_LATIOSITE 479 +#define ITEM_SWAMPERTITE 480 +#define ITEM_SCEPTILITE 481 +#define ITEM_SABLENITE 482 +#define ITEM_ALTARIANITE 483 +#define ITEM_GALLADITE 484 +#define ITEM_AUDINITE 485 +#define ITEM_METAGROSSITE 486 +#define ITEM_SHARPEDONITE 487 +#define ITEM_SLOWBRONITE 488 +#define ITEM_STEELIXITE 489 +#define ITEM_PIDGEOTITE 490 +#define ITEM_GLALITITE 491 +#define ITEM_DIANCITE 492 +#define ITEM_CAMERUPTITE 493 +#define ITEM_LOPUNNITE 494 +#define ITEM_SALAMENCITE 495 +#define ITEM_BEEDRILLITE 496 +#define ITEM_MEGA_BRACELET 497 // Gen7 hold effects -#define ITEM_PROTECTIVE_PADS 480 +#define ITEM_PROTECTIVE_PADS 498 +#define ITEM_TERRAIN_EXTENDER 499 +#define ITEM_ELECTRIC_SEED 500 +#define ITEM_GRASSY_SEED 501 +#define ITEM_MISTY_SEED 502 +#define ITEM_PSYCHIC_SEED 503 +#define ITEM_ADRENALINE_ORB 504 -#define ITEMS_COUNT 481 +#define ITEMS_COUNT 505 #define ITEM_FIELD_ARROW ITEMS_COUNT #define FIRST_BERRY_INDEX ITEM_CHERI_BERRY From 7dc39298d6e34db1023af0e581979894f9d88c50 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 6 Mar 2019 15:29:00 -0300 Subject: [PATCH 285/667] Added a new hold effect for the Gen. 5 gems. --- include/constants/hold_effects.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index 54406d9614..7a506bb8d2 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -107,6 +107,7 @@ #define HOLD_EFFECT_ASSAULT_VEST 117 #define HOLD_EFFECT_BINDING_BAND 118 #define HOLD_EFFECT_DRIVE 119 +#define HOLD_EFFECT_GEMS 120 // Gen6 hold effects #define HOLD_EFFECT_FAIRY_POWER 129 From 5f58b531a24ed1227f13fba951946698a3c4c8ee Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 6 Mar 2019 15:29:58 -0300 Subject: [PATCH 286/667] Added item data for the Gen. 5 gems. --- src/data/items.h | 324 ++++++++++++++++++++++++++++++ src/data/text/item_descriptions.h | 18 ++ 2 files changed, 342 insertions(+) diff --git a/src/data/items.h b/src/data/items.h index c13edcd847..872e54cf76 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -7769,6 +7769,330 @@ const struct Item gItems[] = .secondaryId = 0, }, + [ITEM_FIRE_GEM] = + { + .name = _("Fire Gem"), + .itemId = ITEM_FIRE_GEM, + .price = 200, + .holdEffect = HOLD_EFFECT_GEMS, + .holdEffectParam = 0, + .description = gFireGemItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_WATER_GEM] = + { + .name = _("Water Gem"), + .itemId = ITEM_WATER_GEM, + .price = 200, + .holdEffect = HOLD_EFFECT_GEMS, + .holdEffectParam = 0, + .description = gWaterGemItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_ELECTRIC_GEM] = + { + .name = _("Electric Gem"), + .itemId = ITEM_ELECTRIC_GEM, + .price = 200, + .holdEffect = HOLD_EFFECT_GEMS, + .holdEffectParam = 0, + .description = gElectricGemItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_GRASS_GEM] = + { + .name = _("Grass Gem"), + .itemId = ITEM_GRASS_GEM, + .price = 200, + .holdEffect = HOLD_EFFECT_GEMS, + .holdEffectParam = 0, + .description = gGrassGemItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_ICE_GEM] = + { + .name = _("Ice Gem"), + .itemId = ITEM_ICE_GEM, + .price = 200, + .holdEffect = HOLD_EFFECT_GEMS, + .holdEffectParam = 0, + .description = gIceGemItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_FIGHTING_GEM] = + { + .name = _("Fighting Gem"), + .itemId = ITEM_FIGHTING_GEM, + .price = 200, + .holdEffect = HOLD_EFFECT_GEMS, + .holdEffectParam = 0, + .description = gFightingGemItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_POISON_GEM] = + { + .name = _("Poison Gem"), + .itemId = ITEM_POISON_GEM, + .price = 200, + .holdEffect = HOLD_EFFECT_GEMS, + .holdEffectParam = 0, + .description = gPoisonGemItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_GROUND_GEM] = + { + .name = _("Ground Gem"), + .itemId = ITEM_GROUND_GEM, + .price = 200, + .holdEffect = HOLD_EFFECT_GEMS, + .holdEffectParam = 0, + .description = gGroundGemItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_FLYING_GEM] = + { + .name = _("Flying Gem"), + .itemId = ITEM_FLYING_GEM, + .price = 200, + .holdEffect = HOLD_EFFECT_GEMS, + .holdEffectParam = 0, + .description = gFlyingGemItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_PSYCHIC_GEM] = + { + .name = _("Psychic Gem"), + .itemId = ITEM_PSYCHIC_GEM, + .price = 200, + .holdEffect = HOLD_EFFECT_GEMS, + .holdEffectParam = 0, + .description = gPsychicGemItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_BUG_GEM] = + { + .name = _("Bug Gem"), + .itemId = ITEM_BUG_GEM, + .price = 200, + .holdEffect = HOLD_EFFECT_GEMS, + .holdEffectParam = 0, + .description = gBugGemItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_ROCK_GEM] = + { + .name = _("Rock Gem"), + .itemId = ITEM_ROCK_GEM, + .price = 200, + .holdEffect = HOLD_EFFECT_GEMS, + .holdEffectParam = 0, + .description = gRockGemItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_GHOST_GEM] = + { + .name = _("Ghost Gem"), + .itemId = ITEM_GHOST_GEM, + .price = 200, + .holdEffect = HOLD_EFFECT_GEMS, + .holdEffectParam = 0, + .description = gGhostGemItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_DRAGON_GEM] = + { + .name = _("Dragon Gem"), + .itemId = ITEM_DRAGON_GEM, + .price = 200, + .holdEffect = HOLD_EFFECT_GEMS, + .holdEffectParam = 0, + .description = gDragonGemItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_DARK_GEM] = + { + .name = _("Dark Gem"), + .itemId = ITEM_DARK_GEM, + .price = 200, + .holdEffect = HOLD_EFFECT_GEMS, + .holdEffectParam = 0, + .description = gDarkGemItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_STEEL_GEM] = + { + .name = _("Steel Gem"), + .itemId = ITEM_STEEL_GEM, + .price = 200, + .holdEffect = HOLD_EFFECT_GEMS, + .holdEffectParam = 0, + .description = gSteelGemItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_NORMAL_GEM] = + { + .name = _("Normal Gem"), + .itemId = ITEM_NORMAL_GEM, + .price = 200, + .holdEffect = HOLD_EFFECT_GEMS, + .holdEffectParam = 0, + .description = gNormalGemItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_FAIRY_GEM] = + { + .name = _("Fairy Gem"), + .itemId = ITEM_FAIRY_GEM, + .price = 200, + .holdEffect = HOLD_EFFECT_GEMS, + .holdEffectParam = 0, + .description = gFairyGemItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + [ITEM_ASSAULT_VEST] = { .name = _("Assault Vest"), diff --git a/src/data/text/item_descriptions.h b/src/data/text/item_descriptions.h index 8654900d47..ac87732511 100644 --- a/src/data/text/item_descriptions.h +++ b/src/data/text/item_descriptions.h @@ -378,6 +378,24 @@ const u8 gDouseDriveItemDescription[] = _("Changes Genesect's\nTechno Blast so i const u8 gShockDriveItemDescription[] = _("Changes Genesect's\nTechno Blast so it\nbecomes Electric type."); const u8 gBurnDriveItemDescription[] = _("Changes Genesect's\nTechno Blast so it\nbecomes Fire type."); const u8 gChillDriveItemDescription[] = _("Changes Genesect's\nTechno Blast so it\nbecomes Ice type."); +const u8 gFireGemItemDescription[] = _("Increases the\npower of Fire\nType moves."); +const u8 gWaterGemItemDescription[] = _("Increases the\npower of Water\nType moves."); +const u8 gElectricGemItemDescription[] = _("Increases the\npower of Electric\nType moves."); +const u8 gGrassGemItemDescription[] = _("Increases the\npower of Grass\nType moves."); +const u8 gIceGemItemDescription[] = _("Increases the\npower of Ice\nType moves."); +const u8 gFightingGemItemDescription[] = _("Increases the\npower of Fighting\nType moves."); +const u8 gPoisonGemItemDescription[] = _("Increases the\npower of Poison\nType moves."); +const u8 gGroundGemItemDescription[] = _("Increases the\npower of Ground\nType moves."); +const u8 gFlyingGemItemDescription[] = _("Increases the\npower of Flying\nType moves."); +const u8 gPsychicGemItemDescription[] = _("Increases the\npower of Psychic\nType moves."); +const u8 gBugGemItemDescription[] = _("Increases the\npower of Bug\nType moves."); +const u8 gRockGemItemDescription[] = _("Increases the\npower of Rock\nType moves."); +const u8 gGhostGemItemDescription[] = _("Increases the\npower of Ghost\nType moves."); +const u8 gDragonGemItemDescription[] = _("Increases the\npower of Dragon\nType moves."); +const u8 gDarkGemItemDescription[] = _("Increases the\npower of Dark\nType moves."); +const u8 gSteelGemItemDescription[] = _("Increases the\npower of Steel\nType moves."); +const u8 gNormalGemItemDescription[] = _("Increases the\npower of Normal\nType moves."); +const u8 gFairyGemItemDescription[] = _("Increases the\npower of Fairy\nType moves."); const u8 gAssaultVestItemDescription[] = _("Raises Sp. Def but\nprevents the use of\nstatus moves."); const u8 gPixiePlateItemDescription[] = _("A stone tablet that\nboosts the power of\nFairy-type moves."); const u8 gGengariteItemDescription[] = _("This stone enables\nGengar to Mega\nEvolve in battle."); From ee8b72e68ce2a572b34e206c69bdc5e2833bd101 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 6 Mar 2019 15:33:02 -0300 Subject: [PATCH 287/667] Implemented the sprites for the Gen. 5 gems. --- graphics/items/icon_palettes/bug_gem.pal | 19 ++++++ graphics/items/icon_palettes/dark_gem.pal | 19 ++++++ graphics/items/icon_palettes/dragon_gem.pal | 19 ++++++ graphics/items/icon_palettes/electric_gem.pal | 19 ++++++ graphics/items/icon_palettes/fairy_gem.pal | 19 ++++++ graphics/items/icon_palettes/fighting_gem.pal | 19 ++++++ graphics/items/icon_palettes/fire_gem.pal | 19 ++++++ graphics/items/icon_palettes/flying_gem.pal | 19 ++++++ graphics/items/icon_palettes/ghost_gem.pal | 19 ++++++ graphics/items/icon_palettes/grass_gem.pal | 19 ++++++ graphics/items/icon_palettes/ground_gem.pal | 19 ++++++ graphics/items/icon_palettes/ice_gem.pal | 19 ++++++ graphics/items/icon_palettes/normal_gem.pal | 19 ++++++ graphics/items/icon_palettes/poison_gem.pal | 19 ++++++ graphics/items/icon_palettes/psychic_gem.pal | 19 ++++++ graphics/items/icon_palettes/rock_gem.pal | 19 ++++++ graphics/items/icon_palettes/steel_gem.pal | 19 ++++++ graphics/items/icon_palettes/water_gem.pal | 19 ++++++ graphics/items/icons/bug_gem.png | Bin 0 -> 353 bytes graphics/items/icons/dark_gem.png | Bin 0 -> 353 bytes graphics/items/icons/dragon_gem.png | Bin 0 -> 353 bytes graphics/items/icons/electric_gem.png | Bin 0 -> 353 bytes graphics/items/icons/fairy_gem.png | Bin 0 -> 353 bytes graphics/items/icons/fighting_gem.png | Bin 0 -> 353 bytes graphics/items/icons/fire_gem.png | Bin 0 -> 353 bytes graphics/items/icons/flying_gem.png | Bin 0 -> 353 bytes graphics/items/icons/ghost_gem.png | Bin 0 -> 353 bytes graphics/items/icons/grass_gem.png | Bin 0 -> 353 bytes graphics/items/icons/ground_gem.png | Bin 0 -> 353 bytes graphics/items/icons/ice_gem.png | Bin 0 -> 353 bytes graphics/items/icons/normal_gem.png | Bin 0 -> 353 bytes graphics/items/icons/poison_gem.png | Bin 0 -> 353 bytes graphics/items/icons/psychic_gem.png | Bin 0 -> 353 bytes graphics/items/icons/rock_gem.png | Bin 0 -> 353 bytes graphics/items/icons/steel_gem.png | Bin 0 -> 353 bytes graphics/items/icons/water_gem.png | Bin 0 -> 353 bytes include/graphics.h | 36 ++++++++++++ src/data/graphics/items.h | 54 ++++++++++++++++++ src/data/item_icon_table.h | 18 ++++++ 39 files changed, 450 insertions(+) create mode 100755 graphics/items/icon_palettes/bug_gem.pal create mode 100755 graphics/items/icon_palettes/dark_gem.pal create mode 100755 graphics/items/icon_palettes/dragon_gem.pal create mode 100755 graphics/items/icon_palettes/electric_gem.pal create mode 100755 graphics/items/icon_palettes/fairy_gem.pal create mode 100755 graphics/items/icon_palettes/fighting_gem.pal create mode 100755 graphics/items/icon_palettes/fire_gem.pal create mode 100755 graphics/items/icon_palettes/flying_gem.pal create mode 100755 graphics/items/icon_palettes/ghost_gem.pal create mode 100755 graphics/items/icon_palettes/grass_gem.pal create mode 100755 graphics/items/icon_palettes/ground_gem.pal create mode 100755 graphics/items/icon_palettes/ice_gem.pal create mode 100755 graphics/items/icon_palettes/normal_gem.pal create mode 100755 graphics/items/icon_palettes/poison_gem.pal create mode 100755 graphics/items/icon_palettes/psychic_gem.pal create mode 100755 graphics/items/icon_palettes/rock_gem.pal create mode 100755 graphics/items/icon_palettes/steel_gem.pal create mode 100755 graphics/items/icon_palettes/water_gem.pal create mode 100755 graphics/items/icons/bug_gem.png create mode 100755 graphics/items/icons/dark_gem.png create mode 100755 graphics/items/icons/dragon_gem.png create mode 100755 graphics/items/icons/electric_gem.png create mode 100755 graphics/items/icons/fairy_gem.png create mode 100755 graphics/items/icons/fighting_gem.png create mode 100755 graphics/items/icons/fire_gem.png create mode 100755 graphics/items/icons/flying_gem.png create mode 100755 graphics/items/icons/ghost_gem.png create mode 100755 graphics/items/icons/grass_gem.png create mode 100755 graphics/items/icons/ground_gem.png create mode 100755 graphics/items/icons/ice_gem.png create mode 100755 graphics/items/icons/normal_gem.png create mode 100755 graphics/items/icons/poison_gem.png create mode 100755 graphics/items/icons/psychic_gem.png create mode 100755 graphics/items/icons/rock_gem.png create mode 100755 graphics/items/icons/steel_gem.png create mode 100755 graphics/items/icons/water_gem.png diff --git a/graphics/items/icon_palettes/bug_gem.pal b/graphics/items/icon_palettes/bug_gem.pal new file mode 100755 index 0000000000..4e8af47265 --- /dev/null +++ b/graphics/items/icon_palettes/bug_gem.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +32 32 32 +184 216 104 +224 232 176 +152 184 32 +248 248 248 +136 160 16 +112 144 0 +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/items/icon_palettes/dark_gem.pal b/graphics/items/icon_palettes/dark_gem.pal new file mode 100755 index 0000000000..1183d7db18 --- /dev/null +++ b/graphics/items/icon_palettes/dark_gem.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +32 32 32 +72 72 72 +120 120 120 +56 56 56 +160 160 160 +40 40 40 +0 0 0 +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/items/icon_palettes/dragon_gem.pal b/graphics/items/icon_palettes/dragon_gem.pal new file mode 100755 index 0000000000..10fed280fd --- /dev/null +++ b/graphics/items/icon_palettes/dragon_gem.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +32 32 32 +160 128 200 +168 184 232 +128 96 224 +216 248 216 +72 64 152 +96 56 112 +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/items/icon_palettes/electric_gem.pal b/graphics/items/icon_palettes/electric_gem.pal new file mode 100755 index 0000000000..88de6e42ae --- /dev/null +++ b/graphics/items/icon_palettes/electric_gem.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +32 32 32 +248 224 0 +248 248 160 +224 200 0 +248 248 248 +192 168 0 +184 160 0 +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/items/icon_palettes/fairy_gem.pal b/graphics/items/icon_palettes/fairy_gem.pal new file mode 100755 index 0000000000..4bf316f572 --- /dev/null +++ b/graphics/items/icon_palettes/fairy_gem.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +49 49 49 +215 149 192 +251 230 239 +210 120 173 +255 247 255 +193 77 151 +183 49 136 +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/items/icon_palettes/fighting_gem.pal b/graphics/items/icon_palettes/fighting_gem.pal new file mode 100755 index 0000000000..324a6870c6 --- /dev/null +++ b/graphics/items/icon_palettes/fighting_gem.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +32 32 32 +184 112 120 +224 152 136 +144 72 120 +248 216 208 +120 56 88 +96 40 56 +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/items/icon_palettes/fire_gem.pal b/graphics/items/icon_palettes/fire_gem.pal new file mode 100755 index 0000000000..f98f9e16ca --- /dev/null +++ b/graphics/items/icon_palettes/fire_gem.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +32 32 32 +248 144 72 +248 200 104 +240 64 48 +248 248 232 +224 72 32 +176 24 0 +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/items/icon_palettes/flying_gem.pal b/graphics/items/icon_palettes/flying_gem.pal new file mode 100755 index 0000000000..16d9334346 --- /dev/null +++ b/graphics/items/icon_palettes/flying_gem.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +32 32 32 +184 200 248 +216 224 248 +152 168 240 +232 248 248 +104 128 192 +64 80 144 +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/items/icon_palettes/ghost_gem.pal b/graphics/items/icon_palettes/ghost_gem.pal new file mode 100755 index 0000000000..6068c4d2b0 --- /dev/null +++ b/graphics/items/icon_palettes/ghost_gem.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +32 32 32 +104 80 184 +104 104 216 +80 64 152 +136 136 224 +56 48 112 +32 40 80 +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/items/icon_palettes/grass_gem.pal b/graphics/items/icon_palettes/grass_gem.pal new file mode 100755 index 0000000000..02412f988e --- /dev/null +++ b/graphics/items/icon_palettes/grass_gem.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +32 32 32 +96 248 120 +184 248 176 +64 200 80 +232 248 224 +56 184 88 +0 144 48 +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/items/icon_palettes/ground_gem.pal b/graphics/items/icon_palettes/ground_gem.pal new file mode 100755 index 0000000000..cbdd4efd6d --- /dev/null +++ b/graphics/items/icon_palettes/ground_gem.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +32 32 32 +184 128 56 +200 160 80 +160 104 32 +224 192 128 +112 64 16 +104 56 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 diff --git a/graphics/items/icon_palettes/ice_gem.pal b/graphics/items/icon_palettes/ice_gem.pal new file mode 100755 index 0000000000..dda74d5894 --- /dev/null +++ b/graphics/items/icon_palettes/ice_gem.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +32 32 32 +104 232 232 +168 248 248 +48 208 248 +232 248 248 +24 176 248 +0 152 200 +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/items/icon_palettes/normal_gem.pal b/graphics/items/icon_palettes/normal_gem.pal new file mode 100755 index 0000000000..8cd17447e6 --- /dev/null +++ b/graphics/items/icon_palettes/normal_gem.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +32 32 32 +224 184 184 +240 208 208 +192 176 176 +248 248 248 +168 160 160 +144 144 144 +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/items/icon_palettes/poison_gem.pal b/graphics/items/icon_palettes/poison_gem.pal new file mode 100755 index 0000000000..da63d2f248 --- /dev/null +++ b/graphics/items/icon_palettes/poison_gem.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +32 32 32 +152 104 168 +192 176 200 +104 96 136 +232 248 224 +56 104 104 +40 72 72 +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/items/icon_palettes/psychic_gem.pal b/graphics/items/icon_palettes/psychic_gem.pal new file mode 100755 index 0000000000..c9f2839e65 --- /dev/null +++ b/graphics/items/icon_palettes/psychic_gem.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +32 32 32 +248 104 176 +248 160 192 +208 56 136 +248 216 208 +160 32 136 +112 0 104 +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/items/icon_palettes/rock_gem.pal b/graphics/items/icon_palettes/rock_gem.pal new file mode 100755 index 0000000000..3821017666 --- /dev/null +++ b/graphics/items/icon_palettes/rock_gem.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +32 32 32 +184 144 120 +216 200 176 +136 112 88 +232 224 200 +112 88 72 +80 64 48 +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/items/icon_palettes/steel_gem.pal b/graphics/items/icon_palettes/steel_gem.pal new file mode 100755 index 0000000000..bd03865343 --- /dev/null +++ b/graphics/items/icon_palettes/steel_gem.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +32 32 32 +136 136 152 +184 184 200 +96 96 96 +232 232 248 +88 88 88 +0 0 0 +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/items/icon_palettes/water_gem.pal b/graphics/items/icon_palettes/water_gem.pal new file mode 100755 index 0000000000..586db9a6e4 --- /dev/null +++ b/graphics/items/icon_palettes/water_gem.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +32 32 32 +64 160 248 +120 200 248 +48 144 248 +208 248 248 +0 120 208 +0 80 200 +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/items/icons/bug_gem.png b/graphics/items/icons/bug_gem.png new file mode 100755 index 0000000000000000000000000000000000000000..0561d24d06f9617454c8abcf9c8cf48502a8f4ef GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xutl~my^Ivgp1qz9m zxJHx&=ckpFCl;kLxcj&OjZr8|EmAPnGbwCc@(`$mqolyk9VlZAWHWd*XvzaAmUKs7 zM+SzC{oH>NS%G|m0G|-o{|pTZ3JN=JWITAWVa5)HA3uI{ED$J|0MdpP?A%*c0hC}& z@^*Lmzm)ycQ4psj$S;_|;n|HeAg999#WAE}PIAHmrUVfdCPoc+kDE7ccnE4Grtq+w z6VOad7FP%`WAT=dW@VmgDc!t8Vs5B&Z|~F)p93I4yYdu7{8c6T`w+LKiEvy7EEJ N_H^}gS?83{1ONyPWs?8^ literal 0 HcmV?d00001 diff --git a/graphics/items/icons/dark_gem.png b/graphics/items/icons/dark_gem.png new file mode 100755 index 0000000000000000000000000000000000000000..947f04167490568a9a072b7bf8aa17e1d602a135 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xutl~lnWu0ppfI{LW zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0I4yYdu7{8c6GPi;fl9F+^T!~Ed%F6$ JtaD0e0ssy@T$2C* literal 0 HcmV?d00001 diff --git a/graphics/items/icons/dragon_gem.png b/graphics/items/icons/dragon_gem.png new file mode 100755 index 0000000000000000000000000000000000000000..2d41c858c19c16f1400f0dda43cd3bff52619137 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xutl~m4kfnuRWYk=a6 zN#5=*|Ch3VItt>H1o;IsI6S+N2IN$Dx;TbZ%t=mIz?2}u!o;ZI?s4ItDW-Q(k(yYu=Ev1{6NX!j&?(Ll#;&VV|@`Vct%BrdzYKhk`1gNTtx_4xz zW$HbBsu|GT5*%~tv`C^JN0Fv~)6NFR5LP|LB4#J16{iJn-t`btVPaVLO6X#RR#!gA N)t;_?F6*2UngA#wWQPC% literal 0 HcmV?d00001 diff --git a/graphics/items/icons/electric_gem.png b/graphics/items/icons/electric_gem.png new file mode 100755 index 0000000000000000000000000000000000000000..88e604f182f83899b0039f7a423433e74b0fe9be GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xutl~oA=S(>JfkNUX zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0cyIzp{y4CLVaEcXGlO`h@^hRZ;hj%(P6s zr%yElx?6%{PMsD>)Z-}9^l#eP;26TH$5_Pd#I)kH;LW=pLMluQ3ttIctkCMp2f5qR L)z4*}Q$iB}gZgDV literal 0 HcmV?d00001 diff --git a/graphics/items/icons/fairy_gem.png b/graphics/items/icons/fairy_gem.png new file mode 100755 index 0000000000000000000000000000000000000000..871f74426d8ea309c3738acf32c8ecdc47c5760e GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xutl~n#CnL{J0}6?k zxJHx&=ckpFCl;kLxcj&OjZr8|EmAPnGbwCc@(`$mqolyk9VlZAWHWd*XvzaAmUKs7 zM+SzC{oH>NS%G|m0G|-o{|pU=hKARt9{Bz2{iTYv|G)n~=sSJ8VFySbHel2B(iJGq znB?v5@_#A&r=uWFNswPKgTu2MX+Tber;B4q#hm1X1xyJdEKH0V?jAR9-0%?8N=)Hl zIVYf*m@KXkV8-GtA)l#~7iNxGc=ic6_AwCCWCSSOapscFep_X|4LV&8OsC!3d zTBhF9r1BJv( zTq8I4yYdu7{8c6T`w+LKiEvy7ED; N_H^}gS?83{1ORR&VqX9N literal 0 HcmV?d00001 diff --git a/graphics/items/icons/fire_gem.png b/graphics/items/icons/fire_gem.png new file mode 100755 index 0000000000000000000000000000000000000000..deb8979bd8eb153df3014897ff566b1e58280782 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xutl~l(&NeJnKq2uG z*NBqf{Irtt#G+INcOMs^F$!g=MGD4xCWWm_9s-qcloa^617(bXYzD6eO?e>2lJ4m1 z$iT3%pZiZDE0Avx;1lBdpP@lPLE*;)j~^#8J~$Zs`0?U_hr$MsE3kvZO+)rhn7U2FDOqJ;owtC#Dsr1#jN<5K>`cSolilVue;$KFHmk Lu6{1-oD!M<#K~iE literal 0 HcmV?d00001 diff --git a/graphics/items/icons/flying_gem.png b/graphics/items/icons/flying_gem.png new file mode 100755 index 0000000000000000000000000000000000000000..563e80f3bf057503429cc7386637f4e6b889de96 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xutm48-jdT9I1qz9m zxJHx&=ckpFCl;kLxcj&OjZr8|EmAPnGbwCc@(`$mqolyk9VlZAWHWd*XvzaAmUKs7 zM+SzC{oH>NS%G|m0G|-o{|pTZ3JN<;{J8Pp$BY#pUi|ox(Qv>aU;;=VHsCQ;z8fgc znB?v5@_#A&r=uWFNswPKgTu2MX+Tber;B4q#hm1X1xyJdEKH0V?jAR9-0%?8N=)Hl zIVYf*m@KXkV8-GtA)l#~7iNxGc=ic6_AwCCWCSSOapscFep_X|4LV&8OsC!3d zTBhF9rpnMR0fod% zTq8y zdAqy(U&{XJD2P)M zsrU4$WQDv9T5x@3_$v@f&81r(Liy= zByV?@|4Z3F9R+bpg8YIR9G=}s19B=nT^vIy<|HR9U`h~SVPe#9_qciEhKHb5VhRt- zIRVYYWO0Q6GZt?NX;$W`meS2jB<6-X_x4T=@i`zf`ND++WmVM literal 0 HcmV?d00001 diff --git a/graphics/items/icons/ground_gem.png b/graphics/items/icons/ground_gem.png new file mode 100755 index 0000000000000000000000000000000000000000..27a8bf69d5afb504081bb038bf9fe2aa0f3e5b39 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xutm48VerlN|Kq2uG z*NBqf{Irtt#G+INcOMs^F$!g=MGD4xCWWm_9s-qcloa^617(bXYzD6eO?e>2lJ4m1 z$iT3%pZiZDE0Avx;1lBdpP@lPL19OO#fb$03o;ZQ9B3$T5Xi6)0O`X9{%+h-1{7yZ z@^*Lmzm)ycQ4psj$S;_|;n|HeAg999#WAE}PIAHmrUVfdCPoc+kDE7ccnE4Grtq+w z6VOad7FP%`WAT=dW@VmgDc!t8Vs5B&Z|~F)p93I4yYdu7{8c6T`w+LKiEvy7ED; N_H^}gS?83{1OSt_Vc-A& literal 0 HcmV?d00001 diff --git a/graphics/items/icons/ice_gem.png b/graphics/items/icons/ice_gem.png new file mode 100755 index 0000000000000000000000000000000000000000..db87018fea066e41d1521f48b9b0ac712294fbc5 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xutm47~p5AM7fkNUX zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0EaktF()};0aJnq3lpP;yT{ENH#`Kj5>t3s z&IxEHCW|Wsn6Y?ENV76ewUlmNA~84Axwm&}h|d9;$rmmpD66V=s3l&%5TL3m>fVu= zmZ|sjsb)ZTOK{Ao(;|s_97US`O*NS%G|m0G|-o{|pTZ3JMQ)?D%lu!hsDNe*E~cV!?t56DEN4VFUFC`<;Q} zj7i?^F8`OZe>w`{lmz(&GdMiEkp|>cc)B=-RLn_ESiqDZ!otL;;qGzs#tjcat;7@_ zmU9A{iOJ#$0cI@T64I>9Q!S;Nmq^SFb?)t*8sc+6X7Ys#3CgOf9cqc!F9fKnin@1X zre*3qeX1GI-4Yyg>a<9r9!HU;f78we#}HOM#v*1XrWL0JZ{GC~Qek3P_)6$vg;rNS O$km>%elF{r5}E*)h-Z)h literal 0 HcmV?d00001 diff --git a/graphics/items/icons/poison_gem.png b/graphics/items/icons/poison_gem.png new file mode 100755 index 0000000000000000000000000000000000000000..ab339eb718deafb709cadd530e61f3cad86dc403 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xutm49q%D;Q(1BJv( zTq8QDvj0_DA50E}=ApEDnM4&ih zlDE6d|E27oj)FKPL4Lsu4$p3+0XY?(E{-7;bCMGlFeQkvFfnSld)&Nn!$VLjF@=Za zoPcIxvbaKk8H=}sG%NE|OX=n%5_3bHdwZvb_#BX#eBnZZvZ`u_TH^H!0jjE^?j4zF znR-v3Y6f(-1jn2@Et06mQKaeLw6no6gjJ8Rh}ns0#c9EtcRhqum>3qm61rHS)s+u& NwWq6}%Q~loCIFNVW6uBp literal 0 HcmV?d00001 diff --git a/graphics/items/icons/psychic_gem.png b/graphics/items/icons/psychic_gem.png new file mode 100755 index 0000000000000000000000000000000000000000..6b84f38daba8f5abc1199bdb7610e6a1b0287906 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xutl~lzsZUL=0fod% zTq83qm61rHS)s+u& NwWq6}%Q~loCIH<2W6l5o literal 0 HcmV?d00001 diff --git a/graphics/items/icons/rock_gem.png b/graphics/items/icons/rock_gem.png new file mode 100755 index 0000000000000000000000000000000000000000..6d6070b51615cb7c9a0bcdd71dc792dc277bb4ef GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xutl~l@Il&cwfkNUX zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT04zOJ#OB(;UTD%n8L$y zPCzp;SzIB&jKy0*nw5E~rF8QWiMgT9y}eUId=AJ=zHlKySyi<|E%Ew=0992{_m0f8 zOueU1H3Pa^f@4md7D?3ODAM$A+S%Y3!m7tu#O%bh;dFVX N+SAp~Wt~$(69E1>WKaMA literal 0 HcmV?d00001 diff --git a/graphics/items/icons/steel_gem.png b/graphics/items/icons/steel_gem.png new file mode 100755 index 0000000000000000000000000000000000000000..252dc2d47ea1a7e0fbe49d97cc56d60faafe8f6c GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xutl~lj*>-!L0ENU$ zTq8LLPLYkF%s-<-E5{bE?&b_@;LwpX%Ould-L0MI`LoM<8g#cAmQTL9_v`oFG zCe48Emf#qcqaulV97TdYO*H1o;IsI6S+N2IN$Dx;TbZ%t=mIz?2}u!o;ZI?s4ItDW-Q(k(yYu=Ev1{6NX!j&?(Ll#;&VV|@`Vct%BrdzYKhk`1gNTtx_4xz zW$HbBsu|GT5*%~tv`C^JN0Fv~)6NFR5LP|LB4#J16{iJn-t`btVPaVLO6X#RR#!gA N)t;_?F6*2UngE~>Wd{HN literal 0 HcmV?d00001 diff --git a/include/graphics.h b/include/graphics.h index 78f2c44b31..2b9ecac044 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -3955,6 +3955,42 @@ extern const u32 gItemIcon_BurnDrive[]; extern const u32 gItemIconPalette_BurnDrive[]; extern const u32 gItemIcon_ChillDrive[]; extern const u32 gItemIconPalette_ChillDrive[]; +extern const u32 gItemIcon_FireGem[]; +extern const u32 gItemIconPalette_FireGem[]; +extern const u32 gItemIcon_WaterGem[]; +extern const u32 gItemIconPalette_WaterGem[]; +extern const u32 gItemIcon_ElectricGem[]; +extern const u32 gItemIconPalette_ElectricGem[]; +extern const u32 gItemIcon_GrassGem[]; +extern const u32 gItemIconPalette_GrassGem[]; +extern const u32 gItemIcon_IceGem[]; +extern const u32 gItemIconPalette_IceGem[]; +extern const u32 gItemIcon_FightingGem[]; +extern const u32 gItemIconPalette_FightingGem[]; +extern const u32 gItemIcon_PoisonGem[]; +extern const u32 gItemIconPalette_PoisonGem[]; +extern const u32 gItemIcon_GroundGem[]; +extern const u32 gItemIconPalette_GroundGem[]; +extern const u32 gItemIcon_FlyingGem[]; +extern const u32 gItemIconPalette_FlyingGem[]; +extern const u32 gItemIcon_PsychicGem[]; +extern const u32 gItemIconPalette_PsychicGem[]; +extern const u32 gItemIcon_BugGem[]; +extern const u32 gItemIconPalette_BugGem[]; +extern const u32 gItemIcon_RockGem[]; +extern const u32 gItemIconPalette_RockGem[]; +extern const u32 gItemIcon_GhostGem[]; +extern const u32 gItemIconPalette_GhostGem[]; +extern const u32 gItemIcon_DragonGem[]; +extern const u32 gItemIconPalette_DragonGem[]; +extern const u32 gItemIcon_DarkGem[]; +extern const u32 gItemIconPalette_DarkGem[]; +extern const u32 gItemIcon_SteelGem[]; +extern const u32 gItemIconPalette_SteelGem[]; +extern const u32 gItemIcon_NormalGem[]; +extern const u32 gItemIconPalette_NormalGem[]; +extern const u32 gItemIcon_FairyGem[]; +extern const u32 gItemIconPalette_FairyGem[]; // Gen 6 Items extern const u32 gItemIcon_AssaultVest[]; extern const u32 gItemIconPalette_AssaultVest[]; diff --git a/src/data/graphics/items.h b/src/data/graphics/items.h index 23b28b5dd6..928ceee9e3 100644 --- a/src/data/graphics/items.h +++ b/src/data/graphics/items.h @@ -900,6 +900,60 @@ const u32 gItemIconPalette_BurnDrive[] = INCBIN_U32("graphics/items/icon_palette const u32 gItemIcon_ChillDrive[] = INCBIN_U32("graphics/items/icons/chill_drive.4bpp.lz"); const u32 gItemIconPalette_ChillDrive[] = INCBIN_U32("graphics/items/icon_palettes/chill_drive.gbapal.lz"); +const u32 gItemIcon_FireGem[] = INCBIN_U32("graphics/items/icons/fire_gem.4bpp.lz"); +const u32 gItemIconPalette_FireGem[] = INCBIN_U32("graphics/items/icon_palettes/fire_gem.gbapal.lz"); + +const u32 gItemIcon_WaterGem[] = INCBIN_U32("graphics/items/icons/water_gem.4bpp.lz"); +const u32 gItemIconPalette_WaterGem[] = INCBIN_U32("graphics/items/icon_palettes/water_gem.gbapal.lz"); + +const u32 gItemIcon_ElectricGem[] = INCBIN_U32("graphics/items/icons/electric_gem.4bpp.lz"); +const u32 gItemIconPalette_ElectricGem[] = INCBIN_U32("graphics/items/icon_palettes/electric_gem.gbapal.lz"); + +const u32 gItemIcon_GrassGem[] = INCBIN_U32("graphics/items/icons/grass_gem.4bpp.lz"); +const u32 gItemIconPalette_GrassGem[] = INCBIN_U32("graphics/items/icon_palettes/grass_gem.gbapal.lz"); + +const u32 gItemIcon_IceGem[] = INCBIN_U32("graphics/items/icons/ice_gem.4bpp.lz"); +const u32 gItemIconPalette_IceGem[] = INCBIN_U32("graphics/items/icon_palettes/ice_gem.gbapal.lz"); + +const u32 gItemIcon_FightingGem[] = INCBIN_U32("graphics/items/icons/fighting_gem.4bpp.lz"); +const u32 gItemIconPalette_FightingGem[] = INCBIN_U32("graphics/items/icon_palettes/fighting_gem.gbapal.lz"); + +const u32 gItemIcon_PoisonGem[] = INCBIN_U32("graphics/items/icons/poison_gem.4bpp.lz"); +const u32 gItemIconPalette_PoisonGem[] = INCBIN_U32("graphics/items/icon_palettes/poison_gem.gbapal.lz"); + +const u32 gItemIcon_GroundGem[] = INCBIN_U32("graphics/items/icons/ground_gem.4bpp.lz"); +const u32 gItemIconPalette_GroundGem[] = INCBIN_U32("graphics/items/icon_palettes/ground_gem.gbapal.lz"); + +const u32 gItemIcon_FlyingGem[] = INCBIN_U32("graphics/items/icons/flying_gem.4bpp.lz"); +const u32 gItemIconPalette_FlyingGem[] = INCBIN_U32("graphics/items/icon_palettes/flying_gem.gbapal.lz"); + +const u32 gItemIcon_PsychicGem[] = INCBIN_U32("graphics/items/icons/psychic_gem.4bpp.lz"); +const u32 gItemIconPalette_PsychicGem[] = INCBIN_U32("graphics/items/icon_palettes/psychic_gem.gbapal.lz"); + +const u32 gItemIcon_BugGem[] = INCBIN_U32("graphics/items/icons/bug_gem.4bpp.lz"); +const u32 gItemIconPalette_BugGem[] = INCBIN_U32("graphics/items/icon_palettes/bug_gem.gbapal.lz"); + +const u32 gItemIcon_RockGem[] = INCBIN_U32("graphics/items/icons/rock_gem.4bpp.lz"); +const u32 gItemIconPalette_RockGem[] = INCBIN_U32("graphics/items/icon_palettes/rock_gem.gbapal.lz"); + +const u32 gItemIcon_GhostGem[] = INCBIN_U32("graphics/items/icons/ghost_gem.4bpp.lz"); +const u32 gItemIconPalette_GhostGem[] = INCBIN_U32("graphics/items/icon_palettes/ghost_gem.gbapal.lz"); + +const u32 gItemIcon_DragonGem[] = INCBIN_U32("graphics/items/icons/dragon_gem.4bpp.lz"); +const u32 gItemIconPalette_DragonGem[] = INCBIN_U32("graphics/items/icon_palettes/dragon_gem.gbapal.lz"); + +const u32 gItemIcon_DarkGem[] = INCBIN_U32("graphics/items/icons/dark_gem.4bpp.lz"); +const u32 gItemIconPalette_DarkGem[] = INCBIN_U32("graphics/items/icon_palettes/dark_gem.gbapal.lz"); + +const u32 gItemIcon_SteelGem[] = INCBIN_U32("graphics/items/icons/steel_gem.4bpp.lz"); +const u32 gItemIconPalette_SteelGem[] = INCBIN_U32("graphics/items/icon_palettes/steel_gem.gbapal.lz"); + +const u32 gItemIcon_NormalGem[] = INCBIN_U32("graphics/items/icons/normal_gem.4bpp.lz"); +const u32 gItemIconPalette_NormalGem[] = INCBIN_U32("graphics/items/icon_palettes/normal_gem.gbapal.lz"); + +const u32 gItemIcon_FairyGem[] = INCBIN_U32("graphics/items/icons/fairy_gem.4bpp.lz"); +const u32 gItemIconPalette_FairyGem[] = INCBIN_U32("graphics/items/icon_palettes/fairy_gem.gbapal.lz"); + // Gen 6 Items const u32 gItemIcon_AssaultVest[] = INCBIN_U32("graphics/items/icons/assault_vest.4bpp.lz"); diff --git a/src/data/item_icon_table.h b/src/data/item_icon_table.h index 8341bc7ca8..efcc57fd63 100644 --- a/src/data/item_icon_table.h +++ b/src/data/item_icon_table.h @@ -457,6 +457,24 @@ const u32 *const gItemIconTable[][2] = [ITEM_SHOCK_DRIVE] = {gItemIcon_ShockDrive, gItemIconPalette_ShockDrive}, [ITEM_BURN_DRIVE] = {gItemIcon_BurnDrive, gItemIconPalette_BurnDrive}, [ITEM_CHILL_DRIVE] = {gItemIcon_ChillDrive, gItemIconPalette_ChillDrive}, + [ITEM_FIRE_GEM] = {gItemIcon_FireGem, gItemIconPalette_FireGem}, + [ITEM_WATER_GEM] = {gItemIcon_WaterGem, gItemIconPalette_WaterGem}, + [ITEM_ELECTRIC_GEM] = {gItemIcon_ElectricGem, gItemIconPalette_ElectricGem}, + [ITEM_GRASS_GEM] = {gItemIcon_GrassGem, gItemIconPalette_GrassGem}, + [ITEM_ICE_GEM] = {gItemIcon_IceGem, gItemIconPalette_IceGem}, + [ITEM_FIGHTING_GEM] = {gItemIcon_FightingGem, gItemIconPalette_FightingGem}, + [ITEM_POISON_GEM] = {gItemIcon_PoisonGem, gItemIconPalette_PoisonGem}, + [ITEM_GROUND_GEM] = {gItemIcon_GroundGem, gItemIconPalette_GroundGem}, + [ITEM_FLYING_GEM] = {gItemIcon_FlyingGem, gItemIconPalette_FlyingGem}, + [ITEM_PSYCHIC_GEM] = {gItemIcon_PsychicGem, gItemIconPalette_PsychicGem}, + [ITEM_BUG_GEM] = {gItemIcon_BugGem, gItemIconPalette_BugGem}, + [ITEM_ROCK_GEM] = {gItemIcon_RockGem, gItemIconPalette_RockGem}, + [ITEM_GHOST_GEM] = {gItemIcon_GhostGem, gItemIconPalette_GhostGem}, + [ITEM_DRAGON_GEM] = {gItemIcon_DragonGem, gItemIconPalette_DragonGem}, + [ITEM_DARK_GEM] = {gItemIcon_DarkGem, gItemIconPalette_DarkGem}, + [ITEM_STEEL_GEM] = {gItemIcon_SteelGem, gItemIconPalette_SteelGem}, + [ITEM_NORMAL_GEM] = {gItemIcon_NormalGem, gItemIconPalette_NormalGem}, + [ITEM_FAIRY_GEM] = {gItemIcon_FairyGem, gItemIconPalette_FairyGem}, // Gen 6 Items [ITEM_ASSAULT_VEST] = {gItemIcon_AssaultVest, gItemIconPalette_AssaultVest}, [ITEM_PIXIE_PLATE] = {gItemIcon_PixiePlate, gItemIconPalette_PixiePlate}, From 2f4aceb4a9aa58592a98230f3f4d3b2fcb0a89ac Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Thu, 7 Mar 2019 07:09:19 -0300 Subject: [PATCH 288/667] Defined a hold effect for the terrain effect boosting seeds and the Adrenaline Orb. --- include/constants/hold_effects.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index 7a506bb8d2..84368ae913 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -117,6 +117,8 @@ // 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_CHOICE(holdEffect)((holdEffect == HOLD_EFFECT_CHOICE_BAND || holdEffect == HOLD_EFFECT_CHOICE_SCARF || holdEffect == HOLD_EFFECT_CHOICE_SPECS)) From f3babe1e51eec4582c434bbe861020fd0cd13092 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Thu, 7 Mar 2019 07:13:37 -0300 Subject: [PATCH 289/667] Partly fixed the description of the Protective Pads, fixed their price tag and also added the data for the other Gen. 7 hold items. --- src/data/items.h | 110 +++++++++++++++++++++++++++++- src/data/text/item_descriptions.h | 8 ++- 2 files changed, 116 insertions(+), 2 deletions(-) diff --git a/src/data/items.h b/src/data/items.h index 872e54cf76..768bac00c8 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -8997,7 +8997,7 @@ const struct Item gItems[] = { .name = _("Protect Pads"), // Shortened name from Protective Pads .itemId = ITEM_PROTECTIVE_PADS, - .price = 200, + .price = 4000, .holdEffect = HOLD_EFFECT_PROTECTIVE_PADS, .holdEffectParam = 0, .description = gProtectPadsItemDescription, @@ -9010,4 +9010,112 @@ const struct Item gItems[] = .battleUseFunc = NULL, .secondaryId = 0, }, + + [ITEM_TERRAIN_EXTENDER] = + { + .name = _("Terrain Exte."), + .itemId = ITEM_TERRAIN_EXTENDER, + .price = 4000, + .holdEffect = HOLD_EFFECT_TERRAIN_EXTENDER, + .holdEffectParam = 0, + .description = gTerrainExtenderItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_ELECTRIC_SEED] = + { + .name = _("Electric Seed"), + .itemId = ITEM_ELECTRIC_SEED, + .price = 4000, + .holdEffect = HOLD_EFFECT_SEEDS, + .holdEffectParam = 0, + .description = gElectricSeedItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_GRASSY_SEED] = + { + .name = _("Grassy Seed"), + .itemId = ITEM_GRASSY_SEED, + .price = 4000, + .holdEffect = HOLD_EFFECT_SEEDS, + .holdEffectParam = 0, + .description = gGrassySeedItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_MISTY_SEED] = + { + .name = _("Misty Seed"), + .itemId = ITEM_MISTY_SEED, + .price = 4000, + .holdEffect = HOLD_EFFECT_SEEDS, + .holdEffectParam = 0, + .description = gMistySeedItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_PSYCHIC_SEED] = + { + .name = _("Psychic Seed"), + .itemId = ITEM_PSYCHIC_SEED, + .price = 4000, + .holdEffect = HOLD_EFFECT_SEEDS, + .holdEffectParam = 0, + .description = gPsychicSeedItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, + + [ITEM_ADRENALINE_ORB] = + { + .name = _("AdrenalineOrb"), + .itemId = ITEM_ADRENALINE_ORB, + .price = 300, + .holdEffect = HOLD_EFFECT_ADRENALINE_ORB, + .holdEffectParam = 0, + .description = gAdrenalineOrbItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, }; diff --git a/src/data/text/item_descriptions.h b/src/data/text/item_descriptions.h index ac87732511..afb907fe93 100644 --- a/src/data/text/item_descriptions.h +++ b/src/data/text/item_descriptions.h @@ -444,4 +444,10 @@ const u8 gLopunniteItemDescription[] = _("This stone enables\nLopunny to Mega\nE const u8 gSalamenciteItemDescription[] = _("This stone enables\nSalamence to Mega\nEvolve in battle."); const u8 gBeedrilliteItemDescription[] = _("This stone enables\nBeedrill to Mega\nEvolve in battle."); const u8 gMegaBraceletItemDescription[] = _("Allows Pokémon holding\na Mega Stone to Mega\nEvolve in battle."); -const u8 gProtectPadsItemDescription[] = _("Protects the holder\nfrom effects caused\nby contact moves."); +const u8 gProtectPadsItemDescription[] = _("Guards the holder\nfrom effects caused\nby contact moves."); +const u8 gTerrainExtenderItemDescription[] = _("Extends the length\nof the active\nbattle terrain."); +const u8 gElectricSeedItemDescription[] = _("Boosts Defense on\nElectric Terrain,\nbut only one time."); +const u8 gGrassySeedItemDescription[] = _("Boosts Defense on\nGrassy Terrain,\nbut only one time."); +const u8 gMistySeedItemDescription[] = _("Boosts Sp. Def. on\nMisty Terrain,\nbut only one time."); +const u8 gPsychicSeedItemDescription[] = _("Boosts Sp. Def. on\nPsychic Terrain,\nbut only one time."); +const u8 gAdrenalineOrbItemDescription[] = _("Boosts Speed if the\nuser is intimidated,\nbut only one time."); From 75d78f4941bf5461957b934f1df58b6f329bfc9e Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Thu, 7 Mar 2019 07:19:40 -0300 Subject: [PATCH 290/667] Added the item sprites of the Gen. 7 hold items. --- .../items/icon_palettes/adrenaline_orb.pal | 19 +++++++++++++++ .../items/icon_palettes/electric_seed.pal | 19 +++++++++++++++ graphics/items/icon_palettes/grassy_seed.pal | 19 +++++++++++++++ graphics/items/icon_palettes/misty_seed.pal | 19 +++++++++++++++ .../items/icon_palettes/protective_pads.pal | 19 +++++++++++++++ graphics/items/icon_palettes/psychic_seed.pal | 19 +++++++++++++++ .../items/icon_palettes/terrain_extender.pal | 19 +++++++++++++++ graphics/items/icons/adrenaline_orb.png | Bin 0 -> 260 bytes graphics/items/icons/electric_seed.png | Bin 0 -> 310 bytes graphics/items/icons/grassy_seed.png | Bin 0 -> 310 bytes graphics/items/icons/misty_seed.png | Bin 0 -> 310 bytes graphics/items/icons/protective_pads.png | Bin 0 -> 335 bytes graphics/items/icons/psychic_seed.png | Bin 0 -> 310 bytes graphics/items/icons/terrain_extender.png | Bin 0 -> 313 bytes include/graphics.h | 15 ++++++++++++ src/data/graphics/items.h | 23 ++++++++++++++++++ src/data/item_icon_table.h | 8 ++++++ 17 files changed, 179 insertions(+) create mode 100755 graphics/items/icon_palettes/adrenaline_orb.pal create mode 100755 graphics/items/icon_palettes/electric_seed.pal create mode 100755 graphics/items/icon_palettes/grassy_seed.pal create mode 100755 graphics/items/icon_palettes/misty_seed.pal create mode 100755 graphics/items/icon_palettes/protective_pads.pal create mode 100755 graphics/items/icon_palettes/psychic_seed.pal create mode 100755 graphics/items/icon_palettes/terrain_extender.pal create mode 100755 graphics/items/icons/adrenaline_orb.png create mode 100755 graphics/items/icons/electric_seed.png create mode 100755 graphics/items/icons/grassy_seed.png create mode 100755 graphics/items/icons/misty_seed.png create mode 100755 graphics/items/icons/protective_pads.png create mode 100755 graphics/items/icons/psychic_seed.png create mode 100755 graphics/items/icons/terrain_extender.png diff --git a/graphics/items/icon_palettes/adrenaline_orb.pal b/graphics/items/icon_palettes/adrenaline_orb.pal new file mode 100755 index 0000000000..f2b1e719e0 --- /dev/null +++ b/graphics/items/icon_palettes/adrenaline_orb.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +49 49 49 +41 65 115 +90 172 222 +57 90 148 +106 197 238 +123 230 246 +82 148 189 +82 115 164 +57 106 172 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/electric_seed.pal b/graphics/items/icon_palettes/electric_seed.pal new file mode 100755 index 0000000000..5c264cdc94 --- /dev/null +++ b/graphics/items/icon_palettes/electric_seed.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +49 49 49 +213 148 65 +246 246 82 +246 222 74 +238 246 197 +156 106 16 +106 82 65 +205 139 24 +238 189 41 +106 90 74 +156 90 49 +246 222 123 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/grassy_seed.pal b/graphics/items/icon_palettes/grassy_seed.pal new file mode 100755 index 0000000000..2f1acee397 --- /dev/null +++ b/graphics/items/icon_palettes/grassy_seed.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +49 49 49 +139 172 82 +197 230 90 +172 197 90 +238 246 197 +156 106 16 +65 74 24 +205 139 24 +238 189 41 +106 90 74 +106 148 82 +246 222 123 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/misty_seed.pal b/graphics/items/icon_palettes/misty_seed.pal new file mode 100755 index 0000000000..8957472cf4 --- /dev/null +++ b/graphics/items/icon_palettes/misty_seed.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +49 49 49 +98 123 189 +205 230 255 +139 189 255 +238 246 197 +156 106 16 +65 74 115 +205 139 24 +238 189 41 +106 90 74 +82 82 156 +246 222 123 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/protective_pads.pal b/graphics/items/icon_palettes/protective_pads.pal new file mode 100755 index 0000000000..604b7b85a6 --- /dev/null +++ b/graphics/items/icon_palettes/protective_pads.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +49 49 49 +205 222 238 +172 189 213 +131 156 180 +98 106 164 +106 123 131 +148 156 164 +255 255 255 +213 213 205 +172 180 180 +74 82 90 +131 148 197 +74 90 148 +98 98 123 +156 172 205 diff --git a/graphics/items/icon_palettes/psychic_seed.pal b/graphics/items/icon_palettes/psychic_seed.pal new file mode 100755 index 0000000000..0fd91e0da7 --- /dev/null +++ b/graphics/items/icon_palettes/psychic_seed.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +49 49 49 +172 98 189 +255 205 255 +197 139 197 +238 246 197 +156 106 16 +65 74 24 +205 139 24 +238 189 41 +106 90 74 +115 65 123 +246 222 123 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icon_palettes/terrain_extender.pal b/graphics/items/icon_palettes/terrain_extender.pal new file mode 100755 index 0000000000..2ae8d133e8 --- /dev/null +++ b/graphics/items/icon_palettes/terrain_extender.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +255 0 128 +49 49 49 +180 197 197 +123 139 139 +74 82 82 +255 255 255 +213 230 230 +49 106 106 +74 148 164 +131 213 213 +222 123 106 +222 65 41 +172 57 49 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/items/icons/adrenaline_orb.png b/graphics/items/icons/adrenaline_orb.png new file mode 100755 index 0000000000000000000000000000000000000000..913366e1184cec9101f14d1cd1b73570b8ff35af GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}H0G|-o z{|pU=hK8Ds#ZhbSSw>CCI{L2q*|(r6dxMIXSZ1yHeWT?+P$gqYkY6x^!?PP{Ku(LN zi(`ny<>Ukf29^nyJrV%$su})q-&@jQ85wG6Xs$Q=rfoh8^ig`U=|x=qve$sMWLag zsb4z<#5<-pGh8X`x!m}svmpHZ981BI{7p;}2bmaZCM%{~n#b%1bPt24tDnm{r-UW| DN_NS%G}@0G|-o z{|pU=hK5(CIDY#U^zEM4yKhJ5WC>&iIiBs7c(+$GE6Qt5l;O8~)pO6NtpRFbED7=p zW^j0RBMrz|>*?YcB5^r6VF6o$h=@Z$OOLFe(5ZuJOifJ+%N8t{v1y~{!Y<(e&E)4j zqR~Bb!%B8&7#Vn+3Atr=+co>#Nil)+NvBtZ?k-;&wK+?1!s16)i;IqS&5WIE%p!3l zM5}M!%%w|qCM}z!#QgY}Z2Gw~Mc?8KPu>*B*m7*nu|lLB8-uKx-Vs-^jk|yjXYh3Ob6Mw< G&;$U4jdeo+ literal 0 HcmV?d00001 diff --git a/graphics/items/icons/grassy_seed.png b/graphics/items/icons/grassy_seed.png new file mode 100755 index 0000000000000000000000000000000000000000..31f30aeb59fd1fafcc3beb6c99d59bd3d89e45ed GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pU=hKAj1f{s3mT5~k&-M6E2vIHExB+hnAyxXgp73GyRCFt9|>a>LoVn8j7B|(0{ z3=Yq3qyaf=JzX3_BrYc>EMQ9z5pgJJ>5&x_I(1Nusi{d}*@6W#Hf{7=*d-jGnf$y* zG`eSQSji3zBLj~!A-C*qyJnv|DJGCU>GZ15-Q{beHfJeLSp4W}anaGPnXz+?StO2x zX!XsTxpc|Sq-B$om>(aLO+R<0=v$oO$(sThTaL|{ym^jq*oqlUmOWZ?jd#!Sowib< z*-|dkNy|@qd&3k%j-47tTAAD)yEz>0@{~v}R*1A?V~|zTJK`#~aTn0x44$rjF6*2U FngA}IbH@Mx literal 0 HcmV?d00001 diff --git a/graphics/items/icons/misty_seed.png b/graphics/items/icons/misty_seed.png new file mode 100755 index 0000000000000000000000000000000000000000..58764aca50fca69dcbd3da443f5435021f63c50a GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pU=hK5Pid(S@m-@W($yKhJ5WC=KW6`$>vc(+$GE6OVlFzk+__kuz)Q=M8u(>rAJm!=+r?qrlux^WeXO}*tF4eVV7`#X7ckM z(deGJVI?~>j0`-^gxs>b?V5e=q?kbZq|>WHcbBh?+MK00VezA@#YIQEX2#AnW|24& zqSZHV=F%lQla@_VVt#x~HvQb0qHl4ACvOU5Y&kY(^5!|dVJl`ZS@vknHQqhPciKvc zW=pwDCoMne?F~~5Id*CoX=QSI?B;N|%Tpq`SRvAmjX_pT?})3|#$7;%GkCiCxvXNS%G|m0G|-o z{|pU=hK6VFy<4;QYV({eNm)y>s+*_GS@Qq?|EpKeuGzB1D=4aY%2BVVDM?AybJm>o z7cR~P>SZhm@(X5gcy=QV$l2@Z;us=vIXS_By{V~*sbJfr&TNG#XIF^K3Y*6^Rfx;? zbif2$Q&#CyoqYxP?#4yhZRSx@ zULh5`t?1{w0E706nkB!#+%;6|OXypl_2sq1(#4Ge)q1k5o17J2wY=Ao|5a=f!nx?& z({=ym8+$G669~8d|Fd4B%KXYhC&TBV<<2@xQi5Dl1X`**)I&l81fGR1T-?=RkPsr| ez$eJ&!@y8=#>#Obzh)88BMhFdelF{r5}E)C3V^== literal 0 HcmV?d00001 diff --git a/graphics/items/icons/psychic_seed.png b/graphics/items/icons/psychic_seed.png new file mode 100755 index 0000000000000000000000000000000000000000..4c90afb9c9b5feb29fc5ddd7f22a237ad422dc06 GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pU=hK6gB_WnQn|7iEoci)cA$r5n%k~rHf@oukXR+LwRs zXmroqu#z1bMg|^dLT=gJcFjI_QcNIy(&<&9yUW)`ZO&4hu=vr{;-aHnGh^o(vq&5X z(dwHwbLoNS%G}@0G|-o z{|pU=hK5^?9wm+9OXr`o^VV~E@5Pv;iV|NT_oMv(Q!jd zQP;u^lQ%L%bX`1g=BTT0WP{)t%`k6oZzJ&pmes=MVL?WEDG3b)R%vA=4<4+!wU_HG@nyj2QxJA Date: Thu, 7 Mar 2019 12:20:57 +0100 Subject: [PATCH 291/667] VCreate and fix stat stage changes functions --- data/battle_scripts_1.s | 32 +++++++++++++++ include/battle_scripts.h | 1 + include/constants/battle.h | 1 + include/constants/battle_move_effects.h | 1 + src/battle_script_commands.c | 53 ++++++++++++++++--------- src/data/battle_moves.h | 2 +- 6 files changed, 71 insertions(+), 19 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 603e2c5ce9..29931e5975 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -344,6 +344,38 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectBelch .4byte BattleScript_EffectPartingShot .4byte BattleScript_EffectSpectralThief + .4byte BattleScript_EffectVCreate + +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, ATK48_STAT_NEGATIVE | ATK48_DONT_CHECK_LOWER + setstatchanger STAT_DEF, 1, TRUE + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_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_CHANGE_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_CHANGE_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 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 098eda042c..1c68b909b0 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -299,5 +299,6 @@ extern const u8 BattleScript_StatUpMsg[]; extern const u8 BattleScript_DefiantActivates[]; extern const u8 BattleScript_PowderMoveNoEffect[]; extern const u8 BattleScript_GrassyTerrainLoop[]; +extern const u8 BattleScript_VCreateStatLoss[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle.h b/include/constants/battle.h index 63db1523cd..c42188596e 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -325,6 +325,7 @@ #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_AFFECTS_USER 0x4000 #define MOVE_EFFECT_CERTAIN 0x8000 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 85cac188e3..588fe97739 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -332,5 +332,6 @@ #define EFFECT_BELCH 326 #define EFFECT_PARTING_SHOT 327 #define EFFECT_SPECTRAL_THIEF 328 +#define EFFECT_V_CREATE 329 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 29fb9cddc4..4ef73926c6 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2782,6 +2782,10 @@ void SetMoveEffect(bool32 primary, u32 certain) gBattlescriptCurrInstr = BattleScript_SpectralThiefSteal; } break; + case MOVE_EFFECT_V_CREATE: + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_VCreateStatLoss; + break; } } } @@ -4040,18 +4044,27 @@ static void atk47_setgraphicalstatchangevalues(void) static void atk48_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] & ATK48_STAT_NEGATIVE) // goes down + // Handle Contrary and Simple + if (ability == ABILITY_CONTRARY) + flags ^= ATK48_STAT_NEGATIVE; + else if (ability == ABILITY_SIMPLE) + flags |= ATK48_STAT_BY_TWO; + + if (flags & ATK48_STAT_NEGATIVE) // goes down { - s16 startingStatAnimId; - if (gBattlescriptCurrInstr[3] & ATK48_STAT_BY_TWO) + if (flags & ATK48_STAT_BY_TWO) startingStatAnimId = STAT_ANIM_MINUS2 - 1; else startingStatAnimId = STAT_ANIM_MINUS1 - 1; @@ -4060,7 +4073,7 @@ static void atk48_playstatchangeanimation(void) { if (statsToCheck & 1) { - if (gBattlescriptCurrInstr[3] & ATK48_DONT_CHECK_LOWER) + if (flags & ATK48_DONT_CHECK_LOWER) { if (gBattleMons[gActiveBattler].statStages[currStat] > 0) { @@ -4069,10 +4082,10 @@ static void atk48_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_WHITE_SMOKE + && !(ability == ABILITY_KEEN_EYE && currStat == STAT_ACC) + && !(ability == ABILITY_HYPER_CUTTER && currStat == STAT_ATK)) { if (gBattleMons[gActiveBattler].statStages[currStat] > 0) { @@ -4086,7 +4099,7 @@ static void atk48_playstatchangeanimation(void) if (changeableStatsCount > 1) // more than one stat, so the color is gray { - if (gBattlescriptCurrInstr[3] & ATK48_STAT_BY_TWO) + if (flags & ATK48_STAT_BY_TWO) statAnimId = STAT_ANIM_MULTIPLE_MINUS2; else statAnimId = STAT_ANIM_MULTIPLE_MINUS1; @@ -4094,8 +4107,7 @@ static void atk48_playstatchangeanimation(void) } else // goes up { - s16 startingStatAnimId; - if (gBattlescriptCurrInstr[3] & ATK48_STAT_BY_TWO) + if (flags & ATK48_STAT_BY_TWO) startingStatAnimId = STAT_ANIM_PLUS2 - 1; else startingStatAnimId = STAT_ANIM_PLUS1 - 1; @@ -4112,14 +4124,14 @@ static void atk48_playstatchangeanimation(void) if (changeableStatsCount > 1) // more than one stat, so the color is gray { - if (gBattlescriptCurrInstr[3] & ATK48_STAT_BY_TWO) + if (flags & ATK48_STAT_BY_TWO) statAnimId = STAT_ANIM_MULTIPLE_PLUS2; else statAnimId = STAT_ANIM_MULTIPLE_PLUS1; } } - if (gBattlescriptCurrInstr[3] & ATK48_ONLY_MULTIPLE && changeableStatsCount < 2) + if (flags & ATK48_ONLY_MULTIPLE && changeableStatsCount < 2) { gBattlescriptCurrInstr += 4; } @@ -4127,7 +4139,7 @@ static void atk48_playstatchangeanimation(void) { BtlController_EmitBattleAnimation(0, B_ANIM_STATS_CHANGE, statAnimId); MarkBattlerForControllerExec(gActiveBattler); - if (gBattlescriptCurrInstr[3] & ATK48_ONLY_MULTIPLE && changeableStatsCount > 1) + if (flags & ATK48_ONLY_MULTIPLE && changeableStatsCount > 1) gBattleScripting.statAnimPlayed = TRUE; gBattlescriptCurrInstr += 4; } @@ -7978,9 +7990,14 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr static void atk89_statbuffchange(void) { + 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), T1_READ_16(gBattlescriptCurrInstr + 1), jumpPtr) == STAT_CHANGE_WORKED) + + 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 atk8A_normalisebuffs(void) // haze diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 4816621b05..89f499c2b9 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -7813,7 +7813,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_V_CREATE] = { - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_V_CREATE, .power = 180, .type = TYPE_FIRE, .accuracy = 95, From 3e5d64a070e1f2bf34fd91634106e8a9f9f259e9 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Thu, 7 Mar 2019 13:47:02 -0300 Subject: [PATCH 292/667] Fixed the Protective Pads' description. --- src/data/text/item_descriptions.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/text/item_descriptions.h b/src/data/text/item_descriptions.h index afb907fe93..7a8b4f1a48 100644 --- a/src/data/text/item_descriptions.h +++ b/src/data/text/item_descriptions.h @@ -444,7 +444,7 @@ const u8 gLopunniteItemDescription[] = _("This stone enables\nLopunny to Mega\nE const u8 gSalamenciteItemDescription[] = _("This stone enables\nSalamence to Mega\nEvolve in battle."); const u8 gBeedrilliteItemDescription[] = _("This stone enables\nBeedrill to Mega\nEvolve in battle."); const u8 gMegaBraceletItemDescription[] = _("Allows Pokémon holding\na Mega Stone to Mega\nEvolve in battle."); -const u8 gProtectPadsItemDescription[] = _("Guards the holder\nfrom effects caused\nby contact moves."); +const u8 gProtectPadsItemDescription[] = _("Guard the holder\nfrom contact move\neffects."); const u8 gTerrainExtenderItemDescription[] = _("Extends the length\nof the active\nbattle terrain."); const u8 gElectricSeedItemDescription[] = _("Boosts Defense on\nElectric Terrain,\nbut only one time."); const u8 gGrassySeedItemDescription[] = _("Boosts Defense on\nGrassy Terrain,\nbut only one time."); From 25ff138ead324bcab95574400f39422b27337820 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Thu, 7 Mar 2019 13:52:46 -0300 Subject: [PATCH 293/667] Reordered the Item IDs a little bit to add the Safety Goggles and also added their item data. --- include/constants/items.h | 113 +++++++++++++++--------------- src/data/items.h | 18 +++++ src/data/text/item_descriptions.h | 1 + 3 files changed, 76 insertions(+), 56 deletions(-) diff --git a/include/constants/items.h b/include/constants/items.h index bdd4212e11..176750a16b 100644 --- a/include/constants/items.h +++ b/include/constants/items.h @@ -541,65 +541,66 @@ // Gen6 Items #define ITEM_ASSAULT_VEST 448 #define ITEM_PIXIE_PLATE 449 -#define ITEM_GENGARITE 450 -#define ITEM_GARDEVOIRITE 451 -#define ITEM_AMPHAROSITE 452 -#define ITEM_VENUSAURITE 453 -#define ITEM_CHARIZARDITE_X 454 -#define ITEM_BLASTOISINITE 455 -#define ITEM_MEWTWONITE_X 456 -#define ITEM_MEWTWONITE_Y 457 -#define ITEM_BLAZIKENITE 458 -#define ITEM_MEDICHAMITE 459 -#define ITEM_HOUNDOOMINITE 460 -#define ITEM_AGGRONITE 461 -#define ITEM_BANETTITE 462 -#define ITEM_TYRANITARITE 463 -#define ITEM_SCIZORITE 464 -#define ITEM_PINSIRITE 465 -#define ITEM_AERODACTYLITE 466 -#define ITEM_LUCARIONITE 467 -#define ITEM_ABOMASITE 468 -#define ITEM_KANGASKHANITE 469 -#define ITEM_GYARADOSITE 470 -#define ITEM_ABSOLITE 471 -#define ITEM_CHARIZARDITE_Y 472 -#define ITEM_ALAKAZITE 473 -#define ITEM_HERACRONITE 474 -#define ITEM_MAWILITE 475 -#define ITEM_MANECTITE 476 -#define ITEM_GARCHOMPITE 477 -#define ITEM_LATIASITE 478 -#define ITEM_LATIOSITE 479 -#define ITEM_SWAMPERTITE 480 -#define ITEM_SCEPTILITE 481 -#define ITEM_SABLENITE 482 -#define ITEM_ALTARIANITE 483 -#define ITEM_GALLADITE 484 -#define ITEM_AUDINITE 485 -#define ITEM_METAGROSSITE 486 -#define ITEM_SHARPEDONITE 487 -#define ITEM_SLOWBRONITE 488 -#define ITEM_STEELIXITE 489 -#define ITEM_PIDGEOTITE 490 -#define ITEM_GLALITITE 491 -#define ITEM_DIANCITE 492 -#define ITEM_CAMERUPTITE 493 -#define ITEM_LOPUNNITE 494 -#define ITEM_SALAMENCITE 495 -#define ITEM_BEEDRILLITE 496 -#define ITEM_MEGA_BRACELET 497 +#define ITEM_SAFETY_GOGGLES 450 +#define ITEM_GENGARITE 451 +#define ITEM_GARDEVOIRITE 452 +#define ITEM_AMPHAROSITE 453 +#define ITEM_VENUSAURITE 454 +#define ITEM_CHARIZARDITE_X 455 +#define ITEM_BLASTOISINITE 456 +#define ITEM_MEWTWONITE_X 457 +#define ITEM_MEWTWONITE_Y 458 +#define ITEM_BLAZIKENITE 459 +#define ITEM_MEDICHAMITE 460 +#define ITEM_HOUNDOOMINITE 461 +#define ITEM_AGGRONITE 462 +#define ITEM_BANETTITE 463 +#define ITEM_TYRANITARITE 464 +#define ITEM_SCIZORITE 465 +#define ITEM_PINSIRITE 466 +#define ITEM_AERODACTYLITE 467 +#define ITEM_LUCARIONITE 468 +#define ITEM_ABOMASITE 469 +#define ITEM_KANGASKHANITE 470 +#define ITEM_GYARADOSITE 471 +#define ITEM_ABSOLITE 472 +#define ITEM_CHARIZARDITE_Y 473 +#define ITEM_ALAKAZITE 474 +#define ITEM_HERACRONITE 475 +#define ITEM_MAWILITE 476 +#define ITEM_MANECTITE 477 +#define ITEM_GARCHOMPITE 478 +#define ITEM_LATIASITE 479 +#define ITEM_LATIOSITE 480 +#define ITEM_SWAMPERTITE 481 +#define ITEM_SCEPTILITE 482 +#define ITEM_SABLENITE 483 +#define ITEM_ALTARIANITE 484 +#define ITEM_GALLADITE 485 +#define ITEM_AUDINITE 486 +#define ITEM_METAGROSSITE 487 +#define ITEM_SHARPEDONITE 488 +#define ITEM_SLOWBRONITE 489 +#define ITEM_STEELIXITE 490 +#define ITEM_PIDGEOTITE 491 +#define ITEM_GLALITITE 492 +#define ITEM_DIANCITE 493 +#define ITEM_CAMERUPTITE 494 +#define ITEM_LOPUNNITE 495 +#define ITEM_SALAMENCITE 496 +#define ITEM_BEEDRILLITE 497 +#define ITEM_MEGA_BRACELET 498 // Gen7 hold effects -#define ITEM_PROTECTIVE_PADS 498 -#define ITEM_TERRAIN_EXTENDER 499 -#define ITEM_ELECTRIC_SEED 500 -#define ITEM_GRASSY_SEED 501 -#define ITEM_MISTY_SEED 502 -#define ITEM_PSYCHIC_SEED 503 -#define ITEM_ADRENALINE_ORB 504 +#define ITEM_PROTECTIVE_PADS 499 +#define ITEM_TERRAIN_EXTENDER 500 +#define ITEM_ELECTRIC_SEED 501 +#define ITEM_GRASSY_SEED 502 +#define ITEM_MISTY_SEED 503 +#define ITEM_PSYCHIC_SEED 504 +#define ITEM_ADRENALINE_ORB 505 -#define ITEMS_COUNT 505 +#define ITEMS_COUNT 506 #define ITEM_FIELD_ARROW ITEMS_COUNT #define FIRST_BERRY_INDEX ITEM_CHERI_BERRY diff --git a/src/data/items.h b/src/data/items.h index 768bac00c8..6751b018ef 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -8128,6 +8128,24 @@ const struct Item gItems[] = .battleUseFunc = NULL, .secondaryId = 0, }, + + [ITEM_SAFETY_GOGGLES] = + { + .name = _("SafetyGoggles"), + .itemId = ITEM_SAFETY_GOGGLES, + .price = 4000, + .holdEffect = HOLD_EFFECT_SAFETY_GOOGLES, + .holdEffectParam = 0, + .description = gSafetyGogglesItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, [ITEM_GENGARITE] = { diff --git a/src/data/text/item_descriptions.h b/src/data/text/item_descriptions.h index 7a8b4f1a48..57671d1e72 100644 --- a/src/data/text/item_descriptions.h +++ b/src/data/text/item_descriptions.h @@ -398,6 +398,7 @@ const u8 gNormalGemItemDescription[] = _("Increases the\npower of Normal\nType m const u8 gFairyGemItemDescription[] = _("Increases the\npower of Fairy\nType moves."); const u8 gAssaultVestItemDescription[] = _("Raises Sp. Def but\nprevents the use of\nstatus moves."); const u8 gPixiePlateItemDescription[] = _("A stone tablet that\nboosts the power of\nFairy-type moves."); +const u8 gSafetyGogglesItemDescription[] = _("Protect from\nweather damage and\npowder moves."); const u8 gGengariteItemDescription[] = _("This stone enables\nGengar to Mega\nEvolve in battle."); const u8 gGardevoiriteItemDescription[] = _("This stone enables\nGardevoir to Mega\nEvolve in battle."); const u8 gAmpharositeItemDescription[] = _("This stone enables\nAmpharos to Mega\nEvolve in battle."); From 7d7e54c59a70416c4e736e3b09b471cea7eaf091 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Thu, 7 Mar 2019 13:54:54 -0300 Subject: [PATCH 294/667] Added the item sprite of the Safety Goggles. --- graphics/items/icon_palettes/safety_goggles.png | Bin 0 -> 386 bytes graphics/items/icons/safety_goggles.png | Bin 0 -> 386 bytes include/graphics.h | 2 ++ src/data/graphics/items.h | 3 +++ src/data/item_icon_table.h | 1 + 5 files changed, 6 insertions(+) create mode 100755 graphics/items/icon_palettes/safety_goggles.png create mode 100755 graphics/items/icons/safety_goggles.png diff --git a/graphics/items/icon_palettes/safety_goggles.png b/graphics/items/icon_palettes/safety_goggles.png new file mode 100755 index 0000000000000000000000000000000000000000..7a1efab67adffd72893d7ab8383ab500014ac898 GIT binary patch literal 386 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xu?EJb+&fI^cfkNUX zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0=j-CMiXDcR}&wQFMZL`gH zTyQQ}$I+*H{O!E5BC8#H8k}CONhoK1x%tPGW3T3J{^$L#-{D8nnfs1MvR?I_5NC3E zF1WV7boW!a(n;%bd_*EvuH)IFdD5~VH7j3X+3DDo@{XHKdS){z9j|#2CTx?}eemVh zNTt@-eb%j(iQ1L&6|pP{nnhV`|HC#5oxFHlL}%rl4Bq?fb!UYg?Ui`$+~0f> KKbLh*2~7ZYQHg>8 literal 0 HcmV?d00001 diff --git a/graphics/items/icons/safety_goggles.png b/graphics/items/icons/safety_goggles.png new file mode 100755 index 0000000000000000000000000000000000000000..7a1efab67adffd72893d7ab8383ab500014ac898 GIT binary patch literal 386 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xu?EJb+&fI^cfkNUX zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0=j-CMiXDcR}&wQFMZL`gH zTyQQ}$I+*H{O!E5BC8#H8k}CONhoK1x%tPGW3T3J{^$L#-{D8nnfs1MvR?I_5NC3E zF1WV7boW!a(n;%bd_*EvuH)IFdD5~VH7j3X+3DDo@{XHKdS){z9j|#2CTx?}eemVh zNTt@-eb%j(iQ1L&6|pP{nnhV`|HC#5oxFHlL}%rl4Bq?fb!UYg?Ui`$+~0f> KKbLh*2~7ZYQHg>8 literal 0 HcmV?d00001 diff --git a/include/graphics.h b/include/graphics.h index 5137f63942..ed25ae8e3c 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -3996,6 +3996,8 @@ extern const u32 gItemIcon_AssaultVest[]; extern const u32 gItemIconPalette_AssaultVest[]; extern const u32 gItemIcon_PixiePlate[]; extern const u32 gItemIconPalette_PixiePlate[]; +extern const u32 gItemIcon_SafetyGoggles[]; +extern const u32 gItemIconPalette_SafetyGoggles[]; extern const u32 gItemIcon_Gengarite[]; extern const u32 gItemIconPalette_Gengarite[]; extern const u32 gItemIcon_Gardevoirite[]; diff --git a/src/data/graphics/items.h b/src/data/graphics/items.h index d2026b3ba9..e20edbd647 100644 --- a/src/data/graphics/items.h +++ b/src/data/graphics/items.h @@ -962,6 +962,9 @@ const u32 gItemIconPalette_AssaultVest[] = INCBIN_U32("graphics/items/icon_palet const u32 gItemIcon_PixiePlate[] = INCBIN_U32("graphics/items/icons/pixie_plate.4bpp.lz"); const u32 gItemIconPalette_PixiePlate[] = INCBIN_U32("graphics/items/icon_palettes/pixie_plate.gbapal.lz"); +const u32 gItemIcon_SafetyGoggles[] = INCBIN_U32("graphics/items/icons/safety_goggles.4bpp.lz"); +const u32 gItemIconPalette_SafetyGoggles[] = INCBIN_U32("graphics/items/icon_palettes/safety_goggles.gbapal.lz"); + const u32 gItemIcon_Gengarite[] = INCBIN_U32("graphics/items/icons/gengarite.4bpp.lz"); const u32 gItemIconPalette_Gengarite[] = INCBIN_U32("graphics/items/icon_palettes/gengarite.gbapal.lz"); diff --git a/src/data/item_icon_table.h b/src/data/item_icon_table.h index 793a326a51..2b160ae202 100644 --- a/src/data/item_icon_table.h +++ b/src/data/item_icon_table.h @@ -478,6 +478,7 @@ const u32 *const gItemIconTable[][2] = // Gen 6 Items [ITEM_ASSAULT_VEST] = {gItemIcon_AssaultVest, gItemIconPalette_AssaultVest}, [ITEM_PIXIE_PLATE] = {gItemIcon_PixiePlate, gItemIconPalette_PixiePlate}, + [ITEM_SAFETY_GOGGLES] = {gItemIcon_SafetyGoggles, gItemIconPalette_SafetyGoggles}, [ITEM_GENGARITE] = {gItemIcon_Gengarite, gItemIconPalette_Gengarite}, [ITEM_GARDEVOIRITE] = {gItemIcon_Gardevoirite, gItemIconPalette_Gardevoirite}, [ITEM_AMPHAROSITE] = {gItemIcon_Ampharosite, gItemIconPalette_Ampharosite}, From c329252ce3c81c1064d3d947bdeeeb286677278d Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 8 Mar 2019 10:16:54 +0100 Subject: [PATCH 295/667] Add Safety Googles effect --- data/battle_scripts_1.s | 5 +++++ include/constants/battle_string_ids.h | 1 + src/battle_message.c | 2 ++ src/battle_script_commands.c | 6 ++++-- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 29931e5975..de90b63b27 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5616,9 +5616,14 @@ BattleScript_PowderMoveNoEffect:: 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 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 48737382b7..c3ddf2c0a6 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -523,6 +523,7 @@ #define STRINGID_GRASSYTERRAINHEALS 519 #define STRINGID_ELECTRICTERRAINPREVENTS 520 #define STRINGID_PSYCHICTERRAINPREVENTS 521 +#define STRINGID_SAFETYGOOGLESPROTECTED 522 #define BATTLESTRINGS_COUNT 529 diff --git a/src/battle_message.c b/src/battle_message.c index 1ad65a8d97..a2d475876b 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -648,9 +648,11 @@ static const u8 sText_MistyTerrainPreventsStatus[] = _("{B_DEF_NAME_WITH_PREFIX} 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}!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_SAFETYGOOGLESPROTECTED - 12] = sText_SafetyGooglesProtected, [STRINGID_SPECTRALTHIEFSTEAL - 12] = sText_SpectralThiefSteal, [STRINGID_BELCHCANTSELECT - 12] = sText_BelchCantUse, [STRINGID_TRAINER1LOSETEXT - 12] = sText_Trainer1LoseText, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 4ef73926c6..5ed4dec6df 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8470,7 +8470,8 @@ static void atk96_weatherdamage(void) && ability != ABILITY_SAND_RUSH && ability != ABILITY_OVERCOAT && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERGROUND) - && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER)) + && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER) + && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOOGLES) { gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16; if (gBattleMoveDamage == 0) @@ -8499,7 +8500,8 @@ static void atk96_weatherdamage(void) && ability != ABILITY_OVERCOAT && ability != ABILITY_ICE_BODY && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERGROUND) - && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER)) + && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER) + && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOOGLES) { gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16; if (gBattleMoveDamage == 0) From 34cbb26e5e13240e3055becc2149df3169e39154 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 8 Mar 2019 10:30:23 +0100 Subject: [PATCH 296/667] Synchronoise third type support --- src/battle_util.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 6de417249c..58826276c7 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5885,12 +5885,22 @@ void UndoMegaEvolution(u8 monId) bool32 DoBattlersShareType(u32 battler1, u32 battler2) { - if (gBattleMons[battler1].type1 == gBattleMons[battler2].type1 || gBattleMons[battler1].type1 == gBattleMons[battler2].type2) - return TRUE; - else if (gBattleMons[battler1].type2 == gBattleMons[battler2].type1 || gBattleMons[battler1].type2 == gBattleMons[battler2].type2) - return TRUE; - else - return FALSE; + 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) From e135ea47e584f3810cccef065fadaa49bdb2d799 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 23 Mar 2019 16:33:08 +0100 Subject: [PATCH 297/667] Touch up Anger Point --- data/battle_scripts_1.s | 4 ++-- include/battle.h | 2 +- src/battle_debug.c | 4 ++-- src/battle_script_commands.c | 11 +++++++++-- src/battle_util.c | 4 ++-- 5 files changed, 16 insertions(+), 9 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index de90b63b27..cf3306d8de 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6270,9 +6270,9 @@ BattleScript_MummyActivates:: return BattleScript_AngryPointActivates:: - setbyte sB_ANIM_ARG1 0x38 - setbyte sB_ANIM_ARG2 0x0 call BattleScript_AbilityPopUp + statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, NULL + setgraphicalstatchangevalues playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 printstring STRINGID_ANGRYPOINTACTIVATES waitmessage 0x40 diff --git a/include/battle.h b/include/battle.h index 8ebad4e00a..09a8916a6d 100644 --- a/include/battle.h +++ b/include/battle.h @@ -606,7 +606,7 @@ struct BattleStruct #define SET_STAT_BUFF_VALUE(n)((((n) << 3) & 0xF8)) -#define SET_STATCHANGER(statId, stage, goesDown)(gBattleScripting.statChanger = (statId) + (stage << 3) + (goesDown << 7)) +#define SET_STATCHANGER(statId, stage, goesDown)(gBattleScripting.statChanger = (statId) + ((stage) << 3) + (goesDown << 7)) struct BattleScripting { diff --git a/src/battle_debug.c b/src/battle_debug.c index cd0aacbe33..3cdfcfeee5 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -707,7 +707,7 @@ static void Task_DebugMenuProcessInput(u8 taskId) if (data->activeWindow == ACTIVE_WIN_MAIN) { listItemId = ListMenu_ProcessInput(data->mainListTaskId); - if (listItemId != LIST_B_PRESSED && listItemId != LIST_NOTHING_CHOSEN && listItemId < LIST_ITEM_COUNT) + if (listItemId != LIST_CANCEL && listItemId != LIST_NOTHING_CHOSEN && listItemId < LIST_ITEM_COUNT) { data->currentMainListItemId = listItemId; @@ -721,7 +721,7 @@ static void Task_DebugMenuProcessInput(u8 taskId) else if (data->activeWindow == ACTIVE_WIN_SECONDARY) { listItemId = ListMenu_ProcessInput(data->secondaryListTaskId); - if (listItemId == LIST_B_PRESSED) + if (listItemId == LIST_CANCEL) { DestroyListMenuTask(data->secondaryListTaskId, NULL, NULL); ClearStdWindowAndFrameToTransparent(data->secondaryListWindowId, TRUE); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 2907bf8159..2599d11cfe 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4011,8 +4011,9 @@ static void atk46_playanimation2(void) // animation Id is stored in the first po static void atk47_setgraphicalstatchangevalues(void) { - u8 value = 0; - switch (GET_STAT_BUFF_VALUE_WITH_SIGN(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; @@ -4032,6 +4033,12 @@ static void atk47_setgraphicalstatchangevalues(void) 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; diff --git a/src/battle_util.c b/src/battle_util.c index 58826276c7..71f55c2e79 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3214,9 +3214,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && gIsCriticalHit && TARGET_TURN_DAMAGED && IsBattlerAlive(battler) - && gBattleMons[battler].statStages[STAT_ATK] != 0xC) + && gBattleMons[battler].statStages[STAT_ATK] != 12) { - gBattleMons[battler].statStages[STAT_ATK] = 0xC; + SET_STATCHANGER(STAT_ATK, 12 - gBattleMons[battler].statStages[STAT_ATK], FALSE); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_AngryPointActivates; effect++; From b9052fb37ddff1ea63b871dc554a41c53f954157 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 23 Mar 2019 16:37:56 +0100 Subject: [PATCH 298/667] Touch Up Justified and Rattled --- data/battle_scripts_1.s | 3 ++- src/battle_util.c | 8 +++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index cf3306d8de..e82f1ef4f9 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6279,8 +6279,9 @@ BattleScript_AngryPointActivates:: return BattleScript_TargetAbilityStatRaise:: - setgraphicalstatchangevalues call BattleScript_AbilityPopUp + statbuffchange STAT_CHANGE_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, NULL + setgraphicalstatchangevalues playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 waitanimation printstring STRINGID_TARGETABILITYSTATRAISE diff --git a/src/battle_util.c b/src/battle_util.c index 71f55c2e79..29dd2974bc 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3132,9 +3132,8 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && TARGET_TURN_DAMAGED && IsBattlerAlive(battler) && moveType == TYPE_DARK - && gBattleMons[battler].statStages[STAT_ATK] != 0xC) + && gBattleMons[battler].statStages[STAT_ATK] != 12) { - gBattleMons[battler].statStages[STAT_ATK]++; SET_STATCHANGER(STAT_ATK, 1, FALSE); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaise; @@ -3146,9 +3145,8 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && TARGET_TURN_DAMAGED && IsBattlerAlive(battler) && (moveType == TYPE_DARK || moveType == TYPE_BUG || moveType == TYPE_GHOST) - && gBattleMons[battler].statStages[STAT_SPEED] != 0xC) + && gBattleMons[battler].statStages[STAT_SPEED] != 12) { - gBattleMons[battler].statStages[STAT_SPEED]++; SET_STATCHANGER(STAT_SPEED, 1, FALSE); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_TargetAbilityStatRaise; @@ -3159,7 +3157,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && TARGET_TURN_DAMAGED && IsBattlerAlive(battler) - && (gBattleMons[battler].statStages[STAT_SPEED] != 0xC || gBattleMons[battler].statStages[STAT_DEF] != 0)) + && (gBattleMons[battler].statStages[STAT_SPEED] != 12 || gBattleMons[battler].statStages[STAT_DEF] != 0)) { BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_WeakArmorActivates; From b8a634770f5fc5d8f74d62fa7e7bcc0f45e80558 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 23 Mar 2019 16:56:56 +0100 Subject: [PATCH 299/667] Touch up Weak Armor --- data/battle_scripts_1.s | 4 ++-- src/battle_util.c | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e82f1ef4f9..30c4cdc03a 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6289,8 +6289,8 @@ BattleScript_TargetAbilityStatRaise:: return BattleScript_WeakArmorActivates:: - setstatchanger STAT_DEF, 1, TRUE call BattleScript_AbilityPopUp + setstatchanger STAT_DEF, 1, TRUE statbuffchange 0x1, BattleScript_WeakArmorActivatesSpeed jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, 0x2, BattleScript_WeakArmorDefAnim jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x3, BattleScript_WeakArmorActivatesSpeed @@ -6304,7 +6304,7 @@ BattleScript_WeakArmorDefAnim: printstring STRINGID_TARGETABILITYSTATLOWER waitmessage 0x40 BattleScript_WeakArmorActivatesSpeed: - setstatchanger STAT_SPEED, 1, FALSE + setstatchanger STAT_SPEED, 2, FALSE statbuffchange 0x1, BattleScript_WeakArmorActivatesEnd jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, 0x2, BattleScript_WeakArmorSpeedAnim jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x3, BattleScript_WeakArmorActivatesEnd diff --git a/src/battle_util.c b/src/battle_util.c index 29dd2974bc..21b540c900 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3157,6 +3157,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA 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(); From d1fb5fa14860524e1f42e7f5df7c88f8222828c8 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 23 Mar 2019 16:59:58 +0100 Subject: [PATCH 300/667] Remove unnecessary condition from Cursed Body --- src/battle_util.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 21b540c900..6741c51e95 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3170,7 +3170,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && TARGET_TURN_DAMAGED && gDisableStructs[gBattlerAttacker].disabledMove == MOVE_NONE && IsBattlerAlive(gBattlerAttacker) - && ((i = GetBattleMonMoveSlot(&gBattleMons[gBattlerAttacker], gChosenMove)) != 4) && (Random() % 3) == 0) { gDisableStructs[gBattlerAttacker].disabledMove = gChosenMove; From 7018745230a241990f2747fe60e5d2f547908d92 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 23 Mar 2019 17:21:14 +0100 Subject: [PATCH 301/667] Fix Defiant stat raise by allies --- include/battle.h | 1 + src/battle_script_commands.c | 2 ++ src/battle_util.c | 7 ++++--- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/include/battle.h b/include/battle.h index 09a8916a6d..4f45972945 100644 --- a/include/battle.h +++ b/include/battle.h @@ -226,6 +226,7 @@ struct SpecialStatus s32 specialDmg; u8 physicalBattlerId; u8 specialBattlerId; + u8 changedStatsBattlerId; // Battler that was responsible for the latest stat change. Can be self. }; struct SideTimer diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 2599d11cfe..a5b6e46f45 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7808,6 +7808,8 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr else gActiveBattler = gBattlerTarget; + gSpecialStatuses[gActiveBattler].changedStatsBattlerId = gBattlerAttacker; + flags &= ~(MOVE_EFFECT_AFFECTS_USER); if (flags & MOVE_EFFECT_CERTAIN) diff --git a/src/battle_util.c b/src/battle_util.c index 6741c51e95..901edb152e 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -489,9 +489,10 @@ void PrepareStringBattle(u16 stringId, u8 battler) stringId = STRINGID_STATSWONTDECREASE2; // Check Defiant and Competitive stat raise whenever a stat is lowered. - else if (((GetBattlerAbility(gBattlerTarget) == ABILITY_DEFIANT && gBattleMons[gBattlerTarget].statStages[STAT_ATK] != 12) - || (GetBattlerAbility(gBattlerTarget) == ABILITY_COMPETITIVE && gBattleMons[gBattlerTarget].statStages[STAT_SPATK] != 12)) - && stringId == STRINGID_PKMNSSTATCHANGED4) + else if (stringId == STRINGID_PKMNSSTATCHANGED4 + && ((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)) { gBattlerAbility = gBattlerTarget; BattleScriptPushCursor(); From 61a7bd2788e6a9bd67edc62374bd12f09d0dfe7b Mon Sep 17 00:00:00 2001 From: Papa Cancer Date: Sun, 24 Mar 2019 02:45:21 +0000 Subject: [PATCH 302/667] Taunt fix etc. Taunt now works for the correct number of turns and has its own ending string - made by reusing the "Heal Block ends" string as a multi-purpose "X wore off" one. Fixed a bug in PREPARE_STRING_BUFFER and touched up the ENDTURN timers for various STATUS3's. Heal Block now displays the correct string when preventing usage of a move. --- data/battle_scripts_1.s | 15 ++++-------- include/battle_message.h | 2 +- include/battle_scripts.h | 3 +-- include/constants/battle_string_ids.h | 4 ++-- src/battle_message.c | 16 ++++++------- src/battle_script_commands.c | 7 ++++-- src/battle_util.c | 34 ++++++++++++--------------- 7 files changed, 37 insertions(+), 44 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 30c4cdc03a..e97e18465a 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5350,16 +5350,16 @@ BattleScript_SelectingNotAllowedMoveGravityInPalace:: goto BattleScript_SelectingUnusableMoveInPalace BattleScript_SelectingNotAllowedMoveHealBlock:: - printselectionstring STRINGID_GRAVITYPREVENTSUSAGE + printselectionstring STRINGID_HEALBLOCKPREVENTSUSAGE endselectionscript BattleScript_MoveUsedHealBlockPrevents:: - printstring STRINGID_GRAVITYPREVENTSUSAGE + printstring STRINGID_HEALBLOCKPREVENTSUSAGE waitmessage 0x40 goto BattleScript_MoveEnd BattleScript_SelectingNotAllowedMoveHealBlockInPalace:: - printstring STRINGID_GRAVITYPREVENTSUSAGE + printstring STRINGID_HEALBLOCKPREVENTSUSAGE goto BattleScript_SelectingUnusableMoveInPalace BattleScript_WishComesTrue:: @@ -5773,18 +5773,13 @@ BattleScript_EmbargoEndTurn:: waitmessage 0x40 end2 -BattleScript_MagnetRiseEndTurn:: - printstring STRINGID_MAGNETRISEENDS - waitmessage 0x40 - end2 - BattleScript_TelekinesisEndTurn:: printstring STRINGID_TELEKINESISENDS waitmessage 0x40 end2 -BattleScript_HealBlockEndTurn:: - printstring STRINGID_HEALBLOCKENDS +BattleScript_BufferEndTurn:: + printstring STRINGID_BUFFERENDS waitmessage 0x40 end2 diff --git a/include/battle_message.h b/include/battle_message.h index 102398d0d8..04142dd49e 100644 --- a/include/battle_message.h +++ b/include/battle_message.h @@ -150,7 +150,7 @@ { \ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \ textVar[1] = B_BUFF_STRING; \ - textVar[2] = stringId; \ + textVar[2] = stringId & 0xFF; \ textVar[3] = (stringId & 0xFF00) >> 8; \ textVar[4] = B_BUFF_EOS; \ } diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 1c68b909b0..351ee9706a 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -225,9 +225,8 @@ extern const u8 BattleScript_ActionWatchesCarefully[]; extern const u8 BattleScript_ActionGetNear[]; extern const u8 BattleScript_ActionThrowPokeblock[]; extern const u8 BattleScript_EmbargoEndTurn[]; -extern const u8 BattleScript_MagnetRiseEndTurn[]; extern const u8 BattleScript_TelekinesisEndTurn[]; -extern const u8 BattleScript_HealBlockEndTurn[]; +extern const u8 BattleScript_BufferEndTurn[]; extern const u8 BattleScript_AquaRingHeal[]; extern const u8 BattleScript_AuroraVeilEnds[]; extern const u8 BattleScript_LuckyChantEnds[]; diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index c3ddf2c0a6..9f9425d0da 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -434,8 +434,8 @@ #define STRINGID_REFLECTTARGETSTYPE 430 #define STRINGID_TRANSFERHELDITEM 431 #define STRINGID_EMBARGOENDS 432 -#define STRINGID_MAGNETRISEENDS 433 -#define STRINGID_HEALBLOCKENDS 434 +#define STRINGID_ELECTROMAGNETISM 433 +#define STRINGID_BUFFERENDS 434 #define STRINGID_TELEKINESISENDS 435 #define STRINGID_TAILWINDENDS 436 #define STRINGID_LUCKYCHANTENDS 437 diff --git a/src/battle_message.c b/src/battle_message.c index a2d475876b..68a6cad938 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -223,7 +223,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}."); @@ -258,8 +258,8 @@ 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_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!"); @@ -559,8 +559,8 @@ static const u8 sText_PostponeTargetMove[] =_("{B_DEF_NAME_WITH_PREFIX}'s move\n 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} recieved {B_LAST_ITEM}\nfrom {B_ATK_NAME_WITH_PREFIX}"); static const u8 sText_EmbargoEnds[] = _("{B_DEF_NAME_WITH_PREFIX}can\nuse items again!"); -static const u8 sText_MagnetRiseEnds[] = _("{B_ATK_NAME_WITH_PREFIX}'s electromagnetism\nwore off!"); -static const u8 sText_HealBlockEnds[] = _("{B_ATK_NAME_WITH_PREFIX}'s Heal Block\nwore off!"); +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_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!"); @@ -627,7 +627,7 @@ static const u8 sText_TerrainBecomesPsychic[] = _("The battlefield got weird!"); static const u8 sText_TargetElectrified[] = _("The opposing {B_ATK_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[] = _("The opposing {B_ATK_NAME_WITH_PREFIX} was\nprevented from healing!\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 reacting\nto {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 "); @@ -1076,8 +1076,8 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_REFLECTTARGETSTYPE - 12] = sText_ReflectTargetsType, [STRINGID_TRANSFERHELDITEM - 12] = sText_TransferHeldItem, [STRINGID_EMBARGOENDS - 12] = sText_EmbargoEnds, - [STRINGID_MAGNETRISEENDS - 12] = sText_MagnetRiseEnds, - [STRINGID_HEALBLOCKENDS - 12] = sText_HealBlockEnds, + [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, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a5b6e46f45..c286833b0c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -9970,8 +9970,11 @@ static void atkD0_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 diff --git a/src/battle_util.c b/src/battle_util.c index 901edb152e..c67d4950d5 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1685,8 +1685,12 @@ u8 DoBattlerEndTurnEffects(void) gBattleStruct->turnEffectsTracker++; break; case ENDTURN_TAUNT: // taunt - if (gDisableStructs[gActiveBattler].tauntTimer) - gDisableStructs[gActiveBattler].tauntTimer--; + 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 @@ -1711,9 +1715,7 @@ u8 DoBattlerEndTurnEffects(void) case ENDTURN_LASER_FOCUS: if (gStatuses3[gActiveBattler] & STATUS3_LASER_FOCUS) { - if (gDisableStructs[gActiveBattler].laserFocusTimer != 0) - gDisableStructs[gActiveBattler].laserFocusTimer--; - if (gDisableStructs[gActiveBattler].laserFocusTimer == 0) + if (gDisableStructs[gActiveBattler].laserFocusTimer == 0 || --gDisableStructs[gActiveBattler].laserFocusTimer == 0) gStatuses3[gActiveBattler] &= ~(STATUS3_LASER_FOCUS); } gBattleStruct->turnEffectsTracker++; @@ -1721,9 +1723,7 @@ u8 DoBattlerEndTurnEffects(void) case ENDTURN_EMBARGO: if (gStatuses3[gActiveBattler] & STATUS3_EMBARGO) { - if (gDisableStructs[gActiveBattler].embargoTimer != 0) - gDisableStructs[gActiveBattler].embargoTimer--; - if (gDisableStructs[gActiveBattler].embargoTimer == 0) + if (gDisableStructs[gActiveBattler].embargoTimer == 0 || --gDisableStructs[gActiveBattler].embargoTimer == 0) { gStatuses3[gActiveBattler] &= ~(STATUS3_EMBARGO); BattleScriptExecute(BattleScript_EmbargoEndTurn); @@ -1735,12 +1735,11 @@ u8 DoBattlerEndTurnEffects(void) case ENDTURN_MAGNET_RISE: if (gStatuses3[gActiveBattler] & STATUS3_MAGNET_RISE) { - if (gDisableStructs[gActiveBattler].magnetRiseTimer != 0) - gDisableStructs[gActiveBattler].magnetRiseTimer--; - if (gDisableStructs[gActiveBattler].magnetRiseTimer == 0) + if (gDisableStructs[gActiveBattler].magnetRiseTimer == 0 || --gDisableStructs[gActiveBattler].magnetRiseTimer == 0) { gStatuses3[gActiveBattler] &= ~(STATUS3_MAGNET_RISE); - BattleScriptExecute(BattleScript_MagnetRiseEndTurn); + BattleScriptExecute(BattleScript_BufferEndTurn); + PREPARE_STRING_BUFFER(gBattleTextBuff1, STRINGID_ELECTROMAGNETISM); effect++; } } @@ -1749,9 +1748,7 @@ u8 DoBattlerEndTurnEffects(void) case ENDTURN_TELEKINESIS: if (gStatuses3[gActiveBattler] & STATUS3_TELEKINESIS) { - if (gDisableStructs[gActiveBattler].telekinesisTimer != 0) - gDisableStructs[gActiveBattler].telekinesisTimer--; - if (gDisableStructs[gActiveBattler].telekinesisTimer == 0) + if (gDisableStructs[gActiveBattler].telekinesisTimer == 0 || --gDisableStructs[gActiveBattler].telekinesisTimer == 0) { gStatuses3[gActiveBattler] &= ~(STATUS3_TELEKINESIS); BattleScriptExecute(BattleScript_TelekinesisEndTurn); @@ -1763,12 +1760,11 @@ u8 DoBattlerEndTurnEffects(void) case ENDTURN_HEALBLOCK: if (gStatuses3[gActiveBattler] & STATUS3_HEAL_BLOCK) { - if (gDisableStructs[gActiveBattler].healBlockTimer != 0) - gDisableStructs[gActiveBattler].healBlockTimer--; - if (gDisableStructs[gActiveBattler].healBlockTimer == 0) + if (gDisableStructs[gActiveBattler].healBlockTimer == 0 || --gDisableStructs[gActiveBattler].healBlockTimer == 0) { gStatuses3[gActiveBattler] &= ~(STATUS3_HEAL_BLOCK); - BattleScriptExecute(BattleScript_HealBlockEndTurn); + BattleScriptExecute(BattleScript_BufferEndTurn); + PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_HEAL_BLOCK); effect++; } } From cf0e38b11ff7d1da5fb1328037b6387c4bafbc01 Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Sun, 24 Mar 2019 22:33:54 -0400 Subject: [PATCH 303/667] Can't Knock Griseous Orb Off Giratina I'll do Plates Drives and Memories later --- src/battle_util.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/battle_util.c b/src/battle_util.c index 901edb152e..75845bf506 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5916,6 +5916,8 @@ bool32 CanBattlerGetOrLoseItem(u8 battlerId, u16 itemId) return FALSE; else if (ItemId_GetHoldEffect(itemId) == HOLD_EFFECT_MEGA_STONE && GetMegaEvolutionSpecies(species, itemId) != SPECIES_NONE) return FALSE; + else if (species == SPECIES_GIRATINA && itemId == ITEM_GRISEOUS_ORB) + return FALSE; else return TRUE; } From fc69631a10a53b889e78211031236bfca9d3d21b Mon Sep 17 00:00:00 2001 From: Fontbane Date: Mon, 25 Mar 2019 17:49:29 -0400 Subject: [PATCH 304/667] Field effects for Gen IV Abilities Also added Honey (acts like White Flute for now) and made it so the Griseous Orb can't be removed from Giratina in battle. --- data/battle_ai_scripts.s | 2 +- graphics/items/icon_palettes/honey.pal | 19 +++ graphics/items/icons/honey.png | Bin 0 -> 5898 bytes include/constants/items.h | 169 +++++++++++++------------ include/item_use.h | 1 + src/battle_script_commands.c | 14 +- src/data/graphics/items.h | 3 + src/data/item_icon_table.h | 1 + src/data/items.h | 17 +++ src/data/text/item_descriptions.h | 1 + src/item_use.c | 10 ++ src/wild_encounter.c | 6 + 12 files changed, 155 insertions(+), 88 deletions(-) create mode 100644 graphics/items/icon_palettes/honey.pal create mode 100644 graphics/items/icons/honey.png diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 6ba2c87489..1018894058 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -3628,7 +3628,7 @@ AI_HPAware_DiscouragedEffectsWhenTargetLowHP: @ 82DE2B1 .byte EFFECT_LIGHT_SCREEN .byte EFFECT_OHKO .byte EFFECT_SUPER_FANG - .byte EFFECT_SUPER_FANG + .byte EFFECT_SUPER_FANG //Why is this here twice? .byte EFFECT_MIST .byte EFFECT_FOCUS_ENERGY .byte EFFECT_CONFUSE diff --git a/graphics/items/icon_palettes/honey.pal b/graphics/items/icon_palettes/honey.pal new file mode 100644 index 0000000000..c5219f932a --- /dev/null +++ b/graphics/items/icon_palettes/honey.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +48 48 48 +120 80 32 +200 112 0 +80 152 152 +232 144 0 +96 184 192 +248 184 72 +248 240 184 +216 248 248 +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/items/icons/honey.png b/graphics/items/icons/honey.png new file mode 100644 index 0000000000000000000000000000000000000000..837243e77fe7fc015bca5c4b07668c5c8f3fa2ed GIT binary patch literal 5898 zcmV+l7xn0gP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+SQs_mgBf~MgK7h4}s``;h@)b+?;#V685z$zg&CY8WTdgD7+Xg#rv)iuoKJ4HU zgIg~1?%Z(xY%4yy>c&Y*(93R@NzXLCkcmOoJe%G7wb*msdd@c}+IdaOp3X9uviR*~ ze%kmqulIrWR_R)MmG@Y2T~0O4Whis{%U&eJ?kA@4#P__+OWj;AiS=YKo-h|C*sgvL z(WCvSEr0Ut*)LwfTz6~OJf8sw5$BFvjP+#TO4di4?3JC%))L1;ei~Qqd~lr%*cjck zW|JH56Uiw~=jNDf&%Q3Ydo$2NBGe+8)X+dAD}+e>baL*dmEI`2qTU(@+hN@Hr@1-_Md5HGs~>AExRbC6;@nn*BWWx%vKEBW&QLnhUE|eB(85GqTE%ppS zHjhG~zM88oChuB}>Zw_oO^BAtx25Qvf~RE5nAGq^pQXlSg*i8`d`bN*ELQt=6Y;k^!lc`Np0cZOCmao054irCRN4DUIQz zBT~F(M^b!L(m3@qp0u0yyx&<@&fSb-wmL%@;1dPFWyQ60*lP)Xu0V52FxLhoyG@iT z#{nD#{V`nZr8>}Yl6nW&aSm|F6Td4%4V2Q1YS$!kaMND)fSPV z*y$-6gwW&_TdU}>oK$Q~$5HG)0OwTs3Wf`flM6*s7fx`I*ji?8maB3$^;mPDYlcl1 zO_*AwiTWgmt@imcuDJ(}k#da8AX`7K;D{_h!G+R%am~788@0_zSlD~aQ;;3WxsW!c zQY8lRn7g~yd!k4?wH^9^Vg@2E5pc98!F7{j&dY7^X%hl!r)N(M6_C*HWuxgGoY*ro zW*sP2PKy@pyW6B5-SlXpM;$#nqI#4r*i{wDo?Q4A>g-ib$uq5H%Vt88{M5R#gRAMg z%ZcYQ_&9Ql@ox8|cJI4h0+KMnW=$1dW2P4~P5o+(CQ2wAtEom!we_{4J2Ry*Q;ncg z?n0Ew-^!H)52EPW%$zPxaE-?DvU6z$Cv_!1Qp z6l}~Ob3hae<`EE7 zt`y&`rBi9tJLCb|+B@zDI%rF%=a)<1MFJt|R~p~-Ow3CldbU-R{|SJ)g_$(S+>UM$ zY(Ny34Q8V&LrUxE;?GTt7Mpav3dH#e$x< zqYTt9IjLW=bptbluiPLFP|{)AJjVj^8zn?S`Mg%5VvxDOO;nE$dYnUmG0>U1KT^X1 z1?AQ+?3hhb*V7CH0-h)GNRLG%zp;G#LfCChbvznXl(ahN6FpOPsup zVLgtzs46^lozXUZff#LYb?{XNreM=yC^9bPOgMHXOu*)ub!qWTH)*;pt#r-b8d)yDzC8A+O6#Z*T*`WbhbOG)p#!2rJUVtxz+3C-Ydj;`v5L6uH zK0Vm&$S}}-vVNC5}Dy>|i{B-6^2Oa+({rJ8s3Jm8kP> zuJ;X*=|PPXW}0>-6a!q}OR}eK2oLoK;kjMtpoOJ7a58BaU9fS4ZPLos3Jo(Vi&DrD zI7Id#oIIHTK=@&7+rebqKI8xr1iLoGt&U{w^ctGxK-bv)z|20rGtveyJjDmJ5Gk;b z{3py5N$7Q@>9JVRcIPKhw+zfmg>I&UVx;BD8Fayz33tdm=Z>|*GB9E|ID`wZTIpbR z7oF`_2bH3UtJH=1qJC#k721!Z!a=(ih6BW?mp!7t+MCbKgWWrj3Y zmwTva1j=l~RKB?*zpYrrj{3-N3dPn8p=U42Y~33jn|D4ApZJ&yIs#h)+#X4|3E-J_ zstXC;b}v%#Z^xOB1O4j>&iGv_+rNy2c%b_V+_%ok)#Ad{o)~H4AX#@cR1THBQOQ87 zEC^LqKyt2@R&cWTnDCAa$gjg00g*r! z4C?ui5g}0T#luDJt!AuyYNkwDTScKB>S800%_7*RW{48Fym~(u3~tpJe9%6@8;}aUq*Sxz{e6Z0O%i{#Gua_ zPVT3Zd^^YcAU~YNyk5n(LH_wUym>uEuq_|ZrCUi-#}F_8^>xkG!X+C8KoHy7D*lP2 zlu~`~XOYE!Ppd!6jTXS?BYdPab*U1MEuk8K-Y8$)GF+pA!m?k}MAw51Rfp23xx+JG zTNv65yHxnFW0@&i%B*5`L2!rFXmk(-d7+SW8uT19L>b~6cE|}cimSZpyb7eeZw^N$ z_BVfceR?sGg% zq(HzI6hfj-ojRN~@VZ%`6ten~D_W;*WnN zhIoL3!yx2JH@ZlEL3yidf%n+pK;dXdvZ=M3MwFY!LIq%!Jfd15b&M98r6jE$Bfz2; z9@QJn_eH}mgu5Cbu0{ZnCsx$(WNg%LR>iz;Kz%Ykv7pKmb|3L^58v!Fe7}eHp@lUH zx$DRHQe9|mgK^~ehIzu0h2vDun%&Pa1L#p{UsW)5?o3CS4``2|yO9$nVa`EYO$`Cfd8ITd;iXR&UCWwl6N zGNR#j%q`R8U+Ky`A99x%Ylr@-7#vJ_)9^?U)LPHApdOL%ZJiacnLv}{Br{k6_}|Ig z4@ahCXY!OZ`P)Gmzc6-G1|Nr(LOQzc_%X7ZZ3FY>7{!{2X*}Grfe5XZ2y93tg-h`Y zxbQL9G>1wVT7AL~2&pUpjC>$9`P7-o$C)(${io-beW($If3KPX)Us7Wle&#O?$4)q zRz@k{B}LmF4!D2%=@(?56_{faR;!VEbI%o;U#{c#EA%hdXE*T%Krt}}NyX1)kSpv{ zyxXDNZ1dZ83CXK41pl;g7Mu1Y*liAGQ1YFH5UlTAj$pjhdIZy@lqt zko_@WhKK=l2g$XvF*yqePIE>)!@OiZT5t;wGw^p>$~iUEzv=;VN+%~;k+ps-GHU;&Zr|pdAjultxSilL~TZp47u#uKIux`8g{lIo3y?xQ!*oi4|4vrD}joL&UsHVjT0$z0WvhP4>oV%jT;FLx1wgB}+CoP(JvbKVy3xBhS#K#q8`E~EBIjiAd#JC*b0OX3hS9zk}=Xe@E} zR~?gi;LeFDO)IgUR@55Kx$(5(M|pQuguIZITUa#2O0xI8JG|VLF#?-HuUe-wy4-mo z+R|?ehkzoqjqW%Sp2`t?3}VU5>s=^LYiw_;QmT}4rtQhJrk%CQj--Kym=8N*iAZVG zqT+2JH5ok?!#9LhbNTvN&YfCW*dnbNr7w%WXNjn}TLsr{?)42}Ou;8EgfD|WukKD1UtD<7FnmEHkTcodytxEfhXTSgjV zFw2bp!Dsn-qOcLN+m+w^Abwte7-lj;K1`>OuO2;zJ`Vkw359)bEG+Oy&~$D|sCUji z2^~bA>`Tvy6zkH7Q9E^aylU#pXSwyJ`}O3wtH|f2#rmlm^0ZIZZ6b;r6G;NK;AMw3 zt!exl3;Kx?Lml}24}3WR4J(M&ldcn!7%8LzF%iH^!~r*bZI zY0!O9$^cTjL&eNiESe9bP= zVOnZ3*K>aY+D=sq5~a!uWISVUTKNEv$fbH>OZZcdKY{Qv39!%&V=Y|Z9!9t7G~{$C zS5I28r^6N=0I?h;mQp*po$C3sejm~B$eKF(RrO#%#L&SwsPm~uO8_Sv)hq&})PGP2 z(lswzjv5(t4VSn!dOis}G6|q=bgR`jLP3Yxfoi9!Mx$^WVOx;bDOUK^^WNu zTgW&=+M@EaO^XU=a%Yb7#(c*>_f3jV8_zb5z5aOU=OfMEANu)7b02!TvuUvc9hL1> zGY;blK54mnAo+UrYP7fIeC;n_8d5Tyw2}Ttqke2UThP+UdWX5968nb?I=1K0L0)~I zbt48aG3QPU@CwK+-JO~q-*t-K_LQQRYt%xA$4x^fvTaQZ&ow!Sel+T`gIUSw?z|qR zJu9#l3wfS2IIE@m^HNKfp(Gj{N*Q3w^mG%=CUUrzxqw`FSO{?6de9<^1l9naw7LQ3 z>;CsdR4<>j)_!h$qnn>aOHsAE%&%Pi&?xqnEJl2p)gvFOMy*BZ21|Qe9Ij-{oYmne z3k)$z+UaiXeFH;_heFJDFo0`Z_|k|C5y0p^vh{syEiz==O-yCvb7w!xFdsp8)tPR= z<%j!nO92hfK9g3#@kPWSWSIvl#=rpfg5K@$($_%vyk)%(pPgNOpO&u!+Z z`@nk00d&n~P-n=fq~)&|f`>R^wnbfS9LDron?}6wolERnqV3!z_$oQftvPZP^)?Dv z>rS|)N=b7H_f1}^48LsAnVRX7xuR*vLwHa}Pp6ztI?oo|xbt~iR5w~ZTw~vkG=G2S z=OfMEAA0Xa-W)xH7fBZ1pD=8gG*6$?NSo3U8oqSu)29{rfb%-`AnTqMg4^nGC!`-0 zfoARw*uS6Kq9Ev?LzsHZuidp(!s_7^D!n4xcy2!+Poe+nm!png{xtHv&Q=cHGhD_< zyXHyBeM5y_8@g+?ED0~Q*Qaogo>$?Tua!%0TWS(F+x3K))ES1>H8-5SiXK#_Lv>5) zJd~1j@003H_DoazW^o1 zEFYlAOh*6!03J|GR7C^<05C8xcu*k7Z~#!4nCOrIV7S2exJdZ$xY+pkfUD@N00001 zbW%=J06^y0W&i*H0b)x>L;#2d9Y_EG010qNS#tmYE+YT{E+YYWr9XB6000McNliru z;{zEGI3xiNS`z>O0GCNbK~xyiV_?7s7zKeq0Lqq}2?P@%JRrNg9LNJp0NEWKK%M{w z#}lG#3Ye4P2{K@c3z(CZ;sOM2X<&{@8W=c%I6_8Xo|Cd7kRuvuqyz-Yp@Be-cqkMU zf;pw3p%Ja&P)>Pyc}06Um?H|~fb=kxhJ!ez;R+yo!b5?)($G?{A4JPRW|ap*Jf{lO gR30RN>1`YU0Kcz2Y_wJln*aa+07*qoM6N<$g0YoOm;e9( literal 0 HcmV?d00001 diff --git a/include/constants/items.h b/include/constants/items.h index 176750a16b..f0a6bedd14 100644 --- a/include/constants/items.h +++ b/include/constants/items.h @@ -509,98 +509,99 @@ #define ITEM_DRACO_PLATE 420 #define ITEM_DREAD_PLATE 421 #define ITEM_IRON_PLATE 422 +#define ITEM_HONEY 423 // Gen 5 Items -#define ITEM_EVIOLITE 423 -#define ITEM_FLOAT_STONE 424 -#define ITEM_BINDING_BAND 425 -#define ITEM_DOUSE_DRIVE 426 -#define ITEM_SHOCK_DRIVE 427 -#define ITEM_BURN_DRIVE 428 -#define ITEM_CHILL_DRIVE 429 -#define ITEM_FIRE_GEM 430 -#define ITEM_WATER_GEM 431 -#define ITEM_ELECTRIC_GEM 432 -#define ITEM_GRASS_GEM 433 -#define ITEM_ICE_GEM 434 -#define ITEM_FIGHTING_GEM 435 -#define ITEM_POISON_GEM 436 -#define ITEM_GROUND_GEM 437 -#define ITEM_FLYING_GEM 438 -#define ITEM_PSYCHIC_GEM 439 -#define ITEM_BUG_GEM 440 -#define ITEM_ROCK_GEM 441 -#define ITEM_GHOST_GEM 442 -#define ITEM_DRAGON_GEM 443 -#define ITEM_DARK_GEM 444 -#define ITEM_STEEL_GEM 445 -#define ITEM_NORMAL_GEM 446 -#define ITEM_FAIRY_GEM 447 +#define ITEM_EVIOLITE 424 +#define ITEM_FLOAT_STONE 425 +#define ITEM_BINDING_BAND 426 +#define ITEM_DOUSE_DRIVE 427 +#define ITEM_SHOCK_DRIVE 428 +#define ITEM_BURN_DRIVE 429 +#define ITEM_CHILL_DRIVE 430 +#define ITEM_FIRE_GEM 431 +#define ITEM_WATER_GEM 432 +#define ITEM_ELECTRIC_GEM 433 +#define ITEM_GRASS_GEM 434 +#define ITEM_ICE_GEM 435 +#define ITEM_FIGHTING_GEM 436 +#define ITEM_POISON_GEM 437 +#define ITEM_GROUND_GEM 438 +#define ITEM_FLYING_GEM 439 +#define ITEM_PSYCHIC_GEM 440 +#define ITEM_BUG_GEM 441 +#define ITEM_ROCK_GEM 442 +#define ITEM_GHOST_GEM 443 +#define ITEM_DRAGON_GEM 444 +#define ITEM_DARK_GEM 445 +#define ITEM_STEEL_GEM 446 +#define ITEM_NORMAL_GEM 447 +#define ITEM_FAIRY_GEM 448 // Gen6 Items -#define ITEM_ASSAULT_VEST 448 -#define ITEM_PIXIE_PLATE 449 -#define ITEM_SAFETY_GOGGLES 450 -#define ITEM_GENGARITE 451 -#define ITEM_GARDEVOIRITE 452 -#define ITEM_AMPHAROSITE 453 -#define ITEM_VENUSAURITE 454 -#define ITEM_CHARIZARDITE_X 455 -#define ITEM_BLASTOISINITE 456 -#define ITEM_MEWTWONITE_X 457 -#define ITEM_MEWTWONITE_Y 458 -#define ITEM_BLAZIKENITE 459 -#define ITEM_MEDICHAMITE 460 -#define ITEM_HOUNDOOMINITE 461 -#define ITEM_AGGRONITE 462 -#define ITEM_BANETTITE 463 -#define ITEM_TYRANITARITE 464 -#define ITEM_SCIZORITE 465 -#define ITEM_PINSIRITE 466 -#define ITEM_AERODACTYLITE 467 -#define ITEM_LUCARIONITE 468 -#define ITEM_ABOMASITE 469 -#define ITEM_KANGASKHANITE 470 -#define ITEM_GYARADOSITE 471 -#define ITEM_ABSOLITE 472 -#define ITEM_CHARIZARDITE_Y 473 -#define ITEM_ALAKAZITE 474 -#define ITEM_HERACRONITE 475 -#define ITEM_MAWILITE 476 -#define ITEM_MANECTITE 477 -#define ITEM_GARCHOMPITE 478 -#define ITEM_LATIASITE 479 -#define ITEM_LATIOSITE 480 -#define ITEM_SWAMPERTITE 481 -#define ITEM_SCEPTILITE 482 -#define ITEM_SABLENITE 483 -#define ITEM_ALTARIANITE 484 -#define ITEM_GALLADITE 485 -#define ITEM_AUDINITE 486 -#define ITEM_METAGROSSITE 487 -#define ITEM_SHARPEDONITE 488 -#define ITEM_SLOWBRONITE 489 -#define ITEM_STEELIXITE 490 -#define ITEM_PIDGEOTITE 491 -#define ITEM_GLALITITE 492 -#define ITEM_DIANCITE 493 -#define ITEM_CAMERUPTITE 494 -#define ITEM_LOPUNNITE 495 -#define ITEM_SALAMENCITE 496 -#define ITEM_BEEDRILLITE 497 -#define ITEM_MEGA_BRACELET 498 +#define ITEM_ASSAULT_VEST 449 +#define ITEM_PIXIE_PLATE 450 +#define ITEM_SAFETY_GOGGLES 451 +#define ITEM_GENGARITE 452 +#define ITEM_GARDEVOIRITE 453 +#define ITEM_AMPHAROSITE 454 +#define ITEM_VENUSAURITE 455 +#define ITEM_CHARIZARDITE_X 456 +#define ITEM_BLASTOISINITE 457 +#define ITEM_MEWTWONITE_X 458 +#define ITEM_MEWTWONITE_Y 459 +#define ITEM_BLAZIKENITE 460 +#define ITEM_MEDICHAMITE 461 +#define ITEM_HOUNDOOMINITE 462 +#define ITEM_AGGRONITE 463 +#define ITEM_BANETTITE 464 +#define ITEM_TYRANITARITE 465 +#define ITEM_SCIZORITE 466 +#define ITEM_PINSIRITE 467 +#define ITEM_AERODACTYLITE 468 +#define ITEM_LUCARIONITE 469 +#define ITEM_ABOMASITE 470 +#define ITEM_KANGASKHANITE 471 +#define ITEM_GYARADOSITE 472 +#define ITEM_ABSOLITE 473 +#define ITEM_CHARIZARDITE_Y 474 +#define ITEM_ALAKAZITE 475 +#define ITEM_HERACRONITE 476 +#define ITEM_MAWILITE 477 +#define ITEM_MANECTITE 478 +#define ITEM_GARCHOMPITE 479 +#define ITEM_LATIASITE 480 +#define ITEM_LATIOSITE 481 +#define ITEM_SWAMPERTITE 482 +#define ITEM_SCEPTILITE 483 +#define ITEM_SABLENITE 484 +#define ITEM_ALTARIANITE 485 +#define ITEM_GALLADITE 486 +#define ITEM_AUDINITE 487 +#define ITEM_METAGROSSITE 488 +#define ITEM_SHARPEDONITE 489 +#define ITEM_SLOWBRONITE 490 +#define ITEM_STEELIXITE 491 +#define ITEM_PIDGEOTITE 492 +#define ITEM_GLALITITE 493 +#define ITEM_DIANCITE 494 +#define ITEM_CAMERUPTITE 495 +#define ITEM_LOPUNNITE 496 +#define ITEM_SALAMENCITE 497 +#define ITEM_BEEDRILLITE 498 +#define ITEM_MEGA_BRACELET 499 // Gen7 hold effects -#define ITEM_PROTECTIVE_PADS 499 -#define ITEM_TERRAIN_EXTENDER 500 -#define ITEM_ELECTRIC_SEED 501 -#define ITEM_GRASSY_SEED 502 -#define ITEM_MISTY_SEED 503 -#define ITEM_PSYCHIC_SEED 504 -#define ITEM_ADRENALINE_ORB 505 +#define ITEM_PROTECTIVE_PADS 500 +#define ITEM_TERRAIN_EXTENDER 501 +#define ITEM_ELECTRIC_SEED 502 +#define ITEM_GRASSY_SEED 503 +#define ITEM_MISTY_SEED 504 +#define ITEM_PSYCHIC_SEED 505 +#define ITEM_ADRENALINE_ORB 506 -#define ITEMS_COUNT 506 +#define ITEMS_COUNT 507 #define ITEM_FIELD_ARROW ITEMS_COUNT #define FIRST_BERRY_INDEX ITEM_CHERI_BERRY diff --git a/include/item_use.h b/include/item_use.h index 37343f6e7a..31221aa099 100644 --- a/include/item_use.h +++ b/include/item_use.h @@ -51,5 +51,6 @@ void ItemUseInBattle_EnigmaBerry(u8); void ItemUseOutOfBattle_CannotUse(u8); u8 CheckIfItemIsTMHMOrEvolutionStone(u16 itemId); void sub_80FDD10(u8); +void ItemUseOutOfBattle_Honey(u8); #endif // GUARD_ITEM_USE_H diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a5b6e46f45..b832d7e053 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10503,6 +10503,7 @@ static void atkE5_pickup(void) s32 i; u16 species, heldItem; u8 ability; + u8 level; if (InBattlePike()) { @@ -10537,6 +10538,10 @@ static void atkE5_pickup(void) { species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); + level = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL); + u8 lvlDivBy10 = (level - 1) / 10; + if (lvlDivBy10 > 9) + lvlDivBy10 = 9; if (GetMonData(&gPlayerParty[i], MON_DATA_ALT_ABILITY)) ability = gBaseStats[species].ability2; @@ -10551,9 +10556,6 @@ static void atkE5_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 < 9; j++) { @@ -10569,6 +10571,12 @@ static void atkE5_pickup(void) } } } + else if (ability == ABILITY_HONEY_GATHER + && species != 0 + && species != SPECIES_EGG + && heldItem == ITEM_NONE + && (Random()%100 <= lvlDivBy10*5+5)) + SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, ITEM_HONEY); } } diff --git a/src/data/graphics/items.h b/src/data/graphics/items.h index e20edbd647..733bbf3173 100644 --- a/src/data/graphics/items.h +++ b/src/data/graphics/items.h @@ -877,6 +877,9 @@ const u32 gItemIconPalette_DreadPlate[] = INCBIN_U32("graphics/items/icon_palett const u32 gItemIcon_IronPlate[] = INCBIN_U32("graphics/items/icons/iron_plate.4bpp.lz"); const u32 gItemIconPalette_IronPlate[] = INCBIN_U32("graphics/items/icon_palettes/iron_plate.gbapal.lz"); +const u32 gItemIcon_IronPlate[] = INCBIN_U32("graphics/items/icons/honey.4bpp.lz"); +const u32 gItemIconPalette_IronPlate[] = INCBIN_U32("graphics/items/icon_palettes/honey.gbapal.lz"); + // Gen 5 Items const u32 gItemIcon_Eviolite[] = INCBIN_U32("graphics/items/icons/eviolite.4bpp.lz"); diff --git a/src/data/item_icon_table.h b/src/data/item_icon_table.h index 2b160ae202..e2c9d673b4 100644 --- a/src/data/item_icon_table.h +++ b/src/data/item_icon_table.h @@ -449,6 +449,7 @@ const u32 *const gItemIconTable[][2] = [ITEM_DRACO_PLATE] = {gItemIcon_DracoPlate, gItemIconPalette_DracoPlate}, [ITEM_DREAD_PLATE] = {gItemIcon_DreadPlate, gItemIconPalette_DreadPlate}, [ITEM_IRON_PLATE] = {gItemIcon_IronPlate, gItemIconPalette_IronPlate}, + [ITEM_HONEY] = {gItemIcon_Honey, gItemIconPalette_Honey}, // Gen 5 Items [ITEM_EVIOLITE] = {gItemIcon_Eviolite, gItemIconPalette_Eviolite}, [ITEM_FLOAT_STONE] = {gItemIcon_FloatStone, gItemIconPalette_FloatStone}, diff --git a/src/data/items.h b/src/data/items.h index 6751b018ef..ee47c7f89d 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -9136,4 +9136,21 @@ const struct Item gItems[] = .battleUseFunc = NULL, .secondaryId = 0, }, + [ITEM_HONEY] = + { + .name = _("Honey"), + .itemId = ITEM_HONEY, + .price = 100, + .holdEffect = HOLD_EFFECT_NONE, + .holdEffectParam = 0, + .description = gHoneyItemDescription, + .importance = 0, + .unk19 = 0, + .pocket = POCKET_ITEMS, + .type = 4, + .fieldUseFunc = ItemUseOutOfBattle_Honey, + .battleUsage = 0, + .battleUseFunc = NULL, + .secondaryId = 0, + }, }; diff --git a/src/data/text/item_descriptions.h b/src/data/text/item_descriptions.h index 57671d1e72..48584179db 100644 --- a/src/data/text/item_descriptions.h +++ b/src/data/text/item_descriptions.h @@ -452,3 +452,4 @@ const u8 gGrassySeedItemDescription[] = _("Boosts Defense on\nGrassy Terrain,\nb const u8 gMistySeedItemDescription[] = _("Boosts Sp. Def. on\nMisty Terrain,\nbut only one time."); const u8 gPsychicSeedItemDescription[] = _("Boosts Sp. Def. on\nPsychic Terrain,\nbut only one time."); const u8 gAdrenalineOrbItemDescription[] = _("Boosts Speed if the\nuser is intimidated,\nbut only one time."); +const u8 gHoneyItemDescription[] = _("A sweet honey that\nattracts wild Pokémon\nin grass or on trees."); diff --git a/src/item_use.c b/src/item_use.c index 4d225d8b02..a20aecc648 100755 --- a/src/item_use.c +++ b/src/item_use.c @@ -1119,3 +1119,13 @@ void ItemUseOutOfBattle_CannotUse(u8 taskId) { DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[3]); } + +void ItemUseOutOfBattle_Honey(u8 taskId) +{ + //As a placeholder, just acts like White Flute + FlagSet(FLAG_SYS_ENC_UP_ITEM); + FlagClear(FLAG_SYS_ENC_DOWN_ITEM); + StringExpandPlaceholders(gStringVar4, gText_UsedVar2WildLured); + gTasks[taskId].data[8] = 0; + gTasks[taskId].func = sub_80FE1D0; +} diff --git a/src/wild_encounter.c b/src/wild_encounter.c index b860da13ec..be97c73ac1 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -487,6 +487,12 @@ static bool8 DoWildEncounterRateTest(u32 encounterRate, bool8 ignoreAbility) encounterRate *= 2; else if (ability == ABILITY_SAND_VEIL && gSaveBlock1Ptr->weather == 8) encounterRate /= 2; + else if (ability == ABILITY_SNOW_CLOAK && gSaveBlock1Ptr->weather == 4) + encounterRate /= 2; + else if (ability == ABILITY_QUICK_FEET && gSaveBlock1Ptr->weather == 8) + encounterRate /= 2; + else if (ability == ABILITY_NO_GUARD) + encounterRate = encounterRate * 150 / 100; } if (encounterRate > 2880) encounterRate = 2880; From 2cfa5ea326fbeb253bc5de00d4d2018d3982f7ec Mon Sep 17 00:00:00 2001 From: Fontbane <36677462+Fontbane@users.noreply.github.com> Date: Mon, 25 Mar 2019 19:00:46 -0400 Subject: [PATCH 305/667] Fixed Honey And updated gitignore --- .gitignore | 2 ++ include/graphics.h | 2 ++ src/battle_script_commands.c | 9 +++++++-- src/data/graphics/items.h | 4 ++-- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index dc782899dd..4d8c4ba7bf 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,5 @@ Thumbs.db build/ .DS_Store *.ddump +*.bin +*.ipch diff --git a/include/graphics.h b/include/graphics.h index ed25ae8e3c..5fc33a7943 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -3940,6 +3940,8 @@ extern const u32 gItemIcon_DreadPlate[]; extern const u32 gItemIconPalette_DreadPlate[]; extern const u32 gItemIcon_IronPlate[]; extern const u32 gItemIconPalette_IronPlate[]; +extern const u32 gItemIcon_Honey[]; +extern const u32 gItemIconPalette_Honey[]; // Gen 5 Items extern const u32 gItemIcon_Eviolite[]; extern const u32 gItemIconPalette_Eviolite[]; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b832d7e053..a3d724c0ae 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10504,6 +10504,7 @@ static void atkE5_pickup(void) u16 species, heldItem; u8 ability; u8 level; + u8 lvlDivBy10; if (InBattlePike()) { @@ -10539,7 +10540,7 @@ static void atkE5_pickup(void) species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); level = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL); - u8 lvlDivBy10 = (level - 1) / 10; + lvlDivBy10 = (level - 1) / 10; if (lvlDivBy10 > 9) lvlDivBy10 = 9; @@ -10576,7 +10577,11 @@ static void atkE5_pickup(void) && species != SPECIES_EGG && heldItem == ITEM_NONE && (Random()%100 <= lvlDivBy10*5+5)) - SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, ITEM_HONEY); + { + u16 honey = ITEM_HONEY; + SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &honey); + break; + } } } diff --git a/src/data/graphics/items.h b/src/data/graphics/items.h index 733bbf3173..b00a5b8546 100644 --- a/src/data/graphics/items.h +++ b/src/data/graphics/items.h @@ -877,8 +877,8 @@ const u32 gItemIconPalette_DreadPlate[] = INCBIN_U32("graphics/items/icon_palett const u32 gItemIcon_IronPlate[] = INCBIN_U32("graphics/items/icons/iron_plate.4bpp.lz"); const u32 gItemIconPalette_IronPlate[] = INCBIN_U32("graphics/items/icon_palettes/iron_plate.gbapal.lz"); -const u32 gItemIcon_IronPlate[] = INCBIN_U32("graphics/items/icons/honey.4bpp.lz"); -const u32 gItemIconPalette_IronPlate[] = INCBIN_U32("graphics/items/icon_palettes/honey.gbapal.lz"); +const u32 gItemIcon_Honey[] = INCBIN_U32("graphics/items/icons/honey.4bpp.lz"); +const u32 gItemIconPalette_Honey[] = INCBIN_U32("graphics/items/icon_palettes/honey.gbapal.lz"); // Gen 5 Items From 408485263d25365e68d2d13cce30a0c90c3d1e06 Mon Sep 17 00:00:00 2001 From: Papa Cancer Date: Tue, 26 Mar 2019 01:34:39 +0000 Subject: [PATCH 306/667] Minor ability fixes Status moves that target both opponents will trigger a mon with Clear Body, White Smoke, Hyper Cutter etc. to prevent the loss of stats, but if its partner is targeted first, that partner gets the popup: https://drive.google.com/open?id=1dtTfgxvppD4s2ZL5scPDz9YDf4n7AhMW This fixes that. --- src/battle_script_commands.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 5ed4dec6df..412bf42446 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7868,6 +7868,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr { BattleScriptPush(BS_ptr); gBattleScripting.battler = gActiveBattler; + gBattlerAbility = gActiveBattler; gBattlescriptCurrInstr = BattleScript_AbilityNoStatLoss; gLastUsedAbility = gBattleMons[gActiveBattler].ability; RecordAbilityBattle(gActiveBattler, gLastUsedAbility); @@ -7883,6 +7884,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr { BattleScriptPush(BS_ptr); gBattleScripting.battler = gActiveBattler; + gBattlerAbility = gActiveBattler; gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss; gLastUsedAbility = gBattleMons[gActiveBattler].ability; RecordAbilityBattle(gActiveBattler, gLastUsedAbility); @@ -7896,6 +7898,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr { BattleScriptPush(BS_ptr); gBattleScripting.battler = gActiveBattler; + gBattlerAbility = gActiveBattler; gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss; gLastUsedAbility = gBattleMons[gActiveBattler].ability; RecordAbilityBattle(gActiveBattler, gLastUsedAbility); From a3b4767dd25b3de64df0ee60418765cd8720f5c3 Mon Sep 17 00:00:00 2001 From: Papa Cancer Date: Fri, 15 Mar 2019 12:54:11 +0000 Subject: [PATCH 307/667] Spiky Shield Created generic string "Atk was hurt by Def's BUFF" for use for both Spiky Shield and Rough Skin - can also be used for Aftermath and Rocky Helmet, when programmed --- data/battle_scripts_1.s | 9 +++++++++ include/battle_scripts.h | 1 + src/battle_message.c | 2 +- src/battle_script_commands.c | 18 ++++++++++++++++++ src/battle_util.c | 1 + 5 files changed, 30 insertions(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index de90b63b27..fb300e3af8 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6366,6 +6366,15 @@ BattleScript_RoughSkinActivates:: tryfaintmon BS_ATTACKER, FALSE, NULL return +BattleScript_SpikyShieldEffect:: + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + healthbarupdate BS_ATTACKER + datahpupdate BS_ATTACKER + printstring STRINGID_PKMNHURTSWITH + waitmessage 0x40 + tryfaintmon BS_ATTACKER, FALSE, NULL + return + BattleScript_CuteCharmActivates:: call BattleScript_AbilityPopUp status2animation BS_ATTACKER, STATUS2_INFATUATION diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 1c68b909b0..5e49ac6158 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -300,5 +300,6 @@ extern const u8 BattleScript_DefiantActivates[]; extern const u8 BattleScript_PowderMoveNoEffect[]; extern const u8 BattleScript_GrassyTerrainLoop[]; extern const u8 BattleScript_VCreateStatLoss[]; +extern const u8 BattleScript_SpikyShieldEffect[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/src/battle_message.c b/src/battle_message.c index a2d475876b..c83553cace 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -276,7 +276,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}!"); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 5ed4dec6df..6bca5dcfc7 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4151,6 +4151,7 @@ static void atk48_playstatchangeanimation(void) enum { + ATK49_SPIKY_SHIELD, ATK49_RAGE, ATK49_DEFROST, ATK49_SYNCHRONIZE_TARGET, @@ -4202,6 +4203,23 @@ static void atk49_moveend(void) { switch (gBattleScripting.atk49_state) { + case ATK49_SPIKY_SHIELD: + if (gProtectStructs[gBattlerTarget].spikyShielded && gBattleMoves[gCurrentMove].flags & FLAG_MAKES_CONTACT) + { + if (!(GetBattlerAbility(gBattlerAttacker) == ABILITY_MAGIC_GUARD)) + { + gMoveResultFlags &= ~(MOVE_RESULT_NO_EFFECT); + gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 8; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_SPIKY_SHIELD); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_SpikyShieldEffect; + effect = 1; + } + } + gBattleScripting.atk49_state++; + break; case ATK49_RAGE: // rage check if (gBattleMons[gBattlerTarget].status2 & STATUS2_RAGE && gBattleMons[gBattlerTarget].hp != 0 && gBattlerAttacker != gBattlerTarget diff --git a/src/battle_util.c b/src/battle_util.c index 58826276c7..3101027c80 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3248,6 +3248,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 8; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; + PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_RoughSkinActivates; effect++; From ea0049da89eeb85dabea740e6855164d7288b8e4 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 30 Mar 2019 11:50:55 +0100 Subject: [PATCH 308/667] Fix Spiky Shield --- src/battle_script_commands.c | 39 ++++++++++++++++-------------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 58b56afb3d..238ff6223f 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4180,11 +4180,11 @@ static void atk49_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; @@ -4194,11 +4194,7 @@ static void atk49_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); @@ -4207,19 +4203,18 @@ static void atk49_moveend(void) switch (gBattleScripting.atk49_state) { case ATK49_SPIKY_SHIELD: - if (gProtectStructs[gBattlerTarget].spikyShielded && gBattleMoves[gCurrentMove].flags & FLAG_MAKES_CONTACT) + if (gProtectStructs[gBattlerTarget].spikyShielded + && gBattleMoves[gCurrentMove].flags & FLAG_MAKES_CONTACT + && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { - if (!(GetBattlerAbility(gBattlerAttacker) == ABILITY_MAGIC_GUARD)) - { - gMoveResultFlags &= ~(MOVE_RESULT_NO_EFFECT); - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 8; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_SPIKY_SHIELD); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SpikyShieldEffect; - effect = 1; - } + gMoveResultFlags &= ~(MOVE_RESULT_NO_EFFECT); + gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 8; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_SPIKY_SHIELD); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_SpikyShieldEffect; + effect = 1; } gBattleScripting.atk49_state++; break; @@ -9994,7 +9989,7 @@ static void atkD0_settaunt(void) 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; } From e2268bd9384b2383c50b57421c1523ee3779eff3 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 30 Mar 2019 11:56:15 +0100 Subject: [PATCH 309/667] Imposter check for semi invulnerable --- src/battle_util.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 440212d9bf..a3b8454c66 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2709,7 +2709,8 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA case ABILITY_IMPOSTER: if (IsBattlerAlive(BATTLE_OPPOSITE(battler)) && !(gBattleMons[BATTLE_OPPOSITE(battler)].status2 & (STATUS2_TRANSFORMED | STATUS2_SUBSTITUTE)) - && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) + && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) + && !(gStatuses3[BATTLE_OPPOSITE(battler)] & STATUS3_SEMI_INVULNERABLE)) { gBattlerTarget = BATTLE_OPPOSITE(battler); BattleScriptPushCursorAndCallback(BattleScript_ImposterActivates); From 86e8bf0ecbb1a380dbe239f0035d0c582430b6d9 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 30 Mar 2019 11:58:19 +0100 Subject: [PATCH 310/667] Cursed Body PP check --- src/battle_util.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/battle_util.c b/src/battle_util.c index a3b8454c66..af5bc99c2f 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3168,6 +3168,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && TARGET_TURN_DAMAGED && gDisableStructs[gBattlerAttacker].disabledMove == MOVE_NONE && IsBattlerAlive(gBattlerAttacker) + && gBattleMons[gBattlerAttacker].pp[gChosenMovePos] != 0 && (Random() % 3) == 0) { gDisableStructs[gBattlerAttacker].disabledMove = gChosenMove; From d90767c49059b76bde4328f30ce344b5c88efabd Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 31 Mar 2019 15:24:46 +0200 Subject: [PATCH 311/667] Switch effect and argument fields in BattleMove struct --- asmdiff.ps1 | 114 ---------------------------------------------- include/pokemon.h | 6 +-- 2 files changed, 2 insertions(+), 118 deletions(-) delete mode 100644 asmdiff.ps1 diff --git a/asmdiff.ps1 b/asmdiff.ps1 deleted file mode 100644 index 169f14776b..0000000000 --- a/asmdiff.ps1 +++ /dev/null @@ -1,114 +0,0 @@ -Param -( - [Parameter(Position = 0)] - [string]$Start, - - [Parameter(Position = 1)] - [string]$Offset, - - [Parameter()] - [string[]]$DiffTool -) - -$ErrorActionPreference = "Stop" - -$offset_default_value = "0x100" -$diff_tool_default_value = "diff" - -$help = " -$($args[0]) [OPTIONS] Start [Offset] - -Performs a diff on the assembly of a function in a rom. 'Start' is the start -location of the function, and 'Offset' is the number of bytes to disassemble. -The assembly is saved to *.dump files. - -'Offset' is optional, and defaults to $offset_default_value. If this value is -very large (0x10000+), objdump may hang / freeze. - -Requirements: - - A clean copy of the rom named 'baserom.gba'. - - $$ENV:DEVKITARM to point to the installation of devkitpro. By default, it is - installed to 'C:\devkitpro\devkitARM'. - -Options: - -DiffTool The tool to use for diffing. Defaults to '$diff_tool_default_value'. For VSCode, - you can use -DiffTool 'code --diff'. (Quotes are necessary around 'code --diff') -" - -if ((-not (Test-Path variable:Start)) -or [string]::IsNullOrWhiteSpace($Start)) -{ - Write-Host $help - exit -} - -if (-not (Test-Path variable:DiffTool) -or [string]::IsNullOrWhiteSpace($DiffTool)) -{ - $DiffTool = $diff_tool_default_value -} - -if (-not (Test-Path variable:Offset) -or [string]::IsNullOrWhiteSpace($Offset)) -{ - $Offset = $offset_default_value -} - -if (-Not (Test-Path env:DEVKITARM)) -{ - Write-Host "ENV:DEVKITARM variable not set." - Write-Host $help - exit -} - -if (-Not (Test-Path $env:DEVKITARM)) -{ - Write-Host "DEVKITARM path '$env:DEVKITARM' does not exist." - Write-Host $help - exit -} - -if (-Not (Test-Path ".\pokeemerald.gba")) -{ - Write-Host "File 'pokeemerald.gba' not found." - Write-Host $help - exit -} - -if (-Not (Test-Path ".\baserom.gba")) -{ - Write-Host "File 'baserom.gba' not found." -} - -try -{ - $start_num = [System.Convert]::ToUInt64($Start, 16) -} -catch -{ - Write-Host "Error parsing '$start_num' as a hex number." - Write-Host $help - exit -} - -try -{ - $offset_num = [System.Convert]::ToUInt64($Offset, 16) -} -catch -{ - Write-Host "Error parsing '$offset_num' as a hex number." - Write-Host $help - exit -} - -if ($start_num -gt 0x1000000) -{ - Write-Host "Warning: Start address is larger than the ROM file. Hint: ignore the leading number in the address." -} - -$end_str = [System.Convert]::ToString($start_num + $offset_num, 16) -$end_str = "0x$end_str" - -Write-Host "$Start - $end_str" -$objdump = Join-Path -Path $env:DEVKITARM -ChildPath "arm-none-eabi\bin\objdump.exe" -&$objdump -D -bbinary -marmv4t -Mforce-thumb --start-address="$Start" --stop-address="$end_str" .\baserom.gba > .\baserom.dump -&$objdump -D -bbinary -marmv4t -Mforce-thumb --start-address="$Start" --stop-address="$end_str" .\pokeemerald.gba > .\pokeemerald.dump -Invoke-Expression "$DiffTool .\baserom.dump .\pokeemerald.dump" diff --git a/include/pokemon.h b/include/pokemon.h index 20e329c4a5..e976dc1a4e 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -336,11 +336,9 @@ struct BaseStats u8 noFlip : 1; }; -// Argument and effect field are temporarily switched till functions referencing gBattleMoves are decompiled. - struct BattleMove { - u8 argument; + u16 effect; u8 power; u8 type; u8 accuracy; @@ -350,7 +348,7 @@ struct BattleMove s8 priority; u32 flags; u8 split; - u16 effect; + u8 argument; }; struct SpindaSpot From ebe2dc6bbb09b55143d939640ef92f737b18eeb9 Mon Sep 17 00:00:00 2001 From: Papa Cancer Date: Sun, 31 Mar 2019 17:17:13 +0100 Subject: [PATCH 312/667] Mat Block Nothing more needs to be said --- data/battle_scripts_1.s | 7 +++++++ include/constants/battle.h | 1 + include/constants/battle_move_effects.h | 1 + src/battle_main.c | 4 ++-- src/battle_script_commands.c | 11 +++++++++++ src/data/battle_moves.h | 5 +++-- 6 files changed, 25 insertions(+), 4 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 663ae83d9e..aaff6e7761 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -345,6 +345,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectPartingShot .4byte BattleScript_EffectSpectralThief .4byte BattleScript_EffectVCreate + .4byte BattleScript_EffectMatBlock BattleScript_EffectVCreate: setmoveeffect MOVE_EFFECT_V_CREATE | MOVE_EFFECT_AFFECTS_USER @@ -3148,9 +3149,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 diff --git a/include/constants/battle.h b/include/constants/battle.h index c42188596e..d06e01f75b 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -212,6 +212,7 @@ #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 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 588fe97739..0565189353 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -333,5 +333,6 @@ #define EFFECT_PARTING_SHOT 327 #define EFFECT_SPECTRAL_THIEF 328 #define EFFECT_V_CREATE 329 +#define EFFECT_MAT_BLOCK 330 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/src/battle_main.c b/src/battle_main.c index 28d8dc0ee4..70f8c065bb 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4593,8 +4593,8 @@ static void TurnValuesCleanUp(bool8 var0) gBattleMons[gActiveBattler].status2 &= ~(STATUS2_SUBSTITUTE); } - gSideStatuses[0] &= ~(SIDE_STATUS_QUICK_GUARD | SIDE_STATUS_WIDE_GUARD | SIDE_STATUS_CRAFTY_SHIELD); - gSideStatuses[1] &= ~(SIDE_STATUS_QUICK_GUARD | SIDE_STATUS_WIDE_GUARD | SIDE_STATUS_CRAFTY_SHIELD); + 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; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index adad0eda04..e541acfe6a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -906,6 +906,9 @@ bool32 IsBattlerProtected(u8 battlerId, u16 move) 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; } @@ -2723,6 +2726,7 @@ void SetMoveEffect(bool32 primary, u32 certain) || 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) @@ -2731,6 +2735,7 @@ void SetMoveEffect(bool32 primary, u32 certain) 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; @@ -7379,6 +7384,12 @@ static void atk77_setprotectlike(void) 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; + } } } diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 89f499c2b9..70d03d7823 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -7870,16 +7870,17 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_MAT_BLOCK] = { - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_MAT_BLOCK, .power = 0, .type = TYPE_FIGHTING, .accuracy = 0, .pp = 15, .secondaryEffectChance = 0, - .target = MOVE_TARGET_SELECTED, + .target = MOVE_TARGET_USER, .priority = 0, .flags = 0, .split = SPLIT_STATUS, + .argument = TRUE, // Protects the whole side. }, [MOVE_BELCH] = From 1d5cf3acb56f2e7338b1e58eb3e710a295f6dae1 Mon Sep 17 00:00:00 2001 From: Papa Cancer Date: Sun, 31 Mar 2019 16:23:41 +0100 Subject: [PATCH 313/667] Misc. move updates Bind: 75% Acc -> 85% Acc Disable: 55% Acc. -> 100% Acc. Freeze-Dry: 10% chance to freeze Hammer Arm and Ice Hammer: lower user's speed High Jump Kick: 130BP, 10 PP Jump Kick: 100BP, 10 PP Tail Glow: raises Sp. Atk by 3 stages Waterfall: 20% chance to flinch --- data/battle_scripts_1.s | 16 +++++++++++----- include/constants/battle_move_effects.h | 4 ++-- src/data/battle_moves.h | 24 ++++++++++++------------ 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 663ae83d9e..dd9f6a9abe 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -32,7 +32,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectSpecialDefenseUp .4byte BattleScript_EffectAccuracyUp .4byte BattleScript_EffectEvasionUp - .4byte BattleScript_EffectUnused17 + .4byte BattleScript_EffectSpecialAttackUp3 .4byte BattleScript_EffectAttackDown .4byte BattleScript_EffectDefenseDown .4byte BattleScript_EffectSpeedDown @@ -111,7 +111,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectConversion2 .4byte BattleScript_EffectLockOn .4byte BattleScript_EffectSketch - .4byte BattleScript_EffectUnused60 + .4byte BattleScript_EffectHammerArm .4byte BattleScript_EffectSleepTalk .4byte BattleScript_EffectDestinyBond .4byte BattleScript_EffectFlail @@ -1720,10 +1720,8 @@ BattleScript_EffectPlaceholder: printstring STRINGID_NOTDONEYET goto BattleScript_MoveEnd -BattleScript_EffectUnused17: BattleScript_EffectEvasionDownHit: BattleScript_EffectVitalThrow: -BattleScript_EffectUnused60: BattleScript_EffectFalseSwipe: BattleScript_EffectAlwaysCrit: BattleScript_EffectPursuit: @@ -1759,7 +1757,6 @@ BattleScript_EffectFoulPlay: BattleScript_EffectPsyshock: BattleScript_EffectWeatherBall: BattleScript_EffectHiddenPower: -BattleScript_EffectFreezeDry: BattleScript_EffectTwoTypedMove: BattleScript_EffectTechnoBlast: BattleScript_EffectJudgment: @@ -1894,6 +1891,7 @@ BattleScript_EffectScald: setmoveeffect MOVE_EFFECT_BURN goto BattleScript_EffectHit +BattleScript_EffectFreezeDry: BattleScript_EffectFreezeHit:: setmoveeffect MOVE_EFFECT_FREEZE goto BattleScript_EffectHit @@ -2519,6 +2517,10 @@ 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 @@ -4237,6 +4239,10 @@ 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 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 588fe97739..bd52d065e6 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -18,7 +18,7 @@ #define EFFECT_SPECIAL_DEFENSE_UP 14 #define EFFECT_ACCURACY_UP 15 #define EFFECT_EVASION_UP 16 -#define EFFECT_UNUSED_17 17 +#define EFFECT_SPECIAL_ATTACK_UP_3 17 #define EFFECT_ATTACK_DOWN 18 #define EFFECT_DEFENSE_DOWN 19 #define EFFECT_SPEED_DOWN 20 @@ -97,7 +97,7 @@ #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 diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 89f499c2b9..63fbdc2f57 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -285,7 +285,7 @@ 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, @@ -367,10 +367,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [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, @@ -705,7 +705,7 @@ 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, @@ -1780,12 +1780,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [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 | FLAG_SHEER_FORCE_BOOST, @@ -1907,10 +1907,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_HI_JUMP_KICK] = { .effect = EFFECT_RECOIL_IF_MISS, - .power = 100, + .power = 130, .type = TYPE_FIGHTING, .accuracy = 90, - .pp = 20, + .pp = 10, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, @@ -4120,7 +4120,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_TAIL_GLOW] = { - .effect = EFFECT_SPECIAL_ATTACK_UP_2, + .effect = EFFECT_SPECIAL_ATTACK_UP_3, .power = 0, .type = TYPE_BUG, .accuracy = 100, @@ -5033,12 +5033,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_HAMMER_ARM] = { - .effect = EFFECT_SPEED_DOWN, + .effect = EFFECT_HAMMER_ARM, .power = 100, .type = TYPE_FIGHTING, .accuracy = 90, .pp = 10, - .secondaryEffectChance = 100, + .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, @@ -8815,7 +8815,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_ICE_HAMMER] = { - .effect = EFFECT_SPEED_DOWN_HIT, + .effect = EFFECT_HAMMER_ARM, .power = 100, .type = TYPE_ICE, .accuracy = 90, From b12334c88b50d86e13a5c2cc7a6d78333624aef5 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 31 Mar 2019 21:38:58 +0200 Subject: [PATCH 314/667] Remove cases from ABE, add functionality of Flower Veil --- asm/macros/battle_script.inc | 18 +- data/battle_scripts_1.s | 20 ++- include/battle.h | 2 +- include/battle_script_commands.h | 1 + include/battle_scripts.h | 1 + include/battle_util.h | 20 +-- include/constants/battle_script_commands.h | 5 +- include/constants/battle_string_ids.h | 1 + src/battle_ai_switch_items.c | 6 +- src/battle_main.c | 8 +- src/battle_message.c | 2 + src/battle_script_commands.c | 190 +++++++++++++-------- src/battle_util.c | 161 +++++++---------- 13 files changed, 240 insertions(+), 195 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index a8b847e8d8..e38ea4c8e4 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -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 @@ -1728,3 +1737,10 @@ .macro dmgtocurrattackerhp manipulatedamage ATK80_CURR_ATTACKER_HP .endm + + .macro jumpifflowerveil jumpptr:req + jumpifnottype BS_TARGET, TYPE_GRASS, 1f + jumpifability BS_TARGET_SIDE, ABILITY_FLOWER_VEIL, \jumpptr + 1: + .endm + diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 663ae83d9e..53f7d922ac 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1818,6 +1818,7 @@ BattleScript_EffectSleep:: jumpifsubstituteblocks BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_AlreadyAsleep jumpifcantmakeasleep BattleScript_CantMakeAsleep + jumpifflowerveil BattleScript_FlowerVeilProtects jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected @@ -1826,6 +1827,18 @@ BattleScript_EffectSleep:: 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_AlreadyAsleep:: setalreadystatusedmoveattempt BS_ATTACKER @@ -2265,6 +2278,7 @@ BattleScript_EffectToxic:: attackstring ppreduce jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected + jumpifflowerveil BattleScript_FlowerVeilProtects jumpifsubstituteblocks BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_POISON, BattleScript_AlreadyPoisoned jumpifstatus BS_TARGET, STATUS1_TOXIC_POISON, BattleScript_AlreadyPoisoned @@ -2587,6 +2601,7 @@ BattleScript_EffectPoison:: attackstring ppreduce jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected + jumpifflowerveil BattleScript_FlowerVeilProtects jumpifsubstituteblocks BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_POISON, BattleScript_AlreadyPoisoned jumpifstatus BS_TARGET, STATUS1_TOXIC_POISON, BattleScript_AlreadyPoisoned @@ -2608,6 +2623,7 @@ BattleScript_EffectParalyze: attackstring ppreduce jumpifability BS_TARGET, ABILITY_LIMBER, BattleScript_LimberProtected + jumpifflowerveil BattleScript_FlowerVeilProtects jumpifsubstituteblocks BattleScript_ButItFailed typecalc jumpifmovehadnoeffect BattleScript_ButItFailed @@ -3789,6 +3805,7 @@ BattleScript_EffectWillOWisp:: jumpifstatus BS_TARGET, STATUS1_BURN, BattleScript_AlreadyBurned jumpiftype BS_TARGET, TYPE_FIRE, BattleScript_NotAffected jumpifability BS_TARGET, ABILITY_WATER_VEIL, BattleScript_WaterVeilPrevents + jumpifflowerveil BattleScript_FlowerVeilProtects jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected @@ -4050,6 +4067,7 @@ BattleScript_EffectYawn:: ppreduce jumpifability BS_TARGET, ABILITY_VITAL_SPIRIT, BattleScript_PrintBankAbilityMadeIneffective jumpifability BS_TARGET, ABILITY_INSOMNIA, BattleScript_PrintBankAbilityMadeIneffective + jumpifflowerveil BattleScript_FlowerVeilProtects jumpifsubstituteblocks BattleScript_ButItFailed jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON @@ -4061,7 +4079,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 diff --git a/include/battle.h b/include/battle.h index 4f45972945..c186be6aea 100644 --- a/include/battle.h +++ b/include/battle.h @@ -620,7 +620,7 @@ struct BattleScripting u8 animArg2; u16 tripleKickPower; u8 atk49_state; - u8 battlerWithAbility; + u8 unused_15; u8 unused_16; u8 battler; u8 animTurn; diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index 9ceb67ff42..e84500b783 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -14,6 +14,7 @@ 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 CanUseLastResort(u8 battlerId); +u32 IsFlowerVeilProtected(u32 battler); extern void (* const gBattleScriptingCommandsTable[])(void); extern const u8 gUnknown_0831C494[][4]; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 6a352af562..efededa9d3 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -300,5 +300,6 @@ extern const u8 BattleScript_PowderMoveNoEffect[]; extern const u8 BattleScript_GrassyTerrainLoop[]; extern const u8 BattleScript_VCreateStatLoss[]; extern const u8 BattleScript_SpikyShieldEffect[]; +extern const u8 BattleScript_FlowerVeilProtectsRet[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/battle_util.h b/include/battle_util.h index d056fb018c..0f940b51b5 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -6,7 +6,7 @@ #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 @@ -20,23 +20,13 @@ #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_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_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 ITEMEFFECT_ON_SWITCH_IN 0x0 #define ITEMEFFECT_MOVE_END 0x3 #define ITEMEFFECT_KINGSROCK_SHELLBELL 0x4 -#define WEATHER_HAS_EFFECT ((!ABILITY_ON_FIELD(ABILITY_CLOUD_NINE) && !ABILITY_ON_FIELD(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)))) @@ -72,6 +62,11 @@ bool8 HasNoMonsToSwitch(u8 battlerId, u8 r1, u8 r2); u8 CastformDataTypeChange(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); void BattleScriptExecute(const u8* BS_ptr); void BattleScriptPushCursorAndCallback(const u8* BS_ptr); u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn); @@ -79,7 +74,6 @@ void ClearFuryCutterDestinyBondGrudge(u8 battlerId); void HandleAction_RunBattleScript(void); u8 GetMoveTarget(u16 move, u8 setTarget); u8 IsMonDisobedient(void); -u32 GetBattlerAbility(u8 battlerId); u32 GetBattlerHoldEffect(u8 battlerId, bool32 checkNegating); u32 GetBattlerHoldEffectParam(u8 battlerId); bool32 IsMoveMakingContact(u16 move, u8 battlerAtk); diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 4118a8589a..5b2df78f85 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -11,7 +11,7 @@ #define sB_ANIM_ARG2 gBattleScripting + 0x11 #define sTRIPLE_KICK_POWER gBattleScripting + 0x12 #define sMOVEEND_STATE gBattleScripting + 0x14 -#define sBATTLER_WITH_ABILITY gBattleScripting + 0x15 +#define sUNUSED_15 gBattleScripting + 0x15 #define sUNUSED_16 gBattleScripting + 0x16 #define sBATTLER gBattleScripting + 0x17 #define sB_ANIM_TURN gBattleScripting + 0x18 @@ -45,7 +45,7 @@ #define BS_BATTLER_0 7 #define BS_ATTACKER_WITH_PARTNER 4 // for atk98_status_icon_update #define BS_ATTACKER_SIDE 8 // for atk1E_jumpifability -#define BS_NOT_ATTACKER_SIDE 9 // for atk1E_jumpifability +#define BS_TARGET_SIDE 9 // for atk1E_jumpifability #define BS_SCRIPTING 10 #define BS_PLAYER1 11 #define BS_OPPONENT1 12 @@ -139,6 +139,7 @@ #define VARIOUS_GRAVITY_ON_AIRBORNE_MONS 76 #define VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS 77 #define VARIOUS_JUMP_IF_ROAR_FAILS 78 +#define VARIOUS_JUMP_IF_FLOWER_VEIL 79 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 9f9425d0da..007ea7987a 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -524,6 +524,7 @@ #define STRINGID_ELECTRICTERRAINPREVENTS 520 #define STRINGID_PSYCHICTERRAINPREVENTS 521 #define STRINGID_SAFETYGOOGLESPROTECTED 522 +#define STRINGID_FLOWERVEILPROTECTED 523 #define BATTLESTRINGS_COUNT 529 diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index ec0d20ad0c..4011925d9b 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -414,11 +414,11 @@ static bool8 ShouldSwitch(void) return FALSE; if (gStatuses3[gActiveBattler] & STATUS3_ROOTED) return FALSE; - if (ABILITY_ON_OPPOSING_FIELD(gActiveBattler, ABILITY_SHADOW_TAG)) + if (IsAbilityOnOpposingSide(gActiveBattler, ABILITY_SHADOW_TAG)) return FALSE; - if (ABILITY_ON_OPPOSING_FIELD(gActiveBattler, ABILITY_ARENA_TRAP)) // Misses the flying type and Levitate check. + if (IsAbilityOnOpposingSide(gActiveBattler, ABILITY_ARENA_TRAP)) // Misses the flying type and Levitate check. return FALSE; - if (ABILITY_ON_FIELD(ABILITY_MAGNET_PULL)) + if (IsAbilityOnField(ABILITY_MAGNET_PULL)) { if (gBattleMons[gActiveBattler].type1 == TYPE_STEEL) return FALSE; diff --git a/src/battle_main.c b/src/battle_main.c index 28d8dc0ee4..f1e57a4088 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3711,7 +3711,7 @@ u8 IsRunningFromBattleImpossible(void) return 2; } } - i = AbilityBattleEffects(ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER, gActiveBattler, ABILITY_MAGNET_PULL, 0, 0); + i = IsAbilityOnFieldExcept(gActiveBattler, ABILITY_MAGNET_PULL); if (i != 0 && IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_STEEL)) { gBattleScripting.battler = i - 1; @@ -3902,11 +3902,11 @@ static void HandleTurnActionSelectionState(void) { BtlController_EmitChoosePokemon(0, PARTY_CANT_SWITCH, 6, 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)) + else if ((i = IsAbilityOnOpposingSide(gActiveBattler, ABILITY_SHADOW_TAG)) + || ((i = IsAbilityOnOpposingSide(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)) + || ((i = IsAbilityOnFieldExcept(gActiveBattler, ABILITY_MAGNET_PULL)) && IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_STEEL))) { BtlController_EmitChoosePokemon(0, ((i - 1) << 4) | PARTY_ABILITY_PREVENTS, 6, gLastUsedAbility, gBattleStruct->field_60[gActiveBattler]); diff --git a/src/battle_message.c b/src/battle_message.c index 8b043adea7..e141b9edf1 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -649,9 +649,11 @@ static const u8 sText_GrassyTerrainHeals[] = _("{B_ATK_NAME_WITH_PREFIX} is heal 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!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_FLOWERVEILPROTECTED - 12] = sText_FlowerVeilProtected, [STRINGID_SAFETYGOOGLESPROTECTED - 12] = sText_SafetyGooglesProtected, [STRINGID_SPECTRALTHIEFSTEAL - 12] = sText_SpectralThiefSteal, [STRINGID_BELCHCANTSELECT - 12] = sText_BelchCantUse, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index adad0eda04..29968b92ee 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -109,7 +109,7 @@ static void atk1E_jumpifability(void); static void atk1F_jumpifsideaffecting(void); static void atk20_jumpifstat(void); static void atk21_jumpifstatus3condition(void); -static void atk22_jumpiftype(void); +static void atk22_jumpbasedontype(void); static void atk23_getexp(void); static void atk24(void); static void atk25_movevaluescleanup(void); @@ -368,7 +368,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atk1F_jumpifsideaffecting, atk20_jumpifstat, atk21_jumpifstatus3condition, - atk22_jumpiftype, + atk22_jumpbasedontype, atk23_getexp, atk24, atk25_movevaluescleanup, @@ -1285,7 +1285,7 @@ static void atk02_attackstring(void) static void atk03_ppreduce(void) { - s32 ppToDeduct = 1; + s32 i, ppToDeduct = 1; if (gBattleControllerExecFlags) return; @@ -1295,14 +1295,22 @@ static void atk03_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; } @@ -2004,7 +2012,7 @@ void SetMoveEffect(bool32 primary, u32 certain) gBattleScripting.battler = gBattlerAttacker; } - if (gBattleMons[gEffectBattler].ability == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) + if (GetBattlerAbility(gEffectBattler) == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && !primary && gBattleScripting.moveEffect <= 9) INCREMENT_RESET_RETURN @@ -2026,7 +2034,7 @@ void SetMoveEffect(bool32 primary, u32 certain) { 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); @@ -2040,16 +2048,16 @@ void SetMoveEffect(bool32 primary, u32 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 + || IsFlowerVeilProtected(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; @@ -2085,13 +2093,13 @@ void SetMoveEffect(bool32 primary, u32 certain) break; if (gBattleMons[gEffectBattler].status1) break; - if (gBattleMons[gEffectBattler].ability == ABILITY_IMMUNITY) + if (GetBattlerAbility(gEffectBattler) == ABILITY_IMMUNITY || IsFlowerVeilProtected(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; @@ -2122,7 +2130,7 @@ void SetMoveEffect(bool32 primary, u32 certain) } if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_FIRE)) break; - if (gBattleMons[gEffectBattler].ability == ABILITY_WATER_VEIL) + if (GetBattlerAbility(gEffectBattler) == ABILITY_WATER_VEIL || IsFlowerVeilProtected(gEffectBattler)) break; if (gBattleMons[gEffectBattler].status1) break; @@ -2138,14 +2146,14 @@ void SetMoveEffect(bool32 primary, u32 certain) break; if (noSunCanFreeze == 0) break; - if (gBattleMons[gEffectBattler].ability == ABILITY_MAGMA_ARMOR) + if (GetBattlerAbility(gEffectBattler) == ABILITY_MAGMA_ARMOR || IsFlowerVeilProtected(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) { @@ -2181,7 +2189,7 @@ void SetMoveEffect(bool32 primary, u32 certain) } if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_ELECTRIC)) break; - if (gBattleMons[gEffectBattler].ability == ABILITY_LIMBER) + if (GetBattlerAbility(gEffectBattler) == ABILITY_LIMBER || IsFlowerVeilProtected(gEffectBattler)) break; if (gBattleMons[gEffectBattler].status1) break; @@ -2189,7 +2197,7 @@ void SetMoveEffect(bool32 primary, u32 certain) 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); @@ -2222,7 +2230,7 @@ void SetMoveEffect(bool32 primary, u32 certain) break; if (!IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON) && !IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL)) { - if (gBattleMons[gEffectBattler].ability == ABILITY_IMMUNITY) + if (GetBattlerAbility(gEffectBattler) == ABILITY_IMMUNITY || IsFlowerVeilProtected(gEffectBattler)) break; // It's redundant, because at this point we know the status1 value is 0. @@ -2269,8 +2277,7 @@ void SetMoveEffect(bool32 primary, u32 certain) || gBattleScripting.moveEffect == MOVE_EFFECT_PARALYSIS || gBattleScripting.moveEffect == MOVE_EFFECT_BURN) { - u8* synchronizeEffect = &gBattleStruct->synchronizeMoveEffect; - *synchronizeEffect = gBattleScripting.moveEffect; + gBattleStruct->synchronizeMoveEffect = gBattleScripting.moveEffect; gHitMarker |= HITMARKER_SYNCHRONISE_EFFECT; } return; @@ -2295,7 +2302,7 @@ void SetMoveEffect(bool32 primary, u32 certain) 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++; @@ -2648,7 +2655,7 @@ void SetMoveEffect(bool32 primary, u32 certain) } break; case MOVE_EFFECT_KNOCK_OFF: - if (gBattleMons[gEffectBattler].ability == ABILITY_STICKY_HOLD) + if (GetBattlerAbility(gEffectBattler) == ABILITY_STICKY_HOLD) { if (gBattleMons[gEffectBattler].item == 0) { @@ -2991,48 +2998,45 @@ static void atk1D_jumpifstatus2(void) static void atk1E_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; } } @@ -3138,16 +3142,28 @@ static void atk21_jumpifstatus3condition(void) } } -static void atk22_jumpiftype(void) +static void atk22_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 atk23_getexp(void) @@ -3918,7 +3934,7 @@ static void atk42_setroost(void) static void atk43_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; @@ -6360,6 +6376,14 @@ static bool32 ClearDefogHazards(u8 battlerAtk, bool32 clear) return FALSE; } +u32 IsFlowerVeilProtected(u32 battler) +{ + if (IS_BATTLER_OF_TYPE(battler, TYPE_GRASS)) + return IsAbilityOnSide(battler, ABILITY_FLOWER_VEIL); + else + return 0; +} + static void atk76_various(void) { struct Pokemon *mon; @@ -7689,15 +7713,15 @@ bool8 UproarWakeUpCheck(u8 battlerId) static void atk84_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); @@ -7851,8 +7875,8 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr gBattlescriptCurrInstr = BattleScript_ButItFailed; 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_WHITE_SMOKE) && !certain && gCurrentMove != MOVE_CURSE) { if (flags == STAT_CHANGE_BS_PTR) @@ -7867,14 +7891,34 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *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_CHANGE_DIDNT_WORK; } - else if (gBattleMons[gActiveBattler].ability == ABILITY_KEEN_EYE + else if ((index = IsFlowerVeilProtected(gActiveBattler)) && !certain) + { + if (flags == STAT_CHANGE_BS_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_CHANGE_BS_PTR) @@ -7883,12 +7927,12 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr gBattleScripting.battler = gActiveBattler; gBattlerAbility = gActiveBattler; gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss; - gLastUsedAbility = gBattleMons[gActiveBattler].ability; + gLastUsedAbility = GetBattlerAbility(gActiveBattler); RecordAbilityBattle(gActiveBattler, gLastUsedAbility); } 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_CHANGE_BS_PTR) @@ -7897,12 +7941,12 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr gBattleScripting.battler = gActiveBattler; gBattlerAbility = gActiveBattler; gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss; - gLastUsedAbility = gBattleMons[gActiveBattler].ability; + gLastUsedAbility = GetBattlerAbility(gActiveBattler); RecordAbilityBattle(gActiveBattler, gLastUsedAbility); } 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_CHANGE_DIDNT_WORK; } diff --git a/src/battle_util.c b/src/battle_util.c index af5bc99c2f..67f73fc21a 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3560,83 +3560,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } } 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_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; } - if (effect && caseID < ABILITYEFFECT_CHECK_OTHER_SIDE && gLastUsedAbility != 0xFF) + if (effect && gLastUsedAbility != 0xFF) RecordAbilityBattle(battler, gLastUsedAbility); if (effect && caseID <= ABILITYEFFECT_MOVE_END) gBattlerAbility = battler; @@ -3644,6 +3570,64 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA 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) + && sAbilitiesAffectedByMoldBreaker[gBattleMons[battlerId].ability] + && gBattlerByTurnOrder[gCurrentTurnActionNumber] == gBattlerAttacker + && gActionsByTurnOrder[gBattlerByTurnOrder[gBattlerAttacker]] == B_ACTION_USE_MOVE + && gCurrentTurnActionNumber < gBattlersCount + && !(gStatuses3[gBattlerAttacker] & STATUS3_GASTRO_ACID)) + 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; +} + void BattleScriptExecute(const u8 *BS_ptr) { gBattlescriptCurrInstr = BS_ptr; @@ -4372,7 +4356,7 @@ u8 GetMoveTarget(u16 move, u8 setTarget) targetBattler = Random() % gBattlersCount; } while (targetBattler == gBattlerAttacker || side == GetBattlerSide(targetBattler) || gAbsentBattlerFlags & gBitTable[targetBattler]); 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; @@ -4380,7 +4364,7 @@ u8 GetMoveTarget(u16 move, u8 setTarget) gSpecialStatuses[targetBattler].lightningRodRedirected = 1; } else if (gBattleMoves[move].type == TYPE_WATER - && AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIDE, gBattlerAttacker, ABILITY_STORM_DRAIN, 0, 0) + && IsAbilityOnOpposingSide(gBattlerAttacker, ABILITY_STORM_DRAIN) && gBattleMons[targetBattler].ability != ABILITY_STORM_DRAIN) { targetBattler ^= BIT_FLANK; @@ -4564,23 +4548,6 @@ u8 IsMonDisobedient(void) } } -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) - && sAbilitiesAffectedByMoldBreaker[gBattleMons[battlerId].ability] - && gBattlerByTurnOrder[gCurrentTurnActionNumber] == gBattlerAttacker - && gActionsByTurnOrder[gBattlerByTurnOrder[gBattlerAttacker]] == B_ACTION_USE_MOVE - && gCurrentTurnActionNumber < gBattlersCount - && !(gStatuses3[gBattlerAttacker] & STATUS3_GASTRO_ACID)) - return ABILITY_NONE; - else - return gBattleMons[battlerId].ability; -} - u32 GetBattlerHoldEffect(u8 battlerId, bool32 checkNegating) { if (checkNegating) @@ -5052,10 +5019,10 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe } // field abilities - if ((ABILITY_ON_FIELD(ABILITY_DARK_AURA) && moveType == TYPE_DARK) - || (ABILITY_ON_FIELD(ABILITY_FAIRY_AURA) && moveType == TYPE_FAIRY)) + if ((IsAbilityOnField(ABILITY_DARK_AURA) && moveType == TYPE_DARK) + || (IsAbilityOnField(ABILITY_FAIRY_AURA) && moveType == TYPE_FAIRY)) { - if (ABILITY_ON_FIELD(ABILITY_AURA_BREAK)) + if (IsAbilityOnField(ABILITY_AURA_BREAK)) MulModifier(&modifier, UQ_4_12(0.75)); else MulModifier(&modifier, UQ_4_12(1.25)); From 6f9096c61346a550cb38f296e03030bb05826cf7 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 31 Mar 2019 22:02:39 +0200 Subject: [PATCH 315/667] Add Sweet Veil --- data/battle_scripts_1.s | 13 +++++++++++++ include/battle_scripts.h | 1 + include/constants/battle_script_commands.h | 1 - include/constants/battle_string_ids.h | 1 + src/battle_message.c | 2 ++ src/battle_script_commands.c | 1 + 6 files changed, 18 insertions(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 53f7d922ac..844368d12d 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1819,6 +1819,7 @@ BattleScript_EffectSleep:: jumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_AlreadyAsleep jumpifcantmakeasleep BattleScript_CantMakeAsleep jumpifflowerveil BattleScript_FlowerVeilProtects + jumpifability BS_TARGET_SIDE, ABILITY_SWEET_VEIL, BattleScript_SweetVeilProtects jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected @@ -1839,6 +1840,18 @@ 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_AlreadyAsleep:: setalreadystatusedmoveattempt BS_ATTACKER diff --git a/include/battle_scripts.h b/include/battle_scripts.h index efededa9d3..1f66b160b4 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -301,5 +301,6 @@ extern const u8 BattleScript_GrassyTerrainLoop[]; extern const u8 BattleScript_VCreateStatLoss[]; extern const u8 BattleScript_SpikyShieldEffect[]; extern const u8 BattleScript_FlowerVeilProtectsRet[]; +extern const u8 BattleScript_SweetVeilProtectsRet[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 5b2df78f85..681838f76f 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -139,7 +139,6 @@ #define VARIOUS_GRAVITY_ON_AIRBORNE_MONS 76 #define VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS 77 #define VARIOUS_JUMP_IF_ROAR_FAILS 78 -#define VARIOUS_JUMP_IF_FLOWER_VEIL 79 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 007ea7987a..fb5eb63ab5 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -525,6 +525,7 @@ #define STRINGID_PSYCHICTERRAINPREVENTS 521 #define STRINGID_SAFETYGOOGLESPROTECTED 522 #define STRINGID_FLOWERVEILPROTECTED 523 +#define STRINGID_SWEETVEILPROTECTED 524 #define BATTLESTRINGS_COUNT 529 diff --git a/src/battle_message.c b/src/battle_message.c index e141b9edf1..3dfe576249 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -650,9 +650,11 @@ static const u8 sText_ElectricTerrainPreventsSleep[] = _("{B_DEF_NAME_WITH_PREFI 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!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_SWEETVEILPROTECTED - 12] = sText_SweetVeilProtected, [STRINGID_FLOWERVEILPROTECTED - 12] = sText_FlowerVeilProtected, [STRINGID_SAFETYGOOGLESPROTECTED - 12] = sText_SafetyGooglesProtected, [STRINGID_SPECTRALTHIEFSTEAL - 12] = sText_SpectralThiefSteal, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 29968b92ee..5060c2eae5 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2050,6 +2050,7 @@ void SetMoveEffect(bool32 primary, u32 certain) break; if (GetBattlerAbility(gEffectBattler) == ABILITY_VITAL_SPIRIT || GetBattlerAbility(gEffectBattler) == ABILITY_INSOMNIA + || IsAbilityOnSide(gEffectBattler, ABILITY_SWEET_VEIL) || IsFlowerVeilProtected(gEffectBattler)) break; From 62192b86f79a46685cc435a9106633e566ae834a Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 1 Apr 2019 11:42:37 +0200 Subject: [PATCH 316/667] Aroma Veil --- data/battle_scripts_1.s | 18 ++++++++++++++++++ include/constants/battle_string_ids.h | 1 + src/battle_message.c | 2 ++ src/battle_util.c | 4 +++- 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index f4870fd73d..764ff256c1 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1664,6 +1664,7 @@ BattleScript_EffectHealBlock: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce + jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects sethealblock BattleScript_ButItFailed attackanimation waitanimation @@ -1849,6 +1850,18 @@ 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_AlreadyAsleep:: setalreadystatusedmoveattempt BS_ATTACKER @@ -2837,6 +2850,7 @@ BattleScript_EffectDisable:: attackcanceler attackstring ppreduce + jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE disablelastusedattack BattleScript_ButItFailed attackanimation @@ -2883,6 +2897,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 @@ -3298,6 +3313,7 @@ BattleScript_EffectAttract:: attackstring ppreduce accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE + jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects tryinfatuating BattleScript_ButItFailed attackanimation waitanimation @@ -3782,6 +3798,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 @@ -3938,6 +3955,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 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index fb5eb63ab5..684f2b1113 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -526,6 +526,7 @@ #define STRINGID_SAFETYGOOGLESPROTECTED 522 #define STRINGID_FLOWERVEILPROTECTED 523 #define STRINGID_SWEETVEILPROTECTED 524 +#define STRINGID_AROMAVEILPROTECTED 525 #define BATTLESTRINGS_COUNT 529 diff --git a/src/battle_message.c b/src/battle_message.c index 3dfe576249..b8e5e97129 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -651,9 +651,11 @@ static const u8 sText_PsychicTerrainPreventsPriority[] = _("{B_DEF_NAME_WITH_PRE 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!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_AROMAVEILPROTECTED - 12] = sText_AromaVeilProtected, [STRINGID_SWEETVEILPROTECTED - 12] = sText_SweetVeilProtected, [STRINGID_FLOWERVEILPROTECTED - 12] = sText_FlowerVeilProtected, [STRINGID_SAFETYGOOGLESPROTECTED - 12] = sText_SafetyGooglesProtected, diff --git a/src/battle_util.c b/src/battle_util.c index 67f73fc21a..64bddb8d76 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3168,6 +3168,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && TARGET_TURN_DAMAGED && gDisableStructs[gBattlerAttacker].disabledMove == MOVE_NONE && IsBattlerAlive(gBattlerAttacker) + && !IsAbilityOnSide(gBattlerAttacker, ABILITY_AROMA_VEIL) && gBattleMons[gBattlerAttacker].pp[gChosenMovePos] != 0 && (Random() % 3) == 0) { @@ -3330,7 +3331,8 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && TARGET_TURN_DAMAGED && gBattleMons[gBattlerTarget].hp != 0 && (Random() % 3) == 0 - && gBattleMons[gBattlerAttacker].ability != ABILITY_OBLIVIOUS + && 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 From 14a34b002a896fe65b6991210b05b8dc028c5547 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 1 Apr 2019 14:43:18 +0200 Subject: [PATCH 317/667] Electroweb animation --- asm/macros/battle_anim_script.inc | 5 +++++ data/battle_anim_scripts.s | 23 +++++++++++++++++++++++ src/battle_anim_utility_funcs.c | 6 ++++++ src/bug.c | 1 + src/electric.c | 2 +- 5 files changed, 36 insertions(+), 1 deletion(-) diff --git a/asm/macros/battle_anim_script.inc b/asm/macros/battle_anim_script.inc index 6ccd8d505a..3ad8e80dbb 100644 --- a/asm/macros/battle_anim_script.inc +++ b/asm/macros/battle_anim_script.inc @@ -283,3 +283,8 @@ .macro jumpretfalse ptr:req jumpreteq FALSE, \ptr .endm + + .macro jumpifdoublebattle ptr:req + createvisualtask AnimTask_IsDoubleBattle, 0 + jumprettrue \ptr + .endm diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 60fdb94f64..45a04b2580 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -2264,6 +2264,29 @@ Move_WORK_UP: 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_W081B, SOUND_PAN_TARGET + createsprite gUnknown_08596A2C, ANIM_ATTACKER, 2, 0, 0 + 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: diff --git a/src/battle_anim_utility_funcs.c b/src/battle_anim_utility_funcs.c index efe35e1b4c..a3abb10dd2 100644 --- a/src/battle_anim_utility_funcs.c +++ b/src/battle_anim_utility_funcs.c @@ -1059,3 +1059,9 @@ static void sub_8117FD0(u8 taskId) DestroyTask(taskId); } } + +void AnimTask_IsDoubleBattle(u8 taskId) +{ + gBattleAnimArgs[7] = (IsDoubleBattle() && !IsContest()); + DestroyAnimVisualTask(taskId); +} diff --git a/src/bug.c b/src/bug.c index 28c55cde4e..e061b068c8 100644 --- a/src/bug.c +++ b/src/bug.c @@ -317,6 +317,7 @@ void sub_811067C(struct Sprite *sprite) { SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); + SetAverageBattlerPositions(gBattleAnimTarget, FALSE, &sprite->pos1.x, &sprite->pos1.y); if (GetBattlerSide(gBattleAnimAttacker)) sprite->pos1.x -= gBattleAnimArgs[0]; else diff --git a/src/electric.c b/src/electric.c index 5e77298421..5440c1ebf8 100644 --- a/src/electric.c +++ b/src/electric.c @@ -1294,7 +1294,7 @@ void sub_810B55C(u8 taskId) bool8 sub_810B614(struct Task *task, u8 taskId) { u8 spriteId = CreateSprite(&gUnknown_085956C0, task->data[13], task->data[14], task->data[12]); - + if (spriteId != MAX_SPRITES) { gSprites[spriteId].callback = sub_810B684; From 62863516c8ac609bc694ef3d644013166f40d354 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 1 Apr 2019 15:03:04 +0200 Subject: [PATCH 318/667] Fix Bubblebeam animation in double battles --- data/battle_anim_scripts.s | 13 +++++----- src/water.c | 50 +++++++++++++++++++------------------- 2 files changed, 32 insertions(+), 31 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 45a04b2580..228aa12b1f 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -4404,6 +4404,7 @@ Move_BUBBLE_BEAM: delay 1 call Bulbblebeam1 createvisualtask AnimTask_SwayMon, 5, 0, 3, 3072, 8, ANIM_TARGET + createvisualtask AnimTask_SwayMon, 5, 0, 3, 3072, 8, ANIM_DEF_PARTNER call Bulbblebeam1 call Bulbblebeam1 waitforvisualfinish @@ -12287,22 +12288,22 @@ PoisonBubblesEffect: return WaterBubbleEffect: - createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 10, 10, 0 + createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 10, 10, 1 playsewithpan SE_W145C, SOUND_PAN_TARGET delay 6 - createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 20, -20, 0 + createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 20, -20, 1 playsewithpan SE_W145C, SOUND_PAN_TARGET delay 6 - createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, -20, 15, 0 + createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, -20, 15, 1 playsewithpan SE_W145C, SOUND_PAN_TARGET delay 6 - createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 0 + createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1 playsewithpan SE_W145C, SOUND_PAN_TARGET delay 6 - createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, -20, -20, 0 + createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, -20, -20, 1 playsewithpan SE_W145C, SOUND_PAN_TARGET delay 6 - createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 16, -8, 0 + createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 16, -8, 1 playsewithpan SE_W145C, SOUND_PAN_TARGET return diff --git a/src/water.c b/src/water.c index 20bf2542d3..c20edfe7dc 100644 --- a/src/water.c +++ b/src/water.c @@ -483,7 +483,7 @@ extern const struct SpriteTemplate gUnknown_08597388; void AnimTask_CreateRaindrops(u8 taskId) { u8 x, y; - + if (gTasks[taskId].data[0] == 0) { gTasks[taskId].data[1] = gBattleAnimArgs[0]; @@ -520,7 +520,7 @@ void sub_8107228(struct Sprite *sprite) void sub_8107260(struct Sprite *sprite) { u8 spriteId; - + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) - gBattleAnimArgs[0]; @@ -559,7 +559,7 @@ void sub_8107380(struct Sprite *sprite) u8 otherSpriteId = sprite->data[5]; u8 timer = gSprites[otherSpriteId].data[4]; u16 trigIndex = gSprites[otherSpriteId].data[3]; - + sprite->data[0] = 1; AnimTranslateLinear(sprite); sprite->pos2.x += Sin(trigIndex >> 8, gSprites[otherSpriteId].data[0]); @@ -593,7 +593,7 @@ void sub_8107430(struct Sprite *sprite) void sub_810744C(struct Sprite *sprite) { s16 unkArg; - + InitSpritePosToAnimAttacker(sprite, TRUE); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) unkArg = -gBattleAnimArgs[2]; @@ -636,7 +636,7 @@ void sub_810756C(u8 taskId) u16 *palPtr1; u16 *palPtr2; u16 rgbBuffer; - + if (++gTasks[taskId].data[10] == 3) { gTasks[taskId].data[10] = 0; @@ -724,7 +724,7 @@ _081075DE:\n\ void sub_81075EC(struct Sprite *sprite) { u16 retArg; - + InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[0] = 30; sprite->data[1] = sprite->pos1.x; @@ -781,7 +781,7 @@ void sub_81076F4(u8 taskId) void sub_8107730(struct Sprite *sprite) { u8 priority; - + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0); sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1); sprite->pos2.y = -10; @@ -797,7 +797,7 @@ void sub_8107730(struct Sprite *sprite) { sprite->pos2.x = -10; sprite->subpriority = priority - 2; - } + } } else { @@ -876,7 +876,7 @@ void AnimTask_CreateSurfWave(u8 taskId) { struct BattleAnimBgData animBg; u8 taskId2; - + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); @@ -1182,7 +1182,7 @@ void sub_8107B84(u8 taskId) s16 unkUse; u32 palOffset; u16 palNum; - + *BGptrX += gTasks[taskId].data[0]; *BGptrY += gTasks[taskId].data[1]; sub_80A6B30(&animBg); @@ -1412,7 +1412,7 @@ void sub_8107D58(u8 taskId) struct ScanlineEffectParams params; struct Task *task = &gTasks[taskId]; // u16 *scanlineBuffer; - + switch (task->data[0]) { case 0: @@ -1883,7 +1883,7 @@ void sub_8108034(struct Sprite *sprite) { s16 randData; s16 randData2; - + sprite->oam.tileNum += 8; InitSpritePosToAnimTarget(sprite, TRUE); randData = (Random2() & 0xFF) | 256; @@ -1911,7 +1911,7 @@ void sub_8108098(struct Sprite *sprite) void sub_81080E4(u8 taskId) { struct Task *task = &gTasks[taskId]; - + task->data[15] = GetAnimBattlerSpriteId(ANIM_ATTACKER); task->data[5] = gSprites[task->data[15]].pos1.y; task->data[1] = sub_8108384(); @@ -1922,7 +1922,7 @@ void sub_81080E4(u8 taskId) void sub_8108140(u8 taskId) { struct Task *task = &gTasks[taskId]; - + switch (task->data[0]) { case 0: @@ -2011,7 +2011,7 @@ u8 sub_8108384(void) u16 maxhp; u16 partyIndex; struct Pokemon *slot; - + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) { partyIndex = gBattlerPartyIndexes[gBattleAnimAttacker]; @@ -2045,7 +2045,7 @@ void sub_8108408(struct Task *task, u8 taskId) u8 subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) - 1; s16 increment = 4 - task->data[1]; u8 spriteId; - + if (increment <= 0) increment = 1; for (i = 0; i < 20; i += increment) @@ -2094,7 +2094,7 @@ void sub_810851C(struct Sprite *sprite) void sub_81085C8(u8 taskId) { struct Task *task = &gTasks[taskId]; - + task->data[1] = sub_8108384(); if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) { @@ -2116,7 +2116,7 @@ void sub_810862C(u8 taskId) { struct Task *task = &gTasks[taskId]; u8 taskId2; - + switch (task->data[0]) { case 0: @@ -2159,7 +2159,7 @@ void sub_810871C(struct Task *task, u8 taskId) { u16 yPosArg = ((gSineTable[task->data[8]] + 3) >> 4) + task->data[6]; u8 spriteId = CreateSprite(&gUnknown_08595268, task->data[7], 0, 0); - + if (spriteId != MAX_SPRITES) { gSprites[spriteId].callback = sub_81087C0; @@ -2212,7 +2212,7 @@ void sub_810886C(struct Sprite *sprite) void sub_81088E4(u8 taskId) { struct Task *task = &gTasks[taskId]; - + task->data[3] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); task->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); task->data[7] = (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) ? 1 : -1; @@ -2229,7 +2229,7 @@ void sub_81088E4(u8 taskId) void sub_8108978(u8 taskId) { struct Task *task = &gTasks[taskId]; - + switch (task->data[0]) { case 0: @@ -2298,7 +2298,7 @@ void sub_8108978(u8 taskId) void sub_8108AC0(struct Task *task) { u8 spriteId; - + if (++task->data[2] > 1) { task->data[2] = 0; @@ -2334,7 +2334,7 @@ void sub_8108B2C(struct Sprite *sprite) void sub_8108B94(struct Sprite *sprite) { u16 i; - + if (TranslateAnimHorizontalArc(sprite)) { for (i = 0; i < NUM_TASKS; i++) @@ -2397,7 +2397,7 @@ void sub_8108CDC(struct Sprite *sprite) { int xDiff = sprite->data[1] - sprite->pos1.x; int yDiff = sprite->data[2] - sprite->pos1.y; - + sprite->pos2.x = (sprite->data[0] * xDiff) / sprite->data[3]; sprite->pos2.y = (sprite->data[0] * yDiff) / sprite->data[3]; if (++sprite->data[5] == sprite->data[4]) @@ -2420,7 +2420,7 @@ void sub_8108D54(struct Sprite *sprite, int xDiff, int yDiff) s16 randomSomethingX = -xDiff + (Random2() % 10) - 5; s16 i; u8 spriteId; - + for (i = 0; i <= 0; i++) { spriteId = CreateSprite(&gUnknown_08595310, combinedX, combinedY + something, 130); From 83936185be26a0cd3b4b2f9ecdc7b04fd44bc16d Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 1 Apr 2019 15:08:19 +0200 Subject: [PATCH 319/667] Add precautions --- src/battle_anim_mon_movement.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/battle_anim_mon_movement.c b/src/battle_anim_mon_movement.c index 250a0459fe..1c42eb9e15 100644 --- a/src/battle_anim_mon_movement.c +++ b/src/battle_anim_mon_movement.c @@ -765,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]; From c9ad96d2282bea4ab742a57f90b3f739b3c3e77f Mon Sep 17 00:00:00 2001 From: Papa Cancer Date: Mon, 1 Apr 2019 15:28:17 +0100 Subject: [PATCH 320/667] Stomping Tantrum Uses timer in gBattleStruct to count time since last failed move. This is augmented by a MOVE_FAILED result in atk_49 and decreased with an ENDTURN case. EFFECT_STOMPING_TANTRUM doubles base power if the timer is set. --- data/battle_scripts_1.s | 2 ++ include/battle.h | 1 + include/constants/battle_move_effects.h | 1 + include/constants/battle_script_commands.h | 41 +++++++++++----------- src/battle_script_commands.c | 7 ++++ src/battle_util.c | 4 +++ src/data/battle_moves.h | 2 +- 7 files changed, 37 insertions(+), 21 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 764ff256c1..ae219de0a3 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -345,6 +345,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectPartingShot .4byte BattleScript_EffectSpectralThief .4byte BattleScript_EffectVCreate + .4byte BattleScript_EffectStompingTantrum BattleScript_EffectVCreate: setmoveeffect MOVE_EFFECT_V_CREATE | MOVE_EFFECT_AFFECTS_USER @@ -1721,6 +1722,7 @@ BattleScript_EffectPlaceholder: printstring STRINGID_NOTDONEYET goto BattleScript_MoveEnd +BattleScript_EffectStompingTantrum: BattleScript_EffectEvasionDownHit: BattleScript_EffectVitalThrow: BattleScript_EffectFalseSwipe: diff --git a/include/battle.h b/include/battle.h index 96dab7efc7..fd747241d3 100644 --- a/include/battle.h +++ b/include/battle.h @@ -576,6 +576,7 @@ struct BattleStruct 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 }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index bd52d065e6..6d52672259 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -333,5 +333,6 @@ #define EFFECT_PARTING_SHOT 327 #define EFFECT_SPECTRAL_THIEF 328 #define EFFECT_V_CREATE 329 +#define EFFECT_STOMPING_TANTRUM 330 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 681838f76f..89949560df 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -162,26 +162,27 @@ #define ATK48_DONT_CHECK_LOWER 0x8 // atk49, moveend cases -#define ATK49_SPIKY_SHIELD 0 -#define ATK49_RAGE 1 -#define ATK49_DEFROST 2 -#define ATK49_SYNCHRONIZE_TARGET 3 -#define ATK49_MOVE_END_ABILITIES 4 -#define ATK49_STATUS_IMMUNITY_ABILITIES 5 -#define ATK49_SYNCHRONIZE_ATTACKER 6 -#define ATK49_CHOICE_MOVE 7 -#define ATK49_CHANGED_ITEMS 8 -#define ATK49_ATTACKER_INVISIBLE 9 -#define ATK49_ATTACKER_VISIBLE 10 -#define ATK49_TARGET_VISIBLE 11 -#define ATK49_ITEM_EFFECTS_ALL 12 -#define ATK49_KINGSROCK_SHELLBELL 13 -#define ATK49_SUBSTITUTE 14 -#define ATK49_UPDATE_LAST_MOVES 15 -#define ATK49_MIRROR_MOVE 16 -#define ATK49_NEXT_TARGET 17 -#define ATK49_CLEAR_BITS 18 -#define ATK49_COUNT 19 +#define ATK49_FAILED_MOVE_COUNTER 0 +#define ATK49_SPIKY_SHIELD 1 +#define ATK49_RAGE 2 +#define ATK49_DEFROST 3 +#define ATK49_SYNCHRONIZE_TARGET 4 +#define ATK49_MOVE_END_ABILITIES 5 +#define ATK49_STATUS_IMMUNITY_ABILITIES 6 +#define ATK49_SYNCHRONIZE_ATTACKER 7 +#define ATK49_CHOICE_MOVE 8 +#define ATK49_CHANGED_ITEMS 9 +#define ATK49_ATTACKER_INVISIBLE 10 +#define ATK49_ATTACKER_VISIBLE 11 +#define ATK49_TARGET_VISIBLE 12 +#define ATK49_ITEM_EFFECTS_ALL 13 +#define ATK49_KINGSROCK_SHELLBELL 14 +#define ATK49_SUBSTITUTE 15 +#define ATK49_UPDATE_LAST_MOVES 16 +#define ATK49_MIRROR_MOVE 17 +#define ATK49_NEXT_TARGET 18 +#define ATK49_CLEAR_BITS 19 +#define ATK49_COUNT 20 #define BIT_HP 0x1 #define BIT_ATK 0x2 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 5060c2eae5..d416a24d69 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4198,6 +4198,13 @@ static void atk49_moveend(void) { switch (gBattleScripting.atk49_state) { + case ATK49_FAILED_MOVE_COUNTER: + if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + gBattleStruct->lastMoveFailed |= gBitTable[gBattlerAttacker]; + else + gBattleStruct->lastMoveFailed &= ~(gBitTable[gBattlerAttacker]); + gBattleScripting.atk49_state++; + break; case ATK49_SPIKY_SHIELD: if (gProtectStructs[gBattlerTarget].spikyShielded && gBattleMoves[gCurrentMove].flags & FLAG_MAKES_CONTACT diff --git a/src/battle_util.c b/src/battle_util.c index 9dd20fc61f..4607c17f87 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5149,6 +5149,10 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe 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: diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 63fbdc2f57..a322bd9023 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -9277,7 +9277,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_STOMPING_TANTRUM] = { - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_STOMPING_TANTRUM, .power = 75, .type = TYPE_GROUND, .accuracy = 100, From 88424b0ea3488b6d8c3d1f3a1cc825bd0cd33c86 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 1 Apr 2019 21:56:25 +0200 Subject: [PATCH 321/667] Support for custom multi battle choose mons --- .../scripts.inc | 20 +++++++++++++++---- src/battle_tower.c | 3 +++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc b/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc index 0fe68cb1ed..6992438415 100644 --- a/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc +++ b/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc @@ -47,18 +47,30 @@ EverGrandeCity_PokemonLeague_1F_Pokemart_229624: @ 8229624 EverGrandeCity_PokemonLeague_1F_EventScript_229636:: @ 8229636 special SavePlayerParty - - trainerbattle 10, TRAINER_WALLACE, 0, NULL, EverGrandeCity_PokemonLeague_1F_Text_2296E8 + + fadescreen 1 + special ChooseHalfPartyForBattle + waitstate + @ Check here to see if the player didn't choose Cancel. + + special ReducePlayerPartyToSelectedMons + setvar VAR_0x8004, 2 + setvar VAR_0x8005, 4 + special CallFrontierUtilFunc + + trainerbattle 10, 1, 0, NULL, EverGrandeCity_PokemonLeague_1F_Text_2296E8 trainerbattle 11, TRAINER_ALEXA, 0, NULL, EverGrandeCity_PokemonLeague_1F_Text_2297EF setvar VAR_0x8004, SPECIAL_BATTLE_MULTI - setvar VAR_0x8005, 0 + setvar VAR_0x8005, 2 | 0x80 setvar VAR_0x8006, TRAINER_EDWARDO setvar VAR_0x8007, TRAINER_BACK_PIC_LEAF special DoSpecialTrainerBattle - waitstate + setvar VAR_0x8004, 6 + special CallFrontierUtilFunc + special LoadPlayerParty lockall diff --git a/src/battle_tower.c b/src/battle_tower.c index 760bd3315b..26b361fe0c 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -2397,6 +2397,9 @@ void DoSpecialTrainerBattle(void) BattleTransition_StartOnField(GetWildBattleTransition()); else BattleTransition_StartOnField(GetTrainerBattleTransition()); + + if (gSpecialVar_0x8005 & 0x80) // Skip mons restoring(done in the script) + gBattleScripting.specialTrainerBattleType = 0xFF; break; } } From 737c49853b5267188fe16a1a2cc7d288830aa1aa Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 1 Apr 2019 23:08:21 +0200 Subject: [PATCH 322/667] Fix Flare Blitz --- data/battle_anim_scripts.s | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 228aa12b1f..e79d7c3f3f 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1259,31 +1259,29 @@ Move_FLARE_BLITZ: loadspritegfx ANIM_TAG_HANDS_AND_FEET loadspritegfx ANIM_TAG_SMALL_EMBER monbg ANIM_TARGET - delay 2 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 0, 16, RGB_BLACK - setalpha 12, 8 - monbg ANIM_DEF_PARTNER monbgprio_2A ANIM_TARGET + setalpha 12, 8 createsprite gBattleAnimSpriteTemplate_8595584, ANIM_ATTACKER, 3, 0, 0, 56, 0 playsewithpan SE_W172, SOUND_PAN_ATTACKER delay 2 + createsprite gBattleAnimSpriteTemplate_8595584, ANIM_ATTACKER, 3, 0, 0, 56, 2 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + delay 2 createsprite gBattleAnimSpriteTemplate_8595584, ANIM_ATTACKER, 3, 0, 0, 56, 4 playsewithpan SE_W172, SOUND_PAN_ATTACKER delay 2 + createsprite gBattleAnimSpriteTemplate_8595584, ANIM_ATTACKER, 3, 0, 0, 56, 6 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + delay 2 createsprite gBattleAnimSpriteTemplate_8595584, ANIM_ATTACKER, 3, 0, 0, 56, 8 playsewithpan SE_W172, SOUND_PAN_ATTACKER delay 2 + createsprite gBattleAnimSpriteTemplate_8595584, ANIM_ATTACKER, 3, 0, 0, 56, 10 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + delay 2 createsprite gBattleAnimSpriteTemplate_8595584, ANIM_ATTACKER, 3, 0, 0, 56, 12 playsewithpan SE_W172, SOUND_PAN_ATTACKER delay 2 - createsprite gBattleAnimSpriteTemplate_8595584, ANIM_ATTACKER, 3, 0, 0, 56, 16 - playsewithpan SE_W172, SOUND_PAN_ATTACKER - delay 2 - createsprite gBattleAnimSpriteTemplate_8595584, ANIM_ATTACKER, 3, 0, 0, 56, 20 - playsewithpan SE_W172, SOUND_PAN_ATTACKER - delay 2 - createsprite gBattleAnimSpriteTemplate_8595584, ANIM_ATTACKER, 3, 0, 0, 56, 24 - playsewithpan SE_W172, SOUND_PAN_ATTACKER waitforvisualfinish createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 4, 1, 4 waitforvisualfinish @@ -1325,6 +1323,7 @@ Move_FLARE_BLITZ: playsewithpan SE_W004, +63 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 9 + waitforvisualfinish clearmonbg ANIM_TARGET blendoff delay 2 @@ -1332,7 +1331,6 @@ Move_FLARE_BLITZ: waitbgfadein end - Move_FORCE_PALM: end @@ -1788,7 +1786,6 @@ Move_SHADOW_CLAW: end Move_THUNDER_FANG: - loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_LIGHTNING loadspritegfx ANIM_TAG_SHARP_TEETH From 22be08f7238ec240d09a991c524ed5992c08b743 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 1 Apr 2019 23:17:50 +0200 Subject: [PATCH 323/667] Revert Bubblebeam to hit only one target --- data/battle_anim_scripts.s | 13 ++++++------- src/data/battle_moves.h | 2 +- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index e79d7c3f3f..363dc1750b 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -4401,7 +4401,6 @@ Move_BUBBLE_BEAM: delay 1 call Bulbblebeam1 createvisualtask AnimTask_SwayMon, 5, 0, 3, 3072, 8, ANIM_TARGET - createvisualtask AnimTask_SwayMon, 5, 0, 3, 3072, 8, ANIM_DEF_PARTNER call Bulbblebeam1 call Bulbblebeam1 waitforvisualfinish @@ -12285,22 +12284,22 @@ PoisonBubblesEffect: return WaterBubbleEffect: - createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 10, 10, 1 + createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 10, 10, 0 playsewithpan SE_W145C, SOUND_PAN_TARGET delay 6 - createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 20, -20, 1 + createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 20, -20, 0 playsewithpan SE_W145C, SOUND_PAN_TARGET delay 6 - createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, -20, 15, 1 + createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, -20, 15, 0 playsewithpan SE_W145C, SOUND_PAN_TARGET delay 6 - createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1 + createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 0 playsewithpan SE_W145C, SOUND_PAN_TARGET delay 6 - createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, -20, -20, 1 + createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, -20, -20, 0 playsewithpan SE_W145C, SOUND_PAN_TARGET delay 6 - createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 16, -8, 1 + createsprite gWaterBubbleSpriteTemplate, ANIM_ATTACKER, 2, 16, -8, 0 playsewithpan SE_W145C, SOUND_PAN_TARGET return diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 63fbdc2f57..18d5bd61df 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -862,7 +862,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 100, .pp = 20, .secondaryEffectChance = 10, - .target = MOVE_TARGET_BOTH, + .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, .split = SPLIT_SPECIAL, From 743a42fec2689455b49cb3ee1bc5abd66bdd96cf Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 1 Apr 2019 23:39:30 +0200 Subject: [PATCH 324/667] Cross Poison animation --- data/battle_anim_scripts.s | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 363dc1750b..a080e66202 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -2000,6 +2000,19 @@ Move_ROCK_WRECKER: end Move_CROSS_POISON: + loadspritegfx ANIM_TAG_POISON_BUBBLE + loadspritegfx ANIM_TAG_CROSS_IMPACT + monbg ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_W013, SOUND_PAN_TARGET + createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, RGB_WHITE, 10, 0, 10 + createsprite gUnknown_085973D0, 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: From d39b5f6d262b63f12bec5e3985e322f2090bd8a7 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 2 Apr 2019 00:14:01 +0200 Subject: [PATCH 325/667] Fix messing with move result flags when not needed --- include/battle_util.h | 2 +- src/battle_ai_script_commands.c | 2 +- src/battle_script_commands.c | 4 ++-- src/battle_tv.c | 2 +- src/battle_util.c | 11 ++++++----- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index 0f940b51b5..f2671a6ad6 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -81,7 +81,7 @@ 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); +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); diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 5e5f16a040..a9c61fa434 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -794,7 +794,7 @@ s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 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); + dmg = CalculateMoveDamage(move, battlerAtk, battlerDef, moveType, 0, AI_GetIfCrit(move, battlerAtk, battlerDef), FALSE, FALSE); RestoreBattlerData(battlerAtk); RestoreBattlerData(battlerDef); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 5060c2eae5..6595bb8052 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1412,7 +1412,7 @@ static void atk05_damagecalc(void) u8 moveType; GET_MOVE_TYPE(gCurrentMove, moveType); - gBattleMoveDamage = CalculateMoveDamage(gCurrentMove, gBattlerAttacker, gBattlerTarget, moveType, 0, gIsCriticalHit, TRUE); + gBattleMoveDamage = CalculateMoveDamage(gCurrentMove, gBattlerAttacker, gBattlerTarget, moveType, 0, gIsCriticalHit, TRUE, TRUE); gBattlescriptCurrInstr++; } @@ -4449,7 +4449,7 @@ static void atk49_moveend(void) gHitMarker |= HITMARKER_NO_ATTACKSTRING; } - if (battlerId < gBattlersCount && gBattleMons[battlerId].hp != 0) + if (IsBattlerAlive(battlerId)) { gBattlerTarget = battlerId; gBattleScripting.atk49_state = 0; diff --git a/src/battle_tv.c b/src/battle_tv.c index 58a02d93de..7eb118dded 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -1429,7 +1429,7 @@ static void TrySetBattleSeminarShow(void) powerOverride = 0; if (ShouldCalculateDamage(gCurrentMove, &dmgByMove[i], &powerOverride)) { - gBattleMoveDamage = CalculateMoveDamage(gCurrentMove, gBattlerAttacker, gBattlerTarget, gBattleMoves[gCurrentMove].type, powerOverride, FALSE, FALSE); + gBattleMoveDamage = CalculateMoveDamage(gCurrentMove, gBattlerAttacker, gBattlerTarget, gBattleMoves[gCurrentMove].type, powerOverride, FALSE, FALSE, FALSE); dmgByMove[i] = gBattleMoveDamage; 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 9dd20fc61f..bf61684407 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2212,7 +2212,7 @@ u8 AtkCanceller_UnableToUseMove(void) { gBattleCommunication[MULTISTRING_CHOOSER] = 1; gBattlerTarget = gBattlerAttacker; - gBattleMoveDamage = CalculateMoveDamage(MOVE_NONE, gBattlerAttacker, gBattlerAttacker, TYPE_MYSTERY, 40, FALSE, FALSE); + gBattleMoveDamage = CalculateMoveDamage(MOVE_NONE, gBattlerAttacker, gBattlerAttacker, TYPE_MYSTERY, 40, FALSE, FALSE, TRUE); gProtectStructs[gBattlerAttacker].confusionSelfDmg = 1; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; } @@ -4536,7 +4536,7 @@ u8 IsMonDisobedient(void) calc -= obedienceLevel; if (calc < obedienceLevel) { - gBattleMoveDamage = CalculateMoveDamage(MOVE_NONE, gBattlerAttacker, gBattlerAttacker, TYPE_MYSTERY, 40, FALSE, FALSE); + gBattleMoveDamage = CalculateMoveDamage(MOVE_NONE, gBattlerAttacker, gBattlerAttacker, TYPE_MYSTERY, 40, FALSE, FALSE, TRUE); gBattlerTarget = gBattlerAttacker; gBattlescriptCurrInstr = BattleScript_IgnoresAndHitsItself; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; @@ -5569,12 +5569,12 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move return dmg; } -s32 CalculateMoveDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, s32 fixedBasePower, bool32 isCrit, bool32 randomFactor) +s32 CalculateMoveDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, s32 fixedBasePower, bool32 isCrit, bool32 randomFactor, bool32 updateFlags) { s32 dmg; u16 finalModifier, typeEffectivenessModifier; - typeEffectivenessModifier = CalcTypeEffectivenessMultiplier(move, moveType, battlerAtk, battlerDef, randomFactor); + 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)) @@ -5698,7 +5698,8 @@ u16 CalcTypeEffectivenessMultiplier(u16 move, u8 moveType, u8 battlerAtk, u8 bat modifier = CalcTypeEffectivenessMultiplierInternal(move, gBattleMoves[move].argument, battlerAtk, battlerDef, recordAbilities, modifier); } - UpdateMoveResultFlags(modifier); + if (recordAbilities) + UpdateMoveResultFlags(modifier); return modifier; } From 89f766b75bfc2a2b1228d4de52dd7a55ca1e0d7f Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 2 Apr 2019 00:17:15 +0200 Subject: [PATCH 326/667] Remove unneded variable --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index bf61684407..d5088b9f94 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5572,7 +5572,7 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move s32 CalculateMoveDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, s32 fixedBasePower, bool32 isCrit, bool32 randomFactor, bool32 updateFlags) { s32 dmg; - u16 finalModifier, typeEffectivenessModifier; + u16 typeEffectivenessModifier; typeEffectivenessModifier = CalcTypeEffectivenessMultiplier(move, moveType, battlerAtk, battlerDef, updateFlags); From 562ad709151bf103a3e9ebdab9535f960f78f852 Mon Sep 17 00:00:00 2001 From: Fontbane Date: Mon, 1 Apr 2019 23:07:21 -0400 Subject: [PATCH 327/667] Removed Gen 4 Ability field effects --- src/battle_script_commands.c | 12 +----------- src/wild_encounter.c | 6 ------ 2 files changed, 1 insertion(+), 17 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a3d724c0ae..4563e587ba 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10540,7 +10540,7 @@ static void atkE5_pickup(void) species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); level = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL); - lvlDivBy10 = (level - 1) / 10; + lvlDivBy10 = (level - 1) / 10; //Moving this here makes it easier to add in abilities like Honey Gather if (lvlDivBy10 > 9) lvlDivBy10 = 9; @@ -10572,16 +10572,6 @@ static void atkE5_pickup(void) } } } - else if (ability == ABILITY_HONEY_GATHER - && species != 0 - && species != SPECIES_EGG - && heldItem == ITEM_NONE - && (Random()%100 <= lvlDivBy10*5+5)) - { - u16 honey = ITEM_HONEY; - SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &honey); - break; - } } } diff --git a/src/wild_encounter.c b/src/wild_encounter.c index be97c73ac1..b860da13ec 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -487,12 +487,6 @@ static bool8 DoWildEncounterRateTest(u32 encounterRate, bool8 ignoreAbility) encounterRate *= 2; else if (ability == ABILITY_SAND_VEIL && gSaveBlock1Ptr->weather == 8) encounterRate /= 2; - else if (ability == ABILITY_SNOW_CLOAK && gSaveBlock1Ptr->weather == 4) - encounterRate /= 2; - else if (ability == ABILITY_QUICK_FEET && gSaveBlock1Ptr->weather == 8) - encounterRate /= 2; - else if (ability == ABILITY_NO_GUARD) - encounterRate = encounterRate * 150 / 100; } if (encounterRate > 2880) encounterRate = 2880; From 63b04d5d6f71516ccbb4add825f12c51e576e571 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 2 Apr 2019 07:33:19 +0200 Subject: [PATCH 328/667] Iron Head animatiion --- data/battle_anim_scripts.s | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index a080e66202..50ed6e3634 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -2019,6 +2019,23 @@ Move_GUNK_SHOT: end Move_IRON_HEAD: + loadspritegfx ANIM_TAG_GUST + loadspritegfx ANIM_TAG_IMPACT + loopsewithpan SE_W231, SOUND_PAN_ATTACKER, 28, 2 + createvisualtask sub_81144F8, 5, 0, 0, 0 + waitforvisualfinish + createsprite gUnknown_08592CD8, ANIM_ATTACKER, 2, 0 + playsewithpan SE_W029, SOUND_PAN_ATTACKER + waitforvisualfinish + delay 2 + createsprite gUnknown_08592CD8, 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 gUnknown_08592CD8, ANIM_ATTACKER, 2, 2 + createsprite gUnknown_085973E8, ANIM_TARGET, 3, 0, 0, 1, 1 + playsewithpan SE_W233B, SOUND_PAN_TARGET + waitforvisualfinish end Move_MAGNET_BOMB: From 7f07aae89b76f207b7e3029ba7b5519071dfa58b Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 2 Apr 2019 09:22:28 +0200 Subject: [PATCH 329/667] Power-up-Punch animation --- data/battle_anim_scripts.s | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 50ed6e3634..3a44b30e77 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -2022,7 +2022,7 @@ Move_IRON_HEAD: loadspritegfx ANIM_TAG_GUST loadspritegfx ANIM_TAG_IMPACT loopsewithpan SE_W231, SOUND_PAN_ATTACKER, 28, 2 - createvisualtask sub_81144F8, 5, 0, 0, 0 + createvisualtask sub_81144F8, 5, 1, 0, 0 waitforvisualfinish createsprite gUnknown_08592CD8, ANIM_ATTACKER, 2, 0 playsewithpan SE_W029, SOUND_PAN_ATTACKER @@ -2036,6 +2036,8 @@ Move_IRON_HEAD: createsprite gUnknown_085973E8, ANIM_TARGET, 3, 0, 0, 1, 1 playsewithpan SE_W233B, SOUND_PAN_TARGET waitforvisualfinish + createvisualtask sub_811489C, 5, 0, 1 + waitforvisualfinish end Move_MAGNET_BOMB: @@ -2627,6 +2629,20 @@ Move_INFESTATION: end 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_W118, SOUND_PAN_ATTACKER + waitforvisualfinish + playsewithpan SE_W003, 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: From 5c44f44ad23a335555fd0a6ae88038ead8f42e60 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 2 Apr 2019 12:26:24 +0200 Subject: [PATCH 330/667] Organize new battle anim gfx --- graphics/battle_anims/sprites/energy_ball.png | Bin 0 -> 357 bytes .../sprites/{290.png => purple_jab.png} | Bin ...{toxicspike_color.png => toxic_spikes.png} | Bin .../sprites/{289.png => white_streak.png} | Bin include/constants/battle_anim.h | 1 + include/graphics.h | 14 +++++++----- src/battle_anim.c | 16 ++++++++------ src/graphics.c | 20 +++++++++++------- 8 files changed, 32 insertions(+), 19 deletions(-) create mode 100644 graphics/battle_anims/sprites/energy_ball.png rename graphics/battle_anims/sprites/{290.png => purple_jab.png} (100%) mode change 100755 => 100644 rename graphics/battle_anims/sprites/{toxicspike_color.png => toxic_spikes.png} (100%) rename graphics/battle_anims/sprites/{289.png => white_streak.png} (100%) mode change 100755 => 100644 diff --git a/graphics/battle_anims/sprites/energy_ball.png b/graphics/battle_anims/sprites/energy_ball.png new file mode 100644 index 0000000000000000000000000000000000000000..b3b26d6068cb2e1330e916c14dee664a5f380178 GIT binary patch literal 357 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvg8-ip*CkWB8L}7{x)~U@Ffd$Y z;P}t*|NnoWBrcF6sk;#<_rcS}F+^ix?nK9;!wNjEt_yzOI>$K6;GTBP?rfuFzx`yZ znv4D`hbZ;E?pw@z`0?kT9xmrko1A@Jc7KcAoLOh@)jz4>);5&W>E`Z_zFR&sm}!5E z*ujWX{F9l_mwSGX^O|Ta{7&exxWTzUON9<=H-uhr`^v!4V7;<+^Vg{-nbxSetEW4k z>pXdEb;K7xqs&Vh4l&vSj^{2j9kX{RtYiD7yF#wabZtXl*qg~V(&vtZ^QN(XP&jCF zFKdIDQsz5mfvl3lTpc1;&Ub3dEvTEn%m2!}sxQ-*wkippeYj^!fQp&tTHk4EZokai h?k@PY_zr({@cwKMOZK|ziPE5O@pScbS?83{1OQysh_3(u literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/290.png b/graphics/battle_anims/sprites/purple_jab.png old mode 100755 new mode 100644 similarity index 100% rename from graphics/battle_anims/sprites/290.png rename to graphics/battle_anims/sprites/purple_jab.png diff --git a/graphics/battle_anims/sprites/toxicspike_color.png b/graphics/battle_anims/sprites/toxic_spikes.png similarity index 100% rename from graphics/battle_anims/sprites/toxicspike_color.png rename to graphics/battle_anims/sprites/toxic_spikes.png diff --git a/graphics/battle_anims/sprites/289.png b/graphics/battle_anims/sprites/white_streak.png old mode 100755 new mode 100644 similarity index 100% rename from graphics/battle_anims/sprites/289.png rename to graphics/battle_anims/sprites/white_streak.png diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index c1d6d6804c..a94cdd7d36 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -299,6 +299,7 @@ #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) // battlers #define ANIM_ATTACKER 0 diff --git a/include/graphics.h b/include/graphics.h index 5d3e59f7b0..1ba1f99632 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -4663,8 +4663,6 @@ extern const u32 gBattleAnimBackgroundTilemap_ScaryFaceOpponent[]; extern const u32 gBattleAnimBackgroundTilemap_ScaryFaceContest[]; extern const u32 gBattleAnimSpriteSheet_284[]; extern const u32 gBattleAnimSpriteSheet_285[]; -extern const u32 gBattleAnimSpriteSheet_289[]; -extern const u32 gBattleAnimSpriteSheet_290[]; extern const u32 gBattleAnimSpritePalette_000[]; extern const u32 gBattleAnimSpritePalette_001[]; @@ -4948,9 +4946,6 @@ extern const u32 gBattleAnimSpritePalette_285[]; extern const u32 gBattleAnimSpritePalette_286[]; extern const u32 gBattleAnimSpritePalette_287[]; extern const u32 gBattleAnimSpritePalette_288[]; -extern const u32 gBattleAnimSpritePalette_289[]; -extern const u32 gBattleAnimSpritePalette_290[]; -extern const u32 gBattleAnimSpritePalette_291[]; extern const u32 gBattleAnimBackgroundImage_00[]; extern const u32 gBattleAnimBackgroundImage_02[]; @@ -5200,4 +5195,13 @@ extern const u16 gPokenavConditionCancel_Pal[]; extern const u32 gUnknown_08DE34B8[]; extern const u16 gUnknown_08DE3398[]; +// 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[]; + #endif //GUARD_GRAPHICS_H diff --git a/src/battle_anim.c b/src/battle_anim.c index 0fdeba8ff4..7e6d189db0 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -1055,9 +1055,11 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteSheet_183, 0x0800, ANIM_TAG_SLASH_2}, {gBattleAnimSpriteSheet_056, 0x1000, ANIM_TAG_WHIP_HIT}, {gBattleAnimSpriteSheet_163, 0x0100, ANIM_TAG_BLUE_RING_2}, - {gBattleAnimSpriteSheet_289, 0x1000, ANIM_TAG_WHITE_STREAK}, - {gBattleAnimSpriteSheet_290, 0x800, ANIM_TAG_PURPLE_JAB}, - {gBattleAnimSpriteSheet_152, 0x0080, ANIM_TAG_TOXIC_SPIKES}, + // New + {gBattleAnimSpriteGfx_WhiteStreak, 0x0200, ANIM_TAG_WHITE_STREAK}, + {gBattleAnimSpriteGfx_PurpleJab, 0x0100, ANIM_TAG_PURPLE_JAB}, + {gBattleAnimSpriteSheet_152, 0x0080, ANIM_TAG_TOXIC_SPIKES}, + {gBattleAnimSpriteGfx_EnergyBall, 0x0200, ANIM_TAG_ENERGY_BALL}, }; @@ -1352,9 +1354,11 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePalette_286, ANIM_TAG_SLASH_2}, {gBattleAnimSpritePalette_287, ANIM_TAG_WHIP_HIT}, {gBattleAnimSpritePalette_288, ANIM_TAG_BLUE_RING_2}, - {gBattleAnimSpritePalette_289, ANIM_TAG_WHITE_STREAK}, - {gBattleAnimSpritePalette_290, ANIM_TAG_PURPLE_JAB}, - {gBattleAnimSpritePalette_291, ANIM_TAG_TOXIC_SPIKES}, + // New + {gBattleAnimSpritePal_WhiteStreak, ANIM_TAG_WHITE_STREAK}, + {gBattleAnimSpritePal_PurpleJab, ANIM_TAG_PURPLE_JAB}, + {gBattleAnimSpritePal_ToxicSpikes, ANIM_TAG_TOXIC_SPIKES}, + {gBattleAnimSpritePal_EnergyBall, ANIM_TAG_ENERGY_BALL}, }; const struct BattleAnimBackground gBattleAnimBackgroundTable[] = diff --git a/src/graphics.c b/src/graphics.c index 87039592a0..0373040866 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -20,6 +20,18 @@ 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"); + // Battle anims const u32 gBattleAnimSpriteSheet_146[] = INCBIN_U32("graphics/battle_anims/sprites/146.4bpp.lz"); const u32 gBattleAnimSpriteSheet_000[] = INCBIN_U32("graphics/battle_anims/sprites/000.4bpp.lz"); @@ -565,14 +577,6 @@ const u32 gBattleAnimSpritePalette_163[] = INCBIN_U32("graphics/battle_anims/spr const u32 gBattleAnimSpritePalette_288[] = INCBIN_U32("graphics/battle_anims/sprites/288.gbapal.lz"); -const u32 gBattleAnimSpriteSheet_289[] = INCBIN_U32("graphics/battle_anims/sprites/289.4bpp.lz"); -const u32 gBattleAnimSpritePalette_289[] = INCBIN_U32("graphics/battle_anims/sprites/289.gbapal.lz"); - -const u32 gBattleAnimSpriteSheet_290[] = INCBIN_U32("graphics/battle_anims/sprites/290.4bpp.lz"); -const u32 gBattleAnimSpritePalette_290[] = INCBIN_U32("graphics/battle_anims/sprites/290.gbapal.lz"); - -const u32 gBattleAnimSpritePalette_291[] = INCBIN_U32("graphics/battle_anims/sprites/toxicspike_color.gbapal.lz"); //reuse the spike image - const u32 gBattleAnimSpritePalette_164[] = INCBIN_U32("graphics/battle_anims/sprites/164.gbapal.lz"); const u32 gBattleAnimSpritePalette_165[] = INCBIN_U32("graphics/battle_anims/sprites/165.gbapal.lz"); From 79fec8a38d8f1e7543decc410461af6c7d981924 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 2 Apr 2019 13:05:20 +0200 Subject: [PATCH 331/667] Energy Ball animation --- data/battle_anim_scripts.s | 15 +++++++++++++++ src/ghost.c | 39 ++++++++++++++++++++++++-------------- 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 3a44b30e77..5bbd7aee7e 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1652,6 +1652,21 @@ Move_FOCUS_BLAST: 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 sub_8158C58, SE_W054, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 5, 5, 0, 5 + createsprite gEnergyBallSpriteTemplate, ANIM_TARGET, 2, 12, 4, 8 + waitforvisualfinish + playsewithpan SE_W028, 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: diff --git a/src/ghost.c b/src/ghost.c index 998be0caa5..cd02e32dbe 100644 --- a/src/ghost.c +++ b/src/ghost.c @@ -98,6 +98,17 @@ const struct SpriteTemplate gUnknown_08596D58 = .callback = InitAnimShadowBall, }; +const struct SpriteTemplate gEnergyBallSpriteTemplate = +{ + .tileTag = ANIM_TAG_ENERGY_BALL, + .paletteTag = ANIM_TAG_ENERGY_BALL, + .oam = &gUnknown_08524974, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gUnknown_08596D54, + .callback = InitAnimShadowBall, +}; + const union AnimCmd gUnknown_08596D70[] = { ANIMCMD_FRAME(0, 2), @@ -261,20 +272,20 @@ static void sub_81116E8(struct Sprite *sprite) AnimTranslateLinear(sprite); sprite->pos2.x += Sin(sprite->data[5], 10); sprite->pos2.y += Cos(sprite->data[5], 15); - + r2 = sprite->data[5]; sprite->data[5] = (sprite->data[5] + 5) & 0xFF; r0 = sprite->data[5]; - + if (r2 == 0 || r2 > 196) { if (r0 > 0) PlaySE(SE_W109); } - + if (sprite->data[6] == 0) { - sprite->invisible = TRUE; + sprite->invisible = TRUE; sprite->callback = DestroyAnimSpriteAndDisableBlend; } else @@ -283,18 +294,18 @@ static void sub_81116E8(struct Sprite *sprite) static void sub_8111764(struct Sprite *sprite) { - - s16 r0; + + s16 r0; if (sprite->data[6] > 0xFF) { if (++sprite->data[6] == 0x10d) sprite->data[6] = 0; return; } - + r0 = sprite->data[7]; sprite->data[7]++; - + if ((r0 & 0xFF) == 0) { sprite->data[7] &= 0xff00; @@ -392,8 +403,8 @@ static void sub_811196C(u8 taskId) } } -// Spins a sprite towards the target, pausing in the middle. -// Used in Shadow Ball. +// Spins a sprite towards the target, pausing in the middle. +// Used in Shadow Ball. // arg 0: duration step 1 (attacker -> center) // arg 1: duration step 2 (spin center) // arg 2: duration step 3 (center -> target) @@ -466,7 +477,7 @@ static void sub_8111B9C(struct Sprite *sprite) } static void sub_8111BB4(struct Sprite *sprite) { - + s8 r5 = FALSE; bool8 r6 = FALSE; if(sprite->animEnded) @@ -508,7 +519,7 @@ static void sub_8111BB4(struct Sprite *sprite) { void sub_8111C50(u8 taskId) { struct Task *task; - + task = &gTasks[taskId]; task->data[0] = CloneBattlerSpriteWithBlend(1); if (task->data[0] < 0) @@ -886,7 +897,7 @@ static void sub_81125E0(u8 taskId) } } } - + if (task->data[10]) task->data[10]--; else if (task->data[6]) @@ -1120,7 +1131,7 @@ static void sub_8112B78(struct Sprite *sprite) sprite->pos2.x = Sin(sprite->data[0], 12); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) sprite->pos2.x = -sprite->pos2.x; - + sprite->data[0] = (sprite->data[0] + 6) & 0xFF; sprite->data[1] += 0x100; sprite->pos2.y = -(sprite->data[1] >> 8); From 978781d6567b191c23ced48379a3a25cef4c8013 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 5 Apr 2019 13:38:13 +0200 Subject: [PATCH 332/667] Improve Tailwind animation --- data/battle_anim_scripts.s | 171 ++++++++++++++++--------------------- 1 file changed, 75 insertions(+), 96 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index af584a6725..c19bf9cad5 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -752,7 +752,7 @@ Move_MIRACLE_EYE: createvisualtask sub_8115A04, 2, 1, 1, 2, 0, 10, RGB_BLACK call MindReaderEffect waitforvisualfinish - call UnsetPsychicBackground + call UnsetPsychicBg clearmonbg ANIM_DEF_PARTNER end @@ -901,23 +901,36 @@ Move_PLUCK: Move_TAILWIND: loadspritegfx ANIM_TAG_FLYING_DIRT - playsewithpan SE_W201, 0 - createvisualtask AnimTask_LoadSandstormBackground, 5, FALSE - createvisualtask AnimTask_BlendBackground, 6, 6, RGB_WHITE - delay 16 + playsewithpan SE_W016, SOUND_PAN_ATTACKER + call SetHighSpeedBg + monbg ANIM_ATK_PARTNER + setalpha 12, 8 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 4, 4 + createvisualtask sub_81169C0, 2, 0, 4, 7, 10 + playsewithpan SE_W104, SOUND_PAN_ATTACKER createsprite gBattleAnimSpriteTemplate_8596BA0, ANIM_ATTACKER, 40, 10, 2304, 96, 0 - delay 10 + delay 12 + playsewithpan SE_W104, SOUND_PAN_ATTACKER createsprite gBattleAnimSpriteTemplate_8596BA0, ANIM_ATTACKER, 40, 90, 2048, 96, 0 - delay 10 + delay 12 + playsewithpan SE_W104, SOUND_PAN_ATTACKER createsprite gBattleAnimSpriteTemplate_8596BA0, ANIM_ATTACKER, 40, 50, 2560, 96, 0 - delay 10 + delay 12 + playsewithpan SE_W104, SOUND_PAN_ATTACKER createsprite gBattleAnimSpriteTemplate_8596BA0, ANIM_ATTACKER, 40, 20, 2304, 96, 0 - delay 10 + delay 12 + playsewithpan SE_W104, SOUND_PAN_ATTACKER createsprite gBattleAnimSpriteTemplate_8596BA0, ANIM_ATTACKER, 40, 70, 1984, 96, 0 - delay 10 + delay 12 createsprite gBattleAnimSpriteTemplate_8596BA0, ANIM_ATTACKER, 40, 0, 2816, 96, 0 delay 10 createsprite gBattleAnimSpriteTemplate_8596BA0, ANIM_ATTACKER, 40, 60, 2560, 96, 0 + waitforvisualfinish + stopsound + call UnsetHighSpeedBg + clearmonbg ANIM_ATK_PARTNER + blendoff + delay 1 end Move_ACUPRESSURE: @@ -968,8 +981,7 @@ Move_U_TURN: Move_CLOSE_COMBAT: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_HANDS_AND_FEET - fadetobg BG_HIGHSPEED_OPPONENT - delay 20 + call SetHighSpeedBg createsprite gUnknown_08595EB0, ANIM_TARGET, 3, 1, 10, 0 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 playsewithpan SE_W004, +63 @@ -994,10 +1006,7 @@ Move_CLOSE_COMBAT: createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 7, 1 playsewithpan SE_W025B, +63 delay 10 - restorebg - waitbgfadeout - setarg 7, -1 - waitbgfadein + call UnsetHighSpeedBg clearmonbg ANIM_TARGET blendoff delay 1 @@ -1340,11 +1349,7 @@ Move_AURA_SPHERE: monbg ANIM_ATK_PARTNER monbgprio_28 ANIM_ATTACKER setalpha 12, 8 - createvisualtask AnimTask_GetAttackerSide, 2 - fadetobg BG_HIGHSPEED_OPPONENT - waitbgfadeout - createvisualtask sub_8117660, 5, -2304, 0, 1, -1 - waitbgfadein + call SetHighSpeedBg playsewithpan SE_W327, 0 delay 60 createsprite gAuraSphereBlast, ANIM_TARGET, 3, 0 @@ -1353,10 +1358,7 @@ Move_AURA_SPHERE: createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 8, 0, 16, 1 playsewithpan SE_W025B, SOUND_PAN_TARGET waitforvisualfinish - restorebg - waitbgfadeout - setarg 7, -1 - waitbgfadein + call UnsetHighSpeedBg clearmonbg ANIM_ATK_PARTNER blendoff delay 1 @@ -1628,24 +1630,17 @@ Move_FOCUS_BLAST: loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT loadspritegfx ANIM_TAG_METEOR loadspritegfx ANIM_TAG_FLAT_ROCK - monbg ANIM_ATK_PARTNER - monbgprio_28 ANIM_ATTACKER + monbg ANIM_TARGET + monbgprio_28 ANIM_TARGET setalpha 12, 8 - createvisualtask AnimTask_GetAttackerSide, 2 - fadetobg BG_HIGHSPEED_OPPONENT - waitbgfadeout - createvisualtask sub_8117660, 5, -2304, 0, 1, -1 - waitbgfadein + call SetHighSpeedBg createsprite gUnknown_08595FEC, ANIM_TARGET, 2, 0 playsewithpan SE_W025, SOUND_PAN_ATTACKER waitforvisualfinish createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 8, 0, 16, 1 playsewithpan SE_W025B, SOUND_PAN_TARGET waitforvisualfinish - restorebg - waitbgfadeout - setarg 7, -1 - waitbgfadein + call UnsetHighSpeedBg clearmonbg ANIM_TARGET blendoff delay 1 @@ -4970,7 +4965,7 @@ Move_MEDITATE: delay 16 playsewithpan SE_W036, SOUND_PAN_ATTACKER waitforvisualfinish - call UnsetPsychicBackground + call UnsetPsychicBg end Move_AGILITY: @@ -5037,7 +5032,7 @@ Move_TELEPORT: createvisualtask sub_810F83C, 2 playsewithpan SE_W100, SOUND_PAN_ATTACKER delay 15 - call UnsetPsychicBackground + call UnsetPsychicBg waitforvisualfinish end @@ -5130,7 +5125,7 @@ Move_AMNESIA: delay 54 loopsewithpan SE_W118, SOUND_PAN_ATTACKER, 16, 3 waitforvisualfinish - call UnsetPsychicBackground + call UnsetPsychicBg end Move_KINESIS: @@ -5149,7 +5144,7 @@ Move_KINESIS: delay 70 playsewithpan SE_W207B, SOUND_PAN_ATTACKER waitforvisualfinish - call UnsetPsychicBackground + call UnsetPsychicBg end Move_GLARE: @@ -5387,18 +5382,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 sub_8117660, 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 sub_8117660, 5, -2304, 0, 1, -1 - waitbgfadein + call SetHighSpeedBg delay 0 setalpha 9, 8 createvisualtask sub_80A8BC4, 2, 28968, 10 @@ -5411,14 +5420,8 @@ MachPunchContinue: waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff - restorebg - waitbgfadeout - setarg 7, -1 - waitbgfadein + call UnsetHighSpeedBg end -MachPunchAgainstPlayer: - fadetobg BG_HIGHSPEED_PLAYER - goto MachPunchContinue Move_FORESIGHT: loadspritegfx ANIM_TAG_MAGNIFYING_GLASS @@ -5652,13 +5655,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 sub_8117660, 5, -2304, 0, 1, -1 - waitbgfadein + call SetHighSpeedBg createvisualtask sub_810577C, 2 loopsewithpan SE_W013B, SOUND_PAN_ATTACKER, 8, 3 waitforvisualfinish @@ -5683,19 +5680,13 @@ ExtremeSpeedContinue: createvisualtask sub_810599C, 2 loopsewithpan SE_W104, SOUND_PAN_ATTACKER, 8, 4 waitforvisualfinish - restorebg - waitbgfadeout - setarg 7, -1 - 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 @@ -6096,7 +6087,7 @@ Move_SKILL_SWAP: createvisualtask sub_810FBF0, 3, 0 createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_ATTACKER, RGB_WHITE, 12, 3, 1 waitforvisualfinish - call UnsetPsychicBackground + call UnsetPsychicBg end Move_IMPRISON: @@ -6113,7 +6104,7 @@ Move_IMPRISON: createvisualtask sub_81152DC, 5, 4, 1, 10 playsewithpan SE_W063, SOUND_PAN_ATTACKER clearmonbg ANIM_DEF_PARTNER - call UnsetPsychicBackground + call UnsetPsychicBg end Move_GRUDGE: @@ -6208,7 +6199,7 @@ Move_LUSTER_PURGE: waitforvisualfinish clearmonbg ANIM_ATTACKER blendoff - call UnsetPsychicBackground + call UnsetPsychicBg end Move_MIST_BALL: @@ -6603,7 +6594,7 @@ Move_EXTRASENSORY: waitforvisualfinish blendoff clearmonbg ANIM_DEF_PARTNER - call UnsetPsychicBackground + call UnsetPsychicBg end Move_AERIAL_ACE: @@ -6986,7 +6977,7 @@ Move_CONFUSION: clearmonbg ANIM_DEF_PARTNER blendoff delay 1 - call UnsetPsychicBackground + call UnsetPsychicBg end Move_PSYCHIC: @@ -7003,7 +6994,7 @@ Move_PSYCHIC: clearmonbg ANIM_DEF_PARTNER blendoff delay 1 - call UnsetPsychicBackground + call UnsetPsychicBg end Move_FUTURE_SIGHT: @@ -7011,7 +7002,7 @@ Move_FUTURE_SIGHT: FutureSightContinue: waitforvisualfinish delay 1 - call UnsetPsychicBackground + call UnsetPsychicBg end FutureSight: monbg ANIM_ATK_PARTNER @@ -7785,13 +7776,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 sub_8117660, 5, -2304, 0, 1, -1 - waitbgfadein + call SetHighSpeedBg waitforvisualfinish panse_1B SE_W059, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 call Blizzard1 @@ -7801,10 +7786,7 @@ BlizzardContinue: call FreezeEffect2 waitforvisualfinish delay 20 - restorebg - waitbgfadeout - setarg 7, -1 - waitbgfadein + call UnsetHighSpeedBg clearmonbg ANIM_DEF_PARTNER end Blizzard1: @@ -7830,9 +7812,6 @@ Blizzard1: createsprite gUnknown_08595BB0, 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 @@ -9288,7 +9267,7 @@ Move_DREAM_EATER: clearmonbg ANIM_DEF_PARTNER blendoff delay 1 - call UnsetPsychicBackground + call UnsetPsychicBg end DreamEaterEffect: playsewithpan SE_W207, SOUND_PAN_TARGET @@ -9406,7 +9385,7 @@ Move_PSYBEAM: call Psybeam1 waitforvisualfinish delay 1 - call UnsetPsychicBackground + call UnsetPsychicBg end Psybeam1: createsprite gUnknown_0859663C, ANIM_TARGET, 2, 16, 0, 0, 0, 13, 0 @@ -9422,7 +9401,7 @@ Move_HYPNOSIS: createvisualtask sub_8115A04, 2, 4, 2, 2, 0, 12, RGB(31, 18, 31) waitforvisualfinish delay 1 - call UnsetPsychicBackground + call UnsetPsychicBg end Hypnosis1: playsewithpan SE_W048, SOUND_PAN_ATTACKER @@ -9446,7 +9425,7 @@ Move_PSYWAVE: call Psywave1 waitforvisualfinish delay 1 - call UnsetPsychicBackground + call UnsetPsychicBg end Psywave1: createsprite gUnknown_08595170, ANIM_TARGET, 3, 10, 10, 0, 16 @@ -11809,7 +11788,7 @@ Move_PSYCHO_BOOST: waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff - call UnsetPsychicBackground + call UnsetPsychicBg end Move_KNOCK_OFF: @@ -12425,7 +12404,7 @@ SetPsychicBackground: waitbgfadein return -UnsetPsychicBackground: +UnsetPsychicBg: restorebg waitbgfadeout setarg 7, -1 @@ -12850,7 +12829,7 @@ General_FutureSightHit: blendoff waitforvisualfinish delay 1 - call UnsetPsychicBackground + call UnsetPsychicBg end General_DoomDesireHit: From c9cabe8d59dd1d1200f0e6531342625ee911da22 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 5 Apr 2019 14:04:38 +0200 Subject: [PATCH 333/667] Bug Buzz animation --- data/battle_anim_scripts.s | 72 +++++++++++++++++++++++++++----------- 1 file changed, 52 insertions(+), 20 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index c19bf9cad5..79fea6d6cd 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1591,6 +1591,30 @@ Move_XSCISSOR: end Move_BUG_BUZZ: + loadspritegfx ANIM_TAG_JAGGED_MUSIC_NOTE + loadspritegfx ANIM_TAG_THIN_RING + monbg ANIM_DEF_PARTNER + call SetBugBg + createvisualtask sub_8106D90, 2, 0 + createsprite gBattleAnimSpriteTemplate_8593898, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8 + playsewithpan SE_W253, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_8593BB8, ANIM_ATTACKER, 2, 0, 29, -12, 0 + createsprite gBattleAnimSpriteTemplate_8593BB8, ANIM_ATTACKER, 2, 0, -12, -29, 1 + delay 16 + createvisualtask sub_8106D90, 2, 0 + createsprite gBattleAnimSpriteTemplate_8593898, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8 + playsewithpan SE_W253, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_8593BB8, ANIM_ATTACKER, 2, 0, 12, -29, 1 + createsprite gBattleAnimSpriteTemplate_8593BB8, ANIM_ATTACKER, 2, 0, -29, -12, 0 + delay 16 + createvisualtask sub_8106D90, 2, 0 + createsprite gBattleAnimSpriteTemplate_8593898, ANIM_ATTACKER, 3, 0, 0, 0, 0, 31, 8 + playsewithpan SE_W253, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_8593BB8, ANIM_ATTACKER, 2, 0, 24, -24, 1 + createsprite gBattleAnimSpriteTemplate_8593BB8, ANIM_ATTACKER, 2, 0, -24, -24, 0 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + call UnsetBugBg end Move_DRAGON_PULSE: @@ -11394,6 +11418,32 @@ Move_ROCK_TOMB: createvisualtask sub_81162A4, 2, 2, 0, 10, 1 waitforvisualfinish end + +SetBugBg: + createvisualtask sub_8116664, 10, 1, 0, 0, 4, RGB_BLACK + createvisualtask AnimTask_GetAttackerSide, 2 + jumprettrue SetBugBgPlayer + fadetobg BG_BUG_OPPONENT + waitbgfadeout + createvisualtask sub_8117660, 5, 1536, 0, 0, -1 + goto SetBugBgFade +SetBugBgPlayer: + fadetobg BG_BUG_PLAYER + waitbgfadeout + createvisualtask sub_8117660, 5, -1536, 0, 0, -1 +SetBugBgFade: + delay 0 + createvisualtask sub_8116620, 10, 1, 0, 4, 4, RGB_BLACK + waitbgfadein + return + +UnsetBugBg: + restorebg + waitbgfadeout + createvisualtask sub_8116664, 10, 1, 0, 4, 0, RGB_BLACK + setarg 7, -1 + waitbgfadein + return Move_SILVER_WIND: loadspritegfx ANIM_TAG_SPARKLE_6 @@ -11403,16 +11453,7 @@ Move_SILVER_WIND: monbg ANIM_DEF_PARTNER monbgprio_29 delay 0 - createvisualtask sub_8116664, 10, 1, 0, 0, 4, RGB_BLACK - createvisualtask AnimTask_GetTargetSide, 2 - jumprettrue SilverWindOnPlayer - fadetobg BG_BUG_OPPONENT - waitbgfadeout - createvisualtask sub_8117660, 5, 1536, 0, 0, -1 -SilverWindContinue: - delay 0 - createvisualtask sub_8116620, 10, 1, 0, 4, 4, RGB_BLACK - waitbgfadein + call SetBugBg createsprite gUnknown_08592830, ANIM_TARGET, 66, -32, 16, 0, 6, 2, 3, 1 createsprite gUnknown_08592830, ANIM_TARGET, 66, -8, 18, 64, 3, 2, 2, 1 createsprite gUnknown_08592830, ANIM_ATTACKER, 120, -24, 18, 90, 5, 1, 2, 1 @@ -11440,17 +11481,8 @@ SilverWindContinue: playsewithpan SE_W016B, SOUND_PAN_TARGET clearmonbg ANIM_DEF_PARTNER delay 0 - restorebg - waitbgfadeout - createvisualtask sub_8116664, 10, 1, 0, 4, 0, RGB_BLACK - setarg 7, -1 - waitbgfadein + call UnsetBugBg end -SilverWindOnPlayer: - fadetobg BG_BUG_PLAYER - waitbgfadeout - createvisualtask sub_8117660, 5, -1536, 0, 0, -1 - goto SilverWindContinue Move_SNATCH: playsewithpan SE_W036, SOUND_PAN_ATTACKER From 05487c88202530f681b99f097a82c5976480465c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 5 Apr 2019 14:21:33 +0200 Subject: [PATCH 334/667] animation for power whip, it sucks i know --- data/battle_anim_scripts.s | 48 ++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 79fea6d6cd..d363ac1df0 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -2028,6 +2028,17 @@ Move_LEAF_STORM: end Move_POWER_WHIP: + loadspritegfx ANIM_TAG_WHIP_HIT + playsewithpan SE_W026, SOUND_PAN_ATTACKER + createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 10 + delay 6 + playsewithpan SE_W010, 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: @@ -3221,6 +3232,25 @@ Ember1: 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 @@ -3245,24 +3275,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 From 7bc3cdf527ae2982bfcd99819595e0d753c5cd74 Mon Sep 17 00:00:00 2001 From: Fontbane Date: Fri, 5 Apr 2019 10:16:41 -0400 Subject: [PATCH 335/667] Delete level variable --- src/battle_script_commands.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 4563e587ba..9b1a3617f3 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10503,7 +10503,6 @@ static void atkE5_pickup(void) s32 i; u16 species, heldItem; u8 ability; - u8 level; u8 lvlDivBy10; if (InBattlePike()) @@ -10539,8 +10538,7 @@ static void atkE5_pickup(void) { species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); - level = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL); - lvlDivBy10 = (level - 1) / 10; //Moving this here makes it easier to add in abilities like Honey Gather + 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; From e8dd8f93d13986c0d77eb57438186eebabaad90a Mon Sep 17 00:00:00 2001 From: Fontbane Date: Fri, 5 Apr 2019 10:33:19 -0400 Subject: [PATCH 336/667] Remove Honey functionality --- data/battle_ai_scripts.s | 1 - include/item_use.h | 1 - src/data/items.h | 2 +- src/item_use.c | 9 --------- 4 files changed, 1 insertion(+), 12 deletions(-) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 1018894058..1f072b734f 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -3628,7 +3628,6 @@ AI_HPAware_DiscouragedEffectsWhenTargetLowHP: @ 82DE2B1 .byte EFFECT_LIGHT_SCREEN .byte EFFECT_OHKO .byte EFFECT_SUPER_FANG - .byte EFFECT_SUPER_FANG //Why is this here twice? .byte EFFECT_MIST .byte EFFECT_FOCUS_ENERGY .byte EFFECT_CONFUSE diff --git a/include/item_use.h b/include/item_use.h index 31221aa099..37343f6e7a 100644 --- a/include/item_use.h +++ b/include/item_use.h @@ -51,6 +51,5 @@ void ItemUseInBattle_EnigmaBerry(u8); void ItemUseOutOfBattle_CannotUse(u8); u8 CheckIfItemIsTMHMOrEvolutionStone(u16 itemId); void sub_80FDD10(u8); -void ItemUseOutOfBattle_Honey(u8); #endif // GUARD_ITEM_USE_H diff --git a/src/data/items.h b/src/data/items.h index ee47c7f89d..9ee44dcdcd 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -9148,7 +9148,7 @@ const struct Item gItems[] = .unk19 = 0, .pocket = POCKET_ITEMS, .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_Honey, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = 0, .battleUseFunc = NULL, .secondaryId = 0, diff --git a/src/item_use.c b/src/item_use.c index a20aecc648..5cfd9b435a 100755 --- a/src/item_use.c +++ b/src/item_use.c @@ -1120,12 +1120,3 @@ void ItemUseOutOfBattle_CannotUse(u8 taskId) DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[3]); } -void ItemUseOutOfBattle_Honey(u8 taskId) -{ - //As a placeholder, just acts like White Flute - FlagSet(FLAG_SYS_ENC_UP_ITEM); - FlagClear(FLAG_SYS_ENC_DOWN_ITEM); - StringExpandPlaceholders(gStringVar4, gText_UsedVar2WildLured); - gTasks[taskId].data[8] = 0; - gTasks[taskId].func = sub_80FE1D0; -} From 9ee2e1c99acd910c60096723c4a3b9b5be3934fe Mon Sep 17 00:00:00 2001 From: Fontbane Date: Fri, 5 Apr 2019 12:03:09 -0400 Subject: [PATCH 337/667] Fix honey tab --- src/data/items.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/items.h b/src/data/items.h index 9ee44dcdcd..5738f7fba6 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -9136,7 +9136,7 @@ const struct Item gItems[] = .battleUseFunc = NULL, .secondaryId = 0, }, - [ITEM_HONEY] = + [ITEM_HONEY] = { .name = _("Honey"), .itemId = ITEM_HONEY, From 4c8bc9d526ed14a3f122463c4e43d3d9f13a8672 Mon Sep 17 00:00:00 2001 From: Papa Cancer Date: Wed, 3 Apr 2019 20:33:37 +0100 Subject: [PATCH 338/667] Three pointless moves MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Celebrate, Hold Hands and Happy Hour. Yay(!) Update: turns out Pay Day works differently to how I thought, so I added a new move effect for Happy Hour doubling prize money. Made all three effects subset of EFFECT_SPLASH, now called EFFECT_DUMB, as per Egg's instructions ( ͡° ͜ʖ ͡°) --- data/battle_scripts_1.s | 23 ++++++++++++++++++++--- include/constants/battle.h | 1 + include/constants/battle_move_effects.h | 2 +- include/constants/battle_string_ids.h | 1 + src/battle_message.c | 2 ++ src/battle_script_commands.c | 12 ++++++++++++ src/battle_util.c | 2 +- src/data/battle_moves.h | 10 +++++----- 8 files changed, 43 insertions(+), 10 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 764ff256c1..3da8995d4b 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -100,7 +100,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 @@ -345,7 +345,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectPartingShot .4byte BattleScript_EffectSpectralThief .4byte BattleScript_EffectVCreate - + BattleScript_EffectVCreate: setmoveeffect MOVE_EFFECT_V_CREATE | MOVE_EFFECT_AFFECTS_USER goto BattleScript_EffectHit @@ -2835,16 +2835,33 @@ 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 + jumpifnotbattletype BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_DOUBLE, 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 diff --git a/include/constants/battle.h b/include/constants/battle.h index c42188596e..3b513ba061 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -326,6 +326,7 @@ #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_AFFECTS_USER 0x4000 #define MOVE_EFFECT_CERTAIN 0x8000 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index bd52d065e6..62b2a7ff8c 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -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 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 684f2b1113..5114102f7c 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -527,6 +527,7 @@ #define STRINGID_FLOWERVEILPROTECTED 523 #define STRINGID_SWEETVEILPROTECTED 524 #define STRINGID_AROMAVEILPROTECTED 525 +#define STRINGID_CELEBRATEMESSAGE 526 #define BATTLESTRINGS_COUNT 529 diff --git a/src/battle_message.c b/src/battle_message.c index a344eebff2..77a2829aa9 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -653,9 +653,11 @@ static const u8 sText_SafetyGooglesProtected[] = _("{B_DEF_NAME_WITH_PREFIX} is 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}!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_CELEBRATEMESSAGE - 12] = sText_CelebrateMessage, [STRINGID_AROMAVEILPROTECTED - 12] = sText_AromaVeilProtected, [STRINGID_SWEETVEILPROTECTED - 12] = sText_SweetVeilProtected, [STRINGID_FLOWERVEILPROTECTED - 12] = sText_FlowerVeilProtected, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 6595bb8052..3e71638fcf 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2006,6 +2006,11 @@ void SetMoveEffect(bool32 primary, u32 certain) affectsUser = MOVE_EFFECT_AFFECTS_USER; gBattleScripting.battler = gBattlerTarget; // theoretically the attacker } + + // Just in case this flag is still set + if (gBattleScripting.moveEffect & MOVE_EFFECT_CERTAIN) + gBattleScripting.moveEffect &= ~(MOVE_EFFECT_CERTAIN); + else { gEffectBattler = gBattlerTarget; @@ -2364,6 +2369,13 @@ void SetMoveEffect(bool32 primary, u32 certain) BattleScriptPush(gBattlescriptCurrInstr + 1); 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) { diff --git a/src/battle_util.c b/src/battle_util.c index d5088b9f94..0d57cb3428 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3700,7 +3700,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) { case HOLD_EFFECT_DOUBLE_PRIZE: if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) - gBattleStruct->moneyMultiplier = 2; + gBattleStruct->moneyMultiplier *= 2; break; case HOLD_EFFECT_RESTORE_STATS: for (i = 0; i < NUM_BATTLE_STATS; i++) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 18d5bd61df..3d6c81990f 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -2103,7 +2103,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_SPLASH] = { - .effect = EFFECT_SPLASH, + .effect = EFFECT_DO_NOTHING, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -8463,7 +8463,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_HAPPY_HOUR] = { - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_DO_NOTHING, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -8505,7 +8505,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_CELEBRATE] = { - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_DO_NOTHING, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, @@ -8519,13 +8519,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_HOLD_HANDS] = { - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_DO_NOTHING, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 40, .secondaryEffectChance = 0, - .target = MOVE_TARGET_USER, + .target = MOVE_TARGET_ALLY, .priority = 0, .flags = 0, .split = SPLIT_STATUS, From 2743b069dafc33725a6d886c37978b7532bcd41a Mon Sep 17 00:00:00 2001 From: Fontbane Date: Fri, 5 Apr 2019 14:16:39 -0400 Subject: [PATCH 339/667] Decap Ability Names Also fixed names that are too long --- src/data/text/abilities.h | 498 +++++++++++++++++++------------------- 1 file changed, 249 insertions(+), 249 deletions(-) diff --git a/src/data/text/abilities.h b/src/data/text/abilities.h index 91424c2c79..d3b5ce6ed9 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,29 +50,29 @@ 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."); @@ -224,239 +224,239 @@ static const u8 sFullMetalBodyDescription[] = _("Prevents stat reduction."); 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_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] = _("STANCE CHANG"), - [ABILITY_GALE_WINGS] = _("GALE WINGS"), - [ABILITY_MEGA_LAUNCHER] = _("MEGA LAUNCHE"), - [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] = _("PARENTAL BON"), - [ABILITY_DARK_AURA] = _("DARK AURA"), - [ABILITY_FAIRY_AURA] = _("FAIRY AURA"), - [ABILITY_AURA_BREAK] = _("AURA BREAK"), - [ABILITY_PRIMORDIAL_SEA] = _("PRIMORDIAL S"), - [ABILITY_DESOLATE_LAND] = _("DESOLATE LAN"), - [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] = _("QUEENLY MAJE"), - [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] = _("TANGLING HAI"), - [ABILITY_RECEIVER] = _("RECEIVER"), - [ABILITY_POWER_OF_ALCHEMY] = _("POWER OF ALC"), - [ABILITY_BEAST_BOOST] = _("BEAST BOOST"), - [ABILITY_RKS_SYSTEM] = _("RKS SYSTEM"), - [ABILITY_ELECTRIC_SURGE] = _("ELECTRIC SUR"), - [ABILITY_PSYCHIC_SURGE] = _("PSYCHIC SUR"), - [ABILITY_MISTY_SURGE] = _("MISTY SURGE"), - [ABILITY_GRASSY_SURGE] = _("GRASSY SURGE"), - [ABILITY_FULL_METAL_BODY] = _("FULL METAL B"), - [ABILITY_SHADOW_SHIELD] = _("SHADOW SHIEL"), - [ABILITY_PRISM_ARMOR] = _("PRISM ARMOR"), + [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] = _("Queenly Majesty"), + [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"), }; const u8 *const gAbilityDescriptionPointers[ABILITIES_COUNT_GEN7] = From af2f5031784b7f07434841cac189f20375281242 Mon Sep 17 00:00:00 2001 From: Fontbane Date: Fri, 5 Apr 2019 17:24:36 -0400 Subject: [PATCH 340/667] Fix gitignore --- .gitignore | 2 -- 1 file changed, 2 deletions(-) diff --git a/.gitignore b/.gitignore index 4d8c4ba7bf..dc782899dd 100644 --- a/.gitignore +++ b/.gitignore @@ -27,5 +27,3 @@ Thumbs.db build/ .DS_Store *.ddump -*.bin -*.ipch From a83255d1031c82978ad3b76a7602639c6c078126 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 6 Apr 2019 00:03:03 +0200 Subject: [PATCH 341/667] fix after prs --- data/battle_ai_scripts.s | 3 ++- src/battle_script_commands.c | 7 ++----- src/data/text/abilities.h | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 1f072b734f..b389d5771a 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -249,6 +249,7 @@ AI_CheckBadMove_CheckEffect: @ 82DC045 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 end AI_CBM_Belch: @@ -2078,7 +2079,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 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index bef6e29a3d..ec7eb717a9 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2006,16 +2006,13 @@ void SetMoveEffect(bool32 primary, u32 certain) affectsUser = MOVE_EFFECT_AFFECTS_USER; gBattleScripting.battler = gBattlerTarget; // theoretically the attacker } - - // Just in case this flag is still set - if (gBattleScripting.moveEffect & MOVE_EFFECT_CERTAIN) - gBattleScripting.moveEffect &= ~(MOVE_EFFECT_CERTAIN); - else { gEffectBattler = gBattlerTarget; gBattleScripting.battler = gBattlerAttacker; } + // Just in case this flag is still set + gBattleScripting.moveEffect &= ~(MOVE_EFFECT_CERTAIN); if (GetBattlerAbility(gEffectBattler) == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && !primary && gBattleScripting.moveEffect <= 9) diff --git a/src/data/text/abilities.h b/src/data/text/abilities.h index d3b5ce6ed9..dc8b000f17 100644 --- a/src/data/text/abilities.h +++ b/src/data/text/abilities.h @@ -438,7 +438,7 @@ const u8 gAbilityNames[ABILITIES_COUNT_GEN7][ABILITY_NAME_LENGTH + 1] = [ABILITY_POWER_CONSTRUCT] = _("Power Constr"), [ABILITY_CORROSION] = _("Corrosion"), [ABILITY_COMATOSE] = _("Comatose"), - [ABILITY_QUEENLY_MAJESTY] = _("Queenly Majesty"), + [ABILITY_QUEENLY_MAJESTY] = _("QueenMajesty"), [ABILITY_INNARDS_OUT] = _("Innards Out"), [ABILITY_DANCER] = _("Dancer"), [ABILITY_BATTERY] = _("Battery"), From 255ac6b54d83e836194e7534facb8904471cd0f6 Mon Sep 17 00:00:00 2001 From: Papa Cancer Date: Fri, 5 Apr 2019 23:42:00 +0100 Subject: [PATCH 342/667] Leaf Storm animation All credit to Doesnt, just stole it from his pokeruby build --- data/battle_anim_scripts.s | 110 +++++++++++++++++++++++++++++++++++++ include/battle_anim.h | 7 +++ src/ghost.c | 22 ++++++++ 3 files changed, 139 insertions(+) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index d363ac1df0..e7085f3880 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -2025,6 +2025,116 @@ Move_LAVA_PLUME: 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_W026, 192 + 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_W026, 192 + 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_W026, 192 + 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_W026, 192 + 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_W026, 192 + 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_W026, 192 + 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_W026, 192 + 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_W026, 192 + 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_W026, 192 + 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_W026, 192 + 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_W026, 192 + 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_W026, 192 + 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_W026, 192 + 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_W026, 192 + 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_W026, 192 + 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_W026, 192 + 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_W026, 192 + 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_W026, 192 + 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_W026, 192 + 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_W013, 63 + 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 + clearmonbg ANIM_DEF_PARTNER + 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: diff --git a/include/battle_anim.h b/include/battle_anim.h index 9331b9d70d..51d3df794a 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -223,12 +223,19 @@ void sub_8117854(u8 taskId, int unused, u16 arg2, u8 battler1, u8 arg4, u8 arg5, // battle_anim_effects_1.c void sub_810310C(u8 battler, struct Sprite* sprite); void AnimMoveTwisterParticle(struct Sprite* sprite); +extern const union AnimCmd *const gUnknown_08592388[]; +void sub_8100898(struct Sprite *); // water.c void sub_8108C94(struct Sprite *sprite); // flying.c void sub_810E2C8(struct Sprite *sprite); +extern const union AnimCmd *const gUnknown_085962D0[]; +void sub_810E044(struct Sprite *sprite); + +//poison.c +extern const union AffineAnimCmd *const gUnknown_085961A0[]; // smokescreen.c u8 sub_807521C(s16 x, s16 y, u8 a3); diff --git a/src/ghost.c b/src/ghost.c index 491251e26e..26fb9affeb 100644 --- a/src/ghost.c +++ b/src/ghost.c @@ -109,6 +109,28 @@ const struct SpriteTemplate gEnergyBallSpriteTemplate = .callback = InitAnimShadowBall, }; +const struct SpriteTemplate gBattleAnimSpriteTemplate_LeafStorm = +{ + .tileTag = ANIM_TAG_RAZOR_LEAF, + .paletteTag = ANIM_TAG_RAZOR_LEAF, + .oam = &gUnknown_08524934, + .anims = gUnknown_085962D0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_810E044, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_LeafStorm2 = +{ + .tileTag = ANIM_TAG_LEAF, + .paletteTag = ANIM_TAG_LEAF, + .oam = &gUnknown_085249CC, + .anims = gUnknown_08592388, + .images = NULL, + .affineAnims = gUnknown_085961A0, + .callback = sub_8100898, +}; + const union AnimCmd gUnknown_08596D70[] = { ANIMCMD_FRAME(0, 2), From fd6dc98045deb763f284759ce6da2242c2aa7ff4 Mon Sep 17 00:00:00 2001 From: Papa Cancer Date: Sat, 6 Apr 2019 22:23:34 +0100 Subject: [PATCH 343/667] Hold Hands fix Better check for valid ally. If there isn't one, the target defaults to the attacker, causing the move to fail. --- data/battle_scripts_1.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 8613582b06..15d5f09faa 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2851,7 +2851,7 @@ BattleScript_EffectDoNothing:: goto BattleScript_MoveEnd BattleScript_EffectHoldHands: jumpifsideaffecting BS_TARGET, SIDE_STATUS_CRAFTY_SHIELD, BattleScript_ButItFailed - jumpifnotbattletype BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_DOUBLE, BattleScript_ButItFailed + jumpifbyteequal gBattlerTarget, gBattlerAttacker, BattleScript_ButItFailed attackanimation waitanimation goto BattleScript_MoveEnd From fc8e59403a71889b30f70d95197d4adbb97a5cfc Mon Sep 17 00:00:00 2001 From: Papa Cancer Date: Sun, 7 Apr 2019 13:03:40 +0100 Subject: [PATCH 344/667] Ability-ignoring moves Just Moongeist Meme and Sunsteel Strike for now. Added a special flag and modified "GetBattlerAbility" to check the current move for it. --- include/constants/pokemon.h | 1 + src/battle_util.c | 13 +++++++------ src/data/battle_moves.h | 8 ++++---- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index d98dd351e1..1f935dbd94 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -104,6 +104,7 @@ #define FLAG_BALLISTIC 0x20000 #define FLAG_PROTECTION_MOVE 0x40000 #define FLAG_POWDER 0x80000 +#define FLAG_TARGET_ABILITY_IGNORED 0x100000 // Split defines. #define SPLIT_PHYSICAL 0x0 diff --git a/src/battle_util.c b/src/battle_util.c index d7528b12d6..62c3f5e610 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3577,14 +3577,15 @@ u32 GetBattlerAbility(u8 battlerId) { if (gStatuses3[battlerId] & STATUS3_GASTRO_ACID) return ABILITY_NONE; - else if ((gBattleMons[gBattlerAttacker].ability == ABILITY_MOLD_BREAKER + else if ((((gBattleMons[gBattlerAttacker].ability == ABILITY_MOLD_BREAKER || gBattleMons[gBattlerAttacker].ability == ABILITY_TERAVOLT || gBattleMons[gBattlerAttacker].ability == ABILITY_TURBOBLAZE) - && sAbilitiesAffectedByMoldBreaker[gBattleMons[battlerId].ability] - && gBattlerByTurnOrder[gCurrentTurnActionNumber] == gBattlerAttacker - && gActionsByTurnOrder[gBattlerByTurnOrder[gBattlerAttacker]] == B_ACTION_USE_MOVE - && gCurrentTurnActionNumber < gBattlersCount - && !(gStatuses3[gBattlerAttacker] & STATUS3_GASTRO_ACID)) + && !(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; diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index ccf284042f..c45336d0ea 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -9362,7 +9362,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_SUNSTEEL_STRIKE] = { - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_HIT, .power = 100, .type = TYPE_STEEL, .accuracy = 100, @@ -9370,13 +9370,13 @@ 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_TARGET_ABILITY_IGNORED, .split = SPLIT_PHYSICAL, }, [MOVE_MOONGEIST_BEAM] = { - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_HIT, .power = 100, .type = TYPE_GHOST, .accuracy = 100, @@ -9384,7 +9384,7 @@ 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_TARGET_ABILITY_IGNORED, .split = SPLIT_SPECIAL, }, From 1c73e61a2beb8d7d8f27a7a52a3d1d96cb5d4707 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 8 Apr 2019 16:48:04 +0200 Subject: [PATCH 345/667] Parabolic Charge anim --- data/battle_anim_scripts.s | 97 +++++++++++++++++++++++++++++--------- include/battle_anim.h | 1 + src/battle_anim.c | 12 +++++ src/electric.c | 10 ++-- 4 files changed, 93 insertions(+), 27 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 5ee343298f..e38c17cab8 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -2035,80 +2035,80 @@ Move_LEAF_STORM: waitforvisualfinish monbgprio_28 ANIM_TARGET setalpha 12, 8 - playsewithpan SE_W026, 192 + playsewithpan SE_W026, 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_W026, 192 + playsewithpan SE_W026, 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_W026, 192 + playsewithpan SE_W026, 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_W026, 192 + playsewithpan SE_W026, 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_W026, 192 + playsewithpan SE_W026, 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_W026, 192 + playsewithpan SE_W026, 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_W026, 192 + playsewithpan SE_W026, 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_W026, 192 + playsewithpan SE_W026, 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_W026, 192 + playsewithpan SE_W026, 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_W026, 192 + playsewithpan SE_W026, 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_W026, 192 + playsewithpan SE_W026, 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_W026, 192 + playsewithpan SE_W026, 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_W026, 192 + playsewithpan SE_W026, 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_W026, 192 + playsewithpan SE_W026, 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_W026, 192 + playsewithpan SE_W026, 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_W026, 192 + playsewithpan SE_W026, 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_W026, 192 + playsewithpan SE_W026, 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_W026, 192 + playsewithpan SE_W026, 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_W026, 192 + playsewithpan SE_W026, 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 @@ -2120,7 +2120,7 @@ Move_LEAF_STORM: 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_W013, 63 + playsewithpan SE_W013, 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 @@ -2129,7 +2129,6 @@ Move_LEAF_STORM: createsprite gBattleAnimSpriteTemplate_LeafStorm2, ANIM_TARGET, 2, 1, 1, -12, 24, 10 createsprite gBattleAnimSpriteTemplate_LeafStorm2, ANIM_TARGET, 2, 1, 1, -12, -24, 10 waitforvisualfinish - clearmonbg ANIM_DEF_PARTNER blendoff delay 0 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 12, 0, RGB(13, 31, 12) @@ -2643,7 +2642,59 @@ 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 sub_810AAFC, 2, ANIM_ATTACKER, 3, 20, 20 + playsewithpan SE_W129, SOUND_PAN_ATTACKER + delay 12 + createsprite gUnknown_08595A18, ANIM_ATTACKER, 2 + delay 30 + jumpifdoublebattle ParabolicChargeDouble + createvisualtask sub_810B29C, 5, ANIM_TARGET + delay 12 + waitforvisualfinish + createvisualtask sub_810B55C, 5, ANIM_TARGET + playsewithpan SE_W070, SOUND_PAN_TARGET + waitforvisualfinish + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 6, 18, 1 + createvisualtask sub_8116620, 5, 4, 0, 16, 16, RGB_BLACK + delay 4 + createvisualtask sub_8116620, 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 sub_810B29C, 5, ANIM_TARGET + createvisualtask sub_810B29C, 5, ANIM_DEF_PARTNER + createvisualtask sub_810B29C, 5, ANIM_ATK_PARTNER + delay 12 + waitforvisualfinish + createvisualtask sub_810B55C, 5, ANIM_TARGET + createvisualtask sub_810B55C, 5, ANIM_DEF_PARTNER + createvisualtask sub_810B55C, 5, ANIM_ATK_PARTNER + playsewithpan SE_W070, 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 sub_8116620, 5, 4 | 8 | 0x10, 0, 16, 16, RGB_BLACK + delay 4 + createvisualtask sub_8116620, 5, 4 | 8 | 0x10, 0, 0, 0, RGB_BLACK + goto ParabolicChargeHeal; Move_FORESTS_CURSE: end @@ -6956,10 +7007,10 @@ Move_SHOCK_WAVE: delay 12 createsprite gUnknown_08595A18, ANIM_ATTACKER, 2 delay 30 - createvisualtask sub_810B29C, 5 + createvisualtask sub_810B29C, 5, ANIM_TARGET delay 12 waitforvisualfinish - createvisualtask sub_810B55C, 5 + createvisualtask sub_810B55C, 5, ANIM_TARGET playsewithpan SE_W161B, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 6, 18, 1 diff --git a/include/battle_anim.h b/include/battle_anim.h index 51d3df794a..f7c5b6a886 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -57,6 +57,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); diff --git a/src/battle_anim.c b/src/battle_anim.c index 96413e4998..a75891cc11 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -2269,6 +2269,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/electric.c b/src/electric.c index 5440c1ebf8..f19816a3f6 100644 --- a/src/electric.c +++ b/src/electric.c @@ -1137,6 +1137,7 @@ static void sub_810B23C(struct Sprite *sprite) void sub_810B29C(u8 taskId) { struct Task *task = &gTasks[taskId]; + u8 target = GetAnimBattlerId(gBattleAnimArgs[0]); switch (task->data[0]) { @@ -1144,7 +1145,7 @@ void sub_810B29C(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; @@ -1261,19 +1262,20 @@ static void sub_810B51C(struct Sprite *sprite) void sub_810B55C(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: From 91aafa2ebc7917e0e9c50eb804cef17abc844e77 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 9 Apr 2019 12:49:50 +0200 Subject: [PATCH 346/667] Heal Block anim with volume change task --- asm/macros/battle_anim_script.inc | 6 +-- data/battle_anim_scripts.s | 21 +++++++++++ src/battle_anim_sound_tasks.c | 62 +++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+), 3 deletions(-) diff --git a/asm/macros/battle_anim_script.inc b/asm/macros/battle_anim_script.inc index d3d8f01a75..994e84ccd6 100644 --- a/asm/macros/battle_anim_script.inc +++ b/asm/macros/battle_anim_script.inc @@ -144,7 +144,7 @@ .byte \pan .endm - .macro panse_1B se:req, param1:req, param2:req, param3:req, param4 + .macro panse_1B se:req, param1:req, param2:req, param3:req, param4:req .byte 0x1b .2byte \se .byte \param1 @@ -215,7 +215,7 @@ .byte \param2 .endm - .macro panse_26 se:req, param1:req, param2:req, param3:req, param4 + .macro panse_26 se:req, param1:req, param2:req, param3:req, param4:req .byte 0x26 .2byte \se .byte \param1 @@ -224,7 +224,7 @@ .byte \param4 .endm - .macro panse_27 se:req, param1:req, param2:req, param3:req, param4 + .macro panse_27 se:req, param1:req, param2:req, param3:req, param4:req .byte 0x27 .2byte \se .byte \param1 diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index e38c17cab8..6cbee2044d 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1132,6 +1132,27 @@ Move_TRUMP_CARD: end Move_HEAL_BLOCK: + loadspritegfx ANIM_TAG_BLUE_STAR + monbg ANIM_TARGET + createsoundtask AnimTask_PlaySeChangingVolume, SE_W071B, SOUND_PAN_TARGET, 256, -16, 0, 2 + createsprite gUnknown_08592F2C, ANIM_TARGET, 2, 0, -5, 1, 0 + delay 7 + createsprite gUnknown_08592F2C, ANIM_TARGET, 2, -15, 10, 1, 0 + delay 7 + createvisualtask sub_8116620, 10, 1 | 4, 4, 2, 12, 0, RGB_BLACK + createsprite gUnknown_08592F2C, ANIM_TARGET, 2, 0, -5, 1, 0 + delay 7 + createsprite gUnknown_08592F2C, ANIM_TARGET, 2, -15, 10, 1, 0 + delay 7 + createsprite gUnknown_08592F2C, ANIM_TARGET, 2, -15, -15, 1, 0 + delay 7 + createsprite gUnknown_08592F2C, ANIM_TARGET, 2, 10, -5, 1, 0 + delay 7 + waitforvisualfinish + delay 11 + createvisualtask sub_8116620, 10, 1 | 4, 4, 2, 0, 12, RGB_BLACK + waitforvisualfinish + clearmonbg ANIM_TARGET end Move_WRING_OUT: diff --git a/src/battle_anim_sound_tasks.c b/src/battle_anim_sound_tasks.c index e5f0cd1652..eb74467551 100644 --- a/src/battle_anim_sound_tasks.c +++ b/src/battle_anim_sound_tasks.c @@ -2,11 +2,14 @@ #include "battle.h" #include "battle_anim.h" #include "contest.h" +#include "m4a.h" #include "sound.h" #include "task.h" #include "constants/battle_anim.h" #include "constants/species.h" +extern struct MusicPlayerInfo gMPlayInfo_SE1; + // this file's functions static void sub_8158B98(u8 taskId); static void sub_8158C04(u8 taskId); @@ -14,6 +17,7 @@ static void sub_8158D08(u8 taskId); static void sub_8158FF4(u8 taskId); static void sub_815913C(u8 taskId); static void sub_8159308(u8 taskId); +static void AnimTask_SeVolumeChange(u8 taskId); // task start void sub_8158B30(u8 taskId) @@ -436,3 +440,61 @@ _0815935A:\n\ .pool"); } #endif + +#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 AnimTask_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 = AnimTask_SeVolumeChange; +} + +static void AnimTask_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); + } +} From 4e5c543327bb8204227abf42c5b4c06df4b5e907 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 13 Apr 2019 14:02:04 +0200 Subject: [PATCH 347/667] Remove new items data from battle engine --- .../items/icon_palettes/Kangaskhanite.pal | 19 - graphics/items/icon_palettes/abomasite.pal | 19 - graphics/items/icon_palettes/absolite.pal | 19 - graphics/items/icon_palettes/adamant_orb.pal | 19 - .../items/icon_palettes/adrenaline_orb.pal | 19 - .../items/icon_palettes/aerodactylite.pal | 19 - graphics/items/icon_palettes/aggronite.pal | 19 - graphics/items/icon_palettes/alakazite.pal | 19 - graphics/items/icon_palettes/altarianite.pal | 19 - graphics/items/icon_palettes/ampharosite.pal | 19 - graphics/items/icon_palettes/assault_vest.pal | 19 - graphics/items/icon_palettes/audinite.pal | 19 - graphics/items/icon_palettes/banettite.pal | 19 - graphics/items/icon_palettes/beedrillite.pal | 19 - graphics/items/icon_palettes/big_root.pal | 19 - graphics/items/icon_palettes/binding_band.pal | 19 - graphics/items/icon_palettes/black_sludge.pal | 19 - .../items/icon_palettes/blastoisinite.pal | 19 - graphics/items/icon_palettes/blazikenite.pal | 19 - graphics/items/icon_palettes/bug_gem.pal | 19 - graphics/items/icon_palettes/burn_drive.pal | 19 - graphics/items/icon_palettes/cameruptite.pal | 19 - .../items/icon_palettes/charizardite_x.pal | 19 - .../items/icon_palettes/charizardite_y.pal | 19 - graphics/items/icon_palettes/chill_drive.pal | 19 - graphics/items/icon_palettes/choice_scarf.pal | 19 - graphics/items/icon_palettes/choice_specs.pal | 19 - graphics/items/icon_palettes/damp_rock.pal | 19 - graphics/items/icon_palettes/dark_gem.pal | 19 - graphics/items/icon_palettes/destiny_knot.pal | 19 - graphics/items/icon_palettes/diancite.pal | 19 - graphics/items/icon_palettes/douse_drive.pal | 19 - graphics/items/icon_palettes/draco_plate.pal | 19 - graphics/items/icon_palettes/dragon_gem.pal | 19 - graphics/items/icon_palettes/dread_plate.pal | 19 - graphics/items/icon_palettes/earth_plate.pal | 19 - graphics/items/icon_palettes/electric_gem.pal | 19 - .../items/icon_palettes/electric_seed.pal | 19 - graphics/items/icon_palettes/eviolite.pal | 19 - graphics/items/icon_palettes/expert_belt.pal | 19 - graphics/items/icon_palettes/fairy_gem.pal | 19 - graphics/items/icon_palettes/fighting_gem.pal | 19 - graphics/items/icon_palettes/fire_gem.pal | 19 - graphics/items/icon_palettes/fist_plate.pal | 19 - graphics/items/icon_palettes/flame_orb.pal | 19 - graphics/items/icon_palettes/flame_plate.pal | 19 - graphics/items/icon_palettes/float_stone.pal | 19 - graphics/items/icon_palettes/flying_gem.pal | 19 - graphics/items/icon_palettes/focus_sash.pal | 19 - graphics/items/icon_palettes/galladite.pal | 19 - graphics/items/icon_palettes/garchompite.pal | 19 - graphics/items/icon_palettes/gardevoirite.pal | 19 - graphics/items/icon_palettes/gengarite.pal | 19 - graphics/items/icon_palettes/ghost_gem.pal | 19 - graphics/items/icon_palettes/glalitite.pal | 19 - graphics/items/icon_palettes/grass_gem.pal | 19 - graphics/items/icon_palettes/grassy_seed.pal | 19 - graphics/items/icon_palettes/grip_claw.pal | 19 - graphics/items/icon_palettes/griseous_orb.pal | 19 - graphics/items/icon_palettes/ground_gem.pal | 19 - graphics/items/icon_palettes/gyaradosite.pal | 19 - graphics/items/icon_palettes/heat_rock.pal | 19 - graphics/items/icon_palettes/heracronite.pal | 19 - graphics/items/icon_palettes/honey.pal | 19 - .../items/icon_palettes/houndoominite.pal | 19 - graphics/items/icon_palettes/ice_gem.pal | 19 - graphics/items/icon_palettes/icicle_plate.pal | 19 - graphics/items/icon_palettes/icy_rock.pal | 19 - graphics/items/icon_palettes/insect_plate.pal | 19 - graphics/items/icon_palettes/iron_ball.pal | 19 - graphics/items/icon_palettes/iron_plate.pal | 19 - graphics/items/icon_palettes/lagging_tail.pal | 19 - graphics/items/icon_palettes/latiasite.pal | 19 - graphics/items/icon_palettes/latiosite.pal | 19 - graphics/items/icon_palettes/life_orb.pal | 19 - graphics/items/icon_palettes/light_clay.pal | 19 - graphics/items/icon_palettes/lopunnite.pal | 19 - graphics/items/icon_palettes/lucarionite.pal | 19 - graphics/items/icon_palettes/lustrous_orb.pal | 19 - graphics/items/icon_palettes/manectite.pal | 19 - graphics/items/icon_palettes/mawilite.pal | 19 - graphics/items/icon_palettes/meadow_plate.pal | 19 - graphics/items/icon_palettes/medichamite.pal | 19 - .../items/icon_palettes/mega_bracelet.pal | 19 - graphics/items/icon_palettes/metagrossite.pal | 19 - graphics/items/icon_palettes/metronome.pal | 19 - graphics/items/icon_palettes/mewtwonite_x.pal | 19 - graphics/items/icon_palettes/mewtwonite_y.pal | 19 - graphics/items/icon_palettes/mind_plate.pal | 19 - graphics/items/icon_palettes/misty_seed.pal | 19 - graphics/items/icon_palettes/muscle_band.pal | 19 - graphics/items/icon_palettes/normal_gem.pal | 19 - graphics/items/icon_palettes/pidgeotite.pal | 19 - graphics/items/icon_palettes/pinsirite.pal | 19 - graphics/items/icon_palettes/pixie_plate.pal | 19 - graphics/items/icon_palettes/poison_gem.pal | 19 - graphics/items/icon_palettes/power_herb.pal | 19 - .../items/icon_palettes/protective_pads.pal | 19 - graphics/items/icon_palettes/psychic_gem.pal | 19 - graphics/items/icon_palettes/psychic_seed.pal | 19 - graphics/items/icon_palettes/quick_powder.pal | 19 - graphics/items/icon_palettes/rock_gem.pal | 19 - graphics/items/icon_palettes/sablenite.pal | 19 - .../items/icon_palettes/safety_goggles.png | Bin 386 -> 0 bytes graphics/items/icon_palettes/salamencite.pal | 19 - graphics/items/icon_palettes/sceptilite.pal | 19 - graphics/items/icon_palettes/scizorite.pal | 19 - graphics/items/icon_palettes/sharpedonite.pal | 19 - graphics/items/icon_palettes/shed_shell.pal | 19 - graphics/items/icon_palettes/shock_drive.pal | 19 - graphics/items/icon_palettes/sky_plate.pal | 19 - graphics/items/icon_palettes/slowbronite.pal | 19 - graphics/items/icon_palettes/smooth_rock.pal | 19 - graphics/items/icon_palettes/splash_plate.pal | 19 - graphics/items/icon_palettes/spooky_plate.pal | 19 - graphics/items/icon_palettes/steel_gem.pal | 19 - graphics/items/icon_palettes/steelixite.pal | 19 - graphics/items/icon_palettes/sticky_barb.pal | 19 - graphics/items/icon_palettes/stone_plate.pal | 19 - graphics/items/icon_palettes/swampertite.pal | 19 - .../items/icon_palettes/terrain_extender.pal | 19 - graphics/items/icon_palettes/toxic_orb.pal | 19 - graphics/items/icon_palettes/toxic_plate.pal | 19 - graphics/items/icon_palettes/tyranitarite.pal | 19 - graphics/items/icon_palettes/venusaurite.pal | 19 - graphics/items/icon_palettes/water_gem.pal | 19 - graphics/items/icon_palettes/wide_lens.pal | 19 - graphics/items/icon_palettes/wise_glasses.pal | 19 - graphics/items/icon_palettes/zap_plate.pal | 19 - graphics/items/icon_palettes/zoom_lens.pal | 19 - graphics/items/icons/Kangaskhanite.png | Bin 235 -> 0 bytes graphics/items/icons/abomasite.png | Bin 266 -> 0 bytes graphics/items/icons/absolite.png | Bin 225 -> 0 bytes graphics/items/icons/adamant_orb.png | Bin 321 -> 0 bytes graphics/items/icons/adrenaline_orb.png | Bin 260 -> 0 bytes graphics/items/icons/aerodactylite.png | Bin 264 -> 0 bytes graphics/items/icons/aggronite.png | Bin 235 -> 0 bytes graphics/items/icons/alakazite.png | Bin 232 -> 0 bytes graphics/items/icons/altarianite.png | Bin 227 -> 0 bytes graphics/items/icons/ampharosite.png | Bin 235 -> 0 bytes graphics/items/icons/assault_vest.png | Bin 251 -> 0 bytes graphics/items/icons/audinite.png | Bin 240 -> 0 bytes graphics/items/icons/banettite.png | Bin 235 -> 0 bytes graphics/items/icons/beedrillite.png | Bin 265 -> 0 bytes graphics/items/icons/big_root.png | Bin 415 -> 0 bytes graphics/items/icons/binding_band.png | Bin 221 -> 0 bytes graphics/items/icons/black_sludge.png | Bin 364 -> 0 bytes graphics/items/icons/blastoisinite.png | Bin 232 -> 0 bytes graphics/items/icons/blazikenite.png | Bin 235 -> 0 bytes graphics/items/icons/bug_gem.png | Bin 353 -> 0 bytes graphics/items/icons/burn_drive.png | Bin 342 -> 0 bytes graphics/items/icons/cameruptite.png | Bin 244 -> 0 bytes graphics/items/icons/charizardite_x.png | Bin 231 -> 0 bytes graphics/items/icons/charizardite_y.png | Bin 232 -> 0 bytes graphics/items/icons/chill_drive.png | Bin 342 -> 0 bytes graphics/items/icons/choice_scarf.png | Bin 447 -> 0 bytes graphics/items/icons/choice_specs.png | Bin 369 -> 0 bytes graphics/items/icons/damp_rock.png | Bin 429 -> 0 bytes graphics/items/icons/dark_gem.png | Bin 353 -> 0 bytes graphics/items/icons/destiny_knot.png | Bin 396 -> 0 bytes graphics/items/icons/diancite.png | Bin 237 -> 0 bytes graphics/items/icons/douse_drive.png | Bin 342 -> 0 bytes graphics/items/icons/draco_plate.png | Bin 355 -> 0 bytes graphics/items/icons/dragon_gem.png | Bin 353 -> 0 bytes graphics/items/icons/dread_plate.png | Bin 355 -> 0 bytes graphics/items/icons/earth_plate.png | Bin 355 -> 0 bytes graphics/items/icons/electric_gem.png | Bin 353 -> 0 bytes graphics/items/icons/electric_seed.png | Bin 310 -> 0 bytes graphics/items/icons/eviolite.png | Bin 317 -> 0 bytes graphics/items/icons/expert_belt.png | Bin 383 -> 0 bytes graphics/items/icons/fairy_gem.png | Bin 353 -> 0 bytes graphics/items/icons/fighting_gem.png | Bin 353 -> 0 bytes graphics/items/icons/fire_gem.png | Bin 353 -> 0 bytes graphics/items/icons/fist_plate.png | Bin 355 -> 0 bytes graphics/items/icons/flame_orb.png | Bin 237 -> 0 bytes graphics/items/icons/flame_plate.png | Bin 355 -> 0 bytes graphics/items/icons/float_stone.png | Bin 345 -> 0 bytes graphics/items/icons/flying_gem.png | Bin 353 -> 0 bytes graphics/items/icons/focus_sash.png | Bin 392 -> 0 bytes graphics/items/icons/galladite.png | Bin 238 -> 0 bytes graphics/items/icons/garchompite.png | Bin 235 -> 0 bytes graphics/items/icons/gardevoirite.png | Bin 235 -> 0 bytes graphics/items/icons/gengarite.png | Bin 232 -> 0 bytes graphics/items/icons/ghost_gem.png | Bin 353 -> 0 bytes graphics/items/icons/glalitite.png | Bin 241 -> 0 bytes graphics/items/icons/grass_gem.png | Bin 353 -> 0 bytes graphics/items/icons/grassy_seed.png | Bin 310 -> 0 bytes graphics/items/icons/grip_claw.png | Bin 413 -> 0 bytes graphics/items/icons/griseous_orb.png | Bin 426 -> 0 bytes graphics/items/icons/ground_gem.png | Bin 353 -> 0 bytes graphics/items/icons/gyaradosite.png | Bin 235 -> 0 bytes graphics/items/icons/heat_rock.png | Bin 434 -> 0 bytes graphics/items/icons/heracronite.png | Bin 235 -> 0 bytes graphics/items/icons/honey.png | Bin 5898 -> 0 bytes graphics/items/icons/houndoominite.png | Bin 235 -> 0 bytes graphics/items/icons/ice_gem.png | Bin 353 -> 0 bytes graphics/items/icons/icicle_plate.png | Bin 355 -> 0 bytes graphics/items/icons/icy_rock.png | Bin 411 -> 0 bytes graphics/items/icons/insect_plate.png | Bin 355 -> 0 bytes graphics/items/icons/iron_ball.png | Bin 352 -> 0 bytes graphics/items/icons/iron_plate.png | Bin 355 -> 0 bytes graphics/items/icons/lagging_tail.png | Bin 400 -> 0 bytes graphics/items/icons/latiasite.png | Bin 235 -> 0 bytes graphics/items/icons/latiosite.png | Bin 235 -> 0 bytes graphics/items/icons/life_orb.png | Bin 330 -> 0 bytes graphics/items/icons/light_clay.png | Bin 362 -> 0 bytes graphics/items/icons/lopunnite.png | Bin 264 -> 0 bytes graphics/items/icons/lucarionite.png | Bin 333 -> 0 bytes graphics/items/icons/lustrous_orb.png | Bin 458 -> 0 bytes graphics/items/icons/manectite.png | Bin 235 -> 0 bytes graphics/items/icons/mawilite.png | Bin 235 -> 0 bytes graphics/items/icons/meadow_plate.png | Bin 355 -> 0 bytes graphics/items/icons/medichamite.png | Bin 232 -> 0 bytes graphics/items/icons/mega_bracelet.png | Bin 267 -> 0 bytes graphics/items/icons/metagrossite.png | Bin 244 -> 0 bytes graphics/items/icons/metronome.png | Bin 356 -> 0 bytes graphics/items/icons/mewtwonite_x.png | Bin 236 -> 0 bytes graphics/items/icons/mewtwonite_y.png | Bin 233 -> 0 bytes graphics/items/icons/mind_plate.png | Bin 355 -> 0 bytes graphics/items/icons/misty_seed.png | Bin 310 -> 0 bytes graphics/items/icons/muscle_band.png | Bin 418 -> 0 bytes graphics/items/icons/normal_gem.png | Bin 353 -> 0 bytes graphics/items/icons/pidgeotite.png | Bin 244 -> 0 bytes graphics/items/icons/pinsirite.png | Bin 235 -> 0 bytes graphics/items/icons/pixie_plate.png | Bin 243 -> 0 bytes graphics/items/icons/poison_gem.png | Bin 353 -> 0 bytes graphics/items/icons/power_herb.png | Bin 353 -> 0 bytes graphics/items/icons/protective_pads.png | Bin 335 -> 0 bytes graphics/items/icons/psychic_gem.png | Bin 353 -> 0 bytes graphics/items/icons/psychic_seed.png | Bin 310 -> 0 bytes graphics/items/icons/quick_powder.png | Bin 392 -> 0 bytes graphics/items/icons/rock_gem.png | Bin 353 -> 0 bytes graphics/items/icons/sablenite.png | Bin 240 -> 0 bytes graphics/items/icons/safety_goggles.png | Bin 386 -> 0 bytes graphics/items/icons/salamencite.png | Bin 244 -> 0 bytes graphics/items/icons/sceptilite.png | Bin 235 -> 0 bytes graphics/items/icons/scizorite.png | Bin 235 -> 0 bytes graphics/items/icons/sharpedonite.png | Bin 244 -> 0 bytes graphics/items/icons/shed_shell.png | Bin 393 -> 0 bytes graphics/items/icons/shock_drive.png | Bin 342 -> 0 bytes graphics/items/icons/sky_plate.png | Bin 355 -> 0 bytes graphics/items/icons/slowbronite.png | Bin 244 -> 0 bytes graphics/items/icons/smooth_rock.png | Bin 427 -> 0 bytes graphics/items/icons/splash_plate.png | Bin 352 -> 0 bytes graphics/items/icons/spooky_plate.png | Bin 355 -> 0 bytes graphics/items/icons/steel_gem.png | Bin 353 -> 0 bytes graphics/items/icons/steelixite.png | Bin 240 -> 0 bytes graphics/items/icons/sticky_barb.png | Bin 332 -> 0 bytes graphics/items/icons/stone_plate.png | Bin 355 -> 0 bytes graphics/items/icons/swampertite.png | Bin 234 -> 0 bytes graphics/items/icons/terrain_extender.png | Bin 313 -> 0 bytes graphics/items/icons/toxic_orb.png | Bin 347 -> 0 bytes graphics/items/icons/toxic_plate.png | Bin 355 -> 0 bytes graphics/items/icons/tyranitarite.png | Bin 235 -> 0 bytes graphics/items/icons/venusaurite.png | Bin 235 -> 0 bytes graphics/items/icons/water_gem.png | Bin 353 -> 0 bytes graphics/items/icons/wide_lens.png | Bin 370 -> 0 bytes graphics/items/icons/wise_glasses.png | Bin 333 -> 0 bytes graphics/items/icons/zap_plate.png | Bin 355 -> 0 bytes graphics/items/icons/zoom_lens.png | Bin 385 -> 0 bytes include/constants/items.h | 149 +- include/graphics.h | 264 -- include/pokemon.h | 3 +- src/data/graphics/items.h | 398 --- src/data/item_icon_table.h | 136 +- src/data/items.h | 2845 ++--------------- src/data/pokemon/evolution.h | 4 +- 267 files changed, 262 insertions(+), 5988 deletions(-) delete mode 100755 graphics/items/icon_palettes/Kangaskhanite.pal delete mode 100755 graphics/items/icon_palettes/abomasite.pal delete mode 100755 graphics/items/icon_palettes/absolite.pal delete mode 100755 graphics/items/icon_palettes/adamant_orb.pal delete mode 100755 graphics/items/icon_palettes/adrenaline_orb.pal delete mode 100755 graphics/items/icon_palettes/aerodactylite.pal delete mode 100755 graphics/items/icon_palettes/aggronite.pal delete mode 100755 graphics/items/icon_palettes/alakazite.pal delete mode 100755 graphics/items/icon_palettes/altarianite.pal delete mode 100755 graphics/items/icon_palettes/ampharosite.pal delete mode 100755 graphics/items/icon_palettes/assault_vest.pal delete mode 100755 graphics/items/icon_palettes/audinite.pal delete mode 100755 graphics/items/icon_palettes/banettite.pal delete mode 100755 graphics/items/icon_palettes/beedrillite.pal delete mode 100755 graphics/items/icon_palettes/big_root.pal delete mode 100755 graphics/items/icon_palettes/binding_band.pal delete mode 100755 graphics/items/icon_palettes/black_sludge.pal delete mode 100755 graphics/items/icon_palettes/blastoisinite.pal delete mode 100755 graphics/items/icon_palettes/blazikenite.pal delete mode 100755 graphics/items/icon_palettes/bug_gem.pal delete mode 100755 graphics/items/icon_palettes/burn_drive.pal delete mode 100755 graphics/items/icon_palettes/cameruptite.pal delete mode 100755 graphics/items/icon_palettes/charizardite_x.pal delete mode 100755 graphics/items/icon_palettes/charizardite_y.pal delete mode 100755 graphics/items/icon_palettes/chill_drive.pal delete mode 100755 graphics/items/icon_palettes/choice_scarf.pal delete mode 100755 graphics/items/icon_palettes/choice_specs.pal delete mode 100755 graphics/items/icon_palettes/damp_rock.pal delete mode 100755 graphics/items/icon_palettes/dark_gem.pal delete mode 100755 graphics/items/icon_palettes/destiny_knot.pal delete mode 100755 graphics/items/icon_palettes/diancite.pal delete mode 100755 graphics/items/icon_palettes/douse_drive.pal delete mode 100755 graphics/items/icon_palettes/draco_plate.pal delete mode 100755 graphics/items/icon_palettes/dragon_gem.pal delete mode 100755 graphics/items/icon_palettes/dread_plate.pal delete mode 100755 graphics/items/icon_palettes/earth_plate.pal delete mode 100755 graphics/items/icon_palettes/electric_gem.pal delete mode 100755 graphics/items/icon_palettes/electric_seed.pal delete mode 100755 graphics/items/icon_palettes/eviolite.pal delete mode 100755 graphics/items/icon_palettes/expert_belt.pal delete mode 100755 graphics/items/icon_palettes/fairy_gem.pal delete mode 100755 graphics/items/icon_palettes/fighting_gem.pal delete mode 100755 graphics/items/icon_palettes/fire_gem.pal delete mode 100755 graphics/items/icon_palettes/fist_plate.pal delete mode 100755 graphics/items/icon_palettes/flame_orb.pal delete mode 100755 graphics/items/icon_palettes/flame_plate.pal delete mode 100755 graphics/items/icon_palettes/float_stone.pal delete mode 100755 graphics/items/icon_palettes/flying_gem.pal delete mode 100755 graphics/items/icon_palettes/focus_sash.pal delete mode 100755 graphics/items/icon_palettes/galladite.pal delete mode 100755 graphics/items/icon_palettes/garchompite.pal delete mode 100755 graphics/items/icon_palettes/gardevoirite.pal delete mode 100755 graphics/items/icon_palettes/gengarite.pal delete mode 100755 graphics/items/icon_palettes/ghost_gem.pal delete mode 100755 graphics/items/icon_palettes/glalitite.pal delete mode 100755 graphics/items/icon_palettes/grass_gem.pal delete mode 100755 graphics/items/icon_palettes/grassy_seed.pal delete mode 100755 graphics/items/icon_palettes/grip_claw.pal delete mode 100755 graphics/items/icon_palettes/griseous_orb.pal delete mode 100755 graphics/items/icon_palettes/ground_gem.pal delete mode 100755 graphics/items/icon_palettes/gyaradosite.pal delete mode 100755 graphics/items/icon_palettes/heat_rock.pal delete mode 100755 graphics/items/icon_palettes/heracronite.pal delete mode 100644 graphics/items/icon_palettes/honey.pal delete mode 100755 graphics/items/icon_palettes/houndoominite.pal delete mode 100755 graphics/items/icon_palettes/ice_gem.pal delete mode 100755 graphics/items/icon_palettes/icicle_plate.pal delete mode 100755 graphics/items/icon_palettes/icy_rock.pal delete mode 100755 graphics/items/icon_palettes/insect_plate.pal delete mode 100755 graphics/items/icon_palettes/iron_ball.pal delete mode 100755 graphics/items/icon_palettes/iron_plate.pal delete mode 100755 graphics/items/icon_palettes/lagging_tail.pal delete mode 100755 graphics/items/icon_palettes/latiasite.pal delete mode 100755 graphics/items/icon_palettes/latiosite.pal delete mode 100755 graphics/items/icon_palettes/life_orb.pal delete mode 100755 graphics/items/icon_palettes/light_clay.pal delete mode 100755 graphics/items/icon_palettes/lopunnite.pal delete mode 100755 graphics/items/icon_palettes/lucarionite.pal delete mode 100755 graphics/items/icon_palettes/lustrous_orb.pal delete mode 100755 graphics/items/icon_palettes/manectite.pal delete mode 100755 graphics/items/icon_palettes/mawilite.pal delete mode 100755 graphics/items/icon_palettes/meadow_plate.pal delete mode 100755 graphics/items/icon_palettes/medichamite.pal delete mode 100755 graphics/items/icon_palettes/mega_bracelet.pal delete mode 100755 graphics/items/icon_palettes/metagrossite.pal delete mode 100755 graphics/items/icon_palettes/metronome.pal delete mode 100755 graphics/items/icon_palettes/mewtwonite_x.pal delete mode 100755 graphics/items/icon_palettes/mewtwonite_y.pal delete mode 100755 graphics/items/icon_palettes/mind_plate.pal delete mode 100755 graphics/items/icon_palettes/misty_seed.pal delete mode 100755 graphics/items/icon_palettes/muscle_band.pal delete mode 100755 graphics/items/icon_palettes/normal_gem.pal delete mode 100755 graphics/items/icon_palettes/pidgeotite.pal delete mode 100755 graphics/items/icon_palettes/pinsirite.pal delete mode 100755 graphics/items/icon_palettes/pixie_plate.pal delete mode 100755 graphics/items/icon_palettes/poison_gem.pal delete mode 100755 graphics/items/icon_palettes/power_herb.pal delete mode 100755 graphics/items/icon_palettes/protective_pads.pal delete mode 100755 graphics/items/icon_palettes/psychic_gem.pal delete mode 100755 graphics/items/icon_palettes/psychic_seed.pal delete mode 100755 graphics/items/icon_palettes/quick_powder.pal delete mode 100755 graphics/items/icon_palettes/rock_gem.pal delete mode 100755 graphics/items/icon_palettes/sablenite.pal delete mode 100755 graphics/items/icon_palettes/safety_goggles.png delete mode 100755 graphics/items/icon_palettes/salamencite.pal delete mode 100755 graphics/items/icon_palettes/sceptilite.pal delete mode 100755 graphics/items/icon_palettes/scizorite.pal delete mode 100755 graphics/items/icon_palettes/sharpedonite.pal delete mode 100755 graphics/items/icon_palettes/shed_shell.pal delete mode 100755 graphics/items/icon_palettes/shock_drive.pal delete mode 100755 graphics/items/icon_palettes/sky_plate.pal delete mode 100755 graphics/items/icon_palettes/slowbronite.pal delete mode 100755 graphics/items/icon_palettes/smooth_rock.pal delete mode 100755 graphics/items/icon_palettes/splash_plate.pal delete mode 100755 graphics/items/icon_palettes/spooky_plate.pal delete mode 100755 graphics/items/icon_palettes/steel_gem.pal delete mode 100755 graphics/items/icon_palettes/steelixite.pal delete mode 100755 graphics/items/icon_palettes/sticky_barb.pal delete mode 100755 graphics/items/icon_palettes/stone_plate.pal delete mode 100755 graphics/items/icon_palettes/swampertite.pal delete mode 100755 graphics/items/icon_palettes/terrain_extender.pal delete mode 100755 graphics/items/icon_palettes/toxic_orb.pal delete mode 100755 graphics/items/icon_palettes/toxic_plate.pal delete mode 100755 graphics/items/icon_palettes/tyranitarite.pal delete mode 100755 graphics/items/icon_palettes/venusaurite.pal delete mode 100755 graphics/items/icon_palettes/water_gem.pal delete mode 100755 graphics/items/icon_palettes/wide_lens.pal delete mode 100755 graphics/items/icon_palettes/wise_glasses.pal delete mode 100755 graphics/items/icon_palettes/zap_plate.pal delete mode 100755 graphics/items/icon_palettes/zoom_lens.pal delete mode 100755 graphics/items/icons/Kangaskhanite.png delete mode 100755 graphics/items/icons/abomasite.png delete mode 100755 graphics/items/icons/absolite.png delete mode 100755 graphics/items/icons/adamant_orb.png delete mode 100755 graphics/items/icons/adrenaline_orb.png delete mode 100755 graphics/items/icons/aerodactylite.png delete mode 100755 graphics/items/icons/aggronite.png delete mode 100755 graphics/items/icons/alakazite.png delete mode 100755 graphics/items/icons/altarianite.png delete mode 100755 graphics/items/icons/ampharosite.png delete mode 100755 graphics/items/icons/assault_vest.png delete mode 100755 graphics/items/icons/audinite.png delete mode 100755 graphics/items/icons/banettite.png delete mode 100755 graphics/items/icons/beedrillite.png delete mode 100755 graphics/items/icons/big_root.png delete mode 100755 graphics/items/icons/binding_band.png delete mode 100755 graphics/items/icons/black_sludge.png delete mode 100755 graphics/items/icons/blastoisinite.png delete mode 100755 graphics/items/icons/blazikenite.png delete mode 100755 graphics/items/icons/bug_gem.png delete mode 100755 graphics/items/icons/burn_drive.png delete mode 100755 graphics/items/icons/cameruptite.png delete mode 100755 graphics/items/icons/charizardite_x.png delete mode 100755 graphics/items/icons/charizardite_y.png delete mode 100755 graphics/items/icons/chill_drive.png delete mode 100755 graphics/items/icons/choice_scarf.png delete mode 100755 graphics/items/icons/choice_specs.png delete mode 100755 graphics/items/icons/damp_rock.png delete mode 100755 graphics/items/icons/dark_gem.png delete mode 100755 graphics/items/icons/destiny_knot.png delete mode 100755 graphics/items/icons/diancite.png delete mode 100755 graphics/items/icons/douse_drive.png delete mode 100755 graphics/items/icons/draco_plate.png delete mode 100755 graphics/items/icons/dragon_gem.png delete mode 100755 graphics/items/icons/dread_plate.png delete mode 100755 graphics/items/icons/earth_plate.png delete mode 100755 graphics/items/icons/electric_gem.png delete mode 100755 graphics/items/icons/electric_seed.png delete mode 100755 graphics/items/icons/eviolite.png delete mode 100755 graphics/items/icons/expert_belt.png delete mode 100755 graphics/items/icons/fairy_gem.png delete mode 100755 graphics/items/icons/fighting_gem.png delete mode 100755 graphics/items/icons/fire_gem.png delete mode 100755 graphics/items/icons/fist_plate.png delete mode 100755 graphics/items/icons/flame_orb.png delete mode 100755 graphics/items/icons/flame_plate.png delete mode 100755 graphics/items/icons/float_stone.png delete mode 100755 graphics/items/icons/flying_gem.png delete mode 100755 graphics/items/icons/focus_sash.png delete mode 100755 graphics/items/icons/galladite.png delete mode 100755 graphics/items/icons/garchompite.png delete mode 100755 graphics/items/icons/gardevoirite.png delete mode 100755 graphics/items/icons/gengarite.png delete mode 100755 graphics/items/icons/ghost_gem.png delete mode 100755 graphics/items/icons/glalitite.png delete mode 100755 graphics/items/icons/grass_gem.png delete mode 100755 graphics/items/icons/grassy_seed.png delete mode 100755 graphics/items/icons/grip_claw.png delete mode 100755 graphics/items/icons/griseous_orb.png delete mode 100755 graphics/items/icons/ground_gem.png delete mode 100755 graphics/items/icons/gyaradosite.png delete mode 100755 graphics/items/icons/heat_rock.png delete mode 100755 graphics/items/icons/heracronite.png delete mode 100644 graphics/items/icons/honey.png delete mode 100755 graphics/items/icons/houndoominite.png delete mode 100755 graphics/items/icons/ice_gem.png delete mode 100755 graphics/items/icons/icicle_plate.png delete mode 100755 graphics/items/icons/icy_rock.png delete mode 100755 graphics/items/icons/insect_plate.png delete mode 100755 graphics/items/icons/iron_ball.png delete mode 100755 graphics/items/icons/iron_plate.png delete mode 100755 graphics/items/icons/lagging_tail.png delete mode 100755 graphics/items/icons/latiasite.png delete mode 100755 graphics/items/icons/latiosite.png delete mode 100755 graphics/items/icons/life_orb.png delete mode 100755 graphics/items/icons/light_clay.png delete mode 100755 graphics/items/icons/lopunnite.png delete mode 100755 graphics/items/icons/lucarionite.png delete mode 100755 graphics/items/icons/lustrous_orb.png delete mode 100755 graphics/items/icons/manectite.png delete mode 100755 graphics/items/icons/mawilite.png delete mode 100755 graphics/items/icons/meadow_plate.png delete mode 100755 graphics/items/icons/medichamite.png delete mode 100755 graphics/items/icons/mega_bracelet.png delete mode 100755 graphics/items/icons/metagrossite.png delete mode 100755 graphics/items/icons/metronome.png delete mode 100755 graphics/items/icons/mewtwonite_x.png delete mode 100755 graphics/items/icons/mewtwonite_y.png delete mode 100755 graphics/items/icons/mind_plate.png delete mode 100755 graphics/items/icons/misty_seed.png delete mode 100755 graphics/items/icons/muscle_band.png delete mode 100755 graphics/items/icons/normal_gem.png delete mode 100755 graphics/items/icons/pidgeotite.png delete mode 100755 graphics/items/icons/pinsirite.png delete mode 100755 graphics/items/icons/pixie_plate.png delete mode 100755 graphics/items/icons/poison_gem.png delete mode 100755 graphics/items/icons/power_herb.png delete mode 100755 graphics/items/icons/protective_pads.png delete mode 100755 graphics/items/icons/psychic_gem.png delete mode 100755 graphics/items/icons/psychic_seed.png delete mode 100755 graphics/items/icons/quick_powder.png delete mode 100755 graphics/items/icons/rock_gem.png delete mode 100755 graphics/items/icons/sablenite.png delete mode 100755 graphics/items/icons/safety_goggles.png delete mode 100755 graphics/items/icons/salamencite.png delete mode 100755 graphics/items/icons/sceptilite.png delete mode 100755 graphics/items/icons/scizorite.png delete mode 100755 graphics/items/icons/sharpedonite.png delete mode 100755 graphics/items/icons/shed_shell.png delete mode 100755 graphics/items/icons/shock_drive.png delete mode 100755 graphics/items/icons/sky_plate.png delete mode 100755 graphics/items/icons/slowbronite.png delete mode 100755 graphics/items/icons/smooth_rock.png delete mode 100755 graphics/items/icons/splash_plate.png delete mode 100755 graphics/items/icons/spooky_plate.png delete mode 100755 graphics/items/icons/steel_gem.png delete mode 100755 graphics/items/icons/steelixite.png delete mode 100755 graphics/items/icons/sticky_barb.png delete mode 100755 graphics/items/icons/stone_plate.png delete mode 100755 graphics/items/icons/swampertite.png delete mode 100755 graphics/items/icons/terrain_extender.png delete mode 100755 graphics/items/icons/toxic_orb.png delete mode 100755 graphics/items/icons/toxic_plate.png delete mode 100755 graphics/items/icons/tyranitarite.png delete mode 100755 graphics/items/icons/venusaurite.png delete mode 100755 graphics/items/icons/water_gem.png delete mode 100755 graphics/items/icons/wide_lens.png delete mode 100755 graphics/items/icons/wise_glasses.png delete mode 100755 graphics/items/icons/zap_plate.png delete mode 100755 graphics/items/icons/zoom_lens.png diff --git a/graphics/items/icon_palettes/Kangaskhanite.pal b/graphics/items/icon_palettes/Kangaskhanite.pal deleted file mode 100755 index dd50b3216f..0000000000 --- a/graphics/items/icon_palettes/Kangaskhanite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -184 160 248 -160 128 168 -128 96 96 -248 216 120 -216 192 248 -200 168 192 -192 160 104 -248 248 248 -184 160 232 -216 192 184 -248 240 248 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/abomasite.pal b/graphics/items/icon_palettes/abomasite.pal deleted file mode 100755 index 173d17297b..0000000000 --- a/graphics/items/icon_palettes/abomasite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -136 160 232 -248 248 248 -48 136 120 -144 208 184 -200 216 208 -80 160 144 -144 208 176 -192 208 240 -104 168 192 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/absolite.pal b/graphics/items/icon_palettes/absolite.pal deleted file mode 100755 index 5deff2aca3..0000000000 --- a/graphics/items/icon_palettes/absolite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -88 104 160 -152 176 232 -248 248 248 -144 160 208 -200 216 240 -64 72 136 -128 144 192 -192 216 240 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/adamant_orb.pal b/graphics/items/icon_palettes/adamant_orb.pal deleted file mode 100755 index d5cb6a7ceb..0000000000 --- a/graphics/items/icon_palettes/adamant_orb.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -93 93 93 -39 39 39 -247 247 247 -177 203 247 -220 247 247 -194 229 247 -159 194 247 -151 177 220 -117 159 212 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/adrenaline_orb.pal b/graphics/items/icon_palettes/adrenaline_orb.pal deleted file mode 100755 index f2b1e719e0..0000000000 --- a/graphics/items/icon_palettes/adrenaline_orb.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -49 49 49 -41 65 115 -90 172 222 -57 90 148 -106 197 238 -123 230 246 -82 148 189 -82 115 164 -57 106 172 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/aerodactylite.pal b/graphics/items/icon_palettes/aerodactylite.pal deleted file mode 100755 index a0f921cfb3..0000000000 --- a/graphics/items/icon_palettes/aerodactylite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -176 160 208 -64 64 64 -144 64 216 -208 208 248 -88 64 128 -160 80 232 -208 184 232 -248 248 248 -120 112 136 -160 160 168 -168 128 240 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/aggronite.pal b/graphics/items/icon_palettes/aggronite.pal deleted file mode 100755 index 1bba14f16d..0000000000 --- a/graphics/items/icon_palettes/aggronite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -160 160 160 -120 120 120 -88 88 88 -208 208 248 -208 208 208 -200 200 200 -152 152 168 -248 248 248 -152 152 152 -192 192 192 -232 232 232 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/alakazite.pal b/graphics/items/icon_palettes/alakazite.pal deleted file mode 100755 index 0d215cb94e..0000000000 --- a/graphics/items/icon_palettes/alakazite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -240 184 88 -176 120 152 -144 88 168 -192 208 216 -216 208 200 -208 160 200 -168 152 192 -248 248 248 -232 176 40 -208 192 152 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/altarianite.pal b/graphics/items/icon_palettes/altarianite.pal deleted file mode 100755 index ecb5f59359..0000000000 --- a/graphics/items/icon_palettes/altarianite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -232 168 216 -136 184 240 -104 208 248 -144 216 248 -184 224 240 -248 248 248 -224 224 224 -224 192 216 -224 184 216 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/ampharosite.pal b/graphics/items/icon_palettes/ampharosite.pal deleted file mode 100755 index d99ebd6361..0000000000 --- a/graphics/items/icon_palettes/ampharosite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -232 200 56 -248 120 104 -232 64 80 -192 200 232 -248 224 152 -248 176 152 -216 136 160 -248 248 248 -240 200 0 -216 200 120 -216 216 216 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/assault_vest.pal b/graphics/items/icon_palettes/assault_vest.pal deleted file mode 100755 index b68dfab9d6..0000000000 --- a/graphics/items/icon_palettes/assault_vest.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -200 80 80 -144 48 56 -64 64 64 -96 72 80 -176 56 64 -0 0 0 -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/items/icon_palettes/audinite.pal b/graphics/items/icon_palettes/audinite.pal deleted file mode 100755 index 502636ab7e..0000000000 --- a/graphics/items/icon_palettes/audinite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -248 240 208 -184 104 120 -232 104 136 -248 216 224 -240 176 192 -240 192 200 -240 224 208 -248 248 248 -240 200 184 -232 200 192 -224 184 184 -224 160 160 -240 232 208 -0 0 0 diff --git a/graphics/items/icon_palettes/banettite.pal b/graphics/items/icon_palettes/banettite.pal deleted file mode 100755 index a95929c2c6..0000000000 --- a/graphics/items/icon_palettes/banettite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -80 80 80 -216 152 8 -248 200 24 -240 144 200 -255 255 255 -232 216 136 -248 176 112 -248 248 248 -64 64 64 -208 88 136 -184 184 208 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/beedrillite.pal b/graphics/items/icon_palettes/beedrillite.pal deleted file mode 100755 index 2b25eaa3d5..0000000000 --- a/graphics/items/icon_palettes/beedrillite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -192 184 224 -240 192 24 -56 56 56 -232 224 240 -200 160 8 -184 184 184 -128 104 32 -248 248 248 -216 192 128 -248 224 136 -144 120 40 -88 88 96 -120 120 136 -0 0 0 diff --git a/graphics/items/icon_palettes/big_root.pal b/graphics/items/icon_palettes/big_root.pal deleted file mode 100755 index a93aa2ed77..0000000000 --- a/graphics/items/icon_palettes/big_root.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -39 39 39 -126 77 11 -168 117 46 -220 194 117 -203 151 77 -247 220 151 -0 0 0 -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/items/icon_palettes/binding_band.pal b/graphics/items/icon_palettes/binding_band.pal deleted file mode 100755 index ed678f3ef9..0000000000 --- a/graphics/items/icon_palettes/binding_band.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -152 96 32 -184 128 40 -200 152 80 -0 0 0 -0 0 0 -0 0 0 -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/items/icon_palettes/black_sludge.pal b/graphics/items/icon_palettes/black_sludge.pal deleted file mode 100755 index 0e8504e0ce..0000000000 --- a/graphics/items/icon_palettes/black_sludge.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -39 39 39 -101 101 126 -126 126 159 -142 151 168 -61 61 77 -0 0 0 -0 0 0 -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/items/icon_palettes/blastoisinite.pal b/graphics/items/icon_palettes/blastoisinite.pal deleted file mode 100755 index 4d8882ef59..0000000000 --- a/graphics/items/icon_palettes/blastoisinite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -96 152 240 -88 112 128 -120 88 48 -184 184 184 -176 200 232 -152 136 112 -248 248 248 -64 128 240 -136 168 216 -208 208 208 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/blazikenite.pal b/graphics/items/icon_palettes/blazikenite.pal deleted file mode 100755 index 4530ddbfdf..0000000000 --- a/graphics/items/icon_palettes/blazikenite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -216 88 80 -128 56 56 -56 56 56 -216 200 184 -240 168 208 -192 168 168 -136 128 120 -248 248 248 -208 56 56 -208 168 136 -240 240 176 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/bug_gem.pal b/graphics/items/icon_palettes/bug_gem.pal deleted file mode 100755 index 4e8af47265..0000000000 --- a/graphics/items/icon_palettes/bug_gem.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -32 32 32 -184 216 104 -224 232 176 -152 184 32 -248 248 248 -136 160 16 -112 144 0 -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/items/icon_palettes/burn_drive.pal b/graphics/items/icon_palettes/burn_drive.pal deleted file mode 100755 index 316e9e718d..0000000000 --- a/graphics/items/icon_palettes/burn_drive.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -120 72 64 -248 152 136 -208 40 16 -216 88 64 -224 88 80 -0 0 0 -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/items/icon_palettes/cameruptite.pal b/graphics/items/icon_palettes/cameruptite.pal deleted file mode 100755 index 1cc3270ca3..0000000000 --- a/graphics/items/icon_palettes/cameruptite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -184 168 152 -120 96 88 -232 112 80 -200 200 200 -240 176 160 -208 136 120 -248 248 248 -72 72 64 -152 88 72 -152 144 136 -224 224 224 -128 120 112 -200 88 64 -136 80 64 diff --git a/graphics/items/icon_palettes/charizardite_x.pal b/graphics/items/icon_palettes/charizardite_x.pal deleted file mode 100755 index 7073c040fc..0000000000 --- a/graphics/items/icon_palettes/charizardite_x.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -56 64 64 -72 96 168 -72 128 248 -72 184 248 -160 152 160 -176 200 248 -72 160 248 -248 248 248 -64 128 152 -136 232 248 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/charizardite_y.pal b/graphics/items/icon_palettes/charizardite_y.pal deleted file mode 100755 index ddc55c87f1..0000000000 --- a/graphics/items/icon_palettes/charizardite_y.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -216 40 16 -248 176 0 -248 208 0 -216 152 112 -232 200 192 -232 184 56 -248 248 248 -200 24 0 -216 96 64 -216 192 184 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/chill_drive.pal b/graphics/items/icon_palettes/chill_drive.pal deleted file mode 100755 index d429ee0036..0000000000 --- a/graphics/items/icon_palettes/chill_drive.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -32 136 144 -208 248 248 -8 184 200 -88 200 224 -96 224 248 -0 0 0 -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/items/icon_palettes/choice_scarf.pal b/graphics/items/icon_palettes/choice_scarf.pal deleted file mode 100755 index 19561700fb..0000000000 --- a/graphics/items/icon_palettes/choice_scarf.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -54 101 93 -61 69 77 -61 142 212 -69 159 238 -109 185 229 -39 101 142 -117 177 247 -85 168 212 -142 212 247 -39 39 39 -194 229 247 -46 126 177 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/choice_specs.pal b/graphics/items/icon_palettes/choice_specs.pal deleted file mode 100755 index 95c5ebab30..0000000000 --- a/graphics/items/icon_palettes/choice_specs.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -117 117 117 -39 39 39 -229 185 54 -212 117 18 -247 238 203 -159 93 11 -247 247 77 -247 126 54 -238 185 77 -238 18 18 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/damp_rock.pal b/graphics/items/icon_palettes/damp_rock.pal deleted file mode 100755 index f50603adb5..0000000000 --- a/graphics/items/icon_palettes/damp_rock.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -39 39 39 -220 238 229 -159 220 203 -77 177 185 -54 151 159 -69 93 93 -101 142 142 -46 126 134 -77 117 117 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/dark_gem.pal b/graphics/items/icon_palettes/dark_gem.pal deleted file mode 100755 index 1183d7db18..0000000000 --- a/graphics/items/icon_palettes/dark_gem.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -32 32 32 -72 72 72 -120 120 120 -56 56 56 -160 160 160 -40 40 40 -0 0 0 -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/items/icon_palettes/destiny_knot.pal b/graphics/items/icon_palettes/destiny_knot.pal deleted file mode 100755 index 080e8a7f04..0000000000 --- a/graphics/items/icon_palettes/destiny_knot.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -39 39 39 -194 69 69 -247 101 101 -247 85 85 -185 61 61 -134 54 54 -0 0 0 -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/items/icon_palettes/diancite.pal b/graphics/items/icon_palettes/diancite.pal deleted file mode 100755 index 45e04c8914..0000000000 --- a/graphics/items/icon_palettes/diancite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -240 224 224 -208 152 80 -248 232 160 -240 192 208 -240 192 128 -248 248 248 -224 136 168 -240 184 160 -232 176 192 -232 160 184 -224 176 104 -208 112 136 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/douse_drive.pal b/graphics/items/icon_palettes/douse_drive.pal deleted file mode 100755 index a3e4209f44..0000000000 --- a/graphics/items/icon_palettes/douse_drive.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -48 104 152 -120 208 248 -48 128 200 -56 168 240 -80 184 248 -0 0 0 -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/items/icon_palettes/draco_plate.pal b/graphics/items/icon_palettes/draco_plate.pal deleted file mode 100755 index 27bfff4b28..0000000000 --- a/graphics/items/icon_palettes/draco_plate.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -40 40 40 -173 63 63 -237 112 122 -246 138 138 -201 88 88 -130 56 63 -130 56 40 -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/items/icon_palettes/dragon_gem.pal b/graphics/items/icon_palettes/dragon_gem.pal deleted file mode 100755 index 10fed280fd..0000000000 --- a/graphics/items/icon_palettes/dragon_gem.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -32 32 32 -160 128 200 -168 184 232 -128 96 224 -216 248 216 -72 64 152 -96 56 112 -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/items/icon_palettes/dread_plate.pal b/graphics/items/icon_palettes/dread_plate.pal deleted file mode 100755 index dddd5e13a9..0000000000 --- a/graphics/items/icon_palettes/dread_plate.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -40 40 40 -71 104 156 -130 165 201 -156 182 228 -104 138 173 -63 96 122 -56 71 88 -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/items/icon_palettes/earth_plate.pal b/graphics/items/icon_palettes/earth_plate.pal deleted file mode 100755 index 7b9e07525d..0000000000 --- a/graphics/items/icon_palettes/earth_plate.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -40 40 40 -156 104 71 -201 165 112 -209 182 138 -182 138 96 -138 96 63 -112 79 71 -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/items/icon_palettes/electric_gem.pal b/graphics/items/icon_palettes/electric_gem.pal deleted file mode 100755 index 88de6e42ae..0000000000 --- a/graphics/items/icon_palettes/electric_gem.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -32 32 32 -248 224 0 -248 248 160 -224 200 0 -248 248 248 -192 168 0 -184 160 0 -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/items/icon_palettes/electric_seed.pal b/graphics/items/icon_palettes/electric_seed.pal deleted file mode 100755 index 5c264cdc94..0000000000 --- a/graphics/items/icon_palettes/electric_seed.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -49 49 49 -213 148 65 -246 246 82 -246 222 74 -238 246 197 -156 106 16 -106 82 65 -205 139 24 -238 189 41 -106 90 74 -156 90 49 -246 222 123 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/eviolite.pal b/graphics/items/icon_palettes/eviolite.pal deleted file mode 100755 index 28ba1a4fc3..0000000000 --- a/graphics/items/icon_palettes/eviolite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -88 88 88 -248 200 240 -224 176 232 -48 48 48 -240 224 248 -200 144 224 -176 120 216 -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/items/icon_palettes/expert_belt.pal b/graphics/items/icon_palettes/expert_belt.pal deleted file mode 100755 index cfb6c6a926..0000000000 --- a/graphics/items/icon_palettes/expert_belt.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -39 39 39 -61 54 61 -117 109 117 -85 77 85 -0 0 0 -0 0 0 -0 0 0 -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/items/icon_palettes/fairy_gem.pal b/graphics/items/icon_palettes/fairy_gem.pal deleted file mode 100755 index 4bf316f572..0000000000 --- a/graphics/items/icon_palettes/fairy_gem.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -49 49 49 -215 149 192 -251 230 239 -210 120 173 -255 247 255 -193 77 151 -183 49 136 -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/items/icon_palettes/fighting_gem.pal b/graphics/items/icon_palettes/fighting_gem.pal deleted file mode 100755 index 324a6870c6..0000000000 --- a/graphics/items/icon_palettes/fighting_gem.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -32 32 32 -184 112 120 -224 152 136 -144 72 120 -248 216 208 -120 56 88 -96 40 56 -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/items/icon_palettes/fire_gem.pal b/graphics/items/icon_palettes/fire_gem.pal deleted file mode 100755 index f98f9e16ca..0000000000 --- a/graphics/items/icon_palettes/fire_gem.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -32 32 32 -248 144 72 -248 200 104 -240 64 48 -248 248 232 -224 72 32 -176 24 0 -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/items/icon_palettes/fist_plate.pal b/graphics/items/icon_palettes/fist_plate.pal deleted file mode 100755 index 470a83c515..0000000000 --- a/graphics/items/icon_palettes/fist_plate.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -40 40 40 -201 104 96 -246 156 138 -255 173 165 -228 130 96 -173 63 63 -130 56 40 -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/items/icon_palettes/flame_orb.pal b/graphics/items/icon_palettes/flame_orb.pal deleted file mode 100755 index f3ee47e397..0000000000 --- a/graphics/items/icon_palettes/flame_orb.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -39 39 39 -247 126 126 -247 46 46 -238 185 177 -247 247 247 -247 126 85 -247 194 93 -247 247 93 -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/items/icon_palettes/flame_plate.pal b/graphics/items/icon_palettes/flame_plate.pal deleted file mode 100755 index 8b68abf8f5..0000000000 --- a/graphics/items/icon_palettes/flame_plate.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -39 39 39 -212 69 54 -247 117 117 -247 142 142 -247 77 77 -168 18 18 -151 5 5 -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/items/icon_palettes/float_stone.pal b/graphics/items/icon_palettes/float_stone.pal deleted file mode 100755 index 420e4adc6f..0000000000 --- a/graphics/items/icon_palettes/float_stone.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -64 64 64 -224 224 208 -200 200 184 -168 168 152 -152 144 136 -136 128 112 -48 48 48 -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/items/icon_palettes/flying_gem.pal b/graphics/items/icon_palettes/flying_gem.pal deleted file mode 100755 index 16d9334346..0000000000 --- a/graphics/items/icon_palettes/flying_gem.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -32 32 32 -184 200 248 -216 224 248 -152 168 240 -232 248 248 -104 128 192 -64 80 144 -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/items/icon_palettes/focus_sash.pal b/graphics/items/icon_palettes/focus_sash.pal deleted file mode 100755 index 08b56485e0..0000000000 --- a/graphics/items/icon_palettes/focus_sash.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -39 39 39 -77 77 77 -212 101 61 -247 117 117 -247 151 69 -177 39 39 -229 69 69 -247 220 69 -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/items/icon_palettes/galladite.pal b/graphics/items/icon_palettes/galladite.pal deleted file mode 100755 index fdc71e0e27..0000000000 --- a/graphics/items/icon_palettes/galladite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -104 176 160 -144 120 128 -216 96 112 -232 232 216 -208 224 224 -232 168 184 -240 200 208 -248 248 248 -88 160 144 -176 208 208 -120 176 168 -216 152 160 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/garchompite.pal b/graphics/items/icon_palettes/garchompite.pal deleted file mode 100755 index 79e932ef5c..0000000000 --- a/graphics/items/icon_palettes/garchompite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -152 56 64 -240 160 48 -248 216 56 -72 80 136 -216 136 136 -160 152 96 -248 248 248 -248 216 152 -200 32 32 -104 80 136 -80 120 224 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/gardevoirite.pal b/graphics/items/icon_palettes/gardevoirite.pal deleted file mode 100755 index c71a12daf7..0000000000 --- a/graphics/items/icon_palettes/gardevoirite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -88 192 120 -168 112 120 -192 48 104 -176 192 232 -160 224 192 -160 168 152 -184 120 168 -248 248 248 -80 184 112 -144 200 160 -208 208 248 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/gengarite.pal b/graphics/items/icon_palettes/gengarite.pal deleted file mode 100755 index 307b1a3b1e..0000000000 --- a/graphics/items/icon_palettes/gengarite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -96 56 200 -152 56 144 -208 56 80 -184 144 224 -192 184 248 -200 96 152 -248 248 248 -72 32 208 -144 96 208 -192 192 248 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/ghost_gem.pal b/graphics/items/icon_palettes/ghost_gem.pal deleted file mode 100755 index 6068c4d2b0..0000000000 --- a/graphics/items/icon_palettes/ghost_gem.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -32 32 32 -104 80 184 -104 104 216 -80 64 152 -136 136 224 -56 48 112 -32 40 80 -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/items/icon_palettes/glalitite.pal b/graphics/items/icon_palettes/glalitite.pal deleted file mode 100755 index 6cd95b0d82..0000000000 --- a/graphics/items/icon_palettes/glalitite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -208 216 232 -104 112 112 -56 56 56 -152 200 216 -152 152 152 -128 136 144 -248 248 248 -64 152 184 -56 104 120 -136 184 208 -96 168 192 -56 96 112 -64 128 152 -0 0 0 diff --git a/graphics/items/icon_palettes/grass_gem.pal b/graphics/items/icon_palettes/grass_gem.pal deleted file mode 100755 index 02412f988e..0000000000 --- a/graphics/items/icon_palettes/grass_gem.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -32 32 32 -96 248 120 -184 248 176 -64 200 80 -232 248 224 -56 184 88 -0 144 48 -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/items/icon_palettes/grassy_seed.pal b/graphics/items/icon_palettes/grassy_seed.pal deleted file mode 100755 index 2f1acee397..0000000000 --- a/graphics/items/icon_palettes/grassy_seed.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -49 49 49 -139 172 82 -197 230 90 -172 197 90 -238 246 197 -156 106 16 -65 74 24 -205 139 24 -238 189 41 -106 90 74 -106 148 82 -246 222 123 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/grip_claw.pal b/graphics/items/icon_palettes/grip_claw.pal deleted file mode 100755 index ee28f992aa..0000000000 --- a/graphics/items/icon_palettes/grip_claw.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -39 39 39 -77 77 77 -247 247 247 -177 212 212 -117 142 142 -61 85 69 -69 101 85 -134 159 159 -101 134 109 -126 151 134 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/griseous_orb.pal b/graphics/items/icon_palettes/griseous_orb.pal deleted file mode 100755 index 29b8f77048..0000000000 --- a/graphics/items/icon_palettes/griseous_orb.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -49 49 49 -123 99 33 -255 255 255 -214 189 24 -255 247 206 -247 231 140 -222 198 57 -156 132 33 -206 181 41 -173 140 24 -189 156 41 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/ground_gem.pal b/graphics/items/icon_palettes/ground_gem.pal deleted file mode 100755 index cbdd4efd6d..0000000000 --- a/graphics/items/icon_palettes/ground_gem.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -32 32 32 -184 128 56 -200 160 80 -160 104 32 -224 192 128 -112 64 16 -104 56 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 diff --git a/graphics/items/icon_palettes/gyaradosite.pal b/graphics/items/icon_palettes/gyaradosite.pal deleted file mode 100755 index f485d4ef3c..0000000000 --- a/graphics/items/icon_palettes/gyaradosite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -40 96 240 -152 56 112 -208 32 48 -192 144 0 -144 168 248 -248 168 168 -200 88 24 -248 248 248 -16 64 232 -120 120 120 -208 184 152 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/heat_rock.pal b/graphics/items/icon_palettes/heat_rock.pal deleted file mode 100755 index c5b91232df..0000000000 --- a/graphics/items/icon_palettes/heat_rock.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -39 39 39 -247 203 212 -247 142 177 -212 85 117 -247 109 151 -142 109 93 -168 134 117 -220 194 185 -212 177 159 -185 61 85 -177 93 93 -101 77 69 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/heracronite.pal b/graphics/items/icon_palettes/heracronite.pal deleted file mode 100755 index 6877ae795d..0000000000 --- a/graphics/items/icon_palettes/heracronite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -80 80 112 -208 64 8 -248 80 32 -248 216 56 -168 184 184 -248 152 128 -248 152 40 -248 248 248 -32 56 96 -208 160 0 -232 248 184 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/honey.pal b/graphics/items/icon_palettes/honey.pal deleted file mode 100644 index c5219f932a..0000000000 --- a/graphics/items/icon_palettes/honey.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -48 48 48 -120 80 32 -200 112 0 -80 152 152 -232 144 0 -96 184 192 -248 184 72 -248 240 184 -216 248 248 -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/items/icon_palettes/houndoominite.pal b/graphics/items/icon_palettes/houndoominite.pal deleted file mode 100755 index 25f151408a..0000000000 --- a/graphics/items/icon_palettes/houndoominite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -96 80 88 -184 40 48 -248 32 32 -136 104 112 -184 160 160 -248 144 144 -192 64 72 -248 248 248 -56 56 64 -120 88 96 -152 144 168 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/ice_gem.pal b/graphics/items/icon_palettes/ice_gem.pal deleted file mode 100755 index dda74d5894..0000000000 --- a/graphics/items/icon_palettes/ice_gem.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -32 32 32 -104 232 232 -168 248 248 -48 208 248 -232 248 248 -24 176 248 -0 152 200 -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/items/icon_palettes/icicle_plate.pal b/graphics/items/icon_palettes/icicle_plate.pal deleted file mode 100755 index b1c45e523a..0000000000 --- a/graphics/items/icon_palettes/icicle_plate.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -40 40 40 -138 201 192 -209 246 255 -228 246 246 -173 237 237 -56 156 147 -63 122 104 -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/items/icon_palettes/icy_rock.pal b/graphics/items/icon_palettes/icy_rock.pal deleted file mode 100755 index 27f6fbc234..0000000000 --- a/graphics/items/icon_palettes/icy_rock.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -39 39 39 -185 247 247 -126 203 238 -229 247 247 -77 177 220 -54 142 185 -117 134 168 -185 126 93 -134 93 61 -151 101 69 -229 185 159 -142 159 194 -229 168 142 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/insect_plate.pal b/graphics/items/icon_palettes/insect_plate.pal deleted file mode 100755 index 65f65b4bfb..0000000000 --- a/graphics/items/icon_palettes/insect_plate.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -40 40 40 -173 218 104 -246 255 147 -246 246 173 -201 246 112 -130 173 26 -96 138 18 -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/items/icon_palettes/iron_ball.pal b/graphics/items/icon_palettes/iron_ball.pal deleted file mode 100755 index 4e3ff78911..0000000000 --- a/graphics/items/icon_palettes/iron_ball.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -39 39 39 -46 77 69 -69 109 101 -54 93 85 -77 126 126 -77 177 151 -177 238 220 -247 247 247 -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/items/icon_palettes/iron_plate.pal b/graphics/items/icon_palettes/iron_plate.pal deleted file mode 100755 index 4885bc46cf..0000000000 --- a/graphics/items/icon_palettes/iron_plate.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -136 136 136 -208 208 208 -232 232 232 -176 176 176 -120 120 120 -104 104 104 -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/items/icon_palettes/lagging_tail.pal b/graphics/items/icon_palettes/lagging_tail.pal deleted file mode 100755 index 8e2a0b1d50..0000000000 --- a/graphics/items/icon_palettes/lagging_tail.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -39 39 39 -229 229 229 -203 203 203 -142 142 142 -101 101 101 -61 61 61 -0 0 0 -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/items/icon_palettes/latiasite.pal b/graphics/items/icon_palettes/latiasite.pal deleted file mode 100755 index f93e6a5053..0000000000 --- a/graphics/items/icon_palettes/latiasite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -144 128 216 -192 80 152 -248 48 56 -184 184 248 -216 120 152 -184 192 248 -248 248 248 -248 160 208 -136 96 208 -160 160 240 -240 232 240 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/latiosite.pal b/graphics/items/icon_palettes/latiosite.pal deleted file mode 100755 index 16c3521ad5..0000000000 --- a/graphics/items/icon_palettes/latiosite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -144 128 216 -88 112 224 -40 128 240 -184 184 248 -112 160 248 -184 192 248 -248 248 248 -128 184 232 -136 96 208 -160 160 240 -240 232 240 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/life_orb.pal b/graphics/items/icon_palettes/life_orb.pal deleted file mode 100755 index e670c6c2d4..0000000000 --- a/graphics/items/icon_palettes/life_orb.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -39 39 39 -212 168 238 -220 54 220 -238 177 238 -247 247 247 -185 39 194 -247 101 101 -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/items/icon_palettes/light_clay.pal b/graphics/items/icon_palettes/light_clay.pal deleted file mode 100755 index 02a4a90fbd..0000000000 --- a/graphics/items/icon_palettes/light_clay.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -39 39 39 -126 177 69 -177 220 109 -93 117 54 -212 238 185 -247 247 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 diff --git a/graphics/items/icon_palettes/lopunnite.pal b/graphics/items/icon_palettes/lopunnite.pal deleted file mode 100755 index 1815667bb4..0000000000 --- a/graphics/items/icon_palettes/lopunnite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -248 240 184 -72 56 56 -160 96 80 -248 248 248 -104 64 56 -200 168 160 -160 152 120 -160 152 152 -128 72 56 -112 80 64 -176 128 104 -200 168 136 -128 104 88 -0 0 0 diff --git a/graphics/items/icon_palettes/lucarionite.pal b/graphics/items/icon_palettes/lucarionite.pal deleted file mode 100755 index 22e0961a7b..0000000000 --- a/graphics/items/icon_palettes/lucarionite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -112 152 208 -120 88 120 -136 32 32 -248 176 96 -160 192 200 -176 120 128 -192 120 64 -248 248 248 -72 136 176 -184 192 176 -208 208 224 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/lustrous_orb.pal b/graphics/items/icon_palettes/lustrous_orb.pal deleted file mode 100755 index 28df1d804f..0000000000 --- a/graphics/items/icon_palettes/lustrous_orb.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -69 69 69 -39 39 39 -117 212 220 -203 238 238 -247 247 247 -151 212 238 -168 203 229 -134 194 229 -168 194 229 -151 185 229 -220 185 238 -247 238 238 -247 212 229 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/manectite.pal b/graphics/items/icon_palettes/manectite.pal deleted file mode 100755 index 860c8d0a39..0000000000 --- a/graphics/items/icon_palettes/manectite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -96 168 208 -136 104 120 -224 56 56 -248 248 128 -176 200 224 -248 152 128 -224 152 72 -248 248 248 -72 152 192 -192 200 136 -240 240 240 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/mawilite.pal b/graphics/items/icon_palettes/mawilite.pal deleted file mode 100755 index 688d41649f..0000000000 --- a/graphics/items/icon_palettes/mawilite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -112 96 112 -200 184 112 -200 120 168 -192 192 192 -248 248 96 -224 184 136 -248 248 248 -224 216 120 -64 64 80 -152 104 136 -176 176 208 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/meadow_plate.pal b/graphics/items/icon_palettes/meadow_plate.pal deleted file mode 100755 index 2d97a86191..0000000000 --- a/graphics/items/icon_palettes/meadow_plate.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -40 40 40 -56 192 63 -138 237 130 -173 255 147 -104 228 88 -63 138 63 -63 112 56 -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/items/icon_palettes/medichamite.pal b/graphics/items/icon_palettes/medichamite.pal deleted file mode 100755 index f8b973bc3e..0000000000 --- a/graphics/items/icon_palettes/medichamite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -192 88 136 -224 96 80 -248 136 56 -120 176 208 -248 168 168 -184 160 136 -248 248 248 -192 32 104 -160 136 176 -176 200 192 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/mega_bracelet.pal b/graphics/items/icon_palettes/mega_bracelet.pal deleted file mode 100755 index 8f34e18a12..0000000000 --- a/graphics/items/icon_palettes/mega_bracelet.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -144 160 176 -88 112 128 -200 216 216 -64 80 96 -240 240 240 -176 72 152 -208 112 216 -32 112 24 -88 192 224 -96 200 80 -72 88 192 -184 200 80 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/metagrossite.pal b/graphics/items/icon_palettes/metagrossite.pal deleted file mode 100755 index d7115db596..0000000000 --- a/graphics/items/icon_palettes/metagrossite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -160 168 144 -152 192 216 -200 200 200 -232 200 168 -232 232 232 -160 192 208 -128 184 208 -248 248 248 -216 152 80 -216 184 136 -160 160 144 -208 216 232 -176 160 128 -176 176 184 diff --git a/graphics/items/icon_palettes/metronome.pal b/graphics/items/icon_palettes/metronome.pal deleted file mode 100755 index 0294d8b6cb..0000000000 --- a/graphics/items/icon_palettes/metronome.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -39 39 39 -39 69 85 -159 203 229 -109 177 220 -77 142 168 -54 93 61 -77 126 93 -177 229 229 -247 247 247 -126 185 220 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/mewtwonite_x.pal b/graphics/items/icon_palettes/mewtwonite_x.pal deleted file mode 100755 index f1db0ba0c4..0000000000 --- a/graphics/items/icon_palettes/mewtwonite_x.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -152 80 128 -88 80 120 -48 112 136 -192 192 192 -216 176 216 -160 184 192 -120 152 168 -248 248 248 -128 56 104 -216 216 224 -192 160 184 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/mewtwonite_y.pal b/graphics/items/icon_palettes/mewtwonite_y.pal deleted file mode 100755 index c693248837..0000000000 --- a/graphics/items/icon_palettes/mewtwonite_y.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -152 80 128 -160 80 136 -184 112 168 -192 192 192 -216 176 216 -192 152 184 -248 248 248 -128 56 104 -216 216 224 -192 160 184 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/mind_plate.pal b/graphics/items/icon_palettes/mind_plate.pal deleted file mode 100755 index 583a524b66..0000000000 --- a/graphics/items/icon_palettes/mind_plate.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -40 40 40 -209 122 138 -246 209 209 -246 237 228 -255 173 165 -201 104 96 -201 88 88 -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/items/icon_palettes/misty_seed.pal b/graphics/items/icon_palettes/misty_seed.pal deleted file mode 100755 index 8957472cf4..0000000000 --- a/graphics/items/icon_palettes/misty_seed.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -49 49 49 -98 123 189 -205 230 255 -139 189 255 -238 246 197 -156 106 16 -65 74 115 -205 139 24 -238 189 41 -106 90 74 -82 82 156 -246 222 123 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/muscle_band.pal b/graphics/items/icon_palettes/muscle_band.pal deleted file mode 100755 index e93f6f6ddf..0000000000 --- a/graphics/items/icon_palettes/muscle_band.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -39 39 39 -168 142 32 -247 247 151 -229 203 39 -126 109 61 -56 56 56 -247 109 109 -203 177 18 -203 93 18 -203 25 25 -238 54 54 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/normal_gem.pal b/graphics/items/icon_palettes/normal_gem.pal deleted file mode 100755 index 8cd17447e6..0000000000 --- a/graphics/items/icon_palettes/normal_gem.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -32 32 32 -224 184 184 -240 208 208 -192 176 176 -248 248 248 -168 160 160 -144 144 144 -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/items/icon_palettes/pidgeotite.pal b/graphics/items/icon_palettes/pidgeotite.pal deleted file mode 100755 index 5f81a5b2c4..0000000000 --- a/graphics/items/icon_palettes/pidgeotite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -240 144 72 -192 120 152 -216 64 112 -240 192 128 -232 152 144 -224 104 88 -248 248 248 -240 232 120 -232 152 112 -240 192 96 -248 216 192 -240 168 80 -168 128 152 -240 184 88 diff --git a/graphics/items/icon_palettes/pinsirite.pal b/graphics/items/icon_palettes/pinsirite.pal deleted file mode 100755 index 0a0fb5fbef..0000000000 --- a/graphics/items/icon_palettes/pinsirite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -152 120 112 -192 104 56 -248 80 32 -248 208 56 -200 176 152 -248 144 40 -248 248 248 -248 192 152 -128 96 88 -200 168 80 -248 248 224 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/pixie_plate.pal b/graphics/items/icon_palettes/pixie_plate.pal deleted file mode 100755 index b7559b5751..0000000000 --- a/graphics/items/icon_palettes/pixie_plate.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -240 176 200 -248 208 248 -248 224 248 -248 192 224 -208 144 200 -192 112 160 -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/items/icon_palettes/poison_gem.pal b/graphics/items/icon_palettes/poison_gem.pal deleted file mode 100755 index da63d2f248..0000000000 --- a/graphics/items/icon_palettes/poison_gem.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -32 32 32 -152 104 168 -192 176 200 -104 96 136 -232 248 224 -56 104 104 -40 72 72 -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/items/icon_palettes/power_herb.pal b/graphics/items/icon_palettes/power_herb.pal deleted file mode 100755 index 09501f4812..0000000000 --- a/graphics/items/icon_palettes/power_herb.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -151 69 69 -39 39 39 -229 109 109 -229 46 46 -168 39 39 -212 61 61 -194 61 61 -177 77 77 -238 93 93 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/protective_pads.pal b/graphics/items/icon_palettes/protective_pads.pal deleted file mode 100755 index 604b7b85a6..0000000000 --- a/graphics/items/icon_palettes/protective_pads.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -49 49 49 -205 222 238 -172 189 213 -131 156 180 -98 106 164 -106 123 131 -148 156 164 -255 255 255 -213 213 205 -172 180 180 -74 82 90 -131 148 197 -74 90 148 -98 98 123 -156 172 205 diff --git a/graphics/items/icon_palettes/psychic_gem.pal b/graphics/items/icon_palettes/psychic_gem.pal deleted file mode 100755 index c9f2839e65..0000000000 --- a/graphics/items/icon_palettes/psychic_gem.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -32 32 32 -248 104 176 -248 160 192 -208 56 136 -248 216 208 -160 32 136 -112 0 104 -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/items/icon_palettes/psychic_seed.pal b/graphics/items/icon_palettes/psychic_seed.pal deleted file mode 100755 index 0fd91e0da7..0000000000 --- a/graphics/items/icon_palettes/psychic_seed.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -49 49 49 -172 98 189 -255 205 255 -197 139 197 -238 246 197 -156 106 16 -65 74 24 -205 139 24 -238 189 41 -106 90 74 -115 65 123 -246 222 123 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/quick_powder.pal b/graphics/items/icon_palettes/quick_powder.pal deleted file mode 100755 index 39410ad529..0000000000 --- a/graphics/items/icon_palettes/quick_powder.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -49 49 49 -156 156 156 -214 214 214 -255 255 255 -239 239 239 -90 90 90 -181 214 255 -123 189 239 -74 107 173 -115 156 206 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/rock_gem.pal b/graphics/items/icon_palettes/rock_gem.pal deleted file mode 100755 index 3821017666..0000000000 --- a/graphics/items/icon_palettes/rock_gem.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -32 32 32 -184 144 120 -216 200 176 -136 112 88 -232 224 200 -112 88 72 -80 64 48 -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/items/icon_palettes/sablenite.pal b/graphics/items/icon_palettes/sablenite.pal deleted file mode 100755 index e270a912a2..0000000000 --- a/graphics/items/icon_palettes/sablenite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -224 40 88 -168 64 120 -120 88 152 -248 216 120 -184 168 200 -168 136 144 -240 144 168 -248 248 248 -240 144 104 -240 232 240 -232 104 96 -232 104 136 -192 80 152 -0 0 0 diff --git a/graphics/items/icon_palettes/safety_goggles.png b/graphics/items/icon_palettes/safety_goggles.png deleted file mode 100755 index 7a1efab67adffd72893d7ab8383ab500014ac898..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 386 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xu?EJb+&fI^cfkNUX zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0=j-CMiXDcR}&wQFMZL`gH zTyQQ}$I+*H{O!E5BC8#H8k}CONhoK1x%tPGW3T3J{^$L#-{D8nnfs1MvR?I_5NC3E zF1WV7boW!a(n;%bd_*EvuH)IFdD5~VH7j3X+3DDo@{XHKdS){z9j|#2CTx?}eemVh zNTt@-eb%j(iQ1L&6|pP{nnhV`|HC#5oxFHlL}%rl4Bq?fb!UYg?Ui`$+~0f> KKbLh*2~7ZYQHg>8 diff --git a/graphics/items/icon_palettes/salamencite.pal b/graphics/items/icon_palettes/salamencite.pal deleted file mode 100755 index 315807ba5d..0000000000 --- a/graphics/items/icon_palettes/salamencite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -192 192 192 -16 112 152 -8 144 184 -240 168 168 -128 192 216 -96 168 192 -248 248 248 -224 88 88 -120 112 136 -200 168 168 -232 232 232 -208 136 136 -24 112 136 -176 72 72 diff --git a/graphics/items/icon_palettes/sceptilite.pal b/graphics/items/icon_palettes/sceptilite.pal deleted file mode 100755 index 579e9c4198..0000000000 --- a/graphics/items/icon_palettes/sceptilite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -80 96 80 -184 40 48 -248 32 32 -128 160 104 -168 192 160 -248 160 152 -192 96 64 -248 248 248 -64 64 64 -96 120 88 -192 208 120 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/scizorite.pal b/graphics/items/icon_palettes/scizorite.pal deleted file mode 100755 index abcba6719a..0000000000 --- a/graphics/items/icon_palettes/scizorite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -168 80 104 -104 32 24 -56 56 56 -168 216 224 -200 160 168 -144 144 144 -112 136 144 -248 248 248 -152 8 0 -168 144 168 -248 248 224 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/sharpedonite.pal b/graphics/items/icon_palettes/sharpedonite.pal deleted file mode 100755 index ac7dd92e89..0000000000 --- a/graphics/items/icon_palettes/sharpedonite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -200 200 224 -208 168 72 -248 216 120 -160 192 216 -248 232 184 -224 208 176 -248 248 248 -32 112 168 -144 168 144 -144 168 208 -232 232 240 -112 160 200 -208 192 136 -136 168 200 diff --git a/graphics/items/icon_palettes/shed_shell.pal b/graphics/items/icon_palettes/shed_shell.pal deleted file mode 100755 index 6fb36dd9d5..0000000000 --- a/graphics/items/icon_palettes/shed_shell.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -39 39 39 -229 238 101 -247 247 247 -220 194 109 -159 142 46 -185 168 69 -203 177 61 -117 117 85 -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/items/icon_palettes/shock_drive.pal b/graphics/items/icon_palettes/shock_drive.pal deleted file mode 100755 index 1d7d83eb55..0000000000 --- a/graphics/items/icon_palettes/shock_drive.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -144 104 32 -248 216 0 -216 128 16 -248 144 16 -248 168 0 -0 0 0 -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/items/icon_palettes/sky_plate.pal b/graphics/items/icon_palettes/sky_plate.pal deleted file mode 100755 index 3c7b1e3f0e..0000000000 --- a/graphics/items/icon_palettes/sky_plate.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -40 40 40 -26 165 218 -88 209 237 -112 246 255 -63 192 255 -26 130 173 -33 104 156 -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/items/icon_palettes/slowbronite.pal b/graphics/items/icon_palettes/slowbronite.pal deleted file mode 100755 index 41785ae70c..0000000000 --- a/graphics/items/icon_palettes/slowbronite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -184 200 184 -224 184 80 -240 232 128 -248 184 192 -240 240 184 -216 216 152 -248 248 248 -240 128 136 -240 176 128 -200 176 168 -224 232 232 -224 152 152 -216 192 128 -216 96 104 diff --git a/graphics/items/icon_palettes/smooth_rock.pal b/graphics/items/icon_palettes/smooth_rock.pal deleted file mode 100755 index ccb7076fae..0000000000 --- a/graphics/items/icon_palettes/smooth_rock.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -39 39 39 -247 229 134 -247 247 220 -238 212 85 -203 142 54 -212 168 11 -185 126 93 -229 168 142 -142 93 69 -117 77 54 -229 185 159 -168 134 25 -212 151 46 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/splash_plate.pal b/graphics/items/icon_palettes/splash_plate.pal deleted file mode 100755 index cc529d3455..0000000000 --- a/graphics/items/icon_palettes/splash_plate.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -40 40 40 -56 96 201 -122 173 255 -147 192 255 -96 138 255 -33 63 138 -0 0 0 -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/items/icon_palettes/spooky_plate.pal b/graphics/items/icon_palettes/spooky_plate.pal deleted file mode 100755 index fffede5bc1..0000000000 --- a/graphics/items/icon_palettes/spooky_plate.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -40 40 40 -112 122 138 -165 173 182 -192 192 209 -138 130 165 -104 104 104 -88 88 88 -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/items/icon_palettes/steel_gem.pal b/graphics/items/icon_palettes/steel_gem.pal deleted file mode 100755 index bd03865343..0000000000 --- a/graphics/items/icon_palettes/steel_gem.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -32 32 32 -136 136 152 -184 184 200 -96 96 96 -232 232 248 -88 88 88 -0 0 0 -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/items/icon_palettes/steelixite.pal b/graphics/items/icon_palettes/steelixite.pal deleted file mode 100755 index f0b9626fcd..0000000000 --- a/graphics/items/icon_palettes/steelixite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -144 152 176 -160 168 192 -200 232 240 -128 200 240 -176 192 208 -248 248 248 -8 152 224 -104 192 232 -112 152 192 -200 208 216 -72 152 200 -176 200 216 -152 192 216 -0 0 0 diff --git a/graphics/items/icon_palettes/sticky_barb.pal b/graphics/items/icon_palettes/sticky_barb.pal deleted file mode 100755 index a179f618f6..0000000000 --- a/graphics/items/icon_palettes/sticky_barb.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -39 39 39 -185 229 229 -109 177 194 -77 126 142 -238 247 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 diff --git a/graphics/items/icon_palettes/stone_plate.pal b/graphics/items/icon_palettes/stone_plate.pal deleted file mode 100755 index c67cde98d2..0000000000 --- a/graphics/items/icon_palettes/stone_plate.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -40 40 40 -173 156 130 -228 218 173 -237 237 192 -209 182 138 -156 130 63 -138 96 63 -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/items/icon_palettes/swampertite.pal b/graphics/items/icon_palettes/swampertite.pal deleted file mode 100755 index a35c06e7e0..0000000000 --- a/graphics/items/icon_palettes/swampertite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -232 104 88 -96 128 144 -72 80 88 -112 176 216 -232 168 160 -176 208 224 -104 144 168 -248 248 248 -168 104 104 -176 144 152 -136 160 192 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/terrain_extender.pal b/graphics/items/icon_palettes/terrain_extender.pal deleted file mode 100755 index 2ae8d133e8..0000000000 --- a/graphics/items/icon_palettes/terrain_extender.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -49 49 49 -180 197 197 -123 139 139 -74 82 82 -255 255 255 -213 230 230 -49 106 106 -74 148 164 -131 213 213 -222 123 106 -222 65 41 -172 57 49 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/toxic_orb.pal b/graphics/items/icon_palettes/toxic_orb.pal deleted file mode 100755 index c4ddda687e..0000000000 --- a/graphics/items/icon_palettes/toxic_orb.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -39 39 39 -168 142 247 -185 85 229 -212 101 238 -159 69 212 -142 61 212 -229 177 238 -247 247 247 -117 54 212 -101 32 212 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/toxic_plate.pal b/graphics/items/icon_palettes/toxic_plate.pal deleted file mode 100755 index 733aae9c7b..0000000000 --- a/graphics/items/icon_palettes/toxic_plate.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -40 40 40 -182 88 228 -209 156 237 -246 173 246 -192 122 255 -147 79 201 -112 56 192 -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/items/icon_palettes/tyranitarite.pal b/graphics/items/icon_palettes/tyranitarite.pal deleted file mode 100755 index 579e9c4198..0000000000 --- a/graphics/items/icon_palettes/tyranitarite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -80 96 80 -184 40 48 -248 32 32 -128 160 104 -168 192 160 -248 160 152 -192 96 64 -248 248 248 -64 64 64 -96 120 88 -192 208 120 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/venusaurite.pal b/graphics/items/icon_palettes/venusaurite.pal deleted file mode 100755 index 3aadc10929..0000000000 --- a/graphics/items/icon_palettes/venusaurite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -48 48 48 -24 128 128 -184 72 136 -248 80 192 -96 168 200 -152 192 168 -176 152 184 -176 128 200 -248 248 248 -16 104 72 -40 144 184 -120 216 216 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/water_gem.pal b/graphics/items/icon_palettes/water_gem.pal deleted file mode 100755 index 586db9a6e4..0000000000 --- a/graphics/items/icon_palettes/water_gem.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -32 32 32 -64 160 248 -120 200 248 -48 144 248 -208 248 248 -0 120 208 -0 80 200 -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/items/icon_palettes/wide_lens.pal b/graphics/items/icon_palettes/wide_lens.pal deleted file mode 100755 index cedef34fa0..0000000000 --- a/graphics/items/icon_palettes/wide_lens.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -39 39 39 -220 151 101 -212 101 39 -117 39 18 -247 247 247 -85 85 85 -11 126 151 -18 194 247 -151 151 151 -168 54 25 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icon_palettes/wise_glasses.pal b/graphics/items/icon_palettes/wise_glasses.pal deleted file mode 100755 index 1d03864d74..0000000000 --- a/graphics/items/icon_palettes/wise_glasses.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -61 54 61 -39 39 39 -85 77 85 -247 247 247 -85 134 134 -159 247 247 -126 194 194 -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/items/icon_palettes/zap_plate.pal b/graphics/items/icon_palettes/zap_plate.pal deleted file mode 100755 index 074a89879d..0000000000 --- a/graphics/items/icon_palettes/zap_plate.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -40 40 40 -237 156 63 -246 218 112 -246 228 130 -255 192 88 -173 112 40 -130 96 33 -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/items/icon_palettes/zoom_lens.pal b/graphics/items/icon_palettes/zoom_lens.pal deleted file mode 100755 index ff950851c0..0000000000 --- a/graphics/items/icon_palettes/zoom_lens.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 0 128 -39 39 39 -238 220 126 -185 177 46 -85 85 46 -203 61 61 -134 32 32 -142 134 77 -101 185 247 -247 247 247 -229 126 126 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/items/icons/Kangaskhanite.png b/graphics/items/icons/Kangaskhanite.png deleted file mode 100755 index 2b614703e38d2771cc6eec04b53e3bccf1098b47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pTV1_nD8{8-Siq9GyS$Bl{`2Y#Gbap1s$j2}OK>{#&P#(^C_KKzhNnEDT>g|Q^a zFPOpM*^M+HC&|;rF+}2Wa>4>G0TGuZZR^98J&CGv3z-7?GM<%8zviIQ$3Eq-#4erF zM_E_(8J1kt5*81aNWZ@7Xu-LQ3qn`N)GRpG$+XlbVcE$RwzWof9Gk!Ryik&6+);c^ fgFC5QLzRKyvaBR~i{&I~pluAEu6{1-oD!MiJoBT9tHtq4H-t_l zhJ4B}G;3Rx98y%sX=c_`IBmy{Lza%O^z@D`3wYep5OlIJ;IhlqE3uanWR3->eh-WMz*q+lin>#G7cUidHZ06Eyx)z4*}Q$iB}1-50} diff --git a/graphics/items/icons/absolite.png b/graphics/items/icons/absolite.png deleted file mode 100755 index 786aab073225147f5a5ff59dc5f810b27c623796..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}H0G|-o z{|pTV1_lus3ubJ1@#Dvj2@5WqxbeZkqoZNMfde-_yooS>0946X666=m;PC858jzFd z>Eak7aXC3*0hfS?OOm$r;mV$6ih0MF0{RL%W_xc^6gtj(D$zubx4f`%RkDemetuzL zTj8zK+7ITObbI<#Z(hLTmc}4m;f2dQrKG2BKWNco+}oYTbzrV>u(QB!XH7Ec0 U^QIsD4YZ8G)78&qol`;+0B1>2zW@LL diff --git a/graphics/items/icons/adamant_orb.png b/graphics/items/icons/adamant_orb.png deleted file mode 100755 index 5e4f6b2995ea9b0d796ea1f183203b7ccc972b56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 321 zcmV-H0lxl;P)&B_#j=00DGT zPE!Ct=GbNc006;BL_t&-83nM-RimDYiqv#*j#JZ1EIawKc9SL12>oJFvLr+v*M|O9 zQp-Mx_{o*ru_hj;eTp2$Ep1H|DeGW={irl;qG;7sicb+!STOp;xgNIfik=48!T__x$`$g=zoC008h0(%C~g TqLtZc00000NkvXXu0mjfa{h|H diff --git a/graphics/items/icons/adrenaline_orb.png b/graphics/items/icons/adrenaline_orb.png deleted file mode 100755 index 913366e1184cec9101f14d1cd1b73570b8ff35af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}H0G|-o z{|pU=hK8Ds#ZhbSSw>CCI{L2q*|(r6dxMIXSZ1yHeWT?+P$gqYkY6x^!?PP{Ku(LN zi(`ny<>Ukf29^nyJrV%$su})q-&@jQ85wG6Xs$Q=rfoh8^ig`U=|x=qve$sMWLag zsb4z<#5<-pGh8X`x!m}svmpHZ981BI{7p;}2bmaZCM%{~n#b%1bPt24tDnm{r-UW| DN_5e^Lt0$yC$@#4pi9~A{13l^+c(eMGN90HV_U7dg|fs!D<;QtK&QNYEbXgQ!9 zXMsm#F#`kN5fEmas?8@26io7TaSV}|nw+qJOF+aWY5L5Al|53k*G^$sAhYn?&12mn z6D`65_!duc@7`z_BD;7}xA&%vf<47Yj`E)43@R@)G;5VoXPM&FHdAfYl6RBDI5wMv noU|29(`-)2klgfm!i_0F%i09r*BoNH4|1rdtDnm{r-UW|x8Y-6 diff --git a/graphics/items/icons/aggronite.png b/graphics/items/icons/aggronite.png deleted file mode 100755 index db5dab16fb579217673407709a109129e7a82f50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pTV1_lcjEU2ich=_=|aN);=3l~nDI5A_!iXT6I%$PCbz<~oVUc4}S6aEgUg|Q^a zFPOpM*^M+HC&|;rF+}2Wa>4>G0TGuZZR^98J&CGv3z-7?GM<%8zviIQ$3Eq-#4erF zM_E_(8J1kt5*81aNWZ@7Xu-LQ3qn`N)GRpG$+XlbVcE$RwzWof9Gk!Ryik&6+);c^ fgFC5QLzRKyvaBR~i{&I~pluAEu6{1-oD!MNS%G|&0G|-o z{|pTV1_mE?L~N*-F(G2bfeSZoTsU!I!HE?!4*dA>%lD75X%AQ13xrIyteHqV6reAYV>0_UASYnsX>7%Tx z`V331Y6**nOQc_4b+q8zl?9=zV{8^4>ttH$ld#OQjcu*bJdVvJX)lz#8Fv(?X>li& cYp60X)F?<;q|}-?0c~UOboFyt=akR{027E*Bme*a diff --git a/graphics/items/icons/altarianite.png b/graphics/items/icons/altarianite.png deleted file mode 100755 index ca88b000290569e65a0458d3e66eb60f683600af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}T0G|-o z{|pTV1_m!y-00ZxA>+c22{(T1c<|xJj~@?!;J}RsJ8rNDEOG-XW-JNv3ubV5b|VeQ zN$_-W43W5;oUnjPK*S|U+xl>2&nm@pUQ7Xf0aYuzCn^aYmpqjil6AVEuyIv#$g39| zg@sLpX(d|@S^7rF%Ie7lJZ@NS%G}@0G|-o z{|pTV1_m!qSp2BSc;OIm;KYj`4`%$>FyltYf*(JAd^o{y<3z=c8#h`PGpqq>VJr#q z3ubV5b|VeQN%C}Y43W5;oUnjPK*S|U+xl>2PvT3tg-ii`8P80nUvp6DW1n(ZVwcY8 zqpYj?3`?$R35$nIq+efkwBX#u1)-~BY8D*pWLoNzuFVdQ&MBb@0PnF{@Bjb+ diff --git a/graphics/items/icons/assault_vest.png b/graphics/items/icons/assault_vest.png deleted file mode 100755 index c42928b8bf0680ab74e147e93555e6d1ac80b9aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}f0G|-o z{|pTV1_mbr0wx$(I5;>Ycm!;)aA^LtjuWVWu_VYZn8D%MjWi&q#nZ(xMB;MqnLw_? z3OsBNDwvIL-ka@kfAs|BE#KHaGps)RTRzcH?3;lE@1!Tp{~2O*+JDHJC&}swR5HA^ zepIU(w!@`bGxh1x|8+}ZP8AF12UcnKWzJDPSGl;+VYA7`J!x#u;#&>}?0ve_%Ujp4 vO=4%(Z~g<<6!mwrMTq-6U-#*6>^lBl73q}=R=dv!x`)Bj)z4*}Q$iB}teRQ- diff --git a/graphics/items/icons/audinite.png b/graphics/items/icons/audinite.png deleted file mode 100755 index 71aaf06af6efee6b73e6cf38f392f17bf8bc1bfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}r0G|-o z{|pTV1_nPqT-cFO@gk$+$BhRcHXQhH;KYXq7k>Qs@!`ad7bgxp*svNypz@Va!EmG=SQ+6>K`x=?Jy?o~~W2v$8 m*F3HRbB#Z*RVZr@Vq#FgCsw$pe19&`G6qjqKbLh*2~7aDvtxh& diff --git a/graphics/items/icons/banettite.png b/graphics/items/icons/banettite.png deleted file mode 100755 index 7b3565ba6b9f31a0adb6d242ddd7b2f61d0f5577..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pTV1_l8E0XJrF{5T=;VZw?3|NpCjxCl+w**s-G_L*d7dA2$v({CLnYp+X}fBB7$91E{H3UP%Z@36uo+1^;LGj{+_h zMau!@I14-?iy0XBj({-ZRBb+KpkT76i(`ny)Z~N(Tmm94N!bwxDtlhdUORUh?`;QVy4?ABVNS%G|m0G|-o{|pW4>gsjA+$&1;?i?yTJ>B>Fo#`M=IDqe`^{zlE#w2fd zm;X!IKOF^eN`m}?862M7NCR@VdAc};RLn`8uu<@^0*`B;8bj+2vm4Llrtk{9OHOE- z@Hd>}!RehHtN!<`*H=;e$Hk)YCo_bb{pQk^sU5{-vU#%}Pqu8^Is1{HWxi_Z{odyF zb21wGmh8Mx^hIv(&P@GzZU<%=Jby5a?*QX{)5uxT{O|OGl^-g(Z!%sebc-?P%yNNQ z9~)b=)ask;E?j$XaTOn*T+NP;Oy!!(%-Gx<+8sV~Djb>S*=6kLkh^Z%4+h!2d(JJ? btGy~NQ7ymWo{-cokheWu{an^LB{Ts5u@;T| diff --git a/graphics/items/icons/binding_band.png b/graphics/items/icons/binding_band.png deleted file mode 100755 index 9930640ef1f5f4004558b4faea9be7cc7a9781dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G~10G|-o z{|pTV1_m<{6m~RdoR|@?OlxilP>Qi6$S;_|;n|HeAScJu#W6%8d}`lC!2=2$&WX&9 z;uFdk&vWib{y%foiZ9#GhR-|5aKK)1>GjQ97{qq^wFFrmdKI;Vst0E84yVE_OC diff --git a/graphics/items/icons/black_sludge.png b/graphics/items/icons/black_sludge.png deleted file mode 100755 index 2e1fac755f6e1ebd387828cdb667b0172769013b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ3LaX4w*#fkNUX zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0w`{lmz(&GdMiEkp|>6d%8G=RLq&%f06gF0*}jKHkOslM~*NbaTn9@NqF@)Tyw&r zXPaNu{ye#F^Io0$Q){QTCL;09j{R`U~VKX=Hba4r&Ob=6vQ%QzNS%G|&0G|-o z{|pTV1_lW;K138WR74o;*s){7i5D|E3V!_f;n47*W5taN7cTH`o34>G0TGuZZR^98J&Bs{7BU6&Ww_1u&QuUOE_*7GXYRC@kC;M_ zOIQ^z>+II<*NS%G}@0G|-o z{|pTV1_n1G0vaqp;Kqp^A68sAuwq3=L&c9DKQ35UTv*ZZ;lqYE+D=D-S{O@${DK)A zp4~_Ta*{k<977~7Cnqf65)g4o(zZTa*^{U$w~#5IFXLIs^lJ_(ee6>XOYG7)eUx=o zpJB;WEn)F+iS+BMjuxD|xFB?OOwEF0olHx85|*88VOwit$Fcc~&kH4K#vR4yG`N$> cHB=cGF3U=?w^&Y+2HM8p>FVdQ&MBb@0D0_FvH$=8 diff --git a/graphics/items/icons/bug_gem.png b/graphics/items/icons/bug_gem.png deleted file mode 100755 index 0561d24d06f9617454c8abcf9c8cf48502a8f4ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xutl~my^Ivgp1qz9m zxJHx&=ckpFCl;kLxcj&OjZr8|EmAPnGbwCc@(`$mqolyk9VlZAWHWd*XvzaAmUKs7 zM+SzC{oH>NS%G|m0G|-o{|pTZ3JN=JWITAWVa5)HA3uI{ED$J|0MdpP?A%*c0hC}& z@^*Lmzm)ycQ4psj$S;_|;n|HeAg999#WAE}PIAHmrUVfdCPoc+kDE7ccnE4Grtq+w z6VOad7FP%`WAT=dW@VmgDc!t8Vs5B&Z|~F)p93I4yYdu7{8c6T`w+LKiEvy7EEJ N_H^}gS?83{1ONyPWs?8^ diff --git a/graphics/items/icons/burn_drive.png b/graphics/items/icons/burn_drive.png deleted file mode 100755 index c83fbd335896fb69b0d5bec7e57d911034dbdc17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGUB{?K2rPk0ENU$ zTq8- CnQR*X diff --git a/graphics/items/icons/cameruptite.png b/graphics/items/icons/cameruptite.png deleted file mode 100755 index f064b6da2eb4916d0b568f93fead1392a4a4e558..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G|m0G|-o z{|pTV1_nD;%&16+cu^2=;>3v$8x~yXsQB^Yhlhv5j0lez6FMF|c+gN$a3aE?Bfvpg zJzN>6m$4+sFPOpM*^M+HC&|;rF+}2Wa>4>G0TGuZZR^98J*za|c`*g_1-Q)io~R^r zT=rCA$SkRskC;M_uP`ZoCM2#dk^cNlWWhPbyEBbrYZe^iWL!G$fY0Q>OLKp|Q#f#c%3b=;;7@s&p_K4JYD@<);T3K0RZJ%TpIuY diff --git a/graphics/items/icons/charizardite_x.png b/graphics/items/icons/charizardite_x.png deleted file mode 100755 index a2986c638f52f6e870fc594c33f329a4bf004cbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G|&0G|-o z{|pTV1_l-m4ju_BJQ{v@?D(-@#)1teet0bS0R#>WGdf=U=vC^<0;*>$3GxeOaCmkj z4aiCKba4!kxSX7@fJ;EcB}v=*aAi-Ts@y`RfWC}pCDX4tsPwTUCDtHQZgnAL0M0iVfyyh0}TI5wA*ub8lv;g03*sjM5VrwB1H XM3)P#aFaL!@&JRUtDnm{r-UW|^At{; diff --git a/graphics/items/icons/charizardite_y.png b/graphics/items/icons/charizardite_y.png deleted file mode 100755 index f193100ed65ad9482efa57a97d2c8e63c96af687..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G|&0G|-o z{|pTV1_n1Y1b%E__;G>Z#*Bg&Cl0*WVe#X~j}sCMHxe9f9N1wXXZ8xHp0OmzFPOpM z*^M+HC&|;rF+}2Wa>4>G0TGuZZR^98J&Bs{7BU6&Ww_1u&QuUOE_*7GXYRC@kC;M_ zOIQ^z>+II<*3f52R}fXaDe?YH#h*L7?Zr+ zUH&g+|8x|@DGBlmW^j0RBMr#O^>lFzshG3&+(F(31s;dM8xB(p9Bwx3Vw81M*Vy!* zV_QPY>Q39e^M!(v>m*;R9e>kS$o^f5v1(;1^V_G>KD5j*dUkZi0e0pWVT%nOsV);c za#m`eK%r3fjj1cb3jf~@*6lAqd+3TQeOJD#tE(S+ z`dzPXBghyqNOArl0%R~IdAqy(U&{XJD2P)Me#DIX)%mUe2>P9foHse9QB^Lkhzgyi?jFmd|A4(r56V!X~{e+%Jr!aK@$B z*+;ikw@EgtE~_v}%P+T0V||p;7SR!!Z|K|0wDJ>=nfLm6IbvK!kxRGSG}u#A)MXrC zKY6$N>>J-sZBRby!1s7n=xUek)z5Z_H?K`hICJlv*sf}&BbhPRqIJ^W_cRqWuuY%7 zJHpYTd-e9|yDgmWoS6}~xBA(cfR4JAFQ+<~g`7U6si$|WEudL9UFz@+o*;*4ajt|m ZL55kG4!R#Dery5-f~TvW%Q~loCIC}|qm}>w diff --git a/graphics/items/icons/choice_specs.png b/graphics/items/icons/choice_specs.png deleted file mode 100755 index 6c64cb26e4aa3bd5210fa0e2b4a9c95955587586..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 369 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ3K1nRyd#1BJv( zTq8xqbooW}w~{gN6AXB_etU0@|DF+*t?yP*cd(v~h!35nIytPNRLYH)~ZGo`MY z#=d&mbS+VBBL>T1;TfI{LW zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0vB2xF4ByUYKj?4OQ;I3+=T!3+-1ZlnP@M?75|Ln`LPUO33ttiZz%@RK=kKg0e6 z5&Hu@KDK%nkKDcb^6rVsPKkHXXa3v{ED^7Mv~m#OJ}Q}+#juJOt@NGkToT{Ca++}LY)`Ws8&?PV&4mr8ms-Dp!$o%(gp%PWds ySL`_@Yr(NJ>G)Az(X8(;Yn_UGs&pRhSt_sc*(ma^*7oTjzk9m+xvXI4yYdu7{8c6GPi;fl9F+^T!~Ed%F6$ JtaD0e0ssy@T$2C* diff --git a/graphics/items/icons/destiny_knot.png b/graphics/items/icons/destiny_knot.png deleted file mode 100755 index ceeb38d5c782078a29da3a981d44577c7e81acde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 396 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ3J6ox3ZK0)@m& zTq8pNXh-*zQy!e<(jwecJsgQRyg9sTP6Q!OBm;cc7ek64o6$JXzt1QIL~5r zzQVE2KoJ?SL;m|3W?Wm<>X_M@^2`yV@f&A#{>gTe~ HDWM4f$Bl^Y diff --git a/graphics/items/icons/diancite.png b/graphics/items/icons/diancite.png deleted file mode 100755 index 5bb89f3eddd3a0434439ea8d0e5fb6ad9da619ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}50G|-o z{|pTV1_mDGGj~@>@R(#m8;KhamFBa^0up#3@L5JS@lM{iu z7)yfuf*Bm1-ADs+5&8&@TVym~R?(Ib|}YhJu)Del^0Z54B8;W19erF{o{gu^ervk2zcyd`Gk_Z3QDe%e64o;O+&Wzf|4u9cSvkl26BXG6o+N{c`SJW*o@1p00i_>zopr0O06t A>Hq)$ diff --git a/graphics/items/icons/draco_plate.png b/graphics/items/icons/draco_plate.png deleted file mode 100755 index 9b08c31c8df7bbd046af83623c1f118db34a6118..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ3Ls%=b2E0)@m& zTq8~0qFtt@f%n#_Yj_W2$-awlFmDUE7=0wBp*TXq#zD)8MZ$^c z!ajRRpEjwcvwPG&&l2yuo*_E__?+ShfnuRWYk=a6 zN#5=*|Ch3VItt>H1o;IsI6S+N2IN$Dx;TbZ%t=mIz?2}u!o;ZI?s4ItDW-Q(k(yYu=Ev1{6NX!j&?(Ll#;&VV|@`Vct%BrdzYKhk`1gNTtx_4xz zW$HbBsu|GT5*%~tv`C^JN0Fv~)6NFR5LP|LB4#J16{iJn-t`btVPaVLO6X#RR#!gA N)t;_?F6*2UngA#wWQPC% diff --git a/graphics/items/icons/dread_plate.png b/graphics/items/icons/dread_plate.png deleted file mode 100755 index f93493f97bbbe7afe74486d13afc8e0344776473..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ3J$#ampK0fod% zTq8u&z0S@&>UMwS{e^o16zwuK4ZOEbUBi1IOZHuagLzxP#pok34aE@>HV#@&ED}yk z7xvjp`m{+ko!z7Md6szJ^$gMZ$LADB7(dM47Bum@mk|r?80m1&hET zwxVZ?UT0?>b-Tav{=z*0iguZr2HsnzuHik9CHpSI!MrWtV)T)ihT;eb8wV{X76~V& z3;XOPecGg&&hAnBJWIUqdWPuy<8z85j34H23z~dx67#pG8JfkNUX zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0cyIzp{y4CLVaEcXGlO`h@^hRZ;hj%(P6s zr%yElx?6%{PMsD>)Z-}9^l#eP;26TH$5_Pd#I)kH;LW=pLMluQ3ttIctkCMp2f5qR L)z4*}Q$iB}gZgDV diff --git a/graphics/items/icons/electric_seed.png b/graphics/items/icons/electric_seed.png deleted file mode 100755 index cdcac30ae36c2044970ee3f726b481eb16b37857..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pU=hK5(CIDY#U^zEM4yKhJ5WC>&iIiBs7c(+$GE6Qt5l;O8~)pO6NtpRFbED7=p zW^j0RBMrz|>*?YcB5^r6VF6o$h=@Z$OOLFe(5ZuJOifJ+%N8t{v1y~{!Y<(e&E)4j zqR~Bb!%B8&7#Vn+3Atr=+co>#Nil)+NvBtZ?k-;&wK+?1!s16)i;IqS&5WIE%p!3l zM5}M!%%w|qCM}z!#QgY}Z2Gw~Mc?8KPu>*B*m7*nu|lLB8-uKx-Vs-^jk|yjXYh3Ob6Mw< G&;$U4jdeo+ diff --git a/graphics/items/icons/eviolite.png b/graphics/items/icons/eviolite.png deleted file mode 100755 index c08cc595068054e99a5c95b9de191a2550df20cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGU9w3TdgvhfI{LW zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0})Ul2=c4&a`RMcubp)>g-)(bC%_proO)Z;bVyfe){_UZITBjg~d%{+I~e?rEDQ{Oyn@Y1`T6=F7kRq+xvXV3!G+{THF{WzG2sYANGp3udja;Jjl|- z^r!R3xuXUt`xiSiZhv+Brf6{9a>LYj4U@KK?piQIrD!wL@ue&qj1QPT?ReT`I(1R0 zZJOimcT*xdYoA8XwrvYtY5i8=U}xEkeJc8G)$(uS7#{@Zx*rhojjlC|lV$4PmlM(9 m{eNbX(8=?UC%*VAsJ-vsKK``hwsYM;p7V6|b6Mw<&;$S|>U=W* diff --git a/graphics/items/icons/fairy_gem.png b/graphics/items/icons/fairy_gem.png deleted file mode 100755 index 871f74426d8ea309c3738acf32c8ecdc47c5760e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xutl~n#CnL{J0}6?k zxJHx&=ckpFCl;kLxcj&OjZr8|EmAPnGbwCc@(`$mqolyk9VlZAWHWd*XvzaAmUKs7 zM+SzC{oH>NS%G|m0G|-o{|pU=hKARt9{Bz2{iTYv|G)n~=sSJ8VFySbHel2B(iJGq znB?v5@_#A&r=uWFNswPKgTu2MX+Tber;B4q#hm1X1xyJdEKH0V?jAR9-0%?8N=)Hl zIVYf*m@KXkV8-GtA)l#~7iNxGc=ic6_AwCCWCSSOapscFep_X|4LV&8OsC!3d zTBhF9r1BJv( zTq8I4yYdu7{8c6T`w+LKiEvy7ED; N_H^}gS?83{1ORR&VqX9N diff --git a/graphics/items/icons/fire_gem.png b/graphics/items/icons/fire_gem.png deleted file mode 100755 index deb8979bd8eb153df3014897ff566b1e58280782..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xutl~l(&NeJnKq2uG z*NBqf{Irtt#G+INcOMs^F$!g=MGD4xCWWm_9s-qcloa^617(bXYzD6eO?e>2lJ4m1 z$iT3%pZiZDE0Avx;1lBdpP@lPLE*;)j~^#8J~$Zs`0?U_hr$MsE3kvZO+)rhn7U2FDOqJ;owtC#Dsr1#jN<5K>`cSolilVue;$KFHmk Lu6{1-oD!M<#K~iE diff --git a/graphics/items/icons/fist_plate.png b/graphics/items/icons/fist_plate.png deleted file mode 100755 index 0142938d511cdc336851632b141a898d8c86f63a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ5f=GkNS%G|m0G|-o{|pTp8X6}v628sp`oDJRlct2V_V!H{8X$exz^ncv6+m&u zByV?@|4Z3F9R+bpg8YIR9G=}s19GZ7T^vIy=A>RY%iEy9!C-0Fbas#0=UL)?*E2-tAD>ekVf-+EThQcllbF9f-H=?j;(3N$`YwhjE6Zn{ Sk%`J6cYC_}xvXNS%G}%0G|-o z{|pW4>gwO?>b~pgz1z9*I}p@`em@lZ{d=sw{Iv$4GRBf1zhDN3XE)M-oB~f5#}J9| zJE12>(#yt)kLP1v+?<3yzpC)Fc5XK!#Q9bF-n6*i6SDaXtfmF3gbov(08 zs!J~qJz$xcc1$ugpf7Uc%t)&_m#57OV|*U6WO}*7R|75Po2i~mK&hxGqbqVE&lgyU d9OYiZ#K0IMDJXqa`!&#R22WQ%mvv4FO#tNRQH=lq diff --git a/graphics/items/icons/flame_plate.png b/graphics/items/icons/flame_plate.png deleted file mode 100755 index 6f78e5d0205cd2a5a0e0549d8a79df83283ae70d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ5iFvToi2Kq2uG z*NBqf{Irtt#G+INcOMs^F$!g=MGD4xCWWm_9s-qcloa^617(bXYzD6eO?e>2lJ4m1 z$iT3%pZiZDE0Avx;1lBdpP@lrUHyuy+4s`Y?|psWeSKF52~B4O$zugGO7^<~B^Z;u z-Ch1KW&d;(#3>2#3ubV5b|VeQsq%Dj45^rtdf_Z@g8~n0!i@v-1v&T>7BRnI5jezF z^lZ`V?98KX_gCIuxFqLMd+XFSya%#m-$gi>w*_2`J`&SV93f%jpyk9O;ly-d zpS`3{n^e=;J!+q4iT7R45S@Q~PH}|s!~AVQlg~|J{`Pc3a@~sO8FuNr7^18!pLIqi QDuW#E>FVdQ&MBb@063;?Bme*a diff --git a/graphics/items/icons/float_stone.png b/graphics/items/icons/float_stone.png deleted file mode 100755 index 61f096fc368efcfd43f7c49a83cf057e7637fdc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGU9wpq3;{#0ENU$ zTq8+!-m!#Ue*UWsj11X8txG% zPu#e{p>%Xb%91s29`QWZ(44tr*Rp0yB{w%OJw3&T0=lP8om!W-?p=bPVZd&0FA0}r zM{e9WVrsIM;f$s)XCbF&^NaKZ|Kd_!ZT*I*C_a`eAC(#YM~blgcpuULw41@x)z4*} HQ$iB}c3EpE diff --git a/graphics/items/icons/flying_gem.png b/graphics/items/icons/flying_gem.png deleted file mode 100755 index 563e80f3bf057503429cc7386637f4e6b889de96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xutm48-jdT9I1qz9m zxJHx&=ckpFCl;kLxcj&OjZr8|EmAPnGbwCc@(`$mqolyk9VlZAWHWd*XvzaAmUKs7 zM+SzC{oH>NS%G|m0G|-o{|pTZ3JN<;{J8Pp$BY#pUi|ox(Qv>aU;;=VHsCQ;z8fgc znB?v5@_#A&r=uWFNswPKgTu2MX+Tber;B4q#hm1X1xyJdEKH0V?jAR9-0%?8N=)Hl zIVYf*m@KXkV8-GtA)l#~7iNxGc=ic6_AwCCWCSSOapscFep_X|4LV&8OsC!3d zTBhF9r?an+uh~=Qua?rL7b8xzhDN3XE)M-ocW$Ejv*CuO8X7@4jJ&c=FUIRXqKwuta`0W zIK(OGoWRQLX(er{#WRa?Ce2_Gvx%tt`RzZ~f&YgN^UFNH^YRSuhTXcXK3TUoeacwA zokAUX?U&8slc#&h3w;REQO(S)<;P!U2U~$A?KC5hZl2c#`ZcWwW!+r>jZ3C z{PU3NyQj|5>59{~&T;>{t9$mhRokCE?!6WNd=~SHklE3D8B0NS%G}50G|-o z{|pTV1_l`$7EGvUxRFrs;>C>%4<5W&vE##u3qOARh*&UT!-WeK8&=$yvEbv&t;>MA z7)yfuf*Bm1-ADs+l001;LnJOICoJF+5OGP;wmw|hlc*}UkSU-q<5|h{YYr-X>{AX) z?9w@Xlyy~~VaZi3VexQ@^y{mR7M!~>BXo6)&B9}yOiR}t@R`ih8(CVebmr2`h242v j2j&_FhYRd>)?{Reye#E#BD9DfXd8p4tDnm{r-UW|@=06= diff --git a/graphics/items/icons/garchompite.png b/graphics/items/icons/garchompite.png deleted file mode 100755 index 0be15d5addac84a26b0af7f9762cad203e8e86ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pTV1_m=M96l^C_;JI+BcS6(N5_I02|s|~#*7mR3K;<%0TmBU9cyd_YGEu1@(X5g zcy=QV$Vu{aaSV~ToSd+LOF+aWN!$8xWly5!yM;^veHm`cy)zYrj?11(NS%G}@0G|-o z{|pTV1_luaDpnL!95Be(aNxy)2L~3cn6aZ`#g8990(KNkII-Zug&$&P>|!;-67!s6i)>DN~sEjV{^LFnq3ngz!?nU?w_EIZl4w${jwWAhiE7fRBMJBrU~ ga3_^(s4_4dTP^Y9^P7!dfwnPty85}Sb4q9e0GlRQ%>V!Z diff --git a/graphics/items/icons/gengarite.png b/graphics/items/icons/gengarite.png deleted file mode 100755 index 22ac015b9a0f180feccbc23a26e1bebcd0880c03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G|&0G|-o z{|pTV1_lWhCuUeoxL^^mW5R<2JARxd#}J9j$q5U%1Vmhtw5<aCwPybDC6sOXM!=l1W<`?pW@g%DT~d ciVy>XK(Y9y_{6F|K-(BRUHx3vIVCg!0J9rZe*gdg diff --git a/graphics/items/icons/ghost_gem.png b/graphics/items/icons/ghost_gem.png deleted file mode 100755 index 96e320e2195c0ce454ec964997b81b7582e4106d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xutm49Q>pnMR0fod% zTq8y zdAqy(U&{XJD2P)M zsrU4$WNS%G}r0G|-o z{|pTV1_l>yyvQghu&}V0apJ~|88aF>Cj9vE!(qk_i;Rkn9TyT-9I!|zaA=q@Ls{7q zsFATG$S;_|;n|HeAScPw#W6(Ua&p1~E&&mjByH=%l|8F8-+3_w^aZ%g_MWIDbX@jS zV#qA1myei2kFPK(ekLTYE|LEHOk{!Id6H>ZfOV#Pgv%u@$$@`s~nrRIA`AD kW!zD06~~!WuA$1n5Sb|MDR}M42B2*Wp00i_>zopr0K{)qkpKVy diff --git a/graphics/items/icons/grass_gem.png b/graphics/items/icons/grass_gem.png deleted file mode 100755 index df57119b27d3b6fe0d0d0049edfab9c492580b62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xutm49w2Gd1P0)@m& zTq8QDv9T5x@3_$v@f&81r(Liy= zByV?@|4Z3F9R+bpg8YIR9G=}s19B=nT^vIy<|HR9U`h~SVPe#9_qciEhKHb5VhRt- zIRVYYWO0Q6GZt?NX;$W`meS2jB<6-X_x4T=@i`zf`ND++WmVM diff --git a/graphics/items/icons/grassy_seed.png b/graphics/items/icons/grassy_seed.png deleted file mode 100755 index 31f30aeb59fd1fafcc3beb6c99d59bd3d89e45ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pU=hKAj1f{s3mT5~k&-M6E2vIHExB+hnAyxXgp73GyRCFt9|>a>LoVn8j7B|(0{ z3=Yq3qyaf=JzX3_BrYc>EMQ9z5pgJJ>5&x_I(1Nusi{d}*@6W#Hf{7=*d-jGnf$y* zG`eSQSji3zBLj~!A-C*qyJnv|DJGCU>GZ15-Q{beHfJeLSp4W}anaGPnXz+?StO2x zX!XsTxpc|Sq-B$om>(aLO+R<0=v$oO$(sThTaL|{ym^jq*oqlUmOWZ?jd#!Sowib< z*-|dkNy|@qd&3k%j-47tTAAD)yEz>0@{~v}R*1A?V~|zTJK`#~aTn0x44$rjF6*2U FngA}IbH@Mx diff --git a/graphics/items/icons/grip_claw.png b/graphics/items/icons/grip_claw.png deleted file mode 100755 index d76c6b75c2aeb8fb6ea2c69467684a439424a1e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 413 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ5h?Mw;f+fkNUX zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0gt*r+BScFYFlpI^fr(I zNWjdytN_SmO!9Vj`M;F?(@_woB*-tA!Qt7BG$3b-r;B4q#hlm+d-<9b1lSAK`4=qV zUF(-S$4c4%!qU~uo!Z^IyQlZ@so69x@ppI?EEW*0eEIJudpo{kW!x6ecU)`L*&12G zwN=fSJt%8+X93@oUXMVmdKI;Vst0GYd#NdN!< diff --git a/graphics/items/icons/griseous_orb.png b/graphics/items/icons/griseous_orb.png deleted file mode 100755 index 5140ea3acde5081d0359d061c75956a6582af9da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 426 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ5hSS0_qM01Anh zxJHx&=ckpFCl;kLxcj&OjZr8|EmAPnGbwCc@(`$mqolyk9VlZAWHWd*XvzaAmUKs7 zM+SzC{oH>NS%G|m0G|-o{|pU=hKAM2ivR!rzqVK6|Mzp>pZDB5W;v%t@!VF;wLKDh z=V*e=fPrsLt6u@xj7i?^F8`OZe>w`{lmz(&GdMiEkp|=(^mK6yshE?TaDa`4^?{F@ zVzPyMz)@44V~Hh&+}dF+MJh3emZ_UNsfH~{3!CL=8Psij`t+Id22(>l~U~?I`yDHpT&gOII)<$(kV?xR$Vnd9o)RTJfEd#$?o#^QKC|-t}sqY z{Bmn=b$R9tH})G0)7RbIJ$+VYgKp}bM|byDudHN0lB=X=9hT4kN}!==S!E7qla=o+ zW8Jm4IbSimDX1^yd}V$tSF^XNslZ>Em5qskL3M-mHsy~tvp`<2lJ4m1 z$iT3%pZiZDE0Avx;1lBdpP@lPL19OO#fb$03o;ZQ9B3$T5Xi6)0O`X9{%+h-1{7yZ z@^*Lmzm)ycQ4psj$S;_|;n|HeAg999#WAE}PIAHmrUVfdCPoc+kDE7ccnE4Grtq+w z6VOad7FP%`WAT=dW@VmgDc!t8Vs5B&Z|~F)p93I4yYdu7{8c6T`w+LKiEvy7ED; N_H^}gS?83{1OSt_Vc-A& diff --git a/graphics/items/icons/gyaradosite.png b/graphics/items/icons/gyaradosite.png deleted file mode 100755 index 5a6278df2729b5ca51dfe8f66a19eb4ee3d6bc91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pTV1_l}lA7)q-Tu?ALFo9vhiXT5#tT+)N@#Du20f!eA6%`kD%rILf@DQklu_VYZ zn8D%MjWi%9$%)~jiK=o7nF9JUo|R0$=AhEYKIO2)E}hdy zSy%NLmR!{m77v$5zrN~d!MTeILRZJsEI8K5wA3eI*~u2RwMKRvo4@$HP?BccQG8B= eJE>elm4V^1tR#DjNS%G|m0G|-o{|pW4>gwN5U-{m*@k(gv_uT1yxv?wSO79%nd1d4LowlJH zV`Ec&T|vfx0lTZN0+7L&OqNNqvX`Bm%VpWJQWGY;c%j3`dw25NS%G}@0G|-o z{|pTV1_l8E1s5DRegr7|xM8tk$BrK}8h*^s`0?Y1f|p!hb^xe_u_VYZ zn8D%MjWi%9$%)~jiK=o7nF9JUo|R0$=AhEYKIO2)E}hdy zSy%NLmR!{m77v$5zrN~d!MTeILRZJsEI8K5wA3eI*~u2RwMKRvo4@$HP?BccQG8B= eJE>elm4V^1tR#Dj zaB^>EX>4U6ba`-PAZ2)IW&i+q+SQs_mgBf~MgK7h4}s``;h@)b+?;#V685z$zg&CY8WTdgD7+Xg#rv)iuoKJ4HU zgIg~1?%Z(xY%4yy>c&Y*(93R@NzXLCkcmOoJe%G7wb*msdd@c}+IdaOp3X9uviR*~ ze%kmqulIrWR_R)MmG@Y2T~0O4Whis{%U&eJ?kA@4#P__+OWj;AiS=YKo-h|C*sgvL z(WCvSEr0Ut*)LwfTz6~OJf8sw5$BFvjP+#TO4di4?3JC%))L1;ei~Qqd~lr%*cjck zW|JH56Uiw~=jNDf&%Q3Ydo$2NBGe+8)X+dAD}+e>baL*dmEI`2qTU(@+hN@Hr@1-_Md5HGs~>AExRbC6;@nn*BWWx%vKEBW&QLnhUE|eB(85GqTE%ppS zHjhG~zM88oChuB}>Zw_oO^BAtx25Qvf~RE5nAGq^pQXlSg*i8`d`bN*ELQt=6Y;k^!lc`Np0cZOCmao054irCRN4DUIQz zBT~F(M^b!L(m3@qp0u0yyx&<@&fSb-wmL%@;1dPFWyQ60*lP)Xu0V52FxLhoyG@iT z#{nD#{V`nZr8>}Yl6nW&aSm|F6Td4%4V2Q1YS$!kaMND)fSPV z*y$-6gwW&_TdU}>oK$Q~$5HG)0OwTs3Wf`flM6*s7fx`I*ji?8maB3$^;mPDYlcl1 zO_*AwiTWgmt@imcuDJ(}k#da8AX`7K;D{_h!G+R%am~788@0_zSlD~aQ;;3WxsW!c zQY8lRn7g~yd!k4?wH^9^Vg@2E5pc98!F7{j&dY7^X%hl!r)N(M6_C*HWuxgGoY*ro zW*sP2PKy@pyW6B5-SlXpM;$#nqI#4r*i{wDo?Q4A>g-ib$uq5H%Vt88{M5R#gRAMg z%ZcYQ_&9Ql@ox8|cJI4h0+KMnW=$1dW2P4~P5o+(CQ2wAtEom!we_{4J2Ry*Q;ncg z?n0Ew-^!H)52EPW%$zPxaE-?DvU6z$Cv_!1Qp z6l}~Ob3hae<`EE7 zt`y&`rBi9tJLCb|+B@zDI%rF%=a)<1MFJt|R~p~-Ow3CldbU-R{|SJ)g_$(S+>UM$ zY(Ny34Q8V&LrUxE;?GTt7Mpav3dH#e$x< zqYTt9IjLW=bptbluiPLFP|{)AJjVj^8zn?S`Mg%5VvxDOO;nE$dYnUmG0>U1KT^X1 z1?AQ+?3hhb*V7CH0-h)GNRLG%zp;G#LfCChbvznXl(ahN6FpOPsup zVLgtzs46^lozXUZff#LYb?{XNreM=yC^9bPOgMHXOu*)ub!qWTH)*;pt#r-b8d)yDzC8A+O6#Z*T*`WbhbOG)p#!2rJUVtxz+3C-Ydj;`v5L6uH zK0Vm&$S}}-vVNC5}Dy>|i{B-6^2Oa+({rJ8s3Jm8kP> zuJ;X*=|PPXW}0>-6a!q}OR}eK2oLoK;kjMtpoOJ7a58BaU9fS4ZPLos3Jo(Vi&DrD zI7Id#oIIHTK=@&7+rebqKI8xr1iLoGt&U{w^ctGxK-bv)z|20rGtveyJjDmJ5Gk;b z{3py5N$7Q@>9JVRcIPKhw+zfmg>I&UVx;BD8Fayz33tdm=Z>|*GB9E|ID`wZTIpbR z7oF`_2bH3UtJH=1qJC#k721!Z!a=(ih6BW?mp!7t+MCbKgWWrj3Y zmwTva1j=l~RKB?*zpYrrj{3-N3dPn8p=U42Y~33jn|D4ApZJ&yIs#h)+#X4|3E-J_ zstXC;b}v%#Z^xOB1O4j>&iGv_+rNy2c%b_V+_%ok)#Ad{o)~H4AX#@cR1THBQOQ87 zEC^LqKyt2@R&cWTnDCAa$gjg00g*r! z4C?ui5g}0T#luDJt!AuyYNkwDTScKB>S800%_7*RW{48Fym~(u3~tpJe9%6@8;}aUq*Sxz{e6Z0O%i{#Gua_ zPVT3Zd^^YcAU~YNyk5n(LH_wUym>uEuq_|ZrCUi-#}F_8^>xkG!X+C8KoHy7D*lP2 zlu~`~XOYE!Ppd!6jTXS?BYdPab*U1MEuk8K-Y8$)GF+pA!m?k}MAw51Rfp23xx+JG zTNv65yHxnFW0@&i%B*5`L2!rFXmk(-d7+SW8uT19L>b~6cE|}cimSZpyb7eeZw^N$ z_BVfceR?sGg% zq(HzI6hfj-ojRN~@VZ%`6ten~D_W;*WnN zhIoL3!yx2JH@ZlEL3yidf%n+pK;dXdvZ=M3MwFY!LIq%!Jfd15b&M98r6jE$Bfz2; z9@QJn_eH}mgu5Cbu0{ZnCsx$(WNg%LR>iz;Kz%Ykv7pKmb|3L^58v!Fe7}eHp@lUH zx$DRHQe9|mgK^~ehIzu0h2vDun%&Pa1L#p{UsW)5?o3CS4``2|yO9$nVa`EYO$`Cfd8ITd;iXR&UCWwl6N zGNR#j%q`R8U+Ky`A99x%Ylr@-7#vJ_)9^?U)LPHApdOL%ZJiacnLv}{Br{k6_}|Ig z4@ahCXY!OZ`P)Gmzc6-G1|Nr(LOQzc_%X7ZZ3FY>7{!{2X*}Grfe5XZ2y93tg-h`Y zxbQL9G>1wVT7AL~2&pUpjC>$9`P7-o$C)(${io-beW($If3KPX)Us7Wle&#O?$4)q zRz@k{B}LmF4!D2%=@(?56_{faR;!VEbI%o;U#{c#EA%hdXE*T%Krt}}NyX1)kSpv{ zyxXDNZ1dZ83CXK41pl;g7Mu1Y*liAGQ1YFH5UlTAj$pjhdIZy@lqt zko_@WhKK=l2g$XvF*yqePIE>)!@OiZT5t;wGw^p>$~iUEzv=;VN+%~;k+ps-GHU;&Zr|pdAjultxSilL~TZp47u#uKIux`8g{lIo3y?xQ!*oi4|4vrD}joL&UsHVjT0$z0WvhP4>oV%jT;FLx1wgB}+CoP(JvbKVy3xBhS#K#q8`E~EBIjiAd#JC*b0OX3hS9zk}=Xe@E} zR~?gi;LeFDO)IgUR@55Kx$(5(M|pQuguIZITUa#2O0xI8JG|VLF#?-HuUe-wy4-mo z+R|?ehkzoqjqW%Sp2`t?3}VU5>s=^LYiw_;QmT}4rtQhJrk%CQj--Kym=8N*iAZVG zqT+2JH5ok?!#9LhbNTvN&YfCW*dnbNr7w%WXNjn}TLsr{?)42}Ou;8EgfD|WukKD1UtD<7FnmEHkTcodytxEfhXTSgjV zFw2bp!Dsn-qOcLN+m+w^Abwte7-lj;K1`>OuO2;zJ`Vkw359)bEG+Oy&~$D|sCUji z2^~bA>`Tvy6zkH7Q9E^aylU#pXSwyJ`}O3wtH|f2#rmlm^0ZIZZ6b;r6G;NK;AMw3 zt!exl3;Kx?Lml}24}3WR4J(M&ldcn!7%8LzF%iH^!~r*bZI zY0!O9$^cTjL&eNiESe9bP= zVOnZ3*K>aY+D=sq5~a!uWISVUTKNEv$fbH>OZZcdKY{Qv39!%&V=Y|Z9!9t7G~{$C zS5I28r^6N=0I?h;mQp*po$C3sejm~B$eKF(RrO#%#L&SwsPm~uO8_Sv)hq&})PGP2 z(lswzjv5(t4VSn!dOis}G6|q=bgR`jLP3Yxfoi9!Mx$^WVOx;bDOUK^^WNu zTgW&=+M@EaO^XU=a%Yb7#(c*>_f3jV8_zb5z5aOU=OfMEANu)7b02!TvuUvc9hL1> zGY;blK54mnAo+UrYP7fIeC;n_8d5Tyw2}Ttqke2UThP+UdWX5968nb?I=1K0L0)~I zbt48aG3QPU@CwK+-JO~q-*t-K_LQQRYt%xA$4x^fvTaQZ&ow!Sel+T`gIUSw?z|qR zJu9#l3wfS2IIE@m^HNKfp(Gj{N*Q3w^mG%=CUUrzxqw`FSO{?6de9<^1l9naw7LQ3 z>;CsdR4<>j)_!h$qnn>aOHsAE%&%Pi&?xqnEJl2p)gvFOMy*BZ21|Qe9Ij-{oYmne z3k)$z+UaiXeFH;_heFJDFo0`Z_|k|C5y0p^vh{syEiz==O-yCvb7w!xFdsp8)tPR= z<%j!nO92hfK9g3#@kPWSWSIvl#=rpfg5K@$($_%vyk)%(pPgNOpO&u!+Z z`@nk00d&n~P-n=fq~)&|f`>R^wnbfS9LDron?}6wolERnqV3!z_$oQftvPZP^)?Dv z>rS|)N=b7H_f1}^48LsAnVRX7xuR*vLwHa}Pp6ztI?oo|xbt~iR5w~ZTw~vkG=G2S z=OfMEAA0Xa-W)xH7fBZ1pD=8gG*6$?NSo3U8oqSu)29{rfb%-`AnTqMg4^nGC!`-0 zfoARw*uS6Kq9Ev?LzsHZuidp(!s_7^D!n4xcy2!+Poe+nm!png{xtHv&Q=cHGhD_< zyXHyBeM5y_8@g+?ED0~Q*Qaogo>$?Tua!%0TWS(F+x3K))ES1>H8-5SiXK#_Lv>5) zJd~1j@003H_DoazW^o1 zEFYlAOh*6!03J|GR7C^<05C8xcu*k7Z~#!4nCOrIV7S2exJdZ$xY+pkfUD@N00001 zbW%=J06^y0W&i*H0b)x>L;#2d9Y_EG010qNS#tmYE+YT{E+YYWr9XB6000McNliru z;{zEGI3xiNS`z>O0GCNbK~xyiV_?7s7zKeq0Lqq}2?P@%JRrNg9LNJp0NEWKK%M{w z#}lG#3Ye4P2{K@c3z(CZ;sOM2X<&{@8W=c%I6_8Xo|Cd7kRuvuqyz-Yp@Be-cqkMU zf;pw3p%Ja&P)>Pyc}06Um?H|~fb=kxhJ!ez;R+yo!b5?)($G?{A4JPRW|ap*Jf{lO gR30RN>1`YU0Kcz2Y_wJln*aa+07*qoM6N<$g0YoOm;e9( diff --git a/graphics/items/icons/houndoominite.png b/graphics/items/icons/houndoominite.png deleted file mode 100755 index bca28d336c7a854785f3161ae86f9b701f522070..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pTV1_lWM5j!*tekdq(WEAXJu;9mp2?rcJe*E}hVc}2_kuYPz3eCgDKY&^oOM?7@ z862M7NCR?`JY5_^BrYc>EZ`ClaY@p)K3v(8s4BORDWEUoS;_Qk4k~@@Qw~e)(m8#U zbyc5X$yF_3@o#L3yoV&OnbahP4f@7UbOMMcSoor!SYh=f<`HRmBC27VT#pg7* elgc$z85l0hO0u_DPLc-N#^CAd=d#Wzp$PzHE>J4~ diff --git a/graphics/items/icons/ice_gem.png b/graphics/items/icons/ice_gem.png deleted file mode 100755 index db87018fea066e41d1521f48b9b0ac712294fbc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xutm47~p5AM7fkNUX zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0EaktF()};0aJnq3lpP;yT{ENH#`Kj5>t3s z&IxEHCW|Wsn6Y?ENV76ewUlmNA~84Axwm&}h|d9;$rmmpD66V=s3l&%5TL3m>fVu= zmZ|sjsb)ZTOK{Ao(;|s_97US`O* zA-1Ati(Y4E9(B9F^8Ug-0g85+ng-rmr>@~WkR|&r!oj>P;9~TVn1NS%G|m0G|-o{|pW4>gqecf3G|J?&^)2#GK$VBoT}+9QzlH(cJgvLYAT_p`Y1_?Yr2r35wEXU%c)L@)yt-q`?M5ZId$4P z&2dSKQ}08WW4`Hp)58@k($8e)J6K$res0c-9lM{2%uwFAeew5qy~gPdGH#FG?Jlp* zmz>YZQmpgs-j1!SB2G$ZsHUv3%)Z)n?o*Pg!0{D(HZ5Mg*~T=ap)v3%?}?W)G&D3g tt_aD@VoPzjb4Wr)t>eRHg{EF61`9c}?^~Z1{Q$b2!PC{xWt~$(69CRY%iEy9!C-0Fbas#0=UL)?*E2-tAD>ekVf-+EThQcllbF9f-H=?j;(3N$`YwhjE6Zn{ Sk%`J6cYC_}xvX5jgR z3=A9lx&I`x0{I33J|V9E85-2p)%AQ`U2{{-VncoF>U=j&-}vs%_wV09S}_1?XE(?V zj7i?^F8`OZe>w`{lmz(&GdMiEkp|?Hd%8G=RLq&%f0wsGfu|*v`5ZF|$%FSzn4HePu#T~cCI>akqbfP=lq`7Z8V zXQ8OMAf>74$r0X45tmEGOq?+Xf8@BXFTdeGG4i)X+BFYND?{6@@%lAaIlDE5pKezU Q-3@ZFr>mdKI;Vst03NS%A^-pY diff --git a/graphics/items/icons/iron_plate.png b/graphics/items/icons/iron_plate.png deleted file mode 100755 index 08a3cb8b996487e7d72dc3fd73c903c90a785c6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ0}9PdX<11BJv( zTq8RY%iEy9!C-0Fbas#0=UL)?*E2-tAD>ekVf-+EThQcllbF9f-H=?j;(3N$`YwhjE6Zn{ Sk%`J6cYC_}xvX2lJ4m1 z$iT3%pZiZDE0Avx;1lBdpP@lrUH$3Pr>9S!?(6GIO-;46wFPOy0S+j%IGPh&RDpZH>n^T|7DCsPj^Z}vJ-)ofe%`-DLTr)_LW z`zZw$!x=n_7=sus+IILpTcwb!wBGM&thcWIIls^|_f~#pn>0VqsalTV`oTlJ4|j^D z&f;-N+gJ5E$V2w*c7BJsO*$XBZ@5J2v`%ERI=1%d44Dgm>&{B=EtTCNsiL(GNS%G}@0G|-o z{|pTV1_l!vZX5`h@x#Dk$BrL2DrW3B@B;)ET%lD75X%AQq0m&Dsj#-ZcEnGZvHD4g$t%|o-vvEX;J7g_QYxPG~-j08OqN|raHdi cTgt+~V1HhU;m{IZFQ9Dzopr0M^x5F#rGn diff --git a/graphics/items/icons/latiosite.png b/graphics/items/icons/latiosite.png deleted file mode 100755 index f6d4e7d23798f35ee7874cc2aa823c9b40db43f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pTV1_l!vZbTG3&}jIuW5mdKI;Vst0Cy@^d;kCd diff --git a/graphics/items/icons/life_orb.png b/graphics/items/icons/life_orb.png deleted file mode 100755 index 9a9ed7c68272db9e6913f34583fa65b677706101..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ9HIp{6o!Kq2uG z*NBqf{Irtt#G+INcOMs^F$!g=MGD4xCWWm_9s-qcloa^617(bXYzD6eO?e>2lJ4m1 z$iT3%pZiZDE0Avx;1lBdpP@lrUH!_6cX!P0yxaKh`}glV)en77O$F)01{D5XaRG`m zCV9KN{9nrc=_rU(666=m;PC858jzFd>EaktF()}eLD+zci|fEmCoiuqgLxA+ZQM9f zDa1+jh|bv?97;!5NX?oyjqNGN%$6DA%O#z!a7wCAUpiaW*)r{AW@hRQON~>P1lSC; smMiw8g_wCaM|VAv329$c(HO$OP;V{%pw0Z)9gy=pUHx3vIVCg!0PrAVmH+?% diff --git a/graphics/items/icons/light_clay.png b/graphics/items/icons/light_clay.png deleted file mode 100755 index 7cc3e63801f3d21ad4c7ff73d4e2ca5eae7e01ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ9Gtn|ci$fkNUX zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0xLrP+zfrnp`I zId<@|*Es5*oOHg3qh3k!p3UUjMwMqmyk=$Tt~z!6?$M<(&Yb+m()^Yu%+y{ge8^Z_ z(~Pa6m_5?(dTZf^7b0iFs$}K3wcqxYeO!G##{F)pSl8KIjO$meWW2rn+jZ{!k2sz0 ViXt_t4bg1l*22Y#3kkMgdSh<%4N4?8J)Ur53IjvdZNd0iS|N-;+Za4u{an^LB{Ts5QkiF( diff --git a/graphics/items/icons/lucarionite.png b/graphics/items/icons/lucarionite.png deleted file mode 100755 index ea4955c8a0ce049d135b42f8f9e92691c877fc72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 333 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xuOw2s0AyFYmfkNUX zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0X@1Z$2yso`Xnqn*}}Hg$c|(47oQhO(leIwG^J0ODBFHy84Cl$Wm!pfmpM7pL2mMN L^>bP0l+XkK;@oa% diff --git a/graphics/items/icons/lustrous_orb.png b/graphics/items/icons/lustrous_orb.png deleted file mode 100755 index 08b452aba90db20f9785705e6bf8636b4bdec194..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 458 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ9EPa_y_#;y(v%MWFcGRSs4zAAKeTG)HWS!qE#xmcFH->1v4 zWlN3NguO+--Z?8guLwUEwY4bi>%Cru_G5YL=U8s8`7XObJ|sV1U;qBz?*d1PtMlI9 r+xvYB)0NxR=jZHP+o9|5fPtZQO32b2)2{nK&oX$r`njxgN@xNAzx23U diff --git a/graphics/items/icons/manectite.png b/graphics/items/icons/manectite.png deleted file mode 100755 index af70ce0ae18d8f9f4699b06cd2be30edd4e784ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pTV1_lW$E_7s6Jg~6%@uOkGi3dMsG(4E$@#Du2j~NFJoap%Q;luM|_l<#C7)yfu zf*Bm1-ADs+l001;LnJOICoJF+5OGP;wmw|hlc*}UkSU-q<5|h{YYr-X>{AX)?9w@X zlyy~~VaZi3VexQ@^y{mR7M#1dAar$1&4Oc{OiO(dmYr;2TWe&;vH6S73ngjB9mVG~ fxRc5?R2dj9%Sy7hSWc1#+Q#7N>gTe~DWM4fRSs6e diff --git a/graphics/items/icons/mawilite.png b/graphics/items/icons/mawilite.png deleted file mode 100755 index 8505274fdf0903ab19b5cee83fa335b736e0c046..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pTV1_lKQ1t)eCoTylF;J|?&KN247==kyD$AcRc4h{h`GCDSFxL};`a0;k}u_VYZ zn8D%MjWi%9$Soq~IpdHU>{uKbLh*2~7Y)q*nX@ diff --git a/graphics/items/icons/meadow_plate.png b/graphics/items/icons/meadow_plate.png deleted file mode 100755 index 5cec7fc16726e4e8acd23eda2d9134c1bd299d39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ9FaTn1D8fI{LW zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0wZ5YyVHqcoJdXWp7_#0n&#Je2(&H28uH# zdAqy(U&{XJD2P)M~0qFtt@f%n#_Yj_W2$-awlFmDUE7=0wBp*TXq#zD)8MZ$^c z!ajRRpEjwcvwPG&&l2yuo*_E__?+ShNS%G|&0G|-o z{|pTV1_lQrIvykh{OGW#*l^*;iWNH+bo}`74>G0TGuZZR^98J&Bs{7BU6&Ww_1u&QuUOE_*7GXYRC@kC;M_ zOIQ^z>+II<*NS%G}50G|-o z{|pTV1_l!rY=|gmIC0~KLqNiZ4<9yo%(zf+L!m$-;=qH169FC(2X>qYXeqj>0Mx}; z666=m;PC858jw@(>Eak75uTi|fJs0kAt6DeWz$q1Nr{%J2W;G)UvOY!yBHwMD4;HS zh?BYaj*sJ<2ONS%G|m0G|-o z{|pTV1_ldOOqg-t#)%UrUYuC*;>C*v2QD=1xbWl0j~g=rZtUn-uwcT48!t92XxOk} z$8M*_T|m8zB|(0{3=Yq3qyafeo-U3d5|@(`7H|oOxFl&?AFk|KrTI>lDWK2giOKXX zHad+ZoO&lSc-1z}RJ(m~`>X%1 rGnSTHPx~XbGf;38_EKKwlR3R`njxgN@xNAASh&R diff --git a/graphics/items/icons/metronome.png b/graphics/items/icons/metronome.png deleted file mode 100755 index 4aa57f95e0c3d5e8523f2bce2a25557b981cf0f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ9F!k}*6WdGQk0 zh?3y^w370~qErTV9~Yo83T3H93dVXSg{?~-0+n!-6!^IVWsHGr2CoK9c_77-?&#~t zz_78O`%fY(kZ%y+6XN=xp+Ox8Ttnxdeww@Sj&I)zvshc-y4a0RpML-Ty>90nkO4@b z{r3J=AeS-8+uh~=Qua?rL7b8xzhDN3XE)M-oN7-O$B>FS$q5JeSy}~h+>*mtE!@}K z31yfm%<;Tqdix>Eo|n0*3z-VenTYsl#>giBG-=^XQt(^BWaQ3pEK{4mweU#y?91Lx z%?iH`Pl~-1lpxd1r_dmEJY#Ft)m29e`hdjh1@jWN7@3*Hv3_N7xvA7~(x)k*!90dR WB1f$^ilh4!$i1GfelF{r5}E*-Y;raL diff --git a/graphics/items/icons/mewtwonite_x.png b/graphics/items/icons/mewtwonite_x.png deleted file mode 100755 index 5085bf2213ea691b9bfb3a3ac9eadd81ae1b18fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pTV1_m<%8X^KJ3<^3995`@e!;J+y4phuo@#Dvj28)avHy#{VutOt+@d{82V@Z%- zFoVOh8)-mJvZsq@3EG6nQyJS&-g%|WG)eac~pT{@?a zvaaegEV-&BEFLc5o_#gRB0c-Us!+Xq0gqjr{nr{b&Qz0?+H$Hw`OKxe3%l2_J~(%C gtxm_?g;N+9GTuoz75;Ut23p79>FVdQ&MBb@0O>ealK=n! diff --git a/graphics/items/icons/mewtwonite_y.png b/graphics/items/icons/mewtwonite_y.png deleted file mode 100755 index 25209bb393bfb8736e1378f296fdbfde5b44cbf7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G|&0G|-o z{|pTV1_m<%8Wsd}>?l}q;J|?!8*Ut!vE#>&9}N~6H*P#QuwX}i^;AQkdd89wwQ>F5X$0dj!&6uDakE##HcpO_11; dcL81u4C|MQ{oQeVtv=8?22WQ%mvv4FO#o`DR)zoo diff --git a/graphics/items/icons/mind_plate.png b/graphics/items/icons/mind_plate.png deleted file mode 100755 index dfe89ddbb51c769af09e9a701fcea47d5488e4d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ9Fk;_WS3Kq2uG z*NBqf{Irtt#G+INcOMs^F$!g=MGD4xCWWm_9s-qcloa^617(bXYzD6eO?e>2lJ4m1 z$iT3%pZiZDE0Avx;1lBdpP@lRL*rsq*SCuozrB6(f9=wf83`vNB0&1E0gfe^GlAla zN#5=*|Ch3VItt>H1o;IsI6S+N2IN$Ex;TbZ%t^g)mbXEHhc)5Gf%$?Qd&K=yi7HQMdam?=RdFplFw=Y2dwe>KfhyS+egU9L(DSE=C`TX(*16uyN3GVv%rS zy0Fh)(x*+T>Fgf0&$Gn)u4jnOKR%~8!uVnSwxG%9CNY0|x*@r4#q$ii^j!>5R+i5? SBNLTD?)G%`b6Mw<&;$VUR&ja& diff --git a/graphics/items/icons/misty_seed.png b/graphics/items/icons/misty_seed.png deleted file mode 100755 index 58764aca50fca69dcbd3da443f5435021f63c50a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pU=hK5Pid(S@m-@W($yKhJ5WC=KW6`$>vc(+$GE6OVlFzk+__kuz)Q=M8u(>rAJm!=+r?qrlux^WeXO}*tF4eVV7`#X7ckM z(deGJVI?~>j0`-^gxs>b?V5e=q?kbZq|>WHcbBh?+MK00VezA@#YIQEX2#AnW|24& zqSZHV=F%lQla@_VVt#x~HvQb0qHl4ACvOU5Y&kY(^5!|dVJl`ZS@vknHQqhPciKvc zW=pwDCoMne?F~~5Id*CoX=QSI?B;N|%Tpq`SRvAmjX_pT?})3|#$7;%GkCiCxvX2lJ4m1 z$iT3%pZiZDE0Avx;1lBdpP@lrU42EL!uRjfpPp8)%eA$zu=t*vdwQeL=~$uDl9KPt z%s^(qz=yh;`#?5hlDE6d|E27oj)FKPL4Lsu4$p3+0XaK8T^vIy=A>S5n sdFhT_)&J*Q<7Z&o@s>lXj$i0CFXLLx;=j{Qs)4-f>FVdQ&MBb@0A7cZE&u=k diff --git a/graphics/items/icons/normal_gem.png b/graphics/items/icons/normal_gem.png deleted file mode 100755 index c57142c324145171e0a588c32ead23d767395be3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xutm4A#r)FrZ0t$(j zxJHx&=ckpFCl;kLxcj&OjZr8|EmAPnGbwCc@(`$mqolyk9VlZAWHWd*XvzaAmUKs7 zM+SzC{oH>NS%G|m0G|-o{|pTZ3JMQ)?D%lu!hsDNe*E~cV!?t56DEN4VFUFC`<;Q} zj7i?^F8`OZe>w`{lmz(&GdMiEkp|>cc)B=-RLn_ESiqDZ!otL;;qGzs#tjcat;7@_ zmU9A{iOJ#$0cI@T64I>9Q!S;Nmq^SFb?)t*8sc+6X7Ys#3CgOf9cqc!F9fKnin@1X zre*3qeX1GI-4Yyg>a<9r9!HU;f78we#}HOM#v*1XrWL0JZ{GC~Qek3P_)6$vg;rNS O$km>%elF{r5}E*)h-Z)h diff --git a/graphics/items/icons/pidgeotite.png b/graphics/items/icons/pidgeotite.png deleted file mode 100755 index 8cc9ab6b176fac532c7fb2176b985133ced58979..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G|m0G|-o z{|pTV1_mD{cpRvhal@hD!-0kuGbTL9i1_j2$A=dcFJ=Hm5`Nq`@L@&3iiQ~mdKI;Vst0CeeKZvX%Q diff --git a/graphics/items/icons/pinsirite.png b/graphics/items/icons/pinsirite.png deleted file mode 100755 index a201c320c0240f83b14ccf4a8419e5e6afd6f0cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pTV1_m=K3Jzpg{0LC^alzumh8aI5X#441t>pcclGAirP+ zhi5m^fSe>x7sn8Z%gG4~xCBI8lC-T4SN0@ozFWu?(3j!1+&fc2=(y~uM4s4bPaiRb z9+%jaHMO%_yJvIu)g+7O85dTC>e&T6c4-V!Gq{}M)Ep)$-x67+Rx+`d;f`hc6xNN_ cQ-l~87HpI_UXkh30JM$4)78&qol`;+0Q#3z1^@s6 diff --git a/graphics/items/icons/pixie_plate.png b/graphics/items/icons/pixie_plate.png deleted file mode 100755 index 4c34f22aba95d480536c3c3c73f899a4b1ef62ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NSwWHkJ|V9E z85#@>3_ff)@#Dge9}j-~IPl=YgcAn}7OaYeHBN#kg{an^LB{Ts5NDWv1 diff --git a/graphics/items/icons/poison_gem.png b/graphics/items/icons/poison_gem.png deleted file mode 100755 index ab339eb718deafb709cadd530e61f3cad86dc403..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xutm49q%D;Q(1BJv( zTq8QDvj0_DA50E}=ApEDnM4&ih zlDE6d|E27oj)FKPL4Lsu4$p3+0XY?(E{-7;bCMGlFeQkvFfnSld)&Nn!$VLjF@=Za zoPcIxvbaKk8H=}sG%NE|OX=n%5_3bHdwZvb_#BX#eBnZZvZ`u_TH^H!0jjE^?j4zF znR-v3Y6f(-1jn2@Et06mQKaeLw6no6gjJ8Rh}ns0#c9EtcRhqum>3qm61rHS)s+u& NwWq6}%Q~loCIFNVW6uBp diff --git a/graphics/items/icons/power_herb.png b/graphics/items/icons/power_herb.png deleted file mode 100755 index 947996c4cdd69bff960934aced314188fc0dd52a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ4sI$Go4s1`3In zxJHx&=ckpFCl;kLxcj&OjZr8|EmAPnGbwCc@(`$mqolyk9VlZAWHWd*XvzaAmUKs7 zM+SzC{oH>NS%G|m0G|-o{|pV&U0v1H)t~0(KGoA(p{{<#*7lIC?M7eUcd@Y`-KgNn zF6lI&2xF4ByUYKj?4OQ;I3+=T!3+-1Zh&MeJY5_^D&{07D9CeYX=)z0;iRUQ$W^dy zb+*xz!zqs*NyV`})!5xqk>VHD;Mvl0b`HlxfwEFgU47%Gf{>WlTWRM+7&c2bx}~0L z$t*17ZC))@_O-#AVQWk1xfU;j6%498iFtu%=jgN)ESV&9=VMPn;DnP$s)1qnLsD|z Tt!iC4kb6B{{an^LB{Ts5uG?)= diff --git a/graphics/items/icons/protective_pads.png b/graphics/items/icons/protective_pads.png deleted file mode 100755 index 3676fd311a25a4aa3df2337afebc89c91190c565..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G|m0G|-o z{|pU=hK6VFy<4;QYV({eNm)y>s+*_GS@Qq?|EpKeuGzB1D=4aY%2BVVDM?AybJm>o z7cR~P>SZhm@(X5gcy=QV$l2@Z;us=vIXS_By{V~*sbJfr&TNG#XIF^K3Y*6^Rfx;? zbif2$Q&#CyoqYxP?#4yhZRSx@ zULh5`t?1{w0E706nkB!#+%;6|OXypl_2sq1(#4Ge)q1k5o17J2wY=Ao|5a=f!nx?& z({=ym8+$G669~8d|Fd4B%KXYhC&TBV<<2@xQi5Dl1X`**)I&l81fGR1T-?=RkPsr| ez$eJ&!@y8=#>#Obzh)88BMhFdelF{r5}E)C3V^== diff --git a/graphics/items/icons/psychic_gem.png b/graphics/items/icons/psychic_gem.png deleted file mode 100755 index 6b84f38daba8f5abc1199bdb7610e6a1b0287906..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xutl~lzsZUL=0fod% zTq83qm61rHS)s+u& NwWq6}%Q~loCIH<2W6l5o diff --git a/graphics/items/icons/psychic_seed.png b/graphics/items/icons/psychic_seed.png deleted file mode 100755 index 4c90afb9c9b5feb29fc5ddd7f22a237ad422dc06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pU=hK6gB_WnQn|7iEoci)cA$r5n%k~rHf@oukXR+LwRs zXmroqu#z1bMg|^dLT=gJcFjI_QcNIy(&<&9yUW)`ZO&4hu=vr{;-aHnGh^o(vq&5X z(dwHwbLotfkNUX zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0!^z95 zVBUtV%@Zdvgd93?^k{^q;2}YyB2L~QZ!d=8BbR!dnlDW{@Jb@McT)2dMHx52aAVWd z%_gY=?t641&-z;Wo)l0CylCmGs^NK3V$G_gYpYD2rX+VPofNw|OjX_KM$g-)p{tiU ztesv^o*#en7{^o%&GiwH#}qgoZrNV0>(jg|V#DI(sSJ0Fn>^%{fg!EismvK@-JA^a Nlc%en%Q~loCIIaYged?3 diff --git a/graphics/items/icons/rock_gem.png b/graphics/items/icons/rock_gem.png deleted file mode 100755 index 6d6070b51615cb7c9a0bcdd71dc792dc277bb4ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xutl~l@Il&cwfkNUX zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT04zOJ#OB(;UTD%n8L$y zPCzp;SzIB&jKy0*nw5E~rF8QWiMgT9y}eUId=AJ=zHlKySyi<|E%Ew=0992{_m0f8 zOueU1H3Pa^f@4md7D?3ODAM$A+S%Y3!m7tu#O%bh;dFVX N+SAp~Wt~$(69E1>WKaMA diff --git a/graphics/items/icons/sablenite.png b/graphics/items/icons/sablenite.png deleted file mode 100755 index ad348b4352b97d25f999cc2b5e78a642a4950f13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}r0G|-o z{|pTV1_lo_B33w5R7A}9aie0#iW4h3CVZH%;>V94A0}jcc=6#yM#77XjspQRUc`nf z0W~s~1o;IsI6S+N2IM4qx;TbNTux3{z$GB!lB8{YxUwfv^W8$GfWD09CetrDsPtJ+ zIV`d2;*&>Ap~odwElGLwi0iRVP*7X(wqqKaJ1d-fg;~939`KpW*BfYbk7IL5`HFR0 k8SYr_e$SayuA$1npubxr>(l-=W1wXWp00i_>zopr08MaPQ2+n{ diff --git a/graphics/items/icons/safety_goggles.png b/graphics/items/icons/safety_goggles.png deleted file mode 100755 index 7a1efab67adffd72893d7ab8383ab500014ac898..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 386 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6xu?EJb+&fI^cfkNUX zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0=j-CMiXDcR}&wQFMZL`gH zTyQQ}$I+*H{O!E5BC8#H8k}CONhoK1x%tPGW3T3J{^$L#-{D8nnfs1MvR?I_5NC3E zF1WV7boW!a(n;%bd_*EvuH)IFdD5~VH7j3X+3DDo@{XHKdS){z9j|#2CTx?}eemVh zNTt@-eb%j(iQ1L&6|pP{nnhV`|HC#5oxFHlL}%rl4Bq?fb!UYg?Ui`$+~0f> KKbLh*2~7ZYQHg>8 diff --git a/graphics/items/icons/salamencite.png b/graphics/items/icons/salamencite.png deleted file mode 100755 index 557cc29d7dd50a2d897f5982f00833253fda5241..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G|m0G|-o z{|pTV1_lQX91tj&!7*XShZQRt4%|psap1>~9}glTDhfJItXT2l#fu9a9TEi{8$3Lo z+^g*Z>SZhm@(X5gcy=QV$Vu{aaSV~ToSd+LOF+aWN!$8xWzQpX0#X;%D;}%G!gN7+z;ftT^hp@iWji22WQ%mvv4FO#sISUw{Ar diff --git a/graphics/items/icons/sceptilite.png b/graphics/items/icons/sceptilite.png deleted file mode 100755 index ba61c74aac5ef06efac52f6e0f0258591d0298b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pTV1_l8M0XsAdekdq3EXY`KV8M?CGY%v;{P^+1!NDP+BI3Y>iZ6|{w zx~k8xNS%G}@0G|-o z{|pTV1_mnvGBOk-EG#Tm+<0(e!HNkJCKPl``0?Y%3=W1B6IT5A@!-Ez*gT*X#*!ev zUNS%G|m0G|-o z{|pTV1_mciJh-sJs3bBmwNS14-_Vq$omEwSRLNS%G|m0G|-o{|pW4>grG5rGEeZ{m!A>`F(mjSGb z4=Bi(?(M@T>QYi zhG(;@7{9O`(QPxxdFf=cO*i*yYhl>uPq&}=2LADloHo0Bx!3hhmdyE9O+0f~eO1v~ z+wW51AyCCqnZ;{p+**E{JL>7dH3h6Pn`N0ix<4)x;%Hr0Y_l%F!_}==|9J| zgqGEvwtMFb1tr%>zE(T_rmc|uyA)&9%2ejJPp5ronPK$o=!^sG%rC+g8$427CU)ek z)INbiq3jz|SA-S*za6aGU#f2Sjx%*%$*1Ex8H10CemQq9GY;fjPgg&ebxsLQ04}9$ A+5i9m diff --git a/graphics/items/icons/sky_plate.png b/graphics/items/icons/sky_plate.png deleted file mode 100755 index f64b14aff6d02b979d950faf395ba04d6bbf7630..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ4s!UnX~O0ENU$ zTq8wr_!Jf~zhDtK z#8&id(d+EYqi*+C-e0&UK+!H!)4+S{)HS>ZvSi;yIGDEuT#P;v(@-2CVdJ3X#3JFu zbYY*pq)(ev)7d?0pJ$2pUC$7me|%1Hgz>}tZ9$XIO=AA`bVG98isu=2>AM)BtSp~( SMkXqQ-0kV==d#Wzp$P!X`*8yR diff --git a/graphics/items/icons/slowbronite.png b/graphics/items/icons/slowbronite.png deleted file mode 100755 index 89bb8bf487bc52f42c202fb5f00704a0f16de85d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G|m0G|-o z{|pTV1_nD$?0B#v;KPfCA3F|w_^{)~jTt|F{P@t&@nJ*5i47|rym;|o#*7;W8g3+H z%&a^b0o2P_666=m;PC858jzFZ>Eak7aXC3*0hfS?OOm$r;mV#>n(w@r0{Q}6W_wRm z5;`t>Dluf1)XPUqp~qL46h9LZSC>eCekQWuoZ{V?#<4XEj&U+Bop-=za^R)8Ki?^w qxn%71`98;ixy8@sE0nbdF)_T(mRNDrapPy8Z492SelF{r5}E)Fpk$T+ diff --git a/graphics/items/icons/smooth_rock.png b/graphics/items/icons/smooth_rock.png deleted file mode 100755 index 8db8ef11f5b41f24b0980eb2525088c2cd6ebe91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 427 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ4uaDLPYU0)@m& zTq8TC9N z=lm6Il2@kdflOjx*pV-p0i+m{yxm>?FJ=F96vQbB@(X5gcy=QV$T{Tc;uumfCpqB& zn*{4b3#Tp*p<`_veI1*Xot#b{5nMGfFyP2dRe>Xh!U-bz^A|~JF@#OfxEB~GB4sLg z#53&v#f$gsil6!{5P59aEeiyp#_60)l}T3}{C=OBc{;{n&ePrH+t)`~YMb($m>6kU ze05c%aeAv-laI#yIJ={++0TqN+n*wSX1oT9Wp0&K6#|dP&PfK^68!3YFYw( zi+_CCS+2jF!(pyYT&XVSF~(g{2CU~8nH_kAa?v{l^bLcjtDnm{ Hr-UW|R2r4f diff --git a/graphics/items/icons/splash_plate.png b/graphics/items/icons/splash_plate.png deleted file mode 100755 index b290e8100142e51ef0d4665b05621671621e2c84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 352 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ4t}GyQTN1BJv( zTq8%6Tn!V^UJKn6oFvCHm!BKfgPqO;=rs*>K+M4F6x58jH)kLR(Bc%ckm|0lC}L L)z4*}Q$iB}?k;TO diff --git a/graphics/items/icons/spooky_plate.png b/graphics/items/icons/spooky_plate.png deleted file mode 100755 index 215657bcc674f6bbd62d949be4d0595ad4dc07af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ7&NFKa$10ENU$ zTq8m@mk|r?80m1&hET zwxVZ?UT0?>b-Tav{=z*0iguZr2HsnzuHik9CHpSI!MrWtV)T)ihT;eb8wV{X76~V& z3;XOPecGg&&hAnBJWIUqdWPuy<8z85j34H23z~dx67#pG8-!L0ENU$ zTq8LLPLYkF%s-<-E5{bE?&b_@;LwpX%Ould-L0MI`LoM<8g#cAmQTL9_v`oFG zCe48Emf#qcqaulV97TdYO*NS%G}r0G|-o z{|pTV1_l#mY*?`3z=;6BllH%s8>(#ElsTZhSU7 z`yZ&0u_VYZn8D%MjWi%9(bL5-MB;LC!U8S<5tk%w>%)~jt2Fbxm;(9&DrS05QW84O zdnz#`tGA%AaaD52s~0mKJz{yh=EaMaVzZYeB|9pddxe?2VjE|wtzB}tuw41frMq6W m+gTr+yZJXvV7Id-BZHuYIDf&hjhld$F?hQAxvXsZbxWjD)e^NUs)1`l{H1o;IsI6S+N2IN$Ex;TbZ%t^g)mbXEHhc)5Gf%$?Qd&K=yi7HQMdam?=RdFplFw=Y2dwe>KfhyS+egU9L(DSE=C`TX(*16uyN3GVv%rS zy0Fh)(x*+T>Fgf0&$Gn)u4jnOKR%~8!uVnSwxG%9CNY0|x*@r4#q$ii^j!>5R+i5? SBNLTD?)G%`b6Mw<&;$U_gmC2m diff --git a/graphics/items/icons/swampertite.png b/graphics/items/icons/swampertite.png deleted file mode 100755 index f2d386a3d43ac565e7e94df5d11b681eb971dea6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pTV1_m!OA`%)VcmzZgY`F1a#exkN9%M{d@#Dvj6&V>DCd}wqaNt0DPcBdkV@Z%- zFoVOh8)-mJqNj^vh{WaOgaupzA}&eV)`u&55>@3EG6nQyJS&-g%|WG)eac~pRnwk4 zVhTMjv1-YdBS%G#-CVMS_4$-z8k#$IIQI&(dg(UKRFjihyk(U@T4v>nb483hick4- eCY5WbGBA`kiF`CJ**^(r8H1;*pUXO@geCyMl2zvb diff --git a/graphics/items/icons/terrain_extender.png b/graphics/items/icons/terrain_extender.png deleted file mode 100755 index 7735dd8900fd8a878e0f2dc61b52273a933455c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}@0G|-o z{|pU=hK5^?9wm+9OXr`o^VV~E@5Pv;iV|NT_oMv(Q!jd zQP;u^lQ%L%bX`1g=BTT0WP{)t%`k6oZzJ&pmes=MVL?WEDG3b)R%vA=4<4+!wU_HG@nyj2QxJAj@EUP*m7-}OqL?Ukn+-+ll7z0~YVs=^hJ z0Z8EIy~kcaE@P6nyUYKj?4OQ;I3+=T!3+-1ZlnP@MV>B>Ar*6y6BL9ExVX3u+;sBt z>N1!&VN-F$B&86iy>~5gq6A#J0v8{))ZslPXq0bm#%tQPLYQe&Pp|KSIU6z$o;znS z^TgDHYR49O7%iL0VXL-mvx1CU>VmqRY%iEy9!C-0Fbas#0=UL)?*E2-tAD>ekVf-+EThQcllbF9f-H=?j;(3N$`YwhjE6Zn{ Sk%`J6hkLsExvXNS%G}@0G|-o z{|pTV1_l8M0XsAdekdq3EXY`KV8M?CGY%v;{P^+1!NDP+BI3Y>iZ6|{w zx~k8xNS%G}@0G|-o z{|pTV1_lxh4LdwKegqsySaD*;ffXBO?AXw7;>V940vR3}6LwVGxbe@F=OIuFV@Z%- zFoVOh8)-mJlBbJfh{WaOgaupzA}&eV)`u&55?{(KWD4lZcxE#FnuAIo`;@~HyL3(; zWnI;0SaMZMSUg-J{rak-1?Mg<2wfdhv*1`K(^8*=WhYzM)*9JyZ2sc&LP?r&NAWog f?xb=JRR)G*t0jJXezWl_&^887S3j3^P6H1o;IsI6S+N2IN$Dx;TbZ%t=mIz?2}u!o;ZI?s4ItDW-Q(k(yYu=Ev1{6NX!j&?(Ll#;&VV|@`Vct%BrdzYKhk`1gNTtx_4xz zW$HbBsu|GT5*%~tv`C^JN0Fv~)6NFR5LP|LB4#J16{iJn-t`btVPaVLO6X#RR#!gA N)t;_?F6*2UngE~>Wd{HN diff --git a/graphics/items/icons/wide_lens.png b/graphics/items/icons/wide_lens.png deleted file mode 100755 index ea432dc8de9f14ad8e71434f4404b64ef3762b9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 370 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGCYjJE4F+z01Anh zxJHx&=ckpFCl;kLxcj&OjZr8|EmAPnGbwCc@(`$mqolyk9VlZAWHWd*XvzaAmUKs7 zM+SzC{oH>NS%G|m0G|-o{|pW4>gsoj)Iyp)$ z$t+vcOoVex9|7c&KNJPfV|4Rzp{7?+l+yy$hBZ tXd291Dyi5b?)pqaic8T_`lhG~6GQAY&i`Llh+hY}(9_k=Wt~$(69DZOU1d zN#5=*|Ch3VItt>H1o;IsI6S+N2IN$Ex;TbZ%t^g)mbXEHhc)5Gf%$?Qd&K=yi7HQMdam?=RdFplFw=Y2dwe>KfhyS+egU9L(DSE=C`TX(*16uyN3GVv%rS zy0Fh)(x*+T>Fgf0&$Gn)u4jnOKR%~8!uVnSwxG%9CNY0|x*@r4#q$ii^j!>5R+i5? SBNLTD?)G%`b6Mw<&;$UnByrsU diff --git a/graphics/items/icons/zoom_lens.png b/graphics/items/icons/zoom_lens.png deleted file mode 100755 index 167619aa64e1be5dcc7ac0f9d30450678a0f46f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 385 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w_7YEDSN6wDGQ3I_yOTxLfI{LW zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0#wzX|jQ0Qy(P2Kq&2%gr}feb(b z9ZL;90=bMy-tI2{m$H943gVOm`2{mLJiCzwA-lMfJ3z_vuB3|U8^gmlRZJp}N}T!l zCd07I*Q~L~sd0`$@rJ@fatbpqm~>>SIrK$mXk5t= ITEM_POTION && (item) <= ITEM_0B2) -#endif // GUARD_CONSTANTS_ITEMS_H +#define ITEM_GRISEOUS_ORB 0 + +#endif // GUARD_CONSTANTS_ITEMS_H diff --git a/include/graphics.h b/include/graphics.h index 2e58591315..960b6a6388 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -3847,270 +3847,6 @@ extern const u32 gItemIcon_MagmaEmblem[]; extern const u32 gItemIconPalette_MagmaEmblem[]; extern const u32 gItemIcon_OldSeaMap[]; extern const u32 gItemIconPalette_OldSeaMap[]; -// Gen 4 Items -extern const u32 gItemIcon_WideLens[]; -extern const u32 gItemIconPalette_WideLens[]; -extern const u32 gItemIcon_MuscleBand[]; -extern const u32 gItemIconPalette_MuscleBand[]; -extern const u32 gItemIcon_WiseGlasses[]; -extern const u32 gItemIconPalette_WiseGlasses[]; -extern const u32 gItemIcon_ExpertBelt[]; -extern const u32 gItemIconPalette_ExpertBelt[]; -extern const u32 gItemIcon_LightClay[]; -extern const u32 gItemIconPalette_LightClay[]; -extern const u32 gItemIcon_LifeOrb[]; -extern const u32 gItemIconPalette_LifeOrb[]; -extern const u32 gItemIcon_PowerHerb[]; -extern const u32 gItemIconPalette_PowerHerb[]; -extern const u32 gItemIcon_ToxicOrb[]; -extern const u32 gItemIconPalette_ToxicOrb[]; -extern const u32 gItemIcon_FlameOrb[]; -extern const u32 gItemIconPalette_FlameOrb[]; -extern const u32 gItemIcon_QuickPowder[]; -extern const u32 gItemIconPalette_QuickPowder[]; -extern const u32 gItemIcon_FocusSash[]; -extern const u32 gItemIconPalette_FocusSash[]; -extern const u32 gItemIcon_ZoomLens[]; -extern const u32 gItemIconPalette_ZoomLens[]; -extern const u32 gItemIcon_Metronome[]; -extern const u32 gItemIconPalette_Metronome[]; -extern const u32 gItemIcon_IronBall[]; -extern const u32 gItemIconPalette_IronBall[]; -extern const u32 gItemIcon_LaggingTail[]; -extern const u32 gItemIconPalette_LaggingTail[]; -extern const u32 gItemIcon_DestinyKnot[]; -extern const u32 gItemIconPalette_DestinyKnot[]; -extern const u32 gItemIcon_BlackSludge[]; -extern const u32 gItemIconPalette_BlackSludge[]; -extern const u32 gItemIcon_IcyRock[]; -extern const u32 gItemIconPalette_IcyRock[]; -extern const u32 gItemIcon_SmoothRock[]; -extern const u32 gItemIconPalette_SmoothRock[]; -extern const u32 gItemIcon_HeatRock[]; -extern const u32 gItemIconPalette_HeatRock[]; -extern const u32 gItemIcon_DampRock[]; -extern const u32 gItemIconPalette_DampRock[]; -extern const u32 gItemIcon_GripClaw[]; -extern const u32 gItemIconPalette_GripClaw[]; -extern const u32 gItemIcon_ChoiceScarf[]; -extern const u32 gItemIconPalette_ChoiceScarf[]; -extern const u32 gItemIcon_StickyBarb[]; -extern const u32 gItemIconPalette_StickyBarb[]; -extern const u32 gItemIcon_ShedShell[]; -extern const u32 gItemIconPalette_ShedShell[]; -extern const u32 gItemIcon_BigRoot[]; -extern const u32 gItemIconPalette_BigRoot[]; -extern const u32 gItemIcon_ChoiceSpecs[]; -extern const u32 gItemIconPalette_ChoiceSpecs[]; -extern const u32 gItemIcon_AdamantOrb[]; -extern const u32 gItemIconPalette_AdamantOrb[]; -extern const u32 gItemIcon_LustrousOrb[]; -extern const u32 gItemIconPalette_LustrousOrb[]; -extern const u32 gItemIcon_GriseousOrb[]; -extern const u32 gItemIconPalette_GriseousOrb[]; -extern const u32 gItemIcon_FlamePlate[]; -extern const u32 gItemIconPalette_FlamePlate[]; -extern const u32 gItemIcon_SplashPlate[]; -extern const u32 gItemIconPalette_SplashPlate[]; -extern const u32 gItemIcon_ZapPlate[]; -extern const u32 gItemIconPalette_ZapPlate[]; -extern const u32 gItemIcon_MeadowPlate[]; -extern const u32 gItemIconPalette_MeadowPlate[]; -extern const u32 gItemIcon_IciclePlate[]; -extern const u32 gItemIconPalette_IciclePlate[]; -extern const u32 gItemIcon_FistPlate[]; -extern const u32 gItemIconPalette_FistPlate[]; -extern const u32 gItemIcon_ToxicPlate[]; -extern const u32 gItemIconPalette_ToxicPlate[]; -extern const u32 gItemIcon_EarthPlate[]; -extern const u32 gItemIconPalette_EarthPlate[]; -extern const u32 gItemIcon_SkyPlate[]; -extern const u32 gItemIconPalette_SkyPlate[]; -extern const u32 gItemIcon_MindPlate[]; -extern const u32 gItemIconPalette_MindPlate[]; -extern const u32 gItemIcon_InsectPlate[]; -extern const u32 gItemIconPalette_InsectPlate[]; -extern const u32 gItemIcon_StonePlate[]; -extern const u32 gItemIconPalette_StonePlate[]; -extern const u32 gItemIcon_SpookyPlate[]; -extern const u32 gItemIconPalette_SpookyPlate[]; -extern const u32 gItemIcon_DracoPlate[]; -extern const u32 gItemIconPalette_DracoPlate[]; -extern const u32 gItemIcon_DreadPlate[]; -extern const u32 gItemIconPalette_DreadPlate[]; -extern const u32 gItemIcon_IronPlate[]; -extern const u32 gItemIconPalette_IronPlate[]; -extern const u32 gItemIcon_Honey[]; -extern const u32 gItemIconPalette_Honey[]; -// Gen 5 Items -extern const u32 gItemIcon_Eviolite[]; -extern const u32 gItemIconPalette_Eviolite[]; -extern const u32 gItemIcon_FloatStone[]; -extern const u32 gItemIconPalette_FloatStone[]; -extern const u32 gItemIcon_BindingBand[]; -extern const u32 gItemIconPalette_BindingBand[]; -extern const u32 gItemIcon_DouseDrive[]; -extern const u32 gItemIconPalette_DouseDrive[]; -extern const u32 gItemIcon_ShockDrive[]; -extern const u32 gItemIconPalette_ShockDrive[]; -extern const u32 gItemIcon_BurnDrive[]; -extern const u32 gItemIconPalette_BurnDrive[]; -extern const u32 gItemIcon_ChillDrive[]; -extern const u32 gItemIconPalette_ChillDrive[]; -extern const u32 gItemIcon_FireGem[]; -extern const u32 gItemIconPalette_FireGem[]; -extern const u32 gItemIcon_WaterGem[]; -extern const u32 gItemIconPalette_WaterGem[]; -extern const u32 gItemIcon_ElectricGem[]; -extern const u32 gItemIconPalette_ElectricGem[]; -extern const u32 gItemIcon_GrassGem[]; -extern const u32 gItemIconPalette_GrassGem[]; -extern const u32 gItemIcon_IceGem[]; -extern const u32 gItemIconPalette_IceGem[]; -extern const u32 gItemIcon_FightingGem[]; -extern const u32 gItemIconPalette_FightingGem[]; -extern const u32 gItemIcon_PoisonGem[]; -extern const u32 gItemIconPalette_PoisonGem[]; -extern const u32 gItemIcon_GroundGem[]; -extern const u32 gItemIconPalette_GroundGem[]; -extern const u32 gItemIcon_FlyingGem[]; -extern const u32 gItemIconPalette_FlyingGem[]; -extern const u32 gItemIcon_PsychicGem[]; -extern const u32 gItemIconPalette_PsychicGem[]; -extern const u32 gItemIcon_BugGem[]; -extern const u32 gItemIconPalette_BugGem[]; -extern const u32 gItemIcon_RockGem[]; -extern const u32 gItemIconPalette_RockGem[]; -extern const u32 gItemIcon_GhostGem[]; -extern const u32 gItemIconPalette_GhostGem[]; -extern const u32 gItemIcon_DragonGem[]; -extern const u32 gItemIconPalette_DragonGem[]; -extern const u32 gItemIcon_DarkGem[]; -extern const u32 gItemIconPalette_DarkGem[]; -extern const u32 gItemIcon_SteelGem[]; -extern const u32 gItemIconPalette_SteelGem[]; -extern const u32 gItemIcon_NormalGem[]; -extern const u32 gItemIconPalette_NormalGem[]; -extern const u32 gItemIcon_FairyGem[]; -extern const u32 gItemIconPalette_FairyGem[]; -// Gen 6 Items -extern const u32 gItemIcon_AssaultVest[]; -extern const u32 gItemIconPalette_AssaultVest[]; -extern const u32 gItemIcon_PixiePlate[]; -extern const u32 gItemIconPalette_PixiePlate[]; -extern const u32 gItemIcon_SafetyGoggles[]; -extern const u32 gItemIconPalette_SafetyGoggles[]; -extern const u32 gItemIcon_Gengarite[]; -extern const u32 gItemIconPalette_Gengarite[]; -extern const u32 gItemIcon_Gardevoirite[]; -extern const u32 gItemIconPalette_Gardevoirite[]; -extern const u32 gItemIcon_Ampharosite[]; -extern const u32 gItemIconPalette_Ampharosite[]; -extern const u32 gItemIcon_Venusaurite[]; -extern const u32 gItemIconPalette_Venusaurite[]; -extern const u32 gItemIcon_CharizarditeX[]; -extern const u32 gItemIconPalette_CharizarditeX[]; -extern const u32 gItemIcon_Blastoisinite[]; -extern const u32 gItemIconPalette_Blastoisinite[]; -extern const u32 gItemIcon_MewtwoniteX[]; -extern const u32 gItemIconPalette_MewtwoniteX[]; -extern const u32 gItemIcon_MewtwoniteY[]; -extern const u32 gItemIconPalette_MewtwoniteY[]; -extern const u32 gItemIcon_Blazikenite[]; -extern const u32 gItemIconPalette_Blazikenite[]; -extern const u32 gItemIcon_Medichamite[]; -extern const u32 gItemIconPalette_Medichamite[]; -extern const u32 gItemIcon_Houndoominite[]; -extern const u32 gItemIconPalette_Houndoominite[]; -extern const u32 gItemIcon_Aggronite[]; -extern const u32 gItemIconPalette_Aggronite[]; -extern const u32 gItemIcon_Banettite[]; -extern const u32 gItemIconPalette_Banettite[]; -extern const u32 gItemIcon_Tyranitarite[]; -extern const u32 gItemIconPalette_Tyranitarite[]; -extern const u32 gItemIcon_Scizorite[]; -extern const u32 gItemIconPalette_Scizorite[]; -extern const u32 gItemIcon_Pinsirite[]; -extern const u32 gItemIconPalette_Pinsirite[]; -extern const u32 gItemIcon_Aerodactylite[]; -extern const u32 gItemIconPalette_Aerodactylite[]; -extern const u32 gItemIcon_Lucarionite[]; -extern const u32 gItemIconPalette_Lucarionite[]; -extern const u32 gItemIcon_Abomasite[]; -extern const u32 gItemIconPalette_Abomasite[]; -extern const u32 gItemIcon_Kangaskhanite[]; -extern const u32 gItemIconPalette_Kangaskhanite[]; -extern const u32 gItemIcon_Gyaradosite[]; -extern const u32 gItemIconPalette_Gyaradosite[]; -extern const u32 gItemIcon_Absolite[]; -extern const u32 gItemIconPalette_Absolite[]; -extern const u32 gItemIcon_CharizarditeY[]; -extern const u32 gItemIconPalette_CharizarditeY[]; -extern const u32 gItemIcon_Alakazite[]; -extern const u32 gItemIconPalette_Alakazite[]; -extern const u32 gItemIcon_Heracronite[]; -extern const u32 gItemIconPalette_Heracronite[]; -extern const u32 gItemIcon_Mawilite[]; -extern const u32 gItemIconPalette_Mawilite[]; -extern const u32 gItemIcon_Manectite[]; -extern const u32 gItemIconPalette_Manectite[]; -extern const u32 gItemIcon_Garchompite[]; -extern const u32 gItemIconPalette_Garchompite[]; -extern const u32 gItemIcon_Latiasite[]; -extern const u32 gItemIconPalette_Latiasite[]; -extern const u32 gItemIcon_Latiosite[]; -extern const u32 gItemIconPalette_Latiosite[]; -extern const u32 gItemIcon_Swampertite[]; -extern const u32 gItemIconPalette_Swampertite[]; -extern const u32 gItemIcon_Sceptilite[]; -extern const u32 gItemIconPalette_Sceptilite[]; -extern const u32 gItemIcon_Sablenite[]; -extern const u32 gItemIconPalette_Sablenite[]; -extern const u32 gItemIcon_Altarianite[]; -extern const u32 gItemIconPalette_Altarianite[]; -extern const u32 gItemIcon_Galladite[]; -extern const u32 gItemIconPalette_Galladite[]; -extern const u32 gItemIcon_Audinite[]; -extern const u32 gItemIconPalette_Audinite[]; -extern const u32 gItemIcon_Metagrossite[]; -extern const u32 gItemIconPalette_Metagrossite[]; -extern const u32 gItemIcon_Sharpedonite[]; -extern const u32 gItemIconPalette_Sharpedonite[]; -extern const u32 gItemIcon_Slowbronite[]; -extern const u32 gItemIconPalette_Slowbronite[]; -extern const u32 gItemIcon_Steelixite[]; -extern const u32 gItemIconPalette_Steelixite[]; -extern const u32 gItemIcon_Pidgeotite[]; -extern const u32 gItemIconPalette_Pidgeotite[]; -extern const u32 gItemIcon_Glalitite[]; -extern const u32 gItemIconPalette_Glalitite[]; -extern const u32 gItemIcon_Diancite[]; -extern const u32 gItemIconPalette_Diancite[]; -extern const u32 gItemIcon_Cameruptite[]; -extern const u32 gItemIconPalette_Cameruptite[]; -extern const u32 gItemIcon_Lopunnite[]; -extern const u32 gItemIconPalette_Lopunnite[]; -extern const u32 gItemIcon_Salamencite[]; -extern const u32 gItemIconPalette_Salamencite[]; -extern const u32 gItemIcon_Beedrillite[]; -extern const u32 gItemIconPalette_Beedrillite[]; -extern const u32 gItemIcon_MegaBracelet[]; -extern const u32 gItemIconPalette_MegaBracelet[]; -// Gen 7 Items -extern const u32 gItemIcon_ProtectivePads[]; -extern const u32 gItemIconPalette_ProtectivePads[]; -extern const u32 gItemIcon_TerrainExtender[]; -extern const u32 gItemIconPalette_TerrainExtender[]; -extern const u32 gItemIcon_ElectricSeed[]; -extern const u32 gItemIconPalette_ElectricSeed[]; -extern const u32 gItemIcon_GrassySeed[]; -extern const u32 gItemIconPalette_GrassySeed[]; -extern const u32 gItemIcon_MistySeed[]; -extern const u32 gItemIconPalette_MistySeed[]; -extern const u32 gItemIcon_PsychicSeed[]; -extern const u32 gItemIconPalette_PsychicSeed[]; -extern const u32 gItemIcon_AdrenalineOrb[]; -extern const u32 gItemIconPalette_AdrenalineOrb[]; extern const u32 gItemIcon_ReturnToFieldArrow[]; extern const u32 gItemIconPalette_ReturnToFieldArrow[]; diff --git a/include/pokemon.h b/include/pokemon.h index 259e9010a6..b07100fb04 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -387,6 +387,7 @@ enum BODY_COLOR_PINK }; +#define EVO_MEGA_EVOLUTION 0xffff // Not an actual evolution, used to temporarily mega evolve in battle. #define EVO_FRIENDSHIP 0x0001 // Pokémon levels up with friendship ≥ 220 #define EVO_FRIENDSHIP_DAY 0x0002 // Pokémon levels up during the day with friendship ≥ 220 #define EVO_FRIENDSHIP_NIGHT 0x0003 // Pokémon levels up at night with friendship ≥ 220 @@ -403,8 +404,6 @@ enum #define EVO_LEVEL_SHEDINJA 0x000e // Pokémon reaches the specified level (special value for Shedinja) #define EVO_BEAUTY 0x000f // Pokémon levels up with beauty ≥ specified value -#define EVO_MEGA_EVOLUTION 0xffff // Not an actual evolution, used to temporarily mega evolve in battle. - struct Evolution { u16 method; diff --git a/src/data/graphics/items.h b/src/data/graphics/items.h index b00a5b8546..26da9061df 100644 --- a/src/data/graphics/items.h +++ b/src/data/graphics/items.h @@ -736,401 +736,3 @@ const u32 gItemIconPalette_MagmaEmblem[] = INCBIN_U32("graphics/items/icon_palet const u32 gItemIcon_OldSeaMap[] = INCBIN_U32("graphics/items/icons/old_sea_map.4bpp.lz"); const u32 gItemIconPalette_OldSeaMap[] = INCBIN_U32("graphics/items/icon_palettes/old_sea_map.gbapal.lz"); - -// Gen 4 Items - -const u32 gItemIcon_WideLens[] = INCBIN_U32("graphics/items/icons/wide_lens.4bpp.lz"); -const u32 gItemIconPalette_WideLens[] = INCBIN_U32("graphics/items/icon_palettes/wide_lens.gbapal.lz"); - -const u32 gItemIcon_MuscleBand[] = INCBIN_U32("graphics/items/icons/muscle_band.4bpp.lz"); -const u32 gItemIconPalette_MuscleBand[] = INCBIN_U32("graphics/items/icon_palettes/muscle_band.gbapal.lz"); - -const u32 gItemIcon_WiseGlasses[] = INCBIN_U32("graphics/items/icons/wise_glasses.4bpp.lz"); -const u32 gItemIconPalette_WiseGlasses[] = INCBIN_U32("graphics/items/icon_palettes/wise_glasses.gbapal.lz"); - -const u32 gItemIcon_ExpertBelt[] = INCBIN_U32("graphics/items/icons/expert_belt.4bpp.lz"); -const u32 gItemIconPalette_ExpertBelt[] = INCBIN_U32("graphics/items/icon_palettes/expert_belt.gbapal.lz"); - -const u32 gItemIcon_LightClay[] = INCBIN_U32("graphics/items/icons/light_clay.4bpp.lz"); -const u32 gItemIconPalette_LightClay[] = INCBIN_U32("graphics/items/icon_palettes/light_clay.gbapal.lz"); - -const u32 gItemIcon_LifeOrb[] = INCBIN_U32("graphics/items/icons/life_orb.4bpp.lz"); -const u32 gItemIconPalette_LifeOrb[] = INCBIN_U32("graphics/items/icon_palettes/life_orb.gbapal.lz"); - -const u32 gItemIcon_PowerHerb[] = INCBIN_U32("graphics/items/icons/power_herb.4bpp.lz"); -const u32 gItemIconPalette_PowerHerb[] = INCBIN_U32("graphics/items/icon_palettes/power_herb.gbapal.lz"); - -const u32 gItemIcon_ToxicOrb[] = INCBIN_U32("graphics/items/icons/toxic_orb.4bpp.lz"); -const u32 gItemIconPalette_ToxicOrb[] = INCBIN_U32("graphics/items/icon_palettes/toxic_orb.gbapal.lz"); - -const u32 gItemIcon_FlameOrb[] = INCBIN_U32("graphics/items/icons/flame_orb.4bpp.lz"); -const u32 gItemIconPalette_FlameOrb[] = INCBIN_U32("graphics/items/icon_palettes/flame_orb.gbapal.lz"); - -const u32 gItemIcon_QuickPowder[] = INCBIN_U32("graphics/items/icons/quick_powder.4bpp.lz"); -const u32 gItemIconPalette_QuickPowder[] = INCBIN_U32("graphics/items/icon_palettes/quick_powder.gbapal.lz"); - -const u32 gItemIcon_FocusSash[] = INCBIN_U32("graphics/items/icons/focus_sash.4bpp.lz"); -const u32 gItemIconPalette_FocusSash[] = INCBIN_U32("graphics/items/icon_palettes/focus_sash.gbapal.lz"); - -const u32 gItemIcon_ZoomLens[] = INCBIN_U32("graphics/items/icons/zoom_lens.4bpp.lz"); -const u32 gItemIconPalette_ZoomLens[] = INCBIN_U32("graphics/items/icon_palettes/zoom_lens.gbapal.lz"); - -const u32 gItemIcon_Metronome[] = INCBIN_U32("graphics/items/icons/metronome.4bpp.lz"); -const u32 gItemIconPalette_Metronome[] = INCBIN_U32("graphics/items/icon_palettes/metronome.gbapal.lz"); - -const u32 gItemIcon_IronBall[] = INCBIN_U32("graphics/items/icons/iron_ball.4bpp.lz"); -const u32 gItemIconPalette_IronBall[] = INCBIN_U32("graphics/items/icon_palettes/iron_ball.gbapal.lz"); - -const u32 gItemIcon_LaggingTail[] = INCBIN_U32("graphics/items/icons/lagging_tail.4bpp.lz"); -const u32 gItemIconPalette_LaggingTail[] = INCBIN_U32("graphics/items/icon_palettes/lagging_tail.gbapal.lz"); - -const u32 gItemIcon_DestinyKnot[] = INCBIN_U32("graphics/items/icons/destiny_knot.4bpp.lz"); -const u32 gItemIconPalette_DestinyKnot[] = INCBIN_U32("graphics/items/icon_palettes/destiny_knot.gbapal.lz"); - -const u32 gItemIcon_BlackSludge[] = INCBIN_U32("graphics/items/icons/black_sludge.4bpp.lz"); -const u32 gItemIconPalette_BlackSludge[] = INCBIN_U32("graphics/items/icon_palettes/black_sludge.gbapal.lz"); - -const u32 gItemIcon_IcyRock[] = INCBIN_U32("graphics/items/icons/icy_rock.4bpp.lz"); -const u32 gItemIconPalette_IcyRock[] = INCBIN_U32("graphics/items/icon_palettes/icy_rock.gbapal.lz"); - -const u32 gItemIcon_SmoothRock[] = INCBIN_U32("graphics/items/icons/smooth_rock.4bpp.lz"); -const u32 gItemIconPalette_SmoothRock[] = INCBIN_U32("graphics/items/icon_palettes/smooth_rock.gbapal.lz"); - -const u32 gItemIcon_HeatRock[] = INCBIN_U32("graphics/items/icons/heat_rock.4bpp.lz"); -const u32 gItemIconPalette_HeatRock[] = INCBIN_U32("graphics/items/icon_palettes/heat_rock.gbapal.lz"); - -const u32 gItemIcon_DampRock[] = INCBIN_U32("graphics/items/icons/damp_rock.4bpp.lz"); -const u32 gItemIconPalette_DampRock[] = INCBIN_U32("graphics/items/icon_palettes/damp_rock.gbapal.lz"); - -const u32 gItemIcon_GripClaw[] = INCBIN_U32("graphics/items/icons/grip_claw.4bpp.lz"); -const u32 gItemIconPalette_GripClaw[] = INCBIN_U32("graphics/items/icon_palettes/grip_claw.gbapal.lz"); - -const u32 gItemIcon_ChoiceScarf[] = INCBIN_U32("graphics/items/icons/choice_scarf.4bpp.lz"); -const u32 gItemIconPalette_ChoiceScarf[] = INCBIN_U32("graphics/items/icon_palettes/choice_scarf.gbapal.lz"); - -const u32 gItemIcon_StickyBarb[] = INCBIN_U32("graphics/items/icons/sticky_barb.4bpp.lz"); -const u32 gItemIconPalette_StickyBarb[] = INCBIN_U32("graphics/items/icon_palettes/sticky_barb.gbapal.lz"); - -const u32 gItemIcon_ShedShell[] = INCBIN_U32("graphics/items/icons/shed_shell.4bpp.lz"); -const u32 gItemIconPalette_ShedShell[] = INCBIN_U32("graphics/items/icon_palettes/shed_shell.gbapal.lz"); - -const u32 gItemIcon_BigRoot[] = INCBIN_U32("graphics/items/icons/big_root.4bpp.lz"); -const u32 gItemIconPalette_BigRoot[] = INCBIN_U32("graphics/items/icon_palettes/big_root.gbapal.lz"); - -const u32 gItemIcon_ChoiceSpecs[] = INCBIN_U32("graphics/items/icons/choice_specs.4bpp.lz"); -const u32 gItemIconPalette_ChoiceSpecs[] = INCBIN_U32("graphics/items/icon_palettes/choice_specs.gbapal.lz"); - -const u32 gItemIcon_AdamantOrb[] = INCBIN_U32("graphics/items/icons/adamant_orb.4bpp.lz"); -const u32 gItemIconPalette_AdamantOrb[] = INCBIN_U32("graphics/items/icon_palettes/adamant_orb.gbapal.lz"); - -const u32 gItemIcon_LustrousOrb[] = INCBIN_U32("graphics/items/icons/lustrous_orb.4bpp.lz"); -const u32 gItemIconPalette_LustrousOrb[] = INCBIN_U32("graphics/items/icon_palettes/lustrous_orb.gbapal.lz"); - -const u32 gItemIcon_GriseousOrb[] = INCBIN_U32("graphics/items/icons/griseous_orb.4bpp.lz"); -const u32 gItemIconPalette_GriseousOrb[] = INCBIN_U32("graphics/items/icon_palettes/griseous_orb.gbapal.lz"); - -const u32 gItemIcon_FlamePlate[] = INCBIN_U32("graphics/items/icons/flame_plate.4bpp.lz"); -const u32 gItemIconPalette_FlamePlate[] = INCBIN_U32("graphics/items/icon_palettes/flame_plate.gbapal.lz"); - -const u32 gItemIcon_SplashPlate[] = INCBIN_U32("graphics/items/icons/splash_plate.4bpp.lz"); -const u32 gItemIconPalette_SplashPlate[] = INCBIN_U32("graphics/items/icon_palettes/splash_plate.gbapal.lz"); - -const u32 gItemIcon_ZapPlate[] = INCBIN_U32("graphics/items/icons/zap_plate.4bpp.lz"); -const u32 gItemIconPalette_ZapPlate[] = INCBIN_U32("graphics/items/icon_palettes/zap_plate.gbapal.lz"); - -const u32 gItemIcon_MeadowPlate[] = INCBIN_U32("graphics/items/icons/meadow_plate.4bpp.lz"); -const u32 gItemIconPalette_MeadowPlate[] = INCBIN_U32("graphics/items/icon_palettes/meadow_plate.gbapal.lz"); - -const u32 gItemIcon_IciclePlate[] = INCBIN_U32("graphics/items/icons/icicle_plate.4bpp.lz"); -const u32 gItemIconPalette_IciclePlate[] = INCBIN_U32("graphics/items/icon_palettes/icicle_plate.gbapal.lz"); - -const u32 gItemIcon_FistPlate[] = INCBIN_U32("graphics/items/icons/fist_plate.4bpp.lz"); -const u32 gItemIconPalette_FistPlate[] = INCBIN_U32("graphics/items/icon_palettes/fist_plate.gbapal.lz"); - -const u32 gItemIcon_ToxicPlate[] = INCBIN_U32("graphics/items/icons/toxic_plate.4bpp.lz"); -const u32 gItemIconPalette_ToxicPlate[] = INCBIN_U32("graphics/items/icon_palettes/toxic_plate.gbapal.lz"); - -const u32 gItemIcon_EarthPlate[] = INCBIN_U32("graphics/items/icons/earth_plate.4bpp.lz"); -const u32 gItemIconPalette_EarthPlate[] = INCBIN_U32("graphics/items/icon_palettes/earth_plate.gbapal.lz"); - -const u32 gItemIcon_SkyPlate[] = INCBIN_U32("graphics/items/icons/sky_plate.4bpp.lz"); -const u32 gItemIconPalette_SkyPlate[] = INCBIN_U32("graphics/items/icon_palettes/sky_plate.gbapal.lz"); - -const u32 gItemIcon_MindPlate[] = INCBIN_U32("graphics/items/icons/mind_plate.4bpp.lz"); -const u32 gItemIconPalette_MindPlate[] = INCBIN_U32("graphics/items/icon_palettes/mind_plate.gbapal.lz"); - -const u32 gItemIcon_InsectPlate[] = INCBIN_U32("graphics/items/icons/insect_plate.4bpp.lz"); -const u32 gItemIconPalette_InsectPlate[] = INCBIN_U32("graphics/items/icon_palettes/insect_plate.gbapal.lz"); - -const u32 gItemIcon_StonePlate[] = INCBIN_U32("graphics/items/icons/stone_plate.4bpp.lz"); -const u32 gItemIconPalette_StonePlate[] = INCBIN_U32("graphics/items/icon_palettes/stone_plate.gbapal.lz"); - -const u32 gItemIcon_SpookyPlate[] = INCBIN_U32("graphics/items/icons/spooky_plate.4bpp.lz"); -const u32 gItemIconPalette_SpookyPlate[] = INCBIN_U32("graphics/items/icon_palettes/spooky_plate.gbapal.lz"); - -const u32 gItemIcon_DracoPlate[] = INCBIN_U32("graphics/items/icons/draco_plate.4bpp.lz"); -const u32 gItemIconPalette_DracoPlate[] = INCBIN_U32("graphics/items/icon_palettes/draco_plate.gbapal.lz"); - -const u32 gItemIcon_DreadPlate[] = INCBIN_U32("graphics/items/icons/dread_plate.4bpp.lz"); -const u32 gItemIconPalette_DreadPlate[] = INCBIN_U32("graphics/items/icon_palettes/dread_plate.gbapal.lz"); - -const u32 gItemIcon_IronPlate[] = INCBIN_U32("graphics/items/icons/iron_plate.4bpp.lz"); -const u32 gItemIconPalette_IronPlate[] = INCBIN_U32("graphics/items/icon_palettes/iron_plate.gbapal.lz"); - -const u32 gItemIcon_Honey[] = INCBIN_U32("graphics/items/icons/honey.4bpp.lz"); -const u32 gItemIconPalette_Honey[] = INCBIN_U32("graphics/items/icon_palettes/honey.gbapal.lz"); - -// Gen 5 Items - -const u32 gItemIcon_Eviolite[] = INCBIN_U32("graphics/items/icons/eviolite.4bpp.lz"); -const u32 gItemIconPalette_Eviolite[] = INCBIN_U32("graphics/items/icon_palettes/eviolite.gbapal.lz"); - -const u32 gItemIcon_FloatStone[] = INCBIN_U32("graphics/items/icons/float_stone.4bpp.lz"); -const u32 gItemIconPalette_FloatStone[] = INCBIN_U32("graphics/items/icon_palettes/float_stone.gbapal.lz"); - -const u32 gItemIcon_BindingBand[] = INCBIN_U32("graphics/items/icons/binding_band.4bpp.lz"); -const u32 gItemIconPalette_BindingBand[] = INCBIN_U32("graphics/items/icon_palettes/binding_band.gbapal.lz"); - -const u32 gItemIcon_DouseDrive[] = INCBIN_U32("graphics/items/icons/douse_drive.4bpp.lz"); -const u32 gItemIconPalette_DouseDrive[] = INCBIN_U32("graphics/items/icon_palettes/douse_drive.gbapal.lz"); - -const u32 gItemIcon_ShockDrive[] = INCBIN_U32("graphics/items/icons/shock_drive.4bpp.lz"); -const u32 gItemIconPalette_ShockDrive[] = INCBIN_U32("graphics/items/icon_palettes/shock_drive.gbapal.lz"); - -const u32 gItemIcon_BurnDrive[] = INCBIN_U32("graphics/items/icons/burn_drive.4bpp.lz"); -const u32 gItemIconPalette_BurnDrive[] = INCBIN_U32("graphics/items/icon_palettes/burn_drive.gbapal.lz"); - -const u32 gItemIcon_ChillDrive[] = INCBIN_U32("graphics/items/icons/chill_drive.4bpp.lz"); -const u32 gItemIconPalette_ChillDrive[] = INCBIN_U32("graphics/items/icon_palettes/chill_drive.gbapal.lz"); - -const u32 gItemIcon_FireGem[] = INCBIN_U32("graphics/items/icons/fire_gem.4bpp.lz"); -const u32 gItemIconPalette_FireGem[] = INCBIN_U32("graphics/items/icon_palettes/fire_gem.gbapal.lz"); - -const u32 gItemIcon_WaterGem[] = INCBIN_U32("graphics/items/icons/water_gem.4bpp.lz"); -const u32 gItemIconPalette_WaterGem[] = INCBIN_U32("graphics/items/icon_palettes/water_gem.gbapal.lz"); - -const u32 gItemIcon_ElectricGem[] = INCBIN_U32("graphics/items/icons/electric_gem.4bpp.lz"); -const u32 gItemIconPalette_ElectricGem[] = INCBIN_U32("graphics/items/icon_palettes/electric_gem.gbapal.lz"); - -const u32 gItemIcon_GrassGem[] = INCBIN_U32("graphics/items/icons/grass_gem.4bpp.lz"); -const u32 gItemIconPalette_GrassGem[] = INCBIN_U32("graphics/items/icon_palettes/grass_gem.gbapal.lz"); - -const u32 gItemIcon_IceGem[] = INCBIN_U32("graphics/items/icons/ice_gem.4bpp.lz"); -const u32 gItemIconPalette_IceGem[] = INCBIN_U32("graphics/items/icon_palettes/ice_gem.gbapal.lz"); - -const u32 gItemIcon_FightingGem[] = INCBIN_U32("graphics/items/icons/fighting_gem.4bpp.lz"); -const u32 gItemIconPalette_FightingGem[] = INCBIN_U32("graphics/items/icon_palettes/fighting_gem.gbapal.lz"); - -const u32 gItemIcon_PoisonGem[] = INCBIN_U32("graphics/items/icons/poison_gem.4bpp.lz"); -const u32 gItemIconPalette_PoisonGem[] = INCBIN_U32("graphics/items/icon_palettes/poison_gem.gbapal.lz"); - -const u32 gItemIcon_GroundGem[] = INCBIN_U32("graphics/items/icons/ground_gem.4bpp.lz"); -const u32 gItemIconPalette_GroundGem[] = INCBIN_U32("graphics/items/icon_palettes/ground_gem.gbapal.lz"); - -const u32 gItemIcon_FlyingGem[] = INCBIN_U32("graphics/items/icons/flying_gem.4bpp.lz"); -const u32 gItemIconPalette_FlyingGem[] = INCBIN_U32("graphics/items/icon_palettes/flying_gem.gbapal.lz"); - -const u32 gItemIcon_PsychicGem[] = INCBIN_U32("graphics/items/icons/psychic_gem.4bpp.lz"); -const u32 gItemIconPalette_PsychicGem[] = INCBIN_U32("graphics/items/icon_palettes/psychic_gem.gbapal.lz"); - -const u32 gItemIcon_BugGem[] = INCBIN_U32("graphics/items/icons/bug_gem.4bpp.lz"); -const u32 gItemIconPalette_BugGem[] = INCBIN_U32("graphics/items/icon_palettes/bug_gem.gbapal.lz"); - -const u32 gItemIcon_RockGem[] = INCBIN_U32("graphics/items/icons/rock_gem.4bpp.lz"); -const u32 gItemIconPalette_RockGem[] = INCBIN_U32("graphics/items/icon_palettes/rock_gem.gbapal.lz"); - -const u32 gItemIcon_GhostGem[] = INCBIN_U32("graphics/items/icons/ghost_gem.4bpp.lz"); -const u32 gItemIconPalette_GhostGem[] = INCBIN_U32("graphics/items/icon_palettes/ghost_gem.gbapal.lz"); - -const u32 gItemIcon_DragonGem[] = INCBIN_U32("graphics/items/icons/dragon_gem.4bpp.lz"); -const u32 gItemIconPalette_DragonGem[] = INCBIN_U32("graphics/items/icon_palettes/dragon_gem.gbapal.lz"); - -const u32 gItemIcon_DarkGem[] = INCBIN_U32("graphics/items/icons/dark_gem.4bpp.lz"); -const u32 gItemIconPalette_DarkGem[] = INCBIN_U32("graphics/items/icon_palettes/dark_gem.gbapal.lz"); - -const u32 gItemIcon_SteelGem[] = INCBIN_U32("graphics/items/icons/steel_gem.4bpp.lz"); -const u32 gItemIconPalette_SteelGem[] = INCBIN_U32("graphics/items/icon_palettes/steel_gem.gbapal.lz"); - -const u32 gItemIcon_NormalGem[] = INCBIN_U32("graphics/items/icons/normal_gem.4bpp.lz"); -const u32 gItemIconPalette_NormalGem[] = INCBIN_U32("graphics/items/icon_palettes/normal_gem.gbapal.lz"); - -const u32 gItemIcon_FairyGem[] = INCBIN_U32("graphics/items/icons/fairy_gem.4bpp.lz"); -const u32 gItemIconPalette_FairyGem[] = INCBIN_U32("graphics/items/icon_palettes/fairy_gem.gbapal.lz"); - -// Gen 6 Items - -const u32 gItemIcon_AssaultVest[] = INCBIN_U32("graphics/items/icons/assault_vest.4bpp.lz"); -const u32 gItemIconPalette_AssaultVest[] = INCBIN_U32("graphics/items/icon_palettes/assault_vest.gbapal.lz"); - -const u32 gItemIcon_PixiePlate[] = INCBIN_U32("graphics/items/icons/pixie_plate.4bpp.lz"); -const u32 gItemIconPalette_PixiePlate[] = INCBIN_U32("graphics/items/icon_palettes/pixie_plate.gbapal.lz"); - -const u32 gItemIcon_SafetyGoggles[] = INCBIN_U32("graphics/items/icons/safety_goggles.4bpp.lz"); -const u32 gItemIconPalette_SafetyGoggles[] = INCBIN_U32("graphics/items/icon_palettes/safety_goggles.gbapal.lz"); - -const u32 gItemIcon_Gengarite[] = INCBIN_U32("graphics/items/icons/gengarite.4bpp.lz"); -const u32 gItemIconPalette_Gengarite[] = INCBIN_U32("graphics/items/icon_palettes/gengarite.gbapal.lz"); - -const u32 gItemIcon_Gardevoirite[] = INCBIN_U32("graphics/items/icons/gardevoirite.4bpp.lz"); -const u32 gItemIconPalette_Gardevoirite[] = INCBIN_U32("graphics/items/icon_palettes/gardevoirite.gbapal.lz"); - -const u32 gItemIcon_Ampharosite[] = INCBIN_U32("graphics/items/icons/ampharosite.4bpp.lz"); -const u32 gItemIconPalette_Ampharosite[] = INCBIN_U32("graphics/items/icon_palettes/ampharosite.gbapal.lz"); - -const u32 gItemIcon_Venusaurite[] = INCBIN_U32("graphics/items/icons/venusaurite.4bpp.lz"); -const u32 gItemIconPalette_Venusaurite[] = INCBIN_U32("graphics/items/icon_palettes/venusaurite.gbapal.lz"); - -const u32 gItemIcon_CharizarditeX[] = INCBIN_U32("graphics/items/icons/charizardite_x.4bpp.lz"); -const u32 gItemIconPalette_CharizarditeX[] = INCBIN_U32("graphics/items/icon_palettes/charizardite_x.gbapal.lz"); - -const u32 gItemIcon_Blastoisinite[] = INCBIN_U32("graphics/items/icons/blastoisinite.4bpp.lz"); -const u32 gItemIconPalette_Blastoisinite[] = INCBIN_U32("graphics/items/icon_palettes/blastoisinite.gbapal.lz"); - -const u32 gItemIcon_MewtwoniteX[] = INCBIN_U32("graphics/items/icons/mewtwonite_x.4bpp.lz"); -const u32 gItemIconPalette_MewtwoniteX[] = INCBIN_U32("graphics/items/icon_palettes/mewtwonite_x.gbapal.lz"); - -const u32 gItemIcon_MewtwoniteY[] = INCBIN_U32("graphics/items/icons/mewtwonite_y.4bpp.lz"); -const u32 gItemIconPalette_MewtwoniteY[] = INCBIN_U32("graphics/items/icon_palettes/mewtwonite_y.gbapal.lz"); - -const u32 gItemIcon_Blazikenite[] = INCBIN_U32("graphics/items/icons/blazikenite.4bpp.lz"); -const u32 gItemIconPalette_Blazikenite[] = INCBIN_U32("graphics/items/icon_palettes/blazikenite.gbapal.lz"); - -const u32 gItemIcon_Medichamite[] = INCBIN_U32("graphics/items/icons/medichamite.4bpp.lz"); -const u32 gItemIconPalette_Medichamite[] = INCBIN_U32("graphics/items/icon_palettes/medichamite.gbapal.lz"); - -const u32 gItemIcon_Houndoominite[] = INCBIN_U32("graphics/items/icons/houndoominite.4bpp.lz"); -const u32 gItemIconPalette_Houndoominite[] = INCBIN_U32("graphics/items/icon_palettes/houndoominite.gbapal.lz"); - -const u32 gItemIcon_Aggronite[] = INCBIN_U32("graphics/items/icons/aggronite.4bpp.lz"); -const u32 gItemIconPalette_Aggronite[] = INCBIN_U32("graphics/items/icon_palettes/aggronite.gbapal.lz"); - -const u32 gItemIcon_Banettite[] = INCBIN_U32("graphics/items/icons/banettite.4bpp.lz"); -const u32 gItemIconPalette_Banettite[] = INCBIN_U32("graphics/items/icon_palettes/banettite.gbapal.lz"); - -const u32 gItemIcon_Tyranitarite[] = INCBIN_U32("graphics/items/icons/tyranitarite.4bpp.lz"); -const u32 gItemIconPalette_Tyranitarite[] = INCBIN_U32("graphics/items/icon_palettes/tyranitarite.gbapal.lz"); - -const u32 gItemIcon_Scizorite[] = INCBIN_U32("graphics/items/icons/scizorite.4bpp.lz"); -const u32 gItemIconPalette_Scizorite[] = INCBIN_U32("graphics/items/icon_palettes/scizorite.gbapal.lz"); - -const u32 gItemIcon_Pinsirite[] = INCBIN_U32("graphics/items/icons/pinsirite.4bpp.lz"); -const u32 gItemIconPalette_Pinsirite[] = INCBIN_U32("graphics/items/icon_palettes/pinsirite.gbapal.lz"); - -const u32 gItemIcon_Aerodactylite[] = INCBIN_U32("graphics/items/icons/aerodactylite.4bpp.lz"); -const u32 gItemIconPalette_Aerodactylite[] = INCBIN_U32("graphics/items/icon_palettes/aerodactylite.gbapal.lz"); - -const u32 gItemIcon_Lucarionite[] = INCBIN_U32("graphics/items/icons/lucarionite.4bpp.lz"); -const u32 gItemIconPalette_Lucarionite[] = INCBIN_U32("graphics/items/icon_palettes/lucarionite.gbapal.lz"); - -const u32 gItemIcon_Abomasite[] = INCBIN_U32("graphics/items/icons/abomasite.4bpp.lz"); -const u32 gItemIconPalette_Abomasite[] = INCBIN_U32("graphics/items/icon_palettes/abomasite.gbapal.lz"); - -const u32 gItemIcon_Kangaskhanite[] = INCBIN_U32("graphics/items/icons/kangaskhanite.4bpp.lz"); -const u32 gItemIconPalette_Kangaskhanite[] = INCBIN_U32("graphics/items/icon_palettes/kangaskhanite.gbapal.lz"); - -const u32 gItemIcon_Gyaradosite[] = INCBIN_U32("graphics/items/icons/gyaradosite.4bpp.lz"); -const u32 gItemIconPalette_Gyaradosite[] = INCBIN_U32("graphics/items/icon_palettes/gyaradosite.gbapal.lz"); - -const u32 gItemIcon_Absolite[] = INCBIN_U32("graphics/items/icons/absolite.4bpp.lz"); -const u32 gItemIconPalette_Absolite[] = INCBIN_U32("graphics/items/icon_palettes/absolite.gbapal.lz"); - -const u32 gItemIcon_CharizarditeY[] = INCBIN_U32("graphics/items/icons/charizardite_y.4bpp.lz"); -const u32 gItemIconPalette_CharizarditeY[] = INCBIN_U32("graphics/items/icon_palettes/charizardite_y.gbapal.lz"); - -const u32 gItemIcon_Alakazite[] = INCBIN_U32("graphics/items/icons/alakazite.4bpp.lz"); -const u32 gItemIconPalette_Alakazite[] = INCBIN_U32("graphics/items/icon_palettes/alakazite.gbapal.lz"); - -const u32 gItemIcon_Heracronite[] = INCBIN_U32("graphics/items/icons/heracronite.4bpp.lz"); -const u32 gItemIconPalette_Heracronite[] = INCBIN_U32("graphics/items/icon_palettes/heracronite.gbapal.lz"); - -const u32 gItemIcon_Mawilite[] = INCBIN_U32("graphics/items/icons/mawilite.4bpp.lz"); -const u32 gItemIconPalette_Mawilite[] = INCBIN_U32("graphics/items/icon_palettes/mawilite.gbapal.lz"); - -const u32 gItemIcon_Manectite[] = INCBIN_U32("graphics/items/icons/manectite.4bpp.lz"); -const u32 gItemIconPalette_Manectite[] = INCBIN_U32("graphics/items/icon_palettes/manectite.gbapal.lz"); - -const u32 gItemIcon_Garchompite[] = INCBIN_U32("graphics/items/icons/garchompite.4bpp.lz"); -const u32 gItemIconPalette_Garchompite[] = INCBIN_U32("graphics/items/icon_palettes/garchompite.gbapal.lz"); - -const u32 gItemIcon_Latiasite[] = INCBIN_U32("graphics/items/icons/latiasite.4bpp.lz"); -const u32 gItemIconPalette_Latiasite[] = INCBIN_U32("graphics/items/icon_palettes/latiasite.gbapal.lz"); - -const u32 gItemIcon_Latiosite[] = INCBIN_U32("graphics/items/icons/latiosite.4bpp.lz"); -const u32 gItemIconPalette_Latiosite[] = INCBIN_U32("graphics/items/icon_palettes/latiosite.gbapal.lz"); - -const u32 gItemIcon_Swampertite[] = INCBIN_U32("graphics/items/icons/swampertite.4bpp.lz"); -const u32 gItemIconPalette_Swampertite[] = INCBIN_U32("graphics/items/icon_palettes/swampertite.gbapal.lz"); - -const u32 gItemIcon_Sceptilite[] = INCBIN_U32("graphics/items/icons/sceptilite.4bpp.lz"); -const u32 gItemIconPalette_Sceptilite[] = INCBIN_U32("graphics/items/icon_palettes/sceptilite.gbapal.lz"); - -const u32 gItemIcon_Sablenite[] = INCBIN_U32("graphics/items/icons/sablenite.4bpp.lz"); -const u32 gItemIconPalette_Sablenite[] = INCBIN_U32("graphics/items/icon_palettes/sablenite.gbapal.lz"); - -const u32 gItemIcon_Altarianite[] = INCBIN_U32("graphics/items/icons/altarianite.4bpp.lz"); -const u32 gItemIconPalette_Altarianite[] = INCBIN_U32("graphics/items/icon_palettes/altarianite.gbapal.lz"); - -const u32 gItemIcon_Galladite[] = INCBIN_U32("graphics/items/icons/galladite.4bpp.lz"); -const u32 gItemIconPalette_Galladite[] = INCBIN_U32("graphics/items/icon_palettes/galladite.gbapal.lz"); - -const u32 gItemIcon_Audinite[] = INCBIN_U32("graphics/items/icons/audinite.4bpp.lz"); -const u32 gItemIconPalette_Audinite[] = INCBIN_U32("graphics/items/icon_palettes/audinite.gbapal.lz"); - -const u32 gItemIcon_Metagrossite[] = INCBIN_U32("graphics/items/icons/metagrossite.4bpp.lz"); -const u32 gItemIconPalette_Metagrossite[] = INCBIN_U32("graphics/items/icon_palettes/metagrossite.gbapal.lz"); - -const u32 gItemIcon_Sharpedonite[] = INCBIN_U32("graphics/items/icons/sharpedonite.4bpp.lz"); -const u32 gItemIconPalette_Sharpedonite[] = INCBIN_U32("graphics/items/icon_palettes/sharpedonite.gbapal.lz"); - -const u32 gItemIcon_Slowbronite[] = INCBIN_U32("graphics/items/icons/slowbronite.4bpp.lz"); -const u32 gItemIconPalette_Slowbronite[] = INCBIN_U32("graphics/items/icon_palettes/slowbronite.gbapal.lz"); - -const u32 gItemIcon_Steelixite[] = INCBIN_U32("graphics/items/icons/steelixite.4bpp.lz"); -const u32 gItemIconPalette_Steelixite[] = INCBIN_U32("graphics/items/icon_palettes/steelixite.gbapal.lz"); - -const u32 gItemIcon_Pidgeotite[] = INCBIN_U32("graphics/items/icons/pidgeotite.4bpp.lz"); -const u32 gItemIconPalette_Pidgeotite[] = INCBIN_U32("graphics/items/icon_palettes/pidgeotite.gbapal.lz"); - -const u32 gItemIcon_Glalitite[] = INCBIN_U32("graphics/items/icons/glalitite.4bpp.lz"); -const u32 gItemIconPalette_Glalitite[] = INCBIN_U32("graphics/items/icon_palettes/glalitite.gbapal.lz"); - -const u32 gItemIcon_Diancite[] = INCBIN_U32("graphics/items/icons/diancite.4bpp.lz"); -const u32 gItemIconPalette_Diancite[] = INCBIN_U32("graphics/items/icon_palettes/diancite.gbapal.lz"); - -const u32 gItemIcon_Cameruptite[] = INCBIN_U32("graphics/items/icons/cameruptite.4bpp.lz"); -const u32 gItemIconPalette_Cameruptite[] = INCBIN_U32("graphics/items/icon_palettes/cameruptite.gbapal.lz"); - -const u32 gItemIcon_Lopunnite[] = INCBIN_U32("graphics/items/icons/lopunnite.4bpp.lz"); -const u32 gItemIconPalette_Lopunnite[] = INCBIN_U32("graphics/items/icon_palettes/lopunnite.gbapal.lz"); - -const u32 gItemIcon_Salamencite[] = INCBIN_U32("graphics/items/icons/salamencite.4bpp.lz"); -const u32 gItemIconPalette_Salamencite[] = INCBIN_U32("graphics/items/icon_palettes/salamencite.gbapal.lz"); - -const u32 gItemIcon_Beedrillite[] = INCBIN_U32("graphics/items/icons/beedrillite.4bpp.lz"); -const u32 gItemIconPalette_Beedrillite[] = INCBIN_U32("graphics/items/icon_palettes/beedrillite.gbapal.lz"); - -const u32 gItemIcon_MegaBracelet[] = INCBIN_U32("graphics/items/icons/mega_bracelet.4bpp.lz"); -const u32 gItemIconPalette_MegaBracelet[] = INCBIN_U32("graphics/items/icon_palettes/mega_bracelet.gbapal.lz"); - -// Gen 7 Items - -const u32 gItemIcon_ProtectivePads[] = INCBIN_U32("graphics/items/icons/protective_pads.4bpp.lz"); -const u32 gItemIconPalette_ProtectivePads[] = INCBIN_U32("graphics/items/icon_palettes/protective_pads.gbapal.lz"); - -const u32 gItemIcon_TerrainExtender[] = INCBIN_U32("graphics/items/icons/terrain_extender.4bpp.lz"); -const u32 gItemIconPalette_TerrainExtender[] = INCBIN_U32("graphics/items/icon_palettes/terrain_extender.gbapal.lz"); - -const u32 gItemIcon_ElectricSeed[] = INCBIN_U32("graphics/items/icons/electric_seed.4bpp.lz"); -const u32 gItemIconPalette_ElectricSeed[] = INCBIN_U32("graphics/items/icon_palettes/electric_seed.gbapal.lz"); - -const u32 gItemIcon_GrassySeed[] = INCBIN_U32("graphics/items/icons/grassy_seed.4bpp.lz"); -const u32 gItemIconPalette_GrassySeed[] = INCBIN_U32("graphics/items/icon_palettes/grassy_seed.gbapal.lz"); - -const u32 gItemIcon_MistySeed[] = INCBIN_U32("graphics/items/icons/misty_seed.4bpp.lz"); -const u32 gItemIconPalette_MistySeed[] = INCBIN_U32("graphics/items/icon_palettes/misty_seed.gbapal.lz"); - -const u32 gItemIcon_PsychicSeed[] = INCBIN_U32("graphics/items/icons/psychic_seed.4bpp.lz"); -const u32 gItemIconPalette_PsychicSeed[] = INCBIN_U32("graphics/items/icon_palettes/psychic_seed.gbapal.lz"); - -const u32 gItemIcon_AdrenalineOrb[] = INCBIN_U32("graphics/items/icons/adrenaline_orb.4bpp.lz"); -const u32 gItemIconPalette_AdrenalineOrb[] = INCBIN_U32("graphics/items/icon_palettes/adrenaline_orb.gbapal.lz"); diff --git a/src/data/item_icon_table.h b/src/data/item_icon_table.h index e2c9d673b4..c36969ab54 100644 --- a/src/data/item_icon_table.h +++ b/src/data/item_icon_table.h @@ -245,7 +245,7 @@ const u32 *const gItemIconTable[][2] = [ITEM_THICK_CLUB] = {gItemIcon_ThickClub, gItemIconPalette_ThickClub}, [ITEM_STICK] = {gItemIcon_Stick, gItemIconPalette_Stick}, // ???????? - [ITEM_MEGA_STONE_TESTING] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, + [ITEM_0E2] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0E3] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0E4] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, [ITEM_0E5] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, @@ -402,140 +402,6 @@ const u32 *const gItemIconTable[][2] = // Emerald-only key items [ITEM_MAGMA_EMBLEM] = {gItemIcon_MagmaEmblem, gItemIconPalette_MagmaEmblem}, [ITEM_OLD_SEA_MAP] = {gItemIcon_OldSeaMap, gItemIconPalette_OldSeaMap}, - // Gen 4 Items - [ITEM_WIDE_LENS] = {gItemIcon_WideLens, gItemIconPalette_WideLens}, - [ITEM_MUSCLE_BAND] = {gItemIcon_MuscleBand, gItemIconPalette_MuscleBand}, - [ITEM_WISE_GLASSES] = {gItemIcon_WiseGlasses, gItemIconPalette_WiseGlasses}, - [ITEM_EXPERT_BELT] = {gItemIcon_ExpertBelt, gItemIconPalette_ExpertBelt}, - [ITEM_LIGHT_CLAY] = {gItemIcon_LightClay, gItemIconPalette_LightClay}, - [ITEM_LIFE_ORB] = {gItemIcon_LifeOrb, gItemIconPalette_LifeOrb}, - [ITEM_POWER_HERB] = {gItemIcon_PowerHerb, gItemIconPalette_PowerHerb}, - [ITEM_TOXIC_ORB] = {gItemIcon_ToxicOrb, gItemIconPalette_ToxicOrb}, - [ITEM_FLAME_ORB] = {gItemIcon_FlameOrb, gItemIconPalette_FlameOrb}, - [ITEM_QUICK_POWDER] = {gItemIcon_QuickPowder, gItemIconPalette_QuickPowder}, - [ITEM_FOCUS_SASH] = {gItemIcon_FocusSash, gItemIconPalette_FocusSash}, - [ITEM_ZOOM_LENS] = {gItemIcon_ZoomLens, gItemIconPalette_ZoomLens}, - [ITEM_METRONOME] = {gItemIcon_Metronome, gItemIconPalette_Metronome}, - [ITEM_IRON_BALL] = {gItemIcon_IronBall, gItemIconPalette_IronBall}, - [ITEM_LAGGING_TAIL] = {gItemIcon_LaggingTail, gItemIconPalette_LaggingTail}, - [ITEM_DESTINY_KNOT] = {gItemIcon_DestinyKnot, gItemIconPalette_DestinyKnot}, - [ITEM_BLACK_SLUDGE] = {gItemIcon_BlackSludge, gItemIconPalette_BlackSludge}, - [ITEM_ICY_ROCK] = {gItemIcon_IcyRock, gItemIconPalette_IcyRock}, - [ITEM_SMOOTH_ROCK] = {gItemIcon_SmoothRock, gItemIconPalette_SmoothRock}, - [ITEM_HEAT_ROCK] = {gItemIcon_HeatRock, gItemIconPalette_HeatRock}, - [ITEM_DAMP_ROCK] = {gItemIcon_DampRock, gItemIconPalette_DampRock}, - [ITEM_GRIP_CLAW] = {gItemIcon_GripClaw, gItemIconPalette_GripClaw}, - [ITEM_CHOICE_SCARF] = {gItemIcon_ChoiceScarf, gItemIconPalette_ChoiceScarf}, - [ITEM_STICKY_BARB] = {gItemIcon_StickyBarb, gItemIconPalette_StickyBarb}, - [ITEM_SHED_SHELL] = {gItemIcon_ShedShell, gItemIconPalette_ShedShell}, - [ITEM_BIG_ROOT] = {gItemIcon_BigRoot, gItemIconPalette_BigRoot}, - [ITEM_CHOICE_SPECS] = {gItemIcon_ChoiceSpecs, gItemIconPalette_ChoiceSpecs}, - [ITEM_ADAMANT_ORB] = {gItemIcon_AdamantOrb, gItemIconPalette_AdamantOrb}, - [ITEM_LUSTROUS_ORB] = {gItemIcon_LustrousOrb, gItemIconPalette_LustrousOrb}, - [ITEM_GRISEOUS_ORB] = {gItemIcon_GriseousOrb, gItemIconPalette_GriseousOrb}, - [ITEM_FLAME_PLATE] = {gItemIcon_FlamePlate, gItemIconPalette_FlamePlate}, - [ITEM_SPLASH_PLATE] = {gItemIcon_SplashPlate, gItemIconPalette_SplashPlate}, - [ITEM_ZAP_PLATE] = {gItemIcon_ZapPlate, gItemIconPalette_ZapPlate}, - [ITEM_MEADOW_PLATE] = {gItemIcon_MeadowPlate, gItemIconPalette_MeadowPlate}, - [ITEM_ICICLE_PLATE] = {gItemIcon_IciclePlate, gItemIconPalette_IciclePlate}, - [ITEM_FIST_PLATE] = {gItemIcon_FistPlate, gItemIconPalette_FistPlate}, - [ITEM_TOXIC_PLATE] = {gItemIcon_ToxicPlate, gItemIconPalette_ToxicPlate}, - [ITEM_EARTH_PLATE] = {gItemIcon_EarthPlate, gItemIconPalette_EarthPlate}, - [ITEM_SKY_PLATE] = {gItemIcon_SkyPlate, gItemIconPalette_SkyPlate}, - [ITEM_MIND_PLATE] = {gItemIcon_MindPlate, gItemIconPalette_MindPlate}, - [ITEM_INSECT_PLATE] = {gItemIcon_InsectPlate, gItemIconPalette_InsectPlate}, - [ITEM_STONE_PLATE] = {gItemIcon_StonePlate, gItemIconPalette_StonePlate}, - [ITEM_SPOOKY_PLATE] = {gItemIcon_SpookyPlate, gItemIconPalette_SpookyPlate}, - [ITEM_DRACO_PLATE] = {gItemIcon_DracoPlate, gItemIconPalette_DracoPlate}, - [ITEM_DREAD_PLATE] = {gItemIcon_DreadPlate, gItemIconPalette_DreadPlate}, - [ITEM_IRON_PLATE] = {gItemIcon_IronPlate, gItemIconPalette_IronPlate}, - [ITEM_HONEY] = {gItemIcon_Honey, gItemIconPalette_Honey}, - // Gen 5 Items - [ITEM_EVIOLITE] = {gItemIcon_Eviolite, gItemIconPalette_Eviolite}, - [ITEM_FLOAT_STONE] = {gItemIcon_FloatStone, gItemIconPalette_FloatStone}, - [ITEM_BINDING_BAND] = {gItemIcon_BindingBand, gItemIconPalette_BindingBand}, - [ITEM_DOUSE_DRIVE] = {gItemIcon_DouseDrive, gItemIconPalette_DouseDrive}, - [ITEM_SHOCK_DRIVE] = {gItemIcon_ShockDrive, gItemIconPalette_ShockDrive}, - [ITEM_BURN_DRIVE] = {gItemIcon_BurnDrive, gItemIconPalette_BurnDrive}, - [ITEM_CHILL_DRIVE] = {gItemIcon_ChillDrive, gItemIconPalette_ChillDrive}, - [ITEM_FIRE_GEM] = {gItemIcon_FireGem, gItemIconPalette_FireGem}, - [ITEM_WATER_GEM] = {gItemIcon_WaterGem, gItemIconPalette_WaterGem}, - [ITEM_ELECTRIC_GEM] = {gItemIcon_ElectricGem, gItemIconPalette_ElectricGem}, - [ITEM_GRASS_GEM] = {gItemIcon_GrassGem, gItemIconPalette_GrassGem}, - [ITEM_ICE_GEM] = {gItemIcon_IceGem, gItemIconPalette_IceGem}, - [ITEM_FIGHTING_GEM] = {gItemIcon_FightingGem, gItemIconPalette_FightingGem}, - [ITEM_POISON_GEM] = {gItemIcon_PoisonGem, gItemIconPalette_PoisonGem}, - [ITEM_GROUND_GEM] = {gItemIcon_GroundGem, gItemIconPalette_GroundGem}, - [ITEM_FLYING_GEM] = {gItemIcon_FlyingGem, gItemIconPalette_FlyingGem}, - [ITEM_PSYCHIC_GEM] = {gItemIcon_PsychicGem, gItemIconPalette_PsychicGem}, - [ITEM_BUG_GEM] = {gItemIcon_BugGem, gItemIconPalette_BugGem}, - [ITEM_ROCK_GEM] = {gItemIcon_RockGem, gItemIconPalette_RockGem}, - [ITEM_GHOST_GEM] = {gItemIcon_GhostGem, gItemIconPalette_GhostGem}, - [ITEM_DRAGON_GEM] = {gItemIcon_DragonGem, gItemIconPalette_DragonGem}, - [ITEM_DARK_GEM] = {gItemIcon_DarkGem, gItemIconPalette_DarkGem}, - [ITEM_STEEL_GEM] = {gItemIcon_SteelGem, gItemIconPalette_SteelGem}, - [ITEM_NORMAL_GEM] = {gItemIcon_NormalGem, gItemIconPalette_NormalGem}, - [ITEM_FAIRY_GEM] = {gItemIcon_FairyGem, gItemIconPalette_FairyGem}, - // Gen 6 Items - [ITEM_ASSAULT_VEST] = {gItemIcon_AssaultVest, gItemIconPalette_AssaultVest}, - [ITEM_PIXIE_PLATE] = {gItemIcon_PixiePlate, gItemIconPalette_PixiePlate}, - [ITEM_SAFETY_GOGGLES] = {gItemIcon_SafetyGoggles, gItemIconPalette_SafetyGoggles}, - [ITEM_GENGARITE] = {gItemIcon_Gengarite, gItemIconPalette_Gengarite}, - [ITEM_GARDEVOIRITE] = {gItemIcon_Gardevoirite, gItemIconPalette_Gardevoirite}, - [ITEM_AMPHAROSITE] = {gItemIcon_Ampharosite, gItemIconPalette_Ampharosite}, - [ITEM_VENUSAURITE] = {gItemIcon_Venusaurite, gItemIconPalette_Venusaurite}, - [ITEM_CHARIZARDITE_X] = {gItemIcon_CharizarditeX, gItemIconPalette_CharizarditeX}, - [ITEM_BLASTOISINITE] = {gItemIcon_Blastoisinite, gItemIconPalette_Blastoisinite}, - [ITEM_MEWTWONITE_X] = {gItemIcon_MewtwoniteX, gItemIconPalette_MewtwoniteX}, - [ITEM_MEWTWONITE_Y] = {gItemIcon_MewtwoniteY, gItemIconPalette_MewtwoniteY}, - [ITEM_BLAZIKENITE] = {gItemIcon_Blazikenite, gItemIconPalette_Blazikenite}, - [ITEM_MEDICHAMITE] = {gItemIcon_Medichamite, gItemIconPalette_Medichamite}, - [ITEM_HOUNDOOMINITE] = {gItemIcon_Houndoominite, gItemIconPalette_Houndoominite}, - [ITEM_AGGRONITE] = {gItemIcon_Aggronite, gItemIconPalette_Aggronite}, - [ITEM_BANETTITE] = {gItemIcon_Banettite, gItemIconPalette_Banettite}, - [ITEM_TYRANITARITE] = {gItemIcon_Tyranitarite, gItemIconPalette_Tyranitarite}, - [ITEM_SCIZORITE] = {gItemIcon_Scizorite, gItemIconPalette_Scizorite}, - [ITEM_PINSIRITE] = {gItemIcon_Pinsirite, gItemIconPalette_Pinsirite}, - [ITEM_AERODACTYLITE] = {gItemIcon_Aerodactylite, gItemIconPalette_Aerodactylite}, - [ITEM_LUCARIONITE] = {gItemIcon_Lucarionite, gItemIconPalette_Lucarionite}, - [ITEM_ABOMASITE] = {gItemIcon_Abomasite, gItemIconPalette_Abomasite}, - [ITEM_KANGASKHANITE] = {gItemIcon_Kangaskhanite, gItemIconPalette_Kangaskhanite}, - [ITEM_GYARADOSITE] = {gItemIcon_Gyaradosite, gItemIconPalette_Gyaradosite}, - [ITEM_ABSOLITE] = {gItemIcon_Absolite, gItemIconPalette_Absolite}, - [ITEM_CHARIZARDITE_Y] = {gItemIcon_CharizarditeY, gItemIconPalette_CharizarditeY}, - [ITEM_ALAKAZITE] = {gItemIcon_Alakazite, gItemIconPalette_Alakazite}, - [ITEM_HERACRONITE] = {gItemIcon_Heracronite, gItemIconPalette_Heracronite}, - [ITEM_MAWILITE] = {gItemIcon_Mawilite, gItemIconPalette_Mawilite}, - [ITEM_MANECTITE] = {gItemIcon_Manectite, gItemIconPalette_Manectite}, - [ITEM_GARCHOMPITE] = {gItemIcon_Garchompite, gItemIconPalette_Garchompite}, - [ITEM_LATIASITE] = {gItemIcon_Latiasite, gItemIconPalette_Latiasite}, - [ITEM_LATIOSITE] = {gItemIcon_Latiosite, gItemIconPalette_Latiosite}, - [ITEM_SWAMPERTITE] = {gItemIcon_Swampertite, gItemIconPalette_Swampertite}, - [ITEM_SCEPTILITE] = {gItemIcon_Sceptilite, gItemIconPalette_Sceptilite}, - [ITEM_SABLENITE] = {gItemIcon_Sablenite, gItemIconPalette_Sablenite}, - [ITEM_ALTARIANITE] = {gItemIcon_Altarianite, gItemIconPalette_Altarianite}, - [ITEM_GALLADITE] = {gItemIcon_Galladite, gItemIconPalette_Galladite}, - [ITEM_AUDINITE] = {gItemIcon_Audinite, gItemIconPalette_Audinite}, - [ITEM_METAGROSSITE] = {gItemIcon_Metagrossite, gItemIconPalette_Metagrossite}, - [ITEM_SHARPEDONITE] = {gItemIcon_Sharpedonite, gItemIconPalette_Sharpedonite}, - [ITEM_SLOWBRONITE] = {gItemIcon_Slowbronite, gItemIconPalette_Slowbronite}, - [ITEM_STEELIXITE] = {gItemIcon_Steelixite, gItemIconPalette_Steelixite}, - [ITEM_PIDGEOTITE] = {gItemIcon_Pidgeotite, gItemIconPalette_Pidgeotite}, - [ITEM_GLALITITE] = {gItemIcon_Glalitite, gItemIconPalette_Glalitite}, - [ITEM_DIANCITE] = {gItemIcon_Diancite, gItemIconPalette_Diancite}, - [ITEM_CAMERUPTITE] = {gItemIcon_Cameruptite, gItemIconPalette_Cameruptite}, - [ITEM_LOPUNNITE] = {gItemIcon_Lopunnite, gItemIconPalette_Lopunnite}, - [ITEM_SALAMENCITE] = {gItemIcon_Salamencite, gItemIconPalette_Salamencite}, - [ITEM_BEEDRILLITE] = {gItemIcon_Beedrillite, gItemIconPalette_Beedrillite}, - [ITEM_MEGA_BRACELET] = {gItemIcon_MegaBracelet, gItemIconPalette_MegaBracelet}, - // Gen 7 Items - [ITEM_PROTECTIVE_PADS] = {gItemIcon_ProtectivePads, gItemIconPalette_ProtectivePads}, - [ITEM_TERRAIN_EXTENDER] = {gItemIcon_TerrainExtender, gItemIconPalette_TerrainExtender}, - [ITEM_ELECTRIC_SEED] = {gItemIcon_ElectricSeed, gItemIconPalette_ElectricSeed}, - [ITEM_GRASSY_SEED] = {gItemIcon_GrassySeed, gItemIconPalette_GrassySeed}, - [ITEM_MISTY_SEED] = {gItemIcon_MistySeed, gItemIconPalette_MistySeed}, - [ITEM_PSYCHIC_SEED] = {gItemIcon_PsychicSeed, gItemIconPalette_PsychicSeed}, - [ITEM_ADRENALINE_ORB] = {gItemIcon_AdrenalineOrb, gItemIconPalette_AdrenalineOrb}, // Return to field arrow [ITEM_FIELD_ARROW] = {gItemIcon_ReturnToFieldArrow, gItemIconPalette_ReturnToFieldArrow}, }; diff --git a/src/data/items.h b/src/data/items.h index 5738f7fba6..7d7caa289a 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -22,7 +22,7 @@ const struct Item gItems[] = [ITEM_MASTER_BALL] = { - .name = _("Master Ball"), + .name = _("MASTER BALL"), .itemId = ITEM_MASTER_BALL, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -40,7 +40,7 @@ const struct Item gItems[] = [ITEM_ULTRA_BALL] = { - .name = _("Ultra Ball"), + .name = _("ULTRA BALL"), .itemId = ITEM_ULTRA_BALL, .price = 1200, .holdEffect = HOLD_EFFECT_NONE, @@ -58,7 +58,7 @@ const struct Item gItems[] = [ITEM_GREAT_BALL] = { - .name = _("Great Ball"), + .name = _("GREAT BALL"), .itemId = ITEM_GREAT_BALL, .price = 600, .holdEffect = HOLD_EFFECT_NONE, @@ -76,7 +76,7 @@ const struct Item gItems[] = [ITEM_POKE_BALL] = { - .name = _("Poké Ball"), + .name = _("POKé BALL"), .itemId = ITEM_POKE_BALL, .price = 200, .holdEffect = HOLD_EFFECT_NONE, @@ -94,7 +94,7 @@ const struct Item gItems[] = [ITEM_SAFARI_BALL] = { - .name = _("Safari Ball"), + .name = _("SAFARI BALL"), .itemId = ITEM_SAFARI_BALL, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -112,7 +112,7 @@ const struct Item gItems[] = [ITEM_NET_BALL] = { - .name = _("Net Ball"), + .name = _("NET BALL"), .itemId = ITEM_NET_BALL, .price = 1000, .holdEffect = HOLD_EFFECT_NONE, @@ -130,7 +130,7 @@ const struct Item gItems[] = [ITEM_DIVE_BALL] = { - .name = _("Dive Ball"), + .name = _("DIVE BALL"), .itemId = ITEM_DIVE_BALL, .price = 1000, .holdEffect = HOLD_EFFECT_NONE, @@ -148,7 +148,7 @@ const struct Item gItems[] = [ITEM_NEST_BALL] = { - .name = _("Nest Ball"), + .name = _("NEST BALL"), .itemId = ITEM_NEST_BALL, .price = 1000, .holdEffect = HOLD_EFFECT_NONE, @@ -166,7 +166,7 @@ const struct Item gItems[] = [ITEM_REPEAT_BALL] = { - .name = _("Repeat Ball"), + .name = _("REPEAT BALL"), .itemId = ITEM_REPEAT_BALL, .price = 1000, .holdEffect = HOLD_EFFECT_NONE, @@ -184,7 +184,7 @@ const struct Item gItems[] = [ITEM_TIMER_BALL] = { - .name = _("Timer Ball"), + .name = _("TIMER BALL"), .itemId = ITEM_TIMER_BALL, .price = 1000, .holdEffect = HOLD_EFFECT_NONE, @@ -202,7 +202,7 @@ const struct Item gItems[] = [ITEM_LUXURY_BALL] = { - .name = _("Luxury Ball"), + .name = _("LUXURY BALL"), .itemId = ITEM_LUXURY_BALL, .price = 1000, .holdEffect = HOLD_EFFECT_NONE, @@ -220,7 +220,7 @@ const struct Item gItems[] = [ITEM_PREMIER_BALL] = { - .name = _("Premier Ball"), + .name = _("PREMIER BALL"), .itemId = ITEM_PREMIER_BALL, .price = 200, .holdEffect = HOLD_EFFECT_NONE, @@ -240,7 +240,7 @@ const struct Item gItems[] = [ITEM_POTION] = { - .name = _("Potion"), + .name = _("POTION"), .itemId = ITEM_POTION, .price = 300, .holdEffect = HOLD_EFFECT_NONE, @@ -258,7 +258,7 @@ const struct Item gItems[] = [ITEM_ANTIDOTE] = { - .name = _("Antidote"), + .name = _("ANTIDOTE"), .itemId = ITEM_ANTIDOTE, .price = 100, .holdEffect = HOLD_EFFECT_NONE, @@ -276,7 +276,7 @@ const struct Item gItems[] = [ITEM_BURN_HEAL] = { - .name = _("Burn Heal"), + .name = _("BURN HEAL"), .itemId = ITEM_BURN_HEAL, .price = 250, .holdEffect = HOLD_EFFECT_NONE, @@ -294,7 +294,7 @@ const struct Item gItems[] = [ITEM_ICE_HEAL] = { - .name = _("Ice Heal"), + .name = _("ICE HEAL"), .itemId = ITEM_ICE_HEAL, .price = 250, .holdEffect = HOLD_EFFECT_NONE, @@ -312,7 +312,7 @@ const struct Item gItems[] = [ITEM_AWAKENING] = { - .name = _("Awakening"), + .name = _("AWAKENING"), .itemId = ITEM_AWAKENING, .price = 250, .holdEffect = HOLD_EFFECT_NONE, @@ -330,7 +330,7 @@ const struct Item gItems[] = [ITEM_PARALYZE_HEAL] = { - .name = _("Paralyz Heal"), + .name = _("PARLYZ HEAL"), .itemId = ITEM_PARALYZE_HEAL, .price = 200, .holdEffect = HOLD_EFFECT_NONE, @@ -348,7 +348,7 @@ const struct Item gItems[] = [ITEM_FULL_RESTORE] = { - .name = _("Full Restore"), + .name = _("FULL RESTORE"), .itemId = ITEM_FULL_RESTORE, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, @@ -366,7 +366,7 @@ const struct Item gItems[] = [ITEM_MAX_POTION] = { - .name = _("Max Potion"), + .name = _("MAX POTION"), .itemId = ITEM_MAX_POTION, .price = 2500, .holdEffect = HOLD_EFFECT_NONE, @@ -384,7 +384,7 @@ const struct Item gItems[] = [ITEM_HYPER_POTION] = { - .name = _("Hyper Potion"), + .name = _("HYPER POTION"), .itemId = ITEM_HYPER_POTION, .price = 1200, .holdEffect = HOLD_EFFECT_NONE, @@ -402,7 +402,7 @@ const struct Item gItems[] = [ITEM_SUPER_POTION] = { - .name = _("Super Potion"), + .name = _("SUPER POTION"), .itemId = ITEM_SUPER_POTION, .price = 700, .holdEffect = HOLD_EFFECT_NONE, @@ -420,7 +420,7 @@ const struct Item gItems[] = [ITEM_FULL_HEAL] = { - .name = _("Full Heal"), + .name = _("FULL HEAL"), .itemId = ITEM_FULL_HEAL, .price = 600, .holdEffect = HOLD_EFFECT_NONE, @@ -438,7 +438,7 @@ const struct Item gItems[] = [ITEM_REVIVE] = { - .name = _("Revive"), + .name = _("REVIVE"), .itemId = ITEM_REVIVE, .price = 1500, .holdEffect = HOLD_EFFECT_NONE, @@ -456,7 +456,7 @@ const struct Item gItems[] = [ITEM_MAX_REVIVE] = { - .name = _("Max Revive"), + .name = _("MAX REVIVE"), .itemId = ITEM_MAX_REVIVE, .price = 4000, .holdEffect = HOLD_EFFECT_NONE, @@ -474,7 +474,7 @@ const struct Item gItems[] = [ITEM_FRESH_WATER] = { - .name = _("Fresh Water"), + .name = _("FRESH WATER"), .itemId = ITEM_FRESH_WATER, .price = 200, .holdEffect = HOLD_EFFECT_NONE, @@ -492,7 +492,7 @@ const struct Item gItems[] = [ITEM_SODA_POP] = { - .name = _("Soda Pop"), + .name = _("SODA POP"), .itemId = ITEM_SODA_POP, .price = 300, .holdEffect = HOLD_EFFECT_NONE, @@ -510,7 +510,7 @@ const struct Item gItems[] = [ITEM_LEMONADE] = { - .name = _("Lemonade"), + .name = _("LEMONADE"), .itemId = ITEM_LEMONADE, .price = 350, .holdEffect = HOLD_EFFECT_NONE, @@ -528,7 +528,7 @@ const struct Item gItems[] = [ITEM_MOOMOO_MILK] = { - .name = _("Moomoo Milk"), + .name = _("MOOMOO MILK"), .itemId = ITEM_MOOMOO_MILK, .price = 500, .holdEffect = HOLD_EFFECT_NONE, @@ -546,7 +546,7 @@ const struct Item gItems[] = [ITEM_ENERGY_POWDER] = { - .name = _("Energypowder"), + .name = _("ENERGYPOWDER"), .itemId = ITEM_ENERGY_POWDER, .price = 500, .holdEffect = HOLD_EFFECT_NONE, @@ -564,7 +564,7 @@ const struct Item gItems[] = [ITEM_ENERGY_ROOT] = { - .name = _("Energy Root"), + .name = _("ENERGY ROOT"), .itemId = ITEM_ENERGY_ROOT, .price = 800, .holdEffect = HOLD_EFFECT_NONE, @@ -582,7 +582,7 @@ const struct Item gItems[] = [ITEM_HEAL_POWDER] = { - .name = _("Heal Powder"), + .name = _("HEAL POWDER"), .itemId = ITEM_HEAL_POWDER, .price = 450, .holdEffect = HOLD_EFFECT_NONE, @@ -600,7 +600,7 @@ const struct Item gItems[] = [ITEM_REVIVAL_HERB] = { - .name = _("Revival Herb"), + .name = _("REVIVAL HERB"), .itemId = ITEM_REVIVAL_HERB, .price = 2800, .holdEffect = HOLD_EFFECT_NONE, @@ -618,7 +618,7 @@ const struct Item gItems[] = [ITEM_ETHER] = { - .name = _("Ether"), + .name = _("ETHER"), .itemId = ITEM_ETHER, .price = 1200, .holdEffect = HOLD_EFFECT_NONE, @@ -636,7 +636,7 @@ const struct Item gItems[] = [ITEM_MAX_ETHER] = { - .name = _("Max Ether"), + .name = _("MAX ETHER"), .itemId = ITEM_MAX_ETHER, .price = 2000, .holdEffect = HOLD_EFFECT_NONE, @@ -654,7 +654,7 @@ const struct Item gItems[] = [ITEM_ELIXIR] = { - .name = _("Elixir"), + .name = _("ELIXIR"), .itemId = ITEM_ELIXIR, .price = 3000, .holdEffect = HOLD_EFFECT_NONE, @@ -672,7 +672,7 @@ const struct Item gItems[] = [ITEM_MAX_ELIXIR] = { - .name = _("Max Elixir"), + .name = _("MAX ELIXIR"), .itemId = ITEM_MAX_ELIXIR, .price = 4500, .holdEffect = HOLD_EFFECT_NONE, @@ -690,7 +690,7 @@ const struct Item gItems[] = [ITEM_LAVA_COOKIE] = { - .name = _("Lava Cookie"), + .name = _("LAVA COOKIE"), .itemId = ITEM_LAVA_COOKIE, .price = 200, .holdEffect = HOLD_EFFECT_NONE, @@ -708,7 +708,7 @@ const struct Item gItems[] = [ITEM_BLUE_FLUTE] = { - .name = _("Blue Flute"), + .name = _("BLUE FLUTE"), .itemId = ITEM_BLUE_FLUTE, .price = 100, .holdEffect = HOLD_EFFECT_NONE, @@ -726,7 +726,7 @@ const struct Item gItems[] = [ITEM_YELLOW_FLUTE] = { - .name = _("Yellow Flute"), + .name = _("YELLOW FLUTE"), .itemId = ITEM_YELLOW_FLUTE, .price = 200, .holdEffect = HOLD_EFFECT_NONE, @@ -744,7 +744,7 @@ const struct Item gItems[] = [ITEM_RED_FLUTE] = { - .name = _("Red Flute"), + .name = _("RED FLUTE"), .itemId = ITEM_RED_FLUTE, .price = 300, .holdEffect = HOLD_EFFECT_NONE, @@ -762,7 +762,7 @@ const struct Item gItems[] = [ITEM_BLACK_FLUTE] = { - .name = _("Black Flute"), + .name = _("BLACK FLUTE"), .itemId = ITEM_BLACK_FLUTE, .price = 400, .holdEffect = HOLD_EFFECT_NONE, @@ -780,7 +780,7 @@ const struct Item gItems[] = [ITEM_WHITE_FLUTE] = { - .name = _("White Flute"), + .name = _("WHITE FLUTE"), .itemId = ITEM_WHITE_FLUTE, .price = 500, .holdEffect = HOLD_EFFECT_NONE, @@ -798,7 +798,7 @@ const struct Item gItems[] = [ITEM_BERRY_JUICE] = { - .name = _("Berry Juice"), + .name = _("BERRY JUICE"), .itemId = ITEM_BERRY_JUICE, .price = 100, .holdEffect = HOLD_EFFECT_RESTORE_HP, @@ -816,7 +816,7 @@ const struct Item gItems[] = [ITEM_SACRED_ASH] = { - .name = _("Sacred Ash"), + .name = _("SACRED ASH"), .itemId = ITEM_SACRED_ASH, .price = 200, .holdEffect = HOLD_EFFECT_NONE, @@ -836,7 +836,7 @@ const struct Item gItems[] = [ITEM_SHOAL_SALT] = { - .name = _("Shoal Salt"), + .name = _("SHOAL SALT"), .itemId = ITEM_SHOAL_SALT, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -854,7 +854,7 @@ const struct Item gItems[] = [ITEM_SHOAL_SHELL] = { - .name = _("Shoal Shell"), + .name = _("SHOAL SHELL"), .itemId = ITEM_SHOAL_SHELL, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -872,7 +872,7 @@ const struct Item gItems[] = [ITEM_RED_SHARD] = { - .name = _("Red Shard"), + .name = _("RED SHARD"), .itemId = ITEM_RED_SHARD, .price = 200, .holdEffect = HOLD_EFFECT_NONE, @@ -890,7 +890,7 @@ const struct Item gItems[] = [ITEM_BLUE_SHARD] = { - .name = _("Blue Shard"), + .name = _("BLUE SHARD"), .itemId = ITEM_BLUE_SHARD, .price = 200, .holdEffect = HOLD_EFFECT_NONE, @@ -908,7 +908,7 @@ const struct Item gItems[] = [ITEM_YELLOW_SHARD] = { - .name = _("Yellow Shard"), + .name = _("YELLOW SHARD"), .itemId = ITEM_YELLOW_SHARD, .price = 200, .holdEffect = HOLD_EFFECT_NONE, @@ -926,7 +926,7 @@ const struct Item gItems[] = [ITEM_GREEN_SHARD] = { - .name = _("Green Shard"), + .name = _("GREEN SHARD"), .itemId = ITEM_GREEN_SHARD, .price = 200, .holdEffect = HOLD_EFFECT_NONE, @@ -1144,7 +1144,7 @@ const struct Item gItems[] = [ITEM_HP_UP] = { - .name = _("HP Up"), + .name = _("HP UP"), .itemId = ITEM_HP_UP, .price = 9800, .holdEffect = HOLD_EFFECT_NONE, @@ -1162,7 +1162,7 @@ const struct Item gItems[] = [ITEM_PROTEIN] = { - .name = _("Protein"), + .name = _("PROTEIN"), .itemId = ITEM_PROTEIN, .price = 9800, .holdEffect = HOLD_EFFECT_NONE, @@ -1180,7 +1180,7 @@ const struct Item gItems[] = [ITEM_IRON] = { - .name = _("Iron"), + .name = _("IRON"), .itemId = ITEM_IRON, .price = 9800, .holdEffect = HOLD_EFFECT_NONE, @@ -1198,7 +1198,7 @@ const struct Item gItems[] = [ITEM_CARBOS] = { - .name = _("Carbos"), + .name = _("CARBOS"), .itemId = ITEM_CARBOS, .price = 9800, .holdEffect = HOLD_EFFECT_NONE, @@ -1216,7 +1216,7 @@ const struct Item gItems[] = [ITEM_CALCIUM] = { - .name = _("Calcium"), + .name = _("CALCIUM"), .itemId = ITEM_CALCIUM, .price = 9800, .holdEffect = HOLD_EFFECT_NONE, @@ -1234,7 +1234,7 @@ const struct Item gItems[] = [ITEM_RARE_CANDY] = { - .name = _("Rare Candy"), + .name = _("RARE CANDY"), .itemId = ITEM_RARE_CANDY, .price = 4800, .holdEffect = HOLD_EFFECT_NONE, @@ -1252,7 +1252,7 @@ const struct Item gItems[] = [ITEM_PP_UP] = { - .name = _("PP Up"), + .name = _("PP UP"), .itemId = ITEM_PP_UP, .price = 9800, .holdEffect = HOLD_EFFECT_NONE, @@ -1270,7 +1270,7 @@ const struct Item gItems[] = [ITEM_ZINC] = { - .name = _("Zinc"), + .name = _("ZINC"), .itemId = ITEM_ZINC, .price = 9800, .holdEffect = HOLD_EFFECT_NONE, @@ -1288,7 +1288,7 @@ const struct Item gItems[] = [ITEM_PP_MAX] = { - .name = _("PP Max"), + .name = _("PP MAX"), .itemId = ITEM_PP_MAX, .price = 9800, .holdEffect = HOLD_EFFECT_NONE, @@ -1326,7 +1326,7 @@ const struct Item gItems[] = [ITEM_GUARD_SPEC] = { - .name = _("Guard Spec."), + .name = _("GUARD SPEC."), .itemId = ITEM_GUARD_SPEC, .price = 700, .holdEffect = HOLD_EFFECT_NONE, @@ -1344,7 +1344,7 @@ const struct Item gItems[] = [ITEM_DIRE_HIT] = { - .name = _("Dire Hit"), + .name = _("DIRE HIT"), .itemId = ITEM_DIRE_HIT, .price = 650, .holdEffect = HOLD_EFFECT_NONE, @@ -1362,7 +1362,7 @@ const struct Item gItems[] = [ITEM_X_ATTACK] = { - .name = _("X Attack"), + .name = _("X ATTACK"), .itemId = ITEM_X_ATTACK, .price = 500, .holdEffect = HOLD_EFFECT_NONE, @@ -1380,7 +1380,7 @@ const struct Item gItems[] = [ITEM_X_DEFEND] = { - .name = _("X Defend"), + .name = _("X DEFEND"), .itemId = ITEM_X_DEFEND, .price = 550, .holdEffect = HOLD_EFFECT_NONE, @@ -1398,7 +1398,7 @@ const struct Item gItems[] = [ITEM_X_SPEED] = { - .name = _("X Speed"), + .name = _("X SPEED"), .itemId = ITEM_X_SPEED, .price = 350, .holdEffect = HOLD_EFFECT_NONE, @@ -1416,7 +1416,7 @@ const struct Item gItems[] = [ITEM_X_ACCURACY] = { - .name = _("X Accuracy"), + .name = _("X ACCURACY"), .itemId = ITEM_X_ACCURACY, .price = 950, .holdEffect = HOLD_EFFECT_NONE, @@ -1434,7 +1434,7 @@ const struct Item gItems[] = [ITEM_X_SPECIAL] = { - .name = _("X Special"), + .name = _("X SPECIAL"), .itemId = ITEM_X_SPECIAL, .price = 350, .holdEffect = HOLD_EFFECT_NONE, @@ -1452,7 +1452,7 @@ const struct Item gItems[] = [ITEM_POKE_DOLL] = { - .name = _("Poké Doll"), + .name = _("POKé DOLL"), .itemId = ITEM_POKE_DOLL, .price = 1000, .holdEffect = HOLD_EFFECT_NONE, @@ -1470,7 +1470,7 @@ const struct Item gItems[] = [ITEM_FLUFFY_TAIL] = { - .name = _("Fluffy Tail"), + .name = _("FLUFFY TAIL"), .itemId = ITEM_FLUFFY_TAIL, .price = 1000, .holdEffect = HOLD_EFFECT_NONE, @@ -1508,7 +1508,7 @@ const struct Item gItems[] = [ITEM_SUPER_REPEL] = { - .name = _("Super Repel"), + .name = _("SUPER REPEL"), .itemId = ITEM_SUPER_REPEL, .price = 500, .holdEffect = HOLD_EFFECT_NONE, @@ -1526,7 +1526,7 @@ const struct Item gItems[] = [ITEM_MAX_REPEL] = { - .name = _("Max Repel"), + .name = _("MAX REPEL"), .itemId = ITEM_MAX_REPEL, .price = 700, .holdEffect = HOLD_EFFECT_NONE, @@ -1544,7 +1544,7 @@ const struct Item gItems[] = [ITEM_ESCAPE_ROPE] = { - .name = _("Escape Rope"), + .name = _("ESCAPE ROPE"), .itemId = ITEM_ESCAPE_ROPE, .price = 550, .holdEffect = HOLD_EFFECT_NONE, @@ -1562,7 +1562,7 @@ const struct Item gItems[] = [ITEM_REPEL] = { - .name = _("Repel"), + .name = _("REPEL"), .itemId = ITEM_REPEL, .price = 350, .holdEffect = HOLD_EFFECT_NONE, @@ -1690,7 +1690,7 @@ const struct Item gItems[] = [ITEM_SUN_STONE] = { - .name = _("Sun Stone"), + .name = _("SUN STONE"), .itemId = ITEM_SUN_STONE, .price = 2100, .holdEffect = HOLD_EFFECT_NONE, @@ -1708,7 +1708,7 @@ const struct Item gItems[] = [ITEM_MOON_STONE] = { - .name = _("Moon Stone"), + .name = _("MOON STONE"), .itemId = ITEM_MOON_STONE, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -1726,7 +1726,7 @@ const struct Item gItems[] = [ITEM_FIRE_STONE] = { - .name = _("Fire Stone"), + .name = _("FIRE STONE"), .itemId = ITEM_FIRE_STONE, .price = 2100, .holdEffect = HOLD_EFFECT_NONE, @@ -1744,7 +1744,7 @@ const struct Item gItems[] = [ITEM_THUNDER_STONE] = { - .name = _("Thunderstone"), + .name = _("THUNDERSTONE"), .itemId = ITEM_THUNDER_STONE, .price = 2100, .holdEffect = HOLD_EFFECT_NONE, @@ -1762,7 +1762,7 @@ const struct Item gItems[] = [ITEM_WATER_STONE] = { - .name = _("Water Stone"), + .name = _("WATER STONE"), .itemId = ITEM_WATER_STONE, .price = 2100, .holdEffect = HOLD_EFFECT_NONE, @@ -1780,7 +1780,7 @@ const struct Item gItems[] = [ITEM_LEAF_STONE] = { - .name = _("Leaf Stone"), + .name = _("LEAF STONE"), .itemId = ITEM_LEAF_STONE, .price = 2100, .holdEffect = HOLD_EFFECT_NONE, @@ -1872,7 +1872,7 @@ const struct Item gItems[] = [ITEM_TINY_MUSHROOM] = { - .name = _("Tinymushroom"), + .name = _("TINYMUSHROOM"), .itemId = ITEM_TINY_MUSHROOM, .price = 500, .holdEffect = HOLD_EFFECT_NONE, @@ -1890,7 +1890,7 @@ const struct Item gItems[] = [ITEM_BIG_MUSHROOM] = { - .name = _("Big Mushroom"), + .name = _("BIG MUSHROOM"), .itemId = ITEM_BIG_MUSHROOM, .price = 5000, .holdEffect = HOLD_EFFECT_NONE, @@ -1926,7 +1926,7 @@ const struct Item gItems[] = [ITEM_PEARL] = { - .name = _("Pearl"), + .name = _("PEARL"), .itemId = ITEM_PEARL, .price = 1400, .holdEffect = HOLD_EFFECT_NONE, @@ -1944,7 +1944,7 @@ const struct Item gItems[] = [ITEM_BIG_PEARL] = { - .name = _("Big Pearl"), + .name = _("BIG PEARL"), .itemId = ITEM_BIG_PEARL, .price = 7500, .holdEffect = HOLD_EFFECT_NONE, @@ -1962,7 +1962,7 @@ const struct Item gItems[] = [ITEM_STARDUST] = { - .name = _("Stardust"), + .name = _("STARDUST"), .itemId = ITEM_STARDUST, .price = 2000, .holdEffect = HOLD_EFFECT_NONE, @@ -1980,7 +1980,7 @@ const struct Item gItems[] = [ITEM_STAR_PIECE] = { - .name = _("Star Piece"), + .name = _("STAR PIECE"), .itemId = ITEM_STAR_PIECE, .price = 9800, .holdEffect = HOLD_EFFECT_NONE, @@ -1998,7 +1998,7 @@ const struct Item gItems[] = [ITEM_NUGGET] = { - .name = _("Nugget"), + .name = _("NUGGET"), .itemId = ITEM_NUGGET, .price = 10000, .holdEffect = HOLD_EFFECT_NONE, @@ -2016,7 +2016,7 @@ const struct Item gItems[] = [ITEM_HEART_SCALE] = { - .name = _("Heart Scale"), + .name = _("HEART SCALE"), .itemId = ITEM_HEART_SCALE, .price = 100, .holdEffect = HOLD_EFFECT_NONE, @@ -2197,7 +2197,7 @@ const struct Item gItems[] = // Mail [ITEM_ORANGE_MAIL] = { - .name = _("Orange Mail"), + .name = _("ORANGE MAIL"), .itemId = ITEM_ORANGE_MAIL, .price = 50, .holdEffect = HOLD_EFFECT_NONE, @@ -2215,7 +2215,7 @@ const struct Item gItems[] = [ITEM_HARBOR_MAIL] = { - .name = _("Harbor Mail"), + .name = _("HARBOR MAIL"), .itemId = ITEM_HARBOR_MAIL, .price = 50, .holdEffect = HOLD_EFFECT_NONE, @@ -2233,7 +2233,7 @@ const struct Item gItems[] = [ITEM_GLITTER_MAIL] = { - .name = _("Glitter Mail"), + .name = _("GLITTER MAIL"), .itemId = ITEM_GLITTER_MAIL, .price = 50, .holdEffect = HOLD_EFFECT_NONE, @@ -2251,7 +2251,7 @@ const struct Item gItems[] = [ITEM_MECH_MAIL] = { - .name = _("Mech Mail"), + .name = _("MECH MAIL"), .itemId = ITEM_MECH_MAIL, .price = 50, .holdEffect = HOLD_EFFECT_NONE, @@ -2269,7 +2269,7 @@ const struct Item gItems[] = [ITEM_WOOD_MAIL] = { - .name = _("Wood Mail"), + .name = _("WOOD MAIL"), .itemId = ITEM_WOOD_MAIL, .price = 50, .holdEffect = HOLD_EFFECT_NONE, @@ -2287,7 +2287,7 @@ const struct Item gItems[] = [ITEM_WAVE_MAIL] = { - .name = _("Wave Mail"), + .name = _("WAVE MAIL"), .itemId = ITEM_WAVE_MAIL, .price = 50, .holdEffect = HOLD_EFFECT_NONE, @@ -2305,7 +2305,7 @@ const struct Item gItems[] = [ITEM_BEAD_MAIL] = { - .name = _("Bead Mail"), + .name = _("BEAD MAIL"), .itemId = ITEM_BEAD_MAIL, .price = 50, .holdEffect = HOLD_EFFECT_NONE, @@ -2323,7 +2323,7 @@ const struct Item gItems[] = [ITEM_SHADOW_MAIL] = { - .name = _("Shadow Mail"), + .name = _("SHADOW MAIL"), .itemId = ITEM_SHADOW_MAIL, .price = 50, .holdEffect = HOLD_EFFECT_NONE, @@ -2341,7 +2341,7 @@ const struct Item gItems[] = [ITEM_TROPIC_MAIL] = { - .name = _("Tropic Mail"), + .name = _("TROPIC MAIL"), .itemId = ITEM_TROPIC_MAIL, .price = 50, .holdEffect = HOLD_EFFECT_NONE, @@ -2359,7 +2359,7 @@ const struct Item gItems[] = [ITEM_DREAM_MAIL] = { - .name = _("Dream Mail"), + .name = _("DREAM MAIL"), .itemId = ITEM_DREAM_MAIL, .price = 50, .holdEffect = HOLD_EFFECT_NONE, @@ -2377,7 +2377,7 @@ const struct Item gItems[] = [ITEM_FAB_MAIL] = { - .name = _("Fab Mail"), + .name = _("FAB MAIL"), .itemId = ITEM_FAB_MAIL, .price = 50, .holdEffect = HOLD_EFFECT_NONE, @@ -2395,7 +2395,7 @@ const struct Item gItems[] = [ITEM_RETRO_MAIL] = { - .name = _("Retro Mail"), + .name = _("RETRO MAIL"), .itemId = ITEM_RETRO_MAIL, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -2415,7 +2415,7 @@ const struct Item gItems[] = [ITEM_CHERI_BERRY] = { - .name = _("Cheri Berry"), + .name = _("CHERI BERRY"), .itemId = ITEM_CHERI_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_CURE_PAR, @@ -2433,7 +2433,7 @@ const struct Item gItems[] = [ITEM_CHESTO_BERRY] = { - .name = _("Chesto Berry"), + .name = _("CHESTO BERRY"), .itemId = ITEM_CHESTO_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_CURE_SLP, @@ -2451,7 +2451,7 @@ const struct Item gItems[] = [ITEM_PECHA_BERRY] = { - .name = _("Pecha Berry"), + .name = _("PECHA BERRY"), .itemId = ITEM_PECHA_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_CURE_PSN, @@ -2469,7 +2469,7 @@ const struct Item gItems[] = [ITEM_RAWST_BERRY] = { - .name = _("Rawst Berry"), + .name = _("RAWST BERRY"), .itemId = ITEM_RAWST_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_CURE_BRN, @@ -2487,7 +2487,7 @@ const struct Item gItems[] = [ITEM_ASPEAR_BERRY] = { - .name = _("Aspear Berry"), + .name = _("ASPEAR BERRY"), .itemId = ITEM_ASPEAR_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_CURE_FRZ, @@ -2505,7 +2505,7 @@ const struct Item gItems[] = [ITEM_LEPPA_BERRY] = { - .name = _("Leppa Berry"), + .name = _("LEPPA BERRY"), .itemId = ITEM_LEPPA_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_RESTORE_PP, @@ -2523,7 +2523,7 @@ const struct Item gItems[] = [ITEM_ORAN_BERRY] = { - .name = _("Oran Berry"), + .name = _("ORAN BERRY"), .itemId = ITEM_ORAN_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_RESTORE_HP, @@ -2541,7 +2541,7 @@ const struct Item gItems[] = [ITEM_PERSIM_BERRY] = { - .name = _("Persim Berry"), + .name = _("PERSIM BERRY"), .itemId = ITEM_PERSIM_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_CURE_CONFUSION, @@ -2559,7 +2559,7 @@ const struct Item gItems[] = [ITEM_LUM_BERRY] = { - .name = _("Lum Berry"), + .name = _("LUM BERRY"), .itemId = ITEM_LUM_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_CURE_STATUS, @@ -2577,7 +2577,7 @@ const struct Item gItems[] = [ITEM_SITRUS_BERRY] = { - .name = _("Sitrus Berry"), + .name = _("SITRUS BERRY"), .itemId = ITEM_SITRUS_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_RESTORE_HP, @@ -2595,7 +2595,7 @@ const struct Item gItems[] = [ITEM_FIGY_BERRY] = { - .name = _("Figy Berry"), + .name = _("FIGY BERRY"), .itemId = ITEM_FIGY_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_CONFUSE_SPICY, @@ -2613,7 +2613,7 @@ const struct Item gItems[] = [ITEM_WIKI_BERRY] = { - .name = _("Wiki Berry"), + .name = _("WIKI BERRY"), .itemId = ITEM_WIKI_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_CONFUSE_DRY, @@ -2631,7 +2631,7 @@ const struct Item gItems[] = [ITEM_MAGO_BERRY] = { - .name = _("Mago Berry"), + .name = _("MAGO BERRY"), .itemId = ITEM_MAGO_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_CONFUSE_SWEET, @@ -2649,7 +2649,7 @@ const struct Item gItems[] = [ITEM_AGUAV_BERRY] = { - .name = _("Aguav Berry"), + .name = _("AGUAV BERRY"), .itemId = ITEM_AGUAV_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_CONFUSE_BITTER, @@ -2667,7 +2667,7 @@ const struct Item gItems[] = [ITEM_IAPAPA_BERRY] = { - .name = _("Iapapa Berry"), + .name = _("IAPAPA BERRY"), .itemId = ITEM_IAPAPA_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_CONFUSE_SOUR, @@ -2685,7 +2685,7 @@ const struct Item gItems[] = [ITEM_RAZZ_BERRY] = { - .name = _("Razz Berry"), + .name = _("RAZZ BERRY"), .itemId = ITEM_RAZZ_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2703,7 +2703,7 @@ const struct Item gItems[] = [ITEM_BLUK_BERRY] = { - .name = _("Bluk Berry"), + .name = _("BLUK BERRY"), .itemId = ITEM_BLUK_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2721,7 +2721,7 @@ const struct Item gItems[] = [ITEM_NANAB_BERRY] = { - .name = _("Nanab Berry"), + .name = _("NANAB BERRY"), .itemId = ITEM_NANAB_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2739,7 +2739,7 @@ const struct Item gItems[] = [ITEM_WEPEAR_BERRY] = { - .name = _("Wepear Berry"), + .name = _("WEPEAR BERRY"), .itemId = ITEM_WEPEAR_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2757,7 +2757,7 @@ const struct Item gItems[] = [ITEM_PINAP_BERRY] = { - .name = _("Pinap Berry"), + .name = _("PINAP BERRY"), .itemId = ITEM_PINAP_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2775,7 +2775,7 @@ const struct Item gItems[] = [ITEM_POMEG_BERRY] = { - .name = _("Pomeg Berry"), + .name = _("POMEG BERRY"), .itemId = ITEM_POMEG_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2793,7 +2793,7 @@ const struct Item gItems[] = [ITEM_KELPSY_BERRY] = { - .name = _("Kelpsy Berry"), + .name = _("KELPSY BERRY"), .itemId = ITEM_KELPSY_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2811,7 +2811,7 @@ const struct Item gItems[] = [ITEM_QUALOT_BERRY] = { - .name = _("Qualot Berry"), + .name = _("QUALOT BERRY"), .itemId = ITEM_QUALOT_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2829,7 +2829,7 @@ const struct Item gItems[] = [ITEM_HONDEW_BERRY] = { - .name = _("Hondew Berry"), + .name = _("HONDEW BERRY"), .itemId = ITEM_HONDEW_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2847,7 +2847,7 @@ const struct Item gItems[] = [ITEM_GREPA_BERRY] = { - .name = _("Grepa Berry"), + .name = _("GREPA BERRY"), .itemId = ITEM_GREPA_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2865,7 +2865,7 @@ const struct Item gItems[] = [ITEM_TAMATO_BERRY] = { - .name = _("Tamato Berry"), + .name = _("TAMATO BERRY"), .itemId = ITEM_TAMATO_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2883,7 +2883,7 @@ const struct Item gItems[] = [ITEM_CORNN_BERRY] = { - .name = _("Cornn Berry"), + .name = _("CORNN BERRY"), .itemId = ITEM_CORNN_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2901,7 +2901,7 @@ const struct Item gItems[] = [ITEM_MAGOST_BERRY] = { - .name = _("Magost Berry"), + .name = _("MAGOST BERRY"), .itemId = ITEM_MAGOST_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2919,7 +2919,7 @@ const struct Item gItems[] = [ITEM_RABUTA_BERRY] = { - .name = _("Rabuta Berry"), + .name = _("RABUTA BERRY"), .itemId = ITEM_RABUTA_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2937,7 +2937,7 @@ const struct Item gItems[] = [ITEM_NOMEL_BERRY] = { - .name = _("Nomel Berry"), + .name = _("NOMEL BERRY"), .itemId = ITEM_NOMEL_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2955,7 +2955,7 @@ const struct Item gItems[] = [ITEM_SPELON_BERRY] = { - .name = _("Spelon Berry"), + .name = _("SPELON BERRY"), .itemId = ITEM_SPELON_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2973,7 +2973,7 @@ const struct Item gItems[] = [ITEM_PAMTRE_BERRY] = { - .name = _("Pamtre Berry"), + .name = _("PAMTRE BERRY"), .itemId = ITEM_PAMTRE_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -2991,7 +2991,7 @@ const struct Item gItems[] = [ITEM_WATMEL_BERRY] = { - .name = _("Watmel Berry"), + .name = _("WATMEL BERRY"), .itemId = ITEM_WATMEL_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -3009,7 +3009,7 @@ const struct Item gItems[] = [ITEM_DURIN_BERRY] = { - .name = _("Durin Berry"), + .name = _("DURIN BERRY"), .itemId = ITEM_DURIN_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -3027,7 +3027,7 @@ const struct Item gItems[] = [ITEM_BELUE_BERRY] = { - .name = _("Belue Berry"), + .name = _("BELUE BERRY"), .itemId = ITEM_BELUE_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -3045,7 +3045,7 @@ const struct Item gItems[] = [ITEM_LIECHI_BERRY] = { - .name = _("Liechi Berry"), + .name = _("LIECHI BERRY"), .itemId = ITEM_LIECHI_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_ATTACK_UP, @@ -3063,7 +3063,7 @@ const struct Item gItems[] = [ITEM_GANLON_BERRY] = { - .name = _("Ganlon Berry"), + .name = _("GANLON BERRY"), .itemId = ITEM_GANLON_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_DEFENSE_UP, @@ -3081,7 +3081,7 @@ const struct Item gItems[] = [ITEM_SALAC_BERRY] = { - .name = _("Salac Berry"), + .name = _("SALAC BERRY"), .itemId = ITEM_SALAC_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_SPEED_UP, @@ -3099,7 +3099,7 @@ const struct Item gItems[] = [ITEM_PETAYA_BERRY] = { - .name = _("Petaya Berry"), + .name = _("PETAYA BERRY"), .itemId = ITEM_PETAYA_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_SP_ATTACK_UP, @@ -3117,7 +3117,7 @@ const struct Item gItems[] = [ITEM_APICOT_BERRY] = { - .name = _("Apicot Berry"), + .name = _("APICOT BERRY"), .itemId = ITEM_APICOT_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_SP_DEFENSE_UP, @@ -3135,7 +3135,7 @@ const struct Item gItems[] = [ITEM_LANSAT_BERRY] = { - .name = _("Lansat Berry"), + .name = _("LANSAT BERRY"), .itemId = ITEM_LANSAT_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_CRITICAL_UP, @@ -3153,7 +3153,7 @@ const struct Item gItems[] = [ITEM_STARF_BERRY] = { - .name = _("Starf Berry"), + .name = _("STARF BERRY"), .itemId = ITEM_STARF_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_RANDOM_STAT_UP, @@ -3171,7 +3171,7 @@ const struct Item gItems[] = [ITEM_ENIGMA_BERRY] = { - .name = _("Enigma Berry"), + .name = _("ENIGMA BERRY"), .itemId = ITEM_ENIGMA_BERRY, .price = 20, .holdEffect = HOLD_EFFECT_NONE, @@ -3245,7 +3245,7 @@ const struct Item gItems[] = [ITEM_BRIGHT_POWDER] = { - .name = _("Brightpowder"), + .name = _("BRIGHTPOWDER"), .itemId = ITEM_BRIGHT_POWDER, .price = 10, .holdEffect = HOLD_EFFECT_EVASION_UP, @@ -3263,7 +3263,7 @@ const struct Item gItems[] = [ITEM_WHITE_HERB] = { - .name = _("White Herb"), + .name = _("WHITE HERB"), .itemId = ITEM_WHITE_HERB, .price = 100, .holdEffect = HOLD_EFFECT_RESTORE_STATS, @@ -3281,7 +3281,7 @@ const struct Item gItems[] = [ITEM_MACHO_BRACE] = { - .name = _("Macho Brace"), + .name = _("MACHO BRACE"), .itemId = ITEM_MACHO_BRACE, .price = 3000, .holdEffect = HOLD_EFFECT_MACHO_BRACE, @@ -3299,7 +3299,7 @@ const struct Item gItems[] = [ITEM_EXP_SHARE] = { - .name = _("Exp. Share"), + .name = _("EXP. SHARE"), .itemId = ITEM_EXP_SHARE, .price = 3000, .holdEffect = HOLD_EFFECT_EXP_SHARE, @@ -3317,7 +3317,7 @@ const struct Item gItems[] = [ITEM_QUICK_CLAW] = { - .name = _("Quick Claw"), + .name = _("QUICK CLAW"), .itemId = ITEM_QUICK_CLAW, .price = 100, .holdEffect = HOLD_EFFECT_QUICK_CLAW, @@ -3335,7 +3335,7 @@ const struct Item gItems[] = [ITEM_SOOTHE_BELL] = { - .name = _("Soothe Bell"), + .name = _("SOOTHE BELL"), .itemId = ITEM_SOOTHE_BELL, .price = 100, .holdEffect = HOLD_EFFECT_HAPPINESS_UP, @@ -3353,7 +3353,7 @@ const struct Item gItems[] = [ITEM_MENTAL_HERB] = { - .name = _("Mental Herb"), + .name = _("MENTAL HERB"), .itemId = ITEM_MENTAL_HERB, .price = 100, .holdEffect = HOLD_EFFECT_CURE_ATTRACT, @@ -3371,7 +3371,7 @@ const struct Item gItems[] = [ITEM_CHOICE_BAND] = { - .name = _("Choice Band"), + .name = _("CHOICE BAND"), .itemId = ITEM_CHOICE_BAND, .price = 100, .holdEffect = HOLD_EFFECT_CHOICE_BAND, @@ -3389,7 +3389,7 @@ const struct Item gItems[] = [ITEM_KINGS_ROCK] = { - .name = _("King's Rock"), + .name = _("KING'S ROCK"), .itemId = ITEM_KINGS_ROCK, .price = 100, .holdEffect = HOLD_EFFECT_FLINCH, @@ -3407,7 +3407,7 @@ const struct Item gItems[] = [ITEM_SILVER_POWDER] = { - .name = _("Silverpowder"), + .name = _("SILVERPOWDER"), .itemId = ITEM_SILVER_POWDER, .price = 100, .holdEffect = HOLD_EFFECT_BUG_POWER, @@ -3425,7 +3425,7 @@ const struct Item gItems[] = [ITEM_AMULET_COIN] = { - .name = _("Amulet Coin"), + .name = _("AMULET COIN"), .itemId = ITEM_AMULET_COIN, .price = 100, .holdEffect = HOLD_EFFECT_DOUBLE_PRIZE, @@ -3443,7 +3443,7 @@ const struct Item gItems[] = [ITEM_CLEANSE_TAG] = { - .name = _("Cleanse Tag"), + .name = _("CLEANSE TAG"), .itemId = ITEM_CLEANSE_TAG, .price = 200, .holdEffect = HOLD_EFFECT_REPEL, @@ -3461,7 +3461,7 @@ const struct Item gItems[] = [ITEM_SOUL_DEW] = { - .name = _("Soul Dew"), + .name = _("SOUL DEW"), .itemId = ITEM_SOUL_DEW, .price = 200, .holdEffect = HOLD_EFFECT_SOUL_DEW, @@ -3479,7 +3479,7 @@ const struct Item gItems[] = [ITEM_DEEP_SEA_TOOTH] = { - .name = _("DeepSeaTooth"), + .name = _("DEEPSEATOOTH"), .itemId = ITEM_DEEP_SEA_TOOTH, .price = 200, .holdEffect = HOLD_EFFECT_DEEP_SEA_TOOTH, @@ -3497,7 +3497,7 @@ const struct Item gItems[] = [ITEM_DEEP_SEA_SCALE] = { - .name = _("DeepSeaScale"), + .name = _("DEEPSEASCALE"), .itemId = ITEM_DEEP_SEA_SCALE, .price = 200, .holdEffect = HOLD_EFFECT_DEEP_SEA_SCALE, @@ -3515,7 +3515,7 @@ const struct Item gItems[] = [ITEM_SMOKE_BALL] = { - .name = _("Smoke Ball"), + .name = _("SMOKE BALL"), .itemId = ITEM_SMOKE_BALL, .price = 200, .holdEffect = HOLD_EFFECT_CAN_ALWAYS_RUN, @@ -3533,7 +3533,7 @@ const struct Item gItems[] = [ITEM_EVERSTONE] = { - .name = _("Everstone"), + .name = _("EVERSTONE"), .itemId = ITEM_EVERSTONE, .price = 200, .holdEffect = HOLD_EFFECT_PREVENT_EVOLVE, @@ -3551,7 +3551,7 @@ const struct Item gItems[] = [ITEM_FOCUS_BAND] = { - .name = _("Focus Band"), + .name = _("FOCUS BAND"), .itemId = ITEM_FOCUS_BAND, .price = 200, .holdEffect = HOLD_EFFECT_FOCUS_BAND, @@ -3605,7 +3605,7 @@ const struct Item gItems[] = [ITEM_METAL_COAT] = { - .name = _("Metal Coat"), + .name = _("METAL COAT"), .itemId = ITEM_METAL_COAT, .price = 100, .holdEffect = HOLD_EFFECT_STEEL_POWER, @@ -3623,7 +3623,7 @@ const struct Item gItems[] = [ITEM_LEFTOVERS] = { - .name = _("Leftovers"), + .name = _("LEFTOVERS"), .itemId = ITEM_LEFTOVERS, .price = 200, .holdEffect = HOLD_EFFECT_LEFTOVERS, @@ -3641,7 +3641,7 @@ const struct Item gItems[] = [ITEM_DRAGON_SCALE] = { - .name = _("Dragon Scale"), + .name = _("DRAGON SCALE"), .itemId = ITEM_DRAGON_SCALE, .price = 2100, .holdEffect = HOLD_EFFECT_DRAGON_SCALE, @@ -3659,7 +3659,7 @@ const struct Item gItems[] = [ITEM_LIGHT_BALL] = { - .name = _("Light Ball"), + .name = _("LIGHT BALL"), .itemId = ITEM_LIGHT_BALL, .price = 100, .holdEffect = HOLD_EFFECT_LIGHT_BALL, @@ -3677,7 +3677,7 @@ const struct Item gItems[] = [ITEM_SOFT_SAND] = { - .name = _("Soft Sand"), + .name = _("SOFT SAND"), .itemId = ITEM_SOFT_SAND, .price = 100, .holdEffect = HOLD_EFFECT_GROUND_POWER, @@ -3695,7 +3695,7 @@ const struct Item gItems[] = [ITEM_HARD_STONE] = { - .name = _("Hard Stone"), + .name = _("HARD STONE"), .itemId = ITEM_HARD_STONE, .price = 100, .holdEffect = HOLD_EFFECT_ROCK_POWER, @@ -3713,7 +3713,7 @@ const struct Item gItems[] = [ITEM_MIRACLE_SEED] = { - .name = _("Miracle Seed"), + .name = _("MIRACLE SEED"), .itemId = ITEM_MIRACLE_SEED, .price = 100, .holdEffect = HOLD_EFFECT_GRASS_POWER, @@ -3731,7 +3731,7 @@ const struct Item gItems[] = [ITEM_BLACK_GLASSES] = { - .name = _("BlackGlasses"), + .name = _("BLACKGLASSES"), .itemId = ITEM_BLACK_GLASSES, .price = 100, .holdEffect = HOLD_EFFECT_DARK_POWER, @@ -3749,7 +3749,7 @@ const struct Item gItems[] = [ITEM_BLACK_BELT] = { - .name = _("Black Belt"), + .name = _("BLACK BELT"), .itemId = ITEM_BLACK_BELT, .price = 100, .holdEffect = HOLD_EFFECT_FIGHTING_POWER, @@ -3767,7 +3767,7 @@ const struct Item gItems[] = [ITEM_MAGNET] = { - .name = _("Magnet"), + .name = _("MAGNET"), .itemId = ITEM_MAGNET, .price = 100, .holdEffect = HOLD_EFFECT_ELECTRIC_POWER, @@ -3785,7 +3785,7 @@ const struct Item gItems[] = [ITEM_MYSTIC_WATER] = { - .name = _("Mystic Water"), + .name = _("MYSTIC WATER"), .itemId = ITEM_MYSTIC_WATER, .price = 100, .holdEffect = HOLD_EFFECT_WATER_POWER, @@ -3803,7 +3803,7 @@ const struct Item gItems[] = [ITEM_SHARP_BEAK] = { - .name = _("Sharp Beak"), + .name = _("SHARP BEAK"), .itemId = ITEM_SHARP_BEAK, .price = 100, .holdEffect = HOLD_EFFECT_FLYING_POWER, @@ -3821,7 +3821,7 @@ const struct Item gItems[] = [ITEM_POISON_BARB] = { - .name = _("Poison Barb"), + .name = _("POISON BARB"), .itemId = ITEM_POISON_BARB, .price = 100, .holdEffect = HOLD_EFFECT_POISON_POWER, @@ -3839,7 +3839,7 @@ const struct Item gItems[] = [ITEM_NEVER_MELT_ICE] = { - .name = _("Nevermeltice"), + .name = _("NEVERMELTICE"), .itemId = ITEM_NEVER_MELT_ICE, .price = 100, .holdEffect = HOLD_EFFECT_ICE_POWER, @@ -3857,7 +3857,7 @@ const struct Item gItems[] = [ITEM_SPELL_TAG] = { - .name = _("Spell Tag"), + .name = _("SPELL TAG"), .itemId = ITEM_SPELL_TAG, .price = 100, .holdEffect = HOLD_EFFECT_GHOST_POWER, @@ -3875,7 +3875,7 @@ const struct Item gItems[] = [ITEM_TWISTED_SPOON] = { - .name = _("TwistedSpoon"), + .name = _("TWISTEDSPOON"), .itemId = ITEM_TWISTED_SPOON, .price = 100, .holdEffect = HOLD_EFFECT_PSYCHIC_POWER, @@ -3893,7 +3893,7 @@ const struct Item gItems[] = [ITEM_CHARCOAL] = { - .name = _("Charcoal"), + .name = _("CHARCOAL"), .itemId = ITEM_CHARCOAL, .price = 9800, .holdEffect = HOLD_EFFECT_FIRE_POWER, @@ -3911,7 +3911,7 @@ const struct Item gItems[] = [ITEM_DRAGON_FANG] = { - .name = _("Dragon Fang"), + .name = _("DRAGON FANG"), .itemId = ITEM_DRAGON_FANG, .price = 100, .holdEffect = HOLD_EFFECT_DRAGON_POWER, @@ -3929,7 +3929,7 @@ const struct Item gItems[] = [ITEM_SILK_SCARF] = { - .name = _("Silk Scarf"), + .name = _("SILK SCARF"), .itemId = ITEM_SILK_SCARF, .price = 100, .holdEffect = HOLD_EFFECT_NORMAL_POWER, @@ -3947,7 +3947,7 @@ const struct Item gItems[] = [ITEM_UP_GRADE] = { - .name = _("Up-Grade"), + .name = _("UP-GRADE"), .itemId = ITEM_UP_GRADE, .price = 2100, .holdEffect = HOLD_EFFECT_UP_GRADE, @@ -3965,7 +3965,7 @@ const struct Item gItems[] = [ITEM_SHELL_BELL] = { - .name = _("Shell Bell"), + .name = _("SHELL BELL"), .itemId = ITEM_SHELL_BELL, .price = 200, .holdEffect = HOLD_EFFECT_SHELL_BELL, @@ -3983,7 +3983,7 @@ const struct Item gItems[] = [ITEM_SEA_INCENSE] = { - .name = _("Sea Incense"), + .name = _("SEA INCENSE"), .itemId = ITEM_SEA_INCENSE, .price = 9600, .holdEffect = HOLD_EFFECT_WATER_POWER, @@ -4001,7 +4001,7 @@ const struct Item gItems[] = [ITEM_LAX_INCENSE] = { - .name = _("Lax Incense"), + .name = _("LAX INCENSE"), .itemId = ITEM_LAX_INCENSE, .price = 9600, .holdEffect = HOLD_EFFECT_EVASION_UP, @@ -4019,7 +4019,7 @@ const struct Item gItems[] = [ITEM_LUCKY_PUNCH] = { - .name = _("Lucky Punch"), + .name = _("LUCKY PUNCH"), .itemId = ITEM_LUCKY_PUNCH, .price = 10, .holdEffect = HOLD_EFFECT_LUCKY_PUNCH, @@ -4037,7 +4037,7 @@ const struct Item gItems[] = [ITEM_METAL_POWDER] = { - .name = _("Metal Powder"), + .name = _("METAL POWDER"), .itemId = ITEM_METAL_POWDER, .price = 10, .holdEffect = HOLD_EFFECT_METAL_POWDER, @@ -4055,7 +4055,7 @@ const struct Item gItems[] = [ITEM_THICK_CLUB] = { - .name = _("Thick Club"), + .name = _("THICK CLUB"), .itemId = ITEM_THICK_CLUB, .price = 500, .holdEffect = HOLD_EFFECT_THICK_CLUB, @@ -4073,7 +4073,7 @@ const struct Item gItems[] = [ITEM_STICK] = { - .name = _("Stick"), + .name = _("STICK"), .itemId = ITEM_STICK, .price = 200, .holdEffect = HOLD_EFFECT_STICK, @@ -4089,12 +4089,12 @@ const struct Item gItems[] = .secondaryId = 0, }, - [ITEM_MEGA_STONE_TESTING] = + [ITEM_0E2] = { - .name = _("Mega Stone"), - .itemId = ITEM_MEGA_STONE_TESTING, + .name = _("????????"), + .itemId = ITEM_NONE, .price = 0, - .holdEffect = HOLD_EFFECT_MEGA_STONE, + .holdEffect = HOLD_EFFECT_NONE, .holdEffectParam = 0, .description = gDummyItemDescription, .importance = 0, @@ -4595,7 +4595,7 @@ const struct Item gItems[] = [ITEM_RED_SCARF] = { - .name = _("Red Scarf"), + .name = _("RED SCARF"), .itemId = ITEM_RED_SCARF, .price = 100, .holdEffect = HOLD_EFFECT_NONE, @@ -4613,7 +4613,7 @@ const struct Item gItems[] = [ITEM_BLUE_SCARF] = { - .name = _("Blue Scarf"), + .name = _("BLUE SCARF"), .itemId = ITEM_BLUE_SCARF, .price = 100, .holdEffect = HOLD_EFFECT_NONE, @@ -4631,7 +4631,7 @@ const struct Item gItems[] = [ITEM_PINK_SCARF] = { - .name = _("Pink Scarf"), + .name = _("PINK SCARF"), .itemId = ITEM_PINK_SCARF, .price = 100, .holdEffect = HOLD_EFFECT_NONE, @@ -4649,7 +4649,7 @@ const struct Item gItems[] = [ITEM_GREEN_SCARF] = { - .name = _("Green Scarf"), + .name = _("GREEN SCARF"), .itemId = ITEM_GREEN_SCARF, .price = 100, .holdEffect = HOLD_EFFECT_NONE, @@ -4667,7 +4667,7 @@ const struct Item gItems[] = [ITEM_YELLOW_SCARF] = { - .name = _("Yellow Scarf"), + .name = _("YELLOW SCARF"), .itemId = ITEM_YELLOW_SCARF, .price = 100, .holdEffect = HOLD_EFFECT_NONE, @@ -4687,7 +4687,7 @@ const struct Item gItems[] = [ITEM_MACH_BIKE] = { - .name = _("Mach Bike"), + .name = _("MACH BIKE"), .itemId = ITEM_MACH_BIKE, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4705,7 +4705,7 @@ const struct Item gItems[] = [ITEM_COIN_CASE] = { - .name = _("Coin Case"), + .name = _("COIN CASE"), .itemId = ITEM_COIN_CASE, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4723,7 +4723,7 @@ const struct Item gItems[] = [ITEM_ITEMFINDER] = { - .name = _("Itemfinder"), + .name = _("ITEMFINDER"), .itemId = ITEM_ITEMFINDER, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4741,7 +4741,7 @@ const struct Item gItems[] = [ITEM_OLD_ROD] = { - .name = _("Old Rod"), + .name = _("OLD ROD"), .itemId = ITEM_OLD_ROD, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4759,7 +4759,7 @@ const struct Item gItems[] = [ITEM_GOOD_ROD] = { - .name = _("Good Rod"), + .name = _("GOOD ROD"), .itemId = ITEM_GOOD_ROD, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4777,7 +4777,7 @@ const struct Item gItems[] = [ITEM_SUPER_ROD] = { - .name = _("Super Rod"), + .name = _("SUPER ROD"), .itemId = ITEM_SUPER_ROD, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4795,7 +4795,7 @@ const struct Item gItems[] = [ITEM_SS_TICKET] = { - .name = _("S.S. Ticket"), + .name = _("S.S. TICKET"), .itemId = ITEM_SS_TICKET, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4813,7 +4813,7 @@ const struct Item gItems[] = [ITEM_CONTEST_PASS] = { - .name = _("Contest Pass"), + .name = _("CONTEST PASS"), .itemId = ITEM_CONTEST_PASS, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4849,7 +4849,7 @@ const struct Item gItems[] = [ITEM_WAILMER_PAIL] = { - .name = _("Wailmer Pail"), + .name = _("WAILMER PAIL"), .itemId = ITEM_WAILMER_PAIL, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4867,7 +4867,7 @@ const struct Item gItems[] = [ITEM_DEVON_GOODS] = { - .name = _("Devon Goods"), + .name = _("DEVON GOODS"), .itemId = ITEM_DEVON_GOODS, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4885,7 +4885,7 @@ const struct Item gItems[] = [ITEM_SOOT_SACK] = { - .name = _("Soot Sack"), + .name = _("SOOT SACK"), .itemId = ITEM_SOOT_SACK, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4903,7 +4903,7 @@ const struct Item gItems[] = [ITEM_BASEMENT_KEY] = { - .name = _("Basement Key"), + .name = _("BASEMENT KEY"), .itemId = ITEM_BASEMENT_KEY, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4921,7 +4921,7 @@ const struct Item gItems[] = [ITEM_ACRO_BIKE] = { - .name = _("Acro Bike"), + .name = _("ACRO BIKE"), .itemId = ITEM_ACRO_BIKE, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4939,7 +4939,7 @@ const struct Item gItems[] = [ITEM_POKEBLOCK_CASE] = { - .name = _("{POKEBLOCK} Case"), + .name = _("{POKEBLOCK} CASE"), .itemId = ITEM_POKEBLOCK_CASE, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4957,7 +4957,7 @@ const struct Item gItems[] = [ITEM_LETTER] = { - .name = _("Letter"), + .name = _("LETTER"), .itemId = ITEM_LETTER, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4975,7 +4975,7 @@ const struct Item gItems[] = [ITEM_EON_TICKET] = { - .name = _("Eon Ticket"), + .name = _("EON TICKET"), .itemId = ITEM_EON_TICKET, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -4993,7 +4993,7 @@ const struct Item gItems[] = [ITEM_RED_ORB] = { - .name = _("Red Orb"), + .name = _("RED ORB"), .itemId = ITEM_RED_ORB, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -5011,7 +5011,7 @@ const struct Item gItems[] = [ITEM_BLUE_ORB] = { - .name = _("Blue Orb"), + .name = _("BLUE ORB"), .itemId = ITEM_BLUE_ORB, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -5029,7 +5029,7 @@ const struct Item gItems[] = [ITEM_SCANNER] = { - .name = _("Scanner"), + .name = _("SCANNER"), .itemId = ITEM_SCANNER, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -5047,7 +5047,7 @@ const struct Item gItems[] = [ITEM_GO_GOGGLES] = { - .name = _("Go-Goggles"), + .name = _("GO-GOGGLES"), .itemId = ITEM_GO_GOGGLES, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -5065,7 +5065,7 @@ const struct Item gItems[] = [ITEM_METEORITE] = { - .name = _("Meteorite"), + .name = _("METEORITE"), .itemId = ITEM_METEORITE, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -5083,7 +5083,7 @@ const struct Item gItems[] = [ITEM_ROOM_1_KEY] = { - .name = _("Rm. 1 Key"), + .name = _("RM. 1 KEY"), .itemId = ITEM_ROOM_1_KEY, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -5101,7 +5101,7 @@ const struct Item gItems[] = [ITEM_ROOM_2_KEY] = { - .name = _("Rm. 2 Key"), + .name = _("RM. 2 KEY"), .itemId = ITEM_ROOM_2_KEY, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -5119,7 +5119,7 @@ const struct Item gItems[] = [ITEM_ROOM_4_KEY] = { - .name = _("Rm. 4 Key"), + .name = _("RM. 4 KEY"), .itemId = ITEM_ROOM_4_KEY, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -5137,7 +5137,7 @@ const struct Item gItems[] = [ITEM_ROOM_6_KEY] = { - .name = _("Rm. 6 Key"), + .name = _("RM. 6 KEY"), .itemId = ITEM_ROOM_6_KEY, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -5155,7 +5155,7 @@ const struct Item gItems[] = [ITEM_STORAGE_KEY] = { - .name = _("Storage Key"), + .name = _("STORAGE KEY"), .itemId = ITEM_STORAGE_KEY, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -5173,7 +5173,7 @@ const struct Item gItems[] = [ITEM_ROOT_FOSSIL] = { - .name = _("Root Fossil"), + .name = _("ROOT FOSSIL"), .itemId = ITEM_ROOT_FOSSIL, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -5191,7 +5191,7 @@ const struct Item gItems[] = [ITEM_CLAW_FOSSIL] = { - .name = _("Claw Fossil"), + .name = _("CLAW FOSSIL"), .itemId = ITEM_CLAW_FOSSIL, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -5209,7 +5209,7 @@ const struct Item gItems[] = [ITEM_DEVON_SCOPE] = { - .name = _("Devon Scope"), + .name = _("DEVON SCOPE"), .itemId = ITEM_DEVON_SCOPE, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6311,7 +6311,7 @@ const struct Item gItems[] = [ITEM_OAKS_PARCEL] = { - .name = _("Oak's Parcel"), + .name = _("OAK'S PARCEL"), .itemId = ITEM_OAKS_PARCEL, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6329,7 +6329,7 @@ const struct Item gItems[] = [ITEM_POKE_FLUTE] = { - .name = _("Poké Flute"), + .name = _("POKé FLUTE"), .itemId = ITEM_POKE_FLUTE, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6347,7 +6347,7 @@ const struct Item gItems[] = [ITEM_SECRET_KEY] = { - .name = _("Secret Key"), + .name = _("SECRET KEY"), .itemId = ITEM_SECRET_KEY, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6365,7 +6365,7 @@ const struct Item gItems[] = [ITEM_BIKE_VOUCHER] = { - .name = _("Bike Voucher"), + .name = _("BIKE VOUCHER"), .itemId = ITEM_BIKE_VOUCHER, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6383,7 +6383,7 @@ const struct Item gItems[] = [ITEM_GOLD_TEETH] = { - .name = _("Gold Teeth"), + .name = _("GOLD TEETH"), .itemId = ITEM_GOLD_TEETH, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6401,7 +6401,7 @@ const struct Item gItems[] = [ITEM_OLD_AMBER] = { - .name = _("Old Amber"), + .name = _("OLD AMBER"), .itemId = ITEM_OLD_AMBER, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6419,7 +6419,7 @@ const struct Item gItems[] = [ITEM_CARD_KEY] = { - .name = _("Card Key"), + .name = _("CARD KEY"), .itemId = ITEM_CARD_KEY, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6437,7 +6437,7 @@ const struct Item gItems[] = [ITEM_LIFT_KEY] = { - .name = _("Lift Key"), + .name = _("LIFT KEY"), .itemId = ITEM_LIFT_KEY, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6455,7 +6455,7 @@ const struct Item gItems[] = [ITEM_HELIX_FOSSIL] = { - .name = _("Helix Fossil"), + .name = _("HELIX FOSSIL"), .itemId = ITEM_HELIX_FOSSIL, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6473,7 +6473,7 @@ const struct Item gItems[] = [ITEM_DOME_FOSSIL] = { - .name = _("Dome Fossil"), + .name = _("DOME FOSSIL"), .itemId = ITEM_DOME_FOSSIL, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6491,7 +6491,7 @@ const struct Item gItems[] = [ITEM_SILPH_SCOPE] = { - .name = _("Silph Scope"), + .name = _("SILPH SCOPE"), .itemId = ITEM_SILPH_SCOPE, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6509,7 +6509,7 @@ const struct Item gItems[] = [ITEM_BICYCLE] = { - .name = _("Bicycle"), + .name = _("BICYCLE"), .itemId = ITEM_BICYCLE, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6527,7 +6527,7 @@ const struct Item gItems[] = [ITEM_TOWN_MAP] = { - .name = _("Town Map"), + .name = _("TOWN MAP"), .itemId = ITEM_TOWN_MAP, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6545,7 +6545,7 @@ const struct Item gItems[] = [ITEM_VS_SEEKER] = { - .name = _("VS Seeker"), + .name = _("VS SEEKER"), .itemId = ITEM_VS_SEEKER, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6563,7 +6563,7 @@ const struct Item gItems[] = [ITEM_FAME_CHECKER] = { - .name = _("Fame Checker"), + .name = _("FAME CHECKER"), .itemId = ITEM_FAME_CHECKER, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6581,7 +6581,7 @@ const struct Item gItems[] = [ITEM_TM_CASE] = { - .name = _("TM Case"), + .name = _("TM CASE"), .itemId = ITEM_TM_CASE, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6599,7 +6599,7 @@ const struct Item gItems[] = [ITEM_BERRY_POUCH] = { - .name = _("Berry Pouch"), + .name = _("BERRY POUCH"), .itemId = ITEM_BERRY_POUCH, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6617,7 +6617,7 @@ const struct Item gItems[] = [ITEM_TEACHY_TV] = { - .name = _("Teachy TV"), + .name = _("TEACHY TV"), .itemId = ITEM_TEACHY_TV, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6635,7 +6635,7 @@ const struct Item gItems[] = [ITEM_TRI_PASS] = { - .name = _("Tri-Pass"), + .name = _("TRI-PASS"), .itemId = ITEM_TRI_PASS, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6653,7 +6653,7 @@ const struct Item gItems[] = [ITEM_RAINBOW_PASS] = { - .name = _("Rainbow Pass"), + .name = _("RAINBOW PASS"), .itemId = ITEM_RAINBOW_PASS, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6671,7 +6671,7 @@ const struct Item gItems[] = [ITEM_TEA] = { - .name = _("Tea"), + .name = _("TEA"), .itemId = ITEM_TEA, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6689,7 +6689,7 @@ const struct Item gItems[] = [ITEM_MYSTIC_TICKET] = { - .name = _("MysticTicket"), + .name = _("MYSTICTICKET"), .itemId = ITEM_MYSTIC_TICKET, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6707,7 +6707,7 @@ const struct Item gItems[] = [ITEM_AURORA_TICKET] = { - .name = _("AuroraTicket"), + .name = _("AURORATICKET"), .itemId = ITEM_AURORA_TICKET, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6725,7 +6725,7 @@ const struct Item gItems[] = [ITEM_POWDER_JAR] = { - .name = _("Powder Jar"), + .name = _("POWDER JAR"), .itemId = ITEM_POWDER_JAR, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6743,7 +6743,7 @@ const struct Item gItems[] = [ITEM_RUBY] = { - .name = _("Ruby"), + .name = _("RUBY"), .itemId = ITEM_RUBY, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6761,7 +6761,7 @@ const struct Item gItems[] = [ITEM_SAPPHIRE] = { - .name = _("Sapphire"), + .name = _("SAPPHIRE"), .itemId = ITEM_SAPPHIRE, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6781,7 +6781,7 @@ const struct Item gItems[] = [ITEM_MAGMA_EMBLEM] = { - .name = _("Magma Emblem"), + .name = _("MAGMA EMBLEM"), .itemId = ITEM_MAGMA_EMBLEM, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6799,7 +6799,7 @@ const struct Item gItems[] = [ITEM_OLD_SEA_MAP] = { - .name = _("Old Sea Map"), + .name = _("OLD SEA MAP"), .itemId = ITEM_OLD_SEA_MAP, .price = 0, .holdEffect = HOLD_EFFECT_NONE, @@ -6814,2343 +6814,4 @@ const struct Item gItems[] = .battleUseFunc = NULL, .secondaryId = 0, }, - - [ITEM_WIDE_LENS] = - { - .name = _("Wide Lens"), - .itemId = ITEM_WIDE_LENS, - .price = 200, - .holdEffect = HOLD_EFFECT_WIDE_LENS, - .holdEffectParam = 10, - .description = gWideLensItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_MUSCLE_BAND] = - { - .name = _("Muscle Band"), - .itemId = ITEM_MUSCLE_BAND, - .price = 200, - .holdEffect = HOLD_EFFECT_MUSCLE_BAND, - .holdEffectParam = 10, - .description = gMuscleBandItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_WISE_GLASSES] = - { - .name = _("Wise Glasses"), - .itemId = ITEM_WISE_GLASSES, - .price = 200, - .holdEffect = HOLD_EFFECT_WISE_GLASSES, - .holdEffectParam = 10, - .description = gWiseGlassesItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_EXPERT_BELT] = - { - .name = _("Expert Belt"), - .itemId = ITEM_EXPERT_BELT, - .price = 200, - .holdEffect = HOLD_EFFECT_EXPERT_BELT, - .holdEffectParam = 20, - .description = gExpertBeltItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_LIGHT_CLAY] = - { - .name = _("Light Clay"), - .itemId = ITEM_LIGHT_CLAY, - .price = 200, - .holdEffect = HOLD_EFFECT_LIGHT_CLAY, - .holdEffectParam = 0, - .description = gLightClayItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_LIFE_ORB] = - { - .name = _("Life Orb"), - .itemId = ITEM_LIFE_ORB, - .price = 200, - .holdEffect = HOLD_EFFECT_LIFE_ORB, - .holdEffectParam = 0, - .description = gLifeOrbItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_POWER_HERB] = - { - .name = _("Power Herb"), - .itemId = ITEM_POWER_HERB, - .price = 200, - .holdEffect = HOLD_EFFECT_POWER_HERB, - .holdEffectParam = 0, - .description = gPowerHerbItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_TOXIC_ORB] = - { - .name = _("Toxic Orb"), - .itemId = ITEM_TOXIC_ORB, - .price = 200, - .holdEffect = HOLD_EFFECT_TOXIC_ORB, - .holdEffectParam = 0, - .description = gToxicOrbItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_FLAME_ORB] = - { - .name = _("Flame Orb"), - .itemId = ITEM_FLAME_ORB, - .price = 200, - .holdEffect = HOLD_EFFECT_FLAME_ORB, - .holdEffectParam = 0, - .description = gFlameOrbItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_QUICK_POWDER] = - { - .name = _("Quick Powder"), - .itemId = ITEM_QUICK_POWDER, - .price = 200, - .holdEffect = HOLD_EFFECT_QUICK_POWDER, - .holdEffectParam = 0, - .description = gQuickPowderItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_FOCUS_SASH] = - { - .name = _("Focus Sash"), - .itemId = ITEM_FOCUS_SASH, - .price = 200, - .holdEffect = HOLD_EFFECT_FOCUS_SASH, - .holdEffectParam = 0, - .description = gFocusSashItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_ZOOM_LENS] = - { - .name = _("Zoom Lens"), - .itemId = ITEM_ZOOM_LENS, - .price = 200, - .holdEffect = HOLD_EFFECT_ZOOM_LENS, - .holdEffectParam = 20, - .description = gZoomLensItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_METRONOME] = - { - .name = _("Metronome"), - .itemId = ITEM_METRONOME, - .price = 200, - .holdEffect = HOLD_EFFECT_METRONOME, - .holdEffectParam = 20, - .description = gMetronomeItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_IRON_BALL] = - { - .name = _("Iron Ball"), - .itemId = ITEM_IRON_BALL, - .price = 200, - .holdEffect = HOLD_EFFECT_IRON_BALL, - .holdEffectParam = 0, - .description = gIronBallItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_LAGGING_TAIL] = - { - .name = _("Lagging Tail"), - .itemId = ITEM_LAGGING_TAIL, - .price = 200, - .holdEffect = HOLD_EFFECT_LAGGING_TAIL, - .holdEffectParam = 0, - .description = gLaggingTailItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_DESTINY_KNOT] = - { - .name = _("Destiny Knot"), - .itemId = ITEM_DESTINY_KNOT, - .price = 200, - .holdEffect = HOLD_EFFECT_DESTINY_KNOT, - .holdEffectParam = 0, - .description = gDestinyKnotItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_BLACK_SLUDGE] = - { - .name = _("Black Sludge"), - .itemId = ITEM_BLACK_SLUDGE, - .price = 200, - .holdEffect = HOLD_EFFECT_BLACK_SLUDGE, - .holdEffectParam = 0, - .description = gBlackSludgeItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_ICY_ROCK] = - { - .name = _("Icy Rock"), - .itemId = ITEM_ICY_ROCK, - .price = 200, - .holdEffect = HOLD_EFFECT_ICY_ROCK, - .holdEffectParam = 0, - .description = gIcyRockItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_SMOOTH_ROCK] = - { - .name = _("Smooth Rock"), - .itemId = ITEM_SMOOTH_ROCK, - .price = 200, - .holdEffect = HOLD_EFFECT_SMOOTH_ROCK, - .holdEffectParam = 0, - .description = gSmoothRockItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_HEAT_ROCK] = - { - .name = _("Heat Rock"), - .itemId = ITEM_HEAT_ROCK, - .price = 200, - .holdEffect = HOLD_EFFECT_HEAT_ROCK, - .holdEffectParam = 0, - .description = gHeatRockItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_DAMP_ROCK] = - { - .name = _("Damp Rock"), - .itemId = ITEM_DAMP_ROCK, - .price = 200, - .holdEffect = HOLD_EFFECT_DAMP_ROCK, - .holdEffectParam = 0, - .description = gDampRockItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_GRIP_CLAW] = - { - .name = _("Grip Claw"), - .itemId = ITEM_GRIP_CLAW, - .price = 200, - .holdEffect = HOLD_EFFECT_GRIP_CLAW, - .holdEffectParam = 0, - .description = gGripClawItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_CHOICE_SCARF] = - { - .name = _("Choice Scarf"), - .itemId = ITEM_CHOICE_SCARF, - .price = 200, - .holdEffect = HOLD_EFFECT_CHOICE_SCARF, - .holdEffectParam = 0, - .description = gChoiceScarfItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_STICKY_BARB] = - { - .name = _("Sticky Barb"), - .itemId = ITEM_STICKY_BARB, - .price = 200, - .holdEffect = HOLD_EFFECT_STICKY_BARB, - .holdEffectParam = 0, - .description = gStickyBarbItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_SHED_SHELL] = - { - .name = _("Shed Shell"), - .itemId = ITEM_SHED_SHELL, - .price = 200, - .holdEffect = HOLD_EFFECT_SHED_SHELL, - .holdEffectParam = 0, - .description = gShedShellItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_BIG_ROOT] = - { - .name = _("Big Root"), - .itemId = ITEM_BIG_ROOT, - .price = 200, - .holdEffect = HOLD_EFFECT_BIG_ROOT, - .holdEffectParam = 30, - .description = gBigRootItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_CHOICE_SPECS] = - { - .name = _("Choice Specs"), - .itemId = ITEM_CHOICE_SPECS, - .price = 200, - .holdEffect = HOLD_EFFECT_CHOICE_SPECS, - .holdEffectParam = 0, - .description = gChoiceSpecsItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_ADAMANT_ORB] = - { - .name = _("Adamant Orb"), - .itemId = ITEM_ADAMANT_ORB, - .price = 200, - .holdEffect = HOLD_EFFECT_ADAMANT_ORB, - .holdEffectParam = 0, - .description = gAdamantOrbItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_LUSTROUS_ORB] = - { - .name = _("Lustrous Orb"), - .itemId = ITEM_LUSTROUS_ORB, - .price = 200, - .holdEffect = HOLD_EFFECT_LUSTROUS_ORB, - .holdEffectParam = 0, - .description = gLustrousOrbItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_GRISEOUS_ORB] = - { - .name = _("Griseous Orb"), - .itemId = ITEM_GRISEOUS_ORB, - .price = 200, - .holdEffect = HOLD_EFFECT_GRISEOUS_ORB, - .holdEffectParam = 0, - .description = gGriseousOrbItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_FLAME_PLATE] = - { - .name = _("Flame Plate"), - .itemId = ITEM_FLAME_PLATE, - .price = 200, - .holdEffect = HOLD_EFFECT_FIRE_POWER, - .holdEffectParam = 20, - .description = gFlamePlateItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_SPLASH_PLATE] = - { - .name = _("Splash Plate"), - .itemId = ITEM_SPLASH_PLATE, - .price = 200, - .holdEffect = HOLD_EFFECT_WATER_POWER, - .holdEffectParam = 20, - .description = gSplashPlateItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_ZAP_PLATE] = - { - .name = _("Zap Plate"), - .itemId = ITEM_ZAP_PLATE, - .price = 200, - .holdEffect = HOLD_EFFECT_ELECTRIC_POWER, - .holdEffectParam = 20, - .description = gZapPlateItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_MEADOW_PLATE] = - { - .name = _("Meadow Plate"), - .itemId = ITEM_MEADOW_PLATE, - .price = 200, - .holdEffect = HOLD_EFFECT_GRASS_POWER, - .holdEffectParam = 20, - .description = gMeadowPlateItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_ICICLE_PLATE] = - { - .name = _("Icicle Plate"), - .itemId = ITEM_ICICLE_PLATE, - .price = 200, - .holdEffect = HOLD_EFFECT_ICE_POWER, - .holdEffectParam = 20, - .description = gIciclePlateItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_FIST_PLATE] = - { - .name = _("Fist Plate"), - .itemId = ITEM_FIST_PLATE, - .price = 200, - .holdEffect = HOLD_EFFECT_FIGHTING_POWER, - .holdEffectParam = 20, - .description = gFistPlateItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_TOXIC_PLATE] = - { - .name = _("Toxic Plate"), - .itemId = ITEM_TOXIC_PLATE, - .price = 200, - .holdEffect = HOLD_EFFECT_POISON_POWER, - .holdEffectParam = 20, - .description = gToxicPlateItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_EARTH_PLATE] = - { - .name = _("Earth Plate"), - .itemId = ITEM_EARTH_PLATE, - .price = 200, - .holdEffect = HOLD_EFFECT_GROUND_POWER, - .holdEffectParam = 20, - .description = gEarthPlateItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_SKY_PLATE] = - { - .name = _("Sky Plate"), - .itemId = ITEM_SKY_PLATE, - .price = 200, - .holdEffect = HOLD_EFFECT_FLYING_POWER, - .holdEffectParam = 20, - .description = gSkyPlateItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_MIND_PLATE] = - { - .name = _("Mind Plate"), - .itemId = ITEM_MIND_PLATE, - .price = 200, - .holdEffect = HOLD_EFFECT_PSYCHIC_POWER, - .holdEffectParam = 20, - .description = gMindPlateItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_INSECT_PLATE] = - { - .name = _("Insect Plate"), - .itemId = ITEM_INSECT_PLATE, - .price = 200, - .holdEffect = HOLD_EFFECT_BUG_POWER, - .holdEffectParam = 20, - .description = gInsectPlateItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_STONE_PLATE] = - { - .name = _("Stone Plate"), - .itemId = ITEM_STONE_PLATE, - .price = 200, - .holdEffect = HOLD_EFFECT_ROCK_POWER, - .holdEffectParam = 20, - .description = gStonePlateItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_SPOOKY_PLATE] = - { - .name = _("Spooky Plate"), - .itemId = ITEM_SPOOKY_PLATE, - .price = 200, - .holdEffect = HOLD_EFFECT_GHOST_POWER, - .holdEffectParam = 20, - .description = gSpookyPlateItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_DRACO_PLATE] = - { - .name = _("Draco Plate"), - .itemId = ITEM_DRACO_PLATE, - .price = 200, - .holdEffect = HOLD_EFFECT_DRAGON_POWER, - .holdEffectParam = 20, - .description = gDracoPlateItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_DREAD_PLATE] = - { - .name = _("Dread Plate"), - .itemId = ITEM_DREAD_PLATE, - .price = 200, - .holdEffect = HOLD_EFFECT_DARK_POWER, - .holdEffectParam = 20, - .description = gDreadPlateItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_IRON_PLATE] = - { - .name = _("Iron Plate"), - .itemId = ITEM_IRON_PLATE, - .price = 200, - .holdEffect = HOLD_EFFECT_STEEL_POWER, - .holdEffectParam = 20, - .description = gIronPlateItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_EVIOLITE] = - { - .name = _("Eviolite"), - .itemId = ITEM_EVIOLITE, - .price = 200, - .holdEffect = HOLD_EFFECT_EVIOLITE, - .holdEffectParam = 50, - .description = gEvioliteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_FLOAT_STONE] = - { - .name = _("Float Stone"), - .itemId = ITEM_FLOAT_STONE, - .price = 200, - .holdEffect = HOLD_EFFECT_FLOAT_STONE, - .holdEffectParam = 0, - .description = gFloatStoneItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_BINDING_BAND] = - { - .name = _("Binding Band"), - .itemId = ITEM_BINDING_BAND, - .price = 200, - .holdEffect = HOLD_EFFECT_BINDING_BAND, - .holdEffectParam = 0, - .description = gBindingBandItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_DOUSE_DRIVE] = - { - .name = _("Douse Drive"), - .itemId = ITEM_DOUSE_DRIVE, - .price = 200, - .holdEffect = HOLD_EFFECT_DRIVE, - .holdEffectParam = 0, - .description = gDouseDriveItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_SHOCK_DRIVE] = - { - .name = _("Shock Drive"), - .itemId = ITEM_SHOCK_DRIVE, - .price = 200, - .holdEffect = HOLD_EFFECT_DRIVE, - .holdEffectParam = 0, - .description = gShockDriveItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_BURN_DRIVE] = - { - .name = _("Burn Drive"), - .itemId = ITEM_BURN_DRIVE, - .price = 200, - .holdEffect = HOLD_EFFECT_DRIVE, - .holdEffectParam = 0, - .description = gBurnDriveItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_CHILL_DRIVE] = - { - .name = _("Chill Drive"), - .itemId = ITEM_CHILL_DRIVE, - .price = 200, - .holdEffect = HOLD_EFFECT_DRIVE, - .holdEffectParam = 0, - .description = gChillDriveItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_FIRE_GEM] = - { - .name = _("Fire Gem"), - .itemId = ITEM_FIRE_GEM, - .price = 200, - .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 0, - .description = gFireGemItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_WATER_GEM] = - { - .name = _("Water Gem"), - .itemId = ITEM_WATER_GEM, - .price = 200, - .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 0, - .description = gWaterGemItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_ELECTRIC_GEM] = - { - .name = _("Electric Gem"), - .itemId = ITEM_ELECTRIC_GEM, - .price = 200, - .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 0, - .description = gElectricGemItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_GRASS_GEM] = - { - .name = _("Grass Gem"), - .itemId = ITEM_GRASS_GEM, - .price = 200, - .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 0, - .description = gGrassGemItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_ICE_GEM] = - { - .name = _("Ice Gem"), - .itemId = ITEM_ICE_GEM, - .price = 200, - .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 0, - .description = gIceGemItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_FIGHTING_GEM] = - { - .name = _("Fighting Gem"), - .itemId = ITEM_FIGHTING_GEM, - .price = 200, - .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 0, - .description = gFightingGemItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_POISON_GEM] = - { - .name = _("Poison Gem"), - .itemId = ITEM_POISON_GEM, - .price = 200, - .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 0, - .description = gPoisonGemItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_GROUND_GEM] = - { - .name = _("Ground Gem"), - .itemId = ITEM_GROUND_GEM, - .price = 200, - .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 0, - .description = gGroundGemItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_FLYING_GEM] = - { - .name = _("Flying Gem"), - .itemId = ITEM_FLYING_GEM, - .price = 200, - .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 0, - .description = gFlyingGemItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_PSYCHIC_GEM] = - { - .name = _("Psychic Gem"), - .itemId = ITEM_PSYCHIC_GEM, - .price = 200, - .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 0, - .description = gPsychicGemItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_BUG_GEM] = - { - .name = _("Bug Gem"), - .itemId = ITEM_BUG_GEM, - .price = 200, - .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 0, - .description = gBugGemItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_ROCK_GEM] = - { - .name = _("Rock Gem"), - .itemId = ITEM_ROCK_GEM, - .price = 200, - .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 0, - .description = gRockGemItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_GHOST_GEM] = - { - .name = _("Ghost Gem"), - .itemId = ITEM_GHOST_GEM, - .price = 200, - .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 0, - .description = gGhostGemItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_DRAGON_GEM] = - { - .name = _("Dragon Gem"), - .itemId = ITEM_DRAGON_GEM, - .price = 200, - .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 0, - .description = gDragonGemItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_DARK_GEM] = - { - .name = _("Dark Gem"), - .itemId = ITEM_DARK_GEM, - .price = 200, - .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 0, - .description = gDarkGemItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_STEEL_GEM] = - { - .name = _("Steel Gem"), - .itemId = ITEM_STEEL_GEM, - .price = 200, - .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 0, - .description = gSteelGemItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_NORMAL_GEM] = - { - .name = _("Normal Gem"), - .itemId = ITEM_NORMAL_GEM, - .price = 200, - .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 0, - .description = gNormalGemItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_FAIRY_GEM] = - { - .name = _("Fairy Gem"), - .itemId = ITEM_FAIRY_GEM, - .price = 200, - .holdEffect = HOLD_EFFECT_GEMS, - .holdEffectParam = 0, - .description = gFairyGemItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_ASSAULT_VEST] = - { - .name = _("Assault Vest"), - .itemId = ITEM_ASSAULT_VEST, - .price = 200, - .holdEffect = HOLD_EFFECT_ASSAULT_VEST, - .holdEffectParam = 50, - .description = gAssaultVestItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_PIXIE_PLATE] = - { - .name = _("Pixie Plate"), - .itemId = ITEM_PIXIE_PLATE, - .price = 200, - .holdEffect = HOLD_EFFECT_FAIRY_POWER, - .holdEffectParam = 20, - .description = gPixiePlateItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_SAFETY_GOGGLES] = - { - .name = _("SafetyGoggles"), - .itemId = ITEM_SAFETY_GOGGLES, - .price = 4000, - .holdEffect = HOLD_EFFECT_SAFETY_GOOGLES, - .holdEffectParam = 0, - .description = gSafetyGogglesItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_GENGARITE] = - { - .name = _("Gengarite"), - .itemId = ITEM_GENGARITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gGengariteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_GARDEVOIRITE] = - { - .name = _("Gardevoirite"), - .itemId = ITEM_GARDEVOIRITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gGardevoiriteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_AMPHAROSITE] = - { - .name = _("Ampharosite"), - .itemId = ITEM_AMPHAROSITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gAmpharositeItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_VENUSAURITE] = - { - .name = _("Venusaurite"), - .itemId = ITEM_VENUSAURITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gVenusauriteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_CHARIZARDITE_X] = - { - .name = _("CharizarditeX"), - .itemId = ITEM_CHARIZARDITE_X, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gCharizarditeItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_BLASTOISINITE] = - { - .name = _("Blastoisinite"), - .itemId = ITEM_BLASTOISINITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gBlastoisiniteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_MEWTWONITE_X] = - { - .name = _("Mewtwonite X"), - .itemId = ITEM_MEWTWONITE_X, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gMewtwoniteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_MEWTWONITE_Y] = - { - .name = _("Mewtwonite Y"), - .itemId = ITEM_MEWTWONITE_Y, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gMewtwoniteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_BLAZIKENITE] = - { - .name = _("Blazikenite"), - .itemId = ITEM_BLAZIKENITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gBlazikeniteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_MEDICHAMITE] = - { - .name = _("Medichamite"), - .itemId = ITEM_MEDICHAMITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gMedichamiteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_HOUNDOOMINITE] = - { - .name = _("Houndoominite"), - .itemId = ITEM_HOUNDOOMINITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gHoundoominiteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_AGGRONITE] = - { - .name = _("Aggronite"), - .itemId = ITEM_AGGRONITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gAggroniteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_BANETTITE] = - { - .name = _("Banettite"), - .itemId = ITEM_BANETTITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gBanettiteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_TYRANITARITE] = - { - .name = _("Tyranitarite"), - .itemId = ITEM_TYRANITARITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gTyranitariteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_SCIZORITE] = - { - .name = _("Scizorite"), - .itemId = ITEM_SCIZORITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gScizoriteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_PINSIRITE] = - { - .name = _("Pinsirite"), - .itemId = ITEM_PINSIRITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gPinsiriteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_AERODACTYLITE] = - { - .name = _("Aerodactylite"), - .itemId = ITEM_AERODACTYLITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gAerodactyliteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_LUCARIONITE] = - { - .name = _("Lucarionite"), - .itemId = ITEM_LUCARIONITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gLucarioniteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_ABOMASITE] = - { - .name = _("Abomasite"), - .itemId = ITEM_ABOMASITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gAbomasiteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_KANGASKHANITE] = - { - .name = _("Kangaskhanite"), - .itemId = ITEM_KANGASKHANITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gKangaskhaniteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_GYARADOSITE] = - { - .name = _("Gyaradosite"), - .itemId = ITEM_GYARADOSITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gGyaradositeItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_ABSOLITE] = - { - .name = _("Absolite"), - .itemId = ITEM_ABSOLITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gAbsoliteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_CHARIZARDITE_Y] = - { - .name = _("CharizarditeY"), - .itemId = ITEM_CHARIZARDITE_Y, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gCharizarditeItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_ALAKAZITE] = - { - .name = _("Alakazite"), - .itemId = ITEM_ALAKAZITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gAlakaziteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_HERACRONITE] = - { - .name = _("Heracronite"), - .itemId = ITEM_HERACRONITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gHeracroniteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_MAWILITE] = - { - .name = _("Mawilite"), - .itemId = ITEM_MAWILITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gMawiliteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_MANECTITE] = - { - .name = _("Manectite"), - .itemId = ITEM_MANECTITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gManectiteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_GARCHOMPITE] = - { - .name = _("Garchompite"), - .itemId = ITEM_GARCHOMPITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gGarchompiteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_LATIASITE] = - { - .name = _("Latiasite"), - .itemId = ITEM_LATIASITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gLatiasiteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_LATIOSITE] = - { - .name = _("Latiosite"), - .itemId = ITEM_LATIOSITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gLatiositeItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_SWAMPERTITE] = - { - .name = _("Swampertite"), - .itemId = ITEM_SWAMPERTITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gSwampertiteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_SCEPTILITE] = - { - .name = _("Sceptilite"), - .itemId = ITEM_SCEPTILITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gSceptiliteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_SABLENITE] = - { - .name = _("Sablenite"), - .itemId = ITEM_SABLENITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gSableniteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_ALTARIANITE] = - { - .name = _("Altarianite"), - .itemId = ITEM_ALTARIANITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gAltarianiteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_GALLADITE] = - { - .name = _("Galladite"), - .itemId = ITEM_GALLADITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gGalladiteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_AUDINITE] = - { - .name = _("Audinite"), - .itemId = ITEM_AUDINITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gAudiniteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_METAGROSSITE] = - { - .name = _("Metagrossite"), - .itemId = ITEM_METAGROSSITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gMetagrossiteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_SHARPEDONITE] = - { - .name = _("Sharpedonite"), - .itemId = ITEM_SHARPEDONITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gSharpedoniteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_SLOWBRONITE] = - { - .name = _("Slowbronite"), - .itemId = ITEM_SLOWBRONITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gSlowbroniteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_STEELIXITE] = - { - .name = _("Steelixite"), - .itemId = ITEM_STEELIXITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gSteelixiteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_PIDGEOTITE] = - { - .name = _("Pidgeotite"), - .itemId = ITEM_PIDGEOTITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gPidgeotiteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_GLALITITE] = - { - .name = _("Glalitite"), - .itemId = ITEM_GLALITITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gGlalititeItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_DIANCITE] = - { - .name = _("Diancite"), - .itemId = ITEM_DIANCITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gDianciteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_CAMERUPTITE] = - { - .name = _("Cameruptite"), - .itemId = ITEM_CAMERUPTITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gCameruptiteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_LOPUNNITE] = - { - .name = _("Lopunnite"), - .itemId = ITEM_LOPUNNITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gLopunniteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_SALAMENCITE] = - { - .name = _("Salamencite"), - .itemId = ITEM_SALAMENCITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gSalamenciteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_BEEDRILLITE] = - { - .name = _("Beedrillite"), - .itemId = ITEM_BEEDRILLITE, - .price = 200, - .holdEffect = HOLD_EFFECT_MEGA_STONE, - .holdEffectParam = 0, - .description = gBeedrilliteItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_MEGA_BRACELET] = - { - .name = _("Mega Bracelet"), - .itemId = ITEM_MEGA_BRACELET, - .price = 200, - .holdEffect = HOLD_EFFECT_NONE, - .holdEffectParam = 0, - .description = gMegaBraceletItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_KEY_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_PROTECTIVE_PADS] = - { - .name = _("Protect Pads"), // Shortened name from Protective Pads - .itemId = ITEM_PROTECTIVE_PADS, - .price = 4000, - .holdEffect = HOLD_EFFECT_PROTECTIVE_PADS, - .holdEffectParam = 0, - .description = gProtectPadsItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_TERRAIN_EXTENDER] = - { - .name = _("Terrain Exte."), - .itemId = ITEM_TERRAIN_EXTENDER, - .price = 4000, - .holdEffect = HOLD_EFFECT_TERRAIN_EXTENDER, - .holdEffectParam = 0, - .description = gTerrainExtenderItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_ELECTRIC_SEED] = - { - .name = _("Electric Seed"), - .itemId = ITEM_ELECTRIC_SEED, - .price = 4000, - .holdEffect = HOLD_EFFECT_SEEDS, - .holdEffectParam = 0, - .description = gElectricSeedItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_GRASSY_SEED] = - { - .name = _("Grassy Seed"), - .itemId = ITEM_GRASSY_SEED, - .price = 4000, - .holdEffect = HOLD_EFFECT_SEEDS, - .holdEffectParam = 0, - .description = gGrassySeedItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_MISTY_SEED] = - { - .name = _("Misty Seed"), - .itemId = ITEM_MISTY_SEED, - .price = 4000, - .holdEffect = HOLD_EFFECT_SEEDS, - .holdEffectParam = 0, - .description = gMistySeedItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_PSYCHIC_SEED] = - { - .name = _("Psychic Seed"), - .itemId = ITEM_PSYCHIC_SEED, - .price = 4000, - .holdEffect = HOLD_EFFECT_SEEDS, - .holdEffectParam = 0, - .description = gPsychicSeedItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - - [ITEM_ADRENALINE_ORB] = - { - .name = _("AdrenalineOrb"), - .itemId = ITEM_ADRENALINE_ORB, - .price = 300, - .holdEffect = HOLD_EFFECT_ADRENALINE_ORB, - .holdEffectParam = 0, - .description = gAdrenalineOrbItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, - [ITEM_HONEY] = - { - .name = _("Honey"), - .itemId = ITEM_HONEY, - .price = 100, - .holdEffect = HOLD_EFFECT_NONE, - .holdEffectParam = 0, - .description = gHoneyItemDescription, - .importance = 0, - .unk19 = 0, - .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 0, - .battleUseFunc = NULL, - .secondaryId = 0, - }, }; diff --git a/src/data/pokemon/evolution.h b/src/data/pokemon/evolution.h index b8e406c5c4..c9b0cf716d 100644 --- a/src/data/pokemon/evolution.h +++ b/src/data/pokemon/evolution.h @@ -170,8 +170,7 @@ const struct Evolution gEvolutionTable[NUM_SPECIES][EVOS_PER_MON] = [SPECIES_VIGOROTH] = {{EVO_LEVEL, 36, SPECIES_SLAKING}}, [SPECIES_GULPIN] = {{EVO_LEVEL, 26, SPECIES_SWALOT}}, [SPECIES_WHISMUR] = {{EVO_LEVEL, 20, SPECIES_LOUDRED}}, - [SPECIES_LOUDRED] = {{EVO_LEVEL, 40, SPECIES_EXPLOUD}, - {EVO_MEGA_EVOLUTION, ITEM_MEGA_STONE_TESTING, SPECIES_HO_OH}}, + [SPECIES_LOUDRED] = {{EVO_LEVEL, 40, SPECIES_EXPLOUD}}, [SPECIES_CLAMPERL] = {{EVO_TRADE_ITEM, ITEM_DEEP_SEA_TOOTH, SPECIES_HUNTAIL}, {EVO_TRADE_ITEM, ITEM_DEEP_SEA_SCALE, SPECIES_GOREBYSS}}, [SPECIES_SHUPPET] = {{EVO_LEVEL, 37, SPECIES_BANETTE}}, @@ -185,5 +184,4 @@ const struct Evolution gEvolutionTable[NUM_SPECIES][EVOS_PER_MON] = [SPECIES_SHELGON] = {{EVO_LEVEL, 50, SPECIES_SALAMENCE}}, [SPECIES_BELDUM] = {{EVO_LEVEL, 20, SPECIES_METANG}}, [SPECIES_METANG] = {{EVO_LEVEL, 45, SPECIES_METAGROSS}}, - [SPECIES_SKARMORY] = {{EVO_MEGA_EVOLUTION, ITEM_MEGA_STONE_TESTING, SPECIES_HO_OH}}, }; From 93e86e6a7675536f088e2f408f219e257f1c38a1 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 13 Apr 2019 14:36:08 +0200 Subject: [PATCH 348/667] Tweak Stomping Tantrum --- include/constants/battle_script_commands.h | 41 +++++++++++----------- src/battle_main.c | 2 +- src/battle_script_commands.c | 12 +++---- 3 files changed, 26 insertions(+), 29 deletions(-) diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 89949560df..681838f76f 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -162,27 +162,26 @@ #define ATK48_DONT_CHECK_LOWER 0x8 // atk49, moveend cases -#define ATK49_FAILED_MOVE_COUNTER 0 -#define ATK49_SPIKY_SHIELD 1 -#define ATK49_RAGE 2 -#define ATK49_DEFROST 3 -#define ATK49_SYNCHRONIZE_TARGET 4 -#define ATK49_MOVE_END_ABILITIES 5 -#define ATK49_STATUS_IMMUNITY_ABILITIES 6 -#define ATK49_SYNCHRONIZE_ATTACKER 7 -#define ATK49_CHOICE_MOVE 8 -#define ATK49_CHANGED_ITEMS 9 -#define ATK49_ATTACKER_INVISIBLE 10 -#define ATK49_ATTACKER_VISIBLE 11 -#define ATK49_TARGET_VISIBLE 12 -#define ATK49_ITEM_EFFECTS_ALL 13 -#define ATK49_KINGSROCK_SHELLBELL 14 -#define ATK49_SUBSTITUTE 15 -#define ATK49_UPDATE_LAST_MOVES 16 -#define ATK49_MIRROR_MOVE 17 -#define ATK49_NEXT_TARGET 18 -#define ATK49_CLEAR_BITS 19 -#define ATK49_COUNT 20 +#define ATK49_SPIKY_SHIELD 0 +#define ATK49_RAGE 1 +#define ATK49_DEFROST 2 +#define ATK49_SYNCHRONIZE_TARGET 3 +#define ATK49_MOVE_END_ABILITIES 4 +#define ATK49_STATUS_IMMUNITY_ABILITIES 5 +#define ATK49_SYNCHRONIZE_ATTACKER 6 +#define ATK49_CHOICE_MOVE 7 +#define ATK49_CHANGED_ITEMS 8 +#define ATK49_ATTACKER_INVISIBLE 9 +#define ATK49_ATTACKER_VISIBLE 10 +#define ATK49_TARGET_VISIBLE 11 +#define ATK49_ITEM_EFFECTS_ALL 12 +#define ATK49_KINGSROCK_SHELLBELL 13 +#define ATK49_SUBSTITUTE 14 +#define ATK49_UPDATE_LAST_MOVES 15 +#define ATK49_MIRROR_MOVE 16 +#define ATK49_NEXT_TARGET 17 +#define ATK49_CLEAR_BITS 18 +#define ATK49_COUNT 19 #define BIT_HP 0x1 #define BIT_ATK 0x2 diff --git a/src/battle_main.c b/src/battle_main.c index 917cf117e9..695be6470d 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3044,7 +3044,7 @@ void SwitchInClearSetData(void) gBattleStruct->lastTakenMoveFrom[gActiveBattler][1] = 0; gBattleStruct->lastTakenMoveFrom[gActiveBattler][2] = 0; gBattleStruct->lastTakenMoveFrom[gActiveBattler][3] = 0; - + gBattleStruct->lastMoveFailed &= ~(gBitTable[gActiveBattler]); gBattleStruct->field_92 &= ~(gBitTable[gActiveBattler]); for (i = 0; i < gBattlersCount; i++) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 342a20a448..eac5a24bb2 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4214,13 +4214,6 @@ static void atk49_moveend(void) { switch (gBattleScripting.atk49_state) { - case ATK49_FAILED_MOVE_COUNTER: - if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - gBattleStruct->lastMoveFailed |= gBitTable[gBattlerAttacker]; - else - gBattleStruct->lastMoveFailed &= ~(gBitTable[gBattlerAttacker]); - gBattleScripting.atk49_state++; - break; case ATK49_SPIKY_SHIELD: if (gProtectStructs[gBattlerTarget].spikyShielded && gBattleMoves[gCurrentMove].flags & FLAG_MAKES_CONTACT @@ -4386,6 +4379,11 @@ static void atk49_moveend(void) break; case ATK49_UPDATE_LAST_MOVES: gDisableStructs[gBattlerAttacker].usedMoves |= gBitTable[gCurrMovePos]; + 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; From 31222ef64bd771d5bff175cc1f19b7c1c4dc536a Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 13 Apr 2019 14:56:26 +0200 Subject: [PATCH 349/667] Add held effect debug override --- include/battle.h | 1 + src/battle_debug.c | 22 +++++++++++++++++++--- src/battle_util.c | 4 +++- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/include/battle.h b/include/battle.h index 973ec95ef0..8e74501a15 100644 --- a/include/battle.h +++ b/include/battle.h @@ -514,6 +514,7 @@ struct BattleStruct 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 debugHoldEffects[MAX_BATTLERS_COUNT]; // These override actual items' hold effects. }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/src/battle_debug.c b/src/battle_debug.c index d8446bc461..07dea8729c 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -113,6 +113,7 @@ enum VAR_IN_LOVE, VAR_U16_4_ENTRIES, VAL_S8, + VAL_ITEM, }; enum @@ -210,6 +211,7 @@ 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[] = _(""); @@ -856,7 +858,7 @@ static void CreateSecondaryListMenu(struct BattleDebugMenu *data) { case LIST_ITEM_ABILITY: case LIST_ITEM_HELD_ITEM: - itemsCount = 1; + itemsCount = 2; break; case LIST_ITEM_TYPES: itemsCount = 3; @@ -990,6 +992,11 @@ static void PrintSecondaryEntries(struct BattleDebugMenu *data) 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++) @@ -1122,6 +1129,12 @@ static void UpdateBattlerValue(struct BattleDebugMenu *data) 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; } @@ -1338,8 +1351,11 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) data->modifyArrows.maxValue = ITEMS_COUNT - 1; data->modifyArrows.maxDigits = 3; data->modifyArrows.modifiedValPtr = &gBattleMons[data->battlerId].item; - data->modifyArrows.typeOfVal = VAL_U16; - data->modifyArrows.currValue = 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; diff --git a/src/battle_util.c b/src/battle_util.c index 307006226f..024a122023 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4566,7 +4566,9 @@ u32 GetBattlerHoldEffect(u8 battlerId, bool32 checkNegating) gPotentialItemEffectBattler = battlerId; - if (gBattleMons[battlerId].item == ITEM_ENIGMA_BERRY) + if (USE_BATTLE_DEBUG && gBattleStruct->debugHoldEffects[battlerId] != 0) + return gBattleStruct->debugHoldEffects[battlerId]; + else if (gBattleMons[battlerId].item == ITEM_ENIGMA_BERRY) return gEnigmaBerries[battlerId].holdEffect; else return ItemId_GetHoldEffect(gBattleMons[battlerId].item); From 390a68d4a7abf7f294bfdb744c2e52a6ffe6620a Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Sat, 13 Apr 2019 21:13:04 -0400 Subject: [PATCH 350/667] Use Dance Flag --- src/data/battle_moves.h | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 737438fa0f..5d89e7027c 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -206,7 +206,7 @@ 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, }, @@ -1130,7 +1130,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .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, }, @@ -3371,7 +3371,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, - .flags = 0, + .flags = FLAG_DANCE, .split = SPLIT_STATUS, }, @@ -4170,7 +4170,7 @@ 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, }, @@ -4184,7 +4184,7 @@ 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, }, @@ -4900,7 +4900,7 @@ 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, }, @@ -6473,7 +6473,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, - .flags = 0, + .flags = FLAG_DANCE, .split = SPLIT_STATUS, }, @@ -6782,7 +6782,7 @@ 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, }, @@ -7749,7 +7749,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 50, .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_DANCE, .split = SPLIT_SPECIAL, }, @@ -9118,7 +9118,7 @@ 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_DANCE, .split = SPLIT_SPECIAL, }, From e430fe4b02c168e33a1d82610a383a480f3d1003 Mon Sep 17 00:00:00 2001 From: Fontbane <36677462+Fontbane@users.noreply.github.com> Date: Sat, 13 Apr 2019 21:15:00 -0400 Subject: [PATCH 351/667] Add Dance flag --- include/constants/pokemon.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 1f935dbd94..2d577c383b 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -105,6 +105,7 @@ #define FLAG_PROTECTION_MOVE 0x40000 #define FLAG_POWDER 0x80000 #define FLAG_TARGET_ABILITY_IGNORED 0x100000 +#define FLAG_DANCE 0x200000 // Split defines. #define SPLIT_PHYSICAL 0x0 From e5e45bbcf57c943ea7c4c7f0ce51795cd469de82 Mon Sep 17 00:00:00 2001 From: Papa Cancer Date: Tue, 16 Apr 2019 14:01:48 +0100 Subject: [PATCH 352/667] Throat Chop Added strings that show when Throat Chop prevents move usage. Added extra string (not present in games) to show when it ends as there is no indication otherwise. Fixed Embargo's string as well. --- data/battle_scripts_1.s | 28 ++++++++- include/battle.h | 2 + include/battle_scripts.h | 4 ++ include/constants/battle.h | 2 + include/constants/battle_move_effects.h | 3 + include/constants/battle_string_ids.h | 5 +- src/battle_main.c | 1 + src/battle_message.c | 7 ++- src/battle_script_commands.c | 4 ++ src/battle_util.c | 83 ++++++++++++++++++------- src/data/battle_moves.h | 2 +- 11 files changed, 115 insertions(+), 26 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index d986dec8cc..511299a11d 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -347,6 +347,9 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectVCreate .4byte BattleScript_EffectMatBlock .4byte BattleScript_EffectStompingTantrum + .4byte BattleScript_EffectPlaceholder + .4byte BattleScript_EffectPlaceholder + .4byte BattleScript_EffectThroatChop BattleScript_EffectVCreate: setmoveeffect MOVE_EFFECT_V_CREATE | MOVE_EFFECT_AFFECTS_USER @@ -1673,7 +1676,12 @@ BattleScript_EffectHealBlock: 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 @@ -5379,7 +5387,25 @@ BattleScript_MoveUsedIsTaunted:: 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_SelectingNotAllowedMoveGravity:: printselectionstring STRINGID_GRAVITYPREVENTSUSAGE endselectionscript diff --git a/include/battle.h b/include/battle.h index 8e74501a15..c6cf49fc25 100644 --- a/include/battle.h +++ b/include/battle.h @@ -111,6 +111,7 @@ struct DisableStruct u8 telekinesisTimer; u8 healBlockTimer; u8 laserFocusTimer; + u8 throatChopTimer; u8 usedMoves:4; u8 wrapTurns; }; @@ -143,6 +144,7 @@ struct ProtectStruct u32 usedHealBlockedMove:1; u32 usedGravityPreventedMove:1; u32 powderSelfDmg:1; + u32 usedThroatChopPreventedMove:1; u32 physicalDmg; u32 specialDmg; u8 physicalBattlerId; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 1f66b160b4..e80dcbba6a 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -302,5 +302,9 @@ extern const u8 BattleScript_VCreateStatLoss[]; extern const u8 BattleScript_SpikyShieldEffect[]; extern const u8 BattleScript_FlowerVeilProtectsRet[]; extern const u8 BattleScript_SweetVeilProtectsRet[]; +extern const u8 BattleScript_SelectingNotAllowedMoveThroatChop[]; +extern const u8 BattleScript_MoveUsedIsThroatChopPrevented[]; +extern const u8 BattleScript_SelectingNotAllowedMoveThroatChopInPalace[]; +extern const u8 BattleScript_ThroatChopEndTurn[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle.h b/include/constants/battle.h index 7d34f831f3..3761a5d875 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -328,6 +328,8 @@ #define MOVE_EFFECT_SPECTRAL_THIEF 0x3F #define MOVE_EFFECT_V_CREATE 0x40 #define MOVE_EFFECT_HAPPY_HOUR 0x41 + +#define MOVE_EFFECT_THROAT_CHOP 0x43 #define MOVE_EFFECT_AFFECTS_USER 0x4000 #define MOVE_EFFECT_CERTAIN 0x8000 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 7a11f9b14f..a250decd6f 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -336,4 +336,7 @@ #define EFFECT_MAT_BLOCK 330 #define EFFECT_STOMPING_TANTRUM 331 + +#define EFFECT_THROAT_CHOP 334 + #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 5114102f7c..b4a408ca2d 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -529,6 +529,9 @@ #define STRINGID_AROMAVEILPROTECTED 525 #define STRINGID_CELEBRATEMESSAGE 526 -#define BATTLESTRINGS_COUNT 529 +#define STRINGID_THROATCHOPENDS 528 +#define STRINGID_PKMNCANTUSEMOVETHROATCHOP 529 + +#define BATTLESTRINGS_COUNT 530 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_main.c b/src/battle_main.c index 695be6470d..bca4f26a7e 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3113,6 +3113,7 @@ void FaintClearSetData(void) gProtectStructs[gActiveBattler].usedHealBlockedMove = 0; gProtectStructs[gActiveBattler].usesBouncedMove = 0; gProtectStructs[gActiveBattler].usedGravityPreventedMove = 0; + gProtectStructs[gActiveBattler].usedThroatChopPreventedMove = 0; gDisableStructs[gActiveBattler].isFirstTurn = 2; diff --git a/src/battle_message.c b/src/battle_message.c index d6dc13ef4b..0694d22e52 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -261,6 +261,7 @@ static const u8 sText_PkmnMoveIsDisabled[] = _("{B_ACTIVE_NAME_WITH_PREFIX}'s {B 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}!"); @@ -558,9 +559,10 @@ static const u8 sText_FreedFromSkyDrop[] =_("{B_DEF_NAME_WITH_PREFIX} was freed\ 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} recieved {B_LAST_ITEM}\nfrom {B_ATK_NAME_WITH_PREFIX}"); -static const u8 sText_EmbargoEnds[] = _("{B_DEF_NAME_WITH_PREFIX}can\nuse items again!"); +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!"); @@ -656,6 +658,9 @@ static const u8 sText_CelebrateMessage[] = _("Congratulations, {B_PLAYER_NAME}!" const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_THROATCHOPENDS - 12] = sText_ThroatChopEnds, + [STRINGID_PKMNCANTUSEMOVETHROATCHOP - 12] = sText_PkmnCantUseMoveThroatChop, + [STRINGID_CELEBRATEMESSAGE - 12] = sText_CelebrateMessage, [STRINGID_AROMAVEILPROTECTED - 12] = sText_AromaVeilProtected, [STRINGID_SWEETVEILPROTECTED - 12] = sText_SweetVeilProtected, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index eac5a24bb2..b0ed189bd8 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2809,6 +2809,10 @@ void SetMoveEffect(bool32 primary, u32 certain) BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_VCreateStatLoss; break; + case MOVE_EFFECT_THROAT_CHOP: + gDisableStructs[gEffectBattler].throatChopTimer = 2; + gBattlescriptCurrInstr++; + break; } } } diff --git a/src/battle_util.c b/src/battle_util.c index 024a122023..aa6a7efc8a 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -468,7 +468,8 @@ bool8 WasUnableToUseMove(u8 battler) || gProtectStructs[battler].flag2Unknown || gProtectStructs[battler].flinchImmobility || gProtectStructs[battler].confusionSelfDmg - || gProtectStructs[battler].powderSelfDmg) + || gProtectStructs[battler].powderSelfDmg + || gProtectStructs[battler].usedThroatChopPreventedMove) return TRUE; else return FALSE; @@ -679,6 +680,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; @@ -819,6 +835,8 @@ u8 CheckMoveLimitations(u8 battlerId, u8 unusableMoves, u8 check) 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; } @@ -1346,6 +1364,7 @@ enum ENDTURN_ROOST, ENDTURN_ELECTRIFY, ENDTURN_POWDER, + ENDTURN_THROAT_CHOP, ENDTURN_BATTLER_COUNT }; @@ -1786,6 +1805,14 @@ u8 DoBattlerEndTurnEffects(void) 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_BATTLER_COUNT: // done gBattleStruct->turnEffectsTracker = 0; gBattleStruct->turnEffectsBattlerId++; @@ -1995,27 +2022,28 @@ void TryClearRageAndFuryCutter(void) enum { - CANCELLER_FLAGS, - CANCELLER_ASLEEP, - CANCELLER_FROZEN, - CANCELLER_TRUANT, - CANCELLER_RECHARGE, - CANCELLER_FLINCH, - CANCELLER_DISABLED, - CANCELLER_GRAVITY, - CANCELLER_HEAL_BLOCKED, - CANCELLER_TAUNTED, - CANCELLER_IMPRISONED, - CANCELLER_CONFUSED, - CANCELLER_PARALYSED, - CANCELLER_IN_LOVE, - CANCELLER_BIDE, - CANCELLER_THAW, - CANCELLER_POWDER_MOVE, - CANCELLER_POWDER_STATUS, - CANCELLER_END, - CANCELLER_PSYCHIC_TERRAIN, - CANCELLER_END2, + CANCELLER_FLAGS, + CANCELLER_ASLEEP, + CANCELLER_FROZEN, + CANCELLER_TRUANT, + CANCELLER_RECHARGE, + CANCELLER_FLINCH, + CANCELLER_DISABLED, + CANCELLER_GRAVITY, + CANCELLER_HEAL_BLOCKED, + CANCELLER_TAUNTED, + CANCELLER_IMPRISONED, + CANCELLER_CONFUSED, + CANCELLER_PARALYSED, + 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) @@ -2337,6 +2365,17 @@ u8 AtkCanceller_UnableToUseMove(void) } 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; } diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 5d89e7027c..fe3b7cbc31 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -8956,7 +8956,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_THROAT_CHOP] = { - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_THROAT_CHOP, .power = 80, .type = TYPE_DARK, .accuracy = 100, From 754befe39397e1d36691a6d802e45b4eb0757722 Mon Sep 17 00:00:00 2001 From: Papa Cancer Date: Mon, 15 Apr 2019 12:02:25 +0100 Subject: [PATCH 353/667] Baneful Bunker + King's Shield Both apply a move effect from atk49. King's Shield swaps attacker and defender for the sake of Defiant etc. and then swaps them back! --- data/battle_scripts_1.s | 18 ++++++++++ include/battle_scripts.h | 2 ++ include/constants/battle_script_commands.h | 2 +- src/battle_message.c | 2 +- src/battle_script_commands.c | 42 +++++++++++++++------- src/battle_util.c | 5 +++ 6 files changed, 57 insertions(+), 14 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index d986dec8cc..e2fe6b356f 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6416,6 +6416,7 @@ BattleScript_RoughSkinActivates:: BattleScript_SpikyShieldEffect:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER printstring STRINGID_PKMNHURTSWITH @@ -6423,6 +6424,23 @@ BattleScript_SpikyShieldEffect:: 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 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 1f66b160b4..a4e51b076d 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -300,6 +300,8 @@ extern const u8 BattleScript_PowderMoveNoEffect[]; extern const u8 BattleScript_GrassyTerrainLoop[]; 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[]; diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 681838f76f..334b4b349f 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -162,7 +162,7 @@ #define ATK48_DONT_CHECK_LOWER 0x8 // atk49, moveend cases -#define ATK49_SPIKY_SHIELD 0 +#define ATK49_PROTECT_LIKE_EFFECT 0 #define ATK49_RAGE 1 #define ATK49_DEFROST 2 #define ATK49_SYNCHRONIZE_TARGET 3 diff --git a/src/battle_message.c b/src/battle_message.c index d6dc13ef4b..6a3c63ac79 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -87,7 +87,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!"); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index eac5a24bb2..9cb47e5d9d 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4214,19 +4214,37 @@ static void atk49_moveend(void) { switch (gBattleScripting.atk49_state) { - case ATK49_SPIKY_SHIELD: - if (gProtectStructs[gBattlerTarget].spikyShielded - && gBattleMoves[gCurrentMove].flags & FLAG_MAKES_CONTACT - && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) + case ATK49_PROTECT_LIKE_EFFECT: + if (gBattleMoves[gCurrentMove].flags & FLAG_MAKES_CONTACT) { - gMoveResultFlags &= ~(MOVE_RESULT_NO_EFFECT); - gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 8; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_SPIKY_SHIELD); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SpikyShieldEffect; - effect = 1; + 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 = 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.atk49_state++; break; diff --git a/src/battle_util.c b/src/battle_util.c index 024a122023..ae0f7dd3f8 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3275,6 +3275,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gBattleScripting.moveEffect += MOVE_EFFECT_AFFECTS_USER; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; + PREPARE_ABILITY_BUFFER(gBattleTextBuff1, ABILITY_EFFECT_SPORE); gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; effect++; } @@ -3288,6 +3289,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && (Random() % 3) == 0) { gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_POISON; + PREPARE_ABILITY_BUFFER(gBattleTextBuff1, ABILITY_POISON_POINT); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; @@ -5629,6 +5631,9 @@ static inline void MulByTypeEffectiveness(u16 *modifier, u16 move, u8 moveType, mod = UQ_4_12(2.0); if (moveType == TYPE_GROUND && defType == TYPE_FLYING && IsBattlerGrounded(battlerDef)) mod = UQ_4_12(1.0); + + if (gProtectStructs[battlerDef].kingsShielded && gBattleMoves[move].effect != EFFECT_FEINT) + mod = UQ_4_12(1.0); MulModifier(modifier, mod); } From e310d0f10eecb6e1405506986225cb84f1aaa5ce Mon Sep 17 00:00:00 2001 From: Papa Cancer Date: Mon, 15 Apr 2019 15:55:37 +0100 Subject: [PATCH 354/667] Core Enforcer New code - uses Gastro Acid script instead through own move effect --- data/battle_scripts_1.s | 12 ++++++++++++ include/battle_scripts.h | 1 + include/constants/battle.h | 1 + include/constants/battle_move_effects.h | 1 + src/battle_script_commands.c | 7 +++++++ src/data/battle_moves.h | 2 +- 6 files changed, 23 insertions(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index d986dec8cc..e39f94be4a 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -347,6 +347,18 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectVCreate .4byte BattleScript_EffectMatBlock .4byte BattleScript_EffectStompingTantrum + .4byte BattleScript_EffectCoreEnforcer + +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_EffectVCreate: setmoveeffect MOVE_EFFECT_V_CREATE | MOVE_EFFECT_AFFECTS_USER diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 1f66b160b4..286ebe26e5 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -302,5 +302,6 @@ extern const u8 BattleScript_VCreateStatLoss[]; extern const u8 BattleScript_SpikyShieldEffect[]; extern const u8 BattleScript_FlowerVeilProtectsRet[]; extern const u8 BattleScript_SweetVeilProtectsRet[]; +extern const u8 BattleScript_MoveEffectCoreEnforcer[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle.h b/include/constants/battle.h index 7d34f831f3..b97b7b769d 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -328,6 +328,7 @@ #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_AFFECTS_USER 0x4000 #define MOVE_EFFECT_CERTAIN 0x8000 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 7a11f9b14f..95d370fae2 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -335,5 +335,6 @@ #define EFFECT_V_CREATE 329 #define EFFECT_MAT_BLOCK 330 #define EFFECT_STOMPING_TANTRUM 331 +#define EFFECT_CORE_ENFORCER 332 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index eac5a24bb2..300a35841a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2809,6 +2809,13 @@ void SetMoveEffect(bool32 primary, u32 certain) BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_VCreateStatLoss; break; + case MOVE_EFFECT_CORE_ENFORCER: + if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectCoreEnforcer; + } + break; } } } diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 5d89e7027c..f3be9925b1 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -9124,7 +9124,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_CORE_ENFORCER] = { - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_CORE_ENFORCER, .power = 100, .type = TYPE_DRAGON, .accuracy = 100, From 7e992724829aba19b70a36376c48f3f0d1e951f0 Mon Sep 17 00:00:00 2001 From: Papa Cancer Date: Sat, 20 Apr 2019 20:02:52 +0100 Subject: [PATCH 355/667] Laser Focus Re-PR'd due to excess "merges" --- data/battle_scripts_1.s | 12 ++++++++++++ include/constants/battle_move_effects.h | 3 +-- include/constants/battle_string_ids.h | 2 +- src/battle_message.c | 3 ++- src/battle_script_commands.c | 4 +++- src/data/battle_moves.h | 2 +- 6 files changed, 20 insertions(+), 6 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 852150a637..73e772148d 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -349,6 +349,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectStompingTantrum .4byte BattleScript_EffectCoreEnforcer .4byte BattleScript_EffectThroatChop + .4byte BattleScript_EffectLaserFocus BattleScript_EffectCoreEnforcer: setmoveeffect MOVE_EFFECT_CORE_ENFORCER | MOVE_EFFECT_CERTAIN @@ -361,6 +362,17 @@ BattleScript_MoveEffectCoreEnforcer:: 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 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 7da5079f3a..39f11694cb 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -336,8 +336,7 @@ #define EFFECT_MAT_BLOCK 330 #define EFFECT_STOMPING_TANTRUM 331 #define EFFECT_CORE_ENFORCER 332 - - #define EFFECT_THROAT_CHOP 334 +#define EFFECT_LASER_FOCUS 335 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index b4a408ca2d..3326800c91 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -528,9 +528,9 @@ #define STRINGID_SWEETVEILPROTECTED 524 #define STRINGID_AROMAVEILPROTECTED 525 #define STRINGID_CELEBRATEMESSAGE 526 - #define STRINGID_THROATCHOPENDS 528 #define STRINGID_PKMNCANTUSEMOVETHROATCHOP 529 +#define STRINGID_LASERFOCUS 530 #define BATTLESTRINGS_COUNT 530 diff --git a/src/battle_message.c b/src/battle_message.c index 055f1ff668..d96488ca96 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -655,12 +655,13 @@ static const u8 sText_FlowerVeilProtected[] = _("{B_DEF_NAME_WITH_PREFIX} surrou 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_LaserFocusMessage[] = _("{B_ATK_NAME_WITH_PREFIX}\nconcentrated intensely!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_LASERFOCUS - 12] = sText_LaserFocusMessage, [STRINGID_THROATCHOPENDS - 12] = sText_ThroatChopEnds, [STRINGID_PKMNCANTUSEMOVETHROATCHOP - 12] = sText_PkmnCantUseMoveThroatChop, - [STRINGID_CELEBRATEMESSAGE - 12] = sText_CelebrateMessage, [STRINGID_AROMAVEILPROTECTED - 12] = sText_AromaVeilProtected, [STRINGID_SWEETVEILPROTECTED - 12] = sText_SweetVeilProtected, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b066c19d5a..ea3e899206 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10416,8 +10416,10 @@ static void atkDD_setuserstatus3(void) else { gStatuses3[gBattlerAttacker] |= flags; - if (flags == STATUS3_MAGNET_RISE) + if (flags & STATUS3_MAGNET_RISE) gDisableStructs[gBattlerAttacker].magnetRiseTimer = 5; + if (flags & STATUS3_LASER_FOCUS) + gDisableStructs[gBattlerAttacker].laserFocusTimer = 2; gBattlescriptCurrInstr += 9; } } diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index e692255e63..6277a102ea 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -8928,7 +8928,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_LASER_FOCUS] = { - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_LASER_FOCUS, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, From b50007e86189f0da6f2c8bba6e7a609d26f34a8d Mon Sep 17 00:00:00 2001 From: Papa Cancer Date: Sat, 20 Apr 2019 20:11:49 +0100 Subject: [PATCH 356/667] Instruct Re-PR'd due to excess "merges" --- asm/macros/battle_script.inc | 5 ++ data/battle_scripts_1.s | 15 +++++ include/battle.h | 2 + include/constants/battle_move_effects.h | 1 + include/constants/battle_script_commands.h | 1 + include/constants/battle_string_ids.h | 1 + src/battle_message.c | 2 + src/battle_script_commands.c | 67 ++++++++++++++++++++++ src/data/battle_moves.h | 2 +- 9 files changed, 95 insertions(+), 1 deletion(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index f6811b9c02..b6d498982d 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1644,6 +1644,11 @@ .4byte \ptr .endm + .macro tryinstruct ptr:req + various BS_ATTACKER, VARIOUS_TRY_INSTRUCT + .4byte \ptr + .endm + @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 73e772148d..14e0c58f3f 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -348,6 +348,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectMatBlock .4byte BattleScript_EffectStompingTantrum .4byte BattleScript_EffectCoreEnforcer + .4byte BattleScript_EffectInstruct .4byte BattleScript_EffectThroatChop .4byte BattleScript_EffectLaserFocus @@ -787,6 +788,20 @@ BattleScript_EffectCopycat: 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_EffectAutonomize: setstatchanger STAT_SPEED, 2, FALSE diff --git a/include/battle.h b/include/battle.h index c6cf49fc25..594adb8884 100644 --- a/include/battle.h +++ b/include/battle.h @@ -165,6 +165,7 @@ struct SpecialStatus u8 sturdied:1; u8 stormDrainRedirected:1; u8 switchInAbilityDone:1; + u8 instructedChosenTarget:3; s32 dmg; s32 physicalDmg; s32 specialDmg; @@ -516,6 +517,7 @@ struct BattleStruct 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. }; diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 39f11694cb..1af103fc83 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -336,6 +336,7 @@ #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 diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 334b4b349f..683f3ea372 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -139,6 +139,7 @@ #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 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 3326800c91..ad740bc6d2 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -528,6 +528,7 @@ #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 diff --git a/src/battle_message.c b/src/battle_message.c index d96488ca96..e633b73317 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -655,6 +655,7 @@ static const u8 sText_FlowerVeilProtected[] = _("{B_DEF_NAME_WITH_PREFIX} surrou 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!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = @@ -662,6 +663,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [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, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ea3e899206..86ca273e6d 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -738,6 +738,7 @@ static const u16 sProtectSuccessRates[] = {USHRT_MAX, USHRT_MAX / 2, USHRT_MAX / #define METRONOME_FORBIDDEN_END 0xFFFF #define ASSIST_FORBIDDEN_END 0xFFFF #define COPYCAT_FORBIDDEN_END 0xFFFF +#define INSTRUCT_FORBIDDEN_END 0xFFFF static const u16 sMovesForbiddenToCopy[] = { @@ -773,6 +774,33 @@ static const u16 sMovesForbiddenToCopy[] = METRONOME_FORBIDDEN_END }; + +static const u16 sMoveEffectsForbiddenToInstruct[] = +{ + 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_PLACEHOLDER, + 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, + INSTRUCT_FORBIDDEN_END +}; + static const u16 sNaturePowerMoves[] = { MOVE_STUN_SPORE, @@ -4408,6 +4436,7 @@ static void atk49_moveend(void) break; case ATK49_UPDATE_LAST_MOVES: gDisableStructs[gBattlerAttacker].usedMoves |= gBitTable[gCurrMovePos]; + gBattleStruct->lastMoveTarget[gBattlerAttacker] = gBattlerTarget; if (gMoveResultFlags & (MOVE_RESULT_FAILED | MOVE_RESULT_DOESNT_AFFECT_FOE)) gBattleStruct->lastMoveFailed |= gBitTable[gBattlerAttacker]; else @@ -4517,6 +4546,8 @@ static void atk49_moveend(void) gBattleScripting.atk49_state++; break; case ATK49_CLEAR_BITS: // Clear bits active just while using a move. + if (gSpecialStatuses[gBattlerAttacker].instructedChosenTarget) + *(gBattleStruct->moveTarget + gBattlerAttacker) = gSpecialStatuses[gBattlerAttacker].instructedChosenTarget & 0x3; gProtectStructs[gBattlerAttacker].usesBouncedMove = 0; gBattleStruct->ateBoost[gBattlerAttacker] = 0; gStatuses3[gBattlerAttacker] &= ~(STATUS3_ME_FIRST); @@ -7118,6 +7149,42 @@ static void atk76_various(void) gBattlescriptCurrInstr += 7; } return; + case VARIOUS_TRY_INSTRUCT: + for (i = 0; sMoveEffectsForbiddenToInstruct[i] != INSTRUCT_FORBIDDEN_END; i++) + { + if (sMoveEffectsForbiddenToInstruct[i] == gBattleMoves[gLastMoves[gBattlerTarget]].effect) + break; + } + if (gLastMoves[gBattlerTarget] == 0 || gLastMoves[gBattlerTarget] == 0xFFFF || sMoveEffectsForbiddenToInstruct[i] != INSTRUCT_FORBIDDEN_END + || gLastMoves[gBattlerTarget] == MOVE_STRUGGLE || gLastMoves[gBattlerTarget] == MOVE_KING_S_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; diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 6277a102ea..85e3cfd068 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -9152,7 +9152,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_INSTRUCT] = { - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_INSTRUCT, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, From 3cde800bd0974ff676689c2014ca3188ca3d1fda Mon Sep 17 00:00:00 2001 From: Papa Cancer Date: Sat, 20 Apr 2019 20:17:56 +0100 Subject: [PATCH 357/667] Magnetic Flux + Gear Up Both have the same effect so they're in one commit. Uses custom script to check both user and partner for stats and abilities. Magnetic Flux uses Charge animation. --- asm/macros/battle_script.inc | 9 +++ data/battle_anim_scripts.s | 4 +- data/battle_scripts_1.s | 80 +++++++++++++++++++++++++ include/constants/battle_move_effects.h | 2 + src/data/battle_moves.h | 6 +- 5 files changed, 95 insertions(+), 6 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index b6d498982d..3dfba0dc21 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1749,3 +1749,12 @@ 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 + diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 6cbee2044d..54d9e41289 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -2825,9 +2825,6 @@ Move_POWDER: Move_GEOMANCY: end -Move_MAGNETIC_FLUX: - end - Move_HAPPY_HOUR: end @@ -6035,6 +6032,7 @@ Move_FOLLOW_ME: loopsewithpan SE_W039, SOUND_PAN_ATTACKER, 22, 3 end +Move_MAGNETIC_FLUX: Move_CHARGE: loadspritegfx ANIM_TAG_ELECTRIC_ORBS loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 14e0c58f3f..e190bfc749 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -351,6 +351,8 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectInstruct .4byte BattleScript_EffectThroatChop .4byte BattleScript_EffectLaserFocus + .4byte BattleScript_EffectMagneticFlux + .4byte BattleScript_EffectGearUp BattleScript_EffectCoreEnforcer: setmoveeffect MOVE_EFFECT_CORE_ENFORCER | MOVE_EFFECT_CERTAIN @@ -500,6 +502,84 @@ BattleScript_AromaticMistAnim: 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_CHANGE_BS_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_CHANGE_BS_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_CHANGE_BS_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_CHANGE_BS_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 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 1af103fc83..4d8b8b222b 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -339,5 +339,7 @@ #define EFFECT_INSTRUCT 333 #define EFFECT_THROAT_CHOP 334 #define EFFECT_LASER_FOCUS 335 +#define EFFECT_MAGNETIC_FLUX 336 +#define EFFECT_GEAR_UP 337 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 85e3cfd068..dec05ad6c0 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -8450,7 +8450,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_MAGNETIC_FLUX] = { - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_MAGNETIC_FLUX, .power = 0, .type = TYPE_ELECTRIC, .accuracy = 0, @@ -8942,13 +8942,13 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_GEAR_UP] = { - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_GEAR_UP, .power = 0, .type = TYPE_STEEL, .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, - .target = MOVE_TARGET_SELECTED, + .target = MOVE_TARGET_USER, .priority = 0, .flags = FLAG_SNATCH_AFFECTED, .split = SPLIT_STATUS, From d0f91a996dbe0d5f68b13ebb0b8deb7fb87370b5 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 2 May 2019 23:10:01 +0200 Subject: [PATCH 358/667] Tweak up mega evo --- asm/macros/battle_script.inc | 3 +- data/battle_anim_scripts.s | 6 +- data/battle_scripts_1.s | 5 +- graphics/battle_interface/mega_indicator.png | Bin 0 -> 365 bytes include/battle_gfx_sfx_util.h | 2 +- include/battle_interface.h | 4 + src/battle_anim_effects_3.c | 6 +- src/battle_gfx_sfx_util.c | 11 +- src/battle_interface.c | 165 +++++++++++++++++-- src/battle_main.c | 25 +-- src/battle_script_commands.c | 74 +++++---- src/data/items.h | 1 + src/data/pokemon/evolution.h | 1 + 13 files changed, 236 insertions(+), 67 deletions(-) create mode 100644 graphics/battle_interface/mega_indicator.png diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 3dfba0dc21..a4b64334e6 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1525,8 +1525,9 @@ .4byte \ptr .endm - .macro handlemegaevo battler:req + .macro handlemegaevo battler:req, case:req various \battler, VARIOUS_HANDLE_MEGA_EVO + .byte \case .endm .macro jumpifcantuselastresort battler:req, ptr:req diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 377614ee0d..1ef54a202b 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -10734,7 +10734,7 @@ Move_TRANSFORM: monbg ANIM_ATTACKER playsewithpan SE_W100, SOUND_PAN_ATTACKER waitplaysewithpan SE_W107, SOUND_PAN_ATTACKER, 48 - createvisualtask sub_815B7D0, 2, 0 + createvisualtask sub_815B7D0, 2, 0, 0 waitforvisualfinish clearmonbg ANIM_ATTACKER end @@ -12772,7 +12772,7 @@ AnimScript_82D7EB2: monbg ANIM_ATTACKER playsewithpan SE_W100, SOUND_PAN_ATTACKER waitplaysewithpan SE_W107, SOUND_PAN_ATTACKER, 48 - createvisualtask sub_815B7D0, 2, 1 + createvisualtask sub_815B7D0, 2, 1, 0 waitforvisualfinish clearmonbg ANIM_ATTACKER end @@ -13153,7 +13153,7 @@ General_MegaEvolution: createsprite gBattleAnimSpriteTemplate_85972D8, ANIM_ATTACKER, 2, 4, 1, 180, 1 createvisualtask sub_8159244, 5, 234, 0 delay 20 - createvisualtask sub_815B7D0, 2, 0 + createvisualtask sub_815B7D0, 2, 0, 1 delay 4 createvisualtask sub_8117494, 50 waitforvisualfinish diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e190bfc749..3fff8417a0 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5726,9 +5726,12 @@ BattleScript_FocusPunchSetUp:: BattleScript_MegaEvolution:: printstring STRINGID_MEGAEVOREACTING waitmessage 0x40 - handlemegaevo BS_ATTACKER + 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 end2 diff --git a/graphics/battle_interface/mega_indicator.png b/graphics/battle_interface/mega_indicator.png new file mode 100644 index 0000000000000000000000000000000000000000..93e113ded4efb535746dab44eeeb83f9210b0d65 GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFW?4d=4rGynhpf9;l_IZy**lDE4HU;bVL ze;|jw#M9T6{V^+(m?>Avq5@fbattlerData[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; @@ -932,10 +932,13 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool8 notTransform 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 1d70b68051..6b59e2cc20 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -186,6 +186,7 @@ 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); @@ -548,6 +549,47 @@ static const struct SpriteTemplate sSpriteTemplate_MegaTrigger = .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 = 0, + .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 // Because the healthbox is too large to fit into one sprite, it is divided into two sprites. @@ -649,6 +691,10 @@ u8 CreateBattlerHealthboxSprites(u8 battlerId) healthBarSpritePtr->hBar_Data6 = data6; healthBarSpritePtr->invisible = TRUE; + // Create mega indicator sprite if is a mega evolved mon. + if (gBattleStruct->mega.alreadyEvolved[GetBattlerPosition(battlerId)]) + CreateMegaIndicatorSprite(battlerId, 0); + return healthboxLeftSpriteId; } @@ -706,12 +752,19 @@ static void SpriteCB_HealthBar(struct Sprite *sprite) static void SpriteCB_HealthBoxOther(struct Sprite *sprite) { u8 healthboxMainSpriteId = sprite->hOther_HealthBoxSpriteId; + u8 megaSpriteId = gBattleStruct->mega.indicatorSpriteIds[gSprites[healthboxMainSpriteId].hMain_Battler]; 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) @@ -725,6 +778,7 @@ void SetBattleBarStruct(u8 battlerId, u8 healthboxSpriteId, s32 maxVal, s32 oldV void SetHealthboxSpriteInvisible(u8 healthboxSpriteId) { + DestroyMegaIndicatorSprite(gSprites[healthboxSpriteId].hMain_Battler); gSprites[healthboxSpriteId].invisible = TRUE; gSprites[gSprites[healthboxSpriteId].hMain_HealthBarSpriteId].invisible = TRUE; gSprites[gSprites[healthboxSpriteId].oam.affineParam].invisible = TRUE; @@ -745,6 +799,7 @@ static void UpdateSpritePos(u8 spriteId, s16 x, s16 y) void DestoryHealthboxSprite(u8 healthboxSpriteId) { + DestroyMegaIndicatorSprite(gSprites[healthboxSpriteId].hMain_Battler); DestroySprite(&gSprites[gSprites[healthboxSpriteId].oam.affineParam]); DestroySprite(&gSprites[gSprites[healthboxSpriteId].hMain_HealthBarSpriteId]); DestroySprite(&gSprites[healthboxSpriteId]); @@ -771,36 +826,42 @@ void UpdateOamPriorityInAllHealthboxes(u8 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); } @@ -811,11 +872,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.alreadyEvolved[GetBattlerPosition(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--; @@ -828,7 +899,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()) @@ -1266,6 +1337,76 @@ void DestroyMegaTriggerSprite(void) gBattleStruct->mega.triggerSpriteId = 0xFF; } +static const s8 sIndicatorPosSingles[][2] = +{ + [B_POSITION_PLAYER_LEFT] = {42, -7}, + [B_POSITION_OPPONENT_LEFT] = {10, 10}, +}; + +static const s8 sIndicatorPosDoubles[][2] = +{ + [B_POSITION_PLAYER_LEFT] = {53, -8}, + [B_POSITION_OPPONENT_LEFT] = {10, 10}, + [B_POSITION_PLAYER_RIGHT] = {10, 10}, + [B_POSITION_OPPONENT_RIGHT] = {10, 10}, +}; + +void CreateMegaIndicatorSprite(u32 battlerId, u32 which) +{ + u8 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); + gBattleStruct->mega.indicatorSpriteIds[battlerId] = spriteId; + + gSprites[spriteId].tBattler = battlerId; +} + +void DestroyMegaIndicatorSprite(u8 battlerId) +{ + u32 i; + + if (gBattleStruct->mega.indicatorSpriteIds[battlerId] != 0xFF) + { + if (gBattleStruct->mega.indicatorSpriteIds[battlerId] != 0) // If called before initialized to 0xFF. + DestroySprite(&gSprites[gBattleStruct->mega.indicatorSpriteIds[battlerId]]); + gBattleStruct->mega.indicatorSpriteIds[battlerId] = 0xFF; + } + + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { + if (gBattleStruct->mega.indicatorSpriteIds[i] != 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) +{ + if (gBattleStruct->mega.indicatorSpriteIds[sprite->tBattler] == 0xFF) + DestroySprite(sprite); +} + #undef tBattler #undef tHide diff --git a/src/battle_main.c b/src/battle_main.c index bca4f26a7e..6b97aff4b2 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -2723,11 +2723,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) { @@ -2766,6 +2766,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; } @@ -2800,15 +2801,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 = gBattleStruct->mega.indicatorSpriteIds[sprite->sBattler]; + if (sprite->sWhich == BOUNCE_HEALTHBOX && bouncerSpriteId != 0xFF) + gSprites[bouncerSpriteId].pos2.y = y; } #undef sSinIndex diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 86ca273e6d..8e113c3d47 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -776,7 +776,7 @@ static const u16 sMovesForbiddenToCopy[] = static const u16 sMoveEffectsForbiddenToInstruct[] = -{ +{ EFFECT_ASSIST, //EFFECT_BEAK_BLAST, EFFECT_BIDE, @@ -4010,6 +4010,7 @@ static void atk45_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_SUBSTITUTE_FADE) { BtlController_EmitBattleAnimation(0, gBattlescriptCurrInstr[2], *argumentPtr); @@ -4053,6 +4054,7 @@ static void atk46_playanimation2(void) // animation Id is stored in the first po if (*animationIdPtr == B_ANIM_STATS_CHANGE || *animationIdPtr == B_ANIM_SNATCH_MOVE + || *animationIdPtr == B_ANIM_MEGA_EVOLUTION || *animationIdPtr == B_ANIM_SUBSTITUTE_FADE) { BtlController_EmitBattleAnimation(0, *animationIdPtr, *argumentPtr); @@ -7041,37 +7043,49 @@ static void atk76_various(void) else mon = &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]; - 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)))) + // Change species. + if (gBattlescriptCurrInstr[3] == 0) { - gBattleStruct->mega.playerEvolvedSpecies = gBattleStruct->mega.evolvedSpecies[gActiveBattler]; + 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) + { + CalculateMonStats(mon); + gBattleMons[gActiveBattler].level = GetMonData(mon, MON_DATA_LEVEL); + gBattleMons[gActiveBattler].hp = GetMonData(mon, MON_DATA_HP); + gBattleMons[gActiveBattler].maxHP = GetMonData(mon, MON_DATA_MAX_HP); + gBattleMons[gActiveBattler].attack = GetMonData(mon, MON_DATA_ATK); + gBattleMons[gActiveBattler].defense = GetMonData(mon, MON_DATA_DEF); + gBattleMons[gActiveBattler].speed = GetMonData(mon, MON_DATA_SPEED); + gBattleMons[gActiveBattler].spAttack = GetMonData(mon, MON_DATA_SPATK); + gBattleMons[gActiveBattler].spDefense = GetMonData(mon, MON_DATA_SPDEF); + gBattleMons[gActiveBattler].ability = GetMonAbility(mon); + gBattleMons[gActiveBattler].type1 = gBaseStats[gBattleMons[gActiveBattler].species].type1; + gBattleMons[gActiveBattler].type2 = gBaseStats[gBattleMons[gActiveBattler].species].type2; - gBattleMons[gActiveBattler].species = GetMegaEvolutionSpecies(gBattleStruct->mega.evolvedSpecies[gActiveBattler], gBattleMons[gActiveBattler].item); - SetMonData(mon, MON_DATA_SPECIES, &gBattleMons[gActiveBattler].species); - PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gActiveBattler].species); - - CalculateMonStats(mon); - gBattleMons[gActiveBattler].level = GetMonData(mon, MON_DATA_LEVEL); - gBattleMons[gActiveBattler].hp = GetMonData(mon, MON_DATA_HP); - gBattleMons[gActiveBattler].maxHP = GetMonData(mon, MON_DATA_MAX_HP); - gBattleMons[gActiveBattler].attack = GetMonData(mon, MON_DATA_ATK); - gBattleMons[gActiveBattler].defense = GetMonData(mon, MON_DATA_DEF); - gBattleMons[gActiveBattler].speed = GetMonData(mon, MON_DATA_SPEED); - gBattleMons[gActiveBattler].spAttack = GetMonData(mon, MON_DATA_SPATK); - gBattleMons[gActiveBattler].spDefense = GetMonData(mon, MON_DATA_SPDEF); - gBattleMons[gActiveBattler].ability = GetMonAbility(mon); - gBattleMons[gActiveBattler].type1 = gBaseStats[gBattleMons[gActiveBattler].species].type1; - gBattleMons[gActiveBattler].type2 = gBaseStats[gBattleMons[gActiveBattler].species].type2; - - UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], mon, HEALTHBOX_ALL); - gBattleStruct->mega.alreadyEvolved[GetBattlerPosition(gActiveBattler)] = TRUE; - gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(gActiveBattler)] |= gBitTable[gBattlerPartyIndexes[gActiveBattler]]; - - BtlController_EmitSetMonData(0, REQUEST_ALL_BATTLE, gBitTable[gBattlerPartyIndexes[gActiveBattler]], sizeof(struct BattlePokemon), &gBattleMons[gActiveBattler]); - MarkBattlerForControllerExec(gActiveBattler); - break; + gBattleStruct->mega.alreadyEvolved[GetBattlerPosition(gActiveBattler)] = TRUE; + gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(gActiveBattler)] |= gBitTable[gBattlerPartyIndexes[gActiveBattler]]; + } + // Update healthbox. + else + { + UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], mon, HEALTHBOX_ALL); + CreateMegaIndicatorSprite(gActiveBattler, 0); + } + gBattlescriptCurrInstr += 4; + return; case VARIOUS_TRY_LAST_RESORT: if (CanUseLastResort(gActiveBattler)) gBattlescriptCurrInstr += 7; @@ -7181,7 +7195,7 @@ static void atk76_various(void) gBattlerTarget = gBattleStruct->lastMoveTarget[gBattlerAttacker]; gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBattler, gBattlerPartyIndexes[gActiveBattler]); - gBattlescriptCurrInstr += 7; + gBattlescriptCurrInstr += 7; } } return; diff --git a/src/data/items.h b/src/data/items.h index 4d262e6833..6d1673ee0a 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -177,6 +177,7 @@ const struct Item gItems[] = .name = _("POTION"), .itemId = ITEM_POTION, .price = 300, + .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 20, .description = sPotionDesc, .pocket = POCKET_ITEMS, diff --git a/src/data/pokemon/evolution.h b/src/data/pokemon/evolution.h index c9b0cf716d..9313753830 100644 --- a/src/data/pokemon/evolution.h +++ b/src/data/pokemon/evolution.h @@ -184,4 +184,5 @@ const struct Evolution gEvolutionTable[NUM_SPECIES][EVOS_PER_MON] = [SPECIES_SHELGON] = {{EVO_LEVEL, 50, SPECIES_SALAMENCE}}, [SPECIES_BELDUM] = {{EVO_LEVEL, 20, SPECIES_METANG}}, [SPECIES_METANG] = {{EVO_LEVEL, 45, SPECIES_METAGROSS}}, + [SPECIES_SKARMORY] = {{EVO_MEGA_EVOLUTION, ITEM_POTION, SPECIES_HO_OH}}, }; From 900c15c20cab42986e7b1b3a5858ee768cef8a44 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 3 May 2019 17:27:49 +0200 Subject: [PATCH 359/667] Mega evo animation --- data/battle_anim_scripts.s | 65 +++++++++++------- .../battle_anims/sprites/mega_particles.png | Bin 0 -> 510 bytes graphics/battle_anims/sprites/mega_stone.png | Bin 0 -> 1051 bytes graphics/battle_anims/sprites/mega_symbol.png | Bin 0 -> 487 bytes include/battle_anim.h | 9 +++ include/constants/battle_anim.h | 3 + include/graphics.h | 6 ++ src/battle_anim.c | 6 ++ src/battle_anim_effects_3.c | 33 +++++++++ src/battle_interface.c | 10 +-- src/ghost.c | 3 +- src/graphics.c | 9 +++ 12 files changed, 113 insertions(+), 31 deletions(-) create mode 100644 graphics/battle_anims/sprites/mega_particles.png create mode 100644 graphics/battle_anims/sprites/mega_stone.png create mode 100644 graphics/battle_anims/sprites/mega_symbol.png diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 1ef54a202b..4744292486 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -13137,32 +13137,49 @@ General_WishHeal: end General_MegaEvolution: - loadspritegfx ANIM_TAG_ORBS - loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT - loadspritegfx ANIM_TAG_METEOR - loadspritegfx ANIM_TAG_FLAT_ROCK - monbg ANIM_ATK_PARTNER - setalpha 12, 8 - createvisualtask sub_8115A04, 2, 2, 1, 4, 0, 11, RGB(31, 31, 11) - playsewithpan SE_W025, -64 - call SolarBeamSetUp1 - waitforvisualfinish - createsprite gUnknown_08595FEC, ANIM_TARGET, 2, 0 - playsewithpan SE_W025, -64 - delay 15 - createsprite gBattleAnimSpriteTemplate_85972D8, ANIM_ATTACKER, 2, 4, 1, 180, 1 - createvisualtask sub_8159244, 5, 234, 0 - delay 20 - createvisualtask sub_815B7D0, 2, 0, 1 - delay 4 - createvisualtask sub_8117494, 50 - waitforvisualfinish - createvisualtask sub_8117494, 2 - playsewithpan SE_W043, -64 - blendoff - clearmonbg ANIM_ATTACKER + loadspritegfx ANIM_TAG_MEGA_STONE + loadspritegfx ANIM_TAG_MEGA_PARTICLES + loadspritegfx ANIM_TAG_MEGA_SYMBOL + monbg ANIM_ATTACKER + setalpha 12, 8 + loopsewithpan SE_W025, SOUND_PAN_ATTACKER, 13, 3 + createvisualtask sub_8115A04, 2, 2, 0, 6, 0, 11, RGB(31, 31, 11) + call MegaEvolutionParticles + call MegaEvolutionParticles + call MegaEvolutionParticles + waitforvisualfinish + playsewithpan SE_W076, SOUND_PAN_ATTACKER + createsprite gMegaStoneSpriteTemplate, ANIM_ATTACKER, 41, 0, 0, 0, 0 + delay 20 + createvisualtask sub_8116664, 5, 5, 2, 0, 16, RGB_WHITEALPHA + waitforvisualfinish + createvisualtask sub_815B7D0, 2, 0, 1 + createvisualtask sub_8116664, 5, 5, 2, 16, 0, RGB_WHITEALPHA + createvisualtask sub_81152DC, 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 diff --git a/graphics/battle_anims/sprites/mega_particles.png b/graphics/battle_anims/sprites/mega_particles.png new file mode 100644 index 0000000000000000000000000000000000000000..6fdf09d96e0d606f5253e5ed18da3c272120e6ce GIT binary patch literal 510 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoQ!VDx|6+TY^QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIi1;V5)EKCOG0EHAg;|it=M#{_S>O>_%)r2R1cVu< zYV%101=&kHeO=k_v+;>Y%TBb>0$R^-!qdeuMB;MkSzAA6Ljjftm4S70^!7P!X%c?J zx+ueSZqwV#8y5LIH!JaLcR5@*^ZAE0>`j^9Cfg`8ALfgA)2R6Tu2V|CBd6-7XF6I< zXE=;s`@AUD;Xm-|NOoDo&iNZcoH&Dx!^FC;kotR)G0UiF^6U!J>Hw}q4M{;9{;^}p4Yc+{(W|*rs(G7+07lj71mug zd;WDF7kn9csjh*UuAxbYp@o%^xs{P6 VL_^=Zwnsn>44$rjF6*2UngE>NybAyT literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/mega_stone.png b/graphics/battle_anims/sprites/mega_stone.png new file mode 100644 index 0000000000000000000000000000000000000000..e3350bbb54366daa5cb6f180682af2146f989ca8 GIT binary patch literal 1051 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|emUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5l#mGU32{waZttU|b7j?< zFPHB8`S#`i|Nq;jOzX)j`SpsM52%JQ$=lt9^+*28<3J8)fk$L90|Va?5N4dJ%_j{M zWH0gbb!ETL#wQ|ea=CAl7Xt&+Yfl%)5Rc=fQ_q&oHV|liYi@8%Judypq^%R3uDdGT zH2=ZKWSKPAWNY01&&r$`GP*ozcJJ;?WXs$f+2?dDuee%-Rm1mj&1?-52DjegZ(5)->BMs(uv&Xo-ysltiE}?M*TARd+LiL7nRidf8@C#DXZBu@wBX6oiJ5XQKJqkJa!=UR@c2Oq+r4vh6d4T@O6Hn`u)JEaz_OutshAo^ zz$U8e+_9XSpUwy| z>+u?wH{jOxzj30Ltn$>Y@+>4EoR$F2llgEFT@!_8{_^8NyKfM*|#r|WnS2U z`S)L*i&46;reS}s+2!c74e^ZjMS@opzyAomVftZ)?IZD!hegtJroXH@>srG3qonjH zr^Ct2Q&PoK*&g#eI30XK$eBsam%F1j-blbns4h_<#yxA|^|L%JTc&ZeEI8cWf56N| zp_huE-s{T58x@ZnT&C!5p&pC z1x2h{R37|&<#JGE&hHO;e4lilsk|>*B3Bp4`PoQ^Ka}y-i-freYJ6|^s{9b@Z(+8m z6BcJ;{2n`pvv+n~aEUO_QmvAUQh^kMk%6Iw zu7Rblp;?HbrIo1(5NR72Ss57YJ?H!$MMG|WN@iLmNQ0@aftjwMNr<6^m65rXsS!j& To6c=Upaup{S3j3^P6NSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAs65i;tHe-G$Ot%YI*Z2 zXHL+RjvWv7T+7+<;KQA5SN{M1uVupa0H}g7$=lt9^W)8>Z-5-m0*}aI1_r((Aj~*b zn@<`j$X?><>&kwgjZcKz@TFSF6rj*XPZ!4!jq|A!H}W+(2)H~yaf@3bc zjeA?Vw|4G~65`o9cm7+`L-#h_-E-zl>i34!pd-nATuY);1FX&_CG@RIWS#JKt8?kI zsUf^)EE_CcY>U=SJfoQOW<}G)ssD<)ymo(lwK&$=EKX?G=1Q?T&WVqWD&)8;ZVR?D zWX#o77j%4nCxrizsMPIydsGrOrS8dlye2@JPxsOV=Ix4p7s6$G>|Px?$+dzdqxawc zFU;*%B`W*0^`8PAuUg_7QIe8al4_M)lnSI6j0_AdbPX(Z4b4IfEv-yVfJocG$jZQA z?>Xo9C>nC}Q!>*kK^jbT4a{^6O+pMUtPBmUOe`T9?$pjy25MmNboFyt=akR{0L(qC Ao&W#< literal 0 HcmV?d00001 diff --git a/include/battle_anim.h b/include/battle_anim.h index 3c216e8fff..75eb7b3a9f 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -224,7 +224,10 @@ void sub_8117854(u8 taskId, int unused, u16 arg2, u8 battler1, u8 arg4, u8 arg5, // battle_anim_effects_1.c void sub_810310C(u8 battler, struct Sprite* sprite); void AnimMoveTwisterParticle(struct Sprite* sprite); +void AnimPowerAbsorptionOrb(struct Sprite* sprite); extern const union AnimCmd *const gUnknown_08592388[]; +extern const union AnimCmd *const gUnknown_085921C8[]; +extern const union AffineAnimCmd *const gUnknown_085921DC[]; void sub_8100898(struct Sprite *); // water.c @@ -238,6 +241,12 @@ void sub_810E044(struct Sprite *sprite); //poison.c extern const union AffineAnimCmd *const gUnknown_085961A0[]; +// ghost.c +void sub_8112B78(struct Sprite *sprite); + +// psychic.c +extern const union AffineAnimCmd *const gUnknown_08596894[]; + // smokescreen.c u8 sub_807521C(s16 x, s16 y, u8 a3); diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index 1678f6f7bd..add0fbbae6 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -300,6 +300,9 @@ #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_MEGA_STONE (ANIM_SPRITES_START + 293) +#define ANIM_TAG_MEGA_SYMBOL (ANIM_SPRITES_START + 294) +#define ANIM_TAG_MEGA_PARTICLES (ANIM_SPRITES_START + 295) // battlers #define ANIM_ATTACKER 0 diff --git a/include/graphics.h b/include/graphics.h index c9100a3563..6bb016480b 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -4949,5 +4949,11 @@ 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[]; #endif //GUARD_GRAPHICS_H diff --git a/src/battle_anim.c b/src/battle_anim.c index 5a36120e2e..7442a04cfc 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -1418,6 +1418,9 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_PurpleJab, 0x0100, ANIM_TAG_PURPLE_JAB}, {gBattleAnimSpriteGfx_Spikes, 0x0080, ANIM_TAG_TOXIC_SPIKES}, {gBattleAnimSpriteGfx_EnergyBall, 0x0200, ANIM_TAG_ENERGY_BALL}, + {gBattleAnimSpriteGfx_MegaStone, 0x800, ANIM_TAG_MEGA_STONE}, + {gBattleAnimSpriteGfx_MegaSymbol, 0x0200, ANIM_TAG_MEGA_SYMBOL}, + {gBattleAnimSpriteGfx_MegaParticles, 0x0180, ANIM_TAG_MEGA_PARTICLES}, }; const struct CompressedSpritePalette gBattleAnimPaletteTable[] = @@ -1715,6 +1718,9 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_PurpleJab, ANIM_TAG_PURPLE_JAB}, {gBattleAnimSpritePal_ToxicSpikes, ANIM_TAG_TOXIC_SPIKES}, {gBattleAnimSpritePal_EnergyBall, ANIM_TAG_ENERGY_BALL}, + {gBattleAnimSpritePal_MegaStone, ANIM_TAG_MEGA_STONE}, + {gBattleAnimSpritePal_MegaSymbol, ANIM_TAG_MEGA_SYMBOL}, + {gBattleAnimSpritePal_MegaParticles, ANIM_TAG_MEGA_PARTICLES}, }; const struct BattleAnimBackground gBattleAnimBackgroundTable[] = diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c index 040438fdf1..116aa6ae71 100755 --- a/src/battle_anim_effects_3.c +++ b/src/battle_anim_effects_3.c @@ -1190,6 +1190,39 @@ const union AffineAnimCmd gSlackOffSquishAffineAnimCmds[] = AFFINEANIMCMD_END, }; +const struct SpriteTemplate gMegaStoneSpriteTemplate = +{ + .tileTag = ANIM_TAG_MEGA_STONE, + .paletteTag = ANIM_TAG_MEGA_STONE, + .oam = &gUnknown_08524AFC, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gUnknown_08596894, + .callback = sub_80A77C8, +}; + +const struct SpriteTemplate gMegaParticlesSpriteTemplate = +{ + .tileTag = ANIM_TAG_MEGA_PARTICLES, + .paletteTag = ANIM_TAG_MEGA_PARTICLES, + .oam = &gUnknown_08524A8C, + .anims = gUnknown_085921C8, + .images = NULL, + .affineAnims = gUnknown_085921DC, + .callback = AnimPowerAbsorptionOrb, +}; + +const struct SpriteTemplate gMegaSymbolSpriteTemplate = +{ + .tileTag = ANIM_TAG_MEGA_SYMBOL, + .paletteTag = ANIM_TAG_MEGA_SYMBOL, + .oam = &gUnknown_08524A34, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_8112B78, +}; + void sub_815A0D4(struct Sprite *sprite) { sprite->pos1.x += gBattleAnimArgs[0]; diff --git a/src/battle_interface.c b/src/battle_interface.c index 6b59e2cc20..38d2702117 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -1339,16 +1339,16 @@ void DestroyMegaTriggerSprite(void) static const s8 sIndicatorPosSingles[][2] = { - [B_POSITION_PLAYER_LEFT] = {42, -7}, - [B_POSITION_OPPONENT_LEFT] = {10, 10}, + [B_POSITION_PLAYER_LEFT] = {53, -8}, + [B_POSITION_OPPONENT_LEFT] = {53, -8}, }; static const s8 sIndicatorPosDoubles[][2] = { [B_POSITION_PLAYER_LEFT] = {53, -8}, - [B_POSITION_OPPONENT_LEFT] = {10, 10}, - [B_POSITION_PLAYER_RIGHT] = {10, 10}, - [B_POSITION_OPPONENT_RIGHT] = {10, 10}, + [B_POSITION_OPPONENT_LEFT] = {53, -8}, + [B_POSITION_PLAYER_RIGHT] = {53, -8}, + [B_POSITION_OPPONENT_RIGHT] = {53, -8}, }; void CreateMegaIndicatorSprite(u32 battlerId, u32 which) diff --git a/src/ghost.c b/src/ghost.c index 26fb9affeb..16e9722db2 100644 --- a/src/ghost.c +++ b/src/ghost.c @@ -35,7 +35,6 @@ static void sub_81129F0(struct Sprite *); static void sub_8112A4C(struct Sprite *); static void sub_8112ACC(struct Sprite *); static void sub_8112B44(struct Sprite *); -static void sub_8112B78(struct Sprite *); static void sub_8112C4C(struct Sprite *); static void sub_8112D10(u8 taskId); static void sub_8112E9C(struct Sprite *); @@ -1153,7 +1152,7 @@ static void sub_8112B44(struct Sprite *sprite) DestroyAnimSprite(sprite); } -static void sub_8112B78(struct Sprite *sprite) +void sub_8112B78(struct Sprite *sprite) { u16 coeffB; u16 coeffA; diff --git a/src/graphics.c b/src/graphics.c index 550bdabdbd..4e26c48c3f 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -32,6 +32,15 @@ const u32 gBattleAnimSpritePal_ToxicSpikes[] = INCBIN_U32("graphics/battle_anims 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"); + // 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"); From c0470c3932d94adbb3894c50b184b95c306e84e2 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 3 May 2019 17:31:23 +0200 Subject: [PATCH 360/667] Remove skarmory mega evo --- src/data/items.h | 1 - src/data/pokemon/evolution.h | 1 - 2 files changed, 2 deletions(-) diff --git a/src/data/items.h b/src/data/items.h index 6d1673ee0a..4d262e6833 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -177,7 +177,6 @@ const struct Item gItems[] = .name = _("POTION"), .itemId = ITEM_POTION, .price = 300, - .holdEffect = HOLD_EFFECT_MEGA_STONE, .holdEffectParam = 20, .description = sPotionDesc, .pocket = POCKET_ITEMS, diff --git a/src/data/pokemon/evolution.h b/src/data/pokemon/evolution.h index 9313753830..c9b0cf716d 100644 --- a/src/data/pokemon/evolution.h +++ b/src/data/pokemon/evolution.h @@ -184,5 +184,4 @@ const struct Evolution gEvolutionTable[NUM_SPECIES][EVOS_PER_MON] = [SPECIES_SHELGON] = {{EVO_LEVEL, 50, SPECIES_SALAMENCE}}, [SPECIES_BELDUM] = {{EVO_LEVEL, 20, SPECIES_METANG}}, [SPECIES_METANG] = {{EVO_LEVEL, 45, SPECIES_METAGROSS}}, - [SPECIES_SKARMORY] = {{EVO_MEGA_EVOLUTION, ITEM_POTION, SPECIES_HO_OH}}, }; From bb8e397e5b2e0ac57f31c5a81a8e93be0e359c49 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 7 May 2019 15:26:58 +0200 Subject: [PATCH 361/667] Gems and dmg reducing berries --- data/battle_scripts_1.s | 21 +++++++++++ include/battle.h | 3 ++ include/battle_scripts.h | 3 ++ include/constants/battle_string_ids.h | 3 ++ include/constants/hold_effects.h | 30 +++++++++++---- src/battle_main.c | 16 +++++++- src/battle_message.c | 6 +++ src/battle_script_commands.c | 53 ++++++++++++++++++++------- src/battle_util.c | 28 ++++++++++---- 9 files changed, 134 insertions(+), 29 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 3fff8417a0..e57eda0304 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6722,6 +6722,27 @@ BattleScript_BerryCureSlpRet:: updatestatusicon BS_SCRIPTING removeitem BS_SCRIPTING return + +BattleScript_GemActivates:: + playanimation BS_ATTACKER, B_ANIM_ITEM_EFFECT, NULL + waitanimation + printstring STRINGID_GEMACTIVATES + waitmessage 0x40 + removeitem BS_ATTACKER + return + +BattleScript_BerryReduceDmg:: + playanimation BS_TARGET, B_ANIM_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 diff --git a/include/battle.h b/include/battle.h index 594adb8884..701297c597 100644 --- a/include/battle.h +++ b/include/battle.h @@ -166,6 +166,9 @@ struct SpecialStatus u8 stormDrainRedirected:1; u8 switchInAbilityDone:1; u8 instructedChosenTarget:3; + u8 berryReduced:1; + u8 gemBoost:1; + u8 gemParam; s32 dmg; s32 physicalDmg; s32 specialDmg; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index cf8504f6c0..f80671a1a1 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -309,5 +309,8 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index ad740bc6d2..0d419b9611 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -532,6 +532,9 @@ #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 BATTLESTRINGS_COUNT 530 diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index 84368ae913..9d4089101c 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -100,25 +100,39 @@ #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 // Gen5 hold effects #define HOLD_EFFECT_FLOAT_STONE 115 #define HOLD_EFFECT_EVIOLITE 116 #define HOLD_EFFECT_ASSAULT_VEST 117 -#define HOLD_EFFECT_BINDING_BAND 118 -#define HOLD_EFFECT_DRIVE 119 -#define HOLD_EFFECT_GEMS 120 +#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_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_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)) diff --git a/src/battle_main.c b/src/battle_main.c index 6b97aff4b2..b1f6cf81ce 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4303,7 +4303,7 @@ u32 GetBattlerTotalSpeedStat(u8 battlerId) } // item effects - if (holdEffect == HOLD_EFFECT_MACHO_BRACE) + 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; @@ -5033,6 +5033,11 @@ void SetTypeBeforeUsingMove(u16 move, u8 battlerAtk) 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: @@ -5076,6 +5081,15 @@ void SetTypeBeforeUsingMove(u16 move, u8 battlerAtk) gBattleStruct->dynamicMoveType = 0x80 | TYPE_NORMAL; gBattleStruct->ateBoost[battlerAtk] = 1; } + + // 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; + } } static void HandleAction_UseMove(void) diff --git a/src/battle_message.c b/src/battle_message.c index e633b73317..8244709d7c 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -657,9 +657,15 @@ static const u8 sText_AromaVeilProtected[] = _("{B_DEF_NAME_WITH_PREFIX} is prot 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}!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [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, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 9dce6b0617..a8fd91003d 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1371,6 +1371,15 @@ static void atk03_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; @@ -1404,23 +1413,14 @@ s32 CalcCritChanceStage(u8 battlerAtk, u8 battlerDef, u32 move, bool32 recordAbi + 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; + if (critChance >= ARRAY_COUNT(sCriticalHitChance)) + critChance = ARRAY_COUNT(sCriticalHitChance) - 1; + } return critChance; } -// 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 - static void atk04_critcalc(void) { s32 critChance = CalcCritChanceStage(gBattlerAttacker, gBattlerTarget, gCurrentMove, TRUE); @@ -1516,6 +1516,22 @@ static void atk07_adjustdamage(void) END: gBattlescriptCurrInstr++; + + // Check gems and damage reducing berries. + if (gSpecialStatuses[gBattlerTarget].berryReduced + && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && gBattleMons[gBattlerTarget].item) + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_BerryReduceDmg; + } + if (gSpecialStatuses[gBattlerAttacker].gemBoost + && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && gBattleMons[gBattlerAttacker].item) + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_GemActivates; + } } static void atk08_multihitresultmessage(void) @@ -1927,6 +1943,15 @@ static void atk0F_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 atk10_printstring(void) @@ -4547,12 +4572,14 @@ static void atk49_moveend(void) } gBattleScripting.atk49_state++; break; - case ATK49_CLEAR_BITS: // Clear bits active just while using a move. + case ATK49_CLEAR_BITS: // Clear bits active while using a move for all targets and all hits. if (gSpecialStatuses[gBattlerAttacker].instructedChosenTarget) *(gBattleStruct->moveTarget + gBattlerAttacker) = gSpecialStatuses[gBattlerAttacker].instructedChosenTarget & 0x3; gProtectStructs[gBattlerAttacker].usesBouncedMove = 0; gBattleStruct->ateBoost[gBattlerAttacker] = 0; gStatuses3[gBattlerAttacker] &= ~(STATUS3_ME_FIRST); + gSpecialStatuses[gBattlerAttacker].gemBoost = 0; + gSpecialStatuses[gBattlerTarget].berryReduced = 0; gBattleScripting.atk49_state++; break; case ATK49_COUNT: diff --git a/src/battle_util.c b/src/battle_util.c index 3e4b1b4f09..aa6f9d1cec 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2365,7 +2365,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case CANCELLER_THROAT_CHOP: + case CANCELLER_THROAT_CHOP: if (gDisableStructs[gBattlerAttacker].throatChopTimer && gBattleMoves[gCurrentMove].flags & FLAG_SOUND) { gProtectStructs[gBattlerAttacker].usedThroatChopPreventedMove = 1; @@ -2395,6 +2395,7 @@ u8 AtkCanceller_UnableToUseMove(void) u8 AtkCanceller_UnableToUseMove2(void) { u8 effect = 0; + do { switch (gBattleStruct->atkCancellerTracker) @@ -4969,7 +4970,7 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) return basePower; } -static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType) +static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, bool32 updateFlags) { u32 i; u32 holdEffectAtk, holdEffectParamAtk; @@ -5141,6 +5142,10 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe 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: @@ -5485,7 +5490,7 @@ static u32 CalcDefenseStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, return ApplyModifier(modifier, defStat); } -static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, u16 typeEffectivenessModifier, bool32 isCrit) +static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, u16 typeEffectivenessModifier, bool32 isCrit, bool32 updateFlags) { u32 abilityAtk = GetBattlerAbility(battlerAtk); u32 abilityDef = GetBattlerAbility(battlerDef); @@ -5600,7 +5605,16 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move // target's hold effect switch (GetBattlerHoldEffect(battlerDef, TRUE)) { - // berries reducing dmg + // 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) @@ -5631,7 +5645,7 @@ s32 CalculateMoveDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, s32 if (fixedBasePower) gBattleMovePower = fixedBasePower; else - gBattleMovePower = CalcMoveBasePowerAfterModifiers(move, battlerAtk, battlerDef, moveType); + gBattleMovePower = CalcMoveBasePowerAfterModifiers(move, battlerAtk, battlerDef, moveType, updateFlags); // long dmg basic formula dmg = ((gBattleMons[battlerAtk].level * 2) / 5) + 2; @@ -5641,7 +5655,7 @@ s32 CalculateMoveDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, s32 dmg = (dmg / 50) + 2; // Calculate final modifiers. - dmg = CalcFinalDmg(dmg, move, battlerAtk, battlerDef, moveType, typeEffectivenessModifier, isCrit); + dmg = CalcFinalDmg(dmg, move, battlerAtk, battlerDef, moveType, typeEffectivenessModifier, isCrit, updateFlags); // Add a random factor. if (randomFactor) @@ -5670,7 +5684,7 @@ static inline void MulByTypeEffectiveness(u16 *modifier, u16 move, u8 moveType, mod = UQ_4_12(2.0); if (moveType == TYPE_GROUND && defType == TYPE_FLYING && IsBattlerGrounded(battlerDef)) mod = UQ_4_12(1.0); - + if (gProtectStructs[battlerDef].kingsShielded && gBattleMoves[move].effect != EFFECT_FEINT) mod = UQ_4_12(1.0); From 875b413a09ac811e2bf843f566bf22e48150fa38 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 9 May 2019 20:31:58 +0200 Subject: [PATCH 362/667] Various battle target items --- data/battle_scripts_1.s | 80 +++++++++++++- include/battle_scripts.h | 6 ++ include/battle_util.h | 1 + include/constants/battle_script_commands.h | 17 +-- include/constants/battle_string_ids.h | 2 + src/battle_message.c | 4 + src/battle_script_commands.c | 15 ++- src/battle_util.c | 119 ++++++++++++++++++++- 8 files changed, 225 insertions(+), 19 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e57eda0304..38a3f500cb 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5206,6 +5206,46 @@ BattleScript_RoarSuccessRet: 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_ITEM_EFFECT, NULL + waitanimation + setbyte sSTAT_ANIM_PLAYED, FALSE + playstatchangeanimation BS_TARGET, BIT_ATK | BIT_SPATK, ATK48_STAT_BY_TWO + setstatchanger STAT_ATK, 2, FALSE + statbuffchange STAT_CHANGE_BS_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_CHANGE_BS_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_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 @@ -5317,7 +5357,7 @@ BattleScript_ToxicSpikesPoisoned:: BattleScript_StickyWebOnSwitchIn:: savetarget - copybyte gBattlerTarget sBATTLER + copybyte gBattlerTarget, sBATTLER printstring STRINGID_STICKYWEBSWITCHIN waitmessage 0x40 statbuffchange STAT_CHANGE_BS_PTR, BattleScript_StickyWebOnSwitchInEnd @@ -6549,10 +6589,9 @@ BattleScript_ImposterActivates:: printstring STRINGID_IMPOSTERTRANSFORM waitmessage 0x40 end3 - -BattleScript_RoughSkinActivates:: + +BattleScript_HurtAttacker: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 - call BattleScript_AbilityPopUp healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER printstring STRINGID_PKMNHURTSWITH @@ -6560,6 +6599,17 @@ BattleScript_RoughSkinActivates:: tryfaintmon BS_ATTACKER, FALSE, NULL return +BattleScript_RoughSkinActivates:: + call BattleScript_AbilityPopUp + call BattleScript_HurtAttacker + return + +BattleScript_RockyHelmetActivates:: + playanimation BS_TARGET, B_ANIM_ITEM_EFFECT, NULL + waitanimation + call BattleScript_HurtAttacker + return + BattleScript_SpikyShieldEffect:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT @@ -6798,6 +6848,28 @@ BattleScript_BerryPPHealEnd2:: BattleScript_ItemHealHP_End2:: call BattleScript_ItemHealHP_Ret end2 + +BattleScript_AirBaloonMsgIn:: + printstring STRINGID_AIRBALLOONFLOAT + waitmessage 0x40 + end2 + +BattleScript_AirBaloonMsgPop:: + printstring STRINGID_AIRBALLOONPOP + waitmessage 0x40 + removeitem BS_TARGET + return + +BattleScript_ItemHurtEnd2:: + playanimation BS_ATTACKER, B_ANIM_MON_HIT, NULL + waitanimation + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 + healthbarupdate BS_ATTACKER + datahpupdate BS_ATTACKER + printstring STRINGID_HURTBYITEM + waitmessage 0x40 + tryfaintmon BS_ATTACKER, FALSE, NULL + end2 BattleScript_ItemHealHP_Ret:: playanimation BS_ATTACKER, B_ANIM_ITEM_EFFECT, NULL diff --git a/include/battle_scripts.h b/include/battle_scripts.h index f80671a1a1..7628b35bb4 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -312,5 +312,11 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/battle_util.h b/include/battle_util.h index f2671a6ad6..6031bf874f 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -25,6 +25,7 @@ #define ITEMEFFECT_ON_SWITCH_IN 0x0 #define ITEMEFFECT_MOVE_END 0x3 #define ITEMEFFECT_KINGSROCK_SHELLBELL 0x4 +#define ITEMEFFECT_TARGET 0x5 #define WEATHER_HAS_EFFECT ((!IsAbilityOnField(ABILITY_CLOUD_NINE) && !IsAbilityOnField(ABILITY_AIR_LOCK))) diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 683f3ea372..775f8b337b 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -175,14 +175,15 @@ #define ATK49_ATTACKER_INVISIBLE 9 #define ATK49_ATTACKER_VISIBLE 10 #define ATK49_TARGET_VISIBLE 11 -#define ATK49_ITEM_EFFECTS_ALL 12 -#define ATK49_KINGSROCK_SHELLBELL 13 -#define ATK49_SUBSTITUTE 14 -#define ATK49_UPDATE_LAST_MOVES 15 -#define ATK49_MIRROR_MOVE 16 -#define ATK49_NEXT_TARGET 17 -#define ATK49_CLEAR_BITS 18 -#define ATK49_COUNT 19 +#define ATK49_ITEM_EFFECTS_TARGET 12 +#define ATK49_ITEM_EFFECTS_ALL 13 +#define ATK49_KINGSROCK_SHELLBELL 14 +#define ATK49_SUBSTITUTE 15 +#define ATK49_UPDATE_LAST_MOVES 16 +#define ATK49_MIRROR_MOVE 17 +#define ATK49_NEXT_TARGET 18 +#define ATK49_CLEAR_BITS 19 +#define ATK49_COUNT 20 #define BIT_HP 0x1 #define BIT_ATK 0x2 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 0d419b9611..711512edf4 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -535,6 +535,8 @@ #define STRINGID_GEMACTIVATES 531 #define STRINGID_BERRYDMGREDUCES 532 #define STRINGID_TARGETATEITEM 533 +#define STRINGID_AIRBALLOONFLOAT 534 +#define STRINGID_AIRBALLOONPOP 535 #define BATTLESTRINGS_COUNT 530 diff --git a/src/battle_message.c b/src/battle_message.c index 8244709d7c..e98a20798c 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -660,9 +660,13 @@ static const u8 sText_LaserFocusMessage[] = _("{B_ATK_NAME_WITH_PREFIX}\nconcent 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!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [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, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a8fd91003d..8c6ebf27a5 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4402,6 +4402,11 @@ static void atk49_moveend(void) } gBattleScripting.atk49_state++; break; + case ATK49_ITEM_EFFECTS_TARGET: + if (ItemBattleEffects(ITEMEFFECT_TARGET, gBattlerTarget, FALSE)) + effect = TRUE; + gBattleScripting.atk49_state++; + break; case ATK49_ITEM_EFFECTS_ALL: // item effects for all battlers if (ItemBattleEffects(ITEMEFFECT_MOVE_END, 0, FALSE)) effect = TRUE; @@ -5969,18 +5974,24 @@ static void atk69_setgravity(void) static void atk6A_removeitem(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - gBattleStruct->usedHeldItems[gActiveBattler] = gBattleMons[gActiveBattler].item; + + // Popped Air Balloon cannot be restored by no means. + if (GetBattlerHoldEffect(gActiveBattler, TRUE) != HOLD_EFFECT_AIR_BALLOON) + gBattleStruct->usedHeldItems[gActiveBattler] = gBattleMons[gActiveBattler].item; + gBattleMons[gActiveBattler].item = 0; BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBattler].item); MarkBattlerForControllerExec(gActiveBattler); + ClearBattlerItemEffectHistory(gActiveBattler); + gBattlescriptCurrInstr += 2; } static void atk6B_atknameinbuff1(void) { - PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBattlerAttacker, gBattlerPartyIndexes[gBattlerAttacker]) + PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBattlerAttacker, gBattlerPartyIndexes[gBattlerAttacker]); gBattlescriptCurrInstr++; } diff --git a/src/battle_util.c b/src/battle_util.c index aa6f9d1cec..aab30c15e8 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3721,7 +3721,7 @@ static bool32 HasEnoughHpToEatBerry(u8 battlerId, u32 hpFraction) 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; @@ -3762,6 +3762,12 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) BattleScriptExecute(BattleScript_WhiteHerbEnd2); } break; + case HOLD_EFFECT_AIR_BALLOON: + effect = ITEM_EFFECT_OTHER; + gBattleScripting.battler = battlerId; + BattleScriptExecute(BattleScript_AirBaloonMsgIn); + RecordItemEffectBattle(battlerId, HOLD_EFFECT_AIR_BALLOON); + break; } break; case 1: @@ -3833,14 +3839,28 @@ 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; @@ -4303,7 +4323,8 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; } - if (effect) + + if (effect == ITEM_STATUS_CHANGE) { gBattleScripting.battler = battlerId; gPotentialItemEffectBattler = battlerId; @@ -4355,6 +4376,92 @@ 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) + && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) + { + gBattleMoveDamage = gBattleMons[gBattlerAttacker].hp / 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; } // Berry was successfully used on a Pokemon. @@ -4608,7 +4715,7 @@ u32 GetBattlerHoldEffect(u8 battlerId, bool32 checkNegating) gPotentialItemEffectBattler = battlerId; - if (USE_BATTLE_DEBUG && gBattleStruct->debugHoldEffects[battlerId] != 0) + 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; @@ -4651,6 +4758,8 @@ bool32 IsBattlerGrounded(u8 battlerId) 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)) From d027bb0d7a809be5765637dd0c8df24e67ad6cff Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 10 May 2019 11:03:33 +0200 Subject: [PATCH 363/667] Life Flame toxic orbs --- data/battle_scripts_1.s | 25 ++++++++++--- include/battle.h | 1 + include/battle_scripts.h | 3 ++ include/battle_util.h | 1 + include/constants/battle_script_commands.h | 5 ++- src/battle_script_commands.c | 19 ++++++++++ src/battle_util.c | 43 +++++++++++++++++++++- 7 files changed, 89 insertions(+), 8 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 38a3f500cb..808d2733c0 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2432,8 +2432,7 @@ BattleScript_EffectToxic:: jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected jumpifflowerveil BattleScript_FlowerVeilProtects jumpifsubstituteblocks BattleScript_ButItFailed - jumpifstatus BS_TARGET, STATUS1_POISON, BattleScript_AlreadyPoisoned - jumpifstatus BS_TARGET, STATUS1_TOXIC_POISON, BattleScript_AlreadyPoisoned + 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 @@ -6020,6 +6019,18 @@ 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 @@ -6860,15 +6871,19 @@ BattleScript_AirBaloonMsgPop:: removeitem BS_TARGET return -BattleScript_ItemHurtEnd2:: - playanimation BS_ATTACKER, B_ANIM_MON_HIT, NULL - waitanimation +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:: diff --git a/include/battle.h b/include/battle.h index 701297c597..16822bb1a9 100644 --- a/include/battle.h +++ b/include/battle.h @@ -169,6 +169,7 @@ struct SpecialStatus u8 berryReduced:1; u8 gemBoost:1; u8 gemParam; + u8 damagedMons:4; // Mons that have been damaged directly by using a move, includes substitute. s32 dmg; s32 physicalDmg; s32 specialDmg; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 7628b35bb4..b5b57f855c 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -318,5 +318,8 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/battle_util.h b/include/battle_util.h index 6031bf874f..130a533433 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -26,6 +26,7 @@ #define ITEMEFFECT_MOVE_END 0x3 #define ITEMEFFECT_KINGSROCK_SHELLBELL 0x4 #define ITEMEFFECT_TARGET 0x5 +#define ITEMEFFECT_ORBS 0x6 #define WEATHER_HAS_EFFECT ((!IsAbilityOnField(ABILITY_CLOUD_NINE) && !IsAbilityOnField(ABILITY_AIR_LOCK))) diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 775f8b337b..d13a84fc19 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -182,8 +182,9 @@ #define ATK49_UPDATE_LAST_MOVES 16 #define ATK49_MIRROR_MOVE 17 #define ATK49_NEXT_TARGET 18 -#define ATK49_CLEAR_BITS 19 -#define ATK49_COUNT 20 +#define ATK49_LIFE_ORB 19 +#define ATK49_CLEAR_BITS 20 +#define ATK49_COUNT 21 #define BIT_HP 0x1 #define BIT_ATK 0x2 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 8c6ebf27a5..ae2cb028f9 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1517,6 +1517,9 @@ static void atk07_adjustdamage(void) 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) @@ -4577,6 +4580,21 @@ static void atk49_moveend(void) } gBattleScripting.atk49_state++; break; + case ATK49_LIFE_ORB: + if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIFE_ORB + && !(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; + } + gBattleScripting.atk49_state++; + break; case ATK49_CLEAR_BITS: // Clear bits active while using a move for all targets and all hits. if (gSpecialStatuses[gBattlerAttacker].instructedChosenTarget) *(gBattleStruct->moveTarget + gBattlerAttacker) = gSpecialStatuses[gBattlerAttacker].instructedChosenTarget & 0x3; @@ -4584,6 +4602,7 @@ static void atk49_moveend(void) gBattleStruct->ateBoost[gBattlerAttacker] = 0; gStatuses3[gBattlerAttacker] &= ~(STATUS3_ME_FIRST); gSpecialStatuses[gBattlerAttacker].gemBoost = 0; + gSpecialStatuses[gBattlerAttacker].damagedMons = 0; gSpecialStatuses[gBattlerTarget].berryReduced = 0; gBattleScripting.atk49_state++; break; diff --git a/src/battle_util.c b/src/battle_util.c index aab30c15e8..c5c04eb752 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1361,6 +1361,7 @@ enum ENDTURN_TAUNT, ENDTURN_YAWN, ENDTURN_ITEMS2, + ENDTURN_ORBS, ENDTURN_ROOST, ENDTURN_ELECTRIFY, ENDTURN_POWDER, @@ -1430,6 +1431,11 @@ u8 DoBattlerEndTurnEffects(void) 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 @@ -4173,6 +4179,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; } + if (effect) { gBattleScripting.battler = battlerId; @@ -4395,7 +4402,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) && IsMoveMakingContact(gCurrentMove, gBattlerAttacker) && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { - gBattleMoveDamage = gBattleMons[gBattlerAttacker].hp / 6; + gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 6; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; effect = ITEM_HP_CHANGE; @@ -4462,6 +4469,40 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } } break; + case ITEMEFFECT_ORBS: + switch (battlerHoldEffect) + { + case HOLD_EFFECT_TOXIC_ORB: + if (!gBattleMons[battlerId].status1 + && !IS_BATTLER_OF_TYPE(battlerId, TYPE_POISON) && !IS_BATTLER_OF_TYPE(battlerId, TYPE_STEEL) + && 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. From 824a95fe075de94cd40272a54684ece4f763a9c0 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 10 May 2019 15:12:33 +0200 Subject: [PATCH 364/667] Incinerate --- data/battle_anim_scripts.s | 37 +++++++++++++++++++++++++ data/battle_scripts_1.s | 10 +++++++ include/battle_scripts.h | 1 + include/constants/battle.h | 1 + include/constants/battle_move_effects.h | 1 + include/constants/battle_string_ids.h | 1 + src/battle_message.c | 2 ++ src/battle_script_commands.c | 13 +++++++++ src/data/battle_moves.h | 2 +- src/fire.c | 30 ++++++++++++++++++-- 10 files changed, 94 insertions(+), 4 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 4744292486..d838029648 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -2417,6 +2417,43 @@ Move_CIRCLE_THROW: 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_W172, 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_W172, 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_W172, 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_W172, 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_W172, SOUND_PAN_ATTACKER + delay 5 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 0, 9 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff end Move_QUASH: diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 808d2733c0..8416d89398 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -353,6 +353,16 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectLaserFocus .4byte BattleScript_EffectMagneticFlux .4byte BattleScript_EffectGearUp + .4byte BattleScript_EffectIncinerate + +BattleScript_EffectIncinerate: + setmoveeffect MOVE_EFFECT_INCINERATE | MOVE_EFFECT_CERTAIN + goto BattleScript_EffectHit + +BattleScript_MoveEffectIncinerate:: + printstring STRINGID_INCINERATEBURN + waitmessage 0x40 + return BattleScript_EffectCoreEnforcer: setmoveeffect MOVE_EFFECT_CORE_ENFORCER | MOVE_EFFECT_CERTAIN diff --git a/include/battle_scripts.h b/include/battle_scripts.h index b5b57f855c..8b5e3c18d8 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -321,5 +321,6 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle.h b/include/constants/battle.h index 42b80d173f..c36da4753a 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -330,6 +330,7 @@ #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_AFFECTS_USER 0x4000 #define MOVE_EFFECT_CERTAIN 0x8000 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 4d8b8b222b..778b24b01d 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -341,5 +341,6 @@ #define EFFECT_LASER_FOCUS 335 #define EFFECT_MAGNETIC_FLUX 336 #define EFFECT_GEAR_UP 337 +#define EFFECT_INCINERATE 338 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 711512edf4..49cf4836da 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -537,6 +537,7 @@ #define STRINGID_TARGETATEITEM 533 #define STRINGID_AIRBALLOONFLOAT 534 #define STRINGID_AIRBALLOONPOP 535 +#define STRINGID_INCINERATEBURN 536 #define BATTLESTRINGS_COUNT 530 diff --git a/src/battle_message.c b/src/battle_message.c index e98a20798c..7a23c2ba37 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -662,9 +662,11 @@ static const u8 sText_BerryDmgReducing[] = _("{B_LAST_ITEM} weakened the damage\ 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!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_INCINERATEBURN - 12] = sText_IncinerateBurn, [STRINGID_AIRBALLOONPOP - 12] = sText_AirBalloonPop, [STRINGID_AIRBALLOONFLOAT - 12] = sText_AirBalloonFloat, [STRINGID_TARGETATEITEM - 12] = sText_TargetAteItem, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ae2cb028f9..aaea462f96 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2876,6 +2876,19 @@ void SetMoveEffect(bool32 primary, u32 certain) gDisableStructs[gEffectBattler].throatChopTimer = 2; gBattlescriptCurrInstr++; break; + case MOVE_EFFECT_INCINERATE: + if (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; + gActiveBattler = gEffectBattler; + BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gEffectBattler].item); + MarkBattlerForControllerExec(gActiveBattler); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectIncinerate; + } + break; } } } diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index dec05ad6c0..c74a57ed4d 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -7153,7 +7153,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_INCINERATE] = { - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_INCINERATE, .power = 60, .type = TYPE_FIRE, .accuracy = 100, diff --git a/src/fire.c b/src/fire.c index d428dc13be..969d16a418 100644 --- a/src/fire.c +++ b/src/fire.c @@ -256,6 +256,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 = &gUnknown_08524914, + .anims = gIncinerateAnims, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = TranslateAnimSpriteToTargetMonLocation, +}; + const struct SpriteTemplate gUnknown_08595504 = { .tileTag = ANIM_TAG_SMALL_EMBER, @@ -653,7 +677,7 @@ void AnimFireRing(struct Sprite *sprite) } static void AnimFireRingStep1(struct Sprite *sprite) -{ +{ UpdateFireRingCircleOffset(sprite); if (++sprite->data[0] == 0x12) @@ -713,7 +737,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) { @@ -1093,7 +1117,7 @@ static void sub_8109AFC(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; From 0518025b9276dd067b23d72e5281fd0bbd45381f Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 16 May 2019 09:43:19 +0200 Subject: [PATCH 365/667] formatting --- include/pokemon.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/pokemon.h b/include/pokemon.h index 3f8344c23e..76d2d93b09 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -387,7 +387,7 @@ enum BODY_COLOR_PINK }; -#define EVO_MEGA_EVOLUTION 0xffff // Not an actual evolution, used to temporarily mega evolve in battle. +#define EVO_MEGA_EVOLUTION 0xffff // Not an actual evolution, used to temporarily mega evolve in battle. #define EVO_FRIENDSHIP 0x0001 // Pokémon levels up with friendship ≥ 220 #define EVO_FRIENDSHIP_DAY 0x0002 // Pokémon levels up during the day with friendship ≥ 220 #define EVO_FRIENDSHIP_NIGHT 0x0003 // Pokémon levels up at night with friendship ≥ 220 From 6624306024d278685d25195ad30b13ecd2972045 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 16 May 2019 10:40:44 +0200 Subject: [PATCH 366/667] Ring Target --- src/battle_util.c | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index c5c04eb752..166c801fb2 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5820,14 +5820,27 @@ s32 CalculateMoveDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, s32 return dmg; } -static inline void MulByTypeEffectiveness(u16 *modifier, u16 move, u8 moveType, u8 battlerDef, u8 defType, u8 atkAblity) +static void MulByTypeEffectiveness(u16 *modifier, u16 move, u8 moveType, u8 battlerDef, u8 defType, u8 battlerAtk, bool32 recordAbilities) { u16 mod = sTypeEffectivenessTable[moveType][defType]; - if ((moveType == TYPE_FIGHTING || moveType == TYPE_NORMAL) && defType == TYPE_GHOST && gBattleMons[battlerDef].status2 & STATUS2_FORESIGHT) + if (mod == UQ_4_12(0.0) && GetBattlerHoldEffect(battlerDef, TRUE) == HOLD_EFFECT_RING_TARGET) + { mod = UQ_4_12(1.0); - if ((moveType == TYPE_FIGHTING || moveType == TYPE_NORMAL) && defType == TYPE_GHOST && atkAblity == ABILITY_SCRAPPY) + 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(1.0); + } + else if ((moveType == TYPE_FIGHTING || moveType == TYPE_NORMAL) && defType == TYPE_GHOST && GetBattlerAbility(battlerAtk) == ABILITY_SCRAPPY) + { + 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(1.0); if (gBattleMoves[move].effect == EFFECT_FREEZE_DRY && defType == TYPE_WATER) @@ -5866,13 +5879,12 @@ static void UpdateMoveResultFlags(u16 modifier) static u16 CalcTypeEffectivenessMultiplierInternal(u16 move, u8 moveType, u8 battlerAtk, u8 battlerDef, bool32 recordAbilities, u16 modifier) { - u32 atkAbility = GetBattlerAbility(battlerAtk); - MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, gBattleMons[battlerDef].type1, atkAbility); + 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, atkAbility); + 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, atkAbility); + MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, gBattleMons[battlerDef].type3, battlerAtk, recordAbilities); if (moveType == TYPE_GROUND && !IsBattlerGrounded(battlerDef)) { @@ -5925,9 +5937,9 @@ u16 CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u8 ability if (move != MOVE_STRUGGLE && moveType != TYPE_MYSTERY) { - MulByTypeEffectiveness(&modifier, move, moveType, 0, gBaseStats[speciesDef].type1, ABILITY_NONE); + 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, ABILITY_NONE); + 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); From a9b4d0208bc368875f303434d42ea474869ed180 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 17 May 2019 10:38:48 +0200 Subject: [PATCH 367/667] Move new species to battle_config.h --- include/constants/battle_config.h | 12 ++++++++++++ include/constants/items.h | 2 -- include/constants/species.h | 7 ------- src/battle_util.c | 4 ++++ 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 8a65728746..d0ed6c3572 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -1,6 +1,18 @@ #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 + +// Items with peculiar battle effects. Remove them if they're properly placed in constant/items.h +#define ITEM_GRISEOUS_ORB 0 + #define GEN_3 0 #define GEN_4 1 #define GEN_5 2 diff --git a/include/constants/items.h b/include/constants/items.h index c02b06273a..3a894f8ff6 100644 --- a/include/constants/items.h +++ b/include/constants/items.h @@ -475,6 +475,4 @@ // Check if the item is one that can be used on a Pokemon. #define ITEM_HAS_EFFECT(item) ((item) >= ITEM_POTION && (item) <= ITEM_0B2) -#define ITEM_GRISEOUS_ORB 0 - #endif // GUARD_CONSTANTS_ITEMS_H diff --git a/include/constants/species.h b/include/constants/species.h index afb250d6ac..02e5ea3964 100644 --- a/include/constants/species.h +++ b/include/constants/species.h @@ -447,13 +447,6 @@ #define NUM_SPECIES SPECIES_EGG -#define SPECIES_DIALGA 0 -#define SPECIES_PALKIA 0 -#define SPECIES_GIRATINA 0 -#define SPECIES_CHERRIM 0 -#define SPECIES_ARCEUS 0 -#define SPECIES_SILVALLY 0 - // National Dex Index Defines #define NATIONAL_DEX_NONE 0 diff --git a/src/battle_util.c b/src/battle_util.c index 166c801fb2..7c5eccc2b8 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6115,6 +6115,10 @@ bool32 CanBattlerGetOrLoseItem(u8 battlerId, u16 itemId) 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; } From f81daeab4502e8871fd2ac1945629bbecbb3d16f Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sun, 19 May 2019 23:32:59 -0300 Subject: [PATCH 368/667] FLAG_SNATCH_AFFECTED for Healing Wish and Lunar Dance Title is self-explanatory. As of Gen. 5, Healing Wish and Lunar Dance are affected by Snatch. --- src/data/battle_moves.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index c74a57ed4d..fd69e56a57 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -5069,7 +5069,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, - .flags = 0, + .flags = FLAG_SNATCH_AFFECTED, .split = SPLIT_STATUS, }, @@ -6473,7 +6473,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, - .flags = FLAG_DANCE, + .flags = FLAG_DANCE | FLAG_SNATCH_AFFECTED, .split = SPLIT_STATUS, }, From a14016240a379ced2e8920813357c7fc55ced509 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 20 May 2019 03:34:13 -0300 Subject: [PATCH 369/667] Razor Leaf is a Physical move, not a Special one. --- src/data/battle_moves.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index c74a57ed4d..efd617c8fc 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -1061,7 +1061,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_BOTH, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_HIGH_CRIT, - .split = SPLIT_SPECIAL, + .split = SPLIT_PHYSICAL, }, [MOVE_SOLAR_BEAM] = From e9829c16c450cfd647b5142c1fd76ce367e1999d Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 20 May 2019 09:18:49 +0200 Subject: [PATCH 370/667] Correct effect for seed flare --- src/data/battle_moves.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 9573ecb2f9..cc6f45aded 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -6521,7 +6521,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_SEED_FLARE] = { - .effect = EFFECT_SPECIAL_DEFENSE_DOWN_2, + .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2, .power = 120, .type = TYPE_GRASS, .accuracy = 85, From 269f573297cef1701cec7257970d77b0471e9644 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 20 May 2019 10:10:00 +0200 Subject: [PATCH 371/667] Fix powder and resist berry string --- asm/macros/battle_ai_script.inc | 15 +++++++--- data/battle_ai_scripts.s | 44 ++++++++++++++++++++++++--- src/battle_ai_script_commands.c | 53 +++++++++++++++++++++++++-------- src/battle_script_commands.c | 2 ++ src/battle_util.c | 1 + 5 files changed, 95 insertions(+), 20 deletions(-) diff --git a/asm/macros/battle_ai_script.inc b/asm/macros/battle_ai_script.inc index 2faa2a0434..eb9670a2b5 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 @@ -620,6 +620,13 @@ .4byte \ptr .endm + .macro if_has_move_with_type battler:req, type:req, ptr:req + .byte 0x6D + .byte \battler + .byte \type + .4byte \ptr + .endm + @ useful script macros .macro if_has_physical_move battler:req, ptr:req if_has_move_with_split \battler, SPLIT_PHYSICAL, \ptr diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index b389d5771a..2c37399574 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -76,17 +76,17 @@ CheckIfSoundproofCancelsMove: CheckIfVoltAbsorbCancelsElectric: @ 82DBFBD get_curr_move_type - if_equal_ TYPE_ELECTRIC, AI_CheckBadMove_CheckEffect + if_equal TYPE_ELECTRIC, AI_CheckBadMove_CheckEffect goto AI_CheckBadMove_CheckEffect CheckIfWaterAbsorbCancelsWater: @ 82DBFCA get_curr_move_type - if_equal_ TYPE_WATER, Score_Minus12 + if_equal TYPE_WATER, Score_Minus12 goto AI_CheckBadMove_CheckEffect CheckIfFlashFireCancelsFire: @ 82DBFD7 get_curr_move_type - if_equal_ TYPE_FIRE, Score_Minus12 + if_equal TYPE_FIRE, Score_Minus12 goto AI_CheckBadMove_CheckEffect CheckIfWonderGuardCancelsMove: @ 82DBFE4 @@ -95,7 +95,7 @@ CheckIfWonderGuardCancelsMove: @ 82DBFE4 CheckIfLevitateCancelsGroundMove: @ 82DBFEF get_curr_move_type - if_equal_ TYPE_GROUND, Score_Minus10 + if_equal TYPE_GROUND, Score_Minus10 AI_CheckBadMove_CheckEffect: @ 82DC045 if_effect EFFECT_SLEEP, AI_CBM_Sleep @@ -250,6 +250,13 @@ AI_CheckBadMove_CheckEffect: @ 82DC045 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 + 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: @@ -1029,6 +1036,35 @@ AI_CheckViability: 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 + 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: diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 75005435d4..34d239ab00 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -93,8 +93,8 @@ static void BattleAICmd_get_type(void); static void BattleAICmd_get_considered_move_power(void); static void BattleAICmd_get_how_powerful_move_is(void); static void BattleAICmd_get_last_used_battler_move(void); -static void BattleAICmd_if_equal_(void); -static void BattleAICmd_if_not_equal_(void); +static void BattleAICmd_if_equal_u32(void); +static void BattleAICmd_if_not_equal_u32(void); static void BattleAICmd_if_user_goes(void); static void BattleAICmd_if_cant_use_belch(void); static void BattleAICmd_nullsub_2A(void); @@ -164,6 +164,7 @@ static void BattleAICmd_if_has_move_with_split(void); static void BattleAICmd_if_has_no_move_with_split(void); static void BattleAICmd_if_physical_moves_unusable(void); static void BattleAICmd_if_ai_can_go_down(void); +static void BattleAICmd_if_has_move_with_type(void); // ewram EWRAM_DATA const u8 *gAIScriptPtr = NULL; @@ -212,8 +213,8 @@ static const BattleAICmdFunc sBattleAICmdTable[] = BattleAICmd_get_considered_move_power, // 0x23 BattleAICmd_get_how_powerful_move_is, // 0x24 BattleAICmd_get_last_used_battler_move, // 0x25 - BattleAICmd_if_equal_, // 0x26 - BattleAICmd_if_not_equal_, // 0x27 + BattleAICmd_if_equal_u32, // 0x26 + BattleAICmd_if_not_equal_u32, // 0x27 BattleAICmd_if_user_goes, // 0x28 BattleAICmd_if_cant_use_belch, // 0x29 BattleAICmd_nullsub_2A, // 0x2A @@ -283,6 +284,7 @@ static const BattleAICmdFunc sBattleAICmdTable[] = BattleAICmd_if_has_no_move_with_split, // 0x6A BattleAICmd_if_physical_moves_unusable, // 0x6B BattleAICmd_if_ai_can_go_down, // 0x6C + BattleAICmd_if_has_move_with_type, // 0x6D }; static const u16 sDiscouragedPowerfulMoveEffects[] = @@ -1422,20 +1424,20 @@ static void BattleAICmd_get_last_used_battler_move(void) gAIScriptPtr += 2; } -static void BattleAICmd_if_equal_(void) // Same as if_equal. +static void BattleAICmd_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 BattleAICmd_if_not_equal_(void) // Same as if_not_equal. +static void BattleAICmd_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 BattleAICmd_if_user_goes(void) @@ -2686,3 +2688,30 @@ static void BattleAICmd_if_cant_use_belch(void) else gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); } + +static void BattleAICmd_if_has_move_with_type(void) +{ + u32 i, moveType, battler = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + u16 *moves; + + if (IsBattlerAIControlled(battler)) + moves = gBattleMons[battler].moves; + else + moves = BATTLE_HISTORY->usedMoves[battler].moves; + + 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); +} diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d90ac6f86d..3b6a217154 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1527,6 +1527,7 @@ END: { BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_BerryReduceDmg; + gLastUsedItem = gBattleMons[gBattlerTarget].item; } if (gSpecialStatuses[gBattlerAttacker].gemBoost && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) @@ -1534,6 +1535,7 @@ END: { BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_GemActivates; + gLastUsedItem = gBattleMons[gBattlerAttacker].item; } } diff --git a/src/battle_util.c b/src/battle_util.c index 7c5eccc2b8..1bab3706b6 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2367,6 +2367,7 @@ u8 AtkCanceller_UnableToUseMove(void) gProtectStructs[gBattlerAttacker].powderSelfDmg = 1; gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 4; gBattlescriptCurrInstr = BattleScript_MoveUsedPowder; + effect = 1; } } gBattleStruct->atkCancellerTracker++; From e1ea4b62e9dae43da9045131c1f46eb105aaffe7 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 20 May 2019 12:03:00 +0200 Subject: [PATCH 372/667] Natural Gift --- asm/macros/battle_ai_script.inc | 6 + asm/macros/battle_script.inc | 5 + data/battle_ai_scripts.s | 146 +++++++++++++++++---- data/battle_scripts_1.s | 31 ++++- include/battle_util.h | 10 ++ include/constants/battle_ai.h | 9 +- include/constants/battle_config.h | 24 ++++ include/constants/battle_script_commands.h | 1 + src/battle_ai_script_commands.c | 56 +++++--- src/battle_main.c | 6 + src/battle_script_commands.c | 6 + src/battle_util.c | 73 ++++++++++- 12 files changed, 318 insertions(+), 55 deletions(-) diff --git a/asm/macros/battle_ai_script.inc b/asm/macros/battle_ai_script.inc index eb9670a2b5..2a3b687882 100644 --- a/asm/macros/battle_ai_script.inc +++ b/asm/macros/battle_ai_script.inc @@ -627,6 +627,12 @@ .4byte \ptr .endm + .macro if_no_move_used battler:req, ptr:req + .byte 0x6E + .byte \battler + .4byte \ptr + .endm + @ useful script macros .macro if_has_physical_move battler:req, ptr:req if_has_move_with_split \battler, SPLIT_PHYSICAL, \ptr diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index a4b64334e6..835ae9ddee 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1640,6 +1640,11 @@ .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 diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 2c37399574..951a74dc56 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -251,6 +251,18 @@ AI_CheckBadMove_CheckEffect: @ 82DC045 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 + 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: @@ -664,10 +676,12 @@ AI_CBM_LeechSeed: @ 82DC57A 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 @@ -1008,7 +1022,8 @@ AI_CheckViability: 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 @@ -1037,6 +1052,31 @@ AI_CheckViability: 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 + end + +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: @@ -2349,36 +2389,42 @@ 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 @@ -2449,24 +2495,31 @@ AI_CV_RainDance: 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_End + score +2 AI_CV_RainDance_End: end @@ -2477,15 +2530,15 @@ AI_CV_SunnyDay: if_equal AI_WEATHER_RAIN, AI_CV_SunnyDay2 if_equal AI_WEATHER_SANDSTORM, AI_CV_SunnyDay2 goto AI_CV_SunnyDay_End - AI_CV_SunnyDay2: score +1 goto AI_CV_SunnyDay_End - AI_CV_SunnyDay_ScoreDown1: score -1 - AI_CV_SunnyDay_End: + get_hold_effect AI_USER + if_not_equal HOLD_EFFECT_HEAT_ROCK, AI_Ret + score +2 end AI_CV_BellyDrum: @@ -2674,17 +2727,52 @@ 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_Ret + 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_End +AI_CV_Hail_AbilityPlus: + 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 AI_CV_Facade: if_not_status AI_TARGET, STATUS1_POISON | STATUS1_BURN | STATUS1_PARALYSIS | STATUS1_TOXIC_POISON, AI_CV_Facade_End diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 8416d89398..b04db678f8 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1875,7 +1875,6 @@ BattleScript_EffectFrustration: BattleScript_EffectEruption: BattleScript_EffectPledge: BattleScript_EffectFling: -BattleScript_EffectNaturalGift: BattleScript_EffectWringOut: BattleScript_EffectHex: BattleScript_EffectAssurance: @@ -1933,6 +1932,36 @@ BattleScript_HitFromAtkAnimation:: 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:: orhalfword gMoveResultFlags, MOVE_RESULT_MISSED diff --git a/include/battle_util.h b/include/battle_util.h index 130a533433..e9ad59ca73 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -32,6 +32,16 @@ #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[]; + u8 GetBattlerForBattleScript(u8 caseId); void PressurePPLose(u8 target, u8 attacker, u16 move); void PressurePPLoseOnUsingPerishSong(u8 attacker); diff --git a/include/constants/battle_ai.h b/include/constants/battle_ai.h index 4c3a45dc6c..238f5fc4cc 100644 --- a/include/constants/battle_ai.h +++ b/include/constants/battle_ai.h @@ -23,10 +23,11 @@ #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 diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index d0ed6c3572..b4098ea7d5 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -12,6 +12,30 @@ // 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 diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index d13a84fc19..8639cf0bd8 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -140,6 +140,7 @@ #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 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 34d239ab00..1abc0ef227 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -165,6 +165,7 @@ static void BattleAICmd_if_has_no_move_with_split(void); static void BattleAICmd_if_physical_moves_unusable(void); static void BattleAICmd_if_ai_can_go_down(void); static void BattleAICmd_if_has_move_with_type(void); +static void BattleAICmd_if_no_move_used(void); // ewram EWRAM_DATA const u8 *gAIScriptPtr = NULL; @@ -285,6 +286,7 @@ static const BattleAICmdFunc sBattleAICmdTable[] = BattleAICmd_if_physical_moves_unusable, // 0x6B BattleAICmd_if_ai_can_go_down, // 0x6C BattleAICmd_if_has_move_with_type, // 0x6D + BattleAICmd_if_no_move_used, // 0x6E }; static const u16 sDiscouragedPowerfulMoveEffects[] = @@ -1554,14 +1556,9 @@ static void BattleAICmd_get_considered_move_effect(void) static void BattleAICmd_get_ability(void) { - u8 battlerId; + u8 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); - if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; - else - battlerId = gBattlerTarget; - - if (gActiveBattler != battlerId) + if (!IsBattlerAIControlled(battlerId)) { if (BATTLE_HISTORY->abilities[battlerId] != 0) { @@ -1614,7 +1611,7 @@ static void BattleAICmd_check_ability(void) u32 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); u32 ability = gAIScriptPtr[2]; - if (gAIScriptPtr[1] == AI_TARGET || gAIScriptPtr[1] == AI_TARGET_PARTNER) + if (!IsBattlerAIControlled(battlerId)) { if (BATTLE_HISTORY->abilities[battlerId] != ABILITY_NONE) { @@ -1841,12 +1838,14 @@ static void BattleAICmd_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; } @@ -2202,17 +2201,12 @@ static void BattleAICmd_watch(void) static void BattleAICmd_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; } @@ -2715,3 +2709,25 @@ static void BattleAICmd_if_has_move_with_type(void) else gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); } + +static void BattleAICmd_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].moves[i] != 0 && BATTLE_HISTORY->usedMoves[battler].moves[i] != 0xFFFF) + { + gAIScriptPtr += 6; + return; + } + } + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); + } + else + { + gAIScriptPtr += 6; + } +} diff --git a/src/battle_main.c b/src/battle_main.c index fd95a82e21..46a1b547c5 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5051,6 +5051,11 @@ void SetTypeBeforeUsingMove(u16 move, u8 battlerAtk) 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); @@ -5063,6 +5068,7 @@ void SetTypeBeforeUsingMove(u16 move, u8 battlerAtk) && 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)) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 3b6a217154..7b94070b06 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6569,6 +6569,12 @@ static void atk76_various(void) else gBattlescriptCurrInstr += 7; return; + 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) diff --git a/src/battle_util.c b/src/battle_util.c index 1bab3706b6..d98f39d331 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4945,6 +4945,77 @@ 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; @@ -5015,7 +5086,7 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) basePower *= 2; break; case EFFECT_NATURAL_GIFT: - // todo + basePower = gNaturalGiftTable[ITEM_TO_BERRY(gBattleMons[battlerAtk].item)].power; break; case EFFECT_WAKE_UP_SLAP: if (gBattleMons[battlerDef].status1 & STATUS1_SLEEP) From e00890a5559b452b2dbbb82a4b2dcb464aa79707 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 20 May 2019 12:20:49 +0200 Subject: [PATCH 373/667] Fix Air Baloon msg --- data/battle_scripts_1.s | 2 +- include/battle.h | 1 + src/battle_util.c | 51 ++++++++++++++++++++++------------------- 3 files changed, 30 insertions(+), 24 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index b04db678f8..a4d81c0b57 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6902,7 +6902,7 @@ BattleScript_ItemHealHP_End2:: BattleScript_AirBaloonMsgIn:: printstring STRINGID_AIRBALLOONFLOAT waitmessage 0x40 - end2 + end3 BattleScript_AirBaloonMsgPop:: printstring STRINGID_AIRBALLOONPOP diff --git a/include/battle.h b/include/battle.h index 16822bb1a9..4e43cbcfbd 100644 --- a/include/battle.h +++ b/include/battle.h @@ -165,6 +165,7 @@ struct SpecialStatus u8 sturdied:1; u8 stormDrainRedirected:1; u8 switchInAbilityDone:1; + u8 switchInItemDone:1; u8 instructedChosenTarget:3; u8 berryReduced:1; u8 gemBoost:1; diff --git a/src/battle_util.c b/src/battle_util.c index d98f39d331..857b48abcf 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3746,35 +3746,40 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) 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] < 6) + 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] = 6; - effect = ITEM_STATS_CHANGE; + if (gBattleMons[battlerId].statStages[i] < 6) + { + gBattleMons[battlerId].statStages[i] = 6; + effect = ITEM_STATS_CHANGE; + } } + if (effect) + { + gBattleScripting.battler = battlerId; + gPotentialItemEffectBattler = battlerId; + gActiveBattler = gBattlerAttacker = battlerId; + BattleScriptExecute(BattleScript_WhiteHerbEnd2); + } + 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); - } - break; - case HOLD_EFFECT_AIR_BALLOON: - effect = ITEM_EFFECT_OTHER; - gBattleScripting.battler = battlerId; - BattleScriptExecute(BattleScript_AirBaloonMsgIn); - RecordItemEffectBattle(battlerId, HOLD_EFFECT_AIR_BALLOON); - break; + gSpecialStatuses[battlerId].switchInItemDone = 1; } break; case 1: From 8e904ebacbf2a2f528f96693d9b6a30be5283dbc Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 20 May 2019 14:36:46 +0200 Subject: [PATCH 374/667] helping hand ai --- data/battle_ai_scripts.s | 4 ++-- src/battle_debug.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 951a74dc56..459ad16a29 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -3372,7 +3372,7 @@ AI_ConsiderAllyChosenMoveRet: 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_Minus3 + if_equal 0, Score_Minus5 end AI_ConsiderAllyKnownMoves: @@ -3383,7 +3383,7 @@ AI_ConsiderAllyKnownMoves: end AI_HelpingHandInDoubles: - if_has_no_attacking_moves AI_USER_PARTNER, Score_Minus3 + if_has_no_attacking_moves AI_USER_PARTNER, Score_Minus5 end AI_DoubleBattle: diff --git a/src/battle_debug.c b/src/battle_debug.c index 07dea8729c..5f3fde6894 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -1342,7 +1342,7 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) data->modifyArrows.minValue = 0; data->modifyArrows.maxValue = 255; data->modifyArrows.maxDigits = 3; - data->modifyArrows.modifiedValPtr = &gBattleResources->ai->score; + data->modifyArrows.modifiedValPtr = gBattleResources->ai->score; data->modifyArrows.typeOfVal = VAL_S8; data->modifyArrows.currValue = gBattleResources->ai->score[data->currentSecondaryListItemId]; break; From 28227dfd88f823e00076544e9f17655304680dee Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 23 May 2019 09:20:02 +0200 Subject: [PATCH 375/667] Fix Life Orb string --- src/battle_script_commands.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 7b94070b06..ab036f3754 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4607,6 +4607,7 @@ static void atk49_moveend(void) effect = TRUE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_ItemHurtRet; + gLastUsedItem = gBattleMons[gBattlerAttacker].item; } gBattleScripting.atk49_state++; break; From 01ee73adf6e5ecb375bdd1687e97f4880cd365b5 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 23 May 2019 09:47:21 +0200 Subject: [PATCH 376/667] Fix Flame Body Static ability pop-up activation --- src/battle_util.c | 63 ++++++++++++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 22 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 857b48abcf..770c99bed0 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3301,53 +3301,68 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } 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) - && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GRASS) + if (!IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GRASS) && GetBattlerAbility(gBattlerAttacker) != ABILITY_OVERCOAT - && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOOGLES - && (Random() % 10) == 0) + && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOOGLES) { - do + 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) + && !IsFlowerVeilProtected(gBattlerAttacker) + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && (Random() % 3) == 0) { - gBattleScripting.moveEffect = Random() & 3; - } while (gBattleScripting.moveEffect == 0); - - if (gBattleScripting.moveEffect == MOVE_EFFECT_BURN) - gBattleScripting.moveEffect += 2; // 5 MOVE_EFFECT_PARALYSIS - - gBattleScripting.moveEffect += MOVE_EFFECT_AFFECTS_USER; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_AbilityStatusEffect; - PREPARE_ABILITY_BUFFER(gBattleTextBuff1, ABILITY_EFFECT_SPORE); - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - effect++; + 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) + && !IsFlowerVeilProtected(gBattlerAttacker) && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) && (Random() % 3) == 0) { gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_POISON; - PREPARE_ABILITY_BUFFER(gBattleTextBuff1, ABILITY_POISON_POINT); + 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 + && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ELECTRIC) + && GetBattlerAbility(gBattlerAttacker) != ABILITY_LIMBER + && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY) + && !IsFlowerVeilProtected(gBattlerAttacker) && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) && (Random() % 3) == 0) { @@ -3364,6 +3379,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && !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) + && !IsFlowerVeilProtected(gBattlerAttacker) && (Random() % 3) == 0) { gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_BURN; From 1b7493e47a11dfd93afd20ded9646eea0c8e342c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 23 May 2019 10:02:04 +0200 Subject: [PATCH 377/667] Fix Flame Burst crashing the game --- data/battle_scripts_1.s | 12 ++++++++---- src/battle_script_commands.c | 1 - 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index a4d81c0b57..81376ed3c5 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -737,12 +737,16 @@ BattleScript_EffectFlameBurst: goto BattleScript_EffectHit BattleScript_MoveEffectFlameBurst:: + tryfaintmon BS_TARGET, FALSE, NULL printstring STRINGID_BURSTINGFLAMESHIT waitmessage 0x40 - healthbarupdate BS_SCRIPTING - datahpupdate BS_SCRIPTING - tryfaintmon BS_SCRIPTING, FALSE, NULL - return + savetarget + copybyte gBattlerTarget, sBATTLER + healthbarupdate BS_TARGET + datahpupdate BS_TARGET + tryfaintmon BS_TARGET, FALSE, NULL + restoretarget + goto BattleScript_MoveEnd BattleScript_EffectPowerTrick: attackcanceler diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ab036f3754..e8e7865b04 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2794,7 +2794,6 @@ void SetMoveEffect(bool32 primary, u32 certain) gBattleMoveDamage = gBattleMons[BATTLE_PARTNER(gBattlerTarget)].hp / 16; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; - BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_MoveEffectFlameBurst; } break; From 32aeba21e0ad395c0d74cce98d967b6de48239ab Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 23 May 2019 11:41:35 +0200 Subject: [PATCH 378/667] Some AI tweaking --- asm/macros/battle_ai_script.inc | 7 ++ data/battle_ai_scripts.s | 197 ++++++++++++++++++++++--------- src/battle_ai_script_commands.c | 203 +++++++++++--------------------- src/battle_script_commands.c | 6 +- src/data/battle_moves.h | 2 +- 5 files changed, 220 insertions(+), 195 deletions(-) diff --git a/asm/macros/battle_ai_script.inc b/asm/macros/battle_ai_script.inc index 2a3b687882..b80a7b90f8 100644 --- a/asm/macros/battle_ai_script.inc +++ b/asm/macros/battle_ai_script.inc @@ -633,6 +633,13 @@ .4byte \ptr .endm + .macro if_has_move_with_flag battler:req, flag:req, ptr:req + .byte 0x6E + .byte \battler + .4byte \flag + .4byte \ptr + .endm + @ useful script macros .macro if_has_physical_move battler:req, ptr:req if_has_move_with_split \battler, SPLIT_PHYSICAL, \ptr diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 459ad16a29..e07497c5fc 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -253,6 +253,14 @@ AI_CheckBadMove_CheckEffect: @ 82DC045 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 + 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: @@ -964,6 +972,7 @@ AI_CheckViability: if_effect EFFECT_SUPER_FANG, AI_CV_SuperFang if_effect EFFECT_TRAP, AI_CV_Trap 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 @@ -979,7 +988,9 @@ 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 @@ -987,7 +998,7 @@ AI_CheckViability: 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 @@ -1056,8 +1067,23 @@ AI_CheckViability: 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 end +AI_CV_Hazards: + if_ability AI_TARGET, ABILITY_MAGIC_BOUNCE, + is_first_turn_for AI_USER + if_equal 0, AI_CV_StealthRockEnd + score +2 +AI_CV_StealthRockEnd: + end +AI_CV_StealthRock2: + score -2 + goto AI_CV_StealthRockEnd + AI_CV_MistyTerrain: call AI_CV_TerrainExpander end @@ -1520,11 +1546,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 @@ -1629,17 +1653,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 @@ -1756,41 +1787,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 @@ -1852,16 +1888,26 @@ AI_CV_SuperFang_End: AI_CV_Trap: 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 + if_status3 AI_TARGET, STATUS3_PERISH_SONG, AI_CV_Trap5 + 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: @@ -1877,6 +1923,18 @@ 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_has_move AI_USER, MOVE_PSYCH_UP, AI_CV_SwaggerHasPsychUp @@ -1912,18 +1970,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 @@ -1939,13 +2009,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 @@ -2281,14 +2364,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 @@ -2314,29 +2400,30 @@ 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, 6, 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 @@ -3141,25 +3228,29 @@ AI_TryToFaint: get_how_powerful_move_is if_equal MOVE_NOT_MOST_POWERFUL, Score_Minus1 if_type_effectiveness AI_EFFECTIVENESS_x4, AI_TryToFaint_DoubleSuperEffective - end - + goto AI_TryToFaint_InDanger AI_TryToFaint_DoubleSuperEffective: - if_random_less_than 80, AI_TryToFaint_End + if_random_less_than 80, AI_TryToFaint_InDanger score +2 - end - + goto AI_TryToFaint_InDanger AI_TryToFaint_TryToEncourageQuickAttack: - if_effect EFFECT_EXPLOSION, AI_TryToFaint_End + if_effect EFFECT_EXPLOSION, AI_TryToFaint_InDanger if_user_faster AI_TryToFaint_ScoreUp4 if_move_flag FLAG_HIGH_CRIT AI_TryToFaint_ScoreUp4 score +2 - end - + goto AI_TryToFaint_InDanger AI_TryToFaint_ScoreUp4: score +4 - +AI_TryToFaint_InDanger: + if_target_faster AI_TryToFaint_End + if_ai_can_go_down AI_TryToFaint_IsInDanger AI_TryToFaint_End: end +AI_TryToFaint_IsInDanger: + get_how_powerful_move_is + if not_equal MOVE_MOST_POWERFUL Score_Minus1 + score +1 + goto AI_TryToFaint_End AI_SetupFirstTurn: if_target_is_ally AI_Ret diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 1abc0ef227..d907eeba60 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -166,6 +166,7 @@ static void BattleAICmd_if_physical_moves_unusable(void); static void BattleAICmd_if_ai_can_go_down(void); static void BattleAICmd_if_has_move_with_type(void); static void BattleAICmd_if_no_move_used(void); +static void BattleAICmd_if_has_move_with_flag(void); // ewram EWRAM_DATA const u8 *gAIScriptPtr = NULL; @@ -287,6 +288,7 @@ static const BattleAICmdFunc sBattleAICmdTable[] = BattleAICmd_if_ai_can_go_down, // 0x6C BattleAICmd_if_has_move_with_type, // 0x6D BattleAICmd_if_no_move_used, // 0x6E + BattleAICmd_if_has_move_with_flag, // 0x6F }; static const u16 sDiscouragedPowerfulMoveEffects[] = @@ -895,14 +897,25 @@ static void BattleAICmd_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 BattleAICmd_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); @@ -912,12 +925,7 @@ static void BattleAICmd_if_hp_less_than(void) static void BattleAICmd_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); @@ -927,12 +935,7 @@ static void BattleAICmd_if_hp_more_than(void) static void BattleAICmd_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); @@ -942,12 +945,7 @@ static void BattleAICmd_if_hp_equal(void) static void BattleAICmd_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); @@ -957,15 +955,8 @@ static void BattleAICmd_if_hp_not_equal(void) static void BattleAICmd_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); @@ -975,15 +966,8 @@ static void BattleAICmd_if_status(void) static void BattleAICmd_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); @@ -993,15 +977,8 @@ static void BattleAICmd_if_not_status(void) static void BattleAICmd_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); @@ -1011,15 +988,8 @@ static void BattleAICmd_if_status2(void) static void BattleAICmd_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); @@ -1029,15 +999,8 @@ static void BattleAICmd_if_not_status2(void) static void BattleAICmd_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); @@ -1047,15 +1010,8 @@ static void BattleAICmd_if_status3(void) static void BattleAICmd_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); @@ -1065,16 +1021,9 @@ static void BattleAICmd_if_not_status3(void) static void BattleAICmd_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); @@ -1084,16 +1033,9 @@ static void BattleAICmd_if_side_affecting(void) static void BattleAICmd_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); @@ -1322,22 +1264,6 @@ static void BattleAICmd_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 BattleAICmd_is_of_type(void) { u8 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); @@ -1765,17 +1691,7 @@ static void BattleAICmd_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; @@ -1802,17 +1718,7 @@ static void BattleAICmd_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; @@ -1930,7 +1836,7 @@ static void BattleAICmd_if_can_faint(void) { s32 dmg; - if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power < 2) + if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power == 0) { gAIScriptPtr += 5; return; @@ -2710,6 +2616,29 @@ static void BattleAICmd_if_has_move_with_type(void) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); } +static void BattleAICmd_if_has_move_with_flag(void) +{ + u32 i, flag, battler = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + u16 *moves; + + if (IsBattlerAIControlled(battler)) + moves = gBattleMons[battler].moves; + else + moves = BATTLE_HISTORY->usedMoves[battler].moves; + + 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 BattleAICmd_if_no_move_used(void) { u32 i, battler = BattleAI_GetWantedBattler(gAIScriptPtr[1]); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e8e7865b04..841997c979 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7949,7 +7949,7 @@ static void atk84_jumpifcantmakeasleep(void) static void atk85_stockpile(void) { - if (gDisableStructs[gBattlerAttacker].stockpileCounter == 3) + if (gDisableStructs[gBattlerAttacker].stockpileCounter >= 3) { gMoveResultFlags |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = 1; @@ -7957,9 +7957,7 @@ static void atk85_stockpile(void) else { gDisableStructs[gBattlerAttacker].stockpileCounter++; - - PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gDisableStructs[gBattlerAttacker].stockpileCounter) - + PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gDisableStructs[gBattlerAttacker].stockpileCounter); gBattleCommunication[MULTISTRING_CHOOSER] = 0; } gBattlescriptCurrInstr++; diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index cc6f45aded..f51a1f36ff 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -3223,7 +3223,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_SWEET_SCENT] = { - .effect = EFFECT_EVASION_DOWN, + .effect = EFFECT_EVASION_DOWN_2, .power = 0, .type = TYPE_NORMAL, .accuracy = 100, From 76c52876295dddcbf200265c45d849d68598d86b Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 23 May 2019 12:32:14 +0200 Subject: [PATCH 379/667] Bug Bite --- data/battle_ai_scripts.s | 4 ++-- data/battle_scripts_1.s | 10 ++++++++++ include/battle_scripts.h | 1 + include/constants/battle.h | 1 + include/constants/battle_move_effects.h | 1 + include/constants/battle_string_ids.h | 1 + src/battle_message.c | 2 ++ src/battle_script_commands.c | 13 +++++++++++++ src/data/battle_moves.h | 4 ++-- 9 files changed, 33 insertions(+), 4 deletions(-) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index e07497c5fc..cbc48b7592 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -1074,7 +1074,7 @@ AI_CheckViability: end AI_CV_Hazards: - if_ability AI_TARGET, ABILITY_MAGIC_BOUNCE, + if_ability AI_TARGET, ABILITY_MAGIC_BOUNCE, AI_CV_StealthRockEnd is_first_turn_for AI_USER if_equal 0, AI_CV_StealthRockEnd score +2 @@ -3248,7 +3248,7 @@ AI_TryToFaint_End: end AI_TryToFaint_IsInDanger: get_how_powerful_move_is - if not_equal MOVE_MOST_POWERFUL Score_Minus1 + if_not_equal MOVE_MOST_POWERFUL, Score_Minus1 score +1 goto AI_TryToFaint_End diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 81376ed3c5..44ce1fdbf0 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -354,6 +354,11 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectMagneticFlux .4byte BattleScript_EffectGearUp .4byte BattleScript_EffectIncinerate + .4byte BattleScript_EffectBugBite + +BattleScript_EffectBugBite: + setmoveeffect MOVE_EFFECT_BUG_BITE | MOVE_EFFECT_CERTAIN + goto BattleScript_EffectHit BattleScript_EffectIncinerate: setmoveeffect MOVE_EFFECT_INCINERATE | MOVE_EFFECT_CERTAIN @@ -363,6 +368,11 @@ 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 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 8b5e3c18d8..3e33c4ead6 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -322,5 +322,6 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle.h b/include/constants/battle.h index c36da4753a..48dea68eb7 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -331,6 +331,7 @@ #define MOVE_EFFECT_CORE_ENFORCER 0x42 #define MOVE_EFFECT_THROAT_CHOP 0x43 #define MOVE_EFFECT_INCINERATE 0x44 +#define MOVE_EFFECT_BUG_BITE 0x45 #define MOVE_EFFECT_AFFECTS_USER 0x4000 #define MOVE_EFFECT_CERTAIN 0x8000 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 778b24b01d..ea4a76591e 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -342,5 +342,6 @@ #define EFFECT_MAGNETIC_FLUX 336 #define EFFECT_GEAR_UP 337 #define EFFECT_INCINERATE 338 +#define EFFECT_BUG_BITE 339 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 49cf4836da..d422379737 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -538,6 +538,7 @@ #define STRINGID_AIRBALLOONFLOAT 534 #define STRINGID_AIRBALLOONPOP 535 #define STRINGID_INCINERATEBURN 536 +#define STRINGID_BUGBITE 537 #define BATTLESTRINGS_COUNT 530 diff --git a/src/battle_message.c b/src/battle_message.c index 7a23c2ba37..ce13672658 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -663,9 +663,11 @@ static const u8 sText_TargetAteItem[] = _("{B_DEF_NAME_WITH_PREFIX} ate its {B_L 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}!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_BUGBITE - 12] = sText_BugBite, [STRINGID_INCINERATEBURN - 12] = sText_IncinerateBurn, [STRINGID_AIRBALLOONPOP - 12] = sText_AirBalloonPop, [STRINGID_AIRBALLOONFLOAT - 12] = sText_AirBalloonFloat, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 841997c979..12c207314f 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2890,6 +2890,19 @@ void SetMoveEffect(bool32 primary, u32 certain) 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; + gActiveBattler = gEffectBattler; + BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gEffectBattler].item); + MarkBattlerForControllerExec(gActiveBattler); + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectBugBite; + } + break; } } } diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index f51a1f36ff..964f831dcc 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -5117,7 +5117,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_PLUCK] = { - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (Bug Bite and Pluck should have the same move effect) + .effect = EFFECT_BUG_BITE, .power = 60, .type = TYPE_FLYING, .accuracy = 100, @@ -6311,7 +6311,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_BUG_BITE] = { - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect (Bug Bite and Pluck should have the same move effect) + .effect = EFFECT_BUG_BITE, .power = 60, .type = TYPE_BUG, .accuracy = 100, From 65be7868eccd3d227bf38a60f74f2e912c8cef62 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 23 May 2019 12:38:41 +0200 Subject: [PATCH 380/667] Fix string --- src/battle_message.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_message.c b/src/battle_message.c index ce13672658..752f18e5c5 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -630,7 +630,7 @@ static const u8 sText_TargetElectrified[] = _("The opposing {B_ATK_NAME_WITH_PRE 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 reacting\nto {B_ATK_TRAINER_NAME}'s Mega Ring!"); +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 "); From ad63540522fe5d3295bb5c9190e17354fae6cee9 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 24 May 2019 11:27:02 +0200 Subject: [PATCH 381/667] Fix mega evo issues --- src/battle_interface.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/battle_interface.c b/src/battle_interface.c index 38d2702117..5f48a908bb 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -692,7 +692,7 @@ u8 CreateBattlerHealthboxSprites(u8 battlerId) healthBarSpritePtr->invisible = TRUE; // Create mega indicator sprite if is a mega evolved mon. - if (gBattleStruct->mega.alreadyEvolved[GetBattlerPosition(battlerId)]) + if (gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(battlerId)] & gBitTable[gBattlerPartyIndexes[battlerId]]) CreateMegaIndicatorSprite(battlerId, 0); return healthboxLeftSpriteId; @@ -875,7 +875,7 @@ static void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl) u8 battler = gSprites[healthboxSpriteId].hMain_Battler; // Don't print Lv char if mon is mega evolved. - if (gBattleStruct->mega.alreadyEvolved[GetBattlerPosition(battler)]) + if (gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(battler)] & gBitTable[gBattlerPartyIndexes[battler]]) { xPos = (u32) ConvertIntToDecimalStringN(text, lvl, STR_CONV_MODE_LEFT_ALIGN, 3); } @@ -1340,15 +1340,15 @@ void DestroyMegaTriggerSprite(void) static const s8 sIndicatorPosSingles[][2] = { [B_POSITION_PLAYER_LEFT] = {53, -8}, - [B_POSITION_OPPONENT_LEFT] = {53, -8}, + [B_POSITION_OPPONENT_LEFT] = {45, -8}, }; static const s8 sIndicatorPosDoubles[][2] = { [B_POSITION_PLAYER_LEFT] = {53, -8}, - [B_POSITION_OPPONENT_LEFT] = {53, -8}, + [B_POSITION_OPPONENT_LEFT] = {45, -8}, [B_POSITION_PLAYER_RIGHT] = {53, -8}, - [B_POSITION_OPPONENT_RIGHT] = {53, -8}, + [B_POSITION_OPPONENT_RIGHT] = {45, -8}, }; void CreateMegaIndicatorSprite(u32 battlerId, u32 which) From 30bd85a58ae9ad9210e1e0784528ad64b33492f2 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 10 Jun 2019 11:32:23 +0200 Subject: [PATCH 382/667] Fix changed name --- src/item_use.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/item_use.c b/src/item_use.c index c0c2866018..cf5ca5b222 100755 --- a/src/item_use.c +++ b/src/item_use.c @@ -922,19 +922,19 @@ void ItemUseInBattle_PokeBall(u8 taskId) if (IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) && IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT))) // There are two present pokemon. { - u8 textCantThrowPokeBall[] = _("Cannot throw a ball!\nThere are two pokemon out there!\p"); + static const u8 textCantThrowPokeBall[] = _("Cannot throw a ball!\nThere are two pokemon out there!\p"); if (!InBattlePyramid()) - DisplayItemMessage(taskId, 1, textCantThrowPokeBall, bag_menu_inits_lists_menu); + DisplayItemMessage(taskId, 1, textCantThrowPokeBall, BagMenu_InitListsMenu); else DisplayItemMessageInBattlePyramid(taskId, textCantThrowPokeBall, sub_81C6714); } else if (gBattlerInMenuId == GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT)) // Attempting to throw a ball with the second pokemon. { - u8 textCantThrowPokeBall[] = _("Cannot throw a ball!\p"); + static const u8 textCantThrowPokeBall[] = _("Cannot throw a ball!\p"); if (!InBattlePyramid()) - DisplayItemMessage(taskId, 1, textCantThrowPokeBall, bag_menu_inits_lists_menu); + DisplayItemMessage(taskId, 1, textCantThrowPokeBall, BagMenu_InitListsMenu); else DisplayItemMessageInBattlePyramid(taskId, textCantThrowPokeBall, sub_81C6714); } From 272fa07799a70820c073dbfc16db93f2770b6301 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 11 Jun 2019 10:45:12 +0200 Subject: [PATCH 383/667] AI switch mons if all moves are not usable --- include/battle.h | 1 + include/battle_ai_script_commands.h | 1 + src/battle_ai_script_commands.c | 49 ++++++++++++++++++++--------- src/battle_ai_switch_items.c | 17 ++++++++++ src/battle_controller_opponent.c | 3 ++ 5 files changed, 56 insertions(+), 15 deletions(-) diff --git a/include/battle.h b/include/battle.h index 4e43cbcfbd..4f7d59a458 100644 --- a/include/battle.h +++ b/include/battle.h @@ -249,6 +249,7 @@ struct AI_ThinkingStruct u8 aiLogicId; u8 simulatedRNG[4]; struct AI_SavedBattleMon saved[4]; + bool8 switchMon; // Because all available moves have no/little effect. }; struct UsedMoves diff --git a/include/battle_ai_script_commands.h b/include/battle_ai_script_commands.h index 47c6bda9c4..eb5d046d89 100644 --- a/include/battle_ai_script_commands.h +++ b/include/battle_ai_script_commands.h @@ -5,6 +5,7 @@ // 0 - 3 are move idx #define AI_CHOICE_FLEE 4 #define AI_CHOICE_WATCH 5 +#define AI_CHOICE_SWITCH 7 s32 AI_CalcDamage(u16 move, u8 battlerAtk, u8 battlerDef); s32 AI_CalcPartyMonDamage(u16 move, u8 battlerAtk, u8 battlerDef, struct Pokemon *mon); diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index d907eeba60..75fa2f63e0 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -54,6 +54,7 @@ static void RecordLastUsedMoveByTarget(void); static void BattleAI_DoAIProcessing(void); static void AIStackPushVar(const u8 *); static bool8 AIStackPop(void); +static s32 CountUsablePartyMons(u8 battlerId); static void BattleAICmd_if_random_less_than(void); static void BattleAICmd_if_random_greater_than(void); @@ -448,6 +449,28 @@ static u8 ChooseMoveOrAction_Singles(void) if (AI_THINKING_STRUCT->aiAction & AI_ACTION_WATCH) return AI_CHOICE_WATCH; + // Consider switching if all moves are worthless to use. + if (AI_THINKING_STRUCT->aiFlags & (AI_SCRIPT_CHECK_VIABILITY | AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_PREFER_BATON_PASS) + && CountUsablePartyMons(sBattler_AI) >= 1 + && gBattleMons[sBattler_AI].hp >= gBattleMons[sBattler_AI].maxHP / 2 + && !(gBattleTypeFlags & BATTLE_TYPE_PALACE)) + { + 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; + } + + gActiveBattler = sBattler_AI; + if (i == MAX_MON_MOVES && GetMostSuitableMonToSwitchInto() != PARTY_SIZE) + { + AI_THINKING_STRUCT->switchMon = TRUE; + return AI_CHOICE_SWITCH; + } + } + numOfBestMoves = 1; currentMoveArray[0] = AI_THINKING_STRUCT->score[0]; consideredMoveArray[0] = 0; @@ -1422,19 +1445,10 @@ static void BattleAICmd_nullsub_2B(void) { } -static void BattleAICmd_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; @@ -1443,10 +1457,8 @@ static void BattleAICmd_count_usable_party_mons(void) if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { - u32 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. { @@ -1454,6 +1466,7 @@ static void BattleAICmd_count_usable_party_mons(void) battlerOnField2 = gBattlerPartyIndexes[battlerId]; } + ret = 0; for (i = 0; i < PARTY_SIZE; i++) { if (i != battlerOnField1 && i != battlerOnField2 @@ -1461,10 +1474,16 @@ static void BattleAICmd_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 BattleAICmd_count_usable_party_mons(void) +{ + AI_THINKING_STRUCT->funcResult = CountUsablePartyMons(BattleAI_GetWantedBattler(gAIScriptPtr[1])); gAIScriptPtr += 2; } diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index a45356502d..02f524a24d 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -37,6 +37,21 @@ void GetAIPartyIndexes(u32 battlerId, s32 *firstId, s32 *lastId) } } +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 @@ -474,6 +489,8 @@ static bool8 ShouldSwitch(void) if (availableToSwitch == 0) return FALSE; + if (ShouldSwitchIfAllBadMoves()) + return TRUE; if (ShouldSwitchIfPerishSong()) return TRUE; if (ShouldSwitchIfWonderGuard()) diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 68e6de91e6..d94b47423a 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -1551,6 +1551,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; From dd5c9c790dde9f8f245d4dbb2604a6a1310322d6 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 11 Jun 2019 10:57:02 +0200 Subject: [PATCH 384/667] Fix Flash Fire string --- src/battle_util.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 770c99bed0..2c8e0debf2 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3109,7 +3109,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss; gBattleResources->flags->flags[battler] |= RESOURCE_FLAG_FLASH_FIRE; - effect = 2; + effect = 3; } else { @@ -3119,7 +3119,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA else gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss; - effect = 2; + effect = 3; } } break; From 594b3637306a081d056bac29d01831b68d336a47 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 12 Jun 2019 13:57:14 +0200 Subject: [PATCH 385/667] Fix Assurance --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 2c8e0debf2..8846286387 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5128,7 +5128,7 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) basePower *= 2; break; case EFFECT_ASSURANCE: - if (gSpecialStatuses[battlerDef].physicalDmg != 0 || gSpecialStatuses[battlerDef].specialDmg != 0) + if (gProtectStructs[battlerAtk].physicalDmg != 0 || gProtectStructs[battlerAtk].specialDmg != 0) basePower *= 2; break; case EFFECT_TRUMP_CARD: From aaea5398f41a519f3a04cd5691c63c683ed18fbd Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 14 Jun 2019 12:58:29 +0200 Subject: [PATCH 386/667] Fix Castfrom ability pop-up and refactor one function --- data/battle_scripts_1.s | 1 + src/battle_gfx_sfx_util.c | 195 ++++++++++++++------------------------ 2 files changed, 74 insertions(+), 122 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 44ce1fdbf0..50494a1bde 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6257,6 +6257,7 @@ BattleScript_CastformChange:: end3 BattleScript_82DB4AF:: + copybyte gBattlerAbility, sBATTLER call BattleScript_AbilityPopUp docastformchangeanimation waitstate diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 9dceb3c56b..339974701d 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -505,16 +505,12 @@ 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; monsPersonality = GetMonData(mon, MON_DATA_PERSONALITY); - if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies == SPECIES_NONE) { species = GetMonData(mon, MON_DATA_SPECIES); @@ -528,9 +524,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; @@ -558,71 +572,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 = GetFrontSpritePalFromSpeciesAndPersonality(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) @@ -849,11 +806,52 @@ void CopyBattleSpriteInvisibility(u8 battlerId) 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->field_18->unk2; + personalityValue = gContestResources->field_18->unk8; + otId = gContestResources->field_18->unkC; + + HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[targetSpecies], + gMonSpritesGfxPtr->sprites[0], + targetSpecies, + gContestResources->field_18->unk10); + } + 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) { @@ -870,53 +868,6 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool8 notTransform } else { - const void *src; - void *dst; - u16 targetSpecies; - - if (IsContest()) - { - position = 0; - targetSpecies = gContestResources->field_18->unk2; - personalityValue = gContestResources->field_18->unk8; - otId = gContestResources->field_18->unkC; - - HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[targetSpecies], - gMonSpritesGfxPtr->sprites[0], - targetSpecies, - gContestResources->field_18->unk10); - } - 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 *)(VRAM + 0x10000 + gSprites[gBattlerSpriteIds[battlerAtk]].oam.tileNum * 32); DmaCopy32(3, src, dst, 0x800); From c80861d85ec0b1b48c73f1809946789652c74607 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 15 Jun 2019 14:46:35 +0200 Subject: [PATCH 387/667] Add hopefully support for Cherrim --- include/battle_util.h | 2 +- src/battle_gfx_sfx_util.c | 5 +- src/battle_script_commands.c | 2 +- src/battle_util.c | 92 ++++++++++++++++++++---------------- 4 files changed, 56 insertions(+), 45 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index e9ad59ca73..3832292617 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -71,7 +71,7 @@ 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); diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 339974701d..5cb15671d1 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -23,6 +23,7 @@ #include "palette.h" #include "contest.h" #include "constants/songs.h" +#include "constants/battle_config.h" #include "constants/rgb.h" extern struct MusicPlayerInfo gMPlayInfo_SE1; @@ -557,7 +558,7 @@ static void BattleLoadMonSpriteGfx(struct Pokemon *mon, u32 battlerId, bool32 op 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]); @@ -876,7 +877,7 @@ 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]); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 12c207314f..51f924e24c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10864,7 +10864,7 @@ static void atkE7_trycastformdatachange(void) u8 form; gBattlescriptCurrInstr++; - form = CastformDataTypeChange(gBattleScripting.battler); + form = TryWeatherFormChange(gBattleScripting.battler); if (form) { BattleScriptPushCursorAndCallback(BattleScript_CastformChange); diff --git a/src/battle_util.c b/src/battle_util.c index 8846286387..3ebe46e01d 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2578,50 +2578,59 @@ 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; -u8 CastformDataTypeChange(u8 battler) -{ - 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 (gBattleMons[battler].species == SPECIES_CASTFORM) { - SET_BATTLER_TYPE(battler, TYPE_NORMAL); - return CASTFORM_TO_NORMAL; + 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; + } } - 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 (gBattleMons[battler].species == SPECIES_CHERRIM) { - SET_BATTLER_TYPE(battler, TYPE_NORMAL); - formChange = CASTFORM_TO_NORMAL; + if (gBattleMons[battler].ability != ABILITY_FLOWER_GIFT || gBattleMons[battler].hp == 0) + ret = 0; + else if (gBattleMonForms[battler] == 0 && weatherEffect && gBattleWeather & WEATHER_SUN_ANY) + ret = 3; + else if (gBattleMonForms[battler] != 0 && (!weatherEffect || !(gBattleWeather & WEATHER_SUN_ANY))) + ret = 1; } - 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 ret; } - static const u16 sWeatherFlagsInfo[][3] = { [ENUM_WEATHER_RAIN] = {WEATHER_RAIN_TEMPORARY, WEATHER_RAIN_PERMANENT, HOLD_EFFECT_DAMP_ROCK}, @@ -2915,7 +2924,8 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } break; case ABILITY_FORECAST: - effect = CastformDataTypeChange(battler); + case ABILITY_FLOWER_GIFT: + effect = TryWeatherFormChange(battler); if (effect != 0) { BattleScriptPushCursorAndCallback(BattleScript_CastformChange); @@ -2935,7 +2945,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA // that's a weird choice for a variable, why not use i or battler? for (target1 = 0; target1 < gBattlersCount; target1++) { - effect = CastformDataTypeChange(target1); + effect = TryWeatherFormChange(target1); if (effect != 0) { BattleScriptPushCursorAndCallback(BattleScript_CastformChange); @@ -3500,9 +3510,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA case ABILITYEFFECT_FORECAST: // 6 for (battler = 0; battler < gBattlersCount; battler++) { - if (gBattleMons[battler].ability == ABILITY_FORECAST) + if (gBattleMons[battler].ability == ABILITY_FORECAST || gBattleMons[battler].ability == ABILITY_FLOWER_GIFT) { - effect = CastformDataTypeChange(battler); + effect = TryWeatherFormChange(battler); if (effect) { BattleScriptPushCursorAndCallback(BattleScript_CastformChange); From aade9f5f5abc1715c33451bf9a78a3b708d3450d Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 16 Jun 2019 09:30:05 +0200 Subject: [PATCH 388/667] Cherrim --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 3ebe46e01d..cb968a5193 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2624,7 +2624,7 @@ u8 TryWeatherFormChange(u8 battler) if (gBattleMons[battler].ability != ABILITY_FLOWER_GIFT || gBattleMons[battler].hp == 0) ret = 0; else if (gBattleMonForms[battler] == 0 && weatherEffect && gBattleWeather & WEATHER_SUN_ANY) - ret = 3; + ret = 2; else if (gBattleMonForms[battler] != 0 && (!weatherEffect || !(gBattleWeather & WEATHER_SUN_ANY))) ret = 1; } From 10c27ac6a6eb2c3a7273a311159442029d17a405 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 25 Jun 2019 12:26:27 +0200 Subject: [PATCH 389/667] Fix a typo that crashes the gamae --- asm/macros/battle_ai_script.inc | 2 +- data/battle_ai_scripts.s | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/asm/macros/battle_ai_script.inc b/asm/macros/battle_ai_script.inc index b80a7b90f8..fa70c4d253 100644 --- a/asm/macros/battle_ai_script.inc +++ b/asm/macros/battle_ai_script.inc @@ -634,7 +634,7 @@ .endm .macro if_has_move_with_flag battler:req, flag:req, ptr:req - .byte 0x6E + .byte 0x6F .byte \battler .4byte \flag .4byte \ptr diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index cbc48b7592..a7a5efad85 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -1923,7 +1923,7 @@ 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: From 48c801245cd893d5965f71d7dbfbf3ac79f7c11c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 25 Jun 2019 13:04:14 +0200 Subject: [PATCH 390/667] Fix Synchronize --- include/battle.h | 2 +- src/battle_util.c | 48 ++++++++++++++++++++++++++++------------------- 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/include/battle.h b/include/battle.h index 4f7d59a458..43682348ad 100644 --- a/include/battle.h +++ b/include/battle.h @@ -474,7 +474,7 @@ struct BattleStruct u32 savedBattleTypeFlags; u8 abilityPreventingSwitchout; u8 hpScale; - u8 synchronizeMoveEffect; + u16 synchronizeMoveEffect; bool8 anyMonHasTransformed; void (*savedCallback)(void); u16 usedHeldItems[MAX_BATTLERS_COUNT]; diff --git a/src/battle_util.c b/src/battle_util.c index cb968a5193..c4158c3874 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3527,32 +3527,42 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA 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; - gBattleScripting.moveEffect = gBattleStruct->synchronizeMoveEffect + MOVE_EFFECT_AFFECTS_USER; - gBattleScripting.battler = gBattlerTarget; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SynchronizeActivates; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - 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); - 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 = gBattlerAttacker; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SynchronizeActivates; - gHitMarker |= HITMARKER_IGNORE_SAFEGUARD; - 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: // 9 @@ -3635,7 +3645,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gBattleResources->flags->flags[i] &= ~(RESOURCE_FLAG_INTIMIDATED); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_IntimidateActivates; - gBattleStruct->intimidateBattler = i; + gBattlerAbility = gBattleStruct->intimidateBattler = i; effect++; break; } From c14cc798af29701002a0776162f8ffaca1437610 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 28 Jun 2019 09:30:35 +0200 Subject: [PATCH 391/667] Add bs cap to switching --- src/battle_ai_script_commands.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 75fa2f63e0..bc624a5540 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -421,6 +421,16 @@ 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; +} + static u8 ChooseMoveOrAction_Singles(void) { u8 currentMoveArray[4]; @@ -452,6 +462,7 @@ static u8 ChooseMoveOrAction_Singles(void) // Consider switching if all moves are worthless to use. if (AI_THINKING_STRUCT->aiFlags & (AI_SCRIPT_CHECK_VIABILITY | AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_PREFER_BATON_PASS) && CountUsablePartyMons(sBattler_AI) >= 1 + && GetTotalBaseStat(gBattleMons[sBattler_AI].species) >= 310 // Mon is not weak. && gBattleMons[sBattler_AI].hp >= gBattleMons[sBattler_AI].maxHP / 2 && !(gBattleTypeFlags & BATTLE_TYPE_PALACE)) { From 5f7b5ba453a8f5313aba9116866136ca2e091f48 Mon Sep 17 00:00:00 2001 From: Karathan Date: Tue, 2 Jul 2019 06:22:05 +0200 Subject: [PATCH 392/667] add feint and pluck animation sprites and implementations --- data/battle_anim_scripts.s | 36 ++++- graphics/battle_anims/sprites/feint-punch.png | Bin 0 -> 236 bytes graphics/battle_anims/sprites/seed-new.png | Bin 0 -> 238 bytes include/constants/battle_anim.h | 8 +- include/graphics.h | 4 + src/battle_anim.c | 4 + src/battle_anim_effects_1.c | 141 ++++++++++++++++++ src/graphics.c | 5 + 8 files changed, 194 insertions(+), 4 deletions(-) create mode 100644 graphics/battle_anims/sprites/feint-punch.png create mode 100644 graphics/battle_anims/sprites/seed-new.png diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index d838029648..e093b6d690 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -134,7 +134,7 @@ gBattleAnims_Moves:: .4byte Move_FOCUS_ENERGY .4byte Move_BIDE .4byte Move_METRONOME - .4byte Move_MIRROR_MOVE @ doesnt have an actual animation + .4byte Move_MIRROR_MOVE @ doesn�t have an actual animation .4byte Move_SELF_DESTRUCT .4byte Move_EGG_BOMB .4byte Move_LICK @@ -894,9 +894,43 @@ Move_NATURAL_GIFT: end Move_FEINT: + loadspritegfx ANIM_TAG_FEINT + createsprite gFeintSwipeSpriteTemplate, ANIM_ATTACKER, 10, -32, 0, 15 + playsewithpan SE_W013B, SOUND_PAN_ATTACKER + delay 15 + playsewithpan SE_W013B, SOUND_PAN_ATTACKER + delay 15 + waitforvisualfinish + delay 5 + createsprite gFeintZoomSpriteTemplate, ANIM_ATTACKER, 10, 0, 0 + playsewithpan SE_W025B, SOUND_PAN_TARGET + waitforvisualfinish end Move_PLUCK: + loadspritegfx ANIM_TAG_SEED_BROWN + loadspritegfx ANIM_TAG_IMPACT + playsewithpan SE_W077, SOUND_PAN_ATTACKER + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -5, 1, 2 + createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30, 2, 1 + createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 2, 7, 1, 20, 1, 1 + createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 2, -3, 5, 40, 2, -1 + createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 2, 4, -4, 50, 3, -1 + delay 30 + playsewithpan SE_W077, SOUND_PAN_ATTACKER + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 5, 10, 1, 2 + createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 2, 3, -4, 30, 1, 1 + createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 2, 7, -6, 20, 0, 1 + createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 2, -3, -9, 40, 1, -1 + createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 2, 4, -4, 50, 2, -1 + delay 30 + playsewithpan SE_W077, SOUND_PAN_ATTACKER + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 2 + createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 2, -3, -4, 30, 1, 1 + createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 2, 7, -6, 50, 0, 1 + createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 2, -4, -10, 40, 1, 1 + createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 2, 4, -4, 40, 1, 2 + waitforvisualfinish end Move_TAILWIND: diff --git a/graphics/battle_anims/sprites/feint-punch.png b/graphics/battle_anims/sprites/feint-punch.png new file mode 100644 index 0000000000000000000000000000000000000000..5769415193f8436787b8da3cefbd02d0e6fc6b03 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e{s5m4*VGbSATu*7tEH~}|Ns9Y zKa8IP`HUq&e!&b5&u*lFI7!~_E({&4vK~MVXMsm#F#`j)FbFd;%$g$s6l5>)^mS!_ z%+AEZ%qo$5qa7#|=IP=X;&D7VL4tKLgLHz33mcP3pu&Dzq(#-`_>Hw>%niic3>7^s)dDPJgX}e8JPdLI^a~>NJ2M^Um$__g@nLa#J_%%M zNswPK!+%t8AfVeBC>P-A;us<^b?$jC8leBs_&k|nkLtDf%Qg#{U&X}1g{52vlZOvjkpBa5>2P*!CR5LOhVtn6T Sb4(a$HiM_DpUXO@geCw0HB>_Y literal 0 HcmV?d00001 diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index add0fbbae6..921677d3e0 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -300,9 +300,11 @@ #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_MEGA_STONE (ANIM_SPRITES_START + 293) -#define ANIM_TAG_MEGA_SYMBOL (ANIM_SPRITES_START + 294) -#define ANIM_TAG_MEGA_PARTICLES (ANIM_SPRITES_START + 295) +#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) // battlers #define ANIM_ATTACKER 0 diff --git a/include/graphics.h b/include/graphics.h index 20963d4256..a6772fc724 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -4137,6 +4137,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[]; @@ -4417,6 +4419,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[]; diff --git a/src/battle_anim.c b/src/battle_anim.c index 7442a04cfc..fd65e40cbd 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -1418,6 +1418,8 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {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}, @@ -1718,6 +1720,8 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_PurpleJab, ANIM_TAG_PURPLE_JAB}, {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}, diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index 600b59b8b2..cfcdca6d2b 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -29,6 +29,7 @@ void AnimPetalDanceBigFlower(struct Sprite *); void AnimPetalDanceSmallFlower(struct Sprite *); void AnimRazorLeafParticle(struct Sprite *); void AnimLeechSeed(struct Sprite *); +static void AnimPluck(struct Sprite *); void AnimTranslateLinearSingleSineWave(struct Sprite *); void AnimMoveTwisterParticle(struct Sprite *); void AnimConstrictBinding(struct Sprite *); @@ -153,6 +154,8 @@ static void sub_8103300(struct Sprite *); static void sub_8103320(struct Sprite *); static void sub_81033F0(struct Sprite *); static void sub_810342C(struct Sprite *); +static void AnimMoveFeintSwipe(struct Sprite *); +static void AnimMoveFeintZoom(struct Sprite *); const union AnimCmd gUnknown_085920F0[] = { @@ -172,6 +175,40 @@ const union AnimCmd *const gUnknown_08592114[] = gUnknown_085920F0, }; +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 * const sFeintAffineAnims[] = { + sFeintAffineZoom, +}; + +const struct SpriteTemplate gFeintSwipeSpriteTemplate = +{ + .tileTag = ANIM_TAG_FEINT, + .paletteTag = ANIM_TAG_FEINT, + .oam = &gUnknown_0852497C, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMoveFeintSwipe, +}; + +const struct SpriteTemplate gFeintZoomSpriteTemplate = +{ + .tileTag = ANIM_TAG_FEINT, + .paletteTag = ANIM_TAG_FEINT, + .oam = &gUnknown_0852497C, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = sFeintAffineAnims, + .callback = AnimMoveFeintZoom, +}; + const struct SpriteTemplate gSleepPowderParticleSpriteTemplate = { .tileTag = ANIM_TAG_SLEEP_POWDER, @@ -404,6 +441,17 @@ const struct SpriteTemplate gLeechSeedSpriteTemplate = .callback = AnimLeechSeed, }; +const struct SpriteTemplate gPluckParticleSpriteTemplate = +{ + .tileTag = ANIM_TAG_SEED_BROWN, + .paletteTag = ANIM_TAG_SEED_BROWN, + .oam = &gUnknown_0852490C, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimPluck, +}; + const union AnimCmd gUnknown_085922D4[] = { ANIMCMD_FRAME(0, 1), @@ -2636,6 +2684,99 @@ static void AnimHyperBeamOrbStep(struct Sprite* sprite) } } +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; +} + // seed (sprouts a sapling from a seed.) // Used by Leech Seed. // arg 0: initial x pixel offset diff --git a/src/graphics.c b/src/graphics.c index 93bf9a7b57..4d5c2f7536 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -48,6 +48,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"); @@ -55,6 +56,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"); @@ -114,6 +116,9 @@ 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_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"); From 501ae2739079ab4075e12af35d2c40e0cfe6512f Mon Sep 17 00:00:00 2001 From: Karathan Date: Tue, 2 Jul 2019 18:26:59 +0200 Subject: [PATCH 393/667] add trump card, fix a few issues with pluck --- data/battle_anim_scripts.s | 71 +++++-- .../sprites/trump-card-particles.png | Bin 0 -> 140 bytes graphics/battle_anims/sprites/trump-cards.png | Bin 0 -> 143 bytes include/constants/battle_anim.h | 2 + include/graphics.h | 4 + src/battle_anim.c | 4 + src/battle_anim_effects_1.c | 194 +++++++++++++++++- src/graphics.c | 6 + 8 files changed, 265 insertions(+), 16 deletions(-) create mode 100644 graphics/battle_anims/sprites/trump-card-particles.png create mode 100644 graphics/battle_anims/sprites/trump-cards.png diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index e093b6d690..8d7e14d6a7 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -911,25 +911,25 @@ Move_PLUCK: loadspritegfx ANIM_TAG_SEED_BROWN loadspritegfx ANIM_TAG_IMPACT playsewithpan SE_W077, SOUND_PAN_ATTACKER - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, -5, 1, 2 - createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 2, 3, 0, 30, 2, 1 - createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 2, 7, 1, 20, 1, 1 - createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 2, -3, 5, 40, 2, -1 - createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 2, 4, -4, 50, 3, -1 + 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_W077, SOUND_PAN_ATTACKER - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 5, 10, 1, 2 - createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 2, 3, -4, 30, 1, 1 - createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 2, 7, -6, 20, 0, 1 - createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 2, -3, -9, 40, 1, -1 - createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 2, 4, -4, 50, 2, -1 + 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_W077, SOUND_PAN_ATTACKER - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 2 - createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 2, -3, -4, 30, 1, 1 - createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 2, 7, -6, 50, 0, 1 - createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 2, -4, -10, 40, 1, 1 - createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 2, 4, -4, 40, 1, 2 + 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 @@ -1163,6 +1163,47 @@ Move_PSYCHO_SHIFT: 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_W013B, 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_W013B, 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_W013B, 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_W013B, SOUND_PAN_TARGET + playsewithpan SE_W015, 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: 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 0000000000000000000000000000000000000000..cec1a463cd69dce456ea81ace2cb1093f7f29220 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^96&6=!3-onu=^+hDaPU;cPEB*=VV?2IXnSAA+A6= zBjWe}?CfvvGydzd9R~7QN`m}?8UFwOzggFz1IU;2ba4#fn38bg=d#Wzp$PzJrYAT6 literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/trump-cards.png b/graphics/battle_anims/sprites/trump-cards.png new file mode 100644 index 0000000000000000000000000000000000000000..64c3b00167e625dcaf3e685c554e5e8236e3f155 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoQ!3-qz8@W<}6k~CayA#8@b22Z19G(E55LY0b z5%K$fcJ{aT8UOX!4g>itB|(0{4FCWC->mD<0pu%sx;TbtOiWHt;5TqOC?K+cGoh(T kQNuy_01vBk0E0dQLxUTWVEMw{uRz5Np00i_>zopr0HGQtBLDyZ literal 0 HcmV?d00001 diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index 921677d3e0..5fb55fcf7b 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -305,6 +305,8 @@ #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) // battlers #define ANIM_ATTACKER 0 diff --git a/include/graphics.h b/include/graphics.h index a6772fc724..19fe39b164 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -4411,6 +4411,8 @@ 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 gBattleAnimSpritePal_Bone[]; extern const u32 gBattleAnimSpritePal_Spark[]; @@ -4696,6 +4698,8 @@ 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 gBattleAnimBgImage_Dark[]; extern const u32 gBattleAnimBgImage_Ghost[]; diff --git a/src/battle_anim.c b/src/battle_anim.c index fd65e40cbd..78f2073dde 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -1423,6 +1423,8 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {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}, }; const struct CompressedSpritePalette gBattleAnimPaletteTable[] = @@ -1725,6 +1727,8 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {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}, }; const struct BattleAnimBackground gBattleAnimBackgroundTable[] = diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index cfcdca6d2b..c2655fd44d 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -156,6 +156,8 @@ static void sub_81033F0(struct Sprite *); static void sub_810342C(struct Sprite *); static void AnimMoveFeintSwipe(struct Sprite *); static void AnimMoveFeintZoom(struct Sprite *); +static void AnimMoveTrumpCard(struct Sprite *); +static void AnimMoveTrumpCardParticle(struct Sprite* sprite); const union AnimCmd gUnknown_085920F0[] = { @@ -183,10 +185,122 @@ static const union AffineAnimCmd sFeintAffineZoom[] = AFFINEANIMCMD_END, }; -static const union AffineAnimCmd * const sFeintAffineAnims[] = { +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, +}; + +const struct SpriteTemplate gTrumpCardParticleSpriteTempalte = +{ + .tileTag = ANIM_TAG_TRUMP_CARD_PARTICLES, + .paletteTag = ANIM_TAG_TRUMP_CARD_PARTICLES, + .oam = &gUnknown_085249C4, + .anims = sTrumpCardParticleAnims, + .images = NULL, + .affineAnims = sTrumpCardAffineAnims, + .callback = AnimMoveTrumpCardParticle +}; + +const struct SpriteTemplate gTrumpCardSpriteTemplate = +{ + .tileTag = ANIM_TAG_TRUMP_CARD, + .paletteTag = ANIM_TAG_TRUMP_CARD, + .oam = &gUnknown_085249CC, + .anims = sTrumpCardAnims, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMoveTrumpCard +}; + const struct SpriteTemplate gFeintSwipeSpriteTemplate = { .tileTag = ANIM_TAG_FEINT, @@ -2777,6 +2891,84 @@ static void AnimMoveFeintZoom(struct Sprite* sprite) 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; +} + // seed (sprouts a sapling from a seed.) // Used by Leech Seed. // arg 0: initial x pixel offset diff --git a/src/graphics.c b/src/graphics.c index 4d5c2f7536..043dab6dea 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -119,6 +119,12 @@ const u32 gBattleAnimSpriteGfx_WavingHand[] = INCBIN_U32("graphics/battle_anims/ 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_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"); From f1c82abc7e01c2e617d00ad3e7f789a8b02de477 Mon Sep 17 00:00:00 2001 From: Karathan Date: Tue, 2 Jul 2019 18:32:42 +0200 Subject: [PATCH 394/667] fix change requests --- data/battle_anim_scripts.s | 2 +- .../sprites/{seed-new.png => seed_new.png} | Bin ...-card-particles.png => trump_card_particles.png} | Bin .../sprites/{trump-cards.png => trump_cards.png} | Bin src/graphics.c | 12 ++++++------ 5 files changed, 7 insertions(+), 7 deletions(-) rename graphics/battle_anims/sprites/{seed-new.png => seed_new.png} (100%) rename graphics/battle_anims/sprites/{trump-card-particles.png => trump_card_particles.png} (100%) rename graphics/battle_anims/sprites/{trump-cards.png => trump_cards.png} (100%) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 8d7e14d6a7..507d6ccdc7 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -134,7 +134,7 @@ gBattleAnims_Moves:: .4byte Move_FOCUS_ENERGY .4byte Move_BIDE .4byte Move_METRONOME - .4byte Move_MIRROR_MOVE @ doesn�t have an actual animation + .4byte Move_MIRROR_MOVE @ doesn't have an actual animation .4byte Move_SELF_DESTRUCT .4byte Move_EGG_BOMB .4byte Move_LICK diff --git a/graphics/battle_anims/sprites/seed-new.png b/graphics/battle_anims/sprites/seed_new.png similarity index 100% rename from graphics/battle_anims/sprites/seed-new.png rename to graphics/battle_anims/sprites/seed_new.png diff --git a/graphics/battle_anims/sprites/trump-card-particles.png b/graphics/battle_anims/sprites/trump_card_particles.png similarity index 100% rename from graphics/battle_anims/sprites/trump-card-particles.png rename to graphics/battle_anims/sprites/trump_card_particles.png diff --git a/graphics/battle_anims/sprites/trump-cards.png b/graphics/battle_anims/sprites/trump_cards.png similarity index 100% rename from graphics/battle_anims/sprites/trump-cards.png rename to graphics/battle_anims/sprites/trump_cards.png diff --git a/src/graphics.c b/src/graphics.c index 043dab6dea..c7783221ae 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -48,7 +48,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 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"); @@ -56,7 +56,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 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"); @@ -119,11 +119,11 @@ const u32 gBattleAnimSpriteGfx_WavingHand[] = INCBIN_U32("graphics/battle_anims/ 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_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_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_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"); From e9884154a9231eb85b93203d342938be560d4fd2 Mon Sep 17 00:00:00 2001 From: Karathan Date: Wed, 3 Jul 2019 03:02:22 +0200 Subject: [PATCH 395/667] added acupressure and wring out --- data/battle_anim_scripts.s | 8 ++ data/battle_scripts_1.s | 2 + .../battle_anims/sprites/accupressure.png | Bin 0 -> 358 bytes graphics/battle_anims/sprites/wring_out.png | Bin 0 -> 271 bytes include/constants/battle_anim.h | 2 + include/graphics.h | 5 + src/battle_anim.c | 4 + src/battle_anim_effects_1.c | 117 ++++++++++++++++++ src/graphics.c | 6 + 9 files changed, 144 insertions(+) create mode 100644 graphics/battle_anims/sprites/accupressure.png create mode 100644 graphics/battle_anims/sprites/wring_out.png diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 507d6ccdc7..b60538e0b7 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -968,6 +968,11 @@ Move_TAILWIND: 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: @@ -1231,6 +1236,9 @@ Move_HEAL_BLOCK: end Move_WRING_OUT: + loadspritegfx ANIM_TAG_WRING_OUT + createsprite gWringOutHandSpriteTemplate, ANIM_TARGET, 40, 0, 0, 48, 3, 32 + waitforvisualfinish end Move_POWER_TRICK: diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 50494a1bde..c2d89a7d56 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -608,6 +608,8 @@ 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 diff --git a/graphics/battle_anims/sprites/accupressure.png b/graphics/battle_anims/sprites/accupressure.png new file mode 100644 index 0000000000000000000000000000000000000000..0da836ff3fec4d52d5a2d30f4ae9cffb83aac295 GIT binary patch literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvxd5LKS0D`p5gri<0SP-+95}Gy z#Elydz~IG)4t8*0pd71sZz_izopr07S5TX#fBK literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/wring_out.png b/graphics/battle_anims/sprites/wring_out.png new file mode 100644 index 0000000000000000000000000000000000000000..b96ffdbd2ef8a2299ba41e449ec322afb52c2af9 GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|L<4+6T=R=^ zflNz@JZ=ldrPZ!4!i{7)70{IRo za5yjBc<28K<~fDIC+e;rIeJ5VTF;a~yMBT0gjeqT-e+dV+)~cdyd*x4f%`zoa+S&UVh$R= zE-+7QmtWeks_FE*_pAnwe67z{96$X$(Jqi*?bnJpCOea-d;Z0UYkp?=)sYss8R$R; MPgg&ebxsLQ0G_&SY5)KL literal 0 HcmV?d00001 diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index 5fb55fcf7b..48b921bd06 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -307,6 +307,8 @@ #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) // battlers #define ANIM_ATTACKER 0 diff --git a/include/graphics.h b/include/graphics.h index 19fe39b164..ab012b3475 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -4413,6 +4413,8 @@ 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 gBattleAnimSpritePal_Bone[]; extern const u32 gBattleAnimSpritePal_Spark[]; @@ -4700,6 +4702,8 @@ 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 gBattleAnimBgImage_Dark[]; extern const u32 gBattleAnimBgImage_Ghost[]; @@ -4753,6 +4757,7 @@ extern const u32 gBattleAnimBgTilemap_InAir[]; extern const u32 gBattleAnimBgTilemap_Aurora[]; extern const u32 gBattleAnimBgTilemap_Fissure[]; + extern const u32 gMetalShineGfx[]; extern const u32 gMetalShinePalette[]; extern const u32 gMetalShineTilemap[]; diff --git a/src/battle_anim.c b/src/battle_anim.c index 78f2073dde..bfbe10520a 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -1425,6 +1425,8 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {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}, }; const struct CompressedSpritePalette gBattleAnimPaletteTable[] = @@ -1729,6 +1731,8 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {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} }; const struct BattleAnimBackground gBattleAnimBackgroundTable[] = diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index c2655fd44d..35b311e72a 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -158,6 +158,8 @@ 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); const union AnimCmd gUnknown_085920F0[] = { @@ -279,6 +281,47 @@ static const union AnimCmd * const sTrumpCardParticleAnims[] = 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 +}; + +const struct SpriteTemplate gAccupressureSpriteTemplate = +{ + .tileTag = ANIM_TAG_ACCUPRESSURE, + .paletteTag = ANIM_TAG_ACCUPRESSURE, + .oam = &gUnknown_085249D4, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = sAccupressureAffineAnims, + .callback = AnimMoveAccupressure, +}; + +const struct SpriteTemplate gWringOutHandSpriteTemplate = +{ + .tileTag = ANIM_TAG_WRING_OUT, + .paletteTag = ANIM_TAG_WRING_OUT, + .oam = &gUnknown_085249D4, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMoveWringOut, +}; + const struct SpriteTemplate gTrumpCardParticleSpriteTempalte = { .tileTag = ANIM_TAG_TRUMP_CARD_PARTICLES, @@ -2969,6 +3012,80 @@ static void AnimMoveTrumpCardParticle(struct Sprite* sprite) 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) + { + AGBPrintf("Hit the crit section: step: %d, angle: %d", sprite->data[0], sprite->data[3]); + sprite->data[3] = (sprite->data[0] + sprite->data[3]) % 256; + sprite->data[1]--; + AGBPrintf("Crit New angle: %d", sprite->data[3]); + } + else + { + AGBPrintf("New angle: %d", sprite->data[3]); + 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); + 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 diff --git a/src/graphics.c b/src/graphics.c index c7783221ae..6419ab66f6 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -125,6 +125,12 @@ const u32 gBattleAnimSpritePal_TrumpCard[] = INCBIN_U32("graphics/battle_anims/s 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"); From 8126662cfb6507288a18b58961c50bfddcb099e6 Mon Sep 17 00:00:00 2001 From: Karathan Date: Wed, 3 Jul 2019 14:10:29 +0200 Subject: [PATCH 396/667] update wring out with trace, remove AGBPrintf --- data/battle_anim_scripts.s | 17 ++++++++++++++++- src/battle_anim_effects_1.c | 7 ++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index b60538e0b7..eca8d65f93 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1237,7 +1237,22 @@ Move_HEAL_BLOCK: Move_WRING_OUT: loadspritegfx ANIM_TAG_WRING_OUT - createsprite gWringOutHandSpriteTemplate, ANIM_TARGET, 40, 0, 0, 48, 3, 32 + 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 diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index 35b311e72a..537230d196 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -3053,14 +3053,11 @@ static void AnimMoveWringOutCircle(struct Sprite* sprite) { if(sprite->data[3] + sprite->data[0] >= 256) { - AGBPrintf("Hit the crit section: step: %d, angle: %d", sprite->data[0], sprite->data[3]); sprite->data[3] = (sprite->data[0] + sprite->data[3]) % 256; sprite->data[1]--; - AGBPrintf("Crit New angle: %d", sprite->data[3]); } else { - AGBPrintf("New angle: %d", sprite->data[3]); sprite->data[3] += sprite->data[0]; } @@ -3079,6 +3076,10 @@ static void AnimMoveWringOutCircle(struct Sprite* 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 From d9b54c3c1c161606bc427bdc570883fab39e66e1 Mon Sep 17 00:00:00 2001 From: Karathan Date: Sat, 6 Jul 2019 05:22:18 +0200 Subject: [PATCH 397/667] add power swap, guard swap, worry seed --- data/battle_anim_scripts.s | 89 ++++++++++++++ .../battle_anims/sprites/colored_orbs.png | Bin 0 -> 432 bytes graphics/battle_anims/sprites/small_cloud.png | Bin 0 -> 183 bytes graphics/battle_anims/sprites/worry_seed.png | Bin 0 -> 317 bytes include/constants/battle_anim.h | 3 + include/graphics.h | 6 + src/battle_anim.c | 8 +- src/battle_anim_effects_1.c | 110 ++++++++++++++++++ src/graphics.c | 9 ++ src/normal.c | 91 +++++++++++++++ 10 files changed, 315 insertions(+), 1 deletion(-) create mode 100644 graphics/battle_anims/sprites/colored_orbs.png create mode 100644 graphics/battle_anims/sprites/small_cloud.png create mode 100644 graphics/battle_anims/sprites/worry_seed.png diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index eca8d65f93..0d05554f2a 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1336,9 +1336,87 @@ Move_COPYCAT: end Move_POWER_SWAP: + loadspritegfx ANIM_TAG_COLORED_ORBS + playsewithpan SE_W104, 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_W104, 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_W104, 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_W104, 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_W104, 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_W104, 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_W104, 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_W104, 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: @@ -1348,6 +1426,17 @@ Move_LAST_RESORT: end Move_WORRY_SEED: + loadspritegfx ANIM_TAG_WORRY_SEED + loadspritegfx ANIM_TAG_SMALL_CLOUD + playsewithpan SE_W077, SOUND_PAN_ATTACKER + createsprite gWorrySeedSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 32, -32 + waitforvisualfinish + playsewithpan SE_W028, 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: diff --git a/graphics/battle_anims/sprites/colored_orbs.png b/graphics/battle_anims/sprites/colored_orbs.png new file mode 100644 index 0000000000000000000000000000000000000000..3bd3a55dd31f62dcedb260f8d682edb4a4919a60 GIT binary patch literal 432 zcmeAS@N?(olHy`uVBq!ia0vp^0zjO=!3-po`I#mGDaPU;cPEB*=VV?2IR*hfA+A80 zL0C?mo7=_3B}Ybv!8|N2Esepqa*dJEK7Df&k0SgK8W9|G&+1M(?TE^88RCpc6pYBoewypZeyxw7aMexKed{Om*9R<%7J_C3o1I&UV(c{72|%ji;BmUJ5AytNxSc3w29H_e~g u3Ugi-*m;>C=dFf1&-c8@f!Obtx61$L72Q8cf$I$@v^`z@T-G@yGywo)S+{Ed literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/small_cloud.png b/graphics/battle_anims/sprites/small_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..2733a71dca46be9d0253e118d5ec7cfe452990af GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~{s5m4S0F7R zp-@oJaNxv+4<9~Qbhjx0g;-01{DK+&1A)v1HIPZJo-U3d5>s3IFLE&`a4;|b_W%Bz zOG&K(-3Q?r%A?s&C>EvF3uOnx|Gg_Y#+rzu1>lyVGu~amOZuS5w1$ Y_FVdQ&MBb@0LocDH2?qr literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/worry_seed.png b/graphics/battle_anims/sprites/worry_seed.png new file mode 100644 index 0000000000000000000000000000000000000000..2f6d68b29453f51254dcb6eab1dc858f66d0e37d GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDU1=4IB%*ral=DPAu7MjjB zN`W34i9yD(A;v}VCUx0v9hI(2dqa+|&c403^zE72X|Ip+0QE4I1o;IsI6S+N2I3@n zySp%Su*!M>Ih+L^k;M!Q+`=Ht$S`Y;1W=H@#M9T6{V_WmqlU0>-cgVv+B{txLpZJ{ zCp0j>GqvVcb?muUo?kwV+rVJM-2ea6zRpx)V|)4g|9`#wc$SnofB%20aBXFDzJ6=> z^7OT@1QJ%Ph}pYn(ITe?#XYspdOqdata[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) diff --git a/src/graphics.c b/src/graphics.c index 6419ab66f6..7fd71cf731 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -166,6 +166,15 @@ 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 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"); diff --git a/src/normal.c b/src/normal.c index 2b592e1998..293d1931ce 100644 --- a/src/normal.c +++ b/src/normal.c @@ -35,6 +35,7 @@ static void sub_81161F4(void); static void sub_81162F8(u8); static void sub_81163D0(struct Sprite *); static void sub_81165E4(struct Sprite *); +static void AnimMovePowerSwapGuardSwap(struct Sprite *); const union AnimCmd gUnknown_0859722C[] = { @@ -93,6 +94,63 @@ const struct SpriteTemplate gComplexPaletteBlendSpriteTemplate = .callback = sub_81158A4, }; +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 = &gUnknown_0852490C, + .anims = sPowerSwapGuardSwapAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMovePowerSwapGuardSwap +}; + const union AnimCmd gUnknown_085972A4[] = { ANIMCMD_FRAME(0, 3), @@ -253,6 +311,39 @@ const struct SpriteTemplate gUnknown_08597400 = .callback = sub_81163D0, }; +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 From bcffc2655e0401bb129787d39f60137be1a9575c Mon Sep 17 00:00:00 2001 From: Karathan Date: Sat, 6 Jul 2019 05:25:56 +0200 Subject: [PATCH 398/667] fix style issues --- .../{feint-punch.png => feint_punch.png} | Bin src/battle_anim_effects_1.c | 42 +++++++++--------- src/graphics.c | 4 +- 3 files changed, 23 insertions(+), 23 deletions(-) rename graphics/battle_anims/sprites/{feint-punch.png => feint_punch.png} (100%) diff --git a/graphics/battle_anims/sprites/feint-punch.png b/graphics/battle_anims/sprites/feint_punch.png similarity index 100% rename from graphics/battle_anims/sprites/feint-punch.png rename to graphics/battle_anims/sprites/feint_punch.png diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index 94ec21a801..e731fbf3f3 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -2994,26 +2994,26 @@ 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); - } + 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; - } + case 1: + if(AnimTranslateLinear(sprite)) + { + sprite->callback = DestroyAnimSprite; + } break; } @@ -3126,14 +3126,14 @@ static void AnimMoveAccupressureTransition(struct Sprite* sprite) { switch(sprite->data[5]) { - case 0: + case 0: if(AnimTranslateLinear(sprite)) { StartSpriteAffineAnim(sprite, 1); sprite->data[5]++; } break; - case 1: + case 1: if(sprite->affineAnimEnded) { DestroyAnimSprite(sprite); diff --git a/src/graphics.c b/src/graphics.c index 7fd71cf731..7a31edea58 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -116,8 +116,8 @@ 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_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"); From d1fa9c24cc6f7df0fe38e926e6bcca80314db501 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 7 Jul 2019 09:58:36 +0200 Subject: [PATCH 399/667] Fix Wory Seed string --- src/battle_message.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_message.c b/src/battle_message.c index 752f18e5c5..df34a220fe 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -530,7 +530,7 @@ static const u8 sText_PkmnsAbilitySuppressed[] = _("{B_DEF_NAME_WITH_PREFIX}'s a 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_LAST_ABILITY}!"); +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!"); From d3d9051c4aec52d3525a8b25f3f111199c5b4ffd Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 8 Jul 2019 13:26:21 +0200 Subject: [PATCH 400/667] Allow evolution after exp from mon catching --- src/battle_main.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/battle_main.c b/src/battle_main.c index 46a1b547c5..1569f3a3a8 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4887,14 +4887,14 @@ 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 = ReturnFromBattleToOverworld; - return; + gBattleMainFunc = TryEvolvePokemon; } else { - gBattleMainFunc = TryEvolvePokemon; + gBattleMainFunc = ReturnFromBattleToOverworld; + return; } } @@ -5724,5 +5724,3 @@ static void HandleAction_ActionFinished(void) gBattleScripting.multihitMoveEffect = 0; gBattleResources->battleScriptsStack->size = 0; } - - From 3e476adf4ae09057370de96fb48e8f4293dcb6bf Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 9 Jul 2019 19:06:12 +0200 Subject: [PATCH 401/667] Stockpile gen4 effect and fixed spit up --- asm/macros/battle_script.inc | 3 +- data/battle_scripts_1.s | 26 ++++++++++-- include/battle.h | 4 ++ src/battle_script_commands.c | 79 ++++++++++++++++++++++++------------ 4 files changed, 81 insertions(+), 31 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 835ae9ddee..01571f84a7 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -729,8 +729,9 @@ .4byte \param0 .endm - .macro stockpile + .macro stockpile id:req .byte 0x85 + .byte \id .endm .macro stockpiletobasedamage param0:req diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index c2d89a7d56..9dbc7bdba1 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3946,11 +3946,30 @@ 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_CHANGE_BS_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_CHANGE_BS_PTR, BattleScript_EffectStockpileEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_EffectStockpileEnd + printfromtable gStatUpStringIds + waitmessage 0x40 +BattleScript_EffectStockpileEnd: + stockpile 1 goto BattleScript_MoveEnd BattleScript_EffectSpitUp:: @@ -3959,9 +3978,10 @@ BattleScript_EffectSpitUp:: attackstring ppreduce accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - stockpiletobasedamage BattleScript_SpitUpFail - typecalc + setbyte gIsCriticalHit, FALSE + damagecalc adjustdamage + stockpiletobasedamage BattleScript_SpitUpFail goto BattleScript_HitFromAtkAnimation BattleScript_SpitUpFail:: pause 0x20 diff --git a/include/battle.h b/include/battle.h index 43682348ad..552e1446ca 100644 --- a/include/battle.h +++ b/include/battle.h @@ -82,6 +82,10 @@ struct DisableStruct u16 encoredMove; u8 protectUses; u8 stockpileCounter; + s8 stockpileDef; + s8 stockpileSpDef; + s8 stockpileBeforeDef; + s8 stockpileBeforeSpDef; u8 substituteHP; u8 disableTimer:4; u8 disableTimerStartValue:4; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 51f924e24c..f5d921da12 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7962,18 +7962,33 @@ static void atk84_jumpifcantmakeasleep(void) static void atk85_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 atk86_stockpiletobasedamage(void) @@ -7986,11 +8001,12 @@ static void atk86_stockpiletobasedamage(void) else { if (gBattleCommunication[6] != 1) - { gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter; - } 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; } } @@ -8004,25 +8020,32 @@ static void atk87_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; } } @@ -8276,6 +8299,8 @@ static void atk8A_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] = 6; } From d66b9022a69207729a07cfc09e39e925ebd07426 Mon Sep 17 00:00:00 2001 From: Xhyzi <43137399+Xhyzi@users.noreply.github.com> Date: Fri, 12 Jul 2019 19:05:16 +0200 Subject: [PATCH 402/667] Added 46 move animations - Magnet Bomb. - Mirror Shot. - Aqua Ring. - Aqua Tail. - Aqua Jet. - Attack Order. - Defend Order. - Heal Order. - Dragon Rush. - Dragon Pulse. - Discharge. - Magnet Rise. - Charge Beam. - Shadow Claw. - Shadow Force. - Ominous Wind. - Lava Plume. - Magma Storm. - Avalanche. - Vacuum Wave. - Force Palm. - Lucky Chant. - Double Hit. - Giga Impact. - Captivate. - Rock Climb. - Last Resort. - Grass Knot. - Wood Hammer. - Zen Headbutt. - Lunar Dance. - Trick Room. - Psycho Cut. - Power Gem. - Stone Edge. - Rock Wrecker. - Head Smash. - Sealth Rock. - Punishment. - Sucker Punch. - Nasty Plot. - Switcheroo. - Earth Power. - Gunk Shot. - Defog. Fix Pyscho Shift Hollow Orb graphics were not being loaded before creating the sprite Fix Gastro Acid anim Fix gastro acid palette asignation. . --- data/battle_anim_scripts.s | 1416 ++++++++++++++++- .../battle_anims/backgrounds/giga_impact.pal | 19 + .../battle_anims/backgrounds/magma_storm.pal | 19 + .../battle_anims/backgrounds/rock_wrecker.png | Bin 0 -> 1249 bytes .../backgrounds/rock_wrecker_map.bin | Bin 0 -> 1280 bytes .../battle_anims/backgrounds/trick_room.png | Bin 0 -> 2043 bytes .../backgrounds/trick_room_map.bin | Bin 0 -> 1280 bytes .../battle_anims/sprites/attack_order.png | Bin 0 -> 1252 bytes .../battle_anims/sprites/dragon_pulse.png | Bin 0 -> 930 bytes graphics/battle_anims/sprites/poison_jab.png | Bin 0 -> 912 bytes graphics/battle_anims/sprites/power_gem.png | Bin 0 -> 905 bytes graphics/battle_anims/sprites/psycho_cut.png | Bin 0 -> 922 bytes .../battle_anims/sprites/stealth_rock.png | Bin 0 -> 926 bytes graphics/battle_anims/sprites/stone_edge.png | Bin 0 -> 1181 bytes graphics/battle_anims/sprites/wood_hammer.png | Bin 0 -> 1549 bytes include/constants/battle_anim.h | 15 + include/graphics.h | 24 + src/battle_anim.c | 24 + src/battle_anim_effects_1.c | 203 +++ src/battle_anim_effects_3.c | 11 + src/dark.c | 85 + src/dragon.c | 133 ++ src/fight.c | 59 + src/fire.c | 42 + src/graphics.c | 36 + src/ice.c | 76 + src/poison.c | 202 ++- src/psychic.c | 118 ++ src/rock.c | 180 +++ src/water.c | 137 ++ 30 files changed, 2785 insertions(+), 14 deletions(-) create mode 100644 graphics/battle_anims/backgrounds/giga_impact.pal create mode 100644 graphics/battle_anims/backgrounds/magma_storm.pal create mode 100644 graphics/battle_anims/backgrounds/rock_wrecker.png create mode 100644 graphics/battle_anims/backgrounds/rock_wrecker_map.bin create mode 100644 graphics/battle_anims/backgrounds/trick_room.png create mode 100644 graphics/battle_anims/backgrounds/trick_room_map.bin create mode 100644 graphics/battle_anims/sprites/attack_order.png create mode 100644 graphics/battle_anims/sprites/dragon_pulse.png create mode 100644 graphics/battle_anims/sprites/poison_jab.png create mode 100644 graphics/battle_anims/sprites/power_gem.png create mode 100644 graphics/battle_anims/sprites/psycho_cut.png create mode 100644 graphics/battle_anims/sprites/stealth_rock.png create mode 100644 graphics/battle_anims/sprites/stone_edge.png create mode 100644 graphics/battle_anims/sprites/wood_hammer.png diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 0d05554f2a..619629f09b 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1144,6 +1144,7 @@ Move_FLING: 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 @@ -1275,7 +1276,7 @@ Move_POWER_TRICK: end Move_GASTRO_ACID: - loadspritegfx ANIM_TAG_POISON_BUBBLE + loadspritegfx ANIM_TAG_GREEN_POISON_BUBBLE monbg ANIM_DEF_PARTNER createsprite gGreenPoisonBubble, ANIM_TARGET, 2, 20, 0, 40, 1, 0, 0 playsewithpan SE_W145C, SOUND_PAN_ATTACKER @@ -1308,6 +1309,30 @@ Move_GASTRO_ACID: end Move_LUCKY_CHANT: + loadspritegfx ANIM_TAG_GOLD_STARS + monbg ANIM_DEF_PARTNER + setalpha 12, 8 + playsewithpan SE_W080, 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: @@ -1420,9 +1445,64 @@ Move_GUARD_SWAP: 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, 5, ANIM_TARGET, 3, 0, 6, 1 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + waitforvisualfinish + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_W003, SOUND_PAN_TARGET + createsprite gPunishmentImpactSpriteTemplate 2, 4, 0, 0, 1, 2, + createvisualtask AnimTask_ShakeMon 2, 5, ANIM_TARGET, 3, 0, 6, 1 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff end Move_LAST_RESORT: + fadetobg BG_COSMIC + waitbgfadeout + createvisualtask sub_8117660, 2, 4, 0, 128, 0, -1 + waitbgfadein + loadspritegfx ANIM_TAG_IMPACT + playsewithpan SE_W129, SOUND_PAN_ATTACKER + createsprite gComplexPaletteBlendSpriteTemplate, 2, 7, 2, 4, 2, RGB(31, 31, 31), 10, 0, 0 + waitforvisualfinish + delay 10 + playsewithpan SE_W207, SOUND_PAN_ATTACKER + waitplaysewithpan SE_W207, 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_W025B, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, 132, 4, -10, 0, 1, 0 + createsprite gSlideMonToOffsetSpriteTemplate, 2, 5, 1, -32, 0, 0, 3 + waitforvisualfinish + createvisualtask sub_80D6134, 2, 4, 8, -256, 0, 0 + createvisualtask sub_80D6134, 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 sub_80D6134, 2, 4, 8, -256, 0, 1 + createvisualtask sub_80D6134, 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: @@ -1440,6 +1520,16 @@ Move_WORRY_SEED: 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 sub_80D6134, 2, 4, 6, 384, 1, 2 + playsewithpan SE_W233B, SOUND_PAN_TARGET + waitforvisualfinish + createsprite gSlideMonToOriginalPosSpriteTemplate, 2, 3, 0, 1, 4 end Move_TOXIC_SPIKES: @@ -1466,9 +1556,90 @@ 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, 5, ANIM_ATTACKER, 0, 2, 23, 1 + delay 5 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + createsprite gUnknown_08595238, 2, 4, 10, 10, 25, 0 + delay 4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + createsprite gUnknown_08595238, 2, 4, -15, 0, 25, 0 + delay 4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + createsprite gUnknown_08595238, 2, 4, 20, 10, 25, 0 + delay 4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + createsprite gUnknown_08595238, 2, 4, 0, -10, 25, 0 + delay 4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + createsprite gUnknown_08595238, 2, 4, -10, 15, 25, 0 + delay 4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + createsprite gUnknown_08595238, 2, 4, 25, 20, 25, 0 + delay 4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + createsprite gUnknown_08595238, 2, 4, -20, 20, 25, 0 + delay 4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + createsprite gUnknown_08595238, 2, 4, 12, 0, 25, 0 + setalpha 8, 8 + playsewithpan SE_W208, SOUND_PAN_ATTACKER, + createsprite gUnknown_08593C64, 2, 0 + delay 4 + createsprite gUnknown_08593C64, 2, 0 + delay 4 + createsprite gUnknown_08593C64, 2, 0 + waitforvisualfinish + playsewithpan SE_REAPOKE, SOUND_PAN_ATTACKER + createvisualtask sub_8115A04, 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 sub_8115A04 2, 31, -31, 1, 5, 5, RGB(31, 31, 20) + playsewithpan SE_W085B, SOUND_PAN_ATTACKER + createvisualtask AnimTask_WindUpLunge, 5, 7, 0, -12, 4, 10, 10, 12, 6 + createsprite gBattleAnimSpriteTemplate_859574C, 0, 7, 32, 24, 190, 12, 0, 1, 0 + delay 0 + createsprite gBattleAnimSpriteTemplate_859574C, 0, 7, 80, 24, 22, 12, 0, 1, 0 + createsprite gBattleAnimSpriteTemplate_859574C, 0, 7, 156, 24, 121, 13, 0, 1, 1 + delay 0 + playsewithpan SE_W085B, SOUND_PAN_ATTACKER + delay 4 + createsprite gBattleAnimSpriteTemplate_859574C, 0, 7, 100, 24, 60, 10, 0, 1, 0 + createsprite gBattleAnimSpriteTemplate_859574C, 0, 7, 170, 24, 42, 11, 0, 1, 1 + delay 0 + createsprite gBattleAnimSpriteTemplate_859574C, 0, 7, 238, 24, 165, 10, 0, 1, 1 + delay 0 + createsprite gBattleAnimSpriteTemplate_859574C, 0, 7, 32, 24, 190, 12, 0, 1, 0 + delay 0 + createsprite gBattleAnimSpriteTemplate_859574C, 0, 7, 80, 24, 22, 12, 0, 1, 0 + createsprite gBattleAnimSpriteTemplate_859574C, 0, 7, 156, 24, 121, 13, 0, 1, 1 + delay 0 + createsprite gBattleAnimSpriteTemplate_859574C, 0, 7, 100, 24, 60, 10, 0, 1, 0 + createsprite gBattleAnimSpriteTemplate_859574C, 0, 7, 170, 24, 42, 11, 0, 1, 1 + delay 0 + createsprite gBattleAnimSpriteTemplate_859574C, 0, 7, 238, 24, 165, 10, 0, 1, 1 + delay 0 + createvisualtask sub_8115A04, 2, 31, -31, 1, 0, 0, RGB(31, 31, 20) + delay 20 + createvisualtask sub_8115A04, 2, 31, -31, 1, 7, 7, RGB(31, 31, 20) + waitforvisualfinish + createvisualtask sub_8115A04, 2, 31, -31, 1, 0, 0, RGB(31, 31, 20) + waitforvisualfinish end Move_FLARE_BLITZ: @@ -1549,6 +1720,21 @@ Move_FLARE_BLITZ: 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_W104, SOUND_PAN_TARGET + createsprite gUnknown_08595E68, 2, 8, -16, 0, 0, 0, 10, 1, 3, 0 + waitforvisualfinish + playsewithpan SE_W004, SOUND_PAN_TARGET + createsprite gForcePalmSpriteTemplate 3, 4, 0, 0, 1, 2 + createvisualtask AnimTask_ShakeMon, 5, 5, ANIM_TARGET, 4, 0, 6, 1 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff end Move_AURA_SPHERE: @@ -1716,6 +1902,57 @@ Move_NIGHT_SLASH: 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, 5, ANIM_ATTACKER, 0, 2, 23, 1 + delay 5 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + createsprite gUnknown_08595238, 2, 4, 10, 10, 25, 0 + delay 4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + createsprite gUnknown_08595238, 2, 4, -16, 0, 25, 0 + delay 4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + createsprite gUnknown_08595238, 2, 4, 20, 10, 25, 0 + delay 4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + createsprite gUnknown_08595238, 2, 4, 0, -10, 25, 0 + delay 4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + createsprite gUnknown_08595238, 2, 4, -10, 15, 25, 0 + delay 4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + createsprite gUnknown_08595238, 2, 4, 25, 20, 25, 0 + delay 4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + createsprite gUnknown_08595238, 2, 4, -20, 20, 25, 0 + delay 4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + createsprite gUnknown_08595238, 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_W233, 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_W004, 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: @@ -1826,12 +2063,99 @@ Move_BUG_BUZZ: end Move_DRAGON_PULSE: - end + createsprite gSimplePaletteBlendSpriteTemplate, 2, 5, 1, 1, 0, 7, 0 + waitforvisualfinish + loadspritegfx ANIM_TAG_DRAGON_PULSE + playsewithpan SE_W060, SOUND_PAN_ATTACKER + createsoundtask sub_8158C58, 7, 200, -64, SOUND_PAN_TARGET, 3, 4, 0, 15 + call DragonPulseParticle + call DragonPulseParticle + createvisualtask AnimTask_SwayMon, 5, 5, 0, 6, 51200, 4, 1 + createvisualtask sub_8115A04, 2, 6, 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, 2, 5, 1, 1, 7, 0, 0 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + 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_W233, 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, 5, ANIM_TARGET, 3, 0, 5, 1 + waitforvisualfinish + playsewithpan 131, SOUND_PAN_TARGET + createsprite gUnknown_08596B1C, 2, 6, 0, 0, 20, 24, 14, 2 + createsprite gUnknown_08596B1C, 2, 6, 5, 0, -20, 24, 14, 1 + createsprite gUnknown_08596B1C, 2, 6, 0, 5, 20, -24, 14, 2 + createsprite gUnknown_08596B1C, 2, 6, -5, 0, 20, 24, 14, 2 + createsprite gUnknown_08596B1C, 2, 6, 0, -5, 30, 18, 8, 2 + createsprite gUnknown_08596B1C, 2, 6, 0, 0, 30, -18, 8, 2 + createsprite gUnknown_08596B1C, 2, 6, 0, 0, -30, 18, 8, 2 + createsprite gUnknown_08596B1C, 2, 6, 0, 0, -30, -18, 8, 2 + createvisualtask AnimTask_ShakeMon, 2, 5, ANIM_TARGET, 0, 3, 7, 1 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff end Move_POWER_GEM: + createsprite gSimplePaletteBlendSpriteTemplate, 2, 5, 1, 1, 0, 7, 0 + waitforvisualfinish + loadspritegfx ANIM_TAG_POWER_GEM + playsewithpan 152, SOUND_PAN_ATTACKER + createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, 0, 0 + waitforvisualfinish + delay 30 + createvisualtask AnimTask_BlendMonInAndOut 5, 5, 0, RGB(31, 31, 31), 12, 5, 1 + delay 4 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, 0, 0 + playsewithpan SE_W179, SOUND_PAN_ATTACKER + createsprite gPowerGemOrbSpriteTemplate 2, 2, 26, 0 + createsprite gPowerGemOrbSpriteTemplate 2, 2, 26, 42 + createsprite gPowerGemOrbSpriteTemplate 2, 2, 26, 84 + createsprite gPowerGemOrbSpriteTemplate 2, 2, 26, 126 + createsprite gPowerGemOrbSpriteTemplate 2, 2, 26, 168 + createsprite gPowerGemOrbSpriteTemplate 2, 2, 26, 210 + delay 52 + setarg 7, -1 + playsewithpan SE_W115, SOUND_PAN_ATTACKER + createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, 0, 0 + createsprite gPowerGemScatterSpriteTemplate 130, 1, 0 + createsprite gPowerGemScatterSpriteTemplate 130, 1, 32 + createsprite gPowerGemScatterSpriteTemplate 130, 1, 64 + createsprite gPowerGemScatterSpriteTemplate 130, 1, 96 + createsprite gPowerGemScatterSpriteTemplate 130, 1, 128 + createsprite gPowerGemScatterSpriteTemplate 130, 1, 160 + createsprite gPowerGemScatterSpriteTemplate 130, 1, SOUND_PAN_ATTACKER + createsprite gPowerGemScatterSpriteTemplate 130, 1, 224 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + createsprite gSimplePaletteBlendSpriteTemplate 2, 5, 1, 1, 7, 0, 0 + blendoff end Move_DRAIN_PUNCH: @@ -1856,7 +2180,24 @@ Move_DRAIN_PUNCH: end Move_VACUUM_WAVE: - end + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_HANDS_AND_FEET + monbg ANIM_ATK_PARTNER + createvisualtask AnimTask_GetAttackerSide, 2, 0 + waitbgfadein + delay 0 + setalpha 9, 8 + createvisualtask sub_80A8BC4, 2, 2, RGB(8, 9, 24), 17 + playsewithpan SE_W026, SOUND_PAN_ATTACKER + delay 6 + createsprite gBasicHitSplatSpriteTemplate 131, 4, 0, 0, 1, 1 + createsprite gFistFootSpriteTemplate 132, 5, 0, 0, 8, 1, 0 + playsewithpan SE_W004, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon 2, 5, ANIM_TARGET, 3, 0, 6, 1 + waitforvisualfinish + clearmonbg ANIM_ATK_PARTNER + blendoff + end Move_FOCUS_BLAST: loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @@ -1920,16 +2261,135 @@ Move_BRAVE_BIRD: end Move_EARTH_POWER: + loadspritegfx ANIM_TAG_SMALL_EMBER + loadspritegfx ANIM_TAG_FIRE_PLUME + createvisualtask sub_81152DC, 3, 5, 10, 50 + createvisualtask sub_81152DC, 3, 1, 10, 50 + playsewithpan SE_W089, SOUND_PAN_TARGET + delay 40 + loopsewithpan 145, SOUND_PAN_TARGET 11, 3 + createvisualtask AnimTask_ShakeMon 5, 5, ANIM_TARGET, 0, 3, 25, 1 + createsprite gUnknown_08596F28, 194, 3, 1, 5, 0 + delay 1 + createsprite gUnknown_08596F28, 194, 3, 1, -10, -15 + delay 1 + createsprite gUnknown_08596F28, 130, 3, 1, 0, 25 + delay 1 + createsprite gUnknown_08596F28, 194, 3, 1, 15, 5 + delay 1 + createsprite gUnknown_08596F28, 194, 3, 1, -25, 0 + delay 1 + createsprite gUnknown_08596F28, 130, 3, 1, 30, 30 + delay 1 + createsprite gUnknown_08596F28, 130, 3, 1, -27, 25 + delay 1 + createsprite gUnknown_08596F28, 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_W166, 0 + createvisualtask sub_8106020, 3, 0 + createvisualtask sub_81060B0, 3, 0 + delay 30 + playsewithpan SE_W104, 0 + delay 24 + playsewithpan SE_W104, 0 + delay 16 + playsewithpan SE_W104, 0 + delay 16 + playsewithpan SE_W104, 0 + delay 16 + playsewithpan SE_W104, 0 + delay 16 + playsewithpan SE_W104, 0 + delay 16 + playsewithpan SE_W213, 0 + createvisualtask AnimTask_ShakeMon, 3, 5, ANIM_ATTACKER, 5, 0, 7, 2 + createvisualtask AnimTask_ShakeMon, 3, 5, ANIM_TARGET, 5, 0, 7, 2 + waitforvisualfinish + restorebg + waitbgfadein end Move_GIGA_IMPACT: - end + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_DEF_PARTNER + setalpha 12, 8 + playsewithpan SE_W036, 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_W025B, SOUND_PAN_TARGET + call GigaImpactAction + 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 +GigaImpactAction: + delay 2, + createvisualtask AnimTask_IsContest, 2, 0 + jumpargeq 7, 1, GigaImpactBgContest + createvisualtask AnimTask_IsTargetPlayerSide, 2, 0 + jumpargeq 7, 0, GigaImpactBgOpponent + jumpargeq 7, 1, GigaImpactBgPlayer +GigaImpactBgContest: + changebg BG_GIGA_IMPACT_CONTEST + goto GigaImpactReturnToEnd +GigaImpactReturnToEnd: + return +GigaImpactBgOpponent: + changebg BG_GIGA_IMPACT_OPPONENT + goto GigaImpactReturnToEnd +GigaImpactBgPlayer: + changebg BG_GIGA_IMPACT_PLAYER + return Move_NASTY_PLOT: - end + loadspritegfx ANIM_TAG_AMNESIA + call NastyPlotAction + delay 8 + createsprite gUnknown_08596744, 20, 0 + playsewithpan SE_W118, SOUND_PAN_ATTACKER, + delay 54 + loopsewithpan SE_W118, SOUND_PAN_ATTACKER, 16, 3 + waitforvisualfinish + call UnsetPsychicBg + end +NastyPlotAction: + fadetobg BG_DARK + waitbgfadeout + createvisualtask sub_815A5C8, 5, 0 + waitbgfadein + return Move_BULLET_PUNCH: loadspritegfx ANIM_TAG_IMPACT @@ -1986,8 +2446,56 @@ Move_BULLET_PUNCH: end Move_AVALANCHE: + loadspritegfx ANIM_TAG_ROCKS + loadspritegfx ANIM_TAG_ICE_CHUNK + monbg ANIM_DEF_PARTNER + createsprite gBattleAnimSpriteTemplate_85972D8, 2, 4, 7, 1, 11, 1 + createsprite gAvalancheSpriteTemplate, 130, 4, -5, 1, -5, 1 + playsewithpan SE_W088, SOUND_PAN_TARGET + delay 2 + createsprite gAvalancheSpriteTemplate, 130, 4, 5, 0, 6, 1 + playsewithpan SE_W088, SOUND_PAN_TARGET + delay 2 + createsprite gAvalancheSpriteTemplate, 130, 4, 19, 1, 10, 1 + playsewithpan SE_W088, SOUND_PAN_TARGET + delay 2 + createsprite gAvalancheSpriteTemplate 130, 4, -17, 2, -20, 1 + playsewithpan SE_W088, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, 5, ANIM_TARGET, 0, 5, 50, 1 + createvisualtask AnimTask_ShakeMon, 2, 5, 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_W088, SOUND_PAN_TARGET + delay 2 + createsprite gAvalancheSpriteTemplate, ANIM_TARGET, 2, 28, 1, 10, 1 + playsewithpan SE_W088, SOUND_PAN_TARGET + delay 2 + createsprite gAvalancheSpriteTemplate, ANIM_TARGET, 2, -10, 1, -5, 1 + playsewithpan SE_W088, SOUND_PAN_TARGET + delay 2 + createsprite gAvalancheSpriteTemplate, ANIM_TARGET, 2, 10, 0, 6, 1 + playsewithpan SE_W088, SOUND_PAN_TARGET + delay 2 + createsprite gAvalancheSpriteTemplate, ANIM_TARGET, 2, 24, 1, 10, 1 + playsewithpan SE_W088, SOUND_PAN_TARGET + delay 2 + createsprite gAvalancheSpriteTemplate, ANIM_TARGET, 2, -32, 2, -10, 1 + playsewithpan SE_W088, SOUND_PAN_TARGET + delay 2 + createsprite gAvalancheSpriteTemplate, ANIM_TARGET, 2, -20, 0, -10, 1 + playsewithpan SE_W088, SOUND_PAN_TARGET + delay 2 + createsprite gAvalancheSpriteTemplate, ANIM_TARGET, 2, 30, 2, 10, 1 + playsewithpan SE_W088, SOUND_PAN_TARGET + delay 2 + return + Move_ICE_SHARD: monbg ANIM_TARGET monbgprio_28 ANIM_TARGET @@ -2025,6 +2533,28 @@ Move_ICE_SHARD: end Move_SHADOW_CLAW: + createsprite gSimplePaletteBlendSpriteTemplate 2, 5, 1, 1, 0, 7, 0 + waitforvisualfinish + loadspritegfx ANIM_TAG_BLUE_LIGHT_WALL + loadspritegfx ANIM_TAG_CLAW_SLASH + loadspritegfx ANIM_TAG_TORN_METAL + monbg ANIM_TARGET + setalpha 12, 8 + createsprite gHorizontalLungeSpriteTemplate 2, 2, 6, 4 + delay 4 + createvisualtask AnimTask_ShakeMon2 2, 5, 1, 2, 0, 18, 1 + createsprite gBattleAnimSpriteTemplate_8597138, 130, 3, -10, -10, 0 + createsprite gBattleAnimSpriteTemplate_8597138, 130, 3, -10, 10, 0 + playsewithpan 136, SOUND_PAN_TARGET + delay 12, + createsprite gBattleAnimSpriteTemplate_8597138, 130, 3, 10, -10, 1 + createsprite gBattleAnimSpriteTemplate_8597138, 130, 3, 10, 10, 1 + playsewithpan 136, SOUND_PAN_TARGET + waitforvisualfinish + createsprite gSimplePaletteBlendSpriteTemplate 2, 5, 1, 1, 7, 0, 0 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff end Move_THUNDER_FANG: @@ -2203,33 +2733,257 @@ Move_MUD_BOMB: 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 sub_8116620, 10, 1, 0, 4, 4, RGB_BLACK + createvisualtask sub_8116620, 9, 5, 2, 2, 10, 0, RGB(20, 12, 23) + createvisualtask sub_8116620, 9, 2, 2, 10, 0, RGB(20, 12, 23) + delay 30 + clearmonbg ANIM_ATK_PARTNER + blendoff + waitforvisualfinish + monbg ANIM_TARGET + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + playsewithpan 160, SOUND_PAN_ATTACKER, + createsprite gPsychoCutSpriteTemplate, 130, 5, 20, 0, -8, 0, 20 + waitforvisualfinish + clearmonbg ANIM_TARGET 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_W234, SOUND_PAN_ATTACKER + waitforvisualfinish + delay 2, + playsewithpan SE_W029, SOUND_PAN_ATTACKER + loadspritegfx ANIM_TAG_IMPACT + createsprite gUnknown_08592CD8, 2, 1, 0 + playsewithpan SE_W029, SOUND_PAN_ATTACKER + waitforvisualfinish + delay 2 + createsprite gUnknown_08592CD8, 2, 1, 1 + waitforvisualfinish + createvisualtask AnimTask_ShakeMonInPlace, 2, 5, 0, 2, 0, 4, 1 + createvisualtask AnimTask_ShakeMon, 2, 5, ANIM_TARGET, 5, 0, 6, 1 + createsprite gUnknown_08592CD8, 2, 1, 2 + createsprite gAquaTailHitSpriteTemplate, 131, 4, 0, 0, 1, 1 + playsewithpan SE_W233B, 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_W231, 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 sub_8116664, 5, 5, 5, 2, 0, 10, -1 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 12, 12, RGB(21, 21, 21) + waitforvisualfinish + createsprite gUnknown_085973A0, 131, 2, 1, 2 + createvisualtask sub_8159210, 5, 2, 215, 63 + delay 3 + createsprite gUnknown_085973A0, 131, 2, 1, 2 + createvisualtask sub_8159210, 5, 2, 215, 63 + delay 3 + createsprite gUnknown_085973A0, 131, 2, 1, 2 + createvisualtask sub_8159210, 5, 2, 215, 63 + delay 3 + createsprite gUnknown_085973A0, 131, 2, 1, 2 + createvisualtask sub_8159210, 5, 2, 215, 63 + delay 3 + createsprite gUnknown_085973A0, 131, 2, 1, 2 + createvisualtask sub_8159210, 5, 2, 215, 63 + delay 3 + createsprite gUnknown_085973A0, 131, 2, 1, 2 + createvisualtask sub_8159210, 5, 2, 215, 63 + waitforvisualfinish + createvisualtask sub_8116664, 5, 5, 2, 16, 0, RGB_WHITEALPHA + createvisualtask sub_81152DC, 5, 1, 5, 14 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + blendoff end Move_FLASH_CANNON: end Move_ROCK_CLIMB: + createvisualtask AnimTask_Splash, 2, 2, ANIM_ATTACKER, 3 + delay 8 + loopsewithpan SE_W039, 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 sub_8110F74, 2, 0 + waitforvisualfinish + createvisualtask sub_80D6388, 2, 5, 0, 1, 30, 1, RGB(0, 16, 1) + createsprite gBasicHitSplatSpriteTemplate, 131, 4, -15, 8, 1, 1 + playsewithpan SE_W233B, SOUND_PAN_TARGET + delay 1 + playsewithpan SE_W233B, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, 131, 4, -5, -12, 1, 1 + delay 1 + playsewithpan SE_W233B, SOUND_PAN_TARGET + createsprite gBasicHitSplatSpriteTemplate, 131, 4, 0, -32, 1, 1 + delay 1 + playsewithpan SE_W233B, 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: - end + loadspritegfx ANIM_TAG_WHITE_CIRCLE_OF_LIGHT + monbg ANIM_ATTACKER + setalpha 12, 8 + playsewithpan SE_W076, SOUND_PAN_ATTACKER + createsprite gUnknown_08596898, ANIM_ATTACKER, 41, 0, 0, 0, 0 + delay 20 + createvisualtask sub_8116664, 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 sub_8116664, 5, 5, 2, 16, 0, -1 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + blendoff + end Move_TRICK_ROOM: + fadetobg BG_TRICK_ROOM + waitbgfadein + call Growth1 + waitforvisualfinish + delay 32 + blendoff + clearmonbg ANIM_DEF_PARTNER + restorebg + waitbgfadein end Move_DRACO_METEOR: + loadspritegfx ANIM_TAG_WARM_ROCK + loadspritegfx ANIM_TAG_GOLD_STARS + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_ICE_SPIKES + playsewithpan SE_W268, 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_W088, SOUND_PAN_TARGET + delay 10 + restorebg + waitbgfadein + waitforvisualfinish end Move_DISCHARGE: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_SPARK_2 + delay 0 + createvisualtask sub_8115A04, 2, 3, -31, 1, 5, 5, RGB(31, 31, 20) + playsewithpan SE_W085B, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_859574C, ANIM_ATTACKER, 0, 32, 24, 190, 12, 0, 1, 0 + delay 0 + createsprite gBattleAnimSpriteTemplate_859574C, ANIM_ATTACKER, 0, 80, 24, 22, 12, 0, 1, 0 + createsprite gBattleAnimSpriteTemplate_859574C, ANIM_ATTACKER, 0, 156, 24, 121, 13, 0, 1, 1 + delay 0 + createvisualtask sub_8115A04, 2, 3, -31, 1, 0, 0, RGB(31, 31, 20) + delay 10 + createvisualtask sub_8115A04 2, 3, -31, 1, 5, 5, RGB(31, 31, 20) + playsewithpan SE_W085B, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_859574C, ANIM_ATTACKER, 0, 100, 24, 60, 10, 0, 1, 0 + createsprite gBattleAnimSpriteTemplate_859574C, 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_W076, SOUND_PAN_ATTACKER + createsprite gUnknown_08596898, ANIM_ATTACKER, 41, 0, 0, 0, 0 + delay 20 + createvisualtask sub_8116664, 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 gUnknown_085973A0, ANIM_TARGET, 3, 1, 2 + createvisualtask sub_8159210, 5, 215, SOUND_PAN_TARGET + delay 3 + createsprite gUnknown_085973A0, ANIM_TARGET, 3, 1, 2 + createvisualtask sub_8159210, 5, 215, SOUND_PAN_TARGET + delay 3 + createsprite gUnknown_085973A0, ANIM_TARGET, 3, 1, 2 + createvisualtask sub_8159210, 5, 215, SOUND_PAN_TARGET + delay 3 + createsprite gUnknown_085973A0, ANIM_TARGET, 3, 1, 2 + createvisualtask sub_8159210, 5, 215, SOUND_PAN_TARGET + delay 3 + createsprite gUnknown_085973A0, ANIM_TARGET, 3, 1, 2 + createvisualtask sub_8159210, 5, 215, SOUND_PAN_TARGET + delay 3 + createsprite gUnknown_085973A0, ANIM_TARGET, 3, 1, 2 + createvisualtask sub_8159210, 5, 215, SOUND_PAN_TARGET + waitforvisualfinish + createvisualtask sub_8116664, 5, 5, 2, 16, 0, RGB_WHITEALPHA + createvisualtask sub_81152DC, 5, 1, 5, 14 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + blendoff + call ElectricityEffect + waitforvisualfinish end Move_LAVA_PLUME: + loadspritegfx ANIM_TAG_FIRE_PLUME + loopsewithpan 152, SOUND_PAN_ATTACKER, 9, 2 + createvisualtask sub_8115A04, 2, 2, 2, 2, 0, 11, 31 + createvisualtask AnimTask_ShakeMon2 2, 5, 0, 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, SOUND_PAN_ATTACKER + createsprite gLavaPlumeSpriteTemplate, 130, 1, 224 + playsewithpan SE_W221, SOUND_PAN_ATTACKER + waitforvisualfinish end Move_LEAF_STORM: @@ -2359,6 +3113,49 @@ Move_POWER_WHIP: end Move_ROCK_WRECKER: + jumpargeq 7, 1, RockWrecker_1 + fadetobg BG_ROCK_WRECKER + waitbgfadeout + createvisualtask sub_8117660, 5, -1024, 0, 1, -1 + goto RockWrecker_2 +RockWrecker_1: + fadetobg BG_ROCK_WRECKER + waitbgfadeout + createvisualtask sub_8117660, 5, -1024, 0, 0, -1 + loadspritegfx ANIM_TAG_ROCKS + loadspritegfx ANIM_TAG_IMPACT + createsprite gHorizontalLungeSpriteTemplate, 2, 2, 4, 6 + delay 3 + playsewithpan SE_W207, SOUND_PAN_ATTACKER + createsprite gUnknown_08596C98, 130, 6, 16, 0, 0, 0, 25, 257 + waitforvisualfinish + createsprite gBasicHitSplatSpriteTemplate, 131, 4, 0, 0, 1, 1 + playsewithpan SE_W088 SOUND_PAN_TARGET + createsprite gUnknown_08596B1C, 130, 6, 0, 0, 20, 24, 14, 2 + createvisualtask AnimTask_ShakeMon, 2, 5, ANIM_TARGET, 3, 0, 5, 1 + createsprite gUnknown_08596B1C, 130, 6, 5, 0, -20, 24, 14, 1 + createsprite gUnknown_08596B1C, 130, 6, 0, 5, 20, -18, 14, 2 + createsprite gUnknown_08596B1C, 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_W207, SOUND_PAN_ATTACKER + createsprite gUnknown_08596C98, 130, 6, 16, 0, 0, 0, 25, 257 + waitforvisualfinish + createsprite gBasicHitSplatSpriteTemplate, 131, 4, 0, 0, 1, 1 + playsewithpan SE_W088 SOUND_PAN_TARGET + createsprite gUnknown_08596B1C 130, 6, 0, 0, 20, 24, 14, 2 + createvisualtask AnimTask_ShakeMon, 2, 5, ANIM_TARGET, 3, 0, 5, 1 + createsprite gUnknown_08596B1C 130, 6, 5, 0, -20, 24, 14, 1 + createsprite gUnknown_08596B1C 130, 6, 0, 5, 20, -18, 14, 2 + createsprite gUnknown_08596B1C 130, 6, -5, 0, -20, -18, 14, 2 + waitforvisualfinish + call UnsetPsychicBg end Move_CROSS_POISON: @@ -2378,7 +3175,55 @@ Move_CROSS_POISON: end Move_GUNK_SHOT: - end + 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_W056, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 2, 0 + createvisualtask sub_81076C8, 5, 1, 100 + call GunkShotParticles + call GunkShotParticles + call GunkShotParticles + createvisualtask AnimTask_ShakeMon, 5, 5, ANIM_TARGET, 3, 0, 27, 1 + loopsewithpan SE_W145C, 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 @@ -2403,18 +3248,173 @@ Move_IRON_HEAD: end Move_MAGNET_BOMB: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_SPARK_2 + delay 0 + playsewithpan 119, 192 + createsprite gBattleAnimSpriteTemplate_859574C, 0, 7, 32, 24, 190, 12, 0, 1, 0 + delay 0 + createsprite gBattleAnimSpriteTemplate_859574C, 0, 7, 80, 24, 22, 12, 0, 1, 0 + createsprite gBattleAnimSpriteTemplate_859574C, 0, 7, 156, 24, 121, 13, 0, 1, 1 + delay 0 + playsewithpan 119, 192 + createsprite gBattleAnimSpriteTemplate_859574C 0, 7, 100, 24, 60, 10, 0, 1, 0 + createsprite gBattleAnimSpriteTemplate_859574C 0, 7, 170, 24, 42, 11, 0, 1, 1 + delay 0 + createsprite gBattleAnimSpriteTemplate_859574C 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 gUnknown_08592E30, 130, 4, 8, 8, 1, 0 + delay 2 + createsprite gUnknown_08592E30, 130, 4, -8, -8, 1, 0 + delay 2 + createsprite gUnknown_08592E30, 130, 4, 8, -8, 1, 0 + delay 2 + createsprite gUnknown_08592E30, 130, 4, -8, 8, 1, 0 + waitforvisualfinish + playsewithpan 177, 63 + createsprite gUnknown_08592E30, 130, 4, 8, 8, 1, 0 + delay 2 + createsprite gUnknown_08592E30, 130, 4, -8, -8, 1, 0 + delay 2 + createsprite gUnknown_08592E30, 130, 4, 8, -8, 1, 0 + delay 2 + createsprite gUnknown_08592E30, 130, 4, -8, 8, 1, 0 + waitforvisualfinish end Move_STONE_EDGE: + loadspritegfx ANIM_TAG_STONE_EDGE + loadspritegfx ANIM_TAG_IMPACT + playsewithpan SE_W088 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_W004, 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 gUnknown_085973A0, 131, 2, 1, 3 + playsewithpan SE_W004, SOUND_PAN_TARGET + delay 4 + createsprite gUnknown_085973A0, 131, 2, 1, 3 + playsewithpan SE_W004, SOUND_PAN_TARGET + delay 4 + createsprite gBasicHitSplatSpriteTemplate, 131, 4, 32, 20, 1, 3 + playsewithpan SE_W004, 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_W204, SOUND_PAN_ATTACKER + delay 15 + createsprite gMagentaHeartSpriteTemplate, 3, 2, -20, 20 + playsewithpan SE_W204, 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_W026, SOUND_PAN_ATTACKER + waitplaysewithpan SE_W030, SOUND_PAN_TARGET, 28 + createsprite gStealthRockSpriteTemplate, ANIM_TARGET, 2, 20, 0, 0, 24, 30 + delay 10 + playsewithpan SE_W026, SOUND_PAN_ATTACKER + waitplaysewithpan SE_W030, SOUND_PAN_TARGET, 28 + createsprite gStealthRockSpriteTemplate, ANIM_TARGET, 2, 20, 0, -24, 24, 30 + delay 10 + waitplaysewithpan SE_W030, 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 sub_80D6134, 2, 4, 6, 384, 1, 2 + playsewithpan SE_W233B SOUND_PAN_TARGET + waitforvisualfinish + createsprite gSlideMonToOriginalPosSpriteTemplate, 2, 3, 0, 1, 4 end Move_CHATTER: @@ -2427,27 +3427,258 @@ Move_BUG_BITE: end Move_CHARGE_BEAM: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_SPARK_2 + delay 0 + createvisualtask sub_8115A04, 2, 3, -31, 1, 5, 5, RGB(31, 31, 20) + playsewithpan SE_W085B, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_859574C, 0, 7, 32, 24, 190, 12, 0, 1, 0 + delay 0 + createsprite gBattleAnimSpriteTemplate_859574C, 0, 7, 80, 24, 22, 12, 0, 1, 0 + createsprite gBattleAnimSpriteTemplate_859574C, 0, 7, 156, 24, 121, 13, 0, 1, 1 + delay 0 + createvisualtask sub_8115A04, 2, 3, -31, 1, 0, 0, RGB(31, 31, 20) + delay 10 + createvisualtask sub_8115A04, 2, 3, -31, 1, 5, 5, RGB(31, 31, 20) + playsewithpan SE_W085B, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_859574C, 0, 7, 100, 24, 60, 10, 0, 1, 0 + createsprite gBattleAnimSpriteTemplate_859574C, 0, 7, 170, 24, 42, 11, 0, 1, 1 + delay 0 + createsprite gBattleAnimSpriteTemplate_859574C, 0, 7, 238, 24, 165, 10, 0, 1, 1 + delay 0 + createvisualtask sub_8115A04, 2, 3, -31, 1, 0, 0, RGB(31, 31, 20) + delay 20 + playsewithpan SE_W085B, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_85957F8, 4, 8, 0, 0, 32, 12, 0, 20, 0, 0 + createsprite gBattleAnimSpriteTemplate_85957F8, 4, 8, 0, 0, 32, 12, 64, 20, 1, 0 + createsprite gBattleAnimSpriteTemplate_85957F8, 4, 8, 0, 0, 32, 12, 128, 20, 0, 0 + createsprite gBattleAnimSpriteTemplate_85957F8, 4, 8, 0, 0, 32, 12, SOUND_PAN_ATTACKER, 20, 2, 0 + createsprite gBattleAnimSpriteTemplate_85957F8, 4, 8, 0, 0, 16, 12, 32, 20, 0, 0 + createsprite gBattleAnimSpriteTemplate_85957F8, 4, 8, 0, 0, 16, 12, 96, 20, 1, 0 + createsprite gBattleAnimSpriteTemplate_85957F8, 4, 8, 0, 0, 16, 12, 160, 20, 0, 0 + createsprite gBattleAnimSpriteTemplate_85957F8, 4, 8, 0, 0, 16, 12, 224, 20, 2, 0 + delay 4 + waitforvisualfinish + createvisualtask sub_8115A04, 2, 3, -31, 1, 0, 0, RGB(31, 31, 20) + waitforvisualfinish + loadspritegfx ANIM_TAG_BLACK_BALL_2 + loadspritegfx ANIM_TAG_SPARK_2 + playsewithpan SE_W086, SOUND_PAN_ATTACKER + createsprite gUnknown_08595764, 131, 6, 10, 0, 0, 0, 30, 0 + createsprite gUnknown_08595790, 132, 7, 10, 0, 16, 30, 0, 40, 0 + createsprite gUnknown_08595790, 132, 7, 10, 0, 16, 30, 64, 40, 1 + createsprite gUnknown_08595790, 132, 7, 10, 0, 16, 30, 128, 40, 0 + createsprite gUnknown_08595790, 132, 7, 10, 0, 16, 30, SOUND_PAN_ATTACKER, 40, 2 + createsprite gUnknown_08595790, 132, 7, 10, 0, 8, 30, 32, 40, 0 + createsprite gUnknown_08595790, 132, 7, 10, 0, 8, 30, 96, 40, 1 + createsprite gUnknown_08595790, 132, 7, 10, 0, 8, 30, 160, 40, 0 + createsprite gUnknown_08595790, 132, 7, 10, 0, 8, 30, 224, 40, 2 + waitforvisualfinish + createvisualtask AnimTask_ShakeMon2, 2, 5, 1, 4, 0, 5, 1 + delay 15 + waitplaysewithpan SE_W085B, SOUND_PAN_TARGET 19 + call ElectricityEffect + waitforvisualfinish end Move_WOOD_HAMMER: end Move_AQUA_JET: + loadspritegfx ANIM_TAG_SPARKLE_6 + loadspritegfx ANIM_TAG_ROUND_SHADOW + loadspritegfx ANIM_TAG_SPLASH + playsewithpan SE_W029, SOUND_PAN_ATTACKER + createsprite gUnknown_08596490, 2, 4, 0, 0, 13, 336 + waitforvisualfinish + playsewithpan SE_W291, SOUND_PAN_ATTACKER + createsprite gUnknown_085964CC, 3, 1, 0 + call DiveSetUp1 + call DiveSetUp1 + call DiveSetUp1 + call DiveSetUp1 + call DiveSetUp1 + loadspritegfx ANIM_TAG_WATER_IMPACT + loadspritegfx ANIM_TAG_SMALL_BUBBLES + monbg ANIM_DEF_PARTNER + setalpha 12, 8 + playsewithpan SE_W153, SOUND_PAN_TARGET + createsprite gUnknown_085964CC, 131, 1, 1 + call DiveAttack1 + call DiveAttack1 + call DiveAttack1 + call DiveAttack1 + call DiveAttack1 + delay 12 + call UnderWaterAttack1 + 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_W230, 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_W004, 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 gUnknown_085973A0 131, 2, 1, 3 + playsewithpan SE_W004, SOUND_PAN_TARGET + delay 4 + createsprite gUnknown_085973A0 131, 2, 1, 3 + playsewithpan SE_W004, SOUND_PAN_TARGET + delay 4 + createsprite gBasicHitSplatSpriteTemplate 131, 4, 32, 20, 1, 3 + playsewithpan SE_W004, 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_W230, 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_W230, 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 gUnknown_08592CD8, ANIM_ATTACKER, 2, 0 + playsewithpan SE_W036, SOUND_PAN_ATTACKER + waitforvisualfinish + delay 2 + createsprite gUnknown_08592CD8, 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 gUnknown_08592CD8, ANIM_ATTACKER, 2, 2 + createsprite gUnknown_085973E8, ANIM_TARGET, 3, 0, 0, 1, 1 + loopsewithpan SE_W025B, 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, 5, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_W004, 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, 5, ANIM_TARGET, 3, 0, 6, 1 + playsewithpan SE_W004, SOUND_PAN_TARGET + delay 8 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff end Move_ROAR_OF_TIME: @@ -2457,12 +3688,72 @@ Move_SPECIAL_REND: 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 gUnknown_08592EBC, 2, 2, 120, 56 + createvisualtask sub_80A7A74, 3, 5, 0, 16, 16, 0, 1 + playsewithpan 211, 0 + delay 30 + createsprite gBattleAnimSpriteTemplate_8592EEC, 40, 2, -12, 0 + delay 30 + createsprite gBattleAnimSpriteTemplate_8592EEC, 40, 2, -18, 0 + delay 30 + createsprite gBattleAnimSpriteTemplate_8592EEC, 40, 2, 21, 0 + delay 30 + createsprite gBattleAnimSpriteTemplate_8592EEC, 40, 2, 0, 0 + delay 30 + createsprite gBattleAnimSpriteTemplate_8592EEC, 40, 2, 10, 0 + delay 20 + createvisualtask sub_81025C0, 2, 0 + createvisualtask sub_81133E8, 5, 0 + playsewithpan 203, SOUND_PAN_ATTACKER + delay 8 + createvisualtask sub_80A7CB4, 5, 5, ANIM_TAG_HOLLOW_ORB, RGB(0, 0, 19), 14, 0, 3 + createsprite gUnknown_08596F98, 2, 1, 0 + createsprite gUnknown_08596F98, 2, 1, 43 + createsprite gUnknown_08596F98, 2, 1, 85 + createsprite gUnknown_08596F98, 2, 1, 128 + createsprite gUnknown_08596F98, 2, 1, 170 + createsprite gUnknown_08596F98, 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: end Move_MAGMA_STORM: + loadspritegfx ANIM_TAG_SMALL_EMBER + fadetobg BG_MAGMA_STORM @Add new bg + waitbgfadeout + createvisualtask sub_811152C, 3 + playsewithpan SE_W221B, SOUND_PAN_TARGET + loopsewithpan SE_W221B, SOUND_PAN_TARGET, 5, 8 + createvisualtask sub_8111590, 3 + createvisualtask AnimTask_ShakeMon, 5, 5, ANIM_TARGET, 0, 2, 47, 1 + createvisualtask sub_8115A04, 2, 6, 4, 2, 2, 0, 12, RGB(22, 9, 7) + call FireSpinEffect + call FireSpinEffect + createvisualtask sub_8115A04, 2, 6, 4, 2, 2, 0, 12, RGB(22, 9, 7) + call FireSpinEffect + call FireSpinEffect + createvisualtask sub_8115A04, 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: @@ -2472,10 +3763,115 @@ Move_SEED_FLARE: 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 sub_8116664, 10, 5, 1, 0, 0, 0, 0 + delay 0 + createvisualtask AnimTask_GetAttackerSide, 2, 0 + jumpargeq 7, 1, OminousWindFadeToBg + fadetobg BG_GHOST + waitbgfadeout + createvisualtask sub_8117660, 5, RGB(0, 16, 1), 0, 0, -1 + goto OminousWindHit +OminousWindFadeToBg: + fadetobg BG_GHOST + waitbgfadeout + createvisualtask sub_8117660, 5, -1535, 0, 0, -1 + goto OminousWindHit +OminousWindHit: + delay 0 + createvisualtask sub_8116620, 10, 1, 0, 4, 4, RGB_BLACK + waitbgfadein + createsprite gUnknown_08592830, ANIM_TARGET, 66, -32, 16, 0, 6, 2, 3, 1 + createsprite gUnknown_08592830, ANIM_TARGET, 66, -8, 18, 64, 3, 2, 2, 1 + createsprite gUnknown_08592830, ANIM_ATTACKER, 120, -24, 18, 90, 5, 1, 2, 1 + createsprite gUnknown_08592830, ANIM_ATTACKER, 120, -40, 14, 128, 4, 1, 2, 1 + delay 0 + createsprite gUnknown_08592848, ANIM_TARGET, 66, -32, 16, 0, 6, 2, 3, 1 + createsprite gUnknown_08592848, ANIM_TARGET, 66, -8, 18, 64, 3, 2, 2, 1 + createsprite gUnknown_08592848, ANIM_ATTACKER, 120, -24, 18, 90, 5, 1, 2, 1 + createsprite gUnknown_08592848, ANIM_ATTACKER, 120, -40, 14, 128, 4, 1, 2, 1 + delay 0 + createsprite gUnknown_08592860, ANIM_TARGET, 66, -32, 16, 0, 6, 2, 3, 1 + createsprite gUnknown_08592860, ANIM_TARGET, 66, -8, 18, 64, 3, 2, 2, 1 + createsprite gUnknown_08592860, ANIM_ATTACKER, 120, -24, 18, 90, 5, 1, 2, 1 + createsprite gUnknown_08592860, ANIM_ATTACKER, 120, -40, 14, 128, 4, 1, 2, 1 + delay 6 + createsprite gUnknown_08592830, ANIM_TARGET, 66, -4, 16, 0, 6, 1, 2, 1 + createsprite gUnknown_08592830, ANIM_TARGET, 66, -16, 12, 192, 5, 2, 3, 1 + delay 0 + createsprite gUnknown_08592848, ANIM_TARGET, 66, -4, 16, 0, 6, 1, 2, 1 + createsprite gUnknown_08592848, ANIM_TARGET, 66, -16, 12, 192, 5, 2, 3, 1 + delay 0 + createsprite gUnknown_08592860, ANIM_TARGET, 66, -4, 16, 0, 6, 1, 2, 1 + createsprite gUnknown_08592860, ANIM_TARGET, 66, -16, 12, 192, 5, 2, 3, 1 + waitforvisualfinish + playsewithpan SE_W016B, SOUND_PAN_TARGET + clearmonbg ANIM_DEF_PARTNER + delay 0 + restorebg + waitbgfadeout + createvisualtask sub_8116664, 10, 1, 0, 4, 0, RGB_BLACK + setarg 7, -1 + waitbgfadein end Move_SHADOW_FORCE: - end + loadspritegfx ANIM_TAG_ROUND_SHADOW + loadspritegfx ANIM_TAG_IMPACT + choosetwoturnanim ShadowForcePrep ShadowForceAttack +ShadowForceWaitEnd: + waitforvisualfinish + end +ShadowForcePrep: + playsewithpan 190, SOUND_PAN_ATTACKER, + createsprite gSimplePaletteBlendSpriteTemplate 2, 5, 1, 3, 0, 16, 0 + createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, 2, 0 + createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, 2, 0 + createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, 2, 0 + createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, 2, 0 + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, 0, 18, 6, 1, 3 + createvisualtask sub_81136E8, 2, 1, 1 + delay 80 + createsprite gSimplePaletteBlendSpriteTemplate 2, 5, 1, 3, 16, 0, 0 + createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, 2, 1 + createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, 2, 1 + createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, 2, 1 + createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, 2, 1 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + invisible 0 + delay 1 + goto ShadowForceWaitEnd +ShadowForceAttack: + monbg ANIM_ATTACKER + monbgprio_28 ANIM_ATTACKER + playsewithpan SE_W060, SOUND_PAN_ATTACKER + call ShadowForceBg + waitbgfadein + delay 10 + playsewithpan SOUND_PAN_ATTACKER, 192 + createvisualtask sub_811188C, 5, 1, 85 + delay 70 + createvisualtask AnimTask_ShakeMon2 2, 5, 1, 2, 0, 12, 1 + createvisualtask sub_8115A04 2, 6, 4, 0, 2, 0, 13, 0 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + delay 1 + call UnsetPsychicBg + waitbgfadein + goto ShadowForceWaitEnd +ShadowForceBg: + fadetobg BG_DARK + waitbgfadeout + createvisualtask sub_815A5C8, 5, 0 + waitbgfadein + return Move_HONE_CLAWS: end 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/rock_wrecker.png b/graphics/battle_anims/backgrounds/rock_wrecker.png new file mode 100644 index 0000000000000000000000000000000000000000..ca50da7b76be898616327410ffb07c75e5fbd5d6 GIT binary patch literal 1249 zcmeAS@N?(olHy`uVBq!ia0vp^4nSA|DI)Syc>J@v}D!U2f;;5(uYEnls5>bt>tc- z_apt{(;3T)1-`f>W;#h}F*^DS=rAo~VX^%prR3`|v0uUH$iH7FW_tVjK36#LW@Fag zGfzE!X*bPVxB0NngVI9=0$;9pyM5SqV9wb_mDwUwjJ7qY+*J9}uW=J$fGx$b>8~F_Q|7-yzszdsevT`AKvLUisrHiuh8&({pNF8P~ds*JMR{r*ZE-eLi6C_sSW)mFFH>?QEK%)!qWa| z->PeZHsx!|g-hgDEx#K0_1yC9#ow2&)mmMm^mL#1-}BF9*;w-W&YB6SWHZlZcjodw z^V-2EoIyv>$8tUM_euW0b?m z`i;EjBUJ%2MZ!vyBPt*BaO*!;3Dl_55Sp|Un>HO!S64wTPg`*4(N_lI%{OGEjG1WY zdC)mbl^IcU7A#||^p4zJM{L-#W6yzOj1y<=g5(OR@EWn2IN literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/backgrounds/trick_room.png b/graphics/battle_anims/backgrounds/trick_room.png new file mode 100644 index 0000000000000000000000000000000000000000..99eda69bff6216d1012772b7180053b24c6dfc51 GIT binary patch literal 2043 zcmeHH`#;kQ0G-LqtC?q>r6N`sWgg21ix}mxl9lA^G7&OUnRc(4d3F^NP4j+VW#N*| zE04T|LMsc?khqN~Au0VE_tW{D^Esc-`JA854=2gh*i2mk_r@NBVy^GO-s(=^h-BE9r`m%I3X5?cPZL zrnDZcwuf4O`-G5SkP&yZ5Bzi-(z>Ebvx0D1mG?z8MS-^p;#*O8kmS4*vDg@f`7UdQ zOQ0MVVdfjHlgvBu)(Yawnxpy` z>zi715)YJgVb3TMM0r!K3jtK;x>7`6&o_-=X>plyAnp1ivsaz6s%|#P_p65|q=IuM z%ha^J?NA6TVw1%g)>9x|%@|D<7@tSaUb4y5jZ9%^mC8=iZp!iNzHEH(Lo2%DG2d%^ zg^jGx7`S3=qFPlu1I%}?D!uXvk#+qAfu%IL^5I&|t+1861r6R?mcY3zZ*VAV&^;+T zlBY|sjTm?6$bKm2Mb*)ZcoM!aUeZw|t`wsEGE?R2XMa%tDCaK5G|oCpm3gy0IsmKk zQarO1|1swh=_J;XVuyasX|x!?ZFF`Q=2)|itUBWI)dd@AG3aTF%Ot9AxeH?f3a)Ai zhumn=G$0}>8<_+gR}rZ-EM26Z1}Gp2Ni}q2gdY|L8O+_Retak`J;*${qG8cBDyN&t zk^K>P1}k0+T(6gcCL&V#ySt-2O#ge|f-szUmy4h~T2Tqa$K0r-{F3zy47&u!QC|WJ zjc3D3&l+$v8{T-NN9$GjHRQ&XO|wFaQcEYTk?pspP#!I`?0B^vF9rW%AJ1*NvdGaT zK3(Gqc|YSTTteqOH?_yLLw+pA?I2rhGtG1JG-v)*16^C<3C*v#u+!2Bdl&CseAS)9 z6voxvk2MFW(A+WA9;7N1`FbEPCsCMwsI7-Ictq?m%nRXbDmgk}eZ?pxKT zLG$tIG+HKl)AjWCaNWCF$ZYup`91G*;gkY{aCvenWnIN!>^63KP{7OHORdkU1rLhN z{e49tzGx!b)$-2MC9f4N&wClF)Z@zko-F!kn8>vkV=gjRhNaCBRu3#MwQAxrg?HHY zTjhMQM?@GK{f-1KQx9L#Ul!jylt2->wZQRhcP2WShU|omg#$$6KMCgnWk!UT6S1IaD@&dxDlMyON|85fHe3i04To!5(R z<+#SQhF)(A)42-(^o;k=925$YNldTnrqu+q2U&+kqz)%ocFbv)#0teNTh44OS3G#a>i(Fk+TLn*4w+x S`O;MX>!Y!D&bBNJ5c3m?gK+-< literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..3d0041baaa897abd0ec1395b944b28a804c89c2f GIT binary patch literal 1280 zcmeIuMVA#<6hPs|-Q7Q&;1b;3-GW1Kcc+11!QF#HBf+I{|7DzaCop30CQP`s_CDuU ztv#uN3MiN*IdKXp>^nt%*fZ~ce$Vtp6_YKQzPJ*yCDWHwO15PB(#pt|OkY+x6`gOb1k&gN^5Pj)lPdI{Hdc(I_sjV zZo2ECr(SyNqi@{$1^rV$z(9ixHpEcF3^&3^ql`AjSmTU0!9JPXB~= z*&W^!-*W8@a_vk0H+g^Zfz%&#$YDnu4Igvd2`8P3{j@XAI_G@y1s7xg&!zBXSHf3a zOZ{~>+;mHx+wO$#x)=W6eGg(j^eFt;lW?A=$Z`18v@_QfB V{Fwa7=QO`0e+}pSKEM1Ad;`R~qc8vf literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/attack_order.png b/graphics/battle_anims/sprites/attack_order.png new file mode 100644 index 0000000000000000000000000000000000000000..18531b8304514c66d315a403a50cca37d8e82644 GIT binary patch literal 1252 zcmeAS@N?(olHy`uVBq!ia0vp^0zf>0gBeJg&6VzEU|?nl@Ck99aNq+_#KOWNBO_zO zh7CV{{CIFeW5)~ypx`JN4S``F0^eMI{$XHXobT!47*a9kZJ4{zVFex+k>CIA`?wZm zc)nqGX+N_NLfPAyK)uZeM&b`B$X3gkCcActxnMH zPI`Fw!KaiN?PaAg*}r_wd{Hg^-v6jA{?zw|iwf8Gwmv>~*8cd0r8B;(Y@c)AGymz4 z_A>hi&Q|)&fz4aymRzzC{A0uC3YUL4gKIT%M8qY-Y$q{ZU=`vD@>5tU zocs1j*#bL-@Q>&^<&M$!{w_URBHbFZ~x>u^QoT# Uu2J8oM1#_!r>mdKI;Vst0QH3Fa{vGU literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/dragon_pulse.png b/graphics/battle_anims/sprites/dragon_pulse.png new file mode 100644 index 0000000000000000000000000000000000000000..cc6e28bc328092c6fdc8cdd6d5f1ce5b6908745e GIT binary patch literal 930 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3-oF?)7FfFfcO&_=LFrVE6$NaX65W@L|J- z4ILdFK<+3Q4S^970vhp>kwCA;db&7F_7mdKI;Vst0Py2Kxc~qF literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/poison_jab.png b/graphics/battle_anims/sprites/poison_jab.png new file mode 100644 index 0000000000000000000000000000000000000000..e7871a2c9dd8e49730a3f4ed9953cf365c5b9133 GIT binary patch literal 912 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl4m>B|mLR=Xd7%T)VG9)qe85Ol?aTfj;#1ba4!+m@~KETj+oRhtpC1kN?!y zE%UvdbC|D&XYq-RAy?nzpKUJrzvj5cMxi^`x6M?Z<;a}!bB>4m)%gd!*IZ)eXpnno e7h_eQe4X`&5aVva3F1Pafb(?qb6Mw<&;$SwDLtJ4 literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/power_gem.png b/graphics/battle_anims/sprites/power_gem.png new file mode 100644 index 0000000000000000000000000000000000000000..8d9ad469e39e0d64c9e2e409c4a5179bc6d4ffda GIT binary patch literal 905 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl4m>B|mLR^0^`~ZqLI2=ew_^@Ha zhK`O7Aa@juhQJ630gZUcNT63;JY5_^D&|Z*=gq{Rz~UNM^=<#Nn(nljcas?cc^r}t z==iVKyR~Ol#bd8Gvk%;6VcqtZRrtjd$&*JaRhI5uWppcLo7Y#ih3gsJcQ5Ky1O=U^ LtDnm{r-UW|29Gti literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/psycho_cut.png b/graphics/battle_anims/sprites/psycho_cut.png new file mode 100644 index 0000000000000000000000000000000000000000..3eb1de7d2aea2fe98f3edaa17a1965bf7c15904c GIT binary patch literal 922 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U}gyL32|-s(XgXq$ApXt6#*3y z4iP}vQ7{?;BPRspoc5RkeH-fO;uumf=k0lKAqGJn*NZjZ_NRNcYY0_k9FVr!F2a!S ze(e4=uhLBAo_#ZTWF{X7p0rW5I^VVY6EEw|Z|;@K={ZvWb9rC0c3yMiEj(&B|mLR>8_C@h%Z(NJKJ5TW2< zAz`2)z`?-*R5J=jLtrF?z%wK9#Xx^Xdb&7&?fY$ioz%d*QeI&9LQllN1XN z3MXg(FMNLaqH^8c^!GQMHfvT3Hz;goy2-=UqEqO_(oyWR)}BM5<;nMB6Qy4@Y-+ip k|1L<+OlRjWqxxSb8P2sb9>2FyRTdPOp00i_>zopr07~aO>;M1& literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/stone_edge.png b/graphics/battle_anims/sprites/stone_edge.png new file mode 100644 index 0000000000000000000000000000000000000000..44f678d8db953314d1507da7cf97123a6356c869 GIT binary patch literal 1181 zcmeAS@N?(olHy`uVBq!ia0vp^3P8MogBeIhiOiE@U|?nl@Ck9XxS()iL&Aay9t{Ns z6&V%<2^t9z3JC!k0Uin-77`W)5(XLq3KAR=5)vF796-IJU^E1VQwUsp-*TFPfic3< z#WAE}&f6I$`;I8^xLD`(8J_!WX?TrMLvf^uS-9f3p;)JSsH6; z?X>5N!pEK&#n}-j0%wIUU^AUQf6kxdJqPvl9gXLF?`>z|?JJbr;M}^%tH)!)j-Uw& zM;F+gm=M$w&T6m!@!(Ps(;1RIhFzr_5*&F}HKrN1b(lINO7q=6SMc-X$@I(CJ8f=0 zyfgQEZ#<`z$RVSIb}rAU0uuth|C=-+V6tQFguvicTeMc#oo@{C$`TNiSgihfL04;5 z0Ix~+z3i=Q8aam_-hQcPZ}~Il*%$lSmf6cb@B4V>!i3*(Y;OV@LwDw@Y^iRYc;N=n zMHy#&!&+_rC;3?ax_aTVbdTXpt0jpGB}16cCY`&shLP)b!H=?Kr~UovBAq^bd>SwR zW_`EBL%px6PkPqzZ>p=wa8#?|Q^8cNfYobmFWl><%k*Yz4nu{5h=RY^ZN^(sv(^`iPE>b2 zQ#PmZEbAEoo+W9|cAkmQRTmYow~ZHC#MGkDZ`5qbvi4Mfk?np(wo>b#TD-IudHaPVmKWsRa~TpU%HaeQlA}bdSfT{?(-gx(}s-N<=3#%&ZZ7&?($r z@Ykio`ep1+q3j8LukKXmoBUX|^3aEO$3nU~TNn-;Dwy8)%w5Mpt6Oy?!%05LyWzXG zS{?9P!o2=V@=oyO~fbLVkPT;}zn_UEpOIu8AIpX``r%tx%As;usq=bS(5baul6 ztvNDVxy;$U=gd|sdC1 zF0s!E{`N`C3>y3V?lNYv*p^)i@|gH_wvp%D#rMv|6-Q_p)f?WlX=wiO?`PjR{-eqD zS;nm~%sKbeC4SDmw*O0+i&nm`0oV8zI_RsUJ(^@&zPk)*%@ki^| z{=m4F=!|Z|y2M(BE8i!yxd|&UbqhOilDS=d&?>d+ j{<}U;=h~`=|MTpXSIPP9e9id?lutcf{an^LB{Ts5CJSuJ literal 0 HcmV?d00001 diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index cf0fa16f7d..b7496f5a61 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -312,6 +312,15 @@ #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) // battlers #define ANIM_ATTACKER 0 @@ -361,6 +370,12 @@ #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 // table ids for general animations #define B_ANIM_CASTFORM_CHANGE 0x0 diff --git a/include/graphics.h b/include/graphics.h index ad8eaf3762..6e5420a64f 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -4418,6 +4418,14 @@ 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[]; @@ -4710,6 +4718,14 @@ 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[]; extern const u32 gBattleAnimBgImage_Dark[]; extern const u32 gBattleAnimBgImage_Ghost[]; @@ -4724,6 +4740,8 @@ 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 gBattleAnimBgPalette_Dark[]; extern const u32 gBattleAnimBgPalette_Ghost[]; extern const u32 gBattleAnimBgPalette_Psychic[]; @@ -4740,6 +4758,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[]; @@ -4750,6 +4772,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 gUnknown_08C2A634[]; extern const u32 gUnknown_08C2A6D4[]; extern const u32 gUnknown_08C2A6EC[]; diff --git a/src/battle_anim.c b/src/battle_anim.c index 0d4f4bf799..02adcc1048 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -1430,6 +1430,15 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {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}, }; const struct CompressedSpritePalette gBattleAnimPaletteTable[] = @@ -1739,6 +1748,15 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {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}, }; const struct BattleAnimBackground gBattleAnimBackgroundTable[] = @@ -1770,6 +1788,12 @@ 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}, + [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}, }; static void (* const sScriptCmdTable[])(void) = diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index e731fbf3f3..7b0cc45c51 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -162,6 +162,10 @@ 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); +void AnimGrassKnot(struct Sprite *sprite); +void AnimWoodHammerSmall(struct Sprite *sprite); +void AnimWoodHammerBig(struct Sprite *sprite); const union AnimCmd gUnknown_085920F0[] = { @@ -793,6 +797,17 @@ const struct SpriteTemplate gTwisterLeafParticleSpriteTemplate = .callback = AnimMoveTwisterParticle, }; +const struct SpriteTemplate gAttackOrderParticleSpriteTemplate = +{ + .tileTag = ANIM_TAG_ATTACK_ORDER, + .paletteTag = ANIM_TAG_ATTACK_ORDER, + .oam = &gUnknown_0852490C, + .anims = gUnknown_08592388, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMoveTwisterParticle, +}; + const union AnimCmd gUnknown_085923C0[] = { ANIMCMD_FRAME(0, 3), @@ -2699,6 +2714,194 @@ const struct SpriteTemplate gNightSlashRightSpriteTemplate = .callback = AnimNightSlash, }; +const struct SpriteTemplate gLuckyChantBigStarsSpriteTemplate = +{ + .tileTag = ANIM_TAG_GOLD_STARS, + .paletteTag = ANIM_TAG_GOLD_STARS, + .oam = &gUnknown_0852490C, + .anims = gUnknown_08592314, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimPetalDanceBigFlower, +}; + +const struct SpriteTemplate gLuckyChantSmallStarsSpriteTemplate = +{ + .tileTag = ANIM_TAG_GOLD_STARS, + .paletteTag = ANIM_TAG_GOLD_STARS, + .oam = &gUnknown_08524904, + .anims = gUnknown_08592318, + .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 = &gUnknown_08524934, + .anims = gUnknown_085923D4, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimGrassKnot, +}; + +const struct SpriteTemplate gWoodHammerBigSpriteTemplate = +{ + .tileTag = ANIM_TAG_WOOD_HAMMER, + .paletteTag = ANIM_TAG_WOOD_HAMMER, + .oam = &gUnknown_08524974, + .anims = gWoodHammerBigAnims, + .images = NULL, + .affineAnims = gWoodHammerBigAffineAnims, + .callback = AnimWoodHammerBig, +}; + +const struct SpriteTemplate gWoodHammerSmallSpriteTemplate = +{ + .tileTag = ANIM_TAG_WOOD_HAMMER, + .paletteTag = ANIM_TAG_WOOD_HAMMER, + .oam = &gUnknown_08524914, + .anims = gWoodHammerSmallAnims, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimWoodHammerSmall, +}; + +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); + } +} + +void AnimWoodHammerBig(struct Sprite *sprite) +{ + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) + StartSpriteAffineAnim(sprite, 1); + + TranslateAnimSpriteToTargetMonLocation(sprite); +} + +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 diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c index 116aa6ae71..4e21be72c4 100755 --- a/src/battle_anim_effects_3.c +++ b/src/battle_anim_effects_3.c @@ -4708,6 +4708,17 @@ static void AnimForesightMagnifyingGlassStep(struct Sprite *sprite) } } +const struct SpriteTemplate gDracoMeteorSmashSpriteTemplate = +{ + .tileTag = ANIM_TAG_WARM_ROCK, + .paletteTag = ANIM_TAG_WARM_ROCK, + .oam = &gUnknown_08524914,//&gUnknown_0852490C, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMeteorMashStar, +}; + static void AnimMeteorMashStarStep(struct Sprite *sprite) { sprite->pos2.x = ((sprite->data[2] - sprite->data[0]) * sprite->data[5]) / sprite->data[4]; diff --git a/src/dark.c b/src/dark.c index 482c09c04b..bc8f4afb3f 100644 --- a/src/dark.c +++ b/src/dark.c @@ -24,6 +24,7 @@ static void sub_81140C8(u8); static void sub_8114244(struct Task *); static void sub_8114374(u8); static void sub_8114748(u8); +void AnimPunishment(struct Sprite *sprite); const struct SpriteTemplate gUnknown_08596FC8 = { @@ -186,6 +187,90 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_8597138 = .callback = sub_81144BC, }; +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 = &gUnknown_08524974, + .anims = gPunishmentAnim, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80A77C8, +}; + +const struct SpriteTemplate gPunishmentImpactSpriteTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gUnknown_08524974,//gUnknown_08524A94, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gPunishmentImpactAffineAnim, + .callback = AnimPunishment, +}; + +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 sub_81136E8(u8 taskId) { int battler; diff --git a/src/dragon.c b/src/dragon.c index befaf52e7d..a1b6c4c0f4 100644 --- a/src/dragon.c +++ b/src/dragon.c @@ -14,6 +14,9 @@ static void sub_81132E0(struct Sprite *); static void sub_81134B8(u8); static void sub_8113574(struct Task *); static void sub_811369C(struct Sprite *); +static void AnimDragonRushStep(struct Sprite *sprite); +void AnimSpinningDracoMeteor(struct Sprite *sprite); +static void AnimSpinningDracoMeteorFinish(struct Sprite *sprite); EWRAM_DATA static u16 gUnknown_0203A100[7] = {0}; @@ -187,6 +190,136 @@ const struct SpriteTemplate gUnknown_08596FB0 = .callback = sub_81135EC, }; +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 = &gUnknown_0852497C, + .anims = gDragonRushAnimTable, + .images = NULL, + .affineAnims = gDragonRushAffineAnimTable, + .callback = AnimDragonRushStep, +}; + +const struct SpriteTemplate gDracoMetorSpriteTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_IMPACT, + .oam = &gUnknown_085249D4, + .anims = gDracoMeteorAnimCmd, + .images = NULL, + .affineAnims = gDracoMeteorAffineAnims, + .callback = AnimSpinningDracoMeteor, +}; + +const struct SpriteTemplate gDragonPulseSpriteTemplate = +{ + .tileTag = ANIM_TAG_DRAGON_PULSE, + .paletteTag = ANIM_TAG_DRAGON_PULSE, + .oam = &gUnknown_08524954, + .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); +} + +void AnimSpinningDracoMeteor(struct Sprite *sprite) +{ + InitSpritePosToAnimTarget(sprite, TRUE); + StartSpriteAnim(sprite, gBattleAnimArgs[2]); + sprite->data[0] = gBattleAnimArgs[3]; + + sprite->callback = WaitAnimForDuration; + StoreSpriteCallbackInData6(sprite, AnimSpinningDracoMeteorFinish); +} + void sub_8113064(struct Sprite *sprite) { sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); diff --git a/src/fight.c b/src/fight.c index 17589c4803..fd0cf66b89 100644 --- a/src/fight.c +++ b/src/fight.c @@ -35,6 +35,7 @@ static void sub_810D5DC(struct Sprite *); static void sub_810D6A8(struct Sprite *); static void sub_810D770(struct Sprite *); static void sub_810D830(struct Sprite *); +void forcePalmAnimCallback(struct Sprite *sprite); extern struct SpriteTemplate gBasicHitSplatSpriteTemplate; @@ -436,6 +437,64 @@ const struct SpriteTemplate gAuraSphereBlast = .callback = sub_810D874, }; +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 = &gUnknown_08524A94, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gForcePalmAffineAnims, + .callback = forcePalmAnimCallback, +}; + +void forcePalmAnimCallback(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 unc_080B08A0(struct Sprite *sprite) { SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); diff --git a/src/fire.c b/src/fire.c index 969d16a418..aee7e1d01d 100644 --- a/src/fire.c +++ b/src/fire.c @@ -38,6 +38,8 @@ static void sub_8109AFC(struct Sprite *); static void sub_8109C4C(struct Sprite *); static void sub_8109CB0(struct Sprite *); static void sub_8109E2C(u8 taskId); +static void AnimLavaPlumeOrbitScatterStep(struct Sprite *sprite); +void AnimLavaPlumeOrbitScatter(struct Sprite *sprite); const union AnimCmd gUnknown_08595340[] = { @@ -480,6 +482,46 @@ const s8 gUnknown_08595694[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 = &gUnknown_08524914, + .anims = gUnknown_085953D8, + .images = NULL, + .affineAnims = gLavaPlumeAffineAnims, + .callback = AnimLavaPlumeOrbitScatter, +}; + +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); +} + static void sub_8108EC8(struct Sprite *sprite) { sprite->data[0] = gBattleAnimArgs[0]; diff --git a/src/graphics.c b/src/graphics.c index 7a31edea58..d44adce418 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -175,6 +175,30 @@ const u32 gBattleAnimSpritePal_WorrySeed[] = INCBIN_U32("graphics/battle_anims/s 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"); @@ -1121,6 +1145,18 @@ 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"); + +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 gUnknown_E6BC04[] = INCBIN_U32("graphics/unknown/unknown_E6BC04.bin.lz"); const u32 sBlenderCenterGfx[] = INCBIN_U32("graphics/berry_blender/center.8bpp.lz"); diff --git a/src/ice.c b/src/ice.c index 8f0c97d821..5ed5b37add 100644 --- a/src/ice.c +++ b/src/ice.c @@ -48,6 +48,8 @@ void AnimTask_Haze2(u8); void AnimTask_OverlayFogTiles(u8); void AnimTask_Hail2(u8); bool8 GenerateHailParticle(u8 hailStructId, u8 affineAnimNum, u8 taskId, u8 c); +static void AvalancheAnim_Step2(struct Sprite *sprite); +void AvalancheAnim_Step(struct Sprite *sprite); const union AnimCmd gUnknown_08595A48[] = { @@ -522,6 +524,80 @@ const struct SpriteTemplate gUnknown_08595DFC = .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 = &gUnknown_08524914, + .anims = gAvalancheAnimCmd, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AvalancheAnim_Step, +}; + +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); +} + // probably unused static void sub_810B6C4(struct Sprite *sprite) { diff --git a/src/poison.c b/src/poison.c index 85779dd5e7..794098ec28 100644 --- a/src/poison.c +++ b/src/poison.c @@ -12,6 +12,11 @@ static void sub_810DC10(struct Sprite *); static void sub_810DCB4(struct Sprite *); static void sub_810DD24(struct Sprite *); static void AnimBubbleEffectStep(struct Sprite *); +static void AnimSuckerPunchStep(struct Sprite *sprite); +void AnimSuckerPunch(struct Sprite *sprite); +void AnimGunkShotParticlesStep(struct Sprite *sprite); +void AnimGunkShotParticles(struct Sprite *sprite); +void AnimGunkShotImpact(struct Sprite *sprite); extern const union AnimCmd *const gUnknown_08595200[]; @@ -189,8 +194,8 @@ const struct SpriteTemplate gWaterBubbleSpriteTemplate = const struct SpriteTemplate gGreenPoisonDrip = { - .tileTag = ANIM_TAG_POISON_BUBBLE, - .paletteTag = ANIM_TAG_VINE, + .tileTag = ANIM_TAG_GREEN_POISON_BUBBLE, + .paletteTag = ANIM_TAG_GREEN_POISON_BUBBLE, .oam = &gUnknown_085249CC, .anims = gUnknown_08596168, .images = NULL, @@ -200,8 +205,8 @@ const struct SpriteTemplate gGreenPoisonDrip = const struct SpriteTemplate gGreenPoisonBubble = { - .tileTag = ANIM_TAG_POISON_BUBBLE, - .paletteTag = ANIM_TAG_VINE, + .tileTag = ANIM_TAG_GREEN_POISON_BUBBLE, + .paletteTag = ANIM_TAG_GREEN_POISON_BUBBLE, .oam = &gUnknown_085249CC, .anims = gUnknown_08596164, .images = NULL, @@ -209,6 +214,195 @@ const struct SpriteTemplate gGreenPoisonBubble = .callback = sub_810DC2C, }; +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 = &gUnknown_0852496C, + .anims = gSuckerPunchAnim, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSuckerPunch, +}; + +const struct SpriteTemplate gGunkShoParticlesSpriteTemplate = +{ + .tileTag = ANIM_TAG_WATER_ORB, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gUnknown_08524A2C, + .anims = gGunkShotParticlesAnims, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimGunkShotParticles, +}; + +const struct SpriteTemplate gGunkShotImpactSpriteTemplate = +{ + .tileTag = ANIM_TAG_WATER_IMPACT, + .paletteTag = ANIM_TAG_POISON_BUBBLE, + .oam = &gUnknown_08524A94, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gSuckerPunchImpactAffineAnim, + .callback = AnimGunkShotImpact, +}; + +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); +} + +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); +} + +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]; + } +} + +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); + } +} + void sub_810DBAC(struct Sprite *sprite) { if (!gBattleAnimArgs[3]) diff --git a/src/psychic.c b/src/psychic.c index 6f808b5471..467516a183 100644 --- a/src/psychic.c +++ b/src/psychic.c @@ -28,6 +28,8 @@ static void sub_810F9D4(u8); static void sub_810FD3C(u8); static void sub_810FF34(u8); static void sub_8110134(u8); +void AnimateZenHeadbutt(struct Sprite *sprite); +void AnimPsychoCut(struct Sprite *sprite); const union AffineAnimCmd gUnknown_0859652C[] = { @@ -419,6 +421,122 @@ const struct SpriteTemplate gUnknown_08596920 = .callback = sub_8110240, }; +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 = &gUnknown_08524A9C, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gZenHeadbuttAffineAnims, + .callback = AnimateZenHeadbutt, +}; + +const struct SpriteTemplate gPsychoCutSpiralSpriteTemplate = +{ + .tileTag = ANIM_TAG_SPIRAL, + .paletteTag = ANIM_TAG_PSYCHO_CUT, + .oam = &gUnknown_08524A9C, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gUnknown_08596544, + .callback = sub_80A77C8, +}; + +const struct SpriteTemplate gPsychoCutSpriteTemplate = +{ + .tileTag = ANIM_TAG_PSYCHO_CUT, + .paletteTag = ANIM_TAG_PSYCHO_CUT, + .oam = &gUnknown_08524974, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimPsychoCut, +}; + +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); +} + +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; +} + void sub_810F1EC(struct Sprite *sprite) { u8 isContest = IsContest(); diff --git a/src/rock.c b/src/rock.c index f05816362e..0907a016a0 100644 --- a/src/rock.c +++ b/src/rock.c @@ -29,6 +29,13 @@ static void sub_8111214(struct Task *task); static u8 sub_811135C(void); static void sub_81113C8(struct Sprite *sprite); static void sub_811149C(struct Sprite *sprite); +static void AnimPowerGemOrbitFastStep(struct Sprite *sprite); +void AnimPowerGemOrbitFast(struct Sprite *sprite); +static void AnimPowerGemScatterStep(struct Sprite *sprite); +void AnimPowerGemScatter(struct Sprite *sprite); +static void AnimStealthRockStep2(struct Sprite *sprite); +static void AnimStealthRockStep(struct Sprite *sprite); +void AnimStealthRock(struct Sprite *sprite); const union AnimCmd gUnknown_08596AE0[] = { @@ -305,6 +312,179 @@ const struct SpriteTemplate gUnknown_08596CE0 = .callback = sub_80A8EE4, }; +const union AffineAnimCmd gPowerGemScatterAffineAnimCmd[] = +{ + AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0), + AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 1), + AFFINEANIMCMD_JUMP(1), +}; + +const union AffineAnimCmd *const gPowerGemScatterAffineAnims[] = +{ + gPowerGemScatterAffineAnimCmd, +}; + +const union AffineAnimCmd gPowerGemOrbAffineAnimCmd[] = +{ + AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0), + AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 1), + AFFINEANIMCMD_JUMP(1), +}; + +const union AffineAnimCmd *const gPowerGemOrbAffineAnims[] = +{ + gPowerGemOrbAffineAnimCmd, +}; + +const struct SpriteTemplate gPowerGemScatterSpriteTemplate = +{ + .tileTag = ANIM_TAG_POWER_GEM, + .paletteTag = ANIM_TAG_POWER_GEM, + .oam = &gUnknown_085249CC, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gPowerGemScatterAffineAnims, + .callback = AnimPowerGemScatter, +}; + +const struct SpriteTemplate gPowerGemOrbSpriteTemplate = +{ + .tileTag = ANIM_TAG_POWER_GEM, + .paletteTag = ANIM_TAG_POWER_GEM, + .oam = &gUnknown_0852496C, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gPowerGemOrbAffineAnims, + .callback = AnimPowerGemOrbitFast, +}; + +const struct SpriteTemplate gStoneEdgeSpriteTemplate = +{ + .tileTag = ANIM_TAG_STONE_EDGE, + .paletteTag = ANIM_TAG_STONE_EDGE, + .oam = &gUnknown_08524914, + .anims = gUnknown_085954D0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_8110B38, +}; + +const struct SpriteTemplate gStealthRockSpriteTemplate = +{ + .tileTag = ANIM_TAG_STEALTH_ROCK, + .paletteTag = ANIM_TAG_STEALTH_ROCK, + .oam = &gUnknown_0852490C, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimStealthRock, +}; + +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 AnimPowerGemScatter(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 = AnimPowerGemScatterStep; +} + +static void AnimPowerGemScatterStep(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); +} + +void AnimPowerGemOrbitFast(struct Sprite *sprite) +{ + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); + sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); + sprite->affineAnimPaused = 1; + sprite->data[0] = gBattleAnimArgs[0]; + sprite->data[1] = gBattleAnimArgs[1]; + sprite->data[7] = GetBattlerSpriteSubpriority(gBattleAnimAttacker); + sprite->callback = AnimPowerGemOrbitFastStep; + sprite->callback(sprite); +} + +static void AnimPowerGemOrbitFastStep(struct Sprite *sprite) +{ + if (sprite->data[1] >= 64 && sprite->data[1] <= 191) + sprite->subpriority = sprite->data[7] + 1; + else + sprite->subpriority = sprite->data[7] - 1; + + sprite->pos2.x = Sin(sprite->data[1], sprite->data[2] >> 8); + sprite->pos2.y = Cos(sprite->data[1], sprite->data[3] >> 8); + sprite->data[1] = (sprite->data[1] + 9) & 0xFF; + switch (sprite->data[5]) + { + case 1: + sprite->data[2] -= 0x400; + sprite->data[3] -= 0x100; + if (++sprite->data[4] == sprite->data[0]) + { + sprite->data[5] = 2; + return; + } + break; + case 0: + sprite->data[2] += 0x400; + sprite->data[3] += 0x100; + if (++sprite->data[4] == sprite->data[0]) + { + sprite->data[4] = 0; + sprite->data[5] = 1; + } + break; + } + + if ((u16)gBattleAnimArgs[7] == 0xFFFF) + DestroyAnimSprite(sprite); +} + void sub_81109F0(struct Sprite *sprite) { if (gBattleAnimArgs[3] != 0) diff --git a/src/water.c b/src/water.c index 4480c3f439..9d3ecb5fa2 100644 --- a/src/water.c +++ b/src/water.c @@ -53,6 +53,9 @@ void sub_8108408(struct Task*, u8); void sub_810871C(struct Task*, u8); void sub_8108AC0(struct Task*); void sub_8108D54(struct Sprite*, int, int); +void AnimAquaTail(struct Sprite *sprite); +static void AnimKnockOffAquaTailStep(struct Sprite *sprite); +void AnimKnockOffAquaTail(struct Sprite *sprite); extern const union AffineAnimCmd *const gUnknown_08593420[]; extern const union AffineAnimCmd *const gUnknown_08596208[]; @@ -480,6 +483,140 @@ const struct SpriteTemplate gUnknown_08595328 = extern const struct SpriteTemplate gUnknown_08597388; +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 = &gUnknown_0852497C, + .anims = gKnockOffAquaTailAnim, + .images = NULL, + .affineAnims = gKnockOffAquaTailAffineAnim, + .callback = AnimKnockOffAquaTail, +}; + +const struct SpriteTemplate gAquaTailHitSpriteTemplate = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_WATER_IMPACT, + .oam = &gUnknown_08524A94, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAquaTailHitAffineAnims, + .callback = AnimAquaTail, +}; + +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); +} + +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; From 28630452415d984722e65e8b62afb0d9611de46d Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 5 Aug 2019 11:24:49 +0200 Subject: [PATCH 403/667] Fix switch-in abilities text/pop-up --- asm/macros/battle_script.inc | 4 ++++ data/battle_scripts_1.s | 2 ++ include/battle.h | 1 + include/constants/battle_script_commands.h | 1 + src/battle_main.c | 19 ++++--------------- src/battle_message.c | 4 ++-- src/battle_script_commands.c | 3 +++ src/battle_util.c | 12 ++++-------- 8 files changed, 21 insertions(+), 25 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 01571f84a7..973a1cec19 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1656,6 +1656,10 @@ .4byte \ptr .endm + .macro settracedability battler:req + various \battler, VARIOUS_TRACE_ABILITY + .endm + @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 9dbc7bdba1..0f7bab8837 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6221,6 +6221,7 @@ BattleScript_TraceActivates:: call BattleScript_AbilityPopUp printstring STRINGID_PKMNTRACED waitmessage 0x40 + settracedability BS_ATTACKER switchinabilities BS_ATTACKER end3 @@ -6664,6 +6665,7 @@ BattleScript_AttackerAbilityStatRaiseEnd3:: end3 BattleScript_SwitchInAbilityMsg:: + call BattleScript_AbilityPopUp printfromtable gSwitchInAbilityStringIds waitmessage 0x40 end3 diff --git a/include/battle.h b/include/battle.h index 552e1446ca..ce6495e1f6 100644 --- a/include/battle.h +++ b/include/battle.h @@ -529,6 +529,7 @@ struct BattleStruct 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]; }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 8639cf0bd8..a0c5811744 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -141,6 +141,7 @@ #define VARIOUS_JUMP_IF_ROAR_FAILS 78 #define VARIOUS_TRY_INSTRUCT 79 #define VARIOUS_JUMP_IF_NOT_BERRY 80 +#define VARIOUS_TRACE_ABILITY 81 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/src/battle_main.c b/src/battle_main.c index 969ae5d8c8..0eaf6a1742 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3479,9 +3479,7 @@ static void DoBattleIntro(void) static void TryDoEventsBeforeFirstTurn(void) { - s32 i; - s32 j; - u8 effect = 0; + s32 i, j; if (gBattleControllerExecFlags) return; @@ -3508,12 +3506,8 @@ 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) @@ -3523,12 +3517,7 @@ static void TryDoEventsBeforeFirstTurn(void) // 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++) diff --git a/src/battle_message.c b/src/battle_message.c index df34a220fe..0f9d3a100b 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -583,8 +583,8 @@ static const u8 sText_PsychicTerrainEnds[] = _("The weirdness disappeared\nfrom 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[] = _("The {B_DEF_NAME_WITH_PREFIX} is tormented\nby {B_DEF_ABILITY}!"); -static const u8 sText_MoldBreakerEnters[] = _("The {B_DEF_NAME_WITH_PREFIX} breaks the mold!"); +static const u8 sText_BadDreamsDmg[] = _("{B_DEF_NAME_WITH_PREFIX} is tormented\nby {B_DEF_ABILITY}!"); +static const u8 sText_MoldBreakerEnters[] = _("{B_ATK_NAME_WITH_PREFIX} breaks the mold!"); static const u8 sText_TeravoltEnters[] = _("{B_ATK_NAME_WITH_PREFIX} is radiating a bursting aura!"); static const u8 sText_TurboblazeEnters[] = _("{B_ATK_NAME_WITH_PREFIX} is radiating a blazing aura!"); static const u8 sText_SlowStartEnters[] = _("{B_ATK_NAME_WITH_PREFIX} can't get it going!"); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f5d921da12..7f34ef68db 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6582,6 +6582,9 @@ static void atk76_various(void) else gBattlescriptCurrInstr += 7; return; + case VARIOUS_TRACE_ABILITY: + gBattleMons[gActiveBattler].ability = gBattleStruct->tracedAbility[gActiveBattler]; + break; case VARIOUS_JUMP_IF_NOT_BERRY: if (ItemId_GetPocket(gBattleMons[gActiveBattler].item) == POCKET_BERRIES) gBattlescriptCurrInstr += 7; diff --git a/src/battle_util.c b/src/battle_util.c index c4158c3874..451f4fcfa5 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3594,22 +3594,19 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && gBattleMons[target2].ability != 0 && gBattleMons[target2].hp != 0) { gActiveBattler = GetBattlerAtPosition(((Random() & 1) * 2) | side); - gBattleMons[i].ability = gBattleMons[gActiveBattler].ability; - gLastUsedAbility = gBattleMons[gActiveBattler].ability; + gBattleStruct->tracedAbility[i] = 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; + gBattleStruct->tracedAbility[i] = 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; + gBattleStruct->tracedAbility[i] = gLastUsedAbility = gBattleMons[gActiveBattler].ability; effect++; } } @@ -3618,8 +3615,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gActiveBattler = target1; if (gBattleMons[target1].ability && gBattleMons[target1].hp) { - gBattleMons[i].ability = gBattleMons[target1].ability; - gLastUsedAbility = gBattleMons[target1].ability; + gBattleStruct->tracedAbility[i] = gLastUsedAbility = gBattleMons[target1].ability; effect++; } } From 34a7b8bf767755fff058b270239261c77d2a1d67 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 5 Aug 2019 11:30:25 +0200 Subject: [PATCH 404/667] Burn affects physical moves only --- src/battle_util.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 451f4fcfa5..403a233eb8 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5771,7 +5771,8 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move dmg = ApplyModifier(UQ_4_12(1.5), dmg); // check burn - if (gBattleMons[battlerAtk].status1 & STATUS1_BURN && gBattleMoves[move].effect != EFFECT_FACADE && abilityAtk != ABILITY_GUTS) + 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 From 8542e7fb1f0b633fbfa8a86a48e6de3eb3e129b4 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 5 Aug 2019 11:39:31 +0200 Subject: [PATCH 405/667] Blizzard 100% accuracy in hail --- src/battle_script_commands.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 7f34ef68db..f9ccb46385 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1181,7 +1181,9 @@ static bool32 AccuracyCalcHelper(u16 move) return TRUE; } - if ((WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_RAIN_ANY) && (gBattleMoves[move].effect == EFFECT_THUNDER || gBattleMoves[move].effect == EFFECT_HURRICANE)) + 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)) { From 2c2b807a57561a5cf9cfce88995b37700bc2634c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 5 Aug 2019 11:48:50 +0200 Subject: [PATCH 406/667] Special Def boost for rock types in sandstorm --- src/battle_util.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/battle_util.c b/src/battle_util.c index 403a233eb8..8846107c20 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5749,6 +5749,10 @@ static u32 CalcDefenseStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, break; } + // sandstorm sp.def boost for rock types + if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SANDSTORM_ANY && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ROCK) && !usesDefStat) + MulModifier(&modifier, UQ_4_12(1.5)); + return ApplyModifier(modifier, defStat); } From 9823d2bdf1706b1a8a9f35073721d899515d3dfc Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 5 Aug 2019 12:15:15 +0200 Subject: [PATCH 407/667] Fix mega evo indicator priority on lvl-up-box --- src/battle_script_commands.c | 13 +++++++++++++ src/battle_util.c | 10 ++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f9ccb46385..af5982f44c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6045,6 +6045,17 @@ static void atk6B_atknameinbuff1(void) gBattlescriptCurrInstr++; } +// Because the indicator must have priority 0 to be properly displayed on healthbox, it needs to be temporarily changed while displaying lvl-up-box. +static void ChangeMegaIndicatorsPriority(u32 priority) +{ + s32 i; + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { + if (gBattleStruct->mega.indicatorSpriteIds[i] != 0xFF) + gSprites[gBattleStruct->mega.indicatorSpriteIds[i]].oam.priority = priority; + } +} + static void atk6C_drawlvlupbox(void) { if (gBattleScripting.atk6C_state == 0) @@ -6075,6 +6086,7 @@ static void atk6C_drawlvlupbox(void) SetBgAttribute(1, BG_ATTR_PRIORITY, 0); ShowBg(0); ShowBg(1); + ChangeMegaIndicatorsPriority(1); HandleBattleWindow(0x12, 7, 0x1D, 0x13, WINDOW_x80); gBattleScripting.atk6C_state = 4; break; @@ -6127,6 +6139,7 @@ static void atk6C_drawlvlupbox(void) case 10: if (!IsDma3ManagerBusyWithBgCopy()) { + ChangeMegaIndicatorsPriority(0); SetBgAttribute(0, BG_ATTR_PRIORITY, 0); SetBgAttribute(1, BG_ATTR_PRIORITY, 1); ShowBg(0); diff --git a/src/battle_util.c b/src/battle_util.c index 8846107c20..4e0164bd2e 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5750,7 +5750,7 @@ static u32 CalcDefenseStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, } // sandstorm sp.def boost for rock types - if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SANDSTORM_ANY && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ROCK) && !usesDefStat) + 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); @@ -6170,10 +6170,12 @@ bool32 CanMegaEvolve(u8 battlerId) mon = &gPlayerParty[gBattlerPartyIndexes[battlerId]]; itemId = GetMonData(mon, MON_DATA_HELD_ITEM); - if (itemId != ITEM_ENIGMA_BERRY) - holdEffect = ItemId_GetHoldEffect(itemId); - else + 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; From 0dd9a3dd0c6ebea127bb8a597b02b5714eabc3b9 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 5 Aug 2019 12:26:53 +0200 Subject: [PATCH 408/667] Fix Stealth Rock msg and target --- src/battle_message.c | 2 +- src/data/battle_moves.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/battle_message.c b/src/battle_message.c index 0f9d3a100b..63abfd100b 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -536,7 +536,7 @@ static const u8 sText_PkmnSwitchedStatChanges[] = _("{B_ATK_NAME_WITH_PREFIX} sw 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 your foe's team!"); +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!"); diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 964f831dcc..97d51f023e 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -5473,7 +5473,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, - .target = MOVE_TARGET_SELECTED, + .target = MOVE_TARGET_OPPONENTS_FIELD, .priority = 0, .flags = FLAG_MAGICCOAT_AFFECTED, .split = SPLIT_STATUS, @@ -6261,7 +6261,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, - .target = MOVE_TARGET_SELECTED, + .target = MOVE_TARGET_OPPONENTS_FIELD, .priority = 0, .flags = FLAG_MAGICCOAT_AFFECTED, .split = SPLIT_STATUS, @@ -7919,7 +7919,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .accuracy = 0, .pp = 20, .secondaryEffectChance = 0, - .target = MOVE_TARGET_SELECTED, + .target = MOVE_TARGET_OPPONENTS_FIELD, .priority = 0, .flags = FLAG_MAGICCOAT_AFFECTED, .split = SPLIT_STATUS, From c9de753eccd08a6976f7c1b563ce4ebe94344c60 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 8 Aug 2019 13:06:55 +0200 Subject: [PATCH 409/667] Illusion --- asm/macros/battle_script.inc | 13 +++ data/battle_anim_scripts.s | 8 ++ data/battle_scripts_1.s | 17 ++- include/battle.h | 10 ++ include/battle_scripts.h | 1 + include/battle_util.h | 3 + include/constants/battle_anim.h | 1 + include/constants/battle_script_commands.h | 3 + include/constants/battle_string_ids.h | 3 +- src/battle_ai_script_commands.c | 8 +- src/battle_anim_mons.c | 50 ++++---- src/battle_gfx_sfx_util.c | 11 ++ src/battle_interface.c | 6 +- src/battle_message.c | 129 +++++++++++---------- src/battle_script_commands.c | 25 +++- src/battle_util.c | 62 ++++++++++ src/pokeball.c | 40 ++++--- 17 files changed, 279 insertions(+), 111 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 973a1cec19..65525e82a8 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1660,6 +1660,19 @@ 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 + @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 619629f09b..2ed9fb9181 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -682,6 +682,7 @@ gBattleAnims_General:: .4byte General_TerrainGrassy .4byte General_TerrainElectric .4byte General_TerrainPsychic + .4byte General_IllusionOff .align 2 gBattleAnims_Special:: @@ -14755,6 +14756,13 @@ General_WishHeal: waitforvisualfinish createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 3, 10, 0, RGB_BLACK end + +General_IllusionOff: + monbg ANIM_TARGET + createvisualtask sub_815B7D0, 2, 0, 1 + waitforvisualfinish + clearmonbg ANIM_TARGET + end General_MegaEvolution: loadspritegfx ANIM_TAG_MEGA_STONE diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 0f7bab8837..6c5952b2b5 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4675,20 +4675,22 @@ 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 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 tryactivatemoxie BS_ATTACKER tryactivatefellstinger BS_ATTACKER trytrainerslidefirstdownmsg BS_TARGET @@ -5850,6 +5852,17 @@ BattleScript_MegaEvolution:: waitmessage 0x40 end2 +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_MoveUsedIsAsleep:: printstring STRINGID_PKMNFASTASLEEP waitmessage 0x40 diff --git a/include/battle.h b/include/battle.h index ce6495e1f6..f5cb1317ab 100644 --- a/include/battle.h +++ b/include/battle.h @@ -426,6 +426,14 @@ struct MegaEvolutionData u8 indicatorSpriteIds[MAX_BATTLERS_COUNT]; }; +struct Illusion +{ + u8 on:1; + u8 broken:1; + u8 partyId:3; + struct Pokemon *mon; +}; + struct BattleStruct { u8 turnEffectsTracker; @@ -530,6 +538,8 @@ struct BattleStruct 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]; + bool8 spriteIgnore0Hp; + struct Illusion illusion[MAX_BATTLERS_COUNT]; }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 3e33c4ead6..4288bb141b 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -323,5 +323,6 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/battle_util.h b/include/battle_util.h index 3832292617..8b3fa9de33 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -103,5 +103,8 @@ bool32 CanMegaEvolve(u8 battlerId); void UndoMegaEvolution(u8 monId); 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/battle_anim.h b/include/constants/battle_anim.h index b7496f5a61..c47168c5fc 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -406,6 +406,7 @@ #define B_ANIM_TERRAIN_GRASSY 0x19 #define B_ANIM_TERRAIN_ELECTRIC 0x1A #define B_ANIM_TERRAIN_PSYCHIC 0x1B +#define B_ANIM_ILLUSION_OFF 0x1C // special animations table #define B_ANIM_LVL_UP 0x0 diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index a0c5811744..89faba55aa 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -142,6 +142,9 @@ #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 // atk80, dmg manipulation #define ATK80_DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index d422379737..af497e73b2 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -539,7 +539,8 @@ #define STRINGID_AIRBALLOONPOP 535 #define STRINGID_INCINERATEBURN 536 #define STRINGID_BUGBITE 537 +#define STRINGID_ILLUSIONWOREOFF 538 -#define BATTLESTRINGS_COUNT 530 +#define BATTLESTRINGS_COUNT 539 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index bc624a5540..c33cfaaf25 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -750,13 +750,15 @@ 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) + 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 @@ -770,6 +772,10 @@ static void SetBattlerData(u8 battlerId) if (BATTLE_HISTORY->usedMoves[battlerId].moves[i] == 0) gBattleMons[battlerId].moves[i] = 0; } + + // Simulate Illusion + if ((illusionMon = GetIllusionMonPtr(battlerId)) != NULL) + gBattleMons[battlerId].species = GetMonData(illusionMon, MON_DATA_SPECIES2); } } diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index a667daecff..ea53169462 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -119,6 +119,7 @@ u8 GetBattlerSpriteCoord(u8 battlerId, u8 coordType) { u8 retVal; u16 species; + struct Pokemon *mon, *illusionMon; struct BattleSpriteInfo *spriteInfo; if (IsContest()) @@ -149,21 +150,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); @@ -831,21 +829,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) diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index e690c3ced6..887fb47a43 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -410,6 +410,9 @@ bool8 TryHandleLaunchBattleTableAnimation(u8 activeBattler, u8 atkBattler, u8 de return TRUE; } + if (tableId == B_ANIM_ILLUSION_OFF) + ClearIllusionMon(activeBattler); + gBattleAnimAttacker = atkBattler; gBattleAnimTarget = defBattler; gBattleSpritesDataPtr->animationData->animArg = argument; @@ -510,6 +513,9 @@ static void BattleLoadMonSpriteGfx(struct Pokemon *mon, u32 battlerId, bool32 op { 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) @@ -1152,6 +1158,11 @@ void ClearTemporarySpeciesSpriteData(u8 battlerId, bool8 dontClearSubstitute) gBattleMonForms[battlerId] = 0; if (!dontClearSubstitute) ClearBehindSubstituteBit(battlerId); + + if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) + SetIllusionMon(&gPlayerParty[gBattlerPartyIndexes[battlerId]], battlerId); + else + SetIllusionMon(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId); } void AllocateMonSpritesGfx(void) diff --git a/src/battle_interface.c b/src/battle_interface.c index 5f48a908bb..31bd234717 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -1868,10 +1868,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); diff --git a/src/battle_message.c b/src/battle_message.c index 63abfd100b..f85e90afe5 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -664,9 +664,11 @@ static const u8 sText_AirBalloonFloat[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} flo 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!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_ILLUSIONWOREOFF - 12] = sText_IllusionWoreOff, [STRINGID_BUGBITE - 12] = sText_BugBite, [STRINGID_INCINERATEBURN - 12] = sText_IncinerateBurn, [STRINGID_AIRBALLOONPOP - 12] = sText_AirBalloonPop, @@ -2307,10 +2309,10 @@ void BufferStringBattle(u16 stringID) 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++) { @@ -2630,7 +2632,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) \ @@ -2643,13 +2661,8 @@ 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) @@ -2848,89 +2861,61 @@ 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 - if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER) - GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_NICKNAME, text); - else - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_NICKNAME, text); - - StringGetEnd10(text); + GetBattlerNick(gBattlerTarget, 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) @@ -3055,7 +3040,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)) @@ -3287,11 +3291,18 @@ 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 - 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 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index af5982f44c..e6a2303b14 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4068,6 +4068,7 @@ static void atk45_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_SUBSTITUTE_FADE) { BtlController_EmitBattleAnimation(0, gBattlescriptCurrInstr[2], *argumentPtr); @@ -4112,6 +4113,7 @@ static void atk46_playanimation2(void) // animation Id is stored in the first po if (*animationIdPtr == B_ANIM_STATS_CHANGE || *animationIdPtr == B_ANIM_SNATCH_MOVE || *animationIdPtr == B_ANIM_MEGA_EVOLUTION + || *animationIdPtr == B_ANIM_ILLUSION_OFF || *animationIdPtr == B_ANIM_SUBSTITUTE_FADE) { BtlController_EmitBattleAnimation(0, *animationIdPtr, *argumentPtr); @@ -6570,10 +6572,9 @@ u32 IsFlowerVeilProtected(u32 battler) static void atk76_various(void) { struct Pokemon *mon; - u8 side; s32 i, j; u8 data[10]; - u32 bits; + u32 side, bits; if (gBattleControllerExecFlags) return; @@ -6600,6 +6601,26 @@ static void atk76_various(void) case VARIOUS_TRACE_ABILITY: gBattleMons[gActiveBattler].ability = gBattleStruct->tracedAbility[gActiveBattler]; 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; diff --git a/src/battle_util.c b/src/battle_util.c index 4e0164bd2e..4e2f95fc0f 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -9,6 +9,7 @@ #include "constants/moves.h" #include "constants/hold_effects.h" #include "constants/battle_anim.h" +#include "party_menu.h" #include "pokemon.h" #include "constants/species.h" #include "item.h" @@ -3423,6 +3424,14 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA effect++; } break; + case ABILITY_ILLUSION: + if (gBattleStruct->illusion[battler].on && !gBattleStruct->illusion[battler].broken && IsBattlerAlive(battler) && TARGET_TURN_DAMAGED) + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_IllusionOff; + effect++; + } + break; } break; case ABILITYEFFECT_IMMUNITY: // 5 @@ -6241,3 +6250,56 @@ bool32 CanBattlerGetOrLoseItem(u8 battlerId, u16 itemId) else return TRUE; } + +struct Pokemon *GetIllusionMonPtr(u32 battlerId) +{ + if (!gBattleStruct->illusion[battlerId].on || gBattleStruct->illusion[battlerId].broken) + return NULL; + + return gBattleStruct->illusion[battlerId].mon; +} + +void ClearIllusionMon(u32 battlerId) +{ + gBattleStruct->illusion[battlerId].on = 0; + gBattleStruct->illusion[battlerId].mon = NULL; + gBattleStruct->illusion[battlerId].broken = 1; +} + +bool32 SetIllusionMon(struct Pokemon *mon, u32 battlerId) +{ + struct Pokemon *party, *partnerMon; + s32 i, id; + + 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 = pokemon_order_func(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/pokeball.c b/src/pokeball.c index 793609ec28..5fcfd15e11 100644 --- a/src/pokeball.c +++ b/src/pokeball.c @@ -342,11 +342,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) { @@ -356,13 +353,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; @@ -743,8 +734,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; @@ -760,7 +750,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) { @@ -783,9 +772,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; @@ -1269,8 +1263,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); } From aebac38922a6ba0d8bd7d411ff64424ab27c7902 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 14 Aug 2019 12:20:06 +0200 Subject: [PATCH 410/667] Fix AnimTask_ShakeMon arguments --- data/battle_anim_scripts.s | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 2ed9fb9181..0b114a4923 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1452,7 +1452,7 @@ Move_PUNISHMENT: setalpha 12, 8 playsewithpan 155, SOUND_PAN_TARGET createsprite gPunishmentSpriteTemplate, 2, 4, 0, 0, 1, 0 - createvisualtask AnimTask_ShakeMon, 2, 5, ANIM_TARGET, 3, 0, 6, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -1462,7 +1462,7 @@ Move_PUNISHMENT: setalpha 12, 8 playsewithpan SE_W003, SOUND_PAN_TARGET createsprite gPunishmentImpactSpriteTemplate 2, 4, 0, 0, 1, 2, - createvisualtask AnimTask_ShakeMon 2, 5, ANIM_TARGET, 3, 0, 6, 1 + createvisualtask AnimTask_ShakeMon 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -1563,7 +1563,7 @@ Move_AQUA_RING: loadspritegfx ANIM_TAG_GUARD_RING monbg ANIM_ATK_PARTNER setalpha 12, 8 - createvisualtask AnimTask_ShakeMon, 5, 5, ANIM_ATTACKER, 0, 2, 23, 1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 23, 1 delay 5 playsewithpan SE_W152, SOUND_PAN_ATTACKER createsprite gUnknown_08595238, 2, 4, 10, 10, 25, 0 @@ -1732,7 +1732,7 @@ Move_FORCE_PALM: waitforvisualfinish playsewithpan SE_W004, SOUND_PAN_TARGET createsprite gForcePalmSpriteTemplate 3, 4, 0, 0, 1, 2 - createvisualtask AnimTask_ShakeMon, 5, 5, ANIM_TARGET, 4, 0, 6, 1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff @@ -1908,7 +1908,7 @@ Move_AQUA_TAIL: loadspritegfx ANIM_TAG_ICE_CRYSTALS monbg ANIM_DEF_PARTNER setalpha 12, 8 - createvisualtask AnimTask_ShakeMon, 5, 5, ANIM_ATTACKER, 0, 2, 23, 1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 23, 1 delay 5 playsewithpan SE_W152, SOUND_PAN_ATTACKER createsprite gUnknown_08595238, 2, 4, 10, 10, 25, 0 @@ -2106,7 +2106,7 @@ Move_DRAGON_RUSH: 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, 5, ANIM_TARGET, 3, 0, 5, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1 waitforvisualfinish playsewithpan 131, SOUND_PAN_TARGET createsprite gUnknown_08596B1C, 2, 6, 0, 0, 20, 24, 14, 2 @@ -2117,7 +2117,7 @@ Move_DRAGON_RUSH: createsprite gUnknown_08596B1C, 2, 6, 0, 0, 30, -18, 8, 2 createsprite gUnknown_08596B1C, 2, 6, 0, 0, -30, 18, 8, 2 createsprite gUnknown_08596B1C, 2, 6, 0, 0, -30, -18, 8, 2 - createvisualtask AnimTask_ShakeMon, 2, 5, ANIM_TARGET, 0, 3, 7, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 7, 1 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff @@ -2315,8 +2315,8 @@ Move_SWITCHEROO: playsewithpan SE_W104, 0 delay 16 playsewithpan SE_W213, 0 - createvisualtask AnimTask_ShakeMon, 3, 5, ANIM_ATTACKER, 5, 0, 7, 2 - createvisualtask AnimTask_ShakeMon, 3, 5, ANIM_TARGET, 5, 0, 7, 2 + createvisualtask AnimTask_ShakeMon, 3, ANIM_ATTACKER, 5, 0, 7, 2 + createvisualtask AnimTask_ShakeMon, 3, ANIM_TARGET, 5, 0, 7, 2 waitforvisualfinish restorebg waitbgfadein @@ -2462,8 +2462,8 @@ Move_AVALANCHE: delay 2 createsprite gAvalancheSpriteTemplate 130, 4, -17, 2, -20, 1 playsewithpan SE_W088, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 2, 5, ANIM_TARGET, 0, 5, 50, 1 - createvisualtask AnimTask_ShakeMon, 2, 5, ANIM_DEF_PARTNER, 0, 5, 50, 1 + 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 @@ -2775,7 +2775,7 @@ Move_ZEN_HEADBUTT: createsprite gUnknown_08592CD8, 2, 1, 1 waitforvisualfinish createvisualtask AnimTask_ShakeMonInPlace, 2, 5, 0, 2, 0, 4, 1 - createvisualtask AnimTask_ShakeMon, 2, 5, ANIM_TARGET, 5, 0, 6, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 createsprite gUnknown_08592CD8, 2, 1, 2 createsprite gAquaTailHitSpriteTemplate, 131, 4, 0, 0, 1, 1 playsewithpan SE_W233B, SOUND_PAN_TARGET @@ -3133,7 +3133,7 @@ RockWrecker_1: createsprite gBasicHitSplatSpriteTemplate, 131, 4, 0, 0, 1, 1 playsewithpan SE_W088 SOUND_PAN_TARGET createsprite gUnknown_08596B1C, 130, 6, 0, 0, 20, 24, 14, 2 - createvisualtask AnimTask_ShakeMon, 2, 5, ANIM_TARGET, 3, 0, 5, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1 createsprite gUnknown_08596B1C, 130, 6, 5, 0, -20, 24, 14, 1 createsprite gUnknown_08596B1C, 130, 6, 0, 5, 20, -18, 14, 2 createsprite gUnknown_08596B1C, 130, 6, -5, 0, -20, -18, 14, 2 @@ -3151,7 +3151,7 @@ RockWrecker_2: createsprite gBasicHitSplatSpriteTemplate, 131, 4, 0, 0, 1, 1 playsewithpan SE_W088 SOUND_PAN_TARGET createsprite gUnknown_08596B1C 130, 6, 0, 0, 20, 24, 14, 2 - createvisualtask AnimTask_ShakeMon, 2, 5, ANIM_TARGET, 3, 0, 5, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1 createsprite gUnknown_08596B1C 130, 6, 5, 0, -20, 24, 14, 1 createsprite gUnknown_08596B1C 130, 6, 0, 5, 20, -18, 14, 2 createsprite gUnknown_08596B1C 130, 6, -5, 0, -20, -18, 14, 2 @@ -3190,7 +3190,7 @@ Move_GUNK_SHOT: call GunkShotParticles call GunkShotParticles call GunkShotParticles - createvisualtask AnimTask_ShakeMon, 5, 5, ANIM_TARGET, 3, 0, 27, 1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 27, 1 loopsewithpan SE_W145C, SOUND_PAN_TARGET, 3, 15 call GunkShotImpact call GunkShotParticles @@ -3667,14 +3667,14 @@ Move_DOUBLE_HIT: createsprite gHorizontalLungeSpriteTemplate, 2, 2, 4, 4 delay 6 createsprite gBasicHitSplatSpriteTemplate, 2, 4, 0, 0, 1, 2 - createvisualtask AnimTask_ShakeMon, 2, 5, ANIM_TARGET, 3, 0, 6, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_W004, 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, 5, ANIM_TARGET, 3, 0, 6, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_W004, SOUND_PAN_TARGET delay 8 waitforvisualfinish @@ -3740,7 +3740,7 @@ Move_MAGMA_STORM: playsewithpan SE_W221B, SOUND_PAN_TARGET loopsewithpan SE_W221B, SOUND_PAN_TARGET, 5, 8 createvisualtask sub_8111590, 3 - createvisualtask AnimTask_ShakeMon, 5, 5, ANIM_TARGET, 0, 2, 47, 1 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 47, 1 createvisualtask sub_8115A04, 2, 6, 4, 2, 2, 0, 12, RGB(22, 9, 7) call FireSpinEffect call FireSpinEffect From f05375112bebd64273cd79b219f31ef9292c4415 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 21 Aug 2019 11:56:49 +0200 Subject: [PATCH 411/667] Erase isEgg field from battlemon, ability num to 2 bits --- include/pokemon.h | 5 ++--- src/battle_controller_link_opponent.c | 1 - src/battle_controller_link_partner.c | 1 - src/battle_controller_opponent.c | 1 - src/battle_controller_player.c | 1 - src/battle_controller_player_partner.c | 1 - src/battle_controller_recorded_opponent.c | 1 - src/battle_controller_recorded_player.c | 1 - src/battle_controller_wally.c | 1 - src/pokemon.c | 1 - 10 files changed, 2 insertions(+), 12 deletions(-) diff --git a/include/pokemon.h b/include/pokemon.h index d5459fe764..d45912d9ee 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -280,8 +280,7 @@ 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; @@ -501,7 +500,7 @@ u8 CalculatePlayerPartyCount(void); u8 CalculateEnemyPartyCount(void); u8 GetMonsStateToDoubles(void); u8 GetMonsStateToDoubles_2(void); -u8 GetAbilityBySpecies(u16 species, bool8 abilityNum); +u8 GetAbilityBySpecies(u16 species, u8 abilityNum); u8 GetMonAbility(struct Pokemon *mon); void CreateSecretBaseEnemyParty(struct SecretBase *secretBaseRecord); u8 GetSecretBaseTrainerPicIndex(void); diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index 5f842c632c..53fcd1723d 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -603,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); diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index 86ae2a5722..d03d73e3c0 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -488,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); diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index d94b47423a..5dc4fb3353 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -586,7 +586,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); diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 71b1f690dc..af9f2a487b 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -1671,7 +1671,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); diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 2a877e5847..e8ac309903 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -673,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); diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index a495db8356..f7394e9b5f 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -585,7 +585,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); diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index 4831600f9a..38aba4942e 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -566,7 +566,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); diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c index 5473a98816..9c3662e667 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -486,7 +486,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); diff --git a/src/pokemon.c b/src/pokemon.c index 4ae81c653e..b5a095aa28 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4293,7 +4293,6 @@ void PokemonToBattleMon(struct Pokemon *src, struct BattlePokemon *dst) 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->isEgg = GetMonData(src, MON_DATA_IS_EGG, 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; From 143cb7ad3512fba621ce50fe287700f2a9c3f555 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 22 Aug 2019 15:57:33 +0200 Subject: [PATCH 412/667] Updated switch mechanics --- include/battle_script_commands.h | 1 + include/battle_scripts.h | 1 + src/battle_main.c | 12 +- src/battle_script_commands.c | 77 ++- src/battle_util.c | 826 ++++++++++++++++--------------- 5 files changed, 480 insertions(+), 437 deletions(-) diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index e84500b783..72f04323a2 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -6,6 +6,7 @@ s32 CalcCritChanceStage(u8 battlerAtk, u8 battlerDef, u32 move, bool32 recordAbility); u8 GetBattlerTurnOrderNum(u8 battlerId); +bool32 NoAliveMonsForEitherParty(void); void SetMoveEffect(bool32 primary, u32 certain); void BattleDestroyYesNoCursorAt(u8 cursorPosition); void BattleCreateYesNoCursorAt(u8 cursorPosition); diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 4288bb141b..7750536d55 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -7,6 +7,7 @@ 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[]; diff --git a/src/battle_main.c b/src/battle_main.c index 0eaf6a1742..8c4883e0ef 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5220,7 +5220,7 @@ static void HandleAction_UseMove(void) { if (gBattlerTarget == gBattlerAttacker) continue; - if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) + if (IsBattlerAlive(gBattlerTarget)) break; } } @@ -5229,7 +5229,7 @@ static void HandleAction_UseMove(void) gBattlerTarget = *(gBattleStruct->moveTarget + gBattlerAttacker); } - if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) + if (!IsBattlerAlive(gBattlerTarget)) { if (GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget)) { @@ -5238,7 +5238,7 @@ static void HandleAction_UseMove(void) else { gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_SIDE); - if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) + if (!IsBattlerAlive(gBattlerTarget)) gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerTarget) ^ BIT_FLANK); } } @@ -5292,14 +5292,14 @@ static void HandleAction_UseMove(void) { if (gBattlerTarget == gBattlerAttacker) continue; - if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) + if (IsBattlerAlive(gBattlerTarget)) break; } } else { gBattlerTarget = *(gBattleStruct->moveTarget + gBattlerAttacker); - if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) + if (!IsBattlerAlive(gBattlerTarget)) { if (GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget)) { @@ -5308,7 +5308,7 @@ static void HandleAction_UseMove(void) else { gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_SIDE); - if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) + if (!IsBattlerAlive(gBattlerTarget)) gBattlerTarget = GetBattlerAtPosition(GetBattlerPosition(gBattlerTarget) ^ BIT_FLANK); } } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e6a2303b14..1f207084f6 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -943,10 +943,35 @@ bool32 IsBattlerProtected(u8 battlerId, u16 move) 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 void atk00_attackcanceler(void) { - s32 i; - u32 moveType; + s32 i, moveType; if (gBattleOutcome != 0) { @@ -990,11 +1015,9 @@ static void atk00_attackcanceler(void) } 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; @@ -1009,6 +1032,12 @@ static void atk00_attackcanceler(void) gHitMarker |= HITMARKER_OBEYS; + if (NoTargetPresent(gCurrentMove)) + { + gBattlescriptCurrInstr = BattleScript_ButItFailedAtkStringPpReduce; + return; + } + if (gProtectStructs[gBattlerTarget].bounceMove && gBattleMoves[gCurrentMove].flags & FLAG_MAGICCOAT_AFFECTED && !gProtectStructs[gBattlerAttacker].usesBouncedMove) @@ -3553,7 +3582,7 @@ static void atk23_getexp(void) } } -static bool32 IsBattleLostForPlayer(void) +static bool32 NoAliveMonsForPlayer(void) { u32 i; u32 HP_count = 0; @@ -3581,7 +3610,7 @@ static bool32 IsBattleLostForPlayer(void) return (HP_count == 0); } -static bool32 IsBattleWonForPlayer(void) +static bool32 NoAliveMonsForOpponent(void) { u32 i; u32 HP_count = 0; @@ -3598,14 +3627,19 @@ static bool32 IsBattleWonForPlayer(void) return (HP_count == 0); } +bool32 NoAliveMonsForEitherParty(void) +{ + return (NoAliveMonsForPlayer() || NoAliveMonsForOpponent()); +} + static void atk24(void) { if (gBattleControllerExecFlags) return; - if (IsBattleLostForPlayer()) + if (NoAliveMonsForPlayer()) gBattleOutcome |= B_OUTCOME_LOST; - if (IsBattleWonForPlayer()) + if (NoAliveMonsForOpponent()) gBattleOutcome |= B_OUTCOME_WON; if (gBattleOutcome == 0 && (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))) @@ -6910,8 +6944,7 @@ static void atk76_various(void) case VARIOUS_TRY_ACTIVATE_MOXIE: if (GetBattlerAbility(gActiveBattler) == ABILITY_MOXIE && HasAttackerFaintedTarget() - && !IsBattleLostForPlayer() - && !IsBattleWonForPlayer() + && !NoAliveMonsForEitherParty() && gBattleMons[gBattlerAttacker].statStages[STAT_ATK] != 12) { gBattleMons[gBattlerAttacker].statStages[STAT_ATK]++; @@ -6925,8 +6958,7 @@ static void atk76_various(void) case VARIOUS_TRY_ACTIVATE_FELL_STINGER: if (gBattleMoves[gCurrentMove].effect == EFFECT_FELL_STINGER && HasAttackerFaintedTarget() - && !IsBattleLostForPlayer() - && !IsBattleWonForPlayer() + && !NoAliveMonsForEitherParty() && gBattleMons[gBattlerAttacker].statStages[STAT_ATK] != 12) { if (gBattleMons[gBattlerAttacker].statStages[STAT_ATK] >= 11) @@ -7112,7 +7144,7 @@ static void atk76_various(void) } return; case VARIOUS_JUMP_IF_BATTLE_END: - if (IsBattleLostForPlayer() || IsBattleWonForPlayer()) + if (NoAliveMonsForEitherParty()) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); else gBattlescriptCurrInstr += 7; @@ -7739,7 +7771,7 @@ static void atk7A_jumpifnexttargetvalid(void) { if (gBattlerTarget == gBattlerAttacker && !(gBattleMoves[gCurrentMove].target & MOVE_TARGET_USER)) continue; - if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) + if (IsBattlerAlive(gBattlerTarget)) break; } @@ -8791,7 +8823,11 @@ static void atk95_setsandstorm(void) static void atk96_weatherdamage(void) { - if (WEATHER_HAS_EFFECT) + if (!IsBattlerAlive(gBattlerAttacker) || !WEATHER_HAS_EFFECT) + { + gBattleMoveDamage = 0; + } + else { u32 ability = GetBattlerAbility(gBattlerAttacker); if (gBattleWeather & WEATHER_SANDSTORM_ANY) @@ -8847,13 +8883,6 @@ static void atk96_weatherdamage(void) } } } - else - { - gBattleMoveDamage = 0; - } - - if (gAbsentBattlerFlags & gBitTable[gBattlerAttacker]) - gBattleMoveDamage = 0; gBattlescriptCurrInstr++; } @@ -10089,7 +10118,7 @@ static void atkC2_selectfirstvalidtarget(void) { if (gBattlerTarget == gBattlerAttacker && !(gBattleMoves[gCurrentMove].target & MOVE_TARGET_USER)) continue; - if (!(gAbsentBattlerFlags & gBitTable[gBattlerTarget])) + if (IsBattlerAlive(gBattlerTarget)) break; } gBattlescriptCurrInstr++; diff --git a/src/battle_util.c b/src/battle_util.c index 4e2f95fc0f..c016a4acec 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1372,7 +1372,7 @@ enum u8 DoBattlerEndTurnEffects(void) { - u8 effect = FALSE; + u32 ability, effect = 0; gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_x20); while (gBattleStruct->turnEffectsBattlerId < gBattlersCount && gBattleStruct->turnEffectsTracker <= ENDTURN_BATTLER_COUNT) @@ -1381,453 +1381,454 @@ u8 DoBattlerEndTurnEffects(void) if (gAbsentBattlerFlags & gBitTable[gActiveBattler]) { gBattleStruct->turnEffectsBattlerId++; + continue; } - else + + ability = GetBattlerAbility(gActiveBattler); + switch (gBattleStruct->turnEffectsTracker) { - u8 ability = GetBattlerAbility(gActiveBattler); - 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) - && !BATTLER_MAX_HP(gActiveBattler) - && !(gStatuses3[gActiveBattler] & STATUS3_HEAL_BLOCK) - && gBattleMons[gActiveBattler].hp != 0) + gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage *= -1; + 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 = gBattleMons[gActiveBattler].maxHP / 16; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage *= -1; + 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) + { + 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 + && ability != ABILITY_MAGIC_GUARD) + { + if (ability == ABILITY_POISON_HEAL) { - gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - 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 = gBattleMons[gActiveBattler].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; - 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) - { - 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 - && ability != ABILITY_MAGIC_GUARD) - { - 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 + if (!BATTLER_MAX_HP(gActiveBattler) && !(gStatuses3[gActiveBattler] & STATUS3_HEAL_BLOCK)) { gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; - BattleScriptExecute(BattleScript_PoisonTurnDmg); + gBattleMoveDamage *= -1; + BattleScriptExecute(BattleScript_PoisonHealActivates); effect++; } } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_BAD_POISON: // toxic poison - if ((gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_POISON) - && gBattleMons[gActiveBattler].hp != 0 - && ability != ABILITY_MAGIC_GUARD) - { - 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) - gBattleMoveDamage = 1; - if ((gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_COUNTER) != STATUS1_TOXIC_COUNTER) // not 16 turns - gBattleMons[gActiveBattler].status1 += 0x100; - gBattleMoveDamage *= (gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_COUNTER) >> 8; - BattleScriptExecute(BattleScript_PoisonTurnDmg); - effect++; - } - } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_BURN: // burn - if ((gBattleMons[gActiveBattler].status1 & STATUS1_BURN) - && gBattleMons[gActiveBattler].hp != 0 - && ability != ABILITY_MAGIC_GUARD) + else { gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; - BattleScriptExecute(BattleScript_BurnTurnDmg); + BattleScriptExecute(BattleScript_PoisonTurnDmg); effect++; } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_NIGHTMARES: // spooky nightmares - if ((gBattleMons[gActiveBattler].status2 & STATUS2_NIGHTMARE) - && gBattleMons[gActiveBattler].hp != 0 - && ability != ABILITY_MAGIC_GUARD) + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_BAD_POISON: // toxic poison + if ((gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_POISON) + && gBattleMons[gActiveBattler].hp != 0 + && ability != ABILITY_MAGIC_GUARD) + { + if (ability == ABILITY_POISON_HEAL) { - // 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) + if (!BATTLER_MAX_HP(gActiveBattler) && !(gStatuses3[gActiveBattler] & STATUS3_HEAL_BLOCK)) { - gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 4; + gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; - BattleScriptExecute(BattleScript_NightmareTurnDmg); + gBattleMoveDamage *= -1; + BattleScriptExecute(BattleScript_PoisonHealActivates); effect++; } - else - { - gBattleMons[gActiveBattler].status2 &= ~STATUS2_NIGHTMARE; - } } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_CURSE: // curse - if ((gBattleMons[gActiveBattler].status2 & STATUS2_CURSED) - && gBattleMons[gActiveBattler].hp != 0 - && ability != ABILITY_MAGIC_GUARD) + else + { + gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + if ((gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_COUNTER) != STATUS1_TOXIC_COUNTER) // not 16 turns + gBattleMons[gActiveBattler].status1 += 0x100; + gBattleMoveDamage *= (gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_COUNTER) >> 8; + BattleScriptExecute(BattleScript_PoisonTurnDmg); + effect++; + } + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_BURN: // burn + if ((gBattleMons[gActiveBattler].status1 & STATUS1_BURN) + && gBattleMons[gActiveBattler].hp != 0 + && ability != ABILITY_MAGIC_GUARD) + { + gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; + 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 + && ability != ABILITY_MAGIC_GUARD) + { + // 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 { - if (--gDisableStructs[gActiveBattler].wrapTurns != 0) // damaged by wrap - { - 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 / 8; - else - gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16; + gBattleMons[gActiveBattler].status2 &= ~STATUS2_NIGHTMARE; + } + } + gBattleStruct->turnEffectsTracker++; + break; + case ENDTURN_CURSE: // curse + if ((gBattleMons[gActiveBattler].status2 & STATUS2_CURSED) + && gBattleMons[gActiveBattler].hp != 0 + && ability != ABILITY_MAGIC_GUARD) + { + 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 + { + 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 / 8; + else + gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 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++; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; } - gBattleStruct->turnEffectsTracker++; - break; - case ENDTURN_UPROAR: // uproar - if (gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR) + else // broke free { - for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount; gBattlerAttacker++) + 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 -= 0x10; // 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 -= 0x10; // 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 - { - 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 -= 0x400; - 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)) - { - gBattleScripting.moveEffect = MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER; - SetMoveEffect(1, 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] -= 0x8; - 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] -= 0x800; - 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 |= (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_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 -= 0x400; + 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(1, 0); + if (gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION) + BattleScriptExecute(BattleScript_ThrashConfuses); + effect++; + } + } + } + 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] -= 0x8; + 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] -= 0x800; + 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 |= (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_BATTLER_COUNT: // done + gBattleStruct->turnEffectsTracker = 0; + gBattleStruct->turnEffectsBattlerId++; + break; } + + if (effect != 0) + return effect; + } gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_x20); return 0; @@ -1978,6 +1979,15 @@ 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: gBattleStruct->faintedActionsBattlerId = 0; @@ -4591,14 +4601,16 @@ 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]); + } while (targetBattler == gBattlerAttacker || side == GetBattlerSide(targetBattler) || !IsBattlerAlive(targetBattler)); if (gBattleMoves[move].type == TYPE_ELECTRIC && IsAbilityOnOpposingSide(gBattlerAttacker, ABILITY_LIGHTNING_ROD) && gBattleMons[targetBattler].ability != ABILITY_LIGHTNING_ROD) @@ -4622,7 +4634,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: @@ -4645,7 +4657,7 @@ u8 GetMoveTarget(u16 move, u8 setTarget) else targetBattler = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); } - if (gAbsentBattlerFlags & gBitTable[targetBattler]) + if (!IsBattlerAlive(targetBattler)) targetBattler ^= BIT_FLANK; } else From 30dd8942e590b420f464e393a2f945ebaa72a8ca Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 22 Aug 2019 16:42:55 +0200 Subject: [PATCH 413/667] Don't use Protect when burned --- data/battle_ai_scripts.s | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index a7a5efad85..5ec787bd12 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -2430,32 +2430,23 @@ AI_CV_Curse_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 @@ -2463,15 +2454,17 @@ 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 From c97869018df39938fb8e000ceb4e3a8e70f47470 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 25 Aug 2019 15:33:28 +0200 Subject: [PATCH 414/667] Fix Mega Indicator appearing and priority --- include/battle_interface.h | 2 +- src/battle_interface.c | 23 +++++++++++++++++++---- src/battle_script_commands.c | 22 ++++------------------ 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/include/battle_interface.h b/include/battle_interface.h index f46ce3f24d..1a6d572366 100644 --- a/include/battle_interface.h +++ b/include/battle_interface.h @@ -82,7 +82,7 @@ void CreateMegaTriggerSprite(u8 battlerId, u8 palId); bool32 IsMegaTriggerSpriteActive(void); void HideMegaTriggerSprite(void); void DestroyMegaTriggerSprite(void); -void CreateMegaIndicatorSprite(u32 battlerId, u32 which); +u32 CreateMegaIndicatorSprite(u32 battlerId, u32 which); void DestroyMegaIndicatorSprite(u8 battlerId); u8 CreatePartyStatusSummarySprites(u8 battler, struct HpAndStatus *partyInfo, u8 arg2, bool8 isBattleStart); void Task_HidePartyStatusSummary(u8 taskId); diff --git a/src/battle_interface.c b/src/battle_interface.c index 38c83b25c1..7a4ab82c15 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -573,7 +573,7 @@ static const struct OamData sOamData_MegaIndicator = .matrixNum = 0, .size = SPRITE_SIZE(16x16), .tileNum = 0, - .priority = 0, + .priority = 1, .paletteNum = 0, .affineParam = 0, }; @@ -614,7 +614,7 @@ u8 CreateBattlerHealthboxSprites(u8 battlerId) { s16 data6 = 0; u8 healthboxLeftSpriteId, healthboxRightSpriteId; - u8 healthbarSpriteId; + u8 healthbarSpriteId, megaIndicatorSpriteId; struct Sprite *healthBarSpritePtr; if (!IsDoubleBattle()) @@ -693,7 +693,10 @@ u8 CreateBattlerHealthboxSprites(u8 battlerId) // Create mega indicator sprite if is a mega evolved mon. if (gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(battlerId)] & gBitTable[gBattlerPartyIndexes[battlerId]]) + { CreateMegaIndicatorSprite(battlerId, 0); + gSprites[megaIndicatorSpriteId].invisible = TRUE; + } return healthboxLeftSpriteId; } @@ -786,9 +789,18 @@ 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]]) + { + if (gBattleStruct->mega.indicatorSpriteIds[battlerId] != 0xFF) + gSprites[gBattleStruct->mega.indicatorSpriteIds[battlerId]].invisible = FALSE; + else + CreateMegaIndicatorSprite(battlerId, 0); + } } static void UpdateSpritePos(u8 spriteId, s16 x, s16 y) @@ -823,6 +835,8 @@ void UpdateOamPriorityInAllHealthboxes(u8 priority) gSprites[healthboxLeftSpriteId].oam.priority = priority; gSprites[healthboxRightSpriteId].oam.priority = priority; gSprites[healthbarSpriteId].oam.priority = priority; + if (gBattleStruct->mega.indicatorSpriteIds[i] != 0xFF) + gSprites[gBattleStruct->mega.indicatorSpriteIds[i]].oam.priority = priority; } } @@ -1351,9 +1365,9 @@ static const s8 sIndicatorPosDoubles[][2] = [B_POSITION_OPPONENT_RIGHT] = {45, -8}, }; -void CreateMegaIndicatorSprite(u32 battlerId, u32 which) +u32 CreateMegaIndicatorSprite(u32 battlerId, u32 which) { - u8 spriteId, position; + u32 spriteId, position; s16 x, y; LoadSpritePalette(&sSpritePalette_MegaIndicator); @@ -1375,6 +1389,7 @@ void CreateMegaIndicatorSprite(u32 battlerId, u32 which) gBattleStruct->mega.indicatorSpriteIds[battlerId] = spriteId; gSprites[spriteId].tBattler = battlerId; + return spriteId; } void DestroyMegaIndicatorSprite(u8 battlerId) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1f207084f6..05676d9a3f 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5718,6 +5718,7 @@ static void atk5B_yesnoboxstoplearningmove(void) gBattleCommunication[CURSOR_POSITION] = 1; BattleCreateYesNoCursorAt(1); } + if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); @@ -6081,17 +6082,6 @@ static void atk6B_atknameinbuff1(void) gBattlescriptCurrInstr++; } -// Because the indicator must have priority 0 to be properly displayed on healthbox, it needs to be temporarily changed while displaying lvl-up-box. -static void ChangeMegaIndicatorsPriority(u32 priority) -{ - s32 i; - for (i = 0; i < MAX_BATTLERS_COUNT; i++) - { - if (gBattleStruct->mega.indicatorSpriteIds[i] != 0xFF) - gSprites[gBattleStruct->mega.indicatorSpriteIds[i]].oam.priority = priority; - } -} - static void atk6C_drawlvlupbox(void) { if (gBattleScripting.atk6C_state == 0) @@ -6122,7 +6112,6 @@ static void atk6C_drawlvlupbox(void) SetBgAttribute(1, BG_ATTR_PRIORITY, 0); ShowBg(0); ShowBg(1); - ChangeMegaIndicatorsPriority(1); HandleBattleWindow(0x12, 7, 0x1D, 0x13, WINDOW_x80); gBattleScripting.atk6C_state = 4; break; @@ -6175,7 +6164,6 @@ static void atk6C_drawlvlupbox(void) case 10: if (!IsDma3ManagerBusyWithBgCopy()) { - ChangeMegaIndicatorsPriority(0); SetBgAttribute(0, BG_ATTR_PRIORITY, 0); SetBgAttribute(1, BG_ATTR_PRIORITY, 1); ShowBg(0); @@ -11365,7 +11353,7 @@ static void atkF2_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++) @@ -11403,10 +11391,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); } } } From cda75bca70a3a0273fdb9ad9b36fc531a1c31acb Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 25 Aug 2019 15:39:56 +0200 Subject: [PATCH 415/667] lol am dumb --- src/battle_interface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_interface.c b/src/battle_interface.c index 7a4ab82c15..96814d7df5 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -694,7 +694,7 @@ u8 CreateBattlerHealthboxSprites(u8 battlerId) // Create mega indicator sprite if is a mega evolved mon. if (gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(battlerId)] & gBitTable[gBattlerPartyIndexes[battlerId]]) { - CreateMegaIndicatorSprite(battlerId, 0); + megaIndicatorSpriteId = CreateMegaIndicatorSprite(battlerId, 0); gSprites[megaIndicatorSpriteId].invisible = TRUE; } From 63355d6a3b11ee8701b436290685f1bb8bbf9e24 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 26 Aug 2019 14:55:55 +0200 Subject: [PATCH 416/667] Fix no targets issue and switching faint issu --- src/battle_main.c | 7 ++----- src/battle_util.c | 49 +++++++++++++++++++++++------------------------ 2 files changed, 26 insertions(+), 30 deletions(-) diff --git a/src/battle_main.c b/src/battle_main.c index 8c4883e0ef..cb3891bc39 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5092,13 +5092,10 @@ void SetTypeBeforeUsingMove(u16 move, u8 battlerAtk) static void HandleAction_UseMove(void) { - u8 side; - u8 var = 4; - u32 moveType; + u32 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; diff --git a/src/battle_util.c b/src/battle_util.c index c016a4acec..1416363ece 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1990,6 +1990,13 @@ bool8 HandleFaintedMonActions(void) } 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 @@ -4585,11 +4592,24 @@ void HandleAction_RunBattleScript(void) // identical to RunBattleScriptCommands gBattleScriptingCommandsTable[*gBattlescriptCurrInstr](); } +u32 SetRandomTarget(u32 battlerId) +{ + 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}, + }; + u32 target = GetBattlerAtPosition(targets[GetBattlerSide(battlerId)][Random() % 2]); + if (!IsBattlerAlive(target)) + target ^= BIT_FLANK; + + return target; +} + u8 GetMoveTarget(u16 move, u8 setTarget) { u8 targetBattler = 0; - u8 moveTarget; - u8 side; + u32 i, moveTarget, side; if (setTarget) moveTarget = setTarget - 1; @@ -4606,11 +4626,7 @@ u8 GetMoveTarget(u16 move, u8 setTarget) } else { - side = GetBattlerSide(gBattlerAttacker); - do - { - targetBattler = Random() % gBattlersCount; - } while (targetBattler == gBattlerAttacker || side == GetBattlerSide(targetBattler) || !IsBattlerAlive(targetBattler)); + targetBattler = SetRandomTarget(gBattlerAttacker); if (gBattleMoves[move].type == TYPE_ELECTRIC && IsAbilityOnOpposingSide(gBattlerAttacker, ABILITY_LIGHTNING_ROD) && gBattleMons[targetBattler].ability != ABILITY_LIGHTNING_ROD) @@ -4642,24 +4658,7 @@ 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 (!IsBattlerAlive(targetBattler)) - targetBattler ^= BIT_FLANK; - } + targetBattler = SetRandomTarget(gBattlerAttacker); else targetBattler = GetBattlerAtPosition((GetBattlerPosition(gBattlerAttacker) & BIT_SIDE) ^ BIT_SIDE); break; From bfa357a60877a6ef368b38fefb9422c111abb2ff Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 27 Aug 2019 14:00:47 +0200 Subject: [PATCH 417/667] Fix Ai Roost --- data/battle_ai_scripts.s | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 5ec787bd12..0617e3b367 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -965,6 +965,9 @@ 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 @@ -1029,10 +1032,8 @@ AI_CheckViability: if_effect EFFECT_SKULL_BASH, AI_CV_ChargeUpMove if_effect EFFECT_SOLARBEAM, AI_CV_ChargeUpMove if_effect EFFECT_SEMI_INVULNERABLE, AI_CV_Fly - 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_Sandstorm if_effect EFFECT_SANDSTORM, AI_CV_Sandstorm if_effect EFFECT_FLATTER, AI_CV_Flatter @@ -3669,6 +3670,7 @@ AI_HPAware_DiscouragedEffectsWhenHighHP: @ 82DE21F .byte EFFECT_SYNTHESIS .byte EFFECT_MOONLIGHT .byte EFFECT_SOFTBOILED + .byte EFFECT_ROOST .byte EFFECT_MEMENTO .byte EFFECT_GRUDGE .byte EFFECT_OVERHEAT From 91b364e8d6d97bfab8f2a7fd1935ba6ca6544a60 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 27 Aug 2019 18:29:34 +0200 Subject: [PATCH 418/667] Ai use most powerful move smarrter --- data/battle_ai_scripts.s | 50 ++++--- include/battle.h | 2 +- include/battle_util.h | 1 + include/constants/battle_ai.h | 5 +- src/battle_ai_script_commands.c | 229 +++++++++++++------------------- 5 files changed, 129 insertions(+), 158 deletions(-) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 0617e3b367..31e91f1356 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -50,7 +50,7 @@ AI_CheckBadMove: 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_CheckEffect + if_equal MOVE_POWER_DISCOURAGED, AI_CheckBadMove_CheckEffect AI_CBM_CheckIfNegatesType: @ 82DBF92 if_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10 @@ -934,12 +934,21 @@ AI_CheckIfAlreadyDeadPriorities: 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 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 if_effect EFFECT_HIT, AI_CV_Hit if_effect EFFECT_SLEEP, AI_CV_Sleep if_effect EFFECT_ABSORB, AI_CV_Absorb @@ -3218,31 +3227,32 @@ 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 - goto AI_TryToFaint_InDanger + goto AI_TryToFaint_CheckIfDanger AI_TryToFaint_DoubleSuperEffective: - if_random_less_than 80, AI_TryToFaint_InDanger + if_random_less_than 80, AI_TryToFaint_CheckIfDanger score +2 - goto AI_TryToFaint_InDanger -AI_TryToFaint_TryToEncourageQuickAttack: - if_effect EFFECT_EXPLOSION, AI_TryToFaint_InDanger + 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_InDanger + goto AI_TryToFaint_CheckIfDanger AI_TryToFaint_ScoreUp4: score +4 -AI_TryToFaint_InDanger: - if_target_faster AI_TryToFaint_End - if_ai_can_go_down AI_TryToFaint_IsInDanger +AI_TryToFaint_CheckIfDanger: + if_user_faster AI_TryToFaint_End + if_ai_can_go_down AI_TryToFaint_Danger AI_TryToFaint_End: end -AI_TryToFaint_IsInDanger: +AI_TryToFaint_Danger: get_how_powerful_move_is - if_not_equal MOVE_MOST_POWERFUL, Score_Minus1 + if_not_equal MOVE_POWER_BEST, Score_Minus1 score +1 goto AI_TryToFaint_End @@ -3339,10 +3349,9 @@ AI_SetupFirstTurn_SetupEffectsToEncourage: 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 @@ -3354,7 +3363,6 @@ AI_Risky: AI_Risky_RandChance: if_random_less_than 128, AI_Risky_End score +2 - AI_Risky_End: end @@ -3384,7 +3392,7 @@ AI_PreferBatonPass: count_usable_party_mons AI_USER if_equal 0, AI_PreferBatonPassEnd get_how_powerful_move_is - if_not_equal 0, AI_PreferBatonPassEnd + if_not_equal MOVE_POWER_DISCOURAGED, AI_PreferBatonPassEnd if_has_move_with_effect AI_USER, EFFECT_BATON_PASS, AI_PreferBatonPass_GoForBatonPass if_random_less_than 80, AI_Risky_End @@ -3488,7 +3496,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: @@ -3499,7 +3507,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: @@ -3537,7 +3545,7 @@ 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 diff --git a/include/battle.h b/include/battle.h index f5cb1317ab..2e6d7586bc 100644 --- a/include/battle.h +++ b/include/battle.h @@ -251,7 +251,7 @@ struct AI_ThinkingStruct u32 aiFlags; u8 aiAction; u8 aiLogicId; - u8 simulatedRNG[4]; + 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. }; diff --git a/include/battle_util.h b/include/battle_util.h index 8b3fa9de33..58967f5e24 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -84,6 +84,7 @@ 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); diff --git a/include/constants/battle_ai.h b/include/constants/battle_ai.h index 238f5fc4cc..974ef2b770 100644 --- a/include/constants/battle_ai.h +++ b/include/constants/battle_ai.h @@ -31,8 +31,9 @@ // 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/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index c33cfaaf25..0aa2f3aa91 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -14,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" #include "constants/species.h" @@ -55,6 +56,7 @@ 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 BattleAICmd_if_random_less_than(void); static void BattleAICmd_if_random_greater_than(void); @@ -360,7 +362,7 @@ void BattleAI_SetupFlags(void) void BattleAI_SetupAIData(u8 defaultScoreMoves) { - s32 i; + s32 i, move, dmg; u8 moveLimitations; // Clear AI data but preserve the flags. @@ -386,25 +388,32 @@ 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() % 16)) / 100; + if (dmg == 0) + dmg = 1; + } + + AI_THINKING_STRUCT->simulatedDmg[sBattler_AI][gBattlerTarget][i] = dmg; + } } + + gBattlerTarget = SetRandomTarget(sBattler_AI); } u8 BattleAI_ChooseMoveOrAction(void) @@ -1322,9 +1331,38 @@ static void BattleAICmd_get_considered_move_power(void) gAIScriptPtr += 1; } +// Checks if the move dealing less damage does not have worse effects. +static bool32 CompareTwoMoves(u32 bestMove, u32 goodMove) +{ + 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(goodMove) && !IS_MOVE_PHYSICAL(bestMove)) + return FALSE; + } + // Check recoil + if (GetBattlerAbility(sBattler_AI) != ABILITY_ROCK_HEAD) + { + if (gBattleMoves[goodMove].effect == EFFECT_RECOIL && gBattleMoves[bestMove].effect != EFFECT_RECOIL) + return FALSE; + } + // Check recharge + if (gBattleMoves[goodMove].effect == EFFECT_RECHARGE && gBattleMoves[bestMove].effect != EFFECT_RECHARGE) + return FALSE; + // Check additional effect. + if (gBattleMoves[bestMove].effect != 0 && gBattleMoves[goodMove].effect == 0) + return FALSE; + + return TRUE; +} + static void BattleAICmd_get_how_powerful_move_is(void) { - s32 i, checkedMove; + s32 i, checkedMove, bestId, currId, hp; s32 moveDmgs[4]; for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++) @@ -1333,12 +1371,9 @@ static void BattleAICmd_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) { - *(&gBattleStruct->dynamicMoveType) = 0; - gMoveResultFlags = 0; - for (checkedMove = 0; checkedMove < MAX_MON_MOVES; checkedMove++) { for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++) @@ -1349,13 +1384,9 @@ static void BattleAICmd_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]; - moveDmgs[checkedMove] = AI_CalcDamage(gCurrentMove, sBattler_AI, gBattlerTarget); - moveDmgs[checkedMove] = moveDmgs[checkedMove] * AI_THINKING_STRUCT->simulatedRNG[checkedMove] / 100; - if (moveDmgs[checkedMove] == 0) - moveDmgs[checkedMove] = 1; + moveDmgs[checkedMove] = AI_THINKING_STRUCT->simulatedDmg[sBattler_AI][gBattlerTarget][checkedMove]; } else { @@ -1363,16 +1394,22 @@ static void BattleAICmd_get_how_powerful_move_is(void) } } - for (checkedMove = 0; checkedMove < MAX_MON_MOVES; checkedMove++) + for (bestId = 0, i = 0; i < MAX_MON_MOVES; i++) { - if (moveDmgs[checkedMove] > moveDmgs[AI_THINKING_STRUCT->movesetIndex]) - break; + if (moveDmgs[i] > moveDmgs[bestId]) + bestId = i; } - if (checkedMove == MAX_MON_MOVES) - AI_THINKING_STRUCT->funcResult = MOVE_MOST_POWERFUL; // Is the most powerful. + currId = AI_THINKING_STRUCT->movesetIndex; + hp = gBattleMons[gBattlerTarget].hp; + if (currId == bestId) + AI_THINKING_STRUCT->funcResult = MOVE_POWER_BEST; + // Compare percentage difference. + else if ((moveDmgs[bestId] * 100 / hp) - (moveDmgs[currId] * 100 / hp) <= 10 + && CompareTwoMoves(gBattleMons[sBattler_AI].moves[bestId], gBattleMons[sBattler_AI].moves[currId])) + 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 { @@ -1516,109 +1553,49 @@ static void BattleAICmd_get_considered_move_effect(void) gAIScriptPtr += 1; } -static void BattleAICmd_get_ability(void) +static s32 AI_GetAbility(u32 battlerId, bool32 guess) { - u8 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + // The AI knows its own ability. + if (IsBattlerAIControlled) + return gBattleMons[battlerId].ability; - if (!IsBattlerAIControlled(battlerId)) + if (BATTLE_HISTORY->abilities[battlerId] != 0) + return BATTLE_HISTORY->abilities[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 BattleAICmd_get_ability(void) +{ + AI_THINKING_STRUCT->funcResult = AI_GetAbility(BattleAI_GetWantedBattler(gAIScriptPtr[1]), TRUE); gAIScriptPtr += 2; } static void BattleAICmd_check_ability(void) { u32 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); - u32 ability = gAIScriptPtr[2]; + u32 ability = AI_GetAbility(battlerId, FALSE); - if (!IsBattlerAIControlled(battlerId)) - { - 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. @@ -1878,15 +1855,7 @@ static void BattleAICmd_if_can_faint(void) return; } - gBattleStruct->dynamicMoveType = 0; - gMoveResultFlags = 0; - dmg = AI_CalcDamage(AI_THINKING_STRUCT->moveConsidered, sBattler_AI, gBattlerTarget); - dmg = dmg * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100; - - // Moves always do at least 1 damage. - if (dmg == 0) - dmg = 1; - + dmg = AI_THINKING_STRUCT->simulatedDmg[sBattler_AI][gBattlerTarget][AI_THINKING_STRUCT->movesetIndex]; if (gBattleMons[gBattlerTarget].hp <= dmg) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); else @@ -1903,15 +1872,7 @@ static void BattleAICmd_if_cant_faint(void) return; } - gBattleStruct->dynamicMoveType = 0; - gMoveResultFlags = 0; - dmg = AI_CalcDamage(AI_THINKING_STRUCT->moveConsidered, sBattler_AI, gBattlerTarget); - dmg = dmg * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100; - - // Moves always do at least 1 damage. - if (dmg == 0) - dmg = 1; - + dmg = AI_THINKING_STRUCT->simulatedDmg[sBattler_AI][gBattlerTarget][AI_THINKING_STRUCT->movesetIndex]; if (gBattleMons[gBattlerTarget].hp > dmg) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); else From f19a51eea6c99778338326cb95b31b6bc4963b9e Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 27 Aug 2019 18:54:01 +0200 Subject: [PATCH 419/667] More ai tweaks --- src/battle_ai_script_commands.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 0aa2f3aa91..2b4789cfac 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -1347,7 +1347,15 @@ static bool32 CompareTwoMoves(u32 bestMove, u32 goodMove) // Check recoil if (GetBattlerAbility(sBattler_AI) != ABILITY_ROCK_HEAD) { - if (gBattleMoves[goodMove].effect == EFFECT_RECOIL && gBattleMoves[bestMove].effect != EFFECT_RECOIL) + if (((gBattleMoves[goodMove].effect == EFFECT_RECOIL + || gBattleMoves[goodMove].effect == EFFECT_RECOIL_IF_MISS + || gBattleMoves[goodMove].effect == EFFECT_RECOIL_50 + || gBattleMoves[goodMove].effect == EFFECT_RECOIL_33_STATUS) + && (gBattleMoves[bestMove].effect != EFFECT_RECOIL + && gBattleMoves[bestMove].effect != EFFECT_RECOIL_IF_MISS + && gBattleMoves[bestMove].effect != EFFECT_RECOIL_50 + && gBattleMoves[bestMove].effect != EFFECT_RECOIL_33_STATUS + && gBattleMoves[bestMove].effect != EFFECT_RECHARGE))) return FALSE; } // Check recharge From f979987c2fe26e98c9b18d23fd40b327add664a6 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 30 Aug 2019 12:25:21 +0200 Subject: [PATCH 420/667] Fix Intimidate and Trace on new switch in system --- data/battle_scripts_1.s | 8 ++- include/battle_scripts.h | 1 + include/battle_util.h | 3 +- src/battle_main.c | 2 +- src/battle_script_commands.c | 59 +++++++++++----------- src/battle_util.c | 95 +++++++++++++++--------------------- 6 files changed, 79 insertions(+), 89 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 6c5952b2b5..f24e100c75 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6234,8 +6234,12 @@ BattleScript_TraceActivates:: call BattleScript_AbilityPopUp printstring STRINGID_PKMNTRACED waitmessage 0x40 - settracedability BS_ATTACKER - switchinabilities BS_ATTACKER + settracedability BS_SCRIPTING + switchinabilities BS_SCRIPTING + return + +BattleScript_TraceActivatesEnd3:: + call BattleScript_TraceActivates end3 BattleScript_RainDishActivates:: diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 7750536d55..ad219d701f 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -140,6 +140,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[]; diff --git a/include/battle_util.h b/include/battle_util.h index 58967f5e24..005097ac33 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -19,7 +19,8 @@ #define ABILITYEFFECT_ATK_SYNCHRONIZE 0x8 #define ABILITYEFFECT_INTIMIDATE1 0x9 #define ABILITYEFFECT_INTIMIDATE2 0xA -#define ABILITYEFFECT_TRACE 0xB +#define ABILITYEFFECT_TRACE1 0xB +#define ABILITYEFFECT_TRACE2 0xC #define ABILITYEFFECT_SWITCH_IN_WEATHER 0xFF #define ITEMEFFECT_ON_SWITCH_IN 0x0 diff --git a/src/battle_main.c b/src/battle_main.c index cb3891bc39..d406144e4a 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3512,7 +3512,7 @@ static void TryDoEventsBeforeFirstTurn(void) } 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) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 05676d9a3f..ceca5070e6 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5443,39 +5443,38 @@ static void atk52_switchineffects(void) 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 | SIDE_STATUS_TOXIC_SPIKES_DAMAGED | SIDE_STATUS_STEALTH_ROCK_DAMAGED | SIDE_STATUS_STICKY_WEB_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; } } diff --git a/src/battle_util.c b/src/battle_util.c index 1416363ece..27e9ffbd85 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2021,7 +2021,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; @@ -2704,11 +2704,8 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA u8 effect = 0; u32 speciesAtk, speciesDef; u32 pidAtk, pidDef; - u32 moveType; + u32 moveType, move; u32 i; - u32 move; - u8 side; - u8 target1; if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) return 0; @@ -2960,15 +2957,14 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA 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++) + for (i = 0; i < gBattlersCount; i++) { - effect = TryWeatherFormChange(target1); + effect = TryWeatherFormChange(i); if (effect != 0) { BattleScriptPushCursorAndCallback(BattleScript_CastformChange); - gBattleScripting.battler = target1; - *(&gBattleStruct->formToChangeInto) = effect - 1; + gBattleScripting.battler = i; + gBattleStruct->formToChangeInto = effect - 1; break; } } @@ -3543,13 +3539,13 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA { BattleScriptPushCursorAndCallback(BattleScript_CastformChange); gBattleScripting.battler = battler; - *(&gBattleStruct->formToChangeInto) = effect - 1; + gBattleStruct->formToChangeInto = effect - 1; return effect; } } } break; - case ABILITYEFFECT_SYNCHRONIZE: // 7 + case ABILITYEFFECT_SYNCHRONIZE: if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT)) { gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT); @@ -3591,64 +3587,68 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } } break; - case ABILITYEFFECT_INTIMIDATE1: // 9 + 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); - BattleScriptPushCursorAndCallback(BattleScript_IntimidateActivatesEnd3); + if (caseID == ABILITYEFFECT_INTIMIDATE1) + { + BattleScriptPushCursorAndCallback(BattleScript_IntimidateActivatesEnd3); + } + else + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_IntimidateActivates; + } gBattlerAbility = gBattleStruct->intimidateBattler = i; effect++; break; } } break; - case ABILITYEFFECT_TRACE: // 11 + 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 target2; - side = (GetBattlerPosition(i) ^ BIT_SIDE) & BIT_SIDE; // side of the opposing pokemon - target1 = GetBattlerAtPosition(side); - target2 = GetBattlerAtPosition(side + BIT_FLANK); + 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 (gBattleMons[target1].ability != 0 && gBattleMons[target1].hp != 0 && gBattleMons[target2].ability != 0 && gBattleMons[target2].hp != 0) - { - gActiveBattler = GetBattlerAtPosition(((Random() & 1) * 2) | side); - gBattleStruct->tracedAbility[i] = gLastUsedAbility = gBattleMons[gActiveBattler].ability; - effect++; - } + gActiveBattler = GetBattlerAtPosition(((Random() & 1) * 2) | side), effect++; else if (gBattleMons[target1].ability != 0 && gBattleMons[target1].hp != 0) - { - gActiveBattler = target1; - gBattleStruct->tracedAbility[i] = gLastUsedAbility = gBattleMons[gActiveBattler].ability; - effect++; - } + gActiveBattler = target1, effect++; else if (gBattleMons[target2].ability != 0 && gBattleMons[target2].hp != 0) - { - gActiveBattler = target2; - gBattleStruct->tracedAbility[i] = gLastUsedAbility = gBattleMons[gActiveBattler].ability; - effect++; - } + gActiveBattler = target2, effect++; } else { - gActiveBattler = target1; if (gBattleMons[target1].ability && gBattleMons[target1].hp) - { - gBattleStruct->tracedAbility[i] = gLastUsedAbility = gBattleMons[target1].ability; - effect++; - } + gActiveBattler = target1, effect++; } + if (effect) { - BattleScriptPushCursorAndCallback(BattleScript_TraceActivates); + 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; gBattlerAbility = gBattleScripting.battler = i; PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBattler, gBattlerPartyIndexes[gActiveBattler]) @@ -3658,21 +3658,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } } break; - case ABILITYEFFECT_INTIMIDATE2: // 10 - 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); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_IntimidateActivates; - gBattlerAbility = gBattleStruct->intimidateBattler = i; - effect++; - break; - } - } - break; } if (effect && gLastUsedAbility != 0xFF) From 7647941ec4813889f99605888a5b90f78648bb94 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 30 Aug 2019 12:51:56 +0200 Subject: [PATCH 421/667] Fix Truant in new switch in system --- src/battle_script_commands.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ceca5070e6..c0e6d3f2a8 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5438,7 +5438,9 @@ static void atk52_switchineffects(void) { // 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; From a41ecf7101fc5f6d197f291e4bec4aa9b819ec0d Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 30 Aug 2019 17:57:19 +0200 Subject: [PATCH 422/667] more ai stuff, baton pass perish song strats --- asm/macros/battle_ai_script.inc | 24 ++++ data/battle_ai_scripts.s | 244 ++++++++++++++++++++------------ src/battle_ai_script_commands.c | 62 +++++++- src/battle_ai_switch_items.c | 108 ++++++++------ 4 files changed, 299 insertions(+), 139 deletions(-) diff --git a/asm/macros/battle_ai_script.inc b/asm/macros/battle_ai_script.inc index fa70c4d253..173595c82d 100644 --- a/asm/macros/battle_ai_script.inc +++ b/asm/macros/battle_ai_script.inc @@ -640,6 +640,30 @@ .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 + @ useful script macros .macro if_has_physical_move battler:req, ptr:req if_has_move_with_split \battler, SPLIT_PHYSICAL, \ptr diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 31e91f1356..31c614ac0c 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -163,6 +163,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 @@ -254,6 +255,12 @@ AI_CheckBadMove_CheckEffect: @ 82DC045 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 + end + +AI_CBM_FollowMe: + if_not_double_battle Score_Minus10 + if_battler_absent AI_USER_PARTNER, Score_Minus10 end AI_CBM_HealBell: @@ -724,26 +731,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 @@ -942,6 +956,19 @@ AI_CV_DmgMove: 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_CheckViability: if_target_is_ally AI_Ret @@ -949,6 +976,7 @@ AI_CheckViability: call_if_move_flag FLAG_HIGH_CRIT, AI_CV_HighCrit call AI_CheckIfAlreadyDead call AI_CV_DmgMove + call AI_WeakDmg if_effect EFFECT_HIT, AI_CV_Hit if_effect EFFECT_SLEEP, AI_CV_Sleep if_effect EFFECT_ABSORB, AI_CV_Absorb @@ -1081,8 +1109,31 @@ AI_CheckViability: 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_StealthRockEnd is_first_turn_for AI_USER @@ -1315,8 +1366,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 @@ -1328,18 +1379,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 @@ -1395,8 +1434,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 @@ -1408,18 +1447,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 @@ -1895,11 +1922,15 @@ 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 | STATUS2_INFATUATION, AI_CV_Trap2 - if_status3 AI_TARGET, STATUS3_PERISH_SONG, AI_CV_Trap5 goto AI_CV_TrapItem AI_CV_Trap5: score +2 @@ -2069,20 +2100,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 @@ -2095,22 +2133,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 @@ -2525,20 +2558,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 @@ -2546,18 +2575,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 @@ -3386,36 +3435,7 @@ AI_Risky_EffectsToEncourage: .byte EFFECT_REVENGE .byte EFFECT_TEETER_DANCE .byte -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 MOVE_POWER_DISCOURAGED, 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: - get_considered_move_effect - if_in_hwords sEffectsStatRaise, AI_PreferBatonPass2 - if_effect EFFECT_PROTECT, AI_PreferBatonPass_End - if_move MOVE_BATON_PASS, AI_PreferBatonPass_EncourageIfHighStats - if_random_less_than 20, AI_Risky_End - score +3 - -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: - get_last_used_bank_move AI_USER - if_in_hwords sMovesTable_ProtectMoves, Score_Minus2 - score +2 - end - + .align 1 sMovesTable_ProtectMoves: .2byte MOVE_PROTECT @@ -3423,10 +3443,15 @@ sMovesTable_ProtectMoves: .2byte -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 @@ -3440,6 +3465,28 @@ sEffectsStatRaise: .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 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 + end +AI_PreferBatonPass2: + get_turn_count + if_equal 0, Score_Plus5 + if_hp_less_than AI_USER, 60, Score_Minus10 + goto Score_Plus1 +AI_PreferBatonPass3: + get_last_used_bank_move AI_USER + if_in_hwords sMovesTable_ProtectMoves, Score_Minus2 + score +2 + end AI_PreferBatonPass_EncourageIfHighStats: get_turn_count if_equal 0, Score_Minus2 @@ -3450,7 +3497,6 @@ AI_PreferBatonPass_EncourageIfHighStats: if_stat_level_more_than AI_USER, STAT_SPATK, 7, Score_Plus2 if_stat_level_more_than AI_USER, STAT_SPATK, 6, Score_Plus1 end - AI_PreferBatonPassEnd: end @@ -3459,6 +3505,7 @@ AI_ConsiderAllyChosenMove: if_equal 0, AI_ConsiderAllyChosenMoveRet get_move_effect_from_result if_equal EFFECT_HELPING_HAND, AI_PartnerChoseHelpingHand + if_equal EFFECT_PERISH_SONG, AI_PartnerChosePerishSong AI_ConsiderAllyChosenMoveRet: end @@ -3468,17 +3515,30 @@ AI_PartnerChoseHelpingHand: 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 diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 2b4789cfac..68e517f9b3 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -170,6 +170,11 @@ static void BattleAICmd_if_ai_can_go_down(void); static void BattleAICmd_if_has_move_with_type(void); static void BattleAICmd_if_no_move_used(void); static void BattleAICmd_if_has_move_with_flag(void); +static void BattleAICmd_if_battler_absent(void); +static void BattleAICmd_is_grounded(void); +static void BattleAICmd_get_best_dmg_hp_percent(void); +static void BattleAICmd_get_curr_dmg_hp_percent(void); +static void BattleAICmd_get_move_split_from_result(void); // ewram EWRAM_DATA const u8 *gAIScriptPtr = NULL; @@ -292,6 +297,11 @@ static const BattleAICmdFunc sBattleAICmdTable[] = BattleAICmd_if_has_move_with_type, // 0x6D BattleAICmd_if_no_move_used, // 0x6E BattleAICmd_if_has_move_with_flag, // 0x6F + BattleAICmd_if_battler_absent, // 0x70 + BattleAICmd_is_grounded, // 0x71 + BattleAICmd_get_best_dmg_hp_percent, // 0x72 + BattleAICmd_get_curr_dmg_hp_percent, // 0x73 + BattleAICmd_get_move_split_from_result, // 0x74 }; static const u16 sDiscouragedPowerfulMoveEffects[] = @@ -404,7 +414,7 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves) move = gBattleMons[sBattler_AI].moves[i]; if (gBattleMoves[move].power != 0 && !(moveLimitations & gBitTable[i])) { - dmg = AI_CalcDamage(move, sBattler_AI, gBattlerTarget) * (100 - (Random() % 16)) / 100; + dmg = AI_CalcDamage(move, sBattler_AI, gBattlerTarget) * (100 - (Random() % 10)) / 100; if (dmg == 0) dmg = 1; } @@ -2665,3 +2675,53 @@ static void BattleAICmd_if_no_move_used(void) gAIScriptPtr += 6; } } + +static void BattleAICmd_if_battler_absent(void) +{ + u32 battler = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + + if (!IsBattlerAlive(battler)) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void BattleAICmd_is_grounded(void) +{ + u32 battler = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + + if (IsBattlerGrounded(battler)) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); + else + gAIScriptPtr += 6; +} + +static void BattleAICmd_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 BattleAICmd_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 BattleAICmd_get_move_split_from_result(void) +{ + AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->funcResult].type; + + gAIScriptPtr += 1; +} diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 02f524a24d..ce85a37f7a 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -579,15 +579,15 @@ void AI_TrySwitchOrUseItem(void) u8 GetMostSuitableMonToSwitchInto(void) { - u8 opposingBattler; - u32 bestDmg; - u8 bestMonId; - u8 battlerIn1, battlerIn2; - s32 firstId; - s32 lastId; // + 1 + u8 opposingBattler = 0; + u32 bestDmg = 0; + u8 bestMonId = 0; + u8 battlerIn1 = 0, battlerIn2 = 0; + s32 firstId = 0; + s32 lastId = 0; // + 1 struct Pokemon *party; - s32 i, j; - u8 invalidMons; + s32 i, j, aliveCount = 0; + u8 invalidMons = 0, bits = 0; u16 move; if (*(gBattleStruct->monToSwitchIntoId + gActiveBattler) != PARTY_SIZE) @@ -603,8 +603,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; } @@ -622,24 +621,56 @@ u8 GetMostSuitableMonToSwitchInto(void) else party = gEnemyParty; - invalidMons = 0; + // Get invalid slots ids. + for (i = firstId; i < lastId; 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)) + invalidMons |= gBitTable[i]; + else + aliveCount++; + } - while (invalidMons != 0x3F) // All mons are invalid. + // 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. + for (i = firstId; i < lastId; i++) + { + if (invalidMons & gBitTable[i]) + continue; + + for (j = 0; j < MAX_MON_MOVES; j++) + { + if (GetMonData(&party[i], MON_DATA_MOVE1 + j, NULL) == MOVE_BATON_PASS) + { + bits |= gBitTable[i]; + break; + } + } + } + if ((aliveCount == 2 || (aliveCount > 2 && Random() % 3 == 0)) && bits) + { + do + { + bestMonId = (Random() % (lastId - firstId)) + firstId; + } while (!(bits & gBitTable[bestMonId])); + return bestMonId; + } + + bits = 0; + while (bits != 0x3F) // All mons are invalid. { bestDmg = 0; - bestMonId = 6; + bestMonId = PARTY_SIZE; // 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)) + 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; @@ -662,10 +693,6 @@ u8 GetMostSuitableMonToSwitchInto(void) 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? @@ -681,11 +708,11 @@ u8 GetMostSuitableMonToSwitchInto(void) 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. + bits |= gBitTable[bestMonId]; // Sorry buddy, we want something better. } else { - invalidMons = 0x3F; // No viable mon to switch. + bits = 0x3F; // No viable mon to switch. } } @@ -697,31 +724,20 @@ u8 GetMostSuitableMonToSwitchInto(void) // 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 ((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)) + if (gBitTable[i] & invalidMons) continue; for (j = 0; j < MAX_MON_MOVES; j++) { - s32 dmg = 0; move = GetMonData(&party[i], MON_DATA_MOVE1 + j); - if (move != MOVE_NONE && gBattleMoves[move].power != 1) + if (move != MOVE_NONE && gBattleMoves[move].power != 0) { - dmg = AI_CalcPartyMonDamage(move, gActiveBattler, opposingBattler, &party[i]); - } - if (bestDmg < dmg) - { - bestDmg = dmg; - bestMonId = i; + s32 dmg = AI_CalcPartyMonDamage(move, gActiveBattler, opposingBattler, &party[i]); + if (bestDmg < dmg) + { + bestDmg = dmg; + bestMonId = i; + } } } } From cfb49cdd0bf817d4368181e046164b0c83988b1d Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 1 Sep 2019 14:23:11 +0200 Subject: [PATCH 423/667] Truant not dumb --- include/battle_ai_script_commands.h | 1 + src/battle_ai_script_commands.c | 35 +++- src/battle_ai_switch_items.c | 249 ++++++++++++++++------------ 3 files changed, 174 insertions(+), 111 deletions(-) diff --git a/include/battle_ai_script_commands.h b/include/battle_ai_script_commands.h index eb5d046d89..9f6654a465 100644 --- a/include/battle_ai_script_commands.h +++ b/include/battle_ai_script_commands.h @@ -14,6 +14,7 @@ void BattleAI_SetupItems(void); void BattleAI_SetupFlags(void); void BattleAI_SetupAIData(u8 defaultScoreMoves); u8 BattleAI_ChooseMoveOrAction(void); +bool32 IsTruantMonVulnerable(u32 battlerAI, u32 opposingBattler); void ClearBattlerMoveHistory(u8 battlerId); void RecordAbilityBattle(u8 battlerId, u8 abilityId); void ClearBattlerAbilityHistory(u8 battlerId); diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 68e517f9b3..2388252278 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -450,12 +450,27 @@ static u32 GetTotalBaseStat(u32 species) + 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].moves[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[4]; u8 consideredMoveArray[4]; u8 numOfBestMoves; - s32 i; + s32 i, id; u32 flags = AI_THINKING_STRUCT->aiFlags; RecordLastUsedMoveByTarget(); @@ -478,6 +493,7 @@ static u8 ChooseMoveOrAction_Singles(void) if (AI_THINKING_STRUCT->aiAction & AI_ACTION_WATCH) return AI_CHOICE_WATCH; + gActiveBattler = sBattler_AI; // Consider switching if all moves are worthless to use. if (AI_THINKING_STRUCT->aiFlags & (AI_SCRIPT_CHECK_VIABILITY | AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_PREFER_BATON_PASS) && CountUsablePartyMons(sBattler_AI) >= 1 @@ -493,7 +509,6 @@ static u8 ChooseMoveOrAction_Singles(void) break; } - gActiveBattler = sBattler_AI; if (i == MAX_MON_MOVES && GetMostSuitableMonToSwitchInto() != PARTY_SIZE) { AI_THINKING_STRUCT->switchMon = TRUE; @@ -501,6 +516,22 @@ static u8 ChooseMoveOrAction_Singles(void) } } + // 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 + && AI_THINKING_STRUCT->aiFlags & (AI_SCRIPT_CHECK_VIABILITY) + && gBattleMons[sBattler_AI].hp >= gBattleMons[sBattler_AI].maxHP / 2 + && CountUsablePartyMons(sBattler_AI) >= 1) + { + 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; diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index ce85a37f7a..d0a64088ca 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -577,18 +577,143 @@ void AI_TrySwitchOrUseItem(void) BtlController_EmitTwoReturnValues(1, B_ACTION_USE_MOVE, (gActiveBattler ^ BIT_SIDE) << 8); } +// 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) +{ + int i, j, bits = 0; + + for (i = firstId; i < lastId; i++) + { + if (invalidMons & gBitTable[i]) + continue; + + for (j = 0; j < MAX_MON_MOVES; j++) + { + if (GetMonData(&party[i], MON_DATA_MOVE1 + j, NULL) == MOVE_BATON_PASS) + { + bits |= gBitTable[i]; + break; + } + } + } + + 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 = 0; + u32 opposingBattler = 0; u32 bestDmg = 0; - u8 bestMonId = 0; + u32 bestMonId = 0; u8 battlerIn1 = 0, battlerIn2 = 0; s32 firstId = 0; s32 lastId = 0; // + 1 struct Pokemon *party; s32 i, j, aliveCount = 0; - u8 invalidMons = 0, bits = 0; - u16 move; + u8 invalidMons = 0; if (*(gBattleStruct->monToSwitchIntoId + gActiveBattler) != PARTY_SIZE) return *(gBattleStruct->monToSwitchIntoId + gActiveBattler); @@ -629,120 +754,26 @@ u8 GetMostSuitableMonToSwitchInto(void) || gBattlerPartyIndexes[battlerIn1] == i || gBattlerPartyIndexes[battlerIn2] == i || i == *(gBattleStruct->monToSwitchIntoId + battlerIn1) - || i == *(gBattleStruct->monToSwitchIntoId + battlerIn2)) + || 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++; } - // 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. - for (i = firstId; i < lastId; i++) - { - if (invalidMons & gBitTable[i]) - continue; - - for (j = 0; j < MAX_MON_MOVES; j++) - { - if (GetMonData(&party[i], MON_DATA_MOVE1 + j, NULL) == MOVE_BATON_PASS) - { - bits |= gBitTable[i]; - break; - } - } - } - if ((aliveCount == 2 || (aliveCount > 2 && Random() % 3 == 0)) && bits) - { - do - { - bestMonId = (Random() % (lastId - firstId)) + firstId; - } while (!(bits & gBitTable[bestMonId])); + bestMonId = GetBestMonBatonPass(party, firstId, lastId, invalidMons, aliveCount); + if (bestMonId != PARTY_SIZE) return bestMonId; - } - bits = 0; - while (bits != 0x3F) // All mons are invalid. - { - bestDmg = 0; - 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); + bestMonId = GestBestMonOffensive(party, firstId, lastId, invalidMons, opposingBattler); + if (bestMonId != PARTY_SIZE) + return bestMonId; - u8 atkType1 = gBaseStats[species].type1; - u8 atkType2 = gBaseStats[species].type2; - u8 defType1 = gBattleMons[opposingBattler].type1; - u8 defType2 = gBattleMons[opposingBattler].type2; + bestMonId = GetBestMonDmg(party, firstId, lastId, invalidMons, opposingBattler); + if (bestMonId != PARTY_SIZE) + return bestMonId; - 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++) - { - 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. - } - } - - gBattleStruct->dynamicMoveType = 0; - gMoveResultFlags = 0; - bestDmg = 0; - bestMonId = 6; - - // 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++) - { - 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; + return PARTY_SIZE; } static u8 GetAI_ItemType(u16 itemId, const u8 *itemEffect) From 621dd4f0bfe3060a65cf1327a4843b1f9c4c4724 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 21 Oct 2019 14:48:03 +0200 Subject: [PATCH 424/667] Fix Sheer Force moves and effects happening --- src/battle_script_commands.c | 5 ++ src/data/battle_moves.h | 134 +++++++++++++++++------------------ 2 files changed, 72 insertions(+), 67 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 954f06d079..67675c96fe 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2115,6 +2115,11 @@ void SetMoveEffect(bool32 primary, u32 certain) && !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 && gBattleScripting.moveEffect != MOVE_EFFECT_PAYDAY && gBattleScripting.moveEffect != MOVE_EFFECT_STEAL_ITEM) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 97d51f023e..e59f7ac4b5 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -388,7 +388,7 @@ 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, }, @@ -584,7 +584,7 @@ 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, }, @@ -724,7 +724,7 @@ 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, }, @@ -850,7 +850,7 @@ 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, }, @@ -878,7 +878,7 @@ 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, }, @@ -1186,7 +1186,7 @@ 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, }, @@ -1718,7 +1718,7 @@ 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, }, @@ -1732,7 +1732,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .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, }, @@ -1746,7 +1746,7 @@ 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, }, @@ -1760,7 +1760,7 @@ 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, }, @@ -1858,7 +1858,7 @@ 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, }, @@ -2055,7 +2055,7 @@ 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 | FLAG_IRON_FIST_BOOST, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_IRON_FIST_BOOST | FLAG_SHEER_FORCE_BOOST, .split = SPLIT_PHYSICAL, }, @@ -2223,7 +2223,7 @@ 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_STRONG_JAW_BOOST, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_STRONG_JAW_BOOST | FLAG_SHEER_FORCE_BOOST, .split = SPLIT_PHYSICAL, }, @@ -2265,7 +2265,7 @@ 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, }, @@ -2545,7 +2545,7 @@ 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, }, @@ -2671,7 +2671,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 50, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_BALLISTIC, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_BALLISTIC | FLAG_SHEER_FORCE_BOOST, .split = SPLIT_SPECIAL, }, @@ -2937,7 +2937,7 @@ 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_SPECIAL, }, @@ -3105,7 +3105,7 @@ 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, }, @@ -4142,7 +4142,7 @@ 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, }, @@ -4156,7 +4156,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 50, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_BALLISTIC, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_BALLISTIC | FLAG_SHEER_FORCE_BOOST, .split = SPLIT_SPECIAL, }, @@ -4198,7 +4198,7 @@ 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_HIGH_CRIT, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_HIGH_CRIT | FLAG_SHEER_FORCE_BOOST, .split = SPLIT_PHYSICAL, }, @@ -4240,7 +4240,7 @@ 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, }, @@ -4338,7 +4338,7 @@ 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 | FLAG_KINGSROCK_AFFECTED | FLAG_IRON_FIST_BOOST, + .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, }, @@ -4464,7 +4464,7 @@ 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, }, @@ -4632,7 +4632,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .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, }, @@ -4772,7 +4772,7 @@ 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, }, @@ -4829,7 +4829,7 @@ 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 | FLAG_RECKLESS_BOOST, + .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, }, @@ -5686,7 +5686,7 @@ 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 | FLAG_SOUND, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SOUND | FLAG_SHEER_FORCE_BOOST, .split = SPLIT_SPECIAL, }, @@ -5784,7 +5784,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_BALLISTIC, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_BALLISTIC | FLAG_SHEER_FORCE_BOOST, .split = SPLIT_SPECIAL, }, @@ -6025,7 +6025,7 @@ 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, }, @@ -6109,7 +6109,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 30, .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_SHEER_FORCE_BOOST, .split = SPLIT_SPECIAL, }, @@ -6179,7 +6179,7 @@ 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 | FLAG_HIGH_CRIT, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_HIGH_CRIT | FLAG_SHEER_FORCE_BOOST, .split = SPLIT_PHYSICAL, }, @@ -6291,7 +6291,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_SOUND, + .flags = FLAG_PROTECT_AFFECTED | FLAG_SOUND | FLAG_SHEER_FORCE_BOOST, .split = SPLIT_SPECIAL, }, @@ -6529,7 +6529,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 40, .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, }, @@ -6543,7 +6543,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 10, .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, }, @@ -6894,7 +6894,7 @@ 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 | FLAG_BALLISTIC, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_BALLISTIC | FLAG_SHEER_FORCE_BOOST, .split = SPLIT_SPECIAL, }, @@ -7259,7 +7259,7 @@ 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, }, @@ -7399,7 +7399,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 100, .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, }, @@ -7455,7 +7455,7 @@ 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, }, @@ -7497,7 +7497,7 @@ 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, }, @@ -7525,7 +7525,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 50, .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, }, @@ -7536,10 +7536,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .type = TYPE_BUG, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, + .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_DMG_MINIMIZE, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_DMG_MINIMIZE | FLAG_SHEER_FORCE_BOOST, .split = SPLIT_PHYSICAL, }, @@ -7567,7 +7567,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 40, .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, }, @@ -7609,7 +7609,7 @@ 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, }, @@ -7651,7 +7651,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 30, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_BALLISTIC, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_BALLISTIC | FLAG_SHEER_FORCE_BOOST, .split = SPLIT_SPECIAL, }, @@ -7679,7 +7679,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 10, .target = MOVE_TARGET_BOTH, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND | FLAG_SHEER_FORCE_BOOST, .split = SPLIT_SPECIAL, }, @@ -7707,7 +7707,7 @@ 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, }, @@ -7721,7 +7721,7 @@ 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 | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, .split = SPLIT_PHYSICAL, }, @@ -7735,7 +7735,7 @@ 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, .split = SPLIT_SPECIAL, }, @@ -7749,7 +7749,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 50, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_DANCE, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_DANCE | FLAG_SHEER_FORCE_BOOST, .split = SPLIT_SPECIAL, }, @@ -7763,7 +7763,7 @@ 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_PARALYSIS, }, @@ -7778,7 +7778,7 @@ 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, .argument = MOVE_EFFECT_BURN, }, @@ -7807,7 +7807,7 @@ 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, }, @@ -8050,7 +8050,7 @@ 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, }, @@ -8220,7 +8220,7 @@ 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, }, @@ -8304,7 +8304,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 50, .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_PHYSICAL, }, @@ -8318,7 +8318,7 @@ 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, }, @@ -8360,7 +8360,7 @@ 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, }, @@ -8556,7 +8556,7 @@ 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 | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, .split = SPLIT_PHYSICAL, }, @@ -8781,7 +8781,7 @@ 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_SHEER_FORCE_BOOST, .split = SPLIT_PHYSICAL, }, @@ -8809,7 +8809,7 @@ 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 | FLAG_SOUND, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SOUND | FLAG_SHEER_FORCE_BOOST, .split = SPLIT_SPECIAL, .argument = STATUS1_BURN, }, @@ -8992,7 +8992,7 @@ 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, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, .split = SPLIT_PHYSICAL, }, @@ -9020,7 +9020,7 @@ 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 | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, .split = SPLIT_PHYSICAL, }, @@ -9034,7 +9034,7 @@ 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 | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, .split = SPLIT_PHYSICAL, }, @@ -9146,7 +9146,7 @@ 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 | FLAG_KINGSROCK_AFFECTED, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST, .split = SPLIT_PHYSICAL, }, @@ -9300,7 +9300,7 @@ 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, .split = SPLIT_PHYSICAL, }, From 780517fec7e4c7cca5507beff85647c79a24d9a7 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 26 Oct 2019 18:28:02 +0200 Subject: [PATCH 425/667] Fix weather for pre gen6 --- src/battle_util.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 00b10eb097..7fc9b462c4 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2666,8 +2666,7 @@ bool32 TryChangeBattleWeather(u8 battler, u32 weatherEnumId, bool32 viaAbility) gBattleWeather = (sWeatherFlagsInfo[weatherEnumId][0] | sWeatherFlagsInfo[weatherEnumId][1]); return TRUE; } - else if (B_ABILITY_WEATHER > GEN_5 - && !(gBattleWeather & (sWeatherFlagsInfo[weatherEnumId][0] | sWeatherFlagsInfo[weatherEnumId][1]))) + else if (!(gBattleWeather & (sWeatherFlagsInfo[weatherEnumId][0] | sWeatherFlagsInfo[weatherEnumId][1]))) { gBattleWeather = (sWeatherFlagsInfo[weatherEnumId][0]); if (GetBattlerHoldEffect(battler, TRUE) == sWeatherFlagsInfo[weatherEnumId][2]) From 48cb0d898d383751cbf188cf035144680672e766 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 26 Oct 2019 22:39:07 +0200 Subject: [PATCH 426/667] Fix Psycho Shift string --- data/battle_scripts_1.s | 1 + 1 file changed, 1 insertion(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index f24e100c75..d38f4d5768 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -785,6 +785,7 @@ BattleScript_EffectPsychoShiftCanWork: trypsychoshift BattleScript_MoveEnd attackanimation waitanimation + copybyte gEffectBattler, gBattlerTarget printfromtable gStatusConditionsStringIds waitmessage 0x40 statusanimation BS_TARGET From 149b3453f6bbb28bbd825a2b5d2f611b73bfaa9b Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 3 Nov 2019 19:58:04 +0100 Subject: [PATCH 427/667] Fix Punishment dmg --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index a00b7c87ef..093288cb58 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5186,7 +5186,7 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) basePower = sHeatCrushPowerTable[i]; break; case EFFECT_PUNISHMENT: - basePower = 60 + (CountBattlerStatIncreases(battlerAtk, FALSE) * 20); + basePower = 60 + (CountBattlerStatIncreases(battlerDef, FALSE) * 20); if (basePower > 200) basePower = 200; break; From 0343f63edae790d87b513c23ec33b47e834de332 Mon Sep 17 00:00:00 2001 From: Nephrite Date: Wed, 13 Nov 2019 23:03:20 +0000 Subject: [PATCH 428/667] Dancer Implemented Dancer and all relevant code for interacting with abilities, certain moves, etc --- data/battle_scripts_1.s | 10 +++- include/battle.h | 4 +- include/battle_scripts.h | 1 + include/battle_util.h | 1 + include/constants/battle_script_commands.h | 7 +-- src/battle_script_commands.c | 58 ++++++++++++++++++---- src/battle_util.c | 34 ++++++++++++- 7 files changed, 98 insertions(+), 17 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index d0756a2d36..7591d81a09 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5621,7 +5621,7 @@ BattleScript_MoveUsedIsTaunted:: BattleScript_SelectingNotAllowedMoveTauntInPalace:: printstring STRINGID_PKMNCANTUSEMOVETAUNT goto BattleScript_SelectingUnusableMoveInPalace - + BattleScript_SelectingNotAllowedMoveThroatChop:: printselectionstring STRINGID_PKMNCANTUSEMOVETHROATCHOP endselectionscript @@ -6757,6 +6757,14 @@ BattleScript_AbilityStatusEffect:: 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 diff --git a/include/battle.h b/include/battle.h index ba29c43cb9..69edbcf9a8 100644 --- a/include/battle.h +++ b/include/battle.h @@ -174,6 +174,8 @@ struct SpecialStatus 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; @@ -594,7 +596,7 @@ struct BattleScripting u8 battleStyle; u8 drawlvlupboxState; u8 learnMoveState; - u8 field_20; + u8 savedBattler; u8 reshowMainState; u8 reshowHelperState; u8 field_23; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index ad219d701f..721c49dab5 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -326,5 +326,6 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/battle_util.h b/include/battle_util.h index 005097ac33..5d4dff81ee 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -21,6 +21,7 @@ #define ABILITYEFFECT_INTIMIDATE2 0xA #define ABILITYEFFECT_TRACE1 0xB #define ABILITYEFFECT_TRACE2 0xC +#define ABILITYEFFECT_MOVE_END_OTHER 0xD #define ABILITYEFFECT_SWITCH_IN_WEATHER 0xFF #define ITEMEFFECT_ON_SWITCH_IN 0x0 diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 6f6d4faae5..4b94c90331 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -22,7 +22,7 @@ #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 @@ -188,8 +188,9 @@ #define MOVEEND_MIRROR_MOVE 17 #define MOVEEND_NEXT_TARGET 18 #define MOVEEND_LIFE_ORB 19 -#define MOVEEND_CLEAR_BITS 20 -#define MOVEEND_COUNT 21 +#define MOVEEND_DANCER 20 +#define MOVEEND_CLEAR_BITS 21 +#define MOVEEND_COUNT 22 // stat flags for Cmd_playstatchangeanimation #define BIT_HP 0x1 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 74877bd938..c5b1479cb5 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1032,7 +1032,6 @@ static void Cmd_attackcanceler(void) } gHitMarker |= HITMARKER_OBEYS; - if (NoTargetPresent(gCurrentMove)) { gBattlescriptCurrInstr = BattleScript_ButItFailedAtkStringPpReduce; @@ -4539,8 +4538,6 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_UPDATE_LAST_MOVES: - gDisableStructs[gBattlerAttacker].usedMoves |= gBitTable[gCurrMovePos]; - gBattleStruct->lastMoveTarget[gBattlerAttacker] = gBattlerTarget; if (gMoveResultFlags & (MOVE_RESULT_FAILED | MOVE_RESULT_DOESNT_AFFECT_FOE)) gBattleStruct->lastMoveFailed |= gBitTable[gBattlerAttacker]; else @@ -4553,10 +4550,15 @@ static void Cmd_moveend(void) gBattlerTarget = gActiveBattler; gHitMarker &= ~(HITMARKER_SWAP_ATTACKER_TARGET); } - if (gHitMarker & HITMARKER_ATTACKSTRING_PRINTED) + if (!gSpecialStatuses[gBattlerAttacker].dancerUsedMove) { - gLastPrintedMoves[gBattlerAttacker] = gChosenMove; - gLastUsedMove = gCurrentMove; + 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]) @@ -4564,9 +4566,11 @@ static void Cmd_moveend(void) && 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 { @@ -4665,9 +4669,41 @@ static void Cmd_moveend(void) } 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.atk49_state++; + break; case MOVEEND_CLEAR_BITS: // Clear bits active while 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); @@ -8384,7 +8420,7 @@ static void Cmd_setbide(void) static void Cmd_confuseifrepeatingattackends(void) { - if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_LOCK_CONFUSE)) + if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_LOCK_CONFUSE) && !gSpecialStatuses[gBattlerAttacker].dancerUsedMove) gBattleScripting.moveEffect = (MOVE_EFFECT_THRASH | MOVE_EFFECT_AFFECTS_USER); gBattlescriptCurrInstr++; @@ -11060,7 +11096,7 @@ static void Cmd_pursuitrelated(void) gCurrentMove = MOVE_PURSUIT; gBattlescriptCurrInstr += 5; gBattleScripting.animTurn = 1; - gBattleScripting.field_20 = gBattlerAttacker; + gBattleScripting.savedBattler = gBattlerAttacker; gBattlerAttacker = gActiveBattler; } else diff --git a/src/battle_util.c b/src/battle_util.c index 093288cb58..2999f44bd0 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1351,6 +1351,7 @@ enum ENDTURN_WRAP, ENDTURN_UPROAR, ENDTURN_THRASH, + ENDTURN_FLINCH, ENDTURN_DISABLE, ENDTURN_ENCORE, ENDTURN_MAGNET_RISE, @@ -1660,6 +1661,9 @@ u8 DoBattlerEndTurnEffects(void) } gBattleStruct->turnEffectsTracker++; break; + case ENDTURN_FLINCH: // reset flinch + gBattleMons[gActiveBattler].status2 &= ~(STATUS2_FLINCHED); + gBattleStruct->turnEffectsTracker++; case ENDTURN_DISABLE: // disable if (gDisableStructs[gActiveBattler].disableTimer != 0) { @@ -2183,7 +2187,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; @@ -3447,6 +3450,35 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA 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++) { From 9b459eb64addae312376df0e73708eaf52e28f6c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 9 Dec 2019 08:41:09 +0100 Subject: [PATCH 429/667] Fix atk49state --- src/battle_interface.c | 21 --------------------- src/battle_script_commands.c | 6 +++--- 2 files changed, 3 insertions(+), 24 deletions(-) diff --git a/src/battle_interface.c b/src/battle_interface.c index 278a0d488d..3d2c9fe15d 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -499,27 +499,6 @@ static const struct SpriteSheet sStatusSummaryBallsSpriteSheet = gBattleInterface_BallDisplayGfx, 0x80, TAG_STATUS_SUMMARY_BALLS_TILE }; -<<<<<<< HEAD -======= -// 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, -}; - ->>>>>>> 47ea65b96e4575a335d3197483841041cb361541 static const struct OamData sOamData_StatusSummaryBalls = { .y = 0, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 391789bca0..eb95ea07e6 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4673,7 +4673,7 @@ static void Cmd_moveend(void) if (gBattleMoves[gCurrentMove].flags & FLAG_DANCE) { u8 battler, nextDancer = 0; - + if (!(gBattleStruct->lastMoveFailed & gBitTable[gBattlerAttacker] || (!gSpecialStatuses[gBattlerAttacker].dancerUsedMove && gProtectStructs[gBattlerAttacker].usesBouncedMove))) @@ -4690,14 +4690,14 @@ static void Cmd_moveend(void) if (GetBattlerAbility(battler) == ABILITY_DANCER && !gSpecialStatuses[battler].dancerUsedMove) { if (!nextDancer || (gBattleMons[battler].speed < gBattleMons[nextDancer & 0x3].speed)) - nextDancer = battler | 0x4; + nextDancer = battler | 0x4; } } if (nextDancer && AbilityBattleEffects(ABILITYEFFECT_MOVE_END_OTHER, nextDancer & 0x3, 0, 0, 0)) effect = TRUE; } } - gBattleScripting.atk49_state++; + gBattleScripting.moveendState++; break; case MOVEEND_CLEAR_BITS: // Clear bits active while using a move for all targets and all hits. if (gSpecialStatuses[gBattlerAttacker].instructedChosenTarget) From 25434b517924ef88b09f800fe8d63f02855eb1e1 Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Mon, 9 Dec 2019 11:09:57 -0500 Subject: [PATCH 430/667] Change move names to CamelCase To match with Gen 4 and 5. "Vicegrip" was changed to "Vice Grip" in Gen 6 and then "Vise Grip" in Gen 8, so I changed it to "Vise Grip". --- src/data/text/move_names.h | 50 +++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/data/text/move_names.h b/src/data/text/move_names.h index 31b1997eae..708bc25005 100644 --- a/src/data/text/move_names.h +++ b/src/data/text/move_names.h @@ -3,15 +3,15 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_NONE] = _("-"), [MOVE_POUND] = _("Pound"), [MOVE_KARATE_CHOP] = _("Karate Chop"), - [MOVE_DOUBLE_SLAP] = _("Doubleslap"), + [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_THUNDER_PUNCH] = _("ThunderPunch"), [MOVE_SCRATCH] = _("Scratch"), - [MOVE_VICE_GRIP] = _("Vicegrip"), + [MOVE_VICE_GRIP] = _("Vise Grip"), [MOVE_GUILLOTINE] = _("Guillotine"), [MOVE_RAZOR_WIND] = _("Razor Wind"), [MOVE_SWORDS_DANCE] = _("Swords Dance"), @@ -49,7 +49,7 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_ROAR] = _("Roar"), [MOVE_SING] = _("Sing"), [MOVE_SUPERSONIC] = _("Supersonic"), - [MOVE_SONIC_BOOM] = _("Sonicboom"), + [MOVE_SONIC_BOOM] = _("SonicBoom"), [MOVE_DISABLE] = _("Disable"), [MOVE_ACID] = _("Acid"), [MOVE_EMBER] = _("Ember"), @@ -61,7 +61,7 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_ICE_BEAM] = _("Ice Beam"), [MOVE_BLIZZARD] = _("Blizzard"), [MOVE_PSYBEAM] = _("Psybeam"), - [MOVE_BUBBLE_BEAM] = _("Bubblebeam"), + [MOVE_BUBBLE_BEAM] = _("BubbleBeam"), [MOVE_AURORA_BEAM] = _("Aurora Beam"), [MOVE_HYPER_BEAM] = _("Hyper Beam"), [MOVE_PECK] = _("Peck"), @@ -76,7 +76,7 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_LEECH_SEED] = _("Leech Seed"), [MOVE_GROWTH] = _("Growth"), [MOVE_RAZOR_LEAF] = _("Razor Leaf"), - [MOVE_SOLAR_BEAM] = _("Solarbeam"), + [MOVE_SOLAR_BEAM] = _("SolarBeam"), [MOVE_POISON_POWDER] = _("Poisonpowder"), [MOVE_STUN_SPORE] = _("Stun Spore"), [MOVE_SLEEP_POWDER] = _("Sleep Powder"), @@ -84,7 +84,7 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_STRING_SHOT] = _("String Shot"), [MOVE_DRAGON_RAGE] = _("Dragon Rage"), [MOVE_FIRE_SPIN] = _("Fire Spin"), - [MOVE_THUNDER_SHOCK] = _("Thundershock"), + [MOVE_THUNDER_SHOCK] = _("ThunderShock"), [MOVE_THUNDERBOLT] = _("Thunderbolt"), [MOVE_THUNDER_WAVE] = _("Thunder Wave"), [MOVE_THUNDER] = _("Thunder"), @@ -108,7 +108,7 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_RECOVER] = _("Recover"), [MOVE_HARDEN] = _("Harden"), [MOVE_MINIMIZE] = _("Minimize"), - [MOVE_SMOKESCREEN] = _("Smokescreen"), + [MOVE_SMOKESCREEN] = _("SmokeScreen"), [MOVE_CONFUSE_RAY] = _("Confuse Ray"), [MOVE_WITHDRAW] = _("Withdraw"), [MOVE_DEFENSE_CURL] = _("Defense Curl"), @@ -223,9 +223,9 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_PAIN_SPLIT] = _("Pain Split"), [MOVE_SACRED_FIRE] = _("Sacred Fire"), [MOVE_MAGNITUDE] = _("Magnitude"), - [MOVE_DYNAMIC_PUNCH] = _("Dynamicpunch"), + [MOVE_DYNAMIC_PUNCH] = _("DynamicPunch"), [MOVE_MEGAHORN] = _("Megahorn"), - [MOVE_DRAGON_BREATH] = _("Dragonbreath"), + [MOVE_DRAGON_BREATH] = _("DragonBreath"), [MOVE_BATON_PASS] = _("Baton Pass"), [MOVE_ENCORE] = _("Encore"), [MOVE_PURSUIT] = _("Pursuit"), @@ -245,8 +245,8 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_CRUNCH] = _("Crunch"), [MOVE_MIRROR_COAT] = _("Mirror Coat"), [MOVE_PSYCH_UP] = _("Psych Up"), - [MOVE_EXTREME_SPEED] = _("Extremespeed"), - [MOVE_ANCIENT_POWER] = _("Ancientpower"), + [MOVE_EXTREME_SPEED] = _("ExtremeSpeed"), + [MOVE_ANCIENT_POWER] = _("AncientPower"), [MOVE_SHADOW_BALL] = _("Shadow Ball"), [MOVE_FUTURE_SIGHT] = _("Future Sight"), [MOVE_ROCK_SMASH] = _("Rock Smash"), @@ -265,7 +265,7 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_MEMENTO] = _("Memento"), [MOVE_FACADE] = _("Facade"), [MOVE_FOCUS_PUNCH] = _("Focus Punch"), - [MOVE_SMELLING_SALT] = _("Smellingsalt"), + [MOVE_SMELLING_SALT] = _("SmellingSalt"), [MOVE_FOLLOW_ME] = _("Follow Me"), [MOVE_NATURE_POWER] = _("Nature Power"), [MOVE_CHARGE] = _("Charge"), @@ -297,7 +297,7 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_TAIL_GLOW] = _("Tail Glow"), [MOVE_LUSTER_PURGE] = _("Luster Purge"), [MOVE_MIST_BALL] = _("Mist Ball"), - [MOVE_FEATHER_DANCE] = _("Featherdance"), + [MOVE_FEATHER_DANCE] = _("FeatherDance"), [MOVE_TEETER_DANCE] = _("Teeter Dance"), [MOVE_BLAZE_KICK] = _("Blaze Kick"), [MOVE_MUD_SPORT] = _("Mud Sport"), @@ -320,7 +320,7 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_ROCK_TOMB] = _("Rock Tomb"), [MOVE_SILVER_WIND] = _("Silver Wind"), [MOVE_METAL_SOUND] = _("Metal Sound"), - [MOVE_GRASS_WHISTLE] = _("Grasswhistle"), + [MOVE_GRASS_WHISTLE] = _("GrassWhistle"), [MOVE_TICKLE] = _("Tickle"), [MOVE_COSMIC_POWER] = _("Cosmic Power"), [MOVE_WATER_SPOUT] = _("Water Spout"), @@ -557,7 +557,7 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_ICE_BURN] = _("Ice Burn"), [MOVE_SNARL] = _("Snarl"), [MOVE_ICICLE_CRASH] = _("Icicle Crash"), - [MOVE_V_CREATE] = _("V Create"), + [MOVE_V_CREATE] = _("V-create"), [MOVE_FUSION_FLARE] = _("Fusion Flare"), [MOVE_FUSION_BOLT] = _("Fusion Bolt"), [MOVE_FLYING_PRESS] = _("Flying Press"), @@ -566,18 +566,18 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_ROTOTILLER] = _("Rototiller"), [MOVE_STICKY_WEB] = _("Sticky Web"), [MOVE_FELL_STINGER] = _("Fell Stinger"), - [MOVE_PHANTOM_FORCE] = _("Phantom Forc"), + [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_FOREST_S_CURSE] = _("Forests Curs"), + [MOVE_FOREST_S_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] = _("Draining Kis"), + [MOVE_DRAINING_KISS] = _("DrainingKiss"), [MOVE_CRAFTY_SHIELD] = _("CraftyShield"), [MOVE_FLOWER_SHIELD] = _("FlowerShield"), [MOVE_GRASSY_TERRAIN] = _("GrassTerrain"), @@ -595,14 +595,14 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_STEAM_ERUPTION] = _("Steam Erupt"), [MOVE_HYPERSPACE_HOLE] = _("Hyperspace H"), [MOVE_WATER_SHURIKEN] = _("Water Shuri"), - [MOVE_MYSTICAL_FIRE] = _("Mystical Fir"), + [MOVE_MYSTICAL_FIRE] = _("MysticalFire"), [MOVE_SPIKY_SHIELD] = _("Spiky Shield"), - [MOVE_AROMATIC_MIST] = _("Aromatic Mis"), + [MOVE_AROMATIC_MIST] = _("AromaticMist"), [MOVE_EERIE_IMPULSE] = _("EerieImpulse"), [MOVE_VENOM_DRENCH] = _("Venom Drench"), [MOVE_POWDER] = _("Powder"), [MOVE_GEOMANCY] = _("Geomancy"), - [MOVE_MAGNETIC_FLUX] = _("Magnetic Flu"), + [MOVE_MAGNETIC_FLUX] = _("MagneticFlux"), [MOVE_HAPPY_HOUR] = _("Happy Hour"), [MOVE_ELECTRIC_TERRAIN] = _("Electric Ter"), [MOVE_DAZZLING_GLEAM] = _("Dazzling Gle"), @@ -613,11 +613,11 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_HOLD_BACK] = _("Hold Back"), [MOVE_INFESTATION] = _("Infestation"), [MOVE_POWER_UP_PUNCH] = _("PowerUpPunch"), - [MOVE_OBLIVION_WING] = _("Oblivion Win"), + [MOVE_OBLIVION_WING] = _("OblivionWing"), [MOVE_THOUSAND_ARROWS] = _("Thousand Ar"), [MOVE_THOUSAND_WAVES] = _("Thousand Wav"), [MOVE_LAND_S_WRATH] = _("Lands Wrath"), - [MOVE_LIGHT_OF_RUIN] = _("Light Of Ru"), + [MOVE_LIGHT_OF_RUIN] = _("LightOfRuin"), [MOVE_ORIGIN_PULSE] = _("Origin Pulse"), [MOVE_PRECIPICE_BLADES] = _("Precipice Bl"), [MOVE_DRAGON_ASCENT] = _("DragonAscent"), @@ -672,5 +672,5 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_TEARFUL_LOOK] = _("Tearful Look"), [MOVE_ZING_ZAP] = _("Zing Zap"), [MOVE_NATURES_MADNESS] = _("Nature's Mad"), - [MOVE_MULTI_ATTACK] = _("Multi Attack"), + [MOVE_MULTI_ATTACK] = _("Multi-Attack"), }; From 3c7e60a4411617ec019036d5c4e8dbfd0aa48c34 Mon Sep 17 00:00:00 2001 From: Exory Date: Tue, 10 Dec 2019 22:01:20 +0100 Subject: [PATCH 431/667] Don't use Toxic if opponent has Toxic Boost. --- data/battle_ai_scripts.s | 1 + 1 file changed, 1 insertion(+) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 31c614ac0c..0bdfec1fb6 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -620,6 +620,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 From 7e6f34777b28564cd63e93df42bd0eef5487f946 Mon Sep 17 00:00:00 2001 From: Exory Date: Tue, 10 Dec 2019 22:29:20 +0100 Subject: [PATCH 432/667] Don't burn the opponent if it has Flare Boost. --- data/battle_ai_scripts.s | 1 + 1 file changed, 1 insertion(+) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 0bdfec1fb6..39e96f5cd2 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -819,6 +819,7 @@ 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_status AI_TARGET, STATUS1_ANY, Score_Minus10 if_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10 if_type_effectiveness AI_EFFECTIVENESS_x0_5, Score_Minus10 From 2e7c21e5287ed8954c5b6677ea908fce03092700 Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Sat, 14 Dec 2019 17:01:33 -0500 Subject: [PATCH 433/667] Vise Grip to Vice Grip The weird thing is "vice" is the British way of saying it and "vise" is the American way, but the change happened in games based on the UK. Now matches its Gen 7 name. --- src/data/text/move_names.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/text/move_names.h b/src/data/text/move_names.h index 708bc25005..95dafebd33 100644 --- a/src/data/text/move_names.h +++ b/src/data/text/move_names.h @@ -11,7 +11,7 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_ICE_PUNCH] = _("Ice Punch"), [MOVE_THUNDER_PUNCH] = _("ThunderPunch"), [MOVE_SCRATCH] = _("Scratch"), - [MOVE_VICE_GRIP] = _("Vise Grip"), + [MOVE_VICE_GRIP] = _("Vice Grip"), [MOVE_GUILLOTINE] = _("Guillotine"), [MOVE_RAZOR_WIND] = _("Razor Wind"), [MOVE_SWORDS_DANCE] = _("Swords Dance"), From 029ab67ff413fd70ecaefa759b5d333ea92f9012 Mon Sep 17 00:00:00 2001 From: ultima-soul Date: Mon, 16 Dec 2019 00:29:20 -0800 Subject: [PATCH 434/667] Implement Leaf Guard. --- asm/macros/battle_script.inc | 6 ++++++ data/battle_scripts_1.s | 18 ++++++++++++++++++ include/battle_script_commands.h | 1 + src/battle_script_commands.c | 31 +++++++++++++++++++++++++------ src/battle_util.c | 7 ++++++- 5 files changed, 56 insertions(+), 7 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 92f8f416f4..8a83036739 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1782,3 +1782,9 @@ 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 + diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 7591d81a09..e8b65db652 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2002,6 +2002,7 @@ BattleScript_EffectSleep:: jumpifcantmakeasleep BattleScript_CantMakeAsleep jumpifflowerveil BattleScript_FlowerVeilProtects jumpifability BS_TARGET_SIDE, ABILITY_SWEET_VEIL, BattleScript_SweetVeilProtects + jumpifleafguard BattleScript_LeafGuardProtects jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected @@ -2047,6 +2048,18 @@ BattleScript_AromaVeilProtects: 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 @@ -2487,6 +2500,7 @@ BattleScript_EffectToxic:: ppreduce jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected jumpifflowerveil BattleScript_FlowerVeilProtects + jumpifleafguard BattleScript_LeafGuardProtects jumpifsubstituteblocks BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_POISON | STATUS1_TOXIC_POISON, BattleScript_AlreadyPoisoned jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed @@ -2813,6 +2827,7 @@ BattleScript_EffectPoison:: ppreduce jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected jumpifflowerveil BattleScript_FlowerVeilProtects + jumpifleafguard BattleScript_LeafGuardProtects jumpifsubstituteblocks BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_POISON, BattleScript_AlreadyPoisoned jumpifstatus BS_TARGET, STATUS1_TOXIC_POISON, BattleScript_AlreadyPoisoned @@ -2835,6 +2850,7 @@ BattleScript_EffectParalyze: ppreduce jumpifability BS_TARGET, ABILITY_LIMBER, BattleScript_LimberProtected jumpifflowerveil BattleScript_FlowerVeilProtects + jumpifleafguard BattleScript_LeafGuardProtects jumpifsubstituteblocks BattleScript_ButItFailed typecalc jumpifmovehadnoeffect BattleScript_ButItFailed @@ -4064,6 +4080,7 @@ BattleScript_EffectWillOWisp:: jumpiftype BS_TARGET, TYPE_FIRE, BattleScript_NotAffected jumpifability BS_TARGET, ABILITY_WATER_VEIL, BattleScript_WaterVeilPrevents jumpifflowerveil BattleScript_FlowerVeilProtects + jumpifleafguard BattleScript_LeafGuardProtects jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected @@ -4327,6 +4344,7 @@ BattleScript_EffectYawn:: jumpifability BS_TARGET, ABILITY_VITAL_SPIRIT, BattleScript_PrintBankAbilityMadeIneffective jumpifability BS_TARGET, ABILITY_INSOMNIA, BattleScript_PrintBankAbilityMadeIneffective jumpifflowerveil BattleScript_FlowerVeilProtects + jumpifleafguard BattleScript_LeafGuardProtects jumpifsubstituteblocks BattleScript_ButItFailed jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index 72f04323a2..8bd94150ab 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -16,6 +16,7 @@ bool8 UproarWakeUpCheck(u8 battlerId); bool32 DoesSubstituteBlockMove(u8 battlerAtk, u8 battlerDef, u32 move); bool32 CanUseLastResort(u8 battlerId); u32 IsFlowerVeilProtected(u32 battler); +u32 IsLeafGuardProtected(u32 battler); extern void (* const gBattleScriptingCommandsTable[])(void); extern const u8 gUnknown_0831C494[][4]; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index eb95ea07e6..63de3510c0 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2151,7 +2151,8 @@ void SetMoveEffect(bool32 primary, u32 certain) if (GetBattlerAbility(gEffectBattler) == ABILITY_VITAL_SPIRIT || GetBattlerAbility(gEffectBattler) == ABILITY_INSOMNIA || IsAbilityOnSide(gEffectBattler, ABILITY_SWEET_VEIL) - || IsFlowerVeilProtected(gEffectBattler)) + || IsFlowerVeilProtected(gEffectBattler) + || IsLeafGuardProtected(gEffectBattler)) break; CancelMultiTurnMoves(gEffectBattler); @@ -2194,7 +2195,9 @@ void SetMoveEffect(bool32 primary, u32 certain) break; if (gBattleMons[gEffectBattler].status1) break; - if (GetBattlerAbility(gEffectBattler) == ABILITY_IMMUNITY || IsFlowerVeilProtected(gEffectBattler)) + if (GetBattlerAbility(gEffectBattler) == ABILITY_IMMUNITY + || IsFlowerVeilProtected(gEffectBattler) + || IsLeafGuardProtected(gEffectBattler)) break; statusChanged = TRUE; @@ -2231,7 +2234,9 @@ void SetMoveEffect(bool32 primary, u32 certain) } if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_FIRE)) break; - if (GetBattlerAbility(gEffectBattler) == ABILITY_WATER_VEIL || IsFlowerVeilProtected(gEffectBattler)) + if (GetBattlerAbility(gEffectBattler) == ABILITY_WATER_VEIL + || IsFlowerVeilProtected(gEffectBattler) + || IsLeafGuardProtected(gEffectBattler)) break; if (gBattleMons[gEffectBattler].status1) break; @@ -2247,7 +2252,9 @@ void SetMoveEffect(bool32 primary, u32 certain) break; if (noSunCanFreeze == 0) break; - if (GetBattlerAbility(gEffectBattler) == ABILITY_MAGMA_ARMOR || IsFlowerVeilProtected(gEffectBattler)) + if (GetBattlerAbility(gEffectBattler) == ABILITY_MAGMA_ARMOR + || IsFlowerVeilProtected(gEffectBattler) + || IsLeafGuardProtected(gEffectBattler)) break; CancelMultiTurnMoves(gEffectBattler); @@ -2290,7 +2297,9 @@ void SetMoveEffect(bool32 primary, u32 certain) } if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_ELECTRIC)) break; - if (GetBattlerAbility(gEffectBattler) == ABILITY_LIMBER || IsFlowerVeilProtected(gEffectBattler)) + if (GetBattlerAbility(gEffectBattler) == ABILITY_LIMBER + || IsFlowerVeilProtected(gEffectBattler) + || IsLeafGuardProtected(gEffectBattler)) break; if (gBattleMons[gEffectBattler].status1) break; @@ -2331,7 +2340,9 @@ void SetMoveEffect(bool32 primary, u32 certain) break; if (!IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON) && !IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL)) { - if (GetBattlerAbility(gEffectBattler) == ABILITY_IMMUNITY || IsFlowerVeilProtected(gEffectBattler)) + if (GetBattlerAbility(gEffectBattler) == ABILITY_IMMUNITY + || IsFlowerVeilProtected(gEffectBattler) + || IsLeafGuardProtected(gEffectBattler)) break; // It's redundant, because at this point we know the status1 value is 0. @@ -6632,6 +6643,14 @@ u32 IsFlowerVeilProtected(u32 battler) return 0; } +u32 IsLeafGuardProtected(u32 battler) +{ + if (WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_SUN_ANY)) + return GetBattlerAbility(battler) == ABILITY_LEAF_GUARD; + else + return 0; +} + static void Cmd_various(void) { struct Pokemon *mon; diff --git a/src/battle_util.c b/src/battle_util.c index 32492410e6..a9619d296b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1731,7 +1731,8 @@ u8 DoBattlerEndTurnEffects(void) gStatuses3[gActiveBattler] -= 0x800; if (!(gStatuses3[gActiveBattler] & STATUS3_YAWN) && !(gBattleMons[gActiveBattler].status1 & STATUS1_ANY) && gBattleMons[gActiveBattler].ability != ABILITY_VITAL_SPIRIT - && gBattleMons[gActiveBattler].ability != ABILITY_INSOMNIA && !UproarWakeUpCheck(gActiveBattler)) + && gBattleMons[gActiveBattler].ability != ABILITY_INSOMNIA && !UproarWakeUpCheck(gActiveBattler) + && !IsLeafGuardProtected(gActiveBattler)) { CancelMultiTurnMoves(gActiveBattler); gBattleMons[gActiveBattler].status1 |= (Random() & 3) + 2; @@ -3346,6 +3347,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && GetBattlerAbility(gBattlerAttacker) != ABILITY_VITAL_SPIRIT && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY) && !IsFlowerVeilProtected(gBattlerAttacker) + && !IsLeafGuardProtected(gBattlerAttacker) && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) && (Random() % 3) == 0) { @@ -3369,6 +3371,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && GetBattlerAbility(gBattlerAttacker) != ABILITY_IMMUNITY && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY) && !IsFlowerVeilProtected(gBattlerAttacker) + && !IsLeafGuardProtected(gBattlerAttacker) && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) && (Random() % 3) == 0) { @@ -3390,6 +3393,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && GetBattlerAbility(gBattlerAttacker) != ABILITY_LIMBER && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY) && !IsFlowerVeilProtected(gBattlerAttacker) + && !IsLeafGuardProtected(gBattlerAttacker) && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) && (Random() % 3) == 0) { @@ -3410,6 +3414,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && GetBattlerAbility(gBattlerAttacker) != ABILITY_WATER_VEIL && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY) && !IsFlowerVeilProtected(gBattlerAttacker) + && !IsLeafGuardProtected(gBattlerAttacker) && (Random() % 3) == 0) { gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_BURN; From df95c4801ab05b250322bc1c5137aff17c016645 Mon Sep 17 00:00:00 2001 From: ultima-soul <33333039+ultima-soul@users.noreply.github.com> Date: Wed, 18 Dec 2019 13:03:01 -0800 Subject: [PATCH 435/667] Spaces to tabs --- data/battle_scripts_1.s | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e8b65db652..be67b8fbf8 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2002,7 +2002,7 @@ BattleScript_EffectSleep:: jumpifcantmakeasleep BattleScript_CantMakeAsleep jumpifflowerveil BattleScript_FlowerVeilProtects jumpifability BS_TARGET_SIDE, ABILITY_SWEET_VEIL, BattleScript_SweetVeilProtects - jumpifleafguard BattleScript_LeafGuardProtects + jumpifleafguard BattleScript_LeafGuardProtects jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected @@ -2500,7 +2500,7 @@ BattleScript_EffectToxic:: ppreduce jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected jumpifflowerveil BattleScript_FlowerVeilProtects - jumpifleafguard BattleScript_LeafGuardProtects + jumpifleafguard BattleScript_LeafGuardProtects jumpifsubstituteblocks BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_POISON | STATUS1_TOXIC_POISON, BattleScript_AlreadyPoisoned jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed @@ -2827,7 +2827,7 @@ BattleScript_EffectPoison:: ppreduce jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected jumpifflowerveil BattleScript_FlowerVeilProtects - jumpifleafguard BattleScript_LeafGuardProtects + jumpifleafguard BattleScript_LeafGuardProtects jumpifsubstituteblocks BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_POISON, BattleScript_AlreadyPoisoned jumpifstatus BS_TARGET, STATUS1_TOXIC_POISON, BattleScript_AlreadyPoisoned @@ -2850,7 +2850,7 @@ BattleScript_EffectParalyze: ppreduce jumpifability BS_TARGET, ABILITY_LIMBER, BattleScript_LimberProtected jumpifflowerveil BattleScript_FlowerVeilProtects - jumpifleafguard BattleScript_LeafGuardProtects + jumpifleafguard BattleScript_LeafGuardProtects jumpifsubstituteblocks BattleScript_ButItFailed typecalc jumpifmovehadnoeffect BattleScript_ButItFailed @@ -4080,7 +4080,7 @@ BattleScript_EffectWillOWisp:: jumpiftype BS_TARGET, TYPE_FIRE, BattleScript_NotAffected jumpifability BS_TARGET, ABILITY_WATER_VEIL, BattleScript_WaterVeilPrevents jumpifflowerveil BattleScript_FlowerVeilProtects - jumpifleafguard BattleScript_LeafGuardProtects + jumpifleafguard BattleScript_LeafGuardProtects jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected @@ -4344,7 +4344,7 @@ BattleScript_EffectYawn:: jumpifability BS_TARGET, ABILITY_VITAL_SPIRIT, BattleScript_PrintBankAbilityMadeIneffective jumpifability BS_TARGET, ABILITY_INSOMNIA, BattleScript_PrintBankAbilityMadeIneffective jumpifflowerveil BattleScript_FlowerVeilProtects - jumpifleafguard BattleScript_LeafGuardProtects + jumpifleafguard BattleScript_LeafGuardProtects jumpifsubstituteblocks BattleScript_ButItFailed jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON From 98ce80d231e9f060f09011a8faadcf8e60fe8efe Mon Sep 17 00:00:00 2001 From: Fontbane <36677462+Fontbane@users.noreply.github.com> Date: Thu, 19 Dec 2019 13:47:31 -0500 Subject: [PATCH 436/667] Fix move names --- src/data/text/move_names.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/data/text/move_names.h b/src/data/text/move_names.h index 95dafebd33..25d7460a52 100644 --- a/src/data/text/move_names.h +++ b/src/data/text/move_names.h @@ -3,7 +3,7 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_NONE] = _("-"), [MOVE_POUND] = _("Pound"), [MOVE_KARATE_CHOP] = _("Karate Chop"), - [MOVE_DOUBLE_SLAP] = _("DoubleSlap"), + [MOVE_DOUBLE_SLAP] = _("Double Slap"), [MOVE_COMET_PUNCH] = _("Comet Punch"), [MOVE_MEGA_PUNCH] = _("Mega Punch"), [MOVE_PAY_DAY] = _("Pay Day"), @@ -49,7 +49,7 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_ROAR] = _("Roar"), [MOVE_SING] = _("Sing"), [MOVE_SUPERSONIC] = _("Supersonic"), - [MOVE_SONIC_BOOM] = _("SonicBoom"), + [MOVE_SONIC_BOOM] = _("Sonic Boom"), [MOVE_DISABLE] = _("Disable"), [MOVE_ACID] = _("Acid"), [MOVE_EMBER] = _("Ember"), @@ -61,7 +61,7 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_ICE_BEAM] = _("Ice Beam"), [MOVE_BLIZZARD] = _("Blizzard"), [MOVE_PSYBEAM] = _("Psybeam"), - [MOVE_BUBBLE_BEAM] = _("BubbleBeam"), + [MOVE_BUBBLE_BEAM] = _("Bubble Beam"), [MOVE_AURORA_BEAM] = _("Aurora Beam"), [MOVE_HYPER_BEAM] = _("Hyper Beam"), [MOVE_PECK] = _("Peck"), @@ -76,8 +76,8 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_LEECH_SEED] = _("Leech Seed"), [MOVE_GROWTH] = _("Growth"), [MOVE_RAZOR_LEAF] = _("Razor Leaf"), - [MOVE_SOLAR_BEAM] = _("SolarBeam"), - [MOVE_POISON_POWDER] = _("Poisonpowder"), + [MOVE_SOLAR_BEAM] = _("Solar Beam"), + [MOVE_POISON_POWDER] = _("PoisonPowder"), [MOVE_STUN_SPORE] = _("Stun Spore"), [MOVE_SLEEP_POWDER] = _("Sleep Powder"), [MOVE_PETAL_DANCE] = _("Petal Dance"), @@ -581,7 +581,7 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_CRAFTY_SHIELD] = _("CraftyShield"), [MOVE_FLOWER_SHIELD] = _("FlowerShield"), [MOVE_GRASSY_TERRAIN] = _("GrassTerrain"), - [MOVE_MISTY_TERRAIN] = _("Mist Terrain"), + [MOVE_MISTY_TERRAIN] = _("MistyTerrain"), [MOVE_ELECTRIFY] = _("Electrify"), [MOVE_PLAY_ROUGH] = _("Play Rough"), [MOVE_FAIRY_WIND] = _("Fairy Wind"), From 8b3a40162b3ff3fb2285bdb98a98e7643e6685c8 Mon Sep 17 00:00:00 2001 From: Fontbane <36677462+Fontbane@users.noreply.github.com> Date: Thu, 19 Dec 2019 13:50:19 -0500 Subject: [PATCH 437/667] Queenly Majesty --- src/battle_util.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/battle_util.c b/src/battle_util.c index 32492410e6..f433a5708f 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3084,6 +3084,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA else if ((gLastUsedAbility == ABILITY_DAZZLING || (IsBattlerAlive(battler ^= BIT_FLANK) && GetBattlerAbility(battler) == ABILITY_DAZZLING) ) + || (gLastUsedAbility == ABILITY_QUEENLY_MAJESTY + || (IsBattlerAlive(battler ^= BIT_FLANK) && GetBattlerAbility(battler) == ABILITY_QUEENLY_MAJESTY) + ) && GetChosenMovePriority(battler) > 0 && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(battler)) { From 186822ed0c0c53b00232a39cc07daa8676587d0a Mon Sep 17 00:00:00 2001 From: Fontbane <36677462+Fontbane@users.noreply.github.com> Date: Thu, 19 Dec 2019 13:53:07 -0500 Subject: [PATCH 438/667] Fix missing parentheses --- src/battle_util.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index f433a5708f..4499917aa8 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3081,12 +3081,12 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gBattlescriptCurrInstr = BattleScript_SoundproofProtected; effect = 1; } - else if ((gLastUsedAbility == ABILITY_DAZZLING + else if (((gLastUsedAbility == ABILITY_DAZZLING || (IsBattlerAlive(battler ^= BIT_FLANK) && GetBattlerAbility(battler) == ABILITY_DAZZLING) ) || (gLastUsedAbility == ABILITY_QUEENLY_MAJESTY || (IsBattlerAlive(battler ^= BIT_FLANK) && GetBattlerAbility(battler) == ABILITY_QUEENLY_MAJESTY) - ) + )) && GetChosenMovePriority(battler) > 0 && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(battler)) { From 2fb6ea4fc484754f061c6c505c35c8535717ee36 Mon Sep 17 00:00:00 2001 From: Fontbane <36677462+Fontbane@users.noreply.github.com> Date: Thu, 19 Dec 2019 14:01:46 -0500 Subject: [PATCH 439/667] Big Pecks --- data/battle_ai_scripts.s | 2 ++ src/battle_script_commands.c | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 39e96f5cd2..91c0917771 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -554,6 +554,8 @@ AI_CBM_AttackDown: @ 82DC387 AI_CBM_DefenseDown: @ 82DC39C 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 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index eb95ea07e6..6d3f94825d 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4262,7 +4262,8 @@ static void Cmd_playstatchangeanimation(void) && ability != ABILITY_CLEAR_BODY && ability != ABILITY_WHITE_SMOKE && !(ability == ABILITY_KEEN_EYE && currStat == STAT_ACC) - && !(ability == ABILITY_HYPER_CUTTER && currStat == STAT_ATK)) + && !(ability == ABILITY_HYPER_CUTTER && currStat == STAT_ATK) + && !(ability == ABILITY_BIG_PECKS && currStat == STAT_DEF)) { if (gBattleMons[gActiveBattler].statStages[currStat] > 0) { From 40b7d8573d4fb504fdf2feb17b45302956889949 Mon Sep 17 00:00:00 2001 From: Fontbane <36677462+Fontbane@users.noreply.github.com> Date: Fri, 20 Dec 2019 17:38:38 -0500 Subject: [PATCH 440/667] Gooey and Tangling Hair --- src/battle_util.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/battle_util.c b/src/battle_util.c index 4499917aa8..1ddf2f3bed 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3313,6 +3313,22 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA effect++; } break; + case ABILITY_GOOEY: + case ABILITY_TANGLING_HAIR: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && gBattleMons[gBattlerAttacker].hp != 0 + && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + && TARGET_TURN_DAMAGED + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)) + { + 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) From c690d577a5b2725e9f560aefc2ed12ff71f1e5e7 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sat, 21 Dec 2019 05:01:42 -0300 Subject: [PATCH 441/667] Implemented Aftermath's effect --- data/battle_scripts_1.s | 9 +++++++++ include/battle_scripts.h | 1 + src/battle_message.c | 2 +- src/battle_util.c | 15 +++++++++++++++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 7591d81a09..60e1688ca9 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5864,6 +5864,15 @@ BattleScript_IllusionOff:: waitmessage 0x40 return +BattleScript_AftermathDmg:: + 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 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 721c49dab5..448f3b29f6 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -327,5 +327,6 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/src/battle_message.c b/src/battle_message.c index 91fbf02ca0..74c7084490 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -592,7 +592,7 @@ static const u8 sText_TurboblazeEnters[] = _("{B_ATK_NAME_WITH_PREFIX} is radiat static const u8 sText_SlowStartEnters[] = _("{B_ATK_NAME_WITH_PREFIX} can't get it going!"); static const u8 sText_SlowStartEnd[] = _("{B_ATK_NAME_WITH_PREFIX} finally got its 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[] = _("The {B_DEF_NAME_WITH_PREFIX}\nsuffers the {B_DEF_ABILITY}!"); +static const u8 sText_AftermathDmg[] = _("{B_ATK_NAME_WITH_PREFIX} is hurt!"); static const u8 sText_AnticipationActivates[] = _("The {B_ATK_NAME_WITH_PREFIX} shuddered in {B_ATK_ABILITY}!"); static const u8 sText_ForewarnActivates[] = _("{B_ATK_ABILITY} alerted the {B_ATK_NAME_WITH_PREFIX} to the\n{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!"); diff --git a/src/battle_util.c b/src/battle_util.c index 32492410e6..ef7e85ecc1 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3327,6 +3327,21 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA effect++; } break; + case ABILITY_AFTERMATH: + if (IsAbilityOnField(ABILITY_DAMP)) + break; + else if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && gBattleMons[gBattlerTarget].hp == 0 + && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)) + { + gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 4; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_AftermathDmg; + effect++; + } + break; case ABILITY_EFFECT_SPORE: if (!IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GRASS) && GetBattlerAbility(gBattlerAttacker) != ABILITY_OVERCOAT From 1146de456119b406755accc9ede5785965892fbf Mon Sep 17 00:00:00 2001 From: ultima-soul Date: Sat, 21 Dec 2019 22:54:13 -0800 Subject: [PATCH 442/667] Implement Unburden. --- src/battle_script_commands.c | 51 +++++++++++++++++++++++++++++++++++- src/battle_util.c | 1 + 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 63de3510c0..2d897a0ed1 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2678,6 +2678,17 @@ void SetMoveEffect(bool32 primary, u32 certain) { gLastUsedItem = gBattleStruct->changedItems[gBattlerAttacker] = gBattleMons[gBattlerTarget].item; gBattleMons[gBattlerTarget].item = 0; + + + + if (GetBattlerAbility(gBattlerTarget) == ABILITY_UNBURDEN) + { + gBattleResources->flags->flags[gBattlerTarget] |= RESOURCE_FLAG_UNBURDEN; + RecordAbilityBattle(gBattlerTarget, ABILITY_UNBURDEN); + } + + if (GetBattlerAbility(gBattlerAttacker) == ABILITY_UNBURDEN && gBattleResources->flags->flags[gBattlerAttacker] & RESOURCE_FLAG_UNBURDEN) + gBattleResources->flags->flags[gBattlerAttacker] &= ~(RESOURCE_FLAG_UNBURDEN); gActiveBattler = gBattlerAttacker; BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gLastUsedItem); @@ -2795,6 +2806,11 @@ void SetMoveEffect(bool32 primary, u32 certain) gLastUsedItem = gBattleMons[gEffectBattler].item; gBattleMons[gEffectBattler].item = 0; gWishFutureKnock.knockedOffMons[side] |= gBitTable[gBattlerPartyIndexes[gEffectBattler]]; + if (GetBattlerAbility(gEffectBattler) == ABILITY_UNBURDEN) + { + gBattleResources->flags->flags[gEffectBattler] |= RESOURCE_FLAG_UNBURDEN; + RecordAbilityBattle(gEffectBattler, ABILITY_UNBURDEN); + } BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_KnockedOff; @@ -2929,6 +2945,13 @@ void SetMoveEffect(bool32 primary, u32 certain) { gLastUsedItem = gBattleMons[gEffectBattler].item; gBattleMons[gEffectBattler].item = 0; + + if (GetBattlerAbility(gEffectBattler) == ABILITY_UNBURDEN) + { + gBattleResources->flags->flags[gEffectBattler] |= RESOURCE_FLAG_UNBURDEN; + RecordAbilityBattle(gEffectBattler, ABILITY_UNBURDEN); + } + gActiveBattler = gEffectBattler; BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gEffectBattler].item); MarkBattlerForControllerExec(gActiveBattler); @@ -2942,6 +2965,13 @@ void SetMoveEffect(bool32 primary, u32 certain) { gLastUsedItem = gBattleMons[gEffectBattler].item; gBattleMons[gEffectBattler].item = 0; + + if (GetBattlerAbility(gEffectBattler) == ABILITY_UNBURDEN) + { + gBattleResources->flags->flags[gEffectBattler] |= RESOURCE_FLAG_UNBURDEN; + RecordAbilityBattle(gEffectBattler, ABILITY_UNBURDEN); + } + gActiveBattler = gEffectBattler; BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gEffectBattler].item); MarkBattlerForControllerExec(gActiveBattler); @@ -6118,6 +6148,12 @@ static void Cmd_removeitem(void) gBattleStruct->usedHeldItems[gActiveBattler] = gBattleMons[gActiveBattler].item; gBattleMons[gActiveBattler].item = 0; + + if (GetBattlerAbility(gActiveBattler) == ABILITY_UNBURDEN) + { + gBattleResources->flags->flags[gActiveBattler] |= RESOURCE_FLAG_UNBURDEN; + RecordAbilityBattle(gActiveBattler, ABILITY_UNBURDEN); + } BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBattler].item); MarkBattlerForControllerExec(gActiveBattler); @@ -10484,9 +10520,22 @@ 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 + { + if (GetBattlerAbility(gBattlerAttacker) == ABILITY_UNBURDEN) + { + gBattleResources->flags->flags[gBattlerAttacker] |= RESOURCE_FLAG_UNBURDEN; + RecordAbilityBattle(gBattlerAttacker, ABILITY_UNBURDEN); + } + gBattleCommunication[MULTISTRING_CHOOSER] = 1; // attacker's item -> <- nothing + } } } } diff --git a/src/battle_util.c b/src/battle_util.c index a9619d296b..4d8e2e7b18 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5111,6 +5111,7 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) break; case EFFECT_FLING: // todo + // reminder to program Fling + Unburden interaction break; case EFFECT_ERUPTION: basePower = gBattleMons[battlerAtk].hp * basePower / gBattleMons[battlerAtk].maxHP; From 15d34c35130a5dba27cfae05f8dab0a1d02a5ecf Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 23 Dec 2019 17:09:13 +0100 Subject: [PATCH 443/667] Fix strings coz they had the same name for some unknown to me reason --- include/battle_message.h | 5 ----- src/battle_message.c | 18 +++--------------- 2 files changed, 3 insertions(+), 20 deletions(-) diff --git a/include/battle_message.h b/include/battle_message.h index 256e1ed595..0236cc7934 100644 --- a/include/battle_message.h +++ b/include/battle_message.h @@ -262,11 +262,6 @@ extern const u8 gText_BattleSwitchWhich2[]; extern const u8 gText_BattleSwitchWhich3[]; extern const u8 gText_BattleSwitchWhich4[]; extern const u8 gText_BattleSwitchWhich5[]; -extern const u8 gText_Attack[]; -extern const u8 gText_Defense[]; -extern const u8 gText_SpAtk[]; -extern const u8 gText_SpDef[]; -extern const u8 gText_Speed[]; extern const u8 gText_SafariBalls[]; extern const u8 gText_SafariBallLeft[]; extern const u8 gText_Sleep[]; diff --git a/src/battle_message.c b/src/battle_message.c index 91fbf02ca0..90ded45e35 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -426,19 +426,13 @@ 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"); -const u8 gText_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[] = { - sText_HP2, sText_Attack2, sText_Defense2, - gText_Speed, sText_SpAtk2, sText_SpDef2, + gText_HP3, gText_Attack, gText_Defense, + gText_Speed, gText_SpAtk, gText_SpDef, sText_Accuracy, sText_Evasiveness }; @@ -1532,15 +1526,9 @@ const u8 gText_BattleSwitchWhich3[] = _("{UP_ARROW}"); const u8 gText_BattleSwitchWhich4[] = _("{ESCAPE 4}"); const u8 gText_BattleSwitchWhich5[] = _("-"); -const u8 sText_HP[] = _("HP"); -const u8 gText_Attack[] = _("ATTACK"); -const u8 gText_Defense[] = _("DEFENSE"); -const u8 gText_SpAtk[] = _("SP. ATK"); -const u8 gText_SpDef[] = _("SP. DEF"); - const u8 * const gStatNamesTable2[] = { - sText_HP, gText_SpAtk, gText_Attack, + gText_HP3, gText_SpAtk, gText_Attack, gText_SpDef, gText_Defense, gText_Speed }; From cec9e177d66be04a43cc44493c907f9f58d0c531 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 23 Dec 2019 17:26:48 +0100 Subject: [PATCH 444/667] Gooey add check for not displaying ability pop up when not necessary --- src/battle_util.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index eaa0543196..af620d2f9b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3318,6 +3318,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA 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 && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)) @@ -3489,10 +3490,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA 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; From 63621da46c1f2e6a811e9d2d3b56f237b11d70a7 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 23 Dec 2019 17:41:42 +0100 Subject: [PATCH 445/667] Heatproof lowers burn dmg --- src/battle_util.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/battle_util.c b/src/battle_util.c index af620d2f9b..ebdc2063b9 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1520,6 +1520,8 @@ u8 DoBattlerEndTurnEffects(void) && ability != ABILITY_MAGIC_GUARD) { gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; + if (ability == ABILITY_HEATPROOF) + gBattleMoveDamage /= 2; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; BattleScriptExecute(BattleScript_BurnTurnDmg); From ea9109943dbfe35b1f861142e5d75aefaa437034 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 23 Dec 2019 17:50:13 +0100 Subject: [PATCH 446/667] Aurora Veil now only works in Hail --- src/battle_script_commands.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 7e6b8f13d2..48ac388416 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2195,7 +2195,7 @@ void SetMoveEffect(bool32 primary, u32 certain) break; if (gBattleMons[gEffectBattler].status1) break; - if (GetBattlerAbility(gEffectBattler) == ABILITY_IMMUNITY + if (GetBattlerAbility(gEffectBattler) == ABILITY_IMMUNITY || IsFlowerVeilProtected(gEffectBattler) || IsLeafGuardProtected(gEffectBattler)) break; @@ -2234,7 +2234,7 @@ void SetMoveEffect(bool32 primary, u32 certain) } if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_FIRE)) break; - if (GetBattlerAbility(gEffectBattler) == ABILITY_WATER_VEIL + if (GetBattlerAbility(gEffectBattler) == ABILITY_WATER_VEIL || IsFlowerVeilProtected(gEffectBattler) || IsLeafGuardProtected(gEffectBattler)) break; @@ -2252,7 +2252,7 @@ void SetMoveEffect(bool32 primary, u32 certain) break; if (noSunCanFreeze == 0) break; - if (GetBattlerAbility(gEffectBattler) == ABILITY_MAGMA_ARMOR + if (GetBattlerAbility(gEffectBattler) == ABILITY_MAGMA_ARMOR || IsFlowerVeilProtected(gEffectBattler) || IsLeafGuardProtected(gEffectBattler)) break; @@ -2297,7 +2297,7 @@ void SetMoveEffect(bool32 primary, u32 certain) } if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_ELECTRIC)) break; - if (GetBattlerAbility(gEffectBattler) == ABILITY_LIMBER + if (GetBattlerAbility(gEffectBattler) == ABILITY_LIMBER || IsFlowerVeilProtected(gEffectBattler) || IsLeafGuardProtected(gEffectBattler)) break; @@ -2340,7 +2340,7 @@ void SetMoveEffect(bool32 primary, u32 certain) break; if (!IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON) && !IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL)) { - if (GetBattlerAbility(gEffectBattler) == ABILITY_IMMUNITY + if (GetBattlerAbility(gEffectBattler) == ABILITY_IMMUNITY || IsFlowerVeilProtected(gEffectBattler) || IsLeafGuardProtected(gEffectBattler)) break; @@ -7640,7 +7640,8 @@ static void Cmd_various(void) } break; case VARIOUS_SET_AURORA_VEIL: - if (gSideStatuses[GET_BATTLER_SIDE(gActiveBattler)] & SIDE_STATUS_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; From 3367bdaf51d7baebb23df75db27da6295f6ef21e Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 23 Dec 2019 14:17:54 -0300 Subject: [PATCH 447/667] Made Aftermath trigger the Ability Pop Up sign --- data/battle_scripts_1.s | 2 ++ 1 file changed, 2 insertions(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 60e1688ca9..da654b34cb 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5865,6 +5865,8 @@ BattleScript_IllusionOff:: return BattleScript_AftermathDmg:: + pause 0x20 + call BattleScript_AbilityPopUp orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER From 332aa80a33a8b9677dfc6251f917f3994aa0f30a Mon Sep 17 00:00:00 2001 From: ultima-soul Date: Mon, 23 Dec 2019 09:25:26 -0800 Subject: [PATCH 448/667] Resolve review comments and encapsulate Unburden check and set. --- src/battle_script_commands.c | 49 ++++++++++++------------------------ src/battle_util.c | 3 +-- 2 files changed, 17 insertions(+), 35 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 9b05d8baa9..e01e13dd0e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2073,6 +2073,15 @@ 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++; \ @@ -2677,15 +2686,9 @@ void SetMoveEffect(bool32 primary, u32 certain) else { gLastUsedItem = gBattleStruct->changedItems[gBattlerAttacker] = gBattleMons[gBattlerTarget].item; - gBattleMons[gBattlerTarget].item = 0; - - + gBattleMons[gBattlerTarget].item = 0; - if (GetBattlerAbility(gBattlerTarget) == ABILITY_UNBURDEN) - { - gBattleResources->flags->flags[gBattlerTarget] |= RESOURCE_FLAG_UNBURDEN; - RecordAbilityBattle(gBattlerTarget, ABILITY_UNBURDEN); - } + CheckSetUnburden(gBattlerTarget); if (GetBattlerAbility(gBattlerAttacker) == ABILITY_UNBURDEN && gBattleResources->flags->flags[gBattlerAttacker] & RESOURCE_FLAG_UNBURDEN) gBattleResources->flags->flags[gBattlerAttacker] &= ~(RESOURCE_FLAG_UNBURDEN); @@ -2806,11 +2809,7 @@ void SetMoveEffect(bool32 primary, u32 certain) gLastUsedItem = gBattleMons[gEffectBattler].item; gBattleMons[gEffectBattler].item = 0; gWishFutureKnock.knockedOffMons[side] |= gBitTable[gBattlerPartyIndexes[gEffectBattler]]; - if (GetBattlerAbility(gEffectBattler) == ABILITY_UNBURDEN) - { - gBattleResources->flags->flags[gEffectBattler] |= RESOURCE_FLAG_UNBURDEN; - RecordAbilityBattle(gEffectBattler, ABILITY_UNBURDEN); - } + CheckSetUnburden(gEffectBattler); BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_KnockedOff; @@ -2946,11 +2945,7 @@ void SetMoveEffect(bool32 primary, u32 certain) gLastUsedItem = gBattleMons[gEffectBattler].item; gBattleMons[gEffectBattler].item = 0; - if (GetBattlerAbility(gEffectBattler) == ABILITY_UNBURDEN) - { - gBattleResources->flags->flags[gEffectBattler] |= RESOURCE_FLAG_UNBURDEN; - RecordAbilityBattle(gEffectBattler, ABILITY_UNBURDEN); - } + CheckSetUnburden(gEffectBattler); gActiveBattler = gEffectBattler; BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gEffectBattler].item); @@ -2966,11 +2961,7 @@ void SetMoveEffect(bool32 primary, u32 certain) gLastUsedItem = gBattleMons[gEffectBattler].item; gBattleMons[gEffectBattler].item = 0; - if (GetBattlerAbility(gEffectBattler) == ABILITY_UNBURDEN) - { - gBattleResources->flags->flags[gEffectBattler] |= RESOURCE_FLAG_UNBURDEN; - RecordAbilityBattle(gEffectBattler, ABILITY_UNBURDEN); - } + CheckSetUnburden(gEffectBattler); gActiveBattler = gEffectBattler; BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gEffectBattler].item); @@ -6150,11 +6141,7 @@ static void Cmd_removeitem(void) gBattleMons[gActiveBattler].item = 0; - if (GetBattlerAbility(gActiveBattler) == ABILITY_UNBURDEN) - { - gBattleResources->flags->flags[gActiveBattler] |= RESOURCE_FLAG_UNBURDEN; - RecordAbilityBattle(gActiveBattler, ABILITY_UNBURDEN); - } + CheckSetUnburden(gActiveBattler); BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBattler].item); MarkBattlerForControllerExec(gActiveBattler); @@ -10530,11 +10517,7 @@ static void Cmd_tryswapitems(void) // trick } else { - if (GetBattlerAbility(gBattlerAttacker) == ABILITY_UNBURDEN) - { - gBattleResources->flags->flags[gBattlerAttacker] |= RESOURCE_FLAG_UNBURDEN; - RecordAbilityBattle(gBattlerAttacker, ABILITY_UNBURDEN); - } + CheckSetUnburden(gBattlerAttacker); gBattleCommunication[MULTISTRING_CHOOSER] = 1; // attacker's item -> <- nothing } diff --git a/src/battle_util.c b/src/battle_util.c index 8b5f83e728..e0d88bafc4 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5132,8 +5132,7 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) // todo break; case EFFECT_FLING: - // todo - // reminder to program Fling + Unburden interaction + // todo: program Fling + Unburden interaction break; case EFFECT_ERUPTION: basePower = gBattleMons[battlerAtk].hp * basePower / gBattleMons[battlerAtk].maxHP; From 77842b03760266a28bd53469ded7fd5fdb3cd1fd Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 25 Dec 2019 12:19:09 +0100 Subject: [PATCH 449/667] Contact moves for Aftermath and Bestow for Unburden --- src/battle_script_commands.c | 12 ++++-------- src/battle_util.c | 11 +++++------ 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e01e13dd0e..ec4c3aff4e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2686,12 +2686,10 @@ void SetMoveEffect(bool32 primary, u32 certain) else { gLastUsedItem = gBattleStruct->changedItems[gBattlerAttacker] = gBattleMons[gBattlerTarget].item; - gBattleMons[gBattlerTarget].item = 0; + gBattleMons[gBattlerTarget].item = 0; CheckSetUnburden(gBattlerTarget); - - if (GetBattlerAbility(gBattlerAttacker) == ABILITY_UNBURDEN && gBattleResources->flags->flags[gBattlerAttacker] & RESOURCE_FLAG_UNBURDEN) - gBattleResources->flags->flags[gBattlerAttacker] &= ~(RESOURCE_FLAG_UNBURDEN); + gBattleResources->flags->flags[gBattlerAttacker] &= ~(RESOURCE_FLAG_UNBURDEN); gActiveBattler = gBattlerAttacker; BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gLastUsedItem); @@ -2944,7 +2942,6 @@ void SetMoveEffect(bool32 primary, u32 certain) { gLastUsedItem = gBattleMons[gEffectBattler].item; gBattleMons[gEffectBattler].item = 0; - CheckSetUnburden(gEffectBattler); gActiveBattler = gEffectBattler; @@ -2960,7 +2957,6 @@ void SetMoveEffect(bool32 primary, u32 certain) { gLastUsedItem = gBattleMons[gEffectBattler].item; gBattleMons[gEffectBattler].item = 0; - CheckSetUnburden(gEffectBattler); gActiveBattler = gEffectBattler; @@ -6140,7 +6136,6 @@ static void Cmd_removeitem(void) gBattleStruct->usedHeldItems[gActiveBattler] = gBattleMons[gActiveBattler].item; gBattleMons[gActiveBattler].item = 0; - CheckSetUnburden(gActiveBattler); BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBattler].item); @@ -7608,11 +7603,13 @@ static void Cmd_various(void) 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; } @@ -10518,7 +10515,6 @@ static void Cmd_tryswapitems(void) // trick else { CheckSetUnburden(gBattlerAttacker); - gBattleCommunication[MULTISTRING_CHOOSER] = 1; // attacker's item -> <- nothing } } diff --git a/src/battle_util.c b/src/battle_util.c index ddb9563d93..cdc645cbe5 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3323,7 +3323,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && gBattleMons[gBattlerAttacker].statStages[STAT_SPEED] != 0 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && TARGET_TURN_DAMAGED - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)) + && IsMoveMakingContact(move, gBattlerAttacker)) { gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_SPD_MINUS_1; PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); @@ -3339,7 +3339,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && gBattleMons[gBattlerAttacker].hp != 0 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && TARGET_TURN_DAMAGED - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)) + && IsMoveMakingContact(move, gBattlerAttacker)) { gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 8; if (gBattleMoveDamage == 0) @@ -3351,11 +3351,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } break; case ABILITY_AFTERMATH: - if (IsAbilityOnField(ABILITY_DAMP)) - break; - else if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + if (!IsAbilityOnField(ABILITY_DAMP) + && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && gBattleMons[gBattlerTarget].hp == 0 - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)) + && IsMoveMakingContact(move, gBattlerAttacker)) { gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 4; if (gBattleMoveDamage == 0) From 770a57bec7b86b0a32fa103fae12f9bd589fe0a4 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 30 Dec 2019 13:14:20 +0100 Subject: [PATCH 450/667] Fix some moves hitting the user --- src/battle_util.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index cdc645cbe5..f03d53d277 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4652,14 +4652,23 @@ void HandleAction_RunBattleScript(void) // identical to RunBattleScriptCommands 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}, }; - u32 target = GetBattlerAtPosition(targets[GetBattlerSide(battlerId)][Random() % 2]); - if (!IsBattlerAlive(target)) - target ^= BIT_FLANK; + + 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; } From 7051f261d1a0f5929ca73a14a60dc2402ab9370a Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 31 Dec 2019 13:33:54 +0100 Subject: [PATCH 451/667] Fix Queenly Majesty --- src/battle_util.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index f03d53d277..1949131780 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3084,13 +3084,11 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gBattlescriptCurrInstr = BattleScript_SoundproofProtected; effect = 1; } - else if (((gLastUsedAbility == ABILITY_DAZZLING - || (IsBattlerAlive(battler ^= BIT_FLANK) && GetBattlerAbility(battler) == ABILITY_DAZZLING) - ) - || (gLastUsedAbility == ABILITY_QUEENLY_MAJESTY - || (IsBattlerAlive(battler ^= BIT_FLANK) && GetBattlerAbility(battler) == ABILITY_QUEENLY_MAJESTY) + else if ((((gLastUsedAbility == ABILITY_DAZZLING || gLastUsedAbility == ABILITY_QUEENLY_MAJESTY + || (IsBattlerAlive(battler ^= BIT_FLANK) + && ((GetBattlerAbility(battler) == ABILITY_DAZZLING) || GetBattlerAbility(battler) == ABILITY_QUEENLY_MAJESTY))) )) - && GetChosenMovePriority(battler) > 0 + && GetChosenMovePriority(gBattlerAttacker) > 0 && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(battler)) { if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS) From b15f0b3bb3dc41c494ae7589212d7919533c5ecf Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 31 Dec 2019 16:36:53 +0100 Subject: [PATCH 452/667] Comatose --- data/battle_scripts_1.s | 11 +++++++++++ src/battle_script_commands.c | 11 +++++++++-- src/battle_util.c | 9 ++++++--- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index c803f52a1e..095d4062e3 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2000,6 +2000,7 @@ BattleScript_EffectSleep:: 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 @@ -2189,6 +2190,7 @@ BattleScript_EffectDreamEater:: attackcanceler jumpifsubstituteblocks BattleScript_DreamEaterNoEffect jumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_DreamEaterWorked + jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_DreamEaterWorked BattleScript_DreamEaterNoEffect: attackstring ppreduce @@ -2499,6 +2501,7 @@ BattleScript_EffectToxic:: attackstring ppreduce jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected + jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects jumpifflowerveil BattleScript_FlowerVeilProtects jumpifleafguard BattleScript_LeafGuardProtects jumpifsubstituteblocks BattleScript_ButItFailed @@ -2556,6 +2559,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 @@ -2826,6 +2830,7 @@ BattleScript_EffectPoison:: attackstring ppreduce jumpifability BS_TARGET, ABILITY_IMMUNITY, BattleScript_ImmunityProtected + jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects jumpifflowerveil BattleScript_FlowerVeilProtects jumpifleafguard BattleScript_LeafGuardProtects jumpifsubstituteblocks BattleScript_ButItFailed @@ -2849,6 +2854,7 @@ BattleScript_EffectParalyze: attackstring ppreduce jumpifability BS_TARGET, ABILITY_LIMBER, BattleScript_LimberProtected + jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_LeafGuardProtects jumpifflowerveil BattleScript_FlowerVeilProtects jumpifleafguard BattleScript_LeafGuardProtects jumpifsubstituteblocks BattleScript_ButItFailed @@ -3141,6 +3147,7 @@ BattleScript_EffectPainSplit:: BattleScript_EffectSnore:: attackcanceler + jumpifability BS_ATTACKER, ABILITY_COMATOSE, BattleScript_SnoreIsAsleep jumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_SnoreIsAsleep attackstring ppreduce @@ -3194,6 +3201,7 @@ BattleScript_EffectSketch:: BattleScript_EffectSleepTalk:: attackcanceler + jumpifability BS_ATTACKER, ABILITY_COMATOSE, BattleScript_SleepTalkIsAsleep jumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_SleepTalkIsAsleep attackstring ppreduce @@ -3345,6 +3353,7 @@ BattleScript_EffectNightmare:: 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 @@ -4079,6 +4088,7 @@ BattleScript_EffectWillOWisp:: 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 jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed @@ -4343,6 +4353,7 @@ BattleScript_EffectYawn:: ppreduce jumpifability BS_TARGET, ABILITY_VITAL_SPIRIT, BattleScript_PrintBankAbilityMadeIneffective jumpifability BS_TARGET, ABILITY_INSOMNIA, BattleScript_PrintBankAbilityMadeIneffective + jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_PrintBankAbilityMadeIneffective jumpifflowerveil BattleScript_FlowerVeilProtects jumpifleafguard BattleScript_LeafGuardProtects jumpifsubstituteblocks BattleScript_ButItFailed diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ec4c3aff4e..102b49c867 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2148,7 +2148,7 @@ void SetMoveEffect(bool32 primary, u32 certain) for (gActiveBattler = 0; gActiveBattler < gBattlersCount && !(gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR); gActiveBattler++) - {} + ; } else gActiveBattler = gBattlersCount; @@ -2159,6 +2159,7 @@ void SetMoveEffect(bool32 primary, u32 certain) break; if (GetBattlerAbility(gEffectBattler) == ABILITY_VITAL_SPIRIT || GetBattlerAbility(gEffectBattler) == ABILITY_INSOMNIA + || GetBattlerAbility(gEffectBattler) == ABILITY_COMATOSE || IsAbilityOnSide(gEffectBattler, ABILITY_SWEET_VEIL) || IsFlowerVeilProtected(gEffectBattler) || IsLeafGuardProtected(gEffectBattler)) @@ -2205,6 +2206,7 @@ void SetMoveEffect(bool32 primary, u32 certain) if (gBattleMons[gEffectBattler].status1) break; if (GetBattlerAbility(gEffectBattler) == ABILITY_IMMUNITY + || GetBattlerAbility(gEffectBattler) == ABILITY_COMATOSE || IsFlowerVeilProtected(gEffectBattler) || IsLeafGuardProtected(gEffectBattler)) break; @@ -2244,6 +2246,7 @@ void SetMoveEffect(bool32 primary, u32 certain) if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_FIRE)) break; if (GetBattlerAbility(gEffectBattler) == ABILITY_WATER_VEIL + || GetBattlerAbility(gEffectBattler) == ABILITY_COMATOSE || IsFlowerVeilProtected(gEffectBattler) || IsLeafGuardProtected(gEffectBattler)) break; @@ -2262,6 +2265,7 @@ void SetMoveEffect(bool32 primary, u32 certain) if (noSunCanFreeze == 0) break; if (GetBattlerAbility(gEffectBattler) == ABILITY_MAGMA_ARMOR + || GetBattlerAbility(gEffectBattler) == ABILITY_COMATOSE || IsFlowerVeilProtected(gEffectBattler) || IsLeafGuardProtected(gEffectBattler)) break; @@ -2307,6 +2311,7 @@ void SetMoveEffect(bool32 primary, u32 certain) if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_ELECTRIC)) break; if (GetBattlerAbility(gEffectBattler) == ABILITY_LIMBER + || GetBattlerAbility(gEffectBattler) == ABILITY_COMATOSE || IsFlowerVeilProtected(gEffectBattler) || IsLeafGuardProtected(gEffectBattler)) break; @@ -2350,6 +2355,7 @@ void SetMoveEffect(bool32 primary, u32 certain) if (!IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON) && !IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL)) { if (GetBattlerAbility(gEffectBattler) == ABILITY_IMMUNITY + || GetBattlerAbility(gEffectBattler) == ABILITY_COMATOSE || IsFlowerVeilProtected(gEffectBattler) || IsLeafGuardProtected(gEffectBattler)) break; @@ -11674,7 +11680,8 @@ static void Cmd_trygetbaddreamstarget(void) { if (GetBattlerSide(gBattlerTarget) == badDreamsMonSide) continue; - if (gBattleMons[gBattlerTarget].status1 & STATUS1_SLEEP && IsBattlerAlive(gBattlerTarget)) + if ((gBattleMons[gBattlerTarget].status1 & STATUS1_SLEEP || GetBattlerAbility(gBattlerTarget) == ABILITY_COMATOSE) + && IsBattlerAlive(gBattlerTarget)) break; } diff --git a/src/battle_util.c b/src/battle_util.c index 1949131780..ee0d3a3814 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3056,7 +3056,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gDisableStructs[gBattlerAttacker].truantCounter ^= 1; break; case ABILITY_BAD_DREAMS: - if (gBattleMons[BATTLE_OPPOSITE(battler)].status1 & STATUS1_SLEEP || gBattleMons[BATTLE_OPPOSITE(battler)].status1 & STATUS1_SLEEP) + 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++; @@ -5214,7 +5217,7 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) basePower = gNaturalGiftTable[ITEM_TO_BERRY(gBattleMons[battlerAtk].item)].power; break; case EFFECT_WAKE_UP_SLAP: - if (gBattleMons[battlerDef].status1 & STATUS1_SLEEP) + if (gBattleMons[battlerDef].status1 & STATUS1_SLEEP || GetBattlerAbility(battlerDef) == ABILITY_COMATOSE) basePower *= 2; break; case EFFECT_SMELLINGSALT: @@ -5225,7 +5228,7 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) basePower = 120 * gBattleMons[battlerDef].hp / gBattleMons[battlerDef].maxHP; break; case EFFECT_HEX: - if (gBattleMons[battlerDef].status1 & STATUS1_ANY) + if (gBattleMons[battlerDef].status1 & STATUS1_ANY || GetBattlerAbility(battlerDef) == ABILITY_COMATOSE) basePower *= 2; break; case EFFECT_ASSURANCE: From 39e3b0b7401ef6d9184f04d093c0e113ca4b56e1 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 31 Dec 2019 19:11:53 +0100 Subject: [PATCH 453/667] Form changes layout and Stance Change Aegi --- asm/macros/battle_script.inc | 5 ++ data/battle_anim_scripts.s | 8 ++ data/battle_scripts_1.s | 12 +++ include/battle_scripts.h | 1 + include/battle_util.h | 3 +- include/constants/battle_anim.h | 1 + include/constants/battle_config.h | 3 + include/constants/battle_script_commands.h | 1 + src/battle_main.c | 6 ++ src/battle_script_commands.c | 91 ++++++++++++++++++---- src/battle_util.c | 23 +++++- 11 files changed, 139 insertions(+), 15 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 8a83036739..fc8ecf8257 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1531,6 +1531,11 @@ .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 diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index d6328541a4..a18c69be97 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -683,6 +683,7 @@ gBattleAnims_General:: .4byte General_TerrainElectric .4byte General_TerrainPsychic .4byte General_IllusionOff + .4byte General_FormChange .align 2 gBattleAnims_Special:: @@ -14763,6 +14764,13 @@ General_IllusionOff: waitforvisualfinish clearmonbg ANIM_TARGET end + +General_FormChange: + monbg ANIM_ATTACKER + createvisualtask AnimTask_TransformMon, 2, 0, 1 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + end General_MegaEvolution: loadspritegfx ANIM_TAG_MEGA_STONE diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 095d4062e3..faf26a9577 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5881,6 +5881,18 @@ BattleScript_MegaEvolution:: printstring STRINGID_MEGAEVOEVOLVED waitmessage 0x40 end2 + +BattleScript_StanceChangeActivates:: + pause 0x5 + 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_IllusionOff:: spriteignore0hp TRUE diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 448f3b29f6..824b96548f 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -328,5 +328,6 @@ extern const u8 BattleScript_MoveEffectBugBite[]; extern const u8 BattleScript_IllusionOff[]; extern const u8 BattleScript_DancerActivates[]; extern const u8 BattleScript_AftermathDmg[]; +extern const u8 BattleScript_StanceChangeActivates[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/battle_util.h b/include/battle_util.h index 5d4dff81ee..b7d572c790 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -103,7 +103,8 @@ u16 GetTypeModifier(u8 atkType, u8 defType); s32 GetStealthHazardDamage(u8 hazardType, u8 battlerId); u16 GetMegaEvolutionSpecies(u16 preEvoSpecies, u16 heldItemId); bool32 CanMegaEvolve(u8 battlerId); -void UndoMegaEvolution(u8 monId); +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); diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index 0307357b19..5369e756db 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -407,6 +407,7 @@ #define B_ANIM_TERRAIN_ELECTRIC 0x1A #define B_ANIM_TERRAIN_PSYCHIC 0x1B #define B_ANIM_ILLUSION_OFF 0x1C +#define B_ANIM_FORM_CHANGE 0x1D // special animations table #define B_ANIM_LVL_UP 0x0 diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index b4098ea7d5..2390bee60b 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -9,6 +9,8 @@ #define SPECIES_ARCEUS 0 #define SPECIES_SILVALLY 0 #define SPECIES_GENESECT 0 +#define SPECIES_AEGISLASH 0 +#define SPECIES_AEGISLASH_BLADE 10000 // Items with peculiar battle effects. Remove them if they're properly placed in constant/items.h #define ITEM_GRISEOUS_ORB 0 @@ -50,6 +52,7 @@ #define B_SOUND_SUBSTITUTE GEN_6 // Starting from gen6 sound moves bypass Substitute. #define B_EXP_CATCH GEN_6 // Starting from gen6, pokemon get experience from catching. #define B_ABILITY_POP_UP GEN_6 // Starting from gen5, the pokemon abilities are displayed in a pop-up, when they activate in battle. +#define B_STANCE_CHANGE_FAIL GEN_7 // In Gen7, Aegislash's form change does not happen, if the pokemon cannot use a move, because of confusion, paralysis, etc. In gen6, the form change occurs despite not being able to move. #define B_FAST_INTRO TRUE // If set to TRUE, battle intro texts print at the same time as animation of a pokemon, as opposing to waiting for the animation to end. diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 4b94c90331..4e690ab5ea 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -145,6 +145,7 @@ #define VARIOUS_UPDATE_NICK 82 #define VARIOUS_TRY_ILLUSION_OFF 83 #define VARIOUS_SET_SPRITEIGNORE0HP 84 +#define VARIOUS_HANDLE_FORM_CHANGE 85 // Cmd_manipulatedmg #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_main.c b/src/battle_main.c index 8a4b012fc0..b8dc77eb6f 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3154,6 +3154,7 @@ void FaintClearSetData(void) ClearBattlerMoveHistory(gActiveBattler); ClearBattlerAbilityHistory(gActiveBattler); + UndoFormChange(gBattlerPartyIndexes[gActiveBattler], GET_BATTLER_SIDE(gActiveBattler)); if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) UndoMegaEvolution(gBattlerPartyIndexes[gActiveBattler]); } @@ -4864,7 +4865,10 @@ static void HandleEndTurn_FinishBattle(void) BeginFastPaletteFade(3); FadeOutMapMusic(5); for (i = 0; i < PARTY_SIZE; i++) + { UndoMegaEvolution(i); + UndoFormChange(i, B_SIDE_PLAYER); + } gBattleMainFunc = FreeResetData_ReturnToOvOrDoEvolutions; gCB2_AfterEvolution = BattleMainCB2; } @@ -5360,6 +5364,8 @@ static void HandleAction_Switch(void) if (gBattleResults.playerSwitchesCounter < 255) gBattleResults.playerSwitchesCounter++; + + UndoFormChange(gBattlerPartyIndexes[gBattlerAttacker], GetBattlerSide(gBattlerAttacker)); } static void HandleAction_UseItem(void) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 102b49c867..d8dcc7359a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -970,6 +970,32 @@ static bool32 NoTargetPresent(u32 move) return FALSE; } +static bool32 TryAegiFormChange(void) +{ + if (GetBattlerAbility(gBattlerAttacker) != ABILITY_STANCE_CHANGE) + 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_KING_S_SHIELD) + return FALSE; + gBattleMons[gBattlerAttacker].species = SPECIES_AEGISLASH; + break; + } + + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_StanceChangeActivates; + return TRUE; +} + static void Cmd_attackcanceler(void) { s32 i, moveType; @@ -985,6 +1011,10 @@ static void Cmd_attackcanceler(void) gBattlescriptCurrInstr = BattleScript_MoveEnd; return; } + #if (B_STANCE_CHANGE_FAIL <= GEN_6) + if (TryAegiFormChange()) + return; + #endif if (AtkCanceller_UnableToUseMove()) return; @@ -1014,6 +1044,10 @@ 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)) @@ -4141,6 +4175,7 @@ static void Cmd_playanimation(void) || 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); @@ -4186,6 +4221,7 @@ static void Cmd_playanimation2(void) // animation Id is stored in the first poin || *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); @@ -6676,6 +6712,22 @@ u32 IsLeafGuardProtected(u32 battler) return 0; } +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 void Cmd_various(void) { struct Pokemon *mon; @@ -7297,19 +7349,7 @@ static void Cmd_various(void) // Change stats. else if (gBattlescriptCurrInstr[3] == 1) { - CalculateMonStats(mon); - gBattleMons[gActiveBattler].level = GetMonData(mon, MON_DATA_LEVEL); - gBattleMons[gActiveBattler].hp = GetMonData(mon, MON_DATA_HP); - gBattleMons[gActiveBattler].maxHP = GetMonData(mon, MON_DATA_MAX_HP); - gBattleMons[gActiveBattler].attack = GetMonData(mon, MON_DATA_ATK); - gBattleMons[gActiveBattler].defense = GetMonData(mon, MON_DATA_DEF); - gBattleMons[gActiveBattler].speed = GetMonData(mon, MON_DATA_SPEED); - gBattleMons[gActiveBattler].spAttack = GetMonData(mon, MON_DATA_SPATK); - gBattleMons[gActiveBattler].spDefense = GetMonData(mon, MON_DATA_SPDEF); - gBattleMons[gActiveBattler].ability = GetMonAbility(mon); - gBattleMons[gActiveBattler].type1 = gBaseStats[gBattleMons[gActiveBattler].species].type1; - gBattleMons[gActiveBattler].type2 = gBaseStats[gBattleMons[gActiveBattler].species].type2; - + RecalcBattlerStats(gActiveBattler, mon); gBattleStruct->mega.alreadyEvolved[GetBattlerPosition(gActiveBattler)] = TRUE; gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(gActiveBattler)] |= gBitTable[gBattlerPartyIndexes[gActiveBattler]]; } @@ -7321,6 +7361,31 @@ static void Cmd_various(void) } 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; diff --git a/src/battle_util.c b/src/battle_util.c index ee0d3a3814..a80849d5d2 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6276,7 +6276,7 @@ bool32 CanMegaEvolve(u8 battlerId) return TRUE; } -void UndoMegaEvolution(u8 monId) +void UndoMegaEvolution(u32 monId) { if (gBattleStruct->mega.evolvedPartyIds[B_SIDE_PLAYER] & gBitTable[monId]) { @@ -6286,6 +6286,27 @@ void UndoMegaEvolution(u8 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}, + }; + + 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; From b69292248cb14400627a55accdb1261c588a1a58 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 1 Jan 2020 00:22:42 +0100 Subject: [PATCH 454/667] Add constants for special multi battles --- include/constants/battle_tower.h | 6 ++++++ src/battle_tower.c | 12 ++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) 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/src/battle_tower.c b/src/battle_tower.c index fbb3d28a6b..de2c6f0cb6 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -2125,16 +2125,16 @@ void DoSpecialTrainerBattle(void) BattleTransition_StartOnField(B_TRANSITION_MAGMA); break; case SPECIAL_BATTLE_MULTI: - if (gSpecialVar_0x8005 & 1) // Player + AI against wild mon + 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 & 2) // Player + AI against one trainer + 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 + else // MULTI_BATTLE_2_VS_2 { gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER; } @@ -2144,12 +2144,12 @@ void DoSpecialTrainerBattle(void) gPartnerTrainerId = gSpecialVar_0x8006 + TRAINER_CUSTOM_PARTNER; CreateTask(Task_StartBattleAfterTransition, 1); PlayMapChosenOrBattleBGM(0); - if (gSpecialVar_0x8005 & 1) + if (gSpecialVar_0x8005 & MULTI_BATTLE_2_VS_WILD) BattleTransition_StartOnField(GetWildBattleTransition()); else BattleTransition_StartOnField(GetTrainerBattleTransition()); - if (gSpecialVar_0x8005 & 0x80) // Skip mons restoring(done in the script) + if (gSpecialVar_0x8005 & MULTI_BATTLE_CHOOSE_MONS) // Skip mons restoring(done in the script) gBattleScripting.specialTrainerBattleType = 0xFF; break; } @@ -2678,7 +2678,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) From d21449e19c086064e896e4311d66203b25052e5e Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 1 Jan 2020 10:57:27 +0100 Subject: [PATCH 455/667] Fix Lava Plume animation in double battles --- data/battle_anim_scripts.s | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index a18c69be97..efb05e105e 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -2973,8 +2973,10 @@ Move_DISCHARGE: Move_LAVA_PLUME: loadspritegfx ANIM_TAG_FIRE_PLUME loopsewithpan 152, SOUND_PAN_ATTACKER, 9, 2 - createvisualtask sub_8115A04, 2, 2, 2, 2, 0, 11, 31 - createvisualtask AnimTask_ShakeMon2 2, 5, 0, 1, 0, 32, 1 + createvisualtask sub_8115A04, 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 @@ -2982,7 +2984,7 @@ Move_LAVA_PLUME: createsprite gLavaPlumeSpriteTemplate, 130, 1, 96 createsprite gLavaPlumeSpriteTemplate, 130, 1, 128 createsprite gLavaPlumeSpriteTemplate, 130, 1, 160 - createsprite gLavaPlumeSpriteTemplate, 130, 1, SOUND_PAN_ATTACKER + createsprite gLavaPlumeSpriteTemplate, 130, 1, 192 createsprite gLavaPlumeSpriteTemplate, 130, 1, 224 playsewithpan SE_W221, SOUND_PAN_ATTACKER waitforvisualfinish From fcf5870062e4a821a93c28e89f02294ee873fcaa Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 1 Jan 2020 11:12:04 +0100 Subject: [PATCH 456/667] Fix wild mons in double battles not having item --- src/pokemon.c | 49 +++++++++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/src/pokemon.c b/src/pokemon.c index 98069c3cb6..2898eb2ce8 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -6180,51 +6180,60 @@ 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) { - 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); } } } From cafb0c3b6a6bd90416f76b81b619f81d4036a345 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 4 Jan 2020 18:17:26 +0100 Subject: [PATCH 457/667] Fix Surf taking 3 pp --- src/battle_script_commands.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d8dcc7359a..ee0913f174 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4693,6 +4693,7 @@ static void Cmd_moveend(void) if (gBattleMoves[gCurrentMove].target == MOVE_TARGET_FOES_AND_ALLY) { + gHitMarker |= HITMARKER_NO_PPDEDUCT; for (battlerId = gBattlerTarget + 1; battlerId < gBattlersCount; battlerId++) { if (battlerId == gBattlerAttacker) @@ -4720,6 +4721,7 @@ static void Cmd_moveend(void) else { gHitMarker |= HITMARKER_NO_ATTACKSTRING; + gHitMarker &= ~(HITMARKER_NO_PPDEDUCT); } } gBattleScripting.moveendState++; From 952bdbd9f538126c372bb6041df52aa4d6629ea8 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 4 Jan 2020 18:41:59 +0100 Subject: [PATCH 458/667] Steadfast string fix --- data/battle_scripts_1.s | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index faf26a9577..463d23a250 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6017,11 +6017,13 @@ 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_TARGETABILITYSTATRAISE + printstring STRINGID_ATTACKERABILITYSTATRAISE waitmessage 0x40 goto BattleScript_MoveUsedFlinchedEnd From ed46cde3047dcc7aac6b5bbea064555eeb922a85 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 6 Jan 2020 21:33:44 +0100 Subject: [PATCH 459/667] Fix Persim Berry and cure attract battler assignment --- src/battle_util.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index a80849d5d2..6bbe25ad63 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4457,10 +4457,9 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) break; } - if (effect == ITEM_STATUS_CHANGE) + if (effect) { - gBattleScripting.battler = battlerId; - gPotentialItemEffectBattler = battlerId; + gPotentialItemEffectBattler = gBattleScripting.battler = battlerId; gActiveBattler = battlerId; BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); From 000a7093635d7586b9ea3d91048e82a498730a95 Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Sat, 18 Jan 2020 14:29:56 -0300 Subject: [PATCH 460/667] Gen7 trainer exp multiplier. (#200) * Gen7 trainer exp multiplier. * Changed check for TRAINER_BATTLE_MULTIPLIER from "before Gen 7" to "not Gen 7" as requested. . --- include/constants/battle_config.h | 1 + src/battle_script_commands.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 2390bee60b..1480a9cf48 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -53,6 +53,7 @@ #define B_EXP_CATCH GEN_6 // Starting from gen6, pokemon get experience from catching. #define B_ABILITY_POP_UP GEN_6 // Starting from gen5, the pokemon abilities are displayed in a pop-up, when they activate in battle. #define B_STANCE_CHANGE_FAIL GEN_7 // In Gen7, Aegislash's form change does not happen, if the pokemon cannot use a move, because of confusion, paralysis, etc. In gen6, the form change occurs despite not being able to move. +#define B_TRAINER_BATTLE_MULTIPLIER GEN_6 // Gen7 no longer gives a 1.5 multiplier to exp gain. #define B_FAST_INTRO TRUE // If set to TRUE, battle intro texts print at the same time as animation of a pokemon, as opposing to waiting for the animation to end. diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ee0913f174..4c3d5baa74 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3507,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_BATTLE_MULTIPLIER != GEN_7) gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; if (IsTradedMon(&gPlayerParty[gBattleStruct->expGetterMonId])) From b87dac459bb456112082eff994ded9b80296c7ff Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Sat, 18 Jan 2020 14:34:04 -0300 Subject: [PATCH 461/667] Implemented missing Neuroforce. (#242) * Added ID, name and description. * Added damage multiplier. --- include/constants/abilities.h | 3 ++- src/battle_util.c | 4 ++++ src/data/text/abilities.h | 3 +++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/include/constants/abilities.h b/include/constants/abilities.h index 59250e521f..ab2e6880a4 100644 --- a/include/constants/abilities.h +++ b/include/constants/abilities.h @@ -251,8 +251,9 @@ #define ABILITY_FULL_METAL_BODY 231 #define ABILITY_SHADOW_SHIELD 232 #define ABILITY_PRISM_ARMOR 233 +#define ABILITY_NEUROFORCE 234 -#define ABILITIES_COUNT_GEN7 234 +#define ABILITIES_COUNT_GEN7 235 #define ABILITIES_COUNT ABILITIES_COUNT_GEN6 diff --git a/src/battle_util.c b/src/battle_util.c index 6bbe25ad63..cf69e381b8 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5913,6 +5913,10 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move 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 diff --git a/src/data/text/abilities.h b/src/data/text/abilities.h index dc8b000f17..11b6ffaf7f 100644 --- a/src/data/text/abilities.h +++ b/src/data/text/abilities.h @@ -220,6 +220,7 @@ 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_GEN7][ABILITY_NAME_LENGTH + 1] = { @@ -457,6 +458,7 @@ const u8 gAbilityNames[ABILITIES_COUNT_GEN7][ABILITY_NAME_LENGTH + 1] = [ABILITY_FULL_METAL_BODY] = _("FullMetalBod"), [ABILITY_SHADOW_SHIELD] = _("ShadowShield"), [ABILITY_PRISM_ARMOR] = _("Prism Armor"), + [ABILITY_NEUROFORCE] = _("Neuroforce"), }; const u8 *const gAbilityDescriptionPointers[ABILITIES_COUNT_GEN7] = @@ -695,4 +697,5 @@ const u8 *const gAbilityDescriptionPointers[ABILITIES_COUNT_GEN7] = [ABILITY_FULL_METAL_BODY] = sFullMetalBodyDescription, [ABILITY_SHADOW_SHIELD] = sMultiscaleDescription, [ABILITY_PRISM_ARMOR] = sFilterDescription, + [ABILITY_NEUROFORCE] = sNeuroforceDescription, }; From bcf6b02a5549e797cb55bb7a02a1cc074a6b55f4 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 18 Jan 2020 18:57:23 +0100 Subject: [PATCH 462/667] Fix Last Resort --- src/battle_script_commands.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 4c3d5baa74..6199dd17d2 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6645,14 +6645,11 @@ bool32 CanUseLastResort(u8 battlerId) { if (gBattleMons[battlerId].moves[i] != MOVE_NONE) knownMovesCount++; - if (gDisableStructs[battlerId].usedMoves & gBitTable[i]) + if (i != gCurrMovePos && gDisableStructs[battlerId].usedMoves & gBitTable[i]) // Increment used move count for all moves except current Last Resort. usedMovesCount++; } - if (knownMovesCount >= 2 && usedMovesCount >= knownMovesCount - 1) - return TRUE; - else - return FALSE; + return (knownMovesCount >= 2 && usedMovesCount >= knownMovesCount - 1); } #define DEFOG_CLEAR(status, structField, battlescript, move)\ From 06a9165f753063f2d4d4e01b9d04e92508965b90 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 18 Jan 2020 19:18:57 +0100 Subject: [PATCH 463/667] Fix Ice Body not working --- data/battle_scripts_1.s | 1 + src/battle_script_commands.c | 27 +++++++-------------------- 2 files changed, 8 insertions(+), 20 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 463d23a250..286a224a2a 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5111,6 +5111,7 @@ BattleScript_DamagingWeatherLoop:: hitanimation BS_ATTACKER goto BattleScript_DamagingWeatherHpChange BattleScript_DamagingWeatherHeal: + call BattleScript_AbilityPopUp printstring STRINGID_ICEBODYHPGAIN waitmessage 0x40 BattleScript_DamagingWeatherHpChange: diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 6199dd17d2..fb41226e49 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8963,11 +8963,8 @@ static void Cmd_setsandstorm(void) static void Cmd_weatherdamage(void) { - if (!IsBattlerAlive(gBattlerAttacker) || !WEATHER_HAS_EFFECT) - { - gBattleMoveDamage = 0; - } - else + gBattleMoveDamage = 0; + if (IsBattlerAlive(gBattlerAttacker) && WEATHER_HAS_EFFECT) { u32 ability = GetBattlerAbility(gBattlerAttacker); if (gBattleWeather & WEATHER_SANDSTORM_ANY) @@ -8979,27 +8976,22 @@ static void Cmd_weatherdamage(void) && ability != ABILITY_SAND_FORCE && ability != ABILITY_SAND_RUSH && ability != ABILITY_OVERCOAT - && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERGROUND) - && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER) + && !(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 (ability == ABILITY_ICE_BODY - && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERGROUND) - && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER) + && !(gStatuses3[gBattlerAttacker] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) && !BATTLER_MAX_HP(gBattlerAttacker) - && !gStatuses3[gBattlerAttacker] & STATUS3_HEAL_BLOCK) + && !(gStatuses3[gBattlerAttacker] & STATUS3_HEAL_BLOCK)) { + gBattlerAbility = gBattlerAttacker; gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; @@ -9009,18 +9001,13 @@ static void Cmd_weatherdamage(void) && ability != ABILITY_SNOW_CLOAK && ability != ABILITY_OVERCOAT && ability != ABILITY_ICE_BODY - && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERGROUND) - && !(gStatuses3[gBattlerAttacker] & STATUS3_UNDERWATER) + && !(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; - } } } From 5c486c15dd687ba0309aa68f18ebeaa64c1bda5e Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 18 Jan 2020 19:40:49 +0100 Subject: [PATCH 464/667] Fix Moxie battler --- data/battle_scripts_1.s | 1 + 1 file changed, 1 insertion(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 286a224a2a..cd244c3c65 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6716,6 +6716,7 @@ BattleScript_WeakArmorActivatesEnd: BattleScript_AttackerAbilityStatRaise:: setgraphicalstatchangevalues + copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUp playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 waitanimation From 1d13004a0b23ffd302a8e2da1297f3ab216b64a3 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 18 Jan 2020 20:28:36 +0100 Subject: [PATCH 465/667] Fix Power Gem anim --- data/battle_anim_scripts.s | 54 +++++++++--------- src/battle_anim_effects_2.c | 22 +++++++ src/rock.c | 111 ------------------------------------ 3 files changed, 48 insertions(+), 139 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index efb05e105e..b7b3a928e7 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -2124,40 +2124,38 @@ Move_DRAGON_RUSH: blendoff end -Move_POWER_GEM: - createsprite gSimplePaletteBlendSpriteTemplate, 2, 5, 1, 1, 0, 7, 0 - waitforvisualfinish +Move_POWER_GEM: @ Copy of Hidden Power with background blackened loadspritegfx ANIM_TAG_POWER_GEM - playsewithpan 152, SOUND_PAN_ATTACKER - createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, 0, 0 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, 1, 1, 0, 7, RGB_BLACK waitforvisualfinish + playsewithpan SE_W036, SOUND_PAN_ATTACKER + createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0 + waitforvisualfinish delay 30 - createvisualtask AnimTask_BlendMonInAndOut 5, 5, 0, RGB(31, 31, 31), 12, 5, 1 - delay 4 - createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, 0, 0 + 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_W179, SOUND_PAN_ATTACKER - createsprite gPowerGemOrbSpriteTemplate 2, 2, 26, 0 - createsprite gPowerGemOrbSpriteTemplate 2, 2, 26, 42 - createsprite gPowerGemOrbSpriteTemplate 2, 2, 26, 84 - createsprite gPowerGemOrbSpriteTemplate 2, 2, 26, 126 - createsprite gPowerGemOrbSpriteTemplate 2, 2, 26, 168 - createsprite gPowerGemOrbSpriteTemplate 2, 2, 26, 210 + 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 + setarg 7, -1 playsewithpan SE_W115, SOUND_PAN_ATTACKER - createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, 0, 0 - createsprite gPowerGemScatterSpriteTemplate 130, 1, 0 - createsprite gPowerGemScatterSpriteTemplate 130, 1, 32 - createsprite gPowerGemScatterSpriteTemplate 130, 1, 64 - createsprite gPowerGemScatterSpriteTemplate 130, 1, 96 - createsprite gPowerGemScatterSpriteTemplate 130, 1, 128 - createsprite gPowerGemScatterSpriteTemplate 130, 1, 160 - createsprite gPowerGemScatterSpriteTemplate 130, 1, SOUND_PAN_ATTACKER - createsprite gPowerGemScatterSpriteTemplate 130, 1, 224 - waitforvisualfinish - clearmonbg ANIM_DEF_PARTNER - createsprite gSimplePaletteBlendSpriteTemplate 2, 5, 1, 1, 7, 0, 0 - blendoff + 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: diff --git a/src/battle_anim_effects_2.c b/src/battle_anim_effects_2.c index dcbcced39d..83e0edf8e2 100755 --- a/src/battle_anim_effects_2.c +++ b/src/battle_anim_effects_2.c @@ -980,6 +980,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), diff --git a/src/rock.c b/src/rock.c index 24c93b9731..c904cfbab0 100644 --- a/src/rock.c +++ b/src/rock.c @@ -312,52 +312,6 @@ const struct SpriteTemplate gUnknown_08596CE0 = .callback = sub_80A8EE4, }; -const union AffineAnimCmd gPowerGemScatterAffineAnimCmd[] = -{ - AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0), - AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 1), - AFFINEANIMCMD_JUMP(1), -}; - -const union AffineAnimCmd *const gPowerGemScatterAffineAnims[] = -{ - gPowerGemScatterAffineAnimCmd, -}; - -const union AffineAnimCmd gPowerGemOrbAffineAnimCmd[] = -{ - AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0), - AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 1), - AFFINEANIMCMD_JUMP(1), -}; - -const union AffineAnimCmd *const gPowerGemOrbAffineAnims[] = -{ - gPowerGemOrbAffineAnimCmd, -}; - -const struct SpriteTemplate gPowerGemScatterSpriteTemplate = -{ - .tileTag = ANIM_TAG_POWER_GEM, - .paletteTag = ANIM_TAG_POWER_GEM, - .oam = &gOamData_AffineDouble_ObjNormal_16x16, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gPowerGemScatterAffineAnims, - .callback = AnimPowerGemScatter, -}; - -const struct SpriteTemplate gPowerGemOrbSpriteTemplate = -{ - .tileTag = ANIM_TAG_POWER_GEM, - .paletteTag = ANIM_TAG_POWER_GEM, - .oam = &gOamData_AffineNormal_ObjNormal_16x16, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gPowerGemOrbAffineAnims, - .callback = AnimPowerGemOrbitFast, -}; - const struct SpriteTemplate gStoneEdgeSpriteTemplate = { .tileTag = ANIM_TAG_STONE_EDGE, @@ -420,71 +374,6 @@ static void AnimStealthRockStep2(struct Sprite *sprite) DestroyAnimSprite(sprite); } -void AnimPowerGemScatter(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 = AnimPowerGemScatterStep; -} - -static void AnimPowerGemScatterStep(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); -} - -void AnimPowerGemOrbitFast(struct Sprite *sprite) -{ - sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); - sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); - sprite->affineAnimPaused = 1; - sprite->data[0] = gBattleAnimArgs[0]; - sprite->data[1] = gBattleAnimArgs[1]; - sprite->data[7] = GetBattlerSpriteSubpriority(gBattleAnimAttacker); - sprite->callback = AnimPowerGemOrbitFastStep; - sprite->callback(sprite); -} - -static void AnimPowerGemOrbitFastStep(struct Sprite *sprite) -{ - if (sprite->data[1] >= 64 && sprite->data[1] <= 191) - sprite->subpriority = sprite->data[7] + 1; - else - sprite->subpriority = sprite->data[7] - 1; - - sprite->pos2.x = Sin(sprite->data[1], sprite->data[2] >> 8); - sprite->pos2.y = Cos(sprite->data[1], sprite->data[3] >> 8); - sprite->data[1] = (sprite->data[1] + 9) & 0xFF; - switch (sprite->data[5]) - { - case 1: - sprite->data[2] -= 0x400; - sprite->data[3] -= 0x100; - if (++sprite->data[4] == sprite->data[0]) - { - sprite->data[5] = 2; - return; - } - break; - case 0: - sprite->data[2] += 0x400; - sprite->data[3] += 0x100; - if (++sprite->data[4] == sprite->data[0]) - { - sprite->data[4] = 0; - sprite->data[5] = 1; - } - break; - } - - if ((u16)gBattleAnimArgs[7] == 0xFFFF) - DestroyAnimSprite(sprite); -} - void sub_81109F0(struct Sprite *sprite) { if (gBattleAnimArgs[3] != 0) From a6bf1836531f70be0112e0aa9e69921637edc9e2 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 18 Jan 2020 20:33:46 +0100 Subject: [PATCH 466/667] Fix Aegi ability pop up sliding --- data/battle_scripts_1.s | 1 + 1 file changed, 1 insertion(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index cd244c3c65..7d1d3ca233 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5885,6 +5885,7 @@ BattleScript_MegaEvolution:: BattleScript_StanceChangeActivates:: pause 0x5 + copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUp printstring STRINGID_EMPTYSTRING3 waitmessage 0x1 From 4a5a84e5c74002e54f7d75056e5127a15955567b Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 19 Jan 2020 11:07:09 +0100 Subject: [PATCH 467/667] Facade AI fix; AI uses fake out more often --- data/battle_ai_scripts.s | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index ded37dc7d2..42fb84e058 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -2852,7 +2852,13 @@ AI_CV_Fly_TypesToEncourage: .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: @@ -2917,9 +2923,8 @@ AI_CV_Sandstorm_AbilityPlus: 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 From bd8d304c01e28e277e47dd7687e636a85954cb20 Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Sat, 8 Feb 2020 05:40:51 -0300 Subject: [PATCH 468/667] Spark is now Physical (#261) --- src/data/battle_moves.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index e59f7ac4b5..d8d55348ee 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -2938,7 +2938,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_SHEER_FORCE_BOOST, - .split = SPLIT_SPECIAL, + .split = SPLIT_PHYSICAL, }, [MOVE_FURY_CUTTER] = From 90442ffbc251b61a73db690c8266c875cfec8dac Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Sat, 8 Feb 2020 05:51:55 -0300 Subject: [PATCH 469/667] Battle config options (#243) * Option to use pre-GenVI critical hit multiplier. * Clarified the option that multiplies EXP by 1.5 for trainer battles. * Fixed code style. * Option to change Burn damage. * Option to change to Gen 7 paralysis drop. * Ordered settings. * Implemented review suggestions. --- include/constants/battle_config.h | 17 +++++++++++++---- src/battle_main.c | 2 +- src/battle_script_commands.c | 2 +- src/battle_util.c | 4 ++-- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 1480a9cf48..49a86c6489 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -45,16 +45,25 @@ #define GEN_6 3 #define GEN_7 4 +// Calculation settings #define B_CRIT_CHANCE GEN_6 // Chances of a critical hit landing. See atk04_critcalc. +#define B_CRIT_MULTIPLIER GEN_6 // Starting from gen6, critical hits multiply damage by 1.5 instead of 2. +#define B_EXP_CATCH GEN_6 // Starting from gen6, pokemon get experience from catching. +#define B_TRAINER_EXP_MULTIPLIER GEN_6 // Gen7 no longer gives a 1.5 multiplier to exp gain in trainer battles. +#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%. + +// Move settings #define B_FELL_STINGER_STAT_RAISE GEN_6 // Gen6 Atk+2, Gen7 Atk+3. +#define B_SOUND_SUBSTITUTE GEN_6 // Starting from gen6 sound moves bypass Substitute. + +// Ability settings +#define B_ABILITY_POP_UP GEN_6 // Starting from gen5, the pokemon abilities are displayed in a pop-up, when they activate in battle. #define B_ABILITY_WEATHER GEN_6 // Up to gen5 - weather induced by abilities such as Drought or Drizzle lasted till the battle's end or weather change by a move. From Gen6 onwards, weather caused by abilities lasts the same amount of turns as induced from a move. #define B_GALE_WINGS GEN_6 // Gen7 requires full hp. -#define B_SOUND_SUBSTITUTE GEN_6 // Starting from gen6 sound moves bypass Substitute. -#define B_EXP_CATCH GEN_6 // Starting from gen6, pokemon get experience from catching. -#define B_ABILITY_POP_UP GEN_6 // Starting from gen5, the pokemon abilities are displayed in a pop-up, when they activate in battle. #define B_STANCE_CHANGE_FAIL GEN_7 // In Gen7, Aegislash's form change does not happen, if the pokemon cannot use a move, because of confusion, paralysis, etc. In gen6, the form change occurs despite not being able to move. -#define B_TRAINER_BATTLE_MULTIPLIER GEN_6 // Gen7 no longer gives a 1.5 multiplier to exp gain. +// Other #define B_FAST_INTRO TRUE // If set to TRUE, battle intro texts print at the same time as animation of a pokemon, as opposing to waiting for the animation to end. #endif // GUARD_CONSTANTS_BATTLE_CONFIG_H diff --git a/src/battle_main.c b/src/battle_main.c index 097828c788..9840a56ac4 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4314,7 +4314,7 @@ u32 GetBattlerTotalSpeedStat(u8 battlerId) // paralysis drop if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS && ability != ABILITY_QUICK_FEET) - speed /= 4; + speed /= (B_PARALYSIS_SPEED >= GEN_7 ? 2 : 4); return speed; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 160d110db9..d223f1053b 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3507,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 && B_TRAINER_BATTLE_MULTIPLIER != GEN_7) + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && B_TRAINER_EXP_MULTIPLIER != GEN_7) gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; if (IsTradedMon(&gPlayerParty[gBattleStruct->expGetterMonId])) diff --git a/src/battle_util.c b/src/battle_util.c index cf69e381b8..a432da9046 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1519,7 +1519,7 @@ u8 DoBattlerEndTurnEffects(void) && gBattleMons[gActiveBattler].hp != 0 && ability != ABILITY_MAGIC_GUARD) { - gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; + gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8); if (ability == ABILITY_HEATPROOF) gBattleMoveDamage /= 2; if (gBattleMoveDamage == 0) @@ -5859,7 +5859,7 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move // check crit if (isCrit) - dmg = ApplyModifier(UQ_4_12(1.5), dmg); + 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) From 41f0c0acb57f6d1ec239c2c259fcc1be915425e7 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 8 Feb 2020 10:39:22 +0100 Subject: [PATCH 470/667] Sort out ohko moves --- src/battle_script_commands.c | 60 +++++++++++++++--------------------- 1 file changed, 24 insertions(+), 36 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d223f1053b..8cd30afaf1 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8854,66 +8854,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; From afe96552afd6ccb21a8311acfef476b648ecf8b6 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 8 Feb 2020 11:01:39 +0100 Subject: [PATCH 471/667] Fix Unnerve string --- src/battle_message.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_message.c b/src/battle_message.c index 52890b4654..ce6f67b154 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -592,7 +592,7 @@ static const u8 sText_ForewarnActivates[] = _("{B_ATK_ABILITY} alerted the {B_AT 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[] = _("{B_ATK_NAME_WITH_PREFIX} is too nervous to eat Berries!"); +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!"); From 6d39eb882655bb019d51d1b7ca8f91625782885e Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sat, 8 Feb 2020 07:41:44 -0300 Subject: [PATCH 472/667] Fixed Charge Beam's animation. (#252) --- data/battle_anim_scripts.s | 100 ++++++++++++++++++------------------- 1 file changed, 49 insertions(+), 51 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index b7b3a928e7..0c93094a77 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -3429,58 +3429,56 @@ Move_BUG_BITE: end Move_CHARGE_BEAM: - loadspritegfx ANIM_TAG_IMPACT - loadspritegfx ANIM_TAG_SPARK_2 - delay 0 - createvisualtask sub_8115A04, 2, 3, -31, 1, 5, 5, RGB(31, 31, 20) - playsewithpan SE_W085B, SOUND_PAN_ATTACKER - createsprite gBattleAnimSpriteTemplate_859574C, 0, 7, 32, 24, 190, 12, 0, 1, 0 - delay 0 - createsprite gBattleAnimSpriteTemplate_859574C, 0, 7, 80, 24, 22, 12, 0, 1, 0 - createsprite gBattleAnimSpriteTemplate_859574C, 0, 7, 156, 24, 121, 13, 0, 1, 1 - delay 0 - createvisualtask sub_8115A04, 2, 3, -31, 1, 0, 0, RGB(31, 31, 20) - delay 10 - createvisualtask sub_8115A04, 2, 3, -31, 1, 5, 5, RGB(31, 31, 20) - playsewithpan SE_W085B, SOUND_PAN_ATTACKER - createsprite gBattleAnimSpriteTemplate_859574C, 0, 7, 100, 24, 60, 10, 0, 1, 0 - createsprite gBattleAnimSpriteTemplate_859574C, 0, 7, 170, 24, 42, 11, 0, 1, 1 - delay 0 - createsprite gBattleAnimSpriteTemplate_859574C, 0, 7, 238, 24, 165, 10, 0, 1, 1 - delay 0 - createvisualtask sub_8115A04, 2, 3, -31, 1, 0, 0, RGB(31, 31, 20) - delay 20 - playsewithpan SE_W085B, SOUND_PAN_ATTACKER - createsprite gBattleAnimSpriteTemplate_85957F8, 4, 8, 0, 0, 32, 12, 0, 20, 0, 0 - createsprite gBattleAnimSpriteTemplate_85957F8, 4, 8, 0, 0, 32, 12, 64, 20, 1, 0 - createsprite gBattleAnimSpriteTemplate_85957F8, 4, 8, 0, 0, 32, 12, 128, 20, 0, 0 - createsprite gBattleAnimSpriteTemplate_85957F8, 4, 8, 0, 0, 32, 12, SOUND_PAN_ATTACKER, 20, 2, 0 - createsprite gBattleAnimSpriteTemplate_85957F8, 4, 8, 0, 0, 16, 12, 32, 20, 0, 0 - createsprite gBattleAnimSpriteTemplate_85957F8, 4, 8, 0, 0, 16, 12, 96, 20, 1, 0 - createsprite gBattleAnimSpriteTemplate_85957F8, 4, 8, 0, 0, 16, 12, 160, 20, 0, 0 - createsprite gBattleAnimSpriteTemplate_85957F8, 4, 8, 0, 0, 16, 12, 224, 20, 2, 0 + loadspritegfx ANIM_TAG_BLACK_BALL_2 + loadspritegfx ANIM_TAG_SPARK_2 + delay 0 + createvisualtask sub_8115A04, 2, 3, -31, 1, 5, 5, RGB(31, 31, 22) + playsewithpan SE_W085B, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_859574C, ANIM_ATTACKER, 0, 32, 24, 190, 12, 0, 1, 0 + delay 0 + createsprite gBattleAnimSpriteTemplate_859574C, ANIM_ATTACKER, 0, 80, 24, 22, 12, 0, 1, 0 + createsprite gBattleAnimSpriteTemplate_859574C, ANIM_ATTACKER, 0, 156, 24, 121, 13, 0, 1, 1 + delay 0 + createvisualtask sub_8115A04, 2, 3, -31, 1, 0, 0, RGB(31, 31, 22) + delay 10 + createvisualtask sub_8115A04, 2, 3, -31, 1, 5, 5, RGB(31, 31, 22) + playsewithpan SE_W085B, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_859574C, ANIM_ATTACKER, 0, 100, 24, 60, 10, 0, 1, 0 + createsprite gBattleAnimSpriteTemplate_859574C, ANIM_ATTACKER, 0, 170, 24, 42, 11, 0, 1, 1 + delay 0 + createsprite gBattleAnimSpriteTemplate_859574C, ANIM_ATTACKER, 0, 238, 24, 165, 10, 0, 1, 1 + delay 0 + createvisualtask sub_8115A04, 2, 3, -31, 1, 0, 0, RGB(31, 31, 22) + delay 20 + createvisualtask sub_8115A04, 2, 3, -31, 1, 7, 7, RGB(31, 31, 22) + playsewithpan SE_W085B, SOUND_PAN_ATTACKER + createsprite gBattleAnimSpriteTemplate_85957F8, ANIM_ATTACKER, 4, 0, 0, 32, 12, 0, 20, 0, 0 + createsprite gBattleAnimSpriteTemplate_85957F8, ANIM_ATTACKER, 4, 0, 0, 32, 12, 64, 20, 1, 0 + createsprite gBattleAnimSpriteTemplate_85957F8, ANIM_ATTACKER, 4, 0, 0, 32, 12, 128, 20, 0, 0 + createsprite gBattleAnimSpriteTemplate_85957F8, ANIM_ATTACKER, 4, 0, 0, 32, 12, 192, 20, 2, 0 + createsprite gBattleAnimSpriteTemplate_85957F8, ANIM_ATTACKER, 4, 0, 0, 16, 12, 32, 20, 0, 0 + createsprite gBattleAnimSpriteTemplate_85957F8, ANIM_ATTACKER, 4, 0, 0, 16, 12, 96, 20, 1, 0 + createsprite gBattleAnimSpriteTemplate_85957F8, ANIM_ATTACKER, 4, 0, 0, 16, 12, 160, 20, 0, 0 + createsprite gBattleAnimSpriteTemplate_85957F8, ANIM_ATTACKER, 4, 0, 0, 16, 12, 224, 20, 2, 0 delay 4 - waitforvisualfinish - createvisualtask sub_8115A04, 2, 3, -31, 1, 0, 0, RGB(31, 31, 20) - waitforvisualfinish - loadspritegfx ANIM_TAG_BLACK_BALL_2 - loadspritegfx ANIM_TAG_SPARK_2 - playsewithpan SE_W086, SOUND_PAN_ATTACKER - createsprite gUnknown_08595764, 131, 6, 10, 0, 0, 0, 30, 0 - createsprite gUnknown_08595790, 132, 7, 10, 0, 16, 30, 0, 40, 0 - createsprite gUnknown_08595790, 132, 7, 10, 0, 16, 30, 64, 40, 1 - createsprite gUnknown_08595790, 132, 7, 10, 0, 16, 30, 128, 40, 0 - createsprite gUnknown_08595790, 132, 7, 10, 0, 16, 30, SOUND_PAN_ATTACKER, 40, 2 - createsprite gUnknown_08595790, 132, 7, 10, 0, 8, 30, 32, 40, 0 - createsprite gUnknown_08595790, 132, 7, 10, 0, 8, 30, 96, 40, 1 - createsprite gUnknown_08595790, 132, 7, 10, 0, 8, 30, 160, 40, 0 - createsprite gUnknown_08595790, 132, 7, 10, 0, 8, 30, 224, 40, 2 - waitforvisualfinish - createvisualtask AnimTask_ShakeMon2, 2, 5, 1, 4, 0, 5, 1 - delay 15 - waitplaysewithpan SE_W085B, SOUND_PAN_TARGET 19 - call ElectricityEffect - waitforvisualfinish + waitforvisualfinish + createvisualtask sub_8115A04, 2, 3, -31, 1, 0, 0, RGB(31, 31, 22) + playsewithpan SE_W086, SOUND_PAN_ATTACKER + createsprite gUnknown_08595764, ANIM_TARGET, 3, 10, 0, 0, 0, 30, 0 + createsprite gUnknown_08595790, ANIM_TARGET, 4, 10, 0, 16, 30, 0, 40, 0 + createsprite gUnknown_08595790, ANIM_TARGET, 4, 10, 0, 16, 30, 64, 40, 1 + createsprite gUnknown_08595790, ANIM_TARGET, 4, 10, 0, 16, 30, 128, 40, 0 + createsprite gUnknown_08595790, ANIM_TARGET, 4, 10, 0, 16, 30, 192, 40, 2 + createsprite gUnknown_08595790, ANIM_TARGET, 4, 10, 0, 8, 30, 32, 40, 0 + createsprite gUnknown_08595790, ANIM_TARGET, 4, 10, 0, 8, 30, 96, 40, 1 + createsprite gUnknown_08595790, ANIM_TARGET, 4, 10, 0, 8, 30, 160, 40, 0 + createsprite gUnknown_08595790, 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_W085B, SOUND_PAN_TARGET, 19 + call ElectricityEffect + waitforvisualfinish end Move_WOOD_HAMMER: From e7d5ebb3b652173f0da69f06a4df0e3fc2f62ab3 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 8 Feb 2020 11:55:16 +0100 Subject: [PATCH 473/667] Make Charge raise sp.def --- data/battle_scripts_1.s | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 7d1d3ca233..825a1a93cf 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4200,6 +4200,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 From c9774f6e2533410bcc52abc3ecb0c65e60369163 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 8 Feb 2020 12:09:38 +0100 Subject: [PATCH 474/667] Transformed Aegi cannot change forms --- src/battle_script_commands.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 8cd30afaf1..e101e82bef 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -972,7 +972,9 @@ static bool32 NoTargetPresent(u32 move) static bool32 TryAegiFormChange(void) { - if (GetBattlerAbility(gBattlerAttacker) != ABILITY_STANCE_CHANGE) + // 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) From 97eaf8b559512a62e08281d1dc724c76146493d2 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 8 Feb 2020 12:22:10 +0100 Subject: [PATCH 475/667] Fix Shadow Claw anim --- data/battle_anim_scripts.s | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 0c93094a77..1fa15d7078 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -2533,28 +2533,29 @@ Move_ICE_SHARD: end Move_SHADOW_CLAW: - createsprite gSimplePaletteBlendSpriteTemplate 2, 5, 1, 1, 0, 7, 0 - waitforvisualfinish 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 2, 2, 6, 4 + createsprite gHorizontalLungeSpriteTemplate ANIM_ATTACKER, 2, 6, 4 delay 4 - createvisualtask AnimTask_ShakeMon2 2, 5, 1, 2, 0, 18, 1 - createsprite gBattleAnimSpriteTemplate_8597138, 130, 3, -10, -10, 0 - createsprite gBattleAnimSpriteTemplate_8597138, 130, 3, -10, 10, 0 - playsewithpan 136, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon2 2, ANIM_TARGET, 2, 0, 18, 1 + createsprite gBattleAnimSpriteTemplate_8597138, ANIM_TARGET, 2, -10, -10, 0 + createsprite gBattleAnimSpriteTemplate_8597138, ANIM_TARGET, 2, -10, 10, 0 + playsewithpan SE_W013, SOUND_PAN_TARGET delay 12, - createsprite gBattleAnimSpriteTemplate_8597138, 130, 3, 10, -10, 1 - createsprite gBattleAnimSpriteTemplate_8597138, 130, 3, 10, 10, 1 - playsewithpan 136, SOUND_PAN_TARGET + createsprite gBattleAnimSpriteTemplate_8597138, ANIM_TARGET, 2, 10, -10, 1 + createsprite gBattleAnimSpriteTemplate_8597138, ANIM_TARGET, 2, 10, 10, 1 + playsewithpan SE_W013, SOUND_PAN_TARGET waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate 2, 5, 1, 1, 7, 0, 0 + restorebg + waitbgfadein waitforvisualfinish - clearmonbg ANIM_DEF_PARTNER blendoff + clearmonbg ANIM_TARGET end Move_THUNDER_FANG: From 14bc2f65f35e9f4df80aa9819282b5d631bb3763 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 8 Feb 2020 14:20:02 +0100 Subject: [PATCH 476/667] Fix AI trying to switch when it can't, also ghosts can escape --- include/battle_util.h | 1 + include/constants/battle_config.h | 1 + src/battle_ai_script_commands.c | 63 ++++++++++++++++--------------- src/battle_ai_switch_items.c | 26 ++++--------- src/battle_main.c | 38 ++----------------- src/battle_util.c | 18 +++++++++ src/pokemon.c | 2 +- 7 files changed, 66 insertions(+), 83 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index b7d572c790..92d798f7b2 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -81,6 +81,7 @@ 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); void BattleScriptExecute(const u8* BS_ptr); void BattleScriptPushCursorAndCallback(const u8* BS_ptr); u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn); diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 49a86c6489..a5a9c82067 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -62,6 +62,7 @@ #define B_ABILITY_WEATHER GEN_6 // Up to gen5 - weather induced by abilities such as Drought or Drizzle lasted till the battle's end or weather change by a move. From Gen6 onwards, weather caused by abilities lasts the same amount of turns as induced from a move. #define B_GALE_WINGS GEN_6 // Gen7 requires full hp. #define B_STANCE_CHANGE_FAIL GEN_7 // In Gen7, Aegislash's form change does not happen, if the pokemon 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 // From Gen6 onwards, ghosts can escape even when blocked by abilities such as Shadow Tag. // Other #define B_FAST_INTRO TRUE // If set to TRUE, battle intro texts print at the same time as animation of a pokemon, as opposing to waiting for the animation to end. diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 4b3b008036..adcd0f2349 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -494,41 +494,44 @@ static u8 ChooseMoveOrAction_Singles(void) return AI_CHOICE_WATCH; gActiveBattler = sBattler_AI; - // Consider switching if all moves are worthless to use. - if (AI_THINKING_STRUCT->aiFlags & (AI_SCRIPT_CHECK_VIABILITY | AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_PREFER_BATON_PASS) - && CountUsablePartyMons(sBattler_AI) >= 1 - && GetTotalBaseStat(gBattleMons[sBattler_AI].species) >= 310 // Mon is not weak. - && gBattleMons[sBattler_AI].hp >= gBattleMons[sBattler_AI].maxHP / 2 - && !(gBattleTypeFlags & BATTLE_TYPE_PALACE)) + // 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)) { - s32 cap = AI_THINKING_STRUCT->aiFlags & (AI_SCRIPT_CHECK_VIABILITY) ? 95 : 93; - - for (i = 0; i < MAX_MON_MOVES; i++) + // 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) { - if (AI_THINKING_STRUCT->score[i] > cap) - break; + 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; + } } - if (i == MAX_MON_MOVES && GetMostSuitableMonToSwitchInto() != PARTY_SIZE) + // 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) { - 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 - && AI_THINKING_STRUCT->aiFlags & (AI_SCRIPT_CHECK_VIABILITY) - && gBattleMons[sBattler_AI].hp >= gBattleMons[sBattler_AI].maxHP / 2 - && CountUsablePartyMons(sBattler_AI) >= 1) - { - if (GetMostSuitableMonToSwitchInto() != PARTY_SIZE) - { - AI_THINKING_STRUCT->switchMon = TRUE; - return AI_CHOICE_SWITCH; + if (GetMostSuitableMonToSwitchInto() != PARTY_SIZE) + { + AI_THINKING_STRUCT->switchMon = TRUE; + return AI_CHOICE_SWITCH; + } } } diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 77b1685d4e..2eaf0e2e3c 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -420,44 +420,34 @@ static bool8 FindMonWithFlagsAndSuperEffective(u16 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 (IsAbilityOnOpposingSide(gActiveBattler, ABILITY_SHADOW_TAG)) + if (IsAbilityPreventingEscape(gActiveBattler)) return FALSE; - if (IsAbilityOnOpposingSide(gActiveBattler, ABILITY_ARENA_TRAP)) // Misses the flying type and Levitate check. - return FALSE; - if (IsAbilityOnField(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; } GetAIPartyIndexes(gActiveBattler, &firstId, &lastId); diff --git a/src/battle_main.c b/src/battle_main.c index 9840a56ac4..1bd31360d8 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3652,9 +3652,7 @@ void BattleTurnPassed(void) u8 IsRunningFromBattleImpossible(void) { - u8 holdEffect; - u8 side; - s32 i; + u32 holdEffect, i; if (gBattleMons[gActiveBattler].item == ITEM_ENIGMA_BERRY) holdEffect = gEnigmaBerries[gActiveBattler].holdEffect; @@ -3681,37 +3679,14 @@ u8 IsRunningFromBattleImpossible(void) 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 = IsAbilityOnFieldExcept(gActiveBattler, ABILITY_MAGNET_PULL); - 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)) { @@ -3895,12 +3870,7 @@ static void HandleTurnActionSelectionState(void) { BtlController_EmitChoosePokemon(0, PARTY_ACTION_CANT_SWITCH, PARTY_SIZE, ABILITY_NONE, gBattleStruct->field_60[gActiveBattler]); } - else if ((i = IsAbilityOnOpposingSide(gActiveBattler, ABILITY_SHADOW_TAG)) - || ((i = IsAbilityOnOpposingSide(gActiveBattler, ABILITY_ARENA_TRAP)) - && !IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_FLYING) - && gBattleMons[gActiveBattler].ability != ABILITY_LEVITATE) - || ((i = IsAbilityOnFieldExcept(gActiveBattler, ABILITY_MAGNET_PULL)) - && 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]); } diff --git a/src/battle_util.c b/src/battle_util.c index a432da9046..cbcca73d7e 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -23,6 +23,7 @@ #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" @@ -3801,6 +3802,23 @@ u32 IsAbilityOnFieldExcept(u32 battlerId, u32 ability) 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; +} + void BattleScriptExecute(const u8 *BS_ptr) { gBattlescriptCurrInstr = BS_ptr; diff --git a/src/pokemon.c b/src/pokemon.c index 6ea0d3337f..2c0bd2fc05 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -5510,7 +5510,7 @@ void AdjustFriendship(struct Pokemon *mon, u8 event) if (friendship > 199) friendshipLevel++; - if ((event != FRIENDSHIP_EVENT_WALKING || !(Random() & 1)) + if ((event != FRIENDSHIP_EVENT_WALKING || !(Random() & 1)) && (event != FRIENDSHIP_EVENT_LEAGUE_BATTLE || IS_LEAGUE_BATTLE)) { s8 mod = sFriendshipEventModifiers[event][friendshipLevel]; From 33e8e20118f21252d08911e2d06a0d0b2e9bd5b3 Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Sat, 8 Feb 2020 15:29:51 -0300 Subject: [PATCH 477/667] Disguise ability (#258) * Protection from attacks. * Changes form when Busting Disguise. * Ability changing moves set to fail. - Simple Beam and Worry Seed now fail if the target has Disguise. - Role Play and Skill Swap now fail if either the attacker or the target have Disguise. * Disguise no longer triggers when transformed. * Mimikyu reverts to Disguised * No longer blocks from entry hazards and weather. * Applied review changes * Oops, new line * yeah --- data/battle_scripts_1.s | 13 +++++ include/battle_script_commands.h | 1 + include/battle_scripts.h | 1 + include/constants/battle_config.h | 2 + src/battle_script_commands.c | 83 +++++++++++++++++++++---------- src/battle_util.c | 1 + 6 files changed, 74 insertions(+), 27 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 825a1a93cf..b13b67a5b7 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5903,6 +5903,19 @@ BattleScript_StanceChangeActivates:: waitanimation handleformchange BS_ATTACKER, 2 return + +BattleScript_DisguiseBustedActivates:: + 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 diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index 8bd94150ab..ab2217712c 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -14,6 +14,7 @@ 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 CanUseLastResort(u8 battlerId); u32 IsFlowerVeilProtected(u32 battler); u32 IsLeafGuardProtected(u32 battler); diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 824b96548f..93f4e3b099 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -329,5 +329,6 @@ extern const u8 BattleScript_IllusionOff[]; extern const u8 BattleScript_DancerActivates[]; extern const u8 BattleScript_AftermathDmg[]; extern const u8 BattleScript_StanceChangeActivates[]; +extern const u8 BattleScript_DisguiseBustedActivates[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index a5a9c82067..2f025053df 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -11,6 +11,8 @@ #define SPECIES_GENESECT 0 #define SPECIES_AEGISLASH 0 #define SPECIES_AEGISLASH_BLADE 10000 +#define SPECIES_MIMIKYU 0 +#define SPECIES_MIMIKYU_BUSTED 10001 // Items with peculiar battle effects. Remove them if they're properly placed in constant/items.h #define ITEM_GRISEOUS_ORB 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e101e82bef..0c5cf53740 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1532,6 +1532,8 @@ static void Cmd_adjustdamage(void) if (DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) goto END; + if (DoesDisguiseBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) + goto END; if (gBattleMons[gBattlerTarget].hp > gBattleMoveDamage) goto END; @@ -1709,17 +1711,9 @@ static void Cmd_healthbarupdate(void) { 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); @@ -1774,6 +1768,12 @@ static void Cmd_datahpupdate(void) return; } } + else if (DoesDisguiseBlockMove(gBattlerAttacker, gActiveBattler, gCurrentMove)) + { + gBattleMons[gActiveBattler].species = SPECIES_MIMIKYU_BUSTED; + BattleScriptPush(gBattlescriptCurrInstr + 2); + gBattlescriptCurrInstr = BattleScript_DisguiseBustedActivates; + } else { gHitMarker &= ~(HITMARKER_IGNORE_SUBSTITUTE); @@ -7132,6 +7132,7 @@ static void Cmd_various(void) case ABILITY_SIMPLE: case ABILITY_TRUANT: case ABILITY_STANCE_CHANGE: + case ABILITY_DISGUISE: case ABILITY_MULTITYPE: gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); break; @@ -10570,16 +10571,18 @@ static void Cmd_tryswapitems(void) // trick 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; } } @@ -10718,14 +10721,28 @@ static void Cmd_setroom(void) 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; @@ -11133,6 +11150,17 @@ bool32 DoesSubstituteBlockMove(u8 battlerAtk, u8 battlerDef, u32 move) return TRUE; } +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)) @@ -11740,6 +11768,7 @@ static void Cmd_tryworryseed(void) case ABILITY_MULTITYPE: case ABILITY_TRUANT: case ABILITY_STANCE_CHANGE: + case ABILITY_DISGUISE: gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); break; default: diff --git a/src/battle_util.c b/src/battle_util.c index cbcca73d7e..964fd01fb9 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6314,6 +6314,7 @@ void UndoFormChange(u32 monId, u32 side) static const u16 species[][2] = // changed form id, default form id { {SPECIES_AEGISLASH_BLADE, SPECIES_AEGISLASH}, + {SPECIES_MIMIKYU_BUSTED, SPECIES_MIMIKYU}, }; currSpecies = GetMonData(&party[monId], MON_DATA_SPECIES, NULL); From 360665fac850190ae0c4e534262f55807af96db1 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 9 Feb 2020 11:02:22 +0100 Subject: [PATCH 478/667] Fix ability preventing escape string --- src/battle_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_main.c b/src/battle_main.c index 1bd31360d8..ff493cc3f3 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3872,7 +3872,7 @@ static void HandleTurnActionSelectionState(void) } 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 { From 0bccf91f1a0a933e5a606bef0538e6dc93aafd7c Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sun, 16 Feb 2020 09:14:18 -0300 Subject: [PATCH 479/667] Cleaned up the transition of many battlescripts in battle_scripts_1.s (#273) --- data/battle_scripts_1.s | 368 ++++++++++++++++++++-------------------- 1 file changed, 184 insertions(+), 184 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index b13b67a5b7..f73bbfc938 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -355,20 +355,20 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectGearUp .4byte BattleScript_EffectIncinerate .4byte BattleScript_EffectBugBite - + 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 @@ -395,11 +395,11 @@ BattleScript_EffectLaserFocus: 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 @@ -426,7 +426,7 @@ BattleScript_VCreateTrySpeed: waitmessage 0x40 BattleScript_VCreateStatLossRet: return - + BattleScript_SpectralThiefSteal:: printstring STRINGID_SPECTRALTHIEFSTEAL waitmessage 0x40 @@ -434,11 +434,11 @@ BattleScript_SpectralThiefSteal:: 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 @@ -479,11 +479,11 @@ BattleScript_EffectPartingShotSwitch: 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 @@ -496,7 +496,7 @@ BattleScript_EffectPowder: printstring STRINGID_COVEREDINPOWDER waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectAromaticMist: attackcanceler attackstring @@ -521,7 +521,7 @@ BattleScript_AromaticMistAnim: waitmessage 0x40 BattleScript_EffectAromaticMistEnd: goto BattleScript_MoveEnd - + BattleScript_EffectMagneticFlux:: attackcanceler attackstring @@ -616,16 +616,16 @@ BattleScript_EffectAcupressureTry: 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 @@ -637,11 +637,11 @@ BattleScript_EffectThirdType: 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 @@ -676,7 +676,7 @@ BattleScript_FlowerShieldMoveTargetEnd: moveendto MOVEEND_NEXT_TARGET jumpifnexttargetvalid BattleScript_FlowerShieldLoop end - + BattleScript_EffectRototiller: attackcanceler attackstring @@ -718,7 +718,7 @@ BattleScript_RototillerCantRaiseMultipleStats: printstring STRINGID_STATSWONTINCREASE2 waitmessage 0x40 goto BattleScript_RototillerMoveTargetEnd - + BattleScript_EffectBestow: attackcanceler accuracycheck BattleScript_PrintMoveMissed, NO_ACC_CALC_CHECK_LOCK_ON @@ -731,7 +731,7 @@ BattleScript_EffectBestow: printstring STRINGID_BESTOWITEMGIVING waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectAfterYou: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -743,11 +743,11 @@ BattleScript_EffectAfterYou: 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 @@ -759,7 +759,7 @@ BattleScript_MoveEffectFlameBurst:: tryfaintmon BS_TARGET, FALSE, NULL restoretarget goto BattleScript_MoveEnd - + BattleScript_EffectPowerTrick: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -771,7 +771,7 @@ BattleScript_EffectPowerTrick: printstring STRINGID_PKMNSWITCHEDATKANDDEF waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectPsychoShift: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -795,7 +795,7 @@ BattleScript_EffectPsychoShiftCanWork: waitmessage 0x40 updatestatusicon BS_ATTACKER goto BattleScript_MoveEnd - + BattleScript_EffectSynchronoise: attackcanceler attackstring @@ -836,20 +836,20 @@ BattleScript_SynchronoiseNoEffect: 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 @@ -909,7 +909,7 @@ BattleScript_EffectInstruct: setbyte sB_ANIM_TURN, 0x0 setbyte sB_ANIM_TARGETS_HIT, 0x0 jumptocalledmove TRUE - + BattleScript_EffectAutonomize: setstatchanger STAT_SPEED, 2, FALSE attackcanceler @@ -934,7 +934,7 @@ BattleScript_AutonomizeWeightLoss:: printstring STRINGID_BECAMENIMBLE waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectFinalGambit: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -963,7 +963,7 @@ BattleScript_EffectFinalGambit: datahpupdate BS_ATTACKER tryfaintmon BS_ATTACKER, FALSE, NULL goto BattleScript_MoveEnd - + BattleScript_EffectHitSwitchTarget: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -990,11 +990,11 @@ BattleScript_EffectHitSwitchTarget: BattleScript_EffectHitSwitchTargetMoveEnd: moveendall end - + BattleScript_EffectClearSmog: setmoveeffect MOVE_EFFECT_CLEAR_SMOG goto BattleScript_EffectHit - + BattleScript_EffectToxicThread: setstatchanger STAT_SPEED, 2, TRUE attackcanceler @@ -1022,7 +1022,7 @@ BattleScript_ToxicThreadTryPsn:: setmoveeffect MOVE_EFFECT_POISON seteffectprimary goto BattleScript_MoveEnd - + BattleScript_EffectVenomDrench: attackcanceler attackstring @@ -1061,7 +1061,7 @@ BattleScript_VenomDrenchTryLowerSpeed:: waitmessage 0x40 BattleScript_VenomDrenchEnd:: goto BattleScript_MoveEnd - + BattleScript_EffectNobleRoar: attackcanceler attackstring @@ -1089,7 +1089,7 @@ BattleScript_NobleRoarTryLowerSpAtk:: waitmessage 0x40 BattleScript_NobleRoarEnd:: goto BattleScript_MoveEnd - + BattleScript_EffectShellSmash: attackcanceler attackstring @@ -1137,7 +1137,7 @@ BattleScript_ShellSmashTrySpeed: waitmessage 0x40 BattleScript_ShellSmashEnd: goto BattleScript_MoveEnd - + BattleScript_EffectLastResort: attackcanceler attackstring @@ -1145,7 +1145,7 @@ BattleScript_EffectLastResort: jumpifcantuselastresort BS_ATTACKER, BattleScript_ButItFailed accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE goto BattleScript_HitFromCritCalc - + BattleScript_EffectGrowth: attackcanceler attackstring @@ -1180,7 +1180,7 @@ BattleScript_GrowthSpAtk: waitmessage 0x40 BattleScript_GrowthEnd: goto BattleScript_MoveEnd - + BattleScript_EffectSoak: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -1195,7 +1195,7 @@ BattleScript_EffectSoak: printstring STRINGID_TRANSFORMEDINTOWATERTYPE waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectReflectType: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -1207,7 +1207,7 @@ BattleScript_EffectReflectType: printstring STRINGID_REFLECTTARGETSTYPE waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectElectrify: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -1219,7 +1219,7 @@ BattleScript_EffectElectrify: printstring STRINGID_TARGETELECTRIFIED waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectShiftGear: attackcanceler attackstring @@ -1250,7 +1250,7 @@ BattleScript_ShiftGearTryAtk: waitmessage 0x40 BattleScript_ShiftGearEnd: goto BattleScript_MoveEnd - + BattleScript_EffectCoil: attackcanceler attackstring @@ -1282,7 +1282,7 @@ BattleScript_CoilTryAcc: waitmessage 0x40 BattleScript_CoilEnd: goto BattleScript_MoveEnd - + BattleScript_EffectQuiverDance: attackcanceler attackstring @@ -1314,11 +1314,11 @@ BattleScript_QuiverDanceTrySpeed:: 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 @@ -1328,7 +1328,7 @@ BattleScript_EffectMeFirst: setbyte sB_ANIM_TURN, 0x0 setbyte sB_ANIM_TARGETS_HIT, 0x0 jumptocalledmove TRUE - + BattleScript_EffectAttackSpAttackUp: attackcanceler attackstring @@ -1353,7 +1353,7 @@ BattleScript_AttackSpAttackUpTrySpAtk:: waitmessage 0x40 BattleScript_AttackSpAttackUpEnd: goto BattleScript_MoveEnd - + BattleScript_EffectAttackAccUp: attackcanceler attackstring @@ -1392,7 +1392,7 @@ BattleScript_EffectPsychicTerrain: printfromtable gTerrainStringIds waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectTopsyTurvy: attackcanceler attackstring @@ -1412,7 +1412,7 @@ BattleScript_EffectTopsyTurvyWorks: printstring STRINGID_TOPSYTURVYSWITCHEDSTATS waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectIonDeluge: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -1424,7 +1424,7 @@ BattleScript_EffectIonDeluge: printstring STRINGID_IONDELUGEON waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectQuash: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -1436,7 +1436,7 @@ BattleScript_EffectQuash: printstring STRINGID_QUASHSUCCESS waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectHealPulse: attackcanceler attackstring @@ -1451,7 +1451,7 @@ BattleScript_EffectHealPulse: printstring STRINGID_PKMNREGAINEDHEALTH waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectEntrainment: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -1464,7 +1464,7 @@ BattleScript_EffectEntrainment: printstring STRINGID_PKMNACQUIREDABILITY waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectSimpleBeam: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -1476,13 +1476,13 @@ BattleScript_EffectSimpleBeam: 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 @@ -1493,7 +1493,7 @@ BattleScript_EffectLuckyChant: printstring STRINGID_SHIELDEDFROMCRITICALHITS waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectMetalBurst: attackcanceler metalburstdamagecalculator BattleScript_ButItFailedAtkStringPpReduce @@ -1504,7 +1504,7 @@ BattleScript_EffectMetalBurst: bichalfword gMoveResultFlags, MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE adjustdamage goto BattleScript_HitFromAtkAnimation - + BattleScript_EffectHealingWish: attackcanceler attackstring @@ -1549,7 +1549,7 @@ BattleScript_EffectHealingWishNewMon: BattleScript_EffectHealingWishEnd: moveendall end - + BattleScript_EffectWorrySeed: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -1561,7 +1561,7 @@ BattleScript_EffectWorrySeed: printstring STRINGID_PKMNACQUIREDABILITY waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectPowerSplit: attackcanceler attackstring @@ -1574,7 +1574,7 @@ BattleScript_EffectPowerSplit: printstring STRINGID_SHAREDITSPOWER waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectGuardSplit: attackcanceler attackstring @@ -1587,7 +1587,7 @@ BattleScript_EffectGuardSplit: printstring STRINGID_SHAREDITSGUARD waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectHeartSwap: attackcanceler attackstring @@ -1618,7 +1618,7 @@ BattleScript_EffectPowerSwap: printstring STRINGID_PKMNSWITCHEDSTATCHANGES waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectGuardSwap: attackcanceler attackstring @@ -1631,7 +1631,7 @@ BattleScript_EffectGuardSwap: printstring STRINGID_PKMNSWITCHEDSTATCHANGES waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectSpeedSwap: attackcanceler attackstring @@ -1643,7 +1643,7 @@ BattleScript_EffectSpeedSwap: printstring STRINGID_PKMNSWITCHEDSTATCHANGES waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectTelekinesis: attackcanceler accuracycheck BattleScript_PrintMoveMissed, NO_ACC_CALC_CHECK_LOCK_ON @@ -1655,7 +1655,7 @@ BattleScript_EffectTelekinesis: printstring STRINGID_PKMNIDENTIFIED waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectStealthRock: attackcanceler attackstring @@ -1666,7 +1666,7 @@ BattleScript_EffectStealthRock: printstring STRINGID_POINTEDSTONESFLOAT waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectStickyWeb: attackcanceler attackstring @@ -1677,7 +1677,7 @@ BattleScript_EffectStickyWeb: printstring STRINGID_STICKYWEBUSED waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectGastroAcid: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -1689,7 +1689,7 @@ BattleScript_EffectGastroAcid: printstring STRINGID_PKMNSABILITYSUPPRESSED waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectToxicSpikes: attackcanceler attackstring @@ -1700,7 +1700,7 @@ BattleScript_EffectToxicSpikes: printstring STRINGID_POISONSPIKESSCATTERED waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectMagnetRise: attackcanceler attackstring @@ -1711,7 +1711,7 @@ BattleScript_EffectMagnetRise: printstring STRINGID_PKMNLEVITATEDONELECTROMAGNETISM waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectTrickRoom: BattleScript_EffectWonderRoom: BattleScript_EffectMagicRoom: @@ -1724,7 +1724,7 @@ BattleScript_EffectMagicRoom: printfromtable gRoomsStringIds waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectAquaRing: attackcanceler attackstring @@ -1735,7 +1735,7 @@ BattleScript_EffectAquaRing: printstring STRINGID_PKMNSURROUNDEDWITHVEILOFWATER waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectEmbargo: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -1747,7 +1747,7 @@ BattleScript_EffectEmbargo: printstring STRINGID_PKMNCANTUSEITEMSANYMORE waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectTailwind: attackcanceler attackstring @@ -1758,7 +1758,7 @@ BattleScript_EffectTailwind: printstring STRINGID_TAILWINDBLEW waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_EffectMircleEye: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -1766,7 +1766,7 @@ BattleScript_EffectMircleEye: ppreduce setmiracleeye BattleScript_ButItFailed goto BattleScript_IdentifiedFoe - + BattleScript_EffectGravity: attackcanceler attackstring @@ -1797,7 +1797,7 @@ BattleScript_EffectRoost: tryhealhalfhealth BattleScript_AlreadyAtFullHp, BS_TARGET setroost goto BattleScript_PresentHealTarget - + BattleScript_EffectCaptivate: setstatchanger STAT_SPATK, 2, TRUE attackcanceler @@ -1807,7 +1807,7 @@ BattleScript_EffectCaptivate: BattleScript_CaptivateCheckAcc: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE goto BattleScript_StatDownFromAttackString - + BattleScript_EffectHealBlock: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -1866,7 +1866,7 @@ BattleScript_EffectHitEscape: switchineffects BS_ATTACKER BattleScript_HitEscapeEnd: end - + BattleScript_EffectPlaceholder: attackcanceler attackstring @@ -1949,7 +1949,7 @@ BattleScript_HitFromAtkAnimation:: BattleScript_MoveEnd:: moveendall end - + BattleScript_EffectNaturalGift: attackcanceler attackstring @@ -2012,38 +2012,38 @@ BattleScript_EffectSleep:: 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 @@ -2055,7 +2055,7 @@ BattleScript_LeafGuardProtectsRet:: printstring STRINGID_ITDOESNTAFFECT waitmessage 0x40 return - + BattleScript_LeafGuardProtects: call BattleScript_LeafGuardProtectsRet orhalfword gMoveResultFlags, MOVE_RESULT_FAILED @@ -2247,7 +2247,7 @@ BattleScript_EffectDefenseUp:: BattleScript_EffectSpecialAttackUp:: setstatchanger STAT_SPATK, 1, FALSE goto BattleScript_EffectStatUp - + BattleScript_EffectSpeedUp: setstatchanger STAT_SPEED, 1, FALSE goto BattleScript_EffectStatUp @@ -2305,7 +2305,7 @@ BattleScript_EffectSpeedDown: BattleScript_EffectAccuracyDown: setstatchanger STAT_ACC, 1, TRUE goto BattleScript_EffectStatDown - + BattleScript_EffectSpecialAttackDown: setstatchanger STAT_SPATK, 1, TRUE goto BattleScript_EffectStatDown @@ -2456,7 +2456,7 @@ BattleScript_EffectConversion:: BattleScript_EffectFlinchHit:: setmoveeffect MOVE_EFFECT_FLINCH goto BattleScript_EffectHit - + BattleScript_EffectFlinchWithStatus: setmoveeffect MOVE_EFFECT_FLINCH attackcanceler @@ -2481,7 +2481,7 @@ BattleScript_EffectFlinchWithStatus: argumentstatuseffect tryfaintmon BS_TARGET, FALSE, NULL goto BattleScript_MoveEnd - + BattleScript_EffectRestoreHp:: attackcanceler attackstring @@ -2535,7 +2535,7 @@ BattleScript_ImmunityProtected:: BattleScript_EffectPayDay:: setmoveeffect MOVE_EFFECT_PAYDAY goto BattleScript_EffectHit - + BattleScript_EffectAuroraVeil: attackcanceler attackstring @@ -2745,7 +2745,7 @@ BattleScript_EffectAttackUp2:: BattleScript_EffectDefenseUp2:: setstatchanger STAT_DEF, 2, FALSE goto BattleScript_EffectStatUp - + BattleScript_EffectDefenseUp3: setstatchanger STAT_DEF, 3, FALSE goto BattleScript_EffectStatUp @@ -2765,7 +2765,7 @@ BattleScript_EffectSpecialAttackUp3:: BattleScript_EffectSpecialDefenseUp2:: setstatchanger STAT_SPDEF, 2, FALSE goto BattleScript_EffectStatUp - + BattleScript_EffectAccuracyUp2: setstatchanger STAT_ACC, 2, FALSE goto BattleScript_EffectStatUp @@ -2800,7 +2800,7 @@ BattleScript_EffectSpeedDown2: BattleScript_EffectSpecialDefenseDown2: setstatchanger STAT_SPDEF, 2, TRUE goto BattleScript_EffectStatDown - + BattleScript_EffectSpecialAttackDown2: setstatchanger STAT_SPATK, 2, TRUE goto BattleScript_EffectStatDown @@ -2906,7 +2906,7 @@ BattleScript_EffectSpecialAttackDownHit:: BattleScript_EffectSpecialDefenseDownHit:: setmoveeffect MOVE_EFFECT_SP_DEF_MINUS_1 goto BattleScript_EffectHit - + BattleScript_EffectSpecialDefenseDownHit2:: setmoveeffect MOVE_EFFECT_SP_DEF_MINUS_2 goto BattleScript_EffectHit @@ -3326,7 +3326,7 @@ BattleScript_TripleKickEnd:: BattleScript_EffectThief:: setmoveeffect MOVE_EFFECT_STEAL_ITEM goto BattleScript_EffectHit - + BattleScript_EffectHitPreventEscape: setmoveeffect MOVE_EFFECT_PREVENT_ESCAPE goto BattleScript_EffectHit @@ -3804,7 +3804,7 @@ BattleScript_EffectThunder: setmoveeffect MOVE_EFFECT_PARALYSIS orword gHitMarker, HITMARKER_IGNORE_ON_AIR goto BattleScript_EffectHit - + BattleScript_EffectHurricane: setmoveeffect MOVE_EFFECT_CONFUSION orword gHitMarker, HITMARKER_IGNORE_ON_AIR @@ -4296,7 +4296,7 @@ BattleScript_EffectIngrain: BattleScript_EffectSuperpower: setmoveeffect MOVE_EFFECT_ATK_DEF_DOWN | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN goto BattleScript_EffectHit - + BattleScript_EffectCloseCombat: setmoveeffect MOVE_EFFECT_DEF_SPDEF_DOWN | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN goto BattleScript_EffectHit @@ -4465,11 +4465,11 @@ BattleScript_EffectSecretPower:: BattleScript_EffectDoubleEdge:: 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 @@ -4738,7 +4738,7 @@ BattleScript_GiveExp:: setbyte sGIVEEXP_STATE, 0x0 getexp BS_TARGET end2 - + BattleScript_HandleFaintedMon:: atk24 BattleScript_82DA8F6 jumpifbyte CMP_NOT_EQUAL, gBattleOutcome, 0, BattleScript_FaintedMonEnd @@ -5162,67 +5162,67 @@ BattleScript_SideStatusWoreOff:: printstring STRINGID_PKMNSXWOREOFF 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 @@ -5298,7 +5298,7 @@ BattleScript_BideNoEnergyToAttack:: printstring STRINGID_PKMNUNLEASHEDENERGY waitmessage 0x40 goto BattleScript_ButItFailed - + BattleScript_RoarSuccessSwitch:: call BattleScript_RoarSuccessRet getswitchedmondata BS_TARGET @@ -5308,7 +5308,7 @@ BattleScript_RoarSuccessSwitch:: printstring STRINGID_PKMNWASDRAGGEDOUT switchineffects BS_TARGET goto BattleScript_MoveEnd - + BattleScript_RoarSuccessEndBattle:: call BattleScript_RoarSuccessRet setoutcomeonteleport BS_ATTACKER @@ -5321,7 +5321,7 @@ BattleScript_RoarSuccessRet: returntoball BS_TARGET waitstate return - + BattleScript_WeaknessPolicy:: copybyte sBATTLER, gBattlerTarget jumpifstat BS_TARGET, CMP_LESS_THAN, STAT_ATK, 0xC, BattleScript_WeaknessPolicyAtk @@ -5346,7 +5346,7 @@ BattleScript_WeaknessPolicyRemoveItem: removeitem BS_TARGET BattleScript_WeaknessPolicyEnd: return - + BattleScript_TargetItemStatRaise:: copybyte sBATTLER, gBattlerTarget statbuffchange 0, BattleScript_TargetItemStatRaiseRemoveItemRet @@ -5456,12 +5456,12 @@ BattleScript_PrintHurtByDmgHazards:: printfromtable gDmgHazardsStringIds waitmessage 0x40 return - + BattleScript_ToxicSpikesAbsorbed:: printstring STRINGID_TOXICSPIKESABSORBED waitmessage 0x40 return - + BattleScript_ToxicSpikesPoisoned:: printstring STRINGID_TOXICSPIKESPOISONED waitmessage 0x40 @@ -5469,7 +5469,7 @@ BattleScript_ToxicSpikesPoisoned:: updatestatusicon BS_SCRIPTING waitstate return - + BattleScript_StickyWebOnSwitchIn:: savetarget copybyte gBattlerTarget, sBATTLER @@ -5559,17 +5559,17 @@ BattleScript_SpikesFree:: printstring STRINGID_PKMNBLEWAWAYSPIKES 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 @@ -5672,7 +5672,7 @@ BattleScript_MoveUsedIsThroatChopPrevented:: BattleScript_SelectingNotAllowedMoveThroatChopInPalace:: printstring STRINGID_PKMNCANTUSEMOVETHROATCHOP goto BattleScript_SelectingUnusableMoveInPalace - + BattleScript_ThroatChopEndTurn:: printstring STRINGID_THROATCHOPENDS waitmessage 0x40 @@ -5681,11 +5681,11 @@ BattleScript_ThroatChopEndTurn:: BattleScript_SelectingNotAllowedMoveGravity:: printselectionstring STRINGID_GRAVITYPREVENTSUSAGE endselectionscript - + BattleScript_SelectingNotAllowedBelch:: printselectionstring STRINGID_BELCHCANTSELECT endselectionscript - + BattleScript_SelectingNotAllowedBelchInPalace:: printstring STRINGID_BELCHCANTSELECT goto BattleScript_SelectingUnusableMoveInPalace @@ -5698,7 +5698,7 @@ BattleScript_MoveUsedGravityPrevents:: BattleScript_SelectingNotAllowedMoveGravityInPalace:: printstring STRINGID_GRAVITYPREVENTSUSAGE goto BattleScript_SelectingUnusableMoveInPalace - + BattleScript_SelectingNotAllowedMoveHealBlock:: printselectionstring STRINGID_HEALBLOCKPREVENTSUSAGE endselectionscript @@ -5741,7 +5741,7 @@ BattleScript_TurnHeal: healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER end2 - + BattleScript_AquaRingHeal:: playanimation BS_ATTACKER, B_ANIM_INGRAIN_HEAL, NULL printstring STRINGID_AQUARINGHEAL @@ -5771,7 +5771,7 @@ BattleScript_AtkDefDownTryDef: waitmessage 0x40 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 @@ -5840,7 +5840,7 @@ BattleScript_EnduredMsg:: printstring STRINGID_PKMNENDUREDHIT waitmessage 0x40 return - + BattleScript_SturdiedMsg:: copybyte gBattlerAbility, gBattlerTarget pause 0x10 @@ -5864,7 +5864,7 @@ BattleScript_SAtkDown2:: waitmessage 0x40 BattleScript_SAtkDown2End:: return - + BattleScript_MoveEffectClearSmog:: printstring STRINGID_RESETSTARGETSSTATLEVELS waitmessage 0x40 @@ -5890,7 +5890,7 @@ BattleScript_MegaEvolution:: printstring STRINGID_MEGAEVOEVOLVED waitmessage 0x40 end2 - + BattleScript_StanceChangeActivates:: pause 0x5 copybyte gBattlerAbility, gBattlerAttacker @@ -5903,7 +5903,7 @@ BattleScript_StanceChangeActivates:: waitanimation handleformchange BS_ATTACKER, 2 return - + BattleScript_DisguiseBustedActivates:: pause 0x5 copybyte gBattlerAbility, gBattlerTarget @@ -5971,7 +5971,7 @@ BattleScript_DoTurnDmg:: atk24 BattleScript_DoTurnDmgEnd BattleScript_DoTurnDmgEnd:: end2 - + BattleScript_PoisonHealActivates:: printstring STRINGID_POISONHEALHPUP waitmessage 0x40 @@ -6011,7 +6011,7 @@ BattleScript_MoveUsedIsParalyzed:: statusanimation BS_ATTACKER cancelmultiturnmoves BS_ATTACKER goto BattleScript_MoveEnd - + BattleScript_PowderMoveNoEffect:: attackstring ppreduce @@ -6083,7 +6083,7 @@ BattleScript_DoSelfConfusionDmg:: goto BattleScript_MoveEnd BattleScript_MoveUsedIsConfusedRet:: return - + BattleScript_MoveUsedPowder:: bicword gHitMarker, HITMARKER_NO_ATTACKSTRING | HITMARKER_ATTACKSTRING_PRINTED attackstring @@ -6170,28 +6170,28 @@ BattleScript_YawnMakesAsleep:: waitstate 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 @@ -6264,7 +6264,7 @@ BattleScript_DoRecoil:: tryfaintmon BS_ATTACKER, FALSE, NULL BattleScript_RecoilEnd:: return - + BattleScript_EffectWithChance:: seteffectwithchance return @@ -6283,7 +6283,7 @@ BattleScript_DrizzleActivates:: playanimation BS_BATTLER_0, B_ANIM_RAIN_CONTINUES, NULL call BattleScript_WeatherFormChanges end3 - + BattleScript_DefiantActivates:: pause 0x20 call BattleScript_AbilityPopUp @@ -6293,7 +6293,7 @@ BattleScript_DefiantActivates:: printstring STRINGID_PKMNSSTATCHANGED2 waitmessage 0x40 return - + BattleScript_AbilityPopUp: showabilitypopup BS_ABILITY_BATTLER recordability BS_ABILITY_BATTLER @@ -6315,7 +6315,7 @@ BattleScript_TraceActivates:: settracedability BS_SCRIPTING switchinabilities BS_SCRIPTING return - + BattleScript_TraceActivatesEnd3:: call BattleScript_TraceActivates end3 @@ -6328,14 +6328,14 @@ BattleScript_RainDishActivates:: healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER end3 - + 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 @@ -6415,7 +6415,7 @@ BattleScript_IntimidatePrevented: printstring STRINGID_PREVENTEDFROMWORKING waitmessage 0x40 goto BattleScript_IntimidateActivatesLoopIncrement - + BattleScript_DroughtActivates:: pause 0x20 call BattleScript_AbilityPopUp @@ -6424,7 +6424,7 @@ BattleScript_DroughtActivates:: playanimation BS_BATTLER_0, B_ANIM_SUN_CONTINUES, NULL call BattleScript_WeatherFormChanges end3 - + BattleScript_SnowWarningActivates:: pause 0x20 call BattleScript_AbilityPopUp @@ -6433,7 +6433,7 @@ BattleScript_SnowWarningActivates:: playanimation BS_BATTLER_0, B_ANIM_HAIL_CONTINUES, NULL call BattleScript_WeatherFormChanges end3 - + BattleScript_ElectricSurgeActivates:: pause 0x20 call BattleScript_AbilityPopUp @@ -6441,7 +6441,7 @@ BattleScript_ElectricSurgeActivates:: waitstate playanimation BS_SCRIPTING, B_ANIM_TERRAIN_ELECTRIC, NULL end3 - + BattleScript_MistySurgeActivates:: pause 0x20 call BattleScript_AbilityPopUp @@ -6449,7 +6449,7 @@ BattleScript_MistySurgeActivates:: waitstate playanimation BS_SCRIPTING, B_ANIM_TERRAIN_MISTY, NULL end3 - + BattleScript_GrassySurgeActivates:: pause 0x20 call BattleScript_AbilityPopUp @@ -6457,7 +6457,7 @@ BattleScript_GrassySurgeActivates:: waitstate playanimation BS_SCRIPTING, B_ANIM_TERRAIN_GRASSY, NULL end3 - + BattleScript_PsychicSurgeActivates:: pause 0x20 call BattleScript_AbilityPopUp @@ -6465,7 +6465,7 @@ BattleScript_PsychicSurgeActivates:: waitstate playanimation BS_SCRIPTING, B_ANIM_TERRAIN_PSYCHIC, NULL end3 - + BattleScript_BadDreamsActivates:: setbyte gBattlerTarget, 0 call BattleScript_AbilityPopUp @@ -6519,7 +6519,7 @@ BattleScript_MoveHPDrain:: waitmessage 0x40 orhalfword gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE goto BattleScript_MoveEnd - + BattleScript_MoveStatDrain_PPLoss:: ppreduce BattleScript_MoveStatDrain:: @@ -6614,7 +6614,7 @@ BattleScript_SoundproofProtected:: printstring STRINGID_PKMNSXBLOCKSY waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_DazzlingProtected:: attackstring ppreduce @@ -6623,7 +6623,7 @@ BattleScript_DazzlingProtected:: printstring STRINGID_POKEMONCANNOTUSEMOVE waitmessage 0x40 goto BattleScript_MoveEnd - + BattleScript_MoveUsedPsychicTerrainPrevents:: printstring STRINGID_POKEMONCANNOTUSEMOVE waitmessage 0x40 @@ -6645,7 +6645,7 @@ 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 @@ -6666,25 +6666,25 @@ BattleScript_ColorChangeActivates:: printstring STRINGID_PKMNCHANGEDTYPEWITH waitmessage 0x40 return - + 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 @@ -6693,7 +6693,7 @@ BattleScript_AngryPointActivates:: printstring STRINGID_ANGRYPOINTACTIVATES waitmessage 0x40 return - + BattleScript_TargetAbilityStatRaise:: call BattleScript_AbilityPopUp statbuffchange STAT_BUFF_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, NULL @@ -6703,7 +6703,7 @@ BattleScript_TargetAbilityStatRaise:: printstring STRINGID_TARGETABILITYSTATRAISE waitmessage 0x40 return - + BattleScript_WeakArmorActivates:: call BattleScript_AbilityPopUp setstatchanger STAT_DEF, 1, TRUE @@ -6735,7 +6735,7 @@ BattleScript_WeakArmorSpeedAnim: waitmessage 0x40 BattleScript_WeakArmorActivatesEnd: return - + BattleScript_AttackerAbilityStatRaise:: setgraphicalstatchangevalues copybyte gBattlerAbility, gBattlerAttacker @@ -6745,7 +6745,7 @@ BattleScript_AttackerAbilityStatRaise:: 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 @@ -6755,17 +6755,17 @@ BattleScript_FellStingerRaisesStat:: waitmessage 0x40 BattleScript_FellStingerRaisesAtkEnd: return - + BattleScript_AttackerAbilityStatRaiseEnd3:: call BattleScript_AttackerAbilityStatRaise end3 - + BattleScript_SwitchInAbilityMsg:: call BattleScript_AbilityPopUp printfromtable gSwitchInAbilityStringIds waitmessage 0x40 end3 - + BattleScript_ImposterActivates:: transformdataexecution call BattleScript_AbilityPopUp @@ -6774,7 +6774,7 @@ BattleScript_ImposterActivates:: printstring STRINGID_IMPOSTERTRANSFORM waitmessage 0x40 end3 - + BattleScript_HurtAttacker: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 healthbarupdate BS_ATTACKER @@ -6788,7 +6788,7 @@ BattleScript_RoughSkinActivates:: call BattleScript_AbilityPopUp call BattleScript_HurtAttacker return - + BattleScript_RockyHelmetActivates:: playanimation BS_TARGET, B_ANIM_ITEM_EFFECT, NULL waitanimation @@ -6965,7 +6965,7 @@ BattleScript_BerryCureSlpRet:: updatestatusicon BS_SCRIPTING removeitem BS_SCRIPTING return - + BattleScript_GemActivates:: playanimation BS_ATTACKER, B_ANIM_ITEM_EFFECT, NULL waitanimation @@ -6973,7 +6973,7 @@ BattleScript_GemActivates:: waitmessage 0x40 removeitem BS_ATTACKER return - + BattleScript_BerryReduceDmg:: playanimation BS_TARGET, B_ANIM_ITEM_EFFECT, NULL waitanimation @@ -6981,7 +6981,7 @@ BattleScript_BerryReduceDmg:: waitmessage 0x40 removeitem BS_TARGET return - + BattleScript_PrintBerryReduceString:: waitmessage 0x40 printstring STRINGID_BERRYDMGREDUCES @@ -7041,18 +7041,18 @@ BattleScript_BerryPPHealEnd2:: 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 @@ -7061,7 +7061,7 @@ BattleScript_ItemHurtRet:: waitmessage 0x40 tryfaintmon BS_ATTACKER, FALSE, NULL return - + BattleScript_ItemHurtEnd2:: playanimation BS_ATTACKER, B_ANIM_MON_HIT, NULL waitanimation @@ -7080,7 +7080,7 @@ BattleScript_ItemHealHP_Ret:: BattleScript_SelectingNotAllowedMoveChoiceItem:: printselectionstring STRINGID_ITEMALLOWSONLYYMOVE endselectionscript - + BattleScript_SelectingNotAllowedMoveAssaultVest:: printselectionstring STRINGID_ASSAULTVESTDOESNTALLOW endselectionscript @@ -7156,7 +7156,7 @@ BattleScript_ArenaTurnBeginning:: various15 BS_ATTACKER volumeup end2 - + BattleScript_82DB8E0:: @ Unused battlescript playse SE_PINPON various14 BS_ATTACKER From a1c425fffbaa5f1ad8db1455e29d66b84437f677 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sun, 16 Feb 2020 09:17:00 -0300 Subject: [PATCH 480/667] Fixed Bad Dreams' in battle text. (#272) --- src/battle_message.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_message.c b/src/battle_message.c index ce6f67b154..7d2a447317 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -579,7 +579,7 @@ static const u8 sText_PsychicTerrainEnds[] = _("The weirdness disappeared\nfrom 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_DEF_ABILITY}!"); +static const u8 sText_BadDreamsDmg[] = _("{B_DEF_NAME_WITH_PREFIX} is tormented\nby {B_ATK_ABILITY}!"); static const u8 sText_MoldBreakerEnters[] = _("{B_ATK_NAME_WITH_PREFIX} breaks the mold!"); static const u8 sText_TeravoltEnters[] = _("{B_ATK_NAME_WITH_PREFIX} is radiating a bursting aura!"); static const u8 sText_TurboblazeEnters[] = _("{B_ATK_NAME_WITH_PREFIX} is radiating a blazing aura!"); From 5054727167a382c75c782b0c427bd922889fb7c4 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 16 Feb 2020 13:24:50 +0100 Subject: [PATCH 481/667] Allow second mon to throw a ball if first dead --- src/battle_main.c | 3 ++- src/item_use.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/battle_main.c b/src/battle_main.c index ff493cc3f3..76cb72701e 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3666,7 +3666,8 @@ u8 IsRunningFromBattleImpossible(void) gBattleCommunication[MULTISTRING_CHOOSER] = 1; return 1; } - if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT && WILD_DOUBLE_BATTLE) // The second pokemon cannot run from a double wild battle. + 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; diff --git a/src/item_use.c b/src/item_use.c index 5adc028df4..bdc1627112 100755 --- a/src/item_use.c +++ b/src/item_use.c @@ -951,7 +951,8 @@ void ItemUseInBattle_PokeBall(u8 taskId) else DisplayItemMessageInBattlePyramid(taskId, textCantThrowPokeBall, Task_CloseBattlePyramidBagMessage); } - else if (gBattlerInMenuId == GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT)) // Attempting to throw a ball with the second pokemon. + 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"); From 7c81accf7b4b89cab0360c5d9f2f7428ee1362a2 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 16 Feb 2020 13:34:25 +0100 Subject: [PATCH 482/667] Switch-in abilities for megas --- data/battle_scripts_1.s | 1 + 1 file changed, 1 insertion(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index f73bbfc938..c57ce54e66 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5889,6 +5889,7 @@ BattleScript_MegaEvolution:: handlemegaevo BS_ATTACKER, 2 printstring STRINGID_MEGAEVOEVOLVED waitmessage 0x40 + switchinabilities BS_ATTACKER end2 BattleScript_StanceChangeActivates:: From edb581af1feb6d2a8c5a89a507a8c7ae85ab2221 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 16 Feb 2020 13:46:35 +0100 Subject: [PATCH 483/667] Mega evo elevation shadow --- src/battle_script_commands.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 0c5cf53740..0ee6e1b698 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7355,11 +7355,13 @@ static void Cmd_various(void) gBattleStruct->mega.alreadyEvolved[GetBattlerPosition(gActiveBattler)] = TRUE; gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(gActiveBattler)] |= gBitTable[gBattlerPartyIndexes[gActiveBattler]]; } - // Update healthbox. + // 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; From 017f65de5983634ef03e653d3da4b93418ca5921 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 16 Feb 2020 15:45:54 +0100 Subject: [PATCH 484/667] Add easy to use macros for custom multi battles --- asm/macros/battle_frontier/battle_tower.inc | 74 +++++++++++++++++++++ 1 file changed, 74 insertions(+) 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 From e64b810463a91a7117bf576816b9e897cea2fcb6 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 17 Feb 2020 10:55:55 +0100 Subject: [PATCH 485/667] Fix Dragon Pulse and Shadow Force animations --- data/battle_anim_scripts.s | 55 ++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 1fa15d7078..e20598ce7a 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -2065,15 +2065,17 @@ Move_BUG_BUZZ: end Move_DRAGON_PULSE: - createsprite gSimplePaletteBlendSpriteTemplate, 2, 5, 1, 1, 0, 7, 0 + loadspritegfx ANIM_TAG_DRAGON_PULSE + monbg ANIM_TARGET + setalpha 12, 8 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 0, 7, RGB_BLACK waitforvisualfinish - loadspritegfx ANIM_TAG_DRAGON_PULSE playsewithpan SE_W060, SOUND_PAN_ATTACKER - createsoundtask sub_8158C58, 7, 200, -64, SOUND_PAN_TARGET, 3, 4, 0, 15 + createsoundtask sub_8158C58, SE_W060B, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 3, 4, 0, 15 call DragonPulseParticle call DragonPulseParticle - createvisualtask AnimTask_SwayMon, 5, 5, 0, 6, 51200, 4, 1 - createvisualtask sub_8115A04, 2, 6, 4, 2, 2, 0, 12, RGB(30, 10, 13) + createvisualtask AnimTask_SwayMon, 5, 0, 6, 51200, 4, ANIM_TARGET + createvisualtask sub_8115A04, 2, 4, 2, 2, 0, 12, RGB(30, 10, 13) call DragonPulseParticle call DragonPulseParticle call DragonPulseParticle @@ -2085,10 +2087,10 @@ Move_DRAGON_PULSE: call DragonPulseParticle waitforvisualfinish delay 1 - createsprite gSimplePaletteBlendSpriteTemplate, 2, 5, 1, 1, 7, 0, 0 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 7, 0, RGB_BLACK waitforvisualfinish - clearmonbg ANIM_DEF_PARTNER - blendoff + blendoff + clearmonbg ANIM_TARGET end DragonPulseParticle: createsprite gDragonPulseSpriteTemplate, 130, 6, 16, 0, 0, 0, 13, 0 @@ -2387,7 +2389,7 @@ Move_NASTY_PLOT: NastyPlotAction: fadetobg BG_DARK waitbgfadeout - createvisualtask AnimTask_FadeScreenToWhite, 5, 0 + createvisualtask AnimTask_FadeScreenToWhite, 5 waitbgfadein return @@ -3830,20 +3832,21 @@ ShadowForceWaitEnd: waitforvisualfinish end ShadowForcePrep: - playsewithpan 190, SOUND_PAN_ATTACKER, - createsprite gSimplePaletteBlendSpriteTemplate 2, 5, 1, 3, 0, 16, 0 - createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, 2, 0 - createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, 2, 0 - createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, 2, 0 - createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, 2, 0 - createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, 0, 18, 6, 1, 3 - createvisualtask sub_81136E8, 2, 1, 1 + monbg ANIM_ATTACKER + playsewithpan SE_W185, 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 sub_81136E8, 2, 1 delay 80 - createsprite gSimplePaletteBlendSpriteTemplate 2, 5, 1, 3, 16, 0, 0 - createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, 2, 1 - createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, 2, 1 - createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, 2, 1 - createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, 2, 1 + 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 @@ -3857,10 +3860,10 @@ ShadowForceAttack: waitbgfadein delay 10 playsewithpan SOUND_PAN_ATTACKER, 192 - createvisualtask sub_811188C, 5, 1, 85 + createvisualtask sub_811188C, 5, 85 delay 70 - createvisualtask AnimTask_ShakeMon2 2, 5, 1, 2, 0, 12, 1 - createvisualtask sub_8115A04 2, 6, 4, 0, 2, 0, 13, 0 + createvisualtask AnimTask_ShakeMon2 2, 1, 2, 0, 12, 1 + createvisualtask sub_8115A04 2, 4, 0, 2, 0, 13, 0 waitforvisualfinish clearmonbg ANIM_ATTACKER delay 1 @@ -3870,7 +3873,7 @@ ShadowForceAttack: ShadowForceBg: fadetobg BG_DARK waitbgfadeout - createvisualtask AnimTask_FadeScreenToWhite, 5, 0 + createvisualtask AnimTask_FadeScreenToWhite, 5 waitbgfadein return From 1acd82ece68cc687b0d73b232e5327e9c36da9ba Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Mon, 17 Feb 2020 06:59:39 -0300 Subject: [PATCH 486/667] Added non-traceable abilities. (#275) * Added non-traceable abilities. * Added ABILITIES_COUNT to array size --- src/battle_util.c | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 964fd01fb9..007a863a2e 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -103,6 +103,28 @@ static const u8 sAbilitiesAffectedByMoldBreaker[] = [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}, @@ -3697,17 +3719,17 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { - if (gBattleMons[target1].ability != 0 && gBattleMons[target1].hp != 0 - && gBattleMons[target2].ability != 0 && gBattleMons[target2].hp != 0) + 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 (gBattleMons[target1].ability != 0 && gBattleMons[target1].hp != 0) + else if (!sAbilitiesNotTraced[gBattleMons[target1].ability] && gBattleMons[target1].hp != 0) gActiveBattler = target1, effect++; - else if (gBattleMons[target2].ability != 0 && gBattleMons[target2].hp != 0) + else if (!sAbilitiesNotTraced[gBattleMons[target2].ability] && gBattleMons[target2].hp != 0) gActiveBattler = target2, effect++; } else { - if (gBattleMons[target1].ability && gBattleMons[target1].hp) + if (!sAbilitiesNotTraced[gBattleMons[target1].ability] && gBattleMons[target1].hp != 0) gActiveBattler = target1, effect++; } From 6c71f9b57b090eff72d3d37883868dee8cde04cc Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 17 Feb 2020 15:26:04 +0100 Subject: [PATCH 487/667] Abilities up to gen7 --- include/constants/abilities.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/constants/abilities.h b/include/constants/abilities.h index ab2e6880a4..fdb5233f02 100644 --- a/include/constants/abilities.h +++ b/include/constants/abilities.h @@ -255,6 +255,6 @@ #define ABILITIES_COUNT_GEN7 235 -#define ABILITIES_COUNT ABILITIES_COUNT_GEN6 +#define ABILITIES_COUNT ABILITIES_COUNT_GEN7 #endif // GUARD_CONSTANTS_ABILITIES_H From 517974ebcb2110cfb91e2c962bd4e103a20152d8 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 22 Feb 2020 17:30:07 +0100 Subject: [PATCH 488/667] Can't Knock Off mega stones --- src/battle_script_commands.c | 9 ++++++--- src/battle_util.c | 4 +++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 0ee6e1b698..95ad77ff53 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2828,7 +2828,11 @@ void SetMoveEffect(bool32 primary, u32 certain) } break; case MOVE_EFFECT_KNOCK_OFF: - if (GetBattlerAbility(gEffectBattler) == ABILITY_STICKY_HOLD) + if (!CanBattlerGetOrLoseItem(gEffectBattler, gBattleMons[gEffectBattler].item)) + { + gBattlescriptCurrInstr++; + } + else if (GetBattlerAbility(gEffectBattler) == ABILITY_STICKY_HOLD) { if (gBattleMons[gEffectBattler].item == 0) { @@ -2840,9 +2844,8 @@ void SetMoveEffect(bool32 primary, u32 certain) gBattlescriptCurrInstr = BattleScript_StickyHoldActivates; RecordAbilityBattle(gEffectBattler, ABILITY_STICKY_HOLD); } - break; } - if (gBattleMons[gEffectBattler].item) + else if (gBattleMons[gEffectBattler].item) { side = GetBattlerSide(gEffectBattler); diff --git a/src/battle_util.c b/src/battle_util.c index 007a863a2e..1b8ad6fcf1 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6383,7 +6383,9 @@ bool32 CanBattlerGetOrLoseItem(u8 battlerId, u16 itemId) return FALSE; else if (species == SPECIES_GROUDON && itemId == ITEM_RED_ORB) return FALSE; - else if (ItemId_GetHoldEffect(itemId) == HOLD_EFFECT_MEGA_STONE && GetMegaEvolutionSpecies(species, itemId) != SPECIES_NONE) + // 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; From bd75f16a9b7ef7860634163e6834e40c381ae3b2 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 22 Feb 2020 18:22:04 +0100 Subject: [PATCH 489/667] Clear move effect after each turn --- src/battle_script_commands.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 95ad77ff53..b7e7bfc292 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4788,6 +4788,7 @@ static void Cmd_moveend(void) gSpecialStatuses[gBattlerAttacker].gemBoost = 0; gSpecialStatuses[gBattlerAttacker].damagedMons = 0; gSpecialStatuses[gBattlerTarget].berryReduced = 0; + gBattleScripting.moveEffect = 0; gBattleScripting.moveendState++; break; case MOVEEND_COUNT: From b1b1bf7f121ed89aa332123dce29dbdb866e4d95 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 22 Feb 2020 18:43:16 +0100 Subject: [PATCH 490/667] Fix two turn moves not activating moxie --- src/battle_script_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b7e7bfc292..ecc2552780 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6595,7 +6595,7 @@ static bool32 HasAttackerFaintedTarget(void) && gBattleStruct->moveTarget[gBattlerAttacker] == gBattlerTarget && gBattlerTarget != gBattlerAttacker && gCurrentTurnActionNumber == GetBattlerTurnOrderNum(gBattlerAttacker) - && gChosenMove == gChosenMoveByBattler[gBattlerAttacker]) + && (gChosenMove == gChosenMoveByBattler[gBattlerAttacker] || gChosenMove == gBattleMons[gBattlerAttacker].moves[gChosenMovePos])) return TRUE; else return FALSE; From da965700ff9efe12b9fef82063e7118a6f741447 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 22 Feb 2020 19:25:35 +0100 Subject: [PATCH 491/667] Draining abilities have the pop-up appear now --- data/battle_scripts_1.s | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index c57ce54e66..4189b03093 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2109,6 +2109,8 @@ BattleScript_EffectAbsorb:: 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:: @@ -5251,6 +5253,8 @@ BattleScript_LeechSeedTurnDrain:: setbyte cMULTISTRING_CHOOSER, 0x3 goto BattleScript_LeechSeedTurnPrintAndUpdateHp BattleScript_LeechSeedTurnPrintLiquidOoze:: + copybyte gBattlerAbility, gBattlerAttacker + call BattleScript_AbilityPopUp setbyte cMULTISTRING_CHOOSER, 0x4 BattleScript_LeechSeedTurnPrintAndUpdateHp:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_x100000 @@ -6513,6 +6517,7 @@ BattleScript_MoveHPDrain_PPLoss:: BattleScript_MoveHPDrain:: attackstring pause 0x20 + call BattleScript_AbilityPopUp orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_TARGET datahpupdate BS_TARGET @@ -6526,6 +6531,7 @@ BattleScript_MoveStatDrain_PPLoss:: BattleScript_MoveStatDrain:: attackstring pause 0x20 + call BattleScript_AbilityPopUp setgraphicalstatchangevalues playanimation BS_TARGET, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 waitanimation From e1dbf8e06463009745fc4eb1af3308245a065ac7 Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Sat, 22 Feb 2020 15:27:45 -0300 Subject: [PATCH 492/667] Fix for Turboblaze's Battle string formatting (#281) * Fix for Turboblaze's Battle string formatting * Moved the "a" down the line. --- src/battle_message.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_message.c b/src/battle_message.c index 7d2a447317..bd2b64b60a 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -582,7 +582,7 @@ static const u8 sText_PoisonHealHpUp[] = _("The poisoning healed {B_ATK_NAME_WIT static const u8 sText_BadDreamsDmg[] = _("{B_DEF_NAME_WITH_PREFIX} is tormented\nby {B_ATK_ABILITY}!"); static const u8 sText_MoldBreakerEnters[] = _("{B_ATK_NAME_WITH_PREFIX} breaks the mold!"); static const u8 sText_TeravoltEnters[] = _("{B_ATK_NAME_WITH_PREFIX} is radiating a bursting aura!"); -static const u8 sText_TurboblazeEnters[] = _("{B_ATK_NAME_WITH_PREFIX} is radiating a blazing aura!"); +static const u8 sText_TurboblazeEnters[] = _("{B_ATK_NAME_WITH_PREFIX} is radiating\na blazing aura!"); static const u8 sText_SlowStartEnters[] = _("{B_ATK_NAME_WITH_PREFIX} can't get it going!"); static const u8 sText_SlowStartEnd[] = _("{B_ATK_NAME_WITH_PREFIX} finally got its act together!"); static const u8 sText_SolarPowerHpDrop[] = _("The {B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY}\ntakes its toll!"); From 3ce29d05596648e1f228c3c31f05ecc49da3be71 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 22 Feb 2020 20:07:51 +0100 Subject: [PATCH 493/667] Fix AI Volt Absorb --- data/battle_ai_scripts.s | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 10a4f63a9b..fd2e8334ab 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -76,7 +76,7 @@ CheckIfSoundproofCancelsMove: CheckIfVoltAbsorbCancelsElectric: @ 82DBFBD get_curr_move_type - if_equal TYPE_ELECTRIC, AI_CheckBadMove_CheckEffect + if_equal TYPE_ELECTRIC, Score_Minus12 goto AI_CheckBadMove_CheckEffect CheckIfWaterAbsorbCancelsWater: @ 82DBFCA @@ -91,6 +91,7 @@ CheckIfFlashFireCancelsFire: @ 82DBFD7 CheckIfWonderGuardCancelsMove: @ 82DBFE4 if_type_effectiveness AI_EFFECTIVENESS_x2, AI_CheckBadMove_CheckEffect + if_type_effectiveness AI_EFFECTIVENESS_x4, AI_CheckBadMove_CheckEffect goto Score_Minus10 CheckIfLevitateCancelsGroundMove: @ 82DBFEF From 147f954ab5792858ac222cadb31b7fd4721e911f Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Sat, 29 Feb 2020 05:45:37 -0300 Subject: [PATCH 494/667] Fixed Damp ability popup (#295) --- data/battle_scripts_1.s | 1 + 1 file changed, 1 insertion(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 4189b03093..7621077e81 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6507,6 +6507,7 @@ BattleScript_SturdyPreventsOHKO:: BattleScript_DampStopsExplosion:: pause 0x20 + copybyte gBattlerAbility, gBattlerTarget call BattleScript_AbilityPopUp printstring STRINGID_PKMNPREVENTSUSAGE pause 0x40 From 64031dd672b17451027a95293866cde5ec1d4775 Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Sat, 14 Mar 2020 08:15:36 -0300 Subject: [PATCH 495/667] Option for Toxic never missing if user is Poison type. (#304) --- include/constants/battle_config.h | 3 ++- src/battle_script_commands.c | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 2f025053df..0baf5d4fc0 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -57,7 +57,8 @@ // Move settings #define B_FELL_STINGER_STAT_RAISE GEN_6 // Gen6 Atk+2, Gen7 Atk+3. -#define B_SOUND_SUBSTITUTE GEN_6 // Starting from gen6 sound moves bypass Substitute. +#define B_SOUND_SUBSTITUTE GEN_6 // Starting from Gen6 sound moves bypass Substitute. +#define B_TOXIC_NEVER_MISS GEN_6 // Starting from Gen6, if Toxic is used by a Poison type, it will never miss. // Ability settings #define B_ABILITY_POP_UP GEN_6 // Starting from gen5, the pokemon abilities are displayed in a pop-up, when they activate in battle. diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index cdffeaf7fb..eb42249554 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1197,7 +1197,9 @@ static bool32 AccuracyCalcHelper(u16 move) JumpIfMoveFailed(7, move); return TRUE; } - else if (gBattleMoves[move].effect == EFFECT_TOXIC && IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_POISON)) + 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; From 1fc89941ac28700b601ad6a2c0e342ccad92b75f Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Sat, 14 Mar 2020 08:16:18 -0300 Subject: [PATCH 496/667] Fixed Ability Pop Up for Immunity-type abilities with Mold Breaker. (#301) * Fixed Ability Pop Up for Immunity-type abilities with Mold Breaker When a mon with Mold Breaker caused a status move to another one with an Immunity-type ability such as that mon healed inmiediatly from it, the ability pop up would incorrectly show the attacker's ability instead. * Compressed 3 lines into one. --- src/battle_util.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 4a404eebd0..c7a8d19005 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3618,8 +3618,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_AbilityCuredStatus; - gBattleScripting.battler = battler; - gActiveBattler = battler; + gBattleScripting.battler = gActiveBattler = gAbilityBattler = battler; BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); return effect; From 3d1b546e05c7c6e577b10f500372de5486852131 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 14 Mar 2020 12:23:51 +0100 Subject: [PATCH 497/667] Eviolite --- src/battle_util.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index c7a8d19005..9792fbb152 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3618,7 +3618,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_AbilityCuredStatus; - gBattleScripting.battler = gActiveBattler = gAbilityBattler = battler; + gBattleScripting.battler = gActiveBattler = gBattlerAbility = battler; BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); return effect; @@ -5775,6 +5775,18 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b 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 usesDefStat; @@ -5867,7 +5879,8 @@ static u32 CalcDefenseStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, MulModifier(&modifier, UQ_4_12(2.0)); break; case HOLD_EFFECT_EVIOLITE: - // todo + if (CanEvolve(gBattleMons[battlerDef].species)) + MulModifier(&modifier, UQ_4_12(1.5)); break; case HOLD_EFFECT_ASSAULT_VEST: if (!usesDefStat) From efe17d995cc6c07187497324b5b7d99c9a55a723 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 14 Mar 2020 12:31:42 +0100 Subject: [PATCH 498/667] Fix Healing Wish --- data/battle_scripts_1.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 608567a7c3..7e6e9a68aa 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1507,6 +1507,7 @@ BattleScript_EffectMetalBurst: BattleScript_EffectHealingWish: attackcanceler + jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_ButItFailedAtkStringPpReduce attackstring ppreduce attackanimation @@ -1514,7 +1515,6 @@ BattleScript_EffectHealingWish: instanthpdrop BS_ATTACKER setatkhptozero tryfaintmon BS_ATTACKER, FALSE, NULL - jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_EffectHealingWishEnd openpartyscreen 0x1, BattleScript_EffectHealingWishEnd switchoutabilities BS_ATTACKER waitstate From 1435cd4692fb490471b67f231aeed7e136749d8c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 11 Apr 2020 11:47:13 +0200 Subject: [PATCH 499/667] Change inner structure of semi invulerable moves --- data/battle_scripts_1.s | 66 ++++-------------------------------- include/constants/battle.h | 4 +-- include/constants/pokemon.h | 2 ++ src/battle_main.c | 6 ++-- src/battle_script_commands.c | 31 +++-------------- src/battle_util.c | 7 ++-- src/data/battle_moves.h | 16 ++++----- 7 files changed, 25 insertions(+), 107 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 7e6e9a68aa..0ec6fb236d 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1918,9 +1918,7 @@ BattleScript_EffectJudgment: BattleScript_EffectFusionCombo: BattleScript_EffectRevelationDance: BattleScript_EffectBelch: - jumpifnotmove MOVE_SURF, BattleScript_HitFromAtkCanceler - jumpifnostatus3 BS_TARGET, STATUS3_UNDERWATER, BattleScript_HitFromAtkCanceler - orword gHitMarker, HITMARKER_IGNORE_UNDERWATER + BattleScript_HitFromAtkCanceler:: attackcanceler BattleScript_HitFromAccCheck:: @@ -2645,10 +2643,6 @@ BattleScript_EffectDragonRage:: goto BattleScript_HitFromAtkAnimation BattleScript_EffectTrap:: - jumpifnotmove MOVE_WHIRLPOOL, BattleScript_DoWrapEffect - jumpifnostatus3 BS_TARGET, STATUS3_UNDERWATER, BattleScript_DoWrapEffect - orword gHitMarker, HITMARKER_IGNORE_UNDERWATER -BattleScript_DoWrapEffect:: setmoveeffect MOVE_EFFECT_WRAP goto BattleScript_EffectHit @@ -3574,15 +3568,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 @@ -3714,8 +3710,6 @@ BattleScript_SkullBashEnd:: goto BattleScript_MoveEnd BattleScript_EffectTwister: - jumpifnostatus3 BS_TARGET, STATUS3_ON_AIR, BattleScript_FlinchEffect - orword gHitMarker, HITMARKER_IGNORE_ON_AIR BattleScript_FlinchEffect: BattleScript_EffectStomp: setmoveeffect MOVE_EFFECT_FLINCH @@ -3724,50 +3718,7 @@ BattleScript_EffectStomp: BattleScript_EffectBulldoze: setmoveeffect MOVE_EFFECT_SPD_MINUS_1 BattleScript_EffectEarthquake: - attackcanceler - attackstring - ppreduce - selectfirstvalidtarget -BattleScript_HitsAllWithUndergroundBonusLoop:: - movevaluescleanup - copyhword sMOVE_EFFECT, sSAVED_MOVE_EFFECT - jumpifnostatus3 BS_TARGET, STATUS3_UNDERGROUND, BattleScript_HitsAllNoUndergroundBonus - orword gHitMarker, HITMARKER_IGNORE_UNDERGROUND - goto BattleScript_DoHitAllWithUndergroundBonus -BattleScript_HitsAllNoUndergroundBonus:: - bicword gHitMarker, HITMARKER_IGNORE_UNDERGROUND -BattleScript_DoHitAllWithUndergroundBonus:: - accuracycheck BattleScript_HitAllWithUndergroundBonusMissed, 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 - 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 + goto BattleScript_EffectHit BattleScript_EffectFutureSight:: attackcanceler @@ -3781,8 +3732,6 @@ BattleScript_EffectFutureSight:: goto BattleScript_MoveEnd BattleScript_EffectGust:: - jumpifnostatus3 BS_TARGET, STATUS3_ON_AIR, BattleScript_EffectHit - orword gHitMarker, HITMARKER_IGNORE_ON_AIR goto BattleScript_EffectHit BattleScript_EffectSolarbeam:: @@ -3804,12 +3753,10 @@ BattleScript_SolarbeamOnFirstTurn:: BattleScript_EffectThunder: setmoveeffect MOVE_EFFECT_PARALYSIS - orword gHitMarker, HITMARKER_IGNORE_ON_AIR goto BattleScript_EffectHit BattleScript_EffectHurricane: setmoveeffect MOVE_EFFECT_CONFUSION - orword gHitMarker, HITMARKER_IGNORE_ON_AIR goto BattleScript_EffectHit BattleScript_EffectTeleport: @@ -4618,7 +4565,6 @@ BattleScript_CosmicPowerEnd:: goto BattleScript_MoveEnd BattleScript_EffectSkyUppercut:: - orword gHitMarker, HITMARKER_IGNORE_ON_AIR goto BattleScript_EffectHit BattleScript_EffectBulkUp:: diff --git a/include/constants/battle.h b/include/constants/battle.h index 48dea68eb7..978105ad98 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -177,9 +177,7 @@ #define HITMARKER_IGNORE_SAFEGUARD 0x00002000 #define HITMARKER_SYNCHRONISE_EFFECT 0x00004000 #define HITMARKER_RUN 0x00008000 -#define HITMARKER_IGNORE_ON_AIR 0x00010000 -#define HITMARKER_IGNORE_UNDERGROUND 0x00020000 -#define HITMARKER_IGNORE_UNDERWATER 0x00040000 +// 3 free spots because of change in handling of UNDERGROUND/UNDERGWATER/ON AIR #define HITMARKER_UNABLE_TO_USE_MOVE 0x00080000 #define HITMARKER_x100000 0x00100000 #define HITMARKER_x200000 0x00200000 diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 87a8606e79..87771a7a6c 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -107,6 +107,8 @@ #define FLAG_POWDER 0x80000 #define FLAG_TARGET_ABILITY_IGNORED 0x100000 #define FLAG_DANCE 0x200000 +#define FLAG_DMG_IN_AIR 0x400000 // X2 dmg on air, always hits target on air +#define FLAG_HIT_IN_AIR 0x800000 // dmg is normal, always hits target on air // Split defines. #define SPLIT_PHYSICAL 0x0 diff --git a/src/battle_main.c b/src/battle_main.c index 76cb72701e..da7116dbd0 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5659,8 +5659,7 @@ static 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); } @@ -5672,8 +5671,7 @@ static 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); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index eb42249554..a087814097 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1217,31 +1217,10 @@ static bool32 AccuracyCalcHelper(u16 move) return TRUE; } - if (!(gHitMarker & HITMARKER_IGNORE_ON_AIR) && gStatuses3[gBattlerTarget] & STATUS3_ON_AIR) - { - 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 (gStatuses3[gBattlerTarget] & STATUS3_PHANTOM_FORCE) + 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); @@ -10030,9 +10009,7 @@ static void Cmd_magnitudedamagecalculation(void) magnitude = 10; } - PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 2, magnitude); - for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++) { if (gBattlerTarget == gBattlerAttacker) diff --git a/src/battle_util.c b/src/battle_util.c index 9792fbb152..3775461df4 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5338,11 +5338,6 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) if (GetBattlerTurnOrderNum(battlerAtk) > GetBattlerTurnOrderNum(battlerDef)) basePower *= 2; break; - case EFFECT_GUST: - case EFFECT_TWISTER: - if (gStatuses3[battlerDef] & STATUS3_ON_AIR) - basePower *= 2; - break; case EFFECT_ROUND: if (gChosenMoveByBattler[BATTLE_PARTNER(battlerAtk)] == MOVE_ROUND && !(gAbsentBattlerFlags & gBitTable[BATTLE_PARTNER(battlerAtk)])) basePower *= 2; @@ -6033,6 +6028,8 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move 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) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index d8d55348ee..52981da1ee 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -234,7 +234,7 @@ 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, }, @@ -1228,7 +1228,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_HIT_IN_AIR, .split = SPLIT_SPECIAL, }, @@ -1270,7 +1270,7 @@ 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, }, @@ -3357,7 +3357,7 @@ 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 | FLAG_SHEER_FORCE_BOOST, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_DMG_IN_AIR, .split = SPLIT_SPECIAL, }, @@ -4590,7 +4590,7 @@ 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 | FLAG_IRON_FIST_BOOST, + .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, }, @@ -6726,7 +6726,7 @@ 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_HIT_IN_AIR, .split = SPLIT_PHYSICAL, }, @@ -7609,7 +7609,7 @@ 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 | FLAG_SHEER_FORCE_BOOST, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_SHEER_FORCE_BOOST | FLAG_HIT_IN_AIR, .split = SPLIT_SPECIAL, }, @@ -8627,7 +8627,7 @@ 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_HIT_IN_AIR, .split = SPLIT_PHYSICAL, }, From 6daab7a5c93a9080734aedf49195b4333230cd41 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 11 Apr 2020 12:02:51 +0200 Subject: [PATCH 500/667] Fix Damp loop --- data/battle_scripts_1.s | 5 ++++- src/battle_script_commands.c | 41 +++++++++++++++--------------------- 2 files changed, 21 insertions(+), 25 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 0ec6fb236d..994679d837 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2169,6 +2169,7 @@ BattleScript_ExplosionLoop: moveendto MOVEEND_NEXT_TARGET jumpifnexttargetvalid BattleScript_ExplosionLoop tryfaintmon BS_ATTACKER, FALSE, NULL + moveendcase MOVEEND_CLEAR_BITS end BattleScript_ExplosionMissed: effectivenesssound @@ -6457,7 +6458,9 @@ BattleScript_DampStopsExplosion:: call BattleScript_AbilityPopUp printstring STRINGID_PKMNPREVENTSUSAGE pause 0x40 - goto BattleScript_MoveEnd + moveendto MOVEEND_NEXT_TARGET + moveendcase MOVEEND_CLEAR_BITS + end BattleScript_MoveHPDrain_PPLoss:: ppreduce diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a087814097..d637cd3bec 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7850,33 +7850,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; } } From 3a202ea850e8d3babe5367540b0f7d18d79bb39e Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sat, 11 Apr 2020 07:18:45 -0300 Subject: [PATCH 501/667] Made the opponent's self damage induced by the confusion status affect Assurance's power (#313) --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 3775461df4..3ffc8fc21b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5270,7 +5270,7 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) basePower *= 2; break; case EFFECT_ASSURANCE: - if (gProtectStructs[battlerAtk].physicalDmg != 0 || gProtectStructs[battlerAtk].specialDmg != 0) + if (gProtectStructs[battlerAtk].physicalDmg != 0 || gProtectStructs[battlerAtk].specialDmg != 0 || gProtectStructs[battlerDef].confusionSelfDmg != 0) basePower *= 2; break; case EFFECT_TRUMP_CARD: From bfd18749451ef1815028f1d88b3d51ad915560dd Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 11 Apr 2020 12:18:58 +0200 Subject: [PATCH 502/667] Assurance, attacker -> target fix --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 3ffc8fc21b..ea46e3fd49 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5270,7 +5270,7 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) basePower *= 2; break; case EFFECT_ASSURANCE: - if (gProtectStructs[battlerAtk].physicalDmg != 0 || gProtectStructs[battlerAtk].specialDmg != 0 || gProtectStructs[battlerDef].confusionSelfDmg != 0) + if (gProtectStructs[battlerDef].physicalDmg != 0 || gProtectStructs[battlerDef].specialDmg != 0 || gProtectStructs[battlerDef].confusionSelfDmg != 0) basePower *= 2; break; case EFFECT_TRUMP_CARD: From 6078cd3e15362fe99fdb42db2559fb39af3e4ffe Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Sat, 11 Apr 2020 06:24:25 -0400 Subject: [PATCH 503/667] Anticipation ability (#282) --- data/battle_scripts_1.s | 7 +++++++ include/battle_scripts.h | 1 + src/battle_message.c | 5 +++-- src/battle_util.c | 43 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 2 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 994679d837..2d0a530444 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5880,6 +5880,13 @@ BattleScript_IllusionOff:: waitmessage 0x40 return +BattleScript_AnticipationActivates:: + pause 0x5 + call BattleScript_AbilityPopUp + printstring STRINGID_ANTICIPATIONACTIVATES + waitmessage 0x40 + return + BattleScript_AftermathDmg:: pause 0x20 call BattleScript_AbilityPopUp diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 93f4e3b099..f30cec0255 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -330,5 +330,6 @@ extern const u8 BattleScript_DancerActivates[]; extern const u8 BattleScript_AftermathDmg[]; extern const u8 BattleScript_StanceChangeActivates[]; extern const u8 BattleScript_DisguiseBustedActivates[]; +extern const u8 BattleScript_AnticipationActivates[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/src/battle_message.c b/src/battle_message.c index bd2b64b60a..13d8a82c89 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -587,7 +587,7 @@ static const u8 sText_SlowStartEnters[] = _("{B_ATK_NAME_WITH_PREFIX} can't get static const u8 sText_SlowStartEnd[] = _("{B_ATK_NAME_WITH_PREFIX} finally got its 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[] = _("The {B_ATK_NAME_WITH_PREFIX} shuddered in {B_ATK_ABILITY}!"); +static const u8 sText_AnticipationActivates[] = _("The {B_ATK_NAME_WITH_PREFIX} shuddered\nin anticipation!"); static const u8 sText_ForewarnActivates[] = _("{B_ATK_ABILITY} alerted the {B_ATK_NAME_WITH_PREFIX} to the\n{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!"); @@ -1220,7 +1220,8 @@ const u16 gDmgHazardsStringIds[] = const u16 gSwitchInAbilityStringIds[] = { - STRINGID_MOLDBREAKERENTERS, STRINGID_TERAVOLTENTERS, STRINGID_TURBOBLAZEENTERS, STRINGID_SLOWSTARTENTERS, STRINGID_UNNERVEENTERS + STRINGID_MOLDBREAKERENTERS, STRINGID_TERAVOLTENTERS, STRINGID_TURBOBLAZEENTERS, + STRINGID_SLOWSTARTENTERS, STRINGID_UNNERVEENTERS, STRINGID_ANTICIPATIONACTIVATES }; const u16 gMissStringIds[] = diff --git a/src/battle_util.c b/src/battle_util.c index ea46e3fd49..a1567bc814 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2863,6 +2863,49 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA effect++; } break; + case ABILITY_ANTICIPATION: + { + bool16 shudders = FALSE; + u8 side = (GetBattlerPosition(battler) ^ BIT_SIDE) & BIT_SIDE; // side of the opposing pokemon + u8 target1 = GetBattlerAtPosition(side); + u8 target2 = GetBattlerAtPosition(side + BIT_FLANK); + + if (IsBattlerAlive(target1)) + { + for(i = 0; i < MAX_MON_MOVES; i++) + { + move = gBattleMons[target1].moves[i]; + GET_MOVE_TYPE(move, moveType); + if(CalcTypeEffectivenessMultiplier(move, moveType, target1, battler, FALSE) >= UQ_4_12(2.0)) + { + shudders = TRUE; + break; + } + } + } + + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && IsBattlerAlive(target2)) + { + for(i = 0; i < MAX_MON_MOVES; i++) + { + move = gBattleMons[target2].moves[i]; + GET_MOVE_TYPE(move, moveType); + if(CalcTypeEffectivenessMultiplier(move, moveType, target2, battler, FALSE) >= UQ_4_12(2.0)) + { + shudders = TRUE; + break; + } + } + } + if (!gSpecialStatuses[battler].switchInAbilityDone && shudders) + { + gBattleCommunication[MULTISTRING_CHOOSER] = 5; + gSpecialStatuses[battler].switchInAbilityDone = 1; + BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); + effect++; + } + } + break; case ABILITY_DOWNLOAD: if (!gSpecialStatuses[battler].switchInAbilityDone) { From d28992d2ed7f6594f18487cd37ab96de81619e51 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 11 Apr 2020 12:34:53 +0200 Subject: [PATCH 504/667] Anticipation clean-up --- src/battle_message.c | 2 +- src/battle_util.c | 43 +++++++++++++++---------------------------- src/pokemon.c | 20 ++++++++++---------- 3 files changed, 26 insertions(+), 39 deletions(-) diff --git a/src/battle_message.c b/src/battle_message.c index 13d8a82c89..ecae10b521 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -587,7 +587,7 @@ static const u8 sText_SlowStartEnters[] = _("{B_ATK_NAME_WITH_PREFIX} can't get static const u8 sText_SlowStartEnd[] = _("{B_ATK_NAME_WITH_PREFIX} finally got its 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[] = _("The {B_ATK_NAME_WITH_PREFIX} shuddered\nin anticipation!"); +static const u8 sText_AnticipationActivates[] = _("{B_ATK_NAME_WITH_PREFIX} shuddered\nin anticipation!"); static const u8 sText_ForewarnActivates[] = _("{B_ATK_ABILITY} alerted the {B_ATK_NAME_WITH_PREFIX} to the\n{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!"); diff --git a/src/battle_util.c b/src/battle_util.c index a1567bc814..d61fdb57d5 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2734,7 +2734,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA u32 speciesAtk, speciesDef; u32 pidAtk, pidDef; u32 moveType, move; - u32 i; + u32 i, j; if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) return 0; @@ -2864,45 +2864,32 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } break; case ABILITY_ANTICIPATION: + if (!gSpecialStatuses[battler].switchInAbilityDone) { - bool16 shudders = FALSE; - u8 side = (GetBattlerPosition(battler) ^ BIT_SIDE) & BIT_SIDE; // side of the opposing pokemon - u8 target1 = GetBattlerAtPosition(side); - u8 target2 = GetBattlerAtPosition(side + BIT_FLANK); - - if (IsBattlerAlive(target1)) + u32 side = GetBattlerSide(battler); + + for (i = 0; i < MAX_BATTLERS_COUNT; i++) { - for(i = 0; i < MAX_MON_MOVES; i++) + if (IsBattlerAlive(i) && side != GetBattlerSide(i)) { - move = gBattleMons[target1].moves[i]; - GET_MOVE_TYPE(move, moveType); - if(CalcTypeEffectivenessMultiplier(move, moveType, target1, battler, FALSE) >= UQ_4_12(2.0)) + for (j = 0; j < MAX_MON_MOVES; j++) { - shudders = TRUE; - break; + move = gBattleMons[i].moves[j]; + GET_MOVE_TYPE(move, moveType); + if (CalcTypeEffectivenessMultiplier(move, moveType, i, battler, FALSE) >= UQ_4_12(2.0)) + { + effect++; + break; + } } } } - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && IsBattlerAlive(target2)) - { - for(i = 0; i < MAX_MON_MOVES; i++) - { - move = gBattleMons[target2].moves[i]; - GET_MOVE_TYPE(move, moveType); - if(CalcTypeEffectivenessMultiplier(move, moveType, target2, battler, FALSE) >= UQ_4_12(2.0)) - { - shudders = TRUE; - break; - } - } - } - if (!gSpecialStatuses[battler].switchInAbilityDone && shudders) + if (effect) { gBattleCommunication[MULTISTRING_CHOOSER] = 5; gSpecialStatuses[battler].switchInAbilityDone = 1; BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); - effect++; } } break; diff --git a/src/pokemon.c b/src/pokemon.c index 51aefee2b8..eb03ac720d 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -1898,22 +1898,22 @@ static const u8 sDeoxysBaseStats[] = const u16 gLinkPlayerFacilityClasses[NUM_MALE_LINK_FACILITY_CLASSES + NUM_FEMALE_LINK_FACILITY_CLASSES] = { // Male classes - FACILITY_CLASS_COOLTRAINER_M, - FACILITY_CLASS_BLACK_BELT, + FACILITY_CLASS_COOLTRAINER_M, + FACILITY_CLASS_BLACK_BELT, FACILITY_CLASS_CAMPER, - FACILITY_CLASS_YOUNGSTER, - FACILITY_CLASS_PSYCHIC_M, + FACILITY_CLASS_YOUNGSTER, + FACILITY_CLASS_PSYCHIC_M, FACILITY_CLASS_BUG_CATCHER, - FACILITY_CLASS_PKMN_BREEDER_M, + FACILITY_CLASS_PKMN_BREEDER_M, FACILITY_CLASS_GUITARIST, // Female Classes - FACILITY_CLASS_COOLTRAINER_F, - FACILITY_CLASS_HEX_MANIAC, + FACILITY_CLASS_COOLTRAINER_F, + FACILITY_CLASS_HEX_MANIAC, FACILITY_CLASS_PICNICKER, - FACILITY_CLASS_LASS, - FACILITY_CLASS_PSYCHIC_F, + FACILITY_CLASS_LASS, + FACILITY_CLASS_PSYCHIC_F, FACILITY_CLASS_BATTLE_GIRL, - FACILITY_CLASS_PKMN_BREEDER_F, + FACILITY_CLASS_PKMN_BREEDER_F, FACILITY_CLASS_BEAUTY }; From a2a9f259c8a356401bed5a81dee57f4483745bf8 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 11 Apr 2020 13:22:35 +0200 Subject: [PATCH 505/667] Change handlinf of forbidden moves for mimic metronome etc --- src/battle_script_commands.c | 193 +++++++++++++++++------------------ 1 file changed, 93 insertions(+), 100 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d637cd3bec..1e8676d3a2 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -735,47 +735,92 @@ 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 COPYCAT_FORBIDDEN_END 0xFFFF -#define INSTRUCT_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_TRANSFORM, - 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, - MOVE_CIRCLE_THROW, - MOVE_DRAGON_TAIL, - MOVE_RAGE_POWDER, - MOVE_MAT_BLOCK, - MOVE_SPIKY_SHIELD, - MOVE_SHELL_TRAP, - MOVE_SPOTLIGHT, - MOVE_FEINT, - MOVE_KING_S_SHIELD, - 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_KING_S_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 u16 sMoveEffectsForbiddenToInstruct[] = { EFFECT_ASSIST, @@ -788,7 +833,6 @@ static const u16 sMoveEffectsForbiddenToInstruct[] = EFFECT_METRONOME, EFFECT_MIRROR_MOVE, EFFECT_NATURE_POWER, - EFFECT_PLACEHOLDER, EFFECT_RECHARGE, EFFECT_SEMI_INVULNERABLE, //EFFECT_SHELL_TRAP, @@ -799,7 +843,7 @@ static const u16 sMoveEffectsForbiddenToInstruct[] = EFFECT_SOLARBEAM, EFFECT_TRANSFORM, EFFECT_TWO_TURNS_ATTACK, - INSTRUCT_FORBIDDEN_END + FORBIDDEN_INSTRUCT_END }; static const u16 sNaturePowerMoves[] = @@ -7435,12 +7479,7 @@ static void Cmd_various(void) } return; case VARIOUS_TRY_COPYCAT: - for (i = 0; sMovesForbiddenToCopy[i] != COPYCAT_FORBIDDEN_END; i++) - { - if (sMovesForbiddenToCopy[i] == gLastUsedMove) - break; - } - if (gLastUsedMove == 0 || gLastUsedMove == 0xFFFF || sMovesForbiddenToCopy[i] != COPYCAT_FORBIDDEN_END) + if (gLastUsedMove == 0xFFFF || (sForbiddenMoves[gLastUsedMove] & FORBIDDEN_COPYCAT)) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); } @@ -7453,12 +7492,12 @@ static void Cmd_various(void) } return; case VARIOUS_TRY_INSTRUCT: - for (i = 0; sMoveEffectsForbiddenToInstruct[i] != INSTRUCT_FORBIDDEN_END; i++) + 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] != INSTRUCT_FORBIDDEN_END + if (gLastMoves[gBattlerTarget] == 0 || gLastMoves[gBattlerTarget] == 0xFFFF || sMoveEffectsForbiddenToInstruct[i] != FORBIDDEN_INSTRUCT_END || gLastMoves[gBattlerTarget] == MOVE_STRUGGLE || gLastMoves[gBattlerTarget] == MOVE_KING_S_SHIELD) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); @@ -9167,22 +9206,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); @@ -9199,13 +9226,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]; @@ -9222,23 +9249,11 @@ static void Cmd_metronome(void) { while (1) { - s32 i; - gCurrentMove = (Random() % (MOVES_COUNT - 1)) + 1; if (gBattleMoves[gCurrentMove].effect == EFFECT_PLACEHOLDER) continue; - 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]; @@ -9518,15 +9533,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 @@ -9548,19 +9554,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)); @@ -9570,8 +9572,6 @@ static void Cmd_trychoosesleeptalkmove(void) } else // at least one move can be chosen { - u32 movePosition; - do { movePosition = Random() & 3; @@ -10833,14 +10833,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; From 458809c5f779fc6bd67a83d840857e1528373c96 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 12 Apr 2020 12:14:22 +0200 Subject: [PATCH 506/667] Fix Payback not boosting on switching --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index d61fdb57d5..469fc28a09 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5365,7 +5365,7 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) } break; case EFFECT_PAYBACK: - if (GetBattlerTurnOrderNum(battlerAtk) > GetBattlerTurnOrderNum(battlerDef)) + if (GetBattlerTurnOrderNum(battlerAtk) > GetBattlerTurnOrderNum(battlerDef) && gDisableStructs[battlerDef].isFirstTurn != 2) basePower *= 2; break; case EFFECT_ROUND: From 8f61445dfe35cb0b95891b54b2f0922fd8bb8d85 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 12 Apr 2020 12:41:26 +0200 Subject: [PATCH 507/667] Berserk --- include/battle.h | 1 + src/battle_main.c | 6 +++++- src/battle_util.c | 17 +++++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/include/battle.h b/include/battle.h index 9cc78ed41c..bc6031665b 100644 --- a/include/battle.h +++ b/include/battle.h @@ -539,6 +539,7 @@ struct BattleStruct 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]; }; diff --git a/src/battle_main.c b/src/battle_main.c index d860f87cb0..d71ad68f92 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5068,7 +5068,7 @@ void SetTypeBeforeUsingMove(u16 move, u8 battlerAtk) static void HandleAction_UseMove(void) { - u32 side, moveType, var = 4; + u32 i, side, moveType, var = 4; gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; if (gBattleStruct->field_91 & gBitTable[gBattlerAttacker] || !IsBattlerAlive(gBattlerAttacker)) @@ -5316,6 +5316,10 @@ static 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; } diff --git a/src/battle_util.c b/src/battle_util.c index 469fc28a09..6b3b03e938 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3286,6 +3286,23 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA 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_WEAK_ARMOR: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && TARGET_TURN_DAMAGED From 51e2e0ad10c994e22a8ea956945ecad37444ee6b Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 13 Apr 2020 13:06:31 +0200 Subject: [PATCH 508/667] Ability pop-up for levitate and wonder guard --- src/battle_script_commands.c | 2 ++ src/battle_util.c | 4 +--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index df12f1cecf..e524221e79 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1953,6 +1953,8 @@ 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; } diff --git a/src/battle_util.c b/src/battle_util.c index 6b3b03e938..9ae9c1843b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4411,8 +4411,6 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } } break; - case 2: - break; case ITEMEFFECT_MOVE_END: for (battlerId = 0; battlerId < gBattlersCount; battlerId++) { @@ -6198,7 +6196,7 @@ static u16 CalcTypeEffectivenessMultiplierInternal(u16 move, u8 moveType, u8 bat gLastUsedAbility = ABILITY_LEVITATE; gMoveResultFlags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); gLastLandedMoves[battlerDef] = 0; - gBattleCommunication[6] = moveType; + gBattleCommunication[6] = 4; RecordAbilityBattle(battlerDef, ABILITY_LEVITATE); } } From cb5b673f8a5a79027e5e21ade62c96305fa011d0 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 13 Apr 2020 15:00:17 +0200 Subject: [PATCH 509/667] Big Root and STRENGTH Sap --- asm/macros/battle_script.inc | 10 +++++ data/battle_scripts_1.s | 49 +++++++++++++++++++++- include/battle_util.h | 1 + include/constants/battle_move_effects.h | 1 + include/constants/battle_script_commands.h | 3 ++ src/battle_script_commands.c | 16 +++++++ src/battle_util.c | 21 ++++++---- src/data/battle_moves.h | 2 +- 8 files changed, 93 insertions(+), 10 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index fc8ecf8257..8fa8c2d94a 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1678,6 +1678,16 @@ .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 + @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 2d0a530444..4e91dd84e6 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -355,6 +355,53 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectGearUp .4byte BattleScript_EffectIncinerate .4byte BattleScript_EffectBugBite + .4byte BattleScript_EffectStrengthSap + +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 @@ -5196,7 +5243,7 @@ BattleScript_LeechSeedTurnDrain:: datahpupdate BS_ATTACKER copyword gBattleMoveDamage, gHpDealt jumpifability BS_ATTACKER, ABILITY_LIQUID_OOZE, BattleScript_LeechSeedTurnPrintLiquidOoze - manipulatedamage DMG_CHANGE_SIGN + manipulatedamage DMG_BIG_ROOT setbyte cMULTISTRING_CHOOSER, 0x3 goto BattleScript_LeechSeedTurnPrintAndUpdateHp BattleScript_LeechSeedTurnPrintLiquidOoze:: diff --git a/include/battle_util.h b/include/battle_util.h index 92d798f7b2..a7a723221f 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -66,6 +66,7 @@ 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); diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index ea4a76591e..738da3575e 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -343,5 +343,6 @@ #define EFFECT_GEAR_UP 337 #define EFFECT_INCINERATE 338 #define EFFECT_BUG_BITE 339 +#define EFFECT_STRENGTH_SAP 340 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 4e690ab5ea..4d426134c9 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -146,6 +146,8 @@ #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 // Cmd_manipulatedmg #define DMG_CHANGE_SIGN 0 @@ -154,6 +156,7 @@ #define DMG_1_8_TARGET_HP 3 #define DMG_FULL_ATTACKER_HP 4 #define DMG_CURR_ATTACKER_HP 5 +#define DMG_BIG_ROOT 6 // Cmd_jumpifcantswitch #define SWITCH_IGNORE_ESCAPE_PREVENTION 0x80 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e524221e79..b4876cb50a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6789,6 +6789,19 @@ static void Cmd_various(void) else 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_TRACE_ABILITY: gBattleMons[gActiveBattler].ability = gBattleStruct->tracedAbility[gActiveBattler]; break; @@ -8094,6 +8107,9 @@ static void Cmd_manipulatedamage(void) case DMG_CURR_ATTACKER_HP: gBattleMoveDamage = gBattleMons[gBattlerAttacker].hp; break; + case DMG_BIG_ROOT: + gBattleMoveDamage = GetDrainedBigRootHp(gBattlerAttacker, gBattleMoveDamage); + break; } gBattlescriptCurrInstr += 2; diff --git a/src/battle_util.c b/src/battle_util.c index 9ae9c1843b..8fd6084937 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1395,6 +1395,17 @@ enum 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; +} + u8 DoBattlerEndTurnEffects(void) { u32 ability, effect = 0; @@ -1418,10 +1429,7 @@ u8 DoBattlerEndTurnEffects(void) && !(gStatuses3[gActiveBattler] & STATUS3_HEAL_BLOCK) && gBattleMons[gActiveBattler].hp != 0) { - gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; + gBattleMoveDamage = GetDrainedBigRootHp(gActiveBattler, gBattleMons[gActiveBattler].maxHP / 16); BattleScriptExecute(BattleScript_IngrainTurnHeal); effect++; } @@ -1433,10 +1441,7 @@ u8 DoBattlerEndTurnEffects(void) && !(gStatuses3[gActiveBattler] & STATUS3_HEAL_BLOCK) && gBattleMons[gActiveBattler].hp != 0) { - gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - gBattleMoveDamage *= -1; + gBattleMoveDamage = GetDrainedBigRootHp(gActiveBattler, gBattleMons[gActiveBattler].maxHP / 16); BattleScriptExecute(BattleScript_AquaRingHeal); effect++; } diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 52981da1ee..ae054262b4 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -8858,7 +8858,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_STRENGTH_SAP] = { - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_STRENGTH_SAP, .power = 0, .type = TYPE_GRASS, .accuracy = 100, From 2c9ee80004ded387434dcc5372699cadaf7aea6d Mon Sep 17 00:00:00 2001 From: MandL27 <10366615+MandL27@users.noreply.github.com> Date: Mon, 13 Apr 2020 09:05:10 -0400 Subject: [PATCH 510/667] Gen 4+ moves get contest effects (#319) * Add contest move effects * Fix constants and also fix some laughable combo coding * comment usum moves for cleaner merge * clean up gitignore * revert gitignore * also revert moves.h because I'm bad at reading messages * add some missing effects because the spreadsheet I sourced is bad --- include/contest.h | 136 +- include/contest_effect.h | 3 +- src/contest_effect.c | 19 +- src/data/contest_moves.h | 3100 ++++++++++++++++++++++++++++++++++---- 4 files changed, 2887 insertions(+), 371 deletions(-) diff --git a/include/contest.h b/include/contest.h index 00c3191eb5..f20aa4c019 100644 --- a/include/contest.h +++ b/include/contest.h @@ -69,68 +69,90 @@ enum enum { - COMBO_STARTER_RAIN_DANCE = 1, - COMBO_STARTER_RAGE, - COMBO_STARTER_FOCUS_ENERGY, - COMBO_STARTER_HYPNOSIS, - COMBO_STARTER_ENDURE, - COMBO_STARTER_HORN_ATTACK, - COMBO_STARTER_SWORDS_DANCE, - COMBO_STARTER_STOCKPILE, - COMBO_STARTER_SUNNY_DAY, - COMBO_STARTER_REST, - COMBO_STARTER_VICE_GRIP, - COMBO_STARTER_DEFENSE_CURL, - COMBO_STARTER_CHARGE, - COMBO_STARTER_ROCK_THROW, - COMBO_STARTER_YAWN, - COMBO_STARTER_SCARY_FACE, - COMBO_STARTER_POWDER_SNOW, - COMBO_STARTER_LOCK_ON, - COMBO_STARTER_SOFT_BOILED, - COMBO_STARTER_MEAN_LOOK, - COMBO_STARTER_SCRATCH, - COMBO_STARTER_GROWTH, - COMBO_STARTER_HAIL, - COMBO_STARTER_SANDSTORM, - COMBO_STARTER_BELLY_DRUM, - COMBO_STARTER_MIND_READER, - COMBO_STARTER_DRAGON_BREATH, - COMBO_STARTER_DRAGON_RAGE, - COMBO_STARTER_DRAGON_DANCE, - COMBO_STARTER_SURF, - COMBO_STARTER_DIVE, - COMBO_STARTER_STRING_SHOT, - COMBO_STARTER_LEER, - COMBO_STARTER_TAUNT, - COMBO_STARTER_CHARM, - COMBO_STARTER_HARDEN, - COMBO_STARTER_SING, - COMBO_STARTER_EARTHQUAKE, - COMBO_STARTER_DOUBLE_TEAM, - COMBO_STARTER_CURSE, - COMBO_STARTER_SWEET_SCENT, - COMBO_STARTER_SLUDGE, - COMBO_STARTER_SLUDGE_BOMB, - COMBO_STARTER_THUNDER_PUNCH, + COMBO_STARTER_POUND = 1, COMBO_STARTER_FIRE_PUNCH, COMBO_STARTER_ICE_PUNCH, - COMBO_STARTER_PECK, - COMBO_STARTER_METAL_SOUND, - COMBO_STARTER_MUD_SPORT, - COMBO_STARTER_WATER_SPORT, - COMBO_STARTER_BONE_CLUB, - COMBO_STARTER_BONEMERANG, - COMBO_STARTER_BONE_RUSH, + COMBO_STARTER_THUNDER_PUNCH, + COMBO_STARTER_SCRATCH, + COMBO_STARTER_VICE_GRIP, + COMBO_STARTER_SWORDS_DANCE, COMBO_STARTER_SAND_ATTACK, - COMBO_STARTER_MUD_SLAP, - COMBO_STARTER_FAKE_OUT, - COMBO_STARTER_PSYCHIC, - COMBO_STARTER_KINESIS, + COMBO_STARTER_HORN_ATTACK, + COMBO_STARTER_LEER, + COMBO_STARTER_SING, + COMBO_STARTER_SURF, + COMBO_STARTER_PECK, + COMBO_STARTER_LEECH_SEED, + COMBO_STARTER_GROWTH, + COMBO_STARTER_STRING_SHOT, + COMBO_STARTER_DRAGON_RAGE, + COMBO_STARTER_ROCK_THROW, + COMBO_STARTER_EARTHQUAKE, + COMBO_STARTER_TOXIC, COMBO_STARTER_CONFUSION, - COMBO_STARTER_POUND, + COMBO_STARTER_PSYCHIC, + COMBO_STARTER_HYPNOSIS, + COMBO_STARTER_RAGE, + COMBO_STARTER_DOUBLE_TEAM, + COMBO_STARTER_HARDEN, + COMBO_STARTER_DEFENSE_CURL, + COMBO_STARTER_FOCUS_ENERGY, COMBO_STARTER_SMOG, - COMBO_STARTER_CALM_MIND + COMBO_STARTER_SLUDGE, + COMBO_STARTER_BONE_CLUB, + COMBO_STARTER_KINESIS, + COMBO_STARTER_SOFT_BOILED, + COMBO_STARTER_BONEMERANG, + COMBO_STARTER_REST, + COMBO_STARTER_MIND_READER, + COMBO_STARTER_CURSE, + COMBO_STARTER_POWDER_SNOW, + COMBO_STARTER_SCARY_FACE, + COMBO_STARTER_BELLY_DRUM, + COMBO_STARTER_SLUDGE_BOMB, + COMBO_STARTER_MUD_SLAP, + COMBO_STARTER_BONE_RUSH, + COMBO_STARTER_LOCK_ON, + COMBO_STARTER_SANDSTORM, + COMBO_STARTER_ENDURE, + COMBO_STARTER_CHARM, + COMBO_STARTER_MEAN_LOOK, + COMBO_STARTER_HEAL_BELL, + COMBO_STARTER_DRAGON_BREATH, + COMBO_STARTER_SWEET_SCENT, + COMBO_STARTER_RAIN_DANCE, + COMBO_STARTER_SUNNY_DAY, + COMBO_STARTER_FAKE_OUT, + COMBO_STARTER_STOCKPILE, + COMBO_STARTER_HAIL, + COMBO_STARTER_CHARGE, + COMBO_STARTER_TAUNT, + COMBO_STARTER_REVENGE, + COMBO_STARTER_YAWN, + COMBO_STARTER_DIVE, + COMBO_STARTER_MUD_SPORT, + COMBO_STARTER_METAL_SOUND, + COMBO_STARTER_WATER_SPORT, + COMBO_STARTER_CALM_MIND, + COMBO_STARTER_DRAGON_DANCE, + COMBO_STARTER_PAYBACK, + COMBO_STARTER_LUCKY_CHANT, + COMBO_STARTER_WORRY_SEED, + COMBO_STARTER_DRAGON_RUSH, + COMBO_STARTER_BRAVE_BIRD, + COMBO_STARTER_THUNDER_FANG, + COMBO_STARTER_ICE_FANG, + COMBO_STARTER_FIRE_FANG, + COMBO_STARTER_ATTACK_ORDER, + COMBO_STARTER_DEFEND_ORDER, + COMBO_STARTER_HEAL_ORDER, + COMBO_STARTER_SCALD, + COMBO_STARTER_DRAGON_TAIL, + COMBO_STARTER_HYPERSPACE_HOLE, + COMBO_STARTER_THOUSAND_ARROWS, + COMBO_STARTER_THOUSAND_WAVES, + COMBO_STARTER_HYPERSPACE_FURY, + COMBO_STARTER_SHADOW_BONE }; enum 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/src/contest_effect.c b/src/contest_effect.c index e3919b353c..9aa41e52d2 100644 --- a/src/contest_effect.c +++ b/src/contest_effect.c @@ -59,19 +59,22 @@ static s16 RoundUp(s16); bool8 AreMovesContestCombo(u16 lastMove, u16 nextMove) { - u8 nextMoveComboMoves[4]; 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 + { + int i; + for (i = 0; i < MAX_COMBO_MOVES; i++) + { + if (lastMoveComboStarterId == gContestMoves[nextMove].comboMoves[i]) + return TRUE; + } return FALSE; + } } // A highly appealing move. @@ -424,7 +427,7 @@ static void ContestEffect_MakeFollowingMonsNervous(void) for (i = 0; i < 4; i++) { if (eContestantStatus[i].hasJudgesAttention && sub_80DE1E8(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; diff --git a/src/data/contest_moves.h b/src/data/contest_moves.h index 5460ac806f..d049837b4e 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,2569 @@ 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_FOREST_S_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_KING_S_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_LAND_S_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} + }, + + // uncomment these after adding usum moves + //[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} + //}, }; const struct ContestEffect gContestEffects[] = @@ -3126,75 +5685,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, From 51e163951347f2d3c7935ad8cfdae56d0b897816 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 13 Apr 2020 15:49:40 +0200 Subject: [PATCH 511/667] Magic Guard protects from stuff --- data/battle_scripts_1.s | 6 ++++-- src/battle_script_commands.c | 9 ++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 4e91dd84e6..50198442aa 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2709,6 +2709,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 @@ -5969,13 +5970,13 @@ 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:: @@ -6120,6 +6121,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 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b4876cb50a..df3a48c56c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5518,6 +5518,7 @@ static void Cmd_switchineffects(void) if (!(gSideStatuses[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_SPIKES_DAMAGED) && (gSideStatuses[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_SPIKES) + && GetBattlerAbility(gActiveBattler) != ABILITY_MAGIC_GUARD && IsBattlerGrounded(gActiveBattler)) { u8 spikesDmg = (5 - gSideTimers[GetBattlerSide(gActiveBattler)].spikesAmount) * 2; @@ -5529,7 +5530,8 @@ static void Cmd_switchineffects(void) SetDmgHazardsBattlescript(gActiveBattler, 0); } else if (!(gSideStatuses[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_STEALTH_ROCK_DAMAGED) - && (gSideStatuses[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_STEALTH_ROCK)) + && (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); @@ -8991,10 +8993,11 @@ static void Cmd_setsandstorm(void) static void Cmd_weatherdamage(void) { + u32 ability = GetBattlerAbility(gBattlerAttacker); + gBattleMoveDamage = 0; - if (IsBattlerAlive(gBattlerAttacker) && WEATHER_HAS_EFFECT) + if (IsBattlerAlive(gBattlerAttacker) && WEATHER_HAS_EFFECT && ability != ABILITY_MAGIC_GUARD) { - u32 ability = GetBattlerAbility(gBattlerAttacker); if (gBattleWeather & WEATHER_SANDSTORM_ANY) { if (!IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ROCK) From 2b9eb00486539b384a59bc403eb67bae82cd7ad7 Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Tue, 14 Apr 2020 03:27:29 -0400 Subject: [PATCH 512/667] Mind blown (#302) * Mind Blown Part 1 (Definition and self-damage) * Mind Blown Part 2 (Damp interaction) --- asm/macros/battle_script.inc | 4 ++++ data/battle_scripts_1.s | 14 ++++++++++++++ include/constants/battle_move_effects.h | 1 + include/constants/battle_script_commands.h | 3 ++- include/constants/moves.h | 3 ++- src/battle_ai_script_commands.c | 1 + src/battle_script_commands.c | 3 +++ src/data/battle_moves.h | 14 ++++++++++++++ src/data/text/move_descriptions.h | 5 +++++ src/data/text/move_names.h | 1 + 10 files changed, 47 insertions(+), 2 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 8fa8c2d94a..410c72a3ae 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1782,6 +1782,10 @@ 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 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 50198442aa..4767ad33fd 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -356,6 +356,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectIncinerate .4byte BattleScript_EffectBugBite .4byte BattleScript_EffectStrengthSap + .4byte BattleScript_EffectMindBlown BattleScript_EffectStrengthSap: setstatchanger STAT_ATK, 1, TRUE @@ -2227,6 +2228,19 @@ 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: bichalfword gMoveResultFlags, MOVE_RESULT_MISSED attackanimation diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 738da3575e..971f14adf5 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -344,5 +344,6 @@ #define EFFECT_INCINERATE 338 #define EFFECT_BUG_BITE 339 #define EFFECT_STRENGTH_SAP 340 +#define EFFECT_MIND_BLOWN 341 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 4d426134c9..bee610bdcb 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -149,7 +149,7 @@ #define VARIOUS_GET_STAT_VALUE 86 #define VARIOUS_JUMP_IF_FULL_HP 87 -// Cmd_manipulatedmg +// Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 #define DMG_RECOIL_FROM_MISS 1 #define DMG_DOUBLED 2 @@ -157,6 +157,7 @@ #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 diff --git a/include/constants/moves.h b/include/constants/moves.h index 9edf402efd..dcfc74861e 100644 --- a/include/constants/moves.h +++ b/include/constants/moves.h @@ -690,8 +690,9 @@ #define MOVE_ZING_ZAP 670 #define MOVE_NATURES_MADNESS 671 #define MOVE_MULTI_ATTACK 672 +#define MOVE_MIND_BLOWN 673 -#define MOVES_COUNT_GEN7 673 +#define MOVES_COUNT_GEN7 674 #define MOVES_COUNT MOVES_COUNT_GEN7 diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index adcd0f2349..3cc1566a02 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -316,6 +316,7 @@ static const u16 sDiscouragedPowerfulMoveEffects[] = EFFECT_SUPERPOWER, EFFECT_ERUPTION, EFFECT_OVERHEAT, + EFFECT_MIND_BLOWN, 0xFFFF }; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index df3a48c56c..5b01933827 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8112,6 +8112,9 @@ static void Cmd_manipulatedamage(void) case DMG_BIG_ROOT: gBattleMoveDamage = GetDrainedBigRootHp(gBattlerAttacker, gBattleMoveDamage); break; + case DMG_1_2_ATTACKER_HP: + gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 2; + break; } gBattlescriptCurrInstr += 2; diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index ae054262b4..d8463df563 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -9443,4 +9443,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .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, + }, }; diff --git a/src/data/text/move_descriptions.h b/src/data/text/move_descriptions.h index 5b959eb97e..4832365afc 100644 --- a/src/data/text/move_descriptions.h +++ b/src/data/text/move_descriptions.h @@ -2533,6 +2533,10 @@ 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 sNotDoneYetDescription[] = _( "Not done yet."); @@ -3212,4 +3216,5 @@ const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] = [MOVE_ZING_ZAP - 1] = sZING_ZAPDescription, [MOVE_NATURES_MADNESS - 1] = sNATURES_MADNESSDescription, [MOVE_MULTI_ATTACK - 1] = sMULTI_ATTACKDescription, + [MOVE_MIND_BLOWN - 1] = sMIND_BLOWNDescription, }; diff --git a/src/data/text/move_names.h b/src/data/text/move_names.h index 25d7460a52..a1e8db6514 100644 --- a/src/data/text/move_names.h +++ b/src/data/text/move_names.h @@ -673,4 +673,5 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_ZING_ZAP] = _("Zing Zap"), [MOVE_NATURES_MADNESS] = _("Nature's Mad"), [MOVE_MULTI_ATTACK] = _("Multi-Attack"), + [MOVE_MIND_BLOWN] = _("Mind Blown"), }; From 8ea7fcc348dbad2976cff542c0a21e5aca7965d3 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 14 Apr 2020 13:40:27 +0200 Subject: [PATCH 513/667] better ai debug --- include/battle.h | 1 + include/battle_ai_script_commands.h | 1 + src/battle_ai_script_commands.c | 17 ++-- src/battle_debug.c | 147 +++++++++++++++++++++++++--- src/battle_script_commands.c | 2 +- 5 files changed, 147 insertions(+), 21 deletions(-) diff --git a/include/battle.h b/include/battle.h index bc6031665b..45534126ec 100644 --- a/include/battle.h +++ b/include/battle.h @@ -542,6 +542,7 @@ struct BattleStruct 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 }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/include/battle_ai_script_commands.h b/include/battle_ai_script_commands.h index 9f6654a465..ef927f88bc 100644 --- a/include/battle_ai_script_commands.h +++ b/include/battle_ai_script_commands.h @@ -15,6 +15,7 @@ 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 RecordAbilityBattle(u8 battlerId, u8 abilityId); void ClearBattlerAbilityHistory(u8 battlerId); diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 3cc1566a02..1c8fb6b0dc 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -429,7 +429,7 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves) u8 BattleAI_ChooseMoveOrAction(void) { - u16 savedCurrentMove = gCurrentMove; + u32 savedCurrentMove = gCurrentMove; u8 ret; if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) @@ -470,7 +470,7 @@ static u8 ChooseMoveOrAction_Singles(void) { u8 currentMoveArray[MAX_MON_MOVES]; u8 consideredMoveArray[MAX_MON_MOVES]; - u8 numOfBestMoves; + u32 numOfBestMoves; s32 i, id; u32 flags = AI_THINKING_STRUCT->aiFlags; @@ -488,6 +488,9 @@ static u8 ChooseMoveOrAction_Singles(void) 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; @@ -649,6 +652,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]; } } @@ -738,7 +744,7 @@ static void RecordLastUsedMoveByTarget(void) } } -static bool32 IsBattlerAIControlled(u32 battlerId) +bool32 IsBattlerAIControlled(u32 battlerId) { switch (GetBattlerPosition(battlerId)) { @@ -748,10 +754,7 @@ static bool32 IsBattlerAIControlled(u32 battlerId) case B_POSITION_OPPONENT_LEFT: return TRUE; case B_POSITION_PLAYER_RIGHT: - if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) - return FALSE; - else - return TRUE; + return ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) != 0); case B_POSITION_OPPONENT_RIGHT: return TRUE; } diff --git a/src/battle_debug.c b/src/battle_debug.c index fa88e5708b..4b86b99631 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -7,6 +7,7 @@ #include "menu_helpers.h" #include "scanline_effect.h" #include "palette.h" +#include "pokemon_icon.h" #include "sprite.h" #include "item.h" #include "task.h" @@ -17,7 +18,10 @@ #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" @@ -65,6 +69,12 @@ struct BattleDebugMenu 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 @@ -521,8 +531,8 @@ static const struct BgTemplate sBgTemplates[] = }, { .bg = 1, - .charBaseIndex = 2, - .mapBaseIndex = 29, + .charBaseIndex = 10, + .mapBaseIndex = 20, .screenSize = 0, .paletteMode = 0, .priority = 0, @@ -571,6 +581,7 @@ 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) @@ -673,6 +684,121 @@ void CB2_BattleDebugMenu(void) } } +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) @@ -712,6 +838,11 @@ static void Task_DebugMenuProcessInput(u8 taskId) 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. @@ -906,8 +1037,7 @@ static void CreateSecondaryListMenu(struct BattleDebugMenu *data) itemsCount = ARRAY_COUNT(sSideStatusListItems); break; case LIST_ITEM_AI_MOVES_PTS: - itemsCount = 4; - break; + return; } data->secondaryListItemCount = itemsCount; @@ -966,7 +1096,6 @@ static void PrintSecondaryEntries(struct BattleDebugMenu *data) { case LIST_ITEM_MOVES: case LIST_ITEM_PP: - case LIST_ITEM_AI_MOVES_PTS: for (i = 0; i < 4; i++) { PadString(gMoveNames[gBattleMons[data->battlerId].moves[i]], text); @@ -1338,14 +1467,6 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) data->modifyArrows.typeOfVal = VAL_U8; data->modifyArrows.currValue = gBattleMons[data->battlerId].pp[data->currentSecondaryListItemId]; break; - case LIST_ITEM_AI_MOVES_PTS: - data->modifyArrows.minValue = 0; - data->modifyArrows.maxValue = 255; - data->modifyArrows.maxDigits = 3; - data->modifyArrows.modifiedValPtr = gBattleResources->ai->score; - data->modifyArrows.typeOfVal = VAL_S8; - data->modifyArrows.currValue = gBattleResources->ai->score[data->currentSecondaryListItemId]; - break; case LIST_ITEM_HELD_ITEM: data->modifyArrows.minValue = 0; data->modifyArrows.maxValue = ITEMS_COUNT - 1; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 5b01933827..f292d16d92 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10741,7 +10741,7 @@ static void Cmd_tryswapabilities(void) // skill swap return; } - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } From 83b251a69c7e2c2bc727ed26836f2031930e459c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 15 Apr 2020 09:37:12 +0200 Subject: [PATCH 514/667] Stamina, Liquid Voice, Water Compaction --- src/battle_main.c | 5 +++++ src/battle_util.c | 25 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/battle_main.c b/src/battle_main.c index d71ad68f92..f5eaaaec7c 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5055,6 +5055,11 @@ void SetTypeBeforeUsingMove(u16 move, u8 battlerAtk) 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); diff --git a/src/battle_util.c b/src/battle_util.c index 8fd6084937..3d127c0b0f 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3291,6 +3291,31 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA 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 From 81617eb5774dbac030c5a4797120e907b9ec4ff8 Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Wed, 15 Apr 2020 08:45:07 -0400 Subject: [PATCH 515/667] Overworld effects (#245) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Snow Cloak's overworld effect. (reduces the chance of encountering wild Pokémon on Snow by 50%) * Quick Feet's overworld effect. (reduces the chance of encountering wild Pokémon by 50%) * No Guard's overworld effect. (raises the chance of encountering wild Pokémon by 50%) * Honey Gather. * Checks if honey is defined. * Applied review changes. * Fixed pointer reference * Applied requested changes. * Using weather constants. --- src/battle_script_commands.c | 26 ++++++++++++++++++++++++++ src/wild_encounter.c | 6 ++++++ 2 files changed, 32 insertions(+) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f292d16d92..b3aaf8647c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -11030,6 +11030,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 @@ -11070,6 +11083,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 } } diff --git a/src/wild_encounter.c b/src/wild_encounter.c index ca488f955c..9d791c34c6 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -496,6 +496,12 @@ 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_NO_GUARD) + encounterRate = encounterRate * 3 / 2; } if (encounterRate > 2880) encounterRate = 2880; From 90486324c6f195293d3e67f8166d7fe026fe4007 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 16 Apr 2020 16:52:25 +0200 Subject: [PATCH 516/667] Animation for Tupsy Toruvy --- data/battle_anim_scripts.s | 14 ++++++++ src/battle_anim_mon_movement.c | 66 ++++++++++++++++++++++++++++++++++ src/battle_message.c | 2 +- 3 files changed, 81 insertions(+), 1 deletion(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 2244d54c46..3d90bb4755 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -4372,6 +4372,20 @@ Move_PARTING_SHOT: 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_HI_TURUN, SOUND_PAN_TARGET + delay 116 + createsprite gSimplePaletteBlendSpriteTemplate ANIM_TARGET, 2, 4, 5, 8, 0, RGB(9, 0, 16) + playsewithpan SE_RU_HYUU, SOUND_PAN_TARGET + waitforvisualfinish + createsprite gSimplePaletteBlendSpriteTemplate ANIM_TARGET, 2, 1, 2, 4, 0, RGB_BLACK + waitforvisualfinish + blendoff end Move_DRAINING_KISS: diff --git a/src/battle_anim_mon_movement.c b/src/battle_anim_mon_movement.c index 8aa7f2cbbe..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 = { @@ -1062,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_message.c b/src/battle_message.c index ecae10b521..d84caf6bf5 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -617,7 +617,7 @@ static const u8 sText_PkmnBlewAwayStealthRock[] = _("{B_ATK_NAME_WITH_PREFIX} bl 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_ATK_NAME_WITH_PREFIX}'s stat changes were\nall reversed!"); +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!"); From 01b6b63e9981ce02da4a42ee1bcca7cafe01b9f3 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 17 Apr 2020 17:44:28 +0200 Subject: [PATCH 517/667] Some more move animations. Thanks Doesnt --- data/battle_anim_scripts.s | 693 ++++++++++++++++++++++++++++++++++--- data/battle_scripts_1.s | 5 +- src/battle_anim_fire.c | 6 +- src/battle_anim_flying.c | 3 +- src/battle_anim_normal.c | 16 +- src/battle_anim_poison.c | 3 +- 6 files changed, 654 insertions(+), 72 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 3d90bb4755..877a0feed8 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1008,13 +1008,14 @@ Move_U_TURN: playsewithpan SE_W019, SOUND_PAN_ATTACKER createsprite gFlyBallUpSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 13, 336 playsewithpan SE_W104, SOUND_PAN_ATTACKER - createsprite gFlyBallAttackSpriteTemplate, ANIM_ATTACKER, 2, 20 + createsprite gFlyBallAttackSpriteTemplate, ANIM_ATTACKER, 2, 20, TRUE delay 20 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 0 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 playsewithpan SE_W013, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER + invisible ANIM_ATTACKER blendoff waitforvisualfinish end @@ -1881,6 +1882,31 @@ Move_POISON_JAB: 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_W060, 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: @@ -2340,7 +2366,7 @@ Move_GIGA_IMPACT: createsprite gComplexPaletteBlendSpriteTemplate, 2, 7, 31, 3, 1, 0, 10, 0, 0 createsprite gBasicHitSplatSpriteTemplate, 4, 4, -10, 0, 1, 0 playsewithpan SE_W025B, SOUND_PAN_TARGET - call GigaImpactAction + call SetImpactBackground delay 1 createsprite gSlideMonToOffsetSpriteTemplate 2, 5, 1, -16, 0, 0, 4 waitforvisualfinish @@ -2356,28 +2382,14 @@ Move_GIGA_IMPACT: restorebg waitbgfadein end -GigaImpactAction: - delay 2, - createvisualtask AnimTask_IsContest, 2, 0 - jumpargeq 7, 1, GigaImpactBgContest - createvisualtask AnimTask_IsTargetPlayerSide, 2, 0 - jumpargeq 7, 0, GigaImpactBgOpponent - jumpargeq 7, 1, GigaImpactBgPlayer -GigaImpactBgContest: - changebg BG_GIGA_IMPACT_CONTEST - goto GigaImpactReturnToEnd -GigaImpactReturnToEnd: - return -GigaImpactBgOpponent: - changebg BG_GIGA_IMPACT_OPPONENT - goto GigaImpactReturnToEnd -GigaImpactBgPlayer: - changebg BG_GIGA_IMPACT_PLAYER - return Move_NASTY_PLOT: loadspritegfx ANIM_TAG_AMNESIA - call NastyPlotAction + fadetobg BG_DARK + waitbgfadeout + createvisualtask AnimTask_FadeScreenToWhite, 5 + waitbgfadein + return delay 8 createsprite gQuestionMarkSpriteTemplate, 20, 0 playsewithpan SE_W118, SOUND_PAN_ATTACKER, @@ -2386,12 +2398,6 @@ Move_NASTY_PLOT: waitforvisualfinish call UnsetPsychicBg end -NastyPlotAction: - fadetobg BG_DARK - waitbgfadeout - createvisualtask AnimTask_FadeScreenToWhite, 5 - waitbgfadein - return Move_BULLET_PUNCH: loadspritegfx ANIM_TAG_IMPACT @@ -2568,7 +2574,7 @@ Move_THUNDER_FANG: setalpha 12, 8 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 2, 0, 16, RGB_BLACK waitforvisualfinish - 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 @@ -2581,7 +2587,7 @@ Move_THUNDER_FANG: createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, 4, 0, -819, 10 delay 1 playsewithpan SE_W161B, SOUND_PAN_TARGET - createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257 + 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 @@ -3429,6 +3435,44 @@ Move_JUDGMENT: end 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_W044, 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_W044, 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_W044, 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: @@ -3485,6 +3529,29 @@ Move_CHARGE_BEAM: end Move_WOOD_HAMMER: + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_W207, 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_W025B, 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: @@ -3878,7 +3945,25 @@ ShadowForceBg: 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_W010, SOUND_PAN_TARGET + createsprite gFurySwipesSpriteTemplate, ANIM_TARGET, 2, 16, 0, 1 + delay 10 + createsprite gHorizontalLungeSpriteTemplate, ANIM_TARGET, 2, 2, 2 + delay 4 + playsewithpan SE_W010, SOUND_PAN_TARGET + createsprite gFurySwipesSpriteTemplate, ANIM_TARGET, 2, -16, 0, 0 + delay 10 + return Move_WIDE_GUARD: end @@ -3893,9 +3978,45 @@ Move_WONDER_ROOM: 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_W048, 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_W092, SOUND_PAN_TARGET + delay 5 + createsprite gToxicBubbleSpriteTemplate, ANIM_TARGET, 2, -16, 16, 1, 1 + playsewithpan SE_W092, SOUND_PAN_TARGET + delay 5 + createsprite gToxicBubbleSpriteTemplate, ANIM_TARGET, 2, -8, 16, 1, 1 + playsewithpan SE_W092, SOUND_PAN_TARGET + delay 5 + createsprite gToxicBubbleSpriteTemplate, ANIM_TARGET, 2, 0, 16, 1, 1 + playsewithpan SE_W092, SOUND_PAN_TARGET + delay 5 + createsprite gToxicBubbleSpriteTemplate, ANIM_TARGET, 2, 8, 16, 1, 1 + playsewithpan SE_W092, SOUND_PAN_TARGET + delay 5 + createsprite gToxicBubbleSpriteTemplate, ANIM_TARGET, 2, 16, 16, 1, 1 + playsewithpan SE_W092, SOUND_PAN_TARGET + delay 5 + createsprite gToxicBubbleSpriteTemplate, ANIM_TARGET, 2, 24, 16, 1, 1 + playsewithpan SE_W092, SOUND_PAN_TARGET + delay 5 + waitforvisualfinish + delay 15 end Move_AUTOTOMIZE: @@ -3913,19 +4034,112 @@ Move_MAGIC_ROOM: Move_SMACK_DOWN: end -Move_STORM_THROW: +Move_STORM_THROW: + call StormThorwAnim + call StormThorwAnim + call StormThorwAnim + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + playsewithpan SE_W207, SOUND_PAN_TARGET + delay 1 + createvisualtask AnimTask_RotateMonSpriteToSide, 2, 10, 0xC00, 1, 2 + playsewithpan SE_W233B, 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_W207, 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_W172, 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_W120, SOUND_PAN_TARGET + delay 3 + createsprite gExplosionSpriteTemplate, ANIM_TARGET, 4, 14, -14, 1, 0 + playsewithpan SE_W120, SOUND_PAN_TARGET + waitforvisualfinish end Move_SLUDGE_WAVE: end Move_QUIVER_DANCE: + loadspritegfx ANIM_TAG_HOLLOW_ORB + monbg ANIM_ATTACKER + call SetBugBg + createvisualtask AnimTask_DragonDanceWaver, 5 + playsewithpan SE_W100, 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_W100, SOUND_PAN_ATTACKER + delay 30 + playsewithpan SE_W100, SOUND_PAN_ATTACKER + waitforvisualfinish + clearmonbg ANIM_ATTACKER + call UnsetBugBg end Move_HEAVY_SLAM: + loadspritegfx ANIM_TAG_CLAW_SLASH + loadspritegfx ANIM_TAG_IMPACT + loopsewithpan SE_W231, SOUND_PAN_ATTACKER, 28, 2 + createvisualtask AnimTask_MetallicShine, 5, 0, 0, 0 + waitforvisualfinish + monbg ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_W036, 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_W025B, 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: @@ -3935,6 +4149,38 @@ Move_ELECTRO_BALL: 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_W145, 192 + delay 2 + createsprite gWaterGunProjectileSpriteTemplate, ANIM_ATTACKER, 2, 20, 0, 5, 0, 40, -25 + playsewithpan SE_W145, 192 + delay 2 + createsprite gWaterGunProjectileSpriteTemplate, ANIM_ATTACKER, 2, 20, 0, -5, 0, 40, -25 + playsewithpan SE_W145, 192 + delay 30 + playsewithpan SE_W127, 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: @@ -3947,6 +4193,29 @@ Move_LOW_SWEEP: end Move_ACID_SPRAY: + loadspritegfx ANIM_TAG_POISON_BUBBLE + monbg ANIM_TARGET + createsprite gAcidPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, 20, 0, 40, 1, 0, -20 + playsewithpan SE_W145C, 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_W291, 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: @@ -3960,8 +4229,27 @@ Move_ENTRAINMENT: Move_AFTER_YOU: 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: @@ -3971,9 +4259,61 @@ Move_CHIP_AWAY: 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_W054, SOUND_PAN_TARGET, 17, 10 + call ClearSmogCloud + call ClearSmogCloud + call ClearSmogCloud + call ClearSmogCloud + call ClearSmogCloud + call ClearSmogCloud + call ClearSmogCloud + delay 120 + loopsewithpan SE_W092, 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_W036, SOUND_PAN_ATTACKER + createvisualtask AnimTask_SpitUpDeformMon, 5 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 1, 0, 8, 2 + delay 45 + playsewithpan SE_W255, 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_W003, SOUND_PAN_TARGET + createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, -12, 10, 1, 1 + delay 5 + playsewithpan SE_W003, SOUND_PAN_TARGET + createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 3, 12, -10, 1, 1 + waitforvisualfinish + call UnsetPsychicBg + waitforvisualfinish end Move_QUICK_GUARD: @@ -3989,6 +4329,34 @@ Move_SHELL_SMASH: end Move_HEAL_PULSE: + loadspritegfx ANIM_TAG_GREEN_SPARKLE + loadspritegfx ANIM_TAG_BLUE_STAR + loadspritegfx ANIM_TAG_THIN_RING + playsewithpan SE_W234, 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: @@ -4047,6 +4415,22 @@ Move_QUASH: end Move_ACROBATICS: + loadspritegfx ANIM_TAG_ROUND_SHADOW + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_W019, SOUND_PAN_ATTACKER + createsprite gFlyBallUpSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 13, 336 + waitforvisualfinish + playsewithpan SE_W207, SOUND_PAN_TARGET + createsprite gBounceBallLandSpriteTemplate, ANIM_TARGET, 3 + delay 7 + playsewithpan SE_W025B, 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: @@ -4062,7 +4446,48 @@ Move_BESTOW: end Move_INFERNO: + loadspritegfx ANIM_TAG_SMALL_EMBER + call SetImpactBackground + loopsewithpan SE_W221B, SOUND_PAN_TARGET, 40, 4 + createvisualtask AnimTask_ShakeMon, 5, 1, 0, 2, 94, 1 + createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 1, 0, 9, 31 + call InfernoAnim + call InfernoAnim + call InfernoAnim + call InfernoAnim + call InfernoAnim + call InfernoAnim + createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 1, 9, 0, 31 + 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: end @@ -4074,6 +4499,29 @@ Move_GRASS_PLEDGE: 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_W268, 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_W085B, SOUND_PAN_ATTACKER + createvisualtask AnimTask_SlideOffScreen, 5, ANIM_ATTACKER, -2 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + blendoff + invisible ANIM_ATTACKER + delay 8 end Move_STRUGGLE_BUG: @@ -4089,6 +4537,37 @@ Move_DRAGON_TAIL: end Move_WORK_UP: + loadspritegfx ANIM_TAG_FOCUS_ENERGY + playsewithpan SE_W082, 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: @@ -4145,6 +4624,29 @@ Move_LEAF_TORNADO: end 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_W025B, 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: @@ -4154,6 +4656,20 @@ Move_NIGHT_DAZE: 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_W048, 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: @@ -4281,6 +4797,24 @@ 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: @@ -4413,9 +4947,56 @@ Move_FAIRY_WIND: 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_W112, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 3, 0 + delay 40 + playsewithpan SE_W081, SOUND_PAN_ATTACKER + createsprite gMistBallSpriteTemplate, ANIM_ATTACKER, 5, 0, 0, 0, 0, 30, 0 + delay 30 + loopsewithpan SE_W048, 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 | 0x2 | 0x4 | 0x8 + 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 SoundTask_WaitForCry, 2, 1, 0, 6, 1 + delay 20 + playsewithpan SE_W153, SOUND_PAN_ATTACKER + createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 1 + delay 4 + playsewithpan SE_W153, SOUND_PAN_ATTACKER + createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 24, -24, 1, 1 + delay 4 + playsewithpan SE_W153, SOUND_PAN_ATTACKER + createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -16, 16, 1, 1 + delay 4 + playsewithpan SE_W153, SOUND_PAN_ATTACKER + createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -24, -12, 1, 1 + delay 4 + playsewithpan SE_W153, SOUND_PAN_ATTACKER + createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 16, 16, 1, 1 + delay 4 + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 | 0x8 + waitforvisualfinish end Move_FAIRY_LOCK: @@ -8880,7 +9461,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_W086, SOUND_PAN_TARGET delay 1 createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 16, -36 @@ -8897,7 +9478,7 @@ Move_THUNDER: createsprite gLightningSpriteTemplate, ANIM_TARGET, 6, -16, 16 playsewithpan SE_W086, 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 @@ -8905,9 +9486,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_W161B, SOUND_PAN_TARGET @@ -8916,11 +9497,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 @@ -8942,7 +9523,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 @@ -8951,7 +9532,7 @@ Move_THUNDER_PUNCH: createsprite gLightningSpriteTemplate, ANIM_ATTACKER, 2, 0, 16 delay 1 playsewithpan SE_W161B, 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 @@ -8979,12 +9560,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_W221B, SOUND_PAN_TARGET @@ -8996,10 +9577,10 @@ Move_SACRED_FIRE: playsewithpan SE_W221B, 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_W172B, SOUND_PAN_TARGET createsprite gLargeFlameScatterSpriteTemplate, ANIM_TARGET, 2, 0, 0, 30, 30, -1, 0 @@ -10110,19 +10691,19 @@ Move_ACID: 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_W145, 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_W145, 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_W145, 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_W145, 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_W145, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -10505,7 +11086,7 @@ FlyUnleash: monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_W104, 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 @@ -12148,7 +12729,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_W161B, SOUND_PAN_TARGET createsprite gLightningSpriteTemplate, ANIM_TARGET, 2, 0, -48 delay 1 @@ -12158,7 +12739,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 @@ -13200,7 +13781,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_W172B, SOUND_PAN_ATTACKER createsprite gFirePlumeSpriteTemplate, ANIM_ATTACKER, 2, -96, 0, 24, 0, 0, 0 @@ -13214,7 +13795,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 @@ -13474,7 +14055,7 @@ Move_HYDRO_CANNON: playsewithpan SE_W057, 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_W056, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 call HydroCannonBeam @@ -13491,7 +14072,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 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 4767ad33fd..0b0ba18119 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1896,11 +1896,12 @@ BattleScript_EffectHitEscape: jumpifmovehadnoeffect BattleScript_MoveEnd seteffectwithchance tryfaintmon BS_TARGET, FALSE, NULL - moveendall + moveendto MOVEEND_ATTACKER_VISIBLE + moveendfrom MOVEEND_TARGET_VISIBLE jumpifbattleend BattleScript_HitEscapeEnd jumpifbyte CMP_NOT_EQUAL gBattleOutcome 0, BattleScript_HitEscapeEnd jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_HitEscapeEnd - openpartyscreen 0x1, BattleScript_HitEscapeEnd + openpartyscreen BS_ATTACKER, BattleScript_HitEscapeEnd switchoutabilities BS_ATTACKER waitstate switchhandleorder BS_ATTACKER, 0x2 diff --git a/src/battle_anim_fire.c b/src/battle_anim_fire.c index 784fd0068c..dbb21fe6cb 100644 --- a/src/battle_anim_fire.c +++ b/src/battle_anim_fire.c @@ -548,9 +548,9 @@ static 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); diff --git a/src/battle_anim_flying.c b/src/battle_anim_flying.c index 73be083b9a..29043b9371 100644 --- a/src/battle_anim_flying.c +++ b/src/battle_anim_flying.c @@ -508,6 +508,7 @@ 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; @@ -528,7 +529,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); } } diff --git a/src/battle_anim_normal.c b/src/battle_anim_normal.c index 2c829dbb22..f1ad164cea 100644 --- a/src/battle_anim_normal.c +++ b/src/battle_anim_normal.c @@ -810,17 +810,15 @@ 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)); InvertPlttBuffer(selectedPalettes); DestroyAnimVisualTask(taskId); diff --git a/src/battle_anim_poison.c b/src/battle_anim_poison.c index 5d560bcc41..cda06738ed 100644 --- a/src/battle_anim_poison.c +++ b/src/battle_anim_poison.c @@ -480,7 +480,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]; From 34f5d9e2ae6e8d09c445c01601d49d85155529b1 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 17 Apr 2020 21:14:26 +0200 Subject: [PATCH 518/667] Burn Up And Purify --- asm/macros/battle_script.inc | 5 +++ data/battle_scripts_1.s | 50 ++++++++++++++++++++++ include/constants/battle_move_effects.h | 2 + include/constants/battle_script_commands.h | 1 + include/constants/battle_string_ids.h | 4 +- src/battle_message.c | 4 ++ src/battle_script_commands.c | 8 ++++ src/battle_util.c | 3 +- src/data/battle_moves.h | 4 +- 9 files changed, 77 insertions(+), 4 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 410c72a3ae..2474488afa 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1688,6 +1688,11 @@ .4byte \ptr .endm + .macro losetype battler:req, type:req + various \battler, VARIOUS_LOSE_TYPE + .byte \type + .endm + @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 0b0ba18119..0f085fedae 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -357,6 +357,55 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectBugBite .4byte BattleScript_EffectStrengthSap .4byte BattleScript_EffectMindBlown + .4byte BattleScript_EffectPurify + .4byte BattleScript_EffectBurnUp + +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 + typecalc + jumpifmovehadnoeffect BattleScript_NotAffected + 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 @@ -2552,6 +2601,7 @@ BattleScript_EffectRestoreHp:: tryhealhalfhealth BattleScript_AlreadyAtFullHp, BS_ATTACKER attackanimation waitanimation +BattleScript_RestoreHp: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 971f14adf5..185e902f88 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -345,5 +345,7 @@ #define EFFECT_BUG_BITE 339 #define EFFECT_STRENGTH_SAP 340 #define EFFECT_MIND_BLOWN 341 +#define EFFECT_PURIFY 342 +#define EFFECT_BURN_UP 343 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index bee610bdcb..81ea474e9a 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -148,6 +148,7 @@ #define VARIOUS_HANDLE_FORM_CHANGE 85 #define VARIOUS_GET_STAT_VALUE 86 #define VARIOUS_JUMP_IF_FULL_HP 87 +#define VARIOUS_LOSE_TYPE 88 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index af497e73b2..550f567e88 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -540,7 +540,9 @@ #define STRINGID_INCINERATEBURN 536 #define STRINGID_BUGBITE 537 #define STRINGID_ILLUSIONWOREOFF 538 +#define STRINGID_ATTACKERCUREDTARGETSTATUS 539 +#define STRINGID_ATTACKERLOSTFIRETYPE 540 -#define BATTLESTRINGS_COUNT 539 +#define BATTLESTRINGS_COUNT 541 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_message.c b/src/battle_message.c index d84caf6bf5..3bc2999b3e 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -661,9 +661,13 @@ static const u8 sText_AirBalloonPop[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_LAST_IT 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!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [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, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b3aaf8647c..a8c7a9f2e3 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7575,6 +7575,14 @@ static void Cmd_various(void) 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) diff --git a/src/battle_util.c b/src/battle_util.c index 3d127c0b0f..ccfd6d9586 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2379,7 +2379,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(); diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index d8463df563..fd7290dd19 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -9054,7 +9054,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_BURN_UP] = { - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_BURN_UP, .power = 130, .type = TYPE_FIRE, .accuracy = 100, @@ -9096,7 +9096,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_PURIFY] = { - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_PURIFY, .power = 0, .type = TYPE_POISON, .accuracy = 0, From bc86292c934fbb594dffd8c5b12c615259c781f1 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 18 Apr 2020 12:19:07 +0200 Subject: [PATCH 519/667] Psycho Cut fix, small AI tweak --- data/battle_ai_scripts.s | 26 +++++++++++++++++++++----- data/battle_anim_scripts.s | 18 ++++++++++-------- src/battle_script_commands.c | 2 +- 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index fd2e8334ab..6dc1821ffb 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -2811,16 +2811,13 @@ AI_CV_SemiInvulnerable: 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: @@ -2828,6 +2825,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: @@ -2835,6 +2834,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 @@ -2855,6 +2856,21 @@ 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 diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 877a0feed8..6838cdba83 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -2746,20 +2746,22 @@ Move_PSYCHO_CUT: loadspritegfx ANIM_TAG_PSYCHO_CUT monbg ANIM_ATK_PARTNER createsprite gPsychoCutSpiralSpriteTemplate, 2, 4, 0, 0, 0, 0 - createvisualtask AnimTask_BlendBattleAnimPal, 10, 1, 0, 4, 4, RGB_BLACK - createvisualtask AnimTask_BlendBattleAnimPal, 9, 5, 2, 2, 10, 0, RGB(20, 12, 23) - createvisualtask AnimTask_BlendBattleAnimPal, 9, 2, 2, 10, 0, RGB(20, 12, 23) + 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 - blendoff waitforvisualfinish monbg ANIM_TARGET monbgprio_28 ANIM_TARGET setalpha 12, 8 - playsewithpan 160, SOUND_PAN_ATTACKER, + playsewithpan SE_W013B, SOUND_PAN_ATTACKER, createsprite gPsychoCutSpriteTemplate, 130, 5, 20, 0, -8, 0, 20 waitforvisualfinish - clearmonbg ANIM_TARGET + 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: @@ -4450,14 +4452,14 @@ Move_INFERNO: call SetImpactBackground loopsewithpan SE_W221B, SOUND_PAN_TARGET, 40, 4 createvisualtask AnimTask_ShakeMon, 5, 1, 0, 2, 94, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 1, 0, 9, 31 + 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, 31 + createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 1, 9, 0, RGB_RED restorebg waitbgfadein waitforvisualfinish diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a8c7a9f2e3..f6ee5ed725 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -9078,7 +9078,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; From b5ba1de7cf49dc1e8482ed65eedd6aaa95a7278f Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 18 Apr 2020 12:29:35 +0200 Subject: [PATCH 520/667] Intimidate affects defiant --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index ccfd6d9586..96a870d914 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -516,7 +516,7 @@ void PrepareStringBattle(u16 stringId, u8 battler) stringId = STRINGID_STATSWONTDECREASE2; // Check Defiant and Competitive stat raise whenever a stat is lowered. - else if (stringId == STRINGID_PKMNSSTATCHANGED4 + 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)) From a2813e63deec4abe2aac11254466276c3b95214d Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 18 Apr 2020 12:52:15 +0200 Subject: [PATCH 521/667] Slow Start --- data/battle_scripts_1.s | 8 ++++++++ include/battle_scripts.h | 1 + src/battle_main.c | 2 ++ src/battle_message.c | 2 +- src/battle_util.c | 12 ++++++++++++ src/data/pokemon/base_stats.h | 2 +- 6 files changed, 25 insertions(+), 2 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 0f085fedae..e8811d382a 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5741,6 +5741,14 @@ 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 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index f30cec0255..8d6769b007 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -331,5 +331,6 @@ extern const u8 BattleScript_AftermathDmg[]; extern const u8 BattleScript_StanceChangeActivates[]; extern const u8 BattleScript_DisguiseBustedActivates[]; extern const u8 BattleScript_AnticipationActivates[]; +extern const u8 BattleScript_SlowStartEnds[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/src/battle_main.c b/src/battle_main.c index f5eaaaec7c..626f91062d 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4254,6 +4254,8 @@ u32 GetBattlerTotalSpeedStat(u8 battlerId) 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]; diff --git a/src/battle_message.c b/src/battle_message.c index 3bc2999b3e..9508f44216 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -584,7 +584,7 @@ static const u8 sText_MoldBreakerEnters[] = _("{B_ATK_NAME_WITH_PREFIX} breaks t static const u8 sText_TeravoltEnters[] = _("{B_ATK_NAME_WITH_PREFIX} is radiating a bursting aura!"); static const u8 sText_TurboblazeEnters[] = _("{B_ATK_NAME_WITH_PREFIX} is radiating\na blazing aura!"); static const u8 sText_SlowStartEnters[] = _("{B_ATK_NAME_WITH_PREFIX} can't get it going!"); -static const u8 sText_SlowStartEnd[] = _("{B_ATK_NAME_WITH_PREFIX} finally got its act together!"); +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_ATK_NAME_WITH_PREFIX} shuddered\nin anticipation!"); diff --git a/src/battle_util.c b/src/battle_util.c index 96a870d914..c40692575e 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1392,6 +1392,7 @@ enum ENDTURN_ELECTRIFY, ENDTURN_POWDER, ENDTURN_THROAT_CHOP, + ENDTURN_SLOW_START, ENDTURN_BATTLER_COUNT }; @@ -1856,6 +1857,16 @@ u8 DoBattlerEndTurnEffects(void) } 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++; @@ -2854,6 +2865,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA case ABILITY_SLOW_START: if (!gSpecialStatuses[battler].switchInAbilityDone) { + gDisableStructs[battler].slowStartTimer = 5; gBattleCommunication[MULTISTRING_CHOOSER] = 3; gSpecialStatuses[battler].switchInAbilityDone = 1; BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); diff --git a/src/data/pokemon/base_stats.h b/src/data/pokemon/base_stats.h index c191da8162..7e2ac6650b 100644 --- a/src/data/pokemon/base_stats.h +++ b/src/data/pokemon/base_stats.h @@ -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_SLOW_START, ABILITY_SLOW_START}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, From 1395a7d382506e2aa98096af8959d434277f8794 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 18 Apr 2020 13:04:28 +0200 Subject: [PATCH 522/667] Loafing Around bug fix --- data/battle_scripts_1.s | 4 ++-- include/battle_scripts.h | 1 + src/battle_util.c | 2 +- src/data/pokemon/base_stats.h | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e8811d382a..9d17b41ae1 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6960,7 +6960,7 @@ BattleScript_IgnoresAndUsesRandomMove:: jumptocalledmove FALSE BattleScript_MoveUsedLoafingAround:: - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x0, BattleScript_TruantLoafingAround + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x0, BattleScript_82DB6C7 jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, 0x4, BattleScript_82DB6C7 setbyte gBattleCommunication, 0x0 various24 BS_ATTACKER @@ -6970,7 +6970,7 @@ BattleScript_82DB6C7:: waitmessage 0x40 moveendto MOVEEND_NEXT_TARGET end -BattleScript_TruantLoafingAround: +BattleScript_TruantLoafingAround:: call BattleScript_AbilityPopUp goto BattleScript_82DB6C7 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 8d6769b007..fd7a7b4017 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -179,6 +179,7 @@ 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[]; diff --git a/src/battle_util.c b/src/battle_util.c index c40692575e..630f302eed 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2208,7 +2208,7 @@ u8 AtkCanceller_UnableToUseMove(void) gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gBattleCommunication[MULTISTRING_CHOOSER] = 0; gBattlerAbility = gBattlerAttacker; - gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; + gBattlescriptCurrInstr = BattleScript_TruantLoafingAround; gMoveResultFlags |= MOVE_RESULT_MISSED; effect = 1; } diff --git a/src/data/pokemon/base_stats.h b/src/data/pokemon/base_stats.h index 7e2ac6650b..c191da8162 100644 --- a/src/data/pokemon/base_stats.h +++ b/src/data/pokemon/base_stats.h @@ -7296,7 +7296,7 @@ const struct BaseStats gBaseStats[] = .growthRate = GROWTH_SLOW, .eggGroup1 = EGG_GROUP_FLYING, .eggGroup2 = EGG_GROUP_FLYING, - .abilities = {ABILITY_SLOW_START, ABILITY_SLOW_START}, + .abilities = {ABILITY_KEEN_EYE, ABILITY_STURDY}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, From 68bcc76538147823deac5266198251fa9b8dc3c4 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 18 Apr 2020 13:26:40 +0200 Subject: [PATCH 523/667] Fix trainer slide in shadow steal --- src/battle_script_commands.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f6ee5ed725..3eeebe09c7 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7751,6 +7751,7 @@ static void Cmd_various(void) if (gBattlescriptCurrInstr[3] == 0) { gBattleScripting.savedDmg = gBattlerSpriteIds[gActiveBattler]; + HideBattlerShadowSprite(gActiveBattler); } else if (gBattlescriptCurrInstr[3] == 1) { @@ -7762,6 +7763,7 @@ static void Cmd_various(void) gBattlerSpriteIds[gActiveBattler] = gBattleScripting.savedDmg; if (gBattleMons[gActiveBattler].hp != 0) { + SetBattlerShadowSpriteCallback(gActiveBattler, gBattleMons[gActiveBattler].species); BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); } } From 093eca07b300c4b01e0d19c880056afd15523131 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 18 Apr 2020 18:04:20 +0200 Subject: [PATCH 524/667] Volt Switch UTurn anim fix when cant switch out --- data/battle_anim_scripts.s | 22 ++++++++ include/battle_script_commands.h | 1 + src/battle_anim_utility_funcs.c | 6 +++ src/battle_script_commands.c | 86 +++++++++++++++----------------- 4 files changed, 70 insertions(+), 45 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 6838cdba83..40ad9553c9 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1008,17 +1008,26 @@ Move_U_TURN: playsewithpan SE_W019, SOUND_PAN_ATTACKER createsprite gFlyBallUpSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 13, 336 playsewithpan SE_W104, 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_W013, 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 @@ -4518,13 +4527,26 @@ Move_VOLT_SWITCH: delay 4 call ElectricityEffect playsewithpan SE_W085B, 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: end diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index ab2217712c..8fec39df30 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -8,6 +8,7 @@ s32 CalcCritChanceStage(u8 battlerAtk, u8 battlerDef, u32 move, bool32 recordAbi u8 GetBattlerTurnOrderNum(u8 battlerId); bool32 NoAliveMonsForEitherParty(void); void SetMoveEffect(bool32 primary, u32 certain); +bool32 CanBattlerSwitch(u32 battlerId); void BattleDestroyYesNoCursorAt(u8 cursorPosition); void BattleCreateYesNoCursorAt(u8 cursorPosition); void BufferMoveToLearnIntoBattleTextBuff2(void); diff --git a/src/battle_anim_utility_funcs.c b/src/battle_anim_utility_funcs.c index 60a63ff7d8..5dbd220238 100644 --- a/src/battle_anim_utility_funcs.c +++ b/src/battle_anim_utility_funcs.c @@ -1070,3 +1070,9 @@ void AnimTask_IsDoubleBattle(u8 taskId) gBattleAnimArgs[7] = (IsDoubleBattle() && !IsContest()); DestroyAnimVisualTask(taskId); } + +void AnimTask_CanBattlerSwitch(u8 taskId) +{ + gBattleAnimArgs[ARG_RET_ID] = CanBattlerSwitch(GetAnimBattlerId(gBattleAnimArgs[0])); + DestroyAnimVisualTask(taskId); +} diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 3eeebe09c7..09567dd161 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4953,22 +4953,13 @@ static void Cmd_switchinanim(void) BattleArena_InitPoints(); } -static void Cmd_jumpifcantswitch(void) +bool32 CanBattlerSwitch(u32 battlerId) { - s32 i; - s32 lastMonId; - u8 battlerIn1, battlerIn2; + 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))) - { - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); - } - else if (BATTLE_TWO_VS_ONE_OPPONENT && GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT) + if (BATTLE_TWO_VS_ONE_OPPONENT && GetBattlerSide(battlerId) == B_SIDE_OPPONENT) { battlerIn1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); battlerIn2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); @@ -4983,20 +4974,17 @@ static void Cmd_jumpifcantswitch(void) break; } - if (i == PARTY_SIZE) - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); - else - gBattlescriptCurrInstr += 6; + ret = (i != PARTY_SIZE); } else if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) { - 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++) @@ -5004,32 +4992,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; @@ -5037,13 +5022,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; } @@ -5052,21 +5037,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++) @@ -5074,18 +5056,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 { - if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT) + if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT) { battlerIn1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); @@ -5117,10 +5096,27 @@ static void Cmd_jumpifcantswitch(void) break; } - if (i == 6) - 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) + && ((gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) + || (gStatuses3[gActiveBattler] & STATUS3_ROOTED))) + { + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); + } + else + { + if (CanBattlerSwitch(gActiveBattler)) gBattlescriptCurrInstr += 6; + else + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); } } From 7178ea6b460a74de288b0fa9ae343bf4eef5a7cc Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 18 Apr 2020 18:34:18 +0200 Subject: [PATCH 525/667] Shore Up --- data/battle_ai_scripts.s | 34 +++++++++++++------------ data/battle_scripts_1.s | 2 ++ include/constants/battle_move_effects.h | 1 + src/battle_script_commands.c | 23 ++++++++++++----- src/data/battle_moves.h | 2 +- 5 files changed, 38 insertions(+), 24 deletions(-) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 6dc1821ffb..ebdea7bc15 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -1066,6 +1066,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 @@ -3721,7 +3722,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: @@ -3758,21 +3759,22 @@ AI_HPAware_End: end 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_ROOST - .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 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 9d17b41ae1..18ae8a98a7 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -359,6 +359,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectMindBlown .4byte BattleScript_EffectPurify .4byte BattleScript_EffectBurnUp + .4byte BattleScript_EffectShoreUp BattleScript_EffectBurnUp: attackcanceler @@ -3734,6 +3735,7 @@ BattleScript_EffectSonicboom:: BattleScript_EffectMorningSun:: BattleScript_EffectSynthesis:: BattleScript_EffectMoonlight:: +BattleScript_EffectShoreUp:: attackcanceler attackstring ppreduce diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 185e902f88..5b3c3bd64c 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -347,5 +347,6 @@ #define EFFECT_MIND_BLOWN 341 #define EFFECT_PURIFY 342 #define EFFECT_BURN_UP 343 +#define EFFECT_SHORE_UP 344 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 09567dd161..36793f1655 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10201,15 +10201,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; diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index fd7290dd19..462cabeab0 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -8731,7 +8731,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_SHORE_UP] = { - .effect = EFFECT_PLACEHOLDER, + .effect = EFFECT_SHORE_UP, .power = 0, .type = TYPE_GROUND, .accuracy = 0, From cbc0d8a57d9913c3a39df8f96df12e63890a7773 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 18 Apr 2020 19:09:17 +0200 Subject: [PATCH 526/667] Healer --- data/battle_scripts_1.s | 8 ++++++++ include/battle_scripts.h | 1 + include/constants/battle_string_ids.h | 3 ++- src/battle_message.c | 2 ++ src/battle_util.c | 10 ++++++++++ 5 files changed, 23 insertions(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 18ae8a98a7..a2cd1e9a8c 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6428,6 +6428,14 @@ BattleScript_SolarPowerActivates:: 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 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index fd7a7b4017..70f12b4964 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -333,5 +333,6 @@ extern const u8 BattleScript_StanceChangeActivates[]; extern const u8 BattleScript_DisguiseBustedActivates[]; extern const u8 BattleScript_AnticipationActivates[]; extern const u8 BattleScript_SlowStartEnds[]; +extern const u8 BattleScript_HealerActivates[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 550f567e88..74c121ab12 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -542,7 +542,8 @@ #define STRINGID_ILLUSIONWOREOFF 538 #define STRINGID_ATTACKERCUREDTARGETSTATUS 539 #define STRINGID_ATTACKERLOSTFIRETYPE 540 +#define STRINGID_HEALERCURE 541 -#define BATTLESTRINGS_COUNT 541 +#define BATTLESTRINGS_COUNT 542 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_message.c b/src/battle_message.c index 9508f44216..9a5ebcb1d4 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -663,9 +663,11 @@ static const u8 sText_BugBite[] = _("{B_ATK_NAME_WITH_PREFIX} stole and ate\n{B_ 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!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_HEALERCURE - 12] = sText_HealerCure, [STRINGID_ATTACKERLOSTFIRETYPE - 12] = sText_AttackerLostFireType, [STRINGID_ATTACKERCUREDTARGETSTATUS - 12] = sText_AttackerCuredTargetStatus, [STRINGID_ILLUSIONWOREOFF - 12] = sText_IllusionWoreOff, diff --git a/src/battle_util.c b/src/battle_util.c index 630f302eed..79ef8eaa79 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3146,6 +3146,16 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA 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; } } break; From 307bbcfe97fbcc62de6c361dfdb86a08a56bf7bd Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 18 Apr 2020 19:15:24 +0200 Subject: [PATCH 527/667] Stakeout --- src/battle_util.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/battle_util.c b/src/battle_util.c index 79ef8eaa79..53e53b5bc3 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5817,6 +5817,10 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b 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 From e42ead10c985b6b1abb1b308417acb3b9e50c372 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 18 Apr 2020 19:59:09 +0200 Subject: [PATCH 528/667] Soul Heart --- asm/macros/battle_script.inc | 4 ++++ data/battle_scripts_1.s | 16 ++++++++++++++++ include/battle.h | 1 + include/battle_scripts.h | 1 + include/constants/battle_script_commands.h | 1 + include/constants/battle_string_ids.h | 3 ++- src/battle_message.c | 2 ++ src/battle_script_commands.c | 19 +++++++++++++++++++ 8 files changed, 46 insertions(+), 1 deletion(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 2474488afa..214adcf78f 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1439,6 +1439,10 @@ various \battler, VARIOUS_TRY_ACTIVATE_MOXIE .endm + .macro tryactivatesoulheart + various BS_ATTACKER, VARIOUS_TRY_ACTIVATE_SOULHEART + .endm + .macro tryactivatefellstinger battler:req various \battler, VARIOUS_TRY_ACTIVATE_FELL_STINGER .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index a2cd1e9a8c..d07a0b6177 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4783,6 +4783,7 @@ BattleScript_FaintAttacker:: dofaintanimation BS_ATTACKER printstring STRINGID_ATTACKERFAINTED cleareffectsonfaint BS_ATTACKER + tryactivatesoulheart trytrainerslidefirstdownmsg BS_ATTACKER return @@ -4793,6 +4794,7 @@ BattleScript_FaintTarget:: dofaintanimation BS_TARGET printstring STRINGID_TARGETFAINTED cleareffectsonfaint BS_TARGET + tryactivatesoulheart tryactivatemoxie BS_ATTACKER tryactivatefellstinger BS_ATTACKER trytrainerslidefirstdownmsg BS_TARGET @@ -6799,6 +6801,20 @@ BattleScript_TargetAbilityStatRaise:: 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 diff --git a/include/battle.h b/include/battle.h index 45534126ec..b6449837f2 100644 --- a/include/battle.h +++ b/include/battle.h @@ -543,6 +543,7 @@ struct BattleStruct 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; }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 70f12b4964..3256ca82cf 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -334,5 +334,6 @@ extern const u8 BattleScript_DisguiseBustedActivates[]; extern const u8 BattleScript_AnticipationActivates[]; extern const u8 BattleScript_SlowStartEnds[]; extern const u8 BattleScript_HealerActivates[]; +extern const u8 BattleScript_ScriptingAbilityStatRaise[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 81ea474e9a..a02e0e73fe 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -149,6 +149,7 @@ #define VARIOUS_GET_STAT_VALUE 86 #define VARIOUS_JUMP_IF_FULL_HP 87 #define VARIOUS_LOSE_TYPE 88 +#define VARIOUS_TRY_ACTIVATE_SOULHEART 89 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 74c121ab12..c2f87298b6 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -543,7 +543,8 @@ #define STRINGID_ATTACKERCUREDTARGETSTATUS 539 #define STRINGID_ATTACKERLOSTFIRETYPE 540 #define STRINGID_HEALERCURE 541 +#define STRINGID_SCRIPTINGABILITYSTATRAISE 542 -#define BATTLESTRINGS_COUNT 542 +#define BATTLESTRINGS_COUNT 543 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_message.c b/src/battle_message.c index 9a5ebcb1d4..c156c7ff1b 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -572,6 +572,7 @@ static const u8 sText_AquaRingHeal[] = _("Aqua Ring restored\n{B_ATK_NAME_WITH_P 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."); @@ -667,6 +668,7 @@ static const u8 sText_HealerCure[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_LAST_ABILI const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_SCRIPTINGABILITYSTATRAISE - 12] = sText_ScriptingAbilityRaisedStat, [STRINGID_HEALERCURE - 12] = sText_HealerCure, [STRINGID_ATTACKERLOSTFIRETYPE - 12] = sText_AttackerLostFireType, [STRINGID_ATTACKERCUREDTARGETSTATUS - 12] = sText_AttackerCuredTargetStatus, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 36793f1655..4144267128 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7123,6 +7123,25 @@ static void Cmd_various(void) 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() From 6ef28be22bef60e4c1f2a68a6ea71a0b31047f68 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 18 Apr 2020 20:12:29 +0200 Subject: [PATCH 529/667] Innards Out --- src/battle_util.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/battle_util.c b/src/battle_util.c index 53e53b5bc3..88f633dee3 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3488,6 +3488,16 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA effect++; } break; + case ABILITY_INNARDS_OUT: + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && gBattleMons[gBattlerTarget].hp == 0) + { + 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 From ee8a00be81ee613891e25e236b0522d8842d442c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 18 Apr 2020 20:34:09 +0200 Subject: [PATCH 530/667] some ability tweaks --- src/battle_script_commands.c | 1 + src/battle_util.c | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 4144267128..a0f51be2e9 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4362,6 +4362,7 @@ static void Cmd_playstatchangeanimation(void) } else if (!gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].mistTimer && 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) diff --git a/src/battle_util.c b/src/battle_util.c index 88f633dee3..a803a0de24 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6051,9 +6051,10 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move } // 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)) + 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)); @@ -6082,6 +6083,7 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move switch (abilityDef) { case ABILITY_MULTISCALE: + case ABILITY_SHADOW_SHIELD: if (BATTLER_MAX_HP(battlerDef)) MulModifier(&finalModifier, UQ_4_12(0.5)); break; From e62f1475d4d31d8766035831c4c2a6ffeb64970c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 19 Apr 2020 12:07:56 +0200 Subject: [PATCH 531/667] Beast Boost and Receiver --- asm/macros/battle_script.inc | 8 +++ data/battle_scripts_1.s | 14 ++++- include/battle_scripts.h | 1 + include/constants/battle_script_commands.h | 2 + include/constants/battle_string_ids.h | 3 +- src/battle_message.c | 2 + src/battle_script_commands.c | 59 ++++++++++++++++++++++ 7 files changed, 86 insertions(+), 3 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 214adcf78f..5a3861a295 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1439,6 +1439,14 @@ 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 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index d07a0b6177..6371114c67 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4784,6 +4784,7 @@ BattleScript_FaintAttacker:: printstring STRINGID_ATTACKERFAINTED cleareffectsonfaint BS_ATTACKER tryactivatesoulheart + tryactivatereceiver BS_ATTACKER trytrainerslidefirstdownmsg BS_ATTACKER return @@ -4794,9 +4795,11 @@ BattleScript_FaintTarget:: dofaintanimation BS_TARGET printstring STRINGID_TARGETFAINTED cleareffectsonfaint BS_TARGET - tryactivatesoulheart - tryactivatemoxie BS_ATTACKER tryactivatefellstinger BS_ATTACKER + tryactivatesoulheart + tryactivatereceiver BS_TARGET + tryactivatemoxie BS_ATTACKER + tryactivatebeastboost BS_ATTACKER trytrainerslidefirstdownmsg BS_TARGET return @@ -6405,6 +6408,13 @@ BattleScript_TraceActivatesEnd3:: call BattleScript_TraceActivates end3 +BattleScript_ReceiverActivates:: + call BattleScript_AbilityPopUp + printstring STRINGID_RECEIVERABILITYTAKEOVER + waitmessage 0x40 + settracedability BS_ABILITY_BATTLER + return + BattleScript_RainDishActivates:: call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXRESTOREDHPALITTLE2 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 3256ca82cf..8ba5920d04 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -335,5 +335,6 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index a02e0e73fe..d1f729eeac 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -150,6 +150,8 @@ #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 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index c2f87298b6..24cdd4f905 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -544,7 +544,8 @@ #define STRINGID_ATTACKERLOSTFIRETYPE 540 #define STRINGID_HEALERCURE 541 #define STRINGID_SCRIPTINGABILITYSTATRAISE 542 +#define STRINGID_RECEIVERABILITYTAKEOVER 543 -#define BATTLESTRINGS_COUNT 543 +#define BATTLESTRINGS_COUNT 544 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_message.c b/src/battle_message.c index c156c7ff1b..f1168fe1bf 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -665,9 +665,11 @@ static const u8 sText_IllusionWoreOff[] = _("{B_DEF_NAME_WITH_PREFIX}'s Illusion 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!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_RECEIVERABILITYTAKEOVER - 12] = sText_ReceiverAbilityTakeOver, [STRINGID_SCRIPTINGABILITYSTATRAISE - 12] = sText_ScriptingAbilityRaisedStat, [STRINGID_HEALERCURE - 12] = sText_HealerCure, [STRINGID_ATTACKERLOSTFIRETYPE - 12] = sText_AttackerLostFireType, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a0f51be2e9..25d011ea7c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6759,6 +6759,22 @@ static void RecalcBattlerStats(u32 battler, struct Pokemon *mon) 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) { struct Pokemon *mon; @@ -6803,6 +6819,7 @@ static void Cmd_various(void) 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) @@ -7124,6 +7141,48 @@ static void Cmd_various(void) 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) { From 6a3944d27cb71b219a57e5e48b43257047136992 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 19 Apr 2020 13:37:56 +0200 Subject: [PATCH 532/667] Frisk, would be easier if it didnt scan 2 opponents --- asm/macros/battle_script.inc | 4 ++++ data/battle_scripts_1.s | 12 ++++++++++ include/battle.h | 2 ++ include/battle_scripts.h | 3 +++ include/constants/battle_script_commands.h | 1 + src/battle_message.c | 2 +- src/battle_script_commands.c | 27 ++++++++++++++++++++++ src/battle_util.c | 8 +++++++ src/data/pokemon/base_stats.h | 16 ++++++------- 9 files changed, 66 insertions(+), 9 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 5a3861a295..fbb18e9e42 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1705,6 +1705,10 @@ .byte \type .endm + .macro tryfriskmsg battler:req + various \battler, VARIOUS_TRY_FRISK + .endm + @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 6371114c67..4623efd9cd 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6887,6 +6887,18 @@ BattleScript_SwitchInAbilityMsg:: 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 diff --git a/include/battle.h b/include/battle.h index b6449837f2..6180829a99 100644 --- a/include/battle.h +++ b/include/battle.h @@ -544,6 +544,8 @@ struct BattleStruct 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. }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 8ba5920d04..7c3b2ef534 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -336,5 +336,8 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index d1f729eeac..d7faed2f4b 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -152,6 +152,7 @@ #define VARIOUS_TRY_ACTIVATE_SOULHEART 89 #define VARIOUS_TRY_ACTIVATE_RECEIVER 90 #define VARIOUS_TRY_ACTIVATE_BEAST_BOOST 91 +#define VARIOUS_TRY_FRISK 92 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_message.c b/src/battle_message.c index f1168fe1bf..4e3752c9f3 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -1231,7 +1231,7 @@ const u16 gDmgHazardsStringIds[] = const u16 gSwitchInAbilityStringIds[] = { STRINGID_MOLDBREAKERENTERS, STRINGID_TERAVOLTENTERS, STRINGID_TURBOBLAZEENTERS, - STRINGID_SLOWSTARTENTERS, STRINGID_UNNERVEENTERS, STRINGID_ANTICIPATIONACTIVATES + STRINGID_SLOWSTARTENTERS, STRINGID_UNNERVEENTERS, STRINGID_ANTICIPATIONACTIVATES, }; const u16 gMissStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 25d011ea7c..c9dfa977d8 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6817,6 +6817,33 @@ static void Cmd_various(void) 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_TRACE_ABILITY: gBattleMons[gActiveBattler].ability = gBattleStruct->tracedAbility[gActiveBattler]; RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability); diff --git a/src/battle_util.c b/src/battle_util.c index a803a0de24..a6b7029e7e 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2911,6 +2911,14 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } } 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_DOWNLOAD: if (!gSpecialStatuses[battler].switchInAbilityDone) { diff --git a/src/data/pokemon/base_stats.h b/src/data/pokemon/base_stats.h index c191da8162..c1861da7dd 100644 --- a/src/data/pokemon/base_stats.h +++ b/src/data/pokemon/base_stats.h @@ -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_FRISK, ABILITY_FRISK}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, @@ -8498,7 +8498,7 @@ const struct BaseStats gBaseStats[] = .growthRate = GROWTH_MEDIUM_FAST, .eggGroup1 = EGG_GROUP_FIELD, .eggGroup2 = EGG_GROUP_FIELD, - .abilities = {ABILITY_PICKUP, ABILITY_NONE}, + .abilities = {ABILITY_FRISK, ABILITY_FRISK}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, @@ -9994,15 +9994,15 @@ const struct BaseStats gBaseStats[] = .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, - .item1 = ITEM_NONE, - .item2 = ITEM_NONE, + .item1 = ITEM_LEFTOVERS, + .item2 = ITEM_LEFTOVERS, .genderRatio = PERCENT_FEMALE(25), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_FLUCTUATING, .eggGroup1 = EGG_GROUP_HUMAN_LIKE, .eggGroup2 = EGG_GROUP_HUMAN_LIKE, - .abilities = {ABILITY_THICK_FAT, ABILITY_GUTS}, + .abilities = {ABILITY_FRISK, ABILITY_FRISK}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, @@ -10026,15 +10026,15 @@ const struct BaseStats gBaseStats[] = .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, - .item1 = ITEM_NONE, - .item2 = ITEM_KINGS_ROCK, + .item1 = ITEM_LEFTOVERS, + .item2 = ITEM_LEFTOVERS, .genderRatio = PERCENT_FEMALE(25), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_FLUCTUATING, .eggGroup1 = EGG_GROUP_HUMAN_LIKE, .eggGroup2 = EGG_GROUP_HUMAN_LIKE, - .abilities = {ABILITY_THICK_FAT, ABILITY_GUTS}, + .abilities = {ABILITY_FRISK, ABILITY_FRISK}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, From d5307c3e5453458267ee375418cdc37ab4f0008d Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 19 Apr 2020 14:24:31 +0200 Subject: [PATCH 533/667] Poison Touch --- src/battle_script_commands.c | 3 +++ src/battle_util.c | 27 ++++++++++++++++++++++++--- src/data/pokemon/base_stats.h | 16 ++++++++-------- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c9dfa977d8..39cb1ae691 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4528,6 +4528,9 @@ static void Cmd_moveend(void) 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; + // Poison Touch, possibly other in the future + else if (AbilityBattleEffects(ABILITYEFFECT_MOVE_END, gBattlerAttacker, 0, 0, 0)) + effect = TRUE; gBattleScripting.moveendState++; break; case MOVEEND_STATUS_IMMUNITY_ABILITIES: // status immunities diff --git a/src/battle_util.c b/src/battle_util.c index a6b7029e7e..4edcaf3bcc 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3526,7 +3526,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY) && !IsFlowerVeilProtected(gBattlerAttacker) && !IsLeafGuardProtected(gBattlerAttacker) - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && IsMoveMakingContact(move, gBattlerAttacker) && (Random() % 3) == 0) { gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_SLEEP; @@ -3550,7 +3550,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY) && !IsFlowerVeilProtected(gBattlerAttacker) && !IsLeafGuardProtected(gBattlerAttacker) - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && IsMoveMakingContact(move, gBattlerAttacker) && (Random() % 3) == 0) { gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_POISON; @@ -3572,7 +3572,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY) && !IsFlowerVeilProtected(gBattlerAttacker) && !IsLeafGuardProtected(gBattlerAttacker) - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && IsMoveMakingContact(move, gBattlerAttacker) && (Random() % 3) == 0) { gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_PARALYSIS; @@ -3582,6 +3582,27 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA effect++; } break; + 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) + && !IsFlowerVeilProtected(gBattlerTarget) + && !IsLeafGuardProtected(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; case ABILITY_FLAME_BODY: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && gBattleMons[gBattlerAttacker].hp != 0 diff --git a/src/data/pokemon/base_stats.h b/src/data/pokemon/base_stats.h index c1861da7dd..c191da8162 100644 --- a/src/data/pokemon/base_stats.h +++ b/src/data/pokemon/base_stats.h @@ -7296,7 +7296,7 @@ const struct BaseStats gBaseStats[] = .growthRate = GROWTH_SLOW, .eggGroup1 = EGG_GROUP_FLYING, .eggGroup2 = EGG_GROUP_FLYING, - .abilities = {ABILITY_FRISK, ABILITY_FRISK}, + .abilities = {ABILITY_KEEN_EYE, ABILITY_STURDY}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, @@ -8498,7 +8498,7 @@ const struct BaseStats gBaseStats[] = .growthRate = GROWTH_MEDIUM_FAST, .eggGroup1 = EGG_GROUP_FIELD, .eggGroup2 = EGG_GROUP_FIELD, - .abilities = {ABILITY_FRISK, ABILITY_FRISK}, + .abilities = {ABILITY_PICKUP, ABILITY_NONE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, @@ -9994,15 +9994,15 @@ const struct BaseStats gBaseStats[] = .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, - .item1 = ITEM_LEFTOVERS, - .item2 = ITEM_LEFTOVERS, + .item1 = ITEM_NONE, + .item2 = ITEM_NONE, .genderRatio = PERCENT_FEMALE(25), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_FLUCTUATING, .eggGroup1 = EGG_GROUP_HUMAN_LIKE, .eggGroup2 = EGG_GROUP_HUMAN_LIKE, - .abilities = {ABILITY_FRISK, ABILITY_FRISK}, + .abilities = {ABILITY_THICK_FAT, ABILITY_GUTS}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_YELLOW, .noFlip = FALSE, @@ -10026,15 +10026,15 @@ const struct BaseStats gBaseStats[] = .evYield_Speed = 0, .evYield_SpAttack = 0, .evYield_SpDefense = 0, - .item1 = ITEM_LEFTOVERS, - .item2 = ITEM_LEFTOVERS, + .item1 = ITEM_NONE, + .item2 = ITEM_KINGS_ROCK, .genderRatio = PERCENT_FEMALE(25), .eggCycles = 20, .friendship = 70, .growthRate = GROWTH_FLUCTUATING, .eggGroup1 = EGG_GROUP_HUMAN_LIKE, .eggGroup2 = EGG_GROUP_HUMAN_LIKE, - .abilities = {ABILITY_FRISK, ABILITY_FRISK}, + .abilities = {ABILITY_THICK_FAT, ABILITY_GUTS}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_BROWN, .noFlip = FALSE, From c01ed5325c258d81c8d7e94d11bd0cab92452fa3 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 19 Apr 2020 14:43:54 +0200 Subject: [PATCH 534/667] Poison Touch fix --- include/battle_util.h | 21 +++++----- include/constants/battle_script_commands.h | 37 ++++++++--------- src/battle_script_commands.c | 6 ++- src/battle_util.c | 47 ++++++++++++---------- 4 files changed, 60 insertions(+), 51 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index a7a723221f..c9f05cf8a4 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -12,16 +12,17 @@ #define ABILITYEFFECT_ENDTURN 0x1 #define ABILITYEFFECT_MOVES_BLOCK 0x2 #define ABILITYEFFECT_ABSORBING 0x3 -#define ABILITYEFFECT_MOVE_END 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_TRACE1 0xB -#define ABILITYEFFECT_TRACE2 0xC -#define ABILITYEFFECT_MOVE_END_OTHER 0xD +#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 ITEMEFFECT_ON_SWITCH_IN 0x0 diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index d7faed2f4b..fa48d0cfc7 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -183,24 +183,25 @@ #define MOVEEND_DEFROST 2 #define MOVEEND_SYNCHRONIZE_TARGET 3 #define MOVEEND_ABILITIES 4 -#define MOVEEND_STATUS_IMMUNITY_ABILITIES 5 -#define MOVEEND_SYNCHRONIZE_ATTACKER 6 -#define MOVEEND_CHOICE_MOVE 7 -#define MOVEEND_CHANGED_ITEMS 8 -#define MOVEEND_ATTACKER_INVISIBLE 9 -#define MOVEEND_ATTACKER_VISIBLE 10 -#define MOVEEND_TARGET_VISIBLE 11 -#define MOVEEND_ITEM_EFFECTS_TARGET 12 -#define MOVEEND_ITEM_EFFECTS_ALL 13 -#define MOVEEND_KINGSROCK_SHELLBELL 14 -#define MOVEEND_SUBSTITUTE 15 -#define MOVEEND_UPDATE_LAST_MOVES 16 -#define MOVEEND_MIRROR_MOVE 17 -#define MOVEEND_NEXT_TARGET 18 -#define MOVEEND_LIFE_ORB 19 -#define MOVEEND_DANCER 20 -#define MOVEEND_CLEAR_BITS 21 -#define MOVEEND_COUNT 22 +#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_ITEM_EFFECTS_ALL 14 +#define MOVEEND_KINGSROCK_SHELLBELL 15 +#define MOVEEND_SUBSTITUTE 16 +#define MOVEEND_UPDATE_LAST_MOVES 17 +#define MOVEEND_MIRROR_MOVE 18 +#define MOVEEND_NEXT_TARGET 19 +#define MOVEEND_LIFE_ORB 20 +#define MOVEEND_DANCER 21 +#define MOVEEND_CLEAR_BITS 22 +#define MOVEEND_COUNT 23 // stat flags for Cmd_playstatchangeanimation #define BIT_HP 0x1 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 39cb1ae691..698ab718fc 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4528,8 +4528,10 @@ static void Cmd_moveend(void) 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; - // Poison Touch, possibly other in the future - else if (AbilityBattleEffects(ABILITYEFFECT_MOVE_END, gBattlerAttacker, 0, 0, 0)) + gBattleScripting.moveendState++; + break; + 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; diff --git a/src/battle_util.c b/src/battle_util.c index 4edcaf3bcc..249cc1019d 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3582,27 +3582,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA effect++; } break; - 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) - && !IsFlowerVeilProtected(gBattlerTarget) - && !IsLeafGuardProtected(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; case ABILITY_FLAME_BODY: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && gBattleMons[gBattlerAttacker].hp != 0 @@ -3654,6 +3633,32 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA 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) + && !IsFlowerVeilProtected(gBattlerTarget) + && !IsLeafGuardProtected(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)) { From ad481c8688e440d88ae7acb859e988f56d58136f Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 19 Apr 2020 15:44:44 +0200 Subject: [PATCH 535/667] Moody --- data/battle_scripts_1.s | 27 ++++++++++++++- include/battle.h | 3 +- include/battle_scripts.h | 1 + include/constants/battle_config.h | 2 ++ include/constants/battle_script_commands.h | 2 +- src/battle_util.c | 39 ++++++++++++++++++++++ 6 files changed, 71 insertions(+), 3 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 4623efd9cd..a3cf4b5481 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6394,6 +6394,31 @@ BattleScript_SpeedBoostActivates:: 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_TraceActivates:: pause 0x20 @@ -6859,9 +6884,9 @@ BattleScript_WeakArmorActivatesEnd: return BattleScript_AttackerAbilityStatRaise:: - setgraphicalstatchangevalues copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUp + setgraphicalstatchangevalues playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 waitanimation printstring STRINGID_ATTACKERABILITYSTATRAISE diff --git a/include/battle.h b/include/battle.h index 6180829a99..8f75c124d4 100644 --- a/include/battle.h +++ b/include/battle.h @@ -578,6 +578,7 @@ struct BattleStruct #define SET_STAT_BUFF_VALUE(n)((((n) << 3) & 0xF8)) #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 { @@ -590,7 +591,7 @@ struct BattleScripting u8 animArg2; u16 tripleKickPower; u8 moveendState; - u8 unused_15; + u8 savedStatChanger; // For further use, if attempting to change stat two times(ex. Moody) u8 unused_16; u8 battler; u8 animTurn; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 7c3b2ef534..493dc1cda2 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -339,5 +339,6 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 0baf5d4fc0..b93838b571 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -46,6 +46,7 @@ #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 atk04_critcalc. @@ -59,6 +60,7 @@ #define B_FELL_STINGER_STAT_RAISE GEN_6 // Gen6 Atk+2, Gen7 Atk+3. #define B_SOUND_SUBSTITUTE GEN_6 // Starting from Gen6 sound moves bypass Substitute. #define B_TOXIC_NEVER_MISS GEN_6 // Starting from Gen6, if Toxic is used by a Poison type, it will never miss. +#define B_MOODY_ACC_EVASION GEN_6 // In Gen8, Moody CANNOT raise Accuray and Evasion any more // Ability settings #define B_ABILITY_POP_UP GEN_6 // Starting from gen5, the pokemon abilities are displayed in a pop-up, when they activate in battle. diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index fa48d0cfc7..bc88e04ad9 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -11,7 +11,7 @@ #define sB_ANIM_ARG2 gBattleScripting + 0x11 #define sTRIPLE_KICK_POWER gBattleScripting + 0x12 #define sMOVEEND_STATE gBattleScripting + 0x14 -#define sUNUSED_15 gBattleScripting + 0x15 +#define sSAVED_STAT_CHANGER gBattleScripting + 0x15 #define sUNUSED_16 gBattleScripting + 0x16 #define sBATTLER gBattleScripting + 0x17 #define sB_ANIM_TURN gBattleScripting + 0x18 diff --git a/src/battle_util.c b/src/battle_util.c index 249cc1019d..5276dd584d 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3131,6 +3131,45 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA effect++; } break; + case ABILITY_MOODY: + if (gDisableStructs[battler].isFirstTurn != 2) + { + u32 validToRaise = 0, validToLower; + 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, (gBattleMons[battler].statStages[i] < 11) ? 2 : 1, 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; From 726af8efaacee2ac26568fcff1c920cd9a9b1d5e Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 19 Apr 2020 16:51:29 +0200 Subject: [PATCH 536/667] Moody small fix --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 5276dd584d..6d099e60a1 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3134,7 +3134,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA case ABILITY_MOODY: if (gDisableStructs[battler].isFirstTurn != 2) { - u32 validToRaise = 0, validToLower; + 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++) From dd17360ab0c42629259f058b7129a9db6203ccee Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 19 Apr 2020 21:18:39 +0200 Subject: [PATCH 537/667] Zen Mode and Shields Down --- asm/macros/battle_script.inc | 5 ++ data/battle_scripts_1.s | 14 ++++- include/battle_script_commands.h | 2 + include/battle_scripts.h | 5 +- include/constants/battle_config.h | 4 ++ include/constants/battle_script_commands.h | 1 + src/battle_script_commands.c | 41 ++++++++++----- src/battle_util.c | 60 ++++++++++++++++++---- 8 files changed, 104 insertions(+), 28 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index fbb18e9e42..c854e8320d 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1709,6 +1709,11 @@ various \battler, VARIOUS_TRY_FRISK .endm + .macro jumpifshieldsdown battler:req, ptr:req + various \battler, VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED + .4byte \ptr + .endm + @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index a3cf4b5481..b4cfbcd3ac 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2101,6 +2101,7 @@ BattleScript_EffectSleep:: 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 @@ -2618,6 +2619,7 @@ BattleScript_EffectToxic:: 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 @@ -2944,6 +2946,7 @@ BattleScript_EffectPoison:: 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 @@ -2968,6 +2971,7 @@ BattleScript_EffectParalyze: 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 @@ -4156,6 +4160,7 @@ BattleScript_EffectWillOWisp:: 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 @@ -4429,6 +4434,7 @@ BattleScript_EffectYawn:: jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_PrintBankAbilityMadeIneffective jumpifflowerveil BattleScript_FlowerVeilProtects jumpifleafguard BattleScript_LeafGuardProtects + jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects jumpifsubstituteblocks BattleScript_ButItFailed jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON @@ -5971,7 +5977,7 @@ BattleScript_MegaEvolution:: switchinabilities BS_ATTACKER end2 -BattleScript_StanceChangeActivates:: +BattleScript_AttackerFormChange:: pause 0x5 copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUp @@ -5983,8 +5989,12 @@ BattleScript_StanceChangeActivates:: waitanimation handleformchange BS_ATTACKER, 2 return + +BattleScript_AttackerFormChangeEnd3:: + call BattleScript_AttackerFormChange + end3 -BattleScript_DisguiseBustedActivates:: +BattleScript_TargetFormChange:: pause 0x5 copybyte gBattlerAbility, gBattlerTarget call BattleScript_AbilityPopUp diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index 8fec39df30..cd8886f641 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -19,6 +19,8 @@ bool32 DoesDisguiseBlockMove(u8 battlerAtk, u8 battlerDef, u32 move); 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 gUnknown_0831C494[][4]; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 493dc1cda2..9dd97ac464 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -329,8 +329,9 @@ extern const u8 BattleScript_MoveEffectBugBite[]; extern const u8 BattleScript_IllusionOff[]; extern const u8 BattleScript_DancerActivates[]; extern const u8 BattleScript_AftermathDmg[]; -extern const u8 BattleScript_StanceChangeActivates[]; -extern const u8 BattleScript_DisguiseBustedActivates[]; +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[]; diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index b93838b571..753ff8735a 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -13,6 +13,10 @@ #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 // Items with peculiar battle effects. Remove them if they're properly placed in constant/items.h #define ITEM_GRISEOUS_ORB 0 diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index bc88e04ad9..17fd45809d 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -153,6 +153,7 @@ #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 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 698ab718fc..1c0580d878 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1038,7 +1038,7 @@ static bool32 TryAegiFormChange(void) } BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_StanceChangeActivates; + gBattlescriptCurrInstr = BattleScript_AttackerFormChange; return TRUE; } @@ -1797,7 +1797,7 @@ static void Cmd_datahpupdate(void) { gBattleMons[gActiveBattler].species = SPECIES_MIMIKYU_BUSTED; BattleScriptPush(gBattlescriptCurrInstr + 2); - gBattlescriptCurrInstr = BattleScript_DisguiseBustedActivates; + gBattlescriptCurrInstr = BattleScript_TargetFormChange; } else { @@ -2224,8 +2224,7 @@ void SetMoveEffect(bool32 primary, u32 certain) || GetBattlerAbility(gEffectBattler) == ABILITY_INSOMNIA || GetBattlerAbility(gEffectBattler) == ABILITY_COMATOSE || IsAbilityOnSide(gEffectBattler, ABILITY_SWEET_VEIL) - || IsFlowerVeilProtected(gEffectBattler) - || IsLeafGuardProtected(gEffectBattler)) + || IsAbilityStatusProtected(gEffectBattler)) break; CancelMultiTurnMoves(gEffectBattler); @@ -2270,8 +2269,7 @@ void SetMoveEffect(bool32 primary, u32 certain) break; if (GetBattlerAbility(gEffectBattler) == ABILITY_IMMUNITY || GetBattlerAbility(gEffectBattler) == ABILITY_COMATOSE - || IsFlowerVeilProtected(gEffectBattler) - || IsLeafGuardProtected(gEffectBattler)) + || IsAbilityStatusProtected(gEffectBattler)) break; statusChanged = TRUE; @@ -2310,8 +2308,7 @@ void SetMoveEffect(bool32 primary, u32 certain) break; if (GetBattlerAbility(gEffectBattler) == ABILITY_WATER_VEIL || GetBattlerAbility(gEffectBattler) == ABILITY_COMATOSE - || IsFlowerVeilProtected(gEffectBattler) - || IsLeafGuardProtected(gEffectBattler)) + || IsAbilityStatusProtected(gEffectBattler)) break; if (gBattleMons[gEffectBattler].status1) break; @@ -2329,8 +2326,7 @@ void SetMoveEffect(bool32 primary, u32 certain) break; if (GetBattlerAbility(gEffectBattler) == ABILITY_MAGMA_ARMOR || GetBattlerAbility(gEffectBattler) == ABILITY_COMATOSE - || IsFlowerVeilProtected(gEffectBattler) - || IsLeafGuardProtected(gEffectBattler)) + || IsAbilityStatusProtected(gEffectBattler)) break; CancelMultiTurnMoves(gEffectBattler); @@ -2375,8 +2371,7 @@ void SetMoveEffect(bool32 primary, u32 certain) break; if (GetBattlerAbility(gEffectBattler) == ABILITY_LIMBER || GetBattlerAbility(gEffectBattler) == ABILITY_COMATOSE - || IsFlowerVeilProtected(gEffectBattler) - || IsLeafGuardProtected(gEffectBattler)) + || IsAbilityStatusProtected(gEffectBattler)) break; if (gBattleMons[gEffectBattler].status1) break; @@ -2419,8 +2414,7 @@ void SetMoveEffect(bool32 primary, u32 certain) { if (GetBattlerAbility(gEffectBattler) == ABILITY_IMMUNITY || GetBattlerAbility(gEffectBattler) == ABILITY_COMATOSE - || IsFlowerVeilProtected(gEffectBattler) - || IsLeafGuardProtected(gEffectBattler)) + || IsAbilityStatusProtected(gEffectBattler)) break; // It's redundant, because at this point we know the status1 value is 0. @@ -6748,6 +6742,19 @@ u32 IsLeafGuardProtected(u32 battler) 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); @@ -6809,6 +6816,12 @@ static void Cmd_various(void) 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_GET_STAT_VALUE: i = gBattlescriptCurrInstr[3]; gBattleMoveDamage = *(u16*)(&gBattleMons[gActiveBattler].attack) + (i - 1); diff --git a/src/battle_util.c b/src/battle_util.c index 6d099e60a1..58d052ee74 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2745,6 +2745,37 @@ static bool32 TryChangeBattleTerrain(u32 battler, u32 statusFlag, u8 *timer) return FALSE; } +static bool32 ShouldChangeFormHpBased(u32 battler) +{ + // Ability, form >, form <= + static const u16 forms[][3] = + { + {ABILITY_ZEN_MODE, SPECIES_DARMANITAN, SPECIES_DARMANITAN_ZEN}, + {ABILITY_SHIELDS_DOWN, SPECIES_MINIOR, SPECIES_MINIOR_CORE}, + }; + 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 / 2) + { + gBattleMons[battler].species = forms[i][1]; + return TRUE; + } + if (gBattleMons[battler].species == forms[i][1] + && gBattleMons[battler].hp <= gBattleMons[battler].maxHP / 2) + { + gBattleMons[battler].species = forms[i][2]; + return TRUE; + } + } + } + return FALSE; +} + u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveArg) { u8 effect = 0; @@ -3054,6 +3085,13 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } } break; + case ABILITY_SHIELDS_DOWN: + if (ShouldChangeFormHpBased(battler)) + { + BattleScriptPushCursorAndCallback(BattleScript_AttackerFormChangeEnd3); + effect++; + } + break; } break; case ABILITYEFFECT_ENDTURN: // 1 @@ -3203,6 +3241,11 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA effect++; } break; + case ABILITY_ZEN_MODE: + case ABILITY_SHIELDS_DOWN: + if ((effect = ShouldChangeFormHpBased(battler))) + BattleScriptPushCursorAndCallback(BattleScript_AttackerFormChangeEnd3); + break; } } break; @@ -3563,8 +3606,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && GetBattlerAbility(gBattlerAttacker) != ABILITY_INSOMNIA && GetBattlerAbility(gBattlerAttacker) != ABILITY_VITAL_SPIRIT && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY) - && !IsFlowerVeilProtected(gBattlerAttacker) - && !IsLeafGuardProtected(gBattlerAttacker) + && !IsAbilityStatusProtected(gBattlerAttacker) && IsMoveMakingContact(move, gBattlerAttacker) && (Random() % 3) == 0) { @@ -3587,8 +3629,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_STEEL) && GetBattlerAbility(gBattlerAttacker) != ABILITY_IMMUNITY && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY) - && !IsFlowerVeilProtected(gBattlerAttacker) - && !IsLeafGuardProtected(gBattlerAttacker) + && !IsAbilityStatusProtected(gBattlerAttacker) && IsMoveMakingContact(move, gBattlerAttacker) && (Random() % 3) == 0) { @@ -3609,8 +3650,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ELECTRIC) && GetBattlerAbility(gBattlerAttacker) != ABILITY_LIMBER && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY) - && !IsFlowerVeilProtected(gBattlerAttacker) - && !IsLeafGuardProtected(gBattlerAttacker) + && !IsAbilityStatusProtected(gBattlerAttacker) && IsMoveMakingContact(move, gBattlerAttacker) && (Random() % 3) == 0) { @@ -3630,8 +3670,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_FIRE) && GetBattlerAbility(gBattlerAttacker) != ABILITY_WATER_VEIL && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY) - && !IsFlowerVeilProtected(gBattlerAttacker) - && !IsLeafGuardProtected(gBattlerAttacker) + && !IsAbilityStatusProtected(gBattlerAttacker) && (Random() % 3) == 0) { gBattleScripting.moveEffect = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_BURN; @@ -3683,8 +3722,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && !IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_STEEL) && GetBattlerAbility(gBattlerTarget) != ABILITY_IMMUNITY && !(gBattleMons[gBattlerTarget].status1 & STATUS1_ANY) - && !IsFlowerVeilProtected(gBattlerTarget) - && !IsLeafGuardProtected(gBattlerTarget) + && !IsAbilityStatusProtected(gBattlerTarget) && IsMoveMakingContact(move, gBattlerAttacker) && (Random() % 3) == 0) { @@ -6533,6 +6571,8 @@ void UndoFormChange(u32 monId, u32 side) { {SPECIES_AEGISLASH_BLADE, SPECIES_AEGISLASH}, {SPECIES_MIMIKYU_BUSTED, SPECIES_MIMIKYU}, + {SPECIES_DARMANITAN_ZEN, SPECIES_DARMANITAN}, + {SPECIES_MINIOR, SPECIES_MINIOR_CORE}, }; currSpecies = GetMonData(&party[monId], MON_DATA_SPECIES, NULL); From 30900879a90dd9d3b865673a940c2450ae218d75 Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Sun, 19 Apr 2020 18:00:44 -0400 Subject: [PATCH 538/667] Option for setting Payback's damage double damage if the opponent switches out. (#338) * Option for setting Payback's damage double damage if the opponent switches out. * Simplified * Moody moved to ability settings --- include/constants/battle_config.h | 3 ++- src/battle_util.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 753ff8735a..f4b1881087 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -64,7 +64,7 @@ #define B_FELL_STINGER_STAT_RAISE GEN_6 // Gen6 Atk+2, Gen7 Atk+3. #define B_SOUND_SUBSTITUTE GEN_6 // Starting from Gen6 sound moves bypass Substitute. #define B_TOXIC_NEVER_MISS GEN_6 // Starting from Gen6, if Toxic is used by a Poison type, it will never miss. -#define B_MOODY_ACC_EVASION GEN_6 // In Gen8, Moody CANNOT raise Accuray and Evasion any more +#define B_PAYBACK_SWITCH_BOOST GEN_6 // Starting from Gen5, if the opponent switches out, Payback's damage will no longer be doubled. // Ability settings #define B_ABILITY_POP_UP GEN_6 // Starting from gen5, the pokemon abilities are displayed in a pop-up, when they activate in battle. @@ -72,6 +72,7 @@ #define B_GALE_WINGS GEN_6 // Gen7 requires full hp. #define B_STANCE_CHANGE_FAIL GEN_7 // In Gen7, Aegislash's form change does not happen, if the pokemon 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 // From Gen6 onwards, 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 // Other #define B_FAST_INTRO TRUE // If set to TRUE, battle intro texts print at the same time as animation of a pokemon, as opposing to waiting for the animation to end. diff --git a/src/battle_util.c b/src/battle_util.c index 58d052ee74..db14d4a668 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5554,7 +5554,8 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) } break; case EFFECT_PAYBACK: - if (GetBattlerTurnOrderNum(battlerAtk) > GetBattlerTurnOrderNum(battlerDef) && gDisableStructs[battlerDef].isFirstTurn != 2) + if (GetBattlerTurnOrderNum(battlerAtk) > GetBattlerTurnOrderNum(battlerDef) + && (gDisableStructs[battlerDef].isFirstTurn != 2 || B_PAYBACK_SWITCH_BOOST < GEN_5)) basePower *= 2; break; case EFFECT_ROUND: From ce28454461e54211bb7f219eb07fbbd6547d317d Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 20 Apr 2020 08:55:21 +0200 Subject: [PATCH 539/667] Fix Life Orb fainting an already fainted mon --- src/battle_script_commands.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1c0580d878..44468ba3ab 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4760,6 +4760,7 @@ static void Cmd_moveend(void) 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) From d38e0d8ae574fbca7db09eaa112dcb2b63f64909 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 20 Apr 2020 11:27:09 +0200 Subject: [PATCH 540/667] AI dont rely on power if bad effects --- data/battle_scripts_1.s | 18 ++--- include/constants/battle_move_effects.h | 4 +- src/battle_ai_script_commands.c | 87 ++++++++++++++++++------- src/battle_script_commands.c | 20 +++--- src/data/battle_moves.h | 16 ++--- src/data/trainer_parties.h | 2 +- 6 files changed, 94 insertions(+), 53 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index b4cfbcd3ac..e87b550c57 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -63,7 +63,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectRecoilIfMiss .4byte BattleScript_EffectMist .4byte BattleScript_EffectFocusEnergy - .4byte BattleScript_EffectRecoil + .4byte BattleScript_EffectRecoil25 .4byte BattleScript_EffectConfuse .4byte BattleScript_EffectAttackUp2 .4byte BattleScript_EffectDefenseUp2 @@ -213,7 +213,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectSnatch .4byte BattleScript_EffectLowKick .4byte BattleScript_EffectSecretPower - .4byte BattleScript_EffectDoubleEdge + .4byte BattleScript_EffectRecoil33 .4byte BattleScript_EffectTeeterDance .4byte BattleScript_EffectHitEscape .4byte BattleScript_EffectMudSport @@ -2821,12 +2821,6 @@ 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: attackcanceler attackstring @@ -4533,7 +4527,13 @@ 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 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 5b3c3bd64c..1cae783237 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -49,7 +49,7 @@ #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 @@ -199,7 +199,7 @@ #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_HIT_ESCAPE 200 #define EFFECT_MUD_SPORT 201 diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 1c8fb6b0dc..ebf9788e91 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -1378,8 +1378,8 @@ static void Cmd_get_considered_move_power(void) gAIScriptPtr += 1; } -// Checks if the move dealing less damage does not have worse effects. -static bool32 CompareTwoMoves(u32 bestMove, u32 goodMove) +// Checks if one of the moves has side effects or perks +static u32 WhichMoveBetter(u32 move1, u32 move2) { s32 defAbility = AI_GetAbility(gBattlerTarget, FALSE); @@ -1388,31 +1388,52 @@ static bool32 CompareTwoMoves(u32 bestMove, u32 goodMove) && (BATTLE_HISTORY->itemEffects[gBattlerTarget] == HOLD_EFFECT_ROCKY_HELMET || defAbility == ABILITY_IRON_BARBS || defAbility == ABILITY_ROUGH_SKIN)) { - if (IS_MOVE_PHYSICAL(goodMove) && !IS_MOVE_PHYSICAL(bestMove)) - return FALSE; + 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[goodMove].effect == EFFECT_RECOIL - || gBattleMoves[goodMove].effect == EFFECT_RECOIL_IF_MISS - || gBattleMoves[goodMove].effect == EFFECT_RECOIL_50 - || gBattleMoves[goodMove].effect == EFFECT_RECOIL_33_STATUS) - && (gBattleMoves[bestMove].effect != EFFECT_RECOIL - && gBattleMoves[bestMove].effect != EFFECT_RECOIL_IF_MISS - && gBattleMoves[bestMove].effect != EFFECT_RECOIL_50 - && gBattleMoves[bestMove].effect != EFFECT_RECOIL_33_STATUS - && gBattleMoves[bestMove].effect != EFFECT_RECHARGE))) - return FALSE; + 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[goodMove].effect == EFFECT_RECHARGE && gBattleMoves[bestMove].effect != EFFECT_RECHARGE) - return FALSE; + 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[bestMove].effect != 0 && gBattleMoves[goodMove].effect == 0) - return FALSE; + if (gBattleMoves[move1].effect == 0 && gBattleMoves[move2].effect != 0) + return 1; + if (gBattleMoves[move2].effect == 0 && gBattleMoves[move1].effect != 0) + return 0; - return TRUE; + return 2; } static void Cmd_get_how_powerful_move_is(void) @@ -1449,19 +1470,39 @@ static void Cmd_get_how_powerful_move_is(void) } } - for (bestId = 0, i = 0; i < MAX_MON_MOVES; i++) + 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[i] > hp) + moveDmgs[i] = hp; + } + + 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; - hp = gBattleMons[gBattlerTarget].hp; if (currId == bestId) AI_THINKING_STRUCT->funcResult = MOVE_POWER_BEST; // Compare percentage difference. - else if ((moveDmgs[bestId] * 100 / hp) - (moveDmgs[currId] * 100 / hp) <= 10 - && CompareTwoMoves(gBattleMons[sBattler_AI].moves[bestId], gBattleMons[sBattler_AI].moves[currId])) + 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_POWER_WEAK; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 44468ba3ab..a1dfe79489 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2599,14 +2599,6 @@ void SetMoveEffect(bool32 primary, u32 certain) } } break; - case MOVE_EFFECT_RECOIL_25: // 25% recoil - gBattleMoveDamage = (gHpDealt) / 4; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; - - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect]; - break; case MOVE_EFFECT_ATK_PLUS_1: case MOVE_EFFECT_DEF_PLUS_1: case MOVE_EFFECT_SPD_PLUS_1: @@ -2812,7 +2804,15 @@ void SetMoveEffect(bool32 primary, u32 certain) BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_DefSpDefDown; break; - case MOVE_EFFECT_RECOIL_33: // Double Edge + 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; @@ -2820,7 +2820,7 @@ void SetMoveEffect(bool32 primary, u32 certain) BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect]; break; - case MOVE_EFFECT_RECOIL_50: // Head Smash + case MOVE_EFFECT_RECOIL_50: // Head Smash, 50 % recoil gBattleMoveDamage = gHpDealt / 2; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 462cabeab0..7f310e2a47 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -506,7 +506,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_TAKE_DOWN] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_RECOIL_25, .power = 90, .type = TYPE_NORMAL, .accuracy = 85, @@ -534,7 +534,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_DOUBLE_EDGE] = { - .effect = EFFECT_DOUBLE_EDGE, + .effect = EFFECT_RECOIL_33, .power = 120, .type = TYPE_NORMAL, .accuracy = 100, @@ -926,7 +926,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_SUBMISSION] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_RECOIL_25, .power = 80, .type = TYPE_FIGHTING, .accuracy = 80, @@ -2313,7 +2313,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_STRUGGLE] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_RECOIL_25, .power = 50, .type = TYPE_NORMAL, .accuracy = 0, @@ -5790,7 +5790,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_BRAVE_BIRD] = { - .effect = EFFECT_DOUBLE_EDGE, + .effect = EFFECT_RECOIL_33, .power = 120, .type = TYPE_FLYING, .accuracy = 100, @@ -6339,7 +6339,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_WOOD_HAMMER] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_RECOIL_25, .power = 120, .type = TYPE_GRASS, .accuracy = 100, @@ -7405,7 +7405,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_WILD_CHARGE] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_RECOIL_25, .power = 90, .type = TYPE_ELECTRIC, .accuracy = 100, @@ -7615,7 +7615,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_HEAD_CHARGE] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_RECOIL_25, .power = 120, .type = TYPE_NORMAL, .accuracy = 100, diff --git a/src/data/trainer_parties.h b/src/data/trainer_parties.h index 824a49dc3e..e2a509e092 100644 --- a/src/data/trainer_parties.h +++ b/src/data/trainer_parties.h @@ -3218,7 +3218,7 @@ static const struct TrainerMonItemCustomMoves sParty_Sidney[] = { .lvl = 46, .species = SPECIES_MIGHTYENA, .heldItem = ITEM_NONE, - .moves = {MOVE_ROAR, MOVE_DOUBLE_EDGE, MOVE_SAND_ATTACK, MOVE_CRUNCH} + .moves = {MOVE_TAKE_DOWN, MOVE_DOUBLE_EDGE, MOVE_BITE, MOVE_CRUNCH} }, { .iv = 250, From 5486b337846252bfa786623b2ccafa5d67023104 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 20 Apr 2020 11:51:32 +0200 Subject: [PATCH 541/667] AI hwords alignment --- data/battle_ai_scripts.s | 3 +++ 1 file changed, 3 insertions(+) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index ebdea7bc15..88a2c719db 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -1287,6 +1287,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 @@ -3473,6 +3474,7 @@ sMovesTable_ProtectMoves: .2byte MOVE_DETECT .2byte -1 +.align 1 sEffectsStatRaise: .2byte EFFECT_ATTACK_UP .2byte EFFECT_ATTACK_UP_2 @@ -3758,6 +3760,7 @@ AI_HPAware_TargetTryToDiscourage: AI_HPAware_End: end +.align 1 AI_HPAware_DiscouragedEffectsWhenHighHP: @ 82DE21F .2byte EFFECT_EXPLOSION .2byte EFFECT_RESTORE_HP From 28805b0f989e00626c81672cfce5e6f3fd5c15be Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 20 Apr 2020 12:14:56 +0200 Subject: [PATCH 542/667] AI powder moves --- data/battle_ai_scripts.s | 14 ++-- src/battle_script_commands.c | 148 ++++++++++++++++++----------------- src/data/trainer_parties.h | 2 +- 3 files changed, 86 insertions(+), 78 deletions(-) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 88a2c719db..f3d852f6fb 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -47,12 +47,16 @@ 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 MOVE_POWER_DISCOURAGED, AI_CheckBadMove_CheckEffect +@ 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 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a1dfe79489..d5f004ed61 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1284,9 +1284,83 @@ static bool32 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); + defAbility = GetBattlerAbility(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 + + defHoldEffect = GetBattlerHoldEffect(battlerDef, TRUE); + defParam = GetBattlerHoldEffectParam(battlerDef); + gPotentialItemEffectBattler = battlerDef; + + atkHoldEffect = GetBattlerHoldEffect(battlerAtk, TRUE); + atkParam = GetBattlerHoldEffectParam(battlerAtk); + + 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 == ACC_CURR_MOVE) move = gCurrentMove; @@ -1302,84 +1376,14 @@ static void Cmd_accuracycheck(void) } else { - u8 type, moveAcc, atkHoldEffect, atkParam, defHoldEffect, defParam, atkAbility, defAbility; - s8 buff, accStage, evasionStage; - u32 calc; - GET_MOVE_TYPE(move, type); - if (JumpIfMoveAffectedByProtect(move)) return; if (AccuracyCalcHelper(move)) return; - atkAbility = GetBattlerAbility(gBattlerAttacker); - defAbility = GetBattlerAbility(gBattlerTarget); - - accStage = gBattleMons[gBattlerAttacker].statStages[STAT_ACC]; - evasionStage = gBattleMons[gBattlerTarget].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[gBattlerTarget].status2 & STATUS2_FORESIGHT || gStatuses3[gBattlerTarget] & 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(gBattlerAttacker)) && GetBattlerAbility(BATTLE_PARTNER(gBattlerAttacker)) == 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[gBattlerTarget].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 - - defHoldEffect = GetBattlerHoldEffect(gBattlerTarget, TRUE); - defParam = GetBattlerHoldEffectParam(gBattlerTarget); - gPotentialItemEffectBattler = gBattlerTarget; - - atkHoldEffect = GetBattlerHoldEffect(gBattlerAttacker, TRUE); - atkParam = GetBattlerHoldEffectParam(gBattlerAttacker); - - 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(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)); - calc = (calc * (100 + atkParam)) / 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 && diff --git a/src/data/trainer_parties.h b/src/data/trainer_parties.h index e2a509e092..824a49dc3e 100644 --- a/src/data/trainer_parties.h +++ b/src/data/trainer_parties.h @@ -3218,7 +3218,7 @@ static const struct TrainerMonItemCustomMoves sParty_Sidney[] = { .lvl = 46, .species = SPECIES_MIGHTYENA, .heldItem = ITEM_NONE, - .moves = {MOVE_TAKE_DOWN, MOVE_DOUBLE_EDGE, MOVE_BITE, MOVE_CRUNCH} + .moves = {MOVE_ROAR, MOVE_DOUBLE_EDGE, MOVE_SAND_ATTACK, MOVE_CRUNCH} }, { .iv = 250, From 3dfd19b3e21a6d48a8a49d3ee42c72968a48bf48 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 20 Apr 2020 13:00:04 +0200 Subject: [PATCH 543/667] AI Weather moves tweaks --- data/battle_ai_scripts.s | 68 +++++++++++++++++++++++++++----- include/battle_script_commands.h | 1 + src/battle_script_commands.c | 13 +++--- 3 files changed, 65 insertions(+), 17 deletions(-) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index f3d852f6fb..eede97194d 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -2669,8 +2669,13 @@ 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_End + 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_SunnyDay_End +AI_CV_RainDance_OpponentPlus: + score +1 AI_CV_RainDance_End: end @@ -2680,16 +2685,51 @@ AI_CV_SunnyDay: 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_End: +AI_CV_SunnyDay_Rock: get_hold_effect AI_USER - if_not_equal HOLD_EFFECT_HEAT_ROCK, AI_Ret + 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 AI_CV_BellyDrum: @@ -2911,16 +2951,22 @@ AI_CV_Hail_ScoreDown1: score -1 AI_CV_Hail_Rock: get_hold_effect AI_USER - if_not_equal HOLD_EFFECT_ICY_ROCK, AI_Ret + 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_End + if_not_equal ABILITY_FORECAST, AI_CV_Hail_Move AI_CV_Hail_AbilityPlus: - score +1, + 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 @@ -3347,9 +3393,7 @@ AI_SetupFirstTurn: if_not_equal 0, AI_SetupFirstTurn_End get_considered_move_effect if_not_in_hwords AI_SetupFirstTurn_SetupEffectsToEncourage, AI_SetupFirstTurn_End - if_random_less_than 80, AI_SetupFirstTurn_End score +2 - AI_SetupFirstTurn_End: end @@ -3429,6 +3473,10 @@ AI_SetupFirstTurn_SetupEffectsToEncourage: .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 -1 AI_PreferStrongestMove: diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index cd8886f641..f0fc7b8c19 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -5,6 +5,7 @@ #define WINDOW_x80 0x80 s32 CalcCritChanceStage(u8 battlerAtk, u8 battlerDef, u32 move, bool32 recordAbility); +u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move); u8 GetBattlerTurnOrderNum(u8 battlerId); bool32 NoAliveMonsForEitherParty(void); void SetMoveEffect(bool32 primary, u32 certain); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d5f004ed61..af3ee4932f 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1290,7 +1290,13 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move) 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]; @@ -1340,13 +1346,6 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move) if (atkAbility == ABILITY_HUSTLE && IS_MOVE_PHYSICAL(move)) calc = (calc * 80) / 100; // 1.2 hustle loss - defHoldEffect = GetBattlerHoldEffect(battlerDef, TRUE); - defParam = GetBattlerHoldEffectParam(battlerDef); - gPotentialItemEffectBattler = battlerDef; - - atkHoldEffect = GetBattlerHoldEffect(battlerAtk, TRUE); - atkParam = GetBattlerHoldEffectParam(battlerAtk); - if (defHoldEffect == HOLD_EFFECT_EVASION_UP) calc = (calc * (100 - defParam)) / 100; From 1fdb195bd95c3d55e688d9cbd930d3320732346d Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Mon, 20 Apr 2020 07:22:42 -0400 Subject: [PATCH 544/667] Added Gen 8 overworld effects. (#342) - LIGHTNING_ROD - FLASH_FIRE - HARVEST - STORM_DRAIN - MAGNET_PULL - INFILTRATOR - SUPER LUCK --- src/pokemon.c | 3 ++- src/wild_encounter.c | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/pokemon.c b/src/pokemon.c index c641568c67..a417fffec8 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -6220,7 +6220,8 @@ void SetWildMonHeldItem(void) 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_COMPOUND_EYES + || GetMonAbility(&gPlayerParty[0]) == ABILITY_SUPER_LUCK)) { var1 = 20; var2 = 80; diff --git a/src/wild_encounter.c b/src/wild_encounter.c index 9d791c34c6..9853d542f9 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -406,12 +406,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; @@ -500,6 +518,8 @@ static bool8 DoWildEncounterRateTest(u32 encounterRate, bool8 ignoreAbility) 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; } From 4697a5b687a70c53c38099b413d9f5e0fbd4f1f7 Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Mon, 20 Apr 2020 08:11:28 -0400 Subject: [PATCH 545/667] More Battle configs (#339) * Fixed naming of King Shield's description variable. * Config for King Shield lowering attack. * Config for terrain type attack boost. * Standarized battle config descriptions. * Adjusted config logic accounting for GEN_8. * Changed KING_S_SHIELD back to KINGS_SHIELD * Missed B_ABILITY_WEATHER. --- include/constants/battle_config.h | 36 ++++++++++++++++--------------- include/constants/moves.h | 2 +- src/battle_main.c | 2 +- src/battle_script_commands.c | 16 +++++++------- src/battle_util.c | 6 +++--- src/data/battle_moves.h | 2 +- src/data/contest_moves.h | 2 +- src/data/text/move_descriptions.h | 2 +- src/data/text/move_names.h | 2 +- 9 files changed, 36 insertions(+), 34 deletions(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index f4b1881087..a1fbe57c49 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -53,28 +53,30 @@ #define GEN_8 5 // Calculation settings -#define B_CRIT_CHANCE GEN_6 // Chances of a critical hit landing. See atk04_critcalc. -#define B_CRIT_MULTIPLIER GEN_6 // Starting from gen6, critical hits multiply damage by 1.5 instead of 2. -#define B_EXP_CATCH GEN_6 // Starting from gen6, pokemon get experience from catching. -#define B_TRAINER_EXP_MULTIPLIER GEN_6 // Gen7 no longer gives a 1.5 multiplier to exp gain in trainer battles. -#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_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%. // Move settings -#define B_FELL_STINGER_STAT_RAISE GEN_6 // Gen6 Atk+2, Gen7 Atk+3. -#define B_SOUND_SUBSTITUTE GEN_6 // Starting from Gen6 sound moves bypass Substitute. -#define B_TOXIC_NEVER_MISS GEN_6 // Starting from Gen6, if Toxic is used by a Poison type, it will never miss. -#define B_PAYBACK_SWITCH_BOOST GEN_6 // Starting from Gen5, if the opponent switches out, Payback's damage will no longer be doubled. +#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. // Ability settings -#define B_ABILITY_POP_UP GEN_6 // Starting from gen5, the pokemon abilities are displayed in a pop-up, when they activate in battle. -#define B_ABILITY_WEATHER GEN_6 // Up to gen5 - weather induced by abilities such as Drought or Drizzle lasted till the battle's end or weather change by a move. From Gen6 onwards, weather caused by abilities lasts the same amount of turns as induced from a move. -#define B_GALE_WINGS GEN_6 // Gen7 requires full hp. -#define B_STANCE_CHANGE_FAIL GEN_7 // In Gen7, Aegislash's form change does not happen, if the pokemon 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 // From Gen6 onwards, 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_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. // Other -#define B_FAST_INTRO TRUE // If set to TRUE, battle intro texts print at the same time as animation of a pokemon, as opposing to waiting for the animation to end. +#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. #endif // GUARD_CONSTANTS_BATTLE_CONFIG_H diff --git a/include/constants/moves.h b/include/constants/moves.h index dcfc74861e..38a82e2895 100644 --- a/include/constants/moves.h +++ b/include/constants/moves.h @@ -601,7 +601,7 @@ #define MOVE_MOONBLAST 585 #define MOVE_BOOMBURST 586 #define MOVE_FAIRY_LOCK 587 -#define MOVE_KING_S_SHIELD 588 +#define MOVE_KINGS_SHIELD 588 #define MOVE_PLAY_NICE 589 #define MOVE_CONFIDE 590 #define MOVE_DIAMOND_STORM 591 diff --git a/src/battle_main.c b/src/battle_main.c index 626f91062d..723e33a7a6 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4311,7 +4311,7 @@ s8 GetMovePriority(u32 battlerId, u16 move) priority = gBattleMoves[move].priority; if (GetBattlerAbility(battlerId) == ABILITY_GALE_WINGS && gBattleMoves[move].type == TYPE_FLYING - && (B_GALE_WINGS == GEN_6 || BATTLER_MAX_HP(battlerId))) + && (B_GALE_WINGS <= GEN_6 || BATTLER_MAX_HP(battlerId))) { priority++; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index af3ee4932f..09148d6633 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -780,7 +780,7 @@ static const u8 sForbiddenMoves[MOVES_COUNT] = [MOVE_HYPERSPACE_HOLE] = FORBIDDEN_METRONOME, [MOVE_ICE_BURN] = FORBIDDEN_METRONOME, [MOVE_INSTRUCT] = FORBIDDEN_METRONOME, - [MOVE_KING_S_SHIELD] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT, + [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, @@ -1031,7 +1031,7 @@ static bool32 TryAegiFormChange(void) gBattleMons[gBattlerAttacker].species = SPECIES_AEGISLASH_BLADE; break; case SPECIES_AEGISLASH_BLADE: // Blade -> Shield - if (gCurrentMove != MOVE_KING_S_SHIELD) + if (gCurrentMove != MOVE_KINGS_SHIELD) return FALSE; gBattleMons[gBattlerAttacker].species = SPECIES_AEGISLASH; break; @@ -1467,7 +1467,7 @@ static void Cmd_ppreduce(void) } // The chance is 1/N for each stage. -#if B_CRIT_CHANCE == GEN_7 +#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}; @@ -3536,7 +3536,7 @@ static void Cmd_getexp(void) gBattleMoveDamage += gExpShareExp; if (holdEffect == HOLD_EFFECT_LUCKY_EGG) gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && B_TRAINER_EXP_MULTIPLIER != GEN_7) + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && B_TRAINER_EXP_MULTIPLIER <= GEN_7) gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; if (IsTradedMon(&gPlayerParty[gBattleStruct->expGetterMonId])) @@ -4471,7 +4471,7 @@ static void Cmd_moveend(void) i = gBattlerAttacker; gBattlerAttacker = gBattlerTarget; gBattlerTarget = i; // gBattlerTarget and gBattlerAttacker are swapped in order to activate Defiant, if applicable - gBattleScripting.moveEffect = MOVE_EFFECT_ATK_MINUS_2; + 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; @@ -7259,7 +7259,7 @@ static void Cmd_various(void) { if (gBattleMons[gBattlerAttacker].statStages[STAT_ATK] >= 11) SET_STATCHANGER(STAT_ATK, 1, FALSE); - else if (gBattleMons[gBattlerAttacker].statStages[STAT_ATK] <= 9 && B_FELL_STINGER_STAT_RAISE == GEN_7) + else if (gBattleMons[gBattlerAttacker].statStages[STAT_ATK] <= 9 && B_FELL_STINGER_STAT_RAISE >= GEN_7) SET_STATCHANGER(STAT_ATK, 3, FALSE); else SET_STATCHANGER(STAT_ATK, 2, FALSE); @@ -7639,7 +7639,7 @@ static void Cmd_various(void) break; } if (gLastMoves[gBattlerTarget] == 0 || gLastMoves[gBattlerTarget] == 0xFFFF || sMoveEffectsForbiddenToInstruct[i] != FORBIDDEN_INSTRUCT_END - || gLastMoves[gBattlerTarget] == MOVE_STRUGGLE || gLastMoves[gBattlerTarget] == MOVE_KING_S_SHIELD) + || gLastMoves[gBattlerTarget] == MOVE_STRUGGLE || gLastMoves[gBattlerTarget] == MOVE_KINGS_SHIELD) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); } @@ -7978,7 +7978,7 @@ static void Cmd_setprotectlike(void) gProtectStructs[gBattlerAttacker].spikyShielded = 1; gBattleCommunication[MULTISTRING_CHOOSER] = 0; } - else if (gCurrentMove == MOVE_KING_S_SHIELD) + else if (gCurrentMove == MOVE_KINGS_SHIELD) { gProtectStructs[gBattlerAttacker].kingsShielded = 1; gBattleCommunication[MULTISTRING_CHOOSER] = 0; diff --git a/src/battle_util.c b/src/battle_util.c index db14d4a668..28be831eca 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5825,13 +5825,13 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe 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, UQ_4_12(1.5)); + 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, UQ_4_12(1.5)); + 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, UQ_4_12(1.5)); + MulModifier(&modifier, (B_TERRAIN_TYPE_BOOST >= GEN_8) ? UQ_4_12(1.3) : UQ_4_12(1.5)); return ApplyModifier(modifier, basePower); } diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 7f310e2a47..da321ecbfb 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -8252,7 +8252,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_STATUS, }, - [MOVE_KING_S_SHIELD] = + [MOVE_KINGS_SHIELD] = { .effect = EFFECT_PROTECT, .power = 0, diff --git a/src/data/contest_moves.h b/src/data/contest_moves.h index d049837b4e..7b6dc90688 100644 --- a/src/data/contest_moves.h +++ b/src/data/contest_moves.h @@ -4693,7 +4693,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .comboMoves = {0} }, - [MOVE_KING_S_SHIELD] = + [MOVE_KINGS_SHIELD] = { .effect = CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_TOUGH, diff --git a/src/data/text/move_descriptions.h b/src/data/text/move_descriptions.h index 4832365afc..9e36f9d3bc 100644 --- a/src/data/text/move_descriptions.h +++ b/src/data/text/move_descriptions.h @@ -3131,7 +3131,7 @@ const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] = [MOVE_MOONBLAST - 1] = sMOONBLASTDescription, [MOVE_BOOMBURST - 1] = sBOOMBURSTDescription, [MOVE_FAIRY_LOCK - 1] = sFAIRY_LOCKDescription, - [MOVE_KING_S_SHIELD - 1] = sKINGS_SHIELDDescription, + [MOVE_KINGS_SHIELD - 1] = sKINGS_SHIELDDescription, [MOVE_PLAY_NICE - 1] = sPLAY_NICEDescription, [MOVE_CONFIDE - 1] = sCONFIDEDescription, [MOVE_DIAMOND_STORM - 1] = sDIAMOND_STORMDescription, diff --git a/src/data/text/move_names.h b/src/data/text/move_names.h index a1e8db6514..99e6f7ae4f 100644 --- a/src/data/text/move_names.h +++ b/src/data/text/move_names.h @@ -588,7 +588,7 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_MOONBLAST] = _("Moonblast"), [MOVE_BOOMBURST] = _("Boomburst"), [MOVE_FAIRY_LOCK] = _("Fairy Lock"), - [MOVE_KING_S_SHIELD] = _("Kings Shield"), + [MOVE_KINGS_SHIELD] = _("Kings Shield"), [MOVE_PLAY_NICE] = _("Play Nice"), [MOVE_CONFIDE] = _("Confide"), [MOVE_DIAMOND_STORM] = _("DiamondStorm"), From 260cbe6b65a0d122d2ede4e0e4610c075f94542f Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 20 Apr 2020 09:12:09 -0300 Subject: [PATCH 546/667] Fixed the definitions of King's Shield, Forest's Curse and Land's Wrath (#340) --- include/constants/moves.h | 4 ++-- src/data/battle_moves.h | 4 ++-- src/data/contest_moves.h | 4 ++-- src/data/text/move_descriptions.h | 4 ++-- src/data/text/move_names.h | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/include/constants/moves.h b/include/constants/moves.h index 38a82e2895..5ff3f9ce60 100644 --- a/include/constants/moves.h +++ b/include/constants/moves.h @@ -584,7 +584,7 @@ #define MOVE_NOBLE_ROAR 568 #define MOVE_ION_DELUGE 569 #define MOVE_PARABOLIC_CHARGE 570 -#define MOVE_FOREST_S_CURSE 571 +#define MOVE_FORESTS_CURSE 571 #define MOVE_PETAL_BLIZZARD 572 #define MOVE_FREEZE_DRY 573 #define MOVE_DISARMING_VOICE 574 @@ -629,7 +629,7 @@ #define MOVE_OBLIVION_WING 613 #define MOVE_THOUSAND_ARROWS 614 #define MOVE_THOUSAND_WAVES 615 -#define MOVE_LAND_S_WRATH 616 +#define MOVE_LANDS_WRATH 616 #define MOVE_LIGHT_OF_RUIN 617 #define MOVE_ORIGIN_PULSE 618 #define MOVE_PRECIPICE_BLADES 619 diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index da321ecbfb..ddaaf2c1c9 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -8011,7 +8011,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_SPECIAL, }, - [MOVE_FOREST_S_CURSE] = + [MOVE_FORESTS_CURSE] = { .effect = EFFECT_THIRD_TYPE, .power = 0, @@ -8645,7 +8645,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .split = SPLIT_PHYSICAL, }, - [MOVE_LAND_S_WRATH] = + [MOVE_LANDS_WRATH] = { .effect = EFFECT_HIT, .power = 90, diff --git a/src/data/contest_moves.h b/src/data/contest_moves.h index 7b6dc90688..8b87aba100 100644 --- a/src/data/contest_moves.h +++ b/src/data/contest_moves.h @@ -4557,7 +4557,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .comboMoves = {0} }, - [MOVE_FOREST_S_CURSE] = + [MOVE_FORESTS_CURSE] = { .effect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, @@ -4917,7 +4917,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .comboMoves = {COMBO_STARTER_THOUSAND_ARROWS}, }, - [MOVE_LAND_S_WRATH] = + [MOVE_LANDS_WRATH] = { .effect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_TOUGH, diff --git a/src/data/text/move_descriptions.h b/src/data/text/move_descriptions.h index 9e36f9d3bc..cf968471a8 100644 --- a/src/data/text/move_descriptions.h +++ b/src/data/text/move_descriptions.h @@ -3114,7 +3114,7 @@ const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] = [MOVE_NOBLE_ROAR - 1] = sNOBLE_ROARDescription, [MOVE_ION_DELUGE - 1] = sION_DELUGEDescription, [MOVE_PARABOLIC_CHARGE - 1] = sNotDoneYetDescription, - [MOVE_FOREST_S_CURSE - 1] = sFORESTS_CURSEDescription, + [MOVE_FORESTS_CURSE - 1] = sFORESTS_CURSEDescription, [MOVE_PETAL_BLIZZARD - 1] = sPETAL_BLIZZARDDescription, [MOVE_FREEZE_DRY - 1] = sFREEZE_DRYDescription, [MOVE_DISARMING_VOICE - 1] = sDISARMING_VOICEDescription, @@ -3159,7 +3159,7 @@ const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] = [MOVE_OBLIVION_WING - 1] = sDRAINING_KISSDescription, [MOVE_THOUSAND_ARROWS - 1] = sTHOUSAND_ARROWSDescription, [MOVE_THOUSAND_WAVES - 1] = sTHOUSAND_WAVESDescription, - [MOVE_LAND_S_WRATH - 1] = sNotDoneYetDescription, + [MOVE_LANDS_WRATH - 1] = sNotDoneYetDescription, [MOVE_LIGHT_OF_RUIN - 1] = sLIGHT_OF_RUINDescription, [MOVE_ORIGIN_PULSE - 1] = sORIGIN_PULSEDescription, [MOVE_PRECIPICE_BLADES - 1] = sPRECIPICE_BLADESDescription, diff --git a/src/data/text/move_names.h b/src/data/text/move_names.h index 99e6f7ae4f..49fb4c6610 100644 --- a/src/data/text/move_names.h +++ b/src/data/text/move_names.h @@ -571,7 +571,7 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_NOBLE_ROAR] = _("Noble Roar"), [MOVE_ION_DELUGE] = _("Ion Deluge"), [MOVE_PARABOLIC_CHARGE] = _("Parabolic Ch"), - [MOVE_FOREST_S_CURSE] = _("ForestsCurse"), + [MOVE_FORESTS_CURSE] = _("ForestsCurse"), [MOVE_PETAL_BLIZZARD] = _("Petal Storm"), [MOVE_FREEZE_DRY] = _("Freeze Dry"), [MOVE_DISARMING_VOICE] = _("Disarming Vo"), @@ -616,7 +616,7 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_OBLIVION_WING] = _("OblivionWing"), [MOVE_THOUSAND_ARROWS] = _("Thousand Ar"), [MOVE_THOUSAND_WAVES] = _("Thousand Wav"), - [MOVE_LAND_S_WRATH] = _("Lands Wrath"), + [MOVE_LANDS_WRATH] = _("Lands Wrath"), [MOVE_LIGHT_OF_RUIN] = _("LightOfRuin"), [MOVE_ORIGIN_PULSE] = _("Origin Pulse"), [MOVE_PRECIPICE_BLADES] = _("Precipice Bl"), From 5d412d37d82682f5685a3d3d81d36b9f53cc94fa Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 20 Apr 2020 14:47:00 +0200 Subject: [PATCH 547/667] More Ai tweaks --- asm/macros/battle_ai_script.inc | 4 +++ data/battle_ai_scripts.s | 47 ++++++++------------------------- src/battle_ai_script_commands.c | 17 +++++++----- 3 files changed, 25 insertions(+), 43 deletions(-) diff --git a/asm/macros/battle_ai_script.inc b/asm/macros/battle_ai_script.inc index 173595c82d..7fa775ef39 100644 --- a/asm/macros/battle_ai_script.inc +++ b/asm/macros/battle_ai_script.inc @@ -664,6 +664,10 @@ .byte 0x74 .endm + .macro get_considered_move_split + .byte 0x75 + .endm + @ useful script macros .macro if_has_physical_move battler:req, ptr:req if_has_move_with_split \battler, SPLIT_PHYSICAL, \ptr diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index eede97194d..d68ad696d4 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -2214,8 +2214,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 @@ -2226,10 +2226,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: @@ -2245,18 +2242,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 @@ -2643,6 +2628,8 @@ 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 @@ -2673,13 +2660,15 @@ AI_CV_RainDance_Rock: 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_SunnyDay_End + 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 @@ -2796,8 +2785,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 @@ -2808,10 +2797,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: @@ -2827,17 +2813,6 @@ 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_ChargeUpMove: if_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_ChargeUpMove_ScoreDown2 if_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_ChargeUpMove_ScoreDown2 diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index ebf9788e91..200bcb914a 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -175,6 +175,7 @@ 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); // ewram EWRAM_DATA const u8 *gAIScriptPtr = NULL; @@ -302,6 +303,7 @@ static const BattleAICmdFunc sBattleAICmdTable[] = 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 }; static const u16 sDiscouragedPowerfulMoveEffects[] = @@ -1517,11 +1519,7 @@ 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; } @@ -2799,7 +2797,12 @@ static void Cmd_get_curr_dmg_hp_percent(void) static void Cmd_get_move_split_from_result(void) { - AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->funcResult].type; - + 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; } From 33442c3f91cd617238f557f46e38c0959bdefc0f Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 20 Apr 2020 15:01:57 +0200 Subject: [PATCH 548/667] Fix Rock Polish anim sfx --- data/battle_anim_scripts.s | 1 + 1 file changed, 1 insertion(+) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 40ad9553c9..ffd9450ec5 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1776,6 +1776,7 @@ Move_ROCK_POLISH: setalpha 12, 8 createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, 1, 3, 0, 12, RGB_BLACK waitforvisualfinish + loopsewithpan SE_W104, SOUND_PAN_ATTACKER, 10, 7 createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, -10, 3 delay 1 createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, 24, -19 From 9c44adba989f857c26537cbbcec0ddde154e23f9 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 20 Apr 2020 15:04:04 +0200 Subject: [PATCH 549/667] Low Sweep anim --- data/battle_anim_scripts.s | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index ffd9450ec5..6af4c3752b 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -4202,6 +4202,15 @@ Move_COIL: 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_W233B, SOUND_PAN_TARGET + waitforvisualfinish + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 4 end Move_ACID_SPRAY: From 2daf1fbbf8f46be2752e8751eb1eaeb79f68e831 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 20 Apr 2020 19:02:03 +0200 Subject: [PATCH 550/667] Geomancy --- data/battle_ai_scripts.s | 6 ++++ data/battle_scripts_1.s | 45 ++++++++++++++++++++++++- include/constants/battle_move_effects.h | 1 + include/constants/battle_string_ids.h | 3 +- src/battle_message.c | 5 ++- src/battle_script_commands.c | 13 ++++--- src/battle_util.c | 2 +- src/data/battle_moves.h | 2 +- 8 files changed, 68 insertions(+), 9 deletions(-) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index d68ad696d4..17b426b8db 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -261,6 +261,11 @@ AI_CheckBadMove_CheckEffect: @ 82DC045 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 + end + +AI_CBM_Geomancy: + call AI_CBM_QuiverDance end AI_CBM_FollowMe: @@ -3452,6 +3457,7 @@ AI_SetupFirstTurn_SetupEffectsToEncourage: .2byte EFFECT_SUNNY_DAY .2byte EFFECT_SANDSTORM .2byte EFFECT_HAIL + .2byte EFFECT_GEOMANCY .2byte -1 AI_PreferStrongestMove: diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e87b550c57..7820cef720 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -360,6 +360,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectPurify .4byte BattleScript_EffectBurnUp .4byte BattleScript_EffectShoreUp + .4byte BattleScript_EffectGeomancy BattleScript_EffectBurnUp: attackcanceler @@ -3046,7 +3047,49 @@ BattleScript_EffectTwoTurnsAttackIceBurn: goto BattleScript_EffectTwoTurnsAttackContinue BattleScript_EffectTwoTurnsAttackFreezeShock: setbyte sTWOTURN_STRINGID, 0x0 - goto BattleScript_EffectTwoTurnsAttackContinue + 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 + goto BattleScript_MoveEnd + +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:: setmoveeffect MOVE_EFFECT_CONFUSION diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 1cae783237..425d83ac19 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -348,5 +348,6 @@ #define EFFECT_PURIFY 342 #define EFFECT_BURN_UP 343 #define EFFECT_SHORE_UP 344 +#define EFFECT_GEOMANCY 345 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 24cdd4f905..ca2d22a9f5 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -545,7 +545,8 @@ #define STRINGID_HEALERCURE 541 #define STRINGID_SCRIPTINGABILITYSTATRAISE 542 #define STRINGID_RECEIVERABILITYTAKEOVER 543 +#define STRINGID_PKNMABSORBINGPOWER 544 -#define BATTLESTRINGS_COUNT 544 +#define BATTLESTRINGS_COUNT 545 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_message.c b/src/battle_message.c index 4e3752c9f3..0e1822035f 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -666,9 +666,11 @@ static const u8 sText_AttackerCuredTargetStatus[] = _("{B_ATK_NAME_WITH_PREFIX} 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!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_PKNMABSORBINGPOWER - 12] = sText_PkmnAbsorbingPower, [STRINGID_RECEIVERABILITYTAKEOVER - 12] = sText_ReceiverAbilityTakeOver, [STRINGID_SCRIPTINGABILITYSTATRAISE - 12] = sText_ScriptingAbilityRaisedStat, [STRINGID_HEALERCURE - 12] = sText_HealerCure, @@ -1334,7 +1336,8 @@ const u16 gStatDownStringIds[] = const u16 gFirstTurnOfTwoStringIds[] = { STRINGID_PKMNWHIPPEDWHIRLWIND, STRINGID_PKMNTOOKSUNLIGHT, STRINGID_PKMNLOWEREDHEAD, STRINGID_PKMNISGLOWING, - STRINGID_PKMNFLEWHIGH, STRINGID_PKMNDUGHOLE, STRINGID_PKMNHIDUNDERWATER, STRINGID_PKMNSPRANGUP, STRINGID_VANISHEDINSTANTLY + STRINGID_PKMNFLEWHIGH, STRINGID_PKMNDUGHOLE, STRINGID_PKMNHIDUNDERWATER, STRINGID_PKMNSPRANGUP, STRINGID_VANISHEDINSTANTLY, + STRINGID_PKNMABSORBINGPOWER }; const u16 gWrappedStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 09148d6633..f3ed16defa 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7257,9 +7257,7 @@ static void Cmd_various(void) && !NoAliveMonsForEitherParty() && gBattleMons[gBattlerAttacker].statStages[STAT_ATK] != 12) { - if (gBattleMons[gBattlerAttacker].statStages[STAT_ATK] >= 11) - SET_STATCHANGER(STAT_ATK, 1, FALSE); - else if (gBattleMons[gBattlerAttacker].statStages[STAT_ATK] <= 9 && B_FELL_STINGER_STAT_RAISE >= GEN_7) + if (B_FELL_STINGER_STAT_RAISE >= GEN_7) SET_STATCHANGER(STAT_ATK, 3, FALSE); else SET_STATCHANGER(STAT_ATK, 2, FALSE); @@ -8592,6 +8590,10 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr 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; gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN; index = 1; if (statValue == -2) @@ -8620,12 +8622,15 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 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; gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN; index = 1; if (statValue == 2) diff --git a/src/battle_util.c b/src/battle_util.c index 28be831eca..f79c767104 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3192,7 +3192,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA { i = (Random() % statsNum) + STAT_ATK; } while (!(validToRaise & gBitTable[i])); - SET_STATCHANGER(i, (gBattleMons[battler].statStages[i] < 11) ? 2 : 1, FALSE); + SET_STATCHANGER(i, 2, FALSE); validToLower &= ~(gBitTable[i]); // Can't lower the same stat as raising. } if (validToLower != 0) // Find stat to lower diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index ddaaf2c1c9..345d2b0fba 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -8436,7 +8436,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_GEOMANCY] = { - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_GEOMANCY, .power = 0, .type = TYPE_FAIRY, .accuracy = 0, From 0f628c8ff281351e37b1a8ccc2ec6d869b7f931b Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 20 Apr 2020 19:41:07 +0200 Subject: [PATCH 551/667] Fairy Lock --- asm/macros/battle_script.inc | 5 +++++ data/battle_ai_scripts.s | 6 ++++++ data/battle_scripts_1.s | 13 +++++++++++++ include/battle.h | 1 + include/constants/battle.h | 1 + include/constants/battle_move_effects.h | 1 + include/constants/battle_script_commands.h | 1 + include/constants/battle_string_ids.h | 3 ++- src/battle_main.c | 7 +++++-- src/battle_message.c | 2 ++ src/battle_script_commands.c | 13 +++++++++++++ src/battle_util.c | 8 ++++++++ src/data/battle_moves.h | 2 +- 13 files changed, 59 insertions(+), 4 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index c854e8320d..6a4680dd2e 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1714,6 +1714,11 @@ .4byte \ptr .endm + .macro trysetfairylock ptr:req + various BS_ATTACKER, VARIOUS_TRY_FAIRY_LOCK + .4byte \ptr + .endm + @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 17b426b8db..2c4cc6ad4d 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -262,6 +262,12 @@ AI_CheckBadMove_CheckEffect: @ 82DC045 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 + 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: diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 7820cef720..dd8a1b25e0 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -361,6 +361,19 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectBurnUp .4byte BattleScript_EffectShoreUp .4byte BattleScript_EffectGeomancy + .4byte BattleScript_EffectFairyLock + +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 diff --git a/include/battle.h b/include/battle.h index 8f75c124d4..d0d8f4d8fb 100644 --- a/include/battle.h +++ b/include/battle.h @@ -221,6 +221,7 @@ struct FieldTimer u8 psychicTerrainTimer; u8 echoVoiceCounter; u8 gravityTimer; + u8 fairyLockTimer; }; struct WishFutureKnock diff --git a/include/constants/battle.h b/include/constants/battle.h index 978105ad98..97e64a269e 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -224,6 +224,7 @@ #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) diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 425d83ac19..a82ee8b921 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -349,5 +349,6 @@ #define EFFECT_BURN_UP 343 #define EFFECT_SHORE_UP 344 #define EFFECT_GEOMANCY 345 +#define EFFECT_FAIRY_LOCK 346 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 17fd45809d..b17523c674 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -154,6 +154,7 @@ #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 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index ca2d22a9f5..ecda6c4df5 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -546,7 +546,8 @@ #define STRINGID_SCRIPTINGABILITYSTATRAISE 542 #define STRINGID_RECEIVERABILITYTAKEOVER 543 #define STRINGID_PKNMABSORBINGPOWER 544 +#define STRINGID_NOONEWILLBEABLETORUNAWAY 545 -#define BATTLESTRINGS_COUNT 545 +#define BATTLESTRINGS_COUNT 546 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_main.c b/src/battle_main.c index 723e33a7a6..f200a3b548 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3689,7 +3689,8 @@ u8 IsRunningFromBattleImpossible(void) } if ((gBattleMons[gActiveBattler].status2 & (STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED)) - || (gStatuses3[gActiveBattler] & STATUS3_ROOTED)) + || (gStatuses3[gActiveBattler] & STATUS3_ROOTED) + || gFieldStatuses & STATUS_FIELD_FAIRY_LOCK) { gBattleCommunication[MULTISTRING_CHOOSER] = 0; return 1; @@ -3867,6 +3868,7 @@ static void HandleTurnActionSelectionState(void) *(gBattleStruct->field_58 + gActiveBattler) = gBattlerPartyIndexes[gActiveBattler]; if (gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION) || gBattleTypeFlags & BATTLE_TYPE_ARENA + || gFieldStatuses & STATUS_FIELD_FAIRY_LOCK || gStatuses3[gActiveBattler] & STATUS3_ROOTED) { BtlController_EmitChoosePokemon(0, PARTY_ACTION_CANT_SWITCH, PARTY_SIZE, ABILITY_NONE, gBattleStruct->field_60[gActiveBattler]); @@ -5549,7 +5551,8 @@ static void HandleAction_Run(void) } else { - if (gBattleMons[gBattlerAttacker].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) + if (gBattleMons[gBattlerAttacker].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION) + || gFieldStatuses & STATUS_FIELD_FAIRY_LOCK) { gBattleCommunication[MULTISTRING_CHOOSER] = 4; gBattlescriptCurrInstr = BattleScript_PrintFailedToRunString; diff --git a/src/battle_message.c b/src/battle_message.c index 0e1822035f..2b7ded50cc 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -667,9 +667,11 @@ static const u8 sText_AttackerLostFireType[] = _("{B_ATK_NAME_WITH_PREFIX} burne 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!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_NOONEWILLBEABLETORUNAWAY - 12] = sText_NoOneWillBeAbleToRun, [STRINGID_PKNMABSORBINGPOWER - 12] = sText_PkmnAbsorbingPower, [STRINGID_RECEIVERABILITYTAKEOVER - 12] = sText_ReceiverAbilityTakeOver, [STRINGID_SCRIPTINGABILITYSTATRAISE - 12] = sText_ScriptingAbilityRaisedStat, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f3ed16defa..d6148c14b4 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5111,6 +5111,7 @@ static void Cmd_jumpifcantswitch(void) if (!(gBattlescriptCurrInstr[1] & SWITCH_IGNORE_ESCAPE_PREVENTION) && ((gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) + || (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK) || (gStatuses3[gActiveBattler] & STATUS3_ROOTED))) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); @@ -6826,6 +6827,18 @@ static void Cmd_various(void) else gBattlescriptCurrInstr += 7; return; + 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); diff --git a/src/battle_util.c b/src/battle_util.c index f79c767104..4c21e097e2 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -934,6 +934,7 @@ enum ENDTURN_GRASSY_TERRAIN, ENDTURN_PSYCHIC_TERRAIN, ENDTURN_ION_DELUGE, + ENDTURN_FAIRY_LOCK, ENDTURN_FIELD_COUNT, }; @@ -1350,6 +1351,13 @@ u8 DoFieldEndTurnEffects(void) 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; diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 345d2b0fba..2bfe9f3945 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -8240,7 +8240,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_FAIRY_LOCK] = { - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_FAIRY_LOCK, .power = 0, .type = TYPE_FAIRY, .accuracy = 0, From 328e951afa573595ae2c6a2784e408f10d74feb2 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 20 Apr 2020 20:05:04 +0200 Subject: [PATCH 552/667] Ally Switch, tbd --- asm/macros/battle_script.inc | 5 +++++ data/battle_ai_scripts.s | 2 ++ data/battle_scripts_1.s | 13 +++++++++++++ include/constants/battle_move_effects.h | 1 + include/constants/battle_script_commands.h | 1 + src/battle_script_commands.c | 6 ++++++ src/data/battle_moves.h | 2 +- 7 files changed, 29 insertions(+), 1 deletion(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 6a4680dd2e..979d12fb77 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1719,6 +1719,11 @@ .4byte \ptr .endm + .macro jumpifnoally battler:req, ptr:req + various \battler, VARIOUS_JUMP_IF_NO_ALLY + .4byte \ptr + .endm + @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 2c4cc6ad4d..73404e5899 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -263,6 +263,7 @@ AI_CheckBadMove_CheckEffect: @ 82DC045 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 end AI_CBM_FairyLock: @@ -847,6 +848,7 @@ AI_CBM_WillOWisp: @ 82DC6B4 AI_CBM_HelpingHand: @ 82DC6E3 if_not_double_battle Score_Minus10 + if_battler_absent AI_USER_PARTNER, Score_Minus10 end AI_CBM_TrickAndKnockOff: @ 82DC6EB diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index dd8a1b25e0..7ca850a01d 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -362,6 +362,19 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectShoreUp .4byte BattleScript_EffectGeomancy .4byte BattleScript_EffectFairyLock + .4byte BattleScript_EffectAllySwitch + +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 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index a82ee8b921..7cdc993d25 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -350,5 +350,6 @@ #define EFFECT_SHORE_UP 344 #define EFFECT_GEOMANCY 345 #define EFFECT_FAIRY_LOCK 346 +#define EFFECT_ALLY_SWITCH 347 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index b17523c674..6686446fde 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -155,6 +155,7 @@ #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 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d6148c14b4..2bafa78292 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6827,6 +6827,12 @@ static void Cmd_various(void) else gBattlescriptCurrInstr += 7; return; + case VARIOUS_JUMP_IF_NO_ALLY: + if (!IsBattlerAlive(BATTLE_PARTNER(gActiveBattler))) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else + gBattlescriptCurrInstr += 7; + return; case VARIOUS_TRY_FAIRY_LOCK: if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK) { diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 2bfe9f3945..84de4275d6 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -7041,7 +7041,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_ALLY_SWITCH] = { - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_ALLY_SWITCH, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, From c5a6acc7dba396f0107e2b3e97e827e98370b524 Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Tue, 21 Apr 2020 09:59:19 -0400 Subject: [PATCH 553/667] Corrosion (#306) * Status move poisoning for Steel and Poison types. * Can poison itself with Toxic Orb. * Secondary effect poisoning now working. * Created a function that checks if abilities can bypass type immunities. * Created macro to handle typeimmunity * Applied review changes. * Applied review requests. * Left more readable version of HOLD_EFFECT_TOXIC_ORB. --- asm/macros/battle_script.inc | 6 ++++++ data/battle_scripts_1.s | 6 ++---- include/battle_script_commands.h | 1 + include/battle_scripts.h | 1 + include/constants/battle_script_commands.h | 1 + src/battle_script_commands.c | 23 ++++++++++++++++------ src/battle_util.c | 2 +- 7 files changed, 29 insertions(+), 11 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 979d12fb77..ba7b4e090b 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1713,6 +1713,12 @@ various \battler, VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED .4byte \ptr .endm + + .macro trypoisontype attacker:req, target:req, ptr:req + various \attacker, VARIOUS_HANDLE_TYPE_IMMUNITY + .byte \target + .4byte \ptr + .endm .macro trysetfairylock ptr:req various BS_ATTACKER, VARIOUS_TRY_FAIRY_LOCK diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 7ca850a01d..c80e98d994 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2650,8 +2650,7 @@ BattleScript_EffectToxic:: 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 attackanimation @@ -2971,8 +2970,7 @@ BattleScript_EffectPoison:: 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 diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index f0fc7b8c19..2376c5a865 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -17,6 +17,7 @@ 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 CanUseLastResort(u8 battlerId); u32 IsFlowerVeilProtected(u32 battler); u32 IsLeafGuardProtected(u32 battler); diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 9dd97ac464..8e1f8478d7 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -1,6 +1,7 @@ #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[]; diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 6686446fde..608044b612 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -156,6 +156,7 @@ #define VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED 93 #define VARIOUS_TRY_FAIRY_LOCK 94 #define VARIOUS_JUMP_IF_NO_ALLY 95 +#define VARIOUS_HANDLE_TYPE_IMMUNITY 96 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 2bafa78292..986ea1b965 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2254,7 +2254,7 @@ void SetMoveEffect(bool32 primary, u32 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)) { @@ -2264,9 +2264,7 @@ void SetMoveEffect(bool32 primary, u32 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; @@ -2401,7 +2399,7 @@ void SetMoveEffect(bool32 primary, u32 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)) { @@ -2413,7 +2411,7 @@ void SetMoveEffect(bool32 primary, u32 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 (GetBattlerAbility(gEffectBattler) == ABILITY_IMMUNITY || GetBattlerAbility(gEffectBattler) == ABILITY_COMATOSE @@ -6672,6 +6670,13 @@ static void HandleTerrainMove(u32 moveEffect) } } +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 CanUseLastResort(u8 battlerId) { u32 i; @@ -6885,6 +6890,12 @@ static void Cmd_various(void) gBattleStruct->friskedBattler = 0; gBattleStruct->friskedAbility = FALSE; break; + case VARIOUS_HANDLE_TYPE_IMMUNITY: + if (!CanPoisonType(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); diff --git a/src/battle_util.c b/src/battle_util.c index 4c21e097e2..866114a994 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4865,7 +4865,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) { case HOLD_EFFECT_TOXIC_ORB: if (!gBattleMons[battlerId].status1 - && !IS_BATTLER_OF_TYPE(battlerId, TYPE_POISON) && !IS_BATTLER_OF_TYPE(battlerId, TYPE_STEEL) + && CanPoisonType(battlerId, battlerId) && GetBattlerAbility(battlerId) != ABILITY_IMMUNITY) { effect = ITEM_STATUS_CHANGE; From b1afb96a025ce8a68e103770d02f2f4f28821748 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 21 Apr 2020 15:08:49 -0300 Subject: [PATCH 554/667] Added descriptions for the moves that were missing one (#346) --- src/data/text/move_descriptions.h | 128 ++++++++++++++++++++++++------ 1 file changed, 102 insertions(+), 26 deletions(-) diff --git a/src/data/text/move_descriptions.h b/src/data/text/move_descriptions.h index cf968471a8..313eef48c8 100644 --- a/src/data/text/move_descriptions.h +++ b/src/data/text/move_descriptions.h @@ -1417,10 +1417,18 @@ 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."); @@ -1521,6 +1529,10 @@ 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."); @@ -1585,6 +1597,10 @@ 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."); @@ -1645,10 +1661,18 @@ 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."); @@ -1673,6 +1697,10 @@ 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."); @@ -1693,10 +1721,22 @@ 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."); @@ -1737,6 +1777,14 @@ 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."); @@ -1745,6 +1793,10 @@ 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."); @@ -1805,6 +1857,10 @@ 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."); @@ -2009,6 +2065,10 @@ 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."); @@ -2065,6 +2125,10 @@ 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."); @@ -2141,6 +2205,10 @@ 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."); @@ -2313,6 +2381,10 @@ 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."); @@ -2329,6 +2401,10 @@ 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."); @@ -2898,9 +2974,9 @@ 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] = sNotDoneYetDescription, + [MOVE_ROOST - 1] = sROOSTDescription, [MOVE_GRAVITY - 1] = sGRAVITYDescription, - [MOVE_MIRACLE_EYE - 1] = sNotDoneYetDescription, + [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, @@ -2926,7 +3002,7 @@ const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] = [MOVE_GASTRO_ACID - 1] = sGASTRO_ACIDDescription, [MOVE_LUCKY_CHANT - 1] = sLUCKY_CHANTDescription, [MOVE_ME_FIRST - 1] = sME_FIRSTDescription, - [MOVE_COPYCAT - 1] = sNotDoneYetDescription, + [MOVE_COPYCAT - 1] = sCOPYCATDescription, [MOVE_POWER_SWAP - 1] = sPOWER_SWAPDescription, [MOVE_GUARD_SWAP - 1] = sGUARD_SWAPDescription, [MOVE_PUNISHMENT - 1] = sPUNISHMENTDescription, @@ -2943,7 +3019,7 @@ const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] = [MOVE_ROCK_POLISH - 1] = sROCK_POLISHDescription, [MOVE_POISON_JAB - 1] = sPOISON_JABDescription, [MOVE_DARK_PULSE - 1] = sDARK_PULSEDescription, - [MOVE_NIGHT_SLASH - 1] = sNotDoneYetDescription, + [MOVE_NIGHT_SLASH - 1] = sNIGHT_SLASHDescription, [MOVE_AQUA_TAIL - 1] = sAQUA_TAILDescription, [MOVE_SEED_BOMB - 1] = sSEED_BOMBDescription, [MOVE_AIR_SLASH - 1] = sAIR_SLASHDescription, @@ -2952,38 +3028,38 @@ const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] = [MOVE_DRAGON_PULSE - 1] = sDRAGON_PULSEDescription, [MOVE_DRAGON_RUSH - 1] = sDRAGON_RUSHDescription, [MOVE_POWER_GEM - 1] = sPOWER_GEMDescription, - [MOVE_DRAIN_PUNCH - 1] = sNotDoneYetDescription, + [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] = sNotDoneYetDescription, + [MOVE_GIGA_IMPACT - 1] = sHyperBeamDescription, [MOVE_NASTY_PLOT - 1] = sNASTY_PLOTDescription, - [MOVE_BULLET_PUNCH - 1] = sNotDoneYetDescription, - [MOVE_AVALANCHE - 1] = sNotDoneYetDescription, + [MOVE_BULLET_PUNCH - 1] = sBULLET_PUNCHDescription, + [MOVE_AVALANCHE - 1] = sAVALANCHEDescription, [MOVE_ICE_SHARD - 1] = sICE_SHARDDescription, - [MOVE_SHADOW_CLAW - 1] = sNotDoneYetDescription, + [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] = sNotDoneYetDescription, + [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] = sNotDoneYetDescription, - [MOVE_DISCHARGE - 1] = sNotDoneYetDescription, + [MOVE_DRACO_METEOR - 1] = sDRACO_METEORDescription, + [MOVE_DISCHARGE - 1] = sDISCHARGEDescription, [MOVE_LAVA_PLUME - 1] = sLAVA_PLUMEDescription, - [MOVE_LEAF_STORM - 1] = sNotDoneYetDescription, + [MOVE_LEAF_STORM - 1] = sLEAF_STORMDescription, [MOVE_POWER_WHIP - 1] = sPOWER_WHIPDescription, - [MOVE_ROCK_WRECKER - 1] = sNotDoneYetDescription, - [MOVE_CROSS_POISON - 1] = sNotDoneYetDescription, + [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, @@ -2995,11 +3071,11 @@ const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] = [MOVE_JUDGMENT - 1] = sJUDGMENTDescription, [MOVE_BUG_BITE - 1] = sPLUCKDescription, [MOVE_CHARGE_BEAM - 1] = sCHARGE_BEAMDescription, - [MOVE_WOOD_HAMMER - 1] = sNotDoneYetDescription, - [MOVE_AQUA_JET - 1] = sNotDoneYetDescription, + [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] = sNotDoneYetDescription, + [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, @@ -3071,11 +3147,11 @@ const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] = [MOVE_DRAGON_TAIL - 1] = sCIRCLE_THROWDescription, [MOVE_WORK_UP - 1] = sWORK_UPDescription, [MOVE_ELECTROWEB - 1] = sELECTROWEBDescription, - [MOVE_WILD_CHARGE - 1] = sNotDoneYetDescription, + [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] = sNotDoneYetDescription, + [MOVE_HORN_LEECH - 1] = sMegaDrainDescription, [MOVE_SACRED_SWORD - 1] = sCHIP_AWAYDescription, [MOVE_RAZOR_SHELL - 1] = sRAZOR_SHELLDescription, [MOVE_HEAT_CRASH - 1] = sHEAVY_SLAMDescription, @@ -3084,15 +3160,15 @@ const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] = [MOVE_COTTON_GUARD - 1] = sCOTTON_GUARDDescription, [MOVE_NIGHT_DAZE - 1] = sNIGHT_DAZEDescription, [MOVE_PSYSTRIKE - 1] = sPSYSHOCKDescription, - [MOVE_TAIL_SLAP - 1] = sNotDoneYetDescription, + [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] = sNotDoneYetDescription, + [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] = sNotDoneYetDescription, + [MOVE_GLACIATE - 1] = sGLACIATEDescription, [MOVE_BOLT_STRIKE - 1] = sBOLT_STRIKEDescription, [MOVE_BLUE_FLARE - 1] = sBLUE_FLAREDescription, [MOVE_FIERY_DANCE - 1] = sFIERY_DANCEDescription, @@ -3113,7 +3189,7 @@ const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] = [MOVE_TRICK_OR_TREAT - 1] = sTRICK_OR_TREATDescription, [MOVE_NOBLE_ROAR - 1] = sNOBLE_ROARDescription, [MOVE_ION_DELUGE - 1] = sION_DELUGEDescription, - [MOVE_PARABOLIC_CHARGE - 1] = sNotDoneYetDescription, + [MOVE_PARABOLIC_CHARGE - 1] = sPARABOLIC_CHARGEDescription, [MOVE_FORESTS_CURSE - 1] = sFORESTS_CURSEDescription, [MOVE_PETAL_BLIZZARD - 1] = sPETAL_BLIZZARDDescription, [MOVE_FREEZE_DRY - 1] = sFREEZE_DRYDescription, @@ -3153,13 +3229,13 @@ const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] = [MOVE_HOLD_HANDS - 1] = sHOLD_HANDSDescription, [MOVE_BABY_DOLL_EYES - 1] = sBABYDOLL_EYESDescription, [MOVE_NUZZLE - 1] = sNUZZLEDescription, - [MOVE_HOLD_BACK - 1] = sNotDoneYetDescription, + [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] = sNotDoneYetDescription, + [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, From f8f61c10ac2750040c53f220715967196cb6bd89 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 21 Apr 2020 15:09:28 -0300 Subject: [PATCH 555/667] Added data for Plasma Fists, Photon Geyser and Double Iron Bash (#348) --- include/constants/moves.h | 5 +++- src/data/battle_moves.h | 42 +++++++++++++++++++++++++++++++ src/data/text/move_descriptions.h | 15 +++++++++++ src/data/text/move_names.h | 3 +++ 4 files changed, 64 insertions(+), 1 deletion(-) diff --git a/include/constants/moves.h b/include/constants/moves.h index 5ff3f9ce60..f425bbeddc 100644 --- a/include/constants/moves.h +++ b/include/constants/moves.h @@ -691,8 +691,11 @@ #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 674 +#define MOVES_COUNT_GEN7 677 #define MOVES_COUNT MOVES_COUNT_GEN7 diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 84de4275d6..fb390d69af 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -9457,4 +9457,46 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .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, + }, }; diff --git a/src/data/text/move_descriptions.h b/src/data/text/move_descriptions.h index 313eef48c8..281a21dd1a 100644 --- a/src/data/text/move_descriptions.h +++ b/src/data/text/move_descriptions.h @@ -2613,6 +2613,18 @@ 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."); + static const u8 sNotDoneYetDescription[] = _( "Not done yet."); @@ -3293,4 +3305,7 @@ const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] = [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, }; diff --git a/src/data/text/move_names.h b/src/data/text/move_names.h index 49fb4c6610..71de670fcd 100644 --- a/src/data/text/move_names.h +++ b/src/data/text/move_names.h @@ -674,4 +674,7 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [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"), }; From 633ebe6148821cd5016758e970272bf63451b4c5 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 21 Apr 2020 20:43:47 +0200 Subject: [PATCH 556/667] Schooling --- include/constants/battle_config.h | 2 ++ src/battle_util.c | 20 ++++++++++++++------ src/data/pokemon/base_stats.h | 2 +- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index a1fbe57c49..4d598e73d9 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -17,6 +17,8 @@ #define SPECIES_DARMANITAN_ZEN 10002 #define SPECIES_MINIOR_CORE 0 #define SPECIES_MINIOR 10003 +#define SPECIES_WISHIWASHI SPECIES_SKARMORY +#define SPECIES_WISHIWASHI_SCHOOL SPECIES_HO_OH // Items with peculiar battle effects. Remove them if they're properly placed in constant/items.h #define ITEM_GRISEOUS_ORB 0 diff --git a/src/battle_util.c b/src/battle_util.c index 866114a994..e857fb8bf9 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2755,11 +2755,12 @@ static bool32 TryChangeBattleTerrain(u32 battler, u32 statusFlag, u8 *timer) static bool32 ShouldChangeFormHpBased(u32 battler) { - // Ability, form >, form <= - static const u16 forms[][3] = + // Ability, form >, form <=, hp divided + static const u16 forms[][4] = { - {ABILITY_ZEN_MODE, SPECIES_DARMANITAN, SPECIES_DARMANITAN_ZEN}, - {ABILITY_SHIELDS_DOWN, SPECIES_MINIOR, SPECIES_MINIOR_CORE}, + {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; @@ -2768,13 +2769,13 @@ static bool32 ShouldChangeFormHpBased(u32 battler) if (gBattleMons[battler].ability == forms[i][0]) { if (gBattleMons[battler].species == forms[i][2] - && gBattleMons[battler].hp > gBattleMons[battler].maxHP / 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 / 2) + && gBattleMons[battler].hp <= gBattleMons[battler].maxHP / forms[i][3]) { gBattleMons[battler].species = forms[i][2]; return TRUE; @@ -3093,6 +3094,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } } break; + case ABILITY_SCHOOLING: + if (gBattleMons[battler].level < 20) + break; case ABILITY_SHIELDS_DOWN: if (ShouldChangeFormHpBased(battler)) { @@ -3249,6 +3253,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA effect++; } break; + case ABILITY_SCHOOLING: + if (gBattleMons[battler].level < 20) + break; case ABILITY_ZEN_MODE: case ABILITY_SHIELDS_DOWN: if ((effect = ShouldChangeFormHpBased(battler))) @@ -6582,6 +6589,7 @@ void UndoFormChange(u32 monId, u32 side) {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); diff --git a/src/data/pokemon/base_stats.h b/src/data/pokemon/base_stats.h index c191da8162..3e38c2e362 100644 --- a/src/data/pokemon/base_stats.h +++ b/src/data/pokemon/base_stats.h @@ -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_SCHOOLING, ABILITY_SCHOOLING}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, From e4086e6fb57e6b61ca1883db4e55b4b2d0541551 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 21 Apr 2020 21:04:45 +0200 Subject: [PATCH 557/667] Schooling fix --- include/constants/battle_config.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 4d598e73d9..911fe53e6e 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -17,8 +17,8 @@ #define SPECIES_DARMANITAN_ZEN 10002 #define SPECIES_MINIOR_CORE 0 #define SPECIES_MINIOR 10003 -#define SPECIES_WISHIWASHI SPECIES_SKARMORY -#define SPECIES_WISHIWASHI_SCHOOL SPECIES_HO_OH +#define SPECIES_WISHIWASHI 0 +#define SPECIES_WISHIWASHI_SCHOOL 10004 // Items with peculiar battle effects. Remove them if they're properly placed in constant/items.h #define ITEM_GRISEOUS_ORB 0 From 2de60b556277b1ce27e71edee0b8a50e4805c711 Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Wed, 22 Apr 2020 02:32:27 -0400 Subject: [PATCH 558/667] Fix for Avalanche's description. (#350) --- src/data/text/move_descriptions.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/text/move_descriptions.h b/src/data/text/move_descriptions.h index 281a21dd1a..3a71d1576d 100644 --- a/src/data/text/move_descriptions.h +++ b/src/data/text/move_descriptions.h @@ -3050,7 +3050,7 @@ const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] = [MOVE_GIGA_IMPACT - 1] = sHyperBeamDescription, [MOVE_NASTY_PLOT - 1] = sNASTY_PLOTDescription, [MOVE_BULLET_PUNCH - 1] = sBULLET_PUNCHDescription, - [MOVE_AVALANCHE - 1] = sAVALANCHEDescription, + [MOVE_AVALANCHE - 1] = sRevengeDescription, [MOVE_ICE_SHARD - 1] = sICE_SHARDDescription, [MOVE_SHADOW_CLAW - 1] = sSHADOW_CLAWDescription, [MOVE_THUNDER_FANG - 1] = sTHUNDER_FANGDescription, From c8ba013539c59b8e9c36933f18de6f15f7643708 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 22 Apr 2020 10:44:19 +0200 Subject: [PATCH 559/667] Power Herb --- asm/macros/battle_script.inc | 6 +++++ data/battle_scripts_1.s | 28 ++++++++++++++++------ include/constants/battle_script_commands.h | 1 + src/battle_script_commands.c | 6 +++++ src/data/pokemon/base_stats.h | 2 +- 5 files changed, 35 insertions(+), 8 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index ba7b4e090b..a4bd975118 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1730,6 +1730,12 @@ .4byte \ptr .endm + .macro jumpifnoholdeffect battler:req, holdEffet:req, ptr:req + various \battler, VARIOUS_JUMP_IF_NO_HOLD_EFFECT + .byte \holdEffet + .4byte \ptr + .endm + @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index c80e98d994..8c3f41783b 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" @@ -3048,6 +3049,13 @@ BattleScript_EffectSpecialDefenseDownHit2:: 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_EffectTwoTurnsAttack:: jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_TwoTurnMovesSecondTurn @@ -3059,7 +3067,9 @@ BattleScript_EffectTwoTurnsAttack:: setbyte sTWOTURN_STRINGID, 0x0 BattleScript_EffectTwoTurnsAttackContinue: call BattleScriptFirstChargingTurn - goto BattleScript_MoveEnd + jumpifnoholdeffect BS_ATTACKER, HOLD_EFFECT_POWER_HERB, BattleScript_MoveEnd + call BattleScript_PowerHerbActivation + goto BattleScript_TwoTurnMovesSecondTurn BattleScript_EffectTwoTurnsAttackSkyAttack: setbyte sTWOTURN_STRINGID, 0x3 goto BattleScript_EffectTwoTurnsAttackContinue @@ -3078,8 +3088,8 @@ BattleScript_EffectGeomancy: jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING, BattleScript_GeomancySecondTurn setbyte sTWOTURN_STRINGID, 0x9 call BattleScriptFirstChargingTurn - goto BattleScript_MoveEnd - + jumpifnoholdeffect BS_ATTACKER, HOLD_EFFECT_POWER_HERB, BattleScript_MoveEnd + call BattleScript_PowerHerbActivation BattleScript_GeomancySecondTurn: attackcanceler setmoveeffect MOVE_EFFECT_CHARGING @@ -3888,7 +3898,9 @@ 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: BattleScript_FlinchEffect: @@ -3924,7 +3936,9 @@ BattleScript_SolarbeamDecideTurn:: jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING, BattleScript_TwoTurnMovesSecondTurn setbyte sTWOTURN_STRINGID, 0x1 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 @@ -4012,8 +4026,8 @@ BattleScript_FirstTurnFly:: 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 diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 608044b612..68c1ddc935 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -157,6 +157,7 @@ #define VARIOUS_TRY_FAIRY_LOCK 94 #define VARIOUS_JUMP_IF_NO_ALLY 95 #define VARIOUS_HANDLE_TYPE_IMMUNITY 96 +#define VARIOUS_JUMP_IF_NO_HOLD_EFFECT 97 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 986ea1b965..4e30a3d4d4 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6832,6 +6832,12 @@ static void Cmd_various(void) 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); diff --git a/src/data/pokemon/base_stats.h b/src/data/pokemon/base_stats.h index 3e38c2e362..ebdecff94b 100644 --- a/src/data/pokemon/base_stats.h +++ b/src/data/pokemon/base_stats.h @@ -7296,7 +7296,7 @@ const struct BaseStats gBaseStats[] = .growthRate = GROWTH_SLOW, .eggGroup1 = EGG_GROUP_FLYING, .eggGroup2 = EGG_GROUP_FLYING, - .abilities = {ABILITY_SCHOOLING, ABILITY_SCHOOLING}, + .abilities = {ABILITY_STURDY, ABILITY_KEEN_EYE}, .safariZoneFleeRate = 0, .bodyColor = BODY_COLOR_GRAY, .noFlip = FALSE, From e2524bed491998c4e61f3b5d2975938834a49793 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 22 Apr 2020 12:49:25 +0200 Subject: [PATCH 560/667] Metronome item --- include/battle.h | 1 + src/battle_main.c | 2 ++ src/battle_script_commands.c | 9 ++++++++- src/battle_util.c | 4 +++- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/include/battle.h b/include/battle.h index d0d8f4d8fb..d59623410d 100644 --- a/include/battle.h +++ b/include/battle.h @@ -547,6 +547,7 @@ struct BattleStruct 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. }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/src/battle_main.c b/src/battle_main.c index f200a3b548..5716950951 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3045,6 +3045,7 @@ void SwitchInClearSetData(void) gLastHitBy[gActiveBattler] = 0xFF; gBattleStruct->lastTakenMove[gActiveBattler] = 0; + gBattleStruct->sameMoveTurns[gActiveBattler] = 0; gBattleStruct->lastTakenMoveFrom[gActiveBattler][0] = 0; gBattleStruct->lastTakenMoveFrom[gActiveBattler][1] = 0; gBattleStruct->lastTakenMoveFrom[gActiveBattler][2] = 0; @@ -3130,6 +3131,7 @@ void FaintClearSetData(void) gLastHitBy[gActiveBattler] = 0xFF; gBattleStruct->choicedMove[gActiveBattler] = 0; + gBattleStruct->sameMoveTurns[gActiveBattler] = 0; gBattleStruct->lastTakenMove[gActiveBattler] = 0; gBattleStruct->lastTakenMoveFrom[gActiveBattler][0] = 0; gBattleStruct->lastTakenMoveFrom[gActiveBattler][1] = 0; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 4e30a3d4d4..a78d4497c6 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1447,6 +1447,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; @@ -4806,7 +4813,7 @@ static void Cmd_moveend(void) } gBattleScripting.moveendState++; break; - case MOVEEND_CLEAR_BITS: // Clear bits active while using a move for all targets and all hits. + 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) diff --git a/src/battle_util.c b/src/battle_util.c index e857fb8bf9..daf0e08f16 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6131,6 +6131,7 @@ static u32 CalcDefenseStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, 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); @@ -6237,7 +6238,8 @@ static u32 CalcFinalDmg(u32 dmg, u16 move, u8 battlerAtk, u8 battlerDef, u8 move switch (GetBattlerHoldEffect(battlerAtk, TRUE)) { case HOLD_EFFECT_METRONOME: - // todo + 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)) From d56aaf7c0b4a099e19d5a90c0ccb533cd2f6effc Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 22 Apr 2020 14:40:44 +0200 Subject: [PATCH 561/667] Destiny Knot --- asm/macros/battle_script.inc | 5 +++++ data/battle_scripts_1.s | 26 ++++++++++++++++++++++ include/constants/battle_script_commands.h | 1 + include/constants/battle_string_ids.h | 3 ++- src/battle_message.c | 2 ++ src/battle_script_commands.c | 5 +++++ src/battle_util.c | 1 + 7 files changed, 42 insertions(+), 1 deletion(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index a4bd975118..a74422ba1c 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1736,6 +1736,11 @@ .4byte \ptr .endm + .macro infatuatewithbattler battler1:req, battler2:req + various \battler1, VARIOUS_INFATUATE_WITH_BATTLER + .byte \battler2 + .endm + @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 8c3f41783b..2581937a0d 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3724,6 +3724,30 @@ BattleScript_FuryCutterHit: jumpifmovehadnoeffect BattleScript_FuryCutterHit 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 @@ -3736,6 +3760,7 @@ BattleScript_EffectAttract:: waitanimation printstring STRINGID_PKMNFELLINLOVE waitmessage 0x40 + call BattleScript_TryDestinyKnotAttacker goto BattleScript_MoveEnd BattleScript_EffectPresent:: @@ -7077,6 +7102,7 @@ BattleScript_CuteCharmActivates:: status2animation BS_ATTACKER, STATUS2_INFATUATION printstring STRINGID_PKMNSXINFATUATEDY waitmessage 0x40 + call BattleScript_TryDestinyKnotTarget return BattleScript_AbilityStatusEffect:: diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 68c1ddc935..a3599adb10 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -158,6 +158,7 @@ #define VARIOUS_JUMP_IF_NO_ALLY 95 #define VARIOUS_HANDLE_TYPE_IMMUNITY 96 #define VARIOUS_JUMP_IF_NO_HOLD_EFFECT 97 +#define VARIOUS_INFATUATE_WITH_BATTLER 98 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index ecda6c4df5..e68e31d6f5 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -547,7 +547,8 @@ #define STRINGID_RECEIVERABILITYTAKEOVER 543 #define STRINGID_PKNMABSORBINGPOWER 544 #define STRINGID_NOONEWILLBEABLETORUNAWAY 545 +#define STRINGID_DESTINYKNOTACTIVATES 546 -#define BATTLESTRINGS_COUNT 546 +#define BATTLESTRINGS_COUNT 547 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_message.c b/src/battle_message.c index 2b7ded50cc..ab15db98c5 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -668,9 +668,11 @@ static const u8 sText_HealerCure[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_LAST_ABILI 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}!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { + [STRINGID_DESTINYKNOTACTIVATES - 12] = sText_DestinyKnotActivates, [STRINGID_NOONEWILLBEABLETORUNAWAY - 12] = sText_NoOneWillBeAbleToRun, [STRINGID_PKNMABSORBINGPOWER - 12] = sText_PkmnAbsorbingPower, [STRINGID_RECEIVERABILITYTAKEOVER - 12] = sText_ReceiverAbilityTakeOver, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a78d4497c6..0b2e58f555 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6851,6 +6851,11 @@ static void Cmd_various(void) 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_TRY_FAIRY_LOCK: if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK) { diff --git a/src/battle_util.c b/src/battle_util.c index daf0e08f16..174b4eda6a 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -326,6 +326,7 @@ u8 GetBattlerForBattleScript(u8 caseId) break; case BS_ABILITY_BATTLER: ret = gBattlerAbility; + break; } return ret; } From 40ce053ce18f6513ad03297e60b4ed0b5d843634 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 22 Apr 2020 15:12:25 +0200 Subject: [PATCH 562/667] Adrenaline Orb --- asm/macros/battle_script.inc | 4 ++++ data/battle_scripts_1.s | 20 +++++++++++++++++++- include/constants/battle_script_commands.h | 1 + src/battle_script_commands.c | 3 +++ 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index a74422ba1c..34b3567019 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1741,6 +1741,10 @@ .byte \battler2 .endm + .macro setlastuseditem battler:req + various \battler, VARIOUS_SET_LAST_USED_ITEM + .endm + @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 2581937a0d..46716c4aff 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6626,6 +6626,22 @@ BattleScript_82DB4AF:: 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 @@ -6635,9 +6651,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 @@ -6649,6 +6665,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 @@ -6658,6 +6675,7 @@ BattleScript_IntimidatePrevented: pause 0x20 printstring STRINGID_PREVENTEDFROMWORKING waitmessage 0x40 + call BattleScript_TryAdrenalineOrb goto BattleScript_IntimidateActivatesLoopIncrement BattleScript_DroughtActivates:: diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index a3599adb10..325e533577 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -159,6 +159,7 @@ #define VARIOUS_HANDLE_TYPE_IMMUNITY 96 #define VARIOUS_JUMP_IF_NO_HOLD_EFFECT 97 #define VARIOUS_INFATUATE_WITH_BATTLER 98 +#define VARIOUS_SET_LAST_USED_ITEM 99 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 0b2e58f555..04feb20dac 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6856,6 +6856,9 @@ static void Cmd_various(void) 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) { From d529ac3b60015b888540b90ed736127badf1fb15 Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Thu, 23 Apr 2020 03:01:28 -0400 Subject: [PATCH 563/667] More Battle config (#352) * Binding move turns. * Binding damage. * Incineratable Gems. * Flash Fire while frozen. * Sleep turns. * Synchronized natures % * Confusion self damage chance. * Fixed confused self-damage check --- include/constants/battle_config.h | 9 ++++++++- src/battle_script_commands.c | 8 ++++---- src/battle_util.c | 8 ++++---- src/wild_encounter.c | 3 ++- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 911fe53e6e..8e68db99d2 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -62,6 +62,8 @@ #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%. // 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. @@ -69,6 +71,8 @@ #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_INCINERATE_GEMS GEN_6 // In Gen6+, Incinerate can destroy Gems. // 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. @@ -77,8 +81,11 @@ #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. // Other -#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_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_SLEEP_TURNS GEN_6 // In Gen5+, sleep lasts for 1-3 turns instead of 2-5 turns. #endif // GUARD_CONSTANTS_BATTLE_CONFIG_H diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 04feb20dac..f33ec552b9 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2442,7 +2442,7 @@ void SetMoveEffect(bool32 primary, u32 certain) BattleScriptPush(gBattlescriptCurrInstr + 1); if (sStatusFlagsForMoveEffects[gBattleScripting.moveEffect] == STATUS1_SLEEP) - gBattleMons[gEffectBattler].status1 |= ((Random() & 3) + 2); + gBattleMons[gEffectBattler].status1 |= (B_SLEEP_TURNS >= GEN_5) ? ((Random() & 2) + 1) : ((Random() & 3) + 2); else gBattleMons[gEffectBattler].status1 |= sStatusFlagsForMoveEffects[gBattleScripting.moveEffect]; @@ -2588,9 +2588,9 @@ void SetMoveEffect(bool32 primary, u32 certain) { gBattleMons[gEffectBattler].status2 |= STATUS2_WRAPPED; if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_GRIP_CLAW) - gDisableStructs[gEffectBattler].wrapTurns = 7; + gDisableStructs[gEffectBattler].wrapTurns = (B_BINDING_TURNS >= GEN_5) ? 7 : 5; else - gDisableStructs[gEffectBattler].wrapTurns = ((Random() % 2) + 4); + gDisableStructs[gEffectBattler].wrapTurns = (B_BINDING_TURNS >= GEN_5) ? ((Random() % 2) + 4) : ((Random() % 4) + 2); gBattleStruct->wrappedMove[gEffectBattler] = gCurrentMove; gBattleStruct->wrappedBy[gEffectBattler] = gBattlerAttacker; @@ -3011,7 +3011,7 @@ void SetMoveEffect(bool32 primary, u32 certain) gBattlescriptCurrInstr++; break; case MOVE_EFFECT_INCINERATE: - if (GetBattlerHoldEffect(gEffectBattler, FALSE) == HOLD_EFFECT_GEMS + 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; diff --git a/src/battle_util.c b/src/battle_util.c index 174b4eda6a..b3b0aee8ec 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1612,9 +1612,9 @@ u8 DoBattlerEndTurnEffects(void) PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleStruct->wrappedMove[gActiveBattler]); gBattlescriptCurrInstr = BattleScript_WrapTurnDmg; if (GetBattlerHoldEffect(gBattleStruct->wrappedBy[gActiveBattler], TRUE) == HOLD_EFFECT_BINDING_BAND) - gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; + gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / (B_BINDING_DAMAGE >= GEN_6) ? 6 : 8; else - gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16; + gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / (B_BINDING_DAMAGE >= GEN_6) ? 8 : 16; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; @@ -2310,7 +2310,7 @@ u8 AtkCanceller_UnableToUseMove(void) gBattleMons[gBattlerAttacker].status2--; if (gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION) { - if (Random() & 1) + if (Random() % ((B_CONFUSION_SELF_DMG_CHANCE >= GEN_7) ? 3 : 2 == 0)) { gBattleCommunication[MULTISTRING_CHOOSER] = 0; BattleScriptPushCursor(); @@ -3319,7 +3319,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA effect = 2, statId = STAT_ATK; break; case ABILITY_FLASH_FIRE: - if (moveType == TYPE_FIRE && !(gBattleMons[battler].status1 & STATUS1_FREEZE)) + if (moveType == TYPE_FIRE && !((gBattleMons[battler].status1 & STATUS1_FREEZE) && B_FLASH_FIRE_FROZEN <= GEN_4)) { if (!(gBattleResources->flags->flags[battler] & RESOURCE_FLAG_FLASH_FIRE)) { diff --git a/src/wild_encounter.c b/src/wild_encounter.c index 9853d542f9..9f2197ceee 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -18,6 +18,7 @@ #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" @@ -336,7 +337,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) % 25; } From 738d92e39d13e1af167be3d242c14d4e8ecb3d4d Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 23 Apr 2020 11:29:19 +0200 Subject: [PATCH 564/667] Infiltrator affects mist safeguard --- asm/macros/battle_script.inc | 6 ++++++ data/battle_scripts_1.s | 22 +++++++++++----------- src/battle_script_commands.c | 4 +++- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 34b3567019..20071fc36b 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1863,4 +1863,10 @@ 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/data/battle_scripts_1.s b/data/battle_scripts_1.s index 46716c4aff..a2a523c830 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -907,7 +907,7 @@ BattleScript_EffectPsychoShift: goto BattleScript_ButItFailed BattleScript_EffectPsychoShiftCanWork: jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed - jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected + jumpifsafeguard BattleScript_SafeguardProtected trypsychoshift BattleScript_MoveEnd attackanimation waitanimation @@ -2132,7 +2132,7 @@ BattleScript_EffectSleep:: 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 @@ -2653,7 +2653,7 @@ BattleScript_EffectToxic:: jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed 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 @@ -2856,7 +2856,7 @@ BattleScript_EffectConfuse: 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 @@ -2974,7 +2974,7 @@ BattleScript_EffectPoison:: 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 @@ -2999,7 +2999,7 @@ BattleScript_EffectParalyze: jumpiftype BS_TARGET, TYPE_ELECTRIC, 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 @@ -3707,7 +3707,7 @@ BattleScript_EffectSwagger:: waitmessage 0x40 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 @@ -4244,7 +4244,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 @@ -4263,7 +4263,7 @@ BattleScript_EffectWillOWisp:: 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 @@ -4536,7 +4536,7 @@ BattleScript_EffectYawn:: jumpifleafguard BattleScript_LeafGuardProtects jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects jumpifsubstituteblocks BattleScript_ButItFailed - jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected + jumpifsafeguard BattleScript_SafeguardProtected accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifcantmakeasleep BattleScript_ButItFailed setyawn BattleScript_ButItFailed @@ -4665,7 +4665,7 @@ BattleScript_TeeterDanceLoop:: 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 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f33ec552b9..1757454665 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8539,7 +8539,8 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr 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) { @@ -8564,6 +8565,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr return STAT_CHANGE_DIDNT_WORK; } else if ((GetBattlerAbility(gActiveBattler) == ABILITY_CLEAR_BODY + || GetBattlerAbility(gActiveBattler) == ABILITY_FULL_METAL_BODY || GetBattlerAbility(gActiveBattler) == ABILITY_WHITE_SMOKE) && !certain && gCurrentMove != MOVE_CURSE) { From ee68f0f826ae686a8ad7e1348df8f45513e6707e Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 25 Apr 2020 11:17:59 +0200 Subject: [PATCH 565/667] Fix switch-in abilities when shift style switch --- data/battle_scripts_1.s | 16 ++++++++++++---- include/battle.h | 2 +- include/constants/battle_script_commands.h | 2 +- src/battle_script_commands.c | 6 +----- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index a2a523c830..06642142e8 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4921,6 +4921,7 @@ BattleScript_GiveExp:: end2 BattleScript_HandleFaintedMon:: + setbyte sSHIFT_SWITCHED, 0x0 atk24 BattleScript_82DA8F6 jumpifbyte CMP_NOT_EQUAL, gBattleOutcome, 0, BattleScript_FaintedMonEnd jumpifbattletype BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE, BattleScript_FaintedMonTryChooseAnother @@ -4931,7 +4932,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 @@ -4966,9 +4967,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 @@ -4979,11 +4979,19 @@ BattleScript_FaintedMonChooseAnother:: 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 diff --git a/include/battle.h b/include/battle.h index d59623410d..6a9ecd89c6 100644 --- a/include/battle.h +++ b/include/battle.h @@ -594,7 +594,7 @@ struct BattleScripting u16 tripleKickPower; u8 moveendState; u8 savedStatChanger; // For further use, if attempting to change stat two times(ex. Moody) - u8 unused_16; + 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; diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 325e533577..71b3b1fca2 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -12,7 +12,7 @@ #define sTRIPLE_KICK_POWER gBattleScripting + 0x12 #define sMOVEEND_STATE gBattleScripting + 0x14 #define sSAVED_STAT_CHANGER gBattleScripting + 0x15 -#define sUNUSED_16 gBattleScripting + 0x16 +#define sSHIFT_SWITCHED gBattleScripting + 0x16 #define sBATTLER gBattleScripting + 0x17 #define sB_ANIM_TURN gBattleScripting + 0x18 #define sB_ANIM_TARGETS_HIT gBattleScripting + 0x19 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1757454665..e4d8ed6bc1 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7006,11 +7006,7 @@ static void Cmd_various(void) statId = (Random() % NUM_BATTLE_STATS) + 1; } while (!(bits & gBitTable[statId])); - if (gBattleMons[gActiveBattler].statStages[statId] >= 11) - SET_STATCHANGER(statId, 1, FALSE); - else - SET_STATCHANGER(statId, 2, FALSE); - + SET_STATCHANGER(statId, 2, FALSE); gBattlescriptCurrInstr += 7; } else From 073218d544e7bdce87d0aaa7f091fb46e01769f5 Mon Sep 17 00:00:00 2001 From: MandL27 <10366615+MandL27@users.noreply.github.com> Date: Sat, 25 Apr 2020 05:22:12 -0400 Subject: [PATCH 566/667] Mind Blown has contest data (#332) * uncomment mind blown * more contest moves --- src/data/contest_moves.h | 53 +++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/src/data/contest_moves.h b/src/data/contest_moves.h index 8b87aba100..89ace25d3b 100644 --- a/src/data/contest_moves.h +++ b/src/data/contest_moves.h @@ -12,7 +12,7 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = }, [MOVE_KARATE_CHOP] = - { + { .effect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, .contestCategory = CONTEST_CATEGORY_TOUGH, .comboStarterId = 0, @@ -5367,30 +5367,37 @@ const struct ContestMove gContestMoves[MOVES_COUNT] = .comboMoves = {0} }, - // uncomment these after adding usum moves - //[MOVE_MIND_BLOWN] = - //{ - // .effect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, - // .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_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_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[] = From a2cc51ac937a9146e7754697ce6b626cd6d15675 Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Sun, 26 Apr 2020 14:59:53 -0400 Subject: [PATCH 567/667] In Gen2 and Gen4 onwards, Razor Wind has a higher Critical Hit chance. (#355) --- src/data/battle_moves.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index fb390d69af..97c00d955a 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -192,7 +192,7 @@ 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, }, From 432ae465700154dee811f9a04a0c8b79a8803c92 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 27 Apr 2020 10:58:35 +0200 Subject: [PATCH 568/667] Fix Acrobatics gem boost --- src/battle_util.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index b3b0aee8ec..c48473a503 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5519,7 +5519,9 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) } break; case EFFECT_ACROBATICS: - if (gBattleMons[battlerAtk].item == ITEM_NONE) + 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: From 40a23ad799281cd6e8d8a67cb5c10ad8b3eca7de Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Tue, 28 Apr 2020 04:59:28 -0400 Subject: [PATCH 569/667] String Shot lowers speed twice, (#360) --- src/data/battle_moves.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 97c00d955a..d2e84606a8 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -1136,7 +1136,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_STRING_SHOT] = { - .effect = EFFECT_SPEED_DOWN, + .effect = EFFECT_SPEED_DOWN_2, .power = 0, .type = TYPE_BUG, .accuracy = 95, From 7b4ccbc6bcdabbbaf5572048ca6d696b55c242c4 Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Tue, 28 Apr 2020 04:59:50 -0400 Subject: [PATCH 570/667] Counter affected by Protect, not by Mirror Move (#359) --- src/data/battle_moves.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index d2e84606a8..51699c4654 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -962,7 +962,7 @@ 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, }, From 36b52eb0634111ca0a3ae65c5524ca4ad8d0e78b Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 28 Apr 2020 11:14:20 +0200 Subject: [PATCH 571/667] Shed Shell --- include/battle_util.h | 1 + src/battle_main.c | 13 ++++--------- src/battle_script_commands.c | 4 +--- src/battle_util.c | 8 ++++++++ 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index c9f05cf8a4..71a485d35f 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -84,6 +84,7 @@ 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); diff --git a/src/battle_main.c b/src/battle_main.c index 5716950951..a8bea64d94 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3690,9 +3690,7 @@ u8 IsRunningFromBattleImpossible(void) return 2; } - if ((gBattleMons[gActiveBattler].status2 & (STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED)) - || (gStatuses3[gActiveBattler] & STATUS3_ROOTED) - || gFieldStatuses & STATUS_FIELD_FAIRY_LOCK) + if (!CanBattlerEscape(gActiveBattler)) { gBattleCommunication[MULTISTRING_CHOOSER] = 0; return 1; @@ -3868,10 +3866,8 @@ 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 - || gFieldStatuses & STATUS_FIELD_FAIRY_LOCK - || 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]); } @@ -5553,8 +5549,7 @@ static void HandleAction_Run(void) } else { - if (gBattleMons[gBattlerAttacker].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION) - || gFieldStatuses & STATUS_FIELD_FAIRY_LOCK) + if (!CanBattlerEscape(gBattlerAttacker)) { gBattleCommunication[MULTISTRING_CHOOSER] = 4; gBattlescriptCurrInstr = BattleScript_PrintFailedToRunString; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e4d8ed6bc1..d9e87774a9 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5115,9 +5115,7 @@ static void Cmd_jumpifcantswitch(void) gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1] & ~(SWITCH_IGNORE_ESCAPE_PREVENTION)); if (!(gBattlescriptCurrInstr[1] & SWITCH_IGNORE_ESCAPE_PREVENTION) - && ((gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) - || (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK) - || (gStatuses3[gActiveBattler] & STATUS3_ROOTED))) + && !CanBattlerEscape(gActiveBattler)) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); } diff --git a/src/battle_util.c b/src/battle_util.c index c48473a503..1d17249bbe 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4077,6 +4077,14 @@ u32 IsAbilityPreventingEscape(u32 battlerId) 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; From 98b2e88e56bf5831e97b340b870291c7d0e35d84 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 28 Apr 2020 15:36:13 +0200 Subject: [PATCH 572/667] Forewarn --- include/battle_ai_script_commands.h | 1 + src/battle_ai_script_commands.c | 30 +++++++------ src/battle_message.c | 3 +- src/battle_util.c | 69 +++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+), 14 deletions(-) diff --git a/include/battle_ai_script_commands.h b/include/battle_ai_script_commands.h index ef927f88bc..04d580a84c 100644 --- a/include/battle_ai_script_commands.h +++ b/include/battle_ai_script_commands.h @@ -17,6 +17,7 @@ u8 BattleAI_ChooseMoveOrAction(void); bool32 IsTruantMonVulnerable(u32 battlerAI, u32 opposingBattler); bool32 IsBattlerAIControlled(u32 battlerId); void ClearBattlerMoveHistory(u8 battlerId); +void RecordMoveBattle(u8 battlerId, u32 move); void RecordAbilityBattle(u8 battlerId, u8 abilityId); void ClearBattlerAbilityHistory(u8 battlerId); void RecordItemEffectBattle(u8 battlerId, u8 itemEffect); diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 200bcb914a..6247df4bcd 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -731,19 +731,7 @@ static void BattleAI_DoAIProcessing(void) static void RecordLastUsedMoveByTarget(void) { - s32 i; - - for (i = 0; i < MAX_MON_MOVES; i++) - { - 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; - } - } + RecordMoveBattle(gBattlerTarget, gLastMoves[gBattlerTarget]); } bool32 IsBattlerAIControlled(u32 battlerId) @@ -770,6 +758,22 @@ void ClearBattlerMoveHistory(u8 battlerId) BATTLE_HISTORY->usedMoves[battlerId].moves[i] = MOVE_NONE; } +void RecordMoveBattle(u8 battlerId, u32 move) +{ + s32 i; + + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (BATTLE_HISTORY->usedMoves[battlerId].moves[i] == move) + break; + if (BATTLE_HISTORY->usedMoves[battlerId].moves[i] == MOVE_NONE) + { + BATTLE_HISTORY->usedMoves[battlerId].moves[i] = move; + break; + } + } +} + void RecordAbilityBattle(u8 battlerId, u8 abilityId) { BATTLE_HISTORY->abilities[battlerId] = abilityId; diff --git a/src/battle_message.c b/src/battle_message.c index ab15db98c5..0e04baad3b 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -589,7 +589,7 @@ static const u8 sText_SlowStartEnd[] = _("{B_ATK_NAME_WITH_PREFIX} finally got\n 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_ATK_NAME_WITH_PREFIX} shuddered\nin anticipation!"); -static const u8 sText_ForewarnActivates[] = _("{B_ATK_ABILITY} alerted the {B_ATK_NAME_WITH_PREFIX} to the\n{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}!"); +static const u8 sText_ForewarnActivates[] = _("{B_ATK_ABILITY} alerted {B_ATK_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}!"); @@ -1238,6 +1238,7 @@ const u16 gSwitchInAbilityStringIds[] = { STRINGID_MOLDBREAKERENTERS, STRINGID_TERAVOLTENTERS, STRINGID_TURBOBLAZEENTERS, STRINGID_SLOWSTARTENTERS, STRINGID_UNNERVEENTERS, STRINGID_ANTICIPATIONACTIVATES, + STRINGID_FOREWARNACTIVATES }; const u16 gMissStringIds[] = diff --git a/src/battle_util.c b/src/battle_util.c index 1d17249bbe..86de71de34 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -16,6 +16,7 @@ #include "battle_ai_script_commands.h" #include "event_data.h" #include "link.h" +#include "malloc.h" #include "berry.h" #include "pokedex.h" #include "mail.h" @@ -2786,6 +2787,64 @@ static bool32 ShouldChangeFormHpBased(u32 battler) 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) + RecordMoveBattle(gBattlerTarget, data[bestId].moveId); + + free(data); +} + u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveArg) { u8 effect = 0; @@ -2960,6 +3019,16 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA 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) { From deae125412aa5e3b87a4acba79b91a841dd1f243 Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Wed, 29 Apr 2020 03:17:50 -0400 Subject: [PATCH 573/667] Updated moves affected by other moves (#361) * Updated moves affected by Snatch * Updated moves that bypass protect * Updated moves affected by Magic Coat --- src/data/battle_moves.h | 46 ++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 51699c4654..29f0a86906 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -262,7 +262,7 @@ 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, }, @@ -654,7 +654,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = -6, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND, + .flags = FLAG_MIRROR_MOVE_AFFECTED | FLAG_SOUND | FLAG_MAGICCOAT_AFFECTED, .split = SPLIT_STATUS, }, @@ -710,7 +710,7 @@ 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, }, @@ -1886,7 +1886,7 @@ 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, }, @@ -2251,7 +2251,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, - .flags = 0, + .flags = FLAG_SNATCH_AFFECTED, .split = SPLIT_STATUS, }, @@ -2377,7 +2377,7 @@ 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, }, @@ -2531,7 +2531,7 @@ 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, }, @@ -2685,7 +2685,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_OPPONENTS_FIELD, .priority = 0, - .flags = 0, + .flags = FLAG_MAGICCOAT_AFFECTED, .split = SPLIT_STATUS, }, @@ -2713,7 +2713,7 @@ 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, }, @@ -2979,7 +2979,7 @@ 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, }, @@ -3189,7 +3189,7 @@ 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, }, @@ -3637,7 +3637,7 @@ 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, }, @@ -3778,7 +3778,7 @@ 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, }, @@ -3834,7 +3834,7 @@ 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, }, @@ -3904,7 +3904,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, - .flags = 0, + .flags = FLAG_SNATCH_AFFECTED, .split = SPLIT_STATUS, }, @@ -4016,7 +4016,7 @@ 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, }, @@ -4436,7 +4436,7 @@ 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, }, @@ -4702,7 +4702,7 @@ 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, }, @@ -6585,7 +6585,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 3, - .flags = FLAG_PROTECTION_MOVE, + .flags = FLAG_PROTECTION_MOVE | FLAG_SNATCH_AFFECTED, .split = SPLIT_STATUS, .argument = TRUE, // Protects the whole side. }, @@ -7034,7 +7034,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 3, - .flags = FLAG_PROTECTION_MOVE, + .flags = FLAG_PROTECTION_MOVE | FLAG_SNATCH_AFFECTED, .split = SPLIT_STATUS, .argument = TRUE, // Protects the whole side. }, @@ -7245,7 +7245,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED, + .flags = FLAG_MIRROR_MOVE_AFFECTED, .split = SPLIT_STATUS, }, @@ -7878,7 +7878,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, - .flags = 0, + .flags = FLAG_SNATCH_AFFECTED, .split = SPLIT_STATUS, .argument = TRUE, // Protects the whole side. }, @@ -8458,7 +8458,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, - .flags = 0, + .flags = FLAG_SNATCH_AFFECTED, .split = SPLIT_STATUS, }, From f71f1c9d621163a4c6a5bf0a1efe8b8a277c5abd Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 29 Apr 2020 11:53:03 +0200 Subject: [PATCH 574/667] Possibly fix gem issue --- src/battle_main.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/battle_main.c b/src/battle_main.c index a8bea64d94..29194b8899 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4619,7 +4619,11 @@ static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void) 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; @@ -4968,20 +4972,24 @@ void SetTypeBeforeUsingMove(u16 move, u8 battlerAtk) 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; + gBattleStruct->dynamicMoveType = TYPE_WATER | 0x80; else if (gBattleWeather & WEATHER_SANDSTORM_ANY) - *(&gBattleStruct->dynamicMoveType) = TYPE_ROCK | 0x80; + gBattleStruct->dynamicMoveType = TYPE_ROCK | 0x80; else if (gBattleWeather & WEATHER_SUN_ANY) - *(&gBattleStruct->dynamicMoveType) = TYPE_FIRE | 0x80; + gBattleStruct->dynamicMoveType = TYPE_FIRE | 0x80; else if (gBattleWeather & WEATHER_HAIL_ANY) - *(&gBattleStruct->dynamicMoveType) = TYPE_ICE | 0x80; + gBattleStruct->dynamicMoveType = TYPE_ICE | 0x80; else - *(&gBattleStruct->dynamicMoveType) = TYPE_NORMAL | 0x80; + gBattleStruct->dynamicMoveType = TYPE_NORMAL | 0x80; } } else if (gBattleMoves[move].effect == EFFECT_HIDDEN_POWER) From a848c96798ad94da3db40018eac78ffd6c7a693e Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 29 Apr 2020 11:58:57 +0200 Subject: [PATCH 575/667] Fix Tailwind string --- src/battle_message.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_message.c b/src/battle_message.c index 0e04baad3b..29eaf12ecb 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -516,7 +516,7 @@ 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 your team!"); +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}!"); From f82bd2f9c4825afc3d4df88beab95afdfb52ff8c Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Sat, 2 May 2020 04:35:50 -0400 Subject: [PATCH 576/667] Fix sleeping turns (#370) * Fix sleeping turns * Readjusted numbers. Thanks Doesnt --- src/battle_script_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d9e87774a9..5faadb24ee 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2442,7 +2442,7 @@ void SetMoveEffect(bool32 primary, u32 certain) BattleScriptPush(gBattlescriptCurrInstr + 1); if (sStatusFlagsForMoveEffects[gBattleScripting.moveEffect] == STATUS1_SLEEP) - gBattleMons[gEffectBattler].status1 |= (B_SLEEP_TURNS >= GEN_5) ? ((Random() & 2) + 1) : ((Random() & 3) + 2); + gBattleMons[gEffectBattler].status1 |= (B_SLEEP_TURNS >= GEN_5) ? ((Random() % 3) + 2) : ((Random() % 4) + 3); else gBattleMons[gEffectBattler].status1 |= sStatusFlagsForMoveEffects[gBattleScripting.moveEffect]; From c18b5966bf35a1667979963b93dd58413ccc3b95 Mon Sep 17 00:00:00 2001 From: Evan Date: Sun, 3 May 2020 22:09:03 -0600 Subject: [PATCH 577/667] undo some revert(?) --- data/battle_anim_scripts.s | 365 +++++++++++++++++- .../battle_anims/backgrounds/dark_void.bin | Bin 0 -> 1236 bytes .../battle_anims/backgrounds/dark_void.pal | 19 + .../battle_anims/backgrounds/dark_void.png | Bin 0 -> 7041 bytes .../backgrounds/spacial_rend_opponent.bin | Bin 0 -> 1000 bytes .../backgrounds/spacial_rend_opponent.pal | 19 + .../backgrounds/spacial_rend_opponent.png | Bin 0 -> 5861 bytes .../backgrounds/spacial_rend_player.bin | Bin 0 -> 996 bytes .../backgrounds/spacial_rend_player.pal | 19 + .../backgrounds/spacial_rend_player.png | Bin 0 -> 6948 bytes .../sprites/flash_cannon_ball.png | Bin 0 -> 257 bytes graphics/battle_anims/sprites/punishment.png | Bin 0 -> 470 bytes graphics/battle_anims/sprites/quick_guard.png | Bin 0 -> 205 bytes graphics/battle_anims/sprites/water_gun.png | Bin 0 -> 214 bytes include/battle_anim.h | 2 + include/constants/battle_anim.h | 7 + include/graphics.h | 17 + src/battle_anim.c | 11 + src/battle_anim_effects_1.c | 69 ++++ src/battle_anim_effects_2.c | 23 +- src/battle_anim_electric.c | 48 +++ src/battle_anim_fire.c | 22 ++ src/battle_anim_ghost.c | 11 + src/battle_anim_ice.c | 11 + src/battle_anim_rock.c | 37 ++ src/graphics.c | 24 ++ 26 files changed, 701 insertions(+), 3 deletions(-) create mode 100644 graphics/battle_anims/backgrounds/dark_void.bin create mode 100644 graphics/battle_anims/backgrounds/dark_void.pal create mode 100644 graphics/battle_anims/backgrounds/dark_void.png create mode 100644 graphics/battle_anims/backgrounds/spacial_rend_opponent.bin create mode 100644 graphics/battle_anims/backgrounds/spacial_rend_opponent.pal create mode 100644 graphics/battle_anims/backgrounds/spacial_rend_opponent.png create mode 100644 graphics/battle_anims/backgrounds/spacial_rend_player.bin create mode 100644 graphics/battle_anims/backgrounds/spacial_rend_player.pal create mode 100644 graphics/battle_anims/backgrounds/spacial_rend_player.png create mode 100644 graphics/battle_anims/sprites/flash_cannon_ball.png create mode 100644 graphics/battle_anims/sprites/punishment.png create mode 100644 graphics/battle_anims/sprites/quick_guard.png create mode 100644 graphics/battle_anims/sprites/water_gun.png diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 6af4c3752b..6d3e9880fe 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -2841,6 +2841,40 @@ Move_MIRROR_SHOT: 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 0xce, SOUND_PAN_ATTACKER + delay 30 + playsewithpan 0xce, SOUND_PAN_ATTACKER + delay 30 + playsewithpan 0xce, SOUND_PAN_ATTACKER + createsprite gFlashCannonGrayChargeTemplate, ANIM_ATTACKER, 2, 0 + delay 25 + playsewithpan 0xce, SOUND_PAN_ATTACKER + delay 20 + playsewithpan 0xce, SOUND_PAN_ATTACKER + delay 15 + playsewithpan 0xce, SOUND_PAN_ATTACKER + delay 10 + delay 6 + loopsewithpan 0xce, SOUND_PAN_ATTACKER, 6, 5 + waitforvisualfinish + playsewithpan 0xA7, SOUND_PAN_ATTACKER + createsprite gFlashCannonBallMovementTemplate, ANIM_TARGET, 2, 0, 0, 0x15 + clearmonbg ANIM_ATTACKER + waitforvisualfinish + playsewithpan 0xB9, 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: @@ -3441,10 +3475,140 @@ Move_GRASS_KNOT: 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 0xb1, 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 0xA1, 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 0xA1, 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 @@ -3764,11 +3928,80 @@ Move_DOUBLE_HIT: 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 0x81, 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 @@ -3811,6 +4044,28 @@ Move_LUNAR_DANCE: 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 0xab, SOUND_PAN_ATTACKER + createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, 0x18, 0xffe8, 1, 1 + delay 3 + playsewithpan 0xab, SOUND_PAN_ATTACKER + createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, 0xfff0, 16, 1, 1 + delay 3 + playsewithpan 0xab, SOUND_PAN_ATTACKER + createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, 0xffe8, -12, 1, 1 + delay 3 + playsewithpan 0xab, SOUND_PAN_ATTACKER + createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, 16, 16, 1, 1 + waitforvisualfinish + blendoff end Move_MAGMA_STORM: @@ -3839,9 +4094,115 @@ Move_MAGMA_STORM: 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 0xBD, 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 0x81, 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 0x81, 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 0x81, 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: diff --git a/graphics/battle_anims/backgrounds/dark_void.bin b/graphics/battle_anims/backgrounds/dark_void.bin new file mode 100644 index 0000000000000000000000000000000000000000..922b72bc74d7f5c773331b1af537d54c2e939038 GIT binary patch literal 1236 zcmb`DQ*a�EG8%o2G73rS7+FiquMtziyh^wr$(CZQHhOoNf1v=K6Sd&o{d-JM+!# z?1m|k6d)b};-dtFkdRQ6h{PlzDQS|CToEahDJ2RcoK&PHK^oGMP6Z+eOHT$xXCxEK zOct_|4S~r{4irgFa*-S5A&R`@L-{E{K?P#29(hYT|2R-S9deeu#^h5m_z(59}!3<$2!_aU>Fp^PdG-DXcI5eIKOk@(8%oL_F z4NYeTGns{EGl#j%L-Sd{LKdOLEMY0j2rOp>D_IrD@cQJ{tYIy|b%B@w>)C)dvWd-X zq3YH^t8Hv2Vh7sEE_SmA?PVYPIe-pwh{GH~M>)oEPN0*V;xuQ_St#dB$^Ipf`Avw|E=9!@Io4`{)BcMs-jiR)m_6itr*vGtZO@1M=^C>&-EQ_Kx{)da$^UZs9jSxb8`ng_)6>wZ>$5AZ+_vIcvIhkBSb+#@{FqpZ;$ zKhm)_x!GK_9XX`-qSFn04GIeA1^Ja@uEn zwo>kMfr@G!b>0_z(YoZzzT&IaHDC7)-?VP|w(t0^bd006)Q0{{R3aTRq$0000mP)t-s0001k zgM)i}dvkMhYHDg?Vq#KKQb9pMF)=X!0000000000000000000000000>A(T!000{d zNklBzMqy1kG@V5U84&UNd|U`m`u70$}21}xN$w$UEm45-Eua7F4Dl_ z%}U3h^CuAfBZwr=#hQfqeZuz=QVuE{M9hV|ED48$qAuTnVz0RKzKbmmnh5^CgH(Vq zMy9KEC1n2{sNF&A%J5VH zKv#eoAw#jg1rrb3lI#Mg`AC*U2|2g`P)TI`1Y)8w0MR3ex(4aMNE4uibRQ`)FClK#gz^0m$wk3<(nP ziGdW@D=`?fOekRzbRd*4(%j$<`W*C0pdA~*9C@3Ms&$EC6jr9(k3s76*IRQ{x?JQHr187nPAc1&iDVt%HMF6gPkO(kc=^>FL$H#UufJT6A z4yw5$dppb1G4?rVa?k`2;=Kc14sI;$>piGQ#mWe&9)*Ey=h#prG&fu$(EwZuFwSiN zHQ#|ivLuT#j~EDw0#5X ze(0K#g)FTDeaS7|C4O=8zx|psYq)8%5ht&O;8$m`zc+n`Wl5$pR(hAVte*G%d7bue@0=WopDH zCw62zUU-(|Q{Qr90F!`5jk}g#S34W6K0-ZD0n}vKR8e`DWu~*qQY9?qsY)?`v%&^& zZ@t#pEU#zDOm^ZBS}Q=l?Z$3MlN3cwR2eUuL!d<;nNy^bK4|4WXd~XAf+#W}=J-cU z(giM6c;GrL!U+^W@us*w%+}rv3ZRCyGE=Fxe&q$oC;qHR0n|6rN+K&e;+;@{7*P(g z9@JovaNJ1FkqzK02P3E;d`` z1mH{Zm(l!Q?vwRa5OR?R5Y1qq<(NlX7_}IxxrH`(ncoGmG6eFl21`6c;Xw zWYmG$a{Do@<#I7U!i}d26mcSTdhZ0hHa3#nwfx2VeqV@Born zTfQG&8>3q9uVOow&Eec$&*zt)^Rzmj#ha6}dba0HIm<7Ld?APVVr8R%2DY2H3s$5W z1nz$Nx`n{qK;YIzvla!IZCD|%KC*+0UH^3K3!rJmJg&a?U980gzW71pQb?b5h`HhX7<5`U}@5ss4ja7YbV4-!o;CfC>V;(TqZrhPlD zmF$$oAxgC*bcvi+kIQPfdycx#E129gEvKeJfzbOEGO4< z-ym)C`KGMPau?#zN}T8vXI5RM#kILsZ->v&*&Um*ZTNvvYA-%mrRKl(p9lY=ZjQ&y zQS>m^Ie6dN{j{pfe1TItT|}q63Yw}CJI=o^>GbgX+;p#^EL|i!7_FqU{4aayKy6 z1=Ex!TJw4NdCi{742`z`ar2tgghx3oNXy}^CR?xTrs-czHUbQ%8O`hf>>y8r%pEBMzy8zHPdptKcdYkrOWTU+Ph5?_ydjI-?e*dxBlcK{s1tY zRrV=B4nLxf`B~cj3)kkOd5n0Nv#ZA=YE$CiG?cPs6`m3a*>>Pt-GjJ%?rNV7mp}Q^ zXzQNRwe`aVp*<$Y{P3D00JFN_htOLo94KRx5IP&$LHYt>X(ZMje{1qt9G4j?mpqCe z&VUEaAP}>O<#}j_ub_m7#y)ko>mJzWhrgbiubEHNs$Q4Zw*LHCqH4{@(~f3RH)EGj zkosiO7Qv_;P9|PIK!u0+y>Hv)Yu2>lMz!Y#SK_DvltxqGNe-Wzv*CQ+PI!OU63P!W z_>1MdY=#cf;I5m03yN2LNAJSII1i079L0;XUk-f%Hd_p2?XAkspw!i~Z&qo>#X7#< z0G;n$k2>&4Tyxh=QF;)KL4+1fa}QfPE8=mGpr7B}v=iw-_d5{!=0jK@>0y%xyCmKZ7h8Y-u`+5#V>SJMt&!Y+s$)Q9}5tF0nwj8 zf*(MMdgH_ll^#Hy|Byw^{v$Zln?{H|9eM-F7?iuWM7lwYC{nj`1d=J-O zO7rVQ?@7n*!lIlVNV@zl2k{+bH?V6|W{U=<{B~kPd=!37zbI` z8%-<;kPIMWjQ16d3?N*=14B3hKwq*sX!0~n7eb~;3RoTJj=_NU5_tq# zcM!P%GELC{B+86gE+(wYqFI<%*~WwqUp&X}a?p}20A&s;0D626Tvg<=N1&m{QqX}i zarrkH1X)m9V*sJhn#e2Zyt_OFt_Bxkec-~RnkU-&0w7{ZItyuE05%jrfELe!OFAJs zc?35a;~Aemo6bRW1EC>pmTEHZ`U37h^N3gnAr+~TC2=uFlkQqo&V&YIX9Y7|A zB`Bc_GkQj3YC_ckgxPeY_h2Z6ZfP6TQlzOHxiMYo7=-}h9t=4Mze?1?Vpu{x2cb4Z z??H=TH_{o~@N%Y7=v9GXS_*juFrl%n<8*=$_5t&0qBDJJCsGK3>)Bo(xJ>dPa8)Vbfy)b! z@&d4h=1xTcObeSlrO9g)O{fls8N8n(HzT%Zb1)^!!VOk;5DwxXv@i6WI7O={VVUL5 zp?jOevUmc8gIha-63RV@J8&403ebiAk+svbqcxI3&md^l; z-vQJ^13=%Vp1i8vWVcvnwOa-AWnAp0RDdqcZJE7Fr4m`LE*nK{9S(KWEH*!*l6qDe zDuK@%I{27vC-y?|JODLMUo~!$XI0j?O*&ui%EQ!JLD$henmaOk5nu%1srHY@COR+P z0c5_FrivXi;_J!B>@b1Ab(yYt&}StT0(Z4BJagkh;AV6kHxRgiO6JjKm0G({m$PtT z#QxF`HQ$IEx5(Gkx`~=>xzFpv)ZCH@Gb4{VmIogZ0Ga?gp8M`@LQ>KyX|h*4d|~s= zW>r|bg`;GPY?{Q&Ak_mSZ&t;rf*HoPsn*r8KFqZ(ow(+PgDU`$>X`CwGg}Fe)>f0A zv$?Z)ahIFzs<89SQOc~E<;gnC^u#HyoBFheDb)q0=;u>&oLgIS;(8n3bf66cXvw?x zS-g6WK2qA)=ki)D7uid+e*cKe@VE}uvTBy6WS^BzF*}{Nb$y#0T-wjMy#vtStUM?a-d6P9^nbp_#c1XSO$MVZE zIQWyu|A_q%Kx>6xLSH`py)N>#u*;4_TMOR{js2Nw>)!A;XX zAK!j?=lktaPaFtb4FcDNo}h00$k2_`B|aV7&3XC$b5onKouz7!xHPbne=iQZ^pGc6 z3I*8duUV=*lK|Sjbqo!6E;Z^VSQ*BwzT}^m^ZR-I{aj<^aAY+nEDkec}7w{@%YgRuYt@n&c5pLI8gs%g<9$X89`3jUVem z(d=wU-xP^SrO6CAfpyA^Xel+X@97S}TXR7%TR%^$Qca7$1*{tL$X_ zwJub6$g(UuO!{1kG+E#<@lTl({RHr%$QO(GsQv3UDbl7?ZW$#oUhB&tsm}GUVe;Kv;JWZ%^YR6Jj^O5N;-)D_*|PNv>f5$e zeYURqA>3O&8}1Sp4%U?wM0N40O>=F*ggWz*DUn)vM2IEW|LzS(Mjlt9rc zk;K4(c@L!i^sk8wqZe^522{ z<^URmS(*C$0qN`3h0VX3_E=Qs@drd#x%NxoezTFTGm{bcvuW#UlzqFqZ`~>56wSE>$6_EA!XS!95w5XJ`q;SK>W_=mzQoh@Zf2 zJoz3(n5S0B0CtDEVlk2c34e0{$+sYS0&xe5gB2v!hV`KR4cOH5Nq3z3nc*1c>qZd5>dh)?AHfAfssTzkQf?Y zn}b}jY6(4oe8C@2iTxvpHC-M+M9EZRNQcR)L}1l-F15z*|xqiPcx= z`M%$?$GX8UWJWwiHCzb8h2RegHF2RyS5~3GWZ#0ep$s5Q;%A139T!Sy$}5C3U7}B*s{u&6 zh-VLJdfde)b{r1+0<^4|IH(Aa0vKCxq|U*WP+;gmv|IizKnFVlT&V#YK!UIUWt+zU zfGP(mUyis-R{jV?5`6$+@N#75HD+6HH4PZEWyXgh4hE7%0EDKLWuh_xB2&AAHja6t zQdz^u6d<0!s6j$G1n>Z0DnN}ln*e=D4myyj%-~6X3Sb%ss!yQkK?iEGCJPX{$b^bE z=mJ+?%oOdreF5Y1jHG<@4RyuEqv67P6QCG^0TCvMC0WRjbcZlP8>bim9@$jNpX6Y9&TdKxU ztv{p{GJ6R9YPe*A=&59!vMj10zvY$nKO!8&9azkUqK?}fwm(aR{xT@B(WqWQ9 z(iTnAVh<0==X$oq<@&M!(6aK#gXy-H0eFgk7x~X><)-S2hnFQQZb=f_fr{u{_}aWJ z-{3jyH`(E7zZj&Qe`s}8uhpgs{CwkUmJeX{v(7)u;%61F(&?6izN~nql$aC$4r>8;rTxU-Qj1so&-gy8AHx9k3V zt>3N}cGQ>U@EH2(G!4v*`CJu1+fU+Z+VG0BEr8qNwF4D(Rg>JB$N}mDmoL~gspf0P zG)|`RC~z%Vm$Ah};EoIM%GK2j{v4g3VwuVL%0XR#FW!_$7S({zJ8n*P`5VG^!-FhkPc533VZRV6j_>{*vB$YrU?s(9LhO> zn1i~-_^2l*0wh?IO-q{bFWC{a(SNGdBh(3$)j4x4h-1S=&#+<#%Z{&%g?6Hmq#x(jZ!Tv05bu4G6!=3 znzF6O!2lw?YVv+&&%qGJ*Xib8hh-oai>j$FOuZ>P4(f>-$*Sl=XWO26^7hZ%LU`Ue1pWPEcy7al?v4t>x4R=garM z4sYeG&k!}I^(iTm_4%cpj8m;m^LLsi$Nap$Pydef@)Y76r_-0DVRiCSE18k~SbzNW z`F6W(TklV4nO5hY?Zfo8ZGWd(ax6znR@zgu{_MfLaqINuqGnF^v-JW}+6)aJQ8~e4*&5gei08>zCy;%T@}2N=__hPklXf ziu4A;q~YGkW%mdtJtQmcV8+sA_3}2))*X1H7IR(#BMrx(L}*w4Ht~l3hQG}yPOf$N zR{gbKuB)vAk3%rL_@?uc7-?E&;vuqI+5v+#&%T^Y%I-b*JCS$2GmrRozg1mDQaKpD zrcRO7%d)A&_uvTiU_YF?cTmz6L)5|ml|r}m z=_pn8>vg4?>cvmJ^tGJTRnvS2qA>_$n3Z)|1Z-&U5!kMGs{e8ciXi(dTksxp1E2r7 z=Xe`U8~X9E+X}B+*)xRK_2QxKcQHh@$JgDmE$g)UQ7w7)eDbHQD_rTLAw>Gj6<-u4 z!O-3$l)l|6(YEIwjaZiVPhgu2|8`KQBE5XMg&RD<8;|{51mr(}^*xu`&v?4{7;WEl zia&yN^1Qf}PkEj)TIj3zNATgqTdwUnMTVTJZK`{kwk`gjVE?U-N&Bx3a`OKLhvt=l fY?_!zfAanZtmW~3kuXOo00000NkvXXu0mjf6ZK=N literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e6227db9c9d8e449155452362f88ca325272b8be GIT binary patch literal 1000 zcmWO4heODD0LJ0BK~$(v*`Js1k5E#Ptz=X7UPYnoO&K|E@9hR|@4a#R+}?NG-h1D1 zd!Kv$h9_lvoD@SWam1qrG$esWs4}igIv^;Jn|_(1tCA=g&j-mQu=4Stt$T7>_0}k&$5%@spXtR2`g# zrZa(x9Q(^|iqJ->IIgQiN8Jx*k zoQ=-mT+ZWsbO9H#i;K|3T*9U7Mtj)H-moWVcesqpxdL6uu5cAsqieX9>$o1>z>VC* z&FB_x!y5cUV{3-|K?50df_4^#gLkD|vo$m2YLp5!T> z<{9)X&+$Ajpci?GmwAPlS2@ICUQ>(?heP3Y-av2i7H{(odYAWjpAXQ7e8k6mf(_lp`Fa=x8_+^dmpJV=I+jR&i`wp)cPLIbx%3Z`7UrTxwi}5$9?5~?(YE} zC=c>r7r9s-;t~(_P(>xtFc0?#d89{qU^H4DpE+*w|J|!S#?ouv?;2$HbmPUq+@J@?P34` literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..637b9cf5a93f05f59639b81ff9a52ca6009dc9a0 GIT binary patch literal 5861 zcmVb^P)005u_0{{R3dEt5<0000mP)t-s{{R5q zoaWxN_SJjM)xGx3bIsMH=GBAM-o^jkz5msV-qoz`)oR7wgVoh@&CP1X^35>w000(n zNkl4<5C>HrC7bfAnmW<@>cokpv z(B;Ln|2#9^>H8FS`y`1=`OC?a zRq^Er@!wYTa_t}Szin6BGwHmRP?S)%6)>%Y4MQr(rLS*p-Tbvri}|0iulbvNOvhLZ z4Dn;RJY?pS@Y{Cv>r6VV#g$wv-U^uE!!90)vhz)dKR6?bsX=y^zsYLaJ!PU@Q6|jw zA@*NDzNIc4QUZ54tsuV>+WY&%Nk48(tCu7e>e z6ILaz(9}Mdm3^&%nRH*Ek`z;Ahy7pE7~i(lA&33hyAzfSV_5#Va?W9leWfV z*vP-xQ`rHS$-IBK8nMbl%>1xvv)(XWr*Q{A%?5kE%_%CaX; zpwhn$ar|xOuH*MFnv7@sukm9x@Oy8aVP1jSpL5}-jLo+z{n+9;B^;Nex6hlxaQSv@ z>D_^|fA_J8AviL_-$&EmtVl-{C6|8dYRFKwKkakI9DHXW0p!NLkMXeTZCVgTxc|wF zxYTp$>_7Y!0kQ}_G9O)AUXi4%qNFEeXTJUBHpI;5v~=cL*BmUOKDGCM=eYJInowGJ zs1Cs5S9<^BZ)i^J1^rp;8GIoHePJbYU&da{|9(5-aXi^wlW&KxZjCV(PO6b4Oj{8O zYE@sFHwVA?TMqc|^k?1~d{KPxby0c0O;%mTzHC99@LRGh-_eZl%;qvr`mN+B%v{i( zMk8hBxaM&V_|vm&ow=BLOdh?f1XGp^K=Zt@9Wj#)UY?oK61n5@sm6kgYuf0XG9mb` z)#g>lF`0%RI_#$(Ga2tpHMKmP2*>ny_+!?RiS+ip$&5>y7B`FsJ>SkX?o1Zva$!Ng zHqX|%g+68G5c}$v_8Gi0hn9YJCUGt%j%v?n2P!_SPs=C~gbX7esLda0+<~(wLgiY` zF$wU$KVxRu{pyGI!VrzsIebx?L?=_Xy@jTOzZ^%CIbUxA)EX+GN}~ z`&_)-091Iuqj+c30hQlWD>~+OS5fl%7{&3hAzi)yt$58DWG)+IrrdK%>9mr8_VAI> zVSIDmJS~2b*+L9wPaL_0f&YvHBCh?is^V)18)3~?#NUJ@wf*mE#TumLQyue++@+k; zMe$HLHd>f=Om$vPZ8YspVPL98h3v3}|_H zvoOxP%4hh}^7R~lQogHCo|-?YC1SQ36b#OTFWZ z`BOt!$2y|eQ7iAr?{5rNi8;Sk6fHRw&z% z5?My>?~f{BaH}Q-b>9|+=AV+^+L!L;yg+qhutdxU=E!SWE*wa%Bva8Z{=gjbRKSk3 z=OH_=3^|(bM7zNy3}_?K#L0;F?nafEAuJx_hWk=|nEtfpI5Qp+jFPbcb#r7Fb>BV^=1S*}&#hgV#CC0bz+@etDifO_IWt}qMJ=TC1*&xK zMrz2eE+lw>$_8rDQq^TbL_BLUb8xvU)EeVqSmKn}F_-I`mglx04Gb+D>?u9IN$e@B zPheEEfU#(45JMA^!!-t)yYLb2Wm+%rPH_%Dmuu(i=0t%XbDMlP$et6qPR`7LZqE7Q zQtVcZf{CCVuCW(SO}C@?@b(Ts0)Uz2N6IzxVm-?92~HLu_~w5>)7CWbbD*M${y_>R zg7&Vxe%o~jNs*~y;}l8d26&-EciiXT;7GVP|-hM$H%Zq2pm~0P=nDp=9|JF-?mq-OC!ldIBP)M8~3|H z#z;jA`NyOO)zX4QG6H@Np&5Wnd%7TkPVE1q|7&!0z^Er428SnguS2*&tuMzUh_#& zbWGXOb+O|fyi2=fGxo(?x^+P~ zBb9<6rE+`(*FEfp0~^1@MNHlCyLA)aZopOh+X&Uz&rj4P^It8M~jiv{rxw?1>d z0&#aPWr@vugtbIUs0y>#67XmaxfVceRiAqrk$D_0$}8?QtS zdqCtF^N$v%xkOue2fCBnzCei#;?1miZyDx@KjhB=@v`t`Aq+Oo{dZapdL z91wE??LCY#Zu)vAdl}iBYzY}<(qC4q72lllmX`Z*m9G*jmAZ}^S||rVEKSPNt%^8U zQXRHVFL6skRLg2c-{BfPe?4N+q$iQc3PdTB;*9Q#=fZ7W(r0!RO3buv`A`l~q%S1J zL@{7l7|#T8&&~HZmABs#>WE)FD$Nq@W+_33xT9R4b{`QpC2QjD(E0eAxm3!Ih5?2_dI^ z92W$NsX{3!;Un^CWGrBE_qM^Q9v&34ECO`k24E&eUv;!`|?;OJkZU7zEC`I(tJx&>E$FG5%bMUr zBq}1_r4U4R)i&F%@vx^X@xa(sSOwUO=dW3;S(SqMCBcVC1S`N}rB3tqG4E$aD_3q_ zX}+S!KW9g-B4GqqXxK93s$!2%f*7t)?!+xNKZRVcKa-!C5{rly&9Lbv#IPSh z!CIt*aigkJ94;)Csuu0(ny|pdJV}kqE-Q5>H6xb}2UFzo?$_W;#oM&>mfj)6!jj|i z?7W0v7B_O)Hu7Bef-DPTRCcAv5d>qbp9UagyrlW50K{YwpY*4>1l$_0=L!KzY@ot* z-zYu|`kzr$6h&-`MA?gS;?ANwdXEG^KLK(A21nfHf+ql*t%${tH(C!d6E46aL?6)s z05$Hp7diwGj+BL6iK)fz#uz37i?+vM@{C5q&mZAobiTvLkoSaXi86JUA2*a7m0SFa z@LcnPKygV#Mkk8Nj!ol`#1u^#p+@6?h88GOEL-dH5fnD91Dh7QSzm!L1)kJmuWPam zAx?XIFW2X{bTDoYMQdBN%J#}{7Xr-gqO`Yi2(qDAl!DiIAmwIwB4p6m2rO1#p6-PX zBiAo<9m1n%RbdFah?KyFiCX2TtXGbdB8bS8j2cErk~-UZ@jGrfn?W-J4JY^V<#D0; z45MF=5${5@sv}kvL=pw*gV+3va#BB11!br!2xvTy^HX@+E56>*e^5*kVuq0Hf=zB;S>Wm!JyW?B*Z`63uRAHZvY_8kfV+7ID`Mh8^O z68+YK-v^(ENP(0wDAa=S#opEtHoRwZ5d?`FHUKq0Xsu*NqiRL3Bt>WspIu|6NQFko z1FBRw>Ff&Fd=oI(ky9CFPi`$6aoMt9qd(# z%&JufthqL)O(GyoBsXDfc}g<~Q0H!C%3Zuxg%M(}oq1>?hyY(aWFYpGRnVnNMnGbY zE=(Wat9YM7kX9_YhkR9-fVI@TK*05iBDI~Q$S{99PLY=)i3Alws*Tvlvg&iDN|#D9 z23DUv0nZLz_5cmg*(z7HNitvn76SandZox+hy&{7=qlnb0HMk}K*z;`CVgIQBr6r6 zeE5_p7V+K|=iq)Ne4?Q9H8oc%-uA+xke@_XN!Nm8Jv`ANRcdizr0{)PsxiJPoFw|w zjg&TBkmVk}1a3s9$~VahxO7={-3=_7m2B*?gPf7Zs~Nodte020(Ki8dMB;P_G7)r! z^p4m0f+MN&5Jg8m_XCa_l~vLciDyNqb$MnKs}&)AH|bTEf0S zjZ5L`xNflf8^2&jJa^{7(Ag}y{R^t}q;4pQGOIKO1d z%D%EAvkQH^WK;GPMwv`A!BMZ9M%V~RyM?3uWnKTSvQB6O&D{d#{=ze}tMC*K816S( z!~I_JS=d2H;=u^Xte*Dvx<%j%-UxkAWcx{$y^`y7 zFS$NQk|ea?HK+g8*7W}%XlSEuT$t1#2n~b zOm(k(uLNtC-{j`>9e_nwYB+% z)cKM&lF(Y1CE-oQ+2$f!Q=>}?ij79sE*HKow3d!31EcbBa~ZI?6*ud(;&xy)T5&>a zaU1^5GxcqS%2#L>3a#b$8t|wD-&{)N!Em#kxwA#u+|CqQ8w5mm#KFzQ-h(z=$zX*& z+Z&;+_6FOdO-xs7t61>w(SSMB+<@7&kxkdmX0|}>N8UzK_Gu%DO>Lyw-fbjm$qUpV z<&7@r-EEC71oz0;QHn}hJf=e%@7L&Zc%zFPOQ066*NVHdqZJqNT5*Y2X~hZDWZrBR zhPF2g&)1uUQp^|I(JYLKyEY32+M4gJotg297&pGJhHD*g?;{4Atzu()t5}0*f`I2A z1yhyL`;O^0TF1hEhak3^*~YeJHo-|mQ^8TCF97X()?9Bix3?$Y5Cu~+(+57rv0FR7 z1@P4lnlv96F!+H1*|%NJz2Z@r-HtSD0e*+WI=daZr~~eGoJiXDIMHs$LcB7|D;{`~ z>Ia^7JGde=AN4!%k*#<4KC&fj9!6Zb-gIL4C5Otay$_WMbd1Bl#Jc>^Z%35}@&+B} z5MJk^gC?^#GyGwbbA#Env5IDEFOtD6iK8q{BM?=qYI=+FnUa zICN;|^#HpOI%3viDLDO8t1|aHI#%>rfOOyqL^Wn)+umHVFaDSgKD`zoKk6r4p+kQF vbRUphQp*g@dHO5200000NkvXXu0mjfv_DB9 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..cae5112e003a1b2d5924c329d59bd2231481a186 GIT binary patch literal 996 zcmWO41!ENi7>3bz$>>XO+v?$fOooC@X43W@LoYBP~)RB~+U_)TJJ(PXii~K#gcj6PluC zG^YjGD2JA`qBUwmTiO94+C|%F6KWl;qGjZSOnW*IC`m^;(V6rvbfudLyQ3cTq!+zW zA9CqS9?GYHe)J0!M1JH&-%xJ!iQds44PYRJ3_^n$LJ>pJForXNkt9YjT5F0aL8Xjg zEaT94CNLq!hsMR&7!#$Tk|>UeOhRQ$W(rf$G^R6ynIvX0Ticp52hF9Nc~qeJR8mDX zTEK#+j;c^)%#Vtg7b=g1EaEV9I7e_KN1>xRhGRJn9nT4z$VupA7PEw zRk1QwgqFv$SQ<-0i{lhda4R=uFPyY|bJ5T+ZYClwlX3wXEYp)}xEqz(zKq zO|daH#KmZRT*A6o8@iOsxST7{m0ZQuT!XIVIx}OJlkcZI2Ji? zJ9fph>KU7^dTSdG5gSd_Q$^X z1bxb9e9jl>OTOZ3zCqve9pCc<`jMabnP1Sa{KoJ6f&SzGfAKf^hkvQzAUedMI2bh{ zImM|?vkpYMGn{GFa+Yhmj#bz7T;C0x)zAqy+TO^G0058#0{{R3eVcu=0000mP)t-s{{R5h zoaWxN_SJjM)xGxBgVoJ*&DEsl-o^jbi{9S7|JAJS)oR7nbIsnI=FMuw#EaV9000`V zNklp4ba0m_Z2Bhjwibd>{eomRrTt;`|dsW-1|zBBpi&fOl26KEaAb&vGn*E_VMjw ze`OzckABNOU%zH^{w;32lZ(e5(=cYV>&whNjDE+ftfuQ{OsWGKOT%={@Jy!Jok(Ju z-RNEUj(xnkwaPxfeaEqiS8%hdsQG?JqasH8LIdF~?)a=L>{US4J|-qHQ%~9TvzZv1 zT;1wq*B{1;?4PC=ox)Ar``A(fIT|zA4n@AmKv0Z34Z1^QezQ>WRD?(9t3 zcoM|9#%;^tw6;4PO+0oLfM=Qpt_Z-0SZsO{W0y01j487-zhgeHoi;2V zXLncQ)Aupp26y<^^iW{kG!u1%$pOy4ZWx$miKqY+0XEF}EA0Bs%s`rb);I94tiNEl zF<_+c7F`Cs1zUba1{R0S)|+*VMVnhs>)#*TH`W}h+h?w@e<=q3$bN9_ zr;OXY?QU*U+<(Tog)ig2?&0?GeHUYV%8i%sW_Q|@Jrd2qA2z*82Tfo^%v6vu@7S}` z>~2o^n*E){PqQx0m+x94ev>}V-^b4{bF+H+{rZ!w0Vy*8qqh&>F`4K+?a54~+12S8 z@Z0j`*j;Y_D*q@fn3~e)!8_bh>WN~cDSxEO@~e1>C6k$pZH5wzVd^do!Ny8Y8$SLXyI~j8H*6Yp zEPk6@d6hek)h3=>NfY0tAK@8^g{;SXaGG5$#=72Pzb$tCioHYG@QnYGUGuG`ulZ=y zQiawz-VgWwQam?zlTrRiudH?(1ZQ)%J;xp+wwmux?DJgLAK7&qfNwje*m$5D$w5fE zAp4wc)iZhAyDWZ6im;p!uWlOqa+J+?iW}ED$Cd`#Cb{Ax@7aH0<1+xB^POVGR4*nV zAB~AMkHFL4FloAuXUwcFo9TUcg>`Xe1g7SJKou;uR%8lLH@yB#jU_uW|VIucW*Ld%eZa0 zjkx_CNb(TgiuEETc93WIH+ub3L-@%U zRg~M!pp5rheVa>LpYGv-|FI5t&HV+f>pcSwdQ5qi#-ni4F(_mPaar1kxCUm*+HATB zc$F9WfUt+h3tGMKTwz~9sJ~{v<$N`5%oISDRsg2J>T%SS*2f+*Lj+1~%?bv(fb-n) z_5})U_4s_oEo8XM(C^rFUhwhzH{kL#TP#4bGdh%Xfhrol2R(^VCU_}$R0q5YK*ero z4$1`BRcE}CrZU9eGoCrc`|O4SuZ%<9$Z_;9aa(>s6<~a+E~*0XYIn2hOyY6J{$-Ot zLgiij{?num2+o`jWp#Y&Cg}li=vkUzQ=e%gz`4S7c4@u7+z~28dsV`{0*i%$Op%ho zmn1b<ℑ{Q6GvQMkV$wS!nckZbr4b|1wi}!n(iDz*JyQfn)X+qaXU-#zwsWo1Z4j z(sjIX(}???65v}_UwoiW7-Q6Tpe(|I(SXud_ovqN7k09E)))k6v_)8I zj0GN|&|?vM6d{#!?84c7ct-11e5c_6#b>3BDThQNy4l7Ioo=L2Qpca(WOJ1?#Ob0a~gxM{Vq8R-tU znnBHsYJE+-`QEhAp7k`%wMhGn(EzmHSi(HxZEUiQ9lf)h`jxi4s4f46UC&7%alMKr z(qQLovmnf&c$xbJh+!zYxm2tVLCY)?vzI4tnnxGcQ-2MNjVQxU*$=A{%cK(vt`$fI z&Y#k^@k%E@@B1TujHt9(1fmyRS+&ZZ?KeM&!uNY_Yg(nx1qM zFE=|TuQZxULpLrvLZhq#1m(h^qMXRKk%=R3FCRVgdFPfl7xUefI+4c0tZ|h5ZP%dU&OShBPr(obj& z|Fesi>gTyWJ)1?MirgayZh6O6d^59MSGp{Sh&>}sZ#X;bhSgV@5*-Tm3+cM&a#~+t zZ~t+OMDbx8+kcEBDX4NN1>z9V7V(gRQ_eK|ZLTlogQ1i6O}TE2Z56yquAyU@DIZkk z{sBDp076$#e1&zvq3i-nN0&{hbAb0=>jG z?tK_x;#NXVXWzcPAQcCA=R25)db~TQ8tIS{q1Y<~nbFwnaQYx#W{SKk+@SS|lriU) zyqgm2DE32e{(=P;BX#x}i_K6ND`_LEkG%p1rSmyd4#@0LA(@7mdVio#%E33bBX%@b zgUe=ndT;i6AsG3TCEDc!cu;AhwX8S=U$3}6Ss}Sio0+LEixPre03Mp48@cK1%5B#u zpX0b`V_c?G+AlST?pB-89*xIm#~NChL5PiEGjX}wk~p!4L$Zzj;&e3Na~b>lK$b^~{nD2+v(bTp&aU@^ni@Z2J zmW}S?Bf{s!)~`8$+K0En z3$q7omX`W`-T=29Yfb?EvWpk^c6~1k`JVUQH`^E5#8_-B3YzA7zxnj|3`f#t<@UBF z;O3N_Q*89!W1OP%-e=rP+lD)C195EtT3hFg@r*Lf>1g5^)MWKlwqpB|NQzJ8c!6kq zrk|saK6BOSw5j7JYhgjLSxk=FRB;=^Sib`84fwj7cueYx!8`&y{Ux^o&Y8EIAod~i zU9?3to>{@YzHE}Z9=;#1bpSIUUpn?(W72b_%JWsSaQm3s2@bKikAp&4i??evf%{r9+Pnoy#jjcqre+&zv~^TvI;% zugWKZ94345XiZmBf$;ftHC4?I?A@+6tqzPw>M`wu^0t3#>@qy^C_h-4`Sl3!)H&SMwD1{KO{)H-vKHLy z23q4uQ}0t02{$6L{GYykqA5e<%1|}msdTHq*4A3q{n4?NscJs-NYh?sqdJEE9)O|n zx2ih-rix}oZ+E^-RMhOcuZ zm{e1Gc3I7Melb<(KDQg<&$7VtU$)`pNB2}TX7GHnvD{-rRuBz{U@QQS-g~RN<(Acz zzsR2-=eui4r%r&w?H)DZNlhs&$9JnaJ4sQvWml_wTb-+QfS&5f`f?Y!bwM9CF#=a4 zznSVjq0CNog?O!+E59uDZuRMv->4^K*`xZCiP-Fjuf{_;3f>~A{y!ozFLw3;B1^TP zJ}k>g;;Te~$nWo}Y0mkfys9QPZoYF~@ja^YYOc~#`T!!PgE&|jCNkj@T=>tv!Ae)2 z=Z6a29#v3Ds)6n|58_RNI=ixIJ}AnL@@^H}v^vT?!PbhtG)Am7$y#-3Os@==y}`@K z+gkqoZHNdiMTNAFdOQ2Yz&G#YYt@J6xb>l4)`oT6lO@(B{REhmb-fj9 z{odv;`t!BJ*$3O8_J}m>IS9wh@8N}7ZFB0Ama?PcTYmJSQ`Do{u&kRh#X9+4j;MaW zoY3V~ZBrj`O4HR^ZSCjX(R=>Ztyf-Rs3%k9<3ed;!D3Jg|M`FLYQCfF3~rRd(6?rOo!XiU3z zvbls*xVV0VXoJ+ZhLD7RYuB{k5jc`Uk7&KsIV?+>;ys&$Dh+BCO}q=HT)zb(V(GpM z`(9+3-}BNZ@)2UMeCd`=LXzK3Y1*(~AEprD|M^lc0JZg`|1-WjsPz=_vd z-(M{LJD$Jr$$|%#utSH+LnI{m_th0`GnoLHgiGh0pe~hlRb7NZq3|PW2qq>}|AVj~ z&VdA4#QClgkH>d#q6N!6#MPQ|??iO-h+l>~(TsRfL!nIxGMqUFgKU8Z;`rx!97^zq z``#-WqbN4{nxYg$|K?yhL;U%>j&c?$9T9GoWqoXErW7Q_{)nomz#DH#Ql$t#sVVzw z?d0M)*XHN0Ps3Iybg`Oi(Ujm3h;WkZ11I&R8B3E?|47)b& ztML!_LLS2&11i;-T?%eeJYb(*!E^cuFG?fG@96M}vR&GwRD}S=LW*daN9@9I63MWy zx5_A;NBo&DDq9suBRg@yeU8F>ri}&;Fh|%8({) zRChIh>zEn}*@aDt3IP(;DH%(R7j~&zL~KyGbUXQDycB`Gz?4==lLEY^5tYKW6@)0E z(5NTJN2-)q)m%N2Mn(p_JO3zepz~^tYVpc4CHj20coqg?f$m;P8tfISt`A2c z*&!U-IbOoE_!cZ9i6RvFR!s>35Q~1i|6w0RRipL847Od%}y48!3u(m?vtJYpc8hqFn7Yp z%1{V?ganbtXtq)aY(zQ_iv$O|9#B&iLM`iT(kUZV4(VBN=296B3}YwmIK{B-gz5c6 z35c8M7cxtiT7>FSf@@@uU~4Ks*<(9}z2CV_7~k_(dK(<(h@z~c#c$C>lM_M@ye_v? z*0R|wxOE9)TXG!RvM`_Rgg9KiiS`wm_C=*~NIv!opfPvLwv-)o}HJu+$3(o7w(F3l^zV^R)S@ zO(#X?ib_=01R$Jgp;9>)2oR2zJwl4j(OMJmBsyUfw;J4ryBXO%j)>~y9VRAFtsGI_ z4LeV&P*_pgg2u|DueMQn|;rsJiOqo+q68i`~$9MT_iFzsg^Xt&}TkKf~tg4KPMm z9CZB_#6FA$A{eL^I_PT4n`+`vr4rnckUSSq%31+<(N$68!oEPk>cL?dG4x>Xm7A*6^nqHx<&QF1sTP2ER2Rz_!Ee8nDYVM~eOlrek1P^;?LTDwT&UdHX zrUFBscmGV56R7h@b;xIr4M#Xq$g%!D{wW-e79>=wUJ%~HnK}C{~qHhuhv@Uu`s~q;Y$$KCLYUdS2 z3D&h4%})t64Ve>?LPLcPS?rHcz-gP0)GPcwhP7ZuUIU;Ok8ehjuLAPtYn3%hIu(Ew z6a=JV2%eRADL5vp4Ga8px2jy}^}yh=Mr~p~Uwi2|7a~6@?>v8gM;3%83t=516{f1^ z3#GE41UwBY4Ffs`Og;2{r9rnlqT(hqoWs zfE;B3SV8ZtwG3*gP}u3yo(o8B_CQlM8^{ViaLy-Ttb|P zXZe>PX=(b18`SZS@Wjhva9Ex2n=7u^)#wR|64qcQ7C>N$)&B^9jgQg{Fbb^%r7~4F zr$)*g(%d-@*@C(>sY%U*TW6_L9g_u>QX}WM)Iv*`P|fVt5HBc1vo&2d6G$g$JkpB{ z*Mcq})h2X>;{GKPTrD(|r-lPtcxpm7;74T2aPp+zgbQq5m`1tDE+Fv|R1!jtNO;mt z*F@^dsZo%H+CpwyX_v~K^W8!KTgwE9`LI1Cz>CzkX5BoNTdCP`pa7Nt{J;gQy@Zas zfW*M8hR!s+up+o6L}q{j zgUY+JkW?pxo|=;5-FsDK@Rx&{cyDKlJubTN{7VQi3Q(O1wHmc}8VNYPf7E(JRIGxc z?3}EpqNJ@gfB90tR6=W^22`;Sb!(r2hitk6gL(y1{AT+KL%wJB&JvB@-Vd@&N^A!Zgvrxx_+c+HTg6 zi9NBRUrZ$32?YZvB1oo+PLqlGt&&9PLxEu;fyzB4Z7oYnc%6V!eK<_Zpn+kLDIu|& z0bqzuUsBbh#$u2HGa>e&ruYrikBid(1t1YAyXVP?|5)As&z3CHTS4cWR&@r)rv8dfwzqNa*L=L)PjrilwMct^W9?mj^}ay z{|E5@`I29o=E-^N-Hame#vHFU`+IMaSW-LvvgYEq!tApRzW=lV|4+4hI{|>w69(B`V}a=e470&7N$zI zmIcb+4bR;_Zs}GsCFq;*U6rYQt0sL_`>4dsv39c6J6*Mp3r~6pGb@R|RGZD%tB^GN z^zkM)f!GN#0z1|=r76#Ch+w?*s!_G#LH?7RxzocLtwcAaCtvSE}@?d=wF$`ugP8_nTIq z3EJ@ce~#(|uMhuy>iJWqMFVdQ&MBb@07pf*{r~^~ literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/quick_guard.png b/graphics/battle_anims/sprites/quick_guard.png new file mode 100644 index 0000000000000000000000000000000000000000..71d343eeb5a8f93b0a50cd832de74728bb9c2b6e GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvg8-ip*Z=?jYiepLC@4rsNC*fB zluka#CnN!s#07E|XG#I(B0OCjLn`KMz39l*V8G*YF{fyMj+%MKyZRQbgA&V{xPFz_ zE@>5-=%Z-c+FttM0|Un|9u5vD literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/water_gun.png b/graphics/battle_anims/sprites/water_gun.png new file mode 100644 index 0000000000000000000000000000000000000000..4f30b2133dcca00deb0874af741c321f3ec21d59 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoQ!VDx|6+TY^aRPioT>mQ?N^ae1cqPk_P= zZc)xy?vy3WFAFAku!R^lM`UMId~}`AXl`Y7fURjwfQZAk5)lDbhP)CbyHbT!Z9vNy NJYD@<);T3K0RXhmR=@xN literal 0 HcmV?d00001 diff --git a/include/battle_anim.h b/include/battle_anim.h index 70f65123b2..5189c82112 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -224,9 +224,11 @@ void AnimMoveTwisterParticle(struct Sprite* sprite); void AnimParticleBurst(struct Sprite *); void AnimPowerAbsorptionOrb(struct Sprite* sprite); void AnimNeedleArmSpike(struct Sprite *); +void AnimTask_CompressTargetHorizontally(u8 taskId); extern const union AnimCmd *const gRazorLeafParticleAnimTable[]; extern const union AnimCmd *const gPowerAbsorptionOrbAnimTable[]; extern const union AffineAnimCmd *const gPowerAbsorptionOrbAffineAnimTable[]; +extern const union AnimCmd *const gMusicNotesAnimTable[]; // battle_anim_water.c void AnimWaterPulseRing(struct Sprite *sprite); diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index f9598c6658..c80d90b1ef 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -321,6 +321,10 @@ #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) // battlers #define ANIM_ATTACKER 0 @@ -376,6 +380,9 @@ #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 // table ids for general animations #define B_ANIM_CASTFORM_CHANGE 0x0 diff --git a/include/graphics.h b/include/graphics.h index 5a5c984daf..cf83e88c94 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -4754,6 +4754,14 @@ 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[]; extern const u32 gBattleAnimBgImage_Dark[]; extern const u32 gBattleAnimBgImage_Ghost[]; @@ -4770,6 +4778,15 @@ 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[]; diff --git a/src/battle_anim.c b/src/battle_anim.c index c89f582e62..b763b9980c 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -1439,6 +1439,10 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {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}, }; const struct CompressedSpritePalette gBattleAnimPaletteTable[] = @@ -1757,6 +1761,10 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {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}, }; const struct BattleAnimBackground gBattleAnimBackgroundTable[] = @@ -1794,6 +1802,9 @@ const struct BattleAnimBackground gBattleAnimBackgroundTable[] = [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}, }; static void (* const sScriptCmdTable[])(void) = diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index 07ac5bf570..66a5272c77 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -2837,6 +2837,51 @@ const struct SpriteTemplate gWoodHammerSmallSpriteTemplate = .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) @@ -6687,3 +6732,27 @@ 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 e6ac7ffb27..a8b54d41df 100755 --- a/src/battle_anim_effects_2.c +++ b/src/battle_anim_effects_2.c @@ -1232,7 +1232,6 @@ const union AffineAnimCmd *const gPerishSongMusicNoteAffineAnimTable[] = gPerishSongMusicNoteAffineAnimCmds3, }; -extern const union AnimCmd *const gMusicNotesAnimTable[]; const struct SpriteTemplate gPerishSongMusicNoteSpriteTemplate = { .tileTag = ANIM_TAG_MUSIC_NOTES_2, @@ -1284,6 +1283,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); diff --git a/src/battle_anim_electric.c b/src/battle_anim_electric.c index eca10f2b49..b49427bc79 100644 --- a/src/battle_anim_electric.c +++ b/src/battle_anim_electric.c @@ -456,6 +456,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 = sAffineAnims_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 = sAffineAnims_GrowingElectricOrb, + .callback = AnimGrowingChargeOrb +}; + +// functions static void AnimLightning(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) diff --git a/src/battle_anim_fire.c b/src/battle_anim_fire.c index dbb21fe6cb..606f498d4c 100644 --- a/src/battle_anim_fire.c +++ b/src/battle_anim_fire.c @@ -510,6 +510,28 @@ const struct SpriteTemplate gLavaPlumeSpriteTemplate = .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); diff --git a/src/battle_anim_ghost.c b/src/battle_anim_ghost.c index 4671edbd48..273fdf38a4 100644 --- a/src/battle_anim_ghost.c +++ b/src/battle_anim_ghost.c @@ -249,6 +249,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 = sAffineAnims_ShadowBall, + .callback = AnimShadowBall +}; + static void AnimConfuseRayBallBounce(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, 1); diff --git a/src/battle_anim_ice.c b/src/battle_anim_ice.c index 7a6f1352d9..ea46092d9a 100644 --- a/src/battle_anim_ice.c +++ b/src/battle_anim_ice.c @@ -561,6 +561,17 @@ const struct SpriteTemplate gAvalancheSpriteTemplate = .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 = sAffineAnims_IceCrystalHit, + .callback = AnimIceEffectParticle +}; + static void AvalancheAnim_Step(struct Sprite *sprite) { if (gBattleAnimArgs[3] != 0) diff --git a/src/battle_anim_rock.c b/src/battle_anim_rock.c index 7b4b448ace..22f9f2f8e6 100644 --- a/src/battle_anim_rock.c +++ b/src/battle_anim_rock.c @@ -327,6 +327,43 @@ const struct SpriteTemplate gStealthRockSpriteTemplate = .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; diff --git a/src/graphics.c b/src/graphics.c index 5df0bd9b1a..97250b963d 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -41,6 +41,18 @@ const u32 gBattleAnimSpritePal_MegaParticles[] = INCBIN_U32("graphics/battle_ani 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"); + // 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"); @@ -1151,6 +1163,18 @@ const u32 gBattleAnimBgImage_RockWrecker[] = INCBIN_U32("graphics/battle_anims/b 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 gUnknown_E6BC04[] = INCBIN_U32("graphics/unknown/unknown_E6BC04.bin.lz"); const u32 sBlenderCenterGfx[] = INCBIN_U32("graphics/berry_blender/center.8bpp.lz"); From 4c5de0998a756ecd2e4347f49fb2be16b4d96d74 Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Mon, 18 May 2020 08:51:30 -0400 Subject: [PATCH 578/667] Fixed chances of confusion self-damage. (#371) --- src/battle_util.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 86de71de34..d31edb72cc 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2311,12 +2311,7 @@ u8 AtkCanceller_UnableToUseMove(void) gBattleMons[gBattlerAttacker].status2--; if (gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION) { - if (Random() % ((B_CONFUSION_SELF_DMG_CHANCE >= GEN_7) ? 3 : 2 == 0)) - { - 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; @@ -2324,6 +2319,11 @@ u8 AtkCanceller_UnableToUseMove(void) gProtectStructs[gBattlerAttacker].confusionSelfDmg = 1; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; } + else + { + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + BattleScriptPushCursor(); + } gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfused; } else // snapped out of confusion From 181bfbf5fdaa68c1e5b7e8c44fe103a66d73a802 Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 22 May 2020 10:10:10 -0600 Subject: [PATCH 579/667] cfru particles and bgs --- .../backgrounds/new/aeroblast.pal | 19 + .../backgrounds/new/aeroblast_map.bin | Bin 0 -> 804 bytes .../backgrounds/new/aeroblast_tiles.png | Bin 0 -> 2902 bytes .../backgrounds/new/aura_sphere.pal | 19 + .../backgrounds/new/blackhole_eclipse.bin | Bin 0 -> 892 bytes .../backgrounds/new/blackhole_eclipse.png | Bin 0 -> 4122 bytes .../backgrounds/new/bloom_doom.bin | Bin 0 -> 564 bytes .../backgrounds/new/bloom_doom.pal | 19 + .../backgrounds/new/bloom_doom.png | Bin 0 -> 1788 bytes .../backgrounds/new/bolt_strike.bin | Bin 0 -> 780 bytes .../backgrounds/new/bolt_strike.pal | 19 + .../backgrounds/new/bolt_strike.png | Bin 0 -> 5861 bytes .../backgrounds/new/clangorous_soulblaze.bin | Bin 0 -> 700 bytes .../backgrounds/new/clangorous_soulblaze.pal | 19 + .../backgrounds/new/clangorous_soulblaze.png | Bin 0 -> 1696 bytes .../backgrounds/new/dark_void.bin | Bin 0 -> 1236 bytes .../backgrounds/new/dark_void.pal | 19 + .../backgrounds/new/dark_void.png | Bin 0 -> 7041 bytes .../backgrounds/new/dynamax_cannon.pal | 19 + .../backgrounds/new/electric_terrain.bin | Bin 0 -> 2020 bytes .../backgrounds/new/electric_terrain.pal | 19 + .../backgrounds/new/electric_terrain.png | Bin 0 -> 3458 bytes .../battle_anims/backgrounds/new/fire1.bin | Bin 0 -> 684 bytes .../battle_anims/backgrounds/new/fire1.pal | 19 + .../battle_anims/backgrounds/new/fire1.png | Bin 0 -> 2557 bytes .../battle_anims/backgrounds/new/fire2.pal | 19 + .../backgrounds/new/focus_blast.bin | Bin 0 -> 952 bytes .../backgrounds/new/focus_blast.pal | 19 + .../backgrounds/new/focus_blast.png | Bin 0 -> 3537 bytes .../backgrounds/new/garbage_falls.pal | 19 + .../backgrounds/new/giga_impact_opponent.bin | Bin 0 -> 704 bytes .../backgrounds/new/giga_impact_opponent.pal | 19 + .../backgrounds/new/giga_impact_opponent.png | Bin 0 -> 3056 bytes .../backgrounds/new/giga_impact_player.bin | Bin 0 -> 744 bytes .../backgrounds/new/giga_impact_player.pal | 19 + .../backgrounds/new/giga_impact_player.png | Bin 0 -> 3098 bytes .../backgrounds/new/grassy_terrain.bin | Bin 0 -> 2244 bytes .../backgrounds/new/grassy_terrain.pal | 19 + .../backgrounds/new/grassy_terrain.png | Bin 0 -> 3912 bytes .../backgrounds/new/gunk_shot.pal | 19 + .../backgrounds/new/high_speed.bin | Bin 0 -> 496 bytes .../backgrounds/new/high_speed.pal | 19 + .../backgrounds/new/high_speed.png | Bin 0 -> 855 bytes .../backgrounds/new/hydro_cannon.bin | Bin 0 -> 880 bytes .../backgrounds/new/hydro_cannon.pal | 19 + .../backgrounds/new/hydro_cannon.png | Bin 0 -> 1089 bytes .../backgrounds/new/hydro_pump.bin | Bin 0 -> 224 bytes .../backgrounds/new/hydro_pump.pal | 19 + .../backgrounds/new/hydro_pump.png | Bin 0 -> 540 bytes .../backgrounds/new/hyper_beam.pal | 19 + .../backgrounds/new/hyperspace_fury.pal | 19 + .../backgrounds/new/inferno_overdrive.bin | Bin 0 -> 556 bytes .../backgrounds/new/inferno_overdrive.pal | 19 + .../backgrounds/new/inferno_overdrive.png | Bin 0 -> 5090 bytes .../backgrounds/new/leaf_storm.bin | Bin 0 -> 924 bytes .../backgrounds/new/leaf_storm.pal | 19 + .../backgrounds/new/leaf_storm.png | Bin 0 -> 3338 bytes .../backgrounds/new/magic_room.pal | 19 + .../backgrounds/new/malicious_moonsault.bin | Bin 0 -> 544 bytes .../backgrounds/new/malicious_moonsault.pal | 19 + .../backgrounds/new/malicious_moonsault.png | Bin 0 -> 1839 bytes .../backgrounds/new/max_lightning.bin | Bin 0 -> 744 bytes .../backgrounds/new/max_lightning.pal | 19 + .../backgrounds/new/max_lightning.png | Bin 0 -> 1959 bytes .../backgrounds/new/misty_terrain.bin | Bin 0 -> 2180 bytes .../backgrounds/new/misty_terrain.pal | 19 + .../backgrounds/new/misty_terrain.png | Bin 0 -> 3541 bytes .../backgrounds/new/neverending_nightmare.bin | Bin 0 -> 744 bytes .../backgrounds/new/neverending_nightmare.pal | 19 + .../backgrounds/new/neverending_nightmare.png | Bin 0 -> 3739 bytes .../backgrounds/new/nightmare.bin | Bin 0 -> 756 bytes .../backgrounds/new/nightmare.pal | 19 + .../backgrounds/new/nightmare.png | Bin 0 -> 3356 bytes .../backgrounds/new/poison_falls.pal | 19 + .../battle_anims/backgrounds/new/psychic.pal | 19 + .../backgrounds/new/psychic_terrain.bin | Bin 0 -> 1904 bytes .../backgrounds/new/psychic_terrain.pal | 19 + .../backgrounds/new/psychic_terrain.png | Bin 0 -> 3694 bytes .../backgrounds/new/rock_wrecker.bin | Bin 0 -> 676 bytes .../backgrounds/new/rock_wrecker.pal | 19 + .../backgrounds/new/rock_wrecker.png | Bin 0 -> 1511 bytes .../backgrounds/new/shattered_psyche.bin | Bin 0 -> 808 bytes .../backgrounds/new/shattered_psyche.pal | 19 + .../backgrounds/new/shattered_psyche.png | Bin 0 -> 2406 bytes .../backgrounds/new/sky_afternoon.pal | 19 + .../battle_anims/backgrounds/new/sky_day.bin | Bin 0 -> 1052 bytes .../battle_anims/backgrounds/new/sky_day.pal | 19 + .../battle_anims/backgrounds/new/sky_day.png | Bin 0 -> 7508 bytes .../backgrounds/new/sky_night.pal | 19 + .../backgrounds/new/sludge_wave.pal | 19 + .../backgrounds/new/snuggle_forever.bin | Bin 0 -> 988 bytes .../backgrounds/new/snuggle_forever.pal | 19 + .../backgrounds/new/snuggle_forever.png | Bin 0 -> 6425 bytes .../new/soulstealing_7star_strike.bin | Bin 0 -> 968 bytes .../new/soulstealing_7star_strike.pal | 19 + .../new/soulstealing_7star_strike.png | Bin 0 -> 2600 bytes .../backgrounds/new/spacial_rend_opponent.bin | Bin 0 -> 1000 bytes .../backgrounds/new/spacial_rend_opponent.pal | 19 + .../backgrounds/new/spacial_rend_opponent.png | Bin 0 -> 5861 bytes .../backgrounds/new/spacial_rend_player.bin | Bin 0 -> 996 bytes .../backgrounds/new/spacial_rend_player.pal | 19 + .../backgrounds/new/spacial_rend_player.png | Bin 0 -> 6948 bytes .../backgrounds/new/tectonic_rage.bin | Bin 0 -> 296 bytes .../backgrounds/new/tectonic_rage.pal | 19 + .../backgrounds/new/trick_room.bin | Bin 0 -> 844 bytes .../backgrounds/new/trick_room.pal | 19 + .../backgrounds/new/trick_room.png | Bin 0 -> 2137 bytes .../backgrounds/new/twinkle_tackle.bin | Bin 0 -> 784 bytes .../backgrounds/new/twinkle_tackle.pal | 19 + .../backgrounds/new/twinkle_tackle.png | Bin 0 -> 2243 bytes .../backgrounds/new/water_pulse.bin | Bin 0 -> 600 bytes .../backgrounds/new/water_pulse.pal | 19 + .../backgrounds/new/water_pulse.png | Bin 0 -> 2106 bytes .../backgrounds/new/waterfall.bin | Bin 0 -> 2128 bytes .../backgrounds/new/waterfall.pal | 19 + .../backgrounds/new/waterfall.png | Bin 0 -> 5092 bytes .../backgrounds/new/wonder_room.pal | 19 + .../backgrounds/new/zmove_activate.bin | Bin 0 -> 520 bytes .../backgrounds/new/zmove_activate.pal | 19 + .../backgrounds/new/zmove_activate.png | Bin 0 -> 905 bytes .../backgrounds/new/zmove_mountain.bin | Bin 0 -> 760 bytes .../backgrounds/new/zmove_mountain.pal | 19 + .../backgrounds/new/zmove_mountain.png | Bin 0 -> 2174 bytes .../sprites/new/ability_pop_up.png | Bin 0 -> 275 bytes .../sprites/new/acupressure_finger.png | Bin 0 -> 298 bytes .../battle_anims/sprites/new/alpha_stone.png | Bin 0 -> 933 bytes graphics/battle_anims/sprites/new/anchor.png | Bin 0 -> 282 bytes graphics/battle_anims/sprites/new/apple.png | Bin 0 -> 214 bytes graphics/battle_anims/sprites/new/arrows.png | Bin 0 -> 199 bytes .../sprites/new/assurance_hand.png | Bin 0 -> 330 bytes .../battle_anims/sprites/new/aura_sphere.png | Bin 0 -> 1086 bytes .../sprites/new/avalanche_rocks.pal | 19 + .../sprites/new/baton_pass_ball.png | Bin 0 -> 203 bytes graphics/battle_anims/sprites/new/bee.png | Bin 0 -> 317 bytes .../battle_anims/sprites/new/berry_eaten.png | Bin 0 -> 255 bytes .../battle_anims/sprites/new/berry_normal.png | Bin 0 -> 297 bytes .../battle_anims/sprites/new/big_rock.png | Bin 0 -> 727 bytes .../sprites/new/blacephalon_head.png | Bin 0 -> 411 bytes .../battle_anims/sprites/new/blue_flare.pal | 259 ++++++++++ graphics/battle_anims/sprites/new/branch.png | Bin 0 -> 256 bytes graphics/battle_anims/sprites/new/brine.png | Bin 0 -> 259 bytes graphics/battle_anims/sprites/new/cacoon.png | Bin 0 -> 10874 bytes .../battle_anims/sprites/new/chain_link.png | Bin 0 -> 249 bytes graphics/battle_anims/sprites/new/chop.png | Bin 0 -> 222 bytes graphics/battle_anims/sprites/new/confide.png | Bin 0 -> 633 bytes .../sprites/new/crafty_shield.png | Bin 0 -> 170 bytes .../battle_anims/sprites/new/curse_nail.png | Bin 0 -> 368 bytes .../battle_anims/sprites/new/draco_meteor.pal | 19 + .../sprites/new/dragon_pulse_ring.png | Bin 0 -> 223 bytes .../sprites/new/dreepy_missile.png | Bin 0 -> 281 bytes graphics/battle_anims/sprites/new/drill.png | Bin 0 -> 1151 bytes graphics/battle_anims/sprites/new/embers.png | Bin 0 -> 1334 bytes .../battle_anims/sprites/new/energy_ball.png | Bin 0 -> 409 bytes .../sprites/new/fairy_lock_chains.png | Bin 0 -> 227 bytes graphics/battle_anims/sprites/new/fishies.png | Bin 0 -> 265 bytes .../sprites/new/flash_cannon_ball.png | Bin 0 -> 257 bytes graphics/battle_anims/sprites/new/fly.png | Bin 0 -> 1172 bytes .../battle_anims/sprites/new/fusion_flare.pal | 19 + .../sprites/new/garbage_poison_column.pal | 19 + graphics/battle_anims/sprites/new/gear.png | Bin 0 -> 271 bytes .../sprites/new/gigavolt_havoc_spear.png | Bin 0 -> 413 bytes .../battle_anims/sprites/new/golden_apple.png | Bin 0 -> 302 bytes .../battle_anims/sprites/new/green_drake.pal | 19 + .../battle_anims/sprites/new/green_star.png | Bin 0 -> 258 bytes .../battle_anims/sprites/new/heart_stamp.png | Bin 0 -> 327 bytes graphics/battle_anims/sprites/new/hexes.png | Bin 0 -> 442 bytes .../battle_anims/sprites/new/hoopa_hand.png | Bin 0 -> 211 bytes .../battle_anims/sprites/new/hoopa_ring.png | Bin 0 -> 480 bytes graphics/battle_anims/sprites/new/horn.png | Bin 0 -> 1010 bytes .../battle_anims/sprites/new/horn_leech.png | Bin 0 -> 368 bytes .../sprites/new/horseshoe_fist.png | Bin 0 -> 5104 bytes .../battle_anims/sprites/new/hydro_pump.png | Bin 0 -> 244 bytes .../battle_anims/sprites/new/ice_rock.png | Bin 0 -> 1287 bytes graphics/battle_anims/sprites/new/impact.pal | 19 + .../battle_anims/sprites/new/large_spike.png | Bin 0 -> 734 bytes graphics/battle_anims/sprites/new/leaves.png | Bin 0 -> 503 bytes .../battle_anims/sprites/new/leech_seed.png | Bin 0 -> 280 bytes .../sprites/new/lightning_rain.png | Bin 0 -> 356 bytes .../battle_anims/sprites/new/mean_look.png | Bin 0 -> 1144 bytes .../battle_anims/sprites/new/metal_bits.png | Bin 0 -> 154 bytes .../battle_anims/sprites/new/mud_bomb.png | Bin 0 -> 525 bytes .../battle_anims/sprites/new/mushroom.png | Bin 0 -> 661 bytes .../sprites/new/natural_gift_ring.pal | 19 + .../sprites/new/necrozma_star.png | Bin 0 -> 191 bytes .../battle_anims/sprites/new/obstruct.png | Bin 0 -> 252 bytes .../battle_anims/sprites/new/omega_stone.png | Bin 0 -> 917 bytes .../battle_anims/sprites/new/pink_diamond.png | Bin 0 -> 170 bytes .../sprites/new/poison_column.png | Bin 0 -> 904 bytes .../battle_anims/sprites/new/poison_jab.png | Bin 0 -> 194 bytes .../battle_anims/sprites/new/power_gem.png | Bin 0 -> 179 bytes .../battle_anims/sprites/new/power_trick.png | Bin 0 -> 540 bytes .../battle_anims/sprites/new/punishment.png | Bin 0 -> 470 bytes .../battle_anims/sprites/new/purple_drake.png | Bin 0 -> 643 bytes .../battle_anims/sprites/new/quick_guard.png | Bin 0 -> 205 bytes .../battle_anims/sprites/new/razor_shell.png | Bin 0 -> 313 bytes .../battle_anims/sprites/new/rock_small.png | Bin 0 -> 237 bytes graphics/battle_anims/sprites/new/rocks.png | Bin 0 -> 1361 bytes .../battle_anims/sprites/new/shell_left.png | Bin 0 -> 381 bytes .../battle_anims/sprites/new/shell_right.png | Bin 0 -> 380 bytes .../sprites/new/spacial_rend_slices.pal | 19 + graphics/battle_anims/sprites/new/spikes.png | Bin 0 -> 175 bytes .../sprites/new/spirit_shackle_arrow.png | Bin 0 -> 236 bytes .../battle_anims/sprites/new/stealth_rock.png | Bin 0 -> 395 bytes .../sprites/new/steam_eruption.png | Bin 0 -> 222 bytes .../battle_anims/sprites/new/steamroller.png | Bin 0 -> 838 bytes .../battle_anims/sprites/new/stone_edge.png | Bin 0 -> 326 bytes .../battle_anims/sprites/new/stone_pillar.png | Bin 0 -> 1317 bytes .../sprites/new/straight_beam.png | Bin 0 -> 152 bytes .../sprites/new/substitute_back.png | Bin 0 -> 488 bytes .../sprites/new/substitute_front.png | Bin 0 -> 420 bytes .../battle_anims/sprites/new/surf_new.pal | 19 + graphics/battle_anims/sprites/new/sword.png | Bin 0 -> 272 bytes graphics/battle_anims/sprites/new/teeth.png | Bin 0 -> 465 bytes graphics/battle_anims/sprites/new/thrash.png | Bin 0 -> 440 bytes graphics/battle_anims/sprites/new/tornado.png | Bin 0 -> 1608 bytes .../battle_anims/sprites/new/water_gun.png | Bin 0 -> 214 bytes graphics/battle_anims/sprites/new/wood.png | Bin 0 -> 881 bytes .../sprites/new/z_move_symbol.png | Bin 0 -> 381 bytes include/constants/battle_anim.h | 109 +++++ include/constants/battle_config.h | 17 + include/graphics.h | 280 +++++++++++ src/battle_anim.c | 292 ++++++++++- src/graphics.c | 456 +++++++++++++++++- 223 files changed, 2530 insertions(+), 4 deletions(-) create mode 100644 graphics/battle_anims/backgrounds/new/aeroblast.pal create mode 100644 graphics/battle_anims/backgrounds/new/aeroblast_map.bin create mode 100644 graphics/battle_anims/backgrounds/new/aeroblast_tiles.png create mode 100644 graphics/battle_anims/backgrounds/new/aura_sphere.pal create mode 100644 graphics/battle_anims/backgrounds/new/blackhole_eclipse.bin create mode 100644 graphics/battle_anims/backgrounds/new/blackhole_eclipse.png create mode 100644 graphics/battle_anims/backgrounds/new/bloom_doom.bin create mode 100644 graphics/battle_anims/backgrounds/new/bloom_doom.pal create mode 100644 graphics/battle_anims/backgrounds/new/bloom_doom.png create mode 100644 graphics/battle_anims/backgrounds/new/bolt_strike.bin create mode 100644 graphics/battle_anims/backgrounds/new/bolt_strike.pal create mode 100644 graphics/battle_anims/backgrounds/new/bolt_strike.png create mode 100644 graphics/battle_anims/backgrounds/new/clangorous_soulblaze.bin create mode 100644 graphics/battle_anims/backgrounds/new/clangorous_soulblaze.pal create mode 100644 graphics/battle_anims/backgrounds/new/clangorous_soulblaze.png create mode 100644 graphics/battle_anims/backgrounds/new/dark_void.bin create mode 100644 graphics/battle_anims/backgrounds/new/dark_void.pal create mode 100644 graphics/battle_anims/backgrounds/new/dark_void.png create mode 100644 graphics/battle_anims/backgrounds/new/dynamax_cannon.pal create mode 100644 graphics/battle_anims/backgrounds/new/electric_terrain.bin create mode 100644 graphics/battle_anims/backgrounds/new/electric_terrain.pal create mode 100644 graphics/battle_anims/backgrounds/new/electric_terrain.png create mode 100644 graphics/battle_anims/backgrounds/new/fire1.bin create mode 100644 graphics/battle_anims/backgrounds/new/fire1.pal create mode 100644 graphics/battle_anims/backgrounds/new/fire1.png create mode 100644 graphics/battle_anims/backgrounds/new/fire2.pal create mode 100644 graphics/battle_anims/backgrounds/new/focus_blast.bin create mode 100644 graphics/battle_anims/backgrounds/new/focus_blast.pal create mode 100644 graphics/battle_anims/backgrounds/new/focus_blast.png create mode 100644 graphics/battle_anims/backgrounds/new/garbage_falls.pal create mode 100644 graphics/battle_anims/backgrounds/new/giga_impact_opponent.bin create mode 100644 graphics/battle_anims/backgrounds/new/giga_impact_opponent.pal create mode 100644 graphics/battle_anims/backgrounds/new/giga_impact_opponent.png create mode 100644 graphics/battle_anims/backgrounds/new/giga_impact_player.bin create mode 100644 graphics/battle_anims/backgrounds/new/giga_impact_player.pal create mode 100644 graphics/battle_anims/backgrounds/new/giga_impact_player.png create mode 100644 graphics/battle_anims/backgrounds/new/grassy_terrain.bin create mode 100644 graphics/battle_anims/backgrounds/new/grassy_terrain.pal create mode 100644 graphics/battle_anims/backgrounds/new/grassy_terrain.png create mode 100644 graphics/battle_anims/backgrounds/new/gunk_shot.pal create mode 100644 graphics/battle_anims/backgrounds/new/high_speed.bin create mode 100644 graphics/battle_anims/backgrounds/new/high_speed.pal create mode 100644 graphics/battle_anims/backgrounds/new/high_speed.png create mode 100644 graphics/battle_anims/backgrounds/new/hydro_cannon.bin create mode 100644 graphics/battle_anims/backgrounds/new/hydro_cannon.pal create mode 100644 graphics/battle_anims/backgrounds/new/hydro_cannon.png create mode 100644 graphics/battle_anims/backgrounds/new/hydro_pump.bin create mode 100644 graphics/battle_anims/backgrounds/new/hydro_pump.pal create mode 100644 graphics/battle_anims/backgrounds/new/hydro_pump.png create mode 100644 graphics/battle_anims/backgrounds/new/hyper_beam.pal create mode 100644 graphics/battle_anims/backgrounds/new/hyperspace_fury.pal create mode 100644 graphics/battle_anims/backgrounds/new/inferno_overdrive.bin create mode 100644 graphics/battle_anims/backgrounds/new/inferno_overdrive.pal create mode 100644 graphics/battle_anims/backgrounds/new/inferno_overdrive.png create mode 100644 graphics/battle_anims/backgrounds/new/leaf_storm.bin create mode 100644 graphics/battle_anims/backgrounds/new/leaf_storm.pal create mode 100644 graphics/battle_anims/backgrounds/new/leaf_storm.png create mode 100644 graphics/battle_anims/backgrounds/new/magic_room.pal create mode 100644 graphics/battle_anims/backgrounds/new/malicious_moonsault.bin create mode 100644 graphics/battle_anims/backgrounds/new/malicious_moonsault.pal create mode 100644 graphics/battle_anims/backgrounds/new/malicious_moonsault.png create mode 100644 graphics/battle_anims/backgrounds/new/max_lightning.bin create mode 100644 graphics/battle_anims/backgrounds/new/max_lightning.pal create mode 100644 graphics/battle_anims/backgrounds/new/max_lightning.png create mode 100644 graphics/battle_anims/backgrounds/new/misty_terrain.bin create mode 100644 graphics/battle_anims/backgrounds/new/misty_terrain.pal create mode 100644 graphics/battle_anims/backgrounds/new/misty_terrain.png create mode 100644 graphics/battle_anims/backgrounds/new/neverending_nightmare.bin create mode 100644 graphics/battle_anims/backgrounds/new/neverending_nightmare.pal create mode 100644 graphics/battle_anims/backgrounds/new/neverending_nightmare.png create mode 100644 graphics/battle_anims/backgrounds/new/nightmare.bin create mode 100644 graphics/battle_anims/backgrounds/new/nightmare.pal create mode 100644 graphics/battle_anims/backgrounds/new/nightmare.png create mode 100644 graphics/battle_anims/backgrounds/new/poison_falls.pal create mode 100644 graphics/battle_anims/backgrounds/new/psychic.pal create mode 100644 graphics/battle_anims/backgrounds/new/psychic_terrain.bin create mode 100644 graphics/battle_anims/backgrounds/new/psychic_terrain.pal create mode 100644 graphics/battle_anims/backgrounds/new/psychic_terrain.png create mode 100644 graphics/battle_anims/backgrounds/new/rock_wrecker.bin create mode 100644 graphics/battle_anims/backgrounds/new/rock_wrecker.pal create mode 100644 graphics/battle_anims/backgrounds/new/rock_wrecker.png create mode 100644 graphics/battle_anims/backgrounds/new/shattered_psyche.bin create mode 100644 graphics/battle_anims/backgrounds/new/shattered_psyche.pal create mode 100644 graphics/battle_anims/backgrounds/new/shattered_psyche.png create mode 100644 graphics/battle_anims/backgrounds/new/sky_afternoon.pal create mode 100644 graphics/battle_anims/backgrounds/new/sky_day.bin create mode 100644 graphics/battle_anims/backgrounds/new/sky_day.pal create mode 100644 graphics/battle_anims/backgrounds/new/sky_day.png create mode 100644 graphics/battle_anims/backgrounds/new/sky_night.pal create mode 100644 graphics/battle_anims/backgrounds/new/sludge_wave.pal create mode 100644 graphics/battle_anims/backgrounds/new/snuggle_forever.bin create mode 100644 graphics/battle_anims/backgrounds/new/snuggle_forever.pal create mode 100644 graphics/battle_anims/backgrounds/new/snuggle_forever.png create mode 100644 graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.bin create mode 100644 graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.pal create mode 100644 graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.png create mode 100644 graphics/battle_anims/backgrounds/new/spacial_rend_opponent.bin create mode 100644 graphics/battle_anims/backgrounds/new/spacial_rend_opponent.pal create mode 100644 graphics/battle_anims/backgrounds/new/spacial_rend_opponent.png create mode 100644 graphics/battle_anims/backgrounds/new/spacial_rend_player.bin create mode 100644 graphics/battle_anims/backgrounds/new/spacial_rend_player.pal create mode 100644 graphics/battle_anims/backgrounds/new/spacial_rend_player.png create mode 100644 graphics/battle_anims/backgrounds/new/tectonic_rage.bin create mode 100644 graphics/battle_anims/backgrounds/new/tectonic_rage.pal create mode 100644 graphics/battle_anims/backgrounds/new/trick_room.bin create mode 100644 graphics/battle_anims/backgrounds/new/trick_room.pal create mode 100644 graphics/battle_anims/backgrounds/new/trick_room.png create mode 100644 graphics/battle_anims/backgrounds/new/twinkle_tackle.bin create mode 100644 graphics/battle_anims/backgrounds/new/twinkle_tackle.pal create mode 100644 graphics/battle_anims/backgrounds/new/twinkle_tackle.png create mode 100644 graphics/battle_anims/backgrounds/new/water_pulse.bin create mode 100644 graphics/battle_anims/backgrounds/new/water_pulse.pal create mode 100644 graphics/battle_anims/backgrounds/new/water_pulse.png create mode 100644 graphics/battle_anims/backgrounds/new/waterfall.bin create mode 100644 graphics/battle_anims/backgrounds/new/waterfall.pal create mode 100644 graphics/battle_anims/backgrounds/new/waterfall.png create mode 100644 graphics/battle_anims/backgrounds/new/wonder_room.pal create mode 100644 graphics/battle_anims/backgrounds/new/zmove_activate.bin create mode 100644 graphics/battle_anims/backgrounds/new/zmove_activate.pal create mode 100644 graphics/battle_anims/backgrounds/new/zmove_activate.png create mode 100644 graphics/battle_anims/backgrounds/new/zmove_mountain.bin create mode 100644 graphics/battle_anims/backgrounds/new/zmove_mountain.pal create mode 100644 graphics/battle_anims/backgrounds/new/zmove_mountain.png create mode 100644 graphics/battle_anims/sprites/new/ability_pop_up.png create mode 100644 graphics/battle_anims/sprites/new/acupressure_finger.png create mode 100644 graphics/battle_anims/sprites/new/alpha_stone.png create mode 100644 graphics/battle_anims/sprites/new/anchor.png create mode 100644 graphics/battle_anims/sprites/new/apple.png create mode 100644 graphics/battle_anims/sprites/new/arrows.png create mode 100644 graphics/battle_anims/sprites/new/assurance_hand.png create mode 100644 graphics/battle_anims/sprites/new/aura_sphere.png create mode 100644 graphics/battle_anims/sprites/new/avalanche_rocks.pal create mode 100644 graphics/battle_anims/sprites/new/baton_pass_ball.png create mode 100644 graphics/battle_anims/sprites/new/bee.png create mode 100644 graphics/battle_anims/sprites/new/berry_eaten.png create mode 100644 graphics/battle_anims/sprites/new/berry_normal.png create mode 100644 graphics/battle_anims/sprites/new/big_rock.png create mode 100644 graphics/battle_anims/sprites/new/blacephalon_head.png create mode 100644 graphics/battle_anims/sprites/new/blue_flare.pal create mode 100644 graphics/battle_anims/sprites/new/branch.png create mode 100644 graphics/battle_anims/sprites/new/brine.png create mode 100644 graphics/battle_anims/sprites/new/cacoon.png create mode 100644 graphics/battle_anims/sprites/new/chain_link.png create mode 100644 graphics/battle_anims/sprites/new/chop.png create mode 100644 graphics/battle_anims/sprites/new/confide.png create mode 100644 graphics/battle_anims/sprites/new/crafty_shield.png create mode 100644 graphics/battle_anims/sprites/new/curse_nail.png create mode 100644 graphics/battle_anims/sprites/new/draco_meteor.pal create mode 100644 graphics/battle_anims/sprites/new/dragon_pulse_ring.png create mode 100644 graphics/battle_anims/sprites/new/dreepy_missile.png create mode 100644 graphics/battle_anims/sprites/new/drill.png create mode 100644 graphics/battle_anims/sprites/new/embers.png create mode 100644 graphics/battle_anims/sprites/new/energy_ball.png create mode 100644 graphics/battle_anims/sprites/new/fairy_lock_chains.png create mode 100644 graphics/battle_anims/sprites/new/fishies.png create mode 100644 graphics/battle_anims/sprites/new/flash_cannon_ball.png create mode 100644 graphics/battle_anims/sprites/new/fly.png create mode 100644 graphics/battle_anims/sprites/new/fusion_flare.pal create mode 100644 graphics/battle_anims/sprites/new/garbage_poison_column.pal create mode 100644 graphics/battle_anims/sprites/new/gear.png create mode 100644 graphics/battle_anims/sprites/new/gigavolt_havoc_spear.png create mode 100644 graphics/battle_anims/sprites/new/golden_apple.png create mode 100644 graphics/battle_anims/sprites/new/green_drake.pal create mode 100644 graphics/battle_anims/sprites/new/green_star.png create mode 100644 graphics/battle_anims/sprites/new/heart_stamp.png create mode 100644 graphics/battle_anims/sprites/new/hexes.png create mode 100644 graphics/battle_anims/sprites/new/hoopa_hand.png create mode 100644 graphics/battle_anims/sprites/new/hoopa_ring.png create mode 100644 graphics/battle_anims/sprites/new/horn.png create mode 100644 graphics/battle_anims/sprites/new/horn_leech.png create mode 100644 graphics/battle_anims/sprites/new/horseshoe_fist.png create mode 100644 graphics/battle_anims/sprites/new/hydro_pump.png create mode 100644 graphics/battle_anims/sprites/new/ice_rock.png create mode 100644 graphics/battle_anims/sprites/new/impact.pal create mode 100644 graphics/battle_anims/sprites/new/large_spike.png create mode 100644 graphics/battle_anims/sprites/new/leaves.png create mode 100644 graphics/battle_anims/sprites/new/leech_seed.png create mode 100644 graphics/battle_anims/sprites/new/lightning_rain.png create mode 100644 graphics/battle_anims/sprites/new/mean_look.png create mode 100644 graphics/battle_anims/sprites/new/metal_bits.png create mode 100644 graphics/battle_anims/sprites/new/mud_bomb.png create mode 100644 graphics/battle_anims/sprites/new/mushroom.png create mode 100644 graphics/battle_anims/sprites/new/natural_gift_ring.pal create mode 100644 graphics/battle_anims/sprites/new/necrozma_star.png create mode 100644 graphics/battle_anims/sprites/new/obstruct.png create mode 100644 graphics/battle_anims/sprites/new/omega_stone.png create mode 100644 graphics/battle_anims/sprites/new/pink_diamond.png create mode 100644 graphics/battle_anims/sprites/new/poison_column.png create mode 100644 graphics/battle_anims/sprites/new/poison_jab.png create mode 100644 graphics/battle_anims/sprites/new/power_gem.png create mode 100644 graphics/battle_anims/sprites/new/power_trick.png create mode 100644 graphics/battle_anims/sprites/new/punishment.png create mode 100644 graphics/battle_anims/sprites/new/purple_drake.png create mode 100644 graphics/battle_anims/sprites/new/quick_guard.png create mode 100644 graphics/battle_anims/sprites/new/razor_shell.png create mode 100644 graphics/battle_anims/sprites/new/rock_small.png create mode 100644 graphics/battle_anims/sprites/new/rocks.png create mode 100644 graphics/battle_anims/sprites/new/shell_left.png create mode 100644 graphics/battle_anims/sprites/new/shell_right.png create mode 100644 graphics/battle_anims/sprites/new/spacial_rend_slices.pal create mode 100644 graphics/battle_anims/sprites/new/spikes.png create mode 100644 graphics/battle_anims/sprites/new/spirit_shackle_arrow.png create mode 100644 graphics/battle_anims/sprites/new/stealth_rock.png create mode 100644 graphics/battle_anims/sprites/new/steam_eruption.png create mode 100644 graphics/battle_anims/sprites/new/steamroller.png create mode 100644 graphics/battle_anims/sprites/new/stone_edge.png create mode 100644 graphics/battle_anims/sprites/new/stone_pillar.png create mode 100644 graphics/battle_anims/sprites/new/straight_beam.png create mode 100644 graphics/battle_anims/sprites/new/substitute_back.png create mode 100644 graphics/battle_anims/sprites/new/substitute_front.png create mode 100644 graphics/battle_anims/sprites/new/surf_new.pal create mode 100644 graphics/battle_anims/sprites/new/sword.png create mode 100644 graphics/battle_anims/sprites/new/teeth.png create mode 100644 graphics/battle_anims/sprites/new/thrash.png create mode 100644 graphics/battle_anims/sprites/new/tornado.png create mode 100644 graphics/battle_anims/sprites/new/water_gun.png create mode 100644 graphics/battle_anims/sprites/new/wood.png create mode 100644 graphics/battle_anims/sprites/new/z_move_symbol.png 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 0000000000000000000000000000000000000000..a7275a0747da421e5290f61115deb0f4fbc84aa9 GIT binary patch literal 804 zcmWN~iJy#h9KiAK@7aeP*73})#X3LVF_>jt>prIES(cnxM9CdRheWw;GppQG?xW=B zK(0uoShF2+)RwC|Ay;yio3`Z-c)#9GG)^3YB_<9VDMC@=@gc=1P68#6l9Zw}4xV3< z6G@^Bl1y33Q65PlC9MJ#@l~QSj$4JQ7N7*gttJGiP7P`bAyTPD?WpvKCyhGP73xu+ z2BZrOX+&e1_-INq+~&0K(UMk@9p(YS#Uq2(LK`w^OS{Q3|3TW*A!<4bo#;##9)hk! zvgk&4=pnfe)01BCh~z&?ZypQKM-KL-pM?9v0ErA_5RXTt(_n`11W$$-N^F=EJjK&d zDR_ow8P0RU2%cvoqe8r3{4dJH(PVmQSvg}EOJ>N7V>}a>IMDS^BHM&tA|kHXM9Ec3Uq=8^qnnri_TanGe`v3bx{W z$TlnCBR)nxVLPAFE|~dQUTgxxznI>|d_pU9ZSDzNs;+`h1PtX!tQl*rZR!99RiJGKkG+FbU=1#b*mecYoDOy1*Y9-C6 z?73C6s@idur;-uSY8q6jt~Io#hE!6ume$rZb?RtcG4-^*N&`*ThT2G_u{P1BdJk%x B*LVN` literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..33af8f482693e86db21f70875683c7c73e253f19 GIT binary patch literal 2902 zcmV-c3#s&pP)q%#j7N`3&F^6aC_?Aw-IHkNU>DY;iyIy-GkV0E74$0CEM$8E~V%k!5EG1;B3v zxE=@t2BY~o7yxU@00sCddw%HqE?~34AHUrK$PM691AeU4wg6shK;Hr`3}7h%e+#w& zUb%pOU<{Y59IXJryDWPcmR$IPKR%5GAfCLSB;*)JG$70Vb>MFUJQX2OfO7#@S->M7 z0O~6U!!V+hnHTG&^3mTo3HfRKhm)oO>KpYgt{?WDXJ7&F69WkUDgfF5y?#(wT`)uc zv~2+U09XM){j=HM3K&R2?~nm?3s45skMyrrt}mEya##lFkW?=%BJ}^a1Yont3D9+Z zztfK3X?7%GG)6=T5Ksin@+cxR>ru07<1iu{+C_l+S`Il)EE=pER_*&NYk_Fg!XrfX zIuV(|09ZeG0)=;pf?M0dUDSLO97d~$t5J#6KO6wo+{zko$_DHMplz0y0T%|aWWYO? zJ$ukmL8|!zaAN?IOoU)%J-AOE)OkI>9|6Cb7*h8Wl@E3IV~q^ZSvir*5%7xzoL2(A zBLe^+?I*y;N`Q#rvGAbduJ=7i2#ZcOfT2;o5si92(95XRUUE58LjcWb%_dZR7C_DF zHPwU!KzyR8D{auquLPWN!noNZzz-r4K9&C{5v5ai+a&?0S2LjAiJEMJuA2l+INSd*2tP1MN{oLe8em%o$bL$?s8i>$ z!bPEAl17*$)#XcoM`QrDE_ zfC-@}yoL=U`%nUK>!`B_vUCG0v=Qau5COLG|4AXhq#Zg2SQ8)!3FM*fS&_Ws=}yyu zva8kMf<eA>C`ZP#-ReydkQ=~r>g#nH zD+mY}z}?CPTnWG#jkbmiZ4ed!YIoSDZgs&1EHODx$%B0?56rc7p$xc`05#ga7l1Yy zAON551UwP|%0a+@Dz%Ri6pGSn9bZrl*N@(zgcMLCHN6}G{UTsu0r1>FOH)P=p-WoT z^#wMW&`L=tDy|TiBLY%T9u#4ot`!NOZV@N~kT9$xXhM2m zRRiu@zzJt03sAaQO1a4+uaQNXnkU=;RA-SKSz-vU||5P~=N zM0t!g;MHJQ1S|yL&~|bJ?3Dp-5LFhR)9*K+-$;Ni)FT6!RRMC^PoI(1ywl;nV>h-I zq=GTxM&tr~1L)Xfa8UNKP_-qu0cdB^HX93LLIZ-K0jUePaa^!ln<5}EfSIbbYJgu2 zs1*Q{834ZAVu9V7Sb+aK0W}LCR@VZO5s$q41q*x&Xchpke=necfEfec?&Lx>VCDc|a7qgrMF2)|PXH26Z>|jB z;tv6?`v!1s01I20cL3}K*!56?^zhJ@=x&8)!jsTP#Gb0hnOgjV*0R{<<$o0L^)|pF zHGp0Lkd^>X=_1InV6Obf(?jpj0w$G!XN9!&N&IrJJxG%zXUx`Yd&9|@YM+cR9^IyLcq=4faa}$yk7=jMV;L@ zL0~{w32-FHfcHwr4^0qSREt%B<&Xi-%vlF--_vi|YQBHsqV6JKHbDR@=vn3f7AYV1 z!fpXTqh0~DAmDyftvYof!jiw!*x|CWrwj-13dCSfOjc1--U#BExMc^X1*{CrzB|dz9e~p7Lkozy z{dPxuVu+7NV#n#6$+iJSduq28+R=8@ZI=Q6wd4JTtQe@dW08@jI?zV#b_wu-0rA|a zdfmCw$2G@^ND-nU;MxYk7A>`Njsj(+sjDuET)MU5SFX6Qlf$2ne}_p zgKUu$0P8o!MCVsJR~|>e@4`){TCF|EW(M$u0H21KXj8HIWi>$Mehwkf7cDl5YnV{F z%3w zIZ<=t-2oA-AL*f#p#cCG_M;sExE>wI7TSP?zCiEyqWVsNI{noHIAB7kiuUAi7eLrG z?}xS80qDHLetQ?dUT0w5uL1LnJs9@d;hlj019K0E-Dw%3Gynhq07*qoM6N<$f^i)c AJpcdz literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..27457c9a1651b819f7523b850c7d82f049f802ba GIT binary patch literal 892 zcmWN}2SZf_0EXf3z;&;S6I{HXsGx#^8xhaNjkr*8<6gMUw9*PlOKsC$8coxtrA;kt z+1B<{+tZN^OI!B*fG1iOF9pOAPXtw?IyIzTLQ|TN zh>~bd3tFO9v?dvlX+sKaQ9Ig`N*a+4bfi;Nn2s{&Ocydy7G3E^chrNP^rAP)rVlyv zC7Me=<%YzFwO zlu|}e&PA+ay$%K!a|s*Rs2$2-6PI!sx|}PxlB>|wRB#Q~qU*Sx8@Q3!O$u-37H&ni zv6(I0jw-o>JGqPK-Q1%S_p%k;$2PWeKZy_UpmL+ZLp&@VVF!=$80=KIi^q9FJjqi$ z%`;**dw7=T(x?iu_A1=U^Wp_w)td7JuEAI4vM7lHFS?=OYXSu7~ z&E4I@J>_2R?QHi+agMV4I#*#rp^`KDIdsfPdG1e`86T!a3nBwN(1TPo*c#%Y&i62@ zz{5SlBb_+PqqQNSqR?aHu^#6lkFP2VGxH~Sq9<9CJ;hU9Y)$iY&+trZmS=m8=Q=iz X^7&ri5^JFsd9jx`vee7GoPB2iycXQs literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..3cfd58625e7e2c9e65999d0d1a159306212651a5 GIT binary patch literal 4122 zcmV+#5asWQP)005W-0{{R3k;wnv0000mP)t-s0RI60 zK>+_L0RIpG{|Er?007kh0IUE2ivR#~003eD07?J=IRF4D000;O00;m8T>fqv000lA zNkly_F_7Jw^-b_T%N1e)#$04FdlCV@pv1PE^eNF4!^_x~8t^M3}(8-S4} zfHm|cFwhYU?0r_1)X=l`);WIR=BrzEZ{1gwF)(g$bbEI}7|tdSLmGo&zu(o->&tL| zyBo>~rt@{Rmr;E(3Vhe?123|`zT@?~0=f0r${UTRk43G(-O2*Hz5DSrvcLg;y@Q`S zp>7%P3wSpS!g*FY;6{NUAn@i2v^)=Zfj7JZ0lgLbz+MnW^LQaZTrlxqrrvcP>|hur zPQd+cYk_|o122vlIKZ#pG=R6hc81;#Mvvv*0V@S|;eUW965`i8O`xxCUqArXmw+f> zvb4ai1b${IMVVp);+0iVY;ssN0%L|IS^lnvrxADeq3k;o~PN91*)FP zg7-CdgN#1-0l(YgS>XHmx-3w{wF0f;X%FErr%fR9IxU_Bj=bh)1sBiiI^|>)WovvRgUsCH?SEZ%wYVX!hs@|3MAsj z0TG!Ba1zj0oy9Z+?3%W*(*yv8!<|3b2`Zjo10Dn%2bvAIk+cTT6e$a$rSA8IujxSPW z$F|y$g&DFy3)HyzKwF0a3jat-Su**gvU-gJAb#utt$^hIA{23i3268*n#S2BVAU8H z+iU#Hpi-@Xf1@lhO_#XnF@)yj46>$=Rb`J10qYj6!kN}3{f&UuX6~mExzg2Q_HaK< z@?r(%Hh;1zthS`)YWE6=_QXKzp)v5P-A*NAf&<2z!A8rI>u!@vgz&wLCgXWlRA0ao z&7Uj~QX6ufW9DHFO4+P@|D6D>!Qx_4T;~?O`XdP~EX)2-d#l*}AkO`u%u-)t81Ayh>%k zbmB0qbKVIbwt!+Y_i%gwh?tiX{&qf}iAZ+17lSR^<_f~E$dGxXL7iF|{m8j9*aF(F zoA9=4Yd?su(1q>ElL6;@P6e z<|vCulagN70cp+6Lr>Y#iZs41w_M4n=Ge>W@Jjb6o?% znql{MP4PggPxyuSaZM}c3WJR+2prNc4~&LhcAYH&A={dv3?J5w=&TZev@rdAtfdc)&t|DY?uEYKB@g zoF5PntM?LAat(O&fomU#dU&9A5LJ`{1n-L}kf-1`fu#a7(!+zedFgTyFhUjYkAEp) z)dE^CI->Rm{nfOSK|QKnznG(J65ak9cZMgvG#O~@G7vVU4Sa_{^wMtvAq2EYlE4$t zm9LaQ_c@LnuK>w1i=qV_NQDuMuK=s-KE1nxMo zCt$xl-T)TtKrR8r<6Q#=uI(fKxaR@UWKT-eRPQqIwkKM-3@jb6DWY}Cl!{F6s%eqd+=j)&6M3J{yoyfYgI) z*yONTV@VEs0qBYN2CyO91t7K?@bDB>y>9?{57iUB20C7s%j%$O^%M%wsY-xQNwDwz z1|Y~wj;|*|-S$wv6M#$?_^KJcJGmw_=bngt#(7^681y!~M1TcACahjvBirOOUDl7iX; zN>62^!1K#VfUj#f>_#h4r1-`W_yVw_ zz_S3ca;Yl69xf;k4kro>rj!IvR774e0Y@P^4dXH`0;b@TZ5xq**d)hR4KqW^);W3( zM9mDONZDxskNXO8^v^bX^MTY)!a|j@f9XnCr^aDuiqXg1bi_!fbL8aas)75>3QFIhJV9xP#Buy8#e>?W<4G{1*nYZEgAHz_zUBbSJ|=ch1)gtUcfv z1qI-*QS|Y%S}UiAOI!cr-3w%#Tvgd?%yERNK3a{g*#Qp-e0&lQfX0PYi`NK4Ck7u_ zAZ+1~T;*%v34a}S08G~60S*kLlvUfOR3*@w6*wBtb8!fj4?Ht)g}~YeZgR=ksly8? z893FY51f8jt5diD{A~eCZU74@0jNex)_A7SsWPyOz(mX2`U!W#S0Q&@l zQ{;epiThW;3V{E7_JDf5eTOT)0PI}_o)kEL@_|5<4*4Zumw?D}9&(WG}38Eecfml_IW>a2JZ-m#TNalfY%;x4-heIVX?{EUs0Y)xHJ zthkr#o&5z+oQlaT*fu)S7#qI-kQF`<7xL>o&ev)iyX}hamWQ5z68OB#=SG1eU&0;v zg#9MPPLke1;-#4j9~#|W1NmkOZwPY%YRm4hg@bMz-(U&RjB7$CAcV{7z$o#6CN{VBCfg#u#ubf(HF%xj?aD&f>f;&1=~UD_nY zR!&_T``AM+Mn-hkBfMKJ1l5F1r4qSd+!~-T%)$P}8OvUZo|DcD7QNzj5x!jLJD?Xk zTjK!nW0n1`DG;s1<^T+g7&si<8GDo%dP&4TsEPQWvl0RJ;%96c^tnX<{>bYcJzo+L zfJy%O#Rs0e+M;Xhv9n zt#hn@V*fb-ZTHauF)c-n8u?PlRT5pFVe;gTF1V05ThW7*Sf5Y`5>6QdpYc5Hws`7{ zR9il<1Hik11&*e+O|JsV;<1PMC%EMDnIe5rJs%H7)-{&GPkAY7>c2uhTaLL`RJOx#kA&;WvbFFBp|v zKkvU7^qzEUz`)y{4~!c?n0d)tDU?4}2|lW^KziK=X&4HKZ%QOVARzu`)tk_D(5_M- zq|^@hM8MO5!&+`IJ6Q0&B?IqWD}x{Cv3AR9Pqi)sOF4D`B(o+UsARJ;yn`enMByS{?I4~A|8d_#<4mJV9JaLNInz<#KMXCVGk zApVPh-UEs;zcitvT(I!~kRl7-U&0{G2vBbOxE;xAfHe<>-jfe(&5MY9RgT&%pT(Z3 z%-&19Flh@&#!Q=t5)Lep-vHt3H*z+aRR+h)vS#4Pq-l~;Ek04_m!`|b#JY<9oy#)$ znizo;%}}V*jyhX*%_qaYZMm>_l=xt9F;izoo||e76_JA#_B&80^jcL7`Y#oj=NY#T z6`0^{xM;}B)j9X4=U>Fbz(=-N(HT;0SAGKotK72LIw+!rZ@V#HojZWL+qy~BLy}*sAPk;m)YhUx*fCsv|*sy?*r9UuC zdps!P_W(t}W$U>vJ>mIoAio>1V@gl5z7x3N1!Ji=rHnqJd*%NVxa23g4mgvt=UaIH Y1wW%XhmwK4`Bm`1vpzPF!G*T#N8b^JuDR7M!XyW=^Q>gMZ(*6~8ep3;k z8O>=STGEQvv=MD-M|(PmAnA0Zljuwry3$Q_Cxae@y!51({`4m75Feored!lRe+Dp6 zW>Ap9O0rERLr@k&$z~Y#a7IK-4kOVhMl*)7SmVfLyh0PuL?$trDQGHDrZFAOU?#Je zjpi_ydCW%(SjZw4V=W<%rID;VgaqUJGr!c(5{9KE1|m%PHfrjj?j)i0;SyyHC|`1m{G i&kN^eeyT{1g+G(~#mV{VhE?{B@0D&wr054fozlNxSdwS} literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..de5553ec6e9346ea9ae5a681ded225265ce51990 GIT binary patch literal 1788 zcmV003A70{{R3fFR*&0000mP)t-s{{R4k z=KpHd|6%t>09r8sQWyY1001BW-t$YO000Ju zNklZy^`8i6vyu?WZz)n4G=C|12gudi&3#dZ{EP-1u`qP_3i}lq+euQQrMzR z1ENf`LHG%z?LFgF&N=t%NV>vgoimw?e0A^d{?DftA;5lVvWpg3<9ohQJ&8u3f}IDn z)(mVh;Kij`zGN?5H=hS=T^heyKd>sW}A*1bJN_Z4}4;Z*Zan999pv%`qnr?FFKgU3r~07a(>+JWc!BCJ;`ddE2!(uwmIF zaoDYU>~dyq>A)LsUcA079S~WXtlvUKaO9rghuj!5iz25*RSs2ijLFs(!ctnQ@~-*S%=zNLrK#-hl|r;-3PCK z=Z`k*lCyxvT-x8g8gBp*-6UkYCSY3uts2G451(uLMuw+|4Zuz*z$Z^|opmz>1KdklI3+^nF=m6FOpEKecT53c4)o>(H(0ii``=!cz zIby)EK$w2^6fpMtH6Xj9&3T&&@F~v@ zyI~awE#A||VY%OjlDO*ky_&!~2%QBM1WeOp_qh+of#f!w?7qgnrWOB9r@|Xx>`J^M z&r&4H0~{FpxBdP=PIjXkRWpZQjuH!eBp$j90|pX;RnzA{K&~s}V?8X5o7bacpW>*n z`Y02AWj1{kAkS|uy+Ev4UNL?V55$ec}gOTqzoQpVS6v! zb=ovYc~GuA?Lrs6)Efo-)y*q?I~vTtH37zEl)&!j*+5yYUiZ~B-lqoWyE@(J^oCYS zHv#gh|9iau`W;g(dQ`2AJUB^bHwIW1{bfGC^FM50ohs+cOh8n9xKXG5l-~&3Brzji z&1YdahyUh_k3d__!ax86bDrU7LL?#fC9*zVjRBCtfNTmlx^(29*J2AH8 zzX0wU325U0pMn4$#lE3fspritvT)UmbwtKqDiQ{K{KH|+DmW#1VK&TnrbW^-;TJ%OO~z*{E|P4l+V46^_krGqjX++Yoo zBkurpS!VsEu5XjWu)3 zYM>~hXs(U~f@eO|E$L38Hqbf=i?mW;U%%Z`*_;R!*EN9{O_lgCT)4_C`U6jj#v+gn z4?u0c1+#*^oqECltwU?C;p~`CpWX-dj3w|08 z*DXnDp5f4xNg!lHUqwP5`dFHwYRFQz;KxC-aNImTWs=tfEFdXwtH~H+9s~6#Lk2;N z?KRTMSL+2)EnkF;CoBr{#gd$m-!VRW4vcR96sgwP(I>)L`A1mYGM*5$fuYvxW|H;Ky zExX5y--$i_7M3}Dke>}*w2=~zpNh%UwhmnbUkzNRTW8ZxX@+-Y%Ns#Xq=)EU3xYr@ z;J2lT9t?7|Lz(W;RVkF&LnKJu!%_xnLR%BvMh`~RS3OLr9(BSqouXVP2C|%Nm(kMR zyTYx_pHr0zj1q>r8dG>FBI_yAs6L&*C!XP^!~jsjK-?;Ye;=EH@ay3$AZ2P1@h))x zRf4}B&I3+9RYUPpz@=_DwwNln`9^#%&arz;ttz7@3p|#hrsnloz-YcQ1Sk=z~KIsJH em0#@V0{;cQzwpM(e%f~c0000 z=t(bfMQ{4hmypOKpMG2<`ZIuwxkOw_0RtHXmqp6Nx z%;QNa#8W)Ye4Y`{@*L0eLbx*YA}_Ikh*-!X7PF*0uzV@Ys^XXPvUr78d5zb@m1QNY zU?p#eH+hSmGV9x9LP;f(uZtg zJ39#OWLKp6BR)pE`GimTjQl-CEB5j^Uo0A=FWJXed`-+Ze9Lzu%f3fHu%83`h<@TA zhxi%&!eNeZl;AOrN2*WoEBcL-oZ>V(!&%PpJ37xF{K;SFZ~oz5E};LYMh;j}j&_V= zEm6ZY9cRTm!L?l5s^hw@=b%;JiB56@tDzgYv6HPPZt7-kZnbbrw=!07s<2yIDNc2o z)2%kna9g*t+Pi~0I@9XpEO&MntE;;?+ua?=aS!)&FO?|Qz1_!st&oeU$UyoZb^P)004jl0{{R3eocQU0000mP)t-s00;>G z|Nq|h_PyrjoYmEX&CPSYy;`iSL7bd1i;Ez8dk|t`07^;#F);ujAOH{$U7Fwv000(n zNklwLlgcGWt{vfbu62l~rsRddo- z6CB%e=A8GBUgJ&bEKT z1&b+L^*Jz5#=vcum1f76aSGsQ@Uf)j3nqN1<=A#P0FI~hfmcp@&~u$nq+fAu%2K9w zI-$kRiL<*G<*iDs*&$$LJf&FtyvSrpF`ACuG8_BmwoJg$2ogrFNa{voJNXg6o5{&a zyHCFN<(zo;Vn4IfuuglIq*m_g-Il56;4Jjh8Tqw0+9kQKIecx2s zR;^8uvsn1+v;DMD)$5+upCD4>!^(K%Pz@qEskvmJ>S5%L3c^&@36%9c#xb%e#*6 zp*)D_Nv~Q(Eu%7xN$&@$Y?NfFU{);aI0&oRF*L)Ukc>^o^zy%3}!`Spa38z+WV>u?W;&~Rt-QUm(UW~%ywa0 z(l;vxm$B`+v~=WnEHG2mYt2(30QP#VqR8S#4NhyCRXwAZRY}R{W=>;TdKXKUR7Fi> z6WPMM>m{SSV^z3}Eo3^o*=m$!q|&B${xbBP-u1G^dkujzjM#U=SWyUsZ z!bX$6+{ zQO?OC%q7TclEjn^g=u1f>8f5dEXufFtm|HlX1;q!JII2{CuE0Ku8keP5EE)h=99Bc1nuoiT`8@CQ zZ7jBZIava}?z+!XqO2G~ClJsh0S)sZ$+NDm6L3wGVk{byWF~7VIIB@Ibq;)%k~UHL z=cy83R|dVavX(0x2u^3n1*Gg{?dioRyZ{(TCK6CwTLV?p#B{2lZ<<8{x`(Lq?aS#X z1p1l>uPwKW0)i=P!lm!cPw2XK+9Dj}IuVh&n?;97AT zwYIR?bSN#mNY_ z!d4TR;H1)|+PQjlWST`yj#KXEHAXi}O8(~(7dZg>7i5Q5$?Iu3ZIrCToSZm->Od4~ zFmu;!`d)f>W}3RbEg1pO+AkE~l~I|*i>}?jMCgI3@pN&^EN9oZjssxZJ)cakJU_ul zx>eJ(ej{dT4q3^nnra?i2@i@cix&XbX2|geYs?(yE6-E@F<1Ia#{^5rTVxe&W1UR$y;l?>uFH5@lxxR(Mec}H!L2Hap zoWZ?NgbGxuScs*Su0=(b*zqA0GvkHcM$6v*dfs--Mgue_tvyLARI1r@9*W!u#EL~> zbV-gI2WYT)qdWXT;5;&CG_*LaR#_HVK`%2++lbEBP4SJIX_yP(5(VvMNLh+=^j7Fw zP!ozErmHGn9HJ76&kidNHnyR2Nbv)lAef?p17mp-S{6U~F3%UUp z0bb5x!GXMJGvTR7C=MUyhBth?T|Kj`Dl>Hbhj~5_NxaplmP_iI<}rvD=t(S7 z(=$f%9J3W#X++}fU_jjfvUrh!BKu2*zf)|M@_C)A#z|2YR$e?x)cf6Q@_B1q0FZS8N=_JBcRYXSrRmVMf z_|q2b)^`7ZpV6ZJqJ7PKKF>F@4#2|6(XIlAP!bhAH|`8kQ|M^S*KR*1O5a&p8@qDXYrk#T>diy#5NIBq!U$ z5NN`CmP`S#I+(?HnKg<~%|RG)cLYwgL(<0T-vme74LnrZ30 zj_yll(rz#%efuc+$NBnizZAZ6U3mlN35$Q^@qj65%wKZ=#Kn{hfXcxhd*I*v&ASWW z_gu*0x7}6><0wYQeX@wWv}EF8s6>C*cFpa7=EVPHo2UN($aBusvpv;!QjO1du`uW2 z7ij=(;rMbkxKMvhH~gI$pZ+5t513x}^D0P?j)o|CZe?U#A4tW(31UfqL)J7i{8_rFX3bX?1yGw{rF#ALe7tw_PFEQB&J}1BRDCzWvU-Ei1 z2k!BDv?LQs+#EOzJVW@lQK5~&X#o8F&$xU1jWsXd@H?{%oym(HB+3P}n)iW`0qu=W zRs-NS$-m&2uReJY?2k?$ItRMG-^uf~hSn~n^-8VDyFv=LU}Kuvg$PMPz|}|phF16_ z`^)EHs4W9|W?8Bm3^lkGN;sZQ7CkDplpHAh^=Fr(7muW;lkdbX0X2t0dK4A}@hku!lN23skp$n~MGzed6JePsv@$$6H`*H$CK2Da|*6$Xg z`^xQlsKHd!=ar4R1cj^|>To=p-2?g(c4I!G0SrC*bDdfgXDNBvL$R%v(dU2`A z=RqMU1>LMw4}zI+yjWf2#_wEazKEXtL{u=elu`wBj0Ai4=#x)q z_m{LrlXX;}BcVoF=AE7t7K|9>5~vVSW;Z!-F)BsC@b}sy0WcM>*w$X5gt>V`BB0YK z(k3r5@ERY#M5=62rBI?)*ReZ%Y={J=ozWQs-z<*^lzWF4)s#}FxYywrQO1EsSqY7; z60Vu@6xkW3Gi&X$V?N8#lIc`z#<#BfVQ}0IXyd90GmsK#|8QZ5*qS7-Gd|=%%g0^2 z1JL9wNJ3%ipnM=Ig?gve9xl&tLWCbE(J2TW)Y0}< z$3KHYi*obYIZ7q#7`%kF<(ZJeL)Y_pRZ@)OizajzG|ODD0iOz1f+MTN859&d?4E2( zXp;b3nt~-69{(6+b^En|{^Ep%tZV+?Egv)*Pcf4yX`PGU>gl zo{HDnZo5CGyonL$#y=PB%}@R4TOWwQxb=vo4?0~sloVoqndQ@PRD^S9D%EVf-q>fE zy63hp2YpT&`X_Tf&Bb>#Sdo+h?As`^ou=2P7^w+SzUdYPH_FRK2Jv>3{izGz+;Kd& zry;#UIEw%n8P>hP}WcWlOPsggXgUx<7yn4bOdoKaJu@le>2)if=kqhH{~&Q1Nt_2}YZvhMWZzu9gq5SbT4&4 zY|AW^vI^2;6gfNqMhO^&0?8t!t%}9Zfjsx&?)hl+3^vT@$kDQ-vdr;40R=h&I5hNZ zKC8eo>$1pwB_@e7tONy0>1@HE13vB_7ytg?cr^YBB}2rLC~u0&?w{`gDcTVX-8a)- zq}$rh${3Pw?x?u6n*98sYL?S^RZBtT8}o-V`X^~98yVd9+MA#L-@AU)q9Z)x_=fUK zw?z&|+o;vDuG3s5vklqb)~DkPc&nVwX7mDX9MG!`oi~9m%0)S8wkMH0n&Itshi~v( zmT8s~@H1JJeXYm=P=$QD$@@i$)HirvKT&0AxBZ3h!L4?9Mgkk|6{rZKFN1s>sH9MJ z(Zm-_>j!}=Cn=F_wqFX9$iQs}`HD8TA!E5*Oy?90B`AhCVswy)e`zFp0t&CY9Uq9m ziA?T>FX@Gcu8V%4aymv89(HNhF?cC~PW-UweVvf16pL#drX_MpI!Ep*@Z(pc3$(>t zm$>`#w(A^~*=DVMJsKc=xt;#qa0y6lUb$E(rhTBMEnlR7=k7uIjt;(>Evwc# zu-lGvq+*nE&Y=w?7Oy|M8!m_rt=cRi1*D{nI8eapdA&sOX*UHU2!f7x@j-kSLb{kH zR541MqN4atd&uJeD-T{C5LVo(u5Fs8rlWl<%9Ms-tTr8Oq3{d^lkyTTIu}TEW#j3s zOU;<1!D&P>S#SH(#$C{IMJBJ$c$mNxB20}8-|X;;k2*F%$rr33?0dbh_Q(NtU()e^ z8Tu$|sw!m;+J2}81wS$yoMhveN<|)cjBQ!RJYoBPo&pG-f8;&*E$vKfK3~1U5{?cW zs2&|!us5_6seh0&rl~5rrWKV!!6INk>@TKMVJ={Q*g7(;M{oa0Sm_T?u^}h?qsVsu zavzBNTBz7nShUixa5cS7$cvz)B7ONh+V2GC4++}3nRa=Rg*_YZKDf725*eOhX0V$4 z__@>N?c;E%|CtK>NS^P%qpQ5~juJFrP<8LZqoM6j-fl0yG7=d)E3txAr(>6M0TOg> z?)7I8fgi|s{4RBL*FBsIbbGma3q5@HwsUWH=;}!hDWk@Dt7uF5%cBYbLx=TzhqcOP z32g`*Hl5cBX+4k56a%fFuX&!M)05eY;GGwEz;Jf=S^Qw}DvdwAa3WO$j!ebngkI1o z*vlreRb}o8d^2G>7XF95_oszapQ)Mp{3IrLTZ$im^HgG00Zb*!1tcR}6+EF*3*LR` z_k$D6zb5L7-Mf{~x0Rjw<{)j?_ItsRx=$>p5~&2iOcJqAiCH`&K87eL{)`=Mgg>_g)iJ~STr+aNyCe@#rz$XlG|zb)mo vYX0jj{>wg?ss6^E3ip9b*Nts<(3$){D=%%Nmb=pf00000NkvXXu0mjfT?c7a literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..20e82ac1a31f5ec7869575c8eb0bf723a99b1edf GIT binary patch literal 700 zcmcJN*;kBl9EZO@uQ4;EvSe3}5kgTiGRBy9WKXiM;gx;Qk}WdH5|J!fv+sNMCCg;V z8p0p)bL%F@ah(1F=ec>#bMv|RM2bU1Q4fRqh>Zr=abS1SkVaZ*B@q%vW5S8Rj1<*` zrZhvE6GaPJVztr%-Q75VJ`EK`7B@|i?A(b2}?ySL&?*X1irB4ednk6XSA2PtNX|ZC zKL}z#tGphr#Q_S7iXzH$9a`{LAb~zE^|e=$~CTYL%7K;%DFAv z;VxzI_k{aA;31EM$2_5er@}Ly^Ma6rN?xjhSG*S9P{mu`3Gey9M?MMFeC7*ZYk!vh g`9mGGb^6!-OZfF~#d6k|>RUM9`JrR93K=550f)Za#Q*>R literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..abaf8576d80bce931842fa1d4bcb6b39901039a8 GIT binary patch literal 1696 zcmV;R24DG!P)003A70{{R3fFR*&0000mP)t-s0095? zy)pKzDejyg-h&v;a|p#j0JJ#(tXe^wN->l{7>i0VdqE&#F(6VP5K0&ba4s8D000In zNkl{GLKlF^;E;G-pM?Fq(%qO>pM=}+zRWlR zd-ftY9Ki}_u->Y!{;BHe8E|RWvJHGxS6BaFr69)5aorR>h_jB3F8V8PFX=1{1bx&noF{8)3;3)g7xHbsR5@3f7S~M3umTV3)TMtC25VuScM*{Wfe;XC4#Ku zv24HDVtyv9{HW&m)B=)F=Vs0kD8fHkC>6 z0A9JXURjpKR}1!|Gt->Q^%P0lRMmb@-XUL=A{@w5Brr8*9BBn{2$4&#{C3&%BCnz{ zZ!sFn^K+rA?{5bYkyq{>92iav3q~nocHj3A_wf;f#lv}0RG|tJH&&s&qxKPlRaLJ2 zn8h)v>aDWSdq=*1{KPK;e6Fh3$D3heW5;1f zEC#FB;uH|Zx^-Pw^CVamx&~rDp9gSexVHw4fzJl4G)+n0Y(4}0KZ0UiI&glB^Pu&r z*BkR`<_hR?qoY54I;w&xex z55;~qGgA}Ng&rwmtSn%RI>NpVu&jL*j!pvS$g$xkK>Q7W(OUerydkhBZsD_q??f6u zrBnkGQQ&rwsp!r;3+s-=Ca`J-#f63^NHzRahW!EVHta$p6Z|}w4QTuF;9@Ix!uO-# zE`0ldpH4V9#=FA)@EOn@gDV2@uOdU%FK?}DMGW6=62W#Sq5&tSUydz40@-MpxARA~ z2j^ir+Q9UDSPWOUA2Rlf6h1ox@jK&UpArY?eoY|exY1M{*7Aad}T#Co=d`~O2yroHj}bW?%ns67-MxGD*> zb244tZ3D})_vTq7Sp~7%5S_m@A^+f{ASLVEjmlhkNGH?~`l=7X*9lHYicAbV- z7jQ9$;%LP%xgV|U5ALz`rTtTdSyKewnMpQJ#~QxCe##7hb)8vhvVr}X{fvg`g>LK%rNg$++;EU`~yL|VCdReYDKS*t11CL zza&77lZXla4H-UCFDlcmkgPuxOrMK>)$wN;)fQFtf~~akpW5@9r`_kQlR!w0=G`sN zdrobz6DoEeJpp_&jdJh46x=iQs4Dhx_ymv^2TYYn&3hQ)Zve-^c$^!{y!h`tXp=kw qmiOtrLX26QFeyy~O@o+ZoA(QzG#t$h`Uijj0000P#29(hYT|2R-S9deeu#^h5m_z(59}!3<$2!_aU>Fp^PdG-DXcI5eIKOk@(8%oL_F z4NYeTGns{EGl#j%L-Sd{LKdOLEMY0j2rOp>D_IrD@cQJ{tYIy|b%B@w>)C)dvWd-X zq3YH^t8Hv2Vh7sEE_SmA?PVYPIe-pwh{GH~M>)oEPN0*V;xuQ_St#dB$^Ipf`Avw|E=9!@Io4`{)BcMs-jiR)m_6itr*vGtZO@1M=^C>&-EQ_Kx{)da$^UZs9jSxb8`ng_)6>wZ>$5AZ+_vIcvIhkBSb+#@{FqpZ;$ zKhm)_x!GK_9XX`-qSFn04GIeA1^Ja@uEn zwo>kMfr@G!b>0_z(YoZzzT&IaHDC7)-?VP|w(t0^bd006)Q0{{R3aTRq$0000mP)t-s0001k zgM)i}dvkMhYHDg?Vq#KKQb9pMF)=X!0000000000000000000000000>A(T!000{d zNklBzMqy1kG@V5U84&UNd|U`m`u70$}21}xN$w$UEm45-Eua7F4Dl_ z%}U3h^CuAfBZwr=#hQfqeZuz=QVuE{M9hV|ED48$qAuTnVz0RKzKbmmnh5^CgH(Vq zMy9KEC1n2{sNF&A%J5VH zKv#eoAw#jg1rrb3lI#Mg`AC*U2|2g`P)TI`1Y)8w0MR3ex(4aMNE4uibRQ`)FClK#gz^0m$wk3<(nP ziGdW@D=`?fOekRzbRd*4(%j$<`W*C0pdA~*9C@3Ms&$EC6jr9(k3s76*IRQ{x?JQHr187nPAc1&iDVt%HMF6gPkO(kc=^>FL$H#UufJT6A z4yw5$dppb1G4?rVa?k`2;=Kc14sI;$>piGQ#mWe&9)*Ey=h#prG&fu$(EwZuFwSiN zHQ#|ivLuT#j~EDw0#5X ze(0K#g)FTDeaS7|C4O=8zx|psYq)8%5ht&O;8$m`zc+n`Wl5$pR(hAVte*G%d7bue@0=WopDH zCw62zUU-(|Q{Qr90F!`5jk}g#S34W6K0-ZD0n}vKR8e`DWu~*qQY9?qsY)?`v%&^& zZ@t#pEU#zDOm^ZBS}Q=l?Z$3MlN3cwR2eUuL!d<;nNy^bK4|4WXd~XAf+#W}=J-cU z(giM6c;GrL!U+^W@us*w%+}rv3ZRCyGE=Fxe&q$oC;qHR0n|6rN+K&e;+;@{7*P(g z9@JovaNJ1FkqzK02P3E;d`` z1mH{Zm(l!Q?vwRa5OR?R5Y1qq<(NlX7_}IxxrH`(ncoGmG6eFl21`6c;Xw zWYmG$a{Do@<#I7U!i}d26mcSTdhZ0hHa3#nwfx2VeqV@Born zTfQG&8>3q9uVOow&Eec$&*zt)^Rzmj#ha6}dba0HIm<7Ld?APVVr8R%2DY2H3s$5W z1nz$Nx`n{qK;YIzvla!IZCD|%KC*+0UH^3K3!rJmJg&a?U980gzW71pQb?b5h`HhX7<5`U}@5ss4ja7YbV4-!o;CfC>V;(TqZrhPlD zmF$$oAxgC*bcvi+kIQPfdycx#E129gEvKeJfzbOEGO4< z-ym)C`KGMPau?#zN}T8vXI5RM#kILsZ->v&*&Um*ZTNvvYA-%mrRKl(p9lY=ZjQ&y zQS>m^Ie6dN{j{pfe1TItT|}q63Yw}CJI=o^>GbgX+;p#^EL|i!7_FqU{4aayKy6 z1=Ex!TJw4NdCi{742`z`ar2tgghx3oNXy}^CR?xTrs-czHUbQ%8O`hf>>y8r%pEBMzy8zHPdptKcdYkrOWTU+Ph5?_ydjI-?e*dxBlcK{s1tY zRrV=B4nLxf`B~cj3)kkOd5n0Nv#ZA=YE$CiG?cPs6`m3a*>>Pt-GjJ%?rNV7mp}Q^ zXzQNRwe`aVp*<$Y{P3D00JFN_htOLo94KRx5IP&$LHYt>X(ZMje{1qt9G4j?mpqCe z&VUEaAP}>O<#}j_ub_m7#y)ko>mJzWhrgbiubEHNs$Q4Zw*LHCqH4{@(~f3RH)EGj zkosiO7Qv_;P9|PIK!u0+y>Hv)Yu2>lMz!Y#SK_DvltxqGNe-Wzv*CQ+PI!OU63P!W z_>1MdY=#cf;I5m03yN2LNAJSII1i079L0;XUk-f%Hd_p2?XAkspw!i~Z&qo>#X7#< z0G;n$k2>&4Tyxh=QF;)KL4+1fa}QfPE8=mGpr7B}v=iw-_d5{!=0jK@>0y%xyCmKZ7h8Y-u`+5#V>SJMt&!Y+s$)Q9}5tF0nwj8 zf*(MMdgH_ll^#Hy|Byw^{v$Zln?{H|9eM-F7?iuWM7lwYC{nj`1d=J-O zO7rVQ?@7n*!lIlVNV@zl2k{+bH?V6|W{U=<{B~kPd=!37zbI` z8%-<;kPIMWjQ16d3?N*=14B3hKwq*sX!0~n7eb~;3RoTJj=_NU5_tq# zcM!P%GELC{B+86gE+(wYqFI<%*~WwqUp&X}a?p}20A&s;0D626Tvg<=N1&m{QqX}i zarrkH1X)m9V*sJhn#e2Zyt_OFt_Bxkec-~RnkU-&0w7{ZItyuE05%jrfELe!OFAJs zc?35a;~Aemo6bRW1EC>pmTEHZ`U37h^N3gnAr+~TC2=uFlkQqo&V&YIX9Y7|A zB`Bc_GkQj3YC_ckgxPeY_h2Z6ZfP6TQlzOHxiMYo7=-}h9t=4Mze?1?Vpu{x2cb4Z z??H=TH_{o~@N%Y7=v9GXS_*juFrl%n<8*=$_5t&0qBDJJCsGK3>)Bo(xJ>dPa8)Vbfy)b! z@&d4h=1xTcObeSlrO9g)O{fls8N8n(HzT%Zb1)^!!VOk;5DwxXv@i6WI7O={VVUL5 zp?jOevUmc8gIha-63RV@J8&403ebiAk+svbqcxI3&md^l; z-vQJ^13=%Vp1i8vWVcvnwOa-AWnAp0RDdqcZJE7Fr4m`LE*nK{9S(KWEH*!*l6qDe zDuK@%I{27vC-y?|JODLMUo~!$XI0j?O*&ui%EQ!JLD$henmaOk5nu%1srHY@COR+P z0c5_FrivXi;_J!B>@b1Ab(yYt&}StT0(Z4BJagkh;AV6kHxRgiO6JjKm0G({m$PtT z#QxF`HQ$IEx5(Gkx`~=>xzFpv)ZCH@Gb4{VmIogZ0Ga?gp8M`@LQ>KyX|h*4d|~s= zW>r|bg`;GPY?{Q&Ak_mSZ&t;rf*HoPsn*r8KFqZ(ow(+PgDU`$>X`CwGg}Fe)>f0A zv$?Z)ahIFzs<89SQOc~E<;gnC^u#HyoBFheDb)q0=;u>&oLgIS;(8n3bf66cXvw?x zS-g6WK2qA)=ki)D7uid+e*cKe@VE}uvTBy6WS^BzF*}{Nb$y#0T-wjMy#vtStUM?a-d6P9^nbp_#c1XSO$MVZE zIQWyu|A_q%Kx>6xLSH`py)N>#u*;4_TMOR{js2Nw>)!A;XX zAK!j?=lktaPaFtb4FcDNo}h00$k2_`B|aV7&3XC$b5onKouz7!xHPbne=iQZ^pGc6 z3I*8duUV=*lK|Sjbqo!6E;Z^VSQ*BwzT}^m^ZR-I{aj<^aAY+nEDkec}7w{@%YgRuYt@n&c5pLI8gs%g<9$X89`3jUVem z(d=wU-xP^SrO6CAfpyA^Xel+X@97S}TXR7%TR%^$Qca7$1*{tL$X_ zwJub6$g(UuO!{1kG+E#<@lTl({RHr%$QO(GsQv3UDbl7?ZW$#oUhB&tsm}GUVe;Kv;JWZ%^YR6Jj^O5N;-)D_*|PNv>f5$e zeYURqA>3O&8}1Sp4%U?wM0N40O>=F*ggWz*DUn)vM2IEW|LzS(Mjlt9rc zk;K4(c@L!i^sk8wqZe^522{ z<^URmS(*C$0qN`3h0VX3_E=Qs@drd#x%NxoezTFTGm{bcvuW#UlzqFqZ`~>56wSE>$6_EA!XS!95w5XJ`q;SK>W_=mzQoh@Zf2 zJoz3(n5S0B0CtDEVlk2c34e0{$+sYS0&xe5gB2v!hV`KR4cOH5Nq3z3nc*1c>qZd5>dh)?AHfAfssTzkQf?Y zn}b}jY6(4oe8C@2iTxvpHC-M+M9EZRNQcR)L}1l-F15z*|xqiPcx= z`M%$?$GX8UWJWwiHCzb8h2RegHF2RyS5~3GWZ#0ep$s5Q;%A139T!Sy$}5C3U7}B*s{u&6 zh-VLJdfde)b{r1+0<^4|IH(Aa0vKCxq|U*WP+;gmv|IizKnFVlT&V#YK!UIUWt+zU zfGP(mUyis-R{jV?5`6$+@N#75HD+6HH4PZEWyXgh4hE7%0EDKLWuh_xB2&AAHja6t zQdz^u6d<0!s6j$G1n>Z0DnN}ln*e=D4myyj%-~6X3Sb%ss!yQkK?iEGCJPX{$b^bE z=mJ+?%oOdreF5Y1jHG<@4RyuEqv67P6QCG^0TCvMC0WRjbcZlP8>bim9@$jNpX6Y9&TdKxU ztv{p{GJ6R9YPe*A=&59!vMj10zvY$nKO!8&9azkUqK?}fwm(aR{xT@B(WqWQ9 z(iTnAVh<0==X$oq<@&M!(6aK#gXy-H0eFgk7x~X><)-S2hnFQQZb=f_fr{u{_}aWJ z-{3jyH`(E7zZj&Qe`s}8uhpgs{CwkUmJeX{v(7)u;%61F(&?6izN~nql$aC$4r>8;rTxU-Qj1so&-gy8AHx9k3V zt>3N}cGQ>U@EH2(G!4v*`CJu1+fU+Z+VG0BEr8qNwF4D(Rg>JB$N}mDmoL~gspf0P zG)|`RC~z%Vm$Ah};EoIM%GK2j{v4g3VwuVL%0XR#FW!_$7S({zJ8n*P`5VG^!-FhkPc533VZRV6j_>{*vB$YrU?s(9LhO> zn1i~-_^2l*0wh?IO-q{bFWC{a(SNGdBh(3$)j4x4h-1S=&#+<#%Z{&%g?6Hmq#x(jZ!Tv05bu4G6!=3 znzF6O!2lw?YVv+&&%qGJ*Xib8hh-oai>j$FOuZ>P4(f>-$*Sl=XWO26^7hZ%LU`Ue1pWPEcy7al?v4t>x4R=garM z4sYeG&k!}I^(iTm_4%cpj8m;m^LLsi$Nap$Pydef@)Y76r_-0DVRiCSE18k~SbzNW z`F6W(TklV4nO5hY?Zfo8ZGWd(ax6znR@zgu{_MfLaqINuqGnF^v-JW}+6)aJQ8~e4*&5gei08>zCy;%T@}2N=__hPklXf ziu4A;q~YGkW%mdtJtQmcV8+sA_3}2))*X1H7IR(#BMrx(L}*w4Ht~l3hQG}yPOf$N zR{gbKuB)vAk3%rL_@?uc7-?E&;vuqI+5v+#&%T^Y%I-b*JCS$2GmrRozg1mDQaKpD zrcRO7%d)A&_uvTiU_YF?cTmz6L)5|ml|r}m z=_pn8>vg4?>cvmJ^tGJTRnvS2qA>_$n3Z)|1Z-&U5!kMGs{e8ciXi(dTksxp1E2r7 z=Xe`U8~X9E+X}B+*)xRK_2QxKcQHh@$JgDmE$g)UQ7w7)eDbHQD_rTLAw>Gj6<-u4 z!O-3$l)l|6(YEIwjaZiVPhgu2|8`KQBE5XMg&RD<8;|{51mr(}^*xu`&v?4{7;WEl zia&yN^1Qf}PkEj)TIj3zNATgqTdwUnMTVTJZK`{kwk`gjVE?U-N&Bx3a`OKLhvt=l fY?_!zfAanZtmW~3kuXOo00000NkvXXu0mjf6ZK=N literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2c3c757cd2cda17154c139ea993ef4d50c768846 GIT binary patch literal 2020 zcmcIk=U3Ke7Q8>CDIh3F5tJF7M^QmRR8YkC#g4uA@+$V;v4hxq?+v@g#F%2#G);AP zlifAFnzALmkeI~HZgyRA@*(*La^{>n_soZTzsyXG#aOV1AXEu>!6@)by%2;V3|>q) zs=`%61S}F!sE%mF#h`{iqo%(g78ZwEh(`kA5|Lzuwf*_Yh)GCG!T36;3x8^Pkq3aV zl(c%N55XK7pdr#=jnEiPkPd$aN}8e>GGSS0j%>7mwL~lAAQ%4DINt_&Xba0nJNV#- z6`(yjpd+jkI-?7^!V1w1-O&Tq6TQ$IePDgj5B)I!HV}g_7(-w~F$}{o0yYw(Fd6~a z7>q>`#=*v80w!V-Y%-=`DyG4vV+Lko7Hl@=U@qpt=3@bhu@JThi?IYtVau=_B`Afh zKp9qI6>K%uU@g|c)?))UViRmLwqPr^!M0-uc48N7H}+sJ_QCe!01o01>@betD9T~S za2zLa5_SrwaRz5$=Wq|s<6hW(xPbd{5%vHc#6x%(b_tK*GOoa`;!!+?$6-(4NnFEq z*i(2K&)`|ub9f#%@CSH*#Gmj2Ui`qbKjSa>D{jJG!pnFCufkr#>v#ii!rsE$cn9yo zZs9$=j}H*~A^wKHS9liv55qt45kAHzhEMSsKF1e^FYy(=Mup)Ue2d%o&hR~cz#aU{ z@FV_>|KKO!zvlf9cVR}4L9D`HV+cbT#&Ba*R$~MsgBZo?ylr{W#u(OMO~xAISc~yY zFeWmIwV7;8VI9_Gsu3jXvA$7sY`})bG&W*mHZi6%gH72C%(U)VY|dP>G5hjLgDhjRo++O1Kgft8~f;24e#V-XD%-p{!E3;jBO7vZO0?_aFq zLE~6lGM;-&Ca^4LSr{gAlHW~^;1o{vXH7#!h3`UzZ%V*7-I(di%=Zj66r*TWH$^E@ z5vtZ+iBVM*uACo3;}xQPvB5~q%?c_lPx6qex~fwKUy2gall=v?OU;+0L?tLbNVOEF zSbssy(!k)>%2ke98Ct4^ven#_rA#$b(^9O+P`a9^v7wRD)KCpfPEvi<3sOotRT++< zrXd=vK^kZpp#JKozNS9vtzPPB>Y?uHrb0tkbwOu!GIdl3wO4`3FCW?|-_%xlYNJJ_ zg(}tp%{R@{T+PvJ(=5%@3{5vp(^O5-WYZ)~)C7$;jZ+cEYK$qM(HfRN>IfrwN^EjUiSZrL#MO@5trn5Su(>i53sS`S`W2SN))e#*w9nwJ^&`YM9 zTEeAVRvH$voFy#f3S${paurt_*KjS@alP?|p4W4F*7S^?)>FD}x~3=fgdR6MrbqR$ zJ~D0KMsDI};}&k^Hf}fW;7;!1ZsQ*Av~PEnqJY% z2z4Rm4)7ok@v!j-kFuP{B6*xA!gj`ZCuyhngTB{yvfKDp->5?NwZ77q`a<@(KGUcA zM3p9}@9H@^gG+UFT^(mBF4@&~NzM{of{S;xoW;3VSJTyS;V~}SB_>yQQN~CY;i|c+ zo(p$juB}VBk=VwywuIsjb6t+PR<5OM!R&C?++|sIrfX)dsmpNbu8FzEu8~V~l@-#! zIoHqi4RU>4Z`Ui}>$%Ba*u$MZo1N%8Lp#fJyocxMzc+k-JD2Z@=#6z_T)>SElnfbF zzWzS*5*J006iI0{{R3mSp1&x5`g;^Xv3QxG$0n2EfxeMY_tF|I$Uai!}PG$a-?hn0vs?ha5xx4 zCk`A?6J2UZ_XMK$2}C`CM8AO*Enqv+b^Uc$|BNgz938G;Q^Vo(*HzWk-PJv9jFlb9 z`#X>ic)fLU4PWm_KHQvN)3bMxaN)Z<^CjSQQ2yq8mjYGc5O~)M{NRB92`cxz$7{HS z9~|&jfL_H9p*9JSE^oKD8c3SJ|I3{s>JncM`~Zb^R}T0dpN&l31;AY&@J<1*|15CZ z1Kfr3J~Y_^x%@5_f@*Vr*S-l_nd;tbwp#*{B3YnnNdbmD1>6eo)&;PZ?PGw!v)d~M z>OK(xuT{A(16f06Gto5#{Z$&?Tx$R8sJ72uT~a}_i+aVM1YT~eToUkBwEa3@;GGT2 zr2}3eK5%F+5aolry4h$kP*lP=a4>(pOAWmFeV57>%iV;)>lFC@(Lie?X}D7zEdcI% zfg4S_r6&WEole(}0^V*y9v0keE*QA|df>SN%EMP#z$;jz6wV=J~I<=Gac z>k#<6Y9)|!`g3s>NLcG7Y6pL=2x0$YqofL6P~iyI2L@5M&N4t>^j)jP-NvfU`PsN; z0$zl--@VT8+Sh$5i{Mixwd@@i7EouUU9~;(TEVbUa^`jV+R3TAx6)t07w_mMh)L^Q ztsDP**R2~X%T5X0Xu2*chCi(v6Ffur5OBHzs{91Enot~H1DnRT@^&Llmj;{-@H4cj z=@VgFA9{$7v5OcDJppKo8s#`o#8&pawOL7g}@e8;OS?3RTZpb-L56OdCWi zHrxJD5)s`g^`M{{`>_l<%ZmH5N7nUdv~RT!+HY};fXIratpRQ>HPBXS-T~3oek@?u ziWn_*lghG#e@(OY;{<#)4y~oGz}L*g_KZ54RblCM?%Govyw>x&=HV*>&L+}+mBdNZ zD>@Bqq`_?D8}fh!&PQ577ZmU@E@GlMY2lrX*32r?uwNU0znYZAn1Mt5EXtCi?KpBL zx8B@!%F>*2gZBn58$b0V>{l|HkxzD0*4Y=x158jf`-2egeMegK(>hG4L@R{DewV`>*`G=+o%s-beU@PqMe zQdNh@EvqT^i*P=b*~}^#0c8jd`l=^SYc`jGYq&Voz(oX{aQsqR>nQayA03SJ_l{=u z^%9<3R3WhB9uWZ5ln#T%U^M!1q(nWkMh(Zq(zS9BY!JQ2&f?~{J~}{^EVOz)D7YV% zpc9Q&tN{6-TiZ}EWhBtYWZH1Sta^forL1U7fe)*x)%?f7V2}V2N@Ig<5FVPPtK#4z zKpCXwRR5H%=ROvEc-9MH4)lID$sNU=?3 zIvN3owtpdLNI>hwAV$FFuF)InZxd{kx6FGI0LOeaEJZ;EF4q!7ep(fWLYS?((Fm=L zfTaM3#ojY=-EkA9m@sPu!D*GWH{J>`FnKW88^mHmSAc6skS1aUHW~aKJk#k2)qjf3 zWcEPcy+NUYPo+zMItTmpbFaprs-6r6&j`d}FP@=fNong<9Sxr9zBUMe_VPO$c>ALR z)NH+WM36ktnGQ71dm?t!Ki_BMV+>4*N~~x23d(-Uq*Lu1_$3Pjw>nDjGZe|Oykvky zpLkf^BVPmjfoZS$U@S(D&r3BDK-lI2H&P(EXI5R9qeyS)Mm)eVFo(?oyKG{*!j2^h z25r43kO2S#Cb-N5V;#@CD@e4v9MEYTe32SJjKWEW1X==o>g)#zBld~lY@am{S;~DY z9NIg?#eMIo41Y-nU~`Y`qnL17W*3N6HUm`G)w9$O-&x*#Wa^Wan4iKC&ldg3De5%j z>u0#&(IXgKj9|Esz^2~GQF}r?^RpiKX*A;sehgH5R_VazZV-1U)cUjVjtS_+W)q4> zYGQh@FyPT2K)qo&H;+Nd&)je9QY8ldBDh%1MeN~il1B+7#UZ{KAXq@4;q zV}G{x{+df5{${OqGp9A^>&Ed+SL#bz+qQ*N~gc$FD- z|8D=)2mE{ck=kfhIh*R5Q-505+J(mP!ewlgU8i*Sy$V_t?>WqLWT;$R-<-}MM=|__ z{Wu!YJoYJ5LHkC)4h5|%3=RjmyIA9iN8eVK**FhCOwf~Gq z&A$@RH?73Vg75k?+iJMrirMD5jiML`@l&f!mL_c?2dptUlbr~F+Aw+*@=hRp$Td|I z$4vrs`m!NM01SyRR(x#OHxZB4k7DuI&MEF1b83X%heY7rJ8kq_!N8dV7Mv3E%Jh)K z;U74Z)r7-w=gmjwutukjk;ypgc?XC_L%2rxZDK|9V=TBVhm&%7>Jz@|~i3p@Te<>3N22KwY+QM(O~&h4QD9bYvW@~Wy2 z$V9i+XCRJ%4*{p?#-dT>0k~2Y6R@K7y#|(E!=&9buxZ^}k%pZxt7N<^%1}Mlkj5WT z)cPpMU>&fLmY=zu3kOuZ5V*ir%mUZFz|!;7rm7aBwxvW8N5|5(r`nL9;s~g-fro&A zTZ$nInXo4r;6z!X5TOa-wmVOU6}=}g{#o9vEOl<+i|CZPi*|ApurLcxbKNY?H^LVm zRn>+2ckTh0myAVC30Fo!#7fu1b@c!z1e8=K=5b_%JYt3xJ0Q)=Wb347%Q;t39}u?@ zOH)L1z|g4{MJLsKm~)M;zzoY6CP3@jX-LDwI#IbF7(34;s7`v^@(5rVqrL$29nmD# z_5rQd*+_7}HEWo|`FMFqJNMAH0jftl@a4TJvp{F^#C-{W4r-KXo%}Ewh;mWB`UgjO+jq4SvZ?@gj-<$(U>0km>PH~RG?)zcx19^gyc${Lr+&A&ehkPibbuQdG@VW{bRbaXVrUBs^i%DX~-5d()-AQ4~Uj-qUI7JEQ^Brpzj&G={_`bv)>=@C}CAvd=X? zoG>uHDFujMI_bjtc%gnLlE85Be%h+l=)&Wgtf6MCJq=Zv?Q4vWB4u2r`c!Qqx8wXkjkBk5fgpfP@Du4xZ(xoZ zh>-*2(fcToNWG>PD0<^Cr(elH4fx|yVP(%~-2+^$^v`n)NhYg+S7%$7`2pAj_PW{t z7ZILn&SZedcKjB;g&M0(zLegq7jeuj>bI1eZ zTnDPg_9GxD%{2?KaKPhUV33lCn{z;vp=@qhU~cUg(`pK|7|3q~hC-a;`Hc+FpYic> z;DA7koGvP6fjL@WvL!A=K?NjZ9Iz^*WKKXwx~Ix`7y+G|rXDy6fz!Iq?R4XuV!oxo kA<=INL^b~p{ND!t7sKeq9+;Nm{r~^~07*qoM6N<$f^)l;^#A|> literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/backgrounds/new/fire1.bin b/graphics/battle_anims/backgrounds/new/fire1.bin new file mode 100644 index 0000000000000000000000000000000000000000..9b0c40159a18053ea8bd8323149c367ff7564966 GIT binary patch literal 684 zcmV~$cT|mG0Knn*{ko{Ea$SV@y?l`^d!>6RdtF>4tBhomZ2G!Z$xb%eWk*s*ijciS z_9ldLI*vaa=Xf3u!$p`R8ZJ4~L|};=b4g0Q@o_=AB6T<139ywmg33^qa)v{e#{*9) z7~xhkkri>%Ed*8~x-wO)%e^pFr5e?ZL~l$ruuyYUGT0SqwS>h&ZL&Ree5`qOs3sit zx<XdSLG<@_UJb-t-Z#J^Rv6#o6gEiW~z} z;y|^{A^r`L(mq%n9K!ElhI;r5J%nKlXM`^!r5Yu#hZ3eSnlX%3`Qr|$=i$na1=K89GCAi;HO#l9?2@k?d$GL{QsiDL!vuu^8MVl``AS<5<^yPgE6O4~pp8|A|o z^i3*vGh5gy*v58tuv3u4E_SnLmn_~Z|LkKw2L#EaaF9cS!yMr#$7*q0{oSOeYF;M< zCrRTJ>4xTWnhY{IBRI=B&XXm$K)jw!POLCr34K3lC{)*SUG4OlKJKpob hz(13ZeB!fH#C@TVuU2!W;2Ym5;)g-#Pk!-A{}0cV))xQ( literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5f29e792faefdd982c3a1c305b9265287ef08905 GIT binary patch literal 2557 zcmV003wN0{{R3gj(ju0000mP)t-s00030 z{{a7-0RLhD|1kjeIS}qa5VS!UdodUQ00000000000000000000000009gtL@000Sy zNklt>LvFCgyLA`hGq8GzP zJ0`!JkN-Idz1hI?c--y7Kclr1d@R;h^!H*Pv#s@4H@sTlhBgdb0wAs+pnzdu8a;4+ z3v}xRI0itsLN{J)6#!wheykr@!CQOayawLs%Uyu8t#ps+w-zq%T~<%gclw3~cwp$C zJXR(Kz+1vp{cl^0}Df;c+ha_7G)UL0&e>+h2QD;WDTV8#C7Y-b@E zNQoK|C?U{%t^)(p7D><)Xwj)jwpHsfR?om`4Xgs7lg^?*{&SWTBXIgJpbdcb*FXxO zvvBdipu#wEc3Pxrrp1X@W+_m97~cVx7ho;R>@+*z_+lZh0>TO?n@WNg1y+kRiiz~T zc#8nxcAjwb{s#Eaxs%A*TB&lZKKoGFNt9WPT-Y%#o>wCj05a8^jF@p*g$D3EcpuJfStR3({^)Pws2{BfW zyWl2{C;Pw@wa`+lo2956utJ^rgt1MPbNc@9kU(Rq1I-^Bz?Gr`v_Umg58ed0LE7E| zwFd4EI4xr(Q?%0rz-kV3V4q#CT@8#L2ojhWP_3y;k!aKS0} z0H}AShuyo#*cYIE1-86!RABonpp_#={|JHCjW>6o{rHr_ExN09&eU|69F(zG|I~rU z_MhPe$fulr0ph(YSC@YY%nloO0W5D%z<#h!F*PDcoWzFWgvaoDlfIrMe!{R_?{#>dH!S)_B zsG(%ar}1)v2CHEqApTxv>rLS|On$VrRtmN|I3Rv}#)mh+Y0=Z>B*57L@o<@=l&)g< zoE?zn{ET<+fmY;a{N^$dBND}p0}4R8@K4-JO{kc&2G(;14w3TX@wt zS=0yQ#6*n;wvD$iZ7Q}f)3jOvM*AR!n9rcG+M|i~zQuJ7!(sc@Cg>z z0z4THt-!^alO#pC zd*FEm%nbwiY-ZAiBj`^VT=?faA^0dNk1jf~C&i~}GIXsJ;;YSDOW&kkr;7DmMo0y9l90zo6~rw5`d+;a$s zA!VSxUNyLVlooG+BLTY(fn_6ZYC5~y5CUrl{7Jy;8mI9~R!Z>w6Qe4@1;0Gi-+I53%hZa4KKJqO9a{^MkNn)$76cArc|~^)>o9~McEHWo}BFv zm=3c2DWRgEx0WtrU}O$u&%&&{_G~v0@Ib&*KAdGTSQs&|@)q6&NK>L1frmydJQh?X z-Ecd5i~^9EwJOoX+A5z;jx# zz%tbr1L1yzvri@jrViLLP~?(1V0!&B2O465nWhDU1$bp(Zxk4NVAo&_RW2Fp1E!|e z3jvQ=N@Jj}Tg$);-Or9@mnCn2w*!P|cV@W=5JF0jP)RF$5!!6xpW(9-$wEallKAlVSoIF}pn_RO9+Kfxw17 z5&;&pG`*ob@gxTeKh)ibfO{OpNMiC@Dzi9=b=M=Gi(Jmw9JVZ-8_9D8gkyph53L85 zZAUAUNQEH4uZV$Cgqb0E!cQe$76d5a9)qJ~efM0lc(T#$EG0WZL2?JX^iZwc- zkwXCNUBT}i5Kn#&+>`ye%WH>_t6>%qyxx4TLGb=7@5=`!1t!) z=!nW!Kqr3!HYH3yqR9{eN3<%0Wz$(2juo{cJuFUG~&n4FW-9DFJW2K_GNEj#|p) zmf}%Ta<98GBvPs3OJ;)GbQFQu>^a^9GzIh_9Cg5k;z5@tskWN7P$9)vRX>)jTtQ{waM=;0T9zIKr$%KBL!;l z0WjN@ywCQ85kR169Pop8#{b*2&E`8FyaaqR@SJ})F#B$x`DWlT`F{hOZwCGgz-?c4 T=a0?+00000NkvXXu0mjfgE@)T literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..42bed6c96f9587588b049a0372527027aecfc6fa GIT binary patch literal 952 zcmV~$1z?Q}0EXf3cg}Gf!_L_Bct31R4Z}?Sx|x{n?#`*{?!1@V!R_wuC#|B*`=?DyT#{$qXthwF*^HHL6pCnkbW6)CQua z4s{i)M_LxyN-_17Py=#kNF&skCNw1%HKRE#$Rpa4RP2t*&=>WiKLZ$u3K_&;hM=JoF^u781S1*6Xf%egjAJ~Sz(gi78BJj- z)0mECFq2u#Mst|UJm#YXEMyUj(Gr%jjOAzrD=B6bTFn~PvJRE7o(*gy*u-YGuvL-5 zZHjLvWd}RaE_Snry=Wi%Ilw`5h{GJ=C_2VPT+DHFf=jrR%h2Uq!IfNvuI3u9@A zbzIL4=tgehW^O^ZavQgE2fCBHxSM+@x|iU-Fn&L&4}=-vgUWn}hk1mwM|n&+kMo3b z3!fzRlnS2a8T2gA@jNe}7dg!tUP3SP3a|1SdYw0TleY-pR&bVcyo285J>KU7!VeYu zh>!UMeadHi&KD%V1UBjyBOxJR43)^*E z*U@^;a<&rLR(&^cjvHEy+}KUr)XH@;H+Ksw&n?}`t*v~wae>=f?cClS+|laf(4F1I z>gsOp?jBZ8_i}IdanRTO+}{HfNe*Sfk)ukcD2TdTa&-005{20{{R3m9qGA0000mP)t-s00030 zVoLv7LH|-Y|BHM7N-_UIDgQYj|7u$Ql#Bm^d;fcL|8r{pYGVJSqyPW_dK+93000eK zNkluQG zs8ey2H>%u-%B6B+$#=j4DmD>a=%7Lih#x>M{2A`OH-9)oQnC`~fcp(N^XAR)@eSuU z{4+C*0Zw08;Zz>w{r20SVrrFinyGu5mY_ZM%ETcA#EXFYyvhCglS8BIUgQl*ym&ls zi?GkGB}w}Dj?U|6OiVUr0Uk@d_GA-)jep>RhjGVOMPpd zLA=}>*X^Vp?Qsh~mULOet=5$6zp1)ax8&kQFa@d1GTb}OaL(l0$%Ie%47|sbLg_Kr zas%`w_fa8b*5E|k#a+X5qZLii|5)XpZIG9Z{%Xz*i=c1r@j?!+!85)ESRt7t+4kE8 z*&vrc{W5Q`h)ZrtHpx)Rh21Xi@&@nf@D5{y$|qfR@U&CbHfo(R2 zzZNwa1`d|pRJG4@Vw`A@VBkziq33zL<<#0tcu^`^a2#h>804+8gD5*9CFo9-`9~_>f{YrQWhr?fPpB5#%&M*7`HL3es~OytV4}+! z3xz;KvF)AIB{JV_1dAZy#6FM{N<(!P^N2-s_vj9mYY@s9x4B2*Mr!saf^l%eAvYJY zQ!dkZ_OwCapi=zem5QTk!*9% z3q_gZye0pVb@mikEAaVwlPJ^)Q*`U7Nz1UKtFFC!EM7TY}xsEP<^Jwu<_`0Le`z#N*@P&<80#hSvBu zAmPF8Hzlx)<77F#yd1~N=?LS|5#o3`q4ek)3#W0ya?Dy-EYoc4^?E}NQLlTH#;A;X z5eY(l$uzeD&9jtaft5FNCaiOrW>b>kR${Pgk&*Lt5_Kl)Sg=_pG^Q>w;w%$Ij%`ba zt!eXRr^V3c>kMZ3wN(Iv#JYT7OS;yQj%7x&)5MU`!=-%&7{WY5D*5B%@o;>MNF|XY z4d{;jScYqi5q^BF^4AcMq`rU6)H4mp&Odoa-q8^Z0TCm-<0A=Fco2I>$J6OJ2e`r% z55>bpJido1k$6i zEMFUzGS#$+zY_ij1|@&4zY-WRXt_+LUkMDlGwOBU=XvmjU`F$&f=L(v$h$EKz{=}S z))u7++hf!*x7p_*T-cT77EQ&Rc0KQ}z+>x7D@e}F}F@$#lJ;rK>D78 z)(^6^(V*fFR#HlA{Vhaz)z#nww%^8}k8P4pts-#%ulq!7!7cJ!T@P<3)V{^);+&oc z=ocJ);iI}f90R(O@MruL z4BiPUUiBG1=EmcHTZPo*zDx<>DqP*J2)7WZ(rRT^SEG#qhla|%4>IlDi7xNS&Y}Bb zf;uHqLxDO+4Qk-wt>UMq4fXOs8jb|%EIvZn>Q)&Pw9!u+v#EJ<>*qzm!<2ftpCRZ6 z)8M+3=vvu}p~rAva|6jV2;E~nAa3yyKt9qy%RD^P_@+Uf4tQqPiEI~pVwCk|pI9#5 z=7+fUP(7w2d{2k^Eemf+3-D4_HN{K47^#Q1bkbGYu*j|nPwccY=j)%?19{mHhcv#Z zLg662sM7ZlvFu9K9p+vv`t8Do(F$3AuHRc$-aHBO;fmhpxp!SEVv|Glh*N!`QtTpp z;THUs5U!0_y_y+(EsE~Z4@3EZaVwaz_ETaF*eFs#_!!D(yr4?BTKlyV8=q3|Hc#_U*iF+5w{d%)EM7~1(@byrKcSJM$)j@nm#)89&s+9R6P>BsUl=ntjdBxF)%I*Ze%JsKbi5q^5j> zAfro)>sdTh6NN{|G(X6NjB_>PPno%D`^e63OAUJ;)BJhw;wC=606N7SW8&9Mu*ij= zP#2`7&?(F5XmoiUTTeE@u5H%|Ol;!eZ(n3^0|ORYF14T?OgnQPFE$#)#U4i<#c(hL zqQ;U|ELl3^Z?cKxfEJ|o=F5e>OuU?!E2OGiuJy7kkIXEa zQm@&iic_vBrWLHYw94hTVjVDWm}Jl~{>_D}Zd2wvobuuMZ<`n> z^^J6Q#!RkB&GkC)jkxqjy)L}PGAR$*YB#|`7&KOvyA4zvrHXg=8x)%h#39!8e%I^D zVTdcs-==vl6m)z$;YlEPM|?AhXl{65&CJqw7}i@Y&&S$ZfJyVt8L}Oy2F+HPt7+x zPjRwTD#^_#^%AQ&w8C6|K36Ns1gGZEUIxkkMOklp@S0`=W`8uA_C1ai#dx*1$KJ<~ z@+;j2^vk#DHlS`j)r$hXHah2G*9f-=q4tY-OHY+^-uC29C5RUvIoJD^ur`yMqSV$X z1>?dQEw{AXtcZB+HM8~lx7kP4U@0tU|<#YwT*Yr-dLD`XA#cqP^B z4lz~dIixJlr(ZNDskXDgjcY3GHtJPZ%C0=Bt`lG#7dKW?FMINaN1f^0zcUGA zr|wf2e-!-Jlt1ugo;SX^mwv7`X!Q8gws5c_^DiEY{O*(c>G$&NXAzjmql3Wro3m0{ z%W3+4oUck4dJ9fS{vBunc$C1g{gKqVi5DrjyRe5rDR@vFvc|!3Ye%cW@sfhHOQ&Nk1hQXh8 zcu}cTPEaD@CvfNRuN4HiM6tjj<+K9oRi33*STzM+RtqKaLpWo`DzVk65oYjCg`e0% zP{6mB4>FkHA;u5%&}5qA+k*@iaPMIretm;K=fd9}WUyL*huHfs4b<$jJ{G2(00000 LNkvXXu0mjfoy7AW literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8eb8e48cd2022588546d9c8335f35ea7b345dca6 GIT binary patch literal 704 zcmWN|WmuD87=Y2|`?d*4I0O;Gwgm;)&tJ+KT`q%7qqPX(kRK~y3b zsZ0n}upxFrsY)33YGMedIuU3!s7WnqlOT1dOFimiZ$MH*8qpYOLQ|U29BDyITG1Nc zHnbI6I|&Oz+T)-D9Wi&JGpSwZigcqpJ?M$K7ri^U^r0`(k4XA60LMUrA`OEW%#c8a zjlmULn;0T7jAJ|#uupW_n8ajaU75mE(WWuogBipnMg_*s z#6O-{PTLC8Z02|{mwC<*t@eBz3$zsP)P*c!v9N@tEMvLO3Rbep;=Wo~!&=s{9yTPV zZ)6jjUD?7`i**~@g&pi<7YVT2626DM>=X8LfP);;Im{7`CfSY|NF<5l&IHQ@?F1(| z#c4g>enuaBmUEoPe1VIh<1TR-zhtiHaVgH=m{V7UYh33BH-%f=<_>p-d)(&%4|N{# zm?wJj(-=$YGoJIpk{%?5U-F9Ayb<2=j`w`f`N$`ndfI2<3#okNoA8|<{3K217r*%v zU`>a=hTwmQ(nRUXpp42SDwA?it{H-x%B(P)003|V0{{R3Yu{!u0000mP)t-sDKRl> zi@o-PwEqDA{}5vCVx;ClgWdo+-WXcVDN4;CQoR5%tPnw*04bCZF@p#o(kMrR000Yn zNklEVED$n7w z(GY5=)C(b2kwL&U2EGYHH4BKuWBnBaZxqD{;7O7+?jlKuZ{TB}fE(cz2L5g~5QxU; zQ!NpQC!jD41w4EpL{piu9WG=9T)hMc#H|VuBoKNwmN>;T1_j)n&l)+(;}p zS>muL{z1S6w)s^JxYqE2|7(M1cW1D>2wWWuiVp&TA=|v}1HtBGp`!4xO=CKgT#e5% z5G4xndjsqP5G2ABs(_sYLx_9&;lH-c`1W{)Vt&I7HBfz;gL$R$zF3hO7%~w5?$;`@ z-JUfGMC72>bFe3xAT!{2MBq*QGoqe*z?mvBJXbkAcn+ixQf7gD2U+~9unzi7q%Tyc`BBp zC@>Z`Ao&Ynfpwx5dDc7PUyorFMaxNCP`T``AW&QUY*Z8{9&mzqhkm*iHYk7KuVMV# zlL!hQHc26RJe-R$)bW=t`f*&v=LEfI`WuYT@sFF3`~b`{br8-)GAB;M0C^@}1Fz4( z@_e&4u|AQK1CT+M=inev7)#B&-teo7)zNFP%5H(7L#1!nbKHC{^W>%*T6K5Wt;#o&OoY^Y`HQSN&+1Z z$NSCc#5Dp&G}aJ^v{*}g;|uH*wV3v0I%l7I!0QN%Wg3B80On+ILksK->cEOj=bHZ_ z5I)Bgq{W^q9_va*B8tq*(ljLlvW$HHgoSq$zNns)2m}~Lhw4(;{~2w~Wz>D-fcODC zncv4)XWz=gz$lKu;&}=y z=Ap!%8;^H2Fl-p0>SDHl#DIx} z(Gkm2c+}59wRt>c34f<<6)I(F>%AgvBJjS%Xq57%OP%X zrR_q)Xxoh`x$NvyPLK}i#pa{P>wc6f4}}>Gll0Spqw0J~Z-tT4Edr4EdNU2X-b;aH z#lYN4I!xLuvp|QuTp`BX&;v$kMPlv&Ei$P9&)>D7S#dqZ*q7*A97U#gR-3NDf7h}i z1ERI;=70+#ZmMMijfWEXLJ*iKAHh3NJqX zg-e{jD+t1dXtsM#lw^w|FVP2;l7RW5B{I&e8=a27aS8OqlS!!!Gai1Crg%*GZ9cBI zxmno)24gRPx!G5iIMUs`b~DZ}E4=VlwW`2x0~Z=>vtQdPMS@Ibn=6ZCRbe?<9Q<0J zO-8lhPb`tfWL)Yho#Du-%3a}F5*=EBvzb6bLSP%M_JnHe)fq35mmsDdIf0YihTdNW zHC*XA_HC=_Rfa_lejQPR>Jt9aZdVEDcL+w{+ZLWU=3c2;)Ul5%9PXh$eSH6tXuH4o zxm-VuW8QPxb=PX^qRppgu!Wj2f@()Z20!Oo^9S;ZR|(Tam!q#|0;}H^!?&h-t#jNs zBGjS2BhCcgtN)~UZtLOtL@;9M*!G~GT}XG1X(gHnY=>+9V3JM;V=LlvlQ^K`{fWdB zMGg45W$U#)R5sC##|T`04Y7P)!BL1*fS)(p%?X~$cpASBBdt&!XyWH84zq0N1L1vE z;2*uh#R|E@2*!5@GcatVPy(8LS92T`B>wGi+z(%NjxcRwzs_2 zfd%Rfo{UXnlS~78UiSQN9A>&3th-Ag3yfWP*q)|v2-^xQtFUFgQmcF%%2L+>k9;|jSS*-@#be$mrNl>^}YYjbzxGzwCDZOqc&@?4>1`pfd{DC_0 zQ%R}=v7UpPL<9RI(61?L%la6>+?VKbdcN7dhwToX8Vk2I*%KrOHk5!3_5=x3yuYT6 za3UyT@~p3k#h7>yqI5Dy0&m#VR4ovjrc2>`9H&uWWNpwInPm_4#n9{`U*eIROJID@ zR$-32S1j=QoOY_7oSiABntGhUmePKMC((DXIbh+>EO45gkJj&^o^ zoX0z){$o^(Mf@2oe;yH}3O5nb48x38UUQmn;20~oC-(g+_=XmeD zmZ;=i0V>odM)$+agcaW842LIT$LASb&vqSWZ8n&{L48m<0$O-rMVUYOS8NuS@F+rqT4GWnag1V3(rYj;a5$su`i0x|xj^aF`}s3J zF*)iB6Qp`U@_=u6E`~!h7tIOa1g|s-Uzqt z6`<~z>83PkKAf@pETejAnDi8!d zo#63iv}LC7fbU8AGy&Uqu~YCRZo4g-&6O&!Zmza@$X?VpOnlAIw--&YjSxan z1`eEri88_|CZ6I%U@yT3L`u_=SfyzBAs-Qi0b070CYqEo^eHRua+JsMF%>W?Qb|(9 z#V1sz3P~|CC6=nps)jv|>eOIaO^jN^OIB?X@YInAH=knS6&n#Q3lFL;i6oIMr;K{k z=RyM-Vl<+$+-yQqtY&h*IVrS2S+37$Nh^7i6Jr_$pVOK)$QQJw9qlo`q=V#kq!W(L zbWu@V>88p?cBh9&#rpTOyuF~eO6;UVNkqX?)LE#tGw@Ksp%#Ok|Q?KA9=$I%_J^ly^Ea3?{oA-kHoo zW;2Jm%)^>5?lcy#5Lv`xmar82GBR1NZm&RAvWhs@YSbFmvW_g3Z>`ta8`#JX$R;+k zg{{bsY-2k+ulN5_aKLSvg0sEILa~MI43yC zDd99{ILoYm?|K&g4Wtu)C z<2?n4R))6e=xA-%exeI&e;uHU*ma;Ts+|QvT7q>NAv#q1&bm)vXoq%&=rA3QnWw_c F{{glD(u@EA literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b258035e343ddd983c12bf8098ed54eac3aa8430 GIT binary patch literal 3098 zcmV+#4CV8QP)003|V0{{R3Yu{!u0000mP)t-s00030 z|Ns90|NjtT_Jg$UVx;ClgWdo+-WXcVAX3dKO1%IvtPnw*04bCZF@p#otxB+1lXwNDI`*o_@xHQY5I^Obtd>3E)y3 zU7KK2ja-Pqj!;jWS}zBzF_7G221JM4AwVnCh@Pa5Cq2!Bhb$RrQf0ui#04%SHj%B7 z3uEoj01r9jb23s)M<8lQ8$g}Y4iN4g30VV6$)V?X*M-cTdlDTNIISSiqS5d2+%3HOOR&nz7U8#RYr~rcg0M%KJI&VTGQDLPCg8W z6hsXqwHyW{yLMq@T8p`!%bIsw|4QH|Z6GM~%88jg zhYpua(o2JV%s{858E$O2qH74`&Ad^RnmfmGZvqfce zR}OG46RPIWoFUNG?|Y87>x+KB?+4p8E&Nqg0Hr7xn73R=55Oi6qweYISc@mE%{|}u ze+w5Mzz=y|)kR$)AkVGDft^05x`cc6y9NmK{T?WrgF=85;JkCtlg~(DWn5T@#Ul%B zG-hZDs`KH-#U_ZGd_iE3?8-Bs%(5&Cf~}cSv-1xTht4Dyeu}`Q z?U-9pUVh@*d<3zrz)T=20^-+)H-M+`S?Izrqv+U{zMVGF1O9t~z%7+S#(*p}gAWb- z-FlX*nF3+d1(EG(BpauR0sj2v@q~Wbw>E!((Lf#z20ruG@BmVYT)2k{m&Rbz&b@u9 ztJtZ#lcm&FK+Oa?2=?IfJBF&fT9DP5o{Z47Xp?RCFy|@m*bUyxRTKD>fe;vs%a)S4 zn2scE?3&!%da@&DGh_Ba@CS^GD9o`AA1SSHIpm-i9>!zow5E0ScXT8;%qTp8+aWFn z2yqFODE!wM0qw5xCz6dssmcGq^j6L|3Gma`CTB2vK(ZG2^VgI%2B+sAmZ9iVzNE@2 zDsA91-(P2iP%!WWD=dF%0v|}EaL^@Hkw3+#w1M9VFgxK?%AHllYZ?sC3Bw=+iC9PT z9Bn>o15b<}z=eAh?Yc0)x;2C^o!WAM6C&agHd7RK5E)YT`0q>3hnz;m3Q$7ywdrG0 zD$Cm$mV{jODeMe<$Z$Af%QIXkyvunHYV)?~Ij_Btj35zJVU)h#VBns11Z5M}%@)uJ zkZHAesYKsVe(NZ0Q9AnK%24NJUU--BaLSlwP4`V(IxKyTQUge#VTF|dCoYd)1Bpc4 zm1y8ocH9=Rd*VXf&5x7ioMQF9{+|A`y zqP4lFl4NT-1@s3=qND^VPMr1;V41m2FPvG3pNCiu)vJtvX3!QFb3 zw=_J^{P+oYVZff`n&YwMU;6&XF-=RZ8+k=JT;$NI&R2Qb2Ty+BbB`!{o>3Bc@wm&t z4k{c-VY?S_f1X!M>s!sM+oO7Y#4ZJ;-gw*vZ+_|bI$d-jS)64*nhY*d)12aXvD)pz z&>hu5m?Yk~)9J+BYyMhioWL`8T+ z+Sa^~T>r&kdcNDS*P(IMzX?LsU{g&K&M(M?419TR!|@Jv_)pri=`{B6)4$c}j>mCF z;2(q9XTj|_Ry^Yey0Cy^E^ZZc%6hg;lQ`~n(avifxIrN>zOvrwbi10@x#FW+zX&m% z=$;egZIExzLGR)Ww*jUJoyKDrbZ0kCo_cDk;?H{>XI#Of_~4cS(oPrqLIs@xwv7H0 z(<&zlu97<;U3^kF_8Y)83{w!}+(eU4`moX6c}9q+ zb+#o*EYRdzmapQX=vz8|Zi!o@P)pPa=PJBydB$doGkcZ>(I~vC0~m|IKY7=o9_qtP zUZA`%I5wEZ!V-_vv>D2-m^=tPOgD|6u|!9n!_&Kb8a?HvGo=Fqp^A8}14v>TVJ#R$ z_GP*hs)v@?X(d}1+lIg4jh^cO*!buCo-Yi;mOfYj^E~YvVjGxn6%9R=|C1T4>f6;4 z`sR=YR>JF6O8vh+;5XSr^;6ixm21|etj)bjK!I~8E~*TTi=tkFo{ z?}t>eQQ&Iw(T=BTD7@1s40D@@QJNAEYHYYi0-fsOn4FpW0T_N`U5ewS!^2nTlS#CD z{>PbWl^Fzz!Yng3d*9FrtM4#s3{r?OQDU+ob{!uoV>9>IFViN5h2gjl`64exq!u?! zr9HAcprLAs!ojq!{_?iAeSwsiZr4c{a#jO)87_MD!`rvU2}Yqv1mD?w!EiKy+Qj>h zU%h(kP~4%{^yze}9T=N@xkTZmh~_Z8kXG2W;pK(s*8+uztGakG{=a~_kx5LQ#y!bY o;`~1VYu%y7CauRNFl~kZ1&Sx+N{gjQzyJUM07*qoM6N<$g3DFoaR2}S literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..be2421aaf18efd07a9667f6774effb4c68e6f46a GIT binary patch literal 2244 zcmchX<#W|{7sSu+LP*eDG&sAkUlIsz!9p(X1b26LcXxMpFYd0zrLMSJC2g@nTbe%4 ztNsI>o!K*U=FGl1J0HLK%{=&!01071NQ7X7z!D<~k|G%_IZ_}Legsllwp2)sH1MZI zI*SZLdRPWzL?&d0WkFVC17JjUjWj51W9An1so&DVU0Bm=2qPnV5yyusN8Ed6*AdfQ49u z#jqtg5~pCNaRz7cG3*@9;{q^ppq8@LI(h1j|X@NdxXb$f~T-&c#aqN0p5@J2|pw5u4ljCSNw*T zuvd7EH+T#C9q;fSf587I{_=%>h=06!^f3VwGJOye#d#JQ%n%B(N(N;Du^D#dQ z7z?rx3$sWFi?Wz`Q7mpO!ICV+(#B|(VGIMtvMk5)tYECjO03K(#;UBw>a1a`$y$tM z?GV;sU0YR;_2a`Eupt|<@o4j!uqm6dxv>RXvK3n!+psO$vAwYaJF*iyhp-E~2E1CHoX^8Va#CiYLf3et=Am9rgHG@9Pq<hB~wx*ktJ4$ zf{{oTq=ZVKt?}hk8AYqKtdvTsgo?|eR7^!xL{?aZR8R$E`IS$3l}8q-+{&d0S-5h_ zNwOTuE()@2YN-}#E^DTyYNE!nMrx=AsxPajx~ikvvRKtpP1TT9S2a~t6!qIRq3*J7>Z&g4EbF9>>Y(Jqt&uix}}@C5r4yN+|C`eo!rIU+(X;TecaCjw1d2^Yq~1CqRYCZi?RzkuXBp0 z)mfd!50qE4)X|)@)+$nPw*s9(N6OW&+=p1IiBYWJ(oSxQ$5jR*&{vF z1KpS1(_P)sZTXY9#K9L5^8)Q6+vdH*%k*F2)$qt`yiWUspYk*MTtd&8`{2v;m+Vjd zq4#>Hc!Isv8@-m7(>eD!zX;!CU-Bz{&2MPm@;iRd8?>9e#oJ8hEUio9QoB^nQaZm2 zbtzm(awc<)qbj)a=E}LUF5qI!m2uIov@2z?8xY8zu+ zEmzakFjw7Gb5&gxbCq2sSJ4eTjr>u!2DtvNUm(=q*Y&YccX*d}kN5e24{4A1m{0hW z-ZMVu3;y7B^4ht!obINDG_k2}iks{vIh*JvxbbcrQ~t=Gyr7>M7je>l;jjFSFB$ZT muldHy@-|{x@b7%b_iz5kqW=O&|Ki}A5C7=x|HnU0v%dkz!kLo* literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7cdc534afc4cf08b0221d17bf7237da79754098a GIT binary patch literal 3912 zcmV-O54Z4%P)007Vg0{{R3a>IAu0000mP)t-s?ie8E z|L&~+&EEg!&HvuC|IMub#nu1j#sAf$|HZxk)z$yroc6tx_Ot*100000vI+`l000it zNkl1WpB_gN+6hbac_#&@-Q4oO!`4MxWv8{i}La-RhBNFFLlcHIlmOSMOiFs;+7o zW6M^`CcDAE9~vkRpSi%>C-}x*!k3|xttw4pD>mkL0bffqYGf;J5jY-ZOys{I5LomI zz)#!l&k-;iOQTN&^s;9neGEhqKS8ULz-=cmYXhH9TTmQ;pX|#r1cISnbE`HGtw<^> z0fCM{_%Fcm(gROPxIGDM9-umEyb&NtxXC~E8K(|p>x=)yXNEhl1YAXj_f%1wiM-bD33up$tz_Mb?| z0&ZAcAUt^B6Zsl}8P00b-*WQ8nF%o5tOFswe|9FG#b6-W*f4W*=UUw&<71g4gg2UK>-(4I!vjcILjfu zxiOgnZWQoy1cZX^hX7hs)h1Pu3Xts z57k=)+Imlvls4HgQvtilmgCHs2aKL&S!ixA0EdMAYbedZ|11J7mp(RO%)tkZq8qDL`?4rqsj7vKHu$_t>HUI$6?Y^BYMX}L4K`(pZRUt;{DQco*O0Oz z2w=Z2%fuG0zDD2^rFQ_@E5#fL`yx^G{D=T2fwwF%BhgA*bCqzhZA&Bbg?0RcqZGb^ z0Qa{4-L;E@j7FQaP?G1lWnR^F4Q*OG<&fIbh*a(EoqQI7shpW zMMjcH*;Tsu(Ln4J8qS4n|+kBRMWq zPH5YjC79%g6$NexlvqEzPy)SAYzkemgJ6O&k+}xC0Tddz&LX*dZ`Wcz2(Elo#6S{q ziX>QP_!*O%)(HjYLC?t?jW`9I0SJ?8R051$Kl^1c6f?+_wYkU7T8V_MX4!kQhv3DxaQP}JW z14pzlmL={j)@ciPDk^;()yCf&qC?$~@0u}tc^qlRt)L1?AsxnhjwCc|N29$Z;yq(J zorK-!pXRirHroHVX3Sf>31)`;nZk+PI9YYhWE)Q8u18#`0*}jGt<$; zbfPk#7r_#iLsatg=c1Z0-cUXb%w))vhDy&C1lgOz$e%0v8OtJ6W3~Gx1HV zpU}zz1--HxA*h1UFNQ#mfK$TTxiu~9WxoUOupyR!m~)ow zr174MiEa_AN&#^j$1W>yMPao*30wz2x1HlQX@cD!zJ<>z`zv4-BufXRxN>$adOSEM z1$NQ)k7J>dX4aML3k@lwo5{9D{4L(Jn?iID`5iShk+blw3JfCdB<7+rfgQL)_}z}B z`Q;duUr9)>8HP<$aX=ZWO?0PPW0^ z%g9K(#Lxqd*jC?vxe3FB`Bm?|v50Huce?LWF-tAqG>w{pFk{0`Zg+MG5+oh>xM4uz zmBpLpKOwM#QiMBT;1fE6y4hsQksb-fJUMCs$%gM~WPUj%W#Dm=cTA^)xCxyKJW0Ma z;uMVbnAj0PRyM-X3CI#}%mbi^`Zo~rOAF>lqZ$@tcc!xB6RLe1nCDjU$FCgJoct*u z=L*w&40-Px?`dtru99k^1BOJ%6Xya!=}quPVEOpN`?qKr-&=cvhOOv1w#YRhIue#d_ryF^ac81&o$f zA4^AmC6j|%XqCa@jnLtdEF2;AF4r_IE|n@CNF(OVHQ?Dmm=TU$)Z-}_%pg@*VjxUS zZ{l_I*HbVkRR__W3|Po|ZrQOH6mVwk8(81h31AAD#TFT;0Wgt!cwVHQ1oH9rkT!AB z(Ri5sZ-7Bu1uCQMX0rqDG{9b6NQ6Z@AY{UTG%UP@I?W86ae(zW>|Wd};9Rapz)S*R7wPnW}>|v)qI_9j$DPY|L#ND-a_|i8K@Ic-70%`k?qzbFRoMC)N2d54jH3st4 zZr~f|J0%pYb#_vhJP?WvU%g30PqRc4-jTJyXyk3m_;UF+1pXN8 zIrRbWw3C#C3OLI(4i<5|!}*TqbswNUt16RdFhSwnk4Hr`yyr$=Jkp0MCOQQ|AiZ%S z;wsa0tdS7=TLcu{wdN!q^LP1z+9{A*1#u$B=d0wqffsb6hbjiz)h`E%l#j;_ASKxE1o|5=w4>wQyNun% z>;;OD$0Ve^94MANx-9q{&?bp~Aglc)=_t;ol*#1yF#zI^9JcCbBCo@rhsd_iXaAr( zKGILW7|Gzd=Fjls4fw&vh9B_$1NaBp&`RxFiC?WBlI%^e%8qvbh8DR$@OeapxcVk{)f7BGEF(UkhlUYE*VK zh#Jwe$vWC(Q6e$40{T}h(Y*q3v9(xV61TcDo% zCCeJdrH%c4f{z$=R!+1Z*X-bZ)MI1=5P97KiXS+a?Bxmjwf|KGmY7EdSXZV+3V?m# z*%mJVM%O7Su+n+JvKKg4zZ`m2$dc1oFR+YCi!zI4lVWCV3$}2lf$gdWf}q*t!-nzxAX#S`M(Ah!La(hz(lt19SQc}?EU7;fjV;4qw+5Rf@INzHksxx1^yQi W37sAV<>cM~0000*%1023f)#P|?i z=$m-$)jWbbWp#B`cUAXASGz%6>Xc9;WSv;3eQW1zw4N>;Ht#v0bL zPVDu+{Svo)0~^^ywQi=7CYr@cHb}$tmG9Eu7)3aE|j_ASYbp5|?QeTD&V@NRM|&~`e6P6BRoN4U#9y7KhyOYsA`d6?i4kHvmMPq)~;JaujF8D-CT@&6%{ vR8y7Hm-Nw(4DgCU20VF9pEt-G002k?0{{R3gZAU`0000mP)t-s0002R z|No2L_H)($YR&&*#s6Bg_DZDgL7eU}l;$am<|%X4AcNi@V$C30#VJa(skcN40008w zNklMN6{;~q+ zO!^7CC*?*xU@=3)u({PJ@b?Uz1Ij(Mz_IUVs71gxPZ;}#3B3>PETC$XBH+6x3wa$v zX8~(y?k#`Mr^SAB8=r^>|jLH5O{h1(C|p3;Gjip2CuOe?n|yIzr^Z(0eb!KPa=n`dzLSmVGm-SsCVpVcSL&xq$f)Nn7^zAKI*VkJ>W?T zg|aA5#fc35N0951t}R`A+p(~{Vc5B}2W8aiGWwrP#i?y6+-bVBb!FijuXn*hhwvEn zze60jzr}1dwA*Yx!_9$n{@*RpT^w!!EL|K?6h;GkF^4#e1`fZ}Xy7o87LJz>XDB0e z2h=Yx=oJVhX_D0MF)F%9^D5&aslqg0t81mpx^NeV<`oO|1XU;5fvWC86_vaa+3|EC z7}yu9roO5Ac57TxwM{7N7B~$qwYn*1CV}YQsK%<+i3)&_RkjwTT3bc#^bA)h2y{!m z8Suku6)+S_Q9!rmX4&B(4x@l3Dz9CHLQz2F$B`dUCcu#Enk^B9k1|nY1525JYHO5Q h2%K>npTPec_y?2488icX2^P zO^lDm7ypRKRsX;cHAaoWd!O_lka?M$e94(P=Xixz1SLuaT}e0)$)qp{4J{QXX-bN8 z6^eV^E(YVqBS^=~5Hd^^QbuKMCPT>*3}ZMW$S!51Dpp1$HVU60htcGMhdlCCk&>0~ z{em$RFqVLWag1kz3Md(m#0t?VVxnLYL5i7dD!-*`QYGxDKk~Bk{=w?DJNV( zh00dae%*||z!&?5+n`cqS%|IX>s3?}t+6RnmgzH*waj8Rb5xE6bfskIbD4*n&jJ=w zm-Nn5c}hmLMbxv{!4j6Ttopn1TWrv^oE5AjWfiMg(^f2$?6(d7KLa3`@>@@Py|Y4J zoBU=S>%(mL@hRd|A+Ngu5n&^n*ovfV=yNvd2K@tPfio$O*a zd&2B3_-K8}XwHtJ?PEU&EJT`yILINIIgIZJM^%B9U91IhjN_c(B+;0iTU?9Nia13Z zr#VCPtX)+{<2l+99h~O^7x7&pv#-fofvZjzmq~DiPDWqln%36WZAJg~y5I&kxy9`; zcjO=2y(MuMagX~v;31_A`cEt8mc%2v1dn;bQ=Wb9ZB&K75?OSoC7yfe;f2k#27IaX d@-i*)ir4+Wt8jnq{8!filx3S+Q?iyR{sJutMDG9q literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b2012c0a8acecbc8871f91a932659e6855bfe909 GIT binary patch literal 1089 zcmV-H1it%;P)002k?0{{R3gZAU`0000mP)t-s00030 z|Nq72|BKD`QmpPdgUujPq!1~4000000000000000000000000000000{9_OX000Bb zNklAR1%xPU$|&0(rWHrb551ClkqA&rW7$ z_0xI00}^@VZ5v%>>Y7Rq6s)|~B3)&w9}Wbrie!g_ zH&|+GB1=WO%2X%#2vmv$q(jy8V?CKw%N!#V2 zN9apsz8_dusR5f0Rpz@!o#zGbhQ5SQQtCSyJOiSil?t{bw zCCNMa#KgOHd7b9}fA{^n{{5H#$&k!?rt}%df;{-mgE53MI(!Ic`2*f&@S?+OKz1$g z4&ZH__gi^e-FlxQ3vU2lO>poIls9<6;N1b(TnoGd&Edl~UaDIiUIFGPFOg`+!Q}=o zfK%sS1?IFdcst4uXSS`?R}QZV31HifF&(_;;01B$$d^hHqEk631~_hm^@%cujuRTf95)5^tpO;!#%-l$hW>H7~Jcl;E8zuD1E|dC%L}Qv_ytyr7($6mR26 z@~)zJ_uQg%?%>@9ZyPVEab@|usCjW5uk*I?l47&WEbg0>Gor9}@;-?HL2K4`JzFNf zLxb_PTh`K&q~bS>qG|Bz2cV_WfRF^@gZ(ITUUP1#6a-D4{tctddCj?{QV^tgAX(>} z?$T^V(&rDgUUi03(QH1Xr_v zM?ZJAtZ)r9eljW}*y*tiyx9K=c)m6AQ>h(?Fi-Hp`uo8RuR8%{MZh z$B)nb)@6+Jo3yQ4QQo%Y@k6MVlQcVl{nzro?ECokzL)z>dy*^8E3nY7c!Bhu&M(41n6%Ypm z>**ha2k?^wpuhoi2n1SmXybssbAKI7tBusw8886glFuQI*)!2n94^d!o8y#ozQ=se zbI$W2MqxyWln>3veL6&dRvcsnDtI~wdZRX6U4iis(_o>Le+7;=B=#v%2OQu>4*i&r z^+QAo?&piTaSUBTWOIo3&%s{}GIod_t!3v4Tlz;`9Ds^a)T(D~hMjro5j2!e3T+xq zg;`qhOLchmvyrCEL8D|KLySJMGw<0^PGcm9iou6ifE#6wDyS%O zR8rZ?qKc|sk&>q%l}=Ujs_Nl2uX{s{P*W|n)d_XgQ(uEzxe06NP4SjS-qu(&@s6gN ziRM~psg<18+9a&4cSAevbyfaY;zPZBq_^m!uYUTA0R|dm zu*@Nb%1hX=@Uc$}HzIs$q|b~Bqm41v=NZNsZ$iRiqDdzELQFB$G+&CZOgFCuj}}{EX*$U*v)l^tla*FkEq=DfTITa7o9%Yk8FtxikG)}^{SG*o>rlcDJ0gB{)NhW7<4!o~ckzcmopM^vndDYF zb=JA?m%p8NAzXCHWmm#g*Iaia%T50z?3TFgj=S!O`yTk$L-C(S9(yA5sb`)iOvL{k Clbi4W literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9d4c57fcde4f0ee0034992ab5a5bc1439ee6bd31 GIT binary patch literal 5090 zcmV<86CLb{P)003YF0{{R3XbEJh0000mP)t-s00960 z|K|VytpERu|Nm0TF-D_<|$2%OBaEg)ZZoq*)Z?7Bg}sLX06LBFV8 z_7sxHcD_QtyiXy?4-h2f0ooFIfdDTsvFBXb)%^g4%dXD`j_!Z&x#ylMBngio&Er^j zi*DzP*)vV+a~Al%?>V!JX3ut=tIx$!+-$>e9>$@gE9y13xTSSI<+I^Z2tSKL&iL%2 zfd}D90)WxRS#;&LW{kCg$vN=+jb(h@(nj1F|32`;brP;#1;S&Ki}u`gTubl1x8@Zntk*Hun*t$E>leoSRlx8F7D|Y^SfH#9y&V+x0xY z(7V5LCT@~sah|N0>3ZYV2f%e+W$Slc;5AxuyU#3xxjuI}v#wOF+toT9)w*6Lq4VZ8 zPd1)6orfN`#@d-V3KB$!KYl;*`MC4XBj5Ey{qAg z%Xw1f+aHQ5M@SpSgV332-S#y_nB}p*Fl^7d_y8EC$(A$iMGe?cO@{$+p&Q7%Hq^Cl ztMS}lS5>)tQxRb18w`Mxo}nSBQCcQp5H3diUw~N>`HnN`JOUz#Y-;mq7l&=*yVGek zejnXd`$Kk9?5ixea^wUyeN?~5pS5IDIWmO^bs=*hTPYH4O!EAy4Ft~mUR6XxM}I8u9Ldv2WI%()1X8t|!#2#Biad%o{H0=5;ccLi40 z&$ipD+W98kACGyqKkh34ZokuvEA`UmT*PUf^e_p{ejDaNQ7eJJOMW3 z$2OsI^#{<&Nb%?O;bP} zNX!@jK)!VUR^~}{e0aFO3mrD@PX-MAi6eTxU?X&*?Q&;;wrMm+NLI3SDQTYLXkGcd zRwohPR&gOAIRiAqC+vqji}nCKWE)O^hG{Whgg8sY_4&&7xaSxX9i_btVkiPop&;DS zJFRouh1x|T%A%YAbw%lFgLRI^IG%nhW4ubcgoYVxju?>cP&W63qs=J%XGDX#L}{+xwx5JO`bU1jG(RE;*B~B7cG=@S~gRc&N(v7UBYy=RiFZbVlrl z&Q;&`aFhYs>#OJHn$9Z%k;b04nq9P2=HkF1=$WOGp?5p&K1bU`H~S;{VrzT8XA807 zZUj7t(^hPzmoA2)(i@oUkH2%HJQFKmU=oFpRYf)NOSBoe2>>k!-q|&cxkwbymvYBF z*RfGu4{uD9qRc`}lfKIr9YqCT=Th9{N&L=^(gOc`3k}Uct@ri|kUo{lEy_2uePncw zmq0J`FxjqpoKG>ERMV27%6aBHcow<O zT>u7jO{i5K^0DoVWx1^y<7dkpRrT32CE>|J$IyokI%F!$B0gIF9lypPJTHt0k+$t54PteGvk%r~y4=V)B{ZU!qeG0}2=ZRULVO zi1Jtz0LwCO>nSfII##?`CI#d>C*5MMWxY-!LH!88 zcsg>!H30^Bjsf*f@9Et>1M4TRFfp<)Dl`7Is_8Ugy2@pgm$=S5%#-~AA+AgYSzyRm z3_V33A&Ehh39=9vIRM;PL!ctO0W)G;d&T|)VOQj5eZ~=CiAfhn zH6T#@0M@29H9ns(!vus>q=D8t(%HDv?%u7zIH}654BA z3yM5ONnR7XgugP=syOU_jRblQF}!HLWZadY^9gtotS+FwO7Gf@ZcoRCtQZ3 zK&yC=!ot9FA);kkmT*psZva;v?qZRPbsW8W(Rj{mS3)Q$r8E3Wy=Wt2Zd9D^4+ped zO!Ej`E7oA_DgfhQU!iJtkeB3m|Na{8;sJFB`*xw{U?}xX8#yeBkQDR3Rn*kv;65}0 zv$D)^$dV2hWzeQ&l4f!2yB_DkZIOY5-+fb54-a^4QkCU9$7t0vPAcy50_vE=|J&{; zeNaLqM7IQhd7kDdMnHZoM8SZIY(nS|tBAwtJjDn*lzE2v_}>4^U9W#Z{mOiogM03OeE>xA{WwLHLtWh1n4vT4%E{DFi2Vi>xTT*UgDjmJXyC^`%Ad5F%Umbsa{Dv25_nhBlvi_KT6Mr z*hy%4p}(DuFv1l~YEGIO(abx7YNQ|fBVtnq3E(!A*1zYwv?{Z$Ag##@a?cgsEuCEl zp-3|<2b9(O;|YKj5d|Tl$?FKIbFD{14Rf31d@|7FFH`tY^dJlB=|%Az_NNC4PB3|_ z=4}Cgd4e(^!VJudLr@RRfZRZ;R@27_o1cjUqBXwwvMAB?<@>o0goFU`LIA#k1fUFr zSW!|Rj)$^Dl{0EHys~&Wg1w;8=Fg8=d_MP~IhOYMEe>>mq=ll6sVp8NL_}0n#EAAn zOJNf2>Bu7d>yyQQrh3@=bO1m#F!r(PrYX&DO8UdYL#=i>osy0!J=_y3GwNG7GOQuT zdkPr%-;t%Qj|t;7);_~{08t@lFf}EG05+T+?jbmb0~)5zJ4OHweju@;y5fka!m+Ap z6aKZ;RFqniIITUO-sC7`xf7JJ`b_XC`+K~9kK&M;q*;~{AkIM@k=F)|_+93t7%Tlk zR>|j|^;u6>wexjEn_ejBy$C0zy_EbKPEPXlbY|&rBuOjFI*Dss0wt)9zvl7xSWSk5 zPPf@Nbp?xo0xiddL`{+uU5)lch*iy(D#e2enM(Jx(;S+EcZ6dTt`KpR{-4m>sn0JUtZ^{hvR3yDHJSlmgm5f?Q8 zodPkE^QV)?o*TNJi!p@4OSDeYDYC~o$!2E+*doPiW1{cDlLXw0~ut)47eO}pl+sk>@O$a@mK*YTa;yhN}u1U)7Ujp`Sxb8(8KN;aYmTr(@I2 zz`4}|UPcPXjRxJ);0~K(&_EiJ741dQlLDcr;PJzK30Bbs{F=pYITra^R7fLl0Ep3tDG6yOkp_L^)xhDfo=jJ- zuu+mru9r-RyhOJVv0l;~#mr8842d_Q80bQkl4)^oU342*2MFxhNK zH!DrscQC<0@+9!4T3;G>)UHp7ipBed$=%@X#Wm5mRtx}QD-7A|S}AG#)WVQ%S61H! z_cVQYjom%;B2o#y(1%QdH~y5n>!fzPN$phQ?TpBm?;jpYx<@LatuyU$XJ{Cv%>vga zA>BedXPW64lMComKo{K8yp+1F#xv8c?FjUf)CrFtLB4&7h{$@z7zNxMagTwku8Z!) zW`q6?QDu|q8n$Yb5r{vdZdHA&>TJGFNc(A{j8KR`qhP?}H>6+~=NorvJN(suRGB?7+M#f>AKu8oLg}9%JStH_RP^#9UegKBh)WA*~Cyp5}PO*bCyMMpf#I@EPMl%23Ck}U5gM3 zKSw9LhwJ~oH%Ck6<)dymPN7HFTX3o^km>5IcGi4+xbwI)UW zY3?&;+G?C*vG?mwrKa*cLFIR3a<*?fa?fBG!iL^68ME;s&bYBIPEcNwyA5+36y+Zb zv4h#iyB~GsY=AB7nKqik5@0GUy7L?GfkVRdYt$rZGw$gwDQo?x5di2577{hah@aBoc5GrCEq*eR_MkXL3x zj-+~TJ!i{^BvtsECH5fcV;*%#eek5Vpv!PccZWXaQGdFpei3AKGkqi6v^sqhpiXC2 z`f$JdYPah9^K^gzQGnxmR~pW5U|#OLuheggj|8Mos^mUM3;SBgxJ)d z_1OFteBb#q>s#2Xj{}7HeKz8Bqo(|6H3|ZV?8o5!Kip$%YvPRYR{#J207*qoM6N<$ Ef~(lKssI20 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..02a43683a67dcfbd4f907d696bd64d30a05bcf67 GIT binary patch literal 924 zcmWO41w)kw0EOZ65sJxG!Pf6R0%D6D7?@zAf*sg}iVAjIuw&D8cXv;hx->Rj>N<3t z#!@%ke15|diN;C+F~kyw;weXY5>N#yQi;l_3ROuYf~rxS8YH1)YEp~Z#MPlL^`hzZ zQ3Dzh0y2$AAr+<3m~@(;rZl5DEl^8Z(V7g@hPJe$J&_J{EC@T%8Fis6nRG+l=|NAj zP%nDZhrXyE{mCW=4PYRH7>tH6l$_LI1i1`n1S1tHk9e^ zD$~$(W-yakL}oKb;aujSLgur8g{X){EM^HRri7&|L(5sgN>-uOtYIzdP?S>2SdTWa zkxgtyTiD7rwxbDlf`*?|$c?G@7YrM{W zA_q8F5FX+U^d^Tn!dvKV-r-%|L+^8xV|;)<}dr>iDw9Y<9Ghx&#V;v#owIe9QucUInM?3 z-^B=lW2{)mIo{<=d1r(PuHcGtC0BM8SH+16Bd+G^at$Xr*)`=_uI)OmE7x;Zs}HXYiGEP+sf_S-W}Xg?&Qwy;;wS0yScl2#JH!k z+)H6^xsUt0pZg~`+c^rd(+0=`J;;MSL>}s4&h>D4ghx8h`SK`__85y&C@+Yp6OYh?K$#X&vT*Y%L}~FMP4K?_7WGnL|*D;UhWn0O0V*2uaVb! Zoue+5%e>wjyiwld&EDdz@-}a`{s$53-NXO@ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6438ea6dcab9af1cc163d9603d2b26d928ad187f GIT binary patch literal 3338 zcmV+l4fXPgP)005u_0{{R3dEt5<0000mP)t-s00030 z|Nrjx=FRT3)$YB;=CsA;tgPOYz22mx)r*|XgM-Cti^X$$y<%dtK|!n_X8iD7000b? zNkl)}aC0%A9x-a&I>vlE+-yHkJAA3$X|@zMX;X2Kt;1D4O78r}S4*k`dKku^)lVE^|UZpqI1D@tzV z;C_|yQT<*U#OoR@MWYzY4=UGtu!<1q#1~!2YR3?rBU$Zw7t_8?*uQTP93QDXoY$sX9bq0GTDai0>k@*Hf#8PtHeH>~!HGkNEoo zdX@}1uHV%u`;yvIeUWuv#5Q2@K_XdAiBf65s;|vAU~Qtyk~B~zLBqlwERTR ztc^cc2b-N=QhHRN6RF+<9{%nbp&DXg5fstn`FoY{rPnDsvY@&>?!mKoBZ@?OrKmT>hnpt0LbpDQ7H z>TU*&rR>B}Oo#T$fj>Hq7^COJ>j|l^a!$!kwjA3axdbLT5>YN>cqU>^0VrHFnRFU6nBJEN!{0 zK>Tah-)-13!;HSM=XfySsr2P<{Mm3VnK$ z^D`Sc>MS?B20bVLwAv_ZGNjuP{&O3`i019_@}v@P3*q~l32)q=&F7CF-Q2_|GlW)^ zaEX*I%j?DbVZ0>KLY6*wJU{)kU4bffgrjxmcKh-t<^|~MQf8#W1>J?M*44-V3ynx& zLc)gPLIGzAL*^!kt5FFcEM~2@W+%txE8_bh^%T19a1m|mY`CO6&21vDJh0vopTr?I z$`ZouarwXYYw^uzCk)@Nycj zr(6v`bmOABbk0YVXY~UNHV%|Je$oRKSdTiW!@A3T6HTJqo+1L!19B3V`&{;EZ zJl}O)@5fOTc)o|jb;;2{nu}NmAw>kNyVW`in!fM)K4o-#$&HZap%e*G5HY@T3f<|O zAYu&kAIT1K!9gaUsXZ>k7d}cuiib4Uo^bB6hM5Lp38b6=>JFNkA97>I7r1^6Heq9J z1J)I?0!q3P&GL5rv+%7ZEG%5_ITNmjF0B;cO2R@$tOr*FAkZnKFs(7qcM98rVXtA< zJn1Ej2%#m<(@MkP2!qc|I~ud$_8k1;t7}U3e|^C!fq_^RKFewO6c_b*yk3K7Q`~txAZ? zX_$AShRNfa8!A=eMxrp^Zn@#${V9)>+`KlSDYY!xm0`;T1ElEj_~MvofC8TDq`m&_ zYbe0=s)Y5cA{~3eNH}3sP0($7N>|K5);?YPBo{k7A zr|9rJqax|Ct;6}6cy9 zOnuV+%vfmU7lW`JR^H$3V5@vLXJ1QRk=o|%JXEYg5gmJ5STm!Ss|<^0S=$bVSqqV2 zhA4W6%|f%jRxCwiEfq)uIwGqe$gpbCLY@rfl_1t0=}-BXx?QYB7Ar07Of}{0goOlE zaiPdB)v$wLX)~SFo=s{Cfo)qhEay#&Kbx?i!{<)84a)2{#>38bgbr_F=zV?6#=Iqj z=~WErpH~UnmeAUwG_zY!13kiC6FaPEMz`+W(rZdz#1>Sjg@#sx|Ju4G`kmcZ(2~5! zdOR-{Lq1On=;gjvW>nICbu}IE5-hQz94B|m)t|dX1tVp2q{W)8TkZ$pCAyX<#rk&i zVaa>f9vX3z8cynV0-IYZ@ixy4(}Jz8*!(Ryf_|yAq9EuO$YiI#)E~$qgqM4#I4uTxintM&Q!b(QL%bDf7nSYFstaX ztcs_yhm%pG7z6t()@k;p)s9q+q9F2#5%#~RTn@7@RS^uZ-p_a99Ce3Fdhdcx<;vjK zR8S;E^0r(WX(PQy$6;)5D4gnBX_6R4SIc$A+bk5V7s(n$!jj5PNyN0+Y>lHI)d|t6 zl>U~bGnR5}9p+?qCsT1`3kjFZ1IrFRH7GPyuC9K$bZcoDl)d9+i#AH`&*rBmAFs?= z+dDReTl*DN7$4#%B3NGLQW=O?%b7v%6ioy86(p?Sz2Q)%# UkCcX0{Qv*}07*qoM6N<$g6zO?&Hw-a literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..37874dd0bfe49071e27547deb84976adcb9b6a3f GIT binary patch literal 544 zcmWmCX;(~f9KiA4zcJNVGSndJcW#rVEL|D9y4EC7wq(5_WF1R(`ZJd7QX=bQ-y-`? z*?Zs|FQIe1f&0u;;|+Wte9qUaU1BO66^e_&<@j{O-3B+Y#0l|uXiGbxJsn7(qk)(7 zPIM+SQAol^7rF}FNTxeIgr4-GH+^CNKZaFgNFap(sq_{4(VqdN3F!=E5QBvwWMDEh zflP*3;ZX3mB5WrH8P14|V(tFpC`T1|Ml#CrMcgu)F^pv#l0`Nayeg;2^$ zR6Y^7!Tsn*RkoD*s}&jsp)i(KL| zSG1+Ba*YV}!gX$NlUs0G|GmRq?g{sKz(X2ZZ8NHt_lU#cSaW lZ+XXi;R7G}L{l`|%xAvvRrtnte(*Dk79ISrAAO=+{s92=kXrx% literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..34bc5ecc82c5b04ec87dc19e29378e7edaf68350 GIT binary patch literal 1839 zcmV+~2hjM5P)003A70{{R3fFR*&0000mP)t-s0RI60 zN=oh+7~Vlaq$w$+5D;o0AZiE*K@boi7~Wz*-WU*r002QC2nYxO00000P7%1s000KM zNkl1&v5WZJXlozlKJ%CNWKp+gtY@!VAks zMZtOP0jG$IfII*`>;QhF00+u)Fa&lJ6>!K>+vV9}{_;&1P|@bRDi}L9z^pjQbH)m; zsgeH%Nh+`Zo`H1$!R1GG4i4p}m}@}}7@MHblYlgloRV2v`;h=PY_MyBrh!VpX^cxN(X^`>JuJBo1h$2Q zAfdG@I_uUcJ{kAkkU-}i54o(Sp`;Jk1d;`YTrOs_`702`MLs(B0m(IB(=@G6fKaF; zpXPyL50GzI5tgT?1XP`|?|eYd(=7$)-qT7#OFVYCniK@|YfuApl$RW(K6r+JPX^?d ziKi`#@n)T|F#&#c=boyCBwm-xsJR7Jjrr1ZO&e(pbRp5$@qnIOl~e%mcqT;9>w6PEV#LTBR6LEd&x=)daPNQfrJ> zdqn`8g{%!CwFNHHP!XY(i?7PZ=Yi-C#&&%F}K<5p@L=gWinRv{C^^ z+SE>EG!dslk>auD;w{q6{xJ=4M)ZG|ezE-8)xeEWPu}Rs% zK>_U*Zvnrc>VHnb-o%zwZjN&cRl?J<>9#x>)p8-G`QEOHB%GMDpoFh=*s!cla(DWM zQ@v_x8W8I+t=%mXhFNRXAoz6bLBXj*c|l{8%X98a$GbiG&<&kCi|RzX2_(Uy zf#?9z=e#mU`P*9u6YsF9+60_n4K24h_MmB=GYIyC!zZe&%NkOMc{^Tqcd2X8LF_P_ zDdvo#ZCQCoV^);s-u!g!ZO(G zcmp$Rw+4{2c36U{D-KZa&f{-Qk)V?Vz$(oB33Y38vk!C813Wy4>Ycr+N&8-^`y$E* zF6i9Bwnn@T@a%Bk1H3A$f$fxe7k_t=kRo8X|2UkchO9(}D~DpcZ}H^2p#rRi``z*` z8f3DXC?ZtD{)V|aa$FzSYmAg)ckE$pxPb`?R{^z;{oGCz^n`tlI?=?g% zkHNHQz~Rp0ReL2OdP!;?Al=5R@lhSQ7Vj4JUkK;2*xSCl8V(tvD{wC!8O?Ps048^( z7+*on00KKbsz2f;Q#*SH>X{C=uSG+^&w{r*qeM%_UAx-Pz~!47grsMuZ{FYGQ7+rd z`Z^s{R>xhxdwu3r_iUr@9jc;$$e>ptwH1zU-p@-@59xz^RBKhs#{R|-K=Wd_-P`CT z5jT5a{X8$Z1q9x`ylgBn^PqQ){N#nUBiM`wCVmn<)LDuI9#u{k>j? zBhu^lckG~SBeDl0*XIQN669=8k-Qtg-S^=VfVjgC)GsM*-Zcf;^Y$))13<&Z8@?ix z>)2+`UT+CB`~7_uLIzNNlbW32=jdIB45c1HW97a#_5m*X1oVX{`izDcbj--&II2!e#FUL@X z`f)7BaXdPK{+!53XaFZOkU{7a1~Y_HQJi9iG7Ob)8mDsxI+NjyU?dvFXwKqnRLVJ= z%NTSXV>zF3=mIWeJQtyhnZPAniZ0`FCUOP3lB>9yN$47`dg07jy?d|bUsWUyEdxr||Y{_dXEi6mK5~kD4P}yB!?&cmjej-0%e1GY^%w!g` z)0o3t1ko&lw2gHLsL?u;X5fAeSi$#@J=`CTYSjM9~#&YpE zPf*R11+0*Hil-H<@fE4z8CFs&o~4de)Qbk5<9S{Xt7-7+y*1)R*07eBD&)LOqr#26 z(kA1E)++Z^nv|csj`eJi*@&8H;Wb`IZ}289UbE-E#oIFP(2CyWJ>KU7oDcbkj}>i| z<8GoY9{Pk&(Py;N!Diy0EB_0=WV5FZZwp)a3TG={^Nm8CiWGOr`IhhaUZ&O!cVT{z z`H^j6J3q05pWzn;cCw3KA)&x;>}HQI=Xdt9k8WSlKlqcs*k7ycZpHq8fWK4uhkq52 uHL^)IV3VzrYEx`5Zc=S%mcnT^Y003|V0{{R3Yu{!u0000mP)t-s?ie6* zbBkJ9YD!9CK|xYEIZ81xIVmYIARs9i7$6W37ytkO000000000000000x`bfr000Lv zNkl~;|i@Ul&1<+99bq6Px;RJ3C9Q_FU?G24ew)nsibRZ1GqcIEXmKx=Kg`)pGz7veUVVLQYmCLx+;FjtsA6Z+IB~P;tepntZG$HREsb`8LS=dJsxd5iJ>KO?*9Gxf zlE1u?87+BeB)19$KNqxOQIw=mSey=mR}`MFP(WrZX*vc*?n$VnOC!NY)=KJ&Ee~nm z=^3Y9E2+GaHpB;9BZYQS2$d_y#`P$7u%sQE$t9&Hxu1xp5@S|_C2^CIB0;T7q}zGc z?Z~wkWg7QCVEo3Rr(pshkz$Hi%*jRKu$?j}cRGbsOXg|wb!6r!dR?UEHCdcoNn3s8 zc~I%Xp|t>n`p7JG(|k7#12(4cBqTuvl#)jk#--{aX~Ze~QUV2U;>4oVb!*#J35AMa z1O%oru0fY3-V?(jr(W}-Y?`j?EYEC=XAzFN3Q$#j!vd@deJN|(IrobhTLZaB9R`Iu zTvHc?ZbAcm-B{ZMcu{TMgx64%!-7a86jUY4@(;Gw_H8%`s-)N0Qsch{x zRoAyAltyO^(=@owTJkv>J4=u>2e9-R23n*uwE|$tU!KKUH@cp_Nz1yvR{}Rq(@6fl zr@0u?6`H}Y;uZLTK!VPvA9#W;Mwc$%10@9em|F3W~W|D>achav0n8NN(#i zeWMEL?+t_viUqVt#f8tXCYDvw<>~aBtN$C-ND28hyp`$?`3ni)267$G2QZwtd1|(>l!}5eL3LU35N$}rs$?v7ch0x zbCZ9NXfGo<%~9UTXH8v_tV1t6yfXSy)%!pCYC1GA;Q8P2%}0`Z+@W_&^UIdarR(G6~$aN(xkjkqlc|K4W8A@V9-7=h8H zjd#6t;@1prUH2A3{>?Gf@MqRVW>7yOfLm|zkUyPU&an7BR_*+UXS?uHg@4phks6Z+xqC(2l_5{389r{Zydw*ZrOw|zR*y6 zp704{!n-rNc@VSnHoM5JE`BTWR>Hci-x^Q|Wd6v*$tX?yId489W_aIG-U%5w~^q&~z|3~Np tUSBbOH(OPA1C~|VD($OqF5^dpzX4$X4qi_)BXIx#002ovPDHLkV1gJw!u_%Bz6oeH*VZ;Ln(o%|`C3CO71j;i(E~kUY3POC=mYDEe&~+@uz?ta!59J?ieX5{aM%cp z#3+o0jlo!q!+7{6AOjOEHXSwzlQ9LEuq;f)G)#xhz)Z}-Yy{?DF5>55K5PLNVi6X@ zmS8ECVL5CCR$>)aBd`W*t=l@Rhi$+{Y{F*P7Hq{fY=`Z@PVB;N*dFY~KJ14bz(E|s zVb~EI#W5U*oxn+)!fDtUoW(huN8kc3TFNC{M)(z6#WhO}c&{2>!|QkhZyMgh+js}> z8s5YE_y8XouHy!7;ui3cdAD%~cMbP&9}n=*@Cc9bF+MSTiqG&l{sR20=B#wg}xKIS(@GlsD&V2ooy7GhyzJVCOE zu_#5yV#eZ3Ur$5GEUi2%7%Q?8E3-Y2E9(S&g{aj z?8dy^*~2#W#Qk&x(`-a9_GTYiU-n~v4xl%XgE*K&>}u8%ZzzW`ox}Yc!I8n_Q5>CR z-WZPMIF66t1ipBw_lKVU@4WOsrFiyo|467W=y@5O$n2P8pQvt=AVic|X%4f=}DCAM3DWKfSrJOO!p@c|;Ws~0&p>T!CX9!h@Jk>JQ zR1H;EHB(hpQDs#!Ra6C)M>$hjl~JNfn@XvqN+`ipT*c%hzlx%WCGiD?6tBYQqRysH z>ZlHCZ)&HuYJ=9MR%)phYHmtZGc{F{EL-1Ljnq&LO!ZYybydfdqM(vh+mxh<%FqPU zc#YFojWLbZD2>zz({QC@n1-5$Xs`xpplN{mtDpLs`lz>hDb3VVJ=9&@OkK5FtF+Rz zLd&&GOHE6(Sc|kUL<=-u^Q>;VVXo$Awq}`TYKEq3nrW)Cl&L9xP1YpDpVCRw2_4rl z9W@=%VI9&z(*f<*KJ7K_(QfV1PSXx;*EVf6ZP8|J(#8;M(0Z-2t!qtda8oyQ-L#a; zxST7DE4hlRxyHDb>$sj9t`vJ56LC#fbwz>8x@1WgbwPGs=X6$QWT*9|zR*V6CT`{y zZl!JGcJAO#+Ai+q7VV+!bAA^R;ldf_Vh8)og}M;uIrF>c`pw%}#Z@*}$yIa} zT=_W`U(S^^SH>k8OS{4>;SyYNSInGqaz$N{5Jv|WZ*hgp6?Ac~fNN#0rEB4u zyHs<{TvOM?HO@lcMy{c2;Od*J=jyVKOMwg8#AH|7C7G+`YPuS(y3bW}Rb6aae`oz% zU)RU=cCC6@?lf#qM^Bp^*2BHccl;^u`qu~E9AM!eH@Mgk9o8ZQ~ac-006)Q0{{R3aTRq$0000mP)t-s?ie8d z_V)ko?*HcI|K8^R-roP!-v7h4|BQ(T1U`^)hZy)k!1-U+i7;@x-Fe)4cLxJ` z&%+hz-xEOkZ?na5M8@IdrxIqfJK6y_V5eLB zg>8`m)+S_tA@8(b9}fbw^2<_>j##3Bo7-!^13k~Y{hM+V`vmH0!w4QV1o!YPk+PDd6Tl0A{RxGhr2XG7${C6X4zf z|Jwsp8Sl-DC94=~c*nU8fSl-qxgp?Uv6y!YK~I*fqW3*&|9+-`QF3>{)dFSyecdg* zsHh62S!sAMsne!$Km!)#Den9o_S|*dw4HR_%koR!6C0y6F6ASEY z`akToDH?dv(aJ#>s`#*9lXfToyj|}0>zIgE->&T#uQ&FG{lI?2Uulm$-Q6w$*tYeU znC8vPZQyl~pjMW0*uR-=?9#gg3U_!5(R}bKzW@1dJ_Gfd+5;E6y-eehpg&s5ZvXnl za{Ej55*>(31dJB68ma$$^{)C8m|KgOTibc3eZ$K12TaWqt04jBf%9y4miRBy@cs8M z+6ZVf63jP^Y&U~Py2Zw&=G!$gx|Y6%cGix~dT~#6*x}t`iWV1jU7(oMX>E4ed8a*L zpdL@WHq%J8O;w^6i}{R_8fsuUrgQcN6AeIBA9C`v)4gTWM#Gx?WG0W=@SJz1BeC-l zc%q63;2mRNH5!&coZuMXGGeF9`j4S*pr4KF2Yx%S$(%P4wpGBQDD8jN_Lh*4OJJCd zb8z^Oc=PdWxx-+;yGMInw7W!GS(F=pLXX>yrgCn1^ ze$q~m8@AO_Sm>!u9RSH{!NJHHN)!}}kk6Kj`loxDUpqx)Nl}ZfWodt}CsS5{GQeTC zw-f#2OM|>IG;vPQbw7Yx<8*9StN9eVM$$l#R<(9ITPPwq_WExx3@8V>4$!S|e3uv~ z)|ah*z^ls0Pymiym~x!a!qbcmjb)7kj8;R(JL|~E>n8E2@obFI*)-H*SJR2%!E``y z)8!KLA$Y#kzsdt^mr+nS8?6>I0xGYbG&iDkBx00*S}0EK}r zr+A~dIVd;~AUzbS40;WR0_@o2?3Bh9_W|J}_&LM`%Sy30N1aYwP|Z7MK++-32KB*4 z2+&5JcppYz2XRenIRLXxf}BA>G}MJ}gGAJ=8B6Fp56A$OFmM!&iDZbWAw%^O zgJs;N*+cSrJ0`&7WjCo-n!?0n=uG-219s@l={TUCL2V#j$ zMCbk)VB%V8yy9`3xEjPII0wwdxYkj9gZ>qNKGcqAGAa#wln%!>_l+gyfCEnGX*We5 z^eNylc_Q)0M9-TGNH37WD(_F}5CiH9*5zj89v-SDLs}|^!E-Tjq+x!OZ<01iqA1dk z@f~@XE3-}5Cb3Ha(^ZWo+iV#BBWT&f6X+V}#rX==**Gxq(S z0y_)j%x`G($43NIFV9%VCSSnD1LA)j4$LK#Pl#VYp-e?~zT)XuH#{;upC5sWJ0sL_ zs;b6Ra;0nxL;>h(p^l*PrhAf-38yqCEkEymidaQ(xY+SdOR_ z3O1GLN+pgR1v5qF2gQH9eC}lar+k)_lmdC+%|!*141{%oiQ9M1J1WxJq;51Ss5}qU z8@GWppybDLJfY*Ng+6I0lvYMXljePB6L||noRgN9I=2}KfJ$3VNY>teq`bEM)>@4X zVKO>7tWY*bKvyr^oXrzH{t3NM6=1P5>DN3tb2z%>)Ic4E%ne}2Zlt*5gHhcQdnc_c9kPuLL%@k zG`wXBL}r->f#!HC8Y@H%a$7Ac)TD$+#PVPQ(!dPd7eiUH{G2-_btF-E6!S=C1d{ z)qc3r57+qN<3E6Z0Dlh-F3LX{FZJ zM#f`xYVYeX3=X(l)>Qbpuff~_Hv;L3UMIIkbk)LV2|ALSO07%0AlpZ0R&xU4vJV%{ z7F<92qNSbIar)O$4M_cp2Z8Rg=h|Ix4#ZvTiGV@P06#je38BdtP-8sCM?P4>G(*+r+k6AasPP>ku1ipyIWySJ7R3jrQ(_uN6%6%OG3y z@fsO#?fuqdnmcPM1&B#NJ|C)kDoVjdLSov6Lnm{WyiXBT8p=)6Hh1dfhgI)8pkek5 z7TSy(bzU4B_H1CS&z-z?#`j?LKv-a%1Ijr}1dK^aKfkf|cUoEi`rgVI*z@|kR=_$2 z>hq}Z?CyyhrnNUC0BW}=)D-u=n|IChfwY?ybO;3;w=#Kc)5i;@Hvl@rOpjsi?u9(j z`iJO2Xr$AeVR;siZqiMro`)m!TY&DMMl5W#I8&=p7TDt*eDb4I{J(&bT(ydgI15%j zm0m8c0(G{|zDuCn1eKna02pw5ZjBDRyt_KhS&vZMCn$nEstZiXub4yy$ z8k^9DwzQ*tva~L0bf6=hFgnwPu5=?sy3>Q6^g?>mhrYxh{pimC1|owP%n*iR9>#D+ z*uqC5c48UDXe?tGD+%Kmk7WWAC210qkts}N8q+amFq2u#7Q>jsT;?&~Hc}R_kT@10 zivr@P7T}32W(iAKhQyP=auSghtYj6dku|Jk9qWnQV0dq2lPzg8#um1+jqPH{4tBDO z-N+vHvXA}90S+oJ;)_DWn>a TTY~*HKm*k)j|Mry(}2i-F5t-B literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2b2ae414b609cb09d8c8fc5152f3f767894847d5 GIT binary patch literal 3739 zcmV;M4rK9(P)004Ld0{{R3hm7Q00000mP)t-s{{R30 zDPjOAS^ywY03b>L7)k&bK>!#z01!C<5HSDDq?KcQ?`vENCY_0|4q&?cW+u2)7KSJ zAmMHg?ZlSA>7}zN|D4Otwje<+JG&Dj!L2im5!^bnj*<3x-uIP|0Nd%#KAGa$pr4-i z`TroF4@5=L^`T|z14C0?Qk{^BJVPV_L@rik{NWn|yF<$w3=I9Z0txSRfXXDTI!iqp zC{6)eZs0WRN?=u;1cD7M6M)+ENiPOc8Uky&bOBKRpMY{rFAI4$P;CLwA{u%QjDDD+ zIUGmC)}RSMaT+*b!I^;~Pw@n?Ybg=}Yj93Y5c27nvX@Y2N~?F#&3$!vr+*pfwZN#&<>)TSHWe2+w31SRZr^%qqAHfX#_W^<5UQV$bSV zB#c><&THJXKJWr3GD;j;hB5&}&pYQqAY441o`MXPG8#gW zcmSd`Jp*O)MX!;BR))08EFrcMLdsD!*D2NBB54z(Zy|RuvHnjh%}V(dHk9qs1ye#r#@XdEATScBVbmiNz+&5W3J#)Upp+S( z6ZA^JU_i<)0Hc#Y0sjd$uw^@0slgO23Hb~Krrki0On!?3F-S*0@X>K3I5Zl2GdoO%qhC%+#+bi7Ej1n?4cm`!erU%?l)M0bq|B(ZwMphXSGL=ArV+ zzQWZ&AQmC5HBzQu$}SXr6=g|=damxJ^RnQxbBD@yrc@#QFi|5Vro1+FBaRDsPYXq) zrnb+h`}00;wMd9{g)|3@CY)^f89>ehl`GKr5RZE2a;=iLf#a&3{EirokBh98H~HlmKvxeHl29VWqv5EkRvf3; z5ig=$lcgNQf{=Ff-gt&Z;czQ1vL>yhmd6HgYnlSpA$CZH zoaB;42GsJg89-1fBf^aB07Xdzpj?#-no?}I3_*eChsoL)IQEdcS7l@`5H&2S<-(v- zYUEu&V$M-RxEz?tWyEUNw1IHMBm{l4*g7d$y4K8%BWa&<`jskkl$KrQW&ra-RUbGS z0x=1bxKgbXpepT60!PXi7@h`hXC$FDK;WKD+!hjIO>4g>S=xah=N({)jbD8m*w5N0 zp7Z;i(vmDm0JKoUgspU1DC+H#W2=+PWzu0gYK~Z|@2fU2=K*5rgV&6z0C4CdH&=C4 zrootS&My>OJ*{mixx}_}eBz^H^ts9$WE`xH;V3?OoWY#9ibwEw*l6|y7caU(26of1N89GT37|*UXu3pp`jZd4X1!FzYKYRSYWru1tXCulwmU* z4D3QsX-a!u#qVgjT@_+ik$5_~Ea1z!+QvS<>0=!}#ZzE>8!JxR*(S7#v^VjkK;d-j z4gi&ku*POTd|fXAaMaA&KzsL(XQ0nk+q%}Jw&+V^9A3}!E5~PR8_=~+qlI1rl?&*@AiqU3>T0%ndhJXXYB(9To`w4UVKL4ZwmNlr7V<77RthAnDYQv0GNPPMv{^k3DQw?Yx?0a&?4Kgkcut=@fzd;0_!6vT5I8j$e*Tw8_z~D;#LX_O#tN_AH^b$ zSw-UvV`QUlN}G7~!XF`U`Z0&LkVt$rdWwX3GNPDereOs3Zv24H=u~An7Yh?0i?{Fs z)Tc7WZ0P!JxUs>Lqw-5!a3Ldncb**st%?nV0z`n&5p`XW_M$EcFWhNc&1?)O^&8-3 za||TwHJ67fKLI)h37GD4gekIQ%gZUS?rCzr@$Qwd^8(qjWY{Pf42t>7lEPq zui?!XF#-(DCn`Pbj7~Gb4FWW>1n7^nuLQn8AUBVJctU{p!;1nessH9Yz{d>OvMl_w z3+P(v5D4`Sfx(Y3A2zvgYCRRc16RHJB7lg14Ll&cz+#&LJu$m{cj$oL!vOpO{F=`5 zyTE_38o&|)pq}}YJ#TT`Mwf!Z;am4_!K~~BMiKZbi;)m~7X$Dc*qv4~dl0nd-{=ez z2rl-_#$15vwZP*xL@W@xB^)kKYPf=`jGkhu(g6HB7vYyTitxXk&*+pD;1+wvB|;dNC5tmi@@ZKUz|2q+1Q4_e#jrd@(*%Dp*mv9ZeCsQ170`)}at-k5s>fEfPPt3$AJ;5OMo?uDVDjlK;st6e|BuEGV^ zO9RUWZsfx|wZDLa4wtz3BO~h%+{B>RyoSJc5qK^k@D4h8l#PSVFIVl|BM5^`V+%TK z*K&Xl)!5?x7lFCL_j7Op^U%+|3%c}I{Q%@{BXCq+n)AQ)5v@pVOgdyyV1cZnEyn=> z{8)b+`S=@duJmJwi|j+@5a2187J>LB(x|xvmwxQ5AB_*4S>mk%4)wa@08%mZMr0S9 zaMXbC*azEjcQCdP7~*as&}_ml!B1?SnH>*2fdZ+()))wPZW+q)X*QxZx6}7`ttPk@ zHH-mp3A{v0Ii%)a9R*zjRG?_NgjhDX0aMg)R2DU@{9t+4(!jL{+yvlfZr~GJ!AGun zEKr&Pa_=W`zlEK&agU4aSlSW+_OsxWH$dDM`|*On2SufgJNytD3tZ4&B^Qj~0w!l4J^kc%Dd*D7mrUjcSqTcDrBtrI7EO=8yI-6 zXI%lj2LAb(d%tC2@ z5csB_PAk`!VAOkbr>f#CWVZSTTL^5DPRfA6Lfg6!_+O-qebcfu3$FkG002ovPDHLk FV1gwr$c+F1 literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/backgrounds/new/nightmare.bin b/graphics/battle_anims/backgrounds/new/nightmare.bin new file mode 100644 index 0000000000000000000000000000000000000000..c4b8b45a7c22538e8b445fdbc73ac41ada5fa8e6 GIT binary patch literal 756 zcmWN|cR-W{7{KB8`|iMF$sH$45PmPn2IV44D?AP>M-WhshA0QpP9v=>JNuxare#@L zY19>B!+}(^j6jQqMO3sk$!;XXy$`BkFVT2Pwq!>mNLy5*o zgt&;o%`g&Ti6g1d7EgkZ$Z(QKw!|}n6jJ#=D{10QXQYrpCRt=#Ql3LDdE`4NV3g$@ zO`+i76pA?2l7=yy#_5cOaRkobOwJOD8IP9|!AB_*I2+Ef0+F1{L}3z>nZkLNw3kuN z`BZdEk+ZXsDlWjdkf}^#y7b8mF5+S?K`vz`)y$$~Hl7;%)KXIyoK`q6hk7m(F6Roa zVs?iG|p2<`x$DJ+~qO7IPaGu11=C z6L04Zf0f+HT`XZKmCO8fcL$G!upHM4?lGG0Wu?&~_i;a~cmRsCU2PAtnl-{hJj^4k zZSu9Q<58L$+aD7iC&&{#DYUSjRyLSC#nU|F>wi|*$R;+k1=`Y#t+ex;gXej{KiI*G z!b`l&E4(Uf<25>Y-9Z=KrS9$Q5Z>TTdU(r9^S#YGyvt5_&#ZW#UOuplF@1c{c&O}=9v`)dQ=3kNvJAr1#?R~|7tj`9OP z3di_~pE+)sJ%jwhuly$b&I$hDPX~YTcWu`{{0sk;_KF&6+SR6ZHR?4~bci}MOvAe+ z${iM=ks77OP>oinx^VkqNObEkjTMi?X}l(AqB@6bl6aGKgc>QDs;HKDB~8004jl0{{R3eocQU0000mP)t-s0001D zF-lq>K~f+=QXn}>7&!m{00000000000000000000000000000000000=$QJ;000c9 zNkl`JxGISPI9ZT4{8biZ83l}bFmd920^ggb~A_2}r!Ug#7 zQIme;pGjx7G8y2_``u-`iKE}bc3N|w`fT4RK`b=8j}`X zxB3oSrgib5*&91T3}jqU0BtxT!D^}qjX#FJhwW+ z&4(wa8C5fSu8tQ_`k=InybW>l^1~*PW&zpFFV8EEiFl^9be1$#!idb1>Zo*vxKafx z4}hXyEmh^LCXp1;*sxg+=TymzluNo^<>|Hqrdl~sCUYn$xSkB6sqAJQUdc6Gl8(Ab z7pvYQ6&K*QU`2*Jmad?B;Pme4hZPVn;MJ14ezeq+M3@S~{*ICWdGil@ z!y^-k;MVdN`vCnIt#b{~%%bju(%n;R=kDiqO4!ad6fK(Jx{(Aj^^Dgv6aV)G`$XEllxRVfnHN%yive3PdxbPie2Tw;6o2aXJYp zoS75lWdf>KLa~ok`A=6Kkt}HnV!(R~#1Fob4yD6K^KX~j`T{Nlm}}@3pQ*YZdC+Qs ze$91&l!s6w=mtMVN;DU^+e48_PQB#u4lCl+wocSwR>Bd6RG^5~jfxlpE*B(11J*F} z(QvrSv__?zbeJT}n{4^W;lmw;%#Xx~NnG#-F*J@BPr#k~R;m+DOks(DkH(ZWr3Ueo zFHlpxa#zGd!t;{bL|;bzCN^X{zPu2G=J~bs|ld0P4`XNJMxpSNK z1=uwTgn`^ccVX1QkF2Y{0mb!^w_G~`%~YH(Zh?}&%n^2c$NA&pU-5we%@lRzRH`RK zv&9&l7l2D&!)Sxy)n!I&3h2ng?#2aJD1IqHF<`k$F>B0t_azFhCnWVViB1y4m7smb zxZ0x!%B;_54W6)kviqz}>V&B%phDyY2(s-A0U6Vj{>3`0rqx9|rg@@-lkjE<-DH9Y zps%ld>N%gK-2v*UL^Gmfy4OAD!p&+G@Ye3=w6mN_2N2$utcU)Jq?U}l`IFW}v9)&( z$&V0~tfkq~Osq$q?BO8NUsES8zjzXahAX&^`#Z0SwTSE;^vXsOmyU2G_Mab!x{E9L z$nC~XtjXpNb9WcBaxKDyKnk~|mv8`riagv9;0`;~H`hgKjiqaeOP};H$T=d5EWz!| z-PJd%7~65f5AT9j+xVtj#RSWX@uF?s*4Roaw`lvGX;|iB#NbG45%CZ>Bdnfp9+Mlt zwTs@kh@(P>NfggMqkPrD)S0qV(kAEDD6q7nVXYOGKhG*h2E5Av){^&^Ja*|uCRs>PHqa64BP;AKtT zb#%%g^s<$H+u3$JjztTW;-vK)8&K4w4xs)|) z`u_r4Y3mKBv=m90lVm9^UX2|6k>A@t07o4bZI)q_IIjai{FX}hoF>e0^#I&@p<;I@ zd+6gtLhe-A~_v~4lBNGA-f?N)}iH&tK=I%?Sz5jQIJ&(y}yt>w z9=2AVGN=gF1@I^s7;%N*r@4$Ax?-$O29ZXYMC6|(oZYoNT1um~e7=lR|pY@oVVaT*btI~n-@T&9J zB2Qx|waL`Nrc|(dVxH+T(};yx+9B`apxT!%WfEycx#O^-Z=L5fm@A|p9es-Zlbf0g ze(A}1y8qa{iVhe-`L)8Q&BwjM^?iLAAl^iEB>|vU;&ojp{dyqn!^7S zj2F+w&{jxkJHtM%sYso_56x~P4QXZB;v$7yF>qAVv`(0s`C;0_p1B*4>!h6EPD9Ua zH~F2T&S2%ex&nqgU-@cFn-ACa@-DdTck4WFm2W;A{P5nr%kC%+K&#kz?|B^)Z+_LL zb2J`r8(`A|7wRmhwYi63);k=(g3CG;v7MvgVq6Y#|IHyAfHq;>0fD_iCk z?mXD>KNJ1i0NVk`Z>{j$M?h@eT-<=;q=J@`W1Oo-^K07U-R=j#%KT6hYQb<7NdU}! z6VbMKro8gURPoV*AXnW-9&qeoCVnmp;LaHaQGxiC==h)fpF$NM(u5HYeNqet55TB> z)bX1BS?@(z8{b>G7JQLkANqP61s1AmhPh%>H?c*x9z=$o5wAM6XJYQ8vX8=9bV-Z6(nN-|r zuzUOy@M{ej#N;J}+Lq>%4#n_1h%JeHXl$H-?ys)$*MJtle+Ed-TmBYs9RE@FCxGYw my!{m*Qr2GrvbX;g-v0sY4`9VKFUgVs0000Bs4$?bff>Ym2}wwaa9$*i@#i85^;nFN;w+J$8jI|2 zo}IWqvm{HgbU`$;49mvS&c&BwLU|^!!uT~6*(Eu;su(M=^5yh|Dy+(C`Ddy#sRnD} zR4vwKqz>znRP;>$6kMzqy=n%cK2zC%4T(l<%qDC~G-Dc@Go5I`mTbk=L>p$XE!z?8 z*?}F|iRjEsM%jhv$}DzcHqo6u*poR#FXpm0`w)HEkNr7-7|1~!%pt^34&!i+AVzW& zM{^7@mg6{{6NrhN#L1jOOyx9A=L}*dXK^-fAm(r`=W#xapxsF)R4J_bBViPxW3%3&6xScz=li0=G+{3-Z9o)w| zc^9L1Uyj_v{k)erz=J%*!^9CD(+f|H+s5 zFYsl)!i&5FzRK75I^O`_=dl~)o}K^2v( zN>F80QB_rgs;h=-s#ct8tB&eMBZQ4yCJwTB;S) zT5Xh}wp6=VMD5i<=%`NWtV|)QF6yc*p_{VRT|I=J%26+Y*JF|Y*8eAX@pSy|yj)$( z>#dBu@_p1-h3OX}vCMgyZF55`EfyJGwuFo4IOAG^FD1u0mbUgnq^!$CGyADj1DD*N zRm5sFS50x1%L6LAQZ%oBqLN*4{F(|*N_2Ub%U|8tjo^lE;8fQy#b8JG)x#qx`O)(- zUDtIIUE8(rQcc&OtLLB3buZ_@J>A3Ioeg($mbif=m%U%WDq&($oHFUGq=oZ}y-KN{MR_mbk+MpNwe4L;2vwj90&co+? z)=&Ek{FI;c6Mh{2&foeQe+_@-FCFt2@aO)_pZXK{V}IlieHH$|@B2N!3%}zlzU;T* zxBRBx@aynve$|(J5v~#{he{zCp<<{Il0tcea-nP}6G|hL3ME5gD1lHs6blI<9w9D7 z0>X9p7ys;^{3HB>ulaiy!YxCKkRF;Nq=jaoX=sAbI5Y|ki=Yjup?)Y(0klz@v{_r$ zMsl}mTZt>%wFBCzUD~ZZP_006KA0{{R3dN+850000mP)t-s?ie8U z-v92^|L)E9=Ee5rwD#Vt_THrS-kkQ;l=jVw?!|NNy<+aYTIRG$<^TWy?bhaB000g7 zNklc5z5`gCw$Z~Xvi-4m`RE1@(vav{%Tmo$B2#fF{?;>*u;0*v~ccp|- zpj^}&2z&!kZ$KtjXX}*U`hR+67ZByrluhAh_M7gW?w+0*gaGXc+k>=&wfl#MPfw2z zv3;bEAMj&pkND9&fA@(H9}nR?@ZoE~!?yqr&yrAx3_L{OWAcy+*e{{*o@Ds@Zvd)< zpPstFN9%n5eSpq9_s<4Codx>7&j7L>kEV`(CBR4D_i%4OZ)9t(^SzGp;N3&eod=(u za-fZV$bp&hPXix3@Ua6->|hS$4EL9S>BK+r01rL30-zb@1n@qMo)p;SsS?^VQm4+KmH=;AX1X=rZH0Ur5qcX#(b2Oi?2D9}ec07cXY>$FFi<~wdI zsPkzVM_w54Aq6JGQcvNb&}@qj`Zj42cFFT1E}QJ5J^GdQ;R8t@cq$TUl88=m@AlB{ z-kjljAgvE6=zR~*w|8COCj+vI2lkh=*SkFmm9lPk@*)*Dpj-Ly>Qm#Lqhu`(AOnVU zDtm$ZoVV5nuW#J9@byi|UAF6p`H=Tw@LT}aBLm(ii9+YJwjSb=Jb( zj0)erd4o>!X8$e=i8tQe?#z+Uqi1OYVCMJM%*;3WH@@AKW!VMZvdiB_pIw19=*0$! zo%qOtgx_zl`#K;;oIdi{zB+T8Ep?@jm-Ip&i1D-KM^`Y*J9!*>Y@>8-lg}P}gf?Ha z>K`ck{ze6~2Lt>AJz2wL1k$suywV0Xs!VPc@)m(x<<*NO@W3?!SKN6e;xMq8S77S8 zp0m-bg$f+g!)~)e;mmCe*G$a|iGI>ox~&HwCxrGHDZP%-E*O_5>RX5k|iJ_MD$=a=aOjEe&1cNXI;dAOxSMLw>< z2dN~mYmqHx)A5M)kv1BPMxfk80>oz-iQYMVvsi1Mn@|son9-i(^mw ztoDWH**p-#wdfdTnjGp`IrerR;j>@*7N)oO4FEv|0amryKS(CV*F~h^Bj*;o{T_Ru zL=&AqF%x8LkQ>c^J#sX8syxvml+BCsL?DhcF0Km}@P*J`pMq(7CCoo@KBkkhWakLI zehc4CnnkuA?e>()o0*}_ag$95xf%iJMR$vu$O(QqZ zm{8zS!hgGVL;!-mzjVwWGzclQ8d=aabQ|$`jIPZlS^#`{I)1s|_snPTmV#tN*15fV~YR~HwTR~Jd^${F)J`~zOZ zz`;+TH5DP-?P@KuWvmlG%k9{}jb1ZwFxcF;itRI-P7nmgk`1k$)$a6Nk?X!XK zfe&N&7Bj_bNniV;2HR=iWd|r9X@?&%SGat*f2$G4y}G6x3@%e(){vM0dBIuuYT>lb zeMK#RDhUL)~hr*M@wbNoCD>pjzl=Pt;rZd#m;13V}&*JJ-@W zEUAr?Eppy~7>b-1y&TqZr;+C7)R+jVl{I=bHvJGHI?CbnG_CfOCJcLb278 zUhFKisqtl=50liRe!1+Vs~ZP2ThUB}p{rps)vLNrMRZMNbsNgIrF2MwCEel z+?FVm-c^txL!*v6&K&pZM_KEw@TG&UILusMRDM*+hY^U6%bA>(a9oa*nuj|;`Fx?k znu!AJt#AbU-(KK68A%c>$Lh;d2Yjw_O07FjZVIqD;Iqoaw^%nJdw!a=b zBO3qh5k(bggZO_;9GjSw_*w*krb5{(^6`%dw7Z3qt!@6PyzW-!m6||x4pp61z3wPo zPSAfpo-waT`Sz&5B%CB!(NX`B?k?bu@Lr$VY3Zg-CdCqUJ?j)q)PDc+%-KI0(B*!o zd;>3Qg>Si zEU=Dymst;RH0UuX*`W*MpOkPU%t@VqSD04d)fOdksi%3kEbEH*@hf@I_SV^{m>%8h zPX}bBg<3kj-zzl3we4?Ze|ek&+gM_Qg~!EcIP~{>gF$NpH5 zyTxO{!Fr=VW{^my-zrQ?l~F7Az`d3$7O&#LjT0Sox4Yd&Rj7C4fu=IgLEE;vS40E# z96w@#iDzgl$?EhR%+D`5P?Hvp#@1F^N~J~2YSk?(KbPI36CvPa@_gnVnF3j`&2D35 zAxJsb+*iOflB*5^9o>2m%q=?PQuoxi{4|=RQmYhvvxpYXeJ603MWL{?q`fmP&^Na` z;o`qm6d8u;O=1{z4=fuQ*=?iq$Kq)6)if227BeZEH&oHm`k?WqIetcY znUX_M*fyUg!5?sPb+cH;B7BQix2TF_^EwizV@eLtT-KE9;7KgS+T$^*H?^ui282(_@)U+iv=EH<&=T6T7vcc0O+JKpmLjy|OWCd+hQ_H~wnAFQ& zLiWY7EIWtOl^ubOdsKF~%S&&?2=qjsGCDwdnaFpM0n7ZiQNB&f3-`w0}C}S#1Im#Oqs7NI$hfTjw1(z73D%Ge?4XA0VMJ%^D zX%bRX^EC_5+?*D)G_^8X(}uRR3y0L64ut5KTz8@~UFhoNSGtAt8{HFJ{Z0?lAM}i% z7rp5dQr~0dM5`bD8GsFB5Q7g0 z(KLz4#7uEDm1#_Om2w6%nPr-7j?G~%^O%nou#iP8cI7N#sc9LBVZ|&b(+XCyDpAgA z)|l3^&Xuia0~^_dXER&aYTAaoJyAQ@$u9i6*<;$vgkVCn_OU;#100Ot5QjMu($NTx zah$(RC!#oMIz_tEoJqbvOaI`2sB>^0U7%<1qL)itMpsCtt6X#S57)&FZqg+fC*9&U zcerbg|6lHz?(+aWyylJRb!6;YbKc?Cdp>yi YNK#mz_#BVE@Re_g`rl8fU>{-j9a=N1jsO4v literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..97cf4b73af4c1d66ced0caa1cf28a539f506a897 GIT binary patch literal 1511 zcmV003wN0{{R3gj(ju0000mP)t-s00030 z_5lCx0RP?q|IGmZy#W8L0RNl_|BDF!dkFt(2>)6L|4In|F$n)D2=*8NZ#0u{000GY zNklvbAO6vw9poC<_ofmykL07?M@lmdXo-yJ{=@NxmbCg0713a}TYfe57m z2~}XB26C*-d*;q#cUk$I z>EGB?sE5_S2C~{r(`#P%u;Y59j|cKK>AnHni)uRXeld`m{+Z!?6DU-8gk9EA3yT7E zNTOUd`4Pa|c*z~VTrLqY`O&U_;JtZ#&SBwJ6QTofF!l7;k}0~wPcG=KAnc$BaCT<_ z@8>M~x>xo)rmaT^L+|Xte-H-jjB&i%X8|?HcC&S`$r~}R2E&=Ck!B&5FHDKPwrjl` zP;wv33AGUoBz(#vS|06EwCdD9K;VOVDZ3SUOvA|U7fWdE6gDo3*HIit%Q$jZp@t-D*aI&xx8_aeUFxgW6%LzM z0<~ob&-6&l6s96T*yA+>zCy~+NFUCA*zMy4uGd^lpr$^g5Nevb)W2Eq;B1LD!z>~V zY|^wyp#y2g1o+zxvdx#kVgj?XIV3>h$ilpFLkFG@anUP*1K^g401kW_9^XbfFo(=G zX<#1%ka;L{zdsh(Z&a9qRtm7|lx0G<*{s!RoOj_1md(Q~V3w5CY`M9nYYScIivg7w zkmYp;kWbffejs%!%dt%g1j(WGiEb}$KX+tFE+Cf!cm?uI9swZns_~w-+HroG6WCDe zOd*w}PS22vSbO84HPXmxj{|>|o2Ab#U^7f@P8T;Z5L=OCDNp-P%$^{QT2hu&)(0dy+p(Uo`^v%lqtw)P6(*$^yzi*^M79eJ{Ukxn$c zSAjr%<8x8Y(y6x<3Di7XeV4|9-&<8F?M=CYeBY}es#4SHAis2~?haf|P)V2e>Vt4Z z{2O_G|2x?8Cm)@_x2*vLD!uK=#r)y~_vQTzYztSU5ckk_u@9)#J)yQ6E<7mgzylAQz@F!#TRdWL0`~nX#$;XpY#VZyQeCn0mz%#fQb>5Xqfg@e$Vh8YXyX-_d zqBkpzu_d7Ij#C{ZjLrn|F6UMz&>f!r@-D^ioYtZblHq9tyjJ1UL=3Rws6A`og} zLvC@a^V!u+kBo}dOy+yFHZ4klp4aDX4hlFqN%ztb94;?v;3W0i;FK^oYw~Df71taKrgSfM$h6(8(2Y5mAcz$>4S__A2;jTL?&v z(SagM%x-ptfHYjM^~u9^vnvK97W#hECL%7XzmKUiQBL{tF^ewGqXX^Gg5# N002ovPDHLkV1iC@&gTFC literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..225d8e95f306009a6aab40fd1a56d2f9e74400f8 GIT binary patch literal 808 zcmWO4iDS-n9Ki9<_xJ4Ceslh2#%zxFXOA)S#2n>ne$VV#5*0pi3H@uvXN5o*^Aq>Y$I3@y{V5FEL6ctkpDNYGW;vi9! zBAU`j3}q-wEKWJ%#KdEe@>HNAm1qTNN@^qtxSg|PO z^CoZcHetPahdz?umyCYm_Gdt*J5UP6&maaf1Q|*W?=lSMJ%*c%_sPYC7{N$J8DIEl z@)#q-95WWiW#$I?fbkwaWC9aSx?|)cCNY^Q$W%UN8q@L4;1gzQk546EK4TWM`5gNT zGW;opUoyvLF7w39=PO|WU-J#$hD_7%SjhJ*N@B5@^@CZkgry;Qu#DxbVC8s|vx?Q~ zT_f(=5biwIF*s?xO+FjU*g9-XW|N67Fh@3!7(+*krSNc6sL(g z!&$4-Km2QD#h&AQsF8E&0vCl#T;>W_g=<{r1~-LU+~y8004jl0{{R3eocQU0000mP)t-s0002q zr2p=V|J95Cy^H_VbN|I!|Gjhetd#DwTIQ@;)trOXlv2%mi^YRlv~zo`1befv000Q_ zNkl`e&b@$Zy`f_h#N3l5!SV{1zP`e=UFXotZboA>}ACZ33+*7G=5G zL3`Bg3$+8ZeZ|fEqw;N@ zE{lj?o&~F1gQAqG`z-rCQ!PpGjmoAsqB1%H{%-z5gVV17*KMHr!iU(j->wBXB`}<= zuSp311aOq5qR$pI1yweTtscW!QU}57_xoNPwt!CrZuS*Va+0)whHL}9NFWcD&4;1_ zKOh*VPE0Zfu2e(;<{F%bbAl1aYEp`lS0$JIlbsZi5W0L0V2)yLhT;u_MjWe2kszde zaLY-qB)efou;;+)fw2`J_qm=BsNGSJ+lM@M&5fc5O9mf4i}^VQ#-jB-I0?bpSgOVT z9GH1<6^Iy8dPl)=4GbevNW}hv4lD524z#9(R}9u7N|5)qNN55yq5>D~psh&f9U`$) zVvSP8W8*jKoR~LxY3F}jdn5Hu2yQleSM)O~c?j;3cRDY+-L3}x;MTy6SkLE>@O-B8 zk@&I>7K?=zBY$-jV3N%8^ZZu@b}%7N7l8}xG@|DBZFG>w6%QtIsyHGoqA`Jf5JiiW zCqP4n^!-xU6&JzbFA=q&nNBX)Qv}-avVfo7RyDya} zzM1QPe-y{B11xee`?%)mc45SO`p4`jUXocui9rSd$(bJac}c;u161=E8+##&4fX&OOe#JO%>Xh zb#^{Gr+vq-!k&R6_DtT%?Ntr@TX}c|HJ1s$Xav~v;4S5y)IcTjA#`T0vPtg26O0Gm zX~g;5{aye*R)31A!S>D^EfPxE!OhmDBhbZj;7WqKKT*6d%NrretMtVE1dmWdL$TPBRUr&0s<26E!Ci9J&(E=$pea ztR=)cTB$L-y5%8E9N5=jOP9s729dA<9K7alj^tKhOTEh_$>7S(@of>5A7UolXvC`} zl6wV$T#!Ww^5|V^F}A%Wkw7mVOUMEcPZWjEea z_3})@D+88p(}HyFKJUIMAVhRRuN&99yjbFM)vfa2&bF$9@BvoJ_hq2gd)L=&7sq<}n58%=|%f&M2uS`gn`XPJp8EDiq zH}~4JATD1Z8$A9EvczRr)!JHt*V!06n+R`wMkySjMm;Xj zz8~c5mn;}WE7|T268B1cagyW&ni4lvPbL3Sftd6zOlL>Xu8p+MFPaNJfZmb@fSBEdDuu4eX^jU=%qn@m%)5EsgH#)#s9{aMB-EB zTzHw-2=AT&-vwYEc(%7UjUbF9-AugVsTfnjd9`NHMtt)|1iY!LMN^k?juStNHsX{5 z&KU&Jaa0`y!g*wShdYb{MMX21yDsM;28}#>e6SSsh%3<7nFY^-G32H;C>M}G;TiDk zL@W^mG0aASa|zpxwF{glU;3F3#p)e-b15mhE5g{}9}NYY;vt`j+1R Y09)n$7PcOrxc~qF07*qoM6N<$f?~&hIRF3v literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8b34d893cd186d70a199787426bd4194f3c8abd5 GIT binary patch literal 1052 zcmWmBg<}o~0LI~WrY1i*?e}Un-Q8_^Y}oK&820Iynr^1MnU3kcbLF~RcZa*<%Jm)Y z`4^r*TDTNO7Q)GjvXPw}7L6l?5aZDVCNhc1XbMxA#&k4;RAw>@&1MdBNkj9P&jJ>rMJ#3sOVKixvx1dq z6{}f8I$Fy**0TX^WD}d&g0`}a?d(81*~M=55Vn_n?B{^ObdU@VaTp!pD91RCPH>V_ zoJN_P;VkFSc`k5~OXxCJxXLwjof|yH!UMeadHi&KKxQzT#`XLEmzR@Aw}5z+LX~Bl?M- z`GsH6eSYJ2{y=~77k~2)`j`KB@Tgs3&f;)qwX!+8b2z6J;atw`JXT)kbAAV`0xsx6 zE^HNXQAfI%Roo?9(xt4@F5|Msvdg)=D_9j>$(3Ejs_JTvaY1Kp&GsD6b(%HL^S!_etwmn!C0=SR^K!57N^6x@dyUhrwO;4--e7I?CU5o@ zYpb_;yLVVSz0143$J*!Z1k6R~v(x-gd%JdnZ^*QUjFZiM_ xS(kmqSAEU8?i-c@=zpo9xKLzB_mgiYXC|d5DJ2*aj82RS>P~z_;;n>?*oPEd4TAsx literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c03ce283bbeb982978b3c751f4cae35af3389e06 GIT binary patch literal 7508 zcmV-a9joGrP)006iI0{{R3mSp_{6hLMX{N+ z8?}0)2GH6aSA}r(M#F7&I{r9G7KN5E7vH0(ck8>-2|{1VCvTuj3dJ76f<`#59hBI6dJJZSJaTtWt;&ggDe{)JeJTdBeUa!~f^*jJKbUCizd7jtl z1o0fQ&4W0eq)9?Oo)mBu2mTOJpU?l^g}y2`z(J=s82G;5>w4`rH}4qfWcB=Dl1$d4 z9%aSa=W;MmVH}MJc-$w0cB4@%0k`QxZx{r@C>RZT9nTZlT7uT;^tv5r5is9ByNy=I z#~CfsQo?l<_%jP6ecLTmj>Y5Mrn2HV3gQIM2NJiQ zOeRS}89cAs;j?>Iy=L1r8t|88GVpp`r{VH+A(Nj{^Nv~R)9;1;mspZcD|?ea9Jx?y-o=M-q6W_QVB+V&KHIKzB@EVf1ud@c`k2tc2J zRjf+QcAdH{wv3a7{KLs+4Zn!sBU?HKd;;RFSCe?X#h%mru*naHbi1Yh&Epv~IRdPa z5Zkuv4O@&Ej?o*?w)98<2tPQ{Dfs<-v7Q{WY;ic`#WpWC+r#k;y z8pUh4qQ4GKBu-*kMnXN5be_y7@nn%<9nzeqT@(kg9-MbTNUNr+0?)O{En<3o|9-j< zxG0K~1$4ND5^+dS>SRJw*#MC1csv#tiobvfjVF`P665I&f*_fFbE-IQ7_a@y7~V;# zusPaUyx9Gv?Y7-UQ@vaajrwkh{rNuL0hV}(?+G~YVIuh0=yP3dsCM_$a6YANT(0NC zdL6+OlW%Yyx7mVKk%)~1@u;E8WIP)*fLE~_)mp{wK&lNO zPp?;+bGn|7x^0)PD7Fewn_^z#9RQe6Kd{BVZ{euNAmrI>)V6EYyE_|Ec(Yp>t;M4knsU#>uGb$mul6l1;bM_d|Fb;|6t^ z?&qK(A3GgyyCYu~pgIDEHH5n6Q5cXQ zAZ#dr37_5d4BdOee|T?V07Z|mpgRKKWS(x|Jb7BIMu=dr zI=tVXZ1W@Biq=R+CggmcBx@r2fEaYeA+USO3sVWkF#s>tkbaP+862NmfsAoXYY0Vb zLTv>OwzF6)Ca~XNL}sT_gi(ES3S)Q|-fBT7ak}3lLi#@5_<%60fOsAq)hzG;jBy2W zh$15PalV4s7j+8YWGaBeAf9gbtN6i}L&Q(RZnx*(-%nLSGRju)$gXR8M1Zq_V8reF z=ClDhpFr){atP+ztYbMs9$%P~)B;0ZtGZO9}(tj6eP6-!j zw%KX3O})x0<8r^KTeV98az5=?XhL({f?Bfj=yt9tpq3ON3JKDOf&2A(>kDA6?#evkc6{%9>W{CzbpbZ8> zpM4=IIv35C(QTr-rnb|m7(&V&JsZGdc1y}=dJ?)o5kr6AAyjo0Z2*Y_iEm=&)2TQ( zL}2oj;S{K$S0?e+%~z-C1h%)Lr&7RC588LjNbXCV5tkhLkqDSeb||?gY>R+T8KA7K z5*;2kg?3Eph+=?I5Q#G4TaR!!P`4jQFaoo|2DT+f7R8xo3`#gNj#zjQjAoV6ppoE` z?XbP!;8UGhp3Q8GnLLsTyERk}><_0~M4=;<2TCo<$aujExg~-VGF~A$os7p!z&ky! zUSVCT^`qO+q@n{j#*?9B*`TOAH4dPNINh}+VuJ}5D>*$RbtnYj0}!uTWm&5E;~gBr z{z+m8((g%{ft|8ro^OjAppfy-%0+9)QxjN3z(_IZ^)xGLwWN@&)`~)63*!J!7bdt~ z?-%JDnROB%C#p)yTA>IPi{}~z_cR&$UNRRe1O*S6!br7ME6PAB47A-CQ5I%-m6yrXUlcGPQQuT^Xp z{|TfuXE}hPaY8qdV@sE)xsaL1Q83pCF{i^Kki7ZjcS=bte4;6KP_M|(XHMg)2*}P0Z832tijsNNCN}pbmQeN z+fYtag}_U8`F8#r@azf=g5I!0fm`|AVpgtb5U$2Q*39p@3#6G)h@ z25pBT6on=c%h^9x{UI z=hQ9k9-9{l8E|a3gUVKN#p$D}?)q$e>w3<WALPU=S% zq%GtagC0tU)|U;krR(L2>PH|?muxqnfOTOaeBkdpG!F$#*2`q}xo$zYJ82|wG2pgX z-$;+CHJ1HeNbW2yuICk7DY{=k;vkyri;ax-c?~Ewki@OU4$@Te*eT%rjYW#O%V}oZR8oyr`uU(hdg_G zJR?2;Gu!>j=hPWGX>+t09856kY9Ta)C4bg>S@ul{QB1Mgv~9@^e)^ha^GTBJsq<}- z?LPC>nrN`5eE=Z(ATXO@zttbl99H!7gbQMIo_+h%2a`ordZ!e7qgg$>s&p1v$RSZ; zpl7n<_Q&&4uNPYM#m5s8qf@cTe*K+W)rI1!?`BnER`q*ohx)8*FF^Wmo&dgyOPsRg zpFX&h`e(Ifv|(g4%vaUkVza5O4{062cbrB`0Qc!55(((&qpNbO)jQ%H0oZ%o%@sqP}wwz%J6zdww_kzu`zE=?3Z_3!zO`vjH-(WIWz&C@q@o(IMaDZd2R&DtEYxUNJ+{t*pxdC@)$41e zjmQD~VQaS^LM3Li`m%KX8x8=G00o0jHQjJ|6t-=bp7Cx;Voh~9qjD>Jl}=@gXJc7| z9*aN_2G7KPKUur<+z-;xNo<2ye}9V@73hXpn`@!|j0h;CMdDQFpvN0xHjvdj;~=&q zjb>?dv9-7jsiO414=bE|5#9h zMn+xNfh#Keh?5$lBOuh-ynVH$95jOu_N_R@@DQz@pPvCIu`kPJ0|@VOKQ}62Q&8#ynIx*sxmvgood6F)d>|~;gdJ141N3hssS7kTK{-8`lI-M{7 z@+^V*A|htHSr@FpTKOiSL>a0O65_0z4Q+wGFXDCkT0g=wPj8YsFo`Irz&4NcBc4z& zO|xNES6Z82Di9WdAJa)8Cz2GVr)tA+%ui|-l_7Q1Qc)+9adnu%9AKxP*$1WUpj`6!sd(>54;+L85v_eDZayHGp;Y08T! z0<5b&?4GEA+oypJw1qHu?@C6Nt1MymTyJz;c{>k4+vuY}d%;HWopxJKh*h=-p#H}_q_a^8B7|B5e;_ab!~WtA@Xet1-~)e0)<^XaFT$86O#RS2!HVVev=Dh_ddw<~~kQIL2qrzq5>jxBH~9EdU_FWA-i z+k>Z3g1L*PrzTsKu*xA1J*U~IRrL_woj zN+wHfny|%}r;$JK7>8_=JBbL^eV_vunOD)x44{djJxP6F4zPyFI?K{E5w|DEw2B5@ z9edX#?UU(c!!lC>_Q>en?AFLgP!QFz)UCAlzB0ElaE!+lG}P2muBNG3wPpZ=8(V1m z#}j6jscT;=O&Av^EdWdx?9;N-v}5=)8m*dMM#GBD%ur?+K{OPFc7;hbPU&beEX#KG ziw@ek+Rtbe>WPd~BBG@&)u0@*j79@CUAt7JcN-uK1Ge8|SO>S89oYffril0h&ox$2 zW#mI9Yr%>pI65OoXpUT3!yNo*yO@KjManKb@HVMwtR1u6H*v*!na$#h#YPfNjx&-_ z$dBD&jW+{Tpb9tvP`XOD?7d3cHs2mIHj3PLL@rB%WRsyxgT1u7?a~n%Y=@b~?{<3| z^UH)JjBrlA3}<{}EE@F~hZ(%d!|aBX50tdd0CIAX>*P=XiN*PNz@ZPqL^7L=!vM9J zWxSMGom_7~rojOO;TWVHY08s)j~vR$i1KM}D9KLttn{Qq#wvX>VopB$pa$zr*byCVcF$0HC>jD<0(CjBks5l(SAJa0s z3E6W7#E`cN7P~Cj?UqYRwJ&u6uQzD6#)MhxhbB8}o6TMoG>9B>x&NSb?w|VA)$=G7SP&J+Ug?V>)ZA1`SlI!^)1Ubn=H%r z$vOdQW+C1qASCf(vpLIbB|mPDGGjqVc#u@7A>Q@Dcv+f30D5}4BU7R`8x~HT_mN`G zm<10~JRUd&J0M+UmLwS>qr819fa~Rsd>*0$EUB^Bcp-gFl0~`^yvqsec)lF=>oh<9 zZPaV?=7=zgsSg^`W7NV!*b>>3X;0QvLZ101+ekC>Qk*YXheNSF=KCB3${eOcz7^Xl zW0lCli%j6WLANFSHCuDlrbXLkz_VOtPX~ahMX+0#%RDDGX;)9uOub^@mY2&oxEV4UnPkTd4;^cnNIU-V^lo1# znOkka0OYWN07?d{X4##CSIeM54VWsTX*oL9R^(adWa3osPhDZPZ{>P^%5?1)Y_rPP12Skai3;_VHRa{3 zvr*84B}on7R*S`cUtU&x$Ad2b@f8lSCz4@+B-7&b_4S!|NzUhtgRbjgwE&B*ZN4%F8&%|N{_m)hO(rJ=#=FRhdy}Z7C zTxYP<+Y>j=F?IsB0*_`dZ&xBgbk@D+l6{KQD&!vKI$^l;@m?T)gnNaAFHcX3$T3DF zvl4vsM6!7%OWb<<_*ZJZaC`>lVKqYU950{Ve!pIHJ!ZTiGe=|`a)OjSk!qghSe|+R z@|DtF3oCm($XKW=v&$X-#dwr&0qD=W?#Zr8+v)~~a?DVui@+FOv zG^*FV^=_FB_s4)UwSwdz9Q}8`W~BhuJQ}f@>qr;1b1U8Ynid8TWRcuJ;|{g~hiNM< z$~{9eS=;U0Z*G8bGL%twPcx5!$z(^8#Ep0b1Hs>Mnfp7c7Sil{d$ulJsMc4bC2JKU zwU%PHf4l3Vh=JZ(8JLt-!?&v_rWTa=PKK`{TpkK)k-S0uOB$>iHF{yeiGowbUzu=xN#J6-U7hyso zJ^&`X4<2H3osrt${XbJDyRDC{STm^5x~SC&9|`zISA{Q-RWiAP8jJ&$d_RvL@kF5~ z<6_UW-3u}j4vvvXKRnz+*N`MM88`*7-~+->Z@|lt@yw8)`JZ93b_?!Gt+35^RbcT} zPRP|(NwRA}*B?K< z83x6+FZpUcnIw}jXZxcEMOyKihag&-lRZ(uzji%GOSaocLGlZ`GtSt}y$J6ecynkx zp3g(#Nx8NzuZ68viS>b*{~39!8MnW;{-wflSOGyD(pWd7MDqd!-qYw~x$n?6{+ACdXW!n<9zKkc%? zt?kc->-D~roJaMvd0*o0Ppa?_Qxfap!S};CNT8<;FBwXxiwgJg`Z!Wfb_I zYE%5f;GqNz{LwJx)p>KFLtDsoX^J}9w_szF2J|5wzI^7L*|OvOyDdlIa2RVhhfSPn;#mUc91VYvOh0493RrjXV}Di_$| zP}LOP$663DU6wv@3E220;DzUov_qtK5k!nC!7S#@8NCd9JRQ!wy2lG?atV-ugS}+A zvD`K@DFev+7oL_22{l!*F_G+QN32KO9Wx8m%KX+If&Yhkx-g@ zZKp0HR7&0%CNR(dh3i};EH41FI5ii(gim7@*@H4DmJ;4+hrM3fAGXn-%p>A42j;c0 z;ITv; zmrq)EW}rZ8XJ1nhTi!3hNQcmqB_)*hfVtbk8w}j=YK|?-%~`oEC5@1#1t(>$u6Fyc z>|y~~cw4=y_U@_XcL5v@X4pgEY~GdMod6(;BL1?{)bct$oZj%r=cW!UC9+iHs@sQY zt89g;$E!B{1y&-zFruw_&Q#pX;RBP{dT0&1Y!kgt#k4;N z&V+=$pk&UM&u-a87YXHK@3d0>B9^|VUjE*b=)A4-63@3-M+b)K{!8yI)NGYY5`fCCBt`y!=XwUQW3kE{jx$l>|HwSkbh7ofgpChZ%0Xa*mu+r~i7>;OeDO4Z zcs&mN0jMJWC*p@>{I?E>?5oVEB}SX6l~`AK(SeD};l82Ijo0NER4 zyQaK1NfD*q1v~r@;PiB5_veZTAo<_b{C?0HDe4aa-fvIZAVUuL#tN8HUe8BfmHZ*V zemE_(QYD;L{LimX*&b>14*`Pu6aL=QnJKxX`@}}{+a;490%ZIMlPujFAK#v}j$p2z e<>2Zc!TUeBf!?Ut`ORdt-QC^YUDMs&F?AhWaKRndo#KM);7;C& z3%)Ou86^eCMikK~J2?mvgK`o}E^-ryBM*5ADX6$`Jo(6v3Q&*)3XxG*@kJ;~VpLd( z6eEe^s03h2qEdtjMUqiz%8)`zB)Tl+D6galN~Ho7Nh3X3fe4kT911F2g{oAex~M@- zYEfI%p)U2PFB;I0bQ+1qWYC1Bq8ZI;K}*q!*0iCmXh(YzQaXr^bfPm|L|3}eogShm zz35FJ(U*SoXMh;UAO91@2)!ciWHx=d%5UO#u5gt<#GhQ_Iyb~kZgHEx#NXWEF89QJ{^4K#6aVu7IUr|ql%t(p z&f%bAoKucv_)fe0hNvdXX2)OT5&}yj))4 zm0so5@*1!8IEc%wIYbEX1Yyw%&hUEblH-sRo$9`E%&?@#jql0we%LB||&R&pp6 F=^@Y~?;-#I literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..364ee1e06781361ff608f49bc9903e12496f4378 GIT binary patch literal 6425 zcmV+!8Rq7RP)006KA0{{R3dN+850000mP)t-s0RI3f zIS_MdN-0Vh7#J8JF%UU95S*NQN=hI(VjzoyVtad1N^>b%S}|IKDHtFKR@%GO000=I zNkle2~9 z3`fnSNk?sX?zmw_urp=M%2T2Zl_KEbIfG6iJf*gDzAc^!I2_WLVVd}<_+t})Ex=K6 z^IxC(Uz0Ke|2YGG{i01gR7%fyFv&gx!PBSt=NS?XPh3y#26=MJq{C_8;q;f5U6wKi zl+IFNI6}#){e*m88iAkU&7WYyQYuK!0g^FKUH+6_PXnY_k?}HJ26lsLzF8e9j6tGF2y8KCih#21& zzONUPVk)HPeMx{M^?W9$cov|4rbaKK*5Ubv?$0OELy7E`Fg<>2b6yC+irO?`PL?J0 zHT1L01aq+@Z|i;{ymu2{Mq`q9@ujo5uJh3HHu6v6iG(A-;nVn=wNfExPg8T4jwgMl z4bOvICLbg|Xh=Gr&1%|tYs0ia)6KA0LSBY*xGy*;M4s_a0iF`-85tlMu)Oe-93S{D zXPk59BVv4aj95ZKe#)-lEG$Gx1Y<5sJl0#aMG~#m*BXNFWroMtCQMglZ|9wHtav0G7LqGiF0?y5O$hFlq+q zG*Vb0AyQ(dbJuUkE`aEIPVCrM=U_WGFC5Er9Eb}%<_d(5>Ns-BFlEBC2F$fwR`e+} zVSO|w90s!;XVbBnwGn&81mkJ$$bZT@IQFvR4|L&e=xm-BlT`OrO!PkG|4u38*VFlS7(b}kzpKGIsrns)&|$fm#)hMhfRb_9qo5#l^YWG>NT6xk)8t^ z#(?)-TeoeF?%Z;Lp7m0Wx6!&8`!}0E{`#gW2`*B0ME&{GI)O`v`|#mI z4h*rBg~t zK0o041ICIjj6b(|CGLK{2?p7MNeB3}ictRJQfUM;zxS)=e&_P9|H5g+aAnbxUdfRS z1!Zy)!Mjf>uJ09Xe!1KE+|_ktz1gBjmcLIBb-%{^q!MiDW~#ghlfC>yETtqoJTXhKRP6yz7j-r!_W+$OXWND^93 z2bQIKy4|L&J=fAF8~TQ?$1iq#mz9=wvet}g~DY!yhbujtQ{ zcav{eS3i(^8A9a&)0^PuUbj(1%)Zdr%uhvF3Cn<(&m0FCNT@FfZx!j`+UtX$EGX4n z8*^S0>6P0r6#V^rpZ?gn$FINFfR19kRDq$1&=X|P9E}*3Nl-z6LHK%7E3X7WEeOie zHVRU!rId<(|If`Ice(Ax4}Xyk(gi~F$uaaL6JKsMm9i;roGgG$1vrQU z|MG9`&+Z{e9>iCbcK(3pWtNiWO9I%B{0;qbXAofk`a_b}G?7cwKWujAF27X#g=bxP z5Dy4|r!{E9R{(fhW`&g?V*W}QL)>Y}&Xz2}V*a_J3);A(pM{K=^6$R%&9-yZwMC+X zxWQ_e34;#5{TBaiqbN5pg%tD~1T3KD*OR=KW)w+eAm~NkO*XK10hfQ@y8oLGuNOXq z6a6oxP7?BUkok)J67s>z53m8rucoWXtePyu4*|Mr3qQ*(TvB35JW4W8{`CnOU;R%Q z^n`LDJoASK_K&VUxtLNQy3t9Mm(rl-vr-~9d^kcH;00_*%2IMjmrsI~lYUrT@dqh? zAupipmpwPiP0yz#ArFIGur8UINRQz1t6~uNU#%wPboGo=Yr$>V&Hu{(^7dCz7}dgX zBEF_96TY4?IiXDw6%2&k)>lrW!A?=I2Bv@c?x2>dUyGtzH0^IK(;`76EQICPSE6jsl2M9Q?;v3 zUjs9$N6|TRM_P>{yQUz@;UU=^{mz^G)JT+`^m#aj4Qr91$uERASq@J*Lr_M z%GzNqiVoL<6LZ&FElmPMWV*1nW}1Z>5w%voVP1GP;Mz*PM!ua^`(UTFqXmbA6-mF> z4a4a7K&@JMWb7(I#_F5`EcD1YL4Ero^@=39Uu;z>8d)}^ih2~*O`}lg_j|qG!GST7 z@P^R~*6I^OW#yyZzx>_N+x*M=rB0!riFvC6z_tEiy?=CIwhwQ#JB34x4BzQrI2etO zWC_(*&^HaUe^6)}hS~Y$NOb69>_&)|ko1Ry{Z6NC8b-Zin)M^7zx$|lWQ+hq@?u0k zFh!@fW^~$Z;2EZoC5?K&f3UV@7Wy^C5AC40*4j2(ZR4PWexF>d9b9Z}8^+jlH3AIl z#Jc)U>!R7FZpQY`$I7THoz4MO6yTy7Y+BRm9b>z_)4F4rCd4fCZuPf!wvEC#%hZkv zHKi~_X|-rFl%3W`;jB#2ZKGpAzx8`_j!7>Dkq-N@a`c3x#)swTnR1?idCzP}izfDs%(aR|!x-uHp8Ry7}mh zOP!qxdYR-ui1g;HOoD$_k>!rjuhrkV7#TY~?G0#*s+$Jpsu=C|UD^IKm4(CF+h}^! zs*Fmz?Ao!lFts3p1cenNNjjig(lLR|1%6OG8j^07vcUOb3e{iT`g~YAG z=u!Yeg0NBm^P5VasP;Fsrko6d?6%UXlFZepHeRK|46u!cZKaXCu5`>p<-{oXLX*L8 z5>Gb5Pq268W~VTfcV5J381NGP%>b1N)fkL@QNvYT=GF{0q!_9PLA50<_l9Y<5Bj6I z9?8+2O9Z7<-leaPcdyklz%Mjpm!KZV#Vpeogs=5#6$RLaSIwY6 z+k_3=-B8Me&x_iv{>6T#a!6@5lQOJSB_M^5vGpb`fv)2*(N-y ze0=M$zTGbrf?C^c9lY`Pk3NzTZdE=8@!Ce^CZR!!@GhYkZF5_xj4P?eq4XQL8&))` zXl;#|+cqh<4FoeL4Oj1G#O+Z8-BED8aI0cee)e|tQ6KrI`kQK{Rrse}XtYH!eHsun z17y2HPOs(ORSi{Bg_9J@AmKiGv9eWt)M{04RPIzNZ&!cUZf$pDVml33*`{>d-lZf6 zHC5dkJLco@+E;3r7bFxm@~y1NpB7(E6@vKUKJ zrF=@6pCmj1c!!MGzJNSUOwH=R#w~?M3CXxSLYb)6>d4ZTfUPOOYP$m_n=l~(u4SHr zVMjxWhL^^Gb*}Oc3Ehs8;SQ z-BHdTjie=@JvQP*LK#w6TQm^&Ql%=B4+8uPGOr|J8|emlz(f+Onzd0Ngq10cs#RJ# zh!uwvWVK)w!!@&WWZt=Zm?aBPt0mW6xzcQ-H!5zLw7ICs6iXN~vsL8x_O?vnK?Znf z3xLq@z)+joT5y8^B_5D=+Uo00yB1`@dP4$k12IFUISnHU)ei6-v#MdiGV0?EVYowz zDhWGsfxLuGKrbBa%6}lyAQ)PAI@#>)Pey=i2Zq+J7oysDa}{37B1p2HdiO7`T`Z6H zs-!_{M~Q_txoI%XLrNUA04r<1tziM2UIA#wae&3IlPO-H#Vs5!5^JdL$jM}*iH>H! z7i3R9VLj?;g%cZP8W=*fjP{U(%r{wd*0On|WZ3#a@sAIKUN{z~r}a)QdZaz(#~zCy z!C|VbXN|ewmfSaxi0vI@`lwg$O|5dY>ywd!@EsHP4Y<91cN__03M-?wchA}S_cIGn z7C0h6%1&cInUKwCK-!}aAQ}orFFL)9<8w5!Lc1Ml=uQ|rqX4K%zin+13~{Z}0+W!G z(fQz@K-;?4f>)-|P>9RQxEDi&p4{?XBI<8#ZB<)Ym~6K)=1QXMwA$Fj)(^w6#>6}% zO|o7&JV1T}W*d(VnrUPkzEP2xmu`2)cvSjpNN7pJjbd>u1Id9=rM8DDC|9qj~xxqZ2iKtgm=gyCLvCPwt|RO zh3P^MND%WC$=>g8G`sQM@&2(E^*|>XLU;-QP-o;ZO6rKQolNy9roKjBOztJ3axU7? zV<(RHntOYX_Z~l{hsW_#QW)G)(Fv?RQC3#2O{iB>&n@Hx<5Yo9Aj^Sya>E(QP@ovu z#dC>#@;LddyDIN)s3o&4e@CpA!FWV~BhM*0Z-KqL^?qHN|0IXU#q1Xj+D1mb!Wge( z7NStg(SjLbo0_BlH$>&&s1VhqYFO&&>YM^LLb3u(W3>B6ZIyxWj6>$oyuG;FZFXOo zF9)p5%0amnVmsw&qK19AQeX3-5VogracK6 zOA9unJWVZ^QGf=LLAp&T7xcqrECuLd?4FboxP%`!_qtNqIIGRPLb_?$ztBP_hQvk6 zLs?JcB%68@mt;|6$z3F|!a^T>8jud!k+88w1g6r+CILzVy`aABI5c8XMz<2K*^rY< zy5NU&X~YdUMW@8D;arPZJh$$~)7b#r&E*(-Z4@P-t?RN(0Q)ILi_5QUe817PV*OW` zX|MSUdxNR|mPKz%>7{(Ya`ckFOz%f=CvA>K>wLiG`=H9+ua2c>o83mdN$)c!JuG_3 zUq*b>i%t33RZ2*&crE=rz%CJsLITu-Utt#Ko_)`X36%ny%w!ei%UhRTdU1Lk$Cza^ z`wSklnYK5MOQNeJRWrV)oJe8n?2S5GobZ^d+jJ6vstC}V2DBIl;68=yeilZMDW(u> z!eh#XN_#1cjy%Mqo)%Mc=#Xh7r%vV;8W9Tx!-*vgB6|~vl*e=lHZlE4Cs@dv97PO# zGJ#Dm{lEgvA#Q;|&b=5Wvp^`ofm4cJD6yl)XKIek#poTjaOsGUOGi97;00%zq-U29 zRRB3s^R6SqLSc>$Q)fq*^?Z1rZ|^l zLXdcrV5y%YGa~)~(6der!mUMlY;;2|u%rpc4p8=ly`9k{c9v*0o4Z`M6-9MjS=+UR z?qr(kMV+io$bt@>Ogl#^q2`d;Py!0DKP4|oQK;4ObmrMW1xe^&i7Nyd9VB$!v4m5` zRrnTHbs9@WK9TQ^ZM#Uyx;DLaExPlTZjtBaieNM2>f8!Q%}${bw=qse5D+vjmKmK- z5!_QIqvIRof7H?e9oP15)0cvjUB^00eIT0)TUkY4(18m8(i?hu)vqLHmO7O~L(^H# zyxVlZhV-Q>!qYP+TGCrWrgwi0B5kS3W7D_1q7ne#)r3F%S)4Q7ZsY|YPHF+KkjD>vi zj8tYr>-Lkx9nkqt_@6EKXh~Fl5sSmpqAc{aK(6wWrC{4g+(uI_RxRj1g09ky= zrvpj@#7Jp5#Zb_UPI;t@Y;n3QEMt-ZOdwUv0Z^`FNVXzzeWIaE)tGL+~Wl8F?{T*f5{?&b#;=cyoG zk`f>Z%O}JQdHN`!Sa+{#SPWevv5<$>I33&bg*q968#>T8pipEy)jet8JbLO_A9(r% zMAa#m%R?FoF?_kC!CEr3NIVL!GM!if^9Y;?A8_e_I;ZK7=(JJ9^uS=c9`PdLA4W>( zuo_6dB!5yBcBB4q$NvzS|rGZm^CliK?X~uxm`*RLfE_{@5NF=r}5~Z8uihN zOrG!Jq&Js`v6wE{K&m0c(gI(YnYe&n7W>PX%=f`Me>jBU6OJHE#Hfpgd_e~Z5w;{9 z(us|wH_f9CA}_oAgijaK#f6zAN^XA2mxrkfP5i{28BTg>a3<6j$fIJ=KrkbT>WDS? zh36BVES@bhDLDxmh~?oD@#93RX89f+%mVi;-Jd7-fGi?O24E{&SULx=v;=>qVtJX) zFP~}EW{c^fs$NjcMaNMiZc}K3`?NHiK}atPqBqtOiZi*;V8a7j<<|#Xz6lh zfPp+FNk>yg)0PG^V}}gsAh7^JNM8?Yhd&_eFwk_yUu46v6}2g8m+9mde#aHl4jC@a zz;G1M9(JNOoxx0Upt~3@mWI<#nG9K4KyF)dCoCxqPq=sq(Fy^Dt5fEOr&9*|pJc&F z3E9#DL(ZI8d`ekBW487&I$SlArVBHt-7*chI23&OEY5hy(o(`^X2g;_)8v+j0mIV* zo&+qFN@qHpEXxbv-ZOh>&usl)6b-8u7DjAkpI1RrT3B43S$uAQ3v5{$@3{dk$~9v6 n{3Oh5IegxL&t1a*yMX@#m*EBXKQmHs00000NkvXXu0mjf- zyeJ>}DL_F~h{6=1C@MyAVkv=2Qi{@)L1igNc`BfaRH8CfP*ti?oj4Rv4Qf&g)us-0 zsfX&*fQB?ejcGztnxW>jpe3zPYueD3cBnla=tw8jnJ#pt8|qFEdeRH^rVoAThx#*s zfeb=}8NyJ85e#PpBS|38C`L1ev1lCQnZQIeiOEbM5lv+p)0u&0GK<;FL35eMd={XE zEMhTB2rXq9%N49ZD_O;A)}XblV?7(tMmDjTEodv-*v<~LlU=;RtLQae=MCOOyV=8D z_M!b8;2?+4TfEI-j-aC);~m~b@9{pzIYHz}PVoW3hlq~I$0nP2#o-_Y+|<2pA8ZgPv;{GmX9a)-Oz zL-%>WLmr{WJmD$N2tDToe-ZqR{^4K#dzr7mNgUyj73ri-=HynCQ#jfwtyE6!7>BJi zPV00|Z)I>sXL4pMi?ceLvs*cw)47ag=XM_FwemT?3%Hsj^PzzyBVYV0O%>Sk7R zw{T0hvRb>1+q#|A-W}Z0ovhC8;;!yyb$1W5Lh3mcm literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..709860ae00602e9eef7700bcf5322c212faf2283 GIT binary patch literal 2600 zcmV+@3fJ|CP)005{20{{R3m9qGA0000mP)t-s{{R3v z#jG*3q%pLdDYTR+q?9S7iy)+fDV&QKoN6GHgCL887=vOUdvh3bVi;mtmU-2M000TI zNklh0pNT$EX4sL*(X31zC&#(2T0kKe3n=);6lX# zT!r)9A@T`~eFKwu>7IU>p4CGBc|ruz{-(R9yJvP*k8@u8L;7X*+uLFNF=KKS;4ib; z2FwPa2MiHzK_AMuF5fN+V8QzHwp58qgtNXU-03s|>lB-WEUD>q>RpY%8mfRl~ckW=b7Zm37>@00Ow z-ztg#ZiYb|&iYH{+U-}+7e-sJKe_OE)3cXsqI|#+7LtJBfcJ5|_HTvUaB>EE)B#ESD-RcOb_Et7@keQ>(i8nV&30fzO#YZ>YBUR30GA9zOw&Sn~R zwAbvk+W+`Q@*3W85YkVHHk-}Vh~a|pL0=$EBSRSi*)%);M+SNe!~7)6X3{wr_lS)y zT%E*sngHXYxD>Bb7?9*EEPgoB*aZaiZymJL@D{d%V2tY*;YA#av_s&D9sh|p{QzDk zS}^~xY22C47w@~MB?|BY`{^DHUDSe0jfc{C(JzWI7BE-Z5$;J$ZeLk$IxSjZ&wYFC z|2-z;jk+>4abs(-w-na=&AqTS1Tb+ZfXW_a`y`gu-{CPme`q5a< z7;WV8uXWa^1f(1`Ovtu_8LaFB0<$3MA8@&OvE}vC4_VERKWB^10Q1-SU)`Di#%>5a zbls6Nr`+qDS4lpN!?ec1#qi#Mrip|&^m@%2tlm_B=Ph)U01UK1CE|}E7eg>10AC5n zP0QxJ2D<|?<)4VqcFe`;8YAH4QXQ0SD+$8@4H1k?+76Wx6E=VzK&~(M94w-(5>?&q zE;ZT*CZ~&*nWt%%0&!9UE}%Ldslx_gDTd1~s%p|n$90arZ!y7q+=qO0|Eg3K!n8#n zy1EBAt}7`S_K{UoHyjRffde1D6YV26Ohn^QwAiMwFop9w<9@j%%NC~)TiK~G#kU)2 zr2mhTIN>HZc_bE*oZJnA1^eKYBV4j20INfoC_@~^Ow$@y$)yfarbr%yD^o2R3LmJ{d?->Mr zw_l;W^{JvJ7^{j}2i3$&DetlZVcut$w~m5e3x=a`LXQhLPn+l5Cmt4Z28I_Zs;)hJ z!CPj^E@)p+D9apWoXv7>sPtqDZg{#jVI}}~t_c!@TCH3P8Y(C9PN)tK?4@y}6HZ}r zAw9M$A-)zk;bv#?ZbCm4PFi}kB~{6942!cECzg*v)^won@T&qAQO*kam|rdHpL4BT zHK;h&8+3Pdmbip^@cE3GHDW*oINnShdT(s+9P}JP- z(MsuC?uTI9NE$hfAf&C43$8$q8N|n%yhz?mn5S?tyHpR-@D8i{W7-G zD~lzh4CZnhFW!v3gWs=13Ay@MTz3Q9r1w}U1C-B{y`$jo0l1;cjCvcg*r}Xl7x|pM zj$Xt>K$}f5K-`La)~?-MLx)NU^@?_>roM3?vnNgzv^q@BeCsqeE-pp`duO(Z7FWE- z8E{wv6)3Q9_274OKd^w%EV?E-lzvJ)E$P0&g9R-*j5tKEvN$4-1BWG-QMhzkS+yLZYlUW3gnJ6YDRzS~& zizRb@GPDVmD~jAKC58Yd4FSK2mFiyazI2tw5w12H$d*wZ4puIZ>wRB=eJ^MQ&@#|; zS+nTTnF|)+QCUqDFTdR8Gh&k694bJap8xcv#LnTI-}PP4QJhXk-h>uYd3}Q~zw8xVeuN1cGqb~7m$X5zMl3*KfXdLL#PMIG?0ymw&oyF3V zyQxFA7Z#6p3_U~kPJDzqoxYieJ9>2(wE;rnXL<)QIB&YS8)r&k7ww1Xh|u!@_*h8V zrsrT{u;LM`W1p#-Db2yt(vT#&lDpoi+mV7wTm9X70Ye|1U#)JSQc@<$gwalBS>&8{ z5qPyWfJ2~TxY{p_^CcRWHf#ZSg|*a*`#h%S%91%0B3N?AN-zOoH(2vgMk*idm_6P> z!7JcTd~UZmj!v8m+UIZs9>=>uppkkE2m5TR+u(h<>)B9SL>!YhLj}H)*^8%Fnca}JYSzb7MPG*+h(=rXg&%UJWu^dLaBH77_zOPov@>h&`1s{ zAnz@VvVRm(?6K$kF8k(b%*v*Hs7DQra1YM{I_pu-Tpp0y5iXRU1(=4;#c#bjIk;IH zgXl*{j}nVG0iOy(t&}ja@6q*F#k%`A2XdvfrJfXu3h)UeFd%pA|7+VhTt>iS_`Zeu zCLirP#wi2wyCC|Tf$nUNTZtjH$*uYZ;hXT(ec7ct$nC3g%MiX6b%Y@K zZOxVf1kdrqk20}kp5`N-+HHzfy;4^4+>QHs2*`JhLA%C>^#3Dc5GW=u z?aT_Os{eHNt|FScqyVbBY<)^WI-VL~f&3o;a_kPL+48d(}igIv^;Jn|_(1tCA=g&j-mQu=4Stt$T7>_0}k&$5%@spXtR2`g# zrZa(x9Q(^|iqJ->IIgQiN8Jx*k zoQ=-mT+ZWsbO9H#i;K|3T*9U7Mtj)H-moWVcesqpxdL6uu5cAsqieX9>$o1>z>VC* z&FB_x!y5cUV{3-|K?50df_4^#gLkD|vo$m2YLp5!T> z<{9)X&+$Ajpci?GmwAPlS2@ICUQ>(?heP3Y-av2i7H{(odYAWjpAXQ7e8k6mf(_lp`Fa=x8_+^dmpJV=I+jR&i`wp)cPLIbx%3Z`7UrTxwi}5$9?5~?(YE} zC=c>r7r9s-;t~(_P(>xtFc0?#d89{qU^H4DpE+*w|J|!S#?ouv?;2$HbmPUq+@J@?P34` literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..637b9cf5a93f05f59639b81ff9a52ca6009dc9a0 GIT binary patch literal 5861 zcmVb^P)005u_0{{R3dEt5<0000mP)t-s{{R5q zoaWxN_SJjM)xGx3bIsMH=GBAM-o^jkz5msV-qoz`)oR7wgVoh@&CP1X^35>w000(n zNkl4<5C>HrC7bfAnmW<@>cokpv z(B;Ln|2#9^>H8FS`y`1=`OC?a zRq^Er@!wYTa_t}Szin6BGwHmRP?S)%6)>%Y4MQr(rLS*p-Tbvri}|0iulbvNOvhLZ z4Dn;RJY?pS@Y{Cv>r6VV#g$wv-U^uE!!90)vhz)dKR6?bsX=y^zsYLaJ!PU@Q6|jw zA@*NDzNIc4QUZ54tsuV>+WY&%Nk48(tCu7e>e z6ILaz(9}Mdm3^&%nRH*Ek`z;Ahy7pE7~i(lA&33hyAzfSV_5#Va?W9leWfV z*vP-xQ`rHS$-IBK8nMbl%>1xvv)(XWr*Q{A%?5kE%_%CaX; zpwhn$ar|xOuH*MFnv7@sukm9x@Oy8aVP1jSpL5}-jLo+z{n+9;B^;Nex6hlxaQSv@ z>D_^|fA_J8AviL_-$&EmtVl-{C6|8dYRFKwKkakI9DHXW0p!NLkMXeTZCVgTxc|wF zxYTp$>_7Y!0kQ}_G9O)AUXi4%qNFEeXTJUBHpI;5v~=cL*BmUOKDGCM=eYJInowGJ zs1Cs5S9<^BZ)i^J1^rp;8GIoHePJbYU&da{|9(5-aXi^wlW&KxZjCV(PO6b4Oj{8O zYE@sFHwVA?TMqc|^k?1~d{KPxby0c0O;%mTzHC99@LRGh-_eZl%;qvr`mN+B%v{i( zMk8hBxaM&V_|vm&ow=BLOdh?f1XGp^K=Zt@9Wj#)UY?oK61n5@sm6kgYuf0XG9mb` z)#g>lF`0%RI_#$(Ga2tpHMKmP2*>ny_+!?RiS+ip$&5>y7B`FsJ>SkX?o1Zva$!Ng zHqX|%g+68G5c}$v_8Gi0hn9YJCUGt%j%v?n2P!_SPs=C~gbX7esLda0+<~(wLgiY` zF$wU$KVxRu{pyGI!VrzsIebx?L?=_Xy@jTOzZ^%CIbUxA)EX+GN}~ z`&_)-091Iuqj+c30hQlWD>~+OS5fl%7{&3hAzi)yt$58DWG)+IrrdK%>9mr8_VAI> zVSIDmJS~2b*+L9wPaL_0f&YvHBCh?is^V)18)3~?#NUJ@wf*mE#TumLQyue++@+k; zMe$HLHd>f=Om$vPZ8YspVPL98h3v3}|_H zvoOxP%4hh}^7R~lQogHCo|-?YC1SQ36b#OTFWZ z`BOt!$2y|eQ7iAr?{5rNi8;Sk6fHRw&z% z5?My>?~f{BaH}Q-b>9|+=AV+^+L!L;yg+qhutdxU=E!SWE*wa%Bva8Z{=gjbRKSk3 z=OH_=3^|(bM7zNy3}_?K#L0;F?nafEAuJx_hWk=|nEtfpI5Qp+jFPbcb#r7Fb>BV^=1S*}&#hgV#CC0bz+@etDifO_IWt}qMJ=TC1*&xK zMrz2eE+lw>$_8rDQq^TbL_BLUb8xvU)EeVqSmKn}F_-I`mglx04Gb+D>?u9IN$e@B zPheEEfU#(45JMA^!!-t)yYLb2Wm+%rPH_%Dmuu(i=0t%XbDMlP$et6qPR`7LZqE7Q zQtVcZf{CCVuCW(SO}C@?@b(Ts0)Uz2N6IzxVm-?92~HLu_~w5>)7CWbbD*M${y_>R zg7&Vxe%o~jNs*~y;}l8d26&-EciiXT;7GVP|-hM$H%Zq2pm~0P=nDp=9|JF-?mq-OC!ldIBP)M8~3|H z#z;jA`NyOO)zX4QG6H@Np&5Wnd%7TkPVE1q|7&!0z^Er428SnguS2*&tuMzUh_#& zbWGXOb+O|fyi2=fGxo(?x^+P~ zBb9<6rE+`(*FEfp0~^1@MNHlCyLA)aZopOh+X&Uz&rj4P^It8M~jiv{rxw?1>d z0&#aPWr@vugtbIUs0y>#67XmaxfVceRiAqrk$D_0$}8?QtS zdqCtF^N$v%xkOue2fCBnzCei#;?1miZyDx@KjhB=@v`t`Aq+Oo{dZapdL z91wE??LCY#Zu)vAdl}iBYzY}<(qC4q72lllmX`Z*m9G*jmAZ}^S||rVEKSPNt%^8U zQXRHVFL6skRLg2c-{BfPe?4N+q$iQc3PdTB;*9Q#=fZ7W(r0!RO3buv`A`l~q%S1J zL@{7l7|#T8&&~HZmABs#>WE)FD$Nq@W+_33xT9R4b{`QpC2QjD(E0eAxm3!Ih5?2_dI^ z92W$NsX{3!;Un^CWGrBE_qM^Q9v&34ECO`k24E&eUv;!`|?;OJkZU7zEC`I(tJx&>E$FG5%bMUr zBq}1_r4U4R)i&F%@vx^X@xa(sSOwUO=dW3;S(SqMCBcVC1S`N}rB3tqG4E$aD_3q_ zX}+S!KW9g-B4GqqXxK93s$!2%f*7t)?!+xNKZRVcKa-!C5{rly&9Lbv#IPSh z!CIt*aigkJ94;)Csuu0(ny|pdJV}kqE-Q5>H6xb}2UFzo?$_W;#oM&>mfj)6!jj|i z?7W0v7B_O)Hu7Bef-DPTRCcAv5d>qbp9UagyrlW50K{YwpY*4>1l$_0=L!KzY@ot* z-zYu|`kzr$6h&-`MA?gS;?ANwdXEG^KLK(A21nfHf+ql*t%${tH(C!d6E46aL?6)s z05$Hp7diwGj+BL6iK)fz#uz37i?+vM@{C5q&mZAobiTvLkoSaXi86JUA2*a7m0SFa z@LcnPKygV#Mkk8Nj!ol`#1u^#p+@6?h88GOEL-dH5fnD91Dh7QSzm!L1)kJmuWPam zAx?XIFW2X{bTDoYMQdBN%J#}{7Xr-gqO`Yi2(qDAl!DiIAmwIwB4p6m2rO1#p6-PX zBiAo<9m1n%RbdFah?KyFiCX2TtXGbdB8bS8j2cErk~-UZ@jGrfn?W-J4JY^V<#D0; z45MF=5${5@sv}kvL=pw*gV+3va#BB11!br!2xvTy^HX@+E56>*e^5*kVuq0Hf=zB;S>Wm!JyW?B*Z`63uRAHZvY_8kfV+7ID`Mh8^O z68+YK-v^(ENP(0wDAa=S#opEtHoRwZ5d?`FHUKq0Xsu*NqiRL3Bt>WspIu|6NQFko z1FBRw>Ff&Fd=oI(ky9CFPi`$6aoMt9qd(# z%&JufthqL)O(GyoBsXDfc}g<~Q0H!C%3Zuxg%M(}oq1>?hyY(aWFYpGRnVnNMnGbY zE=(Wat9YM7kX9_YhkR9-fVI@TK*05iBDI~Q$S{99PLY=)i3Alws*Tvlvg&iDN|#D9 z23DUv0nZLz_5cmg*(z7HNitvn76SandZox+hy&{7=qlnb0HMk}K*z;`CVgIQBr6r6 zeE5_p7V+K|=iq)Ne4?Q9H8oc%-uA+xke@_XN!Nm8Jv`ANRcdizr0{)PsxiJPoFw|w zjg&TBkmVk}1a3s9$~VahxO7={-3=_7m2B*?gPf7Zs~Nodte020(Ki8dMB;P_G7)r! z^p4m0f+MN&5Jg8m_XCa_l~vLciDyNqb$MnKs}&)AH|bTEf0S zjZ5L`xNflf8^2&jJa^{7(Ag}y{R^t}q;4pQGOIKO1d z%D%EAvkQH^WK;GPMwv`A!BMZ9M%V~RyM?3uWnKTSvQB6O&D{d#{=ze}tMC*K816S( z!~I_JS=d2H;=u^Xte*Dvx<%j%-UxkAWcx{$y^`y7 zFS$NQk|ea?HK+g8*7W}%XlSEuT$t1#2n~b zOm(k(uLNtC-{j`>9e_nwYB+% z)cKM&lF(Y1CE-oQ+2$f!Q=>}?ij79sE*HKow3d!31EcbBa~ZI?6*ud(;&xy)T5&>a zaU1^5GxcqS%2#L>3a#b$8t|wD-&{)N!Em#kxwA#u+|CqQ8w5mm#KFzQ-h(z=$zX*& z+Z&;+_6FOdO-xs7t61>w(SSMB+<@7&kxkdmX0|}>N8UzK_Gu%DO>Lyw-fbjm$qUpV z<&7@r-EEC71oz0;QHn}hJf=e%@7L&Zc%zFPOQ066*NVHdqZJqNT5*Y2X~hZDWZrBR zhPF2g&)1uUQp^|I(JYLKyEY32+M4gJotg297&pGJhHD*g?;{4Atzu()t5}0*f`I2A z1yhyL`;O^0TF1hEhak3^*~YeJHo-|mQ^8TCF97X()?9Bix3?$Y5Cu~+(+57rv0FR7 z1@P4lnlv96F!+H1*|%NJz2Z@r-HtSD0e*+WI=daZr~~eGoJiXDIMHs$LcB7|D;{`~ z>Ia^7JGde=AN4!%k*#<4KC&fj9!6Zb-gIL4C5Otay$_WMbd1Bl#Jc>^Z%35}@&+B} z5MJk^gC?^#GyGwbbA#Env5IDEFOtD6iK8q{BM?=qYI=+FnUa zICN;|^#HpOI%3viDLDO8t1|aHI#%>rfOOyqL^Wn)+umHVFaDSgKD`zoKk6r4p+kQF vbRUphQp*g@dHO5200000NkvXXu0mjfv_DB9 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..cae5112e003a1b2d5924c329d59bd2231481a186 GIT binary patch literal 996 zcmWO41!ENi7>3bz$>>XO+v?$fOooC@X43W@LoYBP~)RB~+U_)TJJ(PXii~K#gcj6PluC zG^YjGD2JA`qBUwmTiO94+C|%F6KWl;qGjZSOnW*IC`m^;(V6rvbfudLyQ3cTq!+zW zA9CqS9?GYHe)J0!M1JH&-%xJ!iQds44PYRJ3_^n$LJ>pJForXNkt9YjT5F0aL8Xjg zEaT94CNLq!hsMR&7!#$Tk|>UeOhRQ$W(rf$G^R6ynIvX0Ticp52hF9Nc~qeJR8mDX zTEK#+j;c^)%#Vtg7b=g1EaEV9I7e_KN1>xRhGRJn9nT4z$VupA7PEw zRk1QwgqFv$SQ<-0i{lhda4R=uFPyY|bJ5T+ZYClwlX3wXEYp)}xEqz(zKq zO|daH#KmZRT*A6o8@iOsxST7{m0ZQuT!XIVIx}OJlkcZI2Ji? zJ9fph>KU7^dTSdG5gSd_Q$^X z1bxb9e9jl>OTOZ3zCqve9pCc<`jMabnP1Sa{KoJ6f&SzGfAKf^hkvQzAUedMI2bh{ zImM|?vkpYMGn{GFa+Yhmj#bz7T;C0x)zAqy+TO^G0058#0{{R3eVcu=0000mP)t-s{{R5h zoaWxN_SJjM)xGxBgVoJ*&DEsl-o^jbi{9S7|JAJS)oR7nbIsnI=FMuw#EaV9000`V zNklp4ba0m_Z2Bhjwibd>{eomRrTt;`|dsW-1|zBBpi&fOl26KEaAb&vGn*E_VMjw ze`OzckABNOU%zH^{w;32lZ(e5(=cYV>&whNjDE+ftfuQ{OsWGKOT%={@Jy!Jok(Ju z-RNEUj(xnkwaPxfeaEqiS8%hdsQG?JqasH8LIdF~?)a=L>{US4J|-qHQ%~9TvzZv1 zT;1wq*B{1;?4PC=ox)Ar``A(fIT|zA4n@AmKv0Z34Z1^QezQ>WRD?(9t3 zcoM|9#%;^tw6;4PO+0oLfM=Qpt_Z-0SZsO{W0y01j487-zhgeHoi;2V zXLncQ)Aupp26y<^^iW{kG!u1%$pOy4ZWx$miKqY+0XEF}EA0Bs%s`rb);I94tiNEl zF<_+c7F`Cs1zUba1{R0S)|+*VMVnhs>)#*TH`W}h+h?w@e<=q3$bN9_ zr;OXY?QU*U+<(Tog)ig2?&0?GeHUYV%8i%sW_Q|@Jrd2qA2z*82Tfo^%v6vu@7S}` z>~2o^n*E){PqQx0m+x94ev>}V-^b4{bF+H+{rZ!w0Vy*8qqh&>F`4K+?a54~+12S8 z@Z0j`*j;Y_D*q@fn3~e)!8_bh>WN~cDSxEO@~e1>C6k$pZH5wzVd^do!Ny8Y8$SLXyI~j8H*6Yp zEPk6@d6hek)h3=>NfY0tAK@8^g{;SXaGG5$#=72Pzb$tCioHYG@QnYGUGuG`ulZ=y zQiawz-VgWwQam?zlTrRiudH?(1ZQ)%J;xp+wwmux?DJgLAK7&qfNwje*m$5D$w5fE zAp4wc)iZhAyDWZ6im;p!uWlOqa+J+?iW}ED$Cd`#Cb{Ax@7aH0<1+xB^POVGR4*nV zAB~AMkHFL4FloAuXUwcFo9TUcg>`Xe1g7SJKou;uR%8lLH@yB#jU_uW|VIucW*Ld%eZa0 zjkx_CNb(TgiuEETc93WIH+ub3L-@%U zRg~M!pp5rheVa>LpYGv-|FI5t&HV+f>pcSwdQ5qi#-ni4F(_mPaar1kxCUm*+HATB zc$F9WfUt+h3tGMKTwz~9sJ~{v<$N`5%oISDRsg2J>T%SS*2f+*Lj+1~%?bv(fb-n) z_5})U_4s_oEo8XM(C^rFUhwhzH{kL#TP#4bGdh%Xfhrol2R(^VCU_}$R0q5YK*ero z4$1`BRcE}CrZU9eGoCrc`|O4SuZ%<9$Z_;9aa(>s6<~a+E~*0XYIn2hOyY6J{$-Ot zLgiij{?num2+o`jWp#Y&Cg}li=vkUzQ=e%gz`4S7c4@u7+z~28dsV`{0*i%$Op%ho zmn1b<ℑ{Q6GvQMkV$wS!nckZbr4b|1wi}!n(iDz*JyQfn)X+qaXU-#zwsWo1Z4j z(sjIX(}???65v}_UwoiW7-Q6Tpe(|I(SXud_ovqN7k09E)))k6v_)8I zj0GN|&|?vM6d{#!?84c7ct-11e5c_6#b>3BDThQNy4l7Ioo=L2Qpca(WOJ1?#Ob0a~gxM{Vq8R-tU znnBHsYJE+-`QEhAp7k`%wMhGn(EzmHSi(HxZEUiQ9lf)h`jxi4s4f46UC&7%alMKr z(qQLovmnf&c$xbJh+!zYxm2tVLCY)?vzI4tnnxGcQ-2MNjVQxU*$=A{%cK(vt`$fI z&Y#k^@k%E@@B1TujHt9(1fmyRS+&ZZ?KeM&!uNY_Yg(nx1qM zFE=|TuQZxULpLrvLZhq#1m(h^qMXRKk%=R3FCRVgdFPfl7xUefI+4c0tZ|h5ZP%dU&OShBPr(obj& z|Fesi>gTyWJ)1?MirgayZh6O6d^59MSGp{Sh&>}sZ#X;bhSgV@5*-Tm3+cM&a#~+t zZ~t+OMDbx8+kcEBDX4NN1>z9V7V(gRQ_eK|ZLTlogQ1i6O}TE2Z56yquAyU@DIZkk z{sBDp076$#e1&zvq3i-nN0&{hbAb0=>jG z?tK_x;#NXVXWzcPAQcCA=R25)db~TQ8tIS{q1Y<~nbFwnaQYx#W{SKk+@SS|lriU) zyqgm2DE32e{(=P;BX#x}i_K6ND`_LEkG%p1rSmyd4#@0LA(@7mdVio#%E33bBX%@b zgUe=ndT;i6AsG3TCEDc!cu;AhwX8S=U$3}6Ss}Sio0+LEixPre03Mp48@cK1%5B#u zpX0b`V_c?G+AlST?pB-89*xIm#~NChL5PiEGjX}wk~p!4L$Zzj;&e3Na~b>lK$b^~{nD2+v(bTp&aU@^ni@Z2J zmW}S?Bf{s!)~`8$+K0En z3$q7omX`W`-T=29Yfb?EvWpk^c6~1k`JVUQH`^E5#8_-B3YzA7zxnj|3`f#t<@UBF z;O3N_Q*89!W1OP%-e=rP+lD)C195EtT3hFg@r*Lf>1g5^)MWKlwqpB|NQzJ8c!6kq zrk|saK6BOSw5j7JYhgjLSxk=FRB;=^Sib`84fwj7cueYx!8`&y{Ux^o&Y8EIAod~i zU9?3to>{@YzHE}Z9=;#1bpSIUUpn?(W72b_%JWsSaQm3s2@bKikAp&4i??evf%{r9+Pnoy#jjcqre+&zv~^TvI;% zugWKZ94345XiZmBf$;ftHC4?I?A@+6tqzPw>M`wu^0t3#>@qy^C_h-4`Sl3!)H&SMwD1{KO{)H-vKHLy z23q4uQ}0t02{$6L{GYykqA5e<%1|}msdTHq*4A3q{n4?NscJs-NYh?sqdJEE9)O|n zx2ih-rix}oZ+E^-RMhOcuZ zm{e1Gc3I7Melb<(KDQg<&$7VtU$)`pNB2}TX7GHnvD{-rRuBz{U@QQS-g~RN<(Acz zzsR2-=eui4r%r&w?H)DZNlhs&$9JnaJ4sQvWml_wTb-+QfS&5f`f?Y!bwM9CF#=a4 zznSVjq0CNog?O!+E59uDZuRMv->4^K*`xZCiP-Fjuf{_;3f>~A{y!ozFLw3;B1^TP zJ}k>g;;Te~$nWo}Y0mkfys9QPZoYF~@ja^YYOc~#`T!!PgE&|jCNkj@T=>tv!Ae)2 z=Z6a29#v3Ds)6n|58_RNI=ixIJ}AnL@@^H}v^vT?!PbhtG)Am7$y#-3Os@==y}`@K z+gkqoZHNdiMTNAFdOQ2Yz&G#YYt@J6xb>l4)`oT6lO@(B{REhmb-fj9 z{odv;`t!BJ*$3O8_J}m>IS9wh@8N}7ZFB0Ama?PcTYmJSQ`Do{u&kRh#X9+4j;MaW zoY3V~ZBrj`O4HR^ZSCjX(R=>Ztyf-Rs3%k9<3ed;!D3Jg|M`FLYQCfF3~rRd(6?rOo!XiU3z zvbls*xVV0VXoJ+ZhLD7RYuB{k5jc`Uk7&KsIV?+>;ys&$Dh+BCO}q=HT)zb(V(GpM z`(9+3-}BNZ@)2UMeCd`=LXzK3Y1*(~AEprD|M^lc0JZg`|1-WjsPz=_vd z-(M{LJD$Jr$$|%#utSH+LnI{m_th0`GnoLHgiGh0pe~hlRb7NZq3|PW2qq>}|AVj~ z&VdA4#QClgkH>d#q6N!6#MPQ|??iO-h+l>~(TsRfL!nIxGMqUFgKU8Z;`rx!97^zq z``#-WqbN4{nxYg$|K?yhL;U%>j&c?$9T9GoWqoXErW7Q_{)nomz#DH#Ql$t#sVVzw z?d0M)*XHN0Ps3Iybg`Oi(Ujm3h;WkZ11I&R8B3E?|47)b& ztML!_LLS2&11i;-T?%eeJYb(*!E^cuFG?fG@96M}vR&GwRD}S=LW*daN9@9I63MWy zx5_A;NBo&DDq9suBRg@yeU8F>ri}&;Fh|%8({) zRChIh>zEn}*@aDt3IP(;DH%(R7j~&zL~KyGbUXQDycB`Gz?4==lLEY^5tYKW6@)0E z(5NTJN2-)q)m%N2Mn(p_JO3zepz~^tYVpc4CHj20coqg?f$m;P8tfISt`A2c z*&!U-IbOoE_!cZ9i6RvFR!s>35Q~1i|6w0RRipL847Od%}y48!3u(m?vtJYpc8hqFn7Yp z%1{V?ganbtXtq)aY(zQ_iv$O|9#B&iLM`iT(kUZV4(VBN=296B3}YwmIK{B-gz5c6 z35c8M7cxtiT7>FSf@@@uU~4Ks*<(9}z2CV_7~k_(dK(<(h@z~c#c$C>lM_M@ye_v? z*0R|wxOE9)TXG!RvM`_Rgg9KiiS`wm_C=*~NIv!opfPvLwv-)o}HJu+$3(o7w(F3l^zV^R)S@ zO(#X?ib_=01R$Jgp;9>)2oR2zJwl4j(OMJmBsyUfw;J4ryBXO%j)>~y9VRAFtsGI_ z4LeV&P*_pgg2u|DueMQn|;rsJiOqo+q68i`~$9MT_iFzsg^Xt&}TkKf~tg4KPMm z9CZB_#6FA$A{eL^I_PT4n`+`vr4rnckUSSq%31+<(N$68!oEPk>cL?dG4x>Xm7A*6^nqHx<&QF1sTP2ER2Rz_!Ee8nDYVM~eOlrek1P^;?LTDwT&UdHX zrUFBscmGV56R7h@b;xIr4M#Xq$g%!D{wW-e79>=wUJ%~HnK}C{~qHhuhv@Uu`s~q;Y$$KCLYUdS2 z3D&h4%})t64Ve>?LPLcPS?rHcz-gP0)GPcwhP7ZuUIU;Ok8ehjuLAPtYn3%hIu(Ew z6a=JV2%eRADL5vp4Ga8px2jy}^}yh=Mr~p~Uwi2|7a~6@?>v8gM;3%83t=516{f1^ z3#GE41UwBY4Ffs`Og;2{r9rnlqT(hqoWs zfE;B3SV8ZtwG3*gP}u3yo(o8B_CQlM8^{ViaLy-Ttb|P zXZe>PX=(b18`SZS@Wjhva9Ex2n=7u^)#wR|64qcQ7C>N$)&B^9jgQg{Fbb^%r7~4F zr$)*g(%d-@*@C(>sY%U*TW6_L9g_u>QX}WM)Iv*`P|fVt5HBc1vo&2d6G$g$JkpB{ z*Mcq})h2X>;{GKPTrD(|r-lPtcxpm7;74T2aPp+zgbQq5m`1tDE+Fv|R1!jtNO;mt z*F@^dsZo%H+CpwyX_v~K^W8!KTgwE9`LI1Cz>CzkX5BoNTdCP`pa7Nt{J;gQy@Zas zfW*M8hR!s+up+o6L}q{j zgUY+JkW?pxo|=;5-FsDK@Rx&{cyDKlJubTN{7VQi3Q(O1wHmc}8VNYPf7E(JRIGxc z?3}EpqNJ@gfB90tR6=W^22`;Sb!(r2hitk6gL(y1{AT+KL%wJB&JvB@-Vd@&N^A!Zgvrxx_+c+HTg6 zi9NBRUrZ$32?YZvB1oo+PLqlGt&&9PLxEu;fyzB4Z7oYnc%6V!eK<_Zpn+kLDIu|& z0bqzuUsBbh#$u2HGa>e&ruYrikBid(1t1YAyXVP?|5)As&z3CHTS4cWR&@r)rv8dfwzqNa*L=L)PjrilwMct^W9?mj^}ay z{|E5@`I29o=36AI9 zVzf2&C%CoRTFYDifOQ1V_V9c@VzmJeFxGvV$XN5Vwd=a%?RYhNUoE+kQaWHi#x8MV zEmBm5E-#@=b|RyU+H|7Kc49lvQ#6T24WeFZM${cISQLS#LD(Dx;Xy;NOW&^>X4sqH zo%OWn(s1ucLA%f%j)kpmx9lkLpo`Fjcfn9Eqm{pAh8up8Z&&eD!ONL$pY||QG%C3C zSgU+rO>)v1WFb{=CY|oMBo$caZ%95^L72MzNGDKIw(0`dVvU6t)nX92#7Mpf{F}Lac_$o7qJQ!91LY6 zqAYRCt`?Q$9#wGRR-6b9h7+{>de4vZJm-1ixsVhfNQgYLj+}hLI9|_)Oq4cq3&@KR z^9q$}i=tkLh!-Pa$XC?y@?^4c)g~ySn0N`UoKljMxLz5iTy6!bq|&SKiYaPGiJUSo zZb~P~xUE~{xu}XrCgevm`^)VK`HtUEZz6sy6U&-tyJkI9=aUmCRF_(x-xs1!XLR`sJ)H6z4%{5%hb>ez%;6_G^o4A=g6=E4(UR<8|KPP4O0Q^A0T$-sL?xo7mi_g7^7Ai55Q0;e5o$Y~d5} zDWCB$a-tP!TS=mwt)jg3XM3BX8f)ie I6KQq(A2#90!T004Ld0{{R3hm7Q00000mP)t-s0001L zdy86Xi+hWtdyB@I2u000N% zNklU4I5Je0gDFDk<0HYNHkW2+Yf}MXV3-tM#){f~KyK4C%90Xq9jV4q| zdmhxEEB{s*OteY|x|1$hZEloVve*470Vosep8%%}_|R<=JPi0Q>&FCm5A3x`?uNj-%0SK{+aeLh<@{tY=?v=j9%4^r*ZKT=^{nv?M z`;^PlI6Zgl=@ib1zfsDB(c&FNU>`fD_8NGQw z^Kjx7omYzHBo-QYMQcVXBtFSpckz4EeX6dqWfj4OghSF)vHvo>$7E6Wq1l`1m9@pq zi!_TgvvA&C-lSpJdAc8?DQvriS9VJ_Z|bJ(EBmlg3{T8?w>s&Nc^-JS$}C-W8-@LY zbwZ+cT9n_W+_OMd=8&nclPLU+^`#zg#=)ziEyA{WRnz#J$}P*wksFO8o|{<)pX1-< zzT0i~i`?+M7lgm39bE2wIoV~->;7$OC=_vdk!4$KSRVs(uC+7+3kd0K8v5TbDy7DZ|qKs~> zWmV=DmAyxeELI2SP-`4sT(!Dcn35#YqDvNEg_6Bpbn!ukv&!4_U)(|}@l7|pDeQi=_*6x0!d}EuD*c1DnrvD94g) zK7HscDnKte49=Bc9X20x_#oOH{JV_O0o7|-fWMG&XT0dU@Eo#tmis~hoM6cxJ%!1Q z)TineWi_R_PlrN5hhbPh&w;6Gp5K3jX4*!=-Oc58ap_J1F&9`BviJ4S&+ z-`EWuhk7)CzMLEw#HoZMSpb!Yso-V_3)nm2cf*L>)qo3-61K8~B6*i>xcZl;b9V~4 zSLdLKd^9}Y9BjEogh5Xt40rPN!D#!eFuV{mkmq25p?b#q)XFO6#jVwfd+m+EgdStP z_scnWOMEPBu)$Occ#FSAA~!(cRa&2xmNI-2 z={a)53K%_qK{9L7Jc>tKD_q`Vy>Im}hrl#w(150_^-+B15RwhgK_1(#l@7t+@B;_E zksZU|+n0{HT?MnhhFgxHsMXUAi^ClH*RH4oyP)+@378Dhwxk|Sun`GMggin+fT!t5 z{%Rry3^@Bx6+U7yBr1ePR@MCr;j;kr1u;CcC1cZs{WzDOv9yE*Hv5jS=KQfAfbDDY z#rYTjuPNB)Aps?AMRB#uXHGA^xgWP$fDN;XlJmhai#|s_hnvaR1+NTEqCJ|=@5203bX;CGs zFhp7Jm|!v58%w`p5TvRjOZ4;4U_=JFBKU?!7}CFxXd6CI5DQaB=Q?yDVoG*1ylQ|c zHX~BCvh`*f-q5E7kM!AO9RK`A%iL6j$ekaR3cJ`|g2eob?R;($@P zqe`y%I`s$)^519)izPI`A<87^>K%aIMrv*|{->Ngm7~9o6lcRPbt#`akhP2z^&NYo zX=BJ=6<#bc^T&@b!m@rZnknAF>w%+^)64ew|^VI@_}(6@U+Q^zo727C0SEB_EV@PN<(TH~897EJ+sNrK#{&j#S~tbFYIyp-ZY z9VO32$t`oZ;PGryumUaP@S$#!GvEk#CWZrI6j_pCrac_G^j?kT2!>S(m@68SaXrG; z#m~(rfKjykRp>dMAAEAq*K|txKvIH@Br{kHq_QGiER^lrIqs{tF;YXqNn1i)O_L?f z_z@!6*gckQ+dlvIJm`QycN+6he)a*zO+?&(NZf_eA723sG2_-rs)I1y`3r!d(YTeF zpv3TA<9`=mR0htFdcBY3lcHO2m&h3FsuVelAcx~1E@jN5965qn9LZ70(Nu5@$0EmZJhPdD9pVJp zcp@j^p4`xBaSEp*mCWTd<{?$gr<&6-3#efswPNH9&SVj1VV%u6oGYW}VV}uEz)a|1VW6Q-S;xrJNBk=y9tb~>@|;LgVCySN*<`v{sUgLG%z*$=vI7e6u}#Uni2Vh zA%0~KWy3Z9KYQ6{Dy$KH<9AQrANWW4Q-}UyKaOvJzxl`1{p*<~qDDRHRT;)opGK%e zYLxaeMy;_LtsbvGMv2vg{958PUUUFk{hA<}sN*zA$BRzTFv&VGpef>{YRIIiKV35j iW-4w_RI@Z&1M22TX`<$8o?7ip(#hgXQ9EA?B>W!;y3VWs literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c689f9009605362d887a4e9d21f1eb6c413bc058 GIT binary patch literal 2243 zcmV;!2t4004jl0{{R3eocQU0000mP)t-s0002y zi~q%H|HXslG579_)q#fUKvV@0RY6F0KuQ%zSAmXc zAfs~!aj=Ws#V!ci=S-e5!9#q}i63`?#SeMT`8Et~J5al(ZD@b{WxZa1Dxkqn>-7V) z_4=uTR<|8o-*)G5^j~)gc$$LE4w#~dVgNst2=41PfWsTXzS&5C1pcbQ3c%ir!&!r~ z8DIMYfg79i`qP%c_1D$5eYHHG-|`f0n{L6G|+=G+bE=LmMQ;H8Hy zEQ+!W;x8onG1>Z0wvw|2^B(l52MeF?6M`EK5jvp+5QpUm@pK&yfB_9epIv;)5TC!0 z$PnZDsjSLv9G0Q?Ap(d14pUtp{4Xti8FKC9zi=6Thm7}iUGuFlZU)(_bn)alZcXK} zBV9*5ToeFaP65P^Re)djAStXrj1fg>E?n5Q4crL9)7SHjU`Lr@h&u(s%^JAP4#7Cc z-)b%A;_(h02!PKFcUD;f<(y8g#bNB{V=@bJT=A5har^OfT4S-2O}80wA%S& z_yvI~L|2sYe{gB*+w7EPE7VsQfb)yF#|ffvTYz`U*2$>= zeTW2R)@`m8tgqm03`jq_5MZs>%5DlukK*v{Xr*{jASdN;5yyr(hY663g&J@Sa7SyI z2Cq}_5IS)R>H>;g=;y8a{V4-Nhzgvp5HNA23kw0ChZH0aLOiw+^j|U)L%f{@ZRIDOHn8iP1oSx~-mj5_YW)G}YCHR2nfju&bQe$IaqAI~aF{!qupN0toMu-6 zFGHUzIdmh~reG1l8+jn-K?yg4jp+wR0TwdN8N~nQ=0ylpz`C9XA;7Z*!;xyTMe|W; zTP0xaDB}dYCSXdo7L-nG4EW4rjMtwmXqH(T<|$a$Zu6bsDS|4(qm-lLvgAV<-C&i! z0qtKGQgH=jG=%B2x8pCkLbzq^TgnwLEQ9V)7_O@TzMKN z%k2ydBxN7ZwmCeUD5?m`nJxjx>oa8UlV_3Ew!WJMjkgocmZ4yc$)`heQyO+GiCQ3Add=fX>CY(TRAh6-w5(B zw}b4q9;^b06s|zA8jVfkqhUV%=Wqt)7@H0DQ6fc8LX{z>Er&pS6`>B=Rhb7RKocTA z^3V?9s*pN|ct}02NS!f;$Z=i_I3(b-2lL?g@+@)MojZW$`OJD;;?~n$DW%g9SXywG z0ik?`d5}WH^VtL}Gu|9Ha^Z|zj2=`Kb%_Pak(#)9hmE+D4_x|!|0pnQ-n^<)sM~an z1Q5IPtP6Auu%HN`hR2|E5mb#L)Z($pfRM6Gid*=;?Md<)I5RoE4+YIVjL)hC zgEGr57Y+8E7Q^!F_%5KBR|9^VEjZ=76v)8Ok0E81b{)ZFxMB%Ngs*?xF~Z9!({-x% z0i2dE0NC#7I+~S|lU52A3iM6QhRZNaHRz?iIeNH>2YnWs={*|FW24@d)RjHVSa34| zUm3i_BB?Vi56Y+}A##NBjw`kUpE&r0;HpGRK@n9Q>+;tz2Cz!F6ny2HRue-h{{Vy- z6EN40bc%6=t*9-NU0ki6eVYT)9%C>p#mmJaDQC4|^fs=8UD)&B!h^5r;;z8vJHaJ_ zA}0GqZ~N{o;39x`E9&)G#h5%f@Is=&C4o_tDH5yNP7ZkEpg^zi+qp*yaG}l1$)W%kcHtWBImL=8h~w%kcGt0)BSvPIC1|DF!o~5m1Cn3{RO7Lsf>R(D zAf?OTjgI}v#;!p6d!y!jTy8Z74rz;Pmj+FMiwt<51>=w?P%>VxKYm<9aB0C?cn%BA z923&vWpKS%JUl2csX+sVU05%z2lZsY*TY}gHMq3kc}!E)HK?9x2wXl0_?l}xGX7v` z%;XOl$-@_}t9kG)pe{fK9;$tvzUm3H55Uh~zI-Q$%Kl)%lE5$6{(2K=CvoCY%AW&> zF@6>qwDSaPlD^A=UnY&gfrmN`a005=TR9Md^f}*dX~ONC_co9x-z2`I58=sBy?}FE zlt1~RRHG9?;*Pl*RHM86@DAF0=jX@+m$?G(1j=|E4QF=wu!a19;5!dKe0ZloE=d~V znUhDAg2n1b27iQD-%r4snsn1Y9japC(TE`a8$rtXPvmC6%qG8Degk|RXV-+u11oNM zG%9ZOVFtY4@?bhYQjmvRKpE#4q2l)Gn#DPVb0EW@`V`4IxVhu$fY%EknW{cfow_7eD2ST~QHa7s zQbZI5q9`VcQ-YF|5~V3aG-X9O%2R=gB8Ey-rizHADsfa3@p!0C4N;R?)TWN8OFa^( zFB;I0Ml=>pXi77hix#w`6|F@Z5@}02(Vh-;q?71O7rN3-bf*VB=_PuTL?8N!e)MMm z1H~W)GlZdH7{eLCNHL1hjA5)8$9N`?EG9CE$xIPbnZ|Txh!nicWR{rC9Og1l%x3`$ zStJ&-grzJK%UQunR*BWDVJ+*#dN#0;O(K=eY+|;L%JfvkN z;5^8oP!4m%x~<7DN5wIYbApo|PT5Fne8HzVBhGS;^IQPGOd1!tBrX%+3Rgq8#&sL3 zup8(mx46w6BJOgJ_(aEjpVJ@210M3om+)9T;VI8}?%)M4Ne{$WBR{Wr%^UQVcf98V s`bY+!_)PK_8*NQe>Q}|N%r^($`N2;cWsTRD{)^xI;cvjY1OJfz13JB^$^ZZW literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0237efc2866ab3b04d2a8e651172f838a03559e9 GIT binary patch literal 2106 zcmV-A2*vk_P)003YF0{{R3XbEJh0000mP)t-s{{R3n zIfE%Nb08^d7$9007*Zf0N+1|PF)>OpF+nLQIVmYIDJdxc0000000000g))4k000NY zNklX-*MzN62_6jAOnICm}CYdGaxmt^7E>kfNCCeuXi=;asbl$0`SWF?z2V- z+>C;{{=ROI0Li(PRBmxd0POyu|ABH&WcN3UTLZl>e9_sJn<- z(7+VCd7Hw*@be}U(9C@OgTQ1GXhk-YSztBLBlxCV;2Fn`ud(fidT{bg_N!~T6#@Gf z!3X~VV62Gdq89N=3~~?e1X>XaZBG0EtOXRjm)~1}emyH#Vac^5j=+j6V%?VM)C!1d z>OQuU7CP({S5v9gYJ`? z;;}Y%;e!$*D|t<00aiAi-e^mOYC$N|wK8O*vZ|trgH~+_{z`Ncn^f|$EdGvNvtzFX{j&4pCNphZP)V+WBIJgZ5NyM$j3I0B*)qHZHjU-U$Fo|& z*IL}IG={1!5m!ZCMaPv~y24V-b_(c=SX33|RX~(w&B#E5aa~L91XUscIxc6Bja|@1 zAFJo5&u<2-0~uuodYb18F(okSYb zM0RkVs=H8yG}9OG&w^sa7@0P4v~<5GV>(S1a@BrLUUXJP|Y>WnjBF1pYrZm*@sU*8)5GnsZ=0B-1Q zIP^}VTohj$gRiE8V-MS*&7OU{4H7az%i^~zr1czGowaheAjSv=W4fkeu#4hz*iM2? zjh#Sx%LP3{%zZx$F4=A)i*UWx@LTQH=n)u58eAhwb3C{;WPxn8xp4w?3FW& z>fJE*Qk21RniYR;6Lfet^?3}rr#_0?12y7D-st$MUlgAqSbKDHOJ)h|yRje9C_0h{ zkOE{ofjAP~YaGMCZPMV=(=w`WLpRbbfJYU};m{{(p__;TevgZ-#y-|l5W}cz8j-Az zI4Of^fF>(SBoI!HxhY>sgjgAHF;Q4nox#CsVAWyTcWS9L$;!Ae<(T&Us1U~7W7tE@ zjfzl@EF0W%9GT{YDP}QUS_pI3L_AbG-4jFxH0YyWn@&px$fweWBe&(N**u$Vn{K?K zg+ttvtrh>e?f;>gxbLgHPu%?BO@)5`Qr+3U7?j1;Hr=rs@jPd&IKv%NL;myy^juXC- zI4N(zY{+4M*b{hkBhT{4U%yecH{ni~*URZJj<-hvj(TWu^&i3A9ZoN=kjwq}vjG!% z(U+?6`%&dR`~@(Bzd53y$?c^|NYZxk1G;AD>dyU*~ma{x8nPlF0oo6Y=@WW3IXaY7onInX-MK z`LMg^x)0&VDbG7>|DCP8JWH$($6siEI=_57pD(XZ zE|nQ~cwGoTu)oan^V5{MFJHbqKR?Nl`uzC#_>ckj5xDHL*Vq5R^tWlckrI;(cxV2d zwt2_TaijB9UJkq{Z|z@f%5RpvjoNMl4R-t2DfI~Qx!#Erq!I2!r(cl=41{3@;v64!uhxsL0(0o=$<+{`VJ z+{$g%VLNw3aVK|K@1Q|YefPp(=pN>9FCv0C?n^GUKbUoZ2f;%;%p*LSm&bVAR%Hbn zPJkzQil=!dnnkMB+8=O{?sm>o>*Cqq`Z=B_F7P5R@iK9RS9y)si5tAh$M`t$1fS$n zyhS|CXZS2{6VLH^zQ7lWmw1OS^A+MQ@9|Z>M!e4Ze1mTiZ}Dxu!*_}I_&z`2hr~zx zn4jM#>!eb zD~}?mU^KHB3y(FKBetvu6|IuRS!KkdidD60R^5Uc7H>7J7E;0k*0u!Zu4BoG=u+3} zS$&IWU=6Ji1~f(nnpjgyvSdq6L1wBov*v~t*3w#8YeO4rYwfJPp@Vg_PS)Ab#kyKI z>u%^_JuS_88G2hE>udcC>DJ!{*g(S|8*CXi#4yx`*>D?S7-^$yw2d*0wQ-hd;|&vR zqD`{NhAB4HrrC7E44Y}QY_?&J&9!+p->|?IT9z#`EVd=K)UplBY`Lwlm4;Qe+Sb@w z!#Z1U8*HOtlWn#ww$-rBw%ZQdY1n1EZI9(x#9rHH`-8*-L4)vvcE}C~DMt)P?U)_6 z6BcpOPTA?8+nFE@XYHJww+n`gcF8W=6^poP*X(+bc_WyF5-P4@Dyl+7R5+AgNYSAT z7F5E+0?My^k;*$6idPM&x~i$Fsz8+$r%I{_ zxujUdKqjh!%0uN;R%KK=J9N90O2*vju5M6Qbx~(^f;y^$+N&MZR&CT;t)P}_q2_7^ zr7A_qN`jiIi5jaB)KCpnU-h86O4MXcf+lK$#w!yVr?DEN(aI zf#yT=G*@#p8=9q=nxW|-P196O30t>6r`e``VY~KduX3trPuStzL6@jzr+0<4Q#-Uh z_U1NdtF~yfHifiN8?-*`-r1a6_ZMY7IHS`#l~*TqBJ5FC>_5k$V>+rMIt(4sK^@RN z=&oMT%en)-q!;yqo`;^(Z9S`Jpr>_9Pw7eM2|cdIbQ8Lv>$;|^&=pst1r+@Vi^tb-fpLzuSq2KkJeuaL~ z&-zJK;Z;0fWseJaC9mjZ!z2EmjUT@}}Md?HbQVr$*k;8+iRlujh4`V9DVpXO723VgCp@`*kHKHf8ZoR5W%@zFlYN5V(= za3AJF;X{1C@AJLz9N*)+eHVPE@9^!u4ZhX4_-5Y(-{>2By|06>^)006iI0{{R3mSp000wj zNkl=pNWhl_d`SS8^N;CBKV-zrY@#<)hIzU~OeR`2PYdk4EJa@P6tFS^h7; z56s^T<+Jra9RHNVayR-Hy#7Ak3_p+ioQSi|x%`if-hiE*GW_ZkNpA0lb>63(e*yQF z+t1VAY_s#_bzbHp?!%Z|+Hb&bJhXSOGv9c-w)uB}VwHivPo$rCX!9=sB_+EUjG+I* z+xHjXkFxqCWAt2IpY7j(=t!fTCu2U4lz)&pa4JujWU4h0kGYYz!E3Y$rB&B+#k}E{ z`pKb;i~_<|BhFoJ54*Yci@5t{cjF#C=C$=PnYlbey@U2ES|^9NcpZB%d&O6>c7GT3 z&*QrTUVXoh1pVrio=X2N>mMD8lQOynn5I0NZLix!pJSe<@*7J@wWw_f=6a?V!F|K% zya(ne2dm(22U&?Lclf%j65-vR5eJhZvnm?B>45u>a>eueBds<(laI!kWG|O^SJftU zH^Em@+_hItH4_le3wM&gj^t~uCi~*9bXjLuFencE*SuV-M2_?T2dDB%OPQwNF`sk#!5ivUBG)M7n9brk$~&Sc!^}G*|ww9 zL$c&p!{wuw17RY2#>XT3i~`+r%axtBA*+Zs6j02r+Bi~;il`oq(5x2M9A-7?A5c1= zn$V#JufTK^a0BJsq$YfAsQR1}0P)2fpz2u|A*70sJ446so(u^XViBJ?bifdRnMh8^ zuvP*(kPCPlmz-*h&L7T47r+oFK}rM+Js38UK*%AL29`*lVNDf`YD|orS-?;*Ih+-5 zc8!RnJk|%+#)@>BvxQcZV|iIqL&Hc;AW$%9G8s6r@d&090DsOhn{$DH0_q@*LO~f+ z0-6Lsgq$%k>{y2+0LFtuMa1K^gPXu8`W!p}5ud`eEvCSqn9M~1!4mPLDo1sm3<2mY z1`-%1yp+TxzQzhyy9tHq%aOAJN>GM=F!W#}_$_D0P6VJ}3c@)8x*S2EdDMz<_%&m4aa*L$pUjbjn#mRfamN zZg~MBD`Z%6;_%?8Q--MK+nqePKTY0A@-9F8PW`1ylgT%n$nFd@|&Moq+fUL_|nHbh85TvB*1Wt`4oikjXFr zJ(np5Hq9Gj%rLw+enFN zmZZIc*%>o5Kch=AM^@BuBcSGtPgRiCMnnYF5d^@ZfUGA@0(hio1}pG+4wJRVMBPV@ z+32_(urq9n;kd?-dsLYtUORHgHHCXKZ1Y0sSGf8rn!cN%EQW#A*R$Sc&YoIPM%(d2 zLq?05S&Tfxk&yDztek(ea4W-}Q1X_({Uf5m!x7DVZDf1_ws#bAKj4A8_2PR(F-QLbd_P7{%Cp1Xx#aZq=KawDe=(Hj(0Lr& z?~IR-%IDb;qC9f)1^DUH{3FA=jeND7fWICyo0iXu&x-#mz9uY`F98Iqc$mt0=)d)!|k(o{}ky8sK@q~h57&MsNH}+`26FUUk6$pH^YB(J9Oc1 zYi=FqkXHZ7s>)p-nlL`28?h39n{=TIdbfQh%M5wH8p~}|b$3DX(x1loFzydfP$!ma zUktk&MRDIle47})+*aZQ?TApoN3ciQMkt?V%7@qT(~a}LDxvG;AMSvAc2NH99z6U% zW&)aN|F#Hj#QXW_4>tmcv*Oc~jeoc6=KpFXW!*_9*1-B+#3WShMJpbx)dDD)HzM&BCx%%ThD}cIp-ufNG6S1IkBRc514mqti^nCqZ zI-og&uc@9EBO&+%GFbYje8xw|M_YI3XBIXGiE+WBGb{oyavt6vn5Bv#AnMeH5XjKd zXkY+TpH)KS6r=G2z*U=|MqEB1qEVC~yOdq66%128objeu$(U^t0HG3d4UX!73=18g z;^{IQw_ga;#U%6yiw7V|FT224F!-w%bW1=c9J)GhG2)$DN)P}Vh8&b3Dy)Qr5qr2@ zcAD58rG~XWgg#5hqnIHC>Bk(9QOFdi7l##WOvOejKQ%MJFn0q4A^Ym;;WLU0A);C= zD>>(b9zda`Rv`?f25PO~F|#32dBfPDa|IA#$WV-s09m>h&5u3S|$na_|skRYiNPVwsUC0eE^u$5$`kK3AqY}6Tw51TGtq~Ykpy>gI zWxM1;uU!!Y11CS^hc=Lo1S%+~!rX_}S&NZa(Gwa`qdkL&NI)YJ4E5}{Di_|UXjZ)X z8i=JSATIYQvTHc>B|~t~aVZTzufD)k&vdMWfcOfP9T>X&L`Vb-SJ$UP7D76&km>Zu3axR_4WYh!4QC=LFlvcQ(~ys06?V!hK82?f%CuCO@9!<3nlN*)hx(FG zG>py{5NHo2uK=(VNe%1FOR1)l+>v{8Qz^S z0b36l(@|Lrr+?FPvU13oq)mdQ-GE(pmIokmT{O#M2_9~TYci@7sVZ+ilxFn(4isi_Ekn%^U{Koh`mp`vR z4Y&dLX&%+~ZvFLu5617?e|Qc{>im_lkFdW13)W@}4U0S9zK%ar@O42w*uC2mJmUWN z@Czr;O)q~O+Z5OxWbB*>pUoDsE|R-7@WC+m-89=E)j_7WVE%gkXsg>@o`+OB_IPZ! z1Au~`?f1`E%M5oO?%gv(nRo&&kmsQcAT=SnAR-2zmzVL}W3@P8soU%DQJDHH^N@aq zrp9uqa8&n9vwLPh<_4YzpknOh#@ki7uZ~|E$ihdgt(VJhKvR}Fv+g|Z`yW|Ui)tB8 zMAQ=b33%+yc0^+#nU0>GB5y;;y&N6Lq5TGIZ$K=f-N8C=9s()&FO%dS4wTK?wP3)9 zX%wJw=U?9;l0K|4bo*1Vo0oXsSj*2oOwfMbwR}RP7-&VG!|7g|SjZaEbVYvn$HgIU znPB1O4gz{}xaJ|)FGwfqcrc9j9lLPDNu9lBV{ng@xCHPD)gJ0`d)cAcS(kn7$*&5)16!(f><^+Gm# z*nPYl!w)h6$&mJ4gnV}P7Y)VprzfD@)7mqHN(d%gm**d+!BE8?RIO~z+3J(e#rz%* zcnoU$2!`Y?WTty1-eWZRT8}mua`lWUO*WGvL@`$FKA9hzzDzpMlcx{Ntw|>DM?@{B z6BHs8onIl7A%1MQ5Zu~c7Hu#s0)K6cj0s~o4)5ODY$_t6Y3~w}6h0`}V*_4rDOy)C zGR&2Nk$RLQMpNqcSh>ID;D))BjTN7h_*4*4b@2$?vt?#CS!c|KrGH6R+*55e`jmoe zx;+Vx$93;wEjeB%oji4&Fub|(A~kwKJ{-~Lu)uubk!D7(3&>kqF-PWR#Ox4qD;|v^6=L;J@d;v{ZkzQO5Z+w` ztS5~(X!*pgWuhj8Ao5(!aDoFX*?>jI5Y>FyHt_KuHLhYnz(XTj_wp-4_a&(ZkUC^!AFEoea78OGVu_eVXl zIimq!fc#4s2{ePsVRT*^>yMrD1zyJP7U}X$8FCLJ9|}OvEEUZAWSAXaUdoWB~fr&3JpIVLna6Msp}VF6}b>Inf&38>(5APUSR8cncFSP&2Xix zn^p@@x;^#uz@Box^ef6R^vVgJ7Qx^$8LmBe&+7}Yb;nHRE~%U0%U@aZ6z{(Q<<0N` zS|8-U8OlHyAumg7F?<8+qvmsTCV1rVE36m8KaVk<+OSb{H;eu!i=k})%Q36I7ex>G ze+HZxmj8rdnG;W0v(SId@P7q-cJ6-_@`us(-!S}-LjHfoO-JmE;v9GY0000>F>Op!SRoAaFjSwT|imQ-G-y`arWqdRU7ddkA| z!tITVMMy^(^r0{Pu>K5SAcJJeWH3V*iiQEh89^Y6C?kE#CN>JoQO0O;(HO>($2c^e zdP%KJV$RZYtB`jqbrMWEk zEGAn)uq?z%R>>)g#>8sYu$FaVJsa4_Cb5|W)I~F-}bW4xBVOt z2RX!HD&p7?DyfVf6~{Qv2~H+tr#OwB;jB2vc`i`ZCa1#UT%;P+P|GDQqbnq+<0`tw zb#73P-K2qAG002+~0{{R3Y;$7=0000mP)t-s0002h z#s9s%|D?VDi>&r@obHR>|8wU5TGj4iwDwZ0-ddF2L6prwd%Y=QtRPa9co$Cv0009N zNklPzeiY-NMk z8^qoqF8@tZ?}-%cqCn9vu`DU($H&J<#UzAs^sx6KK5{thj|XxQp~2q~ZW;8$+wIP1 zD(=M#z3hC#H$K{Mp}-Q-i2^g&c6s&+%^FbQDI*|6AqO$4Bd;Z2G7**rM27Vy-k>4J z2~Cd2K(CBqp9?-?LLDkiBoE!{Kv)juhjRlegvxUmmJlk=p^Oa(TusV<>gJWczakx4 z!nWN$Z`&bjf%mX8)tLb?W}Fx13aZxduJ)!7$FZa9j>3eCoF3=|iN*_6RSVF)a${$9 zV+bSg;q{4 zAao}>IY$W2c2}4r?|qFJDY6m?+QOkw_|~$>Wop%uyv0t_v?x9lS#c+9cOD%Tx;Kg; ze55b+AS^_uvBHuaz5su4ghs9+A;~DUl3xl`=l7)|RG4Mfb2)hsd>0mZ^-$VCW3`5? z=J_P-@YU=`81H+92`nu80fi|vrOB zO@(3$IrFOG2awtaAPnU3v2E$Gv)2m{o<6_2%Y9AZmG>pJIv@ fqM`p6{yW0opawBu&&AE literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..74f6bdbae5098967cea09a85266fde638285afcd GIT binary patch literal 760 zcmWO4g?|)u9LM3$?{>HCw!vAd-T?(E}vJ0F-Vp zXhf+IN@IY95`uIcNUEUw7oOJ>2t`N^4-t3?`f!m%5sm!B5K9~?LQ&!gpahDMNO6=z z2}+WTH-%D^mMeqGQjYR~j8rO+hSI4>B`V`Gs6r-La^7qnpsM`UP<3ihlLt`_wWv)U zRF`_xrvWaPhiFJpPK{_x6PlujX~rWo$NMOc@p#ZZfm+a#RTxYuA)RkxGMjm>W=jcuk)RSI3&kML0d5M>KC0Ms0>{|PK(}!14UtXgh{m}ph zGKj$>zs`_w<_R~HH^iH~#oG)MA%-)8kzy318N*l)`HW+HUd;*O9VRk~$@y|qcvo&J z?}_*MfDf4_2Bb}A1|Nx!naM0>i#g0?9`j>Zz(U&l8)vRGH>+r4T3pP;y%R<_(*vKZi&1ef-DPS9s+u6a+VD1#(*YFMPcCnj1 z9`>@2{kQ|-Am8#G--{nO#9@AfpF+7m^9#R*m~ez6X}|G%Do2@djN@u}Lj1u=PVr|9 zr#T~cR%g$}ah?m|VPVHbaf!=Z;i?F8jqCgsa_Kj?$t`Y+JKW`O{uxn_^Dp7$RbwM;^j|h6TlLbSj-ZwxGc#^SV@ag wMzWCvSiuzKccR{%m4rY literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..83a9f22ff5513f00bd27f8ff14c058005b7ce3ec GIT binary patch literal 2174 zcmV-^2!Z#BP)004jl0{{R3eocQU0000mP)t-s{{R3= z7yv;S06`!KIT!#r7zi;K2r(D{F%SSL5CAC%03Zke7ytke000O800000^yNw}000OH zNkl$!$BW8u6NK=I0)zy7civPXyyH7Jw<2)I2=mR*^n+X;NYwX7DzJ{2D<4^ z3HpNo{~q4{A|Ah%|-{Jn0TaMVad zAq&Nb`0!Hq{{wwD%W`n=7-dQ!&!CBmH+%%ocw4--&WK3BL|1@(e z0NNT9p@Yp@OtVh&=lV~jz)&s;4j>9bUW2`RuZ{R28b*sqc7r;$h6%l>lVMocg{DE+4aDG(43k#erXBcbz3gk#H(s3)o;HaH<0NbPpq+U79C88Svwpss z4P?rjb3HQ?$n6am4cZ&7w~Se7MmkhL$OYxQPVPhqX?A@iJ;ypluZ{Ix5H~F=xpSJrHT!cg?uyB1R*)<4p+v|tDBTzOPM_GNO&6MiE=1I`>{dZi==q{Sh zlgvCbF&!NsAO3-pK*4w#L+g~FCSIKOWQ+28PXpK z_d$Hofu%t1OE5h7O@kLU>E#Ac`2QBD>HZx z1CK;%68E{MaWU`}y=k#uZ=={1s0u*cWK7tVT(|70e^;T?L z9Jt~$=?h%+ArPo+(g%pwkR5CU2<&p;*GdODPw&L?CiGx;?Ac>$Uyn)qIiY zJQZ#YnC8IvuR>ra9CNSb?xP{e>f@ECA|yh6f6WeU;7+~XfW68B<{?%EHx`_W$;lxJ zrv+nOs2LHJEQ*&egd&y$XT#QEvk+K&Kjx>CWI>n10^r6Ivt;<8{;~kL%Wm^+$^d3d z%vJ%n0+`JHWRhs{4pez)?4l=7xvUZ<2@hU&Q(ZsV7mHBryWeU#_`yUZfXD_3FhhAtuRd&_vZw- z-yMUxf^wbPvwG)hYAiS&$s%y&{W(b(K<_oW<2kflnZuz#E?3Pw`TxcQrWm=# z5v(od;~cb1GY2T%cAZ~Xz*J3#DruaHECi~cR)E>SZ6VNdKdJn+C94#;QAZ@gQ~udL z61dGGztZw8=V`zDtg8X--#X~Gj`NO*!;)C^m#37Wqnzjfnh#39cL2?xXf;NmU0{Q|MZPTtm&b`Jy^P0ZoG{V67`68&^qTLV)>KOBV(Y zL|PTASG2hhG!+!@sqBB?_nV5&(*b4v{8xeh06?We>5$o$s{jB107*qoM6N<$f;6Q1 A^8f$< literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..12b976a49e3d4a098f0779deaafcc6a9ffdd704e GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|eg8-ipSH_Le)y2(0UQw2Yj+z{f zK*sa;Uw{7n50u9WHr|(73zV4W>EaktF()}8K_KW5d&4I+y&nwBi#sPO*c~|VM5IgH zfMd2$z=B0y9*r+f1T>g0XmngVsZHKs#gxbFi@6fGE^%rEm?;ZfVfn;s@c6;miUn)T zIT#LEcHIzFuzAuG%c@kVWzC%s+%V-(s0fD!hndO(g%h0(O$QR!FznPhu!_O5F)6fR z&JlM}f#nN&0s_>f6N4W(X*^e$&KhBSPJw|Tm}5Dk)xBpbATM~j`njxgN@xNAFV|SY literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..50b1d92801fce5d4ed0056d19755d23e25bc8e9f GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvg8-ip*XpYbd)FNO|NsB9XV1QU z`*!c%v#g*b4ln>J!31o~*OvfAw|crbhE&X%I>DRoumX?E&7Ulm&io7=%mzW%0=sv( z**os5D^%$84F8%p@7Uplj!6HeWJXI%Shm$RvT(O3n*>^DZq)>O8t(PQvA^ z)N1Fn?E%-@TXWg}#ujaySe<9h+Ho=btuwPc!_}1BE!GdNIxmtmZz(q%Q~loCIEZJaCiU! literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..334aed60622a167697f496399de549b96a6e2811 GIT binary patch literal 933 zcmV;W16urvP)-#PGKNo;%zww?bA&+5!Eu}f<2n@h)LT;~Vde45F2OuSZ4F(XR=ehUN3M4^5 zP6FIx5}En!Oa#yx22%9Fzd2bZ`0rn5KJ=>GQI3`(ygBDenI%<7foU1e0i=rnb9mL1&q%A!mdaFxE{DI{M(}di7ha0 zeFb3c+Za`RPXPFpN()B-Hfq(!s3KzNPs7i^8gJ`PV)>0w@RhNSfYE`0`Z*Bc(_`u4 z<7w0ZwWKa3*7ZzEC16|&@Z9dK0^hWfT6Y0h);-a#r4AUK)&g*pe@adHS!HO(6L0@h z?d;vU4o3bLTnU=aDFMdy5&-8xXZ0QX-wn-Z7l6OET07Y|O0mB=(3dQnVy7CvM(5N7 z%k#SCODCs2)E<;$ij65vFkW@X0`E&>7yVIt026$?Aa33^8kZWJJ0?wV?C&YU?@r%uh! z&-e55v$C?1l#~R@V+FE*x84LwEcJA845^s2_M#)#VFdx!3pYF1rBvB399g?yo4Chj zz9SF5TAOXu+M)SH|48KnoqY`9K}~k|{_y0j3eVZpuTb-7*_6%wWq%kW_{HYrHlAcW zA(m0JdhG$RrnRlT4kx+%JS^hg_8n(&|DVDTxIp(nfTUG`*n&?wA4Cmr@aQP$h0I*8 zl^US*r0Dq`%~e4gci6SN*Pgv~NA~mO>{EZ%%>5kvI_=D-zmv@C{H+b1`^HCseB$Zq K=d#Wzp$Py{Bx+>< literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/new/apple.png b/graphics/battle_anims/sprites/new/apple.png new file mode 100644 index 0000000000000000000000000000000000000000..cb3e78230ffd2cfa6c192fb99eacd1516bf68210 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvg8-ip*O@n8{hv1Xe_ZB&8ST5` zs#}ER<_L(_ne&xuFokgPg{W`>6(WQAwHN(>{6tR|$B>FS$q5n>2O9MPTJ0g&9bG&i&Q}qznRlLR|l^I|*bmxG+oslFbZW zUS5WVh73y>-T{?Q(PRi^VAukZhl7W6<}(60oCO|{#S9EWB_ParFHODzC}`{H;uvDl zo1DPF#K^{xP|{-Lvdy7IVsE)~i%Z%2Hjd6W-_*Jpukx7-dnk)f@2MdTaC7?Z9)E>y7*mwmOR*Kl8Lg;QU@U(aY75;{O{&@9|C(IOo~l zupxH(<$b>Ad|n*8P}Qqoe)nI_iiO;Fj(*;8m+_1!Lwx?uR419)=?)+td%F6$taD0e F0sv{JaRrM1`0?Y!j~_FB{K)w6!{Wye4j?-5gJZ@Ij*K517C$&RfG7i~ zY!r-!!0-zJk*s~jKwohdctjR6Fz_7)VaDV6D^h@h$30yfLoEDTCoyt08wjvCYi{}V zpZ$B;H=jP2%L}9SN-j!>dT3)Q*{{W;EC1z#P*YhwSR5D?JyCqipQ%$oVT*#g%{tEmXw$=&%S zd}Ge7Efc=q`&PJ>g|oQx&uqujKWv(LcASblC=^_hZT}@o=wbYfFK0oq=jrO_vd$@? F2>|#Hjtu|+ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e32e595296bd6927321c12e505555ba51d596e3e GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDUoq6-s#LoF!MZ*jX3@)6w z@u8#RgM&t3V9d*xFM&!hLE=MwKcHxsr;B4q#hl~>2c~1k0<3g+&m{5j`g$8P7@cwG zNfA&sD!;Y?xsJip)z4*}Q$iB}r64?% literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/new/bee.png b/graphics/battle_anims/sprites/new/bee.png new file mode 100644 index 0000000000000000000000000000000000000000..448935c10a426b59ab5eb9439ca6751329a9c767 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^0zf>0g&9bG&i&Q}qznRlLR@EDSn%wu-j4aIKYsk! zxN&1vR+f#84Nwvnux309GW3L}i(^Q|oVOEf`3@QIv~CWWn|R`!6Mq0ZU&6vQQ!lM3 z?wYbrbjjDRmCxLD?le?&%(Jupwz=0aWTWx<7q_|NCR%P#nz(WYgUU+_*D`_Kd-Pd0 z%1xdtvC>NWm5-^)>^DtvCCs0Wv9Rr$rx;Uzxx@DIOkEWPd)ki_Af#iq_$SsGalG;$I^UygYL9z;$6EI t=$!FmKRTxZ@m z{lL%HrlErQ6>raGrHB9A1q3HPdUyNZX>Z34`-uy0@|kZd5Ad;Q=wsz-V4uZ4J)zYl z$4?n^14pv|%y5bC*`6tETdoqBtfmyzePYV=KYO1m6$RPKi0xb4*&%Pq Y$nGe8Fz?yl9FU7WUHx3vIVCg!0QF5zy8r+H literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..53ed3361dc7b8a931bdf4e924b5aa7250d957653 GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!VDxk7i7!@QU(D&A+B#_RQAuTUEdhLq%?R^ zhG#>JgMonoP!bo|;HR4fl-uIz;uumf=k6q1zQYPUZpIrYFSO2^!fdkB(ZfHWbeYMc zf9@-O8k>b)=ll50wl<>Sp245u5Dug28J2PdRwP=~J`$BKacMFU{tY_~IL?qyJ_*2X=T2euxW;gA$gS46LORpt)Rn0007F zNklp-A5fe0OKTV05Ih55Ci}|dXrYWHm?N$E?fm`Jb(*;$rWaRlv0%?3ZRk< z#0rSUp71>fpdsK>6hO3gm;sa*Hd;WMmcbv7fS;2GEZPik7NiXlx~CHK%K&hIi5_}9 zSn~M*P>!2eSC~wCz{~*^D%c~AHym+%0F3K`M=+ilh<*NwCA`hPN6J!+he*_$O2}w4 z116i`M%@ajwH7qz@j5b70-})#V1@BK{>%aALUUlOK>sf;|Jwo05}+M`{4kQjZ4uZ! zQ@FT2mwE7A@Fi2&hz!6nTs&~D{kBdeLXF|5vG2e6UA+hl8sGZfzk0N%ga`EJSb~R6 zvG)Sa1n6ZzPHpH|!N0;+hzhbTfn#{dAu6;&EGS$sDJ0;$pdi{dx@=$Aq~^nj9?Z!D zmEcg6-tVPyz;`cT>v)JdMDGYwT;3KHCO~xz9Px}_U5~?1XMhwQqIlu*v^<@o3^X3- zmZ*JLST>5L*p zx`{DTUXHsMx9Pyi8U8Q-U4CDJ;Ga6rPUPhj0OF&bz6)Ghm>=F(?E{Jk!Gj8^mKL%2 zGZYpbGDFivWfsUxM8%GQS&$+|j^>fU2R9V9%@Lb;=SPw-^xP4+avIy*m`2iA4-iwC ziEJL6SxUtrun|%y0@1hNn1q#heF+W@!rA@v(`YC;P5{psTEg6aHWjIm1dNN>7^PFm zprngX%r@7F(wd@o)?K7sgGvTa4(nKLCZK10+YrhX6};Vot{s5SJ)P|Y;AdE22iG@z z0BX0>&^f>x*y5`8zai}4YY*F*H!z74sE?XR-}hrZu3z;sp=vyxNyY#G002ovPDHLk FV1i=gt*`(9 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..edd1a50e89aefecb5b824e66623623a5480c7877 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvg8-ip*Ax4npIuVCr8{U!v1P$Z zo#rTos1D^~M+Vzi3F|0v1xH5}b3Sn;PDUo61`u#_+xZqqb$hxvhE&W+PLN=Ez+)Bv zfq`rO@(8w2#(t$3Mt%?D^B*O4+$oe6NbE6qxP$M)k)+_31BtVZ(|dZm&&xQh&AjfrO&+ZG#SS2Q*AW+zN*JW!Mx{8%bQeEO`m=~{|^4hDya6hAvt*kas2 xy^T4wGUtKTwAIa_%9g@6Z8k`C@@;+|<-Z-G%K2I0N5RcB} z1c|H!wOt2vOzhIHvxG3}C7U$9e8{%KYFb;^BCaWIZVRLWrJ@>>ID)Hph;}hN@9J~S zcsHXn?XAWFb_rkk#SHQwvO(#9rLZoi;o7KHr9&&_q`HK5&RO+>$=f;bGP4ImsB2cn y3RbT_=QZ@*eHAWSSxxz1og>1-0@okH!XRTGm$_+v_y?fN7(8A5T-G@yGywoh6krPg literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/new/cacoon.png b/graphics/battle_anims/sprites/new/cacoon.png new file mode 100644 index 0000000000000000000000000000000000000000..55b17ce8ae85b60992d0c239453eb4b00e139b62 GIT binary patch literal 10874 zcmV-=DuvaFP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3>vwjH^yod4%2JcMLV4u|bpo`Hw&FTi~osmj;y zd0DzD>Fg$xB!EB!fV|KCU;pzw|ASvGxc7;v)ZB7@`4wAizVnaz-e31`_eT4#{feKr z`1z05pYJz3F9rS%_s6_HpYOb$e!fsXUvT5k*Pk*!*QuWix$g_xub?~Y-=ELb&xL}& zue;CBPy2kY$6wp|{PFX1+0VuQ{y7#7V*4!0{*M*8pF98YMyx)( zzkmHYyK`1OXW!lRm^rEZd^Yv975f(-99$~c*D}8ge-i&L_Pg=Bvc-wT7SUXD+C$HipDfBb&_?Zy9>-`^KHN3QGKTffhWb$R(T%aG;tUp|FF-1(eovh%gy z&o94ue;GDl!DPo=*1m)%>u zFV1m}75j8n?nCqg3%Hd0a?imwA!LkGz3$C-inGu9N~xulUPFyF)m%%hwbkBy3qV+Exs|8Y z)>`k}v~%gsw>zKcefSYZ9BJfHMjdVRiTlhr)6BEXI@|2audoRJl~;LIU2XO4Hmu$RreC>o2PdfROQ%^hn+iD-H{%JM$m*xJm)!fHwvRJgwl^?6|aw%VzaDtO0 zn_)2@9TqRL01oYCv$wh!y(}l2z0DI8$zwH_WSr$>F)SFj^Xa&6+x=MXKicg{@xNs^ z|9`UFBh&r=u-qfleJuA+yZwvRR=122%s`4lo#`76z_xPtwfk{!-$RhvPxZg@cR!m| z=5yHS)5aN#Tjv~31)}CIi`$Og*L!9dJC=5c_TAE8qvh<>c3>BKEI%DTrQt$uPwI<+ zE%D5L%9`xsb&c2yu1vm|`nylx_2h9PcOm1qH&f#30e{q{xpTf3F=R|gY&v^Gd zZIpfH$ukFMYZ-mDl-6jwgtXVj4D|YV zj8gJCt(??H*olwlo@Xj-FP$)QnWxTNM#?d|%t2+gdK~A^{yVE>#j`(W`^7!-iMFUisQ_Qwx{$|7JMDrQ?u*DnUA`1+zrQD@r*VH>AII1 zdc#b~Z$Om*(|yA392M9Zo_w%IF8CK7fWtei9n+k^VqJipR>k)l;0)>q7D5C>;gUa- z1;Me72a_HSpLi@~6Kok*D^p+rGbXa%K-v@QW3{b@J-4KUwdPavo6d)RkEy z2<7J>zXFE%Rc3ja02mS0lt#Sko}1{XggzKL`2@B}`2G=Q`z?2amDm;bwA*6j*p@Cw zG!exu*UIY?RJma|;Fo%T+WVZ*iDa8I{6*%#Mi)SuWx3^6484LrypJ@{5uSG@ErH+` zK$S$&>ZHK-U`k?)kREeb`kCPq)5N+LnsDkYWGh;U`w`fx1rV8y)hQo1cKLAbMLx$3 z4G52}6J(I+u{c))!gXGSC6JCWJ*U-|F6Cv?3OaRHA9C#J1LOhi<*~X+#)I}NQ`Mty zkvPY|=C=6(QVv7P4uYkz9Cvg3!5WAFZGW5^0_o(W?J~P2(#u$>!zhS$P6udlqz~kF{rtON`;{srV&;b}p?|GOEIr z451{pwf`+FJ-Fl1md#U$e!RMOuwr7aJ|luA2?vfaU=iDUh>S#~o;tyj>W7c86(nzn&lZp|11u8AT3!&@^gc4gB5Avn1)0^`XPIT zZ9YY1J$W><|_m)DLXcyp_bABRjdw44jeSQ z-9lfMhmAf$zV4I)s;QaL}Dey)rAQ+zm16k8_h#y8!VkM9_MujG!bQC8;Pd{B6_m8%hzz!47nbv)WD z-o*b17T67N27+5MtPzO^Q9qBxqsSqV3-5uzgo>3WAN~T;3zyDB1!Ss`b^U>6 z!SPD9ph1fX3bP0+{78ySc(a9k3%$@IYI6h7Tw0`7HHd8MhRjo-SWs9}^@(3N|TgM8nGVO2L`k zstGnW;E`emAIOp}up@>+^^f=YEqU=M9T;dWc>@Nk5CD9f#HhGl2>0Pw-3869UG(Jh zJDc}|)dj%}s0AA#f{^`QoDoEf^-h|MMx*0A!M92b-)rL%f2uzL832CAABTabC%t|!tW>groc=DRdq*az)%vo z1@)pk$t^{d4Q(FqO?&$!#A;E>#qDD)w~HirjtDzML~w99Q73M-cRUTkcpf6wBcrS& z@a09(t@n!Zr09c3zv8uc=#jEwcSJ48gNw5N+$x#qIaW3yLRjK(;OWsHcJu2rlzh+) z#X*nt?S{xbPBoVS7xOifAD*d0i|{OSN`c#56^HB;mbeUuFd}F|RwN*#W3|R9kl{7J zwLvQ$F++XIjIL6F049;Kj`H}>GKw${z1fa{aR~9=>YSjEq~k5+zK;q9k^z;J1h3NK z=dx9G)v#1EAtY5j3IesP<6%v^BDPuA^1P}2fbwMdrn5(xe*U0WIUU*IL%}THoZOsfd{aFE!cdrcV0ZUWM%v|W2=$VLSkJq{enuTJiH6v z{b(Y`uK!W2_-Cy`Tp)`WPqV0^u|8yDblnvHp6&8mbb~4x9d}xl)$7}Z%#(k}D10JY z`vCYwnzQVOt8-VfHN0i2=75E&>!z-9Jl}5{{*HSDrY9~L4p2c$osWVLu`0~i4FD;I+%fi83?Lwt{&BQgIX!s&$fj}MGOsad{w}}Cl0*tme`2SXu7Q!8#J47 z0L4_4q7@5lRWDL}P9kwN4h8aukGD>4Sfq1!9AZ*cGgL8PZ(?5DK{(n{_)GqT$5%M) z4{Q|+ePU?|WP1S{su%~pfhr(aK=6Jq@gXe8QdJ|LTaMhn$`fGC$w8%K>3~gk$ST3e zT3v!-tm|z%Sz$BiJX?SAH&rsTl1{ih-}PwEsLq*4jS8M(ixMow0T%?)T(`^_4hf&! z4`>D}XdynZ8YnBzF>(irIyd4pyQ09VwrfOHc|sLxpbl1L(enr+j6(o1_~ejJ;u*fR zNP5jC)mr-!qkfT1&@7)AZ@omTJBILZs$)0{aaHM{y6Ac0gVZRMHm$-Txun{RbS-WS z;`jQ3x)C(Mxd?{zSlvJ{9M#MyR=b0FOQC@!Lv=faGrW|g;zILJ0M?hv7K^_GUUpi7{I;Czck!fjAGKMEO5%TYR3AOOy~Am0DZYHBm6`0c{> z;3<|$0su2Uv4ivgPKGcY+$XOoZ*q*p^BsDqrFp3aag>%BLDi8=u-L zi8pdAIIa2@+pQrPEIP{aMbdMAR3r-lwhV(vWM(i!!3951KtgQMF15oh;KL%HP6QHC zdwN}}7iL1f03a~`E3u9#EVQpGL`WCF4!$^*>gzGdeTm>f6(_RU&oyD)`0^7)FK>a3 zAQ!w_-tW?k;0B%}C#pa+MhzUvRx%b9Rc)=S$E_~ddenju=w-|CyammuopZgVB>Xa2 z2(etg@?Cy`2zk->Ic{=+XmJwb8y<6215)&kw~2t9E%@3OOG}~}B5}B`8_7x!;IN{< z2{;|fUKlJsDe3wJV-4!9r6NaE&sH5&j%IZXi}Ros7NIrQ13ewAPyHj}T7(NWpxTbX zx(fHm2u?Ojk8;87VAb82fk~1#1fUk-r-qQa894R<2vs~e#_w*_A=JgL_AP=G6`!rr zL{1^t@hjXC&>W;}6K}kY8^C@!$E|$0RaUCEdlbA zGa|^kQNw5p8M()L#4N)lmQIIhKxO)lAR}@}s*1nmo-r;#;>Kb;i40)%tF3@&uSI}F zKF*3>Cwtm?U(y=-=PF#}`MwGmTu2$LRMiS-$plh9S8aCLQIe_>1r2gk(w^gHxYt;% zbmfSO7lP5~Xj8Ghz7~|c(WE|K#gBxBKGJSA{_7)FPg>6w!L~Qn+)h+(DWyg@mshI2 zl7?Nvta`M-9A9OU^ltkmNh&<|X4a}OVbS|;RZWbX-9g%NN{vJ8UsPm zJw@42ty^u~EtU_WgJT?NoPgmI{tOCrmTsykZ ztA0kT3*g1EKzUZd<;B;Q)QR4-0xnBPEjFdbrc6^m0Qjna;Gr0|^!y2gqRRC!!Vlps zpN2VHr*V+uk~bx5l$%_Gs2wx*@eGya?86dRiLKx%-}N-5jO28*S^0!3C)In`rR}#E zXM8R_N#d+>@C5HhjZ~-y0N7n5g{#luRGo~z!TiXRxAEWOZTs&RbX9RAhiBiud8$6E zv0~Ii0Y=tF*$4ioHmj9Egx2Aw1mdj(k}#SYA&<8GBmOXemy#igp5Mi>5}OxU%;?6T z{BJOV`)UScAyPOak)=F8ZF3!=b^DuI5E#IS;PodW-CJ>LoL`{oayP#HeDyEmRB`Id zFUZ-qjbP|^`Zet*kIAs_^-y&??h+m|Bh>CFGa~rhbw|>jB&oW2=ys4moL^<2gMbXU zBKOMeF`39J~3(C1WbmXZ%=;23M8>E5pH@v4imk zJHVQxS&ZkOyYDnpfr6@PAh*gl(A3Aejhv!Ng8aMU;5LSLM`18M;SIZ(P(Pv+_#x3W z_QXYWLYO>Q;YxfG{-jDH3t?d+c(qT1G$6-|nDQ_wGOg-%AbR^M3t7ok~#l_ZpB`JhS?DqY-4%Bxn!)Sy#o*43O9buA`-D{^YFq-PkZwIcpib3^J$ zG{jPBwz7*H4M|TZht;B`Hg;k4N=t2E-qT%s)kYODoNGzGsH);_v+L8mP<7kC*G^fI zNc|7k&y+3Jl8K+cz_c|#)6eO{9HmvsRIC^`nQz@cROTmigO#DHKvG49Pv?RNu(-WL zT{>o=`WUz4FX9-)@Yxu63XEp4g6B6autMFB;*YUuj8!#f96>Efp&0RZtBRGCofJk? z5K7dbn3X3{~-*4GpNMuJpRe zW&msfE;*nJ_w{G|D}!iDbhOEfkQh&zU>FCyxQFuN{GOJ|XaEg(z?wYV8CW`414C`0 zllqRTlyHp*&4oh(E4VVUwsaLJa;igs5iWz@Tb*X;a=L9kRbB9O_?2onz>}ng+Q3hU zfF^VW(ksKLWO!wYwt@=r`Nle|Drrcg<29iw1>>?m5^z3#RDI}AdVnm&RJQ_P!2dcV zOd}uq+L{=d zmJ=mj4q1GuN3NoS%5pXmCm7$TU|E1QznU}w{5?0i7#v`Oq$4>o@4>23M?ya$9KM{% z2JtLsEQ};_^G{G;m=<5_pf);L5-8`nR&vI}&BBlU>7`YSq+;4ISsJ7TR-Cswyn5 zOcrxpkhICHs`k_-@RIaU2N}@Oa1s#y(`Nf=vUPyXs+3uMsoMuvv5f;PDWHBx%vXm& zWZAeC4K>tv3&?S+kSGFo9`%K6&_q(em8=PeMRlEW4to+o6@C%=_7AkmWV?At9 z^N`D34)5fR(E8VJ5iDSA#E&fW3s?#vm1;M+xKpfcoCAp)e|QXy>==8$JbctyZ3^WJ z7KNHXL?&xbYv)4iG;yf%o8}=j=qL_pX><_6Ds@0tZ&0lIH*pbf!Gc^Usw}5kAJ!?F zFxx7!Xy}3u!F*wPMUwtlBTj*y`^KQds{D!2fRXhb=0zvJzs8sbTK7>lk`P@wO%-n9 z22Q?Id34_$Sz>Yj?iM-qcDNIf4>rxGsDkoULB!_n9k;Qq4&c)KY_j{`s&orJ9jVs7 z)P5#(?9_!vgpilxsWc+)ljTxDhdW+wX*uJgx z()X)RerhTB9LNJv>+!J)yiF}Ft9WZ9U<>S;kx!fb%0v234I2k?Y=k*)bHe`On5rE6 zK?H0BgT}zoi%S`mAlVx5ut6BID1HM6!#JNeVHBI-CVN^h_f&O$AF}V58aVxGS{jpG zB+1uWHo-bE5lp~~SgwW~R2tOvRCz>fL-!OS+Yy0Vy(xkttA(?|yEo~3fsRGRU1c*> zo|2WYZ;wwcP7L4Gbp>Gd9Y9e4Xf@enu|@);QkM`X7~-5dtVy|M*v)TLkVY%#nO5Ht z3_ZW6us0rVP)SQ8!$D(|_1A0mQk-|d0KoBL+!i?d08sv7l+>%nDw>+G z1%w3k!0&EVh3Xb&B|1Q zFa*-YFby)Q7p<8Q%P{g375Mj0)!=F5uJwC5G~9`|;K<$NN5sJ*+9gsX5K3Er}v2La~y$ZO%U-hIY5U+PQPJV}QGeo3ANE^~k*Q zduC%qf222!NVdXZJ2gezG5@@xz=R%}dP-|Z*s%^bUR-R6rGFh8G-_*plD(bsB)KQh zQmt!-j#K$^N`z|`*hp@&iF~+3P`AL!ADS&)(6ORgPIyaFkwrMJXCK@hleGH7lrRkr zi8c|8O(mFgi*c$A+#c$STP(7=iWogS8Zh3;hScJW0%j%qTTldE;uQdc8{sT#5MiPc zN3+O1+^#*Ffz`sRrO`P;r^%|f0mgOrwl$iZL4jEOns8`^1EwScfGh0G{ya zV!ajs?0aut;i?+D?2UsI%ESUhLr?hwKSFSnV%ibDMxd$whY#L1KPOUUGBv+%!9DaD zu&@RwFoEWkSuf_8CfC_-BBSSK?e*U*`h`p6&-7-B8iQ{*kGM^+Q4?H6-6T@W^DiXH&}k z7d2J9eC&yeAZfhI2CGEtG*BruM+%6_Nd$G!*w9FN@nMLfmF+uBCl>M|2H+R=6b$6VQO)Hx`kP-$R*H+R;V}gnaeSz z2~ANi=qf&8n$!H4fAnNPQ2j=OmA^&3t;+C{5X$Me)JkYpuej%6oAr5s$7Nk@{JSfO4e&<>oSHE& zw~_;S3M;Hf6JF}7S!*=8r6=uX%-%OW8l^{uzx$tOQ6zPV0c5TVzyD zR1cL9>b@yhj{2vUyqvFL>pL^rFSB#LTYs7;2jVztbAuyn$QDLKe*PMO$EUt4SaG!H zp9+Z02cK_C<$Nm_7Mfo@KA~dM(EVoOGHi6G z+3{lS_vqg^)ksb(d0YLa=&3@rximLnFtLt}g@`MCrs~BrG2cn!^LWOt=MF-nlr-9r zL~{OA=S|;9#(WLy;Y4Ib&X3u_vwe4cfIhD0k!|zQ#p4c zf0(jR*3jVOqbz0fs!IF>d}vl~`-sT;V^Pfx<87OFs*MWS(_Uzb)8ll|ng$CSs^zF8 z95rvg@bXZ(pr!@7o(l9DC+;Y9e^jOlY{05t%^rW~6+Zvy!KSE^;+Vgt6PG@!?#}pb zD>co{lBSXAra^4D7@qwm%}Or?Kt>COg%gwNVnf41&Gu1^^Z+y2?F9!W!2*x{&dLsIDB_do=J z`3N-k50RRr@hHWp>1ho-D2NFj4NY*CD(6T$#p+yrl^n#laG&%1$pw4y_z$6@hndhC z_>55-C^Inuf2h(0@Fy9>s%k|K^O5ZClTfOtr6x&W%0dtJsjmqJkK1#UN*DvjMqY}q zs>WK3L*9pI-}5B(Dg}y)=wc62TjB0LETaRn2VrjmN`vm*o@3EO@5RD#pJRD2Jj`X_ z>Mpu+8;12=HfENUp1pq^pdBcOTxJON8C;IsAS{{QA9u>9?cbW}9-Qu0|u ze^WE_c7cPP)si-VIu$V`J(;S<$BdXFmB~S%-y4WfJn3Sk)oYJUbEY@zdp!w_NAPtb6_s7}f8D?-jf2RqMU9z&yxz`B z{-!LjMx~YxGHHrPeb-A*O*|BP5GA+x92`eIwqun8)!o$&qP$GW-layFxw=a@`3=Gd(?C05a}d{bxRLzsX7+q#oBkj zr?|L~{@*2#6!R6|2N}Kglni}NcM@`)Gt~b}gZiUhXs?G*!J->@2~F?c|7y@`_+_={ ze*+OlGO0c`*1`Y)05DKYR7C*)0LRe9^!M}p{rl|i>f`9)+v3~Q+tJO{#kIk-)!x;t zw5$LC0000000000000t-10nzb010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{g#9 zCkZsT%`N}{1p`S$K~zY`eN{bk+eQ#&QgNILAEbtP9$iXlSYx{8I3wolo+LQWY5^+Doy@h4zz4p9}X(a-n+MZcW>WTD!0Ds@jLSH zXutBc@8}Im$%-dmK~#^0A8=T=jYmiKuD@}B(gc0e4&WY+>Sahtmyeih4g&t@F5(Xa zo3ywBYPGl={(5`;I3}`yIPh6;y2`@gZ?`C_#azfPiCrIgP6~2<^7!WZJ5N#Bg_i3B zi*U?T@z>1){MCTUof050M&!7C_WDZ#VLzWx`An!Hwor{D!kqNW90xF;)TrDAu$yzz z8M{QfyW+ac<7i`E)Tn3+u)8M&07M_{&S#41tnbWoo5EV2Y-Jb7ebx<$wRsJ|u|FSa z2H&P}(qNp6CSnw(pK`n+mOmTSX&TLWoNNOnc7Poxh8I@^Ql9#=Vuhx`4C3Ls1+v3r z&h6o&t0N%V(X42TET}=d4(C8ZnK_W8Pd*a-jrc5@*;1CvRMS*HS*4Ar6pICIs^G+++B zO=g13SnWBslJYqYOj0r|++adUuz+|6yC8hB?WJK{0*)y|40{(|P^Xelg;VRqKmmL< z<~#Z>t4;y>br+2-_Y6`Nn^`T@(!dd~QKb5u5BBsA;(5bPSA<}#IUNr82v`?Q9oGym zjk-sWtTg7Mo=}X|gSucNBmp*?$kr;A%lh0Q2;0VD7ORYKhYoWbYR-O$eO#+lnO)N_ z$DG>9B1y|~2a_CiM1%T>tCgxUYr0707mWpsbe!c{E1_O12}%Z%nVydGqBVggDXGf@ zB|ziwN39iAka4-uv2*~-ogpa!I9Mn2hsrm4FOHWRjpfD?uq45#HQ9MxIfTNyihlwq zl|#wpZ&UV+4rR$9gLQ_qpZ;pc7_5QPQz3LklWfL4v~*s%r&4j znVMph5FvUy7w4Uk&er==zZHVk4=+>H<1^XPk`Uf(x)7PZv`8!NAb?#mLajRA$S!Cz zOBrWp&WYPZiDg^7+`=|?S*H|L@w7{Ag%k|$f&yErp;Ar7s&I(X7hu#pTPcNtY!uT} zj0In6n%JHdu=1cMb+FPzA;^u{hS^Ej!)03~C~dU#sj+83EL=snPz!HCDfwp!;E*-R zkaU(+h6UAC(r8Z_3Au8Iw@-1EI7F6340w?w0);aj4=3!ZwO?s_m8|3HB8&-d36W?A znp&!zT)D?VV385Cn7+)oM%p8oNDl2Y=6>>@>N=-g^gtp8x-o3(Ne1z`a*EzZ zoiQUNTh!H8<(}ZRNq)=cq)&3DDZGJN8^}5W-T3+1Bdbmyauj?_kgf=rs~ANm`O@m& zwMp5|N=tiJ${}s`k^FSS=({QHgsE;o^hb1!!U}(UV^&o60%@WZ>4SpJ!BlN>YnHqU zh@-vNW=I@G=1Kd-ooP4VeLpv3nL}=G-koRPQJF?o-9*Mtq4~=_6Y(%@v-;pUVZ?U* z`=)MHqU|&z$>eJA{{ET$ucs{7MEw2eD^tCCq&>_F{%7u2j*i}c_;4rsA0yU=2?GR+ QX8-^I07*qoM6N<$f_BpCGynhq literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..bf54b11cf22924a92985249c2348cc0ccc85f1ba GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!VDxsPNql!DT4r?5Z4p?pC3JXbk3YPQ>RYN z&(HVs^Ru$Dl9ZGL%3}qxf4ANQO0;;oIEGZrshwagbU=Z_MKkwuWOSv^f=4$5TaMh{ zaklu;u0+NN7mf+5I5-yc!uwziP}Y>K~s}xGZ-||GC%W3+G`8RjD(8d3o d+N*9K<~IKk8I*fv@ive{Jzf1=);T3K0RTeKT&@5B literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/new/chop.png b/graphics/battle_anims/sprites/new/chop.png new file mode 100644 index 0000000000000000000000000000000000000000..2afff2b3f21509c7a060d49af77d5e9c151ab5a5 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvg8-ip*Ry+{6;C1xd{&J2Guu!DyQwdAXH+Td^k(Q=#WwFTaKL#dm2Me z9ls>KLh_v8?#vq#|Hkog%{-8MGycLOxnKT#`>XW6^sr@r0y)Lg)z4*}Q$iB}y;@GR literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/new/confide.png b/graphics/battle_anims/sprites/new/confide.png new file mode 100644 index 0000000000000000000000000000000000000000..adb65b8052d425c555c87d6676526822ce91dcea GIT binary patch literal 633 zcmeAS@N?(olHy`uVBq!ia0vp^3P9Yz!VDy5c$8@ZDT4r?5LX~wUtj<1-n+eP&i?=Z ze@gY5vq$eOnX(rsjunK;+43?lFtK>LIEGZrxjXf2-faV(hpR^-lB(# z9$jB_>zIoB9k&M^H{61kl{4=2$T+NF{pNv$pJo5`f)kTx3mmbmNz;xKYFKfPG3Z)= zo@qzx{Yj60&g_cIJ^tLw(Q#?oX@SC|L>UcElN+&~kLGJj2zYjE=5)BVIdpIDw?<1-6xc zBpq4w!gn?u{C59=!#t6n|06z{GIrcwT=F6^2jewo3jJdudG@c%~Uv}qdayx$8ry8jbOa)t6^*37e@_dP|yW>}qxQKCjC_~~2 zHHTa8TrWBDbN>2PgR7nBZal z-u8jd5x!>4CzIa_C>ImdKI;Vst05ne&j{pDw literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..091047fd101de9096246516029ae18abaa630f25 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^96+qV!VDzu-cxxDqznRlLR^9L|EW9v=g$Q)hyn4@ z$;v==rk*a2Ar*6y69hz35)wj!gc1aTf`VMs4+tfw3LM~gV#uYLq@m^{JA-@L0XCM# e21ibg3r84F%wtdZ6JaF!_2A;{3*o-U3d6?1AQ`SP_W@VFT^?yXm@e#|?EdB+RUXKZcS zXTGxQ$Y01>COtVk<8Pcn+6&&U7Y56IizIZuVB>piQn9vHcH)5@d@EQ^^!)BhGI+a` zfvKzUdib>UQoC5TUSs{5eD|OHk^a8;hP}6ZYaZ=mxGuPyu_l7y#|%yW#(rJ~yL+M= zdV~+W*8ULKcE~+4x`tuO5B~>T<=yicZ*|On>p7v{g7*e{=mEQqQv%;EHmt0alDx9K zaO(B&8}8gqQK#)@$v^(luh72xsQ-a$X2+K=;|~C8Sj4aG@Wn9LTIJUbmKn2_Gs-V# uh>P#Edvf80^EzKU7LSkf9e9^N{?D-Axp1k}AIC^g_;|YdxvX8G zSGx{Wm*wf=7*a83>!gdk2NXD5E^=-Wj`$|ONoi_av0B~9{-VkSMO_suxZ1MTYJ9!o zq_|ymN{#saC9C%yaFOLqP_k_3oAH6MO^0QTgsF~*NYL-C625&LC2#&M`+faWLq>~9 j%C^RyB<-6yjqg7&FcouqyU*x73v!*OtDnm{r-UW|k_SX< literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..73fe2d2f2144eb891d34487d77043a35dc87dad1 GIT binary patch literal 281 zcmV+!0p|XRP)#gw{{R18UaEAt zvNN(CZtVZ^Q0vOha<~8k!?(<|)X;K-Mf@|<(&Fd;M=1CnHZAi5vUk3Jn~Ee2(!!sQ f9wz8PLT>;7{1!wDh(5nQ00000NkvXXu0mjfGSY{1 literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/new/drill.png b/graphics/battle_anims/sprites/new/drill.png new file mode 100644 index 0000000000000000000000000000000000000000..a97eeaaf50c98bdf85d1adb6e3685ddec80d7a09 GIT binary patch literal 1151 zcmV-_1c3XAP)s=?@DBiW< z5`JX8<3trgN<3qy5|@VTY$|a9vL2TUmn7>{2#G_JDDANl&5C~jm08;4IIK`C-xoL_rYdo%Ir5-C zV3}%5Ijb))d|+96;A(RyU__if{01CgZqw{^N zYL(f2zXxbiW)mwLydp(NmC>*_ zzjCnx=c!GCpHm8p73J|cU_VuG6g5d(x~Ix+DSLj&A88h1B_n%-`|C!5VN1Vzt_pwU z5N>z{j--r2so^1Pe$riu=f7kSwNYc2m^rfP;VQ+8pFZybj#tx&GPk_xZ7nr+H)@RH z{M=C&@bK4Ekup{<*%(y|4r6vD`{lDPU~e1dsKe@5PsBCE8@36T54(V!zZIEK$HnGU zB!_BsiWT{{wKM;fjK3n~EP_o%6y+Qu*0<8Ezxc-~aQR(-=T?*lZc!3NDZ|4XzP9Fn z^TR3NM*L?#M}c@P8vv=(Q$Cs zKg7y7=x9t{+VdZQv6JLp0$~2=*uz;tY$=pNjicjr06ypde}a&_w%24E`I#8kbh^y; z4tEp*ywd@G7eaEO(d6Z+C=klUs>7OINfAQtb%2#9kc}@mzypQ&MI7e+Xeb~&+W{~H z6NuD;9)g`0^xzVl1Q50TVS~Bj4Uw{1ra{X6QJptQy@&(R(pqz5T}~wgi&U#%sOnt;C|Y!cee1Q0wTni z5yf~)mo$E56QVe6@J&+cR4T>4SiDF<6~ocslNXEcAS2tErUFy^Sb$O@Dg-ML3dg13 zK^Dpv zYL(kmb(o9=|2VM;sHr(L)FYQq%lwdMN_dT@mehKEF1`$3MM1MG6B0;~7sE$B+p3w=)jrF&PRtf8P*fw)_A8{Ws<@GR~ao z5gH!zNciab%M)%e?$T}DrB^@Uh1K~u(E&1c`y=p^d=Dx)YFSdsXT(8_x%U-B% z5P7)l>#xuZx0lTge;!`CRG%?TW6S0eF7@ z`F^|UukHHacBVQ@ZGAQ$XKUX?scQ9$;lJ0ED<^)Qd27MU2~YpceAO_6G3wyzsA+%r zo0ykf{cU>Sz1)qb)BEe{e@Qh;x>U#286OO{H~cO@L}o+o(u28TV^%-YiK534a_Zacq-GK&6My| zmqBn%-4A^(#u(;sNk*kp`VzM?Z*Jso;wZQJ=(#5CU*PR;49@xLo}V^#9s?y}Pgg&e IbxsLQ0Go0NhX4Qo literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..361d7ff71a9720940196fe5322897b6127fb9318 GIT binary patch literal 409 zcmV;K0cQS*P)Px#1ZP1_K>z@;j|==^1poj5Fi=cXMWm991Zo5X(gXyu1O$o%{Qmq5`UC&~chHgk z0Bt+~Zj}IacL7l-0BsBbZU6yw0DS{qcK`qY32;bRa{vGi!vFvd!vV){sAK>D0P;yh zK~yNub&)}C!yphv2Z*|^V;_KEsq2Y9^|}#}Z$Q^o+;aaTbRdMfayuKucKhTt#VW*=Tsy7@*_0L!BN<5vF_SLeV_=PH>sh0D1QfG^P%XF!xe`JA}o0m}EO|3K+! zz;doF6p3gK*V;mn7$?=5EKRiZYYe+V?MJyEb}OQ9no2meApg1X00000NkvXXu0mjf D0#u|d literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8db2c26694e1c97796aa7ef16914db194b87f0d1 GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!VDw>HYaZfQU(D&A+9I(KRXJy-m_Kx>hZT<1a? z{<_}KsNieDrL|{f=GXta=XF6hd!F0YzvnxCuV_E~@F4fQl%U2q)9hT3lRRDhT-G@y GGywoUK~v}e literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/new/fishies.png b/graphics/battle_anims/sprites/new/fishies.png new file mode 100644 index 0000000000000000000000000000000000000000..4abdbb90075346ee668cbfd36c088954f2fb811f GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^0zf>0g&9bG&i&Q}qznRlLR@EEUZmjl4aj3?zNets z4PxL0@>lLO0~Jj1ba4!^=zTlkBJW`X4i{asf|m@s-5s@WCzQk)*)S0^ix*%D-(EtE-^N-HaKz56Auyamz|Pg~GXn#ozo(01 zNX4AD(+&zXEAY6OI{f%=pC`mp=q0q^^6cAkw^shXljHWba8K3O@TY#!??h%@GE!!C z;9sy_yJgN{htHZXz9=6k>6&xtgn#oANrz`26X!G@pK&sup^1IM=lN^)@|e_Z++5aG z!KAde>k)H;fI!~=N}&Z^c6WKU{NZ<4uXj{#fntL61r9BSpR*XRo;T%C(qvg8${@Sw z7ptSPO6viJILR0PDsqDu1?Jo{*tSi|;chcSQ)<3#R>K3e2Z|5Avz$^2d~osg0j~oE z)(5wG6t{Hh&QQLgYN2dkQ)N0!_0-;=2&*k zgu%n*yb;^EJIse{1iPPHDwgbssNL(UuJKy)UDYak&xP;vT26HM)pV3JvdF$pyvWRy zZD>2)^{(upWl^O^3T&AsJhK<5W*0P@J^#*|$u eMSSVi_rKVtd+5FVmnazu3Q|v3KbLh*2~7Y*8>bfl literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..dc030788686cac19eb3ceaac2dbb5ed11be0dbe6 GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^3P9Yz!VDy5c$8@ZDT4r?5Z9SEU;Y38?A!k-@7@Ky zJL`CFiNKa5@hwRLr5a2joO~fFoIr(e@c+MKR8hDVkiXN@#WAE}&f6&$c@G)zxa@Wc zd%+cXQ2P#7T%%}S>zWCgo=gh`!b=5e6s`noU!69&zxuh}>6QDhtJ>R%7V;{t5lqPz z2xW3vVmHNOS;~9Mug#Af*K(ZDnp?W`z6$IA+#L(1ciEqsYaT6eYWGsdg-vKRii_CCqvMERMG7fjgvV<#_< sDL1T$S>|B*BrRZ9j(URsg?eqi@TfDhQ{x2=M}a)$>FVdQ&MBb@0Jt4@_W%F@ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..21218ceb6dce9ad5fa122f921948ee8cada620dd GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^0zmA*!VDxI2ESSgqznRlLR^9L|NsBb{=YZp|K6$OE(@k+bDUa?QYVZ23Z#ohr8^C4JR928IzhPC|&97 za^hLRvqL1t(8v0aLzg2{&q9W!H(3-)CM}Q%Q3(v-J(SR*nbwr4q;BHDlEW9!rhLa% hDS*wJsVyssk>RKTZ_oLsPuW2(_H^}gS?83{1ORw4Pe1?w literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4938e7e9ee0d8cc60ca97393823428fca728a429 GIT binary patch literal 327 zcmV-N0l5B&P)y zK``4hDcL0>*A*Mp3KrA=5vu?Wo&XMy01bTr3~~SrYyb>n01R3H3r+wFEWROi0002e zNkl6)Sy`m4Z|A{UxP2oz}Qcrgm$)y!0& zk36*+SW9a?p=s?HMO>L0g>$o3yq!ZaeF_g0-p}vC&HG=%Uj+=REX#|4K>@&7z(8W% z0g&9bG&i&Q}qznRlLR|l^I|*bmxG+oslFbZW zUS5WVh73y>-T{?Q(PRi^VAukZhl7W6<})%dFuHoWIEGZrxq4~sxkCmLZ4bZkm?@}u zXg&Afowg)xrktFkf1+b@n&-3$Q7Tf$PkyxXzul`ppMiVkj`H4rIV*#HEW8f^hQTPK8e*}wkxzqkL>{NoQR4;6Oq zd9kB6GdVx{?Ckk*>U$sjI2E7cCY^k(=T)7#Yu9ZnH`hy7&rWdR@jSgZ=2H%vQ-j6= z2`9rVK4Cw9{a)k5AtSfzT}wo4GRGVVriWUL90I&An3xIz1(=!+czkXv`1$bt<}de( zcjVu;O{(ls+>p-kV=>DCXOjhAISx2Fa&RyypMCxJVf+5`ccM-|-1h!_$4|4i12Yv9 zwhJ+EUu?Li#30S8sKC)t0w1F8YuJ3SCcEKbLh*2~7akps^+Z literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..02aaccf13cf69936bf9d931f6434eff01234f27d GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDU-TF*6B&oD+-um@tZ+yCv z^?r@!;v|Xi@Ni>eW1tdDkY|-71r&|*ba4!+n3J4vfQyCIF-59*!N!d$%*`{nCzzSd zKQQ4D+oIFjl0lPtdqvaz*o}FnnpmY9Em6~yJ~!v$$pZ$aKAw{sg-^_owDR2BSj==` o&dfOux&j7^YnY~(7BiW3GfM6io6LEvM;~Orr>mdKI;Vst08F?*G5`Po literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..bc49e1ce316d72662e55589831bcabc55d5dbd83 GIT binary patch literal 480 zcmV<60U!Q}P)!aOCC!@8$&!9JT(Ks5-( z-`TZt^;t!TCMH24l{YKO($c#&DT0+S399?Ijs8D_xCM=S#A z0qV%#5r1n&dFPt1-5@ngtZY91MJ{mi zw_V?yZI<^$Xup+rd*|&CmhBo9GU25ye3B2YqVmnl6v*7R0D<)~*P!Wef@L zTHDpc$^61ww_F*M>q1-2N_s7c$ltDjp*wSRymb^_{sCu;piT&xoZ}B$NK>+)rZEQq O0000 zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3-BksCd_h5sXp4FTSS16#EjZ20>ebdSbJpQ`rO z9ZDLq*@St`F`&%;&%clP7e6uOY+@=kx123MvBl;)PpW->p5M;K`|thn?_0e7cHMk@ zhC7@M{0`5{yx;pf*VE?*N_?-6@7GP4?>O}x=zZg3z@VA6jQ76!4ix-z-Mz0(dq3CX zm+icN^R#!%ZoRAg@j4cQu@d72Z~P7}SpKb=C9s0fLJxZ0c^>?8wTE!8$Kd}QI}`sQ zc)y`t1w9 zy`MhZYc&+#{Jcqtdbr~YX;>yyvNFk9P)2^O#oc+^oo~9z%*%17cMRtE#BUGtr;GoW z$FG6TQRzBo>l3GV6YNzrEJK;ozud(e?z}NgH@^2_ekSKlY+$5x!(7>5x8oUNB==cc z;pRDTU$W8Iry^Zh?*J@@xf6?VfehH}LUP&J;(c+BI9Br0S-B6<4>I6V^2?b+ZbHZ; zr+UrJXNtS``sAO>KnsaTA%{Y0XcUqaW1@aatkh6XAw`o?%BiH9TIxCEm;tF=vM{Qb zP-00Xmr`nJrPoknO*Pk2Yi+eR-vSVpT5iR(+FI+KNjpP#KHa&a_u)qvaioz)8FjSL zC*?EaOf%0i>uj?xzrv#ZS6;=ey4vd7ZAxj!op#=3*WGqM)Y=Iro^i$16XOy}(bHC^94_RCNqF%TO zQWq+wHXML$#>H0c3MH*mTiQOQ75zGM9Y6LQBkYn{M0T$28cVmmt+U;MS_$o7At4wr zv*+c@Il|`zjOiIWAKSBlQKDWi8g8_}y#%f|N@23fQ2SvqbrNB-0YDAH@Yx;pG6h7D1&X&U6U()a?k388#8@y z=*{FK(XVN>mc9>VnCIJ2VAt1)xc0ntW10JMk$BH@2Lr&*alWLng7LG*F~>Z%oK|4r zy5@~ar&L@6AvZi+dUI*llXhwpE0e^y#ySUPVZy1crO;QVq-H3*jN zjhI?T*#>$DN%5*Yu z2X_?z>V=etMFzp23>jZER&j54Z7Y(*kbx~M^;#PsTvpqm#9cwC|Gv9d;qvx4e z(-zQhg}qAb!___e>`dF&4s$caOanBCY6wrX0v)6AW;}M?%AU`hJGyqmTAS+pV@a&8 zJe4Veo$W;?@%A@3F<*)k0N$W!sT2BJ>C6BhWRV&GPQ|p50+DcS1{O41BFZ+TO*^5F zA{QZL(gyp{JlhYdU=q>{f>6Y1mV5+RDMM>5x(Q!VG2;e5HP{~5L4h;eMvm^NPWF=A zz*(ezduep^q@mRRwM>F=C^rh&)7H~)0eS+|2I{<(7ze2c>9oA4y%SN57O_}kXnm+2 zY34oV94v7AwpQqBv1P!Mz=u|&nLx(@v3Uh*RZDJ0PVqc}DhGJhpm}uNvY}lHXGA0l zBE(1sO{y~z(5Nc_kszH+tWHIwFv^^Sq@L)l(BI+a;5Ezzx{E~&Zrt6peQRfr?Hml4)t#-IvfAF-{sMWh*QqgvANT z(M5$>XOV)fXn5ec4YC%BUCU-luahYV$AR4ZK+Uo4qaNO%I`5R=o5WaL3uFoevwJu@ zrb^LtY!+3ucRC?87M1E6Eb>5w;QfS$0BN*iJixbQW&%RS2{0PPW;`DSk|60f*bJmt zyREvbW70S$L9h*w81z$TR&v|?K}&IO1B`dJOe)Nv=Z--!p)xcp_$j}|tZZ}<-EE-} z`G%hMooCX!6k1p)zgBCBzLU2gijD@1jc!bY>RLp-Q$80bkp>KbeoQn8tE7N4Rl{!3 z$^pcxXQa8L*{?*z(`HzqR|PXIG;vVMB-?Jv8k9xKcoT@Cx^fIG#dYYAU`Is96)cER z$OK5n8i4)C!@g2quqz!prSCk#6AE~+yrvwcI}hAJQgjcULo0;6&9efl zA8i9B`5&JW2kF(Fxu9R8?rdjdJ#w*Igh=GZKfjp zLg!{6JJGLHN4$1I$$_AioMfnpJz=mq!T;hAJ7|y{k!~Kq+Z)r+VO|flQ{R~nxdm{r zOp6zoz(cQq|P>e!sCnr zBN7l6;4ewDJ6;WC6IM+fugPTUt)$e7>8VoyMTK;7)iDn^1Kur~0nNtL))bp{dbS2G zE`X2>I1+Ozvcd!cE>I`ws>$_C*%zO{N}#M@J(4_=p?+vZQ3UuYxrin0G>e>3&%gu$ zh3$1rGzyio=dJINZhaFJMo~W-3LLPO5?)VzV_9~qehA1Za>@+!VcfREwux_{c=ZWmPgK@u#lfpGX-~45E+0X8kj8wIAHwEvALhl z@x$$z$L`6|0sg{};%U8kZ=k@=MI|r+83pwPX*&uOc%S8ZStuGSTaKXtc9EBz#DE}6 zS}S8dPxKV}yhYlpO%xhU1&U5=0WEOV`_+1bc887}ihuyaV%J@E7JzM&3aSo(!4BVu zg)Ci&Y^j0Du_8B%ue*ogMM#Ml9aEVFKO5o>M2=g^Zj&^00LCDaCO02#D_7|+IY_L_ zRkj$gfp!2Ri%pZZ?JoMr80E)7hsW_NSFbtxW4;#YiO$Tr5&f3t?(}Mov<5v+{nFBv zPEd^auoTGW9gRS<{79so;XxF|?7V%d|IV~!pY6l^Z$g;fJ?kMU*AjrIwUiGR*Vv;ykBbX< zZDay|Ey&V(6dZ*Q10wu~Qs&oe&?%ej>_7*xr(-QPv1c9m*(h zCQ$<$weNRXHOhMv&dp_o0hA{{u!Ia?S-5OyxD5=^@LnEuX9S|>_PPT^huY|9zxjk1 zTD!kV##63HDEuq@Y^v=zSD28_#swGZw0IeHDji)cmAVIHD7#c@i-OPuKZek5Fj-G^s)LOBkAL{`U!U|hZu2o0G7@Q z46=`4I60P5cX$o?bl=%^j9rKYGSU8wU2M$HmQ0dE0BJhE$eXnC{nlyUB=AU2H~540_te@ zATuAk;5c7YlVuyw_YwZf>($FL0f*)FYY`(hcgdAmN6o+pMng&&2B-B44h&Ah_t5jH zT;GF891UP|$%9^s!pZ|{sMST1kv%m9e_DH8b$PEtZ0i^qJwfDg|hD%5UwOFBe0_qHm4d2GyHr_ zKy?io1tYrT4{;9HD!d%nd@u{Yr|)I-%|OahtZWU+eU84H#k;@=l8YXPZa=LU-N542 z3P(oFuneg{8uqp&&H>c{wgY6LUMB=A@qWwlFc%LCj(hHg3JTyWoJmO(!!EF0N#Y3N z$5#d9(1B$VQNt}ocqyYT21u%ts-Tk$iejKy)ONtrq9v07Wvq@2937(Lc(4XrixkHk zmw1m{krDt4LCsnuz`;UmB*nl3Y#$s#xErtI8XwS#@B>nE!`6tGnQ#8qLQvl0cK5+D zRh7~CR>dq%* zd#Y&2Aq$RaB4JSPiQFDrEP`=7JID&>>FYc3(kW;K9Y8$C!{8uN8S84Np`hxNR^a8c z3Zgl6{P7wh@Y?A-2$H5QWQb^tDe1l&H7GO0yxw5B0F;%0FP+(_*PXse+-P#x2BGek z7w#m`Hlue{AL_Y6eYCB=+NC$rEe@1HM@+B77ba70c_kLDbO2!h1zOH$;Kow*)b9kj zQNcss!B_y%HNyb38!3@Zr6#4ZiR`&^UXet~Rg?LdGEr1yR{w3H0GODV_@Fr0SO9QvZ~y=R0000000000 z00000000000000000000KNte}00009a7bBm000&x000&x0ZCFM@Bjb+2XskIMF-;o z4g)7FEI@|<00029+3I;`@vIn*4nEotTV<)aDF{)HUf{giFV516>UopOWtRPU_TOIv;d>60HTkT zId)vOI7%){huts@Fo?Me!IuQ*ND6@;6^eKyr*?Jc3L(c<$~Yi_&<*SBia`}r0c)& S6yb6J0000@J;8|HQIjDZZH=F-s6ceaWQLhhlV zq2WM=Y&nn-XMK@D7AO-M`uZY7B-H96gBVC894IB$4rGPz1?tKu4Gk{_G8nJ5mzOt# uOxDfl=-8_y0I^gFVm;IuqwX0>?g0RU;i+*Za&5o>0000lK zX8~>nXg*E>W&>yr5WuW1I?aVSUl zJM6H-swQHa{xkd6>0bnVQ{$Vm>SLgHy*5xG_l35MVQDov$Yj&08sM@rn&-oe=atd; zJYrla&&I&z5xmP0s6IL-3IRS7ic%gp$`J-!mjM8s`Kti@=scXMN}URDW&}h~Z{UnKMTO1G}sO))nSa#F@P=+8vctBKgumg!WcYlq$G@%Ij@0u*GFePP%I@N5bySJ zuwbcR+I#MBwhLK3wM9U*kwJk%=_lUtGuih~V z%>m?;v`37=b;fh_F4AFwzhfm>dX_HB2lT-@APIti0Amale!rtQ@WIcr#_uxtDaIE4 z&vT69T+t^hy4oR6~?W+9ShqQxJi^KPDs`AQS@#O1*hGAmx$TVw&Ph zno3Lo`%$Y5++On#NyMQPbTInR$J=X|0@>79szAI>!H-43384F20Wr^?<(Umd*x1ShnEW66M$=;1y$gBnn+^w96(Y9rj!wu zgrjGwK#zx-D4yZh0P{>GoUAi;WJWb{$X8P0?FR;M(ZAA_q^+zkDH?A?|4E7$zdEx? zqEXf=Ts8i|!s8H%=6-s>su$1});3)MWhD<1RON7#VM-iclnhy52# z?2IR<(`q}wPOJI!i=7ux>a^Mo40c-07?6{8I-G|g@m@0|n6di{pk0xZ+>szFx&8Yl z8g)u*7v}#(td`a;Zw&yg-5SZKHQ7kMwf0ThQ_z1%5T>oyXNwVp+4K5rF@i8T_^E1C`|oX2V&4D&002ovPDHLkV1im?NFe|K literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6af8634c5709a323162e1d81ee4b4278a822d24b GIT binary patch literal 734 zcmV<40wMj0P)nbt%C4^j*_qexIKhc$LP6@O zYMC2fh&>?xldM+Hde(nl>LI`aUd0^?$R!kF5ojbhzDNeHVxYivIbYLV*dkTwkO63d zO$z9+OII~W^&^27`s`U_FYNlWp7ocMh}cRkKn8aKuz;E`q6!J+n*@<$&=Rm=(as21 zv=sr1wkoh;(XPtAVbKO1V3Te_kgS>o=##9guLM5XMwQ_kmvRP+*z`EVnx?}Zjb@B8Gz)Txt!6>i1U$$DX^?NiE`MgUX~K$Z0Z#WK+8bg1a=B@boYS{-3@@dpgDv?w}c#C@4y#=A^|8QlmV(~)eOD`_$lFi z0!4ihbkjM#!ev^Oz!1#8x5_a9Ld-{15VQ$E1en2MyS1^i44QC~weKs`c#8h~!;0=ULUu$L>C@SpC{ zn_)hzcOL_2?5}V<4nQv@*B1_d#9>^7SB?S3ca6_vVBl2ofW*&i@~ literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/new/leaves.png b/graphics/battle_anims/sprites/new/leaves.png new file mode 100644 index 0000000000000000000000000000000000000000..4ced398dae65809db9d5894930767de24043ec85 GIT binary patch literal 503 zcmVy-EW?5S~h~2n$!(?;KhP5;zGdeFwvtR*S?kMTjW{OD*CX2)=-=k0CzE zCc@>sW}W?;Y;I3+i@RgLxtaOqn-74`WF)16))5NCv@H7Vd)=%En2c2vXrB53-w2rM zaII_mxt5e%)SBCCns-fCMtT!)?0-|-Te6t3ifS4eaSlP(WEX(fW<{q_++aTr_ zdvoIUvwWCLm(Jk^kIOFLe}9NB#^Cfx8GC(F#-4J*IOvlwW_=RItWSHNwp7CW;rB`G z>QIg02ZVhRD<-6GatFA5s%}R?d0j1@fcNQOIg;N@NJV2WFR}mJF+?#hBz8^L_Mfc# zpFkjH^QsPF;Qf*i^Lix2cm)$;L63x3&?6!Cs~&8emcPA`VBg=sMuOPima#VyME-Wh t_bedtw>3T+DW0M+J{u`&#~I&;{{Ufh+Z#RIMGgP}002ovPDHLkV1k{b*$Dsu literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a0246870f8f7c5f477106954a81a14e3966f29a9 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoQ!VDx|6+TY^aRPioTxZ^V#mUCP(8r*wD8lf7 zAv@4eZKF6t27~Ggi+N=p8#)3Q)-ZTkC||g7gExm)XtK~NkK#Q*y^B3v978JRBqu2F zaY#!yWV%TwI~z0~w@?$&QOT()dB$j<{OrXk27$*PW=<9moVVD0xl@U3uVBNB!#d6< zmTh5SW9u_haf_zopr0OI;*Gynhq literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c2d81405d005997d9bf65e966b85af452997efd8 GIT binary patch literal 356 zcmV-q0h|7bP)lIKuglK3lGo@dsf{42xa&g$V_e0qziQtO2E?;6h?)iUffoc9OUwht#g>8z0Y=_hM0xovHI| zxHCXpnM1~al|-j$g#f;&@m2PC`R(j|&7?TilUbUz3L$B7K8ipo<@TAxABuK&?|E>x zghS~NbKeGlU~?}P2Tri{zt<<0R1>rW8s`ko_NgOAN$GTh12IE!68V4+C(QO(pvPYZ z9X-VsnUtq|#l7p?4Rui6@J>Ift;g4vZ(u9du~}~%pBL5B{m%0M0000k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$jZRL%n;xc;`)Q(2N*DXxWI5>2g8C13<(JW8X6iv^`l@k1crSGBguM`2ddawf`m;2}F z>G+K%Eq6Zs6-~0Q`^XiPSz)*3neg+8-?=Q0N>nz+^mTqd@mHuw>(SjKRol3;>aI=r zR9l>|=Ifrj7mE2eH&h&T3E~Z#ry=3B=%H=Afw+*GOks1ebYru7nQ`?*aGOZ z${!Wdcj5ko^oVJ(E)@VVNzcAw7Fc7Eb&lIThth#fh%N?b9YN?sv$r4!ro=*uMGk~x zf0zSGicJeb*bF?TVM4DhIR)rIt|kY(lunc$C19ih)*|4IDUs(`qxQb;`N;$st6u=` zQ3gQQv>zZW>fSv?Mrlxh%z^LiHC&kG5DW->fe02v0|*Yv7yzA=fV9rxNdtr;Fwy`{ zU5oIw25>?FNT|GrE^;ElB2_loMfOYxkxZ>Jz)sqxsQ^sm!`@)`GTJY4+Q%y3L`9G9 z^u3Rzs|6UlagYamUdHoVsdoqhPemV z+{JRlB4z>H>HxMY)@7?3{TE^uy9ZjEEE6$00000000000000000000Xr7z40006Y zNkl0QIHz^YFZTlZd zNt7}KT?!Nk2P608c#`KG&jbYQzu(otWj`lNcDhhCBIne?6*eM>uO_F-95&?)_YymnQ!r|^WJfU}~k@8fEB50(4wg5<3-xqQ!>e z{vhv-I>lFiwFH&b)^;C^kKe%UHfzJ@J=}iH&S!@>mn-&Dpx*<9*VBf1GYx)3gpX&| zzi7+nTe{vu8_sv$Uv<3}zV8-EOB@c~cr8Q;Ey=>UoOPg#DKK6<&H0%rg;j-T-tf7T zN&ucz5T#%W;9~jT?7+Yj0Ia~ARg9Dk0OY%r_eeCDx)zD>BBewU(YK;yaq4cjlUq~< z5Dp1e>Vw>%7R&WK#}Ea%)}CTl(lG!-sa3s)T74($;R0C$9Aq}f8`hA4;5rAt1E{W} v5-9R{T;eSlI_7;4ZjTWVkz@@bhIaS^?A}5X@kxO(#k7a1sYyf3n2U+A%iDp8 zXGdtm&J#`&OeqpwM-wIdj(?Cbb?UJ)WcTM|Sn9y$c%}451ju$zS3j3^P6Z_l1Rv$VAQ zU(KPZsrjFQ0|@3YaAYxX02NM2`UWH+z-`N;g+Nxjr;B4q#hliOdwCfYIovceJC!XO z!}`*l9^W|rbNzkQbdjfwT@Ew*4jy4Q>^;rrm6vTbMeEb0*MXNA{w~?KyTB)Teamv! z+N~Kf8)f2yC(C-AT4Thxa>o+KXW2&_=bY7b7L`8zkU8RvVB>@Dd==mPc!Ju`-@V_? ozopr06r>TuK)l5 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d9aa568beedb3e624035f2012595388a530c01dd GIT binary patch literal 917 zcmV;G18V$m?0000000000000000000000000RcoRC0009Z zNkl*Fh~Qmgk910-&m_HRp(V2TCJgDb5iG0A*^YpCdYe8ow)+ zH6ZaxhbFWJD#Uar1)#3Hu4-4QoF+Mpx-o`AF&y(c<9rh)2orGeV=q zT$S`K!EsE}^oE`@A->tcVrToFbVyy?7>z|&DgbDJ4jb05qxqjwNRZfCSe}>d=qc1KL_HL23p}9UQ0#0%{Lf zBN@=4qaYd3iUGGw=vT^NxZkKounY(h$*^dNr+m#40o{}yz;GqgD=jRk2mqWb69A0J za0+LIfUeP?m;!|m0U!ss$H}fHz}f-42XT8G>LWfRQ(!~DrKn}8(BV+_RvED!fhKc+ zh)QzU9nmNjivfsLMQ;rBR0CF!#r_imedTcks25nPh`lLA@*zC1E@=-VupwZ`@#Alx z)zJeP0U`ju3J=GsH!UOaC1ZcE>5U5!AV+bM9t+rP~PysUB`w#f5Gyb=_hQx2Ht z2?8QUmCouH*5BzUa2XKz3Gs?nJRhd4cRPB?{3+Jv*cxZo9&vd-=X~kZv^~N>Ij7t> zOGlhu`@#nAiG*f6YFh+WN!iQqxpfBEF@W)~W+1W>{|Yu}v5QlHb3~NAeP)2yCQR;w zjtG+Wc`y*-ZRaQU(D&A+A|dy02EBz1Mv8S@*qn zQ=WaB^X~tWZ$L?0;Ke$><3Kr6PZ!6KiaE&%3ET+@2_B`XKt?HNf(LJDVJb(VS&&+r qL6DG0QbL$eNJ4^v5YwzfYYqUd@8&)}jX8Ta$Z$_rKbLh*2~7YV0WXLE literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..dfe0bb27ec875ed69d5b36cff3a8d82d7f8327f4 GIT binary patch literal 904 zcmV;319$w1P)cVfVC^Fw0dDanjGch5biae z*XxNVp7@`G=FRs8D*HzRE+`6MBW9Sxo_OMkKNpjVfi7%5iD(~yHUpGesZM(|d(Z%d zcXd*#m3coe#P3=F?J!R~@x%`T@@nrBfC*}f28m3GKj%J0fN1+XM06_?zm|IGT3076 za*nE`ew?GIbF}TLcPOB#nUIlbcObC`p7tn}j9qM1OzGT%n|<)(A5VNYFg}DqHEQ#VCB-C~n*6?NH5A)8soMG2-pQwj1B@4_7b?736>~sf8L#if*9_)3RKt)3k6`DtV!_vs%xK zKUKqmJW{>n0$Nj4DzQ{^xd>BLF32>|Z7$?o*$YxnwZCEpsXL^0apfNvI>tRv&;c5D zB9}d+?7(YKBmNnnYaK+m1JunxhJFi%8Hm(h_h6J|07#Myon!~PkTJ>h3h=zpw4j$I z1%SG3)c}m!M+CM6po7VREqHfO695W8yDX*zT>!~(2wDoOeGD^b8QRq`9*h(QfLaQx z&bkBb_A3%lr&70|CCJ>%1waPoKO!ywoPD|l4T*sG77UF=;OBwk`}6hNfum)Sp)0>I zfG}F+H1tSFQF>nHUlHUOk^%!M4(1#uZnNG|M zRIT=9)>4!B6%Y+ZKoTI^dkAbb*qx>I5nv~B5~0+0o!FI<52a67~NL~Cj22GCf}=!V3A*7?Zx)btoI z9+X>1D8TQgQ)LDY$gD;jg1%kVlE;DGDpUkuEUetWaJE&@W$C~u+&u#A_F+1D4}L-W zSub_8l9U6!2cvcR+=DMO2tZ3A*_@_kaOn;lfRVz_JvgMUx^Dxz8SHw__F${KUL`ot e7DWy475E2H*lQ^xG(*Dx00002qRd3Jp=74DW~bv>&m;MQJPZu} W8~7IgR$ki%vd+`h&t;ucLK6Vw&^gcm literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5523bb8a7570bab7fbfdd46f16dcfb29fa32194a GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDU{h!V7{{8!B&z|8YuU)&g zb?esR;$rtl!P|g(?L1u^LpWw8Cmdk=k=Ro&zkn(KzB8-dz26Li0+U#||L#`N;1GIL xUmY0m@m=+X4uJ@kg>37%6Z!6>w8SPbFz{Q-b)VaPzz}E>gQu&X%Q~loCIFK{P)z^; literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..53f99276349f904ff50b85e5929745a15dde35da GIT binary patch literal 540 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|eg8-ip*Evc#Z>pYrS@$L7UXRKq zpE>VRzFgb$WnK(W9xEuV6U<{^U|jC$;uumf=WM8BQL_QhlLPEW8s`MI*)3?YHvYza z<_F`K2i1N*>%y0LzHJNHxpmf&1sN2*{PKi`t8 zE{2P>QKJ3LUET&h@B4uYMm&|Z<_fzvio8nU3t`TP;a;e4u-5C}^c z*7Vz}_FACm;gbwsUDSCC4%!EXFALf{;dF^&nrq^^nHowhf5c*~o;{qh+~i*JmK7l< z8vU0@yCpa9oifz@?#0F%z#x#aC;SS_3`L(w+kC78(^j2Ln)!5_SfB>(^b literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/new/punishment.png b/graphics/battle_anims/sprites/new/punishment.png new file mode 100644 index 0000000000000000000000000000000000000000..9215b6ec07019d39cf52c78ec4efb33f40749251 GIT binary patch literal 470 zcmeAS@N?(olHy`uVBq!ia0vp^3P8Mog&9cBe^M+DqznRlLR^zI|7SZT@9kOJlUxiG zBM8>me#vHFU`+IMaSW-LvvgYEq!tApRzW=lV|4+4hI{|>w69(B`V}a=e470&7N$zI zmIcb+4bR;_Zs}GsCFq;*U6rYQt0sL_`>4dsv39c6J6*Mp3r~6pGb@R|RGZD%tB^GN z^zkM)f!GN#0z1|=r76#Ch+w?*s!_G#LH?7RxzocLtwcAaCtvSE}@?d=wF$`ugP8_nTIq z3EJ@ce~#(|uMhuy>iJWqMFVdQ&MBb@07pf*{r~^~ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..372f9a378964fb0ad8da55b3fc1bd12e45c66d72 GIT binary patch literal 643 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|eg8-ipSBC!#@6Wz}e(>knwa<@E z{h4h!H<+;)D2WRQOHZ|7U|{0&ba4!+nDch(!ELh@1ln$@K)6Lfar@ApOA7kDncU^(ItfBCZ5g;|{opB64PWB9ORnO~e| zlc;bkpF-Bklq*^uyByCj3h7=D_^|G(G~<^Angq+pF10WW`_EdYkF6==StiSEoT6N9eMq=}K$7KiRHA`%goXMW2EBb04lXwYR zj*ZR!@ak literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..71d343eeb5a8f93b0a50cd832de74728bb9c2b6e GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvg8-ip*Z=?jYiepLC@4rsNC*fB zluka#CnN!s#07E|XG#I(B0OCjLn`KMz39l*V8G*YF{fyMj+%MKyZRQbgA&V{xPFz_ zE@>5-=%Z-c+FttM0|Un|9u5vD literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fa39b37fa6122c11134d2f02cf7289bdc3345ce0 GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvg8-ip*JnZ3{{LV5{a*F6bIIqH zTCMFdtj<;hO5y^}FQ;_?<&Jo|IEH9UoI7!^;9&)x)|D?@^_V5pI#MGJq_Y|9yHfUM z!+#FPCYCu$u5m|yzx#5bU!Y!V)2itwqO@O>PFm^k=H#MmqbD5}Yjr(1orMMGPpRx@ zJ;^N2B>ZdZ4@H3u%2rD3_L?e*^FQb0=@e{wl6CFS-FHtzcccp#E$~v8yPsgqtiQyn z@eB6~t}3YvW)8LHa}`;#4{m9$-R<45XN&JmzDZ}+#6-63HRO1|)@{z@a54Mpe#d5` nZ9AQPKJ)jUpZ=@%w0srgAA9@ys7tjoKz{Xf^>bP0l+XkKc_Vfx literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1ec3be87a48b8665dca7f41fd6ae075f0b1743ba GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<6!VDx?zobtBQU(D&A+9ri`~WhAgoI?}7&X)x zjm@~Nt=T+0I0Az?5>nZ+^VrKOc;*=MRhG|Q7I7lAs@}S8^_gw~)awtfZxlsdt*y=B&^Rg%e&1%Cb3Y7hLgj h?D(3K8S+J#q3NmiYyAy3?*ZMw;OXk;vd$@?2>{{dPHX@G literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/new/rocks.png b/graphics/battle_anims/sprites/new/rocks.png new file mode 100644 index 0000000000000000000000000000000000000000..4393817a771ae502b8dd8bdbaba4fa7c136da947 GIT binary patch literal 1361 zcmV-X1+MyuP)_*2X=T2euxW;gA$gS46LORpt)Rn000Es zNkld3S9uqHSK2 zpiu2*-%X5CO4@xBL3?PEylDizSUXL@Qxlzd$f<-3;;o|W!G9n=&->2L-R2+)`rMum z-{(8;JkR^SGntGEJChEZPn&jMl$th^{-W=@eMf;8q?A6!R!}w*K4?BaJlyL9nWq)Nk^q?f2+-7B6ko!-^n)qqs1UyY2woqa3jjQR zf)4B{K-$3sfXeQ{Jb-VpW6u*(Cv3~#1kk6z1R;bmXyTrlR|m+LDrYm=0YN{ZOex}F zj@KER76|~dQ}2D8+5+vsWJx&;>l91rZE#!~PXN9ngt$Roj|@D|Lvkq~=4lN;(*cyk z9Dtl5SRy16@BrXy2JU;_w)YS!J|M(?5`Y|Qc%#WV)|d}kfQ0LQe^-Okt=1pjjtil{ zID%GdB>?Z+1Ic5)vH}XGTaCc` zqS=7y>0xvL^JjP)h=(j3j;R{p?c89|ps=mpHh()Ftv%r0-{z_9&<r&y}}rP)e?e+&VkG^R6N7$4LmOp&X@+A&jr940dSo2dITH*CpfQZa8WC)c3=Rg zjUmYAonZteUMo#h(4m+g1n?B+Lv(Ts3-Ss;$sDC+ctQYjqZH$u6P6ens64NlmQ$dN z6?xSUOG)w=gGylxjSkVW0zp@;V!q%ca)@pvx3X!FoMd-OuZ#x=vzdQ8jP|^zVx+cE zPt~1u@5K-9;T%uUMkK281q3ZO&{#053$FX1)%sOCSTL*lYz%S^T-&pEH(D`(`CnLA z_$&a1gMh8C#b6Y`vXo!P3WwM6Lk1>#F3#BdGf7}MV+?`(sP(&ESqI2zus+Lzm4bqy zhwHu@07n71X0kCDm8%O;N8q_-y1eeX-(*7IIFv#jwhU@ui!8V|qn73ngqAA0dMIVH zsp%TWj;F`}A4S^+F)U&kBMESf@GITL1et+Rl?zU^nGGp{yctQ1lM2)#&@1IF0G||x z0|0{C0Iq}{22B1uNN90Hx9C|M;}qp^GPTJ`Z&|Jh(V$ej8h5-OCEiq&7M!dG-nP1^ z=((Z-UIfZ%aGe(QN}dbAwMp%vBxp(s;o3nmtv;0rP-!#-A#Y?OFf%_l2Oxa?J07l{ zkZ9Tl=CVfO7FzJavND`W5KBmwKK;hk|Hc03jPx>dS=ccNlq(FL;ZZl>o^y(LxK|T` zS0I-%8-tPpH$&1@coo1|DX&HzX8@cBiO!8&0e%F}-iEUsoOC#nT>qth6?jtG6k=Yk zd#c88ij=}6n-X@8+75*w1;nRb2u35|Wz{MQ^qnLCkBQd;@I&yFB0*_?_1oF`JPuC2zvAOzQ~SD}KG)Q*Xp+BJpOSYkUEObRQtJ*?h;^6mHw6P=Q_ T;~TwX00000NkvXXu0mjf+uvYg literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fda9142ad03a0a33cdf129d4077cffe4171b3af2 GIT binary patch literal 381 zcmV-@0fPRCP)CGGy)(rf^p z5fNb4Db>~e8^FNoo(*l5L!(|3S%3W;u~=kEjUW0&66-zyv}axzldCJEmdAZTfsNVF zNDk;5V!;hFHD=>+U?kQ$qODi%I8kh5edE05j%2&9kb)DgA;#2o#+T)s%3!QG#W!Q5 z&eX}q(z+C3TMF2N8|Ct6(njLKJiU5eOdyv5#|ulp4}Q4%xp00D7RV#v@Uy?$i#s@u bL?Ru(gS(ZItGi-N00000NkvXXu0mjfO~;>k literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..70f5235a7738b724097be5a9f0ab6bbca995dcf9 GIT binary patch literal 380 zcmV-?0fYXDP)ItMhymDKbg^G!A<}t^tp)B9@o_ zp8Z&)oHIk86L)prr|fwV6R)>KMu#5OES%>6GZ(b`1BawMKl%BXh3l%+6LL-Xr7pOD z^rxTxlDlG$!m)J)McMLzjN9|wj@6szRb{TEYPkUf^?dp{)A(n0-)%BFANB`3x^fnY aL;}BJxs}~{;=PXm0000Hhj~_n{ zY$#YTAz;apCC$yvj*gBeP8?`xXaFjJgYE3MsM!`8;N!OCw&AP)~iq%F^>=Q@1tAR|3p L{an^LB{Ts5J=-{h literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ff86f33d21cd4f83c7f7419eeb578c540ef8a41c GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvg8-ip*Z=?j_fMTuTHW&hB;S%c zhW``Y{@1JT_XSF02fy~`%?8Spd%8G=RLn_ESimu5>NGBe&o{lixtS-hI(d5^T%~}0000mP)t-sI@TeC zb1_Of8Dm-@85tSQwPR9BAt4zErIbnl004VyIx#5_2nYysV<}@&DLOG3jtgKo0003N zNklNX7F!G5B8S8#raX%)&Q_~^0gC}!n;>Z|2CM5Nh@C}9 z;YkD!S&PF;Ft4y+VPTbPtSl0DcAIN%n*U=MX2x+=s@b!-fw(aEKs=^&8QPZ15@dvc zF_sXXS;Ep?!f2oE#2WAE5#xs%VLIZqL0$8hhQm+ErCHrb`DTxW&B9qzlP{ZFLW~Vg zgm|DFps=k0mI4Xe`oWU$hb30mgxL??EHzH6M{K_}ylU2V23^-KY1ljK+up36^!=|r z=1s=y{wbbpx=KwA?v*;A3_#gd0FeU1CICc)ONfA95QZ;sKG(S8G00a9pAThjkmqtv p!~Sh1GqbwLvMYPcFQzLm`~z^SVKrewrilOm002ovPDHLkV1k*3o{j(j literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2eb8535654da6ea185df770b6f765fcbabe64272 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^3P8Mog&9cBe^M+DqznRlLR^9L%$u)(B#}UwCvO8# zDQAI4WHAE+-w_aIoT|+y4HOLVba4#v=zKfLnvX$&$LTfilYi4o6SUS|^ku)trdY=z zc%IQkEm=YO%8AN^tOTzIhb}0ebK6<^e@(zzd0khDN3~zjiJF5<8I6jj`+29bf!ycm L>gTe~DWM4f(G5CA literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/new/steamroller.png b/graphics/battle_anims/sprites/new/steamroller.png new file mode 100644 index 0000000000000000000000000000000000000000..8abdef6692ca1696b2d6d95b9728ca798bbf977e GIT binary patch literal 838 zcmV-M1G)T(P)- z=Cn)~$jH#i$jG|6xu~eHtE#AjgM(>kX*?_jIXF2H9V!nG4*&oFz6s0Z0008f zNkl?(0FprErgp5Iog7eYsC3OLb-o!HjRI$yB{%8CB(;d_u6oIxng z0mF37`@HKa=sq{*6P^ITj5Ceeqo(Vw@_qjVU#2FDSOd*=fT4IjEIRd_k^ub}*F z#1GvxBn*VfV|Eb$-Bs_`f6tKMCyE0_0rUt1k^c<1O-hr#E6*q(NyoYXMh8HXB1-nk z7v&t~rpJ?X*axOEx=G$~M>1iPNMI7_Eg-ctWUl_=jxC1GRS7(Z#cp^S!2-B5G?5l} zreooWv;ZDHjm2*Iz;t&2C71$|`=(oeF5QG%mjFMLFd}3}Rd-L;lhw3xQ^i}+YXDHp zBj;fixw>z5qS5OBFx(^ZKcdmma{x5z!6VAO2pAym0bu-@S)y`hHLs)H&*uR!g2)jx zyzUUr<<@PXd+W{yP}udvoW!`i@z#o%aQYQMeI(8)2|94Vv`YzZNxz^6yQsW{bYO znzP#h%*lq2GD2BxuF($E7gWDZQ3y5{+Uwe@c0l_BxcbuHvXo%svcTVr-|~hDv?g_w Q1^@s607*qoM6N<$f`-V1DF6Tf literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8e27efb9a2c528fad7817d986e35864703d5cd9f GIT binary patch literal 326 zcmV-M0lEH(P)Or#cy)!AL82muq2R`1#<_0azp)_8C4J} zW1s_1(%ZBtyMYG;fl5ueve3ko>5dHn!t`Mw{L0aRtN@C_ecy?w8dS#4M5E5UV%&eu Y2WF&G=u-g_xc~qF07*qoM6N<$g3EG&EdT%j literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8ee5d4a2fa6aa505542d7d4eff8e049fc715e242 GIT binary patch literal 1317 zcmV+=1={+FP)l*O6o3u5ab;#YHU(O5KFLEy>nNa(CxyoXf~J&r1EHl8?RE-KKoq=n zF$r#M&4J}Y+p)!-mo5Uz+@I^C6gW2cWFl=5HHqG0!tdj~yT{}4)5gX-#3L#Hd@yfw znLUsnydb7ETApXl3qsn?(i)8M3gF8C2Dv^Vrai>-n}l?12Y}~?IIvF$WnAu?{jbp) zo4Wu|OLDvaB@Pfmc1b4@wBu+D=#nZrQa-mVv{lvo3E7jp$61Ee=o6C?vnOpLrH2E% zCZUdW$)1f);umw5(6*GK+v~P5;8(g!%#IXHO4`v#jk5~a6Z>sP(mf2Ab)kggR`cvW z#eniVYElVnIY{h76gXq7Cy2=gGcm*fo!AW4NZNx^j!-~L$pxhyuS`=M5P~_B_C~r) zv0iJJa@y-!;!vk)iY~KllRe?shozJV@Hpvq0FZ(YQ(+A-z~(M_lDL*Wqa6g;P9y+d zq%PCHQEY^5A*D-cDjjVzK12X_-X<^cO3wMH4m`5W9smcaH?x_80bTOM-8U^SOIS}X z0R&@gkV$Ac0&I3^NA44LkO|h~NUJxyZ3|wz_CaQ|o`V65S+Yyp0}b0kB2Tjd=5v5H zI2iC5{9oA2^0dH#ZO$AHqhzpeBo1(4G3I1twgiAz#;Phv58h1_fC<0=GuM&mrkw*$ zre}6f%4`|nX$?;z(;5R3VR@<6XB7rW4JdgvveqsDNs0h7E}V*}+62o)0Li(NrE`G8 zGHO5~s-2crR^^=(2eR24V6+6#rI1y_B=)f2&LKPrIS&kYEV-xkBJZJq)~QY)3ny5HZI}v3 zMCLsN9>a3l1?X>gwl$`d!ZE)JBYo~p0 zPD>BKX%8`#4!7Ays*$~?gMG(Z7jIzpUhx)au0n;FuC|E_N!}vxAb)cw#OJ=2i z1%a9(fC69|D=USe6tHz*8k`idQYs2!6~uWB*nphMjT=3uko<=hFIQK(wYt*lc=z~x z)f4zMqPflao4>{+e}ID6I*J>Hit0z;{b*WCnl~A#YBEyQWTdLeNL7=O8cjxOylODg>!ZoTMtbcZUA#5Y0?`BCzq~cl zZ~aLPXpQ}!K(%(%B^c>72AujQS6qZ~6#w!2*pKR~2>nS6ZV>v%N`({T?JA=1C@!L@ zAFJ09<`1A4;2lO0<;F+h59?UR|0dQ(`HqpVdIJA8-q+6;BX0owCe=b+%(#1vy4K4( zzPEhvAYUq4`TV}{Y9U(K7 zQrh}?E?UvK*)PyuFGTB`U}E=Ak5Pc^C_+O2r$uyH_X_|*|ELHjk@AaZe1ZUB1Ofh`Zj>spRj4S^@JN-~ bsQbg;u~EwqX!wfH00000NkvXXu0mjfDd|)j literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c13ae95d0bf60f8a63243da50fee7c6d065937f2 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoQ!VDx|6+TY^aRPioT!Hle|NpNxf4e&6+r2H{ zf{y-Ay86HP8BnbG|NlAv|8D^*KnCj$uUQ1-D|@;)hE&W+4k#00VG>ksb3DYM&0=^Y kn4NoZv0{g!Y4QXE2D?_zz?X7&AA_`ey85}Sb4q9e03!u6$^ZZW literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fd31e1063caf280c84d463508e0c1ee028eb5938 GIT binary patch literal 488 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|eg8-ip*S9h%6&(>C9u5n3GyugW zEXc?x2>9{i$B73kG73C^B52@Euk1>o5NCl$WHAGSPzeY#-b<6OU|?X3^K@|x@#uUz z*)Z?00go%MqxgaxaoOa^7kS1vSI@9@NZe9AEpFlS7rolIJ$*Whn6_m9JLUdq@}jOs z3-^1zeaDbnuU`3Lo43zNu8*a{9~74fZm<4P6wlM~d#%taMsHoVrcY)jH~7SF>MZ1) z*1_IT*nA<^{5az)hbJ~Y3lCIxgu5T8U3TPlVhmTvlhb$1+VVP?EtpDXYTDaB&}rHr z#CU)+Oft|h@^qtHh{Oex>m>%8TKOZd*Ib{HBzUAz!Eo8PHs&<-Web$`13D`no;}N# z=pQe$VDSfm%90z))wZNIFjnps)6Hj0X3BV@G_UcnFdGDVb26|s3A`;~0?KiGo z@XTyMWqWnQ#;|#N){gA(x7-Z9)eEflN zLzHw3gD~U8X<`a;!Fvr7>V&&=Mf&Ck3-8+=u|#>-KCz`Q#Vzo7sC literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5d563900c0683c2066d33b91a3b91e9ecaf7beec GIT binary patch literal 420 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|eg8-ip*S9h%6&(>C9u5n3GyugW zEXc?x2>9{i$B73kG73C^B52@Euk1>o5NCl$WHAGSPzeY#-b<6OU|?XB@^oU=pfk2BWuYSP;pP;4<>RSq~`FJG-?_gas)5cxu>x!Mn&q+@9Tdrh!`l_ufnvJL4`}iZU$Y)F@{NbT|_CNjvF5M6$YQ&8GXj;Zv-#{Eipv zmajRmsyTo$z=rYR0?EMWgoz9{vJ@vSSXVC{m6&Q~Uz`27!7TcS&GAOH5|?hxBQ4Pm z?`L1=;$(|{pU<;kOX80Y_Y&GIxRzhI_glVBhnw>N`!`mH>-qc#LYNk0r!-W!uvYRs zxc={1^@HwHjHf&p&XlPno$(XszVP9dThy_ey95=!rD_!j`}PZS6Q6I)leot{-Z{f};X$JO_@w!Rd<``s%+&@1>VC^S7?{an^LB{Ts5EJUSX literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9d037b9a940d2ca7b4dcdf1875d68dd65ac441cf GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!VDxk7i7!@QU(D&A+B4W$;!yc2sh7_s_7ML zTO`!ESh#bpLPa-F9xFKce8McC#B5I&$B>FSZzpf$VlotP(XW3XlabY&AUpdC`?|lP zyZ0v8IehqUxbn=JucA%2-zJx@GQYg#A;TW_gyRZU4LAQj2;yL|@%tkD=<77jH?CrA z%e0%d%9+@=ex3iZT9VN=`2*t%$!2GZZ#|U^`kBRY4k5v(QvQ zI@;RWDk>^CI5>dvSb@_=*2@eGj4_@rjv*Cu-cH$=*K8orw)t+&Rwm;`D>f@~7SDdh z*)dg8(eSaw#l3asRU{_QP%3>jAwEIp{`1}Uk8OzB`^DdN&HYCTf*WV^3r99&uJ)T`Opl;22UBoI-O4f>5DJRl()BL&zNBq!Qk*cIo~y@@rm0H(|3GF z);-(yFsEo1)32AN%)G(AeSvnq8#%u4xil}z6Ymf~`TEX{#JU6W`{m zGiPh^Rj!(HWUZD^Xy@Me!%US`dl+XgX1#QZ*}?6{zo~L1o=bl2kyyFPM|EqoMnd=O zSIs>98G1Qfi+oOA+u7oAa?&Z$NQHNAguN!+-^%{vyn`K6TCG)ig8R<%<@Z}Zr`oRx zUVpO0p=Q<3t!3XzZlAu87}3_b`+%qVjxNCpuIOyO1(FXQg>B@m)A;hz%xk{W0oJ=V uvh57EVR0-9JU!nnWF#3qAW5cn=*IH=X#p_ zTEX$-+>}oZA9I$znVu8QXnOm#!|H1<>KRY|Ov-)#^8U8B$(xrQHh!?Rr8-0}r+>|S z#?_ZUCghtZd^y*f_4%Bylk0@MIUEiA3;`;g6C1-;d`;z9@c0t@EW6@(jgvEZ_fG%H zIboNN!*0PY71kvS7CvRaTdf|*$RX+eLS(^S;W_Jcb3UsyE?339QMdy$@>c zp7?({!+YikzaL^g3}L=!jU$(Nsw~)lX_}d&#Xi4hk{kMr7wl*H=jghRF=YOZhF{JL zJpC7}v);$5!)M2Ee&g@9lJ)1`uU0kVY2|(Jea$NiKat?}^Y)BM?mL=j!;B57&jq z#|>jUSb|6Wejc;@#CBeXIFkbu@rE|Y2;TG2Nx;Q}-L#u!R^fjqm zT;m_&?W7Mf_U=2$V|6%$9LC{kLcRg&_C0pT3Y$O#@e_+BA7bMFD*(#O;zH!e-(FFy z8xs*_=dqEq%5Ix3ib-ZGofENcKW%E>+s(3Ag*!ngus*Z^LG0v9QF|7b%QDQ#)?^1b zG5KbtL+sgR;)UhCZVZif5snjrvb=aMYw7?oA;NuXIC=Bl10r^(267kxvOSv}2)5M& z{O)Z-c}vyT4&e6Uz5eXO2xwws&^XAO01(U%VJMEP3fVSzKxoQoKG8BJz()1pl5A0f zlRN<*V2Rc_hCy7QDk5@DN767_@QLJ7185U`n_UI)q1|#Q$t)*t0+i_4v6y`HyQ@b7 zu}^7pl4esNE*|+I(xiiagM-A#Uc_mc20A#CNDd1?@#2%mIG7`0_Yt3+tSZFB!(N(- zJRh2VWKGPa+-WwfJYXkc-u;W5E7wD^^j^BBI5#E^ccoVo@of!SGS@-ikzZY;F;tFu zd{f}QctBo$vB25;j~f2p0IdUyVdP>v7V=tCw=_sTx11TmJhP}*rjZ{Lhvmir#?!O$ zztZHHhm8A{Wd2r&$d-rP+<5+R>aigg^LYLemr^@cn>O-JPMcKQg%rE-c%UdaPQ|4# z$~Pfv2ORtdwZjY+NRUoxk4!E2d~~}7ADXz~2Uwm-&XuO!E2^_7oG(F^9wwEjStsiE z!jtHTQmoqE8BuDrwj8OMQqo#LqP4M{36ippE|kWURIUqzZlSg5kvLw3Go5Jw#B4q7 zW8J}51hhnpYd--ZMXI`)tSRd0&!T|qegU9vflSWYr<26X0A$LWTzi_XFx&w8mHAsK z)xstS`1|HXySwR}_`yCkd`{V1>D=lH@z6GFbLEN*qRupN2)H5f_(gHRsr_zc|2d&( zVRK&+ZUnMW+HiO%cy%2@?RJ;|76)B%q=r6^!lgnuE}STUx_T9t@wu@GjgV{9swxNN z7%ej&R1|u?0KjFNvhdN-fx9Gm7VT4*$R*Ky_7NyPi6a(Q%`YbiGiPmv-&2sTv20$! zqa49?gQin~&rGT6kQ`sjUF2E35L`44nnP)*f-D-S#eGl|ZIT)DYpGlF=OP>BX0JvB>%i^M~S zBM>4rPB0hPPSW8t>N=wZXqIN}`g{+h`E3<78UR^KBSj5}Y_w&z9OO_D-E9yKy8u#s z4K0r-^4+L{@Uy}p+Ls@S6JK$CGLKDNx&a<9nGxOn)$)c7)wEZSWV;l~vi`cab{?*5`y-D_^9+`{yA7{SB zsg*Mv_DbO#;E?pP-;z>ZU%IAFVq~GNVU#<&)knN3R6mISo@I|7J5jFBJlFKNYEC-4 zk*sQ&HJJ5fw-Sbh0%!hHR<2C!k|Y-$!e@Y&C|)Sc^KsDbQhX?f@&cgmjUmCRp$ECb z1Xwl;$)AAxve`0QKs_0YA$k0Ap-%iTkru?tN!jG8wblS^!>x&tk%jPPL-y*;OR=+j zzR^K>_4f9`W>!x~Wng-~1viK<#DUY|OY4W%CmI=ZLi_;>FUt+w!z+0J0000=lW literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4f30b2133dcca00deb0874af741c321f3ec21d59 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoQ!VDx|6+TY^aRPioT>mQ?N^ae1cqPk_P= zZc)xy?vy3WFAFAku!R^lM`UMId~}`AXl`Y7fURjwfQZAk5)lDbhP)CbyHbT!Z9vNy NJYD@<);T3K0RXhmR=@xN literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/new/wood.png b/graphics/battle_anims/sprites/new/wood.png new file mode 100644 index 0000000000000000000000000000000000000000..1b64a647f5ce0f878de260bac06bcdf5ecc0cbc1 GIT binary patch literal 881 zcmV-%1CIQOP)BjU5Xax(!5TH#F}O<)gj#GtAz6|skSxs>!D|aqhYU@JO!4v(L?9`o zmdVo179HbBn+3)#ZigBKEz#0I3H>%bIkI&3LMa3~r1S`Z_v7B(y?g(AvJhxSh$c!i zLa@LlB!qV2+DGpS(06_$aIFepsQ5|)9gs7d0v{5$rAQ1PQV9eM6j(C~4CPoeNA(DR z#B(MDbYshN?4z>OevCmm0GTjwY^72MZi|3{58g{SB!wVgr6Q2hVWoofIJmMnz)~el zN`RGF(qn~mEUk8IA^-!9bZH^|&J>Mx^^0kmmjrw=o6~)>1cCWrWRAX`l$E``oPKYV zO~v~Tf`G2?Xw{%dQd!UbpKdo6q%zDhAM8#V3vjWS^|iiK%Uvo_v@QmngVFY3?y?mP z@xU$f+3v{#L{GbMd$go-un|S83eueevj}q0@3cLD!vd^!A)#&F%68DER`4EB?o4)` zrzuss+Rb_HB&0j^d*VAX2d0L(1F(tWJF@AZ8Z^2-ST0eiagOp~InH&(y^ncSVld`{ z6NZGAqHlo+-zYNpbHW~ryIK%v>*gLKfvh(RwV+kaSIyBr0jE-$wFv=drs+=E>HIO9 z+IiPmLyRu=(56z)Zj!zQs6dN74#L1TbD-LC_JK#mw$i5IsLxsqWI3a)#Af+|9`Uc>C`&3H_LfV>+R-vwJZ$E&_{im;`*4o|F{n4#S{MO$ z_-}v1D*9TVxV53S)}D{8NCWgancMOjcMvPuMBaL{{!#k{k;_KLriUb&00000NkvXX Hu0mjfT=bMR literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..bcb30987545a447675c602c667ec73c368675444 GIT binary patch literal 381 zcmV-@0fPRCP)b;z6o$Q-f#oe>_W%d*zy&Ngfl=2Wg{&A*ETBV|s=YyFse2_Z(7_C> zRdc95M|2{87^-gh2FuF(_5FSkqNnFSk?T7FH@YJr>Q*?SP6Z1(6*5nO3@02lz!FJU zkRl1n3M-PJ6rw^3=_vE*;&U3cB{ph&{VbPi(jri$m%d@`D|M^bu-;RaXL)*pzg0B# zZmHC`S;Dt3@}ig({*%K{abR+Rfv*s@TJPV{ybd9}>1hZxC^#`&ec-dbBn3Y7^aKN< zj&Wy>F-A}!#P_E$vtvBNErvT|%=`=rn8Az#<`K@tvn{M$*e599X|X8m14;~Df59a^ bJ%8i}U7b&4q@t4C00000NkvXXu0mjfYT=yd literal 0 HcmV?d00001 diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index c80d90b1ef..0883fafe93 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -296,6 +296,7 @@ #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) @@ -326,6 +327,71 @@ #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 #define ANIM_TARGET 1 @@ -384,6 +450,49 @@ #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 #define B_ANIM_STATS_CHANGE 0x1 diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 8e68db99d2..8472c3531f 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -88,4 +88,21 @@ #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_SLEEP_TURNS GEN_6 // In Gen5+, sleep lasts for 1-3 turns instead of 2-5 turns. +// Animation Settings +#define NEW_SWORD_PARTICLE // update swords dance particle +#define NEW_LEECH_SEED_PARTICLE //update leech seed's animation particle +#define NEW_HORN_ATTACK_PARTICLE //update horn attack's horn +#define NEW_LEAF_PARTICLE // update leaf particle +#define NEW_EMBER_PARTICLES //updates ember fire particle +#define NEW_MEAN_LOOK_PARTICLE //update mean look eye +#define NEW_TEETH_PARTICLE //update bite/crunch teeth particle +#define NEW_HANDS_FEET_PARTICLE //update chop/kick/punch particles +#define NEW_SPIKES_PARTICLE //update spikes particle +#define NEW_FLY_BUBBLE_PARTICLE //update fly 'bubble' particle +#define NEW_CURSE_NAIL_PARTICLE //updates curse nail +#define NEW_BATON_PASS_BALL_PARTICLE //update baton pass pokeball sprite +#define NEW_MORNING_SUN_STAR_PARTICLE //updates morning sun star particles +#define NEW_IMPACT_PALETTE //updates the basic 'hit' particle +#define NEW_SURF_PARTICLE_PALETTE //updates the surf wave palette + #endif // GUARD_CONSTANTS_BATTLE_CONFIG_H diff --git a/include/graphics.h b/include/graphics.h index cf83e88c94..89f496a595 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -4763,6 +4763,184 @@ 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_Bee[]; +//extern const u32 gBattleAnimSpritePal_Bee[]; +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_EnergyBall[]; +//extern const u32 gBattleAnimSpritePal_EnergyBall[]; +extern const u32 gBattleAnimSpriteGfx_FairyLockChains[]; +extern const u32 gBattleAnimSpriteGfx_Fishies[]; +extern const u32 gBattleAnimSpritePal_Fishies[]; +//extern const u32 gBattleAnimSpriteGfx_FlashCannonBall[]; +//extern const u32 gBattleAnimSpritePal_FlashCannonBall[]; +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_MegaRainbow[]; +//extern const u32 gBattleAnimSpritePal_MegaRainbow[]; +//extern const u32 gBattleAnimSpriteGfx_MegaSymbol[]; +//extern const u32 gBattleAnimSpritePal_MegaSymbol[]; +//extern const u32 gBattleAnimSpriteGfx_MegaStone[]; +//extern const u32 gBattleAnimSpritePal_MegaStone[]; +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_PoisonJab[]; +//extern const u32 gBattleAnimSpritePal_PoisonJab[]; +//extern const u32 gBattleAnimSpriteGfx_PowerGem[]; +//extern const u32 gBattleAnimSpritePal_PowerGem[]; +extern const u32 gBattleAnimSpriteGfx_PowerTrick[]; +extern const u32 gBattleAnimSpritePal_PowerTrick[]; +//extern const u32 gBattleAnimSpriteGfx_Punishment[]; +//extern const u32 gBattleAnimSpritePal_Punishment[]; +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_StealthRock[]; +//extern const u32 gBattleAnimSpritePal_StealthRock[]; +extern const u32 gBattleAnimSpriteGfx_SteamEruption[]; +extern const u32 gBattleAnimSpritePal_SteamEruption[]; +extern const u32 gBattleAnimSpriteGfx_Steamroller[]; +extern const u32 gBattleAnimSpritePal_Steamroller[]; +//extern const u32 gBattleAnimSpriteGfx_StoneEdge[]; +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_WaterGun[]; +//extern const u32 gBattleAnimSpritePal_WaterGun[]; +//extern const u32 gBattleAnimSpriteGfx_Wood[]; +//extern const u32 gBattleAnimSpritePal_Wood[]; +extern const u32 gBattleAnimSpriteGfx_ZMoveSymbol[]; +extern const u32 gBattleAnimSpritePal_ZMoveSymbol[]; + extern const u32 gBattleAnimBgImage_Dark[]; extern const u32 gBattleAnimBgImage_Ghost[]; extern const u32 gBattleAnimBgImage_Psychic[]; @@ -4831,6 +5009,108 @@ 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[]; diff --git a/src/battle_anim.c b/src/battle_anim.c index b763b9980c..6dee835bee 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -1130,8 +1130,16 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_Pencil, 0x0200, ANIM_TAG_PENCIL}, {gBattleAnimSpriteGfx_AirWave, 0x0100, ANIM_TAG_AIR_WAVE}, {gBattleAnimSpriteGfx_Orb, 0x0200, ANIM_TAG_ORB}, + #ifdef NEW_SWORD_PARTICLE + {gBattleAnimSpriteGfx_NewSword, 0x0400, ANIM_TAG_SWORD}, + #else {gBattleAnimSpriteGfx_Sword, 0x0400, ANIM_TAG_SWORD}, + #endif + #ifdef 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 +1162,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}, + #ifdef 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 +1195,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}, + #ifdef 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}, + #ifdef 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 +1272,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}, + #ifdef 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 +1288,19 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_CircleImpact, 0x0020, ANIM_TAG_CIRCLE_IMPACT}, {gBattleAnimSpriteGfx_Scratch, 0x0a00, ANIM_TAG_SCRATCH}, {gBattleAnimSpriteGfx_Cut, 0x0800, ANIM_TAG_CUT}, + #ifdef 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}, + #ifdef 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 +1309,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}, + #ifdef 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}, + #ifdef 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 +1352,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}, + #ifdef 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 +1368,11 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_Spiral, 0x0800, ANIM_TAG_SPIRAL}, {gBattleAnimSpriteGfx_SnoreZ, 0x0200, ANIM_TAG_SNORE_Z}, {gBattleAnimSpriteGfx_Explosion, 0x0800, ANIM_TAG_EXPLOSION}, + #ifdef 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 +1399,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}, + #ifdef 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 +1418,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}, - {gBattleAnimSpriteGfx_GreenStar, 0x0200, ANIM_TAG_GREEN_STAR}, + #ifdef 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}, @@ -1443,6 +1499,71 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {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[] = @@ -1452,8 +1573,16 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_Pencil, ANIM_TAG_PENCIL}, {gBattleAnimSpritePal_AirWave, ANIM_TAG_AIR_WAVE}, {gBattleAnimSpritePal_Orb, ANIM_TAG_ORB}, + #ifdef NEW_SWORD_PARTICLE + {gBattleAnimSpritePal_NewSword, ANIM_TAG_SWORD}, + #else {gBattleAnimSpritePal_Sword, ANIM_TAG_SWORD}, + #endif + #ifdef 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}, @@ -1467,7 +1596,11 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_BlackSmoke, ANIM_TAG_BLACK_BALL}, {gBattleAnimSpritePal_Conversion, ANIM_TAG_CONVERSION}, {gBattleAnimSpritePal_Glass, ANIM_TAG_GLASS}, + #ifdef 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}, @@ -1476,7 +1609,11 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_HitDuplicate, ANIM_TAG_HIT_DUPLICATE}, {gBattleAnimSpritePal_Leer, ANIM_TAG_LEER}, {gBattleAnimSpritePal_BlueBurst, ANIM_TAG_BLUE_BURST}, + #ifdef 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}, @@ -1505,12 +1642,20 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_HumanoidFoot, ANIM_TAG_RED_FIST}, {gBattleAnimSpritePal_SlamHit, ANIM_TAG_SLAM_HIT}, {gBattleAnimSpritePal_Ring, ANIM_TAG_RING}, + #ifdef 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}, + #ifdef 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}, @@ -1574,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}, + #ifdef 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}, @@ -1582,15 +1731,27 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_Tongue, ANIM_TAG_TONGUE}, {gBattleAnimSpritePal_Smoke, ANIM_TAG_SMOKE}, {gBattleAnimSpritePal_Smoke, ANIM_TAG_SMOKE_2}, + #ifdef 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}, + #ifdef 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}, + #ifdef 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}, @@ -1599,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}, + #ifdef 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}, + #ifdef 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}, @@ -1634,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}, + #ifdef 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}, @@ -1673,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}, + #ifdef 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}, @@ -1688,7 +1865,11 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_PinkPetal, ANIM_TAG_PINK_PETAL}, {gBattleAnimSpritePal_PainSplit, ANIM_TAG_PAIN_SPLIT}, {gBattleAnimSpritePal_Confetti, ANIM_TAG_CONFETTI}, + #ifdef 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}, @@ -1765,6 +1946,72 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {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_QuickGuard, ANIM_TAG_QUICK_GUARD_HAND}, + {gBattleAnimSpritePal_BlacephalonHead, ANIM_TAG_BLACEPHALON_HEAD}, + {gBattleAnimSpritePal_DracoMeteor, ANIM_TAG_FAIRY_LOCK_CHAINS}, + {gBattleAnimSpritePal_LightningRain, ANIM_TAG_IONS}, + {gBattleAnimSpritePal_Chop, ANIM_TAG_CHOP}, + {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[] = @@ -1796,6 +2043,7 @@ 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}, @@ -1805,6 +2053,48 @@ const struct BattleAnimBackground gBattleAnimBackgroundTable[] = [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) = diff --git a/src/graphics.c b/src/graphics.c index 97250b963d..f1eb1b8c6e 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -53,6 +53,279 @@ const u32 gBattleAnimSpritePal_Punishment[] = INCBIN_U32("graphics/battle_anims/ 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_Bee[] = INCBIN_U32("graphics/battle_anims/sprites/new/bee.4bpp.lz"); +//const u32 gBattleAnimSpritePal_Bee[] = INCBIN_U32("graphics/battle_anims/sprites/new/bee.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_EnergyBall[] = INCBIN_U32("graphics/battle_anims/sprites/new/energy_ball.4bpp.lz"); +//const u32 gBattleAnimSpritePal_EnergyBall[] = INCBIN_U32("graphics/battle_anims/sprites/new/energy_ball.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_FlashCannonBall[] = INCBIN_U32("graphics/battle_anims/sprites/new/flash_cannon_ball.4bpp.lz"); +//const u32 gBattleAnimSpritePal_FlashCannonBall[] = INCBIN_U32("graphics/battle_anims/sprites/new/flash_cannon_ball.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_MegaRainbow[] = INCBIN_U32("graphics/battle_anims/sprites/new/mega_evolution_rainbow.4bpp.lz"); +//const u32 gBattleAnimSpritePal_MegaRainbow[] = INCBIN_U32("graphics/battle_anims/sprites/new/mega_evolution_rainbow.gbapal.lz"); + +//const u32 gBattleAnimSpriteGfx_MegaSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/new/mega_evolution_symbol.4bpp.lz"); +//const u32 gBattleAnimSpritePal_MegaSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/new/mega_evolution_symbol.gbapal.lz"); + +//const u32 gBattleAnimSpriteGfx_MegaStone[] = INCBIN_U32("graphics/battle_anims/sprites/new/mega_stone.4bpp.lz"); +//const u32 gBattleAnimSpritePal_MegaStone[] = INCBIN_U32("graphics/battle_anims/sprites/new/mega_stone.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_PoisonJab[] = INCBIN_U32("graphics/battle_anims/sprites/new/poison_jab.4bpp.lz"); +//const u32 gBattleAnimSpritePal_PoisonJab[] = INCBIN_U32("graphics/battle_anims/sprites/new/poison_jab.gbapal.lz"); + +//const u32 gBattleAnimSpriteGfx_PowerGem[] = INCBIN_U32("graphics/battle_anims/sprites/new/power_gem.4bpp.lz"); +//const u32 gBattleAnimSpritePal_PowerGem[] = INCBIN_U32("graphics/battle_anims/sprites/new/power_gem.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_Punishment[] = INCBIN_U32("graphics/battle_anims/sprites/new/punishment.4bpp.lz"); +//const u32 gBattleAnimSpritePal_Punishment[] = INCBIN_U32("graphics/battle_anims/sprites/new/punishment.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_QuickGuard[] = INCBIN_U32("graphics/battle_anims/sprites/new/quick_guard.4bpp.lz"); +//const u32 gBattleAnimSpritePal_QuickGuard[] = INCBIN_U32("graphics/battle_anims/sprites/new/quick_guard.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_StealthRock[] = INCBIN_U32("graphics/battle_anims/sprites/new/stealth_rock.4bpp.lz"); +//const u32 gBattleAnimSpritePal_StealthRock[] = INCBIN_U32("graphics/battle_anims/sprites/new/stealth_rock.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_StoneEdge[] = INCBIN_U32("graphics/battle_anims/sprites/new/stone_edge.4bpp.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_WaterGun[] = INCBIN_U32("graphics/battle_anims/sprites/new/water_gun.4bpp.lz"); +//const u32 gBattleAnimSpritePal_WaterGun[] = INCBIN_U32("graphics/battle_anims/sprites/new/water_gun.gbapal.lz"); + +//const u32 gBattleAnimSpriteGfx_Wood[] = INCBIN_U32("graphics/battle_anims/sprites/new/wood.4bpp.lz"); +//const u32 gBattleAnimSpritePal_Wood[] = INCBIN_U32("graphics/battle_anims/sprites/new/wood.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"); @@ -1153,11 +1426,12 @@ const u32 gBattleAnimBgPalette_Solarbeam[] = INCBIN_U32("graphics/battle_anims/b 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_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"); @@ -1175,6 +1449,182 @@ const u32 gBattleAnimBgImage_DarkVoid[] = INCBIN_U32("graphics/battle_anims/back 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 sBlenderCenterGfx[] = INCBIN_U32("graphics/berry_blender/center.8bpp.lz"); From 12b08670f1f0e0534d2ae2f2ae18a6b32a226561 Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Sun, 24 May 2020 04:02:58 -0400 Subject: [PATCH 580/667] Fix confusion not working at all (#385) --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index d31edb72cc..910b59fe3a 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2311,7 +2311,7 @@ u8 AtkCanceller_UnableToUseMove(void) gBattleMons[gBattlerAttacker].status2--; if (gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION) { - if (Random() % ((B_CONFUSION_SELF_DMG_CHANCE >= GEN_7) ? 3 : 2 == 0)) // confusion dmg + if (Random() % ((B_CONFUSION_SELF_DMG_CHANCE >= GEN_7) ? 3 : 2) == 0) // confusion dmg { gBattleCommunication[MULTISTRING_CHOOSER] = 1; gBattlerTarget = gBattlerAttacker; From de6811b85e37f45724cb0cb4110f9bb2c3ee4647 Mon Sep 17 00:00:00 2001 From: Philipp AUER Date: Sun, 24 May 2020 10:03:52 +0200 Subject: [PATCH 581/667] battle-engine: fix acupressure crash (#381) - fixes #380 Co-authored-by: SBird --- src/battle_script_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 5faadb24ee..a5e7f85068 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7001,7 +7001,7 @@ static void Cmd_various(void) u32 statId; do { - statId = (Random() % NUM_BATTLE_STATS) + 1; + statId = (Random() % (NUM_BATTLE_STATS - 1)) + 1; } while (!(bits & gBitTable[statId])); SET_STATCHANGER(statId, 2, FALSE); From fa1e5d1a372e92c880086e1497a0368552648455 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sun, 24 May 2020 05:05:26 -0300 Subject: [PATCH 582/667] Fix Brine (#388) Addresses #387 --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 910b59fe3a..d6730d3314 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5882,7 +5882,7 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe MulModifier(&modifier, UQ_4_12(2.0)); break; case EFFECT_BRINE: - if (gBattleMons[battlerAtk].hp <= (gBattleMons[battlerAtk].maxHP / 2)) + if (gBattleMons[battlerDef].hp <= (gBattleMons[battlerDef].maxHP / 2)) MulModifier(&modifier, UQ_4_12(2.0)); break; case EFFECT_VENOSHOCK: From 675ed1c61062e3011559e474f2274bfe611f53d8 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 24 May 2020 10:38:22 +0200 Subject: [PATCH 583/667] Fix rooms ai --- data/battle_ai_scripts.s | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 73404e5899..1e8ddea422 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -264,6 +264,21 @@ AI_CheckBadMove_CheckEffect: @ 82DC045 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 + 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: From cfc1ea7db20e8d2a5ce3c4ad5acc80989debac20 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 24 May 2020 10:40:14 +0200 Subject: [PATCH 584/667] Storm Drain Ai fix --- data/battle_ai_scripts.s | 1 + 1 file changed, 1 insertion(+) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 1e8ddea422..c8c9d62d97 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -67,6 +67,7 @@ AI_CBM_CheckIfNegatesType: 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 From fcc5ec1dd0c392ccb224f31cc4679ff4d260efce Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 24 May 2020 10:58:33 +0200 Subject: [PATCH 585/667] Fix Teleport wild double battle --- src/battle_script_commands.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a5e7f85068..81fde7c45a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1678,7 +1678,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; From f5b55ddff23f2f478c2426e80f0aa69bc7b066a2 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 24 May 2020 11:04:29 +0200 Subject: [PATCH 586/667] Vacuum wave --- data/battle_anim_scripts.s | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 6af4c3752b..fa11993f67 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -2220,22 +2220,18 @@ Move_DRAIN_PUNCH: Move_VACUUM_WAVE: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_HANDS_AND_FEET - monbg ANIM_ATK_PARTNER - createvisualtask AnimTask_GetAttackerSide, 2, 0 - waitbgfadein - delay 0 - setalpha 9, 8 - createvisualtask AnimTask_AttackerPunchWithTrace, 2, 2, RGB(8, 9, 24), 17 - playsewithpan SE_W026, SOUND_PAN_ATTACKER - delay 6 - createsprite gBasicHitSplatSpriteTemplate 131, 4, 0, 0, 1, 1 - createsprite gFistFootSpriteTemplate 132, 5, 0, 0, 8, 1, 0 - playsewithpan SE_W004, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon 2, 5, ANIM_TARGET, 3, 0, 6, 1 - waitforvisualfinish - clearmonbg ANIM_ATK_PARTNER - blendoff - end + 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_W004, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end Move_FOCUS_BLAST: loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT From c30c394082888ff5efbe7d76ecdfc29f5abc5fac Mon Sep 17 00:00:00 2001 From: Evan Date: Sun, 24 May 2020 08:40:37 -0600 Subject: [PATCH 587/667] remove commented out particles --- include/graphics.h | 25 ------------------------- src/graphics.c | 41 ----------------------------------------- 2 files changed, 66 deletions(-) diff --git a/include/graphics.h b/include/graphics.h index 89f496a595..68701934cc 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -4779,8 +4779,6 @@ extern const u32 gBattleAnimSpritePal_AuraSphere[]; extern const u32 gBattleAnimSpritePal_AvalancheRocks[]; extern const u32 gBattleAnimSpriteGfx_NewPokeball[]; extern const u32 gBattleAnimSpritePal_NewPokeball[]; -//extern const u32 gBattleAnimSpriteGfx_Bee[]; -//extern const u32 gBattleAnimSpritePal_Bee[]; extern const u32 gBattleAnimSpriteGfx_BerryEaten[]; extern const u32 gBattleAnimSpritePal_BerryEaten[]; extern const u32 gBattleAnimSpriteGfx_BerryNormal[]; @@ -4815,13 +4813,9 @@ extern const u32 gBattleAnimSpriteGfx_Drill[]; extern const u32 gBattleAnimSpritePal_Drill[]; extern const u32 gBattleAnimSpriteGfx_NewEmbers[]; extern const u32 gBattleAnimSpritePal_NewEmbers[]; -//extern const u32 gBattleAnimSpriteGfx_EnergyBall[]; -//extern const u32 gBattleAnimSpritePal_EnergyBall[]; extern const u32 gBattleAnimSpriteGfx_FairyLockChains[]; extern const u32 gBattleAnimSpriteGfx_Fishies[]; extern const u32 gBattleAnimSpritePal_Fishies[]; -//extern const u32 gBattleAnimSpriteGfx_FlashCannonBall[]; -//extern const u32 gBattleAnimSpritePal_FlashCannonBall[]; extern const u32 gBattleAnimSpriteGfx_NewFly[]; extern const u32 gBattleAnimSpritePal_NewFly[]; extern const u32 gBattleAnimSpritePal_FusionFlare[]; @@ -4863,12 +4857,6 @@ extern const u32 gBattleAnimSpriteGfx_LightningRain[]; extern const u32 gBattleAnimSpritePal_LightningRain[]; extern const u32 gBattleAnimSpriteGfx_NewEye[]; extern const u32 gBattleAnimSpritePal_NewEye[]; -//extern const u32 gBattleAnimSpriteGfx_MegaRainbow[]; -//extern const u32 gBattleAnimSpritePal_MegaRainbow[]; -//extern const u32 gBattleAnimSpriteGfx_MegaSymbol[]; -//extern const u32 gBattleAnimSpritePal_MegaSymbol[]; -//extern const u32 gBattleAnimSpriteGfx_MegaStone[]; -//extern const u32 gBattleAnimSpritePal_MegaStone[]; extern const u32 gBattleAnimSpriteGfx_MetalBits[]; extern const u32 gBattleAnimSpriteGfx_MudBomb[]; extern const u32 gBattleAnimSpritePal_MudBomb[]; @@ -4886,14 +4874,8 @@ extern const u32 gBattleAnimSpriteGfx_PinkDiamond[]; extern const u32 gBattleAnimSpritePal_PinkDiamond[]; extern const u32 gBattleAnimSpriteGfx_PoisonColumn[]; extern const u32 gBattleAnimSpritePal_PoisonColumn[]; -//extern const u32 gBattleAnimSpriteGfx_PoisonJab[]; -//extern const u32 gBattleAnimSpritePal_PoisonJab[]; -//extern const u32 gBattleAnimSpriteGfx_PowerGem[]; -//extern const u32 gBattleAnimSpritePal_PowerGem[]; extern const u32 gBattleAnimSpriteGfx_PowerTrick[]; extern const u32 gBattleAnimSpritePal_PowerTrick[]; -//extern const u32 gBattleAnimSpriteGfx_Punishment[]; -//extern const u32 gBattleAnimSpritePal_Punishment[]; extern const u32 gBattleAnimSpriteGfx_PurpleDrake[]; extern const u32 gBattleAnimSpritePal_PurpleDrake[]; extern const u32 gBattleAnimSpriteGfx_QuickGuard[]; @@ -4911,13 +4893,10 @@ extern const u32 gBattleAnimSpriteGfx_NewSpikes[]; extern const u32 gBattleAnimSpritePal_NewSpikes[]; extern const u32 gBattleAnimSpriteGfx_SpiritShackleArrow[]; extern const u32 gBattleAnimSpritePal_SpiritShackleArrow[]; -//extern const u32 gBattleAnimSpriteGfx_StealthRock[]; -//extern const u32 gBattleAnimSpritePal_StealthRock[]; extern const u32 gBattleAnimSpriteGfx_SteamEruption[]; extern const u32 gBattleAnimSpritePal_SteamEruption[]; extern const u32 gBattleAnimSpriteGfx_Steamroller[]; extern const u32 gBattleAnimSpritePal_Steamroller[]; -//extern const u32 gBattleAnimSpriteGfx_StoneEdge[]; extern const u32 gBattleAnimSpriteGfx_StonePillar[]; extern const u32 gBattleAnimSpritePal_StonePillar[]; extern const u32 gBattleAnimSpriteGfx_StraightBeam[]; @@ -4934,10 +4913,6 @@ extern const u32 gBattleAnimSpriteGfx_NewHandsAndFeet[]; extern const u32 gBattleAnimSpritePal_NewHandsAndFeet[]; extern const u32 gBattleAnimSpriteGfx_Tornado[]; extern const u32 gBattleAnimSpritePal_Tornado[]; -//extern const u32 gBattleAnimSpriteGfx_WaterGun[]; -//extern const u32 gBattleAnimSpritePal_WaterGun[]; -//extern const u32 gBattleAnimSpriteGfx_Wood[]; -//extern const u32 gBattleAnimSpritePal_Wood[]; extern const u32 gBattleAnimSpriteGfx_ZMoveSymbol[]; extern const u32 gBattleAnimSpritePal_ZMoveSymbol[]; diff --git a/src/graphics.c b/src/graphics.c index f1eb1b8c6e..2fe076cdcd 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -77,9 +77,6 @@ const u32 gBattleAnimSpritePal_AvalancheRocks[] = INCBIN_U32("graphics/battle_an 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_Bee[] = INCBIN_U32("graphics/battle_anims/sprites/new/bee.4bpp.lz"); -//const u32 gBattleAnimSpritePal_Bee[] = INCBIN_U32("graphics/battle_anims/sprites/new/bee.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"); @@ -132,17 +129,11 @@ const u32 gBattleAnimSpritePal_Drill[] = INCBIN_U32("graphics/battle_anims/sprit 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_EnergyBall[] = INCBIN_U32("graphics/battle_anims/sprites/new/energy_ball.4bpp.lz"); -//const u32 gBattleAnimSpritePal_EnergyBall[] = INCBIN_U32("graphics/battle_anims/sprites/new/energy_ball.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_FlashCannonBall[] = INCBIN_U32("graphics/battle_anims/sprites/new/flash_cannon_ball.4bpp.lz"); -//const u32 gBattleAnimSpritePal_FlashCannonBall[] = INCBIN_U32("graphics/battle_anims/sprites/new/flash_cannon_ball.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"); @@ -206,15 +197,6 @@ const u32 gBattleAnimSpritePal_LightningRain[] = INCBIN_U32("graphics/battle_ani 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_MegaRainbow[] = INCBIN_U32("graphics/battle_anims/sprites/new/mega_evolution_rainbow.4bpp.lz"); -//const u32 gBattleAnimSpritePal_MegaRainbow[] = INCBIN_U32("graphics/battle_anims/sprites/new/mega_evolution_rainbow.gbapal.lz"); - -//const u32 gBattleAnimSpriteGfx_MegaSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/new/mega_evolution_symbol.4bpp.lz"); -//const u32 gBattleAnimSpritePal_MegaSymbol[] = INCBIN_U32("graphics/battle_anims/sprites/new/mega_evolution_symbol.gbapal.lz"); - -//const u32 gBattleAnimSpriteGfx_MegaStone[] = INCBIN_U32("graphics/battle_anims/sprites/new/mega_stone.4bpp.lz"); -//const u32 gBattleAnimSpritePal_MegaStone[] = INCBIN_U32("graphics/battle_anims/sprites/new/mega_stone.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"); @@ -242,24 +224,12 @@ const u32 gBattleAnimSpritePal_PinkDiamond[] = INCBIN_U32("graphics/battle_anims 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_PoisonJab[] = INCBIN_U32("graphics/battle_anims/sprites/new/poison_jab.4bpp.lz"); -//const u32 gBattleAnimSpritePal_PoisonJab[] = INCBIN_U32("graphics/battle_anims/sprites/new/poison_jab.gbapal.lz"); - -//const u32 gBattleAnimSpriteGfx_PowerGem[] = INCBIN_U32("graphics/battle_anims/sprites/new/power_gem.4bpp.lz"); -//const u32 gBattleAnimSpritePal_PowerGem[] = INCBIN_U32("graphics/battle_anims/sprites/new/power_gem.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_Punishment[] = INCBIN_U32("graphics/battle_anims/sprites/new/punishment.4bpp.lz"); -//const u32 gBattleAnimSpritePal_Punishment[] = INCBIN_U32("graphics/battle_anims/sprites/new/punishment.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_QuickGuard[] = INCBIN_U32("graphics/battle_anims/sprites/new/quick_guard.4bpp.lz"); -//const u32 gBattleAnimSpritePal_QuickGuard[] = INCBIN_U32("graphics/battle_anims/sprites/new/quick_guard.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"); @@ -281,17 +251,12 @@ const u32 gBattleAnimSpritePal_NewSpikes[] = INCBIN_U32("graphics/battle_anims/s 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_StealthRock[] = INCBIN_U32("graphics/battle_anims/sprites/new/stealth_rock.4bpp.lz"); -//const u32 gBattleAnimSpritePal_StealthRock[] = INCBIN_U32("graphics/battle_anims/sprites/new/stealth_rock.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_StoneEdge[] = INCBIN_U32("graphics/battle_anims/sprites/new/stone_edge.4bpp.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"); @@ -316,12 +281,6 @@ const u32 gBattleAnimSpritePal_NewHandsAndFeet[] = INCBIN_U32("graphics/battle_a 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_WaterGun[] = INCBIN_U32("graphics/battle_anims/sprites/new/water_gun.4bpp.lz"); -//const u32 gBattleAnimSpritePal_WaterGun[] = INCBIN_U32("graphics/battle_anims/sprites/new/water_gun.gbapal.lz"); - -//const u32 gBattleAnimSpriteGfx_Wood[] = INCBIN_U32("graphics/battle_anims/sprites/new/wood.4bpp.lz"); -//const u32 gBattleAnimSpritePal_Wood[] = INCBIN_U32("graphics/battle_anims/sprites/new/wood.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"); From 13cf2cb217f0c2f6d6e8f8956b234e69b0342321 Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Sun, 24 May 2020 10:13:40 -0600 Subject: [PATCH 588/667] Animation Particles, BGs, and gen 4 anims (#384) * undo some revert(?) * cfru particles and bgs * remove commented out particles --- data/battle_anim_scripts.s | 365 ++++++++++++++- .../battle_anims/backgrounds/dark_void.bin | Bin 0 -> 1236 bytes .../battle_anims/backgrounds/dark_void.pal | 19 + .../battle_anims/backgrounds/dark_void.png | Bin 0 -> 7041 bytes .../backgrounds/new/aeroblast.pal | 19 + .../backgrounds/new/aeroblast_map.bin | Bin 0 -> 804 bytes .../backgrounds/new/aeroblast_tiles.png | Bin 0 -> 2902 bytes .../backgrounds/new/aura_sphere.pal | 19 + .../backgrounds/new/blackhole_eclipse.bin | Bin 0 -> 892 bytes .../backgrounds/new/blackhole_eclipse.png | Bin 0 -> 4122 bytes .../backgrounds/new/bloom_doom.bin | Bin 0 -> 564 bytes .../backgrounds/new/bloom_doom.pal | 19 + .../backgrounds/new/bloom_doom.png | Bin 0 -> 1788 bytes .../backgrounds/new/bolt_strike.bin | Bin 0 -> 780 bytes .../backgrounds/new/bolt_strike.pal | 19 + .../backgrounds/new/bolt_strike.png | Bin 0 -> 5861 bytes .../backgrounds/new/clangorous_soulblaze.bin | Bin 0 -> 700 bytes .../backgrounds/new/clangorous_soulblaze.pal | 19 + .../backgrounds/new/clangorous_soulblaze.png | Bin 0 -> 1696 bytes .../backgrounds/new/dark_void.bin | Bin 0 -> 1236 bytes .../backgrounds/new/dark_void.pal | 19 + .../backgrounds/new/dark_void.png | Bin 0 -> 7041 bytes .../backgrounds/new/dynamax_cannon.pal | 19 + .../backgrounds/new/electric_terrain.bin | Bin 0 -> 2020 bytes .../backgrounds/new/electric_terrain.pal | 19 + .../backgrounds/new/electric_terrain.png | Bin 0 -> 3458 bytes .../battle_anims/backgrounds/new/fire1.bin | Bin 0 -> 684 bytes .../battle_anims/backgrounds/new/fire1.pal | 19 + .../battle_anims/backgrounds/new/fire1.png | Bin 0 -> 2557 bytes .../battle_anims/backgrounds/new/fire2.pal | 19 + .../backgrounds/new/focus_blast.bin | Bin 0 -> 952 bytes .../backgrounds/new/focus_blast.pal | 19 + .../backgrounds/new/focus_blast.png | Bin 0 -> 3537 bytes .../backgrounds/new/garbage_falls.pal | 19 + .../backgrounds/new/giga_impact_opponent.bin | Bin 0 -> 704 bytes .../backgrounds/new/giga_impact_opponent.pal | 19 + .../backgrounds/new/giga_impact_opponent.png | Bin 0 -> 3056 bytes .../backgrounds/new/giga_impact_player.bin | Bin 0 -> 744 bytes .../backgrounds/new/giga_impact_player.pal | 19 + .../backgrounds/new/giga_impact_player.png | Bin 0 -> 3098 bytes .../backgrounds/new/grassy_terrain.bin | Bin 0 -> 2244 bytes .../backgrounds/new/grassy_terrain.pal | 19 + .../backgrounds/new/grassy_terrain.png | Bin 0 -> 3912 bytes .../backgrounds/new/gunk_shot.pal | 19 + .../backgrounds/new/high_speed.bin | Bin 0 -> 496 bytes .../backgrounds/new/high_speed.pal | 19 + .../backgrounds/new/high_speed.png | Bin 0 -> 855 bytes .../backgrounds/new/hydro_cannon.bin | Bin 0 -> 880 bytes .../backgrounds/new/hydro_cannon.pal | 19 + .../backgrounds/new/hydro_cannon.png | Bin 0 -> 1089 bytes .../backgrounds/new/hydro_pump.bin | Bin 0 -> 224 bytes .../backgrounds/new/hydro_pump.pal | 19 + .../backgrounds/new/hydro_pump.png | Bin 0 -> 540 bytes .../backgrounds/new/hyper_beam.pal | 19 + .../backgrounds/new/hyperspace_fury.pal | 19 + .../backgrounds/new/inferno_overdrive.bin | Bin 0 -> 556 bytes .../backgrounds/new/inferno_overdrive.pal | 19 + .../backgrounds/new/inferno_overdrive.png | Bin 0 -> 5090 bytes .../backgrounds/new/leaf_storm.bin | Bin 0 -> 924 bytes .../backgrounds/new/leaf_storm.pal | 19 + .../backgrounds/new/leaf_storm.png | Bin 0 -> 3338 bytes .../backgrounds/new/magic_room.pal | 19 + .../backgrounds/new/malicious_moonsault.bin | Bin 0 -> 544 bytes .../backgrounds/new/malicious_moonsault.pal | 19 + .../backgrounds/new/malicious_moonsault.png | Bin 0 -> 1839 bytes .../backgrounds/new/max_lightning.bin | Bin 0 -> 744 bytes .../backgrounds/new/max_lightning.pal | 19 + .../backgrounds/new/max_lightning.png | Bin 0 -> 1959 bytes .../backgrounds/new/misty_terrain.bin | Bin 0 -> 2180 bytes .../backgrounds/new/misty_terrain.pal | 19 + .../backgrounds/new/misty_terrain.png | Bin 0 -> 3541 bytes .../backgrounds/new/neverending_nightmare.bin | Bin 0 -> 744 bytes .../backgrounds/new/neverending_nightmare.pal | 19 + .../backgrounds/new/neverending_nightmare.png | Bin 0 -> 3739 bytes .../backgrounds/new/nightmare.bin | Bin 0 -> 756 bytes .../backgrounds/new/nightmare.pal | 19 + .../backgrounds/new/nightmare.png | Bin 0 -> 3356 bytes .../backgrounds/new/poison_falls.pal | 19 + .../battle_anims/backgrounds/new/psychic.pal | 19 + .../backgrounds/new/psychic_terrain.bin | Bin 0 -> 1904 bytes .../backgrounds/new/psychic_terrain.pal | 19 + .../backgrounds/new/psychic_terrain.png | Bin 0 -> 3694 bytes .../backgrounds/new/rock_wrecker.bin | Bin 0 -> 676 bytes .../backgrounds/new/rock_wrecker.pal | 19 + .../backgrounds/new/rock_wrecker.png | Bin 0 -> 1511 bytes .../backgrounds/new/shattered_psyche.bin | Bin 0 -> 808 bytes .../backgrounds/new/shattered_psyche.pal | 19 + .../backgrounds/new/shattered_psyche.png | Bin 0 -> 2406 bytes .../backgrounds/new/sky_afternoon.pal | 19 + .../battle_anims/backgrounds/new/sky_day.bin | Bin 0 -> 1052 bytes .../battle_anims/backgrounds/new/sky_day.pal | 19 + .../battle_anims/backgrounds/new/sky_day.png | Bin 0 -> 7508 bytes .../backgrounds/new/sky_night.pal | 19 + .../backgrounds/new/sludge_wave.pal | 19 + .../backgrounds/new/snuggle_forever.bin | Bin 0 -> 988 bytes .../backgrounds/new/snuggle_forever.pal | 19 + .../backgrounds/new/snuggle_forever.png | Bin 0 -> 6425 bytes .../new/soulstealing_7star_strike.bin | Bin 0 -> 968 bytes .../new/soulstealing_7star_strike.pal | 19 + .../new/soulstealing_7star_strike.png | Bin 0 -> 2600 bytes .../backgrounds/new/spacial_rend_opponent.bin | Bin 0 -> 1000 bytes .../backgrounds/new/spacial_rend_opponent.pal | 19 + .../backgrounds/new/spacial_rend_opponent.png | Bin 0 -> 5861 bytes .../backgrounds/new/spacial_rend_player.bin | Bin 0 -> 996 bytes .../backgrounds/new/spacial_rend_player.pal | 19 + .../backgrounds/new/spacial_rend_player.png | Bin 0 -> 6948 bytes .../backgrounds/new/tectonic_rage.bin | Bin 0 -> 296 bytes .../backgrounds/new/tectonic_rage.pal | 19 + .../backgrounds/new/trick_room.bin | Bin 0 -> 844 bytes .../backgrounds/new/trick_room.pal | 19 + .../backgrounds/new/trick_room.png | Bin 0 -> 2137 bytes .../backgrounds/new/twinkle_tackle.bin | Bin 0 -> 784 bytes .../backgrounds/new/twinkle_tackle.pal | 19 + .../backgrounds/new/twinkle_tackle.png | Bin 0 -> 2243 bytes .../backgrounds/new/water_pulse.bin | Bin 0 -> 600 bytes .../backgrounds/new/water_pulse.pal | 19 + .../backgrounds/new/water_pulse.png | Bin 0 -> 2106 bytes .../backgrounds/new/waterfall.bin | Bin 0 -> 2128 bytes .../backgrounds/new/waterfall.pal | 19 + .../backgrounds/new/waterfall.png | Bin 0 -> 5092 bytes .../backgrounds/new/wonder_room.pal | 19 + .../backgrounds/new/zmove_activate.bin | Bin 0 -> 520 bytes .../backgrounds/new/zmove_activate.pal | 19 + .../backgrounds/new/zmove_activate.png | Bin 0 -> 905 bytes .../backgrounds/new/zmove_mountain.bin | Bin 0 -> 760 bytes .../backgrounds/new/zmove_mountain.pal | 19 + .../backgrounds/new/zmove_mountain.png | Bin 0 -> 2174 bytes .../backgrounds/spacial_rend_opponent.bin | Bin 0 -> 1000 bytes .../backgrounds/spacial_rend_opponent.pal | 19 + .../backgrounds/spacial_rend_opponent.png | Bin 0 -> 5861 bytes .../backgrounds/spacial_rend_player.bin | Bin 0 -> 996 bytes .../backgrounds/spacial_rend_player.pal | 19 + .../backgrounds/spacial_rend_player.png | Bin 0 -> 6948 bytes .../sprites/flash_cannon_ball.png | Bin 0 -> 257 bytes .../sprites/new/ability_pop_up.png | Bin 0 -> 275 bytes .../sprites/new/acupressure_finger.png | Bin 0 -> 298 bytes .../battle_anims/sprites/new/alpha_stone.png | Bin 0 -> 933 bytes graphics/battle_anims/sprites/new/anchor.png | Bin 0 -> 282 bytes graphics/battle_anims/sprites/new/apple.png | Bin 0 -> 214 bytes graphics/battle_anims/sprites/new/arrows.png | Bin 0 -> 199 bytes .../sprites/new/assurance_hand.png | Bin 0 -> 330 bytes .../battle_anims/sprites/new/aura_sphere.png | Bin 0 -> 1086 bytes .../sprites/new/avalanche_rocks.pal | 19 + .../sprites/new/baton_pass_ball.png | Bin 0 -> 203 bytes graphics/battle_anims/sprites/new/bee.png | Bin 0 -> 317 bytes .../battle_anims/sprites/new/berry_eaten.png | Bin 0 -> 255 bytes .../battle_anims/sprites/new/berry_normal.png | Bin 0 -> 297 bytes .../battle_anims/sprites/new/big_rock.png | Bin 0 -> 727 bytes .../sprites/new/blacephalon_head.png | Bin 0 -> 411 bytes .../battle_anims/sprites/new/blue_flare.pal | 259 +++++++++++ graphics/battle_anims/sprites/new/branch.png | Bin 0 -> 256 bytes graphics/battle_anims/sprites/new/brine.png | Bin 0 -> 259 bytes graphics/battle_anims/sprites/new/cacoon.png | Bin 0 -> 10874 bytes .../battle_anims/sprites/new/chain_link.png | Bin 0 -> 249 bytes graphics/battle_anims/sprites/new/chop.png | Bin 0 -> 222 bytes graphics/battle_anims/sprites/new/confide.png | Bin 0 -> 633 bytes .../sprites/new/crafty_shield.png | Bin 0 -> 170 bytes .../battle_anims/sprites/new/curse_nail.png | Bin 0 -> 368 bytes .../battle_anims/sprites/new/draco_meteor.pal | 19 + .../sprites/new/dragon_pulse_ring.png | Bin 0 -> 223 bytes .../sprites/new/dreepy_missile.png | Bin 0 -> 281 bytes graphics/battle_anims/sprites/new/drill.png | Bin 0 -> 1151 bytes graphics/battle_anims/sprites/new/embers.png | Bin 0 -> 1334 bytes .../battle_anims/sprites/new/energy_ball.png | Bin 0 -> 409 bytes .../sprites/new/fairy_lock_chains.png | Bin 0 -> 227 bytes graphics/battle_anims/sprites/new/fishies.png | Bin 0 -> 265 bytes .../sprites/new/flash_cannon_ball.png | Bin 0 -> 257 bytes graphics/battle_anims/sprites/new/fly.png | Bin 0 -> 1172 bytes .../battle_anims/sprites/new/fusion_flare.pal | 19 + .../sprites/new/garbage_poison_column.pal | 19 + graphics/battle_anims/sprites/new/gear.png | Bin 0 -> 271 bytes .../sprites/new/gigavolt_havoc_spear.png | Bin 0 -> 413 bytes .../battle_anims/sprites/new/golden_apple.png | Bin 0 -> 302 bytes .../battle_anims/sprites/new/green_drake.pal | 19 + .../battle_anims/sprites/new/green_star.png | Bin 0 -> 258 bytes .../battle_anims/sprites/new/heart_stamp.png | Bin 0 -> 327 bytes graphics/battle_anims/sprites/new/hexes.png | Bin 0 -> 442 bytes .../battle_anims/sprites/new/hoopa_hand.png | Bin 0 -> 211 bytes .../battle_anims/sprites/new/hoopa_ring.png | Bin 0 -> 480 bytes graphics/battle_anims/sprites/new/horn.png | Bin 0 -> 1010 bytes .../battle_anims/sprites/new/horn_leech.png | Bin 0 -> 368 bytes .../sprites/new/horseshoe_fist.png | Bin 0 -> 5104 bytes .../battle_anims/sprites/new/hydro_pump.png | Bin 0 -> 244 bytes .../battle_anims/sprites/new/ice_rock.png | Bin 0 -> 1287 bytes graphics/battle_anims/sprites/new/impact.pal | 19 + .../battle_anims/sprites/new/large_spike.png | Bin 0 -> 734 bytes graphics/battle_anims/sprites/new/leaves.png | Bin 0 -> 503 bytes .../battle_anims/sprites/new/leech_seed.png | Bin 0 -> 280 bytes .../sprites/new/lightning_rain.png | Bin 0 -> 356 bytes .../battle_anims/sprites/new/mean_look.png | Bin 0 -> 1144 bytes .../battle_anims/sprites/new/metal_bits.png | Bin 0 -> 154 bytes .../battle_anims/sprites/new/mud_bomb.png | Bin 0 -> 525 bytes .../battle_anims/sprites/new/mushroom.png | Bin 0 -> 661 bytes .../sprites/new/natural_gift_ring.pal | 19 + .../sprites/new/necrozma_star.png | Bin 0 -> 191 bytes .../battle_anims/sprites/new/obstruct.png | Bin 0 -> 252 bytes .../battle_anims/sprites/new/omega_stone.png | Bin 0 -> 917 bytes .../battle_anims/sprites/new/pink_diamond.png | Bin 0 -> 170 bytes .../sprites/new/poison_column.png | Bin 0 -> 904 bytes .../battle_anims/sprites/new/poison_jab.png | Bin 0 -> 194 bytes .../battle_anims/sprites/new/power_gem.png | Bin 0 -> 179 bytes .../battle_anims/sprites/new/power_trick.png | Bin 0 -> 540 bytes .../battle_anims/sprites/new/punishment.png | Bin 0 -> 470 bytes .../battle_anims/sprites/new/purple_drake.png | Bin 0 -> 643 bytes .../battle_anims/sprites/new/quick_guard.png | Bin 0 -> 205 bytes .../battle_anims/sprites/new/razor_shell.png | Bin 0 -> 313 bytes .../battle_anims/sprites/new/rock_small.png | Bin 0 -> 237 bytes graphics/battle_anims/sprites/new/rocks.png | Bin 0 -> 1361 bytes .../battle_anims/sprites/new/shell_left.png | Bin 0 -> 381 bytes .../battle_anims/sprites/new/shell_right.png | Bin 0 -> 380 bytes .../sprites/new/spacial_rend_slices.pal | 19 + graphics/battle_anims/sprites/new/spikes.png | Bin 0 -> 175 bytes .../sprites/new/spirit_shackle_arrow.png | Bin 0 -> 236 bytes .../battle_anims/sprites/new/stealth_rock.png | Bin 0 -> 395 bytes .../sprites/new/steam_eruption.png | Bin 0 -> 222 bytes .../battle_anims/sprites/new/steamroller.png | Bin 0 -> 838 bytes .../battle_anims/sprites/new/stone_edge.png | Bin 0 -> 326 bytes .../battle_anims/sprites/new/stone_pillar.png | Bin 0 -> 1317 bytes .../sprites/new/straight_beam.png | Bin 0 -> 152 bytes .../sprites/new/substitute_back.png | Bin 0 -> 488 bytes .../sprites/new/substitute_front.png | Bin 0 -> 420 bytes .../battle_anims/sprites/new/surf_new.pal | 19 + graphics/battle_anims/sprites/new/sword.png | Bin 0 -> 272 bytes graphics/battle_anims/sprites/new/teeth.png | Bin 0 -> 465 bytes graphics/battle_anims/sprites/new/thrash.png | Bin 0 -> 440 bytes graphics/battle_anims/sprites/new/tornado.png | Bin 0 -> 1608 bytes .../battle_anims/sprites/new/water_gun.png | Bin 0 -> 214 bytes graphics/battle_anims/sprites/new/wood.png | Bin 0 -> 881 bytes .../sprites/new/z_move_symbol.png | Bin 0 -> 381 bytes graphics/battle_anims/sprites/punishment.png | Bin 0 -> 470 bytes graphics/battle_anims/sprites/quick_guard.png | Bin 0 -> 205 bytes graphics/battle_anims/sprites/water_gun.png | Bin 0 -> 214 bytes include/battle_anim.h | 2 + include/constants/battle_anim.h | 116 +++++ include/constants/battle_config.h | 17 + include/graphics.h | 272 +++++++++++ src/battle_anim.c | 303 +++++++++++- src/battle_anim_effects_1.c | 69 +++ src/battle_anim_effects_2.c | 23 +- src/battle_anim_electric.c | 48 ++ src/battle_anim_fire.c | 22 + src/battle_anim_ghost.c | 11 + src/battle_anim_ice.c | 11 + src/battle_anim_rock.c | 37 ++ src/graphics.c | 439 +++++++++++++++++- 245 files changed, 3165 insertions(+), 7 deletions(-) create mode 100644 graphics/battle_anims/backgrounds/dark_void.bin create mode 100644 graphics/battle_anims/backgrounds/dark_void.pal create mode 100644 graphics/battle_anims/backgrounds/dark_void.png create mode 100644 graphics/battle_anims/backgrounds/new/aeroblast.pal create mode 100644 graphics/battle_anims/backgrounds/new/aeroblast_map.bin create mode 100644 graphics/battle_anims/backgrounds/new/aeroblast_tiles.png create mode 100644 graphics/battle_anims/backgrounds/new/aura_sphere.pal create mode 100644 graphics/battle_anims/backgrounds/new/blackhole_eclipse.bin create mode 100644 graphics/battle_anims/backgrounds/new/blackhole_eclipse.png create mode 100644 graphics/battle_anims/backgrounds/new/bloom_doom.bin create mode 100644 graphics/battle_anims/backgrounds/new/bloom_doom.pal create mode 100644 graphics/battle_anims/backgrounds/new/bloom_doom.png create mode 100644 graphics/battle_anims/backgrounds/new/bolt_strike.bin create mode 100644 graphics/battle_anims/backgrounds/new/bolt_strike.pal create mode 100644 graphics/battle_anims/backgrounds/new/bolt_strike.png create mode 100644 graphics/battle_anims/backgrounds/new/clangorous_soulblaze.bin create mode 100644 graphics/battle_anims/backgrounds/new/clangorous_soulblaze.pal create mode 100644 graphics/battle_anims/backgrounds/new/clangorous_soulblaze.png create mode 100644 graphics/battle_anims/backgrounds/new/dark_void.bin create mode 100644 graphics/battle_anims/backgrounds/new/dark_void.pal create mode 100644 graphics/battle_anims/backgrounds/new/dark_void.png create mode 100644 graphics/battle_anims/backgrounds/new/dynamax_cannon.pal create mode 100644 graphics/battle_anims/backgrounds/new/electric_terrain.bin create mode 100644 graphics/battle_anims/backgrounds/new/electric_terrain.pal create mode 100644 graphics/battle_anims/backgrounds/new/electric_terrain.png create mode 100644 graphics/battle_anims/backgrounds/new/fire1.bin create mode 100644 graphics/battle_anims/backgrounds/new/fire1.pal create mode 100644 graphics/battle_anims/backgrounds/new/fire1.png create mode 100644 graphics/battle_anims/backgrounds/new/fire2.pal create mode 100644 graphics/battle_anims/backgrounds/new/focus_blast.bin create mode 100644 graphics/battle_anims/backgrounds/new/focus_blast.pal create mode 100644 graphics/battle_anims/backgrounds/new/focus_blast.png create mode 100644 graphics/battle_anims/backgrounds/new/garbage_falls.pal create mode 100644 graphics/battle_anims/backgrounds/new/giga_impact_opponent.bin create mode 100644 graphics/battle_anims/backgrounds/new/giga_impact_opponent.pal create mode 100644 graphics/battle_anims/backgrounds/new/giga_impact_opponent.png create mode 100644 graphics/battle_anims/backgrounds/new/giga_impact_player.bin create mode 100644 graphics/battle_anims/backgrounds/new/giga_impact_player.pal create mode 100644 graphics/battle_anims/backgrounds/new/giga_impact_player.png create mode 100644 graphics/battle_anims/backgrounds/new/grassy_terrain.bin create mode 100644 graphics/battle_anims/backgrounds/new/grassy_terrain.pal create mode 100644 graphics/battle_anims/backgrounds/new/grassy_terrain.png create mode 100644 graphics/battle_anims/backgrounds/new/gunk_shot.pal create mode 100644 graphics/battle_anims/backgrounds/new/high_speed.bin create mode 100644 graphics/battle_anims/backgrounds/new/high_speed.pal create mode 100644 graphics/battle_anims/backgrounds/new/high_speed.png create mode 100644 graphics/battle_anims/backgrounds/new/hydro_cannon.bin create mode 100644 graphics/battle_anims/backgrounds/new/hydro_cannon.pal create mode 100644 graphics/battle_anims/backgrounds/new/hydro_cannon.png create mode 100644 graphics/battle_anims/backgrounds/new/hydro_pump.bin create mode 100644 graphics/battle_anims/backgrounds/new/hydro_pump.pal create mode 100644 graphics/battle_anims/backgrounds/new/hydro_pump.png create mode 100644 graphics/battle_anims/backgrounds/new/hyper_beam.pal create mode 100644 graphics/battle_anims/backgrounds/new/hyperspace_fury.pal create mode 100644 graphics/battle_anims/backgrounds/new/inferno_overdrive.bin create mode 100644 graphics/battle_anims/backgrounds/new/inferno_overdrive.pal create mode 100644 graphics/battle_anims/backgrounds/new/inferno_overdrive.png create mode 100644 graphics/battle_anims/backgrounds/new/leaf_storm.bin create mode 100644 graphics/battle_anims/backgrounds/new/leaf_storm.pal create mode 100644 graphics/battle_anims/backgrounds/new/leaf_storm.png create mode 100644 graphics/battle_anims/backgrounds/new/magic_room.pal create mode 100644 graphics/battle_anims/backgrounds/new/malicious_moonsault.bin create mode 100644 graphics/battle_anims/backgrounds/new/malicious_moonsault.pal create mode 100644 graphics/battle_anims/backgrounds/new/malicious_moonsault.png create mode 100644 graphics/battle_anims/backgrounds/new/max_lightning.bin create mode 100644 graphics/battle_anims/backgrounds/new/max_lightning.pal create mode 100644 graphics/battle_anims/backgrounds/new/max_lightning.png create mode 100644 graphics/battle_anims/backgrounds/new/misty_terrain.bin create mode 100644 graphics/battle_anims/backgrounds/new/misty_terrain.pal create mode 100644 graphics/battle_anims/backgrounds/new/misty_terrain.png create mode 100644 graphics/battle_anims/backgrounds/new/neverending_nightmare.bin create mode 100644 graphics/battle_anims/backgrounds/new/neverending_nightmare.pal create mode 100644 graphics/battle_anims/backgrounds/new/neverending_nightmare.png create mode 100644 graphics/battle_anims/backgrounds/new/nightmare.bin create mode 100644 graphics/battle_anims/backgrounds/new/nightmare.pal create mode 100644 graphics/battle_anims/backgrounds/new/nightmare.png create mode 100644 graphics/battle_anims/backgrounds/new/poison_falls.pal create mode 100644 graphics/battle_anims/backgrounds/new/psychic.pal create mode 100644 graphics/battle_anims/backgrounds/new/psychic_terrain.bin create mode 100644 graphics/battle_anims/backgrounds/new/psychic_terrain.pal create mode 100644 graphics/battle_anims/backgrounds/new/psychic_terrain.png create mode 100644 graphics/battle_anims/backgrounds/new/rock_wrecker.bin create mode 100644 graphics/battle_anims/backgrounds/new/rock_wrecker.pal create mode 100644 graphics/battle_anims/backgrounds/new/rock_wrecker.png create mode 100644 graphics/battle_anims/backgrounds/new/shattered_psyche.bin create mode 100644 graphics/battle_anims/backgrounds/new/shattered_psyche.pal create mode 100644 graphics/battle_anims/backgrounds/new/shattered_psyche.png create mode 100644 graphics/battle_anims/backgrounds/new/sky_afternoon.pal create mode 100644 graphics/battle_anims/backgrounds/new/sky_day.bin create mode 100644 graphics/battle_anims/backgrounds/new/sky_day.pal create mode 100644 graphics/battle_anims/backgrounds/new/sky_day.png create mode 100644 graphics/battle_anims/backgrounds/new/sky_night.pal create mode 100644 graphics/battle_anims/backgrounds/new/sludge_wave.pal create mode 100644 graphics/battle_anims/backgrounds/new/snuggle_forever.bin create mode 100644 graphics/battle_anims/backgrounds/new/snuggle_forever.pal create mode 100644 graphics/battle_anims/backgrounds/new/snuggle_forever.png create mode 100644 graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.bin create mode 100644 graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.pal create mode 100644 graphics/battle_anims/backgrounds/new/soulstealing_7star_strike.png create mode 100644 graphics/battle_anims/backgrounds/new/spacial_rend_opponent.bin create mode 100644 graphics/battle_anims/backgrounds/new/spacial_rend_opponent.pal create mode 100644 graphics/battle_anims/backgrounds/new/spacial_rend_opponent.png create mode 100644 graphics/battle_anims/backgrounds/new/spacial_rend_player.bin create mode 100644 graphics/battle_anims/backgrounds/new/spacial_rend_player.pal create mode 100644 graphics/battle_anims/backgrounds/new/spacial_rend_player.png create mode 100644 graphics/battle_anims/backgrounds/new/tectonic_rage.bin create mode 100644 graphics/battle_anims/backgrounds/new/tectonic_rage.pal create mode 100644 graphics/battle_anims/backgrounds/new/trick_room.bin create mode 100644 graphics/battle_anims/backgrounds/new/trick_room.pal create mode 100644 graphics/battle_anims/backgrounds/new/trick_room.png create mode 100644 graphics/battle_anims/backgrounds/new/twinkle_tackle.bin create mode 100644 graphics/battle_anims/backgrounds/new/twinkle_tackle.pal create mode 100644 graphics/battle_anims/backgrounds/new/twinkle_tackle.png create mode 100644 graphics/battle_anims/backgrounds/new/water_pulse.bin create mode 100644 graphics/battle_anims/backgrounds/new/water_pulse.pal create mode 100644 graphics/battle_anims/backgrounds/new/water_pulse.png create mode 100644 graphics/battle_anims/backgrounds/new/waterfall.bin create mode 100644 graphics/battle_anims/backgrounds/new/waterfall.pal create mode 100644 graphics/battle_anims/backgrounds/new/waterfall.png create mode 100644 graphics/battle_anims/backgrounds/new/wonder_room.pal create mode 100644 graphics/battle_anims/backgrounds/new/zmove_activate.bin create mode 100644 graphics/battle_anims/backgrounds/new/zmove_activate.pal create mode 100644 graphics/battle_anims/backgrounds/new/zmove_activate.png create mode 100644 graphics/battle_anims/backgrounds/new/zmove_mountain.bin create mode 100644 graphics/battle_anims/backgrounds/new/zmove_mountain.pal create mode 100644 graphics/battle_anims/backgrounds/new/zmove_mountain.png create mode 100644 graphics/battle_anims/backgrounds/spacial_rend_opponent.bin create mode 100644 graphics/battle_anims/backgrounds/spacial_rend_opponent.pal create mode 100644 graphics/battle_anims/backgrounds/spacial_rend_opponent.png create mode 100644 graphics/battle_anims/backgrounds/spacial_rend_player.bin create mode 100644 graphics/battle_anims/backgrounds/spacial_rend_player.pal create mode 100644 graphics/battle_anims/backgrounds/spacial_rend_player.png create mode 100644 graphics/battle_anims/sprites/flash_cannon_ball.png create mode 100644 graphics/battle_anims/sprites/new/ability_pop_up.png create mode 100644 graphics/battle_anims/sprites/new/acupressure_finger.png create mode 100644 graphics/battle_anims/sprites/new/alpha_stone.png create mode 100644 graphics/battle_anims/sprites/new/anchor.png create mode 100644 graphics/battle_anims/sprites/new/apple.png create mode 100644 graphics/battle_anims/sprites/new/arrows.png create mode 100644 graphics/battle_anims/sprites/new/assurance_hand.png create mode 100644 graphics/battle_anims/sprites/new/aura_sphere.png create mode 100644 graphics/battle_anims/sprites/new/avalanche_rocks.pal create mode 100644 graphics/battle_anims/sprites/new/baton_pass_ball.png create mode 100644 graphics/battle_anims/sprites/new/bee.png create mode 100644 graphics/battle_anims/sprites/new/berry_eaten.png create mode 100644 graphics/battle_anims/sprites/new/berry_normal.png create mode 100644 graphics/battle_anims/sprites/new/big_rock.png create mode 100644 graphics/battle_anims/sprites/new/blacephalon_head.png create mode 100644 graphics/battle_anims/sprites/new/blue_flare.pal create mode 100644 graphics/battle_anims/sprites/new/branch.png create mode 100644 graphics/battle_anims/sprites/new/brine.png create mode 100644 graphics/battle_anims/sprites/new/cacoon.png create mode 100644 graphics/battle_anims/sprites/new/chain_link.png create mode 100644 graphics/battle_anims/sprites/new/chop.png create mode 100644 graphics/battle_anims/sprites/new/confide.png create mode 100644 graphics/battle_anims/sprites/new/crafty_shield.png create mode 100644 graphics/battle_anims/sprites/new/curse_nail.png create mode 100644 graphics/battle_anims/sprites/new/draco_meteor.pal create mode 100644 graphics/battle_anims/sprites/new/dragon_pulse_ring.png create mode 100644 graphics/battle_anims/sprites/new/dreepy_missile.png create mode 100644 graphics/battle_anims/sprites/new/drill.png create mode 100644 graphics/battle_anims/sprites/new/embers.png create mode 100644 graphics/battle_anims/sprites/new/energy_ball.png create mode 100644 graphics/battle_anims/sprites/new/fairy_lock_chains.png create mode 100644 graphics/battle_anims/sprites/new/fishies.png create mode 100644 graphics/battle_anims/sprites/new/flash_cannon_ball.png create mode 100644 graphics/battle_anims/sprites/new/fly.png create mode 100644 graphics/battle_anims/sprites/new/fusion_flare.pal create mode 100644 graphics/battle_anims/sprites/new/garbage_poison_column.pal create mode 100644 graphics/battle_anims/sprites/new/gear.png create mode 100644 graphics/battle_anims/sprites/new/gigavolt_havoc_spear.png create mode 100644 graphics/battle_anims/sprites/new/golden_apple.png create mode 100644 graphics/battle_anims/sprites/new/green_drake.pal create mode 100644 graphics/battle_anims/sprites/new/green_star.png create mode 100644 graphics/battle_anims/sprites/new/heart_stamp.png create mode 100644 graphics/battle_anims/sprites/new/hexes.png create mode 100644 graphics/battle_anims/sprites/new/hoopa_hand.png create mode 100644 graphics/battle_anims/sprites/new/hoopa_ring.png create mode 100644 graphics/battle_anims/sprites/new/horn.png create mode 100644 graphics/battle_anims/sprites/new/horn_leech.png create mode 100644 graphics/battle_anims/sprites/new/horseshoe_fist.png create mode 100644 graphics/battle_anims/sprites/new/hydro_pump.png create mode 100644 graphics/battle_anims/sprites/new/ice_rock.png create mode 100644 graphics/battle_anims/sprites/new/impact.pal create mode 100644 graphics/battle_anims/sprites/new/large_spike.png create mode 100644 graphics/battle_anims/sprites/new/leaves.png create mode 100644 graphics/battle_anims/sprites/new/leech_seed.png create mode 100644 graphics/battle_anims/sprites/new/lightning_rain.png create mode 100644 graphics/battle_anims/sprites/new/mean_look.png create mode 100644 graphics/battle_anims/sprites/new/metal_bits.png create mode 100644 graphics/battle_anims/sprites/new/mud_bomb.png create mode 100644 graphics/battle_anims/sprites/new/mushroom.png create mode 100644 graphics/battle_anims/sprites/new/natural_gift_ring.pal create mode 100644 graphics/battle_anims/sprites/new/necrozma_star.png create mode 100644 graphics/battle_anims/sprites/new/obstruct.png create mode 100644 graphics/battle_anims/sprites/new/omega_stone.png create mode 100644 graphics/battle_anims/sprites/new/pink_diamond.png create mode 100644 graphics/battle_anims/sprites/new/poison_column.png create mode 100644 graphics/battle_anims/sprites/new/poison_jab.png create mode 100644 graphics/battle_anims/sprites/new/power_gem.png create mode 100644 graphics/battle_anims/sprites/new/power_trick.png create mode 100644 graphics/battle_anims/sprites/new/punishment.png create mode 100644 graphics/battle_anims/sprites/new/purple_drake.png create mode 100644 graphics/battle_anims/sprites/new/quick_guard.png create mode 100644 graphics/battle_anims/sprites/new/razor_shell.png create mode 100644 graphics/battle_anims/sprites/new/rock_small.png create mode 100644 graphics/battle_anims/sprites/new/rocks.png create mode 100644 graphics/battle_anims/sprites/new/shell_left.png create mode 100644 graphics/battle_anims/sprites/new/shell_right.png create mode 100644 graphics/battle_anims/sprites/new/spacial_rend_slices.pal create mode 100644 graphics/battle_anims/sprites/new/spikes.png create mode 100644 graphics/battle_anims/sprites/new/spirit_shackle_arrow.png create mode 100644 graphics/battle_anims/sprites/new/stealth_rock.png create mode 100644 graphics/battle_anims/sprites/new/steam_eruption.png create mode 100644 graphics/battle_anims/sprites/new/steamroller.png create mode 100644 graphics/battle_anims/sprites/new/stone_edge.png create mode 100644 graphics/battle_anims/sprites/new/stone_pillar.png create mode 100644 graphics/battle_anims/sprites/new/straight_beam.png create mode 100644 graphics/battle_anims/sprites/new/substitute_back.png create mode 100644 graphics/battle_anims/sprites/new/substitute_front.png create mode 100644 graphics/battle_anims/sprites/new/surf_new.pal create mode 100644 graphics/battle_anims/sprites/new/sword.png create mode 100644 graphics/battle_anims/sprites/new/teeth.png create mode 100644 graphics/battle_anims/sprites/new/thrash.png create mode 100644 graphics/battle_anims/sprites/new/tornado.png create mode 100644 graphics/battle_anims/sprites/new/water_gun.png create mode 100644 graphics/battle_anims/sprites/new/wood.png create mode 100644 graphics/battle_anims/sprites/new/z_move_symbol.png create mode 100644 graphics/battle_anims/sprites/punishment.png create mode 100644 graphics/battle_anims/sprites/quick_guard.png create mode 100644 graphics/battle_anims/sprites/water_gun.png diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index fa11993f67..32fe89068d 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -2837,6 +2837,40 @@ Move_MIRROR_SHOT: 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 0xce, SOUND_PAN_ATTACKER + delay 30 + playsewithpan 0xce, SOUND_PAN_ATTACKER + delay 30 + playsewithpan 0xce, SOUND_PAN_ATTACKER + createsprite gFlashCannonGrayChargeTemplate, ANIM_ATTACKER, 2, 0 + delay 25 + playsewithpan 0xce, SOUND_PAN_ATTACKER + delay 20 + playsewithpan 0xce, SOUND_PAN_ATTACKER + delay 15 + playsewithpan 0xce, SOUND_PAN_ATTACKER + delay 10 + delay 6 + loopsewithpan 0xce, SOUND_PAN_ATTACKER, 6, 5 + waitforvisualfinish + playsewithpan 0xA7, SOUND_PAN_ATTACKER + createsprite gFlashCannonBallMovementTemplate, ANIM_TARGET, 2, 0, 0, 0x15 + clearmonbg ANIM_ATTACKER + waitforvisualfinish + playsewithpan 0xB9, 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: @@ -3437,10 +3471,140 @@ Move_GRASS_KNOT: 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 0xb1, 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 0xA1, 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 0xA1, 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 @@ -3760,11 +3924,80 @@ Move_DOUBLE_HIT: 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 0x81, 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 @@ -3807,6 +4040,28 @@ Move_LUNAR_DANCE: 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 0xab, SOUND_PAN_ATTACKER + createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, 0x18, 0xffe8, 1, 1 + delay 3 + playsewithpan 0xab, SOUND_PAN_ATTACKER + createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, 0xfff0, 16, 1, 1 + delay 3 + playsewithpan 0xab, SOUND_PAN_ATTACKER + createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, 0xffe8, -12, 1, 1 + delay 3 + playsewithpan 0xab, SOUND_PAN_ATTACKER + createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, 16, 16, 1, 1 + waitforvisualfinish + blendoff end Move_MAGMA_STORM: @@ -3835,9 +4090,115 @@ Move_MAGMA_STORM: 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 0xBD, 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 0x81, 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 0x81, 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 0x81, 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: diff --git a/graphics/battle_anims/backgrounds/dark_void.bin b/graphics/battle_anims/backgrounds/dark_void.bin new file mode 100644 index 0000000000000000000000000000000000000000..922b72bc74d7f5c773331b1af537d54c2e939038 GIT binary patch literal 1236 zcmb`DQ*a�EG8%o2G73rS7+FiquMtziyh^wr$(CZQHhOoNf1v=K6Sd&o{d-JM+!# z?1m|k6d)b};-dtFkdRQ6h{PlzDQS|CToEahDJ2RcoK&PHK^oGMP6Z+eOHT$xXCxEK zOct_|4S~r{4irgFa*-S5A&R`@L-{E{K?P#29(hYT|2R-S9deeu#^h5m_z(59}!3<$2!_aU>Fp^PdG-DXcI5eIKOk@(8%oL_F z4NYeTGns{EGl#j%L-Sd{LKdOLEMY0j2rOp>D_IrD@cQJ{tYIy|b%B@w>)C)dvWd-X zq3YH^t8Hv2Vh7sEE_SmA?PVYPIe-pwh{GH~M>)oEPN0*V;xuQ_St#dB$^Ipf`Avw|E=9!@Io4`{)BcMs-jiR)m_6itr*vGtZO@1M=^C>&-EQ_Kx{)da$^UZs9jSxb8`ng_)6>wZ>$5AZ+_vIcvIhkBSb+#@{FqpZ;$ zKhm)_x!GK_9XX`-qSFn04GIeA1^Ja@uEn zwo>kMfr@G!b>0_z(YoZzzT&IaHDC7)-?VP|w(t0^bd006)Q0{{R3aTRq$0000mP)t-s0001k zgM)i}dvkMhYHDg?Vq#KKQb9pMF)=X!0000000000000000000000000>A(T!000{d zNklBzMqy1kG@V5U84&UNd|U`m`u70$}21}xN$w$UEm45-Eua7F4Dl_ z%}U3h^CuAfBZwr=#hQfqeZuz=QVuE{M9hV|ED48$qAuTnVz0RKzKbmmnh5^CgH(Vq zMy9KEC1n2{sNF&A%J5VH zKv#eoAw#jg1rrb3lI#Mg`AC*U2|2g`P)TI`1Y)8w0MR3ex(4aMNE4uibRQ`)FClK#gz^0m$wk3<(nP ziGdW@D=`?fOekRzbRd*4(%j$<`W*C0pdA~*9C@3Ms&$EC6jr9(k3s76*IRQ{x?JQHr187nPAc1&iDVt%HMF6gPkO(kc=^>FL$H#UufJT6A z4yw5$dppb1G4?rVa?k`2;=Kc14sI;$>piGQ#mWe&9)*Ey=h#prG&fu$(EwZuFwSiN zHQ#|ivLuT#j~EDw0#5X ze(0K#g)FTDeaS7|C4O=8zx|psYq)8%5ht&O;8$m`zc+n`Wl5$pR(hAVte*G%d7bue@0=WopDH zCw62zUU-(|Q{Qr90F!`5jk}g#S34W6K0-ZD0n}vKR8e`DWu~*qQY9?qsY)?`v%&^& zZ@t#pEU#zDOm^ZBS}Q=l?Z$3MlN3cwR2eUuL!d<;nNy^bK4|4WXd~XAf+#W}=J-cU z(giM6c;GrL!U+^W@us*w%+}rv3ZRCyGE=Fxe&q$oC;qHR0n|6rN+K&e;+;@{7*P(g z9@JovaNJ1FkqzK02P3E;d`` z1mH{Zm(l!Q?vwRa5OR?R5Y1qq<(NlX7_}IxxrH`(ncoGmG6eFl21`6c;Xw zWYmG$a{Do@<#I7U!i}d26mcSTdhZ0hHa3#nwfx2VeqV@Born zTfQG&8>3q9uVOow&Eec$&*zt)^Rzmj#ha6}dba0HIm<7Ld?APVVr8R%2DY2H3s$5W z1nz$Nx`n{qK;YIzvla!IZCD|%KC*+0UH^3K3!rJmJg&a?U980gzW71pQb?b5h`HhX7<5`U}@5ss4ja7YbV4-!o;CfC>V;(TqZrhPlD zmF$$oAxgC*bcvi+kIQPfdycx#E129gEvKeJfzbOEGO4< z-ym)C`KGMPau?#zN}T8vXI5RM#kILsZ->v&*&Um*ZTNvvYA-%mrRKl(p9lY=ZjQ&y zQS>m^Ie6dN{j{pfe1TItT|}q63Yw}CJI=o^>GbgX+;p#^EL|i!7_FqU{4aayKy6 z1=Ex!TJw4NdCi{742`z`ar2tgghx3oNXy}^CR?xTrs-czHUbQ%8O`hf>>y8r%pEBMzy8zHPdptKcdYkrOWTU+Ph5?_ydjI-?e*dxBlcK{s1tY zRrV=B4nLxf`B~cj3)kkOd5n0Nv#ZA=YE$CiG?cPs6`m3a*>>Pt-GjJ%?rNV7mp}Q^ zXzQNRwe`aVp*<$Y{P3D00JFN_htOLo94KRx5IP&$LHYt>X(ZMje{1qt9G4j?mpqCe z&VUEaAP}>O<#}j_ub_m7#y)ko>mJzWhrgbiubEHNs$Q4Zw*LHCqH4{@(~f3RH)EGj zkosiO7Qv_;P9|PIK!u0+y>Hv)Yu2>lMz!Y#SK_DvltxqGNe-Wzv*CQ+PI!OU63P!W z_>1MdY=#cf;I5m03yN2LNAJSII1i079L0;XUk-f%Hd_p2?XAkspw!i~Z&qo>#X7#< z0G;n$k2>&4Tyxh=QF;)KL4+1fa}QfPE8=mGpr7B}v=iw-_d5{!=0jK@>0y%xyCmKZ7h8Y-u`+5#V>SJMt&!Y+s$)Q9}5tF0nwj8 zf*(MMdgH_ll^#Hy|Byw^{v$Zln?{H|9eM-F7?iuWM7lwYC{nj`1d=J-O zO7rVQ?@7n*!lIlVNV@zl2k{+bH?V6|W{U=<{B~kPd=!37zbI` z8%-<;kPIMWjQ16d3?N*=14B3hKwq*sX!0~n7eb~;3RoTJj=_NU5_tq# zcM!P%GELC{B+86gE+(wYqFI<%*~WwqUp&X}a?p}20A&s;0D626Tvg<=N1&m{QqX}i zarrkH1X)m9V*sJhn#e2Zyt_OFt_Bxkec-~RnkU-&0w7{ZItyuE05%jrfELe!OFAJs zc?35a;~Aemo6bRW1EC>pmTEHZ`U37h^N3gnAr+~TC2=uFlkQqo&V&YIX9Y7|A zB`Bc_GkQj3YC_ckgxPeY_h2Z6ZfP6TQlzOHxiMYo7=-}h9t=4Mze?1?Vpu{x2cb4Z z??H=TH_{o~@N%Y7=v9GXS_*juFrl%n<8*=$_5t&0qBDJJCsGK3>)Bo(xJ>dPa8)Vbfy)b! z@&d4h=1xTcObeSlrO9g)O{fls8N8n(HzT%Zb1)^!!VOk;5DwxXv@i6WI7O={VVUL5 zp?jOevUmc8gIha-63RV@J8&403ebiAk+svbqcxI3&md^l; z-vQJ^13=%Vp1i8vWVcvnwOa-AWnAp0RDdqcZJE7Fr4m`LE*nK{9S(KWEH*!*l6qDe zDuK@%I{27vC-y?|JODLMUo~!$XI0j?O*&ui%EQ!JLD$henmaOk5nu%1srHY@COR+P z0c5_FrivXi;_J!B>@b1Ab(yYt&}StT0(Z4BJagkh;AV6kHxRgiO6JjKm0G({m$PtT z#QxF`HQ$IEx5(Gkx`~=>xzFpv)ZCH@Gb4{VmIogZ0Ga?gp8M`@LQ>KyX|h*4d|~s= zW>r|bg`;GPY?{Q&Ak_mSZ&t;rf*HoPsn*r8KFqZ(ow(+PgDU`$>X`CwGg}Fe)>f0A zv$?Z)ahIFzs<89SQOc~E<;gnC^u#HyoBFheDb)q0=;u>&oLgIS;(8n3bf66cXvw?x zS-g6WK2qA)=ki)D7uid+e*cKe@VE}uvTBy6WS^BzF*}{Nb$y#0T-wjMy#vtStUM?a-d6P9^nbp_#c1XSO$MVZE zIQWyu|A_q%Kx>6xLSH`py)N>#u*;4_TMOR{js2Nw>)!A;XX zAK!j?=lktaPaFtb4FcDNo}h00$k2_`B|aV7&3XC$b5onKouz7!xHPbne=iQZ^pGc6 z3I*8duUV=*lK|Sjbqo!6E;Z^VSQ*BwzT}^m^ZR-I{aj<^aAY+nEDkec}7w{@%YgRuYt@n&c5pLI8gs%g<9$X89`3jUVem z(d=wU-xP^SrO6CAfpyA^Xel+X@97S}TXR7%TR%^$Qca7$1*{tL$X_ zwJub6$g(UuO!{1kG+E#<@lTl({RHr%$QO(GsQv3UDbl7?ZW$#oUhB&tsm}GUVe;Kv;JWZ%^YR6Jj^O5N;-)D_*|PNv>f5$e zeYURqA>3O&8}1Sp4%U?wM0N40O>=F*ggWz*DUn)vM2IEW|LzS(Mjlt9rc zk;K4(c@L!i^sk8wqZe^522{ z<^URmS(*C$0qN`3h0VX3_E=Qs@drd#x%NxoezTFTGm{bcvuW#UlzqFqZ`~>56wSE>$6_EA!XS!95w5XJ`q;SK>W_=mzQoh@Zf2 zJoz3(n5S0B0CtDEVlk2c34e0{$+sYS0&xe5gB2v!hV`KR4cOH5Nq3z3nc*1c>qZd5>dh)?AHfAfssTzkQf?Y zn}b}jY6(4oe8C@2iTxvpHC-M+M9EZRNQcR)L}1l-F15z*|xqiPcx= z`M%$?$GX8UWJWwiHCzb8h2RegHF2RyS5~3GWZ#0ep$s5Q;%A139T!Sy$}5C3U7}B*s{u&6 zh-VLJdfde)b{r1+0<^4|IH(Aa0vKCxq|U*WP+;gmv|IizKnFVlT&V#YK!UIUWt+zU zfGP(mUyis-R{jV?5`6$+@N#75HD+6HH4PZEWyXgh4hE7%0EDKLWuh_xB2&AAHja6t zQdz^u6d<0!s6j$G1n>Z0DnN}ln*e=D4myyj%-~6X3Sb%ss!yQkK?iEGCJPX{$b^bE z=mJ+?%oOdreF5Y1jHG<@4RyuEqv67P6QCG^0TCvMC0WRjbcZlP8>bim9@$jNpX6Y9&TdKxU ztv{p{GJ6R9YPe*A=&59!vMj10zvY$nKO!8&9azkUqK?}fwm(aR{xT@B(WqWQ9 z(iTnAVh<0==X$oq<@&M!(6aK#gXy-H0eFgk7x~X><)-S2hnFQQZb=f_fr{u{_}aWJ z-{3jyH`(E7zZj&Qe`s}8uhpgs{CwkUmJeX{v(7)u;%61F(&?6izN~nql$aC$4r>8;rTxU-Qj1so&-gy8AHx9k3V zt>3N}cGQ>U@EH2(G!4v*`CJu1+fU+Z+VG0BEr8qNwF4D(Rg>JB$N}mDmoL~gspf0P zG)|`RC~z%Vm$Ah};EoIM%GK2j{v4g3VwuVL%0XR#FW!_$7S({zJ8n*P`5VG^!-FhkPc533VZRV6j_>{*vB$YrU?s(9LhO> zn1i~-_^2l*0wh?IO-q{bFWC{a(SNGdBh(3$)j4x4h-1S=&#+<#%Z{&%g?6Hmq#x(jZ!Tv05bu4G6!=3 znzF6O!2lw?YVv+&&%qGJ*Xib8hh-oai>j$FOuZ>P4(f>-$*Sl=XWO26^7hZ%LU`Ue1pWPEcy7al?v4t>x4R=garM z4sYeG&k!}I^(iTm_4%cpj8m;m^LLsi$Nap$Pydef@)Y76r_-0DVRiCSE18k~SbzNW z`F6W(TklV4nO5hY?Zfo8ZGWd(ax6znR@zgu{_MfLaqINuqGnF^v-JW}+6)aJQ8~e4*&5gei08>zCy;%T@}2N=__hPklXf ziu4A;q~YGkW%mdtJtQmcV8+sA_3}2))*X1H7IR(#BMrx(L}*w4Ht~l3hQG}yPOf$N zR{gbKuB)vAk3%rL_@?uc7-?E&;vuqI+5v+#&%T^Y%I-b*JCS$2GmrRozg1mDQaKpD zrcRO7%d)A&_uvTiU_YF?cTmz6L)5|ml|r}m z=_pn8>vg4?>cvmJ^tGJTRnvS2qA>_$n3Z)|1Z-&U5!kMGs{e8ciXi(dTksxp1E2r7 z=Xe`U8~X9E+X}B+*)xRK_2QxKcQHh@$JgDmE$g)UQ7w7)eDbHQD_rTLAw>Gj6<-u4 z!O-3$l)l|6(YEIwjaZiVPhgu2|8`KQBE5XMg&RD<8;|{51mr(}^*xu`&v?4{7;WEl zia&yN^1Qf}PkEj)TIj3zNATgqTdwUnMTVTJZK`{kwk`gjVE?U-N&Bx3a`OKLhvt=l fY?_!zfAanZtmW~3kuXOo00000NkvXXu0mjf6ZK=N literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a7275a0747da421e5290f61115deb0f4fbc84aa9 GIT binary patch literal 804 zcmWN~iJy#h9KiAK@7aeP*73})#X3LVF_>jt>prIES(cnxM9CdRheWw;GppQG?xW=B zK(0uoShF2+)RwC|Ay;yio3`Z-c)#9GG)^3YB_<9VDMC@=@gc=1P68#6l9Zw}4xV3< z6G@^Bl1y33Q65PlC9MJ#@l~QSj$4JQ7N7*gttJGiP7P`bAyTPD?WpvKCyhGP73xu+ z2BZrOX+&e1_-INq+~&0K(UMk@9p(YS#Uq2(LK`w^OS{Q3|3TW*A!<4bo#;##9)hk! zvgk&4=pnfe)01BCh~z&?ZypQKM-KL-pM?9v0ErA_5RXTt(_n`11W$$-N^F=EJjK&d zDR_ow8P0RU2%cvoqe8r3{4dJH(PVmQSvg}EOJ>N7V>}a>IMDS^BHM&tA|kHXM9Ec3Uq=8^qnnri_TanGe`v3bx{W z$TlnCBR)nxVLPAFE|~dQUTgxxznI>|d_pU9ZSDzNs;+`h1PtX!tQl*rZR!99RiJGKkG+FbU=1#b*mecYoDOy1*Y9-C6 z?73C6s@idur;-uSY8q6jt~Io#hE!6ume$rZb?RtcG4-^*N&`*ThT2G_u{P1BdJk%x B*LVN` literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..33af8f482693e86db21f70875683c7c73e253f19 GIT binary patch literal 2902 zcmV-c3#s&pP)q%#j7N`3&F^6aC_?Aw-IHkNU>DY;iyIy-GkV0E74$0CEM$8E~V%k!5EG1;B3v zxE=@t2BY~o7yxU@00sCddw%HqE?~34AHUrK$PM691AeU4wg6shK;Hr`3}7h%e+#w& zUb%pOU<{Y59IXJryDWPcmR$IPKR%5GAfCLSB;*)JG$70Vb>MFUJQX2OfO7#@S->M7 z0O~6U!!V+hnHTG&^3mTo3HfRKhm)oO>KpYgt{?WDXJ7&F69WkUDgfF5y?#(wT`)uc zv~2+U09XM){j=HM3K&R2?~nm?3s45skMyrrt}mEya##lFkW?=%BJ}^a1Yont3D9+Z zztfK3X?7%GG)6=T5Ksin@+cxR>ru07<1iu{+C_l+S`Il)EE=pER_*&NYk_Fg!XrfX zIuV(|09ZeG0)=;pf?M0dUDSLO97d~$t5J#6KO6wo+{zko$_DHMplz0y0T%|aWWYO? zJ$ukmL8|!zaAN?IOoU)%J-AOE)OkI>9|6Cb7*h8Wl@E3IV~q^ZSvir*5%7xzoL2(A zBLe^+?I*y;N`Q#rvGAbduJ=7i2#ZcOfT2;o5si92(95XRUUE58LjcWb%_dZR7C_DF zHPwU!KzyR8D{auquLPWN!noNZzz-r4K9&C{5v5ai+a&?0S2LjAiJEMJuA2l+INSd*2tP1MN{oLe8em%o$bL$?s8i>$ z!bPEAl17*$)#XcoM`QrDE_ zfC-@}yoL=U`%nUK>!`B_vUCG0v=Qau5COLG|4AXhq#Zg2SQ8)!3FM*fS&_Ws=}yyu zva8kMf<eA>C`ZP#-ReydkQ=~r>g#nH zD+mY}z}?CPTnWG#jkbmiZ4ed!YIoSDZgs&1EHODx$%B0?56rc7p$xc`05#ga7l1Yy zAON551UwP|%0a+@Dz%Ri6pGSn9bZrl*N@(zgcMLCHN6}G{UTsu0r1>FOH)P=p-WoT z^#wMW&`L=tDy|TiBLY%T9u#4ot`!NOZV@N~kT9$xXhM2m zRRiu@zzJt03sAaQO1a4+uaQNXnkU=;RA-SKSz-vU||5P~=N zM0t!g;MHJQ1S|yL&~|bJ?3Dp-5LFhR)9*K+-$;Ni)FT6!RRMC^PoI(1ywl;nV>h-I zq=GTxM&tr~1L)Xfa8UNKP_-qu0cdB^HX93LLIZ-K0jUePaa^!ln<5}EfSIbbYJgu2 zs1*Q{834ZAVu9V7Sb+aK0W}LCR@VZO5s$q41q*x&Xchpke=necfEfec?&Lx>VCDc|a7qgrMF2)|PXH26Z>|jB z;tv6?`v!1s01I20cL3}K*!56?^zhJ@=x&8)!jsTP#Gb0hnOgjV*0R{<<$o0L^)|pF zHGp0Lkd^>X=_1InV6Obf(?jpj0w$G!XN9!&N&IrJJxG%zXUx`Yd&9|@YM+cR9^IyLcq=4faa}$yk7=jMV;L@ zL0~{w32-FHfcHwr4^0qSREt%B<&Xi-%vlF--_vi|YQBHsqV6JKHbDR@=vn3f7AYV1 z!fpXTqh0~DAmDyftvYof!jiw!*x|CWrwj-13dCSfOjc1--U#BExMc^X1*{CrzB|dz9e~p7Lkozy z{dPxuVu+7NV#n#6$+iJSduq28+R=8@ZI=Q6wd4JTtQe@dW08@jI?zV#b_wu-0rA|a zdfmCw$2G@^ND-nU;MxYk7A>`Njsj(+sjDuET)MU5SFX6Qlf$2ne}_p zgKUu$0P8o!MCVsJR~|>e@4`){TCF|EW(M$u0H21KXj8HIWi>$Mehwkf7cDl5YnV{F z%3w zIZ<=t-2oA-AL*f#p#cCG_M;sExE>wI7TSP?zCiEyqWVsNI{noHIAB7kiuUAi7eLrG z?}xS80qDHLetQ?dUT0w5uL1LnJs9@d;hlj019K0E-Dw%3Gynhq07*qoM6N<$f^i)c AJpcdz literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..27457c9a1651b819f7523b850c7d82f049f802ba GIT binary patch literal 892 zcmWN}2SZf_0EXf3z;&;S6I{HXsGx#^8xhaNjkr*8<6gMUw9*PlOKsC$8coxtrA;kt z+1B<{+tZN^OI!B*fG1iOF9pOAPXtw?IyIzTLQ|TN zh>~bd3tFO9v?dvlX+sKaQ9Ig`N*a+4bfi;Nn2s{&Ocydy7G3E^chrNP^rAP)rVlyv zC7Me=<%YzFwO zlu|}e&PA+ay$%K!a|s*Rs2$2-6PI!sx|}PxlB>|wRB#Q~qU*Sx8@Q3!O$u-37H&ni zv6(I0jw-o>JGqPK-Q1%S_p%k;$2PWeKZy_UpmL+ZLp&@VVF!=$80=KIi^q9FJjqi$ z%`;**dw7=T(x?iu_A1=U^Wp_w)td7JuEAI4vM7lHFS?=OYXSu7~ z&E4I@J>_2R?QHi+agMV4I#*#rp^`KDIdsfPdG1e`86T!a3nBwN(1TPo*c#%Y&i62@ zz{5SlBb_+PqqQNSqR?aHu^#6lkFP2VGxH~Sq9<9CJ;hU9Y)$iY&+trZmS=m8=Q=iz X^7&ri5^JFsd9jx`vee7GoPB2iycXQs literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..3cfd58625e7e2c9e65999d0d1a159306212651a5 GIT binary patch literal 4122 zcmV+#5asWQP)005W-0{{R3k;wnv0000mP)t-s0RI60 zK>+_L0RIpG{|Er?007kh0IUE2ivR#~003eD07?J=IRF4D000;O00;m8T>fqv000lA zNkly_F_7Jw^-b_T%N1e)#$04FdlCV@pv1PE^eNF4!^_x~8t^M3}(8-S4} zfHm|cFwhYU?0r_1)X=l`);WIR=BrzEZ{1gwF)(g$bbEI}7|tdSLmGo&zu(o->&tL| zyBo>~rt@{Rmr;E(3Vhe?123|`zT@?~0=f0r${UTRk43G(-O2*Hz5DSrvcLg;y@Q`S zp>7%P3wSpS!g*FY;6{NUAn@i2v^)=Zfj7JZ0lgLbz+MnW^LQaZTrlxqrrvcP>|hur zPQd+cYk_|o122vlIKZ#pG=R6hc81;#Mvvv*0V@S|;eUW965`i8O`xxCUqArXmw+f> zvb4ai1b${IMVVp);+0iVY;ssN0%L|IS^lnvrxADeq3k;o~PN91*)FP zg7-CdgN#1-0l(YgS>XHmx-3w{wF0f;X%FErr%fR9IxU_Bj=bh)1sBiiI^|>)WovvRgUsCH?SEZ%wYVX!hs@|3MAsj z0TG!Ba1zj0oy9Z+?3%W*(*yv8!<|3b2`Zjo10Dn%2bvAIk+cTT6e$a$rSA8IujxSPW z$F|y$g&DFy3)HyzKwF0a3jat-Su**gvU-gJAb#utt$^hIA{23i3268*n#S2BVAU8H z+iU#Hpi-@Xf1@lhO_#XnF@)yj46>$=Rb`J10qYj6!kN}3{f&UuX6~mExzg2Q_HaK< z@?r(%Hh;1zthS`)YWE6=_QXKzp)v5P-A*NAf&<2z!A8rI>u!@vgz&wLCgXWlRA0ao z&7Uj~QX6ufW9DHFO4+P@|D6D>!Qx_4T;~?O`XdP~EX)2-d#l*}AkO`u%u-)t81Ayh>%k zbmB0qbKVIbwt!+Y_i%gwh?tiX{&qf}iAZ+17lSR^<_f~E$dGxXL7iF|{m8j9*aF(F zoA9=4Yd?su(1q>ElL6;@P6e z<|vCulagN70cp+6Lr>Y#iZs41w_M4n=Ge>W@Jjb6o?% znql{MP4PggPxyuSaZM}c3WJR+2prNc4~&LhcAYH&A={dv3?J5w=&TZev@rdAtfdc)&t|DY?uEYKB@g zoF5PntM?LAat(O&fomU#dU&9A5LJ`{1n-L}kf-1`fu#a7(!+zedFgTyFhUjYkAEp) z)dE^CI->Rm{nfOSK|QKnznG(J65ak9cZMgvG#O~@G7vVU4Sa_{^wMtvAq2EYlE4$t zm9LaQ_c@LnuK>w1i=qV_NQDuMuK=s-KE1nxMo zCt$xl-T)TtKrR8r<6Q#=uI(fKxaR@UWKT-eRPQqIwkKM-3@jb6DWY}Cl!{F6s%eqd+=j)&6M3J{yoyfYgI) z*yONTV@VEs0qBYN2CyO91t7K?@bDB>y>9?{57iUB20C7s%j%$O^%M%wsY-xQNwDwz z1|Y~wj;|*|-S$wv6M#$?_^KJcJGmw_=bngt#(7^681y!~M1TcACahjvBirOOUDl7iX; zN>62^!1K#VfUj#f>_#h4r1-`W_yVw_ zz_S3ca;Yl69xf;k4kro>rj!IvR774e0Y@P^4dXH`0;b@TZ5xq**d)hR4KqW^);W3( zM9mDONZDxskNXO8^v^bX^MTY)!a|j@f9XnCr^aDuiqXg1bi_!fbL8aas)75>3QFIhJV9xP#Buy8#e>?W<4G{1*nYZEgAHz_zUBbSJ|=ch1)gtUcfv z1qI-*QS|Y%S}UiAOI!cr-3w%#Tvgd?%yERNK3a{g*#Qp-e0&lQfX0PYi`NK4Ck7u_ zAZ+1~T;*%v34a}S08G~60S*kLlvUfOR3*@w6*wBtb8!fj4?Ht)g}~YeZgR=ksly8? z893FY51f8jt5diD{A~eCZU74@0jNex)_A7SsWPyOz(mX2`U!W#S0Q&@l zQ{;epiThW;3V{E7_JDf5eTOT)0PI}_o)kEL@_|5<4*4Zumw?D}9&(WG}38Eecfml_IW>a2JZ-m#TNalfY%;x4-heIVX?{EUs0Y)xHJ zthkr#o&5z+oQlaT*fu)S7#qI-kQF`<7xL>o&ev)iyX}hamWQ5z68OB#=SG1eU&0;v zg#9MPPLke1;-#4j9~#|W1NmkOZwPY%YRm4hg@bMz-(U&RjB7$CAcV{7z$o#6CN{VBCfg#u#ubf(HF%xj?aD&f>f;&1=~UD_nY zR!&_T``AM+Mn-hkBfMKJ1l5F1r4qSd+!~-T%)$P}8OvUZo|DcD7QNzj5x!jLJD?Xk zTjK!nW0n1`DG;s1<^T+g7&si<8GDo%dP&4TsEPQWvl0RJ;%96c^tnX<{>bYcJzo+L zfJy%O#Rs0e+M;Xhv9n zt#hn@V*fb-ZTHauF)c-n8u?PlRT5pFVe;gTF1V05ThW7*Sf5Y`5>6QdpYc5Hws`7{ zR9il<1Hik11&*e+O|JsV;<1PMC%EMDnIe5rJs%H7)-{&GPkAY7>c2uhTaLL`RJOx#kA&;WvbFFBp|v zKkvU7^qzEUz`)y{4~!c?n0d)tDU?4}2|lW^KziK=X&4HKZ%QOVARzu`)tk_D(5_M- zq|^@hM8MO5!&+`IJ6Q0&B?IqWD}x{Cv3AR9Pqi)sOF4D`B(o+UsARJ;yn`enMByS{?I4~A|8d_#<4mJV9JaLNInz<#KMXCVGk zApVPh-UEs;zcitvT(I!~kRl7-U&0{G2vBbOxE;xAfHe<>-jfe(&5MY9RgT&%pT(Z3 z%-&19Flh@&#!Q=t5)Lep-vHt3H*z+aRR+h)vS#4Pq-l~;Ek04_m!`|b#JY<9oy#)$ znizo;%}}V*jyhX*%_qaYZMm>_l=xt9F;izoo||e76_JA#_B&80^jcL7`Y#oj=NY#T z6`0^{xM;}B)j9X4=U>Fbz(=-N(HT;0SAGKotK72LIw+!rZ@V#HojZWL+qy~BLy}*sAPk;m)YhUx*fCsv|*sy?*r9UuC zdps!P_W(t}W$U>vJ>mIoAio>1V@gl5z7x3N1!Ji=rHnqJd*%NVxa23g4mgvt=UaIH Y1wW%XhmwK4`Bm`1vpzPF!G*T#N8b^JuDR7M!XyW=^Q>gMZ(*6~8ep3;k z8O>=STGEQvv=MD-M|(PmAnA0Zljuwry3$Q_Cxae@y!51({`4m75Feored!lRe+Dp6 zW>Ap9O0rERLr@k&$z~Y#a7IK-4kOVhMl*)7SmVfLyh0PuL?$trDQGHDrZFAOU?#Je zjpi_ydCW%(SjZw4V=W<%rID;VgaqUJGr!c(5{9KE1|m%PHfrjj?j)i0;SyyHC|`1m{G i&kN^eeyT{1g+G(~#mV{VhE?{B@0D&wr054fozlNxSdwS} literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..de5553ec6e9346ea9ae5a681ded225265ce51990 GIT binary patch literal 1788 zcmV003A70{{R3fFR*&0000mP)t-s{{R4k z=KpHd|6%t>09r8sQWyY1001BW-t$YO000Ju zNklZy^`8i6vyu?WZz)n4G=C|12gudi&3#dZ{EP-1u`qP_3i}lq+euQQrMzR z1ENf`LHG%z?LFgF&N=t%NV>vgoimw?e0A^d{?DftA;5lVvWpg3<9ohQJ&8u3f}IDn z)(mVh;Kij`zGN?5H=hS=T^heyKd>sW}A*1bJN_Z4}4;Z*Zan999pv%`qnr?FFKgU3r~07a(>+JWc!BCJ;`ddE2!(uwmIF zaoDYU>~dyq>A)LsUcA079S~WXtlvUKaO9rghuj!5iz25*RSs2ijLFs(!ctnQ@~-*S%=zNLrK#-hl|r;-3PCK z=Z`k*lCyxvT-x8g8gBp*-6UkYCSY3uts2G451(uLMuw+|4Zuz*z$Z^|opmz>1KdklI3+^nF=m6FOpEKecT53c4)o>(H(0ii``=!cz zIby)EK$w2^6fpMtH6Xj9&3T&&@F~v@ zyI~awE#A||VY%OjlDO*ky_&!~2%QBM1WeOp_qh+of#f!w?7qgnrWOB9r@|Xx>`J^M z&r&4H0~{FpxBdP=PIjXkRWpZQjuH!eBp$j90|pX;RnzA{K&~s}V?8X5o7bacpW>*n z`Y02AWj1{kAkS|uy+Ev4UNL?V55$ec}gOTqzoQpVS6v! zb=ovYc~GuA?Lrs6)Efo-)y*q?I~vTtH37zEl)&!j*+5yYUiZ~B-lqoWyE@(J^oCYS zHv#gh|9iau`W;g(dQ`2AJUB^bHwIW1{bfGC^FM50ohs+cOh8n9xKXG5l-~&3Brzji z&1YdahyUh_k3d__!ax86bDrU7LL?#fC9*zVjRBCtfNTmlx^(29*J2AH8 zzX0wU325U0pMn4$#lE3fspritvT)UmbwtKqDiQ{K{KH|+DmW#1VK&TnrbW^-;TJ%OO~z*{E|P4l+V46^_krGqjX++Yoo zBkurpS!VsEu5XjWu)3 zYM>~hXs(U~f@eO|E$L38Hqbf=i?mW;U%%Z`*_;R!*EN9{O_lgCT)4_C`U6jj#v+gn z4?u0c1+#*^oqECltwU?C;p~`CpWX-dj3w|08 z*DXnDp5f4xNg!lHUqwP5`dFHwYRFQz;KxC-aNImTWs=tfEFdXwtH~H+9s~6#Lk2;N z?KRTMSL+2)EnkF;CoBr{#gd$m-!VRW4vcR96sgwP(I>)L`A1mYGM*5$fuYvxW|H;Ky zExX5y--$i_7M3}Dke>}*w2=~zpNh%UwhmnbUkzNRTW8ZxX@+-Y%Ns#Xq=)EU3xYr@ z;J2lT9t?7|Lz(W;RVkF&LnKJu!%_xnLR%BvMh`~RS3OLr9(BSqouXVP2C|%Nm(kMR zyTYx_pHr0zj1q>r8dG>FBI_yAs6L&*C!XP^!~jsjK-?;Ye;=EH@ay3$AZ2P1@h))x zRf4}B&I3+9RYUPpz@=_DwwNln`9^#%&arz;ttz7@3p|#hrsnloz-YcQ1Sk=z~KIsJH em0#@V0{;cQzwpM(e%f~c0000 z=t(bfMQ{4hmypOKpMG2<`ZIuwxkOw_0RtHXmqp6Nx z%;QNa#8W)Ye4Y`{@*L0eLbx*YA}_Ikh*-!X7PF*0uzV@Ys^XXPvUr78d5zb@m1QNY zU?p#eH+hSmGV9x9LP;f(uZtg zJ39#OWLKp6BR)pE`GimTjQl-CEB5j^Uo0A=FWJXed`-+Ze9Lzu%f3fHu%83`h<@TA zhxi%&!eNeZl;AOrN2*WoEBcL-oZ>V(!&%PpJ37xF{K;SFZ~oz5E};LYMh;j}j&_V= zEm6ZY9cRTm!L?l5s^hw@=b%;JiB56@tDzgYv6HPPZt7-kZnbbrw=!07s<2yIDNc2o z)2%kna9g*t+Pi~0I@9XpEO&MntE;;?+ua?=aS!)&FO?|Qz1_!st&oeU$UyoZb^P)004jl0{{R3eocQU0000mP)t-s00;>G z|Nq|h_PyrjoYmEX&CPSYy;`iSL7bd1i;Ez8dk|t`07^;#F);ujAOH{$U7Fwv000(n zNklwLlgcGWt{vfbu62l~rsRddo- z6CB%e=A8GBUgJ&bEKT z1&b+L^*Jz5#=vcum1f76aSGsQ@Uf)j3nqN1<=A#P0FI~hfmcp@&~u$nq+fAu%2K9w zI-$kRiL<*G<*iDs*&$$LJf&FtyvSrpF`ACuG8_BmwoJg$2ogrFNa{voJNXg6o5{&a zyHCFN<(zo;Vn4IfuuglIq*m_g-Il56;4Jjh8Tqw0+9kQKIecx2s zR;^8uvsn1+v;DMD)$5+upCD4>!^(K%Pz@qEskvmJ>S5%L3c^&@36%9c#xb%e#*6 zp*)D_Nv~Q(Eu%7xN$&@$Y?NfFU{);aI0&oRF*L)Ukc>^o^zy%3}!`Spa38z+WV>u?W;&~Rt-QUm(UW~%ywa0 z(l;vxm$B`+v~=WnEHG2mYt2(30QP#VqR8S#4NhyCRXwAZRY}R{W=>;TdKXKUR7Fi> z6WPMM>m{SSV^z3}Eo3^o*=m$!q|&B${xbBP-u1G^dkujzjM#U=SWyUsZ z!bX$6+{ zQO?OC%q7TclEjn^g=u1f>8f5dEXufFtm|HlX1;q!JII2{CuE0Ku8keP5EE)h=99Bc1nuoiT`8@CQ zZ7jBZIava}?z+!XqO2G~ClJsh0S)sZ$+NDm6L3wGVk{byWF~7VIIB@Ibq;)%k~UHL z=cy83R|dVavX(0x2u^3n1*Gg{?dioRyZ{(TCK6CwTLV?p#B{2lZ<<8{x`(Lq?aS#X z1p1l>uPwKW0)i=P!lm!cPw2XK+9Dj}IuVh&n?;97AT zwYIR?bSN#mNY_ z!d4TR;H1)|+PQjlWST`yj#KXEHAXi}O8(~(7dZg>7i5Q5$?Iu3ZIrCToSZm->Od4~ zFmu;!`d)f>W}3RbEg1pO+AkE~l~I|*i>}?jMCgI3@pN&^EN9oZjssxZJ)cakJU_ul zx>eJ(ej{dT4q3^nnra?i2@i@cix&XbX2|geYs?(yE6-E@F<1Ia#{^5rTVxe&W1UR$y;l?>uFH5@lxxR(Mec}H!L2Hap zoWZ?NgbGxuScs*Su0=(b*zqA0GvkHcM$6v*dfs--Mgue_tvyLARI1r@9*W!u#EL~> zbV-gI2WYT)qdWXT;5;&CG_*LaR#_HVK`%2++lbEBP4SJIX_yP(5(VvMNLh+=^j7Fw zP!ozErmHGn9HJ76&kidNHnyR2Nbv)lAef?p17mp-S{6U~F3%UUp z0bb5x!GXMJGvTR7C=MUyhBth?T|Kj`Dl>Hbhj~5_NxaplmP_iI<}rvD=t(S7 z(=$f%9J3W#X++}fU_jjfvUrh!BKu2*zf)|M@_C)A#z|2YR$e?x)cf6Q@_B1q0FZS8N=_JBcRYXSrRmVMf z_|q2b)^`7ZpV6ZJqJ7PKKF>F@4#2|6(XIlAP!bhAH|`8kQ|M^S*KR*1O5a&p8@qDXYrk#T>diy#5NIBq!U$ z5NN`CmP`S#I+(?HnKg<~%|RG)cLYwgL(<0T-vme74LnrZ30 zj_yll(rz#%efuc+$NBnizZAZ6U3mlN35$Q^@qj65%wKZ=#Kn{hfXcxhd*I*v&ASWW z_gu*0x7}6><0wYQeX@wWv}EF8s6>C*cFpa7=EVPHo2UN($aBusvpv;!QjO1du`uW2 z7ij=(;rMbkxKMvhH~gI$pZ+5t513x}^D0P?j)o|CZe?U#A4tW(31UfqL)J7i{8_rFX3bX?1yGw{rF#ALe7tw_PFEQB&J}1BRDCzWvU-Ei1 z2k!BDv?LQs+#EOzJVW@lQK5~&X#o8F&$xU1jWsXd@H?{%oym(HB+3P}n)iW`0qu=W zRs-NS$-m&2uReJY?2k?$ItRMG-^uf~hSn~n^-8VDyFv=LU}Kuvg$PMPz|}|phF16_ z`^)EHs4W9|W?8Bm3^lkGN;sZQ7CkDplpHAh^=Fr(7muW;lkdbX0X2t0dK4A}@hku!lN23skp$n~MGzed6JePsv@$$6H`*H$CK2Da|*6$Xg z`^xQlsKHd!=ar4R1cj^|>To=p-2?g(c4I!G0SrC*bDdfgXDNBvL$R%v(dU2`A z=RqMU1>LMw4}zI+yjWf2#_wEazKEXtL{u=elu`wBj0Ai4=#x)q z_m{LrlXX;}BcVoF=AE7t7K|9>5~vVSW;Z!-F)BsC@b}sy0WcM>*w$X5gt>V`BB0YK z(k3r5@ERY#M5=62rBI?)*ReZ%Y={J=ozWQs-z<*^lzWF4)s#}FxYywrQO1EsSqY7; z60Vu@6xkW3Gi&X$V?N8#lIc`z#<#BfVQ}0IXyd90GmsK#|8QZ5*qS7-Gd|=%%g0^2 z1JL9wNJ3%ipnM=Ig?gve9xl&tLWCbE(J2TW)Y0}< z$3KHYi*obYIZ7q#7`%kF<(ZJeL)Y_pRZ@)OizajzG|ODD0iOz1f+MTN859&d?4E2( zXp;b3nt~-69{(6+b^En|{^Ep%tZV+?Egv)*Pcf4yX`PGU>gl zo{HDnZo5CGyonL$#y=PB%}@R4TOWwQxb=vo4?0~sloVoqndQ@PRD^S9D%EVf-q>fE zy63hp2YpT&`X_Tf&Bb>#Sdo+h?As`^ou=2P7^w+SzUdYPH_FRK2Jv>3{izGz+;Kd& zry;#UIEw%n8P>hP}WcWlOPsggXgUx<7yn4bOdoKaJu@le>2)if=kqhH{~&Q1Nt_2}YZvhMWZzu9gq5SbT4&4 zY|AW^vI^2;6gfNqMhO^&0?8t!t%}9Zfjsx&?)hl+3^vT@$kDQ-vdr;40R=h&I5hNZ zKC8eo>$1pwB_@e7tONy0>1@HE13vB_7ytg?cr^YBB}2rLC~u0&?w{`gDcTVX-8a)- zq}$rh${3Pw?x?u6n*98sYL?S^RZBtT8}o-V`X^~98yVd9+MA#L-@AU)q9Z)x_=fUK zw?z&|+o;vDuG3s5vklqb)~DkPc&nVwX7mDX9MG!`oi~9m%0)S8wkMH0n&Itshi~v( zmT8s~@H1JJeXYm=P=$QD$@@i$)HirvKT&0AxBZ3h!L4?9Mgkk|6{rZKFN1s>sH9MJ z(Zm-_>j!}=Cn=F_wqFX9$iQs}`HD8TA!E5*Oy?90B`AhCVswy)e`zFp0t&CY9Uq9m ziA?T>FX@Gcu8V%4aymv89(HNhF?cC~PW-UweVvf16pL#drX_MpI!Ep*@Z(pc3$(>t zm$>`#w(A^~*=DVMJsKc=xt;#qa0y6lUb$E(rhTBMEnlR7=k7uIjt;(>Evwc# zu-lGvq+*nE&Y=w?7Oy|M8!m_rt=cRi1*D{nI8eapdA&sOX*UHU2!f7x@j-kSLb{kH zR541MqN4atd&uJeD-T{C5LVo(u5Fs8rlWl<%9Ms-tTr8Oq3{d^lkyTTIu}TEW#j3s zOU;<1!D&P>S#SH(#$C{IMJBJ$c$mNxB20}8-|X;;k2*F%$rr33?0dbh_Q(NtU()e^ z8Tu$|sw!m;+J2}81wS$yoMhveN<|)cjBQ!RJYoBPo&pG-f8;&*E$vKfK3~1U5{?cW zs2&|!us5_6seh0&rl~5rrWKV!!6INk>@TKMVJ={Q*g7(;M{oa0Sm_T?u^}h?qsVsu zavzBNTBz7nShUixa5cS7$cvz)B7ONh+V2GC4++}3nRa=Rg*_YZKDf725*eOhX0V$4 z__@>N?c;E%|CtK>NS^P%qpQ5~juJFrP<8LZqoM6j-fl0yG7=d)E3txAr(>6M0TOg> z?)7I8fgi|s{4RBL*FBsIbbGma3q5@HwsUWH=;}!hDWk@Dt7uF5%cBYbLx=TzhqcOP z32g`*Hl5cBX+4k56a%fFuX&!M)05eY;GGwEz;Jf=S^Qw}DvdwAa3WO$j!ebngkI1o z*vlreRb}o8d^2G>7XF95_oszapQ)Mp{3IrLTZ$im^HgG00Zb*!1tcR}6+EF*3*LR` z_k$D6zb5L7-Mf{~x0Rjw<{)j?_ItsRx=$>p5~&2iOcJqAiCH`&K87eL{)`=Mgg>_g)iJ~STr+aNyCe@#rz$XlG|zb)mo vYX0jj{>wg?ss6^E3ip9b*Nts<(3$){D=%%Nmb=pf00000NkvXXu0mjfT?c7a literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..20e82ac1a31f5ec7869575c8eb0bf723a99b1edf GIT binary patch literal 700 zcmcJN*;kBl9EZO@uQ4;EvSe3}5kgTiGRBy9WKXiM;gx;Qk}WdH5|J!fv+sNMCCg;V z8p0p)bL%F@ah(1F=ec>#bMv|RM2bU1Q4fRqh>Zr=abS1SkVaZ*B@q%vW5S8Rj1<*` zrZhvE6GaPJVztr%-Q75VJ`EK`7B@|i?A(b2}?ySL&?*X1irB4ednk6XSA2PtNX|ZC zKL}z#tGphr#Q_S7iXzH$9a`{LAb~zE^|e=$~CTYL%7K;%DFAv z;VxzI_k{aA;31EM$2_5er@}Ly^Ma6rN?xjhSG*S9P{mu`3Gey9M?MMFeC7*ZYk!vh g`9mGGb^6!-OZfF~#d6k|>RUM9`JrR93K=550f)Za#Q*>R literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..abaf8576d80bce931842fa1d4bcb6b39901039a8 GIT binary patch literal 1696 zcmV;R24DG!P)003A70{{R3fFR*&0000mP)t-s0095? zy)pKzDejyg-h&v;a|p#j0JJ#(tXe^wN->l{7>i0VdqE&#F(6VP5K0&ba4s8D000In zNkl{GLKlF^;E;G-pM?Fq(%qO>pM=}+zRWlR zd-ftY9Ki}_u->Y!{;BHe8E|RWvJHGxS6BaFr69)5aorR>h_jB3F8V8PFX=1{1bx&noF{8)3;3)g7xHbsR5@3f7S~M3umTV3)TMtC25VuScM*{Wfe;XC4#Ku zv24HDVtyv9{HW&m)B=)F=Vs0kD8fHkC>6 z0A9JXURjpKR}1!|Gt->Q^%P0lRMmb@-XUL=A{@w5Brr8*9BBn{2$4&#{C3&%BCnz{ zZ!sFn^K+rA?{5bYkyq{>92iav3q~nocHj3A_wf;f#lv}0RG|tJH&&s&qxKPlRaLJ2 zn8h)v>aDWSdq=*1{KPK;e6Fh3$D3heW5;1f zEC#FB;uH|Zx^-Pw^CVamx&~rDp9gSexVHw4fzJl4G)+n0Y(4}0KZ0UiI&glB^Pu&r z*BkR`<_hR?qoY54I;w&xex z55;~qGgA}Ng&rwmtSn%RI>NpVu&jL*j!pvS$g$xkK>Q7W(OUerydkhBZsD_q??f6u zrBnkGQQ&rwsp!r;3+s-=Ca`J-#f63^NHzRahW!EVHta$p6Z|}w4QTuF;9@Ix!uO-# zE`0ldpH4V9#=FA)@EOn@gDV2@uOdU%FK?}DMGW6=62W#Sq5&tSUydz40@-MpxARA~ z2j^ir+Q9UDSPWOUA2Rlf6h1ox@jK&UpArY?eoY|exY1M{*7Aad}T#Co=d`~O2yroHj}bW?%ns67-MxGD*> zb244tZ3D})_vTq7Sp~7%5S_m@A^+f{ASLVEjmlhkNGH?~`l=7X*9lHYicAbV- z7jQ9$;%LP%xgV|U5ALz`rTtTdSyKewnMpQJ#~QxCe##7hb)8vhvVr}X{fvg`g>LK%rNg$++;EU`~yL|VCdReYDKS*t11CL zza&77lZXla4H-UCFDlcmkgPuxOrMK>)$wN;)fQFtf~~akpW5@9r`_kQlR!w0=G`sN zdrobz6DoEeJpp_&jdJh46x=iQs4Dhx_ymv^2TYYn&3hQ)Zve-^c$^!{y!h`tXp=kw qmiOtrLX26QFeyy~O@o+ZoA(QzG#t$h`Uijj0000P#29(hYT|2R-S9deeu#^h5m_z(59}!3<$2!_aU>Fp^PdG-DXcI5eIKOk@(8%oL_F z4NYeTGns{EGl#j%L-Sd{LKdOLEMY0j2rOp>D_IrD@cQJ{tYIy|b%B@w>)C)dvWd-X zq3YH^t8Hv2Vh7sEE_SmA?PVYPIe-pwh{GH~M>)oEPN0*V;xuQ_St#dB$^Ipf`Avw|E=9!@Io4`{)BcMs-jiR)m_6itr*vGtZO@1M=^C>&-EQ_Kx{)da$^UZs9jSxb8`ng_)6>wZ>$5AZ+_vIcvIhkBSb+#@{FqpZ;$ zKhm)_x!GK_9XX`-qSFn04GIeA1^Ja@uEn zwo>kMfr@G!b>0_z(YoZzzT&IaHDC7)-?VP|w(t0^bd006)Q0{{R3aTRq$0000mP)t-s0001k zgM)i}dvkMhYHDg?Vq#KKQb9pMF)=X!0000000000000000000000000>A(T!000{d zNklBzMqy1kG@V5U84&UNd|U`m`u70$}21}xN$w$UEm45-Eua7F4Dl_ z%}U3h^CuAfBZwr=#hQfqeZuz=QVuE{M9hV|ED48$qAuTnVz0RKzKbmmnh5^CgH(Vq zMy9KEC1n2{sNF&A%J5VH zKv#eoAw#jg1rrb3lI#Mg`AC*U2|2g`P)TI`1Y)8w0MR3ex(4aMNE4uibRQ`)FClK#gz^0m$wk3<(nP ziGdW@D=`?fOekRzbRd*4(%j$<`W*C0pdA~*9C@3Ms&$EC6jr9(k3s76*IRQ{x?JQHr187nPAc1&iDVt%HMF6gPkO(kc=^>FL$H#UufJT6A z4yw5$dppb1G4?rVa?k`2;=Kc14sI;$>piGQ#mWe&9)*Ey=h#prG&fu$(EwZuFwSiN zHQ#|ivLuT#j~EDw0#5X ze(0K#g)FTDeaS7|C4O=8zx|psYq)8%5ht&O;8$m`zc+n`Wl5$pR(hAVte*G%d7bue@0=WopDH zCw62zUU-(|Q{Qr90F!`5jk}g#S34W6K0-ZD0n}vKR8e`DWu~*qQY9?qsY)?`v%&^& zZ@t#pEU#zDOm^ZBS}Q=l?Z$3MlN3cwR2eUuL!d<;nNy^bK4|4WXd~XAf+#W}=J-cU z(giM6c;GrL!U+^W@us*w%+}rv3ZRCyGE=Fxe&q$oC;qHR0n|6rN+K&e;+;@{7*P(g z9@JovaNJ1FkqzK02P3E;d`` z1mH{Zm(l!Q?vwRa5OR?R5Y1qq<(NlX7_}IxxrH`(ncoGmG6eFl21`6c;Xw zWYmG$a{Do@<#I7U!i}d26mcSTdhZ0hHa3#nwfx2VeqV@Born zTfQG&8>3q9uVOow&Eec$&*zt)^Rzmj#ha6}dba0HIm<7Ld?APVVr8R%2DY2H3s$5W z1nz$Nx`n{qK;YIzvla!IZCD|%KC*+0UH^3K3!rJmJg&a?U980gzW71pQb?b5h`HhX7<5`U}@5ss4ja7YbV4-!o;CfC>V;(TqZrhPlD zmF$$oAxgC*bcvi+kIQPfdycx#E129gEvKeJfzbOEGO4< z-ym)C`KGMPau?#zN}T8vXI5RM#kILsZ->v&*&Um*ZTNvvYA-%mrRKl(p9lY=ZjQ&y zQS>m^Ie6dN{j{pfe1TItT|}q63Yw}CJI=o^>GbgX+;p#^EL|i!7_FqU{4aayKy6 z1=Ex!TJw4NdCi{742`z`ar2tgghx3oNXy}^CR?xTrs-czHUbQ%8O`hf>>y8r%pEBMzy8zHPdptKcdYkrOWTU+Ph5?_ydjI-?e*dxBlcK{s1tY zRrV=B4nLxf`B~cj3)kkOd5n0Nv#ZA=YE$CiG?cPs6`m3a*>>Pt-GjJ%?rNV7mp}Q^ zXzQNRwe`aVp*<$Y{P3D00JFN_htOLo94KRx5IP&$LHYt>X(ZMje{1qt9G4j?mpqCe z&VUEaAP}>O<#}j_ub_m7#y)ko>mJzWhrgbiubEHNs$Q4Zw*LHCqH4{@(~f3RH)EGj zkosiO7Qv_;P9|PIK!u0+y>Hv)Yu2>lMz!Y#SK_DvltxqGNe-Wzv*CQ+PI!OU63P!W z_>1MdY=#cf;I5m03yN2LNAJSII1i079L0;XUk-f%Hd_p2?XAkspw!i~Z&qo>#X7#< z0G;n$k2>&4Tyxh=QF;)KL4+1fa}QfPE8=mGpr7B}v=iw-_d5{!=0jK@>0y%xyCmKZ7h8Y-u`+5#V>SJMt&!Y+s$)Q9}5tF0nwj8 zf*(MMdgH_ll^#Hy|Byw^{v$Zln?{H|9eM-F7?iuWM7lwYC{nj`1d=J-O zO7rVQ?@7n*!lIlVNV@zl2k{+bH?V6|W{U=<{B~kPd=!37zbI` z8%-<;kPIMWjQ16d3?N*=14B3hKwq*sX!0~n7eb~;3RoTJj=_NU5_tq# zcM!P%GELC{B+86gE+(wYqFI<%*~WwqUp&X}a?p}20A&s;0D626Tvg<=N1&m{QqX}i zarrkH1X)m9V*sJhn#e2Zyt_OFt_Bxkec-~RnkU-&0w7{ZItyuE05%jrfELe!OFAJs zc?35a;~Aemo6bRW1EC>pmTEHZ`U37h^N3gnAr+~TC2=uFlkQqo&V&YIX9Y7|A zB`Bc_GkQj3YC_ckgxPeY_h2Z6ZfP6TQlzOHxiMYo7=-}h9t=4Mze?1?Vpu{x2cb4Z z??H=TH_{o~@N%Y7=v9GXS_*juFrl%n<8*=$_5t&0qBDJJCsGK3>)Bo(xJ>dPa8)Vbfy)b! z@&d4h=1xTcObeSlrO9g)O{fls8N8n(HzT%Zb1)^!!VOk;5DwxXv@i6WI7O={VVUL5 zp?jOevUmc8gIha-63RV@J8&403ebiAk+svbqcxI3&md^l; z-vQJ^13=%Vp1i8vWVcvnwOa-AWnAp0RDdqcZJE7Fr4m`LE*nK{9S(KWEH*!*l6qDe zDuK@%I{27vC-y?|JODLMUo~!$XI0j?O*&ui%EQ!JLD$henmaOk5nu%1srHY@COR+P z0c5_FrivXi;_J!B>@b1Ab(yYt&}StT0(Z4BJagkh;AV6kHxRgiO6JjKm0G({m$PtT z#QxF`HQ$IEx5(Gkx`~=>xzFpv)ZCH@Gb4{VmIogZ0Ga?gp8M`@LQ>KyX|h*4d|~s= zW>r|bg`;GPY?{Q&Ak_mSZ&t;rf*HoPsn*r8KFqZ(ow(+PgDU`$>X`CwGg}Fe)>f0A zv$?Z)ahIFzs<89SQOc~E<;gnC^u#HyoBFheDb)q0=;u>&oLgIS;(8n3bf66cXvw?x zS-g6WK2qA)=ki)D7uid+e*cKe@VE}uvTBy6WS^BzF*}{Nb$y#0T-wjMy#vtStUM?a-d6P9^nbp_#c1XSO$MVZE zIQWyu|A_q%Kx>6xLSH`py)N>#u*;4_TMOR{js2Nw>)!A;XX zAK!j?=lktaPaFtb4FcDNo}h00$k2_`B|aV7&3XC$b5onKouz7!xHPbne=iQZ^pGc6 z3I*8duUV=*lK|Sjbqo!6E;Z^VSQ*BwzT}^m^ZR-I{aj<^aAY+nEDkec}7w{@%YgRuYt@n&c5pLI8gs%g<9$X89`3jUVem z(d=wU-xP^SrO6CAfpyA^Xel+X@97S}TXR7%TR%^$Qca7$1*{tL$X_ zwJub6$g(UuO!{1kG+E#<@lTl({RHr%$QO(GsQv3UDbl7?ZW$#oUhB&tsm}GUVe;Kv;JWZ%^YR6Jj^O5N;-)D_*|PNv>f5$e zeYURqA>3O&8}1Sp4%U?wM0N40O>=F*ggWz*DUn)vM2IEW|LzS(Mjlt9rc zk;K4(c@L!i^sk8wqZe^522{ z<^URmS(*C$0qN`3h0VX3_E=Qs@drd#x%NxoezTFTGm{bcvuW#UlzqFqZ`~>56wSE>$6_EA!XS!95w5XJ`q;SK>W_=mzQoh@Zf2 zJoz3(n5S0B0CtDEVlk2c34e0{$+sYS0&xe5gB2v!hV`KR4cOH5Nq3z3nc*1c>qZd5>dh)?AHfAfssTzkQf?Y zn}b}jY6(4oe8C@2iTxvpHC-M+M9EZRNQcR)L}1l-F15z*|xqiPcx= z`M%$?$GX8UWJWwiHCzb8h2RegHF2RyS5~3GWZ#0ep$s5Q;%A139T!Sy$}5C3U7}B*s{u&6 zh-VLJdfde)b{r1+0<^4|IH(Aa0vKCxq|U*WP+;gmv|IizKnFVlT&V#YK!UIUWt+zU zfGP(mUyis-R{jV?5`6$+@N#75HD+6HH4PZEWyXgh4hE7%0EDKLWuh_xB2&AAHja6t zQdz^u6d<0!s6j$G1n>Z0DnN}ln*e=D4myyj%-~6X3Sb%ss!yQkK?iEGCJPX{$b^bE z=mJ+?%oOdreF5Y1jHG<@4RyuEqv67P6QCG^0TCvMC0WRjbcZlP8>bim9@$jNpX6Y9&TdKxU ztv{p{GJ6R9YPe*A=&59!vMj10zvY$nKO!8&9azkUqK?}fwm(aR{xT@B(WqWQ9 z(iTnAVh<0==X$oq<@&M!(6aK#gXy-H0eFgk7x~X><)-S2hnFQQZb=f_fr{u{_}aWJ z-{3jyH`(E7zZj&Qe`s}8uhpgs{CwkUmJeX{v(7)u;%61F(&?6izN~nql$aC$4r>8;rTxU-Qj1so&-gy8AHx9k3V zt>3N}cGQ>U@EH2(G!4v*`CJu1+fU+Z+VG0BEr8qNwF4D(Rg>JB$N}mDmoL~gspf0P zG)|`RC~z%Vm$Ah};EoIM%GK2j{v4g3VwuVL%0XR#FW!_$7S({zJ8n*P`5VG^!-FhkPc533VZRV6j_>{*vB$YrU?s(9LhO> zn1i~-_^2l*0wh?IO-q{bFWC{a(SNGdBh(3$)j4x4h-1S=&#+<#%Z{&%g?6Hmq#x(jZ!Tv05bu4G6!=3 znzF6O!2lw?YVv+&&%qGJ*Xib8hh-oai>j$FOuZ>P4(f>-$*Sl=XWO26^7hZ%LU`Ue1pWPEcy7al?v4t>x4R=garM z4sYeG&k!}I^(iTm_4%cpj8m;m^LLsi$Nap$Pydef@)Y76r_-0DVRiCSE18k~SbzNW z`F6W(TklV4nO5hY?Zfo8ZGWd(ax6znR@zgu{_MfLaqINuqGnF^v-JW}+6)aJQ8~e4*&5gei08>zCy;%T@}2N=__hPklXf ziu4A;q~YGkW%mdtJtQmcV8+sA_3}2))*X1H7IR(#BMrx(L}*w4Ht~l3hQG}yPOf$N zR{gbKuB)vAk3%rL_@?uc7-?E&;vuqI+5v+#&%T^Y%I-b*JCS$2GmrRozg1mDQaKpD zrcRO7%d)A&_uvTiU_YF?cTmz6L)5|ml|r}m z=_pn8>vg4?>cvmJ^tGJTRnvS2qA>_$n3Z)|1Z-&U5!kMGs{e8ciXi(dTksxp1E2r7 z=Xe`U8~X9E+X}B+*)xRK_2QxKcQHh@$JgDmE$g)UQ7w7)eDbHQD_rTLAw>Gj6<-u4 z!O-3$l)l|6(YEIwjaZiVPhgu2|8`KQBE5XMg&RD<8;|{51mr(}^*xu`&v?4{7;WEl zia&yN^1Qf}PkEj)TIj3zNATgqTdwUnMTVTJZK`{kwk`gjVE?U-N&Bx3a`OKLhvt=l fY?_!zfAanZtmW~3kuXOo00000NkvXXu0mjf6ZK=N literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2c3c757cd2cda17154c139ea993ef4d50c768846 GIT binary patch literal 2020 zcmcIk=U3Ke7Q8>CDIh3F5tJF7M^QmRR8YkC#g4uA@+$V;v4hxq?+v@g#F%2#G);AP zlifAFnzALmkeI~HZgyRA@*(*La^{>n_soZTzsyXG#aOV1AXEu>!6@)by%2;V3|>q) zs=`%61S}F!sE%mF#h`{iqo%(g78ZwEh(`kA5|Lzuwf*_Yh)GCG!T36;3x8^Pkq3aV zl(c%N55XK7pdr#=jnEiPkPd$aN}8e>GGSS0j%>7mwL~lAAQ%4DINt_&Xba0nJNV#- z6`(yjpd+jkI-?7^!V1w1-O&Tq6TQ$IePDgj5B)I!HV}g_7(-w~F$}{o0yYw(Fd6~a z7>q>`#=*v80w!V-Y%-=`DyG4vV+Lko7Hl@=U@qpt=3@bhu@JThi?IYtVau=_B`Afh zKp9qI6>K%uU@g|c)?))UViRmLwqPr^!M0-uc48N7H}+sJ_QCe!01o01>@betD9T~S za2zLa5_SrwaRz5$=Wq|s<6hW(xPbd{5%vHc#6x%(b_tK*GOoa`;!!+?$6-(4NnFEq z*i(2K&)`|ub9f#%@CSH*#Gmj2Ui`qbKjSa>D{jJG!pnFCufkr#>v#ii!rsE$cn9yo zZs9$=j}H*~A^wKHS9liv55qt45kAHzhEMSsKF1e^FYy(=Mup)Ue2d%o&hR~cz#aU{ z@FV_>|KKO!zvlf9cVR}4L9D`HV+cbT#&Ba*R$~MsgBZo?ylr{W#u(OMO~xAISc~yY zFeWmIwV7;8VI9_Gsu3jXvA$7sY`})bG&W*mHZi6%gH72C%(U)VY|dP>G5hjLgDhjRo++O1Kgft8~f;24e#V-XD%-p{!E3;jBO7vZO0?_aFq zLE~6lGM;-&Ca^4LSr{gAlHW~^;1o{vXH7#!h3`UzZ%V*7-I(di%=Zj66r*TWH$^E@ z5vtZ+iBVM*uACo3;}xQPvB5~q%?c_lPx6qex~fwKUy2gall=v?OU;+0L?tLbNVOEF zSbssy(!k)>%2ke98Ct4^ven#_rA#$b(^9O+P`a9^v7wRD)KCpfPEvi<3sOotRT++< zrXd=vK^kZpp#JKozNS9vtzPPB>Y?uHrb0tkbwOu!GIdl3wO4`3FCW?|-_%xlYNJJ_ zg(}tp%{R@{T+PvJ(=5%@3{5vp(^O5-WYZ)~)C7$;jZ+cEYK$qM(HfRN>IfrwN^EjUiSZrL#MO@5trn5Su(>i53sS`S`W2SN))e#*w9nwJ^&`YM9 zTEeAVRvH$voFy#f3S${paurt_*KjS@alP?|p4W4F*7S^?)>FD}x~3=fgdR6MrbqR$ zJ~D0KMsDI};}&k^Hf}fW;7;!1ZsQ*Av~PEnqJY% z2z4Rm4)7ok@v!j-kFuP{B6*xA!gj`ZCuyhngTB{yvfKDp->5?NwZ77q`a<@(KGUcA zM3p9}@9H@^gG+UFT^(mBF4@&~NzM{of{S;xoW;3VSJTyS;V~}SB_>yQQN~CY;i|c+ zo(p$juB}VBk=VwywuIsjb6t+PR<5OM!R&C?++|sIrfX)dsmpNbu8FzEu8~V~l@-#! zIoHqi4RU>4Z`Ui}>$%Ba*u$MZo1N%8Lp#fJyocxMzc+k-JD2Z@=#6z_T)>SElnfbF zzWzS*5*J006iI0{{R3mSp1&x5`g;^Xv3QxG$0n2EfxeMY_tF|I$Uai!}PG$a-?hn0vs?ha5xx4 zCk`A?6J2UZ_XMK$2}C`CM8AO*Enqv+b^Uc$|BNgz938G;Q^Vo(*HzWk-PJv9jFlb9 z`#X>ic)fLU4PWm_KHQvN)3bMxaN)Z<^CjSQQ2yq8mjYGc5O~)M{NRB92`cxz$7{HS z9~|&jfL_H9p*9JSE^oKD8c3SJ|I3{s>JncM`~Zb^R}T0dpN&l31;AY&@J<1*|15CZ z1Kfr3J~Y_^x%@5_f@*Vr*S-l_nd;tbwp#*{B3YnnNdbmD1>6eo)&;PZ?PGw!v)d~M z>OK(xuT{A(16f06Gto5#{Z$&?Tx$R8sJ72uT~a}_i+aVM1YT~eToUkBwEa3@;GGT2 zr2}3eK5%F+5aolry4h$kP*lP=a4>(pOAWmFeV57>%iV;)>lFC@(Lie?X}D7zEdcI% zfg4S_r6&WEole(}0^V*y9v0keE*QA|df>SN%EMP#z$;jz6wV=J~I<=Gac z>k#<6Y9)|!`g3s>NLcG7Y6pL=2x0$YqofL6P~iyI2L@5M&N4t>^j)jP-NvfU`PsN; z0$zl--@VT8+Sh$5i{Mixwd@@i7EouUU9~;(TEVbUa^`jV+R3TAx6)t07w_mMh)L^Q ztsDP**R2~X%T5X0Xu2*chCi(v6Ffur5OBHzs{91Enot~H1DnRT@^&Llmj;{-@H4cj z=@VgFA9{$7v5OcDJppKo8s#`o#8&pawOL7g}@e8;OS?3RTZpb-L56OdCWi zHrxJD5)s`g^`M{{`>_l<%ZmH5N7nUdv~RT!+HY};fXIratpRQ>HPBXS-T~3oek@?u ziWn_*lghG#e@(OY;{<#)4y~oGz}L*g_KZ54RblCM?%Govyw>x&=HV*>&L+}+mBdNZ zD>@Bqq`_?D8}fh!&PQ577ZmU@E@GlMY2lrX*32r?uwNU0znYZAn1Mt5EXtCi?KpBL zx8B@!%F>*2gZBn58$b0V>{l|HkxzD0*4Y=x158jf`-2egeMegK(>hG4L@R{DewV`>*`G=+o%s-beU@PqMe zQdNh@EvqT^i*P=b*~}^#0c8jd`l=^SYc`jGYq&Voz(oX{aQsqR>nQayA03SJ_l{=u z^%9<3R3WhB9uWZ5ln#T%U^M!1q(nWkMh(Zq(zS9BY!JQ2&f?~{J~}{^EVOz)D7YV% zpc9Q&tN{6-TiZ}EWhBtYWZH1Sta^forL1U7fe)*x)%?f7V2}V2N@Ig<5FVPPtK#4z zKpCXwRR5H%=ROvEc-9MH4)lID$sNU=?3 zIvN3owtpdLNI>hwAV$FFuF)InZxd{kx6FGI0LOeaEJZ;EF4q!7ep(fWLYS?((Fm=L zfTaM3#ojY=-EkA9m@sPu!D*GWH{J>`FnKW88^mHmSAc6skS1aUHW~aKJk#k2)qjf3 zWcEPcy+NUYPo+zMItTmpbFaprs-6r6&j`d}FP@=fNong<9Sxr9zBUMe_VPO$c>ALR z)NH+WM36ktnGQ71dm?t!Ki_BMV+>4*N~~x23d(-Uq*Lu1_$3Pjw>nDjGZe|Oykvky zpLkf^BVPmjfoZS$U@S(D&r3BDK-lI2H&P(EXI5R9qeyS)Mm)eVFo(?oyKG{*!j2^h z25r43kO2S#Cb-N5V;#@CD@e4v9MEYTe32SJjKWEW1X==o>g)#zBld~lY@am{S;~DY z9NIg?#eMIo41Y-nU~`Y`qnL17W*3N6HUm`G)w9$O-&x*#Wa^Wan4iKC&ldg3De5%j z>u0#&(IXgKj9|Esz^2~GQF}r?^RpiKX*A;sehgH5R_VazZV-1U)cUjVjtS_+W)q4> zYGQh@FyPT2K)qo&H;+Nd&)je9QY8ldBDh%1MeN~il1B+7#UZ{KAXq@4;q zV}G{x{+df5{${OqGp9A^>&Ed+SL#bz+qQ*N~gc$FD- z|8D=)2mE{ck=kfhIh*R5Q-505+J(mP!ewlgU8i*Sy$V_t?>WqLWT;$R-<-}MM=|__ z{Wu!YJoYJ5LHkC)4h5|%3=RjmyIA9iN8eVK**FhCOwf~Gq z&A$@RH?73Vg75k?+iJMrirMD5jiML`@l&f!mL_c?2dptUlbr~F+Aw+*@=hRp$Td|I z$4vrs`m!NM01SyRR(x#OHxZB4k7DuI&MEF1b83X%heY7rJ8kq_!N8dV7Mv3E%Jh)K z;U74Z)r7-w=gmjwutukjk;ypgc?XC_L%2rxZDK|9V=TBVhm&%7>Jz@|~i3p@Te<>3N22KwY+QM(O~&h4QD9bYvW@~Wy2 z$V9i+XCRJ%4*{p?#-dT>0k~2Y6R@K7y#|(E!=&9buxZ^}k%pZxt7N<^%1}Mlkj5WT z)cPpMU>&fLmY=zu3kOuZ5V*ir%mUZFz|!;7rm7aBwxvW8N5|5(r`nL9;s~g-fro&A zTZ$nInXo4r;6z!X5TOa-wmVOU6}=}g{#o9vEOl<+i|CZPi*|ApurLcxbKNY?H^LVm zRn>+2ckTh0myAVC30Fo!#7fu1b@c!z1e8=K=5b_%JYt3xJ0Q)=Wb347%Q;t39}u?@ zOH)L1z|g4{MJLsKm~)M;zzoY6CP3@jX-LDwI#IbF7(34;s7`v^@(5rVqrL$29nmD# z_5rQd*+_7}HEWo|`FMFqJNMAH0jftl@a4TJvp{F^#C-{W4r-KXo%}Ewh;mWB`UgjO+jq4SvZ?@gj-<$(U>0km>PH~RG?)zcx19^gyc${Lr+&A&ehkPibbuQdG@VW{bRbaXVrUBs^i%DX~-5d()-AQ4~Uj-qUI7JEQ^Brpzj&G={_`bv)>=@C}CAvd=X? zoG>uHDFujMI_bjtc%gnLlE85Be%h+l=)&Wgtf6MCJq=Zv?Q4vWB4u2r`c!Qqx8wXkjkBk5fgpfP@Du4xZ(xoZ zh>-*2(fcToNWG>PD0<^Cr(elH4fx|yVP(%~-2+^$^v`n)NhYg+S7%$7`2pAj_PW{t z7ZILn&SZedcKjB;g&M0(zLegq7jeuj>bI1eZ zTnDPg_9GxD%{2?KaKPhUV33lCn{z;vp=@qhU~cUg(`pK|7|3q~hC-a;`Hc+FpYic> z;DA7koGvP6fjL@WvL!A=K?NjZ9Iz^*WKKXwx~Ix`7y+G|rXDy6fz!Iq?R4XuV!oxo kA<=INL^b~p{ND!t7sKeq9+;Nm{r~^~07*qoM6N<$f^)l;^#A|> literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/backgrounds/new/fire1.bin b/graphics/battle_anims/backgrounds/new/fire1.bin new file mode 100644 index 0000000000000000000000000000000000000000..9b0c40159a18053ea8bd8323149c367ff7564966 GIT binary patch literal 684 zcmV~$cT|mG0Knn*{ko{Ea$SV@y?l`^d!>6RdtF>4tBhomZ2G!Z$xb%eWk*s*ijciS z_9ldLI*vaa=Xf3u!$p`R8ZJ4~L|};=b4g0Q@o_=AB6T<139ywmg33^qa)v{e#{*9) z7~xhkkri>%Ed*8~x-wO)%e^pFr5e?ZL~l$ruuyYUGT0SqwS>h&ZL&Ree5`qOs3sit zx<XdSLG<@_UJb-t-Z#J^Rv6#o6gEiW~z} z;y|^{A^r`L(mq%n9K!ElhI;r5J%nKlXM`^!r5Yu#hZ3eSnlX%3`Qr|$=i$na1=K89GCAi;HO#l9?2@k?d$GL{QsiDL!vuu^8MVl``AS<5<^yPgE6O4~pp8|A|o z^i3*vGh5gy*v58tuv3u4E_SnLmn_~Z|LkKw2L#EaaF9cS!yMr#$7*q0{oSOeYF;M< zCrRTJ>4xTWnhY{IBRI=B&XXm$K)jw!POLCr34K3lC{)*SUG4OlKJKpob hz(13ZeB!fH#C@TVuU2!W;2Ym5;)g-#Pk!-A{}0cV))xQ( literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5f29e792faefdd982c3a1c305b9265287ef08905 GIT binary patch literal 2557 zcmV003wN0{{R3gj(ju0000mP)t-s00030 z{{a7-0RLhD|1kjeIS}qa5VS!UdodUQ00000000000000000000000009gtL@000Sy zNklt>LvFCgyLA`hGq8GzP zJ0`!JkN-Idz1hI?c--y7Kclr1d@R;h^!H*Pv#s@4H@sTlhBgdb0wAs+pnzdu8a;4+ z3v}xRI0itsLN{J)6#!wheykr@!CQOayawLs%Uyu8t#ps+w-zq%T~<%gclw3~cwp$C zJXR(Kz+1vp{cl^0}Df;c+ha_7G)UL0&e>+h2QD;WDTV8#C7Y-b@E zNQoK|C?U{%t^)(p7D><)Xwj)jwpHsfR?om`4Xgs7lg^?*{&SWTBXIgJpbdcb*FXxO zvvBdipu#wEc3Pxrrp1X@W+_m97~cVx7ho;R>@+*z_+lZh0>TO?n@WNg1y+kRiiz~T zc#8nxcAjwb{s#Eaxs%A*TB&lZKKoGFNt9WPT-Y%#o>wCj05a8^jF@p*g$D3EcpuJfStR3({^)Pws2{BfW zyWl2{C;Pw@wa`+lo2956utJ^rgt1MPbNc@9kU(Rq1I-^Bz?Gr`v_Umg58ed0LE7E| zwFd4EI4xr(Q?%0rz-kV3V4q#CT@8#L2ojhWP_3y;k!aKS0} z0H}AShuyo#*cYIE1-86!RABonpp_#={|JHCjW>6o{rHr_ExN09&eU|69F(zG|I~rU z_MhPe$fulr0ph(YSC@YY%nloO0W5D%z<#h!F*PDcoWzFWgvaoDlfIrMe!{R_?{#>dH!S)_B zsG(%ar}1)v2CHEqApTxv>rLS|On$VrRtmN|I3Rv}#)mh+Y0=Z>B*57L@o<@=l&)g< zoE?zn{ET<+fmY;a{N^$dBND}p0}4R8@K4-JO{kc&2G(;14w3TX@wt zS=0yQ#6*n;wvD$iZ7Q}f)3jOvM*AR!n9rcG+M|i~zQuJ7!(sc@Cg>z z0z4THt-!^alO#pC zd*FEm%nbwiY-ZAiBj`^VT=?faA^0dNk1jf~C&i~}GIXsJ;;YSDOW&kkr;7DmMo0y9l90zo6~rw5`d+;a$s zA!VSxUNyLVlooG+BLTY(fn_6ZYC5~y5CUrl{7Jy;8mI9~R!Z>w6Qe4@1;0Gi-+I53%hZa4KKJqO9a{^MkNn)$76cArc|~^)>o9~McEHWo}BFv zm=3c2DWRgEx0WtrU}O$u&%&&{_G~v0@Ib&*KAdGTSQs&|@)q6&NK>L1frmydJQh?X z-Ecd5i~^9EwJOoX+A5z;jx# zz%tbr1L1yzvri@jrViLLP~?(1V0!&B2O465nWhDU1$bp(Zxk4NVAo&_RW2Fp1E!|e z3jvQ=N@Jj}Tg$);-Or9@mnCn2w*!P|cV@W=5JF0jP)RF$5!!6xpW(9-$wEallKAlVSoIF}pn_RO9+Kfxw17 z5&;&pG`*ob@gxTeKh)ibfO{OpNMiC@Dzi9=b=M=Gi(Jmw9JVZ-8_9D8gkyph53L85 zZAUAUNQEH4uZV$Cgqb0E!cQe$76d5a9)qJ~efM0lc(T#$EG0WZL2?JX^iZwc- zkwXCNUBT}i5Kn#&+>`ye%WH>_t6>%qyxx4TLGb=7@5=`!1t!) z=!nW!Kqr3!HYH3yqR9{eN3<%0Wz$(2juo{cJuFUG~&n4FW-9DFJW2K_GNEj#|p) zmf}%Ta<98GBvPs3OJ;)GbQFQu>^a^9GzIh_9Cg5k;z5@tskWN7P$9)vRX>)jTtQ{waM=;0T9zIKr$%KBL!;l z0WjN@ywCQ85kR169Pop8#{b*2&E`8FyaaqR@SJ})F#B$x`DWlT`F{hOZwCGgz-?c4 T=a0?+00000NkvXXu0mjfgE@)T literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..42bed6c96f9587588b049a0372527027aecfc6fa GIT binary patch literal 952 zcmV~$1z?Q}0EXf3cg}Gf!_L_Bct31R4Z}?Sx|x{n?#`*{?!1@V!R_wuC#|B*`=?DyT#{$qXthwF*^HHL6pCnkbW6)CQua z4s{i)M_LxyN-_17Py=#kNF&skCNw1%HKRE#$Rpa4RP2t*&=>WiKLZ$u3K_&;hM=JoF^u781S1*6Xf%egjAJ~Sz(gi78BJj- z)0mECFq2u#Mst|UJm#YXEMyUj(Gr%jjOAzrD=B6bTFn~PvJRE7o(*gy*u-YGuvL-5 zZHjLvWd}RaE_Snry=Wi%Ilw`5h{GJ=C_2VPT+DHFf=jrR%h2Uq!IfNvuI3u9@A zbzIL4=tgehW^O^ZavQgE2fCBHxSM+@x|iU-Fn&L&4}=-vgUWn}hk1mwM|n&+kMo3b z3!fzRlnS2a8T2gA@jNe}7dg!tUP3SP3a|1SdYw0TleY-pR&bVcyo285J>KU7!VeYu zh>!UMeadHi&KD%V1UBjyBOxJR43)^*E z*U@^;a<&rLR(&^cjvHEy+}KUr)XH@;H+Ksw&n?}`t*v~wae>=f?cClS+|laf(4F1I z>gsOp?jBZ8_i}IdanRTO+}{HfNe*Sfk)ukcD2TdTa&-005{20{{R3m9qGA0000mP)t-s00030 zVoLv7LH|-Y|BHM7N-_UIDgQYj|7u$Ql#Bm^d;fcL|8r{pYGVJSqyPW_dK+93000eK zNkluQG zs8ey2H>%u-%B6B+$#=j4DmD>a=%7Lih#x>M{2A`OH-9)oQnC`~fcp(N^XAR)@eSuU z{4+C*0Zw08;Zz>w{r20SVrrFinyGu5mY_ZM%ETcA#EXFYyvhCglS8BIUgQl*ym&ls zi?GkGB}w}Dj?U|6OiVUr0Uk@d_GA-)jep>RhjGVOMPpd zLA=}>*X^Vp?Qsh~mULOet=5$6zp1)ax8&kQFa@d1GTb}OaL(l0$%Ie%47|sbLg_Kr zas%`w_fa8b*5E|k#a+X5qZLii|5)XpZIG9Z{%Xz*i=c1r@j?!+!85)ESRt7t+4kE8 z*&vrc{W5Q`h)ZrtHpx)Rh21Xi@&@nf@D5{y$|qfR@U&CbHfo(R2 zzZNwa1`d|pRJG4@Vw`A@VBkziq33zL<<#0tcu^`^a2#h>804+8gD5*9CFo9-`9~_>f{YrQWhr?fPpB5#%&M*7`HL3es~OytV4}+! z3xz;KvF)AIB{JV_1dAZy#6FM{N<(!P^N2-s_vj9mYY@s9x4B2*Mr!saf^l%eAvYJY zQ!dkZ_OwCapi=zem5QTk!*9% z3q_gZye0pVb@mikEAaVwlPJ^)Q*`U7Nz1UKtFFC!EM7TY}xsEP<^Jwu<_`0Le`z#N*@P&<80#hSvBu zAmPF8Hzlx)<77F#yd1~N=?LS|5#o3`q4ek)3#W0ya?Dy-EYoc4^?E}NQLlTH#;A;X z5eY(l$uzeD&9jtaft5FNCaiOrW>b>kR${Pgk&*Lt5_Kl)Sg=_pG^Q>w;w%$Ij%`ba zt!eXRr^V3c>kMZ3wN(Iv#JYT7OS;yQj%7x&)5MU`!=-%&7{WY5D*5B%@o;>MNF|XY z4d{;jScYqi5q^BF^4AcMq`rU6)H4mp&Odoa-q8^Z0TCm-<0A=Fco2I>$J6OJ2e`r% z55>bpJido1k$6i zEMFUzGS#$+zY_ij1|@&4zY-WRXt_+LUkMDlGwOBU=XvmjU`F$&f=L(v$h$EKz{=}S z))u7++hf!*x7p_*T-cT77EQ&Rc0KQ}z+>x7D@e}F}F@$#lJ;rK>D78 z)(^6^(V*fFR#HlA{Vhaz)z#nww%^8}k8P4pts-#%ulq!7!7cJ!T@P<3)V{^);+&oc z=ocJ);iI}f90R(O@MruL z4BiPUUiBG1=EmcHTZPo*zDx<>DqP*J2)7WZ(rRT^SEG#qhla|%4>IlDi7xNS&Y}Bb zf;uHqLxDO+4Qk-wt>UMq4fXOs8jb|%EIvZn>Q)&Pw9!u+v#EJ<>*qzm!<2ftpCRZ6 z)8M+3=vvu}p~rAva|6jV2;E~nAa3yyKt9qy%RD^P_@+Uf4tQqPiEI~pVwCk|pI9#5 z=7+fUP(7w2d{2k^Eemf+3-D4_HN{K47^#Q1bkbGYu*j|nPwccY=j)%?19{mHhcv#Z zLg662sM7ZlvFu9K9p+vv`t8Do(F$3AuHRc$-aHBO;fmhpxp!SEVv|Glh*N!`QtTpp z;THUs5U!0_y_y+(EsE~Z4@3EZaVwaz_ETaF*eFs#_!!D(yr4?BTKlyV8=q3|Hc#_U*iF+5w{d%)EM7~1(@byrKcSJM$)j@nm#)89&s+9R6P>BsUl=ntjdBxF)%I*Ze%JsKbi5q^5j> zAfro)>sdTh6NN{|G(X6NjB_>PPno%D`^e63OAUJ;)BJhw;wC=606N7SW8&9Mu*ij= zP#2`7&?(F5XmoiUTTeE@u5H%|Ol;!eZ(n3^0|ORYF14T?OgnQPFE$#)#U4i<#c(hL zqQ;U|ELl3^Z?cKxfEJ|o=F5e>OuU?!E2OGiuJy7kkIXEa zQm@&iic_vBrWLHYw94hTVjVDWm}Jl~{>_D}Zd2wvobuuMZ<`n> z^^J6Q#!RkB&GkC)jkxqjy)L}PGAR$*YB#|`7&KOvyA4zvrHXg=8x)%h#39!8e%I^D zVTdcs-==vl6m)z$;YlEPM|?AhXl{65&CJqw7}i@Y&&S$ZfJyVt8L}Oy2F+HPt7+x zPjRwTD#^_#^%AQ&w8C6|K36Ns1gGZEUIxkkMOklp@S0`=W`8uA_C1ai#dx*1$KJ<~ z@+;j2^vk#DHlS`j)r$hXHah2G*9f-=q4tY-OHY+^-uC29C5RUvIoJD^ur`yMqSV$X z1>?dQEw{AXtcZB+HM8~lx7kP4U@0tU|<#YwT*Yr-dLD`XA#cqP^B z4lz~dIixJlr(ZNDskXDgjcY3GHtJPZ%C0=Bt`lG#7dKW?FMINaN1f^0zcUGA zr|wf2e-!-Jlt1ugo;SX^mwv7`X!Q8gws5c_^DiEY{O*(c>G$&NXAzjmql3Wro3m0{ z%W3+4oUck4dJ9fS{vBunc$C1g{gKqVi5DrjyRe5rDR@vFvc|!3Ye%cW@sfhHOQ&Nk1hQXh8 zcu}cTPEaD@CvfNRuN4HiM6tjj<+K9oRi33*STzM+RtqKaLpWo`DzVk65oYjCg`e0% zP{6mB4>FkHA;u5%&}5qA+k*@iaPMIretm;K=fd9}WUyL*huHfs4b<$jJ{G2(00000 LNkvXXu0mjfoy7AW literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8eb8e48cd2022588546d9c8335f35ea7b345dca6 GIT binary patch literal 704 zcmWN|WmuD87=Y2|`?d*4I0O;Gwgm;)&tJ+KT`q%7qqPX(kRK~y3b zsZ0n}upxFrsY)33YGMedIuU3!s7WnqlOT1dOFimiZ$MH*8qpYOLQ|U29BDyITG1Nc zHnbI6I|&Oz+T)-D9Wi&JGpSwZigcqpJ?M$K7ri^U^r0`(k4XA60LMUrA`OEW%#c8a zjlmULn;0T7jAJ|#uupW_n8ajaU75mE(WWuogBipnMg_*s z#6O-{PTLC8Z02|{mwC<*t@eBz3$zsP)P*c!v9N@tEMvLO3Rbep;=Wo~!&=s{9yTPV zZ)6jjUD?7`i**~@g&pi<7YVT2626DM>=X8LfP);;Im{7`CfSY|NF<5l&IHQ@?F1(| z#c4g>enuaBmUEoPe1VIh<1TR-zhtiHaVgH=m{V7UYh33BH-%f=<_>p-d)(&%4|N{# zm?wJj(-=$YGoJIpk{%?5U-F9Ayb<2=j`w`f`N$`ndfI2<3#okNoA8|<{3K217r*%v zU`>a=hTwmQ(nRUXpp42SDwA?it{H-x%B(P)003|V0{{R3Yu{!u0000mP)t-sDKRl> zi@o-PwEqDA{}5vCVx;ClgWdo+-WXcVDN4;CQoR5%tPnw*04bCZF@p#o(kMrR000Yn zNklEVED$n7w z(GY5=)C(b2kwL&U2EGYHH4BKuWBnBaZxqD{;7O7+?jlKuZ{TB}fE(cz2L5g~5QxU; zQ!NpQC!jD41w4EpL{piu9WG=9T)hMc#H|VuBoKNwmN>;T1_j)n&l)+(;}p zS>muL{z1S6w)s^JxYqE2|7(M1cW1D>2wWWuiVp&TA=|v}1HtBGp`!4xO=CKgT#e5% z5G4xndjsqP5G2ABs(_sYLx_9&;lH-c`1W{)Vt&I7HBfz;gL$R$zF3hO7%~w5?$;`@ z-JUfGMC72>bFe3xAT!{2MBq*QGoqe*z?mvBJXbkAcn+ixQf7gD2U+~9unzi7q%Tyc`BBp zC@>Z`Ao&Ynfpwx5dDc7PUyorFMaxNCP`T``AW&QUY*Z8{9&mzqhkm*iHYk7KuVMV# zlL!hQHc26RJe-R$)bW=t`f*&v=LEfI`WuYT@sFF3`~b`{br8-)GAB;M0C^@}1Fz4( z@_e&4u|AQK1CT+M=inev7)#B&-teo7)zNFP%5H(7L#1!nbKHC{^W>%*T6K5Wt;#o&OoY^Y`HQSN&+1Z z$NSCc#5Dp&G}aJ^v{*}g;|uH*wV3v0I%l7I!0QN%Wg3B80On+ILksK->cEOj=bHZ_ z5I)Bgq{W^q9_va*B8tq*(ljLlvW$HHgoSq$zNns)2m}~Lhw4(;{~2w~Wz>D-fcODC zncv4)XWz=gz$lKu;&}=y z=Ap!%8;^H2Fl-p0>SDHl#DIx} z(Gkm2c+}59wRt>c34f<<6)I(F>%AgvBJjS%Xq57%OP%X zrR_q)Xxoh`x$NvyPLK}i#pa{P>wc6f4}}>Gll0Spqw0J~Z-tT4Edr4EdNU2X-b;aH z#lYN4I!xLuvp|QuTp`BX&;v$kMPlv&Ei$P9&)>D7S#dqZ*q7*A97U#gR-3NDf7h}i z1ERI;=70+#ZmMMijfWEXLJ*iKAHh3NJqX zg-e{jD+t1dXtsM#lw^w|FVP2;l7RW5B{I&e8=a27aS8OqlS!!!Gai1Crg%*GZ9cBI zxmno)24gRPx!G5iIMUs`b~DZ}E4=VlwW`2x0~Z=>vtQdPMS@Ibn=6ZCRbe?<9Q<0J zO-8lhPb`tfWL)Yho#Du-%3a}F5*=EBvzb6bLSP%M_JnHe)fq35mmsDdIf0YihTdNW zHC*XA_HC=_Rfa_lejQPR>Jt9aZdVEDcL+w{+ZLWU=3c2;)Ul5%9PXh$eSH6tXuH4o zxm-VuW8QPxb=PX^qRppgu!Wj2f@()Z20!Oo^9S;ZR|(Tam!q#|0;}H^!?&h-t#jNs zBGjS2BhCcgtN)~UZtLOtL@;9M*!G~GT}XG1X(gHnY=>+9V3JM;V=LlvlQ^K`{fWdB zMGg45W$U#)R5sC##|T`04Y7P)!BL1*fS)(p%?X~$cpASBBdt&!XyWH84zq0N1L1vE z;2*uh#R|E@2*!5@GcatVPy(8LS92T`B>wGi+z(%NjxcRwzs_2 zfd%Rfo{UXnlS~78UiSQN9A>&3th-Ag3yfWP*q)|v2-^xQtFUFgQmcF%%2L+>k9;|jSS*-@#be$mrNl>^}YYjbzxGzwCDZOqc&@?4>1`pfd{DC_0 zQ%R}=v7UpPL<9RI(61?L%la6>+?VKbdcN7dhwToX8Vk2I*%KrOHk5!3_5=x3yuYT6 za3UyT@~p3k#h7>yqI5Dy0&m#VR4ovjrc2>`9H&uWWNpwInPm_4#n9{`U*eIROJID@ zR$-32S1j=QoOY_7oSiABntGhUmePKMC((DXIbh+>EO45gkJj&^o^ zoX0z){$o^(Mf@2oe;yH}3O5nb48x38UUQmn;20~oC-(g+_=XmeD zmZ;=i0V>odM)$+agcaW842LIT$LASb&vqSWZ8n&{L48m<0$O-rMVUYOS8NuS@F+rqT4GWnag1V3(rYj;a5$su`i0x|xj^aF`}s3J zF*)iB6Qp`U@_=u6E`~!h7tIOa1g|s-Uzqt z6`<~z>83PkKAf@pETejAnDi8!d zo#63iv}LC7fbU8AGy&Uqu~YCRZo4g-&6O&!Zmza@$X?VpOnlAIw--&YjSxan z1`eEri88_|CZ6I%U@yT3L`u_=SfyzBAs-Qi0b070CYqEo^eHRua+JsMF%>W?Qb|(9 z#V1sz3P~|CC6=nps)jv|>eOIaO^jN^OIB?X@YInAH=knS6&n#Q3lFL;i6oIMr;K{k z=RyM-Vl<+$+-yQqtY&h*IVrS2S+37$Nh^7i6Jr_$pVOK)$QQJw9qlo`q=V#kq!W(L zbWu@V>88p?cBh9&#rpTOyuF~eO6;UVNkqX?)LE#tGw@Ksp%#Ok|Q?KA9=$I%_J^ly^Ea3?{oA-kHoo zW;2Jm%)^>5?lcy#5Lv`xmar82GBR1NZm&RAvWhs@YSbFmvW_g3Z>`ta8`#JX$R;+k zg{{bsY-2k+ulN5_aKLSvg0sEILa~MI43yC zDd99{ILoYm?|K&g4Wtu)C z<2?n4R))6e=xA-%exeI&e;uHU*ma;Ts+|QvT7q>NAv#q1&bm)vXoq%&=rA3QnWw_c F{{glD(u@EA literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b258035e343ddd983c12bf8098ed54eac3aa8430 GIT binary patch literal 3098 zcmV+#4CV8QP)003|V0{{R3Yu{!u0000mP)t-s00030 z|Ns90|NjtT_Jg$UVx;ClgWdo+-WXcVAX3dKO1%IvtPnw*04bCZF@p#otxB+1lXwNDI`*o_@xHQY5I^Obtd>3E)y3 zU7KK2ja-Pqj!;jWS}zBzF_7G221JM4AwVnCh@Pa5Cq2!Bhb$RrQf0ui#04%SHj%B7 z3uEoj01r9jb23s)M<8lQ8$g}Y4iN4g30VV6$)V?X*M-cTdlDTNIISSiqS5d2+%3HOOR&nz7U8#RYr~rcg0M%KJI&VTGQDLPCg8W z6hsXqwHyW{yLMq@T8p`!%bIsw|4QH|Z6GM~%88jg zhYpua(o2JV%s{858E$O2qH74`&Ad^RnmfmGZvqfce zR}OG46RPIWoFUNG?|Y87>x+KB?+4p8E&Nqg0Hr7xn73R=55Oi6qweYISc@mE%{|}u ze+w5Mzz=y|)kR$)AkVGDft^05x`cc6y9NmK{T?WrgF=85;JkCtlg~(DWn5T@#Ul%B zG-hZDs`KH-#U_ZGd_iE3?8-Bs%(5&Cf~}cSv-1xTht4Dyeu}`Q z?U-9pUVh@*d<3zrz)T=20^-+)H-M+`S?Izrqv+U{zMVGF1O9t~z%7+S#(*p}gAWb- z-FlX*nF3+d1(EG(BpauR0sj2v@q~Wbw>E!((Lf#z20ruG@BmVYT)2k{m&Rbz&b@u9 ztJtZ#lcm&FK+Oa?2=?IfJBF&fT9DP5o{Z47Xp?RCFy|@m*bUyxRTKD>fe;vs%a)S4 zn2scE?3&!%da@&DGh_Ba@CS^GD9o`AA1SSHIpm-i9>!zow5E0ScXT8;%qTp8+aWFn z2yqFODE!wM0qw5xCz6dssmcGq^j6L|3Gma`CTB2vK(ZG2^VgI%2B+sAmZ9iVzNE@2 zDsA91-(P2iP%!WWD=dF%0v|}EaL^@Hkw3+#w1M9VFgxK?%AHllYZ?sC3Bw=+iC9PT z9Bn>o15b<}z=eAh?Yc0)x;2C^o!WAM6C&agHd7RK5E)YT`0q>3hnz;m3Q$7ywdrG0 zD$Cm$mV{jODeMe<$Z$Af%QIXkyvunHYV)?~Ij_Btj35zJVU)h#VBns11Z5M}%@)uJ zkZHAesYKsVe(NZ0Q9AnK%24NJUU--BaLSlwP4`V(IxKyTQUge#VTF|dCoYd)1Bpc4 zm1y8ocH9=Rd*VXf&5x7ioMQF9{+|A`y zqP4lFl4NT-1@s3=qND^VPMr1;V41m2FPvG3pNCiu)vJtvX3!QFb3 zw=_J^{P+oYVZff`n&YwMU;6&XF-=RZ8+k=JT;$NI&R2Qb2Ty+BbB`!{o>3Bc@wm&t z4k{c-VY?S_f1X!M>s!sM+oO7Y#4ZJ;-gw*vZ+_|bI$d-jS)64*nhY*d)12aXvD)pz z&>hu5m?Yk~)9J+BYyMhioWL`8T+ z+Sa^~T>r&kdcNDS*P(IMzX?LsU{g&K&M(M?419TR!|@Jv_)pri=`{B6)4$c}j>mCF z;2(q9XTj|_Ry^Yey0Cy^E^ZZc%6hg;lQ`~n(avifxIrN>zOvrwbi10@x#FW+zX&m% z=$;egZIExzLGR)Ww*jUJoyKDrbZ0kCo_cDk;?H{>XI#Of_~4cS(oPrqLIs@xwv7H0 z(<&zlu97<;U3^kF_8Y)83{w!}+(eU4`moX6c}9q+ zb+#o*EYRdzmapQX=vz8|Zi!o@P)pPa=PJBydB$doGkcZ>(I~vC0~m|IKY7=o9_qtP zUZA`%I5wEZ!V-_vv>D2-m^=tPOgD|6u|!9n!_&Kb8a?HvGo=Fqp^A8}14v>TVJ#R$ z_GP*hs)v@?X(d}1+lIg4jh^cO*!buCo-Yi;mOfYj^E~YvVjGxn6%9R=|C1T4>f6;4 z`sR=YR>JF6O8vh+;5XSr^;6ixm21|etj)bjK!I~8E~*TTi=tkFo{ z?}t>eQQ&Iw(T=BTD7@1s40D@@QJNAEYHYYi0-fsOn4FpW0T_N`U5ewS!^2nTlS#CD z{>PbWl^Fzz!Yng3d*9FrtM4#s3{r?OQDU+ob{!uoV>9>IFViN5h2gjl`64exq!u?! zr9HAcprLAs!ojq!{_?iAeSwsiZr4c{a#jO)87_MD!`rvU2}Yqv1mD?w!EiKy+Qj>h zU%h(kP~4%{^yze}9T=N@xkTZmh~_Z8kXG2W;pK(s*8+uztGakG{=a~_kx5LQ#y!bY o;`~1VYu%y7CauRNFl~kZ1&Sx+N{gjQzyJUM07*qoM6N<$g3DFoaR2}S literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..be2421aaf18efd07a9667f6774effb4c68e6f46a GIT binary patch literal 2244 zcmchX<#W|{7sSu+LP*eDG&sAkUlIsz!9p(X1b26LcXxMpFYd0zrLMSJC2g@nTbe%4 ztNsI>o!K*U=FGl1J0HLK%{=&!01071NQ7X7z!D<~k|G%_IZ_}Legsllwp2)sH1MZI zI*SZLdRPWzL?&d0WkFVC17JjUjWj51W9An1so&DVU0Bm=2qPnV5yyusN8Ed6*AdfQ49u z#jqtg5~pCNaRz7cG3*@9;{q^ppq8@LI(h1j|X@NdxXb$f~T-&c#aqN0p5@J2|pw5u4ljCSNw*T zuvd7EH+T#C9q;fSf587I{_=%>h=06!^f3VwGJOye#d#JQ%n%B(N(N;Du^D#dQ z7z?rx3$sWFi?Wz`Q7mpO!ICV+(#B|(VGIMtvMk5)tYECjO03K(#;UBw>a1a`$y$tM z?GV;sU0YR;_2a`Eupt|<@o4j!uqm6dxv>RXvK3n!+psO$vAwYaJF*iyhp-E~2E1CHoX^8Va#CiYLf3et=Am9rgHG@9Pq<hB~wx*ktJ4$ zf{{oTq=ZVKt?}hk8AYqKtdvTsgo?|eR7^!xL{?aZR8R$E`IS$3l}8q-+{&d0S-5h_ zNwOTuE()@2YN-}#E^DTyYNE!nMrx=AsxPajx~ikvvRKtpP1TT9S2a~t6!qIRq3*J7>Z&g4EbF9>>Y(Jqt&uix}}@C5r4yN+|C`eo!rIU+(X;TecaCjw1d2^Yq~1CqRYCZi?RzkuXBp0 z)mfd!50qE4)X|)@)+$nPw*s9(N6OW&+=p1IiBYWJ(oSxQ$5jR*&{vF z1KpS1(_P)sZTXY9#K9L5^8)Q6+vdH*%k*F2)$qt`yiWUspYk*MTtd&8`{2v;m+Vjd zq4#>Hc!Isv8@-m7(>eD!zX;!CU-Bz{&2MPm@;iRd8?>9e#oJ8hEUio9QoB^nQaZm2 zbtzm(awc<)qbj)a=E}LUF5qI!m2uIov@2z?8xY8zu+ zEmzakFjw7Gb5&gxbCq2sSJ4eTjr>u!2DtvNUm(=q*Y&YccX*d}kN5e24{4A1m{0hW z-ZMVu3;y7B^4ht!obINDG_k2}iks{vIh*JvxbbcrQ~t=Gyr7>M7je>l;jjFSFB$ZT muldHy@-|{x@b7%b_iz5kqW=O&|Ki}A5C7=x|HnU0v%dkz!kLo* literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7cdc534afc4cf08b0221d17bf7237da79754098a GIT binary patch literal 3912 zcmV-O54Z4%P)007Vg0{{R3a>IAu0000mP)t-s?ie8E z|L&~+&EEg!&HvuC|IMub#nu1j#sAf$|HZxk)z$yroc6tx_Ot*100000vI+`l000it zNkl1WpB_gN+6hbac_#&@-Q4oO!`4MxWv8{i}La-RhBNFFLlcHIlmOSMOiFs;+7o zW6M^`CcDAE9~vkRpSi%>C-}x*!k3|xttw4pD>mkL0bffqYGf;J5jY-ZOys{I5LomI zz)#!l&k-;iOQTN&^s;9neGEhqKS8ULz-=cmYXhH9TTmQ;pX|#r1cISnbE`HGtw<^> z0fCM{_%Fcm(gROPxIGDM9-umEyb&NtxXC~E8K(|p>x=)yXNEhl1YAXj_f%1wiM-bD33up$tz_Mb?| z0&ZAcAUt^B6Zsl}8P00b-*WQ8nF%o5tOFswe|9FG#b6-W*f4W*=UUw&<71g4gg2UK>-(4I!vjcILjfu zxiOgnZWQoy1cZX^hX7hs)h1Pu3Xts z57k=)+Imlvls4HgQvtilmgCHs2aKL&S!ixA0EdMAYbedZ|11J7mp(RO%)tkZq8qDL`?4rqsj7vKHu$_t>HUI$6?Y^BYMX}L4K`(pZRUt;{DQco*O0Oz z2w=Z2%fuG0zDD2^rFQ_@E5#fL`yx^G{D=T2fwwF%BhgA*bCqzhZA&Bbg?0RcqZGb^ z0Qa{4-L;E@j7FQaP?G1lWnR^F4Q*OG<&fIbh*a(EoqQI7shpW zMMjcH*;Tsu(Ln4J8qS4n|+kBRMWq zPH5YjC79%g6$NexlvqEzPy)SAYzkemgJ6O&k+}xC0Tddz&LX*dZ`Wcz2(Elo#6S{q ziX>QP_!*O%)(HjYLC?t?jW`9I0SJ?8R051$Kl^1c6f?+_wYkU7T8V_MX4!kQhv3DxaQP}JW z14pzlmL={j)@ciPDk^;()yCf&qC?$~@0u}tc^qlRt)L1?AsxnhjwCc|N29$Z;yq(J zorK-!pXRirHroHVX3Sf>31)`;nZk+PI9YYhWE)Q8u18#`0*}jGt<$; zbfPk#7r_#iLsatg=c1Z0-cUXb%w))vhDy&C1lgOz$e%0v8OtJ6W3~Gx1HV zpU}zz1--HxA*h1UFNQ#mfK$TTxiu~9WxoUOupyR!m~)ow zr174MiEa_AN&#^j$1W>yMPao*30wz2x1HlQX@cD!zJ<>z`zv4-BufXRxN>$adOSEM z1$NQ)k7J>dX4aML3k@lwo5{9D{4L(Jn?iID`5iShk+blw3JfCdB<7+rfgQL)_}z}B z`Q;duUr9)>8HP<$aX=ZWO?0PPW0^ z%g9K(#Lxqd*jC?vxe3FB`Bm?|v50Huce?LWF-tAqG>w{pFk{0`Zg+MG5+oh>xM4uz zmBpLpKOwM#QiMBT;1fE6y4hsQksb-fJUMCs$%gM~WPUj%W#Dm=cTA^)xCxyKJW0Ma z;uMVbnAj0PRyM-X3CI#}%mbi^`Zo~rOAF>lqZ$@tcc!xB6RLe1nCDjU$FCgJoct*u z=L*w&40-Px?`dtru99k^1BOJ%6Xya!=}quPVEOpN`?qKr-&=cvhOOv1w#YRhIue#d_ryF^ac81&o$f zA4^AmC6j|%XqCa@jnLtdEF2;AF4r_IE|n@CNF(OVHQ?Dmm=TU$)Z-}_%pg@*VjxUS zZ{l_I*HbVkRR__W3|Po|ZrQOH6mVwk8(81h31AAD#TFT;0Wgt!cwVHQ1oH9rkT!AB z(Ri5sZ-7Bu1uCQMX0rqDG{9b6NQ6Z@AY{UTG%UP@I?W86ae(zW>|Wd};9Rapz)S*R7wPnW}>|v)qI_9j$DPY|L#ND-a_|i8K@Ic-70%`k?qzbFRoMC)N2d54jH3st4 zZr~f|J0%pYb#_vhJP?WvU%g30PqRc4-jTJyXyk3m_;UF+1pXN8 zIrRbWw3C#C3OLI(4i<5|!}*TqbswNUt16RdFhSwnk4Hr`yyr$=Jkp0MCOQQ|AiZ%S z;wsa0tdS7=TLcu{wdN!q^LP1z+9{A*1#u$B=d0wqffsb6hbjiz)h`E%l#j;_ASKxE1o|5=w4>wQyNun% z>;;OD$0Ve^94MANx-9q{&?bp~Aglc)=_t;ol*#1yF#zI^9JcCbBCo@rhsd_iXaAr( zKGILW7|Gzd=Fjls4fw&vh9B_$1NaBp&`RxFiC?WBlI%^e%8qvbh8DR$@OeapxcVk{)f7BGEF(UkhlUYE*VK zh#Jwe$vWC(Q6e$40{T}h(Y*q3v9(xV61TcDo% zCCeJdrH%c4f{z$=R!+1Z*X-bZ)MI1=5P97KiXS+a?Bxmjwf|KGmY7EdSXZV+3V?m# z*%mJVM%O7Su+n+JvKKg4zZ`m2$dc1oFR+YCi!zI4lVWCV3$}2lf$gdWf}q*t!-nzxAX#S`M(Ah!La(hz(lt19SQc}?EU7;fjV;4qw+5Rf@INzHksxx1^yQi W37sAV<>cM~0000*%1023f)#P|?i z=$m-$)jWbbWp#B`cUAXASGz%6>Xc9;WSv;3eQW1zw4N>;Ht#v0bL zPVDu+{Svo)0~^^ywQi=7CYr@cHb}$tmG9Eu7)3aE|j_ASYbp5|?QeTD&V@NRM|&~`e6P6BRoN4U#9y7KhyOYsA`d6?i4kHvmMPq)~;JaujF8D-CT@&6%{ vR8y7Hm-Nw(4DgCU20VF9pEt-G002k?0{{R3gZAU`0000mP)t-s0002R z|No2L_H)($YR&&*#s6Bg_DZDgL7eU}l;$am<|%X4AcNi@V$C30#VJa(skcN40008w zNklMN6{;~q+ zO!^7CC*?*xU@=3)u({PJ@b?Uz1Ij(Mz_IUVs71gxPZ;}#3B3>PETC$XBH+6x3wa$v zX8~(y?k#`Mr^SAB8=r^>|jLH5O{h1(C|p3;Gjip2CuOe?n|yIzr^Z(0eb!KPa=n`dzLSmVGm-SsCVpVcSL&xq$f)Nn7^zAKI*VkJ>W?T zg|aA5#fc35N0951t}R`A+p(~{Vc5B}2W8aiGWwrP#i?y6+-bVBb!FijuXn*hhwvEn zze60jzr}1dwA*Yx!_9$n{@*RpT^w!!EL|K?6h;GkF^4#e1`fZ}Xy7o87LJz>XDB0e z2h=Yx=oJVhX_D0MF)F%9^D5&aslqg0t81mpx^NeV<`oO|1XU;5fvWC86_vaa+3|EC z7}yu9roO5Ac57TxwM{7N7B~$qwYn*1CV}YQsK%<+i3)&_RkjwTT3bc#^bA)h2y{!m z8Suku6)+S_Q9!rmX4&B(4x@l3Dz9CHLQz2F$B`dUCcu#Enk^B9k1|nY1525JYHO5Q h2%K>npTPec_y?2488icX2^P zO^lDm7ypRKRsX;cHAaoWd!O_lka?M$e94(P=Xixz1SLuaT}e0)$)qp{4J{QXX-bN8 z6^eV^E(YVqBS^=~5Hd^^QbuKMCPT>*3}ZMW$S!51Dpp1$HVU60htcGMhdlCCk&>0~ z{em$RFqVLWag1kz3Md(m#0t?VVxnLYL5i7dD!-*`QYGxDKk~Bk{=w?DJNV( zh00dae%*||z!&?5+n`cqS%|IX>s3?}t+6RnmgzH*waj8Rb5xE6bfskIbD4*n&jJ=w zm-Nn5c}hmLMbxv{!4j6Ttopn1TWrv^oE5AjWfiMg(^f2$?6(d7KLa3`@>@@Py|Y4J zoBU=S>%(mL@hRd|A+Ngu5n&^n*ovfV=yNvd2K@tPfio$O*a zd&2B3_-K8}XwHtJ?PEU&EJT`yILINIIgIZJM^%B9U91IhjN_c(B+;0iTU?9Nia13Z zr#VCPtX)+{<2l+99h~O^7x7&pv#-fofvZjzmq~DiPDWqln%36WZAJg~y5I&kxy9`; zcjO=2y(MuMagX~v;31_A`cEt8mc%2v1dn;bQ=Wb9ZB&K75?OSoC7yfe;f2k#27IaX d@-i*)ir4+Wt8jnq{8!filx3S+Q?iyR{sJutMDG9q literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b2012c0a8acecbc8871f91a932659e6855bfe909 GIT binary patch literal 1089 zcmV-H1it%;P)002k?0{{R3gZAU`0000mP)t-s00030 z|Nq72|BKD`QmpPdgUujPq!1~4000000000000000000000000000000{9_OX000Bb zNklAR1%xPU$|&0(rWHrb551ClkqA&rW7$ z_0xI00}^@VZ5v%>>Y7Rq6s)|~B3)&w9}Wbrie!g_ zH&|+GB1=WO%2X%#2vmv$q(jy8V?CKw%N!#V2 zN9apsz8_dusR5f0Rpz@!o#zGbhQ5SQQtCSyJOiSil?t{bw zCCNMa#KgOHd7b9}fA{^n{{5H#$&k!?rt}%df;{-mgE53MI(!Ic`2*f&@S?+OKz1$g z4&ZH__gi^e-FlxQ3vU2lO>poIls9<6;N1b(TnoGd&Edl~UaDIiUIFGPFOg`+!Q}=o zfK%sS1?IFdcst4uXSS`?R}QZV31HifF&(_;;01B$$d^hHqEk631~_hm^@%cujuRTf95)5^tpO;!#%-l$hW>H7~Jcl;E8zuD1E|dC%L}Qv_ytyr7($6mR26 z@~)zJ_uQg%?%>@9ZyPVEab@|usCjW5uk*I?l47&WEbg0>Gor9}@;-?HL2K4`JzFNf zLxb_PTh`K&q~bS>qG|Bz2cV_WfRF^@gZ(ITUUP1#6a-D4{tctddCj?{QV^tgAX(>} z?$T^V(&rDgUUi03(QH1Xr_v zM?ZJAtZ)r9eljW}*y*tiyx9K=c)m6AQ>h(?Fi-Hp`uo8RuR8%{MZh z$B)nb)@6+Jo3yQ4QQo%Y@k6MVlQcVl{nzro?ECokzL)z>dy*^8E3nY7c!Bhu&M(41n6%Ypm z>**ha2k?^wpuhoi2n1SmXybssbAKI7tBusw8886glFuQI*)!2n94^d!o8y#ozQ=se zbI$W2MqxyWln>3veL6&dRvcsnDtI~wdZRX6U4iis(_o>Le+7;=B=#v%2OQu>4*i&r z^+QAo?&piTaSUBTWOIo3&%s{}GIod_t!3v4Tlz;`9Ds^a)T(D~hMjro5j2!e3T+xq zg;`qhOLchmvyrCEL8D|KLySJMGw<0^PGcm9iou6ifE#6wDyS%O zR8rZ?qKc|sk&>q%l}=Ujs_Nl2uX{s{P*W|n)d_XgQ(uEzxe06NP4SjS-qu(&@s6gN ziRM~psg<18+9a&4cSAevbyfaY;zPZBq_^m!uYUTA0R|dm zu*@Nb%1hX=@Uc$}HzIs$q|b~Bqm41v=NZNsZ$iRiqDdzELQFB$G+&CZOgFCuj}}{EX*$U*v)l^tla*FkEq=DfTITa7o9%Yk8FtxikG)}^{SG*o>rlcDJ0gB{)NhW7<4!o~ckzcmopM^vndDYF zb=JA?m%p8NAzXCHWmm#g*Iaia%T50z?3TFgj=S!O`yTk$L-C(S9(yA5sb`)iOvL{k Clbi4W literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9d4c57fcde4f0ee0034992ab5a5bc1439ee6bd31 GIT binary patch literal 5090 zcmV<86CLb{P)003YF0{{R3XbEJh0000mP)t-s00960 z|K|VytpERu|Nm0TF-D_<|$2%OBaEg)ZZoq*)Z?7Bg}sLX06LBFV8 z_7sxHcD_QtyiXy?4-h2f0ooFIfdDTsvFBXb)%^g4%dXD`j_!Z&x#ylMBngio&Er^j zi*DzP*)vV+a~Al%?>V!JX3ut=tIx$!+-$>e9>$@gE9y13xTSSI<+I^Z2tSKL&iL%2 zfd}D90)WxRS#;&LW{kCg$vN=+jb(h@(nj1F|32`;brP;#1;S&Ki}u`gTubl1x8@Zntk*Hun*t$E>leoSRlx8F7D|Y^SfH#9y&V+x0xY z(7V5LCT@~sah|N0>3ZYV2f%e+W$Slc;5AxuyU#3xxjuI}v#wOF+toT9)w*6Lq4VZ8 zPd1)6orfN`#@d-V3KB$!KYl;*`MC4XBj5Ey{qAg z%Xw1f+aHQ5M@SpSgV332-S#y_nB}p*Fl^7d_y8EC$(A$iMGe?cO@{$+p&Q7%Hq^Cl ztMS}lS5>)tQxRb18w`Mxo}nSBQCcQp5H3diUw~N>`HnN`JOUz#Y-;mq7l&=*yVGek zejnXd`$Kk9?5ixea^wUyeN?~5pS5IDIWmO^bs=*hTPYH4O!EAy4Ft~mUR6XxM}I8u9Ldv2WI%()1X8t|!#2#Biad%o{H0=5;ccLi40 z&$ipD+W98kACGyqKkh34ZokuvEA`UmT*PUf^e_p{ejDaNQ7eJJOMW3 z$2OsI^#{<&Nb%?O;bP} zNX!@jK)!VUR^~}{e0aFO3mrD@PX-MAi6eTxU?X&*?Q&;;wrMm+NLI3SDQTYLXkGcd zRwohPR&gOAIRiAqC+vqji}nCKWE)O^hG{Whgg8sY_4&&7xaSxX9i_btVkiPop&;DS zJFRouh1x|T%A%YAbw%lFgLRI^IG%nhW4ubcgoYVxju?>cP&W63qs=J%XGDX#L}{+xwx5JO`bU1jG(RE;*B~B7cG=@S~gRc&N(v7UBYy=RiFZbVlrl z&Q;&`aFhYs>#OJHn$9Z%k;b04nq9P2=HkF1=$WOGp?5p&K1bU`H~S;{VrzT8XA807 zZUj7t(^hPzmoA2)(i@oUkH2%HJQFKmU=oFpRYf)NOSBoe2>>k!-q|&cxkwbymvYBF z*RfGu4{uD9qRc`}lfKIr9YqCT=Th9{N&L=^(gOc`3k}Uct@ri|kUo{lEy_2uePncw zmq0J`FxjqpoKG>ERMV27%6aBHcow<O zT>u7jO{i5K^0DoVWx1^y<7dkpRrT32CE>|J$IyokI%F!$B0gIF9lypPJTHt0k+$t54PteGvk%r~y4=V)B{ZU!qeG0}2=ZRULVO zi1Jtz0LwCO>nSfII##?`CI#d>C*5MMWxY-!LH!88 zcsg>!H30^Bjsf*f@9Et>1M4TRFfp<)Dl`7Is_8Ugy2@pgm$=S5%#-~AA+AgYSzyRm z3_V33A&Ehh39=9vIRM;PL!ctO0W)G;d&T|)VOQj5eZ~=CiAfhn zH6T#@0M@29H9ns(!vus>q=D8t(%HDv?%u7zIH}654BA z3yM5ONnR7XgugP=syOU_jRblQF}!HLWZadY^9gtotS+FwO7Gf@ZcoRCtQZ3 zK&yC=!ot9FA);kkmT*psZva;v?qZRPbsW8W(Rj{mS3)Q$r8E3Wy=Wt2Zd9D^4+ped zO!Ej`E7oA_DgfhQU!iJtkeB3m|Na{8;sJFB`*xw{U?}xX8#yeBkQDR3Rn*kv;65}0 zv$D)^$dV2hWzeQ&l4f!2yB_DkZIOY5-+fb54-a^4QkCU9$7t0vPAcy50_vE=|J&{; zeNaLqM7IQhd7kDdMnHZoM8SZIY(nS|tBAwtJjDn*lzE2v_}>4^U9W#Z{mOiogM03OeE>xA{WwLHLtWh1n4vT4%E{DFi2Vi>xTT*UgDjmJXyC^`%Ad5F%Umbsa{Dv25_nhBlvi_KT6Mr z*hy%4p}(DuFv1l~YEGIO(abx7YNQ|fBVtnq3E(!A*1zYwv?{Z$Ag##@a?cgsEuCEl zp-3|<2b9(O;|YKj5d|Tl$?FKIbFD{14Rf31d@|7FFH`tY^dJlB=|%Az_NNC4PB3|_ z=4}Cgd4e(^!VJudLr@RRfZRZ;R@27_o1cjUqBXwwvMAB?<@>o0goFU`LIA#k1fUFr zSW!|Rj)$^Dl{0EHys~&Wg1w;8=Fg8=d_MP~IhOYMEe>>mq=ll6sVp8NL_}0n#EAAn zOJNf2>Bu7d>yyQQrh3@=bO1m#F!r(PrYX&DO8UdYL#=i>osy0!J=_y3GwNG7GOQuT zdkPr%-;t%Qj|t;7);_~{08t@lFf}EG05+T+?jbmb0~)5zJ4OHweju@;y5fka!m+Ap z6aKZ;RFqniIITUO-sC7`xf7JJ`b_XC`+K~9kK&M;q*;~{AkIM@k=F)|_+93t7%Tlk zR>|j|^;u6>wexjEn_ejBy$C0zy_EbKPEPXlbY|&rBuOjFI*Dss0wt)9zvl7xSWSk5 zPPf@Nbp?xo0xiddL`{+uU5)lch*iy(D#e2enM(Jx(;S+EcZ6dTt`KpR{-4m>sn0JUtZ^{hvR3yDHJSlmgm5f?Q8 zodPkE^QV)?o*TNJi!p@4OSDeYDYC~o$!2E+*doPiW1{cDlLXw0~ut)47eO}pl+sk>@O$a@mK*YTa;yhN}u1U)7Ujp`Sxb8(8KN;aYmTr(@I2 zz`4}|UPcPXjRxJ);0~K(&_EiJ741dQlLDcr;PJzK30Bbs{F=pYITra^R7fLl0Ep3tDG6yOkp_L^)xhDfo=jJ- zuu+mru9r-RyhOJVv0l;~#mr8842d_Q80bQkl4)^oU342*2MFxhNK zH!DrscQC<0@+9!4T3;G>)UHp7ipBed$=%@X#Wm5mRtx}QD-7A|S}AG#)WVQ%S61H! z_cVQYjom%;B2o#y(1%QdH~y5n>!fzPN$phQ?TpBm?;jpYx<@LatuyU$XJ{Cv%>vga zA>BedXPW64lMComKo{K8yp+1F#xv8c?FjUf)CrFtLB4&7h{$@z7zNxMagTwku8Z!) zW`q6?QDu|q8n$Yb5r{vdZdHA&>TJGFNc(A{j8KR`qhP?}H>6+~=NorvJN(suRGB?7+M#f>AKu8oLg}9%JStH_RP^#9UegKBh)WA*~Cyp5}PO*bCyMMpf#I@EPMl%23Ck}U5gM3 zKSw9LhwJ~oH%Ck6<)dymPN7HFTX3o^km>5IcGi4+xbwI)UW zY3?&;+G?C*vG?mwrKa*cLFIR3a<*?fa?fBG!iL^68ME;s&bYBIPEcNwyA5+36y+Zb zv4h#iyB~GsY=AB7nKqik5@0GUy7L?GfkVRdYt$rZGw$gwDQo?x5di2577{hah@aBoc5GrCEq*eR_MkXL3x zj-+~TJ!i{^BvtsECH5fcV;*%#eek5Vpv!PccZWXaQGdFpei3AKGkqi6v^sqhpiXC2 z`f$JdYPah9^K^gzQGnxmR~pW5U|#OLuheggj|8Mos^mUM3;SBgxJ)d z_1OFteBb#q>s#2Xj{}7HeKz8Bqo(|6H3|ZV?8o5!Kip$%YvPRYR{#J207*qoM6N<$ Ef~(lKssI20 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..02a43683a67dcfbd4f907d696bd64d30a05bcf67 GIT binary patch literal 924 zcmWO41w)kw0EOZ65sJxG!Pf6R0%D6D7?@zAf*sg}iVAjIuw&D8cXv;hx->Rj>N<3t z#!@%ke15|diN;C+F~kyw;weXY5>N#yQi;l_3ROuYf~rxS8YH1)YEp~Z#MPlL^`hzZ zQ3Dzh0y2$AAr+<3m~@(;rZl5DEl^8Z(V7g@hPJe$J&_J{EC@T%8Fis6nRG+l=|NAj zP%nDZhrXyE{mCW=4PYRH7>tH6l$_LI1i1`n1S1tHk9e^ zD$~$(W-yakL}oKb;aujSLgur8g{X){EM^HRri7&|L(5sgN>-uOtYIzdP?S>2SdTWa zkxgtyTiD7rwxbDlf`*?|$c?G@7YrM{W zA_q8F5FX+U^d^Tn!dvKV-r-%|L+^8xV|;)<}dr>iDw9Y<9Ghx&#V;v#owIe9QucUInM?3 z-^B=lW2{)mIo{<=d1r(PuHcGtC0BM8SH+16Bd+G^at$Xr*)`=_uI)OmE7x;Zs}HXYiGEP+sf_S-W}Xg?&Qwy;;wS0yScl2#JH!k z+)H6^xsUt0pZg~`+c^rd(+0=`J;;MSL>}s4&h>D4ghx8h`SK`__85y&C@+Yp6OYh?K$#X&vT*Y%L}~FMP4K?_7WGnL|*D;UhWn0O0V*2uaVb! Zoue+5%e>wjyiwld&EDdz@-}a`{s$53-NXO@ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6438ea6dcab9af1cc163d9603d2b26d928ad187f GIT binary patch literal 3338 zcmV+l4fXPgP)005u_0{{R3dEt5<0000mP)t-s00030 z|Nrjx=FRT3)$YB;=CsA;tgPOYz22mx)r*|XgM-Cti^X$$y<%dtK|!n_X8iD7000b? zNkl)}aC0%A9x-a&I>vlE+-yHkJAA3$X|@zMX;X2Kt;1D4O78r}S4*k`dKku^)lVE^|UZpqI1D@tzV z;C_|yQT<*U#OoR@MWYzY4=UGtu!<1q#1~!2YR3?rBU$Zw7t_8?*uQTP93QDXoY$sX9bq0GTDai0>k@*Hf#8PtHeH>~!HGkNEoo zdX@}1uHV%u`;yvIeUWuv#5Q2@K_XdAiBf65s;|vAU~Qtyk~B~zLBqlwERTR ztc^cc2b-N=QhHRN6RF+<9{%nbp&DXg5fstn`FoY{rPnDsvY@&>?!mKoBZ@?OrKmT>hnpt0LbpDQ7H z>TU*&rR>B}Oo#T$fj>Hq7^COJ>j|l^a!$!kwjA3axdbLT5>YN>cqU>^0VrHFnRFU6nBJEN!{0 zK>Tah-)-13!;HSM=XfySsr2P<{Mm3VnK$ z^D`Sc>MS?B20bVLwAv_ZGNjuP{&O3`i019_@}v@P3*q~l32)q=&F7CF-Q2_|GlW)^ zaEX*I%j?DbVZ0>KLY6*wJU{)kU4bffgrjxmcKh-t<^|~MQf8#W1>J?M*44-V3ynx& zLc)gPLIGzAL*^!kt5FFcEM~2@W+%txE8_bh^%T19a1m|mY`CO6&21vDJh0vopTr?I z$`ZouarwXYYw^uzCk)@Nycj zr(6v`bmOABbk0YVXY~UNHV%|Je$oRKSdTiW!@A3T6HTJqo+1L!19B3V`&{;EZ zJl}O)@5fOTc)o|jb;;2{nu}NmAw>kNyVW`in!fM)K4o-#$&HZap%e*G5HY@T3f<|O zAYu&kAIT1K!9gaUsXZ>k7d}cuiib4Uo^bB6hM5Lp38b6=>JFNkA97>I7r1^6Heq9J z1J)I?0!q3P&GL5rv+%7ZEG%5_ITNmjF0B;cO2R@$tOr*FAkZnKFs(7qcM98rVXtA< zJn1Ej2%#m<(@MkP2!qc|I~ud$_8k1;t7}U3e|^C!fq_^RKFewO6c_b*yk3K7Q`~txAZ? zX_$AShRNfa8!A=eMxrp^Zn@#${V9)>+`KlSDYY!xm0`;T1ElEj_~MvofC8TDq`m&_ zYbe0=s)Y5cA{~3eNH}3sP0($7N>|K5);?YPBo{k7A zr|9rJqax|Ct;6}6cy9 zOnuV+%vfmU7lW`JR^H$3V5@vLXJ1QRk=o|%JXEYg5gmJ5STm!Ss|<^0S=$bVSqqV2 zhA4W6%|f%jRxCwiEfq)uIwGqe$gpbCLY@rfl_1t0=}-BXx?QYB7Ar07Of}{0goOlE zaiPdB)v$wLX)~SFo=s{Cfo)qhEay#&Kbx?i!{<)84a)2{#>38bgbr_F=zV?6#=Iqj z=~WErpH~UnmeAUwG_zY!13kiC6FaPEMz`+W(rZdz#1>Sjg@#sx|Ju4G`kmcZ(2~5! zdOR-{Lq1On=;gjvW>nICbu}IE5-hQz94B|m)t|dX1tVp2q{W)8TkZ$pCAyX<#rk&i zVaa>f9vX3z8cynV0-IYZ@ixy4(}Jz8*!(Ryf_|yAq9EuO$YiI#)E~$qgqM4#I4uTxintM&Q!b(QL%bDf7nSYFstaX ztcs_yhm%pG7z6t()@k;p)s9q+q9F2#5%#~RTn@7@RS^uZ-p_a99Ce3Fdhdcx<;vjK zR8S;E^0r(WX(PQy$6;)5D4gnBX_6R4SIc$A+bk5V7s(n$!jj5PNyN0+Y>lHI)d|t6 zl>U~bGnR5}9p+?qCsT1`3kjFZ1IrFRH7GPyuC9K$bZcoDl)d9+i#AH`&*rBmAFs?= z+dDReTl*DN7$4#%B3NGLQW=O?%b7v%6ioy86(p?Sz2Q)%# UkCcX0{Qv*}07*qoM6N<$g6zO?&Hw-a literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..37874dd0bfe49071e27547deb84976adcb9b6a3f GIT binary patch literal 544 zcmWmCX;(~f9KiA4zcJNVGSndJcW#rVEL|D9y4EC7wq(5_WF1R(`ZJd7QX=bQ-y-`? z*?Zs|FQIe1f&0u;;|+Wte9qUaU1BO66^e_&<@j{O-3B+Y#0l|uXiGbxJsn7(qk)(7 zPIM+SQAol^7rF}FNTxeIgr4-GH+^CNKZaFgNFap(sq_{4(VqdN3F!=E5QBvwWMDEh zflP*3;ZX3mB5WrH8P14|V(tFpC`T1|Ml#CrMcgu)F^pv#l0`Nayeg;2^$ zR6Y^7!Tsn*RkoD*s}&jsp)i(KL| zSG1+Ba*YV}!gX$NlUs0G|GmRq?g{sKz(X2ZZ8NHt_lU#cSaW lZ+XXi;R7G}L{l`|%xAvvRrtnte(*Dk79ISrAAO=+{s92=kXrx% literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..34bc5ecc82c5b04ec87dc19e29378e7edaf68350 GIT binary patch literal 1839 zcmV+~2hjM5P)003A70{{R3fFR*&0000mP)t-s0RI60 zN=oh+7~Vlaq$w$+5D;o0AZiE*K@boi7~Wz*-WU*r002QC2nYxO00000P7%1s000KM zNkl1&v5WZJXlozlKJ%CNWKp+gtY@!VAks zMZtOP0jG$IfII*`>;QhF00+u)Fa&lJ6>!K>+vV9}{_;&1P|@bRDi}L9z^pjQbH)m; zsgeH%Nh+`Zo`H1$!R1GG4i4p}m}@}}7@MHblYlgloRV2v`;h=PY_MyBrh!VpX^cxN(X^`>JuJBo1h$2Q zAfdG@I_uUcJ{kAkkU-}i54o(Sp`;Jk1d;`YTrOs_`702`MLs(B0m(IB(=@G6fKaF; zpXPyL50GzI5tgT?1XP`|?|eYd(=7$)-qT7#OFVYCniK@|YfuApl$RW(K6r+JPX^?d ziKi`#@n)T|F#&#c=boyCBwm-xsJR7Jjrr1ZO&e(pbRp5$@qnIOl~e%mcqT;9>w6PEV#LTBR6LEd&x=)daPNQfrJ> zdqn`8g{%!CwFNHHP!XY(i?7PZ=Yi-C#&&%F}K<5p@L=gWinRv{C^^ z+SE>EG!dslk>auD;w{q6{xJ=4M)ZG|ezE-8)xeEWPu}Rs% zK>_U*Zvnrc>VHnb-o%zwZjN&cRl?J<>9#x>)p8-G`QEOHB%GMDpoFh=*s!cla(DWM zQ@v_x8W8I+t=%mXhFNRXAoz6bLBXj*c|l{8%X98a$GbiG&<&kCi|RzX2_(Uy zf#?9z=e#mU`P*9u6YsF9+60_n4K24h_MmB=GYIyC!zZe&%NkOMc{^Tqcd2X8LF_P_ zDdvo#ZCQCoV^);s-u!g!ZO(G zcmp$Rw+4{2c36U{D-KZa&f{-Qk)V?Vz$(oB33Y38vk!C813Wy4>Ycr+N&8-^`y$E* zF6i9Bwnn@T@a%Bk1H3A$f$fxe7k_t=kRo8X|2UkchO9(}D~DpcZ}H^2p#rRi``z*` z8f3DXC?ZtD{)V|aa$FzSYmAg)ckE$pxPb`?R{^z;{oGCz^n`tlI?=?g% zkHNHQz~Rp0ReL2OdP!;?Al=5R@lhSQ7Vj4JUkK;2*xSCl8V(tvD{wC!8O?Ps048^( z7+*on00KKbsz2f;Q#*SH>X{C=uSG+^&w{r*qeM%_UAx-Pz~!47grsMuZ{FYGQ7+rd z`Z^s{R>xhxdwu3r_iUr@9jc;$$e>ptwH1zU-p@-@59xz^RBKhs#{R|-K=Wd_-P`CT z5jT5a{X8$Z1q9x`ylgBn^PqQ){N#nUBiM`wCVmn<)LDuI9#u{k>j? zBhu^lckG~SBeDl0*XIQN669=8k-Qtg-S^=VfVjgC)GsM*-Zcf;^Y$))13<&Z8@?ix z>)2+`UT+CB`~7_uLIzNNlbW32=jdIB45c1HW97a#_5m*X1oVX{`izDcbj--&II2!e#FUL@X z`f)7BaXdPK{+!53XaFZOkU{7a1~Y_HQJi9iG7Ob)8mDsxI+NjyU?dvFXwKqnRLVJ= z%NTSXV>zF3=mIWeJQtyhnZPAniZ0`FCUOP3lB>9yN$47`dg07jy?d|bUsWUyEdxr||Y{_dXEi6mK5~kD4P}yB!?&cmjej-0%e1GY^%w!g` z)0o3t1ko&lw2gHLsL?u;X5fAeSi$#@J=`CTYSjM9~#&YpE zPf*R11+0*Hil-H<@fE4z8CFs&o~4de)Qbk5<9S{Xt7-7+y*1)R*07eBD&)LOqr#26 z(kA1E)++Z^nv|csj`eJi*@&8H;Wb`IZ}289UbE-E#oIFP(2CyWJ>KU7oDcbkj}>i| z<8GoY9{Pk&(Py;N!Diy0EB_0=WV5FZZwp)a3TG={^Nm8CiWGOr`IhhaUZ&O!cVT{z z`H^j6J3q05pWzn;cCw3KA)&x;>}HQI=Xdt9k8WSlKlqcs*k7ycZpHq8fWK4uhkq52 uHL^)IV3VzrYEx`5Zc=S%mcnT^Y003|V0{{R3Yu{!u0000mP)t-s?ie6* zbBkJ9YD!9CK|xYEIZ81xIVmYIARs9i7$6W37ytkO000000000000000x`bfr000Lv zNkl~;|i@Ul&1<+99bq6Px;RJ3C9Q_FU?G24ew)nsibRZ1GqcIEXmKx=Kg`)pGz7veUVVLQYmCLx+;FjtsA6Z+IB~P;tepntZG$HREsb`8LS=dJsxd5iJ>KO?*9Gxf zlE1u?87+BeB)19$KNqxOQIw=mSey=mR}`MFP(WrZX*vc*?n$VnOC!NY)=KJ&Ee~nm z=^3Y9E2+GaHpB;9BZYQS2$d_y#`P$7u%sQE$t9&Hxu1xp5@S|_C2^CIB0;T7q}zGc z?Z~wkWg7QCVEo3Rr(pshkz$Hi%*jRKu$?j}cRGbsOXg|wb!6r!dR?UEHCdcoNn3s8 zc~I%Xp|t>n`p7JG(|k7#12(4cBqTuvl#)jk#--{aX~Ze~QUV2U;>4oVb!*#J35AMa z1O%oru0fY3-V?(jr(W}-Y?`j?EYEC=XAzFN3Q$#j!vd@deJN|(IrobhTLZaB9R`Iu zTvHc?ZbAcm-B{ZMcu{TMgx64%!-7a86jUY4@(;Gw_H8%`s-)N0Qsch{x zRoAyAltyO^(=@owTJkv>J4=u>2e9-R23n*uwE|$tU!KKUH@cp_Nz1yvR{}Rq(@6fl zr@0u?6`H}Y;uZLTK!VPvA9#W;Mwc$%10@9em|F3W~W|D>achav0n8NN(#i zeWMEL?+t_viUqVt#f8tXCYDvw<>~aBtN$C-ND28hyp`$?`3ni)267$G2QZwtd1|(>l!}5eL3LU35N$}rs$?v7ch0x zbCZ9NXfGo<%~9UTXH8v_tV1t6yfXSy)%!pCYC1GA;Q8P2%}0`Z+@W_&^UIdarR(G6~$aN(xkjkqlc|K4W8A@V9-7=h8H zjd#6t;@1prUH2A3{>?Gf@MqRVW>7yOfLm|zkUyPU&an7BR_*+UXS?uHg@4phks6Z+xqC(2l_5{389r{Zydw*ZrOw|zR*y6 zp704{!n-rNc@VSnHoM5JE`BTWR>Hci-x^Q|Wd6v*$tX?yId489W_aIG-U%5w~^q&~z|3~Np tUSBbOH(OPA1C~|VD($OqF5^dpzX4$X4qi_)BXIx#002ovPDHLkV1gJw!u_%Bz6oeH*VZ;Ln(o%|`C3CO71j;i(E~kUY3POC=mYDEe&~+@uz?ta!59J?ieX5{aM%cp z#3+o0jlo!q!+7{6AOjOEHXSwzlQ9LEuq;f)G)#xhz)Z}-Yy{?DF5>55K5PLNVi6X@ zmS8ECVL5CCR$>)aBd`W*t=l@Rhi$+{Y{F*P7Hq{fY=`Z@PVB;N*dFY~KJ14bz(E|s zVb~EI#W5U*oxn+)!fDtUoW(huN8kc3TFNC{M)(z6#WhO}c&{2>!|QkhZyMgh+js}> z8s5YE_y8XouHy!7;ui3cdAD%~cMbP&9}n=*@Cc9bF+MSTiqG&l{sR20=B#wg}xKIS(@GlsD&V2ooy7GhyzJVCOE zu_#5yV#eZ3Ur$5GEUi2%7%Q?8E3-Y2E9(S&g{aj z?8dy^*~2#W#Qk&x(`-a9_GTYiU-n~v4xl%XgE*K&>}u8%ZzzW`ox}Yc!I8n_Q5>CR z-WZPMIF66t1ipBw_lKVU@4WOsrFiyo|467W=y@5O$n2P8pQvt=AVic|X%4f=}DCAM3DWKfSrJOO!p@c|;Ws~0&p>T!CX9!h@Jk>JQ zR1H;EHB(hpQDs#!Ra6C)M>$hjl~JNfn@XvqN+`ipT*c%hzlx%WCGiD?6tBYQqRysH z>ZlHCZ)&HuYJ=9MR%)phYHmtZGc{F{EL-1Ljnq&LO!ZYybydfdqM(vh+mxh<%FqPU zc#YFojWLbZD2>zz({QC@n1-5$Xs`xpplN{mtDpLs`lz>hDb3VVJ=9&@OkK5FtF+Rz zLd&&GOHE6(Sc|kUL<=-u^Q>;VVXo$Awq}`TYKEq3nrW)Cl&L9xP1YpDpVCRw2_4rl z9W@=%VI9&z(*f<*KJ7K_(QfV1PSXx;*EVf6ZP8|J(#8;M(0Z-2t!qtda8oyQ-L#a; zxST7DE4hlRxyHDb>$sj9t`vJ56LC#fbwz>8x@1WgbwPGs=X6$QWT*9|zR*V6CT`{y zZl!JGcJAO#+Ai+q7VV+!bAA^R;ldf_Vh8)og}M;uIrF>c`pw%}#Z@*}$yIa} zT=_W`U(S^^SH>k8OS{4>;SyYNSInGqaz$N{5Jv|WZ*hgp6?Ac~fNN#0rEB4u zyHs<{TvOM?HO@lcMy{c2;Od*J=jyVKOMwg8#AH|7C7G+`YPuS(y3bW}Rb6aae`oz% zU)RU=cCC6@?lf#qM^Bp^*2BHccl;^u`qu~E9AM!eH@Mgk9o8ZQ~ac-006)Q0{{R3aTRq$0000mP)t-s?ie8d z_V)ko?*HcI|K8^R-roP!-v7h4|BQ(T1U`^)hZy)k!1-U+i7;@x-Fe)4cLxJ` z&%+hz-xEOkZ?na5M8@IdrxIqfJK6y_V5eLB zg>8`m)+S_tA@8(b9}fbw^2<_>j##3Bo7-!^13k~Y{hM+V`vmH0!w4QV1o!YPk+PDd6Tl0A{RxGhr2XG7${C6X4zf z|Jwsp8Sl-DC94=~c*nU8fSl-qxgp?Uv6y!YK~I*fqW3*&|9+-`QF3>{)dFSyecdg* zsHh62S!sAMsne!$Km!)#Den9o_S|*dw4HR_%koR!6C0y6F6ASEY z`akToDH?dv(aJ#>s`#*9lXfToyj|}0>zIgE->&T#uQ&FG{lI?2Uulm$-Q6w$*tYeU znC8vPZQyl~pjMW0*uR-=?9#gg3U_!5(R}bKzW@1dJ_Gfd+5;E6y-eehpg&s5ZvXnl za{Ej55*>(31dJB68ma$$^{)C8m|KgOTibc3eZ$K12TaWqt04jBf%9y4miRBy@cs8M z+6ZVf63jP^Y&U~Py2Zw&=G!$gx|Y6%cGix~dT~#6*x}t`iWV1jU7(oMX>E4ed8a*L zpdL@WHq%J8O;w^6i}{R_8fsuUrgQcN6AeIBA9C`v)4gTWM#Gx?WG0W=@SJz1BeC-l zc%q63;2mRNH5!&coZuMXGGeF9`j4S*pr4KF2Yx%S$(%P4wpGBQDD8jN_Lh*4OJJCd zb8z^Oc=PdWxx-+;yGMInw7W!GS(F=pLXX>yrgCn1^ ze$q~m8@AO_Sm>!u9RSH{!NJHHN)!}}kk6Kj`loxDUpqx)Nl}ZfWodt}CsS5{GQeTC zw-f#2OM|>IG;vPQbw7Yx<8*9StN9eVM$$l#R<(9ITPPwq_WExx3@8V>4$!S|e3uv~ z)|ah*z^ls0Pymiym~x!a!qbcmjb)7kj8;R(JL|~E>n8E2@obFI*)-H*SJR2%!E``y z)8!KLA$Y#kzsdt^mr+nS8?6>I0xGYbG&iDkBx00*S}0EK}r zr+A~dIVd;~AUzbS40;WR0_@o2?3Bh9_W|J}_&LM`%Sy30N1aYwP|Z7MK++-32KB*4 z2+&5JcppYz2XRenIRLXxf}BA>G}MJ}gGAJ=8B6Fp56A$OFmM!&iDZbWAw%^O zgJs;N*+cSrJ0`&7WjCo-n!?0n=uG-219s@l={TUCL2V#j$ zMCbk)VB%V8yy9`3xEjPII0wwdxYkj9gZ>qNKGcqAGAa#wln%!>_l+gyfCEnGX*We5 z^eNylc_Q)0M9-TGNH37WD(_F}5CiH9*5zj89v-SDLs}|^!E-Tjq+x!OZ<01iqA1dk z@f~@XE3-}5Cb3Ha(^ZWo+iV#BBWT&f6X+V}#rX==**Gxq(S z0y_)j%x`G($43NIFV9%VCSSnD1LA)j4$LK#Pl#VYp-e?~zT)XuH#{;upC5sWJ0sL_ zs;b6Ra;0nxL;>h(p^l*PrhAf-38yqCEkEymidaQ(xY+SdOR_ z3O1GLN+pgR1v5qF2gQH9eC}lar+k)_lmdC+%|!*141{%oiQ9M1J1WxJq;51Ss5}qU z8@GWppybDLJfY*Ng+6I0lvYMXljePB6L||noRgN9I=2}KfJ$3VNY>teq`bEM)>@4X zVKO>7tWY*bKvyr^oXrzH{t3NM6=1P5>DN3tb2z%>)Ic4E%ne}2Zlt*5gHhcQdnc_c9kPuLL%@k zG`wXBL}r->f#!HC8Y@H%a$7Ac)TD$+#PVPQ(!dPd7eiUH{G2-_btF-E6!S=C1d{ z)qc3r57+qN<3E6Z0Dlh-F3LX{FZJ zM#f`xYVYeX3=X(l)>Qbpuff~_Hv;L3UMIIkbk)LV2|ALSO07%0AlpZ0R&xU4vJV%{ z7F<92qNSbIar)O$4M_cp2Z8Rg=h|Ix4#ZvTiGV@P06#je38BdtP-8sCM?P4>G(*+r+k6AasPP>ku1ipyIWySJ7R3jrQ(_uN6%6%OG3y z@fsO#?fuqdnmcPM1&B#NJ|C)kDoVjdLSov6Lnm{WyiXBT8p=)6Hh1dfhgI)8pkek5 z7TSy(bzU4B_H1CS&z-z?#`j?LKv-a%1Ijr}1dK^aKfkf|cUoEi`rgVI*z@|kR=_$2 z>hq}Z?CyyhrnNUC0BW}=)D-u=n|IChfwY?ybO;3;w=#Kc)5i;@Hvl@rOpjsi?u9(j z`iJO2Xr$AeVR;siZqiMro`)m!TY&DMMl5W#I8&=p7TDt*eDb4I{J(&bT(ydgI15%j zm0m8c0(G{|zDuCn1eKna02pw5ZjBDRyt_KhS&vZMCn$nEstZiXub4yy$ z8k^9DwzQ*tva~L0bf6=hFgnwPu5=?sy3>Q6^g?>mhrYxh{pimC1|owP%n*iR9>#D+ z*uqC5c48UDXe?tGD+%Kmk7WWAC210qkts}N8q+amFq2u#7Q>jsT;?&~Hc}R_kT@10 zivr@P7T}32W(iAKhQyP=auSghtYj6dku|Jk9qWnQV0dq2lPzg8#um1+jqPH{4tBDO z-N+vHvXA}90S+oJ;)_DWn>a TTY~*HKm*k)j|Mry(}2i-F5t-B literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2b2ae414b609cb09d8c8fc5152f3f767894847d5 GIT binary patch literal 3739 zcmV;M4rK9(P)004Ld0{{R3hm7Q00000mP)t-s{{R30 zDPjOAS^ywY03b>L7)k&bK>!#z01!C<5HSDDq?KcQ?`vENCY_0|4q&?cW+u2)7KSJ zAmMHg?ZlSA>7}zN|D4Otwje<+JG&Dj!L2im5!^bnj*<3x-uIP|0Nd%#KAGa$pr4-i z`TroF4@5=L^`T|z14C0?Qk{^BJVPV_L@rik{NWn|yF<$w3=I9Z0txSRfXXDTI!iqp zC{6)eZs0WRN?=u;1cD7M6M)+ENiPOc8Uky&bOBKRpMY{rFAI4$P;CLwA{u%QjDDD+ zIUGmC)}RSMaT+*b!I^;~Pw@n?Ybg=}Yj93Y5c27nvX@Y2N~?F#&3$!vr+*pfwZN#&<>)TSHWe2+w31SRZr^%qqAHfX#_W^<5UQV$bSV zB#c><&THJXKJWr3GD;j;hB5&}&pYQqAY441o`MXPG8#gW zcmSd`Jp*O)MX!;BR))08EFrcMLdsD!*D2NBB54z(Zy|RuvHnjh%}V(dHk9qs1ye#r#@XdEATScBVbmiNz+&5W3J#)Upp+S( z6ZA^JU_i<)0Hc#Y0sjd$uw^@0slgO23Hb~Krrki0On!?3F-S*0@X>K3I5Zl2GdoO%qhC%+#+bi7Ej1n?4cm`!erU%?l)M0bq|B(ZwMphXSGL=ArV+ zzQWZ&AQmC5HBzQu$}SXr6=g|=damxJ^RnQxbBD@yrc@#QFi|5Vro1+FBaRDsPYXq) zrnb+h`}00;wMd9{g)|3@CY)^f89>ehl`GKr5RZE2a;=iLf#a&3{EirokBh98H~HlmKvxeHl29VWqv5EkRvf3; z5ig=$lcgNQf{=Ff-gt&Z;czQ1vL>yhmd6HgYnlSpA$CZH zoaB;42GsJg89-1fBf^aB07Xdzpj?#-no?}I3_*eChsoL)IQEdcS7l@`5H&2S<-(v- zYUEu&V$M-RxEz?tWyEUNw1IHMBm{l4*g7d$y4K8%BWa&<`jskkl$KrQW&ra-RUbGS z0x=1bxKgbXpepT60!PXi7@h`hXC$FDK;WKD+!hjIO>4g>S=xah=N({)jbD8m*w5N0 zp7Z;i(vmDm0JKoUgspU1DC+H#W2=+PWzu0gYK~Z|@2fU2=K*5rgV&6z0C4CdH&=C4 zrootS&My>OJ*{mixx}_}eBz^H^ts9$WE`xH;V3?OoWY#9ibwEw*l6|y7caU(26of1N89GT37|*UXu3pp`jZd4X1!FzYKYRSYWru1tXCulwmU* z4D3QsX-a!u#qVgjT@_+ik$5_~Ea1z!+QvS<>0=!}#ZzE>8!JxR*(S7#v^VjkK;d-j z4gi&ku*POTd|fXAaMaA&KzsL(XQ0nk+q%}Jw&+V^9A3}!E5~PR8_=~+qlI1rl?&*@AiqU3>T0%ndhJXXYB(9To`w4UVKL4ZwmNlr7V<77RthAnDYQv0GNPPMv{^k3DQw?Yx?0a&?4Kgkcut=@fzd;0_!6vT5I8j$e*Tw8_z~D;#LX_O#tN_AH^b$ zSw-UvV`QUlN}G7~!XF`U`Z0&LkVt$rdWwX3GNPDereOs3Zv24H=u~An7Yh?0i?{Fs z)Tc7WZ0P!JxUs>Lqw-5!a3Ldncb**st%?nV0z`n&5p`XW_M$EcFWhNc&1?)O^&8-3 za||TwHJ67fKLI)h37GD4gekIQ%gZUS?rCzr@$Qwd^8(qjWY{Pf42t>7lEPq zui?!XF#-(DCn`Pbj7~Gb4FWW>1n7^nuLQn8AUBVJctU{p!;1nessH9Yz{d>OvMl_w z3+P(v5D4`Sfx(Y3A2zvgYCRRc16RHJB7lg14Ll&cz+#&LJu$m{cj$oL!vOpO{F=`5 zyTE_38o&|)pq}}YJ#TT`Mwf!Z;am4_!K~~BMiKZbi;)m~7X$Dc*qv4~dl0nd-{=ez z2rl-_#$15vwZP*xL@W@xB^)kKYPf=`jGkhu(g6HB7vYyTitxXk&*+pD;1+wvB|;dNC5tmi@@ZKUz|2q+1Q4_e#jrd@(*%Dp*mv9ZeCsQ170`)}at-k5s>fEfPPt3$AJ;5OMo?uDVDjlK;st6e|BuEGV^ zO9RUWZsfx|wZDLa4wtz3BO~h%+{B>RyoSJc5qK^k@D4h8l#PSVFIVl|BM5^`V+%TK z*K&Xl)!5?x7lFCL_j7Op^U%+|3%c}I{Q%@{BXCq+n)AQ)5v@pVOgdyyV1cZnEyn=> z{8)b+`S=@duJmJwi|j+@5a2187J>LB(x|xvmwxQ5AB_*4S>mk%4)wa@08%mZMr0S9 zaMXbC*azEjcQCdP7~*as&}_ml!B1?SnH>*2fdZ+()))wPZW+q)X*QxZx6}7`ttPk@ zHH-mp3A{v0Ii%)a9R*zjRG?_NgjhDX0aMg)R2DU@{9t+4(!jL{+yvlfZr~GJ!AGun zEKr&Pa_=W`zlEK&agU4aSlSW+_OsxWH$dDM`|*On2SufgJNytD3tZ4&B^Qj~0w!l4J^kc%Dd*D7mrUjcSqTcDrBtrI7EO=8yI-6 zXI%lj2LAb(d%tC2@ z5csB_PAk`!VAOkbr>f#CWVZSTTL^5DPRfA6Lfg6!_+O-qebcfu3$FkG002ovPDHLk FV1gwr$c+F1 literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/backgrounds/new/nightmare.bin b/graphics/battle_anims/backgrounds/new/nightmare.bin new file mode 100644 index 0000000000000000000000000000000000000000..c4b8b45a7c22538e8b445fdbc73ac41ada5fa8e6 GIT binary patch literal 756 zcmWN|cR-W{7{KB8`|iMF$sH$45PmPn2IV44D?AP>M-WhshA0QpP9v=>JNuxare#@L zY19>B!+}(^j6jQqMO3sk$!;XXy$`BkFVT2Pwq!>mNLy5*o zgt&;o%`g&Ti6g1d7EgkZ$Z(QKw!|}n6jJ#=D{10QXQYrpCRt=#Ql3LDdE`4NV3g$@ zO`+i76pA?2l7=yy#_5cOaRkobOwJOD8IP9|!AB_*I2+Ef0+F1{L}3z>nZkLNw3kuN z`BZdEk+ZXsDlWjdkf}^#y7b8mF5+S?K`vz`)y$$~Hl7;%)KXIyoK`q6hk7m(F6Roa zVs?iG|p2<`x$DJ+~qO7IPaGu11=C z6L04Zf0f+HT`XZKmCO8fcL$G!upHM4?lGG0Wu?&~_i;a~cmRsCU2PAtnl-{hJj^4k zZSu9Q<58L$+aD7iC&&{#DYUSjRyLSC#nU|F>wi|*$R;+k1=`Y#t+ex;gXej{KiI*G z!b`l&E4(Uf<25>Y-9Z=KrS9$Q5Z>TTdU(r9^S#YGyvt5_&#ZW#UOuplF@1c{c&O}=9v`)dQ=3kNvJAr1#?R~|7tj`9OP z3di_~pE+)sJ%jwhuly$b&I$hDPX~YTcWu`{{0sk;_KF&6+SR6ZHR?4~bci}MOvAe+ z${iM=ks77OP>oinx^VkqNObEkjTMi?X}l(AqB@6bl6aGKgc>QDs;HKDB~8004jl0{{R3eocQU0000mP)t-s0001D zF-lq>K~f+=QXn}>7&!m{00000000000000000000000000000000000=$QJ;000c9 zNkl`JxGISPI9ZT4{8biZ83l}bFmd920^ggb~A_2}r!Ug#7 zQIme;pGjx7G8y2_``u-`iKE}bc3N|w`fT4RK`b=8j}`X zxB3oSrgib5*&91T3}jqU0BtxT!D^}qjX#FJhwW+ z&4(wa8C5fSu8tQ_`k=InybW>l^1~*PW&zpFFV8EEiFl^9be1$#!idb1>Zo*vxKafx z4}hXyEmh^LCXp1;*sxg+=TymzluNo^<>|Hqrdl~sCUYn$xSkB6sqAJQUdc6Gl8(Ab z7pvYQ6&K*QU`2*Jmad?B;Pme4hZPVn;MJ14ezeq+M3@S~{*ICWdGil@ z!y^-k;MVdN`vCnIt#b{~%%bju(%n;R=kDiqO4!ad6fK(Jx{(Aj^^Dgv6aV)G`$XEllxRVfnHN%yive3PdxbPie2Tw;6o2aXJYp zoS75lWdf>KLa~ok`A=6Kkt}HnV!(R~#1Fob4yD6K^KX~j`T{Nlm}}@3pQ*YZdC+Qs ze$91&l!s6w=mtMVN;DU^+e48_PQB#u4lCl+wocSwR>Bd6RG^5~jfxlpE*B(11J*F} z(QvrSv__?zbeJT}n{4^W;lmw;%#Xx~NnG#-F*J@BPr#k~R;m+DOks(DkH(ZWr3Ueo zFHlpxa#zGd!t;{bL|;bzCN^X{zPu2G=J~bs|ld0P4`XNJMxpSNK z1=uwTgn`^ccVX1QkF2Y{0mb!^w_G~`%~YH(Zh?}&%n^2c$NA&pU-5we%@lRzRH`RK zv&9&l7l2D&!)Sxy)n!I&3h2ng?#2aJD1IqHF<`k$F>B0t_azFhCnWVViB1y4m7smb zxZ0x!%B;_54W6)kviqz}>V&B%phDyY2(s-A0U6Vj{>3`0rqx9|rg@@-lkjE<-DH9Y zps%ld>N%gK-2v*UL^Gmfy4OAD!p&+G@Ye3=w6mN_2N2$utcU)Jq?U}l`IFW}v9)&( z$&V0~tfkq~Osq$q?BO8NUsES8zjzXahAX&^`#Z0SwTSE;^vXsOmyU2G_Mab!x{E9L z$nC~XtjXpNb9WcBaxKDyKnk~|mv8`riagv9;0`;~H`hgKjiqaeOP};H$T=d5EWz!| z-PJd%7~65f5AT9j+xVtj#RSWX@uF?s*4Roaw`lvGX;|iB#NbG45%CZ>Bdnfp9+Mlt zwTs@kh@(P>NfggMqkPrD)S0qV(kAEDD6q7nVXYOGKhG*h2E5Av){^&^Ja*|uCRs>PHqa64BP;AKtT zb#%%g^s<$H+u3$JjztTW;-vK)8&K4w4xs)|) z`u_r4Y3mKBv=m90lVm9^UX2|6k>A@t07o4bZI)q_IIjai{FX}hoF>e0^#I&@p<;I@ zd+6gtLhe-A~_v~4lBNGA-f?N)}iH&tK=I%?Sz5jQIJ&(y}yt>w z9=2AVGN=gF1@I^s7;%N*r@4$Ax?-$O29ZXYMC6|(oZYoNT1um~e7=lR|pY@oVVaT*btI~n-@T&9J zB2Qx|waL`Nrc|(dVxH+T(};yx+9B`apxT!%WfEycx#O^-Z=L5fm@A|p9es-Zlbf0g ze(A}1y8qa{iVhe-`L)8Q&BwjM^?iLAAl^iEB>|vU;&ojp{dyqn!^7S zj2F+w&{jxkJHtM%sYso_56x~P4QXZB;v$7yF>qAVv`(0s`C;0_p1B*4>!h6EPD9Ua zH~F2T&S2%ex&nqgU-@cFn-ACa@-DdTck4WFm2W;A{P5nr%kC%+K&#kz?|B^)Z+_LL zb2J`r8(`A|7wRmhwYi63);k=(g3CG;v7MvgVq6Y#|IHyAfHq;>0fD_iCk z?mXD>KNJ1i0NVk`Z>{j$M?h@eT-<=;q=J@`W1Oo-^K07U-R=j#%KT6hYQb<7NdU}! z6VbMKro8gURPoV*AXnW-9&qeoCVnmp;LaHaQGxiC==h)fpF$NM(u5HYeNqet55TB> z)bX1BS?@(z8{b>G7JQLkANqP61s1AmhPh%>H?c*x9z=$o5wAM6XJYQ8vX8=9bV-Z6(nN-|r zuzUOy@M{ej#N;J}+Lq>%4#n_1h%JeHXl$H-?ys)$*MJtle+Ed-TmBYs9RE@FCxGYw my!{m*Qr2GrvbX;g-v0sY4`9VKFUgVs0000Bs4$?bff>Ym2}wwaa9$*i@#i85^;nFN;w+J$8jI|2 zo}IWqvm{HgbU`$;49mvS&c&BwLU|^!!uT~6*(Eu;su(M=^5yh|Dy+(C`Ddy#sRnD} zR4vwKqz>znRP;>$6kMzqy=n%cK2zC%4T(l<%qDC~G-Dc@Go5I`mTbk=L>p$XE!z?8 z*?}F|iRjEsM%jhv$}DzcHqo6u*poR#FXpm0`w)HEkNr7-7|1~!%pt^34&!i+AVzW& zM{^7@mg6{{6NrhN#L1jOOyx9A=L}*dXK^-fAm(r`=W#xapxsF)R4J_bBViPxW3%3&6xScz=li0=G+{3-Z9o)w| zc^9L1Uyj_v{k)erz=J%*!^9CD(+f|H+s5 zFYsl)!i&5FzRK75I^O`_=dl~)o}K^2v( zN>F80QB_rgs;h=-s#ct8tB&eMBZQ4yCJwTB;S) zT5Xh}wp6=VMD5i<=%`NWtV|)QF6yc*p_{VRT|I=J%26+Y*JF|Y*8eAX@pSy|yj)$( z>#dBu@_p1-h3OX}vCMgyZF55`EfyJGwuFo4IOAG^FD1u0mbUgnq^!$CGyADj1DD*N zRm5sFS50x1%L6LAQZ%oBqLN*4{F(|*N_2Ub%U|8tjo^lE;8fQy#b8JG)x#qx`O)(- zUDtIIUE8(rQcc&OtLLB3buZ_@J>A3Ioeg($mbif=m%U%WDq&($oHFUGq=oZ}y-KN{MR_mbk+MpNwe4L;2vwj90&co+? z)=&Ek{FI;c6Mh{2&foeQe+_@-FCFt2@aO)_pZXK{V}IlieHH$|@B2N!3%}zlzU;T* zxBRBx@aynve$|(J5v~#{he{zCp<<{Il0tcea-nP}6G|hL3ME5gD1lHs6blI<9w9D7 z0>X9p7ys;^{3HB>ulaiy!YxCKkRF;Nq=jaoX=sAbI5Y|ki=Yjup?)Y(0klz@v{_r$ zMsl}mTZt>%wFBCzUD~ZZP_006KA0{{R3dN+850000mP)t-s?ie8U z-v92^|L)E9=Ee5rwD#Vt_THrS-kkQ;l=jVw?!|NNy<+aYTIRG$<^TWy?bhaB000g7 zNklc5z5`gCw$Z~Xvi-4m`RE1@(vav{%Tmo$B2#fF{?;>*u;0*v~ccp|- zpj^}&2z&!kZ$KtjXX}*U`hR+67ZByrluhAh_M7gW?w+0*gaGXc+k>=&wfl#MPfw2z zv3;bEAMj&pkND9&fA@(H9}nR?@ZoE~!?yqr&yrAx3_L{OWAcy+*e{{*o@Ds@Zvd)< zpPstFN9%n5eSpq9_s<4Codx>7&j7L>kEV`(CBR4D_i%4OZ)9t(^SzGp;N3&eod=(u za-fZV$bp&hPXix3@Ua6->|hS$4EL9S>BK+r01rL30-zb@1n@qMo)p;SsS?^VQm4+KmH=;AX1X=rZH0Ur5qcX#(b2Oi?2D9}ec07cXY>$FFi<~wdI zsPkzVM_w54Aq6JGQcvNb&}@qj`Zj42cFFT1E}QJ5J^GdQ;R8t@cq$TUl88=m@AlB{ z-kjljAgvE6=zR~*w|8COCj+vI2lkh=*SkFmm9lPk@*)*Dpj-Ly>Qm#Lqhu`(AOnVU zDtm$ZoVV5nuW#J9@byi|UAF6p`H=Tw@LT}aBLm(ii9+YJwjSb=Jb( zj0)erd4o>!X8$e=i8tQe?#z+Uqi1OYVCMJM%*;3WH@@AKW!VMZvdiB_pIw19=*0$! zo%qOtgx_zl`#K;;oIdi{zB+T8Ep?@jm-Ip&i1D-KM^`Y*J9!*>Y@>8-lg}P}gf?Ha z>K`ck{ze6~2Lt>AJz2wL1k$suywV0Xs!VPc@)m(x<<*NO@W3?!SKN6e;xMq8S77S8 zp0m-bg$f+g!)~)e;mmCe*G$a|iGI>ox~&HwCxrGHDZP%-E*O_5>RX5k|iJ_MD$=a=aOjEe&1cNXI;dAOxSMLw>< z2dN~mYmqHx)A5M)kv1BPMxfk80>oz-iQYMVvsi1Mn@|son9-i(^mw ztoDWH**p-#wdfdTnjGp`IrerR;j>@*7N)oO4FEv|0amryKS(CV*F~h^Bj*;o{T_Ru zL=&AqF%x8LkQ>c^J#sX8syxvml+BCsL?DhcF0Km}@P*J`pMq(7CCoo@KBkkhWakLI zehc4CnnkuA?e>()o0*}_ag$95xf%iJMR$vu$O(QqZ zm{8zS!hgGVL;!-mzjVwWGzclQ8d=aabQ|$`jIPZlS^#`{I)1s|_snPTmV#tN*15fV~YR~HwTR~Jd^${F)J`~zOZ zz`;+TH5DP-?P@KuWvmlG%k9{}jb1ZwFxcF;itRI-P7nmgk`1k$)$a6Nk?X!XK zfe&N&7Bj_bNniV;2HR=iWd|r9X@?&%SGat*f2$G4y}G6x3@%e(){vM0dBIuuYT>lb zeMK#RDhUL)~hr*M@wbNoCD>pjzl=Pt;rZd#m;13V}&*JJ-@W zEUAr?Eppy~7>b-1y&TqZr;+C7)R+jVl{I=bHvJGHI?CbnG_CfOCJcLb278 zUhFKisqtl=50liRe!1+Vs~ZP2ThUB}p{rps)vLNrMRZMNbsNgIrF2MwCEel z+?FVm-c^txL!*v6&K&pZM_KEw@TG&UILusMRDM*+hY^U6%bA>(a9oa*nuj|;`Fx?k znu!AJt#AbU-(KK68A%c>$Lh;d2Yjw_O07FjZVIqD;Iqoaw^%nJdw!a=b zBO3qh5k(bggZO_;9GjSw_*w*krb5{(^6`%dw7Z3qt!@6PyzW-!m6||x4pp61z3wPo zPSAfpo-waT`Sz&5B%CB!(NX`B?k?bu@Lr$VY3Zg-CdCqUJ?j)q)PDc+%-KI0(B*!o zd;>3Qg>Si zEU=Dymst;RH0UuX*`W*MpOkPU%t@VqSD04d)fOdksi%3kEbEH*@hf@I_SV^{m>%8h zPX}bBg<3kj-zzl3we4?Ze|ek&+gM_Qg~!EcIP~{>gF$NpH5 zyTxO{!Fr=VW{^my-zrQ?l~F7Az`d3$7O&#LjT0Sox4Yd&Rj7C4fu=IgLEE;vS40E# z96w@#iDzgl$?EhR%+D`5P?Hvp#@1F^N~J~2YSk?(KbPI36CvPa@_gnVnF3j`&2D35 zAxJsb+*iOflB*5^9o>2m%q=?PQuoxi{4|=RQmYhvvxpYXeJ603MWL{?q`fmP&^Na` z;o`qm6d8u;O=1{z4=fuQ*=?iq$Kq)6)if227BeZEH&oHm`k?WqIetcY znUX_M*fyUg!5?sPb+cH;B7BQix2TF_^EwizV@eLtT-KE9;7KgS+T$^*H?^ui282(_@)U+iv=EH<&=T6T7vcc0O+JKpmLjy|OWCd+hQ_H~wnAFQ& zLiWY7EIWtOl^ubOdsKF~%S&&?2=qjsGCDwdnaFpM0n7ZiQNB&f3-`w0}C}S#1Im#Oqs7NI$hfTjw1(z73D%Ge?4XA0VMJ%^D zX%bRX^EC_5+?*D)G_^8X(}uRR3y0L64ut5KTz8@~UFhoNSGtAt8{HFJ{Z0?lAM}i% z7rp5dQr~0dM5`bD8GsFB5Q7g0 z(KLz4#7uEDm1#_Om2w6%nPr-7j?G~%^O%nou#iP8cI7N#sc9LBVZ|&b(+XCyDpAgA z)|l3^&Xuia0~^_dXER&aYTAaoJyAQ@$u9i6*<;$vgkVCn_OU;#100Ot5QjMu($NTx zah$(RC!#oMIz_tEoJqbvOaI`2sB>^0U7%<1qL)itMpsCtt6X#S57)&FZqg+fC*9&U zcerbg|6lHz?(+aWyylJRb!6;YbKc?Cdp>yi YNK#mz_#BVE@Re_g`rl8fU>{-j9a=N1jsO4v literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..97cf4b73af4c1d66ced0caa1cf28a539f506a897 GIT binary patch literal 1511 zcmV003wN0{{R3gj(ju0000mP)t-s00030 z_5lCx0RP?q|IGmZy#W8L0RNl_|BDF!dkFt(2>)6L|4In|F$n)D2=*8NZ#0u{000GY zNklvbAO6vw9poC<_ofmykL07?M@lmdXo-yJ{=@NxmbCg0713a}TYfe57m z2~}XB26C*-d*;q#cUk$I z>EGB?sE5_S2C~{r(`#P%u;Y59j|cKK>AnHni)uRXeld`m{+Z!?6DU-8gk9EA3yT7E zNTOUd`4Pa|c*z~VTrLqY`O&U_;JtZ#&SBwJ6QTofF!l7;k}0~wPcG=KAnc$BaCT<_ z@8>M~x>xo)rmaT^L+|Xte-H-jjB&i%X8|?HcC&S`$r~}R2E&=Ck!B&5FHDKPwrjl` zP;wv33AGUoBz(#vS|06EwCdD9K;VOVDZ3SUOvA|U7fWdE6gDo3*HIit%Q$jZp@t-D*aI&xx8_aeUFxgW6%LzM z0<~ob&-6&l6s96T*yA+>zCy~+NFUCA*zMy4uGd^lpr$^g5Nevb)W2Eq;B1LD!z>~V zY|^wyp#y2g1o+zxvdx#kVgj?XIV3>h$ilpFLkFG@anUP*1K^g401kW_9^XbfFo(=G zX<#1%ka;L{zdsh(Z&a9qRtm7|lx0G<*{s!RoOj_1md(Q~V3w5CY`M9nYYScIivg7w zkmYp;kWbffejs%!%dt%g1j(WGiEb}$KX+tFE+Cf!cm?uI9swZns_~w-+HroG6WCDe zOd*w}PS22vSbO84HPXmxj{|>|o2Ab#U^7f@P8T;Z5L=OCDNp-P%$^{QT2hu&)(0dy+p(Uo`^v%lqtw)P6(*$^yzi*^M79eJ{Ukxn$c zSAjr%<8x8Y(y6x<3Di7XeV4|9-&<8F?M=CYeBY}es#4SHAis2~?haf|P)V2e>Vt4Z z{2O_G|2x?8Cm)@_x2*vLD!uK=#r)y~_vQTzYztSU5ckk_u@9)#J)yQ6E<7mgzylAQz@F!#TRdWL0`~nX#$;XpY#VZyQeCn0mz%#fQb>5Xqfg@e$Vh8YXyX-_d zqBkpzu_d7Ij#C{ZjLrn|F6UMz&>f!r@-D^ioYtZblHq9tyjJ1UL=3Rws6A`og} zLvC@a^V!u+kBo}dOy+yFHZ4klp4aDX4hlFqN%ztb94;?v;3W0i;FK^oYw~Df71taKrgSfM$h6(8(2Y5mAcz$>4S__A2;jTL?&v z(SagM%x-ptfHYjM^~u9^vnvK97W#hECL%7XzmKUiQBL{tF^ewGqXX^Gg5# N002ovPDHLkV1iC@&gTFC literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..225d8e95f306009a6aab40fd1a56d2f9e74400f8 GIT binary patch literal 808 zcmWO4iDS-n9Ki9<_xJ4Ceslh2#%zxFXOA)S#2n>ne$VV#5*0pi3H@uvXN5o*^Aq>Y$I3@y{V5FEL6ctkpDNYGW;vi9! zBAU`j3}q-wEKWJ%#KdEe@>HNAm1qTNN@^qtxSg|PO z^CoZcHetPahdz?umyCYm_Gdt*J5UP6&maaf1Q|*W?=lSMJ%*c%_sPYC7{N$J8DIEl z@)#q-95WWiW#$I?fbkwaWC9aSx?|)cCNY^Q$W%UN8q@L4;1gzQk546EK4TWM`5gNT zGW;opUoyvLF7w39=PO|WU-J#$hD_7%SjhJ*N@B5@^@CZkgry;Qu#DxbVC8s|vx?Q~ zT_f(=5biwIF*s?xO+FjU*g9-XW|N67Fh@3!7(+*krSNc6sL(g z!&$4-Km2QD#h&AQsF8E&0vCl#T;>W_g=<{r1~-LU+~y8004jl0{{R3eocQU0000mP)t-s0002q zr2p=V|J95Cy^H_VbN|I!|Gjhetd#DwTIQ@;)trOXlv2%mi^YRlv~zo`1befv000Q_ zNkl`e&b@$Zy`f_h#N3l5!SV{1zP`e=UFXotZboA>}ACZ33+*7G=5G zL3`Bg3$+8ZeZ|fEqw;N@ zE{lj?o&~F1gQAqG`z-rCQ!PpGjmoAsqB1%H{%-z5gVV17*KMHr!iU(j->wBXB`}<= zuSp311aOq5qR$pI1yweTtscW!QU}57_xoNPwt!CrZuS*Va+0)whHL}9NFWcD&4;1_ zKOh*VPE0Zfu2e(;<{F%bbAl1aYEp`lS0$JIlbsZi5W0L0V2)yLhT;u_MjWe2kszde zaLY-qB)efou;;+)fw2`J_qm=BsNGSJ+lM@M&5fc5O9mf4i}^VQ#-jB-I0?bpSgOVT z9GH1<6^Iy8dPl)=4GbevNW}hv4lD524z#9(R}9u7N|5)qNN55yq5>D~psh&f9U`$) zVvSP8W8*jKoR~LxY3F}jdn5Hu2yQleSM)O~c?j;3cRDY+-L3}x;MTy6SkLE>@O-B8 zk@&I>7K?=zBY$-jV3N%8^ZZu@b}%7N7l8}xG@|DBZFG>w6%QtIsyHGoqA`Jf5JiiW zCqP4n^!-xU6&JzbFA=q&nNBX)Qv}-avVfo7RyDya} zzM1QPe-y{B11xee`?%)mc45SO`p4`jUXocui9rSd$(bJac}c;u161=E8+##&4fX&OOe#JO%>Xh zb#^{Gr+vq-!k&R6_DtT%?Ntr@TX}c|HJ1s$Xav~v;4S5y)IcTjA#`T0vPtg26O0Gm zX~g;5{aye*R)31A!S>D^EfPxE!OhmDBhbZj;7WqKKT*6d%NrretMtVE1dmWdL$TPBRUr&0s<26E!Ci9J&(E=$pea ztR=)cTB$L-y5%8E9N5=jOP9s729dA<9K7alj^tKhOTEh_$>7S(@of>5A7UolXvC`} zl6wV$T#!Ww^5|V^F}A%Wkw7mVOUMEcPZWjEea z_3})@D+88p(}HyFKJUIMAVhRRuN&99yjbFM)vfa2&bF$9@BvoJ_hq2gd)L=&7sq<}n58%=|%f&M2uS`gn`XPJp8EDiq zH}~4JATD1Z8$A9EvczRr)!JHt*V!06n+R`wMkySjMm;Xj zz8~c5mn;}WE7|T268B1cagyW&ni4lvPbL3Sftd6zOlL>Xu8p+MFPaNJfZmb@fSBEdDuu4eX^jU=%qn@m%)5EsgH#)#s9{aMB-EB zTzHw-2=AT&-vwYEc(%7UjUbF9-AugVsTfnjd9`NHMtt)|1iY!LMN^k?juStNHsX{5 z&KU&Jaa0`y!g*wShdYb{MMX21yDsM;28}#>e6SSsh%3<7nFY^-G32H;C>M}G;TiDk zL@W^mG0aASa|zpxwF{glU;3F3#p)e-b15mhE5g{}9}NYY;vt`j+1R Y09)n$7PcOrxc~qF07*qoM6N<$f?~&hIRF3v literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8b34d893cd186d70a199787426bd4194f3c8abd5 GIT binary patch literal 1052 zcmWmBg<}o~0LI~WrY1i*?e}Un-Q8_^Y}oK&820Iynr^1MnU3kcbLF~RcZa*<%Jm)Y z`4^r*TDTNO7Q)GjvXPw}7L6l?5aZDVCNhc1XbMxA#&k4;RAw>@&1MdBNkj9P&jJ>rMJ#3sOVKixvx1dq z6{}f8I$Fy**0TX^WD}d&g0`}a?d(81*~M=55Vn_n?B{^ObdU@VaTp!pD91RCPH>V_ zoJN_P;VkFSc`k5~OXxCJxXLwjof|yH!UMeadHi&KKxQzT#`XLEmzR@Aw}5z+LX~Bl?M- z`GsH6eSYJ2{y=~77k~2)`j`KB@Tgs3&f;)qwX!+8b2z6J;atw`JXT)kbAAV`0xsx6 zE^HNXQAfI%Roo?9(xt4@F5|Msvdg)=D_9j>$(3Ejs_JTvaY1Kp&GsD6b(%HL^S!_etwmn!C0=SR^K!57N^6x@dyUhrwO;4--e7I?CU5o@ zYpb_;yLVVSz0143$J*!Z1k6R~v(x-gd%JdnZ^*QUjFZiM_ xS(kmqSAEU8?i-c@=zpo9xKLzB_mgiYXC|d5DJ2*aj82RS>P~z_;;n>?*oPEd4TAsx literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c03ce283bbeb982978b3c751f4cae35af3389e06 GIT binary patch literal 7508 zcmV-a9joGrP)006iI0{{R3mSp_{6hLMX{N+ z8?}0)2GH6aSA}r(M#F7&I{r9G7KN5E7vH0(ck8>-2|{1VCvTuj3dJ76f<`#59hBI6dJJZSJaTtWt;&ggDe{)JeJTdBeUa!~f^*jJKbUCizd7jtl z1o0fQ&4W0eq)9?Oo)mBu2mTOJpU?l^g}y2`z(J=s82G;5>w4`rH}4qfWcB=Dl1$d4 z9%aSa=W;MmVH}MJc-$w0cB4@%0k`QxZx{r@C>RZT9nTZlT7uT;^tv5r5is9ByNy=I z#~CfsQo?l<_%jP6ecLTmj>Y5Mrn2HV3gQIM2NJiQ zOeRS}89cAs;j?>Iy=L1r8t|88GVpp`r{VH+A(Nj{^Nv~R)9;1;mspZcD|?ea9Jx?y-o=M-q6W_QVB+V&KHIKzB@EVf1ud@c`k2tc2J zRjf+QcAdH{wv3a7{KLs+4Zn!sBU?HKd;;RFSCe?X#h%mru*naHbi1Yh&Epv~IRdPa z5Zkuv4O@&Ej?o*?w)98<2tPQ{Dfs<-v7Q{WY;ic`#WpWC+r#k;y z8pUh4qQ4GKBu-*kMnXN5be_y7@nn%<9nzeqT@(kg9-MbTNUNr+0?)O{En<3o|9-j< zxG0K~1$4ND5^+dS>SRJw*#MC1csv#tiobvfjVF`P665I&f*_fFbE-IQ7_a@y7~V;# zusPaUyx9Gv?Y7-UQ@vaajrwkh{rNuL0hV}(?+G~YVIuh0=yP3dsCM_$a6YANT(0NC zdL6+OlW%Yyx7mVKk%)~1@u;E8WIP)*fLE~_)mp{wK&lNO zPp?;+bGn|7x^0)PD7Fewn_^z#9RQe6Kd{BVZ{euNAmrI>)V6EYyE_|Ec(Yp>t;M4knsU#>uGb$mul6l1;bM_d|Fb;|6t^ z?&qK(A3GgyyCYu~pgIDEHH5n6Q5cXQ zAZ#dr37_5d4BdOee|T?V07Z|mpgRKKWS(x|Jb7BIMu=dr zI=tVXZ1W@Biq=R+CggmcBx@r2fEaYeA+USO3sVWkF#s>tkbaP+862NmfsAoXYY0Vb zLTv>OwzF6)Ca~XNL}sT_gi(ES3S)Q|-fBT7ak}3lLi#@5_<%60fOsAq)hzG;jBy2W zh$15PalV4s7j+8YWGaBeAf9gbtN6i}L&Q(RZnx*(-%nLSGRju)$gXR8M1Zq_V8reF z=ClDhpFr){atP+ztYbMs9$%P~)B;0ZtGZO9}(tj6eP6-!j zw%KX3O})x0<8r^KTeV98az5=?XhL({f?Bfj=yt9tpq3ON3JKDOf&2A(>kDA6?#evkc6{%9>W{CzbpbZ8> zpM4=IIv35C(QTr-rnb|m7(&V&JsZGdc1y}=dJ?)o5kr6AAyjo0Z2*Y_iEm=&)2TQ( zL}2oj;S{K$S0?e+%~z-C1h%)Lr&7RC588LjNbXCV5tkhLkqDSeb||?gY>R+T8KA7K z5*;2kg?3Eph+=?I5Q#G4TaR!!P`4jQFaoo|2DT+f7R8xo3`#gNj#zjQjAoV6ppoE` z?XbP!;8UGhp3Q8GnLLsTyERk}><_0~M4=;<2TCo<$aujExg~-VGF~A$os7p!z&ky! zUSVCT^`qO+q@n{j#*?9B*`TOAH4dPNINh}+VuJ}5D>*$RbtnYj0}!uTWm&5E;~gBr z{z+m8((g%{ft|8ro^OjAppfy-%0+9)QxjN3z(_IZ^)xGLwWN@&)`~)63*!J!7bdt~ z?-%JDnROB%C#p)yTA>IPi{}~z_cR&$UNRRe1O*S6!br7ME6PAB47A-CQ5I%-m6yrXUlcGPQQuT^Xp z{|TfuXE}hPaY8qdV@sE)xsaL1Q83pCF{i^Kki7ZjcS=bte4;6KP_M|(XHMg)2*}P0Z832tijsNNCN}pbmQeN z+fYtag}_U8`F8#r@azf=g5I!0fm`|AVpgtb5U$2Q*39p@3#6G)h@ z25pBT6on=c%h^9x{UI z=hQ9k9-9{l8E|a3gUVKN#p$D}?)q$e>w3<WALPU=S% zq%GtagC0tU)|U;krR(L2>PH|?muxqnfOTOaeBkdpG!F$#*2`q}xo$zYJ82|wG2pgX z-$;+CHJ1HeNbW2yuICk7DY{=k;vkyri;ax-c?~Ewki@OU4$@Te*eT%rjYW#O%V}oZR8oyr`uU(hdg_G zJR?2;Gu!>j=hPWGX>+t09856kY9Ta)C4bg>S@ul{QB1Mgv~9@^e)^ha^GTBJsq<}- z?LPC>nrN`5eE=Z(ATXO@zttbl99H!7gbQMIo_+h%2a`ordZ!e7qgg$>s&p1v$RSZ; zpl7n<_Q&&4uNPYM#m5s8qf@cTe*K+W)rI1!?`BnER`q*ohx)8*FF^Wmo&dgyOPsRg zpFX&h`e(Ifv|(g4%vaUkVza5O4{062cbrB`0Qc!55(((&qpNbO)jQ%H0oZ%o%@sqP}wwz%J6zdww_kzu`zE=?3Z_3!zO`vjH-(WIWz&C@q@o(IMaDZd2R&DtEYxUNJ+{t*pxdC@)$41e zjmQD~VQaS^LM3Li`m%KX8x8=G00o0jHQjJ|6t-=bp7Cx;Voh~9qjD>Jl}=@gXJc7| z9*aN_2G7KPKUur<+z-;xNo<2ye}9V@73hXpn`@!|j0h;CMdDQFpvN0xHjvdj;~=&q zjb>?dv9-7jsiO414=bE|5#9h zMn+xNfh#Keh?5$lBOuh-ynVH$95jOu_N_R@@DQz@pPvCIu`kPJ0|@VOKQ}62Q&8#ynIx*sxmvgood6F)d>|~;gdJ141N3hssS7kTK{-8`lI-M{7 z@+^V*A|htHSr@FpTKOiSL>a0O65_0z4Q+wGFXDCkT0g=wPj8YsFo`Irz&4NcBc4z& zO|xNES6Z82Di9WdAJa)8Cz2GVr)tA+%ui|-l_7Q1Qc)+9adnu%9AKxP*$1WUpj`6!sd(>54;+L85v_eDZayHGp;Y08T! z0<5b&?4GEA+oypJw1qHu?@C6Nt1MymTyJz;c{>k4+vuY}d%;HWopxJKh*h=-p#H}_q_a^8B7|B5e;_ab!~WtA@Xet1-~)e0)<^XaFT$86O#RS2!HVVev=Dh_ddw<~~kQIL2qrzq5>jxBH~9EdU_FWA-i z+k>Z3g1L*PrzTsKu*xA1J*U~IRrL_woj zN+wHfny|%}r;$JK7>8_=JBbL^eV_vunOD)x44{djJxP6F4zPyFI?K{E5w|DEw2B5@ z9edX#?UU(c!!lC>_Q>en?AFLgP!QFz)UCAlzB0ElaE!+lG}P2muBNG3wPpZ=8(V1m z#}j6jscT;=O&Av^EdWdx?9;N-v}5=)8m*dMM#GBD%ur?+K{OPFc7;hbPU&beEX#KG ziw@ek+Rtbe>WPd~BBG@&)u0@*j79@CUAt7JcN-uK1Ge8|SO>S89oYffril0h&ox$2 zW#mI9Yr%>pI65OoXpUT3!yNo*yO@KjManKb@HVMwtR1u6H*v*!na$#h#YPfNjx&-_ z$dBD&jW+{Tpb9tvP`XOD?7d3cHs2mIHj3PLL@rB%WRsyxgT1u7?a~n%Y=@b~?{<3| z^UH)JjBrlA3}<{}EE@F~hZ(%d!|aBX50tdd0CIAX>*P=XiN*PNz@ZPqL^7L=!vM9J zWxSMGom_7~rojOO;TWVHY08s)j~vR$i1KM}D9KLttn{Qq#wvX>VopB$pa$zr*byCVcF$0HC>jD<0(CjBks5l(SAJa0s z3E6W7#E`cN7P~Cj?UqYRwJ&u6uQzD6#)MhxhbB8}o6TMoG>9B>x&NSb?w|VA)$=G7SP&J+Ug?V>)ZA1`SlI!^)1Ubn=H%r z$vOdQW+C1qASCf(vpLIbB|mPDGGjqVc#u@7A>Q@Dcv+f30D5}4BU7R`8x~HT_mN`G zm<10~JRUd&J0M+UmLwS>qr819fa~Rsd>*0$EUB^Bcp-gFl0~`^yvqsec)lF=>oh<9 zZPaV?=7=zgsSg^`W7NV!*b>>3X;0QvLZ101+ekC>Qk*YXheNSF=KCB3${eOcz7^Xl zW0lCli%j6WLANFSHCuDlrbXLkz_VOtPX~ahMX+0#%RDDGX;)9uOub^@mY2&oxEV4UnPkTd4;^cnNIU-V^lo1# znOkka0OYWN07?d{X4##CSIeM54VWsTX*oL9R^(adWa3osPhDZPZ{>P^%5?1)Y_rPP12Skai3;_VHRa{3 zvr*84B}on7R*S`cUtU&x$Ad2b@f8lSCz4@+B-7&b_4S!|NzUhtgRbjgwE&B*ZN4%F8&%|N{_m)hO(rJ=#=FRhdy}Z7C zTxYP<+Y>j=F?IsB0*_`dZ&xBgbk@D+l6{KQD&!vKI$^l;@m?T)gnNaAFHcX3$T3DF zvl4vsM6!7%OWb<<_*ZJZaC`>lVKqYU950{Ve!pIHJ!ZTiGe=|`a)OjSk!qghSe|+R z@|DtF3oCm($XKW=v&$X-#dwr&0qD=W?#Zr8+v)~~a?DVui@+FOv zG^*FV^=_FB_s4)UwSwdz9Q}8`W~BhuJQ}f@>qr;1b1U8Ynid8TWRcuJ;|{g~hiNM< z$~{9eS=;U0Z*G8bGL%twPcx5!$z(^8#Ep0b1Hs>Mnfp7c7Sil{d$ulJsMc4bC2JKU zwU%PHf4l3Vh=JZ(8JLt-!?&v_rWTa=PKK`{TpkK)k-S0uOB$>iHF{yeiGowbUzu=xN#J6-U7hyso zJ^&`X4<2H3osrt${XbJDyRDC{STm^5x~SC&9|`zISA{Q-RWiAP8jJ&$d_RvL@kF5~ z<6_UW-3u}j4vvvXKRnz+*N`MM88`*7-~+->Z@|lt@yw8)`JZ93b_?!Gt+35^RbcT} zPRP|(NwRA}*B?K< z83x6+FZpUcnIw}jXZxcEMOyKihag&-lRZ(uzji%GOSaocLGlZ`GtSt}y$J6ecynkx zp3g(#Nx8NzuZ68viS>b*{~39!8MnW;{-wflSOGyD(pWd7MDqd!-qYw~x$n?6{+ACdXW!n<9zKkc%? zt?kc->-D~roJaMvd0*o0Ppa?_Qxfap!S};CNT8<;FBwXxiwgJg`Z!Wfb_I zYE%5f;GqNz{LwJx)p>KFLtDsoX^J}9w_szF2J|5wzI^7L*|OvOyDdlIa2RVhhfSPn;#mUc91VYvOh0493RrjXV}Di_$| zP}LOP$663DU6wv@3E220;DzUov_qtK5k!nC!7S#@8NCd9JRQ!wy2lG?atV-ugS}+A zvD`K@DFev+7oL_22{l!*F_G+QN32KO9Wx8m%KX+If&Yhkx-g@ zZKp0HR7&0%CNR(dh3i};EH41FI5ii(gim7@*@H4DmJ;4+hrM3fAGXn-%p>A42j;c0 z;ITv; zmrq)EW}rZ8XJ1nhTi!3hNQcmqB_)*hfVtbk8w}j=YK|?-%~`oEC5@1#1t(>$u6Fyc z>|y~~cw4=y_U@_XcL5v@X4pgEY~GdMod6(;BL1?{)bct$oZj%r=cW!UC9+iHs@sQY zt89g;$E!B{1y&-zFruw_&Q#pX;RBP{dT0&1Y!kgt#k4;N z&V+=$pk&UM&u-a87YXHK@3d0>B9^|VUjE*b=)A4-63@3-M+b)K{!8yI)NGYY5`fCCBt`y!=XwUQW3kE{jx$l>|HwSkbh7ofgpChZ%0Xa*mu+r~i7>;OeDO4Z zcs&mN0jMJWC*p@>{I?E>?5oVEB}SX6l~`AK(SeD};l82Ijo0NER4 zyQaK1NfD*q1v~r@;PiB5_veZTAo<_b{C?0HDe4aa-fvIZAVUuL#tN8HUe8BfmHZ*V zemE_(QYD;L{LimX*&b>14*`Pu6aL=QnJKxX`@}}{+a;490%ZIMlPujFAK#v}j$p2z e<>2Zc!TUeBf!?Ut`ORdt-QC^YUDMs&F?AhWaKRndo#KM);7;C& z3%)Ou86^eCMikK~J2?mvgK`o}E^-ryBM*5ADX6$`Jo(6v3Q&*)3XxG*@kJ;~VpLd( z6eEe^s03h2qEdtjMUqiz%8)`zB)Tl+D6galN~Ho7Nh3X3fe4kT911F2g{oAex~M@- zYEfI%p)U2PFB;I0bQ+1qWYC1Bq8ZI;K}*q!*0iCmXh(YzQaXr^bfPm|L|3}eogShm zz35FJ(U*SoXMh;UAO91@2)!ciWHx=d%5UO#u5gt<#GhQ_Iyb~kZgHEx#NXWEF89QJ{^4K#6aVu7IUr|ql%t(p z&f%bAoKucv_)fe0hNvdXX2)OT5&}yj))4 zm0so5@*1!8IEc%wIYbEX1Yyw%&hUEblH-sRo$9`E%&?@#jql0we%LB||&R&pp6 F=^@Y~?;-#I literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..364ee1e06781361ff608f49bc9903e12496f4378 GIT binary patch literal 6425 zcmV+!8Rq7RP)006KA0{{R3dN+850000mP)t-s0RI3f zIS_MdN-0Vh7#J8JF%UU95S*NQN=hI(VjzoyVtad1N^>b%S}|IKDHtFKR@%GO000=I zNkle2~9 z3`fnSNk?sX?zmw_urp=M%2T2Zl_KEbIfG6iJf*gDzAc^!I2_WLVVd}<_+t})Ex=K6 z^IxC(Uz0Ke|2YGG{i01gR7%fyFv&gx!PBSt=NS?XPh3y#26=MJq{C_8;q;f5U6wKi zl+IFNI6}#){e*m88iAkU&7WYyQYuK!0g^FKUH+6_PXnY_k?}HJ26lsLzF8e9j6tGF2y8KCih#21& zzONUPVk)HPeMx{M^?W9$cov|4rbaKK*5Ubv?$0OELy7E`Fg<>2b6yC+irO?`PL?J0 zHT1L01aq+@Z|i;{ymu2{Mq`q9@ujo5uJh3HHu6v6iG(A-;nVn=wNfExPg8T4jwgMl z4bOvICLbg|Xh=Gr&1%|tYs0ia)6KA0LSBY*xGy*;M4s_a0iF`-85tlMu)Oe-93S{D zXPk59BVv4aj95ZKe#)-lEG$Gx1Y<5sJl0#aMG~#m*BXNFWroMtCQMglZ|9wHtav0G7LqGiF0?y5O$hFlq+q zG*Vb0AyQ(dbJuUkE`aEIPVCrM=U_WGFC5Er9Eb}%<_d(5>Ns-BFlEBC2F$fwR`e+} zVSO|w90s!;XVbBnwGn&81mkJ$$bZT@IQFvR4|L&e=xm-BlT`OrO!PkG|4u38*VFlS7(b}kzpKGIsrns)&|$fm#)hMhfRb_9qo5#l^YWG>NT6xk)8t^ z#(?)-TeoeF?%Z;Lp7m0Wx6!&8`!}0E{`#gW2`*B0ME&{GI)O`v`|#mI z4h*rBg~t zK0o041ICIjj6b(|CGLK{2?p7MNeB3}ictRJQfUM;zxS)=e&_P9|H5g+aAnbxUdfRS z1!Zy)!Mjf>uJ09Xe!1KE+|_ktz1gBjmcLIBb-%{^q!MiDW~#ghlfC>yETtqoJTXhKRP6yz7j-r!_W+$OXWND^93 z2bQIKy4|L&J=fAF8~TQ?$1iq#mz9=wvet}g~DY!yhbujtQ{ zcav{eS3i(^8A9a&)0^PuUbj(1%)Zdr%uhvF3Cn<(&m0FCNT@FfZx!j`+UtX$EGX4n z8*^S0>6P0r6#V^rpZ?gn$FINFfR19kRDq$1&=X|P9E}*3Nl-z6LHK%7E3X7WEeOie zHVRU!rId<(|If`Ice(Ax4}Xyk(gi~F$uaaL6JKsMm9i;roGgG$1vrQU z|MG9`&+Z{e9>iCbcK(3pWtNiWO9I%B{0;qbXAofk`a_b}G?7cwKWujAF27X#g=bxP z5Dy4|r!{E9R{(fhW`&g?V*W}QL)>Y}&Xz2}V*a_J3);A(pM{K=^6$R%&9-yZwMC+X zxWQ_e34;#5{TBaiqbN5pg%tD~1T3KD*OR=KW)w+eAm~NkO*XK10hfQ@y8oLGuNOXq z6a6oxP7?BUkok)J67s>z53m8rucoWXtePyu4*|Mr3qQ*(TvB35JW4W8{`CnOU;R%Q z^n`LDJoASK_K&VUxtLNQy3t9Mm(rl-vr-~9d^kcH;00_*%2IMjmrsI~lYUrT@dqh? zAupipmpwPiP0yz#ArFIGur8UINRQz1t6~uNU#%wPboGo=Yr$>V&Hu{(^7dCz7}dgX zBEF_96TY4?IiXDw6%2&k)>lrW!A?=I2Bv@c?x2>dUyGtzH0^IK(;`76EQICPSE6jsl2M9Q?;v3 zUjs9$N6|TRM_P>{yQUz@;UU=^{mz^G)JT+`^m#aj4Qr91$uERASq@J*Lr_M z%GzNqiVoL<6LZ&FElmPMWV*1nW}1Z>5w%voVP1GP;Mz*PM!ua^`(UTFqXmbA6-mF> z4a4a7K&@JMWb7(I#_F5`EcD1YL4Ero^@=39Uu;z>8d)}^ih2~*O`}lg_j|qG!GST7 z@P^R~*6I^OW#yyZzx>_N+x*M=rB0!riFvC6z_tEiy?=CIwhwQ#JB34x4BzQrI2etO zWC_(*&^HaUe^6)}hS~Y$NOb69>_&)|ko1Ry{Z6NC8b-Zin)M^7zx$|lWQ+hq@?u0k zFh!@fW^~$Z;2EZoC5?K&f3UV@7Wy^C5AC40*4j2(ZR4PWexF>d9b9Z}8^+jlH3AIl z#Jc)U>!R7FZpQY`$I7THoz4MO6yTy7Y+BRm9b>z_)4F4rCd4fCZuPf!wvEC#%hZkv zHKi~_X|-rFl%3W`;jB#2ZKGpAzx8`_j!7>Dkq-N@a`c3x#)swTnR1?idCzP}izfDs%(aR|!x-uHp8Ry7}mh zOP!qxdYR-ui1g;HOoD$_k>!rjuhrkV7#TY~?G0#*s+$Jpsu=C|UD^IKm4(CF+h}^! zs*Fmz?Ao!lFts3p1cenNNjjig(lLR|1%6OG8j^07vcUOb3e{iT`g~YAG z=u!Yeg0NBm^P5VasP;Fsrko6d?6%UXlFZepHeRK|46u!cZKaXCu5`>p<-{oXLX*L8 z5>Gb5Pq268W~VTfcV5J381NGP%>b1N)fkL@QNvYT=GF{0q!_9PLA50<_l9Y<5Bj6I z9?8+2O9Z7<-leaPcdyklz%Mjpm!KZV#Vpeogs=5#6$RLaSIwY6 z+k_3=-B8Me&x_iv{>6T#a!6@5lQOJSB_M^5vGpb`fv)2*(N-y ze0=M$zTGbrf?C^c9lY`Pk3NzTZdE=8@!Ce^CZR!!@GhYkZF5_xj4P?eq4XQL8&))` zXl;#|+cqh<4FoeL4Oj1G#O+Z8-BED8aI0cee)e|tQ6KrI`kQK{Rrse}XtYH!eHsun z17y2HPOs(ORSi{Bg_9J@AmKiGv9eWt)M{04RPIzNZ&!cUZf$pDVml33*`{>d-lZf6 zHC5dkJLco@+E;3r7bFxm@~y1NpB7(E6@vKUKJ zrF=@6pCmj1c!!MGzJNSUOwH=R#w~?M3CXxSLYb)6>d4ZTfUPOOYP$m_n=l~(u4SHr zVMjxWhL^^Gb*}Oc3Ehs8;SQ z-BHdTjie=@JvQP*LK#w6TQm^&Ql%=B4+8uPGOr|J8|emlz(f+Onzd0Ngq10cs#RJ# zh!uwvWVK)w!!@&WWZt=Zm?aBPt0mW6xzcQ-H!5zLw7ICs6iXN~vsL8x_O?vnK?Znf z3xLq@z)+joT5y8^B_5D=+Uo00yB1`@dP4$k12IFUISnHU)ei6-v#MdiGV0?EVYowz zDhWGsfxLuGKrbBa%6}lyAQ)PAI@#>)Pey=i2Zq+J7oysDa}{37B1p2HdiO7`T`Z6H zs-!_{M~Q_txoI%XLrNUA04r<1tziM2UIA#wae&3IlPO-H#Vs5!5^JdL$jM}*iH>H! z7i3R9VLj?;g%cZP8W=*fjP{U(%r{wd*0On|WZ3#a@sAIKUN{z~r}a)QdZaz(#~zCy z!C|VbXN|ewmfSaxi0vI@`lwg$O|5dY>ywd!@EsHP4Y<91cN__03M-?wchA}S_cIGn z7C0h6%1&cInUKwCK-!}aAQ}orFFL)9<8w5!Lc1Ml=uQ|rqX4K%zin+13~{Z}0+W!G z(fQz@K-;?4f>)-|P>9RQxEDi&p4{?XBI<8#ZB<)Ym~6K)=1QXMwA$Fj)(^w6#>6}% zO|o7&JV1T}W*d(VnrUPkzEP2xmu`2)cvSjpNN7pJjbd>u1Id9=rM8DDC|9qj~xxqZ2iKtgm=gyCLvCPwt|RO zh3P^MND%WC$=>g8G`sQM@&2(E^*|>XLU;-QP-o;ZO6rKQolNy9roKjBOztJ3axU7? zV<(RHntOYX_Z~l{hsW_#QW)G)(Fv?RQC3#2O{iB>&n@Hx<5Yo9Aj^Sya>E(QP@ovu z#dC>#@;LddyDIN)s3o&4e@CpA!FWV~BhM*0Z-KqL^?qHN|0IXU#q1Xj+D1mb!Wge( z7NStg(SjLbo0_BlH$>&&s1VhqYFO&&>YM^LLb3u(W3>B6ZIyxWj6>$oyuG;FZFXOo zF9)p5%0amnVmsw&qK19AQeX3-5VogracK6 zOA9unJWVZ^QGf=LLAp&T7xcqrECuLd?4FboxP%`!_qtNqIIGRPLb_?$ztBP_hQvk6 zLs?JcB%68@mt;|6$z3F|!a^T>8jud!k+88w1g6r+CILzVy`aABI5c8XMz<2K*^rY< zy5NU&X~YdUMW@8D;arPZJh$$~)7b#r&E*(-Z4@P-t?RN(0Q)ILi_5QUe817PV*OW` zX|MSUdxNR|mPKz%>7{(Ya`ckFOz%f=CvA>K>wLiG`=H9+ua2c>o83mdN$)c!JuG_3 zUq*b>i%t33RZ2*&crE=rz%CJsLITu-Utt#Ko_)`X36%ny%w!ei%UhRTdU1Lk$Cza^ z`wSklnYK5MOQNeJRWrV)oJe8n?2S5GobZ^d+jJ6vstC}V2DBIl;68=yeilZMDW(u> z!eh#XN_#1cjy%Mqo)%Mc=#Xh7r%vV;8W9Tx!-*vgB6|~vl*e=lHZlE4Cs@dv97PO# zGJ#Dm{lEgvA#Q;|&b=5Wvp^`ofm4cJD6yl)XKIek#poTjaOsGUOGi97;00%zq-U29 zRRB3s^R6SqLSc>$Q)fq*^?Z1rZ|^l zLXdcrV5y%YGa~)~(6der!mUMlY;;2|u%rpc4p8=ly`9k{c9v*0o4Z`M6-9MjS=+UR z?qr(kMV+io$bt@>Ogl#^q2`d;Py!0DKP4|oQK;4ObmrMW1xe^&i7Nyd9VB$!v4m5` zRrnTHbs9@WK9TQ^ZM#Uyx;DLaExPlTZjtBaieNM2>f8!Q%}${bw=qse5D+vjmKmK- z5!_QIqvIRof7H?e9oP15)0cvjUB^00eIT0)TUkY4(18m8(i?hu)vqLHmO7O~L(^H# zyxVlZhV-Q>!qYP+TGCrWrgwi0B5kS3W7D_1q7ne#)r3F%S)4Q7ZsY|YPHF+KkjD>vi zj8tYr>-Lkx9nkqt_@6EKXh~Fl5sSmpqAc{aK(6wWrC{4g+(uI_RxRj1g09ky= zrvpj@#7Jp5#Zb_UPI;t@Y;n3QEMt-ZOdwUv0Z^`FNVXzzeWIaE)tGL+~Wl8F?{T*f5{?&b#;=cyoG zk`f>Z%O}JQdHN`!Sa+{#SPWevv5<$>I33&bg*q968#>T8pipEy)jet8JbLO_A9(r% zMAa#m%R?FoF?_kC!CEr3NIVL!GM!if^9Y;?A8_e_I;ZK7=(JJ9^uS=c9`PdLA4W>( zuo_6dB!5yBcBB4q$NvzS|rGZm^CliK?X~uxm`*RLfE_{@5NF=r}5~Z8uihN zOrG!Jq&Js`v6wE{K&m0c(gI(YnYe&n7W>PX%=f`Me>jBU6OJHE#Hfpgd_e~Z5w;{9 z(us|wH_f9CA}_oAgijaK#f6zAN^XA2mxrkfP5i{28BTg>a3<6j$fIJ=KrkbT>WDS? zh36BVES@bhDLDxmh~?oD@#93RX89f+%mVi;-Jd7-fGi?O24E{&SULx=v;=>qVtJX) zFP~}EW{c^fs$NjcMaNMiZc}K3`?NHiK}atPqBqtOiZi*;V8a7j<<|#Xz6lh zfPp+FNk>yg)0PG^V}}gsAh7^JNM8?Yhd&_eFwk_yUu46v6}2g8m+9mde#aHl4jC@a zz;G1M9(JNOoxx0Upt~3@mWI<#nG9K4KyF)dCoCxqPq=sq(Fy^Dt5fEOr&9*|pJc&F z3E9#DL(ZI8d`ekBW487&I$SlArVBHt-7*chI23&OEY5hy(o(`^X2g;_)8v+j0mIV* zo&+qFN@qHpEXxbv-ZOh>&usl)6b-8u7DjAkpI1RrT3B43S$uAQ3v5{$@3{dk$~9v6 n{3Oh5IegxL&t1a*yMX@#m*EBXKQmHs00000NkvXXu0mjf- zyeJ>}DL_F~h{6=1C@MyAVkv=2Qi{@)L1igNc`BfaRH8CfP*ti?oj4Rv4Qf&g)us-0 zsfX&*fQB?ejcGztnxW>jpe3zPYueD3cBnla=tw8jnJ#pt8|qFEdeRH^rVoAThx#*s zfeb=}8NyJ85e#PpBS|38C`L1ev1lCQnZQIeiOEbM5lv+p)0u&0GK<;FL35eMd={XE zEMhTB2rXq9%N49ZD_O;A)}XblV?7(tMmDjTEodv-*v<~LlU=;RtLQae=MCOOyV=8D z_M!b8;2?+4TfEI-j-aC);~m~b@9{pzIYHz}PVoW3hlq~I$0nP2#o-_Y+|<2pA8ZgPv;{GmX9a)-Oz zL-%>WLmr{WJmD$N2tDToe-ZqR{^4K#dzr7mNgUyj73ri-=HynCQ#jfwtyE6!7>BJi zPV00|Z)I>sXL4pMi?ceLvs*cw)47ag=XM_FwemT?3%Hsj^PzzyBVYV0O%>Sk7R zw{T0hvRb>1+q#|A-W}Z0ovhC8;;!yyb$1W5Lh3mcm literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..709860ae00602e9eef7700bcf5322c212faf2283 GIT binary patch literal 2600 zcmV+@3fJ|CP)005{20{{R3m9qGA0000mP)t-s{{R3v z#jG*3q%pLdDYTR+q?9S7iy)+fDV&QKoN6GHgCL887=vOUdvh3bVi;mtmU-2M000TI zNklh0pNT$EX4sL*(X31zC&#(2T0kKe3n=);6lX# zT!r)9A@T`~eFKwu>7IU>p4CGBc|ruz{-(R9yJvP*k8@u8L;7X*+uLFNF=KKS;4ib; z2FwPa2MiHzK_AMuF5fN+V8QzHwp58qgtNXU-03s|>lB-WEUD>q>RpY%8mfRl~ckW=b7Zm37>@00Ow z-ztg#ZiYb|&iYH{+U-}+7e-sJKe_OE)3cXsqI|#+7LtJBfcJ5|_HTvUaB>EE)B#ESD-RcOb_Et7@keQ>(i8nV&30fzO#YZ>YBUR30GA9zOw&Sn~R zwAbvk+W+`Q@*3W85YkVHHk-}Vh~a|pL0=$EBSRSi*)%);M+SNe!~7)6X3{wr_lS)y zT%E*sngHXYxD>Bb7?9*EEPgoB*aZaiZymJL@D{d%V2tY*;YA#av_s&D9sh|p{QzDk zS}^~xY22C47w@~MB?|BY`{^DHUDSe0jfc{C(JzWI7BE-Z5$;J$ZeLk$IxSjZ&wYFC z|2-z;jk+>4abs(-w-na=&AqTS1Tb+ZfXW_a`y`gu-{CPme`q5a< z7;WV8uXWa^1f(1`Ovtu_8LaFB0<$3MA8@&OvE}vC4_VERKWB^10Q1-SU)`Di#%>5a zbls6Nr`+qDS4lpN!?ec1#qi#Mrip|&^m@%2tlm_B=Ph)U01UK1CE|}E7eg>10AC5n zP0QxJ2D<|?<)4VqcFe`;8YAH4QXQ0SD+$8@4H1k?+76Wx6E=VzK&~(M94w-(5>?&q zE;ZT*CZ~&*nWt%%0&!9UE}%Ldslx_gDTd1~s%p|n$90arZ!y7q+=qO0|Eg3K!n8#n zy1EBAt}7`S_K{UoHyjRffde1D6YV26Ohn^QwAiMwFop9w<9@j%%NC~)TiK~G#kU)2 zr2mhTIN>HZc_bE*oZJnA1^eKYBV4j20INfoC_@~^Ow$@y$)yfarbr%yD^o2R3LmJ{d?->Mr zw_l;W^{JvJ7^{j}2i3$&DetlZVcut$w~m5e3x=a`LXQhLPn+l5Cmt4Z28I_Zs;)hJ z!CPj^E@)p+D9apWoXv7>sPtqDZg{#jVI}}~t_c!@TCH3P8Y(C9PN)tK?4@y}6HZ}r zAw9M$A-)zk;bv#?ZbCm4PFi}kB~{6942!cECzg*v)^won@T&qAQO*kam|rdHpL4BT zHK;h&8+3Pdmbip^@cE3GHDW*oINnShdT(s+9P}JP- z(MsuC?uTI9NE$hfAf&C43$8$q8N|n%yhz?mn5S?tyHpR-@D8i{W7-G zD~lzh4CZnhFW!v3gWs=13Ay@MTz3Q9r1w}U1C-B{y`$jo0l1;cjCvcg*r}Xl7x|pM zj$Xt>K$}f5K-`La)~?-MLx)NU^@?_>roM3?vnNgzv^q@BeCsqeE-pp`duO(Z7FWE- z8E{wv6)3Q9_274OKd^w%EV?E-lzvJ)E$P0&g9R-*j5tKEvN$4-1BWG-QMhzkS+yLZYlUW3gnJ6YDRzS~& zizRb@GPDVmD~jAKC58Yd4FSK2mFiyazI2tw5w12H$d*wZ4puIZ>wRB=eJ^MQ&@#|; zS+nTTnF|)+QCUqDFTdR8Gh&k694bJap8xcv#LnTI-}PP4QJhXk-h>uYd3}Q~zw8xVeuN1cGqb~7m$X5zMl3*KfXdLL#PMIG?0ymw&oyF3V zyQxFA7Z#6p3_U~kPJDzqoxYieJ9>2(wE;rnXL<)QIB&YS8)r&k7ww1Xh|u!@_*h8V zrsrT{u;LM`W1p#-Db2yt(vT#&lDpoi+mV7wTm9X70Ye|1U#)JSQc@<$gwalBS>&8{ z5qPyWfJ2~TxY{p_^CcRWHf#ZSg|*a*`#h%S%91%0B3N?AN-zOoH(2vgMk*idm_6P> z!7JcTd~UZmj!v8m+UIZs9>=>uppkkE2m5TR+u(h<>)B9SL>!YhLj}H)*^8%Fnca}JYSzb7MPG*+h(=rXg&%UJWu^dLaBH77_zOPov@>h&`1s{ zAnz@VvVRm(?6K$kF8k(b%*v*Hs7DQra1YM{I_pu-Tpp0y5iXRU1(=4;#c#bjIk;IH zgXl*{j}nVG0iOy(t&}ja@6q*F#k%`A2XdvfrJfXu3h)UeFd%pA|7+VhTt>iS_`Zeu zCLirP#wi2wyCC|Tf$nUNTZtjH$*uYZ;hXT(ec7ct$nC3g%MiX6b%Y@K zZOxVf1kdrqk20}kp5`N-+HHzfy;4^4+>QHs2*`JhLA%C>^#3Dc5GW=u z?aT_Os{eHNt|FScqyVbBY<)^WI-VL~f&3o;a_kPL+48d(}igIv^;Jn|_(1tCA=g&j-mQu=4Stt$T7>_0}k&$5%@spXtR2`g# zrZa(x9Q(^|iqJ->IIgQiN8Jx*k zoQ=-mT+ZWsbO9H#i;K|3T*9U7Mtj)H-moWVcesqpxdL6uu5cAsqieX9>$o1>z>VC* z&FB_x!y5cUV{3-|K?50df_4^#gLkD|vo$m2YLp5!T> z<{9)X&+$Ajpci?GmwAPlS2@ICUQ>(?heP3Y-av2i7H{(odYAWjpAXQ7e8k6mf(_lp`Fa=x8_+^dmpJV=I+jR&i`wp)cPLIbx%3Z`7UrTxwi}5$9?5~?(YE} zC=c>r7r9s-;t~(_P(>xtFc0?#d89{qU^H4DpE+*w|J|!S#?ouv?;2$HbmPUq+@J@?P34` literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..637b9cf5a93f05f59639b81ff9a52ca6009dc9a0 GIT binary patch literal 5861 zcmVb^P)005u_0{{R3dEt5<0000mP)t-s{{R5q zoaWxN_SJjM)xGx3bIsMH=GBAM-o^jkz5msV-qoz`)oR7wgVoh@&CP1X^35>w000(n zNkl4<5C>HrC7bfAnmW<@>cokpv z(B;Ln|2#9^>H8FS`y`1=`OC?a zRq^Er@!wYTa_t}Szin6BGwHmRP?S)%6)>%Y4MQr(rLS*p-Tbvri}|0iulbvNOvhLZ z4Dn;RJY?pS@Y{Cv>r6VV#g$wv-U^uE!!90)vhz)dKR6?bsX=y^zsYLaJ!PU@Q6|jw zA@*NDzNIc4QUZ54tsuV>+WY&%Nk48(tCu7e>e z6ILaz(9}Mdm3^&%nRH*Ek`z;Ahy7pE7~i(lA&33hyAzfSV_5#Va?W9leWfV z*vP-xQ`rHS$-IBK8nMbl%>1xvv)(XWr*Q{A%?5kE%_%CaX; zpwhn$ar|xOuH*MFnv7@sukm9x@Oy8aVP1jSpL5}-jLo+z{n+9;B^;Nex6hlxaQSv@ z>D_^|fA_J8AviL_-$&EmtVl-{C6|8dYRFKwKkakI9DHXW0p!NLkMXeTZCVgTxc|wF zxYTp$>_7Y!0kQ}_G9O)AUXi4%qNFEeXTJUBHpI;5v~=cL*BmUOKDGCM=eYJInowGJ zs1Cs5S9<^BZ)i^J1^rp;8GIoHePJbYU&da{|9(5-aXi^wlW&KxZjCV(PO6b4Oj{8O zYE@sFHwVA?TMqc|^k?1~d{KPxby0c0O;%mTzHC99@LRGh-_eZl%;qvr`mN+B%v{i( zMk8hBxaM&V_|vm&ow=BLOdh?f1XGp^K=Zt@9Wj#)UY?oK61n5@sm6kgYuf0XG9mb` z)#g>lF`0%RI_#$(Ga2tpHMKmP2*>ny_+!?RiS+ip$&5>y7B`FsJ>SkX?o1Zva$!Ng zHqX|%g+68G5c}$v_8Gi0hn9YJCUGt%j%v?n2P!_SPs=C~gbX7esLda0+<~(wLgiY` zF$wU$KVxRu{pyGI!VrzsIebx?L?=_Xy@jTOzZ^%CIbUxA)EX+GN}~ z`&_)-091Iuqj+c30hQlWD>~+OS5fl%7{&3hAzi)yt$58DWG)+IrrdK%>9mr8_VAI> zVSIDmJS~2b*+L9wPaL_0f&YvHBCh?is^V)18)3~?#NUJ@wf*mE#TumLQyue++@+k; zMe$HLHd>f=Om$vPZ8YspVPL98h3v3}|_H zvoOxP%4hh}^7R~lQogHCo|-?YC1SQ36b#OTFWZ z`BOt!$2y|eQ7iAr?{5rNi8;Sk6fHRw&z% z5?My>?~f{BaH}Q-b>9|+=AV+^+L!L;yg+qhutdxU=E!SWE*wa%Bva8Z{=gjbRKSk3 z=OH_=3^|(bM7zNy3}_?K#L0;F?nafEAuJx_hWk=|nEtfpI5Qp+jFPbcb#r7Fb>BV^=1S*}&#hgV#CC0bz+@etDifO_IWt}qMJ=TC1*&xK zMrz2eE+lw>$_8rDQq^TbL_BLUb8xvU)EeVqSmKn}F_-I`mglx04Gb+D>?u9IN$e@B zPheEEfU#(45JMA^!!-t)yYLb2Wm+%rPH_%Dmuu(i=0t%XbDMlP$et6qPR`7LZqE7Q zQtVcZf{CCVuCW(SO}C@?@b(Ts0)Uz2N6IzxVm-?92~HLu_~w5>)7CWbbD*M${y_>R zg7&Vxe%o~jNs*~y;}l8d26&-EciiXT;7GVP|-hM$H%Zq2pm~0P=nDp=9|JF-?mq-OC!ldIBP)M8~3|H z#z;jA`NyOO)zX4QG6H@Np&5Wnd%7TkPVE1q|7&!0z^Er428SnguS2*&tuMzUh_#& zbWGXOb+O|fyi2=fGxo(?x^+P~ zBb9<6rE+`(*FEfp0~^1@MNHlCyLA)aZopOh+X&Uz&rj4P^It8M~jiv{rxw?1>d z0&#aPWr@vugtbIUs0y>#67XmaxfVceRiAqrk$D_0$}8?QtS zdqCtF^N$v%xkOue2fCBnzCei#;?1miZyDx@KjhB=@v`t`Aq+Oo{dZapdL z91wE??LCY#Zu)vAdl}iBYzY}<(qC4q72lllmX`Z*m9G*jmAZ}^S||rVEKSPNt%^8U zQXRHVFL6skRLg2c-{BfPe?4N+q$iQc3PdTB;*9Q#=fZ7W(r0!RO3buv`A`l~q%S1J zL@{7l7|#T8&&~HZmABs#>WE)FD$Nq@W+_33xT9R4b{`QpC2QjD(E0eAxm3!Ih5?2_dI^ z92W$NsX{3!;Un^CWGrBE_qM^Q9v&34ECO`k24E&eUv;!`|?;OJkZU7zEC`I(tJx&>E$FG5%bMUr zBq}1_r4U4R)i&F%@vx^X@xa(sSOwUO=dW3;S(SqMCBcVC1S`N}rB3tqG4E$aD_3q_ zX}+S!KW9g-B4GqqXxK93s$!2%f*7t)?!+xNKZRVcKa-!C5{rly&9Lbv#IPSh z!CIt*aigkJ94;)Csuu0(ny|pdJV}kqE-Q5>H6xb}2UFzo?$_W;#oM&>mfj)6!jj|i z?7W0v7B_O)Hu7Bef-DPTRCcAv5d>qbp9UagyrlW50K{YwpY*4>1l$_0=L!KzY@ot* z-zYu|`kzr$6h&-`MA?gS;?ANwdXEG^KLK(A21nfHf+ql*t%${tH(C!d6E46aL?6)s z05$Hp7diwGj+BL6iK)fz#uz37i?+vM@{C5q&mZAobiTvLkoSaXi86JUA2*a7m0SFa z@LcnPKygV#Mkk8Nj!ol`#1u^#p+@6?h88GOEL-dH5fnD91Dh7QSzm!L1)kJmuWPam zAx?XIFW2X{bTDoYMQdBN%J#}{7Xr-gqO`Yi2(qDAl!DiIAmwIwB4p6m2rO1#p6-PX zBiAo<9m1n%RbdFah?KyFiCX2TtXGbdB8bS8j2cErk~-UZ@jGrfn?W-J4JY^V<#D0; z45MF=5${5@sv}kvL=pw*gV+3va#BB11!br!2xvTy^HX@+E56>*e^5*kVuq0Hf=zB;S>Wm!JyW?B*Z`63uRAHZvY_8kfV+7ID`Mh8^O z68+YK-v^(ENP(0wDAa=S#opEtHoRwZ5d?`FHUKq0Xsu*NqiRL3Bt>WspIu|6NQFko z1FBRw>Ff&Fd=oI(ky9CFPi`$6aoMt9qd(# z%&JufthqL)O(GyoBsXDfc}g<~Q0H!C%3Zuxg%M(}oq1>?hyY(aWFYpGRnVnNMnGbY zE=(Wat9YM7kX9_YhkR9-fVI@TK*05iBDI~Q$S{99PLY=)i3Alws*Tvlvg&iDN|#D9 z23DUv0nZLz_5cmg*(z7HNitvn76SandZox+hy&{7=qlnb0HMk}K*z;`CVgIQBr6r6 zeE5_p7V+K|=iq)Ne4?Q9H8oc%-uA+xke@_XN!Nm8Jv`ANRcdizr0{)PsxiJPoFw|w zjg&TBkmVk}1a3s9$~VahxO7={-3=_7m2B*?gPf7Zs~Nodte020(Ki8dMB;P_G7)r! z^p4m0f+MN&5Jg8m_XCa_l~vLciDyNqb$MnKs}&)AH|bTEf0S zjZ5L`xNflf8^2&jJa^{7(Ag}y{R^t}q;4pQGOIKO1d z%D%EAvkQH^WK;GPMwv`A!BMZ9M%V~RyM?3uWnKTSvQB6O&D{d#{=ze}tMC*K816S( z!~I_JS=d2H;=u^Xte*Dvx<%j%-UxkAWcx{$y^`y7 zFS$NQk|ea?HK+g8*7W}%XlSEuT$t1#2n~b zOm(k(uLNtC-{j`>9e_nwYB+% z)cKM&lF(Y1CE-oQ+2$f!Q=>}?ij79sE*HKow3d!31EcbBa~ZI?6*ud(;&xy)T5&>a zaU1^5GxcqS%2#L>3a#b$8t|wD-&{)N!Em#kxwA#u+|CqQ8w5mm#KFzQ-h(z=$zX*& z+Z&;+_6FOdO-xs7t61>w(SSMB+<@7&kxkdmX0|}>N8UzK_Gu%DO>Lyw-fbjm$qUpV z<&7@r-EEC71oz0;QHn}hJf=e%@7L&Zc%zFPOQ066*NVHdqZJqNT5*Y2X~hZDWZrBR zhPF2g&)1uUQp^|I(JYLKyEY32+M4gJotg297&pGJhHD*g?;{4Atzu()t5}0*f`I2A z1yhyL`;O^0TF1hEhak3^*~YeJHo-|mQ^8TCF97X()?9Bix3?$Y5Cu~+(+57rv0FR7 z1@P4lnlv96F!+H1*|%NJz2Z@r-HtSD0e*+WI=daZr~~eGoJiXDIMHs$LcB7|D;{`~ z>Ia^7JGde=AN4!%k*#<4KC&fj9!6Zb-gIL4C5Otay$_WMbd1Bl#Jc>^Z%35}@&+B} z5MJk^gC?^#GyGwbbA#Env5IDEFOtD6iK8q{BM?=qYI=+FnUa zICN;|^#HpOI%3viDLDO8t1|aHI#%>rfOOyqL^Wn)+umHVFaDSgKD`zoKk6r4p+kQF vbRUphQp*g@dHO5200000NkvXXu0mjfv_DB9 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..cae5112e003a1b2d5924c329d59bd2231481a186 GIT binary patch literal 996 zcmWO41!ENi7>3bz$>>XO+v?$fOooC@X43W@LoYBP~)RB~+U_)TJJ(PXii~K#gcj6PluC zG^YjGD2JA`qBUwmTiO94+C|%F6KWl;qGjZSOnW*IC`m^;(V6rvbfudLyQ3cTq!+zW zA9CqS9?GYHe)J0!M1JH&-%xJ!iQds44PYRJ3_^n$LJ>pJForXNkt9YjT5F0aL8Xjg zEaT94CNLq!hsMR&7!#$Tk|>UeOhRQ$W(rf$G^R6ynIvX0Ticp52hF9Nc~qeJR8mDX zTEK#+j;c^)%#Vtg7b=g1EaEV9I7e_KN1>xRhGRJn9nT4z$VupA7PEw zRk1QwgqFv$SQ<-0i{lhda4R=uFPyY|bJ5T+ZYClwlX3wXEYp)}xEqz(zKq zO|daH#KmZRT*A6o8@iOsxST7{m0ZQuT!XIVIx}OJlkcZI2Ji? zJ9fph>KU7^dTSdG5gSd_Q$^X z1bxb9e9jl>OTOZ3zCqve9pCc<`jMabnP1Sa{KoJ6f&SzGfAKf^hkvQzAUedMI2bh{ zImM|?vkpYMGn{GFa+Yhmj#bz7T;C0x)zAqy+TO^G0058#0{{R3eVcu=0000mP)t-s{{R5h zoaWxN_SJjM)xGxBgVoJ*&DEsl-o^jbi{9S7|JAJS)oR7nbIsnI=FMuw#EaV9000`V zNklp4ba0m_Z2Bhjwibd>{eomRrTt;`|dsW-1|zBBpi&fOl26KEaAb&vGn*E_VMjw ze`OzckABNOU%zH^{w;32lZ(e5(=cYV>&whNjDE+ftfuQ{OsWGKOT%={@Jy!Jok(Ju z-RNEUj(xnkwaPxfeaEqiS8%hdsQG?JqasH8LIdF~?)a=L>{US4J|-qHQ%~9TvzZv1 zT;1wq*B{1;?4PC=ox)Ar``A(fIT|zA4n@AmKv0Z34Z1^QezQ>WRD?(9t3 zcoM|9#%;^tw6;4PO+0oLfM=Qpt_Z-0SZsO{W0y01j487-zhgeHoi;2V zXLncQ)Aupp26y<^^iW{kG!u1%$pOy4ZWx$miKqY+0XEF}EA0Bs%s`rb);I94tiNEl zF<_+c7F`Cs1zUba1{R0S)|+*VMVnhs>)#*TH`W}h+h?w@e<=q3$bN9_ zr;OXY?QU*U+<(Tog)ig2?&0?GeHUYV%8i%sW_Q|@Jrd2qA2z*82Tfo^%v6vu@7S}` z>~2o^n*E){PqQx0m+x94ev>}V-^b4{bF+H+{rZ!w0Vy*8qqh&>F`4K+?a54~+12S8 z@Z0j`*j;Y_D*q@fn3~e)!8_bh>WN~cDSxEO@~e1>C6k$pZH5wzVd^do!Ny8Y8$SLXyI~j8H*6Yp zEPk6@d6hek)h3=>NfY0tAK@8^g{;SXaGG5$#=72Pzb$tCioHYG@QnYGUGuG`ulZ=y zQiawz-VgWwQam?zlTrRiudH?(1ZQ)%J;xp+wwmux?DJgLAK7&qfNwje*m$5D$w5fE zAp4wc)iZhAyDWZ6im;p!uWlOqa+J+?iW}ED$Cd`#Cb{Ax@7aH0<1+xB^POVGR4*nV zAB~AMkHFL4FloAuXUwcFo9TUcg>`Xe1g7SJKou;uR%8lLH@yB#jU_uW|VIucW*Ld%eZa0 zjkx_CNb(TgiuEETc93WIH+ub3L-@%U zRg~M!pp5rheVa>LpYGv-|FI5t&HV+f>pcSwdQ5qi#-ni4F(_mPaar1kxCUm*+HATB zc$F9WfUt+h3tGMKTwz~9sJ~{v<$N`5%oISDRsg2J>T%SS*2f+*Lj+1~%?bv(fb-n) z_5})U_4s_oEo8XM(C^rFUhwhzH{kL#TP#4bGdh%Xfhrol2R(^VCU_}$R0q5YK*ero z4$1`BRcE}CrZU9eGoCrc`|O4SuZ%<9$Z_;9aa(>s6<~a+E~*0XYIn2hOyY6J{$-Ot zLgiij{?num2+o`jWp#Y&Cg}li=vkUzQ=e%gz`4S7c4@u7+z~28dsV`{0*i%$Op%ho zmn1b<ℑ{Q6GvQMkV$wS!nckZbr4b|1wi}!n(iDz*JyQfn)X+qaXU-#zwsWo1Z4j z(sjIX(}???65v}_UwoiW7-Q6Tpe(|I(SXud_ovqN7k09E)))k6v_)8I zj0GN|&|?vM6d{#!?84c7ct-11e5c_6#b>3BDThQNy4l7Ioo=L2Qpca(WOJ1?#Ob0a~gxM{Vq8R-tU znnBHsYJE+-`QEhAp7k`%wMhGn(EzmHSi(HxZEUiQ9lf)h`jxi4s4f46UC&7%alMKr z(qQLovmnf&c$xbJh+!zYxm2tVLCY)?vzI4tnnxGcQ-2MNjVQxU*$=A{%cK(vt`$fI z&Y#k^@k%E@@B1TujHt9(1fmyRS+&ZZ?KeM&!uNY_Yg(nx1qM zFE=|TuQZxULpLrvLZhq#1m(h^qMXRKk%=R3FCRVgdFPfl7xUefI+4c0tZ|h5ZP%dU&OShBPr(obj& z|Fesi>gTyWJ)1?MirgayZh6O6d^59MSGp{Sh&>}sZ#X;bhSgV@5*-Tm3+cM&a#~+t zZ~t+OMDbx8+kcEBDX4NN1>z9V7V(gRQ_eK|ZLTlogQ1i6O}TE2Z56yquAyU@DIZkk z{sBDp076$#e1&zvq3i-nN0&{hbAb0=>jG z?tK_x;#NXVXWzcPAQcCA=R25)db~TQ8tIS{q1Y<~nbFwnaQYx#W{SKk+@SS|lriU) zyqgm2DE32e{(=P;BX#x}i_K6ND`_LEkG%p1rSmyd4#@0LA(@7mdVio#%E33bBX%@b zgUe=ndT;i6AsG3TCEDc!cu;AhwX8S=U$3}6Ss}Sio0+LEixPre03Mp48@cK1%5B#u zpX0b`V_c?G+AlST?pB-89*xIm#~NChL5PiEGjX}wk~p!4L$Zzj;&e3Na~b>lK$b^~{nD2+v(bTp&aU@^ni@Z2J zmW}S?Bf{s!)~`8$+K0En z3$q7omX`W`-T=29Yfb?EvWpk^c6~1k`JVUQH`^E5#8_-B3YzA7zxnj|3`f#t<@UBF z;O3N_Q*89!W1OP%-e=rP+lD)C195EtT3hFg@r*Lf>1g5^)MWKlwqpB|NQzJ8c!6kq zrk|saK6BOSw5j7JYhgjLSxk=FRB;=^Sib`84fwj7cueYx!8`&y{Ux^o&Y8EIAod~i zU9?3to>{@YzHE}Z9=;#1bpSIUUpn?(W72b_%JWsSaQm3s2@bKikAp&4i??evf%{r9+Pnoy#jjcqre+&zv~^TvI;% zugWKZ94345XiZmBf$;ftHC4?I?A@+6tqzPw>M`wu^0t3#>@qy^C_h-4`Sl3!)H&SMwD1{KO{)H-vKHLy z23q4uQ}0t02{$6L{GYykqA5e<%1|}msdTHq*4A3q{n4?NscJs-NYh?sqdJEE9)O|n zx2ih-rix}oZ+E^-RMhOcuZ zm{e1Gc3I7Melb<(KDQg<&$7VtU$)`pNB2}TX7GHnvD{-rRuBz{U@QQS-g~RN<(Acz zzsR2-=eui4r%r&w?H)DZNlhs&$9JnaJ4sQvWml_wTb-+QfS&5f`f?Y!bwM9CF#=a4 zznSVjq0CNog?O!+E59uDZuRMv->4^K*`xZCiP-Fjuf{_;3f>~A{y!ozFLw3;B1^TP zJ}k>g;;Te~$nWo}Y0mkfys9QPZoYF~@ja^YYOc~#`T!!PgE&|jCNkj@T=>tv!Ae)2 z=Z6a29#v3Ds)6n|58_RNI=ixIJ}AnL@@^H}v^vT?!PbhtG)Am7$y#-3Os@==y}`@K z+gkqoZHNdiMTNAFdOQ2Yz&G#YYt@J6xb>l4)`oT6lO@(B{REhmb-fj9 z{odv;`t!BJ*$3O8_J}m>IS9wh@8N}7ZFB0Ama?PcTYmJSQ`Do{u&kRh#X9+4j;MaW zoY3V~ZBrj`O4HR^ZSCjX(R=>Ztyf-Rs3%k9<3ed;!D3Jg|M`FLYQCfF3~rRd(6?rOo!XiU3z zvbls*xVV0VXoJ+ZhLD7RYuB{k5jc`Uk7&KsIV?+>;ys&$Dh+BCO}q=HT)zb(V(GpM z`(9+3-}BNZ@)2UMeCd`=LXzK3Y1*(~AEprD|M^lc0JZg`|1-WjsPz=_vd z-(M{LJD$Jr$$|%#utSH+LnI{m_th0`GnoLHgiGh0pe~hlRb7NZq3|PW2qq>}|AVj~ z&VdA4#QClgkH>d#q6N!6#MPQ|??iO-h+l>~(TsRfL!nIxGMqUFgKU8Z;`rx!97^zq z``#-WqbN4{nxYg$|K?yhL;U%>j&c?$9T9GoWqoXErW7Q_{)nomz#DH#Ql$t#sVVzw z?d0M)*XHN0Ps3Iybg`Oi(Ujm3h;WkZ11I&R8B3E?|47)b& ztML!_LLS2&11i;-T?%eeJYb(*!E^cuFG?fG@96M}vR&GwRD}S=LW*daN9@9I63MWy zx5_A;NBo&DDq9suBRg@yeU8F>ri}&;Fh|%8({) zRChIh>zEn}*@aDt3IP(;DH%(R7j~&zL~KyGbUXQDycB`Gz?4==lLEY^5tYKW6@)0E z(5NTJN2-)q)m%N2Mn(p_JO3zepz~^tYVpc4CHj20coqg?f$m;P8tfISt`A2c z*&!U-IbOoE_!cZ9i6RvFR!s>35Q~1i|6w0RRipL847Od%}y48!3u(m?vtJYpc8hqFn7Yp z%1{V?ganbtXtq)aY(zQ_iv$O|9#B&iLM`iT(kUZV4(VBN=296B3}YwmIK{B-gz5c6 z35c8M7cxtiT7>FSf@@@uU~4Ks*<(9}z2CV_7~k_(dK(<(h@z~c#c$C>lM_M@ye_v? z*0R|wxOE9)TXG!RvM`_Rgg9KiiS`wm_C=*~NIv!opfPvLwv-)o}HJu+$3(o7w(F3l^zV^R)S@ zO(#X?ib_=01R$Jgp;9>)2oR2zJwl4j(OMJmBsyUfw;J4ryBXO%j)>~y9VRAFtsGI_ z4LeV&P*_pgg2u|DueMQn|;rsJiOqo+q68i`~$9MT_iFzsg^Xt&}TkKf~tg4KPMm z9CZB_#6FA$A{eL^I_PT4n`+`vr4rnckUSSq%31+<(N$68!oEPk>cL?dG4x>Xm7A*6^nqHx<&QF1sTP2ER2Rz_!Ee8nDYVM~eOlrek1P^;?LTDwT&UdHX zrUFBscmGV56R7h@b;xIr4M#Xq$g%!D{wW-e79>=wUJ%~HnK}C{~qHhuhv@Uu`s~q;Y$$KCLYUdS2 z3D&h4%})t64Ve>?LPLcPS?rHcz-gP0)GPcwhP7ZuUIU;Ok8ehjuLAPtYn3%hIu(Ew z6a=JV2%eRADL5vp4Ga8px2jy}^}yh=Mr~p~Uwi2|7a~6@?>v8gM;3%83t=516{f1^ z3#GE41UwBY4Ffs`Og;2{r9rnlqT(hqoWs zfE;B3SV8ZtwG3*gP}u3yo(o8B_CQlM8^{ViaLy-Ttb|P zXZe>PX=(b18`SZS@Wjhva9Ex2n=7u^)#wR|64qcQ7C>N$)&B^9jgQg{Fbb^%r7~4F zr$)*g(%d-@*@C(>sY%U*TW6_L9g_u>QX}WM)Iv*`P|fVt5HBc1vo&2d6G$g$JkpB{ z*Mcq})h2X>;{GKPTrD(|r-lPtcxpm7;74T2aPp+zgbQq5m`1tDE+Fv|R1!jtNO;mt z*F@^dsZo%H+CpwyX_v~K^W8!KTgwE9`LI1Cz>CzkX5BoNTdCP`pa7Nt{J;gQy@Zas zfW*M8hR!s+up+o6L}q{j zgUY+JkW?pxo|=;5-FsDK@Rx&{cyDKlJubTN{7VQi3Q(O1wHmc}8VNYPf7E(JRIGxc z?3}EpqNJ@gfB90tR6=W^22`;Sb!(r2hitk6gL(y1{AT+KL%wJB&JvB@-Vd@&N^A!Zgvrxx_+c+HTg6 zi9NBRUrZ$32?YZvB1oo+PLqlGt&&9PLxEu;fyzB4Z7oYnc%6V!eK<_Zpn+kLDIu|& z0bqzuUsBbh#$u2HGa>e&ruYrikBid(1t1YAyXVP?|5)As&z3CHTS4cWR&@r)rv8dfwzqNa*L=L)PjrilwMct^W9?mj^}ay z{|E5@`I29o=36AI9 zVzf2&C%CoRTFYDifOQ1V_V9c@VzmJeFxGvV$XN5Vwd=a%?RYhNUoE+kQaWHi#x8MV zEmBm5E-#@=b|RyU+H|7Kc49lvQ#6T24WeFZM${cISQLS#LD(Dx;Xy;NOW&^>X4sqH zo%OWn(s1ucLA%f%j)kpmx9lkLpo`Fjcfn9Eqm{pAh8up8Z&&eD!ONL$pY||QG%C3C zSgU+rO>)v1WFb{=CY|oMBo$caZ%95^L72MzNGDKIw(0`dVvU6t)nX92#7Mpf{F}Lac_$o7qJQ!91LY6 zqAYRCt`?Q$9#wGRR-6b9h7+{>de4vZJm-1ixsVhfNQgYLj+}hLI9|_)Oq4cq3&@KR z^9q$}i=tkLh!-Pa$XC?y@?^4c)g~ySn0N`UoKljMxLz5iTy6!bq|&SKiYaPGiJUSo zZb~P~xUE~{xu}XrCgevm`^)VK`HtUEZz6sy6U&-tyJkI9=aUmCRF_(x-xs1!XLR`sJ)H6z4%{5%hb>ez%;6_G^o4A=g6=E4(UR<8|KPP4O0Q^A0T$-sL?xo7mi_g7^7Ai55Q0;e5o$Y~d5} zDWCB$a-tP!TS=mwt)jg3XM3BX8f)ie I6KQq(A2#90!T004Ld0{{R3hm7Q00000mP)t-s0001L zdy86Xi+hWtdyB@I2u000N% zNklU4I5Je0gDFDk<0HYNHkW2+Yf}MXV3-tM#){f~KyK4C%90Xq9jV4q| zdmhxEEB{s*OteY|x|1$hZEloVve*470Vosep8%%}_|R<=JPi0Q>&FCm5A3x`?uNj-%0SK{+aeLh<@{tY=?v=j9%4^r*ZKT=^{nv?M z`;^PlI6Zgl=@ib1zfsDB(c&FNU>`fD_8NGQw z^Kjx7omYzHBo-QYMQcVXBtFSpckz4EeX6dqWfj4OghSF)vHvo>$7E6Wq1l`1m9@pq zi!_TgvvA&C-lSpJdAc8?DQvriS9VJ_Z|bJ(EBmlg3{T8?w>s&Nc^-JS$}C-W8-@LY zbwZ+cT9n_W+_OMd=8&nclPLU+^`#zg#=)ziEyA{WRnz#J$}P*wksFO8o|{<)pX1-< zzT0i~i`?+M7lgm39bE2wIoV~->;7$OC=_vdk!4$KSRVs(uC+7+3kd0K8v5TbDy7DZ|qKs~> zWmV=DmAyxeELI2SP-`4sT(!Dcn35#YqDvNEg_6Bpbn!ukv&!4_U)(|}@l7|pDeQi=_*6x0!d}EuD*c1DnrvD94g) zK7HscDnKte49=Bc9X20x_#oOH{JV_O0o7|-fWMG&XT0dU@Eo#tmis~hoM6cxJ%!1Q z)TineWi_R_PlrN5hhbPh&w;6Gp5K3jX4*!=-Oc58ap_J1F&9`BviJ4S&+ z-`EWuhk7)CzMLEw#HoZMSpb!Yso-V_3)nm2cf*L>)qo3-61K8~B6*i>xcZl;b9V~4 zSLdLKd^9}Y9BjEogh5Xt40rPN!D#!eFuV{mkmq25p?b#q)XFO6#jVwfd+m+EgdStP z_scnWOMEPBu)$Occ#FSAA~!(cRa&2xmNI-2 z={a)53K%_qK{9L7Jc>tKD_q`Vy>Im}hrl#w(150_^-+B15RwhgK_1(#l@7t+@B;_E zksZU|+n0{HT?MnhhFgxHsMXUAi^ClH*RH4oyP)+@378Dhwxk|Sun`GMggin+fT!t5 z{%Rry3^@Bx6+U7yBr1ePR@MCr;j;kr1u;CcC1cZs{WzDOv9yE*Hv5jS=KQfAfbDDY z#rYTjuPNB)Aps?AMRB#uXHGA^xgWP$fDN;XlJmhai#|s_hnvaR1+NTEqCJ|=@5203bX;CGs zFhp7Jm|!v58%w`p5TvRjOZ4;4U_=JFBKU?!7}CFxXd6CI5DQaB=Q?yDVoG*1ylQ|c zHX~BCvh`*f-q5E7kM!AO9RK`A%iL6j$ekaR3cJ`|g2eob?R;($@P zqe`y%I`s$)^519)izPI`A<87^>K%aIMrv*|{->Ngm7~9o6lcRPbt#`akhP2z^&NYo zX=BJ=6<#bc^T&@b!m@rZnknAF>w%+^)64ew|^VI@_}(6@U+Q^zo727C0SEB_EV@PN<(TH~897EJ+sNrK#{&j#S~tbFYIyp-ZY z9VO32$t`oZ;PGryumUaP@S$#!GvEk#CWZrI6j_pCrac_G^j?kT2!>S(m@68SaXrG; z#m~(rfKjykRp>dMAAEAq*K|txKvIH@Br{kHq_QGiER^lrIqs{tF;YXqNn1i)O_L?f z_z@!6*gckQ+dlvIJm`QycN+6he)a*zO+?&(NZf_eA723sG2_-rs)I1y`3r!d(YTeF zpv3TA<9`=mR0htFdcBY3lcHO2m&h3FsuVelAcx~1E@jN5965qn9LZ70(Nu5@$0EmZJhPdD9pVJp zcp@j^p4`xBaSEp*mCWTd<{?$gr<&6-3#efswPNH9&SVj1VV%u6oGYW}VV}uEz)a|1VW6Q-S;xrJNBk=y9tb~>@|;LgVCySN*<`v{sUgLG%z*$=vI7e6u}#Uni2Vh zA%0~KWy3Z9KYQ6{Dy$KH<9AQrANWW4Q-}UyKaOvJzxl`1{p*<~qDDRHRT;)opGK%e zYLxaeMy;_LtsbvGMv2vg{958PUUUFk{hA<}sN*zA$BRzTFv&VGpef>{YRIIiKV35j iW-4w_RI@Z&1M22TX`<$8o?7ip(#hgXQ9EA?B>W!;y3VWs literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c689f9009605362d887a4e9d21f1eb6c413bc058 GIT binary patch literal 2243 zcmV;!2t4004jl0{{R3eocQU0000mP)t-s0002y zi~q%H|HXslG579_)q#fUKvV@0RY6F0KuQ%zSAmXc zAfs~!aj=Ws#V!ci=S-e5!9#q}i63`?#SeMT`8Et~J5al(ZD@b{WxZa1Dxkqn>-7V) z_4=uTR<|8o-*)G5^j~)gc$$LE4w#~dVgNst2=41PfWsTXzS&5C1pcbQ3c%ir!&!r~ z8DIMYfg79i`qP%c_1D$5eYHHG-|`f0n{L6G|+=G+bE=LmMQ;H8Hy zEQ+!W;x8onG1>Z0wvw|2^B(l52MeF?6M`EK5jvp+5QpUm@pK&yfB_9epIv;)5TC!0 z$PnZDsjSLv9G0Q?Ap(d14pUtp{4Xti8FKC9zi=6Thm7}iUGuFlZU)(_bn)alZcXK} zBV9*5ToeFaP65P^Re)djAStXrj1fg>E?n5Q4crL9)7SHjU`Lr@h&u(s%^JAP4#7Cc z-)b%A;_(h02!PKFcUD;f<(y8g#bNB{V=@bJT=A5har^OfT4S-2O}80wA%S& z_yvI~L|2sYe{gB*+w7EPE7VsQfb)yF#|ffvTYz`U*2$>= zeTW2R)@`m8tgqm03`jq_5MZs>%5DlukK*v{Xr*{jASdN;5yyr(hY663g&J@Sa7SyI z2Cq}_5IS)R>H>;g=;y8a{V4-Nhzgvp5HNA23kw0ChZH0aLOiw+^j|U)L%f{@ZRIDOHn8iP1oSx~-mj5_YW)G}YCHR2nfju&bQe$IaqAI~aF{!qupN0toMu-6 zFGHUzIdmh~reG1l8+jn-K?yg4jp+wR0TwdN8N~nQ=0ylpz`C9XA;7Z*!;xyTMe|W; zTP0xaDB}dYCSXdo7L-nG4EW4rjMtwmXqH(T<|$a$Zu6bsDS|4(qm-lLvgAV<-C&i! z0qtKGQgH=jG=%B2x8pCkLbzq^TgnwLEQ9V)7_O@TzMKN z%k2ydBxN7ZwmCeUD5?m`nJxjx>oa8UlV_3Ew!WJMjkgocmZ4yc$)`heQyO+GiCQ3Add=fX>CY(TRAh6-w5(B zw}b4q9;^b06s|zA8jVfkqhUV%=Wqt)7@H0DQ6fc8LX{z>Er&pS6`>B=Rhb7RKocTA z^3V?9s*pN|ct}02NS!f;$Z=i_I3(b-2lL?g@+@)MojZW$`OJD;;?~n$DW%g9SXywG z0ik?`d5}WH^VtL}Gu|9Ha^Z|zj2=`Kb%_Pak(#)9hmE+D4_x|!|0pnQ-n^<)sM~an z1Q5IPtP6Auu%HN`hR2|E5mb#L)Z($pfRM6Gid*=;?Md<)I5RoE4+YIVjL)hC zgEGr57Y+8E7Q^!F_%5KBR|9^VEjZ=76v)8Ok0E81b{)ZFxMB%Ngs*?xF~Z9!({-x% z0i2dE0NC#7I+~S|lU52A3iM6QhRZNaHRz?iIeNH>2YnWs={*|FW24@d)RjHVSa34| zUm3i_BB?Vi56Y+}A##NBjw`kUpE&r0;HpGRK@n9Q>+;tz2Cz!F6ny2HRue-h{{Vy- z6EN40bc%6=t*9-NU0ki6eVYT)9%C>p#mmJaDQC4|^fs=8UD)&B!h^5r;;z8vJHaJ_ zA}0GqZ~N{o;39x`E9&)G#h5%f@Is=&C4o_tDH5yNP7ZkEpg^zi+qp*yaG}l1$)W%kcHtWBImL=8h~w%kcGt0)BSvPIC1|DF!o~5m1Cn3{RO7Lsf>R(D zAf?OTjgI}v#;!p6d!y!jTy8Z74rz;Pmj+FMiwt<51>=w?P%>VxKYm<9aB0C?cn%BA z923&vWpKS%JUl2csX+sVU05%z2lZsY*TY}gHMq3kc}!E)HK?9x2wXl0_?l}xGX7v` z%;XOl$-@_}t9kG)pe{fK9;$tvzUm3H55Uh~zI-Q$%Kl)%lE5$6{(2K=CvoCY%AW&> zF@6>qwDSaPlD^A=UnY&gfrmN`a005=TR9Md^f}*dX~ONC_co9x-z2`I58=sBy?}FE zlt1~RRHG9?;*Pl*RHM86@DAF0=jX@+m$?G(1j=|E4QF=wu!a19;5!dKe0ZloE=d~V znUhDAg2n1b27iQD-%r4snsn1Y9japC(TE`a8$rtXPvmC6%qG8Degk|RXV-+u11oNM zG%9ZOVFtY4@?bhYQjmvRKpE#4q2l)Gn#DPVb0EW@`V`4IxVhu$fY%EknW{cfow_7eD2ST~QHa7s zQbZI5q9`VcQ-YF|5~V3aG-X9O%2R=gB8Ey-rizHADsfa3@p!0C4N;R?)TWN8OFa^( zFB;I0Ml=>pXi77hix#w`6|F@Z5@}02(Vh-;q?71O7rN3-bf*VB=_PuTL?8N!e)MMm z1H~W)GlZdH7{eLCNHL1hjA5)8$9N`?EG9CE$xIPbnZ|Txh!nicWR{rC9Og1l%x3`$ zStJ&-grzJK%UQunR*BWDVJ+*#dN#0;O(K=eY+|;L%JfvkN z;5^8oP!4m%x~<7DN5wIYbApo|PT5Fne8HzVBhGS;^IQPGOd1!tBrX%+3Rgq8#&sL3 zup8(mx46w6BJOgJ_(aEjpVJ@210M3om+)9T;VI8}?%)M4Ne{$WBR{Wr%^UQVcf98V s`bY+!_)PK_8*NQe>Q}|N%r^($`N2;cWsTRD{)^xI;cvjY1OJfz13JB^$^ZZW literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0237efc2866ab3b04d2a8e651172f838a03559e9 GIT binary patch literal 2106 zcmV-A2*vk_P)003YF0{{R3XbEJh0000mP)t-s{{R3n zIfE%Nb08^d7$9007*Zf0N+1|PF)>OpF+nLQIVmYIDJdxc0000000000g))4k000NY zNklX-*MzN62_6jAOnICm}CYdGaxmt^7E>kfNCCeuXi=;asbl$0`SWF?z2V- z+>C;{{=ROI0Li(PRBmxd0POyu|ABH&WcN3UTLZl>e9_sJn<- z(7+VCd7Hw*@be}U(9C@OgTQ1GXhk-YSztBLBlxCV;2Fn`ud(fidT{bg_N!~T6#@Gf z!3X~VV62Gdq89N=3~~?e1X>XaZBG0EtOXRjm)~1}emyH#Vac^5j=+j6V%?VM)C!1d z>OQuU7CP({S5v9gYJ`? z;;}Y%;e!$*D|t<00aiAi-e^mOYC$N|wK8O*vZ|trgH~+_{z`Ncn^f|$EdGvNvtzFX{j&4pCNphZP)V+WBIJgZ5NyM$j3I0B*)qHZHjU-U$Fo|& z*IL}IG={1!5m!ZCMaPv~y24V-b_(c=SX33|RX~(w&B#E5aa~L91XUscIxc6Bja|@1 zAFJo5&u<2-0~uuodYb18F(okSYb zM0RkVs=H8yG}9OG&w^sa7@0P4v~<5GV>(S1a@BrLUUXJP|Y>WnjBF1pYrZm*@sU*8)5GnsZ=0B-1Q zIP^}VTohj$gRiE8V-MS*&7OU{4H7az%i^~zr1czGowaheAjSv=W4fkeu#4hz*iM2? zjh#Sx%LP3{%zZx$F4=A)i*UWx@LTQH=n)u58eAhwb3C{;WPxn8xp4w?3FW& z>fJE*Qk21RniYR;6Lfet^?3}rr#_0?12y7D-st$MUlgAqSbKDHOJ)h|yRje9C_0h{ zkOE{ofjAP~YaGMCZPMV=(=w`WLpRbbfJYU};m{{(p__;TevgZ-#y-|l5W}cz8j-Az zI4Of^fF>(SBoI!HxhY>sgjgAHF;Q4nox#CsVAWyTcWS9L$;!Ae<(T&Us1U~7W7tE@ zjfzl@EF0W%9GT{YDP}QUS_pI3L_AbG-4jFxH0YyWn@&px$fweWBe&(N**u$Vn{K?K zg+ttvtrh>e?f;>gxbLgHPu%?BO@)5`Qr+3U7?j1;Hr=rs@jPd&IKv%NL;myy^juXC- zI4N(zY{+4M*b{hkBhT{4U%yecH{ni~*URZJj<-hvj(TWu^&i3A9ZoN=kjwq}vjG!% z(U+?6`%&dR`~@(Bzd53y$?c^|NYZxk1G;AD>dyU*~ma{x8nPlF0oo6Y=@WW3IXaY7onInX-MK z`LMg^x)0&VDbG7>|DCP8JWH$($6siEI=_57pD(XZ zE|nQ~cwGoTu)oan^V5{MFJHbqKR?Nl`uzC#_>ckj5xDHL*Vq5R^tWlckrI;(cxV2d zwt2_TaijB9UJkq{Z|z@f%5RpvjoNMl4R-t2DfI~Qx!#Erq!I2!r(cl=41{3@;v64!uhxsL0(0o=$<+{`VJ z+{$g%VLNw3aVK|K@1Q|YefPp(=pN>9FCv0C?n^GUKbUoZ2f;%;%p*LSm&bVAR%Hbn zPJkzQil=!dnnkMB+8=O{?sm>o>*Cqq`Z=B_F7P5R@iK9RS9y)si5tAh$M`t$1fS$n zyhS|CXZS2{6VLH^zQ7lWmw1OS^A+MQ@9|Z>M!e4Ze1mTiZ}Dxu!*_}I_&z`2hr~zx zn4jM#>!eb zD~}?mU^KHB3y(FKBetvu6|IuRS!KkdidD60R^5Uc7H>7J7E;0k*0u!Zu4BoG=u+3} zS$&IWU=6Ji1~f(nnpjgyvSdq6L1wBov*v~t*3w#8YeO4rYwfJPp@Vg_PS)Ab#kyKI z>u%^_JuS_88G2hE>udcC>DJ!{*g(S|8*CXi#4yx`*>D?S7-^$yw2d*0wQ-hd;|&vR zqD`{NhAB4HrrC7E44Y}QY_?&J&9!+p->|?IT9z#`EVd=K)UplBY`Lwlm4;Qe+Sb@w z!#Z1U8*HOtlWn#ww$-rBw%ZQdY1n1EZI9(x#9rHH`-8*-L4)vvcE}C~DMt)P?U)_6 z6BcpOPTA?8+nFE@XYHJww+n`gcF8W=6^poP*X(+bc_WyF5-P4@Dyl+7R5+AgNYSAT z7F5E+0?My^k;*$6idPM&x~i$Fsz8+$r%I{_ zxujUdKqjh!%0uN;R%KK=J9N90O2*vju5M6Qbx~(^f;y^$+N&MZR&CT;t)P}_q2_7^ zr7A_qN`jiIi5jaB)KCpnU-h86O4MXcf+lK$#w!yVr?DEN(aI zf#yT=G*@#p8=9q=nxW|-P196O30t>6r`e``VY~KduX3trPuStzL6@jzr+0<4Q#-Uh z_U1NdtF~yfHifiN8?-*`-r1a6_ZMY7IHS`#l~*TqBJ5FC>_5k$V>+rMIt(4sK^@RN z=&oMT%en)-q!;yqo`;^(Z9S`Jpr>_9Pw7eM2|cdIbQ8Lv>$;|^&=pst1r+@Vi^tb-fpLzuSq2KkJeuaL~ z&-zJK;Z;0fWseJaC9mjZ!z2EmjUT@}}Md?HbQVr$*k;8+iRlujh4`V9DVpXO723VgCp@`*kHKHf8ZoR5W%@zFlYN5V(= za3AJF;X{1C@AJLz9N*)+eHVPE@9^!u4ZhX4_-5Y(-{>2By|06>^)006iI0{{R3mSp000wj zNkl=pNWhl_d`SS8^N;CBKV-zrY@#<)hIzU~OeR`2PYdk4EJa@P6tFS^h7; z56s^T<+Jra9RHNVayR-Hy#7Ak3_p+ioQSi|x%`if-hiE*GW_ZkNpA0lb>63(e*yQF z+t1VAY_s#_bzbHp?!%Z|+Hb&bJhXSOGv9c-w)uB}VwHivPo$rCX!9=sB_+EUjG+I* z+xHjXkFxqCWAt2IpY7j(=t!fTCu2U4lz)&pa4JujWU4h0kGYYz!E3Y$rB&B+#k}E{ z`pKb;i~_<|BhFoJ54*Yci@5t{cjF#C=C$=PnYlbey@U2ES|^9NcpZB%d&O6>c7GT3 z&*QrTUVXoh1pVrio=X2N>mMD8lQOynn5I0NZLix!pJSe<@*7J@wWw_f=6a?V!F|K% zya(ne2dm(22U&?Lclf%j65-vR5eJhZvnm?B>45u>a>eueBds<(laI!kWG|O^SJftU zH^Em@+_hItH4_le3wM&gj^t~uCi~*9bXjLuFencE*SuV-M2_?T2dDB%OPQwNF`sk#!5ivUBG)M7n9brk$~&Sc!^}G*|ww9 zL$c&p!{wuw17RY2#>XT3i~`+r%axtBA*+Zs6j02r+Bi~;il`oq(5x2M9A-7?A5c1= zn$V#JufTK^a0BJsq$YfAsQR1}0P)2fpz2u|A*70sJ446so(u^XViBJ?bifdRnMh8^ zuvP*(kPCPlmz-*h&L7T47r+oFK}rM+Js38UK*%AL29`*lVNDf`YD|orS-?;*Ih+-5 zc8!RnJk|%+#)@>BvxQcZV|iIqL&Hc;AW$%9G8s6r@d&090DsOhn{$DH0_q@*LO~f+ z0-6Lsgq$%k>{y2+0LFtuMa1K^gPXu8`W!p}5ud`eEvCSqn9M~1!4mPLDo1sm3<2mY z1`-%1yp+TxzQzhyy9tHq%aOAJN>GM=F!W#}_$_D0P6VJ}3c@)8x*S2EdDMz<_%&m4aa*L$pUjbjn#mRfamN zZg~MBD`Z%6;_%?8Q--MK+nqePKTY0A@-9F8PW`1ylgT%n$nFd@|&Moq+fUL_|nHbh85TvB*1Wt`4oikjXFr zJ(np5Hq9Gj%rLw+enFN zmZZIc*%>o5Kch=AM^@BuBcSGtPgRiCMnnYF5d^@ZfUGA@0(hio1}pG+4wJRVMBPV@ z+32_(urq9n;kd?-dsLYtUORHgHHCXKZ1Y0sSGf8rn!cN%EQW#A*R$Sc&YoIPM%(d2 zLq?05S&Tfxk&yDztek(ea4W-}Q1X_({Uf5m!x7DVZDf1_ws#bAKj4A8_2PR(F-QLbd_P7{%Cp1Xx#aZq=KawDe=(Hj(0Lr& z?~IR-%IDb;qC9f)1^DUH{3FA=jeND7fWICyo0iXu&x-#mz9uY`F98Iqc$mt0=)d)!|k(o{}ky8sK@q~h57&MsNH}+`26FUUk6$pH^YB(J9Oc1 zYi=FqkXHZ7s>)p-nlL`28?h39n{=TIdbfQh%M5wH8p~}|b$3DX(x1loFzydfP$!ma zUktk&MRDIle47})+*aZQ?TApoN3ciQMkt?V%7@qT(~a}LDxvG;AMSvAc2NH99z6U% zW&)aN|F#Hj#QXW_4>tmcv*Oc~jeoc6=KpFXW!*_9*1-B+#3WShMJpbx)dDD)HzM&BCx%%ThD}cIp-ufNG6S1IkBRc514mqti^nCqZ zI-og&uc@9EBO&+%GFbYje8xw|M_YI3XBIXGiE+WBGb{oyavt6vn5Bv#AnMeH5XjKd zXkY+TpH)KS6r=G2z*U=|MqEB1qEVC~yOdq66%128objeu$(U^t0HG3d4UX!73=18g z;^{IQw_ga;#U%6yiw7V|FT224F!-w%bW1=c9J)GhG2)$DN)P}Vh8&b3Dy)Qr5qr2@ zcAD58rG~XWgg#5hqnIHC>Bk(9QOFdi7l##WOvOejKQ%MJFn0q4A^Ym;;WLU0A);C= zD>>(b9zda`Rv`?f25PO~F|#32dBfPDa|IA#$WV-s09m>h&5u3S|$na_|skRYiNPVwsUC0eE^u$5$`kK3AqY}6Tw51TGtq~Ykpy>gI zWxM1;uU!!Y11CS^hc=Lo1S%+~!rX_}S&NZa(Gwa`qdkL&NI)YJ4E5}{Di_|UXjZ)X z8i=JSATIYQvTHc>B|~t~aVZTzufD)k&vdMWfcOfP9T>X&L`Vb-SJ$UP7D76&km>Zu3axR_4WYh!4QC=LFlvcQ(~ys06?V!hK82?f%CuCO@9!<3nlN*)hx(FG zG>py{5NHo2uK=(VNe%1FOR1)l+>v{8Qz^S z0b36l(@|Lrr+?FPvU13oq)mdQ-GE(pmIokmT{O#M2_9~TYci@7sVZ+ilxFn(4isi_Ekn%^U{Koh`mp`vR z4Y&dLX&%+~ZvFLu5617?e|Qc{>im_lkFdW13)W@}4U0S9zK%ar@O42w*uC2mJmUWN z@Czr;O)q~O+Z5OxWbB*>pUoDsE|R-7@WC+m-89=E)j_7WVE%gkXsg>@o`+OB_IPZ! z1Au~`?f1`E%M5oO?%gv(nRo&&kmsQcAT=SnAR-2zmzVL}W3@P8soU%DQJDHH^N@aq zrp9uqa8&n9vwLPh<_4YzpknOh#@ki7uZ~|E$ihdgt(VJhKvR}Fv+g|Z`yW|Ui)tB8 zMAQ=b33%+yc0^+#nU0>GB5y;;y&N6Lq5TGIZ$K=f-N8C=9s()&FO%dS4wTK?wP3)9 zX%wJw=U?9;l0K|4bo*1Vo0oXsSj*2oOwfMbwR}RP7-&VG!|7g|SjZaEbVYvn$HgIU znPB1O4gz{}xaJ|)FGwfqcrc9j9lLPDNu9lBV{ng@xCHPD)gJ0`d)cAcS(kn7$*&5)16!(f><^+Gm# z*nPYl!w)h6$&mJ4gnV}P7Y)VprzfD@)7mqHN(d%gm**d+!BE8?RIO~z+3J(e#rz%* zcnoU$2!`Y?WTty1-eWZRT8}mua`lWUO*WGvL@`$FKA9hzzDzpMlcx{Ntw|>DM?@{B z6BHs8onIl7A%1MQ5Zu~c7Hu#s0)K6cj0s~o4)5ODY$_t6Y3~w}6h0`}V*_4rDOy)C zGR&2Nk$RLQMpNqcSh>ID;D))BjTN7h_*4*4b@2$?vt?#CS!c|KrGH6R+*55e`jmoe zx;+Vx$93;wEjeB%oji4&Fub|(A~kwKJ{-~Lu)uubk!D7(3&>kqF-PWR#Ox4qD;|v^6=L;J@d;v{ZkzQO5Z+w` ztS5~(X!*pgWuhj8Ao5(!aDoFX*?>jI5Y>FyHt_KuHLhYnz(XTj_wp-4_a&(ZkUC^!AFEoea78OGVu_eVXl zIimq!fc#4s2{ePsVRT*^>yMrD1zyJP7U}X$8FCLJ9|}OvEEUZAWSAXaUdoWB~fr&3JpIVLna6Msp}VF6}b>Inf&38>(5APUSR8cncFSP&2Xix zn^p@@x;^#uz@Box^ef6R^vVgJ7Qx^$8LmBe&+7}Yb;nHRE~%U0%U@aZ6z{(Q<<0N` zS|8-U8OlHyAumg7F?<8+qvmsTCV1rVE36m8KaVk<+OSb{H;eu!i=k})%Q36I7ex>G ze+HZxmj8rdnG;W0v(SId@P7q-cJ6-_@`us(-!S}-LjHfoO-JmE;v9GY0000>F>Op!SRoAaFjSwT|imQ-G-y`arWqdRU7ddkA| z!tITVMMy^(^r0{Pu>K5SAcJJeWH3V*iiQEh89^Y6C?kE#CN>JoQO0O;(HO>($2c^e zdP%KJV$RZYtB`jqbrMWEk zEGAn)uq?z%R>>)g#>8sYu$FaVJsa4_Cb5|W)I~F-}bW4xBVOt z2RX!HD&p7?DyfVf6~{Qv2~H+tr#OwB;jB2vc`i`ZCa1#UT%;P+P|GDQqbnq+<0`tw zb#73P-K2qAG002+~0{{R3Y;$7=0000mP)t-s0002h z#s9s%|D?VDi>&r@obHR>|8wU5TGj4iwDwZ0-ddF2L6prwd%Y=QtRPa9co$Cv0009N zNklPzeiY-NMk z8^qoqF8@tZ?}-%cqCn9vu`DU($H&J<#UzAs^sx6KK5{thj|XxQp~2q~ZW;8$+wIP1 zD(=M#z3hC#H$K{Mp}-Q-i2^g&c6s&+%^FbQDI*|6AqO$4Bd;Z2G7**rM27Vy-k>4J z2~Cd2K(CBqp9?-?LLDkiBoE!{Kv)juhjRlegvxUmmJlk=p^Oa(TusV<>gJWczakx4 z!nWN$Z`&bjf%mX8)tLb?W}Fx13aZxduJ)!7$FZa9j>3eCoF3=|iN*_6RSVF)a${$9 zV+bSg;q{4 zAao}>IY$W2c2}4r?|qFJDY6m?+QOkw_|~$>Wop%uyv0t_v?x9lS#c+9cOD%Tx;Kg; ze55b+AS^_uvBHuaz5su4ghs9+A;~DUl3xl`=l7)|RG4Mfb2)hsd>0mZ^-$VCW3`5? z=J_P-@YU=`81H+92`nu80fi|vrOB zO@(3$IrFOG2awtaAPnU3v2E$Gv)2m{o<6_2%Y9AZmG>pJIv@ fqM`p6{yW0opawBu&&AE literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..74f6bdbae5098967cea09a85266fde638285afcd GIT binary patch literal 760 zcmWO4g?|)u9LM3$?{>HCw!vAd-T?(E}vJ0F-Vp zXhf+IN@IY95`uIcNUEUw7oOJ>2t`N^4-t3?`f!m%5sm!B5K9~?LQ&!gpahDMNO6=z z2}+WTH-%D^mMeqGQjYR~j8rO+hSI4>B`V`Gs6r-La^7qnpsM`UP<3ihlLt`_wWv)U zRF`_xrvWaPhiFJpPK{_x6PlujX~rWo$NMOc@p#ZZfm+a#RTxYuA)RkxGMjm>W=jcuk)RSI3&kML0d5M>KC0Ms0>{|PK(}!14UtXgh{m}ph zGKj$>zs`_w<_R~HH^iH~#oG)MA%-)8kzy318N*l)`HW+HUd;*O9VRk~$@y|qcvo&J z?}_*MfDf4_2Bb}A1|Nx!naM0>i#g0?9`j>Zz(U&l8)vRGH>+r4T3pP;y%R<_(*vKZi&1ef-DPS9s+u6a+VD1#(*YFMPcCnj1 z9`>@2{kQ|-Am8#G--{nO#9@AfpF+7m^9#R*m~ez6X}|G%Do2@djN@u}Lj1u=PVr|9 zr#T~cR%g$}ah?m|VPVHbaf!=Z;i?F8jqCgsa_Kj?$t`Y+JKW`O{uxn_^Dp7$RbwM;^j|h6TlLbSj-ZwxGc#^SV@ag wMzWCvSiuzKccR{%m4rY literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..83a9f22ff5513f00bd27f8ff14c058005b7ce3ec GIT binary patch literal 2174 zcmV-^2!Z#BP)004jl0{{R3eocQU0000mP)t-s{{R3= z7yv;S06`!KIT!#r7zi;K2r(D{F%SSL5CAC%03Zke7ytke000O800000^yNw}000OH zNkl$!$BW8u6NK=I0)zy7civPXyyH7Jw<2)I2=mR*^n+X;NYwX7DzJ{2D<4^ z3HpNo{~q4{A|Ah%|-{Jn0TaMVad zAq&Nb`0!Hq{{wwD%W`n=7-dQ!&!CBmH+%%ocw4--&WK3BL|1@(e z0NNT9p@Yp@OtVh&=lV~jz)&s;4j>9bUW2`RuZ{R28b*sqc7r;$h6%l>lVMocg{DE+4aDG(43k#erXBcbz3gk#H(s3)o;HaH<0NbPpq+U79C88Svwpss z4P?rjb3HQ?$n6am4cZ&7w~Se7MmkhL$OYxQPVPhqX?A@iJ;ypluZ{Ix5H~F=xpSJrHT!cg?uyB1R*)<4p+v|tDBTzOPM_GNO&6MiE=1I`>{dZi==q{Sh zlgvCbF&!NsAO3-pK*4w#L+g~FCSIKOWQ+28PXpK z_d$Hofu%t1OE5h7O@kLU>E#Ac`2QBD>HZx z1CK;%68E{MaWU`}y=k#uZ=={1s0u*cWK7tVT(|70e^;T?L z9Jt~$=?h%+ArPo+(g%pwkR5CU2<&p;*GdODPw&L?CiGx;?Ac>$Uyn)qIiY zJQZ#YnC8IvuR>ra9CNSb?xP{e>f@ECA|yh6f6WeU;7+~XfW68B<{?%EHx`_W$;lxJ zrv+nOs2LHJEQ*&egd&y$XT#QEvk+K&Kjx>CWI>n10^r6Ivt;<8{;~kL%Wm^+$^d3d z%vJ%n0+`JHWRhs{4pez)?4l=7xvUZ<2@hU&Q(ZsV7mHBryWeU#_`yUZfXD_3FhhAtuRd&_vZw- z-yMUxf^wbPvwG)hYAiS&$s%y&{W(b(K<_oW<2kflnZuz#E?3Pw`TxcQrWm=# z5v(od;~cb1GY2T%cAZ~Xz*J3#DruaHECi~cR)E>SZ6VNdKdJn+C94#;QAZ@gQ~udL z61dGGztZw8=V`zDtg8X--#X~Gj`NO*!;)C^m#37Wqnzjfnh#39cL2?xXf;NmU0{Q|MZPTtm&b`Jy^P0ZoG{V67`68&^qTLV)>KOBV(Y zL|PTASG2hhG!+!@sqBB?_nV5&(*b4v{8xeh06?We>5$o$s{jB107*qoM6N<$f;6Q1 A^8f$< literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e6227db9c9d8e449155452362f88ca325272b8be GIT binary patch literal 1000 zcmWO4heODD0LJ0BK~$(v*`Js1k5E#Ptz=X7UPYnoO&K|E@9hR|@4a#R+}?NG-h1D1 zd!Kv$h9_lvoD@SWam1qrG$esWs4}igIv^;Jn|_(1tCA=g&j-mQu=4Stt$T7>_0}k&$5%@spXtR2`g# zrZa(x9Q(^|iqJ->IIgQiN8Jx*k zoQ=-mT+ZWsbO9H#i;K|3T*9U7Mtj)H-moWVcesqpxdL6uu5cAsqieX9>$o1>z>VC* z&FB_x!y5cUV{3-|K?50df_4^#gLkD|vo$m2YLp5!T> z<{9)X&+$Ajpci?GmwAPlS2@ICUQ>(?heP3Y-av2i7H{(odYAWjpAXQ7e8k6mf(_lp`Fa=x8_+^dmpJV=I+jR&i`wp)cPLIbx%3Z`7UrTxwi}5$9?5~?(YE} zC=c>r7r9s-;t~(_P(>xtFc0?#d89{qU^H4DpE+*w|J|!S#?ouv?;2$HbmPUq+@J@?P34` literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..637b9cf5a93f05f59639b81ff9a52ca6009dc9a0 GIT binary patch literal 5861 zcmVb^P)005u_0{{R3dEt5<0000mP)t-s{{R5q zoaWxN_SJjM)xGx3bIsMH=GBAM-o^jkz5msV-qoz`)oR7wgVoh@&CP1X^35>w000(n zNkl4<5C>HrC7bfAnmW<@>cokpv z(B;Ln|2#9^>H8FS`y`1=`OC?a zRq^Er@!wYTa_t}Szin6BGwHmRP?S)%6)>%Y4MQr(rLS*p-Tbvri}|0iulbvNOvhLZ z4Dn;RJY?pS@Y{Cv>r6VV#g$wv-U^uE!!90)vhz)dKR6?bsX=y^zsYLaJ!PU@Q6|jw zA@*NDzNIc4QUZ54tsuV>+WY&%Nk48(tCu7e>e z6ILaz(9}Mdm3^&%nRH*Ek`z;Ahy7pE7~i(lA&33hyAzfSV_5#Va?W9leWfV z*vP-xQ`rHS$-IBK8nMbl%>1xvv)(XWr*Q{A%?5kE%_%CaX; zpwhn$ar|xOuH*MFnv7@sukm9x@Oy8aVP1jSpL5}-jLo+z{n+9;B^;Nex6hlxaQSv@ z>D_^|fA_J8AviL_-$&EmtVl-{C6|8dYRFKwKkakI9DHXW0p!NLkMXeTZCVgTxc|wF zxYTp$>_7Y!0kQ}_G9O)AUXi4%qNFEeXTJUBHpI;5v~=cL*BmUOKDGCM=eYJInowGJ zs1Cs5S9<^BZ)i^J1^rp;8GIoHePJbYU&da{|9(5-aXi^wlW&KxZjCV(PO6b4Oj{8O zYE@sFHwVA?TMqc|^k?1~d{KPxby0c0O;%mTzHC99@LRGh-_eZl%;qvr`mN+B%v{i( zMk8hBxaM&V_|vm&ow=BLOdh?f1XGp^K=Zt@9Wj#)UY?oK61n5@sm6kgYuf0XG9mb` z)#g>lF`0%RI_#$(Ga2tpHMKmP2*>ny_+!?RiS+ip$&5>y7B`FsJ>SkX?o1Zva$!Ng zHqX|%g+68G5c}$v_8Gi0hn9YJCUGt%j%v?n2P!_SPs=C~gbX7esLda0+<~(wLgiY` zF$wU$KVxRu{pyGI!VrzsIebx?L?=_Xy@jTOzZ^%CIbUxA)EX+GN}~ z`&_)-091Iuqj+c30hQlWD>~+OS5fl%7{&3hAzi)yt$58DWG)+IrrdK%>9mr8_VAI> zVSIDmJS~2b*+L9wPaL_0f&YvHBCh?is^V)18)3~?#NUJ@wf*mE#TumLQyue++@+k; zMe$HLHd>f=Om$vPZ8YspVPL98h3v3}|_H zvoOxP%4hh}^7R~lQogHCo|-?YC1SQ36b#OTFWZ z`BOt!$2y|eQ7iAr?{5rNi8;Sk6fHRw&z% z5?My>?~f{BaH}Q-b>9|+=AV+^+L!L;yg+qhutdxU=E!SWE*wa%Bva8Z{=gjbRKSk3 z=OH_=3^|(bM7zNy3}_?K#L0;F?nafEAuJx_hWk=|nEtfpI5Qp+jFPbcb#r7Fb>BV^=1S*}&#hgV#CC0bz+@etDifO_IWt}qMJ=TC1*&xK zMrz2eE+lw>$_8rDQq^TbL_BLUb8xvU)EeVqSmKn}F_-I`mglx04Gb+D>?u9IN$e@B zPheEEfU#(45JMA^!!-t)yYLb2Wm+%rPH_%Dmuu(i=0t%XbDMlP$et6qPR`7LZqE7Q zQtVcZf{CCVuCW(SO}C@?@b(Ts0)Uz2N6IzxVm-?92~HLu_~w5>)7CWbbD*M${y_>R zg7&Vxe%o~jNs*~y;}l8d26&-EciiXT;7GVP|-hM$H%Zq2pm~0P=nDp=9|JF-?mq-OC!ldIBP)M8~3|H z#z;jA`NyOO)zX4QG6H@Np&5Wnd%7TkPVE1q|7&!0z^Er428SnguS2*&tuMzUh_#& zbWGXOb+O|fyi2=fGxo(?x^+P~ zBb9<6rE+`(*FEfp0~^1@MNHlCyLA)aZopOh+X&Uz&rj4P^It8M~jiv{rxw?1>d z0&#aPWr@vugtbIUs0y>#67XmaxfVceRiAqrk$D_0$}8?QtS zdqCtF^N$v%xkOue2fCBnzCei#;?1miZyDx@KjhB=@v`t`Aq+Oo{dZapdL z91wE??LCY#Zu)vAdl}iBYzY}<(qC4q72lllmX`Z*m9G*jmAZ}^S||rVEKSPNt%^8U zQXRHVFL6skRLg2c-{BfPe?4N+q$iQc3PdTB;*9Q#=fZ7W(r0!RO3buv`A`l~q%S1J zL@{7l7|#T8&&~HZmABs#>WE)FD$Nq@W+_33xT9R4b{`QpC2QjD(E0eAxm3!Ih5?2_dI^ z92W$NsX{3!;Un^CWGrBE_qM^Q9v&34ECO`k24E&eUv;!`|?;OJkZU7zEC`I(tJx&>E$FG5%bMUr zBq}1_r4U4R)i&F%@vx^X@xa(sSOwUO=dW3;S(SqMCBcVC1S`N}rB3tqG4E$aD_3q_ zX}+S!KW9g-B4GqqXxK93s$!2%f*7t)?!+xNKZRVcKa-!C5{rly&9Lbv#IPSh z!CIt*aigkJ94;)Csuu0(ny|pdJV}kqE-Q5>H6xb}2UFzo?$_W;#oM&>mfj)6!jj|i z?7W0v7B_O)Hu7Bef-DPTRCcAv5d>qbp9UagyrlW50K{YwpY*4>1l$_0=L!KzY@ot* z-zYu|`kzr$6h&-`MA?gS;?ANwdXEG^KLK(A21nfHf+ql*t%${tH(C!d6E46aL?6)s z05$Hp7diwGj+BL6iK)fz#uz37i?+vM@{C5q&mZAobiTvLkoSaXi86JUA2*a7m0SFa z@LcnPKygV#Mkk8Nj!ol`#1u^#p+@6?h88GOEL-dH5fnD91Dh7QSzm!L1)kJmuWPam zAx?XIFW2X{bTDoYMQdBN%J#}{7Xr-gqO`Yi2(qDAl!DiIAmwIwB4p6m2rO1#p6-PX zBiAo<9m1n%RbdFah?KyFiCX2TtXGbdB8bS8j2cErk~-UZ@jGrfn?W-J4JY^V<#D0; z45MF=5${5@sv}kvL=pw*gV+3va#BB11!br!2xvTy^HX@+E56>*e^5*kVuq0Hf=zB;S>Wm!JyW?B*Z`63uRAHZvY_8kfV+7ID`Mh8^O z68+YK-v^(ENP(0wDAa=S#opEtHoRwZ5d?`FHUKq0Xsu*NqiRL3Bt>WspIu|6NQFko z1FBRw>Ff&Fd=oI(ky9CFPi`$6aoMt9qd(# z%&JufthqL)O(GyoBsXDfc}g<~Q0H!C%3Zuxg%M(}oq1>?hyY(aWFYpGRnVnNMnGbY zE=(Wat9YM7kX9_YhkR9-fVI@TK*05iBDI~Q$S{99PLY=)i3Alws*Tvlvg&iDN|#D9 z23DUv0nZLz_5cmg*(z7HNitvn76SandZox+hy&{7=qlnb0HMk}K*z;`CVgIQBr6r6 zeE5_p7V+K|=iq)Ne4?Q9H8oc%-uA+xke@_XN!Nm8Jv`ANRcdizr0{)PsxiJPoFw|w zjg&TBkmVk}1a3s9$~VahxO7={-3=_7m2B*?gPf7Zs~Nodte020(Ki8dMB;P_G7)r! z^p4m0f+MN&5Jg8m_XCa_l~vLciDyNqb$MnKs}&)AH|bTEf0S zjZ5L`xNflf8^2&jJa^{7(Ag}y{R^t}q;4pQGOIKO1d z%D%EAvkQH^WK;GPMwv`A!BMZ9M%V~RyM?3uWnKTSvQB6O&D{d#{=ze}tMC*K816S( z!~I_JS=d2H;=u^Xte*Dvx<%j%-UxkAWcx{$y^`y7 zFS$NQk|ea?HK+g8*7W}%XlSEuT$t1#2n~b zOm(k(uLNtC-{j`>9e_nwYB+% z)cKM&lF(Y1CE-oQ+2$f!Q=>}?ij79sE*HKow3d!31EcbBa~ZI?6*ud(;&xy)T5&>a zaU1^5GxcqS%2#L>3a#b$8t|wD-&{)N!Em#kxwA#u+|CqQ8w5mm#KFzQ-h(z=$zX*& z+Z&;+_6FOdO-xs7t61>w(SSMB+<@7&kxkdmX0|}>N8UzK_Gu%DO>Lyw-fbjm$qUpV z<&7@r-EEC71oz0;QHn}hJf=e%@7L&Zc%zFPOQ066*NVHdqZJqNT5*Y2X~hZDWZrBR zhPF2g&)1uUQp^|I(JYLKyEY32+M4gJotg297&pGJhHD*g?;{4Atzu()t5}0*f`I2A z1yhyL`;O^0TF1hEhak3^*~YeJHo-|mQ^8TCF97X()?9Bix3?$Y5Cu~+(+57rv0FR7 z1@P4lnlv96F!+H1*|%NJz2Z@r-HtSD0e*+WI=daZr~~eGoJiXDIMHs$LcB7|D;{`~ z>Ia^7JGde=AN4!%k*#<4KC&fj9!6Zb-gIL4C5Otay$_WMbd1Bl#Jc>^Z%35}@&+B} z5MJk^gC?^#GyGwbbA#Env5IDEFOtD6iK8q{BM?=qYI=+FnUa zICN;|^#HpOI%3viDLDO8t1|aHI#%>rfOOyqL^Wn)+umHVFaDSgKD`zoKk6r4p+kQF vbRUphQp*g@dHO5200000NkvXXu0mjfv_DB9 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..cae5112e003a1b2d5924c329d59bd2231481a186 GIT binary patch literal 996 zcmWO41!ENi7>3bz$>>XO+v?$fOooC@X43W@LoYBP~)RB~+U_)TJJ(PXii~K#gcj6PluC zG^YjGD2JA`qBUwmTiO94+C|%F6KWl;qGjZSOnW*IC`m^;(V6rvbfudLyQ3cTq!+zW zA9CqS9?GYHe)J0!M1JH&-%xJ!iQds44PYRJ3_^n$LJ>pJForXNkt9YjT5F0aL8Xjg zEaT94CNLq!hsMR&7!#$Tk|>UeOhRQ$W(rf$G^R6ynIvX0Ticp52hF9Nc~qeJR8mDX zTEK#+j;c^)%#Vtg7b=g1EaEV9I7e_KN1>xRhGRJn9nT4z$VupA7PEw zRk1QwgqFv$SQ<-0i{lhda4R=uFPyY|bJ5T+ZYClwlX3wXEYp)}xEqz(zKq zO|daH#KmZRT*A6o8@iOsxST7{m0ZQuT!XIVIx}OJlkcZI2Ji? zJ9fph>KU7^dTSdG5gSd_Q$^X z1bxb9e9jl>OTOZ3zCqve9pCc<`jMabnP1Sa{KoJ6f&SzGfAKf^hkvQzAUedMI2bh{ zImM|?vkpYMGn{GFa+Yhmj#bz7T;C0x)zAqy+TO^G0058#0{{R3eVcu=0000mP)t-s{{R5h zoaWxN_SJjM)xGxBgVoJ*&DEsl-o^jbi{9S7|JAJS)oR7nbIsnI=FMuw#EaV9000`V zNklp4ba0m_Z2Bhjwibd>{eomRrTt;`|dsW-1|zBBpi&fOl26KEaAb&vGn*E_VMjw ze`OzckABNOU%zH^{w;32lZ(e5(=cYV>&whNjDE+ftfuQ{OsWGKOT%={@Jy!Jok(Ju z-RNEUj(xnkwaPxfeaEqiS8%hdsQG?JqasH8LIdF~?)a=L>{US4J|-qHQ%~9TvzZv1 zT;1wq*B{1;?4PC=ox)Ar``A(fIT|zA4n@AmKv0Z34Z1^QezQ>WRD?(9t3 zcoM|9#%;^tw6;4PO+0oLfM=Qpt_Z-0SZsO{W0y01j487-zhgeHoi;2V zXLncQ)Aupp26y<^^iW{kG!u1%$pOy4ZWx$miKqY+0XEF}EA0Bs%s`rb);I94tiNEl zF<_+c7F`Cs1zUba1{R0S)|+*VMVnhs>)#*TH`W}h+h?w@e<=q3$bN9_ zr;OXY?QU*U+<(Tog)ig2?&0?GeHUYV%8i%sW_Q|@Jrd2qA2z*82Tfo^%v6vu@7S}` z>~2o^n*E){PqQx0m+x94ev>}V-^b4{bF+H+{rZ!w0Vy*8qqh&>F`4K+?a54~+12S8 z@Z0j`*j;Y_D*q@fn3~e)!8_bh>WN~cDSxEO@~e1>C6k$pZH5wzVd^do!Ny8Y8$SLXyI~j8H*6Yp zEPk6@d6hek)h3=>NfY0tAK@8^g{;SXaGG5$#=72Pzb$tCioHYG@QnYGUGuG`ulZ=y zQiawz-VgWwQam?zlTrRiudH?(1ZQ)%J;xp+wwmux?DJgLAK7&qfNwje*m$5D$w5fE zAp4wc)iZhAyDWZ6im;p!uWlOqa+J+?iW}ED$Cd`#Cb{Ax@7aH0<1+xB^POVGR4*nV zAB~AMkHFL4FloAuXUwcFo9TUcg>`Xe1g7SJKou;uR%8lLH@yB#jU_uW|VIucW*Ld%eZa0 zjkx_CNb(TgiuEETc93WIH+ub3L-@%U zRg~M!pp5rheVa>LpYGv-|FI5t&HV+f>pcSwdQ5qi#-ni4F(_mPaar1kxCUm*+HATB zc$F9WfUt+h3tGMKTwz~9sJ~{v<$N`5%oISDRsg2J>T%SS*2f+*Lj+1~%?bv(fb-n) z_5})U_4s_oEo8XM(C^rFUhwhzH{kL#TP#4bGdh%Xfhrol2R(^VCU_}$R0q5YK*ero z4$1`BRcE}CrZU9eGoCrc`|O4SuZ%<9$Z_;9aa(>s6<~a+E~*0XYIn2hOyY6J{$-Ot zLgiij{?num2+o`jWp#Y&Cg}li=vkUzQ=e%gz`4S7c4@u7+z~28dsV`{0*i%$Op%ho zmn1b<ℑ{Q6GvQMkV$wS!nckZbr4b|1wi}!n(iDz*JyQfn)X+qaXU-#zwsWo1Z4j z(sjIX(}???65v}_UwoiW7-Q6Tpe(|I(SXud_ovqN7k09E)))k6v_)8I zj0GN|&|?vM6d{#!?84c7ct-11e5c_6#b>3BDThQNy4l7Ioo=L2Qpca(WOJ1?#Ob0a~gxM{Vq8R-tU znnBHsYJE+-`QEhAp7k`%wMhGn(EzmHSi(HxZEUiQ9lf)h`jxi4s4f46UC&7%alMKr z(qQLovmnf&c$xbJh+!zYxm2tVLCY)?vzI4tnnxGcQ-2MNjVQxU*$=A{%cK(vt`$fI z&Y#k^@k%E@@B1TujHt9(1fmyRS+&ZZ?KeM&!uNY_Yg(nx1qM zFE=|TuQZxULpLrvLZhq#1m(h^qMXRKk%=R3FCRVgdFPfl7xUefI+4c0tZ|h5ZP%dU&OShBPr(obj& z|Fesi>gTyWJ)1?MirgayZh6O6d^59MSGp{Sh&>}sZ#X;bhSgV@5*-Tm3+cM&a#~+t zZ~t+OMDbx8+kcEBDX4NN1>z9V7V(gRQ_eK|ZLTlogQ1i6O}TE2Z56yquAyU@DIZkk z{sBDp076$#e1&zvq3i-nN0&{hbAb0=>jG z?tK_x;#NXVXWzcPAQcCA=R25)db~TQ8tIS{q1Y<~nbFwnaQYx#W{SKk+@SS|lriU) zyqgm2DE32e{(=P;BX#x}i_K6ND`_LEkG%p1rSmyd4#@0LA(@7mdVio#%E33bBX%@b zgUe=ndT;i6AsG3TCEDc!cu;AhwX8S=U$3}6Ss}Sio0+LEixPre03Mp48@cK1%5B#u zpX0b`V_c?G+AlST?pB-89*xIm#~NChL5PiEGjX}wk~p!4L$Zzj;&e3Na~b>lK$b^~{nD2+v(bTp&aU@^ni@Z2J zmW}S?Bf{s!)~`8$+K0En z3$q7omX`W`-T=29Yfb?EvWpk^c6~1k`JVUQH`^E5#8_-B3YzA7zxnj|3`f#t<@UBF z;O3N_Q*89!W1OP%-e=rP+lD)C195EtT3hFg@r*Lf>1g5^)MWKlwqpB|NQzJ8c!6kq zrk|saK6BOSw5j7JYhgjLSxk=FRB;=^Sib`84fwj7cueYx!8`&y{Ux^o&Y8EIAod~i zU9?3to>{@YzHE}Z9=;#1bpSIUUpn?(W72b_%JWsSaQm3s2@bKikAp&4i??evf%{r9+Pnoy#jjcqre+&zv~^TvI;% zugWKZ94345XiZmBf$;ftHC4?I?A@+6tqzPw>M`wu^0t3#>@qy^C_h-4`Sl3!)H&SMwD1{KO{)H-vKHLy z23q4uQ}0t02{$6L{GYykqA5e<%1|}msdTHq*4A3q{n4?NscJs-NYh?sqdJEE9)O|n zx2ih-rix}oZ+E^-RMhOcuZ zm{e1Gc3I7Melb<(KDQg<&$7VtU$)`pNB2}TX7GHnvD{-rRuBz{U@QQS-g~RN<(Acz zzsR2-=eui4r%r&w?H)DZNlhs&$9JnaJ4sQvWml_wTb-+QfS&5f`f?Y!bwM9CF#=a4 zznSVjq0CNog?O!+E59uDZuRMv->4^K*`xZCiP-Fjuf{_;3f>~A{y!ozFLw3;B1^TP zJ}k>g;;Te~$nWo}Y0mkfys9QPZoYF~@ja^YYOc~#`T!!PgE&|jCNkj@T=>tv!Ae)2 z=Z6a29#v3Ds)6n|58_RNI=ixIJ}AnL@@^H}v^vT?!PbhtG)Am7$y#-3Os@==y}`@K z+gkqoZHNdiMTNAFdOQ2Yz&G#YYt@J6xb>l4)`oT6lO@(B{REhmb-fj9 z{odv;`t!BJ*$3O8_J}m>IS9wh@8N}7ZFB0Ama?PcTYmJSQ`Do{u&kRh#X9+4j;MaW zoY3V~ZBrj`O4HR^ZSCjX(R=>Ztyf-Rs3%k9<3ed;!D3Jg|M`FLYQCfF3~rRd(6?rOo!XiU3z zvbls*xVV0VXoJ+ZhLD7RYuB{k5jc`Uk7&KsIV?+>;ys&$Dh+BCO}q=HT)zb(V(GpM z`(9+3-}BNZ@)2UMeCd`=LXzK3Y1*(~AEprD|M^lc0JZg`|1-WjsPz=_vd z-(M{LJD$Jr$$|%#utSH+LnI{m_th0`GnoLHgiGh0pe~hlRb7NZq3|PW2qq>}|AVj~ z&VdA4#QClgkH>d#q6N!6#MPQ|??iO-h+l>~(TsRfL!nIxGMqUFgKU8Z;`rx!97^zq z``#-WqbN4{nxYg$|K?yhL;U%>j&c?$9T9GoWqoXErW7Q_{)nomz#DH#Ql$t#sVVzw z?d0M)*XHN0Ps3Iybg`Oi(Ujm3h;WkZ11I&R8B3E?|47)b& ztML!_LLS2&11i;-T?%eeJYb(*!E^cuFG?fG@96M}vR&GwRD}S=LW*daN9@9I63MWy zx5_A;NBo&DDq9suBRg@yeU8F>ri}&;Fh|%8({) zRChIh>zEn}*@aDt3IP(;DH%(R7j~&zL~KyGbUXQDycB`Gz?4==lLEY^5tYKW6@)0E z(5NTJN2-)q)m%N2Mn(p_JO3zepz~^tYVpc4CHj20coqg?f$m;P8tfISt`A2c z*&!U-IbOoE_!cZ9i6RvFR!s>35Q~1i|6w0RRipL847Od%}y48!3u(m?vtJYpc8hqFn7Yp z%1{V?ganbtXtq)aY(zQ_iv$O|9#B&iLM`iT(kUZV4(VBN=296B3}YwmIK{B-gz5c6 z35c8M7cxtiT7>FSf@@@uU~4Ks*<(9}z2CV_7~k_(dK(<(h@z~c#c$C>lM_M@ye_v? z*0R|wxOE9)TXG!RvM`_Rgg9KiiS`wm_C=*~NIv!opfPvLwv-)o}HJu+$3(o7w(F3l^zV^R)S@ zO(#X?ib_=01R$Jgp;9>)2oR2zJwl4j(OMJmBsyUfw;J4ryBXO%j)>~y9VRAFtsGI_ z4LeV&P*_pgg2u|DueMQn|;rsJiOqo+q68i`~$9MT_iFzsg^Xt&}TkKf~tg4KPMm z9CZB_#6FA$A{eL^I_PT4n`+`vr4rnckUSSq%31+<(N$68!oEPk>cL?dG4x>Xm7A*6^nqHx<&QF1sTP2ER2Rz_!Ee8nDYVM~eOlrek1P^;?LTDwT&UdHX zrUFBscmGV56R7h@b;xIr4M#Xq$g%!D{wW-e79>=wUJ%~HnK}C{~qHhuhv@Uu`s~q;Y$$KCLYUdS2 z3D&h4%})t64Ve>?LPLcPS?rHcz-gP0)GPcwhP7ZuUIU;Ok8ehjuLAPtYn3%hIu(Ew z6a=JV2%eRADL5vp4Ga8px2jy}^}yh=Mr~p~Uwi2|7a~6@?>v8gM;3%83t=516{f1^ z3#GE41UwBY4Ffs`Og;2{r9rnlqT(hqoWs zfE;B3SV8ZtwG3*gP}u3yo(o8B_CQlM8^{ViaLy-Ttb|P zXZe>PX=(b18`SZS@Wjhva9Ex2n=7u^)#wR|64qcQ7C>N$)&B^9jgQg{Fbb^%r7~4F zr$)*g(%d-@*@C(>sY%U*TW6_L9g_u>QX}WM)Iv*`P|fVt5HBc1vo&2d6G$g$JkpB{ z*Mcq})h2X>;{GKPTrD(|r-lPtcxpm7;74T2aPp+zgbQq5m`1tDE+Fv|R1!jtNO;mt z*F@^dsZo%H+CpwyX_v~K^W8!KTgwE9`LI1Cz>CzkX5BoNTdCP`pa7Nt{J;gQy@Zas zfW*M8hR!s+up+o6L}q{j zgUY+JkW?pxo|=;5-FsDK@Rx&{cyDKlJubTN{7VQi3Q(O1wHmc}8VNYPf7E(JRIGxc z?3}EpqNJ@gfB90tR6=W^22`;Sb!(r2hitk6gL(y1{AT+KL%wJB&JvB@-Vd@&N^A!Zgvrxx_+c+HTg6 zi9NBRUrZ$32?YZvB1oo+PLqlGt&&9PLxEu;fyzB4Z7oYnc%6V!eK<_Zpn+kLDIu|& z0bqzuUsBbh#$u2HGa>e&ruYrikBid(1t1YAyXVP?|5)As&z3CHTS4cWR&@r)rv8dfwzqNa*L=L)PjrilwMct^W9?mj^}ay z{|E5@`I29o=E-^N-HaEaktF()}8K_KW5d&4I+y&nwBi#sPO*c~|VM5IgH zfMd2$z=B0y9*r+f1T>g0XmngVsZHKs#gxbFi@6fGE^%rEm?;ZfVfn;s@c6;miUn)T zIT#LEcHIzFuzAuG%c@kVWzC%s+%V-(s0fD!hndO(g%h0(O$QR!FznPhu!_O5F)6fR z&JlM}f#nN&0s_>f6N4W(X*^e$&KhBSPJw|Tm}5Dk)xBpbATM~j`njxgN@xNAFV|SY literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..50b1d92801fce5d4ed0056d19755d23e25bc8e9f GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvg8-ip*XpYbd)FNO|NsB9XV1QU z`*!c%v#g*b4ln>J!31o~*OvfAw|crbhE&X%I>DRoumX?E&7Ulm&io7=%mzW%0=sv( z**os5D^%$84F8%p@7Uplj!6HeWJXI%Shm$RvT(O3n*>^DZq)>O8t(PQvA^ z)N1Fn?E%-@TXWg}#ujaySe<9h+Ho=btuwPc!_}1BE!GdNIxmtmZz(q%Q~loCIEZJaCiU! literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..334aed60622a167697f496399de549b96a6e2811 GIT binary patch literal 933 zcmV;W16urvP)-#PGKNo;%zww?bA&+5!Eu}f<2n@h)LT;~Vde45F2OuSZ4F(XR=ehUN3M4^5 zP6FIx5}En!Oa#yx22%9Fzd2bZ`0rn5KJ=>GQI3`(ygBDenI%<7foU1e0i=rnb9mL1&q%A!mdaFxE{DI{M(}di7ha0 zeFb3c+Za`RPXPFpN()B-Hfq(!s3KzNPs7i^8gJ`PV)>0w@RhNSfYE`0`Z*Bc(_`u4 z<7w0ZwWKa3*7ZzEC16|&@Z9dK0^hWfT6Y0h);-a#r4AUK)&g*pe@adHS!HO(6L0@h z?d;vU4o3bLTnU=aDFMdy5&-8xXZ0QX-wn-Z7l6OET07Y|O0mB=(3dQnVy7CvM(5N7 z%k#SCODCs2)E<;$ij65vFkW@X0`E&>7yVIt026$?Aa33^8kZWJJ0?wV?C&YU?@r%uh! z&-e55v$C?1l#~R@V+FE*x84LwEcJA845^s2_M#)#VFdx!3pYF1rBvB399g?yo4Chj zz9SF5TAOXu+M)SH|48KnoqY`9K}~k|{_y0j3eVZpuTb-7*_6%wWq%kW_{HYrHlAcW zA(m0JdhG$RrnRlT4kx+%JS^hg_8n(&|DVDTxIp(nfTUG`*n&?wA4Cmr@aQP$h0I*8 zl^US*r0Dq`%~e4gci6SN*Pgv~NA~mO>{EZ%%>5kvI_=D-zmv@C{H+b1`^HCseB$Zq K=d#Wzp$Py{Bx+>< literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/new/apple.png b/graphics/battle_anims/sprites/new/apple.png new file mode 100644 index 0000000000000000000000000000000000000000..cb3e78230ffd2cfa6c192fb99eacd1516bf68210 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvg8-ip*O@n8{hv1Xe_ZB&8ST5` zs#}ER<_L(_ne&xuFokgPg{W`>6(WQAwHN(>{6tR|$B>FS$q5n>2O9MPTJ0g&9bG&i&Q}qznRlLR|l^I|*bmxG+oslFbZW zUS5WVh73y>-T{?Q(PRi^VAukZhl7W6<}(60oCO|{#S9EWB_ParFHODzC}`{H;uvDl zo1DPF#K^{xP|{-Lvdy7IVsE)~i%Z%2Hjd6W-_*Jpukx7-dnk)f@2MdTaC7?Z9)E>y7*mwmOR*Kl8Lg;QU@U(aY75;{O{&@9|C(IOo~l zupxH(<$b>Ad|n*8P}Qqoe)nI_iiO;Fj(*;8m+_1!Lwx?uR419)=?)+td%F6$taD0e F0sv{JaRrM1`0?Y!j~_FB{K)w6!{Wye4j?-5gJZ@Ij*K517C$&RfG7i~ zY!r-!!0-zJk*s~jKwohdctjR6Fz_7)VaDV6D^h@h$30yfLoEDTCoyt08wjvCYi{}V zpZ$B;H=jP2%L}9SN-j!>dT3)Q*{{W;EC1z#P*YhwSR5D?JyCqipQ%$oVT*#g%{tEmXw$=&%S zd}Ge7Efc=q`&PJ>g|oQx&uqujKWv(LcASblC=^_hZT}@o=wbYfFK0oq=jrO_vd$@? F2>|#Hjtu|+ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e32e595296bd6927321c12e505555ba51d596e3e GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDUoq6-s#LoF!MZ*jX3@)6w z@u8#RgM&t3V9d*xFM&!hLE=MwKcHxsr;B4q#hl~>2c~1k0<3g+&m{5j`g$8P7@cwG zNfA&sD!;Y?xsJip)z4*}Q$iB}r64?% literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/new/bee.png b/graphics/battle_anims/sprites/new/bee.png new file mode 100644 index 0000000000000000000000000000000000000000..448935c10a426b59ab5eb9439ca6751329a9c767 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^0zf>0g&9bG&i&Q}qznRlLR@EDSn%wu-j4aIKYsk! zxN&1vR+f#84Nwvnux309GW3L}i(^Q|oVOEf`3@QIv~CWWn|R`!6Mq0ZU&6vQQ!lM3 z?wYbrbjjDRmCxLD?le?&%(Jupwz=0aWTWx<7q_|NCR%P#nz(WYgUU+_*D`_Kd-Pd0 z%1xdtvC>NWm5-^)>^DtvCCs0Wv9Rr$rx;Uzxx@DIOkEWPd)ki_Af#iq_$SsGalG;$I^UygYL9z;$6EI t=$!FmKRTxZ@m z{lL%HrlErQ6>raGrHB9A1q3HPdUyNZX>Z34`-uy0@|kZd5Ad;Q=wsz-V4uZ4J)zYl z$4?n^14pv|%y5bC*`6tETdoqBtfmyzePYV=KYO1m6$RPKi0xb4*&%Pq Y$nGe8Fz?yl9FU7WUHx3vIVCg!0QF5zy8r+H literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..53ed3361dc7b8a931bdf4e924b5aa7250d957653 GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!VDxk7i7!@QU(D&A+B#_RQAuTUEdhLq%?R^ zhG#>JgMonoP!bo|;HR4fl-uIz;uumf=k6q1zQYPUZpIrYFSO2^!fdkB(ZfHWbeYMc zf9@-O8k>b)=ll50wl<>Sp245u5Dug28J2PdRwP=~J`$BKacMFU{tY_~IL?qyJ_*2X=T2euxW;gA$gS46LORpt)Rn0007F zNklp-A5fe0OKTV05Ih55Ci}|dXrYWHm?N$E?fm`Jb(*;$rWaRlv0%?3ZRk< z#0rSUp71>fpdsK>6hO3gm;sa*Hd;WMmcbv7fS;2GEZPik7NiXlx~CHK%K&hIi5_}9 zSn~M*P>!2eSC~wCz{~*^D%c~AHym+%0F3K`M=+ilh<*NwCA`hPN6J!+he*_$O2}w4 z116i`M%@ajwH7qz@j5b70-})#V1@BK{>%aALUUlOK>sf;|Jwo05}+M`{4kQjZ4uZ! zQ@FT2mwE7A@Fi2&hz!6nTs&~D{kBdeLXF|5vG2e6UA+hl8sGZfzk0N%ga`EJSb~R6 zvG)Sa1n6ZzPHpH|!N0;+hzhbTfn#{dAu6;&EGS$sDJ0;$pdi{dx@=$Aq~^nj9?Z!D zmEcg6-tVPyz;`cT>v)JdMDGYwT;3KHCO~xz9Px}_U5~?1XMhwQqIlu*v^<@o3^X3- zmZ*JLST>5L*p zx`{DTUXHsMx9Pyi8U8Q-U4CDJ;Ga6rPUPhj0OF&bz6)Ghm>=F(?E{Jk!Gj8^mKL%2 zGZYpbGDFivWfsUxM8%GQS&$+|j^>fU2R9V9%@Lb;=SPw-^xP4+avIy*m`2iA4-iwC ziEJL6SxUtrun|%y0@1hNn1q#heF+W@!rA@v(`YC;P5{psTEg6aHWjIm1dNN>7^PFm zprngX%r@7F(wd@o)?K7sgGvTa4(nKLCZK10+YrhX6};Vot{s5SJ)P|Y;AdE22iG@z z0BX0>&^f>x*y5`8zai}4YY*F*H!z74sE?XR-}hrZu3z;sp=vyxNyY#G002ovPDHLk FV1i=gt*`(9 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..edd1a50e89aefecb5b824e66623623a5480c7877 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvg8-ip*Ax4npIuVCr8{U!v1P$Z zo#rTos1D^~M+Vzi3F|0v1xH5}b3Sn;PDUo61`u#_+xZqqb$hxvhE&W+PLN=Ez+)Bv zfq`rO@(8w2#(t$3Mt%?D^B*O4+$oe6NbE6qxP$M)k)+_31BtVZ(|dZm&&xQh&AjfrO&+ZG#SS2Q*AW+zN*JW!Mx{8%bQeEO`m=~{|^4hDya6hAvt*kas2 xy^T4wGUtKTwAIa_%9g@6Z8k`C@@;+|<-Z-G%K2I0N5RcB} z1c|H!wOt2vOzhIHvxG3}C7U$9e8{%KYFb;^BCaWIZVRLWrJ@>>ID)Hph;}hN@9J~S zcsHXn?XAWFb_rkk#SHQwvO(#9rLZoi;o7KHr9&&_q`HK5&RO+>$=f;bGP4ImsB2cn y3RbT_=QZ@*eHAWSSxxz1og>1-0@okH!XRTGm$_+v_y?fN7(8A5T-G@yGywoh6krPg literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/new/cacoon.png b/graphics/battle_anims/sprites/new/cacoon.png new file mode 100644 index 0000000000000000000000000000000000000000..55b17ce8ae85b60992d0c239453eb4b00e139b62 GIT binary patch literal 10874 zcmV-=DuvaFP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3>vwjH^yod4%2JcMLV4u|bpo`Hw&FTi~osmj;y zd0DzD>Fg$xB!EB!fV|KCU;pzw|ASvGxc7;v)ZB7@`4wAizVnaz-e31`_eT4#{feKr z`1z05pYJz3F9rS%_s6_HpYOb$e!fsXUvT5k*Pk*!*QuWix$g_xub?~Y-=ELb&xL}& zue;CBPy2kY$6wp|{PFX1+0VuQ{y7#7V*4!0{*M*8pF98YMyx)( zzkmHYyK`1OXW!lRm^rEZd^Yv975f(-99$~c*D}8ge-i&L_Pg=Bvc-wT7SUXD+C$HipDfBb&_?Zy9>-`^KHN3QGKTffhWb$R(T%aG;tUp|FF-1(eovh%gy z&o94ue;GDl!DPo=*1m)%>u zFV1m}75j8n?nCqg3%Hd0a?imwA!LkGz3$C-inGu9N~xulUPFyF)m%%hwbkBy3qV+Exs|8Y z)>`k}v~%gsw>zKcefSYZ9BJfHMjdVRiTlhr)6BEXI@|2audoRJl~;LIU2XO4Hmu$RreC>o2PdfROQ%^hn+iD-H{%JM$m*xJm)!fHwvRJgwl^?6|aw%VzaDtO0 zn_)2@9TqRL01oYCv$wh!y(}l2z0DI8$zwH_WSr$>F)SFj^Xa&6+x=MXKicg{@xNs^ z|9`UFBh&r=u-qfleJuA+yZwvRR=122%s`4lo#`76z_xPtwfk{!-$RhvPxZg@cR!m| z=5yHS)5aN#Tjv~31)}CIi`$Og*L!9dJC=5c_TAE8qvh<>c3>BKEI%DTrQt$uPwI<+ zE%D5L%9`xsb&c2yu1vm|`nylx_2h9PcOm1qH&f#30e{q{xpTf3F=R|gY&v^Gd zZIpfH$ukFMYZ-mDl-6jwgtXVj4D|YV zj8gJCt(??H*olwlo@Xj-FP$)QnWxTNM#?d|%t2+gdK~A^{yVE>#j`(W`^7!-iMFUisQ_Qwx{$|7JMDrQ?u*DnUA`1+zrQD@r*VH>AII1 zdc#b~Z$Om*(|yA392M9Zo_w%IF8CK7fWtei9n+k^VqJipR>k)l;0)>q7D5C>;gUa- z1;Me72a_HSpLi@~6Kok*D^p+rGbXa%K-v@QW3{b@J-4KUwdPavo6d)RkEy z2<7J>zXFE%Rc3ja02mS0lt#Sko}1{XggzKL`2@B}`2G=Q`z?2amDm;bwA*6j*p@Cw zG!exu*UIY?RJma|;Fo%T+WVZ*iDa8I{6*%#Mi)SuWx3^6484LrypJ@{5uSG@ErH+` zK$S$&>ZHK-U`k?)kREeb`kCPq)5N+LnsDkYWGh;U`w`fx1rV8y)hQo1cKLAbMLx$3 z4G52}6J(I+u{c))!gXGSC6JCWJ*U-|F6Cv?3OaRHA9C#J1LOhi<*~X+#)I}NQ`Mty zkvPY|=C=6(QVv7P4uYkz9Cvg3!5WAFZGW5^0_o(W?J~P2(#u$>!zhS$P6udlqz~kF{rtON`;{srV&;b}p?|GOEIr z451{pwf`+FJ-Fl1md#U$e!RMOuwr7aJ|luA2?vfaU=iDUh>S#~o;tyj>W7c86(nzn&lZp|11u8AT3!&@^gc4gB5Avn1)0^`XPIT zZ9YY1J$W><|_m)DLXcyp_bABRjdw44jeSQ z-9lfMhmAf$zV4I)s;QaL}Dey)rAQ+zm16k8_h#y8!VkM9_MujG!bQC8;Pd{B6_m8%hzz!47nbv)WD z-o*b17T67N27+5MtPzO^Q9qBxqsSqV3-5uzgo>3WAN~T;3zyDB1!Ss`b^U>6 z!SPD9ph1fX3bP0+{78ySc(a9k3%$@IYI6h7Tw0`7HHd8MhRjo-SWs9}^@(3N|TgM8nGVO2L`k zstGnW;E`emAIOp}up@>+^^f=YEqU=M9T;dWc>@Nk5CD9f#HhGl2>0Pw-3869UG(Jh zJDc}|)dj%}s0AA#f{^`QoDoEf^-h|MMx*0A!M92b-)rL%f2uzL832CAABTabC%t|!tW>groc=DRdq*az)%vo z1@)pk$t^{d4Q(FqO?&$!#A;E>#qDD)w~HirjtDzML~w99Q73M-cRUTkcpf6wBcrS& z@a09(t@n!Zr09c3zv8uc=#jEwcSJ48gNw5N+$x#qIaW3yLRjK(;OWsHcJu2rlzh+) z#X*nt?S{xbPBoVS7xOifAD*d0i|{OSN`c#56^HB;mbeUuFd}F|RwN*#W3|R9kl{7J zwLvQ$F++XIjIL6F049;Kj`H}>GKw${z1fa{aR~9=>YSjEq~k5+zK;q9k^z;J1h3NK z=dx9G)v#1EAtY5j3IesP<6%v^BDPuA^1P}2fbwMdrn5(xe*U0WIUU*IL%}THoZOsfd{aFE!cdrcV0ZUWM%v|W2=$VLSkJq{enuTJiH6v z{b(Y`uK!W2_-Cy`Tp)`WPqV0^u|8yDblnvHp6&8mbb~4x9d}xl)$7}Z%#(k}D10JY z`vCYwnzQVOt8-VfHN0i2=75E&>!z-9Jl}5{{*HSDrY9~L4p2c$osWVLu`0~i4FD;I+%fi83?Lwt{&BQgIX!s&$fj}MGOsad{w}}Cl0*tme`2SXu7Q!8#J47 z0L4_4q7@5lRWDL}P9kwN4h8aukGD>4Sfq1!9AZ*cGgL8PZ(?5DK{(n{_)GqT$5%M) z4{Q|+ePU?|WP1S{su%~pfhr(aK=6Jq@gXe8QdJ|LTaMhn$`fGC$w8%K>3~gk$ST3e zT3v!-tm|z%Sz$BiJX?SAH&rsTl1{ih-}PwEsLq*4jS8M(ixMow0T%?)T(`^_4hf&! z4`>D}XdynZ8YnBzF>(irIyd4pyQ09VwrfOHc|sLxpbl1L(enr+j6(o1_~ejJ;u*fR zNP5jC)mr-!qkfT1&@7)AZ@omTJBILZs$)0{aaHM{y6Ac0gVZRMHm$-Txun{RbS-WS z;`jQ3x)C(Mxd?{zSlvJ{9M#MyR=b0FOQC@!Lv=faGrW|g;zILJ0M?hv7K^_GUUpi7{I;Czck!fjAGKMEO5%TYR3AOOy~Am0DZYHBm6`0c{> z;3<|$0su2Uv4ivgPKGcY+$XOoZ*q*p^BsDqrFp3aag>%BLDi8=u-L zi8pdAIIa2@+pQrPEIP{aMbdMAR3r-lwhV(vWM(i!!3951KtgQMF15oh;KL%HP6QHC zdwN}}7iL1f03a~`E3u9#EVQpGL`WCF4!$^*>gzGdeTm>f6(_RU&oyD)`0^7)FK>a3 zAQ!w_-tW?k;0B%}C#pa+MhzUvRx%b9Rc)=S$E_~ddenju=w-|CyammuopZgVB>Xa2 z2(etg@?Cy`2zk->Ic{=+XmJwb8y<6215)&kw~2t9E%@3OOG}~}B5}B`8_7x!;IN{< z2{;|fUKlJsDe3wJV-4!9r6NaE&sH5&j%IZXi}Ros7NIrQ13ewAPyHj}T7(NWpxTbX zx(fHm2u?Ojk8;87VAb82fk~1#1fUk-r-qQa894R<2vs~e#_w*_A=JgL_AP=G6`!rr zL{1^t@hjXC&>W;}6K}kY8^C@!$E|$0RaUCEdlbA zGa|^kQNw5p8M()L#4N)lmQIIhKxO)lAR}@}s*1nmo-r;#;>Kb;i40)%tF3@&uSI}F zKF*3>Cwtm?U(y=-=PF#}`MwGmTu2$LRMiS-$plh9S8aCLQIe_>1r2gk(w^gHxYt;% zbmfSO7lP5~Xj8Ghz7~|c(WE|K#gBxBKGJSA{_7)FPg>6w!L~Qn+)h+(DWyg@mshI2 zl7?Nvta`M-9A9OU^ltkmNh&<|X4a}OVbS|;RZWbX-9g%NN{vJ8UsPm zJw@42ty^u~EtU_WgJT?NoPgmI{tOCrmTsykZ ztA0kT3*g1EKzUZd<;B;Q)QR4-0xnBPEjFdbrc6^m0Qjna;Gr0|^!y2gqRRC!!Vlps zpN2VHr*V+uk~bx5l$%_Gs2wx*@eGya?86dRiLKx%-}N-5jO28*S^0!3C)In`rR}#E zXM8R_N#d+>@C5HhjZ~-y0N7n5g{#luRGo~z!TiXRxAEWOZTs&RbX9RAhiBiud8$6E zv0~Ii0Y=tF*$4ioHmj9Egx2Aw1mdj(k}#SYA&<8GBmOXemy#igp5Mi>5}OxU%;?6T z{BJOV`)UScAyPOak)=F8ZF3!=b^DuI5E#IS;PodW-CJ>LoL`{oayP#HeDyEmRB`Id zFUZ-qjbP|^`Zet*kIAs_^-y&??h+m|Bh>CFGa~rhbw|>jB&oW2=ys4moL^<2gMbXU zBKOMeF`39J~3(C1WbmXZ%=;23M8>E5pH@v4imk zJHVQxS&ZkOyYDnpfr6@PAh*gl(A3Aejhv!Ng8aMU;5LSLM`18M;SIZ(P(Pv+_#x3W z_QXYWLYO>Q;YxfG{-jDH3t?d+c(qT1G$6-|nDQ_wGOg-%AbR^M3t7ok~#l_ZpB`JhS?DqY-4%Bxn!)Sy#o*43O9buA`-D{^YFq-PkZwIcpib3^J$ zG{jPBwz7*H4M|TZht;B`Hg;k4N=t2E-qT%s)kYODoNGzGsH);_v+L8mP<7kC*G^fI zNc|7k&y+3Jl8K+cz_c|#)6eO{9HmvsRIC^`nQz@cROTmigO#DHKvG49Pv?RNu(-WL zT{>o=`WUz4FX9-)@Yxu63XEp4g6B6autMFB;*YUuj8!#f96>Efp&0RZtBRGCofJk? z5K7dbn3X3{~-*4GpNMuJpRe zW&msfE;*nJ_w{G|D}!iDbhOEfkQh&zU>FCyxQFuN{GOJ|XaEg(z?wYV8CW`414C`0 zllqRTlyHp*&4oh(E4VVUwsaLJa;igs5iWz@Tb*X;a=L9kRbB9O_?2onz>}ng+Q3hU zfF^VW(ksKLWO!wYwt@=r`Nle|Drrcg<29iw1>>?m5^z3#RDI}AdVnm&RJQ_P!2dcV zOd}uq+L{=d zmJ=mj4q1GuN3NoS%5pXmCm7$TU|E1QznU}w{5?0i7#v`Oq$4>o@4>23M?ya$9KM{% z2JtLsEQ};_^G{G;m=<5_pf);L5-8`nR&vI}&BBlU>7`YSq+;4ISsJ7TR-Cswyn5 zOcrxpkhICHs`k_-@RIaU2N}@Oa1s#y(`Nf=vUPyXs+3uMsoMuvv5f;PDWHBx%vXm& zWZAeC4K>tv3&?S+kSGFo9`%K6&_q(em8=PeMRlEW4to+o6@C%=_7AkmWV?At9 z^N`D34)5fR(E8VJ5iDSA#E&fW3s?#vm1;M+xKpfcoCAp)e|QXy>==8$JbctyZ3^WJ z7KNHXL?&xbYv)4iG;yf%o8}=j=qL_pX><_6Ds@0tZ&0lIH*pbf!Gc^Usw}5kAJ!?F zFxx7!Xy}3u!F*wPMUwtlBTj*y`^KQds{D!2fRXhb=0zvJzs8sbTK7>lk`P@wO%-n9 z22Q?Id34_$Sz>Yj?iM-qcDNIf4>rxGsDkoULB!_n9k;Qq4&c)KY_j{`s&orJ9jVs7 z)P5#(?9_!vgpilxsWc+)ljTxDhdW+wX*uJgx z()X)RerhTB9LNJv>+!J)yiF}Ft9WZ9U<>S;kx!fb%0v234I2k?Y=k*)bHe`On5rE6 zK?H0BgT}zoi%S`mAlVx5ut6BID1HM6!#JNeVHBI-CVN^h_f&O$AF}V58aVxGS{jpG zB+1uWHo-bE5lp~~SgwW~R2tOvRCz>fL-!OS+Yy0Vy(xkttA(?|yEo~3fsRGRU1c*> zo|2WYZ;wwcP7L4Gbp>Gd9Y9e4Xf@enu|@);QkM`X7~-5dtVy|M*v)TLkVY%#nO5Ht z3_ZW6us0rVP)SQ8!$D(|_1A0mQk-|d0KoBL+!i?d08sv7l+>%nDw>+G z1%w3k!0&EVh3Xb&B|1Q zFa*-YFby)Q7p<8Q%P{g375Mj0)!=F5uJwC5G~9`|;K<$NN5sJ*+9gsX5K3Er}v2La~y$ZO%U-hIY5U+PQPJV}QGeo3ANE^~k*Q zduC%qf222!NVdXZJ2gezG5@@xz=R%}dP-|Z*s%^bUR-R6rGFh8G-_*plD(bsB)KQh zQmt!-j#K$^N`z|`*hp@&iF~+3P`AL!ADS&)(6ORgPIyaFkwrMJXCK@hleGH7lrRkr zi8c|8O(mFgi*c$A+#c$STP(7=iWogS8Zh3;hScJW0%j%qTTldE;uQdc8{sT#5MiPc zN3+O1+^#*Ffz`sRrO`P;r^%|f0mgOrwl$iZL4jEOns8`^1EwScfGh0G{ya zV!ajs?0aut;i?+D?2UsI%ESUhLr?hwKSFSnV%ibDMxd$whY#L1KPOUUGBv+%!9DaD zu&@RwFoEWkSuf_8CfC_-BBSSK?e*U*`h`p6&-7-B8iQ{*kGM^+Q4?H6-6T@W^DiXH&}k z7d2J9eC&yeAZfhI2CGEtG*BruM+%6_Nd$G!*w9FN@nMLfmF+uBCl>M|2H+R=6b$6VQO)Hx`kP-$R*H+R;V}gnaeSz z2~ANi=qf&8n$!H4fAnNPQ2j=OmA^&3t;+C{5X$Me)JkYpuej%6oAr5s$7Nk@{JSfO4e&<>oSHE& zw~_;S3M;Hf6JF}7S!*=8r6=uX%-%OW8l^{uzx$tOQ6zPV0c5TVzyD zR1cL9>b@yhj{2vUyqvFL>pL^rFSB#LTYs7;2jVztbAuyn$QDLKe*PMO$EUt4SaG!H zp9+Z02cK_C<$Nm_7Mfo@KA~dM(EVoOGHi6G z+3{lS_vqg^)ksb(d0YLa=&3@rximLnFtLt}g@`MCrs~BrG2cn!^LWOt=MF-nlr-9r zL~{OA=S|;9#(WLy;Y4Ib&X3u_vwe4cfIhD0k!|zQ#p4c zf0(jR*3jVOqbz0fs!IF>d}vl~`-sT;V^Pfx<87OFs*MWS(_Uzb)8ll|ng$CSs^zF8 z95rvg@bXZ(pr!@7o(l9DC+;Y9e^jOlY{05t%^rW~6+Zvy!KSE^;+Vgt6PG@!?#}pb zD>co{lBSXAra^4D7@qwm%}Or?Kt>COg%gwNVnf41&Gu1^^Z+y2?F9!W!2*x{&dLsIDB_do=J z`3N-k50RRr@hHWp>1ho-D2NFj4NY*CD(6T$#p+yrl^n#laG&%1$pw4y_z$6@hndhC z_>55-C^Inuf2h(0@Fy9>s%k|K^O5ZClTfOtr6x&W%0dtJsjmqJkK1#UN*DvjMqY}q zs>WK3L*9pI-}5B(Dg}y)=wc62TjB0LETaRn2VrjmN`vm*o@3EO@5RD#pJRD2Jj`X_ z>Mpu+8;12=HfENUp1pq^pdBcOTxJON8C;IsAS{{QA9u>9?cbW}9-Qu0|u ze^WE_c7cPP)si-VIu$V`J(;S<$BdXFmB~S%-y4WfJn3Sk)oYJUbEY@zdp!w_NAPtb6_s7}f8D?-jf2RqMU9z&yxz`B z{-!LjMx~YxGHHrPeb-A*O*|BP5GA+x92`eIwqun8)!o$&qP$GW-layFxw=a@`3=Gd(?C05a}d{bxRLzsX7+q#oBkj zr?|L~{@*2#6!R6|2N}Kglni}NcM@`)Gt~b}gZiUhXs?G*!J->@2~F?c|7y@`_+_={ ze*+OlGO0c`*1`Y)05DKYR7C*)0LRe9^!M}p{rl|i>f`9)+v3~Q+tJO{#kIk-)!x;t zw5$LC0000000000000t-10nzb010qNS#tmYE+YT{E+YYWr9XB6000McNliru;{g#9 zCkZsT%`N}{1p`S$K~zY`eN{bk+eQ#&QgNILAEbtP9$iXlSYx{8I3wolo+LQWY5^+Doy@h4zz4p9}X(a-n+MZcW>WTD!0Ds@jLSH zXutBc@8}Im$%-dmK~#^0A8=T=jYmiKuD@}B(gc0e4&WY+>Sahtmyeih4g&t@F5(Xa zo3ywBYPGl={(5`;I3}`yIPh6;y2`@gZ?`C_#azfPiCrIgP6~2<^7!WZJ5N#Bg_i3B zi*U?T@z>1){MCTUof050M&!7C_WDZ#VLzWx`An!Hwor{D!kqNW90xF;)TrDAu$yzz z8M{QfyW+ac<7i`E)Tn3+u)8M&07M_{&S#41tnbWoo5EV2Y-Jb7ebx<$wRsJ|u|FSa z2H&P}(qNp6CSnw(pK`n+mOmTSX&TLWoNNOnc7Poxh8I@^Ql9#=Vuhx`4C3Ls1+v3r z&h6o&t0N%V(X42TET}=d4(C8ZnK_W8Pd*a-jrc5@*;1CvRMS*HS*4Ar6pICIs^G+++B zO=g13SnWBslJYqYOj0r|++adUuz+|6yC8hB?WJK{0*)y|40{(|P^Xelg;VRqKmmL< z<~#Z>t4;y>br+2-_Y6`Nn^`T@(!dd~QKb5u5BBsA;(5bPSA<}#IUNr82v`?Q9oGym zjk-sWtTg7Mo=}X|gSucNBmp*?$kr;A%lh0Q2;0VD7ORYKhYoWbYR-O$eO#+lnO)N_ z$DG>9B1y|~2a_CiM1%T>tCgxUYr0707mWpsbe!c{E1_O12}%Z%nVydGqBVggDXGf@ zB|ziwN39iAka4-uv2*~-ogpa!I9Mn2hsrm4FOHWRjpfD?uq45#HQ9MxIfTNyihlwq zl|#wpZ&UV+4rR$9gLQ_qpZ;pc7_5QPQz3LklWfL4v~*s%r&4j znVMph5FvUy7w4Uk&er==zZHVk4=+>H<1^XPk`Uf(x)7PZv`8!NAb?#mLajRA$S!Cz zOBrWp&WYPZiDg^7+`=|?S*H|L@w7{Ag%k|$f&yErp;Ar7s&I(X7hu#pTPcNtY!uT} zj0In6n%JHdu=1cMb+FPzA;^u{hS^Ej!)03~C~dU#sj+83EL=snPz!HCDfwp!;E*-R zkaU(+h6UAC(r8Z_3Au8Iw@-1EI7F6340w?w0);aj4=3!ZwO?s_m8|3HB8&-d36W?A znp&!zT)D?VV385Cn7+)oM%p8oNDl2Y=6>>@>N=-g^gtp8x-o3(Ne1z`a*EzZ zoiQUNTh!H8<(}ZRNq)=cq)&3DDZGJN8^}5W-T3+1Bdbmyauj?_kgf=rs~ANm`O@m& zwMp5|N=tiJ${}s`k^FSS=({QHgsE;o^hb1!!U}(UV^&o60%@WZ>4SpJ!BlN>YnHqU zh@-vNW=I@G=1Kd-ooP4VeLpv3nL}=G-koRPQJF?o-9*Mtq4~=_6Y(%@v-;pUVZ?U* z`=)MHqU|&z$>eJA{{ET$ucs{7MEw2eD^tCCq&>_F{%7u2j*i}c_;4rsA0yU=2?GR+ QX8-^I07*qoM6N<$f_BpCGynhq literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..bf54b11cf22924a92985249c2348cc0ccc85f1ba GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^4nQox!VDxsPNql!DT4r?5Z4p?pC3JXbk3YPQ>RYN z&(HVs^Ru$Dl9ZGL%3}qxf4ANQO0;;oIEGZrshwagbU=Z_MKkwuWOSv^f=4$5TaMh{ zaklu;u0+NN7mf+5I5-yc!uwziP}Y>K~s}xGZ-||GC%W3+G`8RjD(8d3o d+N*9K<~IKk8I*fv@ive{Jzf1=);T3K0RTeKT&@5B literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/new/chop.png b/graphics/battle_anims/sprites/new/chop.png new file mode 100644 index 0000000000000000000000000000000000000000..2afff2b3f21509c7a060d49af77d5e9c151ab5a5 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvg8-ip*Ry+{6;C1xd{&J2Guu!DyQwdAXH+Td^k(Q=#WwFTaKL#dm2Me z9ls>KLh_v8?#vq#|Hkog%{-8MGycLOxnKT#`>XW6^sr@r0y)Lg)z4*}Q$iB}y;@GR literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/new/confide.png b/graphics/battle_anims/sprites/new/confide.png new file mode 100644 index 0000000000000000000000000000000000000000..adb65b8052d425c555c87d6676526822ce91dcea GIT binary patch literal 633 zcmeAS@N?(olHy`uVBq!ia0vp^3P9Yz!VDy5c$8@ZDT4r?5LX~wUtj<1-n+eP&i?=Z ze@gY5vq$eOnX(rsjunK;+43?lFtK>LIEGZrxjXf2-faV(hpR^-lB(# z9$jB_>zIoB9k&M^H{61kl{4=2$T+NF{pNv$pJo5`f)kTx3mmbmNz;xKYFKfPG3Z)= zo@qzx{Yj60&g_cIJ^tLw(Q#?oX@SC|L>UcElN+&~kLGJj2zYjE=5)BVIdpIDw?<1-6xc zBpq4w!gn?u{C59=!#t6n|06z{GIrcwT=F6^2jewo3jJdudG@c%~Uv}qdayx$8ry8jbOa)t6^*37e@_dP|yW>}qxQKCjC_~~2 zHHTa8TrWBDbN>2PgR7nBZal z-u8jd5x!>4CzIa_C>ImdKI;Vst05ne&j{pDw literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..091047fd101de9096246516029ae18abaa630f25 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^96+qV!VDzu-cxxDqznRlLR^9L|EW9v=g$Q)hyn4@ z$;v==rk*a2Ar*6y69hz35)wj!gc1aTf`VMs4+tfw3LM~gV#uYLq@m^{JA-@L0XCM# e21ibg3r84F%wtdZ6JaF!_2A;{3*o-U3d6?1AQ`SP_W@VFT^?yXm@e#|?EdB+RUXKZcS zXTGxQ$Y01>COtVk<8Pcn+6&&U7Y56IizIZuVB>piQn9vHcH)5@d@EQ^^!)BhGI+a` zfvKzUdib>UQoC5TUSs{5eD|OHk^a8;hP}6ZYaZ=mxGuPyu_l7y#|%yW#(rJ~yL+M= zdV~+W*8ULKcE~+4x`tuO5B~>T<=yicZ*|On>p7v{g7*e{=mEQqQv%;EHmt0alDx9K zaO(B&8}8gqQK#)@$v^(luh72xsQ-a$X2+K=;|~C8Sj4aG@Wn9LTIJUbmKn2_Gs-V# uh>P#Edvf80^EzKU7LSkf9e9^N{?D-Axp1k}AIC^g_;|YdxvX8G zSGx{Wm*wf=7*a83>!gdk2NXD5E^=-Wj`$|ONoi_av0B~9{-VkSMO_suxZ1MTYJ9!o zq_|ymN{#saC9C%yaFOLqP_k_3oAH6MO^0QTgsF~*NYL-C625&LC2#&M`+faWLq>~9 j%C^RyB<-6yjqg7&FcouqyU*x73v!*OtDnm{r-UW|k_SX< literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..73fe2d2f2144eb891d34487d77043a35dc87dad1 GIT binary patch literal 281 zcmV+!0p|XRP)#gw{{R18UaEAt zvNN(CZtVZ^Q0vOha<~8k!?(<|)X;K-Mf@|<(&Fd;M=1CnHZAi5vUk3Jn~Ee2(!!sQ f9wz8PLT>;7{1!wDh(5nQ00000NkvXXu0mjfGSY{1 literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/new/drill.png b/graphics/battle_anims/sprites/new/drill.png new file mode 100644 index 0000000000000000000000000000000000000000..a97eeaaf50c98bdf85d1adb6e3685ddec80d7a09 GIT binary patch literal 1151 zcmV-_1c3XAP)s=?@DBiW< z5`JX8<3trgN<3qy5|@VTY$|a9vL2TUmn7>{2#G_JDDANl&5C~jm08;4IIK`C-xoL_rYdo%Ir5-C zV3}%5Ijb))d|+96;A(RyU__if{01CgZqw{^N zYL(f2zXxbiW)mwLydp(NmC>*_ zzjCnx=c!GCpHm8p73J|cU_VuG6g5d(x~Ix+DSLj&A88h1B_n%-`|C!5VN1Vzt_pwU z5N>z{j--r2so^1Pe$riu=f7kSwNYc2m^rfP;VQ+8pFZybj#tx&GPk_xZ7nr+H)@RH z{M=C&@bK4Ekup{<*%(y|4r6vD`{lDPU~e1dsKe@5PsBCE8@36T54(V!zZIEK$HnGU zB!_BsiWT{{wKM;fjK3n~EP_o%6y+Qu*0<8Ezxc-~aQR(-=T?*lZc!3NDZ|4XzP9Fn z^TR3NM*L?#M}c@P8vv=(Q$Cs zKg7y7=x9t{+VdZQv6JLp0$~2=*uz;tY$=pNjicjr06ypde}a&_w%24E`I#8kbh^y; z4tEp*ywd@G7eaEO(d6Z+C=klUs>7OINfAQtb%2#9kc}@mzypQ&MI7e+Xeb~&+W{~H z6NuD;9)g`0^xzVl1Q50TVS~Bj4Uw{1ra{X6QJptQy@&(R(pqz5T}~wgi&U#%sOnt;C|Y!cee1Q0wTni z5yf~)mo$E56QVe6@J&+cR4T>4SiDF<6~ocslNXEcAS2tErUFy^Sb$O@Dg-ML3dg13 zK^Dpv zYL(kmb(o9=|2VM;sHr(L)FYQq%lwdMN_dT@mehKEF1`$3MM1MG6B0;~7sE$B+p3w=)jrF&PRtf8P*fw)_A8{Ws<@GR~ao z5gH!zNciab%M)%e?$T}DrB^@Uh1K~u(E&1c`y=p^d=Dx)YFSdsXT(8_x%U-B% z5P7)l>#xuZx0lTge;!`CRG%?TW6S0eF7@ z`F^|UukHHacBVQ@ZGAQ$XKUX?scQ9$;lJ0ED<^)Qd27MU2~YpceAO_6G3wyzsA+%r zo0ykf{cU>Sz1)qb)BEe{e@Qh;x>U#286OO{H~cO@L}o+o(u28TV^%-YiK534a_Zacq-GK&6My| zmqBn%-4A^(#u(;sNk*kp`VzM?Z*Jso;wZQJ=(#5CU*PR;49@xLo}V^#9s?y}Pgg&e IbxsLQ0Go0NhX4Qo literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..361d7ff71a9720940196fe5322897b6127fb9318 GIT binary patch literal 409 zcmV;K0cQS*P)Px#1ZP1_K>z@;j|==^1poj5Fi=cXMWm991Zo5X(gXyu1O$o%{Qmq5`UC&~chHgk z0Bt+~Zj}IacL7l-0BsBbZU6yw0DS{qcK`qY32;bRa{vGi!vFvd!vV){sAK>D0P;yh zK~yNub&)}C!yphv2Z*|^V;_KEsq2Y9^|}#}Z$Q^o+;aaTbRdMfayuKucKhTt#VW*=Tsy7@*_0L!BN<5vF_SLeV_=PH>sh0D1QfG^P%XF!xe`JA}o0m}EO|3K+! zz;doF6p3gK*V;mn7$?=5EKRiZYYe+V?MJyEb}OQ9no2meApg1X00000NkvXXu0mjf D0#u|d literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8db2c26694e1c97796aa7ef16914db194b87f0d1 GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!VDw>HYaZfQU(D&A+9I(KRXJy-m_Kx>hZT<1a? z{<_}KsNieDrL|{f=GXta=XF6hd!F0YzvnxCuV_E~@F4fQl%U2q)9hT3lRRDhT-G@y GGywoUK~v}e literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/new/fishies.png b/graphics/battle_anims/sprites/new/fishies.png new file mode 100644 index 0000000000000000000000000000000000000000..4abdbb90075346ee668cbfd36c088954f2fb811f GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^0zf>0g&9bG&i&Q}qznRlLR@EEUZmjl4aj3?zNets z4PxL0@>lLO0~Jj1ba4!^=zTlkBJW`X4i{asf|m@s-5s@WCzQk)*)S0^ix*%D-(EtE-^N-HaKz56Auyamz|Pg~GXn#ozo(01 zNX4AD(+&zXEAY6OI{f%=pC`mp=q0q^^6cAkw^shXljHWba8K3O@TY#!??h%@GE!!C z;9sy_yJgN{htHZXz9=6k>6&xtgn#oANrz`26X!G@pK&sup^1IM=lN^)@|e_Z++5aG z!KAde>k)H;fI!~=N}&Z^c6WKU{NZ<4uXj{#fntL61r9BSpR*XRo;T%C(qvg8${@Sw z7ptSPO6viJILR0PDsqDu1?Jo{*tSi|;chcSQ)<3#R>K3e2Z|5Avz$^2d~osg0j~oE z)(5wG6t{Hh&QQLgYN2dkQ)N0!_0-;=2&*k zgu%n*yb;^EJIse{1iPPHDwgbssNL(UuJKy)UDYak&xP;vT26HM)pV3JvdF$pyvWRy zZD>2)^{(upWl^O^3T&AsJhK<5W*0P@J^#*|$u eMSSVi_rKVtd+5FVmnazu3Q|v3KbLh*2~7Y*8>bfl literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..dc030788686cac19eb3ceaac2dbb5ed11be0dbe6 GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^3P9Yz!VDy5c$8@ZDT4r?5Z9SEU;Y38?A!k-@7@Ky zJL`CFiNKa5@hwRLr5a2joO~fFoIr(e@c+MKR8hDVkiXN@#WAE}&f6&$c@G)zxa@Wc zd%+cXQ2P#7T%%}S>zWCgo=gh`!b=5e6s`noU!69&zxuh}>6QDhtJ>R%7V;{t5lqPz z2xW3vVmHNOS;~9Mug#Af*K(ZDnp?W`z6$IA+#L(1ciEqsYaT6eYWGsdg-vKRii_CCqvMERMG7fjgvV<#_< sDL1T$S>|B*BrRZ9j(URsg?eqi@TfDhQ{x2=M}a)$>FVdQ&MBb@0Jt4@_W%F@ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..21218ceb6dce9ad5fa122f921948ee8cada620dd GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^0zmA*!VDxI2ESSgqznRlLR^9L|NsBb{=YZp|K6$OE(@k+bDUa?QYVZ23Z#ohr8^C4JR928IzhPC|&97 za^hLRvqL1t(8v0aLzg2{&q9W!H(3-)CM}Q%Q3(v-J(SR*nbwr4q;BHDlEW9!rhLa% hDS*wJsVyssk>RKTZ_oLsPuW2(_H^}gS?83{1ORw4Pe1?w literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4938e7e9ee0d8cc60ca97393823428fca728a429 GIT binary patch literal 327 zcmV-N0l5B&P)y zK``4hDcL0>*A*Mp3KrA=5vu?Wo&XMy01bTr3~~SrYyb>n01R3H3r+wFEWROi0002e zNkl6)Sy`m4Z|A{UxP2oz}Qcrgm$)y!0& zk36*+SW9a?p=s?HMO>L0g>$o3yq!ZaeF_g0-p}vC&HG=%Uj+=REX#|4K>@&7z(8W% z0g&9bG&i&Q}qznRlLR|l^I|*bmxG+oslFbZW zUS5WVh73y>-T{?Q(PRi^VAukZhl7W6<})%dFuHoWIEGZrxq4~sxkCmLZ4bZkm?@}u zXg&Afowg)xrktFkf1+b@n&-3$Q7Tf$PkyxXzul`ppMiVkj`H4rIV*#HEW8f^hQTPK8e*}wkxzqkL>{NoQR4;6Oq zd9kB6GdVx{?Ckk*>U$sjI2E7cCY^k(=T)7#Yu9ZnH`hy7&rWdR@jSgZ=2H%vQ-j6= z2`9rVK4Cw9{a)k5AtSfzT}wo4GRGVVriWUL90I&An3xIz1(=!+czkXv`1$bt<}de( zcjVu;O{(ls+>p-kV=>DCXOjhAISx2Fa&RyypMCxJVf+5`ccM-|-1h!_$4|4i12Yv9 zwhJ+EUu?Li#30S8sKC)t0w1F8YuJ3SCcEKbLh*2~7akps^+Z literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..02aaccf13cf69936bf9d931f6434eff01234f27d GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDU-TF*6B&oD+-um@tZ+yCv z^?r@!;v|Xi@Ni>eW1tdDkY|-71r&|*ba4!+n3J4vfQyCIF-59*!N!d$%*`{nCzzSd zKQQ4D+oIFjl0lPtdqvaz*o}FnnpmY9Em6~yJ~!v$$pZ$aKAw{sg-^_owDR2BSj==` o&dfOux&j7^YnY~(7BiW3GfM6io6LEvM;~Orr>mdKI;Vst08F?*G5`Po literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..bc49e1ce316d72662e55589831bcabc55d5dbd83 GIT binary patch literal 480 zcmV<60U!Q}P)!aOCC!@8$&!9JT(Ks5-( z-`TZt^;t!TCMH24l{YKO($c#&DT0+S399?Ijs8D_xCM=S#A z0qV%#5r1n&dFPt1-5@ngtZY91MJ{mi zw_V?yZI<^$Xup+rd*|&CmhBo9GU25ye3B2YqVmnl6v*7R0D<)~*P!Wef@L zTHDpc$^61ww_F*M>q1-2N_s7c$ltDjp*wSRymb^_{sCu;piT&xoZ}B$NK>+)rZEQq O0000 zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3-BksCd_h5sXp4FTSS16#EjZ20>ebdSbJpQ`rO z9ZDLq*@St`F`&%;&%clP7e6uOY+@=kx123MvBl;)PpW->p5M;K`|thn?_0e7cHMk@ zhC7@M{0`5{yx;pf*VE?*N_?-6@7GP4?>O}x=zZg3z@VA6jQ76!4ix-z-Mz0(dq3CX zm+icN^R#!%ZoRAg@j4cQu@d72Z~P7}SpKb=C9s0fLJxZ0c^>?8wTE!8$Kd}QI}`sQ zc)y`t1w9 zy`MhZYc&+#{Jcqtdbr~YX;>yyvNFk9P)2^O#oc+^oo~9z%*%17cMRtE#BUGtr;GoW z$FG6TQRzBo>l3GV6YNzrEJK;ozud(e?z}NgH@^2_ekSKlY+$5x!(7>5x8oUNB==cc z;pRDTU$W8Iry^Zh?*J@@xf6?VfehH}LUP&J;(c+BI9Br0S-B6<4>I6V^2?b+ZbHZ; zr+UrJXNtS``sAO>KnsaTA%{Y0XcUqaW1@aatkh6XAw`o?%BiH9TIxCEm;tF=vM{Qb zP-00Xmr`nJrPoknO*Pk2Yi+eR-vSVpT5iR(+FI+KNjpP#KHa&a_u)qvaioz)8FjSL zC*?EaOf%0i>uj?xzrv#ZS6;=ey4vd7ZAxj!op#=3*WGqM)Y=Iro^i$16XOy}(bHC^94_RCNqF%TO zQWq+wHXML$#>H0c3MH*mTiQOQ75zGM9Y6LQBkYn{M0T$28cVmmt+U;MS_$o7At4wr zv*+c@Il|`zjOiIWAKSBlQKDWi8g8_}y#%f|N@23fQ2SvqbrNB-0YDAH@Yx;pG6h7D1&X&U6U()a?k388#8@y z=*{FK(XVN>mc9>VnCIJ2VAt1)xc0ntW10JMk$BH@2Lr&*alWLng7LG*F~>Z%oK|4r zy5@~ar&L@6AvZi+dUI*llXhwpE0e^y#ySUPVZy1crO;QVq-H3*jN zjhI?T*#>$DN%5*Yu z2X_?z>V=etMFzp23>jZER&j54Z7Y(*kbx~M^;#PsTvpqm#9cwC|Gv9d;qvx4e z(-zQhg}qAb!___e>`dF&4s$caOanBCY6wrX0v)6AW;}M?%AU`hJGyqmTAS+pV@a&8 zJe4Veo$W;?@%A@3F<*)k0N$W!sT2BJ>C6BhWRV&GPQ|p50+DcS1{O41BFZ+TO*^5F zA{QZL(gyp{JlhYdU=q>{f>6Y1mV5+RDMM>5x(Q!VG2;e5HP{~5L4h;eMvm^NPWF=A zz*(ezduep^q@mRRwM>F=C^rh&)7H~)0eS+|2I{<(7ze2c>9oA4y%SN57O_}kXnm+2 zY34oV94v7AwpQqBv1P!Mz=u|&nLx(@v3Uh*RZDJ0PVqc}DhGJhpm}uNvY}lHXGA0l zBE(1sO{y~z(5Nc_kszH+tWHIwFv^^Sq@L)l(BI+a;5Ezzx{E~&Zrt6peQRfr?Hml4)t#-IvfAF-{sMWh*QqgvANT z(M5$>XOV)fXn5ec4YC%BUCU-luahYV$AR4ZK+Uo4qaNO%I`5R=o5WaL3uFoevwJu@ zrb^LtY!+3ucRC?87M1E6Eb>5w;QfS$0BN*iJixbQW&%RS2{0PPW;`DSk|60f*bJmt zyREvbW70S$L9h*w81z$TR&v|?K}&IO1B`dJOe)Nv=Z--!p)xcp_$j}|tZZ}<-EE-} z`G%hMooCX!6k1p)zgBCBzLU2gijD@1jc!bY>RLp-Q$80bkp>KbeoQn8tE7N4Rl{!3 z$^pcxXQa8L*{?*z(`HzqR|PXIG;vVMB-?Jv8k9xKcoT@Cx^fIG#dYYAU`Is96)cER z$OK5n8i4)C!@g2quqz!prSCk#6AE~+yrvwcI}hAJQgjcULo0;6&9efl zA8i9B`5&JW2kF(Fxu9R8?rdjdJ#w*Igh=GZKfjp zLg!{6JJGLHN4$1I$$_AioMfnpJz=mq!T;hAJ7|y{k!~Kq+Z)r+VO|flQ{R~nxdm{r zOp6zoz(cQq|P>e!sCnr zBN7l6;4ewDJ6;WC6IM+fugPTUt)$e7>8VoyMTK;7)iDn^1Kur~0nNtL))bp{dbS2G zE`X2>I1+Ozvcd!cE>I`ws>$_C*%zO{N}#M@J(4_=p?+vZQ3UuYxrin0G>e>3&%gu$ zh3$1rGzyio=dJINZhaFJMo~W-3LLPO5?)VzV_9~qehA1Za>@+!VcfREwux_{c=ZWmPgK@u#lfpGX-~45E+0X8kj8wIAHwEvALhl z@x$$z$L`6|0sg{};%U8kZ=k@=MI|r+83pwPX*&uOc%S8ZStuGSTaKXtc9EBz#DE}6 zS}S8dPxKV}yhYlpO%xhU1&U5=0WEOV`_+1bc887}ihuyaV%J@E7JzM&3aSo(!4BVu zg)Ci&Y^j0Du_8B%ue*ogMM#Ml9aEVFKO5o>M2=g^Zj&^00LCDaCO02#D_7|+IY_L_ zRkj$gfp!2Ri%pZZ?JoMr80E)7hsW_NSFbtxW4;#YiO$Tr5&f3t?(}Mov<5v+{nFBv zPEd^auoTGW9gRS<{79so;XxF|?7V%d|IV~!pY6l^Z$g;fJ?kMU*AjrIwUiGR*Vv;ykBbX< zZDay|Ey&V(6dZ*Q10wu~Qs&oe&?%ej>_7*xr(-QPv1c9m*(h zCQ$<$weNRXHOhMv&dp_o0hA{{u!Ia?S-5OyxD5=^@LnEuX9S|>_PPT^huY|9zxjk1 zTD!kV##63HDEuq@Y^v=zSD28_#swGZw0IeHDji)cmAVIHD7#c@i-OPuKZek5Fj-G^s)LOBkAL{`U!U|hZu2o0G7@Q z46=`4I60P5cX$o?bl=%^j9rKYGSU8wU2M$HmQ0dE0BJhE$eXnC{nlyUB=AU2H~540_te@ zATuAk;5c7YlVuyw_YwZf>($FL0f*)FYY`(hcgdAmN6o+pMng&&2B-B44h&Ah_t5jH zT;GF891UP|$%9^s!pZ|{sMST1kv%m9e_DH8b$PEtZ0i^qJwfDg|hD%5UwOFBe0_qHm4d2GyHr_ zKy?io1tYrT4{;9HD!d%nd@u{Yr|)I-%|OahtZWU+eU84H#k;@=l8YXPZa=LU-N542 z3P(oFuneg{8uqp&&H>c{wgY6LUMB=A@qWwlFc%LCj(hHg3JTyWoJmO(!!EF0N#Y3N z$5#d9(1B$VQNt}ocqyYT21u%ts-Tk$iejKy)ONtrq9v07Wvq@2937(Lc(4XrixkHk zmw1m{krDt4LCsnuz`;UmB*nl3Y#$s#xErtI8XwS#@B>nE!`6tGnQ#8qLQvl0cK5+D zRh7~CR>dq%* zd#Y&2Aq$RaB4JSPiQFDrEP`=7JID&>>FYc3(kW;K9Y8$C!{8uN8S84Np`hxNR^a8c z3Zgl6{P7wh@Y?A-2$H5QWQb^tDe1l&H7GO0yxw5B0F;%0FP+(_*PXse+-P#x2BGek z7w#m`Hlue{AL_Y6eYCB=+NC$rEe@1HM@+B77ba70c_kLDbO2!h1zOH$;Kow*)b9kj zQNcss!B_y%HNyb38!3@Zr6#4ZiR`&^UXet~Rg?LdGEr1yR{w3H0GODV_@Fr0SO9QvZ~y=R0000000000 z00000000000000000000KNte}00009a7bBm000&x000&x0ZCFM@Bjb+2XskIMF-;o z4g)7FEI@|<00029+3I;`@vIn*4nEotTV<)aDF{)HUf{giFV516>UopOWtRPU_TOIv;d>60HTkT zId)vOI7%){huts@Fo?Me!IuQ*ND6@;6^eKyr*?Jc3L(c<$~Yi_&<*SBia`}r0c)& S6yb6J0000@J;8|HQIjDZZH=F-s6ceaWQLhhlV zq2WM=Y&nn-XMK@D7AO-M`uZY7B-H96gBVC894IB$4rGPz1?tKu4Gk{_G8nJ5mzOt# uOxDfl=-8_y0I^gFVm;IuqwX0>?g0RU;i+*Za&5o>0000lK zX8~>nXg*E>W&>yr5WuW1I?aVSUl zJM6H-swQHa{xkd6>0bnVQ{$Vm>SLgHy*5xG_l35MVQDov$Yj&08sM@rn&-oe=atd; zJYrla&&I&z5xmP0s6IL-3IRS7ic%gp$`J-!mjM8s`Kti@=scXMN}URDW&}h~Z{UnKMTO1G}sO))nSa#F@P=+8vctBKgumg!WcYlq$G@%Ij@0u*GFePP%I@N5bySJ zuwbcR+I#MBwhLK3wM9U*kwJk%=_lUtGuih~V z%>m?;v`37=b;fh_F4AFwzhfm>dX_HB2lT-@APIti0Amale!rtQ@WIcr#_uxtDaIE4 z&vT69T+t^hy4oR6~?W+9ShqQxJi^KPDs`AQS@#O1*hGAmx$TVw&Ph zno3Lo`%$Y5++On#NyMQPbTInR$J=X|0@>79szAI>!H-43384F20Wr^?<(Umd*x1ShnEW66M$=;1y$gBnn+^w96(Y9rj!wu zgrjGwK#zx-D4yZh0P{>GoUAi;WJWb{$X8P0?FR;M(ZAA_q^+zkDH?A?|4E7$zdEx? zqEXf=Ts8i|!s8H%=6-s>su$1});3)MWhD<1RON7#VM-iclnhy52# z?2IR<(`q}wPOJI!i=7ux>a^Mo40c-07?6{8I-G|g@m@0|n6di{pk0xZ+>szFx&8Yl z8g)u*7v}#(td`a;Zw&yg-5SZKHQ7kMwf0ThQ_z1%5T>oyXNwVp+4K5rF@i8T_^E1C`|oX2V&4D&002ovPDHLkV1im?NFe|K literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6af8634c5709a323162e1d81ee4b4278a822d24b GIT binary patch literal 734 zcmV<40wMj0P)nbt%C4^j*_qexIKhc$LP6@O zYMC2fh&>?xldM+Hde(nl>LI`aUd0^?$R!kF5ojbhzDNeHVxYivIbYLV*dkTwkO63d zO$z9+OII~W^&^27`s`U_FYNlWp7ocMh}cRkKn8aKuz;E`q6!J+n*@<$&=Rm=(as21 zv=sr1wkoh;(XPtAVbKO1V3Te_kgS>o=##9guLM5XMwQ_kmvRP+*z`EVnx?}Zjb@B8Gz)Txt!6>i1U$$DX^?NiE`MgUX~K$Z0Z#WK+8bg1a=B@boYS{-3@@dpgDv?w}c#C@4y#=A^|8QlmV(~)eOD`_$lFi z0!4ihbkjM#!ev^Oz!1#8x5_a9Ld-{15VQ$E1en2MyS1^i44QC~weKs`c#8h~!;0=ULUu$L>C@SpC{ zn_)hzcOL_2?5}V<4nQv@*B1_d#9>^7SB?S3ca6_vVBl2ofW*&i@~ literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/new/leaves.png b/graphics/battle_anims/sprites/new/leaves.png new file mode 100644 index 0000000000000000000000000000000000000000..4ced398dae65809db9d5894930767de24043ec85 GIT binary patch literal 503 zcmVy-EW?5S~h~2n$!(?;KhP5;zGdeFwvtR*S?kMTjW{OD*CX2)=-=k0CzE zCc@>sW}W?;Y;I3+i@RgLxtaOqn-74`WF)16))5NCv@H7Vd)=%En2c2vXrB53-w2rM zaII_mxt5e%)SBCCns-fCMtT!)?0-|-Te6t3ifS4eaSlP(WEX(fW<{q_++aTr_ zdvoIUvwWCLm(Jk^kIOFLe}9NB#^Cfx8GC(F#-4J*IOvlwW_=RItWSHNwp7CW;rB`G z>QIg02ZVhRD<-6GatFA5s%}R?d0j1@fcNQOIg;N@NJV2WFR}mJF+?#hBz8^L_Mfc# zpFkjH^QsPF;Qf*i^Lix2cm)$;L63x3&?6!Cs~&8emcPA`VBg=sMuOPima#VyME-Wh t_bedtw>3T+DW0M+J{u`&#~I&;{{Ufh+Z#RIMGgP}002ovPDHLkV1k{b*$Dsu literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a0246870f8f7c5f477106954a81a14e3966f29a9 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoQ!VDx|6+TY^aRPioTxZ^V#mUCP(8r*wD8lf7 zAv@4eZKF6t27~Ggi+N=p8#)3Q)-ZTkC||g7gExm)XtK~NkK#Q*y^B3v978JRBqu2F zaY#!yWV%TwI~z0~w@?$&QOT()dB$j<{OrXk27$*PW=<9moVVD0xl@U3uVBNB!#d6< zmTh5SW9u_haf_zopr0OI;*Gynhq literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c2d81405d005997d9bf65e966b85af452997efd8 GIT binary patch literal 356 zcmV-q0h|7bP)lIKuglK3lGo@dsf{42xa&g$V_e0qziQtO2E?;6h?)iUffoc9OUwht#g>8z0Y=_hM0xovHI| zxHCXpnM1~al|-j$g#f;&@m2PC`R(j|&7?TilUbUz3L$B7K8ipo<@TAxABuK&?|E>x zghS~NbKeGlU~?}P2Tri{zt<<0R1>rW8s`ko_NgOAN$GTh12IE!68V4+C(QO(pvPYZ z9X-VsnUtq|#l7p?4Rui6@J>Ift;g4vZ(u9du~}~%pBL5B{m%0M0000k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$jZRL%n;xc;`)Q(2N*DXxWI5>2g8C13<(JW8X6iv^`l@k1crSGBguM`2ddawf`m;2}F z>G+K%Eq6Zs6-~0Q`^XiPSz)*3neg+8-?=Q0N>nz+^mTqd@mHuw>(SjKRol3;>aI=r zR9l>|=Ifrj7mE2eH&h&T3E~Z#ry=3B=%H=Afw+*GOks1ebYru7nQ`?*aGOZ z${!Wdcj5ko^oVJ(E)@VVNzcAw7Fc7Eb&lIThth#fh%N?b9YN?sv$r4!ro=*uMGk~x zf0zSGicJeb*bF?TVM4DhIR)rIt|kY(lunc$C19ih)*|4IDUs(`qxQb;`N;$st6u=` zQ3gQQv>zZW>fSv?Mrlxh%z^LiHC&kG5DW->fe02v0|*Yv7yzA=fV9rxNdtr;Fwy`{ zU5oIw25>?FNT|GrE^;ElB2_loMfOYxkxZ>Jz)sqxsQ^sm!`@)`GTJY4+Q%y3L`9G9 z^u3Rzs|6UlagYamUdHoVsdoqhPemV z+{JRlB4z>H>HxMY)@7?3{TE^uy9ZjEEE6$00000000000000000000Xr7z40006Y zNkl0QIHz^YFZTlZd zNt7}KT?!Nk2P608c#`KG&jbYQzu(otWj`lNcDhhCBIne?6*eM>uO_F-95&?)_YymnQ!r|^WJfU}~k@8fEB50(4wg5<3-xqQ!>e z{vhv-I>lFiwFH&b)^;C^kKe%UHfzJ@J=}iH&S!@>mn-&Dpx*<9*VBf1GYx)3gpX&| zzi7+nTe{vu8_sv$Uv<3}zV8-EOB@c~cr8Q;Ey=>UoOPg#DKK6<&H0%rg;j-T-tf7T zN&ucz5T#%W;9~jT?7+Yj0Ia~ARg9Dk0OY%r_eeCDx)zD>BBewU(YK;yaq4cjlUq~< z5Dp1e>Vw>%7R&WK#}Ea%)}CTl(lG!-sa3s)T74($;R0C$9Aq}f8`hA4;5rAt1E{W} v5-9R{T;eSlI_7;4ZjTWVkz@@bhIaS^?A}5X@kxO(#k7a1sYyf3n2U+A%iDp8 zXGdtm&J#`&OeqpwM-wIdj(?Cbb?UJ)WcTM|Sn9y$c%}451ju$zS3j3^P6Z_l1Rv$VAQ zU(KPZsrjFQ0|@3YaAYxX02NM2`UWH+z-`N;g+Nxjr;B4q#hliOdwCfYIovceJC!XO z!}`*l9^W|rbNzkQbdjfwT@Ew*4jy4Q>^;rrm6vTbMeEb0*MXNA{w~?KyTB)Teamv! z+N~Kf8)f2yC(C-AT4Thxa>o+KXW2&_=bY7b7L`8zkU8RvVB>@Dd==mPc!Ju`-@V_? ozopr06r>TuK)l5 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d9aa568beedb3e624035f2012595388a530c01dd GIT binary patch literal 917 zcmV;G18V$m?0000000000000000000000000RcoRC0009Z zNkl*Fh~Qmgk910-&m_HRp(V2TCJgDb5iG0A*^YpCdYe8ow)+ zH6ZaxhbFWJD#Uar1)#3Hu4-4QoF+Mpx-o`AF&y(c<9rh)2orGeV=q zT$S`K!EsE}^oE`@A->tcVrToFbVyy?7>z|&DgbDJ4jb05qxqjwNRZfCSe}>d=qc1KL_HL23p}9UQ0#0%{Lf zBN@=4qaYd3iUGGw=vT^NxZkKounY(h$*^dNr+m#40o{}yz;GqgD=jRk2mqWb69A0J za0+LIfUeP?m;!|m0U!ss$H}fHz}f-42XT8G>LWfRQ(!~DrKn}8(BV+_RvED!fhKc+ zh)QzU9nmNjivfsLMQ;rBR0CF!#r_imedTcks25nPh`lLA@*zC1E@=-VupwZ`@#Alx z)zJeP0U`ju3J=GsH!UOaC1ZcE>5U5!AV+bM9t+rP~PysUB`w#f5Gyb=_hQx2Ht z2?8QUmCouH*5BzUa2XKz3Gs?nJRhd4cRPB?{3+Jv*cxZo9&vd-=X~kZv^~N>Ij7t> zOGlhu`@#nAiG*f6YFh+WN!iQqxpfBEF@W)~W+1W>{|Yu}v5QlHb3~NAeP)2yCQR;w zjtG+Wc`y*-ZRaQU(D&A+A|dy02EBz1Mv8S@*qn zQ=WaB^X~tWZ$L?0;Ke$><3Kr6PZ!6KiaE&%3ET+@2_B`XKt?HNf(LJDVJb(VS&&+r qL6DG0QbL$eNJ4^v5YwzfYYqUd@8&)}jX8Ta$Z$_rKbLh*2~7YV0WXLE literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..dfe0bb27ec875ed69d5b36cff3a8d82d7f8327f4 GIT binary patch literal 904 zcmV;319$w1P)cVfVC^Fw0dDanjGch5biae z*XxNVp7@`G=FRs8D*HzRE+`6MBW9Sxo_OMkKNpjVfi7%5iD(~yHUpGesZM(|d(Z%d zcXd*#m3coe#P3=F?J!R~@x%`T@@nrBfC*}f28m3GKj%J0fN1+XM06_?zm|IGT3076 za*nE`ew?GIbF}TLcPOB#nUIlbcObC`p7tn}j9qM1OzGT%n|<)(A5VNYFg}DqHEQ#VCB-C~n*6?NH5A)8soMG2-pQwj1B@4_7b?736>~sf8L#if*9_)3RKt)3k6`DtV!_vs%xK zKUKqmJW{>n0$Nj4DzQ{^xd>BLF32>|Z7$?o*$YxnwZCEpsXL^0apfNvI>tRv&;c5D zB9}d+?7(YKBmNnnYaK+m1JunxhJFi%8Hm(h_h6J|07#Myon!~PkTJ>h3h=zpw4j$I z1%SG3)c}m!M+CM6po7VREqHfO695W8yDX*zT>!~(2wDoOeGD^b8QRq`9*h(QfLaQx z&bkBb_A3%lr&70|CCJ>%1waPoKO!ywoPD|l4T*sG77UF=;OBwk`}6hNfum)Sp)0>I zfG}F+H1tSFQF>nHUlHUOk^%!M4(1#uZnNG|M zRIT=9)>4!B6%Y+ZKoTI^dkAbb*qx>I5nv~B5~0+0o!FI<52a67~NL~Cj22GCf}=!V3A*7?Zx)btoI z9+X>1D8TQgQ)LDY$gD;jg1%kVlE;DGDpUkuEUetWaJE&@W$C~u+&u#A_F+1D4}L-W zSub_8l9U6!2cvcR+=DMO2tZ3A*_@_kaOn;lfRVz_JvgMUx^Dxz8SHw__F${KUL`ot e7DWy475E2H*lQ^xG(*Dx00002qRd3Jp=74DW~bv>&m;MQJPZu} W8~7IgR$ki%vd+`h&t;ucLK6Vw&^gcm literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5523bb8a7570bab7fbfdd46f16dcfb29fa32194a GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDU{h!V7{{8!B&z|8YuU)&g zb?esR;$rtl!P|g(?L1u^LpWw8Cmdk=k=Ro&zkn(KzB8-dz26Li0+U#||L#`N;1GIL xUmY0m@m=+X4uJ@kg>37%6Z!6>w8SPbFz{Q-b)VaPzz}E>gQu&X%Q~loCIFK{P)z^; literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..53f99276349f904ff50b85e5929745a15dde35da GIT binary patch literal 540 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|eg8-ip*Evc#Z>pYrS@$L7UXRKq zpE>VRzFgb$WnK(W9xEuV6U<{^U|jC$;uumf=WM8BQL_QhlLPEW8s`MI*)3?YHvYza z<_F`K2i1N*>%y0LzHJNHxpmf&1sN2*{PKi`t8 zE{2P>QKJ3LUET&h@B4uYMm&|Z<_fzvio8nU3t`TP;a;e4u-5C}^c z*7Vz}_FACm;gbwsUDSCC4%!EXFALf{;dF^&nrq^^nHowhf5c*~o;{qh+~i*JmK7l< z8vU0@yCpa9oifz@?#0F%z#x#aC;SS_3`L(w+kC78(^j2Ln)!5_SfB>(^b literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/new/punishment.png b/graphics/battle_anims/sprites/new/punishment.png new file mode 100644 index 0000000000000000000000000000000000000000..9215b6ec07019d39cf52c78ec4efb33f40749251 GIT binary patch literal 470 zcmeAS@N?(olHy`uVBq!ia0vp^3P8Mog&9cBe^M+DqznRlLR^zI|7SZT@9kOJlUxiG zBM8>me#vHFU`+IMaSW-LvvgYEq!tApRzW=lV|4+4hI{|>w69(B`V}a=e470&7N$zI zmIcb+4bR;_Zs}GsCFq;*U6rYQt0sL_`>4dsv39c6J6*Mp3r~6pGb@R|RGZD%tB^GN z^zkM)f!GN#0z1|=r76#Ch+w?*s!_G#LH?7RxzocLtwcAaCtvSE}@?d=wF$`ugP8_nTIq z3EJ@ce~#(|uMhuy>iJWqMFVdQ&MBb@07pf*{r~^~ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..372f9a378964fb0ad8da55b3fc1bd12e45c66d72 GIT binary patch literal 643 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|eg8-ipSBC!#@6Wz}e(>knwa<@E z{h4h!H<+;)D2WRQOHZ|7U|{0&ba4!+nDch(!ELh@1ln$@K)6Lfar@ApOA7kDncU^(ItfBCZ5g;|{opB64PWB9ORnO~e| zlc;bkpF-Bklq*^uyByCj3h7=D_^|G(G~<^Angq+pF10WW`_EdYkF6==StiSEoT6N9eMq=}K$7KiRHA`%goXMW2EBb04lXwYR zj*ZR!@ak literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..71d343eeb5a8f93b0a50cd832de74728bb9c2b6e GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvg8-ip*Z=?jYiepLC@4rsNC*fB zluka#CnN!s#07E|XG#I(B0OCjLn`KMz39l*V8G*YF{fyMj+%MKyZRQbgA&V{xPFz_ zE@>5-=%Z-c+FttM0|Un|9u5vD literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fa39b37fa6122c11134d2f02cf7289bdc3345ce0 GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvg8-ip*JnZ3{{LV5{a*F6bIIqH zTCMFdtj<;hO5y^}FQ;_?<&Jo|IEH9UoI7!^;9&)x)|D?@^_V5pI#MGJq_Y|9yHfUM z!+#FPCYCu$u5m|yzx#5bU!Y!V)2itwqO@O>PFm^k=H#MmqbD5}Yjr(1orMMGPpRx@ zJ;^N2B>ZdZ4@H3u%2rD3_L?e*^FQb0=@e{wl6CFS-FHtzcccp#E$~v8yPsgqtiQyn z@eB6~t}3YvW)8LHa}`;#4{m9$-R<45XN&JmzDZ}+#6-63HRO1|)@{z@a54Mpe#d5` nZ9AQPKJ)jUpZ=@%w0srgAA9@ys7tjoKz{Xf^>bP0l+XkKc_Vfx literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1ec3be87a48b8665dca7f41fd6ae075f0b1743ba GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<6!VDx?zobtBQU(D&A+9ri`~WhAgoI?}7&X)x zjm@~Nt=T+0I0Az?5>nZ+^VrKOc;*=MRhG|Q7I7lAs@}S8^_gw~)awtfZxlsdt*y=B&^Rg%e&1%Cb3Y7hLgj h?D(3K8S+J#q3NmiYyAy3?*ZMw;OXk;vd$@?2>{{dPHX@G literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/new/rocks.png b/graphics/battle_anims/sprites/new/rocks.png new file mode 100644 index 0000000000000000000000000000000000000000..4393817a771ae502b8dd8bdbaba4fa7c136da947 GIT binary patch literal 1361 zcmV-X1+MyuP)_*2X=T2euxW;gA$gS46LORpt)Rn000Es zNkld3S9uqHSK2 zpiu2*-%X5CO4@xBL3?PEylDizSUXL@Qxlzd$f<-3;;o|W!G9n=&->2L-R2+)`rMum z-{(8;JkR^SGntGEJChEZPn&jMl$th^{-W=@eMf;8q?A6!R!}w*K4?BaJlyL9nWq)Nk^q?f2+-7B6ko!-^n)qqs1UyY2woqa3jjQR zf)4B{K-$3sfXeQ{Jb-VpW6u*(Cv3~#1kk6z1R;bmXyTrlR|m+LDrYm=0YN{ZOex}F zj@KER76|~dQ}2D8+5+vsWJx&;>l91rZE#!~PXN9ngt$Roj|@D|Lvkq~=4lN;(*cyk z9Dtl5SRy16@BrXy2JU;_w)YS!J|M(?5`Y|Qc%#WV)|d}kfQ0LQe^-Okt=1pjjtil{ zID%GdB>?Z+1Ic5)vH}XGTaCc` zqS=7y>0xvL^JjP)h=(j3j;R{p?c89|ps=mpHh()Ftv%r0-{z_9&<r&y}}rP)e?e+&VkG^R6N7$4LmOp&X@+A&jr940dSo2dITH*CpfQZa8WC)c3=Rg zjUmYAonZteUMo#h(4m+g1n?B+Lv(Ts3-Ss;$sDC+ctQYjqZH$u6P6ens64NlmQ$dN z6?xSUOG)w=gGylxjSkVW0zp@;V!q%ca)@pvx3X!FoMd-OuZ#x=vzdQ8jP|^zVx+cE zPt~1u@5K-9;T%uUMkK281q3ZO&{#053$FX1)%sOCSTL*lYz%S^T-&pEH(D`(`CnLA z_$&a1gMh8C#b6Y`vXo!P3WwM6Lk1>#F3#BdGf7}MV+?`(sP(&ESqI2zus+Lzm4bqy zhwHu@07n71X0kCDm8%O;N8q_-y1eeX-(*7IIFv#jwhU@ui!8V|qn73ngqAA0dMIVH zsp%TWj;F`}A4S^+F)U&kBMESf@GITL1et+Rl?zU^nGGp{yctQ1lM2)#&@1IF0G||x z0|0{C0Iq}{22B1uNN90Hx9C|M;}qp^GPTJ`Z&|Jh(V$ej8h5-OCEiq&7M!dG-nP1^ z=((Z-UIfZ%aGe(QN}dbAwMp%vBxp(s;o3nmtv;0rP-!#-A#Y?OFf%_l2Oxa?J07l{ zkZ9Tl=CVfO7FzJavND`W5KBmwKK;hk|Hc03jPx>dS=ccNlq(FL;ZZl>o^y(LxK|T` zS0I-%8-tPpH$&1@coo1|DX&HzX8@cBiO!8&0e%F}-iEUsoOC#nT>qth6?jtG6k=Yk zd#c88ij=}6n-X@8+75*w1;nRb2u35|Wz{MQ^qnLCkBQd;@I&yFB0*_?_1oF`JPuC2zvAOzQ~SD}KG)Q*Xp+BJpOSYkUEObRQtJ*?h;^6mHw6P=Q_ T;~TwX00000NkvXXu0mjf+uvYg literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fda9142ad03a0a33cdf129d4077cffe4171b3af2 GIT binary patch literal 381 zcmV-@0fPRCP)CGGy)(rf^p z5fNb4Db>~e8^FNoo(*l5L!(|3S%3W;u~=kEjUW0&66-zyv}axzldCJEmdAZTfsNVF zNDk;5V!;hFHD=>+U?kQ$qODi%I8kh5edE05j%2&9kb)DgA;#2o#+T)s%3!QG#W!Q5 z&eX}q(z+C3TMF2N8|Ct6(njLKJiU5eOdyv5#|ulp4}Q4%xp00D7RV#v@Uy?$i#s@u bL?Ru(gS(ZItGi-N00000NkvXXu0mjfO~;>k literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..70f5235a7738b724097be5a9f0ab6bbca995dcf9 GIT binary patch literal 380 zcmV-?0fYXDP)ItMhymDKbg^G!A<}t^tp)B9@o_ zp8Z&)oHIk86L)prr|fwV6R)>KMu#5OES%>6GZ(b`1BawMKl%BXh3l%+6LL-Xr7pOD z^rxTxlDlG$!m)J)McMLzjN9|wj@6szRb{TEYPkUf^?dp{)A(n0-)%BFANB`3x^fnY aL;}BJxs}~{;=PXm0000Hhj~_n{ zY$#YTAz;apCC$yvj*gBeP8?`xXaFjJgYE3MsM!`8;N!OCw&AP)~iq%F^>=Q@1tAR|3p L{an^LB{Ts5J=-{h literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ff86f33d21cd4f83c7f7419eeb578c540ef8a41c GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvg8-ip*Z=?j_fMTuTHW&hB;S%c zhW``Y{@1JT_XSF02fy~`%?8Spd%8G=RLn_ESimu5>NGBe&o{lixtS-hI(d5^T%~}0000mP)t-sI@TeC zb1_Of8Dm-@85tSQwPR9BAt4zErIbnl004VyIx#5_2nYysV<}@&DLOG3jtgKo0003N zNklNX7F!G5B8S8#raX%)&Q_~^0gC}!n;>Z|2CM5Nh@C}9 z;YkD!S&PF;Ft4y+VPTbPtSl0DcAIN%n*U=MX2x+=s@b!-fw(aEKs=^&8QPZ15@dvc zF_sXXS;Ep?!f2oE#2WAE5#xs%VLIZqL0$8hhQm+ErCHrb`DTxW&B9qzlP{ZFLW~Vg zgm|DFps=k0mI4Xe`oWU$hb30mgxL??EHzH6M{K_}ylU2V23^-KY1ljK+up36^!=|r z=1s=y{wbbpx=KwA?v*;A3_#gd0FeU1CICc)ONfA95QZ;sKG(S8G00a9pAThjkmqtv p!~Sh1GqbwLvMYPcFQzLm`~z^SVKrewrilOm002ovPDHLkV1k*3o{j(j literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2eb8535654da6ea185df770b6f765fcbabe64272 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^3P8Mog&9cBe^M+DqznRlLR^9L%$u)(B#}UwCvO8# zDQAI4WHAE+-w_aIoT|+y4HOLVba4#v=zKfLnvX$&$LTfilYi4o6SUS|^ku)trdY=z zc%IQkEm=YO%8AN^tOTzIhb}0ebK6<^e@(zzd0khDN3~zjiJF5<8I6jj`+29bf!ycm L>gTe~DWM4f(G5CA literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/new/steamroller.png b/graphics/battle_anims/sprites/new/steamroller.png new file mode 100644 index 0000000000000000000000000000000000000000..8abdef6692ca1696b2d6d95b9728ca798bbf977e GIT binary patch literal 838 zcmV-M1G)T(P)- z=Cn)~$jH#i$jG|6xu~eHtE#AjgM(>kX*?_jIXF2H9V!nG4*&oFz6s0Z0008f zNkl?(0FprErgp5Iog7eYsC3OLb-o!HjRI$yB{%8CB(;d_u6oIxng z0mF37`@HKa=sq{*6P^ITj5Ceeqo(Vw@_qjVU#2FDSOd*=fT4IjEIRd_k^ub}*F z#1GvxBn*VfV|Eb$-Bs_`f6tKMCyE0_0rUt1k^c<1O-hr#E6*q(NyoYXMh8HXB1-nk z7v&t~rpJ?X*axOEx=G$~M>1iPNMI7_Eg-ctWUl_=jxC1GRS7(Z#cp^S!2-B5G?5l} zreooWv;ZDHjm2*Iz;t&2C71$|`=(oeF5QG%mjFMLFd}3}Rd-L;lhw3xQ^i}+YXDHp zBj;fixw>z5qS5OBFx(^ZKcdmma{x5z!6VAO2pAym0bu-@S)y`hHLs)H&*uR!g2)jx zyzUUr<<@PXd+W{yP}udvoW!`i@z#o%aQYQMeI(8)2|94Vv`YzZNxz^6yQsW{bYO znzP#h%*lq2GD2BxuF($E7gWDZQ3y5{+Uwe@c0l_BxcbuHvXo%svcTVr-|~hDv?g_w Q1^@s607*qoM6N<$f`-V1DF6Tf literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8e27efb9a2c528fad7817d986e35864703d5cd9f GIT binary patch literal 326 zcmV-M0lEH(P)Or#cy)!AL82muq2R`1#<_0azp)_8C4J} zW1s_1(%ZBtyMYG;fl5ueve3ko>5dHn!t`Mw{L0aRtN@C_ecy?w8dS#4M5E5UV%&eu Y2WF&G=u-g_xc~qF07*qoM6N<$g3EG&EdT%j literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8ee5d4a2fa6aa505542d7d4eff8e049fc715e242 GIT binary patch literal 1317 zcmV+=1={+FP)l*O6o3u5ab;#YHU(O5KFLEy>nNa(CxyoXf~J&r1EHl8?RE-KKoq=n zF$r#M&4J}Y+p)!-mo5Uz+@I^C6gW2cWFl=5HHqG0!tdj~yT{}4)5gX-#3L#Hd@yfw znLUsnydb7ETApXl3qsn?(i)8M3gF8C2Dv^Vrai>-n}l?12Y}~?IIvF$WnAu?{jbp) zo4Wu|OLDvaB@Pfmc1b4@wBu+D=#nZrQa-mVv{lvo3E7jp$61Ee=o6C?vnOpLrH2E% zCZUdW$)1f);umw5(6*GK+v~P5;8(g!%#IXHO4`v#jk5~a6Z>sP(mf2Ab)kggR`cvW z#eniVYElVnIY{h76gXq7Cy2=gGcm*fo!AW4NZNx^j!-~L$pxhyuS`=M5P~_B_C~r) zv0iJJa@y-!;!vk)iY~KllRe?shozJV@Hpvq0FZ(YQ(+A-z~(M_lDL*Wqa6g;P9y+d zq%PCHQEY^5A*D-cDjjVzK12X_-X<^cO3wMH4m`5W9smcaH?x_80bTOM-8U^SOIS}X z0R&@gkV$Ac0&I3^NA44LkO|h~NUJxyZ3|wz_CaQ|o`V65S+Yyp0}b0kB2Tjd=5v5H zI2iC5{9oA2^0dH#ZO$AHqhzpeBo1(4G3I1twgiAz#;Phv58h1_fC<0=GuM&mrkw*$ zre}6f%4`|nX$?;z(;5R3VR@<6XB7rW4JdgvveqsDNs0h7E}V*}+62o)0Li(NrE`G8 zGHO5~s-2crR^^=(2eR24V6+6#rI1y_B=)f2&LKPrIS&kYEV-xkBJZJq)~QY)3ny5HZI}v3 zMCLsN9>a3l1?X>gwl$`d!ZE)JBYo~p0 zPD>BKX%8`#4!7Ays*$~?gMG(Z7jIzpUhx)au0n;FuC|E_N!}vxAb)cw#OJ=2i z1%a9(fC69|D=USe6tHz*8k`idQYs2!6~uWB*nphMjT=3uko<=hFIQK(wYt*lc=z~x z)f4zMqPflao4>{+e}ID6I*J>Hit0z;{b*WCnl~A#YBEyQWTdLeNL7=O8cjxOylODg>!ZoTMtbcZUA#5Y0?`BCzq~cl zZ~aLPXpQ}!K(%(%B^c>72AujQS6qZ~6#w!2*pKR~2>nS6ZV>v%N`({T?JA=1C@!L@ zAFJ09<`1A4;2lO0<;F+h59?UR|0dQ(`HqpVdIJA8-q+6;BX0owCe=b+%(#1vy4K4( zzPEhvAYUq4`TV}{Y9U(K7 zQrh}?E?UvK*)PyuFGTB`U}E=Ak5Pc^C_+O2r$uyH_X_|*|ELHjk@AaZe1ZUB1Ofh`Zj>spRj4S^@JN-~ bsQbg;u~EwqX!wfH00000NkvXXu0mjfDd|)j literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c13ae95d0bf60f8a63243da50fee7c6d065937f2 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoQ!VDx|6+TY^aRPioT!Hle|NpNxf4e&6+r2H{ zf{y-Ay86HP8BnbG|NlAv|8D^*KnCj$uUQ1-D|@;)hE&W+4k#00VG>ksb3DYM&0=^Y kn4NoZv0{g!Y4QXE2D?_zz?X7&AA_`ey85}Sb4q9e03!u6$^ZZW literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fd31e1063caf280c84d463508e0c1ee028eb5938 GIT binary patch literal 488 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|eg8-ip*S9h%6&(>C9u5n3GyugW zEXc?x2>9{i$B73kG73C^B52@Euk1>o5NCl$WHAGSPzeY#-b<6OU|?X3^K@|x@#uUz z*)Z?00go%MqxgaxaoOa^7kS1vSI@9@NZe9AEpFlS7rolIJ$*Whn6_m9JLUdq@}jOs z3-^1zeaDbnuU`3Lo43zNu8*a{9~74fZm<4P6wlM~d#%taMsHoVrcY)jH~7SF>MZ1) z*1_IT*nA<^{5az)hbJ~Y3lCIxgu5T8U3TPlVhmTvlhb$1+VVP?EtpDXYTDaB&}rHr z#CU)+Oft|h@^qtHh{Oex>m>%8TKOZd*Ib{HBzUAz!Eo8PHs&<-Web$`13D`no;}N# z=pQe$VDSfm%90z))wZNIFjnps)6Hj0X3BV@G_UcnFdGDVb26|s3A`;~0?KiGo z@XTyMWqWnQ#;|#N){gA(x7-Z9)eEflN zLzHw3gD~U8X<`a;!Fvr7>V&&=Mf&Ck3-8+=u|#>-KCz`Q#Vzo7sC literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5d563900c0683c2066d33b91a3b91e9ecaf7beec GIT binary patch literal 420 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|eg8-ip*S9h%6&(>C9u5n3GyugW zEXc?x2>9{i$B73kG73C^B52@Euk1>o5NCl$WHAGSPzeY#-b<6OU|?XB@^oU=pfk2BWuYSP;pP;4<>RSq~`FJG-?_gas)5cxu>x!Mn&q+@9Tdrh!`l_ufnvJL4`}iZU$Y)F@{NbT|_CNjvF5M6$YQ&8GXj;Zv-#{Eipv zmajRmsyTo$z=rYR0?EMWgoz9{vJ@vSSXVC{m6&Q~Uz`27!7TcS&GAOH5|?hxBQ4Pm z?`L1=;$(|{pU<;kOX80Y_Y&GIxRzhI_glVBhnw>N`!`mH>-qc#LYNk0r!-W!uvYRs zxc={1^@HwHjHf&p&XlPno$(XszVP9dThy_ey95=!rD_!j`}PZS6Q6I)leot{-Z{f};X$JO_@w!Rd<``s%+&@1>VC^S7?{an^LB{Ts5EJUSX literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9d037b9a940d2ca7b4dcdf1875d68dd65ac441cf GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!VDxk7i7!@QU(D&A+B4W$;!yc2sh7_s_7ML zTO`!ESh#bpLPa-F9xFKce8McC#B5I&$B>FSZzpf$VlotP(XW3XlabY&AUpdC`?|lP zyZ0v8IehqUxbn=JucA%2-zJx@GQYg#A;TW_gyRZU4LAQj2;yL|@%tkD=<77jH?CrA z%e0%d%9+@=ex3iZT9VN=`2*t%$!2GZZ#|U^`kBRY4k5v(QvQ zI@;RWDk>^CI5>dvSb@_=*2@eGj4_@rjv*Cu-cH$=*K8orw)t+&Rwm;`D>f@~7SDdh z*)dg8(eSaw#l3asRU{_QP%3>jAwEIp{`1}Uk8OzB`^DdN&HYCTf*WV^3r99&uJ)T`Opl;22UBoI-O4f>5DJRl()BL&zNBq!Qk*cIo~y@@rm0H(|3GF z);-(yFsEo1)32AN%)G(AeSvnq8#%u4xil}z6Ymf~`TEX{#JU6W`{m zGiPh^Rj!(HWUZD^Xy@Me!%US`dl+XgX1#QZ*}?6{zo~L1o=bl2kyyFPM|EqoMnd=O zSIs>98G1Qfi+oOA+u7oAa?&Z$NQHNAguN!+-^%{vyn`K6TCG)ig8R<%<@Z}Zr`oRx zUVpO0p=Q<3t!3XzZlAu87}3_b`+%qVjxNCpuIOyO1(FXQg>B@m)A;hz%xk{W0oJ=V uvh57EVR0-9JU!nnWF#3qAW5cn=*IH=X#p_ zTEX$-+>}oZA9I$znVu8QXnOm#!|H1<>KRY|Ov-)#^8U8B$(xrQHh!?Rr8-0}r+>|S z#?_ZUCghtZd^y*f_4%Bylk0@MIUEiA3;`;g6C1-;d`;z9@c0t@EW6@(jgvEZ_fG%H zIboNN!*0PY71kvS7CvRaTdf|*$RX+eLS(^S;W_Jcb3UsyE?339QMdy$@>c zp7?({!+YikzaL^g3}L=!jU$(Nsw~)lX_}d&#Xi4hk{kMr7wl*H=jghRF=YOZhF{JL zJpC7}v);$5!)M2Ee&g@9lJ)1`uU0kVY2|(Jea$NiKat?}^Y)BM?mL=j!;B57&jq z#|>jUSb|6Wejc;@#CBeXIFkbu@rE|Y2;TG2Nx;Q}-L#u!R^fjqm zT;m_&?W7Mf_U=2$V|6%$9LC{kLcRg&_C0pT3Y$O#@e_+BA7bMFD*(#O;zH!e-(FFy z8xs*_=dqEq%5Ix3ib-ZGofENcKW%E>+s(3Ag*!ngus*Z^LG0v9QF|7b%QDQ#)?^1b zG5KbtL+sgR;)UhCZVZif5snjrvb=aMYw7?oA;NuXIC=Bl10r^(267kxvOSv}2)5M& z{O)Z-c}vyT4&e6Uz5eXO2xwws&^XAO01(U%VJMEP3fVSzKxoQoKG8BJz()1pl5A0f zlRN<*V2Rc_hCy7QDk5@DN767_@QLJ7185U`n_UI)q1|#Q$t)*t0+i_4v6y`HyQ@b7 zu}^7pl4esNE*|+I(xiiagM-A#Uc_mc20A#CNDd1?@#2%mIG7`0_Yt3+tSZFB!(N(- zJRh2VWKGPa+-WwfJYXkc-u;W5E7wD^^j^BBI5#E^ccoVo@of!SGS@-ikzZY;F;tFu zd{f}QctBo$vB25;j~f2p0IdUyVdP>v7V=tCw=_sTx11TmJhP}*rjZ{Lhvmir#?!O$ zztZHHhm8A{Wd2r&$d-rP+<5+R>aigg^LYLemr^@cn>O-JPMcKQg%rE-c%UdaPQ|4# z$~Pfv2ORtdwZjY+NRUoxk4!E2d~~}7ADXz~2Uwm-&XuO!E2^_7oG(F^9wwEjStsiE z!jtHTQmoqE8BuDrwj8OMQqo#LqP4M{36ippE|kWURIUqzZlSg5kvLw3Go5Jw#B4q7 zW8J}51hhnpYd--ZMXI`)tSRd0&!T|qegU9vflSWYr<26X0A$LWTzi_XFx&w8mHAsK z)xstS`1|HXySwR}_`yCkd`{V1>D=lH@z6GFbLEN*qRupN2)H5f_(gHRsr_zc|2d&( zVRK&+ZUnMW+HiO%cy%2@?RJ;|76)B%q=r6^!lgnuE}STUx_T9t@wu@GjgV{9swxNN z7%ej&R1|u?0KjFNvhdN-fx9Gm7VT4*$R*Ky_7NyPi6a(Q%`YbiGiPmv-&2sTv20$! zqa49?gQin~&rGT6kQ`sjUF2E35L`44nnP)*f-D-S#eGl|ZIT)DYpGlF=OP>BX0JvB>%i^M~S zBM>4rPB0hPPSW8t>N=wZXqIN}`g{+h`E3<78UR^KBSj5}Y_w&z9OO_D-E9yKy8u#s z4K0r-^4+L{@Uy}p+Ls@S6JK$CGLKDNx&a<9nGxOn)$)c7)wEZSWV;l~vi`cab{?*5`y-D_^9+`{yA7{SB zsg*Mv_DbO#;E?pP-;z>ZU%IAFVq~GNVU#<&)knN3R6mISo@I|7J5jFBJlFKNYEC-4 zk*sQ&HJJ5fw-Sbh0%!hHR<2C!k|Y-$!e@Y&C|)Sc^KsDbQhX?f@&cgmjUmCRp$ECb z1Xwl;$)AAxve`0QKs_0YA$k0Ap-%iTkru?tN!jG8wblS^!>x&tk%jPPL-y*;OR=+j zzR^K>_4f9`W>!x~Wng-~1viK<#DUY|OY4W%CmI=ZLi_;>FUt+w!z+0J0000=lW literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4f30b2133dcca00deb0874af741c321f3ec21d59 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoQ!VDx|6+TY^aRPioT>mQ?N^ae1cqPk_P= zZc)xy?vy3WFAFAku!R^lM`UMId~}`AXl`Y7fURjwfQZAk5)lDbhP)CbyHbT!Z9vNy NJYD@<);T3K0RXhmR=@xN literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/new/wood.png b/graphics/battle_anims/sprites/new/wood.png new file mode 100644 index 0000000000000000000000000000000000000000..1b64a647f5ce0f878de260bac06bcdf5ecc0cbc1 GIT binary patch literal 881 zcmV-%1CIQOP)BjU5Xax(!5TH#F}O<)gj#GtAz6|skSxs>!D|aqhYU@JO!4v(L?9`o zmdVo179HbBn+3)#ZigBKEz#0I3H>%bIkI&3LMa3~r1S`Z_v7B(y?g(AvJhxSh$c!i zLa@LlB!qV2+DGpS(06_$aIFepsQ5|)9gs7d0v{5$rAQ1PQV9eM6j(C~4CPoeNA(DR z#B(MDbYshN?4z>OevCmm0GTjwY^72MZi|3{58g{SB!wVgr6Q2hVWoofIJmMnz)~el zN`RGF(qn~mEUk8IA^-!9bZH^|&J>Mx^^0kmmjrw=o6~)>1cCWrWRAX`l$E``oPKYV zO~v~Tf`G2?Xw{%dQd!UbpKdo6q%zDhAM8#V3vjWS^|iiK%Uvo_v@QmngVFY3?y?mP z@xU$f+3v{#L{GbMd$go-un|S83eueevj}q0@3cLD!vd^!A)#&F%68DER`4EB?o4)` zrzuss+Rb_HB&0j^d*VAX2d0L(1F(tWJF@AZ8Z^2-ST0eiagOp~InH&(y^ncSVld`{ z6NZGAqHlo+-zYNpbHW~ryIK%v>*gLKfvh(RwV+kaSIyBr0jE-$wFv=drs+=E>HIO9 z+IiPmLyRu=(56z)Zj!zQs6dN74#L1TbD-LC_JK#mw$i5IsLxsqWI3a)#Af+|9`Uc>C`&3H_LfV>+R-vwJZ$E&_{im;`*4o|F{n4#S{MO$ z_-}v1D*9TVxV53S)}D{8NCWgancMOjcMvPuMBaL{{!#k{k;_KLriUb&00000NkvXX Hu0mjfT=bMR literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..bcb30987545a447675c602c667ec73c368675444 GIT binary patch literal 381 zcmV-@0fPRCP)b;z6o$Q-f#oe>_W%d*zy&Ngfl=2Wg{&A*ETBV|s=YyFse2_Z(7_C> zRdc95M|2{87^-gh2FuF(_5FSkqNnFSk?T7FH@YJr>Q*?SP6Z1(6*5nO3@02lz!FJU zkRl1n3M-PJ6rw^3=_vE*;&U3cB{ph&{VbPi(jri$m%d@`D|M^bu-;RaXL)*pzg0B# zZmHC`S;Dt3@}ig({*%K{abR+Rfv*s@TJPV{ybd9}>1hZxC^#`&ec-dbBn3Y7^aKN< zj&Wy>F-A}!#P_E$vtvBNErvT|%=`=rn8Az#<`K@tvn{M$*e599X|X8m14;~Df59a^ bJ%8i}U7b&4q@t4C00000NkvXXu0mjfYT=yd literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/punishment.png b/graphics/battle_anims/sprites/punishment.png new file mode 100644 index 0000000000000000000000000000000000000000..9215b6ec07019d39cf52c78ec4efb33f40749251 GIT binary patch literal 470 zcmeAS@N?(olHy`uVBq!ia0vp^3P8Mog&9cBe^M+DqznRlLR^zI|7SZT@9kOJlUxiG zBM8>me#vHFU`+IMaSW-LvvgYEq!tApRzW=lV|4+4hI{|>w69(B`V}a=e470&7N$zI zmIcb+4bR;_Zs}GsCFq;*U6rYQt0sL_`>4dsv39c6J6*Mp3r~6pGb@R|RGZD%tB^GN z^zkM)f!GN#0z1|=r76#Ch+w?*s!_G#LH?7RxzocLtwcAaCtvSE}@?d=wF$`ugP8_nTIq z3EJ@ce~#(|uMhuy>iJWqMFVdQ&MBb@07pf*{r~^~ literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/quick_guard.png b/graphics/battle_anims/sprites/quick_guard.png new file mode 100644 index 0000000000000000000000000000000000000000..71d343eeb5a8f93b0a50cd832de74728bb9c2b6e GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvg8-ip*Z=?jYiepLC@4rsNC*fB zluka#CnN!s#07E|XG#I(B0OCjLn`KMz39l*V8G*YF{fyMj+%MKyZRQbgA&V{xPFz_ zE@>5-=%Z-c+FttM0|Un|9u5vD literal 0 HcmV?d00001 diff --git a/graphics/battle_anims/sprites/water_gun.png b/graphics/battle_anims/sprites/water_gun.png new file mode 100644 index 0000000000000000000000000000000000000000..4f30b2133dcca00deb0874af741c321f3ec21d59 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoQ!VDx|6+TY^aRPioT>mQ?N^ae1cqPk_P= zZc)xy?vy3WFAFAku!R^lM`UMId~}`AXl`Y7fURjwfQZAk5)lDbhP)CbyHbT!Z9vNy NJYD@<);T3K0RXhmR=@xN literal 0 HcmV?d00001 diff --git a/include/battle_anim.h b/include/battle_anim.h index 70f65123b2..5189c82112 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -224,9 +224,11 @@ void AnimMoveTwisterParticle(struct Sprite* sprite); void AnimParticleBurst(struct Sprite *); void AnimPowerAbsorptionOrb(struct Sprite* sprite); void AnimNeedleArmSpike(struct Sprite *); +void AnimTask_CompressTargetHorizontally(u8 taskId); extern const union AnimCmd *const gRazorLeafParticleAnimTable[]; extern const union AnimCmd *const gPowerAbsorptionOrbAnimTable[]; extern const union AffineAnimCmd *const gPowerAbsorptionOrbAffineAnimTable[]; +extern const union AnimCmd *const gMusicNotesAnimTable[]; // battle_anim_water.c void AnimWaterPulseRing(struct Sprite *sprite); diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index f9598c6658..0883fafe93 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -296,6 +296,7 @@ #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) @@ -321,6 +322,75 @@ #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 @@ -376,6 +446,52 @@ #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 diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 8e68db99d2..8472c3531f 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -88,4 +88,21 @@ #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_SLEEP_TURNS GEN_6 // In Gen5+, sleep lasts for 1-3 turns instead of 2-5 turns. +// Animation Settings +#define NEW_SWORD_PARTICLE // update swords dance particle +#define NEW_LEECH_SEED_PARTICLE //update leech seed's animation particle +#define NEW_HORN_ATTACK_PARTICLE //update horn attack's horn +#define NEW_LEAF_PARTICLE // update leaf particle +#define NEW_EMBER_PARTICLES //updates ember fire particle +#define NEW_MEAN_LOOK_PARTICLE //update mean look eye +#define NEW_TEETH_PARTICLE //update bite/crunch teeth particle +#define NEW_HANDS_FEET_PARTICLE //update chop/kick/punch particles +#define NEW_SPIKES_PARTICLE //update spikes particle +#define NEW_FLY_BUBBLE_PARTICLE //update fly 'bubble' particle +#define NEW_CURSE_NAIL_PARTICLE //updates curse nail +#define NEW_BATON_PASS_BALL_PARTICLE //update baton pass pokeball sprite +#define NEW_MORNING_SUN_STAR_PARTICLE //updates morning sun star particles +#define NEW_IMPACT_PALETTE //updates the basic 'hit' particle +#define NEW_SURF_PARTICLE_PALETTE //updates the surf wave palette + #endif // GUARD_CONSTANTS_BATTLE_CONFIG_H diff --git a/include/graphics.h b/include/graphics.h index 5a5c984daf..68701934cc 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -4754,6 +4754,167 @@ 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[]; @@ -4770,6 +4931,15 @@ 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[]; @@ -4814,6 +4984,108 @@ 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[]; diff --git a/src/battle_anim.c b/src/battle_anim.c index c89f582e62..6dee835bee 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -1130,8 +1130,16 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_Pencil, 0x0200, ANIM_TAG_PENCIL}, {gBattleAnimSpriteGfx_AirWave, 0x0100, ANIM_TAG_AIR_WAVE}, {gBattleAnimSpriteGfx_Orb, 0x0200, ANIM_TAG_ORB}, + #ifdef NEW_SWORD_PARTICLE + {gBattleAnimSpriteGfx_NewSword, 0x0400, ANIM_TAG_SWORD}, + #else {gBattleAnimSpriteGfx_Sword, 0x0400, ANIM_TAG_SWORD}, + #endif + #ifdef 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 +1162,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}, + #ifdef 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 +1195,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}, + #ifdef 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}, + #ifdef 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 +1272,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}, + #ifdef 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 +1288,19 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_CircleImpact, 0x0020, ANIM_TAG_CIRCLE_IMPACT}, {gBattleAnimSpriteGfx_Scratch, 0x0a00, ANIM_TAG_SCRATCH}, {gBattleAnimSpriteGfx_Cut, 0x0800, ANIM_TAG_CUT}, + #ifdef 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}, + #ifdef 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 +1309,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}, + #ifdef 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}, + #ifdef 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 +1352,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}, + #ifdef 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 +1368,11 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_Spiral, 0x0800, ANIM_TAG_SPIRAL}, {gBattleAnimSpriteGfx_SnoreZ, 0x0200, ANIM_TAG_SNORE_Z}, {gBattleAnimSpriteGfx_Explosion, 0x0800, ANIM_TAG_EXPLOSION}, + #ifdef 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 +1399,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}, + #ifdef 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 +1418,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}, - {gBattleAnimSpriteGfx_GreenStar, 0x0200, ANIM_TAG_GREEN_STAR}, + #ifdef 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}, @@ -1439,6 +1495,75 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {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[] = @@ -1448,8 +1573,16 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_Pencil, ANIM_TAG_PENCIL}, {gBattleAnimSpritePal_AirWave, ANIM_TAG_AIR_WAVE}, {gBattleAnimSpritePal_Orb, ANIM_TAG_ORB}, + #ifdef NEW_SWORD_PARTICLE + {gBattleAnimSpritePal_NewSword, ANIM_TAG_SWORD}, + #else {gBattleAnimSpritePal_Sword, ANIM_TAG_SWORD}, + #endif + #ifdef 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}, @@ -1463,7 +1596,11 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_BlackSmoke, ANIM_TAG_BLACK_BALL}, {gBattleAnimSpritePal_Conversion, ANIM_TAG_CONVERSION}, {gBattleAnimSpritePal_Glass, ANIM_TAG_GLASS}, + #ifdef 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}, @@ -1472,7 +1609,11 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_HitDuplicate, ANIM_TAG_HIT_DUPLICATE}, {gBattleAnimSpritePal_Leer, ANIM_TAG_LEER}, {gBattleAnimSpritePal_BlueBurst, ANIM_TAG_BLUE_BURST}, + #ifdef 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}, @@ -1501,12 +1642,20 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_HumanoidFoot, ANIM_TAG_RED_FIST}, {gBattleAnimSpritePal_SlamHit, ANIM_TAG_SLAM_HIT}, {gBattleAnimSpritePal_Ring, ANIM_TAG_RING}, + #ifdef 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}, + #ifdef 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}, @@ -1570,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}, + #ifdef 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}, @@ -1578,15 +1731,27 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_Tongue, ANIM_TAG_TONGUE}, {gBattleAnimSpritePal_Smoke, ANIM_TAG_SMOKE}, {gBattleAnimSpritePal_Smoke, ANIM_TAG_SMOKE_2}, + #ifdef 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}, + #ifdef 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}, + #ifdef 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}, @@ -1595,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}, + #ifdef 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}, + #ifdef 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}, @@ -1630,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}, + #ifdef 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}, @@ -1669,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}, + #ifdef 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}, @@ -1684,7 +1865,11 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_PinkPetal, ANIM_TAG_PINK_PETAL}, {gBattleAnimSpritePal_PainSplit, ANIM_TAG_PAIN_SPLIT}, {gBattleAnimSpritePal_Confetti, ANIM_TAG_CONFETTI}, + #ifdef 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}, @@ -1757,6 +1942,76 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {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_QuickGuard, ANIM_TAG_QUICK_GUARD_HAND}, + {gBattleAnimSpritePal_BlacephalonHead, ANIM_TAG_BLACEPHALON_HEAD}, + {gBattleAnimSpritePal_DracoMeteor, ANIM_TAG_FAIRY_LOCK_CHAINS}, + {gBattleAnimSpritePal_LightningRain, ANIM_TAG_IONS}, + {gBattleAnimSpritePal_Chop, ANIM_TAG_CHOP}, + {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[] = @@ -1788,12 +2043,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) = diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index 07ac5bf570..66a5272c77 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -2837,6 +2837,51 @@ const struct SpriteTemplate gWoodHammerSmallSpriteTemplate = .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) @@ -6687,3 +6732,27 @@ 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 e6ac7ffb27..a8b54d41df 100755 --- a/src/battle_anim_effects_2.c +++ b/src/battle_anim_effects_2.c @@ -1232,7 +1232,6 @@ const union AffineAnimCmd *const gPerishSongMusicNoteAffineAnimTable[] = gPerishSongMusicNoteAffineAnimCmds3, }; -extern const union AnimCmd *const gMusicNotesAnimTable[]; const struct SpriteTemplate gPerishSongMusicNoteSpriteTemplate = { .tileTag = ANIM_TAG_MUSIC_NOTES_2, @@ -1284,6 +1283,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); diff --git a/src/battle_anim_electric.c b/src/battle_anim_electric.c index eca10f2b49..b49427bc79 100644 --- a/src/battle_anim_electric.c +++ b/src/battle_anim_electric.c @@ -456,6 +456,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 = sAffineAnims_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 = sAffineAnims_GrowingElectricOrb, + .callback = AnimGrowingChargeOrb +}; + +// functions static void AnimLightning(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) diff --git a/src/battle_anim_fire.c b/src/battle_anim_fire.c index dbb21fe6cb..606f498d4c 100644 --- a/src/battle_anim_fire.c +++ b/src/battle_anim_fire.c @@ -510,6 +510,28 @@ const struct SpriteTemplate gLavaPlumeSpriteTemplate = .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); diff --git a/src/battle_anim_ghost.c b/src/battle_anim_ghost.c index 4671edbd48..273fdf38a4 100644 --- a/src/battle_anim_ghost.c +++ b/src/battle_anim_ghost.c @@ -249,6 +249,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 = sAffineAnims_ShadowBall, + .callback = AnimShadowBall +}; + static void AnimConfuseRayBallBounce(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, 1); diff --git a/src/battle_anim_ice.c b/src/battle_anim_ice.c index 7a6f1352d9..ea46092d9a 100644 --- a/src/battle_anim_ice.c +++ b/src/battle_anim_ice.c @@ -561,6 +561,17 @@ const struct SpriteTemplate gAvalancheSpriteTemplate = .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 = sAffineAnims_IceCrystalHit, + .callback = AnimIceEffectParticle +}; + static void AvalancheAnim_Step(struct Sprite *sprite) { if (gBattleAnimArgs[3] != 0) diff --git a/src/battle_anim_rock.c b/src/battle_anim_rock.c index 7b4b448ace..22f9f2f8e6 100644 --- a/src/battle_anim_rock.c +++ b/src/battle_anim_rock.c @@ -327,6 +327,43 @@ const struct SpriteTemplate gStealthRockSpriteTemplate = .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; diff --git a/src/graphics.c b/src/graphics.c index 5df0bd9b1a..2fe076cdcd 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -41,6 +41,250 @@ const u32 gBattleAnimSpritePal_MegaParticles[] = INCBIN_U32("graphics/battle_ani 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"); @@ -1141,16 +1385,205 @@ const u32 gBattleAnimBgPalette_Solarbeam[] = INCBIN_U32("graphics/battle_anims/b 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_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 sBlenderCenterGfx[] = INCBIN_U32("graphics/berry_blender/center.8bpp.lz"); From f1f400091416292efa0afec3ccf55d21bd8e57da Mon Sep 17 00:00:00 2001 From: Philipp AUER Date: Sun, 24 May 2020 18:14:59 +0200 Subject: [PATCH 589/667] anim: add some animation moves (#383) - fell stinger - draining kiss - kings shield (==protect) - scald - fire pledge - water pledge - grass pledge Co-authored-by: SBird --- data/battle_anim_scripts.s | 403 +++++++++++++++++++++++++++++++++++- src/battle_anim_effects_1.c | 13 ++ src/battle_anim_water.c | 45 ++++ 3 files changed, 460 insertions(+), 1 deletion(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 32fe89068d..9c591e95c2 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -4701,7 +4701,50 @@ 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_W056, 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 @@ -4868,12 +4911,325 @@ InfernoAnim: 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_W056, 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_W056, 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_W056, 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_W053, 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_W053, 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_W010, 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_W010, 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_W010, 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: @@ -5171,6 +5527,24 @@ Move_STICKY_WEB: 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_W013B, 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_W030, SOUND_PAN_TARGET + waitforvisualfinish + delay 1 + restorebg + waitbgfadein + clearmonbg ANIM_TARGET end Move_PHANTOM_FORCE: @@ -5314,6 +5688,33 @@ Move_TOPSY_TURVY: end Move_DRAINING_KISS: + loadspritegfx ANIM_TAG_ORBS + loadspritegfx ANIM_TAG_BLUE_STAR + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_RED_HEART + loopsewithpan SE_W204, 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_W213, 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: @@ -5394,7 +5795,7 @@ Move_FAIRY_LOCK: end Move_KINGS_SHIELD: - end + goto Move_PROTECT Move_PLAY_NICE: end diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index 66a5272c77..df9be5738a 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -776,6 +776,8 @@ const union AnimCmd *const gRazorLeafParticleAnimTable[] = gRazorLeafParticleAnimCmds2, }; +void AnimFlyUpTarget(struct Sprite *sprite); + const struct SpriteTemplate gRazorLeafParticleSpriteTemplate = { .tileTag = ANIM_TAG_LEAF, @@ -787,6 +789,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, diff --git a/src/battle_anim_water.c b/src/battle_anim_water.c index ca17ab36ae..e975a8fe0b 100644 --- a/src/battle_anim_water.c +++ b/src/battle_anim_water.c @@ -21,6 +21,8 @@ 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 *); @@ -191,6 +193,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, @@ -248,6 +261,17 @@ const struct SpriteTemplate gFlamethrowerFlameSpriteTemplate = .callback = AnimToTargetInSinWave, }; +const struct SpriteTemplate gFirePledgeSpriteTemplate = +{ + .tileTag = ANIM_TAG_SMALL_EMBER, + .paletteTag = ANIM_TAG_SMALL_EMBER, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = sAnims_FlamethrowerFlame, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFlyUpTarget, +}; + const struct SpriteTemplate gPsywaveRingSpriteTemplate = { .tileTag = ANIM_TAG_BLUE_RING, @@ -854,6 +878,27 @@ _081075DE:\n\ } #endif +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) { From 6c20a49dc602592319bb836061fd1ca4d7980320 Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 25 May 2020 00:37:32 -0600 Subject: [PATCH 590/667] animations for all moves --- asm/macros/battle_anim_script.inc | 40 + data/battle_anim_scripts.s | 8378 ++++++++++++++++++++++++++++- include/battle_anim.h | 179 + include/constants/battle_anim.h | 28 + include/constants/moves.h | 41 +- ld_script.txt | 2 + src/battle_anim.c | 8 +- src/battle_anim_bug.c | 12 +- src/battle_anim_dark.c | 17 +- src/battle_anim_dragon.c | 32 +- src/battle_anim_effects_1.c | 70 +- src/battle_anim_effects_2.c | 18 +- src/battle_anim_effects_3.c | 12 +- src/battle_anim_electric.c | 85 +- src/battle_anim_fight.c | 56 +- src/battle_anim_fire.c | 10 +- src/battle_anim_flying.c | 20 +- src/battle_anim_ghost.c | 37 +- src/battle_anim_ground.c | 13 +- src/battle_anim_ice.c | 42 +- src/battle_anim_new.c | 5058 +++++++++++++++++ src/battle_anim_normal.c | 34 +- src/battle_anim_poison.c | 19 +- src/battle_anim_psychic.c | 7 +- src/battle_anim_rock.c | 29 +- src/battle_anim_water.c | 34 +- src/battle_gfx_sfx_util.c | 2 +- 27 files changed, 13829 insertions(+), 454 deletions(-) create mode 100644 src/battle_anim_new.c diff --git a/asm/macros/battle_anim_script.inc b/asm/macros/battle_anim_script.inc index 994e84ccd6..c54845e005 100644 --- a/asm/macros/battle_anim_script.inc +++ b/asm/macros/battle_anim_script.inc @@ -288,3 +288,43 @@ 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/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 9c591e95c2..56e7bf0db1 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -637,6 +637,98 @@ gBattleAnims_Moves:: .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 @@ -2845,27 +2937,27 @@ Move_FLASH_CANNON: monbg ANIM_ATTACKER setalpha 13, 8 createvisualtask AnimTask_ElectricChargingParticles, 2, 0, 60, 2, 12 - playsewithpan 0xce, SOUND_PAN_ATTACKER + playsewithpan SE_W268, SOUND_PAN_ATTACKER delay 30 - playsewithpan 0xce, SOUND_PAN_ATTACKER + playsewithpan SE_W268, SOUND_PAN_ATTACKER delay 30 - playsewithpan 0xce, SOUND_PAN_ATTACKER + playsewithpan SE_W268, SOUND_PAN_ATTACKER createsprite gFlashCannonGrayChargeTemplate, ANIM_ATTACKER, 2, 0 delay 25 - playsewithpan 0xce, SOUND_PAN_ATTACKER + playsewithpan SE_W268, SOUND_PAN_ATTACKER delay 20 - playsewithpan 0xce, SOUND_PAN_ATTACKER + playsewithpan SE_W268, SOUND_PAN_ATTACKER delay 15 - playsewithpan 0xce, SOUND_PAN_ATTACKER + playsewithpan SE_W268, SOUND_PAN_ATTACKER delay 10 delay 6 - loopsewithpan 0xce, SOUND_PAN_ATTACKER, 6, 5 + loopsewithpan SE_W268, SOUND_PAN_ATTACKER, 6, 5 waitforvisualfinish - playsewithpan 0xA7, SOUND_PAN_ATTACKER + playsewithpan SE_W006, SOUND_PAN_ATTACKER createsprite gFlashCannonBallMovementTemplate, ANIM_TARGET, 2, 0, 0, 0x15 clearmonbg ANIM_ATTACKER waitforvisualfinish - playsewithpan 0xB9, SOUND_PAN_ATTACKER + playsewithpan SE_W043, 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 @@ -2927,17 +3019,20 @@ Move_DEFOG: blendoff end -Move_TRICK_ROOM: - fadetobg BG_TRICK_ROOM - waitbgfadein - call GrowthEffect - waitforvisualfinish - delay 32 - blendoff - clearmonbg ANIM_DEF_PARTNER - restorebg - waitbgfadein +Move_TRICK_ROOM:: + call InitRoomAnimation + fadetobg BG_TRICK_ROOM + waitbgfadein + delay 0x40 + restorebg + waitbgfadein + blendoff end +InitRoomAnimation: + setalpha 8, 8 + playsewithpan SE_W048, SOUND_PAN_TARGET + launchtask AnimTask_ScaleMonAndRestore 5 5 0xfffa 0xfffa 15, 1 1 + return Move_DRACO_METEOR: loadspritegfx ANIM_TAG_WARM_ROCK @@ -3524,7 +3619,7 @@ Move_JUDGMENT: waitforvisualfinish createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 83, 1 createsprite gJudgmentBlackChargeTemplate, ANIM_TARGET, 1, 1, ANIM_TARGET - playsewithpan 0xb1, SOUND_PAN_TARGET + playsewithpan SE_W048, SOUND_PAN_TARGET call JudgmentInwardSpikes delay 5 call JudgmentInwardSpikes2 @@ -3572,7 +3667,7 @@ JudgmentOutwardSpikes: 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 0xA1, SOUND_PAN_ATTACKER + playsewithpan SE_W054, SOUND_PAN_ATTACKER return JudgmentOutwardSpikes2: createsprite gJudgmentGrayOutwardSpikesTemplate, ANIM_TARGET, 2, 1, 1, 0x2D, 0xFF9D, 16 @between up and upper right @@ -3583,7 +3678,7 @@ JudgmentOutwardSpikes2: 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 0xA1, SOUND_PAN_ATTACKER + playsewithpan SE_W054, SOUND_PAN_ATTACKER return JudgmentInwardSpikes: createsprite gJudgmentGrayInwardOrbsTemplate, ANIM_TARGET, 2, 1, 0, 0, 0xFF90, 16 @up @@ -3981,7 +4076,7 @@ Move_SPECIAL_REND: waitforvisualfinish fadetobgfromset BG_SPACIAL_REND_ON_OPPONENT BG_SPACIAL_REND_ON_PLAYER BG_SPACIAL_REND_ON_OPPONENT waitbgfadein - loopsewithpan 0x81, SOUND_PAN_TARGET, 3, 5 + loopsewithpan SE_W013, 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 @@ -4049,16 +4144,16 @@ Move_CRUSH_GRIP: createvisualtask AnimTask_CompressTargetHorizontally, 2 createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, 0, 0, 1, 1 delay 3 - playsewithpan 0xab, SOUND_PAN_ATTACKER + playsewithpan SE_W153, SOUND_PAN_ATTACKER createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, 0x18, 0xffe8, 1, 1 delay 3 - playsewithpan 0xab, SOUND_PAN_ATTACKER + playsewithpan SE_W153, SOUND_PAN_ATTACKER createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, 0xfff0, 16, 1, 1 delay 3 - playsewithpan 0xab, SOUND_PAN_ATTACKER + playsewithpan SE_W153, SOUND_PAN_ATTACKER createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, 0xffe8, -12, 1, 1 delay 3 - playsewithpan 0xab, SOUND_PAN_ATTACKER + playsewithpan SE_W153, SOUND_PAN_ATTACKER createsprite gCrushGripExplosionTemplate, ANIM_TARGET, 0, 16, 16, 1, 1 waitforvisualfinish blendoff @@ -4099,7 +4194,7 @@ Move_DARK_VOID: createvisualtask AnimTask_StartSlidingBg, 5, 0, 0xFFA0, 1, 0xffff waitbgfadein createvisualtask AnimTask_DestinyBondWhiteShadow, 5, 0, 0x30 - loopsewithpan 0xBD, SOUND_PAN_ATTACKER, 5, 2 + loopsewithpan SE_W109, 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 @@ -4175,21 +4270,21 @@ Move_SEED_FLARE: 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 0x81, SOUND_PAN_TARGET + playsewithpan SE_W013, 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 0x81, SOUND_PAN_TARGET + playsewithpan SE_W013, 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 0x81, SOUND_PAN_TARGET + playsewithpan SE_W013, SOUND_PAN_TARGET delay 8 createsprite gSeedFlareGreenWavesTemplate, ANIM_ATTACKER, 0x28, 0, 0xb00, 0x60, 1 delay 10 @@ -4334,17 +4429,119 @@ HoneClawsAnim: 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_W060B, 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_W202, SOUND_PAN_TARGET + createvisualtask AnimTask_ConversionAlphaBlend, 5 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + blendoff end + -Move_GUARD_SPLIT: +Move_GUARD_SPLIT:: + loadspritegfx ANIM_TAG_BLUEGREEN_ORB + createsprite AnimTask_BlendBattleAnimPal, ANIM_ATTACKER, 10, PAL_BG, 0x1, 0x0, 0xC, 0x0 + loopsewithpan SE_W199, 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 + createsprite AnimTask_BlendBattleAnimPal, ANIM_ATTACKER 10, PAL_BG, 0x1, 0xC, 0x0, 0x0 + waitforvisualfinish end - -Move_POWER_SPLIT: +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, PAL_BG, 0x1, 0x0, 0xC, 0x0 + loopsewithpan SE_W199, 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, PAL_BG, 0x1, 0xC, 0x0, 0x0 + waitforvisualfinish end - -Move_WONDER_ROOM: +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 @@ -4388,20 +4585,100 @@ Move_VENOSHOCK: delay 15 end + Move_AUTOTOMIZE: + loadspritegfx ANIM_TAG_METAL_BITS @Metal Bits + setalpha 12, 8 + monbg SIDE_ATTACKER + createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 0x2, 0x0, 0x18, 0x6, 0x4, 0x4 + createvisualtask AnimTask_TraceMonBlended 0x2, 0x0, 0x4, 0x7, 0xa + playsewithpan SE_ELEBETA, 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 SIDE_ATTACKER + blendoff end - -Move_RAGE_POWDER: + + +Move_RAGE_POWDER:: + loadspritegfx ANIM_TAG_SPORE @Powder + loadspritegfx ANIM_TAG_HEART_STAMP @Red Colour + monbg SIDE_TARGET + monbgprio_28 ANIM_TARGET + loopsewithpan SE_W077, SOUND_PAN_TARGET, 0x12, 0xa + call RagePowderSprinkle + call RagePowderSprinkle + call RagePowderSprinkle + createvisualtask AnimTask_BlendColorCycle, ANIM_ATTACKER, 0x2, PAL_ATK, 0x2, 0x2, 0x0, 0xb, 0x1f + waitforvisualfinish + clearmonbg SIDE_TARGET end - -Move_TELEKINESIS: +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, PAL_BG, 0x1, 0x0, 0x9, 0x0 + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal, 10, PAL_ATK, 0x1, 0x0, 0x9, 0x7fff + delay 0x12 + playsewithpan SE_W197, SOUND_PAN_ATTACKER + createsprite gSpinningSparkleSpriteTemplate, ANIM_ATTACKER, 0xd, 0x14, 0xffec + waitforvisualfinish + loopsewithpan SE_W048, SOUND_PAN_TARGET, 0xa, 0x3 + createvisualtask AnimTask_SwayMon, 0x5, 0x1, 0x18, 0xD0, 0x1, ANIM_TARGET + waitforvisualfinish + delay 0xA + createvisualtask AnimTask_BlendBattleAnimPal, 10, PAL_BG, 0x1, 0x9, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, PAL_ATK, 0x2, 0x9, 0x0, 0x7fff + waitforvisualfinish end - -Move_MAGIC_ROOM: - end - -Move_SMACK_DOWN: + + +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_W104, 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 @@ -4456,7 +4733,11 @@ Move_FLAME_BURST: end Move_SLUDGE_WAVE: + panse_1B SE_W250, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 + createvisualtask AnimTask_CreateSurfWave, 0x2, SURF_PALETTE_SLUDGE_WAVE + waitforvisualfinish end + Move_QUIVER_DANCE: loadspritegfx ANIM_TAG_HOLLOW_ORB @@ -4512,10 +4793,73 @@ Move_HEAVY_SLAM: 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 SIDE_TARGET + monbgprio_2A 0x1 + createvisualtask AnimTask_BlendBattleAnimPal, 10, PAL_BG, 0x1, 0x0, 0xC, 0x0 @Darken + waitforvisualfinish + panse_1B SE_W103, 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_W103, 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_W013, 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, PAL_BG, 0x1, 0xC, 0x0, 0x0 @Darken + waitforvisualfinish + clearmonbg SIDE_TARGET end + Move_ELECTRO_BALL: + loadspritegfx ANIM_TAG_SPARK_2 @yelow + loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge + monbg 0x0 + setalpha 12, 8 + playsewithpan SE_W268, SOUND_PAN_ATTACKER + launchtemplate gGrowingChargeOrbSpriteTemplate 0x2 0x1 0x0 + delay 0x19 + playsewithpan SE_W268, SOUND_PAN_ATTACKER + delay 0x14 + playsewithpan SE_W268, SOUND_PAN_ATTACKER + delay 0xF + playsewithpan SE_W268, SOUND_PAN_ATTACKER + delay 0xA + delay 0x6 + loopsewithpan SE_W268, 0xC, 0x6, 0x5 + waitforvisualfinish + loadspritegfx ANIM_TAG_FLASH_CANNON_BALL @ball + launchtemplate gElectroBallCannonBallTemplate, ANIM_TARGET, 2, 0x10, 0x10, 0x8 + waitforvisualfinish + playsewithpan SE_W028, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x4, 0x0, 0x8, 0x1 + call ElectricityEffect + waitforvisualfinish + clearmonbg 0x0 + blendoff end + Move_SOAK: loadspritegfx ANIM_TAG_SMALL_BUBBLES @@ -4553,10 +4897,58 @@ Move_SOAK: end Move_FLAME_CHARGE: + loadspritegfx ANIM_TAG_SMALL_EMBER + loadspritegfx ANIM_TAG_IMPACT + monbg ANIM_TARGET + loopsewithpan SE_W172, 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_W025B, SOUND_PAN_TARGET + launchtemplate gBasicHitSplatSpriteTemplate 0x3 0x4 0x0 0x0 0x1 0x0 + createvisualtask AnimTask_ShakeMon, 0x2, 0x1, 0x6, 0x0, 0x8, 0x1 + call FireSpreadEffect + playsewithpan SE_W007, 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_W010, 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_W020, SOUND_PAN_TARGET + setarg 0x7 0xffff + waitforvisualfinish end + Move_LOW_SWEEP: loadspritegfx ANIM_TAG_HANDS_AND_FEET @@ -4597,17 +4989,108 @@ Move_ACID_SPRAY: 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_W233 SOUND_PAN_TARGET + launchtask AnimTask_BlendBattleAnimPal, 0xa, 0x5, (PAL_BG | PAL_ALL_BANKS), 0x3, 0xa, 0x0, 0x0 + launchtemplate gFoulPlayRingTemplate 0x3 0x4 0x0 0x0 0x100 0x0 + delay 0x8 + playsewithpan SE_W004, SOUND_PAN_TARGET + launchtask AnimTask_BlendBattleAnimPal, 0xa, 0x5, (PAL_BG | PAL_ALL_BANKS), 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 PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + playsewithpan SE_W062, SOUND_PAN_ATTACKER + call SimpleBeamsRegular + call SimpleBeamsRegular + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 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 PAL_DEF 0x2 0x9 0x0 0x7FFF + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 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_W298, SOUND_PAN_ATTACKER + delay 0x18 + playsewithpan SE_W298, SOUND_PAN_ATTACKER + delay 0x18 + playsewithpan SE_W298, SOUND_PAN_ATTACKER + delay 0x18 + playsewithpan SE_W298, SOUND_PAN_ATTACKER + delay 0x18 + playsewithpan SE_W298, 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_W207B, SOUND_PAN_ATTACKER + delay 0x14 + launchtemplate gAfterYouGreenRageTemplate 0x2 0x3 0x0 0x14 0xffe0 + launchtemplate gAfterYouGreenRageTemplate 0x2 0x3 0x0 0x23 0xffe5 + playsewithpan SE_W207B, SOUND_PAN_ATTACKER + waitforvisualfinish end + Move_ROUND: loadspritegfx ANIM_TAG_MUSIC_NOTES createvisualtask AnimTask_MusicNotesRainbowBlend, 2 @@ -4631,9 +5114,41 @@ Move_ROUND: end Move_ECHOED_VOICE: + loadspritegfx ANIM_TAG_METAL_SOUND_WAVES + monbg SIDE_TARGET + monbgprio_2A 0x1 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x0 0x2 0x0 0x8 0x1 + call MetalSoundPlayNote + call MetalSoundPlayNote + call MetalSoundPlayNote + call MetalSoundPlayNote + waitforvisualfinish + clearmonbg SIDE_TARGET + delay 0x0 + waitforvisualfinish end +MetalSoundPlayNote: + panse_1B SE_W253, 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 PAL_ATK 0x2 0x0 0x9 0x7FFF + waitforvisualfinish + monbg SIDE_ATTACKER + 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_W233B SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg SIDE_ATTACKER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x2 0x9 0x0 0x7FFF + waitforvisualfinish + blendoff end Move_CLEAR_SMOG: @@ -4695,10 +5210,39 @@ Move_STORED_POWER: 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 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_W197, 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 @@ -4781,16 +5325,97 @@ Move_HEAL_PULSE: end Move_HEX: + loadspritegfx ANIM_TAG_PURPLE_FLAME + loadspritegfx ANIM_TAG_GHOSTLY_SPIRIT + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x0 0x0 0x10 0x4C4A @;Deep purple + waitforvisualfinish + monbg ANIM_TARGET + monbgprio_29 + playsewithpan SE_W060, SOUND_PAN_ATTACKER + waitbgfadein + launchtask AnimTask_PurpleFlamesOnTarget 0x3 0x0 + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_TARGET 0x2 0x0 0x25 0x1 + playsewithpan SE_W171, SOUND_PAN_TARGET + delay 0x20 + launchtask AnimTask_BlendColorCycle 0x2 0x6 PAL_DEF 0x2 0x2 0x0 0xc 0x4C4A @;Deep purple + launchtemplate gCurseGhostSpriteTemplate 0x84, 0x0 + waitforvisualfinish + clearmonbg ANIM_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 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_W081, SOUND_PAN_ATTACKER + launchtemplate gSkyDropFlyBallTemplate 0x80 0x6 0x0 0x0 0x0 0x0 0x1e 0x0 + waitforvisualfinish + invisible ANIM_TARGET + playsewithpan SE_W019, SOUND_PAN_ATTACKER + launchtemplate gSkyDropTargetFlyingTemplate 0x2 0x4 0x0 0x0 0xd 0x150 + end +SkyDropUnleash: + visible ANIM_TARGET + monbg SIDE_TARGET + setalpha 12, 8 + playsewithpan SE_W207, SOUND_PAN_TARGET + launchtemplate gBounceBallLandSpriteTemplate 0x83 0x0 + delay 0x7 + playsewithpan SE_W025B, SOUND_PAN_TARGET + launchtemplate gBasicHitSplatSpriteTemplate 0x82, 0x4, 0x0 0x0 0x1 0x0 + launchtask AnimTask_ShakeMon 0x5 0x5 0x1 0x0 0x5 0xb 0x1 + waitforvisualfinish + clearmonbg SIDE_TARGET + blendoff end Move_SHIFT_GEAR: + loadspritegfx ANIM_TAG_GEAR @Gear + monbg ANIM_ATTACKER + playsewithpan SE_ESUKA, 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 SIDE_TARGET + setalpha 12, 8 + playsewithpan SE_W233, 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_W233B, 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 SIDE_TARGET + blendoff end + Move_INCINERATE: loadspritegfx ANIM_TAG_SMALL_EMBER @@ -4833,6 +5458,20 @@ Move_INCINERATE: end Move_QUASH: + loadspritegfx ANIM_TAG_ASSURANCE_HAND @hand + fadetobg BG_DARK + waitbgfadein + setalpha 12, 8 + playsewithpan SE_W003, SOUND_PAN_TARGET + launchtemplate gQuashArmHitTemplate 0x83, 0x3 0x0 0xffe0 0xf + delay 0x13 + playsewithpan SE_W107, SOUND_PAN_ATTACKER + launchtask AnimTask_SquishTarget 0x2 0x0 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + restorebg + waitbgfadein end Move_ACROBATICS: @@ -4855,17 +5494,105 @@ Move_ACROBATICS: 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_W081B, 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_W208, 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 SIDE_TARGET + setalpha 9, 8 + launchtask AnimTask_AttackerPunchWithTrace 0x2 0x2 0x7128 0xa + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x10 0x0 + waitforvisualfinish + playsewithpan SE_W015, SOUND_PAN_TARGET + launchtemplate gGuillotineSpriteTemplate 0x2 0x1 0x0 + launchtemplate gGuillotineSpriteTemplate 0x2 0x1 0x1 + delay 0x38 + playsewithpan SE_W003, SOUND_PAN_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x10 0x10 0x43D + waitforvisualfinish + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0 0x3 0xf 0x1 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x10 0x0 0x043D + waitforvisualfinish + clearmonbg SIDE_TARGET + 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 PAL_BG 0x1 0x0 0xC 0x0 @Darken + waitforvisualfinish + launchtask AnimTask_ShakeMon2 0x2 0x5 0x0 0x1 0x0 0xa 0x1 + launchtask AnimTask_BlendColorCycle 0x2 0x6 PAL_ATK 0x0 0x2 0x0 0x8 0x7fff + waitforvisualfinish + playsewithpan SE_W028, 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_W153, 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 PAL_BG 0x1 0xC 0x0 0x0 + waitforvisualfinish end + Move_BESTOW: + monbg ANIM_TARGET + monbgprio_28 ANIM_TARGET + panse_1B SE_W118, 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 @@ -5272,16 +5999,108 @@ VoltSwitchAgainstPartner: 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 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_W029, SOUND_PAN_ATTACKER, 0x8, 0x2 + waitforvisualfinish + launchtemplate gRandomPosHitSplatSpriteTemplate 0x83 0x2 0x1 0x3 + launchtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg 0x2 0x5 0x0 0x1 0x1e 0x1 0x0 + playsewithpan SE_W025B, SOUND_PAN_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x2 0x9 0x0 0x0a1f + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff end + Move_BULLDOZE: - end + 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_W082, 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_W196, 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_W004, 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_W025B, 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_W070, 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 @@ -5344,31 +6163,249 @@ Move_ELECTROWEB_Wait: 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_W268, SOUND_PAN_ATTACKER + launchtemplate gGrowingShockWaveOrbSpriteTemplate 0x2 0x0 @electric circle + delay 0x1e + waitforvisualfinish + loopsewithpan SE_W231, SOUND_PAN_ATTACKER, 0x1c, 0x2 + call ScreenFlash + waitforvisualfinish + call ScreenFlash + waitforvisualfinish + playsewithpan SE_W036, 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_W025B, 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 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_W029, SOUND_PAN_ATTACKER + waitforvisualfinish + delay 0x2 + launchtemplate gBowMonSpriteTemplate 0x2 0x1 0x1 + launchtemplate gHealingBlueStarSpriteTemplate 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_W030, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gFlashingHitSplatSpriteTemplate 0x83 0x4 0x0 0x2 0x1 0x3 + playsewithpan SE_W030, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gFlashingHitSplatSpriteTemplate 0x83 0x4 0xfffc 0x3 0x1 0x3 + playsewithpan SE_W030, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gFlashingHitSplatSpriteTemplate 0x83 0x4 0xfff8 0xfffb 0x1 0x3 + playsewithpan SE_W030, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gFlashingHitSplatSpriteTemplate 0x83 0x4 0x4 0xfff4 0x1 0x3 + playsewithpan SE_W030, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gFlashingHitSplatSpriteTemplate 0x83 0x4 0x10 0x0 0x1 0x3 + playsewithpan SE_W030, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gFlashingHitSplatSpriteTemplate 0x83 0x4 0x5 0x12 0x1 0x3 + playsewithpan SE_W030, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gFlashingHitSplatSpriteTemplate 0x83 0x4 0xffef 0xc 0x1 0x2 + playsewithpan SE_W030, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gFlashingHitSplatSpriteTemplate 0x83 0x4 0xffeb 0xfff1 0x1 0x2 + playsewithpan SE_W030, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gFlashingHitSplatSpriteTemplate 0x83 0x4 0x8 0xffe5 0x1 0x2 + playsewithpan SE_W030, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gFlashingHitSplatSpriteTemplate 0x83 0x4 0x20 0x0 0x1 0x2 + playsewithpan SE_W030, 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 SIDE_TARGET + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_W026, 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_W004, SOUND_PAN_TARGET + launchtemplate gDualChopImpactTemplate 0x3 0x4 0x0 0x0 0x1 0x2 + launchtask AnimTask_ShakeMon 0x5 0x5 0x1 0x4 0x0 0x6 0x1 + waitforvisualfinish + clearmonbg SIDE_TARGET + blendoff end + Move_HEART_STAMP: + loadspritegfx ANIM_TAG_HEART_STAMP + monbg ANIM_TARGET + loopsewithpan SE_W204, SOUND_PAN_ATTACKER, 0xc, 0x3 + launchtemplate gHeartStampSpinningHeartTemplate, 0x80, 0x4 0x0 0x0 0x1 0x1e + delay 0x1E + clearmonbg ANIM_TARGET + playsewithpan SE_W003, 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_W029, 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_W030, 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_W014, 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_W013, 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_W015, 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_SEIKAI, 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_W025B, SOUND_PAN_TARGET + delay 0x5 + launchtemplate gBasicHitSplatSpriteTemplate 0x83 0x4 0xa 0xfff8 0x1 0x1 + playsewithpan SE_W088, 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 SIDE_TARGET + monbgprio_28 ANIM_TARGET + playsewithpan SE_W016, 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 @@ -5397,10 +6434,74 @@ Move_STEAMROLLER: end Move_COTTON_GUARD: + loadspritegfx ANIM_TAG_SPORE + monbg SIDE_ATTACKER + setalpha 12, 8 + loopsewithpan SE_W077, SOUND_PAN_TARGET 0x12 0x6 + call CreateCottonSpores + call CottonSporesSpiralInward + call CottonSporesSpiralInward + call CottonSporesSpiralInward + waitforvisualfinish + clearmonbg SIDE_ATTACKER + 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 PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + playsewithpan SE_TAMA, 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 SOUND_PAN_ATTACKER + 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 PAL_DEF 0x2 0x0 0x9 0x2002 + delay 0x6 + playsewithpan SE_W048, SOUND_PAN_ATTACKER + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 PAL_DEF 0x2 0x9 0x0 0x2002 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xC 0x0 0x0 + waitforvisualfinish end + Move_PSYSTRIKE: monbg ANIM_TARGET @@ -5420,73 +6521,1448 @@ Move_PSYSTRIKE: 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_W003, 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 SIDE_TARGET + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + fadetobg BG_HIGH_SPEED + waitbgfadeout + launchtask AnimTask_StartSlidingBg 0x5 0x4 0x1000 0x0 0x1 0xffff + waitbgfadein + playsewithpan SE_W016, 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 SIDE_TARGET + 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_W029, 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_W233B, 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_ESUKA, 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 PAL_BG 0x1 0x0 0x10 0x0 + waitforvisualfinish + launchtask AnimTask_ElectricChargingParticles 0x2 0x4 0x0 0x3c 0x2 0xc + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 PAL_ATK 0x2 0x0 0x9 0x1F + playsewithpan SE_W268, SOUND_PAN_ATTACKER + delay 0x1e + playsewithpan SE_W268, SOUND_PAN_ATTACKER + delay 0x1e + playsewithpan SE_W268, SOUND_PAN_ATTACKER + launchtemplate gSearingShotRedChargeTemplate 0x2 0x1 0x0 + delay 0x19 + playsewithpan SE_W268, SOUND_PAN_ATTACKER + delay 0x14 + playsewithpan SE_W268, SOUND_PAN_ATTACKER + delay 0xf + playsewithpan SE_W268, SOUND_PAN_ATTACKER + waitforvisualfinish + playsewithpan SE_W172B, 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_W172B, 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 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 SIDE_ATTACKER + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 PAL_ATK_PARTNER | PAL_DEF | PAL_DEF_PARTNER 0x2 0x0 0x9 0x1F + playsewithpan SE_W153, 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_W007, 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_W153, SOUND_PAN_ATTACKER + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 PAL_ATK_PARTNER | PAL_DEF | PAL_DEF_PARTNER 0x2 0x9 0x0 0x1F + delay 0x1E + call UnsetPsychicBg + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x0 0x0 + clearmonbg SIDE_ATTACKER + 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 PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + loopsewithpan SE_W025, 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_W268, 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 SOUND_PAN_ATTACKER 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_W052, 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 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 PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + loopsewithpan SE_W025, 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_W268, 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_W052, 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 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfffb 0xa 0x5 0x1 + delay 0x2 + launchtemplate gTechnoBlastYellowSmokeTemplate 0x82, 0x4, 0xfff8 0xfff8 0x1 0x0 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xf 0x14 0x5 0x2 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfff1 0xfff6 0x5 0x0 + delay 0x2 + launchtemplate gTechnoBlastYellowSmokeTemplate 0x82, 0x4, 0x8 0xfff8 0x1 0x0 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0x19 0x0 0x5 0x1 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfff8 0x8 0x5 0x2 + delay 0x2 + launchtemplate gTechnoBlastYellowSmokeTemplate 0x82, 0x4, 0xfff8 0x8 0x1 0x0 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0x2 0xfff8 0x5 0x0 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xffec 0xf 0x5 0x1 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xC 0x0 0x0 + waitforvisualfinish + blendoff + clearmonbg ANIM_ATTACKER + end +TechnoBlastCharging1: + playsewithpan SE_W085B, 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_W085B, 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 PAL_BG 0x1 0x0 0xC 0x1 + waitforvisualfinish + launchtemplate gTechnoBlastBlueChargeTemplate 0x2 0x1 0x0 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xa 0xa 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xfff1 0x0 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0x14 0xa 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0x0 0xfff6 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xfff6 0xf 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0x19 0x14 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xffec 0x14 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xc 0x0 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xa 0xa 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xfff1 0x0 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0x14 0xa 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0x0 0xfff6 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xfff6 0xf 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0x19 0x14 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xffec 0x14 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xc 0x0 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xa 0xa 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xfff1 0x0 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0x14 0xa 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0x0 0xfff6 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xfff6 0xf 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0x19 0x14 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xffec 0x14 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xc 0x0 0x19 0x0 + waitforvisualfinish + playsewithpan SE_W268, 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_W052, 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 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 PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + launchtemplate gTechnoBlastRedChargeTemplate 0x2 0x1 0x0 + delay 0x5 + call TechnoBlastFireSpiral + call TechnoBlastFireSpiral + call TechnoBlastFireSpiral + waitforvisualfinish + playsewithpan SE_W268, 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_W052, 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 PAL_BG 0x1 0xC 0x0 0x0 + waitforvisualfinish + blendoff + clearmonbg ANIM_ATTACKER + end +TechnoBlastFireSpiral: + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x0 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x4 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x8 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0xc + playsewithpan SE_W172, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x10 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x14 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x18 + playsewithpan SE_W172, 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 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_W196, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gTechnoBlastIceCrystalsTemplate 0x2 0x4 0xa 0x14 0x0 0x2 + playsewithpan SE_W196, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gTechnoBlastIceCrystalsTemplate 0x2 0x4 0xfffb 0xa 0x0 0x2 + playsewithpan SE_W196, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gTechnoBlastIceCrystalsTemplate 0x2 0x4 0x11 0xfff4 0x0 0x2 + playsewithpan SE_W196, SOUND_PAN_TARGET + waitforvisualfinish + playsewithpan SE_W268, 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_W052, 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 PAL_BG 0x1 0xC 0x0 0x0 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + end +TechnoBlastIceChargeParticles: + launchtemplate gTechnoBlastIceCrystalsTemplate 0x2 0x4 0xfff6 0xfff6 0x0 0x2 + playsewithpan SE_W196, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gTechnoBlastIceCrystalsTemplate 0x2 0x4 0xa 0x14 0x0 0x2 + playsewithpan SE_W196, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gTechnoBlastIceCrystalsTemplate 0x2 0x4 0xfffb 0xa 0x0 0x2 + playsewithpan SE_W196, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gTechnoBlastIceCrystalsTemplate 0x2 0x4 0x11 0xfff4 0x0 0x2 + playsewithpan SE_W196, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gTechnoBlastIceCrystalsTemplate 0x2 0x4 0xfff1 0xf 0x0 0x2 + playsewithpan SE_W196, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gTechnoBlastIceCrystalsTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + playsewithpan SE_W196, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gTechnoBlastIceCrystalsTemplate 0x2 0x4 0x14 0x2 0x0 0x2 + playsewithpan SE_W196, 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 SIDE_TARGET + 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_W004, 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_W004, SOUND_PAN_TARGET + delay 0x5 + launchtemplate gRandomPosHitSplatSpriteTemplate 0x83 0x2 0x1 0x3 + playsewithpan SE_W004, SOUND_PAN_TARGET + delay 0x5 + launchtemplate gBasicHitSplatSpriteTemplate 0x83 0x4 0x20 0x14 0x1 0x3 + playsewithpan SE_W004, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg SIDE_TARGET + 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_W014, SOUND_PAN_ATTACKER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 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_W013, 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 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 SIDE_TARGET + setalpha 12, 8 + fadetobg BG_ICE + waitbgfadeout + playsewithpan SE_W028, 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 + createsprite AnimTask_BlendBattleAnimPal, ANIM_ATTACKER, 0xA, (PAL_DEF | PAL_DEF_PARTNER), 0x2, 0x0, 0xA, 0x7FFF + call IceCrystalEffectLong + createsprite AnimTask_BlendBattleAnimPal, ANIM_ATTACKER, 0xA, (PAL_DEF | PAL_DEF_PARTNER), 0x2, 0xA, 0x0, 0x7FFF + waitforvisualfinish + blendoff + clearmonbg SIDE_TARGET + call UnsetPsychicBg end + -Move_BOLT_STRIKE: +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 PAL_BG 0x1 0x0 0x10 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x2 0x0 0x9 0x07FE + launchtask AnimTask_ElectricChargingParticles 0x2 0x4 0x0 0x40 0x0 0x2 + playsewithpan SE_W268, SOUND_PAN_ATTACKER + delay 0xc + launchtemplate gGrowingShockWaveOrbSpriteTemplate 0x2 0x0 + waitforvisualfinish + clearmonbg ANIM_ATTACKER + playsewithpan SE_W207, SOUND_PAN_ATTACKER + waitplaysewithpan SE_W207, 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 PAL_DEF 0x2 0x0 0x9 0x07FE + launchtask AnimTask_ShakeMon2 0x2 0x5 ANIM_TARGET 0x2 0x0 0x20 0x1 + playsewithpan SE_W161B, SOUND_PAN_TARGET + call ElectricityEffect + launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_ATTACKER 0x0 0x5 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x2 0x9 0x0 0x07FE + playsewithpan SE_W161B, SOUND_PAN_TARGET + call ElectricityEffect + waitforvisualfinish + clearmonbg ANIM_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x2 0x9 0x0 0x07FE + call UnsetPsychicBg + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 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 PAL_BG 0x0 0x0 0x10 0x0 + loopsewithpan SE_W172, 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_W221B, 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_W172, SOUND_PAN_ATTACKER + call BlueFlareFlameSpreadEffect + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 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 SOUND_PAN_ATTACKER 0xb0 0x28 + launchtemplate gBlueFlareBurnTemplate 0x81 0x5 0x0 0xa 0xff40 0xf0 0x28 + launchtemplate gBlueFlareBurnTemplate 0x81 0x5 0x0 0xa SOUND_PAN_ATTACKER 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 PAL_BG 0x1 0x0 0xc 0x14be + waitforvisualfinish + playsewithpan SE_W221B, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_TARGET 0x0 0x2 0x40 0x1 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x1 0x0 0x9 0x1f + call FireSpinEffect + call FireSpinEffect + call FireSpinEffect + playsewithpan SE_W221B, SOUND_PAN_TARGET + call FireSpinEffect + call FireSpinEffect + call FireSpinEffect + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x1 0x9 0x0 0x1f + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xc 0x0 0x14be + waitforvisualfinish + end + -Move_BLUE_FLARE: +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_W085B, SOUND_PAN_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x1 0x0 0xf 0x7fff + launchtemplate gFreezeShockCircleTemplate 0x2 0x0 @electric circle + delay 0x14 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x1 0xf 0x0 0x7fff + waitforvisualfinish end +FreezeShockAttack: + loopsewithpan SE_W196, SOUND_PAN_TARGET, 0x5, 0x5 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x10 0x0 + monbg ANIM_TARGET + waitforvisualfinish + playsewithpan SE_W086, 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 SOUND_PAN_ATTACKER 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_W085B, SOUND_PAN_TARGET, 0x13 + call ElectricityEffect + waitforvisualfinish + clearmonbg ANIM_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 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 PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + loopsewithpan SE_W196, SOUND_PAN_TARGET, 0x4, 0x3 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x1 0x8 0x0 0x0 + launchtask AnimTask_HorizontalShake 0x5 0x3 0x0 0x2 0x10 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x1 0x0 0xf 0x7fff + delay 0x14 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x1 0xf 0x0 0x7fff + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xC 0x0 0x0 + waitforvisualfinish + end +IceBurnUnleash: + monbg ANIM_TARGET + fadetobg BG_ICE + waitbgfadeout + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x2 0x0 0x9 0x7fff + launchtemplate gIceCrystalHitLargeSpriteTemplate 0x82, 0x3, 0xfff6 0xfff6 0x0 + playsewithpan SE_W196, 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_W007, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gIceCrystalHitSmallSpriteTemplate 0x82, 0x3, 0xa 0x14 0x0 + playsewithpan SE_W196, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gIceCrystalHitLargeSpriteTemplate 0x82, 0x3, 0xfffb 0xa 0x0 + playsewithpan SE_W196, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gIceCrystalHitSmallSpriteTemplate 0x82, 0x3, 0x11 0xfff4 0x0 + playsewithpan SE_W196, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gIceCrystalHitSmallSpriteTemplate 0x82, 0x3, 0xfff1 0xf 0x0 + playsewithpan SE_W196, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gIceCrystalHitSmallSpriteTemplate 0x82, 0x3, 0x0 0x0 0x0 + playsewithpan SE_W196, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gIceCrystalHitLargeSpriteTemplate 0x82, 0x3, 0x14 0x2 0x0 + playsewithpan SE_W196, SOUND_PAN_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 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 SIDE_TARGET + fadetobg BG_DARK + waitbgfadeout + launchtask AnimTask_UproarDistortion 0x2 0x1 0x0 + launchtemplate gUproarRingSpriteTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1f 0x8 + playsewithpan SE_W253, 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_W253, 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_W253, 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_W004, 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_W004, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gRandomPosHitSplatSpriteTemplate 0x83 0x2 0x1 0x3 + playsewithpan SE_W004, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gBasicHitSplatSpriteTemplate 0x83 0x4 0x20 0x14 0x1 0x3 + playsewithpan SE_W004, SOUND_PAN_TARGET + waitforvisualfinish + call UnsetPsychicBg + clearmonbg SIDE_TARGET + blendoff + end + -Move_FIERY_DANCE: +Move_ICICLE_CRASH:: + loadspritegfx ANIM_TAG_ICICLE_SPEAR @Icicle + fadetobg BG_ICE + waitbgfadein + monbg SIDE_TARGET + launchtemplate gIcicleCrashSpearTemplate 0x82, 0x4, 0xfffb 0x0 0xfffb 0x0 + playsewithpan SE_W196, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gIcicleCrashSpearTemplate 0x82, 0x4, 0x5 0x0 0x6 0x1 + playsewithpan SE_W196, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gIcicleCrashSpearTemplate 0x82, 0x4, 0x13 0x0 0xa 0x01 + playsewithpan SE_W196, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gIcicleCrashSpearTemplate 0x82, 0x4, 0xffe9 0x0 0xfff6 0x1 + playsewithpan SE_W196, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0 0x5 0x32 0x1 + delay 0x2 + call LaunchIcicleCrashSpear + call LaunchIcicleCrashSpear + waitforvisualfinish + clearmonbg SIDE_TARGET + restorebg + waitbgfadeout end +LaunchIcicleCrashSpear: + launchtemplate gIcicleCrashSpearTemplate 0x82, 0x4, 0xffec 0x0 0xfff6 0x0 + playsewithpan SE_W196, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gIcicleCrashSpearTemplate 0x82, 0x4, 0x1c 0x0 0xa 0x0 + playsewithpan SE_W196, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gIcicleCrashSpearTemplate 0x82, 0x4, 0xfff6 0x0 0xfffb 0x0 + playsewithpan SE_W196, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gIcicleCrashSpearTemplate 0x82, 0x4, 0xa 0x0 0x6 0x0 + playsewithpan SE_W196, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gIcicleCrashSpearTemplate 0x82, 0x4, 0x18 0x0 0xa 0x0 + playsewithpan SE_W196, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gIcicleCrashSpearTemplate 0x82, 0x4, 0xffe0 0x0 0xfff6 0x0 + playsewithpan SE_W196, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gIcicleCrashSpearTemplate 0x82, 0x4, 0xffec 0x0 0xfff6 0x0 + playsewithpan SE_W196, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gIcicleCrashSpearTemplate 0x82, 0x4, 0x1e 0x0 0xa 0x0 + playsewithpan SE_W196, 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 SIDE_ATTACKER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xC 0x0 @Darken + launchtemplate gVCreateRedOrbTemplate 0x2 0x4 0x0 0x11 0x0 0x1 + playsewithpan SE_W025, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gVCreateRedRingTemplate 0x28 0x4 0x0 0x0 0x0 0x0 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x2 0x0 0x9 0x1f + playsewithpan SE_W172B, 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 SIDE_ATTACKER + fadetobg BG_FIRE @Mr. DS Fire + waitbgfadeout + launchtask AnimTask_StartSlidingBg 0x5 0x4 0xA00 0x0 0x1 0xffff + waitbgfadein + playsewithpan SE_W036, 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 PAL_DEF 0x2 0x0 0x9 0x1f + playsewithpan SE_W153, SOUND_PAN_ATTACKER + launchtemplate gExplosionSpriteTemplate 0x3 0x4 0x0 0x0 0x1 0x1 + delay 0x6 + playsewithpan SE_W153, SOUND_PAN_ATTACKER + launchtemplate gExplosionSpriteTemplate 0x3 0x4 0x18 0xffe8 0x1 0x1 + delay 0x6 + playsewithpan SE_W153, SOUND_PAN_ATTACKER + launchtemplate gExplosionSpriteTemplate 0x3 0x4 0xfff0 0x10 0x1 0x1 + delay 0x6 + playsewithpan SE_W153, SOUND_PAN_ATTACKER + launchtemplate gExplosionSpriteTemplate 0x3 0x4 0xffe8 0xfff4 0x1 0x1 + delay 0x6 + playsewithpan SE_W153, 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 PAL_ATK 0x2 0x9 0x0 0x1f + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x2 0x9 0x0 0x1f + delay 0x2 + launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_ATTACKER 0x0 0x5 + waitforvisualfinish + clearmonbg SIDE_TARGET + call UnsetPsychicBg + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 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 PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + playsewithpan SE_W025, SOUND_PAN_ATTACKER + call FusionFlareBuff + delay 0x8 + launchtask AnimTask_BlendColorCycle 0x2 0x6 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_W207, 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 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_W153, SOUND_PAN_ATTACKER + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 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_FREEZE_SHOCK: +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, PAL_BG, 0x0, 0x0, 0xE, 0x0 + waitforvisualfinish + launchtemplate gVoltTackleOrbSlideSpriteTemplate 0x1 0x0 + playsewithpan SE_W268, SOUND_PAN_ATTACKER + invisible ANIM_ATTACKER + waitforvisualfinish + delay 0x8 + launchtask AnimTask_VoltTackleBolt 0x5 0x1 0x0 + playsewithpan SE_W085, SOUND_PAN_ATTACKER + waitforvisualfinish + launchtask AnimTask_VoltTackleBolt 0x5 0x1 0x1 + playsewithpan SE_W085, SOUND_PAN_TARGET + waitforvisualfinish + launchtask AnimTask_VoltTackleBolt 0x5 0x1 0x2 + playsewithpan SE_W085, SOUND_PAN_ATTACKER + waitforvisualfinish + launchtask AnimTask_VoltTackleBolt 0x5 0x1 0x3 + playsewithpan SE_W085, SOUND_PAN_TARGET + waitforvisualfinish + launchtemplate gFusionBoltBallTemplate 0x82 0x1 0x10 + playsewithpan SE_W085, SOUND_PAN_ATTACKER + delay 0x8 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0xa 0x0 0x12 0x1 + playsewithpan SE_W120, 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_W085B, SOUND_PAN_ATTACKER + launchtemplate gElectricPuffSpriteTemplate 0x2 0x3 0x0 0x10 0x10 + delay 0x2 + launchtemplate gElectricPuffSpriteTemplate 0x2 0x3 0x0 0xfff0 0xfff0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x0 0xE 0x0 0x0 + waitforvisualfinish end - -Move_ICE_BURN: + + +@@@@@@@@@@@@@@@@@@@@@@@ GEN 6 @@@@@@@@@@@@@@@@@@@@@@@ +Move_FLYING_PRESS:: + loadspritegfx ANIM_TAG_ROUND_SHADOW @fly/bounce + loadspritegfx ANIM_TAG_GRAY_SMOKE @smoke + setblends 0xF + playsewithpan SE_W019, SOUND_PAN_ATTACKER + launchtemplate gFlyBallUpSpriteTemplate 0x2 0x4 0x0 0x0 0xd 0x150 + waitforvisualfinish + delay 0xF + playsewithpan SE_W207, SOUND_PAN_TARGET + launchtemplate gBounceBallLandSpriteTemplate 0x83 0x0 + delay 0x2 + launchtask AnimTask_SquishTarget 0x2 0x0 + delay 0x5 + playsewithpan SE_W025B, 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_SNARL: + + +Move_MAT_BLOCK:: + loadspritegfx ANIM_TAG_CONVERSION + loadspritegfx ANIM_TAG_GREEN_LIGHT_WALL @green color + monbg SIDE_ATTACKER + monbgprio_28 ANIM_ATTACKER + setblends 0x10 + delay 0x0 + playsewithpan SE_W129, SOUND_PAN_ATTACKER + launchtemplate gMatBlockGreenConversionTemplate 0x2 0x2 0xfff8 0x18 + launchtemplate gMatBlockGreenConversionTemplate 0x2 0x2 0x8 0x18 + delay 0x3 + playsewithpan SE_W129, SOUND_PAN_ATTACKER + launchtemplate gMatBlockGreenConversionTemplate 0x2 0x2 0xfff8 0x8 + launchtemplate gMatBlockGreenConversionTemplate 0x2 0x2 0x8 0x8 + delay 0x3 + playsewithpan SE_W129, SOUND_PAN_ATTACKER + launchtemplate gMatBlockGreenConversionTemplate 0x2 0x2 0xfff8 0xfff8 + launchtemplate gMatBlockGreenConversionTemplate 0x2 0x2 0x8 0xfff8 + delay 0x3 + playsewithpan SE_W129, 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 SIDE_ATTACKER + blendoff end - -Move_ICICLE_CRASH: + + +Move_BELCH:: + loadspritegfx ANIM_TAG_BERRY_NORMAL + loadspritegfx ANIM_TAG_EXPLOSION @Explosion + monbg ANIM_TARGET + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_SEIKAI, 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_W120, SOUND_PAN_TARGET + launchtemplate gExplosionSpriteTemplate 0x3 0x4 0x0 0x0 0x1 0x1 + delay 0x6 + playsewithpan SE_W120, SOUND_PAN_TARGET + launchtemplate gExplosionSpriteTemplate 0x3 0x4 0x18 0xffe8 0x1 0x1 + delay 0x6 + playsewithpan SE_W120, SOUND_PAN_TARGET + launchtemplate gExplosionSpriteTemplate 0x3 0x4 0xfff0 0x10 0x1 0x1 + delay 0x6 + playsewithpan SE_W120, SOUND_PAN_TARGET + launchtemplate gExplosionSpriteTemplate 0x3 0x4 0xffe8 0xfff4 0x1 0x1 + delay 0x6 + playsewithpan SE_W120, SOUND_PAN_TARGET + launchtemplate gExplosionSpriteTemplate 0x3 0x4 0x10 0x10 0x1 0x1 + delay 0x6 + playsewithpan SE_W120, SOUND_PAN_TARGET + launchtemplate gExplosionSpriteTemplate 0x3 0x4 0xffe8 0x18 0x1 0x1 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff end - -Move_V_CREATE: - end - -Move_FUSION_FLARE: - end - -Move_FUSION_BOLT: - end - -Move_FLYING_PRESS: - end - -Move_MAT_BLOCK: - end - -Move_BELCH: - end - -Move_ROTOTILLER: + + +Move_ROTOTILLER:: + loadspritegfx ANIM_TAG_MUD_SAND + loadspritegfx ANIM_TAG_DIRT_MOUND + loadspritegfx ANIM_TAG_GREEN_SPARKLE + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 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 PAL_BG 0x1 0x10 0x0 0x112C + waitforvisualfinish end + Move_STICKY_WEB: loadspritegfx ANIM_TAG_SPIDER_WEB @@ -5641,16 +8117,141 @@ ParabolicChargeDouble: 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 PAL_BG 0x1 0x0 0x10 0x0 + waitforvisualfinish + playsewithpan SE_W010, SOUND_PAN_ATTACKER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 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_W010, 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_W010, 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 PAL_DEF 0x2 0x8 0x0 0x02E3 + delay 0x3 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x10 0x0 0x0 + waitforvisualfinish + clearmonbg ANIM_ATTACKER end - -Move_PETAL_BLIZZARD: + + +Move_PETAL_BLIZZARD:: + loadspritegfx ANIM_TAG_LEAF + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_FLOWER + monbg 0x3 + monbgprio_28 0x1 + playsewithpan SE_W239, 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_W004, 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_W004, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gRandomPosHitSplatSpriteTemplate 0x83 0x2 0x1 0x3 + playsewithpan SE_W004, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gBasicHitSplatSpriteTemplate 0x83 0x4 0x20 0x14 0x1 0x3 + playsewithpan SE_W004, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg 0x3 + blendoff end - -Move_FREEZE_DRY: + + +Move_FREEZE_DRY:: + monbg SIDE_TARGET + loadspritegfx ANIM_TAG_ICE_CRYSTALS + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x7 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x2 0x0 0x9 0x7f4c + delay 0x14 + playsewithpan SE_W081, SOUND_PAN_TARGET + launchtemplate gIceCrystalSpiralInwardSmall 0x2 0x1 0x0 + launchtemplate gIceCrystalSpiralInwardSmall 0x2 0x1 0x40 + launchtemplate gIceCrystalSpiralInwardSmall 0x2 0x1 0x80 + launchtemplate gIceCrystalSpiralInwardSmall 0x2 0x1 SOUND_PAN_ATTACKER + delay 0x5 + launchtemplate gIceCrystalSpiralInwardLarge 0x2 0x1 0x20 + launchtemplate gIceCrystalSpiralInwardLarge 0x2 0x1 0x60 + launchtemplate gIceCrystalSpiralInwardLarge 0x2 0x1 0xa0 + launchtemplate gIceCrystalSpiralInwardLarge 0x2 0x1 0xe0 + waitforvisualfinish + call IceCrystalEffectShort + delay 0x5 + playsewithpan SE_W172, 0x0 + loadspritegfx ANIM_TAG_ICE_CUBE + monbgprio_28 ANIM_TARGET + launchtask AnimTask_FrozenIceCube 0x2 0x0 + waitplaysewithpan SE_RG_CARD1 SOUND_PAN_TARGET 0x11 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x2 0x9 0x0 0x7f4c + clearmonbg SIDE_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x0 0x7 0x0 0x0 + waitforvisualfinish + blendoff end - -Move_DISARMING_VOICE: + + +Move_DISARMING_VOICE:: + loadspritegfx ANIM_TAG_NOISE_LINE + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 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 PAL_BG 0x1 0x8 0x0 0x6e7d + waitforvisualfinish end + Move_PARTING_SHOT: loadspritegfx ANIM_TAG_NOISE_LINE @@ -5717,26 +8318,305 @@ Move_DRAINING_KISS: waitforvisualfinish end -Move_CRAFTY_SHIELD: +Move_CRAFTY_SHIELD:: + loadspritegfx ANIM_TAG_CRAFTY_SHIELD + monbg SIDE_ATTACKER + monbgprio_28 ANIM_ATTACKER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x5 0x4DBF + setblends 0x10 + delay 0x0 + playsewithpan SE_W129, 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_W129, 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_W129, 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_W129, 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_W112, 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 PAL_BG 0x1 0x5 0x0 0x4DBF + waitforvisualfinish + delay 0x1 + clearmonbg SIDE_ATTACKER + blendoff + end + + +Move_FLOWER_SHIELD:: + loadspritegfx ANIM_TAG_FLOWER + loadspritegfx ANIM_TAG_IMPACT + setalpha 12, 8 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x8 0x6e7d + waitforvisualfinish + playsewithpan SE_W080, 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 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_W036, SOUND_PAN_ATTACKER + launchtemplate gGrassyTerrainOrbsTemplate 0x2 0x2 0x1a 0x0 + launchtemplate gGrassyTerrainOrbsTemplate 0x2 0x2 0x1a 0x2a + launchtemplate gGrassyTerrainOrbsTemplate 0x2 0x2 0x1a 0x54 + launchtemplate gGrassyTerrainOrbsTemplate 0x2 0x2 0x1a 0x7e + launchtemplate gGrassyTerrainOrbsTemplate 0x2 0x2 0x1a 0xa8 + launchtemplate gGrassyTerrainOrbsTemplate 0x2 0x2 0x1a 0xd2 + delay 0x34 + setarg 0x7 0xffff + playsewithpan SE_W215, SOUND_PAN_ATTACKER + launchtask AnimTask_ScaleMonAndRestore 0x5 0x5 0xfff9 0xfff9 0xb 0x0 0x0 + launchtemplate gGrassyTerrainStarTemplate 0x82 0x1 0x0 + launchtemplate gGrassyTerrainStarTemplate 0x82 0x1 0x20 + launchtemplate gGrassyTerrainStarTemplate 0x82 0x1 0x40 + launchtemplate gGrassyTerrainStarTemplate 0x82 0x1 0x60 + launchtemplate gGrassyTerrainStarTemplate 0x82 0x1 0x80 + launchtemplate gGrassyTerrainStarTemplate 0x82 0x1 0xa0 + launchtemplate gGrassyTerrainStarTemplate 0x82 0x1 SOUND_PAN_ATTACKER + launchtemplate gGrassyTerrainStarTemplate 0x82 0x1 0xe0 + waitforvisualfinish + restorebg + waitbgfadein + panse_26 SE_W080, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x1, 0x0 + waitsound end -Move_FLOWER_SHIELD: +Move_MISTY_TERRAIN:: + loadspritegfx ANIM_TAG_ORBS @Recover Ball + loadspritegfx ANIM_TAG_GREEN_SPARKLE @Green Star + loadspritegfx ANIM_TAG_WATER_GUN @Light Blue Colour + playsewithpan SE_W215, SOUND_PAN_ATTACKER + launchtemplate gMistyTerrainOrbsTemplate 0x2 0x2 0x1a 0x0 + launchtemplate gMistyTerrainOrbsTemplate 0x2 0x2 0x1a 0x2a + launchtemplate gMistyTerrainOrbsTemplate 0x2 0x2 0x1a 0x54 + launchtemplate gMistyTerrainOrbsTemplate 0x2 0x2 0x1a 0x7e + launchtemplate gMistyTerrainOrbsTemplate 0x2 0x2 0x1a 0xa8 + launchtemplate gMistyTerrainOrbsTemplate 0x2 0x2 0x1a 0xd2 + delay 0x34 + setarg 0x7 0xffff + playsewithpan SE_W213, SOUND_PAN_ATTACKER + launchtask AnimTask_ScaleMonAndRestore 0x5 0x5 0xfff9 0xfff9 0xb 0x0 0x0 + launchtemplate gMistyTerrainStarTemplate 0x82 0x1 0x0 + launchtemplate gMistyTerrainStarTemplate 0x82 0x1 0x20 + launchtemplate gMistyTerrainStarTemplate 0x82 0x1 0x40 + launchtemplate gMistyTerrainStarTemplate 0x82 0x1 0x60 + launchtemplate gMistyTerrainStarTemplate 0x82 0x1 0x80 + launchtemplate gMistyTerrainStarTemplate 0x82 0x1 0xa0 + launchtemplate gMistyTerrainStarTemplate 0x82 0x1 SOUND_PAN_ATTACKER + launchtemplate gMistyTerrainStarTemplate 0x82 0x1 0xe0 + waitforvisualfinish + restorebg + waitbgfadein + playsewithpan SE_W322, SOUND_PAN_ATTACKER + delay 0x40 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_W085B, 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_W086, 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 SOUND_PAN_ATTACKER 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 PAL_DEF 0x2 0x0 0xB 0x039B + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x3 0x039B + delay 0x4 + clearmonbg ANIM_ATTACKER + delay 0x1 + monbg SIDE_TARGET + playsewithpan SE_W085B, 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 + delay 0x1 + launchtemplate gElectrifyYellowRingTemplate 0x3 0x6 0x0 0x0 0x1 0x0 0x1f 0x8 + delay 0x1 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfffb 0xa 0x5 0x1 + launchtemplate gElectrifyYellowRingTemplate 0x3 0x6 0x0 0x0 0x1 0x0 0x1f 0x8 + delay 0x1 + launchtemplate gElectrifyYellowRingTemplate 0x3 0x6 0x0 0x0 0x1 0x0 0x1f 0x8 + delay 0x1 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xf 0x14 0x5 0x2 + launchtemplate gElectrifyYellowRingTemplate 0x3 0x6 0x0 0x0 0x1 0x0 0x1f 0x8 + delay 0x2 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfff1 0xfff6 0x5 0x0 + delay 0x2 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0x19 0x0 0x5 0x1 + delay 0x2 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfff8 0x8 0x5 0x2 + delay 0x2 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0x2 0xfff8 0x5 0x0 + delay 0x2 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xffec 0xf 0x5 0x1 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 PAL_DEF 0x2 0xB 0x0 0x039B + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x3 0x0 0x039B + waitforvisualfinish + clearmonbg SIDE_TARGET + end + -Move_GRASSY_TERRAIN: +Move_PLAY_ROUGH:: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_PINK_HEART + loadspritegfx ANIM_TAG_DUCK + monbg 0x3 + setalpha 12, 8 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + waitplaysewithpan SE_W053, SOUND_PAN_TARGET, 0xa + waitplaysewithpan SE_W152, SOUND_PAN_ATTACKER, 0x14 + waitplaysewithpan SE_W053, SOUND_PAN_TARGET, 0x1e + waitplaysewithpan SE_W152, SOUND_PAN_ATTACKER, 0x28 + waitplaysewithpan SE_W053, SOUND_PAN_TARGET, 0x32 + waitplaysewithpan SE_W152, SOUND_PAN_ATTACKER, 0x3c + waitplaysewithpan SE_W053, SOUND_PAN_TARGET, 0x46 + waitplaysewithpan SE_W152, SOUND_PAN_ATTACKER, 0x50 + waitplaysewithpan SE_W053, 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_W053, 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_W291, 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_W053, 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_MISTY_TERRAIN: - end - -Move_ELECTRIFY: - end - -Move_PLAY_ROUGH: - end - -Move_FAIRY_WIND: + + +Move_FAIRY_WIND:: + loadspritegfx ANIM_TAG_PINK_CLOUD + monbg SIDE_TARGET + setalpha 12, 8 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x8 0x6e7d + waitforvisualfinish + playsewithpan SE_W016, 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_W016B, SOUND_PAN_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x8 0x0 0x6e7d + waitforvisualfinish + clearmonbg SIDE_TARGET + blendoff end + Move_MOONBLAST: loadspritegfx ANIM_TAG_SMALL_BUBBLES @@ -5791,78 +8671,857 @@ Move_BOOMBURST: waitforvisualfinish end -Move_FAIRY_LOCK: +Move_FAIRY_LOCK:: + loadspritegfx ANIM_TAG_CHAIN_LINK @Chain Colour + loadspritegfx ANIM_TAG_FAIRY_LOCK_CHAINS @Fairy Lock Chain + setalpha 8, 8 + monbg SIDE_ATTACKER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x8 0x6B1F + waitforvisualfinish + loopsewithpan SE_W010, 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 PAL_BG 0x1 0x8 0x0 0x6B1F + waitforvisualfinish + clearmonbg SIDE_ATTACKER + blendoff end + -Move_KINGS_SHIELD: +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: + + +Move_PLAY_NICE:: + loadspritegfx ANIM_TAG_RED_HEART + loopsewithpan SE_W201, 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: +Move_CONFIDE:: + loadspritegfx ANIM_TAG_CONFIDE @Confide Bubble + launchtask AnimTask_Splash 0x2 0x2 ANIM_ATTACKER 0x3 + launchtemplate gConfideBubbleTemplate 0xb 0x2 0x0 0x64 + playsewithpan SE_W118, SOUND_PAN_ATTACKER + waitforvisualfinish + end + + +Move_DIAMOND_STORM:: + loadspritegfx ANIM_TAG_IMPACT + loadspritegfx ANIM_TAG_ICE_CRYSTALS + monbg SIDE_TARGET + monbgprio_28 ANIM_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xF 0x1888 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ICE_CRYSTALS, 0, 0xD, 0xD, 0x7DDE @Pink + waitforvisualfinish + panse_1B SE_W059, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 + launchtemplate gDiamondStormSwirlingIceTemplate 0x28 0x6 0x0 0xfff6 0x0 0xfff6 0x48 0x1 + launchtemplate gDiamondStormBlizzardTemplate 0x28 0x8 0x0 0x0 0x0 0x0 0x50 0x0 0x0 0x1 + delay 0x3 + launchtemplate gDiamondStormSwirlingIceTemplate 0x28 0x6 0x0 0xfff1 0x0 0xfff1 0x48 0x1 + launchtemplate gDiamondStormBlizzardTemplate 0x28 0x8 0x0 0xfff6 0x0 0xfff6 0x50 0x0 0x0 0x1 + delay 0x3 + launchtemplate gDiamondStormSwirlingIceTemplate 0x28 0x6 0x0 0xfffb 0x0 0xfffb 0x48 0x1 + launchtemplate gDiamondStormBlizzardTemplate 0x28 0x8 0x0 0xa 0x0 0xa 0x50 0x0 0x0 0x1 + delay 0x3 + launchtemplate gDiamondStormSwirlingIceTemplate 0x28 0x6 0x0 0xfff6 0x0 0xfff6 0x48 0x1 + launchtemplate gDiamondStormBlizzardTemplate 0x28 0x8 0x0 0xffec 0x0 0xffec 0x50 0x0 0x0 0x1 + delay 0x3 + launchtemplate gDiamondStormSwirlingIceTemplate 0x28 0x6 0x0 0xffec 0x0 0xffec 0x48 0x1 + launchtemplate gDiamondStormBlizzardTemplate 0x28 0x8 0x0 0xf 0x0 0xf 0x50 0x0 0x0 0x1 + delay 0x3 + launchtemplate gDiamondStormSwirlingIceTemplate 0x28 0x6 0x0 0xfff1 0x0 0xfff1 0x48 0x1 + launchtemplate gDiamondStormBlizzardTemplate 0x28 0x8 0x0 0xffec 0x0 0xffec 0x50 0x0 0x0 0x1 + delay 0x3 + launchtemplate gDiamondStormSwirlingIceTemplate 0x28 0x6 0x0 0xffe7 0x0 0xffe7 0x48 0x1 + launchtemplate gDiamondStormBlizzardTemplate 0x28 0x8 0x0 0x14 0x0 0x14 0x50 0x0 0x0 0x1 + delay 0x3 + playsewithpan SE_W239, 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_W196, 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_W196, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gRandomPosHitSplatSpriteTemplate 0x83 0x2 0x1 0x3 + playsewithpan SE_W196, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gBasicHitSplatSpriteTemplate 0x83 0x4 0x20 0x14 0x1 0x3 + playsewithpan SE_W196, SOUND_PAN_TARGET + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xF 0x0 0x1888 + waitforvisualfinish + clearmonbg SIDE_TARGET + blendoff + end + + +Move_STEAM_ERUPTION:: + loadspritegfx ANIM_TAG_STEAM_ERUPTION @Steam Eruption Particle + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x7 0x043D + delay 0x20 + monbg SIDE_TARGET + monbgprio_28 ANIM_TARGET + panse_1B SE_W056, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 + call SteamEruptionBreath + call SteamEruptionBreath + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 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 PAL_DEF 0x1 0x9 0x0 0x1f + waitforvisualfinish + clearmonbg SIDE_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 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 PAL_BG 0x1 0x0 0x10 0x7FFF + waitforvisualfinish + playsewithpan SE_W185, 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 PAL_BG 0x1 0x10 0x0 0x7FFF + waitforvisualfinish + end +HyperspaceHoleMovement: + playsewithpan SE_W003, 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 SIDE_TARGET + 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_W028, SOUND_PAN_TARGET + launchtemplate gWaterShurikenImpactTemplate 0x2 0x4 0x0 0x0 0x1 0x2 + waitforvisualfinish + clearmonbg SIDE_TARGET end -Move_DIAMOND_STORM: +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_STEAM_ERUPTION: + + +Move_SPIKY_SHIELD:: + loadspritegfx ANIM_TAG_PROTECT + loadspritegfx ANIM_TAG_GREEN_SPIKE + monbg SIDE_ATTACKER + monbgprio_28 ANIM_ATTACKER + waitplaysewithpan SE_W115, 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 SIDE_ATTACKER end - -Move_HYPERSPACE_HOLE: + + +Move_AROMATIC_MIST:: + loadspritegfx ANIM_TAG_PINK_PETAL + playsewithpan SE_W230, SOUND_PAN_ATTACKER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 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, (PAL_DEF | PAL_DEF_PARTNER), 1, 5, 5, 13, 0x56bf + call SweetScentEffect + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x8 0x0 0x6E7D + waitforvisualfinish end - -Move_WATER_SHURIKEN: + + +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 SIDE_TARGET + waitplaysewithpan SE_W085B, SOUND_PAN_TARGET 0x13 + delay 0x4 + launchtemplate gEerieImpulseRingTemplate 0x0 0x7 0x2d 0x0 0x0 0x0 0x0 0x0 0x1 + delay 0xB + 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 SOUND_PAN_ATTACKER 0x28 0x2 + launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x20 0x1e 0x0 0x28 0x0 + launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x20 0x1e 0x40 0x28 0x1 + launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x20 0x1e 0x80 0x28 0x0 + launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x20 0x1e SOUND_PAN_ATTACKER 0x28 0x2 + launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x30 0x1e 0x20 0x28 0x0 + launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x30 0x1e 0x60 0x28 0x1 + launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x30 0x1e 0xa0 0x28 0x0 + launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x30 0x1e 0xe0 0x28 0x2 + waitforvisualfinish + playsewithpan SE_W085B, SOUND_PAN_ATTACKER + launchtemplate gEerieImpulseImpactTemplate 0x2 0x6 0x0 0xfffb 0x1 0x0 0x20 0x10 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0x5 0x0 0x5 0x0 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfffb 0xa 0x5 0x1 + delay 0x7 + launchtemplate gEerieImpulseImpactTemplate 0x2 0x6 0xfff1 0xa 0x1 0x0 0x20 0x10 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xf 0x14 0x5 0x2 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfff1 0xfff6 0x5 0x0 + delay 0x7 + launchtemplate gEerieImpulseImpactTemplate 0x2 0x6 0xfff1 0xfff1 0x1 0x0 0x20 0x10 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0x19 0x0 0x5 0x1 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfff8 0x8 0x5 0x2 + delay 0x7 + launchtemplate gEerieImpulseImpactTemplate 0x2 0x6 0xa 0xfffb 0x1 0x0 0x20 0x10 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0x2 0xfff8 0x5 0x0 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xffec 0xf 0x5 0x1 + waitforvisualfinish + clearmonbg SIDE_TARGET end - -Move_MYSTICAL_FIRE: + + +Move_VENOM_DRENCH:: + loadspritegfx ANIM_TAG_POISON_BUBBLE + monbg SIDE_TARGET + launchtemplate gVenomDrenchAcidTemplate 0x82, 0x4, 0xfffb 0x1 0xfffb 0x0 + playsewithpan SE_W145C, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gVenomDrenchAcidTemplate 0x82, 0x4, 0x5 0x0 0x6 0x0 + playsewithpan SE_W145C, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gVenomDrenchAcidTemplate 0x82, 0x4, 0x13 0x1 0xa 0x0 + playsewithpan SE_W145C, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gVenomDrenchAcidTemplate 0x82, 0x4, 0xffe9 0x2 0xfff6 0x0 + playsewithpan SE_W145C, SOUND_PAN_TARGET + delay 0x2 + call AcidDrench + call AcidDrench + waitforvisualfinish + clearmonbg SIDE_TARGET end - -Move_SPIKY_SHIELD: +AcidDrench: + launchtemplate gVenomDrenchAcidTemplate 0x82, 0x4, 0xffec 0x0 0xfff6 0x0 + playsewithpan SE_W145C, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gVenomDrenchAcidTemplate 0x82, 0x4, 0x1c 0x1 0xa 0x0 + playsewithpan SE_W145C, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gVenomDrenchAcidTemplate 0x82, 0x4, 0xfff6 0x1 0xfffb 0x0 + playsewithpan SE_W145C, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gVenomDrenchAcidTemplate 0x82, 0x4, 0xa 0x0 0x6 0x0 + playsewithpan SE_W145C, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gVenomDrenchAcidTemplate 0x82, 0x4, 0x18 0x1 0xa 0x0 + playsewithpan SE_W145C, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gVenomDrenchAcidTemplate 0x82, 0x4, 0xffe0 0x2 0xfff6 0x0 + playsewithpan SE_W145C, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gVenomDrenchAcidTemplate 0x82, 0x4, 0xffec 0x0 0xfff6 0x0 + playsewithpan SE_W145C, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gVenomDrenchAcidTemplate 0x82, 0x4, 0x1e 0x2 0xa 0x0 + playsewithpan SE_W145C, SOUND_PAN_TARGET + delay 0x2 + return + + +Move_POWDER:: + loadspritegfx ANIM_TAG_HANDS_AND_FEET @black color + loadspritegfx ANIM_TAG_SPORE @powder + monbg SIDE_TARGET + monbgprio_28 ANIM_TARGET + loopsewithpan SE_W077, SOUND_PAN_TARGET, 0x12, 0xa + call POWDER_SPORE + call POWDER_SPORE + call POWDER_SPORE + waitforvisualfinish + clearmonbg SIDE_TARGET end - -Move_AROMATIC_MIST: +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 SIDE_ATTACKER + setalpha 8, 8 + choosetwoturnanim GeomancyChargeUp GeomancyUnleash +GeomancyChargeUp: + loadspritegfx ANIM_TAG_FOCUS_ENERGY @endure buff effect + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + playsewithpan SE_W322, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_ATTACKER 0x0 0x2 0x5f 0x1 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x2 0x0 0x5 0x1F + call GeomancyRingBuff + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x2 0x0 0x5 0x2C0 + call GeomancyRingBuff + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x2 0x0 0x5 0x7C60 + call GeomancyRingBuff + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x8 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x2 0x5 0x0 0x7C60 + waitforvisualfinish + blendoff + clearmonbg SIDE_ATTACKER end - -Move_EERIE_IMPULSE: +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 PAL_BG 0x1 0x0 0x10 0x24CF + playsewithpan SE_W208, 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_W082, SOUND_PAN_ATTACKER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x10 0x10 0x4D01 + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_ATTACKER 0x0 0x2 0x25 0x1 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 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 PAL_BG 0x1 0x10 0x0 0x4D01 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x2 0x5 0x0 0x1F + waitforvisualfinish + blendoff + clearmonbg SIDE_ATTACKER end - -Move_VENOM_DRENCH: +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, (PAL_DEF | PAL_ATK), 2, 0, 9, 0x243B + createvisualtask AnimTask_BlendBattleAnimPal 10, (PAL_DEF | PAL_ATK_PARTNER), 2, 0, 9, 0x243B + loopsewithpan SE_W161, 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, (PAL_DEF | PAL_ATK), 2, 9, 0, 0x243B + createvisualtask AnimTask_BlendBattleAnimPal 10, (PAL_DEF | PAL_ATK_PARTNER), 2, 9, 0, 0x243B + waitforvisualfinish end - -Move_POWDER: +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_W006, 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 - -Move_GEOMANCY: +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_W268, SOUND_PAN_ATTACKER + launchtemplate gElectricTerrainOrbsTemplate 0x2 0x2 0x1a 0x0 + launchtemplate gElectricTerrainOrbsTemplate 0x2 0x2 0x1a 0x2a + launchtemplate gElectricTerrainOrbsTemplate 0x2 0x2 0x1a 0x54 + launchtemplate gElectricTerrainOrbsTemplate 0x2 0x2 0x1a 0x7e + launchtemplate gElectricTerrainOrbsTemplate 0x2 0x2 0x1a 0xa8 + launchtemplate gElectricTerrainOrbsTemplate 0x2 0x2 0x1a 0xd2 + delay 0x34 + setarg 0x7 0xffff + playsewithpan SE_W213, SOUND_PAN_ATTACKER + launchtask AnimTask_ScaleMonAndRestore 0x5 0x5 0xfff9 0xfff9 0xb 0x0 0x0 + launchtemplate gElectricTerrainFlyingBallTemplate 0x82 0x1 0x0 + launchtemplate gElectricTerrainFlyingBallTemplate 0x82 0x1 0x20 + launchtemplate gElectricTerrainFlyingBallTemplate 0x82 0x1 0x40 + launchtemplate gElectricTerrainFlyingBallTemplate 0x82 0x1 0x60 + launchtemplate gElectricTerrainFlyingBallTemplate 0x82 0x1 0x80 + launchtemplate gElectricTerrainFlyingBallTemplate 0x82 0x1 0xa0 + launchtemplate gElectricTerrainFlyingBallTemplate 0x82 0x1 SOUND_PAN_ATTACKER + launchtemplate gElectricTerrainFlyingBallTemplate 0x82 0x1 0xe0 + waitforvisualfinish + restorebg + waitbgfadein + playsewithpan SE_W085B, SOUND_PAN_TARGET + delay 0x40 + playsewithpan SE_W085B, SOUND_PAN_TARGET + delay 0x40 end - -Move_HAPPY_HOUR: + + +Move_DAZZLING_GLEAM:: + loadspritegfx ANIM_TAG_SPARKLE_2 + loadspritegfx ANIM_TAG_BLUE_STAR + launchtemplate gSimplePaletteBlendSpriteTemplate 0x2 0x5 0x1 0x2 0x0 0xd 0x7fff + playsewithpan SE_W239, 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_W202, SOUND_PAN_ATTACKER + waitforvisualfinish + launchtemplate gSimplePaletteBlendSpriteTemplate 0x2 0x5 0x1 0x0 0xd 0x0 0x7fff + waitforvisualfinish + clearmonbg 0x0 + blendoff end - -Move_ELECTRIC_TERRAIN: + + +Move_CELEBRATE:: + loadspritegfx ANIM_TAG_ITEM_BAG + launchtemplate gCelebrateBagTemplate 0x2 0x1 0x0 + playsewithpan SE_W039, SOUND_PAN_ATTACKER + delay 0x12 + playsewithpan SE_W213, SOUND_PAN_ATTACKER + delay 0x47 + loopsewithpan SE_W039, SOUND_PAN_ATTACKER 0x16 0x3 end - -Move_DAZZLING_GLEAM: + + +Move_HOLD_HANDS:: + loadspritegfx ANIM_TAG_TAG_HAND @hand + loadspritegfx ANIM_TAG_MAGENTA_HEART @charm + loadspritegfx ANIM_TAG_VERTICAL_HEX @red + playsewithpan SE_W080, 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_W227, 0x0 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x2 0x2 0x0 0x5 0x1 + delay 0xe + playsewithpan SE_W227, 0x0 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x2 0x2 0x0 0x5 0x1 + delay 0x14 + playsewithpan SE_W227, 0x0 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x2 0x3 0x0 0xa 0x1 + launchtask AnimTask_BlendMonInAndOut 0x2 0x5 0x2 0x3ff 0xc 0x1 0x1 end - -Move_CELEBRATE: + + +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 PAL_BG 0x0 0x0 0xA 0x7FFF + waitforvisualfinish + launchtemplate gOpeningEyeSpriteTemplate 0x5 0x4 0x0 0x0 0x1 0x0 + delay 0x20 + playsewithpan SE_W043, 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 PAL_BG 0x0 0xA 0x0 0x7FFF + waitforvisualfinish + blendoff end - -Move_HOLD_HANDS: + + +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_W204, SOUND_PAN_ATTACKER + delay 0xf + launchtemplate gMagentaHeartSpriteTemplate 0x3 0x2 0xffec 0x14 + playsewithpan SE_W204, SOUND_PAN_ATTACKER + delay 0xf + launchtemplate gMagentaHeartSpriteTemplate 0x3 0x2 0x14 0x14 + playsewithpan SE_W204, SOUND_PAN_ATTACKER + waitforvisualfinish + playsewithpan SE_W085B, SOUND_PAN_TARGET + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0x0 0x0 0x1 0x2 + call ElectricityEffectNoSound + waitforvisualfinish end - -Move_BABY_DOLL_EYES: + + +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_W207, 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_W025B, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff end - -Move_NUZZLE: + + +Move_INFESTATION:: + loadspritegfx ANIM_TAG_HANDS_AND_FEET @black color + loadspritegfx ANIM_TAG_SMALL_BUBBLES @circle particles + monbg SIDE_TARGET + monbgprio_28 ANIM_TARGET + createvisualtask AnimTask_BlendBattleAnimPal, 10, PAL_DEF, 0x2, 0x0, 0x9, 0x7320 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x3 0x0 0x4f 0x1 + loopsewithpan SE_W268, SOUND_PAN_ATTACKER, 0x0, 0x4F + call InfestationVortex + call InfestationVortex + call InfestationVortex + call InfestationVortex + call InfestationVortex + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 PAL_DEF 0x2 0x9 0x0 0x7320 + waitforvisualfinish + clearmonbg SIDE_TARGET end - -Move_HOLD_BACK: - end - -Move_INFESTATION: - 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 @@ -5880,33 +9539,4420 @@ Move_POWER_UP_PUNCH: blendoff end -Move_OBLIVION_WING: +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_W019, SOUND_PAN_ATTACKER + launchtemplate gFlyBallUpSpriteTemplate 0x2 0x4 0x0 0x0 0xd 0x150 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 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 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 PAL_BG 0x1 0xE 0x0 0x0 @From black + waitforvisualfinish end - -Move_THOUSAND_ARROWS: +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 PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + launchtemplate gThousandArrowsGreenChargeTemplate 0x2 0x1 0x0 + playsewithpan SE_W268, SOUND_PAN_ATTACKER + delay 0x18 + playsewithpan SE_W268, 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_W085B, 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 PAL_BG 0x1 0xC 0x0 0xffff + waitforvisualfinish + clearmonbg ANIM_ATTACKER + blendoff end - -Move_THOUSAND_WAVES: +ThousandArrowsHexes: + launchtemplate gThousandArrowsGreenHexTemplate 0x82, 0x3, 0x0 0xfffc 0xfff0 + playsewithpan SE_W091, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gThousandArrowsGreenHexTemplate 0x82, 0x3, 0x0 0x100D 0xfff0 + playsewithpan SE_W091, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gThousandArrowsGreenHexTemplate 0x82, 0x3, 0x0 0x4 0xfff4 + playsewithpan SE_W091, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gThousandArrowsGreenHexTemplate 0x82, 0x3, 0x0 0xfff0 0xfff0 + playsewithpan SE_W091, SOUND_PAN_ATTACKER + delay 0x2 + return +ThousandArrowsDown: + launchtemplate gThousandArrowsGreenArrowTemplate 0x82, 0x3, 0x1 0xdc 0x3c + playsewithpan SE_W091, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gThousandArrowsGreenArrowTemplate 0x82, 0x3, 0x1 0x3c 0x64 + playsewithpan SE_W091, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gThousandArrowsGreenArrowTemplate 0x82, 0x3, 0x1 0x8c 0x37 + playsewithpan SE_W091, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gThousandArrowsGreenArrowTemplate 0x82, 0x3, 0x1 0xb4 0x32 + playsewithpan SE_W091, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gThousandArrowsGreenArrowTemplate 0x82, 0x3, 0x1 0x14 0x5a + playsewithpan SE_W091, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gThousandArrowsGreenArrowTemplate 0x82, 0x3, 0x1 0x5a 0x5a + playsewithpan SE_W091, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gThousandArrowsGreenArrowTemplate 0x82, 0x3, 0x1 0xa0 0x3c + playsewithpan SE_W091, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gThousandArrowsGreenArrowTemplate 0x82, 0x3, 0x1 0x1e 0x5a + playsewithpan SE_W091, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gThousandArrowsGreenArrowTemplate 0x82, 0x3, 0x1 0x78 0x3c + playsewithpan SE_W091, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gThousandArrowsGreenArrowTemplate 0x82, 0x3, 0x1 0xc8 0x28 + playsewithpan SE_W091, 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 SIDE_ATTACKER + setalpha 8, 8 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + playsewithpan SE_W025, 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 SIDE_ATTACKER @I placed this one here, because it ruins the teleport animation + loopsewithpan SE_W004, 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_W100, SOUND_PAN_ATTACKER + launchtemplate gThousandWavesGreenRecoverTemplate 0x2 0x3 0x5 0xffd8 0xd + waitforvisualfinish + panse_1B SE_W063B, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 + delay 0x4 + launchtask AnimTask_MoveHeatWaveTargets 0x5 0x0 + delay 0xc + monbg SIDE_TARGET + 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 PAL_BG 0x1 0xC 0x0 0xffff + waitforvisualfinish + blendoff + clearmonbg SIDE_TARGET end - -Move_LANDS_WRATH: +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_W004, 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_W004, 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_W004, 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_W004, 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_W004, 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_W004, 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 PAL_BG 0x1 0x0 0xE 0x0 + waitforvisualfinish + call LandsWrathVortex + call LandsWrathVortex + call LandsWrathVortex + call LandsWrathVortex + waitforvisualfinish + fadetobg BG_FISSURE + waitbgfadeout + playsewithpan SE_W089, 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 PAL_BG 0x1 0x0 0x0 0x0 + clearmonbg ANIM_ATTACKER end - -Move_LIGHT_OF_RUIN: +LandsWrathVortex: + playsewithpan SE_W221B 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_W076, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 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_W153, 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 PAL_BG 0x1 0x10 0x0 0x7FFF + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ALL_BANKS 0x1 0x0 0x0 0x0 + waitforvisualfinish end - -Move_ORIGIN_PULSE: - end - -Move_PRECIPICE_BLADES: - end - -Move_DRAGON_ASCENT: - end - -Move_HYPERSPACE_FURY: +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_W025, 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_OP_BASYU, 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 SIDE_TARGET + launchtemplate gOriginPulseBasicSplatTemplate 0x83 0x4 0xffb0 0xfff0 0x1 0x1 + stopsound + playsewithpan SE_W056, 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 SIDE_TARGET + 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 SIDE_TARGET + 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_W089, 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_W070, 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 SIDE_TARGET + 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_W019, SOUND_PAN_ATTACKER + invisible ANIM_ATTACKER + launchtemplate gDragonAscentFlyUpTemplate 0x2 0x7 0x0 0x0 0x400 0x24 0x15 0x1 ANIM_ATTACKER + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal, 0xa 0x5, (PAL_ATK | PAL_BG | PAL_BG_4 | PAL_BG_5), 4, 0, 14, RGB(21, 31, 27) + playsewithpan SE_W025, SOUND_PAN_ATTACKER + waitforvisualfinish + playsewithpan SE_W197, SOUND_PAN_ATTACKER + launchtask AnimTask_StartSlidingBg, 0x5 0x4, -7304, -784, 1, -1 + delay 2 + launchtask AnimTask_BlendBattleAnimPal, 0xa 0x5, (PAL_ATK | PAL_BG | PAL_BG_4 | PAL_BG_5), 0, 14, 0, RGB(21, 31, 27) + waitforvisualfinish + delay 1 + monbg SIDE_TARGET + setalpha 12, 8 + playsewithpan SE_W104, SOUND_PAN_ATTACKER + launchtemplate gDragonAscentDrakeTemplate, 2, 0x1 5 + delay 1 + playsewithpan SE_W025B, 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, (PAL_ATK | PAL_BG | PAL_BG_4 | PAL_BG_5), 2, 16, 0, RGB(26, 31, 0) + waitforvisualfinish + delay 3 + launchtemplate gSlideMonToOriginalPosSpriteTemplate, 2, 0x3, 1, 0, 7 + waitforvisualfinish + blendoff + clearmonbg SIDE_TARGET + 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 PAL_BG 0x1 0x0 0xA 0x0 + waitforvisualfinish + playsewithpan SE_W171, 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_W003, 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_W007, 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 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_W201, 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_W166, 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_W025B, 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 SIDE_ATTACKER + monbgprio_28 ANIM_ATTACKER + waitplaysewithpan SE_W115, 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 SIDE_ATTACKER + end + + +Move_SPIRIT_SHACKLE:: + loadspritegfx ANIM_TAG_SPIRIT_ARROW @Arrow + loadspritegfx ANIM_TAG_CHAIN_LINK @Chain + monbg SIDE_TARGET + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x10 0x0 + waitforvisualfinish + playsewithpan SE_W013B, 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_REAPOKE, 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 PAL_BG 0x1 0x10 0x0 0x0 + waitforvisualfinish + clearmonbg SIDE_TARGET + 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 SIDE_TARGET + setalpha 12, 8 + playsewithpan SE_W104, SOUND_PAN_ATTACKER + waitplaysewithpan SE_W004, SOUND_PAN_TARGET, 0xa + waitplaysewithpan SE_W104, SOUND_PAN_ATTACKER, 0x14 + waitplaysewithpan SE_W004, SOUND_PAN_TARGET, 0x1e + waitplaysewithpan SE_W104, SOUND_PAN_ATTACKER, 0x28 + waitplaysewithpan SE_W004, SOUND_PAN_TARGET, 0x32 + waitplaysewithpan SE_W104, SOUND_PAN_ATTACKER, 0x3c + waitplaysewithpan SE_W004, SOUND_PAN_TARGET, 0x46 + waitplaysewithpan SE_W104, SOUND_PAN_ATTACKER, 0x50 + waitplaysewithpan SE_W004, 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 SIDE_TARGET + 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 PAL_BG 0x1 0x0 0xE 0x0 + waitforvisualfinish + launchtemplate gSparklingAriaBlueChargeTemplate 0x2 0x1 0x0 + call SparklingAriaCharge + call SparklingAriaCharge + call SparklingAriaCharge + waitforvisualfinish + delay 0x1E + playsewithpan SE_W056, SOUND_PAN_ATTACKER + call SparklingAriaRain + call SparklingAriaRain + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 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_W152, SOUND_PAN_ATTACKER + launchtemplate gSparklingAriaBubblesTemplate 0x2 0x4 0xa 0xa 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gSparklingAriaBubblesTemplate 0x2 0x4 0xfff1 0x0 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gSparklingAriaBubblesTemplate 0x2 0x4 0x14 0xa 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gSparklingAriaBubblesTemplate 0x2 0x4 0x0 0xfff6 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gSparklingAriaBubblesTemplate 0x2 0x4 0xfff6 0xf 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gSparklingAriaBubblesTemplate 0x2 0x4 0x19 0x14 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_ATTACKER + launchtemplate gSparklingAriaBubblesTemplate 0x2 0x4 0xffec 0x14 0x19 0x0 + delay 0x4 + playsewithpan SE_W152, 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 PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + playsewithpan SE_W104, SOUND_PAN_TARGET + launchtemplate gIceHammerPunchStompTemplate 0x83, 0x3 0x0 0xffe0 0xf + delay 0x13 + playsewithpan SE_W025B, 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 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_W197, SOUND_PAN_ATTACKER + call CIRCLES_LEAVES + call CIRCLES_LEAVES + waitforvisualfinish + panse_1B SE_W004, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 + playsewithpan SE_W239, 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_W077, SOUND_PAN_TARGET, 0x12, 0xa + call FloralHealingSpores + call FloralHealingSpores + call FloralHealingSpores + waitforvisualfinish + playsewithpan SE_W071B, 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 PAL_BG 0x0 0x0 0x10 0x0 + setalpha 12, 8 + playsewithpan SE_W025, SOUND_PAN_TARGET + launchtemplate gHighHorsepowerHorseshoeTemplate 0x3 0x4 0x0 0x0 0x1 0x32 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x2 0x0 0x7 0x7fff + delay 0x32 + playsewithpan SE_W025B, 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 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 SIDE_TARGET + playsewithpan SE_W120, 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 PAL_BG 0x1 0x0 0x3 0x07FD + delay 0x5 + playsewithpan SE_W152, SOUND_PAN_TARGET + launchtemplate gStrengthSapAbsorbTemplate 0x3 0x4 0x0 0x5 0x8 0x1a + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_TARGET + launchtemplate gStrengthSapAbsorbTemplate 0x3 0x4 0xa 0xfffb 0xfff8 0x1a + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_TARGET + launchtemplate gStrengthSapAbsorbTemplate 0x3 0x4 0xfffb 0xf 0x10 0x21 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_TARGET + launchtemplate gStrengthSapAbsorbTemplate 0x3 0x4 0x0 0xfff1 0xfff0 0x24 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_TARGET + launchtemplate gStrengthSapAbsorbTemplate 0x3 0x4 0x0 0x5 0x8 0x1a + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_TARGET + launchtemplate gStrengthSapAbsorbTemplate 0x3 0x4 0xa 0xfffb 0xfff8 0x1a + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_TARGET + launchtemplate gStrengthSapAbsorbTemplate 0x3 0x4 0xfff6 0x14 0x14 0x27 + delay 0x4 + playsewithpan SE_W152, SOUND_PAN_TARGET + launchtemplate gStrengthSapAbsorbTemplate 0x3 0x4 0x5 0xffee 0xffec 0x23 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x3 0x0 0x07FD + loopsewithpan SE_W215, SOUND_PAN_ATTACKER, 0x10, 0x3 + call GrantingStarsEffect + waitforvisualfinish + clearmonbg SIDE_TARGET + 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, (PAL_BG | PAL_ALL_BANKS), 1, 0, 6, 0x7fff + waitforvisualfinish + playsewithpan SE_W014, 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_W013, 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, (PAL_BG | PAL_ALL_BANKS), 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 SIDE_TARGET + playsewithpan SE_W013B, 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_W013, SOUND_PAN_TARGET + launchtemplate gLeafageImpactTemplate 0x2 0x4 0x0 0x0 0x1 0x2 + waitforvisualfinish + clearmonbg SIDE_TARGET + 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_C_PASI, 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 SIDE_TARGET + delay 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x9 0x0 + waitforvisualfinish + loopsewithpan SE_W081, 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_W081B, 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 SIDE_TARGET + delay 0x1 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 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 PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + launchtemplate gLaserFocusRedEyesTemplate 0x5 0x4 0x0 0x0 0x0 0x0 + waitforvisualfinish + playsewithpan SE_W043, SOUND_PAN_ATTACKER + launchtemplate gLeerSpriteTemplate 0x2 0x2 0x18 0xfff4 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 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 PAL_ATK 0x2 0x0 0x9 0x039B + launchtemplate gGearUpGearsTemplate 0x2 0x4 0x0 0xffe8 0x8 0x8c + playsewithpan SE_TAMAKORO_E, 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_TAMAKORO_E, 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_TAMAKORO_E, 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_TAMAKORO_E, SOUND_PAN_ATTACKER + call GearUpSparks + call GearUpSparks + call GearUpSparks + playsewithpan SE_TAMAKORO_E, 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 PAL_ATK 0x2 0x9 0x0 0x039B + waitforvisualfinish + end +GearUpSparks: + playsewithpan SE_TAMAKORO_E, 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_TAMAKORO_E, 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 SIDE_TARGET + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_W104, 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_W003, 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 SIDE_TARGET + blendoff + end + + +Move_POLLEN_PUFF:: + launchtask AnimTask_IsTargetPartner 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 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_W234, SOUND_PAN_ATTACKER + delay 0xD + launchtemplate gPollenPuffPinkStarTemplate 0x2 0x4 0xfff1 0x0 0x19 0x0 + playsewithpan SE_W234, SOUND_PAN_ATTACKER + delay 0xD + launchtemplate gPollenPuffPinkStarTemplate 0x2 0x4 0xa 0xa 0x19 0x0 + playsewithpan SE_W234, SOUND_PAN_ATTACKER + delay 0xD + launchtemplate gPollenPuffPinkStarTemplate 0x2 0x4 0xfff1 0x0 0x19 0x0 + playsewithpan SE_W234, 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_W028, SOUND_PAN_TARGET + launchtemplate gPollenPuffSporeTemplate 0x82 0x6 0xa 0x0 0x0 0x0 0x19 0xffe0 + waitforvisualfinish + playsewithpan SE_W153, 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 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 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_W234, SOUND_PAN_ATTACKER + delay 0xD + launchtemplate gPollenPuffPinkStarTemplate 0x2 0x4 0xfff1 0x0 0x19 0x0 + playsewithpan SE_W234, SOUND_PAN_ATTACKER + delay 0xD + launchtemplate gPollenPuffPinkStarTemplate 0x2 0x4 0xa 0xa 0x19 0x0 + playsewithpan SE_W234, SOUND_PAN_ATTACKER + delay 0xD + launchtemplate gPollenPuffPinkStarTemplate 0x2 0x4 0xfff1 0x0 0x19 0x0 + playsewithpan SE_W071B, SOUND_PAN_ATTACKER + clearmonbg ANIM_ATTACKER + waitforvisualfinish + stopsound + playsewithpan SE_W028, 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_W071B, 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 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_RU_HYUU 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_REAPOKE, 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_W215, SOUND_PAN_ATTACKER + launchtemplate gPsychicTerrainOrbsTemplate 0x2 0x2 0x1a 0x0 + launchtemplate gPsychicTerrainOrbsTemplate 0x2 0x2 0x1a 0x2a + launchtemplate gPsychicTerrainOrbsTemplate 0x2 0x2 0x1a 0x54 + launchtemplate gPsychicTerrainOrbsTemplate 0x2 0x2 0x1a 0x7e + launchtemplate gPsychicTerrainOrbsTemplate 0x2 0x2 0x1a 0xa8 + launchtemplate gPsychicTerrainOrbsTemplate 0x2 0x2 0x1a 0xd2 + delay 0x34 + setarg 0x7 0xffff + playsewithpan SE_W213, SOUND_PAN_ATTACKER + launchtask AnimTask_ScaleMonAndRestore 0x5 0x5 0xfff9 0xfff9 0xb 0x0 0x0 + launchtemplate gPsychicTerrainStarTemplate 0x82 0x1 0x0 + launchtemplate gPsychicTerrainStarTemplate 0x82 0x1 0x20 + launchtemplate gPsychicTerrainStarTemplate 0x82 0x1 0x40 + launchtemplate gPsychicTerrainStarTemplate 0x82 0x1 0x60 + launchtemplate gPsychicTerrainStarTemplate 0x82 0x1 0x80 + launchtemplate gPsychicTerrainStarTemplate 0x82 0x1 0xa0 + launchtemplate gPsychicTerrainStarTemplate 0x82 0x1 SOUND_PAN_ATTACKER + launchtemplate gPsychicTerrainStarTemplate 0x82 0x1 0xe0 + waitforvisualfinish + restorebg + waitbgfadein + loopsewithpan SE_W048, SOUND_PAN_TARGET, 0xa, 0x3 + waitsound + 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 SIDE_ATTACKER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_ATTACKER 0x3 0x0 0xf0 0x0 + loopsewithpan SE_W060B, SOUND_PAN_ATTACKER, 0xe, 0xa + launchtemplate gLungeGreenChargeTemplate 0x2 0x0 + delay 0x6e + delay 0x3e + playsewithpan SE_W100, SOUND_PAN_ATTACKER + delay 0x15 + clearmonbg SIDE_ATTACKER + invisible ANIM_ATTACKER + waitforvisualfinish + playsewithpan SE_W039, SOUND_PAN_ATTACKER + launchtemplate gLungeGreenBubbleTemplate 0x82 0x6 0xa 0x0 0x0 0x0 0x19 0xffe0 + delay 0xF + monbg SIDE_TARGET + 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_W003, SOUND_PAN_TARGET + launchtemplate gLungeGreenImpactTemplate 0x2 0x4 0x0 0x0 0x1 0x2 + waitforvisualfinish + visible ANIM_ATTACKER + clearmonbg SIDE_TARGET + end + + +Move_FIRE_LASH:: + loadspritegfx ANIM_TAG_SMALL_EMBER + monbg SIDE_TARGET + monbgprio_2A ANIM_TARGET + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x0 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x4 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x8 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0xc + playsewithpan SE_W172, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x10 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x14 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x18 + playsewithpan SE_W172, 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_W172B, SOUND_PAN_TARGET + loadspritegfx ANIM_TAG_SLASH + launchtemplate gSlashSliceSpriteTemplate 0x82, 0x3, 0x1 0xfff8 0x0 + playsewithpan SE_W013, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gSlashSliceSpriteTemplate 0x82, 0x3, 0x1 0x8 0x0 + launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0x4 0x0 0x12 0x1 + playsewithpan SE_W013, SOUND_PAN_TARGET + delay 0x7 + launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_ATTACKER 0x0 0x9 + waitforvisualfinish + clearmonbg SIDE_TARGET + 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 SIDE_TARGET + playsewithpan SE_W082, SOUND_PAN_ATTACKER + call PowerTripBuffUp + delay 0x8 + launchtask AnimTask_BlendColorCycle 0x2 0x6 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_W003, 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_W003, 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_W003, SOUND_PAN_TARGET + launchtemplate gPowerTripImpactTemplate 0x2 0x4 0xA 0x0 0x1 0x2 + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + waitforvisualfinish + clearmonbg SIDE_TARGET + 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 SIDE_TARGET + setblends 0x120C + fadetobg BG_FIRE + waitbgfadeout + launchtask AnimTask_StartSlidingBg 0x5 0x4 0xA00 0x0 0x1 0xffff + waitbgfadein + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 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_W036, SOUND_PAN_ATTACKER 0x9 0x2 + launchtask AnimTask_CopyPalUnfadedToBackup 0x5 0x2 0x1 0x0 + delay 0x1 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 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_W172, 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 PAL_ATK 0x0 0x0 0xd 0x4a52 + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_ATTACKER 0x3 0x0 0xf 0x1 + delay 0xF + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 PAL_DEF 0x2 0x0 0xC 0x1C + delay 0x1 + launchtask AnimTask_CopyPalUnfadedFromBackup 0x5 0x2 0x0 0x1 + delay 0x1 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x5 0x0 0x1c + delay 0x1 + launchtask AnimTask_CopyPalUnfadedFromBackup 0x5 0x2 0x1 0x0 + delay 0x1 + playsewithpan SE_W172B, SOUND_PAN_TARGET + launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_TARGET 0x2 0x0 0xf 0x1 + call FireSpreadEffect + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x0 0xd 0x0 0x4a52 + delay 0x1 + launchtask AnimTask_FreeBackupPalBuffer 0x5 0x0 + delay 0x1 + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 PAL_DEF 0x2 0xC 0x0 0x1C + waitforvisualfinish + call UnsetPsychicBg + clearmonbg SIDE_TARGET + 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_W107, 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_W107, 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 SIDE_TARGET + 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_W233B, 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 SIDE_TARGET + 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_W104, SOUND_PAN_ATTACKER + launchtemplate gPurifyWhiteBallTemplate 0x2 0x6 0x14 0xfff8 0xfff8 0xfff8 0x14 0xffe0 + delay 0x13 + playsewithpan SE_W028, 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 PAL_BG 0x1 0x0 0xF 0x0 + waitforvisualfinish + playsewithpan SE_W080, 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_W013B, SOUND_PAN_ATTACKER + launchtemplate gRevelationDanceYellowAirWaveTemplate 0x82 0x5 0x10 0x0 0x0 0x0 0xf + waitforvisualfinish + playsewithpan SE_W003, 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 SOUND_PAN_ATTACKER 0xb0 0x28 + launchtemplate gRevelationDanceYellowDispersalTemplate 0x81 0x5 0x0 0xa 0xff40 0xf0 0x28 + launchtemplate gRevelationDanceYellowDispersalTemplate 0x81 0x5 0x0 0xa SOUND_PAN_ATTACKER 0xff60 0x28 + 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 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_W025, 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_W076, 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_W120, SOUND_PAN_TARGET + launchtemplate gCoreEnforcerExplosionTemplate 0x3 0x4 0x0 0x0 ANIM_TARGET 0x1 + delay 0x6 + playsewithpan SE_W120, SOUND_PAN_TARGET + launchtemplate gCoreEnforcerExplosionTemplate 0x3 0x4 0x18 0xffe8 ANIM_TARGET 0x1 + delay 0x6 + playsewithpan SE_W120, SOUND_PAN_TARGET + launchtemplate gCoreEnforcerExplosionTemplate 0x3 0x4 0xfff0 0x10 ANIM_TARGET 0x1 + delay 0x6 + playsewithpan SE_W120, SOUND_PAN_TARGET + launchtemplate gCoreEnforcerExplosionTemplate 0x3 0x4 0xffe8 0xfff4 ANIM_TARGET 0x1 + delay 0x6 + playsewithpan SE_W120, SOUND_PAN_TARGET + launchtemplate gCoreEnforcerExplosionTemplate 0x3 0x4 0x10 0x10 ANIM_TARGET 0x1 + delay 0x6 + playsewithpan SE_W120, 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 SIDE_TARGET + 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_W233B, SOUND_PAN_TARGET + delay 0xA + playsewithpan SE_W234, SOUND_PAN_ATTACKER + launchtemplate gTropKickLeavesTemplate 0x81 0x5 0x0 0xa SOUND_PAN_ATTACKER 0xb0 0x28 + launchtemplate gTropKickLeavesTemplate 0x81 0x5 0x0 0xa 0xff40 0xf0 0x28 + launchtemplate gTropKickFlowerTemplate 0x81 0x5 0x0 0xa SOUND_PAN_ATTACKER 0xff60 0x28 + launchtemplate gTropKickFlowerTemplate 0x81 0x5 0x0 0xa 0xff40 0xff90 0x28 + launchtemplate gTropKickFlowerTemplate 0x81 0x5 0x0 0xa 0xa0 0x30 0x28 + launchtemplate gTropKickLeavesTemplate 0x81 0x5 0x0 0xa 0xff20 0xffe0 0x28 + launchtemplate gTropKickLeavesTemplate 0x81 0x5 0x0 0xa 0x70 0xff80 0x28 + waitforvisualfinish + clearmonbg SIDE_TARGET + 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_W039, 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 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_W020, SOUND_PAN_TARGET + delay 0x1A + launchtask AnimTask_BlendMonInAndOut 0x5 0x5 0x0 0x37b 0xc 0x1 0x1 + playsewithpan SE_W020, SOUND_PAN_TARGET + delay 0x1A + launchtask AnimTask_BlendMonInAndOut 0x5 0x5 0x0 0x37b 0xc 0x1 0x1 + playsewithpan SE_W020, SOUND_PAN_TARGET + delay 0x1D + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x2 0x8 0x0 0x7DB9 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end + + +Move_BEAK_BLAST:: + loadspritegfx ANIM_TAG_SMALL_EMBER @Fire + playsewithpan SE_W082, SOUND_PAN_ATTACKER + delay 0x3 + launchtask AnimTask_BlendColorCycle 0x2 0x6 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 PAL_ATK 0x2 0x0 0x9 0x1F + waitforvisualfinish + launchtemplate gBowMonSpriteTemplate 0x2 0x1 0x0 + playsewithpan SE_W029, SOUND_PAN_ATTACKER + waitforvisualfinish + delay 0x2 + launchtemplate gBowMonSpriteTemplate 0x2 0x1 0x1 + delay 0x2 + loopsewithpan SE_W030, 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 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 SIDE_TARGET + monbgprio_2A 0x1 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 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 SIDE_TARGET + delay 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xC 0x0 0x2002 + waitforvisualfinish + end +ClangingScalesMetalSound: + panse_1B SE_W103, 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_W207, SOUND_PAN_TARGET + launchtemplate gBounceBallLandSpriteTemplate 0x83 0x0 + delay 0x2 + launchtask AnimTask_SquishTarget 0x2 0x0 + delay 0x5 + playsewithpan SE_W025B, SOUND_PAN_TARGET + launchtemplate gOctazookaSmokeSpriteTemplate 0x84 0x8 0x8 0x1 0x0 + delay 0x2 + launchtemplate gOctazookaSmokeSpriteTemplate 0x80 4 0xfff8 0xfff8 0x1 0x0 + delay 0x2 + launchtemplate gOctazookaSmokeSpriteTemplate 0x80 4 0x8 0xfff8 0x1 0x0 + delay 0x2 + launchtemplate gOctazookaSmokeSpriteTemplate 0x80 4 0xfff8 0x8 0x1 0x0 + delay 0x2 + launchtemplate gOctazookaSmokeSpriteTemplate 0x80 4 0x8 0x8 0x1 0x0 + delay 0x2 + launchtemplate gOctazookaSmokeSpriteTemplate 0x80 4 0xfff8 0xfff8 0x1 0x0 + delay 0x2 + launchtemplate gOctazookaSmokeSpriteTemplate 0x80 4 0x8 0xfff8 0x1 0x0 + delay 0x2 + launchtemplate gOctazookaSmokeSpriteTemplate 0x80 4 0xfff8 0x8 0x1 0x0 + 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_W036, 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_W004, 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_W004, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gBrutalSwingRandomImpactTemplate 0x83 0x2 0x1 0x1 + playsewithpan SE_W004, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gBrutalSwingBasicImpactTemplate 0x83 0x4 0x20 0x14 0x1 0x1 + playsewithpan SE_W004, 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 SIDE_ATTACKER + setalpha 8, 8 + playsewithpan SE_W208, SOUND_PAN_ATTACKER + launchtemplate gAuroraVeilRingTemplate 0x2 0x0 + delay 0x4 + launchtemplate gAuroraVeilRingTemplate 0x2 0x0 + delay 0x4 + launchtemplate gAuroraVeilRingTemplate 0x2 0x0 + waitforvisualfinish + playsewithpan SE_REAPOKE, SOUND_PAN_ATTACKER + launchtask AnimTask_BlendColorCycle 0x2 0x6 0xa 0x0 0x2 0x0 0xa 0x7fff + waitforvisualfinish + call UnsetPsychicBg + waitforvisualfinish + clearmonbg SIDE_ATTACKER + 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_W007, 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_W115, 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_W172, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x4 + launchtemplate gShellTrapRedImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x8 + launchtemplate gShellTrapRedImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0xc + launchtemplate gShellTrapRedImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x10 + launchtemplate gShellTrapRedImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x14 + launchtemplate gShellTrapRedImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x18 + launchtemplate gShellTrapRedImpactTemplate 0x2 0x4 0x0 0x0 0x0 0x2 + playsewithpan SE_W172, 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_W172, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x3 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x3 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x3 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x3 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x3 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x3 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x3 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x3 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x3 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x3 + playsewithpan SE_W172, SOUND_PAN_ATTACKER + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 + delay 0x3 + playsewithpan SE_W172, 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_W172, 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_W172, 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_W172, 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_W172, 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_W172, 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_W172, 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_W172, 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 PAL_BG 0x1 0x0 0xF 0x7440 + waitforvisualfinish + panse_1B SE_W076, 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 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_W044, 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_W044, 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_W048, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + call UnsetPsychicBg + end +PsychicFangsDestroyWall: + launchtemplate gBrickBreakWallSpriteTemplate 0x3 0x5 0x1 0x0 0x0 0x21 0xa + playsewithpan SE_W044, 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_W044, 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_W280, 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_W088, 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_W088, 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_W088, 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 SIDE_TARGET + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + playsewithpan SE_W155, 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_W233B, SOUND_PAN_TARGET + waitforvisualfinish + launchtask AnimTask_NightmareClone 0x2 0x0 + launchtask AnimTask_ShakeMon 0x2 0x5 0x1 0x3 0x0 0x28 0x1 + playsewithpan SE_W171, SOUND_PAN_TARGET + waitforvisualfinish + restorebg + waitbgfadein + clearmonbg 0x3 + blendoff + end + + +Move_ACCELEROCK:: + loadspritegfx ANIM_TAG_ROCKS + loadspritegfx ANIM_TAG_IMPACT + monbg SIDE_ATTACKER + setalpha 12, 8 + launchtask AnimTask_TranslateMonEllipticalRespectSide 0x2 0x5 0x0 0x18 0x6 0x1 0x5 + launchtask AnimTask_TraceMonBlended 0x2 0x4 0x0 0x4 0x7 0x3 + playsewithpan SE_W026, 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_W233B, 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 SIDE_ATTACKER + 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_W104, SOUND_PAN_TARGET + waitforvisualfinish + call RisingWaterHitEffect + waitforvisualfinish + clearmonbg SIDE_TARGET + 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 PAL_BG 0x1 0x0 0x10 0x0 + playsewithpan SE_ELEBETA, SOUND_PAN_ATTACKER + launchtemplate gPrismaticLaserChargeTemplate 0x2 0x1 0x0 + call PrismaticLaserInwardSpikes + playsewithpan SE_ELEBETA, SOUND_PAN_ATTACKER + call PrismaticLaserInwardSpikes + playsewithpan SE_ELEBETA, SOUND_PAN_ATTACKER + call PrismaticLaserInwardSpikes + playsewithpan SE_ELEBETA, SOUND_PAN_ATTACKER + call PrismaticLaserInwardSpikes + playsewithpan SE_ELEBETA, 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_W076, SOUND_PAN_ATTACKER + call PrismaticLaserRain + call PrismaticLaserRain + call PrismaticLaserRain + call PrismaticLaserRain + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 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_W054, 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_W054, 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_W120, 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_W060, 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_W060, 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_W003, 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_W003, 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_W003, 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_W003, 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_W003, 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_W003, 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_W003, 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_W107, SOUND_PAN_TARGET, SOUND_PAN_ATTACKER, 0xfd, 0x0 + delay 0xf + launchtemplate gSpectralThiefBlackOrbsTemplate 0x82 0x2 0xfff4 0x18 + delay 0xB + setarg 0x7 0xffff + waitforvisualfinish + playsewithpan SE_W082, 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_W104, 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_TAMA, SOUND_PAN_ATTACKER + createvisualtask AnimTask_BlendBattleAnimPal, 10, (PAL_BG | 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_W025B, 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_W007, SOUND_PAN_TARGET + waitforvisualfinish + visible ANIM_ATTACKER + createvisualtask AnimTask_BlendBattleAnimPal, 10, (PAL_BG | 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 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_W025, 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 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 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 SIDE_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x5 0x7DE0 + waitforvisualfinish + playsewithpan SE_W109, SOUND_PAN_TARGET + launchtemplate gOpeningEyeSpriteTemplate 0x5 0x4 0x0 0x0 0x1 0x0 + delay 0x35 + loopsewithpan SE_W039, 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 PAL_BG 0x1 0x5 0x0 0x7DE0 + waitforvisualfinish + clearmonbg SIDE_TARGET + 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_W026, 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_W085B, 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_W085B, 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_W215, 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_W215, SOUND_PAN_ATTACKER + delay 0xe + launchtemplate gNaturesMadnessGrayRingTemplate 0x28 0x4 0x0 0x0 0x1 0x0 + playsewithpan SE_W215, SOUND_PAN_ATTACKER + delay 0xe + launchtemplate gNaturesMadnessGrayRingTemplate 0x28 0x4 0x0 0x0 0x1 0x0 + playsewithpan SE_W215, SOUND_PAN_ATTACKER + waitforvisualfinish + playsewithpan SE_W153, 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 PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + playsewithpan SE_W082, SOUND_PAN_ATTACKER + call MultiAttackBuff + delay 0x8 + launchtask AnimTask_BlendColorCycle 0x2 0x6 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_W013, 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 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 PAL_BG 0x1 0x0 0xC 0x0 + waitforvisualfinish + playsewithpan SE_RU_HYUU, 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_W153, 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 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 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 PAL_BG 0x1 0xC 0x0 0x0 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end +PlasmaFistSpark1: + playsewithpan SE_W268, SOUND_PAN_ATTACKER + launchtask AnimTask_BlendColorCycle 0x2 0x6 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_W268, 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_W004, 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_W161B, 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 PAL_BG 0x1 0x0 0xF 0x0 + clearmonbg ANIM_ATTACKER + playsewithpan SE_W086, 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_W153, 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 PAL_DEF 0x6 0x0 0x10 0x43FF @Light yellow + launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x4 0x0 0x60 0x1 + panse_1B SE_W076, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 + call PhotonGeyserBeam + waitforvisualfinish + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x1 0x10 0x0 0x43FF @Light yellow + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xF 0x0 0x0 + waitforvisualfinish + clearmonbg ANIM_TARGET + blendoff + end +PhotonGeyserSparks1: + playsewithpan SE_W268, 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_W268, 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_W231, SOUND_PAN_ATTACKER, 0x1c, 0x2 + launchtask AnimTask_MetallicShine 0x5 0x3 0x0 0x0 0x0 + waitforvisualfinish + monbg SIDE_TARGET + monbgprio_28 ANIM_TARGET + setalpha 12, 8 + loopsewithpan SE_W017, 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_W013, SOUND_PAN_TARGET + waitforvisualfinish + launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_ATTACKER 0x0 0xb + waitforvisualfinish + delay 0x3 + launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_TARGET 0x0 0x7 + clearmonbg SIDE_TARGET + 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 PAL_BG 0 0 16, 0 @;Black + waitforvisualfinish + launchtemplate gLeerSpriteTemplate 0x82, 2 0x18 -12 + playsewithpan SE_W197, SOUND_PAN_ATTACKER + waitforvisualfinish + delay 0x20 + playsewithpan SE_W202, 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 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 PAL_BG 0x1 0x0 0x7 0x0 @Black + waitforvisualfinish + playsewithpan SE_W044, 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 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_W118, 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_REAPOKE, 0xc0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 0x2 0x3 0x7 0x0 0x67f1 + launchtemplate gThinRingExpandingSpriteTemplate 3 0x4 0x0 0x0 0x0 0x0 + waitforvisualfinish + end +BitePlayer: + playsewithpan SE_W044, 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_W044, 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_W172, 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_W145C, SOUND_PAN_ATTACKER + delay 0x5 + launchtemplate gAppleAcidLaunchTemplate 0x82, 0x6 0x14 0x0 0x28 0x1 0xffe8 0x0 + playsewithpan SE_W145C, SOUND_PAN_ATTACKER + delay 0xf + launchtask AnimTask_ShakeMon2 0x5 0x5 ANIM_TARGET 0x2 0x0 0xa 0x1 + launchtask AnimTask_BlendColorCycle 0x2 0x6 PAL_DEF 0x2 0x2 0x0 0x10 0x0 @;Black + launchtemplate gAppleAcidDripTemplate 0x82, 0x5 0xffe6 0xffe8 0x0 0xf 0x37 + playsewithpan SE_W145, SOUND_PAN_TARGET + delay 0xa + launchtemplate gAppleAcidDripTemplate 0x82, 0x5 0xf 0xffe5 0x0 0xC 0x32 + playsewithpan SE_W145, SOUND_PAN_TARGET + delay 0xa + launchtemplate gAppleAcidDripTemplate 0x82, 0x5 0xfff1 0xffef 0x0 0xa 0x2d + playsewithpan SE_W145 SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg ANIM_TARGET + end + + +Move_MAGIC_POWDER:: + loadspritegfx ANIM_TAG_POISON_POWDER + loadspritegfx ANIM_TAG_WATER_GUN + loopsewithpan SE_W234, 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_W048, 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_RU_HYUU, SOUND_PAN_ATTACKER + launchtemplate gDreepyMissileTemplate 0x82, 0x3, 0x0 0x0 0x19 + delay 0x19 + playsewithpan SE_W120, 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_W010, 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 PAL_DEF 0x2 0x2 0x0 0x8 0x1f + playsewithpan SE_W020, 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 gHealingBlueStarSpriteTemplate 0x84 0x3 0x8 0x8 0xa + waitforvisualfinish + launchtemplate gFlashingHitSplatSpriteTemplate 0x83 0x4 0x0 0x0 0x1 0x1 + playsewithpan SE_W030, 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_W085B, 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_W085B, 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_W085B, 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_W127, 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, RIGHT_FIST, 1 + createsprite gClangorousSoulRedFistTemplate, ANIM_ATTACKER, 2, 0x10, 0, 0, 0, 10, ANIM_ATTACKER, LEFT_FIST, 1 + playsewithpan SE_W233B, SOUND_PAN_TARGET + waitforvisualfinish + loadspritegfx ANIM_TAG_THIN_RING @ring + playsewithpan SE_REAPOKE, SOUND_PAN_ATTACKER + launchtemplate gClangorousSoulRedRingTemplate 0x3 0x4 0x0 0x0 0x0 0x0 + waitforvisualfinish + end +ClangorousSoulStarBuffEffect: + playsewithpan SE_W082, 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_W036, 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_W107, 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_W187, SOUND_PAN_ATTACKER + delay 0xf + call BellyDrumLeft + launchtemplate gSlowFlyingMusicNotesSpriteTemplate 0x2 0x4 0x1 0x1 0x1 0x0 + playsewithpan SE_W187, SOUND_PAN_ATTACKER + delay 0xf + call BellyDrumRight + launchtemplate gSlowFlyingMusicNotesSpriteTemplate 0x2 0x4 0x0 0x3 0x3 0x80 + playsewithpan SE_W187, SOUND_PAN_ATTACKER + delay 0x7 + call BellyDrumLeft + launchtemplate gSlowFlyingMusicNotesSpriteTemplate 0x2 0x4 0x1 0x2 0x0 0x80 + playsewithpan SE_W187, SOUND_PAN_ATTACKER + delay 0x7 + call BellyDrumRight + launchtemplate gSlowFlyingMusicNotesSpriteTemplate 0x2 0x4 0x0 0x1 0x1 0x0 + playsewithpan SE_W187, SOUND_PAN_ATTACKER + delay 0x7 + call BellyDrumLeft + launchtemplate gSlowFlyingMusicNotesSpriteTemplate 0x2 0x4 0x1 0x0 0x3 0x0 + playsewithpan SE_W187, SOUND_PAN_ATTACKER + launchtemplate gFrenzyPlantRootSpriteTemplate 0x2 0x6 0x55 0x10 0x6 0x0 0x3 0x50 + playsewithpan SE_W010, SOUND_PAN_TARGET + delay 0x5 + launchtemplate gFrenzyPlantRootSpriteTemplate 0x2 0x6 0x55 0xfff0 0xfffa 0x0 0x2 0x4b + playsewithpan SE_W010, SOUND_PAN_TARGET + delay 0x5 + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0xfff6 0xfff6 0x1 0x3 + playsewithpan SE_W003, 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_W003, SOUND_PAN_TARGET + delay 0x3 + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0xa 0xfffd 0x1 0x2 + playsewithpan SE_W003, SOUND_PAN_TARGET + delay 0x3 + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0xfffd 0x1 0x1 0x2 + playsewithpan SE_W003, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0xfff6 0x1 0x1 0x1 + playsewithpan SE_W003, SOUND_PAN_TARGET + delay 0x2 + launchtemplate gBasicHitSplatSpriteTemplate 0x2 0x4 0x0 0xa 0x1 0x1 + playsewithpan SE_W003, 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_DANSA, SOUND_PAN_ATTACKER @;Hop + launchtemplate gPyroBallRockTemplate, 2, 0x3, 0, 0, 0 + delay 0x19 + playsewithpan SE_DANSA, SOUND_PAN_ATTACKER @;Hop + delay 0x19 + playsewithpan SE_W172, SOUND_PAN_TARGET + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x3 0x0 0x7 0x043D + launchtemplate gPyroBallBurningRockTemplate, 2, 0x3, 0, 0, 0 + delay 0x19 + playsewithpan SE_W172, SOUND_PAN_TARGET + delay 0x19 + playsewithpan SE_W172, SOUND_PAN_TARGET + launchtemplate gPyroBallFlamesUpTemplate, 2, 0x3, 0, 0, 1 + delay 0x19 + playsewithpan SE_W172B, SOUND_PAN_TARGET + launchtemplate gPyroBallEmberBallTemplate, 2, 0x6, 0, 10, 0, 5, 20, -20 + waitforvisualfinish + launchtask AnimTask_BlendColorCycle 0x2 0x6 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 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 SIDE_TARGET + monbgprio_2A 0x1 + launchtemplate gAuraWheelBlueElectricityTemplate 3, 0x4 0x0 0x0 0x38 0x0 + playsewithpan SE_W085B, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gAuraWheelRedElectricityTemplate 3, 0x4 0x0 0x0 0x38 0x4 + playsewithpan SE_W085B, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gAuraWheelBlueElectricityTemplate 3, 0x4 0x0 0x0 0x38 0x8 + playsewithpan SE_W085B, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gAuraWheelRedElectricityTemplate 3, 0x4 0x0 0x0 0x38 0xc + playsewithpan SE_W085B, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gAuraWheelBlueElectricityTemplate 3, 0x4 0x0 0x0 0x38 0x10 + playsewithpan SE_W085B, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gAuraWheelRedElectricityTemplate 3, 0x4 0x0 0x0 0x38 0x14 + playsewithpan SE_W085B, SOUND_PAN_ATTACKER + delay 0x2 + launchtemplate gAuraWheelBlueElectricityTemplate 3, 0x4 0x0 0x0 0x38 0x18 + playsewithpan SE_W085B, SOUND_PAN_ATTACKER + waitforvisualfinish + launchtemplate gSlideMonToOffsetSpriteTemplate 2, 0x5 0x0 0x18 0x0 0x0 0x6 + delay 0x4 + playsewithpan SE_W161B, 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 SIDE_TARGET + 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_W004, 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_W004, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gRandomPosHitSplatSpriteTemplate 0x83 0x2 0x1 0x1 + launchtemplate gBreakingSwipeCenteredElectricity 0x82, 0x4, 0xfff8 0x8 0x5 0x2 + playsewithpan SE_W004, SOUND_PAN_TARGET + delay 0x4 + launchtemplate gBasicHitSplatSpriteTemplate 0x83 0x4 0x20 0x14 0x1 0x1 + launchtemplate gBreakingSwipeCenteredElectricity 0x82, 0x4, 0xffec 0xf 0x5 0x1 + playsewithpan SE_W004, SOUND_PAN_TARGET + waitsound + waitforvisualfinish + blendoff + clearmonbg ANIM_TARGET + end + + +Move_BRANCH_POKE:: + loadspritegfx ANIM_TAG_BRANCH + loadspritegfx ANIM_TAG_IMPACT + playsewithpan SE_W029, 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_W030, 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_W085, 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_W118, 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_W145C, SOUND_PAN_ATTACKER + delay 0x5 + launchtemplate gAppleAcidLaunchTemplate 0x82, 0x6 0x14 0x0 0x28 0x1 0x18 0x0 + playsewithpan SE_W145C, SOUND_PAN_ATTACKER + delay 0x5 + launchtemplate gAppleAcidLaunchTemplate 0x82, 0x6 0x14 0x0 0x28 0x1 0xffe8 0x0 + playsewithpan SE_W145C, 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_W145, SOUND_PAN_TARGET + delay 0xa + launchtemplate gAppleAcidDripTemplate 0x82, 0x5 0xffe6 0xffe8 0x0 0xf 0x37 + playsewithpan SE_W145, SOUND_PAN_TARGET + delay 0xa + launchtemplate gAppleAcidDripTemplate 0x82, 0x5 0xf 0xffe5 0x0 0xf 0x32 + playsewithpan SE_W145, SOUND_PAN_TARGET + delay 0xa + launchtemplate gAppleAcidDripTemplate 0x82, 0x5 0xfff1 0xffef 0x0 0xa 0x2d + playsewithpan SE_W145, SOUND_PAN_TARGET + delay 0xa + launchtemplate gAppleAcidDripTemplate 0x82, 0x5 0x1b 0xffea 0x0 0xf 0x32 + playsewithpan SE_W145, 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_W070, 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_RU_HYUU, SOUND_PAN_ATTACKER @;Falling sound + delay 0x2 + launchtemplate gGravAppleSmallApple, 0x82, 0x4, -30, 0x44, 4, ANIM_TARGET + playsewithpan SE_RU_HYUU, SOUND_PAN_ATTACKER @;Falling sound + delay 0x2 + launchtemplate gGravAppleSmallApple, 0x82, 0x4, 27, 0x37, 4, ANIM_TARGET + playsewithpan SE_RU_HYUU, SOUND_PAN_ATTACKER @;Falling sound + delay 0x2 + launchtemplate gGravAppleSmallApple, 0x82, 0x4, -20, 0x32, 4, ANIM_TARGET + playsewithpan SE_RU_HYUU, SOUND_PAN_ATTACKER @;Falling sound + delay 0x2 + launchtemplate gGravAppleSmallApple, 0x82, 0x4, 33, 0x3a, 4, ANIM_TARGET + playsewithpan SE_RU_HYUU, SOUND_PAN_ATTACKER @;Falling sound + delay 0x2 + launchtemplate gGravAppleSmallApple, 0x82, 0x4, -12, 0x3a, 4, ANIM_TARGET + playsewithpan SE_RU_HYUU, SOUND_PAN_ATTACKER @;Falling sound + delay 0x2 + launchtemplate gGravAppleSmallApple, 0x82, 0x4, 19, 0x3c, 4, ANIM_TARGET + playsewithpan SE_RU_HYUU, SOUND_PAN_ATTACKER @;Falling sound + delay 0x2 + launchtemplate gGravAppleSmallApple, 0x82, 0x4, -38, 0x3a, 4, ANIM_TARGET + playsewithpan SE_RU_HYUU, SOUND_PAN_ATTACKER @;Falling sound + delay 0x2 + launchtemplate gGravAppleSmallApple, 0x82, 0x4, 5, 0x3c, 4, ANIM_TARGET + playsewithpan SE_RU_HYUU, SOUND_PAN_ATTACKER @;Falling sound + delay 0x2 + launchtemplate gGravAppleSmallApple, 0x82, 0x4, -23, 0x28, 4, ANIM_TARGET + playsewithpan SE_RU_HYUU, 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 SIDE_TARGET + monbgprio_28 ANIM_TARGET + loopsewithpan SE_W172, 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 SIDE_TARGET + 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 SIDE_ATTACKER + launchtemplate gLifeDewDropletTemplate, 2, 0x3, 0, 0, ANIM_ATTACKER + launchtemplate gLifeDewDropletTemplate, 2, 0x3, 0, 0, ANIM_ATK_PARTNER + delay 0x15 + playsewithpan SE_W145, SOUND_PAN_ATTACKER + waitforvisualfinish + playsewithpan SE_W071B, 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 SIDE_ATTACKER + 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 SIDE_ATTACKER + monbgprio_28 ANIM_ATTACKER + waitplaysewithpan SE_W115, SOUND_PAN_ATTACKER, 0x10 + launchtemplate gProtectSpriteTemplate, 2, 0x3 0x18 0x0 0x5a @;Protect + waitforvisualfinish + launchtemplate gObstructCrossTemplate, 2, 0x4 0x0 0x0 0x1 0x24 + playsewithpan SE_W043, SOUND_PAN_TARGET + waitforvisualfinish + clearmonbg SIDE_ATTACKER + 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, PAL_ATK, 1, 0, 9, 0x0B1D @Light orange + launchtask AnimTask_ElectricChargingParticles 0x2 0x4 0x0 0x30 0x0 0x4 + playsewithpan SE_W268, SOUND_PAN_ATTACKER + waitforvisualfinish + invisible ANIM_ATTACKER + launchtemplate gGrowingSuperpowerTemplate, 0x83, 0x1 0x0 + playsewithpan SE_W207, SOUND_PAN_ATTACKER + delay 0xF + createvisualtask AnimTask_BlendBattleAnimPal, 10, (PAL_ATK | 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, (PAL_ATK | PAL_BG), 1, 0x10, 0, 0x7FFF @Screen revert from white + waitforvisualfinish + end +BasicExplosion: + playsewithpan SE_W120, SOUND_PAN_TARGET + launchtemplate gExplosionSpriteTemplate, 0x83, 0x4 0x0 0x0 0x1 0x1 + delay 0x3 + playsewithpan SE_W120, SOUND_PAN_TARGET + launchtemplate gExplosionSpriteTemplate, 0x83, 0x4 0x18 0xffe8 0x1 0x1 + delay 0x3 + playsewithpan SE_W120, SOUND_PAN_TARGET + launchtemplate gExplosionSpriteTemplate, 0x83, 0x4 0xfff0 0x10 0x1 0x1 + delay 0x3 + playsewithpan SE_W120, SOUND_PAN_TARGET + launchtemplate gExplosionSpriteTemplate, 0x83, 0x4 0xffe8 0xfff4 0x1 0x1 + delay 0x3 + playsewithpan SE_W120, 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 PAL_BG 0x0 0x0 0x10 0x6B59 @To gray + launchtask AnimTask_ElectricChargingParticles 0x2 0x4 0x0 0x14 0x0 0x2 + playsewithpan SE_W268, SOUND_PAN_ATTACKER + delay 0x14 + loopsewithpan SE_W231, 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 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: @@ -9044,7 +17090,6 @@ Move_FOLLOW_ME: loopsewithpan SE_W039, SOUND_PAN_ATTACKER, 22, 3 end -Move_MAGNETIC_FLUX: Move_CHARGE: loadspritegfx ANIM_TAG_ELECTRIC_ORBS loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @@ -11768,7 +19813,7 @@ Move_CRABHAMMER: end Move_SURF: - createvisualtask AnimTask_CreateSurfWave, 2, FALSE + createvisualtask AnimTask_CreateSurfWave, 2, SURF_PALETTE_SURF delay 24 panse_1B SE_W057, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 waitforvisualfinish @@ -14065,7 +22110,7 @@ ArmThrustLeft: Move_MUDDY_WATER: panse_1B SE_W250, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 - createvisualtask AnimTask_CreateSurfWave, 2, TRUE + createvisualtask AnimTask_CreateSurfWave, 2, SURF_PALETTE_MUDDY_WATER waitforvisualfinish end @@ -15609,6 +23654,7 @@ WaterBubblesEffectLong: ElectricityEffect: playsewithpan SE_W085B, SOUND_PAN_TARGET +ElectricityEffectNoSound: createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 5, 0, 5, 0 delay 2 createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, -5, 10, 5, 1 diff --git a/include/battle_anim.h b/include/battle_anim.h index 5189c82112..ce85a7163f 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); @@ -207,6 +208,10 @@ 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_special.c void sub_8172EF0(u8 battler, struct Pokemon *mon); @@ -225,29 +230,110 @@ 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); @@ -315,4 +401,97 @@ 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 +bool8 IsMoveAnimDarkVoid(void); +bool8 IsMoveAnimFlashCannonOrSteelBeam(void); +bool8 IsMoveAnimCoreEnforcer(void); +bool8 IsMoveAnimAnchorShot(void); +void CoreEnforcerLoadBeamTarget(struct Sprite* sprite); + #endif // GUARD_BATTLE_ANIM_H diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index 0883fafe93..1a4c385047 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -398,6 +398,10 @@ #define ANIM_ATK_PARTNER 2 #define ANIM_DEF_PARTNER 3 +//sides +#define SIDE_ATTACKER 2 +#define SIDE_TARGET 3 + // stereo panning constants [0-255] // // 0 @@ -592,5 +596,29 @@ #define BACK_ANIM_FADE_GREEN_WITH_SHAKE 0x18 #define BACK_ANIM_FADE_BLUE_WITH_SHAKE 0x19 +// mon pal blend +#define PAL_BG 0x1 +#define PAL_ATK 0x2 +#define PAL_DEF 0x4 +#define PAL_ATK_PARTNER 0x8 +#define PAL_DEF_PARTNER 0x10 +#define PAL_ALL 0x1f +#define PAL_BG_4 0x20 +#define PAL_BG_5 0x40 +#define PAL_ALL_BANKS 0x780 +#define PAL_PLAYER1 0x80 +#define PAL_PLAYER2 0x100 +#define PAL_OPPONENT1 0x200 +#define PAL_OPPONENT2 0x400 + +// horseshoe/fist frames +#define RIGHT_FIST 0 +#define LEFT_FIST 2 + +// surf wave palettes +#define SURF_PALETTE_SURF 0 +#define SURF_PALETTE_MUDDY_WATER 1 +#define SURF_PALETTE_SLUDGE_WAVE 2 + #endif // GUARD_CONSTANTS_BATTLE_ANIM_H diff --git a/include/constants/moves.h b/include/constants/moves.h index f425bbeddc..167d4a10b8 100644 --- a/include/constants/moves.h +++ b/include/constants/moves.h @@ -697,6 +697,45 @@ #define MOVES_COUNT_GEN7 677 -#define MOVES_COUNT MOVES_COUNT_GEN7 +// 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_TEA_TIME (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_ETERNA_BEAM (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/ld_script.txt b/ld_script.txt index 2762e22540..454d9c4a07 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -197,6 +197,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); @@ -570,6 +571,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/battle_anim.c b/src/battle_anim.c index 6dee835bee..7ac81cac62 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -108,7 +108,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}; @@ -2175,7 +2175,7 @@ void ClearBattleAnimationVars(void) sMonAnimTaskIdArray[1] = 0xFF; gAnimMoveTurn = 0; sAnimBackgroundFadeState = 0; - sAnimMoveIndex = 0; + gAnimMoveIndex = 0; gBattleAnimAttacker = 0; gBattleAnimTarget = 0; gAnimCustomPanning = 0; @@ -2211,9 +2211,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; diff --git a/src/battle_anim_bug.c b/src/battle_anim_bug.c index 010ddf625d..33d6616a60 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) { @@ -324,7 +320,7 @@ static void AnimStringWrap_Step(struct Sprite *sprite) // arg0: x // arg1: y // arg2: targets both -static void AnimSpiderWeb(struct Sprite *sprite) +void AnimSpiderWeb(struct Sprite *sprite) { SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); @@ -432,7 +428,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); @@ -449,7 +445,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 cd7ac09b72..b203004e1d 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 *); @@ -134,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, @@ -147,7 +144,7 @@ const struct SpriteTemplate gTearDropSpriteTemplate = .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_TearDrop, + .affineAnims = gAffineAnims_TearDrop, .callback = AnimTearDrop, }; @@ -171,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, @@ -182,7 +179,7 @@ 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, @@ -397,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]; @@ -429,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; @@ -883,7 +880,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 172ad4b28c..406902d71d 100644 --- a/src/battle_anim_dragon.c +++ b/src/battle_anim_dragon.c @@ -6,11 +6,7 @@ #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 *); @@ -62,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, @@ -82,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, @@ -93,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, }; @@ -109,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, }; @@ -119,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, @@ -133,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, @@ -151,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, @@ -162,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, }; @@ -371,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) { @@ -391,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); @@ -399,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; @@ -546,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 df9be5738a..d3b2642314 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -18,20 +18,13 @@ EWRAM_DATA s16 gUnknown_0203A0F8[4] = {0}; -static void AnimMovePowderParticle(struct Sprite *); static void AnimMovePowderParticle_Step(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 *); @@ -39,12 +32,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 *); @@ -62,11 +53,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_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 *); @@ -76,7 +65,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 *); @@ -105,11 +93,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 *); @@ -127,11 +113,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 *); @@ -2975,7 +2958,7 @@ static void AnimWoodHammerSmall(struct Sprite *sprite) // 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]; @@ -3030,7 +3013,7 @@ 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]); @@ -3050,11 +3033,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) && IsMoveAnimCoreEnforcer()) + { + 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; @@ -3105,7 +3097,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]; @@ -3124,7 +3116,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(); @@ -3515,7 +3507,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]); @@ -3577,7 +3569,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]; @@ -3615,7 +3607,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]; @@ -3713,7 +3705,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) @@ -3944,7 +3936,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]) { @@ -4795,7 +4787,7 @@ void AnimNeedleArmSpike(struct Sprite* sprite) } } -static void AnimNeedleArmSpike_Step(struct Sprite* sprite) +void AnimNeedleArmSpike_Step(struct Sprite* sprite) { if (sprite->data[0]) { @@ -4862,7 +4854,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); @@ -5198,7 +5190,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); @@ -5847,7 +5839,7 @@ static void AnimFalseSwipeSlice_Step3(struct Sprite* sprite) } } -static void AnimEndureEnergy(struct Sprite* sprite) +void AnimEndureEnergy(struct Sprite* sprite) { if (gBattleAnimArgs[0] == 0) { @@ -5915,7 +5907,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) { @@ -6538,7 +6530,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; @@ -6566,7 +6558,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) @@ -6590,7 +6582,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) diff --git a/src/battle_anim_effects_2.c b/src/battle_anim_effects_2.c index a8b54d41df..6fd10da8cd 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); @@ -1523,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; @@ -2311,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]) @@ -2621,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; @@ -2706,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) @@ -3443,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); @@ -3494,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 7791aac101..731432d96f 100755 --- a/src/battle_anim_effects_3.c +++ b/src/battle_anim_effects_3.c @@ -26,12 +26,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 *); @@ -63,7 +61,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 *); @@ -90,7 +87,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 *); @@ -1224,7 +1220,7 @@ const struct SpriteTemplate gMegaSymbolSpriteTemplate = .callback = AnimGhostStatusSprite, }; -static void AnimBlackSmoke(struct Sprite *sprite) +void AnimBlackSmoke(struct Sprite *sprite) { sprite->pos1.x += gBattleAnimArgs[0]; sprite->pos1.y += gBattleAnimArgs[1]; @@ -1289,7 +1285,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); @@ -2843,7 +2839,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) { @@ -4855,7 +4851,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 b49427bc79..c0f489fd8f 100644 --- a/src/battle_anim_electric.c +++ b/src/battle_anim_electric.c @@ -10,28 +10,21 @@ 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 +137,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 +149,7 @@ const struct SpriteTemplate gZapCannonSparkSpriteTemplate = .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_FlashingSpark, + .affineAnims = gAffineAnims_FlashingSpark, .callback = AnimZapCannonSpark, }; @@ -168,7 +161,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 +184,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 +197,7 @@ const struct SpriteTemplate gSparkElectricityFlashingSpriteTemplate = .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_FlashingSpark, + .affineAnims = gAffineAnims_FlashingSpark, .callback = AnimSparkElectricityFlashing, }; @@ -241,6 +234,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 +283,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 +294,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,7 +341,7 @@ static const union AffineAnimCmd sAffineAnim_GrowingElectricOrb_2[] = AFFINEANIMCMD_END, }; -static const union AffineAnimCmd *const sAffineAnims_GrowingElectricOrb[] = +const union AffineAnimCmd *const gAffineAnims_GrowingElectricOrb[] = { sAffineAnim_GrowingElectricOrb_0, sAffineAnim_GrowingElectricOrb_1, @@ -340,7 +355,7 @@ const struct SpriteTemplate gGrowingChargeOrbSpriteTemplate = .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_GrowingElectricOrb, + .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingChargeOrb, }; @@ -353,7 +368,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 +378,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 +391,7 @@ const struct SpriteTemplate gVoltTackleOrbSlideSpriteTemplate = .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_GrowingElectricOrb, + .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimVoltTackleOrbSlide, }; @@ -441,7 +456,7 @@ const struct SpriteTemplate gGrowingShockWaveOrbSpriteTemplate = .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_GrowingElectricOrb, + .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingShockWaveOrb, }; @@ -463,7 +478,7 @@ const struct SpriteTemplate gFlashCannonGrayChargeTemplate = .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_GrowingElectricOrb, + .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingChargeOrb }; @@ -499,7 +514,7 @@ const struct SpriteTemplate gSeedFlareGreenChargeTemplate = .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_GrowingElectricOrb, + .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingChargeOrb }; @@ -560,7 +575,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; @@ -617,7 +632,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]; @@ -672,7 +687,7 @@ static void AnimThunderboltOrb(struct Sprite *sprite) sprite->callback = AnimThunderboltOrb_Step; } -static void AnimSparkElectricityFlashing(struct Sprite *sprite) +void AnimSparkElectricityFlashing(struct Sprite *sprite) { u8 battler; @@ -822,13 +837,17 @@ 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 (IsMoveAnimAnchorShot()) + spriteId = CreateSprite(&gAnchorShotChainTemplate, sprite->pos1.x + 32, sprite->pos1.y, sprite->subpriority); + else + spriteId = CreateSprite(&gThunderWaveSpriteTemplate, sprite->pos1.x + 32, sprite->pos1.y, sprite->subpriority); + gSprites[spriteId].oam.tileNum += 8; gAnimVisualTaskCount++; gSprites[spriteId].callback = AnimThunderWave_Step; @@ -884,7 +903,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 (IsMoveAnimFlashCannonOrSteelBeam()) + 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]; @@ -936,7 +959,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) { @@ -954,7 +977,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) { @@ -1174,7 +1197,7 @@ static void AnimVoltTackleBolt(struct Sprite *sprite) } } -static void AnimGrowingShockWaveOrb(struct Sprite *sprite) +void AnimGrowingShockWaveOrb(struct Sprite *sprite) { switch (sprite->data[0]) { diff --git a/src/battle_anim_fight.c b/src/battle_anim_fight.c index fc692f164a..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,7 @@ 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; @@ -82,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, }; @@ -104,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, @@ -115,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, @@ -126,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, @@ -137,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, @@ -172,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, }; @@ -183,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, }; @@ -196,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, }; @@ -206,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, }; @@ -308,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, @@ -377,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, @@ -389,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, @@ -412,7 +404,7 @@ 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, @@ -423,7 +415,7 @@ const struct SpriteTemplate gPalmSpriteTemplate = .tileTag = ANIM_TAG_PURPLE_HAND_OUTLINE, .paletteTag = ANIM_TAG_PURPLE_HAND_OUTLINE, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sAnims_HandOrFoot, + .anims = gAnims_HandOrFoot, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimBasicFistOrFoot, @@ -520,7 +512,7 @@ static void AnimSlideHandOrFootToTarget(struct Sprite *sprite) AnimTravelDiagonally(sprite); } -static void AnimJumpKick(struct Sprite *sprite) +void AnimJumpKick(struct Sprite *sprite) { if (IsContest()) { @@ -538,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]); @@ -698,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]); @@ -708,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; @@ -722,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]; @@ -751,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) { @@ -799,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]) { @@ -1050,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 606f498d4c..1d240d0045 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); @@ -313,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, }; @@ -342,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, @@ -565,7 +563,7 @@ 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]); @@ -824,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); diff --git a/src/battle_anim_flying.c b/src/battle_anim_flying.c index 29043b9371..cc64bf60c2 100644 --- a/src/battle_anim_flying.c +++ b/src/battle_anim_flying.c @@ -12,10 +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 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 *); @@ -104,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, }; @@ -121,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, @@ -134,7 +130,7 @@ const struct SpriteTemplate gFlyBallUpSpriteTemplate = .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_FlyBallUp, + .affineAnims = gAffineAnims_FlyBallUp, .callback = AnimFlyBallUp, }; @@ -145,7 +141,7 @@ const struct SpriteTemplate gFlyBallAttackSpriteTemplate = .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_FlyBallAttack, + .affineAnims = gAffineAnims_FlyBallAttack, .callback = AnimFlyBallAttack, }; @@ -464,7 +460,7 @@ 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]; @@ -473,7 +469,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) { @@ -489,7 +485,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) { @@ -514,7 +510,7 @@ static void AnimFlyBallAttack(struct Sprite *sprite) sprite->callback = AnimFlyBallAttack_Step; } -static void AnimFlyBallAttack_Step(struct Sprite *sprite) +void AnimFlyBallAttack_Step(struct Sprite *sprite) { sprite->data[0] = 1; AnimTranslateLinear(sprite); diff --git a/src/battle_anim_ghost.c b/src/battle_anim_ghost.c index 273fdf38a4..cfae013275 100644 --- a/src/battle_anim_ghost.c +++ b/src/battle_anim_ghost.c @@ -18,7 +18,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 *); @@ -36,7 +35,6 @@ static void AnimCurseNail_Step1(struct Sprite *); static void AnimCurseNail_Step2(struct Sprite *); static void AnimCurseNail_End(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 *); @@ -81,7 +79,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, }; @@ -93,7 +91,7 @@ const struct SpriteTemplate gShadowBallSpriteTemplate = .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_ShadowBall, + .affineAnims = gAffineAnims_ShadowBall, .callback = AnimShadowBall, }; @@ -104,7 +102,7 @@ const struct SpriteTemplate gEnergyBallSpriteTemplate = .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_ShadowBall, + .affineAnims = gAffineAnims_ShadowBall, .callback = AnimShadowBall, }; @@ -179,6 +177,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, @@ -256,7 +265,7 @@ const struct SpriteTemplate gFlashCannonBallMovementTemplate = .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_ShadowBall, + .affineAnims = gAffineAnims_ShadowBall, .callback = AnimShadowBall }; @@ -443,7 +452,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; @@ -865,7 +874,11 @@ void AnimTask_DestinyBondWhiteShadow(u8 taskId) && battler != (gBattleAnimAttacker ^ 2) && IsBattlerSpriteVisible(battler)) { - spriteId = CreateSprite(&gDestinyBondWhiteShadowSpriteTemplate, baseX, baseY, 55); + if (IsMoveAnimDarkVoid()) + 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); @@ -887,7 +900,11 @@ void AnimTask_DestinyBondWhiteShadow(u8 taskId) } else { - spriteId = CreateSprite(&gDestinyBondWhiteShadowSpriteTemplate, baseX, baseY, 55); + if (IsMoveAnimDarkVoid()) + spriteId = CreateSprite(&gDarkVoidBlackHoleTemplate, baseX, baseY, 55); //dark void + else + spriteId = CreateSprite(&gDestinyBondWhiteShadowSpriteTemplate, baseX, baseY, 55); //destiny bond + if (spriteId != MAX_SPRITES) { x = 48; @@ -1237,7 +1254,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 937ba37d91..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, }; @@ -222,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; @@ -251,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) @@ -270,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) { diff --git a/src/battle_anim_ice.c b/src/battle_anim_ice.c index ea46092d9a..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 *); @@ -118,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, }; @@ -128,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, }; @@ -159,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, @@ -192,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, @@ -217,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, }; @@ -227,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, }; @@ -240,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, }; @@ -249,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, @@ -260,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, @@ -271,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, @@ -458,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, @@ -508,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, @@ -568,7 +564,7 @@ const struct SpriteTemplate gChatterSingNotesTemplate = .oam = &gOamData_AffineDouble_ObjNormal_16x16, .anims = gMusicNotesAnimTable, .images = NULL, - .affineAnims = sAffineAnims_IceCrystalHit, + .affineAnims = gAffineAnims_IceCrystalHit, .callback = AnimIceEffectParticle }; @@ -710,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) { @@ -801,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; @@ -865,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]; @@ -1167,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_new.c b/src/battle_anim_new.c new file mode 100644 index 0000000000..da741a94c8 --- /dev/null +++ b/src/battle_anim_new.c @@ -0,0 +1,5058 @@ +#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" + +// defines +#define PARTNER(battler) (battler ^ BIT_FLANK) + +//// 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 = PARTNER(gBattleAnimAttacker); + break; + case 3: + battler = PARTNER(gBattleAnimTarget); + break; + } + } + else + { + if (gBattleAnimArgs[arg] == 0) + battler = gBattleAnimAttacker; + else + battler = gBattleAnimTarget; + } + + return battler; +} + +static u8 GetProperCentredCoord(u8 bank, u8 coordType) +{ + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + return (GetBattlerSpriteCoord2(bank, coordType) + GetBattlerSpriteCoord2(PARTNER(bank), coordType)) / 2; + + return GetBattlerSpriteCoord(bank, 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(PARTNER(gBattleAnimTarget), BATTLER_COORD_X)) / 2; + sprite->pos1.y = (GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y) + + GetBattlerSpriteCoord2(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(PARTNER(gBattleAnimAttacker), BATTLER_COORD_X)) / 2; + sprite->pos1.y = (GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_Y) + + GetBattlerSpriteCoord2(PARTNER(gBattleAnimAttacker), BATTLER_COORD_Y)) / 2; + } + else + { + sprite->pos1.x = (GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_X_2) + + GetBattlerSpriteCoord2(PARTNER(gBattleAnimAttacker), BATTLER_COORD_X_2)) / 2; + sprite->pos1.y = (GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + + GetBattlerSpriteCoord2(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(PARTNER(gBattleAnimTarget), BATTLER_COORD_X_2)) / 2; + + + sprite->data[4] = (GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + + GetBattlerSpriteCoord(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 bank +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 bank +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: bank +//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 AnimTask_IsTargetPartner(u8 taskId) +{ + if (gBattleAnimTarget == PARTNER(gBattleAnimAttacker)) + gBattleAnimArgs[0] = 1; + else + gBattleAnimArgs[0] = 0; + + DestroyAnimVisualTask(taskId); +} + +void AnimTask_AllBanksInvisible(u8 taskId) +{ + int i; + u8 spriteId; + + for (i = 0; i < gBattlersCount; ++i) + { + spriteId = gBattlerSpriteIds[i]; + if (spriteId != 0xFF) + gSprites[spriteId].invisible = TRUE; + } + + DestroyAnimVisualTask(taskId); +} + +void AnimTask_AllBanksVisible(u8 taskId) +{ + int i; + u8 spriteId; + + for (i = 0; i < gBattlersCount; ++i) + { + spriteId = gBattlerSpriteIds[i]; + if (spriteId != 0xFF) + gSprites[spriteId].invisible = FALSE; + } + + DestroyAnimVisualTask(taskId); +} + +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(PARTNER(gBattleAnimTarget), BATTLER_COORD_X_2)) / 2; + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = (GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + + GetBattlerSpriteCoord(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); +} + +// move checks +bool8 IsMoveAnimDarkVoid(void) +{ + return gAnimMoveIndex == MOVE_DARK_VOID; +} + +bool8 IsMoveAnimFlashCannonOrSteelBeam(void) +{ + return gAnimMoveIndex == MOVE_FLASH_CANNON || gAnimMoveIndex == MOVE_STEEL_BEAM; +} + +bool8 IsMoveAnimCoreEnforcer(void) +{ + return gAnimMoveIndex == MOVE_CORE_ENFORCER; +} + +bool8 IsMoveAnimAnchorShot(void) +{ + return gAnimMoveIndex == MOVE_ANCHOR_SHOT; +} + diff --git a/src/battle_anim_normal.c b/src/battle_anim_normal.c index f1ad164cea..fefa405627 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); @@ -215,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, @@ -230,7 +224,7 @@ const struct SpriteTemplate gBasicHitSplatSpriteTemplate = .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_HitSplat, + .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatBasic, }; @@ -241,7 +235,7 @@ const struct SpriteTemplate gHandleInvertHitSplatSpriteTemplate = .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_HitSplat, + .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatHandleInvert, }; @@ -252,7 +246,7 @@ const struct SpriteTemplate gWaterHitSplatSpriteTemplate = .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_HitSplat, + .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatBasic, }; @@ -263,7 +257,7 @@ const struct SpriteTemplate gRandomPosHitSplatSpriteTemplate = .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_HitSplat, + .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatRandom, }; @@ -274,7 +268,7 @@ const struct SpriteTemplate gMonEdgeHitSplatSpriteTemplate = .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_HitSplat, + .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatOnMonEdge, }; @@ -296,7 +290,7 @@ const struct SpriteTemplate gFlashingHitSplatSpriteTemplate = .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_HitSplat, + .affineAnims = gAffineAnims_HitSplat, .callback = AnimFlashingHitSplat, }; @@ -307,7 +301,7 @@ const struct SpriteTemplate gPersistHitSplatSpriteTemplate = .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_HitSplat, + .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatPersistent, }; @@ -1015,7 +1009,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) @@ -1051,7 +1045,7 @@ static void AnimHitSplatHandleInvert(struct Sprite *sprite) AnimHitSplatBasic(sprite); } -static void AnimHitSplatRandom(struct Sprite *sprite) +void AnimHitSplatRandom(struct Sprite *sprite) { if (gBattleAnimArgs[1] == -1) gBattleAnimArgs[1] = Random2() & 3; @@ -1069,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; @@ -1081,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); @@ -1093,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) @@ -1104,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 cda06738ed..0972c9bff2 100644 --- a/src/battle_anim_poison.c +++ b/src/battle_anim_poison.c @@ -6,7 +6,6 @@ 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_Step(struct Sprite *); static void AnimAcidPoisonDroplet(struct Sprite *); static void AnimBubbleEffect(struct Sprite *); @@ -60,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, }; @@ -104,7 +103,7 @@ 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 = gAffineAnims_PoisonProjectile, .callback = AnimSludgeProjectile, @@ -115,7 +114,7 @@ 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 = gAffineAnims_PoisonProjectile, .callback = AnimAcidPoisonBubble, @@ -149,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, @@ -172,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, @@ -194,7 +193,7 @@ const struct SpriteTemplate gGreenPoisonDrip = .tileTag = ANIM_TAG_GREEN_POISON_BUBBLE, .paletteTag = ANIM_TAG_GREEN_POISON_BUBBLE, .oam = &gOamData_AffineDouble_ObjNormal_16x16, - .anims = sAnims_AcidPoisonDroplet, + .anims = gAnims_AcidPoisonDroplet, .images = NULL, .affineAnims = gAffineAnims_Droplet, .callback = AnimAcidPoisonDroplet, @@ -205,7 +204,7 @@ const struct SpriteTemplate gGreenPoisonBubble = .tileTag = ANIM_TAG_GREEN_POISON_BUBBLE, .paletteTag = ANIM_TAG_GREEN_POISON_BUBBLE, .oam = &gOamData_AffineDouble_ObjNormal_16x16, - .anims = sAnims_PoisonProjectile, + .anims = gAnims_PoisonProjectile, .images = NULL, .affineAnims = gAffineAnims_PoisonProjectile, .callback = AnimAcidPoisonBubble, @@ -445,7 +444,7 @@ 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); diff --git a/src/battle_anim_psychic.c b/src/battle_anim_psychic.c index 47023d437e..07756de451 100644 --- a/src/battle_anim_psychic.c +++ b/src/battle_anim_psychic.c @@ -21,7 +21,6 @@ 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); @@ -404,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, @@ -417,7 +416,7 @@ const struct SpriteTemplate gPsychoBoostOrbSpriteTemplate = .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sAffineAnims_PsychoBoostOrb, + .affineAnims = gAffineAnims_PsychoBoostOrb, .callback = AnimPsychoBoost, }; @@ -1236,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 22f9f2f8e6..7edef58e85 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,7 +17,6 @@ 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); @@ -96,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, }; @@ -108,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, }; @@ -255,7 +250,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, @@ -268,7 +263,7 @@ const struct SpriteTemplate gRockBlastRockSpriteTemplate = .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = sAnims_BasicRock, .images = NULL, - .affineAnims = sAffineAnims_BasicRock, + .affineAnims = gAffineAnims_BasicRock, .callback = AnimRockBlastRock, }; @@ -279,7 +274,7 @@ const struct SpriteTemplate gRockScatterSpriteTemplate = .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = sAnims_BasicRock, .images = NULL, - .affineAnims = sAffineAnims_BasicRock, + .affineAnims = gAffineAnims_BasicRock, .callback = AnimRockScatter, }; @@ -290,7 +285,7 @@ const struct SpriteTemplate gTwisterRockSpriteTemplate = .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_TwisterRock, .images = NULL, - .affineAnims = sAffineAnims_BasicRock, + .affineAnims = gAffineAnims_BasicRock, .callback = AnimMoveTwisterParticle, }; @@ -301,7 +296,7 @@ const struct SpriteTemplate gWeatherBallRockDownSpriteTemplate = .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = sAnims_WeatherBallRockDown, .images = NULL, - .affineAnims = sAffineAnims_BasicRock, + .affineAnims = gAffineAnims_BasicRock, .callback = AnimWeatherBallDown, }; @@ -404,7 +399,7 @@ static void AnimStealthRockStep2(struct Sprite *sprite) DestroyAnimSprite(sprite); } -static void AnimFallingRock(struct Sprite *sprite) +void AnimFallingRock(struct Sprite *sprite) { if (gBattleAnimArgs[3] != 0) SetAverageBattlerPositions(gBattleAnimTarget, 0, &sprite->pos1.x, &sprite->pos1.y); @@ -427,7 +422,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]; @@ -470,7 +465,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); @@ -600,7 +595,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) { @@ -651,7 +646,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_water.c b/src/battle_anim_water.c index e975a8fe0b..0e9bfe214f 100644 --- a/src/battle_anim_water.c +++ b/src/battle_anim_water.c @@ -29,7 +29,6 @@ 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 *); @@ -38,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 *); @@ -111,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, }; @@ -121,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, @@ -245,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, }; @@ -255,7 +253,7 @@ 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, @@ -266,7 +264,7 @@ const struct SpriteTemplate gFirePledgeSpriteTemplate = .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 = AnimFlyUpTarget, @@ -425,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, @@ -473,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, @@ -484,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, @@ -1033,7 +1031,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); @@ -1077,10 +1075,18 @@ 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 SURF_PALETTE_SURF: + default: LoadCompressedPalette(gBattleAnimBgPalette_Surf, animBg.paletteId * 16, 32); - else + break; + case SURF_PALETTE_MUDDY_WATER: LoadCompressedPalette(gBattleAnimBackgroundImageMuddyWater_Pal, animBg.paletteId * 16, 32); + case SURF_PALETTE_SLUDGE_WAVE: + LoadCompressedPalette(gBattleAnimBgPalette_SludgeWave, animBg.paletteId * 16, 32); + } + taskId2 = CreateTask(AnimTask_SurfWaveScanlineEffect, gTasks[taskId].priority + 1); gTasks[taskId].data[15] = taskId2; gTasks[taskId2].data[0] = 0; @@ -2125,7 +2131,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_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index a7422ea179..24366d9de2 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -481,7 +481,7 @@ static void Task_ClearBitWhenSpecialAnimDone(u8 taskId) // Great function to include newly added moves that don't have animation yet. bool8 IsMoveWithoutAnimation(u16 moveId, u8 animationTurn) { - if (moveId >= (MOVES_COUNT_GEN6 - 1)) + if (moveId >= (MOVES_COUNT - 1)) return TRUE; else return FALSE; From ed4035caf15258a4ff98d612645ec6f2c2268070 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 26 May 2020 08:54:02 -0600 Subject: [PATCH 591/667] fix anim particle config options --- include/constants/battle_config.h | 30 ++++++++-------- src/battle_anim.c | 59 ++++++++++++++++--------------- 2 files changed, 45 insertions(+), 44 deletions(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 8472c3531f..220c3fb381 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -89,20 +89,20 @@ #define B_SLEEP_TURNS GEN_6 // In Gen5+, sleep lasts for 1-3 turns instead of 2-5 turns. // Animation Settings -#define NEW_SWORD_PARTICLE // update swords dance particle -#define NEW_LEECH_SEED_PARTICLE //update leech seed's animation particle -#define NEW_HORN_ATTACK_PARTICLE //update horn attack's horn -#define NEW_LEAF_PARTICLE // update leaf particle -#define NEW_EMBER_PARTICLES //updates ember fire particle -#define NEW_MEAN_LOOK_PARTICLE //update mean look eye -#define NEW_TEETH_PARTICLE //update bite/crunch teeth particle -#define NEW_HANDS_FEET_PARTICLE //update chop/kick/punch particles -#define NEW_SPIKES_PARTICLE //update spikes particle -#define NEW_FLY_BUBBLE_PARTICLE //update fly 'bubble' particle -#define NEW_CURSE_NAIL_PARTICLE //updates curse nail -#define NEW_BATON_PASS_BALL_PARTICLE //update baton pass pokeball sprite -#define NEW_MORNING_SUN_STAR_PARTICLE //updates morning sun star particles -#define NEW_IMPACT_PALETTE //updates the basic 'hit' particle -#define NEW_SURF_PARTICLE_PALETTE //updates the surf wave palette +#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/src/battle_anim.c b/src/battle_anim.c index 7ac81cac62..a21fc16201 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 @@ -1130,12 +1131,12 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_Pencil, 0x0200, ANIM_TAG_PENCIL}, {gBattleAnimSpriteGfx_AirWave, 0x0100, ANIM_TAG_AIR_WAVE}, {gBattleAnimSpriteGfx_Orb, 0x0200, ANIM_TAG_ORB}, - #ifdef NEW_SWORD_PARTICLE + #if NEW_SWORD_PARTICLE {gBattleAnimSpriteGfx_NewSword, 0x0400, ANIM_TAG_SWORD}, #else {gBattleAnimSpriteGfx_Sword, 0x0400, ANIM_TAG_SWORD}, #endif - #ifdef NEW_LEECH_SEED_PARTICLE + #if NEW_LEECH_SEED_PARTICLE {gBattleAnimSpriteGfx_NewLeechSeed, 0x0180, ANIM_TAG_SEED}, #else {gBattleAnimSpriteGfx_Seed, 0x0180, ANIM_TAG_SEED}, @@ -1162,7 +1163,7 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_HitDuplicate, 0x0A00, ANIM_TAG_HIT_DUPLICATE}, {gBattleAnimSpriteGfx_Leer, 0x0A00, ANIM_TAG_LEER}, {gBattleAnimSpriteGfx_BlueBurst, 0x0A00, ANIM_TAG_BLUE_BURST}, - #ifdef NEW_EMBER_PARTICLES + #if NEW_EMBER_PARTICLES {gBattleAnimSpriteGfx_NewEmbers, 0x0A00, ANIM_TAG_SMALL_EMBER}, #else {gBattleAnimSpriteGfx_SmallEmber, 0x0A00, ANIM_TAG_SMALL_EMBER}, @@ -1195,7 +1196,7 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_RedFist, 0x0200, ANIM_TAG_RED_FIST}, {gBattleAnimSpriteGfx_SlamHit, 0x1000, ANIM_TAG_SLAM_HIT}, {gBattleAnimSpriteGfx_Ring, 0x0180, ANIM_TAG_RING}, - #ifdef NEW_ROCKS_PARTICLE + #if NEW_ROCKS_PARTICLE {gBattleAnimSpriteGfx_NewRocks, 0x0C00, ANIM_TAG_ROCKS}, #else {gBattleAnimSpriteGfx_Rocks, 0x0C00, ANIM_TAG_ROCKS}, @@ -1204,7 +1205,7 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_YellowUnk2, 0x0040, ANIM_TAG_YELLOW_UNK_2}, {gBattleAnimSpriteGfx_AirSlash, 0x0180, ANIM_TAG_AIR_SLASH}, {gBattleAnimSpriteGfx_SpinningGreenOrbs, 0x0800, ANIM_TAG_SPINNING_GREEN_ORBS}, - #ifdef NEW_LEAF_PARTICLE + #if NEW_LEAF_PARTICLE {gBattleAnimSpriteGfx_NewLeaf, 0x0480, ANIM_TAG_LEAF}, #else {gBattleAnimSpriteGfx_Leaf, 0x0480, ANIM_TAG_LEAF}, @@ -1272,7 +1273,7 @@ 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}, - #ifdef NEW_SUBSTITUTE_PARTICLE + #if NEW_SUBSTITUTE_PARTICLE {gBattleAnimSpriteGfx_NewSubstituteFront, 0x0200, ANIM_TAG_MONSTER_DOLL}, #else {gBattleAnimSpriteGfx_MonsterDoll, 0x0200, ANIM_TAG_MONSTER_DOLL}, @@ -1288,7 +1289,7 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_CircleImpact, 0x0020, ANIM_TAG_CIRCLE_IMPACT}, {gBattleAnimSpriteGfx_Scratch, 0x0a00, ANIM_TAG_SCRATCH}, {gBattleAnimSpriteGfx_Cut, 0x0800, ANIM_TAG_CUT}, - #ifdef NEW_TEETH_PARTICLE + #if NEW_TEETH_PARTICLE {gBattleAnimSpriteGfx_NewTeeth, 0x0800, ANIM_TAG_SHARP_TEETH}, #else {gBattleAnimSpriteGfx_SharpTeeth, 0x0800, ANIM_TAG_SHARP_TEETH}, @@ -1296,7 +1297,7 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_RainbowRings, 0x00c0, ANIM_TAG_RAINBOW_RINGS}, {gBattleAnimSpriteGfx_IceCrystals, 0x01c0, ANIM_TAG_ICE_CRYSTALS}, {gBattleAnimSpriteGfx_IceSpikes, 0x0100, ANIM_TAG_ICE_SPIKES}, - #ifdef NEW_HANDS_FEET_PARTICLE + #if NEW_HANDS_FEET_PARTICLE {gBattleAnimSpriteGfx_NewHandsAndFeet, 0x0800, ANIM_TAG_HANDS_AND_FEET}, #else {gBattleAnimSpriteGfx_HandsAndFeet, 0x0800, ANIM_TAG_HANDS_AND_FEET}, @@ -1309,7 +1310,7 @@ 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}, - #ifdef NEW_SPIKES_PARTICLE + #if NEW_SPIKES_PARTICLE {gBattleAnimSpriteGfx_NewSpikes, 0x0080, ANIM_TAG_SPIKES}, #else {gBattleAnimSpriteGfx_Spikes, 0x0080, ANIM_TAG_SPIKES}, @@ -1317,7 +1318,7 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_HornHit2, 0x0100, ANIM_TAG_HORN_HIT_2}, {gBattleAnimSpriteGfx_AirWave2, 0x0100, ANIM_TAG_AIR_WAVE_2}, {gBattleAnimSpriteGfx_SmallBubbles, 0x0140, ANIM_TAG_SMALL_BUBBLES}, - #ifdef NEW_FLY_BUBBLE_PARTICLE + #if NEW_FLY_BUBBLE_PARTICLE {gBattleAnimSpriteGfx_NewFly, 0x0800, ANIM_TAG_ROUND_SHADOW}, #else {gBattleAnimSpriteGfx_RoundShadow, 0x0800, ANIM_TAG_ROUND_SHADOW}, @@ -1352,7 +1353,7 @@ 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}, - #ifdef NEW_MEAN_LOOK_PARTICLE + #if NEW_MEAN_LOOK_PARTICLE {gBattleAnimSpriteGfx_NewEye, 0x0800, ANIM_TAG_EYE}, #else {gBattleAnimSpriteGfx_Eye, 0x0800, ANIM_TAG_EYE}, @@ -1368,7 +1369,7 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_Spiral, 0x0800, ANIM_TAG_SPIRAL}, {gBattleAnimSpriteGfx_SnoreZ, 0x0200, ANIM_TAG_SNORE_Z}, {gBattleAnimSpriteGfx_Explosion, 0x0800, ANIM_TAG_EXPLOSION}, - #ifdef NEW_CURSE_NAIL_PARTICLE + #if NEW_CURSE_NAIL_PARTICLE {gBattleAnimSpriteGfx_NewNail, 0x0400, ANIM_TAG_NAIL}, #else {gBattleAnimSpriteGfx_Nail, 0x0400, ANIM_TAG_NAIL}, @@ -1399,7 +1400,7 @@ 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}, - #ifdef NEW_BATON_PASS_BALL_PARTICLE + #if NEW_BATON_PASS_BALL_PARTICLE {gBattleAnimSpriteGfx_NewPokeball, 0x0080, ANIM_TAG_POKEBALL}, #else {gBattleAnimSpriteGfx_Pokeball, 0x0080, ANIM_TAG_POKEBALL}, @@ -1418,7 +1419,7 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_PinkPetal, 0x0080, ANIM_TAG_PINK_PETAL}, {gBattleAnimSpriteGfx_PainSplit, 0x0180, ANIM_TAG_PAIN_SPLIT}, {gBattleAnimSpriteGfx_Confetti, 0x0180, ANIM_TAG_CONFETTI}, - #ifdef NEW_MORNING_SUN_STAR_PARTICLE + #if NEW_MORNING_SUN_STAR_PARTICLE {gBattleAnimSpriteGfx_NewGreenStar, 0x0200, ANIM_TAG_GREEN_STAR}, #else {gBattleAnimSpriteGfx_GreenStar, 0x0200, ANIM_TAG_GREEN_STAR}, @@ -1573,12 +1574,12 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_Pencil, ANIM_TAG_PENCIL}, {gBattleAnimSpritePal_AirWave, ANIM_TAG_AIR_WAVE}, {gBattleAnimSpritePal_Orb, ANIM_TAG_ORB}, - #ifdef NEW_SWORD_PARTICLE + #if NEW_SWORD_PARTICLE {gBattleAnimSpritePal_NewSword, ANIM_TAG_SWORD}, #else {gBattleAnimSpritePal_Sword, ANIM_TAG_SWORD}, #endif - #ifdef NEW_LEECH_SEED_PARTICLE + #if NEW_LEECH_SEED_PARTICLE {gBattleAnimSpritePal_NewLeechSeed, ANIM_TAG_SEED}, #else {gBattleAnimSpritePal_Seed, ANIM_TAG_SEED}, @@ -1596,7 +1597,7 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_BlackSmoke, ANIM_TAG_BLACK_BALL}, {gBattleAnimSpritePal_Conversion, ANIM_TAG_CONVERSION}, {gBattleAnimSpritePal_Glass, ANIM_TAG_GLASS}, - #ifdef NEW_HORN_ATTACK_PARTICLE + #if NEW_HORN_ATTACK_PARTICLE {gBattleAnimSpritePal_NewHornHit, ANIM_TAG_HORN_HIT}, #else {gBattleAnimSpritePal_HornHit, ANIM_TAG_HORN_HIT}, @@ -1609,7 +1610,7 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_HitDuplicate, ANIM_TAG_HIT_DUPLICATE}, {gBattleAnimSpritePal_Leer, ANIM_TAG_LEER}, {gBattleAnimSpritePal_BlueBurst, ANIM_TAG_BLUE_BURST}, - #ifdef NEW_EMBER_PARTICLES + #if NEW_EMBER_PARTICLES {gBattleAnimSpritePal_NewEmbers, ANIM_TAG_SMALL_EMBER}, #else {gBattleAnimSpritePal_SmallEmber, ANIM_TAG_SMALL_EMBER}, @@ -1642,7 +1643,7 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_HumanoidFoot, ANIM_TAG_RED_FIST}, {gBattleAnimSpritePal_SlamHit, ANIM_TAG_SLAM_HIT}, {gBattleAnimSpritePal_Ring, ANIM_TAG_RING}, - #ifdef NEW_ROCKS_PARTICLE + #if NEW_ROCKS_PARTICLE {gBattleAnimSpritePal_NewRocks, ANIM_TAG_ROCKS}, #else {gBattleAnimSpritePal_Rocks, ANIM_TAG_ROCKS}, @@ -1651,7 +1652,7 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_YellowUnk2, ANIM_TAG_YELLOW_UNK_2}, {gBattleAnimSpritePal_AirSlash, ANIM_TAG_AIR_SLASH}, {gBattleAnimSpritePal_SpinningGreenOrbs, ANIM_TAG_SPINNING_GREEN_ORBS}, - #ifdef NEW_LEAF_PARTICLE + #if NEW_LEAF_PARTICLE {gBattleAnimSpritePal_NewLeaf, ANIM_TAG_LEAF}, #else {gBattleAnimSpritePal_Leaf, ANIM_TAG_LEAF}, @@ -1719,7 +1720,7 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_Shock2, ANIM_TAG_SHOCK_2}, {gBattleAnimSpritePal_ClosingEye2, ANIM_TAG_CLOSING_EYE_2}, {gBattleAnimSpritePal_MetalBall, ANIM_TAG_METAL_BALL}, - #ifdef NEW_SUBSTITUTE_PARTICLE + #if NEW_SUBSTITUTE_PARTICLE {gBattleAnimSpritePal_NewSubstituteFront, ANIM_TAG_MONSTER_DOLL}, #else {gBattleAnimSpritePal_MonsterDoll, ANIM_TAG_MONSTER_DOLL}, @@ -1731,7 +1732,7 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_Tongue, ANIM_TAG_TONGUE}, {gBattleAnimSpritePal_Smoke, ANIM_TAG_SMOKE}, {gBattleAnimSpritePal_Smoke, ANIM_TAG_SMOKE_2}, - #ifdef NEW_IMPACT_PALETTE + #if NEW_IMPACT_PALETTE {gBattleAnimSpritePal_NewImpact, ANIM_TAG_IMPACT}, #else {gBattleAnimSpritePal_Impact, ANIM_TAG_IMPACT}, @@ -1739,7 +1740,7 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_CircleImpact, ANIM_TAG_CIRCLE_IMPACT}, {gBattleAnimSpritePal_Impact, ANIM_TAG_SCRATCH}, {gBattleAnimSpritePal_Impact, ANIM_TAG_CUT}, - #ifdef NEW_TEETH_PARTICLE + #if NEW_TEETH_PARTICLE {gBattleAnimSpritePal_NewTeeth, ANIM_TAG_SHARP_TEETH}, #else {gBattleAnimSpritePal_SharpTeeth, ANIM_TAG_SHARP_TEETH}, @@ -1747,7 +1748,7 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_RainbowRings, ANIM_TAG_RAINBOW_RINGS}, {gBattleAnimSpritePal_IceCrystals, ANIM_TAG_ICE_CRYSTALS}, {gBattleAnimSpritePal_IceCrystals, ANIM_TAG_ICE_SPIKES}, - #ifdef NEW_HANDS_FEET_PARTICLE + #if NEW_HANDS_FEET_PARTICLE {gBattleAnimSpritePal_NewHandsAndFeet, ANIM_TAG_HANDS_AND_FEET}, #else {gBattleAnimSpritePal_HandsAndFeet, ANIM_TAG_HANDS_AND_FEET}, @@ -1760,7 +1761,7 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_WaterImpact, ANIM_TAG_WATER_ORB}, {gBattleAnimSpritePal_PoisonBubble, ANIM_TAG_POISON_BUBBLE}, {gBattleAnimSpritePal_PoisonBubble, ANIM_TAG_TOXIC_BUBBLE}, - #ifdef NEW_SPIKES_PARTICLE + #if NEW_SPIKES_PARTICLE {gBattleAnimSpritePal_NewSpikes, ANIM_TAG_SPIKES}, #else {gBattleAnimSpritePal_Spikes, ANIM_TAG_SPIKES}, @@ -1768,7 +1769,7 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_HornHit2, ANIM_TAG_HORN_HIT_2}, {gBattleAnimSpritePal_AirWave2, ANIM_TAG_AIR_WAVE_2}, {gBattleAnimSpritePal_SmallBubbles, ANIM_TAG_SMALL_BUBBLES}, - #ifdef NEW_FLY_BUBBLE_PARTICLE + #if NEW_FLY_BUBBLE_PARTICLE {gBattleAnimSpritePal_NewFly, ANIM_TAG_ROUND_SHADOW}, #else {gBattleAnimSpritePal_RoundShadow, ANIM_TAG_ROUND_SHADOW}, @@ -1803,7 +1804,7 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_FocusEnergy, ANIM_TAG_FOCUS_ENERGY}, {gBattleAnimSpritePal_SphereToCube, ANIM_TAG_SPHERE_TO_CUBE}, {gBattleAnimSpritePal_Tendrils, ANIM_TAG_TENDRILS}, - #ifdef NEW_MEAN_LOOK_PARTICLE + #if NEW_MEAN_LOOK_PARTICLE {gBattleAnimSpritePal_NewEye, ANIM_TAG_EYE}, #else {gBattleAnimSpritePal_Eye, ANIM_TAG_EYE}, @@ -1846,7 +1847,7 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_Roots, ANIM_TAG_ROOTS}, {gBattleAnimSpritePal_ItemBag, ANIM_TAG_ITEM_BAG}, {gBattleAnimSpritePal_JaggedMusicNote, ANIM_TAG_JAGGED_MUSIC_NOTE}, - #ifdef NEW_BATON_PASS_BALL_PARTICLE + #if NEW_BATON_PASS_BALL_PARTICLE {gBattleAnimSpritePal_NewPokeball, ANIM_TAG_POKEBALL}, #else {gBattleAnimSpritePal_Pokeball, ANIM_TAG_POKEBALL}, @@ -1865,7 +1866,7 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_PinkPetal, ANIM_TAG_PINK_PETAL}, {gBattleAnimSpritePal_PainSplit, ANIM_TAG_PAIN_SPLIT}, {gBattleAnimSpritePal_Confetti, ANIM_TAG_CONFETTI}, - #ifdef NEW_MORNING_SUN_STAR_PARTICLE + #if NEW_MORNING_SUN_STAR_PARTICLE {gBattleAnimSpritePal_NewGreenStar, ANIM_TAG_GREEN_STAR}, #else {gBattleAnimSpritePal_GreenStar, ANIM_TAG_GREEN_STAR}, From a90b624c237735c4ab79b0f1f0e9db16333de144 Mon Sep 17 00:00:00 2001 From: Jaizu Date: Tue, 26 May 2020 17:28:55 +0200 Subject: [PATCH 592/667] Fix Nasty Plot move animation (#392) Fixes #391 --- data/battle_anim_scripts.s | 1 - 1 file changed, 1 deletion(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 9c591e95c2..26923f4b0c 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -2395,7 +2395,6 @@ Move_NASTY_PLOT: waitbgfadeout createvisualtask AnimTask_FadeScreenToWhite, 5 waitbgfadein - return delay 8 createsprite gQuestionMarkSpriteTemplate, 20, 0 playsewithpan SE_W118, SOUND_PAN_ATTACKER, From 638d585fc0b16070cf78d77f6e4eeb31c8bf6b02 Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 26 May 2020 10:16:24 -0600 Subject: [PATCH 593/667] update apple sprites --- graphics/battle_anims/sprites/new/apple.png | Bin 214 -> 272 bytes .../battle_anims/sprites/new/golden_apple.png | Bin 302 -> 467 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/graphics/battle_anims/sprites/new/apple.png b/graphics/battle_anims/sprites/new/apple.png index cb3e78230ffd2cfa6c192fb99eacd1516bf68210..a9cd54d4d6fa5589f62072b716c504db733ccc24 100644 GIT binary patch delta 184 zcmV;p07w7U0gwWaV1JuQL_t(2k;Ra)4Z<)GMctAyoDKXf7U1FqLYmZYg*RXeIwV&V z$Pzatjzcb<0ABZ>zkMeg^G`aFXPXb1{CscDAIQLM?_`WZ@KFn+JH`nJTcv~bdb!dbrJ<*bG4F~mmn#gPiEBJ9E~SG)>A#fP+wJyk)hdof(rf(nzV}0Bq(Is zfh=HbZ0sC?Ea2?y;_Qhe&>G?z5{x1c8tNJxiR{c!*HG69$O5UME@8+54Aa6=Gf`a1 f+0lujU`PT0Q0F!C(O8i2ySc6LT;H|JqLf%^?571H!$Z*l_^*p8)^= z$V5O=wQ@L_kbnV%D>ncD010qNS#tmY79{`x79{~mQY7#I00Bu!L_t(YiDO_G1w#q& zoH=sLEUD{{~Oo@}RprEj^l79+9)0vq-aE3n49R(x+ z)VO8f|Khc}af|;47@q|e*$z;F(Dt-K2|+2<{@g z1C&0f=c`cw0=#$cUO?ia$1Ow9iXE=T9ZexHJ`s^Eo|aaamM&-vi%Y_>&tlyHcjw0b?bYwJgdI1xj$YVe+`EB9YlwYL*3eHGUK zxjPn2@3KEN*F0L{)b6E@3!hqk{;<$3z(0DY`GQkt)^2V7R63D2x^;?^i&Zr9?RWbY z`ny^$WiR}3?R}ETiSjcWFPO0T$4*`zQ*Kxhv&_NrNm{_J9Q6eM3-#K3;ZbL1r^X8$ Rjsp41lik(NWt~$(698`kbkhI; From 0f6b83f2865042873e0728a811b836403cb8422c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 27 May 2020 12:09:14 +0200 Subject: [PATCH 594/667] Entry hazards on 1 poke ai --- data/battle_ai_scripts.s | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index c8c9d62d97..35188065d1 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -497,19 +497,25 @@ 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 - end + goto AI_CBM_Hazards AI_CBM_StealthRock: if_side_affecting AI_TARGET, SIDE_STATUS_STEALTH_ROCK, Score_Minus10 - end + goto AI_CBM_Hazards AI_CBM_StickyWeb: if_side_affecting AI_TARGET, SIDE_STATUS_STICKY_WEB, Score_Minus10 - end + goto AI_CBM_Hazards AI_CBM_Sleep: @ 82DC2D4 get_ability AI_TARGET @@ -749,6 +755,7 @@ AI_CBM_Curse: @ 82DC5BB end AI_CBM_Spikes: @ 82DC5CC + 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 @@ -1175,15 +1182,15 @@ AI_CV_PerishSong_ShadowTag: goto AI_CV_PerishSongCheckTrap AI_CV_Hazards: - if_ability AI_TARGET, ABILITY_MAGIC_BOUNCE, AI_CV_StealthRockEnd + if_ability AI_TARGET, ABILITY_MAGIC_BOUNCE, AI_CV_HzardsEnd is_first_turn_for AI_USER - if_equal 0, AI_CV_StealthRockEnd + if_equal 0, AI_CV_HzardsEnd score +2 -AI_CV_StealthRockEnd: +AI_CV_HzardsEnd: end AI_CV_StealthRock2: score -2 - goto AI_CV_StealthRockEnd + goto AI_CV_HzardsEnd AI_CV_MistyTerrain: call AI_CV_TerrainExpander From 8d848997c97dd38e6ad434027ac5c6f05312d8a8 Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Thu, 28 May 2020 04:38:27 -0400 Subject: [PATCH 595/667] Battle Configs: The Revenge (#363) * Turns for Uproar * Chances for the amount of hits with multi-hit moves. * Electric type mon's immunity to paralysis * (Hi) Jump Kick to always do 1/2 of maxHP when crashing * Turns for Disable. * Minimized mons can always be hit by moves like Stomp * Grass types immune to powder and spore moves. * Psywave's damage formula * Fixed random usage. --- asm/macros/battle_script.inc | 8 ++- data/battle_scripts_1.s | 2 +- include/battle_script_commands.h | 1 + include/constants/battle_config.h | 8 +++ include/constants/battle_script_commands.h | 3 +- src/battle_pike.c | 6 +- src/battle_script_commands.c | 73 +++++++++++++++++----- src/battle_util.c | 4 +- 8 files changed, 81 insertions(+), 24 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 20071fc36b..315c8c327d 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1715,7 +1715,13 @@ .endm .macro trypoisontype attacker:req, target:req, ptr:req - various \attacker, VARIOUS_HANDLE_TYPE_IMMUNITY + 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 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 06642142e8..bd55ca97c7 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2996,7 +2996,7 @@ BattleScript_EffectParalyze: typecalc jumpifmovehadnoeffect BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_PARALYSIS, BattleScript_AlreadyParalyzed - jumpiftype BS_TARGET, TYPE_ELECTRIC, BattleScript_NotAffected + tryparalyzetype BS_ATTACKER, BS_TARGET, BattleScript_NotAffected jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE jumpifsafeguard BattleScript_SafeguardProtected diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index 2376c5a865..d06bba8e2e 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -18,6 +18,7 @@ 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); diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 8472c3531f..0b48fa1d27 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -64,6 +64,9 @@ #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. @@ -72,7 +75,10 @@ #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. @@ -87,6 +93,8 @@ // Other #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_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 // update swords dance particle diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 71b3b1fca2..4e6e56650f 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -156,10 +156,11 @@ #define VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED 93 #define VARIOUS_TRY_FAIRY_LOCK 94 #define VARIOUS_JUMP_IF_NO_ALLY 95 -#define VARIOUS_HANDLE_TYPE_IMMUNITY 96 +#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 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_pike.c b/src/battle_pike.c index 6b31419a5c..0476b9adb7 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" @@ -856,8 +857,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 81fde7c45a..3f457b7e5f 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1275,7 +1275,8 @@ static bool32 AccuracyCalcHelper(u16 move) (((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)) + || (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; @@ -2369,7 +2370,7 @@ void SetMoveEffect(bool32 primary, u32 certain) else break; } - if ((IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_ELECTRIC)) + if (!CanParalyzeType(gBattleScripting.battler, gEffectBattler) && (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { @@ -2379,7 +2380,7 @@ void SetMoveEffect(bool32 primary, u32 certain) gBattleCommunication[MULTISTRING_CHOOSER] = 2; RESET_RETURN } - if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_ELECTRIC)) + if (!CanParalyzeType(gBattleScripting.battler, gEffectBattler)) break; if (GetBattlerAbility(gEffectBattler) == ABILITY_LIMBER || GetBattlerAbility(gEffectBattler) == ABILITY_COMATOSE @@ -2538,7 +2539,7 @@ void SetMoveEffect(bool32 primary, u32 certain) gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS; gLockedMoves[gEffectBattler] = gCurrentMove; - gBattleMons[gEffectBattler].status2 |= ((Random() & 3) + 2) << 4; + gBattleMons[gEffectBattler].status2 |= (B_UPROAR_TURNS >= GEN_5 ? 3 : ((Random() & 3) + 2) ) << 4; BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect]; @@ -6686,6 +6687,11 @@ bool32 CanPoisonType(u8 battlerAttacker, u8 battlerTarget) || 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; @@ -6913,12 +6919,18 @@ static void Cmd_various(void) gBattleStruct->friskedBattler = 0; gBattleStruct->friskedAbility = FALSE; break; - case VARIOUS_HANDLE_TYPE_IMMUNITY: + 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); @@ -8273,7 +8285,7 @@ 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: @@ -8780,14 +8792,36 @@ static void Cmd_setmultihitcounter(void) } else { - gMultiHitCounter = Random() & 3; - if (gMultiHitCounter > 1) - gMultiHitCounter = (Random() & 3) + 2; - else - gMultiHitCounter += 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 + { + // 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; @@ -9486,10 +9520,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++; } @@ -9557,7 +9591,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; } diff --git a/src/battle_util.c b/src/battle_util.c index d6730d3314..d8dcbf3e57 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2415,7 +2415,7 @@ u8 AtkCanceller_UnableToUseMove(void) case CANCELLER_POWDER_MOVE: if (gBattleMoves[gCurrentMove].flags & FLAG_POWDER) { - if (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_GRASS) + if ((B_POWDER_GRASS >= GEN_6 && IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_GRASS)) || GetBattlerAbility(gBattlerTarget) == ABILITY_OVERCOAT) { gBattlerAbility = gBattlerTarget; @@ -3732,7 +3732,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && gBattleMons[gBattlerAttacker].hp != 0 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && TARGET_TURN_DAMAGED - && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ELECTRIC) + && CanParalyzeType(gBattlerTarget, gBattlerAttacker) && GetBattlerAbility(gBattlerAttacker) != ABILITY_LIMBER && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY) && !IsAbilityStatusProtected(gBattlerAttacker) From fdc6e80e1edd0f2868cf7a10c01306eef81115ed Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 28 May 2020 12:19:07 -0600 Subject: [PATCH 596/667] fix anim defines --- data/battle_anim_scripts.s | 740 ++++++++++++++++---------------- include/battle_anim.h | 4 - include/constants/battle_anim.h | 40 +- src/battle_anim_effects_1.c | 3 +- src/battle_anim_electric.c | 5 +- src/battle_anim_ghost.c | 5 +- src/battle_anim_new.c | 100 +---- src/battle_anim_water.c | 8 +- 8 files changed, 419 insertions(+), 486 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 56e7bf0db1..0187c23f99 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -4483,7 +4483,7 @@ Move_WIDE_GUARD: Move_GUARD_SPLIT:: loadspritegfx ANIM_TAG_BLUEGREEN_ORB - createsprite AnimTask_BlendBattleAnimPal, ANIM_ATTACKER, 10, PAL_BG, 0x1, 0x0, 0xC, 0x0 + createsprite AnimTask_BlendBattleAnimPal, ANIM_ATTACKER, 10, ANIM_PAL_BG, 0x1, 0x0, 0xC, 0x0 loopsewithpan SE_W199, SOUND_PAN_ATTACKER, 0x18, 0x3 call GuardSplitLaunch call GuardSplitLaunch @@ -4496,7 +4496,7 @@ Move_GUARD_SPLIT:: call GuardSplitLaunch call GuardSplitLaunch waitforvisualfinish - createsprite AnimTask_BlendBattleAnimPal, ANIM_ATTACKER 10, PAL_BG, 0x1, 0xC, 0x0, 0x0 + createsprite AnimTask_BlendBattleAnimPal, ANIM_ATTACKER 10, ANIM_PAL_BG, 0x1, 0xC, 0x0, 0x0 waitforvisualfinish end GuardSplitLaunch: @@ -4509,7 +4509,7 @@ GuardSplitLaunch: Move_POWER_SPLIT:: loadspritegfx ANIM_TAG_RED_HEART loadspritegfx ANIM_TAG_BLUEGREEN_ORB - createvisualtask AnimTask_BlendBattleAnimPal, 10, PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 0x1, 0x0, 0xC, 0x0 loopsewithpan SE_W199, SOUND_PAN_ATTACKER, 0x18, 0x3 call PowerSplitLaunch call PowerSplitLaunch @@ -4522,7 +4522,7 @@ Move_POWER_SPLIT:: call PowerSplitLaunch call PowerSplitLaunch waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 0x1, 0xC, 0x0, 0x0 waitforvisualfinish end PowerSplitLaunch: @@ -4589,7 +4589,7 @@ Move_VENOSHOCK: Move_AUTOTOMIZE: loadspritegfx ANIM_TAG_METAL_BITS @Metal Bits setalpha 12, 8 - monbg SIDE_ATTACKER + monbg ANIM_ATK_PARTNER createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 0x2, 0x0, 0x18, 0x6, 0x4, 0x4 createvisualtask AnimTask_TraceMonBlended 0x2, 0x0, 0x4, 0x7, 0xa playsewithpan SE_ELEBETA, SOUND_PAN_ATTACKER @@ -4607,7 +4607,7 @@ Move_AUTOTOMIZE: delay 0x18 waitforvisualfinish stopsound - clearmonbg SIDE_ATTACKER + clearmonbg ANIM_ATK_PARTNER blendoff end @@ -4615,15 +4615,15 @@ Move_AUTOTOMIZE: Move_RAGE_POWDER:: loadspritegfx ANIM_TAG_SPORE @Powder loadspritegfx ANIM_TAG_HEART_STAMP @Red Colour - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER monbgprio_28 ANIM_TARGET loopsewithpan SE_W077, SOUND_PAN_TARGET, 0x12, 0xa call RagePowderSprinkle call RagePowderSprinkle call RagePowderSprinkle - createvisualtask AnimTask_BlendColorCycle, ANIM_ATTACKER, 0x2, PAL_ATK, 0x2, 0x2, 0x0, 0xb, 0x1f + createvisualtask AnimTask_BlendColorCycle, ANIM_ATTACKER, 0x2, ANIM_PAL_ATK, 0x2, 0x2, 0x0, 0xb, 0x1f waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER end RagePowderSprinkle: createsprite gRagePowderRedPowderTemplate, ANIM_ATTACKER, 0x2, 0x0, 0xffec, 0x55, 0x50, 0x0 @@ -4637,9 +4637,9 @@ RagePowderSprinkle: Move_TELEKINESIS:: loadspritegfx ANIM_TAG_SPARKLE_4 @detect - createvisualtask AnimTask_BlendBattleAnimPal, 10, PAL_BG, 0x1, 0x0, 0x9, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 0x1, 0x0, 0x9, 0x0 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, PAL_ATK, 0x1, 0x0, 0x9, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_ATK, 0x1, 0x0, 0x9, 0x7fff delay 0x12 playsewithpan SE_W197, SOUND_PAN_ATTACKER createsprite gSpinningSparkleSpriteTemplate, ANIM_ATTACKER, 0xd, 0x14, 0xffec @@ -4648,8 +4648,8 @@ Move_TELEKINESIS:: createvisualtask AnimTask_SwayMon, 0x5, 0x1, 0x18, 0xD0, 0x1, ANIM_TARGET waitforvisualfinish delay 0xA - createvisualtask AnimTask_BlendBattleAnimPal, 10, PAL_BG, 0x1, 0x9, 0x0, 0x0 - createvisualtask AnimTask_BlendBattleAnimPal, 10, PAL_ATK, 0x2, 0x9, 0x0, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 0x1, 0x9, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_ATK, 0x2, 0x9, 0x0, 0x7fff waitforvisualfinish end @@ -4734,7 +4734,7 @@ Move_FLAME_BURST: Move_SLUDGE_WAVE: panse_1B SE_W250, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 - createvisualtask AnimTask_CreateSurfWave, 0x2, SURF_PALETTE_SLUDGE_WAVE + createvisualtask AnimTask_CreateSurfWave, 0x2, ANIM_SURF_PAL_SLUDGE_WAVE waitforvisualfinish end @@ -4799,9 +4799,9 @@ Move_SYCHRONOISE: loadspritegfx ANIM_TAG_POISON_BUBBLE @violet color loadspritegfx ANIM_TAG_SMALL_EMBER @flame wheel particle loadspritegfx ANIM_TAG_AIR_WAVE_2 @aero particles - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER monbgprio_2A 0x1 - createvisualtask AnimTask_BlendBattleAnimPal, 10, PAL_BG, 0x1, 0x0, 0xC, 0x0 @Darken + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 0x1, 0x0, 0xC, 0x0 @Darken waitforvisualfinish panse_1B SE_W103, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 createsprite gSynchronoiseVioletRingTemplate, ANIM_ATTACKER, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 @@ -4826,9 +4826,9 @@ Move_SYCHRONOISE: 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, PAL_BG, 0x1, 0xC, 0x0, 0x0 @Darken + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 0x1, 0xC, 0x0, 0x0 @Darken waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER end @@ -5000,11 +5000,11 @@ Move_FOUL_PLAY: launchtemplate gFoulPlayImpactTemplate 0x2 0x4 0x0 0x0 0x1 0x1 launchtask AnimTask_ShakeMon 0x2 0x5 0x1 0x3 0x0 0x6 0x1 playsewithpan SE_W233 SOUND_PAN_TARGET - launchtask AnimTask_BlendBattleAnimPal, 0xa, 0x5, (PAL_BG | PAL_ALL_BANKS), 0x3, 0xa, 0x0, 0x0 + 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_W004, SOUND_PAN_TARGET - launchtask AnimTask_BlendBattleAnimPal, 0xa, 0x5, (PAL_BG | PAL_ALL_BANKS), 0x3, 0xa, 0x0, 0x0 + 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 @@ -5019,12 +5019,12 @@ Move_SIMPLE_BEAM: loadspritegfx ANIM_TAG_THIN_RING @ring setalpha 8, 8 monbg ANIM_TARGET - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xC 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 waitforvisualfinish playsewithpan SE_W062, SOUND_PAN_ATTACKER call SimpleBeamsRegular call SimpleBeamsRegular - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x2 0x0 0x9 0x7FFF + 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 @@ -5037,8 +5037,8 @@ Move_SIMPLE_BEAM: delay 0x2 stopsound waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x2 0x9 0x0 0x7FFF - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xC 0x0 0x0 + 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 @@ -5115,7 +5115,7 @@ Move_ROUND: Move_ECHOED_VOICE: loadspritegfx ANIM_TAG_METAL_SOUND_WAVES - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER monbgprio_2A 0x1 launchtask AnimTask_ShakeMon2 0x2 0x5 0x0 0x2 0x0 0x8 0x1 call MetalSoundPlayNote @@ -5123,7 +5123,7 @@ Move_ECHOED_VOICE: call MetalSoundPlayNote call MetalSoundPlayNote waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER delay 0x0 waitforvisualfinish end @@ -5135,9 +5135,9 @@ MetalSoundPlayNote: Move_CHIP_AWAY: loadspritegfx ANIM_TAG_IMPACT - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x2 0x0 0x9 0x7FFF + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x2 0x0 0x9 0x7FFF waitforvisualfinish - monbg SIDE_ATTACKER + monbg ANIM_ATK_PARTNER setalpha 12, 8 launchtask AnimTask_TranslateMonEllipticalRespectSide 0x2 0x5 0x0 0x18 0x6 0x1 0x5 delay 0x4 @@ -5145,8 +5145,8 @@ Move_CHIP_AWAY: launchtemplate gBasicHitSplatSpriteTemplate 0x84, 0x4, 0x0 0x0 0x1 0x1 playsewithpan SE_W233B SOUND_PAN_TARGET waitforvisualfinish - clearmonbg SIDE_ATTACKER - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x2 0x9 0x0 0x7FFF + clearmonbg ANIM_ATK_PARTNER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x2 0x9 0x0 0x7FFF waitforvisualfinish blendoff end @@ -5213,7 +5213,7 @@ Move_QUICK_GUARD: loadspritegfx ANIM_TAG_QUICK_GUARD_HAND @hand loadspritegfx ANIM_TAG_SPARKLE_4 @sparkles setalpha 12, 8 - launchtask AnimTask_BlendColorCycle 0x2 0x6 PAL_ATK 0x0 0x2 0x0 0xa 0x7FFF + 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 @@ -5327,7 +5327,7 @@ Move_HEAL_PULSE: Move_HEX: loadspritegfx ANIM_TAG_PURPLE_FLAME loadspritegfx ANIM_TAG_GHOSTLY_SPIRIT - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x0 0x0 0x10 0x4C4A @;Deep purple + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x0 0x0 0x10 0x4C4A @;Deep purple waitforvisualfinish monbg ANIM_TARGET monbgprio_29 @@ -5337,11 +5337,11 @@ Move_HEX: launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_TARGET 0x2 0x0 0x25 0x1 playsewithpan SE_W171, SOUND_PAN_TARGET delay 0x20 - launchtask AnimTask_BlendColorCycle 0x2 0x6 PAL_DEF 0x2 0x2 0x0 0xc 0x4C4A @;Deep purple + 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 PAL_BG 0x0 0x10 0x0 0x4C4A @;Deep purple + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x0 0x10 0x0 0x4C4A @;Deep purple waitforvisualfinish end @@ -5365,7 +5365,7 @@ SkyDropSetup: end SkyDropUnleash: visible ANIM_TARGET - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_W207, SOUND_PAN_TARGET launchtemplate gBounceBallLandSpriteTemplate 0x83 0x0 @@ -5374,7 +5374,7 @@ SkyDropUnleash: launchtemplate gBasicHitSplatSpriteTemplate 0x82, 0x4, 0x0 0x0 0x1 0x0 launchtask AnimTask_ShakeMon 0x5 0x5 0x1 0x0 0x5 0xb 0x1 waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER blendoff end @@ -5393,7 +5393,7 @@ Move_CIRCLE_THROW: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_THIN_RING loadspritegfx ANIM_TAG_ICE_CHUNK - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_W233, SOUND_PAN_ATTACKER launchtask AnimTask_TranslateMonEllipticalRespectSide 0x2 0x5 0x0 0xc 0x4 0x1 0x2 @@ -5412,7 +5412,7 @@ Move_CIRCLE_THROW: delay 0xb launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_TARGET 0x0 0xa waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER blendoff end @@ -5534,22 +5534,22 @@ Move_REFLECT_TYPE: Move_RETALITATE: loadspritegfx ANIM_TAG_CUT @Cut - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER setalpha 9, 8 launchtask AnimTask_AttackerPunchWithTrace 0x2 0x2 0x7128 0xa - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x10 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x10 0x0 waitforvisualfinish playsewithpan SE_W015, SOUND_PAN_TARGET launchtemplate gGuillotineSpriteTemplate 0x2 0x1 0x0 launchtemplate gGuillotineSpriteTemplate 0x2 0x1 0x1 delay 0x38 playsewithpan SE_W003, SOUND_PAN_TARGET - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x10 0x10 0x43D + 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 PAL_BG 0x1 0x10 0x0 0x043D + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x10 0x0 0x043D waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER blendoff end @@ -5558,10 +5558,10 @@ 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 PAL_BG 0x1 0x0 0xC 0x0 @Darken + 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 PAL_ATK 0x0 0x2 0x0 0x8 0x7fff + launchtask AnimTask_BlendColorCycle 0x2 0x6 ANIM_PAL_ATK 0x0 0x2 0x0 0x8 0x7fff waitforvisualfinish playsewithpan SE_W028, SOUND_PAN_ATTACKER launchtemplate gFinalGambitBlueYawnTemplate 0x2 0x3 0x0 0x0 0x25 @@ -5577,7 +5577,7 @@ Move_FINAL_GAMBIT: launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0 0x3 0xf 0x1 waitforvisualfinish clearmonbg ANIM_TARGET - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xC 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 waitforvisualfinish end @@ -6003,7 +6003,7 @@ Move_STRUGGLE_BUG: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET setalpha 12, 8 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x2 0x0 0x9 0x0a1f + 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 @@ -6013,7 +6013,7 @@ Move_STRUGGLE_BUG: launchtemplate gRandomPosHitSplatSpriteTemplate 0x83 0x2 0x1 0x3 launchtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg 0x2 0x5 0x0 0x1 0x1e 0x1 0x0 playsewithpan SE_W025B, SOUND_PAN_TARGET - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x2 0x9 0x0 0x0a1f + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x2 0x9 0x0 0x0a1f waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -6194,7 +6194,7 @@ Move_WILD_CHARGE: blendoff end ScreenFlash: - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xC 0x0 0x07FE + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x07FE return Move_DRILL_RUN: @@ -6257,7 +6257,7 @@ Move_DUAL_CHOP: loadspritegfx ANIM_TAG_HANDS_AND_FEET @hand loadspritegfx ANIM_TAG_IMPACT @hit loadspritegfx ANIM_TAG_POISON_BUBBLE @purple - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER monbgprio_28 ANIM_TARGET setalpha 12, 8 playsewithpan SE_W026, SOUND_PAN_ATTACKER @@ -6271,7 +6271,7 @@ Move_DUAL_CHOP: launchtemplate gDualChopImpactTemplate 0x3 0x4 0x0 0x0 0x1 0x2 launchtask AnimTask_ShakeMon 0x5 0x5 0x1 0x4 0x0 0x6 0x1 waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER blendoff end @@ -6378,7 +6378,7 @@ Move_HEAT_CRASH: Move_LEAF_TORNADO: loadspritegfx ANIM_TAG_GUST @Gust loadspritegfx ANIM_TAG_LEAF @Leaves - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER monbgprio_28 ANIM_TARGET playsewithpan SE_W016, SOUND_PAN_TARGET launchtask AnimTask_ShakeMon 0x5 0x5 0x1 0x0 0x2 0x2f 0x1 @@ -6435,7 +6435,7 @@ Move_STEAMROLLER: Move_COTTON_GUARD: loadspritegfx ANIM_TAG_SPORE - monbg SIDE_ATTACKER + monbg ANIM_ATK_PARTNER setalpha 12, 8 loopsewithpan SE_W077, SOUND_PAN_TARGET 0x12 0x6 call CreateCottonSpores @@ -6443,7 +6443,7 @@ Move_COTTON_GUARD: call CottonSporesSpiralInward call CottonSporesSpiralInward waitforvisualfinish - clearmonbg SIDE_ATTACKER + clearmonbg ANIM_ATK_PARTNER blendoff end CottonSporesSpiralInward: @@ -6468,7 +6468,7 @@ 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 PAL_BG 0x1 0x0 0xC 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 waitforvisualfinish playsewithpan SE_TAMA, SOUND_PAN_ATTACKER launchtemplate gNightDazeVioletRingsTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1F 0x8 @@ -6492,13 +6492,13 @@ Move_NIGHT_DAZE: 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 PAL_DEF 0x2 0x0 0x9 0x2002 + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 ANIM_PAL_DEF 0x2 0x0 0x9 0x2002 delay 0x6 playsewithpan SE_W048, SOUND_PAN_ATTACKER waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 PAL_DEF 0x2 0x9 0x0 0x2002 + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 ANIM_PAL_DEF 0x2 0x9 0x0 0x2002 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xC 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 waitforvisualfinish end @@ -6544,7 +6544,7 @@ TailSlapLeft: Move_HURRICANE: loadspritegfx ANIM_TAG_GUST - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER monbgprio_28 ANIM_TARGET setalpha 12, 8 fadetobg BG_HIGH_SPEED @@ -6566,7 +6566,7 @@ Move_HURRICANE: call HurricaneGust waitforvisualfinish stopsound - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER blendoff call UnsetPsychicBg end @@ -6631,10 +6631,10 @@ Move_SEARING_SHOT: createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_WARM_ROCK, 0x0, 0xB, 0xB, 0x01BE @Orange monbg ANIM_ATTACKER setalpha 8, 8 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x10 0x0 + 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 PAL_ATK 0x2 0x0 0x9 0x1F + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 ANIM_PAL_ATK 0x2 0x0 0x9 0x1F playsewithpan SE_W268, SOUND_PAN_ATTACKER delay 0x1e playsewithpan SE_W268, SOUND_PAN_ATTACKER @@ -6676,15 +6676,15 @@ Move_SEARING_SHOT: launchtemplate gSearingShotEruptionRockTemplate 0x42 0x5 0x1 0xe0 0x1e 0x19 0x0 delay 0x15 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 PAL_ATK 0x2 0x9 0x0 0x1F + 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 SIDE_ATTACKER - launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 PAL_ATK_PARTNER | PAL_DEF | PAL_DEF_PARTNER 0x2 0x0 0x9 0x1F + 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_W153, 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 @@ -6699,11 +6699,11 @@ Move_SEARING_SHOT: delay 0x1E playsewithpan SE_W153, SOUND_PAN_ATTACKER waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 PAL_ATK_PARTNER | PAL_DEF | PAL_DEF_PARTNER 0x2 0x9 0x0 0x1F + 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 PAL_BG 0x1 0x0 0x0 0x0 - clearmonbg SIDE_ATTACKER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x0 0x0 + clearmonbg ANIM_ATK_PARTNER blendoff end @@ -6723,7 +6723,7 @@ TechnoBlastNormal: loadspritegfx ANIM_TAG_GRAY_SMOKE @dispersal monbg ANIM_ATTACKER setblends 0x80E - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xC 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 waitforvisualfinish loopsewithpan SE_W025, SOUND_PAN_ATTACKER, 0xE, 0x8 launchtemplate gTechnoBlastWhiteCircleTemplate 0x2 0x3 0x28 0x28 0x10 @@ -6779,7 +6779,7 @@ TechnoBlastNormal: delay 0x2 launchtemplate gTechnoBlastWhiteSmokeTemplate 0x82, 0x4, 0xfff8 0x8 0x1 0x0 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xC 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 waitforvisualfinish blendoff clearmonbg ANIM_ATTACKER @@ -6823,7 +6823,7 @@ TechnoBlastElectric: loadspritegfx ANIM_TAG_GRAY_SMOKE @dispersal monbg ANIM_ATTACKER setblends 0x80E - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xC 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 waitforvisualfinish loopsewithpan SE_W025, SOUND_PAN_ATTACKER, 0xE, 0x8 launchtemplate gGrowingChargeOrbSpriteTemplate 0x2 0x1 0x0 @@ -6873,7 +6873,7 @@ TechnoBlastElectric: launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0x2 0xfff8 0x5 0x0 launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xffec 0xf 0x5 0x1 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xC 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 waitforvisualfinish blendoff clearmonbg ANIM_ATTACKER @@ -6902,7 +6902,7 @@ TechnoBlastWater: loadspritegfx ANIM_TAG_BUBBLE @bubbles monbg ANIM_ATTACKER setblends 0x80E - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xC 0x1 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x1 waitforvisualfinish launchtemplate gTechnoBlastBlueChargeTemplate 0x2 0x1 0x0 playsewithpan SE_W152, SOUND_PAN_ATTACKER @@ -7007,7 +7007,7 @@ TechnoBlastWater: launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xffec 0x14 0x19 0x1 launchtemplate gTechnoBlastBlueBubbleTemplate 0x2 0x4 0xc 0x0 0x19 0x1 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xC 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 waitforvisualfinish blendoff clearmonbg ANIM_ATTACKER @@ -7023,7 +7023,7 @@ TechnoBlastFire: loadspritegfx ANIM_TAG_GRAY_SMOKE @dispersal monbg ANIM_ATTACKER setblends 0x80E - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xC 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 waitforvisualfinish launchtemplate gTechnoBlastRedChargeTemplate 0x2 0x1 0x0 delay 0x5 @@ -7059,7 +7059,7 @@ TechnoBlastFire: delay 0x2 launchtemplate gTechnoBlastRedSmokeTemplate 0x82, 0x4, 0xfff8 0x8 0x1 0x0 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xC 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 waitforvisualfinish blendoff clearmonbg ANIM_ATTACKER @@ -7096,7 +7096,7 @@ TechnoBlastIce: loadspritegfx ANIM_TAG_SPARK_2 @blast particles loadspritegfx ANIM_TAG_GRAY_SMOKE @dispersal monbg ANIM_ATTACKER - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xC 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 waitforvisualfinish launchtemplate gTechnoBlastIceChargeTemplate 0x2 0x1 0x0 delay 0x5 @@ -7143,7 +7143,7 @@ TechnoBlastIce: launchtemplate gIceCrystalHitSmallSpriteTemplate 0x82, 0x3, 0x0 0x0 0x0 launchtemplate gIceCrystalHitLargeSpriteTemplate 0x82, 0x3, 0x14 0x2 0x0 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xC 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 waitforvisualfinish clearmonbg ANIM_ATTACKER end @@ -7177,7 +7177,7 @@ Move_RELIC_SONG: loadspritegfx ANIM_TAG_THIN_RING loadspritegfx ANIM_TAG_MUSIC_NOTES loadspritegfx ANIM_TAG_IMPACT - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER launchtask AnimTask_MusicNotesRainbowBlend 0x2 0x0 waitforvisualfinish panse_1B 0x1DF, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 @ ??? @@ -7248,7 +7248,7 @@ Move_RELIC_SONG: launchtemplate gBasicHitSplatSpriteTemplate 0x83 0x4 0x20 0x14 0x1 0x3 playsewithpan SE_W004, SOUND_PAN_TARGET waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER launchtask AnimTask_MusicNotesClearRainbowBlend 0x2 0x0 waitforvisualfinish end @@ -7262,7 +7262,7 @@ Move_SECRET_SWORD: monbg ANIM_ATTACKER setalpha 12, 8 playsewithpan SE_W014, SOUND_PAN_ATTACKER - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x0 0x0 0x10 0x0 + 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 @@ -7276,7 +7276,7 @@ Move_SECRET_SWORD: delay 0x5 launchtask AnimTask_ShakeMon 0x2 0x5 0x1 0x0 0x3 0xa 0x1 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x0 0x10 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x0 0x10 0x0 0x0 waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -7288,7 +7288,7 @@ Move_GLACIATE: loadspritegfx ANIM_TAG_ICE_CRYSTALS @ice loadspritegfx ANIM_TAG_BLACK_SMOKE @smoke loadspritegfx ANIM_TAG_ICE_CHUNK @White Colour - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER setalpha 12, 8 fadetobg BG_ICE waitbgfadeout @@ -7306,12 +7306,12 @@ Move_GLACIATE: launchtemplate gGlaciateSmokeTemplate 0x84 0x5 0x0 0x12 0x50 0x0 0x4b launchtemplate gGlaciateSmokeTemplate 0x84 0x5 0x0 0x12 0x48 0x1 0x4b waitforvisualfinish - createsprite AnimTask_BlendBattleAnimPal, ANIM_ATTACKER, 0xA, (PAL_DEF | PAL_DEF_PARTNER), 0x2, 0x0, 0xA, 0x7FFF + createsprite AnimTask_BlendBattleAnimPal, ANIM_ATTACKER, 0xA, (ANIM_PAL_DEF | ANIM_PAL_DEF_PARTNER), 0x2, 0x0, 0xA, 0x7FFF call IceCrystalEffectLong - createsprite AnimTask_BlendBattleAnimPal, ANIM_ATTACKER, 0xA, (PAL_DEF | PAL_DEF_PARTNER), 0x2, 0xA, 0x0, 0x7FFF + createsprite AnimTask_BlendBattleAnimPal, ANIM_ATTACKER, 0xA, (ANIM_PAL_DEF | ANIM_PAL_DEF_PARTNER), 0x2, 0xA, 0x0, 0x7FFF waitforvisualfinish blendoff - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER call UnsetPsychicBg end @@ -7323,8 +7323,8 @@ Move_BOLT_STRIKE:: loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @Electric Circle monbg ANIM_ATTACKER setalpha 12, 8 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x10 0x0 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x2 0x0 0x9 0x07FE + 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_W268, SOUND_PAN_ATTACKER delay 0xc @@ -7342,19 +7342,19 @@ Move_BOLT_STRIKE:: 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 PAL_DEF 0x2 0x0 0x9 0x07FE + 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_W161B, SOUND_PAN_TARGET call ElectricityEffect launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_ATTACKER 0x0 0x5 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x2 0x9 0x0 0x07FE + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x2 0x9 0x0 0x07FE playsewithpan SE_W161B, SOUND_PAN_TARGET call ElectricityEffect waitforvisualfinish clearmonbg ANIM_TARGET - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x2 0x9 0x0 0x07FE + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0x9 0x0 0x07FE call UnsetPsychicBg - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x0 0x0 blendoff waitforvisualfinish end @@ -7363,7 +7363,7 @@ Move_BOLT_STRIKE:: Move_BLUE_FLARE:: loadspritegfx ANIM_TAG_SMALL_EMBER @Fire loadspritegfx ANIM_TAG_METAL_BITS @Blue Flare Colour - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x0 0x0 0x10 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x0 0x0 0x10 0x0 loopsewithpan SE_W172, SOUND_PAN_ATTACKER, 0x7, 0x9 launchtemplate gBlueFlareFlameJabTemplate 0x82 0x5 0x1 0x0 0x0 0xffe0 0x10 delay 0x2 @@ -7401,7 +7401,7 @@ Move_BLUE_FLARE:: playsewithpan SE_W172, SOUND_PAN_ATTACKER call BlueFlareFlameSpreadEffect waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x0 0x0 0x0 0x0 + 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 @@ -7433,11 +7433,11 @@ BlueFlareFlameSpreadEffect: Move_FIERY_DANCE:: loadspritegfx ANIM_TAG_SMALL_EMBER - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xc 0x14be + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xc 0x14be waitforvisualfinish playsewithpan SE_W221B, SOUND_PAN_TARGET launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_TARGET 0x0 0x2 0x40 0x1 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x1 0x0 0x9 0x1f + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x1 0x0 0x9 0x1f call FireSpinEffect call FireSpinEffect call FireSpinEffect @@ -7446,8 +7446,8 @@ Move_FIERY_DANCE:: call FireSpinEffect call FireSpinEffect waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x1 0x9 0x0 0x1f - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xc 0x0 0x14be + 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 @@ -7461,15 +7461,15 @@ Move_FREEZE_SHOCK:: FreezeShockCharge: launchtask AnimTask_HorizontalShake 0x5 0x3 0x0 0x2 0x10 playsewithpan SE_W085B, SOUND_PAN_TARGET - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x1 0x0 0xf 0x7fff + 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 PAL_ATK 0x1 0xf 0x0 0x7fff + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x1 0xf 0x0 0x7fff waitforvisualfinish end FreezeShockAttack: loopsewithpan SE_W196, SOUND_PAN_TARGET, 0x5, 0x5 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x10 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x10 0x0 monbg ANIM_TARGET waitforvisualfinish playsewithpan SE_W086, SOUND_PAN_ATTACKER @@ -7489,7 +7489,7 @@ FreezeShockAttack: call ElectricityEffect waitforvisualfinish clearmonbg ANIM_TARGET - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x10 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x10 0x0 0x0 waitforvisualfinish end @@ -7503,23 +7503,23 @@ Move_ICE_BURN:: waitforvisualfinish end IceBurnCharge: - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xC 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 waitforvisualfinish loopsewithpan SE_W196, SOUND_PAN_TARGET, 0x4, 0x3 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x1 0x8 0x0 0x0 + 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 PAL_ATK 0x1 0x0 0xf 0x7fff + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x1 0x0 0xf 0x7fff delay 0x14 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x1 0xf 0x0 0x7fff + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x1 0xf 0x0 0x7fff waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xC 0x0 0x0 + 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 PAL_DEF 0x2 0x0 0x9 0x7fff + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0x0 0x9 0x7fff launchtemplate gIceCrystalHitLargeSpriteTemplate 0x82, 0x3, 0xfff6 0xfff6 0x0 playsewithpan SE_W196, SOUND_PAN_TARGET launchtemplate gIceBurnSmokeTemplate 0x84 0x5 0x0 0xfff4 0x68 0x0 0x4b @@ -7554,7 +7554,7 @@ IceBurnUnleash: delay 0x4 launchtemplate gIceCrystalHitLargeSpriteTemplate 0x82, 0x3, 0x14 0x2 0x0 playsewithpan SE_W196, SOUND_PAN_TARGET - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x2 0x9 0x0 0x7fff + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0x9 0x0 0x7fff waitforvisualfinish restorebg clearmonbg ANIM_TARGET @@ -7565,7 +7565,7 @@ Move_SNARL:: loadspritegfx ANIM_TAG_JAGGED_MUSIC_NOTE loadspritegfx ANIM_TAG_THIN_RING loadspritegfx ANIM_TAG_IMPACT - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER fadetobg BG_DARK waitbgfadeout launchtask AnimTask_UproarDistortion 0x2 0x1 0x0 @@ -7601,7 +7601,7 @@ Move_SNARL:: playsewithpan SE_W004, SOUND_PAN_TARGET waitforvisualfinish call UnsetPsychicBg - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER blendoff end @@ -7610,7 +7610,7 @@ Move_ICICLE_CRASH:: loadspritegfx ANIM_TAG_ICICLE_SPEAR @Icicle fadetobg BG_ICE waitbgfadein - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER launchtemplate gIcicleCrashSpearTemplate 0x82, 0x4, 0xfffb 0x0 0xfffb 0x0 playsewithpan SE_W196, SOUND_PAN_TARGET delay 0x2 @@ -7627,7 +7627,7 @@ Move_ICICLE_CRASH:: call LaunchIcicleCrashSpear call LaunchIcicleCrashSpear waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER restorebg waitbgfadeout end @@ -7664,14 +7664,14 @@ Move_V_CREATE:: 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 SIDE_ATTACKER - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xC 0x0 @Darken + 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_W025, SOUND_PAN_ATTACKER delay 0x2 launchtemplate gVCreateRedRingTemplate 0x28 0x4 0x0 0x0 0x0 0x0 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x2 0x0 0x9 0x1f + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x2 0x0 0x9 0x1f playsewithpan SE_W172B, SOUND_PAN_TARGET call VCreateFlames call VCreateFlames @@ -7690,7 +7690,7 @@ Move_V_CREATE:: unloadspritegfx ANIM_TAG_ECLIPSING_ORB loadspritegfx ANIM_TAG_EXPLOSION @explosion animation loadspritegfx ANIM_TAG_CLAW_SLASH @dragon claw animation - clearmonbg SIDE_ATTACKER + clearmonbg ANIM_ATK_PARTNER fadetobg BG_FIRE @Mr. DS Fire waitbgfadeout launchtask AnimTask_StartSlidingBg 0x5 0x4 0xA00 0x0 0x1 0xffff @@ -7699,7 +7699,7 @@ Move_V_CREATE:: 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 PAL_DEF 0x2 0x0 0x9 0x1f + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0x0 0x9 0x1f playsewithpan SE_W153, SOUND_PAN_ATTACKER launchtemplate gExplosionSpriteTemplate 0x3 0x4 0x0 0x0 0x1 0x1 delay 0x6 @@ -7721,14 +7721,14 @@ Move_V_CREATE:: waitforvisualfinish launchtask AnimTask_ShakeMonInPlace 0x2 0x5 0x1 0x4 0x0 0xc 0x1 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x2 0x9 0x0 0x1f - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x2 0x9 0x0 0x1f + 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 SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER call UnsetPsychicBg - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x0 0xffff + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x0 0xffff waitforvisualfinish end VCreateFlames: @@ -7749,12 +7749,12 @@ Move_FUSION_FLARE:: 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 PAL_BG 0x1 0x0 0xC 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 waitforvisualfinish playsewithpan SE_W025, SOUND_PAN_ATTACKER call FusionFlareBuff delay 0x8 - launchtask AnimTask_BlendColorCycle 0x2 0x6 PAL_ATK 0x2 0x2 0x0 0xb 0x1F + 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 @@ -7768,7 +7768,7 @@ Move_FUSION_FLARE:: 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 PAL_DEF 0x2 0x2 0x0 0xb 0x1F + 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 @@ -7780,7 +7780,7 @@ Move_FUSION_FLARE:: delay 0x5 playsewithpan SE_W153, SOUND_PAN_ATTACKER waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xC 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -7805,7 +7805,7 @@ Move_FUSION_BOLT:: 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, PAL_BG, 0x0, 0x0, 0xE, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 0x0, 0x0, 0xE, 0x0 waitforvisualfinish launchtemplate gVoltTackleOrbSlideSpriteTemplate 0x1 0x0 playsewithpan SE_W268, SOUND_PAN_ATTACKER @@ -7840,7 +7840,7 @@ Move_FUSION_BOLT:: launchtemplate gElectricPuffSpriteTemplate 0x2 0x3 0x0 0x10 0x10 delay 0x2 launchtemplate gElectricPuffSpriteTemplate 0x2 0x3 0x0 0xfff0 0xfff0 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x0 0xE 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x0 0xE 0x0 0x0 waitforvisualfinish end @@ -7883,7 +7883,7 @@ Move_FLYING_PRESS:: Move_MAT_BLOCK:: loadspritegfx ANIM_TAG_CONVERSION loadspritegfx ANIM_TAG_GREEN_LIGHT_WALL @green color - monbg SIDE_ATTACKER + monbg ANIM_ATK_PARTNER monbgprio_28 ANIM_ATTACKER setblends 0x10 delay 0x0 @@ -7906,7 +7906,7 @@ Move_MAT_BLOCK:: launchtask AnimTask_ConversionAlphaBlend 0x5 0x0 waitforvisualfinish delay 0x1 - clearmonbg SIDE_ATTACKER + clearmonbg ANIM_ATK_PARTNER blendoff end @@ -7948,7 +7948,7 @@ Move_ROTOTILLER:: loadspritegfx ANIM_TAG_MUD_SAND loadspritegfx ANIM_TAG_DIRT_MOUND loadspritegfx ANIM_TAG_GREEN_SPARKLE - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x10 0x112C + 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 @@ -7959,7 +7959,7 @@ Move_ROTOTILLER:: call DigThrowDirt call DigThrowDirt waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x10 0x0 0x112C + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x10 0x0 0x112C waitforvisualfinish end @@ -8120,10 +8120,10 @@ Move_FORESTS_CURSE: loadspritegfx ANIM_TAG_ROOTS @frenzy plant loadspritegfx ANIM_TAG_GHOSTLY_SPIRIT @curse monbg ANIM_ATTACKER - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x10 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x10 0x0 waitforvisualfinish playsewithpan SE_W010, SOUND_PAN_ATTACKER - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x2 0x0 0x8 0x02E3 + 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 @@ -8147,9 +8147,9 @@ Move_FORESTS_CURSE: launchtemplate gCurseGhostSpriteTemplate 0x82 0x0 launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0x2 0x0 0xe 0x1 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x2 0x8 0x0 0x02E3 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0x8 0x0 0x02E3 delay 0x3 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x10 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x10 0x0 0x0 waitforvisualfinish clearmonbg ANIM_ATTACKER end @@ -8204,10 +8204,10 @@ Move_PETAL_BLIZZARD:: Move_FREEZE_DRY:: - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER loadspritegfx ANIM_TAG_ICE_CRYSTALS - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x7 0x0 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x2 0x0 0x9 0x7f4c + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x7 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0x0 0x9 0x7f4c delay 0x14 playsewithpan SE_W081, SOUND_PAN_TARGET launchtemplate gIceCrystalSpiralInwardSmall 0x2 0x1 0x0 @@ -8228,9 +8228,9 @@ Move_FREEZE_DRY:: launchtask AnimTask_FrozenIceCube 0x2 0x0 waitplaysewithpan SE_RG_CARD1 SOUND_PAN_TARGET 0x11 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x2 0x9 0x0 0x7f4c - clearmonbg SIDE_TARGET - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x0 0x7 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0x9 0x0 0x7f4c + clearmonbg ANIM_DEF_PARTNER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x0 0x7 0x0 0x0 waitforvisualfinish blendoff end @@ -8238,7 +8238,7 @@ Move_FREEZE_DRY:: Move_DISARMING_VOICE:: loadspritegfx ANIM_TAG_NOISE_LINE - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x8 0x6e7d + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x8 0x6e7d waitforvisualfinish launchtask SoundTask_PlayDoubleCry 0x2 0x2 0x0 0xff call RoarEffect @@ -8248,7 +8248,7 @@ Move_DISARMING_VOICE:: waitforvisualfinish launchtask SoundTask_WaitForCry 0x5 0x0 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x8 0x0 0x6e7d + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x8 0x0 0x6e7d waitforvisualfinish end @@ -8320,9 +8320,9 @@ Move_DRAINING_KISS: Move_CRAFTY_SHIELD:: loadspritegfx ANIM_TAG_CRAFTY_SHIELD - monbg SIDE_ATTACKER + monbg ANIM_ATK_PARTNER monbgprio_28 ANIM_ATTACKER - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x5 0x4DBF + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x5 0x4DBF setblends 0x10 delay 0x0 playsewithpan SE_W129, SOUND_PAN_ATTACKER @@ -8366,10 +8366,10 @@ Move_CRAFTY_SHIELD:: delay 0x6 launchtask AnimTask_ConversionAlphaBlend 0x5 0x0 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x5 0x0 0x4DBF + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x5 0x0 0x4DBF waitforvisualfinish delay 0x1 - clearmonbg SIDE_ATTACKER + clearmonbg ANIM_ATK_PARTNER blendoff end @@ -8378,7 +8378,7 @@ Move_FLOWER_SHIELD:: loadspritegfx ANIM_TAG_FLOWER loadspritegfx ANIM_TAG_IMPACT setalpha 12, 8 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x8 0x6e7d + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x8 0x6e7d waitforvisualfinish playsewithpan SE_W080, SOUND_PAN_ATTACKER launchtemplate gPetalDanceBigFlowerSpriteTemplate 0x2 0x4 0x0 0xffe8 0x8 0x8c @@ -8399,7 +8399,7 @@ Move_FLOWER_SHIELD:: launchtemplate gPetalDanceSmallFlowerSpriteTemplate 0x2 0x4 0x14 0xfff0 0xe 0x50 launchtemplate gPetalDanceSmallFlowerSpriteTemplate 0x2 0x4 0xffec 0xfff2 0x10 0x50 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x8 0x0 0x6e7d + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x8 0x0 0x6e7d waitforvisualfinish blendoff end @@ -8495,12 +8495,12 @@ Move_ELECTRIFY:: 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 PAL_DEF 0x2 0x0 0xB 0x039B - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x3 0x039B + 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 SIDE_TARGET + monbg ANIM_DEF_PARTNER playsewithpan SE_W085B, SOUND_PAN_TARGET launchtemplate gElectrifyYellowRingTemplate 0x3 0x6 0x0 0x0 0x1 0x0 0x1f 0x8 launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_TARGET 0x4 0x0 0x6 0x1 @@ -8526,10 +8526,10 @@ Move_ELECTRIFY:: delay 0x2 launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xffec 0xf 0x5 0x1 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 PAL_DEF 0x2 0xB 0x0 0x039B - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x3 0x0 0x039B + 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 SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER end @@ -8592,9 +8592,9 @@ Move_PLAY_ROUGH:: Move_FAIRY_WIND:: loadspritegfx ANIM_TAG_PINK_CLOUD - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER setalpha 12, 8 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x8 0x6e7d + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x8 0x6e7d waitforvisualfinish playsewithpan SE_W016, SOUND_PAN_TARGET launchtemplate gFairyWindCloudTemplate 0x83 0x7 0x14 0xfff6 0x14 0x0 0x16 0x14 0x1 @@ -8611,9 +8611,9 @@ Move_FAIRY_WIND:: waitforvisualfinish stopsound playsewithpan SE_W016B, SOUND_PAN_TARGET - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x8 0x0 0x6e7d + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x8 0x0 0x6e7d waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER blendoff end @@ -8675,8 +8675,8 @@ Move_FAIRY_LOCK:: loadspritegfx ANIM_TAG_CHAIN_LINK @Chain Colour loadspritegfx ANIM_TAG_FAIRY_LOCK_CHAINS @Fairy Lock Chain setalpha 8, 8 - monbg SIDE_ATTACKER - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x8 0x6B1F + monbg ANIM_ATK_PARTNER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x8 0x6B1F waitforvisualfinish loopsewithpan SE_W010, SOUND_PAN_TARGET, 0x6, 0x4 launchtask AnimTask_VoltTackleBolt 0x5 0x1 0x7 @@ -8687,9 +8687,9 @@ Move_FAIRY_LOCK:: launchtask AnimTask_VoltTackleBolt 0x5 0x1 0x6 launchtask AnimTask_VoltTackleBolt 0x5 0x1 0x35 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x8 0x0 0x6B1F + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x8 0x0 0x6B1F waitforvisualfinish - clearmonbg SIDE_ATTACKER + clearmonbg ANIM_ATK_PARTNER blendoff end @@ -8720,9 +8720,9 @@ Move_CONFIDE:: Move_DIAMOND_STORM:: loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_ICE_CRYSTALS - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER monbgprio_28 ANIM_TARGET - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xF 0x1888 + 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_W059, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 @@ -8784,23 +8784,23 @@ Move_DIAMOND_STORM:: launchtemplate gBasicHitSplatSpriteTemplate 0x83 0x4 0x20 0x14 0x1 0x3 playsewithpan SE_W196, SOUND_PAN_TARGET waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xF 0x0 0x1888 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xF 0x0 0x1888 waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER blendoff end Move_STEAM_ERUPTION:: loadspritegfx ANIM_TAG_STEAM_ERUPTION @Steam Eruption Particle - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x7 0x043D + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x7 0x043D delay 0x20 - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER monbgprio_28 ANIM_TARGET panse_1B SE_W056, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 call SteamEruptionBreath call SteamEruptionBreath - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x1 0x0 0x9 0x1f + 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 @@ -8820,10 +8820,10 @@ Move_STEAM_ERUPTION:: call SteamEruptionBreath call SteamEruptionBreath call SteamEruptionBreath - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x1 0x9 0x0 0x1f + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x1 0x9 0x0 0x1f waitforvisualfinish - clearmonbg SIDE_TARGET - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x7 0x0 0x043D + clearmonbg ANIM_DEF_PARTNER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x7 0x0 0x043D waitforvisualfinish end SteamEruptionBreath: @@ -8837,7 +8837,7 @@ Move_HYPERSPACE_HOLE:: 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 PAL_BG 0x1 0x0 0x10 0x7FFF + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x10 0x7FFF waitforvisualfinish playsewithpan SE_W185, SOUND_PAN_ATTACKER invisible ANIM_ATTACKER @@ -8876,7 +8876,7 @@ Move_HYPERSPACE_HOLE:: invisible ANIM_ATTACKER delay 0x1 visible ANIM_ATTACKER - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x10 0x0 0x7FFF + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x10 0x0 0x7FFF waitforvisualfinish end HyperspaceHoleMovement: @@ -8892,7 +8892,7 @@ Move_WATER_SHURIKEN:: loadspritegfx ANIM_TAG_BLUE_RING_2 @rings loadspritegfx ANIM_TAG_SMALL_BUBBLES @bubbles loadspritegfx ANIM_TAG_IMPACT @hydro pump hit - monbg SIDE_TARGET + 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 @@ -8906,7 +8906,7 @@ Move_WATER_SHURIKEN:: playsewithpan SE_W028, SOUND_PAN_TARGET launchtemplate gWaterShurikenImpactTemplate 0x2 0x4 0x0 0x0 0x1 0x2 waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER end Move_MYSTICAL_FIRE:: @@ -8943,7 +8943,7 @@ Move_MYSTICAL_FIRE:: Move_SPIKY_SHIELD:: loadspritegfx ANIM_TAG_PROTECT loadspritegfx ANIM_TAG_GREEN_SPIKE - monbg SIDE_ATTACKER + monbg ANIM_ATK_PARTNER monbgprio_28 ANIM_ATTACKER waitplaysewithpan SE_W115, SOUND_PAN_ATTACKER, 0x10 launchtemplate gProtectSpriteTemplate 0x2 0x3 0x18 0x0 0x5a @@ -8972,24 +8972,24 @@ Move_SPIKY_SHIELD:: delay 0x2 launchtemplate gNeedleArmSpikeSpriteTemplate 0x82 0x5 0x0 0x1 0x10 0x10 0x10 waitforvisualfinish - clearmonbg SIDE_ATTACKER + clearmonbg ANIM_ATK_PARTNER end Move_AROMATIC_MIST:: loadspritegfx ANIM_TAG_PINK_PETAL playsewithpan SE_W230, SOUND_PAN_ATTACKER - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x8 0x6E7D + 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, (PAL_DEF | PAL_DEF_PARTNER), 1, 5, 5, 13, 0x56bf + createvisualtask AnimTask_BlendColorCycle, 2, (ANIM_PAL_DEF | ANIM_PAL_DEF_PARTNER), 1, 5, 5, 13, 0x56bf call SweetScentEffect waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x8 0x0 0x6E7D + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x8 0x0 0x6E7D waitforvisualfinish end @@ -9001,7 +9001,7 @@ Move_EERIE_IMPULSE:: loadspritegfx ANIM_TAG_BLUE_STAR @heal particles loadspritegfx ANIM_TAG_SPARK_H @lighter yellow particle loadspritegfx ANIM_TAG_GOLD_RING @psybeam ring - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER waitplaysewithpan SE_W085B, SOUND_PAN_TARGET 0x13 delay 0x4 launchtemplate gEerieImpulseRingTemplate 0x0 0x7 0x2d 0x0 0x0 0x0 0x0 0x0 0x1 @@ -9036,13 +9036,13 @@ Move_EERIE_IMPULSE:: launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0x2 0xfff8 0x5 0x0 launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xffec 0xf 0x5 0x1 waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER end Move_VENOM_DRENCH:: loadspritegfx ANIM_TAG_POISON_BUBBLE - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER launchtemplate gVenomDrenchAcidTemplate 0x82, 0x4, 0xfffb 0x1 0xfffb 0x0 playsewithpan SE_W145C, SOUND_PAN_TARGET delay 0x2 @@ -9058,7 +9058,7 @@ Move_VENOM_DRENCH:: call AcidDrench call AcidDrench waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER end AcidDrench: launchtemplate gVenomDrenchAcidTemplate 0x82, 0x4, 0xffec 0x0 0xfff6 0x0 @@ -9091,14 +9091,14 @@ AcidDrench: Move_POWDER:: loadspritegfx ANIM_TAG_HANDS_AND_FEET @black color loadspritegfx ANIM_TAG_SPORE @powder - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER monbgprio_28 ANIM_TARGET loopsewithpan SE_W077, SOUND_PAN_TARGET, 0x12, 0xa call POWDER_SPORE call POWDER_SPORE call POWDER_SPORE waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER end POWDER_SPORE: launchtemplate gPowderBlackSporeTemplate 0x2 0x5 0x0 0xffec 0x55 0x50 0x0 @@ -9117,27 +9117,27 @@ Move_GEOMANCY:: 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 SIDE_ATTACKER + monbg ANIM_ATK_PARTNER setalpha 8, 8 choosetwoturnanim GeomancyChargeUp GeomancyUnleash GeomancyChargeUp: loadspritegfx ANIM_TAG_FOCUS_ENERGY @endure buff effect - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xC 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 waitforvisualfinish playsewithpan SE_W322, SOUND_PAN_ATTACKER launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_ATTACKER 0x0 0x2 0x5f 0x1 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x2 0x0 0x5 0x1F + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x2 0x0 0x5 0x1F call GeomancyRingBuff - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x2 0x0 0x5 0x2C0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x2 0x0 0x5 0x2C0 call GeomancyRingBuff - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x2 0x0 0x5 0x7C60 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x2 0x0 0x5 0x7C60 call GeomancyRingBuff waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x8 0x0 0x0 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x2 0x5 0x0 0x7C60 + 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 SIDE_ATTACKER + clearmonbg ANIM_ATK_PARTNER end GeomancyRingBuff: launchtemplate gGeomancyRedCellVortexTemplate 0x2 0x7 0x0 0x1c 0x210 0x1e 0xd 0x32 0x0 @@ -9188,7 +9188,7 @@ GeomancyRingBuff: return GeomancyUnleash: loadspritegfx ANIM_TAG_FIRE_PLUME @dragon rage - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x10 0x24CF + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x10 0x24CF playsewithpan SE_W208, SOUND_PAN_ATTACKER launchtemplate gGeomancyRingTemplate 0x2 0x0 delay 0x1 @@ -9203,9 +9203,9 @@ GeomancyUnleash: launchtemplate gGeomancyRingTemplate 0x2 0x0 waitforvisualfinish playsewithpan SE_W082, SOUND_PAN_ATTACKER - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x10 0x10 0x4D01 + 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 PAL_ATK 0x2 0x0 0x5 0x1F + 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 @@ -9215,11 +9215,11 @@ GeomancyUnleash: call GeomancyRageBuff call GeomancyRageBuff waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x10 0x0 0x4D01 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x2 0x5 0x0 0x1F + 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 SIDE_ATTACKER + clearmonbg ANIM_ATK_PARTNER end GeomancyRageBuff: launchtemplate gGeomancyYellowRageTemplate 0xc2 0x3 0x0 0x5 0x0 @@ -9245,8 +9245,8 @@ 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, (PAL_DEF | PAL_ATK), 2, 0, 9, 0x243B - createvisualtask AnimTask_BlendBattleAnimPal 10, (PAL_DEF | PAL_ATK_PARTNER), 2, 0, 9, 0x243B + 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_W161, SOUND_PAN_ATTACKER, 0x12, 0x3 launchtask AnimTask_DefenseCurlDeformMon 0x5 0x0 call MagneticFluxSparks1 @@ -9258,8 +9258,8 @@ Move_MAGNETIC_FLUX:: launchtemplate gMagneticFluxUproarTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1f 0x8 call MagneticFluxSparks2 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal 10, (PAL_DEF | PAL_ATK), 2, 9, 0, 0x243B - createvisualtask AnimTask_BlendBattleAnimPal 10, (PAL_DEF | PAL_ATK_PARTNER), 2, 9, 0, 0x243B + 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: @@ -9422,7 +9422,7 @@ Move_BABY_DOLL_EYES:: loadspritegfx ANIM_TAG_PINK_CLOUD loadspritegfx ANIM_TAG_OPENING_EYE @eye setalpha 8, 8 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x0 0x0 0xA 0x7FFF + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x0 0x0 0xA 0x7FFF waitforvisualfinish launchtemplate gOpeningEyeSpriteTemplate 0x5 0x4 0x0 0x0 0x1 0x0 delay 0x20 @@ -9432,7 +9432,7 @@ Move_BABY_DOLL_EYES:: 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 PAL_BG 0x0 0xA 0x0 0x7FFF + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x0 0xA 0x0 0x7FFF waitforvisualfinish blendoff end @@ -9491,9 +9491,9 @@ Move_HOLD_BACK:: Move_INFESTATION:: loadspritegfx ANIM_TAG_HANDS_AND_FEET @black color loadspritegfx ANIM_TAG_SMALL_BUBBLES @circle particles - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER monbgprio_28 ANIM_TARGET - createvisualtask AnimTask_BlendBattleAnimPal, 10, PAL_DEF, 0x2, 0x0, 0x9, 0x7320 + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_DEF, 0x2, 0x0, 0x9, 0x7320 launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x3 0x0 0x4f 0x1 loopsewithpan SE_W268, SOUND_PAN_ATTACKER, 0x0, 0x4F call InfestationVortex @@ -9502,9 +9502,9 @@ Move_INFESTATION:: call InfestationVortex call InfestationVortex waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 PAL_DEF 0x2 0x9 0x0 0x7320 + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 ANIM_PAL_DEF 0x2 0x9 0x0 0x7320 waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER end InfestationVortex: launchtemplate gInfestationBubbleTemplate 0x82 0x7 0x0 0x1c 0x210 0x1e 0xd 0x32 0x1 @@ -9548,13 +9548,13 @@ Move_OBLIVION_WING:: playsewithpan SE_W019, SOUND_PAN_ATTACKER launchtemplate gFlyBallUpSpriteTemplate 0x2 0x4 0x0 0x0 0xd 0x150 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xE 0x0 @Black + 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 PAL_DEF 0x2 0x4 0x0 0xc 0x289F @Pinkish Red + launchtask AnimTask_BlendColorCycle 0x2 0x6 ANIM_PAL_DEF 0x2 0x4 0x0 0xc 0x289F @Pinkish Red call OblivionWingBeam call OblivionWingBeam call OblivionWingBeam @@ -9569,7 +9569,7 @@ Move_OBLIVION_WING:: visible ANIM_ATTACKER call HealingEffect waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xE 0x0 0x0 @From black + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xE 0x0 0x0 @From black waitforvisualfinish end OblivionWingBeam: @@ -9590,7 +9590,7 @@ Move_THOUSAND_ARROWS:: loadspritegfx ANIM_TAG_NEEDLE @sting monbg ANIM_ATTACKER setblends 0x80e - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xC 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 waitforvisualfinish launchtemplate gThousandArrowsGreenChargeTemplate 0x2 0x1 0x0 playsewithpan SE_W268, SOUND_PAN_ATTACKER @@ -9617,7 +9617,7 @@ Move_THOUSAND_ARROWS:: call ThousandArrowsDown call ThousandArrowsDown waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xC 0x0 0xffff + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0xffff waitforvisualfinish clearmonbg ANIM_ATTACKER blendoff @@ -9674,9 +9674,9 @@ Move_THOUSAND_WAVES:: loadspritegfx ANIM_TAG_FLYING_DIRT @heat wave animation loadspritegfx ANIM_TAG_LEAF @green color loadspritegfx ANIM_TAG_IMPACT @pound hits - monbg SIDE_ATTACKER + monbg ANIM_ATK_PARTNER setalpha 8, 8 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xC 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 waitforvisualfinish playsewithpan SE_W025, SOUND_PAN_ATTACKER launchtemplate gThousandWavesGreenWheelTemplate 0x2 0x1 0x0 @@ -9686,7 +9686,7 @@ Move_THOUSAND_WAVES:: launchtemplate gThousandWavesGreenWheelTemplate 0x2 0x1 0xaa launchtemplate gThousandWavesGreenWheelTemplate 0x2 0x1 0xd5 waitforvisualfinish - clearmonbg SIDE_ATTACKER @I placed this one here, because it ruins the teleport animation + clearmonbg ANIM_ATK_PARTNER @I placed this one here, because it ruins the teleport animation loopsewithpan SE_W004, SOUND_PAN_TARGET, 0x3, 0x15 call ThousandWavesRecover launchtemplate gThousandWavesGreenRecoverTemplate 0x2 0x3 0x28 0xfff6 0xd @@ -9715,7 +9715,7 @@ Move_THOUSAND_WAVES:: delay 0x4 launchtask AnimTask_MoveHeatWaveTargets 0x5 0x0 delay 0xc - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER monbgprio_28 ANIM_TARGET launchtemplate gThousandWavesGreenWaveTemplate 0x28 0x4 0xa 0x900 0x60 0x1 delay 0x2 @@ -9730,10 +9730,10 @@ Move_THOUSAND_WAVES:: waitforvisualfinish launchtask AnimTask_ExtremeSpeedMonReappear 0x2 0x0 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xC 0x0 0xffff + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0xffff waitforvisualfinish blendoff - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER end ThousandWavesRecover: launchtemplate gThousandWavesGreenRecoverTemplate 0x2 0x3 0x28 0x28 0x10 @@ -9803,7 +9803,7 @@ 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 PAL_BG 0x1 0x0 0xE 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xE 0x0 waitforvisualfinish call LandsWrathVortex call LandsWrathVortex @@ -9819,7 +9819,7 @@ Move_LANDS_WRATH:: waitbgfadein waitforvisualfinish call UnsetPsychicBg - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x0 0x0 clearmonbg ANIM_ATTACKER end LandsWrathVortex: @@ -9850,7 +9850,7 @@ Move_LIGHT_OF_RUIN:: waitforvisualfinish launchtask AnimTask_ElectricChargingParticles 0x2 0x4 0x0 0x14 0x0 0x2 panse_1B SE_W076, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xF 0x6B1F + 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 @@ -9889,9 +9889,9 @@ Move_LIGHT_OF_RUIN:: 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 PAL_BG 0x1 0x10 0x0 0x7FFF + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x10 0x0 0x7FFF waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ALL_BANKS 0x1 0x0 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ALL_BATTLERS 0x1 0x0 0x0 0x0 waitforvisualfinish end LightOfRuinBeam: @@ -9950,7 +9950,7 @@ Move_ORIGIN_PULSE:: 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 SIDE_TARGET + monbg ANIM_DEF_PARTNER launchtemplate gOriginPulseBasicSplatTemplate 0x83 0x4 0xffb0 0xfff0 0x1 0x1 stopsound playsewithpan SE_W056, SOUND_PAN_ATTACKER @@ -9968,7 +9968,7 @@ Move_ORIGIN_PULSE:: launchtemplate gOriginPulseBasicSplatTemplate 0x83 0x4 0xffe0 0x5 0x1 0x1 waitsound call UnsetPsychicBg - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER blendoff end @@ -9977,7 +9977,7 @@ 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 SIDE_TARGET + monbg ANIM_DEF_PARTNER monbgprio_28 ANIM_TARGET setalpha 12, 8 fadetobg 0x15 @@ -10016,7 +10016,7 @@ PrecipiceBladesContinue: launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x82, 0x3 ANIM_DEF_PARTNER 0x0 0x6 waitforvisualfinish call UnsetPsychicBg - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER blendoff end PrecipiceBladesOpponent: @@ -10042,16 +10042,16 @@ Move_DRAGON_ASCENT:: invisible ANIM_ATTACKER launchtemplate gDragonAscentFlyUpTemplate 0x2 0x7 0x0 0x0 0x400 0x24 0x15 0x1 ANIM_ATTACKER waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal, 0xa 0x5, (PAL_ATK | PAL_BG | PAL_BG_4 | PAL_BG_5), 4, 0, 14, RGB(21, 31, 27) + 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_W025, SOUND_PAN_ATTACKER waitforvisualfinish playsewithpan SE_W197, SOUND_PAN_ATTACKER launchtask AnimTask_StartSlidingBg, 0x5 0x4, -7304, -784, 1, -1 delay 2 - launchtask AnimTask_BlendBattleAnimPal, 0xa 0x5, (PAL_ATK | PAL_BG | PAL_BG_4 | PAL_BG_5), 0, 14, 0, RGB(21, 31, 27) + 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 SIDE_TARGET + monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_W104, SOUND_PAN_ATTACKER launchtemplate gDragonAscentDrakeTemplate, 2, 0x1 5 @@ -10060,13 +10060,13 @@ Move_DRAGON_ASCENT:: 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, (PAL_ATK | PAL_BG | PAL_BG_4 | PAL_BG_5), 2, 16, 0, RGB(26, 31, 0) + 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 SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER call UnsetPsychicBg end @@ -10076,7 +10076,7 @@ Move_HYPERSPACE_FURY:: loadspritegfx ANIM_TAG_HOOPA_RING @Hoopa Ring loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_POISON_BUBBLE - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xA 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xA 0x0 waitforvisualfinish playsewithpan SE_W171, SOUND_PAN_ATTACKER launchtemplate gHyperspaceFuryRingTemplate 0x3 0x4 0x0 0x0 0x38 0x0 @@ -10151,7 +10151,7 @@ Move_HYPERSPACE_FURY:: invisible ANIM_ATTACKER delay 0x1 visible ANIM_ATTACKER - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x0 0x0 end HyperspaceFuryRandomImpact: launchtemplate gHyperspaceFuryImpactTemplate 0x83 0x2 0x1 0x1 @@ -10217,7 +10217,7 @@ Move_FIRST_IMPRESSION:: Move_BANEFUL_BUNKER:: loadspritegfx ANIM_TAG_PROTECT @protect loadspritegfx ANIM_TAG_POISON_BUBBLE @poison - monbg SIDE_ATTACKER + monbg ANIM_ATK_PARTNER monbgprio_28 ANIM_ATTACKER waitplaysewithpan SE_W115, SOUND_PAN_ATTACKER 0x10 launchtemplate gProtectSpriteTemplate 0x2 0x3 0x18 0x0 0x5a @@ -10237,17 +10237,17 @@ Move_BANEFUL_BUNKER:: delay 0x4 launchtemplate gBanefulBunkerPoisonBubbleTemplate 0x2 0x4 0xc 0x0 0x19 0x0 waitforvisualfinish - clearmonbg SIDE_ATTACKER + clearmonbg ANIM_ATK_PARTNER end Move_SPIRIT_SHACKLE:: loadspritegfx ANIM_TAG_SPIRIT_ARROW @Arrow loadspritegfx ANIM_TAG_CHAIN_LINK @Chain - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER monbgprio_28 ANIM_TARGET setalpha 12, 8 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x10 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x10 0x0 waitforvisualfinish playsewithpan SE_W013B, SOUND_PAN_ATTACKER launchtemplate gSpiritShackleArrowTemplate 0x82 0x5 0x10 0x0 0x0 0x0 0xf @@ -10261,9 +10261,9 @@ Move_SPIRIT_SHACKLE:: delay 0x4 launchtemplate gSpiritShackleChainTemplate 0x82 0x2 0xfff0 0x10 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x10 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x10 0x0 0x0 waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER blendoff end @@ -10275,7 +10275,7 @@ Move_DARKEST_LARIAT:: waitbgfadein loadspritegfx ANIM_TAG_IMPACT @hit loadspritegfx ANIM_TAG_POISON_BUBBLE @purple color - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_W104, SOUND_PAN_ATTACKER waitplaysewithpan SE_W004, SOUND_PAN_TARGET, 0xa @@ -10293,7 +10293,7 @@ Move_DARKEST_LARIAT:: call DarkestLariatImpact call DarkestLariatImpact waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER blendoff call UnsetPsychicBg end @@ -10313,7 +10313,7 @@ Move_SPARKLING_ARIA:: loadspritegfx ANIM_TAG_HYDRO_PUMP @hydro pump monbg ANIM_ATTACKER setblends 0x80E - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xE 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xE 0x0 waitforvisualfinish launchtemplate gSparklingAriaBlueChargeTemplate 0x2 0x1 0x0 call SparklingAriaCharge @@ -10325,7 +10325,7 @@ Move_SPARKLING_ARIA:: call SparklingAriaRain call SparklingAriaRain waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xE 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xE 0x0 0x0 waitforvisualfinish clearmonbg ANIM_ATTACKER blendoff @@ -10406,7 +10406,7 @@ Move_ICE_HAMMER:: loadspritegfx ANIM_TAG_ECLIPSING_ORB @gray color loadspritegfx ANIM_TAG_BLACK_SMOKE @smoke setalpha 12, 8 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xC 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 waitforvisualfinish playsewithpan SE_W104, SOUND_PAN_TARGET launchtemplate gIceHammerPunchStompTemplate 0x83, 0x3 0x0 0xffe0 0xf @@ -10426,7 +10426,7 @@ Move_ICE_HAMMER:: 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 PAL_BG 0x1 0xC 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 waitforvisualfinish blendoff end @@ -10543,17 +10543,17 @@ Move_HIGH_HORSEPOWER:: loadspritegfx ANIM_TAG_HORSESHOE_SIDE_FIST @horseshoe monbg ANIM_TARGET delay 0x2 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x0 0x0 0x10 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x0 0x0 0x10 0x0 setalpha 12, 8 playsewithpan SE_W025, SOUND_PAN_TARGET launchtemplate gHighHorsepowerHorseshoeTemplate 0x3 0x4 0x0 0x0 0x1 0x32 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x2 0x0 0x7 0x7fff + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0x0 0x7 0x7fff delay 0x32 playsewithpan SE_W025B, 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 PAL_DEF 0x2 0x0 0x0 0x7fff + 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 @@ -10571,7 +10571,7 @@ Move_STRENGTH_SAP:: loadspritegfx ANIM_TAG_PINK_PETAL @pink color loadspritegfx ANIM_TAG_ORBS @absorb loadspritegfx ANIM_TAG_SPARKLE_2 @stars - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER playsewithpan SE_W120, SOUND_PAN_TARGET launchtemplate gStrengthSapRedSmokeTemplate 0x82, 0x4, 0x8 0x3 0x1 0x0 launchtemplate gStrengthSapRedInwardTemplate 0x4 0x3 0x46 0x0 0x6 @@ -10599,7 +10599,7 @@ Move_STRENGTH_SAP:: delay 0x2 launchtemplate gStrengthSapRedSmokeTemplate 0x82, 0x4, 0xfff8 0x8 0x1 0x0 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x3 0x07FD + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x3 0x07FD delay 0x5 playsewithpan SE_W152, SOUND_PAN_TARGET launchtemplate gStrengthSapAbsorbTemplate 0x3 0x4 0x0 0x5 0x8 0x1a @@ -10625,11 +10625,11 @@ Move_STRENGTH_SAP:: playsewithpan SE_W152, SOUND_PAN_TARGET launchtemplate gStrengthSapAbsorbTemplate 0x3 0x4 0x5 0xffee 0xffec 0x23 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x3 0x0 0x07FD + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x3 0x0 0x07FD loopsewithpan SE_W215, SOUND_PAN_ATTACKER, 0x10, 0x3 call GrantingStarsEffect waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER end @@ -10643,7 +10643,7 @@ SolarBladeUnleash: loadspritegfx ANIM_TAG_SUNLIGHT @sun rays monbg ANIM_ATTACKER setblends 0x30d - createvisualtask AnimTask_BlendBattleAnimPal 10, (PAL_BG | PAL_ALL_BANKS), 1, 0, 6, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal 10, (ANIM_PAL_BG | ANIM_PAL_ALL_BATTLERS), 1, 0, 6, 0x7fff waitforvisualfinish playsewithpan SE_W014, SOUND_PAN_ATTACKER launchtask AnimTask_TranslateMonEllipticalRespectSide 0x2 0x5 0x0 0x10 0x6 0x1 0x4 @@ -10660,7 +10660,7 @@ SolarBladeUnleash: delay 0x2 launchtask AnimTask_ShakeMon2 0x2 0x5 ANIM_TARGET 0x2 0x0 0xC 0x1 waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal 10, (PAL_BG | PAL_ALL_BANKS), 1, 6, 0, 0x7fff + createvisualtask AnimTask_BlendBattleAnimPal 10, (ANIM_PAL_BG | ANIM_PAL_ALL_BATTLERS), 1, 6, 0, 0x7fff waitforvisualfinish call UnsetPsychicBg clearmonbg ANIM_ATTACKER @@ -10675,7 +10675,7 @@ SolarBladeSunRays: Move_LEAFAGE:: loadspritegfx ANIM_TAG_RAZOR_LEAF @leaf loadspritegfx ANIM_TAG_IMPACT @hit - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER playsewithpan SE_W013B, 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 @@ -10684,7 +10684,7 @@ Move_LEAFAGE:: playsewithpan SE_W013, SOUND_PAN_TARGET launchtemplate gLeafageImpactTemplate 0x2 0x4 0x0 0x0 0x1 0x2 waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER end @@ -10708,9 +10708,9 @@ Move_TOXIC_THREAD:: 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 SIDE_TARGET + monbg ANIM_DEF_PARTNER delay 0x0 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x9 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x9 0x0 waitforvisualfinish loopsewithpan SE_W081, SOUND_PAN_ATTACKER, 0x9, 0x6 call SpiderWebThread @@ -10739,10 +10739,10 @@ Move_TOXIC_THREAD:: delay 0x4 launchtemplate gToxicThreadString 0x82 0x2 0x0 0x16 waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER delay 0x1 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x9 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x9 0x0 0x0 end @@ -10751,14 +10751,14 @@ Move_LASER_FOCUS:: loadspritegfx ANIM_TAG_OPENING_EYE @eyes loadspritegfx ANIM_TAG_LEER @leer monbg ANIM_ATTACKER - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xC 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 waitforvisualfinish launchtemplate gLaserFocusRedEyesTemplate 0x5 0x4 0x0 0x0 0x0 0x0 waitforvisualfinish playsewithpan SE_W043, SOUND_PAN_ATTACKER launchtemplate gLeerSpriteTemplate 0x2 0x2 0x18 0xfff4 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xC 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 waitforvisualfinish clearmonbg ANIM_ATTACKER end @@ -10767,7 +10767,7 @@ Move_LASER_FOCUS:: Move_GEAR_UP:: loadspritegfx ANIM_TAG_GEAR loadspritegfx ANIM_TAG_SPARK_2 @sparks - launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 PAL_ATK 0x2 0x0 0x9 0x039B + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 ANIM_PAL_ATK 0x2 0x0 0x9 0x039B launchtemplate gGearUpGearsTemplate 0x2 0x4 0x0 0xffe8 0x8 0x8c playsewithpan SE_TAMAKORO_E, SOUND_PAN_ATTACKER launchtemplate gSparkElectricitySpriteTemplate 0x0 0x7 0x20 0x18 0xbe 0xc 0x0 0x1 0x0 @@ -10799,7 +10799,7 @@ Move_GEAR_UP:: 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 PAL_ATK 0x2 0x9 0x0 0x039B + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 ANIM_PAL_ATK 0x2 0x9 0x0 0x039B waitforvisualfinish end GearUpSparks: @@ -10822,7 +10822,7 @@ 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 SIDE_TARGET + monbg ANIM_DEF_PARTNER monbgprio_28 ANIM_TARGET setalpha 12, 8 playsewithpan SE_W104, SOUND_PAN_TARGET @@ -10849,13 +10849,13 @@ Move_THROAT_CHOP:: waitforvisualfinish launchtask AnimTask_InvertScreenColor 0x2 0x3 0x101 0x101 0x101 waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER blendoff end Move_POLLEN_PUFF:: - launchtask AnimTask_IsTargetPartner 0x5 0x0 + launchtask AnimTask_IsTargetSameSide 0x5 0x0 jumpargeq 0x0, 0x1, PollenPuffAlly PollenPuffOpponent: loadspritegfx ANIM_TAG_SPARKLE_2 @stars @@ -10867,7 +10867,7 @@ PollenPuffOpponent: loadspritegfx ANIM_TAG_ORBS @hit monbg ANIM_ATTACKER setalpha 12, 8 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x8 0x0 + 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 @@ -10910,7 +10910,7 @@ PollenPuffOpponent: 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 PAL_BG 0x1 0x8 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x8 0x0 0x0 waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -10923,7 +10923,7 @@ PollenPuffAlly: loadspritegfx ANIM_TAG_SPORE @ball monbg ANIM_ATTACKER setalpha 12, 8 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x8 0x0 + 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 @@ -10964,7 +10964,7 @@ PollenPuffAlly: delay 0x7 launchtemplate gPollenPuffHealTemplate 0x2 0x4 0xa 0xfffb 0x1 0x0 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x8 0x1 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x8 0x1 0x0 waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -11032,7 +11032,7 @@ Move_LUNGE:: loadspritegfx ANIM_TAG_LEAF @green loadspritegfx ANIM_TAG_RAZOR_LEAF @green loadspritegfx ANIM_TAG_SMALL_BUBBLES @ball - monbg SIDE_ATTACKER + monbg ANIM_ATK_PARTNER launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_ATTACKER 0x3 0x0 0xf0 0x0 loopsewithpan SE_W060B, SOUND_PAN_ATTACKER, 0xe, 0xa launchtemplate gLungeGreenChargeTemplate 0x2 0x0 @@ -11040,13 +11040,13 @@ Move_LUNGE:: delay 0x3e playsewithpan SE_W100, SOUND_PAN_ATTACKER delay 0x15 - clearmonbg SIDE_ATTACKER + clearmonbg ANIM_ATK_PARTNER invisible ANIM_ATTACKER waitforvisualfinish playsewithpan SE_W039, SOUND_PAN_ATTACKER launchtemplate gLungeGreenBubbleTemplate 0x82 0x6 0xa 0x0 0x0 0x0 0x19 0xffe0 delay 0xF - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER delay 0x1 launchtemplate gTealAlertSpriteTemplate 0x4 0x3 0x46 0x0 0x6 launchtemplate gTealAlertSpriteTemplate 0x4 0x3 0x28 0x28 0x6 @@ -11074,13 +11074,13 @@ Move_LUNGE:: launchtemplate gLungeGreenImpactTemplate 0x2 0x4 0x0 0x0 0x1 0x2 waitforvisualfinish visible ANIM_ATTACKER - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER end Move_FIRE_LASH:: loadspritegfx ANIM_TAG_SMALL_EMBER - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER monbgprio_2A ANIM_TARGET launchtemplate gFireSpiralOutwardSpriteTemplate 0x3 0x4 0x0 0x0 0x38 0x0 playsewithpan SE_W172, SOUND_PAN_ATTACKER @@ -11118,7 +11118,7 @@ Move_FIRE_LASH:: delay 0x7 launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_ATTACKER 0x0 0x9 waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER end @@ -11127,11 +11127,11 @@ Move_POWER_TRIP:: loadspritegfx ANIM_TAG_HANDS_AND_FEET @black color loadspritegfx ANIM_TAG_PURPLE_FLAME @dark violet color loadspritegfx ANIM_TAG_IMPACT @hit - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER playsewithpan SE_W082, SOUND_PAN_ATTACKER call PowerTripBuffUp delay 0x8 - launchtask AnimTask_BlendColorCycle 0x2 0x6 PAL_ATK 0x2 0x2 0x0 0xb 0x0 + 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 @@ -11149,7 +11149,7 @@ Move_POWER_TRIP:: launchtemplate gPowerTripImpactTemplate 0x2 0x4 0xA 0x0 0x1 0x2 launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0003 0x0000 0x0006 0x0001 waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER end PowerTripBuffUp: launchtemplate gPowerTripFocusEnergyTemplate 0x2 0x4 0x0 0xffe8 0x1a 0x2 @@ -11169,13 +11169,13 @@ Move_BURN_UP:: loadspritegfx ANIM_TAG_SMALL_RED_EYE @red color loadspritegfx ANIM_TAG_PINK_CLOUD @yawn loadspritegfx ANIM_TAG_SMALL_EMBER @fire - monbg SIDE_TARGET + 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 PAL_BG 0x1 0x0 0x5 0x1c + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x5 0x1c waitforvisualfinish launchtask AnimTask_AllocBackupPalBuffer 0x5 0x0 waitforvisualfinish @@ -11186,7 +11186,7 @@ Move_BURN_UP:: loopsewithpan SE_W036, SOUND_PAN_ATTACKER 0x9 0x2 launchtask AnimTask_CopyPalUnfadedToBackup 0x5 0x2 0x1 0x0 delay 0x1 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x1 0x0 0xd 0x1c + 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 @@ -11197,14 +11197,14 @@ Move_BURN_UP:: delay 0x1 launchtask AnimTask_CopyPalFadedToUnfaded 0x5 0x1 0x1 delay 0x1 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x0 0x0 0xd 0x4a52 + 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 PAL_DEF 0x2 0x0 0xC 0x1C + 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 PAL_BG 0x1 0x5 0x0 0x1c + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x5 0x0 0x1c delay 0x1 launchtask AnimTask_CopyPalUnfadedFromBackup 0x5 0x2 0x1 0x0 delay 0x1 @@ -11212,15 +11212,15 @@ Move_BURN_UP:: launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_TARGET 0x2 0x0 0xf 0x1 call FireSpreadEffect waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_ATK 0x0 0xd 0x0 0x4a52 + 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 PAL_DEF 0x2 0xC 0x0 0x1C + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 ANIM_PAL_DEF 0x2 0xC 0x0 0x1C waitforvisualfinish call UnsetPsychicBg - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER blendoff end @@ -11274,7 +11274,7 @@ Move_SMART_STRIKE:: delay 0x78 setarg 0x7 0xffff waitforvisualfinish - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER monbgprio_28 ANIM_TARGET setalpha 12, 8 call SonicBoomProjectile @@ -11291,7 +11291,7 @@ Move_SMART_STRIKE:: launchtemplate gSmartStrikeGemTemplate 0x82 0x5 0x1 0x1 0xffe8 0x0 0xa launchtemplate gSmartStrikeGemTemplate 0x82 0x5 0x1 0x1 0xffef 0xffef 0xa waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER blendoff waitforvisualfinish clearmonbg ANIM_ATTACKER @@ -11336,7 +11336,7 @@ Move_REVELATION_DANCE:: loadspritegfx ANIM_TAG_AIR_WAVE @sonicboom loadspritegfx ANIM_TAG_THIN_RING @ring monbg ANIM_TARGET - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xF 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xF 0x0 waitforvisualfinish playsewithpan SE_W080, SOUND_PAN_ATTACKER launchtask AnimTask_RockMonBackAndForth 0x5 0x3 0x0 0x2 0x0 @@ -11377,7 +11377,7 @@ Move_REVELATION_DANCE:: 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 PAL_BG 0x1 0xF 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xF 0x0 0x0 waitforvisualfinish clearmonbg ANIM_TARGET end @@ -11606,7 +11606,7 @@ Move_TROP_KICK:: loadspritegfx ANIM_TAG_HANDS_AND_FEET @kick loadspritegfx ANIM_TAG_LEAF @leaves loadspritegfx ANIM_TAG_FLOWER @flowers - monbg SIDE_TARGET + 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_W233B, SOUND_PAN_TARGET @@ -11620,7 +11620,7 @@ Move_TROP_KICK:: launchtemplate gTropKickLeavesTemplate 0x81 0x5 0x0 0xa 0xff20 0xffe0 0x28 launchtemplate gTropKickLeavesTemplate 0x81 0x5 0x0 0xa 0x70 0xff80 0x28 waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER end @@ -11635,7 +11635,7 @@ Move_INSTRUCT:: launchtask AnimTask_HardwarePaletteFade 0x2 0x5 0xf8 0x3 0x0 0xa 0x0 waitforvisualfinish launchtemplate gSpotlightSpriteTemplate 0x82 0x2 0x0 0xfff8 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x2 0x0 0x8 0x7DB9 + 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 @@ -11648,7 +11648,7 @@ Move_INSTRUCT:: launchtask AnimTask_BlendMonInAndOut 0x5 0x5 0x0 0x37b 0xc 0x1 0x1 playsewithpan SE_W020, SOUND_PAN_TARGET delay 0x1D - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x2 0x8 0x0 0x7DB9 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0x8 0x0 0x7DB9 waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -11659,13 +11659,13 @@ Move_BEAK_BLAST:: loadspritegfx ANIM_TAG_SMALL_EMBER @Fire playsewithpan SE_W082, SOUND_PAN_ATTACKER delay 0x3 - launchtask AnimTask_BlendColorCycle 0x2 0x6 PAL_ATK 0x2 0x2 0x0 0xb 0x1f + 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 PAL_ATK 0x2 0x0 0x9 0x1F + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 ANIM_PAL_ATK 0x2 0x0 0x9 0x1F waitforvisualfinish launchtemplate gBowMonSpriteTemplate 0x2 0x1 0x0 playsewithpan SE_W029, SOUND_PAN_ATTACKER @@ -11681,7 +11681,7 @@ BeakBlastUnleash: waitforvisualfinish launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_ATTACKER 0x0 0x6 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 PAL_ATK 0x2 0x9 0x0 0x1F + launchtask AnimTask_BlendBattleAnimPal 0xA 0x5 ANIM_PAL_ATK 0x2 0x9 0x0 0x1F waitforvisualfinish end @@ -11689,9 +11689,9 @@ BeakBlastUnleash: Move_CLANGING_SCALES:: loadspritegfx ANIM_TAG_METAL_SOUND_WAVES @metal sound loadspritegfx ANIM_TAG_POISON_BUBBLE @purple color - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER monbgprio_2A 0x1 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xC 0x2002 + 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 @@ -11703,9 +11703,9 @@ Move_CLANGING_SCALES:: 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 SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER delay 0x0 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xC 0x0 0x2002 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x2002 waitforvisualfinish end ClangingScalesMetalSound: @@ -11798,7 +11798,7 @@ Move_AURORA_VEIL:: waitbgfadeout launchtask AnimTask_StartSlidingBg 0x5 0x4 0x400 0x0 0x0 0xffff waitbgfadein - monbg SIDE_ATTACKER + monbg ANIM_ATK_PARTNER setalpha 8, 8 playsewithpan SE_W208, SOUND_PAN_ATTACKER launchtemplate gAuroraVeilRingTemplate 0x2 0x0 @@ -11812,7 +11812,7 @@ Move_AURORA_VEIL:: waitforvisualfinish call UnsetPsychicBg waitforvisualfinish - clearmonbg SIDE_ATTACKER + clearmonbg ANIM_ATK_PARTNER blendoff end @@ -12018,7 +12018,7 @@ Move_FLEUR_CANNON:: loadspritegfx ANIM_TAG_PINK_HEART @pink color setalpha 12, 8 monbg ANIM_TARGET - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xF 0x7440 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xF 0x7440 waitforvisualfinish panse_1B SE_W076, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_ATTACKER 0x0 0x4 0x32 0x1 @@ -12052,7 +12052,7 @@ Move_FLEUR_CANNON:: delay 0x5 launchtask AnimTask_ShakeMon 0x5 0x5 ANIM_TARGET 0x0 0x5 0xb 0x1 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x10 0x0 0x7440 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x10 0x0 0x7440 waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -12164,7 +12164,7 @@ Move_SHADOW_BONE:: loadspritegfx ANIM_TAG_IMPACT fadetobg BG_NIGHTMARE waitbgfadein - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER monbgprio_28 ANIM_TARGET setalpha 12, 8 playsewithpan SE_W155, SOUND_PAN_TARGET @@ -12189,7 +12189,7 @@ Move_SHADOW_BONE:: Move_ACCELEROCK:: loadspritegfx ANIM_TAG_ROCKS loadspritegfx ANIM_TAG_IMPACT - monbg SIDE_ATTACKER + 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 @@ -12204,7 +12204,7 @@ Move_ACCELEROCK:: launchtemplate gRockFragmentSpriteTemplate 0x82 0x6 0xfffb 0x0 0xffec 0xffe8 0xe 0x2 launchtemplate gHorizontalLungeSpriteTemplate 0x2 0x5 0x1 0x3 0x0 0x5 0x1 waitforvisualfinish - clearmonbg SIDE_ATTACKER + clearmonbg ANIM_ATK_PARTNER blendoff waitforvisualfinish end @@ -12225,7 +12225,7 @@ Move_LIQUIDATION:: waitforvisualfinish call RisingWaterHitEffect waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER blendoff end @@ -12242,7 +12242,7 @@ Move_PRISMATIC_LASER:: loadspritegfx ANIM_TAG_NEEDLE @sting monbg ANIM_ATTACKER setblends 0x80E - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x10 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x10 0x0 playsewithpan SE_ELEBETA, SOUND_PAN_ATTACKER launchtemplate gPrismaticLaserChargeTemplate 0x2 0x1 0x0 call PrismaticLaserInwardSpikes @@ -12277,7 +12277,7 @@ Move_PRISMATIC_LASER:: call PrismaticLaserRain call PrismaticLaserRain waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x10 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x10 0x0 0x0 waitforvisualfinish clearmonbg ANIM_ATTACKER blendoff @@ -12498,7 +12498,7 @@ Move_SUNSTEEL_STRIKE:: loadspritegfx ANIM_TAG_SMALL_RED_EYE @red color loadspritegfx ANIM_TAG_IMPACT @hit playsewithpan SE_TAMA, SOUND_PAN_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 10, (PAL_BG | PAL_ATK), 3, 0, 15, 0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (ANIM_PAL_BG | ANIM_PAL_ATK), 3, 0, 15, 0 waitforvisualfinish call SunsteelStrikeBeam call SunsteelStrikeBeam @@ -12527,7 +12527,7 @@ Move_SUNSTEEL_STRIKE:: playsewithpan SE_W007, SOUND_PAN_TARGET waitforvisualfinish visible ANIM_ATTACKER - createvisualtask AnimTask_BlendBattleAnimPal, 10, (PAL_BG | PAL_ATK), 3, 15, 0, 0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, (ANIM_PAL_BG | ANIM_PAL_ATK), 3, 15, 0, 0 waitforvisualfinish blendoff clearmonbg ANIM_TARGET @@ -12548,7 +12548,7 @@ Move_MOONGEIST_BEAM:: loadspritegfx ANIM_TAG_WATER_GUN @water gun colour loadspritegfx ANIM_TAG_ASSURANCE_HAND @purple colour setalpha 8, 8 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x10 0x0 + 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 @@ -12571,7 +12571,7 @@ Move_MOONGEIST_BEAM:: call MoongeistBeamOrbs call MoongeistBeamOrbs launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0x4 0x0 0x32 0x1 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x2 0x0 0xb 0x6739 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0x0 0xb 0x6739 call MoongeistBeamOrbs call MoongeistBeamOrbs call MoongeistBeamOrbs @@ -12601,7 +12601,7 @@ Move_MOONGEIST_BEAM:: call MoongeistBeamOrbs call MoongeistBeamOrbs call MoongeistBeamOrbs - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x2 0xb 0x0 0x6739 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0xb 0x0 0x6739 delay 0x1A stopsound launchtask AnimTask_MoonlightEndFade 0x2 0x0 @@ -12625,8 +12625,8 @@ MoongeistBeamOrbs: Move_TEARFUL_LOOK:: loadspritegfx ANIM_TAG_SMALL_BUBBLES @tears loadspritegfx ANIM_TAG_OPENING_EYE @eye - monbg SIDE_TARGET - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x5 0x7DE0 + monbg ANIM_DEF_PARTNER + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x5 0x7DE0 waitforvisualfinish playsewithpan SE_W109, SOUND_PAN_TARGET launchtemplate gOpeningEyeSpriteTemplate 0x5 0x4 0x0 0x0 0x1 0x0 @@ -12643,9 +12643,9 @@ Move_TEARFUL_LOOK:: launchtemplate gTearDropSpriteTemplate 0x2 0x2 0x1 0x2 launchtemplate gTearDropSpriteTemplate 0x2 0x2 0x1 0x3 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x5 0x0 0x7DE0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x5 0x0 0x7DE0 waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER end @@ -12788,12 +12788,12 @@ Move_MULTI_ATTACK:: loadspritegfx ANIM_TAG_FOCUS_ENERGY @focus energy loadspritegfx ANIM_TAG_CUT @cut monbg ANIM_TARGET - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xC 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 waitforvisualfinish playsewithpan SE_W082, SOUND_PAN_ATTACKER call MultiAttackBuff delay 0x8 - launchtask AnimTask_BlendColorCycle 0x2 0x6 PAL_ATK 0x2 0x2 0x0 0xb 0x7fff + 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 @@ -12805,7 +12805,7 @@ Move_MULTI_ATTACK:: launchtemplate gCuttingSliceSpriteTemplate 0x2 0x3 0x28 0xffd0 0x0 launchtask AnimTask_ShakeMon 0x2 0x5 ANIM_TARGET 0x0 0x3 0xf 0x1 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xC 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 waitforvisualfinish clearmonbg ANIM_TARGET end @@ -12830,7 +12830,7 @@ Move_MIND_BLOWN:: loadspritegfx ANIM_TAG_IMPACT @hit monbg ANIM_TARGET setalpha 12, 8 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xC 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xC 0x0 waitforvisualfinish playsewithpan SE_RU_HYUU, SOUND_PAN_TARGET launchtemplate gMindBlownHeadTemplate 0x82, 0x3, 0x0 0x0 0x25 @@ -12853,7 +12853,7 @@ Move_MIND_BLOWN:: call MindBlownBlueOrbs delay 0x1 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xC 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 waitforvisualfinish blendoff clearmonbg ANIM_TARGET @@ -12889,7 +12889,7 @@ Move_PLASMA_FISTS:: loadspritegfx ANIM_TAG_LIGHTNING @thunder punch monbg ANIM_ATTACKER setalpha 12, 8 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0x10 0x0 + 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 @@ -12925,14 +12925,14 @@ Move_PLASMA_FISTS:: waitforvisualfinish call PlasmaFistsImpact waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xC 0x0 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xC 0x0 0x0 waitforvisualfinish clearmonbg ANIM_TARGET blendoff end PlasmaFistSpark1: playsewithpan SE_W268, SOUND_PAN_ATTACKER - launchtask AnimTask_BlendColorCycle 0x2 0x6 PAL_ATK 0x0 0x2 0x0 0xb 0x5bff + 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 @@ -13006,7 +13006,7 @@ Move_PHOTON_GEYSER:: delay 0xA call PhotonGeyserSparks2 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0x0 0xF 0x0 + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0xF 0x0 clearmonbg ANIM_ATTACKER playsewithpan SE_W086, SOUND_PAN_ATTACKER unloadspritegfx ANIM_TAG_ORBS @recover @@ -13034,13 +13034,13 @@ Move_PHOTON_GEYSER:: unloadspritegfx ANIM_TAG_AIR_WAVE_2 @white/gray color @Shoot beam to the sky loadspritegfx ANIM_TAG_STRAIGHT_BEAM - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x6 0x0 0x10 0x43FF @Light yellow + 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_W076, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 call PhotonGeyserBeam waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_DEF 0x1 0x10 0x0 0x43FF @Light yellow - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xF 0x0 0x0 + 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 @@ -13083,7 +13083,7 @@ Move_DOUBLE_IRON_BASH:: loopsewithpan SE_W231, SOUND_PAN_ATTACKER, 0x1c, 0x2 launchtask AnimTask_MetallicShine 0x5 0x3 0x0 0x0 0x0 waitforvisualfinish - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER monbgprio_28 ANIM_TARGET setalpha 12, 8 loopsewithpan SE_W017, SOUND_PAN_ATTACKER, 0x14, 0x2 @@ -13103,7 +13103,7 @@ Move_DOUBLE_IRON_BASH:: waitforvisualfinish delay 0x3 launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_TARGET 0x0 0x7 - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER blendoff end @@ -13115,7 +13115,7 @@ Move_DYNAMAX_CANNON:: Move_SNIPE_SHOT:: loadspritegfx ANIM_TAG_IMPACT_2 loadspritegfx ANIM_TAG_LEER - launchtask AnimTask_BlendBattleAnimPal 10 5 PAL_BG 0 0 16, 0 @;Black + launchtask AnimTask_BlendBattleAnimPal 10 5 ANIM_PAL_BG 0 0 16, 0 @;Black waitforvisualfinish launchtemplate gLeerSpriteTemplate 0x82, 2 0x18 -12 playsewithpan SE_W197, SOUND_PAN_ATTACKER @@ -13126,7 +13126,7 @@ Move_SNIPE_SHOT:: waitforvisualfinish launchtask AnimTask_ShakeMon2 2 5 1 4 0 8, 1 waitforvisualfinish - launchtask AnimTask_BlendBattleAnimPal 10 5 PAL_BG 0 16, 0 0 @;Black + launchtask AnimTask_BlendBattleAnimPal 10 5 ANIM_PAL_BG 0 16, 0 0 @;Black waitforvisualfinish end @@ -13136,7 +13136,7 @@ Move_JAW_LOCK:: 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 PAL_BG 0x1 0x0 0x7 0x0 @Black + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x7 0x0 @Black waitforvisualfinish playsewithpan SE_W044, SOUND_PAN_TARGET launchtemplate gJawLockTeethTemplate 0x2 0x7 0xffe0 0xffe0 0x1 0x333 0x333 0xa 15 @@ -13145,7 +13145,7 @@ Move_JAW_LOCK:: 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 PAL_BG 0x1 0x7 0x0 0x0 @;Black + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x7 0x0 0x0 @;Black waitforvisualfinish clearmonbg ANIM_TARGET delay 0x1 @@ -13212,7 +13212,7 @@ Move_TAR_SHOT:: playsewithpan SE_W145C, SOUND_PAN_ATTACKER delay 0xf launchtask AnimTask_ShakeMon2 0x5 0x5 ANIM_TARGET 0x2 0x0 0xa 0x1 - launchtask AnimTask_BlendColorCycle 0x2 0x6 PAL_DEF 0x2 0x2 0x0 0x10 0x0 @;Black + 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_W145, SOUND_PAN_TARGET delay 0xa @@ -13285,7 +13285,7 @@ Move_OCTOLOCK:: delay 0x8 launchtask AnimTask_ShakeMon2 0x2 0x5 0x1 0x3 0x0 0x6 0x1 delay 0x14 - launchtask AnimTask_BlendColorCycle 0x2 0x6 PAL_DEF 0x2 0x2 0x0 0x8 0x1f + launchtask AnimTask_BlendColorCycle 0x2 0x6 ANIM_PAL_DEF 0x2 0x2 0x0 0x8 0x1f playsewithpan SE_W020, SOUND_PAN_TARGET setarg 0x7 0xffff waitforvisualfinish @@ -13418,8 +13418,8 @@ Move_CLANGOROUS_SOUL:: 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, RIGHT_FIST, 1 - createsprite gClangorousSoulRedFistTemplate, ANIM_ATTACKER, 2, 0x10, 0, 0, 0, 10, ANIM_ATTACKER, LEFT_FIST, 1 + 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_W233B, SOUND_PAN_TARGET waitforvisualfinish loadspritegfx ANIM_TAG_THIN_RING @ring @@ -13539,7 +13539,7 @@ Move_PYRO_BALL:: playsewithpan SE_DANSA, SOUND_PAN_ATTACKER @;Hop delay 0x19 playsewithpan SE_W172, SOUND_PAN_TARGET - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x3 0x0 0x7 0x043D + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x3 0x0 0x7 0x043D launchtemplate gPyroBallBurningRockTemplate, 2, 0x3, 0, 0, 0 delay 0x19 playsewithpan SE_W172, SOUND_PAN_TARGET @@ -13550,11 +13550,11 @@ Move_PYRO_BALL:: playsewithpan SE_W172B, SOUND_PAN_TARGET launchtemplate gPyroBallEmberBallTemplate, 2, 0x6, 0, 10, 0, 5, 20, -20 waitforvisualfinish - launchtask AnimTask_BlendColorCycle 0x2 0x6 PAL_DEF 0x2 0x2 0x0 0xc 0x1f + 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 PAL_BG 0x1 0x7 0x0 0x043D + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x7 0x0 0x043D waitforvisualfinish end @@ -13575,7 +13575,7 @@ Move_AURA_WHEEL:: 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 SIDE_TARGET + monbg ANIM_DEF_PARTNER monbgprio_2A 0x1 launchtemplate gAuraWheelBlueElectricityTemplate 3, 0x4 0x0 0x0 0x38 0x0 playsewithpan SE_W085B, SOUND_PAN_ATTACKER @@ -13611,7 +13611,7 @@ Move_AURA_WHEEL:: delay 0x7 launchtemplate gSlideMonToOriginalPosSpriteTemplate 2, 0x3 0x0 0x0 0x9 waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER blendoff end @@ -13784,7 +13784,7 @@ Move_STRANGE_STEAM:: loadspritegfx ANIM_TAG_FINGER loadspritegfx ANIM_TAG_WATER_GUN @blue colour createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_FINGER, 0, 10, 10, 0x4798 @Green - monbg SIDE_TARGET + monbg ANIM_DEF_PARTNER monbgprio_28 ANIM_TARGET loopsewithpan SE_W172, SOUND_PAN_ATTACKER, 0x4, 0xA call StrangeSteamCloud @@ -13800,7 +13800,7 @@ Move_STRANGE_STEAM:: call StrangeSteamCloud call StrangeSteamCloud waitforvisualfinish - clearmonbg SIDE_TARGET + clearmonbg ANIM_DEF_PARTNER end StrangeSteamCloud: launchtemplate gStrangeSteamPinkCloudTemplate 0x82 0x5 0xf 0xf 0x14 0x0 0x0 @@ -13815,7 +13815,7 @@ StrangeSteamCloud: Move_LIFE_DEW:: loadspritegfx ANIM_TAG_WATER_DROPLET loadspritegfx ANIM_TAG_BLUE_STAR - monbg SIDE_ATTACKER + monbg ANIM_ATK_PARTNER launchtemplate gLifeDewDropletTemplate, 2, 0x3, 0, 0, ANIM_ATTACKER launchtemplate gLifeDewDropletTemplate, 2, 0x3, 0, 0, ANIM_ATK_PARTNER delay 0x15 @@ -13835,7 +13835,7 @@ Move_LIFE_DEW:: launchtemplate gLifeDewSpecialOrbsTemplate, 2, 0x4, 10, -5, ANIM_ATK_PARTNER, FALSE delay 0x7 waitforvisualfinish - clearmonbg SIDE_ATTACKER + clearmonbg ANIM_ATK_PARTNER end @@ -13849,7 +13849,7 @@ Move_OBSTRUCT:: call RoarEffect waitforvisualfinish delay 0x10 - monbg SIDE_ATTACKER + monbg ANIM_ATK_PARTNER monbgprio_28 ANIM_ATTACKER waitplaysewithpan SE_W115, SOUND_PAN_ATTACKER, 0x10 launchtemplate gProtectSpriteTemplate, 2, 0x3 0x18 0x0 0x5a @;Protect @@ -13857,7 +13857,7 @@ Move_OBSTRUCT:: launchtemplate gObstructCrossTemplate, 2, 0x4 0x0 0x0 0x1 0x24 playsewithpan SE_W043, SOUND_PAN_TARGET waitforvisualfinish - clearmonbg SIDE_ATTACKER + clearmonbg ANIM_ATK_PARTNER end @@ -13870,7 +13870,7 @@ Move_METEOR_ASSAULT:: 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, PAL_ATK, 1, 0, 9, 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_W268, SOUND_PAN_ATTACKER waitforvisualfinish @@ -13878,13 +13878,13 @@ Move_METEOR_ASSAULT:: launchtemplate gGrowingSuperpowerTemplate, 0x83, 0x1 0x0 playsewithpan SE_W207, SOUND_PAN_ATTACKER delay 0xF - createvisualtask AnimTask_BlendBattleAnimPal, 10, (PAL_ATK | PAL_BG), 1, 0x10, 0x10, 0x7FFF @Screen flash white + 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, (PAL_ATK | PAL_BG), 1, 0x10, 0, 0x7FFF @Screen revert from white + createvisualtask AnimTask_BlendBattleAnimPal, 10, (ANIM_PAL_ATK | ANIM_PAL_BG), 1, 0x10, 0, 0x7FFF @Screen revert from white waitforvisualfinish end BasicExplosion: @@ -13913,7 +13913,7 @@ Move_STEEL_BEAM:: loadspritegfx ANIM_TAG_ELECTRIC_ORBS loadspritegfx ANIM_TAG_GUST loadspritegfx ANIM_TAG_SPIKES - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x0 0x0 0x10 0x6B59 @To gray + 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_W268, SOUND_PAN_ATTACKER delay 0x14 @@ -13940,7 +13940,7 @@ Move_STEEL_BEAM:: call SteelBeamShards waitforvisualfinish launchtemplate gSlideMonToOriginalPosSpriteTemplate 0x2 0x3 ANIM_TARGET 0x0 0x6 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 PAL_BG 0x1 0xE 0x0 0x6B59 @From gray + launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0xE 0x0 0x6B59 @From gray waitforvisualfinish end SteelBeamShards: @@ -19813,7 +19813,7 @@ Move_CRABHAMMER: end Move_SURF: - createvisualtask AnimTask_CreateSurfWave, 2, SURF_PALETTE_SURF + createvisualtask AnimTask_CreateSurfWave, 2, ANIM_SURF_PAL_SURF delay 24 panse_1B SE_W057, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 waitforvisualfinish @@ -22110,7 +22110,7 @@ ArmThrustLeft: Move_MUDDY_WATER: panse_1B SE_W250, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0 - createvisualtask AnimTask_CreateSurfWave, 2, SURF_PALETTE_MUDDY_WATER + createvisualtask AnimTask_CreateSurfWave, 2, ANIM_SURF_PAL_MUDDY_WATER waitforvisualfinish end diff --git a/include/battle_anim.h b/include/battle_anim.h index ce85a7163f..b0a54c62b2 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -488,10 +488,6 @@ void AnimDragonDanceOrb(struct Sprite *sprite); void AnimOverheatFlame(struct Sprite *sprite); // battle_anim_new.c -bool8 IsMoveAnimDarkVoid(void); -bool8 IsMoveAnimFlashCannonOrSteelBeam(void); -bool8 IsMoveAnimCoreEnforcer(void); -bool8 IsMoveAnimAnchorShot(void); void CoreEnforcerLoadBeamTarget(struct Sprite* sprite); #endif // GUARD_BATTLE_ANIM_H diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index 1a4c385047..c320eeb670 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -398,10 +398,6 @@ #define ANIM_ATK_PARTNER 2 #define ANIM_DEF_PARTNER 3 -//sides -#define SIDE_ATTACKER 2 -#define SIDE_TARGET 3 - // stereo panning constants [0-255] // // 0 @@ -597,28 +593,28 @@ #define BACK_ANIM_FADE_BLUE_WITH_SHAKE 0x19 // mon pal blend -#define PAL_BG 0x1 -#define PAL_ATK 0x2 -#define PAL_DEF 0x4 -#define PAL_ATK_PARTNER 0x8 -#define PAL_DEF_PARTNER 0x10 -#define PAL_ALL 0x1f -#define PAL_BG_4 0x20 -#define PAL_BG_5 0x40 -#define PAL_ALL_BANKS 0x780 -#define PAL_PLAYER1 0x80 -#define PAL_PLAYER2 0x100 -#define PAL_OPPONENT1 0x200 -#define PAL_OPPONENT2 0x400 +#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 RIGHT_FIST 0 -#define LEFT_FIST 2 +#define ANIM_RIGHT_FIST 0 +#define ANIM_LEFT_FIST 2 // surf wave palettes -#define SURF_PALETTE_SURF 0 -#define SURF_PALETTE_MUDDY_WATER 1 -#define SURF_PALETTE_SLUDGE_WAVE 2 +#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/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index d3b2642314..23690a5295 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -15,6 +15,7 @@ #include "util.h" #include "constants/rgb.h" #include "constants/songs.h" +#include "constants/moves.h" EWRAM_DATA s16 gUnknown_0203A0F8[4] = {0}; @@ -3034,7 +3035,7 @@ static void AnimSolarbeamSmallOrb(struct Sprite* sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); - if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && IsMoveAnimCoreEnforcer()) + if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gAnimMoveIndex == MOVE_CORE_ENFORCER) { CoreEnforcerLoadBeamTarget(sprite); } diff --git a/src/battle_anim_electric.c b/src/battle_anim_electric.c index c0f489fd8f..18451068c2 100644 --- a/src/battle_anim_electric.c +++ b/src/battle_anim_electric.c @@ -4,6 +4,7 @@ #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 *); @@ -843,7 +844,7 @@ void AnimThunderWave(struct Sprite *sprite) sprite->pos1.x += gBattleAnimArgs[0]; sprite->pos1.y += gBattleAnimArgs[1]; - if (IsMoveAnimAnchorShot()) + if (gAnimMoveIndex == MOVE_ANCHOR_SHOT) spriteId = CreateSprite(&gAnchorShotChainTemplate, sprite->pos1.x + 32, sprite->pos1.y, sprite->subpriority); else spriteId = CreateSprite(&gThunderWaveSpriteTemplate, sprite->pos1.x + 32, sprite->pos1.y, sprite->subpriority); @@ -903,7 +904,7 @@ static void AnimTask_ElectricChargingParticles_Step(u8 taskId) { u8 spriteId; task->data[12] = 0; - if (IsMoveAnimFlashCannonOrSteelBeam()) + 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); diff --git a/src/battle_anim_ghost.c b/src/battle_anim_ghost.c index cfae013275..19d2fca348 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 *); @@ -874,7 +875,7 @@ void AnimTask_DestinyBondWhiteShadow(u8 taskId) && battler != (gBattleAnimAttacker ^ 2) && IsBattlerSpriteVisible(battler)) { - if (IsMoveAnimDarkVoid()) + if (gAnimMoveIndex == MOVE_DARK_VOID) spriteId = CreateSprite(&gDarkVoidBlackHoleTemplate, baseX, baseY, 55); //dark void else spriteId = CreateSprite(&gDestinyBondWhiteShadowSpriteTemplate, baseX, baseY, 55); //destiny bond @@ -900,7 +901,7 @@ void AnimTask_DestinyBondWhiteShadow(u8 taskId) } else { - if (IsMoveAnimDarkVoid()) + if (gAnimMoveIndex == MOVE_DARK_VOID) spriteId = CreateSprite(&gDarkVoidBlackHoleTemplate, baseX, baseY, 55); //dark void else spriteId = CreateSprite(&gDestinyBondWhiteShadowSpriteTemplate, baseX, baseY, 55); //destiny bond diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c index da741a94c8..1129af88b9 100644 --- a/src/battle_anim_new.c +++ b/src/battle_anim_new.c @@ -15,9 +15,6 @@ #include "battle_controllers.h" #include "constants/moves.h" -// defines -#define PARTNER(battler) (battler ^ BIT_FLANK) - //// function declarations static void SpriteCB_SpriteToCentreOfSide(struct Sprite* sprite); static void SpriteCB_SpriteOnMonForDuration(struct Sprite *sprite); @@ -4055,10 +4052,10 @@ static u8 LoadBattleAnimTarget(u8 arg) battler = gBattleAnimTarget; break; case 2: - battler = PARTNER(gBattleAnimAttacker); + battler = BATTLE_PARTNER(gBattleAnimAttacker); break; case 3: - battler = PARTNER(gBattleAnimTarget); + battler = BATTLE_PARTNER(gBattleAnimTarget); break; } } @@ -4073,12 +4070,12 @@ static u8 LoadBattleAnimTarget(u8 arg) return battler; } -static u8 GetProperCentredCoord(u8 bank, u8 coordType) +static u8 GetProperCentredCoord(u8 battler, u8 coordType) { if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - return (GetBattlerSpriteCoord2(bank, coordType) + GetBattlerSpriteCoord2(PARTNER(bank), coordType)) / 2; + return (GetBattlerSpriteCoord2(battler, coordType) + GetBattlerSpriteCoord2(BATTLE_PARTNER(battler), coordType)) / 2; - return GetBattlerSpriteCoord(bank, coordType); + return GetBattlerSpriteCoord(battler, coordType); } static void InitSpritePosToGivenTarget(struct Sprite* sprite, u8 target) @@ -4095,9 +4092,9 @@ static void InitSpritePosToAnimTargetsCentre(struct Sprite *sprite, bool8 respec if (!respectMonPicOffsets) { sprite->pos1.x = (GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X) - + GetBattlerSpriteCoord2(PARTNER(gBattleAnimTarget), BATTLER_COORD_X)) / 2; + + GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_X)) / 2; sprite->pos1.y = (GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y) - + GetBattlerSpriteCoord2(PARTNER(gBattleAnimTarget), BATTLER_COORD_Y)) / 2; + + GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_Y)) / 2; } SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); @@ -4109,16 +4106,16 @@ static void InitSpritePosToAnimAttackersCentre(struct Sprite *sprite, bool8 resp if (!respectMonPicOffsets) { sprite->pos1.x = (GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_X) - + GetBattlerSpriteCoord2(PARTNER(gBattleAnimAttacker), BATTLER_COORD_X)) / 2; + + GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimAttacker), BATTLER_COORD_X)) / 2; sprite->pos1.y = (GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_Y) - + GetBattlerSpriteCoord2(PARTNER(gBattleAnimAttacker), BATTLER_COORD_Y)) / 2; + + GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimAttacker), BATTLER_COORD_Y)) / 2; } else { sprite->pos1.x = (GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_X_2) - + GetBattlerSpriteCoord2(PARTNER(gBattleAnimAttacker), BATTLER_COORD_X_2)) / 2; + + GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimAttacker), BATTLER_COORD_X_2)) / 2; sprite->pos1.y = (GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) - + GetBattlerSpriteCoord2(PARTNER(gBattleAnimAttacker), BATTLER_COORD_Y_PIC_OFFSET)) / 2; + + GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimAttacker), BATTLER_COORD_Y_PIC_OFFSET)) / 2; } SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); @@ -4275,11 +4272,11 @@ static void SpriteCB_CoreEnforcerBeam(struct Sprite* sprite) sprite->data[0] = gBattleAnimArgs[2]; sprite->data[2] = (GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) - + GetBattlerSpriteCoord(PARTNER(gBattleAnimTarget), BATTLER_COORD_X_2)) / 2; + + GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_X_2)) / 2; sprite->data[4] = (GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) - + GetBattlerSpriteCoord(PARTNER(gBattleAnimTarget), BATTLER_COORD_Y_PIC_OFFSET)) / 2; + + GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_Y_PIC_OFFSET)) / 2; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); @@ -4324,7 +4321,7 @@ static void SpriteCB_TranslateAnimSpriteToTargetMonLocationDoubles(struct Sprite //arg 0: initial x pixel offset //arg 1: initial y pixel offset //arg 2: speed -//arg 3: anim bank +//arg 3: anim battler static void SpriteCB_FallingObject(struct Sprite *sprite) { u8 target = LoadBattleAnimTarget(3); @@ -4740,7 +4737,7 @@ static void SpriteCB_AcidDripSingleTarget(struct Sprite *sprite) //Causes an object to fall from the sky. //arg 0: initial x pixel offset //arg 1: initial y pixel offset -//arg 2: anim bank +//arg 2: anim battler static void SpriteCB_WaterDroplet(struct Sprite *sprite) { u8 target = LoadBattleAnimTarget(2); @@ -4816,7 +4813,7 @@ static void SpriteCB_SurroundingRing(struct Sprite *sprite) //Imitates launching a beam of light towards the sky //arg 0: initial x pixel offset //arg 1: initial y pixel offset -//arg 2: bank +//arg 2: battler //arg 3: duration //arg 4: Anim num //arg 5: affine anim start delay @@ -4942,55 +4939,15 @@ void AnimTask_SquishTarget(u8 taskId) task->func = AnimTask_WaitAffineAnim; } -void AnimTask_IsTargetPartner(u8 taskId) -{ - if (gBattleAnimTarget == PARTNER(gBattleAnimAttacker)) - gBattleAnimArgs[0] = 1; - else - gBattleAnimArgs[0] = 0; - - DestroyAnimVisualTask(taskId); -} - -void AnimTask_AllBanksInvisible(u8 taskId) -{ - int i; - u8 spriteId; - - for (i = 0; i < gBattlersCount; ++i) - { - spriteId = gBattlerSpriteIds[i]; - if (spriteId != 0xFF) - gSprites[spriteId].invisible = TRUE; - } - - DestroyAnimVisualTask(taskId); -} - -void AnimTask_AllBanksVisible(u8 taskId) -{ - int i; - u8 spriteId; - - for (i = 0; i < gBattlersCount; ++i) - { - spriteId = gBattlerSpriteIds[i]; - if (spriteId != 0xFF) - gSprites[spriteId].invisible = FALSE; - } - - DestroyAnimVisualTask(taskId); -} - 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(PARTNER(gBattleAnimTarget), BATTLER_COORD_X_2)) / 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(PARTNER(gBattleAnimTarget), BATTLER_COORD_Y_PIC_OFFSET)) / 2; + + GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_Y_PIC_OFFSET)) / 2; } void AnimTask_CreateBestowItem(u8 taskId) @@ -5035,24 +4992,3 @@ void AnimTask_TechnoBlast(u8 taskId) DestroyAnimVisualTask(taskId); } -// move checks -bool8 IsMoveAnimDarkVoid(void) -{ - return gAnimMoveIndex == MOVE_DARK_VOID; -} - -bool8 IsMoveAnimFlashCannonOrSteelBeam(void) -{ - return gAnimMoveIndex == MOVE_FLASH_CANNON || gAnimMoveIndex == MOVE_STEEL_BEAM; -} - -bool8 IsMoveAnimCoreEnforcer(void) -{ - return gAnimMoveIndex == MOVE_CORE_ENFORCER; -} - -bool8 IsMoveAnimAnchorShot(void) -{ - return gAnimMoveIndex == MOVE_ANCHOR_SHOT; -} - diff --git a/src/battle_anim_water.c b/src/battle_anim_water.c index 0e9bfe214f..621b67b546 100644 --- a/src/battle_anim_water.c +++ b/src/battle_anim_water.c @@ -1077,14 +1077,16 @@ void AnimTask_CreateSurfWave(u8 taskId) AnimLoadCompressedBgGfx(animBg.bgId, gBattleAnimBgImage_Surf, animBg.tilesOffset); switch (gBattleAnimArgs[0]) { - case SURF_PALETTE_SURF: + case ANIM_SURF_PAL_SURF: default: LoadCompressedPalette(gBattleAnimBgPalette_Surf, animBg.paletteId * 16, 32); break; - case SURF_PALETTE_MUDDY_WATER: + case ANIM_SURF_PAL_MUDDY_WATER: LoadCompressedPalette(gBattleAnimBackgroundImageMuddyWater_Pal, animBg.paletteId * 16, 32); - case SURF_PALETTE_SLUDGE_WAVE: + break; + case ANIM_SURF_PAL_SLUDGE_WAVE: LoadCompressedPalette(gBattleAnimBgPalette_SludgeWave, animBg.paletteId * 16, 32); + break; } taskId2 = CreateTask(AnimTask_SurfWaveScanlineEffect, gTasks[taskId].priority + 1); From 5d232c34fe6a38559523d99cd5d6f4c186065d93 Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 29 May 2020 11:15:00 -0600 Subject: [PATCH 597/667] fix a bunch of anims --- data/battle_anim_scripts.s | 12 ++++++------ src/battle_anim.c | 6 ++---- src/battle_anim_electric.c | 7 ++++--- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 9e00a77015..7eb5d10b92 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -4482,7 +4482,7 @@ Move_WIDE_GUARD: Move_GUARD_SPLIT:: loadspritegfx ANIM_TAG_BLUEGREEN_ORB - createsprite AnimTask_BlendBattleAnimPal, ANIM_ATTACKER, 10, ANIM_PAL_BG, 0x1, 0x0, 0xC, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 0x1, 0x0, 0xC, 0x0 loopsewithpan SE_W199, SOUND_PAN_ATTACKER, 0x18, 0x3 call GuardSplitLaunch call GuardSplitLaunch @@ -4495,7 +4495,7 @@ Move_GUARD_SPLIT:: call GuardSplitLaunch call GuardSplitLaunch waitforvisualfinish - createsprite AnimTask_BlendBattleAnimPal, ANIM_ATTACKER 10, ANIM_PAL_BG, 0x1, 0xC, 0x0, 0x0 + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 0x1, 0xC, 0x0, 0x0 waitforvisualfinish end GuardSplitLaunch: @@ -6208,7 +6208,7 @@ Move_DRILL_RUN: waitforvisualfinish delay 0x2 launchtemplate gBowMonSpriteTemplate 0x2 0x1 0x1 - launchtemplate gHealingBlueStarSpriteTemplate 0x84 0x3 0x0 0x0 0xc + launchtemplate gHornHitSpriteTemplate 0x84 0x3 0x0 0x0 0xc waitforvisualfinish playse 0x14 launchtask AnimTask_ShakeMonInPlace 0x2 0x5 0x0 0x2 0x0 0x28 0x1 @@ -7305,9 +7305,9 @@ Move_GLACIATE: launchtemplate gGlaciateSmokeTemplate 0x84 0x5 0x0 0x12 0x50 0x0 0x4b launchtemplate gGlaciateSmokeTemplate 0x84 0x5 0x0 0x12 0x48 0x1 0x4b waitforvisualfinish - createsprite AnimTask_BlendBattleAnimPal, ANIM_ATTACKER, 0xA, (ANIM_PAL_DEF | ANIM_PAL_DEF_PARTNER), 0x2, 0x0, 0xA, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, (ANIM_PAL_DEF | ANIM_PAL_DEF_PARTNER), 0x2, 0x0, 0xA, 0x7FFF call IceCrystalEffectLong - createsprite AnimTask_BlendBattleAnimPal, ANIM_ATTACKER, 0xA, (ANIM_PAL_DEF | ANIM_PAL_DEF_PARTNER), 0x2, 0xA, 0x0, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 10, (ANIM_PAL_DEF | ANIM_PAL_DEF_PARTNER), 0x2, 0xA, 0x0, 0x7FFF waitforvisualfinish blendoff clearmonbg ANIM_DEF_PARTNER @@ -13303,7 +13303,7 @@ Move_BOLT_BEAK:: launchtask AnimTask_BlendColorCycle 0x2 0x6 0x3 0xffe1 0x1 0x0 0x0 0x5bff launchtemplate gHorizontalLungeSpriteTemplate 0x2 0x2 0x4 0x4 delay 0x4 - launchtemplate gHealingBlueStarSpriteTemplate 0x84 0x3 0x8 0x8 0xa + launchtemplate gHornHitSpriteTemplate 0x84 0x3 0x8 0x8 0xa waitforvisualfinish launchtemplate gFlashingHitSplatSpriteTemplate 0x83 0x4 0x0 0x0 0x1 0x1 playsewithpan SE_W030, SOUND_PAN_TARGET diff --git a/src/battle_anim.c b/src/battle_anim.c index a21fc16201..835e7b2992 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -1500,7 +1500,6 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {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}, @@ -1920,6 +1919,7 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {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}, @@ -1947,7 +1947,6 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {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}, @@ -1976,12 +1975,11 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_HorseshoeFist, ANIM_TAG_HORSESHOE_SIDE_FIST}, {gBattleAnimSpritePal_AvalancheRocks, ANIM_TAG_DRAGON_ASCENT_FOE}, {gBattleAnimSpritePal_CraftyShield, ANIM_TAG_CRAFTY_SHIELD}, - {gBattleAnimSpritePal_QuickGuard, ANIM_TAG_QUICK_GUARD_HAND}, {gBattleAnimSpritePal_BlacephalonHead, ANIM_TAG_BLACEPHALON_HEAD}, {gBattleAnimSpritePal_DracoMeteor, ANIM_TAG_FAIRY_LOCK_CHAINS}, {gBattleAnimSpritePal_LightningRain, ANIM_TAG_IONS}, {gBattleAnimSpritePal_Chop, ANIM_TAG_CHOP}, - {gBattleAnimSpritePal_HeartStamp, ANIM_TAG_HEART_STAMP}, + [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}, diff --git a/src/battle_anim_electric.c b/src/battle_anim_electric.c index 18451068c2..b03fdf204f 100644 --- a/src/battle_anim_electric.c +++ b/src/battle_anim_electric.c @@ -844,10 +844,11 @@ void AnimThunderWave(struct Sprite *sprite) sprite->pos1.x += gBattleAnimArgs[0]; sprite->pos1.y += gBattleAnimArgs[1]; - if (gAnimMoveIndex == MOVE_ANCHOR_SHOT) - spriteId = CreateSprite(&gAnchorShotChainTemplate, sprite->pos1.x + 32, sprite->pos1.y, sprite->subpriority); - else + 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++; From c77bed7bfbb2b4067a57819afee1b974d273d6cc Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sat, 30 May 2020 05:04:23 -0300 Subject: [PATCH 598/667] =?UTF-8?q?Fixed=20Regenerator=20overhealing=20a?= =?UTF-8?q?=20Pok=C3=A9mon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/battle_script_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 3f457b7e5f..06fcbd4293 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -11182,7 +11182,7 @@ static void Cmd_switchoutabilities(void) gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 3; gBattleMoveDamage += gBattleMons[gActiveBattler].hp; if (gBattleMoveDamage > gBattleMons[gActiveBattler].maxHP) - gBattleMons[gActiveBattler].maxHP = gBattleMons[gActiveBattler].maxHP; + gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP; BtlController_EmitSetMonData(0, REQUEST_HP_BATTLE, gBitTable[*(gBattleStruct->field_58 + gActiveBattler)], 2, &gBattleMoveDamage); MarkBattlerForControllerExec(gActiveBattler); break; From 9311dfdbb35a14ac28173eb633e722e5d62f79f4 Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Sun, 31 May 2020 10:00:21 -0400 Subject: [PATCH 599/667] Teatime and Eternabeam should be one word each --- include/constants/moves.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/constants/moves.h b/include/constants/moves.h index 167d4a10b8..e3438f5f20 100644 --- a/include/constants/moves.h +++ b/include/constants/moves.h @@ -706,7 +706,7 @@ #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_TEA_TIME (MOVES_COUNT_GEN7 + 8) +#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) @@ -731,7 +731,7 @@ #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_ETERNA_BEAM (MOVES_COUNT_GEN7 + 33) +#define MOVE_ETERNABEAM (MOVES_COUNT_GEN7 + 33) #define MOVE_STEEL_BEAM (MOVES_COUNT_GEN7 + 34) #define MOVES_COUNT_GEN8 (MOVES_COUNT_GEN7 + 35) From e2285850f32283f18ca3a1ac46e684cee11c8903 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 15 Jun 2020 20:33:47 -0300 Subject: [PATCH 600/667] Fix Lunge Addresses #411 --- src/data/battle_moves.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 29f0a86906..a44537ac82 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -9012,7 +9012,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_LUNGE] = { - .effect = EFFECT_ATTACK_DOWN, + .effect = EFFECT_ATTACK_DOWN_HIT, .power = 80, .type = TYPE_BUG, .accuracy = 100, From 746bdb581ab7e9aae469b86f3ff085a13349113c Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 15 Jun 2020 20:35:35 -0300 Subject: [PATCH 601/667] Fix Fire Lash As stated in #411, this move should hurt the opponent and lower their defense, not just the latter. --- src/data/battle_moves.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 29f0a86906..80ea1298a1 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -9026,7 +9026,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_FIRE_LASH] = { - .effect = EFFECT_DEFENSE_DOWN, + .effect = EFFECT_DEFENSE_DOWN_HIT, .power = 80, .type = TYPE_FIRE, .accuracy = 100, From ed7675b11bdaebbb84a6630d17fdbd940d125168 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 15 Jun 2020 21:41:43 -0300 Subject: [PATCH 602/667] Fixed Eerie Impulse's animation --- data/battle_anim_scripts.s | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 7eb5d10b92..43251cec20 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -9005,18 +9005,18 @@ Move_EERIE_IMPULSE:: delay 0x4 launchtemplate gEerieImpulseRingTemplate 0x0 0x7 0x2d 0x0 0x0 0x0 0x0 0x0 0x1 delay 0xB - 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 SOUND_PAN_ATTACKER 0x28 0x2 - launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x20 0x1e 0x0 0x28 0x0 - launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x20 0x1e 0x40 0x28 0x1 - launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x20 0x1e 0x80 0x28 0x0 - launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x20 0x1e SOUND_PAN_ATTACKER 0x28 0x2 - launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x30 0x1e 0x20 0x28 0x0 - launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x30 0x1e 0x60 0x28 0x1 - launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x30 0x1e 0xa0 0x28 0x0 - launchtemplate gZapCannonSparkSpriteTemplate 0x84 0x7 0xa 0x0 0x30 0x1e 0xe0 0x28 0x2 + 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_W085B, SOUND_PAN_ATTACKER launchtemplate gEerieImpulseImpactTemplate 0x2 0x6 0x0 0xfffb 0x1 0x0 0x20 0x10 From f7c6729b755d26d3ad67b86b8da67859733f16c3 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 15 Jun 2020 22:46:22 -0300 Subject: [PATCH 603/667] Fixed Dragon Hammer's animation --- data/battle_anim_scripts.s | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 7eb5d10b92..ff9a959490 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -11732,21 +11732,21 @@ Move_DRAGON_HAMMER:: launchtask AnimTask_SquishTarget 0x2 0x0 delay 0x5 playsewithpan SE_W025B, SOUND_PAN_TARGET - launchtemplate gOctazookaSmokeSpriteTemplate 0x84 0x8 0x8 0x1 0x0 - delay 0x2 - launchtemplate gOctazookaSmokeSpriteTemplate 0x80 4 0xfff8 0xfff8 0x1 0x0 - delay 0x2 - launchtemplate gOctazookaSmokeSpriteTemplate 0x80 4 0x8 0xfff8 0x1 0x0 - delay 0x2 - launchtemplate gOctazookaSmokeSpriteTemplate 0x80 4 0xfff8 0x8 0x1 0x0 - delay 0x2 - launchtemplate gOctazookaSmokeSpriteTemplate 0x80 4 0x8 0x8 0x1 0x0 - delay 0x2 - launchtemplate gOctazookaSmokeSpriteTemplate 0x80 4 0xfff8 0xfff8 0x1 0x0 - delay 0x2 - launchtemplate gOctazookaSmokeSpriteTemplate 0x80 4 0x8 0xfff8 0x1 0x0 - delay 0x2 - launchtemplate gOctazookaSmokeSpriteTemplate 0x80 4 0xfff8 0x8 0x1 0x0 + 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 From 5013a04ba395b539c53d640958ab418a462e5a90 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Mon, 15 Jun 2020 23:25:35 -0300 Subject: [PATCH 604/667] Fixed Diamond Storm's animation --- data/battle_anim_scripts.s | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 7eb5d10b92..f246b5a27b 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -8725,25 +8725,25 @@ Move_DIAMOND_STORM:: createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ICE_CRYSTALS, 0, 0xD, 0xD, 0x7DDE @Pink waitforvisualfinish panse_1B SE_W059, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 - launchtemplate gDiamondStormSwirlingIceTemplate 0x28 0x6 0x0 0xfff6 0x0 0xfff6 0x48 0x1 + 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 gDiamondStormSwirlingIceTemplate 0x28 0x6 0x0 0xfff1 0x0 0xfff1 0x48 0x1 + 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 gDiamondStormSwirlingIceTemplate 0x28 0x6 0x0 0xfffb 0x0 0xfffb 0x48 0x1 + 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 gDiamondStormSwirlingIceTemplate 0x28 0x6 0x0 0xfff6 0x0 0xfff6 0x48 0x1 + 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 gDiamondStormSwirlingIceTemplate 0x28 0x6 0x0 0xffec 0x0 0xffec 0x48 0x1 + 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 gDiamondStormSwirlingIceTemplate 0x28 0x6 0x0 0xfff1 0x0 0xfff1 0x48 0x1 + 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 gDiamondStormSwirlingIceTemplate 0x28 0x6 0x0 0xffe7 0x0 0xffe7 0x48 0x1 + 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_W239, SOUND_PAN_TARGET From da4fba6d41e9b8d35a93f532b92be60fef1a74c3 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 16 Jun 2020 00:01:06 -0300 Subject: [PATCH 605/667] Fixed Revelation Dance's animation --- data/battle_anim_scripts.s | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 7eb5d10b92..68cc80a2ea 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -11367,9 +11367,11 @@ Move_REVELATION_DANCE:: playsewithpan SE_W003, 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 SOUND_PAN_ATTACKER 0xb0 0x28 + launchtemplate gRevelationDanceYellowDispersalTemplate 0x81 0x5 0x0 0xa 0x0 0xb0 0x28 + playsewithpan SE_W003, SOUND_PAN_ATTACKER launchtemplate gRevelationDanceYellowDispersalTemplate 0x81 0x5 0x0 0xa 0xff40 0xf0 0x28 - launchtemplate gRevelationDanceYellowDispersalTemplate 0x81 0x5 0x0 0xa SOUND_PAN_ATTACKER 0xff60 0x28 + launchtemplate gRevelationDanceYellowDispersalTemplate 0x81 0x5 0x0 0xa 0x0 0xff60 0x28 + playsewithpan SE_W003, 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 From 6abfac2c654fe0e137fba30fb5343c69d67b4112 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 16 Jun 2020 00:17:40 -0300 Subject: [PATCH 606/667] Fixed Trop Kick's animation --- data/battle_anim_scripts.s | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 7eb5d10b92..6e2ad5f3c6 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -11611,13 +11611,13 @@ Move_TROP_KICK:: playsewithpan SE_W233B, SOUND_PAN_TARGET delay 0xA playsewithpan SE_W234, SOUND_PAN_ATTACKER - launchtemplate gTropKickLeavesTemplate 0x81 0x5 0x0 0xa SOUND_PAN_ATTACKER 0xb0 0x28 - launchtemplate gTropKickLeavesTemplate 0x81 0x5 0x0 0xa 0xff40 0xf0 0x28 - launchtemplate gTropKickFlowerTemplate 0x81 0x5 0x0 0xa SOUND_PAN_ATTACKER 0xff60 0x28 - launchtemplate gTropKickFlowerTemplate 0x81 0x5 0x0 0xa 0xff40 0xff90 0x28 - launchtemplate gTropKickFlowerTemplate 0x81 0x5 0x0 0xa 0xa0 0x30 0x28 - launchtemplate gTropKickLeavesTemplate 0x81 0x5 0x0 0xa 0xff20 0xffe0 0x28 - launchtemplate gTropKickLeavesTemplate 0x81 0x5 0x0 0xa 0x70 0xff80 0x28 + 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 From 2fb4c0cab1170dcf95246c11e0fbf7667daa702e Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 16 Jun 2020 02:58:58 -0300 Subject: [PATCH 607/667] Corrected Electrify's battle string --- src/battle_message.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_message.c b/src/battle_message.c index 71f443277d..264a8bcb6c 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -623,7 +623,7 @@ static const u8 sText_TerrainBecomesMisty[] = _("Mist swirled about\nthe battlef 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 opposing {B_ATK_NAME_WITH_PREFIX}'s moves\nhave been electrified!"); +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"); From abd128826839ca15bb28d8bc44dc5f689455653f Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 16 Jun 2020 03:06:32 -0300 Subject: [PATCH 608/667] Fixed Electrify's animation --- data/battle_anim_scripts.s | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 7eb5d10b92..9cb1963f9f 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -8488,7 +8488,7 @@ Move_ELECTRIFY:: 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 SOUND_PAN_ATTACKER 0x28 0x2 + 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 @@ -8510,11 +8510,7 @@ Move_ELECTRIFY:: launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfffb 0xa 0x5 0x1 launchtemplate gElectrifyYellowRingTemplate 0x3 0x6 0x0 0x0 0x1 0x0 0x1f 0x8 delay 0x1 - launchtemplate gElectrifyYellowRingTemplate 0x3 0x6 0x0 0x0 0x1 0x0 0x1f 0x8 - delay 0x1 launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xf 0x14 0x5 0x2 - launchtemplate gElectrifyYellowRingTemplate 0x3 0x6 0x0 0x0 0x1 0x0 0x1f 0x8 - delay 0x2 launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfff1 0xfff6 0x5 0x0 delay 0x2 launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0x19 0x0 0x5 0x1 From bef8a701fce742ae620806e5270efd2332467aef Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 16 Jun 2020 03:32:41 -0300 Subject: [PATCH 609/667] Fixed Freeze Dry's animation --- data/battle_anim_scripts.s | 44 +++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 7eb5d10b92..f6031751a2 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -8204,33 +8204,37 @@ Move_PETAL_BLIZZARD:: Move_FREEZE_DRY:: monbg ANIM_DEF_PARTNER + setalpha 12, 8 loadspritegfx ANIM_TAG_ICE_CRYSTALS - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x1 0x0 0x7 0x0 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0x0 0x9 0x7f4c - delay 0x14 + 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_W081, SOUND_PAN_TARGET - launchtemplate gIceCrystalSpiralInwardSmall 0x2 0x1 0x0 - launchtemplate gIceCrystalSpiralInwardSmall 0x2 0x1 0x40 - launchtemplate gIceCrystalSpiralInwardSmall 0x2 0x1 0x80 - launchtemplate gIceCrystalSpiralInwardSmall 0x2 0x1 SOUND_PAN_ATTACKER - delay 0x5 - launchtemplate gIceCrystalSpiralInwardLarge 0x2 0x1 0x20 - launchtemplate gIceCrystalSpiralInwardLarge 0x2 0x1 0x60 - launchtemplate gIceCrystalSpiralInwardLarge 0x2 0x1 0xa0 - launchtemplate gIceCrystalSpiralInwardLarge 0x2 0x1 0xe0 + 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 0x5 - playsewithpan SE_W172, 0x0 + delay 5 loadspritegfx ANIM_TAG_ICE_CUBE - monbgprio_28 ANIM_TARGET - launchtask AnimTask_FrozenIceCube 0x2 0x0 - waitplaysewithpan SE_RG_CARD1 SOUND_PAN_TARGET 0x11 + createvisualtask AnimTask_FrozenIceCube, 2 + waitplaysewithpan SE_W258, 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 - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_DEF 0x2 0x9 0x0 0x7f4c clearmonbg ANIM_DEF_PARTNER - launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_BG 0x0 0x7 0x0 0x0 - waitforvisualfinish blendoff end From 2621071f227e9b7f79104b30b3bc4031a06c9e7a Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 16 Jun 2020 03:36:17 -0300 Subject: [PATCH 610/667] Fixed Freeze-Dry's InGame name --- src/data/text/move_names.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/text/move_names.h b/src/data/text/move_names.h index 71de670fcd..401d57de8c 100644 --- a/src/data/text/move_names.h +++ b/src/data/text/move_names.h @@ -573,7 +573,7 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [MOVE_PARABOLIC_CHARGE] = _("Parabolic Ch"), [MOVE_FORESTS_CURSE] = _("ForestsCurse"), [MOVE_PETAL_BLIZZARD] = _("Petal Storm"), - [MOVE_FREEZE_DRY] = _("Freeze Dry"), + [MOVE_FREEZE_DRY] = _("Freeze-Dry"), [MOVE_DISARMING_VOICE] = _("Disarming Vo"), [MOVE_PARTING_SHOT] = _("Parting Shot"), [MOVE_TOPSY_TURVY] = _("Topsy Turvy"), From 575c5a58822cd30f982cfa700ae92037e6507d42 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 16 Jun 2020 04:11:09 -0300 Subject: [PATCH 611/667] Fixed Freeze Shock's 2nd turn animation --- data/battle_anim_scripts.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 7eb5d10b92..c2ad45b956 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -7476,7 +7476,7 @@ FreezeShockAttack: 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 SOUND_PAN_ATTACKER 0x28 0x2 + 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 From 5f763a8380852a9ed43158ab93f2dc155dfe3185 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 16 Jun 2020 04:11:37 -0300 Subject: [PATCH 612/667] Fixed Freeze Shock's 1st turn battle string --- data/battle_scripts_1.s | 2 +- include/constants/battle_string_ids.h | 3 ++- src/battle_message.c | 4 +++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index bd55ca97c7..1d641b84c4 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3080,7 +3080,7 @@ BattleScript_EffectTwoTurnsAttackIceBurn: setbyte sTWOTURN_STRINGID, 0x0 goto BattleScript_EffectTwoTurnsAttackContinue BattleScript_EffectTwoTurnsAttackFreezeShock: - setbyte sTWOTURN_STRINGID, 0x0 + setbyte sTWOTURN_STRINGID, 0xa goto BattleScript_EffectTwoTurnsAttackContinue BattleScript_EffectGeomancy: diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index e68e31d6f5..2f66f97f91 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -548,7 +548,8 @@ #define STRINGID_PKNMABSORBINGPOWER 544 #define STRINGID_NOONEWILLBEABLETORUNAWAY 545 #define STRINGID_DESTINYKNOTACTIVATES 546 +#define STRINGID_CLOAKEDINAFREEZINGLIGHT 547 -#define BATTLESTRINGS_COUNT 547 +#define BATTLESTRINGS_COUNT 548 #endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H diff --git a/src/battle_message.c b/src/battle_message.c index 71f443277d..db7aacbe78 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -669,9 +669,11 @@ static const u8 sText_ReceiverAbilityTakeOver[] = _("{B_SCR_ACTIVE_NAME_WITH_PRE 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, @@ -1342,7 +1344,7 @@ const u16 gFirstTurnOfTwoStringIds[] = { STRINGID_PKMNWHIPPEDWHIRLWIND, STRINGID_PKMNTOOKSUNLIGHT, STRINGID_PKMNLOWEREDHEAD, STRINGID_PKMNISGLOWING, STRINGID_PKMNFLEWHIGH, STRINGID_PKMNDUGHOLE, STRINGID_PKMNHIDUNDERWATER, STRINGID_PKMNSPRANGUP, STRINGID_VANISHEDINSTANTLY, - STRINGID_PKNMABSORBINGPOWER + STRINGID_PKNMABSORBINGPOWER, STRINGID_CLOAKEDINAFREEZINGLIGHT }; const u16 gWrappedStringIds[] = From 3cf073b614bf29c28740d868bf64f3e8fabe68af Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 16 Jun 2020 04:22:31 -0300 Subject: [PATCH 613/667] Fixed Blue Flare's animation --- data/battle_anim_scripts.s | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 7eb5d10b92..1111a4a2da 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -7420,9 +7420,9 @@ BlueFlareFireSpin: delay 0x2 return BlueFlareFlameSpreadEffect: - launchtemplate gBlueFlareBurnTemplate 0x81 0x5 0x0 0xa SOUND_PAN_ATTACKER 0xb0 0x28 + launchtemplate gBlueFlareBurnTemplate 0x81 0x5 0x0 0xa 0x0 0xb0 0x28 launchtemplate gBlueFlareBurnTemplate 0x81 0x5 0x0 0xa 0xff40 0xf0 0x28 - launchtemplate gBlueFlareBurnTemplate 0x81 0x5 0x0 0xa SOUND_PAN_ATTACKER 0xff60 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 From dca5016d8e1d96a7e9725bae933185c9c786e89b Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 16 Jun 2020 04:28:04 -0300 Subject: [PATCH 614/667] Fixed Techno Blast's animation --- data/battle_anim_scripts.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 7eb5d10b92..b539693cd4 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -6762,7 +6762,7 @@ TechnoBlastNormal: 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 SOUND_PAN_ATTACKER 0x28 0x2 + 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 From 8d6a60297080fb681ded172edfa21415fff79fb8 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 16 Jun 2020 04:30:53 -0300 Subject: [PATCH 615/667] Fixed Night Daze's animation --- data/battle_anim_scripts.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 7eb5d10b92..26d0a14a11 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -6477,7 +6477,7 @@ Move_NIGHT_DAZE: launchtemplate gNightDazeVioletCirclesTemplate 0x82 0x1 0x60 launchtemplate gNightDazeVioletCirclesTemplate 0x82 0x1 0x80 launchtemplate gNightDazeVioletCirclesTemplate 0x82 0x1 0xa0 - launchtemplate gNightDazeVioletCirclesTemplate 0x82 0x1 SOUND_PAN_ATTACKER + launchtemplate gNightDazeVioletCirclesTemplate 0x82 0x1 0x0 launchtemplate gNightDazeVioletCirclesTemplate 0x82 0x1 0xe0 delay 0x1 launchtemplate gNightDazeVioletRingsTemplate 0x3 0x6 0x0 0x0 0x0 0x0 0x1F 0x8 From 33a45ba181f9f3e35b11a4dc90f86bf1741a0597 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 16 Jun 2020 07:06:38 -0300 Subject: [PATCH 616/667] Implemented Relic Song's effect --- data/battle_scripts_1.s | 5 +++++ include/constants/battle_move_effects.h | 1 + src/data/battle_moves.h | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index bd55ca97c7..7cd0a89953 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -364,6 +364,11 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectGeomancy .4byte BattleScript_EffectFairyLock .4byte BattleScript_EffectAllySwitch + .4byte BattleScript_EffectSleepHit + +BattleScript_EffectSleepHit: + setmoveeffect MOVE_EFFECT_SLEEP + goto BattleScript_EffectHit BattleScript_EffectAllySwitch: attackcanceler diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 7cdc993d25..7b19d1eb71 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -351,5 +351,6 @@ #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/src/data/battle_moves.h b/src/data/battle_moves.h index 29f0a86906..dae8dea55a 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -7671,7 +7671,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_RELIC_SONG] = { - .effect = EFFECT_SLEEP, + .effect = EFFECT_SLEEP_HIT, .power = 75, .type = TYPE_NORMAL, .accuracy = 100, From 8998e54ce7419a3b2f803bafe9ad1adcb86d4844 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 22 Jun 2020 10:40:08 +0200 Subject: [PATCH 617/667] Fix Heal Block Leech Seed --- data/battle_scripts_1.s | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 9018c08456..56804addef 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5441,8 +5441,9 @@ BattleScript_LeechSeedTurnDrain:: datahpupdate BS_ATTACKER copyword gBattleMoveDamage, gHpDealt jumpifability BS_ATTACKER, ABILITY_LIQUID_OOZE, BattleScript_LeechSeedTurnPrintLiquidOoze - manipulatedamage DMG_BIG_ROOT setbyte cMULTISTRING_CHOOSER, 0x3 + jumpifstatus3 BS_TARGET, STATUS3_HEAL_BLOCK, BattleScript_LeechSeedHealBlock + manipulatedamage DMG_BIG_ROOT goto BattleScript_LeechSeedTurnPrintAndUpdateHp BattleScript_LeechSeedTurnPrintLiquidOoze:: copybyte gBattlerAbility, gBattlerAttacker @@ -5457,6 +5458,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 From d5ffdbf896b21a890bc5fe45b62baea4f0c34dc2 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 22 Jun 2020 10:50:50 +0200 Subject: [PATCH 618/667] Focus Sash removed on use --- data/battle_scripts_1.s | 3 +++ 1 file changed, 3 insertions(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 56804addef..86162ba850 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7400,6 +7400,9 @@ 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:: From f19ba68cb9386354d987e6f46727c04f87e803c4 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 24 Jun 2020 12:55:08 +0200 Subject: [PATCH 619/667] Fix mega indicator sprite overwriting ram --- include/battle.h | 1 - include/battle_interface.h | 3 ++- src/battle_interface.c | 43 ++++++++++++++++++++++++-------------- src/battle_main.c | 4 +--- 4 files changed, 30 insertions(+), 21 deletions(-) diff --git a/include/battle.h b/include/battle.h index 6a9ecd89c6..8e49f2644f 100644 --- a/include/battle.h +++ b/include/battle.h @@ -425,7 +425,6 @@ struct MegaEvolutionData u8 battlerId; bool8 playerSelect; u8 triggerSpriteId; - u8 indicatorSpriteIds[MAX_BATTLERS_COUNT]; }; struct Illusion diff --git a/include/battle_interface.h b/include/battle_interface.h index 1a6d572366..32c679285c 100644 --- a/include/battle_interface.h +++ b/include/battle_interface.h @@ -66,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); @@ -83,7 +84,7 @@ bool32 IsMegaTriggerSpriteActive(void); void HideMegaTriggerSprite(void); void DestroyMegaTriggerSprite(void); u32 CreateMegaIndicatorSprite(u32 battlerId, u32 which); -void DestroyMegaIndicatorSprite(u8 battlerId); +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); diff --git a/src/battle_interface.c b/src/battle_interface.c index 3d2c9fe15d..3c71f9ad84 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -710,11 +710,20 @@ static const struct SpriteTemplate sSpriteTemplate_MegaIndicator = // 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; @@ -791,6 +800,7 @@ 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; @@ -860,7 +870,7 @@ static void SpriteCB_HealthBar(struct Sprite *sprite) static void SpriteCB_HealthBoxOther(struct Sprite *sprite) { u8 healthboxMainSpriteId = sprite->hOther_HealthBoxSpriteId; - u8 megaSpriteId = gBattleStruct->mega.indicatorSpriteIds[gSprites[healthboxMainSpriteId].hMain_Battler]; + u8 megaSpriteId = sprite->hOther_IndicatorSpriteId; sprite->pos1.x = gSprites[healthboxMainSpriteId].pos1.x + 64; sprite->pos1.y = gSprites[healthboxMainSpriteId].pos1.y; @@ -886,7 +896,7 @@ void SetBattleBarStruct(u8 battlerId, u8 healthboxSpriteId, s32 maxVal, s32 oldV void SetHealthboxSpriteInvisible(u8 healthboxSpriteId) { - DestroyMegaIndicatorSprite(gSprites[healthboxSpriteId].hMain_Battler); + DestroyMegaIndicatorSprite(healthboxSpriteId); gSprites[healthboxSpriteId].invisible = TRUE; gSprites[gSprites[healthboxSpriteId].hMain_HealthBarSpriteId].invisible = TRUE; gSprites[gSprites[healthboxSpriteId].oam.affineParam].invisible = TRUE; @@ -901,8 +911,9 @@ void SetHealthboxSpriteVisible(u8 healthboxSpriteId) gSprites[gSprites[healthboxSpriteId].oam.affineParam].invisible = FALSE; if (gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(battlerId)] & gBitTable[gBattlerPartyIndexes[battlerId]]) { - if (gBattleStruct->mega.indicatorSpriteIds[battlerId] != 0xFF) - gSprites[gBattleStruct->mega.indicatorSpriteIds[battlerId]].invisible = FALSE; + u8 spriteId = GetMegaIndicatorSpriteId(healthboxSpriteId); + if (spriteId != 0xFF) + gSprites[spriteId].invisible = FALSE; else CreateMegaIndicatorSprite(battlerId, 0); } @@ -916,7 +927,7 @@ static void UpdateSpritePos(u8 spriteId, s16 x, s16 y) void DestoryHealthboxSprite(u8 healthboxSpriteId) { - DestroyMegaIndicatorSprite(gSprites[healthboxSpriteId].hMain_Battler); + DestroyMegaIndicatorSprite(healthboxSpriteId); DestroySprite(&gSprites[gSprites[healthboxSpriteId].oam.affineParam]); DestroySprite(&gSprites[gSprites[healthboxSpriteId].hMain_HealthBarSpriteId]); DestroySprite(&gSprites[healthboxSpriteId]); @@ -936,12 +947,13 @@ 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 (gBattleStruct->mega.indicatorSpriteIds[i] != 0xFF) - gSprites[gBattleStruct->mega.indicatorSpriteIds[i]].oam.priority = priority; + if (indicatorSpriteId != 0xFF) + gSprites[indicatorSpriteId].oam.priority = priority; } } @@ -1491,26 +1503,26 @@ u32 CreateMegaIndicatorSprite(u32 battlerId, u32 which) y += sIndicatorPosSingles[position][1]; } spriteId = CreateSpriteAtEnd(&sSpriteTemplate_MegaIndicator, x, y, 0); - gBattleStruct->mega.indicatorSpriteIds[battlerId] = spriteId; + gSprites[gSprites[gHealthboxSpriteIds[battlerId]].oam.affineParam].hOther_IndicatorSpriteId = spriteId; gSprites[spriteId].tBattler = battlerId; return spriteId; } -void DestroyMegaIndicatorSprite(u8 battlerId) +void DestroyMegaIndicatorSprite(u32 healthboxSpriteId) { u32 i; + s16 *spriteId = &gSprites[gSprites[healthboxSpriteId].oam.affineParam].hOther_IndicatorSpriteId; - if (gBattleStruct->mega.indicatorSpriteIds[battlerId] != 0xFF) + if (*spriteId != 0xFF) { - if (gBattleStruct->mega.indicatorSpriteIds[battlerId] != 0) // If called before initialized to 0xFF. - DestroySprite(&gSprites[gBattleStruct->mega.indicatorSpriteIds[battlerId]]); - gBattleStruct->mega.indicatorSpriteIds[battlerId] = 0xFF; + DestroySprite(&gSprites[*spriteId]); + *spriteId = 0xFF; } for (i = 0; i < MAX_BATTLERS_COUNT; i++) { - if (gBattleStruct->mega.indicatorSpriteIds[i] != 0xFF) + 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. @@ -1523,8 +1535,7 @@ void DestroyMegaIndicatorSprite(u8 battlerId) static void SpriteCb_MegaIndicator(struct Sprite *sprite) { - if (gBattleStruct->mega.indicatorSpriteIds[sprite->tBattler] == 0xFF) - DestroySprite(sprite); + } #undef tBattler diff --git a/src/battle_main.c b/src/battle_main.c index 29194b8899..ae4c87d831 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -2811,7 +2811,7 @@ static void SpriteCB_BounceEffect(struct Sprite *sprite) gSprites[bouncerSpriteId].pos2.y = y; sprite->sSinIndex = (sprite->sSinIndex + sprite->sDelta) & 0xFF; - bouncerSpriteId = gBattleStruct->mega.indicatorSpriteIds[sprite->sBattler]; + bouncerSpriteId = GetMegaIndicatorSpriteId(sprite->sBouncerSpriteId); if (sprite->sWhich == BOUNCE_HEALTHBOX && bouncerSpriteId != 0xFF) gSprites[bouncerSpriteId].pos2.y = y; } @@ -2964,8 +2964,6 @@ static void BattleStartClearSetData(void) gBattleStruct->arenaLostOpponentMons = 0; gBattleStruct->mega.triggerSpriteId = 0xFF; - for (i = 0; i < MAX_BATTLERS_COUNT; i++) - gBattleStruct->mega.indicatorSpriteIds[i] = 0xFF; } void SwitchInClearSetData(void) From f252cd80033797e54d4ec806d4ba117f574248ad Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 25 Jun 2020 11:44:05 +0200 Subject: [PATCH 620/667] Fix Terrain moves animations --- data/battle_anim_scripts.s | 211 +++++++++++++++++++++---------------- 1 file changed, 120 insertions(+), 91 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index f2f7be641d..c463cf82d2 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -8412,59 +8412,75 @@ Move_GRASSY_TERRAIN:: loadspritegfx ANIM_TAG_ORBS @Recover Ball loadspritegfx ANIM_TAG_GREEN_SPARKLE @Green Star playsewithpan SE_W036, SOUND_PAN_ATTACKER - launchtemplate gGrassyTerrainOrbsTemplate 0x2 0x2 0x1a 0x0 - launchtemplate gGrassyTerrainOrbsTemplate 0x2 0x2 0x1a 0x2a - launchtemplate gGrassyTerrainOrbsTemplate 0x2 0x2 0x1a 0x54 - launchtemplate gGrassyTerrainOrbsTemplate 0x2 0x2 0x1a 0x7e - launchtemplate gGrassyTerrainOrbsTemplate 0x2 0x2 0x1a 0xa8 - launchtemplate gGrassyTerrainOrbsTemplate 0x2 0x2 0x1a 0xd2 - delay 0x34 - setarg 0x7 0xffff - playsewithpan SE_W215, SOUND_PAN_ATTACKER - launchtask AnimTask_ScaleMonAndRestore 0x5 0x5 0xfff9 0xfff9 0xb 0x0 0x0 - launchtemplate gGrassyTerrainStarTemplate 0x82 0x1 0x0 - launchtemplate gGrassyTerrainStarTemplate 0x82 0x1 0x20 - launchtemplate gGrassyTerrainStarTemplate 0x82 0x1 0x40 - launchtemplate gGrassyTerrainStarTemplate 0x82 0x1 0x60 - launchtemplate gGrassyTerrainStarTemplate 0x82 0x1 0x80 - launchtemplate gGrassyTerrainStarTemplate 0x82 0x1 0xa0 - launchtemplate gGrassyTerrainStarTemplate 0x82 0x1 SOUND_PAN_ATTACKER - launchtemplate gGrassyTerrainStarTemplate 0x82 0x1 0xe0 + 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_W179, 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_W215, 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_W080, 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 - restorebg - waitbgfadein - panse_26 SE_W080, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x1, 0x0 - waitsound end Move_MISTY_TERRAIN:: loadspritegfx ANIM_TAG_ORBS @Recover Ball - loadspritegfx ANIM_TAG_GREEN_SPARKLE @Green Star loadspritegfx ANIM_TAG_WATER_GUN @Light Blue Colour + loadspritegfx ANIM_TAG_GREEN_SPARKLE playsewithpan SE_W215, SOUND_PAN_ATTACKER - launchtemplate gMistyTerrainOrbsTemplate 0x2 0x2 0x1a 0x0 - launchtemplate gMistyTerrainOrbsTemplate 0x2 0x2 0x1a 0x2a - launchtemplate gMistyTerrainOrbsTemplate 0x2 0x2 0x1a 0x54 - launchtemplate gMistyTerrainOrbsTemplate 0x2 0x2 0x1a 0x7e - launchtemplate gMistyTerrainOrbsTemplate 0x2 0x2 0x1a 0xa8 - launchtemplate gMistyTerrainOrbsTemplate 0x2 0x2 0x1a 0xd2 - delay 0x34 - setarg 0x7 0xffff - playsewithpan SE_W213, SOUND_PAN_ATTACKER - launchtask AnimTask_ScaleMonAndRestore 0x5 0x5 0xfff9 0xfff9 0xb 0x0 0x0 - launchtemplate gMistyTerrainStarTemplate 0x82 0x1 0x0 - launchtemplate gMistyTerrainStarTemplate 0x82 0x1 0x20 - launchtemplate gMistyTerrainStarTemplate 0x82 0x1 0x40 - launchtemplate gMistyTerrainStarTemplate 0x82 0x1 0x60 - launchtemplate gMistyTerrainStarTemplate 0x82 0x1 0x80 - launchtemplate gMistyTerrainStarTemplate 0x82 0x1 0xa0 - launchtemplate gMistyTerrainStarTemplate 0x82 0x1 SOUND_PAN_ATTACKER - launchtemplate gMistyTerrainStarTemplate 0x82 0x1 0xe0 + 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_W179, 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_W213, 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_W322 + 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 - restorebg - waitbgfadein - playsewithpan SE_W322, SOUND_PAN_ATTACKER - delay 0x40 end @@ -9315,31 +9331,37 @@ CoinShower: Move_ELECTRIC_TERRAIN:: loadspritegfx ANIM_TAG_ELECTRIC_ORBS playsewithpan SE_W268, SOUND_PAN_ATTACKER - launchtemplate gElectricTerrainOrbsTemplate 0x2 0x2 0x1a 0x0 - launchtemplate gElectricTerrainOrbsTemplate 0x2 0x2 0x1a 0x2a - launchtemplate gElectricTerrainOrbsTemplate 0x2 0x2 0x1a 0x54 - launchtemplate gElectricTerrainOrbsTemplate 0x2 0x2 0x1a 0x7e - launchtemplate gElectricTerrainOrbsTemplate 0x2 0x2 0x1a 0xa8 - launchtemplate gElectricTerrainOrbsTemplate 0x2 0x2 0x1a 0xd2 - delay 0x34 - setarg 0x7 0xffff - playsewithpan SE_W213, SOUND_PAN_ATTACKER - launchtask AnimTask_ScaleMonAndRestore 0x5 0x5 0xfff9 0xfff9 0xb 0x0 0x0 - launchtemplate gElectricTerrainFlyingBallTemplate 0x82 0x1 0x0 - launchtemplate gElectricTerrainFlyingBallTemplate 0x82 0x1 0x20 - launchtemplate gElectricTerrainFlyingBallTemplate 0x82 0x1 0x40 - launchtemplate gElectricTerrainFlyingBallTemplate 0x82 0x1 0x60 - launchtemplate gElectricTerrainFlyingBallTemplate 0x82 0x1 0x80 - launchtemplate gElectricTerrainFlyingBallTemplate 0x82 0x1 0xa0 - launchtemplate gElectricTerrainFlyingBallTemplate 0x82 0x1 SOUND_PAN_ATTACKER - launchtemplate gElectricTerrainFlyingBallTemplate 0x82 0x1 0xe0 + 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_W179, 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_W115, 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_W085B, SOUND_PAN_TARGET, 0x16, 0x3 + waitforvisualfinish + delay 2 + createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_BG, 3, 4, 0, RGB(28, 28, 0) waitforvisualfinish - restorebg - waitbgfadein - playsewithpan SE_W085B, SOUND_PAN_TARGET - delay 0x40 - playsewithpan SE_W085B, SOUND_PAN_TARGET - delay 0x40 end @@ -10998,31 +11020,38 @@ Move_PSYCHIC_TERRAIN:: loadspritegfx ANIM_TAG_GREEN_SPARKLE @Green Star loadspritegfx ANIM_TAG_POISON_BUBBLE @Purple Colour playsewithpan SE_W215, SOUND_PAN_ATTACKER - launchtemplate gPsychicTerrainOrbsTemplate 0x2 0x2 0x1a 0x0 - launchtemplate gPsychicTerrainOrbsTemplate 0x2 0x2 0x1a 0x2a - launchtemplate gPsychicTerrainOrbsTemplate 0x2 0x2 0x1a 0x54 - launchtemplate gPsychicTerrainOrbsTemplate 0x2 0x2 0x1a 0x7e - launchtemplate gPsychicTerrainOrbsTemplate 0x2 0x2 0x1a 0xa8 - launchtemplate gPsychicTerrainOrbsTemplate 0x2 0x2 0x1a 0xd2 - delay 0x34 - setarg 0x7 0xffff - playsewithpan SE_W213, SOUND_PAN_ATTACKER - launchtask AnimTask_ScaleMonAndRestore 0x5 0x5 0xfff9 0xfff9 0xb 0x0 0x0 - launchtemplate gPsychicTerrainStarTemplate 0x82 0x1 0x0 - launchtemplate gPsychicTerrainStarTemplate 0x82 0x1 0x20 - launchtemplate gPsychicTerrainStarTemplate 0x82 0x1 0x40 - launchtemplate gPsychicTerrainStarTemplate 0x82 0x1 0x60 - launchtemplate gPsychicTerrainStarTemplate 0x82 0x1 0x80 - launchtemplate gPsychicTerrainStarTemplate 0x82 0x1 0xa0 - launchtemplate gPsychicTerrainStarTemplate 0x82 0x1 SOUND_PAN_ATTACKER - launchtemplate gPsychicTerrainStarTemplate 0x82 0x1 0xe0 + createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0 waitforvisualfinish - restorebg - waitbgfadein + 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_W179, 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_W213, 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_W048, SOUND_PAN_TARGET, 0xa, 0x3 - waitsound + 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 From 548a43f8d965767d00c1a107a314a546615a067c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 25 Jun 2020 16:15:11 +0200 Subject: [PATCH 621/667] Rocky Helmet before Knock Off --- asm/macros/battle_script.inc | 5 ++ data/battle_scripts_1.s | 3 + include/battle.h | 1 + include/constants/battle_script_commands.h | 22 ++--- src/battle_script_commands.c | 93 +++++++++++++--------- 5 files changed, 76 insertions(+), 48 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 315c8c327d..a6a611b4b6 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1751,6 +1751,11 @@ 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 << 3 | \down << 7 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 86162ba850..94eaecc2d3 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7100,8 +7100,11 @@ BattleScript_RoughSkinActivates:: 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 diff --git a/include/battle.h b/include/battle.h index 8e49f2644f..a9c9516c89 100644 --- a/include/battle.h +++ b/include/battle.h @@ -547,6 +547,7 @@ struct BattleStruct 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 }; #define GET_MOVE_TYPE(move, typeArg) \ diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 4e6e56650f..764d0d422d 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -161,6 +161,7 @@ #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_manipulatedamage #define DMG_CHANGE_SIGN 0 @@ -200,16 +201,17 @@ #define MOVEEND_ATTACKER_VISIBLE 11 #define MOVEEND_TARGET_VISIBLE 12 #define MOVEEND_ITEM_EFFECTS_TARGET 13 -#define MOVEEND_ITEM_EFFECTS_ALL 14 -#define MOVEEND_KINGSROCK_SHELLBELL 15 -#define MOVEEND_SUBSTITUTE 16 -#define MOVEEND_UPDATE_LAST_MOVES 17 -#define MOVEEND_MIRROR_MOVE 18 -#define MOVEEND_NEXT_TARGET 19 -#define MOVEEND_LIFE_ORB 20 -#define MOVEEND_DANCER 21 -#define MOVEEND_CLEAR_BITS 22 -#define MOVEEND_COUNT 23 +#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_CLEAR_BITS 23 +#define MOVEEND_COUNT 24 // stat flags for Cmd_playstatchangeanimation #define BIT_HP 0x1 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 06fcbd4293..a4ee9be4da 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2179,6 +2179,14 @@ void SetMoveEffect(bool32 primary, u32 certain) bool32 statusChanged = FALSE; bool32 noSunCanFreeze = TRUE; + 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 @@ -2861,43 +2869,6 @@ void SetMoveEffect(bool32 primary, u32 certain) gBattleMons[gEffectBattler].status2 |= (((Random() & 1) + 2) << 0xA); } break; - case MOVE_EFFECT_KNOCK_OFF: - if (!CanBattlerGetOrLoseItem(gEffectBattler, gBattleMons[gEffectBattler].item)) - { - gBattlescriptCurrInstr++; - } - else if (GetBattlerAbility(gEffectBattler) == ABILITY_STICKY_HOLD) - { - if (gBattleMons[gEffectBattler].item == 0) - { - gBattlescriptCurrInstr++; - } - else - { - gLastUsedAbility = ABILITY_STICKY_HOLD; - gBattlescriptCurrInstr = BattleScript_StickyHoldActivates; - RecordAbilityBattle(gEffectBattler, ABILITY_STICKY_HOLD); - } - } - else if (gBattleMons[gEffectBattler].item) - { - side = GetBattlerSide(gEffectBattler); - - gLastUsedItem = gBattleMons[gEffectBattler].item; - gBattleMons[gEffectBattler].item = 0; - gWishFutureKnock.knockedOffMons[side] |= gBitTable[gBattlerPartyIndexes[gEffectBattler]]; - CheckSetUnburden(gEffectBattler); - - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_KnockedOff; - - gBattleStruct->choicedMove[gEffectBattler] = 0; - } - else - { - gBattlescriptCurrInstr++; - } - break; case MOVE_EFFECT_SP_ATK_TWO_DOWN: // Overheat BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_SAtkDown2; @@ -4437,6 +4408,36 @@ 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; @@ -4594,6 +4595,16 @@ static void Cmd_moveend(void) 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; @@ -6841,6 +6852,12 @@ static void Cmd_various(void) 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); @@ -9595,7 +9612,7 @@ static void Cmd_disablelastusedattack(void) gDisableStructs[gBattlerTarget].disableTimer = (Random() & 3) + 2; else if (B_DISABLE_TURNS == GEN_4) gDisableStructs[gBattlerTarget].disableTimer = (Random() & 3) + 4; - else + else gDisableStructs[gBattlerTarget].disableTimer = 4; gDisableStructs[gBattlerTarget].disableTimerStartValue = gDisableStructs[gBattlerTarget].disableTimer; // used to save the random amount of turns? gBattlescriptCurrInstr += 5; From 219a43304a1895de12e94cbe668455b857546e9e Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 26 Jun 2020 13:58:34 +0200 Subject: [PATCH 622/667] Improve Electro Ball animation --- data/battle_anim_scripts.s | 14 ++++++-------- src/battle_anim_electric.c | 36 +++++++++++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index c463cf82d2..dbbaa818e8 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -4834,31 +4834,29 @@ Move_SYCHRONOISE: Move_ELECTRO_BALL: loadspritegfx ANIM_TAG_SPARK_2 @yelow loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge - monbg 0x0 + loadspritegfx ANIM_TAG_FLASH_CANNON_BALL @ball + monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_W268, SOUND_PAN_ATTACKER - launchtemplate gGrowingChargeOrbSpriteTemplate 0x2 0x1 0x0 + createsprite gGrowingChargeOrb2SpriteTemplate, ANIM_ATTACKER, 2, 0 delay 0x19 playsewithpan SE_W268, SOUND_PAN_ATTACKER delay 0x14 playsewithpan SE_W268, SOUND_PAN_ATTACKER delay 0xF playsewithpan SE_W268, SOUND_PAN_ATTACKER - delay 0xA delay 0x6 loopsewithpan SE_W268, 0xC, 0x6, 0x5 waitforvisualfinish - loadspritegfx ANIM_TAG_FLASH_CANNON_BALL @ball - launchtemplate gElectroBallCannonBallTemplate, ANIM_TARGET, 2, 0x10, 0x10, 0x8 + createsprite gElectroBallCannonBallTemplate, ANIM_TARGET, 2, 16, 16, 8 waitforvisualfinish playsewithpan SE_W028, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon2, 0x2, 0x1, 0x4, 0x0, 0x8, 0x1 + createvisualtask AnimTask_ShakeMon2, 0x2, ANIM_TARGET, 0x4, 0x0, 0x8, 0x1 call ElectricityEffect waitforvisualfinish - clearmonbg 0x0 + clearmonbg ANIM_TARGET blendoff end - Move_SOAK: loadspritegfx ANIM_TAG_SMALL_BUBBLES diff --git a/src/battle_anim_electric.c b/src/battle_anim_electric.c index b03fdf204f..8d96e88f14 100644 --- a/src/battle_anim_electric.c +++ b/src/battle_anim_electric.c @@ -342,6 +342,19 @@ static const union AffineAnimCmd sAffineAnim_GrowingElectricOrb_2[] = AFFINEANIMCMD_END, }; +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, @@ -349,6 +362,11 @@ const union AffineAnimCmd *const gAffineAnims_GrowingElectricOrb[] = sAffineAnim_GrowingElectricOrb_2, }; +const union AffineAnimCmd *const gAffineAnims_GrowingElectricOrb2[] = +{ + sAffineAnim_GrowingElectricOrb_4, +}; + const struct SpriteTemplate gGrowingChargeOrbSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, @@ -360,6 +378,18 @@ const struct SpriteTemplate gGrowingChargeOrbSpriteTemplate = .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, +}; + static const union AnimCmd sAnim_ElectricPuff[] = { ANIMCMD_FRAME(0, 3), @@ -848,8 +878,8 @@ void AnimThunderWave(struct Sprite *sprite) 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; @@ -909,7 +939,7 @@ static void AnimTask_ElectricChargingParticles_Step(u8 taskId) 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]; From 5698af3742a6873e599b830e45ee048ed5c14635 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 26 Jun 2020 15:14:15 +0200 Subject: [PATCH 623/667] Magic Guard leech seed and slight ai tweaks --- data/battle_ai_scripts.s | 12 +++++++++ data/battle_scripts_1.s | 1 + src/battle_ai_script_commands.c | 2 +- src/battle_util.c | 43 ++++++++++++++++++++++----------- 4 files changed, 43 insertions(+), 15 deletions(-) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 35188065d1..f3cfe95caf 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -1014,6 +1014,17 @@ AI_WeakDmg: 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 @@ -1022,6 +1033,7 @@ AI_CheckViability: 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 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 94eaecc2d3..e380e64908 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6754,6 +6754,7 @@ BattleScript_BadDreamsLoop: 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 diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 6247df4bcd..6af1da9f31 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -1654,7 +1654,7 @@ static void Cmd_get_considered_move_effect(void) static s32 AI_GetAbility(u32 battlerId, bool32 guess) { // The AI knows its own ability. - if (IsBattlerAIControlled) + if (IsBattlerAIControlled(battlerId)) return gBattleMons[battlerId].ability; if (BATTLE_HISTORY->abilities[battlerId] != 0) diff --git a/src/battle_util.c b/src/battle_util.c index d8dcbf3e57..037b7875b3 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1417,9 +1417,18 @@ s32 GetDrainedBigRootHp(u32 battler, s32 hp) return hp * -1; } +#define MAGIC_GAURD_CHECK \ +if (ability == ABILITY_MAGIC_GUARD) \ +{\ + RecordAbilityBattle(gActiveBattler, ability);\ + gBattleStruct->turnEffectsTracker++;\ + break;\ +} + + u8 DoBattlerEndTurnEffects(void) { - u32 ability, effect = 0; + u32 ability, i, effect = 0; gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_x20); while (gBattleStruct->turnEffectsBattlerId < gBattlersCount && gBattleStruct->turnEffectsTracker <= ENDTURN_BATTLER_COUNT) @@ -1483,6 +1492,8 @@ u8 DoBattlerEndTurnEffects(void) && 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) @@ -1496,9 +1507,10 @@ u8 DoBattlerEndTurnEffects(void) break; case ENDTURN_POISON: // poison if ((gBattleMons[gActiveBattler].status1 & STATUS1_POISON) - && gBattleMons[gActiveBattler].hp != 0 - && ability != ABILITY_MAGIC_GUARD) + && gBattleMons[gActiveBattler].hp != 0) { + MAGIC_GAURD_CHECK; + if (ability == ABILITY_POISON_HEAL) { if (!BATTLER_MAX_HP(gActiveBattler) && !(gStatuses3[gActiveBattler] & STATUS3_HEAL_BLOCK)) @@ -1524,9 +1536,10 @@ u8 DoBattlerEndTurnEffects(void) break; case ENDTURN_BAD_POISON: // toxic poison if ((gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_POISON) - && gBattleMons[gActiveBattler].hp != 0 - && ability != ABILITY_MAGIC_GUARD) + && gBattleMons[gActiveBattler].hp != 0) { + MAGIC_GAURD_CHECK; + if (ability == ABILITY_POISON_HEAL) { if (!BATTLER_MAX_HP(gActiveBattler) && !(gStatuses3[gActiveBattler] & STATUS3_HEAL_BLOCK)) @@ -1555,9 +1568,10 @@ u8 DoBattlerEndTurnEffects(void) break; case ENDTURN_BURN: // burn if ((gBattleMons[gActiveBattler].status1 & STATUS1_BURN) - && gBattleMons[gActiveBattler].hp != 0 - && ability != ABILITY_MAGIC_GUARD) + && gBattleMons[gActiveBattler].hp != 0) { + MAGIC_GAURD_CHECK; + gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8); if (ability == ABILITY_HEATPROOF) gBattleMoveDamage /= 2; @@ -1570,9 +1584,9 @@ u8 DoBattlerEndTurnEffects(void) break; case ENDTURN_NIGHTMARES: // spooky nightmares if ((gBattleMons[gActiveBattler].status2 & STATUS2_NIGHTMARE) - && gBattleMons[gActiveBattler].hp != 0 - && ability != ABILITY_MAGIC_GUARD) + && 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) @@ -1592,9 +1606,9 @@ u8 DoBattlerEndTurnEffects(void) break; case ENDTURN_CURSE: // curse if ((gBattleMons[gActiveBattler].status2 & STATUS2_CURSED) - && gBattleMons[gActiveBattler].hp != 0 - && ability != ABILITY_MAGIC_GUARD) + && gBattleMons[gActiveBattler].hp != 0) { + MAGIC_GAURD_CHECK; gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 4; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; @@ -1608,6 +1622,8 @@ u8 DoBattlerEndTurnEffects(void) { if (--gDisableStructs[gActiveBattler].wrapTurns != 0) // damaged by wrap { + MAGIC_GAURD_CHECK; + gBattleScripting.animArg1 = gBattleStruct->wrappedMove[gActiveBattler]; gBattleScripting.animArg2 = gBattleStruct->wrappedMove[gActiveBattler] >> 8; PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleStruct->wrappedMove[gActiveBattler]); @@ -1708,7 +1724,6 @@ u8 DoBattlerEndTurnEffects(void) 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]) @@ -4006,7 +4021,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_IntimidateActivates; } - gBattlerAbility = gBattleStruct->intimidateBattler = i; + battler = gBattlerAbility = gBattleStruct->intimidateBattler = i; effect++; break; } @@ -4051,7 +4066,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } gBattleResources->flags->flags[i] &= ~(RESOURCE_FLAG_TRACED); gBattleStruct->tracedAbility[i] = gLastUsedAbility = gBattleMons[gActiveBattler].ability; - gBattlerAbility = gBattleScripting.battler = i; + battler = gBattlerAbility = gBattleScripting.battler = i; PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBattler, gBattlerPartyIndexes[gActiveBattler]) PREPARE_ABILITY_BUFFER(gBattleTextBuff2, gLastUsedAbility) From 59ddebd72713515f73bf30fe543671b918ba2ded Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 26 Jun 2020 21:56:18 +0200 Subject: [PATCH 624/667] Rocky Helmet softlock fix --- src/battle_util.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/battle_util.c b/src/battle_util.c index 037b7875b3..612652a81a 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4891,6 +4891,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) case HOLD_EFFECT_ROCKY_HELMET: if (TARGET_TURN_DAMAGED && IsMoveMakingContact(gCurrentMove, gBattlerAttacker) + && IsBattlerAlive(gBattlerAttacker) && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 6; From 04833ef6cfb322934fe24cece82c43d868316fea Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 26 Jun 2020 21:58:37 +0200 Subject: [PATCH 625/667] Purify works on steel types --- data/battle_scripts_1.s | 2 -- 1 file changed, 2 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e380e64908..bd3748b21a 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -427,8 +427,6 @@ BattleScript_EffectPurify: attackstring ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON - typecalc - jumpifmovehadnoeffect BattleScript_NotAffected jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_PurifyWorks goto BattleScript_ButItFailed BattleScript_PurifyWorks: From db715335c39117719254e8a8ae4c74640893da65 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 26 Jun 2020 22:20:00 +0200 Subject: [PATCH 626/667] Fix Gastro Acid animation --- data/battle_anim_scripts.s | 27 +++++++++++++-------------- src/battle_anim_poison.c | 7 +++++-- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index dbbaa818e8..95fdd37c25 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1382,31 +1382,30 @@ Move_POWER_TRICK: Move_GASTRO_ACID: loadspritegfx ANIM_TAG_GREEN_POISON_BUBBLE monbg ANIM_DEF_PARTNER - createsprite gGreenPoisonBubble, ANIM_TARGET, 2, 20, 0, 40, 1, 0, 0 + createsprite gGreenPoisonBubble, ANIM_TARGET, 2, 20, 0, 40, 1, 0, 0, FALSE playsewithpan SE_W145C, SOUND_PAN_ATTACKER delay 5 - createsprite gGreenPoisonBubble, ANIM_TARGET, 2, 20, 0, 40, 1, 24, 0 + createsprite gGreenPoisonBubble, ANIM_TARGET, 2, 20, 0, 40, 1, 24, 0, FALSE playsewithpan SE_W145C, SOUND_PAN_ATTACKER delay 5 - createsprite gGreenPoisonBubble, ANIM_TARGET, 2, 20, 0, 40, 1, -24, 0 + createsprite gGreenPoisonBubble, ANIM_TARGET, 2, 20, 0, 40, 1, -24, 0, FALSE playsewithpan SE_W145C, 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 gGreenPoisonDrip, ANIM_TARGET, 2, 0, -22, 0, 15, 55 + 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_W145, SOUND_PAN_TARGET delay 10 - createsprite gGreenPoisonDrip, ANIM_TARGET, 2, -26, -24, 0, 15, 55 + createsprite gGreenPoisonDrip, ANIM_TARGET, 2, -26, -24, 0, 15, 55, FALSE playsewithpan SE_W145, SOUND_PAN_TARGET delay 10 - createsprite gGreenPoisonDrip, ANIM_TARGET, 2, 15, -27, 0, 15, 50 + createsprite gGreenPoisonDrip, ANIM_TARGET, 2, 15, -27, 0, 15, 50, FALSE playsewithpan SE_W145, SOUND_PAN_TARGET delay 10 - createsprite gGreenPoisonDrip, ANIM_TARGET, 2, -15, -17, 0, 10, 45 + createsprite gGreenPoisonDrip, ANIM_TARGET, 2, -15, -17, 0, 10, 45, FALSE playsewithpan SE_W145, SOUND_PAN_TARGET delay 10 - createsprite gGreenPoisonDrip, ANIM_TARGET, 2, 27, -22, 0, 15, 50 + createsprite gGreenPoisonDrip, ANIM_TARGET, 2, 27, -22, 0, 15, 50, FALSE playsewithpan SE_W145, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -4962,7 +4961,7 @@ Move_LOW_SWEEP: Move_ACID_SPRAY: loadspritegfx ANIM_TAG_POISON_BUBBLE monbg ANIM_TARGET - createsprite gAcidPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, 20, 0, 40, 1, 0, -20 + createsprite gAcidPoisonBubbleSpriteTemplate, ANIM_TARGET, 2, 20, 0, 40, 1, 0, -20, FALSE playsewithpan SE_W145C, SOUND_PAN_ATTACKER delay 33 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 10, 1 @@ -19544,13 +19543,13 @@ 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_W145C, 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_W145C, 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_W145C, SOUND_PAN_ATTACKER delay 15 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 2, 0, 10, 1 diff --git a/src/battle_anim_poison.c b/src/battle_anim_poison.c index 0972c9bff2..f50ad1298d 100644 --- a/src/battle_anim_poison.c +++ b/src/battle_anim_poison.c @@ -424,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]; From 3cf091d63583786e14350dc3335e2e6f758f9a84 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 26 Jun 2020 23:28:46 +0200 Subject: [PATCH 627/667] Improve animations of moves hitting all foes --- data/battle_anim_scripts.s | 153 +++++++++++++++++++++++++++---------- include/battle_anim.h | 1 + src/battle_anim.c | 13 +++- src/battle_anim_electric.c | 3 +- src/battle_anim_mons.c | 48 +++++++++++- src/battle_anim_normal.c | 8 +- 6 files changed, 175 insertions(+), 51 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 95fdd37c25..157920bfea 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -3085,32 +3085,80 @@ Move_DISCHARGE: waitforvisualfinish createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 12, 12, RGB(0, 0, 23) waitforvisualfinish - createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 2 + 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, 1, 2 + 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, 1, 2 + 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, 1, 2 + 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, 1, 2 + 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, 1, 2 + 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, 1, 5, 14 + 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 ElectricityEffect + call DischargeElectrify waitforvisualfinish end +DischargeElectrify: + playsewithpan SE_W085B, 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 @@ -6854,20 +6902,20 @@ TechnoBlastElectric: playsewithpan SE_W052, 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 - launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfffb 0xa 0x5 0x1 + 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 - launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfff1 0xfff6 0x5 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 - launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfff8 0x8 0x5 0x2 + 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 - launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xffec 0xf 0x5 0x1 + 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 @@ -8520,23 +8568,23 @@ Move_ELECTRIFY:: playsewithpan SE_W085B, 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 + 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 + 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 - launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfff1 0xfff6 0x5 0x0 + 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 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0x19 0x0 0x5 0x1, ANIM_TARGET delay 0x2 - launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfff8 0x8 0x5 0x2 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfff8 0x8 0x5 0x2, ANIM_TARGET delay 0x2 - launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0x2 0xfff8 0x5 0x0 + launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0x2 0xfff8 0x5 0x0, ANIM_TARGET delay 0x2 - launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xffec 0xf 0x5 0x1 + 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 @@ -8656,14 +8704,16 @@ Move_MOONBLAST: Move_BOOMBURST: loadspritegfx ANIM_TAG_EXPLOSION loadspritegfx ANIM_TAG_THIN_RING - createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 | 0x8 + 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_W153, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 1 delay 4 @@ -8678,10 +8728,29 @@ Move_BOOMBURST: delay 4 playsewithpan SE_W153, SOUND_PAN_ATTACKER createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 16, 16, 1, 1 +Boomburst_Last: delay 4 - createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 | 0x8 + createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x4 | 0x8 | 0x10 waitforvisualfinish end +Boomburst_Doubles: + playsewithpan SE_W153, 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_W153, SOUND_PAN_ATTACKER + createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, 24, -24, 1, 1 + delay 4 + playsewithpan SE_W153, SOUND_PAN_ATTACKER + createsprite gExplosionSpriteTemplate, ANIM_ATTACKER, 3, -16, 16, 1, 1 + delay 4 + playsewithpan SE_W153, 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_W153, 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 @@ -9033,20 +9102,20 @@ Move_EERIE_IMPULSE:: waitforvisualfinish playsewithpan SE_W085B, SOUND_PAN_ATTACKER launchtemplate gEerieImpulseImpactTemplate 0x2 0x6 0x0 0xfffb 0x1 0x0 0x20 0x10 - launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0x5 0x0 0x5 0x0 - launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfffb 0xa 0x5 0x1 + 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 - launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfff1 0xfff6 0x5 0x0 + 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 - launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xfff8 0x8 0x5 0x2 + 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 - launchtemplate gElectricitySpriteTemplate 0x82, 0x4, 0xffec 0xf 0x5 0x1 + 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 @@ -23682,21 +23751,21 @@ WaterBubblesEffectLong: ElectricityEffect: playsewithpan SE_W085B, SOUND_PAN_TARGET ElectricityEffectNoSound: - createsprite gElectricitySpriteTemplate, ANIM_TARGET, 2, 5, 0, 5, 0 + 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: diff --git a/include/battle_anim.h b/include/battle_anim.h index b0a54c62b2..149e2e5d3b 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -87,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); diff --git a/src/battle_anim.c b/src/battle_anim.c index 835e7b2992..bf239efe48 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -1404,7 +1404,7 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_NewPokeball, 0x0080, ANIM_TAG_POKEBALL}, #else {gBattleAnimSpriteGfx_Pokeball, 0x0080, ANIM_TAG_POKEBALL}, - #endif + #endif {gBattleAnimSpriteGfx_Spotlight, 0x0800, ANIM_TAG_SPOTLIGHT}, {gBattleAnimSpriteGfx_LetterZ, 0x0200, ANIM_TAG_LETTER_Z}, {gBattleAnimSpriteGfx_RapidSpin, 0x0300, ANIM_TAG_RAPID_SPIN}, @@ -1422,7 +1422,7 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = #if NEW_MORNING_SUN_STAR_PARTICLE {gBattleAnimSpriteGfx_NewGreenStar, 0x0200, ANIM_TAG_GREEN_STAR}, #else - {gBattleAnimSpriteGfx_GreenStar, 0x0200, ANIM_TAG_GREEN_STAR}, + {gBattleAnimSpriteGfx_GreenStar, 0x0200, ANIM_TAG_GREEN_STAR}, #endif {gBattleAnimSpriteGfx_PinkCloud, 0x0200, ANIM_TAG_PINK_CLOUD}, {gBattleAnimSpriteGfx_SweatDrop, 0x0020, ANIM_TAG_SWEAT_DROP}, @@ -2184,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); } diff --git a/src/battle_anim_electric.c b/src/battle_anim_electric.c index 8d96e88f14..9c84c9555a 100644 --- a/src/battle_anim_electric.c +++ b/src/battle_anim_electric.c @@ -760,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) diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index 1e1482dabe..7c286f36ff 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -793,6 +793,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); @@ -1466,10 +1506,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_normal.c b/src/battle_anim_normal.c index fefa405627..0e45fe644c 100644 --- a/src/battle_anim_normal.c +++ b/src/battle_anim_normal.c @@ -813,6 +813,8 @@ void AnimTask_InvertScreenColor(u8 taskId) 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); @@ -1050,11 +1052,9 @@ 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; From 9fb073ca2326f55bc601816cbd57d11d83750ec9 Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Sat, 27 Jun 2020 05:21:13 -0400 Subject: [PATCH 628/667] Some cleanup (#454) * Toxic Thread doesn't have power. * Added missing commas. * Autotomize typo. It wasn't until today that I learned that autotomize was a word. --- asm/macros/battle_script.inc | 4 ++-- data/battle_ai_scripts.s | 4 ++-- data/battle_scripts_1.s | 20 ++++++++++---------- include/battle.h | 2 +- include/constants/battle_move_effects.h | 2 +- include/constants/battle_script_commands.h | 2 +- src/battle_script_commands.c | 4 ++-- src/battle_util.c | 2 +- src/data/battle_moves.h | 8 ++++---- 9 files changed, 24 insertions(+), 24 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index a6a611b4b6..8dcc64f39f 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1562,8 +1562,8 @@ .4byte \ptr .endm - .macro tryautonomize battler:req, ptr:req - various \battler, VARIOUS_TRY_AUTONOMIZE + .macro tryautotomize battler:req, ptr:req + various \battler, VARIOUS_TRY_AUTOTOMIZE .4byte \ptr .endm diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index f3cfe95caf..4ba7ca7624 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -247,7 +247,7 @@ AI_CheckBadMove_CheckEffect: @ 82DC045 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_AUTONOMIZE, AI_CBM_SpeedUp + 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 @@ -3477,7 +3477,7 @@ AI_SetupFirstTurn_SetupEffectsToEncourage: .2byte EFFECT_BULK_UP .2byte EFFECT_CALM_MIND .2byte EFFECT_ACUPRESSURE - .2byte EFFECT_AUTONOMIZE + .2byte EFFECT_AUTOTOMIZE .2byte EFFECT_SHIFT_GEAR .2byte EFFECT_SHELL_SMASH .2byte EFFECT_GROWTH diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index bd3748b21a..e5c8f18b58 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -317,7 +317,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectFinalGambit .4byte BattleScript_EffectTechnoBlast .4byte BattleScript_EffectJudgment - .4byte BattleScript_EffectAutonomize + .4byte BattleScript_EffectAutotomize .4byte BattleScript_EffectCopycat .4byte BattleScript_EffectDefog .4byte BattleScript_EffectHitEnemyHealAlly @@ -1039,27 +1039,27 @@ BattleScript_EffectInstruct: setbyte sB_ANIM_TARGETS_HIT, 0x0 jumptocalledmove TRUE -BattleScript_EffectAutonomize: +BattleScript_EffectAutotomize: setstatchanger STAT_SPEED, 2, FALSE attackcanceler attackstring ppreduce - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_AutonomizeWeightLoss - jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_AutonomizeAttackAnim + statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_ALLOW_PTR, BattleScript_AutotomizeWeightLoss + jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_AutotomizeAttackAnim pause 0x20 - goto BattleScript_AutonomizePrintString -BattleScript_AutonomizeAttackAnim:: + goto BattleScript_AutotomizePrintString +BattleScript_AutotomizeAttackAnim:: attackanimation waitanimation -BattleScript_AutonomizeDoAnim:: +BattleScript_AutotomizeDoAnim:: setgraphicalstatchangevalues playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 -BattleScript_AutonomizePrintString:: +BattleScript_AutotomizePrintString:: printfromtable gStatUpStringIds waitmessage 0x40 -BattleScript_AutonomizeWeightLoss:: +BattleScript_AutotomizeWeightLoss:: jumpifmovehadnoeffect BattleScript_MoveEnd - tryautonomize BS_ATTACKER, BattleScript_MoveEnd + tryautotomize BS_ATTACKER, BattleScript_MoveEnd printstring STRINGID_BECAMENIMBLE waitmessage 0x40 goto BattleScript_MoveEnd diff --git a/include/battle.h b/include/battle.h index a9c9516c89..520b4c136d 100644 --- a/include/battle.h +++ b/include/battle.h @@ -107,7 +107,7 @@ struct DisableStruct u8 truantSwitchInHack:1; u8 mimickedMoves:4; u8 rechargeTimer; - u8 autonomizeCount; + u8 autotomizeCount; u8 slowStartTimer; u8 embargoTimer; u8 magnetRiseTimer; diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 7b19d1eb71..abdd193771 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -304,7 +304,7 @@ #define EFFECT_FINAL_GAMBIT 298 #define EFFECT_TECHNO_BLAST 299 #define EFFECT_JUDGMENT 300 -#define EFFECT_AUTONOMIZE 301 +#define EFFECT_AUTOTOMIZE 301 #define EFFECT_COPYCAT 302 #define EFFECT_DEFOG 303 #define EFFECT_HIT_ENEMY_HEAL_ALLY 304 // Pollen Puff diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 764d0d422d..364aad8e5d 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -115,7 +115,7 @@ #define VARIOUS_TRY_LAST_RESORT 52 #define VARIOUS_ARGUMENT_STATUS_EFFECT 53 #define VARIOUS_TRY_HIT_SWITCH_TARGET 54 -#define VARIOUS_TRY_AUTONOMIZE 55 +#define VARIOUS_TRY_AUTOTOMIZE 55 #define VARIOUS_TRY_COPYCAT 56 #define VARIOUS_ABILITY_POPUP 57 #define VARIOUS_DEFOG 58 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a4ee9be4da..291a8fb0a4 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7684,10 +7684,10 @@ static void Cmd_various(void) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); } return; - case VARIOUS_TRY_AUTONOMIZE: + case VARIOUS_TRY_AUTOTOMIZE: if (GetBattlerWeight(gActiveBattler) > 1) { - gDisableStructs[gActiveBattler].autonomizeCount++; + gDisableStructs[gActiveBattler].autotomizeCount++; gBattlescriptCurrInstr += 7; } else diff --git a/src/battle_util.c b/src/battle_util.c index 612652a81a..716e568478 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5344,7 +5344,7 @@ u32 GetBattlerWeight(u8 battlerId) if (holdEffect == HOLD_EFFECT_FLOAT_STONE) weight /= 2; - for (i = 0; i < gDisableStructs[battlerId].autonomizeCount; i++) + for (i = 0; i < gDisableStructs[battlerId].autotomizeCount; i++) { if (weight > 1000) { diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index e07cad2d55..5c6c45e05f 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -3512,7 +3512,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGSROCK_AFFECTED | FLAG_DMG_UNDERWATER, - .split = SPLIT_SPECIAL + .split = SPLIT_SPECIAL, }, [MOVE_BEAT_UP] = @@ -4325,7 +4325,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 + .split = SPLIT_SPECIAL, }, [MOVE_METEOR_MASH] = @@ -6662,7 +6662,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_AUTOTOMIZE] = { - .effect = EFFECT_AUTONOMIZE, + .effect = EFFECT_AUTOTOMIZE, .power = 0, .type = TYPE_STEEL, .accuracy = 0, @@ -8915,7 +8915,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_TOXIC_THREAD] = { .effect = EFFECT_TOXIC_THREAD, - .power = 20, + .power = 0, .type = TYPE_POISON, .accuracy = 100, .pp = 0, From 5d037198b3eb0c8ad6242fdf891fecd8bf03e34a Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sun, 28 Jun 2020 05:11:06 -0300 Subject: [PATCH 629/667] Made Throat Chop be affected by Sheer Force (#455) Addresses #452 --- src/data/battle_moves.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 5c6c45e05f..473f059a3a 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -8964,7 +8964,7 @@ 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_SHEER_FORCE_BOOST, .split = SPLIT_PHYSICAL, }, From 3bdf675221471486536af656569fabb3343a5bd0 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 28 Jun 2020 19:45:48 +0200 Subject: [PATCH 630/667] Hopefully illusion works as intended now --- charmap.txt | 2 + data/battle_scripts_1.s | 1 + include/battle.h | 8 ++-- include/battle_message.h | 2 + include/constants/battle_script_commands.h | 1 + src/battle_gfx_sfx_util.c | 7 +-- src/battle_main.c | 1 + src/battle_message.c | 52 +++++++++++++++++++++- src/battle_util.c | 20 ++++++--- 9 files changed, 78 insertions(+), 16 deletions(-) diff --git a/charmap.txt b/charmap.txt index 8e0493408d..a377636d32 100644 --- a/charmap.txt +++ b/charmap.txt @@ -407,6 +407,8 @@ 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_scripts_1.s b/data/battle_scripts_1.s index e5c8f18b58..caffaa1553 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4946,6 +4946,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 diff --git a/include/battle.h b/include/battle.h index 520b4c136d..cb514f764c 100644 --- a/include/battle.h +++ b/include/battle.h @@ -429,9 +429,10 @@ struct MegaEvolutionData struct Illusion { - u8 on:1; - u8 broken:1; - u8 partyId:3; + u8 on; + u8 set; + u8 broken; + u8 partyId; struct Pokemon *mon; }; @@ -616,6 +617,7 @@ struct BattleScripting u16 savedMoveEffect; // For moves hitting multiple targets. u16 moveEffect; u16 multihitMoveEffect; + u8 illusionNickHack; // To properly display nick in STRINGID_ENEMYABOUTTOSWITCHPKMN. }; // rom_80A5C6C diff --git a/include/battle_message.h b/include/battle_message.h index 0236cc7934..89dce66df4 100644 --- a/include/battle_message.h +++ b/include/battle_message.h @@ -64,6 +64,8 @@ #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 diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 364aad8e5d..7173b17dbf 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -34,6 +34,7 @@ #define sSAVED_MOVE_EFFECT gBattleScripting + 0x2C #define sMOVE_EFFECT gBattleScripting + 0x2E #define sMULTIHIT_EFFECT gBattleScripting + 0x30 +#define sILLUSION_NICK_HACK gBattleScripting + 0x32 #define cMULTISTRING_CHOOSER gBattleCommunication + 5 diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 24366d9de2..1020d1f437 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -411,7 +411,7 @@ bool8 TryHandleLaunchBattleTableAnimation(u8 activeBattler, u8 atkBattler, u8 de } if (tableId == B_ANIM_ILLUSION_OFF) - ClearIllusionMon(activeBattler); + gBattleStruct->illusion[activeBattler].broken = 1; gBattleAnimAttacker = atkBattler; gBattleAnimTarget = defBattler; @@ -1158,11 +1158,6 @@ void ClearTemporarySpeciesSpriteData(u8 battlerId, bool8 dontClearSubstitute) gBattleMonForms[battlerId] = 0; if (!dontClearSubstitute) ClearBehindSubstituteBit(battlerId); - - if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) - SetIllusionMon(&gPlayerParty[gBattlerPartyIndexes[battlerId]], battlerId); - else - SetIllusionMon(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId); } void AllocateMonSpritesGfx(void) diff --git a/src/battle_main.c b/src/battle_main.c index ae4c87d831..085dfb2b07 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -2971,6 +2971,7 @@ void SwitchInClearSetData(void) s32 i; struct DisableStruct disableStructCopy = gDisableStructs[gActiveBattler]; + ClearIllusionMon(gActiveBattler); if (gBattleMoves[gCurrentMove].effect != EFFECT_BATON_PASS) { for (i = 0; i < NUM_BATTLE_STATS; i++) diff --git a/src/battle_message.c b/src/battle_message.c index ccc9b5e64f..738c90180b 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -19,6 +19,7 @@ #include "text.h" #include "trainer_hill.h" #include "window.h" +#include "constants/abilities.h" #include "constants/battle_string_ids.h" #include "constants/frontier_util.h" #include "constants/items.h" @@ -1529,7 +1530,7 @@ 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…"); @@ -2919,6 +2920,18 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) 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) break; @@ -3234,6 +3247,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; @@ -3306,6 +3350,12 @@ static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst) { 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 { if (GetBattlerSide(src[srcID + 1]) == B_SIDE_PLAYER) diff --git a/src/battle_util.c b/src/battle_util.c index 716e568478..f510f264ea 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3802,7 +3802,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } break; case ABILITY_ILLUSION: - if (gBattleStruct->illusion[battler].on && !gBattleStruct->illusion[battler].broken && IsBattlerAlive(battler) && TARGET_TURN_DAMAGED) + if (gBattleStruct->illusion[gBattlerTarget].on && !gBattleStruct->illusion[gBattlerTarget].broken && TARGET_TURN_DAMAGED) { BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_IllusionOff; @@ -6750,7 +6750,16 @@ bool32 CanBattlerGetOrLoseItem(u8 battlerId, u16 itemId) struct Pokemon *GetIllusionMonPtr(u32 battlerId) { - if (!gBattleStruct->illusion[battlerId].on || gBattleStruct->illusion[battlerId].broken) + 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; @@ -6758,9 +6767,7 @@ struct Pokemon *GetIllusionMonPtr(u32 battlerId) void ClearIllusionMon(u32 battlerId) { - gBattleStruct->illusion[battlerId].on = 0; - gBattleStruct->illusion[battlerId].mon = NULL; - gBattleStruct->illusion[battlerId].broken = 1; + memset(&gBattleStruct->illusion[battlerId], 0, sizeof(gBattleStruct->illusion[battlerId])); } bool32 SetIllusionMon(struct Pokemon *mon, u32 battlerId) @@ -6768,6 +6775,7 @@ 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; @@ -6784,7 +6792,7 @@ bool32 SetIllusionMon(struct Pokemon *mon, u32 battlerId) // Find last alive non-egg pokemon. for (i = PARTY_SIZE - 1; i >= 0; i--) { - id = GetPartyIdFromBattlePartyId(i); + id = i; if (GetMonData(&party[id], MON_DATA_SANITY_HAS_SPECIES) && GetMonData(&party[id], MON_DATA_HP) && &party[id] != mon From 36aec5658c0db8c8cc28b2548e37f5c6fe2d5be4 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 29 Jun 2020 13:45:27 +0200 Subject: [PATCH 631/667] Transform Imposter Illusion fix --- src/battle_gfx_sfx_util.c | 3 +++ src/battle_script_commands.c | 1 + src/battle_util.c | 1 + 3 files changed, 5 insertions(+) diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 1020d1f437..1ba934812d 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -411,7 +411,10 @@ bool8 TryHandleLaunchBattleTableAnimation(u8 activeBattler, u8 atkBattler, u8 de } if (tableId == B_ANIM_ILLUSION_OFF) + { gBattleStruct->illusion[activeBattler].broken = 1; + gBattleStruct->illusion[activeBattler].on = 0; + } gBattleAnimAttacker = atkBattler; gBattleAnimTarget = defBattler; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 291a8fb0a4..bc5579bddd 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -9404,6 +9404,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; diff --git a/src/battle_util.c b/src/battle_util.c index f510f264ea..0d84fdb520 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2943,6 +2943,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA 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); From 5ddb4634f5035191fdcf74725de5200f9338bd22 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 29 Jun 2020 18:04:13 +0200 Subject: [PATCH 632/667] berries work like in gen4 --- data/battle_scripts_1.s | 13 +- include/battle_scripts.h | 3 +- include/constants/battle_config.h | 4 + src/battle_util.c | 476 ++++++++++++++++++------------ 4 files changed, 299 insertions(+), 197 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index caffaa1553..3018deade5 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7334,8 +7334,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 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 8e1f8478d7..edbe47f469 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -200,7 +200,8 @@ 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[]; diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 489f6be0ff..d02cd5f6c1 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -90,6 +90,10 @@ #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_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_SLEEP_TURNS GEN_6 // In Gen5+, sleep lasts for 1-3 turns instead of 2-5 turns. diff --git a/src/battle_util.c b/src/battle_util.c index 0d84fdb520..e9ed5ed2ef 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4197,22 +4197,94 @@ enum }; // second argument is 1/X of current hp compared to max hp -static bool32 HasEnoughHpToEatBerry(u8 battlerId, u32 hpFraction) +static bool32 HasEnoughHpToEatBerry(u32 battlerId, u32 hpFraction, u32 itemId) { if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / hpFraction) { return TRUE; } - else if (hpFraction <= 4 && GetBattlerAbility(battlerId) == ABILITY_GLUTTONY + else if (hpFraction <= 4 && GetBattlerAbility(battlerId) == ABILITY_GLUTTONY && ItemId_GetPocket(itemId) == POCKET_BERRIES && gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2) { RecordAbilityBattle(battlerId, ABILITY_GLUTTONY); return TRUE; } - else + + return FALSE; +} + +static u8 HealConfuseBerry(u32 battlerId, u32 itemId, u8 flavorId) +{ + if (HasEnoughHpToEatBerry(battlerId, 2, itemId)) { - return FALSE; + 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; } u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) @@ -4221,12 +4293,11 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) u8 effect = ITEM_NO_EFFECT; u8 changedPP = 0; u8 battlerHoldEffect, atkHoldEffect; - u8 battlerHoldEffectParam, atkHoldEffectParam; + u8 atkHoldEffectParam; u16 atkItem; gLastUsedItem = gBattleMons[battlerId].item; battlerHoldEffect = GetBattlerHoldEffect(battlerId, TRUE); - battlerHoldEffectParam = GetBattlerHoldEffectParam(battlerId); atkItem = gBattleMons[gBattlerAttacker].item; atkHoldEffect = GetBattlerHoldEffect(gBattlerAttacker, TRUE); @@ -4260,6 +4331,152 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) 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) + { + 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) + { + 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) + { + 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) + { + 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) + { + 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) + { + 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 && HasEnoughHpToEatBerry(battlerId, 2, gLastUsedItem)) + { + gBattleMoveDamage = GetBattlerHoldEffectParam(battlerId) * -1; + BattleScriptExecute(BattleScript_ItemHealHP_RemoveItemEnd2); + effect = ITEM_HP_CHANGE; + } + break; case HOLD_EFFECT_AIR_BALLOON: effect = ITEM_EFFECT_OTHER; gBattleScripting.battler = battlerId; @@ -4267,8 +4484,23 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) RecordItemEffectBattle(battlerId, HOLD_EFFECT_AIR_BALLOON); break; } + if (effect) + { 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; case 1: @@ -4277,14 +4509,11 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) switch (battlerHoldEffect) { case HOLD_EFFECT_RESTORE_HP: - if (!moveTurn && HasEnoughHpToEatBerry(battlerId, 2)) + if (!moveTurn && HasEnoughHpToEatBerry(battlerId, 2, gLastUsedItem)) { - 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; + gBattleMoveDamage = GetBattlerHoldEffectParam(battlerId) *-1; + BattleScriptExecute(BattleScript_ItemHealHP_RemoveItemEnd2); + effect = ITEM_HP_CHANGE; } break; case HOLD_EFFECT_RESTORE_PP: @@ -4309,10 +4538,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); @@ -4368,166 +4597,48 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) 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 (!moveTurn && HasEnoughHpToEatBerry(battlerId, 2)) - { - 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 (!moveTurn && HasEnoughHpToEatBerry(battlerId, 2)) - { - 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 (!moveTurn && HasEnoughHpToEatBerry(battlerId, 2)) - { - 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 (!moveTurn && HasEnoughHpToEatBerry(battlerId, 2)) - { - 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 (!moveTurn && HasEnoughHpToEatBerry(battlerId, 2)) - { - 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 (!moveTurn && gBattleMons[battlerId].statStages[STAT_ATK] < 0xC && HasEnoughHpToEatBerry(battlerId, battlerHoldEffectParam)) - { - 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 (!moveTurn && gBattleMons[battlerId].statStages[STAT_DEF] < 0xC && HasEnoughHpToEatBerry(battlerId, battlerHoldEffectParam)) - { - 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 (!moveTurn && gBattleMons[battlerId].statStages[STAT_SPEED] < 0xC && HasEnoughHpToEatBerry(battlerId, battlerHoldEffectParam)) - { - 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 (!moveTurn && gBattleMons[battlerId].statStages[STAT_SPATK] < 0xC && HasEnoughHpToEatBerry(battlerId, battlerHoldEffectParam)) - { - 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 (!moveTurn && gBattleMons[battlerId].statStages[STAT_SPDEF] < 0xC && HasEnoughHpToEatBerry(battlerId, battlerHoldEffectParam)) - { - 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 (!moveTurn && !(gBattleMons[battlerId].status2 & STATUS2_FOCUS_ENERGY) && HasEnoughHpToEatBerry(battlerId, battlerHoldEffectParam)) + if (!moveTurn && !(gBattleMons[battlerId].status2 & STATUS2_FOCUS_ENERGY) && HasEnoughHpToEatBerry(battlerId, GetBattlerHoldEffectParam(battlerId), gLastUsedItem)) { gBattleMons[battlerId].status2 |= STATUS2_FOCUS_ENERGY; BattleScriptExecute(BattleScript_BerryFocusEnergyEnd2); @@ -4536,38 +4647,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) break; case HOLD_EFFECT_RANDOM_STAT_UP: if (!moveTurn) - { - for (i = 0; i < 5; i++) - { - if (gBattleMons[battlerId].statStages[STAT_ATK + i] < 0xC) - break; - } - if (i != 5 && HasEnoughHpToEatBerry(battlerId, battlerHoldEffectParam)) - { - 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); - effect = ITEM_STATS_CHANGE; - } - } + effect = RandomStatRaiseBerry(battlerId, gLastUsedItem); break; case HOLD_EFFECT_CURE_PAR: if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS) @@ -4677,9 +4757,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) if (effect) { - gBattleScripting.battler = battlerId; - gPotentialItemEffectBattler = battlerId; - gActiveBattler = gBattlerAttacker = battlerId; + gActiveBattler = gBattlerAttacker = gPotentialItemEffectBattler = gBattleScripting.battler = battlerId; switch (effect) { case ITEM_STATUS_CHANGE: @@ -4699,9 +4777,17 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) { gLastUsedItem = gBattleMons[battlerId].item; battlerHoldEffect = GetBattlerHoldEffect(battlerId, TRUE); - battlerHoldEffectParam = GetBattlerHoldEffectParam(battlerId); switch (battlerHoldEffect) { + case HOLD_EFFECT_RESTORE_HP: + if (B_HP_BERRIES >= GEN_4 && HasEnoughHpToEatBerry(battlerId, 2, gLastUsedItem)) + { + gBattleMoveDamage = GetBattlerHoldEffectParam(battlerId) *-1; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ItemHealHP_RemoveItemRet; + effect = ITEM_HP_CHANGE; + } + break; case HOLD_EFFECT_CURE_PAR: if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS) { @@ -4826,10 +4912,12 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) if (effect) { - gPotentialItemEffectBattler = gBattleScripting.battler = 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; } } From 5a2d9fe9fec3fe538b71036121646782ff252627 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 29 Jun 2020 18:26:53 +0200 Subject: [PATCH 633/667] Fix Grassy Terrain bad loop --- data/battle_scripts_1.s | 4 +++- include/battle_scripts.h | 2 +- src/battle_util.c | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 3018deade5..d6ea879a22 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6913,7 +6913,9 @@ BattleScript_MoveUsedPsychicTerrainPrevents:: waitmessage 0x40 goto BattleScript_MoveEnd -BattleScript_GrassyTerrainLoop:: +BattleScript_GrassyTerrainHeals:: + setbyte gBattleCommunication, 0 +BattleScript_GrassyTerrainLoop: copyarraywithindex gBattlerAttacker, gBattlerByTurnOrder, gBattleCommunication, 0x1 checkgrassyterrainheal BS_ATTACKER, BattleScript_GrassyTerrainLoopIncrement printstring STRINGID_GRASSYTERRAINHEALS diff --git a/include/battle_scripts.h b/include/battle_scripts.h index edbe47f469..af407d05ed 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -302,7 +302,7 @@ extern const u8 BattleScript_SpectralThiefSteal[]; extern const u8 BattleScript_StatUpMsg[]; extern const u8 BattleScript_DefiantActivates[]; extern const u8 BattleScript_PowderMoveNoEffect[]; -extern const u8 BattleScript_GrassyTerrainLoop[]; +extern const u8 BattleScript_GrassyTerrainHeals[]; extern const u8 BattleScript_VCreateStatLoss[]; extern const u8 BattleScript_SpikyShieldEffect[]; extern const u8 BattleScript_KingsShieldEffect[]; diff --git a/src/battle_util.c b/src/battle_util.c index e9ed5ed2ef..247fc631a8 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1308,7 +1308,7 @@ u8 DoFieldEndTurnEffects(void) { if (gFieldTimers.grassyTerrainTimer == 0 || --gFieldTimers.grassyTerrainTimer == 0) gFieldStatuses &= ~(STATUS_FIELD_GRASSY_TERRAIN); - BattleScriptExecute(BattleScript_GrassyTerrainLoop); + BattleScriptExecute(BattleScript_GrassyTerrainHeals); effect++; } gBattleStruct->turnCountersTracker++; From 89ed5bc8bb431bff76b2e94202e7ad9d963f5704 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 29 Jun 2020 18:40:05 +0200 Subject: [PATCH 634/667] Fix mega evo switch-in intimidate not working --- src/battle_script_commands.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index bc5579bddd..82896bf98f 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7228,6 +7228,8 @@ static void Cmd_various(void) 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; From 08a5ba0db2f7e8110c21b875b604e91411a2d4a8 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 29 Jun 2020 18:56:19 +0200 Subject: [PATCH 635/667] Sitrus berry gen4 effect code --- include/constants/hold_effects.h | 1 + src/battle_util.c | 60 ++++++++++++++++++++++---------- 2 files changed, 42 insertions(+), 19 deletions(-) diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index 9d4089101c..bdf042d637 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -103,6 +103,7 @@ #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 diff --git a/src/battle_util.c b/src/battle_util.c index 247fc631a8..608e191a5b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4287,6 +4287,29 @@ static u8 RandomStatRaiseBerry(u32 battlerId, u32 itemId) return 0; } +static u8 ItemHealHp(u32 battlerId, u32 itemId, bool32 end2, bool32 percentHeal) +{ + if (HasEnoughHpToEatBerry(battlerId, 2, gLastUsedItem)) + { + 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; +} + u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) { int i = 0, moveType; @@ -4470,12 +4493,12 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_RESTORE_HP: - if (B_BERRIES_INSTANT >= GEN_4 && HasEnoughHpToEatBerry(battlerId, 2, gLastUsedItem)) - { - gBattleMoveDamage = GetBattlerHoldEffectParam(battlerId) * -1; - BattleScriptExecute(BattleScript_ItemHealHP_RemoveItemEnd2); - effect = ITEM_HP_CHANGE; - } + 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; @@ -4509,12 +4532,12 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) switch (battlerHoldEffect) { case HOLD_EFFECT_RESTORE_HP: - if (!moveTurn && HasEnoughHpToEatBerry(battlerId, 2, gLastUsedItem)) - { - gBattleMoveDamage = GetBattlerHoldEffectParam(battlerId) *-1; - BattleScriptExecute(BattleScript_ItemHealHP_RemoveItemEnd2); - effect = ITEM_HP_CHANGE; - } + 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) @@ -4780,13 +4803,12 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) switch (battlerHoldEffect) { case HOLD_EFFECT_RESTORE_HP: - if (B_HP_BERRIES >= GEN_4 && HasEnoughHpToEatBerry(battlerId, 2, gLastUsedItem)) - { - gBattleMoveDamage = GetBattlerHoldEffectParam(battlerId) *-1; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_ItemHealHP_RemoveItemRet; - effect = ITEM_HP_CHANGE; - } + 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) From 52c63cd671114c2d365102dba4e5601ed6017df1 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 2 Jul 2020 11:58:48 +0200 Subject: [PATCH 636/667] lightning rod no longer redirects mold braker --- src/battle_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle_main.c b/src/battle_main.c index 085dfb2b07..a24d5554e1 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5174,8 +5174,8 @@ static void HandleAction_UseMove(void) { if (side != GetBattlerSide(gActiveBattler) && *(gBattleStruct->moveTarget + gBattlerAttacker) != gActiveBattler - && ((gBattleMons[gActiveBattler].ability == ABILITY_LIGHTNING_ROD && moveType == TYPE_ELECTRIC) - || (gBattleMons[gActiveBattler].ability == ABILITY_STORM_DRAIN && moveType == TYPE_WATER) + && ((GetBattlerAbility(gActiveBattler) == ABILITY_LIGHTNING_ROD && moveType == TYPE_ELECTRIC) + || (GetBattlerAbility(gActiveBattler) == ABILITY_STORM_DRAIN && moveType == TYPE_WATER) ) && GetBattlerTurnOrderNum(gActiveBattler) < var) { From fc510a6b44b96838e24f8311b208d7e335d5c0a9 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 8 Jul 2020 17:22:10 +0200 Subject: [PATCH 637/667] oran berry doesnt activate when mons is kill --- src/battle_util.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 608e191a5b..5cfc88051e 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4199,12 +4199,13 @@ enum // second argument is 1/X of current hp compared to max hp static bool32 HasEnoughHpToEatBerry(u32 battlerId, u32 hpFraction, u32 itemId) { + if (gBattleMons[battlerId].hp == 0) + return FALSE; if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / hpFraction) - { return TRUE; - } - else if (hpFraction <= 4 && GetBattlerAbility(battlerId) == ABILITY_GLUTTONY && ItemId_GetPocket(itemId) == POCKET_BERRIES - && gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2) + + if (hpFraction <= 4 && GetBattlerAbility(battlerId) == ABILITY_GLUTTONY && ItemId_GetPocket(itemId) == POCKET_BERRIES + && gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2) { RecordAbilityBattle(battlerId, ABILITY_GLUTTONY); return TRUE; From c93ab64e463b5676dfe438c78292cf25ab742e02 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 8 Jul 2020 17:38:28 +0200 Subject: [PATCH 638/667] UTurn Battle Arena no switchin --- data/battle_scripts_1.s | 2 ++ 1 file changed, 2 insertions(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index d6ea879a22..87f2f4bd87 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -593,6 +593,7 @@ BattleScript_EffectPartingShotTrySpAtk: 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 @@ -1981,6 +1982,7 @@ BattleScript_EffectHitEscape: 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 From e319c7da618c720c56799ee7dd41ee17f37963b4 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 8 Jul 2020 17:50:12 +0200 Subject: [PATCH 639/667] UTurn Battle Arena no switchin try number 2 --- src/battle_anim_utility_funcs.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/battle_anim_utility_funcs.c b/src/battle_anim_utility_funcs.c index 5dbd220238..30c0b5457c 100644 --- a/src/battle_anim_utility_funcs.c +++ b/src/battle_anim_utility_funcs.c @@ -1073,6 +1073,9 @@ void AnimTask_IsDoubleBattle(u8 taskId) void AnimTask_CanBattlerSwitch(u8 taskId) { - gBattleAnimArgs[ARG_RET_ID] = CanBattlerSwitch(GetAnimBattlerId(gBattleAnimArgs[0])); + if (gBattleTypeFlags & BATTLE_TYPE_ARENA) + gBattleAnimArgs[ARG_RET_ID] = TRUE; + else + gBattleAnimArgs[ARG_RET_ID] = CanBattlerSwitch(GetAnimBattlerId(gBattleAnimArgs[0])); DestroyAnimVisualTask(taskId); } From b1d0bc172188a1071d3b91ffe51c4a244dcbae0e Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 8 Jul 2020 17:51:01 +0200 Subject: [PATCH 640/667] UTurn Battle Arena no switchin try number 2 --- src/battle_anim_utility_funcs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_anim_utility_funcs.c b/src/battle_anim_utility_funcs.c index 30c0b5457c..afcb82186c 100644 --- a/src/battle_anim_utility_funcs.c +++ b/src/battle_anim_utility_funcs.c @@ -1074,7 +1074,7 @@ void AnimTask_IsDoubleBattle(u8 taskId) void AnimTask_CanBattlerSwitch(u8 taskId) { if (gBattleTypeFlags & BATTLE_TYPE_ARENA) - gBattleAnimArgs[ARG_RET_ID] = TRUE; + gBattleAnimArgs[ARG_RET_ID] = FALSE; else gBattleAnimArgs[ARG_RET_ID] = CanBattlerSwitch(GetAnimBattlerId(gBattleAnimArgs[0])); DestroyAnimVisualTask(taskId); From 43cfe70a7867c7451d8d40589155cceec5a64288 Mon Sep 17 00:00:00 2001 From: Eduardo Alvaro Quezada D'Ottone Date: Sat, 11 Jul 2020 06:14:45 -0400 Subject: [PATCH 641/667] Fix Sacred Fire and Fake Out's move data. (#465) --- src/data/battle_moves.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 473f059a3a..6b0909571f 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -3106,7 +3106,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, - .split = SPLIT_SPECIAL, + .split = SPLIT_PHYSICAL, }, [MOVE_MAGNITUDE] = @@ -3539,7 +3539,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 1, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, + .flags = FLAG_MAKES_CONTACT | FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_SHEER_FORCE_BOOST, .split = SPLIT_PHYSICAL, }, From 8c4f5f946d7e87a10d42f7179aaee401c0981fa4 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 11 Jul 2020 12:28:42 +0200 Subject: [PATCH 642/667] Curse defiant --- src/battle_util.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 5cfc88051e..9b99e5f0ba 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -521,7 +521,8 @@ void PrepareStringBattle(u16 stringId, u8 battler) 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 != BATTLE_PARTNER(gBattlerTarget) + && gSpecialStatuses[gBattlerTarget].changedStatsBattlerId != gBattlerTarget) { gBattlerAbility = gBattlerTarget; BattleScriptPushCursor(); From 6a7e87428052e9f49c9bb1cee5c868c93c0417f5 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 11 Jul 2020 12:38:14 +0200 Subject: [PATCH 643/667] Battle debug allows changing of all stat stages at once --- src/battle_debug.c | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/src/battle_debug.c b/src/battle_debug.c index 4b86b99631..20290ff969 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -124,6 +124,7 @@ enum VAR_U16_4_ENTRIES, VAL_S8, VAL_ITEM, + VAL_ALL_STAT_STAGES, }; enum @@ -988,6 +989,8 @@ static void CreateSecondaryListMenu(struct BattleDebugMenu *data) switch (data->currentMainListItemId) { case LIST_ITEM_ABILITY: + itemsCount = 1; + break; case LIST_ITEM_HELD_ITEM: itemsCount = 2; break; @@ -1005,7 +1008,7 @@ static void CreateSecondaryListMenu(struct BattleDebugMenu *data) itemsCount = ARRAY_COUNT(sStatsListItems); break; case LIST_ITEM_STAT_STAGES: - itemsCount = 7; + itemsCount = 8; break; case LIST_ITEM_STATUS1: listTemplate.items = sStatus1ListItems; @@ -1067,6 +1070,8 @@ static void PadString(const u8 *src, u8 *dst) dst[i] = EOS; } +static const u8 sTextAll[] = _("All"); + static void PrintSecondaryEntries(struct BattleDebugMenu *data) { u8 text[20]; @@ -1105,9 +1110,7 @@ static void PrintSecondaryEntries(struct BattleDebugMenu *data) // Allow changing all moves at once. Useful for testing in wild doubles. if (data->currentMainListItemId == LIST_ITEM_MOVES) { - u8 textAll[] = _("All"); - - PadString(textAll, text); + PadString(sTextAll, text); printer.currentY = printer.y = (i * yMultiplier) + sSecondaryListTemplate.upText_Y; AddTextPrinter(&printer, 0, NULL); } @@ -1138,7 +1141,7 @@ static void PrintSecondaryEntries(struct BattleDebugMenu *data) } break; case LIST_ITEM_STAT_STAGES: - for (i = 0; i < 7; i++) + for (i = 0; i < NUM_BATTLE_STATS - 1; i++) { u8 *txtPtr = StringCopy(text, gStatNamesTable[STAT_ATK + i]); txtPtr[0] = CHAR_SPACE; @@ -1158,6 +1161,10 @@ static void PrintSecondaryEntries(struct BattleDebugMenu *data) 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; } } @@ -1202,6 +1209,7 @@ static const u32 GetBitfieldValue(u32 value, u32 currBit, u32 bitsCount) static void UpdateBattlerValue(struct BattleDebugMenu *data) { + u32 i; switch (data->modifyArrows.typeOfVal) { case VAL_U8: @@ -1219,6 +1227,10 @@ static void UpdateBattlerValue(struct BattleDebugMenu *data) ((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; @@ -1514,9 +1526,18 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) data->modifyArrows.minValue = 0; data->modifyArrows.maxValue = 12; data->modifyArrows.maxDigits = 2; - 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]; + 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) From 1b56216d7c8e554ba795bc930559e5e2929b2e67 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 11 Jul 2020 14:25:57 +0200 Subject: [PATCH 644/667] Dry Skin Weather fix --- src/battle_util.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 9b99e5f0ba..71ddc75ecc 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3211,6 +3211,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA 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) @@ -3218,7 +3222,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) { BattleScriptPushCursorAndCallback(BattleScript_RainDishActivates); - gBattleMoveDamage = gBattleMons[battler].maxHP / 16; + gBattleMoveDamage = gBattleMons[battler].maxHP / (gLastUsedAbility == ABILITY_RAIN_DISH ? 16 : 8); if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; @@ -3320,6 +3324,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA effect++; } break; + SOLAR_POWER_HP_DROP: case ABILITY_SOLAR_POWER: if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY) { From 3e27de72fa90b6009000be739778f1a2f8d06d01 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 12 Jul 2020 10:09:23 +0200 Subject: [PATCH 645/667] AI learns abilities which halve/double damage --- src/battle_util.c | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 71ddc75ecc..9a734065d1 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1575,7 +1575,11 @@ u8 DoBattlerEndTurnEffects(void) gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8); if (ability == ABILITY_HEATPROOF) + { + if (gBattleMoveDamage > (gBattleMoveDamage / 2) + 1) // Record ability if the burn takes less damage than it normally would. + RecordAbilityBattle(gActiveBattler, ABILITY_HEATPROOF); gBattleMoveDamage /= 2; + } if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; BattleScriptExecute(BattleScript_BurnTurnDmg); @@ -5804,7 +5808,7 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef) static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, bool32 updateFlags) { - u32 i; + u32 i, ability; u32 holdEffectAtk, holdEffectParamAtk; u16 basePower = CalcMoveBasePower(move, battlerAtk, battlerDef); u16 holdEffectModifier; @@ -5921,12 +5925,17 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe } // target's abilities - switch (GetBattlerAbility(battlerDef)) + 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) @@ -5934,7 +5943,11 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe 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; @@ -6065,7 +6078,7 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe return ApplyModifier(modifier, basePower); } -static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, bool32 isCrit) +static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, bool32 isCrit, bool32 updateFlags) { u8 atkStage; u32 atkStat; @@ -6179,7 +6192,11 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b { 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; } @@ -6235,7 +6252,7 @@ static bool32 CanEvolve(u32 species) return FALSE; } -static u32 CalcDefenseStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, bool32 isCrit) +static u32 CalcDefenseStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, bool32 isCrit, bool32 updateFlags) { bool32 usesDefStat; u8 defStage; @@ -6287,15 +6304,27 @@ static u32 CalcDefenseStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, { 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) @@ -6514,8 +6543,8 @@ s32 CalculateMoveDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, s32 // long dmg basic formula dmg = ((gBattleMons[battlerAtk].level * 2) / 5) + 2; dmg *= gBattleMovePower; - dmg *= CalcAttackStat(move, battlerAtk, battlerDef, moveType, isCrit); - dmg /= CalcDefenseStat(move, battlerAtk, battlerDef, moveType, isCrit); + dmg *= CalcAttackStat(move, battlerAtk, battlerDef, moveType, isCrit, updateFlags); + dmg /= CalcDefenseStat(move, battlerAtk, battlerDef, moveType, isCrit, updateFlags); dmg = (dmg / 50) + 2; // Calculate final modifiers. From 78a1f351d9f847290d9fd62ec9c584eb3ec4d89a Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 12 Jul 2020 22:54:47 +0200 Subject: [PATCH 646/667] Fix stat stage bug --- src/battle_script_commands.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 82896bf98f..296fde3728 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8674,7 +8674,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr statValue = -GET_STAT_BUFF_VALUE(statValue); if (gBattleMons[gActiveBattler].statStages[statId] == 1) statValue = -1; - else if (gBattleMons[gActiveBattler].statStages[statId] == 2) + else if (gBattleMons[gActiveBattler].statStages[statId] == 2 && statValue < -2) statValue = -2; gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN; index = 1; @@ -8711,7 +8711,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr statValue = GET_STAT_BUFF_VALUE(statValue); if (gBattleMons[gActiveBattler].statStages[statId] == 11) statValue = 1; - else if (gBattleMons[gActiveBattler].statStages[statId] == 10) + else if (gBattleMons[gActiveBattler].statStages[statId] == 10 && statValue > 2) statValue = 2; gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN; index = 1; From 7e8ec4c3159ded9525a48522a852a28bee05f22d Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Mon, 13 Jul 2020 12:39:43 -0600 Subject: [PATCH 647/667] add gen 8 move data (#461) --- src/data/battle_moves.h | 491 ++++++++++++++++++++++++++++++ src/data/text/move_descriptions.h | 177 +++++++++++ src/data/text/move_names.h | 36 +++ 3 files changed, 704 insertions(+) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 6b0909571f..2582272bb3 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -9499,4 +9499,495 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .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/text/move_descriptions.h b/src/data/text/move_descriptions.h index 3a71d1576d..573c8785f8 100644 --- a/src/data/text/move_descriptions.h +++ b/src/data/text/move_descriptions.h @@ -2624,6 +2624,147 @@ static const u8 sPHOTON_GEYSERDescription[] = _( 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."); @@ -3308,4 +3449,40 @@ const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] = [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 401d57de8c..2b56c06411 100644 --- a/src/data/text/move_names.h +++ b/src/data/text/move_names.h @@ -677,4 +677,40 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = [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"), }; From 2c9b4f4b177ed177a98abb79a3c358bd9668863f Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 14 Jul 2020 10:39:54 +0200 Subject: [PATCH 648/667] Show targets in double battles while hitting multiple pokemon at once --- include/constants/battle_config.h | 1 + src/battle_controller_player.c | 102 +++++++++++++++++++++++------- 2 files changed, 79 insertions(+), 24 deletions(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index d02cd5f6c1..2571972ba0 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -96,6 +96,7 @@ // Other #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. diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 87effc2f7c..751e1ae6df 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" @@ -186,8 +187,6 @@ static void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(void) = 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}; @@ -349,22 +348,14 @@ static void sub_80577F0(void) // unused static void HandleInputChooseTarget(void) { s32 i; - u8 identities[4]; + 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]); - memcpy(identities, sTargetIdentities, ARRAY_COUNT(sTargetIdentities)); 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 (gMain.heldKeys & DPAD_ANY && gSaveBlock2Ptr->optionsButtonMode == 2) @@ -494,9 +485,60 @@ static void HandleInputChooseTarget(void) } } +static void HideShownTargets(void) +{ + s32 i; + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { + if (IsBattlerAlive(i) && gBattleSpritesDataPtr->healthBoxesData[i].healthboxIsBouncing && i != gActiveBattler) + { + gSprites[gBattlerSpriteIds[i]].callback = sub_8039B2C; + EndBounceEffect(i, BOUNCE_HEALTHBOX); + } + } +} + +static void HandleInputShowTargets(void) +{ + 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); + 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 = sub_8039AD8; + } +} + static void HandleInputChooseMove(void) { - bool32 canSelectTarget = FALSE; + 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) @@ -506,8 +548,6 @@ static void HandleInputChooseMove(void) if (gMain.newKeys & A_BUTTON) { - u8 moveTarget; - PlaySE(SE_SELECT); if (moveInfo->moves[gMoveSelectionCursor[gActiveBattler]] == MOVE_CURSE) { @@ -529,27 +569,37 @@ static void HandleInputChooseMove(void) if (!gBattleResources->bufferA[gActiveBattler][1]) // not a double battle { if (moveTarget & MOVE_TARGET_USER_OR_SELECTED && !gBattleResources->bufferA[gActiveBattler][2]) - canSelectTarget++; + 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 | MOVE_TARGET_ALLY))) - canSelectTarget++; // either selected or user + canSelectTarget = 1; // either selected or user if (moveTarget == (MOVE_TARGET_USER | MOVE_TARGET_ALLY) && IsBattlerAlive(BATTLE_PARTNER(gActiveBattler))) - canSelectTarget++; + 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) { if (gBattleStruct->mega.playerSelect) BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | RET_MEGA_EVOLUTION | (gMultiUsePlayerCursor << 8)); @@ -558,7 +608,7 @@ static void HandleInputChooseMove(void) HideMegaTriggerSprite(); PlayerBufferExecCompleted(); } - else + else if (canSelectTarget == 1) { gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseTarget; @@ -571,6 +621,10 @@ static void HandleInputChooseMove(void) gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = sub_8039AD8; } + else + { + gBattlerControllerFuncs[gActiveBattler] = HandleInputShowTargets; + } } else if (gMain.newKeys & B_BUTTON || gPlayerDpadHoldFrames > 59) { From 8f669bb57d59799ab9a0f68c9e2564ceb5620702 Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Tue, 14 Jul 2020 09:47:15 -0600 Subject: [PATCH 649/667] Add critical capture (#402) * add critical capture * synax and format fixes --- data/battle_anim_scripts.s | 11 +++++ include/battle.h | 4 +- include/battle_anim.h | 1 + include/constants/battle_anim.h | 1 + src/battle_anim_special.c | 88 +++++++++++++++++++++++++++++---- src/battle_controller_player.c | 12 ++++- src/battle_script_commands.c | 64 +++++++++++++++++++++--- 7 files changed, 161 insertions(+), 20 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 157920bfea..b2dddb17be 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -786,6 +786,7 @@ gBattleAnims_Special:: .4byte Special_SafariBallThrow @ B_ANIM_SAFARI_BALL_THROW .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 @@ -24449,3 +24450,13 @@ Special_SubstituteToMon: Special_MonToSubstitute: createvisualtask AnimTask_SwapMonSpriteToFromSubstitute, 2, FALSE end + +Special_CriticalCaptureBallThrow: + createvisualtask AnimTask_LoadBallGfx, 2 + delay 0 + playsewithpan SE_RU_HYUU, 0 + createvisualtask AnimTask_ThrowBall, 2 + createvisualtask AnimTask_IsBallBlockedByTrainer, 2 + jumpreteq -1, BallThrowTrainerBlock + goto BallThrowEnd + diff --git a/include/battle.h b/include/battle.h index cb514f764c..8d3acf954d 100644 --- a/include/battle.h +++ b/include/battle.h @@ -642,7 +642,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 field_9_x2:1; u8 field_9_x1C:3; diff --git a/include/battle_anim.h b/include/battle_anim.h index 149e2e5d3b..1784581859 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -219,6 +219,7 @@ void sub_8172EF0(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); diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index c320eeb670..b93cf65cac 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -533,6 +533,7 @@ #define B_ANIM_SAFARI_BALL_THROW 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 diff --git a/src/battle_anim_special.c b/src/battle_anim_special.c index bf0d1d438d..547d546d4e 100755 --- a/src/battle_anim_special.c +++ b/src/battle_anim_special.c @@ -77,6 +77,7 @@ static void RepeatBallOpenParticleAnimation(u8); static void TimerBallOpenParticleAnimation(u8); static void PremierBallOpenParticleAnimation(u8); static void sub_817330C(struct Sprite *); +static void CB_CriticalCaptureThrownBallMovement(struct Sprite *sprite); struct BallCaptureSuccessStarData { @@ -923,7 +924,10 @@ static void sub_817138C(struct Sprite *sprite) angle = 0; sprite->pos1.y += Cos(angle, 40); sprite->pos2.y = -Cos(angle, sprite->data[4]); - sprite->callback = sub_81713D0; + if (IsCriticalCapture()) + sprite->callback = CB_CriticalCaptureThrownBallMovement; + else + sprite->callback = sub_81713D0; } } @@ -1116,22 +1120,38 @@ static void sub_8171520(struct Sprite *sprite) case 5: sprite->data[3] += 0x100; state = sprite->data[3] >> 8; - if (state == gBattleSpritesDataPtr->animationData->ballThrowCaseId) + if (IsCriticalCapture()) { - sprite->affineAnimPaused = 1; - sprite->callback = sub_81717B4; - } - else - { - if (gBattleSpritesDataPtr->animationData->ballThrowCaseId == BALL_3_SHAKES_SUCCESS && state == 3) + if (gBattleSpritesDataPtr->animationData->criticalCaptureSuccess) { sprite->callback = sub_81717D8; sprite->affineAnimPaused = 1; } else { - sprite->data[3]++; sprite->affineAnimPaused = 1; + sprite->callback = sub_81717B4; + } + } + else + { + if (state == gBattleSpritesDataPtr->animationData->ballThrowCaseId) + { + sprite->affineAnimPaused = 1; + sprite->callback = sub_81717B4; + } + else + { + if (gBattleSpritesDataPtr->animationData->ballThrowCaseId == BALL_3_SHAKES_SUCCESS && state == 3) + { + sprite->callback = sub_81717D8; + sprite->affineAnimPaused = 1; + } + else + { + sprite->data[3]++; + sprite->affineAnimPaused = 1; + } } } break; @@ -2271,3 +2291,53 @@ void AnimTask_GetBattlersFromArg(u8 taskId) gBattleAnimTarget = gBattleSpritesDataPtr->animationData->animArg >> 8; DestroyAnimVisualTask(taskId); } + +bool8 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_BOWA); + + 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 = sub_81713D0; + } +} + diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 751e1ae6df..303932c185 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -2512,7 +2512,11 @@ static void PlayerHandleSuccessBallThrowAnim(void) { gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS; gDoingBattleAnim = TRUE; - InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gBattlerTarget, 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; } @@ -2522,7 +2526,11 @@ static void PlayerHandleBallThrowAnim(void) gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId; gDoingBattleAnim = TRUE; - InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gBattlerTarget, 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; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 296fde3728..f4d60f51f7 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -75,6 +75,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); @@ -11668,23 +11669,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 @@ -11692,7 +11711,11 @@ static void Cmd_handleballthrow(void) } else // not caught { - gBattleCommunication[MULTISTRING_CHOOSER] = shakes; + if (IsCriticalCapture()) + gBattleCommunication[MULTISTRING_CHOOSER] = shakes + 3; + else + gBattleCommunication[MULTISTRING_CHOOSER] = shakes; + gBattlescriptCurrInstr = BattleScript_ShakeBallThrow; } } @@ -12094,3 +12117,28 @@ static void Cmd_metalburstdamagecalculator(void) 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; +} + From ca2b8ebcaa6e8c0c52b909772b25376a64dd4040 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 14 Jul 2020 17:54:15 +0200 Subject: [PATCH 650/667] make it compile --- src/battle_anim_special.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_anim_special.c b/src/battle_anim_special.c index 547d546d4e..1e9e73c903 100755 --- a/src/battle_anim_special.c +++ b/src/battle_anim_special.c @@ -2292,7 +2292,7 @@ void AnimTask_GetBattlersFromArg(u8 taskId) DestroyAnimVisualTask(taskId); } -bool8 IsCriticalCapture(void) +bool32 IsCriticalCapture(void) { return gBattleSpritesDataPtr->animationData->isCriticalCapture; } From c10be546bc56122becef3642b0f080eb07e869ee Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 15 Jul 2020 12:31:50 +0200 Subject: [PATCH 651/667] Fix AI using normal moves on ground mons with Galvanize --- src/battle_ai_script_commands.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 6af1da9f31..3593868d64 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -933,7 +933,7 @@ s32 AI_CalcPartyMonDamage(u16 move, u8 battlerAtk, u8 battlerDef, struct Pokemon u16 AI_GetTypeEffectiveness(u16 move, u8 battlerAtk, u8 battlerDef) { - u16 typeEffectiveness; + u16 typeEffectiveness, moveType; SaveBattlerData(battlerAtk); SaveBattlerData(battlerDef); @@ -941,7 +941,10 @@ u16 AI_GetTypeEffectiveness(u16 move, u8 battlerAtk, u8 battlerDef) SetBattlerData(battlerAtk); SetBattlerData(battlerDef); - typeEffectiveness = CalcTypeEffectivenessMultiplier(move, gBattleMoves[move].type, battlerAtk, battlerDef, FALSE); + gBattleStruct->dynamicMoveType = 0; + SetTypeBeforeUsingMove(move, battlerAtk); + GET_MOVE_TYPE(move, moveType); + typeEffectiveness = CalcTypeEffectivenessMultiplier(move, moveType, battlerAtk, battlerDef, FALSE); RestoreBattlerData(battlerAtk); RestoreBattlerData(battlerDef); @@ -1706,12 +1709,9 @@ static void Cmd_check_ability(void) static void Cmd_get_highest_type_effectiveness(void) { s32 i; - u8 *dynamicMoveType; - gBattleStruct->dynamicMoveType = 0; gMoveResultFlags = 0; AI_THINKING_STRUCT->funcResult = 0; - for (i = 0; i < MAX_MON_MOVES; i++) { gCurrentMove = gBattleMons[sBattler_AI].moves[i]; @@ -1755,10 +1755,8 @@ static void Cmd_if_type_effectiveness(void) u8 damageVar; u32 effectivenessMultiplier; - gBattleStruct->dynamicMoveType = 0; gMoveResultFlags = 0; gCurrentMove = AI_THINKING_STRUCT->moveConsidered; - effectivenessMultiplier = AI_GetTypeEffectiveness(gCurrentMove, sBattler_AI, gBattlerTarget); switch (effectivenessMultiplier) { From 7cf5611c187b57c7eb00e7f05de2ed60e3749bf4 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 15 Jul 2020 13:20:52 +0200 Subject: [PATCH 652/667] Double battle frost breath ai strat --- data/battle_ai_scripts.s | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 4ba7ca7624..86b12d249f 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -725,10 +725,7 @@ 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 @@ -862,10 +859,9 @@ 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 @@ -3717,17 +3713,27 @@ AI_TryOnAlly: 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 From 1a94d27fe683a373c3ffc028c201d4fc7bb74abd Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 15 Jul 2020 17:21:12 +0200 Subject: [PATCH 653/667] Emergency Exit --- asm/macros/battle_ai_script.inc | 10 +++++++ data/battle_ai_scripts.s | 31 +++++++++++++++++++- data/battle_anim_scripts.s | 8 ++++++ data/battle_scripts_1.s | 33 ++++++++++++++++++++++ include/battle.h | 21 ++++---------- include/battle_scripts.h | 4 +++ include/constants/battle.h | 11 ++++++++ include/constants/battle_anim.h | 3 +- include/constants/battle_script_commands.h | 5 ++-- src/battle_ai_script_commands.c | 18 ++++++++++++ src/battle_anim_utility_funcs.c | 9 ++++++ src/battle_script_commands.c | 31 ++++++++++++++++++-- src/battle_util.c | 17 +++++++++++ 13 files changed, 180 insertions(+), 21 deletions(-) diff --git a/asm/macros/battle_ai_script.inc b/asm/macros/battle_ai_script.inc index 7fa775ef39..5b6d3b6db4 100644 --- a/asm/macros/battle_ai_script.inc +++ b/asm/macros/battle_ai_script.inc @@ -668,6 +668,16 @@ .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 + @ useful script macros .macro if_has_physical_move battler:req, ptr:req if_has_move_with_split \battler, SPLIT_PHYSICAL, \ptr diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 86b12d249f..5398a6c3d8 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -3610,10 +3610,39 @@ AI_ConsiderAllyChosenMove: 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_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 diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index b2dddb17be..111790923c 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -776,6 +776,7 @@ gBattleAnims_General:: .4byte General_TerrainPsychic .4byte General_IllusionOff .4byte General_FormChange + .4byte General_SlideOffScreen .align 2 gBattleAnims_Special:: @@ -24310,6 +24311,13 @@ General_FormChange: 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 diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 87f2f4bd87..b2e6f60122 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6553,6 +6553,39 @@ BattleScript_MoodyLower: 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 diff --git a/include/battle.h b/include/battle.h index 8d3acf954d..a36f2aeadc 100644 --- a/include/battle.h +++ b/include/battle.h @@ -51,16 +51,6 @@ #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 MOVE_TARGET_ALLY 0x80 - #define BATTLE_BUFFER_LINK_SIZE 0x1000 struct ResourceFlags @@ -68,11 +58,12 @@ struct ResourceFlags u32 flags[4]; }; -#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_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 { diff --git a/include/battle_scripts.h b/include/battle_scripts.h index af407d05ed..4ad35f108d 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -343,5 +343,9 @@ 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[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle.h b/include/constants/battle.h index 97e64a269e..d4f2c90b75 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -346,4 +346,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_anim.h b/include/constants/battle_anim.h index b93cf65cac..4224b2daf7 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -347,7 +347,7 @@ #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_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) @@ -524,6 +524,7 @@ #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 diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 7173b17dbf..afc6eb0e8b 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -211,8 +211,9 @@ #define MOVEEND_NEXT_TARGET 20 #define MOVEEND_LIFE_ORB 21 #define MOVEEND_DANCER 22 -#define MOVEEND_CLEAR_BITS 23 -#define MOVEEND_COUNT 24 +#define MOVEEND_EMERGENCY_EXIT 23 +#define MOVEEND_CLEAR_BITS 24 +#define MOVEEND_COUNT 25 // stat flags for Cmd_playstatchangeanimation #define BIT_HP 0x1 diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 3593868d64..7e081c764f 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -176,6 +176,8 @@ 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); // ewram EWRAM_DATA const u8 *gAIScriptPtr = NULL; @@ -304,6 +306,8 @@ static const BattleAICmdFunc sBattleAICmdTable[] = 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 }; static const u16 sDiscouragedPowerfulMoveEffects[] = @@ -2808,3 +2812,17 @@ 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; +} diff --git a/src/battle_anim_utility_funcs.c b/src/battle_anim_utility_funcs.c index afcb82186c..5afa17634c 100644 --- a/src/battle_anim_utility_funcs.c +++ b/src/battle_anim_utility_funcs.c @@ -1079,3 +1079,12 @@ void AnimTask_CanBattlerSwitch(u8 taskId) 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_script_commands.c b/src/battle_script_commands.c index f4d60f51f7..962a7fdc69 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4830,6 +4830,33 @@ static void Cmd_moveend(void) } 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; @@ -11701,7 +11728,7 @@ static void Cmd_handleballthrow(void) { if (IsCriticalCapture()) gBattleSpritesDataPtr->animationData->criticalCaptureSuccess = 1; - + gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_POKEBALL, &gLastUsedItem); if (CalculatePlayerPartyCount() == PARTY_SIZE) @@ -11715,7 +11742,7 @@ static void Cmd_handleballthrow(void) gBattleCommunication[MULTISTRING_CHOOSER] = shakes + 3; else gBattleCommunication[MULTISTRING_CHOOSER] = shakes; - + gBattlescriptCurrInstr = BattleScript_ShakeBallThrow; } } diff --git a/src/battle_util.c b/src/battle_util.c index 9a734065d1..48057afa0a 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3557,6 +3557,23 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA 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 From ec4c73711ef1889a60f17bd68cca67c4b99cde9d Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 15 Jul 2020 21:30:24 +0200 Subject: [PATCH 654/667] Rest Sleep Talk wake up awaraness --- asm/macros/battle_ai_script.inc | 5 ++ data/battle_ai_scripts.s | 8 ++- include/battle.h | 12 ++--- include/battle_ai_script_commands.h | 3 +- src/battle_ai_script_commands.c | 78 ++++++++++++++++++++--------- src/battle_script_commands.c | 1 + src/battle_util.c | 2 +- 7 files changed, 72 insertions(+), 37 deletions(-) diff --git a/asm/macros/battle_ai_script.inc b/asm/macros/battle_ai_script.inc index 5b6d3b6db4..8531c7a203 100644 --- a/asm/macros/battle_ai_script.inc +++ b/asm/macros/battle_ai_script.inc @@ -678,6 +678,11 @@ .byte \battler2 .endm + .macro is_wakeup_turn battler:req + .byte 0x78 + .byte \battler + .endm + @ useful script macros .macro if_has_physical_move battler:req, ptr:req if_has_move_with_split \battler, SPLIT_PHYSICAL, \ptr diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 5398a6c3d8..5a43eeb8a3 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -1096,9 +1096,9 @@ AI_CheckViability: 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 @@ -2387,10 +2387,6 @@ AI_CV_PainSplit_ScoreDown1: AI_CV_PainSplit_End: end -AI_CV_Snore: - score +2 - end - AI_CV_LockOn: if_random_less_than 128, AI_CV_LockOn_End score +2 @@ -2399,6 +2395,8 @@ 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 diff --git a/include/battle.h b/include/battle.h index a36f2aeadc..1d690a7fde 100644 --- a/include/battle.h +++ b/include/battle.h @@ -229,7 +229,7 @@ struct WishFutureKnock struct AI_SavedBattleMon { u8 ability; - u16 moves[4]; + u16 moves[MAX_MON_MOVES]; u16 heldItem; u16 species; }; @@ -249,17 +249,15 @@ struct AI_ThinkingStruct 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; }; diff --git a/include/battle_ai_script_commands.h b/include/battle_ai_script_commands.h index 04d580a84c..bd990d77ae 100644 --- a/include/battle_ai_script_commands.h +++ b/include/battle_ai_script_commands.h @@ -17,7 +17,8 @@ u8 BattleAI_ChooseMoveOrAction(void); bool32 IsTruantMonVulnerable(u32 battlerAI, u32 opposingBattler); bool32 IsBattlerAIControlled(u32 battlerId); void ClearBattlerMoveHistory(u8 battlerId); -void RecordMoveBattle(u8 battlerId, u32 move); +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/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 7e081c764f..f40e7a3828 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -178,6 +178,7 @@ 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); // ewram EWRAM_DATA const u8 *gAIScriptPtr = NULL; @@ -308,6 +309,7 @@ static const BattleAICmdFunc sBattleAICmdTable[] = Cmd_get_considered_move_split, // 0x75 Cmd_get_considered_move_target, // 0x76 Cmd_compare_speeds, // 0x77 + Cmd_is_wakeup_turn, // 0x78 }; static const u16 sDiscouragedPowerfulMoveEffects[] = @@ -463,7 +465,7 @@ bool32 IsTruantMonVulnerable(u32 battlerAI, u32 opposingBattler) for (i = 0; i < MAX_MON_MOVES; i++) { - u32 move = gBattleResources->battleHistory->usedMoves[opposingBattler].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) @@ -735,7 +737,7 @@ static void BattleAI_DoAIProcessing(void) static void RecordLastUsedMoveByTarget(void) { - RecordMoveBattle(gBattlerTarget, gLastMoves[gBattlerTarget]); + RecordKnownMove(gBattlerTarget, gLastMoves[gBattlerTarget]); } bool32 IsBattlerAIControlled(u32 battlerId) @@ -756,23 +758,30 @@ bool32 IsBattlerAIControlled(u32 battlerId) void ClearBattlerMoveHistory(u8 battlerId) { - s32 i; - - for (i = 0; i < MAX_MON_MOVES; i++) - BATTLE_HISTORY->usedMoves[battlerId].moves[i] = MOVE_NONE; + 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 RecordMoveBattle(u8 battlerId, u32 move) +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++) { - if (BATTLE_HISTORY->usedMoves[battlerId].moves[i] == move) + if (BATTLE_HISTORY->usedMoves[battlerId][i] == move) break; - if (BATTLE_HISTORY->usedMoves[battlerId].moves[i] == MOVE_NONE) + if (BATTLE_HISTORY->usedMoves[battlerId][i] == MOVE_NONE) { - BATTLE_HISTORY->usedMoves[battlerId].moves[i] = move; + BATTLE_HISTORY->usedMoves[battlerId][i] = move; break; } } @@ -835,7 +844,7 @@ static void SetBattlerData(u8 battlerId) for (i = 0; i < 4; i++) { - if (BATTLE_HISTORY->usedMoves[battlerId].moves[i] == 0) + if (BATTLE_HISTORY->usedMoves[battlerId][i] == 0) gBattleMons[battlerId].moves[i] = 0; } @@ -2020,7 +2029,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) @@ -2054,7 +2063,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) @@ -2087,7 +2096,7 @@ static void Cmd_if_has_move_with_effect(void) case AI_TARGET_PARTNER: for (i = 0; i < MAX_MON_MOVES; i++) { - if (gBattleMons[gBattlerTarget].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) @@ -2120,7 +2129,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) @@ -2516,7 +2525,7 @@ static void Cmd_if_has_no_attacking_moves(void) { for (i = 0; i < 4; i++) { - if (BATTLE_HISTORY->usedMoves[battlerId].moves[i] != 0 && gBattleMoves[BATTLE_HISTORY->usedMoves[battlerId].moves[i]].power != 0) + if (BATTLE_HISTORY->usedMoves[battlerId][i] != 0 && gBattleMoves[BATTLE_HISTORY->usedMoves[battlerId][i]].power != 0) break; } } @@ -2590,7 +2599,7 @@ static bool32 HasMoveWithSplit(u32 battler, u32 split) if (IsBattlerAIControlled(battler) || IsBattlerAIControlled(BATTLE_PARTNER(battler))) moves = gBattleMons[battler].moves; else - moves = gBattleResources->battleHistory->usedMoves[battler].moves; + moves = gBattleResources->battleHistory->usedMoves[battler]; for (i = 0; i < MAX_MON_MOVES; i++) { @@ -2629,7 +2638,7 @@ static bool32 MovesWithSplitUnusable(u32 attacker, u32 target, u32 split) if (IsBattlerAIControlled(attacker)) moves = gBattleMons[attacker].moves; else - moves = gBattleResources->battleHistory->usedMoves[attacker].moves; + moves = gBattleResources->battleHistory->usedMoves[attacker]; for (i = 0; i < MAX_MON_MOVES; i++) { @@ -2661,7 +2670,7 @@ 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].moves; + u16 *moves = gBattleResources->battleHistory->usedMoves[gBattlerTarget]; for (i = 0; i < MAX_MON_MOVES; i++) { @@ -2694,7 +2703,7 @@ static void Cmd_if_has_move_with_type(void) if (IsBattlerAIControlled(battler)) moves = gBattleMons[battler].moves; else - moves = BATTLE_HISTORY->usedMoves[battler].moves; + moves = BATTLE_HISTORY->usedMoves[battler]; for (i = 0; i < 4; i++) { @@ -2721,7 +2730,7 @@ static void Cmd_if_has_move_with_flag(void) if (IsBattlerAIControlled(battler)) moves = gBattleMons[battler].moves; else - moves = BATTLE_HISTORY->usedMoves[battler].moves; + moves = BATTLE_HISTORY->usedMoves[battler]; flag = T1_READ_32(gAIScriptPtr + 2); for (i = 0; i < 4; i++) @@ -2744,7 +2753,7 @@ static void Cmd_if_no_move_used(void) { for (i = 0; i < 4; i++) { - if (BATTLE_HISTORY->usedMoves[battler].moves[i] != 0 && BATTLE_HISTORY->usedMoves[battler].moves[i] != 0xFFFF) + if (BATTLE_HISTORY->usedMoves[battler][i] != 0 && BATTLE_HISTORY->usedMoves[battler][i] != 0xFFFF) { gAIScriptPtr += 6; return; @@ -2826,3 +2835,26 @@ static void Cmd_compare_speeds(void) 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; +} diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 962a7fdc69..54412d8df0 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4781,6 +4781,7 @@ static void Cmd_moveend(void) gHitMarker &= ~(HITMARKER_NO_PPDEDUCT); } } + RecordLastUsedMoveBy(gBattlerAttacker, gCurrentMove); gBattleScripting.moveendState++; break; case MOVEEND_LIFE_ORB: diff --git a/src/battle_util.c b/src/battle_util.c index 48057afa0a..53cdbe10d3 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2860,7 +2860,7 @@ static u8 ForewarnChooseMove(u32 battler) gBattlerTarget = data[bestId].battlerId; PREPARE_MOVE_BUFFER(gBattleTextBuff1, data[bestId].moveId) - RecordMoveBattle(gBattlerTarget, data[bestId].moveId); + RecordKnownMove(gBattlerTarget, data[bestId].moveId); free(data); } From 60d5d00dba36ed511c4540175b8b9b358fe81617 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 16 Jul 2020 14:17:38 +0200 Subject: [PATCH 655/667] Unnerve --- src/battle_util.c | 54 +++++++++++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 53cdbe10d3..86ba3b52a0 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4226,12 +4226,17 @@ enum // 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 && ItemId_GetPocket(itemId) == POCKET_BERRIES + if (hpFraction <= 4 && GetBattlerAbility(battlerId) == ABILITY_GLUTTONY && isBerry && gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2) { RecordAbilityBattle(battlerId, ABILITY_GLUTTONY); @@ -4338,6 +4343,13 @@ static u8 ItemHealHp(u32 battlerId, u32 itemId, bool32 end2, bool32 percentHeal) 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, moveType; @@ -4435,7 +4447,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) effect = RandomStatRaiseBerry(battlerId, gLastUsedItem); break; case HOLD_EFFECT_CURE_PAR: - if (B_BERRIES_INSTANT >= GEN_4 && gBattleMons[battlerId].status1 & STATUS1_PARALYSIS) + if (B_BERRIES_INSTANT >= GEN_4 && gBattleMons[battlerId].status1 & STATUS1_PARALYSIS && !UnnerveOn(battlerId, gLastUsedItem)) { gBattleMons[battlerId].status1 &= ~(STATUS1_PARALYSIS); BattleScriptExecute(BattleScript_BerryCurePrlzEnd2); @@ -4443,7 +4455,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_CURE_PSN: - if (B_BERRIES_INSTANT >= GEN_4 && gBattleMons[battlerId].status1 & STATUS1_PSN_ANY) + 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); @@ -4451,7 +4463,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_CURE_BRN: - if (B_BERRIES_INSTANT >= GEN_4 && gBattleMons[battlerId].status1 & STATUS1_BURN) + if (B_BERRIES_INSTANT >= GEN_4 && gBattleMons[battlerId].status1 & STATUS1_BURN && !UnnerveOn(battlerId, gLastUsedItem)) { gBattleMons[battlerId].status1 &= ~(STATUS1_BURN); BattleScriptExecute(BattleScript_BerryCureBrnEnd2); @@ -4459,7 +4471,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_CURE_FRZ: - if (B_BERRIES_INSTANT >= GEN_4 && gBattleMons[battlerId].status1 & STATUS1_FREEZE) + if (B_BERRIES_INSTANT >= GEN_4 && gBattleMons[battlerId].status1 & STATUS1_FREEZE && !UnnerveOn(battlerId, gLastUsedItem)) { gBattleMons[battlerId].status1 &= ~(STATUS1_FREEZE); BattleScriptExecute(BattleScript_BerryCureFrzEnd2); @@ -4467,7 +4479,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_CURE_SLP: - if (B_BERRIES_INSTANT >= GEN_4 && gBattleMons[battlerId].status1 & STATUS1_SLEEP) + if (B_BERRIES_INSTANT >= GEN_4 && gBattleMons[battlerId].status1 & STATUS1_SLEEP && !UnnerveOn(battlerId, gLastUsedItem)) { gBattleMons[battlerId].status1 &= ~(STATUS1_SLEEP); gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE); @@ -4476,7 +4488,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_CURE_STATUS: - if (B_BERRIES_INSTANT >= GEN_4 && gBattleMons[battlerId].status1 & STATUS1_ANY || gBattleMons[battlerId].status2 & STATUS2_CONFUSION) + 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) @@ -4701,7 +4713,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 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); @@ -4709,7 +4721,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); @@ -4717,7 +4729,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); @@ -4725,7 +4737,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); @@ -4733,7 +4745,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); @@ -4742,7 +4754,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); @@ -4750,7 +4762,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) @@ -4839,7 +4851,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) 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(); @@ -4848,7 +4860,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(); @@ -4857,7 +4869,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(); @@ -4866,7 +4878,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(); @@ -4875,7 +4887,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); @@ -4885,7 +4897,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(); @@ -4905,7 +4917,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) { From 759bde46bbacae7355d878efbc79d0384b6ad851 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 16 Jul 2020 15:20:03 +0200 Subject: [PATCH 656/667] Cheek Pouch --- data/battle_scripts_1.s | 15 +++++++++++++-- include/battle_scripts.h | 1 + src/battle_script_commands.c | 31 ++++++++++++++++++++++++++----- src/battle_util.c | 2 +- 4 files changed, 41 insertions(+), 8 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index b2e6f60122..152edce382 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6606,15 +6606,26 @@ BattleScript_ReceiverActivates:: waitmessage 0x40 settracedability BS_ABILITY_BATTLER return - -BattleScript_RainDishActivates:: + +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 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 4ad35f108d..bcbf68cb49 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -347,5 +347,6 @@ 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/src/battle_script_commands.c b/src/battle_script_commands.c index 54412d8df0..055ba2f2f5 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6247,21 +6247,42 @@ static void Cmd_setgravity(void) } else { - u32 i; - gFieldStatuses |= STATUS_FIELD_GRAVITY; gFieldTimers.gravityTimer = 5; gBattlescriptCurrInstr += 5; } } +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)) + { + gBattleMoveDamage = gBattleMons[battlerId].maxHP / 3; + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage *= -1; + gBattlerAbility = battlerId; + BattleScriptPush(gBattlescriptCurrInstr + 2); + gBattlescriptCurrInstr = BattleScript_CheekPouchActivates; + return TRUE; + } + return FALSE; +} + static void Cmd_removeitem(void) { + 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] = gBattleMons[gActiveBattler].item; + gBattleStruct->usedHeldItems[gActiveBattler] = itemId; gBattleMons[gActiveBattler].item = 0; CheckSetUnburden(gActiveBattler); @@ -6270,8 +6291,8 @@ static void Cmd_removeitem(void) MarkBattlerForControllerExec(gActiveBattler); ClearBattlerItemEffectHistory(gActiveBattler); - - gBattlescriptCurrInstr += 2; + if (!TryCheekPouch(gActiveBattler, itemId)) + gBattlescriptCurrInstr += 2; } static void Cmd_atknameinbuff1(void) diff --git a/src/battle_util.c b/src/battle_util.c index 86ba3b52a0..8bc8863eef 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4322,7 +4322,7 @@ static u8 RandomStatRaiseBerry(u32 battlerId, u32 itemId) static u8 ItemHealHp(u32 battlerId, u32 itemId, bool32 end2, bool32 percentHeal) { - if (HasEnoughHpToEatBerry(battlerId, 2, gLastUsedItem)) + if (HasEnoughHpToEatBerry(battlerId, 2, itemId)) { if (percentHeal) gBattleMoveDamage = (gBattleMons[battlerId].maxHP * GetBattlerHoldEffectParam(battlerId) / 100) * -1; From 42f48d1a6109a187fc5bb2207b800f41650a9645 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 16 Jul 2020 15:40:56 +0200 Subject: [PATCH 657/667] Power Construct --- include/battle.h | 1 + include/constants/battle_config.h | 3 +++ src/battle_util.c | 17 +++++++++++++++++ 3 files changed, 21 insertions(+) diff --git a/include/battle.h b/include/battle.h index 1d690a7fde..12e2caa805 100644 --- a/include/battle.h +++ b/include/battle.h @@ -538,6 +538,7 @@ struct BattleStruct 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) \ diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 2571972ba0..fd45ff2428 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -19,6 +19,9 @@ #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 diff --git a/src/battle_util.c b/src/battle_util.c index 8bc8863eef..7aa6817aeb 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3357,6 +3357,16 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA 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; @@ -6851,6 +6861,13 @@ void UndoMegaEvolution(u32 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) From 14daa9f4a5055bfeeb139e14a5abad9f4425d90e Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 17 Jul 2020 20:53:22 +0200 Subject: [PATCH 658/667] Inverse battles --- include/constants/battle_config.h | 1 + src/battle_util.c | 39 ++++++++++++++++++++++++++----- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index fd45ff2428..73f528b2d9 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -98,6 +98,7 @@ #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. diff --git a/src/battle_util.c b/src/battle_util.c index 7aa6817aeb..6185eff914 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -280,6 +280,30 @@ static const u16 sTypeEffectivenessTable[NUMBER_OF_MON_TYPES][NUMBER_OF_MON_TYPE {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 @@ -6604,7 +6628,7 @@ s32 CalculateMoveDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, s32 static void MulByTypeEffectiveness(u16 *modifier, u16 move, u8 moveType, u8 battlerDef, u8 defType, u8 battlerAtk, bool32 recordAbilities) { - u16 mod = sTypeEffectivenessTable[moveType][defType]; + u16 mod = GetTypeModifier(moveType, defType); if (mod == UQ_4_12(0.0) && GetBattlerHoldEffect(battlerDef, TRUE) == HOLD_EFFECT_RING_TARGET) { @@ -6612,22 +6636,22 @@ static void MulByTypeEffectiveness(u16 *modifier, u16 move, u8 moveType, u8 batt if (recordAbilities) RecordItemEffectBattle(battlerDef, HOLD_EFFECT_RING_TARGET); } - else if ((moveType == TYPE_FIGHTING || moveType == TYPE_NORMAL) && defType == TYPE_GHOST && gBattleMons[battlerDef].status2 & STATUS2_FORESIGHT) + 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) + 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) + 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)) + 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) @@ -6735,7 +6759,10 @@ u16 CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u8 ability u16 GetTypeModifier(u8 atkType, u8 defType) { - return sTypeEffectivenessTable[atkType][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) From 1ad76ff3d23d75dc8b678ff10569bab1fc06c9b3 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 26 Jul 2020 12:32:02 +0200 Subject: [PATCH 659/667] Fix Aftermath on fainted --- src/battle_util.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 6185eff914..c4c0f23289 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3730,6 +3730,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA if (!IsAbilityOnField(ABILITY_DAMP) && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && gBattleMons[gBattlerTarget].hp == 0 + && IsBattlerAlive(gBattlerAttacker) && IsMoveMakingContact(move, gBattlerAttacker)) { gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 4; @@ -3742,7 +3743,8 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA break; case ABILITY_INNARDS_OUT: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && gBattleMons[gBattlerTarget].hp == 0) + && gBattleMons[gBattlerTarget].hp == 0 + && IsBattlerAlive(gBattlerAttacker)) { gBattleMoveDamage = gSpecialStatuses[gBattlerTarget].dmg; BattleScriptPushCursor(); From 3a220d0733d4a82ac5bae33f6d2552327842d8d7 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 26 Jul 2020 13:48:25 +0200 Subject: [PATCH 660/667] ai tweaks --- asm/macros/battle_ai_script.inc | 7 ++++ data/battle_ai_scripts.s | 53 ++++++++++++++++++++++++++++- src/battle_ai_script_commands.c | 60 ++++++++++++++++++++------------- 3 files changed, 95 insertions(+), 25 deletions(-) diff --git a/asm/macros/battle_ai_script.inc b/asm/macros/battle_ai_script.inc index 8531c7a203..88acc34b69 100644 --- a/asm/macros/battle_ai_script.inc +++ b/asm/macros/battle_ai_script.inc @@ -683,6 +683,13 @@ .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 diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index 5a43eeb8a3..6d19f302b3 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -268,6 +268,18 @@ AI_CheckBadMove_CheckEffect: @ 82DC045 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: @@ -1122,6 +1134,7 @@ 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 @@ -1970,6 +1983,7 @@ AI_CV_Rest_End: end AI_CV_OneHitKO: + if_status3 AI_TARGET, STATUS3_ALWAYS_HITS, Score_Plus5 end AI_CV_SuperFang: @@ -2034,6 +2048,9 @@ AI_CV_FocusEnergy2: 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: @@ -2386,10 +2403,32 @@ AI_CV_PainSplit_ScoreDown1: AI_CV_PainSplit_End: end + +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 @@ -2854,8 +2893,15 @@ AI_CV_MirrorCoat_ScoreDown1: AI_CV_MirrorCoat_End: end + +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 @@ -2868,8 +2914,13 @@ 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 diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index f40e7a3828..bfe01636fb 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -179,6 +179,7 @@ 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; @@ -310,6 +311,7 @@ static const BattleAICmdFunc sBattleAICmdTable[] = 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[] = @@ -2591,15 +2593,18 @@ static void Cmd_if_cant_use_last_resort(void) 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; - - if (IsBattlerAIControlled(battler) || IsBattlerAIControlled(BATTLE_PARTNER(battler))) - moves = gBattleMons[battler].moves; - else - moves = gBattleResources->battleHistory->usedMoves[battler]; + u16 *moves = GetMovesArray(battler); for (i = 0; i < MAX_MON_MOVES; i++) { @@ -2631,14 +2636,9 @@ static void Cmd_if_has_no_move_with_split(void) static bool32 MovesWithSplitUnusable(u32 attacker, u32 target, u32 split) { s32 i, moveType; - u16 *moves; u32 usable = 0; u32 unusable = CheckMoveLimitations(attacker, 0, 0xFF); - - if (IsBattlerAIControlled(attacker)) - moves = gBattleMons[attacker].moves; - else - moves = gBattleResources->battleHistory->usedMoves[attacker]; + u16 *moves = GetMovesArray(attacker); for (i = 0; i < MAX_MON_MOVES; i++) { @@ -2698,12 +2698,7 @@ static void Cmd_if_cant_use_belch(void) static void Cmd_if_has_move_with_type(void) { u32 i, moveType, battler = BattleAI_GetWantedBattler(gAIScriptPtr[1]); - u16 *moves; - - if (IsBattlerAIControlled(battler)) - moves = gBattleMons[battler].moves; - else - moves = BATTLE_HISTORY->usedMoves[battler]; + u16 *moves = GetMovesArray(battler); for (i = 0; i < 4; i++) { @@ -2725,12 +2720,7 @@ static void Cmd_if_has_move_with_type(void) static void Cmd_if_has_move_with_flag(void) { u32 i, flag, battler = BattleAI_GetWantedBattler(gAIScriptPtr[1]); - u16 *moves; - - if (IsBattlerAIControlled(battler)) - moves = gBattleMons[battler].moves; - else - moves = BATTLE_HISTORY->usedMoves[battler]; + u16 *moves = GetMovesArray(battler); flag = T1_READ_32(gAIScriptPtr + 2); for (i = 0; i < 4; i++) @@ -2858,3 +2848,25 @@ static void Cmd_is_wakeup_turn(void) 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); +} From c576da5397db8f5df576ebe1fabb0b534602f692 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 27 Jul 2020 21:15:27 +0200 Subject: [PATCH 661/667] Fix Forewarn typo --- src/battle_message.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/battle_message.c b/src/battle_message.c index cb9220d147..1ca3792e2c 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -590,7 +590,7 @@ static const u8 sText_SlowStartEnd[] = _("{B_ATK_NAME_WITH_PREFIX} finally got\n 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_ATK_NAME_WITH_PREFIX} shuddered\nin anticipation!"); -static const u8 sText_ForewarnActivates[] = _("{B_ATK_ABILITY} alerted {B_ATK_NAME_WITH_PREFIX}\nto the{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}!"); +static const u8 sText_ForewarnActivates[] = _("{B_ATK_ABILITY} alerted {B_ATK_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}!"); @@ -1641,9 +1641,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 }; From 356216d15e036f0bbcce140ca81702c9ee44bc54 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 27 Jul 2020 22:11:52 +0200 Subject: [PATCH 662/667] Mirror Shot improve animation --- data/battle_anim_scripts.s | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 111790923c..6ea39fccb5 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -2900,28 +2900,28 @@ Move_MIRROR_SHOT: waitforvisualfinish loadspritegfx ANIM_TAG_IMPACT loadspritegfx ANIM_TAG_WHITE_CIRCLE_OF_LIGHT - createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 5, 2, 0, 10, -1 + 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, 2, 215, 63 + createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_W233B, SOUND_PAN_TARGET delay 3 createsprite gRandomPosHitSplatSpriteTemplate, 131, 2, 1, 2 - createvisualtask SoundTask_PlaySE1WithPanning, 5, 2, 215, 63 + createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_W233B, SOUND_PAN_TARGET delay 3 createsprite gRandomPosHitSplatSpriteTemplate, 131, 2, 1, 2 - createvisualtask SoundTask_PlaySE1WithPanning, 5, 2, 215, 63 + createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_W233B, SOUND_PAN_TARGET delay 3 createsprite gRandomPosHitSplatSpriteTemplate, 131, 2, 1, 2 - createvisualtask SoundTask_PlaySE1WithPanning, 5, 2, 215, 63 + createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_W233B, SOUND_PAN_TARGET delay 3 createsprite gRandomPosHitSplatSpriteTemplate, 131, 2, 1, 2 - createvisualtask SoundTask_PlaySE1WithPanning, 5, 2, 215, 63 + createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_W233B, SOUND_PAN_TARGET delay 3 createsprite gRandomPosHitSplatSpriteTemplate, 131, 2, 1, 2 - createvisualtask SoundTask_PlaySE1WithPanning, 5, 2, 215, 63 + createvisualtask SoundTask_PlaySE1WithPanning, 5, SE_W233B, SOUND_PAN_TARGET waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA + createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 10, 0, RGB_WHITEALPHA createvisualtask AnimTask_HorizontalShake, 5, 1, 5, 14 waitforvisualfinish clearmonbg ANIM_ATTACKER From 427bad6413f957e070c3178a0aa72c3a58b5cd07 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 28 Jul 2020 10:18:44 +0200 Subject: [PATCH 663/667] Fix Switch-in ability battler sometimes not properly printed --- src/battle_message.c | 12 ++++++------ src/battle_util.c | 9 +-------- src/pokemon.c | 2 +- 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/src/battle_message.c b/src/battle_message.c index 1ca3792e2c..788ae7af64 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -582,15 +582,15 @@ static const u8 sText_GrassyTerrainEnds[] = _("The grass disappeared\nfrom the b 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_ATK_NAME_WITH_PREFIX} breaks the mold!"); -static const u8 sText_TeravoltEnters[] = _("{B_ATK_NAME_WITH_PREFIX} is radiating a bursting aura!"); -static const u8 sText_TurboblazeEnters[] = _("{B_ATK_NAME_WITH_PREFIX} is radiating\na blazing aura!"); -static const u8 sText_SlowStartEnters[] = _("{B_ATK_NAME_WITH_PREFIX} can't get it going!"); +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_ATK_NAME_WITH_PREFIX} shuddered\nin anticipation!"); -static const u8 sText_ForewarnActivates[] = _("{B_ATK_ABILITY} alerted {B_ATK_NAME_WITH_PREFIX}\nto the {B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}!"); +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}!"); diff --git a/src/battle_util.c b/src/battle_util.c index ef6f558cd3..f6f939f29f 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2924,6 +2924,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA switch (caseID) { case ABILITYEFFECT_ON_SWITCHIN: // 0 + gBattleScripting.battler = battler; switch (gLastUsedAbility) { case ABILITYEFFECT_SWITCH_IN_WEATHER: @@ -2938,7 +2939,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA { gBattleWeather = (WEATHER_RAIN_TEMPORARY | WEATHER_RAIN_PERMANENT); gBattleScripting.animArg1 = B_ANIM_RAIN_CONTINUES; - gBattleScripting.battler = battler; effect++; } break; @@ -2947,7 +2947,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA { gBattleWeather = (WEATHER_SANDSTORM_PERMANENT | WEATHER_SANDSTORM_TEMPORARY); gBattleScripting.animArg1 = B_ANIM_SANDSTORM_CONTINUES; - gBattleScripting.battler = battler; effect++; } break; @@ -2956,7 +2955,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA { gBattleWeather = (WEATHER_SUN_PERMANENT | WEATHER_SUN_TEMPORARY); gBattleScripting.animArg1 = B_ANIM_SUN_CONTINUES; - gBattleScripting.battler = battler; effect++; } break; @@ -3115,7 +3113,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA if (TryChangeBattleWeather(battler, ENUM_WEATHER_RAIN, TRUE)) { BattleScriptPushCursorAndCallback(BattleScript_DrizzleActivates); - gBattleScripting.battler = battler; effect++; } break; @@ -3123,7 +3120,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA if (TryChangeBattleWeather(battler, ENUM_WEATHER_SANDSTORM, TRUE)) { BattleScriptPushCursorAndCallback(BattleScript_SandstreamActivates); - gBattleScripting.battler = battler; effect++; } break; @@ -3131,7 +3127,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA if (TryChangeBattleWeather(battler, ENUM_WEATHER_SUN, TRUE)) { BattleScriptPushCursorAndCallback(BattleScript_DroughtActivates); - gBattleScripting.battler = battler; effect++; } break; @@ -3139,7 +3134,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA if (TryChangeBattleWeather(battler, ENUM_WEATHER_HAIL, TRUE)) { BattleScriptPushCursorAndCallback(BattleScript_SnowWarningActivates); - gBattleScripting.battler = battler; effect++; } break; @@ -3184,7 +3178,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA if (effect != 0) { BattleScriptPushCursorAndCallback(BattleScript_CastformChange); - gBattleScripting.battler = battler; *(&gBattleStruct->formToChangeInto) = effect - 1; } break; diff --git a/src/pokemon.c b/src/pokemon.c index 7351ff0a7d..52552b8d07 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -5564,7 +5564,7 @@ void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies) { if (totalEVs >= MAX_TOTAL_EVS) break; - + if (CheckPartyHasHadPokerus(mon, 0)) multiplier = 2; else From f744986bb24eeb681c0fce9e2a4c302a9e2e9ae1 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 31 Jul 2020 09:29:56 +0200 Subject: [PATCH 664/667] Fix Safari Zone healthbox glitch --- src/battle_interface.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/battle_interface.c b/src/battle_interface.c index 91d65d81e3..bef984c4f1 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -831,6 +831,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; From 9bc4395212706a56daa693c0f38b069112d6c3ab Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 31 Jul 2020 09:45:19 +0200 Subject: [PATCH 665/667] bizzara revied typos --- src/battle_message.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle_message.c b/src/battle_message.c index 788ae7af64..2f5a3fb129 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -543,7 +543,7 @@ static const u8 sText_SharedItsPower[] =_("{B_ATK_NAME_WITH_PREFIX} shared its\n 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 bizarra area in which\nPokémon's held items lose their effects!"); +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!"); @@ -555,7 +555,7 @@ static const u8 sText_TookPkmnIntoTheSky[] =_("{B_ATK_NAME_WITH_PREFIX} took\n{B 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} recieved {B_LAST_ITEM}\nfrom {B_ATK_NAME_WITH_PREFIX}"); +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!"); From a42bd3f37ded9300cc4c4b9fbec079ea7e22988c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 5 Aug 2020 12:35:51 +0200 Subject: [PATCH 666/667] Fix multiple turn moves staying after hitting no target --- src/battle_script_commands.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 67f035cab3..69de7f4cfe 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1105,6 +1105,8 @@ static void Cmd_attackcanceler(void) if (NoTargetPresent(gCurrentMove)) { gBattlescriptCurrInstr = BattleScript_ButItFailedAtkStringPpReduce; + if (!IsTwoTurnsMove(gCurrentMove) || (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) + CancelMultiTurnMoves(gBattlerAttacker); return; } From 9a7963e4ced07842bb15f316997943d6d855a879 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 6 Aug 2020 09:14:17 +0200 Subject: [PATCH 667/667] Multi battle support for var arguments --- src/battle_tower.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/battle_tower.c b/src/battle_tower.c index b753ef7de1..5b17bdf4fb 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -2155,9 +2155,9 @@ void DoSpecialTrainerBattle(void) gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER; } - gPartnerSpriteId = gSpecialVar_0x8007; - FillPartnerParty(gSpecialVar_0x8006 + TRAINER_CUSTOM_PARTNER); - gPartnerTrainerId = gSpecialVar_0x8006 + TRAINER_CUSTOM_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)